From 24ab7fe51230526ab2e8655a44097903747ccc8f Mon Sep 17 00:00:00 2001 From: MilesGlitch Date: Sun, 30 Aug 2026 13:53:22 +0300 Subject: [PATCH 01/61] update libs --- thirdparty/SDL | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/thirdparty/SDL b/thirdparty/SDL index 513ebb5..46498bc 160000 --- a/thirdparty/SDL +++ b/thirdparty/SDL @@ -1 +1 @@ -Subproject commit 513ebb5c47de58c3ba9de809097c19ac9aa75380 +Subproject commit 46498bc247819a2da7c1ccc7d4c4f6231076666c From f3acef06814ab1bec12789c1fd7d5526de490d71 Mon Sep 17 00:00:00 2001 From: MilesGlitch Date: Sun, 30 Aug 2026 13:54:12 +0300 Subject: [PATCH 02/61] add support c++ --- CMakeLists.txt | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 288e4a5..1dec41e 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,11 +1,15 @@ cmake_minimum_required(VERSION 3.16.3) -project(DisasterServer C) +project(DisasterServer CXX C) if (POLICY CMP0141) cmake_policy(SET CMP0141 NEW) set(CMAKE_MSVC_DEBUG_INFORMATION_FORMAT "$,$>,$<$:EditAndContinue>,$<$:ProgramDatabase>>") endif() +set(CMAKE_CXX_STANDARD 23) +set(CXX_STANDARD_REQUIRED ON) +set(CMAKE_CXX_EXTENSIONS ON) + option(DYLIB "Builds dynamic library" OFF) option(BUILD_UI "Builds UI using SDL" OFF) From a5bff98c9bd8819825acccae31833202720d94cf Mon Sep 17 00:00:00 2001 From: MilesGlitch Date: Sun, 30 Aug 2026 14:36:14 +0300 Subject: [PATCH 03/61] =?UTF-8?q?=D0=BD=D0=B5=20=D0=B1=D0=BE=D0=BB=D1=8C?= =?UTF-8?q?=D1=88=D0=B8=D0=B5=20=D0=BF=D0=BE=D0=B4=D0=B3=D0=BE=D1=82=D0=BE?= =?UTF-8?q?=D0=B2=D0=BA=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CMakeLists.txt | 4 ++-- .../Android.c | 0 .../Android.h | 0 {disasterserver => disasterserver_c}/Api.h | 0 {disasterserver => disasterserver_c}/Auth.c | 0 {disasterserver => disasterserver_c}/Auth.h | 0 .../CMakeLists.txt | 22 +++++++++---------- {disasterserver => disasterserver_c}/CMath.c | 0 {disasterserver => disasterserver_c}/CMath.h | 0 {disasterserver => disasterserver_c}/Colors.h | 0 {disasterserver => disasterserver_c}/Config.c | 0 {disasterserver => disasterserver_c}/Config.h | 0 {disasterserver => disasterserver_c}/DyList.c | 0 {disasterserver => disasterserver_c}/DyList.h | 0 {disasterserver => disasterserver_c}/Lib.c | 0 {disasterserver => disasterserver_c}/Lib.h | 0 {disasterserver => disasterserver_c}/Log.c | 0 {disasterserver => disasterserver_c}/Log.h | 0 {disasterserver => disasterserver_c}/Main.c | 0 {disasterserver => disasterserver_c}/Maps.c | 0 {disasterserver => disasterserver_c}/Maps.h | 0 {disasterserver => disasterserver_c}/Packet.c | 0 {disasterserver => disasterserver_c}/Packet.h | 0 .../Palette.c | 0 .../Palette.h | 0 {disasterserver => disasterserver_c}/Player.c | 0 {disasterserver => disasterserver_c}/Player.h | 0 {disasterserver => disasterserver_c}/Server.h | 0 {disasterserver => disasterserver_c}/States.h | 0 {disasterserver => disasterserver_c}/UTF8.c | 0 {disasterserver => disasterserver_c}/UTF8.h | 0 {disasterserver => disasterserver_c}/Vote.c | 0 {disasterserver => disasterserver_c}/Vote.h | 0 {disasterserver => disasterserver_c}/Zone.c | 0 {disasterserver => disasterserver_c}/Zone.h | 0 {disasterserver => disasterserver_c}/cJSON.c | 0 {disasterserver => disasterserver_c}/cJSON.h | 0 .../entities/Act9Wall.c | 0 .../entities/Act9Wall.h | 0 .../entities/BlackRing.c | 0 .../entities/BlackRing.h | 0 .../entities/CreamRing.c | 0 .../entities/CreamRing.h | 0 .../entities/DTBall.c | 0 .../entities/DTBall.h | 0 .../entities/DTStalactits.c | 0 .../entities/DTStalactits.h | 0 .../entities/Dummy.c | 0 .../entities/Dummy.h | 0 .../entities/EggmanTracker.c | 0 .../entities/EggmanTracker.h | 0 .../entities/ExellerClone.c | 0 .../entities/ExellerClone.h | 0 .../entities/HDDoor.c | 0 .../entities/HDDoor.h | 0 .../entities/HillThunder.c | 0 .../entities/HillThunder.h | 0 .../entities/KAFSpeedBox.c | 0 .../entities/KAFSpeedBox.h | 0 .../entities/LCChain.c | 0 .../entities/LCChain.h | 0 .../entities/LCEye.c | 0 .../entities/LCEye.h | 0 .../entities/MJAss.c | 0 .../entities/MJAss.h | 0 .../entities/MJJudger.c | 0 .../entities/MJJudger.h | 0 .../entities/MJLava.c | 0 .../entities/MJLava.h | 0 .../entities/NAPIce.c | 0 .../entities/NAPIce.h | 0 .../entities/NAPSnowball.c | 0 .../entities/NAPSnowball.h | 0 .../entities/NotPerfect.c | 0 .../entities/NotPerfect.h | 0 .../entities/PFLift.c | 0 .../entities/PFLift.h | 0 .../entities/RMZShard.c | 0 .../entities/RMZShard.h | 0 .../entities/RMZSlug.c | 0 .../entities/RMZSlug.h | 0 .../entities/Ring.c | 0 .../entities/Ring.h | 0 .../entities/SpkieController.c | 0 .../entities/SpkieController.h | 0 .../entities/TCAcid.c | 0 .../entities/TCAcid.h | 0 .../entities/TailsDoll.c | 0 .../entities/TailsDoll.h | 0 .../entities/TailsProjectile.c | 0 .../entities/TailsProjectile.h | 0 .../entities/VVLava.c | 0 .../entities/VVLava.h | 0 .../entities/VVVase.h | 0 .../entities/WDLatern.c | 0 .../entities/WDLatern.h | 0 .../entities/YouCantRun.c | 0 .../entities/YouCantRun.h | 0 {disasterserver => disasterserver_c}/io/Dir.h | 0 .../io/Packet.c | 0 .../io/Packet.h | 0 .../io/Socket.h | 0 .../io/TcpListener.c | 0 .../io/TcpListener.h | 0 .../io/Threads.h | 0 .../io/Time.c | 0 .../io/Time.h | 0 .../io/UdpListener.c | 0 .../io/UdpListener.h | 0 .../maps/Act9.c | 0 .../maps/Act9.h | 0 .../maps/DarkTower.c | 0 .../maps/DarkTower.h | 0 .../maps/DotDotDot.c | 0 .../maps/DotDotDot.h | 0 .../maps/FartZone.c | 0 .../maps/FartZone.h | 0 .../maps/HauntingDream.c | 0 .../maps/HauntingDream.h | 0 .../maps/HideAndSeek.c | 0 .../maps/HideAndSeek2.h | 0 .../maps/Hill.c | 0 .../maps/Hill.h | 0 .../maps/KindAndFair.c | 0 .../maps/KindAndFair.h | 0 .../maps/LimpCity.c | 0 .../maps/LimpCity.h | 0 .../maps/MajinForest.c | 0 .../maps/MajinForest.h | 0 .../maps/Marijuna.c | 0 .../maps/Marijuna.h | 0 .../maps/NastyParadise.c | 0 .../maps/NastyParadise.h | 0 .../maps/NotPerfect.c | 0 .../maps/NotPerfect.h | 0 .../maps/PricelessFreedom.c | 0 .../maps/PricelessFreedom.h | 0 .../maps/RavineMist.c | 0 .../maps/RavineMist.h | 0 .../maps/TortureCave.c | 0 .../maps/TortureCave.h | 0 .../maps/VolcanoValley.c | 0 .../maps/VolcanoValley.h | 0 .../maps/WoodDream.c | 0 .../maps/WoodDream.h | 0 .../maps/YouCantRun.c | 0 .../maps/YouCantRun.h | 0 .../states/CharSelect.c | 0 .../states/Game.c | 0 .../states/Lobby.c | 0 .../states/Mapvote.c | 0 .../states/Results.c | 0 .../states/Server.c | 0 .../ui/Button.c | 0 .../ui/Components.h | 0 .../ui/Image.c | 0 .../ui/Label.c | 0 .../ui/Main.c | 2 +- .../ui/Main.h | 0 .../ui/MapList.c | 0 .../ui/MapListPreset.c | 0 .../ui/PingPreset.c | 0 .../ui/PlayerList.c | 0 .../ui/Presets.c | 0 .../ui/Presets.h | 0 .../ui/Resources.c | 0 .../ui/Resources.h | 0 .../ui/Spritesheet.h | 0 .../ui/TButton.c | 0 169 files changed, 14 insertions(+), 14 deletions(-) rename {disasterserver => disasterserver_c}/Android.c (100%) rename {disasterserver => disasterserver_c}/Android.h (100%) rename {disasterserver => disasterserver_c}/Api.h (100%) rename {disasterserver => disasterserver_c}/Auth.c (100%) rename {disasterserver => disasterserver_c}/Auth.h (100%) rename {disasterserver => disasterserver_c}/CMakeLists.txt (94%) rename {disasterserver => disasterserver_c}/CMath.c (100%) rename {disasterserver => disasterserver_c}/CMath.h (100%) rename {disasterserver => disasterserver_c}/Colors.h (100%) rename {disasterserver => disasterserver_c}/Config.c (100%) rename {disasterserver => disasterserver_c}/Config.h (100%) rename {disasterserver => disasterserver_c}/DyList.c (100%) rename {disasterserver => disasterserver_c}/DyList.h (100%) rename {disasterserver => disasterserver_c}/Lib.c (100%) rename {disasterserver => disasterserver_c}/Lib.h (100%) rename {disasterserver => disasterserver_c}/Log.c (100%) rename {disasterserver => disasterserver_c}/Log.h (100%) rename {disasterserver => disasterserver_c}/Main.c (100%) rename {disasterserver => disasterserver_c}/Maps.c (100%) rename {disasterserver => disasterserver_c}/Maps.h (100%) rename {disasterserver => disasterserver_c}/Packet.c (100%) rename {disasterserver => disasterserver_c}/Packet.h (100%) rename {disasterserver => disasterserver_c}/Palette.c (100%) rename {disasterserver => disasterserver_c}/Palette.h (100%) rename {disasterserver => disasterserver_c}/Player.c (100%) rename {disasterserver => disasterserver_c}/Player.h (100%) rename {disasterserver => disasterserver_c}/Server.h (100%) rename {disasterserver => disasterserver_c}/States.h (100%) rename {disasterserver => disasterserver_c}/UTF8.c (100%) rename {disasterserver => disasterserver_c}/UTF8.h (100%) rename {disasterserver => disasterserver_c}/Vote.c (100%) rename {disasterserver => disasterserver_c}/Vote.h (100%) rename {disasterserver => disasterserver_c}/Zone.c (100%) rename {disasterserver => disasterserver_c}/Zone.h (100%) rename {disasterserver => disasterserver_c}/cJSON.c (100%) rename {disasterserver => disasterserver_c}/cJSON.h (100%) rename {disasterserver => disasterserver_c}/entities/Act9Wall.c (100%) rename {disasterserver => disasterserver_c}/entities/Act9Wall.h (100%) rename {disasterserver => disasterserver_c}/entities/BlackRing.c (100%) rename {disasterserver => disasterserver_c}/entities/BlackRing.h (100%) rename {disasterserver => disasterserver_c}/entities/CreamRing.c (100%) rename {disasterserver => disasterserver_c}/entities/CreamRing.h (100%) rename {disasterserver => disasterserver_c}/entities/DTBall.c (100%) rename {disasterserver => disasterserver_c}/entities/DTBall.h (100%) rename {disasterserver => disasterserver_c}/entities/DTStalactits.c (100%) rename {disasterserver => disasterserver_c}/entities/DTStalactits.h (100%) rename {disasterserver => disasterserver_c}/entities/Dummy.c (100%) rename {disasterserver => disasterserver_c}/entities/Dummy.h (100%) rename {disasterserver => disasterserver_c}/entities/EggmanTracker.c (100%) rename {disasterserver => disasterserver_c}/entities/EggmanTracker.h (100%) rename {disasterserver => disasterserver_c}/entities/ExellerClone.c (100%) rename {disasterserver => disasterserver_c}/entities/ExellerClone.h (100%) rename {disasterserver => disasterserver_c}/entities/HDDoor.c (100%) rename {disasterserver => disasterserver_c}/entities/HDDoor.h (100%) rename {disasterserver => disasterserver_c}/entities/HillThunder.c (100%) rename {disasterserver => disasterserver_c}/entities/HillThunder.h (100%) rename {disasterserver => disasterserver_c}/entities/KAFSpeedBox.c (100%) rename {disasterserver => disasterserver_c}/entities/KAFSpeedBox.h (100%) rename {disasterserver => disasterserver_c}/entities/LCChain.c (100%) rename {disasterserver => disasterserver_c}/entities/LCChain.h (100%) rename {disasterserver => disasterserver_c}/entities/LCEye.c (100%) rename {disasterserver => disasterserver_c}/entities/LCEye.h (100%) rename {disasterserver => disasterserver_c}/entities/MJAss.c (100%) rename {disasterserver => disasterserver_c}/entities/MJAss.h (100%) rename {disasterserver => disasterserver_c}/entities/MJJudger.c (100%) rename {disasterserver => disasterserver_c}/entities/MJJudger.h (100%) rename {disasterserver => disasterserver_c}/entities/MJLava.c (100%) rename {disasterserver => disasterserver_c}/entities/MJLava.h (100%) rename {disasterserver => disasterserver_c}/entities/NAPIce.c (100%) rename {disasterserver => disasterserver_c}/entities/NAPIce.h (100%) rename {disasterserver => disasterserver_c}/entities/NAPSnowball.c (100%) rename {disasterserver => disasterserver_c}/entities/NAPSnowball.h (100%) rename {disasterserver => disasterserver_c}/entities/NotPerfect.c (100%) rename {disasterserver => disasterserver_c}/entities/NotPerfect.h (100%) rename {disasterserver => disasterserver_c}/entities/PFLift.c (100%) rename {disasterserver => disasterserver_c}/entities/PFLift.h (100%) rename {disasterserver => disasterserver_c}/entities/RMZShard.c (100%) rename {disasterserver => disasterserver_c}/entities/RMZShard.h (100%) rename {disasterserver => disasterserver_c}/entities/RMZSlug.c (100%) rename {disasterserver => disasterserver_c}/entities/RMZSlug.h (100%) rename {disasterserver => disasterserver_c}/entities/Ring.c (100%) rename {disasterserver => disasterserver_c}/entities/Ring.h (100%) rename {disasterserver => disasterserver_c}/entities/SpkieController.c (100%) rename {disasterserver => disasterserver_c}/entities/SpkieController.h (100%) rename {disasterserver => disasterserver_c}/entities/TCAcid.c (100%) rename {disasterserver => disasterserver_c}/entities/TCAcid.h (100%) rename {disasterserver => disasterserver_c}/entities/TailsDoll.c (100%) rename {disasterserver => disasterserver_c}/entities/TailsDoll.h (100%) rename {disasterserver => disasterserver_c}/entities/TailsProjectile.c (100%) rename {disasterserver => disasterserver_c}/entities/TailsProjectile.h (100%) rename {disasterserver => disasterserver_c}/entities/VVLava.c (100%) rename {disasterserver => disasterserver_c}/entities/VVLava.h (100%) rename {disasterserver => disasterserver_c}/entities/VVVase.h (100%) rename {disasterserver => disasterserver_c}/entities/WDLatern.c (100%) rename {disasterserver => disasterserver_c}/entities/WDLatern.h (100%) rename {disasterserver => disasterserver_c}/entities/YouCantRun.c (100%) rename {disasterserver => disasterserver_c}/entities/YouCantRun.h (100%) rename {disasterserver => disasterserver_c}/io/Dir.h (100%) rename {disasterserver => disasterserver_c}/io/Packet.c (100%) rename {disasterserver => disasterserver_c}/io/Packet.h (100%) rename {disasterserver => disasterserver_c}/io/Socket.h (100%) rename {disasterserver => disasterserver_c}/io/TcpListener.c (100%) rename {disasterserver => disasterserver_c}/io/TcpListener.h (100%) rename {disasterserver => disasterserver_c}/io/Threads.h (100%) rename {disasterserver => disasterserver_c}/io/Time.c (100%) rename {disasterserver => disasterserver_c}/io/Time.h (100%) rename {disasterserver => disasterserver_c}/io/UdpListener.c (100%) rename {disasterserver => disasterserver_c}/io/UdpListener.h (100%) rename {disasterserver => disasterserver_c}/maps/Act9.c (100%) rename {disasterserver => disasterserver_c}/maps/Act9.h (100%) rename {disasterserver => disasterserver_c}/maps/DarkTower.c (100%) rename {disasterserver => disasterserver_c}/maps/DarkTower.h (100%) rename {disasterserver => disasterserver_c}/maps/DotDotDot.c (100%) rename {disasterserver => disasterserver_c}/maps/DotDotDot.h (100%) rename {disasterserver => disasterserver_c}/maps/FartZone.c (100%) rename {disasterserver => disasterserver_c}/maps/FartZone.h (100%) rename {disasterserver => disasterserver_c}/maps/HauntingDream.c (100%) rename {disasterserver => disasterserver_c}/maps/HauntingDream.h (100%) rename {disasterserver => disasterserver_c}/maps/HideAndSeek.c (100%) rename {disasterserver => disasterserver_c}/maps/HideAndSeek2.h (100%) rename {disasterserver => disasterserver_c}/maps/Hill.c (100%) rename {disasterserver => disasterserver_c}/maps/Hill.h (100%) rename {disasterserver => disasterserver_c}/maps/KindAndFair.c (100%) rename {disasterserver => disasterserver_c}/maps/KindAndFair.h (100%) rename {disasterserver => disasterserver_c}/maps/LimpCity.c (100%) rename {disasterserver => disasterserver_c}/maps/LimpCity.h (100%) rename {disasterserver => disasterserver_c}/maps/MajinForest.c (100%) rename {disasterserver => disasterserver_c}/maps/MajinForest.h (100%) rename {disasterserver => disasterserver_c}/maps/Marijuna.c (100%) rename {disasterserver => disasterserver_c}/maps/Marijuna.h (100%) rename {disasterserver => disasterserver_c}/maps/NastyParadise.c (100%) rename {disasterserver => disasterserver_c}/maps/NastyParadise.h (100%) rename {disasterserver => disasterserver_c}/maps/NotPerfect.c (100%) rename {disasterserver => disasterserver_c}/maps/NotPerfect.h (100%) rename {disasterserver => disasterserver_c}/maps/PricelessFreedom.c (100%) rename {disasterserver => disasterserver_c}/maps/PricelessFreedom.h (100%) rename {disasterserver => disasterserver_c}/maps/RavineMist.c (100%) rename {disasterserver => disasterserver_c}/maps/RavineMist.h (100%) rename {disasterserver => disasterserver_c}/maps/TortureCave.c (100%) rename {disasterserver => disasterserver_c}/maps/TortureCave.h (100%) rename {disasterserver => disasterserver_c}/maps/VolcanoValley.c (100%) rename {disasterserver => disasterserver_c}/maps/VolcanoValley.h (100%) rename {disasterserver => disasterserver_c}/maps/WoodDream.c (100%) rename {disasterserver => disasterserver_c}/maps/WoodDream.h (100%) rename {disasterserver => disasterserver_c}/maps/YouCantRun.c (100%) rename {disasterserver => disasterserver_c}/maps/YouCantRun.h (100%) rename {disasterserver => disasterserver_c}/states/CharSelect.c (100%) rename {disasterserver => disasterserver_c}/states/Game.c (100%) rename {disasterserver => disasterserver_c}/states/Lobby.c (100%) rename {disasterserver => disasterserver_c}/states/Mapvote.c (100%) rename {disasterserver => disasterserver_c}/states/Results.c (100%) rename {disasterserver => disasterserver_c}/states/Server.c (100%) rename {disasterserver => disasterserver_c}/ui/Button.c (100%) rename {disasterserver => disasterserver_c}/ui/Components.h (100%) rename {disasterserver => disasterserver_c}/ui/Image.c (100%) rename {disasterserver => disasterserver_c}/ui/Label.c (100%) rename {disasterserver => disasterserver_c}/ui/Main.c (99%) rename {disasterserver => disasterserver_c}/ui/Main.h (100%) rename {disasterserver => disasterserver_c}/ui/MapList.c (100%) rename {disasterserver => disasterserver_c}/ui/MapListPreset.c (100%) rename {disasterserver => disasterserver_c}/ui/PingPreset.c (100%) rename {disasterserver => disasterserver_c}/ui/PlayerList.c (100%) rename {disasterserver => disasterserver_c}/ui/Presets.c (100%) rename {disasterserver => disasterserver_c}/ui/Presets.h (100%) rename {disasterserver => disasterserver_c}/ui/Resources.c (100%) rename {disasterserver => disasterserver_c}/ui/Resources.h (100%) rename {disasterserver => disasterserver_c}/ui/Spritesheet.h (100%) rename {disasterserver => disasterserver_c}/ui/TButton.c (100%) diff --git a/CMakeLists.txt b/CMakeLists.txt index 1dec41e..e4c67dc 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,5 +1,5 @@ cmake_minimum_required(VERSION 3.16.3) -project(DisasterServer CXX C) +project(disasterserver_c CXX C) if (POLICY CMP0141) cmake_policy(SET CMP0141 NEW) @@ -50,4 +50,4 @@ endif () add_subdirectory(thirdparty/enet) -add_subdirectory(disasterserver/) \ No newline at end of file +add_subdirectory(disasterserver_c/) \ No newline at end of file diff --git a/disasterserver/Android.c b/disasterserver_c/Android.c similarity index 100% rename from disasterserver/Android.c rename to disasterserver_c/Android.c diff --git a/disasterserver/Android.h b/disasterserver_c/Android.h similarity index 100% rename from disasterserver/Android.h rename to disasterserver_c/Android.h diff --git a/disasterserver/Api.h b/disasterserver_c/Api.h similarity index 100% rename from disasterserver/Api.h rename to disasterserver_c/Api.h diff --git a/disasterserver/Auth.c b/disasterserver_c/Auth.c similarity index 100% rename from disasterserver/Auth.c rename to disasterserver_c/Auth.c diff --git a/disasterserver/Auth.h b/disasterserver_c/Auth.h similarity index 100% rename from disasterserver/Auth.h rename to disasterserver_c/Auth.h diff --git a/disasterserver/CMakeLists.txt b/disasterserver_c/CMakeLists.txt similarity index 94% rename from disasterserver/CMakeLists.txt rename to disasterserver_c/CMakeLists.txt index 16f11cf..78cdb34 100644 --- a/disasterserver/CMakeLists.txt +++ b/disasterserver_c/CMakeLists.txt @@ -124,17 +124,17 @@ else() else() # Build executable if(BUILD_UI) set(UI_SOURCES - "ui/Resources.c" - "ui/Main.c" - "ui/Image.c" - "ui/Label.c" - "ui/Button.c" - "ui/TButton.c" - "ui/MapList.c" - "ui/Presets.c" - "ui/MapListPreset.c" - "ui/PingPreset.c" - "ui/PlayerList.c" + "ui/Resources.c" + "ui/Main.c" + "ui/Image.c" + "ui/Label.c" + "ui/Button.c" + "ui/TButton.c" + "ui/MapList.c" + "ui/Presets.c" + "ui/MapListPreset.c" + "ui/PingPreset.c" + "ui/PlayerList.c" ) if (WIN32) diff --git a/disasterserver/CMath.c b/disasterserver_c/CMath.c similarity index 100% rename from disasterserver/CMath.c rename to disasterserver_c/CMath.c diff --git a/disasterserver/CMath.h b/disasterserver_c/CMath.h similarity index 100% rename from disasterserver/CMath.h rename to disasterserver_c/CMath.h diff --git a/disasterserver/Colors.h b/disasterserver_c/Colors.h similarity index 100% rename from disasterserver/Colors.h rename to disasterserver_c/Colors.h diff --git a/disasterserver/Config.c b/disasterserver_c/Config.c similarity index 100% rename from disasterserver/Config.c rename to disasterserver_c/Config.c diff --git a/disasterserver/Config.h b/disasterserver_c/Config.h similarity index 100% rename from disasterserver/Config.h rename to disasterserver_c/Config.h diff --git a/disasterserver/DyList.c b/disasterserver_c/DyList.c similarity index 100% rename from disasterserver/DyList.c rename to disasterserver_c/DyList.c diff --git a/disasterserver/DyList.h b/disasterserver_c/DyList.h similarity index 100% rename from disasterserver/DyList.h rename to disasterserver_c/DyList.h diff --git a/disasterserver/Lib.c b/disasterserver_c/Lib.c similarity index 100% rename from disasterserver/Lib.c rename to disasterserver_c/Lib.c diff --git a/disasterserver/Lib.h b/disasterserver_c/Lib.h similarity index 100% rename from disasterserver/Lib.h rename to disasterserver_c/Lib.h diff --git a/disasterserver/Log.c b/disasterserver_c/Log.c similarity index 100% rename from disasterserver/Log.c rename to disasterserver_c/Log.c diff --git a/disasterserver/Log.h b/disasterserver_c/Log.h similarity index 100% rename from disasterserver/Log.h rename to disasterserver_c/Log.h diff --git a/disasterserver/Main.c b/disasterserver_c/Main.c similarity index 100% rename from disasterserver/Main.c rename to disasterserver_c/Main.c diff --git a/disasterserver/Maps.c b/disasterserver_c/Maps.c similarity index 100% rename from disasterserver/Maps.c rename to disasterserver_c/Maps.c diff --git a/disasterserver/Maps.h b/disasterserver_c/Maps.h similarity index 100% rename from disasterserver/Maps.h rename to disasterserver_c/Maps.h diff --git a/disasterserver/Packet.c b/disasterserver_c/Packet.c similarity index 100% rename from disasterserver/Packet.c rename to disasterserver_c/Packet.c diff --git a/disasterserver/Packet.h b/disasterserver_c/Packet.h similarity index 100% rename from disasterserver/Packet.h rename to disasterserver_c/Packet.h diff --git a/disasterserver/Palette.c b/disasterserver_c/Palette.c similarity index 100% rename from disasterserver/Palette.c rename to disasterserver_c/Palette.c diff --git a/disasterserver/Palette.h b/disasterserver_c/Palette.h similarity index 100% rename from disasterserver/Palette.h rename to disasterserver_c/Palette.h diff --git a/disasterserver/Player.c b/disasterserver_c/Player.c similarity index 100% rename from disasterserver/Player.c rename to disasterserver_c/Player.c diff --git a/disasterserver/Player.h b/disasterserver_c/Player.h similarity index 100% rename from disasterserver/Player.h rename to disasterserver_c/Player.h diff --git a/disasterserver/Server.h b/disasterserver_c/Server.h similarity index 100% rename from disasterserver/Server.h rename to disasterserver_c/Server.h diff --git a/disasterserver/States.h b/disasterserver_c/States.h similarity index 100% rename from disasterserver/States.h rename to disasterserver_c/States.h diff --git a/disasterserver/UTF8.c b/disasterserver_c/UTF8.c similarity index 100% rename from disasterserver/UTF8.c rename to disasterserver_c/UTF8.c diff --git a/disasterserver/UTF8.h b/disasterserver_c/UTF8.h similarity index 100% rename from disasterserver/UTF8.h rename to disasterserver_c/UTF8.h diff --git a/disasterserver/Vote.c b/disasterserver_c/Vote.c similarity index 100% rename from disasterserver/Vote.c rename to disasterserver_c/Vote.c diff --git a/disasterserver/Vote.h b/disasterserver_c/Vote.h similarity index 100% rename from disasterserver/Vote.h rename to disasterserver_c/Vote.h diff --git a/disasterserver/Zone.c b/disasterserver_c/Zone.c similarity index 100% rename from disasterserver/Zone.c rename to disasterserver_c/Zone.c diff --git a/disasterserver/Zone.h b/disasterserver_c/Zone.h similarity index 100% rename from disasterserver/Zone.h rename to disasterserver_c/Zone.h diff --git a/disasterserver/cJSON.c b/disasterserver_c/cJSON.c similarity index 100% rename from disasterserver/cJSON.c rename to disasterserver_c/cJSON.c diff --git a/disasterserver/cJSON.h b/disasterserver_c/cJSON.h similarity index 100% rename from disasterserver/cJSON.h rename to disasterserver_c/cJSON.h diff --git a/disasterserver/entities/Act9Wall.c b/disasterserver_c/entities/Act9Wall.c similarity index 100% rename from disasterserver/entities/Act9Wall.c rename to disasterserver_c/entities/Act9Wall.c diff --git a/disasterserver/entities/Act9Wall.h b/disasterserver_c/entities/Act9Wall.h similarity index 100% rename from disasterserver/entities/Act9Wall.h rename to disasterserver_c/entities/Act9Wall.h diff --git a/disasterserver/entities/BlackRing.c b/disasterserver_c/entities/BlackRing.c similarity index 100% rename from disasterserver/entities/BlackRing.c rename to disasterserver_c/entities/BlackRing.c diff --git a/disasterserver/entities/BlackRing.h b/disasterserver_c/entities/BlackRing.h similarity index 100% rename from disasterserver/entities/BlackRing.h rename to disasterserver_c/entities/BlackRing.h diff --git a/disasterserver/entities/CreamRing.c b/disasterserver_c/entities/CreamRing.c similarity index 100% rename from disasterserver/entities/CreamRing.c rename to disasterserver_c/entities/CreamRing.c diff --git a/disasterserver/entities/CreamRing.h b/disasterserver_c/entities/CreamRing.h similarity index 100% rename from disasterserver/entities/CreamRing.h rename to disasterserver_c/entities/CreamRing.h diff --git a/disasterserver/entities/DTBall.c b/disasterserver_c/entities/DTBall.c similarity index 100% rename from disasterserver/entities/DTBall.c rename to disasterserver_c/entities/DTBall.c diff --git a/disasterserver/entities/DTBall.h b/disasterserver_c/entities/DTBall.h similarity index 100% rename from disasterserver/entities/DTBall.h rename to disasterserver_c/entities/DTBall.h diff --git a/disasterserver/entities/DTStalactits.c b/disasterserver_c/entities/DTStalactits.c similarity index 100% rename from disasterserver/entities/DTStalactits.c rename to disasterserver_c/entities/DTStalactits.c diff --git a/disasterserver/entities/DTStalactits.h b/disasterserver_c/entities/DTStalactits.h similarity index 100% rename from disasterserver/entities/DTStalactits.h rename to disasterserver_c/entities/DTStalactits.h diff --git a/disasterserver/entities/Dummy.c b/disasterserver_c/entities/Dummy.c similarity index 100% rename from disasterserver/entities/Dummy.c rename to disasterserver_c/entities/Dummy.c diff --git a/disasterserver/entities/Dummy.h b/disasterserver_c/entities/Dummy.h similarity index 100% rename from disasterserver/entities/Dummy.h rename to disasterserver_c/entities/Dummy.h diff --git a/disasterserver/entities/EggmanTracker.c b/disasterserver_c/entities/EggmanTracker.c similarity index 100% rename from disasterserver/entities/EggmanTracker.c rename to disasterserver_c/entities/EggmanTracker.c diff --git a/disasterserver/entities/EggmanTracker.h b/disasterserver_c/entities/EggmanTracker.h similarity index 100% rename from disasterserver/entities/EggmanTracker.h rename to disasterserver_c/entities/EggmanTracker.h diff --git a/disasterserver/entities/ExellerClone.c b/disasterserver_c/entities/ExellerClone.c similarity index 100% rename from disasterserver/entities/ExellerClone.c rename to disasterserver_c/entities/ExellerClone.c diff --git a/disasterserver/entities/ExellerClone.h b/disasterserver_c/entities/ExellerClone.h similarity index 100% rename from disasterserver/entities/ExellerClone.h rename to disasterserver_c/entities/ExellerClone.h diff --git a/disasterserver/entities/HDDoor.c b/disasterserver_c/entities/HDDoor.c similarity index 100% rename from disasterserver/entities/HDDoor.c rename to disasterserver_c/entities/HDDoor.c diff --git a/disasterserver/entities/HDDoor.h b/disasterserver_c/entities/HDDoor.h similarity index 100% rename from disasterserver/entities/HDDoor.h rename to disasterserver_c/entities/HDDoor.h diff --git a/disasterserver/entities/HillThunder.c b/disasterserver_c/entities/HillThunder.c similarity index 100% rename from disasterserver/entities/HillThunder.c rename to disasterserver_c/entities/HillThunder.c diff --git a/disasterserver/entities/HillThunder.h b/disasterserver_c/entities/HillThunder.h similarity index 100% rename from disasterserver/entities/HillThunder.h rename to disasterserver_c/entities/HillThunder.h diff --git a/disasterserver/entities/KAFSpeedBox.c b/disasterserver_c/entities/KAFSpeedBox.c similarity index 100% rename from disasterserver/entities/KAFSpeedBox.c rename to disasterserver_c/entities/KAFSpeedBox.c diff --git a/disasterserver/entities/KAFSpeedBox.h b/disasterserver_c/entities/KAFSpeedBox.h similarity index 100% rename from disasterserver/entities/KAFSpeedBox.h rename to disasterserver_c/entities/KAFSpeedBox.h diff --git a/disasterserver/entities/LCChain.c b/disasterserver_c/entities/LCChain.c similarity index 100% rename from disasterserver/entities/LCChain.c rename to disasterserver_c/entities/LCChain.c diff --git a/disasterserver/entities/LCChain.h b/disasterserver_c/entities/LCChain.h similarity index 100% rename from disasterserver/entities/LCChain.h rename to disasterserver_c/entities/LCChain.h diff --git a/disasterserver/entities/LCEye.c b/disasterserver_c/entities/LCEye.c similarity index 100% rename from disasterserver/entities/LCEye.c rename to disasterserver_c/entities/LCEye.c diff --git a/disasterserver/entities/LCEye.h b/disasterserver_c/entities/LCEye.h similarity index 100% rename from disasterserver/entities/LCEye.h rename to disasterserver_c/entities/LCEye.h diff --git a/disasterserver/entities/MJAss.c b/disasterserver_c/entities/MJAss.c similarity index 100% rename from disasterserver/entities/MJAss.c rename to disasterserver_c/entities/MJAss.c diff --git a/disasterserver/entities/MJAss.h b/disasterserver_c/entities/MJAss.h similarity index 100% rename from disasterserver/entities/MJAss.h rename to disasterserver_c/entities/MJAss.h diff --git a/disasterserver/entities/MJJudger.c b/disasterserver_c/entities/MJJudger.c similarity index 100% rename from disasterserver/entities/MJJudger.c rename to disasterserver_c/entities/MJJudger.c diff --git a/disasterserver/entities/MJJudger.h b/disasterserver_c/entities/MJJudger.h similarity index 100% rename from disasterserver/entities/MJJudger.h rename to disasterserver_c/entities/MJJudger.h diff --git a/disasterserver/entities/MJLava.c b/disasterserver_c/entities/MJLava.c similarity index 100% rename from disasterserver/entities/MJLava.c rename to disasterserver_c/entities/MJLava.c diff --git a/disasterserver/entities/MJLava.h b/disasterserver_c/entities/MJLava.h similarity index 100% rename from disasterserver/entities/MJLava.h rename to disasterserver_c/entities/MJLava.h diff --git a/disasterserver/entities/NAPIce.c b/disasterserver_c/entities/NAPIce.c similarity index 100% rename from disasterserver/entities/NAPIce.c rename to disasterserver_c/entities/NAPIce.c diff --git a/disasterserver/entities/NAPIce.h b/disasterserver_c/entities/NAPIce.h similarity index 100% rename from disasterserver/entities/NAPIce.h rename to disasterserver_c/entities/NAPIce.h diff --git a/disasterserver/entities/NAPSnowball.c b/disasterserver_c/entities/NAPSnowball.c similarity index 100% rename from disasterserver/entities/NAPSnowball.c rename to disasterserver_c/entities/NAPSnowball.c diff --git a/disasterserver/entities/NAPSnowball.h b/disasterserver_c/entities/NAPSnowball.h similarity index 100% rename from disasterserver/entities/NAPSnowball.h rename to disasterserver_c/entities/NAPSnowball.h diff --git a/disasterserver/entities/NotPerfect.c b/disasterserver_c/entities/NotPerfect.c similarity index 100% rename from disasterserver/entities/NotPerfect.c rename to disasterserver_c/entities/NotPerfect.c diff --git a/disasterserver/entities/NotPerfect.h b/disasterserver_c/entities/NotPerfect.h similarity index 100% rename from disasterserver/entities/NotPerfect.h rename to disasterserver_c/entities/NotPerfect.h diff --git a/disasterserver/entities/PFLift.c b/disasterserver_c/entities/PFLift.c similarity index 100% rename from disasterserver/entities/PFLift.c rename to disasterserver_c/entities/PFLift.c diff --git a/disasterserver/entities/PFLift.h b/disasterserver_c/entities/PFLift.h similarity index 100% rename from disasterserver/entities/PFLift.h rename to disasterserver_c/entities/PFLift.h diff --git a/disasterserver/entities/RMZShard.c b/disasterserver_c/entities/RMZShard.c similarity index 100% rename from disasterserver/entities/RMZShard.c rename to disasterserver_c/entities/RMZShard.c diff --git a/disasterserver/entities/RMZShard.h b/disasterserver_c/entities/RMZShard.h similarity index 100% rename from disasterserver/entities/RMZShard.h rename to disasterserver_c/entities/RMZShard.h diff --git a/disasterserver/entities/RMZSlug.c b/disasterserver_c/entities/RMZSlug.c similarity index 100% rename from disasterserver/entities/RMZSlug.c rename to disasterserver_c/entities/RMZSlug.c diff --git a/disasterserver/entities/RMZSlug.h b/disasterserver_c/entities/RMZSlug.h similarity index 100% rename from disasterserver/entities/RMZSlug.h rename to disasterserver_c/entities/RMZSlug.h diff --git a/disasterserver/entities/Ring.c b/disasterserver_c/entities/Ring.c similarity index 100% rename from disasterserver/entities/Ring.c rename to disasterserver_c/entities/Ring.c diff --git a/disasterserver/entities/Ring.h b/disasterserver_c/entities/Ring.h similarity index 100% rename from disasterserver/entities/Ring.h rename to disasterserver_c/entities/Ring.h diff --git a/disasterserver/entities/SpkieController.c b/disasterserver_c/entities/SpkieController.c similarity index 100% rename from disasterserver/entities/SpkieController.c rename to disasterserver_c/entities/SpkieController.c diff --git a/disasterserver/entities/SpkieController.h b/disasterserver_c/entities/SpkieController.h similarity index 100% rename from disasterserver/entities/SpkieController.h rename to disasterserver_c/entities/SpkieController.h diff --git a/disasterserver/entities/TCAcid.c b/disasterserver_c/entities/TCAcid.c similarity index 100% rename from disasterserver/entities/TCAcid.c rename to disasterserver_c/entities/TCAcid.c diff --git a/disasterserver/entities/TCAcid.h b/disasterserver_c/entities/TCAcid.h similarity index 100% rename from disasterserver/entities/TCAcid.h rename to disasterserver_c/entities/TCAcid.h diff --git a/disasterserver/entities/TailsDoll.c b/disasterserver_c/entities/TailsDoll.c similarity index 100% rename from disasterserver/entities/TailsDoll.c rename to disasterserver_c/entities/TailsDoll.c diff --git a/disasterserver/entities/TailsDoll.h b/disasterserver_c/entities/TailsDoll.h similarity index 100% rename from disasterserver/entities/TailsDoll.h rename to disasterserver_c/entities/TailsDoll.h diff --git a/disasterserver/entities/TailsProjectile.c b/disasterserver_c/entities/TailsProjectile.c similarity index 100% rename from disasterserver/entities/TailsProjectile.c rename to disasterserver_c/entities/TailsProjectile.c diff --git a/disasterserver/entities/TailsProjectile.h b/disasterserver_c/entities/TailsProjectile.h similarity index 100% rename from disasterserver/entities/TailsProjectile.h rename to disasterserver_c/entities/TailsProjectile.h diff --git a/disasterserver/entities/VVLava.c b/disasterserver_c/entities/VVLava.c similarity index 100% rename from disasterserver/entities/VVLava.c rename to disasterserver_c/entities/VVLava.c diff --git a/disasterserver/entities/VVLava.h b/disasterserver_c/entities/VVLava.h similarity index 100% rename from disasterserver/entities/VVLava.h rename to disasterserver_c/entities/VVLava.h diff --git a/disasterserver/entities/VVVase.h b/disasterserver_c/entities/VVVase.h similarity index 100% rename from disasterserver/entities/VVVase.h rename to disasterserver_c/entities/VVVase.h diff --git a/disasterserver/entities/WDLatern.c b/disasterserver_c/entities/WDLatern.c similarity index 100% rename from disasterserver/entities/WDLatern.c rename to disasterserver_c/entities/WDLatern.c diff --git a/disasterserver/entities/WDLatern.h b/disasterserver_c/entities/WDLatern.h similarity index 100% rename from disasterserver/entities/WDLatern.h rename to disasterserver_c/entities/WDLatern.h diff --git a/disasterserver/entities/YouCantRun.c b/disasterserver_c/entities/YouCantRun.c similarity index 100% rename from disasterserver/entities/YouCantRun.c rename to disasterserver_c/entities/YouCantRun.c diff --git a/disasterserver/entities/YouCantRun.h b/disasterserver_c/entities/YouCantRun.h similarity index 100% rename from disasterserver/entities/YouCantRun.h rename to disasterserver_c/entities/YouCantRun.h diff --git a/disasterserver/io/Dir.h b/disasterserver_c/io/Dir.h similarity index 100% rename from disasterserver/io/Dir.h rename to disasterserver_c/io/Dir.h diff --git a/disasterserver/io/Packet.c b/disasterserver_c/io/Packet.c similarity index 100% rename from disasterserver/io/Packet.c rename to disasterserver_c/io/Packet.c diff --git a/disasterserver/io/Packet.h b/disasterserver_c/io/Packet.h similarity index 100% rename from disasterserver/io/Packet.h rename to disasterserver_c/io/Packet.h diff --git a/disasterserver/io/Socket.h b/disasterserver_c/io/Socket.h similarity index 100% rename from disasterserver/io/Socket.h rename to disasterserver_c/io/Socket.h diff --git a/disasterserver/io/TcpListener.c b/disasterserver_c/io/TcpListener.c similarity index 100% rename from disasterserver/io/TcpListener.c rename to disasterserver_c/io/TcpListener.c diff --git a/disasterserver/io/TcpListener.h b/disasterserver_c/io/TcpListener.h similarity index 100% rename from disasterserver/io/TcpListener.h rename to disasterserver_c/io/TcpListener.h diff --git a/disasterserver/io/Threads.h b/disasterserver_c/io/Threads.h similarity index 100% rename from disasterserver/io/Threads.h rename to disasterserver_c/io/Threads.h diff --git a/disasterserver/io/Time.c b/disasterserver_c/io/Time.c similarity index 100% rename from disasterserver/io/Time.c rename to disasterserver_c/io/Time.c diff --git a/disasterserver/io/Time.h b/disasterserver_c/io/Time.h similarity index 100% rename from disasterserver/io/Time.h rename to disasterserver_c/io/Time.h diff --git a/disasterserver/io/UdpListener.c b/disasterserver_c/io/UdpListener.c similarity index 100% rename from disasterserver/io/UdpListener.c rename to disasterserver_c/io/UdpListener.c diff --git a/disasterserver/io/UdpListener.h b/disasterserver_c/io/UdpListener.h similarity index 100% rename from disasterserver/io/UdpListener.h rename to disasterserver_c/io/UdpListener.h diff --git a/disasterserver/maps/Act9.c b/disasterserver_c/maps/Act9.c similarity index 100% rename from disasterserver/maps/Act9.c rename to disasterserver_c/maps/Act9.c diff --git a/disasterserver/maps/Act9.h b/disasterserver_c/maps/Act9.h similarity index 100% rename from disasterserver/maps/Act9.h rename to disasterserver_c/maps/Act9.h diff --git a/disasterserver/maps/DarkTower.c b/disasterserver_c/maps/DarkTower.c similarity index 100% rename from disasterserver/maps/DarkTower.c rename to disasterserver_c/maps/DarkTower.c diff --git a/disasterserver/maps/DarkTower.h b/disasterserver_c/maps/DarkTower.h similarity index 100% rename from disasterserver/maps/DarkTower.h rename to disasterserver_c/maps/DarkTower.h diff --git a/disasterserver/maps/DotDotDot.c b/disasterserver_c/maps/DotDotDot.c similarity index 100% rename from disasterserver/maps/DotDotDot.c rename to disasterserver_c/maps/DotDotDot.c diff --git a/disasterserver/maps/DotDotDot.h b/disasterserver_c/maps/DotDotDot.h similarity index 100% rename from disasterserver/maps/DotDotDot.h rename to disasterserver_c/maps/DotDotDot.h diff --git a/disasterserver/maps/FartZone.c b/disasterserver_c/maps/FartZone.c similarity index 100% rename from disasterserver/maps/FartZone.c rename to disasterserver_c/maps/FartZone.c diff --git a/disasterserver/maps/FartZone.h b/disasterserver_c/maps/FartZone.h similarity index 100% rename from disasterserver/maps/FartZone.h rename to disasterserver_c/maps/FartZone.h diff --git a/disasterserver/maps/HauntingDream.c b/disasterserver_c/maps/HauntingDream.c similarity index 100% rename from disasterserver/maps/HauntingDream.c rename to disasterserver_c/maps/HauntingDream.c diff --git a/disasterserver/maps/HauntingDream.h b/disasterserver_c/maps/HauntingDream.h similarity index 100% rename from disasterserver/maps/HauntingDream.h rename to disasterserver_c/maps/HauntingDream.h diff --git a/disasterserver/maps/HideAndSeek.c b/disasterserver_c/maps/HideAndSeek.c similarity index 100% rename from disasterserver/maps/HideAndSeek.c rename to disasterserver_c/maps/HideAndSeek.c diff --git a/disasterserver/maps/HideAndSeek2.h b/disasterserver_c/maps/HideAndSeek2.h similarity index 100% rename from disasterserver/maps/HideAndSeek2.h rename to disasterserver_c/maps/HideAndSeek2.h diff --git a/disasterserver/maps/Hill.c b/disasterserver_c/maps/Hill.c similarity index 100% rename from disasterserver/maps/Hill.c rename to disasterserver_c/maps/Hill.c diff --git a/disasterserver/maps/Hill.h b/disasterserver_c/maps/Hill.h similarity index 100% rename from disasterserver/maps/Hill.h rename to disasterserver_c/maps/Hill.h diff --git a/disasterserver/maps/KindAndFair.c b/disasterserver_c/maps/KindAndFair.c similarity index 100% rename from disasterserver/maps/KindAndFair.c rename to disasterserver_c/maps/KindAndFair.c diff --git a/disasterserver/maps/KindAndFair.h b/disasterserver_c/maps/KindAndFair.h similarity index 100% rename from disasterserver/maps/KindAndFair.h rename to disasterserver_c/maps/KindAndFair.h diff --git a/disasterserver/maps/LimpCity.c b/disasterserver_c/maps/LimpCity.c similarity index 100% rename from disasterserver/maps/LimpCity.c rename to disasterserver_c/maps/LimpCity.c diff --git a/disasterserver/maps/LimpCity.h b/disasterserver_c/maps/LimpCity.h similarity index 100% rename from disasterserver/maps/LimpCity.h rename to disasterserver_c/maps/LimpCity.h diff --git a/disasterserver/maps/MajinForest.c b/disasterserver_c/maps/MajinForest.c similarity index 100% rename from disasterserver/maps/MajinForest.c rename to disasterserver_c/maps/MajinForest.c diff --git a/disasterserver/maps/MajinForest.h b/disasterserver_c/maps/MajinForest.h similarity index 100% rename from disasterserver/maps/MajinForest.h rename to disasterserver_c/maps/MajinForest.h diff --git a/disasterserver/maps/Marijuna.c b/disasterserver_c/maps/Marijuna.c similarity index 100% rename from disasterserver/maps/Marijuna.c rename to disasterserver_c/maps/Marijuna.c diff --git a/disasterserver/maps/Marijuna.h b/disasterserver_c/maps/Marijuna.h similarity index 100% rename from disasterserver/maps/Marijuna.h rename to disasterserver_c/maps/Marijuna.h diff --git a/disasterserver/maps/NastyParadise.c b/disasterserver_c/maps/NastyParadise.c similarity index 100% rename from disasterserver/maps/NastyParadise.c rename to disasterserver_c/maps/NastyParadise.c diff --git a/disasterserver/maps/NastyParadise.h b/disasterserver_c/maps/NastyParadise.h similarity index 100% rename from disasterserver/maps/NastyParadise.h rename to disasterserver_c/maps/NastyParadise.h diff --git a/disasterserver/maps/NotPerfect.c b/disasterserver_c/maps/NotPerfect.c similarity index 100% rename from disasterserver/maps/NotPerfect.c rename to disasterserver_c/maps/NotPerfect.c diff --git a/disasterserver/maps/NotPerfect.h b/disasterserver_c/maps/NotPerfect.h similarity index 100% rename from disasterserver/maps/NotPerfect.h rename to disasterserver_c/maps/NotPerfect.h diff --git a/disasterserver/maps/PricelessFreedom.c b/disasterserver_c/maps/PricelessFreedom.c similarity index 100% rename from disasterserver/maps/PricelessFreedom.c rename to disasterserver_c/maps/PricelessFreedom.c diff --git a/disasterserver/maps/PricelessFreedom.h b/disasterserver_c/maps/PricelessFreedom.h similarity index 100% rename from disasterserver/maps/PricelessFreedom.h rename to disasterserver_c/maps/PricelessFreedom.h diff --git a/disasterserver/maps/RavineMist.c b/disasterserver_c/maps/RavineMist.c similarity index 100% rename from disasterserver/maps/RavineMist.c rename to disasterserver_c/maps/RavineMist.c diff --git a/disasterserver/maps/RavineMist.h b/disasterserver_c/maps/RavineMist.h similarity index 100% rename from disasterserver/maps/RavineMist.h rename to disasterserver_c/maps/RavineMist.h diff --git a/disasterserver/maps/TortureCave.c b/disasterserver_c/maps/TortureCave.c similarity index 100% rename from disasterserver/maps/TortureCave.c rename to disasterserver_c/maps/TortureCave.c diff --git a/disasterserver/maps/TortureCave.h b/disasterserver_c/maps/TortureCave.h similarity index 100% rename from disasterserver/maps/TortureCave.h rename to disasterserver_c/maps/TortureCave.h diff --git a/disasterserver/maps/VolcanoValley.c b/disasterserver_c/maps/VolcanoValley.c similarity index 100% rename from disasterserver/maps/VolcanoValley.c rename to disasterserver_c/maps/VolcanoValley.c diff --git a/disasterserver/maps/VolcanoValley.h b/disasterserver_c/maps/VolcanoValley.h similarity index 100% rename from disasterserver/maps/VolcanoValley.h rename to disasterserver_c/maps/VolcanoValley.h diff --git a/disasterserver/maps/WoodDream.c b/disasterserver_c/maps/WoodDream.c similarity index 100% rename from disasterserver/maps/WoodDream.c rename to disasterserver_c/maps/WoodDream.c diff --git a/disasterserver/maps/WoodDream.h b/disasterserver_c/maps/WoodDream.h similarity index 100% rename from disasterserver/maps/WoodDream.h rename to disasterserver_c/maps/WoodDream.h diff --git a/disasterserver/maps/YouCantRun.c b/disasterserver_c/maps/YouCantRun.c similarity index 100% rename from disasterserver/maps/YouCantRun.c rename to disasterserver_c/maps/YouCantRun.c diff --git a/disasterserver/maps/YouCantRun.h b/disasterserver_c/maps/YouCantRun.h similarity index 100% rename from disasterserver/maps/YouCantRun.h rename to disasterserver_c/maps/YouCantRun.h diff --git a/disasterserver/states/CharSelect.c b/disasterserver_c/states/CharSelect.c similarity index 100% rename from disasterserver/states/CharSelect.c rename to disasterserver_c/states/CharSelect.c diff --git a/disasterserver/states/Game.c b/disasterserver_c/states/Game.c similarity index 100% rename from disasterserver/states/Game.c rename to disasterserver_c/states/Game.c diff --git a/disasterserver/states/Lobby.c b/disasterserver_c/states/Lobby.c similarity index 100% rename from disasterserver/states/Lobby.c rename to disasterserver_c/states/Lobby.c diff --git a/disasterserver/states/Mapvote.c b/disasterserver_c/states/Mapvote.c similarity index 100% rename from disasterserver/states/Mapvote.c rename to disasterserver_c/states/Mapvote.c diff --git a/disasterserver/states/Results.c b/disasterserver_c/states/Results.c similarity index 100% rename from disasterserver/states/Results.c rename to disasterserver_c/states/Results.c diff --git a/disasterserver/states/Server.c b/disasterserver_c/states/Server.c similarity index 100% rename from disasterserver/states/Server.c rename to disasterserver_c/states/Server.c diff --git a/disasterserver/ui/Button.c b/disasterserver_c/ui/Button.c similarity index 100% rename from disasterserver/ui/Button.c rename to disasterserver_c/ui/Button.c diff --git a/disasterserver/ui/Components.h b/disasterserver_c/ui/Components.h similarity index 100% rename from disasterserver/ui/Components.h rename to disasterserver_c/ui/Components.h diff --git a/disasterserver/ui/Image.c b/disasterserver_c/ui/Image.c similarity index 100% rename from disasterserver/ui/Image.c rename to disasterserver_c/ui/Image.c diff --git a/disasterserver/ui/Label.c b/disasterserver_c/ui/Label.c similarity index 100% rename from disasterserver/ui/Label.c rename to disasterserver_c/ui/Label.c diff --git a/disasterserver/ui/Main.c b/disasterserver_c/ui/Main.c similarity index 99% rename from disasterserver/ui/Main.c rename to disasterserver_c/ui/Main.c index f7563e1..61c30e4 100644 --- a/disasterserver/ui/Main.c +++ b/disasterserver_c/ui/Main.c @@ -226,7 +226,7 @@ int main(int argc, char** argv) break; } } - + SDL_RenderClear(renderer); { SDL_FRect src = { 480 + ((int)bg / 3 % 28) * 96, 446, 96, 96 }; diff --git a/disasterserver/ui/Main.h b/disasterserver_c/ui/Main.h similarity index 100% rename from disasterserver/ui/Main.h rename to disasterserver_c/ui/Main.h diff --git a/disasterserver/ui/MapList.c b/disasterserver_c/ui/MapList.c similarity index 100% rename from disasterserver/ui/MapList.c rename to disasterserver_c/ui/MapList.c diff --git a/disasterserver/ui/MapListPreset.c b/disasterserver_c/ui/MapListPreset.c similarity index 100% rename from disasterserver/ui/MapListPreset.c rename to disasterserver_c/ui/MapListPreset.c diff --git a/disasterserver/ui/PingPreset.c b/disasterserver_c/ui/PingPreset.c similarity index 100% rename from disasterserver/ui/PingPreset.c rename to disasterserver_c/ui/PingPreset.c diff --git a/disasterserver/ui/PlayerList.c b/disasterserver_c/ui/PlayerList.c similarity index 100% rename from disasterserver/ui/PlayerList.c rename to disasterserver_c/ui/PlayerList.c diff --git a/disasterserver/ui/Presets.c b/disasterserver_c/ui/Presets.c similarity index 100% rename from disasterserver/ui/Presets.c rename to disasterserver_c/ui/Presets.c diff --git a/disasterserver/ui/Presets.h b/disasterserver_c/ui/Presets.h similarity index 100% rename from disasterserver/ui/Presets.h rename to disasterserver_c/ui/Presets.h diff --git a/disasterserver/ui/Resources.c b/disasterserver_c/ui/Resources.c similarity index 100% rename from disasterserver/ui/Resources.c rename to disasterserver_c/ui/Resources.c diff --git a/disasterserver/ui/Resources.h b/disasterserver_c/ui/Resources.h similarity index 100% rename from disasterserver/ui/Resources.h rename to disasterserver_c/ui/Resources.h diff --git a/disasterserver/ui/Spritesheet.h b/disasterserver_c/ui/Spritesheet.h similarity index 100% rename from disasterserver/ui/Spritesheet.h rename to disasterserver_c/ui/Spritesheet.h diff --git a/disasterserver/ui/TButton.c b/disasterserver_c/ui/TButton.c similarity index 100% rename from disasterserver/ui/TButton.c rename to disasterserver_c/ui/TButton.c From ac6433d04b2f952fbfe4218c308c976eb75e948a Mon Sep 17 00:00:00 2001 From: MilesGlitch Date: Sun, 30 Aug 2026 21:18:32 +0300 Subject: [PATCH 04/61] =?UTF-8?q?=D1=87=D1=82=D0=BE-=D1=82=D0=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CMakeLists.txt | 30 +++- disasterserver/Api.hpp | 11 ++ disasterserver/CMakeLists.txt | 109 ++++++++++++++ disasterserver/Colors.hpp | 16 ++ disasterserver/DisasterServer.cpp | 13 ++ disasterserver/DisasterServer.hpp | 15 ++ disasterserver/Io/Packet.cpp | 233 ++++++++++++++++++++++++++++++ disasterserver/Io/Packet.hpp | 206 ++++++++++++++++++++++++++ disasterserver/Io/Threads.hpp | 54 +++++++ disasterserver/Io/Time.cpp | 49 +++++++ disasterserver/Io/Time.hpp | 15 ++ disasterserver/Log.cpp | 159 ++++++++++++++++++++ disasterserver/Log.hpp | 167 +++++++++++++++++++++ disasterserver/Main.cpp | 17 +++ disasterserver_c/CMakeLists.txt | 28 +--- 15 files changed, 1093 insertions(+), 29 deletions(-) create mode 100644 disasterserver/Api.hpp create mode 100644 disasterserver/CMakeLists.txt create mode 100644 disasterserver/Colors.hpp create mode 100644 disasterserver/DisasterServer.cpp create mode 100644 disasterserver/DisasterServer.hpp create mode 100644 disasterserver/Io/Packet.cpp create mode 100644 disasterserver/Io/Packet.hpp create mode 100644 disasterserver/Io/Threads.hpp create mode 100644 disasterserver/Io/Time.cpp create mode 100644 disasterserver/Io/Time.hpp create mode 100644 disasterserver/Log.cpp create mode 100644 disasterserver/Log.hpp create mode 100644 disasterserver/Main.cpp diff --git a/CMakeLists.txt b/CMakeLists.txt index e4c67dc..96f6381 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,11 +1,20 @@ cmake_minimum_required(VERSION 3.16.3) -project(disasterserver_c CXX C) +project(DisasterServer CXX C) if (POLICY CMP0141) cmake_policy(SET CMP0141 NEW) set(CMAKE_MSVC_DEBUG_INFORMATION_FORMAT "$,$>,$<$:EditAndContinue>,$<$:ProgramDatabase>>") endif() +if((CMAKE_C_COMPILER_ID STREQUAL "Clang" OR CMAKE_C_COMPILER_ID STREQUAL "GNU")) + set(CMAKE_C_FLAGS_DEBUG "-g") + set(CMAKE_C_FLAGS_RELEASE "-O3") + message("Clang/GCC flags applied") +endif() + +include(TestBigEndian) +TEST_BIG_ENDIAN(IS_BIG_ENDIAN) + set(CMAKE_CXX_STANDARD 23) set(CXX_STANDARD_REQUIRED ON) set(CMAKE_CXX_EXTENSIONS ON) @@ -13,6 +22,22 @@ set(CMAKE_CXX_EXTENSIONS ON) option(DYLIB "Builds dynamic library" OFF) option(BUILD_UI "Builds UI using SDL" OFF) +if(IS_BIG_ENDIAN) + add_compile_definitions(SYS_BIG_ENDIAN) +endif() + +if(DYLIB) + add_compile_definitions(SYS_DYLIB) +endif() + +if(BUILD_UI) + add_compile_definitions(SYS_USE_SDL2) +endif() + +if(ANDROID) + add_compile_definitions(SYS_ANDROID) +endif() + if (BUILD_UI) set(BUILD_SHARED_LIBS OFF) set(SDL_STATIC ON) @@ -50,4 +75,5 @@ endif () add_subdirectory(thirdparty/enet) -add_subdirectory(disasterserver_c/) \ No newline at end of file +add_subdirectory(disasterserver_c/) +add_subdirectory(disasterserver) \ No newline at end of file diff --git a/disasterserver/Api.hpp b/disasterserver/Api.hpp new file mode 100644 index 0000000..ceb9d9e --- /dev/null +++ b/disasterserver/Api.hpp @@ -0,0 +1,11 @@ +#ifndef API_HPP +#define API_HPP + +#ifdef _WIN32 + #define SERVER_API __declspec(dllexport) +#else + #define SERVER_API +#endif + + +#endif //API_HPP diff --git a/disasterserver/CMakeLists.txt b/disasterserver/CMakeLists.txt new file mode 100644 index 0000000..d5f52ae --- /dev/null +++ b/disasterserver/CMakeLists.txt @@ -0,0 +1,109 @@ + +set(SOURCES + "Io/Packet.cpp" + "Io/TcpListener.cpp" + "Io/Time.cpp" + "Io/UdpListener.cpp" + "Log.cpp" + "DisasterServer.cpp" +) + +if(ANDROID) + add_library(DisasterServerCXX SHARED "Android.cpp" ${SOURCES}) + + set(THREADS_PREFER_PTHREAD_FLAG ON) + find_package(Threads REQUIRED) + target_include_directories(DisasterServerCXX PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}) + target_link_libraries(DisasterServerCXX PRIVATE log enet m Threads::Threads) +else() + if(DYLIB) # Build .dll or .so + add_library(DisasterServerCXX SHARED ${SOURCES}) + + if (WIN32) + target_link_libraries(DisasterServerCXX PRIVATE enet ws2_32 winmm dbghelp) + else() # UNIX + set(THREADS_PREFER_PTHREAD_FLAG ON) + find_package(Threads REQUIRED) + target_link_libraries(DisasterServerCXX PRIVATE enet m Threads::Threads) + endif() + + target_include_directories(DisasterServerCXX PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}) + + else() # Build executable + if(BUILD_UI) + # set(UI_SOURCES + # "ui/Resources.c" + # "ui/Main.c" + # "ui/Image.c" + # "ui/Label.c" + # "ui/Button.c" + # "ui/TButton.c" + # "ui/MapList.c" + # "ui/Presets.c" + # "ui/MapListPreset.c" + # "ui/PingPreset.c" + # "ui/PlayerList.c" + # ) + + # if (WIN32) + # add_executable(DisasterServer + # ${SOURCES} + # ${UI_SOURCES} + # ) + + # target_link_libraries(DisasterServer PRIVATE + # ws2_32 + # enet + # winmm + # dbghelp + # SDL3-static + # SDL3_image::SDL3_image + # ) + + # target_include_directories(DisasterServer PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}) + + # target_sources(DisasterServer PRIVATE "${CMAKE_SOURCE_DIR}/resources/icon.rc") + + # else() # UNIX + # add_executable(DisasterServer + # ${SOURCES} + # ${UI_SOURCES} + # ) + + # set(THREADS_PREFER_PTHREAD_FLAG ON) + # find_package(Threads REQUIRED) + # target_link_libraries(DisasterServer PRIVATE enet m Threads::Threads + # SDL3::SDL3-static + # SDL3_image::SDL3_image + # ) + # endif() + + # target_include_directories(DisasterServer PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}) + + else() + add_executable(DisasterServerCXX + ${SOURCES} + Main.cpp + ) + + if (WIN32) + target_link_libraries(DisasterServerCXX PRIVATE enet ws2_32 winmm dbghelp) + else() # UNIX + set(THREADS_PREFER_PTHREAD_FLAG ON) + find_package(Threads REQUIRED) + target_link_libraries(DisasterServerCXX PRIVATE enet m Threads::Threads) + endif() + + target_include_directories(DisasterServerCXX PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}) + + endif() + endif() +endif() + + +if(MSVC) + add_definitions(-D_CRT_SECURE_NO_WARNINGS) +endif() + +unset(DYLIB CACHE) +unset(BUILD_UI CACHE) \ No newline at end of file diff --git a/disasterserver/Colors.hpp b/disasterserver/Colors.hpp new file mode 100644 index 0000000..723e174 --- /dev/null +++ b/disasterserver/Colors.hpp @@ -0,0 +1,16 @@ +#ifndef COLORS_HPP +#define COLORS_HPP + +#define CLRCODE_RED "\\" +#define CLRCODE_GRN "@" +#define CLRCODE_PUR "&" +#define CLRCODE_BLU "/" +#define CLRCODE_GRA "|" +#define CLRCODE_YLW "`" +#define CLRCODE_ORG "\xE2\x84\x96" +#define CLRCODE_RST "~" + +#define CLRLIST { CLRCODE_RED, CLRCODE_GRN, CLRCODE_PUR, CLRCODE_BLU, CLRCODE_GRA, CLRCODE_YLW, CLRCODE_ORG, CLRCODE_RST } +#define CLRLIST_LEN 8 + +#endif //COLORS_HPP diff --git a/disasterserver/DisasterServer.cpp b/disasterserver/DisasterServer.cpp new file mode 100644 index 0000000..2273958 --- /dev/null +++ b/disasterserver/DisasterServer.cpp @@ -0,0 +1,13 @@ +#include "DisasterServer.hpp" + +DisasterServer::DisasterServer() = default; + +DisasterServer::~DisasterServer() = default; + +bool DisasterServer::init() { + return true; +} + +int DisasterServer::run() { + return 1; +} diff --git a/disasterserver/DisasterServer.hpp b/disasterserver/DisasterServer.hpp new file mode 100644 index 0000000..c5ef97b --- /dev/null +++ b/disasterserver/DisasterServer.hpp @@ -0,0 +1,15 @@ +#ifndef DISASTERSERVER_HPP +#define DISASTERSERVER_HPP + + +class DisasterServer { +public: + DisasterServer(); + ~DisasterServer(); + + bool init(); + int run(); +}; + + +#endif //DISASTERSERVER_HPP diff --git a/disasterserver/Io/Packet.cpp b/disasterserver/Io/Packet.cpp new file mode 100644 index 0000000..211a8e0 --- /dev/null +++ b/disasterserver/Io/Packet.cpp @@ -0,0 +1,233 @@ +#include "Packet.hpp" + +#include "Log.hpp" + +#ifdef __GNUC__ // GCC, clang... + #define BYTESWAP_16(x) __builtin_bswap16((x)) + #define BYTESWAP_32(x) __builtin_bswap32((x)) + #define BYTESWAP_64(x) __builtin_bswap64((x)) +#else + #define BYTESWAP_16(x) _byteswap_ushort((x)) + #define BYTESWAP_32(x) _byteswap_ulong((x)) + #define BYTESWAP_64(x) _byteswap_uint64((x)) +#endif + +Packet::Packet(ENetPacket *packet) { + memcpy(buffer, packet->data, (uint8_t)packet->dataLength); + enet_packet_destroy(packet); +} + +bool Packet::seek(int wh) { + RAssert(wh >= 0); + RAssert(wh < PACKET_MAXSIZE); + RAssert(wh < len); + + pos = wh; + return true; +} + +bool Packet::read8(uint8_t *out) { + RAssert(pos < len); + *out = buffer[pos++]; + + return true; +} + +bool Packet::read16(uint16_t *out) { + RAssert(pos < len); + *out = *((int16_t*)&buffer[pos]); + +#ifdef SYS_BIG_ENDIAN + *out = BYTESWAP_16(*out); +#endif + + pos += 2; + + return true; +} + +bool Packet::read32(uint32_t *out) { + RAssert(pos < len); + *out = *((int32_t*)&buffer[pos]); + +#ifdef SYS_BIG_ENDIAN + *out = BYTESWAP_32(*out); +#endif + + pos += 4; + + return true; +} + +bool Packet::read64(uint64_t *out) { + RAssert(pos < len); + *out = *((int64_t*)&buffer[pos]); + +#ifdef SYS_BIG_ENDIAN + *out = BYTESWAP_64(*out); +#endif + + pos += 8; + + return true; +} + +bool Packet::readFloat(float *out) { + RAssert(pos < len); + *out = *((float*)&buffer[pos]); + +#ifdef SYS_BIG_ENDIAN + *out = BYTESWAP_32(*out); +#endif + + pos += 4; + + return true; +} + +bool Packet::readDouble(double *out) { + RAssert(pos < len); + *out = *((float*)&buffer[pos]); + +#ifdef SYS_BIG_ENDIAN + * out = BYTESWAP_32(*out); +#endif + + pos += 8; + + return true; +} + +bool Packet::readStr(String *out) { + out->len = 0; + + while (true) + { + RAssert(pos < len); + RAssert(out->len < 128); + + char ch = buffer[pos]; + out->value[out->len] = ch; + + pos++; + out->len++; + + if (ch == '\0') + break; + } + + return true; +} + +bool Packet::write8(uint8_t value) { + RAssert(pos + 1 < PACKET_MAXSIZE); + + if (pos + 1 >= len) + len++; + + buffer[pos++] = value; + return true; +} + +bool Packet::write16(uint16_t value) { + RAssert(pos + 2 < PACKET_MAXSIZE); + + if (pos + 2 >= len) + len += 2; + +#ifdef SYS_BIG_ENDIAN + value = BYTESWAP_16(value); +#endif + + uint8_t* ptr = (uint8_t*)&value; + buffer[pos++] = ptr[0]; + buffer[pos++] = ptr[1]; + return true; +} + +bool Packet::write32(uint32_t value) { + RAssert(pos + 4 < PACKET_MAXSIZE); + + if (pos + 4 >= len) + len += 4; + +#ifdef SYS_BIG_ENDIAN + value = BYTESWAP_32(value); +#endif + + uint8_t* ptr = (uint8_t*)&value; + buffer[pos++] = ptr[0]; + buffer[pos++] = ptr[1]; + buffer[pos++] = ptr[2]; + buffer[pos++] = ptr[3]; + return true; +} + +bool Packet::write64(uint64_t value) { + RAssert(pos + 8 < PACKET_MAXSIZE); + + if (pos + 8 >= len) + len += 8; + +#ifdef SYS_BIG_ENDIAN + value = BYTESWAP_64(value); +#endif + + uint8_t* ptr = (uint8_t*)&value; + buffer[pos++] = ptr[0]; + buffer[pos++] = ptr[1]; + buffer[pos++] = ptr[2]; + buffer[pos++] = ptr[3]; + buffer[pos++] = ptr[4]; + buffer[pos++] = ptr[5]; + buffer[pos++] = ptr[6]; + buffer[pos++] = ptr[7]; + return true; +} + +bool Packet::writeFloat(float value) { + RAssert(pos + 4 < PACKET_MAXSIZE); + + if (pos + 4 >= len) + len += 4; + +#ifdef SYS_BIG_ENDIAN + value = BYTESWAP_32(value); +#endif + + uint8_t* ptr = (uint8_t*)&value; + buffer[pos++] = ptr[0]; + buffer[pos++] = ptr[1]; + buffer[pos++] = ptr[2]; + buffer[pos++] = ptr[3]; + return true; +} + +bool Packet::writeDouble(double value) { + RAssert(pos + 8 < PACKET_MAXSIZE); + + if (pos + 8 >= len) + len += 8; + +#ifdef SYS_BIG_ENDIAN + value = BYTESWAP_64(value); +#endif + + uint8_t* ptr = (uint8_t*)&value; + buffer[pos++] = ptr[0]; + buffer[pos++] = ptr[1]; + buffer[pos++] = ptr[2]; + buffer[pos++] = ptr[3]; + buffer[pos++] = ptr[4]; + buffer[pos++] = ptr[5]; + buffer[pos++] = ptr[6]; + buffer[pos++] = ptr[7]; + return true; +} + +bool Packet::writeStr(String value) { + for (uint8_t i = 0; i < value.len; i++) + RAssert(write8(value.value[i])); + + return true; +} diff --git a/disasterserver/Io/Packet.hpp b/disasterserver/Io/Packet.hpp new file mode 100644 index 0000000..acdaa1a --- /dev/null +++ b/disasterserver/Io/Packet.hpp @@ -0,0 +1,206 @@ +#ifndef PACKET_H +#define PACKET_H + +#include +#include + +#define PACKET_MAXSIZE 256 + +enum PacketType +{ + IDENTITY, + SERVER_IDENTITY_RESPONSE, + + SERVER_PLAYER_JOINED, + SERVER_PLAYER_LEFT, + SERVER_PLAYER_FORCE_DISCONNECT, + + SERVER_WAITING_PLAYER_INFO, + + SERVER_LOBBY_READY_STATE, + SERVER_LOBBY_EXE, + SERVER_LOBBY_COUNTDOWN, + SERVER_LOBBY_EXE_CHANGE, + SERVER_LOBBY_CHARACTER_CHANGE, + SERVER_LOBBY_CHARACTER_RESPONSE, + SERVER_LOBBY_EXECHARACTER_RESPONSE, + SERVER_LOBBY_GAME_START, + SERVER_LOBBY_PLAYER, + SERVER_LOBBY_EXE_CHANCE, + SERVER_LOBBY_CORRECT, + SERVER_LOBBY_CHOOSEVOTEKICK, + SERVER_LOBBY_CHOOSEBAN, + SERVER_LOBBY_CHOOSEKICK, + SERVER_LOBBY_CHOOSEOP, + SERVER_LOBBY_CHANGELOBBY, + SERVER_CHAR_TIME_SYNC, + + SERVER_VOTE_MAPS, + SERVER_VOTE_SET, + SERVER_VOTE_TIME_SYNC, + + SERVER_GAME_PLAYERS_READY, + SERVER_GAME_EXE_WINS, + SERVER_GAME_SURVIVOR_WIN, + SERVER_GAME_SPAWN_RING, + SERVER_GAME_PLAYER_ESCAPED, + SERVER_GAME_BACK_TO_LOBBY, + SERVER_GAME_TIME_SYNC, + SERVER_GAME_TIME_OVER, + SERVER_GAME_PING, + SERVER_PLAYER_DEATH_STATE, + SERVER_GAME_DEATHTIMER_TICK, + SERVER_GAME_DEATHTIMER_END, + + SERVER_REQUEST_INFO, + SERVER_HEARTBEAT, + SERVER_PONG, + + SERVER_FORCE_DAMAGE, + SERVER_GAME_RING_READY, + SERVER_PLAYER_BACKTRACK, + + // Entities + SERVER_TPROJECTILE_STATE, + SERVER_ETRACKER_STATE, + SERVER_ERECTOR_BRING_SPAWN, + SERVER_RMZSLIME_STATE, + SERVER_RMZSLIME_RINGBONUS, + SERVER_RMZSHARD_STATE, + SERVER_LCEYE_STATE, + SERVER_LCCHAIN_STATE, + SERVER_NPCONTROLLER_STATE, + SERVER_KAFMONITOR_STATE, + SERVER_YCRSMOKE_STATE, + SERVER_YCRSMOKE_READY, + SERVER_MOVINGSPIKE_STATE, + SERVER_RING_STATE, + SERVER_RING_COLLECTED, + SERVER_ACT9WALL_STATE, + SERVER_NAPBALL_STATE, + SERVER_NAPICE_STATE, + SERVER_PFLIFT_STATE, + SERVER_BRING_STATE, + SERVER_BRING_COLLECTED, + SERVER_VVLCOLUMN_STATE, + SERVER_VVVASE_STATE, + SERVER_GHZTHUNDER_STATE, + SERVER_TCGOM_STATE, + SERVER_EXELLERCLONE_STATE, + SERVER_DTTAILSDOLL_STATE, + SERVER_DTBALL_STATE, + SERVER_DTASS_STATE, + SERVER_HDDOOR_STATE, + SERVER_WDLATERN_ACTIVATE, + SERVER_FART_STATE, + SERVER_MJLAVA_STATE, + SERVER_MJJUDGER_STATE, + SERVER_MJCRYSTAL_STATE, + + // Entity actions + CLIENT_ETRACKER, + CLIENT_ETRACKER_ACTIVATED, + CLIENT_TPROJECTILE, + CLIENT_TPROJECTILE_HIT, + CLIENT_TPROJECTILE_STARTCHARGE, + CLIENT_ERECTOR_BALLS, + CLIENT_ERECTOR_BRING_SPAWN, + CLIENT_EXELLER_SPAWN_CLONE, + CLIENT_EXELLER_TELEPORT_CLONE, + CLIENT_MERCOIN_BONUS, + + CLIENT_RMZSLIME_HIT, + CLIENT_LCEYE_REQUEST_ACTIVATE, + CLIENT_KAFMONITOR_ACTIVATE, + CLIENT_RING_COLLECTED, + CLIENT_RING_BROKE, + CLIENT_BRING_COLLECTED, + CLIENT_NAPICE_ACTIVATE, + CLIENT_SPRING_USE, + CLIENT_PFLIT_ACTIVATE, + CLIENT_VVVASE_BREAK, + CLIENT_RMZSHARD_COLLECT, + CLIENT_RMZSHARD_LAND, + CLIENT_DTASS_ACTIVATE, + CLIENT_HDDOOR_TOGGLE, + CLIENT_FART_PUSH, + + CLIENT_LOBBY_READY_STATE, + CLIENT_REQUESTED_INFO, + CLIENT_PLAYER_DATA, + CLIENT_PLAYER_HURT, + CLIENT_SOUND_EMIT, + CLIENT_PING, + + CLIENT_REVIVAL_PROGRESS, + CLIENT_PLAYER_HEAL, + CLIENT_PLAYER_HEAL_PART, + SERVER_REVIVAL_PROGRESS, + SERVER_REVIVAL_STATUS, + SERVER_REVIVAL_RINGSUB, + SERVER_REVIVAL_REVIVED, + + CLIENT_REQUEST_CHARACTER, + CLIENT_REQUEST_EXECHARACTER, + CLIENT_VOTE_REQUEST, + + CLIENT_PLAYER_DEATH_STATE, + CLIENT_PLAYER_ESCAPED, + SERVER_PLAYER_ESCAPED, + CLIENT_LOBBY_PLAYERS_REQUEST, + CLIENT_CREAM_SPAWN_RINGS, + CLIENT_SPAWN_EFFECT, + CLIENT_CHAT_MESSAGE, + CLIENT_LOBBY_CHOOSEVOTEKICK, + CLIENT_LOBBY_CHOOSEBAN, + CLIENT_LOBBY_CHOOSEKICK, + CLIENT_LOBBY_CHOOSEOP, + CLIENT_PLAYER_PALETTE, + CLIENT_PET_PALETTE, + + SERVER_RESULTS, + SERVER_RESULTS_DATA, + CLIENT_RESULTS_REQUEST, + CLIENT_STATS_REPORT, + SERVER_PREIDENTITY, + SERVER_FELLA, + + CLIENT_PLAYER_POTATER +}; + +typedef struct +{ + char value[250]; + uint16_t len; +} String; + +class Packet { + uint8_t buffer[PACKET_MAXSIZE] = {}; + uint8_t pos = 0; + uint8_t len = {}; +public: + Packet() = default; + + explicit Packet(ENetPacket* packet); + ~Packet() = default; + + bool seek(int wh); + + bool read8(uint8_t* out); + bool read16(uint16_t* out); + bool read32(uint32_t* out); + bool read64(uint64_t* out); + bool readFloat(float* out); + bool readDouble(double* out); + bool readStr(String* out); + + bool write8(uint8_t value); + bool write16(uint16_t value); + bool write32(uint32_t value); + bool write64(uint64_t value); + bool writeFloat(float value); + bool writeDouble(double value); + bool writeStr(String value); +}; + +#endif diff --git a/disasterserver/Io/Threads.hpp b/disasterserver/Io/Threads.hpp new file mode 100644 index 0000000..4e7520b --- /dev/null +++ b/disasterserver/Io/Threads.hpp @@ -0,0 +1,54 @@ +#ifndef THREADS_HPP +#define THREADS_HPP + +#if defined(__unix) || defined(__unix__) + #include + #include + #include + #include + + typedef pthread_t Thread; + typedef pthread_key_t ThreadVar; + typedef void* (*pthread_cbfunc_t) (void*); + + #define ThreadVarCreate(var) pthread_key_create(&var, NULL) + #define ThreadVarSet(var, value) pthread_setspecific(var, value) + #define ThreadVarGet(var) pthread_getspecific(var) + #define ThreadVarFree(var) pthread_key_delete(var) + + #define ThreadSpawn(thr, cb, arg) { pthread_create(&thr, NULL, (pthread_cbfunc_t)(cb), (arg)); pthread_detach(thr); } + #define ThreadJoin(thr) pthread_join(thr, NULL) + #define ThreadSleep(ms) { struct timespec ts;\ + ts.tv_sec = ms / 1000;\ + ts.tv_nsec = (ms % 1000) * 1000000;\ + nanosleep(&ts, NULL); } + + typedef pthread_mutex_t Mutex; + #define MutexCreate(mut) RAssert(pthread_mutex_init(&mut, NULL) == 0) + #define MutexLock(mut) RAssert(pthread_mutex_lock(&mut) == 0) + #define MutexUnlock(mut) RAssert(pthread_mutex_unlock(&mut) == 0) +#else + #define WIN32_LEAN_AND_MEAN + #include + + typedef HANDLE Thread; + typedef DWORD ThreadVar; + + #define ThreadVarCreate(var) RAssert((var = TlsAlloc()) != TLS_OUT_OF_INDEXES) + #define ThreadVarGet(var) TlsGetValue(var) + #define ThreadVarSet(var, value) TlsSetValue(var, value) + #define ThreadVarFree(var) TlsFree(var) + + #define ThreadSpawn(thr, cb, arg) (thr = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)(cb), (arg), 0, NULL)) + #define ThreadJoin(thr) WaitForSingleObject(thr, INFINITE) + #define ThreadSleep(ms) Sleep(ms) + + typedef HANDLE Mutex; + #define MutexCreate(mut) (mut = CreateMutex(NULL, FALSE, NULL)) + #define MutexLock(mut) RAssert(WaitForSingleObject(mut, INFINITE) == WAIT_OBJECT_0) + #define MutexUnlock(mut) RAssert(ReleaseMutex(mut)) +#endif + +extern ThreadVar g_threadName; + +#endif //THREADS_HPP diff --git a/disasterserver/Io/Time.cpp b/disasterserver/Io/Time.cpp new file mode 100644 index 0000000..253ebf3 --- /dev/null +++ b/disasterserver/Io/Time.cpp @@ -0,0 +1,49 @@ +#include +#include +#include + +#include "Log.hpp" + +bool init = false; +double freq = 0; + +void time_start(TimeStamp* timer) +{ +#ifdef _WIN32 + LARGE_INTEGER li; + + if (!init) + { + if (!QueryPerformanceFrequency(&li)) + { + Err("Failed to query perfomance frequency!"); + return; + } + + freq = (double)(li.QuadPart) / 1000.0; + init = true; + } + + QueryPerformanceCounter(&li); + *timer = (li.QuadPart / freq); +#else + struct timespec _t; + clock_gettime(CLOCK_MONOTONIC, &_t); + *timer = _t.tv_sec * 1000 + _t.tv_nsec / 1e6; +#endif +} + +double time_end(TimeStamp* timer) +{ +#ifdef _WIN32 + LARGE_INTEGER li; + QueryPerformanceCounter(&li); + return (double)((li.QuadPart) / freq) - (*timer); +#else + struct timespec _t; + clock_gettime(CLOCK_MONOTONIC, &_t); + + double current = _t.tv_sec * 1000 + _t.tv_nsec / 1e6; + return current - (*timer); +#endif +} diff --git a/disasterserver/Io/Time.hpp b/disasterserver/Io/Time.hpp new file mode 100644 index 0000000..a48b347 --- /dev/null +++ b/disasterserver/Io/Time.hpp @@ -0,0 +1,15 @@ +#ifndef TIME_H +#define TIME_H +#include +#include + +#if defined(_WIN32) + #define WIN32_LEAN_AND_MEAN + #include +#endif + +typedef double TimeStamp; +void time_start (TimeStamp* timer); +double time_end (TimeStamp* timer); + +#endif \ No newline at end of file diff --git a/disasterserver/Log.cpp b/disasterserver/Log.cpp new file mode 100644 index 0000000..52d1b45 --- /dev/null +++ b/disasterserver/Log.cpp @@ -0,0 +1,159 @@ +/*#include +#include +#include +#include +#include +#include +#ifdef SYS_ANDROID + #include +#endif + +FILE* logFile = NULL; +loghook_t hook = NULL; + +void log_interr(int signum) +{ + (void)signum; + Err("Signal INTERRUPT: Exiting..."); + if (logFile) + fclose(logFile); + + logFile = NULL; + disaster_shutdown(); +} + +void log_segv(int signum) +{ + (void)signum; + + Err("Signal SEGFAULT: Exiting..."); + if (logFile) + fclose(logFile); + + logFile = NULL; + disaster_shutdown(); +} + +void log_term(int signum) +{ + (void)signum; + + Err("Signal SIGTERM: Exiting..."); + if (logFile) + fclose(logFile); + + logFile = NULL; + disaster_shutdown(); +} + +void log_abrt(int signum) +{ + (void)signum; + Err("Signal SIGABORT: Exiting..."); + if (logFile) + fclose(logFile); + + logFile = NULL; + disaster_shutdown(); +} + +void log_uninit(void) +{ + if (logFile) + fclose(logFile); + + logFile = NULL; +} + +#ifdef SYS_ANDROID + void log_android(const char* type, const char* message) + { + __android_log_print(ANDROID_LOG_ERROR, "DisasterServer", "%s", message); + } +#endif + +bool log_init(void) +{ + if (g_config.log_file) // dont do shit if we dont wanna log to file + { + // Create dir for logging + (void)mkdir("logs", 0777); + + time_t t = time(NULL); + struct tm* p = localtime(&t); + + char fname[64]; + strftime(fname, 64, "logs/%m%d%Y %H%M%S.log", p); + + logFile = fopen(fname, "w"); + RAssert(logFile); + } + + // write to file when done + signal(SIGINT, log_interr); + signal(SIGTERM, log_term); + signal(SIGABRT, log_abrt); + signal(SIGSEGV, log_segv); +#if defined(__unix) || defined(__unix__) + signal(SIGPIPE, SIG_IGN); +#endif + atexit(log_uninit); + + return true; +} + +void log_hook(loghook_t func) +{ + hook = func; +} + +void log_fmt(const char* fmt, const char* type, const char* file, int line, ...) +{ + const char* thd_name = (const char*)ThreadVarGet(g_threadName); + char filename[24]; + snprintf(filename, 24, "%s:%d", file, line); + + time_t t = time(NULL); + struct tm* p = localtime(&t); + + va_list list; + if (logFile) + { + char strtime[32]; + strftime(strtime, 32, "%m/%d/%Y %H:%M:%S", p); + fprintf(logFile, "[%s %s %s %s] ", strtime, type, thd_name != NULL ? thd_name : "unknown", filename); + + va_start(list, line); + vfprintf(logFile, fmt, list); + va_end(list); + + fputs("\n", logFile); + fflush(logFile); + } + + if (hook) + { + char fmt_log[512]; + va_start(list, line); + vsnprintf(fmt_log, 512, fmt, list); + va_end(list); + + char log[1024]; + snprintf(log, 1024, "[%s]: %s", filename, fmt_log); + + hook(type, log); + return; + } + + printf("[%s %s %s] ", type, thd_name != NULL ? thd_name : "unknown", filename); + + va_start(list, line); + vprintf(fmt, list); + va_end(list); + + puts(""); +}*/ + +#include "Log.hpp" + + diff --git a/disasterserver/Log.hpp b/disasterserver/Log.hpp new file mode 100644 index 0000000..b3ba9c8 --- /dev/null +++ b/disasterserver/Log.hpp @@ -0,0 +1,167 @@ +#ifndef LOG_HPP +#define LOG_HPP +/* +#ifndef LOG_H +#define LOG_H + +#include +#include +#include +#include +#include +#include +#include +#include + +#if defined(__unix) || defined(__unix__) + #define __FILENAME__ (strrchr(__FILE__, '/') ? strrchr(__FILE__, '/') + 1 : __FILE__) +#else + #define __FILENAME__ (strrchr(__FILE__, '\\') ? strrchr(__FILE__, '\\') + 1 : __FILE__) +#endif + +#ifdef SYS_USE_SDL2 + #define DEBUG_TYPE "DBG " + #define INFO_TYPE "INF " + #define WARN_TYPE "WRN " + #define ERROR_TYPE "ERR " + + #define LOG_GRN CLRCODE_GRN + #define LOG_GRA CLRCODE_GRA + #define LOG_RED CLRCODE_RED + #define LOG_BLU CLRCODE_BLU + #define LOG_YLW CLRCODE_YLW + #define LOG_PUR CLRCODE_PUR + #define LOG_RST CLRCODE_RST +#else + #define DEBUG_TYPE "\x1B[36mDBG \x1B[0m" + #define INFO_TYPE "\x1B[32mINF \x1B[0m" + #define WARN_TYPE "\x1B[33mWRN \x1B[0m" + #define ERROR_TYPE "\x1B[31mERR \x1B[0m" + + #define LOG_GRN + #define LOG_GRA + #define LOG_RED + #define LOG_BLU + #define LOG_YLW + #define LOG_PUR + #define LOG_RST +#endif + +#define Log(type, fmt, ...) log_fmt(fmt, type, __FILENAME__, __LINE__, ##__VA_ARGS__) +#define Debug(fmt, ...) if(g_config.log_debug) log_fmt(fmt, DEBUG_TYPE, __FILENAME__, __LINE__, ##__VA_ARGS__) +#define Info(fmt, ...) log_fmt(fmt, INFO_TYPE, __FILENAME__, __LINE__, ##__VA_ARGS__) +#define Warn(fmt, ...) log_fmt(fmt, WARN_TYPE, __FILENAME__, __LINE__, ##__VA_ARGS__) +#define Err(fmt, ...) log_fmt(fmt, ERROR_TYPE, __FILENAME__, __LINE__, ##__VA_ARGS__) +#define RAssert(x) if (!(x)) { Err("RAssert(" #x ") failed!"); return false; } +#define BoolStringify(bool) (bool ? "true" : "false") + +typedef void (*loghook_t)(const char* type, const char* message); + +bool log_init (void); +SERVER_API void log_hook (loghook_t func); +SERVER_API void log_fmt (const char* fmt, const char* type, const char* file, int line, ...); + +#ifdef SYS_ANDROID +void log_android(const char* type, const char* message); +#endif + +#endif +*/ + +#include +#include + + +#ifdef SYS_USE_SDL2 + #define DEBUG_TYPE "DBG " + #define INFO_TYPE "INF " + #define WARN_TYPE "WRN " + #define ERROR_TYPE "ERR " + + #define LOG_GRN CLRCODE_GRN + #define LOG_GRA CLRCODE_GRA + #define LOG_RED CLRCODE_RED + #define LOG_BLU CLRCODE_BLU + #define LOG_YLW CLRCODE_YLW + #define LOG_PUR CLRCODE_PUR + #define LOG_RST CLRCODE_RST +#else + #define DEBUG_TYPE "\x1B[36mDBG\x1B[0m" + #define INFO_TYPE "\x1B[32mINF\x1B[0m" + #define WARN_TYPE "\x1B[33mWRN\x1B[0m" + #define ERROR_TYPE "\x1B[31mERR\x1B[0m" + + #define LOG_GRN + #define LOG_GRA + #define LOG_RED + #define LOG_BLU + #define LOG_YLW + #define LOG_PUR + #define LOG_RST +#endif + +enum class LogLevel { + Debug, Info, Warning, Error +}; + +class Logger { + static void write(const LogLevel &level, const std::string &file, int line, const std::string &msg) { + using namespace std::chrono; + + std::stringstream ss; + + const time_t time = std::time(nullptr); + ss << std::put_time(std::localtime(&time), "%d.%m.%Y %T"); + ss << " "; + switch (level) { + case LogLevel::Debug: ss << DEBUG_TYPE; break; + case LogLevel::Info: ss << INFO_TYPE; break; + case LogLevel::Warning: ss << WARN_TYPE; break; + case LogLevel::Error: ss << ERROR_TYPE; break; + } + ss << " "; + ss << std::format("({}:{})", file, line); + ss << " "; + ss << msg; + std::cout << ss.str() << std::endl; + } +public: + template + static void PrintLog(LogLevel level, const std::string &file, const int line, std::string_view fmt, Types&&... args) { + write(level, file, line, std::vformat(fmt, std::make_format_args(args...))); + } + + template + static void Debug(const std::string &file, const int line, std::string_view fmt, Types&&... args) { +#ifdef _DEBUG + PrintLog(LogLevel::Debug, file, line, fmt, std::forward(args)...); +#endif + } + + template + static void Info(const std::string &file, const int line, std::string_view fmt, Types&&... args) { + PrintLog(LogLevel::Info, file, line, fmt, std::forward(args)...); + } + + template + static void Warning(const std::string &file, const int line, std::string_view fmt, Types&&... args) { + PrintLog(LogLevel::Warning, file, line, fmt, std::forward(args)...); + } + + template + static void Error(const std::string &file, const int line, std::string_view fmt, Types&&... args) { + PrintLog(LogLevel::Error, file, line, fmt, std::forward(args)...); + } +}; + +#define Log(type, fmt, ...) Logger::PrintLog(type, __FILE__, __LINE__, fmt, ##__VA_ARGS__) + +#define Debug(fmt, ...) Logger::Debug(__FILE__, __LINE__, fmt, ##__VA_ARGS__) +#define Info(fmt, ...) Logger::Info(__FILE__, __LINE__, fmt, ##__VA_ARGS__) +#define Warn(fmt, ...) Logger::Warning(__FILE__, __LINE__, fmt, ##__VA_ARGS__) +#define Err(fmt, ...) Logger::Error(__FILE__, __LINE__, fmt, ##__VA_ARGS__) + +#define RAssert(x) if (!(x)) { Err("RAssert({}) failed!", #x); return false; } +#define BoolStringify(bool) (bool ? "true" : "false") + +#endif //LOG_HPP diff --git a/disasterserver/Main.cpp b/disasterserver/Main.cpp new file mode 100644 index 0000000..bd75430 --- /dev/null +++ b/disasterserver/Main.cpp @@ -0,0 +1,17 @@ +#include "DisasterServer.hpp" +#include "Log.hpp" +#include "enet/enet.h" + +int main(int argc, char *argv[]) { + try { + DisasterServer server; + if (!server.init()) { + return 1; + } + + return server.run(); + + } catch (std::exception& e) { + Err(e.what()); + } +} diff --git a/disasterserver_c/CMakeLists.txt b/disasterserver_c/CMakeLists.txt index 78cdb34..b171cbb 100644 --- a/disasterserver_c/CMakeLists.txt +++ b/disasterserver_c/CMakeLists.txt @@ -1,30 +1,4 @@ -# Needed for packet stuff -include(TestBigEndian) -TEST_BIG_ENDIAN(IS_BIG_ENDIAN) - -if(IS_BIG_ENDIAN) - add_compile_definitions(SYS_BIG_ENDIAN) -endif() - -if(DYLIB) - add_compile_definitions(SYS_DYLIB) -endif() - -if(BUILD_UI) - add_compile_definitions(SYS_USE_SDL2) -endif() - -if(ANDROID) - add_compile_definitions(SYS_ANDROID) -endif() - -if((CMAKE_C_COMPILER_ID STREQUAL "Clang" OR CMAKE_C_COMPILER_ID STREQUAL "GNU")) - set(CMAKE_C_FLAGS_DEBUG "-g") - set(CMAKE_C_FLAGS_RELEASE "-O3") - message("Clang/GCC flags applied") -endif() - -set(SOURCES +set(SOURCES "Auth.c" "Config.c" "cJSON.c" From 44b6e6011fafa8bf26fd06015535ffaedb0d0475 Mon Sep 17 00:00:00 2001 From: MilesGlitch Date: Mon, 31 Aug 2026 22:36:38 +0300 Subject: [PATCH 05/61] =?UTF-8?q?=D0=BD=D0=B5=20=D1=80=D0=B0=D0=B1=D0=BE?= =?UTF-8?q?=D1=87=D0=B8=D1=8F=20=D1=84=D0=B8=D0=B3=D0=BD=D1=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CMakeLists.txt | 1 + disasterserver/CMakeLists.txt | 20 +- disasterserver/ConfigManager.cpp | 131 + disasterserver/ConfigManager.hpp | 52 + disasterserver/DisasterServer.cpp | 43 +- disasterserver/DisasterServer.hpp | 32 +- disasterserver/Io/Packet.cpp | 20 +- disasterserver/Io/Packet.hpp | 18 +- disasterserver/Io/Threads.hpp | 3 + disasterserver/Log.hpp | 82 +- disasterserver/Main.cpp | 10 +- disasterserver/Player.cpp | 1 + disasterserver/Player.hpp | 75 + disasterserver/Server.cpp | 132 + disasterserver/Server.hpp | 113 + disasterserver/Singleton.hpp | 25 + disasterserver/Util/Math.cpp | 23 + disasterserver/Util/Math.hpp | 20 + disasterserver/Util/String.hpp | 12 + disasterserver/{Io => Util}/Time.cpp | 2 +- disasterserver/{Io => Util}/Time.hpp | 12 +- disasterserver_c/CMakeLists.txt | 2 +- disasterserver_c/{states => }/Server.c | 0 thirdparty/cjson/CMakeLists.txt | 8 + thirdparty/cjson/cJSON.c | 3191 ++++++++++++++++++++++++ thirdparty/cjson/cJSON.h | 308 +++ thirdparty/cjson/cJSON_Utils.c | 1481 +++++++++++ thirdparty/cjson/cJSON_Utils.h | 88 + 28 files changed, 5789 insertions(+), 116 deletions(-) create mode 100644 disasterserver/ConfigManager.cpp create mode 100644 disasterserver/ConfigManager.hpp create mode 100644 disasterserver/Player.cpp create mode 100644 disasterserver/Player.hpp create mode 100644 disasterserver/Server.cpp create mode 100644 disasterserver/Server.hpp create mode 100644 disasterserver/Singleton.hpp create mode 100644 disasterserver/Util/Math.cpp create mode 100644 disasterserver/Util/Math.hpp create mode 100644 disasterserver/Util/String.hpp rename disasterserver/{Io => Util}/Time.cpp (97%) rename disasterserver/{Io => Util}/Time.hpp (53%) rename disasterserver_c/{states => }/Server.c (100%) create mode 100644 thirdparty/cjson/CMakeLists.txt create mode 100644 thirdparty/cjson/cJSON.c create mode 100644 thirdparty/cjson/cJSON.h create mode 100644 thirdparty/cjson/cJSON_Utils.c create mode 100644 thirdparty/cjson/cJSON_Utils.h diff --git a/CMakeLists.txt b/CMakeLists.txt index 96f6381..505e761 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -74,6 +74,7 @@ if (BUILD_UI) endif () add_subdirectory(thirdparty/enet) +add_subdirectory(thirdparty/cjson) add_subdirectory(disasterserver_c/) add_subdirectory(disasterserver) \ No newline at end of file diff --git a/disasterserver/CMakeLists.txt b/disasterserver/CMakeLists.txt index d5f52ae..e2c59bb 100644 --- a/disasterserver/CMakeLists.txt +++ b/disasterserver/CMakeLists.txt @@ -1,12 +1,4 @@ - -set(SOURCES - "Io/Packet.cpp" - "Io/TcpListener.cpp" - "Io/Time.cpp" - "Io/UdpListener.cpp" - "Log.cpp" - "DisasterServer.cpp" -) +file(GLOB_RECURSE SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/*.cpp) if(ANDROID) add_library(DisasterServerCXX SHARED "Android.cpp" ${SOURCES}) @@ -14,17 +6,17 @@ if(ANDROID) set(THREADS_PREFER_PTHREAD_FLAG ON) find_package(Threads REQUIRED) target_include_directories(DisasterServerCXX PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}) - target_link_libraries(DisasterServerCXX PRIVATE log enet m Threads::Threads) + target_link_libraries(DisasterServerCXX PRIVATE cJSON log enet m Threads::Threads) else() if(DYLIB) # Build .dll or .so add_library(DisasterServerCXX SHARED ${SOURCES}) if (WIN32) - target_link_libraries(DisasterServerCXX PRIVATE enet ws2_32 winmm dbghelp) + target_link_libraries(DisasterServerCXX PRIVATE cJSON enet ws2_32 winmm dbghelp) else() # UNIX set(THREADS_PREFER_PTHREAD_FLAG ON) find_package(Threads REQUIRED) - target_link_libraries(DisasterServerCXX PRIVATE enet m Threads::Threads) + target_link_libraries(DisasterServerCXX PRIVATE cJSON enet m Threads::Threads) endif() target_include_directories(DisasterServerCXX PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}) @@ -87,11 +79,11 @@ else() ) if (WIN32) - target_link_libraries(DisasterServerCXX PRIVATE enet ws2_32 winmm dbghelp) + target_link_libraries(DisasterServerCXX PRIVATE cJSON enet ws2_32 winmm dbghelp) else() # UNIX set(THREADS_PREFER_PTHREAD_FLAG ON) find_package(Threads REQUIRED) - target_link_libraries(DisasterServerCXX PRIVATE enet m Threads::Threads) + target_link_libraries(DisasterServerCXX PRIVATE cJSON enet m Threads::Threads) endif() target_include_directories(DisasterServerCXX PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}) diff --git a/disasterserver/ConfigManager.cpp b/disasterserver/ConfigManager.cpp new file mode 100644 index 0000000..8255281 --- /dev/null +++ b/disasterserver/ConfigManager.cpp @@ -0,0 +1,131 @@ +#include "ConfigManager.hpp" + +#include + +#include "Log.hpp" + +ConfigManager::ConfigManager() = default; + +ConfigManager::~ConfigManager() = default; + +bool ConfigManager::loadConfig() { + FilePtr file; + fopen_s(&file, "config.txt", "r"); + + if (!file) { + RAssert(saveConfig()); + + fopen_s(&file, CONFIG_FILE, "r"); + if (!file) { + Warn("Failed to save default config file properly!"); + } + } + + char buffer[0x800] = {}; + size_t len = fread(buffer, 1, 0x800, file); + fclose(file); + + cJSON* rootObject = cJSON_ParseWithLength(buffer, len); + if (!rootObject) { + Err("Failed to parse {}: {}", CONFIG_FILE, cJSON_GetErrorPtr()); + return false; + } + + Debug("{} loaded.", CONFIG_FILE); + + cJSON *networkObject = cJSON_GetObjectItemCaseSensitive(rootObject, "network"); + if (cJSON_IsObject(networkObject) && !cJSON_IsNull(networkObject)) { + cJSON *port = cJSON_GetObjectItem(networkObject, "port"); + cJSON *server_count = cJSON_GetObjectItem(networkObject, "server_count"); + + config.networking.port = port->valueint; + config.networking.server_count = server_count->valueint; + } + + cJSON *paringObject = cJSON_GetObjectItemCaseSensitive(rootObject, "network"); + if (cJSON_IsObject(paringObject) && !cJSON_IsNull(paringObject)) { + cJSON *ping_limit = cJSON_GetObjectItem(paringObject, "ping_limit"); + + cJSON_SetNumberValue(ping_limit, config.pairing.ping_limit); + } + + cJSON *loggerObject = cJSON_GetObjectItemCaseSensitive(rootObject, "logger"); + if (cJSON_IsObject(loggerObject) && !cJSON_IsNull(loggerObject)) { + cJSON *log_file = cJSON_GetObjectItem(loggerObject, "log_file"); + + cJSON_SetNumberValue(log_file, config.logger.log_file); + } + + cJSON *gameplayObject = cJSON_GetObjectItemCaseSensitive(rootObject, "gameplay"); + if (cJSON_IsObject(gameplayObject) && !cJSON_IsNull(gameplayObject)) { + cJSON *anticheat = cJSON_GetObjectItem(gameplayObject, "anticheat"); + + cJSON_SetNumberValue(anticheat, config.gameplay.anticheat); + } + + cJSON_Delete(rootObject); + + if (!config.gameplay.anticheat) { + Info(LOG_YLW "Anticheat is disabled, client modifications are allowed."); + } + + return true; +} + +bool ConfigManager::saveConfig() { + cJSON *rootObject = cJSON_CreateObject(); + RAssert(rootObject); + + cJSON *networkObject = cJSON_CreateObject(); + { + cJSON *port = cJSON_CreateNumber(config.networking.port); + cJSON *server_count = cJSON_CreateNumber(config.networking.server_count); + + cJSON_AddItemToObject(networkObject, "port", port); + cJSON_AddItemToObject(networkObject, "server_count", server_count); + } + cJSON_AddItemToObject(rootObject, "networking", networkObject); + + cJSON *paringObject = cJSON_CreateObject(); + { + cJSON *ping_limit = cJSON_CreateNumber(config.pairing.ping_limit); + + cJSON_AddItemToObject(paringObject, "ping_limit", ping_limit); + } + cJSON_AddItemToObject(rootObject, "paring", paringObject); + + cJSON *loggerObject = cJSON_CreateObject(); + { + cJSON *log_file = cJSON_CreateBool(config.logger.log_file); + + cJSON_AddItemToObject(loggerObject, "log_file", log_file); + } + cJSON_AddItemToObject(rootObject, "logger", loggerObject); + + cJSON *gameplayObject = cJSON_CreateObject(); + { + cJSON *anticheat = cJSON_CreateBool(config.gameplay.anticheat); + + cJSON_AddItemToObject(gameplayObject, "anticheat", anticheat); + } + cJSON_AddItemToObject(rootObject, "gameplay", gameplayObject); + + snprintf(config.motd, 0x100, "%s", cJSON_GetStringValue(cJSON_GetObjectItemCaseSensitive(rootObject, "motd"))); + + FilePtr file; + fopen_s(&file,CONFIG_FILE, "w"); + RAssert(file); + + char *json = cJSON_Print(rootObject); + fprintf(file, "%s", json); + fclose(file); + + cJSON_free(json); + cJSON_Delete(rootObject); + + return true; +} + +ConfigManager::MainObject ConfigManager::getConfig() { + return config; +} diff --git a/disasterserver/ConfigManager.hpp b/disasterserver/ConfigManager.hpp new file mode 100644 index 0000000..5a89909 --- /dev/null +++ b/disasterserver/ConfigManager.hpp @@ -0,0 +1,52 @@ +#ifndef CONFIG_HPP +#define CONFIG_HPP + +#include +#include + +using FilePtr = FILE*; + +#define CONFIG_FILE "Config.json" + +class ConfigManager { + struct NetworkObject { + int32_t port = 8606; + int32_t server_count = 1; + }; + + struct PairingObject { + int32_t ping_limit = 250; + }; + + struct LoggerObject { + bool log_file = false; + }; + + struct GameplayObject { + bool anticheat = true; + bool map_list[20] = { true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true }; + Mutex map_list_lock; + }; + + struct MainObject { + NetworkObject networking = {}; + PairingObject pairing = {}; + LoggerObject logger = {}; + GameplayObject gameplay = {}; + bool charFix = true; + char motd[0x100] = ""; + }; + + MainObject config = {}; +public: + ConfigManager(); + ~ConfigManager(); + + bool loadConfig(); + bool saveConfig(); + + MainObject getConfig(); +}; + + +#endif //CONFIG_HPP diff --git a/disasterserver/DisasterServer.cpp b/disasterserver/DisasterServer.cpp index 2273958..987ddc6 100644 --- a/disasterserver/DisasterServer.cpp +++ b/disasterserver/DisasterServer.cpp @@ -1,13 +1,52 @@ #include "DisasterServer.hpp" -DisasterServer::DisasterServer() = default; +#include + +#include "Log.hpp" +#include "Io/Threads.hpp" +#include "Server.hpp" + + +DisasterServer::DisasterServer() : configManager({}) { + +} DisasterServer::~DisasterServer() = default; bool DisasterServer::init() { + if (running) + return true; + + RAssert(enet_initialize() == 0); + +#ifdef SYS_ANDROID + //log_hook(log_android); +#endif + + Info("- DisasterServer v{}", STRINGIFY(BUILD_VERSION)); // LOG_RED "Better" LOG_BLU "Server " LOG_RST "v" STRINGIFY(BUILD_VERSION) + Info("- Build from {} {}", __DATE__, __TIME__); // "Build from " LOG_PUR __DATE__ " " LOG_GRN __TIME__ + + RAssert(configManager.loadConfig()); + return true; } int DisasterServer::run() { - return 1; + if (running) + return true; + + running = true; + Debug("Entering main loop..."); + + for (int i = 0; i < configManager.getConfig().networking.server_count; i++) { + serversMutex.lock(); + std::jthread thread([&] { + auto server = std::make_shared(configManager.getConfig().networking.port,i); + this->servers.push_back(std::move(server)); + server->worker(); + }); + serversMutex.unlock(); + } + + return true; } diff --git a/disasterserver/DisasterServer.hpp b/disasterserver/DisasterServer.hpp index c5ef97b..53b5c3f 100644 --- a/disasterserver/DisasterServer.hpp +++ b/disasterserver/DisasterServer.hpp @@ -1,15 +1,41 @@ #ifndef DISASTERSERVER_HPP #define DISASTERSERVER_HPP +#include +#include +#include -class DisasterServer { +#include "ConfigManager.hpp" +#include "Singleton.hpp" +#include "enet/enet.h" +#include "Io/Packet.hpp" +#include "Io/Threads.hpp" + +#define TICKSPERSEC 60 +#define BUILD_VERSION 1101 + +#define STR_HELPER(x) #x +#define STRINGIFY(x) STR_HELPER(x) + + + + +class Server; + +class DisasterServer : public Singleton { + friend class Singleton; + ConfigManager configManager; + + bool running = false; + std::vector> servers; + std::mutex serversMutex; public: + DisasterServer(); - ~DisasterServer(); + ~DisasterServer() override; bool init(); int run(); }; - #endif //DISASTERSERVER_HPP diff --git a/disasterserver/Io/Packet.cpp b/disasterserver/Io/Packet.cpp index 211a8e0..388289d 100644 --- a/disasterserver/Io/Packet.cpp +++ b/disasterserver/Io/Packet.cpp @@ -1,5 +1,5 @@ #include "Packet.hpp" - +#include "Server.hpp" #include "Log.hpp" #ifdef __GNUC__ // GCC, clang... @@ -12,6 +12,14 @@ #define BYTESWAP_64(x) _byteswap_uint64((x)) #endif +Packet::Packet() { +} + +Packet::Packet(PacketType type) { + write8(0); + write8(static_cast(type)); +} + Packet::Packet(ENetPacket *packet) { memcpy(buffer, packet->data, (uint8_t)packet->dataLength); enet_packet_destroy(packet); @@ -231,3 +239,13 @@ bool Packet::writeStr(String value) { return true; } + +bool Packet::send(ENetPeer *peer, bool reliable) { + PeerData* data = static_cast(peer->data); + if(data && data->disconnecting) + return true; + + pos = 0; + ENetPacket* pack = enet_packet_create(this, len, reliable ? ENET_PACKET_FLAG_RELIABLE : 0); + return enet_peer_send(peer, reliable ? 0 : 1, pack) == 0; +} diff --git a/disasterserver/Io/Packet.hpp b/disasterserver/Io/Packet.hpp index acdaa1a..b82ee7b 100644 --- a/disasterserver/Io/Packet.hpp +++ b/disasterserver/Io/Packet.hpp @@ -2,11 +2,12 @@ #define PACKET_H #include -#include +#include +#include "Util/String.hpp" #define PACKET_MAXSIZE 256 -enum PacketType +enum class PacketType { IDENTITY, SERVER_IDENTITY_RESPONSE, @@ -168,19 +169,14 @@ enum PacketType CLIENT_PLAYER_POTATER }; -typedef struct -{ - char value[250]; - uint16_t len; -} String; - class Packet { uint8_t buffer[PACKET_MAXSIZE] = {}; uint8_t pos = 0; - uint8_t len = {}; + uint8_t len = 0; public: - Packet() = default; + Packet(); + explicit Packet(PacketType type); explicit Packet(ENetPacket* packet); ~Packet() = default; @@ -201,6 +197,8 @@ class Packet { bool writeFloat(float value); bool writeDouble(double value); bool writeStr(String value); + + bool send(ENetPeer* peer, bool reliable); }; #endif diff --git a/disasterserver/Io/Threads.hpp b/disasterserver/Io/Threads.hpp index 4e7520b..8dcd819 100644 --- a/disasterserver/Io/Threads.hpp +++ b/disasterserver/Io/Threads.hpp @@ -31,6 +31,9 @@ #define WIN32_LEAN_AND_MEAN #include + #include + using namespace std::string_literals; + typedef HANDLE Thread; typedef DWORD ThreadVar; diff --git a/disasterserver/Log.hpp b/disasterserver/Log.hpp index b3ba9c8..6196922 100644 --- a/disasterserver/Log.hpp +++ b/disasterserver/Log.hpp @@ -1,78 +1,11 @@ #ifndef LOG_HPP #define LOG_HPP -/* -#ifndef LOG_H -#define LOG_H - -#include -#include -#include -#include -#include -#include -#include -#include - -#if defined(__unix) || defined(__unix__) - #define __FILENAME__ (strrchr(__FILE__, '/') ? strrchr(__FILE__, '/') + 1 : __FILE__) -#else - #define __FILENAME__ (strrchr(__FILE__, '\\') ? strrchr(__FILE__, '\\') + 1 : __FILE__) -#endif - -#ifdef SYS_USE_SDL2 - #define DEBUG_TYPE "DBG " - #define INFO_TYPE "INF " - #define WARN_TYPE "WRN " - #define ERROR_TYPE "ERR " - - #define LOG_GRN CLRCODE_GRN - #define LOG_GRA CLRCODE_GRA - #define LOG_RED CLRCODE_RED - #define LOG_BLU CLRCODE_BLU - #define LOG_YLW CLRCODE_YLW - #define LOG_PUR CLRCODE_PUR - #define LOG_RST CLRCODE_RST -#else - #define DEBUG_TYPE "\x1B[36mDBG \x1B[0m" - #define INFO_TYPE "\x1B[32mINF \x1B[0m" - #define WARN_TYPE "\x1B[33mWRN \x1B[0m" - #define ERROR_TYPE "\x1B[31mERR \x1B[0m" - - #define LOG_GRN - #define LOG_GRA - #define LOG_RED - #define LOG_BLU - #define LOG_YLW - #define LOG_PUR - #define LOG_RST -#endif - -#define Log(type, fmt, ...) log_fmt(fmt, type, __FILENAME__, __LINE__, ##__VA_ARGS__) -#define Debug(fmt, ...) if(g_config.log_debug) log_fmt(fmt, DEBUG_TYPE, __FILENAME__, __LINE__, ##__VA_ARGS__) -#define Info(fmt, ...) log_fmt(fmt, INFO_TYPE, __FILENAME__, __LINE__, ##__VA_ARGS__) -#define Warn(fmt, ...) log_fmt(fmt, WARN_TYPE, __FILENAME__, __LINE__, ##__VA_ARGS__) -#define Err(fmt, ...) log_fmt(fmt, ERROR_TYPE, __FILENAME__, __LINE__, ##__VA_ARGS__) -#define RAssert(x) if (!(x)) { Err("RAssert(" #x ") failed!"); return false; } -#define BoolStringify(bool) (bool ? "true" : "false") - -typedef void (*loghook_t)(const char* type, const char* message); - -bool log_init (void); -SERVER_API void log_hook (loghook_t func); -SERVER_API void log_fmt (const char* fmt, const char* type, const char* file, int line, ...); - -#ifdef SYS_ANDROID -void log_android(const char* type, const char* message); -#endif - -#endif -*/ #include #include +#include - -#ifdef SYS_USE_SDL2 +#ifdef true //SYS_USE_SDL2 #define DEBUG_TYPE "DBG " #define INFO_TYPE "INF " #define WARN_TYPE "WRN " @@ -114,12 +47,14 @@ class Logger { ss << std::put_time(std::localtime(&time), "%d.%m.%Y %T"); ss << " "; switch (level) { - case LogLevel::Debug: ss << DEBUG_TYPE; break; - case LogLevel::Info: ss << INFO_TYPE; break; - case LogLevel::Warning: ss << WARN_TYPE; break; - case LogLevel::Error: ss << ERROR_TYPE; break; + case LogLevel::Debug: ss << "[Debug]"; break; + case LogLevel::Info: ss << "[Info]"; break; + case LogLevel::Warning: ss << "[Warn]"; break; + case LogLevel::Error: ss << "[Error]"; break; } ss << " "; + ss << "["<< std::this_thread::get_id() << "] "; + ss << " "; ss << std::format("({}:{})", file, line); ss << " "; ss << msg; @@ -162,6 +97,7 @@ class Logger { #define Err(fmt, ...) Logger::Error(__FILE__, __LINE__, fmt, ##__VA_ARGS__) #define RAssert(x) if (!(x)) { Err("RAssert({}) failed!", #x); return false; } +#define RAssertEx(x) if (!(x)) { Err("RAssert({}) failed!", #x); } #define BoolStringify(bool) (bool ? "true" : "false") #endif //LOG_HPP diff --git a/disasterserver/Main.cpp b/disasterserver/Main.cpp index bd75430..85421a9 100644 --- a/disasterserver/Main.cpp +++ b/disasterserver/Main.cpp @@ -1,17 +1,15 @@ #include "DisasterServer.hpp" #include "Log.hpp" -#include "enet/enet.h" int main(int argc, char *argv[]) { try { - DisasterServer server; - if (!server.init()) { + DisasterServer *server = DisasterServer::getInstance(); + if (!server->init()) { return 1; } - return server.run(); - + return server->run(); } catch (std::exception& e) { - Err(e.what()); + Err("Exception: {}", e.what()); } } diff --git a/disasterserver/Player.cpp b/disasterserver/Player.cpp new file mode 100644 index 0000000..9e7a7e3 --- /dev/null +++ b/disasterserver/Player.cpp @@ -0,0 +1 @@ +#include "Player.hpp" diff --git a/disasterserver/Player.hpp b/disasterserver/Player.hpp new file mode 100644 index 0000000..05d8e52 --- /dev/null +++ b/disasterserver/Player.hpp @@ -0,0 +1,75 @@ +#ifndef DISASTERSERVER_PLAYER_HPP +#define DISASTERSERVER_PLAYER_HPP + +#include +#include "Util/Math.hpp" +#include "Util/Time.hpp" + +typedef enum +{ + PLAYER_NONE = 0, + PLAYER_ESCAPED = 0x1 << 0, + PLAYER_DEAD = 0x1 << 1, + PLAYER_DEMONIZED = 0x1 << 2, + PLAYER_REVIVED = 0x1 << 3, + PLAYER_CANTREVIVE = 0x1 << 4, + PLAYER_LEFT = 0x1 << 5, + PLAYER_KILLER = 0x1 << 6 +} PlayerFlags; + +typedef struct +{ + uint8_t ready; + uint16_t seq; + uint16_t errors; /* Used as tracker for errors like lag/etc */ + uint8_t ex_teleport; + double timeout; + + uint8_t mod_tool; + uint32_t mod_tool_timer; + uint32_t chunk; + TimeStamp last_packet; + + /* Attack */ + bool is_attacking; + double attack_timer; + TimeStamp last_attack; + + uint16_t ping_last; + double ping_total; + double ping_timer; + uint16_t rings; + TimeStamp last_rings; + uint16_t heal_rings; + + uint8_t state; + PlayerFlags flags; + uint8_t death_timer_sec; + double death_timer; + double revival; + int32_t revival_init[5]; + + uintptr_t data[4]; /* Can be used as pointer/data field */ + Vector2 start_pos; + Vector2 pos; + + struct + { + double survive_time; + double danger_time; + double camp_time; + + double braindead_time; + bool brain_damage; + + uint16_t stun_time; + uint16_t stuns; + uint16_t hp_restored; + uint16_t rings; + uint16_t damage; + uint16_t damage_taken; + uint16_t kills; + } stats; +} Player; + +#endif //DISASTERSERVER_PLAYER_HPP diff --git a/disasterserver/Server.cpp b/disasterserver/Server.cpp new file mode 100644 index 0000000..e6503b1 --- /dev/null +++ b/disasterserver/Server.cpp @@ -0,0 +1,132 @@ +#include "Server.hpp" + +#include "Log.hpp" + +Server::Server(uint16_t basePort, uint16_t id) : id(id) { + for (int i = 0; i < 20; i++) { + map_pickrates[i] = 255; + } + + ENetAddress addr; + addr.host = ENET_HOST_ANY; + addr.port = basePort + id; + host = enet_host_create(&addr, 50, 2, 0, 0); + + Info("Listening on port {:d}.", basePort + id); + + RAssertEx(host != nullptr); +} + +Server::~Server() = default; + +void Server::worker() { + srand (time(nullptr)); + + TimeStamp ticker; + time_start(&ticker); + + double next_tick = time_end(&ticker); + double heartbeat = 0.0; + const double TARGET_FPS = 1000.0 / 60; + + Packet packet(PacketType::SERVER_HEARTBEAT); + while (running) { + ENetEvent ev; + if (enet_host_service(host, &ev, 5) > 0) { + switch (ev.type) { + case ENET_EVENT_TYPE_CONNECT: { + Debug("ENET_EVENT_TYPE_CONNECT..."); + ev.peer->data = static_cast(malloc(sizeof(PeerData))); + if (!ev.peer->data) + return; + + memset(ev.peer->data, 0, sizeof(PeerData)); + + auto *v = static_cast(ev.peer->data); + v->server = this; + v->peer = ev.peer; + v->id = ev.peer->incomingPeerID + 1; + + char buffer[0x100]; + enet_address_get_host_ip(&ev.peer->address, buffer, 250); + v->ip = std::string(buffer); + + break; + } + + case ENET_EVENT_TYPE_DISCONNECT: { + Debug("ENET_EVENT_TYPE_DISCONNECT..."); + PeerData *v = (PeerData *)ev.peer->data; + if (!v) + break; + + /*if (!v->op && v->should_timeout) + { + uint64_t result; + if (timeout_check(v->udid.value, v->ip.value, &result) && result == 0) + timeout_set(v->nickname.value, v->udid.value, v->ip.value, time(NULL) + 5); + } + + if (v->verified) + { + MutexLock(ip_addr_mut); + { + cJSON_DeleteItemFromObject(ip_addr_list, v->udid.value); + cJSON_DeleteItemFromObject(ip_addr_list, v->ip.value); + } + MutexUnlock(ip_addr_mut); + + MutexLock(v->server->state_lock); + { + // Step 3: Cleanup (Only if joined before) + if (dylist_remove(&v->server->peers, v)) + server_state_left(v); + } + MutexUnlock(v->server->state_lock); + }*/ + + Info("{} (id {:d}) " LOG_YLW "left.", v->nickname.value, v->id); + free(v); + break; + } + + default: break; + } + } + + double now = time_end(&ticker); + while (next_tick < now) { + next_tick += TARGET_FPS; + mutex.lock(); + { + switch (state) { + case States::LOBBY: + case States::CHARSELECT: + case States::MAPVOTE: + break; + + case States::GAME: + break; + + case States::RESULTS: + break; + + default: break; + } + + if (peers.empty()) { + if (heartbeat >= (TICKSPERSEC * 2)) + { + Debug("Heartbeat done."); + heartbeat = 0; + } + heartbeat += delta; + } + } + mutex.unlock(); + delta = 1; + } + } + + enet_host_destroy(host); +} diff --git a/disasterserver/Server.hpp b/disasterserver/Server.hpp new file mode 100644 index 0000000..e4cc575 --- /dev/null +++ b/disasterserver/Server.hpp @@ -0,0 +1,113 @@ +#ifndef DISASTERSERVER_SERVER_HPP +#define DISASTERSERVER_SERVER_HPP + +#include "DisasterServer.hpp" +#include "Util/Time.hpp" +#include "Player.hpp" + +enum class SurvivalCharacters { + NONE = -1, + + TAILS, + KNUX, + EGGMAN, + AMY, + CREAM, + SALLY +}; + +enum class ExeCharacters { + NONE = -1, + + ORIGINAL, + CHAOS, + EXETIOR, + EXELLER +}; + +enum class States { + LOBBY, + MAPVOTE, + CHARSELECT, + GAME, + RESULTS +}; + +enum BigRingState +{ + BS_NONE, + BS_DEACTIVATED, + BS_ACTIVATED, +}; + +enum Ending +{ + ED_EXEWIN, + ED_SURVWIN, + ED_TIMEOVER +}; + +struct PeerData +{ + uint16_t id; + std::string ip; + ENetPeer *peer; + + /* General info */ + Player plr; + String nickname; + String udid; + uint8_t lobby_icon; + int8_t pet; + + bool verified; + bool in_game; + bool op; + bool ready; + bool mod_tool; + bool is_mobile; + bool can_vote; + bool voted; + bool disconnecting; + + //auth_peer_data auth; + + /* Character */ + SurvivalCharacters surv_char; + ExeCharacters exe_char; + + bool should_timeout; + + /* State info */ + uint8_t exe_chance; + double timeout; + double vote_cooldown; + + Server *server; +}; + +class Server { + uint16_t id; + bool running = true; + + States state = States::LOBBY; + std::mutex mutex; + + // States + + + int8_t last_map = -1; + int16_t map_pickrates[30] = {}; + + double delta = 0; + std::vector peers; + ENetHost *host; +public: + Server(uint16_t basePort, uint16_t id); + ~Server(); + + void worker(); +}; + + +#endif //DISASTERSERVER_SERVER_HPP diff --git a/disasterserver/Singleton.hpp b/disasterserver/Singleton.hpp new file mode 100644 index 0000000..22d17fc --- /dev/null +++ b/disasterserver/Singleton.hpp @@ -0,0 +1,25 @@ +#ifndef SINGLETON_HPP +#define SINGLETON_HPP + +// https://de.wikibooks.org/wiki/C%2B%2B-Programmierung:_Entwurfsmuster:_Singleton +template +class Singleton +{ +public: + static C* getInstance() + { + if (!_instance) + _instance = new C (); + return _instance; + } + virtual ~Singleton () { + _instance = nullptr; + } +private: + static C* _instance; +protected: + Singleton () = default; +}; +template C* Singleton ::_instance = nullptr; + +#endif //SINGLETON_HPP diff --git a/disasterserver/Util/Math.cpp b/disasterserver/Util/Math.cpp new file mode 100644 index 0000000..9136378 --- /dev/null +++ b/disasterserver/Util/Math.cpp @@ -0,0 +1,23 @@ +#include "Math.hpp" + +#include + +float lerp(float a, float b, float f) +{ + return a * (1.0f - f) + (b * f); +} + +float sign(float x) +{ + return ((x) > 0) ? 1.f : (((x) < 0) ? -1.f : 0.f); +} + +float vector2_dist(Vector2* a, Vector2* b) +{ + return sqrtf(powf(b->x - a->x, 2) + powf(b->y - a->y, 2)); +} + +Vector2 vector2_dir(Vector2* a, Vector2* b) +{ + return Vector2{ sign(a->x - b->x), sign(a->y - b->y) }; +} diff --git a/disasterserver/Util/Math.hpp b/disasterserver/Util/Math.hpp new file mode 100644 index 0000000..a9490e3 --- /dev/null +++ b/disasterserver/Util/Math.hpp @@ -0,0 +1,20 @@ +#ifndef DISASTERSERVER_VECTOR2_HPP +#define DISASTERSERVER_VECTOR2_HPP + + + +typedef struct +{ + float x; + float y; +} Vector2; + +float lerp(float a, float b, float f); +float sign(float x); + +float vector2_dist(Vector2* a, Vector2* b); +Vector2 vector2_dir(Vector2* a, Vector2* b); + + + +#endif //DISASTERSERVER_VECTOR2_HPP diff --git a/disasterserver/Util/String.hpp b/disasterserver/Util/String.hpp new file mode 100644 index 0000000..2c32e9c --- /dev/null +++ b/disasterserver/Util/String.hpp @@ -0,0 +1,12 @@ +#ifndef DISASTERSERVER_STRING_HPP +#define DISASTERSERVER_STRING_HPP + +#include + +typedef struct +{ + char value[250]; + uint16_t len; +} String; + +#endif //DISASTERSERVER_STRING_HPP diff --git a/disasterserver/Io/Time.cpp b/disasterserver/Util/Time.cpp similarity index 97% rename from disasterserver/Io/Time.cpp rename to disasterserver/Util/Time.cpp index 253ebf3..8ae5087 100644 --- a/disasterserver/Io/Time.cpp +++ b/disasterserver/Util/Time.cpp @@ -1,4 +1,4 @@ -#include +#include "Time.hpp" #include #include diff --git a/disasterserver/Io/Time.hpp b/disasterserver/Util/Time.hpp similarity index 53% rename from disasterserver/Io/Time.hpp rename to disasterserver/Util/Time.hpp index a48b347..267be7f 100644 --- a/disasterserver/Io/Time.hpp +++ b/disasterserver/Util/Time.hpp @@ -1,14 +1,16 @@ #ifndef TIME_H #define TIME_H -#include -#include + +#include +#include #if defined(_WIN32) - #define WIN32_LEAN_AND_MEAN - #include + #define WIN32_LEAN_AND_MEAN + #include #endif -typedef double TimeStamp; +using TimeStamp = double; + void time_start (TimeStamp* timer); double time_end (TimeStamp* timer); diff --git a/disasterserver_c/CMakeLists.txt b/disasterserver_c/CMakeLists.txt index b171cbb..333bb70 100644 --- a/disasterserver_c/CMakeLists.txt +++ b/disasterserver_c/CMakeLists.txt @@ -14,7 +14,7 @@ "Palette.c" "Zone.c" - "states/Server.c" + "Server.c" "states/Lobby.c" "states/Mapvote.c" "states/CharSelect.c" diff --git a/disasterserver_c/states/Server.c b/disasterserver_c/Server.c similarity index 100% rename from disasterserver_c/states/Server.c rename to disasterserver_c/Server.c diff --git a/thirdparty/cjson/CMakeLists.txt b/thirdparty/cjson/CMakeLists.txt new file mode 100644 index 0000000..ba5da3e --- /dev/null +++ b/thirdparty/cjson/CMakeLists.txt @@ -0,0 +1,8 @@ +project(cJSON LANGUAGES C) + +add_library(cJSON STATIC + ${CMAKE_CURRENT_SOURCE_DIR}/cJSON.C + ${CMAKE_CURRENT_SOURCE_DIR}/cJSON_Utils.C +) + +target_include_directories(cJSON PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}) \ No newline at end of file diff --git a/thirdparty/cjson/cJSON.c b/thirdparty/cjson/cJSON.c new file mode 100644 index 0000000..6e4fb0d --- /dev/null +++ b/thirdparty/cjson/cJSON.c @@ -0,0 +1,3191 @@ +/* + Copyright (c) 2009-2017 Dave Gamble and cJSON contributors + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + THE SOFTWARE. +*/ + +/* cJSON */ +/* JSON parser in C. */ + +/* disable warnings about old C89 functions in MSVC */ +#if !defined(_CRT_SECURE_NO_DEPRECATE) && defined(_MSC_VER) +#define _CRT_SECURE_NO_DEPRECATE +#endif + +#ifdef __GNUC__ +#pragma GCC visibility push(default) +#endif +#if defined(_MSC_VER) +#pragma warning (push) +/* disable warning about single line comments in system headers */ +#pragma warning (disable : 4001) +#endif + +#include +#include +#include +#include +#include +#include +#include + +#ifdef ENABLE_LOCALES +#include +#endif + +#if defined(_MSC_VER) +#pragma warning (pop) +#endif +#ifdef __GNUC__ +#pragma GCC visibility pop +#endif + +#include "cJSON.h" + +/* define our own boolean type */ +#ifdef true +#undef true +#endif +#define true ((cJSON_bool)1) + +#ifdef false +#undef false +#endif +#define false ((cJSON_bool)0) + +/* define isnan and isinf for ANSI C, if in C99 or above, isnan and isinf has been defined in math.h */ +#ifndef isinf +#define isinf(d) (isnan((d - d)) && !isnan(d)) +#endif +#ifndef isnan +#define isnan(d) (d != d) +#endif + +#ifndef NAN +#ifdef _WIN32 +#define NAN sqrt(-1.0) +#else +#define NAN 0.0/0.0 +#endif +#endif + +typedef struct { + const unsigned char *json; + size_t position; +} error; +static error global_error = { NULL, 0 }; + +CJSON_PUBLIC(const char *) cJSON_GetErrorPtr(void) +{ + return (const char*) (global_error.json + global_error.position); +} + +CJSON_PUBLIC(char *) cJSON_GetStringValue(const cJSON * const item) +{ + if (!cJSON_IsString(item)) + { + return NULL; + } + + return item->valuestring; +} + +CJSON_PUBLIC(double) cJSON_GetNumberValue(const cJSON * const item) +{ + if (!cJSON_IsNumber(item)) + { + return (double) NAN; + } + + return item->valuedouble; +} + +/* This is a safeguard to prevent copy-pasters from using incompatible C and header files */ +#if (CJSON_VERSION_MAJOR != 1) || (CJSON_VERSION_MINOR != 7) || (CJSON_VERSION_PATCH != 19) + #error cJSON.h and cJSON.c have different versions. Make sure that both have the same. +#endif + +CJSON_PUBLIC(const char*) cJSON_Version(void) +{ + static char version[15]; + sprintf(version, "%i.%i.%i", CJSON_VERSION_MAJOR, CJSON_VERSION_MINOR, CJSON_VERSION_PATCH); + + return version; +} + +/* Case insensitive string comparison, doesn't consider two NULL pointers equal though */ +static int case_insensitive_strcmp(const unsigned char *string1, const unsigned char *string2) +{ + if ((string1 == NULL) || (string2 == NULL)) + { + return 1; + } + + if (string1 == string2) + { + return 0; + } + + for(; tolower(*string1) == tolower(*string2); (void)string1++, string2++) + { + if (*string1 == '\0') + { + return 0; + } + } + + return tolower(*string1) - tolower(*string2); +} + +typedef struct internal_hooks +{ + void *(CJSON_CDECL *allocate)(size_t size); + void (CJSON_CDECL *deallocate)(void *pointer); + void *(CJSON_CDECL *reallocate)(void *pointer, size_t size); +} internal_hooks; + +#if defined(_MSC_VER) +/* work around MSVC error C2322: '...' address of dllimport '...' is not static */ +static void * CJSON_CDECL internal_malloc(size_t size) +{ + return malloc(size); +} +static void CJSON_CDECL internal_free(void *pointer) +{ + free(pointer); +} +static void * CJSON_CDECL internal_realloc(void *pointer, size_t size) +{ + return realloc(pointer, size); +} +#else +#define internal_malloc malloc +#define internal_free free +#define internal_realloc realloc +#endif + +/* strlen of character literals resolved at compile time */ +#define static_strlen(string_literal) (sizeof(string_literal) - sizeof("")) + +static internal_hooks global_hooks = { internal_malloc, internal_free, internal_realloc }; + +static unsigned char* cJSON_strdup(const unsigned char* string, const internal_hooks * const hooks) +{ + size_t length = 0; + unsigned char *copy = NULL; + + if (string == NULL) + { + return NULL; + } + + length = strlen((const char*)string) + sizeof(""); + copy = (unsigned char*)hooks->allocate(length); + if (copy == NULL) + { + return NULL; + } + memcpy(copy, string, length); + + return copy; +} + +CJSON_PUBLIC(void) cJSON_InitHooks(cJSON_Hooks* hooks) +{ + if (hooks == NULL) + { + /* Reset hooks */ + global_hooks.allocate = malloc; + global_hooks.deallocate = free; + global_hooks.reallocate = realloc; + return; + } + + global_hooks.allocate = malloc; + if (hooks->malloc_fn != NULL) + { + global_hooks.allocate = hooks->malloc_fn; + } + + global_hooks.deallocate = free; + if (hooks->free_fn != NULL) + { + global_hooks.deallocate = hooks->free_fn; + } + + /* use realloc only if both free and malloc are used */ + global_hooks.reallocate = NULL; + if ((global_hooks.allocate == malloc) && (global_hooks.deallocate == free)) + { + global_hooks.reallocate = realloc; + } +} + +/* Internal constructor. */ +static cJSON *cJSON_New_Item(const internal_hooks * const hooks) +{ + cJSON* node = (cJSON*)hooks->allocate(sizeof(cJSON)); + if (node) + { + memset(node, '\0', sizeof(cJSON)); + } + + return node; +} + +/* Delete a cJSON structure. */ +CJSON_PUBLIC(void) cJSON_Delete(cJSON *item) +{ + cJSON *next = NULL; + while (item != NULL) + { + next = item->next; + if (!(item->type & cJSON_IsReference) && (item->child != NULL)) + { + cJSON_Delete(item->child); + } + if (!(item->type & cJSON_IsReference) && (item->valuestring != NULL)) + { + global_hooks.deallocate(item->valuestring); + item->valuestring = NULL; + } + if (!(item->type & cJSON_StringIsConst) && (item->string != NULL)) + { + global_hooks.deallocate(item->string); + item->string = NULL; + } + global_hooks.deallocate(item); + item = next; + } +} + +/* get the decimal point character of the current locale */ +static unsigned char get_decimal_point(void) +{ +#ifdef ENABLE_LOCALES + struct lconv *lconv = localeconv(); + return (unsigned char) lconv->decimal_point[0]; +#else + return '.'; +#endif +} + +typedef struct +{ + const unsigned char *content; + size_t length; + size_t offset; + size_t depth; /* How deeply nested (in arrays/objects) is the input at the current offset. */ + internal_hooks hooks; +} parse_buffer; + +/* check if the given size is left to read in a given parse buffer (starting with 1) */ +#define can_read(buffer, size) ((buffer != NULL) && (((buffer)->offset + size) <= (buffer)->length)) +/* check if the buffer can be accessed at the given index (starting with 0) */ +#define can_access_at_index(buffer, index) ((buffer != NULL) && (((buffer)->offset + index) < (buffer)->length)) +#define cannot_access_at_index(buffer, index) (!can_access_at_index(buffer, index)) +/* get a pointer to the buffer at the position */ +#define buffer_at_offset(buffer) ((buffer)->content + (buffer)->offset) + +/* Parse the input text to generate a number, and populate the result into item. */ +static cJSON_bool parse_number(cJSON * const item, parse_buffer * const input_buffer) +{ + double number = 0; + unsigned char *after_end = NULL; + unsigned char *number_c_string; + unsigned char decimal_point = get_decimal_point(); + size_t i = 0; + size_t number_string_length = 0; + cJSON_bool has_decimal_point = false; + + if ((input_buffer == NULL) || (input_buffer->content == NULL)) + { + return false; + } + + /* copy the number into a temporary buffer and replace '.' with the decimal point + * of the current locale (for strtod) + * This also takes care of '\0' not necessarily being available for marking the end of the input */ + for (i = 0; can_access_at_index(input_buffer, i); i++) + { + switch (buffer_at_offset(input_buffer)[i]) + { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case '+': + case '-': + case 'e': + case 'E': + number_string_length++; + break; + + case '.': + number_string_length++; + has_decimal_point = true; + break; + + default: + goto loop_end; + } + } +loop_end: + /* malloc for temporary buffer, add 1 for '\0' */ + number_c_string = (unsigned char *) input_buffer->hooks.allocate(number_string_length + 1); + if (number_c_string == NULL) + { + return false; /* allocation failure */ + } + + memcpy(number_c_string, buffer_at_offset(input_buffer), number_string_length); + number_c_string[number_string_length] = '\0'; + + if (has_decimal_point) + { + for (i = 0; i < number_string_length; i++) + { + if (number_c_string[i] == '.') + { + /* replace '.' with the decimal point of the current locale (for strtod) */ + number_c_string[i] = decimal_point; + } + } + } + + number = strtod((const char*)number_c_string, (char**)&after_end); + if (number_c_string == after_end) + { + /* free the temporary buffer */ + input_buffer->hooks.deallocate(number_c_string); + return false; /* parse_error */ + } + + item->valuedouble = number; + + /* use saturation in case of overflow */ + if (number >= INT_MAX) + { + item->valueint = INT_MAX; + } + else if (number <= (double)INT_MIN) + { + item->valueint = INT_MIN; + } + else + { + item->valueint = (int)number; + } + + item->type = cJSON_Number; + + input_buffer->offset += (size_t)(after_end - number_c_string); + /* free the temporary buffer */ + input_buffer->hooks.deallocate(number_c_string); + return true; +} + +/* don't ask me, but the original cJSON_SetNumberValue returns an integer or double */ +CJSON_PUBLIC(double) cJSON_SetNumberHelper(cJSON *object, double number) +{ + if (number >= INT_MAX) + { + object->valueint = INT_MAX; + } + else if (number <= (double)INT_MIN) + { + object->valueint = INT_MIN; + } + else + { + object->valueint = (int)number; + } + + return object->valuedouble = number; +} + +/* Note: when passing a NULL valuestring, cJSON_SetValuestring treats this as an error and return NULL */ +CJSON_PUBLIC(char*) cJSON_SetValuestring(cJSON *object, const char *valuestring) +{ + char *copy = NULL; + size_t v1_len; + size_t v2_len; + /* if object's type is not cJSON_String or is cJSON_IsReference, it should not set valuestring */ + if ((object == NULL) || !(object->type & cJSON_String) || (object->type & cJSON_IsReference)) + { + return NULL; + } + /* return NULL if the object is corrupted or valuestring is NULL */ + if (object->valuestring == NULL || valuestring == NULL) + { + return NULL; + } + + v1_len = strlen(valuestring); + v2_len = strlen(object->valuestring); + + if (v1_len <= v2_len) + { + /* strcpy does not handle overlapping string: [X1, X2] [Y1, Y2] => X2 < Y1 or Y2 < X1 */ + if (!( valuestring + v1_len < object->valuestring || object->valuestring + v2_len < valuestring )) + { + return NULL; + } + strcpy(object->valuestring, valuestring); + return object->valuestring; + } + copy = (char*) cJSON_strdup((const unsigned char*)valuestring, &global_hooks); + if (copy == NULL) + { + return NULL; + } + if (object->valuestring != NULL) + { + cJSON_free(object->valuestring); + } + object->valuestring = copy; + + return copy; +} + +typedef struct +{ + unsigned char *buffer; + size_t length; + size_t offset; + size_t depth; /* current nesting depth (for formatted printing) */ + cJSON_bool noalloc; + cJSON_bool format; /* is this print a formatted print */ + internal_hooks hooks; +} printbuffer; + +/* realloc printbuffer if necessary to have at least "needed" bytes more */ +static unsigned char* ensure(printbuffer * const p, size_t needed) +{ + unsigned char *newbuffer = NULL; + size_t newsize = 0; + + if ((p == NULL) || (p->buffer == NULL)) + { + return NULL; + } + + if ((p->length > 0) && (p->offset >= p->length)) + { + /* make sure that offset is valid */ + return NULL; + } + + if (needed > INT_MAX) + { + /* sizes bigger than INT_MAX are currently not supported */ + return NULL; + } + + needed += p->offset + 1; + if (needed <= p->length) + { + return p->buffer + p->offset; + } + + if (p->noalloc) { + return NULL; + } + + /* calculate new buffer size */ + if (needed > (INT_MAX / 2)) + { + /* overflow of int, use INT_MAX if possible */ + if (needed <= INT_MAX) + { + newsize = INT_MAX; + } + else + { + return NULL; + } + } + else + { + newsize = needed * 2; + } + + if (p->hooks.reallocate != NULL) + { + /* reallocate with realloc if available */ + newbuffer = (unsigned char*)p->hooks.reallocate(p->buffer, newsize); + if (newbuffer == NULL) + { + p->hooks.deallocate(p->buffer); + p->length = 0; + p->buffer = NULL; + + return NULL; + } + } + else + { + /* otherwise reallocate manually */ + newbuffer = (unsigned char*)p->hooks.allocate(newsize); + if (!newbuffer) + { + p->hooks.deallocate(p->buffer); + p->length = 0; + p->buffer = NULL; + + return NULL; + } + + memcpy(newbuffer, p->buffer, p->offset + 1); + p->hooks.deallocate(p->buffer); + } + p->length = newsize; + p->buffer = newbuffer; + + return newbuffer + p->offset; +} + +/* calculate the new length of the string in a printbuffer and update the offset */ +static void update_offset(printbuffer * const buffer) +{ + const unsigned char *buffer_pointer = NULL; + if ((buffer == NULL) || (buffer->buffer == NULL)) + { + return; + } + buffer_pointer = buffer->buffer + buffer->offset; + + buffer->offset += strlen((const char*)buffer_pointer); +} + +/* securely comparison of floating-point variables */ +static cJSON_bool compare_double(double a, double b) +{ + double maxVal = fabs(a) > fabs(b) ? fabs(a) : fabs(b); + return (fabs(a - b) <= maxVal * DBL_EPSILON); +} + +/* Render the number nicely from the given item into a string. */ +static cJSON_bool print_number(const cJSON * const item, printbuffer * const output_buffer) +{ + unsigned char *output_pointer = NULL; + double d = item->valuedouble; + int length = 0; + size_t i = 0; + unsigned char number_buffer[26] = {0}; /* temporary buffer to print the number into */ + unsigned char decimal_point = get_decimal_point(); + double test = 0.0; + + if (output_buffer == NULL) + { + return false; + } + + /* This checks for NaN and Infinity */ + if (isnan(d) || isinf(d)) + { + length = sprintf((char*)number_buffer, "null"); + } + else if(d == (double)item->valueint) + { + length = sprintf((char*)number_buffer, "%d", item->valueint); + } + else + { + /* Try 15 decimal places of precision to avoid nonsignificant nonzero digits */ + length = sprintf((char*)number_buffer, "%1.15g", d); + + /* Check whether the original double can be recovered */ + if ((sscanf((char*)number_buffer, "%lg", &test) != 1) || !compare_double((double)test, d)) + { + /* If not, print with 17 decimal places of precision */ + length = sprintf((char*)number_buffer, "%1.17g", d); + } + } + + /* sprintf failed or buffer overrun occurred */ + if ((length < 0) || (length > (int)(sizeof(number_buffer) - 1))) + { + return false; + } + + /* reserve appropriate space in the output */ + output_pointer = ensure(output_buffer, (size_t)length + sizeof("")); + if (output_pointer == NULL) + { + return false; + } + + /* copy the printed number to the output and replace locale + * dependent decimal point with '.' */ + for (i = 0; i < ((size_t)length); i++) + { + if (number_buffer[i] == decimal_point) + { + output_pointer[i] = '.'; + continue; + } + + output_pointer[i] = number_buffer[i]; + } + output_pointer[i] = '\0'; + + output_buffer->offset += (size_t)length; + + return true; +} + +/* parse 4 digit hexadecimal number */ +static unsigned parse_hex4(const unsigned char * const input) +{ + unsigned int h = 0; + size_t i = 0; + + for (i = 0; i < 4; i++) + { + /* parse digit */ + if ((input[i] >= '0') && (input[i] <= '9')) + { + h += (unsigned int) input[i] - '0'; + } + else if ((input[i] >= 'A') && (input[i] <= 'F')) + { + h += (unsigned int) 10 + input[i] - 'A'; + } + else if ((input[i] >= 'a') && (input[i] <= 'f')) + { + h += (unsigned int) 10 + input[i] - 'a'; + } + else /* invalid */ + { + return 0; + } + + if (i < 3) + { + /* shift left to make place for the next nibble */ + h = h << 4; + } + } + + return h; +} + +/* converts a UTF-16 literal to UTF-8 + * A literal can be one or two sequences of the form \uXXXX */ +static unsigned char utf16_literal_to_utf8(const unsigned char * const input_pointer, const unsigned char * const input_end, unsigned char **output_pointer) +{ + long unsigned int codepoint = 0; + unsigned int first_code = 0; + const unsigned char *first_sequence = input_pointer; + unsigned char utf8_length = 0; + unsigned char utf8_position = 0; + unsigned char sequence_length = 0; + unsigned char first_byte_mark = 0; + + if ((input_end - first_sequence) < 6) + { + /* input ends unexpectedly */ + goto fail; + } + + /* get the first utf16 sequence */ + first_code = parse_hex4(first_sequence + 2); + + /* check that the code is valid */ + if (((first_code >= 0xDC00) && (first_code <= 0xDFFF))) + { + goto fail; + } + + /* UTF16 surrogate pair */ + if ((first_code >= 0xD800) && (first_code <= 0xDBFF)) + { + const unsigned char *second_sequence = first_sequence + 6; + unsigned int second_code = 0; + sequence_length = 12; /* \uXXXX\uXXXX */ + + if ((input_end - second_sequence) < 6) + { + /* input ends unexpectedly */ + goto fail; + } + + if ((second_sequence[0] != '\\') || (second_sequence[1] != 'u')) + { + /* missing second half of the surrogate pair */ + goto fail; + } + + /* get the second utf16 sequence */ + second_code = parse_hex4(second_sequence + 2); + /* check that the code is valid */ + if ((second_code < 0xDC00) || (second_code > 0xDFFF)) + { + /* invalid second half of the surrogate pair */ + goto fail; + } + + + /* calculate the unicode codepoint from the surrogate pair */ + codepoint = 0x10000 + (((first_code & 0x3FF) << 10) | (second_code & 0x3FF)); + } + else + { + sequence_length = 6; /* \uXXXX */ + codepoint = first_code; + } + + /* encode as UTF-8 + * takes at maximum 4 bytes to encode: + * 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx */ + if (codepoint < 0x80) + { + /* normal ascii, encoding 0xxxxxxx */ + utf8_length = 1; + } + else if (codepoint < 0x800) + { + /* two bytes, encoding 110xxxxx 10xxxxxx */ + utf8_length = 2; + first_byte_mark = 0xC0; /* 11000000 */ + } + else if (codepoint < 0x10000) + { + /* three bytes, encoding 1110xxxx 10xxxxxx 10xxxxxx */ + utf8_length = 3; + first_byte_mark = 0xE0; /* 11100000 */ + } + else if (codepoint <= 0x10FFFF) + { + /* four bytes, encoding 1110xxxx 10xxxxxx 10xxxxxx 10xxxxxx */ + utf8_length = 4; + first_byte_mark = 0xF0; /* 11110000 */ + } + else + { + /* invalid unicode codepoint */ + goto fail; + } + + /* encode as utf8 */ + for (utf8_position = (unsigned char)(utf8_length - 1); utf8_position > 0; utf8_position--) + { + /* 10xxxxxx */ + (*output_pointer)[utf8_position] = (unsigned char)((codepoint | 0x80) & 0xBF); + codepoint >>= 6; + } + /* encode first byte */ + if (utf8_length > 1) + { + (*output_pointer)[0] = (unsigned char)((codepoint | first_byte_mark) & 0xFF); + } + else + { + (*output_pointer)[0] = (unsigned char)(codepoint & 0x7F); + } + + *output_pointer += utf8_length; + + return sequence_length; + +fail: + return 0; +} + +/* Parse the input text into an unescaped cinput, and populate item. */ +static cJSON_bool parse_string(cJSON * const item, parse_buffer * const input_buffer) +{ + const unsigned char *input_pointer = buffer_at_offset(input_buffer) + 1; + const unsigned char *input_end = buffer_at_offset(input_buffer) + 1; + unsigned char *output_pointer = NULL; + unsigned char *output = NULL; + + /* not a string */ + if (buffer_at_offset(input_buffer)[0] != '\"') + { + goto fail; + } + + { + /* calculate approximate size of the output (overestimate) */ + size_t allocation_length = 0; + size_t skipped_bytes = 0; + while (((size_t)(input_end - input_buffer->content) < input_buffer->length) && (*input_end != '\"')) + { + /* is escape sequence */ + if (input_end[0] == '\\') + { + if ((size_t)(input_end + 1 - input_buffer->content) >= input_buffer->length) + { + /* prevent buffer overflow when last input character is a backslash */ + goto fail; + } + skipped_bytes++; + input_end++; + } + input_end++; + } + if (((size_t)(input_end - input_buffer->content) >= input_buffer->length) || (*input_end != '\"')) + { + goto fail; /* string ended unexpectedly */ + } + + /* This is at most how much we need for the output */ + allocation_length = (size_t) (input_end - buffer_at_offset(input_buffer)) - skipped_bytes; + output = (unsigned char*)input_buffer->hooks.allocate(allocation_length + sizeof("")); + if (output == NULL) + { + goto fail; /* allocation failure */ + } + } + + output_pointer = output; + /* loop through the string literal */ + while (input_pointer < input_end) + { + if (*input_pointer != '\\') + { + *output_pointer++ = *input_pointer++; + } + /* escape sequence */ + else + { + unsigned char sequence_length = 2; + if ((input_end - input_pointer) < 1) + { + goto fail; + } + + switch (input_pointer[1]) + { + case 'b': + *output_pointer++ = '\b'; + break; + case 'f': + *output_pointer++ = '\f'; + break; + case 'n': + *output_pointer++ = '\n'; + break; + case 'r': + *output_pointer++ = '\r'; + break; + case 't': + *output_pointer++ = '\t'; + break; + case '\"': + case '\\': + case '/': + *output_pointer++ = input_pointer[1]; + break; + + /* UTF-16 literal */ + case 'u': + sequence_length = utf16_literal_to_utf8(input_pointer, input_end, &output_pointer); + if (sequence_length == 0) + { + /* failed to convert UTF16-literal to UTF-8 */ + goto fail; + } + break; + + default: + goto fail; + } + input_pointer += sequence_length; + } + } + + /* zero terminate the output */ + *output_pointer = '\0'; + + item->type = cJSON_String; + item->valuestring = (char*)output; + + input_buffer->offset = (size_t) (input_end - input_buffer->content); + input_buffer->offset++; + + return true; + +fail: + if (output != NULL) + { + input_buffer->hooks.deallocate(output); + output = NULL; + } + + if (input_pointer != NULL) + { + input_buffer->offset = (size_t)(input_pointer - input_buffer->content); + } + + return false; +} + +/* Render the cstring provided to an escaped version that can be printed. */ +static cJSON_bool print_string_ptr(const unsigned char * const input, printbuffer * const output_buffer) +{ + const unsigned char *input_pointer = NULL; + unsigned char *output = NULL; + unsigned char *output_pointer = NULL; + size_t output_length = 0; + /* numbers of additional characters needed for escaping */ + size_t escape_characters = 0; + + if (output_buffer == NULL) + { + return false; + } + + /* empty string */ + if (input == NULL) + { + output = ensure(output_buffer, sizeof("\"\"")); + if (output == NULL) + { + return false; + } + strcpy((char*)output, "\"\""); + + return true; + } + + /* set "flag" to 1 if something needs to be escaped */ + for (input_pointer = input; *input_pointer; input_pointer++) + { + switch (*input_pointer) + { + case '\"': + case '\\': + case '\b': + case '\f': + case '\n': + case '\r': + case '\t': + /* one character escape sequence */ + escape_characters++; + break; + default: + if (*input_pointer < 32) + { + /* UTF-16 escape sequence uXXXX */ + escape_characters += 5; + } + break; + } + } + output_length = (size_t)(input_pointer - input) + escape_characters; + + output = ensure(output_buffer, output_length + sizeof("\"\"")); + if (output == NULL) + { + return false; + } + + /* no characters have to be escaped */ + if (escape_characters == 0) + { + output[0] = '\"'; + memcpy(output + 1, input, output_length); + output[output_length + 1] = '\"'; + output[output_length + 2] = '\0'; + + return true; + } + + output[0] = '\"'; + output_pointer = output + 1; + /* copy the string */ + for (input_pointer = input; *input_pointer != '\0'; (void)input_pointer++, output_pointer++) + { + if ((*input_pointer > 31) && (*input_pointer != '\"') && (*input_pointer != '\\')) + { + /* normal character, copy */ + *output_pointer = *input_pointer; + } + else + { + /* character needs to be escaped */ + *output_pointer++ = '\\'; + switch (*input_pointer) + { + case '\\': + *output_pointer = '\\'; + break; + case '\"': + *output_pointer = '\"'; + break; + case '\b': + *output_pointer = 'b'; + break; + case '\f': + *output_pointer = 'f'; + break; + case '\n': + *output_pointer = 'n'; + break; + case '\r': + *output_pointer = 'r'; + break; + case '\t': + *output_pointer = 't'; + break; + default: + /* escape and print as unicode codepoint */ + sprintf((char*)output_pointer, "u%04x", *input_pointer); + output_pointer += 4; + break; + } + } + } + output[output_length + 1] = '\"'; + output[output_length + 2] = '\0'; + + return true; +} + +/* Invoke print_string_ptr (which is useful) on an item. */ +static cJSON_bool print_string(const cJSON * const item, printbuffer * const p) +{ + return print_string_ptr((unsigned char*)item->valuestring, p); +} + +/* Predeclare these prototypes. */ +static cJSON_bool parse_value(cJSON * const item, parse_buffer * const input_buffer); +static cJSON_bool print_value(const cJSON * const item, printbuffer * const output_buffer); +static cJSON_bool parse_array(cJSON * const item, parse_buffer * const input_buffer); +static cJSON_bool print_array(const cJSON * const item, printbuffer * const output_buffer); +static cJSON_bool parse_object(cJSON * const item, parse_buffer * const input_buffer); +static cJSON_bool print_object(const cJSON * const item, printbuffer * const output_buffer); + +/* Utility to jump whitespace and cr/lf */ +static parse_buffer *buffer_skip_whitespace(parse_buffer * const buffer) +{ + if ((buffer == NULL) || (buffer->content == NULL)) + { + return NULL; + } + + if (cannot_access_at_index(buffer, 0)) + { + return buffer; + } + + while (can_access_at_index(buffer, 0) && (buffer_at_offset(buffer)[0] <= 32)) + { + buffer->offset++; + } + + if (buffer->offset == buffer->length) + { + buffer->offset--; + } + + return buffer; +} + +/* skip the UTF-8 BOM (byte order mark) if it is at the beginning of a buffer */ +static parse_buffer *skip_utf8_bom(parse_buffer * const buffer) +{ + if ((buffer == NULL) || (buffer->content == NULL) || (buffer->offset != 0)) + { + return NULL; + } + + if (can_access_at_index(buffer, 4) && (strncmp((const char*)buffer_at_offset(buffer), "\xEF\xBB\xBF", 3) == 0)) + { + buffer->offset += 3; + } + + return buffer; +} + +CJSON_PUBLIC(cJSON *) cJSON_ParseWithOpts(const char *value, const char **return_parse_end, cJSON_bool require_null_terminated) +{ + size_t buffer_length; + + if (NULL == value) + { + return NULL; + } + + /* Adding null character size due to require_null_terminated. */ + buffer_length = strlen(value) + sizeof(""); + + return cJSON_ParseWithLengthOpts(value, buffer_length, return_parse_end, require_null_terminated); +} + +/* Parse an object - create a new root, and populate. */ +CJSON_PUBLIC(cJSON *) cJSON_ParseWithLengthOpts(const char *value, size_t buffer_length, const char **return_parse_end, cJSON_bool require_null_terminated) +{ + parse_buffer buffer = { 0, 0, 0, 0, { 0, 0, 0 } }; + cJSON *item = NULL; + + /* reset error position */ + global_error.json = NULL; + global_error.position = 0; + + if (value == NULL || 0 == buffer_length) + { + goto fail; + } + + buffer.content = (const unsigned char*)value; + buffer.length = buffer_length; + buffer.offset = 0; + buffer.hooks = global_hooks; + + item = cJSON_New_Item(&global_hooks); + if (item == NULL) /* memory fail */ + { + goto fail; + } + + if (!parse_value(item, buffer_skip_whitespace(skip_utf8_bom(&buffer)))) + { + /* parse failure. ep is set. */ + goto fail; + } + + /* if we require null-terminated JSON without appended garbage, skip and then check for a null terminator */ + if (require_null_terminated) + { + buffer_skip_whitespace(&buffer); + if ((buffer.offset >= buffer.length) || buffer_at_offset(&buffer)[0] != '\0') + { + goto fail; + } + } + if (return_parse_end) + { + *return_parse_end = (const char*)buffer_at_offset(&buffer); + } + + return item; + +fail: + if (item != NULL) + { + cJSON_Delete(item); + } + + if (value != NULL) + { + error local_error; + local_error.json = (const unsigned char*)value; + local_error.position = 0; + + if (buffer.offset < buffer.length) + { + local_error.position = buffer.offset; + } + else if (buffer.length > 0) + { + local_error.position = buffer.length - 1; + } + + if (return_parse_end != NULL) + { + *return_parse_end = (const char*)local_error.json + local_error.position; + } + + global_error = local_error; + } + + return NULL; +} + +/* Default options for cJSON_Parse */ +CJSON_PUBLIC(cJSON *) cJSON_Parse(const char *value) +{ + return cJSON_ParseWithOpts(value, 0, 0); +} + +CJSON_PUBLIC(cJSON *) cJSON_ParseWithLength(const char *value, size_t buffer_length) +{ + return cJSON_ParseWithLengthOpts(value, buffer_length, 0, 0); +} + +#define cjson_min(a, b) (((a) < (b)) ? (a) : (b)) + +static unsigned char *print(const cJSON * const item, cJSON_bool format, const internal_hooks * const hooks) +{ + static const size_t default_buffer_size = 256; + printbuffer buffer[1]; + unsigned char *printed = NULL; + + memset(buffer, 0, sizeof(buffer)); + + /* create buffer */ + buffer->buffer = (unsigned char*) hooks->allocate(default_buffer_size); + buffer->length = default_buffer_size; + buffer->format = format; + buffer->hooks = *hooks; + if (buffer->buffer == NULL) + { + goto fail; + } + + /* print the value */ + if (!print_value(item, buffer)) + { + goto fail; + } + update_offset(buffer); + + /* check if reallocate is available */ + if (hooks->reallocate != NULL) + { + printed = (unsigned char*) hooks->reallocate(buffer->buffer, buffer->offset + 1); + if (printed == NULL) { + goto fail; + } + buffer->buffer = NULL; + } + else /* otherwise copy the JSON over to a new buffer */ + { + printed = (unsigned char*) hooks->allocate(buffer->offset + 1); + if (printed == NULL) + { + goto fail; + } + memcpy(printed, buffer->buffer, cjson_min(buffer->length, buffer->offset + 1)); + printed[buffer->offset] = '\0'; /* just to be sure */ + + /* free the buffer */ + hooks->deallocate(buffer->buffer); + buffer->buffer = NULL; + } + + return printed; + +fail: + if (buffer->buffer != NULL) + { + hooks->deallocate(buffer->buffer); + buffer->buffer = NULL; + } + + if (printed != NULL) + { + hooks->deallocate(printed); + printed = NULL; + } + + return NULL; +} + +/* Render a cJSON item/entity/structure to text. */ +CJSON_PUBLIC(char *) cJSON_Print(const cJSON *item) +{ + return (char*)print(item, true, &global_hooks); +} + +CJSON_PUBLIC(char *) cJSON_PrintUnformatted(const cJSON *item) +{ + return (char*)print(item, false, &global_hooks); +} + +CJSON_PUBLIC(char *) cJSON_PrintBuffered(const cJSON *item, int prebuffer, cJSON_bool fmt) +{ + printbuffer p = { 0, 0, 0, 0, 0, 0, { 0, 0, 0 } }; + + if (prebuffer < 0) + { + return NULL; + } + + p.buffer = (unsigned char*)global_hooks.allocate((size_t)prebuffer); + if (!p.buffer) + { + return NULL; + } + + p.length = (size_t)prebuffer; + p.offset = 0; + p.noalloc = false; + p.format = fmt; + p.hooks = global_hooks; + + if (!print_value(item, &p)) + { + global_hooks.deallocate(p.buffer); + p.buffer = NULL; + return NULL; + } + + return (char*)p.buffer; +} + +CJSON_PUBLIC(cJSON_bool) cJSON_PrintPreallocated(cJSON *item, char *buffer, const int length, const cJSON_bool format) +{ + printbuffer p = { 0, 0, 0, 0, 0, 0, { 0, 0, 0 } }; + + if ((length < 0) || (buffer == NULL)) + { + return false; + } + + p.buffer = (unsigned char*)buffer; + p.length = (size_t)length; + p.offset = 0; + p.noalloc = true; + p.format = format; + p.hooks = global_hooks; + + return print_value(item, &p); +} + +/* Parser core - when encountering text, process appropriately. */ +static cJSON_bool parse_value(cJSON * const item, parse_buffer * const input_buffer) +{ + if ((input_buffer == NULL) || (input_buffer->content == NULL)) + { + return false; /* no input */ + } + + /* parse the different types of values */ + /* null */ + if (can_read(input_buffer, 4) && (strncmp((const char*)buffer_at_offset(input_buffer), "null", 4) == 0)) + { + item->type = cJSON_NULL; + input_buffer->offset += 4; + return true; + } + /* false */ + if (can_read(input_buffer, 5) && (strncmp((const char*)buffer_at_offset(input_buffer), "false", 5) == 0)) + { + item->type = cJSON_False; + input_buffer->offset += 5; + return true; + } + /* true */ + if (can_read(input_buffer, 4) && (strncmp((const char*)buffer_at_offset(input_buffer), "true", 4) == 0)) + { + item->type = cJSON_True; + item->valueint = 1; + input_buffer->offset += 4; + return true; + } + /* string */ + if (can_access_at_index(input_buffer, 0) && (buffer_at_offset(input_buffer)[0] == '\"')) + { + return parse_string(item, input_buffer); + } + /* number */ + if (can_access_at_index(input_buffer, 0) && ((buffer_at_offset(input_buffer)[0] == '-') || ((buffer_at_offset(input_buffer)[0] >= '0') && (buffer_at_offset(input_buffer)[0] <= '9')))) + { + return parse_number(item, input_buffer); + } + /* array */ + if (can_access_at_index(input_buffer, 0) && (buffer_at_offset(input_buffer)[0] == '[')) + { + return parse_array(item, input_buffer); + } + /* object */ + if (can_access_at_index(input_buffer, 0) && (buffer_at_offset(input_buffer)[0] == '{')) + { + return parse_object(item, input_buffer); + } + + return false; +} + +/* Render a value to text. */ +static cJSON_bool print_value(const cJSON * const item, printbuffer * const output_buffer) +{ + unsigned char *output = NULL; + + if ((item == NULL) || (output_buffer == NULL)) + { + return false; + } + + switch ((item->type) & 0xFF) + { + case cJSON_NULL: + output = ensure(output_buffer, 5); + if (output == NULL) + { + return false; + } + strcpy((char*)output, "null"); + return true; + + case cJSON_False: + output = ensure(output_buffer, 6); + if (output == NULL) + { + return false; + } + strcpy((char*)output, "false"); + return true; + + case cJSON_True: + output = ensure(output_buffer, 5); + if (output == NULL) + { + return false; + } + strcpy((char*)output, "true"); + return true; + + case cJSON_Number: + return print_number(item, output_buffer); + + case cJSON_Raw: + { + size_t raw_length = 0; + if (item->valuestring == NULL) + { + return false; + } + + raw_length = strlen(item->valuestring) + sizeof(""); + output = ensure(output_buffer, raw_length); + if (output == NULL) + { + return false; + } + memcpy(output, item->valuestring, raw_length); + return true; + } + + case cJSON_String: + return print_string(item, output_buffer); + + case cJSON_Array: + return print_array(item, output_buffer); + + case cJSON_Object: + return print_object(item, output_buffer); + + default: + return false; + } +} + +/* Build an array from input text. */ +static cJSON_bool parse_array(cJSON * const item, parse_buffer * const input_buffer) +{ + cJSON *head = NULL; /* head of the linked list */ + cJSON *current_item = NULL; + + if (input_buffer->depth >= CJSON_NESTING_LIMIT) + { + return false; /* to deeply nested */ + } + input_buffer->depth++; + + if (buffer_at_offset(input_buffer)[0] != '[') + { + /* not an array */ + goto fail; + } + + input_buffer->offset++; + buffer_skip_whitespace(input_buffer); + if (can_access_at_index(input_buffer, 0) && (buffer_at_offset(input_buffer)[0] == ']')) + { + /* empty array */ + goto success; + } + + /* check if we skipped to the end of the buffer */ + if (cannot_access_at_index(input_buffer, 0)) + { + input_buffer->offset--; + goto fail; + } + + /* step back to character in front of the first element */ + input_buffer->offset--; + /* loop through the comma separated array elements */ + do + { + /* allocate next item */ + cJSON *new_item = cJSON_New_Item(&(input_buffer->hooks)); + if (new_item == NULL) + { + goto fail; /* allocation failure */ + } + + /* attach next item to list */ + if (head == NULL) + { + /* start the linked list */ + current_item = head = new_item; + } + else + { + /* add to the end and advance */ + current_item->next = new_item; + new_item->prev = current_item; + current_item = new_item; + } + + /* parse next value */ + input_buffer->offset++; + buffer_skip_whitespace(input_buffer); + if (!parse_value(current_item, input_buffer)) + { + goto fail; /* failed to parse value */ + } + buffer_skip_whitespace(input_buffer); + } + while (can_access_at_index(input_buffer, 0) && (buffer_at_offset(input_buffer)[0] == ',')); + + if (cannot_access_at_index(input_buffer, 0) || buffer_at_offset(input_buffer)[0] != ']') + { + goto fail; /* expected end of array */ + } + +success: + input_buffer->depth--; + + if (head != NULL) { + head->prev = current_item; + } + + item->type = cJSON_Array; + item->child = head; + + input_buffer->offset++; + + return true; + +fail: + if (head != NULL) + { + cJSON_Delete(head); + } + + return false; +} + +/* Render an array to text */ +static cJSON_bool print_array(const cJSON * const item, printbuffer * const output_buffer) +{ + unsigned char *output_pointer = NULL; + size_t length = 0; + cJSON *current_element = item->child; + + if (output_buffer == NULL) + { + return false; + } + + /* Compose the output array. */ + /* opening square bracket */ + output_pointer = ensure(output_buffer, 1); + if (output_pointer == NULL) + { + return false; + } + + *output_pointer = '['; + output_buffer->offset++; + output_buffer->depth++; + + while (current_element != NULL) + { + if (!print_value(current_element, output_buffer)) + { + return false; + } + update_offset(output_buffer); + if (current_element->next) + { + length = (size_t) (output_buffer->format ? 2 : 1); + output_pointer = ensure(output_buffer, length + 1); + if (output_pointer == NULL) + { + return false; + } + *output_pointer++ = ','; + if(output_buffer->format) + { + *output_pointer++ = ' '; + } + *output_pointer = '\0'; + output_buffer->offset += length; + } + current_element = current_element->next; + } + + output_pointer = ensure(output_buffer, 2); + if (output_pointer == NULL) + { + return false; + } + *output_pointer++ = ']'; + *output_pointer = '\0'; + output_buffer->depth--; + + return true; +} + +/* Build an object from the text. */ +static cJSON_bool parse_object(cJSON * const item, parse_buffer * const input_buffer) +{ + cJSON *head = NULL; /* linked list head */ + cJSON *current_item = NULL; + + if (input_buffer->depth >= CJSON_NESTING_LIMIT) + { + return false; /* to deeply nested */ + } + input_buffer->depth++; + + if (cannot_access_at_index(input_buffer, 0) || (buffer_at_offset(input_buffer)[0] != '{')) + { + goto fail; /* not an object */ + } + + input_buffer->offset++; + buffer_skip_whitespace(input_buffer); + if (can_access_at_index(input_buffer, 0) && (buffer_at_offset(input_buffer)[0] == '}')) + { + goto success; /* empty object */ + } + + /* check if we skipped to the end of the buffer */ + if (cannot_access_at_index(input_buffer, 0)) + { + input_buffer->offset--; + goto fail; + } + + /* step back to character in front of the first element */ + input_buffer->offset--; + /* loop through the comma separated array elements */ + do + { + /* allocate next item */ + cJSON *new_item = cJSON_New_Item(&(input_buffer->hooks)); + if (new_item == NULL) + { + goto fail; /* allocation failure */ + } + + /* attach next item to list */ + if (head == NULL) + { + /* start the linked list */ + current_item = head = new_item; + } + else + { + /* add to the end and advance */ + current_item->next = new_item; + new_item->prev = current_item; + current_item = new_item; + } + + if (cannot_access_at_index(input_buffer, 1)) + { + goto fail; /* nothing comes after the comma */ + } + + /* parse the name of the child */ + input_buffer->offset++; + buffer_skip_whitespace(input_buffer); + if (!parse_string(current_item, input_buffer)) + { + goto fail; /* failed to parse name */ + } + buffer_skip_whitespace(input_buffer); + + /* swap valuestring and string, because we parsed the name */ + current_item->string = current_item->valuestring; + current_item->valuestring = NULL; + + if (cannot_access_at_index(input_buffer, 0) || (buffer_at_offset(input_buffer)[0] != ':')) + { + goto fail; /* invalid object */ + } + + /* parse the value */ + input_buffer->offset++; + buffer_skip_whitespace(input_buffer); + if (!parse_value(current_item, input_buffer)) + { + goto fail; /* failed to parse value */ + } + buffer_skip_whitespace(input_buffer); + } + while (can_access_at_index(input_buffer, 0) && (buffer_at_offset(input_buffer)[0] == ',')); + + if (cannot_access_at_index(input_buffer, 0) || (buffer_at_offset(input_buffer)[0] != '}')) + { + goto fail; /* expected end of object */ + } + +success: + input_buffer->depth--; + + if (head != NULL) { + head->prev = current_item; + } + + item->type = cJSON_Object; + item->child = head; + + input_buffer->offset++; + return true; + +fail: + if (head != NULL) + { + cJSON_Delete(head); + } + + return false; +} + +/* Render an object to text. */ +static cJSON_bool print_object(const cJSON * const item, printbuffer * const output_buffer) +{ + unsigned char *output_pointer = NULL; + size_t length = 0; + cJSON *current_item = item->child; + + if (output_buffer == NULL) + { + return false; + } + + /* Compose the output: */ + length = (size_t) (output_buffer->format ? 2 : 1); /* fmt: {\n */ + output_pointer = ensure(output_buffer, length + 1); + if (output_pointer == NULL) + { + return false; + } + + *output_pointer++ = '{'; + output_buffer->depth++; + if (output_buffer->format) + { + *output_pointer++ = '\n'; + } + output_buffer->offset += length; + + while (current_item) + { + if (output_buffer->format) + { + size_t i; + output_pointer = ensure(output_buffer, output_buffer->depth); + if (output_pointer == NULL) + { + return false; + } + for (i = 0; i < output_buffer->depth; i++) + { + *output_pointer++ = '\t'; + } + output_buffer->offset += output_buffer->depth; + } + + /* print key */ + if (!print_string_ptr((unsigned char*)current_item->string, output_buffer)) + { + return false; + } + update_offset(output_buffer); + + length = (size_t) (output_buffer->format ? 2 : 1); + output_pointer = ensure(output_buffer, length); + if (output_pointer == NULL) + { + return false; + } + *output_pointer++ = ':'; + if (output_buffer->format) + { + *output_pointer++ = '\t'; + } + output_buffer->offset += length; + + /* print value */ + if (!print_value(current_item, output_buffer)) + { + return false; + } + update_offset(output_buffer); + + /* print comma if not last */ + length = ((size_t)(output_buffer->format ? 1 : 0) + (size_t)(current_item->next ? 1 : 0)); + output_pointer = ensure(output_buffer, length + 1); + if (output_pointer == NULL) + { + return false; + } + if (current_item->next) + { + *output_pointer++ = ','; + } + + if (output_buffer->format) + { + *output_pointer++ = '\n'; + } + *output_pointer = '\0'; + output_buffer->offset += length; + + current_item = current_item->next; + } + + output_pointer = ensure(output_buffer, output_buffer->format ? (output_buffer->depth + 1) : 2); + if (output_pointer == NULL) + { + return false; + } + if (output_buffer->format) + { + size_t i; + for (i = 0; i < (output_buffer->depth - 1); i++) + { + *output_pointer++ = '\t'; + } + } + *output_pointer++ = '}'; + *output_pointer = '\0'; + output_buffer->depth--; + + return true; +} + +/* Get Array size/item / object item. */ +CJSON_PUBLIC(int) cJSON_GetArraySize(const cJSON *array) +{ + cJSON *child = NULL; + size_t size = 0; + + if (array == NULL) + { + return 0; + } + + child = array->child; + + while(child != NULL) + { + size++; + child = child->next; + } + + /* FIXME: Can overflow here. Cannot be fixed without breaking the API */ + + return (int)size; +} + +static cJSON* get_array_item(const cJSON *array, size_t index) +{ + cJSON *current_child = NULL; + + if (array == NULL) + { + return NULL; + } + + current_child = array->child; + while ((current_child != NULL) && (index > 0)) + { + index--; + current_child = current_child->next; + } + + return current_child; +} + +CJSON_PUBLIC(cJSON *) cJSON_GetArrayItem(const cJSON *array, int index) +{ + if (index < 0) + { + return NULL; + } + + return get_array_item(array, (size_t)index); +} + +static cJSON *get_object_item(const cJSON * const object, const char * const name, const cJSON_bool case_sensitive) +{ + cJSON *current_element = NULL; + + if ((object == NULL) || (name == NULL)) + { + return NULL; + } + + current_element = object->child; + if (case_sensitive) + { + while ((current_element != NULL) && (current_element->string != NULL) && (strcmp(name, current_element->string) != 0)) + { + current_element = current_element->next; + } + } + else + { + while ((current_element != NULL) && (case_insensitive_strcmp((const unsigned char*)name, (const unsigned char*)(current_element->string)) != 0)) + { + current_element = current_element->next; + } + } + + if ((current_element == NULL) || (current_element->string == NULL)) { + return NULL; + } + + return current_element; +} + +CJSON_PUBLIC(cJSON *) cJSON_GetObjectItem(const cJSON * const object, const char * const string) +{ + return get_object_item(object, string, false); +} + +CJSON_PUBLIC(cJSON *) cJSON_GetObjectItemCaseSensitive(const cJSON * const object, const char * const string) +{ + return get_object_item(object, string, true); +} + +CJSON_PUBLIC(cJSON_bool) cJSON_HasObjectItem(const cJSON *object, const char *string) +{ + return cJSON_GetObjectItem(object, string) ? 1 : 0; +} + +/* Utility for array list handling. */ +static void suffix_object(cJSON *prev, cJSON *item) +{ + prev->next = item; + item->prev = prev; +} + +/* Utility for handling references. */ +static cJSON *create_reference(const cJSON *item, const internal_hooks * const hooks) +{ + cJSON *reference = NULL; + if (item == NULL) + { + return NULL; + } + + reference = cJSON_New_Item(hooks); + if (reference == NULL) + { + return NULL; + } + + memcpy(reference, item, sizeof(cJSON)); + reference->string = NULL; + reference->type |= cJSON_IsReference; + reference->next = reference->prev = NULL; + return reference; +} + +static cJSON_bool add_item_to_array(cJSON *array, cJSON *item) +{ + cJSON *child = NULL; + + if ((item == NULL) || (array == NULL) || (array == item)) + { + return false; + } + + child = array->child; + /* + * To find the last item in array quickly, we use prev in array + */ + if (child == NULL) + { + /* list is empty, start new one */ + array->child = item; + item->prev = item; + item->next = NULL; + } + else + { + /* append to the end */ + if (child->prev) + { + suffix_object(child->prev, item); + array->child->prev = item; + } + } + + return true; +} + +/* Add item to array/object. */ +CJSON_PUBLIC(cJSON_bool) cJSON_AddItemToArray(cJSON *array, cJSON *item) +{ + return add_item_to_array(array, item); +} + +#if defined(__clang__) || (defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 5)))) + #pragma GCC diagnostic push +#endif +#ifdef __GNUC__ +#pragma GCC diagnostic ignored "-Wcast-qual" +#endif +/* helper function to cast away const */ +static void* cast_away_const(const void* string) +{ + return (void*)string; +} +#if defined(__clang__) || (defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 5)))) + #pragma GCC diagnostic pop +#endif + + +static cJSON_bool add_item_to_object(cJSON * const object, const char * const string, cJSON * const item, const internal_hooks * const hooks, const cJSON_bool constant_key) +{ + char *new_key = NULL; + int new_type = cJSON_Invalid; + + if ((object == NULL) || (string == NULL) || (item == NULL) || (object == item)) + { + return false; + } + + if (constant_key) + { + new_key = (char*)cast_away_const(string); + new_type = item->type | cJSON_StringIsConst; + } + else + { + new_key = (char*)cJSON_strdup((const unsigned char*)string, hooks); + if (new_key == NULL) + { + return false; + } + + new_type = item->type & ~cJSON_StringIsConst; + } + + if (!(item->type & cJSON_StringIsConst) && (item->string != NULL)) + { + hooks->deallocate(item->string); + } + + item->string = new_key; + item->type = new_type; + + return add_item_to_array(object, item); +} + +CJSON_PUBLIC(cJSON_bool) cJSON_AddItemToObject(cJSON *object, const char *string, cJSON *item) +{ + return add_item_to_object(object, string, item, &global_hooks, false); +} + +/* Add an item to an object with constant string as key */ +CJSON_PUBLIC(cJSON_bool) cJSON_AddItemToObjectCS(cJSON *object, const char *string, cJSON *item) +{ + return add_item_to_object(object, string, item, &global_hooks, true); +} + +CJSON_PUBLIC(cJSON_bool) cJSON_AddItemReferenceToArray(cJSON *array, cJSON *item) +{ + if (array == NULL) + { + return false; + } + + return add_item_to_array(array, create_reference(item, &global_hooks)); +} + +CJSON_PUBLIC(cJSON_bool) cJSON_AddItemReferenceToObject(cJSON *object, const char *string, cJSON *item) +{ + if ((object == NULL) || (string == NULL)) + { + return false; + } + + return add_item_to_object(object, string, create_reference(item, &global_hooks), &global_hooks, false); +} + +CJSON_PUBLIC(cJSON*) cJSON_AddNullToObject(cJSON * const object, const char * const name) +{ + cJSON *null = cJSON_CreateNull(); + if (add_item_to_object(object, name, null, &global_hooks, false)) + { + return null; + } + + cJSON_Delete(null); + return NULL; +} + +CJSON_PUBLIC(cJSON*) cJSON_AddTrueToObject(cJSON * const object, const char * const name) +{ + cJSON *true_item = cJSON_CreateTrue(); + if (add_item_to_object(object, name, true_item, &global_hooks, false)) + { + return true_item; + } + + cJSON_Delete(true_item); + return NULL; +} + +CJSON_PUBLIC(cJSON*) cJSON_AddFalseToObject(cJSON * const object, const char * const name) +{ + cJSON *false_item = cJSON_CreateFalse(); + if (add_item_to_object(object, name, false_item, &global_hooks, false)) + { + return false_item; + } + + cJSON_Delete(false_item); + return NULL; +} + +CJSON_PUBLIC(cJSON*) cJSON_AddBoolToObject(cJSON * const object, const char * const name, const cJSON_bool boolean) +{ + cJSON *bool_item = cJSON_CreateBool(boolean); + if (add_item_to_object(object, name, bool_item, &global_hooks, false)) + { + return bool_item; + } + + cJSON_Delete(bool_item); + return NULL; +} + +CJSON_PUBLIC(cJSON*) cJSON_AddNumberToObject(cJSON * const object, const char * const name, const double number) +{ + cJSON *number_item = cJSON_CreateNumber(number); + if (add_item_to_object(object, name, number_item, &global_hooks, false)) + { + return number_item; + } + + cJSON_Delete(number_item); + return NULL; +} + +CJSON_PUBLIC(cJSON*) cJSON_AddStringToObject(cJSON * const object, const char * const name, const char * const string) +{ + cJSON *string_item = cJSON_CreateString(string); + if (add_item_to_object(object, name, string_item, &global_hooks, false)) + { + return string_item; + } + + cJSON_Delete(string_item); + return NULL; +} + +CJSON_PUBLIC(cJSON*) cJSON_AddRawToObject(cJSON * const object, const char * const name, const char * const raw) +{ + cJSON *raw_item = cJSON_CreateRaw(raw); + if (add_item_to_object(object, name, raw_item, &global_hooks, false)) + { + return raw_item; + } + + cJSON_Delete(raw_item); + return NULL; +} + +CJSON_PUBLIC(cJSON*) cJSON_AddObjectToObject(cJSON * const object, const char * const name) +{ + cJSON *object_item = cJSON_CreateObject(); + if (add_item_to_object(object, name, object_item, &global_hooks, false)) + { + return object_item; + } + + cJSON_Delete(object_item); + return NULL; +} + +CJSON_PUBLIC(cJSON*) cJSON_AddArrayToObject(cJSON * const object, const char * const name) +{ + cJSON *array = cJSON_CreateArray(); + if (add_item_to_object(object, name, array, &global_hooks, false)) + { + return array; + } + + cJSON_Delete(array); + return NULL; +} + +CJSON_PUBLIC(cJSON *) cJSON_DetachItemViaPointer(cJSON *parent, cJSON * const item) +{ + if ((parent == NULL) || (item == NULL) || (item != parent->child && item->prev == NULL)) + { + return NULL; + } + + if (item != parent->child) + { + /* not the first element */ + item->prev->next = item->next; + } + if (item->next != NULL) + { + /* not the last element */ + item->next->prev = item->prev; + } + + if (item == parent->child) + { + /* first element */ + parent->child = item->next; + } + else if (item->next == NULL) + { + /* last element */ + parent->child->prev = item->prev; + } + + /* make sure the detached item doesn't point anywhere anymore */ + item->prev = NULL; + item->next = NULL; + + return item; +} + +CJSON_PUBLIC(cJSON *) cJSON_DetachItemFromArray(cJSON *array, int which) +{ + if (which < 0) + { + return NULL; + } + + return cJSON_DetachItemViaPointer(array, get_array_item(array, (size_t)which)); +} + +CJSON_PUBLIC(void) cJSON_DeleteItemFromArray(cJSON *array, int which) +{ + cJSON_Delete(cJSON_DetachItemFromArray(array, which)); +} + +CJSON_PUBLIC(cJSON *) cJSON_DetachItemFromObject(cJSON *object, const char *string) +{ + cJSON *to_detach = cJSON_GetObjectItem(object, string); + + return cJSON_DetachItemViaPointer(object, to_detach); +} + +CJSON_PUBLIC(cJSON *) cJSON_DetachItemFromObjectCaseSensitive(cJSON *object, const char *string) +{ + cJSON *to_detach = cJSON_GetObjectItemCaseSensitive(object, string); + + return cJSON_DetachItemViaPointer(object, to_detach); +} + +CJSON_PUBLIC(void) cJSON_DeleteItemFromObject(cJSON *object, const char *string) +{ + cJSON_Delete(cJSON_DetachItemFromObject(object, string)); +} + +CJSON_PUBLIC(void) cJSON_DeleteItemFromObjectCaseSensitive(cJSON *object, const char *string) +{ + cJSON_Delete(cJSON_DetachItemFromObjectCaseSensitive(object, string)); +} + +/* Replace array/object items with new ones. */ +CJSON_PUBLIC(cJSON_bool) cJSON_InsertItemInArray(cJSON *array, int which, cJSON *newitem) +{ + cJSON *after_inserted = NULL; + + if (which < 0 || newitem == NULL) + { + return false; + } + + after_inserted = get_array_item(array, (size_t)which); + if (after_inserted == NULL) + { + return add_item_to_array(array, newitem); + } + + if (after_inserted != array->child && after_inserted->prev == NULL) { + /* return false if after_inserted is a corrupted array item */ + return false; + } + + newitem->next = after_inserted; + newitem->prev = after_inserted->prev; + after_inserted->prev = newitem; + if (after_inserted == array->child) + { + array->child = newitem; + } + else + { + newitem->prev->next = newitem; + } + return true; +} + +CJSON_PUBLIC(cJSON_bool) cJSON_ReplaceItemViaPointer(cJSON * const parent, cJSON * const item, cJSON * replacement) +{ + if ((parent == NULL) || (parent->child == NULL) || (replacement == NULL) || (item == NULL)) + { + return false; + } + + if (replacement == item) + { + return true; + } + + replacement->next = item->next; + replacement->prev = item->prev; + + if (replacement->next != NULL) + { + replacement->next->prev = replacement; + } + if (parent->child == item) + { + if (parent->child->prev == parent->child) + { + replacement->prev = replacement; + } + parent->child = replacement; + } + else + { /* + * To find the last item in array quickly, we use prev in array. + * We can't modify the last item's next pointer where this item was the parent's child + */ + if (replacement->prev != NULL) + { + replacement->prev->next = replacement; + } + if (replacement->next == NULL) + { + parent->child->prev = replacement; + } + } + + item->next = NULL; + item->prev = NULL; + cJSON_Delete(item); + + return true; +} + +CJSON_PUBLIC(cJSON_bool) cJSON_ReplaceItemInArray(cJSON *array, int which, cJSON *newitem) +{ + if (which < 0) + { + return false; + } + + return cJSON_ReplaceItemViaPointer(array, get_array_item(array, (size_t)which), newitem); +} + +static cJSON_bool replace_item_in_object(cJSON *object, const char *string, cJSON *replacement, cJSON_bool case_sensitive) +{ + if ((replacement == NULL) || (string == NULL)) + { + return false; + } + + /* replace the name in the replacement */ + if (!(replacement->type & cJSON_StringIsConst) && (replacement->string != NULL)) + { + cJSON_free(replacement->string); + } + replacement->string = (char*)cJSON_strdup((const unsigned char*)string, &global_hooks); + if (replacement->string == NULL) + { + return false; + } + + replacement->type &= ~cJSON_StringIsConst; + + return cJSON_ReplaceItemViaPointer(object, get_object_item(object, string, case_sensitive), replacement); +} + +CJSON_PUBLIC(cJSON_bool) cJSON_ReplaceItemInObject(cJSON *object, const char *string, cJSON *newitem) +{ + return replace_item_in_object(object, string, newitem, false); +} + +CJSON_PUBLIC(cJSON_bool) cJSON_ReplaceItemInObjectCaseSensitive(cJSON *object, const char *string, cJSON *newitem) +{ + return replace_item_in_object(object, string, newitem, true); +} + +/* Create basic types: */ +CJSON_PUBLIC(cJSON *) cJSON_CreateNull(void) +{ + cJSON *item = cJSON_New_Item(&global_hooks); + if(item) + { + item->type = cJSON_NULL; + } + + return item; +} + +CJSON_PUBLIC(cJSON *) cJSON_CreateTrue(void) +{ + cJSON *item = cJSON_New_Item(&global_hooks); + if(item) + { + item->type = cJSON_True; + } + + return item; +} + +CJSON_PUBLIC(cJSON *) cJSON_CreateFalse(void) +{ + cJSON *item = cJSON_New_Item(&global_hooks); + if(item) + { + item->type = cJSON_False; + } + + return item; +} + +CJSON_PUBLIC(cJSON *) cJSON_CreateBool(cJSON_bool boolean) +{ + cJSON *item = cJSON_New_Item(&global_hooks); + if(item) + { + item->type = boolean ? cJSON_True : cJSON_False; + } + + return item; +} + +CJSON_PUBLIC(cJSON *) cJSON_CreateNumber(double num) +{ + cJSON *item = cJSON_New_Item(&global_hooks); + if(item) + { + item->type = cJSON_Number; + item->valuedouble = num; + + /* use saturation in case of overflow */ + if (num >= INT_MAX) + { + item->valueint = INT_MAX; + } + else if (num <= (double)INT_MIN) + { + item->valueint = INT_MIN; + } + else + { + item->valueint = (int)num; + } + } + + return item; +} + +CJSON_PUBLIC(cJSON *) cJSON_CreateString(const char *string) +{ + cJSON *item = cJSON_New_Item(&global_hooks); + if(item) + { + item->type = cJSON_String; + item->valuestring = (char*)cJSON_strdup((const unsigned char*)string, &global_hooks); + if(!item->valuestring) + { + cJSON_Delete(item); + return NULL; + } + } + + return item; +} + +CJSON_PUBLIC(cJSON *) cJSON_CreateStringReference(const char *string) +{ + cJSON *item = cJSON_New_Item(&global_hooks); + if (item != NULL) + { + item->type = cJSON_String | cJSON_IsReference; + item->valuestring = (char*)cast_away_const(string); + } + + return item; +} + +CJSON_PUBLIC(cJSON *) cJSON_CreateObjectReference(const cJSON *child) +{ + cJSON *item = cJSON_New_Item(&global_hooks); + if (item != NULL) { + item->type = cJSON_Object | cJSON_IsReference; + item->child = (cJSON*)cast_away_const(child); + } + + return item; +} + +CJSON_PUBLIC(cJSON *) cJSON_CreateArrayReference(const cJSON *child) { + cJSON *item = cJSON_New_Item(&global_hooks); + if (item != NULL) { + item->type = cJSON_Array | cJSON_IsReference; + item->child = (cJSON*)cast_away_const(child); + } + + return item; +} + +CJSON_PUBLIC(cJSON *) cJSON_CreateRaw(const char *raw) +{ + cJSON *item = cJSON_New_Item(&global_hooks); + if(item) + { + item->type = cJSON_Raw; + item->valuestring = (char*)cJSON_strdup((const unsigned char*)raw, &global_hooks); + if(!item->valuestring) + { + cJSON_Delete(item); + return NULL; + } + } + + return item; +} + +CJSON_PUBLIC(cJSON *) cJSON_CreateArray(void) +{ + cJSON *item = cJSON_New_Item(&global_hooks); + if(item) + { + item->type=cJSON_Array; + } + + return item; +} + +CJSON_PUBLIC(cJSON *) cJSON_CreateObject(void) +{ + cJSON *item = cJSON_New_Item(&global_hooks); + if (item) + { + item->type = cJSON_Object; + } + + return item; +} + +/* Create Arrays: */ +CJSON_PUBLIC(cJSON *) cJSON_CreateIntArray(const int *numbers, int count) +{ + size_t i = 0; + cJSON *n = NULL; + cJSON *p = NULL; + cJSON *a = NULL; + + if ((count < 0) || (numbers == NULL)) + { + return NULL; + } + + a = cJSON_CreateArray(); + + for(i = 0; a && (i < (size_t)count); i++) + { + n = cJSON_CreateNumber(numbers[i]); + if (!n) + { + cJSON_Delete(a); + return NULL; + } + if(!i) + { + a->child = n; + } + else + { + suffix_object(p, n); + } + p = n; + } + + if (a && a->child) { + a->child->prev = n; + } + + return a; +} + +CJSON_PUBLIC(cJSON *) cJSON_CreateFloatArray(const float *numbers, int count) +{ + size_t i = 0; + cJSON *n = NULL; + cJSON *p = NULL; + cJSON *a = NULL; + + if ((count < 0) || (numbers == NULL)) + { + return NULL; + } + + a = cJSON_CreateArray(); + + for(i = 0; a && (i < (size_t)count); i++) + { + n = cJSON_CreateNumber((double)numbers[i]); + if(!n) + { + cJSON_Delete(a); + return NULL; + } + if(!i) + { + a->child = n; + } + else + { + suffix_object(p, n); + } + p = n; + } + + if (a && a->child) { + a->child->prev = n; + } + + return a; +} + +CJSON_PUBLIC(cJSON *) cJSON_CreateDoubleArray(const double *numbers, int count) +{ + size_t i = 0; + cJSON *n = NULL; + cJSON *p = NULL; + cJSON *a = NULL; + + if ((count < 0) || (numbers == NULL)) + { + return NULL; + } + + a = cJSON_CreateArray(); + + for(i = 0; a && (i < (size_t)count); i++) + { + n = cJSON_CreateNumber(numbers[i]); + if(!n) + { + cJSON_Delete(a); + return NULL; + } + if(!i) + { + a->child = n; + } + else + { + suffix_object(p, n); + } + p = n; + } + + if (a && a->child) { + a->child->prev = n; + } + + return a; +} + +CJSON_PUBLIC(cJSON *) cJSON_CreateStringArray(const char *const *strings, int count) +{ + size_t i = 0; + cJSON *n = NULL; + cJSON *p = NULL; + cJSON *a = NULL; + + if ((count < 0) || (strings == NULL)) + { + return NULL; + } + + a = cJSON_CreateArray(); + + for (i = 0; a && (i < (size_t)count); i++) + { + n = cJSON_CreateString(strings[i]); + if(!n) + { + cJSON_Delete(a); + return NULL; + } + if(!i) + { + a->child = n; + } + else + { + suffix_object(p,n); + } + p = n; + } + + if (a && a->child) { + a->child->prev = n; + } + + return a; +} + +/* Duplication */ +cJSON * cJSON_Duplicate_rec(const cJSON *item, size_t depth, cJSON_bool recurse); + +CJSON_PUBLIC(cJSON *) cJSON_Duplicate(const cJSON *item, cJSON_bool recurse) +{ + return cJSON_Duplicate_rec(item, 0, recurse ); +} + +cJSON * cJSON_Duplicate_rec(const cJSON *item, size_t depth, cJSON_bool recurse) +{ + cJSON *newitem = NULL; + cJSON *child = NULL; + cJSON *next = NULL; + cJSON *newchild = NULL; + + /* Bail on bad ptr */ + if (!item) + { + goto fail; + } + /* Create new item */ + newitem = cJSON_New_Item(&global_hooks); + if (!newitem) + { + goto fail; + } + /* Copy over all vars */ + newitem->type = item->type & (~cJSON_IsReference); + newitem->valueint = item->valueint; + newitem->valuedouble = item->valuedouble; + if (item->valuestring) + { + newitem->valuestring = (char*)cJSON_strdup((unsigned char*)item->valuestring, &global_hooks); + if (!newitem->valuestring) + { + goto fail; + } + } + if (item->string) + { + newitem->string = (item->type&cJSON_StringIsConst) ? item->string : (char*)cJSON_strdup((unsigned char*)item->string, &global_hooks); + if (!newitem->string) + { + goto fail; + } + } + /* If non-recursive, then we're done! */ + if (!recurse) + { + return newitem; + } + /* Walk the ->next chain for the child. */ + child = item->child; + while (child != NULL) + { + if(depth >= CJSON_CIRCULAR_LIMIT) { + goto fail; + } + newchild = cJSON_Duplicate_rec(child, depth + 1, true); /* Duplicate (with recurse) each item in the ->next chain */ + if (!newchild) + { + goto fail; + } + if (next != NULL) + { + /* If newitem->child already set, then crosswire ->prev and ->next and move on */ + next->next = newchild; + newchild->prev = next; + next = newchild; + } + else + { + /* Set newitem->child and move to it */ + newitem->child = newchild; + next = newchild; + } + child = child->next; + } + if (newitem && newitem->child) + { + newitem->child->prev = newchild; + } + + return newitem; + +fail: + if (newitem != NULL) + { + cJSON_Delete(newitem); + } + + return NULL; +} + +static void skip_oneline_comment(char **input) +{ + *input += static_strlen("//"); + + for (; (*input)[0] != '\0'; ++(*input)) + { + if ((*input)[0] == '\n') { + *input += static_strlen("\n"); + return; + } + } +} + +static void skip_multiline_comment(char **input) +{ + *input += static_strlen("/*"); + + for (; (*input)[0] != '\0'; ++(*input)) + { + if (((*input)[0] == '*') && ((*input)[1] == '/')) + { + *input += static_strlen("*/"); + return; + } + } +} + +static void minify_string(char **input, char **output) { + (*output)[0] = (*input)[0]; + *input += static_strlen("\""); + *output += static_strlen("\""); + + + for (; (*input)[0] != '\0'; (void)++(*input), ++(*output)) { + (*output)[0] = (*input)[0]; + + if ((*input)[0] == '\"') { + (*output)[0] = '\"'; + *input += static_strlen("\""); + *output += static_strlen("\""); + return; + } else if (((*input)[0] == '\\') && ((*input)[1] == '\"')) { + (*output)[1] = (*input)[1]; + *input += static_strlen("\""); + *output += static_strlen("\""); + } + } +} + +CJSON_PUBLIC(void) cJSON_Minify(char *json) +{ + char *into = json; + + if (json == NULL) + { + return; + } + + while (json[0] != '\0') + { + switch (json[0]) + { + case ' ': + case '\t': + case '\r': + case '\n': + json++; + break; + + case '/': + if (json[1] == '/') + { + skip_oneline_comment(&json); + } + else if (json[1] == '*') + { + skip_multiline_comment(&json); + } else { + json++; + } + break; + + case '\"': + minify_string(&json, (char**)&into); + break; + + default: + into[0] = json[0]; + json++; + into++; + } + } + + /* and null-terminate. */ + *into = '\0'; +} + +CJSON_PUBLIC(cJSON_bool) cJSON_IsInvalid(const cJSON * const item) +{ + if (item == NULL) + { + return false; + } + + return (item->type & 0xFF) == cJSON_Invalid; +} + +CJSON_PUBLIC(cJSON_bool) cJSON_IsFalse(const cJSON * const item) +{ + if (item == NULL) + { + return false; + } + + return (item->type & 0xFF) == cJSON_False; +} + +CJSON_PUBLIC(cJSON_bool) cJSON_IsTrue(const cJSON * const item) +{ + if (item == NULL) + { + return false; + } + + return (item->type & 0xff) == cJSON_True; +} + + +CJSON_PUBLIC(cJSON_bool) cJSON_IsBool(const cJSON * const item) +{ + if (item == NULL) + { + return false; + } + + return (item->type & (cJSON_True | cJSON_False)) != 0; +} +CJSON_PUBLIC(cJSON_bool) cJSON_IsNull(const cJSON * const item) +{ + if (item == NULL) + { + return false; + } + + return (item->type & 0xFF) == cJSON_NULL; +} + +CJSON_PUBLIC(cJSON_bool) cJSON_IsNumber(const cJSON * const item) +{ + if (item == NULL) + { + return false; + } + + return (item->type & 0xFF) == cJSON_Number; +} + +CJSON_PUBLIC(cJSON_bool) cJSON_IsString(const cJSON * const item) +{ + if (item == NULL) + { + return false; + } + + return (item->type & 0xFF) == cJSON_String; +} + +CJSON_PUBLIC(cJSON_bool) cJSON_IsArray(const cJSON * const item) +{ + if (item == NULL) + { + return false; + } + + return (item->type & 0xFF) == cJSON_Array; +} + +CJSON_PUBLIC(cJSON_bool) cJSON_IsObject(const cJSON * const item) +{ + if (item == NULL) + { + return false; + } + + return (item->type & 0xFF) == cJSON_Object; +} + +CJSON_PUBLIC(cJSON_bool) cJSON_IsRaw(const cJSON * const item) +{ + if (item == NULL) + { + return false; + } + + return (item->type & 0xFF) == cJSON_Raw; +} + +CJSON_PUBLIC(cJSON_bool) cJSON_Compare(const cJSON * const a, const cJSON * const b, const cJSON_bool case_sensitive) +{ + if ((a == NULL) || (b == NULL) || ((a->type & 0xFF) != (b->type & 0xFF))) + { + return false; + } + + /* check if type is valid */ + switch (a->type & 0xFF) + { + case cJSON_False: + case cJSON_True: + case cJSON_NULL: + case cJSON_Number: + case cJSON_String: + case cJSON_Raw: + case cJSON_Array: + case cJSON_Object: + break; + + default: + return false; + } + + /* identical objects are equal */ + if (a == b) + { + return true; + } + + switch (a->type & 0xFF) + { + /* in these cases and equal type is enough */ + case cJSON_False: + case cJSON_True: + case cJSON_NULL: + return true; + + case cJSON_Number: + if (compare_double(a->valuedouble, b->valuedouble)) + { + return true; + } + return false; + + case cJSON_String: + case cJSON_Raw: + if ((a->valuestring == NULL) || (b->valuestring == NULL)) + { + return false; + } + if (strcmp(a->valuestring, b->valuestring) == 0) + { + return true; + } + + return false; + + case cJSON_Array: + { + cJSON *a_element = a->child; + cJSON *b_element = b->child; + + for (; (a_element != NULL) && (b_element != NULL);) + { + if (!cJSON_Compare(a_element, b_element, case_sensitive)) + { + return false; + } + + a_element = a_element->next; + b_element = b_element->next; + } + + /* one of the arrays is longer than the other */ + if (a_element != b_element) { + return false; + } + + return true; + } + + case cJSON_Object: + { + cJSON *a_element = NULL; + cJSON *b_element = NULL; + cJSON_ArrayForEach(a_element, a) + { + /* TODO This has O(n^2) runtime, which is horrible! */ + b_element = get_object_item(b, a_element->string, case_sensitive); + if (b_element == NULL) + { + return false; + } + + if (!cJSON_Compare(a_element, b_element, case_sensitive)) + { + return false; + } + } + + /* doing this twice, once on a and b to prevent true comparison if a subset of b + * TODO: Do this the proper way, this is just a fix for now */ + cJSON_ArrayForEach(b_element, b) + { + a_element = get_object_item(a, b_element->string, case_sensitive); + if (a_element == NULL) + { + return false; + } + + if (!cJSON_Compare(b_element, a_element, case_sensitive)) + { + return false; + } + } + + return true; + } + + default: + return false; + } +} + +CJSON_PUBLIC(void *) cJSON_malloc(size_t size) +{ + return global_hooks.allocate(size); +} + +CJSON_PUBLIC(void) cJSON_free(void *object) +{ + global_hooks.deallocate(object); + object = NULL; +} diff --git a/thirdparty/cjson/cJSON.h b/thirdparty/cjson/cJSON.h new file mode 100644 index 0000000..7f67ecc --- /dev/null +++ b/thirdparty/cjson/cJSON.h @@ -0,0 +1,308 @@ +/* + Copyright (c) 2009-2017 Dave Gamble and cJSON contributors + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + THE SOFTWARE. +*/ + +#ifndef cJSON__h +#define cJSON__h + +#define CJSON_HIDE_SYMBOLS + +#ifdef __cplusplus +extern "C" +{ +#endif + +#if !defined(__WINDOWS__) && (defined(WIN32) || defined(WIN64) || defined(_MSC_VER) || defined(_WIN32)) +#define __WINDOWS__ +#endif + +#ifdef __WINDOWS__ + +/* When compiling for windows, we specify a specific calling convention to avoid issues where we are being called from a project with a different default calling convention. For windows you have 3 define options: + +CJSON_HIDE_SYMBOLS - Define this in the case where you don't want to ever dllexport symbols +CJSON_EXPORT_SYMBOLS - Define this on library build when you want to dllexport symbols (default) +CJSON_IMPORT_SYMBOLS - Define this if you want to dllimport symbol + +For *nix builds that support visibility attribute, you can define similar behavior by + +setting default visibility to hidden by adding +-fvisibility=hidden (for gcc) +or +-xldscope=hidden (for sun cc) +to CFLAGS + +then using the CJSON_API_VISIBILITY flag to "export" the same symbols the way CJSON_EXPORT_SYMBOLS does + +*/ + +#define CJSON_CDECL __cdecl +#define CJSON_STDCALL __stdcall + +/* export symbols by default, this is necessary for copy pasting the C and header file */ +#if !defined(CJSON_HIDE_SYMBOLS) && !defined(CJSON_IMPORT_SYMBOLS) && !defined(CJSON_EXPORT_SYMBOLS) +#define CJSON_EXPORT_SYMBOLS +#endif + +#if defined(CJSON_HIDE_SYMBOLS) +#define CJSON_PUBLIC(type) type CJSON_STDCALL +#elif defined(CJSON_EXPORT_SYMBOLS) +#define CJSON_PUBLIC(type) __declspec(dllexport) type CJSON_STDCALL +#elif defined(CJSON_IMPORT_SYMBOLS) +#define CJSON_PUBLIC(type) __declspec(dllimport) type CJSON_STDCALL +#endif +#else /* !__WINDOWS__ */ +#define CJSON_CDECL +#define CJSON_STDCALL + +#if (defined(__GNUC__) || defined(__SUNPRO_CC) || defined (__SUNPRO_C)) && defined(CJSON_API_VISIBILITY) +#define CJSON_PUBLIC(type) __attribute__((visibility("default"))) type +#else +#define CJSON_PUBLIC(type) type +#endif +#endif + +/* project version */ +#define CJSON_VERSION_MAJOR 1 +#define CJSON_VERSION_MINOR 7 +#define CJSON_VERSION_PATCH 19 + +#include + +/* cJSON Types: */ +#define cJSON_Invalid (0) +#define cJSON_False (1 << 0) +#define cJSON_True (1 << 1) +#define cJSON_NULL (1 << 2) +#define cJSON_Number (1 << 3) +#define cJSON_String (1 << 4) +#define cJSON_Array (1 << 5) +#define cJSON_Object (1 << 6) +#define cJSON_Raw (1 << 7) /* raw json */ + +#define cJSON_IsReference 256 +#define cJSON_StringIsConst 512 + +/* The cJSON structure: */ +typedef struct cJSON +{ + /* next/prev allow you to walk array/object chains. Alternatively, use GetArraySize/GetArrayItem/GetObjectItem */ + struct cJSON *next; + struct cJSON *prev; + /* An array or object item will have a child pointer pointing to a chain of the items in the array/object. */ + struct cJSON *child; + + /* The type of the item, as above. */ + int type; + + /* The item's string, if type==cJSON_String and type == cJSON_Raw */ + char *valuestring; + /* writing to valueint is DEPRECATED, use cJSON_SetNumberValue instead */ + int valueint; + /* The item's number, if type==cJSON_Number */ + double valuedouble; + + /* The item's name string, if this item is the child of, or is in the list of subitems of an object. */ + char *string; +} cJSON; + +typedef struct cJSON_Hooks +{ + /* malloc/free are CDECL on Windows regardless of the default calling convention of the compiler, so ensure the hooks allow passing those functions directly. */ + void *(CJSON_CDECL *malloc_fn)(size_t sz); + void (CJSON_CDECL *free_fn)(void *ptr); +} cJSON_Hooks; + +typedef int cJSON_bool; + +/* Limits how deeply nested arrays/objects can be before cJSON rejects to parse them. + * This is to prevent stack overflows. */ +#ifndef CJSON_NESTING_LIMIT +#define CJSON_NESTING_LIMIT 1000 +#endif + +/* Limits the length of circular references can be before cJSON rejects to parse them. + * This is to prevent stack overflows. */ +#ifndef CJSON_CIRCULAR_LIMIT +#define CJSON_CIRCULAR_LIMIT 10000 +#endif + +/* returns the version of cJSON as a string */ +CJSON_PUBLIC(const char*) cJSON_Version(void); + +/* Supply malloc, realloc and free functions to cJSON */ +CJSON_PUBLIC(void) cJSON_InitHooks(cJSON_Hooks* hooks); + +/* Memory Management: the caller is always responsible to free the results from all variants of cJSON_Parse (with cJSON_Delete) and cJSON_Print (with stdlib free, cJSON_Hooks.free_fn, or cJSON_free as appropriate). The exception is cJSON_PrintPreallocated, where the caller has full responsibility of the buffer. */ +/* Supply a block of JSON, and this returns a cJSON object you can interrogate. */ +CJSON_PUBLIC(cJSON *) cJSON_Parse(const char *value); +CJSON_PUBLIC(cJSON *) cJSON_ParseWithLength(const char *value, size_t buffer_length); +/* ParseWithOpts allows you to require (and check) that the JSON is null terminated, and to retrieve the pointer to the final byte parsed. */ +/* If you supply a ptr in return_parse_end and parsing fails, then return_parse_end will contain a pointer to the error so will match cJSON_GetErrorPtr(). */ +CJSON_PUBLIC(cJSON *) cJSON_ParseWithOpts(const char *value, const char **return_parse_end, cJSON_bool require_null_terminated); +CJSON_PUBLIC(cJSON *) cJSON_ParseWithLengthOpts(const char *value, size_t buffer_length, const char **return_parse_end, cJSON_bool require_null_terminated); + +/* Render a cJSON entity to text for transfer/storage. */ +CJSON_PUBLIC(char *) cJSON_Print(const cJSON *item); +/* Render a cJSON entity to text for transfer/storage without any formatting. */ +CJSON_PUBLIC(char *) cJSON_PrintUnformatted(const cJSON *item); +/* Render a cJSON entity to text using a buffered strategy. prebuffer is a guess at the final size. guessing well reduces reallocation. fmt=0 gives unformatted, =1 gives formatted */ +CJSON_PUBLIC(char *) cJSON_PrintBuffered(const cJSON *item, int prebuffer, cJSON_bool fmt); +/* Render a cJSON entity to text using a buffer already allocated in memory with given length. Returns 1 on success and 0 on failure. */ +/* NOTE: cJSON is not always 100% accurate in estimating how much memory it will use, so to be safe allocate 5 bytes more than you actually need */ +CJSON_PUBLIC(cJSON_bool) cJSON_PrintPreallocated(cJSON *item, char *buffer, const int length, const cJSON_bool format); +/* Delete a cJSON entity and all subentities. */ +CJSON_PUBLIC(void) cJSON_Delete(cJSON *item); + +/* Returns the number of items in an array (or object). */ +CJSON_PUBLIC(int) cJSON_GetArraySize(const cJSON *array); +/* Retrieve item number "index" from array "array". Returns NULL if unsuccessful. */ +CJSON_PUBLIC(cJSON *) cJSON_GetArrayItem(const cJSON *array, int index); +/* Get item "string" from object. Case insensitive. */ +CJSON_PUBLIC(cJSON *) cJSON_GetObjectItem(const cJSON * const object, const char * const string); +CJSON_PUBLIC(cJSON *) cJSON_GetObjectItemCaseSensitive(const cJSON * const object, const char * const string); +CJSON_PUBLIC(cJSON_bool) cJSON_HasObjectItem(const cJSON *object, const char *string); +/* For analysing failed parses. This returns a pointer to the parse error. You'll probably need to look a few chars back to make sense of it. Defined when cJSON_Parse() returns 0. 0 when cJSON_Parse() succeeds. */ +CJSON_PUBLIC(const char *) cJSON_GetErrorPtr(void); + +/* Check item type and return its value */ +CJSON_PUBLIC(char *) cJSON_GetStringValue(const cJSON * const item); +CJSON_PUBLIC(double) cJSON_GetNumberValue(const cJSON * const item); + +/* These functions check the type of an item */ +CJSON_PUBLIC(cJSON_bool) cJSON_IsInvalid(const cJSON * const item); +CJSON_PUBLIC(cJSON_bool) cJSON_IsFalse(const cJSON * const item); +CJSON_PUBLIC(cJSON_bool) cJSON_IsTrue(const cJSON * const item); +CJSON_PUBLIC(cJSON_bool) cJSON_IsBool(const cJSON * const item); +CJSON_PUBLIC(cJSON_bool) cJSON_IsNull(const cJSON * const item); +CJSON_PUBLIC(cJSON_bool) cJSON_IsNumber(const cJSON * const item); +CJSON_PUBLIC(cJSON_bool) cJSON_IsString(const cJSON * const item); +CJSON_PUBLIC(cJSON_bool) cJSON_IsArray(const cJSON * const item); +CJSON_PUBLIC(cJSON_bool) cJSON_IsObject(const cJSON * const item); +CJSON_PUBLIC(cJSON_bool) cJSON_IsRaw(const cJSON * const item); + +/* These calls create a cJSON item of the appropriate type. */ +CJSON_PUBLIC(cJSON *) cJSON_CreateNull(void); +CJSON_PUBLIC(cJSON *) cJSON_CreateTrue(void); +CJSON_PUBLIC(cJSON *) cJSON_CreateFalse(void); +CJSON_PUBLIC(cJSON *) cJSON_CreateBool(cJSON_bool boolean); +CJSON_PUBLIC(cJSON *) cJSON_CreateNumber(double num); +CJSON_PUBLIC(cJSON *) cJSON_CreateString(const char *string); +/* raw json */ +CJSON_PUBLIC(cJSON *) cJSON_CreateRaw(const char *raw); +CJSON_PUBLIC(cJSON *) cJSON_CreateArray(void); +CJSON_PUBLIC(cJSON *) cJSON_CreateObject(void); + +/* Create a string where valuestring references a string so + * it will not be freed by cJSON_Delete */ +CJSON_PUBLIC(cJSON *) cJSON_CreateStringReference(const char *string); +/* Create an object/array that only references it's elements so + * they will not be freed by cJSON_Delete */ +CJSON_PUBLIC(cJSON *) cJSON_CreateObjectReference(const cJSON *child); +CJSON_PUBLIC(cJSON *) cJSON_CreateArrayReference(const cJSON *child); + +/* These utilities create an Array of count items. + * The parameter count cannot be greater than the number of elements in the number array, otherwise array access will be out of bounds.*/ +CJSON_PUBLIC(cJSON *) cJSON_CreateIntArray(const int *numbers, int count); +CJSON_PUBLIC(cJSON *) cJSON_CreateFloatArray(const float *numbers, int count); +CJSON_PUBLIC(cJSON *) cJSON_CreateDoubleArray(const double *numbers, int count); +CJSON_PUBLIC(cJSON *) cJSON_CreateStringArray(const char *const *strings, int count); + +/* Append item to the specified array/object. */ +CJSON_PUBLIC(cJSON_bool) cJSON_AddItemToArray(cJSON *array, cJSON *item); +CJSON_PUBLIC(cJSON_bool) cJSON_AddItemToObject(cJSON *object, const char *string, cJSON *item); +/* Use this when string is definitely const (i.e. a literal, or as good as), and will definitely survive the cJSON object. + * WARNING: When this function was used, make sure to always check that (item->type & cJSON_StringIsConst) is zero before + * writing to `item->string` */ +CJSON_PUBLIC(cJSON_bool) cJSON_AddItemToObjectCS(cJSON *object, const char *string, cJSON *item); +/* Append reference to item to the specified array/object. Use this when you want to add an existing cJSON to a new cJSON, but don't want to corrupt your existing cJSON. */ +CJSON_PUBLIC(cJSON_bool) cJSON_AddItemReferenceToArray(cJSON *array, cJSON *item); +CJSON_PUBLIC(cJSON_bool) cJSON_AddItemReferenceToObject(cJSON *object, const char *string, cJSON *item); + +/* Remove/Detach items from Arrays/Objects. */ +CJSON_PUBLIC(cJSON *) cJSON_DetachItemViaPointer(cJSON *parent, cJSON * const item); +CJSON_PUBLIC(cJSON *) cJSON_DetachItemFromArray(cJSON *array, int which); +CJSON_PUBLIC(void) cJSON_DeleteItemFromArray(cJSON *array, int which); +CJSON_PUBLIC(cJSON *) cJSON_DetachItemFromObject(cJSON *object, const char *string); +CJSON_PUBLIC(cJSON *) cJSON_DetachItemFromObjectCaseSensitive(cJSON *object, const char *string); +CJSON_PUBLIC(void) cJSON_DeleteItemFromObject(cJSON *object, const char *string); +CJSON_PUBLIC(void) cJSON_DeleteItemFromObjectCaseSensitive(cJSON *object, const char *string); + +/* Update array items. */ +CJSON_PUBLIC(cJSON_bool) cJSON_InsertItemInArray(cJSON *array, int which, cJSON *newitem); /* Shifts pre-existing items to the right. */ +CJSON_PUBLIC(cJSON_bool) cJSON_ReplaceItemViaPointer(cJSON * const parent, cJSON * const item, cJSON * replacement); +CJSON_PUBLIC(cJSON_bool) cJSON_ReplaceItemInArray(cJSON *array, int which, cJSON *newitem); +CJSON_PUBLIC(cJSON_bool) cJSON_ReplaceItemInObject(cJSON *object,const char *string,cJSON *newitem); +CJSON_PUBLIC(cJSON_bool) cJSON_ReplaceItemInObjectCaseSensitive(cJSON *object,const char *string,cJSON *newitem); + +/* Duplicate a cJSON item */ +CJSON_PUBLIC(cJSON *) cJSON_Duplicate(const cJSON *item, cJSON_bool recurse); +/* Duplicate will create a new, identical cJSON item to the one you pass, in new memory that will + * need to be released. With recurse!=0, it will duplicate any children connected to the item. + * The item->next and ->prev pointers are always zero on return from Duplicate. */ +/* Recursively compare two cJSON items for equality. If either a or b is NULL or invalid, they will be considered unequal. + * case_sensitive determines if object keys are treated case sensitive (1) or case insensitive (0) */ +CJSON_PUBLIC(cJSON_bool) cJSON_Compare(const cJSON * const a, const cJSON * const b, const cJSON_bool case_sensitive); + +/* Minify a strings, remove blank characters(such as ' ', '\t', '\r', '\n') from strings. + * The input pointer json cannot point to a read-only address area, such as a string constant, + * but should point to a readable and writable address area. */ +CJSON_PUBLIC(void) cJSON_Minify(char *json); + +/* Helper functions for creating and adding items to an object at the same time. + * They return the added item or NULL on failure. */ +CJSON_PUBLIC(cJSON*) cJSON_AddNullToObject(cJSON * const object, const char * const name); +CJSON_PUBLIC(cJSON*) cJSON_AddTrueToObject(cJSON * const object, const char * const name); +CJSON_PUBLIC(cJSON*) cJSON_AddFalseToObject(cJSON * const object, const char * const name); +CJSON_PUBLIC(cJSON*) cJSON_AddBoolToObject(cJSON * const object, const char * const name, const cJSON_bool boolean); +CJSON_PUBLIC(cJSON*) cJSON_AddNumberToObject(cJSON * const object, const char * const name, const double number); +CJSON_PUBLIC(cJSON*) cJSON_AddStringToObject(cJSON * const object, const char * const name, const char * const string); +CJSON_PUBLIC(cJSON*) cJSON_AddRawToObject(cJSON * const object, const char * const name, const char * const raw); +CJSON_PUBLIC(cJSON*) cJSON_AddObjectToObject(cJSON * const object, const char * const name); +CJSON_PUBLIC(cJSON*) cJSON_AddArrayToObject(cJSON * const object, const char * const name); + +/* When assigning an integer value, it needs to be propagated to valuedouble too. */ +#define cJSON_SetIntValue(object, number) ((object) ? (object)->valueint = (object)->valuedouble = (number) : (number)) +/* helper for the cJSON_SetNumberValue macro */ +CJSON_PUBLIC(double) cJSON_SetNumberHelper(cJSON *object, double number); +#define cJSON_SetNumberValue(object, number) ((object != NULL) ? cJSON_SetNumberHelper(object, (double)number) : (number)) +/* Change the valuestring of a cJSON_String object, only takes effect when type of object is cJSON_String */ +CJSON_PUBLIC(char*) cJSON_SetValuestring(cJSON *object, const char *valuestring); + +/* If the object is not a boolean type this does nothing and returns cJSON_Invalid else it returns the new type*/ +#define cJSON_SetBoolValue(object, boolValue) ( \ + (object != NULL && ((object)->type & (cJSON_False|cJSON_True))) ? \ + (object)->type=((object)->type &(~(cJSON_False|cJSON_True)))|((boolValue)?cJSON_True:cJSON_False) : \ + cJSON_Invalid\ +) + +/* Macro for iterating over an array or object */ +#define cJSON_ArrayForEach(element, array) for(element = (array != NULL) ? (array)->child : NULL; element != NULL; element = element->next) + +/* malloc/free objects using the malloc/free functions that have been set with cJSON_InitHooks */ +CJSON_PUBLIC(void *) cJSON_malloc(size_t size); +CJSON_PUBLIC(void) cJSON_free(void *object); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/thirdparty/cjson/cJSON_Utils.c b/thirdparty/cjson/cJSON_Utils.c new file mode 100644 index 0000000..8fa24f8 --- /dev/null +++ b/thirdparty/cjson/cJSON_Utils.c @@ -0,0 +1,1481 @@ +/* + Copyright (c) 2009-2017 Dave Gamble and cJSON contributors + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + THE SOFTWARE. +*/ + +/* disable warnings about old C89 functions in MSVC */ +#if !defined(_CRT_SECURE_NO_DEPRECATE) && defined(_MSC_VER) +#define _CRT_SECURE_NO_DEPRECATE +#endif + +#ifdef __GNUCC__ +#pragma GCC visibility push(default) +#endif +#if defined(_MSC_VER) +#pragma warning (push) +/* disable warning about single line comments in system headers */ +#pragma warning (disable : 4001) +#endif + +#include +#include +#include +#include +#include +#include +#include +#include + +#if defined(_MSC_VER) +#pragma warning (pop) +#endif +#ifdef __GNUCC__ +#pragma GCC visibility pop +#endif + +#include "cJSON_Utils.h" + +/* define our own boolean type */ +#ifdef true +#undef true +#endif +#define true ((cJSON_bool)1) + +#ifdef false +#undef false +#endif +#define false ((cJSON_bool)0) + +static unsigned char* cJSONUtils_strdup(const unsigned char* const string) +{ + size_t length = 0; + unsigned char *copy = NULL; + + length = strlen((const char*)string) + sizeof(""); + copy = (unsigned char*) cJSON_malloc(length); + if (copy == NULL) + { + return NULL; + } + memcpy(copy, string, length); + + return copy; +} + +/* string comparison which doesn't consider NULL pointers equal */ +static int compare_strings(const unsigned char *string1, const unsigned char *string2, const cJSON_bool case_sensitive) +{ + if ((string1 == NULL) || (string2 == NULL)) + { + return 1; + } + + if (string1 == string2) + { + return 0; + } + + if (case_sensitive) + { + return strcmp((const char*)string1, (const char*)string2); + } + + for(; tolower(*string1) == tolower(*string2); (void)string1++, string2++) + { + if (*string1 == '\0') + { + return 0; + } + } + + return tolower(*string1) - tolower(*string2); +} + +/* securely comparison of floating-point variables */ +static cJSON_bool compare_double(double a, double b) +{ + double maxVal = fabs(a) > fabs(b) ? fabs(a) : fabs(b); + return (fabs(a - b) <= maxVal * DBL_EPSILON); +} + + +/* Compare the next path element of two JSON pointers, two NULL pointers are considered unequal: */ +static cJSON_bool compare_pointers(const unsigned char *name, const unsigned char *pointer, const cJSON_bool case_sensitive) +{ + if ((name == NULL) || (pointer == NULL)) + { + return false; + } + + for (; (*name != '\0') && (*pointer != '\0') && (*pointer != '/'); (void)name++, pointer++) /* compare until next '/' */ + { + if (*pointer == '~') + { + /* check for escaped '~' (~0) and '/' (~1) */ + if (((pointer[1] != '0') || (*name != '~')) && ((pointer[1] != '1') || (*name != '/'))) + { + /* invalid escape sequence or wrong character in *name */ + return false; + } + else + { + pointer++; + } + } + else if ((!case_sensitive && (tolower(*name) != tolower(*pointer))) || (case_sensitive && (*name != *pointer))) + { + return false; + } + } + if (((*pointer != 0) && (*pointer != '/')) != (*name != 0)) + { + /* one string has ended, the other not */ + return false;; + } + + return true; +} + +/* calculate the length of a string if encoded as JSON pointer with ~0 and ~1 escape sequences */ +static size_t pointer_encoded_length(const unsigned char *string) +{ + size_t length; + for (length = 0; *string != '\0'; (void)string++, length++) + { + /* character needs to be escaped? */ + if ((*string == '~') || (*string == '/')) + { + length++; + } + } + + return length; +} + +/* copy a string while escaping '~' and '/' with ~0 and ~1 JSON pointer escape codes */ +static void encode_string_as_pointer(unsigned char *destination, const unsigned char *source) +{ + for (; source[0] != '\0'; (void)source++, destination++) + { + if (source[0] == '/') + { + destination[0] = '~'; + destination[1] = '1'; + destination++; + } + else if (source[0] == '~') + { + destination[0] = '~'; + destination[1] = '0'; + destination++; + } + else + { + destination[0] = source[0]; + } + } + + destination[0] = '\0'; +} + +CJSON_PUBLIC(char *) cJSONUtils_FindPointerFromObjectTo(const cJSON * const object, const cJSON * const target) +{ + size_t child_index = 0; + cJSON *current_child = 0; + + if ((object == NULL) || (target == NULL)) + { + return NULL; + } + + if (object == target) + { + /* found */ + return (char*)cJSONUtils_strdup((const unsigned char*)""); + } + + /* recursively search all children of the object or array */ + for (current_child = object->child; current_child != NULL; (void)(current_child = current_child->next), child_index++) + { + unsigned char *target_pointer = (unsigned char*)cJSONUtils_FindPointerFromObjectTo(current_child, target); + /* found the target? */ + if (target_pointer != NULL) + { + if (cJSON_IsArray(object)) + { + /* reserve enough memory for a 64 bit integer + '/' and '\0' */ + unsigned char *full_pointer = (unsigned char*)cJSON_malloc(strlen((char*)target_pointer) + 20 + sizeof("/")); + /* check if conversion to unsigned long is valid + * This should be eliminated at compile time by dead code elimination + * if size_t is an alias of unsigned long, or if it is bigger */ + if (child_index > ULONG_MAX) + { + cJSON_free(target_pointer); + cJSON_free(full_pointer); + return NULL; + } + sprintf((char*)full_pointer, "/%lu%s", (unsigned long)child_index, target_pointer); /* / */ + cJSON_free(target_pointer); + + return (char*)full_pointer; + } + + if (cJSON_IsObject(object)) + { + unsigned char *full_pointer = (unsigned char*)cJSON_malloc(strlen((char*)target_pointer) + pointer_encoded_length((unsigned char*)current_child->string) + 2); + full_pointer[0] = '/'; + encode_string_as_pointer(full_pointer + 1, (unsigned char*)current_child->string); + strcat((char*)full_pointer, (char*)target_pointer); + cJSON_free(target_pointer); + + return (char*)full_pointer; + } + + /* reached leaf of the tree, found nothing */ + cJSON_free(target_pointer); + return NULL; + } + } + + /* not found */ + return NULL; +} + +/* non broken version of cJSON_GetArrayItem */ +static cJSON *get_array_item(const cJSON *array, size_t item) +{ + cJSON *child = array ? array->child : NULL; + while ((child != NULL) && (item > 0)) + { + item--; + child = child->next; + } + + return child; +} + +static cJSON_bool decode_array_index_from_pointer(const unsigned char * const pointer, size_t * const index) +{ + size_t parsed_index = 0; + size_t position = 0; + + if ((pointer[0] == '0') && ((pointer[1] != '\0') && (pointer[1] != '/'))) + { + /* leading zeroes are not permitted */ + return 0; + } + + for (position = 0; (pointer[position] >= '0') && (pointer[position] <= '9'); position++) + { + parsed_index = (10 * parsed_index) + (size_t)(pointer[position] - '0'); + + } + + if ((pointer[position] != '\0') && (pointer[position] != '/')) + { + return 0; + } + + *index = parsed_index; + + return 1; +} + +static cJSON *get_item_from_pointer(cJSON * const object, const char * pointer, const cJSON_bool case_sensitive) +{ + cJSON *current_element = object; + + if (pointer == NULL) + { + return NULL; + } + + /* follow path of the pointer */ + while ((pointer[0] == '/') && (current_element != NULL)) + { + pointer++; + if (cJSON_IsArray(current_element)) + { + size_t index = 0; + if (!decode_array_index_from_pointer((const unsigned char*)pointer, &index)) + { + return NULL; + } + + current_element = get_array_item(current_element, index); + } + else if (cJSON_IsObject(current_element)) + { + current_element = current_element->child; + /* GetObjectItem. */ + while ((current_element != NULL) && !compare_pointers((unsigned char*)current_element->string, (const unsigned char*)pointer, case_sensitive)) + { + current_element = current_element->next; + } + } + else + { + return NULL; + } + + /* skip to the next path token or end of string */ + while ((pointer[0] != '\0') && (pointer[0] != '/')) + { + pointer++; + } + } + + return current_element; +} + +CJSON_PUBLIC(cJSON *) cJSONUtils_GetPointer(cJSON * const object, const char *pointer) +{ + return get_item_from_pointer(object, pointer, false); +} + +CJSON_PUBLIC(cJSON *) cJSONUtils_GetPointerCaseSensitive(cJSON * const object, const char *pointer) +{ + return get_item_from_pointer(object, pointer, true); +} + +/* JSON Patch implementation. */ +static void decode_pointer_inplace(unsigned char *string) +{ + unsigned char *decoded_string = string; + + if (string == NULL) { + return; + } + + for (; *string; (void)decoded_string++, string++) + { + if (string[0] == '~') + { + if (string[1] == '0') + { + decoded_string[0] = '~'; + } + else if (string[1] == '1') + { + decoded_string[1] = '/'; + } + else + { + /* invalid escape sequence */ + return; + } + + string++; + } + } + + decoded_string[0] = '\0'; +} + +/* non-broken cJSON_DetachItemFromArray */ +static cJSON *detach_item_from_array(cJSON *array, size_t which) +{ + cJSON *c = array->child; + while (c && (which > 0)) + { + c = c->next; + which--; + } + if (!c) + { + /* item doesn't exist */ + return NULL; + } + if (c != array->child) + { + /* not the first element */ + c->prev->next = c->next; + } + if (c->next) + { + c->next->prev = c->prev; + } + if (c == array->child) + { + array->child = c->next; + } + else if (c->next == NULL) + { + array->child->prev = c->prev; + } + /* make sure the detached item doesn't point anywhere anymore */ + c->prev = c->next = NULL; + + return c; +} + +/* detach an item at the given path */ +static cJSON *detach_path(cJSON *object, const unsigned char *path, const cJSON_bool case_sensitive) +{ + unsigned char *parent_pointer = NULL; + unsigned char *child_pointer = NULL; + cJSON *parent = NULL; + cJSON *detached_item = NULL; + + /* copy path and split it in parent and child */ + parent_pointer = cJSONUtils_strdup(path); + if (parent_pointer == NULL) { + goto cleanup; + } + + child_pointer = (unsigned char*)strrchr((char*)parent_pointer, '/'); /* last '/' */ + if (child_pointer == NULL) + { + goto cleanup; + } + /* split strings */ + child_pointer[0] = '\0'; + child_pointer++; + + parent = get_item_from_pointer(object, (char*)parent_pointer, case_sensitive); + decode_pointer_inplace(child_pointer); + + if (cJSON_IsArray(parent)) + { + size_t index = 0; + if (!decode_array_index_from_pointer(child_pointer, &index)) + { + goto cleanup; + } + detached_item = detach_item_from_array(parent, index); + } + else if (cJSON_IsObject(parent)) + { + detached_item = cJSON_DetachItemFromObject(parent, (char*)child_pointer); + } + else + { + /* Couldn't find object to remove child from. */ + goto cleanup; + } + +cleanup: + if (parent_pointer != NULL) + { + cJSON_free(parent_pointer); + } + + return detached_item; +} + +/* sort lists using mergesort */ +static cJSON *sort_list(cJSON *list, const cJSON_bool case_sensitive) +{ + cJSON *first = list; + cJSON *second = list; + cJSON *current_item = list; + cJSON *result = list; + cJSON *result_tail = NULL; + + if ((list == NULL) || (list->next == NULL)) + { + /* One entry is sorted already. */ + return result; + } + + while ((current_item != NULL) && (current_item->next != NULL) && (compare_strings((unsigned char*)current_item->string, (unsigned char*)current_item->next->string, case_sensitive) < 0)) + { + /* Test for list sorted. */ + current_item = current_item->next; + } + if ((current_item == NULL) || (current_item->next == NULL)) + { + /* Leave sorted lists unmodified. */ + return result; + } + + /* reset pointer to the beginning */ + current_item = list; + while (current_item != NULL) + { + /* Walk two pointers to find the middle. */ + second = second->next; + current_item = current_item->next; + /* advances current_item two steps at a time */ + if (current_item != NULL) + { + current_item = current_item->next; + } + } + if ((second != NULL) && (second->prev != NULL)) + { + /* Split the lists */ + second->prev->next = NULL; + second->prev = NULL; + } + + /* Recursively sort the sub-lists. */ + first = sort_list(first, case_sensitive); + second = sort_list(second, case_sensitive); + result = NULL; + + /* Merge the sub-lists */ + while ((first != NULL) && (second != NULL)) + { + cJSON *smaller = NULL; + if (compare_strings((unsigned char*)first->string, (unsigned char*)second->string, case_sensitive) < 0) + { + smaller = first; + } + else + { + smaller = second; + } + + if (result == NULL) + { + /* start merged list with the smaller element */ + result_tail = smaller; + result = smaller; + } + else + { + /* add smaller element to the list */ + result_tail->next = smaller; + smaller->prev = result_tail; + result_tail = smaller; + } + + if (first == smaller) + { + first = first->next; + } + else + { + second = second->next; + } + } + + if (first != NULL) + { + /* Append rest of first list. */ + if (result == NULL) + { + return first; + } + result_tail->next = first; + first->prev = result_tail; + } + if (second != NULL) + { + /* Append rest of second list */ + if (result == NULL) + { + return second; + } + result_tail->next = second; + second->prev = result_tail; + } + + return result; +} + +static void sort_object(cJSON * const object, const cJSON_bool case_sensitive) +{ + if (object == NULL) + { + return; + } + object->child = sort_list(object->child, case_sensitive); +} + +static cJSON_bool compare_json(cJSON *a, cJSON *b, const cJSON_bool case_sensitive) +{ + if ((a == NULL) || (b == NULL) || ((a->type & 0xFF) != (b->type & 0xFF))) + { + /* mismatched type. */ + return false; + } + switch (a->type & 0xFF) + { + case cJSON_Number: + /* numeric mismatch. */ + if ((a->valueint != b->valueint) || (!compare_double(a->valuedouble, b->valuedouble))) + { + return false; + } + else + { + return true; + } + + case cJSON_String: + /* string mismatch. */ + if (strcmp(a->valuestring, b->valuestring) != 0) + { + return false; + } + else + { + return true; + } + + case cJSON_Array: + for ((void)(a = a->child), b = b->child; (a != NULL) && (b != NULL); (void)(a = a->next), b = b->next) + { + cJSON_bool identical = compare_json(a, b, case_sensitive); + if (!identical) + { + return false; + } + } + + /* array size mismatch? (one of both children is not NULL) */ + if ((a != NULL) || (b != NULL)) + { + return false; + } + else + { + return true; + } + + case cJSON_Object: + sort_object(a, case_sensitive); + sort_object(b, case_sensitive); + for ((void)(a = a->child), b = b->child; (a != NULL) && (b != NULL); (void)(a = a->next), b = b->next) + { + cJSON_bool identical = false; + /* compare object keys */ + if (compare_strings((unsigned char*)a->string, (unsigned char*)b->string, case_sensitive)) + { + /* missing member */ + return false; + } + identical = compare_json(a, b, case_sensitive); + if (!identical) + { + return false; + } + } + + /* object length mismatch (one of both children is not null) */ + if ((a != NULL) || (b != NULL)) + { + return false; + } + else + { + return true; + } + + default: + break; + } + + /* null, true or false */ + return true; +} + +/* non broken version of cJSON_InsertItemInArray */ +static cJSON_bool insert_item_in_array(cJSON *array, size_t which, cJSON *newitem) +{ + cJSON *child = array->child; + while (child && (which > 0)) + { + child = child->next; + which--; + } + if (which > 0) + { + /* item is after the end of the array */ + return 0; + } + if (child == NULL) + { + cJSON_AddItemToArray(array, newitem); + return 1; + } + + /* insert into the linked list */ + newitem->next = child; + newitem->prev = child->prev; + child->prev = newitem; + + /* was it at the beginning */ + if (child == array->child) + { + array->child = newitem; + } + else + { + newitem->prev->next = newitem; + } + + return 1; +} + +static cJSON *get_object_item(const cJSON * const object, const char* name, const cJSON_bool case_sensitive) +{ + if (case_sensitive) + { + return cJSON_GetObjectItemCaseSensitive(object, name); + } + + return cJSON_GetObjectItem(object, name); +} + +enum patch_operation { INVALID, ADD, REMOVE, REPLACE, MOVE, COPY, TEST }; + +static enum patch_operation decode_patch_operation(const cJSON * const patch, const cJSON_bool case_sensitive) +{ + cJSON *operation = get_object_item(patch, "op", case_sensitive); + if (!cJSON_IsString(operation)) + { + return INVALID; + } + + if (strcmp(operation->valuestring, "add") == 0) + { + return ADD; + } + + if (strcmp(operation->valuestring, "remove") == 0) + { + return REMOVE; + } + + if (strcmp(operation->valuestring, "replace") == 0) + { + return REPLACE; + } + + if (strcmp(operation->valuestring, "move") == 0) + { + return MOVE; + } + + if (strcmp(operation->valuestring, "copy") == 0) + { + return COPY; + } + + if (strcmp(operation->valuestring, "test") == 0) + { + return TEST; + } + + return INVALID; +} + +/* overwrite and existing item with another one and free resources on the way */ +static void overwrite_item(cJSON * const root, const cJSON replacement) +{ + if (root == NULL) + { + return; + } + + if (root->string != NULL) + { + cJSON_free(root->string); + } + if (root->valuestring != NULL) + { + cJSON_free(root->valuestring); + } + if (root->child != NULL) + { + cJSON_Delete(root->child); + } + + memcpy(root, &replacement, sizeof(cJSON)); +} + +static int apply_patch(cJSON *object, const cJSON *patch, const cJSON_bool case_sensitive) +{ + cJSON *path = NULL; + cJSON *value = NULL; + cJSON *parent = NULL; + enum patch_operation opcode = INVALID; + unsigned char *parent_pointer = NULL; + unsigned char *child_pointer = NULL; + int status = 0; + + path = get_object_item(patch, "path", case_sensitive); + if (!cJSON_IsString(path)) + { + /* malformed patch. */ + status = 2; + goto cleanup; + } + + opcode = decode_patch_operation(patch, case_sensitive); + if (opcode == INVALID) + { + status = 3; + goto cleanup; + } + else if (opcode == TEST) + { + /* compare value: {...} with the given path */ + status = !compare_json(get_item_from_pointer(object, path->valuestring, case_sensitive), get_object_item(patch, "value", case_sensitive), case_sensitive); + goto cleanup; + } + + /* special case for replacing the root */ + if (path->valuestring[0] == '\0') + { + if (opcode == REMOVE) + { + static const cJSON invalid = { NULL, NULL, NULL, cJSON_Invalid, NULL, 0, 0, NULL}; + + overwrite_item(object, invalid); + + status = 0; + goto cleanup; + } + + if ((opcode == REPLACE) || (opcode == ADD)) + { + value = get_object_item(patch, "value", case_sensitive); + if (value == NULL) + { + /* missing "value" for add/replace. */ + status = 7; + goto cleanup; + } + + value = cJSON_Duplicate(value, 1); + if (value == NULL) + { + /* out of memory for add/replace. */ + status = 8; + goto cleanup; + } + + overwrite_item(object, *value); + + /* delete the duplicated value */ + cJSON_free(value); + value = NULL; + + /* the string "value" isn't needed */ + if (object->string != NULL) + { + cJSON_free(object->string); + object->string = NULL; + } + + status = 0; + goto cleanup; + } + } + + if ((opcode == REMOVE) || (opcode == REPLACE)) + { + /* Get rid of old. */ + cJSON *old_item = detach_path(object, (unsigned char*)path->valuestring, case_sensitive); + if (old_item == NULL) + { + status = 13; + goto cleanup; + } + cJSON_Delete(old_item); + if (opcode == REMOVE) + { + /* For Remove, this job is done. */ + status = 0; + goto cleanup; + } + } + + /* Copy/Move uses "from". */ + if ((opcode == MOVE) || (opcode == COPY)) + { + cJSON *from = get_object_item(patch, "from", case_sensitive); + if (from == NULL) + { + /* missing "from" for copy/move. */ + status = 4; + goto cleanup; + } + + if (opcode == MOVE) + { + value = detach_path(object, (unsigned char*)from->valuestring, case_sensitive); + } + if (opcode == COPY) + { + value = get_item_from_pointer(object, from->valuestring, case_sensitive); + } + if (value == NULL) + { + /* missing "from" for copy/move. */ + status = 5; + goto cleanup; + } + if (opcode == COPY) + { + value = cJSON_Duplicate(value, 1); + } + if (value == NULL) + { + /* out of memory for copy/move. */ + status = 6; + goto cleanup; + } + } + else /* Add/Replace uses "value". */ + { + value = get_object_item(patch, "value", case_sensitive); + if (value == NULL) + { + /* missing "value" for add/replace. */ + status = 7; + goto cleanup; + } + value = cJSON_Duplicate(value, 1); + if (value == NULL) + { + /* out of memory for add/replace. */ + status = 8; + goto cleanup; + } + } + + /* Now, just add "value" to "path". */ + + /* split pointer in parent and child */ + parent_pointer = cJSONUtils_strdup((unsigned char*)path->valuestring); + if (parent_pointer) { + child_pointer = (unsigned char*)strrchr((char*)parent_pointer, '/'); + } + if (child_pointer != NULL) + { + child_pointer[0] = '\0'; + child_pointer++; + } + parent = get_item_from_pointer(object, (char*)parent_pointer, case_sensitive); + decode_pointer_inplace(child_pointer); + + /* add, remove, replace, move, copy, test. */ + if ((parent == NULL) || (child_pointer == NULL)) + { + /* Couldn't find object to add to. */ + status = 9; + goto cleanup; + } + else if (cJSON_IsArray(parent)) + { + if (strcmp((char*)child_pointer, "-") == 0) + { + cJSON_AddItemToArray(parent, value); + value = NULL; + } + else + { + size_t index = 0; + if (!decode_array_index_from_pointer(child_pointer, &index)) + { + status = 11; + goto cleanup; + } + + if (!insert_item_in_array(parent, index, value)) + { + status = 10; + goto cleanup; + } + value = NULL; + } + } + else if (cJSON_IsObject(parent)) + { + if (case_sensitive) + { + cJSON_DeleteItemFromObjectCaseSensitive(parent, (char*)child_pointer); + } + else + { + cJSON_DeleteItemFromObject(parent, (char*)child_pointer); + } + cJSON_AddItemToObject(parent, (char*)child_pointer, value); + value = NULL; + } + else /* parent is not an object */ + { + /* Couldn't find object to add to. */ + status = 9; + goto cleanup; + } + +cleanup: + if (value != NULL) + { + cJSON_Delete(value); + } + if (parent_pointer != NULL) + { + cJSON_free(parent_pointer); + } + + return status; +} + +CJSON_PUBLIC(int) cJSONUtils_ApplyPatches(cJSON * const object, const cJSON * const patches) +{ + const cJSON *current_patch = NULL; + int status = 0; + + if (!cJSON_IsArray(patches)) + { + /* malformed patches. */ + return 1; + } + + if (patches != NULL) + { + current_patch = patches->child; + } + + while (current_patch != NULL) + { + status = apply_patch(object, current_patch, false); + if (status != 0) + { + return status; + } + current_patch = current_patch->next; + } + + return 0; +} + +CJSON_PUBLIC(int) cJSONUtils_ApplyPatchesCaseSensitive(cJSON * const object, const cJSON * const patches) +{ + const cJSON *current_patch = NULL; + int status = 0; + + if (!cJSON_IsArray(patches)) + { + /* malformed patches. */ + return 1; + } + + if (patches != NULL) + { + current_patch = patches->child; + } + + while (current_patch != NULL) + { + status = apply_patch(object, current_patch, true); + if (status != 0) + { + return status; + } + current_patch = current_patch->next; + } + + return 0; +} + +static void compose_patch(cJSON * const patches, const unsigned char * const operation, const unsigned char * const path, const unsigned char *suffix, const cJSON * const value) +{ + cJSON *patch = NULL; + + if ((patches == NULL) || (operation == NULL) || (path == NULL)) + { + return; + } + + patch = cJSON_CreateObject(); + if (patch == NULL) + { + return; + } + cJSON_AddItemToObject(patch, "op", cJSON_CreateString((const char*)operation)); + + if (suffix == NULL) + { + cJSON_AddItemToObject(patch, "path", cJSON_CreateString((const char*)path)); + } + else + { + size_t suffix_length = pointer_encoded_length(suffix); + size_t path_length = strlen((const char*)path); + unsigned char *full_path = (unsigned char*)cJSON_malloc(path_length + suffix_length + sizeof("/")); + + sprintf((char*)full_path, "%s/", (const char*)path); + encode_string_as_pointer(full_path + path_length + 1, suffix); + + cJSON_AddItemToObject(patch, "path", cJSON_CreateString((const char*)full_path)); + cJSON_free(full_path); + } + + if (value != NULL) + { + cJSON_AddItemToObject(patch, "value", cJSON_Duplicate(value, 1)); + } + cJSON_AddItemToArray(patches, patch); +} + +CJSON_PUBLIC(void) cJSONUtils_AddPatchToArray(cJSON * const array, const char * const operation, const char * const path, const cJSON * const value) +{ + compose_patch(array, (const unsigned char*)operation, (const unsigned char*)path, NULL, value); +} + +static void create_patches(cJSON * const patches, const unsigned char * const path, cJSON * const from, cJSON * const to, const cJSON_bool case_sensitive) +{ + if ((from == NULL) || (to == NULL)) + { + return; + } + + if ((from->type & 0xFF) != (to->type & 0xFF)) + { + compose_patch(patches, (const unsigned char*)"replace", path, 0, to); + return; + } + + switch (from->type & 0xFF) + { + case cJSON_Number: + if ((from->valueint != to->valueint) || !compare_double(from->valuedouble, to->valuedouble)) + { + compose_patch(patches, (const unsigned char*)"replace", path, NULL, to); + } + return; + + case cJSON_String: + if (strcmp(from->valuestring, to->valuestring) != 0) + { + compose_patch(patches, (const unsigned char*)"replace", path, NULL, to); + } + return; + + case cJSON_Array: + { + size_t index = 0; + cJSON *from_child = from->child; + cJSON *to_child = to->child; + unsigned char *new_path = (unsigned char*)cJSON_malloc(strlen((const char*)path) + 20 + sizeof("/")); /* Allow space for 64bit int. log10(2^64) = 20 */ + + /* generate patches for all array elements that exist in both "from" and "to" */ + for (index = 0; (from_child != NULL) && (to_child != NULL); (void)(from_child = from_child->next), (void)(to_child = to_child->next), index++) + { + /* check if conversion to unsigned long is valid + * This should be eliminated at compile time by dead code elimination + * if size_t is an alias of unsigned long, or if it is bigger */ + if (index > ULONG_MAX) + { + cJSON_free(new_path); + return; + } + sprintf((char*)new_path, "%s/%lu", path, (unsigned long)index); /* path of the current array element */ + create_patches(patches, new_path, from_child, to_child, case_sensitive); + } + + /* remove leftover elements from 'from' that are not in 'to' */ + for (; (from_child != NULL); (void)(from_child = from_child->next)) + { + /* check if conversion to unsigned long is valid + * This should be eliminated at compile time by dead code elimination + * if size_t is an alias of unsigned long, or if it is bigger */ + if (index > ULONG_MAX) + { + cJSON_free(new_path); + return; + } + sprintf((char*)new_path, "%lu", (unsigned long)index); + compose_patch(patches, (const unsigned char*)"remove", path, new_path, NULL); + } + /* add new elements in 'to' that were not in 'from' */ + for (; (to_child != NULL); (void)(to_child = to_child->next), index++) + { + compose_patch(patches, (const unsigned char*)"add", path, (const unsigned char*)"-", to_child); + } + cJSON_free(new_path); + return; + } + + case cJSON_Object: + { + cJSON *from_child = NULL; + cJSON *to_child = NULL; + sort_object(from, case_sensitive); + sort_object(to, case_sensitive); + + from_child = from->child; + to_child = to->child; + /* for all object values in the object with more of them */ + while ((from_child != NULL) || (to_child != NULL)) + { + int diff; + if (from_child == NULL) + { + diff = 1; + } + else if (to_child == NULL) + { + diff = -1; + } + else + { + diff = compare_strings((unsigned char*)from_child->string, (unsigned char*)to_child->string, case_sensitive); + } + + if (diff == 0) + { + /* both object keys are the same */ + size_t path_length = strlen((const char*)path); + size_t from_child_name_length = pointer_encoded_length((unsigned char*)from_child->string); + unsigned char *new_path = (unsigned char*)cJSON_malloc(path_length + from_child_name_length + sizeof("/")); + + sprintf((char*)new_path, "%s/", path); + encode_string_as_pointer(new_path + path_length + 1, (unsigned char*)from_child->string); + + /* create a patch for the element */ + create_patches(patches, new_path, from_child, to_child, case_sensitive); + cJSON_free(new_path); + + from_child = from_child->next; + to_child = to_child->next; + } + else if (diff < 0) + { + /* object element doesn't exist in 'to' --> remove it */ + compose_patch(patches, (const unsigned char*)"remove", path, (unsigned char*)from_child->string, NULL); + + from_child = from_child->next; + } + else + { + /* object element doesn't exist in 'from' --> add it */ + compose_patch(patches, (const unsigned char*)"add", path, (unsigned char*)to_child->string, to_child); + + to_child = to_child->next; + } + } + return; + } + + default: + break; + } +} + +CJSON_PUBLIC(cJSON *) cJSONUtils_GeneratePatches(cJSON * const from, cJSON * const to) +{ + cJSON *patches = NULL; + + if ((from == NULL) || (to == NULL)) + { + return NULL; + } + + patches = cJSON_CreateArray(); + create_patches(patches, (const unsigned char*)"", from, to, false); + + return patches; +} + +CJSON_PUBLIC(cJSON *) cJSONUtils_GeneratePatchesCaseSensitive(cJSON * const from, cJSON * const to) +{ + cJSON *patches = NULL; + + if ((from == NULL) || (to == NULL)) + { + return NULL; + } + + patches = cJSON_CreateArray(); + create_patches(patches, (const unsigned char*)"", from, to, true); + + return patches; +} + +CJSON_PUBLIC(void) cJSONUtils_SortObject(cJSON * const object) +{ + sort_object(object, false); +} + +CJSON_PUBLIC(void) cJSONUtils_SortObjectCaseSensitive(cJSON * const object) +{ + sort_object(object, true); +} + +static cJSON *merge_patch(cJSON *target, const cJSON * const patch, const cJSON_bool case_sensitive) +{ + cJSON *patch_child = NULL; + + if (!cJSON_IsObject(patch)) + { + /* scalar value, array or NULL, just duplicate */ + cJSON_Delete(target); + return cJSON_Duplicate(patch, 1); + } + + if (!cJSON_IsObject(target)) + { + cJSON_Delete(target); + target = cJSON_CreateObject(); + } + + patch_child = patch->child; + while (patch_child != NULL) + { + if (cJSON_IsNull(patch_child)) + { + /* NULL is the indicator to remove a value, see RFC7396 */ + if (case_sensitive) + { + cJSON_DeleteItemFromObjectCaseSensitive(target, patch_child->string); + } + else + { + cJSON_DeleteItemFromObject(target, patch_child->string); + } + } + else + { + cJSON *replace_me = NULL; + cJSON *replacement = NULL; + + if (case_sensitive) + { + replace_me = cJSON_DetachItemFromObjectCaseSensitive(target, patch_child->string); + } + else + { + replace_me = cJSON_DetachItemFromObject(target, patch_child->string); + } + + replacement = merge_patch(replace_me, patch_child, case_sensitive); + if (replacement == NULL) + { + cJSON_Delete(target); + return NULL; + } + + cJSON_AddItemToObject(target, patch_child->string, replacement); + } + patch_child = patch_child->next; + } + return target; +} + +CJSON_PUBLIC(cJSON *) cJSONUtils_MergePatch(cJSON *target, const cJSON * const patch) +{ + return merge_patch(target, patch, false); +} + +CJSON_PUBLIC(cJSON *) cJSONUtils_MergePatchCaseSensitive(cJSON *target, const cJSON * const patch) +{ + return merge_patch(target, patch, true); +} + +static cJSON *generate_merge_patch(cJSON * const from, cJSON * const to, const cJSON_bool case_sensitive) +{ + cJSON *from_child = NULL; + cJSON *to_child = NULL; + cJSON *patch = NULL; + if (to == NULL) + { + /* patch to delete everything */ + return cJSON_CreateNull(); + } + if (!cJSON_IsObject(to) || !cJSON_IsObject(from)) + { + return cJSON_Duplicate(to, 1); + } + + sort_object(from, case_sensitive); + sort_object(to, case_sensitive); + + from_child = from->child; + to_child = to->child; + patch = cJSON_CreateObject(); + if (patch == NULL) + { + return NULL; + } + while (from_child || to_child) + { + int diff; + if (from_child != NULL) + { + if (to_child != NULL) + { + diff = strcmp(from_child->string, to_child->string); + } + else + { + diff = -1; + } + } + else + { + diff = 1; + } + + if (diff < 0) + { + /* from has a value that to doesn't have -> remove */ + cJSON_AddItemToObject(patch, from_child->string, cJSON_CreateNull()); + + from_child = from_child->next; + } + else if (diff > 0) + { + /* to has a value that from doesn't have -> add to patch */ + cJSON_AddItemToObject(patch, to_child->string, cJSON_Duplicate(to_child, 1)); + + to_child = to_child->next; + } + else + { + /* object key exists in both objects */ + if (!compare_json(from_child, to_child, case_sensitive)) + { + /* not identical --> generate a patch */ + cJSON_AddItemToObject(patch, to_child->string, cJSONUtils_GenerateMergePatch(from_child, to_child)); + } + + /* next key in the object */ + from_child = from_child->next; + to_child = to_child->next; + } + } + if (patch->child == NULL) + { + /* no patch generated */ + cJSON_Delete(patch); + return NULL; + } + + return patch; +} + +CJSON_PUBLIC(cJSON *) cJSONUtils_GenerateMergePatch(cJSON * const from, cJSON * const to) +{ + return generate_merge_patch(from, to, false); +} + +CJSON_PUBLIC(cJSON *) cJSONUtils_GenerateMergePatchCaseSensitive(cJSON * const from, cJSON * const to) +{ + return generate_merge_patch(from, to, true); +} diff --git a/thirdparty/cjson/cJSON_Utils.h b/thirdparty/cjson/cJSON_Utils.h new file mode 100644 index 0000000..a970c65 --- /dev/null +++ b/thirdparty/cjson/cJSON_Utils.h @@ -0,0 +1,88 @@ +/* + Copyright (c) 2009-2017 Dave Gamble and cJSON contributors + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + THE SOFTWARE. +*/ + +#ifndef cJSON_Utils__h +#define cJSON_Utils__h + +#ifdef __cplusplus +extern "C" +{ +#endif + +#include "cJSON.h" + +/* Implement RFC6901 (https://tools.ietf.org/html/rfc6901) JSON Pointer spec. */ +CJSON_PUBLIC(cJSON *) cJSONUtils_GetPointer(cJSON * const object, const char *pointer); +CJSON_PUBLIC(cJSON *) cJSONUtils_GetPointerCaseSensitive(cJSON * const object, const char *pointer); + +/* Implement RFC6902 (https://tools.ietf.org/html/rfc6902) JSON Patch spec. */ +/* NOTE: This modifies objects in 'from' and 'to' by sorting the elements by their key */ +CJSON_PUBLIC(cJSON *) cJSONUtils_GeneratePatches(cJSON * const from, cJSON * const to); +CJSON_PUBLIC(cJSON *) cJSONUtils_GeneratePatchesCaseSensitive(cJSON * const from, cJSON * const to); +/* Utility for generating patch array entries. */ +CJSON_PUBLIC(void) cJSONUtils_AddPatchToArray(cJSON * const array, const char * const operation, const char * const path, const cJSON * const value); +/* Returns 0 for success. */ +CJSON_PUBLIC(int) cJSONUtils_ApplyPatches(cJSON * const object, const cJSON * const patches); +CJSON_PUBLIC(int) cJSONUtils_ApplyPatchesCaseSensitive(cJSON * const object, const cJSON * const patches); + +/* +// Note that ApplyPatches is NOT atomic on failure. To implement an atomic ApplyPatches, use: +//int cJSONUtils_AtomicApplyPatches(cJSON **object, cJSON *patches) +//{ +// cJSON *modme = cJSON_Duplicate(*object, 1); +// int error = cJSONUtils_ApplyPatches(modme, patches); +// if (!error) +// { +// cJSON_Delete(*object); +// *object = modme; +// } +// else +// { +// cJSON_Delete(modme); +// } +// +// return error; +//} +// Code not added to library since this strategy is a LOT slower. +*/ + +/* Implement RFC7386 (https://tools.ietf.org/html/rfc7396) JSON Merge Patch spec. */ +/* target will be modified by patch. return value is new ptr for target. */ +CJSON_PUBLIC(cJSON *) cJSONUtils_MergePatch(cJSON *target, const cJSON * const patch); +CJSON_PUBLIC(cJSON *) cJSONUtils_MergePatchCaseSensitive(cJSON *target, const cJSON * const patch); +/* generates a patch to move from -> to */ +/* NOTE: This modifies objects in 'from' and 'to' by sorting the elements by their key */ +CJSON_PUBLIC(cJSON *) cJSONUtils_GenerateMergePatch(cJSON * const from, cJSON * const to); +CJSON_PUBLIC(cJSON *) cJSONUtils_GenerateMergePatchCaseSensitive(cJSON * const from, cJSON * const to); + +/* Given a root object and a target object, construct a pointer from one to the other. */ +CJSON_PUBLIC(char *) cJSONUtils_FindPointerFromObjectTo(const cJSON * const object, const cJSON * const target); + +/* Sorts the members of the object into alphabetical order. */ +CJSON_PUBLIC(void) cJSONUtils_SortObject(cJSON * const object); +CJSON_PUBLIC(void) cJSONUtils_SortObjectCaseSensitive(cJSON * const object); + +#ifdef __cplusplus +} +#endif + +#endif From 6ed81d2abc06f8a7e91cf50f3538bd4e180f980a Mon Sep 17 00:00:00 2001 From: MilesGlitch Date: Thu, 3 Sep 2026 01:19:55 +0300 Subject: [PATCH 06/61] u --- CMakeLists.txt | 13 +- CMakeSettings.json | 106 ++++++++-- compile_flags.txt | 3 - disasterserver/CMakeLists.txt | 12 +- disasterserver/Colors.hpp | 16 -- disasterserver/ConfigManager.cpp | 131 ------------- disasterserver/ConfigManager.hpp | 52 ----- disasterserver/{ => Core}/Api.hpp | 0 disasterserver/{ => Core}/Log.cpp | 0 disasterserver/{ => Core}/Log.hpp | 2 +- disasterserver/Core/Packet.cpp | 187 ++++++++++++++++++ disasterserver/{Io => Core}/Packet.hpp | 63 +++--- disasterserver/{ => Core}/Singleton.hpp | 1 + disasterserver/DisasterServer.cpp | 52 ----- disasterserver/DisasterServer.hpp | 41 ---- disasterserver/Io/Packet.cpp | 251 ------------------------ disasterserver/Io/Threads.hpp | 57 ------ disasterserver/Main.cpp | 14 +- disasterserver/Peer.cpp | 13 ++ disasterserver/Peer.hpp | 49 +++++ disasterserver/Player.cpp | 1 - disasterserver/Player.hpp | 75 ------- disasterserver/Server.cpp | 168 ++++++---------- disasterserver/Server.hpp | 125 +++--------- disasterserver/Util/Math.cpp | 23 --- disasterserver/Util/Math.hpp | 20 -- disasterserver/Util/String.hpp | 12 -- disasterserver/Util/Time.cpp | 49 ----- disasterserver/Util/Time.hpp | 17 -- disasterserver_c/Auth.c | 2 +- disasterserver_c/Server.c | 24 +-- resources/isiskdjdnd.png | Bin 0 -> 804 bytes vcpkg.json | 9 + 33 files changed, 496 insertions(+), 1092 deletions(-) delete mode 100644 compile_flags.txt delete mode 100644 disasterserver/Colors.hpp delete mode 100644 disasterserver/ConfigManager.cpp delete mode 100644 disasterserver/ConfigManager.hpp rename disasterserver/{ => Core}/Api.hpp (100%) rename disasterserver/{ => Core}/Log.cpp (100%) rename disasterserver/{ => Core}/Log.hpp (98%) create mode 100644 disasterserver/Core/Packet.cpp rename disasterserver/{Io => Core}/Packet.hpp (80%) rename disasterserver/{ => Core}/Singleton.hpp (96%) delete mode 100644 disasterserver/DisasterServer.cpp delete mode 100644 disasterserver/DisasterServer.hpp delete mode 100644 disasterserver/Io/Packet.cpp delete mode 100644 disasterserver/Io/Threads.hpp create mode 100644 disasterserver/Peer.cpp create mode 100644 disasterserver/Peer.hpp delete mode 100644 disasterserver/Player.cpp delete mode 100644 disasterserver/Player.hpp delete mode 100644 disasterserver/Util/Math.cpp delete mode 100644 disasterserver/Util/Math.hpp delete mode 100644 disasterserver/Util/String.hpp delete mode 100644 disasterserver/Util/Time.cpp delete mode 100644 disasterserver/Util/Time.hpp create mode 100644 resources/isiskdjdnd.png create mode 100644 vcpkg.json diff --git a/CMakeLists.txt b/CMakeLists.txt index 505e761..a0e0a40 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,17 +1,6 @@ -cmake_minimum_required(VERSION 3.16.3) +cmake_minimum_required(VERSION 3.30) project(DisasterServer CXX C) -if (POLICY CMP0141) - cmake_policy(SET CMP0141 NEW) - set(CMAKE_MSVC_DEBUG_INFORMATION_FORMAT "$,$>,$<$:EditAndContinue>,$<$:ProgramDatabase>>") -endif() - -if((CMAKE_C_COMPILER_ID STREQUAL "Clang" OR CMAKE_C_COMPILER_ID STREQUAL "GNU")) - set(CMAKE_C_FLAGS_DEBUG "-g") - set(CMAKE_C_FLAGS_RELEASE "-O3") - message("Clang/GCC flags applied") -endif() - include(TestBigEndian) TEST_BIG_ENDIAN(IS_BIG_ENDIAN) diff --git a/CMakeSettings.json b/CMakeSettings.json index b81ead1..387eb14 100644 --- a/CMakeSettings.json +++ b/CMakeSettings.json @@ -1,26 +1,98 @@ { "configurations": [ { - "name": "x64-Debug", + "name": "base", + "hidden": true, "generator": "Ninja", - "configurationType": "Debug", - "inheritEnvironments": [ "msvc_x64_x64" ], - "buildRoot": "${projectDir}\\out\\build\\${name}", - "installRoot": "${projectDir}\\out\\install\\${name}", - "cmakeCommandArgs": "", - "buildCommandArgs": "", - "ctestCommandArgs": "" + "toolchainFile": "$env{VCPKG_ROOT}/scripts/buildsystems/vcpkg.cmake", + "cacheVariables": { + "VCPKG_TARGET_TRIPLET": "x64-windows-static" + }, + + "vendor": { + "microsoft.com/VisualStudioRemoteSettings/CMake/2.0": { + "sourceRootDir": "$ms{localSourceDir}\\..", + "remoteSourceRootDir": "$env{HOME}/.vs/wsl", + "copySourcesOptions": { + "method": "rsync", + "exclusionList": [ ".vs", ".git", "out", "dist", "attic", "build" ] + } + } + } }, + { - "name": "x64-Release", - "generator": "Ninja", - "configurationType": "RelWithDebInfo", - "buildRoot": "${projectDir}\\out\\build\\${name}", - "installRoot": "${projectDir}\\out\\install\\${name}", - "cmakeCommandArgs": "", - "buildCommandArgs": "", - "ctestCommandArgs": "", - "inheritEnvironments": [ "msvc_x64_x64" ] + "inherits": "base", + "name": "windows-release", + "displayName": "Windows (Release)", + "binaryDir": "${sourceDir}/build/windows-release", + "installDir": "${sourceDir}/build/windows-release/install", + "cacheVariables": { + "CMAKE_BUILD_TYPE": "Release", + "CMAKE_C_COMPILER": "cl.exe", + "CMAKE_CXX_COMPILER": "cl.exe", + "CMAKE_MSVC_RUNTIME_LIBRARY": "MultiThreaded$<$:Debug>DLL" + }, + "vendor": { + "microsoft.com/VisualStudioSettings/CMake/1.0": { + "hostOS": [ "Windows" ] + } + } + }, + { + "inherits": "base", + "name": "windows-debug", + "displayName": "Windows (Debug)", + "binaryDir": "${sourceDir}/build/windows-debug", + "installDir": "${sourceDir}/build/windows-debug/install", + "cacheVariables": { + "CMAKE_BUILD_TYPE": "Debug", + "CMAKE_C_COMPILER": "cl.exe", + "CMAKE_CXX_COMPILER": "cl.exe", + "CMAKE_MSVC_RUNTIME_LIBRARY": "MultiThreaded$<$:Debug>DLL" + }, + "vendor": { + "microsoft.com/VisualStudioSettings/CMake/1.0": { + "hostOS": [ "Windows" ] + } + } + }, + + { + "inherits": "base", + "name": "windows-clang-release", + "displayName": "Windows Clang (Release)", + "binaryDir": "${sourceDir}/build/windows-clang-release", + "installDir": "${sourceDir}/build/windows-clang-release/install", + "cacheVariables": { + "CMAKE_BUILD_TYPE": "Release", + "CMAKE_C_COMPILER": "clang.exe", + "CMAKE_CXX_COMPILER": "clang++.exe", + "CMAKE_MSVC_RUNTIME_LIBRARY": "MultiThreaded$<$:Debug>DLL" + }, + "vendor": { + "microsoft.com/VisualStudioSettings/CMake/1.0": { + "hostOS": [ "Windows" ] + } + } + }, + { + "inherits": "base", + "name": "windows-clang-debug", + "displayName": "Windows Clang (Debug)", + "binaryDir": "${sourceDir}/build/windows-clang-debug", + "installDir": "${sourceDir}/build/windows-clang-debug/install", + "cacheVariables": { + "CMAKE_BUILD_TYPE": "Debug", + "CMAKE_C_COMPILER": "clang.exe", + "CMAKE_CXX_COMPILER": "clang++.exe", + "CMAKE_MSVC_RUNTIME_LIBRARY": "MultiThreaded$<$:Debug>DLL" + }, + "vendor": { + "microsoft.com/VisualStudioSettings/CMake/1.0": { + "hostOS": [ "Windows" ] + } + } } ] } \ No newline at end of file diff --git a/compile_flags.txt b/compile_flags.txt deleted file mode 100644 index d15ddaf..0000000 --- a/compile_flags.txt +++ /dev/null @@ -1,3 +0,0 @@ --I./include --I/usr/local/include --IC:\vcpkg\installed\x64-windows\include \ No newline at end of file diff --git a/disasterserver/CMakeLists.txt b/disasterserver/CMakeLists.txt index e2c59bb..876f395 100644 --- a/disasterserver/CMakeLists.txt +++ b/disasterserver/CMakeLists.txt @@ -1,22 +1,24 @@ file(GLOB_RECURSE SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/*.cpp) +find_package(Boost REQUIRED COMPONENTS smart_ptr asio bind) + if(ANDROID) add_library(DisasterServerCXX SHARED "Android.cpp" ${SOURCES}) set(THREADS_PREFER_PTHREAD_FLAG ON) find_package(Threads REQUIRED) target_include_directories(DisasterServerCXX PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}) - target_link_libraries(DisasterServerCXX PRIVATE cJSON log enet m Threads::Threads) + target_link_libraries(DisasterServerCXX PRIVATE cJSON log Boost::smart_ptr Boost::asio Boost::bind m Threads::Threads) else() if(DYLIB) # Build .dll or .so add_library(DisasterServerCXX SHARED ${SOURCES}) if (WIN32) - target_link_libraries(DisasterServerCXX PRIVATE cJSON enet ws2_32 winmm dbghelp) + target_link_libraries(DisasterServerCXX PRIVATE cJSON Boost::smart_ptr Boost::asio Boost::bind ws2_32 winmm dbghelp) else() # UNIX set(THREADS_PREFER_PTHREAD_FLAG ON) find_package(Threads REQUIRED) - target_link_libraries(DisasterServerCXX PRIVATE cJSON enet m Threads::Threads) + target_link_libraries(DisasterServerCXX PRIVATE cJSON Boost::smart_ptr Boost::asio Boost::bind m Threads::Threads) endif() target_include_directories(DisasterServerCXX PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}) @@ -79,11 +81,11 @@ else() ) if (WIN32) - target_link_libraries(DisasterServerCXX PRIVATE cJSON enet ws2_32 winmm dbghelp) + target_link_libraries(DisasterServerCXX PRIVATE cJSON Boost::smart_ptr Boost::asio Boost::bind ws2_32 winmm dbghelp) else() # UNIX set(THREADS_PREFER_PTHREAD_FLAG ON) find_package(Threads REQUIRED) - target_link_libraries(DisasterServerCXX PRIVATE cJSON enet m Threads::Threads) + target_link_libraries(DisasterServerCXX PRIVATE cJSON Boost::smart_ptr Boost::asio Boost::bind m Threads::Threads) endif() target_include_directories(DisasterServerCXX PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}) diff --git a/disasterserver/Colors.hpp b/disasterserver/Colors.hpp deleted file mode 100644 index 723e174..0000000 --- a/disasterserver/Colors.hpp +++ /dev/null @@ -1,16 +0,0 @@ -#ifndef COLORS_HPP -#define COLORS_HPP - -#define CLRCODE_RED "\\" -#define CLRCODE_GRN "@" -#define CLRCODE_PUR "&" -#define CLRCODE_BLU "/" -#define CLRCODE_GRA "|" -#define CLRCODE_YLW "`" -#define CLRCODE_ORG "\xE2\x84\x96" -#define CLRCODE_RST "~" - -#define CLRLIST { CLRCODE_RED, CLRCODE_GRN, CLRCODE_PUR, CLRCODE_BLU, CLRCODE_GRA, CLRCODE_YLW, CLRCODE_ORG, CLRCODE_RST } -#define CLRLIST_LEN 8 - -#endif //COLORS_HPP diff --git a/disasterserver/ConfigManager.cpp b/disasterserver/ConfigManager.cpp deleted file mode 100644 index 8255281..0000000 --- a/disasterserver/ConfigManager.cpp +++ /dev/null @@ -1,131 +0,0 @@ -#include "ConfigManager.hpp" - -#include - -#include "Log.hpp" - -ConfigManager::ConfigManager() = default; - -ConfigManager::~ConfigManager() = default; - -bool ConfigManager::loadConfig() { - FilePtr file; - fopen_s(&file, "config.txt", "r"); - - if (!file) { - RAssert(saveConfig()); - - fopen_s(&file, CONFIG_FILE, "r"); - if (!file) { - Warn("Failed to save default config file properly!"); - } - } - - char buffer[0x800] = {}; - size_t len = fread(buffer, 1, 0x800, file); - fclose(file); - - cJSON* rootObject = cJSON_ParseWithLength(buffer, len); - if (!rootObject) { - Err("Failed to parse {}: {}", CONFIG_FILE, cJSON_GetErrorPtr()); - return false; - } - - Debug("{} loaded.", CONFIG_FILE); - - cJSON *networkObject = cJSON_GetObjectItemCaseSensitive(rootObject, "network"); - if (cJSON_IsObject(networkObject) && !cJSON_IsNull(networkObject)) { - cJSON *port = cJSON_GetObjectItem(networkObject, "port"); - cJSON *server_count = cJSON_GetObjectItem(networkObject, "server_count"); - - config.networking.port = port->valueint; - config.networking.server_count = server_count->valueint; - } - - cJSON *paringObject = cJSON_GetObjectItemCaseSensitive(rootObject, "network"); - if (cJSON_IsObject(paringObject) && !cJSON_IsNull(paringObject)) { - cJSON *ping_limit = cJSON_GetObjectItem(paringObject, "ping_limit"); - - cJSON_SetNumberValue(ping_limit, config.pairing.ping_limit); - } - - cJSON *loggerObject = cJSON_GetObjectItemCaseSensitive(rootObject, "logger"); - if (cJSON_IsObject(loggerObject) && !cJSON_IsNull(loggerObject)) { - cJSON *log_file = cJSON_GetObjectItem(loggerObject, "log_file"); - - cJSON_SetNumberValue(log_file, config.logger.log_file); - } - - cJSON *gameplayObject = cJSON_GetObjectItemCaseSensitive(rootObject, "gameplay"); - if (cJSON_IsObject(gameplayObject) && !cJSON_IsNull(gameplayObject)) { - cJSON *anticheat = cJSON_GetObjectItem(gameplayObject, "anticheat"); - - cJSON_SetNumberValue(anticheat, config.gameplay.anticheat); - } - - cJSON_Delete(rootObject); - - if (!config.gameplay.anticheat) { - Info(LOG_YLW "Anticheat is disabled, client modifications are allowed."); - } - - return true; -} - -bool ConfigManager::saveConfig() { - cJSON *rootObject = cJSON_CreateObject(); - RAssert(rootObject); - - cJSON *networkObject = cJSON_CreateObject(); - { - cJSON *port = cJSON_CreateNumber(config.networking.port); - cJSON *server_count = cJSON_CreateNumber(config.networking.server_count); - - cJSON_AddItemToObject(networkObject, "port", port); - cJSON_AddItemToObject(networkObject, "server_count", server_count); - } - cJSON_AddItemToObject(rootObject, "networking", networkObject); - - cJSON *paringObject = cJSON_CreateObject(); - { - cJSON *ping_limit = cJSON_CreateNumber(config.pairing.ping_limit); - - cJSON_AddItemToObject(paringObject, "ping_limit", ping_limit); - } - cJSON_AddItemToObject(rootObject, "paring", paringObject); - - cJSON *loggerObject = cJSON_CreateObject(); - { - cJSON *log_file = cJSON_CreateBool(config.logger.log_file); - - cJSON_AddItemToObject(loggerObject, "log_file", log_file); - } - cJSON_AddItemToObject(rootObject, "logger", loggerObject); - - cJSON *gameplayObject = cJSON_CreateObject(); - { - cJSON *anticheat = cJSON_CreateBool(config.gameplay.anticheat); - - cJSON_AddItemToObject(gameplayObject, "anticheat", anticheat); - } - cJSON_AddItemToObject(rootObject, "gameplay", gameplayObject); - - snprintf(config.motd, 0x100, "%s", cJSON_GetStringValue(cJSON_GetObjectItemCaseSensitive(rootObject, "motd"))); - - FilePtr file; - fopen_s(&file,CONFIG_FILE, "w"); - RAssert(file); - - char *json = cJSON_Print(rootObject); - fprintf(file, "%s", json); - fclose(file); - - cJSON_free(json); - cJSON_Delete(rootObject); - - return true; -} - -ConfigManager::MainObject ConfigManager::getConfig() { - return config; -} diff --git a/disasterserver/ConfigManager.hpp b/disasterserver/ConfigManager.hpp deleted file mode 100644 index 5a89909..0000000 --- a/disasterserver/ConfigManager.hpp +++ /dev/null @@ -1,52 +0,0 @@ -#ifndef CONFIG_HPP -#define CONFIG_HPP - -#include -#include - -using FilePtr = FILE*; - -#define CONFIG_FILE "Config.json" - -class ConfigManager { - struct NetworkObject { - int32_t port = 8606; - int32_t server_count = 1; - }; - - struct PairingObject { - int32_t ping_limit = 250; - }; - - struct LoggerObject { - bool log_file = false; - }; - - struct GameplayObject { - bool anticheat = true; - bool map_list[20] = { true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true }; - Mutex map_list_lock; - }; - - struct MainObject { - NetworkObject networking = {}; - PairingObject pairing = {}; - LoggerObject logger = {}; - GameplayObject gameplay = {}; - bool charFix = true; - char motd[0x100] = ""; - }; - - MainObject config = {}; -public: - ConfigManager(); - ~ConfigManager(); - - bool loadConfig(); - bool saveConfig(); - - MainObject getConfig(); -}; - - -#endif //CONFIG_HPP diff --git a/disasterserver/Api.hpp b/disasterserver/Core/Api.hpp similarity index 100% rename from disasterserver/Api.hpp rename to disasterserver/Core/Api.hpp diff --git a/disasterserver/Log.cpp b/disasterserver/Core/Log.cpp similarity index 100% rename from disasterserver/Log.cpp rename to disasterserver/Core/Log.cpp diff --git a/disasterserver/Log.hpp b/disasterserver/Core/Log.hpp similarity index 98% rename from disasterserver/Log.hpp rename to disasterserver/Core/Log.hpp index 6196922..6c33639 100644 --- a/disasterserver/Log.hpp +++ b/disasterserver/Core/Log.hpp @@ -53,7 +53,7 @@ class Logger { case LogLevel::Error: ss << "[Error]"; break; } ss << " "; - ss << "["<< std::this_thread::get_id() << "] "; + ss << "["<< std::this_thread::get_id() << "]"; ss << " "; ss << std::format("({}:{})", file, line); ss << " "; diff --git a/disasterserver/Core/Packet.cpp b/disasterserver/Core/Packet.cpp new file mode 100644 index 0000000..b31a78d --- /dev/null +++ b/disasterserver/Core/Packet.cpp @@ -0,0 +1,187 @@ +#include "Packet.hpp" + +#include "Log.hpp" + +#ifdef __GNUC__ // GCC, clang... + #define BYTESWAP_16(x) __builtin_bswap16((x)) + #define BYTESWAP_32(x) __builtin_bswap32((x)) + #define BYTESWAP_64(x) __builtin_bswap64((x)) +#else + #define BYTESWAP_16(x) _byteswap_ushort((x)) + #define BYTESWAP_32(x) _byteswap_ulong((x)) + #define BYTESWAP_64(x) _byteswap_uint64((x)) +#endif + +#define READ_TYPE(type) \ + type value = reinterpret_cast(buffer.data() + position)[0]; \ + position += sizeof(type); \ + +Packet::Packet(const std::array &buffer) : buffer(buffer) { + +} + +Packet::Packet(PacketType type) : buffer({}) { + writeUint8(0); + writeUint8(static_cast(type)); +} + +Packet::~Packet() = default; + +std::optional Packet::readUint8() { + READ_TYPE(uint8_t); + return value; +} + +std::optional Packet::readUint16() { + READ_TYPE(uint16_t); + return value; +} + +std::optional Packet::readUint32() { + READ_TYPE(uint32_t); + return value; +} + +std::optional Packet::readUint64() { + READ_TYPE(uint64_t); + return value; +} + +std::optional Packet::readFloat() { + READ_TYPE(float); + return value; +} + +std::optional Packet::readDouble() { + READ_TYPE(double); + return value; +} + +std::optional Packet::readString() { + char buf[250]; + + while (true) { + char ch = buffer[position]; + buf[position] = ch; + position++; + + if (ch == '\0') + break; + } + + return std::string(buf); +} + +void Packet::writeUint8(uint8_t value) { + if (position + sizeof(uint8_t) > PACKET_MAXSIZE) { + Err("Exceeding the Packet Size Limit. Max Size {}", PACKET_MAXSIZE); + return; + } + + if (position + sizeof(uint8_t) >= len) { + len++; + } + + buffer[position++] = value; +} + +void Packet::writeUint16(uint16_t value) { + if (position + sizeof(uint16_t) > PACKET_MAXSIZE) { + Err("Exceeding the Packet Size Limit. Max Size {}", PACKET_MAXSIZE); + return; + } + + if (position + sizeof(uint16_t) >= len) { + len += sizeof(uint16_t); + } + + uint8_t *ptr = (uint8_t*)&value; + buffer[position++] = ptr[0]; + buffer[position++] = ptr[1]; +} + +void Packet::writeUint32(uint32_t value) { + if (position + sizeof(uint32_t) > PACKET_MAXSIZE) { + Err("Exceeding the Packet Size Limit. Max Size {}", PACKET_MAXSIZE); + return; + } + + if (position + sizeof(uint32_t) >= len) { + len += sizeof(uint32_t); + } + + uint8_t *ptr = (uint8_t*)&value; + buffer[position++] = ptr[0]; + buffer[position++] = ptr[1]; + buffer[position++] = ptr[2]; + buffer[position++] = ptr[3]; +} + +void Packet::writeUint64(uint64_t value) { + if (position + sizeof(uint64_t) > PACKET_MAXSIZE) { + Err("Exceeding the Packet Size Limit. Max Size {}", PACKET_MAXSIZE); + return; + } + + if (position + sizeof(uint64_t) >= len) { + len += sizeof(uint64_t); + } + + uint8_t *ptr = (uint8_t*)&value; + buffer[position++] = ptr[0]; + buffer[position++] = ptr[1]; + buffer[position++] = ptr[2]; + buffer[position++] = ptr[3]; + buffer[position++] = ptr[4]; + buffer[position++] = ptr[5]; + buffer[position++] = ptr[6]; + buffer[position++] = ptr[7]; +} + +void Packet::writeFloat(float value) { + if (position + sizeof(float) > PACKET_MAXSIZE) { + Err("Exceeding the Packet Size Limit. Max Size {}", PACKET_MAXSIZE); + return; + } + + if (position + sizeof(float) >= len) { + len += sizeof(float); + } + + uint8_t *ptr = (uint8_t*)&value; + buffer[position++] = ptr[0]; + buffer[position++] = ptr[1]; + buffer[position++] = ptr[2]; + buffer[position++] = ptr[3]; +} + +void Packet::writeDouble(double value) { + if (position + sizeof(double) > PACKET_MAXSIZE) { + Err("Exceeding the Packet Size Limit. Max Size {}", PACKET_MAXSIZE); + return; + } + + if (position + sizeof(double) >= len) { + len += sizeof(double); + } + + uint8_t *ptr = (uint8_t*)&value; + buffer[position++] = ptr[0]; + buffer[position++] = ptr[1]; + buffer[position++] = ptr[2]; + buffer[position++] = ptr[3]; + buffer[position++] = ptr[4]; + buffer[position++] = ptr[5]; + buffer[position++] = ptr[6]; + buffer[position++] = ptr[7]; +} + +void Packet::writeString(const std::string &value) { + for (uint8_t i = 0; i < value.size(); i++) { + writeUint8(value[i]); + } +} + +void Packet::send(udp::endpoint &endpoint, udp::socket &socket) { + socket.send_to(boost::asio::buffer(buffer, len), endpoint); +} diff --git a/disasterserver/Io/Packet.hpp b/disasterserver/Core/Packet.hpp similarity index 80% rename from disasterserver/Io/Packet.hpp rename to disasterserver/Core/Packet.hpp index b82ee7b..23f07a5 100644 --- a/disasterserver/Io/Packet.hpp +++ b/disasterserver/Core/Packet.hpp @@ -1,11 +1,13 @@ #ifndef PACKET_H + #define PACKET_H -#include +#include #include -#include "Util/String.hpp" - -#define PACKET_MAXSIZE 256 +#include +#include +#include +#include enum class PacketType { @@ -169,36 +171,37 @@ enum class PacketType CLIENT_PLAYER_POTATER }; + +static constexpr int PACKET_MAXSIZE = 256; + +using boost::asio::ip::udp; + class Packet { - uint8_t buffer[PACKET_MAXSIZE] = {}; - uint8_t pos = 0; + std::array buffer; + uint8_t position = 0; uint8_t len = 0; public: - Packet(); - + explicit Packet(const std::array &buffer); explicit Packet(PacketType type); - explicit Packet(ENetPacket* packet); - ~Packet() = default; - - bool seek(int wh); - - bool read8(uint8_t* out); - bool read16(uint16_t* out); - bool read32(uint32_t* out); - bool read64(uint64_t* out); - bool readFloat(float* out); - bool readDouble(double* out); - bool readStr(String* out); - - bool write8(uint8_t value); - bool write16(uint16_t value); - bool write32(uint32_t value); - bool write64(uint64_t value); - bool writeFloat(float value); - bool writeDouble(double value); - bool writeStr(String value); - - bool send(ENetPeer* peer, bool reliable); + ~Packet(); + + std::optional readUint8(); + std::optional readUint16(); + std::optional readUint32(); + std::optional readUint64(); + std::optional readFloat(); + std::optional readDouble(); + std::optional readString(); + + void writeUint8(uint8_t value); + void writeUint16(uint16_t value); + void writeUint32(uint32_t value); + void writeUint64(uint64_t value); + void writeFloat(float value); + void writeDouble(double value); + void writeString(const std::string &value); + + void send(udp::endpoint &endpoint, udp::socket &socket); }; #endif diff --git a/disasterserver/Singleton.hpp b/disasterserver/Core/Singleton.hpp similarity index 96% rename from disasterserver/Singleton.hpp rename to disasterserver/Core/Singleton.hpp index 22d17fc..5090c55 100644 --- a/disasterserver/Singleton.hpp +++ b/disasterserver/Core/Singleton.hpp @@ -1,5 +1,6 @@ #ifndef SINGLETON_HPP #define SINGLETON_HPP +#include // https://de.wikibooks.org/wiki/C%2B%2B-Programmierung:_Entwurfsmuster:_Singleton template diff --git a/disasterserver/DisasterServer.cpp b/disasterserver/DisasterServer.cpp deleted file mode 100644 index 987ddc6..0000000 --- a/disasterserver/DisasterServer.cpp +++ /dev/null @@ -1,52 +0,0 @@ -#include "DisasterServer.hpp" - -#include - -#include "Log.hpp" -#include "Io/Threads.hpp" -#include "Server.hpp" - - -DisasterServer::DisasterServer() : configManager({}) { - -} - -DisasterServer::~DisasterServer() = default; - -bool DisasterServer::init() { - if (running) - return true; - - RAssert(enet_initialize() == 0); - -#ifdef SYS_ANDROID - //log_hook(log_android); -#endif - - Info("- DisasterServer v{}", STRINGIFY(BUILD_VERSION)); // LOG_RED "Better" LOG_BLU "Server " LOG_RST "v" STRINGIFY(BUILD_VERSION) - Info("- Build from {} {}", __DATE__, __TIME__); // "Build from " LOG_PUR __DATE__ " " LOG_GRN __TIME__ - - RAssert(configManager.loadConfig()); - - return true; -} - -int DisasterServer::run() { - if (running) - return true; - - running = true; - Debug("Entering main loop..."); - - for (int i = 0; i < configManager.getConfig().networking.server_count; i++) { - serversMutex.lock(); - std::jthread thread([&] { - auto server = std::make_shared(configManager.getConfig().networking.port,i); - this->servers.push_back(std::move(server)); - server->worker(); - }); - serversMutex.unlock(); - } - - return true; -} diff --git a/disasterserver/DisasterServer.hpp b/disasterserver/DisasterServer.hpp deleted file mode 100644 index 53b5c3f..0000000 --- a/disasterserver/DisasterServer.hpp +++ /dev/null @@ -1,41 +0,0 @@ -#ifndef DISASTERSERVER_HPP -#define DISASTERSERVER_HPP - -#include -#include -#include - -#include "ConfigManager.hpp" -#include "Singleton.hpp" -#include "enet/enet.h" -#include "Io/Packet.hpp" -#include "Io/Threads.hpp" - -#define TICKSPERSEC 60 -#define BUILD_VERSION 1101 - -#define STR_HELPER(x) #x -#define STRINGIFY(x) STR_HELPER(x) - - - - -class Server; - -class DisasterServer : public Singleton { - friend class Singleton; - ConfigManager configManager; - - bool running = false; - std::vector> servers; - std::mutex serversMutex; -public: - - DisasterServer(); - ~DisasterServer() override; - - bool init(); - int run(); -}; - -#endif //DISASTERSERVER_HPP diff --git a/disasterserver/Io/Packet.cpp b/disasterserver/Io/Packet.cpp deleted file mode 100644 index 388289d..0000000 --- a/disasterserver/Io/Packet.cpp +++ /dev/null @@ -1,251 +0,0 @@ -#include "Packet.hpp" -#include "Server.hpp" -#include "Log.hpp" - -#ifdef __GNUC__ // GCC, clang... - #define BYTESWAP_16(x) __builtin_bswap16((x)) - #define BYTESWAP_32(x) __builtin_bswap32((x)) - #define BYTESWAP_64(x) __builtin_bswap64((x)) -#else - #define BYTESWAP_16(x) _byteswap_ushort((x)) - #define BYTESWAP_32(x) _byteswap_ulong((x)) - #define BYTESWAP_64(x) _byteswap_uint64((x)) -#endif - -Packet::Packet() { -} - -Packet::Packet(PacketType type) { - write8(0); - write8(static_cast(type)); -} - -Packet::Packet(ENetPacket *packet) { - memcpy(buffer, packet->data, (uint8_t)packet->dataLength); - enet_packet_destroy(packet); -} - -bool Packet::seek(int wh) { - RAssert(wh >= 0); - RAssert(wh < PACKET_MAXSIZE); - RAssert(wh < len); - - pos = wh; - return true; -} - -bool Packet::read8(uint8_t *out) { - RAssert(pos < len); - *out = buffer[pos++]; - - return true; -} - -bool Packet::read16(uint16_t *out) { - RAssert(pos < len); - *out = *((int16_t*)&buffer[pos]); - -#ifdef SYS_BIG_ENDIAN - *out = BYTESWAP_16(*out); -#endif - - pos += 2; - - return true; -} - -bool Packet::read32(uint32_t *out) { - RAssert(pos < len); - *out = *((int32_t*)&buffer[pos]); - -#ifdef SYS_BIG_ENDIAN - *out = BYTESWAP_32(*out); -#endif - - pos += 4; - - return true; -} - -bool Packet::read64(uint64_t *out) { - RAssert(pos < len); - *out = *((int64_t*)&buffer[pos]); - -#ifdef SYS_BIG_ENDIAN - *out = BYTESWAP_64(*out); -#endif - - pos += 8; - - return true; -} - -bool Packet::readFloat(float *out) { - RAssert(pos < len); - *out = *((float*)&buffer[pos]); - -#ifdef SYS_BIG_ENDIAN - *out = BYTESWAP_32(*out); -#endif - - pos += 4; - - return true; -} - -bool Packet::readDouble(double *out) { - RAssert(pos < len); - *out = *((float*)&buffer[pos]); - -#ifdef SYS_BIG_ENDIAN - * out = BYTESWAP_32(*out); -#endif - - pos += 8; - - return true; -} - -bool Packet::readStr(String *out) { - out->len = 0; - - while (true) - { - RAssert(pos < len); - RAssert(out->len < 128); - - char ch = buffer[pos]; - out->value[out->len] = ch; - - pos++; - out->len++; - - if (ch == '\0') - break; - } - - return true; -} - -bool Packet::write8(uint8_t value) { - RAssert(pos + 1 < PACKET_MAXSIZE); - - if (pos + 1 >= len) - len++; - - buffer[pos++] = value; - return true; -} - -bool Packet::write16(uint16_t value) { - RAssert(pos + 2 < PACKET_MAXSIZE); - - if (pos + 2 >= len) - len += 2; - -#ifdef SYS_BIG_ENDIAN - value = BYTESWAP_16(value); -#endif - - uint8_t* ptr = (uint8_t*)&value; - buffer[pos++] = ptr[0]; - buffer[pos++] = ptr[1]; - return true; -} - -bool Packet::write32(uint32_t value) { - RAssert(pos + 4 < PACKET_MAXSIZE); - - if (pos + 4 >= len) - len += 4; - -#ifdef SYS_BIG_ENDIAN - value = BYTESWAP_32(value); -#endif - - uint8_t* ptr = (uint8_t*)&value; - buffer[pos++] = ptr[0]; - buffer[pos++] = ptr[1]; - buffer[pos++] = ptr[2]; - buffer[pos++] = ptr[3]; - return true; -} - -bool Packet::write64(uint64_t value) { - RAssert(pos + 8 < PACKET_MAXSIZE); - - if (pos + 8 >= len) - len += 8; - -#ifdef SYS_BIG_ENDIAN - value = BYTESWAP_64(value); -#endif - - uint8_t* ptr = (uint8_t*)&value; - buffer[pos++] = ptr[0]; - buffer[pos++] = ptr[1]; - buffer[pos++] = ptr[2]; - buffer[pos++] = ptr[3]; - buffer[pos++] = ptr[4]; - buffer[pos++] = ptr[5]; - buffer[pos++] = ptr[6]; - buffer[pos++] = ptr[7]; - return true; -} - -bool Packet::writeFloat(float value) { - RAssert(pos + 4 < PACKET_MAXSIZE); - - if (pos + 4 >= len) - len += 4; - -#ifdef SYS_BIG_ENDIAN - value = BYTESWAP_32(value); -#endif - - uint8_t* ptr = (uint8_t*)&value; - buffer[pos++] = ptr[0]; - buffer[pos++] = ptr[1]; - buffer[pos++] = ptr[2]; - buffer[pos++] = ptr[3]; - return true; -} - -bool Packet::writeDouble(double value) { - RAssert(pos + 8 < PACKET_MAXSIZE); - - if (pos + 8 >= len) - len += 8; - -#ifdef SYS_BIG_ENDIAN - value = BYTESWAP_64(value); -#endif - - uint8_t* ptr = (uint8_t*)&value; - buffer[pos++] = ptr[0]; - buffer[pos++] = ptr[1]; - buffer[pos++] = ptr[2]; - buffer[pos++] = ptr[3]; - buffer[pos++] = ptr[4]; - buffer[pos++] = ptr[5]; - buffer[pos++] = ptr[6]; - buffer[pos++] = ptr[7]; - return true; -} - -bool Packet::writeStr(String value) { - for (uint8_t i = 0; i < value.len; i++) - RAssert(write8(value.value[i])); - - return true; -} - -bool Packet::send(ENetPeer *peer, bool reliable) { - PeerData* data = static_cast(peer->data); - if(data && data->disconnecting) - return true; - - pos = 0; - ENetPacket* pack = enet_packet_create(this, len, reliable ? ENET_PACKET_FLAG_RELIABLE : 0); - return enet_peer_send(peer, reliable ? 0 : 1, pack) == 0; -} diff --git a/disasterserver/Io/Threads.hpp b/disasterserver/Io/Threads.hpp deleted file mode 100644 index 8dcd819..0000000 --- a/disasterserver/Io/Threads.hpp +++ /dev/null @@ -1,57 +0,0 @@ -#ifndef THREADS_HPP -#define THREADS_HPP - -#if defined(__unix) || defined(__unix__) - #include - #include - #include - #include - - typedef pthread_t Thread; - typedef pthread_key_t ThreadVar; - typedef void* (*pthread_cbfunc_t) (void*); - - #define ThreadVarCreate(var) pthread_key_create(&var, NULL) - #define ThreadVarSet(var, value) pthread_setspecific(var, value) - #define ThreadVarGet(var) pthread_getspecific(var) - #define ThreadVarFree(var) pthread_key_delete(var) - - #define ThreadSpawn(thr, cb, arg) { pthread_create(&thr, NULL, (pthread_cbfunc_t)(cb), (arg)); pthread_detach(thr); } - #define ThreadJoin(thr) pthread_join(thr, NULL) - #define ThreadSleep(ms) { struct timespec ts;\ - ts.tv_sec = ms / 1000;\ - ts.tv_nsec = (ms % 1000) * 1000000;\ - nanosleep(&ts, NULL); } - - typedef pthread_mutex_t Mutex; - #define MutexCreate(mut) RAssert(pthread_mutex_init(&mut, NULL) == 0) - #define MutexLock(mut) RAssert(pthread_mutex_lock(&mut) == 0) - #define MutexUnlock(mut) RAssert(pthread_mutex_unlock(&mut) == 0) -#else - #define WIN32_LEAN_AND_MEAN - #include - - #include - using namespace std::string_literals; - - typedef HANDLE Thread; - typedef DWORD ThreadVar; - - #define ThreadVarCreate(var) RAssert((var = TlsAlloc()) != TLS_OUT_OF_INDEXES) - #define ThreadVarGet(var) TlsGetValue(var) - #define ThreadVarSet(var, value) TlsSetValue(var, value) - #define ThreadVarFree(var) TlsFree(var) - - #define ThreadSpawn(thr, cb, arg) (thr = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)(cb), (arg), 0, NULL)) - #define ThreadJoin(thr) WaitForSingleObject(thr, INFINITE) - #define ThreadSleep(ms) Sleep(ms) - - typedef HANDLE Mutex; - #define MutexCreate(mut) (mut = CreateMutex(NULL, FALSE, NULL)) - #define MutexLock(mut) RAssert(WaitForSingleObject(mut, INFINITE) == WAIT_OBJECT_0) - #define MutexUnlock(mut) RAssert(ReleaseMutex(mut)) -#endif - -extern ThreadVar g_threadName; - -#endif //THREADS_HPP diff --git a/disasterserver/Main.cpp b/disasterserver/Main.cpp index 85421a9..bbc1951 100644 --- a/disasterserver/Main.cpp +++ b/disasterserver/Main.cpp @@ -1,14 +1,14 @@ -#include "DisasterServer.hpp" -#include "Log.hpp" +#include "Server.hpp" +#include "Core/Log.hpp" int main(int argc, char *argv[]) { try { - DisasterServer *server = DisasterServer::getInstance(); - if (!server->init()) { - return 1; - } + Info("- DisasterServerCXX v{}", BUILD_VERSION); + Info("- Build from {} {}", __DATE__, __TIME__); - return server->run(); + boost::asio::io_context io_context; + DisasterServer::Server server(io_context); + io_context.run(); } catch (std::exception& e) { Err("Exception: {}", e.what()); } diff --git a/disasterserver/Peer.cpp b/disasterserver/Peer.cpp new file mode 100644 index 0000000..d76b984 --- /dev/null +++ b/disasterserver/Peer.cpp @@ -0,0 +1,13 @@ +#include "Peer.hpp" + +using namespace DisasterServer; + +Peer::Peer(uint16_t id, std::string ip, udp::endpoint endpoint) : id(id), ip(ip), endpoint(endpoint) { + +} + +Peer::~Peer() = default; + +Peer::AuthPeer &Peer::getAuthPeer() { + return auth; +} \ No newline at end of file diff --git a/disasterserver/Peer.hpp b/disasterserver/Peer.hpp new file mode 100644 index 0000000..5535a5d --- /dev/null +++ b/disasterserver/Peer.hpp @@ -0,0 +1,49 @@ +#ifndef DISASTERSERVER_PEER_HPP +#define DISASTERSERVER_PEER_HPP + +#include +#include + +#include "Core/Packet.hpp" + +namespace DisasterServer +{ + class Peer : public boost::enable_shared_from_this { + uint16_t id; + std::string ip; + udp::endpoint endpoint; + + /* General info */ + //Player plr; + std::string nickname; + std::string udid; + uint8_t lobby_icon; + int8_t pet; + + bool verified; + bool in_game; + bool op; + bool ready; + bool mod_tool; + bool is_mobile; + bool can_vote; + bool voted; + bool disconnecting; + + struct AuthPeer { + uint32_t type; + uint8_t one; + uint8_t two; + }; + + AuthPeer auth; + + public: + Peer(uint16_t id, std::string ip, udp::endpoint endpoint); + ~Peer(); + + AuthPeer &getAuthPeer(); + }; +} + +#endif //DISASTERSERVER_PEER_HPP diff --git a/disasterserver/Player.cpp b/disasterserver/Player.cpp deleted file mode 100644 index 9e7a7e3..0000000 --- a/disasterserver/Player.cpp +++ /dev/null @@ -1 +0,0 @@ -#include "Player.hpp" diff --git a/disasterserver/Player.hpp b/disasterserver/Player.hpp deleted file mode 100644 index 05d8e52..0000000 --- a/disasterserver/Player.hpp +++ /dev/null @@ -1,75 +0,0 @@ -#ifndef DISASTERSERVER_PLAYER_HPP -#define DISASTERSERVER_PLAYER_HPP - -#include -#include "Util/Math.hpp" -#include "Util/Time.hpp" - -typedef enum -{ - PLAYER_NONE = 0, - PLAYER_ESCAPED = 0x1 << 0, - PLAYER_DEAD = 0x1 << 1, - PLAYER_DEMONIZED = 0x1 << 2, - PLAYER_REVIVED = 0x1 << 3, - PLAYER_CANTREVIVE = 0x1 << 4, - PLAYER_LEFT = 0x1 << 5, - PLAYER_KILLER = 0x1 << 6 -} PlayerFlags; - -typedef struct -{ - uint8_t ready; - uint16_t seq; - uint16_t errors; /* Used as tracker for errors like lag/etc */ - uint8_t ex_teleport; - double timeout; - - uint8_t mod_tool; - uint32_t mod_tool_timer; - uint32_t chunk; - TimeStamp last_packet; - - /* Attack */ - bool is_attacking; - double attack_timer; - TimeStamp last_attack; - - uint16_t ping_last; - double ping_total; - double ping_timer; - uint16_t rings; - TimeStamp last_rings; - uint16_t heal_rings; - - uint8_t state; - PlayerFlags flags; - uint8_t death_timer_sec; - double death_timer; - double revival; - int32_t revival_init[5]; - - uintptr_t data[4]; /* Can be used as pointer/data field */ - Vector2 start_pos; - Vector2 pos; - - struct - { - double survive_time; - double danger_time; - double camp_time; - - double braindead_time; - bool brain_damage; - - uint16_t stun_time; - uint16_t stuns; - uint16_t hp_restored; - uint16_t rings; - uint16_t damage; - uint16_t damage_taken; - uint16_t kills; - } stats; -} Player; - -#endif //DISASTERSERVER_PLAYER_HPP diff --git a/disasterserver/Server.cpp b/disasterserver/Server.cpp index e6503b1..8a48206 100644 --- a/disasterserver/Server.cpp +++ b/disasterserver/Server.cpp @@ -1,132 +1,92 @@ #include "Server.hpp" -#include "Log.hpp" +#include -Server::Server(uint16_t basePort, uint16_t id) : id(id) { - for (int i = 0; i < 20; i++) { - map_pickrates[i] = 255; - } +#include "Core/Packet.hpp" +#include - ENetAddress addr; - addr.host = ENET_HOST_ANY; - addr.port = basePort + id; - host = enet_host_create(&addr, 50, 2, 0, 0); +#include "Core/Log.hpp" - Info("Listening on port {:d}.", basePort + id); +using namespace DisasterServer; - RAssertEx(host != nullptr); +Server::Server(boost::asio::io_context &io_context) : io_context(io_context), socket(io_context, udp::endpoint(udp::v4(), BASE_SERVER_PORT)) { + worker(); } -Server::~Server() = default; - -void Server::worker() { - srand (time(nullptr)); - - TimeStamp ticker; - time_start(&ticker); - - double next_tick = time_end(&ticker); - double heartbeat = 0.0; - const double TARGET_FPS = 1000.0 / 60; +bool Server::worker() { + boost::system::error_code error_code; + socket.non_blocking(true, error_code); Packet packet(PacketType::SERVER_HEARTBEAT); - while (running) { - ENetEvent ev; - if (enet_host_service(host, &ev, 5) > 0) { - switch (ev.type) { - case ENET_EVENT_TYPE_CONNECT: { - Debug("ENET_EVENT_TYPE_CONNECT..."); - ev.peer->data = static_cast(malloc(sizeof(PeerData))); - if (!ev.peer->data) - return; - - memset(ev.peer->data, 0, sizeof(PeerData)); - - auto *v = static_cast(ev.peer->data); - v->server = this; - v->peer = ev.peer; - v->id = ev.peer->incomingPeerID + 1; - - char buffer[0x100]; - enet_address_get_host_ip(&ev.peer->address, buffer, 250); - v->ip = std::string(buffer); - - break; - } - case ENET_EVENT_TYPE_DISCONNECT: { - Debug("ENET_EVENT_TYPE_DISCONNECT..."); - PeerData *v = (PeerData *)ev.peer->data; - if (!v) - break; + for (;;) { + udp::endpoint endpoint; + socket.receive_from(boost::asio::buffer(recv_buffer), endpoint, 0, error_code); + if (!error_code) { + auto it = peers.find(endpoint); + if (it == peers.end()) { + Peer peer(id_counter++, endpoint.address().to_string(), std::move(endpoint)); + peers.try_emplace(endpoint, std::move(peer)); - /*if (!v->op && v->should_timeout) - { - uint64_t result; - if (timeout_check(v->udid.value, v->ip.value, &result) && result == 0) - timeout_set(v->nickname.value, v->udid.value, v->ip.value, time(NULL) + 5); - } - - if (v->verified) - { - MutexLock(ip_addr_mut); - { - cJSON_DeleteItemFromObject(ip_addr_list, v->udid.value); - cJSON_DeleteItemFromObject(ip_addr_list, v->ip.value); - } - MutexUnlock(ip_addr_mut); - - MutexLock(v->server->state_lock); - { - // Step 3: Cleanup (Only if joined before) - if (dylist_remove(&v->server->peers, v)) - server_state_left(v); - } - MutexUnlock(v->server->state_lock); - }*/ - - Info("{} (id {:d}) " LOG_YLW "left.", v->nickname.value, v->id); - free(v); - break; - } + Packet packet_preIdentity(PacketType::SERVER_PREIDENTITY); - default: break; - } - } + /* Auth client */ + peer.getAuthPeer().one = (uint8_t) rand() % 128; + peer.getAuthPeer().two = (uint8_t) rand() % 255; - double now = time_end(&ticker); - while (next_tick < now) { - next_tick += TARGET_FPS; - mutex.lock(); - { - switch (state) { - case States::LOBBY: - case States::CHARSELECT: - case States::MAPVOTE: + uint32_t type = 0; + + switch (rand() % 3) + { + case 0: + type = 1u << 9; break; - case States::GAME: + case 1: + type = 1u << 31; break; - case States::RESULTS: + case 2: + type = 1u << 26; break; default: break; } - if (peers.empty()) { - if (heartbeat >= (TICKSPERSEC * 2)) - { - Debug("Heartbeat done."); - heartbeat = 0; - } - heartbeat += delta; + for (int bit = 0; bit < 32; ++bit) + { + if (bit == 9 || bit == 31 || bit == 26) + continue; + + if (rand() % 3 <= 1) + type &= ~(1u << bit); + else + type |= 1u << bit; + } + + peer.getAuthPeer().type = type; + + packet_preIdentity.writeUint16(0); + packet_preIdentity.writeUint16(1); + packet_preIdentity.writeUint8(peer.getAuthPeer().one); + packet_preIdentity.writeUint8((uint8_t) rand() % 2); + packet_preIdentity.writeUint8(peer.getAuthPeer().two); + + const uint8_t key[6] = { 0x00, 0x00, 0xFF, 0x1F, 0x80, 0x14 }; + + for (int i = 0; i < 3; i++) { + packet_preIdentity.writeUint8(key[rand() % sizeof(key)]); } + + packet_preIdentity.writeUint32(peer.getAuthPeer().type); + + packet_preIdentity.send(endpoint, socket); } - mutex.unlock(); - delta = 1; } - } - enet_host_destroy(host); + if (error_code != boost::asio::error::would_block && error_code != boost::asio::error::try_again) { + return false; + } + } } + diff --git a/disasterserver/Server.hpp b/disasterserver/Server.hpp index e4cc575..16354e2 100644 --- a/disasterserver/Server.hpp +++ b/disasterserver/Server.hpp @@ -1,113 +1,32 @@ #ifndef DISASTERSERVER_SERVER_HPP #define DISASTERSERVER_SERVER_HPP -#include "DisasterServer.hpp" -#include "Util/Time.hpp" -#include "Player.hpp" +#include -enum class SurvivalCharacters { - NONE = -1, +#include "Peer.hpp" +#include "Core/Packet.hpp" - TAILS, - KNUX, - EGGMAN, - AMY, - CREAM, - SALLY -}; +#define TICKSPERSEC 60 +#define BUILD_VERSION 1101 +#define BASE_SERVER_PORT 8606 -enum class ExeCharacters { - NONE = -1, +using boost::asio::ip::udp; - ORIGINAL, - CHAOS, - EXETIOR, - EXELLER -}; - -enum class States { - LOBBY, - MAPVOTE, - CHARSELECT, - GAME, - RESULTS -}; - -enum BigRingState -{ - BS_NONE, - BS_DEACTIVATED, - BS_ACTIVATED, -}; - -enum Ending -{ - ED_EXEWIN, - ED_SURVWIN, - ED_TIMEOVER -}; - -struct PeerData +namespace DisasterServer { - uint16_t id; - std::string ip; - ENetPeer *peer; - - /* General info */ - Player plr; - String nickname; - String udid; - uint8_t lobby_icon; - int8_t pet; - - bool verified; - bool in_game; - bool op; - bool ready; - bool mod_tool; - bool is_mobile; - bool can_vote; - bool voted; - bool disconnecting; - - //auth_peer_data auth; - - /* Character */ - SurvivalCharacters surv_char; - ExeCharacters exe_char; - - bool should_timeout; - - /* State info */ - uint8_t exe_chance; - double timeout; - double vote_cooldown; - - Server *server; -}; - -class Server { - uint16_t id; - bool running = true; - - States state = States::LOBBY; - std::mutex mutex; - - // States - - - int8_t last_map = -1; - int16_t map_pickrates[30] = {}; - - double delta = 0; - std::vector peers; - ENetHost *host; -public: - Server(uint16_t basePort, uint16_t id); - ~Server(); - - void worker(); -}; - + class Server { + boost::asio::io_context &io_context; + udp::socket socket; + std::array recv_buffer = {}; + + uint16_t id_counter = 0; + std::unordered_map peers; + public: + Server(boost::asio::io_context& io_context); + + private: + bool worker(); + }; +} #endif //DISASTERSERVER_SERVER_HPP diff --git a/disasterserver/Util/Math.cpp b/disasterserver/Util/Math.cpp deleted file mode 100644 index 9136378..0000000 --- a/disasterserver/Util/Math.cpp +++ /dev/null @@ -1,23 +0,0 @@ -#include "Math.hpp" - -#include - -float lerp(float a, float b, float f) -{ - return a * (1.0f - f) + (b * f); -} - -float sign(float x) -{ - return ((x) > 0) ? 1.f : (((x) < 0) ? -1.f : 0.f); -} - -float vector2_dist(Vector2* a, Vector2* b) -{ - return sqrtf(powf(b->x - a->x, 2) + powf(b->y - a->y, 2)); -} - -Vector2 vector2_dir(Vector2* a, Vector2* b) -{ - return Vector2{ sign(a->x - b->x), sign(a->y - b->y) }; -} diff --git a/disasterserver/Util/Math.hpp b/disasterserver/Util/Math.hpp deleted file mode 100644 index a9490e3..0000000 --- a/disasterserver/Util/Math.hpp +++ /dev/null @@ -1,20 +0,0 @@ -#ifndef DISASTERSERVER_VECTOR2_HPP -#define DISASTERSERVER_VECTOR2_HPP - - - -typedef struct -{ - float x; - float y; -} Vector2; - -float lerp(float a, float b, float f); -float sign(float x); - -float vector2_dist(Vector2* a, Vector2* b); -Vector2 vector2_dir(Vector2* a, Vector2* b); - - - -#endif //DISASTERSERVER_VECTOR2_HPP diff --git a/disasterserver/Util/String.hpp b/disasterserver/Util/String.hpp deleted file mode 100644 index 2c32e9c..0000000 --- a/disasterserver/Util/String.hpp +++ /dev/null @@ -1,12 +0,0 @@ -#ifndef DISASTERSERVER_STRING_HPP -#define DISASTERSERVER_STRING_HPP - -#include - -typedef struct -{ - char value[250]; - uint16_t len; -} String; - -#endif //DISASTERSERVER_STRING_HPP diff --git a/disasterserver/Util/Time.cpp b/disasterserver/Util/Time.cpp deleted file mode 100644 index 8ae5087..0000000 --- a/disasterserver/Util/Time.cpp +++ /dev/null @@ -1,49 +0,0 @@ -#include "Time.hpp" -#include -#include - -#include "Log.hpp" - -bool init = false; -double freq = 0; - -void time_start(TimeStamp* timer) -{ -#ifdef _WIN32 - LARGE_INTEGER li; - - if (!init) - { - if (!QueryPerformanceFrequency(&li)) - { - Err("Failed to query perfomance frequency!"); - return; - } - - freq = (double)(li.QuadPart) / 1000.0; - init = true; - } - - QueryPerformanceCounter(&li); - *timer = (li.QuadPart / freq); -#else - struct timespec _t; - clock_gettime(CLOCK_MONOTONIC, &_t); - *timer = _t.tv_sec * 1000 + _t.tv_nsec / 1e6; -#endif -} - -double time_end(TimeStamp* timer) -{ -#ifdef _WIN32 - LARGE_INTEGER li; - QueryPerformanceCounter(&li); - return (double)((li.QuadPart) / freq) - (*timer); -#else - struct timespec _t; - clock_gettime(CLOCK_MONOTONIC, &_t); - - double current = _t.tv_sec * 1000 + _t.tv_nsec / 1e6; - return current - (*timer); -#endif -} diff --git a/disasterserver/Util/Time.hpp b/disasterserver/Util/Time.hpp deleted file mode 100644 index 267be7f..0000000 --- a/disasterserver/Util/Time.hpp +++ /dev/null @@ -1,17 +0,0 @@ -#ifndef TIME_H -#define TIME_H - -#include -#include - -#if defined(_WIN32) - #define WIN32_LEAN_AND_MEAN - #include -#endif - -using TimeStamp = double; - -void time_start (TimeStamp* timer); -double time_end (TimeStamp* timer); - -#endif \ No newline at end of file diff --git a/disasterserver_c/Auth.c b/disasterserver_c/Auth.c index 6b43bb7..fd5dca6 100644 --- a/disasterserver_c/Auth.c +++ b/disasterserver_c/Auth.c @@ -47,9 +47,9 @@ bool auth_create_ticket(PeerData* peer, Packet* packet) PacketWrite(packet, packet_write8, peer->auth.one); PacketWrite(packet, packet_write8, (uint8_t) rand() % 2); PacketWrite(packet, packet_write8, peer->auth.two); - const char key[] = { 0x00, 0x00, 0xFF, 0x1F, 0x80, 0x14 }; for (int i = 0; i < 3; i++) { + const char key[] = { 0x00, 0x00, 0xFF, 0x1F, 0x80, 0x14 }; PacketWrite(packet, packet_write8, key[rand() % sizeof(key)]); } PacketWrite(packet, packet_write32, peer->auth.type); diff --git a/disasterserver_c/Server.c b/disasterserver_c/Server.c index b6e0652..4926112 100644 --- a/disasterserver_c/Server.c +++ b/disasterserver_c/Server.c @@ -327,7 +327,7 @@ bool server_worker(Server *server) memset(ev.peer->data, 0, sizeof(PeerData)); - PeerData *v = (PeerData *)ev.peer->data; + PeerData *v = ev.peer->data; v->server = server; v->peer = ev.peer; v->id = ev.peer->incomingPeerID + 1; @@ -384,19 +384,19 @@ bool server_worker(Server *server) switch (packet.buff[1]) { - case IDENTITY: - { - if (!peer_identity(v, &packet)) + case IDENTITY: { - Debug("Identity failed for id %d", v->id); - } - break; - } - default: - { - if (!peer_msg(v, &packet)) + if (!peer_identity(v, &packet)) + { + Debug("Identity failed for id %d", v->id); + } break; - } + } + default: + { + if (!peer_msg(v, &packet)) + break; + } } break; diff --git a/resources/isiskdjdnd.png b/resources/isiskdjdnd.png new file mode 100644 index 0000000000000000000000000000000000000000..19766b7d8e5dc3afe97c7a7c5edcf8adad614cbb GIT binary patch literal 804 zcmV+<1Ka$GP)aYg5FPAL2Wc%yiy+lf)ZB-e=~Vd+u*yp@xl|$rq0f zZ7{xjck?&;N1N)Z?YI61m_R1u`}v`zVl^Tk!Qh_BVoO`2*vyUD%z}76v-Z)oZfAWb z>M{)6F@f7DTw$T#AHz? zu}t9fgx~~@U5_I%3?H~8mPE*yNfdz>+}b^bSZ^FRh6jZA68y^HlZxQ(hZl;-OM;Z9 zfZpri?Y)0+AlxqTukk!S&x)#xO|qzX&-p7v|y4kqsd%cD=k{kOszx;Ab>p}iIP z)tp)v4u@R?$z)QHIKb->aa34d?`h4!dQ5F=KqwSKA)Utgb5URUO?*oFo{>agXeunP z%uCyMDR3IWA3nCl=1N92T<=w3>;r}b4uL3D+Xg?ijKCyd0m#Jr2q=x7G?l|5ZGLu1 zT}KBl<4s~cxyO6@@K(D|EzT*d7M%7g=*X=AxpARj|K70herxMymq)HPO}Hy*{LAO+ zqk`dKf^|FQcxlJ)DFyGl$HeuKv2K_5G8f)lS^8{AJ0+^;fJP7(P@?=CZt%1gR$>_y z1RAcQ@$VxPJY^V+uHxYGML|SGl33*?8WjYxl3WVdZ6j@YF^4#~qylc>Mpjb6-sE@; zAFvF|182>JGKt=}s*}B83Qo_8&XwLtW8%HdM$kj-YUkI~D}sQB1rL}K^K1P4eiqG6 zMNOe3TY9F)S=PVdpn}A7<$$9?PQq;FDbllD=wM|{zeJF<323;j!Y5xEg-=$PtjI!wf0000x literal 0 HcmV?d00001 diff --git a/vcpkg.json b/vcpkg.json new file mode 100644 index 0000000..43762f5 --- /dev/null +++ b/vcpkg.json @@ -0,0 +1,9 @@ +{ + "name": "disasterserver", + "version": "0.0.1", + "dependencies": [ + "boost-bind", + "boost-smart-ptr", + "boost-asio" + ] +} \ No newline at end of file From df9f36221a0a1d38731d294101b86034a8625c59 Mon Sep 17 00:00:00 2001 From: MilesGlitch Date: Fri, 4 Sep 2026 02:39:34 +0300 Subject: [PATCH 07/61] a --- disasterserver/CMakeLists.txt | 12 +- disasterserver/Core/ENet/client.h | 270 +++++++++++++ .../Core/ENet/client_connect_params.h | 65 ++++ .../Core/ENet/client_queued_packet.h | 27 ++ disasterserver/Core/ENet/client_statistics.h | 19 + disasterserver/Core/ENet/global_state.h | 44 +++ disasterserver/Core/ENet/server.h | 356 ++++++++++++++++++ disasterserver/Core/ENet/server_event.h | 35 ++ .../Core/ENet/server_listen_params.h | 78 ++++ .../Core/ENet/server_queued_packet.h | 30 ++ .../Core/ENet/set_current_thread_name.h | 46 +++ disasterserver/Core/ENet/trace_handler.h | 14 + disasterserver/Core/Packet.cpp | 65 ++-- disasterserver/Core/Packet.hpp | 217 +++++++++-- disasterserver/Core/Time.cpp | 48 +++ disasterserver/Core/Time.hpp | 14 + disasterserver/Main.cpp | 10 +- disasterserver/Networking/Networking.hpp | 80 ++++ disasterserver/Peer.cpp | 41 +- disasterserver/Peer.hpp | 47 ++- disasterserver/Server.cpp | 182 ++++++--- disasterserver/Server.hpp | 25 +- disasterserver_c/Server.c | 133 +++---- vcpkg.json | 4 +- 24 files changed, 1632 insertions(+), 230 deletions(-) create mode 100644 disasterserver/Core/ENet/client.h create mode 100644 disasterserver/Core/ENet/client_connect_params.h create mode 100644 disasterserver/Core/ENet/client_queued_packet.h create mode 100644 disasterserver/Core/ENet/client_statistics.h create mode 100644 disasterserver/Core/ENet/global_state.h create mode 100644 disasterserver/Core/ENet/server.h create mode 100644 disasterserver/Core/ENet/server_event.h create mode 100644 disasterserver/Core/ENet/server_listen_params.h create mode 100644 disasterserver/Core/ENet/server_queued_packet.h create mode 100644 disasterserver/Core/ENet/set_current_thread_name.h create mode 100644 disasterserver/Core/ENet/trace_handler.h create mode 100644 disasterserver/Core/Time.cpp create mode 100644 disasterserver/Core/Time.hpp create mode 100644 disasterserver/Networking/Networking.hpp diff --git a/disasterserver/CMakeLists.txt b/disasterserver/CMakeLists.txt index 876f395..e2c59bb 100644 --- a/disasterserver/CMakeLists.txt +++ b/disasterserver/CMakeLists.txt @@ -1,24 +1,22 @@ file(GLOB_RECURSE SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/*.cpp) -find_package(Boost REQUIRED COMPONENTS smart_ptr asio bind) - if(ANDROID) add_library(DisasterServerCXX SHARED "Android.cpp" ${SOURCES}) set(THREADS_PREFER_PTHREAD_FLAG ON) find_package(Threads REQUIRED) target_include_directories(DisasterServerCXX PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}) - target_link_libraries(DisasterServerCXX PRIVATE cJSON log Boost::smart_ptr Boost::asio Boost::bind m Threads::Threads) + target_link_libraries(DisasterServerCXX PRIVATE cJSON log enet m Threads::Threads) else() if(DYLIB) # Build .dll or .so add_library(DisasterServerCXX SHARED ${SOURCES}) if (WIN32) - target_link_libraries(DisasterServerCXX PRIVATE cJSON Boost::smart_ptr Boost::asio Boost::bind ws2_32 winmm dbghelp) + target_link_libraries(DisasterServerCXX PRIVATE cJSON enet ws2_32 winmm dbghelp) else() # UNIX set(THREADS_PREFER_PTHREAD_FLAG ON) find_package(Threads REQUIRED) - target_link_libraries(DisasterServerCXX PRIVATE cJSON Boost::smart_ptr Boost::asio Boost::bind m Threads::Threads) + target_link_libraries(DisasterServerCXX PRIVATE cJSON enet m Threads::Threads) endif() target_include_directories(DisasterServerCXX PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}) @@ -81,11 +79,11 @@ else() ) if (WIN32) - target_link_libraries(DisasterServerCXX PRIVATE cJSON Boost::smart_ptr Boost::asio Boost::bind ws2_32 winmm dbghelp) + target_link_libraries(DisasterServerCXX PRIVATE cJSON enet ws2_32 winmm dbghelp) else() # UNIX set(THREADS_PREFER_PTHREAD_FLAG ON) find_package(Threads REQUIRED) - target_link_libraries(DisasterServerCXX PRIVATE cJSON Boost::smart_ptr Boost::asio Boost::bind m Threads::Threads) + target_link_libraries(DisasterServerCXX PRIVATE cJSON enet m Threads::Threads) endif() target_include_directories(DisasterServerCXX PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}) diff --git a/disasterserver/Core/ENet/client.h b/disasterserver/Core/ENet/client.h new file mode 100644 index 0000000..7aa662d --- /dev/null +++ b/disasterserver/Core/ENet/client.h @@ -0,0 +1,270 @@ +#ifndef ENETPP_CLIENT_H_ +#define ENETPP_CLIENT_H_ + +#include +#include +#include +#include +#include +#include "global_state.h" +#include "client_connect_params.h" +#include "client_queued_packet.h" +#include "client_statistics.h" +#include "set_current_thread_name.h" +#include "trace_handler.h" + +namespace enetpp { + + class client { + private: + trace_handler _trace_handler; + + std::queue _packet_queue; + std::mutex _packet_queue_mutex; + + std::queue _event_queue; + std::queue _event_queue_copy; //member variable instead of stack variable to prevent mallocs? + std::mutex _event_queue_mutex; + + bool _should_exit_thread; + std::unique_ptr _thread; + + client_statistics _statistics; + + public: + client::client() + : _should_exit_thread(false) { + } + + client::~client() { + //responsibility of owners to make sure disconnect is always called. not calling disconnect() in destructor due to + //trace_handler side effects. + assert(_thread == nullptr); + assert(_packet_queue.empty()); + assert(_event_queue.empty()); + assert(_event_queue_copy.empty()); + } + + void set_trace_handler(trace_handler handler) { + assert(!is_connecting_or_connected()); //must be set before any threads started to be safe + _trace_handler = handler; + } + + bool client::is_connecting_or_connected() const { + return _thread != nullptr; + } + + void client::connect(const client_connect_params& params) { + assert(global_state::get().is_initialized()); + assert(!is_connecting_or_connected()); + assert(params._channel_count > 0); + assert(params._server_port != 0); + assert(!params._server_host_name.empty()); + + trace("connecting to '" + params._server_host_name + ":" + std::to_string(params._server_port) + "'"); + + _should_exit_thread = false; + _thread = std::make_unique(&client::run_in_thread, this, params); + } + + void client::disconnect() { + if (_thread != nullptr) { + _should_exit_thread = true; + _thread->join(); + _thread.release(); + } + + destroy_all_queued_packets(); + destroy_all_queued_events(); + } + + void client::send_packet(enet_uint8 channel_id, const enet_uint8* data, size_t data_size, enet_uint32 flags) { + assert(is_connecting_or_connected()); + if (_thread != nullptr) { + std::lock_guard lock(_packet_queue_mutex); + auto packet = enet_packet_create(data, data_size, flags); + _packet_queue.emplace(channel_id, packet); + } + } + + void client::consume_events( + std::function on_connected, + std::function on_disconnected, + std::function on_data_received) { + + if (!_event_queue.empty()) { + + //!IMPORTANT! neet to copy the events for consumption to prevent deadlocks! + //ex. + //- event = JoinGameFailed packet received + //- causes event_handler to call client::disconnect + //- client::disconnect deadlocks as the thread needs a critical section on events to exit + { + std::lock_guard lock(_event_queue_mutex); + assert(_event_queue_copy.empty()); + _event_queue_copy = _event_queue; + _event_queue = {}; + } + + bool is_disconnected = false; + + while (!_event_queue_copy.empty()) { + auto& e = _event_queue_copy.front(); + switch (e.type) { + case ENET_EVENT_TYPE_CONNECT: { + on_connected(); + break; + } + + case ENET_EVENT_TYPE_DISCONNECT: { + on_disconnected(); + is_disconnected = true; + break; + } + + case ENET_EVENT_TYPE_RECEIVE: { + on_data_received(e.packet->data, e.packet->dataLength); + enet_packet_destroy(e.packet); + break; + } + + case ENET_EVENT_TYPE_NONE: + default: + assert(false); + break; + } + _event_queue_copy.pop(); + } + + if (is_disconnected) { + //cleanup everything internally, make sure the thread is cleaned up. + disconnect(); + } + } + } + + const client_statistics& get_statistics() const { + return _statistics; + } + + private: + void client::destroy_all_queued_packets() { + std::lock_guard lock(_packet_queue_mutex); + while (!_packet_queue.empty()) { + enet_packet_destroy(_packet_queue.front()._packet); + _packet_queue.pop(); + } + } + + void client::destroy_all_queued_events() { + std::lock_guard lock(_event_queue_mutex); + while (!_event_queue.empty()) { + destroy_unhandled_event_data(_event_queue.front()); + _event_queue.pop(); + } + } + + void client::destroy_unhandled_event_data(ENetEvent& e) { + if (e.type == ENET_EVENT_TYPE_RECEIVE) { + enet_packet_destroy(e.packet); + } + } + + void client::run_in_thread(const client_connect_params& params) { + set_current_thread_name("enetpp::client"); + + ENetHost* host = enet_host_create(nullptr, 1, params._channel_count, params._incoming_bandwidth, params._outgoing_bandwidth); + if (host == nullptr) { + trace("enet_host_create failed"); + return; + } + + auto address = params.make_server_address(); + ENetPeer* peer = enet_host_connect(host, &address, params._channel_count, 0); + if (peer == nullptr) { + trace("enet_host_connect failed"); + enet_host_destroy(host); + return; + } + + enet_uint32 enet_timeout = static_cast(params._timeout.count()); + enet_peer_timeout(peer, 0, enet_timeout, enet_timeout); + + bool is_disconnecting = false; + enet_uint32 disconnect_start_time = 0; + + while (peer != nullptr) { + + _statistics._round_trip_time_in_ms = peer->roundTripTime; + _statistics._round_trip_time_variance_in_ms = peer->roundTripTimeVariance; + + if (_should_exit_thread) { + if (!is_disconnecting) { + enet_peer_disconnect(peer, 0); + is_disconnecting = true; + disconnect_start_time = enet_time_get(); + } + else { + if ((enet_time_get() - disconnect_start_time) > 1000) { + trace("enet_peer_disconnect took too long"); + enet_peer_reset(peer); + peer = nullptr; + break; + } + } + } + + if (!is_disconnecting) { + send_queued_packets_in_thread(peer); + } + + //flush / capture enet events + //http://lists.cubik.org/pipermail/enet-discuss/2013-September/002240.html + enet_host_service(host, 0, 0); + { + ENetEvent e; + while (enet_host_check_events(host, &e) > 0) { + std::lock_guard lock(_event_queue_mutex); + _event_queue.push(e); + if (e.type == ENET_EVENT_TYPE_DISCONNECT) { + trace("ENET_EVENT_TYPE_DISCONNECT received"); + peer = nullptr; + break; + } + } + } + + std::this_thread::sleep_for(std::chrono::milliseconds(1)); + } + + enet_host_destroy(host); + } + + void client::send_queued_packets_in_thread(ENetPeer* peer) { + if (!_packet_queue.empty()) { + std::lock_guard lock(_packet_queue_mutex); + while (!_packet_queue.empty()) { + auto qp = _packet_queue.front(); + _packet_queue.pop(); + + if (enet_peer_send(peer, qp._channel_id, qp._packet) != 0) { + trace("enet_peer_send failed"); + } + + if (qp._packet->referenceCount == 0) { + enet_packet_destroy(qp._packet); + } + } + } + } + + void client::trace(const std::string& s) { + if (_trace_handler != nullptr) { + _trace_handler(s); + } + } + }; + +} + +#endif \ No newline at end of file diff --git a/disasterserver/Core/ENet/client_connect_params.h b/disasterserver/Core/ENet/client_connect_params.h new file mode 100644 index 0000000..71e2f77 --- /dev/null +++ b/disasterserver/Core/ENet/client_connect_params.h @@ -0,0 +1,65 @@ +#ifndef ENETPP_CLIENT_CONNECT_PARAMS_H_ +#define ENETPP_CLIENT_CONNECT_PARAMS_H_ + +#include "enet/enet.h" +#include + +namespace enetpp { + + class client_connect_params { + public: + size_t _channel_count; + enet_uint32 _incoming_bandwidth; + enet_uint32 _outgoing_bandwidth; + std::string _server_host_name; + enet_uint16 _server_port; + std::chrono::milliseconds _timeout; + + public: + client_connect_params() + : _channel_count(0) + , _incoming_bandwidth(0) + , _outgoing_bandwidth(0) + , _server_host_name() + , _server_port(0) + , _timeout(0) { + } + + client_connect_params& set_channel_count(size_t channel_count) { + _channel_count = channel_count; + return *this; + } + + client_connect_params& set_incoming_bandwidth(enet_uint32 bandwidth) { + _incoming_bandwidth = bandwidth; + return *this; + } + + client_connect_params& set_outgoing_bandwidth(enet_uint32 bandwidth) { + _outgoing_bandwidth = bandwidth; + return *this; + } + + client_connect_params& set_server_host_name_and_port(const char* host_name, enet_uint16 port) { + _server_host_name = host_name; + _server_port = port; + return *this; + } + + client_connect_params& set_timeout(std::chrono::milliseconds timeout) { + _timeout = timeout; + return *this; + } + + ENetAddress make_server_address() const { + ENetAddress address; + enet_address_set_host(&address, _server_host_name.c_str()); + address.port = _server_port; + return address; + } + + }; + +} + +#endif \ No newline at end of file diff --git a/disasterserver/Core/ENet/client_queued_packet.h b/disasterserver/Core/ENet/client_queued_packet.h new file mode 100644 index 0000000..6aa8ac2 --- /dev/null +++ b/disasterserver/Core/ENet/client_queued_packet.h @@ -0,0 +1,27 @@ +#ifndef ENETPP_CLIENT_QUEUED_PACKET_H_ +#define ENETPP_CLIENT_QUEUED_PACKET_H_ + +#include "enet/enet.h" + +namespace enetpp { + + class client_queued_packet { + public: + enet_uint8 _channel_id; + ENetPacket* _packet; + + public: + client_queued_packet() + : _channel_id(0) + , _packet(nullptr) { + } + + client_queued_packet(enet_uint8 channel_id, ENetPacket* packet) + : _channel_id(channel_id) + , _packet(packet) { + } + }; + +} + +#endif \ No newline at end of file diff --git a/disasterserver/Core/ENet/client_statistics.h b/disasterserver/Core/ENet/client_statistics.h new file mode 100644 index 0000000..e93f12d --- /dev/null +++ b/disasterserver/Core/ENet/client_statistics.h @@ -0,0 +1,19 @@ +#pragma once + +#include + +namespace enetpp { + + class client_statistics { + public: + std::atomic _round_trip_time_in_ms; + std::atomic _round_trip_time_variance_in_ms; + + public: + client_statistics() + : _round_trip_time_in_ms(0) + , _round_trip_time_variance_in_ms(0) { + } + }; + +} \ No newline at end of file diff --git a/disasterserver/Core/ENet/global_state.h b/disasterserver/Core/ENet/global_state.h new file mode 100644 index 0000000..d2cc60d --- /dev/null +++ b/disasterserver/Core/ENet/global_state.h @@ -0,0 +1,44 @@ +#ifndef ENETPP_GLOBAL_STATE_H_ +#define ENETPP_GLOBAL_STATE_H_ + +#include +#include "enet/enet.h" + +namespace enetpp { + + //ugh + class global_state { + private: + bool _is_initialized; + + public: + static global_state& get() { + static global_state g; + return g; + } + + public: + bool is_initialized() const { + return _is_initialized; + } + + void initialize() { + assert(!_is_initialized); + enet_initialize(); + _is_initialized = true; + } + + void deinitialize() { + enet_deinitialize(); + _is_initialized = false; + } + + private: + global_state() + : _is_initialized(false) { + } + }; + +} + +#endif diff --git a/disasterserver/Core/ENet/server.h b/disasterserver/Core/ENet/server.h new file mode 100644 index 0000000..cf1cfcb --- /dev/null +++ b/disasterserver/Core/ENet/server.h @@ -0,0 +1,356 @@ +#ifndef ENETPP_SERVER_H_ +#define ENETPP_SERVER_H_ + +#include +#include +#include +#include +#include +#include +#include +#include "server_listen_params.h" +#include "server_queued_packet.h" +#include "server_event.h" +#include "global_state.h" +#include "set_current_thread_name.h" +#include "trace_handler.h" +#include "Core/Log.hpp" + +namespace enetpp { + + template + class server { + public: + using event_type = server_event; + using listen_params_type = server_listen_params; + using client_ptr_vector = std::vector; + + private: + trace_handler _trace_handler; + + bool _should_exit_thread; + std::unique_ptr _thread; + + //mapping of uid to peer so that sending packets to specific peers is safe. + std::unordered_map _thread_peer_map; + + client_ptr_vector _connected_clients; + + std::queue _packet_queue; + std::mutex _packet_queue_mutex; + + std::queue _event_queue; + std::queue _event_queue_copy; //member variable instead of stack variable to prevent mallocs? + std::mutex _event_queue_mutex; + + public: + server() + : _should_exit_thread(false) { + } + + ~server() { + //responsibility of owners to make sure stop_listening is always called. not calling stop_listening() in destructor due to + //trace_handler side effects. + assert(_thread == nullptr); + assert(_packet_queue.empty()); + assert(_event_queue.empty()); + assert(_event_queue_copy.empty()); + assert(_connected_clients.empty()); + } + + void set_trace_handler(trace_handler handler) { + assert(!is_listening()); //must be set before any threads started to be safe + _trace_handler = handler; + } + + bool is_listening() const { + return (_thread != nullptr); + } + + void start_listening(const listen_params_type& params) { + assert(global_state::get().is_initialized()); + assert(!is_listening()); + assert(params._max_client_count > 0); + assert(params._channel_count > 0); + assert(params._listen_port != 0); + assert(params._initialize_client_function != nullptr); + + Info("Listening on port " + std::to_string(params._listen_port)); + + _should_exit_thread = false; + _thread = std::make_unique(&server::run_in_thread, this, params); + } + + void stop_listening() { + if (_thread != nullptr) { + _should_exit_thread = true; + _thread->join(); + _thread.release(); + } + + destroy_all_queued_packets(); + destroy_all_queued_events(); + delete_all_connected_clients(); + } + + void send_packet_to(unsigned int client_id, enet_uint8 channel_id, const enet_uint8* data, size_t data_size, enet_uint32 flags) { + assert(is_listening()); + if (_thread != nullptr) { + std::lock_guard lock(_packet_queue_mutex); + auto packet = enet_packet_create(data, data_size, flags); + _packet_queue.emplace(channel_id, packet, client_id); + } + } + + void send_packet_to_all_if(enet_uint8 channel_id, const enet_uint8* data, size_t data_size, enet_uint32 flags, std::function predicate) { + assert(is_listening()); + if (_thread != nullptr) { + std::lock_guard lock(_packet_queue_mutex); + auto packet = enet_packet_create(data, data_size, flags); + for (auto c : _connected_clients) { + if (predicate(*c)) { + _packet_queue.emplace(channel_id, packet, c->get_id()); + } + } + } + } + + void consume_events( + std::function on_client_connected, + std::function on_client_disconnected, + std::function on_client_data_received) { + + if (!_event_queue.empty()) { + + { + std::lock_guard lock(_event_queue_mutex); + assert(_event_queue_copy.empty()); + _event_queue_copy = _event_queue; + _event_queue = {}; + } + + while (!_event_queue_copy.empty()) { + auto& e = _event_queue_copy.front(); + switch (e._event_type) { + case ENET_EVENT_TYPE_CONNECT: { + _connected_clients.push_back(e._client); + on_client_connected(*e._client); + break; + } + + case ENET_EVENT_TYPE_DISCONNECT: { + auto iter = std::find(_connected_clients.begin(), _connected_clients.end(), e._client); + assert(iter != _connected_clients.end()); + _connected_clients.erase(iter); + unsigned int client_id = e._client->get_id(); + delete e._client; + on_client_disconnected(client_id); + break; + } + + case ENET_EVENT_TYPE_RECEIVE: { + on_client_data_received(*e._client, e._packet->data, e._packet->dataLength); + enet_packet_destroy(e._packet); + break; + } + + case ENET_EVENT_TYPE_NONE: + default: + assert(false); + break; + } + _event_queue_copy.pop(); + } + } + } + + const client_ptr_vector& get_connected_clients() const { + return _connected_clients; + } + + private: + void run_in_thread(const listen_params_type& params) { + set_current_thread_name("enetpp::server"); + + auto address = params.make_listen_address(); + ENetHost* host = enet_host_create( + &address, + params._max_client_count, + params._channel_count, + params._incoming_bandwidth, + params._outgoing_bandwidth); + if (host == nullptr) { + Debug("enet_host_create failed"); + } + + while (host != nullptr) { + + if (_should_exit_thread) { + disconnect_all_peers_in_thread(); + enet_host_destroy(host); + host = nullptr; + } + + if (host != nullptr) { + send_queued_packets_in_thread(); + capture_events_in_thread(params, host); + } + + std::this_thread::sleep_for(std::chrono::milliseconds(1)); + } + } + + void disconnect_all_peers_in_thread() { + for (auto iter : _thread_peer_map) { + enet_peer_disconnect_now(iter.second, 0); + iter.second->data = nullptr; + } + _thread_peer_map.clear(); + } + + void send_queued_packets_in_thread() { + if (!_packet_queue.empty()) { + std::lock_guard lock(_packet_queue_mutex); + while (!_packet_queue.empty()) { + auto qp = _packet_queue.front(); + _packet_queue.pop(); + + auto pi = _thread_peer_map.find(qp._client_id); + if (pi != _thread_peer_map.end()) { + + //enet_peer_send fails if state not connected. was getting random asserts on peers disconnecting and going into ENET_PEER_STATE_ZOMBIE. + if (pi->second->state == ENET_PEER_STATE_CONNECTED) { + + if (enet_peer_send(pi->second, qp._channel_id, qp._packet) != 0) { + Debug("enet_peer_send failed"); + } + + if (qp._packet->referenceCount == 0) { + enet_packet_destroy(qp._packet); + } + } + } + } + } + } + + void capture_events_in_thread(const listen_params_type& params, ENetHost* host) { + //http://lists.cubik.org/pipermail/enet-discuss/2013-September/002240.html + enet_host_service(host, 0, 0); + + ENetEvent e; + while (enet_host_check_events(host, &e) > 0) { + switch (e.type) { + case ENET_EVENT_TYPE_CONNECT: { + handle_connect_event_in_thread(params, e); + break; + } + + case ENET_EVENT_TYPE_RECEIVE: { + handle_receive_event_in_thread(e); + break; + } + + case ENET_EVENT_TYPE_DISCONNECT: { + handle_disconnect_event_in_thread(e); + break; + } + + case ENET_EVENT_TYPE_NONE: + default: + assert(false); + break; + } + } + } + + void handle_connect_event_in_thread(const listen_params_type& params, const ENetEvent& e) { + enet_uint32 enet_timeout = static_cast(params._peer_timeout.count()); + enet_peer_timeout(e.peer, 0, enet_timeout, enet_timeout); + + char peer_ip[256]; + enet_address_get_host_ip(&e.peer->address, peer_ip, 256); + + //!IMPORTANT! PeerData and it's UID must be created immediately in this worker thread. Otherwise + //there is a chance the first few packets are received on the worker thread when the peer is not + //initialized with data causing them to be discarded. + + auto client = new ClientT(); + params._initialize_client_function(*client, peer_ip); + + assert(e.peer->data == nullptr); + e.peer->data = client; + + _thread_peer_map[client->get_id()] = e.peer; + + { + std::lock_guard lock(_event_queue_mutex); + _event_queue.emplace(ENET_EVENT_TYPE_CONNECT, 0, nullptr, client); + } + } + + void handle_disconnect_event_in_thread(const ENetEvent& e) { + auto client = reinterpret_cast(e.peer->data); + if (client != nullptr) { + auto iter = _thread_peer_map.find(client->get_id()); + assert(iter != _thread_peer_map.end()); + assert(iter->second == e.peer); + e.peer->data = nullptr; + _thread_peer_map.erase(iter); + + std::lock_guard lock(_event_queue_mutex); + _event_queue.emplace(ENET_EVENT_TYPE_DISCONNECT, 0, nullptr, client); + } + } + + void handle_receive_event_in_thread(const ENetEvent& e) { + auto client = reinterpret_cast(e.peer->data); + if (client != nullptr) { + std::lock_guard lock(_event_queue_mutex); + _event_queue.emplace(ENET_EVENT_TYPE_RECEIVE, e.channelID, e.packet, client); + } + } + + void destroy_all_queued_packets() { + std::lock_guard lock(_packet_queue_mutex); + while (!_packet_queue.empty()) { + enet_packet_destroy(_packet_queue.front()._packet); + _packet_queue.pop(); + } + } + + void destroy_all_queued_events() { + std::lock_guard lock(_event_queue_mutex); + while (!_event_queue.empty()) { + destroy_unhandled_event_data(_event_queue.front()); + _event_queue.pop(); + } + } + + void delete_all_connected_clients() { + for (auto c : _connected_clients) { + delete c; + } + _connected_clients.clear(); + } + + void destroy_unhandled_event_data(event_type& e) { + if (e._event_type == ENET_EVENT_TYPE_CONNECT) { + delete e._client; + } + else if (e._event_type == ENET_EVENT_TYPE_RECEIVE) { + enet_packet_destroy(e._packet); + } + } + + void trace(const std::string& s) { + if (_trace_handler != nullptr) { + _trace_handler(s); + } + } + + }; + +} + +#endif \ No newline at end of file diff --git a/disasterserver/Core/ENet/server_event.h b/disasterserver/Core/ENet/server_event.h new file mode 100644 index 0000000..3524de2 --- /dev/null +++ b/disasterserver/Core/ENet/server_event.h @@ -0,0 +1,35 @@ +#ifndef ENETPP_SERVER_EVENT_H_ +#define ENETPP_SERVER_EVENT_H_ + +#include "enet/enet.h" + +namespace enetpp { + + //server can't use ENetEvent as ENetPeer is not thread safe. Instead track data that is safe. + template + class server_event { + public: + ENetEventType _event_type; + enet_uint8 _channel_id; + ENetPacket* _packet; + ClientT* _client; + + public: + server_event() + : _event_type(ENET_EVENT_TYPE_NONE) + , _channel_id(0) + , _packet(nullptr) + , _client(nullptr) { + } + + server_event(ENetEventType event_type, enet_uint8 channel_id, ENetPacket* packet, ClientT* client) + : _event_type(event_type) + , _channel_id(channel_id) + , _packet(packet) + , _client(client) { + } + }; + +} + +#endif diff --git a/disasterserver/Core/ENet/server_listen_params.h b/disasterserver/Core/ENet/server_listen_params.h new file mode 100644 index 0000000..6831ae9 --- /dev/null +++ b/disasterserver/Core/ENet/server_listen_params.h @@ -0,0 +1,78 @@ +#ifndef ENETPP_SERVER_LISTEN_PARAMS_H_ +#define ENETPP_SERVER_LISTEN_PARAMS_H_ + +#include "enet/enet.h" +#include +#include + +namespace enetpp { + + template + class server_listen_params { + public: + using initialize_client_function = std::function; + + public: + size_t _max_client_count; + size_t _channel_count; + enet_uint32 _incoming_bandwidth; + enet_uint32 _outgoing_bandwidth; + enet_uint16 _listen_port; + std::chrono::milliseconds _peer_timeout; + initialize_client_function _initialize_client_function; + + public: + server_listen_params() + : _max_client_count(0) + , _channel_count(0) + , _incoming_bandwidth(0) + , _outgoing_bandwidth(0) + , _peer_timeout(0) { + } + + server_listen_params& set_listen_port(enet_uint16 port) { + _listen_port = port; + return *this; + } + + server_listen_params& set_max_client_count(size_t count) { + _max_client_count = count; + return *this; + } + + server_listen_params& set_channel_count(size_t channel_count) { + _channel_count = channel_count; + return *this; + } + + server_listen_params& set_incoming_bandwidth(enet_uint32 bandwidth) { + _incoming_bandwidth = bandwidth; + return *this; + } + + server_listen_params& set_outgoing_bandwidth(enet_uint32 bandwidth) { + _outgoing_bandwidth = bandwidth; + return *this; + } + + server_listen_params& set_peer_timeout(std::chrono::milliseconds timeout) { + _peer_timeout = timeout; + return *this; + } + + server_listen_params& set_initialize_client_function(initialize_client_function f) { + _initialize_client_function = f; + return *this; + } + + ENetAddress make_listen_address() const { + ENetAddress address; + address.host = ENET_HOST_ANY; + address.port = _listen_port; + return address; + } + }; + +} + +#endif diff --git a/disasterserver/Core/ENet/server_queued_packet.h b/disasterserver/Core/ENet/server_queued_packet.h new file mode 100644 index 0000000..526790b --- /dev/null +++ b/disasterserver/Core/ENet/server_queued_packet.h @@ -0,0 +1,30 @@ +#ifndef ENETPP_SERVER_QUEUED_PACKET_H_ +#define ENETPP_SERVER_QUEUED_PACKET_H_ + +#include "enet/enet.h" + +namespace enetpp { + + class server_queued_packet { + public: + enet_uint8 _channel_id; + ENetPacket* _packet; + unsigned int _client_id; + + public: + server_queued_packet() + : _channel_id(0) + , _packet(nullptr) + , _client_id(0) { + } + + server_queued_packet(enet_uint8 channel_id, ENetPacket* packet, unsigned int client_id) + : _channel_id(channel_id) + , _packet(packet) + , _client_id(client_id) { + } + }; + +} + +#endif \ No newline at end of file diff --git a/disasterserver/Core/ENet/set_current_thread_name.h b/disasterserver/Core/ENet/set_current_thread_name.h new file mode 100644 index 0000000..78211be --- /dev/null +++ b/disasterserver/Core/ENet/set_current_thread_name.h @@ -0,0 +1,46 @@ +#ifndef ENETPP_SET_CURRENT_THREAD_NAME_H_ +#define ENETPP_SET_CURRENT_THREAD_NAME_H_ + +#include "enet/enet.h" + +namespace enetpp { + + inline void set_current_thread_name(const char* name) { + +#ifdef _WIN32 + + //https://msdn.microsoft.com/en-us/library/xcb2z8hs.aspx + const DWORD MS_VC_EXCEPTION = 0x406D1388; + + #pragma pack(push,8) + typedef struct tagTHREADNAME_INFO { + DWORD dwType; // Must be 0x1000. + LPCSTR szName; // Pointer to name (in user addr space). + DWORD dwThreadID; // Thread ID (-1=caller thread). + DWORD dwFlags; // Reserved for future use, must be zero. + } THREADNAME_INFO; + #pragma pack(pop) + + THREADNAME_INFO info; + info.dwType = 0x1000; + info.szName = name; + info.dwThreadID = ::GetCurrentThreadId(); + info.dwFlags = 0; + + __try { + RaiseException(MS_VC_EXCEPTION, 0, sizeof(info) / sizeof(ULONG_PTR), (ULONG_PTR*)&info); + } + __except (EXCEPTION_EXECUTE_HANDLER) { + } + +#else + + //todo - unknown platform + +#endif + + } + +} + +#endif diff --git a/disasterserver/Core/ENet/trace_handler.h b/disasterserver/Core/ENet/trace_handler.h new file mode 100644 index 0000000..45089e9 --- /dev/null +++ b/disasterserver/Core/ENet/trace_handler.h @@ -0,0 +1,14 @@ +#ifndef ENETPP_TRACE_HANDLER_H_ +#define ENETPP_TRACE_HANDLER_H_ + +#include +#include + +namespace enetpp { + + //!IMPORTANT! handler must be thread safe as trace messages come from worker threads as well. + using trace_handler = std::function; + +} + +#endif diff --git a/disasterserver/Core/Packet.cpp b/disasterserver/Core/Packet.cpp index b31a78d..423db1c 100644 --- a/disasterserver/Core/Packet.cpp +++ b/disasterserver/Core/Packet.cpp @@ -12,64 +12,42 @@ #define BYTESWAP_64(x) _byteswap_uint64((x)) #endif -#define READ_TYPE(type) \ - type value = reinterpret_cast(buffer.data() + position)[0]; \ - position += sizeof(type); \ +using namespace DisasterServer; Packet::Packet(const std::array &buffer) : buffer(buffer) { + read(); + type = static_cast(read()); +} + +#undef min +Packet::Packet(const enet_uint8 *data, size_t data_size) { + std::copy_n(data, std::min(data_size, buffer.size()), buffer.begin()); + len = data_size; + type = static_cast(255); } -Packet::Packet(PacketType type) : buffer({}) { +Packet::Packet(PacketType type) : buffer({}), type(type) { + Debug("Creating packet PacketType::{}", getPacketTypeName(type)); writeUint8(0); writeUint8(static_cast(type)); } Packet::~Packet() = default; -std::optional Packet::readUint8() { - READ_TYPE(uint8_t); - return value; -} - -std::optional Packet::readUint16() { - READ_TYPE(uint16_t); - return value; -} - -std::optional Packet::readUint32() { - READ_TYPE(uint32_t); - return value; -} +std::string Packet::readString() { + std::string result; -std::optional Packet::readUint64() { - READ_TYPE(uint64_t); - return value; -} - -std::optional Packet::readFloat() { - READ_TYPE(float); - return value; -} - -std::optional Packet::readDouble() { - READ_TYPE(double); - return value; -} - -std::optional Packet::readString() { - char buf[250]; - - while (true) { - char ch = buffer[position]; - buf[position] = ch; - position++; + while (position < buffer.size()) { + char ch = static_cast(buffer[position++]); if (ch == '\0') break; + + result += ch; } - return std::string(buf); + return result; } void Packet::writeUint8(uint8_t value) { @@ -182,6 +160,7 @@ void Packet::writeString(const std::string &value) { } } -void Packet::send(udp::endpoint &endpoint, udp::socket &socket) { - socket.send_to(boost::asio::buffer(buffer, len), endpoint); +void Packet::send(enetpp::server &server, uint32_t client_id, bool reliable) { + Debug("packet PacketType::{} sending to {}", getPacketTypeName(type), client_id); + server.send_packet_to(client_id, reliable ? 0 : 1, buffer.data(), len, reliable ? ENET_PACKET_FLAG_RELIABLE : 0); } diff --git a/disasterserver/Core/Packet.hpp b/disasterserver/Core/Packet.hpp index 23f07a5..5c27069 100644 --- a/disasterserver/Core/Packet.hpp +++ b/disasterserver/Core/Packet.hpp @@ -6,10 +6,11 @@ #include #include #include -#include -#include -enum class PacketType +#include "enet/enet.h" +#include "ENet/server.h" + +enum class PacketType : uint8_t { IDENTITY, SERVER_IDENTITY_RESPONSE, @@ -171,37 +172,189 @@ enum class PacketType CLIENT_PLAYER_POTATER }; +inline std::string getPacketTypeName(PacketType type) { + switch (type) { + case PacketType::IDENTITY: return "IDENTITY"; + case PacketType::SERVER_IDENTITY_RESPONSE: return "SERVER_IDENTITY_RESPONSE"; + case PacketType::SERVER_PLAYER_JOINED: return "SERVER_PLAYER_JOINED"; + case PacketType::SERVER_PLAYER_LEFT: return "SERVER_PLAYER_LEFT"; + case PacketType::SERVER_PLAYER_FORCE_DISCONNECT: return "SERVER_PLAYER_FORCE_DISCONNECT"; + case PacketType::SERVER_WAITING_PLAYER_INFO: return "SERVER_WAITING_PLAYER_INFO"; + case PacketType::SERVER_LOBBY_READY_STATE: return "SERVER_LOBBY_READY_STATE"; + case PacketType::SERVER_LOBBY_EXE: return "SERVER_LOBBY_EXE"; + case PacketType::SERVER_LOBBY_COUNTDOWN: return "SERVER_LOBBY_COUNTDOWN"; + case PacketType::SERVER_LOBBY_EXE_CHANGE: return "SERVER_LOBBY_EXE_CHANGE"; + case PacketType::SERVER_LOBBY_CHARACTER_CHANGE: return "SERVER_LOBBY_CHARACTER_CHANGE"; + case PacketType::SERVER_LOBBY_CHARACTER_RESPONSE: return "SERVER_LOBBY_CHARACTER_RESPONSE"; + case PacketType::SERVER_LOBBY_EXECHARACTER_RESPONSE: return "SERVER_LOBBY_EXECHARACTER_RESPONSE"; + case PacketType::SERVER_LOBBY_GAME_START: return "SERVER_LOBBY_GAME_START"; + case PacketType::SERVER_LOBBY_PLAYER: return "SERVER_LOBBY_PLAYER"; + case PacketType::SERVER_LOBBY_EXE_CHANCE: return "SERVER_LOBBY_EXE_CHANCE"; + case PacketType::SERVER_LOBBY_CORRECT: return "SERVER_LOBBY_CORRECT"; + case PacketType::SERVER_LOBBY_CHOOSEVOTEKICK: return "SERVER_LOBBY_CHOOSEVOTEKICK"; + case PacketType::SERVER_LOBBY_CHOOSEBAN: return "SERVER_LOBBY_CHOOSEBAN"; + case PacketType::SERVER_LOBBY_CHOOSEKICK: return "SERVER_LOBBY_CHOOSEKICK"; + case PacketType::SERVER_LOBBY_CHOOSEOP: return "SERVER_LOBBY_CHOOSEOP"; + case PacketType::SERVER_LOBBY_CHANGELOBBY: return "SERVER_LOBBY_CHANGELOBBY"; + case PacketType::SERVER_CHAR_TIME_SYNC: return "SERVER_CHAR_TIME_SYNC"; + case PacketType::SERVER_VOTE_MAPS: return "SERVER_VOTE_MAPS"; + case PacketType::SERVER_VOTE_SET: return "SERVER_VOTE_SET"; + case PacketType::SERVER_VOTE_TIME_SYNC: return "SERVER_VOTE_TIME_SYNC"; + case PacketType::SERVER_GAME_PLAYERS_READY: return "SERVER_GAME_PLAYERS_READY"; + case PacketType::SERVER_GAME_EXE_WINS: return "SERVER_GAME_EXE_WINS"; + case PacketType::SERVER_GAME_SURVIVOR_WIN: return "SERVER_GAME_SURVIVOR_WIN"; + case PacketType::SERVER_GAME_SPAWN_RING: return "SERVER_GAME_SPAWN_RING"; + case PacketType::SERVER_GAME_PLAYER_ESCAPED: return "SERVER_GAME_PLAYER_ESCAPED"; + case PacketType::SERVER_GAME_BACK_TO_LOBBY: return "SERVER_GAME_BACK_TO_LOBBY"; + case PacketType::SERVER_GAME_TIME_SYNC: return "SERVER_GAME_TIME_SYNC"; + case PacketType::SERVER_GAME_TIME_OVER: return "SERVER_GAME_TIME_OVER"; + case PacketType::SERVER_GAME_PING: return "SERVER_GAME_PING"; + case PacketType::SERVER_PLAYER_DEATH_STATE: return "SERVER_PLAYER_DEATH_STATE"; + case PacketType::SERVER_GAME_DEATHTIMER_TICK: return "SERVER_GAME_DEATHTIMER_TICK"; + case PacketType::SERVER_GAME_DEATHTIMER_END: return "SERVER_GAME_DEATHTIMER_END"; + case PacketType::SERVER_REQUEST_INFO: return "SERVER_REQUEST_INFO"; + case PacketType::SERVER_HEARTBEAT: return "SERVER_HEARTBEAT"; + case PacketType::SERVER_PONG: return "SERVER_PONG"; + case PacketType::SERVER_FORCE_DAMAGE: return "SERVER_FORCE_DAMAGE"; + case PacketType::SERVER_GAME_RING_READY: return "SERVER_GAME_RING_READY"; + case PacketType::SERVER_PLAYER_BACKTRACK: return "SERVER_PLAYER_BACKTRACK"; + case PacketType::SERVER_TPROJECTILE_STATE: return "SERVER_TPROJECTILE_STATE"; + case PacketType::SERVER_ETRACKER_STATE: return "SERVER_ETRACKER_STATE"; + case PacketType::SERVER_ERECTOR_BRING_SPAWN: return "SERVER_ERECTOR_BRING_SPAWN"; + case PacketType::SERVER_RMZSLIME_STATE: return "SERVER_RMZSLIME_STATE"; + case PacketType::SERVER_RMZSLIME_RINGBONUS: return "SERVER_RMZSLIME_RINGBONUS"; + case PacketType::SERVER_RMZSHARD_STATE: return "SERVER_RMZSHARD_STATE"; + case PacketType::SERVER_LCEYE_STATE: return "SERVER_LCEYE_STATE"; + case PacketType::SERVER_LCCHAIN_STATE: return "SERVER_LCCHAIN_STATE"; + case PacketType::SERVER_NPCONTROLLER_STATE: return "SERVER_NPCONTROLLER_STATE"; + case PacketType::SERVER_KAFMONITOR_STATE: return "SERVER_KAFMONITOR_STATE"; + case PacketType::SERVER_YCRSMOKE_STATE: return "SERVER_YCRSMOKE_STATE"; + case PacketType::SERVER_YCRSMOKE_READY: return "SERVER_YCRSMOKE_READY"; + case PacketType::SERVER_MOVINGSPIKE_STATE: return "SERVER_MOVINGSPIKE_STATE"; + case PacketType::SERVER_RING_STATE: return "SERVER_RING_STATE"; + case PacketType::SERVER_RING_COLLECTED: return "SERVER_RING_COLLECTED"; + case PacketType::SERVER_ACT9WALL_STATE: return "SERVER_ACT9WALL_STATE"; + case PacketType::SERVER_NAPBALL_STATE: return "SERVER_NAPBALL_STATE"; + case PacketType::SERVER_NAPICE_STATE: return "SERVER_NAPICE_STATE"; + case PacketType::SERVER_PFLIFT_STATE: return "SERVER_PFLIFT_STATE"; + case PacketType::SERVER_BRING_STATE: return "SERVER_BRING_STATE"; + case PacketType::SERVER_BRING_COLLECTED: return "SERVER_BRING_COLLECTED"; + case PacketType::SERVER_VVLCOLUMN_STATE: return "SERVER_VVLCOLUMN_STATE"; + case PacketType::SERVER_VVVASE_STATE: return "SERVER_VVVASE_STATE"; + case PacketType::SERVER_GHZTHUNDER_STATE: return "SERVER_GHZTHUNDER_STATE"; + case PacketType::SERVER_TCGOM_STATE: return "SERVER_TCGOM_STATE"; + case PacketType::SERVER_EXELLERCLONE_STATE: return "SERVER_EXELLERCLONE_STATE"; + case PacketType::SERVER_DTTAILSDOLL_STATE: return "SERVER_DTTAILSDOLL_STATE"; + case PacketType::SERVER_DTBALL_STATE: return "SERVER_DTBALL_STATE"; + case PacketType::SERVER_DTASS_STATE: return "SERVER_DTASS_STATE"; + case PacketType::SERVER_HDDOOR_STATE: return "SERVER_HDDOOR_STATE"; + case PacketType::SERVER_WDLATERN_ACTIVATE: return "SERVER_WDLATERN_ACTIVATE"; + case PacketType::SERVER_FART_STATE: return "SERVER_FART_STATE"; + case PacketType::SERVER_MJLAVA_STATE: return "SERVER_MJLAVA_STATE"; + case PacketType::SERVER_MJJUDGER_STATE: return "SERVER_MJJUDGER_STATE"; + case PacketType::SERVER_MJCRYSTAL_STATE: return "SERVER_MJCRYSTAL_STATE"; + case PacketType::CLIENT_ETRACKER: return "CLIENT_ETRACKER"; + case PacketType::CLIENT_ETRACKER_ACTIVATED: return "CLIENT_ETRACKER_ACTIVATED"; + case PacketType::CLIENT_TPROJECTILE: return "CLIENT_TPROJECTILE"; + case PacketType::CLIENT_TPROJECTILE_HIT: return "CLIENT_TPROJECTILE_HIT"; + case PacketType::CLIENT_TPROJECTILE_STARTCHARGE: return "CLIENT_TPROJECTILE_STARTCHARGE"; + case PacketType::CLIENT_ERECTOR_BALLS: return "CLIENT_ERECTOR_BALLS"; + case PacketType::CLIENT_ERECTOR_BRING_SPAWN: return "CLIENT_ERECTOR_BRING_SPAWN"; + case PacketType::CLIENT_EXELLER_SPAWN_CLONE: return "CLIENT_EXELLER_SPAWN_CLONE"; + case PacketType::CLIENT_EXELLER_TELEPORT_CLONE: return "CLIENT_EXELLER_TELEPORT_CLONE"; + case PacketType::CLIENT_MERCOIN_BONUS: return "CLIENT_MERCOIN_BONUS"; + case PacketType::CLIENT_RMZSLIME_HIT: return "CLIENT_RMZSLIME_HIT"; + case PacketType::CLIENT_LCEYE_REQUEST_ACTIVATE: return "CLIENT_LCEYE_REQUEST_ACTIVATE"; + case PacketType::CLIENT_KAFMONITOR_ACTIVATE: return "CLIENT_KAFMONITOR_ACTIVATE"; + case PacketType::CLIENT_RING_COLLECTED: return "CLIENT_RING_COLLECTED"; + case PacketType::CLIENT_RING_BROKE: return "CLIENT_RING_BROKE"; + case PacketType::CLIENT_BRING_COLLECTED: return "CLIENT_BRING_COLLECTED"; + case PacketType::CLIENT_NAPICE_ACTIVATE: return "CLIENT_NAPICE_ACTIVATE"; + case PacketType::CLIENT_SPRING_USE: return "CLIENT_SPRING_USE"; + case PacketType::CLIENT_PFLIT_ACTIVATE: return "CLIENT_PFLIT_ACTIVATE"; + case PacketType::CLIENT_VVVASE_BREAK: return "CLIENT_VVVASE_BREAK"; + case PacketType::CLIENT_RMZSHARD_COLLECT: return "CLIENT_RMZSHARD_COLLECT"; + case PacketType::CLIENT_RMZSHARD_LAND: return "CLIENT_RMZSHARD_LAND"; + case PacketType::CLIENT_DTASS_ACTIVATE: return "CLIENT_DTASS_ACTIVATE"; + case PacketType::CLIENT_HDDOOR_TOGGLE: return "CLIENT_HDDOOR_TOGGLE"; + case PacketType::CLIENT_FART_PUSH: return "CLIENT_FART_PUSH"; + case PacketType::CLIENT_LOBBY_READY_STATE: return "CLIENT_LOBBY_READY_STATE"; + case PacketType::CLIENT_REQUESTED_INFO: return "CLIENT_REQUESTED_INFO"; + case PacketType::CLIENT_PLAYER_DATA: return "CLIENT_PLAYER_DATA"; + case PacketType::CLIENT_PLAYER_HURT: return "CLIENT_PLAYER_HURT"; + case PacketType::CLIENT_SOUND_EMIT: return "CLIENT_SOUND_EMIT"; + case PacketType::CLIENT_PING: return "CLIENT_PING"; + case PacketType::CLIENT_REVIVAL_PROGRESS: return "CLIENT_REVIVAL_PROGRESS"; + case PacketType::CLIENT_PLAYER_HEAL: return "CLIENT_PLAYER_HEAL"; + case PacketType::CLIENT_PLAYER_HEAL_PART: return "CLIENT_PLAYER_HEAL_PART"; + case PacketType::SERVER_REVIVAL_PROGRESS: return "SERVER_REVIVAL_PROGRESS"; + case PacketType::SERVER_REVIVAL_STATUS: return "SERVER_REVIVAL_STATUS"; + case PacketType::SERVER_REVIVAL_RINGSUB: return "SERVER_REVIVAL_RINGSUB"; + case PacketType::SERVER_REVIVAL_REVIVED: return "SERVER_REVIVAL_REVIVED"; + case PacketType::CLIENT_REQUEST_CHARACTER: return "CLIENT_REQUEST_CHARACTER"; + case PacketType::CLIENT_REQUEST_EXECHARACTER: return "CLIENT_REQUEST_EXECHARACTER"; + case PacketType::CLIENT_VOTE_REQUEST: return "CLIENT_VOTE_REQUEST"; + case PacketType::CLIENT_PLAYER_DEATH_STATE: return "CLIENT_PLAYER_DEATH_STATE"; + case PacketType::CLIENT_PLAYER_ESCAPED: return "CLIENT_PLAYER_ESCAPED"; + case PacketType::SERVER_PLAYER_ESCAPED: return "SERVER_PLAYER_ESCAPED"; + case PacketType::CLIENT_LOBBY_PLAYERS_REQUEST: return "CLIENT_LOBBY_PLAYERS_REQUEST"; + case PacketType::CLIENT_CREAM_SPAWN_RINGS: return "CLIENT_CREAM_SPAWN_RINGS"; + case PacketType::CLIENT_SPAWN_EFFECT: return "CLIENT_SPAWN_EFFECT"; + case PacketType::CLIENT_CHAT_MESSAGE: return "CLIENT_CHAT_MESSAGE"; + case PacketType::CLIENT_LOBBY_CHOOSEVOTEKICK: return "CLIENT_LOBBY_CHOOSEVOTEKICK"; + case PacketType::CLIENT_LOBBY_CHOOSEBAN: return "CLIENT_LOBBY_CHOOSEBAN"; + case PacketType::CLIENT_LOBBY_CHOOSEKICK: return "CLIENT_LOBBY_CHOOSEKICK"; + case PacketType::CLIENT_LOBBY_CHOOSEOP: return "CLIENT_LOBBY_CHOOSEOP"; + case PacketType::CLIENT_PLAYER_PALETTE: return "CLIENT_PLAYER_PALETTE"; + case PacketType::CLIENT_PET_PALETTE: return "CLIENT_PET_PALETTE"; + case PacketType::SERVER_RESULTS: return "SERVER_RESULTS"; + case PacketType::SERVER_RESULTS_DATA: return "SERVER_RESULTS_DATA"; + case PacketType::CLIENT_RESULTS_REQUEST: return "CLIENT_RESULTS_REQUEST"; + case PacketType::CLIENT_STATS_REPORT: return "CLIENT_STATS_REPORT"; + case PacketType::SERVER_PREIDENTITY: return "SERVER_PREIDENTITY"; + case PacketType::SERVER_FELLA: return "SERVER_FELLA"; + case PacketType::CLIENT_PLAYER_POTATER: return "CLIENT_PLAYER_POTATER"; + default: return "Unknown"; + } +} + static constexpr int PACKET_MAXSIZE = 256; -using boost::asio::ip::udp; - -class Packet { - std::array buffer; - uint8_t position = 0; - uint8_t len = 0; -public: - explicit Packet(const std::array &buffer); - explicit Packet(PacketType type); - ~Packet(); - - std::optional readUint8(); - std::optional readUint16(); - std::optional readUint32(); - std::optional readUint64(); - std::optional readFloat(); - std::optional readDouble(); - std::optional readString(); - - void writeUint8(uint8_t value); - void writeUint16(uint16_t value); - void writeUint32(uint32_t value); - void writeUint64(uint64_t value); - void writeFloat(float value); - void writeDouble(double value); - void writeString(const std::string &value); - - void send(udp::endpoint &endpoint, udp::socket &socket); -}; +namespace DisasterServer { + class Peer; + + class Packet { + std::array buffer; + PacketType type; + size_t position = 0; + size_t len = 0; + public: + explicit Packet(const std::array &buffer); + explicit Packet(const enet_uint8 *data, size_t data_size); + explicit Packet(PacketType type); + ~Packet(); + + template + T read() { + T value = reinterpret_cast(buffer.data() + position)[0]; + position += sizeof(T); + return value; + } + + std::string readString(); + + void writeUint8(uint8_t value); + void writeUint16(uint16_t value); + void writeUint32(uint32_t value); + void writeUint64(uint64_t value); + void writeFloat(float value); + void writeDouble(double value); + void writeString(const std::string &value); + + void send(enetpp::server &server, uint32_t client_id, bool reliable); + }; +} + #endif diff --git a/disasterserver/Core/Time.cpp b/disasterserver/Core/Time.cpp new file mode 100644 index 0000000..4817aaa --- /dev/null +++ b/disasterserver/Core/Time.cpp @@ -0,0 +1,48 @@ +#include "Time.hpp" +#include + +#include "Log.hpp" + +bool init = false; +double freq = 0; + +void time_start(TimeStamp* timer) +{ +#ifdef _WIN32 + LARGE_INTEGER li; + + if (!init) + { + if (!QueryPerformanceFrequency(&li)) + { + Err("Failed to query perfomance frequency!"); + return; + } + + freq = (double)(li.QuadPart) / 1000.0; + init = true; + } + + QueryPerformanceCounter(&li); + *timer = (li.QuadPart / freq); +#else + struct timespec _t; + clock_gettime(CLOCK_MONOTONIC, &_t); + *timer = _t.tv_sec * 1000 + _t.tv_nsec / 1e6; +#endif +} + +double time_end(TimeStamp* timer) +{ +#ifdef _WIN32 + LARGE_INTEGER li; + QueryPerformanceCounter(&li); + return (double)((li.QuadPart) / freq) - (*timer); +#else + struct timespec _t; + clock_gettime(CLOCK_MONOTONIC, &_t); + + double current = _t.tv_sec * 1000 + _t.tv_nsec / 1e6; + return current - (*timer); +#endif +} \ No newline at end of file diff --git a/disasterserver/Core/Time.hpp b/disasterserver/Core/Time.hpp new file mode 100644 index 0000000..c12fe61 --- /dev/null +++ b/disasterserver/Core/Time.hpp @@ -0,0 +1,14 @@ +#ifndef DISASTERSERVER_TIME_HPP +#define DISASTERSERVER_TIME_HPP + +#if defined(_WIN32) + #define WIN32_LEAN_AND_MEAN + #include +#endif + +typedef double TimeStamp; +void time_start (TimeStamp* timer); +double time_end (TimeStamp* timer); + + +#endif //DISASTERSERVER_TIME_HPP diff --git a/disasterserver/Main.cpp b/disasterserver/Main.cpp index bbc1951..346cd9a 100644 --- a/disasterserver/Main.cpp +++ b/disasterserver/Main.cpp @@ -1,14 +1,18 @@ #include "Server.hpp" + #include "Core/Log.hpp" int main(int argc, char *argv[]) { try { + enetpp::global_state::get().initialize(); + Info("- DisasterServerCXX v{}", BUILD_VERSION); Info("- Build from {} {}", __DATE__, __TIME__); - boost::asio::io_context io_context; - DisasterServer::Server server(io_context); - io_context.run(); + DisasterServer::Server server; + server.initialize(); + + enetpp::global_state::get().deinitialize(); } catch (std::exception& e) { Err("Exception: {}", e.what()); } diff --git a/disasterserver/Networking/Networking.hpp b/disasterserver/Networking/Networking.hpp new file mode 100644 index 0000000..1dd911a --- /dev/null +++ b/disasterserver/Networking/Networking.hpp @@ -0,0 +1,80 @@ +#ifndef DISASTERSERVER_NETWORKING_HPP +#define DISASTERSERVER_NETWORKING_HPP + +#include +#include +#include + +#include "enet/enet.h" + +namespace DisasterServer::Networking +{ + class NetworkingException : public std::exception { + public: + explicit NetworkingException(const std::string& message); + + template + static NetworkingException Format(std::string_view fmt, Args&&... args) { + return NetworkingException(std::vformat(fmt, std::make_format_args(args...))); + } + }; + + class NetworkingInitializationException : public NetworkingException { + public: + explicit NetworkingInitializationException(const std::string& message); + + template + static NetworkingInitializationException Format(std::string_view fmt, Args&&... args) { + return NetworkingInitializationException(std::vformat(fmt, std::make_format_args(args...))); + } + }; + + enum class NetworkingEventType { + NONE, + CONNECT_EVENT, + DISCONNECT_EVENT, + RECEIVE_EVENT, + }; + + void initialize() { + if (enet_initialize() != 0) { + throw NetworkingInitializationException::Format("Failed to initialize enet."); + } + }; + + class entrypoint { + ENetAddress _address = {}; + public: + entrypoint(uint16_t port) { + _address.host = ENET_HOST_ANY; + _address.port = port; + } + + ENetAddress &getAddress() { + return _address; + } + }; + + class ENetSocket { + ENetHost* host = nullptr; + ENetEvent ev = {}; + public: + ENetSocket(entrypoint ep) { + this->host = enet_host_create(&ep.getAddress(), 50, 2, 0, 0); + } + + void pullEvents(uint32_t timeout, std::function callback) { + if (enet_host_service(host, &ev, timeout) > 0) { + callback(ev.type, ev.peer); + } + } + + ~ENetSocket() { + if (host != nullptr) { + enet_host_destroy(host); + } + } + }; +} + +#endif //DISASTERSERVER_NETWORKING_HPP diff --git a/disasterserver/Peer.cpp b/disasterserver/Peer.cpp index d76b984..0fb65c0 100644 --- a/disasterserver/Peer.cpp +++ b/disasterserver/Peer.cpp @@ -1,13 +1,48 @@ #include "Peer.hpp" +#include "Core/Log.hpp" +#include "Core/Packet.hpp" + using namespace DisasterServer; -Peer::Peer(uint16_t id, std::string ip, udp::endpoint endpoint) : id(id), ip(ip), endpoint(endpoint) { +unsigned int next_uid = 1; + +Peer::Peer() = default; +Peer::~Peer() = default; +void Peer::initialize_client(Peer &client, const char *ip) { + client.id = next_uid++; + client.ip = std::string(ip); } -Peer::~Peer() = default; +uint32_t Peer::get_id() { + return id; +} Peer::AuthPeer &Peer::getAuthPeer() { return auth; -} \ No newline at end of file +} + +bool Peer::identity(Packet &packet) { + RAssert(id > 0); + + uint8_t passtrough = packet.read(); + uint8_t type = packet.read(); + uint16_t build_version = packet.read(); + int32_t server_index = packet.read(); + std::string nickname = packet.readString(); + std::string udid = packet.readString(); + uint8_t lobby_icon = packet.read(); + int8_t pet = packet.read(); + + should_timeout = true; + disconnecting = false; + mod_tool = false; + is_mobile = false; + this->nickname = nickname; + this->udid = udid; + this->lobby_icon = lobby_icon; + this->pet = pet; + + return true; +} diff --git a/disasterserver/Peer.hpp b/disasterserver/Peer.hpp index 5535a5d..9c426d3 100644 --- a/disasterserver/Peer.hpp +++ b/disasterserver/Peer.hpp @@ -1,17 +1,35 @@ #ifndef DISASTERSERVER_PEER_HPP #define DISASTERSERVER_PEER_HPP -#include -#include - #include "Core/Packet.hpp" +#include "Core/ENet/server_listen_params.h" namespace DisasterServer { - class Peer : public boost::enable_shared_from_this { + enum class SurvCharacters { + CH_NONE = -1, + + CH_TAILS, + CH_KNUX, + CH_EGGMAN, + CH_AMY, + CH_CREAM, + CH_SALLY + }; + + enum class ExesCharacters { + EX_NONE = -1, + + EX_ORIGINAL, + EX_CHAOS, + EX_EXETIOR, + EX_EXELLER + }; + + class Peer { uint16_t id; std::string ip; - udp::endpoint endpoint; + void *endpoint; /* General info */ //Player plr; @@ -38,11 +56,28 @@ namespace DisasterServer AuthPeer auth; + /* Character */ + SurvCharacters survChars; + ExesCharacters exesChars; + + bool should_timeout; + + /* State info */ + uint8_t exe_chance; + double timeout; + double vote_cooldown; + public: - Peer(uint16_t id, std::string ip, udp::endpoint endpoint); + Peer(); ~Peer(); + static void initialize_client(Peer &client, const char *ip); + + uint32_t get_id(); AuthPeer &getAuthPeer(); + + + bool identity(Packet &packet); }; } diff --git a/disasterserver/Server.cpp b/disasterserver/Server.cpp index 8a48206..f6d1fc5 100644 --- a/disasterserver/Server.cpp +++ b/disasterserver/Server.cpp @@ -3,90 +3,166 @@ #include #include "Core/Packet.hpp" -#include #include "Core/Log.hpp" +#include "Core/Time.hpp" using namespace DisasterServer; -Server::Server(boost::asio::io_context &io_context) : io_context(io_context), socket(io_context, udp::endpoint(udp::v4(), BASE_SERVER_PORT)) { - worker(); +Server::Server() { + +} + +void Server::initialize() { + server.start_listening(enetpp::server_listen_params() + .set_max_client_count(50) + .set_channel_count(2) + .set_listen_port(BASE_SERVER_PORT) + .set_initialize_client_function(Peer::initialize_client)); + + while (!running) { + auto on_client_connected = [&](Peer& client) { this->on_client_connected(client); }; + auto on_client_disconnected = [&](unsigned int client_uid) { this->on_client_disconnected(client_uid); }; + auto on_client_received = [&](Peer& client, const enet_uint8* data, size_t data_size) { this->on_client_received(client, data, data_size); }; + + server.consume_events(on_client_connected, on_client_disconnected, on_client_received); + } + + server.stop_listening(); +} + +void Server::on_client_connected(Peer &peer) { + Debug("Connection client {}", peer.get_id()); + + Packet preidentity(PacketType::SERVER_PREIDENTITY); + peer.getAuthPeer().one = (uint8_t) rand() % 128; + peer.getAuthPeer().two = (uint8_t) rand() % 255; + + uint32_t type = 0; + + switch (rand() % 3) + { + case 0: + type = 1u << 9; + break; + + case 1: + type = 1u << 31; + break; + + case 2: + type = 1u << 26; + break; + + default: break; + } + + for (int bit = 0; bit < 32; ++bit) + { + if (bit == 9 || bit == 31 || bit == 26) + continue; + + if (rand() % 3 <= 1) + type &= ~(1u << bit); + else + type |= 1u << bit; + } + + peer.getAuthPeer().type = type; + + preidentity.writeUint16(0); + preidentity.writeUint16(1); + preidentity.writeUint8(peer.getAuthPeer().one); + preidentity.writeUint8((uint8_t) rand() % 2); + preidentity.writeUint8(peer.getAuthPeer().two); + + const uint8_t key[6] = { 0x00, 0x00, 0xFF, 0x1F, 0x80, 0x14 }; + + for (int i = 0; i < 3; i++) { + preidentity.writeUint8(key[rand() % sizeof(key)]); + } + preidentity.writeUint32(peer.getAuthPeer().type); + preidentity.send(server, peer.get_id(), true); + +} + +void Server::on_client_disconnected(uint32_t client_id) { + +} + +void Server::on_client_received(Peer &peer, const enet_uint8 *data, size_t data_size) { + switch (static_cast(data[1])) { + case PacketType::IDENTITY: { + Packet packet(data, data_size); + if (!peer.identity(packet)) { + Debug("Identity failed for id {}", peer.get_id()); + } + break; + } + default: break; + } } +/* bool Server::worker() { - boost::system::error_code error_code; - socket.non_blocking(true, error_code); - Packet packet(PacketType::SERVER_HEARTBEAT); + TimeStamp ticker; + time_start(&ticker); - for (;;) { + double next_tick = time_end(&ticker); + double heartbeat = 0.0; + const double TARGET_FPS = 1000.0 / 60; + + //Packet packet_heartbeat(PacketType::SERVER_HEARTBEAT); + + while (true) { udp::endpoint endpoint; socket.receive_from(boost::asio::buffer(recv_buffer), endpoint, 0, error_code); if (!error_code) { auto it = peers.find(endpoint); if (it == peers.end()) { + Debug("Connection client {}:{}", endpoint.address().to_string(), endpoint.port()); Peer peer(id_counter++, endpoint.address().to_string(), std::move(endpoint)); peers.try_emplace(endpoint, std::move(peer)); - Packet packet_preIdentity(PacketType::SERVER_PREIDENTITY); - - /* Auth client */ - peer.getAuthPeer().one = (uint8_t) rand() % 128; - peer.getAuthPeer().two = (uint8_t) rand() % 255; + Debug("Creating peer id: {}", peer.getId()); - uint32_t type = 0; - switch (rand() % 3) - { - case 0: - type = 1u << 9; - break; - case 1: - type = 1u << 31; - break; + } - case 2: - type = 1u << 26; - break; + switch (static_cast(recv_buffer[1])) { + case PacketType::IDENTITY: { - default: break; - } + Packet packet(recv_buffer); + Peer peer = peers.at(endpoint); - for (int bit = 0; bit < 32; ++bit) - { - if (bit == 9 || bit == 31 || bit == 26) - continue; + if (!peer.identity(packet)) { + Debug("Identity failed for id %d", peer.getId()); + } - if (rand() % 3 <= 1) - type &= ~(1u << bit); - else - type |= 1u << bit; + break; } - - peer.getAuthPeer().type = type; - - packet_preIdentity.writeUint16(0); - packet_preIdentity.writeUint16(1); - packet_preIdentity.writeUint8(peer.getAuthPeer().one); - packet_preIdentity.writeUint8((uint8_t) rand() % 2); - packet_preIdentity.writeUint8(peer.getAuthPeer().two); - - const uint8_t key[6] = { 0x00, 0x00, 0xFF, 0x1F, 0x80, 0x14 }; - - for (int i = 0; i < 3; i++) { - packet_preIdentity.writeUint8(key[rand() % sizeof(key)]); + default: { + break; } + } + } - packet_preIdentity.writeUint32(peer.getAuthPeer().type); + double now = time_end(&ticker); + while (next_tick < now) { + next_tick += TARGET_FPS; - packet_preIdentity.send(endpoint, socket); + if (peers.empty()) { + if (heartbeat >= (TICKSPERSEC * 2)) { + Debug("Heartbeat done."); + heartbeat = 0; + } } - } - if (error_code != boost::asio::error::would_block && error_code != boost::asio::error::try_again) { - return false; + delta = 1; } + } } - +*/ diff --git a/disasterserver/Server.hpp b/disasterserver/Server.hpp index 16354e2..6389266 100644 --- a/disasterserver/Server.hpp +++ b/disasterserver/Server.hpp @@ -1,31 +1,28 @@ #ifndef DISASTERSERVER_SERVER_HPP #define DISASTERSERVER_SERVER_HPP -#include - #include "Peer.hpp" -#include "Core/Packet.hpp" + +#include "Core/ENet/server.h" #define TICKSPERSEC 60 #define BUILD_VERSION 1101 #define BASE_SERVER_PORT 8606 -using boost::asio::ip::udp; - namespace DisasterServer { class Server { - boost::asio::io_context &io_context; - udp::socket socket; - std::array recv_buffer = {}; - - uint16_t id_counter = 0; - std::unordered_map peers; + bool running = false; + enetpp::server server; + double delta = 0; public: - Server(boost::asio::io_context& io_context); - + Server(); + void initialize(); private: - bool worker(); + void on_client_connected(Peer &peer); + void on_client_disconnected(uint32_t client_id); + void on_client_received(Peer &peer, const enet_uint8 *data, size_t data_size); + //bool worker(); }; } diff --git a/disasterserver_c/Server.c b/disasterserver_c/Server.c index 4926112..76450f9 100644 --- a/disasterserver_c/Server.c +++ b/disasterserver_c/Server.c @@ -318,89 +318,90 @@ bool server_worker(Server *server) { switch (ev.type) { - case ENET_EVENT_TYPE_CONNECT: - { - Debug("ENET_EVENT_TYPE_CONNECT..."); - ev.peer->data = (PeerData *)malloc(sizeof(PeerData)); - if (!ev.peer->data) - return false; - - memset(ev.peer->data, 0, sizeof(PeerData)); - - PeerData *v = ev.peer->data; - v->server = server; - v->peer = ev.peer; - v->id = ev.peer->incomingPeerID + 1; - enet_address_get_host_ip(&ev.peer->address, v->ip.value, 250); - - Packet packet; - PacketCreate(&packet, SERVER_PREIDENTITY); - RAssert(auth_create_ticket(v, &packet)); - RAssert(packet_send(ev.peer, &packet, true)); - break; - } - - case ENET_EVENT_TYPE_DISCONNECT: - { - Debug("ENET_EVENT_TYPE_DISCONNECT..."); - PeerData *v = (PeerData *)ev.peer->data; - if (!v) - break; - - if (!v->op && v->should_timeout) + case ENET_EVENT_TYPE_CONNECT: { - uint64_t result; - if (timeout_check(v->udid.value, v->ip.value, &result) && result == 0) - timeout_set(v->nickname.value, v->udid.value, v->ip.value, time(NULL) + 5); + Debug("ENET_EVENT_TYPE_CONNECT..."); + ev.peer->data = (PeerData *)malloc(sizeof(PeerData)); + if (!ev.peer->data) + return false; + + memset(ev.peer->data, 0, sizeof(PeerData)); + + PeerData *v = ev.peer->data; + v->server = server; + v->peer = ev.peer; + v->id = ev.peer->incomingPeerID + 1; + enet_address_get_host_ip(&ev.peer->address, v->ip.value, 250); + + Packet packet; + PacketCreate(&packet, SERVER_PREIDENTITY); + RAssert(auth_create_ticket(v, &packet)); + RAssert(packet_send(ev.peer, &packet, true)); + break; } - if (v->verified) + case ENET_EVENT_TYPE_DISCONNECT: { - MutexLock(ip_addr_mut); + Debug("ENET_EVENT_TYPE_DISCONNECT..."); + PeerData *v = (PeerData *)ev.peer->data; + if (!v) + break; + + if (!v->op && v->should_timeout) { - cJSON_DeleteItemFromObject(ip_addr_list, v->udid.value); - cJSON_DeleteItemFromObject(ip_addr_list, v->ip.value); + uint64_t result; + if (timeout_check(v->udid.value, v->ip.value, &result) && result == 0) + timeout_set(v->nickname.value, v->udid.value, v->ip.value, time(NULL) + 5); } - MutexUnlock(ip_addr_mut); - MutexLock(v->server->state_lock); + if (v->verified) { - // Step 3: Cleanup (Only if joined before) - if (dylist_remove(&v->server->peers, v)) - server_state_left(v); - } - MutexUnlock(v->server->state_lock); - } + MutexLock(ip_addr_mut); + { + cJSON_DeleteItemFromObject(ip_addr_list, v->udid.value); + cJSON_DeleteItemFromObject(ip_addr_list, v->ip.value); + } + MutexUnlock(ip_addr_mut); - Info("%s (id %d) " LOG_YLW "left.", v->nickname.value, v->id); - free(v); - break; - } + MutexLock(v->server->state_lock); + { + // Step 3: Cleanup (Only if joined before) + if (dylist_remove(&v->server->peers, v)) + server_state_left(v); + } + MutexUnlock(v->server->state_lock); + } - case ENET_EVENT_TYPE_RECEIVE: - { - PeerData *v = (PeerData *)ev.peer->data; - Packet packet = packet_from(ev.packet); + Info("%s (id %d) " LOG_YLW "left.", v->nickname.value, v->id); + free(v); + break; + } - switch (packet.buff[1]) + case ENET_EVENT_TYPE_RECEIVE: { - case IDENTITY: + PeerData *v = (PeerData *)ev.peer->data; + Packet packet = packet_from(ev.packet); + + switch (packet.buff[1]) { - if (!peer_identity(v, &packet)) + case IDENTITY: { - Debug("Identity failed for id %d", v->id); - } - break; - } - default: - { - if (!peer_msg(v, &packet)) + if (!peer_identity(v, &packet)) + { + Debug("Identity failed for id %d", v->id); + } break; + } + default: + { + if (!peer_msg(v, &packet)) + break; + } } - } - break; - } + break; + } + default: break; } } diff --git a/vcpkg.json b/vcpkg.json index 43762f5..340ae53 100644 --- a/vcpkg.json +++ b/vcpkg.json @@ -2,8 +2,6 @@ "name": "disasterserver", "version": "0.0.1", "dependencies": [ - "boost-bind", - "boost-smart-ptr", - "boost-asio" + "boost-bind" ] } \ No newline at end of file From 8a23263306f34bbc1ded0025a7931619e1032487 Mon Sep 17 00:00:00 2001 From: MilesGlitch Date: Sat, 5 Sep 2026 16:31:46 +0300 Subject: [PATCH 08/61] Update --- disasterserver/Core/ENet/server.h | 58 +++++++- disasterserver/Core/Packet.cpp | 137 +++---------------- disasterserver/Core/Packet.hpp | 39 ++++-- disasterserver/Core/Util.hpp | 7 + disasterserver/Main.cpp | 2 +- disasterserver/Peer.cpp | 135 ++++++++++++++++--- disasterserver/Peer.hpp | 28 +++- disasterserver/Server.cpp | 216 ++++++++++++++++++------------ disasterserver/Server.hpp | 65 ++++++++- disasterserver_c/Server.c | 1 + disasterserver_c/states/Lobby.c | 6 +- 11 files changed, 441 insertions(+), 253 deletions(-) create mode 100644 disasterserver/Core/Util.hpp diff --git a/disasterserver/Core/ENet/server.h b/disasterserver/Core/ENet/server.h index cf1cfcb..b235320 100644 --- a/disasterserver/Core/ENet/server.h +++ b/disasterserver/Core/ENet/server.h @@ -109,7 +109,7 @@ namespace enetpp { auto packet = enet_packet_create(data, data_size, flags); for (auto c : _connected_clients) { if (predicate(*c)) { - _packet_queue.emplace(channel_id, packet, c->get_id()); + _packet_queue.emplace(channel_id, packet, c->getId()); } } } @@ -117,7 +117,7 @@ namespace enetpp { void consume_events( std::function on_client_connected, - std::function on_client_disconnected, + std::function on_client_disconnected, std::function on_client_data_received) { if (!_event_queue.empty()) { @@ -141,10 +141,10 @@ namespace enetpp { case ENET_EVENT_TYPE_DISCONNECT: { auto iter = std::find(_connected_clients.begin(), _connected_clients.end(), e._client); assert(iter != _connected_clients.end()); + unsigned int client_id = e._client->getId(); + on_client_disconnected(*e._client, client_id); _connected_clients.erase(iter); - unsigned int client_id = e._client->get_id(); delete e._client; - on_client_disconnected(client_id); break; } @@ -168,6 +168,52 @@ namespace enetpp { return _connected_clients; } +/// ====================== Могут быть проблемы ================== + void disconnect_leter(uint32_t id, uint32_t reason) { + auto iter = _thread_peer_map.find(id); + if (iter != _thread_peer_map.end()) { + Err("{} not found", id); + return; + } + enet_peer_disconnect_later(iter->second, reason); + iter->second->data = nullptr; + _thread_peer_map.erase(iter->first); + + std::lock_guard lock(_event_queue_mutex); + _event_queue.emplace(ENET_EVENT_TYPE_DISCONNECT, 0, nullptr, reinterpret_cast(iter->second->data)); + } + + void disconnect(uint32_t id, uint32_t reason) { + auto iter = _thread_peer_map.find(id); + if (iter != _thread_peer_map.end()) { + Err("{} not found", id); + return; + } + enet_peer_disconnect(iter->second, reason); + iter->second->data = nullptr; + _thread_peer_map.erase(iter->first); + + std::lock_guard lock(_event_queue_mutex); + _event_queue.emplace(ENET_EVENT_TYPE_DISCONNECT, 0, nullptr, reinterpret_cast(iter->second->data)); + } +/// ============================================================== +/* + * + * void handle_disconnect_event_in_thread(const ENetEvent& e) { + auto client = reinterpret_cast(e.peer->data); + if (client != nullptr) { + auto iter = _thread_peer_map.find(client->getId()); + assert(iter != _thread_peer_map.end()); + assert(iter->second == e.peer); + e.peer->data = nullptr; + _thread_peer_map.erase(iter); + + std::lock_guard lock(_event_queue_mutex); + _event_queue.emplace(ENET_EVENT_TYPE_DISCONNECT, 0, nullptr, client); + } + } + * + */ private: void run_in_thread(const listen_params_type& params) { set_current_thread_name("enetpp::server"); @@ -281,7 +327,7 @@ namespace enetpp { assert(e.peer->data == nullptr); e.peer->data = client; - _thread_peer_map[client->get_id()] = e.peer; + _thread_peer_map[client->getId()] = e.peer; { std::lock_guard lock(_event_queue_mutex); @@ -292,7 +338,7 @@ namespace enetpp { void handle_disconnect_event_in_thread(const ENetEvent& e) { auto client = reinterpret_cast(e.peer->data); if (client != nullptr) { - auto iter = _thread_peer_map.find(client->get_id()); + auto iter = _thread_peer_map.find(client->getId()); assert(iter != _thread_peer_map.end()); assert(iter->second == e.peer); e.peer->data = nullptr; diff --git a/disasterserver/Core/Packet.cpp b/disasterserver/Core/Packet.cpp index 423db1c..959f1a8 100644 --- a/disasterserver/Core/Packet.cpp +++ b/disasterserver/Core/Packet.cpp @@ -1,6 +1,10 @@ #include "Packet.hpp" +#include + #include "Log.hpp" +#include "Peer.hpp" +#include "Server.hpp" #ifdef __GNUC__ // GCC, clang... #define BYTESWAP_16(x) __builtin_bswap16((x)) @@ -19,18 +23,15 @@ Packet::Packet(const std::array &buffer) : buffer(buffe type = static_cast(read()); } -#undef min - -Packet::Packet(const enet_uint8 *data, size_t data_size) { +Packet::Packet(const enet_uint8 *data, size_t data_size) : buffer({}) { std::copy_n(data, std::min(data_size, buffer.size()), buffer.begin()); - len = data_size; - type = static_cast(255); + read(); + type = static_cast(read()); } Packet::Packet(PacketType type) : buffer({}), type(type) { - Debug("Creating packet PacketType::{}", getPacketTypeName(type)); - writeUint8(0); - writeUint8(static_cast(type)); + write(0); + write(static_cast(type)); } Packet::~Packet() = default; @@ -39,7 +40,7 @@ std::string Packet::readString() { std::string result; while (position < buffer.size()) { - char ch = static_cast(buffer[position++]); + auto ch = static_cast(buffer[position++]); if (ch == '\0') break; @@ -50,117 +51,17 @@ std::string Packet::readString() { return result; } -void Packet::writeUint8(uint8_t value) { - if (position + sizeof(uint8_t) > PACKET_MAXSIZE) { - Err("Exceeding the Packet Size Limit. Max Size {}", PACKET_MAXSIZE); - return; - } - - if (position + sizeof(uint8_t) >= len) { - len++; - } - - buffer[position++] = value; -} - -void Packet::writeUint16(uint16_t value) { - if (position + sizeof(uint16_t) > PACKET_MAXSIZE) { - Err("Exceeding the Packet Size Limit. Max Size {}", PACKET_MAXSIZE); - return; - } - - if (position + sizeof(uint16_t) >= len) { - len += sizeof(uint16_t); - } - - uint8_t *ptr = (uint8_t*)&value; - buffer[position++] = ptr[0]; - buffer[position++] = ptr[1]; -} - -void Packet::writeUint32(uint32_t value) { - if (position + sizeof(uint32_t) > PACKET_MAXSIZE) { - Err("Exceeding the Packet Size Limit. Max Size {}", PACKET_MAXSIZE); - return; - } - - if (position + sizeof(uint32_t) >= len) { - len += sizeof(uint32_t); - } - - uint8_t *ptr = (uint8_t*)&value; - buffer[position++] = ptr[0]; - buffer[position++] = ptr[1]; - buffer[position++] = ptr[2]; - buffer[position++] = ptr[3]; -} - -void Packet::writeUint64(uint64_t value) { - if (position + sizeof(uint64_t) > PACKET_MAXSIZE) { - Err("Exceeding the Packet Size Limit. Max Size {}", PACKET_MAXSIZE); - return; - } - - if (position + sizeof(uint64_t) >= len) { - len += sizeof(uint64_t); - } - - uint8_t *ptr = (uint8_t*)&value; - buffer[position++] = ptr[0]; - buffer[position++] = ptr[1]; - buffer[position++] = ptr[2]; - buffer[position++] = ptr[3]; - buffer[position++] = ptr[4]; - buffer[position++] = ptr[5]; - buffer[position++] = ptr[6]; - buffer[position++] = ptr[7]; -} - -void Packet::writeFloat(float value) { - if (position + sizeof(float) > PACKET_MAXSIZE) { - Err("Exceeding the Packet Size Limit. Max Size {}", PACKET_MAXSIZE); - return; - } - - if (position + sizeof(float) >= len) { - len += sizeof(float); - } - - uint8_t *ptr = (uint8_t*)&value; - buffer[position++] = ptr[0]; - buffer[position++] = ptr[1]; - buffer[position++] = ptr[2]; - buffer[position++] = ptr[3]; -} - -void Packet::writeDouble(double value) { - if (position + sizeof(double) > PACKET_MAXSIZE) { - Err("Exceeding the Packet Size Limit. Max Size {}", PACKET_MAXSIZE); - return; - } - - if (position + sizeof(double) >= len) { - len += sizeof(double); - } - - uint8_t *ptr = (uint8_t*)&value; - buffer[position++] = ptr[0]; - buffer[position++] = ptr[1]; - buffer[position++] = ptr[2]; - buffer[position++] = ptr[3]; - buffer[position++] = ptr[4]; - buffer[position++] = ptr[5]; - buffer[position++] = ptr[6]; - buffer[position++] = ptr[7]; -} - void Packet::writeString(const std::string &value) { - for (uint8_t i = 0; i < value.size(); i++) { - writeUint8(value[i]); + for (char i : value) { + write(i); } } -void Packet::send(enetpp::server &server, uint32_t client_id, bool reliable) { - Debug("packet PacketType::{} sending to {}", getPacketTypeName(type), client_id); - server.send_packet_to(client_id, reliable ? 0 : 1, buffer.data(), len, reliable ? ENET_PACKET_FLAG_RELIABLE : 0); +void Packet::send(Server &server, uint32_t client_id, bool reliable) { + Debug("PacketType::{} sending to {}", getPacketTypeName(type), client_id); + server.getBackend().send_packet_to(client_id, reliable ? 0 : 1, buffer.data(), len, reliable ? ENET_PACKET_FLAG_RELIABLE : 0); } + +void Packet::sendBroadcast(Server &server, bool reliable, std::function predicate) { + server.getBackend().send_packet_to_all_if(reliable ? 0 : 1, buffer.data(), len, reliable ? ENET_PACKET_FLAG_RELIABLE : 0, std::move(predicate)); +} \ No newline at end of file diff --git a/disasterserver/Core/Packet.hpp b/disasterserver/Core/Packet.hpp index 5c27069..9a1344c 100644 --- a/disasterserver/Core/Packet.hpp +++ b/disasterserver/Core/Packet.hpp @@ -314,18 +314,20 @@ inline std::string getPacketTypeName(PacketType type) { case PacketType::SERVER_PREIDENTITY: return "SERVER_PREIDENTITY"; case PacketType::SERVER_FELLA: return "SERVER_FELLA"; case PacketType::CLIENT_PLAYER_POTATER: return "CLIENT_PLAYER_POTATER"; - default: return "Unknown"; + default: return ""; } } - static constexpr int PACKET_MAXSIZE = 256; +#undef min + namespace DisasterServer { + class Server; class Peer; class Packet { - std::array buffer; + std::array buffer{}; PacketType type; size_t position = 0; size_t len = 0; @@ -335,6 +337,10 @@ namespace DisasterServer { explicit Packet(PacketType type); ~Packet(); + PacketType getPacketType() { + return type; + } + template T read() { T value = reinterpret_cast(buffer.data() + position)[0]; @@ -342,17 +348,28 @@ namespace DisasterServer { return value; } - std::string readString(); + template + void write(T value) { + if (position + sizeof(T) > PACKET_MAXSIZE) { + Err("Exceeding the Packet Size Limit. Max Size {}", PACKET_MAXSIZE); + return; + } + + if (position + sizeof(T) >= len) { + len++; + } - void writeUint8(uint8_t value); - void writeUint16(uint16_t value); - void writeUint32(uint32_t value); - void writeUint64(uint64_t value); - void writeFloat(float value); - void writeDouble(double value); + const auto *ptr = reinterpret_cast(&value); + for (uint32_t i = 0; i < sizeof(T); i++) { + buffer[position++] = ptr[i]; + } + } + + std::string readString(); void writeString(const std::string &value); - void send(enetpp::server &server, uint32_t client_id, bool reliable); + void send(Server &server, uint32_t client_id, bool reliable); + void sendBroadcast(Server &server, bool reliable, std::function predicate = [](const Peer& client) { return true; }); }; } diff --git a/disasterserver/Core/Util.hpp b/disasterserver/Core/Util.hpp new file mode 100644 index 0000000..c464734 --- /dev/null +++ b/disasterserver/Core/Util.hpp @@ -0,0 +1,7 @@ +#ifndef DISASTERSERVER_UTIL_HPP +#define DISASTERSERVER_UTIL_HPP + +#include "Server.hpp" + + +#endif //DISASTERSERVER_UTIL_HPP diff --git a/disasterserver/Main.cpp b/disasterserver/Main.cpp index 346cd9a..ef7daf5 100644 --- a/disasterserver/Main.cpp +++ b/disasterserver/Main.cpp @@ -6,7 +6,7 @@ int main(int argc, char *argv[]) { try { enetpp::global_state::get().initialize(); - Info("- DisasterServerCXX v{}", BUILD_VERSION); + Info("- DisasterServerCXX v{}", DisasterServer::BUILD_VERSION); Info("- Build from {} {}", __DATE__, __TIME__); DisasterServer::Server server; diff --git a/disasterserver/Peer.cpp b/disasterserver/Peer.cpp index 0fb65c0..9102bf5 100644 --- a/disasterserver/Peer.cpp +++ b/disasterserver/Peer.cpp @@ -1,5 +1,6 @@ #include "Peer.hpp" +#include "Server.hpp" #include "Core/Log.hpp" #include "Core/Packet.hpp" @@ -8,6 +9,7 @@ using namespace DisasterServer; unsigned int next_uid = 1; Peer::Peer() = default; + Peer::~Peer() = default; void Peer::initialize_client(Peer &client, const char *ip) { @@ -15,28 +17,20 @@ void Peer::initialize_client(Peer &client, const char *ip) { client.ip = std::string(ip); } -uint32_t Peer::get_id() { - return id; -} - -Peer::AuthPeer &Peer::getAuthPeer() { - return auth; -} - bool Peer::identity(Packet &packet) { RAssert(id > 0); - uint8_t passtrough = packet.read(); - uint8_t type = packet.read(); - uint16_t build_version = packet.read(); - int32_t server_index = packet.read(); - std::string nickname = packet.readString(); - std::string udid = packet.readString(); - uint8_t lobby_icon = packet.read(); - int8_t pet = packet.read(); + bool isBanned = false; + uint64_t timeout = 0; + + uint16_t build_version = packet.read(); // NOLINT(*-use-auto) + int32_t server_index = packet.read(); // NOLINT(*-use-auto) + std::string nickname = packet.readString(); // NOLINT(*-use-auto) + std::string udid = packet.readString(); // NOLINT(*-use-auto) + uint8_t lobby_icon = packet.read(); // NOLINT(*-use-auto) + int8_t pet = packet.read(); // NOLINT(*-use-auto) should_timeout = true; - disconnecting = false; mod_tool = false; is_mobile = false; this->nickname = nickname; @@ -44,5 +38,112 @@ bool Peer::identity(Packet &packet) { this->lobby_icon = lobby_icon; this->pet = pet; + + //this->in_game = (server->state == ST_LOBBY); //TODO: Create States Machine + this->exe_chance = 1 + rand() % 4; + + if (this->server->getPeers().size() >= MAX_PLAYERS) { + this->server->disconnect(*this, DisconnectReason::LOBBYFULL); + return false; + } + + if (packet.getPacketType() != PacketType::IDENTITY) { + this->server->disconnect(*this, DisconnectReason::OTHER, "type != IDENTITY?"); + return false; + } + + if (build_version != BUILD_VERSION) { + this->server->disconnect(*this, DisconnectReason::VERMISMATCH); + return false; + } + + if (nickname.length() >= 30) { + this->server->disconnect(*this, DisconnectReason::OTHER, "Your nickname is too long! (30 characters max)"); + return false; + } + + if (udid.length() <= 0) { + this->server->disconnect(*this, DisconnectReason::OTHER, "whoops you have to put the CD in you conputer"); + return false; + } + + if (!identity_process(ip, isBanned, timeout, server_index == -1)) { + return false; + } + + Info("{} (id {}) joined.", nickname, id); + Info(" IP: {}", ip); + Info(" UID: {}", udid); + Info(" Modified: {}", BoolStringify(mod_tool)); + Info(" Mobile: {}", BoolStringify(is_mobile)); + + this->verified = true; + + return true; +} + +bool Peer::identity_process(const std::string &addr, bool is_banned, uint64_t timeout, bool do_timeout) { + /*if (!is_banned) { + Info("{} banned by host (id {}, ip {})", nickname, id, addr); + this->server->disconnect(*this, DisconnectReason::BANNEDBYHOST); + return false; + }*/ + + if (this->server->getPeers().size() >= 7) { + this->server->disconnect(*this, DisconnectReason::LOBBYFULL); + return false; + } + + if (do_timeout && timeout != 0) { + time_t tm = time(nullptr); + time_t val = timeout - tm; + if (val > 0) { + Info("{} is rate-limited (id {}, ip {})", nickname, id, addr); + this->server->disconnect(*this, DisconnectReason::RATELIMITED); + return false; + } + } + + Packet identity_response(PacketType::SERVER_IDENTITY_RESPONSE); + identity_response.write(1 /*this->state == ST_LOBBY*/); + identity_response.write(static_cast(id)); + identity_response.send(*this->server, id, true); + + if (!in_game) { + for (size_t i = 0; i < this->server->getPeers().size(); i++) { + auto peer = this->server->getPeers()[i]; + + if (peer->getId() == id) { + continue; + } + + Packet pack(PacketType::SERVER_WAITING_PLAYER_INFO); + pack.write(0); /* v->server->state == ST_GAME && peer->in_game */ + pack.write(static_cast(peer->getId())); + pack.writeString(nickname); + + if (false /* v->server->state == ST_GAME && peer->in_game */) { + + pack.write( 0 /* v->server->game.exe == peer->id */ ); + pack.write( 0 /* v->server->game.exe == peer->id ? peer->exe_char : peer->surv_char */); + + } else { + pack.write(lobby_icon); + } + + pack.send(*this->server, id, true); + } + + // For other players in queue + Packet pack(PacketType::SERVER_WAITING_PLAYER_INFO); + pack.write(0); + pack.write(static_cast(getId())); + pack.writeString(nickname); + pack.write(lobby_icon); + this->server->broadcast_ex(pack, true, id); + + this->server->send_message(id, "hello!"); + } + return true; } diff --git a/disasterserver/Peer.hpp b/disasterserver/Peer.hpp index 9c426d3..88f69bf 100644 --- a/disasterserver/Peer.hpp +++ b/disasterserver/Peer.hpp @@ -2,10 +2,11 @@ #define DISASTERSERVER_PEER_HPP #include "Core/Packet.hpp" -#include "Core/ENet/server_listen_params.h" namespace DisasterServer { + class Server; + enum class SurvCharacters { CH_NONE = -1, @@ -27,9 +28,8 @@ namespace DisasterServer }; class Peer { - uint16_t id; + uint32_t id; std::string ip; - void *endpoint; /* General info */ //Player plr; @@ -46,7 +46,6 @@ namespace DisasterServer bool is_mobile; bool can_vote; bool voted; - bool disconnecting; struct AuthPeer { uint32_t type; @@ -68,16 +67,33 @@ namespace DisasterServer double vote_cooldown; public: + Server *server = nullptr; + Peer(); ~Peer(); static void initialize_client(Peer &client, const char *ip); - uint32_t get_id(); - AuthPeer &getAuthPeer(); + uint32_t getId() const { return id; } + std::string getIp() const { return ip; } + std::string getNickname() { return nickname; } + std::string getUdid() { return udid; } + uint8_t getLobbyIcon() { return lobby_icon; } + int8_t getPet() { return pet; } + AuthPeer &getAuthPeer() { return auth; } + bool isVerified() { return verified; } + bool isInGame() { return in_game; } + bool isOpped() { return op; } + bool isModified() { return mod_tool; } + + void setReady(bool flag) { ready = flag; } + bool isReady() { return ready; } + void setVoted(bool flag) { voted = flag; } + bool isVoted() { return voted; } bool identity(Packet &packet); + bool identity_process(const std::string & addr, bool is_banned, uint64_t timeout, bool do_timeout); }; } diff --git a/disasterserver/Server.cpp b/disasterserver/Server.cpp index f6d1fc5..629ac34 100644 --- a/disasterserver/Server.cpp +++ b/disasterserver/Server.cpp @@ -1,38 +1,126 @@ #include "Server.hpp" -#include - #include "Core/Packet.hpp" - #include "Core/Log.hpp" #include "Core/Time.hpp" using namespace DisasterServer; -Server::Server() { - -} +Server::Server() = default; void Server::initialize() { - server.start_listening(enetpp::server_listen_params() + backend.start_listening(enetpp::server_listen_params() .set_max_client_count(50) .set_channel_count(2) .set_listen_port(BASE_SERVER_PORT) .set_initialize_client_function(Peer::initialize_client)); + + TimeStamp ticker; + time_start(&ticker); + + double next_tick = time_end(&ticker); + double heartbeat = 0.0; + const double TARGET_FPS = 1000.0 / 60; + + Packet pack(PacketType::SERVER_HEARTBEAT); while (!running) { - auto on_client_connected = [&](Peer& client) { this->on_client_connected(client); }; - auto on_client_disconnected = [&](unsigned int client_uid) { this->on_client_disconnected(client_uid); }; - auto on_client_received = [&](Peer& client, const enet_uint8* data, size_t data_size) { this->on_client_received(client, data, data_size); }; + backend.consume_events( + [&](Peer& client) { this->on_client_connected(client); }, + [&](Peer &client, uint32_t client_uid) { this->on_client_disconnected(client, client_uid); }, + [&](Peer& client, const enet_uint8* data, size_t data_size) { this->on_client_received(client, data, data_size); } + ); + double now = time_end(&ticker); + while (next_tick < now) { + next_tick += TARGET_FPS; - server.consume_events(on_client_connected, on_client_disconnected, on_client_received); + //States tick + + + // Heartbeat + if (backend.get_connected_clients().empty()) { + broadcast(pack, true); + if (heartbeat >= (TICKSPERSEC * 2)) + { + Debug("Heartbeat done."); + heartbeat = 0; + } + heartbeat += delta; + } + + delta = 1; + } + } + + backend.stop_listening(); +} + +void Server::disconnect(Peer &peer, DisconnectReason reason, const std::string& message) { + if (reason == DisconnectReason::OTHER && !message.empty()) { + Packet packet(PacketType::SERVER_PLAYER_FORCE_DISCONNECT); + packet.write(static_cast(reason)); + packet.writeString(message); + packet.send(*this, peer.getId(), true); + backend.disconnect_leter(peer.getId(), static_cast(reason)); + } else { + backend.disconnect(peer.getId(), static_cast(reason)); + } + + if (message.empty()) { + Info("Disconnected id {} {}: No text.", peer.getId(), getDisconnectReasonName(reason)); + } else { + Info("Disconnected id {} {}: {}.", peer.getId(), getDisconnectReasonName(reason), message); + } +} + +void Server::disconnect_by_id(uint32_t id, DisconnectReason reason, const std::string &message) { + for (size_t i = 0; i < backend.get_connected_clients().size(); i++) { + auto client = backend.get_connected_clients()[i]; + if (client->getId() == id) { + return disconnect(*client, reason, message); + } } +} + +void Server::broadcast(Packet &packet, bool reliable) { + packet.sendBroadcast(*this, reliable); +} + +void Server::broadcast_ex(Packet &packet, bool reliable, uint32_t ignore) { + packet.sendBroadcast(*this, reliable, [&](const Peer& peer) { + if (peer.getId() == ignore) { + return false; + } + return true; + }); +} + +void Server::send_message(uint32_t clientId, std::string &message) { + Packet packet(PacketType::CLIENT_CHAT_MESSAGE); + packet.write(0); + packet.writeString(message); + packet.send(*this, clientId, true); +} + +void Server::send_message(uint32_t clientId, const char *message) { + Packet packet(PacketType::CLIENT_CHAT_MESSAGE); + packet.write(0); + packet.writeString(message); + packet.send(*this, clientId, true); +} - server.stop_listening(); +void Server::broadcast_message(uint16_t sender, std::string &message) { + Packet packet(PacketType::CLIENT_CHAT_MESSAGE); + + packet.write(sender); + packet.writeString(message); + + broadcast(packet, true); } void Server::on_client_connected(Peer &peer) { - Debug("Connection client {}", peer.get_id()); + peer.server = std::move(this); + Debug("Connection client {}", peer.getId()); Packet preidentity(PacketType::SERVER_PREIDENTITY); peer.getAuthPeer().one = (uint8_t) rand() % 128; @@ -70,99 +158,55 @@ void Server::on_client_connected(Peer &peer) { peer.getAuthPeer().type = type; - preidentity.writeUint16(0); - preidentity.writeUint16(1); - preidentity.writeUint8(peer.getAuthPeer().one); - preidentity.writeUint8((uint8_t) rand() % 2); - preidentity.writeUint8(peer.getAuthPeer().two); + preidentity.write(0); + preidentity.write(1); + preidentity.write(peer.getAuthPeer().one); + preidentity.write((uint8_t) rand() % 2); + preidentity.write(peer.getAuthPeer().two); const uint8_t key[6] = { 0x00, 0x00, 0xFF, 0x1F, 0x80, 0x14 }; for (int i = 0; i < 3; i++) { - preidentity.writeUint8(key[rand() % sizeof(key)]); + preidentity.write(key[rand() % sizeof(key)]); } - preidentity.writeUint32(peer.getAuthPeer().type); - preidentity.send(server, peer.get_id(), true); + preidentity.write(peer.getAuthPeer().type); + preidentity.send(*this, peer.getId(), true); } -void Server::on_client_disconnected(uint32_t client_id) { - +void Server::on_client_disconnected(Peer &peer, uint32_t client_id) { + Info("{} (id {}) left.", peer.getNickname(), client_id); } void Server::on_client_received(Peer &peer, const enet_uint8 *data, size_t data_size) { - switch (static_cast(data[1])) { + Packet packet(data, data_size); + + switch (packet.getPacketType()) { case PacketType::IDENTITY: { - Packet packet(data, data_size); if (!peer.identity(packet)) { - Debug("Identity failed for id {}", peer.get_id()); + Debug("Identity failed for id {}", peer.getId()); } break; } - default: break; - } -} - -/* -bool Server::worker() { - - TimeStamp ticker; - time_start(&ticker); - - double next_tick = time_end(&ticker); - double heartbeat = 0.0; - const double TARGET_FPS = 1000.0 / 60; - - //Packet packet_heartbeat(PacketType::SERVER_HEARTBEAT); - - while (true) { - udp::endpoint endpoint; - socket.receive_from(boost::asio::buffer(recv_buffer), endpoint, 0, error_code); - if (!error_code) { - auto it = peers.find(endpoint); - if (it == peers.end()) { - Debug("Connection client {}:{}", endpoint.address().to_string(), endpoint.port()); - Peer peer(id_counter++, endpoint.address().to_string(), std::move(endpoint)); - peers.try_emplace(endpoint, std::move(peer)); - - Debug("Creating peer id: {}", peer.getId()); - - - - } - - switch (static_cast(recv_buffer[1])) { - case PacketType::IDENTITY: { - - Packet packet(recv_buffer); - Peer peer = peers.at(endpoint); - - if (!peer.identity(packet)) { - Debug("Identity failed for id %d", peer.getId()); - } - - break; - } - default: { - break; - } + default: { + if (!peer_message(peer, packet)) { + break; } } + } +} - double now = time_end(&ticker); - while (next_tick < now) { - next_tick += TARGET_FPS; +bool Server::state_handle(const Peer &peer, const Packet &packet) { + return true; +} - if (peers.empty()) { - if (heartbeat >= (TICKSPERSEC * 2)) { - Debug("Heartbeat done."); - heartbeat = 0; - } - } +bool Server::peer_message(Peer &peer, Packet &packet) { + if (peer.getId() == 0) { + return false; + } - delta = 1; - } + bool result = state_handle(peer, packet); - } + return result; } -*/ + diff --git a/disasterserver/Server.hpp b/disasterserver/Server.hpp index 6389266..e04e62e 100644 --- a/disasterserver/Server.hpp +++ b/disasterserver/Server.hpp @@ -6,23 +6,78 @@ #include "Core/ENet/server.h" #define TICKSPERSEC 60 -#define BUILD_VERSION 1101 -#define BASE_SERVER_PORT 8606 namespace DisasterServer { + static constexpr int MAX_PLAYERS = 7; + static constexpr int BUILD_VERSION = 1101; + static constexpr int BASE_SERVER_PORT = 8606; + + enum class DisconnectReason + { + FAILEDTOCONNECT, + KICKEDBYHOST, + BANNEDBYHOST, + VERMISMATCH, + SERVERTIMEOUT, + PACKETSNOTRECV, + GAMESTARTED, + AFKTIMEOUT, + LOBBYFULL, + RATELIMITED, + SHUTDOWN, + IPINUSE, + + DONTREPORT = 254, + OTHER = 255 + }; + + inline std::string getDisconnectReasonName(DisconnectReason reason) { + switch (reason) { + case DisconnectReason::FAILEDTOCONNECT: return "FAILED TO CONNECT"; + case DisconnectReason::KICKEDBYHOST: return "KICKED BY HOST"; + case DisconnectReason::BANNEDBYHOST: return "BANNED BY HOST"; + case DisconnectReason::VERMISMATCH: return "VER MISMATCH"; + case DisconnectReason::SERVERTIMEOUT: return "SERVER TIMEOUT"; + case DisconnectReason::PACKETSNOTRECV: return "PACKET SNOT RECV"; + case DisconnectReason::GAMESTARTED: return "GAME STARTED"; + case DisconnectReason::AFKTIMEOUT: return "AFK TIMEOUT"; + case DisconnectReason::LOBBYFULL: return "LOBBY FULL"; + case DisconnectReason::RATELIMITED: return "RATE LIMITED"; + case DisconnectReason::SHUTDOWN: return "SHUTDOWN"; + case DisconnectReason::IPINUSE: return "IPINUSE"; + case DisconnectReason::DONTREPORT: return "DONT REPORT"; + case DisconnectReason::OTHER: return "OTHER"; + default: return ""; + } + } + class Server { bool running = false; - enetpp::server server; + enetpp::server backend; double delta = 0; public: Server(); void initialize(); + + void disconnect(Peer &peer, DisconnectReason reason, const std::string& message = ""); + void disconnect_by_id(uint32_t id, DisconnectReason reason, const std::string& message = ""); + void broadcast(Packet &packet, bool reliable); + void broadcast_ex(Packet &packet, bool reliable, uint32_t ignore); + void send_message(uint32_t clientId, std::string &message); + void send_message(uint32_t clientId, const char *message); + void broadcast_message(uint16_t sender, std::string &message); + std::vector getPeers() { return backend.get_connected_clients(); } + + enetpp::server& getBackend() { return backend; } private: void on_client_connected(Peer &peer); - void on_client_disconnected(uint32_t client_id); + void on_client_disconnected(Peer & peer, uint32_t client_id); void on_client_received(Peer &peer, const enet_uint8 *data, size_t data_size); - //bool worker(); + + bool state_handle(const Peer & peer, const Packet & packet); + + bool peer_message(Peer &peer, Packet &packet); }; } diff --git a/disasterserver_c/Server.c b/disasterserver_c/Server.c index 76450f9..d6f3691 100644 --- a/disasterserver_c/Server.c +++ b/disasterserver_c/Server.c @@ -162,6 +162,7 @@ bool peer_identity(PeerData *v, Packet *packet) // Read header PacketRead(passtrough, packet, packet_read8, uint8_t); PacketRead(type, packet, packet_read8, uint8_t); + PacketRead(build_version, packet, packet_read16, uint16_t); PacketRead(server_index, packet, packet_read32, int32_t); PacketRead(nickname, packet, packet_readstr, String); diff --git a/disasterserver_c/states/Lobby.c b/disasterserver_c/states/Lobby.c index 4c24860..688a403 100644 --- a/disasterserver_c/states/Lobby.c +++ b/disasterserver_c/states/Lobby.c @@ -537,9 +537,9 @@ bool lobby_state_tick(Server* server) if (!peer->ready) { - peer->timeout += server->delta; - if ((int)peer->timeout % 60 == 0) - Debug("tick for %s: %f", peer->nickname.value, peer->timeout/60.0f); + //peer->timeout += server->delta; + //if ((int)peer->timeout % 60 == 0) + // Debug("tick for %s: %f", peer->nickname.value, peer->timeout/60.0f); if (peer->timeout >= 25 * TICKSPERSEC) server_disconnect(server, peer->peer, DR_AFKTIMEOUT, NULL); From 9cc0c467d6e4f982edc38b6682249bc8ae9df0c8 Mon Sep 17 00:00:00 2001 From: MilesGlitch Date: Sat, 5 Sep 2026 17:55:57 +0300 Subject: [PATCH 09/61] Update --- disasterserver/Core/Packet.hpp | 2 +- disasterserver/Core/StateMachine.cpp | 3 + disasterserver/Core/StateMachine.hpp | 11 ++++ disasterserver/Networking/Networking.hpp | 80 ------------------------ disasterserver/Peer.cpp | 29 +++++++-- disasterserver/Peer.hpp | 4 ++ disasterserver/Server.cpp | 50 ++++++++------- disasterserver/Server.hpp | 19 +++--- disasterserver_c/states/Game.c | 2 +- 9 files changed, 84 insertions(+), 116 deletions(-) create mode 100644 disasterserver/Core/StateMachine.cpp create mode 100644 disasterserver/Core/StateMachine.hpp delete mode 100644 disasterserver/Networking/Networking.hpp diff --git a/disasterserver/Core/Packet.hpp b/disasterserver/Core/Packet.hpp index 9a1344c..49a0f48 100644 --- a/disasterserver/Core/Packet.hpp +++ b/disasterserver/Core/Packet.hpp @@ -369,7 +369,7 @@ namespace DisasterServer { void writeString(const std::string &value); void send(Server &server, uint32_t client_id, bool reliable); - void sendBroadcast(Server &server, bool reliable, std::function predicate = [](const Peer& client) { return true; }); + void sendBroadcast(Server &server, bool reliable, std::function predicate = [](const Peer& _) { return true; }); }; } diff --git a/disasterserver/Core/StateMachine.cpp b/disasterserver/Core/StateMachine.cpp new file mode 100644 index 0000000..e113505 --- /dev/null +++ b/disasterserver/Core/StateMachine.cpp @@ -0,0 +1,3 @@ +#include "StateMachine.hpp" + +using namespace DisasterServer; \ No newline at end of file diff --git a/disasterserver/Core/StateMachine.hpp b/disasterserver/Core/StateMachine.hpp new file mode 100644 index 0000000..179f953 --- /dev/null +++ b/disasterserver/Core/StateMachine.hpp @@ -0,0 +1,11 @@ +#ifndef DISASTERSERVER_STATEMACHINE_HPP +#define DISASTERSERVER_STATEMACHINE_HPP + +namespace DisasterServer +{ + class StateMachine { + + }; +} + +#endif //DISASTERSERVER_STATEMACHINE_HPP diff --git a/disasterserver/Networking/Networking.hpp b/disasterserver/Networking/Networking.hpp deleted file mode 100644 index 1dd911a..0000000 --- a/disasterserver/Networking/Networking.hpp +++ /dev/null @@ -1,80 +0,0 @@ -#ifndef DISASTERSERVER_NETWORKING_HPP -#define DISASTERSERVER_NETWORKING_HPP - -#include -#include -#include - -#include "enet/enet.h" - -namespace DisasterServer::Networking -{ - class NetworkingException : public std::exception { - public: - explicit NetworkingException(const std::string& message); - - template - static NetworkingException Format(std::string_view fmt, Args&&... args) { - return NetworkingException(std::vformat(fmt, std::make_format_args(args...))); - } - }; - - class NetworkingInitializationException : public NetworkingException { - public: - explicit NetworkingInitializationException(const std::string& message); - - template - static NetworkingInitializationException Format(std::string_view fmt, Args&&... args) { - return NetworkingInitializationException(std::vformat(fmt, std::make_format_args(args...))); - } - }; - - enum class NetworkingEventType { - NONE, - CONNECT_EVENT, - DISCONNECT_EVENT, - RECEIVE_EVENT, - }; - - void initialize() { - if (enet_initialize() != 0) { - throw NetworkingInitializationException::Format("Failed to initialize enet."); - } - }; - - class entrypoint { - ENetAddress _address = {}; - public: - entrypoint(uint16_t port) { - _address.host = ENET_HOST_ANY; - _address.port = port; - } - - ENetAddress &getAddress() { - return _address; - } - }; - - class ENetSocket { - ENetHost* host = nullptr; - ENetEvent ev = {}; - public: - ENetSocket(entrypoint ep) { - this->host = enet_host_create(&ep.getAddress(), 50, 2, 0, 0); - } - - void pullEvents(uint32_t timeout, std::function callback) { - if (enet_host_service(host, &ev, timeout) > 0) { - callback(ev.type, ev.peer); - } - } - - ~ENetSocket() { - if (host != nullptr) { - enet_host_destroy(host); - } - } - }; -} - -#endif //DISASTERSERVER_NETWORKING_HPP diff --git a/disasterserver/Peer.cpp b/disasterserver/Peer.cpp index 9102bf5..793d161 100644 --- a/disasterserver/Peer.cpp +++ b/disasterserver/Peer.cpp @@ -83,11 +83,11 @@ bool Peer::identity(Packet &packet) { } bool Peer::identity_process(const std::string &addr, bool is_banned, uint64_t timeout, bool do_timeout) { - /*if (!is_banned) { + if (is_banned) { Info("{} banned by host (id {}, ip {})", nickname, id, addr); this->server->disconnect(*this, DisconnectReason::BANNEDBYHOST); return false; - }*/ + } if (this->server->getPeers().size() >= 7) { this->server->disconnect(*this, DisconnectReason::LOBBYFULL); @@ -104,12 +104,21 @@ bool Peer::identity_process(const std::string &addr, bool is_banned, uint64_t ti } } + if (!this->server->state_joined(*this)) { + should_timeout = false; + this->server->disconnect(*this, DisconnectReason::OTHER, "Report this to dev: code 300"); + return false; + } + Packet identity_response(PacketType::SERVER_IDENTITY_RESPONSE); - identity_response.write(1 /*this->state == ST_LOBBY*/); + identity_response.write(1 /*this->state == ST_LOBBY*/); //TODO: Create States Machine identity_response.write(static_cast(id)); identity_response.send(*this->server, id, true); + // If in queue, do following if (!in_game) { + + // For icons for (size_t i = 0; i < this->server->getPeers().size(); i++) { auto peer = this->server->getPeers()[i]; @@ -118,7 +127,7 @@ bool Peer::identity_process(const std::string &addr, bool is_banned, uint64_t ti } Packet pack(PacketType::SERVER_WAITING_PLAYER_INFO); - pack.write(0); /* v->server->state == ST_GAME && peer->in_game */ + pack.write(0); /* v->server->state == ST_GAME && peer->in_game */ //TODO: Create States Machine pack.write(static_cast(peer->getId())); pack.writeString(nickname); @@ -147,3 +156,15 @@ bool Peer::identity_process(const std::string &addr, bool is_banned, uint64_t ti return true; } + +bool Peer::message_received(Packet &packet) { + if (id == 0) { + return false; + } + + bool result; + + result = this->server->state_handle(*this, packet); + + return result; +} diff --git a/disasterserver/Peer.hpp b/disasterserver/Peer.hpp index 88f69bf..34d76ca 100644 --- a/disasterserver/Peer.hpp +++ b/disasterserver/Peer.hpp @@ -81,6 +81,9 @@ namespace DisasterServer uint8_t getLobbyIcon() { return lobby_icon; } int8_t getPet() { return pet; } AuthPeer &getAuthPeer() { return auth; } + + uint8_t getExeChance() { return exe_chance; } + bool isVerified() { return verified; } bool isInGame() { return in_game; } bool isOpped() { return op; } @@ -94,6 +97,7 @@ namespace DisasterServer bool identity(Packet &packet); bool identity_process(const std::string & addr, bool is_banned, uint64_t timeout, bool do_timeout); + bool message_received(Packet &packet); }; } diff --git a/disasterserver/Server.cpp b/disasterserver/Server.cpp index 629ac34..c059155 100644 --- a/disasterserver/Server.cpp +++ b/disasterserver/Server.cpp @@ -14,7 +14,7 @@ void Server::initialize() { .set_channel_count(2) .set_listen_port(BASE_SERVER_PORT) .set_initialize_client_function(Peer::initialize_client)); - + TimeStamp ticker; time_start(&ticker); @@ -22,7 +22,7 @@ void Server::initialize() { double heartbeat = 0.0; const double TARGET_FPS = 1000.0 / 60; - Packet pack(PacketType::SERVER_HEARTBEAT); + while (!running) { backend.consume_events( @@ -39,10 +39,10 @@ void Server::initialize() { // Heartbeat if (backend.get_connected_clients().empty()) { - broadcast(pack, true); if (heartbeat >= (TICKSPERSEC * 2)) { - Debug("Heartbeat done."); + Packet packet_heartbeat(PacketType::SERVER_HEARTBEAT); + packet_heartbeat.sendBroadcast(*this, true); heartbeat = 0; } heartbeat += delta; @@ -83,10 +83,12 @@ void Server::disconnect_by_id(uint32_t id, DisconnectReason reason, const std::s } void Server::broadcast(Packet &packet, bool reliable) { + Debug("PacketType::{} sending broadcast", getPacketTypeName(packet.getPacketType())); packet.sendBroadcast(*this, reliable); } void Server::broadcast_ex(Packet &packet, bool reliable, uint32_t ignore) { + Debug("PacketType::{} sending broadcast, ignoring client {}", getPacketTypeName(packet.getPacketType()), ignore); packet.sendBroadcast(*this, reliable, [&](const Peer& peer) { if (peer.getId() == ignore) { return false; @@ -109,7 +111,7 @@ void Server::send_message(uint32_t clientId, const char *message) { packet.send(*this, clientId, true); } -void Server::broadcast_message(uint16_t sender, std::string &message) { +void Server::send_broadcast_message(uint16_t sender, std::string &message) { Packet packet(PacketType::CLIENT_CHAT_MESSAGE); packet.write(sender); @@ -118,6 +120,25 @@ void Server::broadcast_message(uint16_t sender, std::string &message) { broadcast(packet, true); } +bool Server::state_joined(Peer &peer) { + Packet packet(PacketType::SERVER_LOBBY_EXE_CHANCE); + packet.write(peer.getExeChance()); + packet.send(*this, peer.getId(), true); + + Packet playerJoined(PacketType::SERVER_PLAYER_JOINED); + playerJoined.write(static_cast(peer.getId())); + playerJoined.writeString(peer.getNickname()); + playerJoined.write(peer.getLobbyIcon()); + playerJoined.write(peer.getPet()); + this->broadcast_ex(playerJoined, true, peer.getId()); + + return true; +} + +bool Server::state_handle(Peer &peer, Packet &packet) { + return true; +} + void Server::on_client_connected(Peer &peer) { peer.server = std::move(this); Debug("Connection client {}", peer.getId()); @@ -189,24 +210,9 @@ void Server::on_client_received(Peer &peer, const enet_uint8 *data, size_t data_ break; } default: { - if (!peer_message(peer, packet)) { + if (!peer.message_received(packet)) { break; } } } -} - -bool Server::state_handle(const Peer &peer, const Packet &packet) { - return true; -} - -bool Server::peer_message(Peer &peer, Packet &packet) { - if (peer.getId() == 0) { - return false; - } - - bool result = state_handle(peer, packet); - - return result; -} - +} \ No newline at end of file diff --git a/disasterserver/Server.hpp b/disasterserver/Server.hpp index e04e62e..99508f2 100644 --- a/disasterserver/Server.hpp +++ b/disasterserver/Server.hpp @@ -62,22 +62,25 @@ namespace DisasterServer void disconnect(Peer &peer, DisconnectReason reason, const std::string& message = ""); void disconnect_by_id(uint32_t id, DisconnectReason reason, const std::string& message = ""); - void broadcast(Packet &packet, bool reliable); - void broadcast_ex(Packet &packet, bool reliable, uint32_t ignore); + void send_message(uint32_t clientId, std::string &message); void send_message(uint32_t clientId, const char *message); - void broadcast_message(uint16_t sender, std::string &message); - std::vector getPeers() { return backend.get_connected_clients(); } + void send_broadcast_message(uint16_t sender, std::string &message); + + void broadcast(Packet &packet, bool reliable); + void broadcast_ex(Packet &packet, bool reliable, uint32_t ignore); + + bool state_joined(Peer &peer); + bool state_handle(Peer &peer, Packet &packet); + + + std::vector getPeers() { return backend.get_connected_clients(); } enetpp::server& getBackend() { return backend; } private: void on_client_connected(Peer &peer); void on_client_disconnected(Peer & peer, uint32_t client_id); void on_client_received(Peer &peer, const enet_uint8 *data, size_t data_size); - - bool state_handle(const Peer & peer, const Packet & packet); - - bool peer_message(Peer &peer, Packet &packet); }; } diff --git a/disasterserver_c/states/Game.c b/disasterserver_c/states/Game.c index fa03c53..a624bf1 100644 --- a/disasterserver_c/states/Game.c +++ b/disasterserver_c/states/Game.c @@ -107,7 +107,7 @@ bool game_state_check(Server* server) bool game_init(int exe, int8_t map, Server* server) { Debug("Attepting to enter ST_GAME..."); - RAssert(server_ingame(server) > 1); + //RAssert(server_ingame(server) > 1); server->state = ST_GAME; server->game = (Game) From 8c01706b4e6b49b14aade595955424b8642e32b8 Mon Sep 17 00:00:00 2001 From: MilesGlitch Date: Sat, 5 Sep 2026 22:44:33 +0300 Subject: [PATCH 10/61] update --- CMakeSettings.json => CMakePresets.json | 31 +++-- disasterserver/Core/ENet/server.h | 2 +- disasterserver/Core/Packet.cpp | 3 + disasterserver/Core/StateMachine.cpp | 3 - disasterserver/Core/StateMachine.hpp | 11 -- disasterserver/Peer.cpp | 15 ++- disasterserver/Peer.hpp | 47 ++++---- disasterserver/Server.cpp | 71 +++++------ disasterserver/Server.hpp | 13 +- disasterserver/StateManager.cpp | 79 ++++++++++++ disasterserver/StateManager.hpp | 36 ++++++ disasterserver/States/Lobby.cpp | 60 ++++++++++ disasterserver/States/Lobby.hpp | 41 +++++++ disasterserver/States/State.hpp | 36 ++++++ disasterserver_c/Packet.c | 152 ++++++++++++++++++++++++ vcpkg-configuration.json | 7 ++ 16 files changed, 507 insertions(+), 100 deletions(-) rename CMakeSettings.json => CMakePresets.json (86%) delete mode 100644 disasterserver/Core/StateMachine.cpp delete mode 100644 disasterserver/Core/StateMachine.hpp create mode 100644 disasterserver/StateManager.cpp create mode 100644 disasterserver/StateManager.hpp create mode 100644 disasterserver/States/Lobby.cpp create mode 100644 disasterserver/States/Lobby.hpp create mode 100644 disasterserver/States/State.hpp create mode 100644 vcpkg-configuration.json diff --git a/CMakeSettings.json b/CMakePresets.json similarity index 86% rename from CMakeSettings.json rename to CMakePresets.json index 387eb14..26872e5 100644 --- a/CMakeSettings.json +++ b/CMakePresets.json @@ -1,5 +1,6 @@ { - "configurations": [ + "version": 3, + "configurePresets": [ { "name": "base", "hidden": true, @@ -8,19 +9,24 @@ "cacheVariables": { "VCPKG_TARGET_TRIPLET": "x64-windows-static" }, - "vendor": { "microsoft.com/VisualStudioRemoteSettings/CMake/2.0": { "sourceRootDir": "$ms{localSourceDir}\\..", "remoteSourceRootDir": "$env{HOME}/.vs/wsl", "copySourcesOptions": { "method": "rsync", - "exclusionList": [ ".vs", ".git", "out", "dist", "attic", "build" ] + "exclusionList": [ + ".vs", + ".git", + "out", + "dist", + "attic", + "build" + ] } } } }, - { "inherits": "base", "name": "windows-release", @@ -35,7 +41,9 @@ }, "vendor": { "microsoft.com/VisualStudioSettings/CMake/1.0": { - "hostOS": [ "Windows" ] + "hostOS": [ + "Windows" + ] } } }, @@ -53,11 +61,12 @@ }, "vendor": { "microsoft.com/VisualStudioSettings/CMake/1.0": { - "hostOS": [ "Windows" ] + "hostOS": [ + "Windows" + ] } } }, - { "inherits": "base", "name": "windows-clang-release", @@ -72,7 +81,9 @@ }, "vendor": { "microsoft.com/VisualStudioSettings/CMake/1.0": { - "hostOS": [ "Windows" ] + "hostOS": [ + "Windows" + ] } } }, @@ -90,7 +101,9 @@ }, "vendor": { "microsoft.com/VisualStudioSettings/CMake/1.0": { - "hostOS": [ "Windows" ] + "hostOS": [ + "Windows" + ] } } } diff --git a/disasterserver/Core/ENet/server.h b/disasterserver/Core/ENet/server.h index b235320..0a82428 100644 --- a/disasterserver/Core/ENet/server.h +++ b/disasterserver/Core/ENet/server.h @@ -282,7 +282,7 @@ namespace enetpp { void capture_events_in_thread(const listen_params_type& params, ENetHost* host) { //http://lists.cubik.org/pipermail/enet-discuss/2013-September/002240.html - enet_host_service(host, 0, 0); + enet_host_service(host, 0, 5); ENetEvent e; while (enet_host_check_events(host, &e) > 0) { diff --git a/disasterserver/Core/Packet.cpp b/disasterserver/Core/Packet.cpp index 959f1a8..7dd858f 100644 --- a/disasterserver/Core/Packet.cpp +++ b/disasterserver/Core/Packet.cpp @@ -60,6 +60,9 @@ void Packet::writeString(const std::string &value) { void Packet::send(Server &server, uint32_t client_id, bool reliable) { Debug("PacketType::{} sending to {}", getPacketTypeName(type), client_id); server.getBackend().send_packet_to(client_id, reliable ? 0 : 1, buffer.data(), len, reliable ? ENET_PACKET_FLAG_RELIABLE : 0); + + std::vector empty = {0x00, static_cast(PacketType::SERVER_HEARTBEAT)}; + server.getBackend().send_packet_to(client_id, reliable ? 0 : 1, empty.data(), len, reliable ? ENET_PACKET_FLAG_RELIABLE : 0); } void Packet::sendBroadcast(Server &server, bool reliable, std::function predicate) { diff --git a/disasterserver/Core/StateMachine.cpp b/disasterserver/Core/StateMachine.cpp deleted file mode 100644 index e113505..0000000 --- a/disasterserver/Core/StateMachine.cpp +++ /dev/null @@ -1,3 +0,0 @@ -#include "StateMachine.hpp" - -using namespace DisasterServer; \ No newline at end of file diff --git a/disasterserver/Core/StateMachine.hpp b/disasterserver/Core/StateMachine.hpp deleted file mode 100644 index 179f953..0000000 --- a/disasterserver/Core/StateMachine.hpp +++ /dev/null @@ -1,11 +0,0 @@ -#ifndef DISASTERSERVER_STATEMACHINE_HPP -#define DISASTERSERVER_STATEMACHINE_HPP - -namespace DisasterServer -{ - class StateMachine { - - }; -} - -#endif //DISASTERSERVER_STATEMACHINE_HPP diff --git a/disasterserver/Peer.cpp b/disasterserver/Peer.cpp index 793d161..1a3a3fe 100644 --- a/disasterserver/Peer.cpp +++ b/disasterserver/Peer.cpp @@ -38,8 +38,7 @@ bool Peer::identity(Packet &packet) { this->lobby_icon = lobby_icon; this->pet = pet; - - //this->in_game = (server->state == ST_LOBBY); //TODO: Create States Machine + this->in_game = (server->getStateManager().getCurrentState() == States::LOBBY); this->exe_chance = 1 + rand() % 4; if (this->server->getPeers().size() >= MAX_PLAYERS) { @@ -104,14 +103,14 @@ bool Peer::identity_process(const std::string &addr, bool is_banned, uint64_t ti } } - if (!this->server->state_joined(*this)) { + if (!this->server->getStateManager().state_joined(*this)) { should_timeout = false; - this->server->disconnect(*this, DisconnectReason::OTHER, "Report this to dev: code 300"); + this->server->disconnect(*this, DisconnectReason::OTHER, "Report this to dev: 415 baza otvette, mi tonem"); return false; } Packet identity_response(PacketType::SERVER_IDENTITY_RESPONSE); - identity_response.write(1 /*this->state == ST_LOBBY*/); //TODO: Create States Machine + identity_response.write(server->getStateManager().getCurrentState() == States::LOBBY); identity_response.write(static_cast(id)); identity_response.send(*this->server, id, true); @@ -127,11 +126,11 @@ bool Peer::identity_process(const std::string &addr, bool is_banned, uint64_t ti } Packet pack(PacketType::SERVER_WAITING_PLAYER_INFO); - pack.write(0); /* v->server->state == ST_GAME && peer->in_game */ //TODO: Create States Machine + pack.write(server->getStateManager().getCurrentState() == States::GAME && peer->in_game); pack.write(static_cast(peer->getId())); pack.writeString(nickname); - if (false /* v->server->state == ST_GAME && peer->in_game */) { + if (server->getStateManager().getCurrentState() == States::GAME && peer->in_game) { pack.write( 0 /* v->server->game.exe == peer->id */ ); pack.write( 0 /* v->server->game.exe == peer->id ? peer->exe_char : peer->surv_char */); @@ -164,7 +163,7 @@ bool Peer::message_received(Packet &packet) { bool result; - result = this->server->state_handle(*this, packet); + result = this->server->getStateManager().state_handle(*this, packet); return result; } diff --git a/disasterserver/Peer.hpp b/disasterserver/Peer.hpp index 34d76ca..cf88af8 100644 --- a/disasterserver/Peer.hpp +++ b/disasterserver/Peer.hpp @@ -28,43 +28,43 @@ namespace DisasterServer }; class Peer { - uint32_t id; - std::string ip; + uint32_t id = 0; + std::string ip = ""; /* General info */ //Player plr; std::string nickname; std::string udid; - uint8_t lobby_icon; - int8_t pet; - - bool verified; - bool in_game; - bool op; - bool ready; - bool mod_tool; - bool is_mobile; - bool can_vote; - bool voted; + uint8_t lobby_icon = 0; + int8_t pet = -1; + + bool verified = false; + bool in_game = false; + bool op = false; + bool ready = false; + bool mod_tool = false; + bool is_mobile = false; + bool can_vote = false; + bool voted = false; struct AuthPeer { - uint32_t type; - uint8_t one; - uint8_t two; + uint32_t type = 0; + uint8_t one = 0; + uint8_t two = 0; }; - AuthPeer auth; + AuthPeer auth = {}; /* Character */ - SurvCharacters survChars; - ExesCharacters exesChars; + SurvCharacters survChar = SurvCharacters::CH_NONE; + ExesCharacters exeChar = ExesCharacters::EX_NONE; - bool should_timeout; + bool should_timeout = false; /* State info */ - uint8_t exe_chance; - double timeout; - double vote_cooldown; + uint8_t exe_chance = 0; + double timeout = 0; + double vote_cooldown = 0; public: Server *server = nullptr; @@ -82,6 +82,7 @@ namespace DisasterServer int8_t getPet() { return pet; } AuthPeer &getAuthPeer() { return auth; } + void setExeChance(uint8_t chance) { exe_chance = chance; } uint8_t getExeChance() { return exe_chance; } bool isVerified() { return verified; } diff --git a/disasterserver/Server.cpp b/disasterserver/Server.cpp index c059155..b3da642 100644 --- a/disasterserver/Server.cpp +++ b/disasterserver/Server.cpp @@ -1,12 +1,21 @@ #include "Server.hpp" +#include + #include "Core/Packet.hpp" #include "Core/Log.hpp" #include "Core/Time.hpp" +#include "StateManager.hpp" + using namespace DisasterServer; -Server::Server() = default; + +Server::Server() : stateManager(this) { + //this->stateManager.registerState(this); +} + +Server::~Server() = default; void Server::initialize() { backend.start_listening(enetpp::server_listen_params() @@ -20,9 +29,9 @@ void Server::initialize() { double next_tick = time_end(&ticker); double heartbeat = 0.0; - const double TARGET_FPS = 1000.0 / 60; - + constexpr double TARGET_FPS = 1000.0 / 60; + // while (!running) { backend.consume_events( @@ -34,15 +43,15 @@ void Server::initialize() { while (next_tick < now) { next_tick += TARGET_FPS; - //States tick - + stateManager.state_tick(); // Heartbeat if (backend.get_connected_clients().empty()) { + Packet packet_heartbeat(PacketType::SERVER_HEARTBEAT); if (heartbeat >= (TICKSPERSEC * 2)) { - Packet packet_heartbeat(PacketType::SERVER_HEARTBEAT); - packet_heartbeat.sendBroadcast(*this, true); + broadcast(packet_heartbeat, true); + Debug("Heartbeat done."); heartbeat = 0; } heartbeat += delta; @@ -84,27 +93,28 @@ void Server::disconnect_by_id(uint32_t id, DisconnectReason reason, const std::s void Server::broadcast(Packet &packet, bool reliable) { Debug("PacketType::{} sending broadcast", getPacketTypeName(packet.getPacketType())); - packet.sendBroadcast(*this, reliable); + + for (size_t i = 0; i < backend.get_connected_clients().size(); i++) { + auto client = backend.get_connected_clients()[i]; + packet.send(*this, client->getId(), reliable); + } } void Server::broadcast_ex(Packet &packet, bool reliable, uint32_t ignore) { Debug("PacketType::{} sending broadcast, ignoring client {}", getPacketTypeName(packet.getPacketType()), ignore); - packet.sendBroadcast(*this, reliable, [&](const Peer& peer) { - if (peer.getId() == ignore) { - return false; + for (size_t i = 0; i < backend.get_connected_clients().size(); i++) { + auto client = backend.get_connected_clients()[i]; + + if (client->getId() == ignore) { + continue; } - return true; - }); -} -void Server::send_message(uint32_t clientId, std::string &message) { - Packet packet(PacketType::CLIENT_CHAT_MESSAGE); - packet.write(0); - packet.writeString(message); - packet.send(*this, clientId, true); + packet.send(*this, client->getId(), reliable); + } } -void Server::send_message(uint32_t clientId, const char *message) { +void Server::send_message(uint32_t clientId, std::string message) { + std::ranges::transform(message, message.begin(), [](unsigned char c){ return std::tolower(c); }); Packet packet(PacketType::CLIENT_CHAT_MESSAGE); packet.write(0); packet.writeString(message); @@ -120,27 +130,12 @@ void Server::send_broadcast_message(uint16_t sender, std::string &message) { broadcast(packet, true); } -bool Server::state_joined(Peer &peer) { - Packet packet(PacketType::SERVER_LOBBY_EXE_CHANCE); - packet.write(peer.getExeChance()); - packet.send(*this, peer.getId(), true); - - Packet playerJoined(PacketType::SERVER_PLAYER_JOINED); - playerJoined.write(static_cast(peer.getId())); - playerJoined.writeString(peer.getNickname()); - playerJoined.write(peer.getLobbyIcon()); - playerJoined.write(peer.getPet()); - this->broadcast_ex(playerJoined, true, peer.getId()); - - return true; -} - -bool Server::state_handle(Peer &peer, Packet &packet) { - return true; +StateManager &Server::getStateManager() { + return stateManager; } void Server::on_client_connected(Peer &peer) { - peer.server = std::move(this); + peer.server = this; Debug("Connection client {}", peer.getId()); Packet preidentity(PacketType::SERVER_PREIDENTITY); diff --git a/disasterserver/Server.hpp b/disasterserver/Server.hpp index 99508f2..2548463 100644 --- a/disasterserver/Server.hpp +++ b/disasterserver/Server.hpp @@ -2,6 +2,7 @@ #define DISASTERSERVER_SERVER_HPP #include "Peer.hpp" +#include "StateManager.hpp" #include "Core/ENet/server.h" @@ -9,6 +10,7 @@ namespace DisasterServer { + class StateManager; static constexpr int MAX_PLAYERS = 7; static constexpr int BUILD_VERSION = 1101; static constexpr int BASE_SERVER_PORT = 8606; @@ -55,28 +57,25 @@ namespace DisasterServer class Server { bool running = false; enetpp::server backend; + StateManager stateManager; double delta = 0; public: Server(); + ~Server(); void initialize(); void disconnect(Peer &peer, DisconnectReason reason, const std::string& message = ""); void disconnect_by_id(uint32_t id, DisconnectReason reason, const std::string& message = ""); - void send_message(uint32_t clientId, std::string &message); - void send_message(uint32_t clientId, const char *message); + void send_message(uint32_t clientId, std::string message); void send_broadcast_message(uint16_t sender, std::string &message); void broadcast(Packet &packet, bool reliable); void broadcast_ex(Packet &packet, bool reliable, uint32_t ignore); - - bool state_joined(Peer &peer); - bool state_handle(Peer &peer, Packet &packet); - - std::vector getPeers() { return backend.get_connected_clients(); } enetpp::server& getBackend() { return backend; } + StateManager &getStateManager(); private: void on_client_connected(Peer &peer); void on_client_disconnected(Peer & peer, uint32_t client_id); diff --git a/disasterserver/StateManager.cpp b/disasterserver/StateManager.cpp new file mode 100644 index 0000000..bcab344 --- /dev/null +++ b/disasterserver/StateManager.cpp @@ -0,0 +1,79 @@ +#include "StateManager.hpp" +#include "Server.hpp" + +using namespace DisasterServer; + +StateManager::StateManager(Server *server) : server(server), lobby(server, this) { +} + +StateManager::~StateManager() = default; + +bool StateManager::state_joined(Peer &peer) { + Packet packet(PacketType::SERVER_LOBBY_EXE_CHANCE); + packet.write(peer.getExeChance()); + packet.send(*this->server, peer.getId(), true); + + Packet playerJoined(PacketType::SERVER_PLAYER_JOINED); + playerJoined.write(static_cast(peer.getId())); + playerJoined.writeString(peer.getNickname()); + playerJoined.write(peer.getLobbyIcon()); + playerJoined.write(peer.getPet()); + this->server->broadcast_ex(playerJoined, true, peer.getId()); + + switch (state) { + case States::LOBBY: + case States::CHARSELECT: + case States::MAPVOTE: { + return lobby.joined(peer); + } + case States::GAME: { + return true; + } + case States::RESULTS: { + break; + } + default: break; + } + + return true; +} + +void StateManager::state_tick() { + switch (state) + { + case States::LOBBY: + case States::CHARSELECT: + case States::MAPVOTE: + lobby.tick(); + break; + + case States::GAME: + //game_state_tick(server); + break; + + case States::RESULTS: + //results_state_tick(server); + break; + } +} + +bool StateManager::state_handle(Peer &peer, Packet &packet) { + + switch (state) { + case States::LOBBY: + case States::CHARSELECT: + case States::MAPVOTE: { + lobby.handle(peer, packet); + break; + } + case States::GAME: { + break; + } + case States::RESULTS: { + break; + } + default: break; + } + + return true; +} diff --git a/disasterserver/StateManager.hpp b/disasterserver/StateManager.hpp new file mode 100644 index 0000000..41a3daf --- /dev/null +++ b/disasterserver/StateManager.hpp @@ -0,0 +1,36 @@ +#ifndef DISASTERSERVER_STATEMACHINE_HPP +#define DISASTERSERVER_STATEMACHINE_HPP + +#include "Core/Packet.hpp" +#include "States/Lobby.hpp" + +namespace DisasterServer +{ + class Peer; + + enum class States { + LOBBY, + MAPVOTE, + CHARSELECT, + GAME, + RESULTS + }; + + class StateManager { + Server *server = nullptr; + States state = States::LOBBY; + + Lobby lobby; + public: + explicit StateManager(Server *server); + ~StateManager(); + + bool state_joined(Peer &peer); + void state_tick(); + bool state_handle(Peer &peer, Packet &packet); + + [[nodiscard]] States getCurrentState() const { return this->state; } + }; +} + +#endif //DISASTERSERVER_STATEMACHINE_HPP diff --git a/disasterserver/States/Lobby.cpp b/disasterserver/States/Lobby.cpp new file mode 100644 index 0000000..3da79b2 --- /dev/null +++ b/disasterserver/States/Lobby.cpp @@ -0,0 +1,60 @@ +#include "Lobby.hpp" + +#include "Server.hpp" +#include "StateManager.hpp" + +using namespace DisasterServer; + +Lobby::Lobby(Server *server, StateManager *stateManager) : server(server), stateManager(stateManager) { +} + +Lobby::~Lobby() = default; + +bool Lobby::joined(Peer &peer) { + return true; +} + +void Lobby::tick() { + +} + +bool Lobby::handle(Peer &v, Packet &packet) { + switch (packet.getPacketType()) { + case PacketType::CLIENT_LOBBY_PLAYERS_REQUEST: { + for (size_t i = 0; i < server->getPeers().size(); i++) { + auto peer = server->getPeers()[i]; + if (v.getId() == peer->getId()) { + continue; + } + + Packet pack(PacketType::SERVER_LOBBY_PLAYER); + pack.write(static_cast(peer->getId())); + pack.write(peer->isReady()); + pack.writeString(peer->getNickname()); + pack.write(peer->getLobbyIcon()); + pack.write(peer->getPet()); + pack.send(*server, peer->getId(), true); + } + + { + Packet pack(PacketType::SERVER_LOBBY_CORRECT); + pack.send(*server, v.getId(), true); + } + server->send_message(v.getId(), std::format("|build from &{} @{}~", __DATE__, __TIME__)); + //server->send_message(v.getId(), "|type .help for command list~"); + + break; + } + + case PacketType::CLIENT_CHAT_MESSAGE: { + uint16_t pid = packet.read(); + auto message = packet.readString(); + + Info("{} " LOG_RST "(id {}): {}", v.getNickname(), v.getId(), message); + server->send_broadcast_message(v.getId(), message); + } + default: break; + } + + return true; +} diff --git a/disasterserver/States/Lobby.hpp b/disasterserver/States/Lobby.hpp new file mode 100644 index 0000000..972103f --- /dev/null +++ b/disasterserver/States/Lobby.hpp @@ -0,0 +1,41 @@ +#ifndef DISASTERSERVER_LOBBY_HPP +#define DISASTERSERVER_LOBBY_HPP + +#include "State.hpp" + +#include +#include + + + +namespace DisasterServer +{ + class StateManager; + + class Lobby { + Server *server = nullptr; + StateManager *stateManager = nullptr; + + double countdown = 0; + double prac_countdown = 0; + uint8_t countdown_sec = 0; + //Vote vote; + + /* Map Vote */ + uint8_t maps[3] = {}; + uint8_t votes[3] = {}; + + /* Character Select */ + int8_t map = 0; + uint16_t exe = 0; + std::unordered_map avail; + public: + explicit Lobby(Server *server, StateManager *stateManager); + ~Lobby(); + + bool joined(Peer &peer); + void tick(); + bool handle(Peer &v, Packet &packet); + }; +} +#endif //DISASTERSERVER_LOBBY_HPP diff --git a/disasterserver/States/State.hpp b/disasterserver/States/State.hpp new file mode 100644 index 0000000..2be87cc --- /dev/null +++ b/disasterserver/States/State.hpp @@ -0,0 +1,36 @@ + +#ifndef DISASTERSERVER_STATE_HPP +#define DISASTERSERVER_STATE_HPP + +#include "Peer.hpp" + +namespace DisasterServer +{ + template + class State { + protected: + Server *server = nullptr; + public: + explicit State(Server *server) { + this->server = server; + } + + virtual ~State() { + server = nullptr; + } + + virtual bool joined(Peer &peer) { + return true; + } + + virtual void tick() { + + } + + virtual bool handle(Peer &peer, Packet &packet) { + return true; + } + }; +} + +#endif //DISASTERSERVER_STATE_HPP diff --git a/disasterserver_c/Packet.c b/disasterserver_c/Packet.c index 52fe994..c5851c0 100644 --- a/disasterserver_c/Packet.c +++ b/disasterserver_c/Packet.c @@ -46,6 +46,152 @@ String string_lower(String str) return str; } +inline const char * getPacketTypeName(PacketType type) { + switch (type) { + case IDENTITY: return "IDENTITY"; + case SERVER_IDENTITY_RESPONSE: return "SERVER_IDENTITY_RESPONSE"; + case SERVER_PLAYER_JOINED: return "SERVER_PLAYER_JOINED"; + case SERVER_PLAYER_LEFT: return "SERVER_PLAYER_LEFT"; + case SERVER_PLAYER_FORCE_DISCONNECT: return "SERVER_PLAYER_FORCE_DISCONNECT"; + case SERVER_WAITING_PLAYER_INFO: return "SERVER_WAITING_PLAYER_INFO"; + case SERVER_LOBBY_READY_STATE: return "SERVER_LOBBY_READY_STATE"; + case SERVER_LOBBY_EXE: return "SERVER_LOBBY_EXE"; + case SERVER_LOBBY_COUNTDOWN: return "SERVER_LOBBY_COUNTDOWN"; + case SERVER_LOBBY_EXE_CHANGE: return "SERVER_LOBBY_EXE_CHANGE"; + case SERVER_LOBBY_CHARACTER_CHANGE: return "SERVER_LOBBY_CHARACTER_CHANGE"; + case SERVER_LOBBY_CHARACTER_RESPONSE: return "SERVER_LOBBY_CHARACTER_RESPONSE"; + case SERVER_LOBBY_EXECHARACTER_RESPONSE: return "SERVER_LOBBY_EXECHARACTER_RESPONSE"; + case SERVER_LOBBY_GAME_START: return "SERVER_LOBBY_GAME_START"; + case SERVER_LOBBY_PLAYER: return "SERVER_LOBBY_PLAYER"; + case SERVER_LOBBY_EXE_CHANCE: return "SERVER_LOBBY_EXE_CHANCE"; + case SERVER_LOBBY_CORRECT: return "SERVER_LOBBY_CORRECT"; + case SERVER_LOBBY_CHOOSEVOTEKICK: return "SERVER_LOBBY_CHOOSEVOTEKICK"; + case SERVER_LOBBY_CHOOSEBAN: return "SERVER_LOBBY_CHOOSEBAN"; + case SERVER_LOBBY_CHOOSEKICK: return "SERVER_LOBBY_CHOOSEKICK"; + case SERVER_LOBBY_CHOOSEOP: return "SERVER_LOBBY_CHOOSEOP"; + case SERVER_LOBBY_CHANGELOBBY: return "SERVER_LOBBY_CHANGELOBBY"; + case SERVER_CHAR_TIME_SYNC: return "SERVER_CHAR_TIME_SYNC"; + case SERVER_VOTE_MAPS: return "SERVER_VOTE_MAPS"; + case SERVER_VOTE_SET: return "SERVER_VOTE_SET"; + case SERVER_VOTE_TIME_SYNC: return "SERVER_VOTE_TIME_SYNC"; + case SERVER_GAME_PLAYERS_READY: return "SERVER_GAME_PLAYERS_READY"; + case SERVER_GAME_EXE_WINS: return "SERVER_GAME_EXE_WINS"; + case SERVER_GAME_SURVIVOR_WIN: return "SERVER_GAME_SURVIVOR_WIN"; + case SERVER_GAME_SPAWN_RING: return "SERVER_GAME_SPAWN_RING"; + case SERVER_GAME_PLAYER_ESCAPED: return "SERVER_GAME_PLAYER_ESCAPED"; + case SERVER_GAME_BACK_TO_LOBBY: return "SERVER_GAME_BACK_TO_LOBBY"; + case SERVER_GAME_TIME_SYNC: return "SERVER_GAME_TIME_SYNC"; + case SERVER_GAME_TIME_OVER: return "SERVER_GAME_TIME_OVER"; + case SERVER_GAME_PING: return "SERVER_GAME_PING"; + case SERVER_PLAYER_DEATH_STATE: return "SERVER_PLAYER_DEATH_STATE"; + case SERVER_GAME_DEATHTIMER_TICK: return "SERVER_GAME_DEATHTIMER_TICK"; + case SERVER_GAME_DEATHTIMER_END: return "SERVER_GAME_DEATHTIMER_END"; + case SERVER_REQUEST_INFO: return "SERVER_REQUEST_INFO"; + case SERVER_HEARTBEAT: return "SERVER_HEARTBEAT"; + case SERVER_PONG: return "SERVER_PONG"; + case SERVER_FORCE_DAMAGE: return "SERVER_FORCE_DAMAGE"; + case SERVER_GAME_RING_READY: return "SERVER_GAME_RING_READY"; + case SERVER_PLAYER_BACKTRACK: return "SERVER_PLAYER_BACKTRACK"; + case SERVER_TPROJECTILE_STATE: return "SERVER_TPROJECTILE_STATE"; + case SERVER_ETRACKER_STATE: return "SERVER_ETRACKER_STATE"; + case SERVER_ERECTOR_BRING_SPAWN: return "SERVER_ERECTOR_BRING_SPAWN"; + case SERVER_RMZSLIME_STATE: return "SERVER_RMZSLIME_STATE"; + case SERVER_RMZSLIME_RINGBONUS: return "SERVER_RMZSLIME_RINGBONUS"; + case SERVER_RMZSHARD_STATE: return "SERVER_RMZSHARD_STATE"; + case SERVER_LCEYE_STATE: return "SERVER_LCEYE_STATE"; + case SERVER_LCCHAIN_STATE: return "SERVER_LCCHAIN_STATE"; + case SERVER_NPCONTROLLER_STATE: return "SERVER_NPCONTROLLER_STATE"; + case SERVER_KAFMONITOR_STATE: return "SERVER_KAFMONITOR_STATE"; + case SERVER_YCRSMOKE_STATE: return "SERVER_YCRSMOKE_STATE"; + case SERVER_YCRSMOKE_READY: return "SERVER_YCRSMOKE_READY"; + case SERVER_MOVINGSPIKE_STATE: return "SERVER_MOVINGSPIKE_STATE"; + case SERVER_RING_STATE: return "SERVER_RING_STATE"; + case SERVER_RING_COLLECTED: return "SERVER_RING_COLLECTED"; + case SERVER_ACT9WALL_STATE: return "SERVER_ACT9WALL_STATE"; + case SERVER_NAPBALL_STATE: return "SERVER_NAPBALL_STATE"; + case SERVER_NAPICE_STATE: return "SERVER_NAPICE_STATE"; + case SERVER_PFLIFT_STATE: return "SERVER_PFLIFT_STATE"; + case SERVER_BRING_STATE: return "SERVER_BRING_STATE"; + case SERVER_BRING_COLLECTED: return "SERVER_BRING_COLLECTED"; + case SERVER_VVLCOLUMN_STATE: return "SERVER_VVLCOLUMN_STATE"; + case SERVER_VVVASE_STATE: return "SERVER_VVVASE_STATE"; + case SERVER_GHZTHUNDER_STATE: return "SERVER_GHZTHUNDER_STATE"; + case SERVER_TCGOM_STATE: return "SERVER_TCGOM_STATE"; + case SERVER_EXELLERCLONE_STATE: return "SERVER_EXELLERCLONE_STATE"; + case SERVER_DTTAILSDOLL_STATE: return "SERVER_DTTAILSDOLL_STATE"; + case SERVER_DTBALL_STATE: return "SERVER_DTBALL_STATE"; + case SERVER_DTASS_STATE: return "SERVER_DTASS_STATE"; + case SERVER_HDDOOR_STATE: return "SERVER_HDDOOR_STATE"; + case SERVER_WDLATERN_ACTIVATE: return "SERVER_WDLATERN_ACTIVATE"; + case SERVER_FART_STATE: return "SERVER_FART_STATE"; + case SERVER_MJLAVA_STATE: return "SERVER_MJLAVA_STATE"; + case SERVER_MJJUDGER_STATE: return "SERVER_MJJUDGER_STATE"; + case SERVER_MJCRYSTAL_STATE: return "SERVER_MJCRYSTAL_STATE"; + case CLIENT_ETRACKER: return "CLIENT_ETRACKER"; + case CLIENT_ETRACKER_ACTIVATED: return "CLIENT_ETRACKER_ACTIVATED"; + case CLIENT_TPROJECTILE: return "CLIENT_TPROJECTILE"; + case CLIENT_TPROJECTILE_HIT: return "CLIENT_TPROJECTILE_HIT"; + case CLIENT_TPROJECTILE_STARTCHARGE: return "CLIENT_TPROJECTILE_STARTCHARGE"; + case CLIENT_ERECTOR_BALLS: return "CLIENT_ERECTOR_BALLS"; + case CLIENT_ERECTOR_BRING_SPAWN: return "CLIENT_ERECTOR_BRING_SPAWN"; + case CLIENT_EXELLER_SPAWN_CLONE: return "CLIENT_EXELLER_SPAWN_CLONE"; + case CLIENT_EXELLER_TELEPORT_CLONE: return "CLIENT_EXELLER_TELEPORT_CLONE"; + case CLIENT_MERCOIN_BONUS: return "CLIENT_MERCOIN_BONUS"; + case CLIENT_RMZSLIME_HIT: return "CLIENT_RMZSLIME_HIT"; + case CLIENT_LCEYE_REQUEST_ACTIVATE: return "CLIENT_LCEYE_REQUEST_ACTIVATE"; + case CLIENT_KAFMONITOR_ACTIVATE: return "CLIENT_KAFMONITOR_ACTIVATE"; + case CLIENT_RING_COLLECTED: return "CLIENT_RING_COLLECTED"; + case CLIENT_RING_BROKE: return "CLIENT_RING_BROKE"; + case CLIENT_BRING_COLLECTED: return "CLIENT_BRING_COLLECTED"; + case CLIENT_NAPICE_ACTIVATE: return "CLIENT_NAPICE_ACTIVATE"; + case CLIENT_SPRING_USE: return "CLIENT_SPRING_USE"; + case CLIENT_PFLIT_ACTIVATE: return "CLIENT_PFLIT_ACTIVATE"; + case CLIENT_VVVASE_BREAK: return "CLIENT_VVVASE_BREAK"; + case CLIENT_RMZSHARD_COLLECT: return "CLIENT_RMZSHARD_COLLECT"; + case CLIENT_RMZSHARD_LAND: return "CLIENT_RMZSHARD_LAND"; + case CLIENT_DTASS_ACTIVATE: return "CLIENT_DTASS_ACTIVATE"; + case CLIENT_HDDOOR_TOGGLE: return "CLIENT_HDDOOR_TOGGLE"; + case CLIENT_FART_PUSH: return "CLIENT_FART_PUSH"; + case CLIENT_LOBBY_READY_STATE: return "CLIENT_LOBBY_READY_STATE"; + case CLIENT_REQUESTED_INFO: return "CLIENT_REQUESTED_INFO"; + case CLIENT_PLAYER_DATA: return "CLIENT_PLAYER_DATA"; + case CLIENT_PLAYER_HURT: return "CLIENT_PLAYER_HURT"; + case CLIENT_SOUND_EMIT: return "CLIENT_SOUND_EMIT"; + case CLIENT_PING: return "CLIENT_PING"; + case CLIENT_REVIVAL_PROGRESS: return "CLIENT_REVIVAL_PROGRESS"; + case CLIENT_PLAYER_HEAL: return "CLIENT_PLAYER_HEAL"; + case CLIENT_PLAYER_HEAL_PART: return "CLIENT_PLAYER_HEAL_PART"; + case SERVER_REVIVAL_PROGRESS: return "SERVER_REVIVAL_PROGRESS"; + case SERVER_REVIVAL_STATUS: return "SERVER_REVIVAL_STATUS"; + case SERVER_REVIVAL_RINGSUB: return "SERVER_REVIVAL_RINGSUB"; + case SERVER_REVIVAL_REVIVED: return "SERVER_REVIVAL_REVIVED"; + case CLIENT_REQUEST_CHARACTER: return "CLIENT_REQUEST_CHARACTER"; + case CLIENT_REQUEST_EXECHARACTER: return "CLIENT_REQUEST_EXECHARACTER"; + case CLIENT_VOTE_REQUEST: return "CLIENT_VOTE_REQUEST"; + case CLIENT_PLAYER_DEATH_STATE: return "CLIENT_PLAYER_DEATH_STATE"; + case CLIENT_PLAYER_ESCAPED: return "CLIENT_PLAYER_ESCAPED"; + case SERVER_PLAYER_ESCAPED: return "SERVER_PLAYER_ESCAPED"; + case CLIENT_LOBBY_PLAYERS_REQUEST: return "CLIENT_LOBBY_PLAYERS_REQUEST"; + case CLIENT_CREAM_SPAWN_RINGS: return "CLIENT_CREAM_SPAWN_RINGS"; + case CLIENT_SPAWN_EFFECT: return "CLIENT_SPAWN_EFFECT"; + case CLIENT_CHAT_MESSAGE: return "CLIENT_CHAT_MESSAGE"; + case CLIENT_LOBBY_CHOOSEVOTEKICK: return "CLIENT_LOBBY_CHOOSEVOTEKICK"; + case CLIENT_LOBBY_CHOOSEBAN: return "CLIENT_LOBBY_CHOOSEBAN"; + case CLIENT_LOBBY_CHOOSEKICK: return "CLIENT_LOBBY_CHOOSEKICK"; + case CLIENT_LOBBY_CHOOSEOP: return "CLIENT_LOBBY_CHOOSEOP"; + case CLIENT_PLAYER_PALETTE: return "CLIENT_PLAYER_PALETTE"; + case CLIENT_PET_PALETTE: return "CLIENT_PET_PALETTE"; + case SERVER_RESULTS: return "SERVER_RESULTS"; + case SERVER_RESULTS_DATA: return "SERVER_RESULTS_DATA"; + case CLIENT_RESULTS_REQUEST: return "CLIENT_RESULTS_REQUEST"; + case CLIENT_STATS_REPORT: return "CLIENT_STATS_REPORT"; + case SERVER_PREIDENTITY: return "SERVER_PREIDENTITY"; + case SERVER_FELLA: return "SERVER_FELLA"; + case CLIENT_PLAYER_POTATER: return "CLIENT_PLAYER_POTATER"; + default: return ""; + } +} + bool packet_new(Packet* packet, PacketType type) { RAssert(packet); @@ -55,6 +201,8 @@ bool packet_new(Packet* packet, PacketType type) PacketWrite(packet, packet_write8, 0); PacketWrite(packet, packet_write8, (uint8_t)type); + Debug("Created packet %s", getPacketTypeName(type)); + return true; } @@ -72,6 +220,10 @@ bool packet_send(ENetPeer* peer, Packet* packet, bool reliable) if(data && data->disconnecting) return true; + if (packet->buff[1] != SERVER_HEARTBEAT) { + Debug("Sending packet %s", getPacketTypeName(packet->buff[1])); + } + packet->pos = 0; ENetPacket* pack = enet_packet_create(packet, packet->len, reliable ? ENET_PACKET_FLAG_RELIABLE : 0); return enet_peer_send(peer, reliable ? 0 : 1, pack) == 0; diff --git a/vcpkg-configuration.json b/vcpkg-configuration.json new file mode 100644 index 0000000..abf55f7 --- /dev/null +++ b/vcpkg-configuration.json @@ -0,0 +1,7 @@ +{ + "default-registry": { + "kind": "git", + "baseline": "9e593bb18ea69cc5095e012465dcd675a822ed0d", + "repository": "https://github.com/microsoft/vcpkg" + } +} \ No newline at end of file From 61a1cc2f33fa7b55b21e2994ce023815b872063d Mon Sep 17 00:00:00 2001 From: MilesGlitch Date: Sun, 6 Sep 2026 21:24:00 +0300 Subject: [PATCH 11/61] update --- disasterserver/{Peer.cpp => Client.cpp} | 100 ++++--- disasterserver/{Peer.hpp => Client.hpp} | 77 +++-- disasterserver/Core/ENet/server.h | 48 +++- disasterserver/Core/ENet/server_event.h | 4 +- .../Core/ENet/server_listen_params.h | 2 +- disasterserver/Core/Packet.cpp | 25 +- disasterserver/Core/Packet.hpp | 8 +- disasterserver/Main.cpp | 4 +- disasterserver/Server.cpp | 270 +++++++++--------- disasterserver/Server.hpp | 67 +---- disasterserver/StateManager.cpp | 16 +- disasterserver/StateManager.hpp | 12 +- disasterserver/States/Lobby.cpp | 137 +++++++-- disasterserver/States/Lobby.hpp | 10 +- disasterserver/States/State.hpp | 6 +- 15 files changed, 488 insertions(+), 298 deletions(-) rename disasterserver/{Peer.cpp => Client.cpp} (50%) rename disasterserver/{Peer.hpp => Client.hpp} (50%) diff --git a/disasterserver/Peer.cpp b/disasterserver/Client.cpp similarity index 50% rename from disasterserver/Peer.cpp rename to disasterserver/Client.cpp index 1a3a3fe..4fd494f 100644 --- a/disasterserver/Peer.cpp +++ b/disasterserver/Client.cpp @@ -1,4 +1,4 @@ -#include "Peer.hpp" +#include "Client.hpp" #include "Server.hpp" #include "Core/Log.hpp" @@ -6,29 +6,26 @@ using namespace DisasterServer; -unsigned int next_uid = 1; +Client::Client(Server *server, ENetPeer *peer, uint16_t incomingPeerID, const char *ip) : + id(incomingPeerID), + ip(std::string(ip)), + peer(peer), + server(server) {} -Peer::Peer() = default; +Client::~Client() = default; -Peer::~Peer() = default; - -void Peer::initialize_client(Peer &client, const char *ip) { - client.id = next_uid++; - client.ip = std::string(ip); -} - -bool Peer::identity(Packet &packet) { +bool Client::identity(Packet &packet) { RAssert(id > 0); bool isBanned = false; uint64_t timeout = 0; - uint16_t build_version = packet.read(); // NOLINT(*-use-auto) - int32_t server_index = packet.read(); // NOLINT(*-use-auto) - std::string nickname = packet.readString(); // NOLINT(*-use-auto) - std::string udid = packet.readString(); // NOLINT(*-use-auto) - uint8_t lobby_icon = packet.read(); // NOLINT(*-use-auto) - int8_t pet = packet.read(); // NOLINT(*-use-auto) + uint16_t build_version = packet.read(); + int32_t server_index = packet.read(); + std::string nickname = packet.readString(); + std::string udid = packet.readString(); + uint8_t lobby_icon = packet.read(); + int8_t pet = packet.read(); should_timeout = true; mod_tool = false; @@ -42,27 +39,27 @@ bool Peer::identity(Packet &packet) { this->exe_chance = 1 + rand() % 4; if (this->server->getPeers().size() >= MAX_PLAYERS) { - this->server->disconnect(*this, DisconnectReason::LOBBYFULL); + this->disconnect(DisconnectReason::LOBBYFULL); return false; } if (packet.getPacketType() != PacketType::IDENTITY) { - this->server->disconnect(*this, DisconnectReason::OTHER, "type != IDENTITY?"); + this->disconnect(DisconnectReason::OTHER, "type != IDENTITY?"); return false; } if (build_version != BUILD_VERSION) { - this->server->disconnect(*this, DisconnectReason::VERMISMATCH); + this->disconnect(DisconnectReason::VERMISMATCH); return false; } if (nickname.length() >= 30) { - this->server->disconnect(*this, DisconnectReason::OTHER, "Your nickname is too long! (30 characters max)"); + this->disconnect(DisconnectReason::OTHER, "Your nickname is too long! (30 characters max)"); return false; } if (udid.length() <= 0) { - this->server->disconnect(*this, DisconnectReason::OTHER, "whoops you have to put the CD in you conputer"); + this->disconnect(DisconnectReason::OTHER, "whoops you have to put the CD in you conputer"); return false; } @@ -81,15 +78,15 @@ bool Peer::identity(Packet &packet) { return true; } -bool Peer::identity_process(const std::string &addr, bool is_banned, uint64_t timeout, bool do_timeout) { +bool Client::identity_process(const std::string &addr, bool is_banned, uint64_t timeout, bool do_timeout) { if (is_banned) { Info("{} banned by host (id {}, ip {})", nickname, id, addr); - this->server->disconnect(*this, DisconnectReason::BANNEDBYHOST); + this->disconnect(DisconnectReason::BANNEDBYHOST); return false; } if (this->server->getPeers().size() >= 7) { - this->server->disconnect(*this, DisconnectReason::LOBBYFULL); + this->disconnect(DisconnectReason::LOBBYFULL); return false; } @@ -98,39 +95,39 @@ bool Peer::identity_process(const std::string &addr, bool is_banned, uint64_t ti time_t val = timeout - tm; if (val > 0) { Info("{} is rate-limited (id {}, ip {})", nickname, id, addr); - this->server->disconnect(*this, DisconnectReason::RATELIMITED); + this->disconnect(DisconnectReason::RATELIMITED); return false; } } + this->server->getPeers().push_back(this); + if (!this->server->getStateManager().state_joined(*this)) { should_timeout = false; - this->server->disconnect(*this, DisconnectReason::OTHER, "Report this to dev: 415 baza otvette, mi tonem"); + this->disconnect(DisconnectReason::OTHER, "Report this to dev: 415 baza otvette, mi tonem"); return false; } - Packet identity_response(PacketType::SERVER_IDENTITY_RESPONSE); - identity_response.write(server->getStateManager().getCurrentState() == States::LOBBY); - identity_response.write(static_cast(id)); - identity_response.send(*this->server, id, true); + Packet identityResponse(PacketType::SERVER_IDENTITY_RESPONSE); + identityResponse.write(server->getStateManager().getCurrentState() == States::LOBBY); + identityResponse.write(id); + identityResponse.send(*this, true); // If in queue, do following if (!in_game) { // For icons - for (size_t i = 0; i < this->server->getPeers().size(); i++) { - auto peer = this->server->getPeers()[i]; - - if (peer->getId() == id) { + for (auto client : this->server->getPeers()) { + if (client->getId() == id) { continue; } Packet pack(PacketType::SERVER_WAITING_PLAYER_INFO); - pack.write(server->getStateManager().getCurrentState() == States::GAME && peer->in_game); - pack.write(static_cast(peer->getId())); + pack.write(server->getStateManager().getCurrentState() == States::GAME && client->in_game); + pack.write(client->getId()); pack.writeString(nickname); - if (server->getStateManager().getCurrentState() == States::GAME && peer->in_game) { + if (server->getStateManager().getCurrentState() == States::GAME && client->in_game) { pack.write( 0 /* v->server->game.exe == peer->id */ ); pack.write( 0 /* v->server->game.exe == peer->id ? peer->exe_char : peer->surv_char */); @@ -139,24 +136,25 @@ bool Peer::identity_process(const std::string &addr, bool is_banned, uint64_t ti pack.write(lobby_icon); } - pack.send(*this->server, id, true); + pack.send(*this, true); } // For other players in queue Packet pack(PacketType::SERVER_WAITING_PLAYER_INFO); pack.write(0); - pack.write(static_cast(getId())); + pack.write(id); pack.writeString(nickname); pack.write(lobby_icon); this->server->broadcast_ex(pack, true, id); - this->server->send_message(id, "hello!"); + this->server->send_message(*this, std::format("|build from &{} @{}~", __DATE__, __TIME__)); + this->server->send_message(*this, "|type .help for command list~"); } return true; } -bool Peer::message_received(Packet &packet) { +bool Client::message_received(Packet &packet) { if (id == 0) { return false; } @@ -167,3 +165,21 @@ bool Peer::message_received(Packet &packet) { return result; } + +void Client::disconnect(DisconnectReason reason, const std::string &message) { + if (reason == DisconnectReason::OTHER && !message.empty()) { + Packet packet(PacketType::SERVER_PLAYER_FORCE_DISCONNECT); + packet.write(static_cast(reason)); + packet.writeString(message); + packet.send(*this, true); + enet_peer_disconnect_later(peer, static_cast(reason)); + } else { + enet_peer_disconnect(peer, static_cast(reason)); + } + + if (message.empty()) { + Info("Disconnected id {} {}: No text.", id, getDisconnectReasonName(reason)); + } else { + Info("Disconnected id {} {}: {}.", id, getDisconnectReasonName(reason), message); + } +} diff --git a/disasterserver/Peer.hpp b/disasterserver/Client.hpp similarity index 50% rename from disasterserver/Peer.hpp rename to disasterserver/Client.hpp index cf88af8..d08cf89 100644 --- a/disasterserver/Peer.hpp +++ b/disasterserver/Client.hpp @@ -27,9 +27,49 @@ namespace DisasterServer EX_EXELLER }; - class Peer { - uint32_t id = 0; - std::string ip = ""; + enum class DisconnectReason + { + FAILEDTOCONNECT, + KICKEDBYHOST, + BANNEDBYHOST, + VERMISMATCH, + SERVERTIMEOUT, + PACKETSNOTRECV, + GAMESTARTED, + AFKTIMEOUT, + LOBBYFULL, + RATELIMITED, + SHUTDOWN, + IPINUSE, + + DONTREPORT = 254, + OTHER = 255 + }; + + inline std::string getDisconnectReasonName(DisconnectReason reason) { + switch (reason) { + case DisconnectReason::FAILEDTOCONNECT: return "FAILED TO CONNECT"; + case DisconnectReason::KICKEDBYHOST: return "KICKED BY HOST"; + case DisconnectReason::BANNEDBYHOST: return "BANNED BY HOST"; + case DisconnectReason::VERMISMATCH: return "VER MISMATCH"; + case DisconnectReason::SERVERTIMEOUT: return "SERVER TIMEOUT"; + case DisconnectReason::PACKETSNOTRECV: return "PACKET SNOT RECV"; + case DisconnectReason::GAMESTARTED: return "GAME STARTED"; + case DisconnectReason::AFKTIMEOUT: return "AFK TIMEOUT"; + case DisconnectReason::LOBBYFULL: return "LOBBY FULL"; + case DisconnectReason::RATELIMITED: return "RATE LIMITED"; + case DisconnectReason::SHUTDOWN: return "SHUTDOWN"; + case DisconnectReason::IPINUSE: return "IPINUSE"; + case DisconnectReason::DONTREPORT: return "DONT REPORT"; + case DisconnectReason::OTHER: return "OTHER"; + default: return ""; + } + } + + class Client { + uint16_t id; + std::string ip; + ENetPeer *peer; /* General info */ //Player plr; @@ -46,14 +86,13 @@ namespace DisasterServer bool is_mobile = false; bool can_vote = false; bool voted = false; + bool disconnecting = false; struct AuthPeer { uint32_t type = 0; uint8_t one = 0; uint8_t two = 0; - }; - - AuthPeer auth = {}; + } auth = {}; /* Character */ SurvCharacters survChar = SurvCharacters::CH_NONE; @@ -66,39 +105,43 @@ namespace DisasterServer double timeout = 0; double vote_cooldown = 0; - public: Server *server = nullptr; + public: + Client(Server *server, ENetPeer *peer, uint16_t incomingPeerID, const char *ip); + ~Client(); - Peer(); - ~Peer(); - - static void initialize_client(Peer &client, const char *ip); - - uint32_t getId() const { return id; } + uint16_t getId() const { return id; } std::string getIp() const { return ip; } + ENetPeer * getPeer() { return peer; } std::string getNickname() { return nickname; } std::string getUdid() { return udid; } uint8_t getLobbyIcon() { return lobby_icon; } int8_t getPet() { return pet; } AuthPeer &getAuthPeer() { return auth; } - void setExeChance(uint8_t chance) { exe_chance = chance; } uint8_t getExeChance() { return exe_chance; } + void setTimeout(double value) { timeout = value; } + double getTimeout() const { return timeout; } + bool isShouldTimeout() { return should_timeout; } - bool isVerified() { return verified; } + void setVoteCooldown(double value) { vote_cooldown = value; } + double getVoteCooldown() { return vote_cooldown; } + void setInGame(bool flag) { in_game = flag; } bool isInGame() { return in_game; } + bool isVerified() { return verified; } bool isOpped() { return op; } bool isModified() { return mod_tool; } - void setReady(bool flag) { ready = flag; } bool isReady() { return ready; } - void setVoted(bool flag) { voted = flag; } bool isVoted() { return voted; } + + bool identity(Packet &packet); bool identity_process(const std::string & addr, bool is_banned, uint64_t timeout, bool do_timeout); bool message_received(Packet &packet); + void disconnect(DisconnectReason reason, const std::string& message = ""); }; } diff --git a/disasterserver/Core/ENet/server.h b/disasterserver/Core/ENet/server.h index 0a82428..75705f2 100644 --- a/disasterserver/Core/ENet/server.h +++ b/disasterserver/Core/ENet/server.h @@ -32,7 +32,7 @@ namespace enetpp { std::unique_ptr _thread; //mapping of uid to peer so that sending packets to specific peers is safe. - std::unordered_map _thread_peer_map; + std::unordered_map _thread_peer_map; client_ptr_vector _connected_clients; @@ -93,6 +93,44 @@ namespace enetpp { delete_all_connected_clients(); } + /* + * void send_queued_packets_in_thread() { + if (!_packet_queue.empty()) { + std::lock_guard lock(_packet_queue_mutex); + while (!_packet_queue.empty()) { + auto qp = _packet_queue.front(); + _packet_queue.pop(); + + auto pi = _thread_peer_map.find(qp._client_id); + if (pi != _thread_peer_map.end()) { + + //enet_peer_send fails if state not connected. was getting random asserts on peers disconnecting and going into ENET_PEER_STATE_ZOMBIE. + if (pi->second->state == ENET_PEER_STATE_CONNECTED) { + + if (enet_peer_send(pi->second, qp._channel_id, qp._packet) != 0) { + Debug("enet_peer_send failed"); + } + + if (qp._packet->referenceCount == 0) { + enet_packet_destroy(qp._packet); + } + } + } + } + } + } + * + */ + + void send_packet(uint16_t client_id, uint8_t channel_id, ENetPacket* packet) { + auto pi = _thread_peer_map.find(client_id); + if (pi != _thread_peer_map.end()) { + if (enet_peer_send(pi->second, channel_id, packet) != 0) { + Debug("enet_peer_send failed"); + } + } + } + void send_packet_to(unsigned int client_id, enet_uint8 channel_id, const enet_uint8* data, size_t data_size, enet_uint32 flags) { assert(is_listening()); if (_thread != nullptr) { @@ -117,7 +155,7 @@ namespace enetpp { void consume_events( std::function on_client_connected, - std::function on_client_disconnected, + std::function on_client_disconnected, std::function on_client_data_received) { if (!_event_queue.empty()) { @@ -169,7 +207,7 @@ namespace enetpp { } /// ====================== Могут быть проблемы ================== - void disconnect_leter(uint32_t id, uint32_t reason) { + void disconnect_leter(uint16_t id, uint32_t reason) { auto iter = _thread_peer_map.find(id); if (iter != _thread_peer_map.end()) { Err("{} not found", id); @@ -183,7 +221,7 @@ namespace enetpp { _event_queue.emplace(ENET_EVENT_TYPE_DISCONNECT, 0, nullptr, reinterpret_cast(iter->second->data)); } - void disconnect(uint32_t id, uint32_t reason) { + void disconnect(uint16_t id, uint32_t reason) { auto iter = _thread_peer_map.find(id); if (iter != _thread_peer_map.end()) { Err("{} not found", id); @@ -322,7 +360,7 @@ namespace enetpp { //initialized with data causing them to be discarded. auto client = new ClientT(); - params._initialize_client_function(*client, peer_ip); + params._initialize_client_function(*client, e.peer->incomingPeerID, peer_ip); assert(e.peer->data == nullptr); e.peer->data = client; diff --git a/disasterserver/Core/ENet/server_event.h b/disasterserver/Core/ENet/server_event.h index 3524de2..2d90177 100644 --- a/disasterserver/Core/ENet/server_event.h +++ b/disasterserver/Core/ENet/server_event.h @@ -13,7 +13,9 @@ namespace enetpp { enet_uint8 _channel_id; ENetPacket* _packet; ClientT* _client; - + ENetEvent _event; + uint16_t incomingPeerID; + public: server_event() : _event_type(ENET_EVENT_TYPE_NONE) diff --git a/disasterserver/Core/ENet/server_listen_params.h b/disasterserver/Core/ENet/server_listen_params.h index 6831ae9..6df24c1 100644 --- a/disasterserver/Core/ENet/server_listen_params.h +++ b/disasterserver/Core/ENet/server_listen_params.h @@ -10,7 +10,7 @@ namespace enetpp { template class server_listen_params { public: - using initialize_client_function = std::function; + using initialize_client_function = std::function; public: size_t _max_client_count; diff --git a/disasterserver/Core/Packet.cpp b/disasterserver/Core/Packet.cpp index 7dd858f..8b7ce73 100644 --- a/disasterserver/Core/Packet.cpp +++ b/disasterserver/Core/Packet.cpp @@ -3,7 +3,7 @@ #include #include "Log.hpp" -#include "Peer.hpp" +#include "Client.hpp" #include "Server.hpp" #ifdef __GNUC__ // GCC, clang... @@ -23,8 +23,9 @@ Packet::Packet(const std::array &buffer) : buffer(buffe type = static_cast(read()); } -Packet::Packet(const enet_uint8 *data, size_t data_size) : buffer({}) { - std::copy_n(data, std::min(data_size, buffer.size()), buffer.begin()); +Packet::Packet(ENetPacket *packet) : buffer({}) { + std::copy_n(packet->data, std::min(packet->dataLength, buffer.size()), buffer.begin()); + enet_packet_destroy(packet); read(); type = static_cast(read()); } @@ -57,14 +58,18 @@ void Packet::writeString(const std::string &value) { } } -void Packet::send(Server &server, uint32_t client_id, bool reliable) { - Debug("PacketType::{} sending to {}", getPacketTypeName(type), client_id); - server.getBackend().send_packet_to(client_id, reliable ? 0 : 1, buffer.data(), len, reliable ? ENET_PACKET_FLAG_RELIABLE : 0); +bool Packet::send(Client &client, bool reliable) { + Debug("PacketType::{} sending to {} (id {})", getPacketTypeName(type), client.getNickname(), client.getId()); - std::vector empty = {0x00, static_cast(PacketType::SERVER_HEARTBEAT)}; - server.getBackend().send_packet_to(client_id, reliable ? 0 : 1, empty.data(), len, reliable ? ENET_PACKET_FLAG_RELIABLE : 0); + ENetPacket* pack = enet_packet_create(buffer.data(), len, reliable ? ENET_PACKET_FLAG_RELIABLE : 0); + return enet_peer_send(client.getPeer(), reliable ? 0 : 1, pack); } -void Packet::sendBroadcast(Server &server, bool reliable, std::function predicate) { - server.getBackend().send_packet_to_all_if(reliable ? 0 : 1, buffer.data(), len, reliable ? ENET_PACKET_FLAG_RELIABLE : 0, std::move(predicate)); +void Packet::sendBroadcast(Server &server, bool reliable, std::function predicate) { + ENetPacket* pack = enet_packet_create(buffer.data(), len, reliable ? ENET_PACKET_FLAG_RELIABLE : 0); + for (auto client : server.getPeers()) { + if (predicate(*client)) { + enet_peer_send(client->getPeer(), reliable ? 0 : 1, pack); + } + } } \ No newline at end of file diff --git a/disasterserver/Core/Packet.hpp b/disasterserver/Core/Packet.hpp index 49a0f48..4b91e1d 100644 --- a/disasterserver/Core/Packet.hpp +++ b/disasterserver/Core/Packet.hpp @@ -324,7 +324,7 @@ static constexpr int PACKET_MAXSIZE = 256; namespace DisasterServer { class Server; - class Peer; + class Client; class Packet { std::array buffer{}; @@ -333,7 +333,7 @@ namespace DisasterServer { size_t len = 0; public: explicit Packet(const std::array &buffer); - explicit Packet(const enet_uint8 *data, size_t data_size); + explicit Packet(ENetPacket *packet); explicit Packet(PacketType type); ~Packet(); @@ -368,8 +368,8 @@ namespace DisasterServer { std::string readString(); void writeString(const std::string &value); - void send(Server &server, uint32_t client_id, bool reliable); - void sendBroadcast(Server &server, bool reliable, std::function predicate = [](const Peer& _) { return true; }); + bool send(Client &client, bool reliable); + void sendBroadcast(Server &server, bool reliable, std::function predicate = [](const Client& _) { return true; }); }; } diff --git a/disasterserver/Main.cpp b/disasterserver/Main.cpp index ef7daf5..d3ff807 100644 --- a/disasterserver/Main.cpp +++ b/disasterserver/Main.cpp @@ -4,7 +4,7 @@ int main(int argc, char *argv[]) { try { - enetpp::global_state::get().initialize(); + enet_initialize(); Info("- DisasterServerCXX v{}", DisasterServer::BUILD_VERSION); Info("- Build from {} {}", __DATE__, __TIME__); @@ -12,7 +12,7 @@ int main(int argc, char *argv[]) { DisasterServer::Server server; server.initialize(); - enetpp::global_state::get().deinitialize(); + enet_deinitialize(); } catch (std::exception& e) { Err("Exception: {}", e.what()); } diff --git a/disasterserver/Server.cpp b/disasterserver/Server.cpp index b3da642..8aa54c4 100644 --- a/disasterserver/Server.cpp +++ b/disasterserver/Server.cpp @@ -11,19 +11,20 @@ using namespace DisasterServer; -Server::Server() : stateManager(this) { - //this->stateManager.registerState(this); +Server::Server(const uint16_t n) : id(n), stateManager(this) { + ENetAddress addr; + addr.host = ENET_HOST_ANY; + addr.port = BASE_SERVER_PORT + n; + host = enet_host_create(&addr, 50, 2, 0, 0); + + Info("Listening on port {}", addr.port); } -Server::~Server() = default; +Server::~Server() { + enet_host_destroy(host); +}; void Server::initialize() { - backend.start_listening(enetpp::server_listen_params() - .set_max_client_count(50) - .set_channel_count(2) - .set_listen_port(BASE_SERVER_PORT) - .set_initialize_client_function(Peer::initialize_client)); - TimeStamp ticker; time_start(&ticker); @@ -34,11 +35,125 @@ void Server::initialize() { // while (!running) { - backend.consume_events( - [&](Peer& client) { this->on_client_connected(client); }, - [&](Peer &client, uint32_t client_uid) { this->on_client_disconnected(client, client_uid); }, - [&](Peer& client, const enet_uint8* data, size_t data_size) { this->on_client_received(client, data, data_size); } - ); + ENetEvent ev; + if (enet_host_service(host, &ev, 5) > 0) { + switch (ev.type) { + case ENET_EVENT_TYPE_CONNECT: { + char ip[250]; + enet_address_get_host_ip(&ev.peer->address, ip, 250); + + Client *client = new Client(this, ev.peer, ev.peer->incomingPeerID + 1, ip); + Debug("Connection client {}", client->getId()); + + ev.peer->data = client; + + Packet pack(PacketType::SERVER_PREIDENTITY); + client->getAuthPeer().one = (uint8_t) rand() % 128; + client->getAuthPeer().two = (uint8_t) rand() % 255; + + uint32_t type = 0; + + switch (rand() % 3) + { + case 0: + type = 1u << 9; + break; + + case 1: + type = 1u << 31; + break; + + case 2: + type = 1u << 26; + break; + + default: break; + } + + for (int bit = 0; bit < 32; ++bit) + { + if (bit == 9 || bit == 31 || bit == 26) + continue; + + if (rand() % 3 <= 1) + type &= ~(1u << bit); + else + type |= 1u << bit; + } + + client->getAuthPeer().type = type; + + pack.write(0); + pack.write(1); + pack.write(client->getAuthPeer().one); + pack.write((uint8_t) rand() % 2); + pack.write(client->getAuthPeer().two); + + const uint8_t key[6] = { 0x00, 0x00, 0xFF, 0x1F, 0x80, 0x14 }; + + for (int i = 0; i < 3; i++) { + pack.write(key[rand() % sizeof(key)]); + } + pack.write(client->getAuthPeer().type); + pack.send(*client, true); + + break; + } + case ENET_EVENT_TYPE_DISCONNECT: { + Client *client = static_cast(ev.peer->data); + + if (!client) { + break; + } + + if (client->isOpped() && client->isShouldTimeout()) { + + } + + if (client->isVerified()) { + auto it = std::find_if( + peers.begin(), + peers.end(), + [client](const auto& p) { + return p == client; + }); + + if (it != peers.end()) { + stateManager.state_left(**it); + peers.erase(it); + } + } + + Info("{} (id {}) left.", client->getNickname(), client->getId()); + delete client; + break; + } + case ENET_EVENT_TYPE_RECEIVE: { + Client *client = static_cast(ev.peer->data); + Packet packet(ev.packet); + + switch (packet.getPacketType()) { + case PacketType::IDENTITY: { + if (!client->identity(packet)) { + Debug("Identity failed for id {}", client->getId()); + } + break; + } + default: { + if (!client->message_received(packet)) { + break; + } + break; + } + } + + break; + } + + default: break; + } + } + double now = time_end(&ticker); while (next_tick < now) { next_tick += TARGET_FPS; @@ -46,7 +161,7 @@ void Server::initialize() { stateManager.state_tick(); // Heartbeat - if (backend.get_connected_clients().empty()) { + if (peers.empty()) { Packet packet_heartbeat(PacketType::SERVER_HEARTBEAT); if (heartbeat >= (TICKSPERSEC * 2)) { @@ -60,33 +175,12 @@ void Server::initialize() { delta = 1; } } - - backend.stop_listening(); } -void Server::disconnect(Peer &peer, DisconnectReason reason, const std::string& message) { - if (reason == DisconnectReason::OTHER && !message.empty()) { - Packet packet(PacketType::SERVER_PLAYER_FORCE_DISCONNECT); - packet.write(static_cast(reason)); - packet.writeString(message); - packet.send(*this, peer.getId(), true); - backend.disconnect_leter(peer.getId(), static_cast(reason)); - } else { - backend.disconnect(peer.getId(), static_cast(reason)); - } - - if (message.empty()) { - Info("Disconnected id {} {}: No text.", peer.getId(), getDisconnectReasonName(reason)); - } else { - Info("Disconnected id {} {}: {}.", peer.getId(), getDisconnectReasonName(reason), message); - } -} - -void Server::disconnect_by_id(uint32_t id, DisconnectReason reason, const std::string &message) { - for (size_t i = 0; i < backend.get_connected_clients().size(); i++) { - auto client = backend.get_connected_clients()[i]; +void Server::disconnect_by_id(const uint16_t id, DisconnectReason reason, const std::string &message) { + for (auto client : peers) { if (client->getId() == id) { - return disconnect(*client, reason, message); + return client->disconnect(reason, message); } } } @@ -94,31 +188,27 @@ void Server::disconnect_by_id(uint32_t id, DisconnectReason reason, const std::s void Server::broadcast(Packet &packet, bool reliable) { Debug("PacketType::{} sending broadcast", getPacketTypeName(packet.getPacketType())); - for (size_t i = 0; i < backend.get_connected_clients().size(); i++) { - auto client = backend.get_connected_clients()[i]; - packet.send(*this, client->getId(), reliable); + for (auto client : peers) { + packet.send(*client, reliable); } } -void Server::broadcast_ex(Packet &packet, bool reliable, uint32_t ignore) { +void Server::broadcast_ex(Packet &packet, bool reliable, uint16_t ignore) { Debug("PacketType::{} sending broadcast, ignoring client {}", getPacketTypeName(packet.getPacketType()), ignore); - for (size_t i = 0; i < backend.get_connected_clients().size(); i++) { - auto client = backend.get_connected_clients()[i]; - + for (auto client : peers) { if (client->getId() == ignore) { continue; } - - packet.send(*this, client->getId(), reliable); + packet.send(*client, reliable); } } -void Server::send_message(uint32_t clientId, std::string message) { - std::ranges::transform(message, message.begin(), [](unsigned char c){ return std::tolower(c); }); +void Server::send_message(Client &client, std::string message) { + std::ranges::transform(message, message.begin(), [](const unsigned char c){ return std::tolower(c); }); Packet packet(PacketType::CLIENT_CHAT_MESSAGE); packet.write(0); packet.writeString(message); - packet.send(*this, clientId, true); + packet.send(client, true); } void Server::send_broadcast_message(uint16_t sender, std::string &message) { @@ -132,82 +222,4 @@ void Server::send_broadcast_message(uint16_t sender, std::string &message) { StateManager &Server::getStateManager() { return stateManager; -} - -void Server::on_client_connected(Peer &peer) { - peer.server = this; - Debug("Connection client {}", peer.getId()); - - Packet preidentity(PacketType::SERVER_PREIDENTITY); - peer.getAuthPeer().one = (uint8_t) rand() % 128; - peer.getAuthPeer().two = (uint8_t) rand() % 255; - - uint32_t type = 0; - - switch (rand() % 3) - { - case 0: - type = 1u << 9; - break; - - case 1: - type = 1u << 31; - break; - - case 2: - type = 1u << 26; - break; - - default: break; - } - - for (int bit = 0; bit < 32; ++bit) - { - if (bit == 9 || bit == 31 || bit == 26) - continue; - - if (rand() % 3 <= 1) - type &= ~(1u << bit); - else - type |= 1u << bit; - } - - peer.getAuthPeer().type = type; - - preidentity.write(0); - preidentity.write(1); - preidentity.write(peer.getAuthPeer().one); - preidentity.write((uint8_t) rand() % 2); - preidentity.write(peer.getAuthPeer().two); - - const uint8_t key[6] = { 0x00, 0x00, 0xFF, 0x1F, 0x80, 0x14 }; - - for (int i = 0; i < 3; i++) { - preidentity.write(key[rand() % sizeof(key)]); - } - preidentity.write(peer.getAuthPeer().type); - preidentity.send(*this, peer.getId(), true); - -} - -void Server::on_client_disconnected(Peer &peer, uint32_t client_id) { - Info("{} (id {}) left.", peer.getNickname(), client_id); -} - -void Server::on_client_received(Peer &peer, const enet_uint8 *data, size_t data_size) { - Packet packet(data, data_size); - - switch (packet.getPacketType()) { - case PacketType::IDENTITY: { - if (!peer.identity(packet)) { - Debug("Identity failed for id {}", peer.getId()); - } - break; - } - default: { - if (!peer.message_received(packet)) { - break; - } - } - } } \ No newline at end of file diff --git a/disasterserver/Server.hpp b/disasterserver/Server.hpp index 2548463..4979cca 100644 --- a/disasterserver/Server.hpp +++ b/disasterserver/Server.hpp @@ -1,11 +1,9 @@ #ifndef DISASTERSERVER_SERVER_HPP #define DISASTERSERVER_SERVER_HPP -#include "Peer.hpp" +#include "Client.hpp" #include "StateManager.hpp" -#include "Core/ENet/server.h" - #define TICKSPERSEC 60 namespace DisasterServer @@ -15,71 +13,36 @@ namespace DisasterServer static constexpr int BUILD_VERSION = 1101; static constexpr int BASE_SERVER_PORT = 8606; - enum class DisconnectReason - { - FAILEDTOCONNECT, - KICKEDBYHOST, - BANNEDBYHOST, - VERMISMATCH, - SERVERTIMEOUT, - PACKETSNOTRECV, - GAMESTARTED, - AFKTIMEOUT, - LOBBYFULL, - RATELIMITED, - SHUTDOWN, - IPINUSE, - - DONTREPORT = 254, - OTHER = 255 - }; - inline std::string getDisconnectReasonName(DisconnectReason reason) { - switch (reason) { - case DisconnectReason::FAILEDTOCONNECT: return "FAILED TO CONNECT"; - case DisconnectReason::KICKEDBYHOST: return "KICKED BY HOST"; - case DisconnectReason::BANNEDBYHOST: return "BANNED BY HOST"; - case DisconnectReason::VERMISMATCH: return "VER MISMATCH"; - case DisconnectReason::SERVERTIMEOUT: return "SERVER TIMEOUT"; - case DisconnectReason::PACKETSNOTRECV: return "PACKET SNOT RECV"; - case DisconnectReason::GAMESTARTED: return "GAME STARTED"; - case DisconnectReason::AFKTIMEOUT: return "AFK TIMEOUT"; - case DisconnectReason::LOBBYFULL: return "LOBBY FULL"; - case DisconnectReason::RATELIMITED: return "RATE LIMITED"; - case DisconnectReason::SHUTDOWN: return "SHUTDOWN"; - case DisconnectReason::IPINUSE: return "IPINUSE"; - case DisconnectReason::DONTREPORT: return "DONT REPORT"; - case DisconnectReason::OTHER: return "OTHER"; - default: return ""; - } - } class Server { + uint16_t id = 0; bool running = false; - enetpp::server backend; + + ENetHost *host = nullptr; + + std::vector peers; StateManager stateManager; double delta = 0; public: - Server(); + Server(uint16_t n = 0); ~Server(); void initialize(); - void disconnect(Peer &peer, DisconnectReason reason, const std::string& message = ""); - void disconnect_by_id(uint32_t id, DisconnectReason reason, const std::string& message = ""); + void disconnect_by_id(uint16_t id, DisconnectReason reason, const std::string& message = ""); - void send_message(uint32_t clientId, std::string message); + void send_message(Client &client, std::string message); void send_broadcast_message(uint16_t sender, std::string &message); void broadcast(Packet &packet, bool reliable); - void broadcast_ex(Packet &packet, bool reliable, uint32_t ignore); + void broadcast_ex(Packet &packet, bool reliable, uint16_t ignore); - std::vector getPeers() { return backend.get_connected_clients(); } - enetpp::server& getBackend() { return backend; } + std::vector getPeers() { return peers; } StateManager &getStateManager(); - private: - void on_client_connected(Peer &peer); - void on_client_disconnected(Peer & peer, uint32_t client_id); - void on_client_received(Peer &peer, const enet_uint8 *data, size_t data_size); + + double getDelta() { + return delta; + } }; } diff --git a/disasterserver/StateManager.cpp b/disasterserver/StateManager.cpp index bcab344..d209e16 100644 --- a/disasterserver/StateManager.cpp +++ b/disasterserver/StateManager.cpp @@ -8,13 +8,13 @@ StateManager::StateManager(Server *server) : server(server), lobby(server, this) StateManager::~StateManager() = default; -bool StateManager::state_joined(Peer &peer) { +bool StateManager::state_joined(Client &peer) { Packet packet(PacketType::SERVER_LOBBY_EXE_CHANCE); packet.write(peer.getExeChance()); - packet.send(*this->server, peer.getId(), true); + packet.send(peer, true); Packet playerJoined(PacketType::SERVER_PLAYER_JOINED); - playerJoined.write(static_cast(peer.getId())); + playerJoined.write(peer.getId()); playerJoined.writeString(peer.getNickname()); playerJoined.write(peer.getLobbyIcon()); playerJoined.write(peer.getPet()); @@ -57,7 +57,7 @@ void StateManager::state_tick() { } } -bool StateManager::state_handle(Peer &peer, Packet &packet) { +bool StateManager::state_handle(Client &peer, Packet &packet) { switch (state) { case States::LOBBY: @@ -77,3 +77,11 @@ bool StateManager::state_handle(Peer &peer, Packet &packet) { return true; } + +void StateManager::setState(States state) { + this->state = state; +} + +void StateManager::state_left(Client &peer) { + +} diff --git a/disasterserver/StateManager.hpp b/disasterserver/StateManager.hpp index 41a3daf..df36bff 100644 --- a/disasterserver/StateManager.hpp +++ b/disasterserver/StateManager.hpp @@ -6,7 +6,7 @@ namespace DisasterServer { - class Peer; + class Client; enum class States { LOBBY, @@ -25,11 +25,17 @@ namespace DisasterServer explicit StateManager(Server *server); ~StateManager(); - bool state_joined(Peer &peer); + bool state_joined(Client &peer); void state_tick(); - bool state_handle(Peer &peer, Packet &packet); + bool state_handle(Client &peer, Packet &packet); [[nodiscard]] States getCurrentState() const { return this->state; } + + void setState(States state); + + void state_left(Client &peer); + + }; } diff --git a/disasterserver/States/Lobby.cpp b/disasterserver/States/Lobby.cpp index 3da79b2..137dae6 100644 --- a/disasterserver/States/Lobby.cpp +++ b/disasterserver/States/Lobby.cpp @@ -10,38 +10,119 @@ Lobby::Lobby(Server *server, StateManager *stateManager) : server(server), state Lobby::~Lobby() = default; -bool Lobby::joined(Peer &peer) { +bool Lobby::init() { + for (Client *peer : server->getPeers()) { + peer->setReady(false); + peer->setVoted(false); + peer->setTimeout(false); + + if (!peer->isInGame()) { + peer->setInGame(true); + + Packet pack(PacketType::SERVER_IDENTITY_RESPONSE); + pack.write(1); + pack.write(peer->getId()); + pack.send(*peer, true); + } else { + /* + if (v->id != server->game.exe) + v->exe_chance += 2 + rand() % 5; + */ + + Packet pack(PacketType::SERVER_LOBBY_EXE_CHANCE); + pack.write(peer->getExeChance()); + pack.send(*peer, true); + } + } + + stateManager->setState(States::LOBBY); + countdown = TICKSPERSEC; + countdown_sec = NO_COUNTDOWN; + prac_countdown = 0; + + Packet pack(PacketType::SERVER_GAME_BACK_TO_LOBBY); + server->broadcast(pack, true); + + return true; +} + +bool Lobby::joined(Client &peer) { return true; } -void Lobby::tick() { +bool Lobby::tick() { + switch (stateManager->getCurrentState()) { + case States::LOBBY: { + for (Client *peer : server->getPeers()) { + if (peer->getVoteCooldown() > 0) { + peer->setVoteCooldown(peer->getVoteCooldown() - server->getDelta()); + } + + if (peer->isReady()) { + peer->setTimeout(peer->getTimeout() + server->getDelta()); + if (std::fmod(peer->getTimeout(), 60) == 0) { + Debug("tick for {}: {}", peer->getNickname(), peer->getTimeout() / 60.0f); + } + + if (peer->getTimeout() >= 25 * TICKSPERSEC) { + peer->disconnect(DisconnectReason::AFKTIMEOUT); + } + } else { + peer->setTimeout(0); + } + } + break; + } + default: break; + } + + if (prac_countdown > 0) { + prac_countdown -= server->getDelta(); + if (prac_countdown <= 0) { + return init(); + } + } + + if (countdown_sec <= COUNTDOWN) { + if (countdown <= 0) { + countdown += TICKSPERSEC; + + if (--countdown_sec == 0) { + return init(); + } + } + + countdown_sec -= server->getDelta(); + } + return true; } -bool Lobby::handle(Peer &v, Packet &packet) { +bool Lobby::handle(Client &client, Packet &packet) { switch (packet.getPacketType()) { + default: + break; + case PacketType::CLIENT_LOBBY_PLAYERS_REQUEST: { - for (size_t i = 0; i < server->getPeers().size(); i++) { - auto peer = server->getPeers()[i]; - if (v.getId() == peer->getId()) { + for (auto value : server->getPeers()) { + if (client.getId() == value->getId()) { continue; } Packet pack(PacketType::SERVER_LOBBY_PLAYER); - pack.write(static_cast(peer->getId())); - pack.write(peer->isReady()); - pack.writeString(peer->getNickname()); - pack.write(peer->getLobbyIcon()); - pack.write(peer->getPet()); - pack.send(*server, peer->getId(), true); + pack.write(value->getId()); + pack.write(value->isReady()); + pack.writeString(value->getNickname()); + pack.write(value->getLobbyIcon()); + pack.write(value->getPet()); + server->broadcast_ex(pack, true, client.getId()); } - { - Packet pack(PacketType::SERVER_LOBBY_CORRECT); - pack.send(*server, v.getId(), true); - } - server->send_message(v.getId(), std::format("|build from &{} @{}~", __DATE__, __TIME__)); - //server->send_message(v.getId(), "|type .help for command list~"); + Packet pack(PacketType::SERVER_LOBBY_CORRECT); + pack.send(client, true); + + server->send_message(client, std::format("|build from &{} @{}~", __DATE__, __TIME__)); + server->send_message(client, "|type .help for command list~"); break; } @@ -50,10 +131,24 @@ bool Lobby::handle(Peer &v, Packet &packet) { uint16_t pid = packet.read(); auto message = packet.readString(); - Info("{} " LOG_RST "(id {}): {}", v.getNickname(), v.getId(), message); - server->send_broadcast_message(v.getId(), message); + Info("{} " LOG_RST "(id {}): {}", client.getNickname(), client.getId(), message); + server->send_broadcast_message(client.getId(), message); + } + case PacketType::CLIENT_LOBBY_READY_STATE: { + uint8_t state = packet.read(); + client.setReady(state); + + Packet pack(PacketType::SERVER_LOBBY_READY_STATE); + pack.write(client.getId()); + pack.write(state); + server->broadcast(pack, true); + + break; + } + case PacketType::CLIENT_LOBBY_CHOOSEVOTEKICK: { + uint16_t pid = packet.read(); + break; } - default: break; } return true; diff --git a/disasterserver/States/Lobby.hpp b/disasterserver/States/Lobby.hpp index 972103f..0236eed 100644 --- a/disasterserver/States/Lobby.hpp +++ b/disasterserver/States/Lobby.hpp @@ -6,7 +6,8 @@ #include #include - +#define NO_COUNTDOWN (5 + 1) +#define COUNTDOWN (5) namespace DisasterServer { @@ -33,9 +34,10 @@ namespace DisasterServer explicit Lobby(Server *server, StateManager *stateManager); ~Lobby(); - bool joined(Peer &peer); - void tick(); - bool handle(Peer &v, Packet &packet); + bool init(); + bool joined(Client &peer); + bool tick(); + bool handle(Client &client, Packet &packet); }; } #endif //DISASTERSERVER_LOBBY_HPP diff --git a/disasterserver/States/State.hpp b/disasterserver/States/State.hpp index 2be87cc..d884425 100644 --- a/disasterserver/States/State.hpp +++ b/disasterserver/States/State.hpp @@ -2,7 +2,7 @@ #ifndef DISASTERSERVER_STATE_HPP #define DISASTERSERVER_STATE_HPP -#include "Peer.hpp" +#include "Client.hpp" namespace DisasterServer { @@ -19,7 +19,7 @@ namespace DisasterServer server = nullptr; } - virtual bool joined(Peer &peer) { + virtual bool joined(Client &peer) { return true; } @@ -27,7 +27,7 @@ namespace DisasterServer } - virtual bool handle(Peer &peer, Packet &packet) { + virtual bool handle(Client &peer, Packet &packet) { return true; } }; From e17e309f3689d8fd89c5499f8d42892b90297e25 Mon Sep 17 00:00:00 2001 From: MilesGlitch Date: Sun, 6 Sep 2026 23:42:32 +0300 Subject: [PATCH 12/61] refactoring --- disasterserver/Client.cpp | 14 +++-- disasterserver/Client.hpp | 3 +- disasterserver/Core/Exceptions.hpp | 18 ++++++ disasterserver/Core/Packet.cpp | 80 ++++++++++++++++++------- disasterserver/Core/Packet.hpp | 29 ++++++---- disasterserver/Server.cpp | 93 +++++++++++++++--------------- disasterserver/Server.hpp | 7 +-- disasterserver/States/Lobby.cpp | 19 +++--- 8 files changed, 166 insertions(+), 97 deletions(-) create mode 100644 disasterserver/Core/Exceptions.hpp diff --git a/disasterserver/Client.cpp b/disasterserver/Client.cpp index 4fd494f..94f6ec3 100644 --- a/disasterserver/Client.cpp +++ b/disasterserver/Client.cpp @@ -6,9 +6,9 @@ using namespace DisasterServer; -Client::Client(Server *server, ENetPeer *peer, uint16_t incomingPeerID, const char *ip) : +Client::Client(Server *server, ENetPeer *peer, uint16_t incomingPeerID, const std::string &ip) : id(incomingPeerID), - ip(std::string(ip)), + ip(ip), peer(peer), server(server) {} @@ -100,8 +100,6 @@ bool Client::identity_process(const std::string &addr, bool is_banned, uint64_t } } - this->server->getPeers().push_back(this); - if (!this->server->getStateManager().state_joined(*this)) { should_timeout = false; this->disconnect(DisconnectReason::OTHER, "Report this to dev: 415 baza otvette, mi tonem"); @@ -117,7 +115,7 @@ bool Client::identity_process(const std::string &addr, bool is_banned, uint64_t if (!in_game) { // For icons - for (auto client : this->server->getPeers()) { + for (auto &client : this->server->getPeers()) { if (client->getId() == id) { continue; } @@ -167,6 +165,10 @@ bool Client::message_received(Packet &packet) { } void Client::disconnect(DisconnectReason reason, const std::string &message) { + if (disconnecting) { + return; + } + if (reason == DisconnectReason::OTHER && !message.empty()) { Packet packet(PacketType::SERVER_PLAYER_FORCE_DISCONNECT); packet.write(static_cast(reason)); @@ -182,4 +184,6 @@ void Client::disconnect(DisconnectReason reason, const std::string &message) { } else { Info("Disconnected id {} {}: {}.", id, getDisconnectReasonName(reason), message); } + + disconnecting = true; } diff --git a/disasterserver/Client.hpp b/disasterserver/Client.hpp index d08cf89..45bc940 100644 --- a/disasterserver/Client.hpp +++ b/disasterserver/Client.hpp @@ -107,7 +107,7 @@ namespace DisasterServer Server *server = nullptr; public: - Client(Server *server, ENetPeer *peer, uint16_t incomingPeerID, const char *ip); + Client(Server *server, ENetPeer *peer, uint16_t incomingPeerID, const std::string &ip); ~Client(); uint16_t getId() const { return id; } @@ -123,6 +123,7 @@ namespace DisasterServer void setTimeout(double value) { timeout = value; } double getTimeout() const { return timeout; } bool isShouldTimeout() { return should_timeout; } + bool isDisconnecting() { return disconnecting; } void setVoteCooldown(double value) { vote_cooldown = value; } double getVoteCooldown() { return vote_cooldown; } diff --git a/disasterserver/Core/Exceptions.hpp b/disasterserver/Core/Exceptions.hpp new file mode 100644 index 0000000..f3713dd --- /dev/null +++ b/disasterserver/Core/Exceptions.hpp @@ -0,0 +1,18 @@ +#ifndef DISASTERSERVER_EXCEPTIONS_HPP +#define DISASTERSERVER_EXCEPTIONS_HPP + +namespace DisasterServer +{ + class PacketError : public std::exception { + public: + explicit PacketError(std::string& message) : std::exception(message.data()) {} + explicit PacketError(const std::string& message) : std::exception(message.data()) {} + + template + static PacketError Format(std::string_view fmt, Args&&... args) { + return PacketError(std::vformat(fmt, std::make_format_args(args...))); + } + }; +} + +#endif //DISASTERSERVER_EXCEPTIONS_HPP diff --git a/disasterserver/Core/Packet.cpp b/disasterserver/Core/Packet.cpp index 8b7ce73..91374df 100644 --- a/disasterserver/Core/Packet.cpp +++ b/disasterserver/Core/Packet.cpp @@ -5,6 +5,7 @@ #include "Log.hpp" #include "Client.hpp" #include "Server.hpp" +#include "Exceptions.hpp" #ifdef __GNUC__ // GCC, clang... #define BYTESWAP_16(x) __builtin_bswap16((x)) @@ -18,16 +19,29 @@ using namespace DisasterServer; -Packet::Packet(const std::array &buffer) : buffer(buffer) { - read(); - type = static_cast(read()); -} - Packet::Packet(ENetPacket *packet) : buffer({}) { - std::copy_n(packet->data, std::min(packet->dataLength, buffer.size()), buffer.begin()); + if (!packet) { + throw std::invalid_argument("Packet is null"); + } + + if (packet->dataLength > buffer.size()) { + enet_packet_destroy(packet); + throw PacketError::Format("Packet is too large"); + } + + len = std::min(static_cast(packet->dataLength), buffer.size()); + + std::memcpy(buffer.data(), packet->data, len); enet_packet_destroy(packet); + + if (len < 2) { + throw std::runtime_error("Packet is too small"); + } + read(); - type = static_cast(read()); + const auto rawType = read(); + + type = static_cast(rawType); } Packet::Packet(PacketType type) : buffer({}), type(type) { @@ -40,36 +54,62 @@ Packet::~Packet() = default; std::string Packet::readString() { std::string result; - while (position < buffer.size()) { - auto ch = static_cast(buffer[position++]); + while (position < len) { + const char c = static_cast(buffer[position++]); - if (ch == '\0') - break; + if (c == '\0') + return result; - result += ch; + result += c; } - return result; + throw PacketError::Format("Unterminated string"); } void Packet::writeString(const std::string &value) { - for (char i : value) { - write(i); + if (position > PACKET_MAXSIZE || value.size() > PACKET_MAXSIZE - position - 1) { + throw std::runtime_error("String is too long"); } + + for (unsigned char c : value) { + write(c); + } + + write(0); } bool Packet::send(Client &client, bool reliable) { - Debug("PacketType::{} sending to {} (id {})", getPacketTypeName(type), client.getNickname(), client.getId()); + if(client.isDisconnecting()) + return true; + + Debug("PacketType::{} sending to {}", getPacketTypeName(type), client.getId()); ENetPacket* pack = enet_packet_create(buffer.data(), len, reliable ? ENET_PACKET_FLAG_RELIABLE : 0); - return enet_peer_send(client.getPeer(), reliable ? 0 : 1, pack); + + if (!pack) { + Err("Failed to create ENet packet"); + return false; + } + + const int result = enet_peer_send( + client.getPeer(), + reliable ? 0 : 1, + pack + ); + + if (result != 0) { + return false; + } + + return true; } void Packet::sendBroadcast(Server &server, bool reliable, std::function predicate) { - ENetPacket* pack = enet_packet_create(buffer.data(), len, reliable ? ENET_PACKET_FLAG_RELIABLE : 0); - for (auto client : server.getPeers()) { + for (auto &client : server.getPeers()) { if (predicate(*client)) { - enet_peer_send(client->getPeer(), reliable ? 0 : 1, pack); + if (!send(*client, reliable)) { + Warn("Failed to send {} to client {}", getPacketTypeName(type), client->getId()); + } } } } \ No newline at end of file diff --git a/disasterserver/Core/Packet.hpp b/disasterserver/Core/Packet.hpp index 4b91e1d..ec7dd2b 100644 --- a/disasterserver/Core/Packet.hpp +++ b/disasterserver/Core/Packet.hpp @@ -321,6 +321,7 @@ inline std::string getPacketTypeName(PacketType type) { static constexpr int PACKET_MAXSIZE = 256; #undef min +#undef max namespace DisasterServer { class Server; @@ -332,7 +333,6 @@ namespace DisasterServer { size_t position = 0; size_t len = 0; public: - explicit Packet(const std::array &buffer); explicit Packet(ENetPacket *packet); explicit Packet(PacketType type); ~Packet(); @@ -343,26 +343,33 @@ namespace DisasterServer { template T read() { - T value = reinterpret_cast(buffer.data() + position)[0]; + static_assert(std::is_trivially_copyable_v, "Packet::read requires trivially copyable type"); + + if (position > len || sizeof(T) > len - position) { + Err("Packet underflow: trying to read {} bytes at position {} from {} byte packet ({})", sizeof(T), position, len, getPacketTypeName(type)); + throw std::runtime_error("Packet underflow"); + } + + T value {}; + std::memcpy(&value, buffer.data() + position, sizeof(T)); position += sizeof(T); + return value; } template void write(T value) { - if (position + sizeof(T) > PACKET_MAXSIZE) { + static_assert(std::is_trivially_copyable_v, "Packet::write requires trivially copyable type"); + + if (position > buffer.size() || sizeof(T) > buffer.size() - position) { Err("Exceeding the Packet Size Limit. Max Size {}", PACKET_MAXSIZE); - return; + throw std::runtime_error("Packet overflow"); } - if (position + sizeof(T) >= len) { - len++; - } + std::memcpy(buffer.data() + position, &value, sizeof(T)); + position += sizeof(T); - const auto *ptr = reinterpret_cast(&value); - for (uint32_t i = 0; i < sizeof(T); i++) { - buffer[position++] = ptr[i]; - } + len = std::max(len, position); } std::string readString(); diff --git a/disasterserver/Server.cpp b/disasterserver/Server.cpp index 8aa54c4..54c41cf 100644 --- a/disasterserver/Server.cpp +++ b/disasterserver/Server.cpp @@ -39,17 +39,23 @@ void Server::initialize() { if (enet_host_service(host, &ev, 5) > 0) { switch (ev.type) { case ENET_EVENT_TYPE_CONNECT: { - char ip[250]; - enet_address_get_host_ip(&ev.peer->address, ip, 250); + char buf[250]; + enet_address_get_host_ip(&ev.peer->address, buf, 250); - Client *client = new Client(this, ev.peer, ev.peer->incomingPeerID + 1, ip); - Debug("Connection client {}", client->getId()); + const uint16_t id = ev.peer->incomingPeerID + 1; - ev.peer->data = client; + auto client = std::make_unique(this, ev.peer, id, buf); + Client *rawClient = client.get(); + ev.peer->data = rawClient; + peers.push_back(std::move(client)); + + Debug("Connection client {}", rawClient->getId()); Packet pack(PacketType::SERVER_PREIDENTITY); - client->getAuthPeer().one = (uint8_t) rand() % 128; - client->getAuthPeer().two = (uint8_t) rand() % 255; + + auto &auth = rawClient->getAuthPeer(); + auth.one = (uint8_t) rand() % 128; + auth.two = (uint8_t) rand() % 255; uint32_t type = 0; @@ -81,21 +87,22 @@ void Server::initialize() { type |= 1u << bit; } - client->getAuthPeer().type = type; + auth.type = type; pack.write(0); pack.write(1); - pack.write(client->getAuthPeer().one); + pack.write(auth.one); pack.write((uint8_t) rand() % 2); - pack.write(client->getAuthPeer().two); + pack.write(auth.two); const uint8_t key[6] = { 0x00, 0x00, 0xFF, 0x1F, 0x80, 0x14 }; for (int i = 0; i < 3; i++) { pack.write(key[rand() % sizeof(key)]); } - pack.write(client->getAuthPeer().type); - pack.send(*client, true); + + pack.write(auth.type); + pack.send(*rawClient, true); break; } @@ -106,43 +113,50 @@ void Server::initialize() { break; } + Info("{} (id {}) left.", client->getNickname(), client->getId()); + if (client->isOpped() && client->isShouldTimeout()) { } if (client->isVerified()) { - auto it = std::find_if( + stateManager.state_left(*client); + } + + ev.peer->data = nullptr; + + auto it = std::find_if( peers.begin(), peers.end(), [client](const auto& p) { - return p == client; + return p.get() == client; }); - if (it != peers.end()) { - stateManager.state_left(**it); - peers.erase(it); - } + if (it != peers.end()) { + peers.erase(it); } - Info("{} (id {}) left.", client->getNickname(), client->getId()); - delete client; break; } case ENET_EVENT_TYPE_RECEIVE: { Client *client = static_cast(ev.peer->data); - Packet packet(ev.packet); - switch (packet.getPacketType()) { + if (!client) { + enet_packet_destroy(ev.packet); + break; + } + + switch (static_cast(ev.packet->data[1])) { case PacketType::IDENTITY: { + Packet packet(ev.packet); if (!client->identity(packet)) { Debug("Identity failed for id {}", client->getId()); } break; } default: { - if (!client->message_received(packet)) { - break; - } + Packet packet(ev.packet); + client->message_received(packet); break; } } @@ -162,10 +176,10 @@ void Server::initialize() { // Heartbeat if (peers.empty()) { - Packet packet_heartbeat(PacketType::SERVER_HEARTBEAT); + Packet pack(PacketType::SERVER_HEARTBEAT); if (heartbeat >= (TICKSPERSEC * 2)) { - broadcast(packet_heartbeat, true); + pack.sendBroadcast(*this, true); Debug("Heartbeat done."); heartbeat = 0; } @@ -177,30 +191,17 @@ void Server::initialize() { } } -void Server::disconnect_by_id(const uint16_t id, DisconnectReason reason, const std::string &message) { - for (auto client : peers) { - if (client->getId() == id) { +void Server::disconnect_by_id(const uint16_t client_id, DisconnectReason reason, const std::string &message) { + for (auto &client : peers) { + if (client->getId() == client_id) { return client->disconnect(reason, message); } } } -void Server::broadcast(Packet &packet, bool reliable) { - Debug("PacketType::{} sending broadcast", getPacketTypeName(packet.getPacketType())); - - for (auto client : peers) { - packet.send(*client, reliable); - } -} - void Server::broadcast_ex(Packet &packet, bool reliable, uint16_t ignore) { Debug("PacketType::{} sending broadcast, ignoring client {}", getPacketTypeName(packet.getPacketType()), ignore); - for (auto client : peers) { - if (client->getId() == ignore) { - continue; - } - packet.send(*client, reliable); - } + packet.sendBroadcast(*this, reliable, [ignore](const Client& v) { return v.getId() == ignore; }); } void Server::send_message(Client &client, std::string message) { @@ -213,11 +214,9 @@ void Server::send_message(Client &client, std::string message) { void Server::send_broadcast_message(uint16_t sender, std::string &message) { Packet packet(PacketType::CLIENT_CHAT_MESSAGE); - packet.write(sender); packet.writeString(message); - - broadcast(packet, true); + packet.sendBroadcast(*this, true); } StateManager &Server::getStateManager() { diff --git a/disasterserver/Server.hpp b/disasterserver/Server.hpp index 4979cca..bd10209 100644 --- a/disasterserver/Server.hpp +++ b/disasterserver/Server.hpp @@ -21,7 +21,7 @@ namespace DisasterServer ENetHost *host = nullptr; - std::vector peers; + std::vector> peers; StateManager stateManager; double delta = 0; public: @@ -29,15 +29,14 @@ namespace DisasterServer ~Server(); void initialize(); - void disconnect_by_id(uint16_t id, DisconnectReason reason, const std::string& message = ""); + void disconnect_by_id(uint16_t client_id, DisconnectReason reason, const std::string& message = ""); void send_message(Client &client, std::string message); void send_broadcast_message(uint16_t sender, std::string &message); - void broadcast(Packet &packet, bool reliable); void broadcast_ex(Packet &packet, bool reliable, uint16_t ignore); - std::vector getPeers() { return peers; } + std::vector> &getPeers() { return peers; } StateManager &getStateManager(); double getDelta() { diff --git a/disasterserver/States/Lobby.cpp b/disasterserver/States/Lobby.cpp index 137dae6..52e8176 100644 --- a/disasterserver/States/Lobby.cpp +++ b/disasterserver/States/Lobby.cpp @@ -11,7 +11,7 @@ Lobby::Lobby(Server *server, StateManager *stateManager) : server(server), state Lobby::~Lobby() = default; bool Lobby::init() { - for (Client *peer : server->getPeers()) { + for (auto &peer : server->getPeers()) { peer->setReady(false); peer->setVoted(false); peer->setTimeout(false); @@ -41,7 +41,7 @@ bool Lobby::init() { prac_countdown = 0; Packet pack(PacketType::SERVER_GAME_BACK_TO_LOBBY); - server->broadcast(pack, true); + pack.sendBroadcast(*this->server, true); return true; } @@ -53,16 +53,16 @@ bool Lobby::joined(Client &peer) { bool Lobby::tick() { switch (stateManager->getCurrentState()) { case States::LOBBY: { - for (Client *peer : server->getPeers()) { + for (auto &peer : server->getPeers()) { if (peer->getVoteCooldown() > 0) { peer->setVoteCooldown(peer->getVoteCooldown() - server->getDelta()); } - if (peer->isReady()) { - peer->setTimeout(peer->getTimeout() + server->getDelta()); + if (!peer->isReady()) { + /*peer->setTimeout(peer->getTimeout() + server->getDelta()); if (std::fmod(peer->getTimeout(), 60) == 0) { Debug("tick for {}: {}", peer->getNickname(), peer->getTimeout() / 60.0f); - } + }*/ if (peer->getTimeout() >= 25 * TICKSPERSEC) { peer->disconnect(DisconnectReason::AFKTIMEOUT); @@ -104,7 +104,7 @@ bool Lobby::handle(Client &client, Packet &packet) { break; case PacketType::CLIENT_LOBBY_PLAYERS_REQUEST: { - for (auto value : server->getPeers()) { + for (auto &value : server->getPeers()) { if (client.getId() == value->getId()) { continue; } @@ -129,10 +129,11 @@ bool Lobby::handle(Client &client, Packet &packet) { case PacketType::CLIENT_CHAT_MESSAGE: { uint16_t pid = packet.read(); - auto message = packet.readString(); + std::string message = packet.readString(); Info("{} " LOG_RST "(id {}): {}", client.getNickname(), client.getId(), message); server->send_broadcast_message(client.getId(), message); + break; } case PacketType::CLIENT_LOBBY_READY_STATE: { uint8_t state = packet.read(); @@ -141,7 +142,7 @@ bool Lobby::handle(Client &client, Packet &packet) { Packet pack(PacketType::SERVER_LOBBY_READY_STATE); pack.write(client.getId()); pack.write(state); - server->broadcast(pack, true); + pack.sendBroadcast(*this->server, true); break; } From c8fc153104d37935309cdd4b68c0d6990cd7cc10 Mon Sep 17 00:00:00 2001 From: MilesGlitch Date: Mon, 7 Sep 2026 01:12:25 +0300 Subject: [PATCH 13/61] refactoring --- disasterserver/Client.cpp | 6 +- disasterserver/Core/ENet/client.h | 270 ----------- .../Core/ENet/client_connect_params.h | 65 --- .../Core/ENet/client_queued_packet.h | 27 -- disasterserver/Core/ENet/client_statistics.h | 19 - disasterserver/Core/ENet/global_state.h | 44 -- disasterserver/Core/ENet/server.h | 440 ------------------ disasterserver/Core/ENet/server_event.h | 37 -- .../Core/ENet/server_listen_params.h | 78 ---- .../Core/ENet/server_queued_packet.h | 30 -- .../Core/ENet/set_current_thread_name.h | 46 -- disasterserver/Core/ENet/trace_handler.h | 14 - disasterserver/Core/Exceptions.hpp | 16 +- disasterserver/Core/Log.cpp | 34 ++ disasterserver/Core/Log.hpp | 93 ++-- disasterserver/Core/Packet.cpp | 30 +- disasterserver/Core/Packet.hpp | 3 +- disasterserver/Core/Singleton.hpp | 22 +- disasterserver/Core/Util.hpp | 7 - ...ateManager.cpp => GameStateController.cpp} | 18 +- disasterserver/GameStateController.hpp | 38 ++ disasterserver/Server.cpp | 37 +- disasterserver/Server.hpp | 8 +- disasterserver/StateManager.hpp | 42 -- .../States/{Lobby.cpp => LobbyState.cpp} | 16 +- .../States/{Lobby.hpp => LobbyState.hpp} | 10 +- 26 files changed, 187 insertions(+), 1263 deletions(-) delete mode 100644 disasterserver/Core/ENet/client.h delete mode 100644 disasterserver/Core/ENet/client_connect_params.h delete mode 100644 disasterserver/Core/ENet/client_queued_packet.h delete mode 100644 disasterserver/Core/ENet/client_statistics.h delete mode 100644 disasterserver/Core/ENet/global_state.h delete mode 100644 disasterserver/Core/ENet/server.h delete mode 100644 disasterserver/Core/ENet/server_event.h delete mode 100644 disasterserver/Core/ENet/server_listen_params.h delete mode 100644 disasterserver/Core/ENet/server_queued_packet.h delete mode 100644 disasterserver/Core/ENet/set_current_thread_name.h delete mode 100644 disasterserver/Core/ENet/trace_handler.h delete mode 100644 disasterserver/Core/Util.hpp rename disasterserver/{StateManager.cpp => GameStateController.cpp} (79%) create mode 100644 disasterserver/GameStateController.hpp delete mode 100644 disasterserver/StateManager.hpp rename disasterserver/States/{Lobby.cpp => LobbyState.cpp} (92%) rename disasterserver/States/{Lobby.hpp => LobbyState.hpp} (78%) diff --git a/disasterserver/Client.cpp b/disasterserver/Client.cpp index 94f6ec3..107a655 100644 --- a/disasterserver/Client.cpp +++ b/disasterserver/Client.cpp @@ -85,7 +85,7 @@ bool Client::identity_process(const std::string &addr, bool is_banned, uint64_t return false; } - if (this->server->getPeers().size() >= 7) { + if (this->server->getPeers().size() >= MAX_PLAYERS) { this->disconnect(DisconnectReason::LOBBYFULL); return false; } @@ -100,7 +100,7 @@ bool Client::identity_process(const std::string &addr, bool is_banned, uint64_t } } - if (!this->server->getStateManager().state_joined(*this)) { + if (!this->server->getStateManager().playerJoined(*this)) { should_timeout = false; this->disconnect(DisconnectReason::OTHER, "Report this to dev: 415 baza otvette, mi tonem"); return false; @@ -159,7 +159,7 @@ bool Client::message_received(Packet &packet) { bool result; - result = this->server->getStateManager().state_handle(*this, packet); + result = this->server->getStateManager().handle(*this, packet); return result; } diff --git a/disasterserver/Core/ENet/client.h b/disasterserver/Core/ENet/client.h deleted file mode 100644 index 7aa662d..0000000 --- a/disasterserver/Core/ENet/client.h +++ /dev/null @@ -1,270 +0,0 @@ -#ifndef ENETPP_CLIENT_H_ -#define ENETPP_CLIENT_H_ - -#include -#include -#include -#include -#include -#include "global_state.h" -#include "client_connect_params.h" -#include "client_queued_packet.h" -#include "client_statistics.h" -#include "set_current_thread_name.h" -#include "trace_handler.h" - -namespace enetpp { - - class client { - private: - trace_handler _trace_handler; - - std::queue _packet_queue; - std::mutex _packet_queue_mutex; - - std::queue _event_queue; - std::queue _event_queue_copy; //member variable instead of stack variable to prevent mallocs? - std::mutex _event_queue_mutex; - - bool _should_exit_thread; - std::unique_ptr _thread; - - client_statistics _statistics; - - public: - client::client() - : _should_exit_thread(false) { - } - - client::~client() { - //responsibility of owners to make sure disconnect is always called. not calling disconnect() in destructor due to - //trace_handler side effects. - assert(_thread == nullptr); - assert(_packet_queue.empty()); - assert(_event_queue.empty()); - assert(_event_queue_copy.empty()); - } - - void set_trace_handler(trace_handler handler) { - assert(!is_connecting_or_connected()); //must be set before any threads started to be safe - _trace_handler = handler; - } - - bool client::is_connecting_or_connected() const { - return _thread != nullptr; - } - - void client::connect(const client_connect_params& params) { - assert(global_state::get().is_initialized()); - assert(!is_connecting_or_connected()); - assert(params._channel_count > 0); - assert(params._server_port != 0); - assert(!params._server_host_name.empty()); - - trace("connecting to '" + params._server_host_name + ":" + std::to_string(params._server_port) + "'"); - - _should_exit_thread = false; - _thread = std::make_unique(&client::run_in_thread, this, params); - } - - void client::disconnect() { - if (_thread != nullptr) { - _should_exit_thread = true; - _thread->join(); - _thread.release(); - } - - destroy_all_queued_packets(); - destroy_all_queued_events(); - } - - void client::send_packet(enet_uint8 channel_id, const enet_uint8* data, size_t data_size, enet_uint32 flags) { - assert(is_connecting_or_connected()); - if (_thread != nullptr) { - std::lock_guard lock(_packet_queue_mutex); - auto packet = enet_packet_create(data, data_size, flags); - _packet_queue.emplace(channel_id, packet); - } - } - - void client::consume_events( - std::function on_connected, - std::function on_disconnected, - std::function on_data_received) { - - if (!_event_queue.empty()) { - - //!IMPORTANT! neet to copy the events for consumption to prevent deadlocks! - //ex. - //- event = JoinGameFailed packet received - //- causes event_handler to call client::disconnect - //- client::disconnect deadlocks as the thread needs a critical section on events to exit - { - std::lock_guard lock(_event_queue_mutex); - assert(_event_queue_copy.empty()); - _event_queue_copy = _event_queue; - _event_queue = {}; - } - - bool is_disconnected = false; - - while (!_event_queue_copy.empty()) { - auto& e = _event_queue_copy.front(); - switch (e.type) { - case ENET_EVENT_TYPE_CONNECT: { - on_connected(); - break; - } - - case ENET_EVENT_TYPE_DISCONNECT: { - on_disconnected(); - is_disconnected = true; - break; - } - - case ENET_EVENT_TYPE_RECEIVE: { - on_data_received(e.packet->data, e.packet->dataLength); - enet_packet_destroy(e.packet); - break; - } - - case ENET_EVENT_TYPE_NONE: - default: - assert(false); - break; - } - _event_queue_copy.pop(); - } - - if (is_disconnected) { - //cleanup everything internally, make sure the thread is cleaned up. - disconnect(); - } - } - } - - const client_statistics& get_statistics() const { - return _statistics; - } - - private: - void client::destroy_all_queued_packets() { - std::lock_guard lock(_packet_queue_mutex); - while (!_packet_queue.empty()) { - enet_packet_destroy(_packet_queue.front()._packet); - _packet_queue.pop(); - } - } - - void client::destroy_all_queued_events() { - std::lock_guard lock(_event_queue_mutex); - while (!_event_queue.empty()) { - destroy_unhandled_event_data(_event_queue.front()); - _event_queue.pop(); - } - } - - void client::destroy_unhandled_event_data(ENetEvent& e) { - if (e.type == ENET_EVENT_TYPE_RECEIVE) { - enet_packet_destroy(e.packet); - } - } - - void client::run_in_thread(const client_connect_params& params) { - set_current_thread_name("enetpp::client"); - - ENetHost* host = enet_host_create(nullptr, 1, params._channel_count, params._incoming_bandwidth, params._outgoing_bandwidth); - if (host == nullptr) { - trace("enet_host_create failed"); - return; - } - - auto address = params.make_server_address(); - ENetPeer* peer = enet_host_connect(host, &address, params._channel_count, 0); - if (peer == nullptr) { - trace("enet_host_connect failed"); - enet_host_destroy(host); - return; - } - - enet_uint32 enet_timeout = static_cast(params._timeout.count()); - enet_peer_timeout(peer, 0, enet_timeout, enet_timeout); - - bool is_disconnecting = false; - enet_uint32 disconnect_start_time = 0; - - while (peer != nullptr) { - - _statistics._round_trip_time_in_ms = peer->roundTripTime; - _statistics._round_trip_time_variance_in_ms = peer->roundTripTimeVariance; - - if (_should_exit_thread) { - if (!is_disconnecting) { - enet_peer_disconnect(peer, 0); - is_disconnecting = true; - disconnect_start_time = enet_time_get(); - } - else { - if ((enet_time_get() - disconnect_start_time) > 1000) { - trace("enet_peer_disconnect took too long"); - enet_peer_reset(peer); - peer = nullptr; - break; - } - } - } - - if (!is_disconnecting) { - send_queued_packets_in_thread(peer); - } - - //flush / capture enet events - //http://lists.cubik.org/pipermail/enet-discuss/2013-September/002240.html - enet_host_service(host, 0, 0); - { - ENetEvent e; - while (enet_host_check_events(host, &e) > 0) { - std::lock_guard lock(_event_queue_mutex); - _event_queue.push(e); - if (e.type == ENET_EVENT_TYPE_DISCONNECT) { - trace("ENET_EVENT_TYPE_DISCONNECT received"); - peer = nullptr; - break; - } - } - } - - std::this_thread::sleep_for(std::chrono::milliseconds(1)); - } - - enet_host_destroy(host); - } - - void client::send_queued_packets_in_thread(ENetPeer* peer) { - if (!_packet_queue.empty()) { - std::lock_guard lock(_packet_queue_mutex); - while (!_packet_queue.empty()) { - auto qp = _packet_queue.front(); - _packet_queue.pop(); - - if (enet_peer_send(peer, qp._channel_id, qp._packet) != 0) { - trace("enet_peer_send failed"); - } - - if (qp._packet->referenceCount == 0) { - enet_packet_destroy(qp._packet); - } - } - } - } - - void client::trace(const std::string& s) { - if (_trace_handler != nullptr) { - _trace_handler(s); - } - } - }; - -} - -#endif \ No newline at end of file diff --git a/disasterserver/Core/ENet/client_connect_params.h b/disasterserver/Core/ENet/client_connect_params.h deleted file mode 100644 index 71e2f77..0000000 --- a/disasterserver/Core/ENet/client_connect_params.h +++ /dev/null @@ -1,65 +0,0 @@ -#ifndef ENETPP_CLIENT_CONNECT_PARAMS_H_ -#define ENETPP_CLIENT_CONNECT_PARAMS_H_ - -#include "enet/enet.h" -#include - -namespace enetpp { - - class client_connect_params { - public: - size_t _channel_count; - enet_uint32 _incoming_bandwidth; - enet_uint32 _outgoing_bandwidth; - std::string _server_host_name; - enet_uint16 _server_port; - std::chrono::milliseconds _timeout; - - public: - client_connect_params() - : _channel_count(0) - , _incoming_bandwidth(0) - , _outgoing_bandwidth(0) - , _server_host_name() - , _server_port(0) - , _timeout(0) { - } - - client_connect_params& set_channel_count(size_t channel_count) { - _channel_count = channel_count; - return *this; - } - - client_connect_params& set_incoming_bandwidth(enet_uint32 bandwidth) { - _incoming_bandwidth = bandwidth; - return *this; - } - - client_connect_params& set_outgoing_bandwidth(enet_uint32 bandwidth) { - _outgoing_bandwidth = bandwidth; - return *this; - } - - client_connect_params& set_server_host_name_and_port(const char* host_name, enet_uint16 port) { - _server_host_name = host_name; - _server_port = port; - return *this; - } - - client_connect_params& set_timeout(std::chrono::milliseconds timeout) { - _timeout = timeout; - return *this; - } - - ENetAddress make_server_address() const { - ENetAddress address; - enet_address_set_host(&address, _server_host_name.c_str()); - address.port = _server_port; - return address; - } - - }; - -} - -#endif \ No newline at end of file diff --git a/disasterserver/Core/ENet/client_queued_packet.h b/disasterserver/Core/ENet/client_queued_packet.h deleted file mode 100644 index 6aa8ac2..0000000 --- a/disasterserver/Core/ENet/client_queued_packet.h +++ /dev/null @@ -1,27 +0,0 @@ -#ifndef ENETPP_CLIENT_QUEUED_PACKET_H_ -#define ENETPP_CLIENT_QUEUED_PACKET_H_ - -#include "enet/enet.h" - -namespace enetpp { - - class client_queued_packet { - public: - enet_uint8 _channel_id; - ENetPacket* _packet; - - public: - client_queued_packet() - : _channel_id(0) - , _packet(nullptr) { - } - - client_queued_packet(enet_uint8 channel_id, ENetPacket* packet) - : _channel_id(channel_id) - , _packet(packet) { - } - }; - -} - -#endif \ No newline at end of file diff --git a/disasterserver/Core/ENet/client_statistics.h b/disasterserver/Core/ENet/client_statistics.h deleted file mode 100644 index e93f12d..0000000 --- a/disasterserver/Core/ENet/client_statistics.h +++ /dev/null @@ -1,19 +0,0 @@ -#pragma once - -#include - -namespace enetpp { - - class client_statistics { - public: - std::atomic _round_trip_time_in_ms; - std::atomic _round_trip_time_variance_in_ms; - - public: - client_statistics() - : _round_trip_time_in_ms(0) - , _round_trip_time_variance_in_ms(0) { - } - }; - -} \ No newline at end of file diff --git a/disasterserver/Core/ENet/global_state.h b/disasterserver/Core/ENet/global_state.h deleted file mode 100644 index d2cc60d..0000000 --- a/disasterserver/Core/ENet/global_state.h +++ /dev/null @@ -1,44 +0,0 @@ -#ifndef ENETPP_GLOBAL_STATE_H_ -#define ENETPP_GLOBAL_STATE_H_ - -#include -#include "enet/enet.h" - -namespace enetpp { - - //ugh - class global_state { - private: - bool _is_initialized; - - public: - static global_state& get() { - static global_state g; - return g; - } - - public: - bool is_initialized() const { - return _is_initialized; - } - - void initialize() { - assert(!_is_initialized); - enet_initialize(); - _is_initialized = true; - } - - void deinitialize() { - enet_deinitialize(); - _is_initialized = false; - } - - private: - global_state() - : _is_initialized(false) { - } - }; - -} - -#endif diff --git a/disasterserver/Core/ENet/server.h b/disasterserver/Core/ENet/server.h deleted file mode 100644 index 75705f2..0000000 --- a/disasterserver/Core/ENet/server.h +++ /dev/null @@ -1,440 +0,0 @@ -#ifndef ENETPP_SERVER_H_ -#define ENETPP_SERVER_H_ - -#include -#include -#include -#include -#include -#include -#include -#include "server_listen_params.h" -#include "server_queued_packet.h" -#include "server_event.h" -#include "global_state.h" -#include "set_current_thread_name.h" -#include "trace_handler.h" -#include "Core/Log.hpp" - -namespace enetpp { - - template - class server { - public: - using event_type = server_event; - using listen_params_type = server_listen_params; - using client_ptr_vector = std::vector; - - private: - trace_handler _trace_handler; - - bool _should_exit_thread; - std::unique_ptr _thread; - - //mapping of uid to peer so that sending packets to specific peers is safe. - std::unordered_map _thread_peer_map; - - client_ptr_vector _connected_clients; - - std::queue _packet_queue; - std::mutex _packet_queue_mutex; - - std::queue _event_queue; - std::queue _event_queue_copy; //member variable instead of stack variable to prevent mallocs? - std::mutex _event_queue_mutex; - - public: - server() - : _should_exit_thread(false) { - } - - ~server() { - //responsibility of owners to make sure stop_listening is always called. not calling stop_listening() in destructor due to - //trace_handler side effects. - assert(_thread == nullptr); - assert(_packet_queue.empty()); - assert(_event_queue.empty()); - assert(_event_queue_copy.empty()); - assert(_connected_clients.empty()); - } - - void set_trace_handler(trace_handler handler) { - assert(!is_listening()); //must be set before any threads started to be safe - _trace_handler = handler; - } - - bool is_listening() const { - return (_thread != nullptr); - } - - void start_listening(const listen_params_type& params) { - assert(global_state::get().is_initialized()); - assert(!is_listening()); - assert(params._max_client_count > 0); - assert(params._channel_count > 0); - assert(params._listen_port != 0); - assert(params._initialize_client_function != nullptr); - - Info("Listening on port " + std::to_string(params._listen_port)); - - _should_exit_thread = false; - _thread = std::make_unique(&server::run_in_thread, this, params); - } - - void stop_listening() { - if (_thread != nullptr) { - _should_exit_thread = true; - _thread->join(); - _thread.release(); - } - - destroy_all_queued_packets(); - destroy_all_queued_events(); - delete_all_connected_clients(); - } - - /* - * void send_queued_packets_in_thread() { - if (!_packet_queue.empty()) { - std::lock_guard lock(_packet_queue_mutex); - while (!_packet_queue.empty()) { - auto qp = _packet_queue.front(); - _packet_queue.pop(); - - auto pi = _thread_peer_map.find(qp._client_id); - if (pi != _thread_peer_map.end()) { - - //enet_peer_send fails if state not connected. was getting random asserts on peers disconnecting and going into ENET_PEER_STATE_ZOMBIE. - if (pi->second->state == ENET_PEER_STATE_CONNECTED) { - - if (enet_peer_send(pi->second, qp._channel_id, qp._packet) != 0) { - Debug("enet_peer_send failed"); - } - - if (qp._packet->referenceCount == 0) { - enet_packet_destroy(qp._packet); - } - } - } - } - } - } - * - */ - - void send_packet(uint16_t client_id, uint8_t channel_id, ENetPacket* packet) { - auto pi = _thread_peer_map.find(client_id); - if (pi != _thread_peer_map.end()) { - if (enet_peer_send(pi->second, channel_id, packet) != 0) { - Debug("enet_peer_send failed"); - } - } - } - - void send_packet_to(unsigned int client_id, enet_uint8 channel_id, const enet_uint8* data, size_t data_size, enet_uint32 flags) { - assert(is_listening()); - if (_thread != nullptr) { - std::lock_guard lock(_packet_queue_mutex); - auto packet = enet_packet_create(data, data_size, flags); - _packet_queue.emplace(channel_id, packet, client_id); - } - } - - void send_packet_to_all_if(enet_uint8 channel_id, const enet_uint8* data, size_t data_size, enet_uint32 flags, std::function predicate) { - assert(is_listening()); - if (_thread != nullptr) { - std::lock_guard lock(_packet_queue_mutex); - auto packet = enet_packet_create(data, data_size, flags); - for (auto c : _connected_clients) { - if (predicate(*c)) { - _packet_queue.emplace(channel_id, packet, c->getId()); - } - } - } - } - - void consume_events( - std::function on_client_connected, - std::function on_client_disconnected, - std::function on_client_data_received) { - - if (!_event_queue.empty()) { - - { - std::lock_guard lock(_event_queue_mutex); - assert(_event_queue_copy.empty()); - _event_queue_copy = _event_queue; - _event_queue = {}; - } - - while (!_event_queue_copy.empty()) { - auto& e = _event_queue_copy.front(); - switch (e._event_type) { - case ENET_EVENT_TYPE_CONNECT: { - _connected_clients.push_back(e._client); - on_client_connected(*e._client); - break; - } - - case ENET_EVENT_TYPE_DISCONNECT: { - auto iter = std::find(_connected_clients.begin(), _connected_clients.end(), e._client); - assert(iter != _connected_clients.end()); - unsigned int client_id = e._client->getId(); - on_client_disconnected(*e._client, client_id); - _connected_clients.erase(iter); - delete e._client; - break; - } - - case ENET_EVENT_TYPE_RECEIVE: { - on_client_data_received(*e._client, e._packet->data, e._packet->dataLength); - enet_packet_destroy(e._packet); - break; - } - - case ENET_EVENT_TYPE_NONE: - default: - assert(false); - break; - } - _event_queue_copy.pop(); - } - } - } - - const client_ptr_vector& get_connected_clients() const { - return _connected_clients; - } - -/// ====================== Могут быть проблемы ================== - void disconnect_leter(uint16_t id, uint32_t reason) { - auto iter = _thread_peer_map.find(id); - if (iter != _thread_peer_map.end()) { - Err("{} not found", id); - return; - } - enet_peer_disconnect_later(iter->second, reason); - iter->second->data = nullptr; - _thread_peer_map.erase(iter->first); - - std::lock_guard lock(_event_queue_mutex); - _event_queue.emplace(ENET_EVENT_TYPE_DISCONNECT, 0, nullptr, reinterpret_cast(iter->second->data)); - } - - void disconnect(uint16_t id, uint32_t reason) { - auto iter = _thread_peer_map.find(id); - if (iter != _thread_peer_map.end()) { - Err("{} not found", id); - return; - } - enet_peer_disconnect(iter->second, reason); - iter->second->data = nullptr; - _thread_peer_map.erase(iter->first); - - std::lock_guard lock(_event_queue_mutex); - _event_queue.emplace(ENET_EVENT_TYPE_DISCONNECT, 0, nullptr, reinterpret_cast(iter->second->data)); - } -/// ============================================================== -/* - * - * void handle_disconnect_event_in_thread(const ENetEvent& e) { - auto client = reinterpret_cast(e.peer->data); - if (client != nullptr) { - auto iter = _thread_peer_map.find(client->getId()); - assert(iter != _thread_peer_map.end()); - assert(iter->second == e.peer); - e.peer->data = nullptr; - _thread_peer_map.erase(iter); - - std::lock_guard lock(_event_queue_mutex); - _event_queue.emplace(ENET_EVENT_TYPE_DISCONNECT, 0, nullptr, client); - } - } - * - */ - private: - void run_in_thread(const listen_params_type& params) { - set_current_thread_name("enetpp::server"); - - auto address = params.make_listen_address(); - ENetHost* host = enet_host_create( - &address, - params._max_client_count, - params._channel_count, - params._incoming_bandwidth, - params._outgoing_bandwidth); - if (host == nullptr) { - Debug("enet_host_create failed"); - } - - while (host != nullptr) { - - if (_should_exit_thread) { - disconnect_all_peers_in_thread(); - enet_host_destroy(host); - host = nullptr; - } - - if (host != nullptr) { - send_queued_packets_in_thread(); - capture_events_in_thread(params, host); - } - - std::this_thread::sleep_for(std::chrono::milliseconds(1)); - } - } - - void disconnect_all_peers_in_thread() { - for (auto iter : _thread_peer_map) { - enet_peer_disconnect_now(iter.second, 0); - iter.second->data = nullptr; - } - _thread_peer_map.clear(); - } - - void send_queued_packets_in_thread() { - if (!_packet_queue.empty()) { - std::lock_guard lock(_packet_queue_mutex); - while (!_packet_queue.empty()) { - auto qp = _packet_queue.front(); - _packet_queue.pop(); - - auto pi = _thread_peer_map.find(qp._client_id); - if (pi != _thread_peer_map.end()) { - - //enet_peer_send fails if state not connected. was getting random asserts on peers disconnecting and going into ENET_PEER_STATE_ZOMBIE. - if (pi->second->state == ENET_PEER_STATE_CONNECTED) { - - if (enet_peer_send(pi->second, qp._channel_id, qp._packet) != 0) { - Debug("enet_peer_send failed"); - } - - if (qp._packet->referenceCount == 0) { - enet_packet_destroy(qp._packet); - } - } - } - } - } - } - - void capture_events_in_thread(const listen_params_type& params, ENetHost* host) { - //http://lists.cubik.org/pipermail/enet-discuss/2013-September/002240.html - enet_host_service(host, 0, 5); - - ENetEvent e; - while (enet_host_check_events(host, &e) > 0) { - switch (e.type) { - case ENET_EVENT_TYPE_CONNECT: { - handle_connect_event_in_thread(params, e); - break; - } - - case ENET_EVENT_TYPE_RECEIVE: { - handle_receive_event_in_thread(e); - break; - } - - case ENET_EVENT_TYPE_DISCONNECT: { - handle_disconnect_event_in_thread(e); - break; - } - - case ENET_EVENT_TYPE_NONE: - default: - assert(false); - break; - } - } - } - - void handle_connect_event_in_thread(const listen_params_type& params, const ENetEvent& e) { - enet_uint32 enet_timeout = static_cast(params._peer_timeout.count()); - enet_peer_timeout(e.peer, 0, enet_timeout, enet_timeout); - - char peer_ip[256]; - enet_address_get_host_ip(&e.peer->address, peer_ip, 256); - - //!IMPORTANT! PeerData and it's UID must be created immediately in this worker thread. Otherwise - //there is a chance the first few packets are received on the worker thread when the peer is not - //initialized with data causing them to be discarded. - - auto client = new ClientT(); - params._initialize_client_function(*client, e.peer->incomingPeerID, peer_ip); - - assert(e.peer->data == nullptr); - e.peer->data = client; - - _thread_peer_map[client->getId()] = e.peer; - - { - std::lock_guard lock(_event_queue_mutex); - _event_queue.emplace(ENET_EVENT_TYPE_CONNECT, 0, nullptr, client); - } - } - - void handle_disconnect_event_in_thread(const ENetEvent& e) { - auto client = reinterpret_cast(e.peer->data); - if (client != nullptr) { - auto iter = _thread_peer_map.find(client->getId()); - assert(iter != _thread_peer_map.end()); - assert(iter->second == e.peer); - e.peer->data = nullptr; - _thread_peer_map.erase(iter); - - std::lock_guard lock(_event_queue_mutex); - _event_queue.emplace(ENET_EVENT_TYPE_DISCONNECT, 0, nullptr, client); - } - } - - void handle_receive_event_in_thread(const ENetEvent& e) { - auto client = reinterpret_cast(e.peer->data); - if (client != nullptr) { - std::lock_guard lock(_event_queue_mutex); - _event_queue.emplace(ENET_EVENT_TYPE_RECEIVE, e.channelID, e.packet, client); - } - } - - void destroy_all_queued_packets() { - std::lock_guard lock(_packet_queue_mutex); - while (!_packet_queue.empty()) { - enet_packet_destroy(_packet_queue.front()._packet); - _packet_queue.pop(); - } - } - - void destroy_all_queued_events() { - std::lock_guard lock(_event_queue_mutex); - while (!_event_queue.empty()) { - destroy_unhandled_event_data(_event_queue.front()); - _event_queue.pop(); - } - } - - void delete_all_connected_clients() { - for (auto c : _connected_clients) { - delete c; - } - _connected_clients.clear(); - } - - void destroy_unhandled_event_data(event_type& e) { - if (e._event_type == ENET_EVENT_TYPE_CONNECT) { - delete e._client; - } - else if (e._event_type == ENET_EVENT_TYPE_RECEIVE) { - enet_packet_destroy(e._packet); - } - } - - void trace(const std::string& s) { - if (_trace_handler != nullptr) { - _trace_handler(s); - } - } - - }; - -} - -#endif \ No newline at end of file diff --git a/disasterserver/Core/ENet/server_event.h b/disasterserver/Core/ENet/server_event.h deleted file mode 100644 index 2d90177..0000000 --- a/disasterserver/Core/ENet/server_event.h +++ /dev/null @@ -1,37 +0,0 @@ -#ifndef ENETPP_SERVER_EVENT_H_ -#define ENETPP_SERVER_EVENT_H_ - -#include "enet/enet.h" - -namespace enetpp { - - //server can't use ENetEvent as ENetPeer is not thread safe. Instead track data that is safe. - template - class server_event { - public: - ENetEventType _event_type; - enet_uint8 _channel_id; - ENetPacket* _packet; - ClientT* _client; - ENetEvent _event; - uint16_t incomingPeerID; - - public: - server_event() - : _event_type(ENET_EVENT_TYPE_NONE) - , _channel_id(0) - , _packet(nullptr) - , _client(nullptr) { - } - - server_event(ENetEventType event_type, enet_uint8 channel_id, ENetPacket* packet, ClientT* client) - : _event_type(event_type) - , _channel_id(channel_id) - , _packet(packet) - , _client(client) { - } - }; - -} - -#endif diff --git a/disasterserver/Core/ENet/server_listen_params.h b/disasterserver/Core/ENet/server_listen_params.h deleted file mode 100644 index 6df24c1..0000000 --- a/disasterserver/Core/ENet/server_listen_params.h +++ /dev/null @@ -1,78 +0,0 @@ -#ifndef ENETPP_SERVER_LISTEN_PARAMS_H_ -#define ENETPP_SERVER_LISTEN_PARAMS_H_ - -#include "enet/enet.h" -#include -#include - -namespace enetpp { - - template - class server_listen_params { - public: - using initialize_client_function = std::function; - - public: - size_t _max_client_count; - size_t _channel_count; - enet_uint32 _incoming_bandwidth; - enet_uint32 _outgoing_bandwidth; - enet_uint16 _listen_port; - std::chrono::milliseconds _peer_timeout; - initialize_client_function _initialize_client_function; - - public: - server_listen_params() - : _max_client_count(0) - , _channel_count(0) - , _incoming_bandwidth(0) - , _outgoing_bandwidth(0) - , _peer_timeout(0) { - } - - server_listen_params& set_listen_port(enet_uint16 port) { - _listen_port = port; - return *this; - } - - server_listen_params& set_max_client_count(size_t count) { - _max_client_count = count; - return *this; - } - - server_listen_params& set_channel_count(size_t channel_count) { - _channel_count = channel_count; - return *this; - } - - server_listen_params& set_incoming_bandwidth(enet_uint32 bandwidth) { - _incoming_bandwidth = bandwidth; - return *this; - } - - server_listen_params& set_outgoing_bandwidth(enet_uint32 bandwidth) { - _outgoing_bandwidth = bandwidth; - return *this; - } - - server_listen_params& set_peer_timeout(std::chrono::milliseconds timeout) { - _peer_timeout = timeout; - return *this; - } - - server_listen_params& set_initialize_client_function(initialize_client_function f) { - _initialize_client_function = f; - return *this; - } - - ENetAddress make_listen_address() const { - ENetAddress address; - address.host = ENET_HOST_ANY; - address.port = _listen_port; - return address; - } - }; - -} - -#endif diff --git a/disasterserver/Core/ENet/server_queued_packet.h b/disasterserver/Core/ENet/server_queued_packet.h deleted file mode 100644 index 526790b..0000000 --- a/disasterserver/Core/ENet/server_queued_packet.h +++ /dev/null @@ -1,30 +0,0 @@ -#ifndef ENETPP_SERVER_QUEUED_PACKET_H_ -#define ENETPP_SERVER_QUEUED_PACKET_H_ - -#include "enet/enet.h" - -namespace enetpp { - - class server_queued_packet { - public: - enet_uint8 _channel_id; - ENetPacket* _packet; - unsigned int _client_id; - - public: - server_queued_packet() - : _channel_id(0) - , _packet(nullptr) - , _client_id(0) { - } - - server_queued_packet(enet_uint8 channel_id, ENetPacket* packet, unsigned int client_id) - : _channel_id(channel_id) - , _packet(packet) - , _client_id(client_id) { - } - }; - -} - -#endif \ No newline at end of file diff --git a/disasterserver/Core/ENet/set_current_thread_name.h b/disasterserver/Core/ENet/set_current_thread_name.h deleted file mode 100644 index 78211be..0000000 --- a/disasterserver/Core/ENet/set_current_thread_name.h +++ /dev/null @@ -1,46 +0,0 @@ -#ifndef ENETPP_SET_CURRENT_THREAD_NAME_H_ -#define ENETPP_SET_CURRENT_THREAD_NAME_H_ - -#include "enet/enet.h" - -namespace enetpp { - - inline void set_current_thread_name(const char* name) { - -#ifdef _WIN32 - - //https://msdn.microsoft.com/en-us/library/xcb2z8hs.aspx - const DWORD MS_VC_EXCEPTION = 0x406D1388; - - #pragma pack(push,8) - typedef struct tagTHREADNAME_INFO { - DWORD dwType; // Must be 0x1000. - LPCSTR szName; // Pointer to name (in user addr space). - DWORD dwThreadID; // Thread ID (-1=caller thread). - DWORD dwFlags; // Reserved for future use, must be zero. - } THREADNAME_INFO; - #pragma pack(pop) - - THREADNAME_INFO info; - info.dwType = 0x1000; - info.szName = name; - info.dwThreadID = ::GetCurrentThreadId(); - info.dwFlags = 0; - - __try { - RaiseException(MS_VC_EXCEPTION, 0, sizeof(info) / sizeof(ULONG_PTR), (ULONG_PTR*)&info); - } - __except (EXCEPTION_EXECUTE_HANDLER) { - } - -#else - - //todo - unknown platform - -#endif - - } - -} - -#endif diff --git a/disasterserver/Core/ENet/trace_handler.h b/disasterserver/Core/ENet/trace_handler.h deleted file mode 100644 index 45089e9..0000000 --- a/disasterserver/Core/ENet/trace_handler.h +++ /dev/null @@ -1,14 +0,0 @@ -#ifndef ENETPP_TRACE_HANDLER_H_ -#define ENETPP_TRACE_HANDLER_H_ - -#include -#include - -namespace enetpp { - - //!IMPORTANT! handler must be thread safe as trace messages come from worker threads as well. - using trace_handler = std::function; - -} - -#endif diff --git a/disasterserver/Core/Exceptions.hpp b/disasterserver/Core/Exceptions.hpp index f3713dd..dc5b4bb 100644 --- a/disasterserver/Core/Exceptions.hpp +++ b/disasterserver/Core/Exceptions.hpp @@ -5,13 +5,19 @@ namespace DisasterServer { class PacketError : public std::exception { public: - explicit PacketError(std::string& message) : std::exception(message.data()) {} - explicit PacketError(const std::string& message) : std::exception(message.data()) {} + explicit PacketError(std::string message) : message(std::move(message)) {} - template - static PacketError Format(std::string_view fmt, Args&&... args) { - return PacketError(std::vformat(fmt, std::make_format_args(args...))); + const char* what() const noexcept override { + return message.c_str(); } + + template + static PacketError format(std::format_string fmt, Args&&... args) { + return PacketError(std::format(fmt, std::forward(args)...)); + } + + private: + std::string message; }; } diff --git a/disasterserver/Core/Log.cpp b/disasterserver/Core/Log.cpp index 52d1b45..776f359 100644 --- a/disasterserver/Core/Log.cpp +++ b/disasterserver/Core/Log.cpp @@ -156,4 +156,38 @@ void log_fmt(const char* fmt, const char* type, const char* file, int line, ...) #include "Log.hpp" +#include +#include +using namespace DisasterServer; + +void Logger::write(const LogLevel level, std::string_view message, std::source_location &location) { + using namespace std::chrono; + + std::stringstream ss; + + const time_t now = std::time(nullptr); + + std::tm local{}; +#ifdef _WIN32 + localtime_s(&local, &now); +#else + localtime_r(&now, &local); +#endif + + ss << std::put_time(&local, "%d.%m.%Y %T"); + ss << " "; + switch (level) { + case LogLevel::Debug: ss << "[Debug]"; break; + case LogLevel::Info: ss << "[Info]"; break; + case LogLevel::Warning: ss << "[Warn]"; break; + case LogLevel::Error: ss << "[Error]"; break; + } + ss << " "; + ss << "["<< std::this_thread::get_id() << "]"; + ss << " "; + ss << std::format("({}:{})", location.file_name(), location.line()); + ss << " "; + ss << message; + std::cout << ss.str() << std::endl; +} diff --git a/disasterserver/Core/Log.hpp b/disasterserver/Core/Log.hpp index 6c33639..ff15a4e 100644 --- a/disasterserver/Core/Log.hpp +++ b/disasterserver/Core/Log.hpp @@ -1,8 +1,8 @@ #ifndef LOG_HPP #define LOG_HPP -#include #include +#include #include #ifdef true //SYS_USE_SDL2 @@ -33,71 +33,56 @@ #define LOG_RST #endif -enum class LogLevel { - Debug, Info, Warning, Error -}; +namespace DisasterServer +{ + enum class LogLevel { + Debug, Info, Warning, Error + }; -class Logger { - static void write(const LogLevel &level, const std::string &file, int line, const std::string &msg) { - using namespace std::chrono; + class Logger { + static void write(LogLevel level, std::string_view message, std::source_location &location); - std::stringstream ss; - - const time_t time = std::time(nullptr); - ss << std::put_time(std::localtime(&time), "%d.%m.%Y %T"); - ss << " "; - switch (level) { - case LogLevel::Debug: ss << "[Debug]"; break; - case LogLevel::Info: ss << "[Info]"; break; - case LogLevel::Warning: ss << "[Warn]"; break; - case LogLevel::Error: ss << "[Error]"; break; + template + static void log(LogLevel level, std::source_location location, std::format_string fmt, Args&&... args) { + write(level, std::format(fmt, std::forward(args)...), location); } - ss << " "; - ss << "["<< std::this_thread::get_id() << "]"; - ss << " "; - ss << std::format("({}:{})", file, line); - ss << " "; - ss << msg; - std::cout << ss.str() << std::endl; - } -public: - template - static void PrintLog(LogLevel level, const std::string &file, const int line, std::string_view fmt, Types&&... args) { - write(level, file, line, std::vformat(fmt, std::make_format_args(args...))); - } - template - static void Debug(const std::string &file, const int line, std::string_view fmt, Types&&... args) { + public: + + template + static void debug(std::source_location location, std::format_string fmt, Args&&... args) { #ifdef _DEBUG - PrintLog(LogLevel::Debug, file, line, fmt, std::forward(args)...); + log(LogLevel::Debug, location, fmt, std::forward(args)...); #endif - } - - template - static void Info(const std::string &file, const int line, std::string_view fmt, Types&&... args) { - PrintLog(LogLevel::Info, file, line, fmt, std::forward(args)...); - } + } - template - static void Warning(const std::string &file, const int line, std::string_view fmt, Types&&... args) { - PrintLog(LogLevel::Warning, file, line, fmt, std::forward(args)...); - } + template + static void info(std::source_location location, std::format_string fmt, Args&&... args) { + log(LogLevel::Info, location, fmt, std::forward(args)...); + } - template - static void Error(const std::string &file, const int line, std::string_view fmt, Types&&... args) { - PrintLog(LogLevel::Error, file, line, fmt, std::forward(args)...); - } -}; + template + static void warning(std::source_location location, std::format_string fmt, Args&&... args) { + log(LogLevel::Warning, location, fmt, std::forward(args)...); + } -#define Log(type, fmt, ...) Logger::PrintLog(type, __FILE__, __LINE__, fmt, ##__VA_ARGS__) + template + static void error(std::source_location location, std::format_string fmt, Args&&... args) { + log(LogLevel::Error, location, fmt, std::forward(args)...); + } + }; -#define Debug(fmt, ...) Logger::Debug(__FILE__, __LINE__, fmt, ##__VA_ARGS__) -#define Info(fmt, ...) Logger::Info(__FILE__, __LINE__, fmt, ##__VA_ARGS__) -#define Warn(fmt, ...) Logger::Warning(__FILE__, __LINE__, fmt, ##__VA_ARGS__) -#define Err(fmt, ...) Logger::Error(__FILE__, __LINE__, fmt, ##__VA_ARGS__) + constexpr std::string_view BoolStringify(bool value) { + return value ? "true" : "false"; + } +} #define RAssert(x) if (!(x)) { Err("RAssert({}) failed!", #x); return false; } #define RAssertEx(x) if (!(x)) { Err("RAssert({}) failed!", #x); } -#define BoolStringify(bool) (bool ? "true" : "false") + +#define Info(fmt, ...) DisasterServer::Logger::info(std::source_location::current(), fmt, ##__VA_ARGS__) +#define Warn(fmt, ...) DisasterServer::Logger::warning(std::source_location::current(), fmt, ##__VA_ARGS__) +#define Err(fmt, ...) DisasterServer::Logger::error(std::source_location::current(), fmt, ##__VA_ARGS__) +#define Debug(fmt, ...) DisasterServer::Logger::debug(std::source_location::current(), fmt, ##__VA_ARGS__) #endif //LOG_HPP diff --git a/disasterserver/Core/Packet.cpp b/disasterserver/Core/Packet.cpp index 91374df..26ba4d3 100644 --- a/disasterserver/Core/Packet.cpp +++ b/disasterserver/Core/Packet.cpp @@ -21,27 +21,25 @@ using namespace DisasterServer; Packet::Packet(ENetPacket *packet) : buffer({}) { if (!packet) { - throw std::invalid_argument("Packet is null"); + throw PacketError::format("Packet is null"); } if (packet->dataLength > buffer.size()) { enet_packet_destroy(packet); - throw PacketError::Format("Packet is too large"); + throw PacketError::format("Packet is too large {} bytes", packet->dataLength); } - len = std::min(static_cast(packet->dataLength), buffer.size()); + len = packet->dataLength; std::memcpy(buffer.data(), packet->data, len); enet_packet_destroy(packet); if (len < 2) { - throw std::runtime_error("Packet is too small"); + throw PacketError::format("Packet is too small"); } read(); - const auto rawType = read(); - - type = static_cast(rawType); + type = static_cast(read()); } Packet::Packet(PacketType type) : buffer({}), type(type) { @@ -63,12 +61,12 @@ std::string Packet::readString() { result += c; } - throw PacketError::Format("Unterminated string"); + throw PacketError::format("Unterminated string"); } void Packet::writeString(const std::string &value) { - if (position > PACKET_MAXSIZE || value.size() > PACKET_MAXSIZE - position - 1) { - throw std::runtime_error("String is too long"); + if (position >= buffer.size() || value.size() >= buffer.size() - position) { + throw PacketError::format("String is too long: {} bytes", value.size()); } for (unsigned char c : value) { @@ -91,17 +89,7 @@ bool Packet::send(Client &client, bool reliable) { return false; } - const int result = enet_peer_send( - client.getPeer(), - reliable ? 0 : 1, - pack - ); - - if (result != 0) { - return false; - } - - return true; + return enet_peer_send(client.getPeer(), reliable ? 0 : 1, pack) == 0; } void Packet::sendBroadcast(Server &server, bool reliable, std::function predicate) { diff --git a/disasterserver/Core/Packet.hpp b/disasterserver/Core/Packet.hpp index ec7dd2b..71dd8b5 100644 --- a/disasterserver/Core/Packet.hpp +++ b/disasterserver/Core/Packet.hpp @@ -4,11 +4,12 @@ #include #include +#include #include #include +#include "Log.hpp" #include "enet/enet.h" -#include "ENet/server.h" enum class PacketType : uint8_t { diff --git a/disasterserver/Core/Singleton.hpp b/disasterserver/Core/Singleton.hpp index 5090c55..edd680c 100644 --- a/disasterserver/Core/Singleton.hpp +++ b/disasterserver/Core/Singleton.hpp @@ -1,26 +1,22 @@ #ifndef SINGLETON_HPP #define SINGLETON_HPP -#include -// https://de.wikibooks.org/wiki/C%2B%2B-Programmierung:_Entwurfsmuster:_Singleton template class Singleton { public: - static C* getInstance() + Singleton(const Singleton&) = delete; + Singleton& operator=(const Singleton&) = delete; + + static C& getInstance() { - if (!_instance) - _instance = new C (); - return _instance; - } - virtual ~Singleton () { - _instance = nullptr; + static C instance; + return instance; } -private: - static C* _instance; + protected: - Singleton () = default; + Singleton() = default; + ~Singleton() = default; }; -template C* Singleton ::_instance = nullptr; #endif //SINGLETON_HPP diff --git a/disasterserver/Core/Util.hpp b/disasterserver/Core/Util.hpp deleted file mode 100644 index c464734..0000000 --- a/disasterserver/Core/Util.hpp +++ /dev/null @@ -1,7 +0,0 @@ -#ifndef DISASTERSERVER_UTIL_HPP -#define DISASTERSERVER_UTIL_HPP - -#include "Server.hpp" - - -#endif //DISASTERSERVER_UTIL_HPP diff --git a/disasterserver/StateManager.cpp b/disasterserver/GameStateController.cpp similarity index 79% rename from disasterserver/StateManager.cpp rename to disasterserver/GameStateController.cpp index d209e16..158e7d5 100644 --- a/disasterserver/StateManager.cpp +++ b/disasterserver/GameStateController.cpp @@ -1,14 +1,14 @@ -#include "StateManager.hpp" +#include "GameStateController.hpp" #include "Server.hpp" using namespace DisasterServer; -StateManager::StateManager(Server *server) : server(server), lobby(server, this) { +GameStateController::GameStateController(Server *server) : server(server), lobby(server, this) { } -StateManager::~StateManager() = default; +GameStateController::~GameStateController() = default; -bool StateManager::state_joined(Client &peer) { +bool GameStateController::playerJoined(Client &peer) { Packet packet(PacketType::SERVER_LOBBY_EXE_CHANCE); packet.write(peer.getExeChance()); packet.send(peer, true); @@ -38,7 +38,7 @@ bool StateManager::state_joined(Client &peer) { return true; } -void StateManager::state_tick() { +void GameStateController::tick() { switch (state) { case States::LOBBY: @@ -57,7 +57,7 @@ void StateManager::state_tick() { } } -bool StateManager::state_handle(Client &peer, Packet &packet) { +bool GameStateController::handle(Client &peer, Packet &packet) { switch (state) { case States::LOBBY: @@ -78,10 +78,6 @@ bool StateManager::state_handle(Client &peer, Packet &packet) { return true; } -void StateManager::setState(States state) { - this->state = state; -} - -void StateManager::state_left(Client &peer) { +void GameStateController::playerLeft(Client &peer) { } diff --git a/disasterserver/GameStateController.hpp b/disasterserver/GameStateController.hpp new file mode 100644 index 0000000..d6c1ae0 --- /dev/null +++ b/disasterserver/GameStateController.hpp @@ -0,0 +1,38 @@ +#ifndef DISASTERSERVER_STATEMACHINE_HPP +#define DISASTERSERVER_STATEMACHINE_HPP + +#include "Core/Packet.hpp" +#include "States/LobbyState.hpp" + +namespace DisasterServer +{ + class Client; + + enum class States { + LOBBY, + MAPVOTE, + CHARSELECT, + GAME, + RESULTS + }; + + class GameStateController { + Server *server = nullptr; + States state = States::LOBBY; + + LobbyState lobby; + public: + explicit GameStateController(Server *server); + ~GameStateController(); + + bool playerJoined(Client &peer); + void playerLeft(Client &peer); + void tick(); + bool handle(Client &peer, Packet &packet); + + States getCurrentState() const { return this->state; } + void setState(States state) { this->state = state; }; + }; +} + +#endif //DISASTERSERVER_STATEMACHINE_HPP diff --git a/disasterserver/Server.cpp b/disasterserver/Server.cpp index 54c41cf..d0f267c 100644 --- a/disasterserver/Server.cpp +++ b/disasterserver/Server.cpp @@ -6,7 +6,7 @@ #include "Core/Log.hpp" #include "Core/Time.hpp" -#include "StateManager.hpp" +#include "GameStateController.hpp" using namespace DisasterServer; @@ -120,7 +120,7 @@ void Server::initialize() { } if (client->isVerified()) { - stateManager.state_left(*client); + stateManager.playerLeft(*client); } ev.peer->data = nullptr; @@ -146,21 +146,20 @@ void Server::initialize() { break; } - switch (static_cast(ev.packet->data[1])) { - case PacketType::IDENTITY: { - Packet packet(ev.packet); - if (!client->identity(packet)) { - Debug("Identity failed for id {}", client->getId()); - } - break; - } - default: { - Packet packet(ev.packet); - client->message_received(packet); - break; - } + if (ev.packet->dataLength < 2) { + enet_packet_destroy(ev.packet); + break; } + Packet packet(ev.packet); + + if (packet.getPacketType() == PacketType::IDENTITY) { + if (!client->identity(packet)) { + Debug("Identity failed for id {}", client->getId()); + } + } else { + client->message_received(packet); + } break; } @@ -172,10 +171,10 @@ void Server::initialize() { while (next_tick < now) { next_tick += TARGET_FPS; - stateManager.state_tick(); + stateManager.tick(); // Heartbeat - if (peers.empty()) { + if (peers.size() > 0) { Packet pack(PacketType::SERVER_HEARTBEAT); if (heartbeat >= (TICKSPERSEC * 2)) { @@ -201,7 +200,7 @@ void Server::disconnect_by_id(const uint16_t client_id, DisconnectReason reason, void Server::broadcast_ex(Packet &packet, bool reliable, uint16_t ignore) { Debug("PacketType::{} sending broadcast, ignoring client {}", getPacketTypeName(packet.getPacketType()), ignore); - packet.sendBroadcast(*this, reliable, [ignore](const Client& v) { return v.getId() == ignore; }); + packet.sendBroadcast(*this, reliable, [ignore](const Client& v) { return v.getId() != ignore; }); } void Server::send_message(Client &client, std::string message) { @@ -219,6 +218,6 @@ void Server::send_broadcast_message(uint16_t sender, std::string &message) { packet.sendBroadcast(*this, true); } -StateManager &Server::getStateManager() { +GameStateController &Server::getStateManager() { return stateManager; } \ No newline at end of file diff --git a/disasterserver/Server.hpp b/disasterserver/Server.hpp index bd10209..a0af041 100644 --- a/disasterserver/Server.hpp +++ b/disasterserver/Server.hpp @@ -2,13 +2,13 @@ #define DISASTERSERVER_SERVER_HPP #include "Client.hpp" -#include "StateManager.hpp" +#include "GameStateController.hpp" #define TICKSPERSEC 60 namespace DisasterServer { - class StateManager; + class GameStateController; static constexpr int MAX_PLAYERS = 7; static constexpr int BUILD_VERSION = 1101; static constexpr int BASE_SERVER_PORT = 8606; @@ -22,7 +22,7 @@ namespace DisasterServer ENetHost *host = nullptr; std::vector> peers; - StateManager stateManager; + GameStateController stateManager; double delta = 0; public: Server(uint16_t n = 0); @@ -37,7 +37,7 @@ namespace DisasterServer void broadcast_ex(Packet &packet, bool reliable, uint16_t ignore); std::vector> &getPeers() { return peers; } - StateManager &getStateManager(); + GameStateController &getStateManager(); double getDelta() { return delta; diff --git a/disasterserver/StateManager.hpp b/disasterserver/StateManager.hpp deleted file mode 100644 index df36bff..0000000 --- a/disasterserver/StateManager.hpp +++ /dev/null @@ -1,42 +0,0 @@ -#ifndef DISASTERSERVER_STATEMACHINE_HPP -#define DISASTERSERVER_STATEMACHINE_HPP - -#include "Core/Packet.hpp" -#include "States/Lobby.hpp" - -namespace DisasterServer -{ - class Client; - - enum class States { - LOBBY, - MAPVOTE, - CHARSELECT, - GAME, - RESULTS - }; - - class StateManager { - Server *server = nullptr; - States state = States::LOBBY; - - Lobby lobby; - public: - explicit StateManager(Server *server); - ~StateManager(); - - bool state_joined(Client &peer); - void state_tick(); - bool state_handle(Client &peer, Packet &packet); - - [[nodiscard]] States getCurrentState() const { return this->state; } - - void setState(States state); - - void state_left(Client &peer); - - - }; -} - -#endif //DISASTERSERVER_STATEMACHINE_HPP diff --git a/disasterserver/States/Lobby.cpp b/disasterserver/States/LobbyState.cpp similarity index 92% rename from disasterserver/States/Lobby.cpp rename to disasterserver/States/LobbyState.cpp index 52e8176..e4e9d25 100644 --- a/disasterserver/States/Lobby.cpp +++ b/disasterserver/States/LobbyState.cpp @@ -1,16 +1,16 @@ -#include "Lobby.hpp" +#include "LobbyState.hpp" #include "Server.hpp" -#include "StateManager.hpp" +#include "GameStateController.hpp" using namespace DisasterServer; -Lobby::Lobby(Server *server, StateManager *stateManager) : server(server), stateManager(stateManager) { +LobbyState::LobbyState(Server *server, GameStateController *stateManager) : server(server), stateManager(stateManager) { } -Lobby::~Lobby() = default; +LobbyState::~LobbyState() = default; -bool Lobby::init() { +bool LobbyState::init() { for (auto &peer : server->getPeers()) { peer->setReady(false); peer->setVoted(false); @@ -46,11 +46,11 @@ bool Lobby::init() { return true; } -bool Lobby::joined(Client &peer) { +bool LobbyState::joined(Client &peer) { return true; } -bool Lobby::tick() { +bool LobbyState::tick() { switch (stateManager->getCurrentState()) { case States::LOBBY: { for (auto &peer : server->getPeers()) { @@ -98,7 +98,7 @@ bool Lobby::tick() { return true; } -bool Lobby::handle(Client &client, Packet &packet) { +bool LobbyState::handle(Client &client, Packet &packet) { switch (packet.getPacketType()) { default: break; diff --git a/disasterserver/States/Lobby.hpp b/disasterserver/States/LobbyState.hpp similarity index 78% rename from disasterserver/States/Lobby.hpp rename to disasterserver/States/LobbyState.hpp index 0236eed..3a439b5 100644 --- a/disasterserver/States/Lobby.hpp +++ b/disasterserver/States/LobbyState.hpp @@ -11,11 +11,11 @@ namespace DisasterServer { - class StateManager; + class GameStateController; - class Lobby { + class LobbyState { Server *server = nullptr; - StateManager *stateManager = nullptr; + GameStateController *stateManager = nullptr; double countdown = 0; double prac_countdown = 0; @@ -31,8 +31,8 @@ namespace DisasterServer uint16_t exe = 0; std::unordered_map avail; public: - explicit Lobby(Server *server, StateManager *stateManager); - ~Lobby(); + explicit LobbyState(Server *server, GameStateController *stateManager); + ~LobbyState(); bool init(); bool joined(Client &peer); From 159ee6442fd0550577920670ea3c2f4cee3d1dc3 Mon Sep 17 00:00:00 2001 From: MilesGlitch Date: Mon, 7 Sep 2026 12:10:19 +0300 Subject: [PATCH 14/61] refactoring --- disasterserver/Client.cpp | 34 +++++----- disasterserver/Client.hpp | 40 ++++++------ disasterserver/Core/Colors.hpp | 15 +++++ disasterserver/Core/Log.cpp | 12 ++-- disasterserver/Core/Log.hpp | 38 +++++++++++ disasterserver/Core/Packet.cpp | 7 ++- disasterserver/GameStateController.cpp | 80 +++++++++++++++++++++-- disasterserver/Main.cpp | 10 +++ disasterserver/Server.cpp | 4 +- disasterserver/Server.hpp | 10 +++ disasterserver/States/LobbyState.cpp | 87 ++++++++++++++++++++------ disasterserver/States/LobbyState.hpp | 4 ++ 12 files changed, 271 insertions(+), 70 deletions(-) create mode 100644 disasterserver/Core/Colors.hpp diff --git a/disasterserver/Client.cpp b/disasterserver/Client.cpp index 107a655..417b31c 100644 --- a/disasterserver/Client.cpp +++ b/disasterserver/Client.cpp @@ -1,14 +1,16 @@ #include "Client.hpp" +#include + #include "Server.hpp" #include "Core/Log.hpp" #include "Core/Packet.hpp" using namespace DisasterServer; -Client::Client(Server *server, ENetPeer *peer, uint16_t incomingPeerID, const std::string &ip) : +Client::Client(Server *server, ENetPeer *peer, uint16_t incomingPeerID, std::string ip) : id(incomingPeerID), - ip(ip), + ip(std::move(ip)), peer(peer), server(server) {} @@ -17,6 +19,11 @@ Client::~Client() = default; bool Client::identity(Packet &packet) { RAssert(id > 0); + if (packet.getPacketType() != PacketType::IDENTITY) { + this->disconnect(DisconnectReason::OTHER, "type != IDENTITY?"); + return false; + } + bool isBanned = false; uint64_t timeout = 0; @@ -43,11 +50,6 @@ bool Client::identity(Packet &packet) { return false; } - if (packet.getPacketType() != PacketType::IDENTITY) { - this->disconnect(DisconnectReason::OTHER, "type != IDENTITY?"); - return false; - } - if (build_version != BUILD_VERSION) { this->disconnect(DisconnectReason::VERMISMATCH); return false; @@ -58,7 +60,7 @@ bool Client::identity(Packet &packet) { return false; } - if (udid.length() <= 0) { + if (udid.empty()) { this->disconnect(DisconnectReason::OTHER, "whoops you have to put the CD in you conputer"); return false; } @@ -106,10 +108,10 @@ bool Client::identity_process(const std::string &addr, bool is_banned, uint64_t return false; } - Packet identityResponse(PacketType::SERVER_IDENTITY_RESPONSE); - identityResponse.write(server->getStateManager().getCurrentState() == States::LOBBY); - identityResponse.write(id); - identityResponse.send(*this, true); + Packet packet(PacketType::SERVER_IDENTITY_RESPONSE); + packet.write(server->getStateManager().getCurrentState() == States::LOBBY); + packet.write(id); + packet.send(*this, true); // If in queue, do following if (!in_game) { @@ -145,7 +147,7 @@ bool Client::identity_process(const std::string &addr, bool is_banned, uint64_t pack.write(lobby_icon); this->server->broadcast_ex(pack, true, id); - this->server->send_message(*this, std::format("|build from &{} @{}~", __DATE__, __TIME__)); + this->server->send_message(*this, "|build from &{} @{}~", __DATE__, __TIME__); this->server->send_message(*this, "|type .help for command list~"); } @@ -157,11 +159,7 @@ bool Client::message_received(Packet &packet) { return false; } - bool result; - - result = this->server->getStateManager().handle(*this, packet); - - return result; + return this->server->getStateManager().handle(*this, packet); } void Client::disconnect(DisconnectReason reason, const std::string &message) { diff --git a/disasterserver/Client.hpp b/disasterserver/Client.hpp index 45bc940..01c2500 100644 --- a/disasterserver/Client.hpp +++ b/disasterserver/Client.hpp @@ -8,23 +8,23 @@ namespace DisasterServer class Server; enum class SurvCharacters { - CH_NONE = -1, - - CH_TAILS, - CH_KNUX, - CH_EGGMAN, - CH_AMY, - CH_CREAM, - CH_SALLY + NONE = -1, + + TAILS, + KNUX, + EGGMAN, + AMY, + CREAM, + SALLY }; enum class ExesCharacters { - EX_NONE = -1, + NONE = -1, - EX_ORIGINAL, - EX_CHAOS, - EX_EXETIOR, - EX_EXELLER + ORIGINAL, + CHAOS, + EXETIOR, + EXELLER }; enum class DisconnectReason @@ -59,10 +59,10 @@ namespace DisasterServer case DisconnectReason::LOBBYFULL: return "LOBBY FULL"; case DisconnectReason::RATELIMITED: return "RATE LIMITED"; case DisconnectReason::SHUTDOWN: return "SHUTDOWN"; - case DisconnectReason::IPINUSE: return "IPINUSE"; + case DisconnectReason::IPINUSE: return "IP IN USE"; case DisconnectReason::DONTREPORT: return "DONT REPORT"; case DisconnectReason::OTHER: return "OTHER"; - default: return ""; + default: return ""; } } @@ -73,7 +73,7 @@ namespace DisasterServer /* General info */ //Player plr; - std::string nickname; + std::string nickname = ""; std::string udid; uint8_t lobby_icon = 0; int8_t pet = -1; @@ -95,8 +95,8 @@ namespace DisasterServer } auth = {}; /* Character */ - SurvCharacters survChar = SurvCharacters::CH_NONE; - ExesCharacters exeChar = ExesCharacters::EX_NONE; + SurvCharacters survChar = SurvCharacters::NONE; + ExesCharacters exeChar = ExesCharacters::NONE; bool should_timeout = false; @@ -107,7 +107,7 @@ namespace DisasterServer Server *server = nullptr; public: - Client(Server *server, ENetPeer *peer, uint16_t incomingPeerID, const std::string &ip); + Client(Server *server, ENetPeer *peer, uint16_t incomingPeerID, std::string ip); ~Client(); uint16_t getId() const { return id; } @@ -137,8 +137,6 @@ namespace DisasterServer void setVoted(bool flag) { voted = flag; } bool isVoted() { return voted; } - - bool identity(Packet &packet); bool identity_process(const std::string & addr, bool is_banned, uint64_t timeout, bool do_timeout); bool message_received(Packet &packet); diff --git a/disasterserver/Core/Colors.hpp b/disasterserver/Core/Colors.hpp new file mode 100644 index 0000000..8eea23b --- /dev/null +++ b/disasterserver/Core/Colors.hpp @@ -0,0 +1,15 @@ +#ifndef DISASTERSERVER_COLORS_HPP +#define DISASTERSERVER_COLORS_HPP + +#include + +constexpr std::string_view CLRCODE_RED = "\\"; +constexpr std::string_view CLRCODE_GRN = "@"; +constexpr std::string_view CLRCODE_PUR = "&"; +constexpr std::string_view CLRCODE_BLU = "/"; +constexpr std::string_view CLRCODE_GRA = "|"; +constexpr std::string_view CLRCODE_YLW = "`"; +constexpr std::string_view CLRCODE_ORG = "\xE2\x84\x96"; +constexpr std::string_view CLRCODE_RST = "~"; + +#endif //DISASTERSERVER_COLORS_HPP diff --git a/disasterserver/Core/Log.cpp b/disasterserver/Core/Log.cpp index 776f359..2741f44 100644 --- a/disasterserver/Core/Log.cpp +++ b/disasterserver/Core/Log.cpp @@ -178,15 +178,15 @@ void Logger::write(const LogLevel level, std::string_view message, std::source_l ss << std::put_time(&local, "%d.%m.%Y %T"); ss << " "; switch (level) { - case LogLevel::Debug: ss << "[Debug]"; break; - case LogLevel::Info: ss << "[Info]"; break; - case LogLevel::Warning: ss << "[Warn]"; break; - case LogLevel::Error: ss << "[Error]"; break; + case LogLevel::Debug: ss << TerminalColors::cyan; ss << "[Debug]"; ss << TerminalColors::reset; break; + case LogLevel::Info: ss << TerminalColors::green; ss << "[Info]"; ss << TerminalColors::reset; break; + case LogLevel::Warning: ss << TerminalColors::yellow; ss << "[Warn]"; ss << TerminalColors::reset; break; + case LogLevel::Error: ss << TerminalColors::light_red; ss << "[Error]"; ss << TerminalColors::reset; break; } ss << " "; - ss << "["<< std::this_thread::get_id() << "]"; + ss << TerminalColors::light_gray; ss << "["<< std::this_thread::get_id() << "]"; ss << " "; - ss << std::format("({}:{})", location.file_name(), location.line()); + ss << std::format("({}:{})", location.file_name(), location.line()); ss << TerminalColors::reset; ss << " "; ss << message; std::cout << ss.str() << std::endl; diff --git a/disasterserver/Core/Log.hpp b/disasterserver/Core/Log.hpp index ff15a4e..02df25b 100644 --- a/disasterserver/Core/Log.hpp +++ b/disasterserver/Core/Log.hpp @@ -35,6 +35,44 @@ namespace DisasterServer { + namespace TerminalColors { + constexpr std::string_view reset = "\x1b[0m"; + constexpr std::string_view bright = "\x1b[1m"; + constexpr std::string_view dim = "\x1b[2m"; + constexpr std::string_view underscore = "\x1b[4m"; + constexpr std::string_view blink = "\x1b[5m"; + constexpr std::string_view reverse = "\x1b[7m"; + constexpr std::string_view hidden = "\x1b[8m"; + + constexpr std::string_view black = "\x1b[30m"; + constexpr std::string_view red = "\x1b[31m"; + constexpr std::string_view green = "\x1b[32m"; + constexpr std::string_view yellow = "\x1b[33m"; + constexpr std::string_view blue = "\x1b[34m"; + constexpr std::string_view magenta = "\x1b[35m"; + constexpr std::string_view cyan = "\x1b[36m"; + constexpr std::string_view white = "\x1b[37m"; + constexpr std::string_view standard = "\x1b[39m"; + constexpr std::string_view light_gray = "\x1b[90m"; + constexpr std::string_view light_red = "\x1b[91m"; + constexpr std::string_view light_green = "\x1b[92m"; + constexpr std::string_view light_yellow = "\x1b[93m"; + constexpr std::string_view light_blue = "\x1b[94m"; + constexpr std::string_view light_magenta = "\x1b[95m"; + constexpr std::string_view light_cyan = "\x1b[96m"; + constexpr std::string_view light_white = "\x1b[97m"; + + + constexpr std::string_view bg_black = "\x1b[40m"; + constexpr std::string_view bg_red = "\x1b[41m"; + constexpr std::string_view bg_green = "\x1b[42m"; + constexpr std::string_view bg_yellow = "\x1b[43m"; + constexpr std::string_view bg_blue = "\x1b[44m"; + constexpr std::string_view bg_magenta = "\x1b[45m"; + constexpr std::string_view bg_cyan = "\x1b[46m"; + constexpr std::string_view bg_white = "\x1b[47m"; + } + enum class LogLevel { Debug, Info, Warning, Error }; diff --git a/disasterserver/Core/Packet.cpp b/disasterserver/Core/Packet.cpp index 26ba4d3..8ded4f5 100644 --- a/disasterserver/Core/Packet.cpp +++ b/disasterserver/Core/Packet.cpp @@ -40,11 +40,16 @@ Packet::Packet(ENetPacket *packet) : buffer({}) { read(); type = static_cast(read()); + + Debug("Packet received PacketType::{}", getPacketTypeName(type)); } Packet::Packet(PacketType type) : buffer({}), type(type) { write(0); write(static_cast(type)); + if (type != PacketType::SERVER_HEARTBEAT) { + Debug("Packet created PacketType::{}", getPacketTypeName(type)); + } } Packet::~Packet() = default; @@ -80,7 +85,7 @@ bool Packet::send(Client &client, bool reliable) { if(client.isDisconnecting()) return true; - Debug("PacketType::{} sending to {}", getPacketTypeName(type), client.getId()); + Debug("PacketType::{} sending to {} (id {})", getPacketTypeName(type), client.getNickname(), client.getId()); ENetPacket* pack = enet_packet_create(buffer.data(), len, reliable ? ENET_PACKET_FLAG_RELIABLE : 0); diff --git a/disasterserver/GameStateController.cpp b/disasterserver/GameStateController.cpp index 158e7d5..bce9089 100644 --- a/disasterserver/GameStateController.cpp +++ b/disasterserver/GameStateController.cpp @@ -1,6 +1,8 @@ #include "GameStateController.hpp" #include "Server.hpp" +#include "Core/Colors.hpp" + using namespace DisasterServer; GameStateController::GameStateController(Server *server) : server(server), lobby(server, this) { @@ -38,6 +40,30 @@ bool GameStateController::playerJoined(Client &peer) { return true; } +void GameStateController::playerLeft(Client &peer) { + Packet packet(PacketType::SERVER_PLAYER_LEFT); + packet.write(peer.getId()); + packet.sendBroadcast(*server, true); + + switch (state) + { + case States::LOBBY: + case States::CHARSELECT: + case States::MAPVOTE: + lobby.leaved(peer); + break; + + case States::GAME: + //game_state_tick(server); + break; + + case States::RESULTS: + //results_state_tick(server); + break; + } +} + + void GameStateController::tick() { switch (state) { @@ -58,7 +84,57 @@ void GameStateController::tick() { } bool GameStateController::handle(Client &peer, Packet &packet) { + switch (packet.getPacketType()) { + case PacketType::CLIENT_LOBBY_CHOOSEBAN: { + if (!peer.isOpped()) { + break; + } + uint16_t pid = packet.read(); + + for (auto &c : server->getPeers()) { + if (c->getId() == pid) { + //TODO: add ban logic + c->disconnect(DisconnectReason::BANNEDBYHOST); + } + } + + break; + } + case PacketType::CLIENT_LOBBY_CHOOSEKICK: { + if (!peer.isOpped()) { + break; + } + + uint16_t pid = packet.read(); + + for (auto &c : server->getPeers()) { + if (c->getId() == pid) { + //TODO: add kick logic + c->disconnect(DisconnectReason::KICKEDBYHOST); + } + } + + break; + } + case PacketType::CLIENT_LOBBY_CHOOSEOP: { + if (!peer.isOpped()) { + break; + } + + uint16_t pid = packet.read(); + + for (auto &c : server->getPeers()) { + if (c->getId() == pid) { + //TODO: add operator logic + server->send_message(peer, "{}you're an operator now", CLRCODE_GRN); + } + } + + break; + } + default: break; + } switch (state) { case States::LOBBY: case States::CHARSELECT: @@ -77,7 +153,3 @@ bool GameStateController::handle(Client &peer, Packet &packet) { return true; } - -void GameStateController::playerLeft(Client &peer) { - -} diff --git a/disasterserver/Main.cpp b/disasterserver/Main.cpp index d3ff807..78289c2 100644 --- a/disasterserver/Main.cpp +++ b/disasterserver/Main.cpp @@ -3,6 +3,16 @@ #include "Core/Log.hpp" int main(int argc, char *argv[]) { +#ifdef _WIN32 + HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE); + + DWORD mode = 0; + if (GetConsoleMode(handle, &mode)) { + mode |= ENABLE_VIRTUAL_TERMINAL_PROCESSING; + SetConsoleMode(handle, mode); + } +#endif + try { enet_initialize(); diff --git a/disasterserver/Server.cpp b/disasterserver/Server.cpp index d0f267c..8b20e65 100644 --- a/disasterserver/Server.cpp +++ b/disasterserver/Server.cpp @@ -49,7 +49,7 @@ void Server::initialize() { ev.peer->data = rawClient; peers.push_back(std::move(client)); - Debug("Connection client {}", rawClient->getId()); + Debug("Connection peer id {}", rawClient->getId()); Packet pack(PacketType::SERVER_PREIDENTITY); @@ -179,7 +179,7 @@ void Server::initialize() { if (heartbeat >= (TICKSPERSEC * 2)) { pack.sendBroadcast(*this, true); - Debug("Heartbeat done."); + //Debug("Heartbeat done."); heartbeat = 0; } heartbeat += delta; diff --git a/disasterserver/Server.hpp b/disasterserver/Server.hpp index a0af041..ae25e98 100644 --- a/disasterserver/Server.hpp +++ b/disasterserver/Server.hpp @@ -34,6 +34,16 @@ namespace DisasterServer void send_message(Client &client, std::string message); void send_broadcast_message(uint16_t sender, std::string &message); + template + void send_message(Client &client, std::format_string fmt, Args&&... args) { + send_message(client, std::format(fmt, std::forward(args)...)); + } + + template + void send_broadcast_message(uint16_t sender, std::format_string fmt, Args&&... args) { + send_broadcast_message(sender, std::format(fmt, std::forward(args)...)); + } + void broadcast_ex(Packet &packet, bool reliable, uint16_t ignore); std::vector> &getPeers() { return peers; } diff --git a/disasterserver/States/LobbyState.cpp b/disasterserver/States/LobbyState.cpp index e4e9d25..6f282d5 100644 --- a/disasterserver/States/LobbyState.cpp +++ b/disasterserver/States/LobbyState.cpp @@ -41,7 +41,39 @@ bool LobbyState::init() { prac_countdown = 0; Packet pack(PacketType::SERVER_GAME_BACK_TO_LOBBY); - pack.sendBroadcast(*this->server, true); + pack.sendBroadcast(*server, true); + + return true; +} + +bool LobbyState::sendCountdown() { + Packet pack(PacketType::SERVER_LOBBY_COUNTDOWN); + pack.write(this->countdown_sec < NO_COUNTDOWN); + pack.write(countdown_sec); + pack.sendBroadcast(*server, true); + return true; +} + +bool LobbyState::checkCountdown() { + uint8_t count = 0; + + for (auto &c : server->getPeers()) { + if (c->isReady()) { + count++; + } + } + + Debug("Players isReady {}", count); + + if (count == (server->getPeers().size() > 1)) { + this->countdown = TICKSPERSEC; + this->countdown_sec = COUNTDOWN; + RAssert(sendCountdown()); + } else if (this->countdown_sec != NO_COUNTDOWN) { + this->countdown = TICKSPERSEC; + this->countdown_sec = COUNTDOWN; + RAssert(sendCountdown()); + } return true; } @@ -50,6 +82,14 @@ bool LobbyState::joined(Client &peer) { return true; } +bool LobbyState::leaved(Client &peer) { + if (!peer.isInGame()) { + return true; + } + + return true; +} + bool LobbyState::tick() { switch (stateManager->getCurrentState()) { case States::LOBBY: { @@ -59,10 +99,14 @@ bool LobbyState::tick() { } if (!peer->isReady()) { - /*peer->setTimeout(peer->getTimeout() + server->getDelta()); - if (std::fmod(peer->getTimeout(), 60) == 0) { - Debug("tick for {}: {}", peer->getNickname(), peer->getTimeout() / 60.0f); - }*/ + + //Чтобы не мешалось + /* + peer->setTimeout(peer->getTimeout() + server->getDelta()); + if (std::fmod(peer->getTimeout(), 60) == 0) { + Debug("tick for {}: {}", peer->getNickname(), peer->getTimeout() / 60.0f); + } + */ if (peer->getTimeout() >= 25 * TICKSPERSEC) { peer->disconnect(DisconnectReason::AFKTIMEOUT); @@ -90,6 +134,8 @@ bool LobbyState::tick() { if (--countdown_sec == 0) { return init(); } + + RAssert(sendCountdown()); } countdown_sec -= server->getDelta(); @@ -99,29 +145,31 @@ bool LobbyState::tick() { } bool LobbyState::handle(Client &client, Packet &packet) { - switch (packet.getPacketType()) { - default: - break; + bool result = true; + switch (packet.getPacketType()) { case PacketType::CLIENT_LOBBY_PLAYERS_REQUEST: { - for (auto &value : server->getPeers()) { - if (client.getId() == value->getId()) { + for (auto &c : server->getPeers()) { + if (client.getId() == c->getId()) { continue; } Packet pack(PacketType::SERVER_LOBBY_PLAYER); - pack.write(value->getId()); - pack.write(value->isReady()); - pack.writeString(value->getNickname()); - pack.write(value->getLobbyIcon()); - pack.write(value->getPet()); - server->broadcast_ex(pack, true, client.getId()); + pack.write(c->getId()); + pack.write(c->isReady()); + pack.writeString(c->getNickname()); + pack.write(c->getLobbyIcon()); + pack.write(c->getPet()); + if (!pack.send(client, true)) { + result = false; + break; + } } Packet pack(PacketType::SERVER_LOBBY_CORRECT); pack.send(client, true); - server->send_message(client, std::format("|build from &{} @{}~", __DATE__, __TIME__)); + server->send_message(client, "|build from &{} @{}~", __DATE__, __TIME__); server->send_message(client, "|type .help for command list~"); break; @@ -146,11 +194,14 @@ bool LobbyState::handle(Client &client, Packet &packet) { break; } + case PacketType::CLIENT_LOBBY_CHOOSEVOTEKICK: { uint16_t pid = packet.read(); break; } + + default: break; } - return true; + return result; } diff --git a/disasterserver/States/LobbyState.hpp b/disasterserver/States/LobbyState.hpp index 3a439b5..f49a393 100644 --- a/disasterserver/States/LobbyState.hpp +++ b/disasterserver/States/LobbyState.hpp @@ -35,7 +35,11 @@ namespace DisasterServer ~LobbyState(); bool init(); + + bool sendCountdown(); + bool checkCountdown(); bool joined(Client &peer); + bool leaved(Client &peer); bool tick(); bool handle(Client &client, Packet &packet); }; From 1ebd6e4348a2eae72337f646d5930462cc36b4b7 Mon Sep 17 00:00:00 2001 From: MilesGlitch Date: Mon, 7 Sep 2026 12:45:46 +0300 Subject: [PATCH 15/61] add support utf8 --- disasterserver/CMakeLists.txt | 32 ++++++++++++++++++++++++++++++++ disasterserver/Main.cpp | 5 ++++- 2 files changed, 36 insertions(+), 1 deletion(-) diff --git a/disasterserver/CMakeLists.txt b/disasterserver/CMakeLists.txt index e2c59bb..62d6204 100644 --- a/disasterserver/CMakeLists.txt +++ b/disasterserver/CMakeLists.txt @@ -1,3 +1,32 @@ +set(COMPILER_OPTIONS + $<$: + /utf-8 + /MP + /W4 + /wd4100 # unreferenced formal parameter + /wd4457 # declaration of 'var' hides function parameter + /wd4458 # declaration of 'var' hides class member + /wd4459 # declaration of 'var' hides global declaration + /wd4101 # 'var': unreferenced local variable + /wd4388 # 'token' : signed/unsigned mismatch + /wd4018 # '>': signed/unsigned mismatch + > + $<$>: + -Wall + -Wextra + -Wpedantic + -finput-charset=UTF-8 + -fexec-charset=UTF-8 + > + $<$: + -Wall + -Wextra + -Wpedantic + -finput-charset=UTF-8 + -fexec-charset=UTF-8 + > +) + file(GLOB_RECURSE SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/*.cpp) if(ANDROID) @@ -6,6 +35,7 @@ if(ANDROID) set(THREADS_PREFER_PTHREAD_FLAG ON) find_package(Threads REQUIRED) target_include_directories(DisasterServerCXX PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}) + target_compile_options(DisasterServer PRIVATE ${COMPILER_OPTIONS}) target_link_libraries(DisasterServerCXX PRIVATE cJSON log enet m Threads::Threads) else() if(DYLIB) # Build .dll or .so @@ -19,6 +49,7 @@ else() target_link_libraries(DisasterServerCXX PRIVATE cJSON enet m Threads::Threads) endif() + target_compile_options(DisasterServer PRIVATE ${COMPILER_OPTIONS}) target_include_directories(DisasterServerCXX PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}) else() # Build executable @@ -86,6 +117,7 @@ else() target_link_libraries(DisasterServerCXX PRIVATE cJSON enet m Threads::Threads) endif() + target_compile_options(DisasterServer PRIVATE ${COMPILER_OPTIONS}) target_include_directories(DisasterServerCXX PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}) endif() diff --git a/disasterserver/Main.cpp b/disasterserver/Main.cpp index 78289c2..ef9ffc2 100644 --- a/disasterserver/Main.cpp +++ b/disasterserver/Main.cpp @@ -4,6 +4,9 @@ int main(int argc, char *argv[]) { #ifdef _WIN32 + SetConsoleCP(CP_UTF8); + SetConsoleOutputCP(CP_UTF8); + HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE); DWORD mode = 0; @@ -12,7 +15,7 @@ int main(int argc, char *argv[]) { SetConsoleMode(handle, mode); } #endif - + try { enet_initialize(); From 3342ab9f7ae60274da107e27bee1b4c8f807bff9 Mon Sep 17 00:00:00 2001 From: MilesGlitch Date: Mon, 7 Sep 2026 18:07:14 +0300 Subject: [PATCH 16/61] Update --- disasterserver/Client.cpp | 20 +- disasterserver/Client.hpp | 13 +- disasterserver/Core/Colors.hpp | 3 + disasterserver/GameStateController.cpp | 57 ++++- disasterserver/GameStateController.hpp | 22 +- disasterserver/Server.cpp | 15 +- disasterserver/Server.hpp | 21 +- disasterserver/States/LobbyState.cpp | 300 ++++++++++++++++++++++--- disasterserver/States/LobbyState.hpp | 22 +- disasterserver/States/Vote.cpp | 64 ++++++ disasterserver/States/Vote.hpp | 52 +++++ disasterserver_c/Vote.c | 2 +- 12 files changed, 517 insertions(+), 74 deletions(-) create mode 100644 disasterserver/States/Vote.cpp create mode 100644 disasterserver/States/Vote.hpp diff --git a/disasterserver/Client.cpp b/disasterserver/Client.cpp index 417b31c..22b0c5f 100644 --- a/disasterserver/Client.cpp +++ b/disasterserver/Client.cpp @@ -8,7 +8,7 @@ using namespace DisasterServer; -Client::Client(Server *server, ENetPeer *peer, uint16_t incomingPeerID, std::string ip) : +Client::Client(Server *server, ENetPeer *peer, clientId incomingPeerID, std::string ip) : id(incomingPeerID), ip(std::move(ip)), peer(peer), @@ -42,7 +42,7 @@ bool Client::identity(Packet &packet) { this->lobby_icon = lobby_icon; this->pet = pet; - this->in_game = (server->getStateManager().getCurrentState() == States::LOBBY); + this->in_game = (server->getGameStateController().getCurrentState() == States::LOBBY); this->exe_chance = 1 + rand() % 4; if (this->server->getPeers().size() >= MAX_PLAYERS) { @@ -102,15 +102,15 @@ bool Client::identity_process(const std::string &addr, bool is_banned, uint64_t } } - if (!this->server->getStateManager().playerJoined(*this)) { + if (!this->server->getGameStateController().playerJoined(*this)) { should_timeout = false; this->disconnect(DisconnectReason::OTHER, "Report this to dev: 415 baza otvette, mi tonem"); return false; } Packet packet(PacketType::SERVER_IDENTITY_RESPONSE); - packet.write(server->getStateManager().getCurrentState() == States::LOBBY); - packet.write(id); + packet.write(server->getGameStateController().getCurrentState() == States::LOBBY); + packet.write(id); packet.send(*this, true); // If in queue, do following @@ -123,11 +123,11 @@ bool Client::identity_process(const std::string &addr, bool is_banned, uint64_t } Packet pack(PacketType::SERVER_WAITING_PLAYER_INFO); - pack.write(server->getStateManager().getCurrentState() == States::GAME && client->in_game); - pack.write(client->getId()); + pack.write(server->getGameStateController().getCurrentState() == States::GAME && client->in_game); + pack.write(client->getId()); pack.writeString(nickname); - if (server->getStateManager().getCurrentState() == States::GAME && client->in_game) { + if (server->getGameStateController().getCurrentState() == States::GAME && client->in_game) { pack.write( 0 /* v->server->game.exe == peer->id */ ); pack.write( 0 /* v->server->game.exe == peer->id ? peer->exe_char : peer->surv_char */); @@ -142,7 +142,7 @@ bool Client::identity_process(const std::string &addr, bool is_banned, uint64_t // For other players in queue Packet pack(PacketType::SERVER_WAITING_PLAYER_INFO); pack.write(0); - pack.write(id); + pack.write(id); pack.writeString(nickname); pack.write(lobby_icon); this->server->broadcast_ex(pack, true, id); @@ -159,7 +159,7 @@ bool Client::message_received(Packet &packet) { return false; } - return this->server->getStateManager().handle(*this, packet); + return this->server->getGameStateController().handle(*this, packet); } void Client::disconnect(DisconnectReason reason, const std::string &message) { diff --git a/disasterserver/Client.hpp b/disasterserver/Client.hpp index 01c2500..7ec8283 100644 --- a/disasterserver/Client.hpp +++ b/disasterserver/Client.hpp @@ -66,8 +66,10 @@ namespace DisasterServer } } + using clientId = uint16_t; + class Client { - uint16_t id; + clientId id; std::string ip; ENetPeer *peer; @@ -107,10 +109,10 @@ namespace DisasterServer Server *server = nullptr; public: - Client(Server *server, ENetPeer *peer, uint16_t incomingPeerID, std::string ip); + Client(Server *server, ENetPeer *peer, clientId incomingPeerID, std::string ip); ~Client(); - uint16_t getId() const { return id; } + clientId getId() const { return id; } std::string getIp() const { return ip; } ENetPeer * getPeer() { return peer; } std::string getNickname() { return nickname; } @@ -120,15 +122,18 @@ namespace DisasterServer AuthPeer &getAuthPeer() { return auth; } void setExeChance(uint8_t chance) { exe_chance = chance; } uint8_t getExeChance() { return exe_chance; } + void setTimeout(double value) { timeout = value; } double getTimeout() const { return timeout; } bool isShouldTimeout() { return should_timeout; } bool isDisconnecting() { return disconnecting; } - void setVoteCooldown(double value) { vote_cooldown = value; } double getVoteCooldown() { return vote_cooldown; } void setInGame(bool flag) { in_game = flag; } bool isInGame() { return in_game; } + void setCanVote(bool flag) { can_vote = flag; } + bool isCanVote() { return can_vote; } + bool isVerified() { return verified; } bool isOpped() { return op; } bool isModified() { return mod_tool; } diff --git a/disasterserver/Core/Colors.hpp b/disasterserver/Core/Colors.hpp index 8eea23b..b303543 100644 --- a/disasterserver/Core/Colors.hpp +++ b/disasterserver/Core/Colors.hpp @@ -12,4 +12,7 @@ constexpr std::string_view CLRCODE_YLW = "`"; constexpr std::string_view CLRCODE_ORG = "\xE2\x84\x96"; constexpr std::string_view CLRCODE_RST = "~"; +#define CLRLIST { CLRCODE_RED, CLRCODE_GRN, CLRCODE_PUR, CLRCODE_BLU, CLRCODE_GRA, CLRCODE_YLW, CLRCODE_ORG, CLRCODE_RST } +#define CLRLIST_LEN 8 + #endif //DISASTERSERVER_COLORS_HPP diff --git a/disasterserver/GameStateController.cpp b/disasterserver/GameStateController.cpp index bce9089..b788578 100644 --- a/disasterserver/GameStateController.cpp +++ b/disasterserver/GameStateController.cpp @@ -16,7 +16,7 @@ bool GameStateController::playerJoined(Client &peer) { packet.send(peer, true); Packet playerJoined(PacketType::SERVER_PLAYER_JOINED); - playerJoined.write(peer.getId()); + playerJoined.write(peer.getId()); playerJoined.writeString(peer.getNickname()); playerJoined.write(peer.getLobbyIcon()); playerJoined.write(peer.getPet()); @@ -42,7 +42,7 @@ bool GameStateController::playerJoined(Client &peer) { void GameStateController::playerLeft(Client &peer) { Packet packet(PacketType::SERVER_PLAYER_LEFT); - packet.write(peer.getId()); + packet.write(peer.getId()); packet.sendBroadcast(*server, true); switch (state) @@ -90,7 +90,7 @@ bool GameStateController::handle(Client &peer, Packet &packet) { break; } - uint16_t pid = packet.read(); + clientId pid = packet.read(); for (auto &c : server->getPeers()) { if (c->getId() == pid) { @@ -106,7 +106,7 @@ bool GameStateController::handle(Client &peer, Packet &packet) { break; } - uint16_t pid = packet.read(); + clientId pid = packet.read(); for (auto &c : server->getPeers()) { if (c->getId() == pid) { @@ -122,7 +122,7 @@ bool GameStateController::handle(Client &peer, Packet &packet) { break; } - uint16_t pid = packet.read(); + clientId pid = packet.read(); for (auto &c : server->getPeers()) { if (c->getId() == pid) { @@ -153,3 +153,50 @@ bool GameStateController::handle(Client &peer, Packet &packet) { return true; } + +unsigned long GameStateController::cmd_parse(std::string &string) { + static std::array clr_list = CLRLIST; + + std::string current; + bool started = false; + + for (char ch : string) + { + if (!started && std::isspace(static_cast(ch))) + continue; + + started = true; + + if (std::isspace(static_cast(ch))) + break; + + bool invalid = false; + + for (int j = 0; j < CLRLIST_LEN; ++j) + { + if (ch == clr_list[j][0]) + { + invalid = true; + break; + } + } + + if (!invalid) + current += ch; + } + + unsigned long hash = 0; + + for (unsigned char ch : current) + hash = 31 * hash + ch; + + return hash; +} + +bool GameStateController::cmd_handle(const Client &client, commandHash hash, const std::string &string) { + switch (hash) { + default: return false; break; + } + + return true; +} diff --git a/disasterserver/GameStateController.hpp b/disasterserver/GameStateController.hpp index d6c1ae0..cdd3ecb 100644 --- a/disasterserver/GameStateController.hpp +++ b/disasterserver/GameStateController.hpp @@ -16,6 +16,23 @@ namespace DisasterServer RESULTS }; +#define CMD_HELP 45680751 +#define CMD_MAP 1478254 +#define CMD_STINK 1426706039 +#define CMD_VK 47971 +#define CMD_VP 47976 +#define CMD_BAN 1467681 +#define CMD_KICK 45773684 +#define CMD_OP 47759 +#define CMD_YES 1489913 +#define CMD_Y 1547 +#define CMD_NO 47727 +#define CMD_N 1536 +#define CMD_INFO 45719004 +#define CMD_LOBBY 1420085352 + + using commandHash = unsigned long; + class GameStateController { Server *server = nullptr; States state = States::LOBBY; @@ -30,8 +47,11 @@ namespace DisasterServer void tick(); bool handle(Client &peer, Packet &packet); + commandHash cmd_parse(std::string &string); + bool cmd_handle(const Client & client, commandHash hash, const std::string & string); + States getCurrentState() const { return this->state; } - void setState(States state) { this->state = state; }; + void setState(States state) { this->state = state; } }; } diff --git a/disasterserver/Server.cpp b/disasterserver/Server.cpp index 8b20e65..d2cf3f6 100644 --- a/disasterserver/Server.cpp +++ b/disasterserver/Server.cpp @@ -7,6 +7,7 @@ #include "Core/Time.hpp" #include "GameStateController.hpp" +#include "Core/Colors.hpp" using namespace DisasterServer; @@ -42,7 +43,7 @@ void Server::initialize() { char buf[250]; enet_address_get_host_ip(&ev.peer->address, buf, 250); - const uint16_t id = ev.peer->incomingPeerID + 1; + const clientId id = ev.peer->incomingPeerID + 1; auto client = std::make_unique(this, ev.peer, id, buf); Client *rawClient = client.get(); @@ -190,7 +191,7 @@ void Server::initialize() { } } -void Server::disconnect_by_id(const uint16_t client_id, DisconnectReason reason, const std::string &message) { +void Server::disconnect_by_id(const clientId client_id, DisconnectReason reason, const std::string &message) { for (auto &client : peers) { if (client->getId() == client_id) { return client->disconnect(reason, message); @@ -198,7 +199,7 @@ void Server::disconnect_by_id(const uint16_t client_id, DisconnectReason reason, } } -void Server::broadcast_ex(Packet &packet, bool reliable, uint16_t ignore) { +void Server::broadcast_ex(Packet &packet, bool reliable, clientId ignore) { Debug("PacketType::{} sending broadcast, ignoring client {}", getPacketTypeName(packet.getPacketType()), ignore); packet.sendBroadcast(*this, reliable, [ignore](const Client& v) { return v.getId() != ignore; }); } @@ -206,18 +207,18 @@ void Server::broadcast_ex(Packet &packet, bool reliable, uint16_t ignore) { void Server::send_message(Client &client, std::string message) { std::ranges::transform(message, message.begin(), [](const unsigned char c){ return std::tolower(c); }); Packet packet(PacketType::CLIENT_CHAT_MESSAGE); - packet.write(0); + packet.write(0); packet.writeString(message); packet.send(client, true); } -void Server::send_broadcast_message(uint16_t sender, std::string &message) { +void Server::send_broadcast_message(clientId sender, std::string message) { Packet packet(PacketType::CLIENT_CHAT_MESSAGE); - packet.write(sender); + packet.write(sender); packet.writeString(message); packet.sendBroadcast(*this, true); } -GameStateController &Server::getStateManager() { +GameStateController &Server::getGameStateController() { return stateManager; } \ No newline at end of file diff --git a/disasterserver/Server.hpp b/disasterserver/Server.hpp index ae25e98..0b12a7d 100644 --- a/disasterserver/Server.hpp +++ b/disasterserver/Server.hpp @@ -4,14 +4,15 @@ #include "Client.hpp" #include "GameStateController.hpp" -#define TICKSPERSEC 60 +constexpr int TICKSPERSEC = 60; namespace DisasterServer { class GameStateController; - static constexpr int MAX_PLAYERS = 7; - static constexpr int BUILD_VERSION = 1101; - static constexpr int BASE_SERVER_PORT = 8606; + + constexpr int MAX_PLAYERS = 7; + constexpr int BUILD_VERSION = 1101; + constexpr int BASE_SERVER_PORT = 8606; @@ -29,10 +30,10 @@ namespace DisasterServer ~Server(); void initialize(); - void disconnect_by_id(uint16_t client_id, DisconnectReason reason, const std::string& message = ""); + void disconnect_by_id(clientId client_id, DisconnectReason reason, const std::string& message = ""); void send_message(Client &client, std::string message); - void send_broadcast_message(uint16_t sender, std::string &message); + void send_broadcast_message(clientId sender, std::string message); template void send_message(Client &client, std::format_string fmt, Args&&... args) { @@ -40,14 +41,16 @@ namespace DisasterServer } template - void send_broadcast_message(uint16_t sender, std::format_string fmt, Args&&... args) { + void send_broadcast_message(clientId sender, std::format_string fmt, Args&&... args) { send_broadcast_message(sender, std::format(fmt, std::forward(args)...)); } - void broadcast_ex(Packet &packet, bool reliable, uint16_t ignore); + void broadcast_ex(Packet &packet, bool reliable, clientId ignore); + + std::vector> &getPeers() { return peers; } - GameStateController &getStateManager(); + GameStateController &getGameStateController(); double getDelta() { return delta; diff --git a/disasterserver/States/LobbyState.cpp b/disasterserver/States/LobbyState.cpp index 6f282d5..5f15801 100644 --- a/disasterserver/States/LobbyState.cpp +++ b/disasterserver/States/LobbyState.cpp @@ -1,11 +1,14 @@ #include "LobbyState.hpp" +#include + #include "Server.hpp" #include "GameStateController.hpp" +#include "Core/Colors.hpp" using namespace DisasterServer; -LobbyState::LobbyState(Server *server, GameStateController *stateManager) : server(server), stateManager(stateManager) { +LobbyState::LobbyState(Server *server, GameStateController *controller) : server(server), controller(controller), vote(server) { } LobbyState::~LobbyState() = default; @@ -14,15 +17,18 @@ bool LobbyState::init() { for (auto &peer : server->getPeers()) { peer->setReady(false); peer->setVoted(false); - peer->setTimeout(false); + peer->setTimeout(0); if (!peer->isInGame()) { peer->setInGame(true); Packet pack(PacketType::SERVER_IDENTITY_RESPONSE); pack.write(1); - pack.write(peer->getId()); - pack.send(*peer, true); + pack.write(peer->getId()); + if (!pack.send(*peer, true)) { + peer->disconnect(DisconnectReason::SERVERTIMEOUT); + continue; + } } else { /* if (v->id != server->game.exe) @@ -35,7 +41,7 @@ bool LobbyState::init() { } } - stateManager->setState(States::LOBBY); + controller->setState(States::LOBBY); countdown = TICKSPERSEC; countdown_sec = NO_COUNTDOWN; prac_countdown = 0; @@ -55,30 +61,75 @@ bool LobbyState::sendCountdown() { } bool LobbyState::checkCountdown() { - uint8_t count = 0; + const auto players = &server->getPeers(); - for (auto &c : server->getPeers()) { - if (c->isReady()) { - count++; - } + if (players->size() <= 1) { + return true; } - Debug("Players isReady {}", count); + const auto ready = std::ranges::count_if( + *players, + [](const auto& peer) { + return peer->isReady(); + } + ); + + Debug("Players isReady {}/{}", ready, players->size()); - if (count == (server->getPeers().size() > 1)) { - this->countdown = TICKSPERSEC; - this->countdown_sec = COUNTDOWN; - RAssert(sendCountdown()); - } else if (this->countdown_sec != NO_COUNTDOWN) { - this->countdown = TICKSPERSEC; - this->countdown_sec = COUNTDOWN; - RAssert(sendCountdown()); + if (ready == players->size() && players->size() > 1) { + countdown = TICKSPERSEC; + countdown_sec = COUNTDOWN; + return sendCountdown(); + } + + if (countdown_sec != NO_COUNTDOWN) { + countdown = TICKSPERSEC; + countdown_sec = NO_COUNTDOWN; + return sendCountdown(); } return true; } +void LobbyState::checkVote() { + if (vote.check()) { + switch (vote.getCurrentVoteType()) { + case VoteType::KICK: { + this->server->send_broadcast_message(0, "vote kick @succeeded~ (@{} ~from \\{})", vote.getVoteCount(), vote.getVoteTotal()); + this->server->disconnect_by_id(kick_target, DisconnectReason::KICKEDBYHOST); + break; + } + + case VoteType::PRACTICE: { + this->server->send_broadcast_message(0, "vote practice succeeded~ (@{} ~from \\{}", vote.getVoteCount(), vote.getVoteTotal()); + prac_countdown = 2 * TICKSPERSEC; + break; + } + + default: break; + } + } else { + switch (vote.getCurrentVoteType()) { + case VoteType::KICK: { + this->server->send_broadcast_message(0, "vote kick \\failed~ (@{} ~from \\{})", vote.getVoteCount(), vote.getVoteTotal()); + break; + } + + case VoteType::PRACTICE: { + this->server->send_broadcast_message(0, "vote practice \\failed~ (@{} ~from \\{}", vote.getVoteCount(), vote.getVoteTotal()); + break; + } + + default: break; + } + } + + + vote.setOnGoing(false); +} + bool LobbyState::joined(Client &peer) { + RAssert(checkCountdown()); return true; } @@ -87,11 +138,12 @@ bool LobbyState::leaved(Client &peer) { return true; } + RAssert(checkCountdown()); return true; } bool LobbyState::tick() { - switch (stateManager->getCurrentState()) { + switch (controller->getCurrentState()) { case States::LOBBY: { for (auto &peer : server->getPeers()) { if (peer->getVoteCooldown() > 0) { @@ -120,6 +172,10 @@ bool LobbyState::tick() { default: break; } + if (vote.isOnGoing() && !vote.tick()) { + checkVote(); + } + if (prac_countdown > 0) { prac_countdown -= server->getDelta(); if (prac_countdown <= 0) { @@ -138,7 +194,7 @@ bool LobbyState::tick() { RAssert(sendCountdown()); } - countdown_sec -= server->getDelta(); + countdown -= server->getDelta(); } return true; @@ -155,7 +211,7 @@ bool LobbyState::handle(Client &client, Packet &packet) { } Packet pack(PacketType::SERVER_LOBBY_PLAYER); - pack.write(c->getId()); + pack.write(c->getId()); pack.write(c->isReady()); pack.writeString(c->getNickname()); pack.write(c->getLobbyIcon()); @@ -176,11 +232,136 @@ bool LobbyState::handle(Client &client, Packet &packet) { } case PacketType::CLIENT_CHAT_MESSAGE: { - uint16_t pid = packet.read(); + clientId pid = packet.read(); std::string message = packet.readString(); - Info("{} " LOG_RST "(id {}): {}", client.getNickname(), client.getId(), message); - server->send_broadcast_message(client.getId(), message); + bool ignore = true; + commandHash hash = controller->cmd_parse(message); + + switch (hash) { + default: { + if (!controller->cmd_handle(client, hash, message)) { + ignore = false; + } + break; + } + + case CMD_MAP: { + break; + } + + case CMD_Y: + case CMD_YES: { + if (!vote.isOnGoing()) { + break; + } + + if (!client.isCanVote()) { + this->server->send_message(client, "{}you can't participate in this vote.", CLRCODE_RED); + break; + } + + if (vote.getCurrentVoteType() == VoteType::KICK && kick_target == client.getId()) { + this->server->send_message(client, "{}why are you kicking yourself ???", CLRCODE_RED); + break; + } + + switch (vote.add(client)) { + + case VoteState::SUCCESS: { + this->server->send_broadcast_message(0, "{}~ {}voted~.", client.getNickname(), CLRCODE_GRN); + break; + } + + case VoteState::ALREADY_VOTED: { + this->server->send_message(client, "{}you have already voted.", CLRCODE_RED); + break; + } + + case VoteState::FULL: { + checkVote(); + break; + } + + default: break; + } + + break; + } + + + case CMD_VP: { + if (vote.isOnGoing()) { + if (!client.isCanVote()) { + this->server->send_message(client, "{}you can't participate in this vote.", CLRCODE_RED); + break; + } + + if (pid == kick_target) { + switch (vote.add(client)) { + case VoteState::SUCCESS: { + this->server->send_broadcast_message(0, "{}~ {}voted~.", client.getNickname(), CLRCODE_GRN); + break; + } + case VoteState::ALREADY_VOTED: { + this->server->send_message(client, "{}you have already voted.", CLRCODE_RED); + break; + } + case VoteState::FULL: { checkVote(); break; } + default: break; + } + } else { + this->server->send_message(client, "{}another vote is already in progress.", CLRCODE_RED); + } + break; + } + + if (client.getVoteCooldown() > 0) { + this->server->send_message(client, "you cannot start another vote for {}", static_cast(client.getVoteCooldown() / TICKSPERSEC)); + break; + } + + if (!vote.init(VoteType::PRACTICE, 0)) { + this->server->send_message(client, "{}not enough participants.", CLRCODE_RED); + break; + } + + this->server->send_broadcast_message(0, "{}~ `started practice vote.~", client.getNickname()); + this->server->send_broadcast_message(0, "type @.yes~ or ignore"); + this->server->send_broadcast_message(0, "results will be summarized in @20~ sec"); + + vote.add(client); + client.setVoteCooldown(30 * TICKSPERSEC); + break; + } + + case CMD_VK: { + if (vote.isOnGoing()) { + this->server->send_message(client, "{}another vote is already in progress.", CLRCODE_RED); + break; + } + + if (client.getVoteCooldown() > 0) { + this->server->send_message(client, "you cannot start another vote for {}", static_cast(client.getVoteCooldown() / TICKSPERSEC)); + break; + } + + if (this->server->getPeers().size() > 2) { + Packet pack(PacketType::SERVER_LOBBY_CHOOSEVOTEKICK); + pack.send(client, true); + } else { + this->server->send_message(client, "{}not enough participants.", CLRCODE_RED); + } + + break; + } + } + + Info("{} (id {}): {}", client.getNickname(), client.getId(), message); + if (!ignore) { + server->send_broadcast_message(client.getId(), message); + } + break; } case PacketType::CLIENT_LOBBY_READY_STATE: { @@ -188,7 +369,7 @@ bool LobbyState::handle(Client &client, Packet &packet) { client.setReady(state); Packet pack(PacketType::SERVER_LOBBY_READY_STATE); - pack.write(client.getId()); + pack.write(client.getId()); pack.write(state); pack.sendBroadcast(*this->server, true); @@ -196,7 +377,70 @@ bool LobbyState::handle(Client &client, Packet &packet) { } case PacketType::CLIENT_LOBBY_CHOOSEVOTEKICK: { - uint16_t pid = packet.read(); + clientId pid = packet.read(); + + if (vote.isOnGoing()) { + if (!client.isCanVote()) { + this->server->send_message(client, "{}you can't participate in this vote.", CLRCODE_RED); + break; + } + + if (pid == kick_target) { + switch (vote.add(client)) { + case VoteState::SUCCESS: { + this->server->send_broadcast_message(0, "{}~ {}voted~.", client.getNickname(), CLRCODE_GRN); + break; + } + case VoteState::ALREADY_VOTED: { + this->server->send_message(client, "{}you have already voted.", CLRCODE_RED); + break; + } + case VoteState::FULL: { checkVote(); break; } + default: break; + } + } else { + this->server->send_message(client, "{}another vote is already in progress.", CLRCODE_RED); + } + + break; + } else { + bool found = false; + for (auto &c : this->server->getPeers()) { + if (c->getId() == pid) { + + if (c->isOpped()) { + this->server->send_message(client, "you're permissionless"); + return true; + } + + kick_target = c->getId(); + found = true; + break; + } + } + + if (found) { + if (client.getVoteCooldown() > 0) { + this->server->send_message(client, "you cannot start another vote for {}", static_cast(client.getVoteCooldown() / TICKSPERSEC)); + break; + } + + if (!vote.init(VoteType::KICK, kick_target)) { + this->server->send_message(client, "{}not enough participants.", CLRCODE_RED); + break; + } + + this->server->send_broadcast_message(0, "{}~ `started kick vote.~", client.getNickname()); + this->server->send_broadcast_message(0, "type @.yes~ or ignore"); + this->server->send_broadcast_message(0, "results will be summarized in @20~ sec"); + + vote.add(client); + client.setVoteCooldown(30 * TICKSPERSEC); + } else { + this->server->send_broadcast_message(0, "{}specified player not found.", CLRCODE_RED); + } + } + break; } @@ -204,4 +448,4 @@ bool LobbyState::handle(Client &client, Packet &packet) { } return result; -} +} \ No newline at end of file diff --git a/disasterserver/States/LobbyState.hpp b/disasterserver/States/LobbyState.hpp index f49a393..ba9b88c 100644 --- a/disasterserver/States/LobbyState.hpp +++ b/disasterserver/States/LobbyState.hpp @@ -1,13 +1,11 @@ #ifndef DISASTERSERVER_LOBBY_HPP #define DISASTERSERVER_LOBBY_HPP -#include "State.hpp" - #include -#include +#include "Vote.hpp" -#define NO_COUNTDOWN (5 + 1) -#define COUNTDOWN (5) +constexpr int COUNTDOWN = 5; +constexpr int NO_COUNTDOWN = 5 + 1; namespace DisasterServer { @@ -15,12 +13,13 @@ namespace DisasterServer class LobbyState { Server *server = nullptr; - GameStateController *stateManager = nullptr; + GameStateController *controller = nullptr; double countdown = 0; double prac_countdown = 0; uint8_t countdown_sec = 0; - //Vote vote; + Vote vote; + clientId kick_target = 0; /* Map Vote */ uint8_t maps[3] = {}; @@ -28,20 +27,25 @@ namespace DisasterServer /* Character Select */ int8_t map = 0; - uint16_t exe = 0; + clientId exe = 0; std::unordered_map avail; public: - explicit LobbyState(Server *server, GameStateController *stateManager); + explicit LobbyState(Server *server, GameStateController *controller); ~LobbyState(); bool init(); bool sendCountdown(); bool checkCountdown(); + void checkVote(); + bool joined(Client &peer); bool leaved(Client &peer); bool tick(); bool handle(Client &client, Packet &packet); }; + + } + #endif //DISASTERSERVER_LOBBY_HPP diff --git a/disasterserver/States/Vote.cpp b/disasterserver/States/Vote.cpp new file mode 100644 index 0000000..13492c4 --- /dev/null +++ b/disasterserver/States/Vote.cpp @@ -0,0 +1,64 @@ +#include "Vote.hpp" + +#include + +#include "Client.hpp" +#include "Server.hpp" + +using namespace DisasterServer; + +Vote::Vote(Server *server) : server(server) {} + +Vote::~Vote() = default; + +bool Vote::init(VoteType type, clientId id) { + ongoing = false; + votes.clear(); + auto &players = server->getPeers(); + this->type = type; + + for (auto &c: server->getPeers()) { + c->setCanVote(c->getId() != id); + } + this->votedTotal = std::ranges::count_if(players, [](const auto& peer) { return peer->isCanVote(); }); + + if (votedTotal <= 1) { + return false; + } + + this->ongoing = true; + this->countdown = 20 * TICKSPERSEC; + return true; +} + +VoteState Vote::add(Client & voter) { + if (this->votes.contains(voter.getId())) { + return VoteState::ALREADY_VOTED; + } + + votes.insert(voter.getId()); + + if (votes.size() >= votedTotal) { + return VoteState::FULL; + } + + return VoteState::SUCCESS; +} + +bool Vote::tick() { + if (!ongoing) { + return false; + } + + countdown -= server->getDelta(); + + if (countdown <= 0) { + return false; + } + + return true; +} + +bool Vote::check() { + return votes.size() * 4 > votedTotal; +} \ No newline at end of file diff --git a/disasterserver/States/Vote.hpp b/disasterserver/States/Vote.hpp new file mode 100644 index 0000000..a4af456 --- /dev/null +++ b/disasterserver/States/Vote.hpp @@ -0,0 +1,52 @@ +#ifndef DISASTERSERVER_VOTE_HPP +#define DISASTERSERVER_VOTE_HPP + +#include + +#include "Client.hpp" + +namespace DisasterServer { + class Server; + + enum class VoteType + { + KICK, + PRACTICE + }; + + enum class VoteState + { + SUCCESS = 1, + NOT_ONGOING = 2, + NOT_ALLOWED = 3, + ALREADY_VOTED = 0, + FULL = -1, + }; + + class Vote { + Server *server = nullptr; + + VoteType type = VoteType::KICK; + bool ongoing = false; + + std::unordered_set votes; + size_t votedTotal; + double countdown = 0; + public: + Vote(Server *server); + ~Vote(); + + bool init(VoteType type, clientId id); + VoteState add(Client &voter); + bool tick(); + bool check(); + + void setOnGoing(bool flag) { ongoing = flag; } + bool isOnGoing() { return ongoing; } + VoteType getCurrentVoteType() { return type; } + size_t getVoteTotal() { return votedTotal; } + size_t getVoteCount() { return votes.size(); } + }; +} + +#endif //DISASTERSERVER_VOTE_HPP diff --git a/disasterserver_c/Vote.c b/disasterserver_c/Vote.c index b24364a..0fff53f 100644 --- a/disasterserver_c/Vote.c +++ b/disasterserver_c/Vote.c @@ -54,5 +54,5 @@ bool vote_tick(Server* server, Vote* vote) bool vote_check(Vote* vote) { - return vote->votecnt > (vote->votetotal / 2.0); + return vote->votecnt * 2 > (vote->votetotal / 2.0); } From 346f8fcabfc4760e4d347ff851a01a54880f3f2f Mon Sep 17 00:00:00 2001 From: FakerNull0 Date: Mon, 7 Sep 2026 20:46:34 +0300 Subject: [PATCH 17/61] charselect (exe is crying) + little things --- disasterserver/CMakeLists.txt | 2 + disasterserver/Client.hpp | 5 + disasterserver/GameStateController.cpp | 42 ++-- disasterserver/GameStateController.hpp | 20 +- disasterserver/States/CharSelect.cpp | 326 +++++++++++++++++++++++++ disasterserver/States/CharSelect.hpp | 52 ++++ disasterserver/States/LobbyState.cpp | 19 +- 7 files changed, 442 insertions(+), 24 deletions(-) create mode 100644 disasterserver/States/CharSelect.cpp create mode 100644 disasterserver/States/CharSelect.hpp diff --git a/disasterserver/CMakeLists.txt b/disasterserver/CMakeLists.txt index 62d6204..70ecefe 100644 --- a/disasterserver/CMakeLists.txt +++ b/disasterserver/CMakeLists.txt @@ -28,6 +28,8 @@ set(COMPILER_OPTIONS ) file(GLOB_RECURSE SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/*.cpp) +# file(GLOB_RECURSE SOURCES CONFIGURE_DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/*.cpp) + if(ANDROID) add_library(DisasterServerCXX SHARED "Android.cpp" ${SOURCES}) diff --git a/disasterserver/Client.hpp b/disasterserver/Client.hpp index 7ec8283..30d31ef 100644 --- a/disasterserver/Client.hpp +++ b/disasterserver/Client.hpp @@ -123,6 +123,11 @@ namespace DisasterServer void setExeChance(uint8_t chance) { exe_chance = chance; } uint8_t getExeChance() { return exe_chance; } + SurvCharacters getSurvCharacter() const { return survChar; } + void setSurvCharacter(SurvCharacters character) { survChar = character; } + ExesCharacters getExeCharacter() const { return exeChar; } + void setExeCharacter(ExesCharacters character) { exeChar = character; } + void setTimeout(double value) { timeout = value; } double getTimeout() const { return timeout; } bool isShouldTimeout() { return should_timeout; } diff --git a/disasterserver/GameStateController.cpp b/disasterserver/GameStateController.cpp index b788578..f1a9b99 100644 --- a/disasterserver/GameStateController.cpp +++ b/disasterserver/GameStateController.cpp @@ -5,7 +5,7 @@ using namespace DisasterServer; -GameStateController::GameStateController(Server *server) : server(server), lobby(server, this) { +GameStateController::GameStateController(Server *server): server(server), lobby(server, this), charSelect(server, this) { } GameStateController::~GameStateController() = default; @@ -24,9 +24,11 @@ bool GameStateController::playerJoined(Client &peer) { switch (state) { case States::LOBBY: - case States::CHARSELECT: - case States::MAPVOTE: { + case States::MAPVOTE: return lobby.joined(peer); + + case States::CHARSELECT: { + return charSelect.joined(peer); } case States::GAME: { return true; @@ -48,11 +50,14 @@ void GameStateController::playerLeft(Client &peer) { switch (state) { case States::LOBBY: - case States::CHARSELECT: case States::MAPVOTE: lobby.leaved(peer); break; + case States::CHARSELECT: + charSelect.leaved(peer); + break; + case States::GAME: //game_state_tick(server); break; @@ -63,22 +68,24 @@ void GameStateController::playerLeft(Client &peer) { } } - void GameStateController::tick() { switch (state) { case States::LOBBY: - case States::CHARSELECT: case States::MAPVOTE: lobby.tick(); break; + case States::CHARSELECT: + charSelect.tick(); + break; + case States::GAME: - //game_state_tick(server); + // game_state_tick(server); break; case States::RESULTS: - //results_state_tick(server); + // results_state_tick(server); break; } } @@ -137,18 +144,21 @@ bool GameStateController::handle(Client &peer, Packet &packet) { } switch (state) { case States::LOBBY: - case States::CHARSELECT: - case States::MAPVOTE: { + case States::MAPVOTE: lobby.handle(peer, packet); break; - } - case States::GAME: { + + case States::CHARSELECT: + charSelect.handle(peer, packet); break; - } - case States::RESULTS: { + + case States::GAME: + // game state handle + break; + + case States::RESULTS: + // results state handle break; - } - default: break; } return true; diff --git a/disasterserver/GameStateController.hpp b/disasterserver/GameStateController.hpp index cdd3ecb..bf29a32 100644 --- a/disasterserver/GameStateController.hpp +++ b/disasterserver/GameStateController.hpp @@ -3,6 +3,7 @@ #include "Core/Packet.hpp" #include "States/LobbyState.hpp" +#include "States/CharSelect.hpp" namespace DisasterServer { @@ -38,20 +39,25 @@ namespace DisasterServer States state = States::LOBBY; LobbyState lobby; + CharSelectState charSelect; public: - explicit GameStateController(Server *server); + explicit GameStateController(Server* server); ~GameStateController(); - bool playerJoined(Client &peer); - void playerLeft(Client &peer); + bool playerJoined(Client& peer); + void playerLeft(Client& peer); void tick(); - bool handle(Client &peer, Packet &packet); + bool handle(Client& peer, Packet& packet); - commandHash cmd_parse(std::string &string); - bool cmd_handle(const Client & client, commandHash hash, const std::string & string); + commandHash cmd_parse(std::string& string); + bool cmd_handle(const Client& client, commandHash hash, const std::string& string); - States getCurrentState() const { return this->state; } + States getCurrentState() const { return state; } void setState(States state) { this->state = state; } + + CharSelectState& getCharSelect() { + return charSelect; + } }; } diff --git a/disasterserver/States/CharSelect.cpp b/disasterserver/States/CharSelect.cpp new file mode 100644 index 0000000..ac314c7 --- /dev/null +++ b/disasterserver/States/CharSelect.cpp @@ -0,0 +1,326 @@ +#include "CharSelect.hpp" + +#include +#include + +#include "Server.hpp" +#include "GameStateController.hpp" +#include "Core/Colors.hpp" + +namespace DisasterServer { + +namespace { + +constexpr std::array EXE_NAMES = { + "Classic Exe", + "Chaos", + "Exetior", + "Exeller" +}; + +constexpr std::array SURV_NAMES = { + "Tails", + "Knuckles", + "Eggman", + "Amy", + "Cream", + "Sally" +}; + +} + +CharSelectState::CharSelectState(Server* server, GameStateController* controller) : State(server), controller(controller) { +} + +bool CharSelectState::isValidExeCharacter(uint8_t id) const { + return id >= 1 && id <= 4; +} + +bool CharSelectState::isValidSurvivorCharacter(uint8_t id) const { + return id >= 1 && id <= 6; +} + +bool CharSelectState::chooseExe() { + uint32_t weight = 0; + + for (auto& peer : server->getPeers()) { + if (!peer || !peer->isInGame()) + continue; + + peer->setExeCharacter(ExesCharacters::NONE); + peer->setSurvCharacter(SurvCharacters::NONE); + + weight += peer->getExeChance(); + } + + if (weight == 0) + weight++; + + uint32_t rnd = static_cast(std::rand()) % weight; + + for (auto& peer : server->getPeers()) { + if (!peer || !peer->isInGame()) + continue; + + if (peer->getExeChance() >= 100) { + exe = peer->getId(); + return true; + } + + if (rnd < peer->getExeChance() && !peer->isModified()) { + Info("{} (id {}, c {}) is exe!", peer->getNickname(), peer->getId(), peer->getExeChance()); + + peer->setExeChance(1 + std::rand() % 1); + + exe = peer->getId(); + return true; + } + + rnd -= peer->getExeChance(); + } + + exe = static_cast(-1); + return false; +} + +bool CharSelectState::checkState() { + bool shouldStart = true; + + for (auto& peer : server->getPeers()) { + if (!peer || !peer->isInGame()) + continue; + + if (peer->getExeCharacter() == ExesCharacters::NONE && + peer->getSurvCharacter() == SurvCharacters::NONE) { + shouldStart = false; + break; + } + } + + if (shouldStart) { + controller->setState(States::LOBBY); + return true; + } + + return true; +} + +bool CharSelectState::init(int8_t selectedMap) { + Debug("Attempting to enter ST_CHARSELECT..."); + + if (!chooseExe()) { + Err("Failed to pick exe for some reason!"); + + controller->setState(States::LOBBY); + return true; + } + + map = selectedMap; + + controller->setState(States::CHARSELECT); + + countdownSec = 30; + countdown = TICKSPERSEC; + + avail.fill(true); + + Packet pack(PacketType::SERVER_LOBBY_EXE); + + pack.write(exe); + pack.write(map); + + pack.sendBroadcast(*server, true); + + Packet timePack(PacketType::SERVER_CHAR_TIME_SYNC); + + timePack.write(countdownSec); + timePack.sendBroadcast(*server, true); + + Info("{}Server is now in {}Character Select{}", CLRCODE_YLW, CLRCODE_PUR, CLRCODE_RST); + + return true; +} + +bool CharSelectState::handle(Client& client, Packet& packet) { + switch (packet.getPacketType()) { + + case PacketType::CLIENT_REQUEST_EXECHARACTER: { + if (!client.isInGame()) + break; + + if (exe != client.getId()) { + client.disconnect(DisconnectReason::OTHER, "Invalid exe character request" + ); + return false; + } + + uint8_t id = packet.read(); + + if (!isValidExeCharacter(id)) { + client.disconnect(DisconnectReason::OTHER, "Invalid exe character"); + return false; + } + + const auto character = + static_cast(id - 1); + + client.setExeCharacter(character); + + Packet response( + PacketType::SERVER_LOBBY_EXECHARACTER_RESPONSE + ); + + response.write(id); + + if (!response.send(client, true)) + return false; + + Packet change( + PacketType::SERVER_LOBBY_CHARACTER_CHANGE + ); + + change.write(client.getId()); + change.write(id); + change.sendBroadcast(*server, true); + + Info("{}{}{} (id {}) choses [{}{}{}]!", client.getNickname(), CLRCODE_RST, "", client.getId(), CLRCODE_RED, EXE_NAMES[id - 1], CLRCODE_RST); + return checkState(); + } + + case PacketType::CLIENT_REQUEST_CHARACTER: { + if (!client.isInGame()) + break; + + if (client.getSurvCharacter() != SurvCharacters::NONE) + break; + + if (exe == client.getId()) { + client.disconnect(DisconnectReason::OTHER, "Exe cannot select survivor character"); + return false; + } + + const uint8_t id = packet.read(); + + if (!isValidSurvivorCharacter(id)) { + client.disconnect(DisconnectReason::OTHER, "Invalid survivor character"); + return false; + } + + const size_t index = id - 1; + const bool available = avail[index]; + + if (available) + avail[index] = false; + + Packet response( + PacketType::SERVER_LOBBY_CHARACTER_RESPONSE + ); + + response.write(id); + response.write(available); + + if (!response.send(client, true)) + return false; + + if (available) { + client.setSurvCharacter( + static_cast(index) + ); + + Packet change( + PacketType::SERVER_LOBBY_CHARACTER_CHANGE + ); + + change.write(client.getId()); + change.write(id); + change.sendBroadcast(*server, true); + } + + Info("{}{}{} (id {}) choses [{}{}{}]!", client.getNickname(), CLRCODE_RST, "", client.getId(), CLRCODE_GRN, SURV_NAMES[index], CLRCODE_RST); + return checkState(); + } + + case PacketType::CLIENT_CHAT_MESSAGE: { + const clientId pid = packet.read(); + (void)pid; + + const std::string message = packet.readString(); + + if (message.size() > 40) { + client.disconnect(DisconnectReason::OTHER, "Chat message too long"); + return false; + } + + client.setTimeout(0); + + Info("{}{}{} (id {}): {}", client.getNickname(), CLRCODE_RST, "", client.getId(), message); + break; + } + + default: + /* + * placeholder + */ + break; + } + + return true; +} + +void CharSelectState::tick() { + if (countdown <= 0) { + countdown += TICKSPERSEC; + + if (--countdownSec == 0) { + for (auto& peer : server->getPeers()) { + if (!peer || !peer->isInGame()) + continue; + + if (peer->getExeCharacter() == ExesCharacters::NONE && + peer->getSurvCharacter() == SurvCharacters::NONE) { + + peer->disconnect( + DisconnectReason::AFKTIMEOUT + ); + } + } + } + + Packet pack(PacketType::SERVER_CHAR_TIME_SYNC); + + pack.write(countdownSec); + pack.sendBroadcast(*server, true); + } + + countdown -= server->getDelta(); +} + +bool CharSelectState::joined(Client& client) { + (void)client; + return true; +} + +bool CharSelectState::leaved(Client& client) { + if (client.getSurvCharacter() != SurvCharacters::NONE) { + const auto character = client.getSurvCharacter(); + const size_t index = static_cast(character); + + if (index < avail.size()) + avail[index] = true; + } + + size_t inGame = 0; + + for (auto& peer : server->getPeers()) { + if (peer && peer->isInGame()) + ++inGame; + } + + if (inGame <= 1 || client.getId() == exe) { + controller->setState(States::LOBBY); + return true; + } + + return checkState(); +} +} \ No newline at end of file diff --git a/disasterserver/States/CharSelect.hpp b/disasterserver/States/CharSelect.hpp new file mode 100644 index 0000000..230e759 --- /dev/null +++ b/disasterserver/States/CharSelect.hpp @@ -0,0 +1,52 @@ +#ifndef DISASTERSERVER_CHARSELECTSTATE_HPP +#define DISASTERSERVER_CHARSELECTSTATE_HPP + +#include +#include + +#include "State.hpp" +#include "Core/Packet.hpp" + +namespace DisasterServer { + +class GameStateController; + +class CharSelectState : public State { +private: + GameStateController* controller = nullptr; + + double countdown = 0; + uint8_t countdownSec = 30; + + int8_t map = 0; + clientId exe = 0; + + std::array avail{}; + + bool checkState(); + bool chooseExe(); + + bool isValidSurvivorCharacter(uint8_t id) const; + bool isValidExeCharacter(uint8_t id) const; + +public: + CharSelectState(Server* server, GameStateController* controller); + + ~CharSelectState() override = default; + + bool init(int8_t map); + + void tick() override; + + bool handle(Client& client, Packet& packet) override; + + bool joined(Client& client) override; + bool leaved(Client& client); + + clientId getExe() const { return exe; } + int8_t getMap() const { return map; } +}; + +} + +#endif // DISASTERSERVER_CHARSELECTSTATE_HPP \ No newline at end of file diff --git a/disasterserver/States/LobbyState.cpp b/disasterserver/States/LobbyState.cpp index 5f15801..2828788 100644 --- a/disasterserver/States/LobbyState.cpp +++ b/disasterserver/States/LobbyState.cpp @@ -188,7 +188,7 @@ bool LobbyState::tick() { countdown += TICKSPERSEC; if (--countdown_sec == 0) { - return init(); + return controller->getCharSelect().init(map); } RAssert(sendCountdown()); @@ -247,6 +247,23 @@ bool LobbyState::handle(Client &client, Packet &packet) { } case CMD_MAP: { + controller->getCharSelect().init(0); + break; + } + + case CMD_HELP: { + this->server->send_message(client, "~-----~ {}command list:{} ~-----~", CLRCODE_GRN, CLRCODE_RST); + this->server->send_message(client, "|- .vk~ - vote kick "); + this->server->send_message(client, "|- .info~ - information about server"); + this->server->send_message(client, "|- .vp~ - vote practice mode (wip)"); + break; + } + + case CMD_INFO: { + this->server->send_message(client, "|build from &{} @{}~", __DATE__, __TIME__); + this->server->send_message(client, "{}hander{} - original binary", CLRCODE_YLW, CLRCODE_RST); + this->server->send_message(client, "{}miles{}glitch{} - rewritten server to c++", CLRCODE_BLU, CLRCODE_PUR, CLRCODE_RST); + this->server->send_message(client, "{}faker{}null{}0{} - help with code", CLRCODE_GRA, CLRCODE_RED, CLRCODE_GRN, CLRCODE_RST); break; } From 91cdf6aa298b84ed9cacbdcf3e9870bb97593600 Mon Sep 17 00:00:00 2001 From: MilesGlitch Date: Mon, 7 Sep 2026 22:03:18 +0300 Subject: [PATCH 18/61] Fixes --- disasterserver/Client.hpp | 6 +- disasterserver/Server.hpp | 1 + disasterserver/States/CharSelect.cpp | 125 ++++++++++----------------- disasterserver/States/CharSelect.hpp | 16 ++-- disasterserver/States/LobbyState.cpp | 21 ++++- 5 files changed, 74 insertions(+), 95 deletions(-) diff --git a/disasterserver/Client.hpp b/disasterserver/Client.hpp index 30d31ef..92f7696 100644 --- a/disasterserver/Client.hpp +++ b/disasterserver/Client.hpp @@ -15,7 +15,8 @@ namespace DisasterServer EGGMAN, AMY, CREAM, - SALLY + SALLY, + COUNT }; enum class ExesCharacters { @@ -24,7 +25,8 @@ namespace DisasterServer ORIGINAL, CHAOS, EXETIOR, - EXELLER + EXELLER, + COUNT }; enum class DisconnectReason diff --git a/disasterserver/Server.hpp b/disasterserver/Server.hpp index 0b12a7d..95125f4 100644 --- a/disasterserver/Server.hpp +++ b/disasterserver/Server.hpp @@ -11,6 +11,7 @@ namespace DisasterServer class GameStateController; constexpr int MAX_PLAYERS = 7; + constexpr int MAP_COUNT = 20; constexpr int BUILD_VERSION = 1101; constexpr int BASE_SERVER_PORT = 8606; diff --git a/disasterserver/States/CharSelect.cpp b/disasterserver/States/CharSelect.cpp index ac314c7..7beb22d 100644 --- a/disasterserver/States/CharSelect.cpp +++ b/disasterserver/States/CharSelect.cpp @@ -1,9 +1,10 @@ #include "CharSelect.hpp" -#include +#include #include #include "Server.hpp" +#include "Client.hpp" #include "GameStateController.hpp" #include "Core/Colors.hpp" @@ -11,14 +12,14 @@ namespace DisasterServer { namespace { -constexpr std::array EXE_NAMES = { +constexpr std::array EXE_NAMES = { "Classic Exe", "Chaos", "Exetior", "Exeller" }; -constexpr std::array SURV_NAMES = { +constexpr std::array SURV_NAMES = { "Tails", "Knuckles", "Eggman", @@ -29,15 +30,7 @@ constexpr std::array SURV_NAMES = { } -CharSelectState::CharSelectState(Server* server, GameStateController* controller) : State(server), controller(controller) { -} - -bool CharSelectState::isValidExeCharacter(uint8_t id) const { - return id >= 1 && id <= 4; -} - -bool CharSelectState::isValidSurvivorCharacter(uint8_t id) const { - return id >= 1 && id <= 6; +CharSelectState::CharSelectState(Server* server, GameStateController* controller) : server(server), controller(controller) { } bool CharSelectState::chooseExe() { @@ -125,14 +118,11 @@ bool CharSelectState::init(int8_t selectedMap) { avail.fill(true); Packet pack(PacketType::SERVER_LOBBY_EXE); - pack.write(exe); - pack.write(map); - + pack.write(map); pack.sendBroadcast(*server, true); Packet timePack(PacketType::SERVER_CHAR_TIME_SYNC); - timePack.write(countdownSec); timePack.sendBroadcast(*server, true); @@ -143,107 +133,88 @@ bool CharSelectState::init(int8_t selectedMap) { bool CharSelectState::handle(Client& client, Packet& packet) { switch (packet.getPacketType()) { - case PacketType::CLIENT_REQUEST_EXECHARACTER: { if (!client.isInGame()) break; if (exe != client.getId()) { - client.disconnect(DisconnectReason::OTHER, "Invalid exe character request" - ); + client.disconnect(DisconnectReason::OTHER, "Invalid exe character request"); return false; } uint8_t id = packet.read(); + id--; - if (!isValidExeCharacter(id)) { + if (id > static_cast(ExesCharacters::COUNT)) { client.disconnect(DisconnectReason::OTHER, "Invalid exe character"); return false; } - const auto character = - static_cast(id - 1); + client.setExeCharacter(static_cast(id)); - client.setExeCharacter(character); - - Packet response( - PacketType::SERVER_LOBBY_EXECHARACTER_RESPONSE - ); - - response.write(id); - - if (!response.send(client, true)) - return false; - - Packet change( - PacketType::SERVER_LOBBY_CHARACTER_CHANGE - ); + Packet pack(PacketType::SERVER_LOBBY_EXECHARACTER_RESPONSE); + pack.write(id); + RAssert(pack.send(client, true)); + Packet change(PacketType::SERVER_LOBBY_CHARACTER_CHANGE); change.write(client.getId()); change.write(id); change.sendBroadcast(*server, true); - Info("{}{}{} (id {}) choses [{}{}{}]!", client.getNickname(), CLRCODE_RST, "", client.getId(), CLRCODE_RED, EXE_NAMES[id - 1], CLRCODE_RST); + Info("{}{}{} (id {}) choses [{}{}{}]!", client.getNickname(), CLRCODE_RST, "", client.getId(), CLRCODE_RED, EXE_NAMES[id], CLRCODE_RST); return checkState(); } case PacketType::CLIENT_REQUEST_CHARACTER: { - if (!client.isInGame()) + if (!client.isInGame()) { break; + } - if (client.getSurvCharacter() != SurvCharacters::NONE) + if (client.getSurvCharacter() != SurvCharacters::NONE) { break; + } if (exe == client.getId()) { client.disconnect(DisconnectReason::OTHER, "Exe cannot select survivor character"); return false; } - const uint8_t id = packet.read(); + uint8_t id = packet.read(); + id--; - if (!isValidSurvivorCharacter(id)) { + if (id > static_cast(SurvCharacters::COUNT)) { client.disconnect(DisconnectReason::OTHER, "Invalid survivor character"); return false; } - const size_t index = id - 1; - const bool available = avail[index]; - - if (available) - avail[index] = false; + const bool available = avail[id]; - Packet response( - PacketType::SERVER_LOBBY_CHARACTER_RESPONSE - ); + if (available) { + avail[id] = false; + } - response.write(id); - response.write(available); + Packet response(PacketType::SERVER_LOBBY_CHARACTER_RESPONSE); + response.write(id + 1); + response.write(available); if (!response.send(client, true)) return false; if (available) { - client.setSurvCharacter( - static_cast(index) - ); - - Packet change( - PacketType::SERVER_LOBBY_CHARACTER_CHANGE - ); + client.setSurvCharacter(static_cast(id)); + Packet change(PacketType::SERVER_LOBBY_CHARACTER_CHANGE); change.write(client.getId()); - change.write(id); + change.write(id + 1); change.sendBroadcast(*server, true); } - Info("{}{}{} (id {}) choses [{}{}{}]!", client.getNickname(), CLRCODE_RST, "", client.getId(), CLRCODE_GRN, SURV_NAMES[index], CLRCODE_RST); + Info("{}{}{} (id {}) choses [{}{}{}]!", client.getNickname(), CLRCODE_RST, "", client.getId(), CLRCODE_GRN, SURV_NAMES[id], CLRCODE_RST); return checkState(); } case PacketType::CLIENT_CHAT_MESSAGE: { const clientId pid = packet.read(); - (void)pid; - const std::string message = packet.readString(); if (message.size() > 40) { @@ -257,11 +228,7 @@ bool CharSelectState::handle(Client& client, Packet& packet) { break; } - default: - /* - * placeholder - */ - break; + default: break; } return true; @@ -276,18 +243,15 @@ void CharSelectState::tick() { if (!peer || !peer->isInGame()) continue; - if (peer->getExeCharacter() == ExesCharacters::NONE && - peer->getSurvCharacter() == SurvCharacters::NONE) { + if (peer->getExeCharacter() == ExesCharacters::NONE + && peer->getSurvCharacter() == SurvCharacters::NONE) { - peer->disconnect( - DisconnectReason::AFKTIMEOUT - ); + peer->disconnect(DisconnectReason::AFKTIMEOUT); } } } Packet pack(PacketType::SERVER_CHAR_TIME_SYNC); - pack.write(countdownSec); pack.sendBroadcast(*server, true); } @@ -296,7 +260,6 @@ void CharSelectState::tick() { } bool CharSelectState::joined(Client& client) { - (void)client; return true; } @@ -305,16 +268,16 @@ bool CharSelectState::leaved(Client& client) { const auto character = client.getSurvCharacter(); const size_t index = static_cast(character); - if (index < avail.size()) + if (index < avail.size()) { avail[index] = true; + } } - size_t inGame = 0; - - for (auto& peer : server->getPeers()) { - if (peer && peer->isInGame()) - ++inGame; - } + const size_t inGame = std::ranges::count_if(server->getPeers(), + [](const auto& cl) { + return cl->isInGame(); + } + ); if (inGame <= 1 || client.getId() == exe) { controller->setState(States::LOBBY); diff --git a/disasterserver/States/CharSelect.hpp b/disasterserver/States/CharSelect.hpp index 230e759..3cfb40c 100644 --- a/disasterserver/States/CharSelect.hpp +++ b/disasterserver/States/CharSelect.hpp @@ -11,8 +11,8 @@ namespace DisasterServer { class GameStateController; -class CharSelectState : public State { -private: +class CharSelectState { + Server *server = nullptr; GameStateController* controller = nullptr; double countdown = 0; @@ -26,21 +26,17 @@ class CharSelectState : public State { bool checkState(); bool chooseExe(); - bool isValidSurvivorCharacter(uint8_t id) const; - bool isValidExeCharacter(uint8_t id) const; - public: CharSelectState(Server* server, GameStateController* controller); - - ~CharSelectState() override = default; + ~CharSelectState() = default; bool init(int8_t map); - void tick() override; + void tick(); - bool handle(Client& client, Packet& packet) override; + bool handle(Client& client, Packet& packet); - bool joined(Client& client) override; + bool joined(Client& client); bool leaved(Client& client); clientId getExe() const { return exe; } diff --git a/disasterserver/States/LobbyState.cpp b/disasterserver/States/LobbyState.cpp index 2828788..87583a4 100644 --- a/disasterserver/States/LobbyState.cpp +++ b/disasterserver/States/LobbyState.cpp @@ -188,7 +188,7 @@ bool LobbyState::tick() { countdown += TICKSPERSEC; if (--countdown_sec == 0) { - return controller->getCharSelect().init(map); + return controller->getCharSelect().init(map) || init(); } RAssert(sendCountdown()); @@ -247,7 +247,24 @@ bool LobbyState::handle(Client &client, Packet &packet) { } case CMD_MAP: { - controller->getCharSelect().init(0); + /*if (!client.isOpped()) { + this->server->send_message(client, "{}you aren't an operator", CLRCODE_RED); + break; + }*/ + + int ind; + if (sscanf(message.c_str(), ".map %d", &ind) <= 0) { + this->server->send_message(client, "{}example:~ .map 1", CLRCODE_RED); + break; + } + + ind--; + if (ind < 0 || ind >= MAP_COUNT+1) { + this->server->send_message(client, "{}map should be between 1 and {}", CLRCODE_RED, MAP_COUNT+1); + break; + } + + controller->getCharSelect().init(ind); break; } From a721befe4bdae0074fb2568fbedb8e2c9799ee72 Mon Sep 17 00:00:00 2001 From: MilesGlitch Date: Mon, 7 Sep 2026 22:28:26 +0300 Subject: [PATCH 19/61] Update --- disasterserver/Client.cpp | 6 ++--- disasterserver/Core/Packet.cpp | 2 +- disasterserver/GameStateController.cpp | 6 ++--- disasterserver/GameStateController.hpp | 6 ++--- disasterserver/Server.cpp | 8 ++++++ disasterserver/Server.hpp | 4 +-- disasterserver/States/CharSelect.cpp | 25 ++++++------------ disasterserver/States/CharSelect.hpp | 8 +++--- disasterserver/States/LobbyState.cpp | 12 ++++----- disasterserver/States/State.hpp | 36 -------------------------- disasterserver/States/Vote.cpp | 4 +-- 11 files changed, 39 insertions(+), 78 deletions(-) delete mode 100644 disasterserver/States/State.hpp diff --git a/disasterserver/Client.cpp b/disasterserver/Client.cpp index 22b0c5f..ce8fd90 100644 --- a/disasterserver/Client.cpp +++ b/disasterserver/Client.cpp @@ -45,7 +45,7 @@ bool Client::identity(Packet &packet) { this->in_game = (server->getGameStateController().getCurrentState() == States::LOBBY); this->exe_chance = 1 + rand() % 4; - if (this->server->getPeers().size() >= MAX_PLAYERS) { + if (this->server->getClients().size() >= MAX_PLAYERS) { this->disconnect(DisconnectReason::LOBBYFULL); return false; } @@ -87,7 +87,7 @@ bool Client::identity_process(const std::string &addr, bool is_banned, uint64_t return false; } - if (this->server->getPeers().size() >= MAX_PLAYERS) { + if (this->server->getClients().size() >= MAX_PLAYERS) { this->disconnect(DisconnectReason::LOBBYFULL); return false; } @@ -117,7 +117,7 @@ bool Client::identity_process(const std::string &addr, bool is_banned, uint64_t if (!in_game) { // For icons - for (auto &client : this->server->getPeers()) { + for (auto &client : this->server->getClients()) { if (client->getId() == id) { continue; } diff --git a/disasterserver/Core/Packet.cpp b/disasterserver/Core/Packet.cpp index 8ded4f5..c1b2c8e 100644 --- a/disasterserver/Core/Packet.cpp +++ b/disasterserver/Core/Packet.cpp @@ -98,7 +98,7 @@ bool Packet::send(Client &client, bool reliable) { } void Packet::sendBroadcast(Server &server, bool reliable, std::function predicate) { - for (auto &client : server.getPeers()) { + for (auto &client : server.getClients()) { if (predicate(*client)) { if (!send(*client, reliable)) { Warn("Failed to send {} to client {}", getPacketTypeName(type), client->getId()); diff --git a/disasterserver/GameStateController.cpp b/disasterserver/GameStateController.cpp index f1a9b99..c63d26d 100644 --- a/disasterserver/GameStateController.cpp +++ b/disasterserver/GameStateController.cpp @@ -99,7 +99,7 @@ bool GameStateController::handle(Client &peer, Packet &packet) { clientId pid = packet.read(); - for (auto &c : server->getPeers()) { + for (auto &c : server->getClients()) { if (c->getId() == pid) { //TODO: add ban logic c->disconnect(DisconnectReason::BANNEDBYHOST); @@ -115,7 +115,7 @@ bool GameStateController::handle(Client &peer, Packet &packet) { clientId pid = packet.read(); - for (auto &c : server->getPeers()) { + for (auto &c : server->getClients()) { if (c->getId() == pid) { //TODO: add kick logic c->disconnect(DisconnectReason::KICKEDBYHOST); @@ -131,7 +131,7 @@ bool GameStateController::handle(Client &peer, Packet &packet) { clientId pid = packet.read(); - for (auto &c : server->getPeers()) { + for (auto &c : server->getClients()) { if (c->getId() == pid) { //TODO: add operator logic server->send_message(peer, "{}you're an operator now", CLRCODE_GRN); diff --git a/disasterserver/GameStateController.hpp b/disasterserver/GameStateController.hpp index bf29a32..e3b26ab 100644 --- a/disasterserver/GameStateController.hpp +++ b/disasterserver/GameStateController.hpp @@ -55,9 +55,9 @@ namespace DisasterServer States getCurrentState() const { return state; } void setState(States state) { this->state = state; } - CharSelectState& getCharSelect() { - return charSelect; - } + + LobbyState& getLobbyState() { return lobby; } + CharSelectState& getCharSelect() { return charSelect; } }; } diff --git a/disasterserver/Server.cpp b/disasterserver/Server.cpp index d2cf3f6..f0df033 100644 --- a/disasterserver/Server.cpp +++ b/disasterserver/Server.cpp @@ -204,6 +204,14 @@ void Server::broadcast_ex(Packet &packet, bool reliable, clientId ignore) { packet.sendBroadcast(*this, reliable, [ignore](const Client& v) { return v.getId() != ignore; }); } +size_t Server::getClientsInGameCount() { + return std::ranges::count_if(peers, + [](const auto& cl) { + return cl->isInGame(); + } + ); +} + void Server::send_message(Client &client, std::string message) { std::ranges::transform(message, message.begin(), [](const unsigned char c){ return std::tolower(c); }); Packet packet(PacketType::CLIENT_CHAT_MESSAGE); diff --git a/disasterserver/Server.hpp b/disasterserver/Server.hpp index 95125f4..998ff38 100644 --- a/disasterserver/Server.hpp +++ b/disasterserver/Server.hpp @@ -49,8 +49,8 @@ namespace DisasterServer void broadcast_ex(Packet &packet, bool reliable, clientId ignore); - - std::vector> &getPeers() { return peers; } + size_t getClientsInGameCount(); + std::vector> &getClients() { return peers; } GameStateController &getGameStateController(); double getDelta() { diff --git a/disasterserver/States/CharSelect.cpp b/disasterserver/States/CharSelect.cpp index 7beb22d..b9c987e 100644 --- a/disasterserver/States/CharSelect.cpp +++ b/disasterserver/States/CharSelect.cpp @@ -1,6 +1,5 @@ #include "CharSelect.hpp" -#include #include #include "Server.hpp" @@ -36,7 +35,7 @@ CharSelectState::CharSelectState(Server* server, GameStateController* controller bool CharSelectState::chooseExe() { uint32_t weight = 0; - for (auto& peer : server->getPeers()) { + for (auto& peer : server->getClients()) { if (!peer || !peer->isInGame()) continue; @@ -51,7 +50,7 @@ bool CharSelectState::chooseExe() { uint32_t rnd = static_cast(std::rand()) % weight; - for (auto& peer : server->getPeers()) { + for (auto& peer : server->getClients()) { if (!peer || !peer->isInGame()) continue; @@ -79,8 +78,8 @@ bool CharSelectState::chooseExe() { bool CharSelectState::checkState() { bool shouldStart = true; - for (auto& peer : server->getPeers()) { - if (!peer || !peer->isInGame()) + for (auto& peer : server->getClients()) { + if (!peer->isInGame()) continue; if (peer->getExeCharacter() == ExesCharacters::NONE && @@ -91,7 +90,7 @@ bool CharSelectState::checkState() { } if (shouldStart) { - controller->setState(States::LOBBY); + controller->setState(States::GAME); //Game start return true; } @@ -109,7 +108,6 @@ bool CharSelectState::init(int8_t selectedMap) { } map = selectedMap; - controller->setState(States::CHARSELECT); countdownSec = 30; @@ -239,7 +237,7 @@ void CharSelectState::tick() { countdown += TICKSPERSEC; if (--countdownSec == 0) { - for (auto& peer : server->getPeers()) { + for (auto& peer : server->getClients()) { if (!peer || !peer->isInGame()) continue; @@ -273,15 +271,8 @@ bool CharSelectState::leaved(Client& client) { } } - const size_t inGame = std::ranges::count_if(server->getPeers(), - [](const auto& cl) { - return cl->isInGame(); - } - ); - - if (inGame <= 1 || client.getId() == exe) { - controller->setState(States::LOBBY); - return true; + if (this->server->getClientsInGameCount() <= 1 || client.getId() == exe) { + return controller->getLobbyState().init(); } return checkState(); diff --git a/disasterserver/States/CharSelect.hpp b/disasterserver/States/CharSelect.hpp index 3cfb40c..ad7416a 100644 --- a/disasterserver/States/CharSelect.hpp +++ b/disasterserver/States/CharSelect.hpp @@ -4,7 +4,7 @@ #include #include -#include "State.hpp" +#include "Client.hpp" #include "Core/Packet.hpp" namespace DisasterServer { @@ -32,12 +32,10 @@ class CharSelectState { bool init(int8_t map); - void tick(); - - bool handle(Client& client, Packet& packet); - bool joined(Client& client); bool leaved(Client& client); + void tick(); + bool handle(Client& client, Packet& packet); clientId getExe() const { return exe; } int8_t getMap() const { return map; } diff --git a/disasterserver/States/LobbyState.cpp b/disasterserver/States/LobbyState.cpp index 87583a4..4b9dc53 100644 --- a/disasterserver/States/LobbyState.cpp +++ b/disasterserver/States/LobbyState.cpp @@ -14,7 +14,7 @@ LobbyState::LobbyState(Server *server, GameStateController *controller) : server LobbyState::~LobbyState() = default; bool LobbyState::init() { - for (auto &peer : server->getPeers()) { + for (auto &peer : server->getClients()) { peer->setReady(false); peer->setVoted(false); peer->setTimeout(0); @@ -61,7 +61,7 @@ bool LobbyState::sendCountdown() { } bool LobbyState::checkCountdown() { - const auto players = &server->getPeers(); + const auto players = &server->getClients(); if (players->size() <= 1) { return true; @@ -145,7 +145,7 @@ bool LobbyState::leaved(Client &peer) { bool LobbyState::tick() { switch (controller->getCurrentState()) { case States::LOBBY: { - for (auto &peer : server->getPeers()) { + for (auto &peer : server->getClients()) { if (peer->getVoteCooldown() > 0) { peer->setVoteCooldown(peer->getVoteCooldown() - server->getDelta()); } @@ -205,7 +205,7 @@ bool LobbyState::handle(Client &client, Packet &packet) { switch (packet.getPacketType()) { case PacketType::CLIENT_LOBBY_PLAYERS_REQUEST: { - for (auto &c : server->getPeers()) { + for (auto &c : server->getClients()) { if (client.getId() == c->getId()) { continue; } @@ -380,7 +380,7 @@ bool LobbyState::handle(Client &client, Packet &packet) { break; } - if (this->server->getPeers().size() > 2) { + if (this->server->getClients().size() > 2) { Packet pack(PacketType::SERVER_LOBBY_CHOOSEVOTEKICK); pack.send(client, true); } else { @@ -439,7 +439,7 @@ bool LobbyState::handle(Client &client, Packet &packet) { break; } else { bool found = false; - for (auto &c : this->server->getPeers()) { + for (auto &c : this->server->getClients()) { if (c->getId() == pid) { if (c->isOpped()) { diff --git a/disasterserver/States/State.hpp b/disasterserver/States/State.hpp deleted file mode 100644 index d884425..0000000 --- a/disasterserver/States/State.hpp +++ /dev/null @@ -1,36 +0,0 @@ - -#ifndef DISASTERSERVER_STATE_HPP -#define DISASTERSERVER_STATE_HPP - -#include "Client.hpp" - -namespace DisasterServer -{ - template - class State { - protected: - Server *server = nullptr; - public: - explicit State(Server *server) { - this->server = server; - } - - virtual ~State() { - server = nullptr; - } - - virtual bool joined(Client &peer) { - return true; - } - - virtual void tick() { - - } - - virtual bool handle(Client &peer, Packet &packet) { - return true; - } - }; -} - -#endif //DISASTERSERVER_STATE_HPP diff --git a/disasterserver/States/Vote.cpp b/disasterserver/States/Vote.cpp index 13492c4..70582f4 100644 --- a/disasterserver/States/Vote.cpp +++ b/disasterserver/States/Vote.cpp @@ -14,10 +14,10 @@ Vote::~Vote() = default; bool Vote::init(VoteType type, clientId id) { ongoing = false; votes.clear(); - auto &players = server->getPeers(); + auto &players = server->getClients(); this->type = type; - for (auto &c: server->getPeers()) { + for (auto &c: server->getClients()) { c->setCanVote(c->getId() != id); } this->votedTotal = std::ranges::count_if(players, [](const auto& peer) { return peer->isCanVote(); }); From 03d5cdbf3aa00e6229bb36334a2dd606dc36b469 Mon Sep 17 00:00:00 2001 From: MilesGlitch Date: Mon, 7 Sep 2026 22:35:39 +0300 Subject: [PATCH 20/61] Update --- disasterserver/Client.hpp | 16 ++++++++++++++++ disasterserver/States/CharSelect.cpp | 23 +---------------------- 2 files changed, 17 insertions(+), 22 deletions(-) diff --git a/disasterserver/Client.hpp b/disasterserver/Client.hpp index 92f7696..12576eb 100644 --- a/disasterserver/Client.hpp +++ b/disasterserver/Client.hpp @@ -29,6 +29,22 @@ namespace DisasterServer COUNT }; + constexpr std::array EXE_NAMES = { + "Classic Exe", + "Chaos", + "Exetior", + "Exeller" + }; + + constexpr std::array SURV_NAMES = { + "Tails", + "Knuckles", + "Eggman", + "Amy", + "Cream", + "Sally" + }; + enum class DisconnectReason { FAILEDTOCONNECT, diff --git a/disasterserver/States/CharSelect.cpp b/disasterserver/States/CharSelect.cpp index b9c987e..64c8ee0 100644 --- a/disasterserver/States/CharSelect.cpp +++ b/disasterserver/States/CharSelect.cpp @@ -7,27 +7,7 @@ #include "GameStateController.hpp" #include "Core/Colors.hpp" -namespace DisasterServer { - -namespace { - -constexpr std::array EXE_NAMES = { - "Classic Exe", - "Chaos", - "Exetior", - "Exeller" -}; - -constexpr std::array SURV_NAMES = { - "Tails", - "Knuckles", - "Eggman", - "Amy", - "Cream", - "Sally" -}; - -} +using namespace DisasterServer; CharSelectState::CharSelectState(Server* server, GameStateController* controller) : server(server), controller(controller) { } @@ -276,5 +256,4 @@ bool CharSelectState::leaved(Client& client) { } return checkState(); -} } \ No newline at end of file From c84267cc00da30f1bd65a45a75682ddcb29dbd5f Mon Sep 17 00:00:00 2001 From: FakerNull0 Date: Tue, 8 Sep 2026 00:46:15 +0300 Subject: [PATCH 21/61] aa --- .envrc | 1 + .gitignore | 7 + .gitmodules | 6 + CMakeLists.txt | 69 + CMakePresets.json | 111 + CppProperties.json | 21 + LICENSE.md | 7 + README.md | 7 + build_android.sh | 30 + disasterserver/CMakeLists.txt | 135 + disasterserver/Client.cpp | 187 + disasterserver/Client.hpp | 175 + disasterserver/Core/Api.hpp | 11 + disasterserver/Core/Colors.hpp | 18 + disasterserver/Core/Exceptions.hpp | 24 + disasterserver/Core/Log.cpp | 193 + disasterserver/Core/Log.hpp | 126 + disasterserver/Core/Packet.cpp | 108 + disasterserver/Core/Packet.hpp | 385 + disasterserver/Core/Singleton.hpp | 22 + disasterserver/Core/Time.cpp | 48 + disasterserver/Core/Time.hpp | 14 + disasterserver/GameStateController.cpp | 212 + disasterserver/GameStateController.hpp | 64 + disasterserver/Main.cpp | 32 + disasterserver/Server.cpp | 232 + disasterserver/Server.hpp | 62 + disasterserver/States/CharSelect.cpp | 259 + disasterserver/States/CharSelect.hpp | 46 + disasterserver/States/LobbyState.cpp | 485 + disasterserver/States/LobbyState.hpp | 51 + disasterserver/States/Vote.cpp | 64 + disasterserver/States/Vote.hpp | 52 + disasterserver_c/Android.c | 15 + disasterserver_c/Android.h | 20 + disasterserver_c/Api.h | 10 + disasterserver_c/Auth.c | 102 + disasterserver_c/Auth.h | 19 + disasterserver_c/CMakeLists.txt | 174 + disasterserver_c/CMath.c | 21 + disasterserver_c/CMath.h | 17 + disasterserver_c/Colors.h | 16 + disasterserver_c/Config.c | 446 + disasterserver_c/Config.h | 65 + disasterserver_c/DyList.c | 79 + disasterserver_c/DyList.h | 17 + disasterserver_c/Lib.c | 272 + disasterserver_c/Lib.h | 59 + disasterserver_c/Log.c | 155 + disasterserver_c/Log.h | 65 + disasterserver_c/Main.c | 10 + disasterserver_c/Maps.c | 97 + disasterserver_c/Maps.h | 32 + disasterserver_c/Packet.c | 480 + disasterserver_c/Packet.h | 220 + disasterserver_c/Palette.c | 203 + disasterserver_c/Palette.h | 9 + disasterserver_c/Player.c | 42 + disasterserver_c/Player.h | 83 + disasterserver_c/Server.c | 966 + disasterserver_c/Server.h | 216 + disasterserver_c/States.h | 75 + disasterserver_c/UTF8.c | 76 + disasterserver_c/UTF8.h | 12 + disasterserver_c/Vote.c | 58 + disasterserver_c/Vote.h | 35 + disasterserver_c/Zone.c | 1392 ++ disasterserver_c/Zone.h | 14 + disasterserver_c/cJSON.c | 3119 +++ disasterserver_c/cJSON.h | 300 + disasterserver_c/entities/Act9Wall.c | 89 + disasterserver_c/entities/Act9Wall.h | 17 + disasterserver_c/entities/BlackRing.c | 35 + disasterserver_c/entities/BlackRing.h | 16 + disasterserver_c/entities/CreamRing.c | 34 + disasterserver_c/entities/CreamRing.h | 17 + disasterserver_c/entities/DTBall.c | 29 + disasterserver_c/entities/DTBall.h | 16 + disasterserver_c/entities/DTStalactits.c | 113 + disasterserver_c/entities/DTStalactits.h | 23 + disasterserver_c/entities/Dummy.c | 24 + disasterserver_c/entities/Dummy.h | 17 + disasterserver_c/entities/EggmanTracker.c | 28 + disasterserver_c/entities/EggmanTracker.h | 16 + disasterserver_c/entities/ExellerClone.c | 23 + disasterserver_c/entities/ExellerClone.h | 17 + disasterserver_c/entities/HDDoor.c | 42 + disasterserver_c/entities/HDDoor.h | 18 + disasterserver_c/entities/HillThunder.c | 30 + disasterserver_c/entities/HillThunder.h | 16 + disasterserver_c/entities/KAFSpeedBox.c | 55 + disasterserver_c/entities/KAFSpeedBox.h | 20 + disasterserver_c/entities/LCChain.c | 55 + disasterserver_c/entities/LCChain.h | 22 + disasterserver_c/entities/LCEye.c | 51 + disasterserver_c/entities/LCEye.h | 25 + disasterserver_c/entities/MJAss.c | 22 + disasterserver_c/entities/MJAss.h | 16 + disasterserver_c/entities/MJJudger.c | 42 + disasterserver_c/entities/MJJudger.h | 21 + disasterserver_c/entities/MJLava.c | 92 + disasterserver_c/entities/MJLava.h | 27 + disasterserver_c/entities/NAPIce.c | 40 + disasterserver_c/entities/NAPIce.h | 20 + disasterserver_c/entities/NAPSnowball.c | 104 + disasterserver_c/entities/NAPSnowball.h | 31 + disasterserver_c/entities/NotPerfect.c | 58 + disasterserver_c/entities/NotPerfect.h | 22 + disasterserver_c/entities/PFLift.c | 89 + disasterserver_c/entities/PFLift.h | 24 + disasterserver_c/entities/RMZShard.c | 16 + disasterserver_c/entities/RMZShard.h | 15 + disasterserver_c/entities/RMZSlug.c | 156 + disasterserver_c/entities/RMZSlug.h | 45 + disasterserver_c/entities/Ring.c | 54 + disasterserver_c/entities/Ring.h | 17 + disasterserver_c/entities/SpkieController.c | 24 + disasterserver_c/entities/SpkieController.h | 16 + disasterserver_c/entities/TCAcid.c | 25 + disasterserver_c/entities/TCAcid.h | 17 + disasterserver_c/entities/TailsDoll.c | 251 + disasterserver_c/entities/TailsDoll.h | 25 + disasterserver_c/entities/TailsProjectile.c | 65 + disasterserver_c/entities/TailsProjectile.h | 23 + disasterserver_c/entities/VVLava.c | 93 + disasterserver_c/entities/VVLava.h | 28 + disasterserver_c/entities/VVVase.h | 14 + disasterserver_c/entities/WDLatern.c | 42 + disasterserver_c/entities/WDLatern.h | 19 + disasterserver_c/entities/YouCantRun.c | 49 + disasterserver_c/entities/YouCantRun.h | 22 + disasterserver_c/io/Dir.h | 12 + disasterserver_c/io/Packet.c | 440 + disasterserver_c/io/Packet.h | 209 + disasterserver_c/io/Socket.h | 35 + disasterserver_c/io/TcpListener.c | 90 + disasterserver_c/io/TcpListener.h | 51 + disasterserver_c/io/Threads.h | 54 + disasterserver_c/io/Time.c | 49 + disasterserver_c/io/Time.h | 15 + disasterserver_c/io/UdpListener.c | 30 + disasterserver_c/io/UdpListener.h | 34 + disasterserver_c/maps/Act9.c | 14 + disasterserver_c/maps/Act9.h | 7 + disasterserver_c/maps/DarkTower.c | 58 + disasterserver_c/maps/DarkTower.h | 8 + disasterserver_c/maps/DotDotDot.c | 12 + disasterserver_c/maps/DotDotDot.h | 7 + disasterserver_c/maps/FartZone.c | 45 + disasterserver_c/maps/FartZone.h | 8 + disasterserver_c/maps/HauntingDream.c | 34 + disasterserver_c/maps/HauntingDream.h | 8 + disasterserver_c/maps/HideAndSeek.c | 10 + disasterserver_c/maps/HideAndSeek2.h | 7 + disasterserver_c/maps/Hill.c | 14 + disasterserver_c/maps/Hill.h | 7 + disasterserver_c/maps/KindAndFair.c | 39 + disasterserver_c/maps/KindAndFair.h | 8 + disasterserver_c/maps/LimpCity.c | 65 + disasterserver_c/maps/LimpCity.h | 8 + disasterserver_c/maps/MajinForest.c | 9 + disasterserver_c/maps/MajinForest.h | 7 + disasterserver_c/maps/Marijuna.c | 16 + disasterserver_c/maps/Marijuna.h | 7 + disasterserver_c/maps/NastyParadise.c | 72 + disasterserver_c/maps/NastyParadise.h | 8 + disasterserver_c/maps/NotPerfect.c | 11 + disasterserver_c/maps/NotPerfect.h | 7 + disasterserver_c/maps/PricelessFreedom.c | 48 + disasterserver_c/maps/PricelessFreedom.h | 8 + disasterserver_c/maps/RavineMist.c | 213 + disasterserver_c/maps/RavineMist.h | 10 + disasterserver_c/maps/TortureCave.c | 11 + disasterserver_c/maps/TortureCave.h | 7 + disasterserver_c/maps/VolcanoValley.c | 61 + disasterserver_c/maps/VolcanoValley.h | 8 + disasterserver_c/maps/WoodDream.c | 10 + disasterserver_c/maps/WoodDream.h | 7 + disasterserver_c/maps/YouCantRun.c | 14 + disasterserver_c/maps/YouCantRun.h | 7 + disasterserver_c/states/CharSelect.c | 296 + disasterserver_c/states/Game.c | 1809 ++ disasterserver_c/states/Lobby.c | 694 + disasterserver_c/states/Mapvote.c | 261 + disasterserver_c/states/Results.c | 243 + disasterserver_c/ui/Button.c | 40 + disasterserver_c/ui/Components.h | 138 + disasterserver_c/ui/Image.c | 12 + disasterserver_c/ui/Label.c | 185 + disasterserver_c/ui/Main.c | 594 + disasterserver_c/ui/Main.h | 15 + disasterserver_c/ui/MapList.c | 77 + disasterserver_c/ui/MapListPreset.c | 71 + disasterserver_c/ui/PingPreset.c | 113 + disasterserver_c/ui/PlayerList.c | 261 + disasterserver_c/ui/Presets.c | 16 + disasterserver_c/ui/Presets.h | 19 + disasterserver_c/ui/Resources.c | 31 + disasterserver_c/ui/Resources.h | 17 + disasterserver_c/ui/Spritesheet.h | 17954 ++++++++++++++++++ disasterserver_c/ui/TButton.c | 52 + resources/Spritesheet.png | Bin 0 -> 215407 bytes resources/icon.ico | Bin 0 -> 204862 bytes resources/icon.rc | 1 + resources/isiskdjdnd.png | Bin 0 -> 804 bytes shell.nix | 5 + thirdparty/cjson/CMakeLists.txt | 8 + thirdparty/cjson/cJSON.c | 3191 ++++ thirdparty/cjson/cJSON.h | 308 + thirdparty/cjson/cJSON_Utils.c | 1481 ++ thirdparty/cjson/cJSON_Utils.h | 88 + thirdparty/enet/.github/workflows/cmake.yml | 21 + thirdparty/enet/CMakeLists.txt | 103 + thirdparty/enet/ChangeLog | 209 + thirdparty/enet/Doxyfile | 2303 +++ thirdparty/enet/DoxygenLayout.xml | 191 + thirdparty/enet/LICENSE | 7 + thirdparty/enet/Makefile.am | 22 + thirdparty/enet/README | 15 + thirdparty/enet/callbacks.c | 53 + thirdparty/enet/compress.c | 654 + thirdparty/enet/configure.ac | 28 + thirdparty/enet/docs/FAQ.dox | 24 + thirdparty/enet/docs/design.dox | 126 + thirdparty/enet/docs/install.dox | 63 + thirdparty/enet/docs/license.dox | 26 + thirdparty/enet/docs/mainpage.dox | 59 + thirdparty/enet/docs/tutorial.dox | 366 + thirdparty/enet/enet.dsp | 168 + thirdparty/enet/enet_dll.cbp | 86 + thirdparty/enet/host.c | 503 + thirdparty/enet/include/enet/callbacks.h | 27 + thirdparty/enet/include/enet/enet.h | 616 + thirdparty/enet/include/enet/list.h | 43 + thirdparty/enet/include/enet/protocol.h | 198 + thirdparty/enet/include/enet/time.h | 18 + thirdparty/enet/include/enet/types.h | 13 + thirdparty/enet/include/enet/unix.h | 48 + thirdparty/enet/include/enet/utility.h | 13 + thirdparty/enet/include/enet/win32.h | 59 + thirdparty/enet/libenet.pc.in | 10 + thirdparty/enet/list.c | 75 + thirdparty/enet/m4/.keep | 0 thirdparty/enet/packet.c | 158 + thirdparty/enet/peer.c | 1027 + thirdparty/enet/premake4.lua | 59 + thirdparty/enet/protocol.c | 1919 ++ thirdparty/enet/unix.c | 624 + thirdparty/enet/win32.c | 454 + vcpkg-configuration.json | 7 + vcpkg.json | 7 + 251 files changed, 55028 insertions(+) create mode 100644 .envrc create mode 100644 .gitignore create mode 100644 .gitmodules create mode 100644 CMakeLists.txt create mode 100644 CMakePresets.json create mode 100644 CppProperties.json create mode 100644 LICENSE.md create mode 100644 README.md create mode 100644 build_android.sh create mode 100644 disasterserver/CMakeLists.txt create mode 100644 disasterserver/Client.cpp create mode 100644 disasterserver/Client.hpp create mode 100644 disasterserver/Core/Api.hpp create mode 100644 disasterserver/Core/Colors.hpp create mode 100644 disasterserver/Core/Exceptions.hpp create mode 100644 disasterserver/Core/Log.cpp create mode 100644 disasterserver/Core/Log.hpp create mode 100644 disasterserver/Core/Packet.cpp create mode 100644 disasterserver/Core/Packet.hpp create mode 100644 disasterserver/Core/Singleton.hpp create mode 100644 disasterserver/Core/Time.cpp create mode 100644 disasterserver/Core/Time.hpp create mode 100644 disasterserver/GameStateController.cpp create mode 100644 disasterserver/GameStateController.hpp create mode 100644 disasterserver/Main.cpp create mode 100644 disasterserver/Server.cpp create mode 100644 disasterserver/Server.hpp create mode 100644 disasterserver/States/CharSelect.cpp create mode 100644 disasterserver/States/CharSelect.hpp create mode 100644 disasterserver/States/LobbyState.cpp create mode 100644 disasterserver/States/LobbyState.hpp create mode 100644 disasterserver/States/Vote.cpp create mode 100644 disasterserver/States/Vote.hpp create mode 100644 disasterserver_c/Android.c create mode 100644 disasterserver_c/Android.h create mode 100644 disasterserver_c/Api.h create mode 100644 disasterserver_c/Auth.c create mode 100644 disasterserver_c/Auth.h create mode 100644 disasterserver_c/CMakeLists.txt create mode 100644 disasterserver_c/CMath.c create mode 100644 disasterserver_c/CMath.h create mode 100644 disasterserver_c/Colors.h create mode 100644 disasterserver_c/Config.c create mode 100644 disasterserver_c/Config.h create mode 100644 disasterserver_c/DyList.c create mode 100644 disasterserver_c/DyList.h create mode 100644 disasterserver_c/Lib.c create mode 100644 disasterserver_c/Lib.h create mode 100644 disasterserver_c/Log.c create mode 100644 disasterserver_c/Log.h create mode 100644 disasterserver_c/Main.c create mode 100644 disasterserver_c/Maps.c create mode 100644 disasterserver_c/Maps.h create mode 100644 disasterserver_c/Packet.c create mode 100644 disasterserver_c/Packet.h create mode 100644 disasterserver_c/Palette.c create mode 100644 disasterserver_c/Palette.h create mode 100644 disasterserver_c/Player.c create mode 100644 disasterserver_c/Player.h create mode 100644 disasterserver_c/Server.c create mode 100644 disasterserver_c/Server.h create mode 100644 disasterserver_c/States.h create mode 100644 disasterserver_c/UTF8.c create mode 100644 disasterserver_c/UTF8.h create mode 100644 disasterserver_c/Vote.c create mode 100644 disasterserver_c/Vote.h create mode 100644 disasterserver_c/Zone.c create mode 100644 disasterserver_c/Zone.h create mode 100644 disasterserver_c/cJSON.c create mode 100644 disasterserver_c/cJSON.h create mode 100644 disasterserver_c/entities/Act9Wall.c create mode 100644 disasterserver_c/entities/Act9Wall.h create mode 100644 disasterserver_c/entities/BlackRing.c create mode 100644 disasterserver_c/entities/BlackRing.h create mode 100644 disasterserver_c/entities/CreamRing.c create mode 100644 disasterserver_c/entities/CreamRing.h create mode 100644 disasterserver_c/entities/DTBall.c create mode 100644 disasterserver_c/entities/DTBall.h create mode 100644 disasterserver_c/entities/DTStalactits.c create mode 100644 disasterserver_c/entities/DTStalactits.h create mode 100644 disasterserver_c/entities/Dummy.c create mode 100644 disasterserver_c/entities/Dummy.h create mode 100644 disasterserver_c/entities/EggmanTracker.c create mode 100644 disasterserver_c/entities/EggmanTracker.h create mode 100644 disasterserver_c/entities/ExellerClone.c create mode 100644 disasterserver_c/entities/ExellerClone.h create mode 100644 disasterserver_c/entities/HDDoor.c create mode 100644 disasterserver_c/entities/HDDoor.h create mode 100644 disasterserver_c/entities/HillThunder.c create mode 100644 disasterserver_c/entities/HillThunder.h create mode 100644 disasterserver_c/entities/KAFSpeedBox.c create mode 100644 disasterserver_c/entities/KAFSpeedBox.h create mode 100644 disasterserver_c/entities/LCChain.c create mode 100644 disasterserver_c/entities/LCChain.h create mode 100644 disasterserver_c/entities/LCEye.c create mode 100644 disasterserver_c/entities/LCEye.h create mode 100644 disasterserver_c/entities/MJAss.c create mode 100644 disasterserver_c/entities/MJAss.h create mode 100644 disasterserver_c/entities/MJJudger.c create mode 100644 disasterserver_c/entities/MJJudger.h create mode 100644 disasterserver_c/entities/MJLava.c create mode 100644 disasterserver_c/entities/MJLava.h create mode 100644 disasterserver_c/entities/NAPIce.c create mode 100644 disasterserver_c/entities/NAPIce.h create mode 100644 disasterserver_c/entities/NAPSnowball.c create mode 100644 disasterserver_c/entities/NAPSnowball.h create mode 100644 disasterserver_c/entities/NotPerfect.c create mode 100644 disasterserver_c/entities/NotPerfect.h create mode 100644 disasterserver_c/entities/PFLift.c create mode 100644 disasterserver_c/entities/PFLift.h create mode 100644 disasterserver_c/entities/RMZShard.c create mode 100644 disasterserver_c/entities/RMZShard.h create mode 100644 disasterserver_c/entities/RMZSlug.c create mode 100644 disasterserver_c/entities/RMZSlug.h create mode 100644 disasterserver_c/entities/Ring.c create mode 100644 disasterserver_c/entities/Ring.h create mode 100644 disasterserver_c/entities/SpkieController.c create mode 100644 disasterserver_c/entities/SpkieController.h create mode 100644 disasterserver_c/entities/TCAcid.c create mode 100644 disasterserver_c/entities/TCAcid.h create mode 100644 disasterserver_c/entities/TailsDoll.c create mode 100644 disasterserver_c/entities/TailsDoll.h create mode 100644 disasterserver_c/entities/TailsProjectile.c create mode 100644 disasterserver_c/entities/TailsProjectile.h create mode 100644 disasterserver_c/entities/VVLava.c create mode 100644 disasterserver_c/entities/VVLava.h create mode 100644 disasterserver_c/entities/VVVase.h create mode 100644 disasterserver_c/entities/WDLatern.c create mode 100644 disasterserver_c/entities/WDLatern.h create mode 100644 disasterserver_c/entities/YouCantRun.c create mode 100644 disasterserver_c/entities/YouCantRun.h create mode 100644 disasterserver_c/io/Dir.h create mode 100644 disasterserver_c/io/Packet.c create mode 100644 disasterserver_c/io/Packet.h create mode 100644 disasterserver_c/io/Socket.h create mode 100644 disasterserver_c/io/TcpListener.c create mode 100644 disasterserver_c/io/TcpListener.h create mode 100644 disasterserver_c/io/Threads.h create mode 100644 disasterserver_c/io/Time.c create mode 100644 disasterserver_c/io/Time.h create mode 100644 disasterserver_c/io/UdpListener.c create mode 100644 disasterserver_c/io/UdpListener.h create mode 100644 disasterserver_c/maps/Act9.c create mode 100644 disasterserver_c/maps/Act9.h create mode 100644 disasterserver_c/maps/DarkTower.c create mode 100644 disasterserver_c/maps/DarkTower.h create mode 100644 disasterserver_c/maps/DotDotDot.c create mode 100644 disasterserver_c/maps/DotDotDot.h create mode 100644 disasterserver_c/maps/FartZone.c create mode 100644 disasterserver_c/maps/FartZone.h create mode 100644 disasterserver_c/maps/HauntingDream.c create mode 100644 disasterserver_c/maps/HauntingDream.h create mode 100644 disasterserver_c/maps/HideAndSeek.c create mode 100644 disasterserver_c/maps/HideAndSeek2.h create mode 100644 disasterserver_c/maps/Hill.c create mode 100644 disasterserver_c/maps/Hill.h create mode 100644 disasterserver_c/maps/KindAndFair.c create mode 100644 disasterserver_c/maps/KindAndFair.h create mode 100644 disasterserver_c/maps/LimpCity.c create mode 100644 disasterserver_c/maps/LimpCity.h create mode 100644 disasterserver_c/maps/MajinForest.c create mode 100644 disasterserver_c/maps/MajinForest.h create mode 100644 disasterserver_c/maps/Marijuna.c create mode 100644 disasterserver_c/maps/Marijuna.h create mode 100644 disasterserver_c/maps/NastyParadise.c create mode 100644 disasterserver_c/maps/NastyParadise.h create mode 100644 disasterserver_c/maps/NotPerfect.c create mode 100644 disasterserver_c/maps/NotPerfect.h create mode 100644 disasterserver_c/maps/PricelessFreedom.c create mode 100644 disasterserver_c/maps/PricelessFreedom.h create mode 100644 disasterserver_c/maps/RavineMist.c create mode 100644 disasterserver_c/maps/RavineMist.h create mode 100644 disasterserver_c/maps/TortureCave.c create mode 100644 disasterserver_c/maps/TortureCave.h create mode 100644 disasterserver_c/maps/VolcanoValley.c create mode 100644 disasterserver_c/maps/VolcanoValley.h create mode 100644 disasterserver_c/maps/WoodDream.c create mode 100644 disasterserver_c/maps/WoodDream.h create mode 100644 disasterserver_c/maps/YouCantRun.c create mode 100644 disasterserver_c/maps/YouCantRun.h create mode 100644 disasterserver_c/states/CharSelect.c create mode 100644 disasterserver_c/states/Game.c create mode 100644 disasterserver_c/states/Lobby.c create mode 100644 disasterserver_c/states/Mapvote.c create mode 100644 disasterserver_c/states/Results.c create mode 100644 disasterserver_c/ui/Button.c create mode 100644 disasterserver_c/ui/Components.h create mode 100644 disasterserver_c/ui/Image.c create mode 100644 disasterserver_c/ui/Label.c create mode 100644 disasterserver_c/ui/Main.c create mode 100644 disasterserver_c/ui/Main.h create mode 100644 disasterserver_c/ui/MapList.c create mode 100644 disasterserver_c/ui/MapListPreset.c create mode 100644 disasterserver_c/ui/PingPreset.c create mode 100644 disasterserver_c/ui/PlayerList.c create mode 100644 disasterserver_c/ui/Presets.c create mode 100644 disasterserver_c/ui/Presets.h create mode 100644 disasterserver_c/ui/Resources.c create mode 100644 disasterserver_c/ui/Resources.h create mode 100644 disasterserver_c/ui/Spritesheet.h create mode 100644 disasterserver_c/ui/TButton.c create mode 100644 resources/Spritesheet.png create mode 100644 resources/icon.ico create mode 100644 resources/icon.rc create mode 100644 resources/isiskdjdnd.png create mode 100644 shell.nix create mode 100644 thirdparty/cjson/CMakeLists.txt create mode 100644 thirdparty/cjson/cJSON.c create mode 100644 thirdparty/cjson/cJSON.h create mode 100644 thirdparty/cjson/cJSON_Utils.c create mode 100644 thirdparty/cjson/cJSON_Utils.h create mode 100644 thirdparty/enet/.github/workflows/cmake.yml create mode 100644 thirdparty/enet/CMakeLists.txt create mode 100644 thirdparty/enet/ChangeLog create mode 100644 thirdparty/enet/Doxyfile create mode 100644 thirdparty/enet/DoxygenLayout.xml create mode 100644 thirdparty/enet/LICENSE create mode 100644 thirdparty/enet/Makefile.am create mode 100644 thirdparty/enet/README create mode 100644 thirdparty/enet/callbacks.c create mode 100644 thirdparty/enet/compress.c create mode 100644 thirdparty/enet/configure.ac create mode 100644 thirdparty/enet/docs/FAQ.dox create mode 100644 thirdparty/enet/docs/design.dox create mode 100644 thirdparty/enet/docs/install.dox create mode 100644 thirdparty/enet/docs/license.dox create mode 100644 thirdparty/enet/docs/mainpage.dox create mode 100644 thirdparty/enet/docs/tutorial.dox create mode 100644 thirdparty/enet/enet.dsp create mode 100644 thirdparty/enet/enet_dll.cbp create mode 100644 thirdparty/enet/host.c create mode 100644 thirdparty/enet/include/enet/callbacks.h create mode 100644 thirdparty/enet/include/enet/enet.h create mode 100644 thirdparty/enet/include/enet/list.h create mode 100644 thirdparty/enet/include/enet/protocol.h create mode 100644 thirdparty/enet/include/enet/time.h create mode 100644 thirdparty/enet/include/enet/types.h create mode 100644 thirdparty/enet/include/enet/unix.h create mode 100644 thirdparty/enet/include/enet/utility.h create mode 100644 thirdparty/enet/include/enet/win32.h create mode 100644 thirdparty/enet/libenet.pc.in create mode 100644 thirdparty/enet/list.c create mode 100644 thirdparty/enet/m4/.keep create mode 100644 thirdparty/enet/packet.c create mode 100644 thirdparty/enet/peer.c create mode 100644 thirdparty/enet/premake4.lua create mode 100644 thirdparty/enet/protocol.c create mode 100644 thirdparty/enet/unix.c create mode 100644 thirdparty/enet/win32.c create mode 100644 vcpkg-configuration.json create mode 100644 vcpkg.json diff --git a/.envrc b/.envrc new file mode 100644 index 0000000..1d953f4 --- /dev/null +++ b/.envrc @@ -0,0 +1 @@ +use nix diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..0a52278 --- /dev/null +++ b/.gitignore @@ -0,0 +1,7 @@ +.vs/ +.vscode/ +.direnv/ +.idea/* +build/ +build_android/ +/.cache/clangd/index diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 0000000..2a011a2 --- /dev/null +++ b/.gitmodules @@ -0,0 +1,6 @@ +[submodule "thirdparty/SDL"] + path = thirdparty/SDL + url = https://github.com/MilesGlitch/SDL.git +[submodule "thirdparty/SDL_image"] + path = thirdparty/SDL_image + url = https://github.com/MilesGlitch/SDL_image.git diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000..a0e0a40 --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,69 @@ +cmake_minimum_required(VERSION 3.30) +project(DisasterServer CXX C) + +include(TestBigEndian) +TEST_BIG_ENDIAN(IS_BIG_ENDIAN) + +set(CMAKE_CXX_STANDARD 23) +set(CXX_STANDARD_REQUIRED ON) +set(CMAKE_CXX_EXTENSIONS ON) + +option(DYLIB "Builds dynamic library" OFF) +option(BUILD_UI "Builds UI using SDL" OFF) + +if(IS_BIG_ENDIAN) + add_compile_definitions(SYS_BIG_ENDIAN) +endif() + +if(DYLIB) + add_compile_definitions(SYS_DYLIB) +endif() + +if(BUILD_UI) + add_compile_definitions(SYS_USE_SDL2) +endif() + +if(ANDROID) + add_compile_definitions(SYS_ANDROID) +endif() + +if (BUILD_UI) + set(BUILD_SHARED_LIBS OFF) + set(SDL_STATIC ON) + set(SDL_SHARED OFF) + set(SDL_DISABLE_INSTALL ON) + set(SDLIMAGE_VENDORED ON) + set(SDLIMAGE_DEPS_SHARED OFF) + set(SDLIMAGE_INSTALL OFF) + set(SDLIMAGE_BACKEND_STB OFF) + set(SDLIMAGE_BACKEND_WIC OFF) + set(SDLIMAGE_BACKEND_IMAGEIO OFF) + set(SDLIMAGE_ANI OFF) + set(SDLIMAGE_PNG ON) + set(SDLIMAGE_PNG_LIBPNG OFF) + set(SDLIMAGE_AVIF OFF) + set(SDLIMAGE_BMP OFF) + set(SDLIMAGE_GIF OFF) + set(SDLIMAGE_JPG OFF) + set(SDLIMAGE_JXL OFF) + set(SDLIMAGE_LBM OFF) + set(SDLIMAGE_PCX OFF) + set(SDLIMAGE_PNM OFF) + set(SDLIMAGE_QOI OFF) + set(SDLIMAGE_SVG OFF) + set(SDLIMAGE_TGA OFF) + set(SDLIMAGE_TIF OFF) + set(SDLIMAGE_WEBP OFF) + set(SDLIMAGE_XCF OFF) + set(SDLIMAGE_XPM OFF) + set(SDLIMAGE_XV OFF) + + add_subdirectory(thirdparty/SDL) + add_subdirectory(thirdparty/SDL_image) +endif () + +add_subdirectory(thirdparty/enet) +add_subdirectory(thirdparty/cjson) + +add_subdirectory(disasterserver_c/) +add_subdirectory(disasterserver) \ No newline at end of file diff --git a/CMakePresets.json b/CMakePresets.json new file mode 100644 index 0000000..26872e5 --- /dev/null +++ b/CMakePresets.json @@ -0,0 +1,111 @@ +{ + "version": 3, + "configurePresets": [ + { + "name": "base", + "hidden": true, + "generator": "Ninja", + "toolchainFile": "$env{VCPKG_ROOT}/scripts/buildsystems/vcpkg.cmake", + "cacheVariables": { + "VCPKG_TARGET_TRIPLET": "x64-windows-static" + }, + "vendor": { + "microsoft.com/VisualStudioRemoteSettings/CMake/2.0": { + "sourceRootDir": "$ms{localSourceDir}\\..", + "remoteSourceRootDir": "$env{HOME}/.vs/wsl", + "copySourcesOptions": { + "method": "rsync", + "exclusionList": [ + ".vs", + ".git", + "out", + "dist", + "attic", + "build" + ] + } + } + } + }, + { + "inherits": "base", + "name": "windows-release", + "displayName": "Windows (Release)", + "binaryDir": "${sourceDir}/build/windows-release", + "installDir": "${sourceDir}/build/windows-release/install", + "cacheVariables": { + "CMAKE_BUILD_TYPE": "Release", + "CMAKE_C_COMPILER": "cl.exe", + "CMAKE_CXX_COMPILER": "cl.exe", + "CMAKE_MSVC_RUNTIME_LIBRARY": "MultiThreaded$<$:Debug>DLL" + }, + "vendor": { + "microsoft.com/VisualStudioSettings/CMake/1.0": { + "hostOS": [ + "Windows" + ] + } + } + }, + { + "inherits": "base", + "name": "windows-debug", + "displayName": "Windows (Debug)", + "binaryDir": "${sourceDir}/build/windows-debug", + "installDir": "${sourceDir}/build/windows-debug/install", + "cacheVariables": { + "CMAKE_BUILD_TYPE": "Debug", + "CMAKE_C_COMPILER": "cl.exe", + "CMAKE_CXX_COMPILER": "cl.exe", + "CMAKE_MSVC_RUNTIME_LIBRARY": "MultiThreaded$<$:Debug>DLL" + }, + "vendor": { + "microsoft.com/VisualStudioSettings/CMake/1.0": { + "hostOS": [ + "Windows" + ] + } + } + }, + { + "inherits": "base", + "name": "windows-clang-release", + "displayName": "Windows Clang (Release)", + "binaryDir": "${sourceDir}/build/windows-clang-release", + "installDir": "${sourceDir}/build/windows-clang-release/install", + "cacheVariables": { + "CMAKE_BUILD_TYPE": "Release", + "CMAKE_C_COMPILER": "clang.exe", + "CMAKE_CXX_COMPILER": "clang++.exe", + "CMAKE_MSVC_RUNTIME_LIBRARY": "MultiThreaded$<$:Debug>DLL" + }, + "vendor": { + "microsoft.com/VisualStudioSettings/CMake/1.0": { + "hostOS": [ + "Windows" + ] + } + } + }, + { + "inherits": "base", + "name": "windows-clang-debug", + "displayName": "Windows Clang (Debug)", + "binaryDir": "${sourceDir}/build/windows-clang-debug", + "installDir": "${sourceDir}/build/windows-clang-debug/install", + "cacheVariables": { + "CMAKE_BUILD_TYPE": "Debug", + "CMAKE_C_COMPILER": "clang.exe", + "CMAKE_CXX_COMPILER": "clang++.exe", + "CMAKE_MSVC_RUNTIME_LIBRARY": "MultiThreaded$<$:Debug>DLL" + }, + "vendor": { + "microsoft.com/VisualStudioSettings/CMake/1.0": { + "hostOS": [ + "Windows" + ] + } + } + } + ] +} \ No newline at end of file diff --git a/CppProperties.json b/CppProperties.json new file mode 100644 index 0000000..f598ba5 --- /dev/null +++ b/CppProperties.json @@ -0,0 +1,21 @@ +{ + "configurations": [ + { + "inheritEnvironments": [ + "msvc_x64" + ], + "name": "x64-Debug", + "includePath": [ + "${env.INCLUDE}", + "${workspaceRoot}\\**" + ], + "defines": [ + "WIN32", + "_DEBUG", + "UNICODE", + "_UNICODE" + ], + "intelliSenseMode": "windows-msvc-x64" + } + ] +} \ No newline at end of file diff --git a/LICENSE.md b/LICENSE.md new file mode 100644 index 0000000..5d3c2c9 --- /dev/null +++ b/LICENSE.md @@ -0,0 +1,7 @@ +Copyright 2024 Team Exe Empire + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/README.md b/README.md new file mode 100644 index 0000000..4c66027 --- /dev/null +++ b/README.md @@ -0,0 +1,7 @@ +# DisasterServer + +## Building source +```bash +git clone --recursive https://github.com/AX88M2/DisasterServer.git +cmake -S . -B build && cmake --build build +``` \ No newline at end of file diff --git a/build_android.sh b/build_android.sh new file mode 100644 index 0000000..0862a50 --- /dev/null +++ b/build_android.sh @@ -0,0 +1,30 @@ +# SDK +SDK="$LOCALAPPDATA/Android/Sdk" +NDK_VERSION="25.2.9519653" +CMAKE_VERSION="3.22.1" + +# Android +PLATFORM="android-19" +declare -a ABI=("armeabi-v7a" "arm64-v8a" "x86_64") + +if [ "$(expr substr $(uname -s) 1 5)" == "Linux" ]; then + OS_TYPE="linux-x86_64" + FILE_EXT="" +elif [ "$(expr substr $(uname -s) 1 10)" == "MINGW64_NT" ]; then + OS_TYPE="windows-x86_64" + FILE_EXT=".exe" +fi + +NDK="${SDK}/ndk/${NDK_VERSION}" +CMAKE="${SDK}/cmake/${CMAKE_VERSION}/bin/cmake${FILE_EXT}" +MAKE="${NDK}/prebuilt/${OS_TYPE}/bin/make${FILE_EXT}" +TOOLCHAIN="${NDK}/build/cmake/android.toolchain.cmake" + +echo "$CMAKE" + +for i in "${ABI[@]}" +do + echo "[] Building for $i..." + "${CMAKE}" -DCMAKE_TOOLCHAIN_FILE="${TOOLCHAIN}" -DANDROID_NDK="${NDK}" -DANDROID_ABI="$i" -DANDROID_PLATFORM="${PLATFORM}" -DCMAKE_MAKE_PROGRAM="${MAKE}" -G "Unix Makefiles" -B"build_android/$i" -H. + (cd "build_android/$i" && "${MAKE}" -j $(nproc)) +done \ No newline at end of file diff --git a/disasterserver/CMakeLists.txt b/disasterserver/CMakeLists.txt new file mode 100644 index 0000000..70ecefe --- /dev/null +++ b/disasterserver/CMakeLists.txt @@ -0,0 +1,135 @@ +set(COMPILER_OPTIONS + $<$: + /utf-8 + /MP + /W4 + /wd4100 # unreferenced formal parameter + /wd4457 # declaration of 'var' hides function parameter + /wd4458 # declaration of 'var' hides class member + /wd4459 # declaration of 'var' hides global declaration + /wd4101 # 'var': unreferenced local variable + /wd4388 # 'token' : signed/unsigned mismatch + /wd4018 # '>': signed/unsigned mismatch + > + $<$>: + -Wall + -Wextra + -Wpedantic + -finput-charset=UTF-8 + -fexec-charset=UTF-8 + > + $<$: + -Wall + -Wextra + -Wpedantic + -finput-charset=UTF-8 + -fexec-charset=UTF-8 + > +) + +file(GLOB_RECURSE SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/*.cpp) +# file(GLOB_RECURSE SOURCES CONFIGURE_DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/*.cpp) + + +if(ANDROID) + add_library(DisasterServerCXX SHARED "Android.cpp" ${SOURCES}) + + set(THREADS_PREFER_PTHREAD_FLAG ON) + find_package(Threads REQUIRED) + target_include_directories(DisasterServerCXX PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}) + target_compile_options(DisasterServer PRIVATE ${COMPILER_OPTIONS}) + target_link_libraries(DisasterServerCXX PRIVATE cJSON log enet m Threads::Threads) +else() + if(DYLIB) # Build .dll or .so + add_library(DisasterServerCXX SHARED ${SOURCES}) + + if (WIN32) + target_link_libraries(DisasterServerCXX PRIVATE cJSON enet ws2_32 winmm dbghelp) + else() # UNIX + set(THREADS_PREFER_PTHREAD_FLAG ON) + find_package(Threads REQUIRED) + target_link_libraries(DisasterServerCXX PRIVATE cJSON enet m Threads::Threads) + endif() + + target_compile_options(DisasterServer PRIVATE ${COMPILER_OPTIONS}) + target_include_directories(DisasterServerCXX PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}) + + else() # Build executable + if(BUILD_UI) + # set(UI_SOURCES + # "ui/Resources.c" + # "ui/Main.c" + # "ui/Image.c" + # "ui/Label.c" + # "ui/Button.c" + # "ui/TButton.c" + # "ui/MapList.c" + # "ui/Presets.c" + # "ui/MapListPreset.c" + # "ui/PingPreset.c" + # "ui/PlayerList.c" + # ) + + # if (WIN32) + # add_executable(DisasterServer + # ${SOURCES} + # ${UI_SOURCES} + # ) + + # target_link_libraries(DisasterServer PRIVATE + # ws2_32 + # enet + # winmm + # dbghelp + # SDL3-static + # SDL3_image::SDL3_image + # ) + + # target_include_directories(DisasterServer PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}) + + # target_sources(DisasterServer PRIVATE "${CMAKE_SOURCE_DIR}/resources/icon.rc") + + # else() # UNIX + # add_executable(DisasterServer + # ${SOURCES} + # ${UI_SOURCES} + # ) + + # set(THREADS_PREFER_PTHREAD_FLAG ON) + # find_package(Threads REQUIRED) + # target_link_libraries(DisasterServer PRIVATE enet m Threads::Threads + # SDL3::SDL3-static + # SDL3_image::SDL3_image + # ) + # endif() + + # target_include_directories(DisasterServer PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}) + + else() + add_executable(DisasterServerCXX + ${SOURCES} + Main.cpp + ) + + if (WIN32) + target_link_libraries(DisasterServerCXX PRIVATE cJSON enet ws2_32 winmm dbghelp) + else() # UNIX + set(THREADS_PREFER_PTHREAD_FLAG ON) + find_package(Threads REQUIRED) + target_link_libraries(DisasterServerCXX PRIVATE cJSON enet m Threads::Threads) + endif() + + target_compile_options(DisasterServer PRIVATE ${COMPILER_OPTIONS}) + target_include_directories(DisasterServerCXX PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}) + + endif() + endif() +endif() + + +if(MSVC) + add_definitions(-D_CRT_SECURE_NO_WARNINGS) +endif() + +unset(DYLIB CACHE) +unset(BUILD_UI CACHE) \ No newline at end of file diff --git a/disasterserver/Client.cpp b/disasterserver/Client.cpp new file mode 100644 index 0000000..ce8fd90 --- /dev/null +++ b/disasterserver/Client.cpp @@ -0,0 +1,187 @@ +#include "Client.hpp" + +#include + +#include "Server.hpp" +#include "Core/Log.hpp" +#include "Core/Packet.hpp" + +using namespace DisasterServer; + +Client::Client(Server *server, ENetPeer *peer, clientId incomingPeerID, std::string ip) : + id(incomingPeerID), + ip(std::move(ip)), + peer(peer), + server(server) {} + +Client::~Client() = default; + +bool Client::identity(Packet &packet) { + RAssert(id > 0); + + if (packet.getPacketType() != PacketType::IDENTITY) { + this->disconnect(DisconnectReason::OTHER, "type != IDENTITY?"); + return false; + } + + bool isBanned = false; + uint64_t timeout = 0; + + uint16_t build_version = packet.read(); + int32_t server_index = packet.read(); + std::string nickname = packet.readString(); + std::string udid = packet.readString(); + uint8_t lobby_icon = packet.read(); + int8_t pet = packet.read(); + + should_timeout = true; + mod_tool = false; + is_mobile = false; + this->nickname = nickname; + this->udid = udid; + this->lobby_icon = lobby_icon; + this->pet = pet; + + this->in_game = (server->getGameStateController().getCurrentState() == States::LOBBY); + this->exe_chance = 1 + rand() % 4; + + if (this->server->getClients().size() >= MAX_PLAYERS) { + this->disconnect(DisconnectReason::LOBBYFULL); + return false; + } + + if (build_version != BUILD_VERSION) { + this->disconnect(DisconnectReason::VERMISMATCH); + return false; + } + + if (nickname.length() >= 30) { + this->disconnect(DisconnectReason::OTHER, "Your nickname is too long! (30 characters max)"); + return false; + } + + if (udid.empty()) { + this->disconnect(DisconnectReason::OTHER, "whoops you have to put the CD in you conputer"); + return false; + } + + if (!identity_process(ip, isBanned, timeout, server_index == -1)) { + return false; + } + + Info("{} (id {}) joined.", nickname, id); + Info(" IP: {}", ip); + Info(" UID: {}", udid); + Info(" Modified: {}", BoolStringify(mod_tool)); + Info(" Mobile: {}", BoolStringify(is_mobile)); + + this->verified = true; + + return true; +} + +bool Client::identity_process(const std::string &addr, bool is_banned, uint64_t timeout, bool do_timeout) { + if (is_banned) { + Info("{} banned by host (id {}, ip {})", nickname, id, addr); + this->disconnect(DisconnectReason::BANNEDBYHOST); + return false; + } + + if (this->server->getClients().size() >= MAX_PLAYERS) { + this->disconnect(DisconnectReason::LOBBYFULL); + return false; + } + + if (do_timeout && timeout != 0) { + time_t tm = time(nullptr); + time_t val = timeout - tm; + if (val > 0) { + Info("{} is rate-limited (id {}, ip {})", nickname, id, addr); + this->disconnect(DisconnectReason::RATELIMITED); + return false; + } + } + + if (!this->server->getGameStateController().playerJoined(*this)) { + should_timeout = false; + this->disconnect(DisconnectReason::OTHER, "Report this to dev: 415 baza otvette, mi tonem"); + return false; + } + + Packet packet(PacketType::SERVER_IDENTITY_RESPONSE); + packet.write(server->getGameStateController().getCurrentState() == States::LOBBY); + packet.write(id); + packet.send(*this, true); + + // If in queue, do following + if (!in_game) { + + // For icons + for (auto &client : this->server->getClients()) { + if (client->getId() == id) { + continue; + } + + Packet pack(PacketType::SERVER_WAITING_PLAYER_INFO); + pack.write(server->getGameStateController().getCurrentState() == States::GAME && client->in_game); + pack.write(client->getId()); + pack.writeString(nickname); + + if (server->getGameStateController().getCurrentState() == States::GAME && client->in_game) { + + pack.write( 0 /* v->server->game.exe == peer->id */ ); + pack.write( 0 /* v->server->game.exe == peer->id ? peer->exe_char : peer->surv_char */); + + } else { + pack.write(lobby_icon); + } + + pack.send(*this, true); + } + + // For other players in queue + Packet pack(PacketType::SERVER_WAITING_PLAYER_INFO); + pack.write(0); + pack.write(id); + pack.writeString(nickname); + pack.write(lobby_icon); + this->server->broadcast_ex(pack, true, id); + + this->server->send_message(*this, "|build from &{} @{}~", __DATE__, __TIME__); + this->server->send_message(*this, "|type .help for command list~"); + } + + return true; +} + +bool Client::message_received(Packet &packet) { + if (id == 0) { + return false; + } + + return this->server->getGameStateController().handle(*this, packet); +} + +void Client::disconnect(DisconnectReason reason, const std::string &message) { + if (disconnecting) { + return; + } + + if (reason == DisconnectReason::OTHER && !message.empty()) { + Packet packet(PacketType::SERVER_PLAYER_FORCE_DISCONNECT); + packet.write(static_cast(reason)); + packet.writeString(message); + packet.send(*this, true); + enet_peer_disconnect_later(peer, static_cast(reason)); + } else { + enet_peer_disconnect(peer, static_cast(reason)); + } + + if (message.empty()) { + Info("Disconnected id {} {}: No text.", id, getDisconnectReasonName(reason)); + } else { + Info("Disconnected id {} {}: {}.", id, getDisconnectReasonName(reason), message); + } + + disconnecting = true; +} diff --git a/disasterserver/Client.hpp b/disasterserver/Client.hpp new file mode 100644 index 0000000..12576eb --- /dev/null +++ b/disasterserver/Client.hpp @@ -0,0 +1,175 @@ +#ifndef DISASTERSERVER_PEER_HPP +#define DISASTERSERVER_PEER_HPP + +#include "Core/Packet.hpp" + +namespace DisasterServer +{ + class Server; + + enum class SurvCharacters { + NONE = -1, + + TAILS, + KNUX, + EGGMAN, + AMY, + CREAM, + SALLY, + COUNT + }; + + enum class ExesCharacters { + NONE = -1, + + ORIGINAL, + CHAOS, + EXETIOR, + EXELLER, + COUNT + }; + + constexpr std::array EXE_NAMES = { + "Classic Exe", + "Chaos", + "Exetior", + "Exeller" + }; + + constexpr std::array SURV_NAMES = { + "Tails", + "Knuckles", + "Eggman", + "Amy", + "Cream", + "Sally" + }; + + enum class DisconnectReason + { + FAILEDTOCONNECT, + KICKEDBYHOST, + BANNEDBYHOST, + VERMISMATCH, + SERVERTIMEOUT, + PACKETSNOTRECV, + GAMESTARTED, + AFKTIMEOUT, + LOBBYFULL, + RATELIMITED, + SHUTDOWN, + IPINUSE, + + DONTREPORT = 254, + OTHER = 255 + }; + + inline std::string getDisconnectReasonName(DisconnectReason reason) { + switch (reason) { + case DisconnectReason::FAILEDTOCONNECT: return "FAILED TO CONNECT"; + case DisconnectReason::KICKEDBYHOST: return "KICKED BY HOST"; + case DisconnectReason::BANNEDBYHOST: return "BANNED BY HOST"; + case DisconnectReason::VERMISMATCH: return "VER MISMATCH"; + case DisconnectReason::SERVERTIMEOUT: return "SERVER TIMEOUT"; + case DisconnectReason::PACKETSNOTRECV: return "PACKET SNOT RECV"; + case DisconnectReason::GAMESTARTED: return "GAME STARTED"; + case DisconnectReason::AFKTIMEOUT: return "AFK TIMEOUT"; + case DisconnectReason::LOBBYFULL: return "LOBBY FULL"; + case DisconnectReason::RATELIMITED: return "RATE LIMITED"; + case DisconnectReason::SHUTDOWN: return "SHUTDOWN"; + case DisconnectReason::IPINUSE: return "IP IN USE"; + case DisconnectReason::DONTREPORT: return "DONT REPORT"; + case DisconnectReason::OTHER: return "OTHER"; + default: return ""; + } + } + + using clientId = uint16_t; + + class Client { + clientId id; + std::string ip; + ENetPeer *peer; + + /* General info */ + //Player plr; + std::string nickname = ""; + std::string udid; + uint8_t lobby_icon = 0; + int8_t pet = -1; + + bool verified = false; + bool in_game = false; + bool op = false; + bool ready = false; + bool mod_tool = false; + bool is_mobile = false; + bool can_vote = false; + bool voted = false; + bool disconnecting = false; + + struct AuthPeer { + uint32_t type = 0; + uint8_t one = 0; + uint8_t two = 0; + } auth = {}; + + /* Character */ + SurvCharacters survChar = SurvCharacters::NONE; + ExesCharacters exeChar = ExesCharacters::NONE; + + bool should_timeout = false; + + /* State info */ + uint8_t exe_chance = 0; + double timeout = 0; + double vote_cooldown = 0; + + Server *server = nullptr; + public: + Client(Server *server, ENetPeer *peer, clientId incomingPeerID, std::string ip); + ~Client(); + + clientId getId() const { return id; } + std::string getIp() const { return ip; } + ENetPeer * getPeer() { return peer; } + std::string getNickname() { return nickname; } + std::string getUdid() { return udid; } + uint8_t getLobbyIcon() { return lobby_icon; } + int8_t getPet() { return pet; } + AuthPeer &getAuthPeer() { return auth; } + void setExeChance(uint8_t chance) { exe_chance = chance; } + uint8_t getExeChance() { return exe_chance; } + + SurvCharacters getSurvCharacter() const { return survChar; } + void setSurvCharacter(SurvCharacters character) { survChar = character; } + ExesCharacters getExeCharacter() const { return exeChar; } + void setExeCharacter(ExesCharacters character) { exeChar = character; } + + void setTimeout(double value) { timeout = value; } + double getTimeout() const { return timeout; } + bool isShouldTimeout() { return should_timeout; } + bool isDisconnecting() { return disconnecting; } + void setVoteCooldown(double value) { vote_cooldown = value; } + double getVoteCooldown() { return vote_cooldown; } + void setInGame(bool flag) { in_game = flag; } + bool isInGame() { return in_game; } + void setCanVote(bool flag) { can_vote = flag; } + bool isCanVote() { return can_vote; } + + bool isVerified() { return verified; } + bool isOpped() { return op; } + bool isModified() { return mod_tool; } + void setReady(bool flag) { ready = flag; } + bool isReady() { return ready; } + void setVoted(bool flag) { voted = flag; } + bool isVoted() { return voted; } + + bool identity(Packet &packet); + bool identity_process(const std::string & addr, bool is_banned, uint64_t timeout, bool do_timeout); + bool message_received(Packet &packet); + void disconnect(DisconnectReason reason, const std::string& message = ""); + }; +} + +#endif //DISASTERSERVER_PEER_HPP diff --git a/disasterserver/Core/Api.hpp b/disasterserver/Core/Api.hpp new file mode 100644 index 0000000..ceb9d9e --- /dev/null +++ b/disasterserver/Core/Api.hpp @@ -0,0 +1,11 @@ +#ifndef API_HPP +#define API_HPP + +#ifdef _WIN32 + #define SERVER_API __declspec(dllexport) +#else + #define SERVER_API +#endif + + +#endif //API_HPP diff --git a/disasterserver/Core/Colors.hpp b/disasterserver/Core/Colors.hpp new file mode 100644 index 0000000..b303543 --- /dev/null +++ b/disasterserver/Core/Colors.hpp @@ -0,0 +1,18 @@ +#ifndef DISASTERSERVER_COLORS_HPP +#define DISASTERSERVER_COLORS_HPP + +#include + +constexpr std::string_view CLRCODE_RED = "\\"; +constexpr std::string_view CLRCODE_GRN = "@"; +constexpr std::string_view CLRCODE_PUR = "&"; +constexpr std::string_view CLRCODE_BLU = "/"; +constexpr std::string_view CLRCODE_GRA = "|"; +constexpr std::string_view CLRCODE_YLW = "`"; +constexpr std::string_view CLRCODE_ORG = "\xE2\x84\x96"; +constexpr std::string_view CLRCODE_RST = "~"; + +#define CLRLIST { CLRCODE_RED, CLRCODE_GRN, CLRCODE_PUR, CLRCODE_BLU, CLRCODE_GRA, CLRCODE_YLW, CLRCODE_ORG, CLRCODE_RST } +#define CLRLIST_LEN 8 + +#endif //DISASTERSERVER_COLORS_HPP diff --git a/disasterserver/Core/Exceptions.hpp b/disasterserver/Core/Exceptions.hpp new file mode 100644 index 0000000..dc5b4bb --- /dev/null +++ b/disasterserver/Core/Exceptions.hpp @@ -0,0 +1,24 @@ +#ifndef DISASTERSERVER_EXCEPTIONS_HPP +#define DISASTERSERVER_EXCEPTIONS_HPP + +namespace DisasterServer +{ + class PacketError : public std::exception { + public: + explicit PacketError(std::string message) : message(std::move(message)) {} + + const char* what() const noexcept override { + return message.c_str(); + } + + template + static PacketError format(std::format_string fmt, Args&&... args) { + return PacketError(std::format(fmt, std::forward(args)...)); + } + + private: + std::string message; + }; +} + +#endif //DISASTERSERVER_EXCEPTIONS_HPP diff --git a/disasterserver/Core/Log.cpp b/disasterserver/Core/Log.cpp new file mode 100644 index 0000000..2741f44 --- /dev/null +++ b/disasterserver/Core/Log.cpp @@ -0,0 +1,193 @@ +/*#include +#include +#include +#include +#include +#include +#ifdef SYS_ANDROID + #include +#endif + +FILE* logFile = NULL; +loghook_t hook = NULL; + +void log_interr(int signum) +{ + (void)signum; + Err("Signal INTERRUPT: Exiting..."); + if (logFile) + fclose(logFile); + + logFile = NULL; + disaster_shutdown(); +} + +void log_segv(int signum) +{ + (void)signum; + + Err("Signal SEGFAULT: Exiting..."); + if (logFile) + fclose(logFile); + + logFile = NULL; + disaster_shutdown(); +} + +void log_term(int signum) +{ + (void)signum; + + Err("Signal SIGTERM: Exiting..."); + if (logFile) + fclose(logFile); + + logFile = NULL; + disaster_shutdown(); +} + +void log_abrt(int signum) +{ + (void)signum; + Err("Signal SIGABORT: Exiting..."); + if (logFile) + fclose(logFile); + + logFile = NULL; + disaster_shutdown(); +} + +void log_uninit(void) +{ + if (logFile) + fclose(logFile); + + logFile = NULL; +} + +#ifdef SYS_ANDROID + void log_android(const char* type, const char* message) + { + __android_log_print(ANDROID_LOG_ERROR, "DisasterServer", "%s", message); + } +#endif + +bool log_init(void) +{ + if (g_config.log_file) // dont do shit if we dont wanna log to file + { + // Create dir for logging + (void)mkdir("logs", 0777); + + time_t t = time(NULL); + struct tm* p = localtime(&t); + + char fname[64]; + strftime(fname, 64, "logs/%m%d%Y %H%M%S.log", p); + + logFile = fopen(fname, "w"); + RAssert(logFile); + } + + // write to file when done + signal(SIGINT, log_interr); + signal(SIGTERM, log_term); + signal(SIGABRT, log_abrt); + signal(SIGSEGV, log_segv); +#if defined(__unix) || defined(__unix__) + signal(SIGPIPE, SIG_IGN); +#endif + atexit(log_uninit); + + return true; +} + +void log_hook(loghook_t func) +{ + hook = func; +} + +void log_fmt(const char* fmt, const char* type, const char* file, int line, ...) +{ + const char* thd_name = (const char*)ThreadVarGet(g_threadName); + char filename[24]; + snprintf(filename, 24, "%s:%d", file, line); + + time_t t = time(NULL); + struct tm* p = localtime(&t); + + va_list list; + if (logFile) + { + char strtime[32]; + strftime(strtime, 32, "%m/%d/%Y %H:%M:%S", p); + fprintf(logFile, "[%s %s %s %s] ", strtime, type, thd_name != NULL ? thd_name : "unknown", filename); + + va_start(list, line); + vfprintf(logFile, fmt, list); + va_end(list); + + fputs("\n", logFile); + fflush(logFile); + } + + if (hook) + { + char fmt_log[512]; + va_start(list, line); + vsnprintf(fmt_log, 512, fmt, list); + va_end(list); + + char log[1024]; + snprintf(log, 1024, "[%s]: %s", filename, fmt_log); + + hook(type, log); + return; + } + + printf("[%s %s %s] ", type, thd_name != NULL ? thd_name : "unknown", filename); + + va_start(list, line); + vprintf(fmt, list); + va_end(list); + + puts(""); +}*/ + +#include "Log.hpp" + +#include +#include + +using namespace DisasterServer; + +void Logger::write(const LogLevel level, std::string_view message, std::source_location &location) { + using namespace std::chrono; + + std::stringstream ss; + + const time_t now = std::time(nullptr); + + std::tm local{}; +#ifdef _WIN32 + localtime_s(&local, &now); +#else + localtime_r(&now, &local); +#endif + + ss << std::put_time(&local, "%d.%m.%Y %T"); + ss << " "; + switch (level) { + case LogLevel::Debug: ss << TerminalColors::cyan; ss << "[Debug]"; ss << TerminalColors::reset; break; + case LogLevel::Info: ss << TerminalColors::green; ss << "[Info]"; ss << TerminalColors::reset; break; + case LogLevel::Warning: ss << TerminalColors::yellow; ss << "[Warn]"; ss << TerminalColors::reset; break; + case LogLevel::Error: ss << TerminalColors::light_red; ss << "[Error]"; ss << TerminalColors::reset; break; + } + ss << " "; + ss << TerminalColors::light_gray; ss << "["<< std::this_thread::get_id() << "]"; + ss << " "; + ss << std::format("({}:{})", location.file_name(), location.line()); ss << TerminalColors::reset; + ss << " "; + ss << message; + std::cout << ss.str() << std::endl; +} diff --git a/disasterserver/Core/Log.hpp b/disasterserver/Core/Log.hpp new file mode 100644 index 0000000..02df25b --- /dev/null +++ b/disasterserver/Core/Log.hpp @@ -0,0 +1,126 @@ +#ifndef LOG_HPP +#define LOG_HPP + +#include +#include +#include + +#ifdef true //SYS_USE_SDL2 + #define DEBUG_TYPE "DBG " + #define INFO_TYPE "INF " + #define WARN_TYPE "WRN " + #define ERROR_TYPE "ERR " + + #define LOG_GRN CLRCODE_GRN + #define LOG_GRA CLRCODE_GRA + #define LOG_RED CLRCODE_RED + #define LOG_BLU CLRCODE_BLU + #define LOG_YLW CLRCODE_YLW + #define LOG_PUR CLRCODE_PUR + #define LOG_RST CLRCODE_RST +#else + #define DEBUG_TYPE "\x1B[36mDBG\x1B[0m" + #define INFO_TYPE "\x1B[32mINF\x1B[0m" + #define WARN_TYPE "\x1B[33mWRN\x1B[0m" + #define ERROR_TYPE "\x1B[31mERR\x1B[0m" + + #define LOG_GRN + #define LOG_GRA + #define LOG_RED + #define LOG_BLU + #define LOG_YLW + #define LOG_PUR + #define LOG_RST +#endif + +namespace DisasterServer +{ + namespace TerminalColors { + constexpr std::string_view reset = "\x1b[0m"; + constexpr std::string_view bright = "\x1b[1m"; + constexpr std::string_view dim = "\x1b[2m"; + constexpr std::string_view underscore = "\x1b[4m"; + constexpr std::string_view blink = "\x1b[5m"; + constexpr std::string_view reverse = "\x1b[7m"; + constexpr std::string_view hidden = "\x1b[8m"; + + constexpr std::string_view black = "\x1b[30m"; + constexpr std::string_view red = "\x1b[31m"; + constexpr std::string_view green = "\x1b[32m"; + constexpr std::string_view yellow = "\x1b[33m"; + constexpr std::string_view blue = "\x1b[34m"; + constexpr std::string_view magenta = "\x1b[35m"; + constexpr std::string_view cyan = "\x1b[36m"; + constexpr std::string_view white = "\x1b[37m"; + constexpr std::string_view standard = "\x1b[39m"; + constexpr std::string_view light_gray = "\x1b[90m"; + constexpr std::string_view light_red = "\x1b[91m"; + constexpr std::string_view light_green = "\x1b[92m"; + constexpr std::string_view light_yellow = "\x1b[93m"; + constexpr std::string_view light_blue = "\x1b[94m"; + constexpr std::string_view light_magenta = "\x1b[95m"; + constexpr std::string_view light_cyan = "\x1b[96m"; + constexpr std::string_view light_white = "\x1b[97m"; + + + constexpr std::string_view bg_black = "\x1b[40m"; + constexpr std::string_view bg_red = "\x1b[41m"; + constexpr std::string_view bg_green = "\x1b[42m"; + constexpr std::string_view bg_yellow = "\x1b[43m"; + constexpr std::string_view bg_blue = "\x1b[44m"; + constexpr std::string_view bg_magenta = "\x1b[45m"; + constexpr std::string_view bg_cyan = "\x1b[46m"; + constexpr std::string_view bg_white = "\x1b[47m"; + } + + enum class LogLevel { + Debug, Info, Warning, Error + }; + + class Logger { + static void write(LogLevel level, std::string_view message, std::source_location &location); + + template + static void log(LogLevel level, std::source_location location, std::format_string fmt, Args&&... args) { + write(level, std::format(fmt, std::forward(args)...), location); + } + + public: + + template + static void debug(std::source_location location, std::format_string fmt, Args&&... args) { +#ifdef _DEBUG + log(LogLevel::Debug, location, fmt, std::forward(args)...); +#endif + } + + template + static void info(std::source_location location, std::format_string fmt, Args&&... args) { + log(LogLevel::Info, location, fmt, std::forward(args)...); + } + + template + static void warning(std::source_location location, std::format_string fmt, Args&&... args) { + log(LogLevel::Warning, location, fmt, std::forward(args)...); + } + + template + static void error(std::source_location location, std::format_string fmt, Args&&... args) { + log(LogLevel::Error, location, fmt, std::forward(args)...); + } + }; + + constexpr std::string_view BoolStringify(bool value) { + return value ? "true" : "false"; + } +} + +#define RAssert(x) if (!(x)) { Err("RAssert({}) failed!", #x); return false; } +#define RAssertEx(x) if (!(x)) { Err("RAssert({}) failed!", #x); } + +#define Info(fmt, ...) DisasterServer::Logger::info(std::source_location::current(), fmt, ##__VA_ARGS__) +#define Warn(fmt, ...) DisasterServer::Logger::warning(std::source_location::current(), fmt, ##__VA_ARGS__) +#define Err(fmt, ...) DisasterServer::Logger::error(std::source_location::current(), fmt, ##__VA_ARGS__) +#define Debug(fmt, ...) DisasterServer::Logger::debug(std::source_location::current(), fmt, ##__VA_ARGS__) + +#endif //LOG_HPP diff --git a/disasterserver/Core/Packet.cpp b/disasterserver/Core/Packet.cpp new file mode 100644 index 0000000..c1b2c8e --- /dev/null +++ b/disasterserver/Core/Packet.cpp @@ -0,0 +1,108 @@ +#include "Packet.hpp" + +#include + +#include "Log.hpp" +#include "Client.hpp" +#include "Server.hpp" +#include "Exceptions.hpp" + +#ifdef __GNUC__ // GCC, clang... + #define BYTESWAP_16(x) __builtin_bswap16((x)) + #define BYTESWAP_32(x) __builtin_bswap32((x)) + #define BYTESWAP_64(x) __builtin_bswap64((x)) +#else + #define BYTESWAP_16(x) _byteswap_ushort((x)) + #define BYTESWAP_32(x) _byteswap_ulong((x)) + #define BYTESWAP_64(x) _byteswap_uint64((x)) +#endif + +using namespace DisasterServer; + +Packet::Packet(ENetPacket *packet) : buffer({}) { + if (!packet) { + throw PacketError::format("Packet is null"); + } + + if (packet->dataLength > buffer.size()) { + enet_packet_destroy(packet); + throw PacketError::format("Packet is too large {} bytes", packet->dataLength); + } + + len = packet->dataLength; + + std::memcpy(buffer.data(), packet->data, len); + enet_packet_destroy(packet); + + if (len < 2) { + throw PacketError::format("Packet is too small"); + } + + read(); + type = static_cast(read()); + + Debug("Packet received PacketType::{}", getPacketTypeName(type)); +} + +Packet::Packet(PacketType type) : buffer({}), type(type) { + write(0); + write(static_cast(type)); + if (type != PacketType::SERVER_HEARTBEAT) { + Debug("Packet created PacketType::{}", getPacketTypeName(type)); + } +} + +Packet::~Packet() = default; + +std::string Packet::readString() { + std::string result; + + while (position < len) { + const char c = static_cast(buffer[position++]); + + if (c == '\0') + return result; + + result += c; + } + + throw PacketError::format("Unterminated string"); +} + +void Packet::writeString(const std::string &value) { + if (position >= buffer.size() || value.size() >= buffer.size() - position) { + throw PacketError::format("String is too long: {} bytes", value.size()); + } + + for (unsigned char c : value) { + write(c); + } + + write(0); +} + +bool Packet::send(Client &client, bool reliable) { + if(client.isDisconnecting()) + return true; + + Debug("PacketType::{} sending to {} (id {})", getPacketTypeName(type), client.getNickname(), client.getId()); + + ENetPacket* pack = enet_packet_create(buffer.data(), len, reliable ? ENET_PACKET_FLAG_RELIABLE : 0); + + if (!pack) { + Err("Failed to create ENet packet"); + return false; + } + + return enet_peer_send(client.getPeer(), reliable ? 0 : 1, pack) == 0; +} + +void Packet::sendBroadcast(Server &server, bool reliable, std::function predicate) { + for (auto &client : server.getClients()) { + if (predicate(*client)) { + if (!send(*client, reliable)) { + Warn("Failed to send {} to client {}", getPacketTypeName(type), client->getId()); + } + } + } +} \ No newline at end of file diff --git a/disasterserver/Core/Packet.hpp b/disasterserver/Core/Packet.hpp new file mode 100644 index 0000000..71dd8b5 --- /dev/null +++ b/disasterserver/Core/Packet.hpp @@ -0,0 +1,385 @@ +#ifndef PACKET_H + +#define PACKET_H + +#include +#include +#include +#include +#include + +#include "Log.hpp" +#include "enet/enet.h" + +enum class PacketType : uint8_t +{ + IDENTITY, + SERVER_IDENTITY_RESPONSE, + + SERVER_PLAYER_JOINED, + SERVER_PLAYER_LEFT, + SERVER_PLAYER_FORCE_DISCONNECT, + + SERVER_WAITING_PLAYER_INFO, + + SERVER_LOBBY_READY_STATE, + SERVER_LOBBY_EXE, + SERVER_LOBBY_COUNTDOWN, + SERVER_LOBBY_EXE_CHANGE, + SERVER_LOBBY_CHARACTER_CHANGE, + SERVER_LOBBY_CHARACTER_RESPONSE, + SERVER_LOBBY_EXECHARACTER_RESPONSE, + SERVER_LOBBY_GAME_START, + SERVER_LOBBY_PLAYER, + SERVER_LOBBY_EXE_CHANCE, + SERVER_LOBBY_CORRECT, + SERVER_LOBBY_CHOOSEVOTEKICK, + SERVER_LOBBY_CHOOSEBAN, + SERVER_LOBBY_CHOOSEKICK, + SERVER_LOBBY_CHOOSEOP, + SERVER_LOBBY_CHANGELOBBY, + SERVER_CHAR_TIME_SYNC, + + SERVER_VOTE_MAPS, + SERVER_VOTE_SET, + SERVER_VOTE_TIME_SYNC, + + SERVER_GAME_PLAYERS_READY, + SERVER_GAME_EXE_WINS, + SERVER_GAME_SURVIVOR_WIN, + SERVER_GAME_SPAWN_RING, + SERVER_GAME_PLAYER_ESCAPED, + SERVER_GAME_BACK_TO_LOBBY, + SERVER_GAME_TIME_SYNC, + SERVER_GAME_TIME_OVER, + SERVER_GAME_PING, + SERVER_PLAYER_DEATH_STATE, + SERVER_GAME_DEATHTIMER_TICK, + SERVER_GAME_DEATHTIMER_END, + + SERVER_REQUEST_INFO, + SERVER_HEARTBEAT, + SERVER_PONG, + + SERVER_FORCE_DAMAGE, + SERVER_GAME_RING_READY, + SERVER_PLAYER_BACKTRACK, + + // Entities + SERVER_TPROJECTILE_STATE, + SERVER_ETRACKER_STATE, + SERVER_ERECTOR_BRING_SPAWN, + SERVER_RMZSLIME_STATE, + SERVER_RMZSLIME_RINGBONUS, + SERVER_RMZSHARD_STATE, + SERVER_LCEYE_STATE, + SERVER_LCCHAIN_STATE, + SERVER_NPCONTROLLER_STATE, + SERVER_KAFMONITOR_STATE, + SERVER_YCRSMOKE_STATE, + SERVER_YCRSMOKE_READY, + SERVER_MOVINGSPIKE_STATE, + SERVER_RING_STATE, + SERVER_RING_COLLECTED, + SERVER_ACT9WALL_STATE, + SERVER_NAPBALL_STATE, + SERVER_NAPICE_STATE, + SERVER_PFLIFT_STATE, + SERVER_BRING_STATE, + SERVER_BRING_COLLECTED, + SERVER_VVLCOLUMN_STATE, + SERVER_VVVASE_STATE, + SERVER_GHZTHUNDER_STATE, + SERVER_TCGOM_STATE, + SERVER_EXELLERCLONE_STATE, + SERVER_DTTAILSDOLL_STATE, + SERVER_DTBALL_STATE, + SERVER_DTASS_STATE, + SERVER_HDDOOR_STATE, + SERVER_WDLATERN_ACTIVATE, + SERVER_FART_STATE, + SERVER_MJLAVA_STATE, + SERVER_MJJUDGER_STATE, + SERVER_MJCRYSTAL_STATE, + + // Entity actions + CLIENT_ETRACKER, + CLIENT_ETRACKER_ACTIVATED, + CLIENT_TPROJECTILE, + CLIENT_TPROJECTILE_HIT, + CLIENT_TPROJECTILE_STARTCHARGE, + CLIENT_ERECTOR_BALLS, + CLIENT_ERECTOR_BRING_SPAWN, + CLIENT_EXELLER_SPAWN_CLONE, + CLIENT_EXELLER_TELEPORT_CLONE, + CLIENT_MERCOIN_BONUS, + + CLIENT_RMZSLIME_HIT, + CLIENT_LCEYE_REQUEST_ACTIVATE, + CLIENT_KAFMONITOR_ACTIVATE, + CLIENT_RING_COLLECTED, + CLIENT_RING_BROKE, + CLIENT_BRING_COLLECTED, + CLIENT_NAPICE_ACTIVATE, + CLIENT_SPRING_USE, + CLIENT_PFLIT_ACTIVATE, + CLIENT_VVVASE_BREAK, + CLIENT_RMZSHARD_COLLECT, + CLIENT_RMZSHARD_LAND, + CLIENT_DTASS_ACTIVATE, + CLIENT_HDDOOR_TOGGLE, + CLIENT_FART_PUSH, + + CLIENT_LOBBY_READY_STATE, + CLIENT_REQUESTED_INFO, + CLIENT_PLAYER_DATA, + CLIENT_PLAYER_HURT, + CLIENT_SOUND_EMIT, + CLIENT_PING, + + CLIENT_REVIVAL_PROGRESS, + CLIENT_PLAYER_HEAL, + CLIENT_PLAYER_HEAL_PART, + SERVER_REVIVAL_PROGRESS, + SERVER_REVIVAL_STATUS, + SERVER_REVIVAL_RINGSUB, + SERVER_REVIVAL_REVIVED, + + CLIENT_REQUEST_CHARACTER, + CLIENT_REQUEST_EXECHARACTER, + CLIENT_VOTE_REQUEST, + + CLIENT_PLAYER_DEATH_STATE, + CLIENT_PLAYER_ESCAPED, + SERVER_PLAYER_ESCAPED, + CLIENT_LOBBY_PLAYERS_REQUEST, + CLIENT_CREAM_SPAWN_RINGS, + CLIENT_SPAWN_EFFECT, + CLIENT_CHAT_MESSAGE, + CLIENT_LOBBY_CHOOSEVOTEKICK, + CLIENT_LOBBY_CHOOSEBAN, + CLIENT_LOBBY_CHOOSEKICK, + CLIENT_LOBBY_CHOOSEOP, + CLIENT_PLAYER_PALETTE, + CLIENT_PET_PALETTE, + + SERVER_RESULTS, + SERVER_RESULTS_DATA, + CLIENT_RESULTS_REQUEST, + CLIENT_STATS_REPORT, + SERVER_PREIDENTITY, + SERVER_FELLA, + + CLIENT_PLAYER_POTATER +}; + +inline std::string getPacketTypeName(PacketType type) { + switch (type) { + case PacketType::IDENTITY: return "IDENTITY"; + case PacketType::SERVER_IDENTITY_RESPONSE: return "SERVER_IDENTITY_RESPONSE"; + case PacketType::SERVER_PLAYER_JOINED: return "SERVER_PLAYER_JOINED"; + case PacketType::SERVER_PLAYER_LEFT: return "SERVER_PLAYER_LEFT"; + case PacketType::SERVER_PLAYER_FORCE_DISCONNECT: return "SERVER_PLAYER_FORCE_DISCONNECT"; + case PacketType::SERVER_WAITING_PLAYER_INFO: return "SERVER_WAITING_PLAYER_INFO"; + case PacketType::SERVER_LOBBY_READY_STATE: return "SERVER_LOBBY_READY_STATE"; + case PacketType::SERVER_LOBBY_EXE: return "SERVER_LOBBY_EXE"; + case PacketType::SERVER_LOBBY_COUNTDOWN: return "SERVER_LOBBY_COUNTDOWN"; + case PacketType::SERVER_LOBBY_EXE_CHANGE: return "SERVER_LOBBY_EXE_CHANGE"; + case PacketType::SERVER_LOBBY_CHARACTER_CHANGE: return "SERVER_LOBBY_CHARACTER_CHANGE"; + case PacketType::SERVER_LOBBY_CHARACTER_RESPONSE: return "SERVER_LOBBY_CHARACTER_RESPONSE"; + case PacketType::SERVER_LOBBY_EXECHARACTER_RESPONSE: return "SERVER_LOBBY_EXECHARACTER_RESPONSE"; + case PacketType::SERVER_LOBBY_GAME_START: return "SERVER_LOBBY_GAME_START"; + case PacketType::SERVER_LOBBY_PLAYER: return "SERVER_LOBBY_PLAYER"; + case PacketType::SERVER_LOBBY_EXE_CHANCE: return "SERVER_LOBBY_EXE_CHANCE"; + case PacketType::SERVER_LOBBY_CORRECT: return "SERVER_LOBBY_CORRECT"; + case PacketType::SERVER_LOBBY_CHOOSEVOTEKICK: return "SERVER_LOBBY_CHOOSEVOTEKICK"; + case PacketType::SERVER_LOBBY_CHOOSEBAN: return "SERVER_LOBBY_CHOOSEBAN"; + case PacketType::SERVER_LOBBY_CHOOSEKICK: return "SERVER_LOBBY_CHOOSEKICK"; + case PacketType::SERVER_LOBBY_CHOOSEOP: return "SERVER_LOBBY_CHOOSEOP"; + case PacketType::SERVER_LOBBY_CHANGELOBBY: return "SERVER_LOBBY_CHANGELOBBY"; + case PacketType::SERVER_CHAR_TIME_SYNC: return "SERVER_CHAR_TIME_SYNC"; + case PacketType::SERVER_VOTE_MAPS: return "SERVER_VOTE_MAPS"; + case PacketType::SERVER_VOTE_SET: return "SERVER_VOTE_SET"; + case PacketType::SERVER_VOTE_TIME_SYNC: return "SERVER_VOTE_TIME_SYNC"; + case PacketType::SERVER_GAME_PLAYERS_READY: return "SERVER_GAME_PLAYERS_READY"; + case PacketType::SERVER_GAME_EXE_WINS: return "SERVER_GAME_EXE_WINS"; + case PacketType::SERVER_GAME_SURVIVOR_WIN: return "SERVER_GAME_SURVIVOR_WIN"; + case PacketType::SERVER_GAME_SPAWN_RING: return "SERVER_GAME_SPAWN_RING"; + case PacketType::SERVER_GAME_PLAYER_ESCAPED: return "SERVER_GAME_PLAYER_ESCAPED"; + case PacketType::SERVER_GAME_BACK_TO_LOBBY: return "SERVER_GAME_BACK_TO_LOBBY"; + case PacketType::SERVER_GAME_TIME_SYNC: return "SERVER_GAME_TIME_SYNC"; + case PacketType::SERVER_GAME_TIME_OVER: return "SERVER_GAME_TIME_OVER"; + case PacketType::SERVER_GAME_PING: return "SERVER_GAME_PING"; + case PacketType::SERVER_PLAYER_DEATH_STATE: return "SERVER_PLAYER_DEATH_STATE"; + case PacketType::SERVER_GAME_DEATHTIMER_TICK: return "SERVER_GAME_DEATHTIMER_TICK"; + case PacketType::SERVER_GAME_DEATHTIMER_END: return "SERVER_GAME_DEATHTIMER_END"; + case PacketType::SERVER_REQUEST_INFO: return "SERVER_REQUEST_INFO"; + case PacketType::SERVER_HEARTBEAT: return "SERVER_HEARTBEAT"; + case PacketType::SERVER_PONG: return "SERVER_PONG"; + case PacketType::SERVER_FORCE_DAMAGE: return "SERVER_FORCE_DAMAGE"; + case PacketType::SERVER_GAME_RING_READY: return "SERVER_GAME_RING_READY"; + case PacketType::SERVER_PLAYER_BACKTRACK: return "SERVER_PLAYER_BACKTRACK"; + case PacketType::SERVER_TPROJECTILE_STATE: return "SERVER_TPROJECTILE_STATE"; + case PacketType::SERVER_ETRACKER_STATE: return "SERVER_ETRACKER_STATE"; + case PacketType::SERVER_ERECTOR_BRING_SPAWN: return "SERVER_ERECTOR_BRING_SPAWN"; + case PacketType::SERVER_RMZSLIME_STATE: return "SERVER_RMZSLIME_STATE"; + case PacketType::SERVER_RMZSLIME_RINGBONUS: return "SERVER_RMZSLIME_RINGBONUS"; + case PacketType::SERVER_RMZSHARD_STATE: return "SERVER_RMZSHARD_STATE"; + case PacketType::SERVER_LCEYE_STATE: return "SERVER_LCEYE_STATE"; + case PacketType::SERVER_LCCHAIN_STATE: return "SERVER_LCCHAIN_STATE"; + case PacketType::SERVER_NPCONTROLLER_STATE: return "SERVER_NPCONTROLLER_STATE"; + case PacketType::SERVER_KAFMONITOR_STATE: return "SERVER_KAFMONITOR_STATE"; + case PacketType::SERVER_YCRSMOKE_STATE: return "SERVER_YCRSMOKE_STATE"; + case PacketType::SERVER_YCRSMOKE_READY: return "SERVER_YCRSMOKE_READY"; + case PacketType::SERVER_MOVINGSPIKE_STATE: return "SERVER_MOVINGSPIKE_STATE"; + case PacketType::SERVER_RING_STATE: return "SERVER_RING_STATE"; + case PacketType::SERVER_RING_COLLECTED: return "SERVER_RING_COLLECTED"; + case PacketType::SERVER_ACT9WALL_STATE: return "SERVER_ACT9WALL_STATE"; + case PacketType::SERVER_NAPBALL_STATE: return "SERVER_NAPBALL_STATE"; + case PacketType::SERVER_NAPICE_STATE: return "SERVER_NAPICE_STATE"; + case PacketType::SERVER_PFLIFT_STATE: return "SERVER_PFLIFT_STATE"; + case PacketType::SERVER_BRING_STATE: return "SERVER_BRING_STATE"; + case PacketType::SERVER_BRING_COLLECTED: return "SERVER_BRING_COLLECTED"; + case PacketType::SERVER_VVLCOLUMN_STATE: return "SERVER_VVLCOLUMN_STATE"; + case PacketType::SERVER_VVVASE_STATE: return "SERVER_VVVASE_STATE"; + case PacketType::SERVER_GHZTHUNDER_STATE: return "SERVER_GHZTHUNDER_STATE"; + case PacketType::SERVER_TCGOM_STATE: return "SERVER_TCGOM_STATE"; + case PacketType::SERVER_EXELLERCLONE_STATE: return "SERVER_EXELLERCLONE_STATE"; + case PacketType::SERVER_DTTAILSDOLL_STATE: return "SERVER_DTTAILSDOLL_STATE"; + case PacketType::SERVER_DTBALL_STATE: return "SERVER_DTBALL_STATE"; + case PacketType::SERVER_DTASS_STATE: return "SERVER_DTASS_STATE"; + case PacketType::SERVER_HDDOOR_STATE: return "SERVER_HDDOOR_STATE"; + case PacketType::SERVER_WDLATERN_ACTIVATE: return "SERVER_WDLATERN_ACTIVATE"; + case PacketType::SERVER_FART_STATE: return "SERVER_FART_STATE"; + case PacketType::SERVER_MJLAVA_STATE: return "SERVER_MJLAVA_STATE"; + case PacketType::SERVER_MJJUDGER_STATE: return "SERVER_MJJUDGER_STATE"; + case PacketType::SERVER_MJCRYSTAL_STATE: return "SERVER_MJCRYSTAL_STATE"; + case PacketType::CLIENT_ETRACKER: return "CLIENT_ETRACKER"; + case PacketType::CLIENT_ETRACKER_ACTIVATED: return "CLIENT_ETRACKER_ACTIVATED"; + case PacketType::CLIENT_TPROJECTILE: return "CLIENT_TPROJECTILE"; + case PacketType::CLIENT_TPROJECTILE_HIT: return "CLIENT_TPROJECTILE_HIT"; + case PacketType::CLIENT_TPROJECTILE_STARTCHARGE: return "CLIENT_TPROJECTILE_STARTCHARGE"; + case PacketType::CLIENT_ERECTOR_BALLS: return "CLIENT_ERECTOR_BALLS"; + case PacketType::CLIENT_ERECTOR_BRING_SPAWN: return "CLIENT_ERECTOR_BRING_SPAWN"; + case PacketType::CLIENT_EXELLER_SPAWN_CLONE: return "CLIENT_EXELLER_SPAWN_CLONE"; + case PacketType::CLIENT_EXELLER_TELEPORT_CLONE: return "CLIENT_EXELLER_TELEPORT_CLONE"; + case PacketType::CLIENT_MERCOIN_BONUS: return "CLIENT_MERCOIN_BONUS"; + case PacketType::CLIENT_RMZSLIME_HIT: return "CLIENT_RMZSLIME_HIT"; + case PacketType::CLIENT_LCEYE_REQUEST_ACTIVATE: return "CLIENT_LCEYE_REQUEST_ACTIVATE"; + case PacketType::CLIENT_KAFMONITOR_ACTIVATE: return "CLIENT_KAFMONITOR_ACTIVATE"; + case PacketType::CLIENT_RING_COLLECTED: return "CLIENT_RING_COLLECTED"; + case PacketType::CLIENT_RING_BROKE: return "CLIENT_RING_BROKE"; + case PacketType::CLIENT_BRING_COLLECTED: return "CLIENT_BRING_COLLECTED"; + case PacketType::CLIENT_NAPICE_ACTIVATE: return "CLIENT_NAPICE_ACTIVATE"; + case PacketType::CLIENT_SPRING_USE: return "CLIENT_SPRING_USE"; + case PacketType::CLIENT_PFLIT_ACTIVATE: return "CLIENT_PFLIT_ACTIVATE"; + case PacketType::CLIENT_VVVASE_BREAK: return "CLIENT_VVVASE_BREAK"; + case PacketType::CLIENT_RMZSHARD_COLLECT: return "CLIENT_RMZSHARD_COLLECT"; + case PacketType::CLIENT_RMZSHARD_LAND: return "CLIENT_RMZSHARD_LAND"; + case PacketType::CLIENT_DTASS_ACTIVATE: return "CLIENT_DTASS_ACTIVATE"; + case PacketType::CLIENT_HDDOOR_TOGGLE: return "CLIENT_HDDOOR_TOGGLE"; + case PacketType::CLIENT_FART_PUSH: return "CLIENT_FART_PUSH"; + case PacketType::CLIENT_LOBBY_READY_STATE: return "CLIENT_LOBBY_READY_STATE"; + case PacketType::CLIENT_REQUESTED_INFO: return "CLIENT_REQUESTED_INFO"; + case PacketType::CLIENT_PLAYER_DATA: return "CLIENT_PLAYER_DATA"; + case PacketType::CLIENT_PLAYER_HURT: return "CLIENT_PLAYER_HURT"; + case PacketType::CLIENT_SOUND_EMIT: return "CLIENT_SOUND_EMIT"; + case PacketType::CLIENT_PING: return "CLIENT_PING"; + case PacketType::CLIENT_REVIVAL_PROGRESS: return "CLIENT_REVIVAL_PROGRESS"; + case PacketType::CLIENT_PLAYER_HEAL: return "CLIENT_PLAYER_HEAL"; + case PacketType::CLIENT_PLAYER_HEAL_PART: return "CLIENT_PLAYER_HEAL_PART"; + case PacketType::SERVER_REVIVAL_PROGRESS: return "SERVER_REVIVAL_PROGRESS"; + case PacketType::SERVER_REVIVAL_STATUS: return "SERVER_REVIVAL_STATUS"; + case PacketType::SERVER_REVIVAL_RINGSUB: return "SERVER_REVIVAL_RINGSUB"; + case PacketType::SERVER_REVIVAL_REVIVED: return "SERVER_REVIVAL_REVIVED"; + case PacketType::CLIENT_REQUEST_CHARACTER: return "CLIENT_REQUEST_CHARACTER"; + case PacketType::CLIENT_REQUEST_EXECHARACTER: return "CLIENT_REQUEST_EXECHARACTER"; + case PacketType::CLIENT_VOTE_REQUEST: return "CLIENT_VOTE_REQUEST"; + case PacketType::CLIENT_PLAYER_DEATH_STATE: return "CLIENT_PLAYER_DEATH_STATE"; + case PacketType::CLIENT_PLAYER_ESCAPED: return "CLIENT_PLAYER_ESCAPED"; + case PacketType::SERVER_PLAYER_ESCAPED: return "SERVER_PLAYER_ESCAPED"; + case PacketType::CLIENT_LOBBY_PLAYERS_REQUEST: return "CLIENT_LOBBY_PLAYERS_REQUEST"; + case PacketType::CLIENT_CREAM_SPAWN_RINGS: return "CLIENT_CREAM_SPAWN_RINGS"; + case PacketType::CLIENT_SPAWN_EFFECT: return "CLIENT_SPAWN_EFFECT"; + case PacketType::CLIENT_CHAT_MESSAGE: return "CLIENT_CHAT_MESSAGE"; + case PacketType::CLIENT_LOBBY_CHOOSEVOTEKICK: return "CLIENT_LOBBY_CHOOSEVOTEKICK"; + case PacketType::CLIENT_LOBBY_CHOOSEBAN: return "CLIENT_LOBBY_CHOOSEBAN"; + case PacketType::CLIENT_LOBBY_CHOOSEKICK: return "CLIENT_LOBBY_CHOOSEKICK"; + case PacketType::CLIENT_LOBBY_CHOOSEOP: return "CLIENT_LOBBY_CHOOSEOP"; + case PacketType::CLIENT_PLAYER_PALETTE: return "CLIENT_PLAYER_PALETTE"; + case PacketType::CLIENT_PET_PALETTE: return "CLIENT_PET_PALETTE"; + case PacketType::SERVER_RESULTS: return "SERVER_RESULTS"; + case PacketType::SERVER_RESULTS_DATA: return "SERVER_RESULTS_DATA"; + case PacketType::CLIENT_RESULTS_REQUEST: return "CLIENT_RESULTS_REQUEST"; + case PacketType::CLIENT_STATS_REPORT: return "CLIENT_STATS_REPORT"; + case PacketType::SERVER_PREIDENTITY: return "SERVER_PREIDENTITY"; + case PacketType::SERVER_FELLA: return "SERVER_FELLA"; + case PacketType::CLIENT_PLAYER_POTATER: return "CLIENT_PLAYER_POTATER"; + default: return ""; + } +} + +static constexpr int PACKET_MAXSIZE = 256; + +#undef min +#undef max + +namespace DisasterServer { + class Server; + class Client; + + class Packet { + std::array buffer{}; + PacketType type; + size_t position = 0; + size_t len = 0; + public: + explicit Packet(ENetPacket *packet); + explicit Packet(PacketType type); + ~Packet(); + + PacketType getPacketType() { + return type; + } + + template + T read() { + static_assert(std::is_trivially_copyable_v, "Packet::read requires trivially copyable type"); + + if (position > len || sizeof(T) > len - position) { + Err("Packet underflow: trying to read {} bytes at position {} from {} byte packet ({})", sizeof(T), position, len, getPacketTypeName(type)); + throw std::runtime_error("Packet underflow"); + } + + T value {}; + std::memcpy(&value, buffer.data() + position, sizeof(T)); + position += sizeof(T); + + return value; + } + + template + void write(T value) { + static_assert(std::is_trivially_copyable_v, "Packet::write requires trivially copyable type"); + + if (position > buffer.size() || sizeof(T) > buffer.size() - position) { + Err("Exceeding the Packet Size Limit. Max Size {}", PACKET_MAXSIZE); + throw std::runtime_error("Packet overflow"); + } + + std::memcpy(buffer.data() + position, &value, sizeof(T)); + position += sizeof(T); + + len = std::max(len, position); + } + + std::string readString(); + void writeString(const std::string &value); + + bool send(Client &client, bool reliable); + void sendBroadcast(Server &server, bool reliable, std::function predicate = [](const Client& _) { return true; }); + }; +} + + +#endif diff --git a/disasterserver/Core/Singleton.hpp b/disasterserver/Core/Singleton.hpp new file mode 100644 index 0000000..edd680c --- /dev/null +++ b/disasterserver/Core/Singleton.hpp @@ -0,0 +1,22 @@ +#ifndef SINGLETON_HPP +#define SINGLETON_HPP + +template +class Singleton +{ +public: + Singleton(const Singleton&) = delete; + Singleton& operator=(const Singleton&) = delete; + + static C& getInstance() + { + static C instance; + return instance; + } + +protected: + Singleton() = default; + ~Singleton() = default; +}; + +#endif //SINGLETON_HPP diff --git a/disasterserver/Core/Time.cpp b/disasterserver/Core/Time.cpp new file mode 100644 index 0000000..4817aaa --- /dev/null +++ b/disasterserver/Core/Time.cpp @@ -0,0 +1,48 @@ +#include "Time.hpp" +#include + +#include "Log.hpp" + +bool init = false; +double freq = 0; + +void time_start(TimeStamp* timer) +{ +#ifdef _WIN32 + LARGE_INTEGER li; + + if (!init) + { + if (!QueryPerformanceFrequency(&li)) + { + Err("Failed to query perfomance frequency!"); + return; + } + + freq = (double)(li.QuadPart) / 1000.0; + init = true; + } + + QueryPerformanceCounter(&li); + *timer = (li.QuadPart / freq); +#else + struct timespec _t; + clock_gettime(CLOCK_MONOTONIC, &_t); + *timer = _t.tv_sec * 1000 + _t.tv_nsec / 1e6; +#endif +} + +double time_end(TimeStamp* timer) +{ +#ifdef _WIN32 + LARGE_INTEGER li; + QueryPerformanceCounter(&li); + return (double)((li.QuadPart) / freq) - (*timer); +#else + struct timespec _t; + clock_gettime(CLOCK_MONOTONIC, &_t); + + double current = _t.tv_sec * 1000 + _t.tv_nsec / 1e6; + return current - (*timer); +#endif +} \ No newline at end of file diff --git a/disasterserver/Core/Time.hpp b/disasterserver/Core/Time.hpp new file mode 100644 index 0000000..c12fe61 --- /dev/null +++ b/disasterserver/Core/Time.hpp @@ -0,0 +1,14 @@ +#ifndef DISASTERSERVER_TIME_HPP +#define DISASTERSERVER_TIME_HPP + +#if defined(_WIN32) + #define WIN32_LEAN_AND_MEAN + #include +#endif + +typedef double TimeStamp; +void time_start (TimeStamp* timer); +double time_end (TimeStamp* timer); + + +#endif //DISASTERSERVER_TIME_HPP diff --git a/disasterserver/GameStateController.cpp b/disasterserver/GameStateController.cpp new file mode 100644 index 0000000..c63d26d --- /dev/null +++ b/disasterserver/GameStateController.cpp @@ -0,0 +1,212 @@ +#include "GameStateController.hpp" +#include "Server.hpp" + +#include "Core/Colors.hpp" + +using namespace DisasterServer; + +GameStateController::GameStateController(Server *server): server(server), lobby(server, this), charSelect(server, this) { +} + +GameStateController::~GameStateController() = default; + +bool GameStateController::playerJoined(Client &peer) { + Packet packet(PacketType::SERVER_LOBBY_EXE_CHANCE); + packet.write(peer.getExeChance()); + packet.send(peer, true); + + Packet playerJoined(PacketType::SERVER_PLAYER_JOINED); + playerJoined.write(peer.getId()); + playerJoined.writeString(peer.getNickname()); + playerJoined.write(peer.getLobbyIcon()); + playerJoined.write(peer.getPet()); + this->server->broadcast_ex(playerJoined, true, peer.getId()); + + switch (state) { + case States::LOBBY: + case States::MAPVOTE: + return lobby.joined(peer); + + case States::CHARSELECT: { + return charSelect.joined(peer); + } + case States::GAME: { + return true; + } + case States::RESULTS: { + break; + } + default: break; + } + + return true; +} + +void GameStateController::playerLeft(Client &peer) { + Packet packet(PacketType::SERVER_PLAYER_LEFT); + packet.write(peer.getId()); + packet.sendBroadcast(*server, true); + + switch (state) + { + case States::LOBBY: + case States::MAPVOTE: + lobby.leaved(peer); + break; + + case States::CHARSELECT: + charSelect.leaved(peer); + break; + + case States::GAME: + //game_state_tick(server); + break; + + case States::RESULTS: + //results_state_tick(server); + break; + } +} + +void GameStateController::tick() { + switch (state) + { + case States::LOBBY: + case States::MAPVOTE: + lobby.tick(); + break; + + case States::CHARSELECT: + charSelect.tick(); + break; + + case States::GAME: + // game_state_tick(server); + break; + + case States::RESULTS: + // results_state_tick(server); + break; + } +} + +bool GameStateController::handle(Client &peer, Packet &packet) { + switch (packet.getPacketType()) { + case PacketType::CLIENT_LOBBY_CHOOSEBAN: { + if (!peer.isOpped()) { + break; + } + + clientId pid = packet.read(); + + for (auto &c : server->getClients()) { + if (c->getId() == pid) { + //TODO: add ban logic + c->disconnect(DisconnectReason::BANNEDBYHOST); + } + } + + break; + } + case PacketType::CLIENT_LOBBY_CHOOSEKICK: { + if (!peer.isOpped()) { + break; + } + + clientId pid = packet.read(); + + for (auto &c : server->getClients()) { + if (c->getId() == pid) { + //TODO: add kick logic + c->disconnect(DisconnectReason::KICKEDBYHOST); + } + } + + break; + } + case PacketType::CLIENT_LOBBY_CHOOSEOP: { + if (!peer.isOpped()) { + break; + } + + clientId pid = packet.read(); + + for (auto &c : server->getClients()) { + if (c->getId() == pid) { + //TODO: add operator logic + server->send_message(peer, "{}you're an operator now", CLRCODE_GRN); + } + } + + break; + } + default: break; + } + switch (state) { + case States::LOBBY: + case States::MAPVOTE: + lobby.handle(peer, packet); + break; + + case States::CHARSELECT: + charSelect.handle(peer, packet); + break; + + case States::GAME: + // game state handle + break; + + case States::RESULTS: + // results state handle + break; + } + + return true; +} + +unsigned long GameStateController::cmd_parse(std::string &string) { + static std::array clr_list = CLRLIST; + + std::string current; + bool started = false; + + for (char ch : string) + { + if (!started && std::isspace(static_cast(ch))) + continue; + + started = true; + + if (std::isspace(static_cast(ch))) + break; + + bool invalid = false; + + for (int j = 0; j < CLRLIST_LEN; ++j) + { + if (ch == clr_list[j][0]) + { + invalid = true; + break; + } + } + + if (!invalid) + current += ch; + } + + unsigned long hash = 0; + + for (unsigned char ch : current) + hash = 31 * hash + ch; + + return hash; +} + +bool GameStateController::cmd_handle(const Client &client, commandHash hash, const std::string &string) { + switch (hash) { + default: return false; break; + } + + return true; +} diff --git a/disasterserver/GameStateController.hpp b/disasterserver/GameStateController.hpp new file mode 100644 index 0000000..e3b26ab --- /dev/null +++ b/disasterserver/GameStateController.hpp @@ -0,0 +1,64 @@ +#ifndef DISASTERSERVER_STATEMACHINE_HPP +#define DISASTERSERVER_STATEMACHINE_HPP + +#include "Core/Packet.hpp" +#include "States/LobbyState.hpp" +#include "States/CharSelect.hpp" + +namespace DisasterServer +{ + class Client; + + enum class States { + LOBBY, + MAPVOTE, + CHARSELECT, + GAME, + RESULTS + }; + +#define CMD_HELP 45680751 +#define CMD_MAP 1478254 +#define CMD_STINK 1426706039 +#define CMD_VK 47971 +#define CMD_VP 47976 +#define CMD_BAN 1467681 +#define CMD_KICK 45773684 +#define CMD_OP 47759 +#define CMD_YES 1489913 +#define CMD_Y 1547 +#define CMD_NO 47727 +#define CMD_N 1536 +#define CMD_INFO 45719004 +#define CMD_LOBBY 1420085352 + + using commandHash = unsigned long; + + class GameStateController { + Server *server = nullptr; + States state = States::LOBBY; + + LobbyState lobby; + CharSelectState charSelect; + public: + explicit GameStateController(Server* server); + ~GameStateController(); + + bool playerJoined(Client& peer); + void playerLeft(Client& peer); + void tick(); + bool handle(Client& peer, Packet& packet); + + commandHash cmd_parse(std::string& string); + bool cmd_handle(const Client& client, commandHash hash, const std::string& string); + + States getCurrentState() const { return state; } + void setState(States state) { this->state = state; } + + + LobbyState& getLobbyState() { return lobby; } + CharSelectState& getCharSelect() { return charSelect; } + }; +} + +#endif //DISASTERSERVER_STATEMACHINE_HPP diff --git a/disasterserver/Main.cpp b/disasterserver/Main.cpp new file mode 100644 index 0000000..ef9ffc2 --- /dev/null +++ b/disasterserver/Main.cpp @@ -0,0 +1,32 @@ +#include "Server.hpp" + +#include "Core/Log.hpp" + +int main(int argc, char *argv[]) { +#ifdef _WIN32 + SetConsoleCP(CP_UTF8); + SetConsoleOutputCP(CP_UTF8); + + HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE); + + DWORD mode = 0; + if (GetConsoleMode(handle, &mode)) { + mode |= ENABLE_VIRTUAL_TERMINAL_PROCESSING; + SetConsoleMode(handle, mode); + } +#endif + + try { + enet_initialize(); + + Info("- DisasterServerCXX v{}", DisasterServer::BUILD_VERSION); + Info("- Build from {} {}", __DATE__, __TIME__); + + DisasterServer::Server server; + server.initialize(); + + enet_deinitialize(); + } catch (std::exception& e) { + Err("Exception: {}", e.what()); + } +} diff --git a/disasterserver/Server.cpp b/disasterserver/Server.cpp new file mode 100644 index 0000000..f0df033 --- /dev/null +++ b/disasterserver/Server.cpp @@ -0,0 +1,232 @@ +#include "Server.hpp" + +#include + +#include "Core/Packet.hpp" +#include "Core/Log.hpp" +#include "Core/Time.hpp" + +#include "GameStateController.hpp" +#include "Core/Colors.hpp" + +using namespace DisasterServer; + + +Server::Server(const uint16_t n) : id(n), stateManager(this) { + ENetAddress addr; + addr.host = ENET_HOST_ANY; + addr.port = BASE_SERVER_PORT + n; + host = enet_host_create(&addr, 50, 2, 0, 0); + + Info("Listening on port {}", addr.port); +} + +Server::~Server() { + enet_host_destroy(host); +}; + +void Server::initialize() { + TimeStamp ticker; + time_start(&ticker); + + double next_tick = time_end(&ticker); + double heartbeat = 0.0; + constexpr double TARGET_FPS = 1000.0 / 60; + + // + + while (!running) { + ENetEvent ev; + if (enet_host_service(host, &ev, 5) > 0) { + switch (ev.type) { + case ENET_EVENT_TYPE_CONNECT: { + char buf[250]; + enet_address_get_host_ip(&ev.peer->address, buf, 250); + + const clientId id = ev.peer->incomingPeerID + 1; + + auto client = std::make_unique(this, ev.peer, id, buf); + Client *rawClient = client.get(); + ev.peer->data = rawClient; + peers.push_back(std::move(client)); + + Debug("Connection peer id {}", rawClient->getId()); + + Packet pack(PacketType::SERVER_PREIDENTITY); + + auto &auth = rawClient->getAuthPeer(); + auth.one = (uint8_t) rand() % 128; + auth.two = (uint8_t) rand() % 255; + + uint32_t type = 0; + + switch (rand() % 3) + { + case 0: + type = 1u << 9; + break; + + case 1: + type = 1u << 31; + break; + + case 2: + type = 1u << 26; + break; + + default: break; + } + + for (int bit = 0; bit < 32; ++bit) + { + if (bit == 9 || bit == 31 || bit == 26) + continue; + + if (rand() % 3 <= 1) + type &= ~(1u << bit); + else + type |= 1u << bit; + } + + auth.type = type; + + pack.write(0); + pack.write(1); + pack.write(auth.one); + pack.write((uint8_t) rand() % 2); + pack.write(auth.two); + + const uint8_t key[6] = { 0x00, 0x00, 0xFF, 0x1F, 0x80, 0x14 }; + + for (int i = 0; i < 3; i++) { + pack.write(key[rand() % sizeof(key)]); + } + + pack.write(auth.type); + pack.send(*rawClient, true); + + break; + } + case ENET_EVENT_TYPE_DISCONNECT: { + Client *client = static_cast(ev.peer->data); + + if (!client) { + break; + } + + Info("{} (id {}) left.", client->getNickname(), client->getId()); + + if (client->isOpped() && client->isShouldTimeout()) { + + } + + if (client->isVerified()) { + stateManager.playerLeft(*client); + } + + ev.peer->data = nullptr; + + auto it = std::find_if( + peers.begin(), + peers.end(), + [client](const auto& p) { + return p.get() == client; + }); + + if (it != peers.end()) { + peers.erase(it); + } + + break; + } + case ENET_EVENT_TYPE_RECEIVE: { + Client *client = static_cast(ev.peer->data); + + if (!client) { + enet_packet_destroy(ev.packet); + break; + } + + if (ev.packet->dataLength < 2) { + enet_packet_destroy(ev.packet); + break; + } + + Packet packet(ev.packet); + + if (packet.getPacketType() == PacketType::IDENTITY) { + if (!client->identity(packet)) { + Debug("Identity failed for id {}", client->getId()); + } + } else { + client->message_received(packet); + } + break; + } + + default: break; + } + } + + double now = time_end(&ticker); + while (next_tick < now) { + next_tick += TARGET_FPS; + + stateManager.tick(); + + // Heartbeat + if (peers.size() > 0) { + Packet pack(PacketType::SERVER_HEARTBEAT); + if (heartbeat >= (TICKSPERSEC * 2)) + { + pack.sendBroadcast(*this, true); + //Debug("Heartbeat done."); + heartbeat = 0; + } + heartbeat += delta; + } + + delta = 1; + } + } +} + +void Server::disconnect_by_id(const clientId client_id, DisconnectReason reason, const std::string &message) { + for (auto &client : peers) { + if (client->getId() == client_id) { + return client->disconnect(reason, message); + } + } +} + +void Server::broadcast_ex(Packet &packet, bool reliable, clientId ignore) { + Debug("PacketType::{} sending broadcast, ignoring client {}", getPacketTypeName(packet.getPacketType()), ignore); + packet.sendBroadcast(*this, reliable, [ignore](const Client& v) { return v.getId() != ignore; }); +} + +size_t Server::getClientsInGameCount() { + return std::ranges::count_if(peers, + [](const auto& cl) { + return cl->isInGame(); + } + ); +} + +void Server::send_message(Client &client, std::string message) { + std::ranges::transform(message, message.begin(), [](const unsigned char c){ return std::tolower(c); }); + Packet packet(PacketType::CLIENT_CHAT_MESSAGE); + packet.write(0); + packet.writeString(message); + packet.send(client, true); +} + +void Server::send_broadcast_message(clientId sender, std::string message) { + Packet packet(PacketType::CLIENT_CHAT_MESSAGE); + packet.write(sender); + packet.writeString(message); + packet.sendBroadcast(*this, true); +} + +GameStateController &Server::getGameStateController() { + return stateManager; +} \ No newline at end of file diff --git a/disasterserver/Server.hpp b/disasterserver/Server.hpp new file mode 100644 index 0000000..998ff38 --- /dev/null +++ b/disasterserver/Server.hpp @@ -0,0 +1,62 @@ +#ifndef DISASTERSERVER_SERVER_HPP +#define DISASTERSERVER_SERVER_HPP + +#include "Client.hpp" +#include "GameStateController.hpp" + +constexpr int TICKSPERSEC = 60; + +namespace DisasterServer +{ + class GameStateController; + + constexpr int MAX_PLAYERS = 7; + constexpr int MAP_COUNT = 20; + constexpr int BUILD_VERSION = 1101; + constexpr int BASE_SERVER_PORT = 8606; + + + + class Server { + uint16_t id = 0; + bool running = false; + + ENetHost *host = nullptr; + + std::vector> peers; + GameStateController stateManager; + double delta = 0; + public: + Server(uint16_t n = 0); + ~Server(); + void initialize(); + + void disconnect_by_id(clientId client_id, DisconnectReason reason, const std::string& message = ""); + + void send_message(Client &client, std::string message); + void send_broadcast_message(clientId sender, std::string message); + + template + void send_message(Client &client, std::format_string fmt, Args&&... args) { + send_message(client, std::format(fmt, std::forward(args)...)); + } + + template + void send_broadcast_message(clientId sender, std::format_string fmt, Args&&... args) { + send_broadcast_message(sender, std::format(fmt, std::forward(args)...)); + } + + void broadcast_ex(Packet &packet, bool reliable, clientId ignore); + + + size_t getClientsInGameCount(); + std::vector> &getClients() { return peers; } + GameStateController &getGameStateController(); + + double getDelta() { + return delta; + } + }; +} + +#endif //DISASTERSERVER_SERVER_HPP diff --git a/disasterserver/States/CharSelect.cpp b/disasterserver/States/CharSelect.cpp new file mode 100644 index 0000000..64c8ee0 --- /dev/null +++ b/disasterserver/States/CharSelect.cpp @@ -0,0 +1,259 @@ +#include "CharSelect.hpp" + +#include + +#include "Server.hpp" +#include "Client.hpp" +#include "GameStateController.hpp" +#include "Core/Colors.hpp" + +using namespace DisasterServer; + +CharSelectState::CharSelectState(Server* server, GameStateController* controller) : server(server), controller(controller) { +} + +bool CharSelectState::chooseExe() { + uint32_t weight = 0; + + for (auto& peer : server->getClients()) { + if (!peer || !peer->isInGame()) + continue; + + peer->setExeCharacter(ExesCharacters::NONE); + peer->setSurvCharacter(SurvCharacters::NONE); + + weight += peer->getExeChance(); + } + + if (weight == 0) + weight++; + + uint32_t rnd = static_cast(std::rand()) % weight; + + for (auto& peer : server->getClients()) { + if (!peer || !peer->isInGame()) + continue; + + if (peer->getExeChance() >= 100) { + exe = peer->getId(); + return true; + } + + if (rnd < peer->getExeChance() && !peer->isModified()) { + Info("{} (id {}, c {}) is exe!", peer->getNickname(), peer->getId(), peer->getExeChance()); + + peer->setExeChance(1 + std::rand() % 1); + + exe = peer->getId(); + return true; + } + + rnd -= peer->getExeChance(); + } + + exe = static_cast(-1); + return false; +} + +bool CharSelectState::checkState() { + bool shouldStart = true; + + for (auto& peer : server->getClients()) { + if (!peer->isInGame()) + continue; + + if (peer->getExeCharacter() == ExesCharacters::NONE && + peer->getSurvCharacter() == SurvCharacters::NONE) { + shouldStart = false; + break; + } + } + + if (shouldStart) { + controller->setState(States::GAME); //Game start + return true; + } + + return true; +} + +bool CharSelectState::init(int8_t selectedMap) { + Debug("Attempting to enter ST_CHARSELECT..."); + + if (!chooseExe()) { + Err("Failed to pick exe for some reason!"); + + controller->setState(States::LOBBY); + return true; + } + + map = selectedMap; + controller->setState(States::CHARSELECT); + + countdownSec = 30; + countdown = TICKSPERSEC; + + avail.fill(true); + + Packet pack(PacketType::SERVER_LOBBY_EXE); + pack.write(exe); + pack.write(map); + pack.sendBroadcast(*server, true); + + Packet timePack(PacketType::SERVER_CHAR_TIME_SYNC); + timePack.write(countdownSec); + timePack.sendBroadcast(*server, true); + + Info("{}Server is now in {}Character Select{}", CLRCODE_YLW, CLRCODE_PUR, CLRCODE_RST); + + return true; +} + +bool CharSelectState::handle(Client& client, Packet& packet) { + switch (packet.getPacketType()) { + case PacketType::CLIENT_REQUEST_EXECHARACTER: { + if (!client.isInGame()) + break; + + if (exe != client.getId()) { + client.disconnect(DisconnectReason::OTHER, "Invalid exe character request"); + return false; + } + + uint8_t id = packet.read(); + id--; + + if (id > static_cast(ExesCharacters::COUNT)) { + client.disconnect(DisconnectReason::OTHER, "Invalid exe character"); + return false; + } + + client.setExeCharacter(static_cast(id)); + + Packet pack(PacketType::SERVER_LOBBY_EXECHARACTER_RESPONSE); + pack.write(id); + RAssert(pack.send(client, true)); + + Packet change(PacketType::SERVER_LOBBY_CHARACTER_CHANGE); + change.write(client.getId()); + change.write(id); + change.sendBroadcast(*server, true); + + Info("{}{}{} (id {}) choses [{}{}{}]!", client.getNickname(), CLRCODE_RST, "", client.getId(), CLRCODE_RED, EXE_NAMES[id], CLRCODE_RST); + return checkState(); + } + + case PacketType::CLIENT_REQUEST_CHARACTER: { + if (!client.isInGame()) { + break; + } + + if (client.getSurvCharacter() != SurvCharacters::NONE) { + break; + } + + if (exe == client.getId()) { + client.disconnect(DisconnectReason::OTHER, "Exe cannot select survivor character"); + return false; + } + + uint8_t id = packet.read(); + id--; + + if (id > static_cast(SurvCharacters::COUNT)) { + client.disconnect(DisconnectReason::OTHER, "Invalid survivor character"); + return false; + } + + const bool available = avail[id]; + + if (available) { + avail[id] = false; + } + + Packet response(PacketType::SERVER_LOBBY_CHARACTER_RESPONSE); + response.write(id + 1); + response.write(available); + + if (!response.send(client, true)) + return false; + + if (available) { + client.setSurvCharacter(static_cast(id)); + + Packet change(PacketType::SERVER_LOBBY_CHARACTER_CHANGE); + change.write(client.getId()); + change.write(id + 1); + change.sendBroadcast(*server, true); + } + + Info("{}{}{} (id {}) choses [{}{}{}]!", client.getNickname(), CLRCODE_RST, "", client.getId(), CLRCODE_GRN, SURV_NAMES[id], CLRCODE_RST); + return checkState(); + } + + case PacketType::CLIENT_CHAT_MESSAGE: { + const clientId pid = packet.read(); + const std::string message = packet.readString(); + + if (message.size() > 40) { + client.disconnect(DisconnectReason::OTHER, "Chat message too long"); + return false; + } + + client.setTimeout(0); + + Info("{}{}{} (id {}): {}", client.getNickname(), CLRCODE_RST, "", client.getId(), message); + break; + } + + default: break; + } + + return true; +} + +void CharSelectState::tick() { + if (countdown <= 0) { + countdown += TICKSPERSEC; + + if (--countdownSec == 0) { + for (auto& peer : server->getClients()) { + if (!peer || !peer->isInGame()) + continue; + + if (peer->getExeCharacter() == ExesCharacters::NONE + && peer->getSurvCharacter() == SurvCharacters::NONE) { + + peer->disconnect(DisconnectReason::AFKTIMEOUT); + } + } + } + + Packet pack(PacketType::SERVER_CHAR_TIME_SYNC); + pack.write(countdownSec); + pack.sendBroadcast(*server, true); + } + + countdown -= server->getDelta(); +} + +bool CharSelectState::joined(Client& client) { + return true; +} + +bool CharSelectState::leaved(Client& client) { + if (client.getSurvCharacter() != SurvCharacters::NONE) { + const auto character = client.getSurvCharacter(); + const size_t index = static_cast(character); + + if (index < avail.size()) { + avail[index] = true; + } + } + + if (this->server->getClientsInGameCount() <= 1 || client.getId() == exe) { + return controller->getLobbyState().init(); + } + + return checkState(); +} \ No newline at end of file diff --git a/disasterserver/States/CharSelect.hpp b/disasterserver/States/CharSelect.hpp new file mode 100644 index 0000000..ad7416a --- /dev/null +++ b/disasterserver/States/CharSelect.hpp @@ -0,0 +1,46 @@ +#ifndef DISASTERSERVER_CHARSELECTSTATE_HPP +#define DISASTERSERVER_CHARSELECTSTATE_HPP + +#include +#include + +#include "Client.hpp" +#include "Core/Packet.hpp" + +namespace DisasterServer { + +class GameStateController; + +class CharSelectState { + Server *server = nullptr; + GameStateController* controller = nullptr; + + double countdown = 0; + uint8_t countdownSec = 30; + + int8_t map = 0; + clientId exe = 0; + + std::array avail{}; + + bool checkState(); + bool chooseExe(); + +public: + CharSelectState(Server* server, GameStateController* controller); + ~CharSelectState() = default; + + bool init(int8_t map); + + bool joined(Client& client); + bool leaved(Client& client); + void tick(); + bool handle(Client& client, Packet& packet); + + clientId getExe() const { return exe; } + int8_t getMap() const { return map; } +}; + +} + +#endif // DISASTERSERVER_CHARSELECTSTATE_HPP \ No newline at end of file diff --git a/disasterserver/States/LobbyState.cpp b/disasterserver/States/LobbyState.cpp new file mode 100644 index 0000000..4b9dc53 --- /dev/null +++ b/disasterserver/States/LobbyState.cpp @@ -0,0 +1,485 @@ +#include "LobbyState.hpp" + +#include + +#include "Server.hpp" +#include "GameStateController.hpp" +#include "Core/Colors.hpp" + +using namespace DisasterServer; + +LobbyState::LobbyState(Server *server, GameStateController *controller) : server(server), controller(controller), vote(server) { +} + +LobbyState::~LobbyState() = default; + +bool LobbyState::init() { + for (auto &peer : server->getClients()) { + peer->setReady(false); + peer->setVoted(false); + peer->setTimeout(0); + + if (!peer->isInGame()) { + peer->setInGame(true); + + Packet pack(PacketType::SERVER_IDENTITY_RESPONSE); + pack.write(1); + pack.write(peer->getId()); + if (!pack.send(*peer, true)) { + peer->disconnect(DisconnectReason::SERVERTIMEOUT); + continue; + } + } else { + /* + if (v->id != server->game.exe) + v->exe_chance += 2 + rand() % 5; + */ + + Packet pack(PacketType::SERVER_LOBBY_EXE_CHANCE); + pack.write(peer->getExeChance()); + pack.send(*peer, true); + } + } + + controller->setState(States::LOBBY); + countdown = TICKSPERSEC; + countdown_sec = NO_COUNTDOWN; + prac_countdown = 0; + + Packet pack(PacketType::SERVER_GAME_BACK_TO_LOBBY); + pack.sendBroadcast(*server, true); + + return true; +} + +bool LobbyState::sendCountdown() { + Packet pack(PacketType::SERVER_LOBBY_COUNTDOWN); + pack.write(this->countdown_sec < NO_COUNTDOWN); + pack.write(countdown_sec); + pack.sendBroadcast(*server, true); + return true; +} + +bool LobbyState::checkCountdown() { + const auto players = &server->getClients(); + + if (players->size() <= 1) { + return true; + } + + const auto ready = std::ranges::count_if( + *players, + [](const auto& peer) { + return peer->isReady(); + } + ); + + Debug("Players isReady {}/{}", ready, players->size()); + + if (ready == players->size() && players->size() > 1) { + countdown = TICKSPERSEC; + countdown_sec = COUNTDOWN; + return sendCountdown(); + } + + if (countdown_sec != NO_COUNTDOWN) { + countdown = TICKSPERSEC; + countdown_sec = NO_COUNTDOWN; + return sendCountdown(); + } + + return true; +} + +void LobbyState::checkVote() { + if (vote.check()) { + switch (vote.getCurrentVoteType()) { + case VoteType::KICK: { + this->server->send_broadcast_message(0, "vote kick @succeeded~ (@{} ~from \\{})", vote.getVoteCount(), vote.getVoteTotal()); + this->server->disconnect_by_id(kick_target, DisconnectReason::KICKEDBYHOST); + break; + } + + case VoteType::PRACTICE: { + this->server->send_broadcast_message(0, "vote practice succeeded~ (@{} ~from \\{}", vote.getVoteCount(), vote.getVoteTotal()); + prac_countdown = 2 * TICKSPERSEC; + break; + } + + default: break; + } + } else { + switch (vote.getCurrentVoteType()) { + case VoteType::KICK: { + this->server->send_broadcast_message(0, "vote kick \\failed~ (@{} ~from \\{})", vote.getVoteCount(), vote.getVoteTotal()); + break; + } + + case VoteType::PRACTICE: { + this->server->send_broadcast_message(0, "vote practice \\failed~ (@{} ~from \\{}", vote.getVoteCount(), vote.getVoteTotal()); + break; + } + + default: break; + } + } + + + vote.setOnGoing(false); +} + +bool LobbyState::joined(Client &peer) { + RAssert(checkCountdown()); + return true; +} + +bool LobbyState::leaved(Client &peer) { + if (!peer.isInGame()) { + return true; + } + + RAssert(checkCountdown()); + return true; +} + +bool LobbyState::tick() { + switch (controller->getCurrentState()) { + case States::LOBBY: { + for (auto &peer : server->getClients()) { + if (peer->getVoteCooldown() > 0) { + peer->setVoteCooldown(peer->getVoteCooldown() - server->getDelta()); + } + + if (!peer->isReady()) { + + //Чтобы не мешалось + /* + peer->setTimeout(peer->getTimeout() + server->getDelta()); + if (std::fmod(peer->getTimeout(), 60) == 0) { + Debug("tick for {}: {}", peer->getNickname(), peer->getTimeout() / 60.0f); + } + */ + + if (peer->getTimeout() >= 25 * TICKSPERSEC) { + peer->disconnect(DisconnectReason::AFKTIMEOUT); + } + } else { + peer->setTimeout(0); + } + } + break; + } + default: break; + } + + if (vote.isOnGoing() && !vote.tick()) { + checkVote(); + } + + if (prac_countdown > 0) { + prac_countdown -= server->getDelta(); + if (prac_countdown <= 0) { + return init(); + } + } + + if (countdown_sec <= COUNTDOWN) { + if (countdown <= 0) { + countdown += TICKSPERSEC; + + if (--countdown_sec == 0) { + return controller->getCharSelect().init(map) || init(); + } + + RAssert(sendCountdown()); + } + + countdown -= server->getDelta(); + } + + return true; +} + +bool LobbyState::handle(Client &client, Packet &packet) { + bool result = true; + + switch (packet.getPacketType()) { + case PacketType::CLIENT_LOBBY_PLAYERS_REQUEST: { + for (auto &c : server->getClients()) { + if (client.getId() == c->getId()) { + continue; + } + + Packet pack(PacketType::SERVER_LOBBY_PLAYER); + pack.write(c->getId()); + pack.write(c->isReady()); + pack.writeString(c->getNickname()); + pack.write(c->getLobbyIcon()); + pack.write(c->getPet()); + if (!pack.send(client, true)) { + result = false; + break; + } + } + + Packet pack(PacketType::SERVER_LOBBY_CORRECT); + pack.send(client, true); + + server->send_message(client, "|build from &{} @{}~", __DATE__, __TIME__); + server->send_message(client, "|type .help for command list~"); + + break; + } + + case PacketType::CLIENT_CHAT_MESSAGE: { + clientId pid = packet.read(); + std::string message = packet.readString(); + + bool ignore = true; + commandHash hash = controller->cmd_parse(message); + + switch (hash) { + default: { + if (!controller->cmd_handle(client, hash, message)) { + ignore = false; + } + break; + } + + case CMD_MAP: { + /*if (!client.isOpped()) { + this->server->send_message(client, "{}you aren't an operator", CLRCODE_RED); + break; + }*/ + + int ind; + if (sscanf(message.c_str(), ".map %d", &ind) <= 0) { + this->server->send_message(client, "{}example:~ .map 1", CLRCODE_RED); + break; + } + + ind--; + if (ind < 0 || ind >= MAP_COUNT+1) { + this->server->send_message(client, "{}map should be between 1 and {}", CLRCODE_RED, MAP_COUNT+1); + break; + } + + controller->getCharSelect().init(ind); + break; + } + + case CMD_HELP: { + this->server->send_message(client, "~-----~ {}command list:{} ~-----~", CLRCODE_GRN, CLRCODE_RST); + this->server->send_message(client, "|- .vk~ - vote kick "); + this->server->send_message(client, "|- .info~ - information about server"); + this->server->send_message(client, "|- .vp~ - vote practice mode (wip)"); + break; + } + + case CMD_INFO: { + this->server->send_message(client, "|build from &{} @{}~", __DATE__, __TIME__); + this->server->send_message(client, "{}hander{} - original binary", CLRCODE_YLW, CLRCODE_RST); + this->server->send_message(client, "{}miles{}glitch{} - rewritten server to c++", CLRCODE_BLU, CLRCODE_PUR, CLRCODE_RST); + this->server->send_message(client, "{}faker{}null{}0{} - help with code", CLRCODE_GRA, CLRCODE_RED, CLRCODE_GRN, CLRCODE_RST); + break; + } + + case CMD_Y: + case CMD_YES: { + if (!vote.isOnGoing()) { + break; + } + + if (!client.isCanVote()) { + this->server->send_message(client, "{}you can't participate in this vote.", CLRCODE_RED); + break; + } + + if (vote.getCurrentVoteType() == VoteType::KICK && kick_target == client.getId()) { + this->server->send_message(client, "{}why are you kicking yourself ???", CLRCODE_RED); + break; + } + + switch (vote.add(client)) { + + case VoteState::SUCCESS: { + this->server->send_broadcast_message(0, "{}~ {}voted~.", client.getNickname(), CLRCODE_GRN); + break; + } + + case VoteState::ALREADY_VOTED: { + this->server->send_message(client, "{}you have already voted.", CLRCODE_RED); + break; + } + + case VoteState::FULL: { + checkVote(); + break; + } + + default: break; + } + + break; + } + + + case CMD_VP: { + if (vote.isOnGoing()) { + if (!client.isCanVote()) { + this->server->send_message(client, "{}you can't participate in this vote.", CLRCODE_RED); + break; + } + + if (pid == kick_target) { + switch (vote.add(client)) { + case VoteState::SUCCESS: { + this->server->send_broadcast_message(0, "{}~ {}voted~.", client.getNickname(), CLRCODE_GRN); + break; + } + case VoteState::ALREADY_VOTED: { + this->server->send_message(client, "{}you have already voted.", CLRCODE_RED); + break; + } + case VoteState::FULL: { checkVote(); break; } + default: break; + } + } else { + this->server->send_message(client, "{}another vote is already in progress.", CLRCODE_RED); + } + break; + } + + if (client.getVoteCooldown() > 0) { + this->server->send_message(client, "you cannot start another vote for {}", static_cast(client.getVoteCooldown() / TICKSPERSEC)); + break; + } + + if (!vote.init(VoteType::PRACTICE, 0)) { + this->server->send_message(client, "{}not enough participants.", CLRCODE_RED); + break; + } + + this->server->send_broadcast_message(0, "{}~ `started practice vote.~", client.getNickname()); + this->server->send_broadcast_message(0, "type @.yes~ or ignore"); + this->server->send_broadcast_message(0, "results will be summarized in @20~ sec"); + + vote.add(client); + client.setVoteCooldown(30 * TICKSPERSEC); + break; + } + + case CMD_VK: { + if (vote.isOnGoing()) { + this->server->send_message(client, "{}another vote is already in progress.", CLRCODE_RED); + break; + } + + if (client.getVoteCooldown() > 0) { + this->server->send_message(client, "you cannot start another vote for {}", static_cast(client.getVoteCooldown() / TICKSPERSEC)); + break; + } + + if (this->server->getClients().size() > 2) { + Packet pack(PacketType::SERVER_LOBBY_CHOOSEVOTEKICK); + pack.send(client, true); + } else { + this->server->send_message(client, "{}not enough participants.", CLRCODE_RED); + } + + break; + } + } + + Info("{} (id {}): {}", client.getNickname(), client.getId(), message); + if (!ignore) { + server->send_broadcast_message(client.getId(), message); + } + + break; + } + case PacketType::CLIENT_LOBBY_READY_STATE: { + uint8_t state = packet.read(); + client.setReady(state); + + Packet pack(PacketType::SERVER_LOBBY_READY_STATE); + pack.write(client.getId()); + pack.write(state); + pack.sendBroadcast(*this->server, true); + + break; + } + + case PacketType::CLIENT_LOBBY_CHOOSEVOTEKICK: { + clientId pid = packet.read(); + + if (vote.isOnGoing()) { + if (!client.isCanVote()) { + this->server->send_message(client, "{}you can't participate in this vote.", CLRCODE_RED); + break; + } + + if (pid == kick_target) { + switch (vote.add(client)) { + case VoteState::SUCCESS: { + this->server->send_broadcast_message(0, "{}~ {}voted~.", client.getNickname(), CLRCODE_GRN); + break; + } + case VoteState::ALREADY_VOTED: { + this->server->send_message(client, "{}you have already voted.", CLRCODE_RED); + break; + } + case VoteState::FULL: { checkVote(); break; } + default: break; + } + } else { + this->server->send_message(client, "{}another vote is already in progress.", CLRCODE_RED); + } + + break; + } else { + bool found = false; + for (auto &c : this->server->getClients()) { + if (c->getId() == pid) { + + if (c->isOpped()) { + this->server->send_message(client, "you're permissionless"); + return true; + } + + kick_target = c->getId(); + found = true; + break; + } + } + + if (found) { + if (client.getVoteCooldown() > 0) { + this->server->send_message(client, "you cannot start another vote for {}", static_cast(client.getVoteCooldown() / TICKSPERSEC)); + break; + } + + if (!vote.init(VoteType::KICK, kick_target)) { + this->server->send_message(client, "{}not enough participants.", CLRCODE_RED); + break; + } + + this->server->send_broadcast_message(0, "{}~ `started kick vote.~", client.getNickname()); + this->server->send_broadcast_message(0, "type @.yes~ or ignore"); + this->server->send_broadcast_message(0, "results will be summarized in @20~ sec"); + + vote.add(client); + client.setVoteCooldown(30 * TICKSPERSEC); + } else { + this->server->send_broadcast_message(0, "{}specified player not found.", CLRCODE_RED); + } + } + + break; + } + + default: break; + } + + return result; +} \ No newline at end of file diff --git a/disasterserver/States/LobbyState.hpp b/disasterserver/States/LobbyState.hpp new file mode 100644 index 0000000..ba9b88c --- /dev/null +++ b/disasterserver/States/LobbyState.hpp @@ -0,0 +1,51 @@ +#ifndef DISASTERSERVER_LOBBY_HPP +#define DISASTERSERVER_LOBBY_HPP + +#include +#include "Vote.hpp" + +constexpr int COUNTDOWN = 5; +constexpr int NO_COUNTDOWN = 5 + 1; + +namespace DisasterServer +{ + class GameStateController; + + class LobbyState { + Server *server = nullptr; + GameStateController *controller = nullptr; + + double countdown = 0; + double prac_countdown = 0; + uint8_t countdown_sec = 0; + Vote vote; + clientId kick_target = 0; + + /* Map Vote */ + uint8_t maps[3] = {}; + uint8_t votes[3] = {}; + + /* Character Select */ + int8_t map = 0; + clientId exe = 0; + std::unordered_map avail; + public: + explicit LobbyState(Server *server, GameStateController *controller); + ~LobbyState(); + + bool init(); + + bool sendCountdown(); + bool checkCountdown(); + void checkVote(); + + bool joined(Client &peer); + bool leaved(Client &peer); + bool tick(); + bool handle(Client &client, Packet &packet); + }; + + +} + +#endif //DISASTERSERVER_LOBBY_HPP diff --git a/disasterserver/States/Vote.cpp b/disasterserver/States/Vote.cpp new file mode 100644 index 0000000..70582f4 --- /dev/null +++ b/disasterserver/States/Vote.cpp @@ -0,0 +1,64 @@ +#include "Vote.hpp" + +#include + +#include "Client.hpp" +#include "Server.hpp" + +using namespace DisasterServer; + +Vote::Vote(Server *server) : server(server) {} + +Vote::~Vote() = default; + +bool Vote::init(VoteType type, clientId id) { + ongoing = false; + votes.clear(); + auto &players = server->getClients(); + this->type = type; + + for (auto &c: server->getClients()) { + c->setCanVote(c->getId() != id); + } + this->votedTotal = std::ranges::count_if(players, [](const auto& peer) { return peer->isCanVote(); }); + + if (votedTotal <= 1) { + return false; + } + + this->ongoing = true; + this->countdown = 20 * TICKSPERSEC; + return true; +} + +VoteState Vote::add(Client & voter) { + if (this->votes.contains(voter.getId())) { + return VoteState::ALREADY_VOTED; + } + + votes.insert(voter.getId()); + + if (votes.size() >= votedTotal) { + return VoteState::FULL; + } + + return VoteState::SUCCESS; +} + +bool Vote::tick() { + if (!ongoing) { + return false; + } + + countdown -= server->getDelta(); + + if (countdown <= 0) { + return false; + } + + return true; +} + +bool Vote::check() { + return votes.size() * 4 > votedTotal; +} \ No newline at end of file diff --git a/disasterserver/States/Vote.hpp b/disasterserver/States/Vote.hpp new file mode 100644 index 0000000..a4af456 --- /dev/null +++ b/disasterserver/States/Vote.hpp @@ -0,0 +1,52 @@ +#ifndef DISASTERSERVER_VOTE_HPP +#define DISASTERSERVER_VOTE_HPP + +#include + +#include "Client.hpp" + +namespace DisasterServer { + class Server; + + enum class VoteType + { + KICK, + PRACTICE + }; + + enum class VoteState + { + SUCCESS = 1, + NOT_ONGOING = 2, + NOT_ALLOWED = 3, + ALREADY_VOTED = 0, + FULL = -1, + }; + + class Vote { + Server *server = nullptr; + + VoteType type = VoteType::KICK; + bool ongoing = false; + + std::unordered_set votes; + size_t votedTotal; + double countdown = 0; + public: + Vote(Server *server); + ~Vote(); + + bool init(VoteType type, clientId id); + VoteState add(Client &voter); + bool tick(); + bool check(); + + void setOnGoing(bool flag) { ongoing = flag; } + bool isOnGoing() { return ongoing; } + VoteType getCurrentVoteType() { return type; } + size_t getVoteTotal() { return votedTotal; } + size_t getVoteCount() { return votes.size(); } + }; +} + +#endif //DISASTERSERVER_VOTE_HPP diff --git a/disasterserver_c/Android.c b/disasterserver_c/Android.c new file mode 100644 index 0000000..e323d68 --- /dev/null +++ b/disasterserver_c/Android.c @@ -0,0 +1,15 @@ +#include +#include +#include +#include + +JNIEXPORT jboolean JNICALL Java_com_teamexeempire_disaster2d_Disaster_disaster_1start +(JNIEnv* env, jclass class) +{ + if (!disaster_init()) + return false; + + Thread th; + ThreadSpawn(th, disaster_run, NULL); + return true; +} \ No newline at end of file diff --git a/disasterserver_c/Android.h b/disasterserver_c/Android.h new file mode 100644 index 0000000..d318f06 --- /dev/null +++ b/disasterserver_c/Android.h @@ -0,0 +1,20 @@ +#include +#ifndef _Included_com_teamexeempire_disaster2d_Disaster +#define _Included_com_teamexeempire_disaster2d_Disaster +#ifdef __cplusplus +extern "C" { +#endif +#undef com_teamexeempire_disaster2d_Disaster_MIN_PRIORITY +#define com_teamexeempire_disaster2d_Disaster_MIN_PRIORITY 1L +#undef com_teamexeempire_disaster2d_Disaster_NORM_PRIORITY +#define com_teamexeempire_disaster2d_Disaster_NORM_PRIORITY 5L +#undef com_teamexeempire_disaster2d_Disaster_MAX_PRIORITY +#define com_teamexeempire_disaster2d_Disaster_MAX_PRIORITY 10L + +JNIEXPORT jboolean JNICALL Java_com_teamexeempire_disaster2d_Disaster_disaster_1start +(JNIEnv*, jclass); + +#ifdef __cplusplus +} +#endif +#endif diff --git a/disasterserver_c/Api.h b/disasterserver_c/Api.h new file mode 100644 index 0000000..ac7b45f --- /dev/null +++ b/disasterserver_c/Api.h @@ -0,0 +1,10 @@ +#ifndef API_H +#define API_H + +#ifdef _WIN32 + #define SERVER_API __declspec(dllexport) +#else + #define SERVER_API +#endif + +#endif \ No newline at end of file diff --git a/disasterserver_c/Auth.c b/disasterserver_c/Auth.c new file mode 100644 index 0000000..fd5dca6 --- /dev/null +++ b/disasterserver_c/Auth.c @@ -0,0 +1,102 @@ +#include +#include +#include +#include + +bool auth_create_ticket(PeerData* peer, Packet* packet) +{ + peer->auth.one = (uint8_t) rand() % 128; + peer->auth.two = (uint8_t) rand() % 255; + + uint32_t type = 0; + + switch (rand() % 3) + { + case 0: + type = 1u << 9; + break; + + case 1: + type = 1u << 31; + break; + + case 2: + type = 1u << 26; + break; + + default: break; + } + + for (int bit = 0; bit < 32; ++bit) + { + if (bit == 9 || bit == 31 || bit == 26) + continue; + + if (rand() % 3 <= 1) + type &= ~(1u << bit); + else + type |= 1u << bit; + } + + + peer->auth.type = type; + // Red herrings? Nah, we have Red Rope(TM) + // All values here are complete bogus btw + PacketWrite(packet, packet_write16, 0); + PacketWrite(packet, packet_write16, 1); + PacketWrite(packet, packet_write8, peer->auth.one); + PacketWrite(packet, packet_write8, (uint8_t) rand() % 2); + PacketWrite(packet, packet_write8, peer->auth.two); + for (int i = 0; i < 3; i++) + { + const char key[] = { 0x00, 0x00, 0xFF, 0x1F, 0x80, 0x14 }; + PacketWrite(packet, packet_write8, key[rand() % sizeof(key)]); + } + PacketWrite(packet, packet_write32, peer->auth.type); + return true; +} + +bool auth_verify_ticket(PeerData* v, Packet* packet) +{ + PacketRead(checkcum, packet, packet_read64, uint64_t); + PacketRead(checkcum2, packet, packet_read64, uint64_t); + + Debug("checkcum : %x", checkcum); + Debug("checkcum2 : %x", checkcum2); + + uint64_t check = checkcum - v->auth.type; + uint64_t checka = checkcum2 - v->auth.type; + + Debug("check : %x", check); + Debug("checka : %x", checka); + + if ((v->auth.type >> 9) & 1) + { + if (check != 0x2f09cdda) + v->mod_tool = 1; + + if (checka != 0xf1006056) + v->mod_tool = 1; + } + else if ((v->auth.type & 0x80000000) != 0) + { + if (check != 0x947) + v->mod_tool = 1; + + if (checka != 0xb43) + v->mod_tool = 1; + } + else if ((v->auth.type >> 26) & 1) + { + if (check != 0xdcd) + v->mod_tool = 1; + + if (checka != 0xc15) + v->mod_tool = 1; + } + else + { + v->mod_tool = 1; + } + return true; +} diff --git a/disasterserver_c/Auth.h b/disasterserver_c/Auth.h new file mode 100644 index 0000000..b887bd7 --- /dev/null +++ b/disasterserver_c/Auth.h @@ -0,0 +1,19 @@ +#ifndef AUTH_H +#define AUTH_H +#include +#include + +// Override this struct in your auth provider +typedef struct +{ + uint32_t type; + uint8_t one; + uint8_t two; +} auth_peer_data; + +typedef struct PeerData PeerData; + +bool auth_create_ticket(PeerData* peer, Packet* packet); +bool auth_verify_ticket(PeerData* peer, Packet* packet); + +#endif diff --git a/disasterserver_c/CMakeLists.txt b/disasterserver_c/CMakeLists.txt new file mode 100644 index 0000000..333bb70 --- /dev/null +++ b/disasterserver_c/CMakeLists.txt @@ -0,0 +1,174 @@ +set(SOURCES + "Auth.c" + "Config.c" + "cJSON.c" + "UTF8.c" + "CMath.c" + "DyList.c" + "Log.c" + "Lib.c" + "Vote.c" + "Maps.c" + "Packet.c" + "Player.c" + "Palette.c" + "Zone.c" + + "Server.c" + "states/Lobby.c" + "states/Mapvote.c" + "states/CharSelect.c" + "states/Game.c" + "states/Results.c" + "io/Time.c" + + "entities/Ring.c" + "entities/CreamRing.c" + "entities/TailsProjectile.c" + "entities/EggmanTracker.c" + "entities/BlackRing.c" + "entities/ExellerClone.c" + "entities/RMZSlug.c" + "entities/RMZShard.c" + "entities/Act9Wall.c" + "entities/NotPerfect.c" + "entities/PFLift.c" + "entities/HDDoor.c" + "entities/SpkieController.c" + "entities/LCEye.c" + "entities/LCChain.c" + "entities/NAPSnowball.c" + "entities/NAPIce.c" + "entities/HillThunder.c" + "entities/VVLava.c" + "entities/YouCantRun.c" + "entities/TCAcid.c" + "entities/KAFSpeedBox.c" + "entities/TailsDoll.c" + "entities/DTBall.c" + "entities/DTStalactits.c" + "entities/Dummy.c" + "entities/WDLatern.c" + "entities/MJLava.c" + "entities/MJAss.c" + "entities/MJJudger.c" + + "maps/RavineMist.c" + "maps/Act9.c" + "maps/NotPerfect.c" + "maps/PricelessFreedom.c" + "maps/HauntingDream.c" + "maps/DotDotDot.c" + "maps/LimpCity.c" + "maps/NastyParadise.c" + "maps/Hill.c" + "maps/VolcanoValley.c" + "maps/YouCantRun.c" + "maps/TortureCave.c" + "maps/KindAndFair.c" + "maps/DarkTower.c" + "maps/FartZone.c" + "maps/MajinForest.c" + "maps/HideAndSeek.c" + "maps/WoodDream.c" + "maps/Marijuna.c" +) + +if(ANDROID) + add_library(DisasterServer SHARED "Android.c" ${SOURCES}) + + set(THREADS_PREFER_PTHREAD_FLAG ON) + find_package(Threads REQUIRED) + target_include_directories(DisasterServer PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}) + target_link_libraries(DisasterServer PRIVATE log enet m Threads::Threads) +else() + if(DYLIB) # Build .dll or .so + add_library(DisasterServer SHARED ${SOURCES}) + + if (WIN32) + target_link_libraries(DisasterServer PRIVATE enet ws2_32 winmm dbghelp) + else() # UNIX + set(THREADS_PREFER_PTHREAD_FLAG ON) + find_package(Threads REQUIRED) + target_link_libraries(DisasterServer PRIVATE enet m Threads::Threads) + endif() + + target_include_directories(DisasterServer PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}) + + else() # Build executable + if(BUILD_UI) + set(UI_SOURCES + "ui/Resources.c" + "ui/Main.c" + "ui/Image.c" + "ui/Label.c" + "ui/Button.c" + "ui/TButton.c" + "ui/MapList.c" + "ui/Presets.c" + "ui/MapListPreset.c" + "ui/PingPreset.c" + "ui/PlayerList.c" + ) + + if (WIN32) + add_executable(DisasterServer + ${SOURCES} + ${UI_SOURCES} + ) + + target_link_libraries(DisasterServer PRIVATE + ws2_32 + enet + winmm + dbghelp + SDL3-static + SDL3_image::SDL3_image + ) + + target_include_directories(DisasterServer PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}) + + target_sources(DisasterServer PRIVATE "${CMAKE_SOURCE_DIR}/resources/icon.rc") + + else() # UNIX + add_executable(DisasterServer + ${SOURCES} + ${UI_SOURCES} + ) + + set(THREADS_PREFER_PTHREAD_FLAG ON) + find_package(Threads REQUIRED) + target_link_libraries(DisasterServer PRIVATE enet m Threads::Threads + SDL3::SDL3-static + SDL3_image::SDL3_image + ) + endif() + + target_include_directories(DisasterServer PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}) + + else() + add_executable(DisasterServer + ${SOURCES} + Main.c + ) + + if (WIN32) + target_link_libraries(DisasterServer PRIVATE enet ws2_32 winmm dbghelp) + else() # UNIX + set(THREADS_PREFER_PTHREAD_FLAG ON) + find_package(Threads REQUIRED) + target_link_libraries(DisasterServer PRIVATE enet m Threads::Threads) + endif() + + target_include_directories(DisasterServer PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}) + + endif() + endif() +endif() + +if(MSVC) + add_definitions(-D_CRT_SECURE_NO_WARNINGS) +endif() + +unset(DYLIB CACHE) +unset(BUILD_UI CACHE) diff --git a/disasterserver_c/CMath.c b/disasterserver_c/CMath.c new file mode 100644 index 0000000..0a90e39 --- /dev/null +++ b/disasterserver_c/CMath.c @@ -0,0 +1,21 @@ +#include + +float lerp(float a, float b, float f) +{ + return a * (1.0f - f) + (b * f); +} + +float sign(float x) +{ + return ((x) > 0) ? 1.f : (((x) < 0) ? -1.f : 0.f); +} + +float vector2_dist(Vector2* a, Vector2* b) +{ + return sqrtf(powf(b->x - a->x, 2) + powf(b->y - a->y, 2)); +} + +Vector2 vector2_dir(Vector2* a, Vector2* b) +{ + return (Vector2) { sign(a->x - b->x), sign(a->y - b->y) }; +} diff --git a/disasterserver_c/CMath.h b/disasterserver_c/CMath.h new file mode 100644 index 0000000..8e50030 --- /dev/null +++ b/disasterserver_c/CMath.h @@ -0,0 +1,17 @@ +#ifndef CMATH_H +#define CMATH_H +#include + +typedef struct +{ + float x; + float y; +} Vector2; + +float lerp(float a, float b, float f); +float sign(float x); + +float vector2_dist(Vector2* a, Vector2* b); +Vector2 vector2_dir(Vector2* a, Vector2* b); + +#endif diff --git a/disasterserver_c/Colors.h b/disasterserver_c/Colors.h new file mode 100644 index 0000000..b6fea8e --- /dev/null +++ b/disasterserver_c/Colors.h @@ -0,0 +1,16 @@ +#ifndef COLORS_H +#define COLORS_H + +#define CLRCODE_RED "\\" +#define CLRCODE_GRN "@" +#define CLRCODE_PUR "&" +#define CLRCODE_BLU "/" +#define CLRCODE_GRA "|" +#define CLRCODE_YLW "`" +#define CLRCODE_ORG "\xE2\x84\x96" +#define CLRCODE_RST "~" + +#define CLRLIST { CLRCODE_RED, CLRCODE_GRN, CLRCODE_PUR, CLRCODE_BLU, CLRCODE_GRA, CLRCODE_YLW, CLRCODE_ORG, CLRCODE_RST } +#define CLRLIST_LEN 8 + +#endif \ No newline at end of file diff --git a/disasterserver_c/Config.c b/disasterserver_c/Config.c new file mode 100644 index 0000000..605f60d --- /dev/null +++ b/disasterserver_c/Config.c @@ -0,0 +1,446 @@ +#include +#include +#include +#include +#include +#include +#include +#include + +#ifdef SYS_ANDROID + #include +#endif + +#ifdef SYS_USE_SDL2 +#include +#endif + +SERVER_API Config g_config = +{ + .port = 8606, + .server_count = 1, + +#ifdef SYS_ANDROID + .ping_limit = UINT16_MAX, +#else + .ping_limit = 250, +#endif + + .log_debug = false, + .log_file = false, + .map_list = { true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true }, + .motd = "", + .anticheat = true, + .pride = true, + .chatfix = true, +}; + +cJSON* g_bans = NULL; +cJSON* g_timeouts = NULL; +cJSON* g_ops = NULL; +Mutex g_banMut; +Mutex g_timeoutMut; +Mutex g_opMut; + +bool write_default(const char* filename, const char* default_str) +{ + FILE* file = fopen(filename, "r"); + if (!file) + { + file = fopen(filename, "w"); + + if (!file) + { + Warn("Failed to open %s for writing.", filename); + return false; + } + + fwrite(default_str, 1, strlen(default_str), file); + fclose(file); + } + + return true; +} + +bool collection_save(const char* file, cJSON* value) +{ + char* buffer = cJSON_Print(value); + FILE* f = fopen(file, "w"); + if (!f) + { + Warn("Failed to open %s for writing.", file); + return false; + } + + fwrite(buffer, 1, strlen(buffer), f); + fclose(f); + free(buffer); + + return true; +} + +bool collection_init(cJSON** output, const char* file, const char* default_value) +{ + RAssert(write_default(file, default_value)); + + FILE* f = fopen(file, "r"); + if (!f) + { + Warn("what de fuck"); + return false; + } + + fseek(f, 0, SEEK_END); + size_t len = ftell(f); + char* buffer = malloc(len); + if (!buffer) + { + Warn("Failed to allocate buffer for a list!"); + return false; + } + + fseek(f, 0, SEEK_SET); + fread(buffer, 1, len, f); + fclose(f); + + *output = cJSON_ParseWithLength(buffer, len); + if (!(*output)) + { + Err("Failed to parse %s: %s", file, cJSON_GetErrorPtr()); + *output = cJSON_CreateObject(); + return false; + } + else + Debug("%s loaded.", file); + + free(buffer); + return true; +} + +bool config_init(void) +{ + MutexCreate(g_config.map_list_lock); + + // Try to open config + FILE* file = fopen(CONFIG_FILE, "r"); + if (!file) + { + RAssert(config_save()); + + // Reopen + file = fopen(CONFIG_FILE, "r"); + if (!file) + { + Warn("Failed to save default config file properly!"); + goto init_balls; + } + } + + char buffer[1024] = { 0 }; + size_t len = fread(buffer, 1, 1024, file); + fclose(file); + + cJSON* json = cJSON_ParseWithLength(buffer, len); + if (!json) + { + Err("Failed to parse %s: %s", CONFIG_FILE, cJSON_GetErrorPtr()); + return false; + } + else + Debug("%s loaded.", CONFIG_FILE); + + g_config.port = (int32_t)cJSON_GetNumberValue(cJSON_GetObjectItemCaseSensitive(json, "port")); + g_config.server_count = (int32_t)cJSON_GetNumberValue(cJSON_GetObjectItemCaseSensitive(json, "server_count")); + g_config.ping_limit = (int32_t)cJSON_GetNumberValue(cJSON_GetObjectItemCaseSensitive(json, "ping_limit")); + g_config.log_file = cJSON_IsTrue(cJSON_GetObjectItemCaseSensitive(json, "log_file")); + g_config.log_debug = cJSON_IsTrue(cJSON_GetObjectItemCaseSensitive(json, "log_debug")); + g_config.anticheat = cJSON_IsTrue(cJSON_GetObjectItemCaseSensitive(json, "anticheat")); + g_config.pride = cJSON_IsTrue(cJSON_GetObjectItemCaseSensitive(json, "pride")); + + snprintf(g_config.motd, 256, "%s", cJSON_GetStringValue(cJSON_GetObjectItemCaseSensitive(json, "motd"))); + cJSON_Delete(json); + +init_balls: + MutexCreate(g_timeoutMut); + MutexCreate(g_banMut); + MutexCreate(g_opMut); + + RAssert(collection_init(&g_timeouts, TIMEOUTS_FILE, "{}")); + RAssert(collection_init(&g_bans, BANS_FILE, "{}")); + RAssert(collection_init(&g_ops, OPERATORS_FILE, "{ \"127.0.0.1\": \"Host (127.0.0.1)\" }")); + + if (!g_config.anticheat) + { + Info(LOG_YLW "Anticheat is disabled, client modifications are allowed."); + } + + return true; +} + +SERVER_API bool config_save(void) +{ + cJSON* json = cJSON_CreateObject(); + RAssert(json); + + cJSON_AddItemToObject(json, "port", cJSON_CreateNumber(g_config.port)); + cJSON_AddItemToObject(json, "server_count", cJSON_CreateNumber(g_config.server_count)); + cJSON_AddItemToObject(json, "ping_limit", cJSON_CreateNumber(g_config.ping_limit)); + cJSON_AddItemToObject(json, "log_file", cJSON_CreateBool(g_config.log_file)); + cJSON_AddItemToObject(json, "log_debug", cJSON_CreateBool(g_config.log_debug)); + cJSON_AddItemToObject(json, "anticheat", cJSON_CreateBool(g_config.anticheat)); + cJSON_AddItemToObject(json, "pride", cJSON_CreateBool(g_config.pride)); + cJSON_AddItemToObject(json, "motd", cJSON_CreateString(g_config.motd)); + + RAssert(collection_save(CONFIG_FILE, json)); + cJSON_Delete(json); + return true; +} + +bool ban_add(const char* nickname, const char* udid, const char* ip) +{ + bool res = true; + + MutexLock(g_banMut); + { + bool changed = false; + if (!cJSON_HasObjectItem(g_bans, ip)) + { + cJSON* js = cJSON_CreateString(nickname); + cJSON_AddItemToObject(g_bans, ip, js); + changed = true; + } + + if (!cJSON_HasObjectItem(g_bans, udid)) + { + cJSON* js = cJSON_CreateString(nickname); + cJSON_AddItemToObject(g_bans, udid, js); + changed = true; + } + + if (changed) + res = collection_save(BANS_FILE, g_bans); + + } + MutexUnlock(g_banMut); + + return res; +} + +bool ban_revoke(const char* udid, const char* ip) +{ + bool res = false; + + MutexLock(g_banMut); + { + bool changed = false; + + if (cJSON_HasObjectItem(g_bans, ip)) + { + cJSON_DeleteItemFromObject(g_bans, ip); + changed = true; + } + + if (cJSON_HasObjectItem(g_bans, udid)) + { + cJSON_DeleteItemFromObject(g_bans, udid); + changed = true; + } + + if(changed) + res = collection_save(BANS_FILE, g_bans); + } + MutexUnlock(g_banMut); + + return res; +} + +bool ban_check(const char* udid, const char* ip, bool* result) +{ + *result = false; + + MutexLock(g_banMut); + { + if (cJSON_HasObjectItem(g_bans, udid) || cJSON_HasObjectItem(g_bans, ip)) + *result = true; + } + MutexUnlock(g_banMut); + + return true; +} + +bool timeout_set(const char* nickname, const char* ip, const char* udid, uint64_t timestamp) +{ + bool res = true; + + MutexLock(g_timeoutMut); + { + bool changed = false; + + cJSON* obj = cJSON_GetObjectItem(g_timeouts, ip); + if (!obj) + { + cJSON* root = cJSON_CreateArray(); + + // store nickname + cJSON* js = cJSON_CreateString(nickname); + cJSON_AddItemToArray(root, js); + + // store timestamp + js = cJSON_CreateNumber((double)timestamp); + cJSON_AddItemToArray(root, js); + + cJSON_AddItemToObject(g_timeouts, ip, root); + changed = true; + } + else + { + cJSON* item = cJSON_GetArrayItem(obj, 1); + if (item) + { + cJSON_SetNumberValue(item, timestamp); + changed = true; + } + else + Warn("Missing timestamp in array"); + } + + obj = cJSON_GetObjectItem(g_timeouts, udid); + if (!obj) + { + cJSON* root = cJSON_CreateArray(); + + // store nickname + cJSON* js = cJSON_CreateString(nickname); + cJSON_AddItemToArray(root, js); + + // store timestamp + js = cJSON_CreateNumber((double)timestamp); + cJSON_AddItemToArray(root, js); + + cJSON_AddItemToObject(g_timeouts, udid, root); + changed = true; + } + else + { + cJSON* item = cJSON_GetArrayItem(obj, 1); + if (item) + { + cJSON_SetNumberValue(item, timestamp); + changed = true; + } + else + Warn("Missing timestamp in array"); + } + + if (changed) + res = collection_save(TIMEOUTS_FILE, g_timeouts); + } + MutexUnlock(g_timeoutMut); + + return res; +} + +bool timeout_revoke(const char* udid, const char* ip) +{ + bool res = false; + + MutexLock(g_timeoutMut); + { + bool changed = false; + + if (cJSON_HasObjectItem(g_timeouts, ip)) + { + cJSON_DeleteItemFromObject(g_timeouts, ip); + changed = true; + } + + if (cJSON_HasObjectItem(g_timeouts, udid)) + { + cJSON_DeleteItemFromObject(g_timeouts, udid); + changed = true; + } + + if (changed) + res = collection_save(TIMEOUTS_FILE, g_timeouts); + } + MutexUnlock(g_timeoutMut); + + return res; +} + +bool timeout_check(const char* udid, const char* ip, uint64_t* result) +{ + *result = 0; + + MutexLock(g_opMut); + { + cJSON* obj = cJSON_GetObjectItem(g_timeouts, ip); + + if(!obj) + obj = cJSON_GetObjectItem(g_timeouts, udid); + + if (obj) + { + cJSON* timeout = cJSON_GetArrayItem(obj, 1); + + if (timeout) + *result = (uint64_t)cJSON_GetNumberValue(timeout); + else + Warn("Missing timestamp in array"); + } + } + MutexUnlock(g_opMut); + + return true; +} + +bool op_add(const char* nickname, const char* ip) +{ + bool res = true; + + MutexLock(g_opMut); + { + if (!cJSON_HasObjectItem(g_ops, ip)) + { + cJSON* js = cJSON_CreateString(nickname); + cJSON_AddItemToObject(g_ops, ip, js); + + res = collection_save(OPERATORS_FILE, g_ops); + } + } + MutexUnlock(g_opMut); + + return res; +} + +bool op_revoke(const char* ip) +{ + bool res = false; + + MutexLock(g_opMut); + { + if (cJSON_HasObjectItem(g_ops, ip)) + { + cJSON_DeleteItemFromObject(g_ops, ip); + + res = collection_save(OPERATORS_FILE, g_ops); + } + } + MutexUnlock(g_opMut); + + return res; +} + +bool op_check(const char* ip, bool* result) +{ + *result = false; + + MutexLock(g_opMut); + { + if (cJSON_HasObjectItem(g_ops, ip)) + *result = true; + } + MutexUnlock(g_opMut); + + return true; +} diff --git a/disasterserver_c/Config.h b/disasterserver_c/Config.h new file mode 100644 index 0000000..bf1ad0e --- /dev/null +++ b/disasterserver_c/Config.h @@ -0,0 +1,65 @@ +#ifndef CONFIG_H +#define CONFIG_H + +#include +#include +#include +#include +#include +#include + +#ifndef SYS_ANDROID + #define CONFIG_FILE "Config.json" + #define BANS_FILE "Bans.json" + #define OPERATORS_FILE "Operators.json" + #define TIMEOUTS_FILE "Timeouts.json" +#else + #define ANDROID_DIR "/data/data/com.teamexeempire.disaster2d/files/" + #define CONFIG_FILE ANDROID_DIR "Config.json" + #define BANS_FILE ANDROID_DIR "Bans.json" + #define OPERATORS_FILE ANDROID_DIR "Operators.json" + #define TIMEOUTS_FILE ANDROID_DIR "Timeouts.json" +#endif + +typedef struct +{ + int32_t port; + int32_t server_count; + int32_t ping_limit; + bool log_debug; + bool log_file; + bool anticheat; + bool pride; + bool map_list[20]; + Mutex map_list_lock; + bool chatfix; + + char motd[256]; +} Config; + +SERVER_API extern Config g_config; +SERVER_API extern cJSON* g_bans; +SERVER_API extern cJSON* g_timeouts; +SERVER_API extern cJSON* g_ops; +SERVER_API extern Mutex g_banMut; +SERVER_API extern Mutex g_timeoutMut; +SERVER_API extern Mutex g_opMut; + +SERVER_API bool config_init(void); +SERVER_API bool config_save(void); + +SERVER_API bool ban_add(const char* nickname, const char* udid, const char* ip); +SERVER_API bool ban_revoke(const char* udid, const char* ip); +SERVER_API bool ban_check(const char* udid, const char* ip, bool* result); + +SERVER_API bool timeout_set(const char* nickname, const char* udid, const char* ip, uint64_t timestamp); +SERVER_API bool timeout_revoke(const char* udid, const char* ip); +SERVER_API bool timeout_check(const char* udid, const char* ip, uint64_t* result); + +SERVER_API bool op_add(const char* nickname, const char* ip); +SERVER_API bool op_revoke(const char* ip); +SERVER_API bool op_check(const char* ip, bool* result); + +bool collection_save(const char* file, cJSON* value); + +#endif \ No newline at end of file diff --git a/disasterserver_c/DyList.c b/disasterserver_c/DyList.c new file mode 100644 index 0000000..416d1b6 --- /dev/null +++ b/disasterserver_c/DyList.c @@ -0,0 +1,79 @@ +#include +#include + +bool dylist_create(DyList* list, size_t max_capacity) +{ + if (!list) + return false; + + memset(list, 0, sizeof(DyList)); + list->capacity = max_capacity; + list->noitems = 0; + list->ptr = (void**)malloc(list->capacity * sizeof(void*)); + + if (!list->ptr) + return false; + + memset(list->ptr, 0, list->capacity * sizeof(void*)); + Debug("%p DyList allocated (size %d)", list->ptr, list->capacity * sizeof(void*)); + return true; +} + +bool dylist_push(DyList* list, void* item) +{ + if (!list) + return false; + + if (!item) + return false; + + bool found = false; + for (size_t i = 0; i < list->capacity; i++) + { + if (!list->ptr[i]) + { + Debug("%p DyList added item %p (index %d)", list->ptr, item, i); + list->ptr[i] = item; + found = true; + break; + } + } + + if (!found) + { + Warn("%p DyList reached limit (%d items)!", list->ptr, list->capacity); + return false; + } + + list->noitems++; + return true; +} + +bool dylist_remove(DyList* list, void* item) +{ + if (!item) + return false; + + for (size_t i = 0; i < list->capacity; i++) + { + if (list->ptr[i] == item) + { + Debug("%p DyList removed item %p (index %d)", list->ptr, item, i); + list->ptr[i] = NULL; + list->noitems--; + return true; + } + } + + return false; +} + +void dylist_free(DyList* list) +{ + if (!list) + return; + + Debug("%p DyList freed.", list->ptr); + free(list->ptr); + memset(list, 0, sizeof(DyList)); +} diff --git a/disasterserver_c/DyList.h b/disasterserver_c/DyList.h new file mode 100644 index 0000000..22337d6 --- /dev/null +++ b/disasterserver_c/DyList.h @@ -0,0 +1,17 @@ +#ifndef LINKEDLIST_H +#define LINKEDLIST_H +#include + +typedef struct +{ + void** ptr; + size_t noitems; + size_t capacity; +} DyList; + +bool dylist_create(DyList* list, size_t max_capacity); +bool dylist_push(DyList* list, void* item); +bool dylist_remove(DyList* list, void* item); +void dylist_free(DyList* list); + +#endif \ No newline at end of file diff --git a/disasterserver_c/Lib.c b/disasterserver_c/Lib.c new file mode 100644 index 0000000..1960765 --- /dev/null +++ b/disasterserver_c/Lib.c @@ -0,0 +1,272 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include + +ThreadVar g_threadName; +DyList servers; +bool running = 0; + +bool allocate_server(uint16_t base_port, uint16_t n) +{ + const Server templ = { + .state = ST_LOBBY, + .last_map = -1, + .id = n, + .running = true, + .delta = 1, + .game = { + .exe = -1 + }, + .lobby = { + .vote = { + .ongoing = 0, + }, + .prac_countdown = 0 + } + }; + + Server* server = malloc(sizeof(Server)); + RAssert(server); + memcpy(server, &templ, sizeof(Server)); + + for (int i = 0; i < MAP_COUNT; i++) + server->map_pickrates[i] = 255; + + // Init lobby + MutexCreate(server->state_lock); + RAssert(dylist_create(&server->peers, 7)); + + ENetAddress addr; + addr.host = ENET_HOST_ANY; + addr.port = base_port + n; + server->host = enet_host_create(&addr, 50, 2, 0, 0); + + Info("Listening on port %d.", base_port + n); + RAssert(server->host != NULL); + RAssert(lobby_init(server)); + RAssert(dylist_push(&servers, server)); + + return true; +} + +bool disaster_init(void) +{ + if (running) + return true; + + RAssert(enet_initialize() == 0); + + // Init global variables + ThreadVarCreate(g_threadName); + ThreadVarSet(g_threadName, "Main Thr"); + +#ifdef SYS_ANDROID + log_hook(log_android); +#endif + + Info("--------------------------------"); + Info(LOG_RED "Better" LOG_BLU "Server " LOG_RST "v" STRINGIFY(BUILD_VERSION)); + Info("Build from " LOG_PUR __DATE__ " " LOG_GRN __TIME__); + Info("(c) 2024 Team Exe Empire"); + Info("--------------------------------"); + Info(""); + + RAssert(config_init()); + RAssert(log_init()); + + RAssert(dylist_create(&servers, g_config.server_count)); + for (int32_t i = 0; i < g_config.server_count; i++) + RAssert(allocate_server((uint16_t)g_config.port, i)); + + return true; +} + +int disaster_run(void) +{ + if (running) + return 1; + + running = true; + Debug("Entering main loop..."); + + for(int32_t i = 0; i < g_config.server_count; i++) + { + Server* server = servers.ptr[i]; + if(!server) + continue; + + Thread th; + ThreadSpawn(th, server_worker, server); + } + + // dont ask too many questions + while (running) + { + ThreadSleep(100); + } + + return 0; +} + +void disaster_shutdown(void) +{ + if(!running) + return; + + running = false; + exit(0); +} + +Server* disaster_get(int i) +{ + if (i < 0 || (size_t)i >= servers.capacity) + return NULL; + + return (Server*)servers.ptr[i]; +} + +int disaster_count(void) +{ + return (int)servers.capacity; +} + +bool disaster_server_lock(Server* server) +{ + RAssert(server); + MutexLock(server->state_lock); + return true; +} + +bool disaster_server_unlock(Server* server) +{ + RAssert(server); + MutexUnlock(server->state_lock); + return true; +} + +uint8_t disaster_server_state(Server* server) +{ + RAssert(server); + return (uint8_t)server->state; +} + +bool disaster_server_ban(Server* server, uint16_t id) +{ + for (size_t i = 0; i < server->peers.capacity; i++) + { + PeerData* v = (PeerData*)server->peers.ptr[i]; + if (!v) + continue; + + if (v->id == id) + { + server_disconnect(server, v->peer, DR_BANNEDBYHOST, NULL); + return ban_add(v->nickname.value, v->udid.value, v->ip.value); + } + } + + return false; +} + +bool disaster_server_op(Server* server, uint16_t id) +{ + for (size_t i = 0; i < server->peers.capacity; i++) + { + PeerData* v = (PeerData*)server->peers.ptr[i]; + if (!v) + continue; + + if (v->id == id) + { + v->op = true; + + server_send_msg(server, v->peer, CLRCODE_GRN "you're an operator now"); + return op_add(v->nickname.value, v->ip.value); + } + } + + return false; +} + +bool disaster_server_timeout(Server* server, uint16_t id, double timeout) +{ + for (size_t i = 0; i < server->peers.capacity; i++) + { + PeerData* v = (PeerData*)server->peers.ptr[i]; + if (!v) + continue; + + if (v->id == id) + { + server_disconnect(server, v->peer, DR_KICKEDBYHOST, NULL); + return timeout_set(v->nickname.value, v->udid.value, v->ip.value, time(NULL) + (uint64_t)(round(timeout))); + } + } + + return false; +} + +bool disaster_server_peer(Server* server, int index, PeerInfo* info) +{ + info->character = -1; + if (index < 0 || index >= server->peers.capacity) + return false; + else + { + PeerData* v = (PeerData*)server->peers.ptr[index]; + if (!v) + return false; + else + { + info->peer = v; + info->is_exe = (server->game.exe == v->id); + info->ip_addr = v->ip; + + if (v->in_game && server->state >= ST_GAME) + { + if (info->is_exe) + info->character = v->exe_char; + else + info->character = v->surv_char; + } + } + } + + return true; +} + +bool disaster_server_peer_disconnect(Server* server, uint16_t id, DisconnectReason reason, const char* text) +{ + return server_disconnect_id(server, (int)id, reason, text); +} + +int disaster_server_peer_count(Server* server) +{ + return server_total(server); +} + +int disaster_server_peer_ingame(Server* server) +{ + return server_ingame(server); +} + +int8_t disaster_game_map(Server* server) +{ + return server->game.map; +} + +double disaster_game_time(Server* server) +{ + return server->game.time; +} + +uint16_t disaster_game_time_sec(Server* server) +{ + return server->game.time_sec; +} \ No newline at end of file diff --git a/disasterserver_c/Lib.h b/disasterserver_c/Lib.h new file mode 100644 index 0000000..87d5428 --- /dev/null +++ b/disasterserver_c/Lib.h @@ -0,0 +1,59 @@ +#ifndef LIB_H +#define LIB_H +#include +#include +#include +#include +#include + +typedef enum +{ + DR_FAILEDTOCONNECT, + DR_KICKEDBYHOST, + DR_BANNEDBYHOST, + DR_VERMISMATCH, + DR_SERVERTIMEOUT, + DR_PACKETSNOTRECV, + DR_GAMESTARTED, + DR_AFKTIMEOUT, + DR_LOBBYFULL, + DR_RATELIMITED, + DR_SHUTDOWN, + DR_IPINUSE, + + DR_DONTREPORT = 254, + DR_OTHER = 255 +} DisconnectReason; + +struct Server; +struct PeerData; +typedef struct +{ + struct PeerData* peer; + String ip_addr; + bool is_exe; + int8_t character; +} PeerInfo; + +SERVER_API bool disaster_init (void); +SERVER_API int disaster_run (void); +SERVER_API void disaster_shutdown(void); + +// API functions +SERVER_API struct Server* disaster_get (int); +SERVER_API int disaster_count (void); +SERVER_API bool disaster_server_lock (struct Server* server); +SERVER_API bool disaster_server_unlock (struct Server* server); +SERVER_API uint8_t disaster_server_state (struct Server* server); +SERVER_API bool disaster_server_ban (struct Server* server, uint16_t); +SERVER_API bool disaster_server_op (struct Server* server, uint16_t); +SERVER_API bool disaster_server_timeout (struct Server* server, uint16_t, double); +SERVER_API bool disaster_server_peer (struct Server*, int, PeerInfo*); +SERVER_API bool disaster_server_peer_disconnect (struct Server*, uint16_t, DisconnectReason, const char*); +SERVER_API int disaster_server_peer_count (struct Server*); +SERVER_API int disaster_server_peer_ingame (struct Server*); +SERVER_API int8_t disaster_game_map (struct Server*); +SERVER_API double disaster_game_time (struct Server*); +SERVER_API uint16_t disaster_game_time_sec (struct Server*); + +#endif \ No newline at end of file diff --git a/disasterserver_c/Log.c b/disasterserver_c/Log.c new file mode 100644 index 0000000..f1ecab7 --- /dev/null +++ b/disasterserver_c/Log.c @@ -0,0 +1,155 @@ +#include +#include +#include +#include +#include +#include +#ifdef SYS_ANDROID + #include +#endif + +FILE* logFile = NULL; +loghook_t hook = NULL; + +void log_interr(int signum) +{ + (void)signum; + Err("Signal INTERRUPT: Exiting..."); + if (logFile) + fclose(logFile); + + logFile = NULL; + disaster_shutdown(); +} + +void log_segv(int signum) +{ + (void)signum; + + Err("Signal SEGFAULT: Exiting..."); + if (logFile) + fclose(logFile); + + logFile = NULL; + disaster_shutdown(); +} + +void log_term(int signum) +{ + (void)signum; + + Err("Signal SIGTERM: Exiting..."); + if (logFile) + fclose(logFile); + + logFile = NULL; + disaster_shutdown(); +} + +void log_abrt(int signum) +{ + (void)signum; + Err("Signal SIGABORT: Exiting..."); + if (logFile) + fclose(logFile); + + logFile = NULL; + disaster_shutdown(); +} + +void log_uninit(void) +{ + if (logFile) + fclose(logFile); + + logFile = NULL; +} + +#ifdef SYS_ANDROID + void log_android(const char* type, const char* message) + { + __android_log_print(ANDROID_LOG_ERROR, "DisasterServer", "%s", message); + } +#endif + +bool log_init(void) +{ + if (g_config.log_file) // dont do shit if we dont wanna log to file + { + // Create dir for logging + (void)mkdir("logs", 0777); + + time_t t = time(NULL); + struct tm* p = localtime(&t); + + char fname[64]; + strftime(fname, 64, "logs/%m%d%Y %H%M%S.log", p); + + logFile = fopen(fname, "w"); + RAssert(logFile); + } + + // write to file when done + signal(SIGINT, log_interr); + signal(SIGTERM, log_term); + signal(SIGABRT, log_abrt); + signal(SIGSEGV, log_segv); +#if defined(__unix) || defined(__unix__) + signal(SIGPIPE, SIG_IGN); +#endif + atexit(log_uninit); + + return true; +} + +void log_hook(loghook_t func) +{ + hook = func; +} + +void log_fmt(const char* fmt, const char* type, const char* file, int line, ...) +{ + const char* thd_name = (const char*)ThreadVarGet(g_threadName); + char filename[24]; + snprintf(filename, 24, "%s:%d", file, line); + + time_t t = time(NULL); + struct tm* p = localtime(&t); + + va_list list; + if (logFile) + { + char strtime[32]; + strftime(strtime, 32, "%m/%d/%Y %H:%M:%S", p); + fprintf(logFile, "[%s %s %s %s] ", strtime, type, thd_name != NULL ? thd_name : "unknown", filename); + + va_start(list, line); + vfprintf(logFile, fmt, list); + va_end(list); + + fputs("\n", logFile); + fflush(logFile); + } + + if (hook) + { + char fmt_log[512]; + va_start(list, line); + vsnprintf(fmt_log, 512, fmt, list); + va_end(list); + + char log[1024]; + snprintf(log, 1024, "[%s]: %s", filename, fmt_log); + + hook(type, log); + return; + } + + printf("[%s %s %s] ", type, thd_name != NULL ? thd_name : "unknown", filename); + + va_start(list, line); + vprintf(fmt, list); + va_end(list); + + puts(""); +} diff --git a/disasterserver_c/Log.h b/disasterserver_c/Log.h new file mode 100644 index 0000000..1fdc352 --- /dev/null +++ b/disasterserver_c/Log.h @@ -0,0 +1,65 @@ +#ifndef LOG_H +#define LOG_H + +#include +#include +#include +#include +#include +#include +#include +#include + +#if defined(__unix) || defined(__unix__) + #define __FILENAME__ (strrchr(__FILE__, '/') ? strrchr(__FILE__, '/') + 1 : __FILE__) +#else + #define __FILENAME__ (strrchr(__FILE__, '\\') ? strrchr(__FILE__, '\\') + 1 : __FILE__) +#endif + +#ifdef SYS_USE_SDL2 + #define DEBUG_TYPE "DBG " + #define INFO_TYPE "INF " + #define WARN_TYPE "WRN " + #define ERROR_TYPE "ERR " + + #define LOG_GRN CLRCODE_GRN + #define LOG_GRA CLRCODE_GRA + #define LOG_RED CLRCODE_RED + #define LOG_BLU CLRCODE_BLU + #define LOG_YLW CLRCODE_YLW + #define LOG_PUR CLRCODE_PUR + #define LOG_RST CLRCODE_RST +#else + #define DEBUG_TYPE "\x1B[36mDBG \x1B[0m" + #define INFO_TYPE "\x1B[32mINF \x1B[0m" + #define WARN_TYPE "\x1B[33mWRN \x1B[0m" + #define ERROR_TYPE "\x1B[31mERR \x1B[0m" + + #define LOG_GRN + #define LOG_GRA + #define LOG_RED + #define LOG_BLU + #define LOG_YLW + #define LOG_PUR + #define LOG_RST +#endif + +#define Log(type, fmt, ...) log_fmt(fmt, type, __FILENAME__, __LINE__, ##__VA_ARGS__) +#define Debug(fmt, ...) if(g_config.log_debug) log_fmt(fmt, DEBUG_TYPE, __FILENAME__, __LINE__, ##__VA_ARGS__) +#define Info(fmt, ...) log_fmt(fmt, INFO_TYPE, __FILENAME__, __LINE__, ##__VA_ARGS__) +#define Warn(fmt, ...) log_fmt(fmt, WARN_TYPE, __FILENAME__, __LINE__, ##__VA_ARGS__) +#define Err(fmt, ...) log_fmt(fmt, ERROR_TYPE, __FILENAME__, __LINE__, ##__VA_ARGS__) +#define RAssert(x) if (!(x)) { Err("RAssert(" #x ") failed!"); return false; } +#define BoolStringify(bool) (bool ? "true" : "false") + +typedef void (*loghook_t)(const char* type, const char* message); + +bool log_init (void); +SERVER_API void log_hook (loghook_t func); +SERVER_API void log_fmt (const char* fmt, const char* type, const char* file, int line, ...); + +#ifdef SYS_ANDROID +void log_android(const char* type, const char* message); +#endif + +#endif diff --git a/disasterserver_c/Main.c b/disasterserver_c/Main.c new file mode 100644 index 0000000..d62293b --- /dev/null +++ b/disasterserver_c/Main.c @@ -0,0 +1,10 @@ +#include +#include + +int main(void) +{ + if (!disaster_init()) + return 1; + + return disaster_run(); +} \ No newline at end of file diff --git a/disasterserver_c/Maps.c b/disasterserver_c/Maps.c new file mode 100644 index 0000000..94c69d6 --- /dev/null +++ b/disasterserver_c/Maps.c @@ -0,0 +1,97 @@ +#include "Colors.h" +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +Map g_mapList[MAP_COUNT+1] = +{ + { CLRCODE_GRN "Hide and Seek 2", { hs2_init, map_tick, map_tcpmsg, map_left }, 1, 22 }, //0 + { CLRCODE_ORG "Ravine Mist", { rmz_init, rmz_tick, rmz_tcpmsg, rmz_left }, 1, 27 }, //1 + { CLRCODE_GRN "...", { dot_init, map_tick, map_tcpmsg, map_left }, 1, 25 }, //2 + { CLRCODE_ORG "Desert Town", { map_init, map_tick, map_tcpmsg, map_left }, 1, 25 }, //3 + { CLRCODE_ORG "You Can't Run", { ycr_init, map_tick, map_tcpmsg, map_left }, 1, 27 }, //4 + { CLRCODE_RED "Limp City", { lc_init, map_tick, lc_tcpmsg, map_left }, 1, 23 }, //5 + { CLRCODE_RED "Not Perfect", { np_init, map_tick, map_tcpmsg, map_left }, 1, 59 }, //6 + { CLRCODE_ORG "Kind and Fair", { kaf_init, map_tick, kaf_tcpmsg, map_left }, 1, 31 }, //7 + { CLRCODE_PUR "Act 9", { act9_init,map_tick, map_tcpmsg, map_left }, 1, 38 }, //8 + { CLRCODE_RED "Nasty Paradise", { nap_init, map_tick, nap_tcpmsg, map_left }, 1, 26 }, //9 + { CLRCODE_PUR "Priceless Freedom", { pf_init, map_tick, pf_tcpmsg, map_left }, 1, 38 }, //10 + { CLRCODE_ORG "Volcano Valley", { vv_init, map_tick, vv_tcpmsg, map_left }, 1, 27 }, //11 + { CLRCODE_ORG "Hill", { hill_init,map_tick, map_tcpmsg, map_left }, 1, 26 }, //12 + { CLRCODE_PUR "Majin Forest", { maj_init, map_tick, map_tcpmsg, map_left }, 1, 20 }, //13 + { CLRCODE_ORG "Hide and Seek", { map_init, map_tick, map_tcpmsg, map_left }, 1, 21 }, //14 + { CLRCODE_RED "Torture Cave", { tc_init, map_tick, map_tcpmsg, map_left }, 1, 27 }, //15 + { CLRCODE_GRN "Dark Tower", { dt_init, map_tick, dt_tcpmsg, map_left }, 1, 31 }, //16 + { CLRCODE_GRN "Haunting Dream", { hd_init, map_tick, hd_tcpmsg, map_left }, 1, 31 }, //17 + { CLRCODE_RED "Mystic Wood", { wd_init, map_tick, map_tcpmsg, map_left }, 1, 26 }, //18 + { CLRCODE_GRN "Echidna Ruins", { mj_init, map_tick, map_tcpmsg, map_left }, 1, 28+5 }, //19 + { CLRCODE_BLU "Fart Zone", { ft_init, map_tick, ft_tcpmsg, map_left }, 1, 15 }, //20 +}; + +bool map_init(Server* server) +{ + RAssert(map_time(server, 3 * TICKSPERSEC, 20)); + RAssert(map_ring(server, 5)); + + return true; +} + +bool map_tick(Server* server) +{ + if (server->game.time_sec <= TICKSPERSEC && server->game.bring_state < BS_DEACTIVATED) + game_bigring(server, BS_DEACTIVATED); + + if (server->game.time_sec <= TICKSPERSEC - 10 && server->game.bring_state < BS_ACTIVATED) + game_bigring(server, BS_ACTIVATED); + + return true; +} + +bool map_tcpmsg(PeerData* v, Packet* packet) +{ + return true; +} + +bool map_left(PeerData* v) +{ + return true; +} + +bool map_time(Server* server, double seconds, float mul) +{ + server->game.time_sec = (uint16_t)(seconds + (((server_ingame(server) - 1) * mul))); + return true; +} + +bool map_ring(Server* server, int ringcoff) +{ + server->game.ring_coff = ringcoff; + if (server_ingame(server) > 3) + server->game.ring_coff--; + + if (server->game.ring_coff < 1) + server->game.ring_coff = 1; + + return true; +} \ No newline at end of file diff --git a/disasterserver_c/Maps.h b/disasterserver_c/Maps.h new file mode 100644 index 0000000..6428649 --- /dev/null +++ b/disasterserver_c/Maps.h @@ -0,0 +1,32 @@ +#ifndef MAPS_H +#define MAPS_H +#include + +typedef struct +{ + const char* name; + + struct + { + bool (*init)(Server*); + bool (*tick)(Server*); + bool (*tcp_msg)(PeerData*, Packet*); + bool (*left)(PeerData*); + } cb; + + uint8_t spawn_red_rings; + uint8_t ring_count; +} Map; + +#define MAP_COUNT 20 +extern Map g_mapList[MAP_COUNT+1]; + +bool map_init (Server* server); +bool map_tick (Server* server); +bool map_tcpmsg (PeerData* v, Packet* packet); +bool map_left (PeerData* v); + +bool map_time (Server* server, double seconds, float mul); +bool map_ring (Server* server, int ringcoff); + +#endif diff --git a/disasterserver_c/Packet.c b/disasterserver_c/Packet.c new file mode 100644 index 0000000..c5851c0 --- /dev/null +++ b/disasterserver_c/Packet.c @@ -0,0 +1,480 @@ +#include +#include +#include +#include +#include + +#ifdef __GNUC__ // GCC, clang... + #define BYTESWAP_16(x) __builtin_bswap16((x)) + #define BYTESWAP_32(x) __builtin_bswap32((x)) + #define BYTESWAP_64(x) __builtin_bswap64((x)) +#else + #define BYTESWAP_16(x) _byteswap_ushort((x)) + #define BYTESWAP_32(x) _byteswap_ulong((x)) + #define BYTESWAP_64(x) _byteswap_uint64((x)) +#endif + +String string_new(const char* value) +{ + size_t len = strlen(value) + 1; + String str = { .value = {0}, .len = (uint16_t)len}; + memcpy(str.value, value, len); + + return str; +} + +size_t string_length(String* str) +{ + size_t len = 0; + + for (size_t i = 0; i < str->len; i++) + { + if (str->value[i] == '\0') + break; + + len += (str->value[i] & 0xc0) != 0x80; + } + + return len; +} + +String string_lower(String str) +{ + for (int i = 0; i < str.len; i++) + str.value[i] = (char)tolower(str.value[i]); + + return str; +} + +inline const char * getPacketTypeName(PacketType type) { + switch (type) { + case IDENTITY: return "IDENTITY"; + case SERVER_IDENTITY_RESPONSE: return "SERVER_IDENTITY_RESPONSE"; + case SERVER_PLAYER_JOINED: return "SERVER_PLAYER_JOINED"; + case SERVER_PLAYER_LEFT: return "SERVER_PLAYER_LEFT"; + case SERVER_PLAYER_FORCE_DISCONNECT: return "SERVER_PLAYER_FORCE_DISCONNECT"; + case SERVER_WAITING_PLAYER_INFO: return "SERVER_WAITING_PLAYER_INFO"; + case SERVER_LOBBY_READY_STATE: return "SERVER_LOBBY_READY_STATE"; + case SERVER_LOBBY_EXE: return "SERVER_LOBBY_EXE"; + case SERVER_LOBBY_COUNTDOWN: return "SERVER_LOBBY_COUNTDOWN"; + case SERVER_LOBBY_EXE_CHANGE: return "SERVER_LOBBY_EXE_CHANGE"; + case SERVER_LOBBY_CHARACTER_CHANGE: return "SERVER_LOBBY_CHARACTER_CHANGE"; + case SERVER_LOBBY_CHARACTER_RESPONSE: return "SERVER_LOBBY_CHARACTER_RESPONSE"; + case SERVER_LOBBY_EXECHARACTER_RESPONSE: return "SERVER_LOBBY_EXECHARACTER_RESPONSE"; + case SERVER_LOBBY_GAME_START: return "SERVER_LOBBY_GAME_START"; + case SERVER_LOBBY_PLAYER: return "SERVER_LOBBY_PLAYER"; + case SERVER_LOBBY_EXE_CHANCE: return "SERVER_LOBBY_EXE_CHANCE"; + case SERVER_LOBBY_CORRECT: return "SERVER_LOBBY_CORRECT"; + case SERVER_LOBBY_CHOOSEVOTEKICK: return "SERVER_LOBBY_CHOOSEVOTEKICK"; + case SERVER_LOBBY_CHOOSEBAN: return "SERVER_LOBBY_CHOOSEBAN"; + case SERVER_LOBBY_CHOOSEKICK: return "SERVER_LOBBY_CHOOSEKICK"; + case SERVER_LOBBY_CHOOSEOP: return "SERVER_LOBBY_CHOOSEOP"; + case SERVER_LOBBY_CHANGELOBBY: return "SERVER_LOBBY_CHANGELOBBY"; + case SERVER_CHAR_TIME_SYNC: return "SERVER_CHAR_TIME_SYNC"; + case SERVER_VOTE_MAPS: return "SERVER_VOTE_MAPS"; + case SERVER_VOTE_SET: return "SERVER_VOTE_SET"; + case SERVER_VOTE_TIME_SYNC: return "SERVER_VOTE_TIME_SYNC"; + case SERVER_GAME_PLAYERS_READY: return "SERVER_GAME_PLAYERS_READY"; + case SERVER_GAME_EXE_WINS: return "SERVER_GAME_EXE_WINS"; + case SERVER_GAME_SURVIVOR_WIN: return "SERVER_GAME_SURVIVOR_WIN"; + case SERVER_GAME_SPAWN_RING: return "SERVER_GAME_SPAWN_RING"; + case SERVER_GAME_PLAYER_ESCAPED: return "SERVER_GAME_PLAYER_ESCAPED"; + case SERVER_GAME_BACK_TO_LOBBY: return "SERVER_GAME_BACK_TO_LOBBY"; + case SERVER_GAME_TIME_SYNC: return "SERVER_GAME_TIME_SYNC"; + case SERVER_GAME_TIME_OVER: return "SERVER_GAME_TIME_OVER"; + case SERVER_GAME_PING: return "SERVER_GAME_PING"; + case SERVER_PLAYER_DEATH_STATE: return "SERVER_PLAYER_DEATH_STATE"; + case SERVER_GAME_DEATHTIMER_TICK: return "SERVER_GAME_DEATHTIMER_TICK"; + case SERVER_GAME_DEATHTIMER_END: return "SERVER_GAME_DEATHTIMER_END"; + case SERVER_REQUEST_INFO: return "SERVER_REQUEST_INFO"; + case SERVER_HEARTBEAT: return "SERVER_HEARTBEAT"; + case SERVER_PONG: return "SERVER_PONG"; + case SERVER_FORCE_DAMAGE: return "SERVER_FORCE_DAMAGE"; + case SERVER_GAME_RING_READY: return "SERVER_GAME_RING_READY"; + case SERVER_PLAYER_BACKTRACK: return "SERVER_PLAYER_BACKTRACK"; + case SERVER_TPROJECTILE_STATE: return "SERVER_TPROJECTILE_STATE"; + case SERVER_ETRACKER_STATE: return "SERVER_ETRACKER_STATE"; + case SERVER_ERECTOR_BRING_SPAWN: return "SERVER_ERECTOR_BRING_SPAWN"; + case SERVER_RMZSLIME_STATE: return "SERVER_RMZSLIME_STATE"; + case SERVER_RMZSLIME_RINGBONUS: return "SERVER_RMZSLIME_RINGBONUS"; + case SERVER_RMZSHARD_STATE: return "SERVER_RMZSHARD_STATE"; + case SERVER_LCEYE_STATE: return "SERVER_LCEYE_STATE"; + case SERVER_LCCHAIN_STATE: return "SERVER_LCCHAIN_STATE"; + case SERVER_NPCONTROLLER_STATE: return "SERVER_NPCONTROLLER_STATE"; + case SERVER_KAFMONITOR_STATE: return "SERVER_KAFMONITOR_STATE"; + case SERVER_YCRSMOKE_STATE: return "SERVER_YCRSMOKE_STATE"; + case SERVER_YCRSMOKE_READY: return "SERVER_YCRSMOKE_READY"; + case SERVER_MOVINGSPIKE_STATE: return "SERVER_MOVINGSPIKE_STATE"; + case SERVER_RING_STATE: return "SERVER_RING_STATE"; + case SERVER_RING_COLLECTED: return "SERVER_RING_COLLECTED"; + case SERVER_ACT9WALL_STATE: return "SERVER_ACT9WALL_STATE"; + case SERVER_NAPBALL_STATE: return "SERVER_NAPBALL_STATE"; + case SERVER_NAPICE_STATE: return "SERVER_NAPICE_STATE"; + case SERVER_PFLIFT_STATE: return "SERVER_PFLIFT_STATE"; + case SERVER_BRING_STATE: return "SERVER_BRING_STATE"; + case SERVER_BRING_COLLECTED: return "SERVER_BRING_COLLECTED"; + case SERVER_VVLCOLUMN_STATE: return "SERVER_VVLCOLUMN_STATE"; + case SERVER_VVVASE_STATE: return "SERVER_VVVASE_STATE"; + case SERVER_GHZTHUNDER_STATE: return "SERVER_GHZTHUNDER_STATE"; + case SERVER_TCGOM_STATE: return "SERVER_TCGOM_STATE"; + case SERVER_EXELLERCLONE_STATE: return "SERVER_EXELLERCLONE_STATE"; + case SERVER_DTTAILSDOLL_STATE: return "SERVER_DTTAILSDOLL_STATE"; + case SERVER_DTBALL_STATE: return "SERVER_DTBALL_STATE"; + case SERVER_DTASS_STATE: return "SERVER_DTASS_STATE"; + case SERVER_HDDOOR_STATE: return "SERVER_HDDOOR_STATE"; + case SERVER_WDLATERN_ACTIVATE: return "SERVER_WDLATERN_ACTIVATE"; + case SERVER_FART_STATE: return "SERVER_FART_STATE"; + case SERVER_MJLAVA_STATE: return "SERVER_MJLAVA_STATE"; + case SERVER_MJJUDGER_STATE: return "SERVER_MJJUDGER_STATE"; + case SERVER_MJCRYSTAL_STATE: return "SERVER_MJCRYSTAL_STATE"; + case CLIENT_ETRACKER: return "CLIENT_ETRACKER"; + case CLIENT_ETRACKER_ACTIVATED: return "CLIENT_ETRACKER_ACTIVATED"; + case CLIENT_TPROJECTILE: return "CLIENT_TPROJECTILE"; + case CLIENT_TPROJECTILE_HIT: return "CLIENT_TPROJECTILE_HIT"; + case CLIENT_TPROJECTILE_STARTCHARGE: return "CLIENT_TPROJECTILE_STARTCHARGE"; + case CLIENT_ERECTOR_BALLS: return "CLIENT_ERECTOR_BALLS"; + case CLIENT_ERECTOR_BRING_SPAWN: return "CLIENT_ERECTOR_BRING_SPAWN"; + case CLIENT_EXELLER_SPAWN_CLONE: return "CLIENT_EXELLER_SPAWN_CLONE"; + case CLIENT_EXELLER_TELEPORT_CLONE: return "CLIENT_EXELLER_TELEPORT_CLONE"; + case CLIENT_MERCOIN_BONUS: return "CLIENT_MERCOIN_BONUS"; + case CLIENT_RMZSLIME_HIT: return "CLIENT_RMZSLIME_HIT"; + case CLIENT_LCEYE_REQUEST_ACTIVATE: return "CLIENT_LCEYE_REQUEST_ACTIVATE"; + case CLIENT_KAFMONITOR_ACTIVATE: return "CLIENT_KAFMONITOR_ACTIVATE"; + case CLIENT_RING_COLLECTED: return "CLIENT_RING_COLLECTED"; + case CLIENT_RING_BROKE: return "CLIENT_RING_BROKE"; + case CLIENT_BRING_COLLECTED: return "CLIENT_BRING_COLLECTED"; + case CLIENT_NAPICE_ACTIVATE: return "CLIENT_NAPICE_ACTIVATE"; + case CLIENT_SPRING_USE: return "CLIENT_SPRING_USE"; + case CLIENT_PFLIT_ACTIVATE: return "CLIENT_PFLIT_ACTIVATE"; + case CLIENT_VVVASE_BREAK: return "CLIENT_VVVASE_BREAK"; + case CLIENT_RMZSHARD_COLLECT: return "CLIENT_RMZSHARD_COLLECT"; + case CLIENT_RMZSHARD_LAND: return "CLIENT_RMZSHARD_LAND"; + case CLIENT_DTASS_ACTIVATE: return "CLIENT_DTASS_ACTIVATE"; + case CLIENT_HDDOOR_TOGGLE: return "CLIENT_HDDOOR_TOGGLE"; + case CLIENT_FART_PUSH: return "CLIENT_FART_PUSH"; + case CLIENT_LOBBY_READY_STATE: return "CLIENT_LOBBY_READY_STATE"; + case CLIENT_REQUESTED_INFO: return "CLIENT_REQUESTED_INFO"; + case CLIENT_PLAYER_DATA: return "CLIENT_PLAYER_DATA"; + case CLIENT_PLAYER_HURT: return "CLIENT_PLAYER_HURT"; + case CLIENT_SOUND_EMIT: return "CLIENT_SOUND_EMIT"; + case CLIENT_PING: return "CLIENT_PING"; + case CLIENT_REVIVAL_PROGRESS: return "CLIENT_REVIVAL_PROGRESS"; + case CLIENT_PLAYER_HEAL: return "CLIENT_PLAYER_HEAL"; + case CLIENT_PLAYER_HEAL_PART: return "CLIENT_PLAYER_HEAL_PART"; + case SERVER_REVIVAL_PROGRESS: return "SERVER_REVIVAL_PROGRESS"; + case SERVER_REVIVAL_STATUS: return "SERVER_REVIVAL_STATUS"; + case SERVER_REVIVAL_RINGSUB: return "SERVER_REVIVAL_RINGSUB"; + case SERVER_REVIVAL_REVIVED: return "SERVER_REVIVAL_REVIVED"; + case CLIENT_REQUEST_CHARACTER: return "CLIENT_REQUEST_CHARACTER"; + case CLIENT_REQUEST_EXECHARACTER: return "CLIENT_REQUEST_EXECHARACTER"; + case CLIENT_VOTE_REQUEST: return "CLIENT_VOTE_REQUEST"; + case CLIENT_PLAYER_DEATH_STATE: return "CLIENT_PLAYER_DEATH_STATE"; + case CLIENT_PLAYER_ESCAPED: return "CLIENT_PLAYER_ESCAPED"; + case SERVER_PLAYER_ESCAPED: return "SERVER_PLAYER_ESCAPED"; + case CLIENT_LOBBY_PLAYERS_REQUEST: return "CLIENT_LOBBY_PLAYERS_REQUEST"; + case CLIENT_CREAM_SPAWN_RINGS: return "CLIENT_CREAM_SPAWN_RINGS"; + case CLIENT_SPAWN_EFFECT: return "CLIENT_SPAWN_EFFECT"; + case CLIENT_CHAT_MESSAGE: return "CLIENT_CHAT_MESSAGE"; + case CLIENT_LOBBY_CHOOSEVOTEKICK: return "CLIENT_LOBBY_CHOOSEVOTEKICK"; + case CLIENT_LOBBY_CHOOSEBAN: return "CLIENT_LOBBY_CHOOSEBAN"; + case CLIENT_LOBBY_CHOOSEKICK: return "CLIENT_LOBBY_CHOOSEKICK"; + case CLIENT_LOBBY_CHOOSEOP: return "CLIENT_LOBBY_CHOOSEOP"; + case CLIENT_PLAYER_PALETTE: return "CLIENT_PLAYER_PALETTE"; + case CLIENT_PET_PALETTE: return "CLIENT_PET_PALETTE"; + case SERVER_RESULTS: return "SERVER_RESULTS"; + case SERVER_RESULTS_DATA: return "SERVER_RESULTS_DATA"; + case CLIENT_RESULTS_REQUEST: return "CLIENT_RESULTS_REQUEST"; + case CLIENT_STATS_REPORT: return "CLIENT_STATS_REPORT"; + case SERVER_PREIDENTITY: return "SERVER_PREIDENTITY"; + case SERVER_FELLA: return "SERVER_FELLA"; + case CLIENT_PLAYER_POTATER: return "CLIENT_PLAYER_POTATER"; + default: return ""; + } +} + +bool packet_new(Packet* packet, PacketType type) +{ + RAssert(packet); + packet->len = 0; + packet->pos = 0; + + PacketWrite(packet, packet_write8, 0); + PacketWrite(packet, packet_write8, (uint8_t)type); + + Debug("Created packet %s", getPacketTypeName(type)); + + return true; +} + +Packet packet_from(ENetPacket* packet) +{ + Packet pack = (Packet) { .pos = 0, .len = (uint8_t)packet->dataLength }; + memcpy(pack.buff, packet->data, (uint8_t)packet->dataLength); + enet_packet_destroy(packet); + return pack; +} + +bool packet_send(ENetPeer* peer, Packet* packet, bool reliable) +{ + PeerData* data = (PeerData*)peer->data; + if(data && data->disconnecting) + return true; + + if (packet->buff[1] != SERVER_HEARTBEAT) { + Debug("Sending packet %s", getPacketTypeName(packet->buff[1])); + } + + packet->pos = 0; + ENetPacket* pack = enet_packet_create(packet, packet->len, reliable ? ENET_PACKET_FLAG_RELIABLE : 0); + return enet_peer_send(peer, reliable ? 0 : 1, pack) == 0; +} + +bool packet_send_id(struct Server* server, uint16_t id, Packet* packet, bool reliable) +{ + packet->pos = 0; + ENetPacket* pack = enet_packet_create(packet, packet->len, reliable ? ENET_PACKET_FLAG_RELIABLE : 0); + + for(int32_t i = 0; i < server->peers.capacity; i++) + { + PeerData* data = (PeerData*)server->peers.ptr[i]; + if(!data) + continue; + + if(data->id != id) + continue; + + return enet_peer_send(data->peer, reliable ? 0 : 1, pack) == 0; + } + + return false; +} + +bool packet_seek(Packet* packet, int wh) +{ + RAssert(wh >= 0); + RAssert(wh < PACKET_MAXSIZE); + RAssert(wh < packet->len); + + packet->pos = wh; + return true; +} + +bool packet_read8(Packet* packet, uint8_t* out) +{ + RAssert(packet->pos < packet->len); + *out = packet->buff[packet->pos++]; + + return true; +} + +bool packet_read16(Packet* packet, uint16_t* out) +{ + RAssert(packet->pos < packet->len); + *out = *((int16_t*)&packet->buff[packet->pos]); + +#ifdef SYS_BIG_ENDIAN + *out = BYTESWAP_16(*out); +#endif + + packet->pos += 2; + + return true; +} + +bool packet_read32(Packet* packet, uint32_t* out) +{ + RAssert(packet->pos < packet->len); + *out = *((int32_t*)&packet->buff[packet->pos]); + +#ifdef SYS_BIG_ENDIAN + *out = BYTESWAP_32(*out); +#endif + + packet->pos += 4; + + return true; +} + +bool packet_read64(Packet* packet, uint64_t* out) +{ + RAssert(packet->pos < packet->len); + *out = *((int64_t*)&packet->buff[packet->pos]); + +#ifdef SYS_BIG_ENDIAN + *out = BYTESWAP_64(*out); +#endif + + packet->pos += 8; + + return true; +} + +bool packet_readfloat(Packet* packet, float* out) +{ + RAssert(packet->pos < packet->len); + *out = *((float*)&packet->buff[packet->pos]); + +#ifdef SYS_BIG_ENDIAN + *out = BYTESWAP_32(*out); +#endif + + packet->pos += 4; + + return true; +} + +bool packet_readdouble(Packet* packet, double* out) +{ + RAssert(packet->pos < packet->len); + *out = *((float*)&packet->buff[packet->pos]); + +#ifdef SYS_BIG_ENDIAN + * out = BYTESWAP_32(*out); +#endif + + packet->pos += 8; + + return true; +} + +bool packet_readstr(Packet* packet, String* out) +{ + out->len = 0; + + while (1) + { + RAssert(packet->pos < packet->len); + RAssert(out->len < 128); + + char ch = packet->buff[packet->pos]; + out->value[out->len] = ch; + + packet->pos++; + out->len++; + + if (ch == '\0') + break; + } + + return true; +} + +bool packet_write8(Packet* packet, uint8_t value) +{ + RAssert(packet->pos + 1 < PACKET_MAXSIZE); + + if (packet->pos + 1 >= packet->len) + packet->len++; + + packet->buff[packet->pos++] = value; + return true; +} + +bool packet_write16(Packet* packet, uint16_t value) +{ + RAssert(packet->pos + 2 < PACKET_MAXSIZE); + + if (packet->pos + 2 >= packet->len) + packet->len += 2; + +#ifdef SYS_BIG_ENDIAN + value = BYTESWAP_16(value); +#endif + + uint8_t* ptr = (uint8_t*)&value; + packet->buff[packet->pos++] = ptr[0]; + packet->buff[packet->pos++] = ptr[1]; + return true; +} + +bool packet_write32(Packet* packet, uint32_t value) +{ + RAssert(packet->pos + 4 < PACKET_MAXSIZE); + + if (packet->pos + 4 >= packet->len) + packet->len += 4; + +#ifdef SYS_BIG_ENDIAN + value = BYTESWAP_32(value); +#endif + + uint8_t* ptr = (uint8_t*)&value; + packet->buff[packet->pos++] = ptr[0]; + packet->buff[packet->pos++] = ptr[1]; + packet->buff[packet->pos++] = ptr[2]; + packet->buff[packet->pos++] = ptr[3]; + return true; +} + +bool packet_write64(Packet* packet, uint64_t value) +{ + RAssert(packet->pos + 8 < PACKET_MAXSIZE); + + if (packet->pos + 8 >= packet->len) + packet->len += 8; + +#ifdef SYS_BIG_ENDIAN + value = BYTESWAP_64(value); +#endif + + uint8_t* ptr = (uint8_t*)&value; + packet->buff[packet->pos++] = ptr[0]; + packet->buff[packet->pos++] = ptr[1]; + packet->buff[packet->pos++] = ptr[2]; + packet->buff[packet->pos++] = ptr[3]; + packet->buff[packet->pos++] = ptr[4]; + packet->buff[packet->pos++] = ptr[5]; + packet->buff[packet->pos++] = ptr[6]; + packet->buff[packet->pos++] = ptr[7]; + return true; +} + +bool packet_writefloat(Packet* packet, float value) +{ + RAssert(packet->pos + 4 < PACKET_MAXSIZE); + + if (packet->pos + 4 >= packet->len) + packet->len += 4; + +#ifdef SYS_BIG_ENDIAN + value = BYTESWAP_32(value); +#endif + + uint8_t* ptr = (uint8_t*)&value; + packet->buff[packet->pos++] = ptr[0]; + packet->buff[packet->pos++] = ptr[1]; + packet->buff[packet->pos++] = ptr[2]; + packet->buff[packet->pos++] = ptr[3]; + return true; +} + +bool packet_writedouble(Packet* packet, double value) +{ + RAssert(packet->pos + 8 < PACKET_MAXSIZE); + + if (packet->pos + 8 >= packet->len) + packet->len += 8; + +#ifdef SYS_BIG_ENDIAN + value = BYTESWAP_64(value); +#endif + + uint8_t* ptr = (uint8_t*)&value; + packet->buff[packet->pos++] = ptr[0]; + packet->buff[packet->pos++] = ptr[1]; + packet->buff[packet->pos++] = ptr[2]; + packet->buff[packet->pos++] = ptr[3]; + packet->buff[packet->pos++] = ptr[4]; + packet->buff[packet->pos++] = ptr[5]; + packet->buff[packet->pos++] = ptr[6]; + packet->buff[packet->pos++] = ptr[7]; + return true; +} + +bool packet_writestr(Packet* packet, String value) +{ + for (uint8_t i = 0; i < value.len; i++) + RAssert(packet_write8(packet, value.value[i])); + + return true; +} diff --git a/disasterserver_c/Packet.h b/disasterserver_c/Packet.h new file mode 100644 index 0000000..b31b161 --- /dev/null +++ b/disasterserver_c/Packet.h @@ -0,0 +1,220 @@ +#ifndef PACKET_H +#define PACKET_H +#include +#include +#include + +typedef enum +{ + IDENTITY, + SERVER_IDENTITY_RESPONSE, + + SERVER_PLAYER_JOINED, + SERVER_PLAYER_LEFT, + SERVER_PLAYER_FORCE_DISCONNECT, + + SERVER_WAITING_PLAYER_INFO, + + SERVER_LOBBY_READY_STATE, + SERVER_LOBBY_EXE, + SERVER_LOBBY_COUNTDOWN, + SERVER_LOBBY_EXE_CHANGE, + SERVER_LOBBY_CHARACTER_CHANGE, + SERVER_LOBBY_CHARACTER_RESPONSE, + SERVER_LOBBY_EXECHARACTER_RESPONSE, + SERVER_LOBBY_GAME_START, + SERVER_LOBBY_PLAYER, + SERVER_LOBBY_EXE_CHANCE, + SERVER_LOBBY_CORRECT, + SERVER_LOBBY_CHOOSEVOTEKICK, + SERVER_LOBBY_CHOOSEBAN, + SERVER_LOBBY_CHOOSEKICK, + SERVER_LOBBY_CHOOSEOP, + SERVER_LOBBY_CHANGELOBBY, + SERVER_CHAR_TIME_SYNC, + + SERVER_VOTE_MAPS, + SERVER_VOTE_SET, + SERVER_VOTE_TIME_SYNC, + + SERVER_GAME_PLAYERS_READY, + SERVER_GAME_EXE_WINS, + SERVER_GAME_SURVIVOR_WIN, + SERVER_GAME_SPAWN_RING, + SERVER_GAME_PLAYER_ESCAPED, + SERVER_GAME_BACK_TO_LOBBY, + SERVER_GAME_TIME_SYNC, + SERVER_GAME_TIME_OVER, + SERVER_GAME_PING, + SERVER_PLAYER_DEATH_STATE, + SERVER_GAME_DEATHTIMER_TICK, + SERVER_GAME_DEATHTIMER_END, + + SERVER_REQUEST_INFO, + SERVER_HEARTBEAT, + SERVER_PONG, + + SERVER_FORCE_DAMAGE, + SERVER_GAME_RING_READY, + SERVER_PLAYER_BACKTRACK, + + // Entities + SERVER_TPROJECTILE_STATE, + SERVER_ETRACKER_STATE, + SERVER_ERECTOR_BRING_SPAWN, + SERVER_RMZSLIME_STATE, + SERVER_RMZSLIME_RINGBONUS, + SERVER_RMZSHARD_STATE, + SERVER_LCEYE_STATE, + SERVER_LCCHAIN_STATE, + SERVER_NPCONTROLLER_STATE, + SERVER_KAFMONITOR_STATE, + SERVER_YCRSMOKE_STATE, + SERVER_YCRSMOKE_READY, + SERVER_MOVINGSPIKE_STATE, + SERVER_RING_STATE, + SERVER_RING_COLLECTED, + SERVER_ACT9WALL_STATE, + SERVER_NAPBALL_STATE, + SERVER_NAPICE_STATE, + SERVER_PFLIFT_STATE, + SERVER_BRING_STATE, + SERVER_BRING_COLLECTED, + SERVER_VVLCOLUMN_STATE, + SERVER_VVVASE_STATE, + SERVER_GHZTHUNDER_STATE, + SERVER_TCGOM_STATE, + SERVER_EXELLERCLONE_STATE, + SERVER_DTTAILSDOLL_STATE, + SERVER_DTBALL_STATE, + SERVER_DTASS_STATE, + SERVER_HDDOOR_STATE, + SERVER_WDLATERN_ACTIVATE, + SERVER_FART_STATE, + SERVER_MJLAVA_STATE, + SERVER_MJJUDGER_STATE, + SERVER_MJCRYSTAL_STATE, + + // Entity actions + CLIENT_ETRACKER, + CLIENT_ETRACKER_ACTIVATED, + CLIENT_TPROJECTILE, + CLIENT_TPROJECTILE_HIT, + CLIENT_TPROJECTILE_STARTCHARGE, + CLIENT_ERECTOR_BALLS, + CLIENT_ERECTOR_BRING_SPAWN, + CLIENT_EXELLER_SPAWN_CLONE, + CLIENT_EXELLER_TELEPORT_CLONE, + CLIENT_MERCOIN_BONUS, + + CLIENT_RMZSLIME_HIT, + CLIENT_LCEYE_REQUEST_ACTIVATE, + CLIENT_KAFMONITOR_ACTIVATE, + CLIENT_RING_COLLECTED, + CLIENT_RING_BROKE, + CLIENT_BRING_COLLECTED, + CLIENT_NAPICE_ACTIVATE, + CLIENT_SPRING_USE, + CLIENT_PFLIT_ACTIVATE, + CLIENT_VVVASE_BREAK, + CLIENT_RMZSHARD_COLLECT, + CLIENT_RMZSHARD_LAND, + CLIENT_DTASS_ACTIVATE, + CLIENT_HDDOOR_TOGGLE, + CLIENT_FART_PUSH, + + CLIENT_LOBBY_READY_STATE, + CLIENT_REQUESTED_INFO, + CLIENT_PLAYER_DATA, + CLIENT_PLAYER_HURT, + CLIENT_SOUND_EMIT, + CLIENT_PING, + + CLIENT_REVIVAL_PROGRESS, + CLIENT_PLAYER_HEAL, + CLIENT_PLAYER_HEAL_PART, + SERVER_REVIVAL_PROGRESS, + SERVER_REVIVAL_STATUS, + SERVER_REVIVAL_RINGSUB, + SERVER_REVIVAL_REVIVED, + + CLIENT_REQUEST_CHARACTER, + CLIENT_REQUEST_EXECHARACTER, + CLIENT_VOTE_REQUEST, + + CLIENT_PLAYER_DEATH_STATE, + CLIENT_PLAYER_ESCAPED, + SERVER_PLAYER_ESCAPED, + CLIENT_LOBBY_PLAYERS_REQUEST, + CLIENT_CREAM_SPAWN_RINGS, + CLIENT_SPAWN_EFFECT, + CLIENT_CHAT_MESSAGE, + CLIENT_LOBBY_CHOOSEVOTEKICK, + CLIENT_LOBBY_CHOOSEBAN, + CLIENT_LOBBY_CHOOSEKICK, + CLIENT_LOBBY_CHOOSEOP, + CLIENT_PLAYER_PALETTE, + CLIENT_PET_PALETTE, + + SERVER_RESULTS, + SERVER_RESULTS_DATA, + CLIENT_RESULTS_REQUEST, + CLIENT_STATS_REPORT, + SERVER_PREIDENTITY, + SERVER_FELLA, + + CLIENT_PLAYER_POTATER +} PacketType; + +typedef struct +{ + #define PACKET_MAXSIZE 256 + + uint8_t buff[PACKET_MAXSIZE]; + uint8_t pos; + uint8_t len; +} Packet; + +/* UTF-8 supporting string */ +typedef struct +{ + char value[250]; + uint16_t len; +} String; + +String string_new(const char* value); +size_t string_length(String* str); +String string_lower(String str); +#define __Str(x) string_new(x) + +bool packet_new(Packet* packet, PacketType type); +Packet packet_from(ENetPacket* packet); + +struct Server; +bool packet_send(ENetPeer* peer, Packet* packet, bool reliable); +bool packet_send_id(struct Server* server, uint16_t id, Packet* packet, bool reliable); +bool packet_seek(Packet* packet, int wh); + +bool packet_read8(Packet* packet, uint8_t* out); +bool packet_read16(Packet* packet, uint16_t* out); +bool packet_read32(Packet* packet, uint32_t* out); +bool packet_read64(Packet* packet, uint64_t* out); +bool packet_readfloat(Packet* packet, float* out); +bool packet_readdouble(Packet* packet, double* out); +bool packet_readstr(Packet* packet, String* out); + +bool packet_write8(Packet* packet, uint8_t value); +bool packet_write16(Packet* packet, uint16_t value); +bool packet_write32(Packet* packet, uint32_t value); +bool packet_write64(Packet* packet, uint64_t value); +bool packet_writefloat(Packet* packet, float value); +bool packet_writedouble(Packet* packet, double value); +bool packet_writestr(Packet* packet, String value); + +#define PacketCreate(packet, type) RAssert(packet_new(packet, type)) +#define PacketRead(outname, packet, func, type)\ +type outname;\ +RAssert(func(packet, (void*)&outname)) +#define PacketWrite(packet, func, val) RAssert(func(packet, val)) + +#endif diff --git a/disasterserver_c/Palette.c b/disasterserver_c/Palette.c new file mode 100644 index 0000000..b7d12df --- /dev/null +++ b/disasterserver_c/Palette.c @@ -0,0 +1,203 @@ +#include +#include +#define PALETTE_END (0xDEADB00B) +#define PALETTE_EPSILON (10) + +uint32_t palettes_from[][20] = { + { 0xe0a000, 0xe08000, 0xa06040, 0xc0c0e0, 0xa0a0c0, 0x606080, 0x202020, PALETTE_END }, + { 0xe0a000, 0xe08000, 0xa06040, 0xe0e0e0, 0xc0c0e0, 0xa0a0c0, 0x606080, 0x800000, PALETTE_END }, + { 0x2d273b, 0x181421, 0xb3b3b3, 0x828282, 0x424242, PALETTE_END }, + { 0x2d273b, 0x181421, 0xd6d6d6, 0xb3b3b3, 0x828282, 0x424242, PALETTE_END }, + { 0xf84468, 0xd00020, 0x680020, 0xf8f8f8, 0xd0d4f8, 0xb0b0d0, 0x686888, 0xf80000, 0x880000, 0x202020, PALETTE_END }, + { 0xf84468, 0xd00020, 0x680020, 0xf8f8f8, 0xd0d4f8, 0xb0b0d0, 0x686888, 0x880000, PALETTE_END }, + { 0x771515, 0x470013, 0x1f000b, 0xd6d6d6, 0xb3b3b3, 0x828282, 0x424242, 0xd58f6e, 0x944b3d, 0xd6d6d6, PALETTE_END }, + { 0x771515, 0x470013, 0x1f000b, 0xd6d6d6, 0xb3b3b3, 0x828282, 0x424242, 0xd58f6e, 0x944b3d, PALETTE_END }, + { 0x800000, 0xe0a000, 0xe0e0e0, 0xc0c0e0, 0xa0a0c0, 0x606080, 0x202020, PALETTE_END }, + { 0xe00000, 0x800000, 0xe0a000, 0xe0e0e0, 0xc0c0e0, 0xa0a0c0, 0x606080, 0xe0a080, 0xa06040, PALETTE_END }, + { 0x470013, 0x1f000b, 0x976e2b, 0x64372b, 0xd6d6d6, 0xb3b3b3, 0x828282, 0x424242, 0x363636, 0x636363, 0x470000, 0x383838, 0x616161, PALETTE_END }, + { 0x470013, 0x1f000b, 0x976e2b, 0x64372b, 0xd6d6d6, 0xb3b3b3, 0x828282, 0x424242, PALETTE_END }, + { 0xf19dbb, 0xe65b8c, 0xa93559, 0xbb7655, 0xfcb037, 0xdc7605, 0xff7575, 0xe0e0e0, 0xc0c0e0, 0xa0a0c0, 0x606080, 0x202020, PALETTE_END }, + { 0xf19dbb, 0xe65b8c, 0xa93559, 0xbb7655, 0x800000, 0xe0e0e0, 0xc0c0e0, 0xa0a0c0, 0x606080, PALETTE_END }, + { 0x884440, 0x582c28, 0x301818, 0xd6d6d6, 0xb3b3b3, 0x828282, 0x424242, 0x9e4127, 0xd58f6e, PALETTE_END }, + { 0x884440, 0x582c28, 0x301818, 0x431a20, 0x260a0f, 0x632d33, 0xd6d6d6, 0xb3b3b3, 0x828282, 0x424242, PALETTE_END }, + { 0xeecba8, 0xe39c79, 0xc16b53, 0xfc8c04, 0xd5560b, 0xe00000, 0x800000, 0xe4e0e4, 0xc0c0e0, 0xa0a0c0, 0x606080, 0x202020, PALETTE_END }, + { 0xeecba8, 0xe39c79, 0xc16b53, 0xfc8c04, 0xd5560b, 0xa3330e, 0xe00000, 0x800000, 0xf3bb10, 0xc46a09, 0xe4e0e4, 0xc0c0e0, 0xa0a0c0, 0x606080, PALETTE_END }, + { 0x793379, 0x4b214b, 0x341634, 0x771515, 0x470013, 0x1f000b, 0x431a20, 0x260a0f, 0xe4e0e4, 0xb3b3b3, 0x828282, 0x424242, PALETTE_END }, + { 0x793379, 0x4b214b, 0x341634, 0x771515, 0x470013, 0x1f000b, 0x431a20, 0x260a0f, 0xb3b3b3, 0x828282, 0x424242, 0x000000, PALETTE_END }, + { 0xdf7f22, 0xaf631b, 0x7f4712, 0xf1be5f, 0xc3994c, 0x8b6c34, 0x6060e0, 0x3600ff, 0x2d008f, 0xc22313, 0xa21a0b, 0x721307, PALETTE_END }, + { 0xdf7f22, 0xaf631b, 0x7f4712, 0xf1be5f, 0xc3994c, 0x8b6c34, 0x6060e0, 0x3600ff, 0x2d008f, 0xc22313, 0xa21a0b, 0x721307, PALETTE_END }, + { 0x68232a, 0x421216, 0x260006, 0xe49c79, 0xbb6d4e, 0x66281d, 0x474784, 0x202886, 0x1b1342, 0x740000, 0x400000, 0x1c0000, 0x470000, 0x910000, 0x963423, PALETTE_END }, + { 0x68232a, 0x421216, 0x260006, 0xe49c79, 0xbb6d4e, 0x66281d, 0x474784, 0x202886, 0x1b1342, 0x740000, 0x400000, 0x1c0000, 0x000000, 0x470000, 0x910000, 0x963423, PALETTE_END }, + { 0x6b69ff, 0x2145d6, 0x21208c, 0xfffbff, 0xd6d7ff, 0xb5b2d6, 0x6b698c, 0x800000, 0xe00000, PALETTE_END }, + { 0x6b69ff, 0x2145d6, 0x21208c, 0xffb28c, 0xb56942, 0xfffbff, 0xd6d7ff, 0xb5b2d6, 0x6b698c, 0xff0000, 0x940000, 0x800000, 0xe00000, PALETTE_END }, + { 0x2c3974, 0x253060, 0x171f3c, 0x001b2e, 0x000e18, 0x058cf9, 0x2f608e, 0x463e8e, 0x0094ff, PALETTE_END }, + { 0x2c3974, 0x253060, 0x171f3c, 0x001b2e, 0x000e18, 0x058cf9, 0x2f608e, 0x463e8e, 0xfffbff, 0xd6d7ff, 0xa0a0c0, 0x606080, 0xb5b2d6, 0x6b698c, 0x606080, 0x0094ff, PALETTE_END }, + { 0x003f99, 0x01316a, 0x011535, 0xf2c4b5, 0x99766c, PALETTE_END }, + { 0x011535, 0x6b698c, 0x300909, 0x940001, 0xff0000, 0x01316a, 0x99766c, 0xcc0005, 0xff0001, 0xb8b8d8, 0x003f99, 0xf2c4b5, 0xd8d8f8, 0xfcfcfc, 0x222222, 0xff3338, 0x940000, 0x604239, PALETTE_END }, + { 0x177aff, 0x0f47c0, 0x102676, 0xf2a572, 0xb2622d, PALETTE_END }, + { 0x177aff, 0x0f47c0, 0x102676, 0xf2a572, 0xb2622d, 0xc40000, PALETTE_END } +}; +#define PALETTE_FROM_SIZE (32) + +uint32_t palettes_to[][20] = { + { 0xe09600, 0xbf6900, 0x8f0e00, 0xa5a5a5, 0x848484, 0x424242, 0x000000, PALETTE_END }, + { 0xf89c00, 0xfa6000, 0xb80c00, 0xfcfcfc, 0xd8d8fc, 0xb4b4d8, 0x6c6c90, 0x800020, PALETTE_END }, + { 0x282848, 0x101430, 0xc0c0e0, 0xa0a0c0, 0x606080, PALETTE_END }, + { 0x482928, 0x301013, 0xddd0d0, 0xc1abaa, 0x83766d, 0x53524a, PALETTE_END }, + { 0xf02c28, 0x982020, 0x570000, 0xe0e0e0, 0xa5a5a5, 0x848484, 0x424242, 0x982020, 0x570000, 0x000000, PALETTE_END }, + { 0xfc0000, 0xac0000, 0x570000, 0xfcfcfc, 0xd8d8fc, 0xb4b4d8, 0x6c6c90, 0x800020, PALETTE_END }, + { 0x900005, 0x59000f, 0x210009, 0xddd0d0, 0xc1abaa, 0x83766d, 0x53524a, 0xfcb490, 0xb46c48, 0xddd0d0, PALETTE_END }, + { 0x9f002d, 0x68002c, 0x300019, 0xf8f8f8, 0xd0d4f8, 0xb0b0d0, 0x686888, 0xfcb490, 0xb46c48, PALETTE_END }, + { 0x570000, 0xffda00, 0xe0e0e0, 0xa5a5a5, 0x848484, 0x424242, 0x000000, PALETTE_END }, + { 0xb42448, 0x800020, 0xf89c00, 0xfcfcfc, 0xd8d8fc, 0xb4b4d8, 0x6c6c90, 0xf29a6e, 0xba5726, PALETTE_END }, + { 0x6e1717, 0x420f0f, 0xb19a27, 0x92791e, 0xddd0d0, 0xc1abaa, 0x83766d, 0x53524a, 0x6b5f5f, 0xafa3a3, 0x800000, 0x6b5f5f, 0xafa3a3, PALETTE_END }, + { 0x610000, 0x380000, 0xb39502, 0x8c6e00, 0xf8f8f8, 0xd0d4f8, 0xb0b0d0, 0x686888, PALETTE_END }, + { 0xe1a1cc, 0xd45a99, 0x802e42, 0xaa6644, 0xe08e00, 0xa06040, 0xe74200, 0xe0e0e0, 0xa5a5a5, 0x848484, 0x424242, 0x000000, PALETTE_END }, + { 0xff9cbe, 0xff3b65, 0xa61738, 0xba5726, 0x800020, 0xfcfcfc, 0xd8d8fc, 0xb4b4d8, 0x6c6c90, PALETTE_END }, + { 0xc97f7b, 0x8c4b48, 0x4d2626, 0xe0e0e0, 0xc0c0e0, 0xa0a0c0, 0x606080, 0x7f6948, 0xdab273, PALETTE_END }, + { 0xb35658, 0x882a3b, 0x4c101b, 0x97091c, 0x5b070a, 0xbf364a, 0xddd0d0, 0xc1abaa, 0x83766d, 0x53524a, PALETTE_END }, + { 0xf8e0b8, 0xe8c080, 0x987840, 0xf89000, 0xe05800, 0xf85800, 0x980000, 0xe4e0e4, 0xa5a5a5, 0x848484, 0x424242, 0x000000, PALETTE_END }, + { 0xfacb9c, 0xf69566, 0xdd5b37, 0xf89c00, 0xfa6000, 0xb80c00, 0xe70000, 0x800020, 0xf89c00, 0xdd5b37, 0xfcfcfc, 0xd8d8fc, 0xb4b4d8, 0x6c6c90, PALETTE_END }, + { 0x61315e, 0x3f2040, 0x291329, 0x960d19, 0x690000, 0x400000, 0x6e4435, 0x4d2d25, 0xddd0d0, 0xc1abaa, 0x83766d, 0x53524a, PALETTE_END }, + { 0xbb1a81, 0x7d1055, 0x520e40, 0xb91107, 0x97091c, 0x5b070a, 0x97091c, 0x5b070a, 0xc0c0e0, 0xa0a0c0, 0x606080, 0x212121, PALETTE_END }, + { 0xc56b36, 0x985329, 0x71371c, 0xe0c080, 0xb09256, 0x695128, 0x60a0e0, 0x2060e0, 0x2040a0, 0xc43612, 0xa02000, 0x800000, PALETTE_END }, + { 0xa3632b, 0x884c18, 0x69370c, 0xe9c094, 0xc48f76, 0x875741, 0x177aff, 0x2040c0, 0x202080, 0xe00020, 0xa00000, 0x620000, PALETTE_END }, + { 0x955f4a, 0x6e4435, 0x4d2d25, 0xdab273, 0xa1845c, 0x5e4d36, 0x6b69ff, 0x2145d6, 0x21208c, 0xa62005, 0x690000, 0x400000, 0x400000, 0xa1845c, 0xa1845c, PALETTE_END }, + { 0xc56b36, 0x985329, 0x71371c, 0xe0c080, 0xba9954, 0x755f2f, 0x4080c0, 0x2060a0, 0x204060, 0xc22313, 0xa21a0b, 0x721307, 0x202020, 0xa03219, 0x9a4827, 0xa76939, PALETTE_END }, + { 0x6c6cd8, 0x4848b4, 0x242490, 0xe4e0e4, 0xb3b3b3, 0x828282, 0x424242, 0x5a0000, 0xb30000, PALETTE_END }, + { 0x256ba9, 0x205a7a, 0x13374d, 0xe3b890, 0xa5826b, 0xddd0d0, 0xc1abaa, 0x83766d, 0x53524a, 0xd1322e, 0x731c1a, 0x5a0000, 0xb30000, PALETTE_END }, + { 0x2c6d74, 0x255a60, 0x173a3c, 0x002e20, 0x001811, 0x05f9b7, 0x137373, 0x132d46, 0x05f9b7, PALETTE_END }, + { 0x742c40, 0x602536, 0x3c1723, 0x2e0000, 0x170000, 0xff0000, 0x940000, 0x2e0000, 0xddd0d0, 0xc1abaa, 0x83766d, 0x53524a, 0xc1abaa, 0x83766d, 0x53524a, 0xff0000, PALETTE_END }, + { 0x0e38a3, 0x110b9f, 0x000f55, 0xe0a080, 0xa06040, PALETTE_END }, + { 0x3d0065, 0x3d0065, 0x3d0065, 0x3d0065, 0x0c0031, 0x0c0031, 0x0c0031, 0x0c0031, 0x0c0031, 0x0c0031, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x7300bf, 0x3d0065, 0x3d0065, PALETTE_END }, + { 0x6b69ff, 0x2145d6, 0x21208c, 0xffb28c, 0xb56942, PALETTE_END }, + { 0x353867, 0x292d50, 0x1c1f37, 0xc1bdb8, 0x898781, 0x800000, PALETTE_END } +}; +#define PALETTE_TO_SIZE (32) + +uint32_t palettes_custom[][5] = { + { 0x800000, 0xe00000, PALETTE_END }, + { 0x800000, 0xe00000, PALETTE_END }, + { 0x880000, 0xf80000, PALETTE_END }, + { 0x840000, 0xe70000, PALETTE_END }, + { 0xe0a000, PALETTE_END }, + { 0x64372b, 0x976e2b, PALETTE_END }, + { 0x800000, 0xe00000, 0xff7575, PALETTE_END }, + { 0x260a0f, 0x431a20, 0x632d33, PALETTE_END }, + { 0x800000, 0xe00000, PALETTE_END }, + { 0x260a0f, 0x431a20, PALETTE_END }, + { 0x2d008f, 0x3600ff, 0x6060e0, 0x25518a, PALETTE_END }, + { 0x1b1342, 0x202886, 0x474784, PALETTE_END }, + { 0x940000, 0xff0000, PALETTE_END }, + { 0x940000, 0xff0000, PALETTE_END }, + { 0x940001, 0xff0001, PALETTE_END }, + { 0x177aff, 0x0f47c0, 0x102676, PALETTE_END } +}; +#define PALETTE_CUSTOM_SIZE (16) + +bool palette_within_epsilon(uint8_t a, uint8_t b) +{ + return a >= b - PALETTE_EPSILON && a <= b + PALETTE_EPSILON; +} + +bool palette_player_validate(PeerData* v, Packet* packet) +{ + PacketRead(from, packet, packet_read8, uint8_t); + PacketRead(id, packet, packet_read16, uint16_t); + PacketRead(name, packet, packet_readstr, String); + PacketRead(size, packet, packet_read8, uint8_t); + + // default + if(size <= 0) + return false; + + // Check for custom & correct id + bool is_custom = strncmp(name.value, "custom", 6) == 0; + RAssert(v->id == id); + RAssert((size / 4) <= 19); + + uint32_t final[20][3] = {0}; + uint8_t final_len = 0; + + for(uint8_t i = 0; i < size / 4; i++) + { + PacketRead(r, packet, packet_read8, uint8_t); + PacketRead(g, packet, packet_read8, uint8_t); + PacketRead(b, packet, packet_read8, uint8_t); + PacketRead(a, packet, packet_read8, uint8_t); + + final[final_len][0] = r; + final[final_len][1] = g; + final[final_len++][2] = b; + } + + if(from) + { + for(int i = 0; i < (is_custom ? PALETTE_CUSTOM_SIZE : PALETTE_FROM_SIZE); i++) + { + uint8_t match = 0; + uint8_t length = 0; + + while(1) + { + uint32_t rgb = is_custom ? palettes_custom[i][length] : palettes_from[i][length]; + uint8_t r = (rgb >> 16) & 0xFF; + uint8_t g = (rgb >> 8) & 0xFF; + uint8_t b = rgb & 0xFF; + + if(palette_within_epsilon(final[length][0], r), palette_within_epsilon(final[length][1], g), palette_within_epsilon(final[length][2], b)) + ++match; + + if(++length >= final_len) + break; + + if(is_custom) + { + if(palettes_custom[i][length] == PALETTE_END) + break; + } + else + { + if(palettes_from[i][length] == PALETTE_END) + break; + } + } + + if(match != 0 && match == length) + return true; + } + } + else + { + if(is_custom) + return true; + + for(int i = 0; i < PALETTE_TO_SIZE; i++) + { + uint8_t match = 0; + uint8_t length = 0; + + while(1) + { + uint32_t rgb = palettes_to[i][length]; + uint8_t r = (rgb >> 16) & 0xFF; + uint8_t g = (rgb >> 8) & 0xFF; + uint8_t b = rgb & 0xFF; + + if(palette_within_epsilon(final[length][0], r), palette_within_epsilon(final[length][1], g), palette_within_epsilon(final[length][2], b)) + ++match; + + if(++length >= final_len) + break; + + if(palettes_to[i][length] == PALETTE_END) + break; + } + + if(match != 0 && match == length) + return true; + } + } + + return false; +} \ No newline at end of file diff --git a/disasterserver_c/Palette.h b/disasterserver_c/Palette.h new file mode 100644 index 0000000..997cd4e --- /dev/null +++ b/disasterserver_c/Palette.h @@ -0,0 +1,9 @@ +#ifndef PALETTE_H +#define PALETTE_H +#include +#include +#include + +bool palette_player_validate(PeerData* v, Packet* packet); + +#endif \ No newline at end of file diff --git a/disasterserver_c/Player.c b/disasterserver_c/Player.c new file mode 100644 index 0000000..30c1e4a --- /dev/null +++ b/disasterserver_c/Player.c @@ -0,0 +1,42 @@ +#include +#include +#include + +bool player_add_error(Server* server, PeerData* v, uint16_t by) +{ + v->plr.errors += by; + + Debug("%d error is now %d", v->id, v->plr.errors); + if (v->plr.errors >= 30000) + { + server_disconnect(server, v->peer, DR_OTHER, "Fun fact: dial-up internet connection was relevant 20 years ago!"); + return false; + } + + return true; +} + +void player_check_zone(Server* server, PeerData* v) +{ + if (!g_config.anticheat) + return; + + if (!server->game.started) + return; + + if (v->plr.pos.x == 0 && v->plr.pos.y == 0) + return; + + const Zone* zones = g_mapZone[server->game.map]; + const size_t zonesSize = g_mapZoneSize[server->game.map]; + for (size_t i = 0; i < zonesSize; i++) + { + const Zone zone = zones[i]; + if (v->plr.pos.x >= zone.x && v->plr.pos.y >= zone.y && v->plr.pos.x <= zone.x + zone.w && v->plr.pos.y <= zone.y + zone.h) + { + Debug("%d is inside invalid area %d", v->id, i); + if (!player_add_error(server, v, server->game.map == 6 ? 30 : 1000)) + return; + } + } +} diff --git a/disasterserver_c/Player.h b/disasterserver_c/Player.h new file mode 100644 index 0000000..5ceba72 --- /dev/null +++ b/disasterserver_c/Player.h @@ -0,0 +1,83 @@ +#ifndef PLAYER_H +#define PLAYER_H +#include +#include +#include +#include + +typedef enum +{ + PLAYER_NONE = 0, + PLAYER_ESCAPED = 0x1 << 0, + PLAYER_DEAD = 0x1 << 1, + PLAYER_DEMONIZED = 0x1 << 2, + PLAYER_REVIVED = 0x1 << 3, + PLAYER_CANTREVIVE = 0x1 << 4, + PLAYER_LEFT = 0x1 << 5, + PLAYER_KILLER = 0x1 << 6 +} PlayerFlags; + +typedef struct +{ + uint8_t ready; + uint16_t seq; + uint16_t errors; /* Used as tracker for errors like lag/etc */ + uint8_t ex_teleport; + double timeout; + + uint8_t mod_tool; + uint32_t mod_tool_timer; + uint32_t chunk; + TimeStamp last_packet; + + /* Attack */ + bool is_attacking; + double attack_timer; + TimeStamp last_attack; + + uint16_t ping_last; + double ping_total; + double ping_timer; + uint16_t rings; + TimeStamp last_rings; + uint16_t heal_rings; + + uint8_t state; + PlayerFlags flags; + uint8_t death_timer_sec; + double death_timer; + double revival; + int32_t revival_init[5]; + + uintptr_t data[4]; /* Can be used as pointer/data field */ + Vector2 start_pos; + Vector2 pos; + + struct + { + double survive_time; + double danger_time; + double camp_time; + + double braindead_time; + bool brain_damage; + + uint16_t stun_time; + uint16_t stuns; + uint16_t hp_restored; + uint16_t rings; + uint16_t damage; + uint16_t damage_taken; + uint16_t kills; + } stats; +} Player; + +#define SET_FLAG(x, flag) x |= (flag) +#define DEL_FLAG(x, flag) x = x & ~(flag) + +struct Server; +struct PeerData; +bool player_add_error (struct Server* server, struct PeerData* v, uint16_t by); +void player_check_zone(struct Server* server, struct PeerData* v); + +#endif \ No newline at end of file diff --git a/disasterserver_c/Server.c b/disasterserver_c/Server.c new file mode 100644 index 0000000..d6f3691 --- /dev/null +++ b/disasterserver_c/Server.c @@ -0,0 +1,966 @@ +#include "Lib.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#ifdef SYS_USE_SDL2 +#include +#endif + +cJSON *ip_addr_list = NULL; +Mutex ip_addr_mut; + +bool peer_identity_process(PeerData *v, const char *addr, bool is_banned, uint64_t timeout, bool do_timeout) +{ + MutexLock(ip_addr_mut); + { + if (!v->op && (cJSON_HasObjectItem(ip_addr_list, addr) || cJSON_HasObjectItem(ip_addr_list, v->udid.value))) + { + server_disconnect(v->server, v->peer, DR_IPINUSE, NULL); + MutexUnlock(ip_addr_mut); + return false; + } + } + MutexUnlock(ip_addr_mut); + + if (is_banned) + { + Info("%s banned by host (id %d, ip %s)", v->nickname.value, v->id, addr); + RAssert(server_disconnect(v->server, v->peer, DR_BANNEDBYHOST, NULL)); + return false; + } + + if (v->server->peers.noitems >= 7) + { + v->should_timeout = false; + server_disconnect(v->server, v->peer, DR_LOBBYFULL, NULL); + return false; + } + + if (do_timeout && timeout != 0) + { + time_t tm = time(NULL); + time_t val = timeout - tm; + if (val > 0) + { + Info("%s is rate-limited (id %d, ip %s)", v->nickname.value, v->id, addr); + RAssert(server_disconnect(v->server, v->peer, DR_RATELIMITED, NULL)); + return false; + } + else + AssertOrDisconnect(v->server, timeout_revoke(v->udid.value, addr)); + } + + if (!dylist_push(&v->server->peers, v)) + { + v->should_timeout = false; + server_disconnect(v->server, v->peer, DR_OTHER, "Report this to dev: code BALLS"); + return false; + } + + if (!server_state_joined(v)) + { + v->should_timeout = false; + server_disconnect(v->server, v->peer, DR_OTHER, "Report this to dev: code WHAR"); + return false; + } + + // If all checks out send new packet + Packet pack; + PacketCreate(&pack, SERVER_IDENTITY_RESPONSE); + PacketWrite(&pack, packet_write8, v->server->state == ST_LOBBY); + PacketWrite(&pack, packet_write16, v->id); + RAssert(packet_send(v->peer, &pack, true)); + + // If in queue, do following + if (!v->in_game) + { + // For icons + for (size_t i = 0; i < v->server->peers.capacity; i++) + { + PeerData *peer = (PeerData *)v->server->peers.ptr[i]; + if (!peer) + continue; + + if (peer->id == v->id) + continue; + + PacketCreate(&pack, SERVER_WAITING_PLAYER_INFO); + PacketWrite(&pack, packet_write8, v->server->state == ST_GAME && peer->in_game); + PacketWrite(&pack, packet_write16, peer->id); + PacketWrite(&pack, packet_writestr, peer->nickname); + + if (v->server->state == ST_GAME && peer->in_game) + { + PacketWrite(&pack, packet_write8, v->server->game.exe == peer->id); + PacketWrite(&pack, packet_write8, v->server->game.exe == peer->id ? peer->exe_char : peer->surv_char); + } + else + { + PacketWrite(&pack, packet_write8, peer->lobby_icon); + } + + RAssert(packet_send(v->peer, &pack, true)); + } + + // For other players in queue + PacketCreate(&pack, SERVER_WAITING_PLAYER_INFO); + PacketWrite(&pack, packet_write8, 0); + PacketWrite(&pack, packet_write16, v->id); + PacketWrite(&pack, packet_writestr, v->nickname); + PacketWrite(&pack, packet_write8, v->lobby_icon); + RAssert(server_broadcast_ex(v->server, &pack, true, v->id)); + + char msg[100]; + snprintf(msg, 100, "server " CLRCODE_RED "%d" CLRCODE_RST " of " CLRCODE_BLU "%d" CLRCODE_RST, v->server->id + 1, g_config.server_count); + + server_send_msg(v->server, v->peer, "-----------------------"); + server_send_msg(v->server, v->peer, CLRCODE_RED "better/server~ v" STRINGIFY(BUILD_VERSION)); + server_send_msg(v->server, v->peer, "build from " CLRCODE_PUR __DATE__ " " CLRCODE_GRN __TIME__ CLRCODE_RST); + server_send_msg(v->server, v->peer, msg); + server_send_msg(v->server, v->peer, "-----------------------"); + + if(g_config.motd[0] != '\0') + server_send_msg(v->server, v->peer, g_config.motd); + if (v->op) + server_send_msg(v->server, v->peer, CLRCODE_GRN "you're an operator on this server" CLRCODE_RST); + + if (v->server->state >= ST_GAME) + { + snprintf(msg, 100, "map: " CLRCODE_GRN "%s" CLRCODE_RST, g_mapList[v->server->game.map].name); + server_send_msg(v->server, v->peer, msg); + } + } + + MutexLock(ip_addr_mut); + cJSON_AddItemToObject(ip_addr_list, addr, cJSON_CreateTrue()); + cJSON_AddItemToObject(ip_addr_list, v->udid.value, cJSON_CreateTrue()); + MutexUnlock(ip_addr_mut); + return true; +} + +bool peer_identity(PeerData *v, Packet *packet) +{ + RAssert(v->id > 0); + srand((unsigned int)time(NULL)); + + bool is_banned; + uint64_t timeout; + + // Read header + PacketRead(passtrough, packet, packet_read8, uint8_t); + PacketRead(type, packet, packet_read8, uint8_t); + + PacketRead(build_version, packet, packet_read16, uint16_t); + PacketRead(server_index, packet, packet_read32, int32_t); + PacketRead(nickname, packet, packet_readstr, String); + PacketRead(udid, packet, packet_readstr, String); + PacketRead(lobby_icon, packet, packet_read8, uint8_t); + PacketRead(pet, packet, packet_read8, int8_t); + + RAssert(ban_check(udid.value, v->ip.value, &is_banned)); + RAssert(timeout_check(udid.value, v->ip.value, &timeout)); + RAssert(op_check(v->ip.value, &v->op)); + + v->should_timeout = true; + v->disconnecting = false; + v->mod_tool = false; + v->is_mobile = false; + v->nickname = nickname; + v->udid = udid; + v->lobby_icon = lobby_icon; + v->pet = pet; + + if (g_config.anticheat) + { + AssertOrDisconnect(v->server, auth_verify_ticket(v, packet)); + } + + bool res = true; + MutexLock(v->server->state_lock); + { + v->in_game = (v->server->state == ST_LOBBY); + v->exe_chance = 1 + rand() % 4; + + if (v->server->peers.noitems >= 7) + { + for (int i = 0; i < disaster_count(); i++) + { + Server *server = disaster_get(i); + if (!server) + continue; + + if (server->peers.noitems >= 7) + continue; + + Packet pack; + PacketCreate(&pack, SERVER_LOBBY_CHANGELOBBY); + PacketWrite(&pack, packet_write32, g_config.port + server->id); + packet_send(v->peer, &pack, true); + + Debug("Redirecting %d to another free server: %d", v->id, server->id); + res = false; + goto quit; + } + + server_disconnect(v->server, v->peer, DR_LOBBYFULL, NULL); + res = false; + goto quit; + } + + if (type != IDENTITY) + { + server_disconnect(v->server, v->peer, DR_OTHER, "type != IDENTITY?"); + res = false; + goto quit; + } + + if (passtrough) + { + server_disconnect(v->server, v->peer, DR_OTHER, "passtrough?"); + res = false; + goto quit; + } + + if (build_version != BUILD_VERSION) + { + server_disconnect(v->server, v->peer, DR_VERMISMATCH, NULL); + res = false; + goto quit; + } + + if (string_length(&nickname) >= 30) + { + server_disconnect(v->server, v->peer, DR_OTHER, "Your nickname is too long! (30 characters max)"); + res = false; + goto quit; + } + + if (udid.len <= 0) + { + server_disconnect(v->server, v->peer, DR_OTHER, "whoops you have to put the CD in you conputer"); + res = false; + goto quit; + } + + res = peer_identity_process(v, v->ip.value, is_banned, timeout, server_index == -1); + if (!res) + goto quit; + + Info("%s (id %d) " LOG_YLW "joined.", nickname.value, v->id); + Info(" IP: %s", v->ip.value); + Info(" UID: %s", udid.value); + Info(" Modified: %s", BoolStringify(v->mod_tool)); + Info(" Mobile: %s", BoolStringify(v->is_mobile)); + v->verified = true; + } + +quit: + MutexUnlock(v->server->state_lock); + return res; +} + +bool peer_msg(PeerData *v, Packet *packet) +{ + if (v->id == 0) + return false; + + bool res; + MutexLock(v->server->state_lock); + { + res = server_state_handle(v, packet); + } + MutexUnlock(v->server->state_lock); + + return res; +} + +bool server_worker(Server *server) +{ + srand((unsigned int)time(NULL)); + + char thread_name[128]; + snprintf(thread_name, 128, "Worker Thr %d", server->id); + ThreadVarSet(g_threadName, thread_name); + + if (!ip_addr_list) + { + ip_addr_list = cJSON_CreateObject(); + RAssert(ip_addr_list); + MutexCreate(ip_addr_mut); + } + + TimeStamp ticker; + time_start(&ticker); + + double next_tick = time_end(&ticker); + double heartbeat = 0.0; + const double TARGET_FPS = 1000.0 / 60; + + Packet pack; + PacketCreate(&pack, SERVER_HEARTBEAT); + + while (server->running) + { + ENetEvent ev; + if (enet_host_service(server->host, &ev, 5) > 0) + { + switch (ev.type) + { + case ENET_EVENT_TYPE_CONNECT: + { + Debug("ENET_EVENT_TYPE_CONNECT..."); + ev.peer->data = (PeerData *)malloc(sizeof(PeerData)); + if (!ev.peer->data) + return false; + + memset(ev.peer->data, 0, sizeof(PeerData)); + + PeerData *v = ev.peer->data; + v->server = server; + v->peer = ev.peer; + v->id = ev.peer->incomingPeerID + 1; + enet_address_get_host_ip(&ev.peer->address, v->ip.value, 250); + + Packet packet; + PacketCreate(&packet, SERVER_PREIDENTITY); + RAssert(auth_create_ticket(v, &packet)); + RAssert(packet_send(ev.peer, &packet, true)); + break; + } + + case ENET_EVENT_TYPE_DISCONNECT: + { + Debug("ENET_EVENT_TYPE_DISCONNECT..."); + PeerData *v = (PeerData *)ev.peer->data; + if (!v) + break; + + if (!v->op && v->should_timeout) + { + uint64_t result; + if (timeout_check(v->udid.value, v->ip.value, &result) && result == 0) + timeout_set(v->nickname.value, v->udid.value, v->ip.value, time(NULL) + 5); + } + + if (v->verified) + { + MutexLock(ip_addr_mut); + { + cJSON_DeleteItemFromObject(ip_addr_list, v->udid.value); + cJSON_DeleteItemFromObject(ip_addr_list, v->ip.value); + } + MutexUnlock(ip_addr_mut); + + MutexLock(v->server->state_lock); + { + // Step 3: Cleanup (Only if joined before) + if (dylist_remove(&v->server->peers, v)) + server_state_left(v); + } + MutexUnlock(v->server->state_lock); + } + + Info("%s (id %d) " LOG_YLW "left.", v->nickname.value, v->id); + free(v); + break; + } + + case ENET_EVENT_TYPE_RECEIVE: + { + PeerData *v = (PeerData *)ev.peer->data; + Packet packet = packet_from(ev.packet); + + switch (packet.buff[1]) + { + case IDENTITY: + { + if (!peer_identity(v, &packet)) + { + Debug("Identity failed for id %d", v->id); + } + break; + } + default: + { + if (!peer_msg(v, &packet)) + break; + } + } + + break; + } + default: break; + } + } + + double now = time_end(&ticker); + while (next_tick < now) + { + next_tick += TARGET_FPS; + MutexLock(server->state_lock); + { + switch (server->state) + { + case ST_LOBBY: + case ST_CHARSELECT: + case ST_MAPVOTE: + lobby_state_tick(server); + break; + + case ST_GAME: + game_state_tick(server); + break; + + case ST_RESULTS: + results_state_tick(server); + break; + } + + // Heartbeat + if (server->peers.noitems > 0) + { + server_broadcast(server, &pack, true); + if (heartbeat >= (TICKSPERSEC * 2)) + { + Debug("Heartbeat done."); + heartbeat = 0; + } + heartbeat += server->delta; + } + } + MutexUnlock(server->state_lock); + server->delta = 1; + } + } + + enet_host_destroy(server->host); + return true; +} + +bool server_disconnect(Server* server, ENetPeer* peer, DisconnectReason reason, const char* text) +{ + if (server) + { + PeerData* data = (PeerData*)peer->data; + if(data->disconnecting) + return true; + + if(reason == DR_OTHER && text != NULL) + { + Packet pack; + PacketCreate(&pack, SERVER_PLAYER_FORCE_DISCONNECT); + PacketWrite(&pack, packet_write8, reason); + PacketWrite(&pack, packet_writestr, __Str(text)); + packet_send(peer, &pack, true); + enet_peer_disconnect_later(peer, reason); + } + else + enet_peer_disconnect(peer, reason); + + if(!text) + { + Info("Disconnected id %d %d: No text.", data->id, reason); + } + else + { + Info("Disconnected id %d %d: %s.", data->id, reason, text); + } + + data->disconnecting = true; + } + else + return false; + + return true; +} + +bool server_disconnect_id(Server *server, uint16_t id, DisconnectReason reason, const char *text) +{ + if (server) + { + bool found = false; + for (size_t i = 0; i < server->peers.capacity; i++) + { + PeerData *data = server->peers.ptr[i]; + if (!data) + continue; + + if (data->id == id) + return server_disconnect(server, data->peer, reason, text); + } + } + else + return false; + + return true; +} + +int server_total(Server *server) +{ + int count = 0; + for (size_t i = 0; i < server->peers.capacity; i++) + { + PeerData *peer = (PeerData *)server->peers.ptr[i]; + if (!peer) + continue; + + count++; + } + + return count; +} + +int server_ingame(Server *server) +{ + int count = 0; + for (size_t i = 0; i < server->peers.capacity; i++) + { + PeerData *peer = (PeerData *)server->peers.ptr[i]; + if (!peer) + continue; + + if (peer->in_game) + count++; + } + + return count; +} + +PeerData *server_find_peer(Server *server, uint16_t id) +{ + for (size_t i = 0; i < server->peers.capacity; i++) + { + PeerData *v = (PeerData *)server->peers.ptr[i]; + if (!v) + continue; + + if (v->id == id) + return v; + } + + return NULL; +} + +bool server_broadcast(Server *server, Packet *packet, bool reliable) +{ + for (size_t i = 0; i < server->peers.capacity; i++) + { + PeerData *v = (PeerData *)server->peers.ptr[i]; + if (!v) + continue; + + if (!packet_send(v->peer, packet, reliable)) + server_disconnect(server, v->peer, DR_SERVERTIMEOUT, NULL); + } + + return true; +} + +bool server_broadcast_ex(Server *server, Packet *packet, bool reliable, uint16_t ignore) +{ + for (size_t i = 0; i < server->peers.capacity; i++) + { + PeerData *v = (PeerData *)server->peers.ptr[i]; + if (!v) + continue; + + if (v->id == ignore) + continue; + + if (!packet_send(v->peer, packet, reliable)) + server_disconnect(server, v->peer, DR_SERVERTIMEOUT, NULL); + } + + return true; +} + +bool server_state_joined(PeerData *v) +{ +#ifdef SYS_USE_SDL2 + ui_update_playerlist(v->server); +#endif + + Packet pack; + PacketCreate(&pack, SERVER_LOBBY_EXE_CHANCE); + PacketWrite(&pack, packet_write8, v->exe_chance); + RAssert(packet_send(v->peer, &pack, true)); + + PacketCreate(&pack, SERVER_PLAYER_JOINED); + PacketWrite(&pack, packet_write16, v->id); + PacketWrite(&pack, packet_writestr, v->nickname); + PacketWrite(&pack, packet_write8, v->lobby_icon); + PacketWrite(&pack, packet_write8, v->pet); + server_broadcast_ex(v->server, &pack, true, v->id); + + switch (v->server->state) + { + case ST_LOBBY: + case ST_CHARSELECT: + case ST_MAPVOTE: + return lobby_state_join(v); + + case ST_GAME: + return game_state_join(v); + + case ST_RESULTS: + break; + } + + return true; +} + +bool server_state_handle(PeerData *v, Packet *packet) +{ + switch (v->server->state) + { + case ST_LOBBY: + case ST_CHARSELECT: + case ST_MAPVOTE: + return lobby_state_handle(v, packet); + + case ST_GAME: + return game_state_handletcp(v, packet); + + case ST_RESULTS: + return results_state_handle(v, packet); + } + + return true; +} + +bool server_state_left(PeerData *v) +{ +#ifdef SYS_USE_SDL2 + ui_update_playerlist(v->server); +#endif + + Packet pack; + PacketCreate(&pack, SERVER_PLAYER_LEFT); + PacketWrite(&pack, packet_write16, v->id); + server_broadcast(v->server, &pack, true); + + switch (v->server->state) + { + case ST_LOBBY: + case ST_CHARSELECT: + case ST_MAPVOTE: + return lobby_state_left(v); + + case ST_GAME: + return game_state_left(v); + + case ST_RESULTS: + break; + } + + return true; +} + +unsigned long server_cmd_parse(String *string) +{ + static const char *clr_list[] = CLRLIST; + + String current = {.len = 0}; + bool found_digit = false; + + for (int i = 0; i < string->len; i++) + { + if (!found_digit && isspace(string->value[i])) + continue; + else + found_digit = true; + + if (isspace(string->value[i])) + break; + + bool invalid = false; + for (int j = 0; j < CLRLIST_LEN; j++) + { + if (string->value[i] == clr_list[j][0]) + { + invalid = true; + break; + } + } + + if (invalid) + continue; + + current.value[current.len++] = string->value[i]; + } + current.value[current.len++] = '\0'; + + unsigned int hash = 0; + for (int i = 0; current.value[i] != '\0'; i++) + hash = 31 * hash + current.value[i]; + + return hash; +} + +bool server_cmd_handle(Server *server, unsigned long hash, PeerData *v, String *msg) +{ + Packet pack; + switch (hash) + { + default: + return false; + + case CMD_BAN: + { + if (!v->op) + { + RAssert(server_send_msg(v->server, v->peer, CLRCODE_RED "you aren't an operator.")); + break; + } + + int ingame = server_total(v->server); + if (ingame <= 1) + { + RAssert(server_send_msg(v->server, v->peer, CLRCODE_RED "dude are you gonna ban yourself?")); + break; + } + + PacketCreate(&pack, SERVER_LOBBY_CHOOSEBAN); + RAssert(packet_send(v->peer, &pack, true)); + break; + } + + case CMD_KICK: + { + if (!v->op) + { + RAssert(server_send_msg(v->server, v->peer, CLRCODE_RED "you aren't an operator.")); + break; + } + + if (server_total(v->server) <= 1) + { + RAssert(server_send_msg(v->server, v->peer, CLRCODE_RED "dude are you gonna kick yourself?")); + break; + } + + PacketCreate(&pack, SERVER_LOBBY_CHOOSEKICK); + RAssert(packet_send(v->peer, &pack, true)); + break; + } + + case CMD_OP: + { + if (!v->op) + { + RAssert(server_send_msg(v->server, v->peer, CLRCODE_RED "you aren't an operator.")); + break; + } + + if (server_total(v->server) <= 1) + { + RAssert(server_send_msg(v->server, v->peer, CLRCODE_RED "you're already an operator tho??")); + break; + } + + PacketCreate(&pack, SERVER_LOBBY_CHOOSEOP); + RAssert(packet_send(v->peer, &pack, true)); + break; + } + + case CMD_LOBBY: + { + int ind; + if (sscanf(msg->value, ".lobby %d", &ind) <= 0) + { + RAssert(server_send_msg(v->server, v->peer, CLRCODE_RED "example:~ .lobby 1")); + break; + } + + if (ind < 1 || ind > disaster_count()) + { + char msg[128]; + snprintf(msg, 128, CLRCODE_RED "lobby should be between 1 and %d", disaster_count()); + RAssert(server_send_msg(v->server, v->peer, msg)); + break; + } + + PacketCreate(&pack, SERVER_LOBBY_CHANGELOBBY); + PacketWrite(&pack, packet_write32, g_config.port + ind - 1); + RAssert(packet_send(v->peer, &pack, true)); + break; + } + + /* Help message */ + case CMD_HELP: + { + char lobby_msg[128]; + snprintf(lobby_msg, 128, CLRCODE_GRA ".lobby" CLRCODE_RST " choose lobby (1-%d)", disaster_count()); + + RAssert(server_send_msg(v->server, v->peer, CLRCODE_GRA ".info" CLRCODE_RST " server info")); + RAssert(server_send_msg(v->server, v->peer, lobby_msg)); + RAssert(server_send_msg(v->server, v->peer, CLRCODE_GRA ".vk" CLRCODE_RST " vote kick")); + RAssert(server_send_msg(v->server, v->peer, CLRCODE_GRA ".vp" CLRCODE_RST " vote practice mode")); + + if (v->op) + { + snprintf(lobby_msg, 128, CLRCODE_GRA CLRCODE_GRA ".map" CLRCODE_RST " choose map (1-%d)", MAP_COUNT + 1); + RAssert(server_send_msg(v->server, v->peer, lobby_msg)); + + RAssert(server_send_msg(v->server, v->peer, CLRCODE_GRA ".kick" CLRCODE_RST " kick someone ig")); + RAssert(server_send_msg(v->server, v->peer, CLRCODE_GRA ".ban" CLRCODE_RST " ban someone ig")); + RAssert(server_send_msg(v->server, v->peer, CLRCODE_GRA ".op" CLRCODE_RST " op someone ig")); + } + + break; + } + + /* Information about the lobby */ + case CMD_INFO: + { + char msg[100]; + snprintf(msg, 100, "server " CLRCODE_RED "%d" CLRCODE_RST " of " CLRCODE_BLU "%d" CLRCODE_RST, v->server->id + 1, g_config.server_count); + + server_send_msg(v->server, v->peer, "-----------------------"); + server_send_msg(v->server, v->peer, CLRCODE_RED "better" CLRCODE_BLU "server" CLRCODE_RST " v" STRINGIFY(BUILD_VERSION)); + server_send_msg(v->server, v->peer, "build from " CLRCODE_PUR __DATE__ " " CLRCODE_GRN __TIME__ CLRCODE_RST); + server_send_msg(v->server, v->peer, msg); + server_send_msg(v->server, v->peer, "-----------------------"); + server_send_msg(v->server, v->peer, CLRCODE_GRA "type .help for command list" CLRCODE_RST); + if(g_config.motd[0] != '\0') + server_send_msg(v->server, v->peer, g_config.motd); + break; + } + + /* Does he know? */ + case CMD_STINK: + { + char buff[36]; + if (sscanf(msg->value, ".stink %35s", buff) <= 0) + { + RAssert(server_send_msg(v->server, v->peer, CLRCODE_RED "example:~ .stink baller")); + break; + } + + char format[100]; + snprintf(format, 100, "\\%s~, you /sti@nk~", buff); + + RAssert(server_broadcast_msg(v->server, 0, format)); + break; + } + } + + return true; +} + +bool server_msg_handle(Server *server, PacketType type, PeerData *v, Packet *packet) +{ + switch (type) + { + default: + break; + + case CLIENT_LOBBY_CHOOSEBAN: + { + if (!v->op) + break; + + PacketRead(pid, packet, packet_read16, uint16_t); + + for (size_t i = 0; i < v->server->peers.capacity; i++) + { + PeerData *peer = (PeerData *)v->server->peers.ptr[i]; + if (!peer) + continue; + + if (peer->id == pid) + { + RAssert(ban_add(peer->nickname.value, peer->udid.value, peer->ip.value)); + server_disconnect(v->server, peer->peer, DR_BANNEDBYHOST, NULL); + break; + } + } + break; + } + + case CLIENT_LOBBY_CHOOSEKICK: + { + if (!v->op) + break; + + PacketRead(pid, packet, packet_read16, uint16_t); + + for (size_t i = 0; i < v->server->peers.capacity; i++) + { + PeerData *peer = (PeerData *)v->server->peers.ptr[i]; + if (!peer) + continue; + + if (peer->id == pid) + { + RAssert(timeout_set(peer->nickname.value, peer->udid.value, peer->ip.value, time(NULL) + 60)); + server_disconnect(v->server, peer->peer, DR_KICKEDBYHOST, NULL); + break; + } + } + break; + } + + case CLIENT_LOBBY_CHOOSEOP: + { + if (!v->op) + break; + + PacketRead(pid, packet, packet_read16, uint16_t); + + for (size_t i = 0; i < v->server->peers.capacity; i++) + { + PeerData *peer = (PeerData *)v->server->peers.ptr[i]; + if (!peer) + continue; + + if (peer->id == pid) + { + peer->op = true; + + RAssert(op_add(peer->nickname.value, peer->ip.value)); + server_send_msg(v->server, peer->peer, CLRCODE_GRN "you're an operator now"); + break; + } + } + break; + } + } + + return true; +} + +bool server_send_msg(Server *server, ENetPeer *peer, const char *message) +{ + Packet pack; + PacketCreate(&pack, CLIENT_CHAT_MESSAGE); + PacketWrite(&pack, packet_write16, 0); + PacketWrite(&pack, packet_writestr, string_lower(__Str(message))); + + RAssert(packet_send(peer, &pack, true)); + return true; +} + +bool server_broadcast_msg(Server* server, uint16_t sender, const char* message) +{ + Packet pack; + PacketCreate(&pack, CLIENT_CHAT_MESSAGE); + PacketWrite(&pack, packet_write16, sender); + PacketWrite(&pack, packet_writestr, string_lower(__Str(message))); + + server_broadcast(server, &pack, true); + return true; +} \ No newline at end of file diff --git a/disasterserver_c/Server.h b/disasterserver_c/Server.h new file mode 100644 index 0000000..a2a64d5 --- /dev/null +++ b/disasterserver_c/Server.h @@ -0,0 +1,216 @@ +#ifndef SERVER_H +#define SERVER_H + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define TICKSPERSEC 60 +#define BUILD_VERSION 1101 + +#define STR_HELPER(x) #x +#define STRINGIFY(x) STR_HELPER(x) + +struct Server; +struct auth_peer_data; +typedef struct PeerData +{ + uint16_t id; + String ip; + ENetPeer *peer; + + /* General info */ + Player plr; + String nickname; + String udid; + uint8_t lobby_icon; + int8_t pet; + + bool verified; + bool in_game; + bool op; + bool ready; + bool mod_tool; + bool is_mobile; + bool can_vote; + bool voted; + bool disconnecting; + + auth_peer_data auth; + + /* Character */ + enum + { + CH_NONE = -1, + + CH_TAILS, + CH_KNUX, + CH_EGGMAN, + CH_AMY, + CH_CREAM, + CH_SALLY + } surv_char; + + enum + { + EX_NONE = -1, + + EX_ORIGINAL, + EX_CHAOS, + EX_EXETIOR, + EX_EXELLER + } exe_char; + + bool should_timeout; + + /* State info */ + uint8_t exe_chance; + double timeout; + double vote_cooldown; + + struct Server *server; +} PeerData; + +typedef struct +{ + /* Lobby */ + double countdown; + double prac_countdown; + uint8_t countdown_sec; + Vote vote; + PeerData kick_target; + + /* Map Vote */ + uint8_t maps[3]; + uint8_t votes[3]; + + /* Character Select */ + int8_t map; + uint16_t exe; + bool avail[CH_SALLY + 1]; +} Lobby; + +typedef enum +{ + BS_NONE, + BS_DEACTIVATED, + BS_ACTIVATED, +} BigRingState; + +typedef enum +{ + ED_EXEWIN, + ED_SURVWIN, + ED_TIMEOVER +} Ending; + +typedef struct +{ + int exe; + int8_t map; + bool started; + bool sudden_death; + + double start_timeout; + double time; + double elapsed; + uint16_t time_sec; + double end; + Ending ending; + + BigRingState bring_state; + uint8_t bring_loc; + + /* Entities */ + uint16_t entid; + DyList entities; + + /* Rings */ + bool rings[256]; + uint8_t ring_coff; + + /* Lists */ + DyList left; + +#define PLAYER_COOLCOUNT 6 + double cooldowns[PLAYER_COOLCOUNT]; + TimeStamp tails_last_proj; +} Game; + +// List of cooldown indicies +#define TAILS_RECHARGE 0 +#define CREAM_RING_SPAWN 1 +#define EXETIOR_BRING_SPAWN 2 +#define EXELLER_CLONE_SPAWN 3 +#define EGGTRACK_RECHARGE 4 +#define ETAILS_RECHARGE 5 + +typedef struct Results +{ + double countdown; +} Results; + +typedef struct Server +{ + uint16_t id; + bool running; + + enum + { + ST_LOBBY, + ST_MAPVOTE, + ST_CHARSELECT, + ST_GAME, + ST_RESULTS + } state; + Mutex state_lock; + + /* States */ + Lobby lobby; + Game game; + Results results; + + int8_t last_map; + int16_t map_pickrates[30]; + + double delta; + DyList peers; + ENetHost *host; +} Server; + +bool server_state_joined (PeerData* v); +bool server_state_left (PeerData* v); +bool server_state_handle (PeerData* v, Packet* packet); +bool server_msg_handle (Server* server, PacketType type, PeerData* v, Packet* packet); +bool server_cmd_handle (Server* server, unsigned long hash, PeerData* v, String* msg); +unsigned long server_cmd_parse (String* string); + +bool server_worker (Server* server); +bool server_broadcast (Server* server, Packet* packet, bool reliable); +bool server_broadcast_ex (Server* server, Packet* packet, bool reliable, uint16_t ignore); +bool server_send_msg (Server* server, ENetPeer* peer, const char* message); +bool server_broadcast_msg(Server* server, uint16_t sender, const char* message); + +int server_total (Server* server); +int server_ingame (Server* server); +PeerData* server_find_peer (Server* server, uint16_t id); +bool server_disconnect (Server* server, ENetPeer* peer, DisconnectReason reason, const char* text); +bool server_disconnect_id(Server* server, uint16_t id, DisconnectReason reason, const char* text); + +int server_total(Server *server); +int server_ingame(Server *server); +PeerData *server_find_peer(Server *server, uint16_t id); +bool server_disconnect(Server *server, ENetPeer *peer, DisconnectReason reason, const char *text); +bool server_disconnect_id(Server *server, uint16_t id, DisconnectReason reason, const char *text); + +#endif diff --git a/disasterserver_c/States.h b/disasterserver_c/States.h new file mode 100644 index 0000000..5e5e5a3 --- /dev/null +++ b/disasterserver_c/States.h @@ -0,0 +1,75 @@ +#ifndef LOBBY_H +#define LOBBY_H +#include +#include +#include +#include + +#define AssertOrDisconnect(server, x) if(!(x)) { server_disconnect(server, v->peer, DR_OTHER, "AssertOrDisconnect(" #x ") failed!"); return false; } +#define ENTITY_BODY \ +char tag[16];\ +uint16_t id;\ +Vector2 pos;\ +bool (*init)(Server*, struct Entity*);\ +bool (*tick)(Server*, struct Entity*);\ +bool (*uninit)(Server*, struct Entity*); + +struct Entity; +typedef struct Entity +{ + ENTITY_BODY +} Entity; +#define MakeEntity(tag, x, y) tag, 0, (Vector2){ x, y }, + +#define CMD_HELP 45680751 +#define CMD_MAP 1478254 +#define CMD_STINK 1426706039 +#define CMD_VK 47971 +#define CMD_VP 47976 +#define CMD_BAN 1467681 +#define CMD_KICK 45773684 +#define CMD_OP 47759 +#define CMD_YES 1489913 +#define CMD_Y 1547 +#define CMD_NO 47727 +#define CMD_N 1536 +#define CMD_INFO 45719004 +#define CMD_LOBBY 1420085352 + +bool lobby_init (Server* server); +bool lobby_state_join (PeerData* v); +bool lobby_state_left (PeerData* v); +bool lobby_state_handle (PeerData* v, Packet* packet); +bool lobby_state_tick (Server* server); + + +bool mapvote_init (Server* server); +bool mapvote_state_join (PeerData * v); +bool mapvote_state_left (PeerData * v); +bool mapvote_state_handle (PeerData* v, Packet* packet); +bool mapvote_state_tick (Server* server); + +bool charselect_init (int8_t map, Server* server); +bool charselect_state_join (PeerData* v); +bool charselect_state_left (PeerData* v); +bool charselect_state_handle (PeerData* v, Packet * packet); +bool charselect_state_tick (Server* server); + +bool game_end (Server* server, Ending ending, bool achiv); +bool game_init (int exe, int8_t map, Server* server); +bool game_uninit (Server* server, bool show_results); +bool game_spawn (Server* server, Entity* entity, size_t size, Entity** out); +bool game_despawn (Server* server, Entity** out, uint16_t id); +int game_find (Server* server, Entity** out, char* tag, size_t count); + +bool game_bigring (Server* server, BigRingState state); +bool game_state_join (PeerData* v); +bool game_state_left (PeerData* v); +bool game_state_handletcp (PeerData* v, Packet* packet); +bool game_state_tick (Server* server); + +bool results_init (Server* server); +bool results_state_tick (Server* server); +bool results_state_handle (PeerData* v, Packet* packet); + +#endif diff --git a/disasterserver_c/UTF8.c b/disasterserver_c/UTF8.c new file mode 100644 index 0000000..15dd9e7 --- /dev/null +++ b/disasterserver_c/UTF8.c @@ -0,0 +1,76 @@ +#include + +utf8_char utf8_tolower(utf8_char c) +{ + if(c >= 0x0410 && c <= 0x042F) + return c + 0x20; + else if(c <= 0x7F) + return tolower((int)c); + else + return c; +} + +utf8_char utf8_get(const char* str, int index) +{ + utf8_char result = 0; + int byte_index = 0; + int char_index = 0; + + while (str[byte_index] != '\0' && char_index <= index) { + const uint8_t c = str[byte_index]; + if (c <= 0x7F) + { + if (char_index == index) + result = c; + + byte_index += 1; + } + else if (c >= 0xC0 && c <= 0xDF) + { + if (char_index == index) + result = ((str[byte_index] & 0x1F) << 6) | (str[byte_index + 1] & 0x3F); + + byte_index += 2; + } + else if (c >= 0xE0 && c <= 0xEF) + { + if (char_index == index) + result = ((str[byte_index] & 0x0F) << 12) | ((str[byte_index + 1] & 0x3F) << 6) | (str[byte_index + 2] & 0x3F); + + byte_index += 3; + } + else if (c >= 0xF0 && c <= 0xF7) + { + if (char_index == index) + result = ((str[byte_index] & 0x07) << 18) | ((str[byte_index + 1] & 0x3F) << 12) | ((str[byte_index + 2] & 0x3F) << 6) | (str[byte_index + 3] & 0x3F); + + byte_index += 4; + } + + char_index++; + } + + return result; +} + +size_t utf8_strlen(const char* str) +{ + size_t len = 0; + while (*str != '\0') + { + const uint8_t c = (uint8_t)*str; + + if (c < 128) + str += 1; + else if (c < 224) + str += 2; + else if (c < 240) + str += 3; + else + str += 4; + + len++; + } + + return len; +} \ No newline at end of file diff --git a/disasterserver_c/UTF8.h b/disasterserver_c/UTF8.h new file mode 100644 index 0000000..87831a6 --- /dev/null +++ b/disasterserver_c/UTF8.h @@ -0,0 +1,12 @@ +#ifndef UTF8_H +#define UTF8_H +#include +#include +#include +typedef int utf8_char; + +utf8_char utf8_tolower(utf8_char c); +utf8_char utf8_get(const char* str, int index); +size_t utf8_strlen(const char* str); + +#endif \ No newline at end of file diff --git a/disasterserver_c/Vote.c b/disasterserver_c/Vote.c new file mode 100644 index 0000000..0fff53f --- /dev/null +++ b/disasterserver_c/Vote.c @@ -0,0 +1,58 @@ +#include +#include + +bool vote_init(Server* server, Vote* vote, VoteType type, uint16_t id) +{ + vote->votecnt = 0; + vote->votetotal = 0; + vote->type = type; + + for (size_t i = 0; i < server->peers.capacity; i++) + { + PeerData* peer = (PeerData*)server->peers.ptr[i]; + if (!peer) + continue; + + peer->can_vote = (peer->id != id); + + if(peer->can_vote) + vote->votetotal++; + } + + if (vote->votetotal <= 1) + return false; + + vote->ongoing = true; + vote->countdown = 20 * TICKSPERSEC; + memset(vote->votes, 0, 6 * sizeof(uint8_t)); + return true; +} + +VoteState vote_add(Vote* vote, uint16_t id) +{ + for (int i = 0; i < vote->votecnt; i++) + { + if (vote->votes[i] == id) + return VOTE_ALREADYVOTED; + } + + vote->votes[vote->votecnt++] = id; + if (vote->votecnt >= vote->votetotal) + return VOTE_FULL; + + return VOTE_SUCCESS; +} + +bool vote_tick(Server* server, Vote* vote) +{ + vote->countdown -= server->delta; + if (vote->countdown <= 0) + return false; + + return true; +} + +bool vote_check(Vote* vote) +{ + return vote->votecnt * 2 > (vote->votetotal / 2.0); +} diff --git a/disasterserver_c/Vote.h b/disasterserver_c/Vote.h new file mode 100644 index 0000000..8930b30 --- /dev/null +++ b/disasterserver_c/Vote.h @@ -0,0 +1,35 @@ +#ifndef VOTE_H +#define VOTE_H +#include +#include + +typedef enum +{ + VOTE_KICK, + VOTE_PRACTICE +} VoteType; + +typedef enum +{ + VOTE_SUCCESS = 1, + VOTE_ALREADYVOTED = 0, + VOTE_FULL = -1 +} VoteState; + +typedef struct +{ + VoteType type; + bool ongoing; + uint16_t votes[7]; + uint8_t votecnt; + uint8_t votetotal; + double countdown; +} Vote; + +struct Server; +bool vote_init(struct Server* server, Vote* vote, VoteType type, uint16_t id); +VoteState vote_add(Vote* vote, uint16_t id); +bool vote_tick(struct Server* server, Vote* vote); +bool vote_check( Vote* vote); + +#endif \ No newline at end of file diff --git a/disasterserver_c/Zone.c b/disasterserver_c/Zone.c new file mode 100644 index 0000000..9689564 --- /dev/null +++ b/disasterserver_c/Zone.c @@ -0,0 +1,1392 @@ +#ifndef ZONES_H +#define ZONES_H + +#include +#define ARRAY_SIZE(x) (sizeof(x) / sizeof(Zone)) +#define BLOCK_SIZE (128) +Zone room_act9[] = +{ + { 384, 768, BLOCK_SIZE * 1.953125, BLOCK_SIZE * 1 }, + { 0, 832, BLOCK_SIZE * 3, BLOCK_SIZE * 0.5 }, + { 0, 512, BLOCK_SIZE * 1, BLOCK_SIZE * 1 }, + { 256, 512, BLOCK_SIZE * 7, BLOCK_SIZE * 1 }, + { 0, 896, BLOCK_SIZE * 8, BLOCK_SIZE * 2.75 }, + { 1024, 960, BLOCK_SIZE * 3.125, BLOCK_SIZE * 2.25 }, + { 2112, 896, BLOCK_SIZE * 7.5, BLOCK_SIZE * 2.75 }, + { 2176, 576, BLOCK_SIZE * 2, BLOCK_SIZE * 1 }, + { 1920, 512, BLOCK_SIZE * 1, BLOCK_SIZE * 1 }, + { 1792, 448, BLOCK_SIZE * 1, BLOCK_SIZE * 2 }, + { 1663, 384, BLOCK_SIZE * 1.0078125, BLOCK_SIZE * 1 }, + { 1408, 512, BLOCK_SIZE * 3, BLOCK_SIZE * 1.5 }, + { 2624, 256, BLOCK_SIZE * 2.5, BLOCK_SIZE * 1 }, + { 2176, 320, BLOCK_SIZE * 3.5, BLOCK_SIZE * 1 }, + { 2688, 576, BLOCK_SIZE * 3, BLOCK_SIZE * 2.5 }, + { 2567, 768, BLOCK_SIZE * 0.9453125, BLOCK_SIZE * 1 }, + { 256, 0, BLOCK_SIZE * 1, BLOCK_SIZE * 2 }, + { 384, 0, BLOCK_SIZE * 2, BLOCK_SIZE * 3 }, + { 640, 0, BLOCK_SIZE * 2, BLOCK_SIZE * 2.5 }, + { 896, 0, BLOCK_SIZE * 4, BLOCK_SIZE * 2 }, + { 832, 448, BLOCK_SIZE * 1.5, BLOCK_SIZE * 0.5 }, + { 1152, 736, BLOCK_SIZE * 1.5, BLOCK_SIZE * 0.5 }, + { 1728, 896, BLOCK_SIZE * 1, BLOCK_SIZE * 0.5 }, + { 1792, 832, BLOCK_SIZE * 1, BLOCK_SIZE * 0.5 }, + { 2112, 832, BLOCK_SIZE * 1.5, BLOCK_SIZE * 0.5 }, + { 1920, 992, BLOCK_SIZE * 1.5, BLOCK_SIZE * 2 }, + { 2624, 384, BLOCK_SIZE * 0.5, BLOCK_SIZE * 0.5 }, + { 2688, 192, BLOCK_SIZE * 1, BLOCK_SIZE * 0.5 }, + { 2304, 256, BLOCK_SIZE * 1, BLOCK_SIZE * 0.5 }, + { 1248, 896, BLOCK_SIZE * 1, BLOCK_SIZE * 0.5 }, + { 1600, 960, BLOCK_SIZE * 2, BLOCK_SIZE * 1 }, + { 1504, 1184, BLOCK_SIZE * 3.25, BLOCK_SIZE * 0.5 }, + { 1424, 960, BLOCK_SIZE * 0.625, BLOCK_SIZE * 2.25 }, +}; + +Zone room_angelisland[] = +{ + { 0, 336, BLOCK_SIZE * 2.0625, BLOCK_SIZE * 0.8125 }, + { 264, 272, BLOCK_SIZE * 0.9375, BLOCK_SIZE * 1.3125 }, + { 512, 336, BLOCK_SIZE * 1, BLOCK_SIZE * 2.5000002 }, + { 640, 304, BLOCK_SIZE * 1.0625, BLOCK_SIZE * 3.25 }, + { 448, 432, BLOCK_SIZE * 0.5, BLOCK_SIZE * 1.4375 }, + { 384, 496, BLOCK_SIZE * 0.5, BLOCK_SIZE * 0.8125 }, + { 776, 304, BLOCK_SIZE * 0.875, BLOCK_SIZE * 2.75 }, + { 1024, 336, BLOCK_SIZE * 1, BLOCK_SIZE * 3 }, + { 1296, 304, BLOCK_SIZE * 2.8750002, BLOCK_SIZE * 2.125 }, + { 1664, 304, BLOCK_SIZE * 1, BLOCK_SIZE * 1.8125 }, + { 1792, 304, BLOCK_SIZE * 1, BLOCK_SIZE * 1.125 }, + { 1920, 392, BLOCK_SIZE * 1, BLOCK_SIZE * 1 }, + { 2048, 392, BLOCK_SIZE * 5.25, BLOCK_SIZE * 1.4375 }, + { 2168, 336, BLOCK_SIZE * 4.5625, BLOCK_SIZE * 0.4375 }, + { 2432, 304, BLOCK_SIZE * 2.5, BLOCK_SIZE * 0.25 }, + { 2944, 464, BLOCK_SIZE * 1, BLOCK_SIZE * 8.375 }, + { 2720, 392, BLOCK_SIZE * 0.25, BLOCK_SIZE * 1.25 }, + { 0, 832, BLOCK_SIZE * 0.5, BLOCK_SIZE * 5.5 }, + { 0, 440, BLOCK_SIZE * 1.5, BLOCK_SIZE * 3.0625 }, + { 192, 656, BLOCK_SIZE * 0.5, BLOCK_SIZE * 1.375 }, + { 256, 720, BLOCK_SIZE * 0.625, BLOCK_SIZE * 0.875 }, + { 336, 720, BLOCK_SIZE * 0.375, BLOCK_SIZE * 0.8125 }, + { 576, 784, BLOCK_SIZE * 1.4375, BLOCK_SIZE * 3.125 }, + { 512, 848, BLOCK_SIZE * 0.5, BLOCK_SIZE * 1.75 }, + { 1136, 976, BLOCK_SIZE * 4.625, BLOCK_SIZE * 1.5 }, + { 448, 1264, BLOCK_SIZE * 1.5, BLOCK_SIZE * 0.5 }, + { 272, 1296, BLOCK_SIZE * 0.375, BLOCK_SIZE * 1.875 }, + { 576, 1328, BLOCK_SIZE * 1.5, BLOCK_SIZE * 1.625 }, + { 640, 1264, BLOCK_SIZE * 0.5, BLOCK_SIZE * 0.5 }, + { 704, 1296, BLOCK_SIZE * 0.5, BLOCK_SIZE * 0.25 }, + { 768, 1360, BLOCK_SIZE * 2, BLOCK_SIZE * 1.375 }, + { 1024, 1424, BLOCK_SIZE * 0.5, BLOCK_SIZE * 0.875 }, + { 1216, 1360, BLOCK_SIZE * 0.5, BLOCK_SIZE * 1.375 }, + { 1280, 1328, BLOCK_SIZE * 1.6875, BLOCK_SIZE * 1.6249999 }, + { 1496, 1360, BLOCK_SIZE * 5.8125, BLOCK_SIZE * 1.3749999 }, + { 2624, 1392, BLOCK_SIZE * 0.5, BLOCK_SIZE * 1.1249999 }, + { 2688, 1360, BLOCK_SIZE * 0.5, BLOCK_SIZE * 0.6249999 }, + { 2752, 1328, BLOCK_SIZE * 0.5, BLOCK_SIZE * 0.7499999 }, + { 2816, 1296, BLOCK_SIZE * 1, BLOCK_SIZE * 0.8749999 }, + { 1472, 784, BLOCK_SIZE * 2, BLOCK_SIZE * 0.625 }, + { 2048, 720, BLOCK_SIZE * 2, BLOCK_SIZE * 0.4375 }, + { 2176, 776, BLOCK_SIZE * 1, BLOCK_SIZE * 3.1250002 }, + { 2304, 1040, BLOCK_SIZE * 3, BLOCK_SIZE * 1.3125002 }, + { 2880, 560, BLOCK_SIZE * 0.5, BLOCK_SIZE * 2.9375002 }, + { 2816, 624, BLOCK_SIZE * 0.5, BLOCK_SIZE * 1.4375002 }, + { 2560, 720, BLOCK_SIZE * 2, BLOCK_SIZE * 0.50000024 }, + { 1920, 272, BLOCK_SIZE * 0.9375, BLOCK_SIZE * 0.9375 }, + { 64, 1360, BLOCK_SIZE * 1.625, BLOCK_SIZE * 1.375 }, + { 760, 992, BLOCK_SIZE * 2.9375, BLOCK_SIZE * 1.5625 }, + { 888, 424, BLOCK_SIZE * 1.0625, BLOCK_SIZE * 1.6875 }, + { 1152, 427.82892, BLOCK_SIZE * 1.125, BLOCK_SIZE * 2.2904212 }, + { 1296, 576, BLOCK_SIZE * 0.375, BLOCK_SIZE * 0.875 }, + { 768, 1192, BLOCK_SIZE * 1.9999999, BLOCK_SIZE * 0.25 }, + { 1136, 1168, BLOCK_SIZE * 1.7499999, BLOCK_SIZE * 0.1875 }, + { 1152, 1192, BLOCK_SIZE * 1.5624999, BLOCK_SIZE * 0.1875 }, + { 1152, 1216, BLOCK_SIZE * 0.49999985, BLOCK_SIZE * 0.375 }, + { 1088, 1192, BLOCK_SIZE * 0.49999985, BLOCK_SIZE * 0.1875 }, + { 1024, 1192, BLOCK_SIZE * 0.49999985, BLOCK_SIZE * 0.0625 }, + { 1216, 1216, BLOCK_SIZE * 0.24999985, BLOCK_SIZE * 0.125 }, + { 832, 1224, BLOCK_SIZE * 0.99999994, BLOCK_SIZE * 0.3125 }, + { 768, 1224, BLOCK_SIZE * 0.49999994, BLOCK_SIZE * 0.0625 }, + { 800, 1232, BLOCK_SIZE * 0.24999994, BLOCK_SIZE * 0.125 }, + { 832, 1264, BLOCK_SIZE * 0.49999994, BLOCK_SIZE * 0.125 }, + { 960, 1224, BLOCK_SIZE * 0.24999994, BLOCK_SIZE * 0.0625 }, + { 576, 1184, BLOCK_SIZE * 1.4999999, BLOCK_SIZE * 0.125 }, + { 576, 1200, BLOCK_SIZE * 0.9999999, BLOCK_SIZE * 0.0625 }, + { 3072, 0, BLOCK_SIZE * 0.1875, BLOCK_SIZE * 3.625 }, + { -24, 0, BLOCK_SIZE * 0.1875, BLOCK_SIZE * 3.625 }, + { 1496, 1168, BLOCK_SIZE * 1.8124998, BLOCK_SIZE * 0.25 }, + { 1512, 1200, BLOCK_SIZE * 1.5624998, BLOCK_SIZE * 0.125 }, + { 1536, 1216, BLOCK_SIZE * 1.1249998, BLOCK_SIZE * 0.125 }, + { 1419, 1168, BLOCK_SIZE * 0.6015622, BLOCK_SIZE * 0.125 }, + { 2304, 1208, BLOCK_SIZE * 2.6249998, BLOCK_SIZE * 0.1875 }, + { 2256, 1176, BLOCK_SIZE * 0.37499976, BLOCK_SIZE * 0.1875 }, + { 2560, 784, BLOCK_SIZE * 2, BLOCK_SIZE * 0.12500024 }, + { 2048, 776, BLOCK_SIZE * 1, BLOCK_SIZE * 0.12500024 }, + { 1496, 864, BLOCK_SIZE * 1.625, BLOCK_SIZE * 0.12500024 }, + { 760, 896, BLOCK_SIZE * 1.6875, BLOCK_SIZE * 0.75 }, + { 760, 840, BLOCK_SIZE * 0.875, BLOCK_SIZE * 0.4375 }, + { 976, 944, BLOCK_SIZE * 0.75, BLOCK_SIZE * 0.375 }, + { 200, 304, BLOCK_SIZE * 0.5, BLOCK_SIZE * 0.25 }, + { 888, 336, BLOCK_SIZE * 1.0625, BLOCK_SIZE * 0.6875 }, + { 1152, 336, BLOCK_SIZE * 1.125, BLOCK_SIZE * 0.7109375 }, + { 2744, 697, BLOCK_SIZE * 0.5625, BLOCK_SIZE * 0.17968774 }, +}; + +Zone room_dartower[] = +{ + { 0, 0, BLOCK_SIZE * 5.625, BLOCK_SIZE * 2.8125 }, + { 0, 360, BLOCK_SIZE * 1.25, BLOCK_SIZE * 5 }, + { 160, 560, BLOCK_SIZE * 3.1250002, BLOCK_SIZE * 1.25 }, + { 720, 560, BLOCK_SIZE * 3.7500002, BLOCK_SIZE * 3.4375 }, + { 560, 800, BLOCK_SIZE * 1.2500002, BLOCK_SIZE * 1.25 }, + { 320.00003, 880, BLOCK_SIZE * 1.8750001, BLOCK_SIZE * 0.625 }, + { 640, 960, BLOCK_SIZE * 0.6250001, BLOCK_SIZE * 0.3125 }, + { 320, 1040, BLOCK_SIZE * 0.6250001, BLOCK_SIZE * 5.3125 }, + { 160, 1120, BLOCK_SIZE * 1.2500001, BLOCK_SIZE * 4.6875 }, + { 400.00003, 1200, BLOCK_SIZE * 5, BLOCK_SIZE * 4.0625 }, + { 480, 1120, BLOCK_SIZE * 0.6250001, BLOCK_SIZE * 0.625 }, + { 1200, 800, BLOCK_SIZE * 1.2500001, BLOCK_SIZE * 4.6875 }, + { 1322, 432, BLOCK_SIZE * 2.796875, BLOCK_SIZE * 2.875 }, + { 1680, 560, BLOCK_SIZE * 5.625, BLOCK_SIZE * 1.8750001 }, + { 2240, 480, BLOCK_SIZE * 8.75, BLOCK_SIZE * 1.8750001 }, + { 2608, 352, BLOCK_SIZE * 3.375, BLOCK_SIZE * 1.0000001 }, + { 2880, 320, BLOCK_SIZE * 1.25, BLOCK_SIZE * 0.25000012 }, + { 1040, 1520, BLOCK_SIZE * 3.75, BLOCK_SIZE * 1.5625 }, + { 0, 1840, BLOCK_SIZE * 5, BLOCK_SIZE * 1.25 }, + { 800, 1840, BLOCK_SIZE * 2.5000002, BLOCK_SIZE * 1.25 }, + { 640, 1920, BLOCK_SIZE * 1.2500002, BLOCK_SIZE * 0.625 }, + { 1120, 1920, BLOCK_SIZE * 1.2500002, BLOCK_SIZE * 0.625 }, + { 1280, 1840, BLOCK_SIZE * 5, BLOCK_SIZE * 1.2500001 }, + { 1760, 1760, BLOCK_SIZE * 1.25, BLOCK_SIZE * 0.6328125 }, + { 2080, 1680, BLOCK_SIZE * 2.5, BLOCK_SIZE * 2.5 }, + { 2400, 1600, BLOCK_SIZE * 2.4921875, BLOCK_SIZE * 3.125 }, + { 2719, 1840, BLOCK_SIZE * 6.2578125, BLOCK_SIZE * 1.25 }, + { 3680, 1840, BLOCK_SIZE * 6.25, BLOCK_SIZE * 1.25 }, + { 3920, 1760, BLOCK_SIZE * 4.375, BLOCK_SIZE * 0.625 }, + { 4161, 1680, BLOCK_SIZE * 1.8671875, BLOCK_SIZE * 0.625 }, + { 4400, 1360, BLOCK_SIZE * 0.625, BLOCK_SIZE * 3.125 }, + { 4000, 1280, BLOCK_SIZE * 3.75, BLOCK_SIZE * 0.625 }, + { 4160, 1200, BLOCK_SIZE * 2.5, BLOCK_SIZE * 0.625 }, + { 4320, 720, BLOCK_SIZE * 1.25, BLOCK_SIZE * 3.75 }, + { 4080, 560, BLOCK_SIZE * 3.125, BLOCK_SIZE * 1.25 }, + { 3040, 1200, BLOCK_SIZE * 1.8671875, BLOCK_SIZE * 0.625 }, + { 3600, 1360, BLOCK_SIZE * 1.875, BLOCK_SIZE * 0.625 }, + { 3200, 1440, BLOCK_SIZE * 6.2500005, BLOCK_SIZE * 0.625 }, + { 2960, 1360, BLOCK_SIZE * 5, BLOCK_SIZE * 0.625 }, + { 1520, 1072, BLOCK_SIZE * 11.875, BLOCK_SIZE * 2.5625 }, + { 1520, 992, BLOCK_SIZE * 1.8750002, BLOCK_SIZE * 0.62500006 }, + { 2400, 960, BLOCK_SIZE * 1.8750002, BLOCK_SIZE * 0.87500006 }, + { 2880, 960, BLOCK_SIZE * 1.2500002, BLOCK_SIZE * 0.87500006 }, + { 2640, 1040, BLOCK_SIZE * 1.8750002, BLOCK_SIZE * 0.25000006 }, + { 3360, 368, BLOCK_SIZE * 1.9375002, BLOCK_SIZE * 4.625 }, + { 3600, 800, BLOCK_SIZE * 1.8750002, BLOCK_SIZE * 1.875 }, + { 3840, 880, BLOCK_SIZE * 2.5000002, BLOCK_SIZE * 1.25 }, + { 3608, 400, BLOCK_SIZE * 1.1875002, BLOCK_SIZE * 3.125 }, + { 3760, 400, BLOCK_SIZE * 0.6250003, BLOCK_SIZE * 1.25 }, + { 3840, 400, BLOCK_SIZE * 1.8750002, BLOCK_SIZE * 0.625 }, + { 4240, 480, BLOCK_SIZE * 1.8750002, BLOCK_SIZE * 0.625 }, + { 3040, 400, BLOCK_SIZE * 2.5000002, BLOCK_SIZE * 0.625 }, + { 3200, 240, BLOCK_SIZE * 1.2500004, BLOCK_SIZE * 1.25 }, + { 4400, 240, BLOCK_SIZE * 0.63281274, BLOCK_SIZE * 1.875 }, + { 3760, 0, BLOCK_SIZE * 5.6328125, BLOCK_SIZE * 1.875 }, + { 2632, 0, BLOCK_SIZE * 8.8203125, BLOCK_SIZE * 0.625 }, + { 2312, 0, BLOCK_SIZE * 2.5625002, BLOCK_SIZE * 1.25 }, + { 672, 0, BLOCK_SIZE * 12.875, BLOCK_SIZE * 1.875 }, + { -40, 992, BLOCK_SIZE * 0.3125, BLOCK_SIZE * 6.8125 }, + { 160, 960, BLOCK_SIZE * 0.125, BLOCK_SIZE * 0.3125 }, + { 3040, 1280, BLOCK_SIZE * 3.125, BLOCK_SIZE * 0.625 }, + { 2719, 1760, BLOCK_SIZE * 2.4375, BLOCK_SIZE * 0.625 }, + { 2719, 1680, BLOCK_SIZE * 1.2500001, BLOCK_SIZE * 0.625 }, +}; + +Zone room_deserttown[] = +{ + { 0, 0, BLOCK_SIZE * 3.5, BLOCK_SIZE * 5.5625 }, + { 384, 712, BLOCK_SIZE * 0.5, BLOCK_SIZE * 1.9375 }, + { 128, 912, BLOCK_SIZE * 2, BLOCK_SIZE * 0.375 }, + { 0, 1072, BLOCK_SIZE * 3.5, BLOCK_SIZE * 2.25 }, + { 544, 1072, BLOCK_SIZE * 3.25, BLOCK_SIZE * 2.25 }, + { 1056, 1232, BLOCK_SIZE * 7.25, BLOCK_SIZE * 1 }, + { 1056, 1024, BLOCK_SIZE * 2.75, BLOCK_SIZE * 0.75 }, + { 1568, 1024, BLOCK_SIZE * 3.25, BLOCK_SIZE * 0.75 }, + { 1344, 960, BLOCK_SIZE * 0.5, BLOCK_SIZE * 0.5 }, + { 1504, 896, BLOCK_SIZE * 1.25, BLOCK_SIZE * 0.375 }, + { 1760, 784, BLOCK_SIZE * 0.5, BLOCK_SIZE * 1.0078125 }, + { 1184, 720, BLOCK_SIZE * 0.25, BLOCK_SIZE * 1.5 }, + { 1216, 880, BLOCK_SIZE * 0.25, BLOCK_SIZE * 0.25 }, + { 1248, 880, BLOCK_SIZE * 0.25, BLOCK_SIZE * 0.25 }, + { 1184, 144, BLOCK_SIZE * 0.5, BLOCK_SIZE * 4.5 }, + { 1248, 144, BLOCK_SIZE * 4.5, BLOCK_SIZE * 0.5 }, + { 1760, 208, BLOCK_SIZE * 0.5, BLOCK_SIZE * 0.625 }, + { 1472, 208, BLOCK_SIZE * 0.5, BLOCK_SIZE * 0.5 }, + { 1248, 416, BLOCK_SIZE * 1, BLOCK_SIZE * 0.375 }, + { 1344, 736, BLOCK_SIZE * 5, BLOCK_SIZE * 0.375 }, + { 1344, 784, BLOCK_SIZE * 1, BLOCK_SIZE * 0.125 }, + { 1312, 800, BLOCK_SIZE * 1, BLOCK_SIZE * 0.125 }, + { 1312, 816, BLOCK_SIZE * 0.75, BLOCK_SIZE * 0.125 }, + { 1792, 416, BLOCK_SIZE * 0.25, BLOCK_SIZE * 2.5 }, + { 1472, 416, BLOCK_SIZE * 2.5, BLOCK_SIZE * 0.375 }, + { 1472, 608, BLOCK_SIZE * 1.25, BLOCK_SIZE * 0.25 }, + { 1472, 464, BLOCK_SIZE * 0.25, BLOCK_SIZE * 1.125 }, + { 2144, 1024, BLOCK_SIZE * 2.2500002, BLOCK_SIZE * 2.625 }, + { 2816, 1024, BLOCK_SIZE * 2.25, BLOCK_SIZE * 1.3750001 }, + { 3168, 1024, BLOCK_SIZE * 1, BLOCK_SIZE * 2.625 }, + { 2656, 1312, BLOCK_SIZE * 1.5, BLOCK_SIZE * 0.375 }, + { 2976, 1312, BLOCK_SIZE * 1.5, BLOCK_SIZE * 0.375 }, + { 2432, 1232, BLOCK_SIZE * 0.5, BLOCK_SIZE * 1 }, + { 2432, 1024, BLOCK_SIZE * 1.5, BLOCK_SIZE * 0.375 }, + { 2144, 800, BLOCK_SIZE * 2.5, BLOCK_SIZE * 0.375 }, + { 2368, 848, BLOCK_SIZE * 0.5, BLOCK_SIZE * 0.5 }, + { 2432, 848, BLOCK_SIZE * 0.75, BLOCK_SIZE * 0.5 }, + { 2528, 864, BLOCK_SIZE * 0.25, BLOCK_SIZE * 0.375 }, + { 2560, 880, BLOCK_SIZE * 0.25, BLOCK_SIZE * 0.25 }, + { 2592, 896, BLOCK_SIZE * 0.25, BLOCK_SIZE * 0.125 }, + { 2624, 896, BLOCK_SIZE * 0.25, BLOCK_SIZE * 0.125 }, + { 2816, 448, BLOCK_SIZE * 0.5, BLOCK_SIZE * 4.5 }, + { 2624, 448, BLOCK_SIZE * 1.5, BLOCK_SIZE * 0.375 }, + { 2432, 512, BLOCK_SIZE * 0.75, BLOCK_SIZE * 1 }, + { 2528, 592, BLOCK_SIZE * 1.25, BLOCK_SIZE * 0.375 }, + { 2368, 256, BLOCK_SIZE * 0.5, BLOCK_SIZE * 3 }, + { 2432, 256, BLOCK_SIZE * 3.5, BLOCK_SIZE * 0.5 }, + { 2784, 672, BLOCK_SIZE * 0.25, BLOCK_SIZE * 0.875 }, + { 2752, 704, BLOCK_SIZE * 0.25, BLOCK_SIZE * 0.625 }, + { 2720, 720, BLOCK_SIZE * 0.25, BLOCK_SIZE * 0.5 }, + { 2688, 736, BLOCK_SIZE * 0.25, BLOCK_SIZE * 0.375 }, + { 2656, 752, BLOCK_SIZE * 0.25, BLOCK_SIZE * 0.25 }, + { 2592, 768, BLOCK_SIZE * 0.5, BLOCK_SIZE * 0.125 }, + { 2720, 944, BLOCK_SIZE * 0.75, BLOCK_SIZE * 0.25 }, + { 2624, 1056, BLOCK_SIZE * 0.25, BLOCK_SIZE * 0.125 }, + { 2656, 1056, BLOCK_SIZE * 0.25, BLOCK_SIZE * 0.125 }, + { 3040, 688, BLOCK_SIZE * 2, BLOCK_SIZE * 0.375 }, + { 2880, 528, BLOCK_SIZE * 1, BLOCK_SIZE * 0.5 }, + { 2856, -136, BLOCK_SIZE * 0.1875, BLOCK_SIZE * 3.0625 }, + { 2368, -128, BLOCK_SIZE * 0.1875, BLOCK_SIZE * 3 }, + { 1800, -128, BLOCK_SIZE * 0.1875, BLOCK_SIZE * 2.125 }, + { 1184, -136, BLOCK_SIZE * 0.1875, BLOCK_SIZE * 2.1875 }, + { 2624, 880, BLOCK_SIZE * 0.25, BLOCK_SIZE * 0.25 }, + { 2592, 752, BLOCK_SIZE * 0.25, BLOCK_SIZE * 0.25 }, + { 2784, 1104, BLOCK_SIZE * 0.25, BLOCK_SIZE * 0.75 }, + { 2624, 1168, BLOCK_SIZE * 0.25, BLOCK_SIZE * 0.25 }, + { 2656, 1190, BLOCK_SIZE * 1, BLOCK_SIZE * 0.078125 }, + { 1760, 656, BLOCK_SIZE * 0.25, BLOCK_SIZE * 0.25 }, + { 1472, 352, BLOCK_SIZE * 0.25, BLOCK_SIZE * 0.5 }, + { -32, -8, BLOCK_SIZE * 0.25, BLOCK_SIZE * 10.6875 }, + { 3296, -5, BLOCK_SIZE * 0.25, BLOCK_SIZE * 10.6640625 }, +}; + +Zone room_dotdotdot[] = +{ + { -24, -83, BLOCK_SIZE * 38.3125, BLOCK_SIZE * 0.6484375 }, + { -48, 0, BLOCK_SIZE * 0.375, BLOCK_SIZE * 10.828125 }, + { 4544, 0, BLOCK_SIZE * 0.375, BLOCK_SIZE * 14.75 }, + { 0, 608, BLOCK_SIZE * 5.3125, BLOCK_SIZE * 10 }, + { 680, 928, BLOCK_SIZE * 10.0625, BLOCK_SIZE * 7.5 }, + { 1968, 1440, BLOCK_SIZE * 9.25, BLOCK_SIZE * 3.5 }, + { 3264, 1552, BLOCK_SIZE * 0.5, BLOCK_SIZE * 1.75 }, + { 3152, 1776, BLOCK_SIZE * 10.25, BLOCK_SIZE * 0.9375 }, + { 3808, 1696, BLOCK_SIZE * 0.75, BLOCK_SIZE * 0.875 }, + { 4128, 1696, BLOCK_SIZE * 0.75, BLOCK_SIZE * 0.875 }, + { 4448, 1696, BLOCK_SIZE * 0.75, BLOCK_SIZE * 1.5625 }, + { 3968, 1616, BLOCK_SIZE * 0.75, BLOCK_SIZE * 0.625 }, + { 4288, 1616, BLOCK_SIZE * 0.75, BLOCK_SIZE * 0.625 }, + { 3808, 1504, BLOCK_SIZE * 5, BLOCK_SIZE * 0.875 }, + { 3680, 1376, BLOCK_SIZE * 1, BLOCK_SIZE * 1.875 }, + { 3104, 1184, BLOCK_SIZE * 3.5, BLOCK_SIZE * 0.75 }, + { 2976, 992, BLOCK_SIZE * 4.5, BLOCK_SIZE * 0.75 }, + { 3552, 992, BLOCK_SIZE * 2, BLOCK_SIZE * 2.25 }, + { 3808, 992, BLOCK_SIZE * 5.75, BLOCK_SIZE * 1.5 }, + { 2912, 992, BLOCK_SIZE * 0.5, BLOCK_SIZE * 0.5 }, + { 2848, 928, BLOCK_SIZE * 0.5, BLOCK_SIZE * 0.75 }, + { 2240, 928, BLOCK_SIZE * 4.75, BLOCK_SIZE * 0.5 }, + { 1176, 480, BLOCK_SIZE * 5.5625, BLOCK_SIZE * 1 }, + { 1040, 608, BLOCK_SIZE * 4.625, BLOCK_SIZE * 0.375 }, + { 1472, 768, BLOCK_SIZE * 2.25, BLOCK_SIZE * 0.5 }, + { 1632, 560, BLOCK_SIZE * 1.5, BLOCK_SIZE * 1.625 }, + { 1760, 768, BLOCK_SIZE * 0.25, BLOCK_SIZE * 0.25 }, + { 1824, 560, BLOCK_SIZE * 5.25, BLOCK_SIZE * 1.125 }, + { 1824, 704, BLOCK_SIZE * 0.25, BLOCK_SIZE * 0.25 }, + { 2384, 320, BLOCK_SIZE * 0.875, BLOCK_SIZE * 1.875 }, + { 1520, 368, BLOCK_SIZE * 1.375, BLOCK_SIZE * 0.875 }, + { 960, 0, BLOCK_SIZE * 4.5, BLOCK_SIZE * 2 }, + { 1536, 0, BLOCK_SIZE * 3.75, BLOCK_SIZE * 1.25 }, + { 2496, 320, BLOCK_SIZE * 2.5000002, BLOCK_SIZE * 2 }, + { 2496, 576, BLOCK_SIZE * 0.25, BLOCK_SIZE * 0.5 }, + { 2528, 576, BLOCK_SIZE * 0.25, BLOCK_SIZE * 0.25 }, + { 2976, 144, BLOCK_SIZE * 1, BLOCK_SIZE * 1.3750001 }, + { 2816, 480, BLOCK_SIZE * 1, BLOCK_SIZE * 0.75 }, + { 2816, 320, BLOCK_SIZE * 5.875, BLOCK_SIZE * 1.25 }, + { 3520, 144, BLOCK_SIZE * 1.125, BLOCK_SIZE * 1.375 }, + { 3840, 320, BLOCK_SIZE * 1.75, BLOCK_SIZE * 1.25 }, + { 3568, 320, BLOCK_SIZE * 2.125, BLOCK_SIZE * 1.25 }, + { 4064, 384, BLOCK_SIZE * 1.75, BLOCK_SIZE * 0.75 }, + { 4288, 320, BLOCK_SIZE * 1, BLOCK_SIZE * 1.25 }, + { 4256, 608, BLOCK_SIZE * 1.5, BLOCK_SIZE * 1 }, + { 3968, 608, BLOCK_SIZE * 1.5, BLOCK_SIZE * 1 }, + { 4160, 672, BLOCK_SIZE * 0.75, BLOCK_SIZE * 0.5 }, + { 3840, 864, BLOCK_SIZE * 5.5, BLOCK_SIZE * 1 }, + { 3680, 672, BLOCK_SIZE * 1.25, BLOCK_SIZE * 2.5 }, + { 3072, 864, BLOCK_SIZE * 4.75, BLOCK_SIZE * 1 }, + { 3456, 672, BLOCK_SIZE * 1.75, BLOCK_SIZE * 0.5 }, + { 2928, 672, BLOCK_SIZE * 2.875, BLOCK_SIZE * 0.5 }, + { 3616, 736, BLOCK_SIZE * 0.5, BLOCK_SIZE * 0.5 }, + { 2880, 736, BLOCK_SIZE * 1.5, BLOCK_SIZE * 1.9999998 }, + { 2640, 736, BLOCK_SIZE * 1.875, BLOCK_SIZE * 1.5 }, + { 2480, 800, BLOCK_SIZE * 1.25, BLOCK_SIZE * 1 }, + { 3264, 144, BLOCK_SIZE * 0.75, BLOCK_SIZE * 0.25 }, + { 1888, 486, BLOCK_SIZE * 0.375, BLOCK_SIZE * 0.578125 }, + { 2176, 896, BLOCK_SIZE * 1.6874999, BLOCK_SIZE * 0.25 }, + { 960, 640, BLOCK_SIZE * 0.625, BLOCK_SIZE * 0.5 }, + { 1056, 656, BLOCK_SIZE * 0.75, BLOCK_SIZE * 1.125 }, + { 992, 704, BLOCK_SIZE * 0.5, BLOCK_SIZE * 0.25 }, + { 1024, 736, BLOCK_SIZE * 0.25, BLOCK_SIZE * 0.25 }, + { 1040, 656, BLOCK_SIZE * 0.125, BLOCK_SIZE * 0.375 }, + { 1856, 704, BLOCK_SIZE * 3.75, BLOCK_SIZE * 0.5 }, + { 1824, 736, BLOCK_SIZE * 0.25, BLOCK_SIZE * 0.25 }, + { 2336, 704, BLOCK_SIZE * 0.25, BLOCK_SIZE * 0.25 }, + { 2272, 992, BLOCK_SIZE * 4.5, BLOCK_SIZE * 0.25 }, + { 2304, 1024, BLOCK_SIZE * 4.75, BLOCK_SIZE * 0.25 }, + { 2328, 1056, BLOCK_SIZE * 5.0625, BLOCK_SIZE * 0.25 }, + { 2368, 1088, BLOCK_SIZE * 1.5, BLOCK_SIZE * 0.25 }, + { 2400, 1120, BLOCK_SIZE * 1.25, BLOCK_SIZE * 0.25 }, + { 2432, 1152, BLOCK_SIZE * 1, BLOCK_SIZE * 0.25 }, + { 2464, 1184, BLOCK_SIZE * 0.75, BLOCK_SIZE * 0.25 }, + { 2496, 1216, BLOCK_SIZE * 0.5, BLOCK_SIZE * 0.25 }, + { 3232, 1280, BLOCK_SIZE * 1.75, BLOCK_SIZE * 0.25 }, + { 3264, 1312, BLOCK_SIZE * 1.5, BLOCK_SIZE * 0.25 }, + { 3296, 1344, BLOCK_SIZE * 1.25, BLOCK_SIZE * 0.25 }, + { 3328, 1376, BLOCK_SIZE * 1, BLOCK_SIZE * 0.25 }, + { 680, 776, BLOCK_SIZE * 1.25, BLOCK_SIZE * 1.1875 }, + { 1968, 1224, BLOCK_SIZE * 2.1875, BLOCK_SIZE * 1.6875 }, + { 3152, 1552, BLOCK_SIZE * 0.875, BLOCK_SIZE * 1.75 }, + { 3328, 1672, BLOCK_SIZE * 0.875, BLOCK_SIZE * 0.8125 }, + { 1424, 424, BLOCK_SIZE * 0.7499999, BLOCK_SIZE * 0.4375 }, + { 1696, 424, BLOCK_SIZE * 0.81249994, BLOCK_SIZE * 0.4375 }, + { 2912, 216, BLOCK_SIZE * 0.5, BLOCK_SIZE * 0.8125001 }, + { 3664, 232, BLOCK_SIZE * 0.625, BLOCK_SIZE * 0.6875 }, + { 2392, 896, BLOCK_SIZE * 0.6875, BLOCK_SIZE * 0.25 }, + { 2432, 856, BLOCK_SIZE * 0.375, BLOCK_SIZE * 0.3125 }, +}; + +Zone room_fartzone[] = +{ + { -40, 0, BLOCK_SIZE * 0.3125, BLOCK_SIZE * 21.375 }, + { 2944, 0, BLOCK_SIZE * 0.3125, BLOCK_SIZE * 21.375 }, +}; + +Zone room_greenhill[] = +{ + { -4, 676, BLOCK_SIZE * 2.90625, BLOCK_SIZE * 1.34375 }, + { 368, 704, BLOCK_SIZE * 1, BLOCK_SIZE * 1.125 }, + { 496, 644, BLOCK_SIZE * 2.1875, BLOCK_SIZE * 1.59375 }, + { 776, 580, BLOCK_SIZE * 0.4375, BLOCK_SIZE * 2.09375 }, + { 832, 532, BLOCK_SIZE * 3.53125, BLOCK_SIZE * 2.46875 }, + { 1280, 456, BLOCK_SIZE * 2, BLOCK_SIZE * 3.0625 }, + { 1536, 580, BLOCK_SIZE * 0.53125, BLOCK_SIZE * 2.09375 }, + { 1604, 704, BLOCK_SIZE * 0.96875, BLOCK_SIZE * 1.125 }, + { 1728, 644, BLOCK_SIZE * 1.03125, BLOCK_SIZE * 1.5625 }, + { 2000, 712, BLOCK_SIZE * 0.5625, BLOCK_SIZE * 1.03125 }, + { 2216, 644, BLOCK_SIZE * 1.34375, BLOCK_SIZE * 1.5625 }, + { 2512, 708, BLOCK_SIZE * 0.65625, BLOCK_SIZE * 0.40625 }, + { 2732, 644, BLOCK_SIZE * 1.4062501, BLOCK_SIZE * 1.5625 }, + { 2912, 612, BLOCK_SIZE * 0.5000001, BLOCK_SIZE * 1.8125 }, + { 2976, 580, BLOCK_SIZE * 0.7500001, BLOCK_SIZE * 2.0625 }, + { 3072, 436, BLOCK_SIZE * 2.0625, BLOCK_SIZE * 3.1875 }, + { 3544, 447, BLOCK_SIZE * 0.5625001, BLOCK_SIZE * 0.2265625 }, + { 3544, 476, BLOCK_SIZE * 0.3125, BLOCK_SIZE * 2.875 }, + { 3766, 648, BLOCK_SIZE * 1.203125, BLOCK_SIZE * 1.53125 }, + { 4052, 708, BLOCK_SIZE * 2.2812498, BLOCK_SIZE * 1.0625 }, + { 4876, 644, BLOCK_SIZE * 0.90625, BLOCK_SIZE * 1.5625 }, + { 4992, 612, BLOCK_SIZE * 0.5, BLOCK_SIZE * 1.8125 }, + { 5056, 580, BLOCK_SIZE * 1, BLOCK_SIZE * 2.0625 }, + { 5184, 528, BLOCK_SIZE * 0.3125, BLOCK_SIZE * 2.46875 }, + { 5632, 584, BLOCK_SIZE * 0.53125, BLOCK_SIZE * 2.03125 }, + { 5832, 648, BLOCK_SIZE * 0.875, BLOCK_SIZE * 1.53125 }, + { 6348, 712, BLOCK_SIZE * 3.15625, BLOCK_SIZE * 1.03125 }, + { 6752, 676, BLOCK_SIZE * 0.75, BLOCK_SIZE * 1.3125 }, + { 6848, 648, BLOCK_SIZE * 0.84375, BLOCK_SIZE * 1.53125 }, + { 7632, 710, BLOCK_SIZE * 1.15625, BLOCK_SIZE * 1.046875 }, + { 7776, 676, BLOCK_SIZE * 0.74999994, BLOCK_SIZE * 1.3125 }, + { 7872, 644, BLOCK_SIZE * 0.5, BLOCK_SIZE * 1.5625 }, + { 7936, 580, BLOCK_SIZE * 0.5, BLOCK_SIZE * 2.0625 }, + { 5384, 497, BLOCK_SIZE * 0.3046875, BLOCK_SIZE * 0.3046875 }, + { 6973, 245, BLOCK_SIZE * 0.3046875, BLOCK_SIZE * 0.2734375 }, + { 2220, 614, BLOCK_SIZE * 0.3046875, BLOCK_SIZE * 0.2734375 }, + { 3336, 390, BLOCK_SIZE * 0.40625, BLOCK_SIZE * 0.765625 }, + { 7090, 648, BLOCK_SIZE * 0.953125, BLOCK_SIZE * 1.5390625 }, + { 7346, 648, BLOCK_SIZE * 0.98437494, BLOCK_SIZE * 1.5390625 }, + { 8144, 536, BLOCK_SIZE * 0.375, BLOCK_SIZE * 2.40625 }, + { 8000, 536, BLOCK_SIZE * 0.09375, BLOCK_SIZE * 2.40625 }, + { 6144, 712, BLOCK_SIZE * 0.5625, BLOCK_SIZE * 1.03125 }, + { 6068, 648, BLOCK_SIZE * 0.59375, BLOCK_SIZE * 1.53125 }, + { 3584, 648, BLOCK_SIZE * 0.375, BLOCK_SIZE * 1.53125 }, + { 4476, 708, BLOCK_SIZE * 1.0312498, BLOCK_SIZE * 1.0625 }, + { 4608, 696, BLOCK_SIZE * 0.12499976, BLOCK_SIZE * 0.1875 }, + { 5568, 536, BLOCK_SIZE * 0.5, BLOCK_SIZE * 2.40625 }, + { 7402, 276, BLOCK_SIZE * 0.171875, BLOCK_SIZE * 0.4296875 }, + { 7040, 328, BLOCK_SIZE * 1.5, BLOCK_SIZE * 0.125 }, + { 6656, 276, BLOCK_SIZE * 3.03125, BLOCK_SIZE * 0.40625 }, + { 6144, 276, BLOCK_SIZE * 0.3125, BLOCK_SIZE * 0.5 }, + { 6080, 340, BLOCK_SIZE * 0.28125, BLOCK_SIZE * 0.25 }, + { 6016, 372, BLOCK_SIZE * 0.28125, BLOCK_SIZE * 0.25 }, + { 8192, -572, BLOCK_SIZE * 0.28125, BLOCK_SIZE * 12.46875 }, + { -36, -472, BLOCK_SIZE * 0.28125, BLOCK_SIZE * 11.6875 }, + { 6080, 324, BLOCK_SIZE * 0.5, BLOCK_SIZE * 0.125 }, + { 6016, 356, BLOCK_SIZE * 0.5, BLOCK_SIZE * 0.125 }, + { 7384, 0, BLOCK_SIZE * 0.8125, BLOCK_SIZE * 1.125 }, + { 0.4621582, -20, BLOCK_SIZE * 64, BLOCK_SIZE * 0.15625 }, + { 3336, 488, BLOCK_SIZE * 1.625, BLOCK_SIZE * 2.78125 }, + { 3632, 660, BLOCK_SIZE * 1.046875, BLOCK_SIZE * 1.4375 }, + { 4344, 716, BLOCK_SIZE * 1.0312498, BLOCK_SIZE * 1 }, +}; + +Zone room_haundream[] = +{ + { 1916, 1120, BLOCK_SIZE * 0.59375, BLOCK_SIZE * 0.21875 }, + { 3208, 1340, BLOCK_SIZE * 0.4375, BLOCK_SIZE * 0.53125 }, + { 3809, 105, BLOCK_SIZE * 0.234375, BLOCK_SIZE * 0.4375 }, + { 65, 1560, BLOCK_SIZE * 0.234375, BLOCK_SIZE * 0.4375 }, + { 4096, 0, BLOCK_SIZE * 0.5, BLOCK_SIZE * 6.1875 }, + { -72, -56, BLOCK_SIZE * 0.5625, BLOCK_SIZE * 7 }, + { 0, -56, BLOCK_SIZE * 32.5, BLOCK_SIZE * 0.4375 }, +}; + +Zone room_hideandseek2[] = +{ + { 0, 0, BLOCK_SIZE * 2.5000002, BLOCK_SIZE * 6.5 }, + { 320.99994, 3.0596588E-05, BLOCK_SIZE * 9, BLOCK_SIZE * 1.5 }, + { 1472, 0, BLOCK_SIZE * 13.0078125, BLOCK_SIZE * 3.5 }, + { 3136, 0, BLOCK_SIZE * 11.5078125, BLOCK_SIZE * 1.5 }, + { 896.00104, 704, BLOCK_SIZE * 8.5, BLOCK_SIZE * 3.0000002 }, + { 192.00003, 960.0663, BLOCK_SIZE * 5.0078125, BLOCK_SIZE * 2 }, + { 768, 832, BLOCK_SIZE * 1, BLOCK_SIZE * 2 }, + { 959.99994, 1216, BLOCK_SIZE * 4.0078125, BLOCK_SIZE * 2 }, + { 0, 1344, BLOCK_SIZE * 2.5, BLOCK_SIZE * 2.5 }, + { 320, 1408, BLOCK_SIZE * 1, BLOCK_SIZE * 2 }, + { 448.8846, 1472, BLOCK_SIZE * 22.999996, BLOCK_SIZE * 1.5 }, + { 3008, 1088, BLOCK_SIZE * 3, BLOCK_SIZE * 3 }, + { 3392, 1344, BLOCK_SIZE * 3.4921875, BLOCK_SIZE * 2.5 }, + { 2688, 1344.8607, BLOCK_SIZE * 2.5, BLOCK_SIZE * 1 }, + { 3839.9995, 1344, BLOCK_SIZE * 6.0078125, BLOCK_SIZE * 2.5 }, + { 2368, 704, BLOCK_SIZE * 4.0078125, BLOCK_SIZE * 3 }, + { 2944.001, 576.9337, BLOCK_SIZE * 1.5078125, BLOCK_SIZE * 2.9921875 }, + { 2881.1326, 704.99994, BLOCK_SIZE * 0.4921875, BLOCK_SIZE * 1.9921875 }, + { 3776, 832, BLOCK_SIZE * 0.9921875, BLOCK_SIZE * 2 }, + { 3903.9993, 832, BLOCK_SIZE * 5.5078125, BLOCK_SIZE * 2 }, + { 4095.9998, 704, BLOCK_SIZE * 4, BLOCK_SIZE * 1 }, + { 4480, 576, BLOCK_SIZE * 1, BLOCK_SIZE * 1 }, + { 832, 384, BLOCK_SIZE * 3, BLOCK_SIZE * 1.5 }, + { 960, 320.99997, BLOCK_SIZE * 2, BLOCK_SIZE * 0.5 }, + { 760, 448, BLOCK_SIZE * 0.5625, BLOCK_SIZE * 0.5 }, + { 3167, 1024, BLOCK_SIZE * 0.546875, BLOCK_SIZE * 0.5 }, + { 4466, 1280, BLOCK_SIZE * 1.109375, BLOCK_SIZE * 0.5 }, + { 696, 896, BLOCK_SIZE * 0.5625, BLOCK_SIZE * 0.5 }, + { -48, 0, BLOCK_SIZE * 0.375, BLOCK_SIZE * 12.953125 }, + { 4608, 8, BLOCK_SIZE * 0.375, BLOCK_SIZE * 12.953125 }, + { 2624, 1088, BLOCK_SIZE * 2.0078125, BLOCK_SIZE * 1 }, + { 1472, 448, BLOCK_SIZE * 4.0078125, BLOCK_SIZE * 1 }, + { 576, 1216, BLOCK_SIZE * 2.0078125, BLOCK_SIZE * 1 }, + { 2816, 640, BLOCK_SIZE * 1, BLOCK_SIZE * 0.5 }, + { 2888, 608, BLOCK_SIZE * 0.4375, BLOCK_SIZE * 0.25 }, + { 2760, 672, BLOCK_SIZE * 0.4375, BLOCK_SIZE * 0.25 }, + { 2504, 1440, BLOCK_SIZE * 0.4375, BLOCK_SIZE * 0.25 }, + { 2560, 1408, BLOCK_SIZE * 1, BLOCK_SIZE * 0.5 }, + { 2632, 1376, BLOCK_SIZE * 0.4375, BLOCK_SIZE * 0.25 }, + { 3912, 800, BLOCK_SIZE * 0.4375, BLOCK_SIZE * 0.25 }, + { 3968, 768, BLOCK_SIZE * 1, BLOCK_SIZE * 0.5 }, + { 4040, 736, BLOCK_SIZE * 0.4375, BLOCK_SIZE * 0.25 }, + { 4296, 672, BLOCK_SIZE * 0.4375, BLOCK_SIZE * 0.25 }, + { 4352, 640, BLOCK_SIZE * 1, BLOCK_SIZE * 0.5 }, + { 4424, 608, BLOCK_SIZE * 0.4375, BLOCK_SIZE * 0.25 }, +}; + +Zone room_kindandfair[] = +{ + { 384, 4, BLOCK_SIZE * 1, BLOCK_SIZE * 6.46875 }, + { 512, 760, BLOCK_SIZE * 1, BLOCK_SIZE * 0.5625 }, + { 768, 832, BLOCK_SIZE * 1, BLOCK_SIZE * 1.5625 }, + { 480, 952, BLOCK_SIZE * 2.25, BLOCK_SIZE * 0.625 }, + { 0, 1024, BLOCK_SIZE * 2.5, BLOCK_SIZE * 4.03125 }, + { 320, 1088, BLOCK_SIZE * 0.5, BLOCK_SIZE * 3.53125 }, + { 384, 1152, BLOCK_SIZE * 3.0000002, BLOCK_SIZE * 3.03125 }, + { 768, 1280, BLOCK_SIZE * 2.5078125, BLOCK_SIZE * 1 }, + { 1471, 1280, BLOCK_SIZE * 1.0078125, BLOCK_SIZE * 1 }, + { 1600, 1344, BLOCK_SIZE * 0.5, BLOCK_SIZE * 0.5 }, + { 768, 1408, BLOCK_SIZE * 12, BLOCK_SIZE * 1.03125 }, + { 2304, 1344, BLOCK_SIZE * 0.5, BLOCK_SIZE * 1.53125 }, + { 2368, 1408, BLOCK_SIZE * 6.5, BLOCK_SIZE * 1.03125 }, + { 3200, 1264, BLOCK_SIZE * 3, BLOCK_SIZE * 2.15625 }, + { 2304, 1088, BLOCK_SIZE * 2, BLOCK_SIZE * 1.5 }, + { 2559.9375, 1088, BLOCK_SIZE * 1.5, BLOCK_SIZE * 1.5 }, + { 2948, 960, BLOCK_SIZE * 1.96875, BLOCK_SIZE * 1 }, + { 3200, 640, BLOCK_SIZE * 7, BLOCK_SIZE * 3.5 }, + { 4224, 0, BLOCK_SIZE * 1, BLOCK_SIZE * 12.03125 }, + { 896, 960, BLOCK_SIZE * 3.75, BLOCK_SIZE * 0.5625 }, + { 1152, 520, BLOCK_SIZE * 3, BLOCK_SIZE * 2.3125 }, + { 1536, 688, BLOCK_SIZE * 3, BLOCK_SIZE * 1 }, + { 1920, 560, BLOCK_SIZE * 3, BLOCK_SIZE * 2 }, + { 2304, 560, BLOCK_SIZE * 1, BLOCK_SIZE * 1.5625 }, + { 2432, 560, BLOCK_SIZE * 4, BLOCK_SIZE * 1 }, + { 1968, 1152, BLOCK_SIZE * 1.25, BLOCK_SIZE * 1.0625 }, + { 1776, 1216, BLOCK_SIZE * 1.5, BLOCK_SIZE * 0.5625 }, + { 1536, 528, BLOCK_SIZE * 0.24999997, BLOCK_SIZE * 0.0625 }, + { 384, 1088, BLOCK_SIZE * 0.24999997, BLOCK_SIZE * 0.0625 }, + { 2272, 1088, BLOCK_SIZE * 0.25, BLOCK_SIZE * 0.0625 }, + { 2272, 1344, BLOCK_SIZE * 0.25, BLOCK_SIZE * 0.0625 }, + { 3168, 640, BLOCK_SIZE * 0.25, BLOCK_SIZE * 0.0625 }, + { 4196, 0, BLOCK_SIZE * 0.21875, BLOCK_SIZE * 10.046875 }, + { 384, 1096, BLOCK_SIZE * 0.24218747, BLOCK_SIZE * 0.4375 }, + { 2273, 1352, BLOCK_SIZE * 0.24218749, BLOCK_SIZE * 0.4375 }, + { 1536, 536, BLOCK_SIZE * 0.24218749, BLOCK_SIZE * 1.1875 }, + { 3169, 648, BLOCK_SIZE * 0.24218749, BLOCK_SIZE * 2.4374998 }, + { 2273, 1096, BLOCK_SIZE * 0.24218749, BLOCK_SIZE * 1.375 }, + { 2273, 1272, BLOCK_SIZE * 0.2421875, BLOCK_SIZE * 0.0625 }, + { 1248, 1408, BLOCK_SIZE * 0.5078125, BLOCK_SIZE * 0.09375 }, + { -19, 0.9961548, BLOCK_SIZE * 0.1484375, BLOCK_SIZE * 8.1875 }, + { 2688, 496, BLOCK_SIZE * 1, BLOCK_SIZE * 0.5 }, + { 2657, 504, BLOCK_SIZE * 0.23437499, BLOCK_SIZE * 0.4375 }, + { 2656, 496, BLOCK_SIZE * 0.24999997, BLOCK_SIZE * 0.0625 }, + { 3584, 1408, BLOCK_SIZE * 2.4375, BLOCK_SIZE * 1.03125 }, + { 3896, 1280, BLOCK_SIZE * 2.5625, BLOCK_SIZE * 2.03125 }, + { 2961, 1192, BLOCK_SIZE * 1, BLOCK_SIZE * 0.5625 }, + { 2431, 688, BLOCK_SIZE * 0.24218747, BLOCK_SIZE * 0.5 }, + { 768, 1224, BLOCK_SIZE * 1.1015625, BLOCK_SIZE * 0.4375 }, + { 768, 1200, BLOCK_SIZE * 0.7265625, BLOCK_SIZE * 0.1875 }, + { 908, 1264, BLOCK_SIZE * 0.65625, BLOCK_SIZE * 0.125 }, + { 768, 1184, BLOCK_SIZE * 0.5, BLOCK_SIZE * 0.125 }, + { 1783, 628, BLOCK_SIZE * 1.0703125, BLOCK_SIZE * 0.46875 }, + { 1848, 596, BLOCK_SIZE * 0.5703125, BLOCK_SIZE * 0.25 }, + { 1720, 660, BLOCK_SIZE * 0.5, BLOCK_SIZE * 0.21875 }, + { 2587, 1028, BLOCK_SIZE * 1.0703125, BLOCK_SIZE * 0.46875 }, + { 2652, 996, BLOCK_SIZE * 0.5703125, BLOCK_SIZE * 0.25 }, + { 2524, 1060, BLOCK_SIZE * 0.5, BLOCK_SIZE * 0.21875 }, + { 2752, 1060, BLOCK_SIZE * 1.53125, BLOCK_SIZE * 0.21875 }, +}; + +Zone room_limpcity[] = +{ + { 48, 440, BLOCK_SIZE * 1.125, BLOCK_SIZE * 1 }, + { 320, 376, BLOCK_SIZE * 1.125, BLOCK_SIZE * 1.5 }, + { 592, 440, BLOCK_SIZE * 1.125, BLOCK_SIZE * 0.78125 }, + { 736, 376, BLOCK_SIZE * 1.625, BLOCK_SIZE * 1.28125 }, + { 944, 440, BLOCK_SIZE * 0.515625, BLOCK_SIZE * 0.78125 }, + { 1136, 504, BLOCK_SIZE * 1.125, BLOCK_SIZE * 0.5 }, + { 1728, 376, BLOCK_SIZE * 1.53125, BLOCK_SIZE * 1.28125 }, + { 1408, 504, BLOCK_SIZE * 8.5, BLOCK_SIZE * 0.5 }, + { 2568, 528, BLOCK_SIZE * 1.625, BLOCK_SIZE * 0.5 }, + { 2912, 528, BLOCK_SIZE * 1.625, BLOCK_SIZE * 0.5 }, + { 3096, 704, BLOCK_SIZE * 1.625, BLOCK_SIZE * 1 }, + { 3392, 768, BLOCK_SIZE * 1, BLOCK_SIZE * 2 }, + { 3260, 1024, BLOCK_SIZE * 2.03125, BLOCK_SIZE * 2.875 }, + { 2944, 1088, BLOCK_SIZE * 2.46875, BLOCK_SIZE * 2.375 }, + { 1156, 1152, BLOCK_SIZE * 13.96875, BLOCK_SIZE * 1.875 }, + { 1024, 960, BLOCK_SIZE * 1.03125, BLOCK_SIZE * 2.5 }, + { 256, 1280, BLOCK_SIZE * 7.03125, BLOCK_SIZE * 0.875 }, + { 0, 832, BLOCK_SIZE * 2, BLOCK_SIZE * 4.375 }, + { 360, 832, BLOCK_SIZE * 2, BLOCK_SIZE * 2 }, + { 872, 960, BLOCK_SIZE * 0.5, BLOCK_SIZE * 1 }, + { 736, 760, BLOCK_SIZE * 2, BLOCK_SIZE * 0.5 }, + { 1088, 776, BLOCK_SIZE * 2.5, BLOCK_SIZE * 0.5 }, + { 1280, 712, BLOCK_SIZE * 1, BLOCK_SIZE * 0.5 }, + { 1896, 872, BLOCK_SIZE * 4.6875, BLOCK_SIZE * 0.5 }, + { 2024, 936, BLOCK_SIZE * 4.5, BLOCK_SIZE * 1 }, + { 2536, 744, BLOCK_SIZE * 3.625, BLOCK_SIZE * 1 }, + { 2496, 756, BLOCK_SIZE * 0.3125, BLOCK_SIZE * 1.40625 }, + { 1032, 312, BLOCK_SIZE * 4, BLOCK_SIZE * 0.5 }, + { 592, 540, BLOCK_SIZE * 4.2499995, BLOCK_SIZE * 0.21875 }, + { 616, 960, BLOCK_SIZE * 2, BLOCK_SIZE * 1 }, + { -19, 0, BLOCK_SIZE * 0.1484375, BLOCK_SIZE * 6.6249995 }, + { 3520, -76, BLOCK_SIZE * 0.1484375, BLOCK_SIZE * 6.6249995 }, + { 616, 900, BLOCK_SIZE * 1.03125, BLOCK_SIZE * 0.46875 }, + { 1156, 1080, BLOCK_SIZE * 3.71875, BLOCK_SIZE * 0.5625 }, + { 1156, 1008, BLOCK_SIZE * 1.4375, BLOCK_SIZE * 0.5625 }, + { 1340, 1056, BLOCK_SIZE * 1.4375, BLOCK_SIZE * 0.1875 }, + { 1632, 1128, BLOCK_SIZE * 1.4375, BLOCK_SIZE * 0.1875 }, + { 2236, 820, BLOCK_SIZE * 2.03125, BLOCK_SIZE * 0.40625 }, + { 1604, 440, BLOCK_SIZE * 0.96875, BLOCK_SIZE * 0.49999997 }, + { 1924, 440, BLOCK_SIZE * 1.90625, BLOCK_SIZE * 0.49999997 }, + { 1540, 472, BLOCK_SIZE * 0.5, BLOCK_SIZE * 0.24999997 }, + { 1664, 408, BLOCK_SIZE * 0.5, BLOCK_SIZE * 0.24999997 }, + { 1924, 404, BLOCK_SIZE * 0.8125, BLOCK_SIZE * 0.28124997 }, + { 2168, 468, BLOCK_SIZE * 0.8125, BLOCK_SIZE * 0.28124997 }, + { 1010, 504, BLOCK_SIZE * 0.984375, BLOCK_SIZE * 0.28124997 }, + { 1010, 480, BLOCK_SIZE * 0.609375, BLOCK_SIZE * 0.18749997 }, + { 1010, 468, BLOCK_SIZE * 0.421875, BLOCK_SIZE * 0.09374997 }, + { 1088, 496, BLOCK_SIZE * 0.265625, BLOCK_SIZE * 0.06249997 }, + { 1010, 460, BLOCK_SIZE * 0.296875, BLOCK_SIZE * 0.06249997 }, + { 464, 440, BLOCK_SIZE * 1, BLOCK_SIZE * 0.99999994 }, + { 192, 440, BLOCK_SIZE * 1, BLOCK_SIZE * 0.99999994 }, + { 248, 412, BLOCK_SIZE * 0.5625, BLOCK_SIZE * 0.21874994 }, + { 464, 412, BLOCK_SIZE * 0.5625, BLOCK_SIZE * 0.21874994 }, +}; + +Zone room_majongforest[] = +{ + { 0, 224, BLOCK_SIZE * 6.1875, BLOCK_SIZE * 1 }, + { 928, 288, BLOCK_SIZE * 2.25, BLOCK_SIZE * 1.5 }, + { 1216, 352.78885, BLOCK_SIZE * 1.25, BLOCK_SIZE * 1 }, + { 1728, 334, BLOCK_SIZE * 1.5, BLOCK_SIZE * 0.765625 }, + { 1984, 270, BLOCK_SIZE * 2.5, BLOCK_SIZE * 0.78124994 }, + { 2464, 224, BLOCK_SIZE * 1.5, BLOCK_SIZE * 1 }, + { 2912, 224, BLOCK_SIZE * 5.75, BLOCK_SIZE * 1 }, + { 2912, 736, BLOCK_SIZE * 5.8125, BLOCK_SIZE * 1.5 }, + { 2656, 672, BLOCK_SIZE * 1.5, BLOCK_SIZE * 2.53125 }, + { 0, 736, BLOCK_SIZE * 5.765625, BLOCK_SIZE * 1.5 }, + { 738, 736, BLOCK_SIZE * 2.484375, BLOCK_SIZE * 1.5 }, + { 2048, 846, BLOCK_SIZE * 1.5, BLOCK_SIZE * 0.7421875 }, +}; + +Zone room_marijuna[] = +{ + { 0, 512, BLOCK_SIZE * 2, BLOCK_SIZE * 2 }, + { -72, 1088, BLOCK_SIZE * 4.5625, BLOCK_SIZE * 2.5 }, + { 768, 1088, BLOCK_SIZE * 4.0625, BLOCK_SIZE * 2.5 }, + { 1536, 992, BLOCK_SIZE * 2, BLOCK_SIZE * 2.25 }, + { 1792, 1024, BLOCK_SIZE * 2, BLOCK_SIZE * 2 }, + { 2048, 992, BLOCK_SIZE * 2, BLOCK_SIZE * 2.25 }, + { 2304, 864, BLOCK_SIZE * 4, BLOCK_SIZE * 3.25 }, + { 2816, 992, BLOCK_SIZE * 4, BLOCK_SIZE * 2.25 }, + { 3840, 992, BLOCK_SIZE * 2, BLOCK_SIZE * 7.75 }, + { 2944, 1552, BLOCK_SIZE * 2, BLOCK_SIZE * 3.375 }, + { 3200, 1472, BLOCK_SIZE * 5, BLOCK_SIZE * 4 }, + { 2432, 1792, BLOCK_SIZE * 4, BLOCK_SIZE * 1.5 }, + { 1472, 1808, BLOCK_SIZE * 7.5, BLOCK_SIZE * 1.375 }, + { 1216, 1728, BLOCK_SIZE * 2, BLOCK_SIZE * 2 }, + { 832, 1680, BLOCK_SIZE * 2, BLOCK_SIZE * 2.375 }, + { 1088, 1752, BLOCK_SIZE * 1, BLOCK_SIZE * 1.8125 }, + { 448, 512, BLOCK_SIZE * 2.6875, BLOCK_SIZE * 2 }, + { 792, 528, BLOCK_SIZE * 2.8125, BLOCK_SIZE * 1.875 }, + { 1216, 384, BLOCK_SIZE * 1.5, BLOCK_SIZE * 2.5 }, + { 1408, 448, BLOCK_SIZE * 2.125, BLOCK_SIZE * 2 }, + { 1680, 504, BLOCK_SIZE * 1.875, BLOCK_SIZE * 1.5625 }, + { 1920, 496, BLOCK_SIZE * 2, BLOCK_SIZE * 1.625 }, + { 2688, 512, BLOCK_SIZE * 9.750001, BLOCK_SIZE * 0.5 }, + { 2688, 576, BLOCK_SIZE * 9.75, BLOCK_SIZE * 0.5 }, + { 3072.3462, 640, BLOCK_SIZE * 6.7471585, BLOCK_SIZE * 0.5 }, + { 2889.2666, 448, BLOCK_SIZE * 8.177588, BLOCK_SIZE * 0.5 }, + { 2951.6545, 384, BLOCK_SIZE * 7.690182, BLOCK_SIZE * 0.5 }, + { 3092.608, 304, BLOCK_SIZE * 6.5887766, BLOCK_SIZE * 0.625 }, + { 1280, 1104, BLOCK_SIZE * 2, BLOCK_SIZE * 2.375 }, + { -64, 1696, BLOCK_SIZE * 7.0000005, BLOCK_SIZE * 2.25 }, + { 1264, 328, BLOCK_SIZE * 1.125, BLOCK_SIZE * 0.4375 }, + { 1304, 296, BLOCK_SIZE * 0.8125, BLOCK_SIZE * 0.25 }, + { -64, 1680, BLOCK_SIZE * 4, BLOCK_SIZE * 2.4375 }, + { -72, 0, BLOCK_SIZE * 0.5625, BLOCK_SIZE * 16.75 }, + { 4096, 0, BLOCK_SIZE * 0.5625, BLOCK_SIZE * 16.75 }, + { -72, -80, BLOCK_SIZE * 33.125, BLOCK_SIZE * 0.625 }, + { 1032, 472, BLOCK_SIZE * 1.4375, BLOCK_SIZE * 0.4375 }, + { 1144, 432, BLOCK_SIZE * 0.5625, BLOCK_SIZE * 0.3125 }, + { 920, 488, BLOCK_SIZE * 0.875, BLOCK_SIZE * 0.3125 }, + { 3688, 1312, BLOCK_SIZE * 1.1875, BLOCK_SIZE * 1.25 }, + { 3528, 1432, BLOCK_SIZE * 1.25, BLOCK_SIZE * 0.4375 }, + { 3600, 1360, BLOCK_SIZE * 0.6875, BLOCK_SIZE * 0.5625 }, + { 3732, 1280, BLOCK_SIZE * 0.84375, BLOCK_SIZE * 0.25 }, + { 1152, 528, BLOCK_SIZE * 0.5, BLOCK_SIZE * 1.375 }, +}; + +Zone room_nastyparadise[] = +{ + { 128, 328, BLOCK_SIZE * 2, BLOCK_SIZE * 1.5 }, + { 384, 392, BLOCK_SIZE * 1, BLOCK_SIZE * 1 }, + { 0, 624, BLOCK_SIZE * 2, BLOCK_SIZE * 4.5625 }, + { 256, 816, BLOCK_SIZE * 3, BLOCK_SIZE * 3.0625 }, + { 896, 880, BLOCK_SIZE * 5.0625, BLOCK_SIZE * 2.5625 }, + { 1544, 944, BLOCK_SIZE * 4.96875, BLOCK_SIZE * 2.09375 }, + { 2176, 880, BLOCK_SIZE * 0.99999994, BLOCK_SIZE * 2.59375 }, + { 2304, 955, BLOCK_SIZE * 1.4999999, BLOCK_SIZE * 2.0078125 }, + { 2496, 880, BLOCK_SIZE * 0.99999994, BLOCK_SIZE * 2.59375 }, + { 2624, 955, BLOCK_SIZE * 1.4999999, BLOCK_SIZE * 2.0078125 }, + { 2816, 880, BLOCK_SIZE * 2.9375, BLOCK_SIZE * 2.59375 }, + { 3192, 816, BLOCK_SIZE * 2.0625, BLOCK_SIZE * 3.125 }, + { 3456, 756, BLOCK_SIZE * 1, BLOCK_SIZE * 3.59375 }, + { 3584, 816, BLOCK_SIZE * 3.9687498, BLOCK_SIZE * 3.125 }, + { 2304, 504, BLOCK_SIZE * 0.99999994, BLOCK_SIZE * 1.5000001 }, + { 2176, 568, BLOCK_SIZE * 0.99999994, BLOCK_SIZE * 1 }, + { 2432, 568, BLOCK_SIZE * 0.99999994, BLOCK_SIZE * 1 }, + { 1920, 584, BLOCK_SIZE * 0.99999994, BLOCK_SIZE * 1.5 }, + { 1408, 648, BLOCK_SIZE * 4, BLOCK_SIZE * 1 }, + { 1280, 584, BLOCK_SIZE * 1, BLOCK_SIZE * 1.5 }, + { 1280, 0, BLOCK_SIZE * 2, BLOCK_SIZE * 2.5625 }, + { 2176, 200, BLOCK_SIZE * 0.99999994, BLOCK_SIZE * 1.5000001 }, + { 2432, 200, BLOCK_SIZE * 2, BLOCK_SIZE * 1.5000001 }, + { 2688, 275, BLOCK_SIZE * 2, BLOCK_SIZE * 0.9140627 }, + { 2944, 200, BLOCK_SIZE * 1, BLOCK_SIZE * 1.5000001 }, + { 3072, 264, BLOCK_SIZE * 1, BLOCK_SIZE * 1.5000001 }, + { 3440, 328, BLOCK_SIZE * 2.125, BLOCK_SIZE * 1.0000001 }, + { 3856, 0, BLOCK_SIZE * 2.15625, BLOCK_SIZE * 5.0625 }, + { 3712, 624, BLOCK_SIZE * 2, BLOCK_SIZE * 0.68750006 }, + { 512, 488, BLOCK_SIZE * 3, BLOCK_SIZE * 0.75 }, + { 2048, 336, BLOCK_SIZE * 1, BLOCK_SIZE * 0.4375 }, + { 1920, 360, BLOCK_SIZE * 1, BLOCK_SIZE * 0.25 }, + { 2560, 616, BLOCK_SIZE * 0.99999994, BLOCK_SIZE * 0.625 }, + { 2688, 648, BLOCK_SIZE * 0.99999994, BLOCK_SIZE * 0.375 }, + { 2816, 664, BLOCK_SIZE * 0.99999994, BLOCK_SIZE * 0.25 }, + { 3200, 328, BLOCK_SIZE * 1.875, BLOCK_SIZE * 1.0000001 }, + { 2688, 252, BLOCK_SIZE * 2, BLOCK_SIZE * 0.1875 }, + { 2304, 932, BLOCK_SIZE * 1.5, BLOCK_SIZE * 0.1875 }, + { 2624, 932, BLOCK_SIZE * 1.5, BLOCK_SIZE * 0.1875 }, + { -128, -24, BLOCK_SIZE * 33.96875, BLOCK_SIZE * 0.1875 }, + { 640, 880, BLOCK_SIZE * 2, BLOCK_SIZE * 2.5625 }, +}; + +Zone room_notperfect[] = +{ + { 0, 2376, BLOCK_SIZE * 1.875, BLOCK_SIZE * 2.8125 }, + { 240, 2424, BLOCK_SIZE * 15, BLOCK_SIZE * 2.4375 }, + { 2160, 2328, BLOCK_SIZE * 0.75, BLOCK_SIZE * 3.1875 }, + { 2256, 2352, BLOCK_SIZE * 0.5625, BLOCK_SIZE * 3 }, + { 2328, 2376, BLOCK_SIZE * 0.5625, BLOCK_SIZE * 2.8125 }, + { 2400, 2424, BLOCK_SIZE * 24.375, BLOCK_SIZE * 2.4375 }, + { 2016, 2280, BLOCK_SIZE * 0.75, BLOCK_SIZE * 0.5625 }, + { 2112, 2304, BLOCK_SIZE * 0.5625, BLOCK_SIZE * 0.375 }, + { 1824, 2352, BLOCK_SIZE * 0.5625, BLOCK_SIZE * 0.5625 }, + { 1656, 2280, BLOCK_SIZE * 0.5625, BLOCK_SIZE * 0.5625 }, + { 1512, 2208, BLOCK_SIZE * 0.5625, BLOCK_SIZE * 0.5625 }, + { 1368, 2280, BLOCK_SIZE * 0.5625, BLOCK_SIZE * 0.5625 }, + { 1152, 2280, BLOCK_SIZE * 0.5625, BLOCK_SIZE * 0.5625 }, + { 1008, 2352, BLOCK_SIZE * 0.5625, BLOCK_SIZE * 0.5625 }, + { 1272, 2376, BLOCK_SIZE * 0.375, BLOCK_SIZE * 0.375 }, + { 768, 2328, BLOCK_SIZE * 0.75, BLOCK_SIZE * 0.1875 }, + { 600, 2304, BLOCK_SIZE * 0.5625, BLOCK_SIZE * 0.1875 }, + { 504, 2280, BLOCK_SIZE * 0.1875, BLOCK_SIZE * 0.1875 }, + { 312, 2328, BLOCK_SIZE * 0.5625, BLOCK_SIZE * 0.1875 }, + { 336, 2064, BLOCK_SIZE * 0.9375, BLOCK_SIZE * 0.75 }, + { 576, 2136, BLOCK_SIZE * 3, BLOCK_SIZE * 0.1875 }, + { 672, 2112, BLOCK_SIZE * 2.25, BLOCK_SIZE * 0.1875 }, + { 744, 2088, BLOCK_SIZE * 1.6875, BLOCK_SIZE * 0.1875 }, + { 816, 2064, BLOCK_SIZE * 1.125, BLOCK_SIZE * 0.1875 }, + { 888, 2040, BLOCK_SIZE * 0.5625, BLOCK_SIZE * 0.1875 }, + { 960, 2136, BLOCK_SIZE * 2.8125, BLOCK_SIZE * 0.1875 }, + { 1080, 2112, BLOCK_SIZE * 0.37500003, BLOCK_SIZE * 0.1875 }, + { 1320, 1992, BLOCK_SIZE * 0.9375, BLOCK_SIZE * 1.3125 }, + { 1440, 1992, BLOCK_SIZE * 0.9375, BLOCK_SIZE * 0.37500003 }, + { 504, 1992, BLOCK_SIZE * 1.3125, BLOCK_SIZE * 0.1875 }, + { 624, 1848, BLOCK_SIZE * 3.375, BLOCK_SIZE * 0.1875 }, + { 744, 1824, BLOCK_SIZE * 0.75, BLOCK_SIZE * 0.1875 }, + { 936, 1752, BLOCK_SIZE * 0.9375, BLOCK_SIZE * 0.75 }, + { 1152, 1680, BLOCK_SIZE * 1.3125, BLOCK_SIZE * 0.375 }, + { 1320, 1704, BLOCK_SIZE * 0.75000006, BLOCK_SIZE * 0.1875 }, + { 1320, 1848, BLOCK_SIZE * 4.125, BLOCK_SIZE * 0.1875 }, + { 1080, 1992, BLOCK_SIZE * 1.125, BLOCK_SIZE * 0.1875 }, + { 1128, 1920, BLOCK_SIZE * 0.75, BLOCK_SIZE * 0.5625 }, + { 1704, 1992, BLOCK_SIZE * 0.5625, BLOCK_SIZE * 0.5625 }, + { 1824, 2088, BLOCK_SIZE * 0.375, BLOCK_SIZE * 0.375 }, + { 1920, 1992, BLOCK_SIZE * 0.5625, BLOCK_SIZE * 0.5625 }, + { 2064, 2064, BLOCK_SIZE * 0.5625, BLOCK_SIZE * 0.5625 }, + { 1656, 2136, BLOCK_SIZE * 3.75, BLOCK_SIZE * 0.1875 }, + { 1488, 1776, BLOCK_SIZE * 0.75, BLOCK_SIZE * 0.5625 }, + { 1656, 1704, BLOCK_SIZE * 0.9375, BLOCK_SIZE * 0.5625 }, + { 1848, 1776, BLOCK_SIZE * 1.125, BLOCK_SIZE * 0.75 }, + { 2544, 1368, BLOCK_SIZE * 3.375, BLOCK_SIZE * 8.25 }, + { 2232, 1368, BLOCK_SIZE * 2.4375, BLOCK_SIZE * 5.8125 }, + { 2208, 1368, BLOCK_SIZE * 0.1875, BLOCK_SIZE * 3.375 }, + { 2232, 2112, BLOCK_SIZE * 0.375, BLOCK_SIZE * 0.375 }, + { 2520, 2112, BLOCK_SIZE * 0.1875, BLOCK_SIZE * 1.6875 }, + { 0, 1368, BLOCK_SIZE * 3.75, BLOCK_SIZE * 3.375 }, + { 336, 1800, BLOCK_SIZE * 1.125, BLOCK_SIZE * 0.5625 }, + { 0, 1800, BLOCK_SIZE * 1.125, BLOCK_SIZE * 2.625 }, + { 0, 2136, BLOCK_SIZE * 0.5625, BLOCK_SIZE * 1.875 }, + { 0, 1104, BLOCK_SIZE * 43.125, BLOCK_SIZE * 2.0625 }, + { 3768, 2016, BLOCK_SIZE * 0.75, BLOCK_SIZE * 0.5625 }, + { 3696, 2088, BLOCK_SIZE * 2.25, BLOCK_SIZE * 0.5625 }, + { 3576, 2136, BLOCK_SIZE * 0.9375, BLOCK_SIZE * 0.1875 }, + { 3984, 2136, BLOCK_SIZE * 7.1249995, BLOCK_SIZE * 0.1875 }, + { 4176, 2016, BLOCK_SIZE * 1.5, BLOCK_SIZE * 0.1875 }, + { 4320, 2040, BLOCK_SIZE * 0.375, BLOCK_SIZE * 0.75 }, + { 4464, 1368, BLOCK_SIZE * 0.75, BLOCK_SIZE * 5.4375 }, + { 4560, 1968, BLOCK_SIZE * 0.75, BLOCK_SIZE * 0.375 }, + { 4680, 2088, BLOCK_SIZE * 0.75, BLOCK_SIZE * 0.375 }, + { 4776, 2016, BLOCK_SIZE * 0.9375, BLOCK_SIZE * 0.9375 }, + { 4344, 2160, BLOCK_SIZE * 0.9375, BLOCK_SIZE * 1.3125 }, + { 4056, 2304, BLOCK_SIZE * 1.5, BLOCK_SIZE * 0.9375 }, + { 3624, 2376, BLOCK_SIZE * 2.0625, BLOCK_SIZE * 0.375 }, + { 3336, 2280, BLOCK_SIZE * 0.9375, BLOCK_SIZE * 0.375 }, + { 3168, 2280, BLOCK_SIZE * 0.5625, BLOCK_SIZE * 0.375 }, + { 3120, 2328, BLOCK_SIZE * 0.9375, BLOCK_SIZE * 0.1875 }, + { 3192, 2136, BLOCK_SIZE * 1.125, BLOCK_SIZE * 0.1875 }, + { 3432, 2136, BLOCK_SIZE * 0.1875, BLOCK_SIZE * 1.125 }, + { 2976, 2088, BLOCK_SIZE * 0.375, BLOCK_SIZE * 1.6875 }, + { 2976, 2400, BLOCK_SIZE * 0.375, BLOCK_SIZE * 0.1875 }, + { 2976, 1368, BLOCK_SIZE * 2.0625, BLOCK_SIZE * 5.625 }, + { 3240, 1368, BLOCK_SIZE * 2.4375, BLOCK_SIZE * 3.0000002 }, + { 3552, 1368, BLOCK_SIZE * 0.5625, BLOCK_SIZE * 2.4375002 }, + { 3624, 1368, BLOCK_SIZE * 0.5625, BLOCK_SIZE * 1.8750002 }, + { 3240, 1752, BLOCK_SIZE * 0.375, BLOCK_SIZE * 1.5000001 }, + { 3192, 2088, BLOCK_SIZE * 0.375, BLOCK_SIZE * 0.37500012 }, + { 4584, 2352, BLOCK_SIZE * 1.875, BLOCK_SIZE * 0.5625 }, + { 4656, 2280, BLOCK_SIZE * 1.3125, BLOCK_SIZE * 0.5625 }, + { 4944, 2352, BLOCK_SIZE * 1.6875, BLOCK_SIZE * 0.5625 }, + { 5088, 1368, BLOCK_SIZE * 3.375, BLOCK_SIZE * 6.1875 }, + { 4776, 1368, BLOCK_SIZE * 2.4375, BLOCK_SIZE * 1.4999999 }, + { 4872, 1560, BLOCK_SIZE * 1.6875, BLOCK_SIZE * 1.5624999 }, + { 4872, 1760, BLOCK_SIZE * 1.6875, BLOCK_SIZE * 0.8749998 }, + { 4848, 1656, BLOCK_SIZE * 0.1875, BLOCK_SIZE * 0.75 }, + { 5016, 1872, BLOCK_SIZE * 0.5625, BLOCK_SIZE * 0.9375 }, + { 5352, 2160, BLOCK_SIZE * 1.3125, BLOCK_SIZE * 0.1875 }, + { 5400, 2184, BLOCK_SIZE * 0.9375, BLOCK_SIZE * 1.875 }, + { 456, 912, BLOCK_SIZE * 0.9375, BLOCK_SIZE * 1.125 }, + { 192, 984, BLOCK_SIZE * 0.9375, BLOCK_SIZE * 0.5625 }, + { 744, 912, BLOCK_SIZE * 1.6875, BLOCK_SIZE * 0.375 }, + { 1032, 984, BLOCK_SIZE * 0.5625, BLOCK_SIZE * 0.5625 }, + { 672, 696, BLOCK_SIZE * 0.9375, BLOCK_SIZE * 0.5625 }, + { 576, 768, BLOCK_SIZE * 5.625, BLOCK_SIZE * 0.1875 }, + { 336, 768, BLOCK_SIZE * 0.9375, BLOCK_SIZE * 0.1875 }, + { 336, 600, BLOCK_SIZE * 0.1875, BLOCK_SIZE * 1.3125 }, + { 456, 648, BLOCK_SIZE * 0.9375, BLOCK_SIZE * 0.1875 }, + { 624, 480, BLOCK_SIZE * 3.1875, BLOCK_SIZE * 0.1875 }, + { 936, 624, BLOCK_SIZE * 2.0625, BLOCK_SIZE * 0.1875 }, + { 864, 408, BLOCK_SIZE * 0.75, BLOCK_SIZE * 0.5625 }, + { 1104, 552, BLOCK_SIZE * 0.75, BLOCK_SIZE * 0.5625 }, + { 1272, 408, BLOCK_SIZE * 1.125, BLOCK_SIZE * 0.5625 }, + { 1272, 480, BLOCK_SIZE * 4.6875, BLOCK_SIZE * 0.1875 }, + { 1272, 504, BLOCK_SIZE * 0.75, BLOCK_SIZE * 0.1875 }, + { 1272, 528, BLOCK_SIZE * 0.375, BLOCK_SIZE * 0.1875 }, + { 1464, 696, BLOCK_SIZE * 1.125, BLOCK_SIZE * 0.75 }, + { 1608, 768, BLOCK_SIZE * 0.5625, BLOCK_SIZE * 0.1875 }, + { 1896, 744, BLOCK_SIZE * 1.3125, BLOCK_SIZE * 0.75 }, + { 1776, 816, BLOCK_SIZE * 0.9375, BLOCK_SIZE * 0.1875 }, + { 2064, 792, BLOCK_SIZE * 1.5, BLOCK_SIZE * 0.375 }, + { 1680, 888, BLOCK_SIZE * 0.75, BLOCK_SIZE * 0.75 }, + { 1776, 936, BLOCK_SIZE * 0.5625, BLOCK_SIZE * 0.375 }, + { 1608, 960, BLOCK_SIZE * 0.5625, BLOCK_SIZE * 0.1875 }, + { 1920, 1008, BLOCK_SIZE * 2.25, BLOCK_SIZE * 0.375 }, + { 2016, 960, BLOCK_SIZE * 1.5, BLOCK_SIZE * 0.375 }, + { 2112, 936, BLOCK_SIZE * 0.75, BLOCK_SIZE * 0.1875 }, + { 2328, 1008, BLOCK_SIZE * 0.75, BLOCK_SIZE * 0.375 }, + { 1512, 1032, BLOCK_SIZE * 0.375, BLOCK_SIZE * 0.1875 }, + { 2520, 1008, BLOCK_SIZE * 0.1875, BLOCK_SIZE * 0.375 }, + { 2544, 0, BLOCK_SIZE * 3.375, BLOCK_SIZE * 8.25 }, + { 1656, 408, BLOCK_SIZE * 1.125, BLOCK_SIZE * 0.5625 }, + { 1656, 336, BLOCK_SIZE * 0.5625, BLOCK_SIZE * 0.5625 }, + { 1536, 336, BLOCK_SIZE * 0.9375, BLOCK_SIZE * 0.1875 }, + { 0, 0, BLOCK_SIZE * 3.9374998, BLOCK_SIZE * 3.7500002 }, + { 0, 480, BLOCK_SIZE * 1.3124998, BLOCK_SIZE * 3.0000002 }, + { 168, 480, BLOCK_SIZE * 1.3124998, BLOCK_SIZE * 0.93750024 }, + { 336, 480, BLOCK_SIZE * 0.18749976, BLOCK_SIZE * 0.93750024 }, + { 360, 480, BLOCK_SIZE * 0.18749976, BLOCK_SIZE * 0.93750024 }, + { 384, 480, BLOCK_SIZE * 0.18749976, BLOCK_SIZE * 0.75000024 }, + { 408, 480, BLOCK_SIZE * 0.18749976, BLOCK_SIZE * 0.56250024 }, + { 432, 480, BLOCK_SIZE * 0.18749976, BLOCK_SIZE * 0.37500024 }, + { 456, 480, BLOCK_SIZE * 0.18749976, BLOCK_SIZE * 0.18750024 }, + { 0, 864, BLOCK_SIZE * 1.3124998, BLOCK_SIZE * 2.3841858E-07 }, + { 0, 864, BLOCK_SIZE * 1.1249998, BLOCK_SIZE * 0.37500024 }, + { 0, 912, BLOCK_SIZE * 0.56249976, BLOCK_SIZE * 1.1250002 }, + { 504, 0, BLOCK_SIZE * 0.18749976, BLOCK_SIZE * 1.3125002 }, + { 2256, 0, BLOCK_SIZE * 2.2499998, BLOCK_SIZE * 6.1875 }, + { 2208, 0, BLOCK_SIZE * 0.37499976, BLOCK_SIZE * 2.625 }, + { 2256, 792, BLOCK_SIZE * 0.18749976, BLOCK_SIZE * 0.37500003 }, + { 2400, 792, BLOCK_SIZE * 0.56249976, BLOCK_SIZE * 0.5625 }, + { 2448, 864, BLOCK_SIZE * 0.18749976, BLOCK_SIZE * 0.375 }, + { 2976, 0, BLOCK_SIZE * 5.0625, BLOCK_SIZE * 3.9375 }, + { 2976, 504, BLOCK_SIZE * 2.8125002, BLOCK_SIZE * 0.1875 }, + { 2976, 648, BLOCK_SIZE * 0.9375003, BLOCK_SIZE * 0.375 }, + { 2976, 696, BLOCK_SIZE * 0.7500003, BLOCK_SIZE * 0.5625 }, + { 2976, 768, BLOCK_SIZE * 0.5625003, BLOCK_SIZE * 0.5625 }, + { 2976, 840, BLOCK_SIZE * 0.3750003, BLOCK_SIZE * 0.5625 }, + { 3072, 1032, BLOCK_SIZE * 1.6875002, BLOCK_SIZE * 0.1875 }, + { 3240, 744, BLOCK_SIZE * 0.9375003, BLOCK_SIZE * 0.375 }, + { 3480, 744, BLOCK_SIZE * 4.3125005, BLOCK_SIZE * 0.375 }, + { 3696, 984, BLOCK_SIZE * 0.9375005, BLOCK_SIZE * 0.5625 }, + { 3984, 912, BLOCK_SIZE * 1.5000005, BLOCK_SIZE * 0.375 }, + { 4248, 984, BLOCK_SIZE * 0.37500048, BLOCK_SIZE * 0.5625 }, + { 3384, 912, BLOCK_SIZE * 0.7500005, BLOCK_SIZE * 0.1875 }, + { 3456, 960, BLOCK_SIZE * 0.7500005, BLOCK_SIZE * 0.1875 }, + { 3456, 936, BLOCK_SIZE * 0.18750048, BLOCK_SIZE * 0.1875 }, + { 3600, 720, BLOCK_SIZE * 1.6875005, BLOCK_SIZE * 0.1875 }, + { 4008, 624, BLOCK_SIZE * 0.7500005, BLOCK_SIZE * 0.1875 }, + { 4008, 648, BLOCK_SIZE * 0.37500048, BLOCK_SIZE * 0.1875 }, + { 3960, 672, BLOCK_SIZE * 0.5625005, BLOCK_SIZE * 0.5625 }, + { 4296, 672, BLOCK_SIZE * 0.5625005, BLOCK_SIZE * 0.9375 }, + { 4224, 624, BLOCK_SIZE * 0.7500005, BLOCK_SIZE * 0.1875 }, + { 4272, 648, BLOCK_SIZE * 0.37500048, BLOCK_SIZE * 0.1875 }, + { 4032, 768, BLOCK_SIZE * 2.0625005, BLOCK_SIZE * 0.1875 }, + { 4368, 816, BLOCK_SIZE * 1.1250004, BLOCK_SIZE * 0.1875 }, + { 4368, 744, BLOCK_SIZE * 0.37500036, BLOCK_SIZE * 0.5625 }, + { 4440, 600, BLOCK_SIZE * 0.93750036, BLOCK_SIZE * 0.1875 }, + { 4680, 624, BLOCK_SIZE * 1.5000004, BLOCK_SIZE * 0.1875 }, + { 4968, 768, BLOCK_SIZE * 1.5000004, BLOCK_SIZE * 0.1875 }, + { 4848, 648, BLOCK_SIZE * 0.37500036, BLOCK_SIZE * 0.1875 }, + { 4872, 672, BLOCK_SIZE * 0.37500036, BLOCK_SIZE * 0.1875 }, + { 4896, 696, BLOCK_SIZE * 0.37500036, BLOCK_SIZE * 0.1875 }, + { 4920, 720, BLOCK_SIZE * 0.37500036, BLOCK_SIZE * 0.1875 }, + { 4944, 744, BLOCK_SIZE * 0.37500036, BLOCK_SIZE * 0.1875 }, + { 4800, 888, BLOCK_SIZE * 1.5000004, BLOCK_SIZE * 0.375 }, + { 4584, 888, BLOCK_SIZE * 0.75000036, BLOCK_SIZE * 0.5625 }, + { 4560, 912, BLOCK_SIZE * 0.18750036, BLOCK_SIZE * 1.125 }, + { 4536, 936, BLOCK_SIZE * 0.18750036, BLOCK_SIZE * 0.9375 }, + { 4512, 960, BLOCK_SIZE * 0.18750036, BLOCK_SIZE * 0.75 }, + { 4488, 984, BLOCK_SIZE * 0.18750036, BLOCK_SIZE * 0.5625 }, + { 4464, 1008, BLOCK_SIZE * 0.18750036, BLOCK_SIZE * 0.375 }, + { 4440, 1032, BLOCK_SIZE * 0.18750036, BLOCK_SIZE * 0.1875 }, + { 5040, 1032, BLOCK_SIZE * 0.18750036, BLOCK_SIZE * 0.1875 }, + { 5136, 960, BLOCK_SIZE * 0.93750036, BLOCK_SIZE * 0.1875 }, + { 5208, 984, BLOCK_SIZE * 0.75000036, BLOCK_SIZE * 0.5625 }, + { 4800, 0, BLOCK_SIZE * 5.6250005, BLOCK_SIZE * 2.0625 }, + { 4872, 264, BLOCK_SIZE * 5.0625005, BLOCK_SIZE * 0.5625 }, + { 5040, 336, BLOCK_SIZE * 3.7500005, BLOCK_SIZE * 1.6875 }, + { 5184, 552, BLOCK_SIZE * 2.6250005, BLOCK_SIZE * 0.1875 }, + { 5304, 576, BLOCK_SIZE * 1.6875005, BLOCK_SIZE * 0.75 }, + { 5376, 672, BLOCK_SIZE * 1.1250005, BLOCK_SIZE * 2.0625 }, + { 5448, 936, BLOCK_SIZE * 0.56250054, BLOCK_SIZE * 0.9375 }, + { 5160, 552, BLOCK_SIZE * 0.18750048, BLOCK_SIZE * 1.8750001 }, + { 5040, 552, BLOCK_SIZE * 0.18750048, BLOCK_SIZE * 0.93750006 }, + { 4872, 336, BLOCK_SIZE * 0.18750048, BLOCK_SIZE * 1.3125 }, + { 2976, 528, BLOCK_SIZE * 1.1250002, BLOCK_SIZE * 0.75 }, + { 3240, 528, BLOCK_SIZE * 0.75000024, BLOCK_SIZE * 0.9375 }, + { 2976, 624, BLOCK_SIZE * 0.9375002, BLOCK_SIZE * 0.1875 }, + { 0, 1056, BLOCK_SIZE * 9.5625, BLOCK_SIZE * 0.375 }, + { 1512, 1056, BLOCK_SIZE * 31.335938, BLOCK_SIZE * 0.375 }, + { 4848, 1560, BLOCK_SIZE * 0.1875, BLOCK_SIZE * 0.75 }, + { 4248, 2376, BLOCK_SIZE * 0.1875, BLOCK_SIZE * 0.375 }, + { 4368, 2136, BLOCK_SIZE * 0.1875, BLOCK_SIZE * -0.375 }, +}; + +Zone room_pricelessfreedom[] = +{ + { 0, 600, BLOCK_SIZE * 3.140625, BLOCK_SIZE * 1.875 }, + { 536, 600, BLOCK_SIZE * 1.0625, BLOCK_SIZE * 4.6875 }, + { 402, 1080, BLOCK_SIZE * 1.046875, BLOCK_SIZE * 0.9375 }, + { 335, 1140, BLOCK_SIZE * 0.5234375, BLOCK_SIZE * 0.46875 }, + { 0, 1200, BLOCK_SIZE * 1.03125, BLOCK_SIZE * 1 }, + { 399, 1320, BLOCK_SIZE * 3.1640625, BLOCK_SIZE * 0.9375 }, + { 0, 1368, BLOCK_SIZE * 3.140625, BLOCK_SIZE * 3.375 }, + { 672, 600, BLOCK_SIZE * 7.3125, BLOCK_SIZE * 1.875 }, + { 1608, 420, BLOCK_SIZE * 3.1406248, BLOCK_SIZE * 2.34375 }, + { 2144, 420, BLOCK_SIZE * 1.0390625, BLOCK_SIZE * 3.3125 }, + { 2011, 840, BLOCK_SIZE * 2.078125, BLOCK_SIZE * 2.875 }, + { 1340, 1080, BLOCK_SIZE * 1.125, BLOCK_SIZE * 3.28125 }, + { 938, 1080, BLOCK_SIZE * 2.09375, BLOCK_SIZE * 2.8203125 }, + { 1484, 1208, BLOCK_SIZE * 0.96875, BLOCK_SIZE * 2.28125 }, + { 1608, 1208, BLOCK_SIZE * 6.28125, BLOCK_SIZE * 1.8125 }, + { 2412, 1136, BLOCK_SIZE * 1.046875, BLOCK_SIZE * 2.84375 }, + { 2544, 720, BLOCK_SIZE * 1, BLOCK_SIZE * 3.2812502 }, + { 2948, 720, BLOCK_SIZE * 6.96875, BLOCK_SIZE * 1.8750002 }, + { 2948, 1430, BLOCK_SIZE * 2.09375, BLOCK_SIZE * 0.546875 }, + { 2546, 1440, BLOCK_SIZE * 3.140625, BLOCK_SIZE * 0.46875 }, + { 2816, 1350, BLOCK_SIZE * 1.03125, BLOCK_SIZE * 0.703125 }, + { 400, 1680, BLOCK_SIZE * 21.101562, BLOCK_SIZE * 0.9375 }, + { 1340, 1600, BLOCK_SIZE * 1.046875, BLOCK_SIZE * 0.62500006 }, + { 1876, 1590, BLOCK_SIZE * 1.046875, BLOCK_SIZE * 0.70312506 }, + { 2278, 1590, BLOCK_SIZE * 1.046875, BLOCK_SIZE * 0.70312506 }, + { 3417, 1530, BLOCK_SIZE * 1.5781254, BLOCK_SIZE * 0.87500006 }, + { 2392, 540.00006, BLOCK_SIZE * 0.671875, BLOCK_SIZE * 5.21875 }, + { 2576, 640, BLOCK_SIZE * 0.8125, BLOCK_SIZE * 0.62500024 }, + { 2881, 280, BLOCK_SIZE * 1.046875, BLOCK_SIZE * 0.625 }, + { 2816, 360, BLOCK_SIZE * 6.7890625, BLOCK_SIZE * 0.9375 }, + { 2613, 451, BLOCK_SIZE * 1.5859375, BLOCK_SIZE * 0.22656274 }, + { 3350, 270, BLOCK_SIZE * 1.046875, BLOCK_SIZE * 0.703125 }, + { 3216, 630, BLOCK_SIZE * 1.046875, BLOCK_SIZE * 0.703125 }, + { 3618, 630, BLOCK_SIZE * 1.046875, BLOCK_SIZE * 0.703125 }, + { 4020, -1, BLOCK_SIZE * 2.078125, BLOCK_SIZE * 14.0703125 }, + { 3618, 1140, BLOCK_SIZE * 3.140625, BLOCK_SIZE * 5.15625 }, + { -16, 0, BLOCK_SIZE * 0.125, BLOCK_SIZE * 14.0625 }, + { 3912, 712, BLOCK_SIZE * 0.84375, BLOCK_SIZE * 3.3437502 }, + { 2672, 720, BLOCK_SIZE * 1.109375, BLOCK_SIZE * 1.8750002 }, + { 3840, 712, BLOCK_SIZE * 0.125, BLOCK_SIZE * 1.9375001 }, + { -37, -32, BLOCK_SIZE * 33.765625, BLOCK_SIZE * 0.25781298 }, + { 0, 1320, BLOCK_SIZE * 3.140625, BLOCK_SIZE * 0.375 }, + { 128, 1272, BLOCK_SIZE * 1.265625, BLOCK_SIZE * 0.375 }, + { 3101, 1680, BLOCK_SIZE * 4.039063, BLOCK_SIZE * 0.9375 }, + { 3181, 1640, BLOCK_SIZE * 3.414063, BLOCK_SIZE * 0.3125 }, + { 3272, 1600, BLOCK_SIZE * 1.132813, BLOCK_SIZE * 0.3125 }, + { 3320, 1576, BLOCK_SIZE * 0.757813, BLOCK_SIZE * 0.1875 }, + { 2720, 1400, BLOCK_SIZE * 0.75, BLOCK_SIZE * 0.3125 }, + { 2768, 1376, BLOCK_SIZE * 0.375, BLOCK_SIZE * 0.1875 }, + { 2672, 1416, BLOCK_SIZE * 0.375, BLOCK_SIZE * 0.1875 }, + { 2277, 540, BLOCK_SIZE * 0.8984375, BLOCK_SIZE * 5.21875 }, + { 2478, 608, BLOCK_SIZE * 0.515625, BLOCK_SIZE * 4.125 }, + { 2277, 516, BLOCK_SIZE * 0.757813, BLOCK_SIZE * 0.1875 }, + { 2277, 492, BLOCK_SIZE * 0.5312505, BLOCK_SIZE * 0.1875 }, + { 2277, 468, BLOCK_SIZE * 0.34375048, BLOCK_SIZE * 0.1875 }, + { 2478, 584, BLOCK_SIZE * 0.32812548, BLOCK_SIZE * 0.1875 }, + { 2478, 560, BLOCK_SIZE * 0.14062548, BLOCK_SIZE * 0.1875 }, + { 2544, 640, BLOCK_SIZE * 0.25000048, BLOCK_SIZE * 0.625 }, + { 3176, 680, BLOCK_SIZE * 0.31250048, BLOCK_SIZE * 0.3125 }, + { 3144, 696, BLOCK_SIZE * 0.25000048, BLOCK_SIZE * 0.1875 }, + { 3350, 680, BLOCK_SIZE * 0.31250048, BLOCK_SIZE * 0.3125 }, + { 3390, 696, BLOCK_SIZE * 0.25781298, BLOCK_SIZE * 0.1875 }, + { 3544, 696, BLOCK_SIZE * 0.37500048, BLOCK_SIZE * 0.1875 }, + { 3592, 673, BLOCK_SIZE * 0.25000048, BLOCK_SIZE * 0.3671875 }, + { 3752, 681, BLOCK_SIZE * 0.31250048, BLOCK_SIZE * 0.3046875 }, + { 3792, 704, BLOCK_SIZE * 0.31250048, BLOCK_SIZE * 0.125 }, + { 1484.0004, 1080, BLOCK_SIZE * 4.117188, BLOCK_SIZE * 1 }, + { 1760, 954, BLOCK_SIZE * 1.9687504, BLOCK_SIZE * 0.984375 }, + { 1600, 1026, BLOCK_SIZE * 1.2500004, BLOCK_SIZE * 0.421875 }, + { 1865, 907, BLOCK_SIZE * 1.1406254, BLOCK_SIZE * 0.3671875 }, + { 1344, 544, BLOCK_SIZE * 2.078125, BLOCK_SIZE * 0.4375 }, + { 1464, 488, BLOCK_SIZE * 1.140625, BLOCK_SIZE * 0.4375 }, +}; + +Zone room_ravinemist[] = +{ + { -16, 0, BLOCK_SIZE * 0.125, BLOCK_SIZE * 15.398438 }, + { 3128, 0, BLOCK_SIZE * 0.125, BLOCK_SIZE * 19.773438 }, + { 0, 0, BLOCK_SIZE * 6.375, BLOCK_SIZE * 2.25 }, + { 816, 288, BLOCK_SIZE * 1.0625, BLOCK_SIZE * 1.40625 }, + { 0, 288, BLOCK_SIZE * 6.375, BLOCK_SIZE * 1 }, + { 952, 340, BLOCK_SIZE * 1.0625, BLOCK_SIZE * 1.40625 }, + { 1088, 392, BLOCK_SIZE * 2.125, BLOCK_SIZE * 1 }, + { 812, 416, BLOCK_SIZE * 0.03125, BLOCK_SIZE * 0.40625 }, + { 0, 416, BLOCK_SIZE * 2.125, BLOCK_SIZE * 2.03125 }, + { 272, 600, BLOCK_SIZE * 1.0625, BLOCK_SIZE * 0.59375 }, + { 1088, 0, BLOCK_SIZE * 2.125, BLOCK_SIZE * 1.625 }, + { 1360, 0, BLOCK_SIZE * 7.4375005, BLOCK_SIZE * 1.21875 }, + { 2312, 0, BLOCK_SIZE * 2.1250005, BLOCK_SIZE * 1.625 }, + { 2448, 208, BLOCK_SIZE * 1.0625005, BLOCK_SIZE * 0.40625 }, + { 2720, 288, BLOCK_SIZE * 3.1875005, BLOCK_SIZE * 1 }, + { 2584, 340, BLOCK_SIZE * 1.0625005, BLOCK_SIZE * 1 }, + { 1768, 392, BLOCK_SIZE * 6.3750005, BLOCK_SIZE * 0.59375 }, + { 1496, 444, BLOCK_SIZE * 2.1250005, BLOCK_SIZE * 1 }, + { 1768, 520, BLOCK_SIZE * 1.0625005, BLOCK_SIZE * 0.40625 }, + { 1496, 572, BLOCK_SIZE * 1.0625005, BLOCK_SIZE * 0.8125 }, + { 1360, 600, BLOCK_SIZE * 1.0625005, BLOCK_SIZE * 0.59375 }, + { 1088, 652, BLOCK_SIZE * 1.0625005, BLOCK_SIZE * 0.59375 }, + { 816, 652, BLOCK_SIZE * 2.1250005, BLOCK_SIZE * 3.03125 }, + { 680, 704, BLOCK_SIZE * 1.0625005, BLOCK_SIZE * 2.6250002 }, + { 544, 756, BLOCK_SIZE * 1.0625005, BLOCK_SIZE * 2.2187502 }, + { 272, 808, BLOCK_SIZE * 2.1250005, BLOCK_SIZE * 1.8125002 }, + { 1088, 860, BLOCK_SIZE * 6.3750005, BLOCK_SIZE * 1.40625 }, + { 1496, 808, BLOCK_SIZE * 3.1875007, BLOCK_SIZE * 0.40625003 }, + { 1904, 860, BLOCK_SIZE * 1.0625007, BLOCK_SIZE * 5.46875 }, + { 0, 1120, BLOCK_SIZE * 1.0625007, BLOCK_SIZE * 0.99999994 }, + { 136, 1172, BLOCK_SIZE * 2.1250007, BLOCK_SIZE * 0.59374994 }, + { 1360, 1276, BLOCK_SIZE * 2.1250007, BLOCK_SIZE * 1.40625 }, + { 1224, 1224, BLOCK_SIZE * 1.0625007, BLOCK_SIZE * 1.40625 }, + { 680.0001, 1224, BLOCK_SIZE * 4.250001, BLOCK_SIZE * 1 }, + { 544, 1276, BLOCK_SIZE * 2.125001, BLOCK_SIZE * 1 }, + { 272, 1328, BLOCK_SIZE * 3.187501, BLOCK_SIZE * 1 }, + { 136, 1640, BLOCK_SIZE * 3.187501, BLOCK_SIZE * 1.40625 }, + { 544, 1692, BLOCK_SIZE * 2.125001, BLOCK_SIZE * 1 }, + { 0, 1952, BLOCK_SIZE * 3.187501, BLOCK_SIZE * 1.40625 }, + { 272, 2264, BLOCK_SIZE * 2.125001, BLOCK_SIZE * 1.8125001 }, + { 0, 2132, BLOCK_SIZE * 2.125001, BLOCK_SIZE * 2.4375 }, + { 544, 1952, BLOCK_SIZE * 2.125001, BLOCK_SIZE * 1 }, + { 680, 2004, BLOCK_SIZE * 3.187501, BLOCK_SIZE * 1 }, + { 1088, 1952, BLOCK_SIZE * 3.187501, BLOCK_SIZE * 1.40625 }, + { 1360, 1744, BLOCK_SIZE * 2.125001, BLOCK_SIZE * 1.6250001 }, + { 1088, 1692, BLOCK_SIZE * 2.125001, BLOCK_SIZE * 1 }, + { 1224, 1820, BLOCK_SIZE * 1.062501, BLOCK_SIZE * 0.40625 }, + { 1632, 1796, BLOCK_SIZE * 2.125001, BLOCK_SIZE * 1.8125001 }, + { 1496, 1952, BLOCK_SIZE * 1.062501, BLOCK_SIZE * 1.4062501 }, + { 680, 2264, BLOCK_SIZE * 7.4375014, BLOCK_SIZE * 1.8125001 }, + { 1768, 2368, BLOCK_SIZE * 2.1250014, BLOCK_SIZE * 0.9843751 }, + { 2040, 2316, BLOCK_SIZE * 3.1875014, BLOCK_SIZE * 1.3906251 }, + { 2448, 2264, BLOCK_SIZE * 4.2500014, BLOCK_SIZE * 1.796875 }, + { 2992.0005, 416, BLOCK_SIZE * 1.0625005, BLOCK_SIZE * 7.437499 }, + { 2720, 600, BLOCK_SIZE * 2.1250005, BLOCK_SIZE * 0.9999991 }, + { 2312, 520, BLOCK_SIZE * 1.0625005, BLOCK_SIZE * 3.249999 }, + { 2448, 808, BLOCK_SIZE * 1.0625005, BLOCK_SIZE * 1.406249 }, + { 2584, 860, BLOCK_SIZE * 1.0625005, BLOCK_SIZE * 1.406249 }, + { 2720, 912, BLOCK_SIZE * 1.0625005, BLOCK_SIZE * 1.406249 }, + { 2040, 1172, BLOCK_SIZE * 3.1875005, BLOCK_SIZE * 1.406249 }, + { 2448, 1224, BLOCK_SIZE * 3.1875005, BLOCK_SIZE * 0.999999 }, + { 1992, 1352.0669, BLOCK_SIZE * 1.4375005, BLOCK_SIZE * 4.468749 }, + { 2040, 1924, BLOCK_SIZE * 1.0625005, BLOCK_SIZE * 1.624999 }, + { 2176, 1952, BLOCK_SIZE * 1.0625005, BLOCK_SIZE * 1.406249 }, + { 2448, 1952, BLOCK_SIZE * 4.2500005, BLOCK_SIZE * 1.406249 }, + { 2312, 1760, BLOCK_SIZE * 3.1875005, BLOCK_SIZE * 0.71874905 }, + { 2448, 1536, BLOCK_SIZE * 1.0625005, BLOCK_SIZE * 0.99999905 }, + { 2584, 1484, BLOCK_SIZE * 2.1250005, BLOCK_SIZE * 0.99999905 }, + { 2856, 1432.0018, BLOCK_SIZE * 1.0625005, BLOCK_SIZE * 4.062499 }, + { 1768, 468, BLOCK_SIZE * 5.3125005, BLOCK_SIZE * 0.40625 }, + { 792, -16, BLOCK_SIZE * 18.374998, BLOCK_SIZE * 0.125 }, + { 2992, 2264, BLOCK_SIZE * 0.125, BLOCK_SIZE * 0.125 }, +}; + +Zone room_torturecave[] = +{ + { 960, -504, BLOCK_SIZE * 1, BLOCK_SIZE * 3.9375 }, + { 1280, -504, BLOCK_SIZE * 1, BLOCK_SIZE * 3.9375 }, + { 960, -520, BLOCK_SIZE * 3.5, BLOCK_SIZE * 0.125 }, + { 1632, 736, BLOCK_SIZE * 0.25, BLOCK_SIZE * 0.25 }, + { 928, 736, BLOCK_SIZE * 0.25, BLOCK_SIZE * 0.25 }, + { 3520, -504, BLOCK_SIZE * 1, BLOCK_SIZE * 3.9375 }, + { 3776, -504, BLOCK_SIZE * 1, BLOCK_SIZE * 3.9375 }, + { 3520, -520, BLOCK_SIZE * 3, BLOCK_SIZE * 0.125 }, + { 4080, 800, BLOCK_SIZE * 0.25, BLOCK_SIZE * 0.25 }, + { 4000, 832, BLOCK_SIZE * 0.25, BLOCK_SIZE * 0.25 }, + { 3760, 1112, BLOCK_SIZE * 0.25, BLOCK_SIZE * 0.3125 }, + { 3808, 864, BLOCK_SIZE * 0.125, BLOCK_SIZE * 0.125 }, + { 4608, 954, BLOCK_SIZE * 1, BLOCK_SIZE * 0.25 }, +}; + +Zone room_volcanovalley[] = +{ + { 128, 784, BLOCK_SIZE * 1, BLOCK_SIZE * 0.15625 }, + { 384, 784, BLOCK_SIZE * 1, BLOCK_SIZE * 1.375 }, + { 512, 848, BLOCK_SIZE * 1, BLOCK_SIZE * 0.875 }, + { 640, 784, BLOCK_SIZE * 1, BLOCK_SIZE * 1.375 }, + { 256, 1088, BLOCK_SIZE * 8, BLOCK_SIZE * 1 }, + { 832, 992, BLOCK_SIZE * 3.5, BLOCK_SIZE * 0.75 }, + { 1152, 1344, BLOCK_SIZE * 2.5, BLOCK_SIZE * 2.5 }, + { 1599.9998, 1408, BLOCK_SIZE * 0.4921875, BLOCK_SIZE * 2 }, + { 1668, 1536, BLOCK_SIZE * 2.46875, BLOCK_SIZE * 1 }, + { 2240, 1536, BLOCK_SIZE * 1, BLOCK_SIZE * 0.25 }, + { 2624, 1536, BLOCK_SIZE * 1.5, BLOCK_SIZE * 1 }, + { 2944, 1536, BLOCK_SIZE * 1.53125, BLOCK_SIZE * 1 }, + { 3265, 1408, BLOCK_SIZE * 1.4921875, BLOCK_SIZE * 2 }, + { 3584, 1408, BLOCK_SIZE * 2, BLOCK_SIZE * 2 }, + { 3840, 1344, BLOCK_SIZE * 1.5, BLOCK_SIZE * 2.5 }, + { 4032, 1088, BLOCK_SIZE * 1, BLOCK_SIZE * 4.5 }, + { 4288, 1088, BLOCK_SIZE * 1, BLOCK_SIZE * 0.5 }, + { 4608, 960, BLOCK_SIZE * 2, BLOCK_SIZE * 5.5 }, + { 4224, 768, BLOCK_SIZE * 1.5, BLOCK_SIZE * 1 }, + { 4032, 704, BLOCK_SIZE * 1.5, BLOCK_SIZE * 1.5 }, + { 3904, 640, BLOCK_SIZE * 1.5, BLOCK_SIZE * 2 }, + { 3776, 576, BLOCK_SIZE * 1, BLOCK_SIZE * 2.5 }, + { 3712, 832, BLOCK_SIZE * 1, BLOCK_SIZE * 2 }, + { 3456, 896, BLOCK_SIZE * 1.5, BLOCK_SIZE * 1 }, + { 3648, 896, BLOCK_SIZE * 0.5, BLOCK_SIZE * 1.5 }, + { 2880, 1024, BLOCK_SIZE * 1, BLOCK_SIZE * 2 }, + { 3080, 1088, BLOCK_SIZE * 2.0625, BLOCK_SIZE * 1.5 }, + { 3008, 1088, BLOCK_SIZE * 0.5625, BLOCK_SIZE * 1.5 }, + { 2432, 960, BLOCK_SIZE * 2, BLOCK_SIZE * 3 }, + { 1920, 960, BLOCK_SIZE * 1.5, BLOCK_SIZE * 3 }, + { 2112, 1088, BLOCK_SIZE * 2.5, BLOCK_SIZE * 2 }, + { 1472, 1104, BLOCK_SIZE * 3.5, BLOCK_SIZE * 0.875 }, + { 3776, 0, BLOCK_SIZE * 9.5, BLOCK_SIZE * 2.5 }, + { 4864, 320, BLOCK_SIZE * 1, BLOCK_SIZE * 10.5 }, + { 0, 1280, BLOCK_SIZE * 0.75, BLOCK_SIZE * 0.9375 }, + { 308, 1408, BLOCK_SIZE * 1.59375, BLOCK_SIZE * 2 }, + { 640, 1376, BLOCK_SIZE * 1, BLOCK_SIZE * 0.5 }, + { 896, 1376, BLOCK_SIZE * 1, BLOCK_SIZE * 0.5 }, + { 224, 1344, BLOCK_SIZE * 0.25, BLOCK_SIZE * 0.25 }, + { 992, 912, BLOCK_SIZE * 0.75, BLOCK_SIZE * 0.625 }, + { 768, 912, BLOCK_SIZE * 0.75, BLOCK_SIZE * 0.375 }, + { 832, 960, BLOCK_SIZE * 1.25, BLOCK_SIZE * 0.25 }, + { 1984, 1555, BLOCK_SIZE * 5, BLOCK_SIZE * 0.8515625 }, + { 3456, 1425, BLOCK_SIZE * 1, BLOCK_SIZE * 1.8671875 }, + { 512, 1426, BLOCK_SIZE * 5, BLOCK_SIZE * 1.859375 }, + { 4288, 1088, BLOCK_SIZE * 1, BLOCK_SIZE * 4.5 }, + { 2112, 994, BLOCK_SIZE * 2.5, BLOCK_SIZE * 0.734375 }, + { -40, 0, BLOCK_SIZE * 0.3125, BLOCK_SIZE * 13 }, + { 4992, 0, BLOCK_SIZE * 0.3125, BLOCK_SIZE * 13 }, + { 3344, 1168, BLOCK_SIZE * 1.5, BLOCK_SIZE * 0.875 }, + { 4160, 1176, BLOCK_SIZE * 1, BLOCK_SIZE * 1.3125 }, + { 512, 795, BLOCK_SIZE * 1, BLOCK_SIZE * 1.2890625 }, + { 1472, 1423, BLOCK_SIZE * 0.9921875, BLOCK_SIZE * 1.96875 }, + { 2816, 1551, BLOCK_SIZE * 1, BLOCK_SIZE * 1.9453125 }, + { 4160, 1107.7958, BLOCK_SIZE * 1, BLOCK_SIZE * 4.345703 }, + { 0, 804, BLOCK_SIZE * 2, BLOCK_SIZE * 1.21875 }, + { 3137, 1472, BLOCK_SIZE * 1.015625, BLOCK_SIZE * 1.5 }, + { 1672, 1480, BLOCK_SIZE * 1.03125, BLOCK_SIZE * 0.43750003 }, + { 1672, 1452, BLOCK_SIZE * 0.625, BLOCK_SIZE * 0.21875004 }, + { 3193, 1444, BLOCK_SIZE * 0.5625, BLOCK_SIZE * 0.21875004 }, + { 1804, 1508, BLOCK_SIZE * 0.453125, BLOCK_SIZE * 0.21875004 }, + { 4416, 1088, BLOCK_SIZE * 1.4999999, BLOCK_SIZE * 4.5 }, + { 0, 1400, BLOCK_SIZE * 2.40625, BLOCK_SIZE * 2.0625 }, +}; + +Zone room_weedzone[] = +{ + { 0, 512, BLOCK_SIZE * 2, BLOCK_SIZE * 2.5 }, + { 0, 832, BLOCK_SIZE * 4.5, BLOCK_SIZE * 2 }, + { 576, 896, BLOCK_SIZE * 5, BLOCK_SIZE * 1.5 }, + { 512, 512, BLOCK_SIZE * 1, BLOCK_SIZE * 1 }, + { 640, 576, BLOCK_SIZE * 3, BLOCK_SIZE * 1 }, + { 896, 704, BLOCK_SIZE * 1, BLOCK_SIZE * 0.5 }, + { 848, 192, BLOCK_SIZE * 2.375, BLOCK_SIZE * 0.5 }, + { 976, 256, BLOCK_SIZE * 1.375, BLOCK_SIZE * 2 }, + { 1120, 512, BLOCK_SIZE * 0.375, BLOCK_SIZE * 2.5 }, + { 1152, 384, BLOCK_SIZE * 0.5, BLOCK_SIZE * 1.25 }, + { 1216, 384, BLOCK_SIZE * 2, BLOCK_SIZE * 0.125 }, + { 1344, 400, BLOCK_SIZE * 1, BLOCK_SIZE * 0.375 }, + { 1408, 448, BLOCK_SIZE * 0.75, BLOCK_SIZE * 0.625 }, + { 1504, 480, BLOCK_SIZE * 0.375, BLOCK_SIZE * 0.375 }, + { 1536, 512, BLOCK_SIZE * 3, BLOCK_SIZE * 0.5 }, + { 1600, 576, BLOCK_SIZE * 2.5, BLOCK_SIZE * 0.5 }, + { 1792, 640, BLOCK_SIZE * 1, BLOCK_SIZE * 0.5 }, + { 2080, 512, BLOCK_SIZE * 8.75, BLOCK_SIZE * 0.5 }, + { 2304, 576, BLOCK_SIZE * 2.5, BLOCK_SIZE * 0.5 }, + { 2304, 640, BLOCK_SIZE * 1, BLOCK_SIZE * 0.5 }, + { 2432, 448, BLOCK_SIZE * 11.5, BLOCK_SIZE * 0.5 }, + { 3776, 512, BLOCK_SIZE * 1, BLOCK_SIZE * 0.5 }, + { 3680, 256, BLOCK_SIZE * 1.75, BLOCK_SIZE * 1.5 }, + { 3136, 384, BLOCK_SIZE * 2.25, BLOCK_SIZE * 0.5 }, + { 2688, 384, BLOCK_SIZE * 2, BLOCK_SIZE * 0.5 }, + { 2688, 192, BLOCK_SIZE * 1.75, BLOCK_SIZE * 0.5 }, + { 2688, 256, BLOCK_SIZE * 1, BLOCK_SIZE * 1 }, + { 1664, 0, BLOCK_SIZE * 6, BLOCK_SIZE * 1 }, + { 1792, 128, BLOCK_SIZE * 5, BLOCK_SIZE * 1 }, + { 1792, 256, BLOCK_SIZE * 1, BLOCK_SIZE * 0.5 }, + { 2304, 256, BLOCK_SIZE * 1, BLOCK_SIZE * 0.5 }, + { 1728, 896, BLOCK_SIZE * 6.4999995, BLOCK_SIZE * 1.5 }, + { 2560, 896, BLOCK_SIZE * 4, BLOCK_SIZE * 1.5 }, + { 3072, 976, BLOCK_SIZE * 1.5, BLOCK_SIZE * 0.875 }, + { 3264, 960, BLOCK_SIZE * 0.5, BLOCK_SIZE * 0.125 }, + { 3584, 960, BLOCK_SIZE * 0.5, BLOCK_SIZE * 0.125 }, + { 3648, 960, BLOCK_SIZE * 2.5, BLOCK_SIZE * 1 }, + { 3840, 704, BLOCK_SIZE * 1, BLOCK_SIZE * 2 }, + { 3776, 896, BLOCK_SIZE * 0.5, BLOCK_SIZE * 0.5 }, + { 2944, 704, BLOCK_SIZE * 1, BLOCK_SIZE * 1.5 }, + { 2816, 768, BLOCK_SIZE * 1, BLOCK_SIZE * 1 }, + { 4480, 832, BLOCK_SIZE * 1, BLOCK_SIZE * 2 }, + { 4576, 816, BLOCK_SIZE * 0.25, BLOCK_SIZE * 0.625 }, + { 4856, 672, BLOCK_SIZE * 1.0625, BLOCK_SIZE * 3.2499998 }, + { 4416, 544, BLOCK_SIZE * 1, BLOCK_SIZE * 0.5 }, + { 4480, 608, BLOCK_SIZE * 1, BLOCK_SIZE * 0.5 }, + { 4160, 512, BLOCK_SIZE * 1, BLOCK_SIZE * 0.125 }, + { 4352, 544, BLOCK_SIZE * 0.5, BLOCK_SIZE * 0.125 }, + { 4416, 256, BLOCK_SIZE * 2, BLOCK_SIZE * 1 }, + { 4672, 256, BLOCK_SIZE * 1, BLOCK_SIZE * 0.5 }, + { 4480, 192, BLOCK_SIZE * 0.5, BLOCK_SIZE * 0.5 }, + { 640, 528, BLOCK_SIZE * 0.5, BLOCK_SIZE * 0.375 }, + { 704, 544, BLOCK_SIZE * 0.375, BLOCK_SIZE * 0.25 }, + { 576, 848, BLOCK_SIZE * 0.5, BLOCK_SIZE * 0.375 }, + { 640, 864, BLOCK_SIZE * 0.375, BLOCK_SIZE * 0.25 }, + { 2048, 848, BLOCK_SIZE * 0.5, BLOCK_SIZE * 0.375 }, + { 2112, 864, BLOCK_SIZE * 0.375, BLOCK_SIZE * 0.25 }, + { 1920, 832, BLOCK_SIZE * 1, BLOCK_SIZE * 0.5 }, + { 3072, 896, BLOCK_SIZE * 0.5, BLOCK_SIZE * 0.625 }, + { 3136, 928, BLOCK_SIZE * 0.5, BLOCK_SIZE * 0.375 }, + { 3712, 928, BLOCK_SIZE * 0.5, BLOCK_SIZE * 0.25 }, + { 3200, 960, BLOCK_SIZE * 0.5, BLOCK_SIZE * 0.125 }, + { 4544, 208, BLOCK_SIZE * 0.5, BLOCK_SIZE * 0.375 }, + { 4608, 224, BLOCK_SIZE * 0.375, BLOCK_SIZE * 0.25 }, + { 2368, 464, BLOCK_SIZE * 0.5, BLOCK_SIZE * 0.375 }, + { 2320, 480, BLOCK_SIZE * 0.375, BLOCK_SIZE * 0.25 }, + { -20, 0, BLOCK_SIZE * 0.15625, BLOCK_SIZE * 8.53125 }, + { 4992, 0, BLOCK_SIZE * 0.15625, BLOCK_SIZE * 8.53125 }, + { -20, -20, BLOCK_SIZE * 39.3125, BLOCK_SIZE * 0.15625048 }, + { 4608, 816, BLOCK_SIZE * 2.09375, BLOCK_SIZE * 2.125 }, + { 4744, 744, BLOCK_SIZE * 0.3125, BLOCK_SIZE * 0.5625 }, + { 4784, 708, BLOCK_SIZE * 0.71875, BLOCK_SIZE * 0.84375 }, + { 4668, 776, BLOCK_SIZE * 0.59375, BLOCK_SIZE * 0.3125 }, + { 3424, 384, BLOCK_SIZE * 1.75, BLOCK_SIZE * 0.5 }, + { 3604, 296, BLOCK_SIZE * 0.34375, BLOCK_SIZE * 0.6875 }, + { 3516, 340, BLOCK_SIZE * 0.6875, BLOCK_SIZE * 0.34375 }, + { 3648, 276, BLOCK_SIZE * 0.25, BLOCK_SIZE * 1.34375 }, +}; + +Zone room_youcantrun[] = +{ + { 2816, 0, BLOCK_SIZE * 6, BLOCK_SIZE * 4.1875 }, + { 2560, -4, BLOCK_SIZE * 1.25, BLOCK_SIZE * 6.03125 }, + { 2688, 768, BLOCK_SIZE * 0.25, BLOCK_SIZE * 0.625 }, + { 2816, 672, BLOCK_SIZE * 1, BLOCK_SIZE * 1 }, + { 2912, 896, BLOCK_SIZE * 0.75, BLOCK_SIZE * 0.5 }, + { 3008, 864, BLOCK_SIZE * 4.53125, BLOCK_SIZE * 3.0625 }, + { 3072, 536, BLOCK_SIZE * 4.03125, BLOCK_SIZE * 2.5625 }, + { 2752, 928, BLOCK_SIZE * 1.25, BLOCK_SIZE * 0.25 }, + { 2560, 960, BLOCK_SIZE * 0.5, BLOCK_SIZE * 3.3125 }, + { 2624, 1256, BLOCK_SIZE * 7.5000005, BLOCK_SIZE * 1 }, + { 3328, 1384, BLOCK_SIZE * 2, BLOCK_SIZE * 7.1875 }, + { 3072, 1888, BLOCK_SIZE * 2, BLOCK_SIZE * 3.25 }, + { 2304, 2048, BLOCK_SIZE * 6, BLOCK_SIZE * 2 }, + { 2112, 1984, BLOCK_SIZE * 1.5, BLOCK_SIZE * 2.5 }, + { 1920, 1952, BLOCK_SIZE * 1.5, BLOCK_SIZE * 2.75 }, + { 1688, 1984, BLOCK_SIZE * 0.8125, BLOCK_SIZE * 2.5 }, + { 1280, 1984, BLOCK_SIZE * 3.1875, BLOCK_SIZE * 2.5 }, + { 1024, 2016, BLOCK_SIZE * 2, BLOCK_SIZE * 2.25 }, + { 1024, 1984, BLOCK_SIZE * 0.5, BLOCK_SIZE * 0.25 }, + { 1088, 1952, BLOCK_SIZE * 0.5, BLOCK_SIZE * 0.5 }, + { 1216, 1920, BLOCK_SIZE * 0.5, BLOCK_SIZE * 0.75 }, + { 896, 2048, BLOCK_SIZE * 1, BLOCK_SIZE * 2 }, + { 768, 2208, BLOCK_SIZE * 1, BLOCK_SIZE * 0.75 }, + { 640, 2112, BLOCK_SIZE * 0.5, BLOCK_SIZE * 1.5 }, + { 704, 2144, BLOCK_SIZE * 0.5, BLOCK_SIZE * 1.25 }, + { 576, 2080, BLOCK_SIZE * 0.5, BLOCK_SIZE * 1.75 }, + { 512, 2048, BLOCK_SIZE * 0.5, BLOCK_SIZE * 2 }, + { 256, 1632, BLOCK_SIZE * 2, BLOCK_SIZE * 5.25 }, + { 0, 768, BLOCK_SIZE * 2, BLOCK_SIZE * 12.000001 }, + { 256, 1216, BLOCK_SIZE * 4, BLOCK_SIZE * 1.3750001 }, + { 768, 1440, BLOCK_SIZE * 1, BLOCK_SIZE * 1 }, + { 640, 1632, BLOCK_SIZE * 1, BLOCK_SIZE * 3 }, + { 768, 1632, BLOCK_SIZE * 0.5, BLOCK_SIZE * 2.125 }, + { 960, 1664, BLOCK_SIZE * 0.5, BLOCK_SIZE * 1.875 }, + { 832, 1712, BLOCK_SIZE * 1, BLOCK_SIZE * 1.5 }, + { 1024, 1440, BLOCK_SIZE * 2, BLOCK_SIZE * 3.375 }, + { 1120, 1408, BLOCK_SIZE * 1.25, BLOCK_SIZE * 0.25 }, + { 1280, 1376, BLOCK_SIZE * 1, BLOCK_SIZE * 1.5 }, + { 1216, 1376, BLOCK_SIZE * 0.5, BLOCK_SIZE * 0.25 }, + { 1728, 1408, BLOCK_SIZE * 0.5, BLOCK_SIZE * 3.25 }, + { 1536, 1568, BLOCK_SIZE * 0.5, BLOCK_SIZE * 2 }, + { 1792, 1536, BLOCK_SIZE * 0.5, BLOCK_SIZE * 2.25 }, + { 1856, 1568, BLOCK_SIZE * 0.5, BLOCK_SIZE * 2 }, + { 1920, 1600, BLOCK_SIZE * 0.5, BLOCK_SIZE * 1.7500001 }, + { 1984, 1632, BLOCK_SIZE * 2.5, BLOCK_SIZE * 1.5 }, + { 1408, 1696, BLOCK_SIZE * 1, BLOCK_SIZE * 1.125 }, + { 2304, 1696, BLOCK_SIZE * 0.75, BLOCK_SIZE * 1 }, + { 2400, 1664, BLOCK_SIZE * 0.75, BLOCK_SIZE * 1.25 }, + { 2496, 1632, BLOCK_SIZE * 0.5, BLOCK_SIZE * 1.5 }, + { 2560, 1536, BLOCK_SIZE * 2, BLOCK_SIZE * 2.25 }, + { 2176, 1280, BLOCK_SIZE * 1, BLOCK_SIZE * 2.25 }, + { 2304, 1440, BLOCK_SIZE * 1, BLOCK_SIZE * 1 }, + { 896, 1184, BLOCK_SIZE * 5, BLOCK_SIZE * 0.75 }, + { 384, 672, BLOCK_SIZE * 1.75, BLOCK_SIZE * 3.625 }, + { 608, 640, BLOCK_SIZE * 0.75, BLOCK_SIZE * 3.875 }, + { 704, 608, BLOCK_SIZE * 0.5, BLOCK_SIZE * 4.125 }, + { 768, 608, BLOCK_SIZE * 4, BLOCK_SIZE * 2.125 }, + { 768, 1008, BLOCK_SIZE * 2.5, BLOCK_SIZE * 0.375 }, + { 960, 960, BLOCK_SIZE * 1, BLOCK_SIZE * 0.375 }, + { 768, 928, BLOCK_SIZE * 0.5, BLOCK_SIZE * 0.625 }, + { 1216, 960, BLOCK_SIZE * 1, BLOCK_SIZE * 1.75 }, + { 1344, 960, BLOCK_SIZE * 3.5, BLOCK_SIZE * 1.3750001 }, + { 1792, 960, BLOCK_SIZE * 2, BLOCK_SIZE * 0.75 }, + { 1408, 512, BLOCK_SIZE * 3, BLOCK_SIZE * 2.2500002 }, + { 1408, 800, BLOCK_SIZE * 1, BLOCK_SIZE * 0.625 }, + { 1792, 2207, BLOCK_SIZE * 1, BLOCK_SIZE * 0.765625 }, + { 1600, 1792, BLOCK_SIZE * 1, BLOCK_SIZE * 0.25 }, + { 1408, 1840, BLOCK_SIZE * 1, BLOCK_SIZE * 0.5 }, + { 1344, 1136, BLOCK_SIZE * 1.5, BLOCK_SIZE * 0.37500018 }, + { -20, 0, BLOCK_SIZE * 0.15625, BLOCK_SIZE * 6.46875 }, + { 1536, 1376, BLOCK_SIZE * 0.5, BLOCK_SIZE * 1.5 }, + { 1024, 4.5776367E-05, BLOCK_SIZE * 2, BLOCK_SIZE * 4.03125 }, + { 768, 0, BLOCK_SIZE * 2, BLOCK_SIZE * 2.8750002 }, + { 512, 6.1035156E-05, BLOCK_SIZE * 2, BLOCK_SIZE * 4 }, + { 256, 3.0517578E-05, BLOCK_SIZE * 2, BLOCK_SIZE * 4.21875 }, + { 0, 4.0000305, BLOCK_SIZE * 2, BLOCK_SIZE * 4.75 }, + { 1276, -20, BLOCK_SIZE * 10.125, BLOCK_SIZE * 0.15625024 }, + { 896, 1280, BLOCK_SIZE * 1, BLOCK_SIZE * 0.1875 }, + { 2624, 960, BLOCK_SIZE * 3, BLOCK_SIZE * 2.3125 }, + { 1600, 1408, BLOCK_SIZE * 1, BLOCK_SIZE * 2.9999998 }, + { 832, 1664, BLOCK_SIZE * 1, BLOCK_SIZE * 0.39062476 }, + { 832, 960, BLOCK_SIZE * 1, BLOCK_SIZE * 0.39062476 }, +}; + +Zone* g_mapZone[21] = +{ + room_hideandseek2, + room_ravinemist, + room_dotdotdot, + room_deserttown, + room_youcantrun, + room_limpcity, + room_notperfect, + room_kindandfair, + room_act9, + room_nastyparadise, + room_pricelessfreedom, + room_volcanovalley, + room_greenhill, + room_majongforest, + room_angelisland, + room_torturecave, + room_dartower, + room_haundream, + room_weedzone, + room_marijuna, + room_fartzone +}; + +size_t g_mapZoneSize[21] = +{ + ARRAY_SIZE(room_hideandseek2), + ARRAY_SIZE(room_ravinemist), + ARRAY_SIZE(room_dotdotdot), + ARRAY_SIZE(room_deserttown), + ARRAY_SIZE(room_youcantrun), + ARRAY_SIZE(room_limpcity), + ARRAY_SIZE(room_notperfect), + ARRAY_SIZE(room_kindandfair), + ARRAY_SIZE(room_act9), + ARRAY_SIZE(room_nastyparadise), + ARRAY_SIZE(room_pricelessfreedom), + ARRAY_SIZE(room_volcanovalley), + ARRAY_SIZE(room_greenhill), + ARRAY_SIZE(room_majongforest), + ARRAY_SIZE(room_angelisland), + ARRAY_SIZE(room_torturecave), + ARRAY_SIZE(room_dartower), + ARRAY_SIZE(room_haundream), + ARRAY_SIZE(room_weedzone), + ARRAY_SIZE(room_marijuna), + ARRAY_SIZE(room_fartzone) +}; +#endif diff --git a/disasterserver_c/Zone.h b/disasterserver_c/Zone.h new file mode 100644 index 0000000..7f93334 --- /dev/null +++ b/disasterserver_c/Zone.h @@ -0,0 +1,14 @@ +#ifndef ZONE_H +#define ZONE_H +#include +#include + +typedef struct +{ + double x, y, w, h; +} Zone; + +extern Zone* g_mapZone[21]; +extern size_t g_mapZoneSize[21]; + +#endif \ No newline at end of file diff --git a/disasterserver_c/cJSON.c b/disasterserver_c/cJSON.c new file mode 100644 index 0000000..a994921 --- /dev/null +++ b/disasterserver_c/cJSON.c @@ -0,0 +1,3119 @@ +/* + Copyright (c) 2009-2017 Dave Gamble and cJSON contributors + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + THE SOFTWARE. +*/ + +/* cJSON */ +/* JSON parser in C. */ + +/* disable warnings about old C89 functions in MSVC */ +#if !defined(_CRT_SECURE_NO_DEPRECATE) && defined(_MSC_VER) +#define _CRT_SECURE_NO_DEPRECATE +#endif + +#ifdef __GNUC__ +#pragma GCC visibility push(default) +#endif +#if defined(_MSC_VER) +#pragma warning (push) +/* disable warning about single line comments in system headers */ +#pragma warning (disable : 4001) +#endif + +#include +#include +#include +#include +#include +#include +#include + +#ifdef ENABLE_LOCALES +#include +#endif + +#if defined(_MSC_VER) +#pragma warning (pop) +#endif +#ifdef __GNUC__ +#pragma GCC visibility pop +#endif + +#include "cJSON.h" + +/* define our own boolean type */ +#ifdef true +#undef true +#endif +#define true ((cJSON_bool)1) + +#ifdef false +#undef false +#endif +#define false ((cJSON_bool)0) + +/* define isnan and isinf for ANSI C, if in C99 or above, isnan and isinf has been defined in math.h */ +#ifndef isinf +#define isinf(d) (isnan((d - d)) && !isnan(d)) +#endif +#ifndef isnan +#define isnan(d) (d != d) +#endif + +#ifndef NAN +#ifdef _WIN32 +#define NAN sqrt(-1.0) +#else +#define NAN 0.0/0.0 +#endif +#endif + +typedef struct { + const unsigned char* json; + size_t position; +} error; +static error global_error = { NULL, 0 }; + +CJSON_PUBLIC(const char*) cJSON_GetErrorPtr(void) +{ + return (const char*)(global_error.json + global_error.position); +} + +CJSON_PUBLIC(char*) cJSON_GetStringValue(const cJSON* const item) +{ + if (!cJSON_IsString(item)) + { + return NULL; + } + + return item->valuestring; +} + +CJSON_PUBLIC(double) cJSON_GetNumberValue(const cJSON* const item) +{ + if (!cJSON_IsNumber(item)) + { + return (double)NAN; + } + + return item->valuedouble; +} + +/* This is a safeguard to prevent copy-pasters from using incompatible C and header files */ +#if (CJSON_VERSION_MAJOR != 1) || (CJSON_VERSION_MINOR != 7) || (CJSON_VERSION_PATCH != 16) +#error cJSON.h and cJSON.c have different versions. Make sure that both have the same. +#endif + +CJSON_PUBLIC(const char*) cJSON_Version(void) +{ + static char version[15]; + sprintf(version, "%i.%i.%i", CJSON_VERSION_MAJOR, CJSON_VERSION_MINOR, CJSON_VERSION_PATCH); + + return version; +} + +/* Case insensitive string comparison, doesn't consider two NULL pointers equal though */ +static int case_insensitive_strcmp(const unsigned char* string1, const unsigned char* string2) +{ + if ((string1 == NULL) || (string2 == NULL)) + { + return 1; + } + + if (string1 == string2) + { + return 0; + } + + for (; tolower(*string1) == tolower(*string2); (void)string1++, string2++) + { + if (*string1 == '\0') + { + return 0; + } + } + + return tolower(*string1) - tolower(*string2); +} + +typedef struct internal_hooks +{ + void* (CJSON_CDECL* allocate)(size_t size); + void (CJSON_CDECL* deallocate)(void* pointer); + void* (CJSON_CDECL* reallocate)(void* pointer, size_t size); +} internal_hooks; + +#if defined(_MSC_VER) +/* work around MSVC error C2322: '...' address of dllimport '...' is not static */ +static void* CJSON_CDECL internal_malloc(size_t size) +{ + return malloc(size); +} +static void CJSON_CDECL internal_free(void* pointer) +{ + free(pointer); +} +static void* CJSON_CDECL internal_realloc(void* pointer, size_t size) +{ + return realloc(pointer, size); +} +#else +#define internal_malloc malloc +#define internal_free free +#define internal_realloc realloc +#endif + +/* strlen of character literals resolved at compile time */ +#define static_strlen(string_literal) (sizeof(string_literal) - sizeof("")) + +static internal_hooks global_hooks = { internal_malloc, internal_free, internal_realloc }; + +static unsigned char* cJSON_strdup(const unsigned char* string, const internal_hooks* const hooks) +{ + size_t length = 0; + unsigned char* copy = NULL; + + if (string == NULL) + { + return NULL; + } + + length = strlen((const char*)string) + sizeof(""); + copy = (unsigned char*)hooks->allocate(length); + if (copy == NULL) + { + return NULL; + } + memcpy(copy, string, length); + + return copy; +} + +CJSON_PUBLIC(void) cJSON_InitHooks(cJSON_Hooks* hooks) +{ + if (hooks == NULL) + { + /* Reset hooks */ + global_hooks.allocate = malloc; + global_hooks.deallocate = free; + global_hooks.reallocate = realloc; + return; + } + + global_hooks.allocate = malloc; + if (hooks->malloc_fn != NULL) + { + global_hooks.allocate = hooks->malloc_fn; + } + + global_hooks.deallocate = free; + if (hooks->free_fn != NULL) + { + global_hooks.deallocate = hooks->free_fn; + } + + /* use realloc only if both free and malloc are used */ + global_hooks.reallocate = NULL; + if ((global_hooks.allocate == malloc) && (global_hooks.deallocate == free)) + { + global_hooks.reallocate = realloc; + } +} + +/* Internal constructor. */ +static cJSON* cJSON_New_Item(const internal_hooks* const hooks) +{ + cJSON* node = (cJSON*)hooks->allocate(sizeof(cJSON)); + if (node) + { + memset(node, '\0', sizeof(cJSON)); + } + + return node; +} + +/* Delete a cJSON structure. */ +CJSON_PUBLIC(void) cJSON_Delete(cJSON* item) +{ + cJSON* next = NULL; + while (item != NULL) + { + next = item->next; + if (!(item->type & cJSON_IsReference) && (item->child != NULL)) + { + cJSON_Delete(item->child); + } + if (!(item->type & cJSON_IsReference) && (item->valuestring != NULL)) + { + global_hooks.deallocate(item->valuestring); + } + if (!(item->type & cJSON_StringIsConst) && (item->string != NULL)) + { + global_hooks.deallocate(item->string); + } + global_hooks.deallocate(item); + item = next; + } +} + +/* get the decimal point character of the current locale */ +static unsigned char get_decimal_point(void) +{ +#ifdef ENABLE_LOCALES + struct lconv* lconv = localeconv(); + return (unsigned char)lconv->decimal_point[0]; +#else + return '.'; +#endif +} + +typedef struct +{ + const unsigned char* content; + size_t length; + size_t offset; + size_t depth; /* How deeply nested (in arrays/objects) is the input at the current offset. */ + internal_hooks hooks; +} parse_buffer; + +/* check if the given size is left to read in a given parse buffer (starting with 1) */ +#define can_read(buffer, size) ((buffer != NULL) && (((buffer)->offset + size) <= (buffer)->length)) +/* check if the buffer can be accessed at the given index (starting with 0) */ +#define can_access_at_index(buffer, index) ((buffer != NULL) && (((buffer)->offset + index) < (buffer)->length)) +#define cannot_access_at_index(buffer, index) (!can_access_at_index(buffer, index)) +/* get a pointer to the buffer at the position */ +#define buffer_at_offset(buffer) ((buffer)->content + (buffer)->offset) + +/* Parse the input text to generate a number, and populate the result into item. */ +static cJSON_bool parse_number(cJSON* const item, parse_buffer* const input_buffer) +{ + double number = 0; + unsigned char* after_end = NULL; + unsigned char number_c_string[64]; + unsigned char decimal_point = get_decimal_point(); + size_t i = 0; + + if ((input_buffer == NULL) || (input_buffer->content == NULL)) + { + return false; + } + + /* copy the number into a temporary buffer and replace '.' with the decimal point + * of the current locale (for strtod) + * This also takes care of '\0' not necessarily being available for marking the end of the input */ + for (i = 0; (i < (sizeof(number_c_string) - 1)) && can_access_at_index(input_buffer, i); i++) + { + switch (buffer_at_offset(input_buffer)[i]) + { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case '+': + case '-': + case 'e': + case 'E': + number_c_string[i] = buffer_at_offset(input_buffer)[i]; + break; + + case '.': + number_c_string[i] = decimal_point; + break; + + default: + goto loop_end; + } + } +loop_end: + number_c_string[i] = '\0'; + + number = strtod((const char*)number_c_string, (char**)&after_end); + if (number_c_string == after_end) + { + return false; /* parse_error */ + } + + item->valuedouble = number; + + /* use saturation in case of overflow */ + if (number >= INT_MAX) + { + item->valueint = INT_MAX; + } + else if (number <= (double)INT_MIN) + { + item->valueint = INT_MIN; + } + else + { + item->valueint = (int)number; + } + + item->type = cJSON_Number; + + input_buffer->offset += (size_t)(after_end - number_c_string); + return true; +} + +/* don't ask me, but the original cJSON_SetNumberValue returns an integer or double */ +CJSON_PUBLIC(double) cJSON_SetNumberHelper(cJSON* object, double number) +{ + if (number >= INT_MAX) + { + object->valueint = INT_MAX; + } + else if (number <= (double)INT_MIN) + { + object->valueint = INT_MIN; + } + else + { + object->valueint = (int)number; + } + + return object->valuedouble = number; +} + +CJSON_PUBLIC(char*) cJSON_SetValuestring(cJSON* object, const char* valuestring) +{ + char* copy = NULL; + /* if object's type is not cJSON_String or is cJSON_IsReference, it should not set valuestring */ + if (!(object->type & cJSON_String) || (object->type & cJSON_IsReference)) + { + return NULL; + } + if (strlen(valuestring) <= strlen(object->valuestring)) + { + strcpy(object->valuestring, valuestring); + return object->valuestring; + } + copy = (char*)cJSON_strdup((const unsigned char*)valuestring, &global_hooks); + if (copy == NULL) + { + return NULL; + } + if (object->valuestring != NULL) + { + cJSON_free(object->valuestring); + } + object->valuestring = copy; + + return copy; +} + +typedef struct +{ + unsigned char* buffer; + size_t length; + size_t offset; + size_t depth; /* current nesting depth (for formatted printing) */ + cJSON_bool noalloc; + cJSON_bool format; /* is this print a formatted print */ + internal_hooks hooks; +} printbuffer; + +/* realloc printbuffer if necessary to have at least "needed" bytes more */ +static unsigned char* ensure(printbuffer* const p, size_t needed) +{ + unsigned char* newbuffer = NULL; + size_t newsize = 0; + + if ((p == NULL) || (p->buffer == NULL)) + { + return NULL; + } + + if ((p->length > 0) && (p->offset >= p->length)) + { + /* make sure that offset is valid */ + return NULL; + } + + if (needed > INT_MAX) + { + /* sizes bigger than INT_MAX are currently not supported */ + return NULL; + } + + needed += p->offset + 1; + if (needed <= p->length) + { + return p->buffer + p->offset; + } + + if (p->noalloc) { + return NULL; + } + + /* calculate new buffer size */ + if (needed > (INT_MAX / 2)) + { + /* overflow of int, use INT_MAX if possible */ + if (needed <= INT_MAX) + { + newsize = INT_MAX; + } + else + { + return NULL; + } + } + else + { + newsize = needed * 2; + } + + if (p->hooks.reallocate != NULL) + { + /* reallocate with realloc if available */ + newbuffer = (unsigned char*)p->hooks.reallocate(p->buffer, newsize); + if (newbuffer == NULL) + { + p->hooks.deallocate(p->buffer); + p->length = 0; + p->buffer = NULL; + + return NULL; + } + } + else + { + /* otherwise reallocate manually */ + newbuffer = (unsigned char*)p->hooks.allocate(newsize); + if (!newbuffer) + { + p->hooks.deallocate(p->buffer); + p->length = 0; + p->buffer = NULL; + + return NULL; + } + + memcpy(newbuffer, p->buffer, p->offset + 1); + p->hooks.deallocate(p->buffer); + } + p->length = newsize; + p->buffer = newbuffer; + + return newbuffer + p->offset; +} + +/* calculate the new length of the string in a printbuffer and update the offset */ +static void update_offset(printbuffer* const buffer) +{ + const unsigned char* buffer_pointer = NULL; + if ((buffer == NULL) || (buffer->buffer == NULL)) + { + return; + } + buffer_pointer = buffer->buffer + buffer->offset; + + buffer->offset += strlen((const char*)buffer_pointer); +} + +/* securely comparison of floating-point variables */ +static cJSON_bool compare_double(double a, double b) +{ + double maxVal = fabs(a) > fabs(b) ? fabs(a) : fabs(b); + return (fabs(a - b) <= maxVal * DBL_EPSILON); +} + +/* Render the number nicely from the given item into a string. */ +static cJSON_bool print_number(const cJSON* const item, printbuffer* const output_buffer) +{ + unsigned char* output_pointer = NULL; + double d = item->valuedouble; + int length = 0; + size_t i = 0; + unsigned char number_buffer[26] = { 0 }; /* temporary buffer to print the number into */ + unsigned char decimal_point = get_decimal_point(); + double test = 0.0; + + if (output_buffer == NULL) + { + return false; + } + + /* This checks for NaN and Infinity */ + if (isnan(d) || isinf(d)) + { + length = sprintf((char*)number_buffer, "null"); + } + else if (d == (double)item->valueint) + { + length = sprintf((char*)number_buffer, "%d", item->valueint); + } + else + { + /* Try 15 decimal places of precision to avoid nonsignificant nonzero digits */ + length = sprintf((char*)number_buffer, "%1.15g", d); + + /* Check whether the original double can be recovered */ + if ((sscanf((char*)number_buffer, "%lg", &test) != 1) || !compare_double((double)test, d)) + { + /* If not, print with 17 decimal places of precision */ + length = sprintf((char*)number_buffer, "%1.17g", d); + } + } + + /* sprintf failed or buffer overrun occurred */ + if ((length < 0) || (length > (int)(sizeof(number_buffer) - 1))) + { + return false; + } + + /* reserve appropriate space in the output */ + output_pointer = ensure(output_buffer, (size_t)length + sizeof("")); + if (output_pointer == NULL) + { + return false; + } + + /* copy the printed number to the output and replace locale + * dependent decimal point with '.' */ + for (i = 0; i < ((size_t)length); i++) + { + if (number_buffer[i] == decimal_point) + { + output_pointer[i] = '.'; + continue; + } + + output_pointer[i] = number_buffer[i]; + } + output_pointer[i] = '\0'; + + output_buffer->offset += (size_t)length; + + return true; +} + +/* parse 4 digit hexadecimal number */ +static unsigned parse_hex4(const unsigned char* const input) +{ + unsigned int h = 0; + size_t i = 0; + + for (i = 0; i < 4; i++) + { + /* parse digit */ + if ((input[i] >= '0') && (input[i] <= '9')) + { + h += (unsigned int)input[i] - '0'; + } + else if ((input[i] >= 'A') && (input[i] <= 'F')) + { + h += (unsigned int)10 + input[i] - 'A'; + } + else if ((input[i] >= 'a') && (input[i] <= 'f')) + { + h += (unsigned int)10 + input[i] - 'a'; + } + else /* invalid */ + { + return 0; + } + + if (i < 3) + { + /* shift left to make place for the next nibble */ + h = h << 4; + } + } + + return h; +} + +/* converts a UTF-16 literal to UTF-8 + * A literal can be one or two sequences of the form \uXXXX */ +static unsigned char utf16_literal_to_utf8(const unsigned char* const input_pointer, const unsigned char* const input_end, unsigned char** output_pointer) +{ + long unsigned int codepoint = 0; + unsigned int first_code = 0; + const unsigned char* first_sequence = input_pointer; + unsigned char utf8_length = 0; + unsigned char utf8_position = 0; + unsigned char sequence_length = 0; + unsigned char first_byte_mark = 0; + + if ((input_end - first_sequence) < 6) + { + /* input ends unexpectedly */ + goto fail; + } + + /* get the first utf16 sequence */ + first_code = parse_hex4(first_sequence + 2); + + /* check that the code is valid */ + if (((first_code >= 0xDC00) && (first_code <= 0xDFFF))) + { + goto fail; + } + + /* UTF16 surrogate pair */ + if ((first_code >= 0xD800) && (first_code <= 0xDBFF)) + { + const unsigned char* second_sequence = first_sequence + 6; + unsigned int second_code = 0; + sequence_length = 12; /* \uXXXX\uXXXX */ + + if ((input_end - second_sequence) < 6) + { + /* input ends unexpectedly */ + goto fail; + } + + if ((second_sequence[0] != '\\') || (second_sequence[1] != 'u')) + { + /* missing second half of the surrogate pair */ + goto fail; + } + + /* get the second utf16 sequence */ + second_code = parse_hex4(second_sequence + 2); + /* check that the code is valid */ + if ((second_code < 0xDC00) || (second_code > 0xDFFF)) + { + /* invalid second half of the surrogate pair */ + goto fail; + } + + + /* calculate the unicode codepoint from the surrogate pair */ + codepoint = 0x10000 + (((first_code & 0x3FF) << 10) | (second_code & 0x3FF)); + } + else + { + sequence_length = 6; /* \uXXXX */ + codepoint = first_code; + } + + /* encode as UTF-8 + * takes at maximum 4 bytes to encode: + * 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx */ + if (codepoint < 0x80) + { + /* normal ascii, encoding 0xxxxxxx */ + utf8_length = 1; + } + else if (codepoint < 0x800) + { + /* two bytes, encoding 110xxxxx 10xxxxxx */ + utf8_length = 2; + first_byte_mark = 0xC0; /* 11000000 */ + } + else if (codepoint < 0x10000) + { + /* three bytes, encoding 1110xxxx 10xxxxxx 10xxxxxx */ + utf8_length = 3; + first_byte_mark = 0xE0; /* 11100000 */ + } + else if (codepoint <= 0x10FFFF) + { + /* four bytes, encoding 1110xxxx 10xxxxxx 10xxxxxx 10xxxxxx */ + utf8_length = 4; + first_byte_mark = 0xF0; /* 11110000 */ + } + else + { + /* invalid unicode codepoint */ + goto fail; + } + + /* encode as utf8 */ + for (utf8_position = (unsigned char)(utf8_length - 1); utf8_position > 0; utf8_position--) + { + /* 10xxxxxx */ + (*output_pointer)[utf8_position] = (unsigned char)((codepoint | 0x80) & 0xBF); + codepoint >>= 6; + } + /* encode first byte */ + if (utf8_length > 1) + { + (*output_pointer)[0] = (unsigned char)((codepoint | first_byte_mark) & 0xFF); + } + else + { + (*output_pointer)[0] = (unsigned char)(codepoint & 0x7F); + } + + *output_pointer += utf8_length; + + return sequence_length; + +fail: + return 0; +} + +/* Parse the input text into an unescaped cinput, and populate item. */ +static cJSON_bool parse_string(cJSON* const item, parse_buffer* const input_buffer) +{ + const unsigned char* input_pointer = buffer_at_offset(input_buffer) + 1; + const unsigned char* input_end = buffer_at_offset(input_buffer) + 1; + unsigned char* output_pointer = NULL; + unsigned char* output = NULL; + + /* not a string */ + if (buffer_at_offset(input_buffer)[0] != '\"') + { + goto fail; + } + + { + /* calculate approximate size of the output (overestimate) */ + size_t allocation_length = 0; + size_t skipped_bytes = 0; + while (((size_t)(input_end - input_buffer->content) < input_buffer->length) && (*input_end != '\"')) + { + /* is escape sequence */ + if (input_end[0] == '\\') + { + if ((size_t)(input_end + 1 - input_buffer->content) >= input_buffer->length) + { + /* prevent buffer overflow when last input character is a backslash */ + goto fail; + } + skipped_bytes++; + input_end++; + } + input_end++; + } + if (((size_t)(input_end - input_buffer->content) >= input_buffer->length) || (*input_end != '\"')) + { + goto fail; /* string ended unexpectedly */ + } + + /* This is at most how much we need for the output */ + allocation_length = (size_t)(input_end - buffer_at_offset(input_buffer)) - skipped_bytes; + output = (unsigned char*)input_buffer->hooks.allocate(allocation_length + sizeof("")); + if (output == NULL) + { + goto fail; /* allocation failure */ + } + } + + output_pointer = output; + /* loop through the string literal */ + while (input_pointer < input_end) + { + if (*input_pointer != '\\') + { + *output_pointer++ = *input_pointer++; + } + /* escape sequence */ + else + { + unsigned char sequence_length = 2; + if ((input_end - input_pointer) < 1) + { + goto fail; + } + + switch (input_pointer[1]) + { + case 'b': + *output_pointer++ = '\b'; + break; + case 'f': + *output_pointer++ = '\f'; + break; + case 'n': + *output_pointer++ = '\n'; + break; + case 'r': + *output_pointer++ = '\r'; + break; + case 't': + *output_pointer++ = '\t'; + break; + case '\"': + case '\\': + case '/': + *output_pointer++ = input_pointer[1]; + break; + + /* UTF-16 literal */ + case 'u': + sequence_length = utf16_literal_to_utf8(input_pointer, input_end, &output_pointer); + if (sequence_length == 0) + { + /* failed to convert UTF16-literal to UTF-8 */ + goto fail; + } + break; + + default: + goto fail; + } + input_pointer += sequence_length; + } + } + + /* zero terminate the output */ + *output_pointer = '\0'; + + item->type = cJSON_String; + item->valuestring = (char*)output; + + input_buffer->offset = (size_t)(input_end - input_buffer->content); + input_buffer->offset++; + + return true; + +fail: + if (output != NULL) + { + input_buffer->hooks.deallocate(output); + } + + if (input_pointer != NULL) + { + input_buffer->offset = (size_t)(input_pointer - input_buffer->content); + } + + return false; +} + +/* Render the cstring provided to an escaped version that can be printed. */ +static cJSON_bool print_string_ptr(const unsigned char* const input, printbuffer* const output_buffer) +{ + const unsigned char* input_pointer = NULL; + unsigned char* output = NULL; + unsigned char* output_pointer = NULL; + size_t output_length = 0; + /* numbers of additional characters needed for escaping */ + size_t escape_characters = 0; + + if (output_buffer == NULL) + { + return false; + } + + /* empty string */ + if (input == NULL) + { + output = ensure(output_buffer, sizeof("\"\"")); + if (output == NULL) + { + return false; + } + strcpy((char*)output, "\"\""); + + return true; + } + + /* set "flag" to 1 if something needs to be escaped */ + for (input_pointer = input; *input_pointer; input_pointer++) + { + switch (*input_pointer) + { + case '\"': + case '\\': + case '\b': + case '\f': + case '\n': + case '\r': + case '\t': + /* one character escape sequence */ + escape_characters++; + break; + default: + if (*input_pointer < 32) + { + /* UTF-16 escape sequence uXXXX */ + escape_characters += 5; + } + break; + } + } + output_length = (size_t)(input_pointer - input) + escape_characters; + + output = ensure(output_buffer, output_length + sizeof("\"\"")); + if (output == NULL) + { + return false; + } + + /* no characters have to be escaped */ + if (escape_characters == 0) + { + output[0] = '\"'; + memcpy(output + 1, input, output_length); + output[output_length + 1] = '\"'; + output[output_length + 2] = '\0'; + + return true; + } + + output[0] = '\"'; + output_pointer = output + 1; + /* copy the string */ + for (input_pointer = input; *input_pointer != '\0'; (void)input_pointer++, output_pointer++) + { + if ((*input_pointer > 31) && (*input_pointer != '\"') && (*input_pointer != '\\')) + { + /* normal character, copy */ + *output_pointer = *input_pointer; + } + else + { + /* character needs to be escaped */ + *output_pointer++ = '\\'; + switch (*input_pointer) + { + case '\\': + *output_pointer = '\\'; + break; + case '\"': + *output_pointer = '\"'; + break; + case '\b': + *output_pointer = 'b'; + break; + case '\f': + *output_pointer = 'f'; + break; + case '\n': + *output_pointer = 'n'; + break; + case '\r': + *output_pointer = 'r'; + break; + case '\t': + *output_pointer = 't'; + break; + default: + /* escape and print as unicode codepoint */ + sprintf((char*)output_pointer, "u%04x", *input_pointer); + output_pointer += 4; + break; + } + } + } + output[output_length + 1] = '\"'; + output[output_length + 2] = '\0'; + + return true; +} + +/* Invoke print_string_ptr (which is useful) on an item. */ +static cJSON_bool print_string(const cJSON* const item, printbuffer* const p) +{ + return print_string_ptr((unsigned char*)item->valuestring, p); +} + +/* Predeclare these prototypes. */ +static cJSON_bool parse_value(cJSON* const item, parse_buffer* const input_buffer); +static cJSON_bool print_value(const cJSON* const item, printbuffer* const output_buffer); +static cJSON_bool parse_array(cJSON* const item, parse_buffer* const input_buffer); +static cJSON_bool print_array(const cJSON* const item, printbuffer* const output_buffer); +static cJSON_bool parse_object(cJSON* const item, parse_buffer* const input_buffer); +static cJSON_bool print_object(const cJSON* const item, printbuffer* const output_buffer); + +/* Utility to jump whitespace and cr/lf */ +static parse_buffer* buffer_skip_whitespace(parse_buffer* const buffer) +{ + if ((buffer == NULL) || (buffer->content == NULL)) + { + return NULL; + } + + if (cannot_access_at_index(buffer, 0)) + { + return buffer; + } + + while (can_access_at_index(buffer, 0) && (buffer_at_offset(buffer)[0] <= 32)) + { + buffer->offset++; + } + + if (buffer->offset == buffer->length) + { + buffer->offset--; + } + + return buffer; +} + +/* skip the UTF-8 BOM (byte order mark) if it is at the beginning of a buffer */ +static parse_buffer* skip_utf8_bom(parse_buffer* const buffer) +{ + if ((buffer == NULL) || (buffer->content == NULL) || (buffer->offset != 0)) + { + return NULL; + } + + if (can_access_at_index(buffer, 4) && (strncmp((const char*)buffer_at_offset(buffer), "\xEF\xBB\xBF", 3) == 0)) + { + buffer->offset += 3; + } + + return buffer; +} + +CJSON_PUBLIC(cJSON*) cJSON_ParseWithOpts(const char* value, const char** return_parse_end, cJSON_bool require_null_terminated) +{ + size_t buffer_length; + + if (NULL == value) + { + return NULL; + } + + /* Adding null character size due to require_null_terminated. */ + buffer_length = strlen(value) + sizeof(""); + + return cJSON_ParseWithLengthOpts(value, buffer_length, return_parse_end, require_null_terminated); +} + +/* Parse an object - create a new root, and populate. */ +CJSON_PUBLIC(cJSON*) cJSON_ParseWithLengthOpts(const char* value, size_t buffer_length, const char** return_parse_end, cJSON_bool require_null_terminated) +{ + parse_buffer buffer = { 0, 0, 0, 0, { 0, 0, 0 } }; + cJSON* item = NULL; + + /* reset error position */ + global_error.json = NULL; + global_error.position = 0; + + if (value == NULL || 0 == buffer_length) + { + goto fail; + } + + buffer.content = (const unsigned char*)value; + buffer.length = buffer_length; + buffer.offset = 0; + buffer.hooks = global_hooks; + + item = cJSON_New_Item(&global_hooks); + if (item == NULL) /* memory fail */ + { + goto fail; + } + + if (!parse_value(item, buffer_skip_whitespace(skip_utf8_bom(&buffer)))) + { + /* parse failure. ep is set. */ + goto fail; + } + + /* if we require null-terminated JSON without appended garbage, skip and then check for a null terminator */ + if (require_null_terminated) + { + buffer_skip_whitespace(&buffer); + if ((buffer.offset >= buffer.length) || buffer_at_offset(&buffer)[0] != '\0') + { + goto fail; + } + } + if (return_parse_end) + { + *return_parse_end = (const char*)buffer_at_offset(&buffer); + } + + return item; + +fail: + if (item != NULL) + { + cJSON_Delete(item); + } + + if (value != NULL) + { + error local_error; + local_error.json = (const unsigned char*)value; + local_error.position = 0; + + if (buffer.offset < buffer.length) + { + local_error.position = buffer.offset; + } + else if (buffer.length > 0) + { + local_error.position = buffer.length - 1; + } + + if (return_parse_end != NULL) + { + *return_parse_end = (const char*)local_error.json + local_error.position; + } + + global_error = local_error; + } + + return NULL; +} + +/* Default options for cJSON_Parse */ +CJSON_PUBLIC(cJSON*) cJSON_Parse(const char* value) +{ + return cJSON_ParseWithOpts(value, 0, 0); +} + +CJSON_PUBLIC(cJSON*) cJSON_ParseWithLength(const char* value, size_t buffer_length) +{ + return cJSON_ParseWithLengthOpts(value, buffer_length, 0, 0); +} + +#define cjson_min(a, b) (((a) < (b)) ? (a) : (b)) + +static unsigned char* print(const cJSON* const item, cJSON_bool format, const internal_hooks* const hooks) +{ + static const size_t default_buffer_size = 256; + printbuffer buffer[1]; + unsigned char* printed = NULL; + + memset(buffer, 0, sizeof(buffer)); + + /* create buffer */ + buffer->buffer = (unsigned char*)hooks->allocate(default_buffer_size); + buffer->length = default_buffer_size; + buffer->format = format; + buffer->hooks = *hooks; + if (buffer->buffer == NULL) + { + goto fail; + } + + /* print the value */ + if (!print_value(item, buffer)) + { + goto fail; + } + update_offset(buffer); + + /* check if reallocate is available */ + if (hooks->reallocate != NULL) + { + printed = (unsigned char*)hooks->reallocate(buffer->buffer, buffer->offset + 1); + if (printed == NULL) { + goto fail; + } + buffer->buffer = NULL; + } + else /* otherwise copy the JSON over to a new buffer */ + { + printed = (unsigned char*)hooks->allocate(buffer->offset + 1); + if (printed == NULL) + { + goto fail; + } + memcpy(printed, buffer->buffer, cjson_min(buffer->length, buffer->offset + 1)); + printed[buffer->offset] = '\0'; /* just to be sure */ + + /* free the buffer */ + hooks->deallocate(buffer->buffer); + } + + return printed; + +fail: + if (buffer->buffer != NULL) + { + hooks->deallocate(buffer->buffer); + } + + if (printed != NULL) + { + hooks->deallocate(printed); + } + + return NULL; +} + +/* Render a cJSON item/entity/structure to text. */ +CJSON_PUBLIC(char*) cJSON_Print(const cJSON* item) +{ + return (char*)print(item, true, &global_hooks); +} + +CJSON_PUBLIC(char*) cJSON_PrintUnformatted(const cJSON* item) +{ + return (char*)print(item, false, &global_hooks); +} + +CJSON_PUBLIC(char*) cJSON_PrintBuffered(const cJSON* item, int prebuffer, cJSON_bool fmt) +{ + printbuffer p = { 0, 0, 0, 0, 0, 0, { 0, 0, 0 } }; + + if (prebuffer < 0) + { + return NULL; + } + + p.buffer = (unsigned char*)global_hooks.allocate((size_t)prebuffer); + if (!p.buffer) + { + return NULL; + } + + p.length = (size_t)prebuffer; + p.offset = 0; + p.noalloc = false; + p.format = fmt; + p.hooks = global_hooks; + + if (!print_value(item, &p)) + { + global_hooks.deallocate(p.buffer); + return NULL; + } + + return (char*)p.buffer; +} + +CJSON_PUBLIC(cJSON_bool) cJSON_PrintPreallocated(cJSON* item, char* buffer, const int length, const cJSON_bool format) +{ + printbuffer p = { 0, 0, 0, 0, 0, 0, { 0, 0, 0 } }; + + if ((length < 0) || (buffer == NULL)) + { + return false; + } + + p.buffer = (unsigned char*)buffer; + p.length = (size_t)length; + p.offset = 0; + p.noalloc = true; + p.format = format; + p.hooks = global_hooks; + + return print_value(item, &p); +} + +/* Parser core - when encountering text, process appropriately. */ +static cJSON_bool parse_value(cJSON* const item, parse_buffer* const input_buffer) +{ + if ((input_buffer == NULL) || (input_buffer->content == NULL)) + { + return false; /* no input */ + } + + /* parse the different types of values */ + /* null */ + if (can_read(input_buffer, 4) && (strncmp((const char*)buffer_at_offset(input_buffer), "null", 4) == 0)) + { + item->type = cJSON_NULL; + input_buffer->offset += 4; + return true; + } + /* false */ + if (can_read(input_buffer, 5) && (strncmp((const char*)buffer_at_offset(input_buffer), "false", 5) == 0)) + { + item->type = cJSON_False; + input_buffer->offset += 5; + return true; + } + /* true */ + if (can_read(input_buffer, 4) && (strncmp((const char*)buffer_at_offset(input_buffer), "true", 4) == 0)) + { + item->type = cJSON_True; + item->valueint = 1; + input_buffer->offset += 4; + return true; + } + /* string */ + if (can_access_at_index(input_buffer, 0) && (buffer_at_offset(input_buffer)[0] == '\"')) + { + return parse_string(item, input_buffer); + } + /* number */ + if (can_access_at_index(input_buffer, 0) && ((buffer_at_offset(input_buffer)[0] == '-') || ((buffer_at_offset(input_buffer)[0] >= '0') && (buffer_at_offset(input_buffer)[0] <= '9')))) + { + return parse_number(item, input_buffer); + } + /* array */ + if (can_access_at_index(input_buffer, 0) && (buffer_at_offset(input_buffer)[0] == '[')) + { + return parse_array(item, input_buffer); + } + /* object */ + if (can_access_at_index(input_buffer, 0) && (buffer_at_offset(input_buffer)[0] == '{')) + { + return parse_object(item, input_buffer); + } + + return false; +} + +/* Render a value to text. */ +static cJSON_bool print_value(const cJSON* const item, printbuffer* const output_buffer) +{ + unsigned char* output = NULL; + + if ((item == NULL) || (output_buffer == NULL)) + { + return false; + } + + switch ((item->type) & 0xFF) + { + case cJSON_NULL: + output = ensure(output_buffer, 5); + if (output == NULL) + { + return false; + } + strcpy((char*)output, "null"); + return true; + + case cJSON_False: + output = ensure(output_buffer, 6); + if (output == NULL) + { + return false; + } + strcpy((char*)output, "false"); + return true; + + case cJSON_True: + output = ensure(output_buffer, 5); + if (output == NULL) + { + return false; + } + strcpy((char*)output, "true"); + return true; + + case cJSON_Number: + return print_number(item, output_buffer); + + case cJSON_Raw: + { + size_t raw_length = 0; + if (item->valuestring == NULL) + { + return false; + } + + raw_length = strlen(item->valuestring) + sizeof(""); + output = ensure(output_buffer, raw_length); + if (output == NULL) + { + return false; + } + memcpy(output, item->valuestring, raw_length); + return true; + } + + case cJSON_String: + return print_string(item, output_buffer); + + case cJSON_Array: + return print_array(item, output_buffer); + + case cJSON_Object: + return print_object(item, output_buffer); + + default: + return false; + } +} + +/* Build an array from input text. */ +static cJSON_bool parse_array(cJSON* const item, parse_buffer* const input_buffer) +{ + cJSON* head = NULL; /* head of the linked list */ + cJSON* current_item = NULL; + + if (input_buffer->depth >= CJSON_NESTING_LIMIT) + { + return false; /* to deeply nested */ + } + input_buffer->depth++; + + if (buffer_at_offset(input_buffer)[0] != '[') + { + /* not an array */ + goto fail; + } + + input_buffer->offset++; + buffer_skip_whitespace(input_buffer); + if (can_access_at_index(input_buffer, 0) && (buffer_at_offset(input_buffer)[0] == ']')) + { + /* empty array */ + goto success; + } + + /* check if we skipped to the end of the buffer */ + if (cannot_access_at_index(input_buffer, 0)) + { + input_buffer->offset--; + goto fail; + } + + /* step back to character in front of the first element */ + input_buffer->offset--; + /* loop through the comma separated array elements */ + do + { + /* allocate next item */ + cJSON* new_item = cJSON_New_Item(&(input_buffer->hooks)); + if (new_item == NULL) + { + goto fail; /* allocation failure */ + } + + /* attach next item to list */ + if (head == NULL) + { + /* start the linked list */ + current_item = head = new_item; + } + else + { + /* add to the end and advance */ + current_item->next = new_item; + new_item->prev = current_item; + current_item = new_item; + } + + /* parse next value */ + input_buffer->offset++; + buffer_skip_whitespace(input_buffer); + if (!parse_value(current_item, input_buffer)) + { + goto fail; /* failed to parse value */ + } + buffer_skip_whitespace(input_buffer); + } while (can_access_at_index(input_buffer, 0) && (buffer_at_offset(input_buffer)[0] == ',')); + + if (cannot_access_at_index(input_buffer, 0) || buffer_at_offset(input_buffer)[0] != ']') + { + goto fail; /* expected end of array */ + } + +success: + input_buffer->depth--; + + if (head != NULL) { + head->prev = current_item; + } + + item->type = cJSON_Array; + item->child = head; + + input_buffer->offset++; + + return true; + +fail: + if (head != NULL) + { + cJSON_Delete(head); + } + + return false; +} + +/* Render an array to text */ +static cJSON_bool print_array(const cJSON* const item, printbuffer* const output_buffer) +{ + unsigned char* output_pointer = NULL; + size_t length = 0; + cJSON* current_element = item->child; + + if (output_buffer == NULL) + { + return false; + } + + /* Compose the output array. */ + /* opening square bracket */ + output_pointer = ensure(output_buffer, 1); + if (output_pointer == NULL) + { + return false; + } + + *output_pointer = '['; + output_buffer->offset++; + output_buffer->depth++; + + while (current_element != NULL) + { + if (!print_value(current_element, output_buffer)) + { + return false; + } + update_offset(output_buffer); + if (current_element->next) + { + length = (size_t)(output_buffer->format ? 2 : 1); + output_pointer = ensure(output_buffer, length + 1); + if (output_pointer == NULL) + { + return false; + } + *output_pointer++ = ','; + if (output_buffer->format) + { + *output_pointer++ = ' '; + } + *output_pointer = '\0'; + output_buffer->offset += length; + } + current_element = current_element->next; + } + + output_pointer = ensure(output_buffer, 2); + if (output_pointer == NULL) + { + return false; + } + *output_pointer++ = ']'; + *output_pointer = '\0'; + output_buffer->depth--; + + return true; +} + +/* Build an object from the text. */ +static cJSON_bool parse_object(cJSON* const item, parse_buffer* const input_buffer) +{ + cJSON* head = NULL; /* linked list head */ + cJSON* current_item = NULL; + + if (input_buffer->depth >= CJSON_NESTING_LIMIT) + { + return false; /* to deeply nested */ + } + input_buffer->depth++; + + if (cannot_access_at_index(input_buffer, 0) || (buffer_at_offset(input_buffer)[0] != '{')) + { + goto fail; /* not an object */ + } + + input_buffer->offset++; + buffer_skip_whitespace(input_buffer); + if (can_access_at_index(input_buffer, 0) && (buffer_at_offset(input_buffer)[0] == '}')) + { + goto success; /* empty object */ + } + + /* check if we skipped to the end of the buffer */ + if (cannot_access_at_index(input_buffer, 0)) + { + input_buffer->offset--; + goto fail; + } + + /* step back to character in front of the first element */ + input_buffer->offset--; + /* loop through the comma separated array elements */ + do + { + /* allocate next item */ + cJSON* new_item = cJSON_New_Item(&(input_buffer->hooks)); + if (new_item == NULL) + { + goto fail; /* allocation failure */ + } + + /* attach next item to list */ + if (head == NULL) + { + /* start the linked list */ + current_item = head = new_item; + } + else + { + /* add to the end and advance */ + current_item->next = new_item; + new_item->prev = current_item; + current_item = new_item; + } + + /* parse the name of the child */ + input_buffer->offset++; + buffer_skip_whitespace(input_buffer); + if (!parse_string(current_item, input_buffer)) + { + goto fail; /* failed to parse name */ + } + buffer_skip_whitespace(input_buffer); + + /* swap valuestring and string, because we parsed the name */ + current_item->string = current_item->valuestring; + current_item->valuestring = NULL; + + if (cannot_access_at_index(input_buffer, 0) || (buffer_at_offset(input_buffer)[0] != ':')) + { + goto fail; /* invalid object */ + } + + /* parse the value */ + input_buffer->offset++; + buffer_skip_whitespace(input_buffer); + if (!parse_value(current_item, input_buffer)) + { + goto fail; /* failed to parse value */ + } + buffer_skip_whitespace(input_buffer); + } while (can_access_at_index(input_buffer, 0) && (buffer_at_offset(input_buffer)[0] == ',')); + + if (cannot_access_at_index(input_buffer, 0) || (buffer_at_offset(input_buffer)[0] != '}')) + { + goto fail; /* expected end of object */ + } + +success: + input_buffer->depth--; + + if (head != NULL) { + head->prev = current_item; + } + + item->type = cJSON_Object; + item->child = head; + + input_buffer->offset++; + return true; + +fail: + if (head != NULL) + { + cJSON_Delete(head); + } + + return false; +} + +/* Render an object to text. */ +static cJSON_bool print_object(const cJSON* const item, printbuffer* const output_buffer) +{ + unsigned char* output_pointer = NULL; + size_t length = 0; + cJSON* current_item = item->child; + + if (output_buffer == NULL) + { + return false; + } + + /* Compose the output: */ + length = (size_t)(output_buffer->format ? 2 : 1); /* fmt: {\n */ + output_pointer = ensure(output_buffer, length + 1); + if (output_pointer == NULL) + { + return false; + } + + *output_pointer++ = '{'; + output_buffer->depth++; + if (output_buffer->format) + { + *output_pointer++ = '\n'; + } + output_buffer->offset += length; + + while (current_item) + { + if (output_buffer->format) + { + size_t i; + output_pointer = ensure(output_buffer, output_buffer->depth); + if (output_pointer == NULL) + { + return false; + } + for (i = 0; i < output_buffer->depth; i++) + { + *output_pointer++ = '\t'; + } + output_buffer->offset += output_buffer->depth; + } + + /* print key */ + if (!print_string_ptr((unsigned char*)current_item->string, output_buffer)) + { + return false; + } + update_offset(output_buffer); + + length = (size_t)(output_buffer->format ? 2 : 1); + output_pointer = ensure(output_buffer, length); + if (output_pointer == NULL) + { + return false; + } + *output_pointer++ = ':'; + if (output_buffer->format) + { + *output_pointer++ = '\t'; + } + output_buffer->offset += length; + + /* print value */ + if (!print_value(current_item, output_buffer)) + { + return false; + } + update_offset(output_buffer); + + /* print comma if not last */ + length = ((size_t)(output_buffer->format ? 1 : 0) + (size_t)(current_item->next ? 1 : 0)); + output_pointer = ensure(output_buffer, length + 1); + if (output_pointer == NULL) + { + return false; + } + if (current_item->next) + { + *output_pointer++ = ','; + } + + if (output_buffer->format) + { + *output_pointer++ = '\n'; + } + *output_pointer = '\0'; + output_buffer->offset += length; + + current_item = current_item->next; + } + + output_pointer = ensure(output_buffer, output_buffer->format ? (output_buffer->depth + 1) : 2); + if (output_pointer == NULL) + { + return false; + } + if (output_buffer->format) + { + size_t i; + for (i = 0; i < (output_buffer->depth - 1); i++) + { + *output_pointer++ = '\t'; + } + } + *output_pointer++ = '}'; + *output_pointer = '\0'; + output_buffer->depth--; + + return true; +} + +/* Get Array size/item / object item. */ +CJSON_PUBLIC(int) cJSON_GetArraySize(const cJSON* array) +{ + cJSON* child = NULL; + size_t size = 0; + + if (array == NULL) + { + return 0; + } + + child = array->child; + + while (child != NULL) + { + size++; + child = child->next; + } + + /* FIXME: Can overflow here. Cannot be fixed without breaking the API */ + + return (int)size; +} + +static cJSON* get_array_item(const cJSON* array, size_t index) +{ + cJSON* current_child = NULL; + + if (array == NULL) + { + return NULL; + } + + current_child = array->child; + while ((current_child != NULL) && (index > 0)) + { + index--; + current_child = current_child->next; + } + + return current_child; +} + +CJSON_PUBLIC(cJSON*) cJSON_GetArrayItem(const cJSON* array, int index) +{ + if (index < 0) + { + return NULL; + } + + return get_array_item(array, (size_t)index); +} + +static cJSON* get_object_item(const cJSON* const object, const char* const name, const cJSON_bool case_sensitive) +{ + cJSON* current_element = NULL; + + if ((object == NULL) || (name == NULL)) + { + return NULL; + } + + current_element = object->child; + if (case_sensitive) + { + while ((current_element != NULL) && (current_element->string != NULL) && (strcmp(name, current_element->string) != 0)) + { + current_element = current_element->next; + } + } + else + { + while ((current_element != NULL) && (case_insensitive_strcmp((const unsigned char*)name, (const unsigned char*)(current_element->string)) != 0)) + { + current_element = current_element->next; + } + } + + if ((current_element == NULL) || (current_element->string == NULL)) { + return NULL; + } + + return current_element; +} + +CJSON_PUBLIC(cJSON*) cJSON_GetObjectItem(const cJSON* const object, const char* const string) +{ + return get_object_item(object, string, false); +} + +CJSON_PUBLIC(cJSON*) cJSON_GetObjectItemCaseSensitive(const cJSON* const object, const char* const string) +{ + return get_object_item(object, string, true); +} + +CJSON_PUBLIC(cJSON_bool) cJSON_HasObjectItem(const cJSON* object, const char* string) +{ + return cJSON_GetObjectItem(object, string) ? 1 : 0; +} + +/* Utility for array list handling. */ +static void suffix_object(cJSON* prev, cJSON* item) +{ + prev->next = item; + item->prev = prev; +} + +/* Utility for handling references. */ +static cJSON* create_reference(const cJSON* item, const internal_hooks* const hooks) +{ + cJSON* reference = NULL; + if (item == NULL) + { + return NULL; + } + + reference = cJSON_New_Item(hooks); + if (reference == NULL) + { + return NULL; + } + + memcpy(reference, item, sizeof(cJSON)); + reference->string = NULL; + reference->type |= cJSON_IsReference; + reference->next = reference->prev = NULL; + return reference; +} + +static cJSON_bool add_item_to_array(cJSON* array, cJSON* item) +{ + cJSON* child = NULL; + + if ((item == NULL) || (array == NULL) || (array == item)) + { + return false; + } + + child = array->child; + /* + * To find the last item in array quickly, we use prev in array + */ + if (child == NULL) + { + /* list is empty, start new one */ + array->child = item; + item->prev = item; + item->next = NULL; + } + else + { + /* append to the end */ + if (child->prev) + { + suffix_object(child->prev, item); + array->child->prev = item; + } + } + + return true; +} + +/* Add item to array/object. */ +CJSON_PUBLIC(cJSON_bool) cJSON_AddItemToArray(cJSON* array, cJSON* item) +{ + return add_item_to_array(array, item); +} + +#if defined(__clang__) || (defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 5)))) +#pragma GCC diagnostic push +#endif +#ifdef __GNUC__ +#pragma GCC diagnostic ignored "-Wcast-qual" +#endif +/* helper function to cast away const */ +static void* cast_away_const(const void* string) +{ + return (void*)string; +} +#if defined(__clang__) || (defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 5)))) +#pragma GCC diagnostic pop +#endif + + +static cJSON_bool add_item_to_object(cJSON* const object, const char* const string, cJSON* const item, const internal_hooks* const hooks, const cJSON_bool constant_key) +{ + char* new_key = NULL; + int new_type = cJSON_Invalid; + + if ((object == NULL) || (string == NULL) || (item == NULL) || (object == item)) + { + return false; + } + + if (constant_key) + { + new_key = (char*)cast_away_const(string); + new_type = item->type | cJSON_StringIsConst; + } + else + { + new_key = (char*)cJSON_strdup((const unsigned char*)string, hooks); + if (new_key == NULL) + { + return false; + } + + new_type = item->type & ~cJSON_StringIsConst; + } + + if (!(item->type & cJSON_StringIsConst) && (item->string != NULL)) + { + hooks->deallocate(item->string); + } + + item->string = new_key; + item->type = new_type; + + return add_item_to_array(object, item); +} + +CJSON_PUBLIC(cJSON_bool) cJSON_AddItemToObject(cJSON* object, const char* string, cJSON* item) +{ + return add_item_to_object(object, string, item, &global_hooks, false); +} + +/* Add an item to an object with constant string as key */ +CJSON_PUBLIC(cJSON_bool) cJSON_AddItemToObjectCS(cJSON* object, const char* string, cJSON* item) +{ + return add_item_to_object(object, string, item, &global_hooks, true); +} + +CJSON_PUBLIC(cJSON_bool) cJSON_AddItemReferenceToArray(cJSON* array, cJSON* item) +{ + if (array == NULL) + { + return false; + } + + return add_item_to_array(array, create_reference(item, &global_hooks)); +} + +CJSON_PUBLIC(cJSON_bool) cJSON_AddItemReferenceToObject(cJSON* object, const char* string, cJSON* item) +{ + if ((object == NULL) || (string == NULL)) + { + return false; + } + + return add_item_to_object(object, string, create_reference(item, &global_hooks), &global_hooks, false); +} + +CJSON_PUBLIC(cJSON*) cJSON_AddNullToObject(cJSON* const object, const char* const name) +{ + cJSON* null = cJSON_CreateNull(); + if (add_item_to_object(object, name, null, &global_hooks, false)) + { + return null; + } + + cJSON_Delete(null); + return NULL; +} + +CJSON_PUBLIC(cJSON*) cJSON_AddTrueToObject(cJSON* const object, const char* const name) +{ + cJSON* true_item = cJSON_CreateTrue(); + if (add_item_to_object(object, name, true_item, &global_hooks, false)) + { + return true_item; + } + + cJSON_Delete(true_item); + return NULL; +} + +CJSON_PUBLIC(cJSON*) cJSON_AddFalseToObject(cJSON* const object, const char* const name) +{ + cJSON* false_item = cJSON_CreateFalse(); + if (add_item_to_object(object, name, false_item, &global_hooks, false)) + { + return false_item; + } + + cJSON_Delete(false_item); + return NULL; +} + +CJSON_PUBLIC(cJSON*) cJSON_AddBoolToObject(cJSON* const object, const char* const name, const cJSON_bool boolean) +{ + cJSON* bool_item = cJSON_CreateBool(boolean); + if (add_item_to_object(object, name, bool_item, &global_hooks, false)) + { + return bool_item; + } + + cJSON_Delete(bool_item); + return NULL; +} + +CJSON_PUBLIC(cJSON*) cJSON_AddNumberToObject(cJSON* const object, const char* const name, const double number) +{ + cJSON* number_item = cJSON_CreateNumber(number); + if (add_item_to_object(object, name, number_item, &global_hooks, false)) + { + return number_item; + } + + cJSON_Delete(number_item); + return NULL; +} + +CJSON_PUBLIC(cJSON*) cJSON_AddStringToObject(cJSON* const object, const char* const name, const char* const string) +{ + cJSON* string_item = cJSON_CreateString(string); + if (add_item_to_object(object, name, string_item, &global_hooks, false)) + { + return string_item; + } + + cJSON_Delete(string_item); + return NULL; +} + +CJSON_PUBLIC(cJSON*) cJSON_AddRawToObject(cJSON* const object, const char* const name, const char* const raw) +{ + cJSON* raw_item = cJSON_CreateRaw(raw); + if (add_item_to_object(object, name, raw_item, &global_hooks, false)) + { + return raw_item; + } + + cJSON_Delete(raw_item); + return NULL; +} + +CJSON_PUBLIC(cJSON*) cJSON_AddObjectToObject(cJSON* const object, const char* const name) +{ + cJSON* object_item = cJSON_CreateObject(); + if (add_item_to_object(object, name, object_item, &global_hooks, false)) + { + return object_item; + } + + cJSON_Delete(object_item); + return NULL; +} + +CJSON_PUBLIC(cJSON*) cJSON_AddArrayToObject(cJSON* const object, const char* const name) +{ + cJSON* array = cJSON_CreateArray(); + if (add_item_to_object(object, name, array, &global_hooks, false)) + { + return array; + } + + cJSON_Delete(array); + return NULL; +} + +CJSON_PUBLIC(cJSON*) cJSON_DetachItemViaPointer(cJSON* parent, cJSON* const item) +{ + if ((parent == NULL) || (item == NULL)) + { + return NULL; + } + + if (item != parent->child) + { + /* not the first element */ + item->prev->next = item->next; + } + if (item->next != NULL) + { + /* not the last element */ + item->next->prev = item->prev; + } + + if (item == parent->child) + { + /* first element */ + parent->child = item->next; + } + else if (item->next == NULL) + { + /* last element */ + parent->child->prev = item->prev; + } + + /* make sure the detached item doesn't point anywhere anymore */ + item->prev = NULL; + item->next = NULL; + + return item; +} + +CJSON_PUBLIC(cJSON*) cJSON_DetachItemFromArray(cJSON* array, int which) +{ + if (which < 0) + { + return NULL; + } + + return cJSON_DetachItemViaPointer(array, get_array_item(array, (size_t)which)); +} + +CJSON_PUBLIC(void) cJSON_DeleteItemFromArray(cJSON* array, int which) +{ + cJSON_Delete(cJSON_DetachItemFromArray(array, which)); +} + +CJSON_PUBLIC(cJSON*) cJSON_DetachItemFromObject(cJSON* object, const char* string) +{ + cJSON* to_detach = cJSON_GetObjectItem(object, string); + + return cJSON_DetachItemViaPointer(object, to_detach); +} + +CJSON_PUBLIC(cJSON*) cJSON_DetachItemFromObjectCaseSensitive(cJSON* object, const char* string) +{ + cJSON* to_detach = cJSON_GetObjectItemCaseSensitive(object, string); + + return cJSON_DetachItemViaPointer(object, to_detach); +} + +CJSON_PUBLIC(void) cJSON_DeleteItemFromObject(cJSON* object, const char* string) +{ + cJSON_Delete(cJSON_DetachItemFromObject(object, string)); +} + +CJSON_PUBLIC(void) cJSON_DeleteItemFromObjectCaseSensitive(cJSON* object, const char* string) +{ + cJSON_Delete(cJSON_DetachItemFromObjectCaseSensitive(object, string)); +} + +/* Replace array/object items with new ones. */ +CJSON_PUBLIC(cJSON_bool) cJSON_InsertItemInArray(cJSON* array, int which, cJSON* newitem) +{ + cJSON* after_inserted = NULL; + + if (which < 0) + { + return false; + } + + after_inserted = get_array_item(array, (size_t)which); + if (after_inserted == NULL) + { + return add_item_to_array(array, newitem); + } + + newitem->next = after_inserted; + newitem->prev = after_inserted->prev; + after_inserted->prev = newitem; + if (after_inserted == array->child) + { + array->child = newitem; + } + else + { + newitem->prev->next = newitem; + } + return true; +} + +CJSON_PUBLIC(cJSON_bool) cJSON_ReplaceItemViaPointer(cJSON* const parent, cJSON* const item, cJSON* replacement) +{ + if ((parent == NULL) || (parent->child == NULL) || (replacement == NULL) || (item == NULL)) + { + return false; + } + + if (replacement == item) + { + return true; + } + + replacement->next = item->next; + replacement->prev = item->prev; + + if (replacement->next != NULL) + { + replacement->next->prev = replacement; + } + if (parent->child == item) + { + if (parent->child->prev == parent->child) + { + replacement->prev = replacement; + } + parent->child = replacement; + } + else + { /* + * To find the last item in array quickly, we use prev in array. + * We can't modify the last item's next pointer where this item was the parent's child + */ + if (replacement->prev != NULL) + { + replacement->prev->next = replacement; + } + if (replacement->next == NULL) + { + parent->child->prev = replacement; + } + } + + item->next = NULL; + item->prev = NULL; + cJSON_Delete(item); + + return true; +} + +CJSON_PUBLIC(cJSON_bool) cJSON_ReplaceItemInArray(cJSON* array, int which, cJSON* newitem) +{ + if (which < 0) + { + return false; + } + + return cJSON_ReplaceItemViaPointer(array, get_array_item(array, (size_t)which), newitem); +} + +static cJSON_bool replace_item_in_object(cJSON* object, const char* string, cJSON* replacement, cJSON_bool case_sensitive) +{ + if ((replacement == NULL) || (string == NULL)) + { + return false; + } + + /* replace the name in the replacement */ + if (!(replacement->type & cJSON_StringIsConst) && (replacement->string != NULL)) + { + cJSON_free(replacement->string); + } + replacement->string = (char*)cJSON_strdup((const unsigned char*)string, &global_hooks); + if (replacement->string == NULL) + { + return false; + } + + replacement->type &= ~cJSON_StringIsConst; + + return cJSON_ReplaceItemViaPointer(object, get_object_item(object, string, case_sensitive), replacement); +} + +CJSON_PUBLIC(cJSON_bool) cJSON_ReplaceItemInObject(cJSON* object, const char* string, cJSON* newitem) +{ + return replace_item_in_object(object, string, newitem, false); +} + +CJSON_PUBLIC(cJSON_bool) cJSON_ReplaceItemInObjectCaseSensitive(cJSON* object, const char* string, cJSON* newitem) +{ + return replace_item_in_object(object, string, newitem, true); +} + +/* Create basic types: */ +CJSON_PUBLIC(cJSON*) cJSON_CreateNull(void) +{ + cJSON* item = cJSON_New_Item(&global_hooks); + if (item) + { + item->type = cJSON_NULL; + } + + return item; +} + +CJSON_PUBLIC(cJSON*) cJSON_CreateTrue(void) +{ + cJSON* item = cJSON_New_Item(&global_hooks); + if (item) + { + item->type = cJSON_True; + } + + return item; +} + +CJSON_PUBLIC(cJSON*) cJSON_CreateFalse(void) +{ + cJSON* item = cJSON_New_Item(&global_hooks); + if (item) + { + item->type = cJSON_False; + } + + return item; +} + +CJSON_PUBLIC(cJSON*) cJSON_CreateBool(cJSON_bool boolean) +{ + cJSON* item = cJSON_New_Item(&global_hooks); + if (item) + { + item->type = boolean ? cJSON_True : cJSON_False; + } + + return item; +} + +CJSON_PUBLIC(cJSON*) cJSON_CreateNumber(double num) +{ + cJSON* item = cJSON_New_Item(&global_hooks); + if (item) + { + item->type = cJSON_Number; + item->valuedouble = num; + + /* use saturation in case of overflow */ + if (num >= INT_MAX) + { + item->valueint = INT_MAX; + } + else if (num <= (double)INT_MIN) + { + item->valueint = INT_MIN; + } + else + { + item->valueint = (int)num; + } + } + + return item; +} + +CJSON_PUBLIC(cJSON*) cJSON_CreateString(const char* string) +{ + cJSON* item = cJSON_New_Item(&global_hooks); + if (item) + { + item->type = cJSON_String; + item->valuestring = (char*)cJSON_strdup((const unsigned char*)string, &global_hooks); + if (!item->valuestring) + { + cJSON_Delete(item); + return NULL; + } + } + + return item; +} + +CJSON_PUBLIC(cJSON*) cJSON_CreateStringReference(const char* string) +{ + cJSON* item = cJSON_New_Item(&global_hooks); + if (item != NULL) + { + item->type = cJSON_String | cJSON_IsReference; + item->valuestring = (char*)cast_away_const(string); + } + + return item; +} + +CJSON_PUBLIC(cJSON*) cJSON_CreateObjectReference(const cJSON* child) +{ + cJSON* item = cJSON_New_Item(&global_hooks); + if (item != NULL) { + item->type = cJSON_Object | cJSON_IsReference; + item->child = (cJSON*)cast_away_const(child); + } + + return item; +} + +CJSON_PUBLIC(cJSON*) cJSON_CreateArrayReference(const cJSON* child) { + cJSON* item = cJSON_New_Item(&global_hooks); + if (item != NULL) { + item->type = cJSON_Array | cJSON_IsReference; + item->child = (cJSON*)cast_away_const(child); + } + + return item; +} + +CJSON_PUBLIC(cJSON*) cJSON_CreateRaw(const char* raw) +{ + cJSON* item = cJSON_New_Item(&global_hooks); + if (item) + { + item->type = cJSON_Raw; + item->valuestring = (char*)cJSON_strdup((const unsigned char*)raw, &global_hooks); + if (!item->valuestring) + { + cJSON_Delete(item); + return NULL; + } + } + + return item; +} + +CJSON_PUBLIC(cJSON*) cJSON_CreateArray(void) +{ + cJSON* item = cJSON_New_Item(&global_hooks); + if (item) + { + item->type = cJSON_Array; + } + + return item; +} + +CJSON_PUBLIC(cJSON*) cJSON_CreateObject(void) +{ + cJSON* item = cJSON_New_Item(&global_hooks); + if (item) + { + item->type = cJSON_Object; + } + + return item; +} + +/* Create Arrays: */ +CJSON_PUBLIC(cJSON*) cJSON_CreateIntArray(const int* numbers, int count) +{ + size_t i = 0; + cJSON* n = NULL; + cJSON* p = NULL; + cJSON* a = NULL; + + if ((count < 0) || (numbers == NULL)) + { + return NULL; + } + + a = cJSON_CreateArray(); + + for (i = 0; a && (i < (size_t)count); i++) + { + n = cJSON_CreateNumber(numbers[i]); + if (!n) + { + cJSON_Delete(a); + return NULL; + } + if (!i) + { + a->child = n; + } + else + { + suffix_object(p, n); + } + p = n; + } + + if (a && a->child) { + a->child->prev = n; + } + + return a; +} + +CJSON_PUBLIC(cJSON*) cJSON_CreateFloatArray(const float* numbers, int count) +{ + size_t i = 0; + cJSON* n = NULL; + cJSON* p = NULL; + cJSON* a = NULL; + + if ((count < 0) || (numbers == NULL)) + { + return NULL; + } + + a = cJSON_CreateArray(); + + for (i = 0; a && (i < (size_t)count); i++) + { + n = cJSON_CreateNumber((double)numbers[i]); + if (!n) + { + cJSON_Delete(a); + return NULL; + } + if (!i) + { + a->child = n; + } + else + { + suffix_object(p, n); + } + p = n; + } + + if (a && a->child) { + a->child->prev = n; + } + + return a; +} + +CJSON_PUBLIC(cJSON*) cJSON_CreateDoubleArray(const double* numbers, int count) +{ + size_t i = 0; + cJSON* n = NULL; + cJSON* p = NULL; + cJSON* a = NULL; + + if ((count < 0) || (numbers == NULL)) + { + return NULL; + } + + a = cJSON_CreateArray(); + + for (i = 0; a && (i < (size_t)count); i++) + { + n = cJSON_CreateNumber(numbers[i]); + if (!n) + { + cJSON_Delete(a); + return NULL; + } + if (!i) + { + a->child = n; + } + else + { + suffix_object(p, n); + } + p = n; + } + + if (a && a->child) { + a->child->prev = n; + } + + return a; +} + +CJSON_PUBLIC(cJSON*) cJSON_CreateStringArray(const char* const* strings, int count) +{ + size_t i = 0; + cJSON* n = NULL; + cJSON* p = NULL; + cJSON* a = NULL; + + if ((count < 0) || (strings == NULL)) + { + return NULL; + } + + a = cJSON_CreateArray(); + + for (i = 0; a && (i < (size_t)count); i++) + { + n = cJSON_CreateString(strings[i]); + if (!n) + { + cJSON_Delete(a); + return NULL; + } + if (!i) + { + a->child = n; + } + else + { + suffix_object(p, n); + } + p = n; + } + + if (a && a->child) { + a->child->prev = n; + } + + return a; +} + +/* Duplication */ +CJSON_PUBLIC(cJSON*) cJSON_Duplicate(const cJSON* item, cJSON_bool recurse) +{ + cJSON* newitem = NULL; + cJSON* child = NULL; + cJSON* next = NULL; + cJSON* newchild = NULL; + + /* Bail on bad ptr */ + if (!item) + { + goto fail; + } + /* Create new item */ + newitem = cJSON_New_Item(&global_hooks); + if (!newitem) + { + goto fail; + } + /* Copy over all vars */ + newitem->type = item->type & (~cJSON_IsReference); + newitem->valueint = item->valueint; + newitem->valuedouble = item->valuedouble; + if (item->valuestring) + { + newitem->valuestring = (char*)cJSON_strdup((unsigned char*)item->valuestring, &global_hooks); + if (!newitem->valuestring) + { + goto fail; + } + } + if (item->string) + { + newitem->string = (item->type & cJSON_StringIsConst) ? item->string : (char*)cJSON_strdup((unsigned char*)item->string, &global_hooks); + if (!newitem->string) + { + goto fail; + } + } + /* If non-recursive, then we're done! */ + if (!recurse) + { + return newitem; + } + /* Walk the ->next chain for the child. */ + child = item->child; + while (child != NULL) + { + newchild = cJSON_Duplicate(child, true); /* Duplicate (with recurse) each item in the ->next chain */ + if (!newchild) + { + goto fail; + } + if (next != NULL) + { + /* If newitem->child already set, then crosswire ->prev and ->next and move on */ + next->next = newchild; + newchild->prev = next; + next = newchild; + } + else + { + /* Set newitem->child and move to it */ + newitem->child = newchild; + next = newchild; + } + child = child->next; + } + if (newitem && newitem->child) + { + newitem->child->prev = newchild; + } + + return newitem; + +fail: + if (newitem != NULL) + { + cJSON_Delete(newitem); + } + + return NULL; +} + +static void skip_oneline_comment(char** input) +{ + *input += static_strlen("//"); + + for (; (*input)[0] != '\0'; ++(*input)) + { + if ((*input)[0] == '\n') { + *input += static_strlen("\n"); + return; + } + } +} + +static void skip_multiline_comment(char** input) +{ + *input += static_strlen("/*"); + + for (; (*input)[0] != '\0'; ++(*input)) + { + if (((*input)[0] == '*') && ((*input)[1] == '/')) + { + *input += static_strlen("*/"); + return; + } + } +} + +static void minify_string(char** input, char** output) { + (*output)[0] = (*input)[0]; + *input += static_strlen("\""); + *output += static_strlen("\""); + + + for (; (*input)[0] != '\0'; (void)++(*input), ++(*output)) { + (*output)[0] = (*input)[0]; + + if ((*input)[0] == '\"') { + (*output)[0] = '\"'; + *input += static_strlen("\""); + *output += static_strlen("\""); + return; + } + else if (((*input)[0] == '\\') && ((*input)[1] == '\"')) { + (*output)[1] = (*input)[1]; + *input += static_strlen("\""); + *output += static_strlen("\""); + } + } +} + +CJSON_PUBLIC(void) cJSON_Minify(char* json) +{ + char* into = json; + + if (json == NULL) + { + return; + } + + while (json[0] != '\0') + { + switch (json[0]) + { + case ' ': + case '\t': + case '\r': + case '\n': + json++; + break; + + case '/': + if (json[1] == '/') + { + skip_oneline_comment(&json); + } + else if (json[1] == '*') + { + skip_multiline_comment(&json); + } + else { + json++; + } + break; + + case '\"': + minify_string(&json, (char**)&into); + break; + + default: + into[0] = json[0]; + json++; + into++; + } + } + + /* and null-terminate. */ + *into = '\0'; +} + +CJSON_PUBLIC(cJSON_bool) cJSON_IsInvalid(const cJSON* const item) +{ + if (item == NULL) + { + return false; + } + + return (item->type & 0xFF) == cJSON_Invalid; +} + +CJSON_PUBLIC(cJSON_bool) cJSON_IsFalse(const cJSON* const item) +{ + if (item == NULL) + { + return false; + } + + return (item->type & 0xFF) == cJSON_False; +} + +CJSON_PUBLIC(cJSON_bool) cJSON_IsTrue(const cJSON* const item) +{ + if (item == NULL) + { + return false; + } + + return (item->type & 0xff) == cJSON_True; +} + + +CJSON_PUBLIC(cJSON_bool) cJSON_IsBool(const cJSON* const item) +{ + if (item == NULL) + { + return false; + } + + return (item->type & (cJSON_True | cJSON_False)) != 0; +} +CJSON_PUBLIC(cJSON_bool) cJSON_IsNull(const cJSON* const item) +{ + if (item == NULL) + { + return false; + } + + return (item->type & 0xFF) == cJSON_NULL; +} + +CJSON_PUBLIC(cJSON_bool) cJSON_IsNumber(const cJSON* const item) +{ + if (item == NULL) + { + return false; + } + + return (item->type & 0xFF) == cJSON_Number; +} + +CJSON_PUBLIC(cJSON_bool) cJSON_IsString(const cJSON* const item) +{ + if (item == NULL) + { + return false; + } + + return (item->type & 0xFF) == cJSON_String; +} + +CJSON_PUBLIC(cJSON_bool) cJSON_IsArray(const cJSON* const item) +{ + if (item == NULL) + { + return false; + } + + return (item->type & 0xFF) == cJSON_Array; +} + +CJSON_PUBLIC(cJSON_bool) cJSON_IsObject(const cJSON* const item) +{ + if (item == NULL) + { + return false; + } + + return (item->type & 0xFF) == cJSON_Object; +} + +CJSON_PUBLIC(cJSON_bool) cJSON_IsRaw(const cJSON* const item) +{ + if (item == NULL) + { + return false; + } + + return (item->type & 0xFF) == cJSON_Raw; +} + +CJSON_PUBLIC(cJSON_bool) cJSON_Compare(const cJSON* const a, const cJSON* const b, const cJSON_bool case_sensitive) +{ + if ((a == NULL) || (b == NULL) || ((a->type & 0xFF) != (b->type & 0xFF))) + { + return false; + } + + /* check if type is valid */ + switch (a->type & 0xFF) + { + case cJSON_False: + case cJSON_True: + case cJSON_NULL: + case cJSON_Number: + case cJSON_String: + case cJSON_Raw: + case cJSON_Array: + case cJSON_Object: + break; + + default: + return false; + } + + /* identical objects are equal */ + if (a == b) + { + return true; + } + + switch (a->type & 0xFF) + { + /* in these cases and equal type is enough */ + case cJSON_False: + case cJSON_True: + case cJSON_NULL: + return true; + + case cJSON_Number: + if (compare_double(a->valuedouble, b->valuedouble)) + { + return true; + } + return false; + + case cJSON_String: + case cJSON_Raw: + if ((a->valuestring == NULL) || (b->valuestring == NULL)) + { + return false; + } + if (strcmp(a->valuestring, b->valuestring) == 0) + { + return true; + } + + return false; + + case cJSON_Array: + { + cJSON* a_element = a->child; + cJSON* b_element = b->child; + + for (; (a_element != NULL) && (b_element != NULL);) + { + if (!cJSON_Compare(a_element, b_element, case_sensitive)) + { + return false; + } + + a_element = a_element->next; + b_element = b_element->next; + } + + /* one of the arrays is longer than the other */ + if (a_element != b_element) { + return false; + } + + return true; + } + + case cJSON_Object: + { + cJSON* a_element = NULL; + cJSON* b_element = NULL; + cJSON_ArrayForEach(a_element, a) + { + /* TODO This has O(n^2) runtime, which is horrible! */ + b_element = get_object_item(b, a_element->string, case_sensitive); + if (b_element == NULL) + { + return false; + } + + if (!cJSON_Compare(a_element, b_element, case_sensitive)) + { + return false; + } + } + + /* doing this twice, once on a and b to prevent true comparison if a subset of b + * TODO: Do this the proper way, this is just a fix for now */ + cJSON_ArrayForEach(b_element, b) + { + a_element = get_object_item(a, b_element->string, case_sensitive); + if (a_element == NULL) + { + return false; + } + + if (!cJSON_Compare(b_element, a_element, case_sensitive)) + { + return false; + } + } + + return true; + } + + default: + return false; + } +} + +CJSON_PUBLIC(void*) cJSON_malloc(size_t size) +{ + return global_hooks.allocate(size); +} + +CJSON_PUBLIC(void) cJSON_free(void* object) +{ + global_hooks.deallocate(object); +} diff --git a/disasterserver_c/cJSON.h b/disasterserver_c/cJSON.h new file mode 100644 index 0000000..8392abf --- /dev/null +++ b/disasterserver_c/cJSON.h @@ -0,0 +1,300 @@ +/* + Copyright (c) 2009-2017 Dave Gamble and cJSON contributors + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + THE SOFTWARE. +*/ + +#ifndef cJSON__h +#define cJSON__h + +#ifdef __cplusplus +extern "C" +{ +#endif + +#if !defined(__WINDOWS__) && (defined(WIN32) || defined(WIN64) || defined(_MSC_VER) || defined(_WIN32)) +#define __WINDOWS__ +#endif + +#ifdef __WINDOWS__ + + /* When compiling for windows, we specify a specific calling convention to avoid issues where we are being called from a project with a different default calling convention. For windows you have 3 define options: + + CJSON_HIDE_SYMBOLS - Define this in the case where you don't want to ever dllexport symbols + CJSON_EXPORT_SYMBOLS - Define this on library build when you want to dllexport symbols (default) + CJSON_IMPORT_SYMBOLS - Define this if you want to dllimport symbol + + For *nix builds that support visibility attribute, you can define similar behavior by + + setting default visibility to hidden by adding + -fvisibility=hidden (for gcc) + or + -xldscope=hidden (for sun cc) + to CFLAGS + + then using the CJSON_API_VISIBILITY flag to "export" the same symbols the way CJSON_EXPORT_SYMBOLS does + + */ + +#define CJSON_CDECL __cdecl +#define CJSON_STDCALL __stdcall + + /* export symbols by default, this is necessary for copy pasting the C and header file */ +#if !defined(CJSON_HIDE_SYMBOLS) && !defined(CJSON_IMPORT_SYMBOLS) && !defined(CJSON_EXPORT_SYMBOLS) +#define CJSON_EXPORT_SYMBOLS +#endif + +#if defined(CJSON_HIDE_SYMBOLS) +#define CJSON_PUBLIC(type) type CJSON_STDCALL +#elif defined(CJSON_EXPORT_SYMBOLS) +#define CJSON_PUBLIC(type) __declspec(dllexport) type CJSON_STDCALL +#elif defined(CJSON_IMPORT_SYMBOLS) +#define CJSON_PUBLIC(type) __declspec(dllimport) type CJSON_STDCALL +#endif +#else /* !__WINDOWS__ */ +#define CJSON_CDECL +#define CJSON_STDCALL + +#if (defined(__GNUC__) || defined(__SUNPRO_CC) || defined (__SUNPRO_C)) && defined(CJSON_API_VISIBILITY) +#define CJSON_PUBLIC(type) __attribute__((visibility("default"))) type +#else +#define CJSON_PUBLIC(type) type +#endif +#endif + + /* project version */ +#define CJSON_VERSION_MAJOR 1 +#define CJSON_VERSION_MINOR 7 +#define CJSON_VERSION_PATCH 16 + +#include + +/* cJSON Types: */ +#define cJSON_Invalid (0) +#define cJSON_False (1 << 0) +#define cJSON_True (1 << 1) +#define cJSON_NULL (1 << 2) +#define cJSON_Number (1 << 3) +#define cJSON_String (1 << 4) +#define cJSON_Array (1 << 5) +#define cJSON_Object (1 << 6) +#define cJSON_Raw (1 << 7) /* raw json */ + +#define cJSON_IsReference 256 +#define cJSON_StringIsConst 512 + +/* The cJSON structure: */ + typedef struct cJSON + { + /* next/prev allow you to walk array/object chains. Alternatively, use GetArraySize/GetArrayItem/GetObjectItem */ + struct cJSON* next; + struct cJSON* prev; + /* An array or object item will have a child pointer pointing to a chain of the items in the array/object. */ + struct cJSON* child; + + /* The type of the item, as above. */ + int type; + + /* The item's string, if type==cJSON_String and type == cJSON_Raw */ + char* valuestring; + /* writing to valueint is DEPRECATED, use cJSON_SetNumberValue instead */ + int valueint; + /* The item's number, if type==cJSON_Number */ + double valuedouble; + + /* The item's name string, if this item is the child of, or is in the list of subitems of an object. */ + char* string; + } cJSON; + + typedef struct cJSON_Hooks + { + /* malloc/free are CDECL on Windows regardless of the default calling convention of the compiler, so ensure the hooks allow passing those functions directly. */ + void* (CJSON_CDECL* malloc_fn)(size_t sz); + void (CJSON_CDECL* free_fn)(void* ptr); + } cJSON_Hooks; + + typedef int cJSON_bool; + + /* Limits how deeply nested arrays/objects can be before cJSON rejects to parse them. + * This is to prevent stack overflows. */ +#ifndef CJSON_NESTING_LIMIT +#define CJSON_NESTING_LIMIT 1000 +#endif + + /* returns the version of cJSON as a string */ + CJSON_PUBLIC(const char*) cJSON_Version(void); + + /* Supply malloc, realloc and free functions to cJSON */ + CJSON_PUBLIC(void) cJSON_InitHooks(cJSON_Hooks* hooks); + + /* Memory Management: the caller is always responsible to free the results from all variants of cJSON_Parse (with cJSON_Delete) and cJSON_Print (with stdlib free, cJSON_Hooks.free_fn, or cJSON_free as appropriate). The exception is cJSON_PrintPreallocated, where the caller has full responsibility of the buffer. */ + /* Supply a block of JSON, and this returns a cJSON object you can interrogate. */ + CJSON_PUBLIC(cJSON*) cJSON_Parse(const char* value); + CJSON_PUBLIC(cJSON*) cJSON_ParseWithLength(const char* value, size_t buffer_length); + /* ParseWithOpts allows you to require (and check) that the JSON is null terminated, and to retrieve the pointer to the final byte parsed. */ + /* If you supply a ptr in return_parse_end and parsing fails, then return_parse_end will contain a pointer to the error so will match cJSON_GetErrorPtr(). */ + CJSON_PUBLIC(cJSON*) cJSON_ParseWithOpts(const char* value, const char** return_parse_end, cJSON_bool require_null_terminated); + CJSON_PUBLIC(cJSON*) cJSON_ParseWithLengthOpts(const char* value, size_t buffer_length, const char** return_parse_end, cJSON_bool require_null_terminated); + + /* Render a cJSON entity to text for transfer/storage. */ + CJSON_PUBLIC(char*) cJSON_Print(const cJSON* item); + /* Render a cJSON entity to text for transfer/storage without any formatting. */ + CJSON_PUBLIC(char*) cJSON_PrintUnformatted(const cJSON* item); + /* Render a cJSON entity to text using a buffered strategy. prebuffer is a guess at the final size. guessing well reduces reallocation. fmt=0 gives unformatted, =1 gives formatted */ + CJSON_PUBLIC(char*) cJSON_PrintBuffered(const cJSON* item, int prebuffer, cJSON_bool fmt); + /* Render a cJSON entity to text using a buffer already allocated in memory with given length. Returns 1 on success and 0 on failure. */ + /* NOTE: cJSON is not always 100% accurate in estimating how much memory it will use, so to be safe allocate 5 bytes more than you actually need */ + CJSON_PUBLIC(cJSON_bool) cJSON_PrintPreallocated(cJSON* item, char* buffer, const int length, const cJSON_bool format); + /* Delete a cJSON entity and all subentities. */ + CJSON_PUBLIC(void) cJSON_Delete(cJSON* item); + + /* Returns the number of items in an array (or object). */ + CJSON_PUBLIC(int) cJSON_GetArraySize(const cJSON* array); + /* Retrieve item number "index" from array "array". Returns NULL if unsuccessful. */ + CJSON_PUBLIC(cJSON*) cJSON_GetArrayItem(const cJSON* array, int index); + /* Get item "string" from object. Case insensitive. */ + CJSON_PUBLIC(cJSON*) cJSON_GetObjectItem(const cJSON* const object, const char* const string); + CJSON_PUBLIC(cJSON*) cJSON_GetObjectItemCaseSensitive(const cJSON* const object, const char* const string); + CJSON_PUBLIC(cJSON_bool) cJSON_HasObjectItem(const cJSON* object, const char* string); + /* For analysing failed parses. This returns a pointer to the parse error. You'll probably need to look a few chars back to make sense of it. Defined when cJSON_Parse() returns 0. 0 when cJSON_Parse() succeeds. */ + CJSON_PUBLIC(const char*) cJSON_GetErrorPtr(void); + + /* Check item type and return its value */ + CJSON_PUBLIC(char*) cJSON_GetStringValue(const cJSON* const item); + CJSON_PUBLIC(double) cJSON_GetNumberValue(const cJSON* const item); + + /* These functions check the type of an item */ + CJSON_PUBLIC(cJSON_bool) cJSON_IsInvalid(const cJSON* const item); + CJSON_PUBLIC(cJSON_bool) cJSON_IsFalse(const cJSON* const item); + CJSON_PUBLIC(cJSON_bool) cJSON_IsTrue(const cJSON* const item); + CJSON_PUBLIC(cJSON_bool) cJSON_IsBool(const cJSON* const item); + CJSON_PUBLIC(cJSON_bool) cJSON_IsNull(const cJSON* const item); + CJSON_PUBLIC(cJSON_bool) cJSON_IsNumber(const cJSON* const item); + CJSON_PUBLIC(cJSON_bool) cJSON_IsString(const cJSON* const item); + CJSON_PUBLIC(cJSON_bool) cJSON_IsArray(const cJSON* const item); + CJSON_PUBLIC(cJSON_bool) cJSON_IsObject(const cJSON* const item); + CJSON_PUBLIC(cJSON_bool) cJSON_IsRaw(const cJSON* const item); + + /* These calls create a cJSON item of the appropriate type. */ + CJSON_PUBLIC(cJSON*) cJSON_CreateNull(void); + CJSON_PUBLIC(cJSON*) cJSON_CreateTrue(void); + CJSON_PUBLIC(cJSON*) cJSON_CreateFalse(void); + CJSON_PUBLIC(cJSON*) cJSON_CreateBool(cJSON_bool boolean); + CJSON_PUBLIC(cJSON*) cJSON_CreateNumber(double num); + CJSON_PUBLIC(cJSON*) cJSON_CreateString(const char* string); + /* raw json */ + CJSON_PUBLIC(cJSON*) cJSON_CreateRaw(const char* raw); + CJSON_PUBLIC(cJSON*) cJSON_CreateArray(void); + CJSON_PUBLIC(cJSON*) cJSON_CreateObject(void); + + /* Create a string where valuestring references a string so + * it will not be freed by cJSON_Delete */ + CJSON_PUBLIC(cJSON*) cJSON_CreateStringReference(const char* string); + /* Create an object/array that only references it's elements so + * they will not be freed by cJSON_Delete */ + CJSON_PUBLIC(cJSON*) cJSON_CreateObjectReference(const cJSON* child); + CJSON_PUBLIC(cJSON*) cJSON_CreateArrayReference(const cJSON* child); + + /* These utilities create an Array of count items. + * The parameter count cannot be greater than the number of elements in the number array, otherwise array access will be out of bounds.*/ + CJSON_PUBLIC(cJSON*) cJSON_CreateIntArray(const int* numbers, int count); + CJSON_PUBLIC(cJSON*) cJSON_CreateFloatArray(const float* numbers, int count); + CJSON_PUBLIC(cJSON*) cJSON_CreateDoubleArray(const double* numbers, int count); + CJSON_PUBLIC(cJSON*) cJSON_CreateStringArray(const char* const* strings, int count); + + /* Append item to the specified array/object. */ + CJSON_PUBLIC(cJSON_bool) cJSON_AddItemToArray(cJSON* array, cJSON* item); + CJSON_PUBLIC(cJSON_bool) cJSON_AddItemToObject(cJSON* object, const char* string, cJSON* item); + /* Use this when string is definitely const (i.e. a literal, or as good as), and will definitely survive the cJSON object. + * WARNING: When this function was used, make sure to always check that (item->type & cJSON_StringIsConst) is zero before + * writing to `item->string` */ + CJSON_PUBLIC(cJSON_bool) cJSON_AddItemToObjectCS(cJSON* object, const char* string, cJSON* item); + /* Append reference to item to the specified array/object. Use this when you want to add an existing cJSON to a new cJSON, but don't want to corrupt your existing cJSON. */ + CJSON_PUBLIC(cJSON_bool) cJSON_AddItemReferenceToArray(cJSON* array, cJSON* item); + CJSON_PUBLIC(cJSON_bool) cJSON_AddItemReferenceToObject(cJSON* object, const char* string, cJSON* item); + + /* Remove/Detach items from Arrays/Objects. */ + CJSON_PUBLIC(cJSON*) cJSON_DetachItemViaPointer(cJSON* parent, cJSON* const item); + CJSON_PUBLIC(cJSON*) cJSON_DetachItemFromArray(cJSON* array, int which); + CJSON_PUBLIC(void) cJSON_DeleteItemFromArray(cJSON* array, int which); + CJSON_PUBLIC(cJSON*) cJSON_DetachItemFromObject(cJSON* object, const char* string); + CJSON_PUBLIC(cJSON*) cJSON_DetachItemFromObjectCaseSensitive(cJSON* object, const char* string); + CJSON_PUBLIC(void) cJSON_DeleteItemFromObject(cJSON* object, const char* string); + CJSON_PUBLIC(void) cJSON_DeleteItemFromObjectCaseSensitive(cJSON* object, const char* string); + + /* Update array items. */ + CJSON_PUBLIC(cJSON_bool) cJSON_InsertItemInArray(cJSON* array, int which, cJSON* newitem); /* Shifts pre-existing items to the right. */ + CJSON_PUBLIC(cJSON_bool) cJSON_ReplaceItemViaPointer(cJSON* const parent, cJSON* const item, cJSON* replacement); + CJSON_PUBLIC(cJSON_bool) cJSON_ReplaceItemInArray(cJSON* array, int which, cJSON* newitem); + CJSON_PUBLIC(cJSON_bool) cJSON_ReplaceItemInObject(cJSON* object, const char* string, cJSON* newitem); + CJSON_PUBLIC(cJSON_bool) cJSON_ReplaceItemInObjectCaseSensitive(cJSON* object, const char* string, cJSON* newitem); + + /* Duplicate a cJSON item */ + CJSON_PUBLIC(cJSON*) cJSON_Duplicate(const cJSON* item, cJSON_bool recurse); + /* Duplicate will create a new, identical cJSON item to the one you pass, in new memory that will + * need to be released. With recurse!=0, it will duplicate any children connected to the item. + * The item->next and ->prev pointers are always zero on return from Duplicate. */ + /* Recursively compare two cJSON items for equality. If either a or b is NULL or invalid, they will be considered unequal. + * case_sensitive determines if object keys are treated case sensitive (1) or case insensitive (0) */ + CJSON_PUBLIC(cJSON_bool) cJSON_Compare(const cJSON* const a, const cJSON* const b, const cJSON_bool case_sensitive); + + /* Minify a strings, remove blank characters(such as ' ', '\t', '\r', '\n') from strings. + * The input pointer json cannot point to a read-only address area, such as a string constant, + * but should point to a readable and writable address area. */ + CJSON_PUBLIC(void) cJSON_Minify(char* json); + + /* Helper functions for creating and adding items to an object at the same time. + * They return the added item or NULL on failure. */ + CJSON_PUBLIC(cJSON*) cJSON_AddNullToObject(cJSON* const object, const char* const name); + CJSON_PUBLIC(cJSON*) cJSON_AddTrueToObject(cJSON* const object, const char* const name); + CJSON_PUBLIC(cJSON*) cJSON_AddFalseToObject(cJSON* const object, const char* const name); + CJSON_PUBLIC(cJSON*) cJSON_AddBoolToObject(cJSON* const object, const char* const name, const cJSON_bool boolean); + CJSON_PUBLIC(cJSON*) cJSON_AddNumberToObject(cJSON* const object, const char* const name, const double number); + CJSON_PUBLIC(cJSON*) cJSON_AddStringToObject(cJSON* const object, const char* const name, const char* const string); + CJSON_PUBLIC(cJSON*) cJSON_AddRawToObject(cJSON* const object, const char* const name, const char* const raw); + CJSON_PUBLIC(cJSON*) cJSON_AddObjectToObject(cJSON* const object, const char* const name); + CJSON_PUBLIC(cJSON*) cJSON_AddArrayToObject(cJSON* const object, const char* const name); + + /* When assigning an integer value, it needs to be propagated to valuedouble too. */ +#define cJSON_SetIntValue(object, number) ((object) ? (object)->valueint = (object)->valuedouble = (number) : (number)) +/* helper for the cJSON_SetNumberValue macro */ + CJSON_PUBLIC(double) cJSON_SetNumberHelper(cJSON* object, double number); +#define cJSON_SetNumberValue(object, number) ((object != NULL) ? cJSON_SetNumberHelper(object, (double)number) : (number)) + /* Change the valuestring of a cJSON_String object, only takes effect when type of object is cJSON_String */ + CJSON_PUBLIC(char*) cJSON_SetValuestring(cJSON* object, const char* valuestring); + + /* If the object is not a boolean type this does nothing and returns cJSON_Invalid else it returns the new type*/ +#define cJSON_SetBoolValue(object, boolValue) ( \ + (object != NULL && ((object)->type & (cJSON_False|cJSON_True))) ? \ + (object)->type=((object)->type &(~(cJSON_False|cJSON_True)))|((boolValue)?cJSON_True:cJSON_False) : \ + cJSON_Invalid\ +) + +/* Macro for iterating over an array or object */ +#define cJSON_ArrayForEach(element, array) for(element = (array != NULL) ? (array)->child : NULL; element != NULL; element = element->next) + +/* malloc/free objects using the malloc/free functions that have been set with cJSON_InitHooks */ + CJSON_PUBLIC(void*) cJSON_malloc(size_t size); + CJSON_PUBLIC(void) cJSON_free(void* object); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/disasterserver_c/entities/Act9Wall.c b/disasterserver_c/entities/Act9Wall.c new file mode 100644 index 0000000..c4d4c07 --- /dev/null +++ b/disasterserver_c/entities/Act9Wall.c @@ -0,0 +1,89 @@ +#include "Server.h" +#include + +#define ACT9_ROOM_WIDTH (3072) + +bool act9wall_init(Server* server, Entity* entity) +{ + Act9Wall* wall = (Act9Wall*)entity; + wall->start_time = (server->game.time_sec * TICKSPERSEC + server->game.time); + return true; +} + +bool act9wall_tick(Server* server, Entity* entity) +{ + Act9Wall* wall = (Act9Wall*)entity; + + double time = (server->game.time_sec * TICKSPERSEC + server->game.time); + double off = (double)(wall->start_time - time) / (double)wall->start_time; + + double x = wall->pos.x * off; + double y = wall->pos.y * off; + double wx; + double hy; + + Packet pack; + PacketCreate(&pack, SERVER_ACT9WALL_STATE); + PacketWrite(&pack, packet_write8, wall->wid); + PacketWrite(&pack, packet_write16, (uint16_t)x); + PacketWrite(&pack, packet_write16, (uint16_t)y); + server_broadcast(server, &pack, false); + + switch(wall->wid) + { + case 0: + { + x = -2240; + y = y - 768; + wx = x + (64 * 117); + hy = y + (64 * 12); + break; + } + + case 1: + { + x = x - 2240; + wx = x + (64 * 34); + hy = y + (64 * 19.5); + break; + } + + case 2: + { + x = (ACT9_ROOM_WIDTH - x) + 64; + wx = x + (64 * 34); + hy = y + (64 * 19.5); + break; + } + + default: + { + Err("Invalid wall id!"); + return false; + } + } + + for(size_t i = 0; i < server->peers.capacity; i++) + { + PeerData* data = (PeerData*)server->peers.ptr[i]; + if(!data) + continue; + + if(!data->in_game) + continue; + + if(data->plr.pos.x == 0 && data->plr.pos.y == 0) + continue; + + if(data->plr.flags & PLAYER_DEAD) + continue; + + if(data->plr.pos.x >= x && data->plr.pos.y >= y && data->plr.pos.x <= wx && data->plr.pos.y <= hy) + { + server_disconnect(server, data->peer, DR_OTHER, "Inside the wall for too long!"); + continue; + } + } + + return true; +} \ No newline at end of file diff --git a/disasterserver_c/entities/Act9Wall.h b/disasterserver_c/entities/Act9Wall.h new file mode 100644 index 0000000..ae94e5c --- /dev/null +++ b/disasterserver_c/entities/Act9Wall.h @@ -0,0 +1,17 @@ +#ifndef ACT9WALL_H +#define ACT9WALL_H +#include "../States.h" + +bool act9wall_init(Server* server, Entity* entity); +bool act9wall_tick(Server* server, Entity* entity); + +typedef struct +{ + ENTITY_BODY + + uint8_t wid; + double start_time; +} Act9Wall; +#define MakeAct9Wall(wid, x, y) ((Act9Wall) { MakeEntity("act9wall", x, y) act9wall_init, act9wall_tick, NULL, wid, 0 }) + +#endif \ No newline at end of file diff --git a/disasterserver_c/entities/BlackRing.c b/disasterserver_c/entities/BlackRing.c new file mode 100644 index 0000000..d73540d --- /dev/null +++ b/disasterserver_c/entities/BlackRing.c @@ -0,0 +1,35 @@ +#include + +bool bring_init(Server* server, Entity* entity) +{ + if (entity->pos.x == MAP_BRING || entity->pos.y == MAP_BRING) + { + Packet pack; + PacketCreate(&pack, SERVER_BRING_STATE) + PacketWrite(&pack, packet_write8, 0); + PacketWrite(&pack, packet_write16, entity->id); + server_broadcast(server, &pack, true); + + return true; + } + + Packet pack; + PacketCreate(&pack, SERVER_ERECTOR_BRING_SPAWN); + PacketWrite(&pack, packet_write16, entity->id); + PacketWrite(&pack, packet_write16, (uint16_t)entity->pos.x); + PacketWrite(&pack, packet_write16, (uint16_t)entity->pos.y); + server_broadcast(server, &pack, true); + + return true; +} + +bool bring_uninit(Server* server, Entity* entity) +{ + Packet pack; + PacketCreate(&pack, SERVER_BRING_STATE) + PacketWrite(&pack, packet_write8, 1); + PacketWrite(&pack, packet_write16, entity->id); + server_broadcast(server, &pack, true); + + return true; +} diff --git a/disasterserver_c/entities/BlackRing.h b/disasterserver_c/entities/BlackRing.h new file mode 100644 index 0000000..a7cb6c0 --- /dev/null +++ b/disasterserver_c/entities/BlackRing.h @@ -0,0 +1,16 @@ +#ifndef BRING_H +#define BRING_H +#include "../States.h" +#include + +bool bring_init(Server* server, Entity* entity); +bool bring_uninit(Server* server, Entity* entity); + +typedef struct +{ + ENTITY_BODY +} BRing; +#define MakeBlackRing(x, y) ((BRing) { MakeEntity("bring", x, y) bring_init, NULL, bring_uninit}) +#define MAP_BRING INT16_MAX + +#endif \ No newline at end of file diff --git a/disasterserver_c/entities/CreamRing.c b/disasterserver_c/entities/CreamRing.c new file mode 100644 index 0000000..358d426 --- /dev/null +++ b/disasterserver_c/entities/CreamRing.c @@ -0,0 +1,34 @@ +#include +#include +#include + +bool cring_init(Server* server, Entity* entity) +{ + CreamRing* ring = (CreamRing*)entity; + + Packet pack; + PacketCreate(&pack, SERVER_RING_STATE); + PacketWrite(&pack, packet_write8, 2); + PacketWrite(&pack, packet_write16, (uint16_t)ring->pos.x); + PacketWrite(&pack, packet_write16, (uint16_t)ring->pos.y); + PacketWrite(&pack, packet_write8, ring->rid); + PacketWrite(&pack, packet_write16, ring->id); + PacketWrite(&pack, packet_write8, ring->red); + server_broadcast(server, &pack, true); + + return true; +} + +bool cring_uninit(Server* server, Entity* entity) +{ + CreamRing* ring = (CreamRing*)entity; + + Packet pack; + PacketCreate(&pack, SERVER_RING_STATE); + PacketWrite(&pack, packet_write8, 1); + PacketWrite(&pack, packet_write8, ring->rid); + PacketWrite(&pack, packet_write16, ring->id); + server_broadcast(server, &pack, true); + + return true; +} \ No newline at end of file diff --git a/disasterserver_c/entities/CreamRing.h b/disasterserver_c/entities/CreamRing.h new file mode 100644 index 0000000..9871bed --- /dev/null +++ b/disasterserver_c/entities/CreamRing.h @@ -0,0 +1,17 @@ +#ifndef CREAM_RING +#define CREAM_RING +#include "../States.h" + +bool cring_init(Server* server, Entity* entity); +bool cring_uninit(Server* server, Entity* entity); + +typedef struct +{ + ENTITY_BODY + + uint8_t rid; + uint8_t red; +} CreamRing; +#define MakeCreamRing(x, y, red) ((CreamRing) { MakeEntity("cring", x, y) cring_init, NULL, cring_uninit, 255, red }) + +#endif \ No newline at end of file diff --git a/disasterserver_c/entities/DTBall.c b/disasterserver_c/entities/DTBall.c new file mode 100644 index 0000000..77cc0f3 --- /dev/null +++ b/disasterserver_c/entities/DTBall.c @@ -0,0 +1,29 @@ +#include "Server.h" +#include + +bool dtball_tick(Server* server, Entity* entity) +{ + DTBall* ball = (DTBall*)entity; + + if (ball->side) + { + ball->state += 0.015 * server->delta; + + if (ball->state >= 1) + ball->side = 0; + } + else + { + ball->state -= 0.015 * server->delta; + + if (ball->state <= -1) + ball->side = 1; + } + + Packet pack; + PacketCreate(&pack, SERVER_DTBALL_STATE); + PacketWrite(&pack, packet_writefloat, (float)ball->state); + server_broadcast(server, &pack, false); + + return true; +} diff --git a/disasterserver_c/entities/DTBall.h b/disasterserver_c/entities/DTBall.h new file mode 100644 index 0000000..a675a0f --- /dev/null +++ b/disasterserver_c/entities/DTBall.h @@ -0,0 +1,16 @@ +#ifndef DTBALL_H +#define DTBALL_H +#include "../States.h" + +bool dtball_tick(Server* server, Entity* entity); + +typedef struct +{ + ENTITY_BODY + + double state; + uint8_t side; +} DTBall; +#define MakeDTBall() ((DTBall) { MakeEntity("dtball", 0, 0) NULL, dtball_tick, NULL, 0, 0 }) + +#endif \ No newline at end of file diff --git a/disasterserver_c/entities/DTStalactits.c b/disasterserver_c/entities/DTStalactits.c new file mode 100644 index 0000000..5c55745 --- /dev/null +++ b/disasterserver_c/entities/DTStalactits.c @@ -0,0 +1,113 @@ +#include "Server.h" +#include + +bool dtst_init(Server* server, Entity* entity) +{ + DTStalactits* titi = (DTStalactits*)entity; + + Packet pack; + PacketCreate(&pack, SERVER_DTASS_STATE); + PacketWrite(&pack, packet_write8, 0); + PacketWrite(&pack, packet_write8, titi->sid); + PacketWrite(&pack, packet_write16, (uint16_t)titi->pos.x); + PacketWrite(&pack, packet_write16, (uint16_t)titi->pos.y); + server_broadcast(server, &pack, true); + + return true; +} + +bool dtst_tick(Server* server, Entity* entity) +{ + DTStalactits* titi = (DTStalactits*)entity; + if (titi->state) + { + titi->vel += 0.164f * (float)server->delta; + titi->pos.y += titi->vel * (float)server->delta; + + Packet pack; + PacketCreate(&pack, SERVER_DTASS_STATE); + PacketWrite(&pack, packet_write8, titi->sid); + PacketWrite(&pack, packet_write16, (uint16_t)titi->pos.x); + PacketWrite(&pack, packet_write16, (uint16_t)titi->pos.y); + server_broadcast(server, &pack, false); + } + else + { + if (!titi->show) + { + if (titi->timer > TICKSPERSEC) + titi->timer -= server->delta; + + if (titi->timer <= TICKSPERSEC) + { + Packet pack; + PacketCreate(&pack, SERVER_DTASS_STATE); + PacketWrite(&pack, packet_write8, 0); + PacketWrite(&pack, packet_write8, titi->sid); + PacketWrite(&pack, packet_write16, (uint16_t)titi->pos.x); + PacketWrite(&pack, packet_write16, (uint16_t)titi->pos.y); + server_broadcast(server, &pack, true); + + titi->show = true; + } + } + else + { + if (titi->timer > 0) + titi->timer -= server->delta; + } + + if (titi->timer <= 0) + { + for (size_t i = 0; i < server->peers.capacity; i++) + { + PeerData* data = (PeerData*)server->peers.ptr[i]; + if (!data) + continue; + + if(!data->in_game) + continue; + + if (data->plr.flags & PLAYER_DEAD) + continue; + + float dist = data->plr.pos.y - titi->pos.y; + if (dist > 0 && dist <= 336 && data->plr.pos.x >= titi->pos.x && data->plr.pos.x <= titi->pos.x + 80) + { + titi->vel = 0; + + Packet pack; + PacketCreate(&pack, SERVER_DTASS_STATE); + PacketWrite(&pack, packet_write8, 2); + PacketWrite(&pack, packet_write8, titi->sid); + server_broadcast(server, &pack, true); + + titi->state = true; + break; + } + } + } + } + + return true; +} + +bool dtst_activate(Server* server, DTStalactits* tits) +{ + if(!tits->state) + return true; + + tits->show = false; + tits->state = false; + tits->timer = (25.0 + rand() % 5 ) * TICKSPERSEC; + tits->pos.y = tits->sy; + tits->vel = 0; + + Packet pack; + PacketCreate(&pack, SERVER_DTASS_STATE); + PacketWrite(&pack, packet_write8, 1); + PacketWrite(&pack, packet_write8, tits->sid); + server_broadcast(server, &pack, true); + + return true; +} diff --git a/disasterserver_c/entities/DTStalactits.h b/disasterserver_c/entities/DTStalactits.h new file mode 100644 index 0000000..f06f55e --- /dev/null +++ b/disasterserver_c/entities/DTStalactits.h @@ -0,0 +1,23 @@ +#ifndef DTSTALACTITS_H +#define DTSTALACTITS_H +#include "../States.h" + +bool dtst_init(Server* server, Entity* entity); +bool dtst_tick(Server* server, Entity* entity); + +typedef struct +{ + ENTITY_BODY + + uint8_t sid; + bool state; + bool show; + uint16_t sx, sy; + double timer; + float vel; +} DTStalactits; +#define MakeDTStalactiti(id, x, y) ((DTStalactits) { MakeEntity("dttits", x, y) dtst_init, dtst_tick, NULL, id, 0, 1, x, y, 0, 0 }) + +bool dtst_activate(Server* server, DTStalactits* tits); + +#endif \ No newline at end of file diff --git a/disasterserver_c/entities/Dummy.c b/disasterserver_c/entities/Dummy.c new file mode 100644 index 0000000..4a77814 --- /dev/null +++ b/disasterserver_c/entities/Dummy.c @@ -0,0 +1,24 @@ +#include +#include + +bool dummy_tick(Server* server, Entity* entity) +{ + Dummy* dum = (Dummy*)entity; + + dum->pos.x += dum->vel * (float)server->delta; + dum->pos.x = (float)fmin(fmax(dum->pos.x, 1282), 2944); + dum->vel -= (fmin(fabs(dum->vel), 0.046875 * 4.) * sign(dum->vel)) * (float)server->delta; + + Packet pack; + PacketCreate(&pack, SERVER_FART_STATE); + PacketWrite(&pack, packet_write16, (float)dum->pos.x); + PacketWrite(&pack, packet_write16, (float)dum->pos.y); + server_broadcast(server, &pack, false); + + return true; +} + +void dummy_activate(Dummy* dummy, int8_t dir) +{ + dummy->vel = dir; +} diff --git a/disasterserver_c/entities/Dummy.h b/disasterserver_c/entities/Dummy.h new file mode 100644 index 0000000..13e3ea8 --- /dev/null +++ b/disasterserver_c/entities/Dummy.h @@ -0,0 +1,17 @@ +#ifndef DUMMY_H +#define DUMMY_H +#include "../States.h" + +bool dummy_tick(Server* server, Entity* entity); + +typedef struct +{ + ENTITY_BODY + + double vel; +} Dummy; +#define MakeDummy() ((Dummy) { MakeEntity("dummy", 1616, 2608) NULL, dummy_tick, NULL, 0 }) + +void dummy_activate(Dummy* dummy, int8_t dir); + +#endif \ No newline at end of file diff --git a/disasterserver_c/entities/EggmanTracker.c b/disasterserver_c/entities/EggmanTracker.c new file mode 100644 index 0000000..7bab70c --- /dev/null +++ b/disasterserver_c/entities/EggmanTracker.c @@ -0,0 +1,28 @@ +#include + +bool eggtrack_init(Server* server, Entity* entity) +{ + EggTracker* egg = (EggTracker*)entity; + + Packet pack; + PacketCreate(&pack, SERVER_ETRACKER_STATE); + PacketWrite(&pack, packet_write8, 0); + PacketWrite(&pack, packet_write16, egg->id); + PacketWrite(&pack, packet_write16, (uint16_t)egg->pos.x); + PacketWrite(&pack, packet_write16, (uint16_t)egg->pos.y); + server_broadcast(server, &pack, true); + return true; +} + +bool eggtrack_uninit(Server* server, Entity* entity) +{ + EggTracker* egg = (EggTracker*)entity; + + Packet pack; + PacketCreate(&pack, SERVER_ETRACKER_STATE); + PacketWrite(&pack, packet_write8, 1); + PacketWrite(&pack, packet_write16, egg->id); + PacketWrite(&pack, packet_write16, egg->activ_id); + server_broadcast(server, &pack, true); + return true; +} diff --git a/disasterserver_c/entities/EggmanTracker.h b/disasterserver_c/entities/EggmanTracker.h new file mode 100644 index 0000000..7aea466 --- /dev/null +++ b/disasterserver_c/entities/EggmanTracker.h @@ -0,0 +1,16 @@ +#ifndef EGGTRACK +#define EGGTRACK +#include "../States.h" + +bool eggtrack_init(Server* server, Entity* entity); +bool eggtrack_uninit(Server* server, Entity* entity); + +typedef struct +{ + ENTITY_BODY + + uint16_t activ_id; +} EggTracker; +#define MakeEggTrack(x, y) ((EggTracker) { MakeEntity("eggtrack", x, y) eggtrack_init, NULL, eggtrack_uninit, 0, }) + +#endif \ No newline at end of file diff --git a/disasterserver_c/entities/ExellerClone.c b/disasterserver_c/entities/ExellerClone.c new file mode 100644 index 0000000..ab8e8f0 --- /dev/null +++ b/disasterserver_c/entities/ExellerClone.c @@ -0,0 +1,23 @@ +#include + +bool exclone_init(Server* server, Entity* entity) +{ + ExellerClone* clone = (ExellerClone*)entity; + + Packet pack; + PacketCreate(&pack, SERVER_EXELLERCLONE_STATE); + PacketWrite(&pack, packet_write8, 0); + PacketWrite(&pack, packet_write16, clone->id); + PacketWrite(&pack, packet_write16, clone->owner); + PacketWrite(&pack, packet_write16, (uint16_t)clone->pos.x); + PacketWrite(&pack, packet_write16, (uint16_t)clone->pos.y); + PacketWrite(&pack, packet_write8, clone->dir); + server_broadcast(server, &pack, true); + + return true; +} + +bool exclone_uninit(Server* server, Entity* entity) +{ + return true; +} diff --git a/disasterserver_c/entities/ExellerClone.h b/disasterserver_c/entities/ExellerClone.h new file mode 100644 index 0000000..905f7d0 --- /dev/null +++ b/disasterserver_c/entities/ExellerClone.h @@ -0,0 +1,17 @@ +#ifndef EXELCLONE_H +#define EXELCLONE_H +#include "../States.h" + +bool exclone_init(Server* server, Entity* entity); +bool exclone_uninit(Server* server, Entity* entity); + +typedef struct +{ + ENTITY_BODY + + int8_t dir; + uint16_t owner; +} ExellerClone; +#define MakeExellerClone(x, y, dir, owner) ((ExellerClone) { MakeEntity("exclone", x, y) exclone_init, NULL, exclone_uninit, dir, owner }) + +#endif \ No newline at end of file diff --git a/disasterserver_c/entities/HDDoor.c b/disasterserver_c/entities/HDDoor.c new file mode 100644 index 0000000..1225fa8 --- /dev/null +++ b/disasterserver_c/entities/HDDoor.c @@ -0,0 +1,42 @@ +#include + +bool hddoor_tick(Server* server, Entity* entity) +{ + HDDoor* door = (HDDoor*)entity; + if (door->timer > 0) + { + door->timer -= server->delta; + if (door->timer <= 0) + { + Packet pack; + PacketCreate(&pack, SERVER_HDDOOR_STATE); + PacketWrite(&pack, packet_write8, 1); + PacketWrite(&pack, packet_write8, 1); + server_broadcast(server, &pack, true); + } + } + + return true; +} + +bool hddoor_toggle(Server* server, HDDoor* door) +{ + if (door->timer > 0) + return false; + + door->state = !door->state; + door->timer = 10.0 * TICKSPERSEC; + + Packet pack; + PacketCreate(&pack, SERVER_HDDOOR_STATE); + PacketWrite(&pack, packet_write8, 0); + PacketWrite(&pack, packet_write8, door->state); + server_broadcast(server, &pack, true); + + PacketCreate(&pack, SERVER_HDDOOR_STATE); + PacketWrite(&pack, packet_write8, 1); + PacketWrite(&pack, packet_write8, 0); + server_broadcast(server, &pack, true); + + return true; +} \ No newline at end of file diff --git a/disasterserver_c/entities/HDDoor.h b/disasterserver_c/entities/HDDoor.h new file mode 100644 index 0000000..de104a4 --- /dev/null +++ b/disasterserver_c/entities/HDDoor.h @@ -0,0 +1,18 @@ +#ifndef HDDOOR_H +#define HDDOOR_H +#include "../States.h" + +bool hddoor_tick(Server* server, Entity* entity); + +typedef struct +{ + ENTITY_BODY + + uint8_t state; + double timer; +} HDDoor; + +#define MakeHDDoor() ((HDDoor) { MakeEntity("hddoor", 0, 0) NULL, hddoor_tick, NULL, 0, 0 }) +bool hddoor_toggle(Server* server, HDDoor* door); + +#endif \ No newline at end of file diff --git a/disasterserver_c/entities/HillThunder.c b/disasterserver_c/entities/HillThunder.c new file mode 100644 index 0000000..6dd92ba --- /dev/null +++ b/disasterserver_c/entities/HillThunder.c @@ -0,0 +1,30 @@ +#include +#include + +bool thunder_tick(Server* server, Entity* entity) +{ + Thunder* th = (Thunder*)entity; + + if (th->timer <= 2 * TICKSPERSEC && !th->flag) + { + Packet pack; + PacketCreate(&pack, SERVER_GHZTHUNDER_STATE); + PacketWrite(&pack, packet_write8, 0); + server_broadcast(server, &pack, true); + th->flag = true; + } + else if (th->timer <= 0) + { + Packet pack; + PacketCreate(&pack, SERVER_GHZTHUNDER_STATE); + PacketWrite(&pack, packet_write8, 1); + server_broadcast(server, &pack, true); + + th->timer = (15 + (rand() % 5)) * TICKSPERSEC; + th->flag = false; + return true; + } + + th->timer -= server->delta; + return true; +} diff --git a/disasterserver_c/entities/HillThunder.h b/disasterserver_c/entities/HillThunder.h new file mode 100644 index 0000000..4dd6ebc --- /dev/null +++ b/disasterserver_c/entities/HillThunder.h @@ -0,0 +1,16 @@ +#ifndef GHZTHUNDER_H +#define GHZTHUNDER_H +#include "../States.h" + +bool thunder_tick(Server* server, Entity* entity); + +typedef struct +{ + ENTITY_BODY + + double timer; + bool flag; +} Thunder; +#define MakeThunder() ((Thunder) { MakeEntity("thunder", 0, 0) NULL, thunder_tick, NULL, (15 + (rand() % 5)) * TICKSPERSEC, 0 }) + +#endif \ No newline at end of file diff --git a/disasterserver_c/entities/KAFSpeedBox.c b/disasterserver_c/entities/KAFSpeedBox.c new file mode 100644 index 0000000..06d7275 --- /dev/null +++ b/disasterserver_c/entities/KAFSpeedBox.c @@ -0,0 +1,55 @@ +#include + +bool kafbox_init(Server* server, Entity* entity) +{ + KafBox* box = (KafBox*)entity; + + Packet pack; + PacketCreate(&pack, SERVER_KAFMONITOR_STATE); + PacketWrite(&pack, packet_write8, 0); + PacketWrite(&pack, packet_write8, box->nid); + server_broadcast(server, &pack, true); + + return true; +} + +bool kafbox_tick(Server* server, Entity* entity) +{ + KafBox* box = (KafBox*)entity; + + if (!box->activated) + return true; + + if (box->timer > 0) + { + box->timer -= server->delta; + return true; + } + + Packet pack; + PacketCreate(&pack, SERVER_KAFMONITOR_STATE); + PacketWrite(&pack, packet_write8, 1); + PacketWrite(&pack, packet_write8, box->nid); + server_broadcast(server, &pack, true); + + box->activated = false; + return true; +} + +bool kafbox_activate(Server* server, KafBox* box, uint16_t pid, uint8_t is_proj) +{ + if (box->activated) + return true; + + Packet pack; + PacketCreate(&pack, SERVER_KAFMONITOR_STATE); + PacketWrite(&pack, packet_write8, 2); + PacketWrite(&pack, packet_write8, box->nid); + PacketWrite(&pack, packet_write16, is_proj ? 0 : pid); + server_broadcast(server, &pack, true); + + box->activated = true; + box->timer = (25.0 + rand() % 5) * TICKSPERSEC; + + return true; +} diff --git a/disasterserver_c/entities/KAFSpeedBox.h b/disasterserver_c/entities/KAFSpeedBox.h new file mode 100644 index 0000000..bf45b2a --- /dev/null +++ b/disasterserver_c/entities/KAFSpeedBox.h @@ -0,0 +1,20 @@ +#ifndef KAFSPEEDBOX_H +#define KAFSPEEDBOX_H +#include "../States.h" + +bool kafbox_init(Server* server, Entity* entity); +bool kafbox_tick(Server* server, Entity* entity); + +typedef struct +{ + ENTITY_BODY + + uint8_t nid; + double timer; + bool activated; +} KafBox; +#define MakeKafBox(nid) ((KafBox) { MakeEntity("kafbox", 0, 0) kafbox_init, kafbox_tick, NULL, nid, 0, 0, }) + +bool kafbox_activate(Server* server, KafBox* box, uint16_t pid, uint8_t is_proj); + +#endif \ No newline at end of file diff --git a/disasterserver_c/entities/LCChain.c b/disasterserver_c/entities/LCChain.c new file mode 100644 index 0000000..1ee3cf3 --- /dev/null +++ b/disasterserver_c/entities/LCChain.c @@ -0,0 +1,55 @@ +#include + +bool lcchain_tick(Server* server, Entity* entity) +{ + LCChain* chain = (LCChain*)entity; + + switch (chain->state) + { + case LCC_NONE: + if (chain->timer >= 8 * TICKSPERSEC) + { + Packet pack; + PacketCreate(&pack, SERVER_LCCHAIN_STATE); + PacketWrite(&pack, packet_write8, 0); + server_broadcast(server, &pack, true); + + chain->timer = 0; + chain->state = LCC_PREPARE; + } + break; + + case LCC_PREPARE: + { + if (chain->timer >= 2 * TICKSPERSEC) + { + Packet pack; + PacketCreate(&pack, SERVER_LCCHAIN_STATE); + PacketWrite(&pack, packet_write8, 1); + server_broadcast(server, &pack, true); + + chain->timer = 0; + chain->state = LCC_ACTIVATE; + } + break; + } + + case LCC_ACTIVATE: + { + if (chain->timer >= 2 * TICKSPERSEC) + { + Packet pack; + PacketCreate(&pack, SERVER_LCCHAIN_STATE); + PacketWrite(&pack, packet_write8, 2); + server_broadcast(server, &pack, true); + + chain->timer = 0; + chain->state = LCC_NONE; + } + break; + } + } + + chain->timer += server->delta; + return true; +} diff --git a/disasterserver_c/entities/LCChain.h b/disasterserver_c/entities/LCChain.h new file mode 100644 index 0000000..94902fe --- /dev/null +++ b/disasterserver_c/entities/LCChain.h @@ -0,0 +1,22 @@ +#ifndef LCCHAIN_H +#define LCCHAIN_H +#include "../States.h" + +bool lcchain_tick(Server* server, Entity* entity); + +typedef struct +{ + ENTITY_BODY + + double timer; + enum + { + LCC_NONE, + LCC_PREPARE, + LCC_ACTIVATE + } state; +} LCChain; + +#define MakeLCChain() ((LCChain) { MakeEntity("lcchain", 0, 0) NULL, lcchain_tick, NULL, 0, LCC_NONE }) + +#endif \ No newline at end of file diff --git a/disasterserver_c/entities/LCEye.c b/disasterserver_c/entities/LCEye.c new file mode 100644 index 0000000..7859bbe --- /dev/null +++ b/disasterserver_c/entities/LCEye.c @@ -0,0 +1,51 @@ +#include + +bool lceye_tick(Server* server, Entity* entity) +{ + LCEye* eye = (LCEye*)entity; + + if (eye->cooldown > 0) + { + eye->cooldown -= server->delta; + return true; + } + + if (eye->timer >= TICKSPERSEC) + { + if (eye->used && eye->charge > 0) + { + eye->charge -= 20; + if (eye->charge < 20) + { + eye->cooldown = 2.0 * TICKSPERSEC; + eye->used = eye->timer = 0; + } + + RAssert(lceye_update(server, eye)); + } + else if (!eye->used && eye->charge < 100) + { + eye->charge += 10; + RAssert(lceye_update(server, eye)); + } + + eye->timer = 0; + } + + eye->timer += server->delta; + return true; +} + +bool lceye_update(Server* server, LCEye* eye) +{ + Packet pack; + PacketCreate(&pack, SERVER_LCEYE_STATE); + PacketWrite(&pack, packet_write8, (uint8_t)eye->eye_id); + PacketWrite(&pack, packet_write8, eye->used); + PacketWrite(&pack, packet_write16, eye->use_id); + PacketWrite(&pack, packet_write8, (uint8_t)eye->target); + PacketWrite(&pack, packet_write8, eye->charge); + server_broadcast(server, &pack, true); + + return true; +} diff --git a/disasterserver_c/entities/LCEye.h b/disasterserver_c/entities/LCEye.h new file mode 100644 index 0000000..4f533f8 --- /dev/null +++ b/disasterserver_c/entities/LCEye.h @@ -0,0 +1,25 @@ +#ifndef LCEYE_H +#define LCEYE_H +#include "../States.h" + +bool lceye_tick(Server* server, Entity* entity); + +typedef struct +{ + ENTITY_BODY + + uint8_t eye_id; + uint16_t use_id; + bool used; + uint8_t charge; + uint16_t target; + + double cooldown; + double timer; + +} LCEye; + +#define MakeLCEye(id) ((LCEye) { MakeEntity("lceye", 0, 0) NULL, lceye_tick, NULL, id, 0, 0, 100, 0, 0, 0 }) +bool lceye_update(Server* server, LCEye* eye); + +#endif \ No newline at end of file diff --git a/disasterserver_c/entities/MJAss.c b/disasterserver_c/entities/MJAss.c new file mode 100644 index 0000000..e7a0415 --- /dev/null +++ b/disasterserver_c/entities/MJAss.c @@ -0,0 +1,22 @@ +#include + +bool mass_tick(Server* server, Entity* entity) +{ + MAss* ass = (MAss*)entity; + + if (ass->timer >= ass->next_time) + { + ass->state = !ass->state; + ass->timer = 0; + + Packet pack; + PacketCreate(&pack, SERVER_MJCRYSTAL_STATE); + PacketWrite(&pack, packet_write8, ass->state); + server_broadcast(server, &pack, true); + + ass->next_time = (10 + rand() % 5) * TICKSPERSEC; + } + + ass->timer += server->delta; + return true; +} \ No newline at end of file diff --git a/disasterserver_c/entities/MJAss.h b/disasterserver_c/entities/MJAss.h new file mode 100644 index 0000000..a17c6e6 --- /dev/null +++ b/disasterserver_c/entities/MJAss.h @@ -0,0 +1,16 @@ +#ifndef MJASS_H +#define MJASS_H +#include "../States.h" + +bool mass_tick(Server* server, Entity* entity); + +typedef struct +{ + ENTITY_BODY + + double next_time; + double timer; + bool state; +} MAss; +#define MakeMAss() ((MAss) { MakeEntity("mass", 0, 0) NULL, mass_tick, NULL, 10 * TICKSPERSEC, 0.0, false }) +#endif \ No newline at end of file diff --git a/disasterserver_c/entities/MJJudger.c b/disasterserver_c/entities/MJJudger.c new file mode 100644 index 0000000..8bcf18f --- /dev/null +++ b/disasterserver_c/entities/MJJudger.c @@ -0,0 +1,42 @@ +#include + +bool mjew_tick(Server* server, Entity* entity) +{ + MJew* ass = (MJew*)entity; + if (ass->timer >= ass->next_time) + { + switch (ass->state) + { + case MJJ_WAIT: + { + ass->state = MJJ_PREPARE; + ass->next_time = 2 * TICKSPERSEC; + break; + } + + case MJJ_PREPARE: + { + ass->state = MJJ_FIRE; + ass->next_time = (7 + rand() % 2) * TICKSPERSEC; + break; + } + + case MJJ_FIRE: + { + ass->state = MJJ_WAIT; + ass->next_time = (10 + rand() % 5) * TICKSPERSEC; + break; + } + } + + Packet pack; + PacketCreate(&pack, SERVER_MJJUDGER_STATE); + PacketWrite(&pack, packet_write8, ass->state); + server_broadcast(server, &pack, true); + + ass->timer = 0; + } + + ass->timer += server->delta; + return true; +} \ No newline at end of file diff --git a/disasterserver_c/entities/MJJudger.h b/disasterserver_c/entities/MJJudger.h new file mode 100644 index 0000000..3b42382 --- /dev/null +++ b/disasterserver_c/entities/MJJudger.h @@ -0,0 +1,21 @@ +#ifndef MJJUDGER_H +#define MJJUDGER_H +#include "../States.h" + +bool mjew_tick(Server* server, Entity* entity); + +typedef struct +{ + ENTITY_BODY + + double next_time; + double timer; + enum + { + MJJ_WAIT, + MJJ_PREPARE, + MJJ_FIRE + } state; +} MJew; +#define MakeMJew() ((MJew) { MakeEntity("mjud", 0, 0) NULL, mjew_tick, NULL, (10 + rand() % 5) * TICKSPERSEC, 0.0, MJJ_WAIT }) +#endif \ No newline at end of file diff --git a/disasterserver_c/entities/MJLava.c b/disasterserver_c/entities/MJLava.c new file mode 100644 index 0000000..68e78f8 --- /dev/null +++ b/disasterserver_c/entities/MJLava.c @@ -0,0 +1,92 @@ +#include +#include + +bool mlava_tick(Server* server, Entity* entity) +{ + MLava* lv = (MLava*)entity; + switch (lv->state) + { + case MLV_IDLE: // Move using sin + { + lv->pos.y = lv->start + sinf((float)lv->timer / 25.0f) * 6; + + lv->timer -= server->delta; + if (lv->timer <= 0) + lv->state = MLV_MOVEDOWN; + + break; + } + + case MLV_MOVEDOWN: // Move down a bit + { + if (lv->pos.y < lv->start + 20) + { + lv->pos.y += 0.15f * (float)server->delta; + } + else + lv->state = MLV_RAISE; + + break; + } + + case MLV_RAISE: // accelerate + { + if (lv->pos.y > lv->start - lv->dist) + { + lv->pos.y -= lv->vel; + + if (lv->vel < 5) + lv->vel += 0.08f * (float)server->delta; + else + lv->vel = 5; + } + else + { + lv->state = MLV_MOVE; + lv->timer = (4.0 + rand() % 3) * TICKSPERSEC; + lv->vel = 0; + } + + break; + } + + case MLV_MOVE: // move on spot + { + lv->pos.y = (lv->start - lv->dist) + sinf((float)lv->timer / 25.0f) * 6; + + lv->timer -= server->delta; + if (lv->timer <= 0) + lv->state = MLV_LOWER; + break; + } + + case MLV_LOWER: // go down + { + if (lv->start > lv->pos.y) + { + lv->pos.y += lv->vel * (float)server->delta; + + if (lv->vel < 5) + lv->vel += 0.08f * (float)server->delta; + else + lv->vel = 5; + } + else + { + lv->state = MLV_IDLE; + lv->timer = (5.0 + rand() % 4) * TICKSPERSEC; + lv->vel = 0; + } + + break; + } + } + + Packet pack; + PacketCreate(&pack, SERVER_MJLAVA_STATE); + PacketWrite(&pack, packet_write8, lv->state); + PacketWrite(&pack, packet_writefloat, lv->pos.y); + server_broadcast(server, &pack, false); + + return true; +} diff --git a/disasterserver_c/entities/MJLava.h b/disasterserver_c/entities/MJLava.h new file mode 100644 index 0000000..438c2e4 --- /dev/null +++ b/disasterserver_c/entities/MJLava.h @@ -0,0 +1,27 @@ +#ifndef MJLAVA_H +#define MJLAVA_H +#include "../States.h" + +bool mlava_tick(Server* server, Entity* entity); + +typedef struct +{ + ENTITY_BODY + + enum + { + MLV_IDLE, + MLV_MOVEDOWN, + MLV_RAISE, + MLV_MOVE, + MLV_LOWER + } state; + double timer; + float start; + float dist; + float vel; + +} MLava; +#define MakeMLava(start, dist) ((MLava) { MakeEntity("mlava", 0, start) NULL, mlava_tick, NULL, MLV_IDLE, 5 * TICKSPERSEC, start, dist, 0 }) + +#endif \ No newline at end of file diff --git a/disasterserver_c/entities/NAPIce.c b/disasterserver_c/entities/NAPIce.c new file mode 100644 index 0000000..3099d92 --- /dev/null +++ b/disasterserver_c/entities/NAPIce.c @@ -0,0 +1,40 @@ +#include + +bool ice_tick(Server* server, Entity* entity) +{ + Ice* ice = (Ice*)entity; + if (!ice->activated) + return true; + + ice->timer -= server->delta; + if (ice->timer <= 0) + { + ice->timer = 15.0 * TICKSPERSEC; + ice->activated = false; + + Packet pack; + PacketCreate(&pack, SERVER_NAPICE_STATE); + PacketWrite(&pack, packet_write8, 1); + PacketWrite(&pack, packet_write8, ice->iid); + server_broadcast(server, &pack, true); + } + + return true; +} + +bool ice_activate(Server* server, Ice* ice) +{ + if (ice->activated) + return true; + + ice->timer = 15.0 * TICKSPERSEC; + ice->activated = true; + + Packet pack; + PacketCreate(&pack, SERVER_NAPICE_STATE); + PacketWrite(&pack, packet_write8, 0); + PacketWrite(&pack, packet_write8, ice->iid); + server_broadcast(server, &pack, true); + + return true; +} diff --git a/disasterserver_c/entities/NAPIce.h b/disasterserver_c/entities/NAPIce.h new file mode 100644 index 0000000..dba2f8f --- /dev/null +++ b/disasterserver_c/entities/NAPIce.h @@ -0,0 +1,20 @@ +#ifndef NAPICE_H +#define NAPICE_H +#include "../States.h" + +bool ice_tick(Server* server, Entity* entity); + +typedef struct +{ + ENTITY_BODY + + uint8_t iid; + bool activated; + double timer; + +} Ice; +#define MakeIce(id) ((Ice) { MakeEntity("ice", 0, 0) NULL, ice_tick, NULL, id, 0, 0 }) + +bool ice_activate(Server* server, Ice* ice); + +#endif \ No newline at end of file diff --git a/disasterserver_c/entities/NAPSnowball.c b/disasterserver_c/entities/NAPSnowball.c new file mode 100644 index 0000000..9a247ae --- /dev/null +++ b/disasterserver_c/entities/NAPSnowball.c @@ -0,0 +1,104 @@ +#include + +#define NUM_FRAMES 32 +#define ROLL_START 16 + +bool snowball_init(Server* server, Entity* entity) +{ + (void)server; + + Snowball* sb = (Snowball*)entity; + + for (int i = 0; i < 20; i++) + { + sb->p_move[i] = 0.05f; + sb->p_anim[i] = 0.35f; + } + + return true; +} + +bool snowball_tick(Server* server, Entity* entity) +{ + Snowball* sb = (Snowball*)entity; + + if (sb->timer < 20 * TICKSPERSEC) + sb->timer += server->delta; + else + { + RAssert(snowball_activate(server, sb)); + sb->timer = 0; + } + + if (sb->active) + { + if (sb->vel > 1) + { + sb->frame += sb->p_anim[sb->state] * server->delta; + sb->stage_prog += sb->p_move[sb->state] * server->delta; + + if (sb->frame >= NUM_FRAMES) + sb->frame = ROLL_START; + } + else + { + sb->vel += 0.016 * server->delta; + sb->frame += sb->vel * 0.45 * server->delta; + sb->stage_prog += sb->vel * 0.05 * server->delta; + } + + if (sb->stage_prog > 1) + { + sb->stage_prog = 0; + sb->state++; + + if (sb->state >= sb->p_count - 1) + { + sb->state = 0; + sb->stage_prog = 0; + sb->active = false; + sb->frame = 0; + + Packet pack; + PacketCreate(&pack, SERVER_NAPBALL_STATE); + PacketWrite(&pack, packet_write8, 2); + PacketWrite(&pack, packet_write8, sb->sid); + server_broadcast(server, &pack, true); + + return true; + } + } + + Packet pack; + PacketCreate(&pack, SERVER_NAPBALL_STATE); + PacketWrite(&pack, packet_write8, 1); + PacketWrite(&pack, packet_write8, sb->sid); + PacketWrite(&pack, packet_write8, sb->state); + PacketWrite(&pack, packet_write8, (uint8_t)sb->frame); + PacketWrite(&pack, packet_writedouble, sb->stage_prog); + server_broadcast(server, &pack, false); + } + + return true; +} + +bool snowball_activate(Server* server, Snowball* sb) +{ + if (sb->active) + return true; + + sb->vel = 0; + sb->state = 0; + sb->stage_prog = 0; + sb->frame = 0; + sb->active = true; + + Packet pack; + PacketCreate(&pack, SERVER_NAPBALL_STATE); + PacketWrite(&pack, packet_write8, 0); + PacketWrite(&pack, packet_write8, sb->sid); + PacketWrite(&pack, packet_write8, sb->dir); + server_broadcast(server, &pack, true); + + return true; +} diff --git a/disasterserver_c/entities/NAPSnowball.h b/disasterserver_c/entities/NAPSnowball.h new file mode 100644 index 0000000..77d181e --- /dev/null +++ b/disasterserver_c/entities/NAPSnowball.h @@ -0,0 +1,31 @@ +#ifndef NAPSNOWBALL_H +#define NAPSNOWBALL_H +#include "../States.h" + +bool snowball_init(Server* server, Entity* entity); +bool snowball_tick(Server* server, Entity* entity); + +typedef struct +{ + ENTITY_BODY + + uint8_t sid; + bool active; + uint8_t state; + double stage_prog; + int8_t dir; + double frame; + double start; + double vel; + uint8_t p_count; + double timer; + + float p_move[20]; + float p_anim[20]; + +} Snowball; +#define MakeSnowball(id, p_count, dir) ((Snowball) { MakeEntity("snowball", 0, 0) snowball_init, snowball_tick, NULL, id, 0, 0, 0, dir, 0, 0, 0, p_count, 0 }) + +bool snowball_activate(Server* server, Snowball* sb); + +#endif \ No newline at end of file diff --git a/disasterserver_c/entities/NotPerfect.c b/disasterserver_c/entities/NotPerfect.c new file mode 100644 index 0000000..d69a1c1 --- /dev/null +++ b/disasterserver_c/entities/NotPerfect.c @@ -0,0 +1,58 @@ +#include +#include + +bool npctrl_tick(Server* server, Entity* entity) +{ + NPController* ctrl = (NPController*)entity; + if (server->game.time_sec <= TICKSPERSEC && !ctrl->balls) + { + ctrl->timer = 5 * TICKSPERSEC; + ctrl->state = NPC_PREPARE; + ctrl->balls = true; + } + + switch (ctrl->state) + { + case NPC_NONE: + { + const int intr1 = server->game.time_sec < TICKSPERSEC ? 2 : 15; + if (ctrl->timer >= intr1 * TICKSPERSEC) + { + Packet pack; + + PacketCreate(&pack, SERVER_NPCONTROLLER_STATE); + PacketWrite(&pack, packet_write8, 0); + PacketWrite(&pack, packet_write8, 0); + PacketWrite(&pack, packet_write8, 0); + server_broadcast(server, &pack, true); + + ctrl->state = NPC_PREPARE; + ctrl->timer = 0; + } + break; + } + + case NPC_PREPARE: + { + const int intr2 = server->game.time_sec < TICKSPERSEC ? 3 : 5; + if (ctrl->timer >= intr2 * TICKSPERSEC) + { + ctrl->stage++; + + Packet pack; + PacketCreate(&pack, SERVER_NPCONTROLLER_STATE); + PacketWrite(&pack, packet_write8, 1); + PacketWrite(&pack, packet_write8, ctrl->stage % 4); + PacketWrite(&pack, packet_write8, (uint8_t)fmax(ctrl->stage - 1, 0) % 4); + server_broadcast(server, &pack, true); + + ctrl->state = NPC_NONE; + ctrl->timer = 0; + } + break; + } + } + + ctrl->timer += server->delta; + return true; +} \ No newline at end of file diff --git a/disasterserver_c/entities/NotPerfect.h b/disasterserver_c/entities/NotPerfect.h new file mode 100644 index 0000000..4107e04 --- /dev/null +++ b/disasterserver_c/entities/NotPerfect.h @@ -0,0 +1,22 @@ +#ifndef NPCONTROLLER_H +#define NPCONTROLLER_H +#include "../States.h" + +bool npctrl_tick(Server* server, Entity* entity); + +typedef struct +{ + ENTITY_BODY + + enum + { + NPC_NONE, + NPC_PREPARE + } state; + uint8_t stage; + double timer; + bool balls; +} NPController; +#define MakeNPCtrl() ((NPController) { MakeEntity("npctrl", 0, 0) NULL, npctrl_tick, NULL, NPC_NONE, 0, 0, 0 }) + +#endif \ No newline at end of file diff --git a/disasterserver_c/entities/PFLift.c b/disasterserver_c/entities/PFLift.c new file mode 100644 index 0000000..be76c26 --- /dev/null +++ b/disasterserver_c/entities/PFLift.c @@ -0,0 +1,89 @@ +#include + +bool pflift_init(Server* server, Entity* entity) +{ + (void)server; + + PFLift* lift = (PFLift*)entity; + lift->pos.y = lift->start; + + return true; +} + +bool pflift_tick(Server* server, Entity* entity) +{ + Packet pack; + PFLift* lift = (PFLift*)entity; + + if (!lift->activated) + { + if (lift->timer > 0) + { + lift->timer -= server->delta; + if (lift->timer <= 0) + { + // teleport back + PacketCreate(&pack, SERVER_PFLIFT_STATE); + PacketWrite(&pack, packet_write8, 3); + PacketWrite(&pack, packet_write8, lift->lid); + PacketWrite(&pack, packet_write16, (uint16_t)lift->start); + server_broadcast(server, &pack, true); + } + } + return true; + } + + if (lift->pos.y > lift->end) + { + if (lift->speed < 7.f) + lift->speed += 0.052f * (float)server->delta; + + lift->pos.y -= lift->speed * (float)server->delta; + } + else + { + PacketCreate(&pack, SERVER_PFLIFT_STATE); + PacketWrite(&pack, packet_write8, 2); + PacketWrite(&pack, packet_write8, lift->lid); + PacketWrite(&pack, packet_write16, lift->activator); + PacketWrite(&pack, packet_write16, (uint16_t)lift->pos.y); + server_broadcast(server, &pack, true); + + lift->timer = (uint16_t)(1.5f * TICKSPERSEC); + lift->activated = false; + lift->activator = 0; + } + + PacketCreate(&pack, SERVER_PFLIFT_STATE); + PacketWrite(&pack, packet_write8, 1); + PacketWrite(&pack, packet_write8, lift->lid); + PacketWrite(&pack, packet_write16, lift->activator); + PacketWrite(&pack, packet_write16, (uint16_t)lift->pos.y); + server_broadcast(server, &pack, false); + + return true; +} + +bool pflift_activate(Server* server, PFLift* lift, uint16_t id) +{ + if (lift->activated) + return true; + + if (lift->timer > 0) + return true; + + lift->activator = id; + lift->timer = 0; + lift->speed = 0; + lift->pos.y = lift->start; + lift->activated = true; + + Packet pack; + PacketCreate(&pack, SERVER_PFLIFT_STATE); + PacketWrite(&pack, packet_write8, 0); + PacketWrite(&pack, packet_write8, lift->lid); + PacketWrite(&pack, packet_write16, lift->activator); + server_broadcast(server, &pack, true); + + return true; +} diff --git a/disasterserver_c/entities/PFLift.h b/disasterserver_c/entities/PFLift.h new file mode 100644 index 0000000..fd409b2 --- /dev/null +++ b/disasterserver_c/entities/PFLift.h @@ -0,0 +1,24 @@ +#ifndef PFLIFT_H +#define PFLIFT_H +#include "../States.h" + +typedef struct +{ + ENTITY_BODY + + uint8_t lid; + double timer; + float start; + float end; + float speed; + uint16_t activator; + bool activated; + +} PFLift; +#define MakePFLift(id, start, end) ((PFLift) { MakeEntity("pflift", 0, 0) pflift_init, pflift_tick, NULL, id, 0, start, end, 0, 0, 0 }) + +bool pflift_init(Server* server, Entity* entity); +bool pflift_tick(Server* server, Entity* entity); +bool pflift_activate(Server* server, PFLift* lift, uint16_t id); + +#endif \ No newline at end of file diff --git a/disasterserver_c/entities/RMZShard.c b/disasterserver_c/entities/RMZShard.c new file mode 100644 index 0000000..a6b87d5 --- /dev/null +++ b/disasterserver_c/entities/RMZShard.c @@ -0,0 +1,16 @@ +#include + +bool shard_init(Server* server, Entity* entity) +{ + Shard* shard = (Shard*)entity; + + Packet pack; + PacketCreate(&pack, SERVER_RMZSHARD_STATE); + PacketWrite(&pack, packet_write8, shard->spawned); + PacketWrite(&pack, packet_write16, shard->id); + PacketWrite(&pack, packet_write16, (uint16_t)shard->pos.x); + PacketWrite(&pack, packet_write16, (uint16_t)shard->pos.y); + server_broadcast(server, &pack, true); + + return true; +} \ No newline at end of file diff --git a/disasterserver_c/entities/RMZShard.h b/disasterserver_c/entities/RMZShard.h new file mode 100644 index 0000000..c786c59 --- /dev/null +++ b/disasterserver_c/entities/RMZShard.h @@ -0,0 +1,15 @@ +#ifndef RMZSHARD_H +#define RMZSHARD_H +#include "../States.h" + +bool shard_init(Server* server, Entity* entity); + +typedef struct +{ + ENTITY_BODY + + uint8_t spawned; +} Shard; +#define MakeShard(x, y, spawned) ((Shard) { MakeEntity("shard", x, y) shard_init, NULL, NULL, spawned }) + +#endif \ No newline at end of file diff --git a/disasterserver_c/entities/RMZSlug.c b/disasterserver_c/entities/RMZSlug.c new file mode 100644 index 0000000..aa422b1 --- /dev/null +++ b/disasterserver_c/entities/RMZSlug.c @@ -0,0 +1,156 @@ +#include +#include + +void slug_face(Slug* slug, uint8_t side) +{ + if (side) + { + switch (slug->ring) + { + case SLUG_NORING: + slug->state = SLUG_NONERIGHT; + break; + + case SLUG_RING: + slug->state = SLUG_RINGRIGHT; + break; + + case SLUG_REDRING: + slug->state = SLUG_REDRINGRIGHT; + break; + } + } + else + { + switch (slug->ring) + { + case SLUG_NORING: + slug->state = SLUG_NONELEFT; + break; + + case SLUG_RING: + slug->state = SLUG_RINGLEFT; + break; + + case SLUG_REDRING: + slug->state = SLUG_REDRINGLEFT; + break; + } + } +} + +bool slug_init(Server* server, Entity* entity) +{ + Slug* slug = (Slug*)entity; + + int num = rand() % 100; + if (num < 50) + slug->ring = SLUG_NORING; + else if (num >= 40 && num < 90) + slug->ring = SLUG_RING; + else + slug->ring = SLUG_REDRING; + + slug->sX = slug->pos.x; + slug->sY = slug->pos.y; + + // make it face random dir + slug_face(slug, rand() % 2); + + Packet pack; + PacketCreate(&pack, SERVER_RMZSLIME_STATE); + PacketWrite(&pack, packet_write8, 0); + PacketWrite(&pack, packet_write16, slug->id); + PacketWrite(&pack, packet_write16, (uint16_t)slug->pos.x); + PacketWrite(&pack, packet_write16, (uint16_t)slug->pos.y); + PacketWrite(&pack, packet_write8, (uint8_t)slug->state); + server_broadcast(server, &pack, true); + + return true; +} + +bool slug_tick(Server* server, Entity* entity) +{ + Slug* slug = (Slug*)entity; + + switch (slug->state) + { + case SLUG_NONELEFT: + case SLUG_RINGLEFT: + case SLUG_REDRINGLEFT: + slug->pos.x -= (float)server->delta; + if (slug->pos.x <= slug->sX - 100) + slug_face(slug, 1); + break; + + case SLUG_NONERIGHT: + case SLUG_RINGRIGHT: + case SLUG_REDRINGRIGHT: + slug->pos.x += (float)server->delta; + if (slug->pos.x >= slug->sX + 100) + slug_face(slug, 0); + break; + } + + Packet pack; + PacketCreate(&pack, SERVER_RMZSLIME_STATE); + PacketWrite(&pack, packet_write8, 1); + PacketWrite(&pack, packet_write16, slug->id); + PacketWrite(&pack, packet_write16, (uint16_t)slug->pos.x); + PacketWrite(&pack, packet_write16, (uint16_t)slug->pos.y); + PacketWrite(&pack, packet_write8, (uint8_t)slug->state); + server_broadcast(server, &pack, false); + + return true; +} + +bool slug_uninit(Server* server, Entity* entity) +{ + Packet pack; + PacketCreate(&pack, SERVER_RMZSLIME_STATE); + PacketWrite(&pack, packet_write8, 2); + PacketWrite(&pack, packet_write16, entity->id); + server_broadcast(server, &pack, true); + + // find slug spawner and free it + SlugSpawner* spawners[11]; + + int found = game_find(server, (Entity**)spawners, "slugspawn", 11); + for (int i = 0; i < found; i++) + { + if (spawners[i]->slug == entity->id) + { + Debug("removed slug from %d", spawners[i]->id); + spawners[i]->slug = 0; + break; + } + } + + return true; +} + +bool slugspawn_tick(Server* server, Entity* entity) +{ + SlugSpawner* spawn = (SlugSpawner*)entity; + if (spawn->slug > 0) + return true; + + if (spawn->offset > 0) + { + spawn->offset -= server->delta; + return true; + } + + spawn->timer += server->delta; + if (spawn->timer >= 15 * TICKSPERSEC) + { + Slug* slug; + RAssert(game_spawn(server, (Entity*)&(MakeSlug(spawn->pos.x, spawn->pos.y)), sizeof(Slug), (Entity**)&slug)); + + spawn->timer = 0; + spawn->slug = slug->id; + spawn->offset = (double)((rand() % 2) * TICKSPERSEC); + } + + return true; +} diff --git a/disasterserver_c/entities/RMZSlug.h b/disasterserver_c/entities/RMZSlug.h new file mode 100644 index 0000000..b970a72 --- /dev/null +++ b/disasterserver_c/entities/RMZSlug.h @@ -0,0 +1,45 @@ +#ifndef RMZSLIME_H +#define RMZSLIME_H +#include "../States.h" + +bool slug_init(Server* server, Entity* entity); +bool slug_tick(Server* server, Entity* entity); +bool slug_uninit(Server* server, Entity* entity); + +typedef struct +{ + ENTITY_BODY + + float sX, sY; + enum + { + SLUG_NONERIGHT, + SLUG_NONELEFT, + SLUG_RINGRIGHT, + SLUG_RINGLEFT, + SLUG_REDRINGRIGHT, + SLUG_REDRINGLEFT + } state; + + enum + { + SLUG_NORING, + SLUG_RING, + SLUG_REDRING + } ring; +} Slug; +#define MakeSlug(x, y) ((Slug) { MakeEntity("slug", x, y) slug_init, slug_tick, slug_uninit, 0.f, 0.f, 0, 0 }) + +bool slugspawn_tick(Server* server, Entity* entity); + +typedef struct +{ + ENTITY_BODY + + double offset; + double timer; + uint16_t slug; +} SlugSpawner; +#define MakeSlugSpawn(x, y) ((SlugSpawner) { MakeEntity("slugspawn", x, y) NULL, slugspawn_tick, NULL, (rand() % 10) * TICKSPERSEC, 0, 0 }) + +#endif \ No newline at end of file diff --git a/disasterserver_c/entities/Ring.c b/disasterserver_c/entities/Ring.c new file mode 100644 index 0000000..aeae352 --- /dev/null +++ b/disasterserver_c/entities/Ring.c @@ -0,0 +1,54 @@ +#include +#include +#include + +bool ring_init(Server* server, Entity* entity) +{ + Ring* ring = (Ring*)entity; + + int cnt = 0; + for (int i = 0; i < g_mapList[server->game.map].ring_count; i++) + { + if (server->game.rings[i]) + cnt++; + } + + if (cnt >= g_mapList[server->game.map].ring_count) + return false; + + int rnd; +gen: + rnd = rand() % g_mapList[server->game.map].ring_count; + + if (server->game.rings[rnd]) + goto gen; + + server->game.rings[rnd] = true; + ring->rid = (uint8_t)rnd; + ring->red = g_mapList[server->game.map].spawn_red_rings && (rand() % 100 <= 10); + + Packet pack; + PacketCreate(&pack, SERVER_RING_STATE); + PacketWrite(&pack, packet_write8, 0); + PacketWrite(&pack, packet_write8, ring->rid); + PacketWrite(&pack, packet_write16, ring->id); + PacketWrite(&pack, packet_write8, ring->red); + server_broadcast(server, &pack, true); + + return true; +} + +bool ring_uninit(Server* server, Entity* entity) +{ + Ring* ring = (Ring*)entity; + server->game.rings[ring->rid] = 0; + + Packet pack; + PacketCreate(&pack, SERVER_RING_STATE); + PacketWrite(&pack, packet_write8, 1); + PacketWrite(&pack, packet_write8, ring->rid); + PacketWrite(&pack, packet_write16, ring->id); + server_broadcast(server, &pack, true); + + return true; +} \ No newline at end of file diff --git a/disasterserver_c/entities/Ring.h b/disasterserver_c/entities/Ring.h new file mode 100644 index 0000000..65c107b --- /dev/null +++ b/disasterserver_c/entities/Ring.h @@ -0,0 +1,17 @@ +#ifndef RING_H +#define RING_H +#include "../States.h" + +bool ring_init(Server* server, Entity* entity); +bool ring_uninit(Server* server, Entity* entity); + +typedef struct +{ + ENTITY_BODY + + uint8_t rid; + uint8_t red; +} Ring; +#define MakeRing() ((Ring) { MakeEntity("ring", 0, 0) ring_init, NULL, ring_uninit, 0, 0 }) + +#endif \ No newline at end of file diff --git a/disasterserver_c/entities/SpkieController.c b/disasterserver_c/entities/SpkieController.c new file mode 100644 index 0000000..7d59b50 --- /dev/null +++ b/disasterserver_c/entities/SpkieController.c @@ -0,0 +1,24 @@ +#include + +bool spike_tick(Server* server, Entity* entity) +{ + SpikeController* ctrl = (SpikeController*)entity; + ctrl->timer -= server->delta; + if (ctrl->timer > 0) + return true; + + if (++ctrl->frame > 5) + ctrl->frame = 0; + + if (ctrl->frame == 0 || ctrl->frame == 2) + ctrl->timer = 2 * TICKSPERSEC; + else + ctrl->timer = 0.25; + + Packet pack; + PacketCreate(&pack, SERVER_MOVINGSPIKE_STATE); + PacketWrite(&pack, packet_write8, ctrl->frame); + server_broadcast(server, &pack, true); + + return true; +} diff --git a/disasterserver_c/entities/SpkieController.h b/disasterserver_c/entities/SpkieController.h new file mode 100644 index 0000000..5a96726 --- /dev/null +++ b/disasterserver_c/entities/SpkieController.h @@ -0,0 +1,16 @@ +#ifndef SPIKES_H +#define SPIKES_H +#include "../States.h" + +bool spike_tick(Server* server, Entity* entity); + +typedef struct +{ + ENTITY_BODY + + uint8_t frame; + double timer; +} SpikeController; +#define MakeSpike() ((SpikeController) { MakeEntity("spikectrl", 0, 0) NULL, spike_tick, NULL, 0, 2 * TICKSPERSEC }) + +#endif \ No newline at end of file diff --git a/disasterserver_c/entities/TCAcid.c b/disasterserver_c/entities/TCAcid.c new file mode 100644 index 0000000..6bc46bd --- /dev/null +++ b/disasterserver_c/entities/TCAcid.c @@ -0,0 +1,25 @@ +#include +#include + +bool acid_tick(Server* server, Entity* entity) +{ + Acid* ac = (Acid*)entity; + + if (ac->timer >= (4 * TICKSPERSEC)) + { + ac->timer = 0; + ac->activated = !ac->activated; + + if (ac->activated) + ac->acid_id = rand() % 7; + + Packet pack; + PacketCreate(&pack, SERVER_TCGOM_STATE); + PacketWrite(&pack, packet_write8, ac->acid_id); + PacketWrite(&pack, packet_write8, ac->activated); + server_broadcast(server, &pack, true); + } + + ac->timer += server->delta; + return true; +} diff --git a/disasterserver_c/entities/TCAcid.h b/disasterserver_c/entities/TCAcid.h new file mode 100644 index 0000000..5cf2dd7 --- /dev/null +++ b/disasterserver_c/entities/TCAcid.h @@ -0,0 +1,17 @@ +#ifndef TCACID_H +#define TCACID_H +#include "../States.h" + +bool acid_tick(Server* server, Entity* entity); + +typedef struct +{ + ENTITY_BODY + + uint8_t acid_id; + uint8_t activated; + double timer; +} Acid; +#define MakeAcid() ((Acid) { MakeEntity("acid", 0, 0) NULL, acid_tick, NULL, 0, 0, 0.0 }) + +#endif \ No newline at end of file diff --git a/disasterserver_c/entities/TailsDoll.c b/disasterserver_c/entities/TailsDoll.c new file mode 100644 index 0000000..24b390f --- /dev/null +++ b/disasterserver_c/entities/TailsDoll.c @@ -0,0 +1,251 @@ +#include "Server.h" +#include +#include + +Vector2 spots[11] = +{ + { 177, 944 }, + { 1953, 544 }, + { 3279, 224 }, + { 4101, 544 }, + { 4060, 1264 }, + { 3805, 1824 }, + { 2562, 1584 }, + { 515, 1824 }, + { 2115, 1056 }, + { 984, 1184 }, + { 1498, 1504 } +}; + +void tdoll_find_spot(Server* server, TailsDoll* doll) +{ + Vector2 new_spots[11]; + int new_count = 0; + + for (int i = 0; i < 11; i++) + { + bool can_use = true; + for (size_t j = 0; j < server->peers.capacity; j++) + { + PeerData* data = (PeerData*)server->peers.ptr[j]; + if (!data) + continue; + + if(!data->in_game) + continue; + + if (vector2_dist(&spots[i], &data->plr.pos) < 480.f) + { + can_use = false; + break; + } + } + + if(can_use) + new_spots[new_count++] = spots[i]; + } + + if (new_count > 0) + { + int ball = rand() % new_count; + Vector2 spot = new_spots[ball]; + doll->pos.x = spot.x; + doll->pos.y = spot.y; + + Debug("Tails doll found spot %d at %f %f", ball, doll->pos.x, doll->pos.y); + } + else + { + Vector2 spot = spots[rand() % 11]; + doll->pos.x = spot.x; + doll->pos.y = spot.y; + + Debug("Tails doll didn't find a spot, using %f %f", doll->pos.x, doll->pos.y); + } +} + +bool tdoll_is_vaild_target(Server* server, TailsDoll* doll) +{ + if (doll->target == -1) + return false; + + for (size_t i = 0; i < server->peers.capacity; i++) + { + PeerData* data = (PeerData*)server->peers.ptr[i]; + if (!data) + continue; + + if(!data->in_game) + continue; + + if (data->id == server->game.exe) + continue; + + if (data->plr.flags & PLAYER_DEAD) + continue; + + if (data->plr.flags & PLAYER_DEMONIZED) + continue; + + if (data->plr.flags & PLAYER_ESCAPED) + continue; + + if (data->id == doll->target) + return true; + } + + return false; +} + +bool tdoll_find_target(Server* server, TailsDoll* doll) +{ + Vector2 pos = { doll->pos.x, doll->pos.y }; + + // scan for people + for (size_t i = 0; i < server->peers.capacity; i++) + { + PeerData* data = (PeerData*)server->peers.ptr[i]; + if (!data) + continue; + + if(!data->in_game) + continue; + + if (data->id == server->game.exe) + continue; + + if (data->plr.flags & PLAYER_DEAD) + continue; + + if (data->plr.flags & PLAYER_DEMONIZED) + continue; + + if (data->plr.flags & PLAYER_ESCAPED) + continue; + + if (vector2_dist(&data->plr.pos, &pos) < 130) + { + doll->target = data->id; + return true; + } + } + + return false; +} + +bool tdoll_init(Server* server, Entity* entity) +{ + TailsDoll* doll = (TailsDoll*)entity; + tdoll_find_spot(server, doll); + + Packet pack; + PacketCreate(&pack, SERVER_DTTAILSDOLL_STATE); + PacketWrite(&pack, packet_write8, 0); + PacketWrite(&pack, packet_write16, (uint16_t)doll->pos.x); + PacketWrite(&pack, packet_write16, (uint16_t)doll->pos.y); + PacketWrite(&pack, packet_write8, (uint8_t)doll->state); + server_broadcast(server, &pack, true); + + return true; +} + +bool tdoll_tick(Server* server, Entity* entity) +{ + TailsDoll* doll = (TailsDoll*)entity; + switch (doll->state) + { + case TDST_NONE: + { + if (tdoll_find_target(server, doll)) + { + doll->timer = (1 + (rand() % 2) * 0.5) * TICKSPERSEC; + doll->state = TDST_READY; + + Packet pack; + PacketCreate(&pack, SERVER_DTTAILSDOLL_STATE); + PacketWrite(&pack, packet_write8, 2); + packet_send_id(server, doll->target, &pack, true); + } + break; + } + + case TDST_READY: + { + doll->timer -= server->delta; + if (doll->timer <= 0) + { + // Send that we are following now + Packet pack; + PacketCreate(&pack, SERVER_DTTAILSDOLL_STATE); + PacketWrite(&pack, packet_write8, 3); + packet_send_id(server, doll->target, &pack, true); + + doll->state = TDST_FOLLOW; + } + break; + } + + case TDST_FOLLOW: + { + // keep searching + tdoll_find_target(server, doll); + + if (!tdoll_is_vaild_target(server, doll)) + { + doll->state = TDST_RELOC; + break; + } + + PeerData* data = server_find_peer(server, doll->target); + if (!data || !data->in_game) + { + doll->state = TDST_RELOC; + break; + } + + if (abs((int)(data->plr.pos.x - doll->pos.x)) >= 4) + { + doll->velx += sign((int)data->plr.pos.x - doll->pos.x) * 0.512 * server->delta; + doll->velx = fmin(fmax(doll->velx, -5), 5); + } + + if (abs((int)(data->plr.pos.y - doll->pos.y)) >= 5) + { + doll->vely += sign((int)data->plr.pos.y - doll->pos.y) * 0.480 * server->delta; + doll->vely = fmin(fmax(doll->vely, -5), 5); + } + + doll->pos.x += doll->velx * (float)server->delta; + doll->pos.y += doll->vely * (float)server->delta; + + if (vector2_dist(&doll->pos, &data->plr.pos) < 12) + { + Packet pack; + PacketCreate(&pack, SERVER_DTTAILSDOLL_STATE); + PacketWrite(&pack, packet_write8, 1); + packet_send_id(server, doll->target, &pack, true); + + doll->state = TDST_RELOC; + break; + } + + break; + } + + case TDST_RELOC: + { + tdoll_find_spot(server, doll); + doll->state = TDST_NONE; + break; + } + } + + Packet pack; + PacketCreate(&pack, SERVER_DTTAILSDOLL_STATE); + PacketWrite(&pack, packet_write16, (uint16_t)doll->pos.x); + PacketWrite(&pack, packet_write16, (uint16_t)doll->pos.y); + PacketWrite(&pack, packet_write8, doll->state); + server_broadcast(server, &pack, false); + + return true; +} diff --git a/disasterserver_c/entities/TailsDoll.h b/disasterserver_c/entities/TailsDoll.h new file mode 100644 index 0000000..3af25ce --- /dev/null +++ b/disasterserver_c/entities/TailsDoll.h @@ -0,0 +1,25 @@ +#ifndef TPROJECTILE_H +#define TPROJECTILE_H +#include "../States.h" + +bool tdoll_init(Server* server, Entity* entity); +bool tdoll_tick(Server* server, Entity* entity); + +typedef struct +{ + ENTITY_BODY + + enum + { + TDST_NONE, + TDST_READY, + TDST_FOLLOW, + TDST_RELOC + } state; + uint32_t target; + double timer; + double velx, vely; +} TailsDoll; +#define MakeTailsDoll() ((TailsDoll) { MakeEntity("tdoll", 0, 0) tdoll_init, tdoll_tick, NULL, TDST_NONE, -1, 0, 0.0, 0.0 }) + +#endif \ No newline at end of file diff --git a/disasterserver_c/entities/TailsProjectile.c b/disasterserver_c/entities/TailsProjectile.c new file mode 100644 index 0000000..424e9c8 --- /dev/null +++ b/disasterserver_c/entities/TailsProjectile.c @@ -0,0 +1,65 @@ +#include + +bool tproj_init(Server* server, Entity* entity) +{ + TProjectile* tproj = (TProjectile*)entity; + + Packet pack; + PacketCreate(&pack, SERVER_TPROJECTILE_STATE); + PacketWrite(&pack, packet_write8, 0); + PacketWrite(&pack, packet_write16, (uint16_t)tproj->pos.x); + PacketWrite(&pack, packet_write16, (uint16_t)tproj->pos.y); + PacketWrite(&pack, packet_write16, tproj->owner); + PacketWrite(&pack, packet_write8, tproj->dir); + PacketWrite(&pack, packet_write8, tproj->damage); + PacketWrite(&pack, packet_write8, tproj->exe); + PacketWrite(&pack, packet_write8, tproj->charge); + server_broadcast(server, &pack, true); + + return true; +} + +bool tproj_tick(Server* server, Entity* entity) +{ + TProjectile* tproj = (TProjectile*)entity; + + if (tproj->timer <= 0) + return false; + + if (server->game.map != 13) + { + if (tproj->pos.x <= 0) + return false; + } + else + { + if (tproj->pos.x < 0) + tproj->pos.x = 3648; + else if (tproj->pos.x > 3648) + tproj->pos.x = 0; + } + + Packet pack; + PacketCreate(&pack, SERVER_TPROJECTILE_STATE); + PacketWrite(&pack, packet_write8, 1); + PacketWrite(&pack, packet_write16, (uint16_t)tproj->pos.x); + PacketWrite(&pack, packet_write16, (uint16_t)tproj->pos.y); + server_broadcast(server, &pack, false); + + tproj->pos.x += (float)(tproj->dir * 14 * server->delta); + tproj->timer -= server->delta; + + return true; +} + +bool tproj_uninit(Server* server, Entity* entity) +{ + (void)entity; + + Packet pack; + PacketCreate(&pack, SERVER_TPROJECTILE_STATE); + PacketWrite(&pack, packet_write8, 2); + server_broadcast(server, &pack, true); + + return true; +} \ No newline at end of file diff --git a/disasterserver_c/entities/TailsProjectile.h b/disasterserver_c/entities/TailsProjectile.h new file mode 100644 index 0000000..8cdefd0 --- /dev/null +++ b/disasterserver_c/entities/TailsProjectile.h @@ -0,0 +1,23 @@ +#ifndef TPROJECTILE_H +#define TPROJECTILE_H +#include "../States.h" + +bool tproj_init(Server* server, Entity* entity); +bool tproj_tick(Server* server, Entity* entity); +bool tproj_uninit(Server* server, Entity* entity); + +typedef struct +{ + ENTITY_BODY + + uint16_t owner; + int8_t dir; + uint8_t exe; + uint8_t charge; + uint8_t damage; + + double timer; +} TProjectile; +#define MakeTailsProj(x, y, owner, dir, exe, charge, damage) ((TProjectile) { MakeEntity("tproj", x, y) tproj_init, tproj_tick, tproj_uninit, owner, dir, exe, charge, damage, 5 * TICKSPERSEC }) + +#endif \ No newline at end of file diff --git a/disasterserver_c/entities/VVLava.c b/disasterserver_c/entities/VVLava.c new file mode 100644 index 0000000..1e97d56 --- /dev/null +++ b/disasterserver_c/entities/VVLava.c @@ -0,0 +1,93 @@ +#include +#include + +bool lava_tick(Server* server, Entity* entity) +{ + Lava* lv = (Lava*)entity; + switch (lv->state) + { + case LV_IDLE: // Move using sin + { + lv->pos.y = lv->start + sinf((float)lv->timer / 25.0f) * 6; + + lv->timer -= server->delta; + if (lv->timer <= 0) + lv->state = LV_MOVEDOWN; + + break; + } + + case LV_MOVEDOWN: // Move down a bit + { + if (lv->pos.y < lv->start + 20) + { + lv->pos.y += 0.15f * (float)server->delta; + } + else + lv->state = LV_RAISE; + + break; + } + + case LV_RAISE: // accelerate + { + if (lv->pos.y > lv->start - lv->dist) + { + lv->pos.y -= lv->vel; + + if (lv->vel < 5) + lv->vel += 0.08f * (float)server->delta; + else + lv->vel = 5; + } + else + { + lv->state = LV_MOVE; + lv->timer = (4.0 + rand() % 3) * TICKSPERSEC; + lv->vel = 0; + } + + break; + } + + case LV_MOVE: // move on spot + { + lv->pos.y = (lv->start - lv->dist) + sinf((float)lv->timer / 25.0f) * 6; + + lv->timer -= server->delta; + if (lv->timer <= 0) + lv->state = LV_LOWER; + break; + } + + case LV_LOWER: // go down + { + if (lv->start > lv->pos.y) + { + lv->pos.y += lv->vel * (float)server->delta; + + if (lv->vel < 5) + lv->vel += 0.08f * (float)server->delta; + else + lv->vel = 5; + } + else + { + lv->state = LV_IDLE; + lv->timer = (20.0 + rand() % 5) * TICKSPERSEC; + lv->vel = 0; + } + + break; + } + } + + Packet pack; + PacketCreate(&pack, SERVER_VVLCOLUMN_STATE); + PacketWrite(&pack, packet_write8, lv->lid); + PacketWrite(&pack, packet_write8, lv->state); + PacketWrite(&pack, packet_writefloat, lv->pos.y); + server_broadcast(server, &pack, false); + + return true; +} diff --git a/disasterserver_c/entities/VVLava.h b/disasterserver_c/entities/VVLava.h new file mode 100644 index 0000000..b2d8262 --- /dev/null +++ b/disasterserver_c/entities/VVLava.h @@ -0,0 +1,28 @@ +#ifndef VVLAVA_H +#define VVLAVA_H +#include "../States.h" + +bool lava_tick(Server* server, Entity* entity); + +typedef struct +{ + ENTITY_BODY + + uint8_t lid; + enum + { + LV_IDLE, + LV_MOVEDOWN, + LV_RAISE, + LV_MOVE, + LV_LOWER + } state; + double timer; + float start; + float dist; + float vel; + +} Lava; +#define MakeLava(id, start, dist) ((Lava) { MakeEntity("lava", 0, start) NULL, lava_tick, NULL, id, LV_IDLE, (20 + rand() % 5) * TICKSPERSEC, start, dist, 0 }) + +#endif \ No newline at end of file diff --git a/disasterserver_c/entities/VVVase.h b/disasterserver_c/entities/VVVase.h new file mode 100644 index 0000000..9593b14 --- /dev/null +++ b/disasterserver_c/entities/VVVase.h @@ -0,0 +1,14 @@ +#ifndef VVVASE_H +#define VVVASE_H +#include "../States.h" + +typedef struct +{ + ENTITY_BODY + + uint8_t vid; + uint8_t type; +} Vase; +#define MakeVase(id) ((Vase) { MakeEntity("vase", 0, 0) NULL, NULL, NULL, id, (rand() % 4) }) + +#endif \ No newline at end of file diff --git a/disasterserver_c/entities/WDLatern.c b/disasterserver_c/entities/WDLatern.c new file mode 100644 index 0000000..5729183 --- /dev/null +++ b/disasterserver_c/entities/WDLatern.c @@ -0,0 +1,42 @@ +#include + +bool latern_tick(Server* server, Entity* entity) +{ + Latern* lat = (Latern*)entity; + + lat->timer += server->delta; + if (!lat->side) + { + if (lat->timer >= lat->time * TICKSPERSEC) + { + lat->lid = rand() % 7; + + Packet pack; + PacketCreate(&pack, SERVER_WDLATERN_ACTIVATE); + PacketWrite(&pack, packet_write8, true); + PacketWrite(&pack, packet_write8, lat->lid); + server_broadcast(server, &pack, true); + + lat->side = true; + lat->timer = 0; + lat->time = (20 + rand() % 2); + } + } + else + { + if (lat->timer >= lat->time * TICKSPERSEC) + { + Packet pack; + PacketCreate(&pack, SERVER_WDLATERN_ACTIVATE); + PacketWrite(&pack, packet_write8, false); + PacketWrite(&pack, packet_write8, lat->lid); + server_broadcast(server, &pack, true); + + lat->side = false; + lat->timer = 0; + lat->time = (7 + rand() % 2); + } + } + + return true; +} \ No newline at end of file diff --git a/disasterserver_c/entities/WDLatern.h b/disasterserver_c/entities/WDLatern.h new file mode 100644 index 0000000..d374caf --- /dev/null +++ b/disasterserver_c/entities/WDLatern.h @@ -0,0 +1,19 @@ +#ifndef WDLATERN_H +#define WDLATERN_H +#include +#include "../States.h" + +bool latern_tick(Server* server, Entity* entity); + +typedef struct +{ + ENTITY_BODY + + bool side; + double timer; + uint8_t lid; + uint16_t time; +} Latern; +#define MakeLatern() ((Latern) { MakeEntity("latrn", 0, 0) NULL, latern_tick, NULL, false, 0.0, 0, (7 + rand() % 2) }) + +#endif \ No newline at end of file diff --git a/disasterserver_c/entities/YouCantRun.c b/disasterserver_c/entities/YouCantRun.c new file mode 100644 index 0000000..813937e --- /dev/null +++ b/disasterserver_c/entities/YouCantRun.c @@ -0,0 +1,49 @@ +#include +#include + +bool ycrctrl_tick(Server* server, Entity* entity) +{ + YCRController* ctrl = (YCRController*)entity; + + switch (ctrl->state) + { + case YCC_NONE: + { + if (ctrl->timer >= TICKSPERSEC) + { + Packet pack; + PacketCreate(&pack, SERVER_YCRSMOKE_READY); + PacketWrite(&pack, packet_write8, ctrl->smoke_id); + server_broadcast(server, &pack, true); + + ctrl->state = YCC_SOME; + } + break; + } + + case YCC_SOME: + { + if (ctrl->timer >= 6 * TICKSPERSEC) + { + ctrl->state = YCC_NONE; + ctrl->timer = 0; + ctrl->activated = !ctrl->activated; + + if (ctrl->activated) + ctrl->smoke_id = rand() % 7; + else + ctrl->smoke_id = 0; + + Packet pack; + PacketCreate(&pack, SERVER_YCRSMOKE_STATE); + PacketWrite(&pack, packet_write8, ctrl->activated); + PacketWrite(&pack, packet_write8, ctrl->smoke_id); + server_broadcast(server, &pack, true); + } + break; + } + } + + ctrl->timer += server->delta; + return true; +} \ No newline at end of file diff --git a/disasterserver_c/entities/YouCantRun.h b/disasterserver_c/entities/YouCantRun.h new file mode 100644 index 0000000..b073708 --- /dev/null +++ b/disasterserver_c/entities/YouCantRun.h @@ -0,0 +1,22 @@ +#ifndef YCRCONTROLLER_H +#define YCRCONTROLLER_H +#include "../States.h" + +bool ycrctrl_tick(Server* server, Entity* entity); + +typedef struct +{ + ENTITY_BODY + + enum + { + YCC_NONE, + YCC_SOME + } state; + double timer; + uint8_t smoke_id; + uint8_t activated; +} YCRController; +#define MakeYCRCtrl() ((YCRController) { MakeEntity("ycrctrl", 0, 0) NULL, ycrctrl_tick, NULL, YCC_NONE, 0, 0, 0 }) + +#endif \ No newline at end of file diff --git a/disasterserver_c/io/Dir.h b/disasterserver_c/io/Dir.h new file mode 100644 index 0000000..159a686 --- /dev/null +++ b/disasterserver_c/io/Dir.h @@ -0,0 +1,12 @@ +#ifndef DIR_H +#define DIR_H +#if defined(_WIN32) +#define WIN32_LEARN_AND_MEAN +#include +#define mkdir(dir, mode) _mkdir(dir) +#elif defined(__unix) || defined(__unix__) +#include +#include +#include +#endif +#endif \ No newline at end of file diff --git a/disasterserver_c/io/Packet.c b/disasterserver_c/io/Packet.c new file mode 100644 index 0000000..aa9e414 --- /dev/null +++ b/disasterserver_c/io/Packet.c @@ -0,0 +1,440 @@ +#include +#include +#include +#include +#include + +#ifdef __GNUC__ // GCC, clang... + #define BYTESWAP_16(x) __builtin_bswap16((x)) + #define BYTESWAP_32(x) __builtin_bswap32((x)) + #define BYTESWAP_64(x) __builtin_bswap64((x)) +#else + #define BYTESWAP_16(x) _byteswap_ushort((x)) + #define BYTESWAP_32(x) _byteswap_ulong((x)) + #define BYTESWAP_64(x) _byteswap_uint64((x)) +#endif + +String string_new(const char* value) +{ + size_t len = strlen(value) + 1; + String str = { .len = len }; + memcpy(str.value, value, len); + + return str; +} + +size_t string_length(String* str) +{ + size_t len = 0; + + for (size_t i = 0; i < str->len; i++) + { + if (str->value[i] == '\0') + break; + + len += (str->value[i] & 0xc0) != 0x80; + } + + return len; +} + +String string_lower(String str) +{ + for (int i = 0; i < str.len; i++) + str.value[i] = (char)tolower(str.value[i]); + + return str; +} + +bool packet_new(Packet* packet, PacketType type) +{ + RAssert(packet); + packet->len = 0; + packet->pos = 0; + + PacketWrite(packet, packet_write8, 0); + PacketWrite(packet, packet_write8, (uint8_t)type); + + return true; +} + +bool packet_tcprecv(int sockfd, Packet* packet) +{ + if (sockfd == 0) + return false; + + packet->len = 0; + packet->pos = 0; + + struct pollfd fds[1]; + fds[0].fd = sockfd; + fds[0].events = POLLIN; + + int poll_res = Poll(fds, 1, -1); + if (poll_res < 0) + { + char err[256]; + + SOCKERR(err); + Warn("poll() failed for fd %d: %s", sockfd, err); + return false; + } + + // make sure we got POLLIN + if (!(fds[0].revents & POLLIN)) + { + Debug("%d no POLLIN, exiting", sockfd); + return false; + } + + int length = recv(sockfd, (char*)&packet->len, 1, 0); + if (length <= 0) + { + char err[256]; + + SOCKERR(err); + Warn("recv() failed for fd %d: %s", sockfd, err); + return false; + } + + uint8_t recieved = 0; + while (recieved < packet->len) + { + poll_res = Poll(fds, 1, -1); + if (poll_res < 0) + { + char err[256]; + + SOCKERR(err); + Warn("poll() failed for fd %d: %s", sockfd, err); + return false; + } + + // make sure we got POLLIN + if (!(fds[0].revents & POLLIN)) + { + Debug("%d no POLLIN, exiting", sockfd); + return false; + } + + uint8_t buff; + int length = recv(sockfd, (char*)&buff, 1, 0); + if (length <= 0) + { + char err[256]; + + SOCKERR(err); + Warn("recv() failed for fd %d: %s", sockfd, err); + return false; + } + + packet->buff[recieved++] = buff; + } + + return true; +} + +bool packet_udprecv(int sockfd, Packet* packet, IpAddr* addr) +{ + packet->len = 0; + packet->pos = 0; + + struct pollfd fds[1]; + fds[0].fd = sockfd; + fds[0].events = POLLIN; + + int poll_res = Poll(fds, 1, -1); + if (poll_res < 0) + { + char err[256]; + + SOCKERR(err); + Warn("poll() failed for fd %d: %s", sockfd, err); + return false; + } + + int addrlen = sizeof(struct sockaddr_storage); + int length = recvfrom(sockfd, packet->buff, PACKET_MAXSIZE, 0, (struct sockaddr*)&addr->storage, &addrlen); + if (length <= 0) + { + char err[256]; + + SOCKERR(err); + Warn("recvfrom() failed for fd %d: %s", sockfd, err); + return false; + } + + packet->len = length; + return true; +} + +bool packet_sendtcp(Server* server, int sockfd, Packet* packet) +{ + packet->pos = 0; + PacketWrite(packet, packet_write8, packet->len - 1); + + int length = send(sockfd, packet->buff, packet->len, MSG_NOSIGNAL); + if (length <= 0) + { + char err[256]; + + SOCKERR(err); + Warn("send() failed for fd %d: %s", sockfd, err); + server_disconnect(server, sockfd, DR_DONTREPORT, NULL); + return false; + } + + return true; +} + +bool packet_sendudp(int sockfd, IpAddr* to, Packet* packet) +{ + packet->pos = 0; + + int length; + if (to->storage.ss_family == AF_INET) + length = sendto(sockfd, packet->buff, packet->len, 0, (struct sockaddr*)&to->storage, sizeof(to->v4)); + else + return false; + + if (length <= 0) + { + char err[256]; + + SOCKERR(err); + Warn("sendto() failed for fd %d: %s", sockfd, err); + return false; + } + + return true; +} + +bool packet_seek(Packet* packet, int wh) +{ + RAssert(wh >= 0); + RAssert(wh < PACKET_MAXSIZE); + RAssert(wh < packet->len); + + packet->pos = wh; + return true; +} + +bool packet_read8(Packet* packet, uint8_t* out) +{ + RAssert(packet->pos < packet->len); + *out = packet->buff[packet->pos++]; + + return true; +} + +bool packet_read16(Packet* packet, uint16_t* out) +{ + RAssert(packet->pos < packet->len); + *out = *((int16_t*)&packet->buff[packet->pos]); + +#ifdef SYS_BIG_ENDIAN + *out = BYTESWAP_16(*out); +#endif + + packet->pos += 2; + + return true; +} + +bool packet_read32(Packet* packet, uint32_t* out) +{ + RAssert(packet->pos < packet->len); + *out = *((int32_t*)&packet->buff[packet->pos]); + +#ifdef SYS_BIG_ENDIAN + *out = BYTESWAP_32(*out); +#endif + + packet->pos += 4; + + return true; +} + +bool packet_read64(Packet* packet, uint64_t* out) +{ + RAssert(packet->pos < packet->len); + *out = *((int64_t*)&packet->buff[packet->pos]); + +#ifdef SYS_BIG_ENDIAN + *out = BYTESWAP_64(*out); +#endif + + packet->pos += 8; + + return true; +} + +bool packet_readfloat(Packet* packet, float* out) +{ + RAssert(packet->pos < packet->len); + *out = *((float*)&packet->buff[packet->pos]); + +#ifdef SYS_BIG_ENDIAN + *out = BYTESWAP_32(*out); +#endif + + packet->pos += 4; + + return true; +} + +bool packet_readdouble(Packet* packet, double* out) +{ + RAssert(packet->pos < packet->len); + *out = *((float*)&packet->buff[packet->pos]); + +#ifdef SYS_BIG_ENDIAN + * out = BYTESWAP_32(*out); +#endif + + packet->pos += 8; + + return true; +} + +bool packet_readstr(Packet* packet, String* out) +{ + out->len = 0; + + while (1) + { + RAssert(packet->pos < packet->len); + RAssert(out->len < 128); + + char ch = packet->buff[packet->pos]; + out->value[out->len] = ch; + + packet->pos++; + out->len++; + + if (ch == '\0') + break; + } + + return true; +} + +bool packet_write8(Packet* packet, uint8_t value) +{ + RAssert(packet->pos + 1 < PACKET_MAXSIZE); + + if (packet->pos + 1 >= packet->len) + packet->len++; + + packet->buff[packet->pos++] = value; + return true; +} + +bool packet_write16(Packet* packet, uint16_t value) +{ + RAssert(packet->pos + 2 < PACKET_MAXSIZE); + + if (packet->pos + 2 >= packet->len) + packet->len += 2; + +#ifdef SYS_BIG_ENDIAN + value = BYTESWAP_16(value); +#endif + + uint8_t* ptr = (uint8_t*)&value; + packet->buff[packet->pos++] = ptr[0]; + packet->buff[packet->pos++] = ptr[1]; + return true; +} + +bool packet_write32(Packet* packet, uint32_t value) +{ + RAssert(packet->pos + 4 < PACKET_MAXSIZE); + + if (packet->pos + 4 >= packet->len) + packet->len += 4; + +#ifdef SYS_BIG_ENDIAN + value = BYTESWAP_32(value); +#endif + + uint8_t* ptr = (uint8_t*)&value; + packet->buff[packet->pos++] = ptr[0]; + packet->buff[packet->pos++] = ptr[1]; + packet->buff[packet->pos++] = ptr[2]; + packet->buff[packet->pos++] = ptr[3]; + return true; +} + +bool packet_write64(Packet* packet, uint64_t value) +{ + RAssert(packet->pos + 8 < PACKET_MAXSIZE); + + if (packet->pos + 8 >= packet->len) + packet->len += 8; + +#ifdef SYS_BIG_ENDIAN + value = BYTESWAP_64(value); +#endif + + uint8_t* ptr = (uint8_t*)&value; + packet->buff[packet->pos++] = ptr[0]; + packet->buff[packet->pos++] = ptr[1]; + packet->buff[packet->pos++] = ptr[2]; + packet->buff[packet->pos++] = ptr[3]; + packet->buff[packet->pos++] = ptr[4]; + packet->buff[packet->pos++] = ptr[5]; + packet->buff[packet->pos++] = ptr[6]; + packet->buff[packet->pos++] = ptr[7]; + return true; +} + +bool packet_writefloat(Packet* packet, float value) +{ + RAssert(packet->pos + 4 < PACKET_MAXSIZE); + + if (packet->pos + 4 >= packet->len) + packet->len += 4; + +#ifdef SYS_BIG_ENDIAN + value = BYTESWAP_32(value); +#endif + + uint8_t* ptr = (uint8_t*)&value; + packet->buff[packet->pos++] = ptr[0]; + packet->buff[packet->pos++] = ptr[1]; + packet->buff[packet->pos++] = ptr[2]; + packet->buff[packet->pos++] = ptr[3]; + return true; +} + +bool packet_writedouble(Packet* packet, double value) +{ + RAssert(packet->pos + 8 < PACKET_MAXSIZE); + + if (packet->pos + 8 >= packet->len) + packet->len += 8; + +#ifdef SYS_BIG_ENDIAN + value = BYTESWAP_64(value); +#endif + + uint8_t* ptr = (uint8_t*)&value; + packet->buff[packet->pos++] = ptr[0]; + packet->buff[packet->pos++] = ptr[1]; + packet->buff[packet->pos++] = ptr[2]; + packet->buff[packet->pos++] = ptr[3]; + packet->buff[packet->pos++] = ptr[4]; + packet->buff[packet->pos++] = ptr[5]; + packet->buff[packet->pos++] = ptr[6]; + packet->buff[packet->pos++] = ptr[7]; + return true; +} + +bool packet_writestr(Packet* packet, String value) +{ + for (uint8_t i = 0; i < value.len; i++) + RAssert(packet_write8(packet, value.value[i])); + + return true; +} diff --git a/disasterserver_c/io/Packet.h b/disasterserver_c/io/Packet.h new file mode 100644 index 0000000..da4e252 --- /dev/null +++ b/disasterserver_c/io/Packet.h @@ -0,0 +1,209 @@ +#ifndef PACKET_H +#define PACKET_H +#include "Log.h" +#include "TcpListener.h" +#include "UdpListener.h" +#include + +typedef enum +{ + IDENTITY, + SERVER_IDENTITY_RESPONSE, + + SERVER_PLAYER_JOINED, + SERVER_PLAYER_LEFT, + SERVER_PLAYER_FORCE_DISCONNECT, + + SERVER_WAITING_PLAYER_INFO, + + SERVER_LOBBY_READY_STATE, + SERVER_LOBBY_EXE, + SERVER_LOBBY_COUNTDOWN, + SERVER_LOBBY_EXE_CHANGE, + SERVER_LOBBY_CHARACTER_CHANGE, + SERVER_LOBBY_CHARACTER_RESPONSE, + SERVER_LOBBY_EXECHARACTER_RESPONSE, + SERVER_LOBBY_GAME_START, + SERVER_LOBBY_PLAYER, + SERVER_LOBBY_EXE_CHANCE, + SERVER_LOBBY_CORRECT, + SERVER_LOBBY_CHOOSEVOTEKICK, + SERVER_LOBBY_CHOOSEBAN, + SERVER_LOBBY_CHOOSEKICK, + SERVER_LOBBY_CHOOSEOP, + SERVER_CHAR_TIME_SYNC, + + SERVER_VOTE_MAPS, + SERVER_VOTE_SET, + SERVER_VOTE_TIME_SYNC, + + SERVER_GAME_PLAYERS_READY, + SERVER_GAME_EXE_WINS, + SERVER_GAME_SURVIVOR_WIN, + SERVER_GAME_SPAWN_RING, + SERVER_GAME_PLAYER_ESCAPED, + SERVER_GAME_BACK_TO_LOBBY, + SERVER_GAME_TIME_SYNC, + SERVER_GAME_TIME_OVER, + SERVER_GAME_PING, + SERVER_PLAYER_DEATH_STATE, + SERVER_GAME_DEATHTIMER_TICK, + SERVER_GAME_DEATHTIMER_END, + + SERVER_REQUEST_INFO, + SERVER_HEARTBEAT, + SERVER_PONG, + + SERVER_FORCE_DAMAGE, + SERVER_GAME_RING_READY, + SERVER_PLAYER_BACKTRACK, + + // Entities + SERVER_TPROJECTILE_STATE, + SERVER_ETRACKER_STATE, + SERVER_ERECTOR_BRING_SPAWN, + SERVER_RMZSLIME_STATE, + SERVER_RMZSLIME_RINGBONUS, + SERVER_RMZSHARD_STATE, + SERVER_LCEYE_STATE, + SERVER_LCCHAIN_STATE, + SERVER_NPCONTROLLER_STATE, + SERVER_KAFMONITOR_STATE, + SERVER_YCRSMOKE_STATE, + SERVER_YCRSMOKE_READY, + SERVER_MOVINGSPIKE_STATE, + SERVER_RING_STATE, + SERVER_RING_COLLECTED, + SERVER_ACT9WALL_STATE, + SERVER_NAPBALL_STATE, + SERVER_NAPICE_STATE, + SERVER_PFLIFT_STATE, + SERVER_BRING_STATE, + SERVER_BRING_COLLECTED, + SERVER_VVLCOLUMN_STATE, + SERVER_VVVASE_STATE, + SERVER_GHZTHUNDER_STATE, + SERVER_TCGOM_STATE, + SERVER_EXELLERCLONE_STATE, + SERVER_DTTAILSDOLL_STATE, + SERVER_DTBALL_STATE, + SERVER_DTASS_STATE, + SERVER_HDDOOR_STATE, + SERVER_FART_STATE, + + // Entity actions + CLIENT_ETRACKER, + CLIENT_ETRACKER_ACTIVATED, + CLIENT_TPROJECTILE, + CLIENT_TPROJECTILE_HIT, + CLIENT_TPROJECTILE_STARTCHARGE, + CLIENT_ERECTOR_BALLS, + CLIENT_ERECTOR_BRING_SPAWN, + CLIENT_EXELLER_SPAWN_CLONE, + CLIENT_EXELLER_TELEPORT_CLONE, + CLIENT_MERCOIN_BONUS, + + CLIENT_RMZSLIME_HIT, + CLIENT_LCEYE_REQUEST_ACTIVATE, + CLIENT_KAFMONITOR_ACTIVATE, + CLIENT_RING_COLLECTED, + CLIENT_BRING_COLLECTED, + CLIENT_NAPICE_ACTIVATE, + CLIENT_SPRING_USE, + CLIENT_PFLIT_ACTIVATE, + CLIENT_VVVASE_BREAK, + CLIENT_RMZSHARD_COLLECT, + CLIENT_RMZSHARD_LAND, + CLIENT_DTASS_ACTIVATE, + CLIENT_HDDOOR_TOGGLE, + CLIENT_FART_PUSH, + + CLIENT_LOBBY_READY_STATE, + CLIENT_REQUESTED_INFO, + CLIENT_PLAYER_DATA, + CLIENT_PLAYER_HURT, + CLIENT_SOUND_EMIT, + CLIENT_PING, + + CLIENT_REVIVAL_PROGRESS, + CLIENT_PLAYER_HEAL, + CLIENT_PLAYER_HEAL_PART, + SERVER_REVIVAL_PROGRESS, + SERVER_REVIVAL_STATUS, + SERVER_REVIVAL_RINGSUB, + SERVER_REVIVAL_REVIVED, + + CLIENT_REQUEST_CHARACTER, + CLIENT_REQUEST_EXECHARACTER, + CLIENT_VOTE_REQUEST, + + CLIENT_PLAYER_DEATH_STATE, + CLIENT_PLAYER_ESCAPED, + SERVER_PLAYER_ESCAPED, + CLIENT_LOBBY_PLAYERS_REQUEST, + CLIENT_CREAM_SPAWN_RINGS, + CLIENT_SPAWN_EFFECT, + CLIENT_CHAT_MESSAGE, + CLIENT_LOBBY_CHOOSEVOTEKICK, + CLIENT_LOBBY_CHOOSEBAN, + CLIENT_LOBBY_CHOOSEKICK, + CLIENT_LOBBY_CHOOSEOP, + CLIENT_PLAYER_PALLETE, + CLIENT_PET_PALLETE, + + CLIENT_PLAYER_POTATER +} PacketType; + +typedef struct +{ + #define PACKET_MAXSIZE 256 + + uint8_t buff[PACKET_MAXSIZE]; + uint8_t pos; + uint8_t len; +} Packet; + +/* UTF-8 supporting string */ +typedef struct +{ + char value[129]; + uint16_t len; +} String; + +String string_new(const char* value); +size_t string_length(String* str); +String string_lower(String str); +#define __Str(x) string_new(x) + +bool packet_new(Packet* packet, PacketType type); +bool packet_tcprecv(int sockfd, Packet* packet); +bool packet_udprecv(int sockfd, Packet* packet, IpAddr* addr); + +struct Server; +bool packet_sendtcp(struct Server* server, int sockfd, Packet* packet); +bool packet_sendudp(int sockfd, IpAddr* to, Packet* packet); +bool packet_seek(Packet* packet, int wh); + +bool packet_read8(Packet* packet, uint8_t* out); +bool packet_read16(Packet* packet, uint16_t* out); +bool packet_read32(Packet* packet, uint32_t* out); +bool packet_read64(Packet* packet, uint64_t* out); +bool packet_readfloat(Packet* packet, float* out); +bool packet_readdouble(Packet* packet, double* out); +bool packet_readstr(Packet* packet, String* out); + +bool packet_write8(Packet* packet, uint8_t value); +bool packet_write16(Packet* packet, uint16_t value); +bool packet_write32(Packet* packet, uint32_t value); +bool packet_write64(Packet* packet, uint64_t value); +bool packet_writefloat(Packet* packet, float value); +bool packet_writedouble(Packet* packet, double value); +bool packet_writestr(Packet* packet, String value); + +#define PacketCreate(packet, type) RAssert(packet_new(packet, type)) +#define PacketRead(outname, packet, func, type)\ +type outname;\ +RAssert(func(packet, &outname)) +#define PacketWrite(packet, func, val) RAssert(func(packet, val)) + +#endif diff --git a/disasterserver_c/io/Socket.h b/disasterserver_c/io/Socket.h new file mode 100644 index 0000000..97bb415 --- /dev/null +++ b/disasterserver_c/io/Socket.h @@ -0,0 +1,35 @@ +#ifndef SOCKET_H +#define SOCKET_H + +#if defined(__unix) || defined(__unix__) + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + + #define SockError(signature) strncpy(signature, strerror(errno), 256) + #define Poll poll +#else + #define WIN32_LEAN_AND_MEAN + #include + #include + #include + #include + #include + #include + + #define close closesocket + #define SockError(signature) FormatMessageA(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS | FORMAT_MESSAGE_MAX_WIDTH_MASK , 0, WSAGetLastError(), 0, signature, 256, 0); + #define Poll WSAPoll + #define MSG_NOSIGNAL 0 + + typedef int socklen_t; +#endif + +#endif \ No newline at end of file diff --git a/disasterserver_c/io/TcpListener.c b/disasterserver_c/io/TcpListener.c new file mode 100644 index 0000000..0c7699f --- /dev/null +++ b/disasterserver_c/io/TcpListener.c @@ -0,0 +1,90 @@ +#include + +bool tcp_open(TcpListener* tcp, uint16_t port) +{ + RAssert(tcp); + +#ifdef WIN32 + WSADATA wsaData; + RAssert(WSAStartup(MAKEWORD(2, 2), &wsaData) == 0); +#endif + + tcp->fd = (int)socket(AF_INET, SOCK_STREAM, 0); + RAssert(tcp->fd >= 0); + + const int opt = 1; + RAssert(setsockopt(tcp->fd, IPPROTO_TCP, TCP_NODELAY, (const char*)&opt, sizeof(opt)) >= 0); + RAssert(setsockopt(tcp->fd, SOL_SOCKET, SO_REUSEADDR, (const char*)&opt, sizeof(opt)) >= 0); + + // Init listener + memset(&tcp->addr, 0, sizeof(tcp->addr)); + tcp->addr.sin_family = AF_INET; + tcp->addr.sin_addr.s_addr = INADDR_ANY; + tcp->addr.sin_port = htons(port); + + RAssert(bind(tcp->fd, (struct sockaddr*)&tcp->addr, sizeof(tcp->addr)) >= 0); + Info("%d SOCK_STREAM (port %d) bind succeeded.", tcp->fd, ntohs(tcp->addr.sin_port)); + return true; +} + +bool tcp_listen(TcpListener* tcp) +{ + RAssert(tcp); + RAssert(listen(tcp->fd, 3) >= 0); + Info("%d SOCK_STREAM (port %d) listening for incoming connections.", tcp->fd, ntohs(tcp->addr.sin_port)); + + return true; +} + +bool tcp_next(TcpListener* tcp, int* id, struct sockaddr_in* addr) +{ + RAssert(tcp); + + size_t addr_len = sizeof(struct sockaddr_in); + *id = accept(tcp->fd, (struct sockaddr*)addr, &addr_len); + + if (*id < 0) + { + char err[256]; + SOCKERR(err); + Err("%d SOCK_STREAM: accept failed for fd %d: %s", tcp->fd, *id, err); + + return false; + } + +#ifdef WIN32 + static const u_long mode = 1; // 1 to enable non-blocking socket + + if (ioctlsocket(*id, FIONBIO, &mode) != NOERROR) + { + char err[256]; + SOCKERR(err); + Err("%d SOCK_STREAM: fnctl failed for fd %d: %s", tcp->fd, *id, err); + + close(*id); + return false; + } +#elif defined(__unix) || defined(__unix__) + if (fcntl(*id, F_SETFL, fcntl(*id, F_GETFL, 0) | O_NONBLOCK) == -1) + { + char err[256]; + SOCKERR(err); + Err("%d SOCK_STREAM: fnctl failed for fd %d: %s", tcp->fd, *id, err); + + close(*id); + return false; + } +#endif + + Info("%d SOCK_STREAM: connected (id %d, ip %s)", tcp->fd, *id, inet_ntoa(addr->sin_addr)); + return true; +} + +bool tcp_kill(TcpListener* tcp, int id) +{ + close(id); + RAssert(tcp); + + Info("%d SOCK_STREAM: disconnected (id %d)", tcp->fd, id); + return true; +} \ No newline at end of file diff --git a/disasterserver_c/io/TcpListener.h b/disasterserver_c/io/TcpListener.h new file mode 100644 index 0000000..68132cb --- /dev/null +++ b/disasterserver_c/io/TcpListener.h @@ -0,0 +1,51 @@ +#ifndef TCPLISTENER_H +#define TCPLISTENER_H + +#include "../Log.h" + +#include +#include +#include +#include + +#if defined(__unix) || defined(__unix__) + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + + #define SOCKERR(signature) strncpy(signature, strerror(errno), 256) + #define Poll poll +#else + #define WIN32_LEAN_AND_MEAN + #include + #include + #include + #include + #include + #include + + #define close closesocket + #define SOCKERR(signature) FormatMessageA(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS | FORMAT_MESSAGE_MAX_WIDTH_MASK , 0, WSAGetLastError(), 0, signature, 256, 0); + #define Poll WSAPoll + #define MSG_NOSIGNAL 0 +#endif + +typedef struct +{ + struct sockaddr_in addr; + int fd; +} TcpListener; + +bool tcp_open (TcpListener* tcp, uint16_t port); +bool tcp_listen (TcpListener* tcp); +bool tcp_next (TcpListener* tcp, int* fd, struct sockaddr_in* addr); +bool tcp_kill (TcpListener* tcp, int fd); + +#endif diff --git a/disasterserver_c/io/Threads.h b/disasterserver_c/io/Threads.h new file mode 100644 index 0000000..d36faf3 --- /dev/null +++ b/disasterserver_c/io/Threads.h @@ -0,0 +1,54 @@ +#ifndef THREADS_H +#define THREADS_H + +#if defined(__unix) || defined(__unix__) + #include + #include + #include + #include + + typedef pthread_t Thread; + typedef pthread_key_t ThreadVar; + typedef void* (*pthread_cbfunc_t) (void*); + + #define ThreadVarCreate(var) pthread_key_create(&var, NULL) + #define ThreadVarSet(var, value) pthread_setspecific(var, value) + #define ThreadVarGet(var) pthread_getspecific(var) + #define ThreadVarFree(var) pthread_key_delete(var) + + #define ThreadSpawn(thr, cb, arg) { pthread_create(&thr, NULL, (pthread_cbfunc_t)(cb), (arg)); pthread_detach(thr); } + #define ThreadJoin(thr) pthread_join(thr, NULL) + #define ThreadSleep(ms) { struct timespec ts;\ + ts.tv_sec = ms / 1000;\ + ts.tv_nsec = (ms % 1000) * 1000000;\ + nanosleep(&ts, NULL); } + + typedef pthread_mutex_t Mutex; + #define MutexCreate(mut) RAssert(pthread_mutex_init(&mut, NULL) == 0) + #define MutexLock(mut) RAssert(pthread_mutex_lock(&mut) == 0) + #define MutexUnlock(mut) RAssert(pthread_mutex_unlock(&mut) == 0) +#else + #define WIN32_LEAN_AND_MEAN + #include + + typedef HANDLE Thread; + typedef DWORD ThreadVar; + + #define ThreadVarCreate(var) RAssert((var = TlsAlloc()) != TLS_OUT_OF_INDEXES) + #define ThreadVarGet(var) TlsGetValue(var) + #define ThreadVarSet(var, value) TlsSetValue(var, value) + #define ThreadVarFree(var) TlsFree(var) + + #define ThreadSpawn(thr, cb, arg) (thr = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)(cb), (arg), 0, NULL)) + #define ThreadJoin(thr) WaitForSingleObject(thr, INFINITE) + #define ThreadSleep(ms) Sleep(ms) + + typedef HANDLE Mutex; + #define MutexCreate(mut) (mut = CreateMutex(NULL, FALSE, NULL)) + #define MutexLock(mut) RAssert(WaitForSingleObject(mut, INFINITE) == WAIT_OBJECT_0) + #define MutexUnlock(mut) RAssert(ReleaseMutex(mut)) +#endif + +extern ThreadVar g_threadName; + +#endif diff --git a/disasterserver_c/io/Time.c b/disasterserver_c/io/Time.c new file mode 100644 index 0000000..bdc1df2 --- /dev/null +++ b/disasterserver_c/io/Time.c @@ -0,0 +1,49 @@ +#include +#include +#include +#include +#include + +bool init = false; +double freq = 0; + +void time_start(TimeStamp* timer) +{ +#ifdef _WIN32 + LARGE_INTEGER li; + + if (!init) + { + if (!QueryPerformanceFrequency(&li)) + { + Err("Failed to query perfomance frequency!"); + return; + } + + freq = (double)(li.QuadPart) / 1000.0; + init = true; + } + + QueryPerformanceCounter(&li); + *timer = (li.QuadPart / freq); +#else + struct timespec _t; + clock_gettime(CLOCK_MONOTONIC, &_t); + *timer = _t.tv_sec * 1000 + _t.tv_nsec / 1e6; +#endif +} + +double time_end(TimeStamp* timer) +{ +#ifdef _WIN32 + LARGE_INTEGER li; + QueryPerformanceCounter(&li); + return (double)((li.QuadPart) / freq) - (*timer); +#else + struct timespec _t; + clock_gettime(CLOCK_MONOTONIC, &_t); + + double current = _t.tv_sec * 1000 + _t.tv_nsec / 1e6; + return current - (*timer); +#endif +} diff --git a/disasterserver_c/io/Time.h b/disasterserver_c/io/Time.h new file mode 100644 index 0000000..a48b347 --- /dev/null +++ b/disasterserver_c/io/Time.h @@ -0,0 +1,15 @@ +#ifndef TIME_H +#define TIME_H +#include +#include + +#if defined(_WIN32) + #define WIN32_LEAN_AND_MEAN + #include +#endif + +typedef double TimeStamp; +void time_start (TimeStamp* timer); +double time_end (TimeStamp* timer); + +#endif \ No newline at end of file diff --git a/disasterserver_c/io/UdpListener.c b/disasterserver_c/io/UdpListener.c new file mode 100644 index 0000000..b2a68a5 --- /dev/null +++ b/disasterserver_c/io/UdpListener.c @@ -0,0 +1,30 @@ +#include "io/UdpListener.h" +#include "io/TcpListener.h" + +#define SIO_UDP_CONNRESET _WSAIOW(IOC_VENDOR, 12) + +bool udp_open(UdpListener* udp, uint16_t port) +{ + RAssert(udp); + + udp->fd = (int)socket(AF_INET, SOCK_DGRAM, 0); + RAssert(udp->fd >= 0); + + // Init listener + memset(&udp->addr, 0, sizeof(udp->addr)); + udp->addr.sin_family = AF_INET; + udp->addr.sin_addr.s_addr = INADDR_ANY; + udp->addr.sin_port = htons(port); + + RAssert(bind(udp->fd, (struct sockaddr*)&udp->addr, sizeof(udp->addr)) >= 0); + Info("%d SOCK_DGRAM (port %d) bind succeeded.", udp->fd, ntohs(udp->addr.sin_port)); + +#ifdef WIN32 + BOOL beh = FALSE; + DWORD returned = 0; + RAssert(WSAIoctl(udp->fd, SIO_UDP_CONNRESET, &beh, sizeof(beh), NULL, 0, &returned, NULL, NULL) == 0); + Info("%d SOCK_DGRAM (port %d) applied SIO_UDP_CONNRESET hack.", udp->fd, ntohs(udp->addr.sin_port)); +#endif + + return true; +} \ No newline at end of file diff --git a/disasterserver_c/io/UdpListener.h b/disasterserver_c/io/UdpListener.h new file mode 100644 index 0000000..e406740 --- /dev/null +++ b/disasterserver_c/io/UdpListener.h @@ -0,0 +1,34 @@ +#ifndef UDPLISTENER_H +#define UDPLISTENER_H + +#include "../Log.h" + +#if defined(__unix) || defined(__unix__) + #include + #include + #include + #include + #include +#else + #define WIN32_LEAN_AND_MEAN + #include + #include + #define close closesocket +#endif + +typedef union +{ + struct sockaddr addr; + struct sockaddr_in v4; + struct sockaddr_storage storage; +} IpAddr; + +typedef struct +{ + struct sockaddr_in addr; + int fd; +} UdpListener; + +bool udp_open (UdpListener* udp, uint16_t port); + +#endif diff --git a/disasterserver_c/maps/Act9.c b/disasterserver_c/maps/Act9.c new file mode 100644 index 0000000..34d9177 --- /dev/null +++ b/disasterserver_c/maps/Act9.c @@ -0,0 +1,14 @@ +#include +#include +#include + +bool act9_init(Server* server) +{ + RAssert(map_time(server, 2.17 * TICKSPERSEC, 10)); // 130 + RAssert(map_ring(server, 3)); + + RAssert(game_spawn(server, (Entity*)&(MakeAct9Wall(0, 0, 1025)), sizeof(Act9Wall), NULL)); + RAssert(game_spawn(server, (Entity*)&(MakeAct9Wall(1, 1663, 0)), sizeof(Act9Wall), NULL)); + RAssert(game_spawn(server, (Entity*)&(MakeAct9Wall(2, 1663, 0)), sizeof(Act9Wall), NULL)); + return true; +} \ No newline at end of file diff --git a/disasterserver_c/maps/Act9.h b/disasterserver_c/maps/Act9.h new file mode 100644 index 0000000..12e98cc --- /dev/null +++ b/disasterserver_c/maps/Act9.h @@ -0,0 +1,7 @@ +#ifndef ACT9_H +#define ACT9_H +#include "../Maps.h" + +bool act9_init(Server* server); + +#endif \ No newline at end of file diff --git a/disasterserver_c/maps/DarkTower.c b/disasterserver_c/maps/DarkTower.c new file mode 100644 index 0000000..3a1399d --- /dev/null +++ b/disasterserver_c/maps/DarkTower.c @@ -0,0 +1,58 @@ +#include +#include +#include +#include + +bool dt_init(Server* server) +{ + RAssert(map_time(server, 3.42 * TICKSPERSEC, 20)); //205 + RAssert(map_ring(server, 5)); + + RAssert(game_spawn(server, (Entity*)&(MakeDTBall()), sizeof(DTBall), NULL)); + RAssert(game_spawn(server, (Entity*)&(MakeTailsDoll()), sizeof(TailsDoll), NULL)); + + RAssert(game_spawn(server, (Entity*)&(MakeDTStalactiti(0, 1744, 224)), sizeof(DTStalactits), NULL)); + RAssert(game_spawn(server, (Entity*)&(MakeDTStalactiti(1, 1840, 224)), sizeof(DTStalactits), NULL)); + RAssert(game_spawn(server, (Entity*)&(MakeDTStalactiti(2, 1936, 224)), sizeof(DTStalactits), NULL)); + RAssert(game_spawn(server, (Entity*)&(MakeDTStalactiti(3, 2032, 224)), sizeof(DTStalactits), NULL)); + RAssert(game_spawn(server, (Entity*)&(MakeDTStalactiti(4, 2128, 224)), sizeof(DTStalactits), NULL)); + + RAssert(game_spawn(server, (Entity*)&(MakeDTStalactiti(5, 1824, 784)), sizeof(DTStalactits), NULL)); + RAssert(game_spawn(server, (Entity*)&(MakeDTStalactiti(6, 1920, 784)), sizeof(DTStalactits), NULL)); + RAssert(game_spawn(server, (Entity*)&(MakeDTStalactiti(7, 2016, 784)), sizeof(DTStalactits), NULL)); + RAssert(game_spawn(server, (Entity*)&(MakeDTStalactiti(8, 2112, 784)), sizeof(DTStalactits), NULL)); + RAssert(game_spawn(server, (Entity*)&(MakeDTStalactiti(9, 2208, 784)), sizeof(DTStalactits), NULL)); + + RAssert(game_spawn(server, (Entity*)&(MakeDTStalactiti(10, 2464, 1384)), sizeof(DTStalactits), NULL)); + RAssert(game_spawn(server, (Entity*)&(MakeDTStalactiti(11, 2592, 1384)), sizeof(DTStalactits), NULL)); + + RAssert(game_spawn(server, (Entity*)&(MakeDTStalactiti(12, 3032, 64)), sizeof(DTStalactits), NULL)); + RAssert(game_spawn(server, (Entity*)&(MakeDTStalactiti(13, 3088, 64)), sizeof(DTStalactits), NULL)); + + return true; +} + +bool dt_tcpmsg(PeerData* v, Packet* packet) +{ + PacketRead(passtrough, packet, packet_read8, uint8_t); + PacketRead(type, packet, packet_read8, uint8_t); + + switch (type) + { + case CLIENT_DTASS_ACTIVATE: + { + PacketRead(sid, packet, packet_read8, uint8_t); + AssertOrDisconnect(v->server, v->in_game); + AssertOrDisconnect(v->server, sid < 14); + + DTStalactits* ents[14]; + if (!game_find(v->server, (Entity**)ents, "dttits", 14)) + break; + + RAssert(dtst_activate(v->server, ents[sid])); + break; + } + } + + return true; +} diff --git a/disasterserver_c/maps/DarkTower.h b/disasterserver_c/maps/DarkTower.h new file mode 100644 index 0000000..eaec307 --- /dev/null +++ b/disasterserver_c/maps/DarkTower.h @@ -0,0 +1,8 @@ +#ifndef DARKTOWER_H +#define DARKTOWER_H +#include "../Maps.h" + +bool dt_init(Server* server); +bool dt_tcpmsg(PeerData* v, Packet* packet); + +#endif \ No newline at end of file diff --git a/disasterserver_c/maps/DotDotDot.c b/disasterserver_c/maps/DotDotDot.c new file mode 100644 index 0000000..6f10112 --- /dev/null +++ b/disasterserver_c/maps/DotDotDot.c @@ -0,0 +1,12 @@ +#include +#include +#include + +bool dot_init(Server* server) +{ + RAssert(map_time(server, 3.42 * TICKSPERSEC, 20)); //205 + RAssert(map_ring(server, 5)); + RAssert(game_spawn(server, (Entity*)&(MakeSpike()), sizeof(SpikeController), NULL)); + + return true; +} diff --git a/disasterserver_c/maps/DotDotDot.h b/disasterserver_c/maps/DotDotDot.h new file mode 100644 index 0000000..6c21e57 --- /dev/null +++ b/disasterserver_c/maps/DotDotDot.h @@ -0,0 +1,7 @@ +#ifndef THREEDOTS_H +#define THREEDOTS_H +#include "../Maps.h" + +bool dot_init(Server* server); + +#endif \ No newline at end of file diff --git a/disasterserver_c/maps/FartZone.c b/disasterserver_c/maps/FartZone.c new file mode 100644 index 0000000..aa5298b --- /dev/null +++ b/disasterserver_c/maps/FartZone.c @@ -0,0 +1,45 @@ +#include +#include +#include +#include +#include +#include + +bool ft_init(Server* server) +{ + RAssert(map_time(server, 4.27 * TICKSPERSEC, 20)); + RAssert(map_ring(server, 1)); + + for (uint8_t i = 0; i < 3; i++) + RAssert(game_spawn(server, (Entity*)&(MakeBlackRing(MAP_BRING, MAP_BRING)), sizeof(BRing), NULL)); + + RAssert(game_spawn(server, (Entity*)&(MakeDummy()), sizeof(Dummy), NULL)); + RAssert(game_spawn(server, (Entity*)&(MakeSpike()), sizeof(SpikeController), NULL)); + RAssert(game_spawn(server, (Entity*)&(MakeDTBall()), sizeof(DTBall), NULL)); + + return true; +} + +bool ft_tcpmsg(PeerData* v, Packet* packet) +{ + PacketRead(passtrough, packet, packet_read8, uint8_t); + PacketRead(type, packet, packet_read8, uint8_t); + + switch (type) + { + case CLIENT_FART_PUSH: + { + AssertOrDisconnect(v->server, v->in_game); + PacketRead(spd, packet, packet_read8, int8_t); + + Dummy* dum; + if (!game_find(v->server, (Entity**)&dum, "dummy", 1)) + break; + + dummy_activate(dum, spd); + break; + } + } + + return true; +} diff --git a/disasterserver_c/maps/FartZone.h b/disasterserver_c/maps/FartZone.h new file mode 100644 index 0000000..55cd3c8 --- /dev/null +++ b/disasterserver_c/maps/FartZone.h @@ -0,0 +1,8 @@ +#ifndef FARTZONE_H +#define FARTZONE_H +#include "../Maps.h" + +bool ft_init(Server* server); +bool ft_tcpmsg(PeerData* v, Packet* packet); + +#endif \ No newline at end of file diff --git a/disasterserver_c/maps/HauntingDream.c b/disasterserver_c/maps/HauntingDream.c new file mode 100644 index 0000000..360ab7a --- /dev/null +++ b/disasterserver_c/maps/HauntingDream.c @@ -0,0 +1,34 @@ +#include +#include +#include + +bool hd_init(Server* server) +{ + RAssert(map_time(server, 3.42 * TICKSPERSEC, 20)); //205 + RAssert(map_ring(server, 5)); + RAssert(game_spawn(server, (Entity*)&(MakeHDDoor()), sizeof(HDDoor), NULL)); + + return true; +} + +bool hd_tcpmsg(PeerData* v, Packet* packet) +{ + PacketRead(passtrough, packet, packet_read8, uint8_t); + PacketRead(type, packet, packet_read8, uint8_t); + + switch (type) + { + case CLIENT_HDDOOR_TOGGLE: + { + AssertOrDisconnect(v->server, v->in_game); + HDDoor* door; + if (!game_find(v->server, (Entity**)&door, "hddoor", 1)) + break; + + hddoor_toggle(v->server, door); + break; + } + } + + return true; +} diff --git a/disasterserver_c/maps/HauntingDream.h b/disasterserver_c/maps/HauntingDream.h new file mode 100644 index 0000000..bfc2237 --- /dev/null +++ b/disasterserver_c/maps/HauntingDream.h @@ -0,0 +1,8 @@ +#ifndef HAUNTDREAM_H +#define HAUNTDREAM_H +#include "../Maps.h" + +bool hd_init(Server* server); +bool hd_tcpmsg(PeerData* v, Packet* packet); + +#endif \ No newline at end of file diff --git a/disasterserver_c/maps/HideAndSeek.c b/disasterserver_c/maps/HideAndSeek.c new file mode 100644 index 0000000..b22cc71 --- /dev/null +++ b/disasterserver_c/maps/HideAndSeek.c @@ -0,0 +1,10 @@ +#include +#include + +bool hs2_init(Server* server) +{ + RAssert(map_time(server, 3.42 * TICKSPERSEC, 20)); //205 + RAssert(map_ring(server, 5)); + + return true; +} \ No newline at end of file diff --git a/disasterserver_c/maps/HideAndSeek2.h b/disasterserver_c/maps/HideAndSeek2.h new file mode 100644 index 0000000..433cdda --- /dev/null +++ b/disasterserver_c/maps/HideAndSeek2.h @@ -0,0 +1,7 @@ +#ifndef HIDEANDSEEK2_H +#define HIDEANDSEEK2_H +#include "../Maps.h" + +bool hs2_init(Server* server); + +#endif \ No newline at end of file diff --git a/disasterserver_c/maps/Hill.c b/disasterserver_c/maps/Hill.c new file mode 100644 index 0000000..cb908b5 --- /dev/null +++ b/disasterserver_c/maps/Hill.c @@ -0,0 +1,14 @@ +#include +#include +#include +#include + +bool hill_init(Server* server) +{ + RAssert(map_time(server, 3 * TICKSPERSEC, 20)); + RAssert(map_ring(server, 5)); + + RAssert(game_spawn(server, (Entity*)&(MakeThunder()), sizeof(Thunder), NULL)); + + return true; +} \ No newline at end of file diff --git a/disasterserver_c/maps/Hill.h b/disasterserver_c/maps/Hill.h new file mode 100644 index 0000000..5713ebc --- /dev/null +++ b/disasterserver_c/maps/Hill.h @@ -0,0 +1,7 @@ +#ifndef HILL_H +#define HILL_H +#include "../Maps.h" + +bool hill_init(Server* server); + +#endif \ No newline at end of file diff --git a/disasterserver_c/maps/KindAndFair.c b/disasterserver_c/maps/KindAndFair.c new file mode 100644 index 0000000..89409df --- /dev/null +++ b/disasterserver_c/maps/KindAndFair.c @@ -0,0 +1,39 @@ +#include +#include +#include + +bool kaf_init(Server* server) +{ + RAssert(map_time(server, 3 * TICKSPERSEC, 20)); //180 + RAssert(map_ring(server, 5)); + + for (uint8_t i = 0; i < 11; i++) + RAssert(game_spawn(server, (Entity*)&(MakeKafBox(i)), sizeof(KafBox), NULL)); + + return true; +} + +bool kaf_tcpmsg(PeerData* v, Packet* packet) +{ + PacketRead(passtrough, packet, packet_read8, uint8_t); + PacketRead(type, packet, packet_read8, uint8_t); + + switch (type) + { + case CLIENT_KAFMONITOR_ACTIVATE: + { + AssertOrDisconnect(v->server, v->in_game); + PacketRead(nid, packet, packet_read8, uint8_t); + PacketRead(proj, packet, packet_read8, uint8_t); + + KafBox* box[11]; + if (!game_find(v->server, (Entity**)box, "kafbox", 11)) + break; + + RAssert(kafbox_activate(v->server, box[nid], v->id, proj)); + break; + } + } + + return true; +} diff --git a/disasterserver_c/maps/KindAndFair.h b/disasterserver_c/maps/KindAndFair.h new file mode 100644 index 0000000..d4f8264 --- /dev/null +++ b/disasterserver_c/maps/KindAndFair.h @@ -0,0 +1,8 @@ +#ifndef KINDANDFAIR_H +#define KINDANDFAIR_H +#include "../Maps.h" + +bool kaf_init (Server* server); +bool kaf_tcpmsg (PeerData* v, Packet* packet); + +#endif \ No newline at end of file diff --git a/disasterserver_c/maps/LimpCity.c b/disasterserver_c/maps/LimpCity.c new file mode 100644 index 0000000..a8bf105 --- /dev/null +++ b/disasterserver_c/maps/LimpCity.c @@ -0,0 +1,65 @@ +#include +#include +#include + +bool lc_init(Server* server) +{ + RAssert(map_time(server, 2.585 * TICKSPERSEC, 20)); //155 + RAssert(map_ring(server, 5)); + + RAssert(game_spawn(server, (Entity*)&(MakeLCEye(0)), sizeof(LCEye), NULL)); + RAssert(game_spawn(server, (Entity*)&(MakeLCEye(1)), sizeof(LCEye), NULL)); + RAssert(game_spawn(server, (Entity*)&(MakeLCChain()), sizeof(LCChain), NULL)); + + return true; +} + +bool lc_tcpmsg(PeerData* v, Packet* packet) +{ + PacketRead(passtrough, packet, packet_read8, uint8_t); + PacketRead(type, packet, packet_read8, uint8_t); + + switch (type) + { + case CLIENT_LCEYE_REQUEST_ACTIVATE: + { + PacketRead(val, packet, packet_read8, uint8_t); + PacketRead(nid, packet, packet_read8, uint8_t); + PacketRead(target, packet, packet_read8, uint8_t); + AssertOrDisconnect(v->server, nid < 2); + AssertOrDisconnect(v->server, v->in_game); + + LCEye* eyes[2]; + if (!game_find(v->server, (Entity**)eyes, "lceye", 2)) + break; + + LCEye* eye = eyes[nid]; + if (val) + { + if (eye->used) + break; + + if (eye->charge < 20) + break; + + eye->use_id = v->id; + eye->target = target; + eye->used = true; + eye->timer = 0; + + RAssert(lceye_update(v->server, eye)); + } + else + { + eye->used = false; + eye->timer = 0; + + RAssert(lceye_update(v->server, eye)); + } + + break; + } + } + + return true; +} diff --git a/disasterserver_c/maps/LimpCity.h b/disasterserver_c/maps/LimpCity.h new file mode 100644 index 0000000..d59e916 --- /dev/null +++ b/disasterserver_c/maps/LimpCity.h @@ -0,0 +1,8 @@ +#ifndef LIMPCITY_H +#define LIMPCITY_H +#include "../Maps.h" + +bool lc_init(Server* server); +bool lc_tcpmsg(PeerData* v, Packet* packet); + +#endif \ No newline at end of file diff --git a/disasterserver_c/maps/MajinForest.c b/disasterserver_c/maps/MajinForest.c new file mode 100644 index 0000000..6cccb06 --- /dev/null +++ b/disasterserver_c/maps/MajinForest.c @@ -0,0 +1,9 @@ +#include +#include + +bool maj_init(Server* server) +{ + RAssert(map_time(server, 2.585 * TICKSPERSEC, 10)); //155 + RAssert(map_ring(server, 3)); + return true; +} diff --git a/disasterserver_c/maps/MajinForest.h b/disasterserver_c/maps/MajinForest.h new file mode 100644 index 0000000..3ad6690 --- /dev/null +++ b/disasterserver_c/maps/MajinForest.h @@ -0,0 +1,7 @@ +#ifndef MAJINFOREST_H +#define MAJINFOREST_H +#include "../Maps.h" + +bool maj_init(Server* server); + +#endif \ No newline at end of file diff --git a/disasterserver_c/maps/Marijuna.c b/disasterserver_c/maps/Marijuna.c new file mode 100644 index 0000000..793d311 --- /dev/null +++ b/disasterserver_c/maps/Marijuna.c @@ -0,0 +1,16 @@ +#include +#include +#include +#include + +bool mj_init(Server* server) +{ + RAssert(map_time(server, 3.42 * TICKSPERSEC, 20)); //205 + RAssert(map_ring(server, 5)); + + RAssert(game_spawn(server, (Entity*)&MakeMLava(1624, 512), sizeof(MLava), NULL)); + RAssert(game_spawn(server, (Entity*)&MakeMAss(), sizeof(MAss), NULL)); + RAssert(game_spawn(server, (Entity*)&MakeMJew(), sizeof(MJew), NULL)); + + return true; +} \ No newline at end of file diff --git a/disasterserver_c/maps/Marijuna.h b/disasterserver_c/maps/Marijuna.h new file mode 100644 index 0000000..1bbb86a --- /dev/null +++ b/disasterserver_c/maps/Marijuna.h @@ -0,0 +1,7 @@ +#ifndef MARIJUNA_H +#define MARIJUNA_H +#include "../Maps.h" + +bool mj_init(Server* server); + +#endif \ No newline at end of file diff --git a/disasterserver_c/maps/NastyParadise.c b/disasterserver_c/maps/NastyParadise.c new file mode 100644 index 0000000..a353ec2 --- /dev/null +++ b/disasterserver_c/maps/NastyParadise.c @@ -0,0 +1,72 @@ +#include +#include +#include + +bool nap_init(Server* server) +{ + Snowball* sb; + + RAssert(map_time(server, 2.585 * TICKSPERSEC, 20)); //155 + RAssert(map_ring(server, 5)); + + for (uint8_t i = 0; i < 10; i++) + { + RAssert(game_spawn(server, (Entity*)&(MakeIce(i)), sizeof(Ice), NULL)); + } + + RAssert(game_spawn(server, (Entity*)&(MakeSnowball(0, 10, 1)), sizeof(Snowball), (Entity**)&sb)); + for (int i = 0; i < 4; i++) + { + sb->p_move[5 + i] = 0.05f + 0.05f * (i / 4.0f); + sb->p_anim[5 + i] = 0.35f + 0.25f * (i / 4.0f); + } + + RAssert(game_spawn(server, (Entity*)&(MakeSnowball(1, 8, -1)), sizeof(Snowball), (Entity**)&sb)); + for (int i = 0; i < 5; i++) + { + sb->p_move[2 + i] = 0.05f + 0.05f * (i / 5.0f); + sb->p_anim[2 + i] = 0.35f + 0.25f * (i / 5.0f); + } + + RAssert(game_spawn(server, (Entity*)&(MakeSnowball(2, 11, 1)), sizeof(Snowball), (Entity**)&sb)); + for (int i = 0; i < 5; i++) + { + sb->p_move[5 + i] = 0.05f + 0.05f * (i / 5.0f); + sb->p_anim[5 + i] = 0.35f + 0.25f * (i / 5.0f); + } + + RAssert(game_spawn(server, (Entity*)&(MakeSnowball(3, 9, 1)), sizeof(Snowball), (Entity**)&sb)); + for (int i = 0; i < 2; i++) + { + sb->p_move[6 + i] = 0.05f + 0.05f * (i / 2.0f); + sb->p_anim[6 + i] = 0.35f + 0.25f * (i / 2.0f); + } + + RAssert(game_spawn(server, (Entity*)&(MakeSnowball(4, 5, -1)), sizeof(Snowball), (Entity**)&sb)); + return true; +} + +bool nap_tcpmsg(PeerData* v, Packet* packet) +{ + PacketRead(passtrough, packet, packet_read8, uint8_t); + PacketRead(type, packet, packet_read8, uint8_t); + + switch (type) + { + case CLIENT_NAPICE_ACTIVATE: + { + AssertOrDisconnect(v->server, v->in_game); + PacketRead(iid, packet, packet_read8, uint8_t); + AssertOrDisconnect(v->server, iid < 10); + + Ice* ices[10]; + if (!game_find(v->server, (Entity**)ices, "ice", 10)) + break; + + RAssert(ice_activate(v->server, ices[iid])); + break; + } + } + + return true; +} diff --git a/disasterserver_c/maps/NastyParadise.h b/disasterserver_c/maps/NastyParadise.h new file mode 100644 index 0000000..eaf94ca --- /dev/null +++ b/disasterserver_c/maps/NastyParadise.h @@ -0,0 +1,8 @@ +#ifndef NASTYPUSSY_H +#define NASTYPUSSY_H +#include "../Maps.h" + +bool nap_init(Server* server); +bool nap_tcpmsg(PeerData* v, Packet* packet); + +#endif \ No newline at end of file diff --git a/disasterserver_c/maps/NotPerfect.c b/disasterserver_c/maps/NotPerfect.c new file mode 100644 index 0000000..fa510a4 --- /dev/null +++ b/disasterserver_c/maps/NotPerfect.c @@ -0,0 +1,11 @@ +#include +#include + +bool np_init(Server* server) +{ + RAssert(map_time(server, 2.585 * TICKSPERSEC, 20)); //155 + RAssert(map_ring(server, 3)); + + RAssert(game_spawn(server, (Entity*)&(MakeNPCtrl()), sizeof(NPController), NULL)); + return true; +} \ No newline at end of file diff --git a/disasterserver_c/maps/NotPerfect.h b/disasterserver_c/maps/NotPerfect.h new file mode 100644 index 0000000..4424835 --- /dev/null +++ b/disasterserver_c/maps/NotPerfect.h @@ -0,0 +1,7 @@ +#ifndef NOTPERFECT_H +#define NOTPERFECT_H +#include "../Maps.h" + +bool np_init(Server* server); + +#endif \ No newline at end of file diff --git a/disasterserver_c/maps/PricelessFreedom.c b/disasterserver_c/maps/PricelessFreedom.c new file mode 100644 index 0000000..f2890cb --- /dev/null +++ b/disasterserver_c/maps/PricelessFreedom.c @@ -0,0 +1,48 @@ +#include +#include +#include +#include + +bool pf_init(Server* server) +{ + RAssert(map_ring(server, 5)); + RAssert(map_time(server, 2.585 * TICKSPERSEC, 10)); //155 + + for (int i = 0; i < 29; i++) + RAssert(game_spawn(server, (Entity*)&(MakeBlackRing(MAP_BRING, MAP_BRING)), sizeof(BRing), NULL)); + + RAssert(game_spawn(server, (Entity*)&(MakePFLift(0, 1669, 1016)), sizeof(PFLift), NULL)); + RAssert(game_spawn(server, (Entity*)&(MakePFLift(1, 1069, 704)), sizeof(PFLift), NULL)); + RAssert(game_spawn(server, (Entity*)&(MakePFLift(2, 829, 400)), sizeof(PFLift), NULL)); + RAssert(game_spawn(server, (Entity*)&(MakePFLift(3, 1070, 544)), sizeof(PFLift), NULL)); + return true; +} + +bool pf_tcpmsg(PeerData* v, Packet* packet) +{ + PacketRead(passtrough, packet, packet_read8, uint8_t); + PacketRead(type, packet, packet_read8, uint8_t); + + switch (type) + { + case CLIENT_PFLIT_ACTIVATE: + { + AssertOrDisconnect(v->server, v->in_game); + PacketRead(lid, packet, packet_read8, uint8_t); + + PFLift* ents[4]; + int found = game_find(v->server, (Entity**)ents, "pflift", 4); + for (int i = 0; i < found; i++) + { + if (ents[i]->lid == lid) + { + pflift_activate(v->server, ents[i], v->id); + break; + } + } + break; + } + } + + return true; +} diff --git a/disasterserver_c/maps/PricelessFreedom.h b/disasterserver_c/maps/PricelessFreedom.h new file mode 100644 index 0000000..0ea4b7b --- /dev/null +++ b/disasterserver_c/maps/PricelessFreedom.h @@ -0,0 +1,8 @@ +#ifndef PRICELESSFREEDOM_H +#define PRICELESSFREEDOM_H +#include "../Maps.h" + +bool pf_init(Server* server); +bool pf_tcpmsg(PeerData* v, Packet* packet); + +#endif \ No newline at end of file diff --git a/disasterserver_c/maps/RavineMist.c b/disasterserver_c/maps/RavineMist.c new file mode 100644 index 0000000..d227cdd --- /dev/null +++ b/disasterserver_c/maps/RavineMist.c @@ -0,0 +1,213 @@ +#include +#include +#include +#include +#include + +void shuffle(Shard* array, size_t n) +{ + if (n > 1) + { + for (size_t i = 0; i < n - 1; i++) + { + size_t j = i + rand() / (RAND_MAX / (n - i) + 1); + Shard t = array[j]; + array[j] = array[i]; + array[i] = t; + } + } +} + +bool rmz_checkstate(Server* server) +{ + uint8_t total = 7 - game_find(server, NULL, "shard", 7); + + Packet pack; + PacketCreate(&pack, SERVER_RMZSHARD_STATE); + PacketWrite(&pack, packet_write8, 3); + PacketWrite(&pack, packet_write8, total); + server_broadcast(server, &pack, true); + + if (server->game.time_sec <= TICKSPERSEC - 10) + { + uint8_t total = 7 - game_find(server, NULL, "shard", 7); + game_bigring(server, total >= 6 ? BS_ACTIVATED : BS_DEACTIVATED); + } + + return true; +} + +bool rmz_spawnshards(Server* server, Player* player) +{ + for (uintptr_t i = 0; i < player->data[0]; i++) + { + Debug("shard spawned at %f %f", player->pos.x, player->pos.y); + RAssert(game_spawn(server, (Entity*)&(MakeShard((player->pos.x + (-8 + rand() % 17)), player->pos.y, 1)), sizeof(Shard), NULL)); + } + + player->data[0] = 0; + return true; +} + +bool rmz_init(Server* server) +{ + RAssert(map_time(server, 3 * TICKSPERSEC, 20)); + RAssert(map_ring(server, 5)); + + // slugs + RAssert(game_spawn(server, (Entity*)&(MakeSlugSpawn(1901, 392)), sizeof(SlugSpawner), NULL)); + RAssert(game_spawn(server, (Entity*)&(MakeSlugSpawn(2193, 392)), sizeof(SlugSpawner), NULL)); + RAssert(game_spawn(server, (Entity*)&(MakeSlugSpawn(2468, 392)), sizeof(SlugSpawner), NULL)); + RAssert(game_spawn(server, (Entity*)&(MakeSlugSpawn(1188, 860)), sizeof(SlugSpawner), NULL)); + RAssert(game_spawn(server, (Entity*)&(MakeSlugSpawn(2577, 1952)), sizeof(SlugSpawner), NULL)); + RAssert(game_spawn(server, (Entity*)&(MakeSlugSpawn(2564, 2264)), sizeof(SlugSpawner), NULL)); + RAssert(game_spawn(server, (Entity*)&(MakeSlugSpawn(2782, 2264)), sizeof(SlugSpawner), NULL)); + RAssert(game_spawn(server, (Entity*)&(MakeSlugSpawn(1441, 2264)), sizeof(SlugSpawner), NULL)); + RAssert(game_spawn(server, (Entity*)&(MakeSlugSpawn(884, 2264)), sizeof(SlugSpawner), NULL)); + RAssert(game_spawn(server, (Entity*)&(MakeSlugSpawn(988, 2004)), sizeof(SlugSpawner), NULL)); + RAssert(game_spawn(server, (Entity*)&(MakeSlugSpawn(915, 2004)), sizeof(SlugSpawner), NULL)); + + // shards + Shard shards[12] = + { + MakeShard(862, 248, 0), + MakeShard(3078, 248, 0), + MakeShard(292, 558, 0), + MakeShard(2918, 558, 0), + MakeShard(1100, 820, 0), + MakeShard(980, 1188, 0), + MakeShard(1870, 1252, 0), + MakeShard(2180, 1508, 0), + MakeShard(2920, 2216, 0), + MakeShard(282, 2228, 0), + MakeShard(1318, 1916, 0), + MakeShard(3010, 1766, 0), + }; + shuffle(shards, 12); + + for (int i = 0; i < 7; i++) + RAssert(game_spawn(server, (Entity*)&shards[i], sizeof(Shard), NULL)); + + return true; +} + +bool rmz_tick(Server* server) +{ + if (server->game.time >= TICKSPERSEC) + { + if (server->game.time_sec <= TICKSPERSEC && server->game.bring_state < BS_DEACTIVATED) + game_bigring(server, BS_DEACTIVATED); + + if (server->game.time_sec <= TICKSPERSEC - 10 && server->game.bring_state < BS_ACTIVATED) + { + if((7 - game_find(server, NULL, "shard", 7) >= 6)) + game_bigring(server, BS_ACTIVATED); + } + } + + return true; +} + +bool rmz_tcpmsg(PeerData* v, Packet* packet) +{ + PacketRead(passtrough, packet, packet_read8, uint8_t); + PacketRead(type, packet, packet_read8, uint8_t); + + switch (type) + { + case CLIENT_RMZSLIME_HIT: + { + AssertOrDisconnect(v->server, v->in_game); + if (v->server->game.end > 0) + break; + + PacketRead(eid, packet, packet_read16, uint16_t); + PacketRead(proj, packet, packet_read8, uint8_t); + + Slug* ent; + if (!game_despawn(v->server, (Entity**)&ent, eid)) + break; + + if (proj) + { + free(ent); + break; + } + + if (ent->ring != SLUG_NORING) + { + if (ent->ring == SLUG_RING) + { + time_start(&v->plr.last_rings); + v->plr.rings++; + v->plr.stats.rings++; + } + + Packet pack; + PacketCreate(&pack, SERVER_RMZSLIME_RINGBONUS); + PacketWrite(&pack, packet_write8, (ent->ring - 1)); + PacketWrite(&pack, packet_write8, v->plr.rings > 0); + RAssert(packet_send(v->peer, &pack, true)); + } + + free(ent); + break; + } + + case CLIENT_RMZSHARD_COLLECT: + { + AssertOrDisconnect(v->server, v->in_game); + if (v->server->game.end > 0) + break; + + PacketRead(eid, packet, packet_read16, uint16_t); + + Shard* ent; + if (!game_despawn(v->server, (Entity**)&ent, eid)) + break; + + // incr shard count + v->plr.data[0]++; + + Packet pack; + PacketCreate(&pack, SERVER_RMZSHARD_STATE); + PacketWrite(&pack, packet_write8, 2); + PacketWrite(&pack, packet_write16, ent->id); + PacketWrite(&pack, packet_write16, v->id); + server_broadcast(v->server, &pack, true); + free(ent); + + RAssert(rmz_checkstate(v->server)); + break; + } + + case CLIENT_PLAYER_DEATH_STATE: + { + if (v->server->game.end > 0) + break; + + AssertOrDisconnect(v->server, v->id != v->server->game.exe); + AssertOrDisconnect(v->server, v->in_game); + + PacketRead(dead, packet, packet_read8, uint8_t); + PacketRead(rtimes, packet, packet_read8, uint8_t); + + if (dead) + RAssert(rmz_spawnshards(v->server, &v->plr)); + + RAssert(rmz_checkstate(v->server)); + break; + } + } + return true; +} + +bool rmz_left(PeerData* v) +{ + if(!v->server->game.started) + return true; + + RAssert(rmz_spawnshards(v->server, &v->plr)); + RAssert(rmz_checkstate(v->server)); + return true; +} diff --git a/disasterserver_c/maps/RavineMist.h b/disasterserver_c/maps/RavineMist.h new file mode 100644 index 0000000..c6ac375 --- /dev/null +++ b/disasterserver_c/maps/RavineMist.h @@ -0,0 +1,10 @@ +#ifndef RAVINEMIST_H +#define RAVINEMIST_H +#include "../Maps.h" + +bool rmz_init(Server* server); +bool rmz_tick(Server* server); +bool rmz_tcpmsg(PeerData* v, Packet* packet); +bool rmz_left(PeerData* v); + +#endif \ No newline at end of file diff --git a/disasterserver_c/maps/TortureCave.c b/disasterserver_c/maps/TortureCave.c new file mode 100644 index 0000000..5557865 --- /dev/null +++ b/disasterserver_c/maps/TortureCave.c @@ -0,0 +1,11 @@ +#include +#include + +bool tc_init(Server* server) +{ + RAssert(map_time(server, 2.585 * TICKSPERSEC, 20)); //155 + RAssert(map_ring(server, 5)); + + RAssert(game_spawn(server, (Entity*)&(MakeAcid()), sizeof(Acid), NULL)); + return true; +} diff --git a/disasterserver_c/maps/TortureCave.h b/disasterserver_c/maps/TortureCave.h new file mode 100644 index 0000000..7bf1ed5 --- /dev/null +++ b/disasterserver_c/maps/TortureCave.h @@ -0,0 +1,7 @@ +#ifndef TORTURECAVE_H +#define TORTURECAVE_H +#include "../Maps.h" + +bool tc_init(Server* server); + +#endif \ No newline at end of file diff --git a/disasterserver_c/maps/VolcanoValley.c b/disasterserver_c/maps/VolcanoValley.c new file mode 100644 index 0000000..490b484 --- /dev/null +++ b/disasterserver_c/maps/VolcanoValley.c @@ -0,0 +1,61 @@ +#include +#include +#include +#include + +bool vv_init(Server* server) +{ + RAssert(map_time(server, 3 * TICKSPERSEC, 20)); //180 + RAssert(map_ring(server, 5)); + + for (uint8_t i = 0; i < 14; i++) + RAssert(game_spawn(server, (Entity*)&(MakeVase(i)), sizeof(Vase), NULL)); + + RAssert(game_spawn(server, (Entity*)&(MakeLava(0, 736, 130)), sizeof(Lava), NULL)); + RAssert(game_spawn(server, (Entity*)&(MakeLava(1, 1388, 130)), sizeof(Lava), NULL)); + RAssert(game_spawn(server, (Entity*)&(MakeLava(2, 1524, 130)), sizeof(Lava), NULL)); + RAssert(game_spawn(server, (Entity*)&(MakeLava(3, 1084, 130)), sizeof(Lava), NULL)); + + return true; +} + +bool vv_tcpmsg(PeerData* v, Packet* packet) +{ + PacketRead(passtrough, packet, packet_read8, uint8_t); + PacketRead(type, packet, packet_read8, uint8_t); + + switch (type) + { + case CLIENT_VVVASE_BREAK: + { + AssertOrDisconnect(v->server, v->in_game); + PacketRead(vid, packet, packet_read8, uint8_t); + + Vase* ents[14]; + int found = game_find(v->server, (Entity**)ents, "vase", 14); + for (int i = 0; i < found; i++) + { + if (ents[i]->vid == vid) + { + v->plr.rings += (ents[i]->type + 1); + v->plr.stats.rings += (ents[i]->type + 1); + time_start(&v->plr.last_rings); + + Packet pack; + PacketCreate(&pack, SERVER_VVVASE_STATE); + PacketWrite(&pack, packet_write8, ents[i]->vid); + PacketWrite(&pack, packet_write8, ents[i]->type); + PacketWrite(&pack, packet_write16, v->id); + PacketWrite(&pack, packet_write8, v->plr.rings > 0); + server_broadcast(v->server, &pack, true); + + RAssert(game_despawn(v->server, NULL, ents[i]->id)); + break; + } + } + break; + } + } + + return true; +} diff --git a/disasterserver_c/maps/VolcanoValley.h b/disasterserver_c/maps/VolcanoValley.h new file mode 100644 index 0000000..def7e65 --- /dev/null +++ b/disasterserver_c/maps/VolcanoValley.h @@ -0,0 +1,8 @@ +#ifndef VOLCANOVALLEY_H +#define VOLCANOVALLEY_H +#include "../Maps.h" + +bool vv_init(Server* server); +bool vv_tcpmsg(PeerData* v, Packet* packet); + +#endif \ No newline at end of file diff --git a/disasterserver_c/maps/WoodDream.c b/disasterserver_c/maps/WoodDream.c new file mode 100644 index 0000000..0e93081 --- /dev/null +++ b/disasterserver_c/maps/WoodDream.c @@ -0,0 +1,10 @@ +#include +#include + +bool wd_init(Server* server) +{ + RAssert(map_time(server, 2.585 * TICKSPERSEC, 20)); //155 + RAssert(map_ring(server, 5)); + RAssert(game_spawn(server, (Entity*)&(MakeLatern()), sizeof(Latern), NULL)); + return true; +} diff --git a/disasterserver_c/maps/WoodDream.h b/disasterserver_c/maps/WoodDream.h new file mode 100644 index 0000000..a325393 --- /dev/null +++ b/disasterserver_c/maps/WoodDream.h @@ -0,0 +1,7 @@ +#ifndef WOODDREAM_H +#define WOODDREAM_H +#include "../Maps.h" + +bool wd_init(Server* server); + +#endif \ No newline at end of file diff --git a/disasterserver_c/maps/YouCantRun.c b/disasterserver_c/maps/YouCantRun.c new file mode 100644 index 0000000..61f6edf --- /dev/null +++ b/disasterserver_c/maps/YouCantRun.c @@ -0,0 +1,14 @@ +#include +#include +#include + +bool ycr_init(Server* server) +{ + RAssert(map_time(server, 3 * TICKSPERSEC, 20)); //180 + RAssert(map_ring(server, 5)); + + RAssert(game_spawn(server, (Entity*)&(MakeSpike()), sizeof(SpikeController), NULL)); + RAssert(game_spawn(server, (Entity*)&(MakeYCRCtrl()), sizeof(YCRController), NULL)); + + return true; +} \ No newline at end of file diff --git a/disasterserver_c/maps/YouCantRun.h b/disasterserver_c/maps/YouCantRun.h new file mode 100644 index 0000000..ed49532 --- /dev/null +++ b/disasterserver_c/maps/YouCantRun.h @@ -0,0 +1,7 @@ +#ifndef YOUCANTRUN_H +#define YOUCANTRUN_H +#include "../Maps.h" + +bool ycr_init(Server* server); + +#endif \ No newline at end of file diff --git a/disasterserver_c/states/CharSelect.c b/disasterserver_c/states/CharSelect.c new file mode 100644 index 0000000..09ef7e8 --- /dev/null +++ b/disasterserver_c/states/CharSelect.c @@ -0,0 +1,296 @@ +#include +#include +#include +#include + +bool charselect_check_state(Server *server) +{ + RAssert(server); + + bool should = true; + for (size_t i = 0; i < server->peers.capacity; i++) + { + PeerData *peer = (PeerData *)server->peers.ptr[i]; + if (!peer) + continue; + + if (!peer->in_game) + continue; + + if (peer->exe_char == CH_NONE && peer->surv_char == EX_NONE) + should = false; + } + + if (should) + return game_init(server->lobby.exe, server->lobby.map, server); + + return true; +} + +bool charselect_choose_exe(Server *server, uint16_t *id) +{ + RAssert(server); + + uint32_t weight = 0; + + for (size_t i = 0; i < server->peers.capacity; i++) + { + PeerData *peer = (PeerData *)server->peers.ptr[i]; + if (!peer) + continue; + + if (!peer->in_game) + continue; + + // Reset all characters + peer->exe_char = EX_NONE; + peer->surv_char = CH_NONE; + + weight += peer->exe_chance; + } + + if (weight == 0) + weight++; + + uint32_t rnd = rand() % weight; + for (size_t i = 0; i < server->peers.capacity; i++) + { + PeerData *peer = (PeerData *)server->peers.ptr[i]; + if (!peer) + continue; + + if (!peer->in_game) + continue; + + if (peer->exe_chance >= 100) + { + *id = peer->id; + return true; + } + + if (rnd < peer->exe_chance && !peer->mod_tool) + { + Info("%s (id %d, c %d) is exe!", peer->nickname.value, peer->id, peer->exe_chance); + + peer->exe_chance = 1 + rand() % 1; + *id = peer->id; + + return true; + } + + rnd -= peer->exe_chance; + } + + *id = -1; + return false; +} + +bool charselect_state_handle(PeerData *v, Packet *packet) +{ + // Read header + PacketRead(passtrough, packet, packet_read8, uint8_t); + PacketRead(type, packet, packet_read8, uint8_t); + + bool res = true; + Packet pack; + switch (type) + { + case CLIENT_REQUEST_EXECHARACTER: + { + if (!v->in_game) + break; + + // Sanity check + AssertOrDisconnect(v->server, v->server->lobby.exe == v->id); + PacketRead(id, packet, packet_read8, uint8_t); + + id--; // id - 1 + v->exe_char = id; + + AssertOrDisconnect(v->server, id >= 0); + AssertOrDisconnect(v->server, id <= EX_EXELLER); + + PacketCreate(&pack, SERVER_LOBBY_EXECHARACTER_RESPONSE); + PacketWrite(&pack, packet_write8, id); + RAssert(packet_send(v->peer, &pack, true)); + + PacketCreate(&pack, SERVER_LOBBY_CHARACTER_CHANGE); + PacketWrite(&pack, packet_write16, v->id); + PacketWrite(&pack, packet_write8, id); + server_broadcast(v->server, &pack, true); + + const char *exes[] = { + "Classic Exe", + "Chaos", + "Exetior", + "Exeller"}; + + Info("%s " LOG_RST "(id %d) choses [" LOG_RED "%s" LOG_RST "]!", v->nickname.value, v->id, exes[id]); + return charselect_check_state(v->server) || lobby_init(v->server); + } + + case CLIENT_REQUEST_CHARACTER: + { + if (!v->in_game) + break; + + if (v->surv_char != CH_NONE) + break; + + // Sanity check + AssertOrDisconnect(v->server, v->server->lobby.exe != v->id); + PacketRead(id, packet, packet_read8, uint8_t); + id--; // id - 1 + + AssertOrDisconnect(v->server, id >= 0); + AssertOrDisconnect(v->server, id <= CH_SALLY); + + uint8_t avail = v->server->lobby.avail[id]; + if (avail) + v->server->lobby.avail[id] = 0; + + PacketCreate(&pack, SERVER_LOBBY_CHARACTER_RESPONSE); + PacketWrite(&pack, packet_write8, id + 1); + PacketWrite(&pack, packet_write8, avail); + RAssert(packet_send(v->peer, &pack, true)); + + if (avail) + { + v->surv_char = id; + + PacketCreate(&pack, SERVER_LOBBY_CHARACTER_CHANGE); + PacketWrite(&pack, packet_write16, v->id); + PacketWrite(&pack, packet_write8, id + 1); + server_broadcast(v->server, &pack, true); + } + + const char *survs[] = { + "Tails", + "Knuckles", + "Eggman", + "Amy", + "Cream", + "Sally"}; + + Info("%s " LOG_RST "(id %d) choses [" LOG_GRN "%s" LOG_RST "]!", v->nickname.value, v->id, survs[id]); + return charselect_check_state(v->server) || lobby_init(v->server); + } + + case CLIENT_CHAT_MESSAGE: + { + PacketRead(pid, packet, packet_read16, uint16_t); + PacketRead(msg, packet, packet_readstr, String); + AssertOrDisconnect(v->server, string_length(&msg) <= 40); + + v->timeout = 0; + + Info("%s " LOG_RST "(id %d): %s", v->nickname.value, v->id, msg.value); + if (!server_cmd_handle(v->server, server_cmd_parse(&msg), v, &msg) && g_config.chatfix) + server_broadcast_msg(v->server, v->id, msg.value); + + break; + } + + default: + RAssert(server_msg_handle(v->server, type, v, packet)); + break; + } + + return res; +} + +bool charselect_state_tick(Server *server) +{ + if (server->lobby.countdown <= 0) + { + server->lobby.countdown += TICKSPERSEC; + + if (--server->lobby.countdown_sec == 0) + { + for (size_t i = 0; i < server->peers.capacity; i++) + { + PeerData *peer = (PeerData *)server->peers.ptr[i]; + if (!peer) + continue; + + if (!peer->in_game) + continue; + + if (peer->exe_char == EX_NONE && peer->surv_char == CH_NONE) + server_disconnect(server, peer->peer, DR_AFKTIMEOUT, NULL); + } + } + + Packet pack; + PacketCreate(&pack, SERVER_CHAR_TIME_SYNC); + PacketWrite(&pack, packet_write8, server->lobby.countdown_sec); + server_broadcast(server, &pack, true); + } + + server->lobby.countdown -= server->delta; + return true; +} + +bool charselect_init(int8_t map, Server *server) +{ + Debug("Attepting to enter ST_CHARSELECT..."); + RAssert(server); + RAssert(charselect_choose_exe(server, &server->lobby.exe)); + + if (server->lobby.exe == -1) + { + Err("Failed to pick exe for some reason!"); + return lobby_init(server); + } + + server->state = ST_CHARSELECT; + server->lobby.countdown_sec = 30; + server->lobby.countdown = TICKSPERSEC; + memset(server->lobby.avail, 1, sizeof(uint8_t) * (CH_SALLY + 1)); + + Packet pack; + PacketCreate(&pack, SERVER_LOBBY_EXE); + PacketWrite(&pack, packet_write16, server->lobby.exe); + PacketWrite(&pack, packet_write16, map); + server_broadcast(server, &pack, true); + + PacketCreate(&pack, SERVER_CHAR_TIME_SYNC); + PacketWrite(&pack, packet_write8, server->lobby.countdown_sec); + server_broadcast(server, &pack, true); + + Info(LOG_YLW "Server is now in " LOG_PUR "Character Select"); + server->lobby.map = map; + + for (size_t i = 0; i < server->peers.capacity; i++) + { + PeerData *data = (PeerData *)server->peers.ptr[i]; + + if (!data) + continue; + + if (data->in_game) + continue; + + char msg[256]; + snprintf(msg, 100, "map: %s" CLRCODE_RST, g_mapList[map].name); + server_send_msg(server, data->peer, msg); + } + + return true; +} + +bool charselect_state_join(PeerData *v) +{ + return true; +} + +bool charselect_state_left(PeerData *v) +{ + if (v->surv_char != CH_NONE) + v->server->lobby.avail[v->surv_char] = true; + + if (server_ingame(v->server) <= 1 || v->id == v->server->lobby.exe) + return lobby_init(v->server); + + return charselect_check_state(v->server) || lobby_init(v->server); +} diff --git a/disasterserver_c/states/Game.c b/disasterserver_c/states/Game.c new file mode 100644 index 0000000..a624bf1 --- /dev/null +++ b/disasterserver_c/states/Game.c @@ -0,0 +1,1809 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +bool game_end(Server* server, Ending ending, bool achiv) +{ + if (server->game.end > 0) + return true; + + Packet packet; + switch (ending) + { + case ED_EXEWIN: + { + PacketCreate(&packet, SERVER_GAME_EXE_WINS); + PacketWrite(&packet, packet_write8, achiv); + Info("Ending is ED_EXEWIN"); + break; + } + + case ED_SURVWIN: + { + PacketCreate(&packet, SERVER_GAME_SURVIVOR_WIN); + PacketWrite(&packet, packet_write8, achiv); + Info("Ending is ED_SURVWIN"); + break; + } + + case ED_TIMEOVER: + { + PacketCreate(&packet, SERVER_GAME_TIME_OVER); + PacketWrite(&packet, packet_write8, achiv); + Info("Ending is ED_TIMEOVER"); + break; + } + } + + server_broadcast(server, &packet, true); + server->game.end = 5 * TICKSPERSEC; + server->game.ending = ending; + return true; +} + +bool game_state_check(Server* server) +{ + if (server->game.end > 0) + return true; + + uint8_t escaped = 0; + uint8_t dead = 0; + uint8_t exes = 0; + + int total = 0; + { + for (size_t i = 0; i < server->peers.capacity; i++) + { + PeerData* v = (PeerData*)server->peers.ptr[i]; + if (!v) + continue; + + if(!v->in_game) + continue; + + if (v->plr.flags & PLAYER_ESCAPED) + escaped++; + + if (v->plr.flags & PLAYER_DEAD || v->plr.flags & PLAYER_DEMONIZED) + dead++; + + if (v->id == server->game.exe) + exes++; + } + + total = server_ingame(server); + total -= (exes + dead + escaped); + } + + if (total <= 0) + { + if (escaped > 0) + { + RAssert(game_end(server, ED_SURVWIN, true)); + } + else + { + RAssert(game_end(server, ED_EXEWIN, true)); + } + } + + return true; +} + +bool game_init(int exe, int8_t map, Server* server) +{ + Debug("Attepting to enter ST_GAME..."); + //RAssert(server_ingame(server) > 1); + + server->state = ST_GAME; + server->game = (Game) + { + .map = map, + .exe = exe, + .bring_state = BS_NONE, + .bring_loc = (uint8_t)rand(), + .sudden_death = false, + .started = false, + .end = 0.0, + .entid = 0, + .time = TICKSPERSEC, + .elapsed = 0.0, + .start_timeout = 15.0 * TICKSPERSEC + }; + + // Setup cooldowns + time_start(&server->game.tails_last_proj); + memset(server->game.rings, 0, sizeof(server->game.rings)); + memset(server->game.cooldowns, 0, sizeof(server->game.cooldowns)); + + if (!dylist_create(&server->game.entities, 3000)) + return false; + Debug("Entity list created."); + + if (!dylist_create(&server->game.left, 7)) + return false; + Debug("Left players list created."); + + for (size_t i = 0; i < server->peers.capacity; i++) + { + PeerData* v = (PeerData*)server->peers.ptr[i]; + if (!v) + continue; + + if (!v->in_game) + continue; + + memset(&v->plr, 0, sizeof(Player)); + + if (v->id == server->game.exe) + SET_FLAG(v->plr.flags, PLAYER_KILLER); + + v->plr.ready = false; + v->plr.mod_tool = v->mod_tool; + + for (int i = 0; i < 5; i++) + v->plr.revival_init[i] = -1; + } + + Packet pack; + PacketCreate(&pack, SERVER_LOBBY_GAME_START); + server_broadcast(server, &pack, true); + + for (size_t i = 0; i < server->peers.capacity; i++) + { + PeerData* v = (PeerData*)server->peers.ptr[i]; + if (!v) + continue; + + if (v->in_game) + continue; + + for (size_t j = 0; j < server->peers.capacity; j++) + { + PeerData* er = (PeerData*)server->peers.ptr[j]; + if (!er) + continue; + + if (er->id == v->id) + continue; + + PacketCreate(&pack, SERVER_WAITING_PLAYER_INFO); + PacketWrite(&pack, packet_write8, er->in_game); + PacketWrite(&pack, packet_write16, er->id); + PacketWrite(&pack, packet_writestr, er->nickname); + + if (er->in_game) + { + PacketWrite(&pack, packet_write8, server->game.exe == er->id); + PacketWrite(&pack, packet_write8, server->game.exe == er->id ? er->exe_char : er->surv_char); + } + else + { + PacketWrite(&pack, packet_write8, er->lobby_icon); + } + + RAssert(packet_send(v->peer, &pack, true)); + } + } + + Info(LOG_YLW "Server is now in " LOG_PUR "Game"); + return true; +} + +bool game_uninit(Server* server, bool show_results) +{ + if (show_results) + return results_init(server); + else + { + for (size_t i = 0; i < server->game.entities.capacity; i++) + { + Entity* entity = (Entity*)server->game.entities.ptr[i]; + if (!entity) + continue; + + free(entity); + } + dylist_free(&server->game.entities); + + // Clean up after game + for (size_t i = 0; i < server->game.left.capacity; i++) + { + PeerData* data = (PeerData*)server->game.left.ptr[i]; + if (!data) + continue; + + free(data); + } + dylist_free(&server->game.left); + + return lobby_init(server); + } +} + +bool game_spawn(Server* server, Entity* entity, size_t len, Entity** out) +{ + entity->id = ++server->game.entid; + Debug("Allocated entity \"%s\" (id %d, size %d)", entity->tag, entity->id, len); + + Entity* ent = (Entity*)malloc(len); + if(!ent) + return false; + + memcpy(ent, entity, len); + if (ent->init && !ent->init(server, ent)) + { + free(ent); + return false; + } + + dylist_push(&server->game.entities, ent); + if (out) + *out = ent; + return true; +} + +bool game_despawn(Server* server, Entity** out, uint16_t id) +{ + bool res = true; + Entity* tar = NULL; + + for (size_t i = 0; i < server->game.entities.capacity; i++) + { + Entity* entity = (Entity*)server->game.entities.ptr[i]; + if (!entity) + continue; + + if (entity->id == id) + { + if (entity->uninit && !entity->uninit(server, entity)) + Warn("uninit failed for entity %d", entity->id); + + Debug("Deallocated entity \"%s\" (id %d)", entity->tag, entity->id); + tar = entity; + break; + } + } + + res = dylist_remove(&server->game.entities, tar); + if (res && !out) + free(tar); + else if (out) + *out = tar; + else + Warn("Failed to find entity %d", id); + + return res; +} + +int game_find(Server* server, Entity** out, char* tag, size_t count) +{ + int i = 0; + + for (size_t it = 0; it < server->game.entities.capacity; it++) + { + Entity* entity = (Entity*)server->game.entities.ptr[it]; + if (!entity) + continue; + + Debug("Search %s (id %d) vs %s", entity->tag, entity->id, tag); + if (strcmp(entity->tag, tag) == 0) + { + if (!out) + i++; + else + out[i++] = entity; + + if ((size_t)i >= count) + break; + } + } + + Debug("Search for \"%s\" found %d entities", tag, i); + return i; +} + +bool game_bigring(Server* server, BigRingState state) +{ + RAssert(server); + + if (server->game.bring_state == state) + return true; + + Packet packet; + switch (state) + { + case BS_NONE: + break; + + case BS_DEACTIVATED: + { + Info("Big ring is deactivated!"); + + PacketCreate(&packet, SERVER_GAME_SPAWN_RING); + PacketWrite(&packet, packet_write8, 0); + PacketWrite(&packet, packet_write8, server->game.bring_loc); + server_broadcast(server, &packet, true); + break; + } + + case BS_ACTIVATED: + { + Info("Big ring is activated!"); + + PacketCreate(&packet, SERVER_GAME_SPAWN_RING); + PacketWrite(&packet, packet_write8, 1); + PacketWrite(&packet, packet_write8, server->game.bring_loc); + server_broadcast(server, &packet, true); + break; + } + } + + server->game.bring_state = state; + return true; +} + +bool game_checkstart(Server* server) +{ + if (server->game.started) + return true; + + uint8_t cnt = 0; + for (size_t i = 0; i < server->peers.capacity; i++) + { + PeerData* v = (PeerData*)server->peers.ptr[i]; + if (!v) + continue; + + if(!v->in_game) + continue; + + if (v->plr.ready) + cnt++; + } + + if (cnt >= server_ingame(server)) + { + Packet pack; + PacketCreate(&pack, SERVER_GAME_PLAYERS_READY); + server_broadcast(server, &pack, true); + + srand((unsigned int)time(NULL)); + RAssert(g_mapList[server->game.map].cb.init(server)); + Info(LOG_YLW "Game started! " LOG_RST "(Time %ds)", server->game.time_sec); + + server->game.started = true; + } + + return true; +} + +bool game_demonize(Server* server, PeerData* data) +{ + Packet pack; + PacketCreate(&pack, SERVER_GAME_DEATHTIMER_END); + + int players = 0; + int demonized = 0; + + for (size_t i = 0; i < server->peers.capacity; i++) + { + PeerData* v = (PeerData*)server->peers.ptr[i]; + if (!v) + continue; + + if(!v->in_game) + continue; + + if (v->id == server->game.exe) + continue; + + if (v->plr.flags & PLAYER_DEMONIZED) + demonized++; + + players++; + } + + if (players / 2 > demonized) + { + DEL_FLAG(data->plr.flags, PLAYER_DEAD); + SET_FLAG(data->plr.flags, PLAYER_DEMONIZED); + + data->plr.stats.rings = 0; + + // reset cooldown + switch (data->surv_char) + { + case CH_TAILS: + { + server->game.cooldowns[TAILS_RECHARGE] = 0; + server->game.cooldowns[ETAILS_RECHARGE] = 0; + break; + } + + case CH_EGGMAN: + { + server->game.cooldowns[EGGTRACK_RECHARGE] = 0; + break; + } + + case CH_CREAM: + { + server->game.cooldowns[CREAM_RING_SPAWN] = 0; + break; + } + } + + Info("%s " LOG_RST "(id %d)" LOG_RED " was demonized!", data->nickname.value, data->id); + PacketWrite(&pack, packet_write8, 1); + } + else + { + SET_FLAG(data->plr.flags, PLAYER_CANTREVIVE); + + Info("%s " LOG_RST "(id %d)" LOG_RED " died!", data->nickname.value, data->id); + PacketWrite(&pack, packet_write8, 0); + } + + RAssert(packet_send(data->peer, &pack, true)); + return true; +} + +bool game_state_join(PeerData* v) +{ + (void)v; // dont fucking remember why this exists ~~ + return true; +} + +bool game_state_left(PeerData* v) +{ + if (v->server->game.end > 0) + return true; + + if (!v->in_game) + return true; + + RAssert(g_mapList[v->server->game.map].cb.left(v)); + + if(server_ingame(v->server) <= 1) + return game_uninit(v->server, false); + + if (!v->server->game.started) + { + if (v->id == v->server->game.exe) + return game_uninit(v->server, false); + + return game_checkstart(v->server); + } + + PeerData* data = (PeerData*)malloc(sizeof(PeerData)); + RAssert(data); + memcpy(data, v, sizeof(PeerData)); + + // Add player to the list + SET_FLAG(data->plr.flags, PLAYER_LEFT); + dylist_push(&v->server->game.left, data); + + if (v->id == v->server->game.exe) + return game_end(v->server, ED_SURVWIN, v->server->game.elapsed >= TICKSPERSEC * TICKSPERSEC); + + RAssert(game_state_check(v->server)); + return true; +} + +bool game_state_handletcp(PeerData* v, Packet* packet) +{ + // Read header + PacketRead(passtrough, packet, packet_read8, uint8_t); + PacketRead(type, packet, packet_read8, uint8_t); + + switch (type) + { + default: + RAssert(server_msg_handle(v->server, type, v, packet)); + break; + + case CLIENT_PLAYER_POTATER: + case CLIENT_SOUND_EMIT: + case CLIENT_SPAWN_EFFECT: + case CLIENT_PET_PALETTE: + case CLIENT_SPRING_USE: + case CLIENT_MERCOIN_BONUS: + case CLIENT_RING_BROKE: + { + AssertOrDisconnect(v->server, v->in_game); + server_broadcast_ex(v->server, packet, true, v->id); + break; + } + + case CLIENT_PLAYER_PALETTE: + { + AssertOrDisconnect(v->server, v->in_game); + AssertOrDisconnect(v->server, !g_config.anticheat || palette_player_validate(v, packet)); + server_broadcast_ex(v->server, packet, true, v->id); + break; + } + + case CLIENT_PLAYER_HEAL_PART: + { + AssertOrDisconnect(v->server, v->in_game); + PacketRead(x, packet, packet_read16, uint16_t); + PacketRead(y, packet, packet_read16, uint16_t); + PacketRead(rings, packet, packet_read16, uint16_t); + v->plr.heal_rings = v->plr.rings; + + if (rings < 10) + { + server_disconnect(v->server, v->peer, DR_OTHER, "pusy"); + return true; + } + + if (rings >= 140 && v->server->game.map != 20) + { + server_disconnect(v->server, v->peer, DR_OTHER, "dicus"); + return true; + } + + server_broadcast_ex(v->server, packet, true, v->id); + break; + } + + case CLIENT_PLAYER_HEAL: + { + AssertOrDisconnect(v->server, v->in_game); + PacketRead(id, packet, packet_read16, uint16_t); + PacketRead(rings, packet, packet_read16, uint16_t); + + if (rings < 10) + { + server_disconnect(v->server, v->peer, DR_OTHER, "pusy"); + return true; + } + + if (rings >= 140 && v->server->game.map != 20) + { + server_disconnect(v->server, v->peer, DR_OTHER, "dicus"); + return true; + } + + if (v->plr.mod_tool) + { + Packet pack; + PacketCreate(&pack, SERVER_RING_COLLECTED); + PacketWrite(&pack, packet_write8, 0); + PacketWrite(&pack, packet_write16, 0); + PacketWrite(&pack, packet_write8, true); + PacketWrite(&pack, packet_write8, false); + RAssert(packet_send(v->peer, &pack, true)); + break; + } + + v->plr.heal_rings = 0; + v->plr.stats.hp_restored++; + + server_broadcast_ex(v->server, packet, true, v->id); + break; + } + + case CLIENT_STATS_REPORT: + { + AssertOrDisconnect(v->server, v->in_game); + PacketRead(type, packet, packet_read8, uint8_t); + + switch (type) + { + case 0: + { + v->plr.stats.hp_restored++; + break; + } + + case 1: + { + PacketRead(recv, packet, packet_read16, uint16_t); + PacketRead(dmgr, packet, packet_read16, uint16_t); + PacketRead(sec, packet, packet_read8, uint8_t); + + PeerData* rec = server_find_peer(v->server, recv); + PeerData* damager = server_find_peer(v->server, dmgr); + if (!rec || !damager) + break; + + rec->plr.stats.stun_time += sec; + damager->plr.stats.stuns++; + break; + } + + case 2: + { + PacketRead(id, packet, packet_read16, uint16_t); + PacketRead(dmg, packet, packet_read16, uint16_t); + PacketRead(hp, packet, packet_read16, uint16_t); + + PeerData* data = server_find_peer(v->server, id); + if (!data) + break; + + if (hp <= 0) + data->plr.stats.kills++; + + data->plr.stats.damage += dmg / 20; + break; + } + + case 3: + { + PacketRead(dmg, packet, packet_read8, uint8_t); + v->plr.stats.damage_taken += dmg / 20; + break; + } + } + break; + } + + case CLIENT_PLAYER_HURT: + { + AssertOrDisconnect(v->server, v->in_game); + server_broadcast_ex(v->server, packet, true, v->id); + break; + } + + case CLIENT_TPROJECTILE_STARTCHARGE: + { + AssertOrDisconnect(v->server, v->in_game); + time_start(&v->server->game.tails_last_proj); + break; + } + + case CLIENT_TPROJECTILE: + { + AssertOrDisconnect(v->server, v->in_game); + AssertOrDisconnect(v->server, v->id != v->server->game.exe); + AssertOrDisconnect(v->server, v->surv_char == CH_TAILS); + AssertOrDisconnect(v->server, game_find(v->server, NULL, "tproj", 10) <= 2); + + int cooldown_id = v->plr.flags & PLAYER_DEMONIZED ? ETAILS_RECHARGE : TAILS_RECHARGE; + if(v->server->game.cooldowns[cooldown_id] > 0) + { + char msg[256]; + snprintf(msg, 256, "is_exe: %d, cool_id: %s, remaining_cooldown: %f", v->plr.flags & PLAYER_DEMONIZED, cooldown_id == TAILS_RECHARGE ? "TAILS_RECHARGE" : "ETAILS_RECHARGE", v->server->game.cooldowns[cooldown_id]); + RAssert(server_disconnect(v->server, v->peer, DR_OTHER, msg)); + return false; + } + + PacketRead(x, packet, packet_read16, uint16_t); + PacketRead(y, packet, packet_read16, uint16_t); + PacketRead(dir, packet, packet_read8, int8_t); + PacketRead(dmg, packet, packet_read8, uint8_t); + PacketRead(exe, packet, packet_read8, uint8_t); + PacketRead(chg, packet, packet_read8, uint8_t); + AssertOrDisconnect(v->server, dir >= -1 && dir <= 1); + + if (v->mod_tool) + { + if (dir > 0) + dir = -1; + else if (dir < 0) + dir = 1; + } + + bool check_balls = true; + if (v->plr.flags & PLAYER_DEMONIZED) + { + AssertOrDisconnect(v->server, dmg <= 60); + + if (dmg >= 60) + { + double last = time_end(&v->server->game.tails_last_proj); + check_balls = last > 1500 && last < 12000; + AssertOrDisconnect(v->server, check_balls); + } + } + else + { + AssertOrDisconnect(v->server, dmg <= 6); + + if (dmg >= 6) + { + double last = time_end(&v->server->game.tails_last_proj); + check_balls = last > 1500 && last < 12000; + AssertOrDisconnect(v->server, check_balls); + } + } + + if (!check_balls) + break; + + RAssert(game_spawn(v->server, (Entity*)&(MakeTailsProj(x, y, v->id, dir, v->plr.flags & PLAYER_DEMONIZED, chg, dmg)), sizeof(TProjectile), NULL)); + v->server->game.cooldowns[cooldown_id] = 10 * TICKSPERSEC; + break; + } + + case CLIENT_TPROJECTILE_HIT: + { + AssertOrDisconnect(v->server, v->in_game); + + Entity* ents; + if (game_find(v->server, &ents, "tproj", 1)) + game_despawn(v->server, NULL, ents->id); + + break; + } + + case CLIENT_RING_COLLECTED: + { + AssertOrDisconnect(v->server, v->in_game); + PacketRead(id, packet, packet_read8, uint8_t); + PacketRead(eid, packet, packet_read16, uint16_t); + + Ring* ent = NULL; + bool res = game_despawn(v->server, (Entity**)&ent, eid); + if (res) + { + PeerData* data = server_find_peer(v->server, v->id); + RAssert(data); + + if (!ent->red) + { + time_start(&data->plr.last_rings); + data->plr.rings++; + data->plr.stats.rings++; + } + + Packet pack; + PacketCreate(&pack, SERVER_RING_COLLECTED); + PacketWrite(&pack, packet_write8, id); + PacketWrite(&pack, packet_write16, eid); + PacketWrite(&pack, packet_write8, ent->red); + PacketWrite(&pack, packet_write8, data->plr.rings > 0); + + free(ent); + RAssert(packet_send(v->peer, &pack, true)); + } + break; + } + + case CLIENT_CREAM_SPAWN_RINGS: + { + AssertOrDisconnect(v->server, v->in_game); + AssertOrDisconnect(v->server, v->id != v->server->game.exe); + AssertOrDisconnect(v->server, v->surv_char == CH_CREAM); + AssertOrDisconnect(v->server, v->server->game.cooldowns[CREAM_RING_SPAWN] <= 0); + + if (v->mod_tool) + { + Packet pack; + PacketCreate(&pack, SERVER_RING_COLLECTED); + PacketWrite(&pack, packet_write8, 0); + PacketWrite(&pack, packet_write16, 0); + PacketWrite(&pack, packet_write8, true); + PacketWrite(&pack, packet_write8, false); + RAssert(packet_send(v->peer, &pack, true)); + break; + } + + PacketRead(x, packet, packet_read16, uint16_t); + PacketRead(y, packet, packet_read16, uint16_t); + PacketRead(red_ring, packet, packet_read8, uint8_t); + + Vector2 pos = { (float)x, (float)y }; + AssertOrDisconnect(v->server, vector2_dist(&pos, &v->plr.pos) <= 40); + + static double PI = 0.0; + if(PI == 0.0) + PI = acos(-1); + + if (red_ring) + { + CreamRing* rings[128]; + int cnt = game_find(v->server, (Entity**)rings, "cring", 128); + + for(int i = 0; i < cnt; i++) + { + CreamRing* ring = rings[i]; + if(!ring->red) + continue; + + AssertOrDisconnect(v->server, vector2_dist(&ring->pos, &pos) >= 150); + } + + uint16_t posX[2] = { 25, -27 }; + uint16_t posY[2] = { 0, 0 }; + for (int i = 0; i < 2; i++) + { + uint16_t rX = x + posX[i]; + uint16_t rY = y + posY[i]; + + RAssert(game_spawn(v->server, (Entity*)&(MakeCreamRing(rX, rY, red_ring)), sizeof(CreamRing), NULL)); + } + } + else + { + uint16_t posX[3] = { 26, 0, -27 }; + uint16_t posY[3] = { 0, -26, 0 }; + for (int i = 0; i < 3; i++) + { + uint16_t rX = x + posX[i]; + uint16_t rY = y + posY[i]; + + RAssert(game_spawn(v->server, (Entity*)&(MakeCreamRing(rX, rY, red_ring)), sizeof(CreamRing), NULL)); + } + } + + v->server->game.cooldowns[CREAM_RING_SPAWN] = 25 * TICKSPERSEC; + break; + } + + case CLIENT_ETRACKER: + { + AssertOrDisconnect(v->server, v->in_game); + AssertOrDisconnect(v->server, v->id != v->server->game.exe); + AssertOrDisconnect(v->server, v->surv_char == CH_EGGMAN); + AssertOrDisconnect(v->server, v->server->game.cooldowns[EGGTRACK_RECHARGE] <= 0); + + PacketRead(x, packet, packet_read16, uint16_t); + PacketRead(y, packet, packet_read16, uint16_t); + + game_spawn(v->server, (Entity*)&(MakeEggTrack(x, y)), sizeof(EggTracker), NULL); + v->server->game.cooldowns[EGGTRACK_RECHARGE] = 10 * TICKSPERSEC; + break; + } + + case CLIENT_ETRACKER_ACTIVATED: + { + AssertOrDisconnect(v->server, v->in_game); + PacketRead(eid, packet, packet_read16, uint16_t); + + Entity* ents[50]; + int found = game_find(v->server, ents, "eggtrack", 50); + + for (int i = 0; i < found; i++) + { + EggTracker* entity = (EggTracker*)ents[i]; + + if (entity->id == eid) + { + entity->activ_id = v->id; + game_despawn(v->server, NULL, eid); + break; + } + } + + break; + } + + case CLIENT_ERECTOR_BRING_SPAWN: + { + AssertOrDisconnect(v->server, v->in_game); + AssertOrDisconnect(v->server, v->id == v->server->game.exe); + AssertOrDisconnect(v->server, v->exe_char == EX_EXETIOR); + AssertOrDisconnect(v->server, v->server->game.cooldowns[EXETIOR_BRING_SPAWN] <= 0); + + PacketRead(x, packet, packet_read16, uint16_t); + PacketRead(y, packet, packet_read16, uint16_t); + + if (v->mod_tool) + { + RAssert(game_spawn(v->server, (Entity*)&(MakeCreamRing(x, y, false)), sizeof(CreamRing), NULL)); + break; + } + + BRing* rings[128]; + int cnt = game_find(v->server, (Entity**)rings, "bring", 128); + + Vector2 pos = { x, y }; + for(int i = 0; i < cnt; i++) + { + BRing* ring = rings[i]; + AssertOrDisconnect(v->server, vector2_dist(&ring->pos, &pos) >= 100); + } + + game_spawn(v->server, (Entity*)(&(MakeBlackRing(x, y))), sizeof(BRing), NULL); + v->server->game.cooldowns[EXETIOR_BRING_SPAWN] = 10 * TICKSPERSEC; + break; + } + + case CLIENT_BRING_COLLECTED: + { + AssertOrDisconnect(v->server, v->in_game); + AssertOrDisconnect(v->server, v->id != v->server->game.exe); + PacketRead(eid, packet, packet_read16, uint16_t); + + if (game_despawn(v->server, NULL, eid)) + { + Packet pack; + PacketCreate(&pack, SERVER_BRING_COLLECTED); + packet_send(v->peer, &pack, true); + } + break; + } + + case CLIENT_ERECTOR_BALLS: + { + AssertOrDisconnect(v->server, v->in_game); + AssertOrDisconnect(v->server, v->id == v->server->game.exe); + + PacketRead(x, packet, packet_readfloat, float); + PacketRead(y, packet, packet_readfloat, float); + + if(!v->mod_tool) + { + Packet pack; + PacketCreate(&pack, CLIENT_ERECTOR_BALLS); + PacketWrite(&pack, packet_writefloat, x); + PacketWrite(&pack, packet_writefloat, y); + server_broadcast(v->server, &pack, true); + } + else + { + for(int i = -3; i < 3; i++) + { + RAssert(game_spawn(v->server, (Entity*)&(MakeCreamRing(x + i * 8, y, false)), sizeof(CreamRing), NULL)); + } + } + + break; + } + + case CLIENT_EXELLER_SPAWN_CLONE: + { + AssertOrDisconnect(v->server, v->in_game); + AssertOrDisconnect(v->server, v->id == v->server->game.exe); + AssertOrDisconnect(v->server, v->exe_char == EX_EXELLER); + AssertOrDisconnect(v->server, game_find(v->server, NULL, "exclone", 3) < 2); + + PacketRead(x, packet, packet_read16, uint16_t); + PacketRead(y, packet, packet_read16, uint16_t); + PacketRead(dir, packet, packet_read8, int8_t); + game_spawn(v->server, (Entity*)&(MakeExellerClone(x, y, dir, v->id)), sizeof(ExellerClone), NULL); + break; + } + + case CLIENT_EXELLER_TELEPORT_CLONE: + { + AssertOrDisconnect(v->server, v->in_game); + AssertOrDisconnect(v->server, v->id == v->server->game.exe); + AssertOrDisconnect(v->server, v->exe_char == EX_EXELLER); + + PacketRead(eid, packet, packet_read16, uint16_t); + + ExellerClone* clone; + if (game_despawn(v->server, (Entity**)&clone, eid)) + { + if (v->mod_tool) + { + Packet pack; + PacketCreate(&pack, SERVER_EXELLERCLONE_STATE); + PacketWrite(&pack, packet_write8, 0); + PacketWrite(&pack, packet_write16, clone->id); + PacketWrite(&pack, packet_write16, clone->owner); + PacketWrite(&pack, packet_write16, (uint16_t)v->plr.pos.x); + PacketWrite(&pack, packet_write16, (uint16_t)v->plr.pos.y); + PacketWrite(&pack, packet_write8, clone->dir); + RAssert(packet_send(v->peer, &pack, true)); + free(clone); + break; + } + + Packet pack; + PacketCreate(&pack, SERVER_EXELLERCLONE_STATE); + PacketWrite(&pack, packet_write8, 1); + PacketWrite(&pack, packet_write16, clone->id); + server_broadcast(v->server, &pack, true); + + free(clone); + v->plr.ex_teleport = 60; + } + break; + } + + case CLIENT_PLAYER_ESCAPED: + { + AssertOrDisconnect(v->server, v->in_game); + AssertOrDisconnect(v->server, v->id != v->server->game.exe); + + if (v->mod_tool) + { + RAssert(server_disconnect(v->server, v->peer, DR_SERVERTIMEOUT, NULL)); + break; + } + + if (v->plr.flags & PLAYER_DEAD || v->plr.flags & PLAYER_DEMONIZED) + break; + + if (v->plr.flags & PLAYER_ESCAPED) + break; + + SET_FLAG(v->plr.flags, PLAYER_ESCAPED); + + Packet pack; + PacketCreate(&pack, SERVER_PLAYER_ESCAPED); + RAssert(packet_send(v->peer, &pack, true)); + + PacketCreate(&pack, SERVER_GAME_PLAYER_ESCAPED); + PacketWrite(&pack, packet_write16, v->id); + server_broadcast(v->server, &pack, true); + + RAssert(game_state_check(v->server)); + break; + } + + case CLIENT_PLAYER_DEATH_STATE: + { + if (v->server->game.end > 0) + break; + + AssertOrDisconnect(v->server, v->in_game); + AssertOrDisconnect(v->server, v->id != v->server->game.exe); + AssertOrDisconnect(v->server, !(v->plr.flags & PLAYER_DEMONIZED)); + + PacketRead(dead, packet, packet_read8, uint8_t); + PacketRead(rtimes, packet, packet_read8, uint8_t); + + Packet pack; + PacketCreate(&pack, SERVER_PLAYER_DEATH_STATE); + PacketWrite(&pack, packet_write16, v->id); + PacketWrite(&pack, packet_write8, dead); + PacketWrite(&pack, packet_write8, rtimes); + server_broadcast(v->server, &pack, true); + + PacketCreate(&pack, SERVER_REVIVAL_STATUS); + PacketWrite(&pack, packet_write8, false) + PacketWrite(&pack, packet_write16, v->id); + server_broadcast(v->server, &pack, true); + + if (dead) + { + if (v->plr.flags & PLAYER_DEAD || v->plr.flags & PLAYER_ESCAPED) + break; + + SET_FLAG(v->plr.flags, PLAYER_DEAD); + if (v->plr.flags & PLAYER_REVIVED || v->server->game.time_sec < TICKSPERSEC * 2) + { + RAssert(game_demonize(v->server, v)); + } + else + { + PeerData* exe = server_find_peer(v->server, v->server->game.exe); + v->plr.death_timer_sec = 30; + + PacketCreate(&pack, SERVER_GAME_DEATHTIMER_TICK); + PacketWrite(&pack, packet_write8, exe && vector2_dist(&v->plr.pos, &exe->plr.pos) <= 240); + PacketWrite(&pack, packet_write16, v->id); + PacketWrite(&pack, packet_write8, v->plr.death_timer_sec); + server_broadcast(v->server, &pack, true); + } + } + else + { + AssertOrDisconnect(v->server, v->plr.death_timer_sec > 0); + DEL_FLAG(v->plr.flags, PLAYER_DEAD); + } + + RAssert(game_state_check(v->server)); + break; + } + + case CLIENT_REVIVAL_PROGRESS: + { + if (v->server->game.end > 0) + break; + + PacketRead(pid, packet, packet_read16, uint16_t); + PacketRead(rings, packet, packet_read8, uint8_t); + + PeerData* to_revive = server_find_peer(v->server, pid); + AssertOrDisconnect(v->server, to_revive); + + if (!to_revive || !(to_revive->plr.flags & PLAYER_DEAD)) + break; + + Packet pack; + if (to_revive->plr.flags & PLAYER_CANTREVIVE) + { + to_revive->plr.death_timer_sec = 0; + to_revive->plr.death_timer = 0; + + PacketCreate(&pack, SERVER_REVIVAL_STATUS); + PacketWrite(&pack, packet_write8, 0); + PacketWrite(&pack, packet_write16, to_revive->id); + server_broadcast(v->server, &pack, true); + break; + } + + if (to_revive->plr.revival <= 0) + { + PacketCreate(&pack, SERVER_REVIVAL_STATUS); + PacketWrite(&pack, packet_write8, 1); + PacketWrite(&pack, packet_write16, to_revive->id); + server_broadcast(v->server, &pack, true); + } + + to_revive->plr.revival += 0.015 + (0.004 * rings); + if (to_revive->plr.revival < 1) + { + PacketCreate(&pack, SERVER_REVIVAL_PROGRESS); + PacketWrite(&pack, packet_write16, to_revive->id); + PacketWrite(&pack, packet_writedouble, to_revive->plr.revival); + server_broadcast(v->server, &pack, false); + + // add itself to the list + { + bool has = false; + int ind = 0; + + for (int i = 0; i < 5; i++) + { + if (to_revive->plr.revival_init[i] == -1) + { + ind = i; + break; + } + + if (to_revive->plr.revival_init[i] == v->id) + has = true; + } + + if (!has) + to_revive->plr.revival_init[ind] = v->id; + } + } + else + { + to_revive->plr.stats.rings = 0; + + SET_FLAG(to_revive->plr.flags, PLAYER_REVIVED); + DEL_FLAG(to_revive->plr.flags, PLAYER_DEAD); + + PacketCreate(&pack, SERVER_REVIVAL_STATUS); + PacketWrite(&pack, packet_write8, 0); + PacketWrite(&pack, packet_write16, to_revive->id); + server_broadcast(v->server, &pack, true); + + PacketCreate(&pack, SERVER_REVIVAL_REVIVED); + packet_send(to_revive->peer, &pack, true); + + for (int i = 0; i < 5; i++) + { + if (to_revive->plr.revival_init[i] == -1) + break; + + PeerData* data = server_find_peer(v->server, to_revive->plr.revival_init[i]); + if(!data) + continue; + + PacketCreate(&pack, SERVER_REVIVAL_RINGSUB); + packet_send(data->peer, &pack, true); + + Debug("Removed rings from %d", to_revive->plr.revival_init[i]); + } + + // Print player's name + Info("%s " LOG_RST "(id %d)" LOG_GRN " was revived!", to_revive->nickname.value, to_revive->id); + } + break; + } + + case CLIENT_CHAT_MESSAGE: + { + if (v->in_game) + break; + + v->timeout = 0; + + PacketRead(pid, packet, packet_read16, uint16_t); + PacketRead(msg, packet, packet_readstr, String); + AssertOrDisconnect(v->server, string_length(&msg) <= 40); + + Info("%s " LOG_RST "(id %d): %s", v->nickname.value, v->id, msg.value); + if (!server_cmd_handle(v->server, server_cmd_parse(&msg), v, &msg) && g_config.chatfix) + server_broadcast_msg(v->server, v->id, msg.value); + + break; + } + + case CLIENT_PING: + { + if (!v->server->game.started) + break; + + if (v->plr.mod_tool) + { + if (v->server->game.time_sec <= TICKSPERSEC * 2 + 5) + break; + } + + Packet pack; + PacketCreate(&pack, SERVER_PONG); + PacketWrite(&pack, packet_write16, v->peer->roundTripTime); + packet_send(v->peer, &pack, false); + v->plr.ping_last = v->peer->roundTripTime; + + PacketCreate(&pack, SERVER_GAME_PING); + PacketWrite(&pack, packet_write16, v->id); + PacketWrite(&pack, packet_write16, v->peer->roundTripTime); + server_broadcast_ex(v->server, &pack, false, v->id); + break; + } + + case CLIENT_PLAYER_DATA: + { + if (!v->server->game.started) + break; + + PacketRead(x, packet, packet_read16, uint16_t); + PacketRead(y, packet, packet_read16, uint16_t); + PacketRead(_xspd, packet, packet_read16, uint16_t); + PacketRead(_yspd, packet, packet_read16, uint16_t); + + PacketRead(state, packet, packet_read8, uint8_t); + PacketRead(_angle, packet, packet_read16, int16_t); + PacketRead(_index, packet, packet_read8, uint8_t); + PacketRead(_xscale, packet, packet_read8, int8_t); + + Vector2 new_pos = { x, y }; + #define PLAYER_ATTACKING 1 << 4 + + int duration = 2000; + if(v->server->game.exe != v->id) + { + PacketRead(hp, packet, packet_read8, int8_t); + PacketRead(revival, packet, packet_read8, uint8_t); + PacketRead(rings, packet, packet_read16, int16_t); + PacketRead(flags, packet, packet_read8, uint8_t); + + if(!(v->plr.flags & PLAYER_DEAD) && !(v->plr.flags & PLAYER_DEMONIZED)) + { + if (v->server->game.exe != v->id) + { + v->plr.rings = rings; + if (revival < 2) + { + if (rings < 0 || (v->server->game.map != 20 && rings >= 120)) + { + server_disconnect(v->server, v->peer, DR_OTHER, "gomunkulus"); + return true; + } + + if (hp > 100) + { + server_disconnect(v->server, v->peer, DR_OTHER, "garic forn — Сьогодні о 04:31"); + return true; + } + } + } + } + + v->plr.is_attacking = flags & PLAYER_ATTACKING; + switch(v->surv_char) + { + case CH_EGGMAN: + { + duration = 3000; + break; + } + } + } + else + { + PacketRead(flags, packet, packet_read8, uint8_t); + v->plr.is_attacking = flags & PLAYER_ATTACKING; + } + + if(v->server->game.end <= 0 && v->plr.is_attacking) + { + if(v->plr.attack_timer <= 0) + { + time_start(&v->plr.last_attack); + v->plr.attack_timer = 1; + } + else + { + double elapsed = time_end(&v->plr.last_attack); + v->plr.attack_timer += elapsed; + if(v->plr.attack_timer >= duration) + { + server_disconnect(v->server, v->peer, DR_KICKEDBYHOST, "nuh-uh!"); + return true; + } + time_start(&v->plr.last_attack); + } + } + else + v->plr.attack_timer = 0; + + // ping limit disabled + if(g_config.ping_limit == UINT16_MAX) + { + // Calc distance before setting new posx + float dist = vector2_dist(&v->plr.pos, &new_pos); + if (v->server->game.started && !v->plr.mod_tool && v->plr.pos.x != 0 && v->plr.pos.y != 0) + { + if (v->plr.ex_teleport == 0) + { + if (dist > 700) + { + switch (v->server->game.map) + { + case 15: + case 13: + case 8: + case 6: + break; + + default: + server_disconnect(v->server, v->peer, DR_OTHER, "blud used a portal gun lmfao"); + return true; + } + } + + if (dist > 60) + { + if (!player_add_error(v->server, v, 500)) + return true; + } + } + else + v->plr.ex_teleport--; + } + } + + v->plr.pos = new_pos; + v->plr.timeout = 0; + + if (v->plr.mod_tool) + { + if (v->plr.mod_tool_timer < 61) + v->plr.mod_tool_timer++; + else + { + float dist = vector2_dist(&v->plr.pos, &v->plr.start_pos); + if (dist > 240) + { + Packet pack; + PacketCreate(&pack, SERVER_PLAYER_BACKTRACK); + PacketWrite(&pack, packet_writefloat, v->plr.start_pos.x); + PacketWrite(&pack, packet_writefloat, v->plr.start_pos.y); + packet_send(v->peer, &pack, true); + } + else if (dist >= 300) + { + // purpl men + server_disconnect(v->server, v->peer, DR_OTHER, + "@@@@@@@......@@@\n" + "@@@@@@@......@@@\n" + "@@@@@@@.......@@\n" + "@@@@@@@@@@@@....\n" + "@@@@@@@@@@......\n" + "....@@..........\n" + "................\n" + "@@@@@@@@@@@@....\n" + "@@@@@@@@@@@@....\n" + "@@@@@@@@@@@@@...\n" + "@@@@@@@@@@@@@...\n" + "@@@@@@@@@@@....." + ); + } + break; + } + + if (v->plr.mod_tool_timer == 60) + { + v->plr.start_pos = v->plr.pos; + + Packet pack; + PacketCreate(&pack, SERVER_FELLA); + PacketWrite(&pack, packet_write16, v->id); + PacketWrite(&pack, packet_writefloat, v->plr.start_pos.x); + PacketWrite(&pack, packet_writefloat, v->plr.start_pos.y); + server_broadcast(v->server, &pack, true); + break; + } + } + + if(v->plr.state != state || time_end(&v->plr.last_packet) >= 15 * 2.9) + { + v->plr.state = state; + time_start(&v->plr.last_packet); + + Packet pack; + PacketCreate(&pack, CLIENT_PLAYER_DATA); + PacketWrite(&pack, packet_write16, v->id); + + RAssert(packet_seek(packet, 2)); + while (packet->pos < packet->len) + { + PacketRead(i, packet, packet_read8, uint8_t); + PacketWrite(&pack, packet_write8, i); + } + + server_broadcast_ex(v->server, &pack, false, v->id); + } + break; + } + } + + if (!v->server->game.started) + { + if(!v->plr.ready) + { + time_start(&v->plr.last_packet); + v->plr.ready = true; + } + + RAssert(game_checkstart(v->server)); + return true; + } + + RAssert(packet_seek(packet, 0)); + RAssert(g_mapList[v->server->game.map].cb.tcp_msg(v, packet)); + return true; +} + +bool game_entity_tick(Server* server) +{ + int32_t entits[100]; + int entit = 0; + + for(int i = 0; i < 100; i++) + entits[i] = -1; + + for (size_t i = 0; i < server->game.entities.capacity; i++) + { + Entity* ent = (Entity*)server->game.entities.ptr[i]; + if (!ent) + continue; + + if (ent->tick && !ent->tick(server, ent)) + entits[entit++] = ent->id; + } + + for (int i = 0; i < 100; i++) + { + if (entits[i] == -1) + break; + + game_despawn(server, NULL, (uint16_t)entits[i]); + } + + return true; +} + +bool game_player_tick(Server* server) +{ + // Update player cooldown + for (int i = 0; i < PLAYER_COOLCOUNT; i++) + { + if (server->game.cooldowns[i] > 0) + server->game.cooldowns[i] -= server->delta; + else + server->game.cooldowns[i] = 0; + } + + PeerData* exe = server_find_peer(server, server->game.exe); + if(!exe) + return true; + + bool exe_camp = false; + int survivors = 0, demonized = 0; + + for(size_t i = 0; i < server->peers.capacity; i++) + { + PeerData* data = (PeerData*)server->peers.ptr[i]; + if (!data) + continue; + + if(!data->in_game) + continue; + + player_check_zone(server, data); + + // ping check + if (server->delta < 2.5) + { + data->plr.ping_timer += server->delta; + data->plr.ping_total += data->plr.ping_last * server->delta; + + if (data->plr.ping_timer >= 20 * TICKSPERSEC) + { + double avg_ping = data->plr.ping_total / data->plr.ping_timer; + if (avg_ping >= g_config.ping_limit) + { + char msg[130]; + snprintf(msg, 130, "Bad connection, try picking closest region for better experience!\nYour average ping for last 20s: %dms", (int)avg_ping); + server_disconnect(server, data->peer, DR_OTHER, msg); + continue; + } + + data->plr.ping_total = 0; + data->plr.ping_timer = 0; + } + } + + if((data->plr.flags & PLAYER_DEAD) && !(data->plr.flags & PLAYER_CANTREVIVE) && vector2_dist(&exe->plr.pos, &data->plr.pos) < 300) + exe_camp = true; + + if (exe->id != data->id && !(data->plr.flags & PLAYER_DEAD) && !(data->plr.flags & PLAYER_DEMONIZED)) + { + // calc danger time + if (!(data->plr.flags & PLAYER_ESCAPED)) + { + bool in_danger = exe && vector2_dist(&data->plr.pos, &exe->plr.pos) < 300; + if (in_danger) + data->plr.stats.danger_time += server->delta; + + if(server->game.map != 8 && server->game.map != 6) + { + // calc balls + uint32_t chunk = ((uint32_t)data->plr.pos.x / 480) + ((uint32_t)data->plr.pos.y / 270); + if (data->plr.chunk != chunk) + { + data->plr.stats.braindead_time = 0; + data->plr.chunk = chunk; + } + else + { + data->plr.stats.braindead_time += server->delta * (in_danger ? 0.5 : 1); + if (data->plr.stats.braindead_time >= 25 * TICKSPERSEC) + data->plr.stats.brain_damage = true; + } + } + } + + data->plr.stats.survive_time += server->delta; + } + + // subpussy revival time + if(data->plr.flags & PLAYER_DEAD && !(data->plr.flags & PLAYER_CANTREVIVE)) + { + if(data->plr.revival > 0) + { + data->plr.revival -= 0.0025 * server->delta; + + Packet pack; + if(data->plr.revival <= 0) + { + for(int i = 0; i < 5; i++) + data->plr.revival_init[i] = -1; + + PacketCreate(&pack, SERVER_REVIVAL_STATUS); + PacketWrite(&pack, packet_write8, 0); + PacketWrite(&pack, packet_write16, data->id); + server_broadcast(server, &pack, true); + } + else + { + PacketCreate(&pack, SERVER_REVIVAL_PROGRESS); + PacketWrite(&pack, packet_write16, data->id); + PacketWrite(&pack, packet_writedouble, data->plr.revival); + server_broadcast(server, &pack, false); + } + } + } + + if (!(data->plr.flags & PLAYER_ESCAPED)) + { + data->plr.timeout += server->delta; + if (data->plr.timeout >= 4.f * TICKSPERSEC) + server_disconnect(server, data->peer, DR_AFKTIMEOUT, NULL); + continue; + } + + if (data->id == server->game.exe) + continue; + + if (data->plr.flags & PLAYER_DEMONIZED) + demonized++; + else if (!(data->plr.flags & PLAYER_DEAD)) + survivors++; + } + + if(server->game.map != 8 && exe_camp) + exe->plr.stats.camp_time += server->delta; + + // Start demonization + if (!server->game.sudden_death && server->game.time_sec <= TICKSPERSEC * 2) + { + server->game.sudden_death = true; + + PeerData* sort[6]; + int len = 0; + memset(sort, 0, sizeof(Player*) * 6); + + for (size_t i = 0; i < server->peers.capacity; i++) + { + PeerData* data = (PeerData*)server->peers.ptr[i]; + if (!data) + continue; + + if(!data->in_game) + continue; + + if (!(data->plr.flags & PLAYER_DEAD)) + continue; + + sort[len++] = data; + } + + for (int i = 0; i < len; ++i) + { + for (int j = i + 1; j < len; ++j) + { + double totalA = sort[i]->plr.death_timer_sec + (sort[i]->plr.death_timer / 60.0); + double totalB = sort[j]->plr.death_timer_sec + (sort[j]->plr.death_timer / 60.0); + + if (totalA > totalB) + { + PeerData* a = sort[i]; + sort[i] = sort[j]; + sort[j] = a; + } + } + } + + Debug("Demonization order:"); + for (int i = 0; i < len; i++) + { + Debug("%d: %f", sort[i]->id, sort[i]->plr.death_timer_sec + (sort[i]->plr.death_timer / 60.0)); + game_demonize(server, sort[i]); + } + } + + for (size_t i = 0; i < server->peers.capacity; i++) + { + PeerData* data = (PeerData*)server->peers.ptr[i]; + if (!data) + continue; + + if(!data->in_game) + continue; + + if (data->plr.flags & PLAYER_CANTREVIVE) + continue; + + if (data->plr.flags & PLAYER_DEAD && data->plr.death_timer_sec > 0) + { + Packet packet; + bool exe_near = false; + bool demonized_near = false; + + // check if exe is nearby + for (size_t j = 0; j < server->peers.capacity; j++) + { + PeerData* check = (PeerData*)server->peers.ptr[j]; + if (!check) + continue; + + if(!check->in_game) + continue; + + if (check->id != server->game.exe && !(check->plr.flags & PLAYER_DEMONIZED)) + continue; + + if (vector2_dist(&data->plr.pos, &check->plr.pos) <= 240) + { + if (check->plr.flags & PLAYER_DEMONIZED) + demonized_near = true; + else + { + demonized_near = false; + exe_near = true; + break; + } + } + } + + if (server->game.time_sec < TICKSPERSEC * 2) + { + game_demonize(server, data); + continue; + } + + if (data->plr.death_timer >= TICKSPERSEC) + { + if (!exe_near) + { + if (--data->plr.death_timer_sec <= 0) + { + game_demonize(server, data); + continue; + } + } + + PacketCreate(&packet, SERVER_GAME_DEATHTIMER_TICK); + PacketWrite(&packet, packet_write8, exe_near); + PacketWrite(&packet, packet_write16, data->id); + PacketWrite(&packet, packet_write8, data->plr.death_timer_sec); + server_broadcast(server, &packet, true); + + data->plr.death_timer = 0; + } + + data->plr.death_timer += (demonized_near ? 0.5f : 1.0f) * server->delta; + } + } + + return true; +} + +bool game_state_tick(Server* server) +{ + // We wait 15 seconds, before kicking out everyone + if (!server->game.started) + { + server->game.start_timeout -= server->delta; + if (server->game.start_timeout <= 0) + { + Warn("Waiting for players took too long, kicking out inactive players!"); + + for (size_t j = 0; j < server->peers.capacity; j++) + { + PeerData* data = (PeerData*)server->peers.ptr[j]; + if (!data) + continue; + + if(!data->in_game) + continue; + + if (!data->plr.ready) + { + server_disconnect(server, data->peer, DR_PACKETSNOTRECV, NULL); + break; + } + } + + } + return true; + } + + if (server->game.end > 0) + { + server->game.end -= server->delta; + if (server->game.end <= 0) + RAssert(game_uninit(server, true)); + + return true; + } + + server->game.elapsed += server->delta; + if (server->game.time <= TICKSPERSEC) + { + server->game.time_sec--; + server->game.time += TICKSPERSEC; + + if (server->game.time_sec % server->game.ring_coff == 0) + { + if (!game_spawn(server, (Entity*)&(MakeRing()), sizeof(Ring), NULL)) + Debug("Not enough space for rings"); + } + + Packet packet; + PacketCreate(&packet, SERVER_GAME_TIME_SYNC); + PacketWrite(&packet, packet_write16, (uint16_t)server->game.time_sec * TICKSPERSEC); + server_broadcast(server, &packet, true); + + if (server->game.time_sec <= 0) + RAssert(game_end(server, ED_TIMEOVER, true)); + } + + RAssert(game_player_tick(server)); + RAssert(game_entity_tick(server)); + RAssert(g_mapList[server->game.map].cb.tick(server)); + + server->game.time -= server->delta; + return true; +} diff --git a/disasterserver_c/states/Lobby.c b/disasterserver_c/states/Lobby.c new file mode 100644 index 0000000..688a403 --- /dev/null +++ b/disasterserver_c/states/Lobby.c @@ -0,0 +1,694 @@ +#include +#include +#include +#include +#include +#include +#include +#include + +#define NO_COUNTDOWN (5 + 1) +#define COUNTDOWN (5) + +bool lobby_send_countdown(Server* server) +{ + Packet pack; + + PacketCreate(&pack, SERVER_LOBBY_COUNTDOWN); + PacketWrite(&pack, packet_write8, server->lobby.countdown_sec < NO_COUNTDOWN); + PacketWrite(&pack, packet_write8, server->lobby.countdown_sec); + + server_broadcast(server, &pack, true); + return true; +} + +void lobby_check_vote(Server* server) +{ + if (vote_check(&server->lobby.vote)) + { + switch (server->lobby.vote.type) + { + case VOTE_KICK: + { + char buffer[256]; + snprintf(buffer, 256, "vote kick " CLRCODE_GRN "succeeded~ (" CLRCODE_GRN "%d" " ~from " CLRCODE_RED "%d~)", server->lobby.vote.votecnt, server->lobby.vote.votetotal); + server_broadcast_msg(server, 0, buffer); + + timeout_set(server->lobby.kick_target.nickname.value, server->lobby.kick_target.udid.value, server->lobby.kick_target.ip.value, time(NULL) + 60); + server_disconnect_id(server, server->lobby.kick_target.id, DR_KICKEDBYHOST, NULL); + break; + } + + case VOTE_PRACTICE: + { + char buffer[256]; + snprintf(buffer, 256, "vote practice " CLRCODE_GRN "succeeded~ (" CLRCODE_GRN "%d" " ~from " CLRCODE_RED "%d~)", server->lobby.vote.votecnt, server->lobby.vote.votetotal); + server_broadcast_msg(server, 0, buffer); + + server->lobby.prac_countdown = 2 * TICKSPERSEC; + break; + } + } + } + else + { + switch (server->lobby.vote.type) + { + case VOTE_KICK: + { + char buffer[256]; + snprintf(buffer, 256, "vote kick " CLRCODE_RED "failed~ (" CLRCODE_GRN "%d" " ~from " CLRCODE_RED "%d~)", server->lobby.vote.votecnt, server->lobby.vote.votetotal); + server_broadcast_msg(server, 0, buffer); + break; + } + + case VOTE_PRACTICE: + { + char buffer[256]; + snprintf(buffer, 256, "vote practice " CLRCODE_RED "failed~ (" CLRCODE_GRN "%d" " ~from " CLRCODE_RED "%d~)", server->lobby.vote.votecnt, server->lobby.vote.votetotal); + server_broadcast_msg(server, 0, buffer); + break; + } + } + } + + server->lobby.vote.ongoing = 0; +} + +bool lobby_check_countdown(Server* server) +{ + if (!server) // stop warnings + return false; + + uint8_t count = 0; + for (size_t i = 0; i < server->peers.capacity; i++) + { + PeerData* peer = (PeerData*)server->peers.ptr[i]; + if (!peer) + continue; + + if (peer->ready) + count++; + } + + if (count == server->peers.noitems && server->peers.noitems > 1) + { + server->lobby.countdown = TICKSPERSEC; + server->lobby.countdown_sec = COUNTDOWN; + RAssert(lobby_send_countdown(server)); + } + else if (server->lobby.countdown_sec != NO_COUNTDOWN) + { + server->lobby.countdown = TICKSPERSEC; + server->lobby.countdown_sec = NO_COUNTDOWN; + RAssert(lobby_send_countdown(server)); + } + + return true; +} + +bool lobby_state_handle(PeerData* v, Packet* packet) +{ + // sub-state machine + switch (v->server->state) + { + case ST_LOBBY: + case ST_GAME: + case ST_RESULTS: + break; + case ST_MAPVOTE: + return mapvote_state_handle(v, packet); + case ST_CHARSELECT: + return charselect_state_handle(v, packet); + } + + // Read header + PacketRead(passtrough, packet, packet_read8, uint8_t); + PacketRead(type, packet, packet_read8, uint8_t); + + bool res = true; + Packet pack; + switch (type) + { + default: + RAssert(server_msg_handle(v->server, type, v, packet)); + break; + + case CLIENT_LOBBY_PLAYERS_REQUEST: + { + for (size_t i = 0; i < v->server->peers.capacity; i++) + { + PeerData* peer = (PeerData*)v->server->peers.ptr[i]; + if (!peer) + continue; + + if (peer->id == v->id) + continue; + + packet_new(&pack, SERVER_LOBBY_PLAYER); + packet_write16(&pack, peer->id); + packet_write8(&pack, peer->ready); /* ready */ + packet_writestr(&pack, peer->nickname); + packet_write8(&pack, peer->lobby_icon); + packet_write8(&pack, peer->pet); + + if (!packet_send(v->peer, &pack, true)) + { + res = false; + break; + } + } + + PacketCreate(&pack, SERVER_LOBBY_CORRECT); + RAssert(packet_send(v->peer, &pack, true)); + + char msg[100]; + snprintf(msg, 100, "server " CLRCODE_RED "%d" CLRCODE_RST " of " CLRCODE_BLU "%d" CLRCODE_RST, v->server->id+1, g_config.server_count); + + server_send_msg(v->server, v->peer, "-----------------------"); + server_send_msg(v->server, v->peer, CLRCODE_RED "better/server~ v" STRINGIFY(BUILD_VERSION)); + server_send_msg(v->server, v->peer, "build from " CLRCODE_PUR __DATE__ " " CLRCODE_GRN __TIME__ CLRCODE_RST); + server_send_msg(v->server, v->peer, msg); + server_send_msg(v->server, v->peer, "-----------------------"); + server_send_msg(v->server, v->peer, CLRCODE_GRA "type .help for command list~"); + + if(g_config.motd[0] != '\0') + server_send_msg(v->server, v->peer, g_config.motd); + if (v->mod_tool) + server_send_msg(v->server, v->peer, CLRCODE_RED "your mod is disallowed on this server" CLRCODE_RST); + if (v->op) + server_send_msg(v->server, v->peer, CLRCODE_GRN "you're an operator on this server" CLRCODE_RST); + break; + } + + case CLIENT_CHAT_MESSAGE: + { + PacketRead(pid, packet, packet_read16, uint16_t); + PacketRead(msg, packet, packet_readstr, String); + AssertOrDisconnect(v->server, string_length(&msg) <= 80); + v->timeout = 0; + + // cheats + if(strstr(msg.value, "i want big burgr")) + { + if(v->op) + { + v->exe_chance = 101; + + Packet pack; + PacketCreate(&pack, SERVER_LOBBY_EXE_CHANCE); + PacketWrite(&pack, packet_write8, v->exe_chance); + RAssert(packet_send(v->peer, &pack, true)); + } + + RAssert(server_send_msg(v->server, v->peer, CLRCODE_GRA "you were sent to " CLRCODE_RED "brazil" CLRCODE_RST)); + return true; + } + + bool ignore = true; + unsigned long hash = server_cmd_parse(&msg); + + switch (hash) + { + default: + { + if(!server_cmd_handle(v->server, hash, v, &msg)) + ignore = false; + break; + } + + /* Force a map */ + case CMD_MAP: + { + if (!v->op) + { + RAssert(server_send_msg(v->server, v->peer, CLRCODE_RED "you aren't an operator")); + break; + } + + int ind; + if (sscanf(msg.value, ".map %d", &ind) <= 0) + { + RAssert(server_send_msg(v->server, v->peer, CLRCODE_RED "example:~ .map 1")); + break; + } + + ind--; + if (ind < 0 || ind >= MAP_COUNT+1) + { + char msg[128]; + snprintf(msg, 128, CLRCODE_RED "map should be between 1 and %d", MAP_COUNT + 1); + RAssert(server_send_msg(v->server, v->peer, msg)); + break; + } + + return charselect_init(ind, v->server) || lobby_init(v->server); + } + + /* YES on votes */ + case CMD_YES: + case CMD_Y: + { + if (!v->server->lobby.vote.ongoing) + break; + + if (!v->can_vote) + { + server_send_msg(v->server, v->peer, CLRCODE_RED "you can't participate in this vote."); + break; + } + + if (v->server->lobby.vote.type == VOTE_KICK && v->server->lobby.kick_target.id == v->id) + { + server_send_msg(v->server, v->peer, CLRCODE_RED "why are you kicking yourself ???"); + break; + } + + switch (vote_add(&v->server->lobby.vote, v->id)) + { + case 1: + { + char buffer[512]; + snprintf(buffer, 512, "%s~ " CLRCODE_GRN "voted~.", v->nickname.value); + server_broadcast_msg(v->server, 0, buffer); + break; + } + + case 0: + { + server_send_msg(v->server, v->peer, CLRCODE_RED "you have already voted."); + break; + } + + case -1: + { + lobby_check_vote(v->server); + break; + } + } + break; + } + + /* Practice vote */ + case CMD_VP: + { + if (v->server->lobby.vote.ongoing) + { + if (!v->can_vote) + { + server_send_msg(v->server, v->peer, CLRCODE_RED "you can't participate in this vote."); + break; + } + + if (pid == v->server->lobby.kick_target.id) + { + switch (vote_add(&v->server->lobby.vote, v->id)) + { + case VOTE_SUCCESS: + { + char buffer[512]; + snprintf(buffer, 512, "%s~ " CLRCODE_GRN "voted~.", v->nickname.value); + server_broadcast_msg(v->server, 0, buffer); + break; + } + + case VOTE_ALREADYVOTED: + { + server_send_msg(v->server, v->peer, CLRCODE_RED "you have already voted."); + break; + } + + case VOTE_FULL: + { + lobby_check_vote(v->server); + break; + } + } + } + else + server_send_msg(v->server, v->peer, CLRCODE_RED "another vote is already in progress."); + + break; + } + + if (v->vote_cooldown > 0) + { + char buffer[128]; + snprintf(buffer, 128, CLRCODE_RED "you cannot start another vote for %d s", (int)(v->vote_cooldown / TICKSPERSEC)); + server_send_msg(v->server, v->peer, buffer); + break; + } + + if (!vote_init(v->server, &v->server->lobby.vote, VOTE_PRACTICE, 0)) + { + server_send_msg(v->server, v->peer, CLRCODE_RED "not enough participants."); + break; + } + + char buffer[356]; + snprintf(buffer, 356, "%s~ " CLRCODE_YLW "started practice vote." CLRCODE_RST, v->nickname.value); + + server_broadcast_msg(v->server, 0, "-----------------------"); + server_broadcast_msg(v->server, 0, buffer); + server_broadcast_msg(v->server, 0, "type " CLRCODE_GRN ".yes~ or ignore"); + server_broadcast_msg(v->server, 0, "results will be summarized in " CLRCODE_GRA "20~ sec"); + server_broadcast_msg(v->server, 0, "-----------------------"); + + vote_add(&v->server->lobby.vote, v->id); + v->vote_cooldown = 30 * TICKSPERSEC; + break; + } + + case CMD_VK: + { + if (v->server->lobby.vote.ongoing) + { + server_send_msg(v->server, v->peer, CLRCODE_RED "another vote is already in progress."); + break; + } + + if (v->vote_cooldown > 0) + { + char buffer[128]; + snprintf(buffer, 128, CLRCODE_RED "you cannot start another vote for %ds", (int)(v->vote_cooldown / TICKSPERSEC)); + server_send_msg(v->server, v->peer, buffer); + break; + } + + // we check if number of players in game is at least two + int ingame = server_ingame(v->server); + if (ingame > 2) + { + PacketCreate(&pack, SERVER_LOBBY_CHOOSEVOTEKICK); + RAssert(packet_send(v->peer, &pack, true)); + } + else + server_send_msg(v->server, v->peer, CLRCODE_RED "not enough participants."); + break; + } + } + + Info("%s " LOG_RST "(id %d): %s", v->nickname.value, v->id, msg.value); + if (!ignore && g_config.chatfix) + server_broadcast_msg(v->server, v->id, msg.value); + + break; + } + + case CLIENT_LOBBY_READY_STATE: + { + PacketRead(state, packet, packet_read8, uint8_t); + v->ready = state; + + PacketCreate(&pack, SERVER_LOBBY_READY_STATE); + PacketWrite(&pack, packet_write16, v->id); + PacketWrite(&pack, packet_write8, state); + server_broadcast(v->server, &pack, true); + + RAssert(lobby_check_countdown(v->server)); + break; + } + + case CLIENT_LOBBY_CHOOSEVOTEKICK: + { + PacketRead(pid, packet, packet_read16, uint16_t); + + if (v->server->lobby.vote.ongoing) + { + if (!v->can_vote) + { + server_send_msg(v->server, v->peer, CLRCODE_RED "you can't participate in this vote."); + break; + } + + if (pid == v->server->lobby.kick_target.id) + { + switch (vote_add(&v->server->lobby.vote, v->id)) + { + case VOTE_SUCCESS: + { + char buffer[512]; + snprintf(buffer, 512, "%s~ " CLRCODE_GRN "voted~.", v->nickname.value); + server_broadcast_msg(v->server, 0, buffer); + break; + } + + case VOTE_ALREADYVOTED: + { + server_send_msg(v->server, v->peer, CLRCODE_RED "you have already voted."); + break; + } + + case VOTE_FULL: + { + lobby_check_vote(v->server); + break; + } + } + } + else + server_send_msg(v->server, v->peer, CLRCODE_RED "another vote is already in progress."); + + break; + } + else + { + bool found = false; + for (size_t i = 0; i < v->server->peers.capacity; i++) + { + PeerData* peer = (PeerData*)v->server->peers.ptr[i]; + if (!peer) + continue; + + if (peer->id == pid) + { + if (peer->op) + { + char buffer[128]; + snprintf(buffer, 128, CLRCODE_RED "you're permissionless"); + server_send_msg(v->server, v->peer, buffer); + return true; + } + + memcpy(&v->server->lobby.kick_target, peer, sizeof(PeerData)); + found = true; + break; + } + } + + if (found) + { + if (v->vote_cooldown > 0) + { + char buffer[128]; + snprintf(buffer, 128, CLRCODE_RED "you cannot start another vote for %ds", (int)(v->vote_cooldown / TICKSPERSEC)); + server_send_msg(v->server, v->peer, buffer); + break; + } + + if(!vote_init(v->server, &v->server->lobby.vote, VOTE_KICK, pid)) + { + server_send_msg(v->server, v->peer, CLRCODE_RED "not enough participants."); + break; + } + + char buffer[555]; + snprintf(buffer, 555, "%s~ " CLRCODE_RED "started kick vote for " CLRCODE_RST "%s" CLRCODE_RST, v->nickname.value, v->server->lobby.kick_target.nickname.value); + + server_broadcast_msg(v->server, 0, "-----------------------"); + server_broadcast_msg(v->server, 0, buffer); + server_broadcast_msg(v->server, 0, "type " CLRCODE_GRN ".yes~ or ignore"); + server_broadcast_msg(v->server, 0,"results will be summarized in " CLRCODE_GRA "20~ sec"); + server_broadcast_msg(v->server, 0, "-----------------------"); + + vote_add(&v->server->lobby.vote, v->id); + v->vote_cooldown = 30 * TICKSPERSEC; + } + else + server_broadcast_msg(v->server, 0, CLRCODE_RED "specified player not found."); + } + + break; + } + + + } + + return res; +} + +bool lobby_state_tick(Server* server) +{ + uint8_t should = 0; + + // sub-state machine + switch (server->state) + { + case ST_LOBBY: + { + for (size_t i = 0; i < server->peers.capacity; i++) + { + PeerData* peer = (PeerData*)server->peers.ptr[i]; + if (!peer) + continue; + + if (peer->vote_cooldown > 0) + peer->vote_cooldown -= server->delta; + + if (!peer->ready) + { + //peer->timeout += server->delta; + //if ((int)peer->timeout % 60 == 0) + // Debug("tick for %s: %f", peer->nickname.value, peer->timeout/60.0f); + + if (peer->timeout >= 25 * TICKSPERSEC) + server_disconnect(server, peer->peer, DR_AFKTIMEOUT, NULL); + } + else + peer->timeout = 0; + } + break; + } + case ST_MAPVOTE: + return mapvote_state_tick(server); + + case ST_CHARSELECT: + return charselect_state_tick(server); + + case ST_GAME: + case ST_RESULTS: + break; + } + + // Small delay before entering practice level + if (server->lobby.prac_countdown > 0) + { + server->lobby.prac_countdown -= server->delta; + if (server->lobby.prac_countdown <= 0) + return charselect_init(20, server) || lobby_init(server); + } + + // If vote is going on, call tick function + if (server->lobby.vote.ongoing && !vote_tick(server, &server->lobby.vote)) + lobby_check_vote(server); + + // Do countdown every second + if (server->lobby.countdown_sec <= COUNTDOWN) + { + if (server->lobby.countdown <= 0) + { + server->lobby.countdown += TICKSPERSEC; + + if (--server->lobby.countdown_sec == 0) + return mapvote_init(server) || lobby_init(server); + + RAssert(lobby_send_countdown(server)); + } + + server->lobby.countdown -= server->delta; + } + + return true; +} + +bool lobby_init(Server* server) +{ + srand((unsigned int)time(NULL)); + + Debug("Attepting to enter ST_LOBBY..."); + RAssert(server); + + for (size_t i = 0; i < server->peers.capacity; i++) + { + PeerData* v = (PeerData*)server->peers.ptr[i]; + if (!v) + continue; + + v->ready = false; + v->voted = false; + v->timeout = false; + + if (!v->in_game) + { + v->in_game = true; + + Packet pack; + PacketCreate(&pack, SERVER_IDENTITY_RESPONSE); + PacketWrite(&pack, packet_write8, 1); + PacketWrite(&pack, packet_write16, v->id); + + if (!packet_send(v->peer, &pack, true)) + { + server_disconnect_id(server, v->id, DR_SERVERTIMEOUT, NULL); + continue; + } + } + else + { + if (v->id != server->game.exe) + v->exe_chance += 2 + rand() % 5; + + Packet pack; + PacketCreate(&pack, SERVER_LOBBY_EXE_CHANCE); + PacketWrite(&pack, packet_write8, v->exe_chance); + packet_send(v->peer, &pack, true); + } + } + + server->state = ST_LOBBY; + server->lobby.countdown = TICKSPERSEC; + server->lobby.countdown_sec = NO_COUNTDOWN; + server->lobby.prac_countdown = 0; + memset(&server->lobby.vote, 0, sizeof(Vote)); + + Packet pack; + PacketCreate(&pack, SERVER_GAME_BACK_TO_LOBBY); + server_broadcast(server, &pack, true); + + Info(LOG_YLW "Server is now in " LOG_PUR "Lobby"); + return true; +} + +bool lobby_state_join(PeerData* v) +{ + if (!v->in_game) + return true; + + v->timeout = 0; + switch (v->server->state) + { + case ST_LOBBY: + break; + case ST_GAME: + case ST_RESULTS: + break; + case ST_MAPVOTE: + return mapvote_state_join(v); + case ST_CHARSELECT: + return charselect_state_join(v); + } + + RAssert(lobby_check_countdown(v->server)); + return true; +} + +bool lobby_state_left(PeerData* v) +{ + if (!v->in_game) + return true; + + switch (v->server->state) + { + case ST_LOBBY: + case ST_GAME: + case ST_RESULTS: + break; + case ST_MAPVOTE: + return mapvote_state_left(v); + case ST_CHARSELECT: + return charselect_state_left(v); + } + + RAssert(lobby_check_countdown(v->server)); + return true; +} diff --git a/disasterserver_c/states/Mapvote.c b/disasterserver_c/states/Mapvote.c new file mode 100644 index 0000000..d4c3306 --- /dev/null +++ b/disasterserver_c/states/Mapvote.c @@ -0,0 +1,261 @@ +#include "Server.h" +#include +#include +#include +#include +#include + +bool mapvote_check_state(Server* server) +{ + RAssert(server); + + uint8_t count = 0; + for (size_t i = 0; i < server->peers.capacity; i++) + { + PeerData* peer = (PeerData*)server->peers.ptr[i]; + if (!peer) + continue; + + if (peer->in_game && peer->voted) + count++; + } + + if (count >= server_ingame(server)) + { + if (server->lobby.countdown_sec > 3) + { + server->lobby.countdown = 0; + server->lobby.countdown_sec = 4; + } + } + + return true; +} + +bool mapvote_state_handle(PeerData* v, Packet* packet) +{ + // Read header + PacketRead(passtrough, packet, packet_read8, uint8_t); + PacketRead(type, packet, packet_read8, uint8_t); + + Packet pack; + bool res = true; + + switch (type) + { + case CLIENT_VOTE_REQUEST: + { + if(!v->in_game) + break; + + PacketRead(map, packet, packet_read8, uint8_t); + AssertOrDisconnect(v->server, !v->voted); + AssertOrDisconnect(v->server, map >= 0); + AssertOrDisconnect(v->server, map < 3); + + v->server->lobby.votes[map]++; + v->voted = true; + + PacketCreate(&pack, SERVER_VOTE_SET); + for (int i = 0; i < 3; i++) + PacketWrite(&pack, packet_write8, v->server->lobby.votes[i]); + + Info("%s " LOG_RST "(id %d) voted for [" LOG_BLU "%s" LOG_RST "]!", v->nickname.value, v->id, g_mapList[v->server->lobby.maps[map]].name); + server_broadcast(v->server, &pack, true); + mapvote_check_state(v->server); + break; + } + + case CLIENT_CHAT_MESSAGE: + { + PacketRead(pid, packet, packet_read16, uint16_t); + PacketRead(msg, packet, packet_readstr, String); + AssertOrDisconnect(v->server, string_length(&msg) <= 40); + + v->timeout = 0; + Info("%s " LOG_RST "(id %d): %s", v->nickname.value, v->id, msg.value); + if (!server_cmd_handle(v->server, server_cmd_parse(&msg), v, &msg)) + server_broadcast_ex(v->server, packet, true, v->id); + + break; + } + + default: + RAssert(server_msg_handle(v->server, type, v, packet)); + break; + } + + return res; +} + +bool mapvote_state_tick(Server* server) +{ + bool res = true; + + if (server->lobby.countdown <= 0) + { + server->lobby.countdown += TICKSPERSEC; + + if (--server->lobby.countdown_sec == 0) + { + //choose the map + int8_t indeces[3] = { -1, -1, -1 }; + int count = 0; + + int largest = 0; + for (int i = 0; i < 3; i++) + { + uint8_t values = server->lobby.votes[i]; + if (values > largest) + { + largest = values; + count = 0; + } + + if (values == largest) + { + indeces[count] = server->lobby.maps[i]; + count++; + } + } + + // Find winner + int8_t won = indeces[rand() % count]; + server->last_map = won; + + // Decrease pickrate + if ((server->map_pickrates[won] -= 255) < 0) + server->map_pickrates[won] = 0; + + // Decrease pickrate for other maps + for (int8_t i = 0; i < 3; i++) + { + if ((server->map_pickrates[server->lobby.maps[i]] -= 25) < 0) + server->map_pickrates[server->lobby.maps[i]] = 0; + } + + Debug("Pickrates:"); + // Increase other map's pickrate + for (int8_t i = 0; i < MAP_COUNT; i++) + { + Debug(" %d: %d", i, server->map_pickrates[i]); + if (i == won) + continue; + + server->map_pickrates[i] += 25; + if (server->map_pickrates[i] >= 255) + server->map_pickrates[i] = 255; + } + + Info(LOG_YLW "Map is [" LOG_BLU "%s" LOG_RST "]", g_mapList[won].name); + + return charselect_init(won, server) || lobby_init(server); + } + + Packet pack; + PacketCreate(&pack, SERVER_VOTE_TIME_SYNC); + PacketWrite(&pack, packet_write8, server->lobby.countdown_sec); + server_broadcast(server, &pack, true); + } + + server->lobby.countdown -= server->delta; + + return res; +} + +bool mapvote_init(Server* server) +{ + Debug("Attepting to enter ST_MAPVOTE..."); + RAssert(server); + + // randomize + time_t seed = time(NULL); + Debug("Mapvote seed: %d", seed); + srand((unsigned int)seed); + + RAssert(server); + server->state = ST_MAPVOTE; + server->lobby.countdown_sec = 30; + server->lobby.countdown = TICKSPERSEC; + memset(server->lobby.votes, 0, sizeof(server->lobby.votes)); + + MutexLock(g_config.map_list_lock); + { + // first we check if map count is less than 3 + int8_t allowed[MAP_COUNT] = { 0 }; + int8_t allowed_count = 0; + + for (int8_t i = 0; i < MAP_COUNT; i++) + { + if (g_config.map_list[i]) + allowed[allowed_count++] = i; + } + + // skip right away if we only have 3 maps + if (allowed_count <= 3) + { + for (int8_t i = 0; i < allowed_count; i++) + { + for(int j = i; j < 3; j++) + server->lobby.maps[j] = allowed[i]; + } + goto skip_rand; + } + + int8_t map; + for (int i = 0; i < 3; i++) + { + gen: + map = allowed[rand() % allowed_count]; + + if (map == server->last_map) + goto gen; + + int num = rand() % 255; + if (num >= server->map_pickrates[map]) + { + Debug("%d vs %d lost", num, server->map_pickrates[map]); + goto gen; + } + + for (int j = 0; j < i; j++) + { + if (server->lobby.maps[j] == map) + goto gen; + } + + server->lobby.maps[i] = map; + } + + } +skip_rand: + MutexUnlock(g_config.map_list_lock); + + Packet pack; + PacketCreate(&pack, SERVER_VOTE_MAPS); + for (int i = 0; i < 3; i++) + PacketWrite(&pack, packet_write8, server->lobby.maps[i]); + server_broadcast(server, &pack, true); + + PacketCreate(&pack, SERVER_VOTE_TIME_SYNC); + PacketWrite(&pack, packet_write8, server->lobby.countdown_sec); + server_broadcast(server, &pack, true); + + Info(LOG_YLW "Server is now in " LOG_PUR "Map Vote"); + Info("Maps: " LOG_RED "[%s] " LOG_BLU "[%s] " LOG_YLW "[%s]", g_mapList[server->lobby.maps[0]].name, g_mapList[server->lobby.maps[1]].name, g_mapList[server->lobby.maps[2]].name); + return true; +} + +bool mapvote_state_join(PeerData* v) +{ + return true; +} + +bool mapvote_state_left(PeerData* v) +{ + if(server_ingame(v->server) <= 1) + return lobby_init(v->server); + + RAssert(mapvote_check_state(v->server)); + return true; +} \ No newline at end of file diff --git a/disasterserver_c/states/Results.c b/disasterserver_c/states/Results.c new file mode 100644 index 0000000..cb24f35 --- /dev/null +++ b/disasterserver_c/states/Results.c @@ -0,0 +1,243 @@ +#include +#include +#include +#include +#include + +#define PLRSTATE_ESCAPED 4 +#define PLRSTATE_ALIVE 3 +#define PLRSTATE_DEAD 2 +#define PLRSTATE_DEMONIZED 1 +#define PLRSTATE_EXE 0 + +const char* SHAMES_1[] = +{ + CLRCODE_RED "(my skill issue makes me allergic to moving)", + CLRCODE_RED "(i'm afraid to leave my camp spot)", + CLRCODE_RED "(how am i not bored of camping)", + CLRCODE_RED "(i'm too bad to move around the map)", + CLRCODE_RED "(i just like being a brick)" +}; +#define SHAMES1_CNT 5 + +const char* SHAMES_2[] = +{ + CLRCODE_RED "(i can't win without camping bodies)", + CLRCODE_RED "(i'm afraid revived players will make me lose)", + CLRCODE_RED "(i camp bodies cuz im bad)" +}; +#define SHAMES2_CNT 3 + +int compare(const PeerData** plr1, const PeerData** plr2) +{ + const PeerData* a = *plr1; + const PeerData* b = *plr2; + + if (a->plr.flags & PLAYER_KILLER || b->plr.flags & PLAYER_KILLER) + return ((b->plr.flags & PLAYER_KILLER) > 0) - ((a->plr.flags & PLAYER_KILLER) > 0); + + if (a->plr.flags & PLAYER_LEFT || b->plr.flags & PLAYER_LEFT) + return ((a->plr.flags & PLAYER_LEFT) > 0) - ((b->plr.flags & PLAYER_LEFT) > 0); + + if (a->plr.flags & PLAYER_DEMONIZED || b->plr.flags & PLAYER_DEMONIZED) + return ((a->plr.flags & PLAYER_DEMONIZED) > 0) - ((b->plr.flags & PLAYER_DEMONIZED) > 0); + + if (a->plr.flags & PLAYER_DEAD || b->plr.flags & PLAYER_DEAD) + return ((a->plr.flags & PLAYER_DEAD) > 0) - ((b->plr.flags & PLAYER_DEAD) > 0); + + return 0; +} + +int compare2(const PeerData** plr1, const PeerData** plr2) +{ + const PeerData* a = *plr1; + const PeerData* b = *plr2; + + if (a->plr.flags & PLAYER_KILLER || b->plr.flags & PLAYER_KILLER) + return ((b->plr.flags & PLAYER_KILLER) > 0) - ((a->plr.flags & PLAYER_KILLER) > 0); + + if (a->plr.flags & PLAYER_LEFT || b->plr.flags & PLAYER_LEFT) + return 0; + + if (a->plr.flags & PLAYER_DEMONIZED || b->plr.flags & PLAYER_DEMONIZED) + return 0; + + if ((a->plr.flags & PLAYER_DEAD) > 0 == (b->plr.flags & PLAYER_DEAD) > 0) + return (int)(b->plr.stats.danger_time - a->plr.stats.danger_time); + + return 0; +} + +bool results_send(Server* server, PeerData* v, PeerData* data, bool has_quit) +{ + uint8_t type = PLRSTATE_ALIVE; + + if (data->plr.flags & PLAYER_ESCAPED) + type = PLRSTATE_ESCAPED; + if (data->plr.flags & PLAYER_DEMONIZED) + type = PLRSTATE_DEMONIZED; + else if (data->plr.flags & PLAYER_DEAD) + type = PLRSTATE_DEAD; + else if (server->game.exe == data->id) + type = PLRSTATE_EXE; + + Packet pack; + PacketCreate(&pack, SERVER_RESULTS_DATA); + + String nickname; + const char* postfix = ""; + + if (g_config.pride) + { + if (data->plr.stats.brain_damage && (data->plr.flags & PLAYER_ESCAPED)) + postfix = SHAMES_1[rand() % SHAMES1_CNT]; + + if (data->plr.stats.camp_time >= 30 * TICKSPERSEC) + postfix = SHAMES_2[rand() % SHAMES2_CNT]; + } + + nickname.len = snprintf(nickname.value, 129, "%s %s", data->nickname.value, postfix) + 1; + + PacketWrite(&pack, packet_writestr, nickname); + PacketWrite(&pack, packet_write8, data->exe_char != EX_NONE ? data->exe_char : data->surv_char); + PacketWrite(&pack, packet_write8, server->game.ending); + PacketWrite(&pack, packet_write16, server->game.time_sec) + PacketWrite(&pack, packet_write8, has_quit); + PacketWrite(&pack, packet_write8, type); + + PacketWrite(&pack, packet_write16, data->plr.stats.rings); + PacketWrite(&pack, packet_write16, data->plr.stats.kills); + PacketWrite(&pack, packet_write16, data->plr.stats.damage); + PacketWrite(&pack, packet_write16, data->plr.stats.damage_taken); + PacketWrite(&pack, packet_write16, data->plr.stats.stun_time); + PacketWrite(&pack, packet_write16, data->plr.stats.stuns); + PacketWrite(&pack, packet_write16, data->plr.stats.hp_restored); + PacketWrite(&pack, packet_writedouble, data->plr.stats.survive_time); + PacketWrite(&pack, packet_writedouble, data->plr.stats.danger_time); + + return packet_send(v->peer, &pack, true); +} + +bool results_init(Server* server) +{ + Debug("Attepting to enter ST_RESULTS..."); + server->state = ST_RESULTS; + server->results.countdown = 15 * TICKSPERSEC; + + Packet pack; + PacketCreate(&pack, SERVER_RESULTS); + PacketWrite(&pack, packet_write8, server->game.map); + server_broadcast(server, &pack, true); + + Info("Server is now in " LOG_PUR "Results"); + return true; +} + +bool results_uninit(Server* server) +{ + for (size_t i = 0; i < server->game.entities.capacity; i++) + { + Entity* entity = (Entity*)server->game.entities.ptr[i]; + if (!entity) + continue; + + free(entity); + } + dylist_free(&server->game.entities); + + // Clean up after game + for (size_t i = 0; i < server->game.left.capacity; i++) + { + PeerData* player = (PeerData*)server->game.left.ptr[i]; + if (!player) + continue; + + free(player); + } + dylist_free(&server->game.left); + + return lobby_init(server); +} + +bool results_state_tick(Server* server) +{ + server->results.countdown -= server->delta; + + if (server->results.countdown <= 0) + return results_uninit(server); + + return true; +} + +bool results_state_handle(PeerData* v, Packet* packet) +{ + PacketRead(_passtrough, packet, packet_read8, uint8_t); + PacketRead(type, packet, packet_read8, uint8_t); + + switch (type) + { + case CLIENT_RESULTS_REQUEST: + { + PeerData* sort[7]; + int len = 0; + memset(sort, 0, sizeof(PeerData*) * 7); + + for (size_t i = 0; i < v->server->peers.capacity; i++) + { + PeerData* data = (PeerData*)v->server->peers.ptr[i]; + if (!data) + continue; + + if(!data->in_game) + continue; + + sort[len++] = data; + } + + for (size_t i = 0; i < v->server->game.left.capacity; i++) + { + PeerData* data = (PeerData*)v->server->game.left.ptr[i]; + if (!data) + continue; + + if(!data->in_game) + continue; + + sort[len++] = data; + } + + qsort(sort, len, sizeof(PeerData*), (int (*)(const void *, const void *))compare); + qsort(sort, len, sizeof(PeerData*), (int (*)(const void *, const void *))compare2); + + for (size_t i = 0; i < len; i++) + { + PeerData* data = (PeerData*)sort[i]; + if (!data) + continue; + + RAssert(results_send(v->server, v, data, data->plr.flags & PLAYER_LEFT)); + } + break; + } + + case CLIENT_CHAT_MESSAGE: + { + if (v->in_game) + break; + + PacketRead(pid, packet, packet_read16, uint16_t); + PacketRead(msg, packet, packet_readstr, String); + AssertOrDisconnect(v->server, string_length(&msg) <= 40); + + v->timeout = 0; + + Info("[%s] (id %d): %s", v->nickname.value, v->id, msg.value); + if (!server_cmd_handle(v->server, server_cmd_parse(&msg), v, &msg) && g_config.chatfix) + server_broadcast_msg(v->server, v->id, msg.value); + + break; + } + } + + return true; +} \ No newline at end of file diff --git a/disasterserver_c/ui/Button.c b/disasterserver_c/ui/Button.c new file mode 100644 index 0000000..eb3df94 --- /dev/null +++ b/disasterserver_c/ui/Button.c @@ -0,0 +1,40 @@ +#include + +bool button_update(SDL_Renderer* renderer, struct _Component* component) +{ + Button* button = (Button*)component; + SDL_FRect src = { button->x, button->y, button->w, button->h }; + SDL_FRect dst = { button->d_x * INTERFACE_SCALE, button->d_y * INTERFACE_SCALE, button->d_w * INTERFACE_SCALE, button->d_h * INTERFACE_SCALE }; + + float mouse_x, mouse_y; + float scale_x, scale_y; + Uint32 flags = SDL_GetMouseState(&mouse_x, &mouse_y); + SDL_GetRenderScale(renderer, &scale_x, &scale_y); + + mouse_x /= scale_x; + mouse_y /= scale_y; + + if(mouse_x >= dst.x && mouse_y >= dst.y && mouse_x < dst.x + dst.w && mouse_y < dst.y + dst.h) + { + src.x += src.w; + + if(flags & SDL_BUTTON_MASK(1)) + { + if(!button->clicked && button->cb) + { + button->clicked = true; + + if (!button->cb(component)) + return false; + } + dst.y += 2; + } + else + button->clicked = false; + } + else + button->clicked = false; + + SDL_RenderTexture(renderer, g_textureSheet, &src, &dst); + return true; +} diff --git a/disasterserver_c/ui/Components.h b/disasterserver_c/ui/Components.h new file mode 100644 index 0000000..8787686 --- /dev/null +++ b/disasterserver_c/ui/Components.h @@ -0,0 +1,138 @@ +#ifndef COMPONENTS_H +#define COMPONENTS_H +#include +#include +#include +#include + +#define COMPONENT_BODY float x, y, w, h; UpdateCallback update +#define COLOR_WHITE (SDL_Color) { 255, 255, 255, 255 } +#define COLOR_RED (SDL_Color) { 194, 0, 55, 255 } +#define COLOR_GRN (SDL_Color) { 15, 255, 57, 255 } +#define COLOR_PUR (SDL_Color) { 184, 36, 255, 255 } +#define COLOR_BLU (SDL_Color) { 93, 103, 255, 255 } +#define COLOR_GRA (SDL_Color) { 100, 100, 100, 255 } +#define COLOR_YLW (SDL_Color) { 255, 219, 0, 255 } +#define COLOR_ORG (SDL_Color) { 234, 96, 20, 255 } +#define INTERFACE_SCALE 2 + +extern int g_mouseWheel; + +struct _Component; +typedef bool (*UpdateCallback)(SDL_Renderer*, struct _Component*); +typedef struct _Component +{ + COMPONENT_BODY; +} Component; + +typedef struct +{ + COMPONENT_BODY; + const char* text; + int scale; +} Label; +#define LabelCreate(x, y, text, scale) (Label) { x, y, 0, 0, label_update, text, scale } +bool label_update(SDL_Renderer* renderer, struct _Component* component); + +typedef struct +{ + COMPONENT_BODY; + float d_x, d_y, d_w, d_h; +} Image; +#define ImageCreate(x, y, w, h, s_x, s_y, s_w, s_h) (Image) { s_x, s_y, s_w, s_h, image_update, x, y, w, h } +bool image_update(SDL_Renderer* renderer, struct _Component* component); + +typedef bool (*ButtonCallback)(struct _Component* component); +typedef struct +{ + COMPONENT_BODY; + float d_x, d_y, d_w, d_h; + ButtonCallback cb; + bool clicked; +} Button; +#define ButtonCreate(x, y, w, h, cb, s_x, s_y, s_w, s_h) (Button) { s_x, s_y, s_w, s_h, button_update, x, y, w, h, cb, false } +bool button_update(SDL_Renderer* renderer, struct _Component* component); + +typedef struct +{ + COMPONENT_BODY; + float d_x, d_y, d_w, d_h; + ButtonCallback cb; + bool clicked, reverse; + bool* value; +} ToggleButton; +#define TButtonCreate(x, y, w, h, cb, pointer, reverse, s_x, s_y, s_w, s_h) (ToggleButton) { s_x, s_y, s_w, s_h, tbutton_update, x, y, w, h, cb, false, reverse, pointer } +bool tbutton_update(SDL_Renderer* renderer, struct _Component* component); + +typedef struct +{ + COMPONENT_BODY; + float d_x, d_y, d_w, d_h; + ButtonCallback cb; + bool clicked; + PeerData peer; +} PlayerButton; + +typedef struct +{ + COMPONENT_BODY; + bool clicked; + ButtonCallback cb; + float scroll, target_scroll; +} MapList; +#define MapListCreate(x, y, w, h, cb) (MapList) { x, y, w, h, maplist_update, false, cb, 0, 0 } +bool maplist_update(SDL_Renderer* renderer, struct _Component* component); + +typedef struct +{ + COMPONENT_BODY; + bool clicked; + int preset; + Label label; +} MapListPreset; +#define MapListPresetCreate(x, y, w, h) (MapListPreset) { x, y, w, h, mappreset_update, false, 0 } +bool mappreset_update(SDL_Renderer* renderer, struct _Component* component); + +typedef struct +{ + COMPONENT_BODY; + bool clicked; + int preset; + Label label; +} PingLimit; +#define PingLimitCreate(x, y, w, h) (PingLimit) { x, y, w, h, ping_update, false, 0 } +bool ping_update(SDL_Renderer* renderer, struct _Component* component); + +typedef struct +{ + COMPONENT_BODY; + bool clicked; + PeerData peers[7]; +} PlayerList; + +#define PlayerListCreate(x, y) (PlayerList) { x, y, 144, 176, playerlist_update, false, {0} } +bool playerlist_update(SDL_Renderer* renderer, struct _Component* component); + +typedef struct +{ + COMPONENT_BODY; + float d_x, d_y, d_w, d_h; + ButtonCallback cb; + bool clicked; + + const char* collection; + cJSON* root; + const char* key; +} DeleteButton; + +typedef struct +{ + COMPONENT_BODY; + bool clicked; + int page; +} PlayerListConfig; +#define PlayerListConfigCreate(x, y, update) (PlayerListConfig) { x, y, 144, 176, update, false, 0 } +bool playerlist_bans_update(SDL_Renderer* renderer, struct _Component* component); +bool playerlist_op_update(SDL_Renderer* renderer, struct _Component* component); + +#endif diff --git a/disasterserver_c/ui/Image.c b/disasterserver_c/ui/Image.c new file mode 100644 index 0000000..56338cb --- /dev/null +++ b/disasterserver_c/ui/Image.c @@ -0,0 +1,12 @@ +#include + +bool image_update(SDL_Renderer* renderer, struct _Component* component) +{ + Image* image = (Image*)component; + + SDL_FRect src = { image->x, image->y, image->w, image->h }; + SDL_FRect dst = { image->d_x * INTERFACE_SCALE, image->d_y * INTERFACE_SCALE, image->d_w * INTERFACE_SCALE, image->d_h * INTERFACE_SCALE }; + SDL_RenderTexture(renderer, g_textureSheet, &src, &dst); + + return true; +} diff --git a/disasterserver_c/ui/Label.c b/disasterserver_c/ui/Label.c new file mode 100644 index 0000000..b3209b3 --- /dev/null +++ b/disasterserver_c/ui/Label.c @@ -0,0 +1,185 @@ +#include +#include + +bool label_update(SDL_Renderer* renderer, struct _Component* component) +{ + Label* label = (Label*)component; + float x = label->x; + float y = label->y; + SDL_Color clr = COLOR_WHITE; + + for (int i = 0; i < utf8_strlen(label->text); i++) + { + utf8_char c = utf8_tolower(utf8_get(label->text, i)); + + int ind; + switch (c) + { + case '\n': + x = label->x; + y += 8; + continue; + + case ' ': + x += 5; + continue; + + case ' ': + x += 10; + continue; + + case '-': + case '_': + ind = 26; + break; + + case ',': + ind = 27; + break; + + case '1': + ind = 28; + break; + + case '2': + ind = 29; + break; + + case '3': + ind = 30; + break; + + case '4': + ind = 31; + break; + + case '5': + ind = 32; + break; + + case '6': + ind = 33; + break; + + case '7': + ind = 34; + break; + + case '8': + ind = 35; + break; + + case '9': + ind = 36; + break; + + case '0': + ind = 37; + break; + + case '!': + case '.': + ind = 38; + break; + + case '\'': + ind = 39; + break; + + case ':': + ind = 40; + break; + + case '(': + case '[': + case '<': + ind = 41; + break; + + case ')': + case ']': + case '>': + ind = 42; + break; + + case '%': + ind = 43; + break; + + case '+': + ind = 77; + break; + + case '\\': + clr = COLOR_RED; + continue; + + case '@': + clr = COLOR_GRN; + continue; + + case '&': + clr = COLOR_PUR; + continue; + + case '/': + clr = COLOR_BLU; + continue; + + case '|': + clr = COLOR_GRA; + continue; + + case '`': + clr = COLOR_YLW; + continue; + + case '~': + clr = COLOR_WHITE; + continue; + + case 0x2116: + clr = COLOR_ORG; + continue; + + default: + if(c >= 'a' && c <= 'z') + ind = c - 97; + else if(c >= 0x0430 && c <= 0x044F) + ind = c - 0x0430 + 45; + else + ind = 44; + break; + } + + SDL_SetTextureColorMod(g_textureSheet, clr.r, clr.g, clr.b); + SDL_FRect src = { 480 + ind * 8, 432, 8, 6 }; + SDL_FRect dst = { x * label->scale, y * label->scale, 8 * label->scale, 6 * label->scale }; + SDL_RenderTexture(renderer, g_textureSheet, &src, &dst); + x += 6; + + switch (c) + { + case 'w': + case 'm': + case 'x': + case 'n': + case 0x043C: + case 0x0434: + case 0x0438: + case 0x0439: + case 0x044E: + case 0x044C: + case 0x043B: + case 0x0448: + case 0x0449: + case 0x0446: + case 0x0436: + x += 2; + break; + } + } + + SDL_SetTextureColorMod(g_textureSheet, 255, 255, 255); + return true; +} diff --git a/disasterserver_c/ui/Main.c b/disasterserver_c/ui/Main.c new file mode 100644 index 0000000..61c30e4 --- /dev/null +++ b/disasterserver_c/ui/Main.c @@ -0,0 +1,594 @@ +#include "Config.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +int lobby = 0; +enum +{ + UST_MAIN, + UST_OPTIONS, + UST_PLAYERS, + UST_INFO +} state; +char text_buffer[40][256]; +char info_text[1024]; +int text_index = 0; +int text_length = 0; +int g_mouseWheel = 0; +int g_pmouseWheel = 0; + +void init_info(); +bool main_menu(Component* component); +bool options_menu(Component* component); +bool players_menu(Component* component); +bool info_menu(Component* component); + +bool back_to_lobby(Component* component); +bool practice_mode(Component* component); +bool force_exe_win(Component* component); +bool force_surv_win(Component* component); + +bool map_list_changed(Component* component); +bool map_list_reset(Component* component); + +Component* main_components[] = +{ + (Component*)&(ImageCreate(0, 0, 480, 270, 0, 272, 480, 270)), + (Component*)&(ImageCreate(16, 48, 276, 176, 128, 0, 272, 176)), + (Component*)&(ImageCreate(199, 10, 64, 16, 1829, 0, 64, 16)), + + (Component*)&(ButtonCreate(59, 249, 32, 8, main_menu, 480, 400, 32, 8)), + (Component*)&(ButtonCreate(150, 249, 54, 8, options_menu, 480, 408, 54, 8)), + (Component*)&(ButtonCreate(268, 249, 53, 8, players_menu, 480, 416, 53, 8)), + (Component*)&(ButtonCreate(386, 249, 29, 8, info_menu, 480, 424, 29, 8)), + + (Component*)&(ButtonCreate(320, 106, 128, 20, back_to_lobby, 400, 0, 128, 20)), + (Component*)&(ButtonCreate(320, 136, 128, 20, practice_mode, 400 + 256, 0, 128, 20)), + (Component*)&(ButtonCreate(320, 166, 128, 20, force_exe_win, 400 + 512, 0, 128, 20)), + (Component*)&(ButtonCreate(320, 196, 128, 20, force_surv_win, 400 + 512 + 256, 0, 128, 20)), +}; + +Component* options_components[] = +{ + (Component*)&(MapListCreate(0, 38, 288, 195, map_list_changed)), + (Component*)&(ImageCreate(0, 0, 480, 270, 2256, 0, 480, 270)), + (Component*)&(ImageCreate(184, 10, 103, 16, 1925, 0, 103, 16)), + + (Component*)&(ButtonCreate(59, 249, 32, 8, main_menu, 480, 400, 32, 8)), + (Component*)&(ButtonCreate(150, 249, 54, 8, options_menu, 480, 408, 54, 8)), + (Component*)&(ButtonCreate(268, 249, 53, 8, players_menu, 480, 416, 53, 8)), + (Component*)&(ButtonCreate(386, 249, 29, 8, info_menu, 480, 424, 29, 8)), + + (Component*)&(MapListPresetCreate(320, 48, 128, 40)), + (Component*)&(ButtonCreate(320, 96, 128, 20, map_list_reset, 3540, 0, 128, 20)), + (Component*)&(PingLimitCreate(320, 125, 128, 40)), + (Component*)&(TButtonCreate(320, 172, 128, 20, (ButtonCallback)config_save, &g_config.anticheat, true, 3120, 0, 128, 20)), + (Component*)&(TButtonCreate(320, 200, 128, 20, (ButtonCallback)config_save, &g_config.pride, false, 2736, 0, 128, 20)), +}; + +Component* players_components[] = +{ + (Component*)&(ImageCreate(0, 0, 480, 270, 0, 272, 480, 270)), + (Component*)&(ImageCreate(179, 10, 112, 16, 2032, 0, 112, 16)), + + (Component*)&(PlayerListCreate(16, 48)), + (Component*)&(PlayerListConfigCreate(168, 48, playerlist_op_update)), + (Component*)&(PlayerListConfigCreate(320, 48, playerlist_bans_update)), + + (Component*)&(ButtonCreate(59, 249, 32, 8, main_menu, 480, 400, 32, 8)), + (Component*)&(ButtonCreate(150, 249, 54, 8, options_menu, 480, 408, 54, 8)), + (Component*)&(ButtonCreate(268, 249, 53, 8, players_menu, 480, 416, 53, 8)), + (Component*)&(ButtonCreate(386, 249, 29, 8, info_menu, 480, 424, 29, 8)), +}; + +Component* info_components[] = +{ + (Component*)&(ImageCreate(0, 0, 480, 270, 0, 272, 480, 270)), + (Component*)&(ImageCreate(208, 10, 55, 16, 2172, 0, 55, 16)), + (Component*)&(LabelCreate(4, 38 + 4, info_text, 2)), + + (Component*)&(ButtonCreate(59, 249, 32, 8, main_menu, 480, 400, 32, 8)), + (Component*)&(ButtonCreate(150, 249, 54, 8, options_menu, 480, 408, 54, 8)), + (Component*)&(ButtonCreate(268, 249, 53, 8, players_menu, 480, 416, 53, 8)), + (Component*)&(ButtonCreate(386, 249, 29, 8, info_menu, 480, 424, 29, 8)), +}; + +void log_msg(const char* type, const char* message) +{ + char msg[512]; + + if (strcmp(type, DEBUG_TYPE) == 0) + snprintf(msg, 512, "|%s~", message); + else if (strcmp(type, WARN_TYPE) == 0) + snprintf(msg, 512, "`%s~", message); + else if (strcmp(type, ERROR_TYPE) == 0) + snprintf(msg, 512, "\\%s~", message); + else + snprintf(msg, 512, "~%s", message); + + if (text_length > 39) + { + for (int i = 1; i < 40; i++) + strncpy(text_buffer[i - 1], text_buffer[i], 255); + } + + strncpy(text_buffer[text_index], msg, 255); + + if (text_index < 39) + text_index++; + + if (text_length < 40) + text_length++; +} + +int server_loop(void) +{ + if (!disaster_init()) + return 1; + + return disaster_run(); +} + +int console_loop(void) +{ + SDL_Quit(); + +#ifdef WIN32 + AllocConsole(); + (void)freopen("CONOUT$", "w", stdout); +#endif + + return server_loop(); +} + +int main(int argc, char** argv) +{ + if (argc > 1) + { + for (int i = 1; i < argc; i++) + { + if (strcmp(argv[i], "--nogui") == 0) + return console_loop(); + } + } + + if (!SDL_Init(SDL_INIT_VIDEO)) + { + char msg[1024]; + snprintf(msg, 1024, "%s\n\nPress OK to fallback to console mode.", SDL_GetError()); + + SDL_ShowSimpleMessageBox(SDL_MESSAGEBOX_ERROR, "Error (Report to dev)", msg, NULL); + return console_loop(); + } + + SDL_Window* window = SDL_CreateWindow("DisasterServer v" STRINGIFY(BUILD_VERSION) " (Modified)", 480 * INTERFACE_SCALE, 270 * INTERFACE_SCALE, 0); + if (window == NULL) + { + char msg[1024]; + snprintf(msg, 1024, "%s\n\nPress OK to fallback to console mode.", SDL_GetError()); + + SDL_ShowSimpleMessageBox(SDL_MESSAGEBOX_ERROR, "Error (Report to dev)", msg, NULL); + return console_loop(); + } + + SDL_Renderer *renderer = SDL_CreateRenderer(window, NULL); + + if (renderer == NULL) + { + char msg[1024]; + snprintf(msg, 1024, "%s\n\nPress OK to fallback to console mode.", SDL_GetError()); + + SDL_ShowSimpleMessageBox(SDL_MESSAGEBOX_ERROR, "Error (Report to dev)", msg, NULL); + return console_loop(); + } + + SDL_SetDefaultTextureScaleMode(renderer, SDL_SCALEMODE_NEAREST); + + if (!resources_load(renderer)) + return console_loop(); + + init_info(); + log_hook(log_msg); + SDL_SetRenderLogicalPresentation(renderer, 480 * INTERFACE_SCALE, 270 * INTERFACE_SCALE, SDL_LOGICAL_PRESENTATION_INTEGER_SCALE); + SDL_SetRenderVSync(renderer, true); + + Label label; + Thread thr; + ThreadSpawn(thr, server_loop, NULL); + + bool running = true; + float bg = 0; + + while (running) + { + SDL_Event ev; + while (SDL_PollEvent(&ev)) + { + switch (ev.type) + { + case SDL_EVENT_QUIT: + running = false; + break; + + case SDL_EVENT_MOUSE_WHEEL: + g_mouseWheel = ev.wheel.y; + break; + } + } + + SDL_RenderClear(renderer); + { + SDL_FRect src = { 480 + ((int)bg / 3 % 28) * 96, 446, 96, 96 }; + for(int i = 0; i < 6 * INTERFACE_SCALE; i++) + { + for(int j = 0; j < 3 * INTERFACE_SCALE; j++) + { + SDL_FRect dst = { -((int)bg / 2 % 96) + i * 96, j * 96, 96, 96 }; + SDL_RenderTexture(renderer, g_textureSheet, &src, &dst); + } + } + + switch (state) + { + case UST_MAIN: + { + for (int i = 0; i < sizeof(main_components) / sizeof(Component*); i++) + main_components[i]->update(renderer, main_components[i]); + + for (int i = 0; i < text_length; i++) + { + label = LabelCreate(23 * 2, 55 * 2 + i * 8, text_buffer[i], 1); + label.update(renderer, (Component*)&label); + } + + break; + } + + case UST_OPTIONS: + { + for (int i = 0; i < sizeof(options_components) / sizeof(Component*); i++) + options_components[i]->update(renderer, options_components[i]); + + break; + } + + case UST_PLAYERS: + { + for (int i = 0; i < sizeof(players_components) / sizeof(Component*); i++) + players_components[i]->update(renderer, players_components[i]); + + break; + } + + case UST_INFO: + { + for (int i = 0; i < sizeof(info_components) / sizeof(Component*); i++) + info_components[i]->update(renderer, info_components[i]); + + break; + } + } + + g_mouseWheel = 0; + bg += 0.64; + } + SDL_RenderPresent(renderer); + SDL_Delay(32); + } + + return 0; +} + +void init_info() +{ + char compiler[128]; + + #ifdef __clang__ + snprintf(compiler, 128, "clang %d.%d.%d\n", __clang_major__, __clang_minor__, __clang_patchlevel__); + #elif defined(__GNUC__) + snprintf(compiler, 128, "gcc %d.%d.%d\n", __GNUC__, __GNUC_MINOR__, __GNUC_PATCHLEVEL__); + #elif defined(_MSC_VER) + snprintf(compiler, 128, "msvc %d", _MSC_VER); + #else + snprintf(compiler, 128, "unknown"); + #endif + + + snprintf(info_text, 1024, INFO_TEXT, compiler, SDL_MAJOR_VERSION, SDL_MINOR_VERSION, SDL_MICRO_VERSION, SDL_IMAGE_MAJOR_VERSION, SDL_IMAGE_MINOR_VERSION, SDL_IMAGE_MICRO_VERSION); +} + +bool main_menu(Component* component) +{ + state = UST_MAIN; + return true; +} + +bool options_menu(Component* component) +{ + state = UST_OPTIONS; + return true; +} + +bool players_menu(Component* component) +{ + state = UST_PLAYERS; + return true; +} + +bool info_menu(Component* component) +{ + state = UST_INFO; + return true; +} + +bool back_to_lobby(Component* component) +{ + Server* server = disaster_get(lobby); + + if(!server) + { + SDL_ShowSimpleMessageBox(SDL_MESSAGEBOX_ERROR, "Error (Report to dev)", "Server is not running (Check logs in Info tab)!", NULL); + return false; + } + + MutexLock(server->state_lock); + { + if(server->state != ST_LOBBY && !lobby_init(server)) + SDL_ShowSimpleMessageBox(SDL_MESSAGEBOX_ERROR, "Error (Report to dev)", "Failed to return to lobby: lobby_init() returned FALSE", NULL); + } + MutexUnlock(server->state_lock); + return true; +} + +bool practice_mode(Component* component) +{ + Server* server = disaster_get(lobby); + + if(!server) + { + SDL_ShowSimpleMessageBox(SDL_MESSAGEBOX_ERROR, "Error (Report to dev)", "Server is not running (Check logs in Info tab)!", NULL); + return false; + } + + MutexLock(server->state_lock); + { + if(server->state == ST_LOBBY && server_ingame(server) > 1) + { + if(!charselect_init(20, server)) + { + SDL_ShowSimpleMessageBox(SDL_MESSAGEBOX_ERROR, "Error (Report to dev)", "Failed to set practice mode: charselect_init() returned FALSE", NULL); + } + } + } + MutexUnlock(server->state_lock); + + return true; +} + +bool force_exe_win(Component* component) +{ + Server* server = disaster_get(lobby); + + if(!server) + { + SDL_ShowSimpleMessageBox(SDL_MESSAGEBOX_ERROR, "Error (Report to dev)", "Server is not running (Check logs in Info tab)!", NULL); + return false; + } + + MutexLock(server->state_lock); + { + if(server->state == ST_GAME) + { + if(!game_end(server, ED_EXEWIN, false)) + { + SDL_ShowSimpleMessageBox(SDL_MESSAGEBOX_ERROR, "Error (Report to dev)", "Failed to set exe win: game_end() returned FALSE", NULL); + } + } + } + MutexUnlock(server->state_lock); + + return true; +} + +bool force_surv_win(Component* component) +{ + Server* server = disaster_get(lobby); + + if(!server) + { + SDL_ShowSimpleMessageBox(SDL_MESSAGEBOX_ERROR, "Error (Report to dev)", "Server is not running (Check logs in Info tab)!", NULL); + return false; + } + + MutexLock(server->state_lock); + { + if(server->state == ST_GAME) + { + if(!game_end(server, ED_SURVWIN, false)) + { + SDL_ShowSimpleMessageBox(SDL_MESSAGEBOX_ERROR, "Error (Report to dev)", "Failed to set surv win: game_end() returned FALSE", NULL); + } + } + } + MutexUnlock(server->state_lock); + + return true; +} + +bool map_list_changed(Component* component) +{ + MapListPreset* preset_list = (MapListPreset*)options_components[7]; + preset_list->preset = PRESET_CUSTOM; + + for (int i = 0; i < PRESET_COUNT; i++) + { + if (memcmp(g_config.map_list, g_defaultPresets[i].values, sizeof(g_config.map_list)) == 0) + { + preset_list->preset = i; + break; + } + } + + return true; +} + +bool map_list_reset(Component* component) +{ + MapListPreset* preset_list = (MapListPreset*)options_components[7]; + preset_list->preset = PRESET_CUSTOM; + + MutexLock(g_config.map_list_lock); + memset(g_config.map_list, 0, sizeof(g_config.map_list)); + MutexUnlock(g_config.map_list_lock); + return true; +} + +void ui_update_playerlist(Server* server) +{ + if(!server) // just in case + return; + + if(server->id != 0) // we only update 0 server + return; + + PlayerList* list = (PlayerList*)players_components[2]; + for(size_t i = 0; i < server->peers.capacity; i++) + { + PeerData* player = (PeerData*)server->peers.ptr[i]; + if(!player) + { + memset(&list->peers[i], 0, sizeof(list->peers[i])); + continue; + } + + memcpy(&list->peers[i], server->peers.ptr[i], sizeof(list->peers[i])); + } +} + +bool ui_update_delete(Component* component) +{ + DeleteButton* delete = (DeleteButton*)component; + if (cJSON_HasObjectItem(delete->root, delete->key)) + { + cJSON_DeleteItemFromObject(delete->root, delete->key); + + if (!collection_save(delete->collection, delete->root)) + SDL_ShowSimpleMessageBox(SDL_MESSAGEBOX_ERROR, "Error (Report to dev)", "Failed to save collection!", NULL); + } + return false; +} + +bool ui_button_op(struct _Component* component) +{ + PlayerButton* button = (PlayerButton*)component; + Server* server = disaster_get(lobby); + + bool res = true; + MutexLock(server->state_lock); + { + for(size_t i = 0; i < server->peers.capacity; i++) + { + PeerData* peer = (PeerData*)server->peers.ptr[i]; + if(!peer) + continue; + + if(peer->id != button->peer.id) + continue; + + if(strcmp(peer->nickname.value, button->peer.nickname.value) != 0) + continue; + + if(strcmp(peer->udid.value, button->peer.udid.value) != 0) + continue; + + if (peer->op) + break; + + peer->op = true; + + server_send_msg(server, peer->peer, CLRCODE_GRN "you're an operator now"); + res = op_add(peer->nickname.value, peer->ip.value); + } + } + MutexUnlock(server->state_lock); + + RAssert(res); + return false; +} + +bool ui_button_kick(struct _Component* component) +{ + PlayerButton* button = (PlayerButton*)component; + Server* server = disaster_get(lobby); + + bool res = true; + MutexLock(server->state_lock); + { + for(size_t i = 0; i < server->peers.capacity; i++) + { + PeerData* peer = (PeerData*)server->peers.ptr[i]; + if(!peer) + continue; + + if(peer->id != button->peer.id) + continue; + + if(strcmp(peer->nickname.value, button->peer.nickname.value) != 0) + continue; + + if(strcmp(peer->udid.value, button->peer.udid.value) != 0) + continue; + + server_disconnect(server, peer->peer, DR_KICKEDBYHOST, NULL); + res = timeout_set(peer->nickname.value, peer->udid.value, peer->ip.value, time(NULL) + 5); + } + } + MutexUnlock(server->state_lock); + + RAssert(res); + return false; +} + +bool ui_button_ban(struct _Component* component) +{ + PlayerButton* button = (PlayerButton*)component; + Server* server = disaster_get(lobby); + + bool res = true; + MutexLock(server->state_lock); + { + for(size_t i = 0; i < server->peers.capacity; i++) + { + PeerData* peer = (PeerData*)server->peers.ptr[i]; + if(!peer) + continue; + + if(peer->id != button->peer.id) + continue; + + if(strcmp(peer->nickname.value, button->peer.nickname.value) != 0) + continue; + + if(strcmp(peer->udid.value, button->peer.udid.value) != 0) + continue; + + server_disconnect(server, peer->peer, DR_BANNEDBYHOST, NULL); + res = ban_add(peer->nickname.value, peer->udid.value, peer->ip.value); + } + } + MutexUnlock(server->state_lock); + + RAssert(res); + return false; +} \ No newline at end of file diff --git a/disasterserver_c/ui/Main.h b/disasterserver_c/ui/Main.h new file mode 100644 index 0000000..7d37926 --- /dev/null +++ b/disasterserver_c/ui/Main.h @@ -0,0 +1,15 @@ +#ifndef MAIN_H +#define MAIN_H +#include +#include +#include + +void ui_update_playerlist(Server* server); + +bool ui_update_delete(struct _Component* component); + +bool ui_button_op(struct _Component* component); +bool ui_button_kick(struct _Component* component); +bool ui_button_ban(struct _Component* component); + +#endif \ No newline at end of file diff --git a/disasterserver_c/ui/MapList.c b/disasterserver_c/ui/MapList.c new file mode 100644 index 0000000..534862b --- /dev/null +++ b/disasterserver_c/ui/MapList.c @@ -0,0 +1,77 @@ +#include +#include +#include +#include +#include + +const int low_bound = -(MAP_COUNT/4 * 124 - 124/2 - 194); + +bool maplist_update(SDL_Renderer* renderer, struct _Component* component) +{ + MapList* list = (MapList*)component; + SDL_Rect bounds = { list->x * INTERFACE_SCALE, list->y * INTERFACE_SCALE, list->w * INTERFACE_SCALE, list->h * INTERFACE_SCALE }; + + float mouse_x, mouse_y; + float scale_x, scale_y; + Uint32 flags = SDL_GetMouseState(&mouse_x, &mouse_y); + SDL_GetRenderScale(renderer, &scale_x, &scale_y); + + mouse_x /= scale_x; + mouse_y /= scale_y; + + bool mouse_down = false; + if(flags & SDL_BUTTON_MASK(1)) + { + if(!list->clicked) + { + mouse_down = true; + list->clicked = true; + } + } + else + list->clicked = false; + + bool in_bounds = mouse_x >= bounds.x && mouse_y >= bounds.y && mouse_x < bounds.x + bounds.w && mouse_y < bounds.y + bounds.h; + if(in_bounds) + { + list->target_scroll += g_mouseWheel * 45; + if(list->target_scroll >= 0) + list->target_scroll = 0; + + if(list->target_scroll < low_bound) + list->target_scroll = low_bound; + } + + list->scroll = lerp(list->scroll, list->target_scroll, 0.30); + + MutexLock(g_config.map_list_lock); + for(int i = 0; i < MAP_COUNT; i++) + { + SDL_FRect src = { 0, 272, 123, 104 }; + SDL_FRect dst = { 8 + i % 4 * 143, 90 + i / 4 * 124 + list->scroll, 123, 104 }; + + src.x = 480 + i * src.w; + + if(in_bounds && mouse_x >= dst.x && mouse_y >= dst.y && mouse_x < dst.x + dst.w && mouse_y < dst.y + dst.h) + { + dst.y -= 2; + + if (mouse_down) + { + g_config.map_list[i] = !g_config.map_list[i]; + list->cb(component); + } + + if(flags & SDL_BUTTON_MASK(1)) + dst.y += 2; + } + + const Uint8 color = g_config.map_list[i] ? 255 : 96; + SDL_SetTextureColorMod(g_textureSheet, color, color, color); + SDL_RenderTexture(renderer, g_textureSheet, &src, &dst); + } + MutexUnlock(g_config.map_list_lock); + + SDL_SetTextureColorMod(g_textureSheet, 255, 255, 255); + return true; +} diff --git a/disasterserver_c/ui/MapListPreset.c b/disasterserver_c/ui/MapListPreset.c new file mode 100644 index 0000000..b4ed18e --- /dev/null +++ b/disasterserver_c/ui/MapListPreset.c @@ -0,0 +1,71 @@ +#include +#include + +bool mappreset_update(SDL_Renderer* renderer, struct _Component* component) +{ + MapListPreset* list = (MapListPreset*)component; + SDL_FRect src = { 4016, 0, 128, 40 }; + SDL_FRect dst = { list->x * INTERFACE_SCALE, list->y * INTERFACE_SCALE, list->w * INTERFACE_SCALE, list->h * INTERFACE_SCALE }; + + float mouse_x, mouse_y; + float scale_x, scale_y; + Uint32 flags = SDL_GetMouseState(&mouse_x, &mouse_y); + SDL_GetRenderScale(renderer, &scale_x, &scale_y); + + bool mouse_down = false; + if (flags & SDL_BUTTON_MASK(1)) + { + if (!list->clicked) + { + mouse_down = true; + list->clicked = true; + } + } + else + list->clicked = false; + + mouse_x /= scale_x; + mouse_y /= scale_y; + + if (mouse_x >= dst.x && mouse_y >= dst.y && mouse_x < dst.x + dst.w && mouse_y < dst.y + dst.h) + { + src.x += src.w; + + SDL_FRect arrow_src = { 1680, 0, 116, 32 }; + SDL_FRect arrow_dst = { dst.x, dst.y, 116 * INTERFACE_SCALE, 32 * INTERFACE_SCALE }; + + if (mouse_down) + { + arrow_dst.y += 2; + + MutexLock(g_config.map_list_lock); + { + if (mouse_x < dst.x + dst.w / 2) + { + if (--list->preset < 0) + list->preset = PRESET_COUNT - 2; + } + else + { + if (++list->preset >= PRESET_COUNT - 1) + list->preset = 0; + } + + memcpy(g_config.map_list, g_defaultPresets[list->preset].values, sizeof(g_config.map_list)); + } + MutexUnlock(g_config.map_list_lock); + } + + SDL_RenderTexture(renderer, g_textureSheet, &src, &dst); + SDL_RenderTexture(renderer, g_textureSheet, &arrow_src, &arrow_dst); + } + else + SDL_RenderTexture(renderer, g_textureSheet, &src, &dst); + + list->label.scale = INTERFACE_SCALE; + list->label.x = dst.x / INTERFACE_SCALE + 8; + list->label.y = dst.y / INTERFACE_SCALE + 25; + list->label.text = g_defaultPresets[list->preset].name; + label_update(renderer, (Component*)&list->label); + return true; +} \ No newline at end of file diff --git a/disasterserver_c/ui/PingPreset.c b/disasterserver_c/ui/PingPreset.c new file mode 100644 index 0000000..53aa53c --- /dev/null +++ b/disasterserver_c/ui/PingPreset.c @@ -0,0 +1,113 @@ +#include "Colors.h" +#include +#include + +bool ping_update(SDL_Renderer* renderer, struct _Component* component) +{ + PingLimit* list = (PingLimit*)component; + SDL_FRect src = { 4272, 0, 128, 40 }; + SDL_FRect dst = { list->x * INTERFACE_SCALE, list->y * INTERFACE_SCALE, list->w * INTERFACE_SCALE, list->h * INTERFACE_SCALE }; + + float mouse_x, mouse_y; + float scale_x, scale_y; + Uint32 flags = SDL_GetMouseState(&mouse_x, &mouse_y); + SDL_GetRenderScale(renderer, &scale_x, &scale_y); + + bool mouse_down = false; + if (flags & SDL_BUTTON_MASK(1)) + { + if (!list->clicked) + { + mouse_down = true; + list->clicked = true; + } + } + else + list->clicked = false; + + mouse_x /= scale_x; + mouse_y /= scale_y; + + if (mouse_x >= dst.x && mouse_y >= dst.y && mouse_x < dst.x + dst.w && mouse_y < dst.y + dst.h) + { + src.x += src.w; + + SDL_FRect arrow_src = { 1680, 0, 116, 32 }; + SDL_FRect arrow_dst = { dst.x, dst.y, 116 * INTERFACE_SCALE, 32 * INTERFACE_SCALE }; + + const char* text; + + if (mouse_down) + { + arrow_dst.y += 2; + + if (mouse_x < dst.x + dst.w / 2) + { + if (--list->preset < 0) + list->preset = PING_PRESET_COUNT - 1; + } + else + { + if (++list->preset >= PING_PRESET_COUNT) + list->preset = 0; + } + + g_config.ping_limit = g_defaultPingPresets[list->preset]; + config_save(); + } + + SDL_RenderTexture(renderer, g_textureSheet, &src, &dst); + SDL_RenderTexture(renderer, g_textureSheet, &arrow_src, &arrow_dst); + } + else + SDL_RenderTexture(renderer, g_textureSheet, &src, &dst); + + char* name; + switch (g_config.ping_limit) + { + case 80: + name = CLRCODE_RED "very strict"; + list->preset = 0; + break; + + case 120: + name = CLRCODE_YLW "strict"; + list->preset = 1; + break; + + case 180: + name = "forgiving"; + list->preset = 2; + break; + + case 250: + name = CLRCODE_GRN "defualt"; + list->preset = 3; + break; + + case UINT16_MAX: + name = CLRCODE_PUR "unlimited"; + list->preset = 4; + break; + + default: + name = "custom"; + list->preset = 0; + break; + } + + list->label.scale = INTERFACE_SCALE; + list->label.x = dst.x / INTERFACE_SCALE + 8; + list->label.y = dst.y / INTERFACE_SCALE + 25; + + char value[128]; + + if(list->preset == 4) + snprintf(value, 128, "%s", name); + else + snprintf(value, 128, "%s - " CLRCODE_RST "%d", name, g_config.ping_limit); + + list->label.text = value; + label_update(renderer, (Component*)&list->label); + return true; +} \ No newline at end of file diff --git a/disasterserver_c/ui/PlayerList.c b/disasterserver_c/ui/PlayerList.c new file mode 100644 index 0000000..6d88aa2 --- /dev/null +++ b/disasterserver_c/ui/PlayerList.c @@ -0,0 +1,261 @@ +#include "Config.h" +#include "cJSON.h" +#include "io/Threads.h" +#include +#include +#include +#include +#include + +bool playerlist_update(SDL_Renderer* renderer, struct _Component* component) +{ + PlayerList* list = (PlayerList*)component; + SDL_FRect src = { 4528, 0, 144, 176 }; + SDL_FRect dst = { list->x * INTERFACE_SCALE, list->y * INTERFACE_SCALE, list->w * INTERFACE_SCALE, list->h * INTERFACE_SCALE }; + + SDL_Point mouse; + float scale_x, scale_y; + float mo_x = 0; + float mo_y = 0; + + Uint32 flags = SDL_GetMouseState(&mo_x, &mo_y); + mouse.x = mo_x; + mouse.y = mo_y; + + SDL_GetRenderScale(renderer, &scale_x, &scale_y); + + mouse.x /= scale_x; + mouse.y /= scale_y; + + if (!(flags & SDL_BUTTON_MASK(1))) + list->clicked = false; + + SDL_RenderTexture(renderer, g_textureSheet, &src, &dst); + + SDL_FRect title_src = { 4672, 0, 80, 8 }; + SDL_FRect title_dst = { (list->x + 32) * INTERFACE_SCALE, (list->y + 6) * INTERFACE_SCALE, 80 * INTERFACE_SCALE, 8 * INTERFACE_SCALE }; + SDL_RenderTexture(renderer, g_textureSheet, &title_src, &title_dst); + + Label label = LabelCreate(list->x + 8, list->y + 8, "", INTERFACE_SCALE); + PlayerButton op = (PlayerButton){ 4672, 16, 15, 8, button_update, list->x + 20 * 2, list->y - 2 + 8, 15, 8, ui_button_op, 0, { 0 } }; + PlayerButton kick = (PlayerButton){ 4672, 24, 29, 8, button_update, list->x + 31 * 2, list->y - 2 + 8, 29, 8, ui_button_kick, 0, { 0 } }; + PlayerButton ban = (PlayerButton){ 4672, 32, 24, 8, button_update, list->x + 49 * 2, list->y - 2 + 8, 24, 8, ui_button_ban, 0, { 0 } }; + + for(int i = 0; i < 7; i++) + { + if(list->peers[i].nickname.len == 0) + continue; + + label.y += 8 * INTERFACE_SCALE; + op.d_y += 8 * INTERFACE_SCALE; + kick.d_y += 8 * INTERFACE_SCALE; + ban.d_y += 8 * INTERFACE_SCALE; + + SDL_Rect check = (SDL_Rect){ (label.x - 2) * INTERFACE_SCALE, (label.y - 4) * INTERFACE_SCALE, 132 * INTERFACE_SCALE, 12 * INTERFACE_SCALE }; + char text[128]; + + if(!list->clicked && SDL_PointInRect(&mouse, &check)) + { + SDL_SetRenderDrawColor(renderer, 73, 0, 0, 255); + SDL_FRect fcheck = { check.x, check.y, check.w, check.h }; + SDL_RenderFillRect(renderer, &fcheck); + + snprintf(text, 128, "%s", "..."); + op.peer = list->peers[i]; + kick.peer = list->peers[i]; + ban.peer = list->peers[i]; + + if (!op.update(renderer, (Component*)&op) || !kick.update(renderer, (Component*)&kick) || !ban.update(renderer, (Component*)&ban)) + { + list->clicked = true; + break; + } + } + else + snprintf(text, 128, "%s", list->peers[i].nickname.value); + + SDL_SetRenderDrawColor(renderer, 255, 255, 255, 255); + label.text = text; + label.update(renderer, (Component*)&label); + } + + return true; +} + +bool playerlist_bans_update(SDL_Renderer* renderer, struct _Component* component) +{ + PlayerListConfig* list = (PlayerListConfig*)component; + SDL_FRect src = { 4528, 0, 144, 176 }; + SDL_FRect dst = { list->x * INTERFACE_SCALE, list->y * INTERFACE_SCALE, list->w * INTERFACE_SCALE, list->h * INTERFACE_SCALE }; + + SDL_FPoint mouse; + float scale_x, scale_y; + + float mo_x = 0; + float mo_y = 0; + Uint32 flags = SDL_GetMouseState(&mo_x, &mo_y); + mouse.x = mo_x; + mouse.y = mo_y; + SDL_GetRenderScale(renderer, &scale_x, &scale_y); + + mouse.x /= scale_x; + mouse.y /= scale_y; + + if (!(flags & SDL_BUTTON_MASK(1))) + list->clicked = false; + + SDL_RenderTexture(renderer, g_textureSheet, &src, &dst); + + SDL_FRect title_src = { 4763, 0, 58, 8 }; + SDL_FRect title_dst = { (list->x + 42) * INTERFACE_SCALE, (list->y + 6) * INTERFACE_SCALE, 58 * INTERFACE_SCALE, 8 * INTERFACE_SCALE }; + SDL_RenderTexture(renderer, g_textureSheet, &title_src, &title_dst); + + Label label = LabelCreate(list->x + 8, list->y + 8, "", INTERFACE_SCALE); + DeleteButton delete = (DeleteButton){ 4672, 40, 43, 8, button_update, list->x + 20 * 2, list->y - 2 + 8, 43, 8, ui_update_delete, false, BANS_FILE, g_bans, NULL }; + + MutexLock(g_banMut); + { + if (SDL_PointInRectFloat(&mouse, &dst)) + { + list->page -= g_mouseWheel; + list->page = SDL_clamp(list->page, 0, SDL_max((int)ceil(cJSON_GetArraySize(g_bans) / 9.0) - 1, 0)); + } + + size_t i = 0; + for(cJSON* ban = g_bans->child; ban; ban = ban->next) + { + if (!ban) + continue; + + if (i < list->page * 9) + { + i++; + continue; + } + else if (i >= list->page * 9 + 9) + break; + + label.y += 8 * INTERFACE_SCALE; + delete.d_y += 8 * INTERFACE_SCALE; + + SDL_FRect check = (SDL_FRect){ (label.x - 2) * INTERFACE_SCALE, (label.y - 4) * INTERFACE_SCALE, 132 * INTERFACE_SCALE, 12 * INTERFACE_SCALE }; + + if(!list->clicked && SDL_PointInRectFloat(&mouse, &check)) + { + SDL_SetRenderDrawColor(renderer, 73, 0, 0, 255); + SDL_RenderFillRect(renderer, &check); + SDL_SetRenderDrawColor(renderer, 255, 255, 255, 255); + + label.text = "..."; + label.update(renderer, (Component*)&label); + + delete.key = ban->string; + if (!delete.update(renderer, (Component*)&delete)) + { + list->clicked = true; + break; + } + } + else + { + char text[128]; + snprintf(text, 128, "%s" CLRCODE_RST " (%s)", cJSON_GetStringValue(ban), strstr(ban->string, "-") != NULL ? "udid" : "ip"); + SDL_SetRenderDrawColor(renderer, 255, 255, 255, 255); + + label.text = text; + label.update(renderer, (Component*)&label); + } + + i++; + } + } + MutexUnlock(g_banMut); + + return true; +} + +bool playerlist_op_update(SDL_Renderer* renderer, struct _Component* component) +{ + PlayerListConfig* list = (PlayerListConfig*)component; + SDL_FRect src = { 4528, 0, 144, 176 }; + SDL_FRect dst = { list->x * INTERFACE_SCALE, list->y * INTERFACE_SCALE, list->w * INTERFACE_SCALE, list->h * INTERFACE_SCALE }; + + SDL_FPoint mouse; + float scale_x, scale_y; + Uint32 flags = SDL_GetMouseState(&mouse.x, &mouse.y); + + SDL_GetRenderScale(renderer, &scale_x, &scale_y); + + mouse.x /= scale_x; + mouse.y /= scale_y; + + if (!(flags & SDL_BUTTON_MASK(1))) + list->clicked = false; + + SDL_RenderTexture(renderer, g_textureSheet, &src, &dst); + + SDL_FRect title_src = { 4672, 8, 96, 8 }; // Operator list + SDL_FRect title_dst = { (list->x + 24) * INTERFACE_SCALE, (list->y + 6) * INTERFACE_SCALE, 96 * INTERFACE_SCALE, 8 * INTERFACE_SCALE }; + SDL_RenderTexture(renderer, g_textureSheet, &title_src, &title_dst); + + Label label = LabelCreate(list->x + 8, list->y + 8, "", INTERFACE_SCALE); + DeleteButton delete = (DeleteButton){ 4672, 40, 43, 8, button_update, list->x + 20 * 2, list->y - 2 + 8, 43, 8, ui_update_delete, false, OPERATORS_FILE, g_ops, NULL }; + + MutexLock(g_opMut); + { + if (SDL_PointInRectFloat(&mouse, &dst)) + { + list->page -= g_mouseWheel; + list->page = SDL_clamp(list->page, 0, SDL_max((int)ceil(cJSON_GetArraySize(g_ops) / 9.0) - 1, 0)); + } + + size_t i = 0; + for (cJSON* op = g_ops->child; op; op = op->next) + { + if (!op) + continue; + + if (i < list->page * 9) + { + i++; + continue; + } + else if (i >= list->page * 9 + 9) + break; + + label.y += 8 * INTERFACE_SCALE; + delete.d_y += 8 * INTERFACE_SCALE; + + SDL_FRect check = { (label.x - 2) * INTERFACE_SCALE, (label.y - 4) * INTERFACE_SCALE, 132 * INTERFACE_SCALE, 12 * INTERFACE_SCALE }; + char text[128]; + + if(!list->clicked && SDL_PointInRectFloat(&mouse, &check)) + { + SDL_SetRenderDrawColor(renderer, 73, 0, 0, 255); + SDL_RenderFillRect(renderer, &check); + SDL_SetRenderDrawColor(renderer, 255, 255, 255, 255); + + label.text = "..."; + label.update(renderer, (Component*)&label); + + delete.key = op->string; + if (!delete.update(renderer, (Component*)&delete)) + { + list->clicked = true; + break; + } + } + else + { + SDL_SetRenderDrawColor(renderer, 255, 255, 255, 255); + label.text = cJSON_GetStringValue(op); + label.update(renderer, (Component*)&label); + } + + i++; + } + } + MutexUnlock(g_opMut); + + return true; +} \ No newline at end of file diff --git a/disasterserver_c/ui/Presets.c b/disasterserver_c/ui/Presets.c new file mode 100644 index 0000000..4763568 --- /dev/null +++ b/disasterserver_c/ui/Presets.c @@ -0,0 +1,16 @@ +#include + +Preset g_defaultPresets[] = +{ + { "default", { true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true } }, + { "classic", { false, false, true, false, true, false, true, true, true, false, false, false, true, false, true, false, false, false, false, false } }, + { "easy", { true, false, true, false, false, false, false, false, false, false, false, false, false, false, false, false, true, true, false, true } }, + { "medium", { false, true, false, true, true, false, false, true, false, false, false, true, true, false, true, false, false, false, false, false } }, + { "hard", { false, false, false, false, false, true, true, false, false, true, false, false, false, false, false, true, false, false, true, false } }, + { "madness", { false, false, false, false, false, false, false, false, true, false, true, false, false, true, false, false, false, false, false, false } }, + { "nightmare universe", { false, true, false, true, false, false, false, false, false, true, true, false, false, false, false, false, false, false, false, false } }, + { "spirits of hell", { true, false, false, false, false, true, false, false, false, false, false, true, false, true, false, false, false, false, false, false } }, + { "custom", { 0 } }, +}; + +int g_defaultPingPresets[] = { 80, 120, 180, 250, UINT16_MAX }; \ No newline at end of file diff --git a/disasterserver_c/ui/Presets.h b/disasterserver_c/ui/Presets.h new file mode 100644 index 0000000..1a87eb1 --- /dev/null +++ b/disasterserver_c/ui/Presets.h @@ -0,0 +1,19 @@ +#ifndef PRESETS_H +#define PRESETS_H +#include +#include + +typedef struct +{ + const char* name; + const bool values[MAP_COUNT]; +} Preset; + +extern Preset g_defaultPresets[]; +#define PRESET_COUNT 9 +#define PRESET_CUSTOM 8 + +extern int g_defaultPingPresets[]; +#define PING_PRESET_COUNT 5 + +#endif \ No newline at end of file diff --git a/disasterserver_c/ui/Resources.c b/disasterserver_c/ui/Resources.c new file mode 100644 index 0000000..30a6e07 --- /dev/null +++ b/disasterserver_c/ui/Resources.c @@ -0,0 +1,31 @@ +#include +#include +#include + +// Resources +#include + +SDL_Texture* g_textureSheet = NULL; +SDL_Texture* texture_load(SDL_Renderer* renderer, const void* data, unsigned int length) +{ + SDL_IOStream* rw = SDL_IOFromConstMem(data, (int)length); + SDL_Surface* img = IMG_Load_IO(rw, 0); + if (!img) + return NULL; + + SDL_Texture* texture = SDL_CreateTextureFromSurface(renderer, img); + SDL_DestroySurface(img); + + return texture; +} + +bool resources_load(SDL_Renderer* renderer) +{ + if (!(g_textureSheet = texture_load(renderer, Spritesheet_png, Spritesheet_png_len))) + { + SDL_ShowSimpleMessageBox(SDL_MESSAGEBOX_ERROR, "SDL ERROR", SDL_GetError(), NULL); + SDL_ShowSimpleMessageBox(SDL_MESSAGEBOX_ERROR, "Error (Report to dev)", "Failed to load " "g_textureSheet" "!\nPress OK to fallback to console mode.", NULL); + return 0; + } + return true; +} diff --git a/disasterserver_c/ui/Resources.h b/disasterserver_c/ui/Resources.h new file mode 100644 index 0000000..d82dd23 --- /dev/null +++ b/disasterserver_c/ui/Resources.h @@ -0,0 +1,17 @@ +#ifndef RESOURCES_H +#define RESOURCES_H +#include +#include +#include + +#define INFO_TEXT CLRCODE_PUR "disasterserverui " CLRCODE_BLU __DATE__ " " CLRCODE_GRN __TIME__ CLRCODE_RST "\n"\ +CLRCODE_RST "(c) 2024 team exe empire\n\n\n"\ +"game version: v" CLRCODE_PUR STRINGIFY(BUILD_VERSION) "\n"\ +CLRCODE_RST "compiler: " CLRCODE_PUR "%s\n"\ +CLRCODE_RST "sdl2 version: " CLRCODE_PUR "%d.%d.%d\n"\ +CLRCODE_RST "sdl2_image version: " CLRCODE_PUR "%d.%d.%d\n"\ + +extern SDL_Texture* g_textureSheet; +bool resources_load(SDL_Renderer* renderer); + +#endif diff --git a/disasterserver_c/ui/Spritesheet.h b/disasterserver_c/ui/Spritesheet.h new file mode 100644 index 0000000..4996080 --- /dev/null +++ b/disasterserver_c/ui/Spritesheet.h @@ -0,0 +1,17954 @@ +unsigned char Spritesheet_png[] = { + 0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00, 0x0d, + 0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x12, 0xd5, 0x00, 0x00, 0x02, 0x1e, + 0x08, 0x06, 0x00, 0x00, 0x00, 0xda, 0x6a, 0x37, 0xd7, 0x00, 0x00, 0x00, + 0x01, 0x73, 0x52, 0x47, 0x42, 0x00, 0xae, 0xce, 0x1c, 0xe9, 0x00, 0x00, + 0x20, 0x00, 0x49, 0x44, 0x41, 0x54, 0x78, 0x9c, 0xec, 0xdd, 0xbf, 0x8f, + 0xde, 0xe6, 0xbd, 0x20, 0xfa, 0x2f, 0x6d, 0x15, 0x0e, 0xa0, 0x62, 0x4e, + 0xc6, 0x06, 0xb6, 0x31, 0x70, 0x16, 0xeb, 0xc4, 0x19, 0x40, 0xa9, 0xa2, + 0x42, 0x85, 0x07, 0x1e, 0x18, 0x2e, 0x36, 0xe9, 0x16, 0x83, 0x53, 0xa8, + 0x11, 0x36, 0xc2, 0x36, 0xba, 0x45, 0x6e, 0xe1, 0x62, 0xff, 0x86, 0x5b, + 0x6c, 0x71, 0xb7, 0x38, 0x6a, 0x4e, 0x14, 0x47, 0x45, 0x54, 0x04, 0x03, + 0x9c, 0x6a, 0xb3, 0x85, 0x61, 0xc8, 0x90, 0x0b, 0x17, 0x3e, 0x55, 0x84, + 0x9d, 0xf8, 0x5e, 0x03, 0xe7, 0x02, 0xee, 0xae, 0xcf, 0xc4, 0x2e, 0x04, + 0xc4, 0x8d, 0xc1, 0x2d, 0x2c, 0x4a, 0x1c, 0x0e, 0x5f, 0xfe, 0xfe, 0xf9, + 0xf2, 0xf3, 0x01, 0x08, 0xbf, 0x43, 0x3e, 0x24, 0x1f, 0xf2, 0xcb, 0xe7, + 0xe1, 0x2b, 0xf2, 0xf1, 0xf7, 0x4d, 0x82, 0x4d, 0x3b, 0x38, 0x38, 0x48, + 0xe7, 0xae, 0x03, 0xb0, 0x4e, 0xdf, 0x7e, 0xfb, 0xed, 0xdc, 0x55, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xc6, 0x93, 0xcc, 0x5d, 0x01, 0xb6, 0xe1, 0xe2, + 0xe2, 0x22, 0x8d, 0x88, 0x38, 0x3c, 0x3c, 0x4c, 0xb2, 0xcf, 0x99, 0xc3, + 0xc3, 0xc3, 0x24, 0x5f, 0xa6, 0x6c, 0x59, 0x95, 0xb3, 0xb3, 0xb3, 0xf4, + 0xe4, 0xe4, 0xa4, 0x72, 0xdb, 0x65, 0xdb, 0xcf, 0xca, 0x57, 0x95, 0x79, + 0xfc, 0xf8, 0x71, 0x9c, 0x9e, 0x9e, 0xee, 0xac, 0x43, 0xfe, 0xb8, 0xea, + 0xea, 0x39, 0x87, 0xec, 0xdc, 0xe4, 0x55, 0x1d, 0x53, 0x59, 0x0c, 0xaa, + 0x14, 0x8f, 0xbb, 0x6e, 0xfd, 0xb2, 0x18, 0xed, 0x9a, 0x5f, 0x16, 0x9f, + 0xbc, 0xbe, 0xc7, 0xd6, 0x27, 0xb6, 0x65, 0xfb, 0x6e, 0xba, 0xdd, 0x5d, + 0xf5, 0xa9, 0x53, 0x77, 0xae, 0x87, 0xba, 0x06, 0xdb, 0xb4, 0xa7, 0xaa, + 0x73, 0x53, 0xb6, 0x7e, 0xfe, 0xdc, 0xb4, 0x3d, 0xfe, 0xb2, 0xfd, 0x77, + 0x5d, 0x77, 0x57, 0x9d, 0xcb, 0x34, 0x8d, 0xe7, 0xd8, 0xea, 0xda, 0x47, + 0xdf, 0xeb, 0xbb, 0x6f, 0x3c, 0xf2, 0xda, 0xb6, 0xcd, 0x99, 0x18, 0x3f, + 0x01, 0x00, 0x00, 0x00, 0x00, 0xe3, 0x59, 0xd2, 0xb3, 0xc0, 0x08, 0xcf, + 0x03, 0x81, 0xfd, 0xb5, 0xb4, 0xfe, 0x76, 0x69, 0xf6, 0xbd, 0xff, 0x5f, + 0x5a, 0xfc, 0xf7, 0xfd, 0x7c, 0x03, 0x00, 0x05, 0x07, 0x07, 0x07, 0x73, + 0x57, 0x81, 0x15, 0xfb, 0xf6, 0xdb, 0x6f, 0x93, 0x34, 0x4d, 0xaf, 0x7c, + 0x87, 0x4c, 0x92, 0x24, 0x89, 0x88, 0xc8, 0x2f, 0xdb, 0x35, 0xaf, 0xac, + 0x4c, 0x66, 0xd7, 0xb6, 0xdb, 0x6e, 0xb7, 0xac, 0x6e, 0x65, 0xba, 0xd4, + 0x65, 0xd7, 0xb2, 0xba, 0x7a, 0xd4, 0xd5, 0xa5, 0xaa, 0x6e, 0xbb, 0xb6, + 0xd1, 0x37, 0x16, 0x75, 0xfb, 0x9d, 0xe2, 0x9c, 0x5c, 0xdb, 0xb5, 0x80, + 0xed, 0xf8, 0xf9, 0xcf, 0x7f, 0x5e, 0xb9, 0xfc, 0xc6, 0x8d, 0x1b, 0xf1, + 0xf4, 0xe9, 0xd3, 0x4b, 0x7f, 0x47, 0xc4, 0x8b, 0x79, 0xd9, 0xdf, 0xd9, + 0xbc, 0xfc, 0xdf, 0x5d, 0xdd, 0xba, 0x79, 0x1c, 0x9f, 0x7d, 0xfe, 0xa4, + 0x74, 0x7e, 0x44, 0x5c, 0x59, 0x96, 0xcd, 0x6f, 0x2a, 0xbf, 0xfe, 0xd2, + 0xb7, 0xd9, 0x74, 0x9d, 0x36, 0x65, 0xe7, 0xde, 0x7f, 0x59, 0xd9, 0x3e, + 0xeb, 0x97, 0x9d, 0xfb, 0xe2, 0xfc, 0xfc, 0xb2, 0x5d, 0xd7, 0x56, 0xd5, + 0x76, 0xfb, 0xae, 0xdf, 0x77, 0xbb, 0x7d, 0x15, 0xdb, 0x66, 0xb1, 0xfd, + 0x16, 0xdb, 0x78, 0xfe, 0xef, 0x32, 0x7f, 0xfe, 0xf3, 0x9f, 0x23, 0x22, + 0xe2, 0xde, 0xbd, 0x7b, 0xa5, 0xcb, 0xf3, 0xc7, 0xfb, 0xde, 0xbb, 0xef, + 0xc7, 0xc7, 0x9f, 0x7c, 0x14, 0xef, 0xbd, 0xfb, 0x7e, 0x44, 0xc4, 0xa5, + 0xcf, 0x99, 0x6c, 0x5e, 0xd9, 0xb2, 0x36, 0x65, 0x76, 0xe9, 0xb3, 0x6e, + 0x9b, 0xf5, 0xcb, 0xca, 0x7d, 0xfc, 0xc9, 0x47, 0x2f, 0x96, 0x77, 0xd9, + 0xf7, 0x98, 0xfb, 0xaf, 0x2b, 0xbf, 0xeb, 0xda, 0xbb, 0x7f, 0xff, 0x7e, + 0x44, 0x44, 0x7c, 0xf2, 0xa3, 0x5f, 0x94, 0x2e, 0x7f, 0xe3, 0xfa, 0x5f, + 0x5f, 0x7c, 0x3e, 0x7a, 0xfb, 0xd5, 0x38, 0xff, 0xe2, 0xfb, 0x38, 0x7a, + 0xfb, 0xd5, 0x88, 0x88, 0x4b, 0x9f, 0x33, 0xd9, 0xbc, 0xb2, 0x65, 0x6d, + 0xca, 0xec, 0xd2, 0x67, 0xdd, 0x36, 0xeb, 0x97, 0x95, 0x3b, 0xff, 0xe2, + 0xfb, 0x17, 0xcb, 0xbb, 0xec, 0x7b, 0xcc, 0xfd, 0xd7, 0x95, 0xff, 0xfa, + 0xd9, 0x8f, 0x4b, 0xf7, 0xf3, 0xee, 0xdf, 0xfe, 0x25, 0x22, 0xb4, 0xff, + 0x26, 0xe5, 0xb4, 0x7f, 0xed, 0x3f, 0xa3, 0xfd, 0x6b, 0xff, 0x5d, 0x68, + 0xff, 0xda, 0xbf, 0xf6, 0xaf, 0xfd, 0x6b, 0xff, 0xda, 0xbf, 0xf6, 0xaf, + 0xfd, 0x0f, 0xb5, 0x7f, 0xed, 0x7f, 0xd8, 0xf5, 0xb7, 0xd6, 0xfe, 0x61, + 0x6c, 0x67, 0x67, 0x67, 0xb5, 0x83, 0x27, 0x9b, 0x94, 0xd9, 0xe5, 0xe4, + 0xe4, 0x24, 0x1e, 0x3f, 0x7e, 0xdc, 0x75, 0xf5, 0xda, 0x6d, 0xaf, 0xd5, + 0xae, 0xa4, 0x50, 0x17, 0x17, 0x17, 0x69, 0x55, 0xb2, 0xaa, 0xbc, 0xba, + 0x44, 0x44, 0xc5, 0xed, 0x34, 0x4d, 0xb2, 0xd5, 0x37, 0x01, 0xd4, 0x10, + 0xc7, 0xd6, 0x25, 0xb6, 0xf9, 0x64, 0x41, 0x65, 0x49, 0x82, 0xb2, 0xe5, + 0x17, 0x17, 0x17, 0x69, 0xdb, 0x24, 0x42, 0x6d, 0xcf, 0xf5, 0x58, 0x9a, + 0xb6, 0xa7, 0xb2, 0xa4, 0x67, 0x4d, 0x13, 0x6a, 0xed, 0xda, 0x5e, 0x9f, + 0x7a, 0x77, 0x39, 0x7f, 0x63, 0xc6, 0x73, 0x6e, 0x7d, 0xfb, 0xae, 0xae, + 0xf1, 0x18, 0xa2, 0x6d, 0x02, 0x00, 0xfb, 0xcb, 0xf3, 0xc7, 0xfa, 0x72, + 0x9e, 0x3f, 0x7a, 0xfe, 0x98, 0xd9, 0xb7, 0xe7, 0x8f, 0xaf, 0xfd, 0xfa, + 0x57, 0xe5, 0x15, 0xf9, 0xe5, 0x37, 0x2f, 0x3f, 0xff, 0x43, 0x44, 0xfc, + 0xf1, 0xf9, 0x7f, 0xa3, 0xf0, 0x39, 0x0a, 0xf3, 0xca, 0x96, 0xb5, 0x29, + 0xb3, 0x4b, 0x9f, 0x75, 0xdb, 0xac, 0x5f, 0x56, 0xee, 0x8f, 0xb9, 0xe5, + 0x5d, 0xf6, 0x3d, 0xe6, 0xfe, 0xeb, 0xca, 0xff, 0xe9, 0xef, 0x4a, 0x77, + 0xf3, 0xdd, 0xef, 0xfe, 0x47, 0x44, 0xe8, 0xff, 0x9b, 0x94, 0xd3, 0xff, + 0xeb, 0xff, 0x33, 0xfa, 0xff, 0xd0, 0xff, 0x77, 0xb1, 0xd0, 0xfe, 0x7f, + 0x69, 0xdc, 0x8f, 0xea, 0xcb, 0xb9, 0x1f, 0xb9, 0x1f, 0x65, 0xf6, 0xed, + 0x7e, 0x34, 0x65, 0xfb, 0xdf, 0x55, 0x6e, 0xcc, 0xeb, 0x9b, 0x6a, 0x6b, + 0x6b, 0xff, 0xd9, 0xe7, 0xcc, 0xda, 0xc6, 0xfb, 0xb8, 0xdf, 0xd6, 0x97, + 0x73, 0xbf, 0x5d, 0x4e, 0x7b, 0x73, 0xbf, 0x5d, 0xef, 0xfd, 0x56, 0xfb, + 0xd7, 0xfe, 0xb5, 0xff, 0x65, 0xb5, 0x7f, 0xf9, 0x4b, 0x86, 0xdd, 0xe6, + 0x96, 0xf2, 0x57, 0xec, 0x4a, 0x8e, 0x94, 0xa6, 0x69, 0xda, 0x26, 0x61, + 0xd4, 0x9a, 0x55, 0x25, 0x88, 0x1a, 0x4b, 0x3e, 0x31, 0x55, 0x76, 0xae, + 0x97, 0x14, 0x8b, 0x3e, 0xe7, 0x64, 0x13, 0x17, 0x0d, 0xbb, 0x1d, 0x1c, + 0x1c, 0xa4, 0x3f, 0xff, 0xf9, 0xcf, 0xe3, 0xbf, 0xfc, 0xe7, 0xf2, 0x2f, + 0xa6, 0x4b, 0x71, 0xe7, 0xee, 0xed, 0x78, 0xf8, 0xe0, 0x51, 0xdc, 0xb9, + 0x7b, 0x3b, 0x22, 0x22, 0x1e, 0x3e, 0x78, 0xf4, 0x62, 0x7e, 0x26, 0xbf, + 0xbc, 0xa9, 0xb5, 0x6c, 0x93, 0x76, 0x8a, 0xe7, 0xb8, 0x18, 0x87, 0x6c, + 0x79, 0x36, 0x3f, 0x53, 0x5c, 0xde, 0x75, 0xfd, 0xa1, 0xeb, 0xb5, 0x34, + 0xff, 0xf4, 0xe1, 0xfd, 0xf8, 0xf3, 0x9f, 0xff, 0x1c, 0xdf, 0x7e, 0xfb, + 0x6d, 0xdc, 0xbb, 0x77, 0xcf, 0x03, 0xd7, 0x8d, 0xc9, 0xc7, 0xfc, 0x93, + 0x1f, 0xfd, 0x62, 0xb1, 0x0f, 0x5c, 0x19, 0x47, 0x3e, 0xe6, 0xda, 0xff, + 0xf6, 0x68, 0xff, 0xdb, 0xa6, 0xfd, 0x6f, 0x9b, 0xf6, 0xbf, 0x6d, 0xda, + 0xff, 0xb6, 0x69, 0xff, 0xdb, 0xa6, 0xfd, 0x6f, 0x9b, 0xf6, 0xbf, 0x6d, + 0xb9, 0x98, 0x7b, 0x87, 0xc4, 0xe8, 0xb2, 0x44, 0x2a, 0xcf, 0xff, 0x1b, + 0x17, 0x17, 0x17, 0x97, 0x96, 0x67, 0xf3, 0xca, 0x12, 0xf1, 0x1c, 0x1e, + 0x1e, 0x66, 0x1f, 0x4b, 0xaf, 0xd5, 0x7c, 0x12, 0x9f, 0x88, 0x48, 0xcb, + 0xb6, 0x9d, 0xad, 0x5f, 0xb6, 0xed, 0x6c, 0xbf, 0xf1, 0xc3, 0xaf, 0xa6, + 0x5e, 0x29, 0x13, 0xf1, 0x22, 0xd9, 0x4e, 0x69, 0x1d, 0x72, 0x09, 0x64, + 0x2a, 0xeb, 0x39, 0xb5, 0x1d, 0x89, 0x6d, 0x5e, 0x1c, 0xdb, 0xd9, 0xd9, + 0x59, 0xe4, 0xce, 0xdb, 0x95, 0xf5, 0x32, 0xb9, 0xe3, 0x2a, 0xb5, 0x6b, + 0x3b, 0xd9, 0xbe, 0xaa, 0x62, 0x1d, 0x85, 0x5f, 0xaa, 0x6d, 0x50, 0x36, + 0x19, 0xf2, 0xd8, 0x22, 0xda, 0xc5, 0x36, 0xdb, 0x6e, 0xb1, 0x8e, 0x65, + 0xf2, 0x65, 0x77, 0x25, 0x11, 0xea, 0x7b, 0xae, 0xdb, 0xb6, 0x95, 0x26, + 0xda, 0xb4, 0xa7, 0xec, 0x43, 0xd6, 0xbe, 0x1b, 0x24, 0xd4, 0xba, 0xb4, + 0xad, 0x8a, 0x6d, 0x37, 0x51, 0xd5, 0x57, 0x94, 0x2a, 0x9e, 0xbf, 0x7c, + 0x42, 0xad, 0xba, 0x6d, 0x34, 0x89, 0xe7, 0xd8, 0xea, 0xfa, 0xaf, 0xe2, + 0xf9, 0x8c, 0x68, 0x77, 0x7d, 0xf7, 0x8d, 0x47, 0x61, 0x9b, 0xad, 0xda, + 0xe6, 0x4c, 0xfc, 0x52, 0x36, 0x00, 0xcc, 0xc0, 0xf3, 0xc7, 0xed, 0xf1, + 0xfc, 0x71, 0xdb, 0xf2, 0x31, 0x7f, 0xed, 0xd7, 0xbf, 0x5a, 0x6c, 0x82, + 0x0d, 0xc6, 0x91, 0x8f, 0xb9, 0xfe, 0x7f, 0x7b, 0xf4, 0xff, 0xdb, 0xa6, + 0xff, 0xdf, 0xb6, 0x5c, 0xcc, 0x97, 0xf0, 0x0c, 0x30, 0x2f, 0x75, 0x3f, + 0xda, 0x1e, 0xf7, 0xa3, 0x6d, 0xdb, 0xf7, 0xf1, 0x50, 0xb9, 0x63, 0x5a, + 0x5a, 0x7f, 0xbb, 0x34, 0xe9, 0x3e, 0xb6, 0xff, 0x05, 0x8f, 0xf7, 0x71, + 0xbf, 0xdd, 0x20, 0xf7, 0xdb, 0x6d, 0xdb, 0xf7, 0xfb, 0x2d, 0xd5, 0xb4, + 0xff, 0x6d, 0xcb, 0x62, 0x7e, 0x70, 0x70, 0x10, 0xf2, 0x97, 0x4c, 0x97, + 0x6b, 0x64, 0xdf, 0xf2, 0x57, 0x7c, 0xf3, 0xcd, 0xcb, 0xc4, 0xfb, 0xc5, + 0xc4, 0x4e, 0x65, 0x89, 0x9e, 0xea, 0xca, 0x94, 0x25, 0x7f, 0x2a, 0x5b, + 0x3e, 0xc4, 0x76, 0xcb, 0xf4, 0xad, 0x4b, 0xd5, 0x7e, 0xba, 0xd4, 0xa7, + 0x6a, 0xfd, 0x3e, 0x7f, 0xef, 0x2a, 0xd3, 0xa5, 0xde, 0x43, 0x9f, 0x93, + 0x6b, 0xbb, 0x0a, 0xb3, 0x3d, 0x1f, 0xfc, 0xd7, 0xdf, 0x94, 0xce, 0x3f, + 0x3a, 0x3a, 0x8a, 0xf3, 0xf3, 0xf3, 0x17, 0x9f, 0x23, 0x22, 0xce, 0xcf, + 0xcf, 0x5f, 0x7c, 0x9e, 0xc2, 0x3f, 0x7d, 0x78, 0xff, 0xd2, 0x7f, 0x8b, + 0xf3, 0x77, 0xfd, 0xdd, 0x66, 0xdb, 0x4b, 0xdf, 0x26, 0xed, 0x94, 0x9d, + 0xe3, 0xfc, 0xbc, 0xb1, 0x97, 0x0f, 0x59, 0xaf, 0x31, 0xe5, 0xdb, 0x72, + 0xbe, 0x9d, 0x67, 0x9f, 0x8b, 0xfe, 0xdb, 0xff, 0xf5, 0xdf, 0x4b, 0xe7, + 0x1f, 0x1f, 0x5f, 0xce, 0x8c, 0x5a, 0x5c, 0xbf, 0xb8, 0xcd, 0x62, 0xff, + 0x51, 0xb6, 0xef, 0xbe, 0x65, 0xea, 0xd6, 0x1d, 0x7b, 0xfd, 0xb2, 0x73, + 0x98, 0x2f, 0x5f, 0xd6, 0x8f, 0x4e, 0xb9, 0xff, 0x2e, 0xe5, 0x9f, 0x3c, + 0x79, 0x12, 0xb7, 0x6e, 0x1e, 0xc7, 0xfd, 0xb8, 0x7c, 0x9d, 0xfe, 0xe6, + 0xe0, 0xa7, 0x97, 0xfe, 0xfe, 0xea, 0xd9, 0xf7, 0x97, 0xfe, 0x7e, 0xf3, + 0xfa, 0xab, 0x97, 0xe6, 0xbd, 0x79, 0xfd, 0xd5, 0xd2, 0xf2, 0xf9, 0x72, + 0x7d, 0xcb, 0xd4, 0xad, 0x3b, 0xf6, 0xfa, 0xc5, 0x73, 0x50, 0x2c, 0xff, + 0xd5, 0xb3, 0xef, 0x67, 0xdd, 0x7f, 0x97, 0xf2, 0xff, 0xfd, 0xdb, 0xff, + 0xe7, 0x87, 0x2c, 0xe0, 0x7f, 0xbb, 0x5c, 0x4e, 0xfb, 0xaf, 0x2e, 0x57, + 0x56, 0x5e, 0xfb, 0xbf, 0x5a, 0x5e, 0xfb, 0xd7, 0xfe, 0xb5, 0x7f, 0xed, + 0x7f, 0x88, 0x32, 0x75, 0xeb, 0x8e, 0xbd, 0xbe, 0xf6, 0xff, 0x92, 0xf6, + 0x7f, 0xb5, 0xbc, 0xf6, 0x7f, 0xb5, 0xbc, 0xf6, 0xaf, 0xfd, 0x6b, 0xff, + 0xda, 0xff, 0x10, 0x65, 0xea, 0xd6, 0x1d, 0x7b, 0xfd, 0x2d, 0xb5, 0x7f, + 0x18, 0xc3, 0xd9, 0xd9, 0x59, 0x6d, 0xe2, 0x92, 0xb3, 0xb3, 0xb3, 0xce, + 0xdb, 0x3f, 0x39, 0x39, 0x89, 0xc7, 0x8f, 0x1f, 0x77, 0x5e, 0xbf, 0xe9, + 0x3e, 0xd6, 0xa4, 0x24, 0x79, 0x54, 0xf6, 0xf7, 0x8b, 0x17, 0xcc, 0xa7, + 0xa7, 0xa7, 0x71, 0x76, 0x76, 0x96, 0x66, 0x09, 0x91, 0x1a, 0x6c, 0xb6, + 0xb4, 0xcc, 0xe9, 0xe9, 0x69, 0xb6, 0xbf, 0xb4, 0x50, 0x26, 0xfb, 0x5c, + 0x17, 0xff, 0xd2, 0xe4, 0x3b, 0xbb, 0x0c, 0x7d, 0x6c, 0x6d, 0x62, 0x7b, + 0x7a, 0x7a, 0x9a, 0x14, 0x13, 0x31, 0x3d, 0x4f, 0x6a, 0x74, 0x69, 0xff, + 0xcf, 0xcb, 0xe6, 0xeb, 0x59, 0x3c, 0x37, 0x75, 0xda, 0x9e, 0xeb, 0xc1, + 0x74, 0x69, 0x4f, 0xf9, 0x24, 0x5a, 0x4d, 0x13, 0x6a, 0xc5, 0x0f, 0xf5, + 0xdf, 0x15, 0xef, 0xbe, 0xc7, 0xd6, 0xe8, 0xfc, 0x4d, 0x18, 0xcf, 0xd9, + 0x0c, 0xd4, 0x77, 0x35, 0x3a, 0xd6, 0x91, 0xfa, 0x1d, 0x00, 0x60, 0x4f, + 0x79, 0xfe, 0x58, 0x5d, 0xae, 0xac, 0xbc, 0xe7, 0x8f, 0x57, 0xcb, 0x7b, + 0xfe, 0xb8, 0xce, 0xe7, 0x8f, 0xaf, 0x9d, 0xfc, 0xfd, 0xa5, 0xbf, 0xbf, + 0xfb, 0xcb, 0x77, 0x97, 0x97, 0xff, 0xec, 0xb5, 0x4b, 0xf3, 0x5e, 0xfb, + 0xd9, 0x6b, 0xa5, 0xe5, 0xf3, 0xe5, 0xfa, 0x96, 0xa9, 0x5b, 0x77, 0xec, + 0xf5, 0x8b, 0xe7, 0xa0, 0x58, 0xfe, 0xbb, 0xbf, 0x7c, 0x37, 0xeb, 0xfe, + 0x3b, 0x95, 0x7f, 0xfc, 0xff, 0x45, 0xfc, 0xf2, 0x9b, 0x88, 0xdf, 0x5d, + 0x2e, 0xa7, 0xff, 0xaf, 0x2e, 0x57, 0x56, 0x5e, 0xff, 0x7f, 0xb5, 0xbc, + 0xfe, 0x5f, 0xff, 0xaf, 0xff, 0x5f, 0x5f, 0xff, 0xbf, 0x34, 0xee, 0x47, + 0xd5, 0xe5, 0xca, 0xca, 0xbb, 0x1f, 0x5d, 0x2d, 0xef, 0x7e, 0xb4, 0xfc, + 0xfb, 0x51, 0x99, 0x31, 0xda, 0x7f, 0x9b, 0x72, 0x43, 0x95, 0xdf, 0x75, + 0x7d, 0x53, 0x6d, 0x2d, 0xed, 0xbf, 0x68, 0xad, 0xe3, 0x7d, 0xdc, 0x6f, + 0xab, 0xcb, 0x95, 0x95, 0x77, 0xbf, 0xbd, 0x5a, 0xde, 0xfd, 0x76, 0xf9, + 0xf7, 0x5b, 0xe3, 0x8f, 0xb5, 0x7f, 0xed, 0xbf, 0xf9, 0x71, 0xe4, 0xed, + 0x6b, 0xfb, 0x97, 0xbf, 0x64, 0xb8, 0x6d, 0xb6, 0xd9, 0x5f, 0x71, 0xde, + 0x5a, 0xf3, 0x57, 0x34, 0x51, 0x4c, 0xec, 0x34, 0x94, 0xba, 0xed, 0xf6, + 0x4d, 0x68, 0xd5, 0xa5, 0x1e, 0x4b, 0xdf, 0xcf, 0x58, 0xb1, 0xa8, 0xda, + 0xcf, 0x98, 0xe7, 0x84, 0x3d, 0x71, 0x70, 0x70, 0x90, 0x1e, 0x1f, 0x1f, + 0xa7, 0xbf, 0xff, 0xed, 0x1f, 0xd2, 0xd7, 0x5f, 0x7f, 0x3d, 0x1b, 0x2c, + 0x6c, 0x32, 0x99, 0x4c, 0x57, 0xa6, 0xd7, 0x5f, 0x7f, 0x3d, 0xfd, 0xfd, + 0x6f, 0xff, 0x90, 0x1e, 0x1f, 0x1f, 0xa7, 0x07, 0x07, 0x07, 0x69, 0x44, + 0xa4, 0xf7, 0xee, 0xdd, 0x4b, 0x23, 0x22, 0x3d, 0x3e, 0x3e, 0x9e, 0xbd, + 0x7e, 0xa6, 0xf1, 0xe3, 0x9f, 0x8f, 0x79, 0x44, 0xa4, 0x9f, 0xfc, 0xe8, + 0x17, 0x69, 0x44, 0xa4, 0xbf, 0x39, 0xf8, 0xe9, 0xec, 0xf5, 0x33, 0x8d, + 0x3b, 0xfd, 0xa7, 0x6b, 0xff, 0xe1, 0x52, 0xcc, 0xf3, 0xd7, 0x82, 0xf6, + 0xbf, 0xff, 0x93, 0xf6, 0xbf, 0xed, 0x49, 0xfb, 0xdf, 0xf6, 0xa4, 0xfd, + 0x6f, 0x7b, 0xd2, 0xfe, 0xb7, 0x3d, 0x69, 0xff, 0xdb, 0x9e, 0xb4, 0xff, + 0x6d, 0x4f, 0xda, 0xff, 0xb6, 0xa7, 0x92, 0xf6, 0x0f, 0xa3, 0xca, 0x27, + 0x5a, 0xc9, 0x3e, 0x5f, 0x5c, 0x5c, 0xa4, 0xc5, 0x29, 0x9e, 0x5f, 0x8f, + 0x3b, 0xe6, 0x97, 0x5e, 0xab, 0x59, 0x72, 0x96, 0xe7, 0x7f, 0xa6, 0x11, + 0xb1, 0x6b, 0xbb, 0x3b, 0xb7, 0x5d, 0x58, 0xff, 0x45, 0x99, 0x6c, 0xdb, + 0xf9, 0xbf, 0xcb, 0xea, 0xd1, 0xa4, 0x9e, 0x53, 0x2a, 0xd6, 0xbb, 0xae, + 0x5e, 0xb9, 0x63, 0x7b, 0xf1, 0x77, 0x9b, 0xf5, 0x73, 0x31, 0xa8, 0x3c, + 0x3f, 0x55, 0xe7, 0xbc, 0x69, 0xd9, 0xa1, 0x8e, 0xad, 0x6f, 0x6c, 0x8b, + 0xeb, 0x97, 0x24, 0x13, 0xca, 0x6b, 0x75, 0x6e, 0xaa, 0x8e, 0xa7, 0x78, + 0xae, 0xdb, 0xae, 0x5f, 0xa7, 0x6d, 0x7b, 0x2a, 0x3b, 0xd6, 0x62, 0xf9, + 0xdc, 0xb9, 0xbd, 0xb2, 0x6e, 0xdf, 0xfa, 0x0f, 0x75, 0xad, 0x0e, 0x15, + 0xcf, 0xb1, 0xd5, 0xb5, 0x8f, 0xbe, 0xd7, 0x77, 0x9f, 0x78, 0xf4, 0x6d, + 0x9b, 0x33, 0x99, 0xfd, 0x3b, 0x99, 0xc9, 0x64, 0x32, 0x99, 0x4c, 0x5b, + 0x9c, 0x3c, 0x7f, 0xdc, 0xce, 0xe4, 0xf9, 0xe3, 0xb6, 0xa7, 0xb2, 0xf7, + 0x0f, 0xaf, 0xfd, 0xfa, 0x57, 0x3f, 0xfc, 0xf7, 0xe4, 0xef, 0x67, 0xaf, + 0x9f, 0x69, 0xe4, 0xe9, 0xdf, 0xfd, 0xbb, 0x4b, 0x31, 0x8f, 0xd0, 0xff, + 0x6f, 0x69, 0xd2, 0xff, 0x6f, 0x7b, 0xd2, 0xff, 0x6f, 0x7c, 0xba, 0xda, + 0xff, 0x2f, 0x4d, 0xfa, 0xfb, 0xdf, 0xfe, 0x21, 0x8d, 0x70, 0x3f, 0xda, + 0xc2, 0x94, 0xc5, 0x38, 0x8b, 0x79, 0x44, 0xa4, 0xff, 0xeb, 0x8d, 0x7f, + 0x9f, 0x46, 0xb8, 0x1f, 0x6d, 0x61, 0xca, 0x62, 0x9c, 0xc5, 0x3c, 0x62, + 0xbf, 0xbe, 0x8f, 0x96, 0x7c, 0xdf, 0xa2, 0xda, 0x5e, 0x7d, 0x1f, 0x5d, + 0xc1, 0x78, 0x9f, 0xbd, 0x6a, 0x6f, 0xa6, 0xea, 0xc9, 0xbf, 0xff, 0xb6, + 0x3d, 0x19, 0x7f, 0xbc, 0xed, 0x49, 0xfb, 0xdf, 0xf6, 0x54, 0x6c, 0xff, + 0xf2, 0x97, 0x98, 0xda, 0x4c, 0xc5, 0xfc, 0x15, 0x79, 0x11, 0x11, 0x55, + 0x7f, 0x97, 0x29, 0x5b, 0xa7, 0xa8, 0x6c, 0x79, 0xdb, 0xed, 0xd6, 0xed, + 0xa3, 0x6a, 0x5f, 0x4d, 0x96, 0x37, 0xd9, 0x57, 0xd3, 0x3a, 0x34, 0xad, + 0x5b, 0xd3, 0xe3, 0x6d, 0xb2, 0xbc, 0xaa, 0x4e, 0x53, 0x9f, 0x93, 0x57, + 0xba, 0x9c, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0xbf, 0x4c, 0xf9, + 0xeb, 0x3e, 0x2c, 0x4f, 0xf1, 0x57, 0xa3, 0x60, 0x4c, 0x85, 0xa4, 0x29, + 0x4d, 0x5e, 0xe6, 0xb6, 0x7a, 0xe1, 0x7b, 0x72, 0x72, 0x12, 0x8f, 0x1f, + 0x3f, 0x6e, 0x55, 0xa7, 0xa6, 0x4e, 0x4f, 0x4f, 0xaf, 0xec, 0x6b, 0x0d, + 0xda, 0xd6, 0xf3, 0xf0, 0xf0, 0x30, 0x79, 0xbe, 0x4e, 0xeb, 0x97, 0xed, + 0x67, 0x67, 0x67, 0xe9, 0xc9, 0xc9, 0x49, 0x1c, 0x1e, 0x1e, 0x26, 0x11, + 0x31, 0xfa, 0xaf, 0x40, 0x0d, 0x75, 0x6c, 0x7d, 0x63, 0x7b, 0x7a, 0x7a, + 0x9a, 0x14, 0xaf, 0xbb, 0x8a, 0x44, 0x4c, 0x49, 0x6e, 0xea, 0x6c, 0x8a, + 0x73, 0x3d, 0x40, 0x7b, 0xba, 0x52, 0xaf, 0xe2, 0xb9, 0x2e, 0x2b, 0x33, + 0x85, 0xaa, 0xf3, 0x37, 0x47, 0x3c, 0xc7, 0x34, 0x47, 0xdf, 0x35, 0x65, + 0xbf, 0x03, 0x00, 0x00, 0x00, 0x00, 0xd0, 0xc5, 0x67, 0x9f, 0x3f, 0x99, + 0xbb, 0x0a, 0x4c, 0x2c, 0x1f, 0xf3, 0xaf, 0x9f, 0xfd, 0x78, 0xc6, 0x9a, + 0x30, 0x07, 0x31, 0x07, 0x18, 0x97, 0xf1, 0x87, 0xdb, 0x66, 0xfc, 0xe1, + 0xb6, 0x69, 0xff, 0xdb, 0xa6, 0xfd, 0x33, 0x97, 0x24, 0x49, 0x46, 0x19, + 0xaf, 0xd7, 0x64, 0xbb, 0x49, 0xce, 0x58, 0x75, 0x18, 0x73, 0xfb, 0x43, + 0x9b, 0xa2, 0x9e, 0x5d, 0xcf, 0x89, 0xa4, 0x5a, 0x00, 0x74, 0x76, 0xeb, + 0xe6, 0x71, 0xaf, 0xf5, 0xd3, 0x34, 0x2d, 0x9d, 0xea, 0xca, 0x34, 0x5d, + 0x5e, 0x9c, 0xb7, 0x6b, 0x1b, 0x75, 0xf5, 0xd9, 0xb5, 0xcd, 0xaa, 0x6d, + 0xed, 0xaa, 0x43, 0x93, 0x7d, 0x36, 0x3d, 0x3f, 0x6d, 0x96, 0x37, 0xa9, + 0x4b, 0x13, 0xf9, 0x98, 0xbf, 0x71, 0xfd, 0xaf, 0x9d, 0xb7, 0x53, 0xac, + 0x8f, 0xf8, 0xaf, 0x23, 0xfe, 0xf9, 0x98, 0x77, 0x69, 0xff, 0x7d, 0x8f, + 0x69, 0x57, 0x99, 0xa6, 0xcb, 0xeb, 0x62, 0xdc, 0x35, 0xf6, 0x4d, 0xea, + 0x5d, 0x75, 0x2e, 0xea, 0xe6, 0x8f, 0x79, 0x9d, 0xb4, 0xd1, 0xb7, 0xfd, + 0x8b, 0x7f, 0x79, 0x3d, 0xeb, 0xe6, 0x2f, 0x25, 0xfe, 0x7d, 0xdb, 0x7f, + 0x9f, 0x3a, 0xb7, 0x39, 0x9e, 0x21, 0xcf, 0x47, 0xd3, 0xeb, 0xa5, 0xee, + 0xef, 0xbe, 0xd7, 0x45, 0xd3, 0xed, 0xef, 0xda, 0x46, 0xdf, 0xd8, 0x47, + 0x0c, 0x77, 0xff, 0x17, 0xff, 0x66, 0xe7, 0xa6, 0x6e, 0xd9, 0xd4, 0xf1, + 0x1f, 0xaa, 0xfd, 0xe7, 0xad, 0xe9, 0x5a, 0xe8, 0x5a, 0xdf, 0xa6, 0xc7, + 0xd3, 0xb7, 0xbe, 0x5d, 0x8e, 0xa7, 0x8d, 0x21, 0xbf, 0xff, 0x67, 0xc4, + 0x7f, 0x3d, 0xf1, 0x1f, 0xa3, 0xfd, 0xb3, 0x1e, 0x63, 0xb4, 0x7f, 0xd6, + 0x43, 0xcc, 0x99, 0x42, 0x2e, 0x89, 0x4d, 0x44, 0xc4, 0xa5, 0xcf, 0x79, + 0x87, 0x87, 0x87, 0xad, 0xb7, 0x9d, 0x25, 0xec, 0x3a, 0x3d, 0x3d, 0x4d, + 0xe2, 0x65, 0x62, 0x96, 0x41, 0x5f, 0xd6, 0x16, 0x13, 0xed, 0x9c, 0x9d, + 0x9d, 0x45, 0x44, 0xa4, 0x15, 0x09, 0x77, 0x16, 0xe9, 0xe2, 0xe2, 0xa2, + 0x2a, 0x49, 0x50, 0xe3, 0xf5, 0x8b, 0x53, 0x21, 0xbe, 0x8d, 0xb7, 0xdf, + 0x25, 0xde, 0x75, 0x75, 0x6b, 0xbb, 0x5e, 0x9f, 0xd8, 0x5e, 0x5c, 0x5c, + 0xa4, 0x2d, 0x13, 0x31, 0x35, 0xd6, 0xf7, 0x5c, 0x5f, 0x5c, 0x5c, 0x74, + 0xda, 0xef, 0x14, 0xed, 0xa9, 0xc9, 0xf6, 0x76, 0x1d, 0x7f, 0xd3, 0x73, + 0xdb, 0xe5, 0xfc, 0x8d, 0x19, 0xcf, 0xb9, 0x0c, 0xd5, 0x77, 0xf5, 0x89, + 0x47, 0xdf, 0x7e, 0x07, 0x00, 0xd8, 0x4f, 0x53, 0x3d, 0x7f, 0x1c, 0xea, + 0x79, 0xed, 0xae, 0x75, 0x76, 0x6d, 0xa3, 0xea, 0xb9, 0xed, 0xae, 0xf2, + 0x4d, 0xb7, 0xd7, 0xe5, 0x98, 0xba, 0xd6, 0x75, 0x48, 0x73, 0x3c, 0x7f, + 0x14, 0xff, 0xe5, 0xc4, 0xff, 0x52, 0xcc, 0x7f, 0xf9, 0xcd, 0x24, 0xfb, + 0x14, 0xff, 0xe5, 0xc4, 0x3f, 0x1f, 0xf3, 0x29, 0xfa, 0xff, 0x2e, 0xb1, + 0xad, 0x5b, 0x36, 0xd5, 0x76, 0xeb, 0xe6, 0xb7, 0xbd, 0x3e, 0xda, 0x5c, + 0x23, 0x63, 0x99, 0xba, 0xff, 0x17, 0xff, 0x65, 0xc5, 0x7f, 0xea, 0xfe, + 0x5f, 0xfc, 0x97, 0x15, 0xff, 0xa9, 0xee, 0xf9, 0x5d, 0x8c, 0x7d, 0x3f, + 0xaa, 0x3b, 0xdf, 0x7d, 0xe2, 0x39, 0xd4, 0xba, 0x6d, 0xeb, 0xdc, 0xf4, + 0x38, 0xdb, 0xee, 0x6b, 0x2a, 0x53, 0xde, 0x8f, 0xc4, 0x7f, 0x79, 0xf1, + 0x9f, 0xe3, 0xff, 0x87, 0x28, 0x5b, 0x56, 0xf7, 0x77, 0xd7, 0x73, 0x63, + 0x8c, 0x57, 0x73, 0x53, 0xfd, 0xff, 0x10, 0x65, 0xcb, 0xea, 0xfe, 0xee, + 0x1a, 0xff, 0x25, 0x8f, 0xf7, 0x71, 0x6d, 0x6e, 0x8f, 0xf1, 0x87, 0xdb, + 0x66, 0xfc, 0xf1, 0xb6, 0x69, 0xff, 0xdb, 0x26, 0xe6, 0x0c, 0x2d, 0x6d, + 0xf0, 0xa5, 0xb8, 0x2e, 0xc1, 0x52, 0x9a, 0x53, 0xb6, 0xcd, 0x5d, 0xfb, + 0x68, 0xbb, 0xdd, 0x26, 0x9a, 0xd6, 0x25, 0x2d, 0x68, 0xba, 0xfd, 0x3e, + 0xea, 0xf6, 0xd3, 0x34, 0xd1, 0x58, 0x97, 0xfd, 0x8e, 0x7d, 0x4e, 0x24, + 0xd5, 0x02, 0xa0, 0xb7, 0xf3, 0xf3, 0xf3, 0xde, 0xdb, 0xc8, 0xdf, 0x27, + 0xf3, 0x0f, 0x05, 0xcb, 0x34, 0x5d, 0x3e, 0xb4, 0xa1, 0xf7, 0xd7, 0x66, + 0x7b, 0x65, 0xe7, 0xa7, 0xcd, 0xf2, 0x31, 0x7d, 0xf5, 0xec, 0xfb, 0xde, + 0xdb, 0x10, 0xff, 0xea, 0xf9, 0x4b, 0x8e, 0xff, 0x10, 0xed, 0xbf, 0xae, + 0xce, 0x73, 0x5f, 0x13, 0x63, 0x5f, 0x6b, 0x55, 0xf5, 0xef, 0xba, 0xef, + 0xa9, 0xae, 0x83, 0x21, 0xda, 0xbf, 0xf8, 0xaf, 0x37, 0xfe, 0x43, 0xb4, + 0xff, 0xbc, 0xbe, 0xc7, 0x3b, 0xf5, 0x7d, 0x61, 0x6c, 0xe9, 0xc4, 0x03, + 0x05, 0xda, 0x1a, 0xa2, 0xfd, 0xe7, 0x89, 0xff, 0x65, 0x4b, 0x8f, 0xff, + 0xd0, 0xed, 0x3f, 0x6f, 0x6d, 0xd7, 0x42, 0xd7, 0x3e, 0xb9, 0x6f, 0x7d, + 0xe7, 0xbc, 0x3e, 0x86, 0x6e, 0xff, 0x79, 0xe2, 0xdf, 0x6f, 0xbb, 0x53, + 0x18, 0xb3, 0xfd, 0xb3, 0x7c, 0x63, 0xb6, 0x7f, 0x60, 0x5b, 0xb2, 0x24, + 0x3d, 0xcf, 0x0d, 0x7e, 0x63, 0x3b, 0x39, 0x39, 0x19, 0x7a, 0x93, 0x57, + 0x9c, 0x9e, 0x9e, 0xee, 0xdc, 0x67, 0xe1, 0xf8, 0xf6, 0x41, 0x3e, 0x99, + 0xd2, 0x15, 0x87, 0x87, 0x87, 0x49, 0xd9, 0xf4, 0x7c, 0x71, 0xb6, 0xde, + 0x52, 0x7f, 0x29, 0xeb, 0xca, 0xb1, 0xf5, 0x89, 0xed, 0xe1, 0xe1, 0x61, + 0x32, 0x66, 0x22, 0xa6, 0x39, 0xce, 0xf5, 0x04, 0xed, 0xa9, 0x55, 0x7d, + 0x2b, 0x8e, 0xbf, 0xd1, 0xba, 0xc5, 0xb8, 0x54, 0x9d, 0xbf, 0xb1, 0xe3, + 0x39, 0x87, 0xa1, 0xfb, 0xae, 0x3e, 0xf1, 0xa8, 0x51, 0xd9, 0xef, 0x00, + 0x00, 0xfb, 0x6b, 0xce, 0xf7, 0x0f, 0x6d, 0x9e, 0xd7, 0xd6, 0xad, 0xd3, + 0x66, 0xff, 0x7d, 0x74, 0x3d, 0xa6, 0xa5, 0x9a, 0xf3, 0xfd, 0x83, 0xf8, + 0xcf, 0xef, 0xbb, 0xbf, 0x7c, 0x37, 0xda, 0xb6, 0xc5, 0x7f, 0xf9, 0xc6, + 0xea, 0xff, 0x97, 0x32, 0x96, 0xa8, 0xeb, 0xfb, 0xff, 0x31, 0xc7, 0x14, + 0x2d, 0xe9, 0x1a, 0x19, 0xab, 0xff, 0x17, 0xff, 0x76, 0xdb, 0x9c, 0xcb, + 0x58, 0xfd, 0xbf, 0xf8, 0xb7, 0xdb, 0xe6, 0xd6, 0xbd, 0xf7, 0xee, 0xfb, + 0x11, 0x31, 0xfd, 0x78, 0x88, 0xbe, 0x63, 0x43, 0xda, 0x5c, 0x0b, 0x63, + 0x8f, 0x33, 0x5f, 0xcb, 0xd8, 0xbd, 0x2c, 0xc6, 0x59, 0xcc, 0x23, 0x22, + 0x8e, 0xde, 0x7e, 0x35, 0x22, 0xa6, 0x1f, 0x0f, 0x21, 0xfe, 0xd3, 0xcb, + 0x62, 0x9c, 0xc5, 0x3c, 0xaf, 0x69, 0xfb, 0x1f, 0x32, 0x2e, 0x2c, 0x47, + 0xd3, 0xf6, 0x2f, 0xfe, 0xc3, 0x30, 0xfe, 0x70, 0xdb, 0x8c, 0x3f, 0xdc, + 0x36, 0xed, 0x7f, 0xdb, 0xb4, 0x7f, 0xa0, 0x8d, 0x5d, 0x89, 0x99, 0xba, + 0x24, 0x6c, 0xda, 0x37, 0x53, 0x9d, 0x83, 0x35, 0x9d, 0xeb, 0x26, 0x75, + 0x95, 0x54, 0x0b, 0x80, 0xce, 0xf2, 0x2f, 0x14, 0xc6, 0x56, 0x77, 0x4f, + 0xab, 0x5b, 0x9e, 0x7f, 0x10, 0xb9, 0xab, 0x6c, 0x92, 0x24, 0x57, 0x96, + 0x95, 0xcd, 0x6b, 0xb2, 0xbf, 0xb6, 0xd6, 0xf2, 0xfd, 0xa2, 0xec, 0x25, + 0xd2, 0x14, 0xc4, 0x7f, 0x19, 0xf2, 0x31, 0xef, 0xdb, 0xfe, 0xfb, 0xc6, + 0xb4, 0xcb, 0xf2, 0xba, 0x18, 0x97, 0x2d, 0xeb, 0xb2, 0xdf, 0x5d, 0xd7, + 0x4d, 0x95, 0x26, 0x2f, 0x4b, 0x86, 0x38, 0x27, 0x5d, 0xea, 0x96, 0x19, + 0xb2, 0xfd, 0x8b, 0xff, 0x65, 0x6b, 0x88, 0xff, 0x90, 0xed, 0xbf, 0x49, + 0x9d, 0xa6, 0xb8, 0x46, 0xda, 0x9c, 0x8f, 0xaa, 0xf2, 0x75, 0xf1, 0xeb, + 0x7b, 0xee, 0x77, 0x6d, 0xb3, 0xea, 0xef, 0x26, 0xf5, 0x6a, 0x63, 0x8c, + 0xfb, 0xbf, 0xf8, 0x77, 0x37, 0x75, 0xfc, 0xc7, 0x68, 0xff, 0x79, 0x6b, + 0xba, 0x16, 0xea, 0xd6, 0xc9, 0x2f, 0x5b, 0xcb, 0xf1, 0xd4, 0x19, 0xfb, + 0xfb, 0xff, 0xda, 0xce, 0xd7, 0xd6, 0xe2, 0x3f, 0x76, 0xfb, 0x67, 0xd9, + 0xe6, 0xfa, 0xf7, 0x3f, 0xcb, 0x20, 0xe6, 0x8c, 0xed, 0xe4, 0xe4, 0x24, + 0x0a, 0x89, 0x57, 0x9a, 0xdc, 0xc0, 0x1a, 0xdd, 0xe4, 0xf2, 0x49, 0x61, + 0x2e, 0x2e, 0x2e, 0xd2, 0x8b, 0x8b, 0x8b, 0xb8, 0xb8, 0xb8, 0x68, 0x5b, + 0xc5, 0x46, 0x8a, 0x49, 0x76, 0xce, 0xce, 0xce, 0xe2, 0xc3, 0x0f, 0x3f, + 0xcc, 0x92, 0xd4, 0xac, 0x6d, 0x64, 0x6c, 0xdf, 0xfa, 0xa6, 0x3b, 0xa6, + 0x88, 0x6e, 0x49, 0x9e, 0x86, 0x7c, 0x60, 0xda, 0xfa, 0xd8, 0xfa, 0xc4, + 0x76, 0x82, 0x44, 0x4c, 0x7d, 0xcf, 0x75, 0xe3, 0x3a, 0x4c, 0xd9, 0x9e, + 0x5a, 0xd8, 0x75, 0xfc, 0x8d, 0x8e, 0xab, 0x98, 0x54, 0xea, 0xf9, 0x31, + 0xee, 0x3c, 0x7f, 0xfb, 0x98, 0x58, 0x6b, 0xe0, 0xbe, 0xab, 0x4f, 0x3c, + 0x56, 0x79, 0xfe, 0x00, 0x80, 0x71, 0x4c, 0xfd, 0xfc, 0xb1, 0xef, 0xf3, + 0xd8, 0x88, 0x61, 0xde, 0xf1, 0x66, 0x65, 0xda, 0x8c, 0x55, 0xe9, 0xf3, + 0x0c, 0xba, 0xe9, 0x33, 0xee, 0x29, 0xcc, 0xf9, 0xfc, 0x51, 0xfc, 0xe7, + 0x8f, 0xff, 0xa5, 0x98, 0xff, 0xc3, 0x24, 0xbb, 0x7c, 0x41, 0xfc, 0xe7, + 0x8f, 0x7f, 0x3e, 0xe6, 0x4b, 0x1a, 0x7f, 0xba, 0xb4, 0xed, 0x66, 0xa6, + 0x1e, 0x53, 0x34, 0xf6, 0xf1, 0x2c, 0x75, 0xfc, 0xe9, 0xd2, 0xb6, 0x9b, + 0xd9, 0xb7, 0xf8, 0xcf, 0xd5, 0xff, 0x8b, 0x7f, 0xf5, 0xf2, 0xc9, 0xee, + 0x03, 0x13, 0xdf, 0xf3, 0xbb, 0x38, 0x3a, 0x3a, 0x1a, 0x7d, 0x1f, 0x4d, + 0xee, 0xe5, 0x63, 0x8c, 0x49, 0xe9, 0xa3, 0xed, 0x35, 0x32, 0xd9, 0x77, + 0x8a, 0x0e, 0xaa, 0x62, 0xfc, 0xe6, 0xf5, 0xf1, 0xef, 0x4b, 0xe2, 0x3f, + 0xaf, 0xb2, 0x18, 0xf7, 0xf9, 0x3e, 0x3a, 0x76, 0x5c, 0xba, 0xf6, 0xcf, + 0xc6, 0x78, 0x35, 0xd7, 0xe7, 0xfb, 0xe8, 0x52, 0xe3, 0xbf, 0xe4, 0xf1, + 0x3e, 0xae, 0xcd, 0xed, 0x31, 0xfe, 0x70, 0xdb, 0x8c, 0x3f, 0xde, 0x36, + 0xed, 0x7f, 0xdb, 0xc4, 0x9c, 0xa9, 0xa5, 0xcf, 0x45, 0x44, 0x24, 0xcf, + 0xa5, 0x3b, 0x1e, 0xac, 0x55, 0x2d, 0xcb, 0xaf, 0x5f, 0xdc, 0x6e, 0xb6, + 0xac, 0xae, 0x1e, 0xc5, 0x3a, 0x95, 0xd5, 0x6d, 0xd7, 0x3a, 0x49, 0x4e, + 0xd9, 0xdf, 0x4d, 0x14, 0xeb, 0x5c, 0xac, 0x47, 0x7e, 0x79, 0xb1, 0x6c, + 0xf1, 0x3c, 0x34, 0xad, 0x57, 0x59, 0x3d, 0x9b, 0xd4, 0x3d, 0xd9, 0x61, + 0xd7, 0xb2, 0xba, 0x75, 0x76, 0x6d, 0x3b, 0x9b, 0xd7, 0x2b, 0xa9, 0x56, + 0xd5, 0x45, 0xc3, 0xf8, 0x86, 0x3a, 0xff, 0x37, 0x6e, 0xdc, 0x88, 0x88, + 0x69, 0x1e, 0x02, 0x03, 0xeb, 0x95, 0xf5, 0x11, 0x59, 0x9f, 0x31, 0xb4, + 0x26, 0x49, 0x8f, 0xea, 0x24, 0x53, 0x0f, 0xf0, 0x98, 0x50, 0xdd, 0xf9, + 0x69, 0xb3, 0x7c, 0x89, 0xc4, 0xbf, 0xda, 0xbe, 0xc7, 0x7f, 0x2c, 0x63, + 0x5d, 0x13, 0x55, 0xdb, 0xcd, 0x7e, 0x59, 0x6c, 0x89, 0xe7, 0x7c, 0xc9, + 0x75, 0x1b, 0x83, 0xf8, 0x5f, 0xb6, 0xc4, 0xba, 0x8d, 0x5d, 0xa7, 0x21, + 0x63, 0x55, 0x2c, 0xbf, 0xeb, 0xba, 0x5a, 0xda, 0x75, 0xb1, 0xa4, 0x78, + 0x17, 0x89, 0xff, 0xf8, 0x96, 0x1c, 0xff, 0xbc, 0x35, 0x5d, 0x0b, 0x75, + 0xeb, 0x34, 0xd9, 0xde, 0x98, 0xdf, 0x59, 0x97, 0xd8, 0xd7, 0xd7, 0x11, + 0xff, 0xe1, 0xac, 0x2d, 0xfe, 0xf9, 0xfa, 0x16, 0xeb, 0xde, 0x74, 0x59, + 0x9b, 0x6d, 0xee, 0x5a, 0x5e, 0xb7, 0xee, 0xae, 0xf3, 0xd9, 0x66, 0x79, + 0xd3, 0x7d, 0x75, 0x59, 0xde, 0xa4, 0x2e, 0x6d, 0x4d, 0xf1, 0x6b, 0x60, + 0xe2, 0xbf, 0xdc, 0xf8, 0x0f, 0xf9, 0x6b, 0x60, 0xe9, 0x5a, 0x3a, 0xa4, + 0x3d, 0xb5, 0xe4, 0xf3, 0x9f, 0x4f, 0xd2, 0x13, 0x23, 0x24, 0x54, 0x39, + 0x39, 0x39, 0x89, 0xc7, 0x8f, 0x1f, 0xc7, 0xe1, 0xe1, 0x61, 0x72, 0x78, + 0x78, 0x38, 0xf4, 0xe6, 0x2f, 0x39, 0x3d, 0x3d, 0xbd, 0x74, 0x53, 0x3f, + 0x39, 0x39, 0x89, 0x0f, 0x3e, 0xf8, 0x20, 0x22, 0x7e, 0x48, 0x52, 0xb3, + 0x34, 0xc5, 0x44, 0x3a, 0x75, 0x2e, 0x2e, 0x2e, 0xd2, 0x96, 0xeb, 0x24, + 0x3b, 0xa6, 0xd1, 0x0d, 0x7d, 0x6c, 0x7d, 0x63, 0x3b, 0x41, 0x22, 0xa6, + 0x49, 0xce, 0xf5, 0x94, 0xed, 0xa9, 0x83, 0xce, 0xc7, 0x9f, 0x8f, 0xc9, + 0xf3, 0x44, 0x52, 0xd9, 0xf6, 0x4a, 0xed, 0x5b, 0x62, 0xad, 0x91, 0xfa, + 0xae, 0xd2, 0x78, 0x4c, 0xd0, 0xef, 0x00, 0x00, 0x74, 0xb6, 0xc6, 0x31, + 0x26, 0x7d, 0x9e, 0x05, 0xf5, 0x7d, 0xe6, 0xb5, 0x6f, 0xc4, 0x7f, 0xb8, + 0x6d, 0xaf, 0x91, 0xf8, 0x0f, 0xb7, 0x6d, 0xf6, 0x83, 0x6b, 0x60, 0xdb, + 0xc4, 0x7f, 0xdb, 0xc4, 0x7f, 0x3d, 0xfa, 0xc6, 0x2a, 0xbf, 0x5e, 0xdb, + 0xef, 0x40, 0xae, 0x93, 0xf9, 0x89, 0xff, 0x32, 0x8d, 0x7d, 0x6e, 0x9c, + 0xfb, 0x65, 0x13, 0xff, 0xf5, 0xdb, 0x75, 0x8e, 0x87, 0x1a, 0x77, 0xd6, + 0x66, 0xff, 0x55, 0xe3, 0xc1, 0x9a, 0x2e, 0x5b, 0xd2, 0xb5, 0x32, 0xc5, + 0xf8, 0xc3, 0xbe, 0xc4, 0x7f, 0x3c, 0x43, 0x8e, 0x3f, 0xec, 0xa2, 0xee, + 0xfc, 0x34, 0x39, 0xb7, 0x65, 0x65, 0x9b, 0x6e, 0x7f, 0x57, 0x5d, 0x9a, + 0xd4, 0xb3, 0x6a, 0x9d, 0x26, 0xd7, 0x42, 0x55, 0xfd, 0xa6, 0xba, 0x46, + 0xe6, 0x6e, 0xff, 0xe2, 0x3f, 0x6f, 0xfc, 0xcb, 0xda, 0xbf, 0xfc, 0x25, + 0x34, 0x55, 0xcc, 0x5f, 0x91, 0xee, 0xb8, 0x70, 0x77, 0xcd, 0x6f, 0xba, + 0xbc, 0xc9, 0xba, 0x5d, 0xf7, 0x5d, 0x57, 0x6e, 0xcc, 0xba, 0x4f, 0xb1, + 0xbd, 0xb5, 0xeb, 0x9c, 0x54, 0xcb, 0x89, 0x5c, 0x86, 0x21, 0xe2, 0xf0, + 0xf4, 0xe9, 0xd3, 0x88, 0x98, 0xff, 0x0b, 0x0b, 0xb0, 0x6c, 0x59, 0x1f, + 0x91, 0xf5, 0x19, 0x43, 0xcb, 0x3f, 0xa0, 0xdf, 0xf5, 0x8f, 0x85, 0x3a, + 0x4b, 0x7c, 0x18, 0x30, 0x94, 0xba, 0xf3, 0x53, 0xb6, 0x7c, 0x4d, 0x03, + 0x7f, 0xc4, 0xbf, 0xda, 0x3e, 0xc6, 0xbf, 0x2e, 0x4e, 0x7d, 0x97, 0x67, + 0x65, 0xc6, 0xb8, 0x26, 0x86, 0xde, 0x6e, 0x16, 0xab, 0xa5, 0xc7, 0x6c, + 0x48, 0xe2, 0xff, 0xd2, 0x16, 0xe3, 0x3f, 0x84, 0xad, 0xdf, 0x17, 0xb6, + 0x4e, 0xfc, 0xc9, 0x2c, 0xe1, 0x5a, 0xd8, 0xd5, 0x7f, 0x77, 0x7d, 0x41, + 0x52, 0xc5, 0xf5, 0x7c, 0x99, 0xf8, 0xcf, 0x63, 0x88, 0x97, 0x5a, 0x73, + 0x1c, 0x4b, 0x55, 0x4c, 0xe6, 0xdc, 0x57, 0x97, 0x7f, 0xeb, 0x4d, 0xe5, + 0xe3, 0x4f, 0x3e, 0xba, 0x32, 0x6f, 0x88, 0x5f, 0x66, 0x15, 0xff, 0x97, + 0x96, 0x1c, 0xff, 0xf3, 0x2f, 0xfa, 0x0d, 0x6e, 0xf1, 0xfe, 0x68, 0x19, + 0x96, 0x1a, 0x87, 0x93, 0x93, 0x93, 0x38, 0x3c, 0x3c, 0xcc, 0xdf, 0x44, + 0x07, 0xfb, 0x07, 0x71, 0x96, 0xb0, 0xeb, 0x79, 0xc2, 0x98, 0xe2, 0xf1, + 0x8f, 0x72, 0x3e, 0x8a, 0xc9, 0x5f, 0xce, 0xce, 0xce, 0xe2, 0xc3, 0x0f, + 0x3f, 0xcc, 0x27, 0xea, 0x59, 0x8c, 0x62, 0x22, 0x9d, 0x2a, 0x85, 0x73, + 0xb9, 0x78, 0x63, 0x1c, 0x5b, 0xdf, 0xd8, 0xae, 0x3d, 0x11, 0xd3, 0x1c, + 0xed, 0x69, 0x2a, 0xc5, 0xd8, 0x3f, 0x4f, 0x24, 0x55, 0x79, 0x4c, 0x6b, + 0x8f, 0x67, 0xd1, 0x54, 0x7d, 0xd7, 0x3e, 0xf7, 0x3b, 0x00, 0xc0, 0xfa, + 0xf5, 0x79, 0x5e, 0xdb, 0xf4, 0x1d, 0xef, 0x94, 0xff, 0x34, 0xaf, 0x7b, + 0xbe, 0x54, 0x57, 0x76, 0x6b, 0xc4, 0x7f, 0xdb, 0xc4, 0x7f, 0x9b, 0xd6, + 0x78, 0xec, 0x63, 0x8e, 0x29, 0xda, 0xda, 0x35, 0xb2, 0xc6, 0xe3, 0x12, + 0xff, 0xe1, 0xac, 0xf1, 0xb8, 0xc4, 0x9f, 0x88, 0x76, 0xb1, 0x6a, 0xfa, + 0x1d, 0xa6, 0x49, 0xd9, 0xbe, 0x5c, 0x4b, 0xc3, 0x10, 0xff, 0x65, 0x1a, + 0x32, 0x2e, 0xac, 0x8f, 0xf8, 0x0f, 0x63, 0x89, 0x49, 0x35, 0xb2, 0x78, + 0xb5, 0x89, 0x65, 0x9f, 0xf1, 0x9e, 0x5b, 0xb9, 0x3e, 0xc6, 0x1a, 0x7f, + 0x38, 0x34, 0xf1, 0x1f, 0x47, 0xd9, 0xf8, 0xc3, 0x39, 0xdb, 0xff, 0x10, + 0xe7, 0x7d, 0xea, 0xd8, 0x55, 0x5d, 0x9b, 0x4b, 0xb7, 0xb4, 0xf6, 0x2f, + 0xfe, 0xd3, 0xca, 0xb7, 0x7f, 0xf9, 0x4b, 0x68, 0xaa, 0x2a, 0x7f, 0x45, + 0x52, 0xf3, 0x80, 0xac, 0xc9, 0xf2, 0xcc, 0x10, 0xdb, 0x2e, 0xdb, 0xd6, + 0x90, 0xdb, 0x6f, 0xab, 0xac, 0x2e, 0x65, 0x65, 0x8a, 0xe7, 0xa1, 0xcd, + 0x71, 0xec, 0x83, 0x4e, 0x49, 0xb5, 0x96, 0x3a, 0x10, 0x7f, 0xab, 0xc4, + 0x03, 0xa0, 0xde, 0x9c, 0xff, 0x23, 0xe2, 0x9c, 0xd6, 0xf8, 0xcb, 0x7a, + 0x63, 0x10, 0xff, 0x65, 0xc7, 0xbf, 0xae, 0x7e, 0x4b, 0xaf, 0x7f, 0x5e, + 0xd7, 0x73, 0x3e, 0xc5, 0x31, 0x2e, 0xf5, 0x7a, 0x10, 0xff, 0xed, 0xc6, + 0x7f, 0xa8, 0x3a, 0x75, 0x59, 0xbf, 0xed, 0xbe, 0x8b, 0xe5, 0xdb, 0x26, + 0x4b, 0x68, 0x7b, 0x9c, 0xf9, 0xed, 0x74, 0xbd, 0x6f, 0x2d, 0x29, 0xd6, + 0x65, 0xc4, 0x7f, 0xb7, 0x2d, 0xc4, 0x3f, 0x6f, 0x4d, 0xd7, 0xc2, 0xae, + 0x75, 0xe6, 0xe8, 0x63, 0xcb, 0xf6, 0xb5, 0xc4, 0xbe, 0xbe, 0x8e, 0xf8, + 0x77, 0xb3, 0x2f, 0xf1, 0x8f, 0xb8, 0x5c, 0xef, 0x21, 0x8f, 0xab, 0x6e, + 0x9b, 0xbb, 0xca, 0xd7, 0xcd, 0x6b, 0x6b, 0x6d, 0xf1, 0xc8, 0x7b, 0xef, + 0xdd, 0xf7, 0x47, 0xdf, 0x87, 0xf8, 0x2f, 0xd7, 0xd1, 0xdb, 0xdd, 0x07, + 0x30, 0x78, 0x5f, 0xb1, 0x2c, 0x4b, 0x8b, 0x47, 0x96, 0x30, 0xe5, 0xb9, + 0xc1, 0xeb, 0x76, 0x72, 0x72, 0x72, 0x25, 0x51, 0xcc, 0xd8, 0x8a, 0xc9, + 0x5f, 0x4e, 0x4e, 0x4e, 0xe2, 0x83, 0x0f, 0x3e, 0x98, 0xb4, 0x0e, 0x6d, + 0x14, 0x12, 0x9a, 0x95, 0x3a, 0x3b, 0x3b, 0x4b, 0x0b, 0xc9, 0xcf, 0xd2, + 0x18, 0x30, 0xf9, 0xd9, 0x58, 0x86, 0x3e, 0xb6, 0x36, 0xb1, 0xbd, 0xb8, + 0xb8, 0x48, 0x2f, 0x2e, 0x2e, 0xd2, 0xc2, 0x35, 0x5e, 0x99, 0x88, 0xa9, + 0x58, 0x76, 0x69, 0xe6, 0x68, 0x4f, 0x53, 0xca, 0x1f, 0x5b, 0x31, 0x91, + 0xd4, 0x3e, 0xc6, 0xb3, 0x68, 0xca, 0xbe, 0x6b, 0x9f, 0xfb, 0x1d, 0x00, + 0x60, 0xdb, 0xe6, 0x78, 0x27, 0x3c, 0xd4, 0x73, 0xed, 0xa1, 0xb6, 0xbd, + 0x65, 0xe2, 0xbf, 0x6d, 0xe2, 0x4f, 0x1b, 0x7d, 0xdf, 0xff, 0x8f, 0x19, + 0x17, 0xb1, 0x1f, 0x9f, 0xf8, 0x6f, 0x9b, 0xf8, 0xaf, 0xcf, 0x12, 0xff, + 0x27, 0xdf, 0x25, 0xc4, 0x6a, 0x09, 0x75, 0x18, 0x4a, 0x55, 0x8c, 0xbf, + 0x7a, 0xd6, 0xef, 0x87, 0xa7, 0xc6, 0xb0, 0x84, 0x73, 0xbf, 0x84, 0x3a, + 0x0c, 0x65, 0xa8, 0x18, 0xf7, 0x39, 0x27, 0xf9, 0x75, 0xf2, 0xf7, 0x86, + 0x7d, 0x1a, 0x0b, 0xb6, 0xef, 0xc4, 0x7f, 0x7f, 0x35, 0xf9, 0xbe, 0xd6, + 0xe4, 0xdf, 0xd7, 0x6d, 0xb5, 0x1d, 0x3f, 0x37, 0xd6, 0x38, 0xb7, 0x31, + 0x4c, 0x31, 0xfe, 0x70, 0x28, 0xe2, 0x3f, 0xbc, 0x3e, 0xe3, 0x0f, 0x87, + 0xd2, 0x64, 0xfc, 0x68, 0x59, 0x99, 0xa6, 0xd7, 0xc3, 0x50, 0xf7, 0x84, + 0x5d, 0xf5, 0xa8, 0xaa, 0xcb, 0xae, 0xf5, 0x97, 0x72, 0x8d, 0x2c, 0xa1, + 0xfd, 0x8b, 0x7f, 0xec, 0x9c, 0x37, 0xb6, 0x25, 0xb4, 0x7f, 0xc8, 0x4b, + 0x73, 0xe6, 0xae, 0xcb, 0x5c, 0x9c, 0x83, 0x0e, 0x49, 0xb5, 0xb6, 0x7c, + 0xb2, 0x96, 0x6c, 0x88, 0xb8, 0x2c, 0x31, 0xd3, 0x33, 0xb0, 0x1c, 0x65, + 0x7d, 0x44, 0x59, 0xd6, 0xe0, 0xae, 0xda, 0xfc, 0x42, 0x46, 0x97, 0xf5, + 0x87, 0xd6, 0x65, 0x7f, 0x7d, 0x7e, 0xe5, 0xae, 0xeb, 0xf2, 0xaa, 0x7d, + 0x76, 0x91, 0x8f, 0x79, 0x59, 0xd6, 0xf0, 0xae, 0xc4, 0x7f, 0x1d, 0xf1, + 0xcf, 0xc7, 0xbc, 0x6f, 0xfb, 0xaf, 0x7b, 0x78, 0xb0, 0xeb, 0xa5, 0x41, + 0xd9, 0xf2, 0x32, 0x5d, 0x63, 0x54, 0xb7, 0x8d, 0x26, 0xb1, 0x18, 0xf2, + 0x9c, 0xb7, 0xdd, 0x77, 0xdd, 0xf2, 0x3e, 0x75, 0x1b, 0xb2, 0xfd, 0x8b, + 0x7f, 0x7b, 0x73, 0xc7, 0x7f, 0xc8, 0xf6, 0xdf, 0x44, 0x9b, 0xfb, 0xc2, + 0x14, 0xb1, 0xaa, 0x2a, 0xdf, 0xe4, 0x7a, 0x6c, 0xb2, 0xaf, 0x26, 0x0f, + 0x2a, 0xb3, 0x32, 0x4d, 0xae, 0xd7, 0xa6, 0xdb, 0x6c, 0x62, 0xac, 0xfb, + 0xff, 0x2e, 0xe2, 0x5f, 0x5d, 0x66, 0xea, 0xf8, 0x4f, 0xdd, 0xfe, 0xf3, + 0x96, 0x76, 0x2d, 0x94, 0xad, 0x93, 0xff, 0xbb, 0x6f, 0x5f, 0xdd, 0x77, + 0x40, 0xfb, 0x18, 0xf7, 0xa1, 0xa9, 0xdb, 0x7f, 0x9e, 0xf8, 0x5f, 0x5d, + 0x3e, 0x75, 0xfc, 0xcb, 0x62, 0x3e, 0xf4, 0x20, 0xd2, 0xba, 0x7a, 0x77, + 0x3d, 0xae, 0xba, 0xf5, 0x96, 0x32, 0xf0, 0x28, 0x5f, 0xbf, 0xba, 0x97, + 0xb3, 0x5d, 0x5f, 0xde, 0x76, 0x55, 0xd6, 0xe7, 0x0f, 0x3d, 0x88, 0x54, + 0xfc, 0x97, 0x1b, 0xff, 0xae, 0x7d, 0x7e, 0x3a, 0xf5, 0x03, 0x1a, 0x1a, + 0x59, 0x52, 0x5c, 0x0a, 0x09, 0x53, 0x22, 0x06, 0x4c, 0x98, 0x92, 0x25, + 0xb4, 0x79, 0x9e, 0x28, 0x26, 0x3b, 0xe6, 0x49, 0x1a, 0x7a, 0x49, 0x72, + 0x9d, 0xf8, 0xf0, 0xc3, 0x0f, 0xa7, 0xd8, 0x75, 0x27, 0x55, 0x09, 0x6e, + 0x2e, 0x2e, 0x2e, 0x8a, 0x89, 0x6d, 0x56, 0x65, 0xe8, 0x63, 0x6b, 0x1a, + 0xdb, 0xc3, 0xc3, 0xc3, 0xe4, 0xf1, 0xe3, 0xc7, 0x71, 0x72, 0x72, 0x12, + 0xc5, 0x64, 0x4c, 0x65, 0x89, 0x98, 0x1e, 0x3f, 0x7e, 0x1c, 0xa7, 0xa7, + 0xa7, 0x11, 0x23, 0x24, 0x97, 0x1b, 0xc2, 0x9c, 0xed, 0x69, 0x2a, 0xc5, + 0xa4, 0x52, 0x67, 0x67, 0x67, 0x11, 0xcf, 0x8f, 0x75, 0xdf, 0xe2, 0xb9, + 0xcb, 0x94, 0x7d, 0xd7, 0x3e, 0xf7, 0x3b, 0x00, 0xc0, 0x30, 0x96, 0xfc, + 0xfe, 0xa1, 0x8f, 0xa1, 0x9f, 0x43, 0xb5, 0x7d, 0x67, 0xd5, 0xf6, 0x19, + 0xf6, 0x58, 0xef, 0xba, 0xcb, 0xac, 0xe5, 0xfd, 0x43, 0x1f, 0xe2, 0xbf, + 0xdb, 0xa5, 0x98, 0xff, 0x71, 0x92, 0x5d, 0xbe, 0x20, 0xfe, 0xed, 0xb6, + 0x3d, 0x8a, 0x5c, 0xcc, 0xa7, 0xec, 0xff, 0xfb, 0xbc, 0xdb, 0xaf, 0x5b, + 0xd6, 0x76, 0x5f, 0x4d, 0xcb, 0x34, 0xd5, 0xe5, 0x3d, 0x65, 0x9b, 0x6b, + 0x64, 0x48, 0x73, 0xf5, 0xff, 0xe2, 0x7f, 0x75, 0xde, 0x1c, 0xf1, 0x9f, + 0xab, 0xff, 0x17, 0xff, 0xab, 0xf3, 0xe6, 0x88, 0xff, 0xd4, 0xf7, 0xfc, + 0xa5, 0x6a, 0x72, 0x2d, 0x75, 0x19, 0x93, 0xd2, 0x77, 0x4c, 0x6d, 0xd7, + 0x76, 0xd0, 0xb5, 0x2e, 0x43, 0xed, 0x6b, 0x6d, 0xc4, 0x7f, 0x79, 0xf1, + 0x6f, 0xfb, 0x7d, 0x74, 0xc8, 0xb8, 0xb4, 0xd9, 0x57, 0x1b, 0x53, 0x3f, + 0x63, 0x59, 0xb3, 0xb6, 0xdf, 0x47, 0xd7, 0x10, 0xff, 0xa9, 0x9f, 0xb1, + 0x74, 0xb1, 0xc4, 0x24, 0x96, 0x73, 0xaa, 0x8b, 0xf5, 0x9a, 0xef, 0x8d, + 0x53, 0x8c, 0x3f, 0x5c, 0xbb, 0x7d, 0x8e, 0xff, 0x14, 0xe3, 0x8f, 0xc7, + 0xd4, 0xe4, 0x9c, 0xaf, 0x39, 0x3e, 0x63, 0x5b, 0x7b, 0xfb, 0x17, 0xff, + 0x7e, 0xca, 0xda, 0xbf, 0xfc, 0x25, 0xd4, 0xe9, 0x73, 0x8d, 0xa4, 0x3d, + 0x1a, 0x62, 0xdd, 0xba, 0x7d, 0xb6, 0x3d, 0xc4, 0xfe, 0xfb, 0x48, 0x76, + 0xfc, 0xa3, 0x64, 0xec, 0x63, 0x5a, 0xaa, 0xd6, 0x49, 0xb5, 0xd8, 0x3f, + 0x37, 0x6e, 0xdc, 0x98, 0xbb, 0x0a, 0xc0, 0x8a, 0xe4, 0xfb, 0x8c, 0xcf, + 0x3e, 0x7f, 0x12, 0x11, 0xc3, 0x7f, 0xa9, 0x6d, 0xfa, 0x00, 0xb1, 0x49, + 0x32, 0x96, 0x21, 0x0d, 0xbd, 0xbf, 0xae, 0xdb, 0x1b, 0x7b, 0x79, 0x99, + 0x2c, 0xc6, 0x59, 0xcc, 0x23, 0x22, 0xbe, 0x7e, 0xf6, 0xe3, 0x88, 0x88, + 0x78, 0xf3, 0xfa, 0xb0, 0xd9, 0x83, 0xc5, 0x7f, 0x79, 0xf1, 0xcf, 0x62, + 0x9c, 0xc5, 0x3c, 0x62, 0xbc, 0xf6, 0xdf, 0xc7, 0x58, 0xd7, 0xc4, 0xd4, + 0xd7, 0xda, 0x10, 0xfb, 0x1e, 0xb2, 0x6e, 0x53, 0xb6, 0xff, 0x3e, 0xc4, + 0xbf, 0xf9, 0xf2, 0x36, 0xa6, 0x6c, 0xff, 0x7d, 0xcf, 0xf5, 0x9c, 0xb1, + 0x1a, 0xc3, 0x12, 0x12, 0x3d, 0x2c, 0xe1, 0xfe, 0x2f, 0xfe, 0xf3, 0x99, + 0xeb, 0xfe, 0xbf, 0x2f, 0xd7, 0x42, 0xb6, 0xbf, 0xa5, 0xd4, 0xa7, 0xad, + 0xb9, 0xee, 0xff, 0xe2, 0xbf, 0x0c, 0x65, 0xed, 0x7f, 0xc8, 0x01, 0x57, + 0x55, 0x89, 0xc1, 0xa6, 0xb2, 0x94, 0x97, 0x99, 0x6d, 0x92, 0xc9, 0x66, + 0xcb, 0xe7, 0xb8, 0x7e, 0x86, 0x1c, 0x70, 0x25, 0xfe, 0x2f, 0xad, 0x25, + 0xfe, 0x30, 0x92, 0xc1, 0x1b, 0xe0, 0xc9, 0xc9, 0xc9, 0x95, 0x04, 0x31, + 0x53, 0x29, 0x26, 0xe7, 0x39, 0x39, 0x39, 0x89, 0x0f, 0x3e, 0xf8, 0x60, + 0x96, 0xba, 0x34, 0x55, 0x4c, 0x5e, 0x73, 0x71, 0x71, 0x11, 0x17, 0x17, + 0x17, 0xe9, 0xe3, 0xc7, 0x8f, 0x8b, 0xcb, 0xd2, 0x58, 0x59, 0x32, 0xa5, + 0x21, 0x8f, 0xad, 0x4d, 0x6c, 0x4f, 0x4f, 0x4f, 0x93, 0xc3, 0xc3, 0xc3, + 0xc8, 0x27, 0x63, 0xca, 0xa6, 0x88, 0x88, 0x7f, 0xfe, 0xe7, 0x7f, 0x4e, + 0xb3, 0x32, 0xcf, 0x13, 0x30, 0xe5, 0xeb, 0x31, 0x89, 0xe7, 0xf5, 0xb9, + 0x54, 0xb7, 0x62, 0x3d, 0x23, 0xe6, 0x6d, 0x4f, 0x75, 0x9e, 0xd7, 0xff, + 0xca, 0x31, 0x74, 0xd9, 0x56, 0xfe, 0x18, 0x4f, 0x4e, 0x4e, 0x2e, 0x2d, + 0x5b, 0x43, 0x3c, 0xfb, 0x9a, 0xba, 0xef, 0xda, 0xe7, 0x7e, 0x07, 0x00, + 0xe8, 0x6f, 0x0d, 0xef, 0x1f, 0xf6, 0xc9, 0x9c, 0xc7, 0xbc, 0xd6, 0xf7, + 0x0f, 0xfb, 0x64, 0xce, 0x63, 0x2e, 0x7b, 0xff, 0x10, 0x7f, 0xfa, 0xbb, + 0x88, 0x88, 0x78, 0xed, 0x67, 0xaf, 0x8d, 0xb6, 0x5f, 0xf1, 0x7f, 0x69, + 0xce, 0x63, 0x7e, 0x11, 0xe3, 0xe7, 0x31, 0x8f, 0x58, 0xe6, 0xf8, 0xb3, + 0x26, 0xda, 0x5e, 0x53, 0x63, 0xbc, 0xff, 0x9f, 0x6b, 0xec, 0x61, 0x57, + 0x6b, 0x19, 0x7f, 0xd6, 0x84, 0xf8, 0xb7, 0x37, 0x57, 0xff, 0x3f, 0x06, + 0xf1, 0x6f, 0xaf, 0xac, 0xff, 0x5f, 0x9a, 0x6c, 0x3c, 0xc4, 0xd4, 0xf7, + 0xa3, 0xa1, 0xc7, 0x9f, 0x4f, 0xb5, 0xfe, 0x9a, 0x65, 0x31, 0x2e, 0x4b, + 0xf2, 0x38, 0xf5, 0xfd, 0x48, 0xfc, 0xa7, 0x97, 0xc5, 0x38, 0x3f, 0x06, + 0x66, 0xa8, 0xef, 0xa3, 0x6d, 0xce, 0x6b, 0xb1, 0xec, 0x50, 0x31, 0x29, + 0xfb, 0xbe, 0x45, 0xb5, 0xa1, 0xbe, 0x8f, 0x2e, 0x21, 0xfe, 0xa5, 0xdf, + 0xb7, 0x16, 0x66, 0xc9, 0x09, 0xdf, 0xea, 0xc6, 0x7b, 0x66, 0xba, 0x24, + 0x34, 0xad, 0xda, 0x5f, 0xd7, 0xf5, 0xd7, 0x68, 0xc9, 0x09, 0xdf, 0xc4, + 0x7f, 0x7c, 0x73, 0xb5, 0xff, 0xb5, 0x9f, 0xd3, 0xa6, 0xd7, 0xe6, 0xd2, + 0xcd, 0xd5, 0xfe, 0xc5, 0x7f, 0x19, 0xe4, 0x2f, 0xa1, 0xad, 0xbe, 0xd7, + 0x4c, 0x59, 0x22, 0xa9, 0x24, 0xa7, 0xed, 0xba, 0x53, 0x1a, 0x63, 0xff, + 0x4d, 0x8f, 0x7d, 0x0b, 0xae, 0xb5, 0x5d, 0x21, 0x49, 0x92, 0x64, 0xab, + 0x19, 0xc8, 0x96, 0x6c, 0x88, 0x8b, 0x79, 0x4d, 0x99, 0x5e, 0x81, 0xe9, + 0x95, 0xf5, 0x11, 0xb7, 0x6e, 0x1e, 0xc7, 0xfd, 0xb8, 0xdf, 0x79, 0x9b, + 0x6d, 0x5f, 0xd0, 0x95, 0x95, 0xaf, 0xda, 0x46, 0xd7, 0x07, 0x8e, 0x6d, + 0xb6, 0xd9, 0x67, 0x5b, 0x7d, 0xf7, 0xd5, 0xa4, 0x2e, 0x43, 0x7f, 0xd7, + 0xc9, 0xc7, 0xfc, 0x8d, 0xeb, 0x7f, 0x8d, 0xf8, 0x5b, 0xf7, 0x6d, 0x89, + 0xff, 0xfa, 0xe2, 0x9f, 0x8f, 0x79, 0x97, 0xf6, 0xdf, 0x37, 0xe6, 0x7d, + 0xaf, 0x89, 0xba, 0x32, 0x5d, 0xe3, 0xd1, 0xe5, 0x3c, 0xb7, 0xa9, 0xc3, + 0xd8, 0xd7, 0x49, 0x53, 0x7d, 0xdb, 0xbf, 0xf8, 0x77, 0xab, 0xc3, 0x52, + 0xe2, 0xdf, 0xb7, 0xfd, 0x37, 0xad, 0x53, 0xdf, 0x7e, 0x7d, 0xaa, 0x3e, + 0xbc, 0xcb, 0xf5, 0xd9, 0x75, 0x9f, 0x6d, 0x8e, 0xb3, 0x6b, 0xbb, 0xa8, + 0x33, 0xd4, 0xfd, 0x5f, 0xfc, 0xdb, 0xef, 0x73, 0x09, 0xf1, 0x1f, 0xaa, + 0xfd, 0xe7, 0xad, 0xe9, 0x5a, 0x18, 0x62, 0x7b, 0x63, 0x5e, 0x4f, 0x63, + 0x3f, 0xdb, 0x1c, 0xf2, 0xfb, 0x7f, 0x46, 0xfc, 0x77, 0x2f, 0x5b, 0x5a, + 0xfc, 0xf3, 0x31, 0x7f, 0xef, 0xdd, 0xf7, 0x23, 0xe2, 0x87, 0x01, 0x58, + 0x4f, 0x9e, 0xf4, 0x1f, 0x7c, 0x95, 0xaf, 0x7b, 0xd5, 0xa3, 0xe6, 0x21, + 0xfb, 0xd4, 0x7d, 0xd2, 0xf4, 0xfc, 0x75, 0x51, 0x16, 0xe3, 0xa3, 0xb7, + 0x5f, 0x8d, 0xf8, 0xfa, 0xf9, 0x00, 0xac, 0x6f, 0xfb, 0xef, 0x43, 0xfc, + 0xfb, 0x19, 0x33, 0xfe, 0x7d, 0x63, 0xec, 0xfd, 0xd1, 0x32, 0x2d, 0xe9, + 0x65, 0x68, 0x21, 0x69, 0x4a, 0x69, 0xbd, 0x72, 0x65, 0xae, 0x5c, 0x4b, + 0x2d, 0x97, 0x25, 0xc5, 0xf9, 0x87, 0x87, 0x87, 0xd9, 0xfc, 0x46, 0xdb, + 0x7e, 0x5e, 0xbe, 0xcd, 0xfe, 0xd3, 0xc2, 0xbc, 0x62, 0xb1, 0xa5, 0x49, + 0x0e, 0x0f, 0x0f, 0xb3, 0xe4, 0x35, 0xc5, 0x24, 0x36, 0x97, 0xce, 0x63, + 0x44, 0xb3, 0x73, 0xd4, 0x46, 0xd5, 0xf9, 0x6c, 0x52, 0xb6, 0x66, 0xdf, + 0xbd, 0x8f, 0xad, 0xb0, 0xac, 0x69, 0x6c, 0x93, 0xd3, 0xd3, 0xd3, 0xe2, + 0x36, 0x8a, 0xfb, 0x2e, 0x6e, 0xef, 0x4a, 0x5b, 0xe8, 0x7b, 0xae, 0x2b, + 0xd6, 0x2f, 0x3b, 0x1f, 0x4d, 0xd6, 0x6f, 0xd5, 0x9e, 0x9a, 0xd6, 0xa9, + 0x4d, 0xd9, 0x92, 0xfd, 0xed, 0x3c, 0x86, 0xa6, 0xe7, 0x2f, 0x97, 0x54, + 0x2a, 0x5f, 0xa7, 0xfc, 0xf9, 0x19, 0x24, 0x9e, 0x63, 0xab, 0x3b, 0xde, + 0xbe, 0xd7, 0x77, 0xc3, 0x78, 0x34, 0xd5, 0xaa, 0x6d, 0x02, 0x00, 0xdb, + 0x31, 0xd4, 0xfb, 0x87, 0x3a, 0x63, 0x3c, 0xaf, 0x1d, 0xf3, 0x3d, 0x51, + 0xdd, 0xf6, 0x96, 0xfe, 0x8c, 0xb9, 0xca, 0x18, 0xef, 0x1f, 0xea, 0x88, + 0x7f, 0xf3, 0x6d, 0x8f, 0xed, 0x52, 0xcc, 0x7f, 0xf9, 0x4d, 0xc4, 0xef, + 0xc6, 0xdf, 0xa7, 0xf8, 0x37, 0xdf, 0xf6, 0xe8, 0x72, 0x31, 0x1f, 0xbb, + 0xff, 0xef, 0x73, 0x9e, 0xfa, 0x9e, 0xc3, 0x29, 0xc6, 0x35, 0x2d, 0x65, + 0x4c, 0x51, 0x1b, 0x53, 0xf6, 0xff, 0xe2, 0xdf, 0x7e, 0x3f, 0x63, 0x9b, + 0xb2, 0xff, 0x17, 0xff, 0xf6, 0xfb, 0x19, 0xdd, 0x44, 0xf7, 0xfc, 0x2e, + 0xc6, 0x4e, 0x40, 0xd3, 0x35, 0x26, 0x6d, 0xd7, 0x1b, 0xf2, 0xfb, 0x40, + 0xdf, 0xb1, 0x76, 0x43, 0xb6, 0xb9, 0x31, 0x5c, 0x4d, 0xf2, 0xf8, 0xaf, + 0xa3, 0xed, 0x4b, 0xfc, 0x97, 0x17, 0xff, 0x7c, 0xcc, 0xdb, 0x7e, 0x1f, + 0xed, 0x1b, 0x97, 0xae, 0xf3, 0xdb, 0x98, 0xea, 0x19, 0xcb, 0x3e, 0x68, + 0xfb, 0x7d, 0x74, 0x0d, 0xf1, 0x9f, 0xea, 0x19, 0x4b, 0x17, 0x43, 0x8f, + 0x3f, 0x1c, 0xda, 0xd0, 0xfd, 0x51, 0x9b, 0xeb, 0x65, 0x8c, 0xf1, 0x73, + 0x73, 0x9a, 0x62, 0xfc, 0xe1, 0xd0, 0xc4, 0x7f, 0x38, 0x65, 0x31, 0x5e, + 0x42, 0xfb, 0x6f, 0x73, 0x2e, 0x93, 0x24, 0x59, 0x4c, 0x42, 0xa6, 0xb5, + 0x5d, 0x03, 0x4b, 0x6d, 0xff, 0xe2, 0x3f, 0x8d, 0xaa, 0x18, 0xcb, 0x5f, + 0x42, 0x9d, 0xaa, 0x6b, 0xa4, 0x6e, 0x5c, 0x7a, 0xdd, 0x18, 0xe9, 0xfc, + 0xfa, 0xc5, 0xb2, 0xf9, 0x71, 0xef, 0x69, 0x9a, 0xa6, 0x55, 0xcb, 0xbb, + 0x68, 0x52, 0xf7, 0xaa, 0xfd, 0xd7, 0x6d, 0xb3, 0xac, 0x7e, 0xd9, 0x76, + 0x8c, 0xe7, 0xbf, 0xec, 0x95, 0x2e, 0x2b, 0x35, 0x09, 0x08, 0xd3, 0xe9, + 0x1b, 0x8f, 0xa7, 0x4f, 0x9f, 0x46, 0xc4, 0xfa, 0x7e, 0xe9, 0x07, 0x98, + 0x56, 0xd6, 0x47, 0x64, 0x7d, 0x46, 0x84, 0x5f, 0x31, 0xd8, 0xa2, 0xb2, + 0x5f, 0x0a, 0x63, 0x3b, 0xf2, 0x31, 0xd7, 0xfe, 0xb7, 0x47, 0xfb, 0xdf, + 0x36, 0xed, 0x7f, 0xdb, 0xb4, 0xff, 0x6d, 0xd3, 0xfe, 0xb7, 0x4d, 0xfb, + 0xdf, 0xb6, 0xb1, 0x62, 0x9e, 0xa6, 0xe9, 0xa5, 0xa9, 0x69, 0xd9, 0x21, + 0x97, 0x0d, 0xa9, 0xcf, 0xbe, 0xba, 0x2e, 0x6f, 0x7a, 0xfe, 0xba, 0xc8, + 0x5e, 0x4a, 0x65, 0x03, 0x19, 0x86, 0x26, 0xfe, 0xfd, 0x97, 0x8f, 0x19, + 0xff, 0xaf, 0x9e, 0xfd, 0xf0, 0xab, 0x60, 0x47, 0x6f, 0x77, 0xff, 0x15, + 0x4e, 0xef, 0x8f, 0x96, 0x45, 0x3c, 0x26, 0x57, 0x76, 0xbe, 0x97, 0x1e, + 0x83, 0x7c, 0xfd, 0xd2, 0xdc, 0x94, 0xc4, 0xf2, 0xeb, 0x5e, 0x67, 0xc8, + 0x63, 0x6b, 0x13, 0xdb, 0xe2, 0xf6, 0xf3, 0xfb, 0xce, 0xfe, 0x4e, 0x4a, + 0xca, 0x4d, 0x29, 0xad, 0x99, 0xd6, 0x60, 0xaa, 0xba, 0xaf, 0x21, 0x9e, + 0x7d, 0x4d, 0xdd, 0x77, 0xed, 0x73, 0xbf, 0x03, 0x00, 0x74, 0xe4, 0xfd, + 0xc3, 0xf6, 0x78, 0xff, 0xb0, 0x6d, 0x97, 0x62, 0xfe, 0xa7, 0xbf, 0x9b, + 0xaf, 0x22, 0xcc, 0x23, 0x17, 0x73, 0xfd, 0xff, 0xf6, 0xe8, 0xff, 0xb7, + 0x4d, 0xff, 0xbf, 0x71, 0x0b, 0x8e, 0xf9, 0xad, 0x9b, 0xc7, 0x73, 0x57, + 0x81, 0x89, 0xe5, 0x63, 0xfe, 0xc6, 0xf5, 0xbf, 0xce, 0x58, 0x13, 0xe6, + 0x90, 0x8f, 0xf9, 0x3e, 0x7e, 0x1f, 0xdd, 0xc7, 0x63, 0x1a, 0xcb, 0x3e, + 0x7e, 0x1f, 0xdd, 0xc7, 0x63, 0x5a, 0x92, 0x26, 0x89, 0x92, 0xb2, 0xa9, + 0xca, 0x50, 0xe3, 0xe7, 0x96, 0x6a, 0xec, 0xf1, 0x87, 0x73, 0x11, 0xff, + 0x66, 0x86, 0x18, 0x7f, 0x38, 0x94, 0xb2, 0x98, 0x14, 0xcf, 0xe5, 0xae, + 0x73, 0xdb, 0x24, 0x8e, 0x6d, 0x14, 0x63, 0xd9, 0xb4, 0x1e, 0x4d, 0xf7, + 0xbf, 0x94, 0x6b, 0x64, 0x49, 0xed, 0x5f, 0xfc, 0xa7, 0x57, 0xd6, 0xfe, + 0xe5, 0x2f, 0xa1, 0xa9, 0x62, 0xfe, 0x8a, 0x5d, 0x63, 0x9f, 0xd7, 0x30, + 0x26, 0x7a, 0xe9, 0x75, 0x5f, 0x4a, 0x3d, 0xa6, 0x76, 0xad, 0xeb, 0x8a, + 0x32, 0x94, 0x2d, 0xc3, 0x56, 0x2f, 0x5c, 0x60, 0x79, 0x8e, 0x8f, 0x5f, + 0xbe, 0x5c, 0x28, 0x66, 0x05, 0x3d, 0x3a, 0x3a, 0xba, 0x34, 0xaf, 0xf8, + 0x25, 0x38, 0x5b, 0x96, 0x2f, 0xd7, 0xb7, 0x4c, 0xdd, 0xba, 0x63, 0xaf, + 0x5f, 0x96, 0x19, 0x35, 0x5f, 0xfe, 0xfc, 0xfc, 0x7c, 0xd6, 0xfd, 0x77, + 0x29, 0x5f, 0xe5, 0x37, 0x07, 0x3f, 0x7d, 0xf1, 0x39, 0xfb, 0x07, 0x50, + 0xe6, 0xcd, 0xeb, 0xaf, 0x5e, 0x9a, 0xf7, 0xe6, 0xf5, 0xcb, 0x0f, 0x46, + 0xb2, 0x65, 0xf9, 0x72, 0x7d, 0xcb, 0xd4, 0xad, 0x3b, 0xf6, 0xfa, 0xc5, + 0x73, 0x50, 0x2c, 0xff, 0xd5, 0xb3, 0xef, 0x67, 0xdd, 0x7f, 0x97, 0xf2, + 0x55, 0xb4, 0x7f, 0xed, 0x3f, 0xa3, 0xfd, 0x6b, 0xff, 0x79, 0xda, 0xff, + 0xd5, 0xf2, 0xda, 0x7f, 0x5c, 0x29, 0xaf, 0xfd, 0x6b, 0xff, 0xda, 0xbf, + 0xf6, 0x3f, 0x44, 0x99, 0xba, 0x75, 0xc7, 0x5e, 0x7f, 0x0b, 0xed, 0xff, + 0xe3, 0x4f, 0x3e, 0xaa, 0x5c, 0x3e, 0x84, 0x31, 0x1f, 0x73, 0xee, 0xfa, + 0xe5, 0xa0, 0x31, 0xf6, 0xd9, 0x75, 0x5f, 0x63, 0x2f, 0xef, 0xe3, 0xfc, + 0x8b, 0xab, 0xd7, 0xcc, 0xd0, 0xc4, 0x7f, 0xb9, 0xf1, 0xef, 0xc2, 0xfb, + 0xa3, 0x65, 0x58, 0xf8, 0xfb, 0xa3, 0x26, 0x75, 0xab, 0x2a, 0xd3, 0x65, + 0x59, 0xd2, 0xa0, 0xcc, 0xae, 0x65, 0xc5, 0x79, 0x7d, 0xd7, 0x5f, 0xa2, + 0x36, 0x75, 0x1c, 0xfa, 0x18, 0xc7, 0xde, 0x77, 0xdf, 0xed, 0x77, 0xdd, + 0xf7, 0x10, 0x71, 0xef, 0x7b, 0xae, 0xc7, 0x58, 0xbf, 0x38, 0x7f, 0x88, + 0x04, 0x65, 0x6d, 0xca, 0x8e, 0xb1, 0x7e, 0xdf, 0x3e, 0x69, 0x29, 0xea, + 0x8e, 0x6d, 0x8c, 0xbe, 0x6f, 0xaa, 0xb6, 0x0f, 0x00, 0x6c, 0x88, 0xf7, + 0x0f, 0xde, 0x3f, 0x64, 0xbc, 0x7f, 0xd8, 0xc6, 0xfb, 0x87, 0xbc, 0xd7, + 0x4e, 0xfe, 0xfe, 0xc5, 0xe7, 0xef, 0xfe, 0xf2, 0xdd, 0xe5, 0x65, 0x3f, + 0x7b, 0xed, 0xd2, 0xbc, 0xd7, 0x7e, 0xf6, 0xda, 0xa5, 0xe5, 0xd9, 0xb2, + 0x7c, 0xb9, 0xbe, 0x65, 0xea, 0xd6, 0x1d, 0x7b, 0xfd, 0xe2, 0x39, 0x28, + 0x96, 0xff, 0xee, 0x2f, 0xdf, 0xcd, 0xba, 0xff, 0x2e, 0xe5, 0xab, 0xe8, + 0xff, 0xf5, 0xff, 0x19, 0xfd, 0xbf, 0xfe, 0xff, 0xd2, 0x32, 0xfd, 0xff, + 0x95, 0xf2, 0xfb, 0xd6, 0xff, 0x2f, 0x41, 0x3e, 0x01, 0x8d, 0xfb, 0xd1, + 0x36, 0xee, 0x47, 0x57, 0x93, 0x3c, 0xfe, 0x6b, 0x44, 0xb8, 0x1f, 0x55, + 0x95, 0x2b, 0x2b, 0xbf, 0xd6, 0xfb, 0x51, 0x3e, 0xe6, 0x79, 0x43, 0xb7, + 0xff, 0x36, 0xe5, 0x86, 0x2a, 0x4f, 0x77, 0x6b, 0x68, 0xff, 0x45, 0x6d, + 0xbe, 0x6f, 0x2d, 0xc1, 0x14, 0xe3, 0x0f, 0xd7, 0x6e, 0xd9, 0xc3, 0x7c, + 0xfa, 0x99, 0x62, 0xfc, 0xe1, 0xda, 0xed, 0x73, 0xfc, 0xf7, 0xa5, 0xfd, + 0x4f, 0x39, 0x0e, 0x75, 0x9f, 0xec, 0x4b, 0xfb, 0x17, 0x7f, 0x58, 0xae, + 0xfc, 0x78, 0xf5, 0x17, 0xe3, 0xa6, 0x8f, 0x7f, 0x72, 0xa5, 0x5c, 0xf2, + 0xe9, 0x97, 0x57, 0x96, 0xa5, 0xef, 0xbc, 0x95, 0x66, 0x7f, 0x67, 0xcb, + 0x8b, 0x63, 0xaf, 0xbb, 0x24, 0xc9, 0x6a, 0xb3, 0xac, 0xc9, 0x58, 0xef, + 0x2e, 0xfb, 0x6a, 0x3a, 0x86, 0x7c, 0xe1, 0x63, 0xcd, 0x61, 0x18, 0x07, + 0x07, 0x07, 0xe9, 0xbd, 0x7b, 0xf7, 0xd2, 0xdf, 0xff, 0xf6, 0x0f, 0xe9, + 0xf1, 0xf1, 0x71, 0xdd, 0xaf, 0x12, 0x9b, 0x4c, 0xa6, 0x0d, 0x4f, 0xc7, + 0xc7, 0xc7, 0xe9, 0xef, 0x7f, 0xfb, 0x87, 0xf4, 0xde, 0xbd, 0x7b, 0xe9, + 0xc1, 0xc1, 0x41, 0x1a, 0x11, 0xe9, 0xbd, 0x7b, 0xf7, 0x66, 0xaf, 0x97, + 0x69, 0xda, 0x29, 0x1f, 0xf3, 0x4f, 0x7e, 0xf4, 0x8b, 0xd9, 0xeb, 0x63, + 0x9a, 0x76, 0xca, 0xc7, 0x5c, 0xfb, 0xdf, 0xde, 0xa4, 0xfd, 0x6f, 0x7b, + 0xd2, 0xfe, 0xb7, 0x3d, 0x69, 0xff, 0xdb, 0x9e, 0xb4, 0xff, 0x6d, 0x4f, + 0xda, 0xff, 0xb6, 0xa7, 0x7c, 0xcc, 0x7f, 0xff, 0xdb, 0x3f, 0xa4, 0x11, + 0xe1, 0xf9, 0xe1, 0x06, 0xa6, 0x2c, 0xc6, 0x5f, 0x7d, 0xf9, 0xff, 0xbf, + 0x98, 0xf7, 0xbf, 0xde, 0xf8, 0xf7, 0x69, 0x44, 0xa4, 0xbf, 0x39, 0xf8, + 0xe9, 0xec, 0xf5, 0x33, 0x8d, 0x3b, 0x65, 0x31, 0x4e, 0xdf, 0x79, 0x2b, + 0x9b, 0x07, 0x00, 0xb0, 0x35, 0xb3, 0x7f, 0x27, 0x33, 0x99, 0x4c, 0x26, + 0x93, 0x69, 0x8b, 0x93, 0xf7, 0x0f, 0xdb, 0x9b, 0xbc, 0x7f, 0xd8, 0xf6, + 0x94, 0x8f, 0xf9, 0x6b, 0xbf, 0xfe, 0xd5, 0xec, 0xf5, 0x31, 0x4d, 0x3b, + 0xe5, 0x63, 0xae, 0xff, 0xdf, 0xde, 0xa4, 0xff, 0xdf, 0xf6, 0xa4, 0xff, + 0xdf, 0xf6, 0x94, 0x8b, 0xf9, 0xd2, 0xb8, 0x1f, 0x6d, 0x70, 0x72, 0x3f, + 0xda, 0xf6, 0xb4, 0xef, 0xe3, 0x21, 0x73, 0xc7, 0x44, 0xb5, 0xbd, 0x6c, + 0xff, 0xb9, 0x63, 0x5a, 0x1a, 0xe3, 0x0f, 0x37, 0x34, 0x19, 0x7f, 0xb8, + 0xed, 0xa9, 0x64, 0xfc, 0xa1, 0xf6, 0xbf, 0xa1, 0x49, 0xfb, 0xdf, 0xf6, + 0x54, 0x6c, 0xff, 0xf2, 0x97, 0x98, 0xda, 0x4c, 0xc5, 0xfc, 0x15, 0x55, + 0x22, 0x22, 0x2a, 0x0b, 0xbc, 0xf3, 0xd6, 0xce, 0x29, 0x22, 0xa2, 0x6e, + 0x39, 0xfb, 0xe9, 0xda, 0xdc, 0x15, 0x00, 0x60, 0xdd, 0xee, 0xdd, 0xbb, + 0x77, 0x65, 0xde, 0xad, 0x9b, 0x2f, 0x7f, 0xa5, 0xe1, 0xbd, 0x77, 0xdf, + 0x8f, 0x8f, 0x3f, 0xf9, 0x28, 0xde, 0x7b, 0xf7, 0xfd, 0x88, 0x88, 0x4b, + 0x9f, 0x33, 0xd9, 0xbc, 0xb2, 0x65, 0x6d, 0xca, 0xec, 0xd2, 0x67, 0xdd, + 0x36, 0xeb, 0x97, 0x95, 0xcb, 0x67, 0xd3, 0xee, 0xb2, 0xef, 0x31, 0xf7, + 0x5f, 0x57, 0x3e, 0xff, 0x2b, 0x2c, 0xbb, 0x7c, 0xf2, 0xa3, 0x5f, 0x5c, + 0x99, 0xf7, 0xc6, 0xf5, 0xbf, 0xbe, 0xf8, 0x7c, 0xf4, 0xf6, 0xab, 0x71, + 0xfe, 0xc5, 0xf7, 0x71, 0xf4, 0xf6, 0x0f, 0xbf, 0x82, 0x90, 0xff, 0x9c, + 0xc9, 0xe6, 0x95, 0x2d, 0x6b, 0x53, 0x66, 0x97, 0x3e, 0xeb, 0xb6, 0x59, + 0xbf, 0xac, 0x5c, 0x3e, 0x9b, 0x76, 0x97, 0x7d, 0x8f, 0xb9, 0xff, 0xba, + 0xf2, 0x3f, 0xfc, 0x0a, 0x4b, 0x35, 0xed, 0xbf, 0xba, 0x9c, 0xf6, 0xaf, + 0xfd, 0x67, 0xb4, 0x7f, 0xed, 0xbf, 0x0b, 0xed, 0x5f, 0xfb, 0xd7, 0xfe, + 0xb5, 0x7f, 0xed, 0x5f, 0xfb, 0x5f, 0x52, 0xfb, 0xef, 0x7a, 0x3d, 0xb3, + 0x1f, 0x8e, 0xde, 0x7e, 0x35, 0xe2, 0xeb, 0xb9, 0x6b, 0x01, 0x00, 0x00, + 0x00, 0xc0, 0x3e, 0xf3, 0xfe, 0xa1, 0xba, 0x9c, 0xf7, 0x0f, 0xde, 0x3f, + 0x64, 0xf6, 0xed, 0xfd, 0x43, 0x44, 0xc4, 0x6b, 0xbf, 0xfe, 0xd5, 0xd5, + 0x99, 0xbf, 0xfc, 0xe6, 0xe5, 0xe7, 0x7f, 0x88, 0x88, 0x3f, 0x3e, 0xff, + 0x6f, 0x14, 0x3e, 0x47, 0x61, 0x5e, 0xd9, 0xb2, 0x36, 0x65, 0x76, 0xe9, + 0xb3, 0x6e, 0x9b, 0xf5, 0xcb, 0xca, 0xfd, 0x31, 0xb7, 0xbc, 0xcb, 0xbe, + 0xc7, 0xdc, 0x7f, 0x5d, 0xf9, 0x3f, 0xfd, 0x5d, 0x6d, 0xd5, 0xf4, 0xff, + 0xd5, 0xe5, 0xf4, 0xff, 0xfa, 0xff, 0x8c, 0xfe, 0x3f, 0xf4, 0xff, 0x5d, + 0x2c, 0xb8, 0xff, 0x5f, 0x1a, 0xf7, 0xa3, 0xea, 0x72, 0xee, 0x47, 0xee, + 0x47, 0x99, 0x7d, 0xbc, 0x1f, 0x4d, 0xd5, 0xfe, 0x77, 0x95, 0x1b, 0xfb, + 0xfa, 0xa6, 0xda, 0x9a, 0xda, 0x7f, 0xf6, 0x39, 0xd3, 0xe4, 0xfa, 0x5e, + 0x12, 0xe3, 0x0f, 0xb7, 0xcd, 0xf8, 0xc3, 0x6d, 0xd3, 0xfe, 0xb7, 0x4d, + 0xfb, 0x07, 0xfa, 0x4a, 0x92, 0x24, 0xc9, 0x92, 0x69, 0xb5, 0x5d, 0x9e, + 0x7c, 0xfa, 0x65, 0x52, 0x95, 0x2c, 0xab, 0x6e, 0x39, 0xfb, 0x43, 0x52, + 0x2d, 0x00, 0x3a, 0xbb, 0x7f, 0xff, 0x7e, 0xf9, 0xfc, 0x28, 0x9f, 0xcf, + 0x7e, 0x79, 0xf7, 0x6f, 0xff, 0x52, 0xbe, 0xe0, 0x6f, 0xb9, 0xcf, 0x5f, + 0x17, 0xfe, 0x5b, 0xfc, 0x5c, 0x55, 0xae, 0x4b, 0x99, 0x31, 0xd6, 0x6d, + 0xb3, 0x7e, 0x55, 0xb9, 0x3e, 0x0f, 0x00, 0xc6, 0xda, 0x7f, 0xe5, 0x76, + 0xff, 0xb5, 0x72, 0x57, 0xda, 0xff, 0xb6, 0x69, 0xff, 0x2d, 0xcb, 0x69, + 0xff, 0xec, 0x11, 0xed, 0xbf, 0x65, 0x39, 0xed, 0x9f, 0x3d, 0xa2, 0xfd, + 0xb7, 0x2c, 0xb7, 0x67, 0xed, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x60, 0x2c, + 0xde, 0x3f, 0x6c, 0x9b, 0xf7, 0x0f, 0x2d, 0xcb, 0xed, 0xd9, 0xfb, 0x87, + 0xef, 0x7e, 0xf7, 0x3f, 0xca, 0x17, 0xfc, 0xae, 0x72, 0x35, 0xf6, 0x84, + 0xfe, 0x7f, 0xdb, 0xf4, 0xff, 0x2d, 0xcb, 0xe9, 0xff, 0x61, 0x34, 0xee, + 0x47, 0xdb, 0xe6, 0x7e, 0xd4, 0xb2, 0xdc, 0x9e, 0xdd, 0x8f, 0xb4, 0xff, + 0x6d, 0x5b, 0x65, 0xfb, 0xbf, 0xc4, 0x78, 0x3f, 0x00, 0x00, 0x80, 0x26, + 0x24, 0xd5, 0x22, 0x9e, 0x3e, 0x7d, 0x1a, 0xff, 0xf8, 0x8f, 0xff, 0x18, + 0xff, 0xf4, 0xa1, 0x87, 0x3e, 0x40, 0xb5, 0x3b, 0x77, 0x6f, 0xe7, 0xfb, + 0x8a, 0x64, 0xce, 0xba, 0x00, 0x00, 0x00, 0x00, 0x93, 0x78, 0xf1, 0xeb, + 0x1b, 0xe7, 0xe7, 0xe7, 0x73, 0xd6, 0x83, 0x09, 0xe5, 0x7f, 0xd9, 0x32, + 0xf3, 0xd5, 0xb3, 0xef, 0x4b, 0x4a, 0xb2, 0x8f, 0xf2, 0xbf, 0x6c, 0x09, + 0x00, 0x00, 0x00, 0x30, 0x32, 0xe3, 0x8f, 0x00, 0x00, 0x80, 0xb9, 0xf8, + 0xf7, 0x08, 0xc0, 0x36, 0xe9, 0xff, 0x67, 0x62, 0xfc, 0xe1, 0x76, 0x18, + 0x7f, 0xb8, 0x6d, 0x65, 0xe3, 0x0f, 0xb5, 0xff, 0xed, 0xd0, 0xfe, 0xb7, + 0x2d, 0xdf, 0xfe, 0xe5, 0x2f, 0xa1, 0x8d, 0x42, 0xfe, 0x8a, 0xc6, 0xd2, + 0x34, 0x4d, 0xde, 0x13, 0xb0, 0xe6, 0x00, 0x00, 0x20, 0x00, 0x49, 0x44, + 0x41, 0x54, 0xeb, 0x4b, 0xed, 0x58, 0xf7, 0x9d, 0xb7, 0x3a, 0xaf, 0xcb, + 0xba, 0xbc, 0x32, 0x77, 0x05, 0x98, 0xdf, 0x8d, 0x1b, 0x37, 0xe2, 0xe1, + 0x83, 0x47, 0x73, 0x57, 0x03, 0x58, 0x81, 0x87, 0x0f, 0x1e, 0xc5, 0x8d, + 0x1b, 0x37, 0xe6, 0xae, 0x06, 0x00, 0x00, 0x00, 0x00, 0x23, 0xc8, 0x06, + 0x2e, 0xbc, 0xf7, 0xee, 0xfb, 0x33, 0xd7, 0x84, 0x39, 0x64, 0x03, 0x17, + 0x8e, 0xde, 0x7e, 0x75, 0xe6, 0x9a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xb0, 0x26, 0xc6, 0x1f, 0x6e, 0x9b, 0xf1, 0x87, 0xdb, + 0xa6, 0xfd, 0x6f, 0x5b, 0x59, 0xfb, 0x97, 0xbf, 0x84, 0x36, 0x86, 0xc8, + 0x5f, 0x91, 0x24, 0x49, 0xe7, 0xe4, 0xb9, 0xc9, 0xa7, 0x5f, 0x4a, 0xbc, + 0xbb, 0xc7, 0xae, 0xcd, 0x5d, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, + 0xdb, 0xd2, 0x34, 0x4d, 0xab, 0x96, 0x57, 0x25, 0xd2, 0x4a, 0xdf, 0x79, + 0xab, 0x7a, 0x5d, 0x89, 0xb4, 0x36, 0xe3, 0x95, 0xb9, 0x2b, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xc0, 0x72, 0x7d, 0xfc, 0xc9, 0x47, 0x73, 0x57, 0x81, + 0x89, 0x1c, 0x1d, 0x1d, 0x5d, 0x99, 0x77, 0xfe, 0xc5, 0xf7, 0x33, 0xd4, + 0x84, 0x39, 0xbc, 0x79, 0xdd, 0x2f, 0xc4, 0x01, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xc3, 0x31, 0xfe, 0x70, 0x3b, 0x8c, 0x3f, 0xdc, + 0xb6, 0xb2, 0xf1, 0x87, 0xda, 0xff, 0x76, 0x68, 0xff, 0xdb, 0x66, 0xfc, + 0x31, 0x43, 0xda, 0x95, 0x28, 0xab, 0x2a, 0x81, 0xd6, 0x8b, 0x32, 0x3b, + 0x12, 0x65, 0x49, 0xa0, 0xb5, 0x6d, 0xd7, 0xe6, 0xae, 0x00, 0xcb, 0x70, + 0xe7, 0xee, 0xed, 0xf8, 0xa7, 0x0f, 0xef, 0xcf, 0x5d, 0x0d, 0x60, 0xe1, + 0xee, 0xdc, 0xbd, 0x1d, 0x9f, 0x7d, 0xfe, 0x64, 0xee, 0x6a, 0x00, 0x00, + 0x00, 0x00, 0x13, 0x7a, 0xef, 0xdd, 0xf7, 0x23, 0xe2, 0x87, 0x17, 0x9e, + 0x4f, 0x9e, 0x78, 0x2e, 0xb0, 0x05, 0xf9, 0x81, 0x0c, 0x47, 0x6f, 0xbf, + 0x1a, 0xf1, 0xf5, 0xf3, 0x17, 0x9e, 0xdf, 0xce, 0x58, 0x29, 0x26, 0x63, + 0x20, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x04, + 0xe3, 0x0f, 0xb7, 0xc7, 0xf8, 0xc3, 0x6d, 0xcb, 0x8f, 0x3f, 0xd4, 0xfe, + 0xb7, 0x47, 0xfb, 0xdf, 0xb6, 0xe2, 0xf8, 0x63, 0xf9, 0x4b, 0x68, 0x2a, + 0x9f, 0xbf, 0x22, 0x4d, 0xd3, 0x34, 0x9b, 0x9f, 0x24, 0x49, 0x92, 0xfd, + 0x9d, 0xa6, 0x69, 0x5a, 0x4c, 0xac, 0x95, 0x2d, 0xcb, 0xe6, 0xe7, 0xd7, + 0xcd, 0x6f, 0xa3, 0x6a, 0xbb, 0x11, 0x11, 0x71, 0xfc, 0x93, 0x97, 0xe5, + 0x3f, 0xfd, 0x32, 0x49, 0xdf, 0x79, 0x2b, 0xdd, 0xf5, 0x77, 0x7e, 0x7e, + 0x44, 0x44, 0xd3, 0x65, 0x65, 0xdb, 0x2d, 0x39, 0x15, 0x8c, 0xe0, 0x95, + 0xb9, 0x2b, 0xc0, 0xfc, 0x6e, 0xdd, 0x3c, 0x9e, 0xbb, 0x0a, 0xc0, 0x8a, + 0xe8, 0x33, 0x00, 0x00, 0x00, 0x60, 0x9b, 0xce, 0xcf, 0xcf, 0xe7, 0xae, + 0x02, 0x23, 0xab, 0x8a, 0xf1, 0x57, 0xcf, 0x24, 0x5a, 0xda, 0x77, 0x62, + 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8c, 0xc1, 0xf8, + 0xc3, 0xfd, 0x67, 0xfc, 0xe1, 0xb6, 0x55, 0xc5, 0x58, 0xfb, 0xdf, 0x7f, + 0xda, 0xff, 0xb6, 0x95, 0xc5, 0x58, 0x2e, 0x02, 0xda, 0xea, 0x7b, 0xcd, + 0x94, 0x25, 0xd4, 0xaa, 0x9a, 0x3f, 0x84, 0xb2, 0x84, 0x5a, 0x55, 0xf3, + 0x99, 0xc7, 0xb5, 0xb9, 0x2b, 0xc0, 0xfc, 0xb2, 0xac, 0x7d, 0x00, 0x75, + 0x1e, 0x3e, 0x78, 0xa4, 0xcf, 0x00, 0x00, 0x00, 0x80, 0x8d, 0xc9, 0xff, + 0x6a, 0x10, 0xdb, 0x53, 0xfc, 0xd5, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x68, 0xc2, 0xf8, 0xc3, 0x6d, 0x33, 0xfe, 0x70, + 0xdb, 0xb4, 0xff, 0x6d, 0xd3, 0xfe, 0xb7, 0x4d, 0x2e, 0x02, 0xda, 0xd8, + 0x95, 0xbf, 0x22, 0x9f, 0x10, 0x2b, 0x49, 0x92, 0x24, 0xfb, 0x6f, 0xd9, + 0xfc, 0xbc, 0x62, 0x99, 0xba, 0xed, 0xe6, 0x93, 0x60, 0xe5, 0x3f, 0x27, + 0x9f, 0x7e, 0x99, 0x64, 0xff, 0x2d, 0x9b, 0x7f, 0x69, 0x9f, 0x85, 0x32, + 0x57, 0xf6, 0x59, 0xb3, 0x3e, 0xe3, 0x79, 0x65, 0xee, 0x0a, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xb0, 0x7c, 0x47, 0x47, 0x47, 0x73, 0x57, 0x81, 0x91, + 0x65, 0x31, 0x7e, 0xef, 0xdd, 0xf7, 0xaf, 0x2c, 0x7b, 0xf3, 0xfa, 0xab, + 0x53, 0x57, 0x87, 0x89, 0x65, 0x31, 0x3e, 0x7a, 0x5b, 0xac, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xe1, 0x18, 0x7f, 0xb8, 0xff, + 0x8c, 0x3f, 0xdc, 0xb6, 0xaa, 0xf1, 0x87, 0xda, 0xff, 0xfe, 0xd3, 0xfe, + 0xb7, 0xcd, 0xf8, 0x63, 0x96, 0x28, 0xc9, 0x99, 0x6c, 0x9f, 0x9f, 0x7e, + 0x99, 0x64, 0xd3, 0x54, 0xfb, 0xa4, 0x9e, 0xa4, 0x5a, 0xc4, 0xad, 0x9b, + 0xc7, 0x71, 0xe7, 0xee, 0xed, 0xb9, 0xab, 0x01, 0xac, 0xc0, 0x9d, 0xbb, + 0xb7, 0xe3, 0xd6, 0xcd, 0xe3, 0xb9, 0xab, 0x01, 0x00, 0x00, 0x00, 0x4c, + 0xa8, 0xec, 0x05, 0x27, 0xfb, 0xe9, 0xfc, 0xfc, 0xfc, 0xca, 0x3c, 0x2f, + 0x38, 0xb7, 0xe3, 0xab, 0x67, 0x7e, 0x15, 0x0c, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x18, 0x8e, 0xf1, 0x87, 0xdb, 0x61, 0xfc, 0xe1, + 0xb6, 0x95, 0x8d, 0x3f, 0xd4, 0xfe, 0xb7, 0x43, 0xfb, 0xdf, 0xb6, 0xb2, + 0xf6, 0x2f, 0x7f, 0x09, 0x6d, 0x8c, 0x91, 0xbf, 0x22, 0xcd, 0x19, 0x74, + 0xc3, 0x55, 0xfb, 0x7c, 0xe7, 0xad, 0x34, 0x9b, 0xa6, 0xda, 0x27, 0xf5, + 0x24, 0xd5, 0x22, 0x3e, 0xfb, 0xfc, 0xc9, 0xdc, 0x55, 0x00, 0x56, 0x44, + 0x9f, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xe4, 0xc9, 0x45, 0x40, 0x5b, 0x65, 0xd7, + 0x4c, 0x92, 0x24, 0x49, 0xf6, 0x79, 0xc8, 0xe4, 0x58, 0x55, 0xdb, 0x4d, + 0x3e, 0xfd, 0xf2, 0xe5, 0xb2, 0x01, 0x93, 0x63, 0x8d, 0xb5, 0x5d, 0xea, + 0x49, 0xaa, 0xc5, 0x8b, 0xac, 0x7d, 0x65, 0x59, 0x40, 0x01, 0x32, 0x59, + 0x1f, 0x31, 0x74, 0xa6, 0x4f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0xdd, 0xe4, 0x2f, + 0xa1, 0xa9, 0xb6, 0xf9, 0x2b, 0x8a, 0x49, 0xb0, 0xca, 0x92, 0x6d, 0x0d, + 0x99, 0x80, 0x2b, 0xe2, 0x6a, 0x12, 0xac, 0xb2, 0xa4, 0x58, 0x12, 0x65, + 0x2d, 0x97, 0xa4, 0x5a, 0x44, 0x44, 0xc4, 0xc3, 0x07, 0x8f, 0xe6, 0xae, + 0x02, 0xb0, 0x02, 0xfa, 0x0a, 0x00, 0x00, 0x00, 0xd8, 0x2e, 0x2f, 0xb5, + 0xb6, 0xed, 0xab, 0x67, 0xdf, 0xcf, 0x5d, 0x05, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x56, 0xc8, 0xf8, 0xc3, 0x6d, 0x33, 0xfe, + 0x70, 0xdb, 0xb4, 0xff, 0x6d, 0xd3, 0xfe, 0xb7, 0x4b, 0x4e, 0x02, 0x9a, + 0x1a, 0xe2, 0x5a, 0x49, 0x92, 0x24, 0x69, 0x33, 0x7f, 0x08, 0xc9, 0xa7, + 0x5f, 0x96, 0xef, 0x73, 0xc7, 0x7c, 0xe6, 0x21, 0xa9, 0x16, 0x11, 0x11, + 0x71, 0xe7, 0xee, 0xed, 0xb9, 0xab, 0x00, 0xac, 0x80, 0xbe, 0x02, 0x00, + 0x00, 0x00, 0xb6, 0xe7, 0xe3, 0x4f, 0x3e, 0x9a, 0xbb, 0x0a, 0x4c, 0x2c, + 0x1f, 0xf3, 0xf3, 0x2f, 0xbc, 0xcc, 0xde, 0x1a, 0x31, 0x07, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x86, 0x60, 0xfc, 0xe1, 0xf6, 0x18, + 0x7f, 0xb8, 0x6d, 0xf9, 0x98, 0x6b, 0xff, 0xdb, 0xa3, 0xfd, 0x6f, 0x5b, + 0x31, 0xe6, 0x72, 0x12, 0xd0, 0xd4, 0xae, 0x6b, 0x25, 0x4d, 0xd3, 0x34, + 0xfb, 0x9c, 0x25, 0xc7, 0x2a, 0x4b, 0x92, 0x95, 0x95, 0x2b, 0x2e, 0xcb, + 0xfe, 0xce, 0x6f, 0x27, 0x8e, 0x7f, 0x12, 0xe9, 0x3b, 0x6f, 0xa5, 0x71, + 0xfc, 0x93, 0x78, 0x31, 0xc5, 0x0f, 0x89, 0xb0, 0xca, 0x92, 0x61, 0xa5, + 0xef, 0xbc, 0x95, 0x96, 0x2d, 0xcf, 0xcf, 0xbf, 0xb4, 0xcf, 0xdc, 0xdf, + 0xd9, 0x3a, 0xd9, 0xbc, 0xe2, 0xdf, 0x4c, 0x43, 0x52, 0x2d, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x76, 0xfa, 0xec, 0xf3, 0x27, 0x11, 0x11, 0x71, 0x74, + 0x74, 0x34, 0x73, 0x4d, 0x18, 0x5b, 0x16, 0xe3, 0x2c, 0xe6, 0x11, 0x11, + 0x5f, 0x3f, 0xfb, 0x71, 0x44, 0x44, 0xbc, 0x79, 0xfd, 0xd5, 0x59, 0xea, + 0xc4, 0x74, 0xb2, 0x18, 0x67, 0x31, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xe8, 0xc3, 0xf8, 0xc3, 0xed, 0x30, 0xfe, 0x70, 0xdb, + 0xca, 0xc6, 0x1f, 0x6a, 0xff, 0xdb, 0xa1, 0xfd, 0x6f, 0x9b, 0xf1, 0xc7, + 0x8c, 0x25, 0x9f, 0x24, 0x2b, 0x4b, 0x8c, 0x75, 0x29, 0x41, 0x56, 0xce, + 0xae, 0xf9, 0x95, 0xdb, 0x2f, 0x49, 0x92, 0x95, 0xfd, 0xf7, 0xca, 0xf6, + 0x77, 0xcc, 0x67, 0xf9, 0xae, 0xcd, 0x5d, 0x01, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x96, 0xeb, 0xd6, 0xcd, 0xe3, 0xb8, 0x1f, 0xf7, 0xe7, 0xae, 0x06, + 0x13, 0xca, 0xc7, 0xfc, 0x8d, 0xeb, 0x7f, 0x8d, 0xf8, 0xdb, 0xcc, 0x15, + 0x62, 0x52, 0x62, 0x0e, 0x00, 0x6c, 0xd5, 0x2f, 0xe7, 0xae, 0x00, 0x00, + 0x6c, 0xd0, 0x9f, 0xe6, 0xae, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x2a, + 0xe3, 0x0f, 0xb7, 0xc7, 0xf8, 0xc3, 0x6d, 0xcb, 0xc7, 0x5c, 0xfb, 0xdf, + 0x1e, 0xed, 0x7f, 0xdb, 0xc4, 0x9c, 0xa9, 0x25, 0x49, 0x92, 0x54, 0x25, + 0xd3, 0x4a, 0xd3, 0x34, 0xcd, 0x27, 0xe6, 0x6a, 0xbd, 0xfd, 0x4f, 0xbf, + 0x4c, 0xaa, 0x92, 0x69, 0xa5, 0xef, 0xbc, 0x95, 0xe6, 0x13, 0x73, 0xb1, + 0x4c, 0xaf, 0xcc, 0x5d, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x96, 0x2b, + 0xff, 0xab, 0x41, 0x6c, 0x43, 0xd9, 0x2f, 0x45, 0xb1, 0x1d, 0x62, 0x0e, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0xc1, 0xf8, 0xc3, + 0xed, 0x31, 0xfe, 0x70, 0xdb, 0xf2, 0x31, 0xd7, 0xfe, 0xb7, 0x47, 0xfb, + 0xdf, 0x36, 0x31, 0x67, 0x68, 0xf9, 0x84, 0x59, 0x5d, 0x93, 0x63, 0x55, + 0x26, 0xdd, 0xca, 0x25, 0xcc, 0xea, 0x9a, 0x1c, 0xab, 0x2a, 0xe9, 0x16, + 0xcb, 0x70, 0x6d, 0xee, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb0, 0x0e, + 0xc7, 0xc7, 0xc7, 0x2f, 0x3e, 0x9f, 0x9f, 0x9f, 0x5f, 0x5a, 0x76, 0x74, + 0x74, 0x74, 0x69, 0xde, 0xd1, 0xd1, 0xd1, 0xa5, 0xe5, 0xd9, 0xb2, 0x7c, + 0xb9, 0xbe, 0x65, 0xea, 0xd6, 0x1d, 0x7b, 0xfd, 0xe2, 0x39, 0x28, 0x96, + 0x3f, 0x3f, 0x3f, 0x9f, 0x75, 0xff, 0x5d, 0xca, 0x57, 0xf9, 0xcd, 0xc1, + 0x4f, 0x5f, 0x7c, 0xfe, 0xea, 0xd9, 0xf7, 0x97, 0x96, 0xbd, 0x79, 0xfd, + 0xd5, 0x4b, 0xf3, 0xde, 0xbc, 0xfe, 0xea, 0xa5, 0xe5, 0xd9, 0xb2, 0x7c, + 0xb9, 0xbe, 0x65, 0xea, 0xd6, 0x1d, 0x7b, 0xfd, 0xe2, 0x39, 0x28, 0x96, + 0xff, 0xea, 0xd9, 0xf7, 0xb3, 0xee, 0xbf, 0x4b, 0x79, 0x00, 0x80, 0x2d, + 0xfb, 0x8f, 0x73, 0x57, 0x00, 0x00, 0x36, 0xe8, 0x4f, 0x73, 0x57, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x98, 0x8c, 0xf1, 0x87, 0xc6, 0x1f, 0x66, 0x8c, + 0x3f, 0xdc, 0xde, 0xf8, 0x43, 0xed, 0x5f, 0xfb, 0xcf, 0x68, 0xff, 0xdb, + 0x6b, 0xff, 0xd0, 0x55, 0x92, 0x24, 0x49, 0x96, 0x14, 0x2b, 0x4d, 0xd3, + 0xb4, 0x98, 0x58, 0xab, 0x2a, 0x61, 0x56, 0xa3, 0xed, 0x7f, 0xfa, 0x65, + 0x92, 0x25, 0xc5, 0x4a, 0xdf, 0x79, 0x2b, 0x2d, 0x26, 0xd6, 0x92, 0x30, + 0x6b, 0x3f, 0x74, 0xca, 0x96, 0xc6, 0xfe, 0x38, 0x38, 0x38, 0x48, 0xff, + 0xef, 0xff, 0xf6, 0x8f, 0x71, 0xe7, 0xee, 0xed, 0x78, 0xe3, 0x8d, 0x37, + 0xe2, 0xdf, 0xfe, 0xed, 0xdf, 0xe6, 0xae, 0x12, 0xb0, 0x50, 0xaf, 0xbf, + 0xfe, 0x7a, 0x7c, 0xfd, 0xf5, 0xd7, 0xf1, 0xf0, 0xc1, 0xa3, 0xf8, 0x3f, + 0x3f, 0xf8, 0x3f, 0xe2, 0xdb, 0x6f, 0xbf, 0x75, 0x0f, 0x01, 0x00, 0x00, + 0x80, 0xfd, 0x97, 0xde, 0xbb, 0x77, 0x2f, 0xee, 0xdf, 0xbf, 0x3f, 0x77, + 0x3d, 0x98, 0x50, 0x3e, 0xe6, 0x9f, 0xfc, 0xe8, 0x17, 0xf1, 0xee, 0xdf, + 0xfe, 0x65, 0xe6, 0x1a, 0x31, 0xa5, 0x5c, 0xcc, 0x3d, 0xff, 0x03, 0x00, + 0x36, 0xe5, 0x97, 0x11, 0x06, 0x42, 0x01, 0xc0, 0xc4, 0xfe, 0xe4, 0xf9, + 0x03, 0x00, 0x00, 0x00, 0x00, 0xec, 0x33, 0xe3, 0x0f, 0x37, 0xc8, 0xf8, + 0xc3, 0x6d, 0xcb, 0xc7, 0x5c, 0xfb, 0xdf, 0x1e, 0xed, 0x7f, 0xdb, 0xb2, + 0x98, 0x1f, 0x1c, 0x1c, 0x84, 0xfc, 0x25, 0x34, 0x55, 0xcc, 0x5f, 0xf1, + 0xcd, 0x37, 0xdf, 0xbc, 0x58, 0x96, 0x4f, 0xaa, 0x55, 0xf6, 0x77, 0x51, + 0xa3, 0xf2, 0xc7, 0x3f, 0x79, 0x59, 0x3e, 0x97, 0x54, 0xab, 0xec, 0xef, + 0x2b, 0xdb, 0x6f, 0x50, 0xbe, 0x98, 0x98, 0x8b, 0xf9, 0x5d, 0x9b, 0xbb, + 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2c, 0xdb, 0xbd, 0x7b, 0xf7, 0xae, + 0xcc, 0xbb, 0x75, 0xf3, 0xe5, 0xaf, 0x46, 0xbd, 0xf7, 0xee, 0xfb, 0xf1, + 0xf1, 0x27, 0x1f, 0xc5, 0x7b, 0xef, 0xbe, 0x1f, 0x11, 0x71, 0xe9, 0x73, + 0x26, 0x9b, 0x57, 0xb6, 0xac, 0x4d, 0x99, 0x5d, 0xfa, 0xac, 0xdb, 0x66, + 0xfd, 0xb2, 0x72, 0x1f, 0x7f, 0xf2, 0xd1, 0x8b, 0xe5, 0x5d, 0xf6, 0x3d, + 0xe6, 0xfe, 0xeb, 0xca, 0x7f, 0xf6, 0xf9, 0x93, 0xda, 0xba, 0x7d, 0xf2, + 0xa3, 0x5f, 0x5c, 0x99, 0xf7, 0xc6, 0xf5, 0xbf, 0xbe, 0xf8, 0x7c, 0xf4, + 0xf6, 0xab, 0x71, 0xfe, 0xc5, 0xf7, 0x71, 0xf4, 0xf6, 0x0f, 0xbf, 0x3a, + 0x94, 0xff, 0x9c, 0xc9, 0xe6, 0x95, 0x2d, 0x6b, 0x53, 0x66, 0x97, 0x3e, + 0xeb, 0xb6, 0x59, 0xbf, 0xac, 0xdc, 0xf9, 0x17, 0x2f, 0x7f, 0x81, 0xa9, + 0xcb, 0xbe, 0xc7, 0xdc, 0x7f, 0x5d, 0xf9, 0xaf, 0x9f, 0xfd, 0xb8, 0x53, + 0x7d, 0x01, 0x00, 0xf6, 0x91, 0xa4, 0x1e, 0xc0, 0x54, 0xb2, 0x24, 0x7e, + 0xff, 0x31, 0x22, 0xfe, 0x67, 0xe8, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xd8, 0x6f, 0xc6, 0x1f, 0x56, 0x97, 0x33, 0xfe, 0xd0, 0xf8, 0xc3, 0xcc, + 0x3e, 0x8e, 0x3f, 0xd4, 0xfe, 0xab, 0xcb, 0x69, 0xff, 0xda, 0x7f, 0x66, + 0x1f, 0xdb, 0x3f, 0xf4, 0x55, 0x95, 0x40, 0x2b, 0xa2, 0x3e, 0xc9, 0x56, + 0x5d, 0x99, 0xaa, 0x04, 0x5a, 0x11, 0xf5, 0x49, 0xb6, 0x9a, 0x96, 0x61, + 0x5e, 0x92, 0x6a, 0x01, 0x00, 0x00, 0x00, 0x00, 0xb0, 0xd3, 0xae, 0x5f, + 0x89, 0xba, 0x1f, 0x7e, 0x3d, 0x6a, 0x0b, 0x76, 0xfe, 0x4a, 0xd4, 0xdf, + 0x72, 0x9f, 0xbf, 0x2e, 0xfc, 0xb7, 0xf8, 0xb9, 0xaa, 0x5c, 0x97, 0x32, + 0x63, 0xac, 0xdb, 0x66, 0xfd, 0xaa, 0x72, 0x5d, 0xf7, 0x3d, 0xe6, 0xfe, + 0x2b, 0xb7, 0xfb, 0xaf, 0xf5, 0xf5, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xe8, 0xc0, 0xf8, 0xc3, 0x6d, 0x33, 0xfe, 0xb0, 0x65, + 0xb9, 0x3d, 0x1b, 0x7f, 0xa8, 0xfd, 0x6f, 0x9b, 0xf6, 0xdf, 0xb2, 0xdc, + 0x9e, 0xb5, 0x7f, 0x18, 0x5a, 0x92, 0x24, 0xa3, 0xfe, 0x58, 0x59, 0xf2, + 0xe9, 0x97, 0x7e, 0x0c, 0x6d, 0x4f, 0x49, 0xaa, 0x05, 0x00, 0x00, 0x00, + 0x00, 0xc0, 0x2e, 0x5e, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x6d, 0x19, 0x7f, 0x08, 0x00, 0xdb, 0x93, 0xce, 0x5d, + 0x01, 0xb6, 0x21, 0x4d, 0xd3, 0x17, 0xd7, 0x5a, 0x92, 0x24, 0x49, 0xf1, + 0xef, 0xd2, 0x65, 0x4f, 0xfe, 0xdf, 0x4b, 0xdb, 0xc8, 0x96, 0xa5, 0x25, + 0xd7, 0x6d, 0x1a, 0x91, 0xe6, 0xd7, 0x2d, 0x96, 0x49, 0x8f, 0x7f, 0x72, + 0x75, 0x9d, 0x77, 0xde, 0x4a, 0xb3, 0x04, 0x5d, 0xe9, 0x3b, 0x6f, 0x95, + 0xb6, 0x85, 0xe4, 0xd3, 0x2f, 0x93, 0xfc, 0xb2, 0x62, 0x42, 0xaf, 0xa6, + 0xeb, 0xb5, 0x59, 0xbe, 0xe5, 0xa4, 0x61, 0xaf, 0xcc, 0x5d, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x4c, 0x3e, 0x61, 0xd6, 0xd2, 0x55, 0x25, + 0xbe, 0x62, 0x7a, 0xd7, 0xe6, 0xae, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xb0, 0x6d, 0x49, 0x92, 0x24, 0x55, 0xc9, 0xb4, 0x92, 0x24, 0x49, 0xba, + 0x6e, 0xb7, 0xec, 0xef, 0xfc, 0xbe, 0x76, 0x6d, 0x3b, 0x3f, 0x3f, 0x9f, + 0x3c, 0x2b, 0xf9, 0xf4, 0xcb, 0xa4, 0x2a, 0x99, 0x56, 0xf2, 0xe9, 0x97, + 0xdd, 0xea, 0x5a, 0x58, 0x2f, 0xfb, 0xbb, 0xb8, 0xef, 0x21, 0xf7, 0xb9, + 0x6f, 0x24, 0xd5, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x16, 0xad, 0x49, + 0x12, 0xac, 0x21, 0xd7, 0x2b, 0xae, 0x1b, 0xc7, 0x3f, 0x69, 0xbe, 0x5e, + 0x83, 0x24, 0x58, 0x43, 0xae, 0xd7, 0x77, 0xdd, 0x7d, 0xf2, 0xca, 0xdc, + 0x15, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xbe, 0xae, 0xcd, 0x5d, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x2a, 0x49, 0x92, 0x24, 0x53, + 0xae, 0x57, 0x5c, 0x37, 0x7d, 0xe7, 0xad, 0xb4, 0xf1, 0x7a, 0x9f, 0x7e, + 0xd9, 0xad, 0xae, 0x1d, 0xd7, 0xeb, 0xbb, 0xee, 0x3e, 0x91, 0x54, 0x0b, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x98, 0x55, 0x9a, 0xa6, 0x95, 0x49, 0xab, + 0xf2, 0xcb, 0x8b, 0x89, 0xb2, 0xba, 0x2e, 0x6b, 0x55, 0xa7, 0xe3, 0x9f, + 0xbc, 0x9c, 0x5f, 0x93, 0x60, 0x2b, 0xbf, 0xbc, 0x98, 0xec, 0xaa, 0xeb, + 0xb2, 0xda, 0xba, 0xf6, 0x58, 0x77, 0x9f, 0xbc, 0x32, 0x77, 0x05, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x32, 0x6d, 0x93, 0x5f, 0xcd, 0x69, 0xcb, + 0x09, 0xac, 0x96, 0xe8, 0xda, 0xdc, 0x15, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xb6, 0x27, 0x9f, 0x3c, 0x2b, 0x4d, 0xd3, 0xb4, 0x38, 0xaf, 0x2a, + 0xb9, 0x56, 0xd7, 0x65, 0x75, 0x65, 0xba, 0x26, 0xf4, 0xaa, 0x4a, 0xae, + 0xd5, 0x75, 0x59, 0x5d, 0x19, 0x09, 0xbd, 0xae, 0x7a, 0x65, 0xee, 0x0a, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x5f, 0x92, 0x6a, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xb3, 0x49, 0xd3, 0x34, 0x8d, 0x88, 0x48, 0x92, + 0x24, 0x99, 0xbb, 0x2e, 0xac, 0x9b, 0xa4, 0x5a, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xac, 0x9e, 0xa4, 0x5a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, + 0x2c, 0xd2, 0x34, 0x4d, 0x23, 0x22, 0x92, 0x24, 0x49, 0xe6, 0xae, 0x0b, + 0xeb, 0x27, 0xa9, 0x16, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xab, 0x27, + 0xa9, 0x16, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0xb9, 0x34, 0x4d, 0xd3, + 0x88, 0x88, 0x24, 0x49, 0x92, 0xb9, 0xeb, 0xc2, 0x7e, 0x90, 0x54, 0x0b, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xd5, 0xbb, 0x36, 0x77, 0x05, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0xed, 0x49, 0x92, 0x24, 0x99, 0xbb, 0x0e, + 0xec, 0x97, 0x57, 0xe6, 0xae, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xf4, 0x25, 0xa9, 0x16, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xab, 0x27, + 0xa9, 0x16, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xab, 0x27, 0xa9, 0x16, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xab, 0x27, 0xa9, 0x16, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xab, 0x27, 0xa9, 0x16, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xab, 0x27, 0xa9, 0x16, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xab, 0x27, 0xa9, 0x16, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xab, 0x27, + 0xa9, 0x16, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xab, 0x27, 0xa9, 0x16, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xab, 0x27, 0xa9, 0x16, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xab, 0x27, 0xa9, 0x16, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xab, 0x27, 0xa9, 0x16, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xab, 0x27, 0xa9, 0x16, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xab, 0x27, + 0xa9, 0x16, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xab, 0x27, 0xa9, 0x16, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xab, 0x27, 0xa9, 0x16, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xab, 0x27, 0xa9, 0x16, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xab, 0x27, 0xa9, 0x16, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xab, 0x27, 0xa9, 0x16, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xab, 0x27, + 0xa9, 0x16, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xab, 0x27, 0xa9, 0x16, + 0x11, 0x11, 0xf1, 0xf0, 0xc1, 0xa3, 0xb9, 0xab, 0x00, 0xac, 0x80, 0xbe, + 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x28, 0x23, 0x27, 0x01, 0x4d, 0xb9, 0x56, 0x18, + 0x93, 0xa4, 0x5a, 0x44, 0x44, 0xc4, 0x9d, 0xbb, 0xb7, 0xe7, 0xae, 0x02, + 0xb0, 0x02, 0xfa, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x8c, 0x9c, 0x04, 0x34, + 0xe5, 0x5a, 0x61, 0x4c, 0x92, 0x6a, 0x11, 0x9f, 0x7d, 0xfe, 0x24, 0x22, + 0x22, 0x8e, 0x8e, 0x8e, 0x66, 0xae, 0x09, 0xb0, 0x64, 0x59, 0x1f, 0x91, + 0xf5, 0x19, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0xf2, 0x97, 0xd0, 0x9c, 0xfc, + 0x15, 0x8c, 0x4d, 0x52, 0x2d, 0xe2, 0xd6, 0xcd, 0xe3, 0xb9, 0xab, 0x00, + 0xac, 0x88, 0x3e, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc8, 0x93, 0x8b, 0x80, 0xb6, + 0x5c, 0x33, 0x8c, 0xe5, 0xda, 0xdc, 0x15, 0x60, 0x7e, 0xb2, 0xf6, 0x01, + 0x4d, 0x3d, 0x7c, 0xf0, 0x48, 0x9f, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5c, 0x22, + 0x17, 0x01, 0x6d, 0xc8, 0x5f, 0xc1, 0x98, 0x5e, 0x99, 0xbb, 0x02, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xd0, 0x97, 0xa4, 0x5a, 0xc4, 0xad, 0x9b, + 0xc7, 0x71, 0xe7, 0xee, 0xed, 0xb9, 0xab, 0x01, 0xac, 0xc0, 0x9d, 0xbb, + 0xb7, 0xe3, 0xd6, 0xcd, 0xe3, 0xb9, 0xab, 0x01, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2c, + 0x88, 0xfc, 0x25, 0xb4, 0x21, 0x7f, 0x05, 0x63, 0x92, 0x54, 0x8b, 0xf8, + 0xec, 0xf3, 0x27, 0x73, 0x57, 0x01, 0x58, 0x11, 0x7d, 0x06, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x90, 0x27, 0x17, 0x01, 0x6d, 0xb9, 0x66, 0x18, 0x8b, 0xa4, 0x5a, + 0x44, 0x44, 0xc4, 0xc3, 0x07, 0x8f, 0xe6, 0xae, 0x02, 0xb0, 0x02, 0xfa, + 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xa0, 0x8c, 0x9c, 0x04, 0x34, 0xe5, 0x5a, 0x61, + 0x4c, 0x92, 0x6a, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb0, 0x7a, 0x92, + 0x6a, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb0, 0x7a, 0x92, 0x6a, 0x11, + 0x4f, 0x9f, 0x3e, 0x8d, 0x3b, 0x77, 0x6f, 0xcf, 0x5d, 0x0d, 0x60, 0x05, + 0xee, 0xdc, 0xbd, 0x1d, 0x4f, 0x9f, 0x3e, 0x9d, 0xbb, 0x1a, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xc0, 0x82, 0xc8, 0x5f, 0x42, 0x1b, 0xf2, 0x57, 0x30, 0x26, 0x49, + 0xb5, 0x88, 0x1b, 0x37, 0x6e, 0xc4, 0xc3, 0x07, 0x8f, 0xe6, 0xae, 0x06, + 0xb0, 0x02, 0x0f, 0x1f, 0x3c, 0x8a, 0x1b, 0x37, 0x6e, 0xcc, 0x5d, 0x0d, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x60, 0x41, 0xe4, 0x2f, 0xa1, 0x0d, 0xf9, 0x2b, 0x18, + 0x93, 0xa4, 0x5a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xac, 0x9e, 0xa4, + 0x5a, 0xc4, 0xad, 0x9b, 0xc7, 0x71, 0xe7, 0xee, 0xed, 0xb9, 0xab, 0x01, + 0xac, 0xc0, 0x9d, 0xbb, 0xb7, 0xe3, 0xd6, 0xcd, 0xe3, 0xb9, 0xab, 0x01, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x2c, 0x88, 0xfc, 0x25, 0xb4, 0x21, 0x7f, 0x05, 0x63, + 0x92, 0x54, 0x8b, 0xf8, 0xec, 0xf3, 0x27, 0x73, 0x57, 0x01, 0x58, 0x11, + 0x7d, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x90, 0x27, 0x17, 0x01, 0x6d, 0xb9, 0x66, + 0x18, 0x8b, 0xa4, 0x5a, 0x44, 0x44, 0xc4, 0xc3, 0x07, 0x8f, 0xe6, 0xae, + 0x02, 0xb0, 0x02, 0xfa, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x8c, 0x9c, 0x04, + 0x34, 0xe5, 0x5a, 0x61, 0x4c, 0x92, 0x6a, 0x01, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xb0, 0x7a, 0x92, 0x6a, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb0, + 0x7a, 0x92, 0x6a, 0x11, 0x4f, 0x9f, 0x3e, 0x8d, 0x3b, 0x77, 0x6f, 0xcf, + 0x5d, 0x0d, 0x60, 0x05, 0xee, 0xdc, 0xbd, 0x1d, 0x4f, 0x9f, 0x3e, 0x9d, + 0xbb, 0x1a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x82, 0xc8, 0x5f, 0x42, 0x1b, 0xf2, + 0x57, 0x30, 0x26, 0x49, 0xb5, 0x88, 0xff, 0xf2, 0x9f, 0xef, 0x45, 0x44, + 0xc4, 0xf9, 0xf9, 0xf9, 0xcc, 0x35, 0x01, 0x96, 0x2c, 0xeb, 0x23, 0xb2, + 0x3e, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x42, 0xfe, 0x12, 0x9a, 0x93, 0xbf, + 0x82, 0xb1, 0x49, 0xaa, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xea, + 0x49, 0xaa, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xea, 0x49, 0xaa, + 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xea, 0x49, 0xaa, 0x05, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xc0, 0xea, 0x49, 0xaa, 0x05, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xc0, 0xea, 0x49, 0xaa, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xc0, 0xea, 0x49, 0xaa, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xea, + 0x49, 0xaa, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xea, 0x49, 0xaa, + 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xea, 0x49, 0xaa, 0x05, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xc0, 0xea, 0x49, 0xaa, 0x05, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xc0, 0xea, 0x49, 0xaa, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xc0, 0xea, 0x49, 0xaa, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xea, + 0x49, 0xaa, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xea, 0x49, 0xaa, + 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xea, 0x49, 0xaa, 0x05, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xc0, 0xea, 0x49, 0xaa, 0x05, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xc0, 0xea, 0x49, 0xaa, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xc0, 0xea, 0x49, 0xaa, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xea, + 0x49, 0xaa, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xea, 0x49, 0xaa, + 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xea, 0x49, 0xaa, 0x05, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xc0, 0xea, 0x49, 0xaa, 0x05, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xc0, 0xea, 0x49, 0xaa, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xc0, 0xea, 0x49, 0xaa, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xea, + 0x49, 0xaa, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xea, 0x49, 0xaa, + 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xea, 0x49, 0xaa, 0x05, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xc0, 0xea, 0x49, 0xaa, 0x05, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xc0, 0xea, 0x49, 0xaa, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xc0, 0xea, 0x49, 0xaa, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xea, + 0x49, 0xaa, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xea, 0x49, 0xaa, + 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xea, 0x49, 0xaa, 0x05, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xc0, 0xea, 0x49, 0xaa, 0x05, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xc0, 0xea, 0x49, 0xaa, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xc0, 0xea, 0x49, 0xaa, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xea, + 0x49, 0xaa, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xea, 0x49, 0xaa, + 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xea, 0x49, 0xaa, 0x05, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xc0, 0xea, 0x49, 0xaa, 0x05, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xc0, 0xea, 0x49, 0xaa, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xc0, 0xea, 0x49, 0xaa, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xea, + 0x49, 0xaa, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xea, 0x49, 0xaa, + 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xea, 0x49, 0xaa, 0x45, 0x44, + 0x44, 0x3c, 0x7c, 0xf0, 0x68, 0xee, 0x2a, 0x00, 0x2b, 0xa0, 0xaf, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xca, 0xc8, 0x49, 0x40, 0x53, 0xae, 0x15, 0xc6, 0x24, + 0xa9, 0x16, 0x11, 0x11, 0x71, 0xe7, 0xee, 0xed, 0xb9, 0xab, 0x00, 0xac, + 0x80, 0xbe, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x28, 0x23, 0x27, 0x01, 0x4d, 0xb9, + 0x56, 0x18, 0x93, 0xa4, 0x5a, 0xc4, 0x67, 0x9f, 0x3f, 0x89, 0x88, 0x88, + 0xa3, 0xa3, 0xa3, 0x99, 0x6b, 0x02, 0x2c, 0x59, 0xd6, 0x47, 0x64, 0x7d, + 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x40, 0x84, 0xfc, 0x25, 0x34, 0x27, 0x7f, 0x05, + 0x63, 0x93, 0x54, 0x8b, 0xb8, 0x75, 0xf3, 0x78, 0xee, 0x2a, 0x00, 0x2b, + 0xa2, 0xcf, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf2, 0xe4, 0x22, 0xa0, 0x2d, 0xd7, + 0x0c, 0x63, 0xb9, 0x36, 0x77, 0x05, 0x98, 0x9f, 0xac, 0x7d, 0x40, 0x53, + 0x0f, 0x1f, 0x3c, 0xd2, 0x67, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x97, 0xc8, 0x45, + 0x40, 0x1b, 0xf2, 0x57, 0x30, 0xa6, 0x57, 0xe6, 0xae, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xf4, 0x25, 0xa9, 0x16, 0x71, 0xeb, 0xe6, 0x71, + 0xdc, 0xb9, 0x7b, 0x7b, 0xee, 0x6a, 0x00, 0x2b, 0x70, 0xe7, 0xee, 0xed, + 0xb8, 0x75, 0xf3, 0x78, 0xee, 0x6a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0x22, + 0x7f, 0x09, 0x6d, 0xc8, 0x5f, 0xc1, 0x98, 0x24, 0xd5, 0x22, 0x3e, 0xfb, + 0xfc, 0xc9, 0xdc, 0x55, 0x00, 0x56, 0x44, 0x9f, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xe4, 0xc9, 0x45, 0x40, 0x5b, 0xae, 0x19, 0xc6, 0x22, 0xa9, 0x16, 0x11, + 0x11, 0xf1, 0xf0, 0xc1, 0xa3, 0xb9, 0xab, 0x00, 0xac, 0x80, 0xbe, 0x02, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x28, 0x23, 0x27, 0x01, 0x4d, 0xb9, 0x56, 0x18, 0x93, + 0xa4, 0x5a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xac, 0x9e, 0xa4, 0x5a, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xac, 0x9e, 0xa4, 0x5a, 0xc4, 0xd3, + 0xa7, 0x4f, 0xe3, 0xce, 0xdd, 0xdb, 0x73, 0x57, 0x03, 0x58, 0x81, 0x3b, + 0x77, 0x6f, 0xc7, 0xd3, 0xa7, 0x4f, 0xe7, 0xae, 0x06, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xb0, 0x20, 0xf2, 0x97, 0xd0, 0x86, 0xfc, 0x15, 0x8c, 0x49, 0x52, 0x2d, + 0xe2, 0xc6, 0x8d, 0x1b, 0xf1, 0xf0, 0xc1, 0xa3, 0xb9, 0xab, 0x01, 0xac, + 0xc0, 0xc3, 0x07, 0x8f, 0xe2, 0xc6, 0x8d, 0x1b, 0x73, 0x57, 0x03, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x58, 0x10, 0xf9, 0x4b, 0x68, 0x43, 0xfe, 0x0a, 0xc6, 0x24, + 0xa9, 0x16, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xab, 0x27, 0xa9, 0x16, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xab, 0x27, 0xa9, 0x16, 0xf1, 0xf4, + 0xe9, 0xd3, 0xb9, 0xab, 0x00, 0xac, 0x88, 0x3e, 0x03, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0x37, 0x7b, 0xf7, 0x1b, + 0x24, 0xc9, 0x79, 0xdf, 0x87, 0xfd, 0x7b, 0xf4, 0xd2, 0x9a, 0x33, 0x0f, + 0xd2, 0x6c, 0xb2, 0x2c, 0xed, 0x91, 0x90, 0xb3, 0x17, 0x1d, 0x04, 0x1c, + 0x0d, 0x96, 0x74, 0x10, 0x99, 0x22, 0x50, 0x12, 0x0d, 0xa0, 0x4a, 0x0a, + 0x01, 0x29, 0x65, 0x09, 0x90, 0x94, 0xa2, 0xa2, 0x38, 0x08, 0xed, 0x37, + 0x31, 0x29, 0xca, 0xb1, 0xac, 0x77, 0x76, 0x02, 0x45, 0xf6, 0x8b, 0x54, + 0x92, 0x72, 0x0c, 0x51, 0xf2, 0x0b, 0x4b, 0x30, 0xcb, 0xb1, 0xc4, 0x8a, + 0x2c, 0x80, 0x71, 0x45, 0x04, 0x68, 0x95, 0x0a, 0x84, 0x25, 0x16, 0xc0, + 0x32, 0x61, 0x9e, 0x54, 0x80, 0xb0, 0x47, 0x01, 0xe5, 0xdd, 0x18, 0x00, + 0x6f, 0x4b, 0xb8, 0xaa, 0x1d, 0x09, 0x27, 0xdd, 0xc8, 0xde, 0xe4, 0xf2, + 0x62, 0xa6, 0x67, 0x7b, 0x7b, 0x7b, 0x7a, 0x7a, 0x66, 0x67, 0xff, 0xcc, + 0xdd, 0xe7, 0x53, 0x05, 0x5c, 0xf7, 0xf3, 0x3c, 0xfd, 0xf4, 0xd3, 0xff, + 0x9e, 0xfe, 0x33, 0xdd, 0xbf, 0x05, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x4c, + 0x2c, 0x02, 0xa6, 0x65, 0x9f, 0xe1, 0xb0, 0x08, 0xaa, 0x05, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xc0, 0xc2, 0x13, 0x54, 0x8b, 0xdc, 0x7d, 0xf7, 0xdd, + 0x49, 0x92, 0xf5, 0xf5, 0xf5, 0x63, 0x6e, 0x09, 0x70, 0x92, 0x15, 0x7d, + 0x44, 0xd1, 0x67, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0xe2, 0x97, 0xd0, 0x9e, + 0xf8, 0x15, 0x1c, 0x36, 0x41, 0xb5, 0x18, 0xb9, 0x70, 0xe1, 0xc2, 0x71, + 0x37, 0x01, 0x38, 0xc1, 0xf4, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x13, 0xb1, + 0x09, 0x98, 0xc4, 0x3e, 0xc2, 0x61, 0x13, 0x54, 0x8b, 0xbc, 0xf2, 0xca, + 0x2b, 0xc7, 0xdd, 0x04, 0x60, 0x81, 0xe8, 0x33, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, + 0x32, 0xb1, 0x08, 0x98, 0x96, 0x7d, 0x86, 0xc3, 0x22, 0xa8, 0x16, 0x23, + 0xeb, 0xeb, 0xeb, 0xc7, 0xdd, 0x04, 0xe0, 0x04, 0xd3, 0x47, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x4d, 0xc4, 0x26, 0x60, 0x12, 0xfb, 0x08, 0x87, 0x4d, 0x50, + 0x2d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x16, 0x9e, 0xa0, 0x5a, 0xe4, + 0xee, 0xbb, 0xef, 0x4e, 0x92, 0x5c, 0xb8, 0x70, 0xe1, 0x98, 0x5b, 0x02, + 0x9c, 0x64, 0x45, 0x1f, 0x51, 0xf4, 0x19, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x89, + 0xf8, 0x25, 0xb4, 0x27, 0x7e, 0x05, 0x87, 0x4d, 0x50, 0x2d, 0xf2, 0xca, + 0x2b, 0xaf, 0x24, 0x49, 0xd6, 0xd7, 0xd7, 0x8f, 0xb9, 0x25, 0xc0, 0x49, + 0x56, 0xf4, 0x11, 0x45, 0x9f, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x90, 0x88, 0x5f, + 0x42, 0x7b, 0xe2, 0x57, 0x70, 0xd8, 0x04, 0xd5, 0x02, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x60, 0xe1, 0x09, 0xaa, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xc0, 0xc2, 0x13, 0x54, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x85, + 0x27, 0xa8, 0x16, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0x6f, 0xe9, + 0xb8, 0x1b, 0xc0, 0xc9, 0xb2, 0xb2, 0xb2, 0xb2, 0x2f, 0xed, 0xc2, 0x85, + 0x0b, 0x59, 0x5f, 0x5f, 0x1f, 0x0d, 0x27, 0xc9, 0xfa, 0xfa, 0xfa, 0x68, + 0x18, 0x58, 0x5c, 0xe5, 0x63, 0xb9, 0x7c, 0x9c, 0x17, 0xc3, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xd3, 0x10, 0xbf, 0xe4, 0xd6, 0x23, 0x7e, 0x05, 0x27, 0x89, + 0xa0, 0x5a, 0x8c, 0xfc, 0x6f, 0xff, 0xf3, 0x13, 0xc7, 0xdd, 0x84, 0xb1, + 0xfe, 0xea, 0x27, 0x3e, 0x9e, 0x7f, 0xfa, 0xe4, 0xe7, 0xf2, 0x57, 0x3f, + 0xf1, 0xf1, 0x24, 0xc9, 0x3f, 0x7d, 0xf2, 0x73, 0xa3, 0xf4, 0x42, 0x39, + 0xbf, 0xad, 0x45, 0xa9, 0x93, 0xe9, 0x54, 0xd7, 0x71, 0x75, 0x3b, 0x14, + 0xf9, 0x45, 0x7a, 0xa1, 0x9a, 0x3f, 0xeb, 0xf4, 0xf3, 0x6e, 0x17, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xc0, 0x22, 0x10, 0xbf, 0xe4, 0xf0, 0x63, 0x8d, 0x88, 0x5f, + 0x01, 0xcd, 0x4e, 0x1d, 0x77, 0x03, 0x38, 0x5e, 0xdd, 0x6e, 0xf7, 0xc6, + 0x07, 0x3f, 0xf8, 0xc1, 0xc6, 0x32, 0x77, 0xdf, 0x7d, 0x77, 0x5e, 0x79, + 0xe5, 0x95, 0x3d, 0xe3, 0x49, 0x46, 0x69, 0xc5, 0x78, 0x91, 0x56, 0x1e, + 0x9f, 0xd5, 0x47, 0x3e, 0xf4, 0xbd, 0xf9, 0xca, 0x4b, 0xbf, 0x53, 0x9b, + 0x9e, 0x64, 0x5f, 0x5e, 0x91, 0x5e, 0xce, 0x2b, 0xa7, 0x55, 0x95, 0xa7, + 0x3f, 0xe9, 0x75, 0x96, 0xd7, 0xc5, 0xbc, 0xca, 0x1e, 0xf7, 0xfc, 0x8b, + 0xb2, 0xf3, 0x9a, 0xbe, 0x6e, 0xdd, 0x57, 0xd3, 0xcb, 0x79, 0xe3, 0xf6, + 0xad, 0xa6, 0x7a, 0x0f, 0x3a, 0xfd, 0x41, 0xeb, 0x3d, 0xa8, 0xea, 0xb1, + 0x59, 0x3d, 0x7e, 0xab, 0xc7, 0x78, 0x79, 0xbc, 0xce, 0xcb, 0x2f, 0xbf, + 0x9c, 0x5e, 0xaf, 0xe7, 0x1c, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x30, 0x85, 0x87, 0x92, 0x1b, 0x49, 0xf2, 0xb1, 0x24, 0x5f, 0x4c, + 0xf2, 0xac, 0x77, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb8, + 0x09, 0x88, 0x5f, 0x32, 0xff, 0x3a, 0xc5, 0xaf, 0x80, 0xd9, 0xd9, 0xa1, + 0x6e, 0x71, 0xdd, 0x6e, 0xf7, 0xc6, 0x71, 0xb7, 0x01, 0x58, 0x4c, 0x2e, + 0x4a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa6, 0x23, 0xa8, + 0x16, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x37, 0x23, 0xf1, 0x4b, + 0x38, 0x08, 0xf1, 0x2b, 0x98, 0xb7, 0xa5, 0xe3, 0x6e, 0x00, 0xc7, 0x4b, + 0xa7, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xcc, 0x4a, 0xfc, 0x12, 0xe0, 0x24, + 0x79, 0xd7, 0x71, 0x37, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, + 0x4a, 0x50, 0x2d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x16, 0x9e, 0xa0, + 0x5a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2c, 0x3c, 0x41, 0xb5, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x58, 0x78, 0x82, 0x6a, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xb0, 0xf0, 0x04, 0xd5, 0x02, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x60, 0xe1, 0x09, 0xaa, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, + 0xc2, 0x13, 0x54, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x85, 0x27, + 0xa8, 0x16, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0x4f, 0x50, 0x2d, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x16, 0x9e, 0xa0, 0x5a, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x2c, 0x3c, 0x41, 0xb5, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x58, 0x78, 0x82, 0x6a, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xb0, 0xf0, 0x04, 0xd5, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0xe1, + 0x09, 0xaa, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xc2, 0x13, 0x54, + 0x0b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x85, 0x27, 0xa8, 0x16, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0x4f, 0x50, 0x2d, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x16, 0x9e, 0xa0, 0x5a, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x2c, 0x3c, 0x41, 0xb5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x58, + 0x78, 0x82, 0x6a, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb0, 0xf0, 0x04, + 0xd5, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0xe1, 0x09, 0xaa, 0x05, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xc2, 0x13, 0x54, 0x0b, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x80, 0x85, 0x27, 0xa8, 0x16, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0b, 0x4f, 0x50, 0x2d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x16, 0x9e, 0xa0, 0x5a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2c, 0x3c, + 0x41, 0xb5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x58, 0x78, 0x82, 0x6a, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb0, 0xf0, 0x04, 0xd5, 0x02, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x60, 0xe1, 0x09, 0xaa, 0x05, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xc0, 0xc2, 0x13, 0x54, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x85, 0x27, 0xa8, 0x16, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, + 0x4f, 0x50, 0x2d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x16, 0x9e, 0xa0, + 0x5a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2c, 0x3c, 0x41, 0xb5, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x58, 0x78, 0x82, 0x6a, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xb0, 0xf0, 0x04, 0xd5, 0x02, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x60, 0xe1, 0x09, 0xaa, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, + 0xc2, 0x13, 0x54, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x85, 0x27, + 0xa8, 0x16, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0x4f, 0x50, 0x2d, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x16, 0x9e, 0xa0, 0x5a, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x2c, 0x3c, 0x41, 0xb5, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x58, 0x78, 0x82, 0x6a, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xb0, 0xf0, 0x04, 0xd5, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0xe1, + 0x09, 0xaa, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xc2, 0x13, 0x54, + 0x0b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x85, 0x27, 0xa8, 0x16, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0x4f, 0x50, 0x2d, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x16, 0x9e, 0xa0, 0x5a, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x2c, 0x3c, 0x41, 0xb5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x58, + 0x78, 0x82, 0x6a, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb0, 0xf0, 0x04, + 0xd5, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0xe1, 0x09, 0xaa, 0x05, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xc2, 0x3b, 0x75, 0xdc, 0x0d, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xe3, 0xf4, 0x50, 0x72, + 0xe3, 0xb8, 0xdb, 0x00, 0x00, 0xb7, 0x9a, 0x67, 0xbd, 0xc3, 0x0a, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x82, 0xa5, 0xe3, 0x6e, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0xa7, 0x8f, 0x1d, + 0x77, 0x03, 0x00, 0xe0, 0x16, 0xf4, 0xec, 0x71, 0x37, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xb8, 0x29, 0x09, 0xaa, 0x05, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x2d, 0xed, 0x8b, 0xc7, 0xdd, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x2e, 0xde, + 0x75, 0xdc, 0x0d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x83, 0x3a, + 0x75, 0xdc, 0x0d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, + 0x63, 0x76, 0xe3, 0xb8, 0x1b, 0x00, 0x00, 0xb7, 0x20, 0xef, 0xb0, 0x02, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x73, 0xf7, 0xae, 0xe3, 0x6e, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x94, 0xa0, 0x5a, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x2c, 0x3c, 0x41, 0xb5, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x58, 0x78, 0x82, 0x6a, 0x01, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xb0, 0xf0, 0x04, 0xd5, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, + 0xe1, 0x09, 0xaa, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xc2, 0x13, + 0x54, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x85, 0x27, 0xa8, 0x16, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0x4f, 0x50, 0x2d, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x16, 0x9e, 0xa0, 0x5a, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x2c, 0x3c, 0x41, 0xb5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x58, 0x78, 0x82, 0x6a, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb0, 0xf0, + 0x04, 0xd5, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0xe1, 0x09, 0xaa, + 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xc2, 0x13, 0x54, 0x0b, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x85, 0x27, 0xa8, 0x16, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x0b, 0x4f, 0x50, 0x2d, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4c, 0xdb, + 0xed, 0x5f, 0x00, 0x00, 0x20, 0x00, 0x49, 0x44, 0x41, 0x54, 0x00, 0x00, + 0x00, 0x16, 0x9e, 0xa0, 0x5a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2c, + 0x3c, 0x41, 0xb5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x58, 0x78, 0x82, + 0x6a, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb0, 0xf0, 0x04, 0xd5, 0x02, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0xe1, 0x09, 0xaa, 0x05, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xc0, 0xc2, 0x13, 0x54, 0x0b, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x80, 0x85, 0x27, 0xa8, 0x16, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x0b, 0x4f, 0x50, 0x2d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x16, 0x9e, + 0xa0, 0x5a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2c, 0x3c, 0x41, 0xb5, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x58, 0x78, 0x82, 0x6a, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xb0, 0xf0, 0x04, 0xd5, 0x02, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x60, 0xe1, 0x09, 0xaa, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xc0, 0xc2, 0x13, 0x54, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x85, + 0x27, 0xa8, 0x16, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0x4f, 0x50, + 0x2d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x80, 0x4e, 0x25, + 0xb9, 0x71, 0xdc, 0x8d, 0x00, 0x80, 0x5b, 0xd0, 0xa9, 0x24, 0xe9, 0x76, + 0xbb, 0x47, 0x7a, 0x1e, 0xee, 0xf5, 0x7a, 0xa7, 0xca, 0xe3, 0x87, 0x31, + 0xff, 0xa3, 0x98, 0xc7, 0x34, 0xf3, 0x6f, 0x6a, 0x43, 0xaf, 0xd7, 0x3b, + 0x35, 0x6d, 0xfb, 0xca, 0xf5, 0x37, 0xd5, 0x3b, 0x4d, 0x9d, 0x07, 0xd1, + 0x5d, 0x39, 0xda, 0xf5, 0x7b, 0x10, 0xbd, 0xab, 0xa5, 0x75, 0x77, 0xc4, + 0xed, 0x2e, 0xcf, 0x1b, 0x4e, 0xb2, 0x45, 0x38, 0xa6, 0x8f, 0xf3, 0x58, + 0x1e, 0xd7, 0x8e, 0x45, 0xb0, 0xb2, 0xb2, 0x72, 0x68, 0xeb, 0xea, 0xea, + 0xd5, 0xab, 0x7b, 0xd6, 0xc5, 0x61, 0xce, 0x6b, 0x9a, 0xb6, 0x1c, 0xe5, + 0x32, 0x2f, 0xba, 0xba, 0x6b, 0x8a, 0x59, 0xae, 0x53, 0xa6, 0x71, 0x5c, + 0xd7, 0x6c, 0x47, 0x79, 0x9d, 0x74, 0x5c, 0x0e, 0xab, 0x6f, 0x3c, 0x29, + 0xfd, 0xef, 0x3c, 0x2c, 0x52, 0x1f, 0x7e, 0x12, 0xae, 0x5b, 0x0f, 0xa3, + 0x0d, 0xd5, 0xf9, 0x9c, 0x84, 0xe5, 0xe4, 0x64, 0x18, 0x77, 0xfe, 0xbe, + 0x7a, 0xf5, 0xea, 0xa9, 0x69, 0xcf, 0xed, 0x6d, 0xaf, 0x0b, 0x8e, 0xe2, + 0xbc, 0x7e, 0xd2, 0xfa, 0xcd, 0x9b, 0xa9, 0x4f, 0x6f, 0x32, 0xcf, 0x63, + 0xfd, 0x38, 0xaf, 0x71, 0x9b, 0xcc, 0x72, 0x6c, 0xb4, 0xa9, 0xb3, 0x18, + 0x3e, 0x49, 0xcb, 0x3d, 0x8f, 0x65, 0x9d, 0xd7, 0xf1, 0x3e, 0xcf, 0xf5, + 0x52, 0xb4, 0xe9, 0x28, 0xd7, 0xf5, 0x61, 0xde, 0xc3, 0x8d, 0xdb, 0x4e, + 0x27, 0x69, 0xfb, 0x2d, 0xa2, 0x79, 0xf5, 0xd5, 0xbd, 0xab, 0xbd, 0x53, + 0x75, 0x75, 0xb9, 0x36, 0x1a, 0xef, 0xa0, 0xeb, 0xfe, 0xb0, 0xce, 0xb9, + 0x8b, 0x76, 0x2e, 0x3f, 0xe9, 0xfb, 0xd8, 0x51, 0x9f, 0xef, 0x8e, 0xe2, + 0x59, 0xda, 0x71, 0x3f, 0xaf, 0x5b, 0x84, 0x3e, 0xfb, 0xa8, 0x7f, 0x3f, + 0x9c, 0xb7, 0xe3, 0xfc, 0x3d, 0xf4, 0x66, 0x78, 0xbe, 0xd6, 0xd4, 0x77, + 0x8e, 0x3b, 0x5f, 0x1e, 0xd4, 0x49, 0xef, 0xbb, 0x4f, 0x72, 0x5f, 0x7d, + 0x92, 0xee, 0x4b, 0x0e, 0xcb, 0x49, 0xbd, 0x0f, 0x2b, 0x3b, 0x69, 0x7d, + 0xfb, 0x22, 0xf5, 0xe3, 0x6d, 0xde, 0xf1, 0x98, 0xa6, 0xae, 0x59, 0xea, + 0x58, 0x84, 0xbe, 0xfb, 0xa4, 0xee, 0xfb, 0xd3, 0x38, 0xa9, 0xc7, 0xf2, + 0x49, 0x3b, 0x7e, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6e, 0x25, + 0x37, 0xfc, 0xe7, 0x3f, 0xff, 0xf9, 0xcf, 0x7f, 0xfe, 0xf3, 0xdf, 0x91, + 0xff, 0x97, 0x64, 0xf0, 0xc2, 0x5e, 0x21, 0xc9, 0x9e, 0xe1, 0x72, 0x5e, + 0xdb, 0xf4, 0xba, 0xbc, 0x72, 0x7e, 0x4a, 0xea, 0xca, 0xd7, 0xd5, 0x53, + 0x9d, 0x67, 0x9b, 0x36, 0x54, 0xe7, 0xd3, 0x76, 0x39, 0xa6, 0xcd, 0xab, + 0x5b, 0x67, 0xa9, 0x98, 0xb4, 0x9c, 0xe3, 0xf2, 0xc6, 0xcd, 0xbb, 0x69, + 0xd9, 0xc6, 0xad, 0x83, 0xc3, 0xd4, 0x5d, 0x69, 0x58, 0x57, 0x2b, 0xdd, + 0x1b, 0xd5, 0xfc, 0xba, 0xf4, 0x54, 0xd7, 0x63, 0x4d, 0x9d, 0xd5, 0xf4, + 0x49, 0xe3, 0x75, 0xd3, 0x8e, 0x6b, 0xf7, 0xb8, 0x36, 0xb5, 0x69, 0x47, + 0xdb, 0xf4, 0xa3, 0xda, 0x1e, 0x70, 0x50, 0x4d, 0xfb, 0xf1, 0xa4, 0x63, + 0xac, 0x6d, 0xfa, 0xac, 0x79, 0x99, 0x70, 0x2c, 0x4f, 0x6a, 0x6f, 0x5d, + 0x7a, 0x53, 0xda, 0xa4, 0xf1, 0xa3, 0xdc, 0x2e, 0xf3, 0xb0, 0xb2, 0xb2, + 0xb2, 0x67, 0x19, 0xea, 0xc6, 0xcb, 0x69, 0xe3, 0xd2, 0x53, 0xe9, 0xb3, + 0xab, 0x2f, 0x84, 0xb7, 0xad, 0xa7, 0xa9, 0xfe, 0x69, 0xc6, 0x27, 0xb5, + 0xa5, 0x4e, 0x5d, 0x9d, 0xd3, 0xce, 0xff, 0x70, 0xb7, 0xd6, 0xd1, 0xab, + 0xbb, 0xd6, 0xaa, 0xa6, 0x57, 0xf3, 0xab, 0xe3, 0x6d, 0xae, 0xd7, 0xaa, + 0xf5, 0x97, 0xe7, 0x3f, 0xed, 0x35, 0x51, 0xdb, 0x76, 0x35, 0xcd, 0xf7, + 0x66, 0xb5, 0xb7, 0xcf, 0x5a, 0xbb, 0x51, 0x37, 0xbe, 0xbf, 0x8f, 0xac, + 0x4f, 0x2f, 0xe7, 0x8d, 0x9b, 0x47, 0x5d, 0xd9, 0xa3, 0xce, 0x1b, 0xb7, + 0x3c, 0x6d, 0x96, 0xe5, 0xa4, 0x3b, 0xaa, 0xeb, 0xe6, 0x22, 0xbd, 0x6e, + 0x5b, 0x4f, 0x73, 0x4e, 0x3d, 0xc8, 0x7c, 0xea, 0xd4, 0xcd, 0xab, 0x29, + 0xbd, 0x69, 0xde, 0xe5, 0xbc, 0xc3, 0xde, 0x6e, 0xcc, 0x66, 0xd2, 0xf5, + 0xc2, 0xb8, 0xbc, 0xba, 0xed, 0x5c, 0x3e, 0x5f, 0xd7, 0x4d, 0x5b, 0x57, + 0xee, 0x30, 0xb5, 0x39, 0x5e, 0xe6, 0xb1, 0x9f, 0x8f, 0xab, 0xbb, 0xe9, + 0x18, 0x98, 0xe7, 0xf1, 0x77, 0xd0, 0xe5, 0x99, 0xc7, 0x7d, 0xf8, 0xb8, + 0xe5, 0x3c, 0xa8, 0xb6, 0xd7, 0x96, 0x6d, 0xf2, 0x92, 0xe6, 0xeb, 0xe3, + 0x36, 0x75, 0xa5, 0xb4, 0xff, 0xce, 0x3a, 0xff, 0x71, 0xe9, 0x87, 0xb5, + 0xdc, 0xb3, 0xe6, 0xa5, 0x45, 0x3f, 0x30, 0xe9, 0xfe, 0xa6, 0x6e, 0xd9, + 0xe6, 0xb5, 0x3f, 0xa4, 0xe6, 0x7e, 0x62, 0x9a, 0x76, 0x16, 0xf5, 0x1d, + 0xc6, 0x7d, 0x54, 0xd3, 0xb4, 0x87, 0xbd, 0x3c, 0x93, 0xd2, 0xeb, 0xea, + 0x9b, 0x34, 0x3e, 0xaf, 0xed, 0xb7, 0x88, 0xe6, 0x75, 0x4d, 0x58, 0x57, + 0x97, 0x6b, 0xa3, 0x66, 0x6d, 0x9f, 0x23, 0x35, 0x9d, 0xf7, 0x9a, 0xea, + 0x6a, 0xbb, 0xed, 0x9a, 0xb6, 0xd9, 0x61, 0x9d, 0xcb, 0xa7, 0xc9, 0x9b, + 0x94, 0x7e, 0x24, 0x1b, 0xeb, 0x00, 0xda, 0x3e, 0x27, 0x6a, 0x9b, 0x3e, + 0xa9, 0xbf, 0xab, 0xce, 0x7b, 0x1e, 0xcf, 0xcc, 0xea, 0xa6, 0x1d, 0xb7, + 0x8c, 0x93, 0xea, 0x98, 0x36, 0xaf, 0x6e, 0x9d, 0x1d, 0xf6, 0x36, 0x9b, + 0x87, 0x69, 0x7e, 0xef, 0x1c, 0x97, 0x5e, 0xcd, 0x9f, 0x94, 0x9e, 0x6a, + 0x1f, 0x7e, 0x80, 0xdf, 0x2a, 0xab, 0xcb, 0xd2, 0xb6, 0xcd, 0x75, 0xe9, + 0xd3, 0xb6, 0xeb, 0x08, 0x37, 0xd3, 0xa1, 0x99, 0x74, 0x5f, 0x72, 0xd0, + 0xbe, 0x33, 0x35, 0xe7, 0xeb, 0x69, 0xe6, 0x3f, 0x29, 0xbd, 0x29, 0xad, + 0x4d, 0xfb, 0xea, 0xf2, 0x8e, 0x74, 0x03, 0x4c, 0x69, 0x5e, 0xd7, 0xab, + 0xd5, 0xfc, 0xb6, 0xe3, 0xd3, 0xa6, 0x8f, 0x1b, 0x3f, 0xc8, 0x7d, 0x58, + 0x53, 0x1d, 0x4d, 0x6d, 0x6b, 0x9a, 0x76, 0xdc, 0x7a, 0x3a, 0xec, 0xfb, + 0xa9, 0x79, 0x99, 0xf6, 0x77, 0x8a, 0x49, 0xe3, 0x07, 0x4d, 0x9f, 0xe5, + 0x1d, 0x8f, 0xa6, 0x76, 0xcf, 0xf2, 0x8e, 0xc9, 0x34, 0xef, 0xd1, 0x9c, + 0x44, 0xb3, 0xee, 0xc3, 0xe5, 0xf1, 0x71, 0x79, 0x6d, 0xd3, 0x0f, 0xeb, + 0x5e, 0x7b, 0xde, 0xed, 0x9e, 0x34, 0x5e, 0x4d, 0x3f, 0xaa, 0x6d, 0x08, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x5e, 0x4b, 0xc7, 0xdd, 0x00, + 0x00, 0x60, 0xbc, 0x53, 0xa7, 0x4e, 0x65, 0xf0, 0x9e, 0xd5, 0x60, 0x78, + 0x5c, 0xfe, 0x8d, 0x1b, 0x37, 0x72, 0xea, 0xd4, 0xa9, 0x74, 0xbb, 0xdd, + 0x3d, 0x79, 0x93, 0x6c, 0x6f, 0x6f, 0x4f, 0xac, 0xa7, 0x48, 0x9b, 0xd4, + 0xc6, 0xba, 0x69, 0xeb, 0xca, 0x4e, 0x93, 0x3e, 0x29, 0xaf, 0x6d, 0x99, + 0xa6, 0xe5, 0x2c, 0xe7, 0x55, 0xeb, 0x6c, 0x5a, 0xf7, 0xd5, 0x79, 0xb7, + 0x5d, 0x07, 0x87, 0xa9, 0xdc, 0xe6, 0xc2, 0xf6, 0xdb, 0x63, 0x96, 0x7d, + 0xa5, 0xb9, 0x8d, 0x93, 0x96, 0xbf, 0xcd, 0x7e, 0xd1, 0x56, 0x51, 0x57, + 0xb5, 0xed, 0x6d, 0xda, 0x31, 0xeb, 0x76, 0x83, 0x45, 0xd0, 0x74, 0xdc, + 0xce, 0x72, 0xfc, 0xb5, 0xe9, 0xcb, 0xc7, 0xa5, 0xb5, 0x9d, 0xb6, 0x5c, + 0xae, 0x6d, 0xff, 0xb3, 0xfd, 0xf6, 0x76, 0x63, 0xfd, 0x93, 0xfa, 0x9b, + 0x9b, 0xc9, 0xdb, 0x6f, 0xbf, 0x9d, 0x64, 0xff, 0x3a, 0x5b, 0x59, 0x59, + 0x99, 0xb9, 0x9e, 0x69, 0xeb, 0x6f, 0xbb, 0xbe, 0xa7, 0xed, 0x6f, 0xc7, + 0xf5, 0xf3, 0x93, 0xdc, 0x4a, 0xdb, 0x7f, 0x9c, 0xb6, 0xe7, 0xe4, 0xa6, + 0xf5, 0x5b, 0xbe, 0x5e, 0x19, 0x67, 0xda, 0x6b, 0x22, 0xe7, 0xdc, 0x76, + 0x6e, 0xdc, 0xd8, 0xc8, 0xa9, 0x53, 0xe7, 0xf6, 0xa5, 0xef, 0xf6, 0x91, + 0xe7, 0x72, 0xe3, 0xc6, 0xc6, 0xa8, 0x5c, 0x77, 0xa5, 0x37, 0x4a, 0x2b, + 0xf2, 0x27, 0x29, 0xca, 0x14, 0xd3, 0xd4, 0xe5, 0x8d, 0x9b, 0xae, 0x6e, + 0x9a, 0x36, 0xd3, 0x55, 0x95, 0x97, 0x67, 0xdc, 0x3c, 0xda, 0x2c, 0xcb, + 0xa2, 0x98, 0xe6, 0x58, 0x98, 0xfa, 0x7e, 0xaa, 0xe6, 0x3a, 0xbd, 0xcd, + 0x39, 0x75, 0x1e, 0xf3, 0xa9, 0x5b, 0xbe, 0x36, 0x6d, 0x68, 0x7b, 0xdf, + 0xca, 0x62, 0x68, 0xba, 0x5e, 0x18, 0x77, 0x8d, 0xd1, 0xe6, 0x9c, 0x50, + 0xad, 0xf7, 0x38, 0x8d, 0x3b, 0x5e, 0xda, 0x1c, 0x6b, 0x87, 0x7d, 0x0f, + 0x5a, 0x77, 0xce, 0x6e, 0xdb, 0xae, 0x59, 0x9e, 0x07, 0xcc, 0x7a, 0x4c, + 0x37, 0xb5, 0xfd, 0x28, 0x34, 0x5d, 0xdb, 0x4c, 0x73, 0x6f, 0x33, 0x6e, + 0x9f, 0xae, 0xce, 0x67, 0x96, 0xb6, 0x4d, 0x93, 0xd7, 0x76, 0x3e, 0xd3, + 0xde, 0xd3, 0x1d, 0xa4, 0x4d, 0xe5, 0x3a, 0xc7, 0xf5, 0x03, 0x93, 0xee, + 0x29, 0x8e, 0xf3, 0x58, 0x9f, 0xe5, 0xde, 0xea, 0x30, 0xee, 0xa3, 0x0e, + 0xe3, 0x1e, 0xef, 0x20, 0xf5, 0x94, 0xb9, 0x86, 0x9f, 0x2f, 0xf7, 0x47, + 0x47, 0xa3, 0xa9, 0x7f, 0x39, 0xae, 0xe7, 0xe0, 0x75, 0xf5, 0xcd, 0xd2, + 0xb6, 0x79, 0xf5, 0xe3, 0x37, 0xeb, 0xbe, 0xd8, 0xf6, 0x9e, 0xa3, 0xae, + 0x7f, 0x6c, 0xb3, 0x1e, 0xe6, 0xf1, 0xcc, 0x6c, 0x9a, 0x3e, 0x7a, 0xd6, + 0xe7, 0xb7, 0x93, 0x2c, 0xe2, 0x36, 0x1f, 0xfb, 0x6c, 0xb9, 0xc5, 0xef, + 0x97, 0xd3, 0x5c, 0xf7, 0x4d, 0xdb, 0x96, 0xba, 0xbc, 0x49, 0xc6, 0x3d, + 0x5b, 0x6b, 0xb3, 0x2c, 0x93, 0xda, 0x75, 0xb3, 0xab, 0xeb, 0x1f, 0x0f, + 0xda, 0x77, 0x96, 0xcb, 0x4c, 0x9a, 0x6f, 0xb5, 0xdc, 0xbc, 0x7e, 0xdb, + 0x98, 0xf5, 0xfa, 0x7d, 0x11, 0x1d, 0xf4, 0x7a, 0x75, 0x5c, 0x1f, 0x3b, + 0x6e, 0x1b, 0xcd, 0x7a, 0xfe, 0x9e, 0x74, 0x0f, 0x58, 0x67, 0xd2, 0x39, + 0x66, 0x9a, 0x7e, 0x63, 0x51, 0xee, 0xa7, 0x66, 0x31, 0x8f, 0x76, 0xb7, + 0xbd, 0xae, 0x69, 0x73, 0xee, 0x98, 0xc6, 0xf6, 0x76, 0xfd, 0xb1, 0xdc, + 0xf6, 0x1d, 0x93, 0x49, 0xe7, 0xa9, 0x69, 0xfb, 0xfd, 0x93, 0x62, 0xde, + 0xc7, 0xd0, 0xb8, 0xe9, 0x8e, 0xea, 0x5e, 0x7b, 0xda, 0xfd, 0xf3, 0xa0, + 0xf7, 0x09, 0xb7, 0xc2, 0xf9, 0x1b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x60, 0x11, 0x08, 0xaa, 0x05, 0x00, 0x27, 0x44, 0xdd, 0x0b, 0x5c, 0xd5, + 0x17, 0xeb, 0xa6, 0x79, 0xd1, 0xae, 0xfc, 0x82, 0xd7, 0x41, 0x5e, 0xd0, + 0x9b, 0xe7, 0x4b, 0x9b, 0xe3, 0x5e, 0x3a, 0x6b, 0x6a, 0x6b, 0x9b, 0xbc, + 0x64, 0xba, 0x75, 0x33, 0x4e, 0xb9, 0x8e, 0xb6, 0xeb, 0xfe, 0x24, 0xbd, + 0xd0, 0x3a, 0xcf, 0x8f, 0x65, 0xaa, 0x2f, 0x86, 0x57, 0xc7, 0x27, 0xed, + 0x17, 0x7b, 0xb6, 0xdb, 0x84, 0x0f, 0x97, 0xca, 0xe5, 0xa7, 0x6d, 0x47, + 0x75, 0x99, 0x27, 0x95, 0xa7, 0xbd, 0xba, 0xbf, 0x8a, 0xdd, 0xbb, 0xda, + 0x3b, 0x75, 0x90, 0x3c, 0xe6, 0xa7, 0xe9, 0x18, 0x6b, 0xd5, 0xd7, 0xb6, + 0x98, 0xa6, 0xed, 0xf1, 0x74, 0xd8, 0xc7, 0xdd, 0x22, 0x7e, 0x3c, 0x30, + 0x4e, 0xf9, 0xe5, 0xee, 0x72, 0xda, 0x61, 0x9a, 0xf6, 0x23, 0xeb, 0x71, + 0xeb, 0xbb, 0x9a, 0x5e, 0xad, 0x77, 0xd2, 0x7c, 0x0e, 0xe3, 0x63, 0xb6, + 0x5b, 0x45, 0x9b, 0x6b, 0x92, 0x49, 0xeb, 0x68, 0xda, 0x75, 0xd8, 0xe6, + 0x9a, 0x68, 0x5c, 0xfa, 0x71, 0xec, 0xe7, 0x27, 0x59, 0x53, 0xe0, 0xaa, + 0x71, 0xba, 0x2b, 0xbd, 0xc6, 0xf1, 0xaa, 0xa6, 0xfa, 0xcb, 0x01, 0xad, + 0xaa, 0xf5, 0x34, 0x05, 0xbb, 0x2a, 0xd7, 0x59, 0xcd, 0x6f, 0xaa, 0xb3, + 0xda, 0xde, 0x69, 0x97, 0xe5, 0xa4, 0xdb, 0x73, 0xff, 0x31, 0x3c, 0xdf, + 0x1d, 0xf4, 0xba, 0x79, 0x5e, 0x0e, 0xe3, 0xbe, 0xad, 0xa8, 0x77, 0x92, + 0x69, 0xaf, 0xd9, 0xb9, 0x39, 0x94, 0xcf, 0xfd, 0xd3, 0x5c, 0x17, 0x9c, + 0x84, 0xf3, 0xfa, 0x41, 0x8e, 0x97, 0xb6, 0xf7, 0xa0, 0xb3, 0x9e, 0x0f, + 0xe7, 0xd5, 0xae, 0x83, 0x98, 0xf5, 0x98, 0x9e, 0xf6, 0x39, 0xc0, 0x41, + 0xb4, 0x7d, 0x1e, 0x51, 0x68, 0xb3, 0x8f, 0xd6, 0xa5, 0x95, 0xeb, 0x9a, + 0xe6, 0x63, 0xf0, 0x71, 0xd3, 0xb4, 0x59, 0x77, 0x6d, 0xea, 0x9e, 0xb6, + 0x8e, 0xb6, 0x6d, 0x3a, 0x48, 0x80, 0xa6, 0xa6, 0xb6, 0x2e, 0xa2, 0x79, + 0xdd, 0x47, 0x9d, 0x64, 0x75, 0xdb, 0xde, 0xb5, 0x7c, 0x3b, 0xb5, 0xcf, + 0xf1, 0x3d, 0x93, 0x3c, 0x32, 0xb3, 0x1c, 0x6b, 0x75, 0xcf, 0x2b, 0x4b, + 0x79, 0x8d, 0xe3, 0xd3, 0x1e, 0xdf, 0xb3, 0x1e, 0x3f, 0x6d, 0xfb, 0xf1, + 0x5b, 0xe1, 0xf9, 0x78, 0xdd, 0xfa, 0x9e, 0xf6, 0x39, 0x54, 0x5d, 0x7d, + 0x07, 0x3d, 0xd7, 0x1d, 0xf5, 0x6f, 0x65, 0xd3, 0x9c, 0xb3, 0x9b, 0x9e, + 0xd9, 0x9d, 0x74, 0xf3, 0xfa, 0x1d, 0xf4, 0xb0, 0xea, 0xab, 0xcb, 0x6b, + 0x53, 0xe7, 0x3c, 0x03, 0xa7, 0xcc, 0xeb, 0xf7, 0xde, 0x9b, 0x51, 0x9b, + 0x6d, 0x96, 0x1c, 0xdf, 0x6f, 0x1b, 0xb3, 0xfc, 0x8e, 0xb3, 0x08, 0x0e, + 0xe3, 0xba, 0x77, 0x5c, 0x1f, 0x3b, 0xae, 0xff, 0x9f, 0x74, 0x5e, 0x68, + 0xd3, 0x67, 0xcf, 0x63, 0x1b, 0xcc, 0x7a, 0x1f, 0xd6, 0xb6, 0xde, 0x45, + 0xd3, 0x14, 0x60, 0xac, 0xcd, 0x7d, 0xc6, 0xbe, 0xeb, 0x9a, 0x29, 0x7f, + 0x9b, 0x98, 0x94, 0xc6, 0x74, 0x26, 0xed, 0xc3, 0x4d, 0xcf, 0x51, 0x9a, + 0xca, 0x4d, 0x73, 0x3c, 0x1c, 0xc5, 0xf5, 0xd7, 0x38, 0x07, 0xed, 0x67, + 0x16, 0xb9, 0x9f, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb8, 0x99, + 0x08, 0xaa, 0x05, 0x00, 0x27, 0xc4, 0xbc, 0x3f, 0xbe, 0x9a, 0xe5, 0x83, + 0x8d, 0xa6, 0xba, 0xe6, 0xf1, 0x57, 0x45, 0xa7, 0xf9, 0x4b, 0xad, 0x6d, + 0xf3, 0xa6, 0xf9, 0xeb, 0x9e, 0x07, 0x5d, 0xbf, 0xbd, 0xde, 0xf8, 0xc0, + 0x40, 0x27, 0xe1, 0x65, 0xb8, 0xea, 0xfa, 0x28, 0x6b, 0x0a, 0x90, 0x72, + 0x18, 0x81, 0x4e, 0x66, 0xf9, 0xeb, 0xa4, 0xd3, 0xec, 0x67, 0x93, 0xf6, + 0xa9, 0x32, 0x01, 0x9d, 0x66, 0x57, 0xfe, 0x6b, 0xdc, 0x75, 0x7f, 0x81, + 0x7b, 0x96, 0x3c, 0xe6, 0x63, 0xdc, 0x5f, 0xf2, 0x4d, 0x66, 0xef, 0x6b, + 0xc7, 0xf5, 0x1f, 0x65, 0xd5, 0xe3, 0xa9, 0x77, 0xb5, 0x77, 0xaa, 0xe9, + 0xc3, 0xc4, 0x49, 0x8a, 0xb6, 0x1e, 0xf6, 0x79, 0xe8, 0xa4, 0x58, 0x59, + 0x59, 0xa9, 0xfd, 0xcb, 0xc6, 0xb3, 0x7c, 0x08, 0x78, 0x10, 0xb3, 0xac, + 0xef, 0xa2, 0xed, 0x4d, 0xae, 0x5e, 0xbd, 0xda, 0x78, 0x9e, 0x9c, 0xe6, + 0x1c, 0x35, 0xa9, 0x3d, 0xb7, 0x82, 0x6e, 0xb7, 0xdd, 0xb1, 0xd5, 0xe6, + 0x3c, 0x7a, 0x94, 0xd7, 0x29, 0xdd, 0x6e, 0xb7, 0x76, 0x3f, 0xbf, 0x95, + 0x3f, 0x62, 0x99, 0x25, 0xb0, 0x56, 0x55, 0xd3, 0xf5, 0x4c, 0x5d, 0x50, + 0xac, 0xb6, 0x79, 0x37, 0x6e, 0x6c, 0xe4, 0xc6, 0x8d, 0x8d, 0x7d, 0xe5, + 0x66, 0xad, 0xb3, 0x8d, 0x45, 0xbe, 0x36, 0xdb, 0x77, 0xff, 0xd1, 0xf2, + 0x3a, 0x67, 0x5e, 0xfd, 0xd8, 0x51, 0xf5, 0x97, 0x4d, 0x7d, 0xc6, 0x2c, + 0xf5, 0xb7, 0xbd, 0xce, 0x38, 0x6c, 0x2b, 0x2b, 0x2b, 0xb7, 0xde, 0xc9, + 0xa4, 0x41, 0xd3, 0x79, 0x3b, 0x39, 0xf8, 0x35, 0x47, 0xb5, 0xfe, 0xf2, + 0xb6, 0x3f, 0x09, 0xe7, 0xf5, 0xa6, 0xe3, 0x65, 0xdc, 0xfd, 0xf3, 0xb8, + 0xbc, 0x3a, 0xdd, 0x95, 0x31, 0xe7, 0xc3, 0x09, 0xfd, 0xc6, 0xac, 0xc7, + 0xdf, 0x41, 0xae, 0xb5, 0xda, 0x3a, 0xc8, 0xfd, 0xc6, 0xbc, 0xcd, 0xe3, + 0xde, 0xe6, 0xa0, 0xf3, 0x29, 0x54, 0xfb, 0x96, 0x69, 0xee, 0xd5, 0xa6, + 0xdd, 0xaf, 0x66, 0x5d, 0xee, 0x59, 0x9f, 0xbb, 0xcd, 0x6a, 0x96, 0xe7, + 0x3c, 0x07, 0x99, 0xcf, 0x41, 0x3f, 0x54, 0x6d, 0x7b, 0x7e, 0x38, 0x8a, + 0xe7, 0xa7, 0x93, 0x96, 0xa7, 0x4d, 0xfd, 0xe3, 0x96, 0xa7, 0xcd, 0xbe, + 0x3a, 0x8f, 0x7b, 0xd6, 0x5b, 0xc1, 0x41, 0xb6, 0xf5, 0xb8, 0x67, 0x28, + 0x45, 0xfa, 0x22, 0x5f, 0x2b, 0x1f, 0x85, 0x36, 0xfd, 0x4b, 0x5d, 0x7a, + 0xf9, 0x59, 0xe5, 0x41, 0xe6, 0xdb, 0xb6, 0xec, 0x41, 0xe6, 0xd1, 0xb6, + 0x1f, 0xbf, 0x99, 0x9f, 0x8f, 0xfb, 0xad, 0xac, 0x79, 0xda, 0xa6, 0x76, + 0x15, 0xfb, 0xcf, 0xa2, 0xf4, 0xdb, 0xbd, 0x5e, 0xef, 0x54, 0xdb, 0xe7, + 0x5f, 0x75, 0x66, 0xb9, 0xee, 0x9b, 0xf5, 0x9a, 0x7a, 0x1e, 0xd7, 0x4c, + 0xb3, 0xfe, 0x4e, 0x77, 0x12, 0x7e, 0x7f, 0x3c, 0x4e, 0x07, 0xd9, 0x66, + 0x4d, 0xcf, 0x70, 0x8e, 0xe2, 0xb7, 0x8d, 0xa3, 0xba, 0x6f, 0x39, 0x6a, + 0xd3, 0x9e, 0x87, 0xdb, 0xe4, 0x4d, 0xaa, 0x77, 0x16, 0x47, 0xf1, 0xbb, + 0xc2, 0xac, 0xfd, 0x46, 0x9b, 0xfd, 0x7a, 0xd1, 0x7e, 0x17, 0x69, 0x6a, + 0xf7, 0xa4, 0xdf, 0x0c, 0xa6, 0xbd, 0x37, 0x9e, 0xa7, 0xb6, 0xbf, 0x53, + 0xde, 0x8a, 0x66, 0xe9, 0x9b, 0x0e, 0x63, 0xbf, 0x9d, 0xb5, 0xcf, 0x19, + 0x57, 0xcf, 0x3c, 0x9f, 0x9d, 0xd5, 0xb5, 0xed, 0x38, 0xf7, 0x67, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf6, 0x13, 0x54, 0x0b, 0x00, 0x4e, + 0xb0, 0xed, 0xed, 0xed, 0xd1, 0x70, 0x5d, 0xe0, 0xa8, 0xb6, 0x1f, 0x59, + 0x4d, 0x0a, 0x38, 0x35, 0xe9, 0xe5, 0xb6, 0xa6, 0x69, 0xdb, 0x7c, 0xb8, + 0x36, 0xe9, 0x85, 0xb1, 0xa6, 0xb6, 0x4e, 0xb3, 0x1c, 0x93, 0x8c, 0x7b, + 0xa9, 0xad, 0xfa, 0xc2, 0xfa, 0x2c, 0xf3, 0x38, 0xe8, 0x07, 0x7c, 0x87, + 0xad, 0xf6, 0x05, 0xd6, 0xd2, 0x47, 0xbe, 0xd5, 0x0f, 0x7c, 0x8b, 0x0f, + 0x8d, 0x92, 0xd2, 0xbe, 0x37, 0xc5, 0x5f, 0x6c, 0xde, 0xb7, 0xdd, 0x66, + 0xfc, 0x70, 0x78, 0x5c, 0x3b, 0xbc, 0x84, 0xc8, 0xad, 0x60, 0xaa, 0x3e, + 0xbe, 0xc5, 0x71, 0x31, 0xed, 0x71, 0x79, 0x50, 0x4d, 0x1f, 0x04, 0x55, + 0x5f, 0x9e, 0x9f, 0xd4, 0x87, 0xde, 0x0c, 0xc1, 0xd9, 0xae, 0x5e, 0xbd, + 0x7a, 0x6a, 0x65, 0x65, 0xe5, 0x46, 0xd3, 0x5f, 0x36, 0x6e, 0xbb, 0xce, + 0xaa, 0x79, 0x55, 0x75, 0xf5, 0xd4, 0xcd, 0x67, 0x9c, 0x71, 0x1f, 0xde, + 0xcd, 0xfb, 0x83, 0xbc, 0xb6, 0xcb, 0xb4, 0x28, 0x1f, 0x02, 0xce, 0x4b, + 0xf5, 0x9a, 0x64, 0xd2, 0xf5, 0x60, 0x51, 0x76, 0x92, 0x49, 0xd7, 0x37, + 0xe3, 0xae, 0x89, 0xda, 0xcc, 0xbf, 0x50, 0x7c, 0x0c, 0x39, 0xee, 0x2f, + 0xc5, 0x37, 0x05, 0x28, 0xbd, 0x99, 0x75, 0x57, 0x7a, 0xfb, 0xd2, 0xca, + 0x01, 0xad, 0x8a, 0xf1, 0x79, 0xcf, 0x23, 0x49, 0xca, 0xc1, 0xbc, 0x4e, + 0x9d, 0x3a, 0x37, 0xb6, 0xdc, 0x41, 0xeb, 0xac, 0x5b, 0x9e, 0x69, 0xe6, + 0xb5, 0xc8, 0xe6, 0x75, 0xdd, 0xdc, 0xe6, 0x38, 0x9e, 0x78, 0xdf, 0x36, + 0xa7, 0xf9, 0x34, 0xd5, 0x55, 0xd7, 0x86, 0x36, 0xeb, 0xe0, 0xa4, 0x78, + 0xfb, 0xed, 0xb7, 0x8f, 0xbb, 0x09, 0xc7, 0xae, 0xed, 0x47, 0xf6, 0x6d, + 0xef, 0x9f, 0xdb, 0x9e, 0xa7, 0xc7, 0x7d, 0x60, 0x76, 0x5c, 0x9a, 0xf6, + 0xd1, 0xba, 0x65, 0x9f, 0xe6, 0x1e, 0xb4, 0xf8, 0x38, 0x7b, 0x5c, 0x5f, + 0x30, 0x29, 0xb0, 0xc5, 0x34, 0xc7, 0x5f, 0x1b, 0x6d, 0x3e, 0x3e, 0x2c, + 0x6f, 0x8f, 0x59, 0xef, 0xc3, 0x8f, 0xfa, 0x7e, 0x63, 0x9a, 0x6b, 0xc4, + 0xf2, 0xb1, 0x5f, 0x0e, 0x36, 0x31, 0x69, 0x9f, 0xae, 0x2e, 0x53, 0x5d, + 0x5e, 0x9b, 0x69, 0xe6, 0xf1, 0xf1, 0x67, 0x61, 0x96, 0x6b, 0xe3, 0x36, + 0xcb, 0xd1, 0x94, 0x57, 0x77, 0x5f, 0x32, 0xe9, 0xbc, 0x72, 0x14, 0xc7, + 0x78, 0x79, 0x1b, 0x56, 0x83, 0x3f, 0xb5, 0x69, 0x67, 0x75, 0x1b, 0x1e, + 0xc6, 0x7d, 0x54, 0xdb, 0xf5, 0x35, 0x69, 0x79, 0xda, 0xb4, 0x61, 0xd2, + 0x3e, 0xd9, 0x76, 0xdb, 0x8f, 0xbb, 0x67, 0x9d, 0x14, 0x8c, 0xf1, 0x56, + 0x37, 0xe9, 0x7a, 0x68, 0xcf, 0x7d, 0x56, 0x8b, 0x74, 0xc6, 0x9b, 0xd4, + 0xbf, 0xcc, 0xeb, 0xbc, 0x57, 0x36, 0xed, 0xb6, 0xa9, 0x96, 0x9f, 0xa6, + 0x2f, 0x68, 0x6a, 0x77, 0x31, 0xed, 0xad, 0xf8, 0x7c, 0x7c, 0xdc, 0xb9, + 0xbc, 0x9c, 0x96, 0xb4, 0x7b, 0x8e, 0xda, 0x74, 0x2e, 0x9d, 0xf5, 0x99, + 0xd9, 0xa4, 0x36, 0xd4, 0xb5, 0x65, 0x52, 0xfe, 0x34, 0xe7, 0xec, 0x9b, + 0xd1, 0x41, 0x8f, 0x9b, 0x71, 0xf5, 0x95, 0xc7, 0xa7, 0xd1, 0xe6, 0xb7, + 0xca, 0x49, 0xbf, 0x37, 0x4e, 0x0a, 0x34, 0x53, 0x0d, 0x32, 0x33, 0xcd, + 0xbc, 0x17, 0x5d, 0xd3, 0x76, 0x3e, 0x8e, 0xc0, 0x42, 0xf3, 0xfa, 0x6d, + 0xe3, 0xa8, 0xef, 0x91, 0x4e, 0x82, 0xa6, 0x67, 0x09, 0xe5, 0xf1, 0x3a, + 0xf3, 0xb8, 0xc7, 0x6b, 0x5b, 0xdf, 0x34, 0x7d, 0xcb, 0xbc, 0xce, 0xdf, + 0xd3, 0xdc, 0x5b, 0x1c, 0xf7, 0x33, 0x93, 0x59, 0x35, 0xb5, 0x7b, 0xdc, + 0x6f, 0x06, 0xc9, 0xf4, 0xf7, 0xc6, 0xe3, 0x7e, 0xb3, 0xa8, 0x1e, 0xbb, + 0x45, 0x9b, 0x9a, 0xfa, 0xec, 0xba, 0xe1, 0x6a, 0x99, 0x59, 0xef, 0x8d, + 0x4f, 0xfa, 0xfb, 0x23, 0x93, 0xd4, 0xed, 0xc3, 0xb3, 0x3c, 0x1b, 0x3c, + 0xc8, 0x75, 0x5c, 0xd2, 0x7c, 0x2c, 0x1f, 0xf4, 0x1c, 0xd1, 0xd4, 0x3f, + 0xcd, 0xda, 0xcf, 0xdc, 0x6a, 0xd7, 0xe9, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x27, 0x9d, 0xa0, 0x5a, 0x00, 0x70, 0xcc, 0xaa, 0x2f, 0xdf, + 0x8d, 0xcb, 0x9b, 0x94, 0x5e, 0xfd, 0x4b, 0x9e, 0xf3, 0x9e, 0x77, 0x9b, + 0xb6, 0x8d, 0x7b, 0x91, 0x7b, 0x96, 0x0f, 0xec, 0xda, 0xe6, 0xb5, 0xfd, + 0xf8, 0x7c, 0x5c, 0xf9, 0xe2, 0x05, 0xcb, 0x69, 0xdb, 0x30, 0x4d, 0x99, + 0xc3, 0xd6, 0x76, 0x3b, 0xd6, 0x6e, 0xb3, 0x95, 0xdd, 0xe5, 0x2f, 0xbf, + 0xcc, 0xdd, 0x76, 0x9d, 0xb4, 0xdd, 0x67, 0x27, 0xd5, 0x55, 0xcc, 0xfb, + 0x20, 0xc7, 0xc0, 0x2c, 0x6d, 0xa0, 0xd9, 0x3c, 0x8e, 0x51, 0xa6, 0x37, + 0xee, 0x58, 0x1d, 0x97, 0xd7, 0x34, 0xdd, 0x34, 0xd3, 0x8c, 0xfb, 0x60, + 0xa5, 0x8d, 0x49, 0xfd, 0x4b, 0x39, 0xad, 0x2e, 0xef, 0x20, 0xfd, 0xc1, + 0x22, 0x29, 0x02, 0x6b, 0x55, 0x97, 0xa5, 0x1c, 0x70, 0xab, 0x9a, 0x57, + 0xfe, 0xb0, 0x79, 0x5c, 0x5e, 0x55, 0x5d, 0xd9, 0xe4, 0x60, 0xe7, 0xfd, + 0xea, 0x07, 0xd4, 0x75, 0xcb, 0x51, 0xa7, 0x69, 0x9e, 0x4d, 0xcb, 0x74, + 0x33, 0x6e, 0xff, 0x49, 0xa6, 0x3d, 0x86, 0xf7, 0x1c, 0x37, 0x63, 0xae, + 0x03, 0xab, 0xe3, 0x4d, 0x41, 0xad, 0xc6, 0x5d, 0x13, 0x4d, 0xdb, 0xef, + 0x14, 0x81, 0xb5, 0xa6, 0x99, 0xf7, 0xcd, 0xa8, 0x1a, 0x24, 0xab, 0x3a, + 0x5e, 0x04, 0xa2, 0xaa, 0xa6, 0x8d, 0x2b, 0xdf, 0x66, 0x1e, 0x45, 0x90, + 0x96, 0xee, 0x4a, 0xf7, 0x46, 0xd3, 0xf4, 0xe5, 0xbc, 0x49, 0xed, 0x6c, + 0x5b, 0x67, 0xdd, 0xf2, 0x8c, 0xab, 0x73, 0x11, 0xcd, 0xe3, 0x9e, 0xad, + 0xd5, 0xfd, 0x54, 0x43, 0x20, 0x9d, 0x59, 0xeb, 0x9d, 0x75, 0x3e, 0x49, + 0x75, 0xfb, 0x1f, 0x6c, 0x1d, 0x9c, 0x94, 0x7e, 0xfc, 0xa4, 0xb4, 0xe3, + 0x24, 0x9b, 0xf6, 0xdc, 0x3d, 0xae, 0x6c, 0x9b, 0xfc, 0xa3, 0x0e, 0x04, + 0x30, 0xcd, 0xf1, 0x32, 0xcd, 0xb5, 0x48, 0xed, 0xf9, 0x70, 0x18, 0x58, + 0x6b, 0xdc, 0x71, 0x35, 0xa9, 0x8e, 0x59, 0x8e, 0xbf, 0x83, 0x2e, 0xcf, + 0xa4, 0x7b, 0x8e, 0x83, 0x3c, 0x3b, 0x99, 0x97, 0x71, 0xd7, 0xa8, 0xd5, + 0x6b, 0xd3, 0xb6, 0xdb, 0xaf, 0xcd, 0x75, 0x73, 0xdb, 0xbc, 0x79, 0x4f, + 0xd3, 0x54, 0xee, 0xa0, 0xcb, 0x3d, 0x4b, 0x5e, 0x9b, 0xfb, 0x92, 0x72, + 0xfa, 0xb8, 0xeb, 0xfa, 0x79, 0xa9, 0xbb, 0x87, 0x2a, 0xf7, 0x29, 0xd3, + 0xdc, 0x6b, 0x34, 0x4d, 0x53, 0x2d, 0x3f, 0xed, 0x79, 0xb7, 0xed, 0x7d, + 0xdc, 0xa4, 0xe5, 0x99, 0xc7, 0xb5, 0xc8, 0xa4, 0xf4, 0x72, 0x3b, 0x26, + 0xdd, 0x0f, 0xde, 0xaa, 0x8e, 0x6a, 0x3b, 0xb0, 0xdf, 0xb4, 0xcf, 0x8d, + 0x0e, 0xe3, 0xbc, 0x37, 0xed, 0xb5, 0x4e, 0xf9, 0x5c, 0xde, 0xf4, 0x8c, + 0xec, 0xa8, 0xfa, 0xf1, 0x45, 0x30, 0xaf, 0x63, 0x6c, 0x96, 0x73, 0xd0, + 0xbc, 0xef, 0xb9, 0xc6, 0x5d, 0xe7, 0xce, 0xf3, 0x3a, 0xa2, 0x9a, 0xb7, + 0xa8, 0xdb, 0x3d, 0x19, 0x73, 0x8c, 0xd6, 0x3c, 0xa7, 0xaa, 0x7b, 0xfe, + 0xd5, 0xf6, 0x5a, 0x6e, 0xd6, 0xfa, 0xa6, 0x59, 0xaf, 0x6d, 0x9e, 0xad, + 0x4d, 0x6a, 0x5b, 0x35, 0x08, 0xd7, 0xcd, 0xae, 0x6d, 0xff, 0x3c, 0xaf, + 0xfb, 0xa0, 0x69, 0xda, 0x30, 0xae, 0xdf, 0x9e, 0xe5, 0xb7, 0x8d, 0x83, + 0xb4, 0xef, 0x24, 0x99, 0x75, 0xbd, 0x1f, 0xf4, 0x77, 0x80, 0x69, 0xee, + 0xd9, 0x0e, 0xbb, 0xcf, 0xae, 0x6b, 0xf7, 0xac, 0xe7, 0xef, 0xa6, 0xe9, + 0x0e, 0xfb, 0x7e, 0x6a, 0x9e, 0xf6, 0x1c, 0x03, 0x63, 0x7e, 0xa7, 0x68, + 0xfa, 0xcd, 0xa0, 0x2e, 0x7d, 0x5c, 0xfd, 0x4d, 0x69, 0xc5, 0xfc, 0xdb, + 0xae, 0xb3, 0x6a, 0xd9, 0xba, 0xe5, 0x68, 0x3a, 0x77, 0xb4, 0x3d, 0xaf, + 0x54, 0xf3, 0x16, 0x41, 0xd3, 0x3a, 0x9c, 0xc7, 0x7d, 0x73, 0x53, 0x7a, + 0xdb, 0xbe, 0x61, 0x9a, 0xbe, 0x74, 0x5e, 0xfd, 0x53, 0x9b, 0xb6, 0xb4, + 0x69, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x47, 0xeb, 0x54, + 0x12, 0x7f, 0x1e, 0x09, 0x00, 0x8e, 0xde, 0xe0, 0x83, 0x8a, 0x6e, 0xf7, + 0x48, 0xcf, 0xc3, 0xe5, 0x60, 0x06, 0x87, 0x35, 0xef, 0x6a, 0xc0, 0x84, + 0xe3, 0x5c, 0xc6, 0x79, 0xcf, 0x7f, 0x9a, 0xba, 0x8f, 0x2a, 0x70, 0x44, + 0x77, 0x65, 0xf6, 0xe5, 0x2b, 0x3e, 0xf2, 0x9d, 0x94, 0x36, 0x2f, 0xe5, + 0x8f, 0x87, 0x0f, 0x6b, 0x1e, 0x93, 0xe6, 0x4b, 0x7b, 0x75, 0xdb, 0xa8, + 0xfc, 0x31, 0xd8, 0x2c, 0x79, 0x4c, 0x76, 0x94, 0xc7, 0xc6, 0x2c, 0xea, + 0xb6, 0xe5, 0xb8, 0x6d, 0x3e, 0x6e, 0x59, 0xe6, 0xd5, 0xcf, 0x2c, 0xea, + 0x7e, 0xb5, 0xb2, 0xb2, 0xb2, 0x6f, 0xd9, 0xcb, 0x1f, 0xc5, 0xd7, 0x4d, + 0x53, 0x7c, 0xd8, 0x3c, 0x2e, 0xaf, 0xcd, 0x3c, 0x0e, 0xaa, 0x2e, 0xa8, + 0xd6, 0x2c, 0x65, 0x0e, 0xab, 0x3d, 0x8b, 0xee, 0xa8, 0xae, 0x97, 0x26, + 0x04, 0xd5, 0x3a, 0xf8, 0x71, 0x39, 0xac, 0xbf, 0xae, 0xae, 0x5b, 0x29, + 0xa8, 0xd6, 0xbc, 0xaf, 0xcf, 0x8a, 0xf4, 0x49, 0xf3, 0x68, 0x3a, 0x17, + 0x1f, 0xa4, 0x3d, 0x87, 0x55, 0xe7, 0xa2, 0x38, 0xea, 0x73, 0x73, 0x9b, + 0x6d, 0x7d, 0x54, 0xf3, 0x39, 0x8c, 0xed, 0x3f, 0x6e, 0xfe, 0x47, 0xe1, + 0x30, 0xcf, 0x4b, 0x8b, 0xe8, 0xb0, 0xaf, 0x21, 0xca, 0xf5, 0x37, 0xd5, + 0x7b, 0x54, 0xe7, 0xf4, 0xe3, 0xb8, 0x07, 0x6d, 0x7b, 0x6f, 0x74, 0xd4, + 0xc7, 0xdf, 0x51, 0x9a, 0xe7, 0xb1, 0x3e, 0xcb, 0x75, 0xf4, 0xa2, 0x9a, + 0x74, 0xfc, 0x1c, 0xd7, 0x72, 0x37, 0xdd, 0x97, 0x4c, 0x53, 0xc7, 0xbc, + 0xda, 0x93, 0xec, 0x5f, 0x07, 0x8b, 0xb2, 0x4f, 0x8c, 0x5b, 0x0f, 0x75, + 0xcb, 0x73, 0x94, 0xcb, 0x32, 0x6e, 0x7e, 0x37, 0xdb, 0xfd, 0xd7, 0x2c, + 0x8e, 0xaa, 0x3f, 0x5e, 0xb4, 0x6b, 0xe5, 0xa3, 0x70, 0x52, 0xcf, 0x85, + 0x93, 0x9e, 0x75, 0x1f, 0xd7, 0xb3, 0xf0, 0x3a, 0x8b, 0xb0, 0x5f, 0x1d, + 0xc7, 0x39, 0xed, 0xb0, 0xe7, 0x7d, 0x94, 0xcf, 0xc9, 0xda, 0xcc, 0xff, + 0xa4, 0x1a, 0xf7, 0x0c, 0x69, 0xde, 0xbf, 0xed, 0x1d, 0xc6, 0xb3, 0xb7, + 0x79, 0xfc, 0x1e, 0x59, 0xd7, 0xb6, 0x36, 0xed, 0xbd, 0x19, 0x9e, 0xb3, + 0x1d, 0x47, 0xdf, 0xd8, 0xf6, 0x59, 0xc8, 0x61, 0xff, 0xb6, 0xd1, 0xb6, + 0x7d, 0x27, 0xc9, 0x49, 0xbf, 0xbe, 0x3e, 0xa8, 0xe3, 0xee, 0xb3, 0xdb, + 0x3a, 0x69, 0x7d, 0x7b, 0xdb, 0x7e, 0x6f, 0x5c, 0xbf, 0x76, 0x58, 0xfd, + 0xf3, 0xb8, 0x36, 0x94, 0xc7, 0xdb, 0xf4, 0xb3, 0xe3, 0xca, 0xcc, 0xda, + 0xee, 0x45, 0xe8, 0xbb, 0x4f, 0xea, 0xbe, 0x3f, 0x8d, 0xa3, 0xb8, 0xce, + 0x9b, 0xc5, 0x49, 0x3b, 0x7e, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x6e, 0x15, 0x82, 0x6a, 0x01, 0xc0, 0xf1, 0xf0, 0xc2, 0x14, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xcc, 0xd1, 0xbb, 0x8e, 0xbb, 0x01, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x70, 0x50, 0x82, 0x6a, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xb0, 0xf0, 0x04, 0xd5, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0xe1, + 0x9d, 0x4a, 0x72, 0xe3, 0xb8, 0x1b, 0x01, 0x00, 0xb7, 0x9a, 0x6e, 0xb7, + 0x7b, 0xdc, 0x4d, 0xe0, 0xa8, 0x2c, 0x1d, 0x77, 0x03, 0x00, 0x98, 0xd5, + 0x92, 0x4e, 0xfc, 0x96, 0xb1, 0xb3, 0xb3, 0x73, 0xdc, 0x4d, 0xe0, 0xa8, + 0x38, 0xac, 0xe1, 0xa6, 0xe3, 0x7c, 0x7d, 0xeb, 0xd8, 0x89, 0xf3, 0xf5, + 0xad, 0xc2, 0x71, 0x0d, 0x37, 0x1f, 0x7d, 0x38, 0xdc, 0x7c, 0x9c, 0xaf, + 0x6f, 0x1d, 0x9e, 0x9b, 0xdd, 0x42, 0x1c, 0xd6, 0xb7, 0x0c, 0x7d, 0xf8, + 0xad, 0x43, 0x1f, 0x7e, 0x6b, 0x58, 0x5a, 0x72, 0x4c, 0xdf, 0x2a, 0xae, + 0x5e, 0xbd, 0x7a, 0xea, 0xb8, 0xdb, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xb0, 0x48, 0xfc, 0xa2, 0x0e, 0x00, 0xc7, 0xa4, 0xff, 0xc3, 0xf7, + 0x35, 0x17, 0x78, 0x68, 0x3b, 0x79, 0x76, 0x79, 0xef, 0x78, 0xb2, 0x9b, + 0x56, 0x8c, 0x17, 0x69, 0xe5, 0xf1, 0x59, 0xfd, 0x68, 0x92, 0x7f, 0x3e, + 0x26, 0x3d, 0x35, 0x79, 0x3f, 0x5a, 0x2d, 0x38, 0x41, 0x31, 0xfd, 0x8f, + 0xd6, 0xa4, 0x35, 0xa5, 0x37, 0xb5, 0xa1, 0xc8, 0xab, 0x4b, 0x9f, 0x56, + 0x75, 0x3d, 0x56, 0xd7, 0x75, 0x75, 0x7b, 0x94, 0xc7, 0x6b, 0x74, 0x3e, + 0xff, 0x42, 0x92, 0xe4, 0x0b, 0x2b, 0xfd, 0xc6, 0x72, 0xdd, 0x0f, 0x76, + 0xd2, 0x7b, 0xb9, 0xbf, 0x67, 0x3c, 0xc9, 0x28, 0xad, 0x18, 0x2f, 0xd2, + 0xca, 0xe3, 0xb3, 0xfa, 0xc0, 0xfd, 0xdd, 0xbc, 0xfa, 0x7c, 0xaf, 0x36, + 0x3d, 0xc9, 0xbe, 0xbc, 0x22, 0xbd, 0xad, 0x62, 0xfa, 0xf2, 0x74, 0xe5, + 0x3a, 0xc7, 0xa5, 0x37, 0xb5, 0xa1, 0xa9, 0xdd, 0xd3, 0xaa, 0xae, 0xc7, + 0xea, 0xba, 0xae, 0x6e, 0x8f, 0xf2, 0x78, 0x9d, 0x1f, 0xb8, 0x3a, 0x98, + 0xae, 0xff, 0x5f, 0x38, 0xae, 0xf7, 0xd5, 0x79, 0xb3, 0x1d, 0xd7, 0xff, + 0xb7, 0xe3, 0xfa, 0x56, 0x3b, 0xae, 0x9f, 0x7a, 0xef, 0x9f, 0x34, 0x96, + 0x7b, 0xef, 0x07, 0xcf, 0xe4, 0xed, 0x97, 0xaf, 0xed, 0x19, 0x4f, 0x32, + 0x4a, 0x2b, 0xc6, 0x8b, 0xb4, 0xf2, 0xf8, 0xac, 0x2e, 0x7c, 0xf4, 0x5b, + 0xb2, 0xfe, 0xdb, 0x7f, 0x54, 0x9b, 0x9e, 0x64, 0x5f, 0x5e, 0x91, 0xde, + 0x56, 0x31, 0x7d, 0x79, 0xba, 0x72, 0x9d, 0xe3, 0xd2, 0x9b, 0xda, 0xd0, + 0xd4, 0xee, 0x69, 0x55, 0xd7, 0x63, 0x75, 0x5d, 0x57, 0xb7, 0x47, 0x79, + 0xbc, 0xce, 0xa3, 0x6f, 0xbf, 0x27, 0x49, 0xf2, 0x85, 0xfe, 0xb9, 0xc6, + 0x72, 0xdd, 0x33, 0xdb, 0xe9, 0x5d, 0x5b, 0xde, 0x33, 0x9e, 0x64, 0x94, + 0x56, 0x8c, 0x17, 0x69, 0xe5, 0xf1, 0x59, 0x7d, 0xe0, 0xae, 0xe4, 0xd5, + 0xcb, 0xf5, 0xe9, 0xc9, 0xfe, 0xbc, 0x22, 0xbd, 0xad, 0x62, 0xfa, 0xf2, + 0x74, 0xe5, 0x3a, 0xc7, 0xa5, 0x37, 0xb5, 0xa1, 0xc8, 0xab, 0x4b, 0x9f, + 0x56, 0x75, 0x3d, 0x56, 0xd7, 0x75, 0x75, 0x7b, 0x94, 0xc7, 0xeb, 0xfc, + 0x40, 0x67, 0x23, 0x49, 0xf2, 0x85, 0x6b, 0x27, 0x70, 0x5b, 0xaf, 0x9e, + 0xce, 0xab, 0x5b, 0xd7, 0x6b, 0xd3, 0x93, 0xec, 0xcb, 0x2b, 0xd2, 0xdb, + 0x2a, 0xa6, 0x2f, 0x4f, 0x57, 0xae, 0x73, 0x5c, 0x7a, 0x53, 0x1b, 0x9a, + 0xda, 0x3d, 0xad, 0xb9, 0x6f, 0xeb, 0x33, 0xc3, 0x6d, 0xed, 0x7c, 0xbd, + 0xaf, 0xce, 0x9b, 0xf5, 0x7c, 0xfd, 0xdd, 0x7f, 0xf2, 0x54, 0x63, 0xb9, + 0xef, 0x3c, 0xf3, 0xde, 0xfc, 0xde, 0xb5, 0xb7, 0xf7, 0x8c, 0x27, 0x19, + 0xa5, 0x15, 0xe3, 0x45, 0x5a, 0x79, 0x7c, 0x56, 0x0f, 0x7e, 0xcb, 0x85, + 0x3c, 0xf7, 0x47, 0xeb, 0xb5, 0xe9, 0x49, 0xf6, 0xe5, 0x15, 0xe9, 0x6d, + 0x15, 0xd3, 0x97, 0xa7, 0x2b, 0xd7, 0x39, 0x2e, 0xbd, 0xa9, 0x0d, 0x4d, + 0xed, 0x9e, 0x56, 0x75, 0x3d, 0x56, 0xd7, 0x75, 0x75, 0x7b, 0x94, 0xc7, + 0xeb, 0xfc, 0x9b, 0xf7, 0x3c, 0x9a, 0xe4, 0x84, 0xf6, 0xe1, 0xce, 0xd7, + 0x87, 0xd2, 0x87, 0x3b, 0xae, 0xf7, 0xa6, 0x35, 0xa5, 0x37, 0xb5, 0xa1, + 0xa9, 0xdd, 0xd3, 0x3a, 0xac, 0xe3, 0xda, 0x3d, 0xd7, 0xde, 0xb4, 0xa6, + 0xf4, 0xa6, 0x36, 0x34, 0xb5, 0x7b, 0x5a, 0x87, 0x76, 0xcf, 0xe5, 0xda, + 0x6c, 0x5f, 0x9d, 0x37, 0xeb, 0xb5, 0xd9, 0xc5, 0x6b, 0x5f, 0x68, 0x2c, + 0x77, 0xcf, 0x99, 0x6e, 0xbe, 0x76, 0xad, 0xb7, 0x67, 0x3c, 0xc9, 0x28, + 0xad, 0x18, 0x2f, 0xd2, 0xca, 0xe3, 0xb3, 0x7a, 0xb8, 0xfb, 0x81, 0x3c, + 0xd3, 0x7b, 0xb5, 0x36, 0x3d, 0xc9, 0xbe, 0xbc, 0x22, 0xbd, 0xad, 0x62, + 0xfa, 0xf2, 0x74, 0xe5, 0x3a, 0xc7, 0xa5, 0x37, 0xb5, 0xa1, 0xa9, 0xdd, + 0xd3, 0xaa, 0xae, 0xc7, 0xea, 0xba, 0xae, 0x6e, 0x8f, 0xf2, 0x78, 0x9d, + 0x4b, 0x67, 0x7e, 0x20, 0x89, 0x3e, 0xbc, 0x9a, 0xd6, 0x94, 0xde, 0xd4, + 0x86, 0xa6, 0x76, 0x4f, 0xcb, 0x73, 0x33, 0xd7, 0xe1, 0x07, 0x7d, 0x6e, + 0xe6, 0x77, 0xae, 0x9a, 0x3a, 0x6f, 0xd2, 0xdf, 0xb9, 0xfe, 0xc3, 0x5f, + 0xf9, 0xcf, 0x9a, 0xe7, 0xfb, 0xfd, 0xdb, 0xc9, 0x6f, 0x2e, 0xef, 0x1d, + 0x4f, 0x76, 0xd3, 0xbe, 0xbf, 0xd4, 0xa6, 0xdf, 0x5c, 0xde, 0x3b, 0x3e, + 0xab, 0x1f, 0x4b, 0xf2, 0x6b, 0x63, 0xd2, 0x53, 0x93, 0xf7, 0x63, 0xd5, + 0x82, 0x13, 0x14, 0xd3, 0xff, 0x58, 0x4d, 0x5a, 0x53, 0x7a, 0x53, 0x1b, + 0x8a, 0xbc, 0xba, 0xf4, 0x69, 0x55, 0xd7, 0x63, 0x75, 0x5d, 0x57, 0xb7, + 0xc7, 0x6f, 0x36, 0x6f, 0xeb, 0x77, 0xff, 0x8b, 0x7f, 0x9d, 0x44, 0x1f, + 0x5e, 0x4d, 0x6b, 0x4a, 0x6f, 0x6a, 0x43, 0x91, 0x77, 0x12, 0xfb, 0xf0, + 0xbf, 0x72, 0xe6, 0x0d, 0xc7, 0x74, 0x35, 0xad, 0x29, 0xbd, 0xa9, 0x0d, + 0x45, 0xde, 0x09, 0x3e, 0xa6, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x68, 0xef, 0x54, 0x92, 0x1b, 0xc7, 0xdd, 0x08, 0x00, 0xb8, 0xd5, 0x74, + 0xbb, 0xdd, 0x41, 0x50, 0xad, 0x27, 0xe7, 0xf0, 0x22, 0xda, 0x21, 0xba, + 0x9e, 0x17, 0x72, 0x3a, 0xf7, 0xe5, 0x7a, 0x06, 0x2f, 0xd7, 0x9e, 0xce, + 0x7d, 0xa3, 0xf4, 0x42, 0x39, 0x7f, 0x1e, 0xaa, 0xf5, 0x55, 0xe7, 0x59, + 0xe4, 0x17, 0xe9, 0x27, 0xd6, 0x27, 0x96, 0x07, 0x41, 0xb5, 0x96, 0x06, + 0x1f, 0x8c, 0xdd, 0xf7, 0x93, 0xab, 0xc7, 0xdd, 0xa2, 0x66, 0x7f, 0x63, + 0x23, 0xf9, 0xc5, 0x73, 0x83, 0x7f, 0x93, 0xc1, 0x70, 0x91, 0x5e, 0x28, + 0xe7, 0xcf, 0x43, 0xb5, 0xbe, 0xea, 0x3c, 0x8b, 0xfc, 0x5f, 0x6c, 0x7e, + 0xd1, 0xf7, 0xb8, 0xbd, 0xf0, 0xf3, 0x5b, 0x7b, 0x83, 0x6a, 0x39, 0xae, + 0xf7, 0xb9, 0xa9, 0x8e, 0xeb, 0x52, 0x50, 0x2d, 0xc7, 0x75, 0x8d, 0x9b, + 0xec, 0xb8, 0x5e, 0xca, 0x52, 0x9e, 0x7a, 0xef, 0x9f, 0xe4, 0xa3, 0x9f, + 0x7c, 0xff, 0x71, 0x37, 0xa9, 0xd9, 0x27, 0x5f, 0x4b, 0x7e, 0xe1, 0x8e, + 0xc1, 0xbf, 0xc9, 0x60, 0xb8, 0x48, 0x2f, 0x94, 0xf3, 0xe7, 0xa1, 0x5a, + 0x5f, 0x75, 0x9e, 0x45, 0x7e, 0x91, 0x7e, 0x42, 0xfd, 0xf6, 0x2f, 0xbc, + 0x95, 0x47, 0xdf, 0x7e, 0x4f, 0x76, 0x76, 0x76, 0xf2, 0x85, 0xfe, 0xb9, + 0xdc, 0xf7, 0xa1, 0x93, 0xdd, 0x87, 0xe7, 0x77, 0x36, 0x92, 0xef, 0x3d, + 0x37, 0xf8, 0x37, 0x19, 0x0c, 0x17, 0xe9, 0x85, 0x72, 0xfe, 0x3c, 0x54, + 0xeb, 0xab, 0xce, 0xb3, 0xc8, 0xff, 0xde, 0x13, 0x7e, 0x5c, 0xbf, 0xb4, + 0x3c, 0xf8, 0x38, 0x70, 0x69, 0x10, 0x90, 0xe5, 0xbe, 0xf3, 0xcd, 0x1f, + 0x83, 0x1f, 0xbb, 0x97, 0x5f, 0x4d, 0x3e, 0xf8, 0x81, 0xc1, 0xbf, 0xc9, + 0x60, 0xb8, 0x48, 0x2f, 0x94, 0xf3, 0xe7, 0xa1, 0x5a, 0x5f, 0x75, 0x9e, + 0x45, 0xfe, 0x07, 0xa7, 0xfb, 0xb8, 0xfc, 0xa8, 0xbd, 0xf0, 0x7a, 0x67, + 0x4f, 0x50, 0x2d, 0xe7, 0xeb, 0x1a, 0x37, 0xe1, 0xf9, 0xfa, 0xbb, 0xff, + 0xe4, 0xa9, 0xfc, 0xf7, 0xef, 0xff, 0xe8, 0x71, 0x37, 0xa9, 0xd1, 0x7f, + 0xfe, 0x5a, 0xf2, 0x2f, 0xef, 0x18, 0xfc, 0x9b, 0x0c, 0x86, 0x8b, 0xf4, + 0x42, 0x39, 0x7f, 0x1e, 0xaa, 0xf5, 0x55, 0xe7, 0x59, 0xe4, 0xff, 0xcb, + 0x93, 0x7d, 0xba, 0xce, 0x3f, 0x78, 0xeb, 0xb7, 0xf3, 0x6f, 0xde, 0xf3, + 0x68, 0x76, 0xb2, 0x33, 0xe8, 0xc3, 0x9d, 0xaf, 0xf7, 0xbb, 0x99, 0xce, + 0xd7, 0x67, 0x36, 0x1c, 0xd7, 0x0d, 0x6e, 0xb6, 0xe3, 0x3a, 0x89, 0x7b, + 0xae, 0x71, 0x6e, 0xb6, 0x7b, 0xae, 0xec, 0xb8, 0x36, 0x1b, 0xe7, 0x26, + 0xbb, 0x36, 0x4b, 0x06, 0x41, 0xb5, 0xfe, 0xce, 0xed, 0x27, 0xfb, 0x39, + 0xdf, 0x83, 0xaf, 0x25, 0xcf, 0xdd, 0x31, 0xf8, 0x37, 0x19, 0x0c, 0x17, + 0xe9, 0x85, 0x72, 0xfe, 0x3c, 0x54, 0xeb, 0xab, 0xce, 0xb3, 0xc8, 0x7f, + 0xee, 0x64, 0x1f, 0xd6, 0xf9, 0x7b, 0x6f, 0xbe, 0x90, 0x4b, 0x67, 0x7e, + 0xc0, 0x73, 0xb3, 0x26, 0x37, 0x5b, 0x1f, 0xee, 0xb9, 0xd9, 0x78, 0x37, + 0xd3, 0x75, 0xf8, 0xf0, 0xb9, 0x99, 0xdf, 0xb9, 0xea, 0xdd, 0x6c, 0xbf, + 0x73, 0x2d, 0x65, 0x69, 0x10, 0x80, 0xe7, 0x97, 0x4e, 0xf6, 0xb6, 0xee, + 0xe5, 0x85, 0x74, 0x73, 0x5f, 0x7a, 0xc3, 0xf5, 0xdc, 0x1d, 0xae, 0xdf, + 0x5e, 0x69, 0x5b, 0x94, 0xf3, 0xe7, 0xa1, 0x5a, 0x5f, 0x75, 0x9e, 0x45, + 0x7e, 0xf7, 0xa4, 0x6f, 0xeb, 0xbf, 0xbe, 0x9c, 0x77, 0xff, 0x8b, 0x7f, + 0xad, 0x0f, 0x6f, 0x72, 0x13, 0xf5, 0xe1, 0xa3, 0xa0, 0x5a, 0x8e, 0xe9, + 0x7d, 0x6e, 0xb6, 0x63, 0xfa, 0xea, 0xd5, 0xab, 0xa7, 0x8e, 0xbb, 0x29, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8b, 0x44, 0x50, 0x2d, 0x00, + 0x38, 0x06, 0xe5, 0xa0, 0x5a, 0xfd, 0xb3, 0xf5, 0x2f, 0xfe, 0x75, 0xee, + 0xea, 0xa4, 0x7f, 0xb9, 0x3f, 0x1a, 0x4e, 0x92, 0xfe, 0xe5, 0xfe, 0x68, + 0x98, 0xa3, 0x53, 0x5e, 0xef, 0xe5, 0x6d, 0x52, 0x0c, 0x57, 0x75, 0xae, + 0x9c, 0xab, 0x0d, 0xaa, 0xf5, 0xe8, 0x4f, 0x6d, 0xd6, 0x96, 0x5f, 0xbd, + 0xbd, 0x9b, 0xad, 0x37, 0x7b, 0xa3, 0xe1, 0x24, 0xd9, 0x7a, 0xb3, 0x37, + 0x1a, 0xe6, 0xe8, 0x94, 0xd7, 0x7b, 0x79, 0x9b, 0x14, 0xc3, 0x55, 0x4f, + 0xfd, 0xc3, 0xb5, 0xda, 0xa0, 0x5a, 0x8e, 0xeb, 0x93, 0x6f, 0xe6, 0xe3, + 0xba, 0x12, 0x54, 0xcb, 0x71, 0x7d, 0xf2, 0x1d, 0xe4, 0xb8, 0x2e, 0x7f, + 0x1c, 0xf8, 0xc8, 0xdf, 0xdc, 0xac, 0x2d, 0xff, 0x6d, 0xb7, 0x9f, 0xc9, + 0x1b, 0x6f, 0x5e, 0x1b, 0x0d, 0x27, 0xc9, 0x1b, 0x6f, 0x5e, 0x1b, 0x0d, + 0x73, 0x74, 0xca, 0xeb, 0xbd, 0xbc, 0x4d, 0x8a, 0xe1, 0xaa, 0xa7, 0xff, + 0xf7, 0xb5, 0xda, 0x8f, 0x03, 0x1f, 0xfd, 0x4a, 0x7d, 0xfd, 0xab, 0x67, + 0x92, 0xad, 0x6b, 0xbb, 0xc3, 0xc9, 0x60, 0x7c, 0xd5, 0xa6, 0x3e, 0x72, + 0xe5, 0xf5, 0x5e, 0xde, 0x26, 0x5b, 0xf5, 0x9b, 0x3a, 0x4f, 0x7d, 0xa4, + 0x3e, 0xa8, 0xd6, 0xa3, 0xaf, 0xd4, 0x7f, 0x60, 0xb2, 0xda, 0xed, 0x64, + 0xab, 0xd7, 0x1f, 0x0d, 0x27, 0xc9, 0x56, 0xaf, 0x3f, 0x1a, 0xe6, 0xe8, + 0x94, 0xd7, 0x7b, 0x79, 0x9b, 0x14, 0xc3, 0x55, 0x4f, 0xdd, 0xbd, 0x5c, + 0x1b, 0x54, 0xeb, 0xd1, 0x4f, 0x6e, 0xd6, 0x96, 0x5f, 0x5d, 0x5d, 0xcd, + 0xd6, 0xd6, 0xd6, 0x68, 0x38, 0x49, 0xb6, 0xb6, 0xb6, 0x46, 0xc3, 0x1c, + 0x9d, 0xf2, 0x7a, 0x2f, 0x6f, 0x93, 0x62, 0xb8, 0xea, 0xa9, 0x5f, 0x58, + 0xab, 0x0d, 0xaa, 0xf5, 0xf1, 0xcd, 0x47, 0x6a, 0xcb, 0xff, 0xc5, 0x33, + 0xdf, 0x96, 0x7f, 0x77, 0xed, 0x8d, 0xd1, 0x70, 0x92, 0xfc, 0xbb, 0x6b, + 0x6f, 0x8c, 0x86, 0x39, 0x3a, 0xe5, 0xf5, 0x5e, 0xde, 0x26, 0xc5, 0x70, + 0xd5, 0xe7, 0xd6, 0x9e, 0xae, 0x0d, 0xaa, 0xe5, 0x7c, 0x7d, 0xf2, 0xcd, + 0x7c, 0xbe, 0xae, 0x04, 0xd5, 0x72, 0x5c, 0x9f, 0x7c, 0x07, 0x39, 0xae, + 0x93, 0xb8, 0xe7, 0x5a, 0x20, 0x07, 0xba, 0xe7, 0x2a, 0x05, 0xd5, 0x1a, + 0x7b, 0x6d, 0xb6, 0xd6, 0xcd, 0xd6, 0x66, 0x6f, 0x34, 0x9c, 0x24, 0x5b, + 0x9b, 0xbd, 0xd1, 0x30, 0x47, 0xa7, 0xbc, 0xde, 0xcb, 0xdb, 0xa4, 0x18, + 0xae, 0x2a, 0x5f, 0x9b, 0x25, 0xbb, 0x41, 0xb5, 0x1e, 0xdd, 0x7c, 0xb4, + 0xb6, 0xfc, 0xd9, 0x33, 0xab, 0xb9, 0x72, 0x6d, 0x6b, 0x34, 0x9c, 0x24, + 0x57, 0xae, 0x6d, 0x8d, 0x86, 0x39, 0x3a, 0xe5, 0xf5, 0x5e, 0xde, 0x26, + 0xc5, 0x70, 0xd5, 0x53, 0x6b, 0x4f, 0xd5, 0x06, 0xd5, 0xd2, 0x87, 0x9f, + 0x7c, 0x9e, 0x9b, 0xdd, 0x3a, 0x0e, 0xfa, 0xdc, 0xcc, 0xef, 0x5c, 0x8b, + 0xe3, 0x20, 0xbf, 0x73, 0x95, 0x83, 0x6a, 0xfd, 0xc9, 0xfb, 0xff, 0x9f, + 0xda, 0xf2, 0xdf, 0x74, 0xd7, 0x5f, 0xc8, 0x9f, 0x5d, 0xfe, 0xd3, 0xd1, + 0x70, 0x92, 0xfc, 0xd9, 0xe5, 0x3f, 0x1d, 0x0d, 0x73, 0x74, 0xca, 0xeb, + 0xbd, 0xbc, 0x4d, 0x8a, 0xe1, 0xaa, 0xf7, 0xbc, 0xf5, 0x9f, 0xd4, 0x06, + 0xd5, 0xd2, 0x87, 0x9f, 0x7c, 0xb3, 0xf6, 0xe1, 0xe5, 0xa0, 0x5a, 0xe3, + 0x8e, 0xe9, 0xef, 0xf9, 0x8e, 0xef, 0xc8, 0x97, 0xff, 0xe0, 0x0f, 0x46, + 0xc3, 0x49, 0xf2, 0xe5, 0x3f, 0xf8, 0x83, 0xd1, 0x30, 0x47, 0xa7, 0xbc, + 0xde, 0xcb, 0xdb, 0xa4, 0x18, 0xae, 0x2a, 0x1f, 0xd3, 0x82, 0x6a, 0x01, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4c, 0x67, 0xe9, 0xb8, 0x1b, 0x00, + 0x00, 0x24, 0x17, 0x56, 0x2f, 0x24, 0x49, 0xba, 0x2b, 0xcb, 0xe9, 0x5d, + 0x1b, 0x7e, 0xdc, 0xdf, 0x4f, 0x3a, 0x6b, 0x49, 0x96, 0x4e, 0xa7, 0x7f, + 0xed, 0x7a, 0xb6, 0xaf, 0xf5, 0x92, 0x6e, 0x92, 0xcd, 0xc1, 0x8b, 0xb0, + 0xbd, 0xde, 0x76, 0x56, 0x57, 0x77, 0xff, 0x2a, 0x66, 0xbf, 0xdf, 0x4b, + 0x6f, 0x6b, 0x23, 0x9d, 0x4e, 0x27, 0xfd, 0x7e, 0x3f, 0xfd, 0x9d, 0xe1, + 0xcb, 0xb3, 0x4b, 0x9d, 0xf4, 0x77, 0xfa, 0xe9, 0x2c, 0x0d, 0x5f, 0xaa, + 0x1d, 0x0e, 0x17, 0xf9, 0x6d, 0x55, 0xeb, 0x29, 0xea, 0x2a, 0xf2, 0x46, + 0xe5, 0xc6, 0xcc, 0x7f, 0x9a, 0x3a, 0xeb, 0xe6, 0xd1, 0xa6, 0x7d, 0x75, + 0xd3, 0x77, 0x3a, 0xa5, 0xba, 0x86, 0xed, 0x2a, 0xb7, 0xa9, 0x5c, 0xb6, + 0x6e, 0x7e, 0xf7, 0x7e, 0xe4, 0xde, 0x5c, 0xe9, 0x5c, 0xc9, 0xe6, 0xf3, + 0x9b, 0xe9, 0x74, 0x3a, 0xe9, 0x14, 0xcb, 0xf8, 0x95, 0x5e, 0x3a, 0x75, + 0xed, 0xed, 0x36, 0x7f, 0xe4, 0x75, 0xe5, 0xae, 0x8b, 0x45, 0xc3, 0x76, + 0xd3, 0x92, 0x64, 0x65, 0x30, 0xbc, 0x71, 0xad, 0x78, 0xe9, 0x79, 0x90, + 0xde, 0xdf, 0x49, 0x3a, 0xd5, 0x2b, 0xb6, 0x4e, 0xc3, 0x8b, 0xe9, 0xfd, + 0x7e, 0xfa, 0x3b, 0xc3, 0x62, 0x2d, 0xa6, 0xeb, 0x5f, 0xeb, 0xef, 0x2f, + 0x57, 0xce, 0x1f, 0x57, 0x57, 0x4d, 0x7d, 0xfd, 0xa2, 0xed, 0x4b, 0xfb, + 0xcb, 0x14, 0x79, 0x93, 0xd4, 0x4d, 0x3b, 0xb6, 0x6d, 0xa5, 0x3a, 0x9b, + 0xa6, 0xab, 0x6d, 0xd7, 0x38, 0xc3, 0xf5, 0x9e, 0x24, 0xf9, 0xae, 0x41, + 0x3d, 0xe5, 0xed, 0x53, 0xae, 0xef, 0xdc, 0xeb, 0x97, 0x1a, 0xab, 0xfa, + 0x1b, 0xd7, 0xfa, 0xe9, 0xa7, 0x9f, 0xf2, 0x67, 0x07, 0xe7, 0x5e, 0x4a, + 0x36, 0x92, 0x2c, 0xef, 0x24, 0xdb, 0x2f, 0x25, 0x17, 0x32, 0x98, 0xc7, + 0xfa, 0x4b, 0x83, 0x0f, 0xd2, 0xce, 0x25, 0xa3, 0xf2, 0xc5, 0xd1, 0xbd, + 0x91, 0xe4, 0xec, 0x4e, 0xd2, 0x5d, 0xea, 0x64, 0x3d, 0x83, 0x79, 0x5f, + 0xc8, 0xde, 0xe1, 0xad, 0x9d, 0x7e, 0xba, 0x4b, 0x49, 0x6f, 0x27, 0x59, + 0x5d, 0x1a, 0x8c, 0x6f, 0x2f, 0x25, 0x2f, 0x5e, 0x4b, 0x1e, 0xe9, 0xec, + 0x2e, 0x7b, 0x27, 0x9d, 0x3d, 0x6d, 0x3a, 0x5b, 0xd9, 0xbf, 0x7a, 0x3b, + 0x49, 0x77, 0x29, 0x79, 0x7a, 0xa7, 0x9b, 0xb3, 0x3b, 0xbd, 0xac, 0x76, + 0x92, 0x4b, 0x3b, 0xdd, 0xf4, 0xfb, 0x7b, 0x3f, 0x98, 0xeb, 0x74, 0x2a, + 0x69, 0xc3, 0x97, 0x7b, 0x2f, 0x9c, 0xbf, 0x90, 0x8d, 0x37, 0x37, 0xd2, + 0x3d, 0xd3, 0xcd, 0xd6, 0xe6, 0xd6, 0xa8, 0x5c, 0xf5, 0xdf, 0x72, 0x1d, + 0xd5, 0xba, 0xea, 0xca, 0x34, 0x19, 0x95, 0x39, 0xb3, 0xdb, 0xff, 0x9c, + 0xbb, 0xfd, 0x5c, 0xae, 0xf7, 0xaf, 0xa7, 0x77, 0xad, 0x97, 0xfe, 0xd5, + 0x7e, 0xed, 0xfc, 0xba, 0x9d, 0x6e, 0xfa, 0xcf, 0x0f, 0x3e, 0x0e, 0xeb, + 0x16, 0x75, 0x6c, 0x25, 0x75, 0x7b, 0x5d, 0x7f, 0xb5, 0xf9, 0xb8, 0x7e, + 0x7a, 0xa7, 0x26, 0xb1, 0xfc, 0x91, 0xe1, 0xb8, 0xe1, 0x43, 0xd0, 0xa9, + 0xec, 0xff, 0x9d, 0x33, 0x83, 0xf1, 0xce, 0x52, 0x67, 0x94, 0x77, 0xba, + 0x73, 0x7a, 0x37, 0xbd, 0xd3, 0xa9, 0x9d, 0x6e, 0x16, 0x5f, 0xfa, 0xad, + 0x2f, 0xb5, 0x0e, 0x42, 0x52, 0x0d, 0x60, 0x32, 0xef, 0xf2, 0xc5, 0x34, + 0x9d, 0xa5, 0xa4, 0xbb, 0xb2, 0x9a, 0x14, 0xdd, 0xc5, 0xca, 0x70, 0xfa, + 0x7e, 0x69, 0xb8, 0x54, 0xfe, 0x91, 0x09, 0xfd, 0xc4, 0xcb, 0xdf, 0xf7, + 0x7d, 0x79, 0xfd, 0xb5, 0xd7, 0xf2, 0xd0, 0x43, 0x0f, 0x25, 0x49, 0xce, + 0xdf, 0x71, 0x47, 0x6e, 0x24, 0xb9, 0x7d, 0x98, 0x5f, 0x44, 0xac, 0xbe, + 0x3d, 0xc9, 0x13, 0x4f, 0x3c, 0xd1, 0xaa, 0x9d, 0xe7, 0xef, 0xb8, 0x23, + 0x77, 0x9c, 0x3f, 0x9f, 0xd7, 0x5e, 0x7f, 0x3d, 0x0f, 0x3d, 0xf4, 0x50, + 0x9e, 0x7d, 0xf6, 0xd9, 0x3c, 0xf1, 0xc4, 0x13, 0x79, 0xe8, 0xfc, 0xf9, + 0xdc, 0xf1, 0xf0, 0xc3, 0x79, 0xe2, 0x89, 0x27, 0xf2, 0xf3, 0x4f, 0x3c, + 0x91, 0xf3, 0x77, 0xdc, 0xd1, 0xaa, 0xbe, 0x69, 0xbc, 0xfe, 0xda, 0x6b, + 0xf9, 0xf6, 0x6f, 0xff, 0xf6, 0x89, 0xe5, 0x3e, 0xf6, 0xb1, 0x8f, 0xe5, + 0x6f, 0xde, 0x75, 0xd7, 0x81, 0xe7, 0x77, 0x3e, 0xc9, 0xeb, 0x0d, 0xe3, + 0xd5, 0xb2, 0x19, 0xe6, 0x9f, 0x4f, 0x72, 0x47, 0xcd, 0xfa, 0x2c, 0xd6, + 0x57, 0xe1, 0xf6, 0xec, 0xdd, 0x06, 0x19, 0x8e, 0xdf, 0x9e, 0xfd, 0xde, + 0xfc, 0x5b, 0x7f, 0xab, 0xb1, 0xad, 0x4f, 0xef, 0x6c, 0x26, 0x49, 0xfe, + 0xd9, 0xaf, 0xfc, 0xb3, 0xfc, 0xc4, 0x7f, 0xf5, 0x13, 0x83, 0xc4, 0xe1, + 0xe1, 0xfb, 0xeb, 0xbf, 0xf6, 0xeb, 0xf9, 0x91, 0x1f, 0xfb, 0x91, 0xdd, + 0xc2, 0x07, 0x38, 0xac, 0x27, 0x1d, 0x79, 0x75, 0x67, 0xcf, 0xa6, 0x1e, + 0xa9, 0xdf, 0xa2, 0xce, 0x6a, 0xdd, 0x6d, 0xa7, 0x29, 0xca, 0xff, 0xf4, + 0xcf, 0xfc, 0x74, 0x7e, 0xf9, 0x1f, 0xff, 0x72, 0x7a, 0xbd, 0xc3, 0xed, + 0xcf, 0x26, 0xaa, 0xce, 0x7e, 0x4c, 0x73, 0x1e, 0x59, 0x5a, 0x6b, 0xac, + 0xe6, 0xe9, 0xe1, 0xd2, 0xaf, 0xad, 0x2d, 0xe7, 0xec, 0xe6, 0x7a, 0x92, + 0xe4, 0xca, 0x5d, 0x0f, 0x0e, 0xaa, 0xfc, 0xca, 0x0b, 0x79, 0xba, 0x57, + 0xac, 0x9d, 0x4e, 0x2e, 0xac, 0x9e, 0x4d, 0xf7, 0xf2, 0xa5, 0x2c, 0xa7, + 0x93, 0xeb, 0xf7, 0x0f, 0xca, 0x6c, 0x75, 0xfa, 0xc9, 0xe6, 0x76, 0xd6, + 0x3f, 0xfe, 0x70, 0x1e, 0x29, 0xfa, 0xd2, 0xad, 0x8d, 0x9c, 0x7b, 0x79, + 0x3d, 0x5f, 0x4b, 0x92, 0x87, 0x1e, 0x4e, 0x92, 0x6c, 0xfc, 0x1f, 0xbf, + 0x9a, 0xcd, 0x8b, 0x17, 0x93, 0x2b, 0x5b, 0xc9, 0x7b, 0x5f, 0xcd, 0xc5, + 0x9d, 0xfb, 0x72, 0xf6, 0xd2, 0xa5, 0x74, 0xae, 0x6d, 0xa7, 0xff, 0xc3, + 0x83, 0x60, 0x21, 0x57, 0xd6, 0xd7, 0x73, 0xe9, 0xcc, 0xa5, 0xa4, 0x7f, + 0x5f, 0x72, 0x6e, 0x2d, 0xb9, 0x74, 0x29, 0x17, 0xfb, 0xcb, 0x39, 0xf7, + 0xbb, 0x5f, 0x1b, 0xd4, 0xfb, 0x43, 0x83, 0x72, 0x1b, 0x9b, 0x9b, 0xb9, + 0xf4, 0xbb, 0xaf, 0x0e, 0x96, 0xef, 0x87, 0x1e, 0xce, 0xc6, 0xe6, 0xe6, + 0xbe, 0x32, 0x57, 0xb6, 0x36, 0xd3, 0xfb, 0xca, 0x0b, 0x59, 0x4f, 0x37, + 0xbf, 0xfe, 0xf4, 0xff, 0x9a, 0xa7, 0x9f, 0xf8, 0x91, 0xfc, 0xea, 0xf3, + 0xbb, 0xeb, 0xe2, 0x42, 0x77, 0x73, 0x34, 0x7c, 0xef, 0x87, 0x92, 0x47, + 0x3e, 0xfd, 0x1b, 0x79, 0xfa, 0x89, 0x1f, 0xcc, 0x93, 0xbf, 0x55, 0x5f, + 0xe6, 0xa7, 0x7f, 0x32, 0x79, 0xe1, 0xc5, 0xe4, 0xc9, 0x4f, 0xff, 0x46, + 0xf2, 0xd5, 0x17, 0x77, 0x57, 0xe0, 0x9b, 0x57, 0xb2, 0xc7, 0x1b, 0x1b, + 0xc9, 0xd6, 0x56, 0xf2, 0xc3, 0xa5, 0x00, 0x28, 0x2f, 0xbe, 0x90, 0xfc, + 0x56, 0xfd, 0x87, 0x98, 0x93, 0x75, 0x4a, 0xdb, 0x76, 0xb8, 0x7e, 0x7b, + 0xa5, 0xe1, 0x92, 0x47, 0x6a, 0x8f, 0x98, 0x5d, 0x4f, 0xd7, 0x25, 0x96, + 0x03, 0x36, 0x8d, 0x1b, 0x5e, 0x30, 0xf7, 0x26, 0x19, 0xde, 0x71, 0x64, + 0x2b, 0x83, 0x6b, 0xd9, 0x17, 0xc7, 0x94, 0x7d, 0x64, 0x98, 0x5f, 0x2e, + 0x5f, 0xbb, 0x9e, 0x6a, 0xca, 0x6e, 0x26, 0xd9, 0x6e, 0xa8, 0xfb, 0xe1, + 0xec, 0xed, 0xaf, 0x7a, 0x49, 0x9e, 0x69, 0x68, 0xf3, 0xb9, 0x24, 0xbd, + 0xad, 0xad, 0xd1, 0x75, 0xea, 0x8b, 0x49, 0xed, 0x76, 0xb8, 0x37, 0xc9, + 0xd9, 0x31, 0xf5, 0x14, 0x4e, 0xef, 0x7c, 0x7e, 0xdf, 0xde, 0xf0, 0x46, + 0x6f, 0xf0, 0xd7, 0x25, 0x8a, 0xe1, 0x24, 0x39, 0x9d, 0xe4, 0xed, 0x4a, + 0xdf, 0xd1, 0xc9, 0x6e, 0x7f, 0x57, 0xec, 0x65, 0xe3, 0xfa, 0xc9, 0xd3, + 0x63, 0xe6, 0x7f, 0xbd, 0x26, 0xad, 0xda, 0x9e, 0xa2, 0xce, 0xa6, 0xbd, + 0xb6, 0x3c, 0xff, 0x49, 0xea, 0xda, 0x77, 0x52, 0x97, 0xe5, 0x54, 0x76, + 0xb7, 0x41, 0x79, 0x9b, 0x9c, 0xaa, 0x94, 0x4d, 0x92, 0xeb, 0x4b, 0x3f, + 0xdc, 0x50, 0x6b, 0xd2, 0xfd, 0xaf, 0x1f, 0xcc, 0xaf, 0xfe, 0x93, 0x17, + 0xd3, 0xcf, 0xc5, 0x74, 0x3e, 0x9e, 0x7c, 0x62, 0x78, 0x3f, 0xfe, 0xdc, + 0x3f, 0xba, 0x94, 0xfe, 0xc7, 0xcf, 0x25, 0xc3, 0x6b, 0xde, 0x8b, 0x2f, + 0xaf, 0xe7, 0x99, 0x0f, 0x5e, 0xc8, 0xc5, 0x97, 0xd7, 0xc7, 0x3e, 0x2b, + 0x49, 0x06, 0xd7, 0xce, 0xa3, 0xfb, 0xc7, 0xe1, 0xf0, 0xb8, 0xb4, 0xc2, + 0xe9, 0xa5, 0xd3, 0xb9, 0xbe, 0x73, 0x7d, 0xcf, 0x70, 0x39, 0xad, 0x9a, + 0x9e, 0x64, 0x5f, 0x99, 0xba, 0xe9, 0x96, 0x97, 0x97, 0xd3, 0x7f, 0xa7, + 0x9f, 0xce, 0x6d, 0xc3, 0x7b, 0xea, 0xe1, 0xf0, 0xb8, 0xb4, 0x24, 0xfb, + 0xf2, 0x9b, 0xa6, 0x2b, 0xda, 0x31, 0xa9, 0x7d, 0x6d, 0xda, 0x5c, 0xae, + 0xab, 0xea, 0x4a, 0x65, 0x1d, 0x6e, 0x57, 0xd6, 0x61, 0x91, 0x7e, 0xf6, + 0xa5, 0x2b, 0xb5, 0xd3, 0x17, 0xde, 0xb3, 0xf3, 0xf9, 0x3d, 0xe3, 0xb7, + 0x9d, 0x39, 0x95, 0x2b, 0xbd, 0x1b, 0x79, 0x77, 0x31, 0x9f, 0xe1, 0x3e, + 0xf5, 0xee, 0xd2, 0xf0, 0x38, 0xff, 0xf1, 0x99, 0x53, 0xf9, 0xc6, 0xb5, + 0xfd, 0x7f, 0x6b, 0xe6, 0x7d, 0x67, 0x4e, 0xe5, 0x9d, 0x9a, 0xf4, 0x3a, + 0xdf, 0xdf, 0xaa, 0xd4, 0xe1, 0xf8, 0xe8, 0xcf, 0xfe, 0xb9, 0xfc, 0xf6, + 0xff, 0xf8, 0xff, 0x1e, 0x63, 0x0b, 0xf6, 0xfb, 0xee, 0x24, 0xe9, 0x25, + 0x77, 0xfd, 0xd4, 0xbb, 0x72, 0xf9, 0x1f, 0xfe, 0x7f, 0x83, 0xc4, 0xde, + 0x30, 0xbd, 0xe2, 0xf3, 0x13, 0x8e, 0xeb, 0x53, 0x3b, 0x3b, 0xa9, 0xee, + 0x0d, 0xe5, 0x20, 0x3e, 0xe3, 0x86, 0x8f, 0xdb, 0xd9, 0x64, 0x5f, 0xbb, + 0x4f, 0x62, 0x9d, 0xf3, 0x98, 0x47, 0x75, 0xbd, 0x8f, 0xdb, 0x0e, 0xab, + 0x4b, 0xcd, 0x37, 0xd8, 0xdb, 0xf7, 0x3f, 0xbc, 0x2f, 0xad, 0x7b, 0xc7, + 0x85, 0xac, 0xbe, 0xf1, 0x2b, 0xe9, 0xf5, 0x92, 0x4b, 0x57, 0xfb, 0xe9, + 0xf5, 0xfa, 0xb9, 0xb2, 0x94, 0xdc, 0x77, 0xd7, 0x7d, 0xa3, 0x32, 0x17, + 0x2f, 0x5e, 0xcc, 0xa5, 0x4b, 0xcd, 0xcf, 0xe4, 0xca, 0xae, 0xbf, 0xf9, + 0xb5, 0x9c, 0xfe, 0xbe, 0x24, 0xeb, 0xf7, 0xec, 0xeb, 0x07, 0x6f, 0x16, + 0xd7, 0x0f, 0xb8, 0x38, 0xfd, 0xba, 0x3e, 0xfc, 0xf6, 0xdd, 0x7d, 0xe3, + 0xc2, 0x03, 0x83, 0xa7, 0x94, 0x97, 0x5e, 0xdb, 0xd8, 0x77, 0x83, 0xdd, + 0xbf, 0xd6, 0xcb, 0xb9, 0xdf, 0x6d, 0xde, 0x1e, 0xbd, 0x9d, 0xd2, 0x15, + 0xe6, 0xd2, 0x6a, 0x3a, 0x59, 0xce, 0x7a, 0xef, 0xb9, 0xac, 0xae, 0x5c, + 0x4c, 0xff, 0x5a, 0x3f, 0x1b, 0xd7, 0xd6, 0xd3, 0x59, 0xea, 0xa6, 0xb7, + 0xf3, 0x62, 0xd2, 0xbf, 0x77, 0xd8, 0xa6, 0x7e, 0xfa, 0x3b, 0x97, 0xd2, + 0xed, 0x3c, 0x90, 0x5e, 0xff, 0x4b, 0xa3, 0x7f, 0x3b, 0x4b, 0x17, 0xd3, + 0xdf, 0xd9, 0xce, 0xea, 0x99, 0x73, 0xe9, 0xf5, 0x7b, 0xe9, 0xef, 0x6c, + 0x67, 0x6d, 0xf5, 0x9e, 0x6c, 0x6e, 0x3d, 0x97, 0xf2, 0x4d, 0xe1, 0xea, + 0x99, 0x07, 0xd2, 0xeb, 0xf7, 0xd3, 0xdf, 0x59, 0xcf, 0xea, 0x99, 0xfb, + 0xd2, 0xdb, 0xd9, 0x4e, 0xbf, 0x5f, 0xbe, 0x72, 0x5d, 0xcb, 0xea, 0x99, + 0x0f, 0xa4, 0xbf, 0xb3, 0x9d, 0x5e, 0xff, 0x4a, 0xd6, 0x6e, 0xbf, 0x2f, + 0xbd, 0xab, 0x1b, 0xe9, 0xf5, 0xeb, 0xaf, 0x6e, 0xbb, 0x9d, 0x7b, 0xd3, + 0x59, 0x5a, 0x4e, 0xbf, 0x3b, 0xfc, 0xed, 0x66, 0xa9, 0x93, 0xec, 0xf4, + 0x87, 0xff, 0x16, 0xcb, 0x36, 0xbc, 0x26, 0xda, 0x49, 0x8a, 0x2b, 0xa3, + 0xde, 0x9b, 0xeb, 0x75, 0xb5, 0x0d, 0xeb, 0x1c, 0x5c, 0xd5, 0x76, 0x96, + 0x96, 0xb3, 0x75, 0xed, 0x99, 0x7d, 0x6d, 0x1a, 0x37, 0x5c, 0x6d, 0x6b, + 0xb7, 0x73, 0xef, 0xa8, 0x9e, 0xfe, 0xce, 0x76, 0x3a, 0x4b, 0xcb, 0x35, + 0xcb, 0x5b, 0xb6, 0x56, 0x5a, 0x7f, 0x83, 0x6d, 0x57, 0xbd, 0xbd, 0xef, + 0xec, 0x3c, 0x90, 0x7e, 0x7a, 0xe9, 0xef, 0x6c, 0xa4, 0xb3, 0x74, 0x2e, + 0xab, 0x2b, 0x67, 0xb3, 0xb9, 0xf5, 0x4c, 0xba, 0x4b, 0xf5, 0x81, 0x2e, + 0x0b, 0xdf, 0xf9, 0x3d, 0x3b, 0x59, 0x7b, 0xac, 0x3c, 0xa7, 0xb5, 0x3c, + 0xbf, 0xb9, 0x99, 0x47, 0xd6, 0xd6, 0xb2, 0x99, 0xcd, 0x14, 0xdb, 0xe8, + 0x9e, 0xc1, 0x5c, 0x2b, 0xad, 0x1a, 0x94, 0xbd, 0x7f, 0x58, 0xf6, 0xb3, + 0x8f, 0xef, 0xe6, 0x3d, 0xf6, 0xf8, 0x20, 0xed, 0xf9, 0xc7, 0xf7, 0x4c, + 0x92, 0xfb, 0x1f, 0x4b, 0x9e, 0x7f, 0x7e, 0x30, 0xfc, 0xf8, 0x63, 0x6b, + 0xc9, 0xe6, 0x66, 0x9e, 0x4f, 0xb2, 0xb6, 0xb6, 0x5b, 0x66, 0x73, 0x33, + 0xb9, 0x7f, 0x98, 0xf0, 0xfc, 0xe6, 0x66, 0xd6, 0x06, 0xc5, 0x86, 0x65, + 0xd6, 0xb2, 0xb9, 0xb9, 0x99, 0xfb, 0xd7, 0x06, 0xf7, 0x37, 0x75, 0xd3, + 0x3c, 0xfe, 0xd9, 0x52, 0xce, 0xe6, 0x60, 0x9e, 0x45, 0xfd, 0x9b, 0x9b, + 0x83, 0xf9, 0x3f, 0x56, 0x5a, 0xe6, 0x22, 0xbd, 0xda, 0x86, 0xa2, 0x9d, + 0xa3, 0xb6, 0x96, 0xda, 0x53, 0x2e, 0x73, 0xff, 0xfd, 0x83, 0x79, 0x97, + 0xdb, 0xfa, 0xfc, 0x67, 0x93, 0xc7, 0x1e, 0xdf, 0xdb, 0xb6, 0x72, 0xbb, + 0x1e, 0x7f, 0x6c, 0x6d, 0x4f, 0x5d, 0x85, 0xb5, 0xec, 0x2e, 0xc3, 0xa0, + 0x4c, 0x2f, 0x49, 0x2f, 0x6b, 0x6b, 0xc9, 0x7f, 0x34, 0xac, 0xf7, 0xa7, + 0x1e, 0xef, 0xe6, 0xf9, 0xcd, 0xde, 0x9e, 0xf5, 0xf2, 0xd9, 0xcf, 0x26, + 0xcb, 0x5f, 0x6e, 0xee, 0xc3, 0x5f, 0x58, 0x19, 0xfc, 0xde, 0x96, 0x24, + 0xbd, 0xde, 0xf0, 0xbe, 0xad, 0xb4, 0x49, 0xbb, 0x19, 0x3e, 0x77, 0xad, + 0x09, 0xc6, 0x52, 0x3c, 0xc3, 0xef, 0x74, 0x3a, 0xe9, 0x5d, 0xdd, 0x1a, + 0x1c, 0x2d, 0x3b, 0xfd, 0xfa, 0xe7, 0xd3, 0xe5, 0x6b, 0xf5, 0xa5, 0xdd, + 0x79, 0x9e, 0x04, 0x9d, 0xce, 0xfe, 0x27, 0x74, 0xc5, 0xef, 0x0f, 0x95, + 0xd4, 0x51, 0xf9, 0xa2, 0xfd, 0x93, 0x7e, 0xf3, 0x38, 0xb0, 0xa5, 0xa4, + 0x5f, 0x0d, 0x46, 0x3e, 0xe3, 0x73, 0xb3, 0x0b, 0xdd, 0xe5, 0x74, 0x3a, + 0x83, 0x7b, 0xfc, 0xa7, 0x87, 0x55, 0x5e, 0xbc, 0x9a, 0xac, 0xaf, 0x24, + 0xe7, 0xfa, 0xc9, 0xc6, 0x9b, 0xc9, 0xcf, 0xed, 0xf4, 0xf3, 0xa9, 0x4e, + 0xb2, 0xfc, 0x66, 0xb2, 0x3d, 0xea, 0x03, 0x3b, 0x59, 0x5e, 0x1a, 0x8c, + 0x3f, 0xbc, 0x94, 0x3c, 0x53, 0xf7, 0x1b, 0x4a, 0x92, 0xb3, 0x9d, 0xa4, + 0x57, 0xb9, 0x23, 0xed, 0x0e, 0x77, 0xbf, 0xe2, 0xf7, 0xaa, 0xde, 0x70, + 0xda, 0xcf, 0x2c, 0x25, 0x9f, 0xda, 0xd9, 0xfd, 0xb7, 0x5c, 0xef, 0x67, + 0x96, 0x92, 0xbf, 0xb6, 0x73, 0x3d, 0xa7, 0x87, 0x75, 0xad, 0x26, 0xb9, + 0xef, 0x4c, 0x27, 0x8f, 0x2c, 0x75, 0xf2, 0xd7, 0x77, 0xfa, 0x83, 0x37, + 0xe3, 0x4a, 0x6d, 0x18, 0xfd, 0x56, 0x7c, 0xad, 0x9f, 0x73, 0x4b, 0xd7, + 0xb3, 0xb1, 0x73, 0x3a, 0xd7, 0x87, 0x77, 0xc0, 0xa7, 0x33, 0x1c, 0xee, + 0xef, 0x2e, 0x4b, 0x92, 0x9c, 0x5e, 0xea, 0xe7, 0xfa, 0x4e, 0xa7, 0xf1, + 0x06, 0xf8, 0xbe, 0xa5, 0xe4, 0xd2, 0xd2, 0xe9, 0x0c, 0xee, 0xa6, 0x77, + 0x97, 0xab, 0xb3, 0x34, 0x38, 0x3f, 0x5c, 0xcf, 0x6e, 0x1b, 0x93, 0xe4, + 0x7a, 0xff, 0xfa, 0xa0, 0xde, 0xa5, 0xce, 0x9e, 0xf4, 0xf2, 0x3d, 0x67, + 0xf1, 0x56, 0x5f, 0xf5, 0xf7, 0xec, 0x24, 0x39, 0x77, 0x3e, 0xd9, 0xd8, + 0x19, 0x96, 0x29, 0x1e, 0xa8, 0xef, 0x94, 0x86, 0x8b, 0x65, 0x4d, 0xf2, + 0xe2, 0x66, 0xf3, 0x55, 0xdf, 0xc5, 0x3f, 0xfc, 0x8b, 0xa3, 0xe1, 0xdf, + 0x3f, 0xf5, 0x17, 0xf2, 0x97, 0x6e, 0xfc, 0x69, 0xf2, 0x87, 0xbb, 0xe3, + 0x1f, 0xf8, 0xc3, 0xdd, 0xe0, 0x4d, 0x83, 0x9f, 0xc1, 0xdb, 0x00, 0x00, + 0x20, 0x00, 0x49, 0x44, 0x41, 0x54, 0xbf, 0xff, 0xf6, 0x30, 0xbf, 0x5a, + 0x7e, 0x8a, 0xf1, 0xff, 0x66, 0xe5, 0xab, 0xf9, 0xc6, 0x1f, 0xbf, 0x93, + 0x3b, 0xef, 0xbc, 0x33, 0x5f, 0xff, 0xfa, 0xd7, 0xf7, 0xb4, 0xe5, 0x7d, + 0xdf, 0x7c, 0xdb, 0xbe, 0xf6, 0xdd, 0xf5, 0xa1, 0x0f, 0xe7, 0xf2, 0x4b, + 0x5f, 0x4d, 0x92, 0xdc, 0x76, 0xf6, 0x7d, 0xf9, 0xfa, 0xd7, 0xbf, 0x9e, + 0x07, 0x1f, 0x7c, 0x30, 0x6f, 0xbd, 0xf5, 0x56, 0xde, 0xb9, 0xf2, 0x8d, + 0x24, 0xc9, 0x37, 0xfe, 0xf8, 0x9d, 0x7d, 0xd3, 0x15, 0xf5, 0x1f, 0x66, + 0x9d, 0xdf, 0x78, 0xe7, 0x9d, 0xdc, 0xf9, 0x1d, 0x77, 0xee, 0x99, 0x66, + 0x94, 0x37, 0x1c, 0x2e, 0xea, 0x2f, 0xa7, 0x97, 0xeb, 0x7a, 0xf0, 0xc1, + 0x07, 0xf3, 0xdc, 0x73, 0xcf, 0xed, 0x69, 0xe7, 0x6d, 0x67, 0xdf, 0x97, + 0xaf, 0xff, 0xc1, 0xd7, 0xf3, 0xbe, 0xdb, 0x06, 0xd3, 0xbf, 0xb3, 0xbe, + 0xb7, 0xfe, 0xdb, 0x7a, 0xb7, 0xe5, 0x9d, 0x1b, 0x7b, 0xdb, 0xf7, 0x8d, + 0x3f, 0x7e, 0x27, 0x5f, 0xf8, 0x96, 0xf7, 0xed, 0x6b, 0x73, 0xd9, 0xd7, + 0x56, 0x06, 0x1d, 0xc2, 0xf2, 0xca, 0xd9, 0x6c, 0x5f, 0xbd, 0x92, 0xad, + 0x5e, 0x3f, 0xfd, 0xde, 0xa0, 0x1f, 0x7e, 0xf0, 0x23, 0x17, 0xf3, 0xcc, + 0xe5, 0xf5, 0xc1, 0x1f, 0x3a, 0x58, 0x19, 0xec, 0x73, 0xf7, 0x7d, 0xe8, + 0x62, 0xee, 0x3b, 0x7b, 0x3a, 0x5f, 0xbb, 0xf4, 0x6a, 0x9e, 0x7b, 0xb3, + 0x97, 0xcd, 0xad, 0x5e, 0xd6, 0x56, 0xbb, 0xa3, 0x7f, 0xf7, 0xd5, 0xd5, + 0xdf, 0xad, 0xeb, 0xd5, 0xcb, 0xeb, 0xfb, 0xca, 0x25, 0xc9, 0xf6, 0xd5, + 0xc1, 0xfe, 0x38, 0x4b, 0x5d, 0x8f, 0xfc, 0x77, 0x3f, 0x9e, 0xee, 0x57, + 0x5f, 0xc8, 0x3d, 0x17, 0x3f, 0x90, 0x24, 0x79, 0xea, 0xf3, 0x1b, 0x39, + 0xb7, 0x76, 0x3d, 0x4f, 0xbe, 0xb4, 0x99, 0x4f, 0x7c, 0x68, 0x6d, 0xf4, + 0x6f, 0x92, 0xdc, 0x73, 0xf1, 0x03, 0xf9, 0xd4, 0x3f, 0x7e, 0x26, 0x0f, + 0xac, 0x5c, 0xc8, 0x97, 0xae, 0xae, 0xe7, 0x81, 0x95, 0x0b, 0xf9, 0xe9, + 0x9f, 0xfd, 0xf1, 0xfc, 0xe0, 0x27, 0xff, 0x6e, 0x92, 0xec, 0x29, 0xf7, + 0xb5, 0xf5, 0x57, 0xb3, 0x71, 0xf9, 0x74, 0xce, 0xdd, 0x75, 0x3d, 0x8f, + 0x7c, 0xfc, 0xaf, 0xe5, 0xe9, 0xcf, 0xfd, 0x72, 0x9e, 0xfc, 0xf2, 0x66, + 0x3e, 0xf1, 0x3d, 0x6b, 0xa3, 0x75, 0xf7, 0xe4, 0x97, 0x37, 0xf3, 0xc0, + 0xca, 0x85, 0x9c, 0xbb, 0xeb, 0x7a, 0x36, 0x2e, 0x9f, 0xde, 0x5b, 0xd7, + 0xb0, 0xdc, 0x3d, 0x17, 0xea, 0xeb, 0x2a, 0xd2, 0xc7, 0xd5, 0x75, 0xee, + 0xae, 0xeb, 0x79, 0xf2, 0xcb, 0x9b, 0x83, 0xba, 0xee, 0x1e, 0xd4, 0xf5, + 0xf4, 0x70, 0xfe, 0xeb, 0x97, 0x4f, 0xe7, 0xdc, 0x47, 0xf6, 0xd7, 0xd5, + 0x1b, 0x13, 0x24, 0x2d, 0x49, 0x96, 0xfe, 0xf8, 0x5b, 0xf7, 0xa5, 0x7d, + 0xe5, 0xa5, 0x3f, 0xca, 0x52, 0xbe, 0x75, 0x34, 0x9c, 0x24, 0x4b, 0xf9, + 0xd6, 0xd1, 0xf0, 0x3c, 0x9c, 0xff, 0xa6, 0xc1, 0x7b, 0x4f, 0xff, 0xe9, + 0x1d, 0xbb, 0x01, 0xcf, 0x7f, 0xf4, 0xbf, 0x7c, 0x34, 0x2f, 0xfe, 0xab, + 0xdf, 0x4b, 0x92, 0xdc, 0xfb, 0x97, 0xbf, 0x33, 0xff, 0xfc, 0xff, 0x7c, + 0x2a, 0x49, 0xf2, 0x6f, 0x5f, 0x1b, 0x04, 0xe2, 0xfe, 0xa3, 0x7f, 0xbf, + 0x91, 0xb7, 0x6f, 0x9c, 0x9c, 0x73, 0xfc, 0x3c, 0xbd, 0xf7, 0x54, 0x27, + 0x17, 0xff, 0xd2, 0x47, 0x73, 0xe9, 0xf7, 0x7f, 0x3b, 0xdf, 0xf2, 0xe7, + 0x77, 0xdf, 0xed, 0xba, 0x2b, 0xef, 0xcb, 0xd5, 0x97, 0x07, 0xcb, 0xfe, + 0x9e, 0x3f, 0x5b, 0xca, 0xb7, 0xdd, 0xf6, 0x3d, 0xb9, 0xfa, 0xf2, 0x20, + 0xbd, 0xea, 0xf2, 0x37, 0x3d, 0x7f, 0x84, 0x2d, 0x06, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xb8, 0xf9, 0x08, 0xaa, 0x05, 0x00, 0x27, 0xc8, 0x95, + 0xe1, 0x0b, 0x84, 0xa7, 0x87, 0xc1, 0x9b, 0x32, 0xfc, 0x38, 0x71, 0xfb, + 0x5a, 0x6f, 0xf4, 0x61, 0xe9, 0xe9, 0xee, 0x6a, 0xd2, 0x49, 0x96, 0x57, + 0x57, 0x33, 0x7a, 0x21, 0xb7, 0xb7, 0x91, 0x5e, 0xef, 0xca, 0x20, 0xe8, + 0x53, 0xf1, 0xa2, 0x6d, 0xe9, 0xbd, 0xb3, 0x72, 0xc0, 0xa9, 0xf2, 0xbf, + 0xd3, 0xa8, 0x7e, 0x6c, 0x5a, 0xd4, 0x5b, 0xad, 0x6b, 0x9a, 0x97, 0xda, + 0xcb, 0xed, 0x29, 0xea, 0xae, 0xb6, 0x75, 0x5a, 0xe3, 0x82, 0x6b, 0x25, + 0xc3, 0x97, 0xf5, 0x6b, 0x82, 0x3b, 0x75, 0x3a, 0x9d, 0xf4, 0xae, 0x8d, + 0x7f, 0x89, 0xbd, 0x08, 0x1a, 0x51, 0xbc, 0xd4, 0xdf, 0xed, 0x76, 0xb3, + 0xb5, 0xb5, 0x55, 0x1b, 0xac, 0x6c, 0x72, 0x03, 0xa7, 0x0b, 0x5c, 0x53, + 0xbc, 0x68, 0x5d, 0x1b, 0x10, 0xaa, 0xb2, 0xae, 0xfb, 0x63, 0x5e, 0x4a, + 0x6f, 0xac, 0xff, 0x4c, 0xfd, 0x3a, 0xa9, 0xb6, 0xa1, 0x56, 0x31, 0xff, + 0x22, 0x28, 0x4f, 0x5d, 0x5d, 0xfd, 0xdd, 0x8f, 0x8f, 0xf7, 0x4d, 0x3e, + 0x29, 0xd8, 0x55, 0xbf, 0xdf, 0xb8, 0xbe, 0xaa, 0x75, 0x8e, 0xea, 0x2b, + 0x3e, 0x4c, 0x68, 0x0a, 0x08, 0xd6, 0x64, 0x0e, 0xc1, 0x85, 0x46, 0x55, + 0xa5, 0x93, 0x73, 0xa5, 0x20, 0x56, 0x9d, 0x74, 0xb2, 0x3c, 0x7c, 0x81, + 0x7d, 0x5c, 0xf9, 0xa4, 0x9f, 0xe5, 0xe1, 0x4b, 0xf0, 0x45, 0xf9, 0x6e, + 0x65, 0xdf, 0x3a, 0xdd, 0x49, 0x96, 0xaf, 0x25, 0xdb, 0xc3, 0x65, 0xeb, + 0x56, 0x97, 0x71, 0x27, 0x59, 0x4e, 0x72, 0xef, 0x99, 0xa4, 0x3b, 0x0c, + 0xba, 0xb5, 0xba, 0x34, 0x08, 0xa8, 0xb5, 0x67, 0x7e, 0x4b, 0xbb, 0x81, + 0xb6, 0xca, 0xf5, 0xf4, 0xfb, 0xfd, 0xfc, 0x78, 0xfa, 0x79, 0x6e, 0xd8, + 0xd2, 0xee, 0xca, 0xb9, 0xf4, 0xae, 0xb6, 0x0b, 0x86, 0xb1, 0x27, 0xc8, + 0xdc, 0xf0, 0xe3, 0x90, 0xea, 0xbf, 0x65, 0xe3, 0x02, 0x6a, 0x8d, 0xad, + 0xbf, 0x55, 0x99, 0x4e, 0xae, 0xf7, 0xf7, 0x7e, 0x10, 0xd8, 0xa6, 0x2d, + 0xd3, 0xce, 0xe7, 0xa4, 0x69, 0x0a, 0xa8, 0x55, 0x38, 0xdd, 0x39, 0x5d, + 0x5b, 0xbe, 0x78, 0x31, 0x3d, 0xc9, 0xe8, 0xc3, 0xf8, 0xc2, 0xb8, 0x0f, + 0xe4, 0xeb, 0x8c, 0xeb, 0x17, 0xab, 0x7d, 0xe4, 0xea, 0xea, 0x6a, 0x63, + 0x3f, 0x7a, 0x90, 0xf2, 0xe5, 0xe1, 0x6e, 0x25, 0x70, 0xd6, 0xbe, 0xf6, + 0x0e, 0xfb, 0xfe, 0xce, 0x99, 0xe6, 0xc0, 0x69, 0x85, 0x3b, 0xce, 0x0f, + 0xbe, 0x46, 0x29, 0x02, 0x5c, 0x3d, 0xfb, 0xec, 0xb3, 0xa3, 0x00, 0x5b, + 0x55, 0xe3, 0xd2, 0xeb, 0x3c, 0xfb, 0xec, 0xb3, 0xf9, 0xc9, 0x4f, 0x7f, + 0x3a, 0x0f, 0x3d, 0xf4, 0x50, 0x5e, 0x7f, 0xed, 0xb5, 0x3c, 0xfc, 0xd0, + 0x43, 0x7b, 0xe6, 0xf1, 0xda, 0xeb, 0xaf, 0x1f, 0x4a, 0x50, 0xad, 0x79, + 0x6a, 0x0a, 0x90, 0x55, 0x28, 0xe7, 0x7f, 0x6c, 0x42, 0xf9, 0xd7, 0x2b, + 0xc3, 0xc7, 0xb5, 0xf4, 0x7f, 0xfb, 0xa5, 0x41, 0x60, 0xad, 0xce, 0xbb, + 0x77, 0xf7, 0xc7, 0x4f, 0x7d, 0xf5, 0xe8, 0xe6, 0xdf, 0xa9, 0x19, 0x2e, + 0x7a, 0xa6, 0xba, 0xbd, 0x76, 0xda, 0x33, 0xd8, 0x2c, 0x57, 0x5b, 0x9d, + 0x4e, 0xe7, 0xf8, 0x03, 0x6a, 0x1d, 0x82, 0xcd, 0xcd, 0xed, 0x9c, 0x4d, + 0xf2, 0x62, 0x56, 0xd3, 0x7d, 0x73, 0x10, 0xa0, 0xaa, 0x57, 0x59, 0xcb, + 0xeb, 0x97, 0xaf, 0xe4, 0xe1, 0x74, 0xf2, 0x4c, 0xba, 0x59, 0xdb, 0x1c, + 0x9c, 0x17, 0xcf, 0x2d, 0x6d, 0xe7, 0x4b, 0x1f, 0xbe, 0x27, 0xb9, 0x7c, + 0x29, 0x4f, 0x7f, 0xd7, 0xe0, 0x63, 0xe6, 0xac, 0x9e, 0xcb, 0x03, 0x2f, + 0xaf, 0x67, 0xe3, 0xc2, 0x85, 0x64, 0x58, 0x6e, 0xf3, 0xe2, 0x20, 0x14, + 0xd1, 0x03, 0xf7, 0x7e, 0x2d, 0x5f, 0x7a, 0xbd, 0x93, 0x4b, 0x4b, 0x2f, + 0xe4, 0xca, 0x5d, 0x5b, 0xd9, 0xba, 0x6d, 0x35, 0xe9, 0x0d, 0x42, 0x0d, + 0x75, 0x3b, 0x5b, 0x49, 0x3a, 0xc9, 0x1d, 0xaf, 0x26, 0x3b, 0x6b, 0x49, + 0x92, 0x4b, 0xbf, 0xfb, 0x6a, 0xce, 0x25, 0x59, 0xbf, 0xeb, 0x5c, 0x72, + 0xf9, 0x52, 0xb2, 0xd4, 0xc9, 0x85, 0x57, 0xd6, 0x73, 0x69, 0xb8, 0xb5, + 0x9f, 0xfe, 0xbf, 0x06, 0xd3, 0x9e, 0x4b, 0xb2, 0x7e, 0xf7, 0x85, 0xe4, + 0xf5, 0xc1, 0x47, 0xdb, 0x17, 0x5e, 0x59, 0xcf, 0x8b, 0xa5, 0xf6, 0x97, + 0x03, 0x6a, 0x55, 0xdd, 0x37, 0x6c, 0x76, 0x39, 0xa0, 0x56, 0xd5, 0x0b, + 0x2f, 0x0e, 0xca, 0x3d, 0x39, 0xb6, 0x44, 0xc9, 0xea, 0x6a, 0xf2, 0xf9, + 0xa7, 0xf7, 0x06, 0xd6, 0xe2, 0xc8, 0x9c, 0x4d, 0x72, 0x29, 0x93, 0x03, + 0x4f, 0xcd, 0x52, 0xbe, 0x5c, 0xb6, 0x4d, 0x7f, 0xd3, 0xcb, 0x20, 0xf0, + 0xd6, 0xf2, 0x84, 0x72, 0xcb, 0x49, 0x66, 0x0d, 0xbb, 0x76, 0x54, 0xa6, + 0x09, 0x5a, 0x58, 0xbe, 0x92, 0x9a, 0x74, 0x15, 0x35, 0x29, 0x18, 0xd5, + 0x61, 0xb8, 0x99, 0x96, 0xe5, 0x57, 0xff, 0xc9, 0x8b, 0xc3, 0x79, 0x5f, + 0x4a, 0xff, 0x73, 0x17, 0xf3, 0x8b, 0xc3, 0xb3, 0x64, 0x37, 0x49, 0xff, + 0x73, 0x49, 0x37, 0x83, 0x3e, 0x71, 0x3d, 0x49, 0xff, 0x2b, 0xfd, 0xf4, + 0x3f, 0x34, 0xfe, 0x7a, 0xb3, 0x1a, 0x30, 0xab, 0x1c, 0x50, 0xab, 0x7c, + 0xef, 0x59, 0x17, 0x50, 0xab, 0x29, 0x18, 0x55, 0x35, 0xbd, 0x3c, 0x5d, + 0x93, 0xfe, 0x3b, 0xfd, 0x5c, 0xdf, 0xb9, 0x9e, 0xeb, 0xdb, 0xa5, 0x69, + 0xdf, 0xc9, 0xe8, 0xdf, 0xa2, 0xde, 0x94, 0xbe, 0x9f, 0xdd, 0xde, 0xde, + 0xce, 0xe9, 0xa5, 0xd3, 0xd9, 0xde, 0xde, 0xde, 0xd3, 0xc6, 0x6a, 0xfa, + 0xb8, 0x76, 0xd7, 0x2d, 0x57, 0x9b, 0xc0, 0x5b, 0xe3, 0xa6, 0x29, 0xaf, + 0xd7, 0xe5, 0x0b, 0x0f, 0xe7, 0xfa, 0x1b, 0xcf, 0x8d, 0x0d, 0x54, 0xc6, + 0xae, 0x95, 0x8f, 0x9c, 0xca, 0x07, 0x1e, 0x7a, 0xd7, 0x71, 0x37, 0x63, + 0xac, 0x8f, 0xfe, 0xec, 0x9f, 0x6b, 0xcc, 0xbf, 0x7c, 0xc8, 0xf3, 0x9f, + 0x47, 0xa0, 0xa9, 0x36, 0x75, 0x4c, 0x33, 0x9f, 0xb6, 0xe7, 0xdc, 0x71, + 0xd3, 0x55, 0xe7, 0x73, 0x76, 0xca, 0xf9, 0xdf, 0x93, 0xe4, 0x6b, 0x13, + 0xe6, 0x53, 0x9d, 0xd7, 0x95, 0xb4, 0x3f, 0xf7, 0x1f, 0x66, 0x60, 0xaf, + 0xd3, 0x95, 0x13, 0x52, 0xe7, 0x8d, 0x5f, 0xc9, 0xe6, 0x85, 0xa4, 0xfb, + 0x62, 0x06, 0x81, 0x54, 0x3e, 0x32, 0x08, 0x50, 0x5f, 0x58, 0xbb, 0xe3, + 0xde, 0x5c, 0xba, 0x34, 0x2e, 0x50, 0xd0, 0xb0, 0x8e, 0xdb, 0xf6, 0x56, + 0xfa, 0xc2, 0xe5, 0xad, 0x3c, 0xb2, 0xb2, 0x9a, 0xde, 0x7b, 0x3b, 0x63, + 0xcb, 0x8c, 0xb3, 0x28, 0xc1, 0xb7, 0xca, 0xeb, 0x71, 0x96, 0x00, 0x5b, + 0x9d, 0xd2, 0x39, 0xa0, 0x2e, 0xc0, 0xd6, 0xfa, 0x6b, 0xe3, 0xaf, 0xd4, + 0xda, 0x3e, 0x4f, 0x19, 0x95, 0xcf, 0x72, 0xba, 0xdd, 0xd5, 0x6c, 0x5d, + 0xbd, 0x92, 0xe4, 0x74, 0x3a, 0x67, 0x4e, 0x27, 0xd7, 0x92, 0xce, 0x99, + 0xe5, 0xac, 0x76, 0x1f, 0xce, 0xd6, 0xd6, 0x33, 0xc3, 0x00, 0x56, 0xdd, + 0x74, 0x96, 0x1e, 0x48, 0xb7, 0x7b, 0x3a, 0xdd, 0x3c, 0x9c, 0xcd, 0xad, + 0x67, 0xd2, 0x59, 0xba, 0x98, 0x6e, 0xa7, 0x9b, 0x5e, 0x7f, 0x50, 0x3e, + 0xfd, 0x5e, 0x3a, 0x4b, 0xcb, 0xd9, 0xdc, 0xaa, 0x3b, 0x02, 0x4e, 0xa7, + 0xdb, 0x39, 0x9d, 0xad, 0x6b, 0x83, 0xb1, 0xee, 0xd2, 0x72, 0xf6, 0x86, + 0x6b, 0xed, 0xa5, 0xd3, 0xed, 0xa6, 0x7f, 0x75, 0x3b, 0xdd, 0xce, 0xd9, + 0x6c, 0xbe, 0x39, 0x2e, 0xfc, 0xeb, 0xb0, 0xdd, 0x4b, 0xc5, 0x15, 0x6d, + 0xa7, 0xf4, 0xbc, 0xbe, 0x33, 0x78, 0xfe, 0x5c, 0x3c, 0x97, 0xdd, 0xc9, + 0xe8, 0x19, 0xeb, 0x28, 0xaf, 0xd6, 0xe9, 0x74, 0xf7, 0x04, 0xdd, 0x29, + 0xdf, 0xed, 0x77, 0xd2, 0x59, 0x3a, 0x9b, 0x64, 0x3d, 0x9d, 0xee, 0x6a, + 0xfa, 0x57, 0xb7, 0x87, 0x6d, 0x5d, 0x2d, 0xb5, 0xf5, 0x85, 0x24, 0xbd, + 0xac, 0xdd, 0xfe, 0xe3, 0xe9, 0x5d, 0xdd, 0x48, 0x67, 0x69, 0x39, 0x9d, + 0x61, 0x60, 0xd1, 0x41, 0xf9, 0xba, 0xe5, 0xad, 0x2e, 0xfb, 0xd9, 0xe4, + 0x6a, 0x7f, 0x4f, 0x80, 0x99, 0xaa, 0xd5, 0x95, 0x73, 0xd9, 0xdc, 0xda, + 0x18, 0xfe, 0xdb, 0xd4, 0xcb, 0xec, 0x2a, 0x07, 0xd4, 0x2a, 0x3c, 0xff, + 0xd9, 0xe4, 0xfe, 0xc7, 0x4b, 0x65, 0x86, 0xc1, 0xb3, 0x0a, 0x45, 0x10, + 0xad, 0xcd, 0x61, 0xee, 0xf3, 0x9b, 0x9b, 0x59, 0xcb, 0x6e, 0x10, 0xa9, + 0x24, 0xd9, 0x1c, 0x96, 0x7f, 0xec, 0xf1, 0xb5, 0x22, 0x65, 0x98, 0x3e, + 0x08, 0x42, 0xf5, 0xfc, 0xf3, 0xc9, 0xe3, 0x8f, 0x6f, 0xe6, 0xb1, 0xc7, + 0x93, 0xb5, 0xe1, 0x3c, 0x1e, 0x4f, 0xf2, 0x58, 0x06, 0x81, 0xa6, 0xca, + 0xf3, 0x5b, 0xcb, 0x5a, 0xb2, 0x56, 0xcc, 0x6d, 0xf0, 0xbf, 0x22, 0xb7, + 0x08, 0x2a, 0x55, 0x9e, 0xe6, 0xfe, 0xfb, 0x93, 0xfb, 0x93, 0x6c, 0xae, + 0xed, 0x96, 0x29, 0xea, 0x59, 0x5b, 0x1b, 0x04, 0xd9, 0x2a, 0x82, 0x80, + 0x3d, 0x5e, 0xb4, 0x6f, 0x6d, 0x33, 0xf9, 0xec, 0x60, 0x7d, 0x6c, 0xa6, + 0x14, 0x60, 0xeb, 0xfe, 0x24, 0xc3, 0xb6, 0x16, 0xc1, 0xb9, 0x4a, 0x4d, + 0xcb, 0xfd, 0xf7, 0x0f, 0xd3, 0xb2, 0x39, 0x0a, 0xea, 0x95, 0xb5, 0xc1, + 0x72, 0x15, 0xc1, 0xb4, 0x46, 0xf9, 0xf7, 0x97, 0xd6, 0xcf, 0x70, 0x1e, + 0x6b, 0x49, 0x1e, 0xff, 0xec, 0x60, 0x36, 0xf7, 0x0f, 0x03, 0x77, 0x15, + 0x65, 0xcb, 0x41, 0xb7, 0x8a, 0x75, 0xf0, 0xd8, 0xe3, 0xd5, 0x79, 0x0d, + 0xa6, 0xb8, 0xff, 0xfe, 0xe4, 0xf7, 0xbe, 0x9c, 0x46, 0xc5, 0xb3, 0xe4, + 0x83, 0x04, 0xb9, 0xea, 0xf7, 0xfb, 0xa3, 0x80, 0x5a, 0xd9, 0xf3, 0x9b, + 0x42, 0x29, 0xc0, 0x56, 0x29, 0xd8, 0xd6, 0x49, 0x0a, 0xa8, 0x95, 0x0c, + 0x7f, 0x6f, 0xdc, 0xc9, 0xa0, 0xfd, 0xa3, 0xb4, 0xee, 0xd8, 0xf6, 0x0e, + 0xc6, 0xfb, 0x87, 0xbe, 0x1c, 0xf3, 0xae, 0xff, 0x62, 0x67, 0xf0, 0x1c, + 0xe0, 0xe9, 0xec, 0x06, 0xb8, 0xba, 0xb4, 0x33, 0xb8, 0x3f, 0xdc, 0x1e, + 0xf6, 0x21, 0x9f, 0x1a, 0xf6, 0x63, 0xc5, 0xf8, 0x67, 0xd2, 0xc9, 0xa7, + 0x4a, 0xe3, 0x65, 0xf7, 0x2c, 0x0d, 0xee, 0xff, 0xb7, 0x97, 0x92, 0x7b, + 0x96, 0x4e, 0xe7, 0x93, 0x3b, 0xd7, 0x47, 0xfd, 0xe8, 0xdf, 0xc9, 0xe0, + 0xda, 0xe3, 0x93, 0x49, 0x7e, 0x21, 0xc9, 0xdf, 0xfb, 0x9f, 0x56, 0xf3, + 0xa9, 0xff, 0x61, 0xd0, 0x9b, 0x7d, 0xa6, 0xf4, 0x1b, 0xd8, 0x2f, 0x0f, + 0xff, 0x7d, 0x66, 0x27, 0xf9, 0xcc, 0xf7, 0x26, 0x9f, 0xfa, 0x9d, 0x41, + 0x90, 0xad, 0x22, 0x28, 0x55, 0x77, 0x29, 0x39, 0xbb, 0x94, 0x6c, 0x54, + 0xf6, 0xad, 0x71, 0x36, 0x76, 0x4a, 0x77, 0xbe, 0x0d, 0x51, 0xa3, 0xaf, + 0xef, 0xec, 0xff, 0xfd, 0xbd, 0xea, 0x52, 0xfa, 0x19, 0xdc, 0x49, 0x9f, + 0x4e, 0x67, 0xe9, 0x7a, 0xfa, 0xc3, 0xba, 0xcb, 0xe7, 0x84, 0xd5, 0x9d, + 0xeb, 0xd9, 0x58, 0xda, 0x6d, 0x6f, 0x96, 0x96, 0x93, 0xfe, 0xf5, 0xf1, + 0x37, 0xea, 0xe5, 0x73, 0xcd, 0x50, 0xb1, 0x9f, 0x6d, 0x14, 0xbf, 0xc1, + 0x36, 0x34, 0xab, 0xd5, 0x6f, 0xd7, 0x49, 0xbe, 0xfa, 0xee, 0xeb, 0xf9, + 0xf0, 0x7f, 0x38, 0x3d, 0xfc, 0xf7, 0xf0, 0xc7, 0xef, 0xfa, 0xd0, 0x87, + 0x73, 0xdb, 0x30, 0x78, 0x55, 0x39, 0x48, 0xd5, 0x6d, 0x67, 0xdf, 0x97, + 0x77, 0xae, 0x7c, 0x23, 0x77, 0x7d, 0xe8, 0xc3, 0x79, 0xee, 0x4b, 0xcf, + 0xe5, 0xce, 0xef, 0xb8, 0x33, 0x49, 0xf2, 0xd6, 0x5b, 0x6f, 0x25, 0xd9, + 0x0d, 0x7e, 0x75, 0xe7, 0x9d, 0x77, 0xee, 0x0b, 0x88, 0x95, 0x64, 0x54, + 0x47, 0xd9, 0x9d, 0x77, 0xde, 0x79, 0xa8, 0x75, 0xe6, 0xa5, 0xaf, 0xe6, + 0xfd, 0xef, 0x7f, 0x7f, 0x2e, 0x0f, 0x83, 0x6a, 0xbd, 0xef, 0x9b, 0x6f, + 0x1b, 0x05, 0xcd, 0x7a, 0xf0, 0xc1, 0x07, 0x73, 0xf9, 0xa5, 0xaf, 0xe6, + 0x9d, 0x2b, 0xdf, 0xd8, 0x93, 0x7e, 0xe7, 0x9d, 0x77, 0x8e, 0xea, 0x7a, + 0xdf, 0x37, 0xdf, 0x96, 0xcb, 0x2f, 0x7d, 0x75, 0x54, 0x67, 0x31, 0xaf, + 0xa2, 0x4d, 0x49, 0x46, 0xe9, 0x45, 0x9b, 0xca, 0x01, 0xc1, 0xca, 0xf3, + 0xba, 0xed, 0xad, 0xb7, 0xf2, 0x85, 0xad, 0xfd, 0x81, 0xc0, 0xca, 0x8a, + 0xa0, 0x55, 0xe3, 0x6c, 0x55, 0x83, 0xf2, 0x25, 0xf9, 0xe5, 0x17, 0x37, + 0xb2, 0x7d, 0x75, 0xff, 0x6f, 0x02, 0xb3, 0xd4, 0xd5, 0xd4, 0xae, 0xf5, + 0xd7, 0x37, 0xb2, 0xbc, 0x52, 0x9f, 0x5f, 0xd4, 0xf5, 0xb5, 0xcf, 0x3f, + 0x93, 0x07, 0x6f, 0xdf, 0xbd, 0x96, 0xfa, 0xd2, 0xd5, 0xf5, 0x9c, 0xab, + 0x46, 0x96, 0x4c, 0xb2, 0xb1, 0x79, 0x3a, 0xf7, 0x5c, 0xdc, 0x97, 0xbc, + 0x57, 0xe5, 0xf0, 0xf8, 0xd2, 0xd5, 0xf5, 0x9c, 0x4b, 0x4d, 0x5d, 0xc3, + 0xa0, 0x57, 0x85, 0x22, 0x20, 0x56, 0x59, 0x35, 0x68, 0x56, 0xb5, 0xae, + 0xb5, 0xef, 0xba, 0x77, 0x4f, 0xb0, 0xad, 0x7d, 0x75, 0xf5, 0xf7, 0xd7, + 0x35, 0x98, 0xc7, 0xf5, 0xfa, 0xba, 0x2e, 0xed, 0xce, 0xeb, 0xa4, 0x29, + 0x02, 0x6a, 0xdd, 0xbe, 0x7a, 0x3e, 0x6f, 0x6e, 0xbd, 0x9e, 0x17, 0xff, + 0xd5, 0xef, 0xe5, 0xde, 0xbf, 0xfc, 0x9d, 0x49, 0x32, 0x0a, 0xae, 0x75, + 0x2b, 0xf9, 0xb7, 0xaf, 0xbd, 0x91, 0x3f, 0xfe, 0xb3, 0xb7, 0x46, 0xe3, + 0xdf, 0xf2, 0xe7, 0xcf, 0xe5, 0x8f, 0xfe, 0xfd, 0xc6, 0x68, 0xb8, 0xac, + 0x9c, 0x5e, 0x0c, 0xe7, 0x9b, 0x8e, 0xa6, 0x9d, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x37, 0x2b, 0x41, 0xb5, 0x00, 0xe0, 0x04, 0xb8, 0x5e, + 0x7a, 0x4b, 0xee, 0xf4, 0x52, 0x92, 0x7e, 0xd2, 0x5f, 0x1a, 0x06, 0x54, + 0xba, 0x76, 0x7d, 0xf4, 0x3e, 0xdf, 0xb9, 0xf3, 0x17, 0x86, 0x67, 0xef, + 0x4e, 0x4e, 0x27, 0xb9, 0x72, 0xad, 0x97, 0xfe, 0xb5, 0x7e, 0xae, 0xa7, + 0x9b, 0xfe, 0xd2, 0xf5, 0x74, 0x76, 0x7a, 0xd9, 0x7a, 0x73, 0x6b, 0xf8, + 0x32, 0xf7, 0xde, 0x8f, 0x45, 0x93, 0xf1, 0x2f, 0xce, 0xb6, 0x09, 0x08, + 0x35, 0x2e, 0xc8, 0xd5, 0xb8, 0xe9, 0x8a, 0x80, 0x5b, 0xe3, 0x02, 0x59, + 0x75, 0xcf, 0x74, 0xd3, 0xbb, 0xd6, 0x4b, 0x67, 0xa9, 0xb3, 0xe7, 0xe5, + 0xfb, 0xfe, 0x4e, 0x3f, 0xdd, 0x33, 0xdd, 0xc1, 0x3a, 0x28, 0xfe, 0x52, + 0x70, 0x43, 0xfb, 0x8a, 0xbc, 0x22, 0x30, 0x56, 0x31, 0x9c, 0xfe, 0xfe, + 0x00, 0x33, 0xfd, 0xfe, 0xb0, 0xee, 0x64, 0xf4, 0x62, 0xe2, 0xe8, 0xaf, + 0x62, 0x57, 0xea, 0x1f, 0xd5, 0x9b, 0x4e, 0xba, 0xdd, 0x6e, 0x7a, 0xbd, + 0x5e, 0x7a, 0xbd, 0x5e, 0x3a, 0x9d, 0x4e, 0xb6, 0xb6, 0xb6, 0xf6, 0x2c, + 0x7b, 0x31, 0xbf, 0x79, 0xa8, 0xfb, 0xa0, 0x74, 0x5f, 0x50, 0xa8, 0x16, + 0xc1, 0xb4, 0xf6, 0x4d, 0x33, 0x21, 0x38, 0xd5, 0x81, 0x3e, 0x62, 0xad, + 0x04, 0xd7, 0xaa, 0x2d, 0x32, 0xa6, 0xfe, 0x89, 0x01, 0xaf, 0xaa, 0x1f, + 0x00, 0xb4, 0x08, 0xb2, 0xd5, 0x7a, 0x59, 0x66, 0x0c, 0x9e, 0x35, 0x8f, + 0x8f, 0x7e, 0xab, 0xcb, 0x7d, 0x76, 0x27, 0xb9, 0x32, 0x4c, 0x5b, 0xde, + 0xc9, 0x9e, 0x00, 0x58, 0xdb, 0x4b, 0x29, 0xfe, 0xae, 0x7b, 0x96, 0x77, + 0x06, 0xe3, 0xd7, 0xfb, 0x83, 0x0f, 0x03, 0x8a, 0x4f, 0xa5, 0x3b, 0xa3, + 0x5e, 0x62, 0xd8, 0xae, 0x51, 0x70, 0xac, 0x8c, 0x5e, 0x08, 0xae, 0x06, + 0xd4, 0x7a, 0xf1, 0x5a, 0x72, 0xee, 0x4c, 0x46, 0x01, 0xb7, 0x8a, 0x32, + 0x45, 0x5d, 0x4f, 0x67, 0xf8, 0x31, 0x7a, 0xbf, 0xb7, 0x2f, 0xb8, 0xd4, + 0x61, 0x05, 0x9b, 0x6a, 0x33, 0x9f, 0xe3, 0x6a, 0xcb, 0x49, 0x55, 0xed, + 0xe7, 0x46, 0xe9, 0x35, 0x81, 0xec, 0xaa, 0x79, 0x7b, 0x3e, 0x50, 0x4a, + 0xe9, 0x83, 0x9b, 0x4e, 0x65, 0xbc, 0x61, 0x3e, 0xfb, 0xa6, 0xcd, 0xa0, + 0xff, 0x1c, 0x7d, 0x2c, 0x5f, 0x19, 0xde, 0x37, 0xdd, 0xb5, 0x7e, 0x72, + 0xa6, 0x74, 0xdc, 0x9e, 0xd9, 0x9b, 0xbe, 0xaf, 0x7c, 0xaf, 0x37, 0xf8, + 0xae, 0xa5, 0xdb, 0x4d, 0xbf, 0xd7, 0x4b, 0x8a, 0x8f, 0x06, 0x4b, 0xc3, + 0x45, 0x1b, 0x46, 0x6d, 0xe9, 0xf5, 0x46, 0x1f, 0x17, 0x56, 0x75, 0xce, + 0x74, 0xd3, 0xbf, 0xd6, 0x1b, 0x05, 0xd7, 0x6a, 0xe3, 0xf5, 0xd7, 0x5e, + 0xcb, 0xb3, 0xc3, 0xe1, 0xa6, 0xc0, 0x59, 0x6d, 0x83, 0x60, 0xbd, 0xfe, + 0xda, 0x6b, 0x39, 0x7f, 0xc7, 0x1d, 0xf9, 0xf9, 0x27, 0x9e, 0x18, 0xd4, + 0xfd, 0xec, 0xb3, 0x39, 0x7f, 0xc7, 0x1d, 0xb9, 0xe3, 0xfc, 0xf9, 0xfc, + 0xe4, 0xa7, 0x3f, 0x3d, 0x9a, 0xcf, 0xb3, 0xcf, 0x3e, 0x3b, 0xa1, 0xa6, + 0x83, 0xf9, 0xd8, 0xc7, 0x3e, 0xb6, 0x2f, 0xed, 0x8b, 0x5f, 0xfc, 0x62, + 0xe3, 0x34, 0xe7, 0x1b, 0x73, 0xc7, 0x4f, 0xf3, 0xb1, 0x9c, 0xcf, 0xf9, + 0x9c, 0xcf, 0x17, 0x33, 0xa8, 0xff, 0xf5, 0xb4, 0x0b, 0xca, 0x75, 0x1c, + 0xb6, 0xfe, 0xc1, 0x4f, 0xe4, 0x6f, 0xff, 0xcc, 0xaf, 0x67, 0xeb, 0x7f, + 0xf9, 0x91, 0x24, 0xc9, 0xaf, 0xff, 0xda, 0xee, 0xf0, 0x61, 0x6a, 0x3a, + 0xe2, 0xa6, 0xfb, 0x64, 0x79, 0xb2, 0xba, 0xfa, 0x9a, 0xce, 0x72, 0x7f, + 0xff, 0xe7, 0xfe, 0xfe, 0x9c, 0x5b, 0x70, 0x82, 0x7c, 0xe4, 0xc1, 0xdc, + 0x5b, 0x0c, 0xf7, 0xae, 0xe4, 0xc5, 0x6c, 0xef, 0x2b, 0x72, 0xfd, 0xfe, + 0x07, 0xf3, 0x40, 0x31, 0xb2, 0xb5, 0x91, 0x64, 0x39, 0xd9, 0xee, 0x27, + 0xcb, 0x9d, 0xe4, 0x77, 0x5f, 0x4c, 0x8a, 0xc0, 0x5a, 0x0f, 0x3d, 0x9c, + 0x0f, 0xf4, 0x86, 0x9f, 0x31, 0xbf, 0x79, 0x25, 0x9b, 0xdb, 0x83, 0xb5, + 0x7a, 0x7a, 0x75, 0x2b, 0xc9, 0x5a, 0xd2, 0xd9, 0x4a, 0xba, 0xab, 0xa3, + 0x73, 0x7c, 0xfa, 0xfd, 0xe4, 0x6c, 0x37, 0x79, 0xbb, 0x66, 0xed, 0xff, + 0xd0, 0x23, 0x19, 0x7d, 0xa2, 0xf3, 0xe6, 0x7a, 0xf2, 0x3d, 0xe7, 0x92, + 0x2f, 0x5f, 0xc9, 0x67, 0x7e, 0x66, 0x33, 0x49, 0xb2, 0x7a, 0x6f, 0xb1, + 0x15, 0x2f, 0x25, 0xf9, 0xa5, 0xd1, 0x35, 0xea, 0x27, 0x92, 0x3c, 0xfd, + 0xc4, 0x0f, 0xa6, 0x77, 0xe9, 0x47, 0xf2, 0x4b, 0x7f, 0x37, 0x59, 0xfd, + 0x70, 0x79, 0x6b, 0xff, 0xc6, 0x68, 0xe8, 0xe9, 0x27, 0x7e, 0x30, 0x4f, + 0xfe, 0xdc, 0xa7, 0x92, 0xff, 0xf6, 0xc1, 0xe4, 0xf6, 0x61, 0x78, 0x85, + 0xef, 0x7d, 0x70, 0x18, 0x8a, 0x26, 0xc9, 0xef, 0x3c, 0x97, 0xf5, 0x0c, + 0x03, 0x6a, 0x7d, 0xf5, 0xc5, 0xe4, 0xcd, 0xd2, 0x87, 0x52, 0x6f, 0x6c, + 0x24, 0xdf, 0xb6, 0xf7, 0xc3, 0x8f, 0x45, 0xb7, 0xba, 0xd2, 0xc9, 0xf2, + 0x4a, 0x37, 0xeb, 0x97, 0xc7, 0x7f, 0x86, 0xbe, 0x08, 0xda, 0x06, 0xcb, + 0x98, 0xa5, 0x7c, 0xdb, 0xb2, 0xdb, 0xa5, 0x7f, 0x27, 0x05, 0xd6, 0x9a, + 0xa7, 0x72, 0xd0, 0xa8, 0xe2, 0x88, 0xaa, 0xeb, 0x57, 0xeb, 0xf2, 0xfa, + 0x0d, 0xf9, 0xd5, 0x60, 0x54, 0xc5, 0xe7, 0x6f, 0xa7, 0x27, 0x8c, 0x17, + 0x75, 0xf4, 0x2b, 0xe3, 0xe3, 0xda, 0xda, 0x34, 0xff, 0x6a, 0x7b, 0xc7, + 0x95, 0xfd, 0xff, 0xd9, 0x7b, 0xfb, 0x20, 0x39, 0xce, 0xfb, 0xbe, 0xf3, + 0x43, 0xbb, 0x6d, 0x3e, 0x63, 0x0d, 0xa8, 0x9e, 0xca, 0xaa, 0x6e, 0x06, + 0x2f, 0xca, 0x8c, 0xb2, 0x10, 0x30, 0x3c, 0x31, 0xe2, 0xc2, 0x64, 0x85, + 0xbb, 0x47, 0xc5, 0x8b, 0x15, 0xad, 0x02, 0x10, 0x2a, 0x65, 0x81, 0x92, + 0xcb, 0x04, 0xf9, 0xc7, 0x9a, 0xa4, 0xae, 0xa2, 0x10, 0x64, 0x7c, 0x26, + 0x75, 0xae, 0x44, 0x64, 0x04, 0x9b, 0x52, 0xa5, 0x72, 0x36, 0x93, 0x98, + 0x24, 0xa2, 0xab, 0x88, 0x04, 0xf7, 0xca, 0x12, 0xe8, 0x8a, 0x4c, 0xf0, + 0x12, 0x51, 0x00, 0x4e, 0xa2, 0x16, 0xab, 0x13, 0x83, 0x65, 0x15, 0x68, + 0x2c, 0x15, 0xd2, 0x1c, 0x40, 0xd8, 0xd3, 0xb4, 0x84, 0x97, 0x19, 0x87, + 0x9b, 0x4c, 0x0b, 0x98, 0x64, 0x1e, 0xca, 0x6d, 0xf1, 0xfe, 0x78, 0x9e, + 0xa7, 0xfb, 0xe9, 0x9e, 0xee, 0xd9, 0xd9, 0xc5, 0x0b, 0x21, 0xab, 0xbf, + 0xa8, 0x45, 0x77, 0x3f, 0xcf, 0xef, 0xf9, 0x3d, 0x2f, 0x3d, 0xfd, 0x74, + 0xf7, 0xd3, 0xfd, 0x7c, 0x3a, 0xe9, 0xef, 0x67, 0xbd, 0x2e, 0xcb, 0xa9, + 0xb6, 0xb9, 0x4e, 0xf3, 0xc4, 0x02, 0x42, 0x9f, 0xd5, 0xdc, 0xd1, 0x1a, + 0xbe, 0x75, 0x61, 0x21, 0x3f, 0x5d, 0x67, 0x6c, 0x61, 0x21, 0x36, 0xbe, + 0x20, 0x1c, 0xc1, 0xd8, 0xd6, 0x29, 0x1a, 0xc7, 0x8e, 0x2a, 0x9b, 0x0c, + 0xd8, 0xd3, 0xb0, 0x10, 0xad, 0x64, 0xbc, 0x0d, 0x96, 0x32, 0xdb, 0xa5, + 0x92, 0x3a, 0x12, 0xe4, 0x05, 0x49, 0xa9, 0x54, 0x0a, 0x61, 0x2d, 0x76, + 0x9a, 0x2c, 0x1b, 0xb3, 0x3e, 0x08, 0x74, 0x65, 0xdb, 0x18, 0xa5, 0x81, + 0xbe, 0xd2, 0x20, 0x5a, 0x46, 0x06, 0x34, 0x23, 0x10, 0xb1, 0x32, 0xac, + 0x04, 0xb2, 0x95, 0xcc, 0x5f, 0x14, 0x45, 0x1f, 0x50, 0x2b, 0x09, 0x2f, + 0xbb, 0xd2, 0x5a, 0x5b, 0xbc, 0xe6, 0x8a, 0xe7, 0xb9, 0x12, 0xfd, 0x97, + 0xff, 0xf6, 0x0e, 0x27, 0xfe, 0xf8, 0xa7, 0xef, 0x76, 0x31, 0x32, 0xf5, + 0xff, 0x7e, 0xfe, 0xaf, 0x2f, 0x9b, 0xef, 0xe5, 0x00, 0x4e, 0x97, 0x02, + 0xf0, 0x74, 0xa9, 0x81, 0x5a, 0xab, 0x2d, 0x53, 0x5a, 0xba, 0x2d, 0x96, + 0xdf, 0x41, 0x76, 0xb6, 0xd2, 0x50, 0x37, 0x36, 0x48, 0x2b, 0xeb, 0x9c, + 0x3d, 0x4c, 0xb9, 0x2f, 0x27, 0x50, 0x2b, 0xd7, 0xcf, 0xb3, 0xd4, 0x79, + 0xa2, 0xbd, 0xa4, 0x40, 0x59, 0x00, 0xfe, 0x92, 0x0d, 0xb5, 0x52, 0xe7, + 0x05, 0x5f, 0x1e, 0xc1, 0xb7, 0x2e, 0xc9, 0x15, 0xdc, 0xe9, 0x00, 0xc2, + 0x19, 0x43, 0x76, 0xa3, 0x7b, 0x35, 0xe1, 0x54, 0x90, 0xc1, 0x4a, 0xc7, + 0xf1, 0xf4, 0xb8, 0x92, 0xb5, 0xed, 0x8a, 0x0a, 0xbe, 0xcc, 0x82, 0xb6, + 0x19, 0x70, 0x7d, 0xcf, 0x7a, 0x66, 0x81, 0x1a, 0x83, 0xb5, 0x3e, 0xec, + 0x20, 0x11, 0x0a, 0xae, 0x65, 0x3e, 0x92, 0x91, 0xf6, 0x4c, 0x23, 0x00, + 0x5f, 0xfa, 0xb8, 0x22, 0x09, 0x82, 0xaf, 0xc4, 0xd6, 0xa3, 0xf2, 0x55, + 0x62, 0x65, 0x75, 0x85, 0x3a, 0xc2, 0xbd, 0x33, 0xfb, 0xa9, 0xae, 0xbf, + 0x07, 0xef, 0xcc, 0x3e, 0xdc, 0x40, 0xdd, 0x87, 0xfa, 0x72, 0x9e, 0x72, + 0x71, 0xc7, 0x0a, 0xeb, 0x3e, 0x58, 0xb2, 0xdb, 0xa1, 0x5c, 0xac, 0xd1, + 0xee, 0x7a, 0x43, 0xd9, 0xcf, 0xcc, 0xc0, 0xe4, 0x64, 0x95, 0xb9, 0x2a, + 0x30, 0xe3, 0x45, 0xa0, 0x29, 0x1d, 0x37, 0x3d, 0x1d, 0xc1, 0x9d, 0x20, + 0x82, 0x61, 0x19, 0x70, 0x96, 0x82, 0x43, 0x55, 0xf1, 0x3c, 0x8f, 0xaa, + 0x06, 0x6e, 0x45, 0xf0, 0x29, 0x6d, 0xa3, 0xa1, 0x12, 0xd5, 0x2a, 0xcc, + 0xe1, 0x31, 0x3d, 0x1d, 0x85, 0x79, 0x78, 0xcc, 0x79, 0x1e, 0x7b, 0xaa, + 0xd5, 0x10, 0x96, 0x65, 0xa0, 0x51, 0x06, 0xdd, 0x35, 0x03, 0xb0, 0x07, + 0xa6, 0xf7, 0x2c, 0x5f, 0x27, 0x05, 0xb1, 0xea, 0x57, 0xe8, 0x6b, 0x8f, + 0x06, 0x80, 0x55, 0xad, 0xb0, 0x19, 0x62, 0xd0, 0x2b, 0x80, 0xe9, 0x69, + 0x53, 0xff, 0xa8, 0xac, 0xd3, 0xd3, 0x91, 0xe7, 0xe9, 0x3d, 0x0a, 0x0e, + 0x86, 0xa7, 0xe0, 0x5c, 0x7b, 0x66, 0xbc, 0x70, 0xdd, 0xc3, 0x0b, 0xe1, + 0x64, 0x1e, 0x5e, 0x08, 0xec, 0x0a, 0xcb, 0xe2, 0x79, 0x21, 0x9c, 0x6c, + 0xda, 0x0e, 0xc7, 0x53, 0x6d, 0xa9, 0xd3, 0x9b, 0x7d, 0x61, 0xc2, 0xf7, + 0xc4, 0xda, 0x49, 0xc1, 0xcc, 0x3c, 0x5d, 0xe7, 0x61, 0x70, 0x17, 0x52, + 0x4a, 0x7c, 0x3f, 0xfd, 0xbe, 0xd9, 0xf7, 0xdb, 0xb8, 0x6e, 0x39, 0xf6, + 0xec, 0xcf, 0xac, 0x9b, 0x6d, 0x5f, 0x7f, 0x4c, 0x48, 0x3a, 0xa2, 0x0f, + 0xac, 0x95, 0xcc, 0xe7, 0x6a, 0x94, 0x94, 0x56, 0x99, 0xfb, 0x9e, 0x2f, + 0x86, 0x6b, 0x17, 0x9f, 0x4f, 0xd6, 0x47, 0x77, 0x12, 0x65, 0x59, 0x6e, + 0xfc, 0x7e, 0xb5, 0x7a, 0x48, 0xb8, 0xdc, 0x17, 0xc8, 0xbe, 0xb1, 0xfd, + 0xa7, 0x80, 0xdd, 0x7a, 0x7d, 0x8b, 0x03, 0xc7, 0x03, 0x15, 0xb6, 0xcf, + 0x51, 0x80, 0x2b, 0x13, 0xff, 0xd4, 0x17, 0x2b, 0xec, 0xfe, 0x9c, 0xba, + 0xa2, 0xd8, 0xe1, 0x68, 0x10, 0x96, 0x50, 0xf7, 0x13, 0xbb, 0x03, 0xd8, + 0xeb, 0x14, 0x68, 0xe8, 0xf6, 0xaa, 0x3b, 0xd0, 0x08, 0x22, 0xbf, 0x8f, + 0xfc, 0x41, 0x9b, 0x31, 0x5d, 0xf7, 0xdd, 0x81, 0x8a, 0x07, 0x05, 0xf5, + 0x32, 0x30, 0x2d, 0x80, 0x31, 0x47, 0x87, 0xe9, 0xbc, 0x01, 0x1a, 0x8e, + 0x20, 0xd6, 0x1b, 0x26, 0x9f, 0xa3, 0x4a, 0xfd, 0x3c, 0x4c, 0xc4, 0x1f, + 0x43, 0xda, 0x1f, 0x25, 0x59, 0x8d, 0xd4, 0x47, 0x6c, 0x74, 0x16, 0x29, + 0xcf, 0x6e, 0x0b, 0x14, 0x68, 0xd3, 0x01, 0xa2, 0x0f, 0xc3, 0xf4, 0x64, + 0x4f, 0x5f, 0x53, 0xf6, 0x42, 0xd0, 0x56, 0xdf, 0x73, 0xf1, 0x04, 0x58, + 0xab, 0xef, 0xb8, 0x08, 0x8f, 0x23, 0xa2, 0xf3, 0x52, 0x20, 0xd5, 0xf1, + 0x75, 0x95, 0x6a, 0x76, 0x76, 0x16, 0x50, 0x40, 0x29, 0xa3, 0x73, 0xe7, + 0x2f, 0xb0, 0x16, 0x0d, 0xaa, 0x02, 0x36, 0x7d, 0x30, 0x82, 0x6d, 0x01, + 0x7d, 0x60, 0xab, 0x73, 0xe7, 0x2f, 0x30, 0x35, 0x35, 0xc5, 0xec, 0xec, + 0x6c, 0x0c, 0x58, 0x65, 0x03, 0xa8, 0x4c, 0xda, 0xcb, 0xe1, 0x73, 0x4d, + 0x65, 0x2d, 0x67, 0xcf, 0x9e, 0x65, 0x4d, 0x65, 0x6d, 0xac, 0x3e, 0x6b, + 0x2a, 0x6b, 0xd9, 0xa4, 0x4f, 0xeb, 0x27, 0x5e, 0x3d, 0xc6, 0x9a, 0xca, + 0x5a, 0xd6, 0xad, 0x5b, 0xa7, 0xd2, 0x68, 0x90, 0xd8, 0x05, 0x0d, 0xe0, + 0x32, 0x7e, 0xec, 0xb0, 0x75, 0xeb, 0xd6, 0x85, 0xc0, 0x2f, 0x03, 0xd6, + 0x32, 0xe5, 0x34, 0xe0, 0xad, 0x13, 0xaf, 0x1e, 0x0b, 0xeb, 0x84, 0x86, + 0x6b, 0x99, 0x32, 0xf0, 0xde, 0x78, 0x9d, 0x96, 0x53, 0xd9, 0x15, 0x78, + 0x6d, 0x49, 0xd9, 0x15, 0xb4, 0x96, 0xfc, 0xb0, 0x4f, 0x31, 0xc0, 0x2c, + 0xdf, 0x7a, 0x26, 0xee, 0xb5, 0x7d, 0x76, 0x4c, 0x8e, 0xf3, 0xe6, 0x89, + 0xc6, 0xc0, 0x7e, 0xc7, 0xf6, 0x05, 0xe9, 0xf0, 0xad, 0x61, 0x7d, 0x01, + 0x7d, 0xbe, 0xec, 0x91, 0xaa, 0xad, 0x23, 0x75, 0xf6, 0xbd, 0xda, 0xe0, + 0xc5, 0xbd, 0x8f, 0x71, 0xe0, 0xd9, 0x67, 0x42, 0x10, 0x55, 0x96, 0xbc, + 0xd7, 0xe6, 0xb9, 0xe7, 0xd6, 0x2a, 0xfb, 0x5e, 0xf6, 0xe2, 0x20, 0x2c, + 0xa9, 0x7d, 0xbd, 0xdc, 0x60, 0x4b, 0x7d, 0x3e, 0xf4, 0x8d, 0x3e, 0x56, + 0xb7, 0xd4, 0xaf, 0x67, 0xdf, 0xcb, 0x5e, 0xa6, 0xaf, 0x24, 0xe8, 0x2a, + 0xe6, 0x4b, 0xc2, 0xed, 0xf7, 0x3f, 0xca, 0x3d, 0xb7, 0x56, 0x33, 0x7d, + 0x21, 0x88, 0xfb, 0x6a, 0xbc, 0xc9, 0x1d, 0x9f, 0xa8, 0x71, 0x7c, 0xe1, + 0xcd, 0xd0, 0x97, 0xf8, 0x88, 0x6a, 0x83, 0xdb, 0xef, 0x7f, 0x94, 0x6a, + 0xb5, 0x1a, 0xde, 0x3f, 0xa6, 0xa9, 0xe2, 0xd4, 0x68, 0x05, 0xcd, 0x81, + 0xeb, 0x66, 0x1b, 0x88, 0x85, 0x65, 0xf9, 0xcb, 0xb2, 0x5b, 0xce, 0x87, + 0x01, 0x6a, 0x99, 0xf5, 0xf9, 0xef, 0xc4, 0xe3, 0x17, 0xfe, 0xe2, 0x6a, + 0xff, 0xdc, 0xc2, 0xc5, 0xe9, 0xf4, 0x85, 0x97, 0xb9, 0xee, 0xda, 0x75, + 0x9c, 0x7f, 0xfb, 0x2c, 0xd7, 0x5d, 0xbb, 0x2e, 0x84, 0x65, 0xd9, 0xa0, + 0x2d, 0x5b, 0x31, 0xa0, 0x56, 0xae, 0x5c, 0xb9, 0x72, 0xe5, 0xca, 0x95, + 0x2b, 0x57, 0xae, 0x5c, 0xb9, 0x72, 0xe5, 0xca, 0x95, 0x2b, 0x57, 0xae, + 0x5c, 0xb9, 0x72, 0xe5, 0xca, 0x95, 0x2b, 0x57, 0xae, 0x5c, 0xb9, 0x72, + 0xe5, 0xba, 0x68, 0xe5, 0x50, 0xad, 0x5c, 0xb9, 0x72, 0xe5, 0xca, 0x95, + 0xeb, 0x2a, 0x90, 0x0d, 0xe8, 0x91, 0x0e, 0x84, 0x2f, 0x5a, 0x9b, 0x97, + 0xca, 0xa5, 0xa4, 0xfe, 0xa1, 0xb1, 0x18, 0x50, 0x0b, 0xa0, 0x52, 0x74, + 0xe9, 0xa0, 0xbe, 0xc8, 0x2e, 0x03, 0x89, 0xb4, 0xbe, 0x10, 0x9a, 0x06, + 0xa1, 0xb2, 0x21, 0x55, 0xa9, 0xe5, 0xb0, 0xbf, 0xa8, 0x6c, 0x4d, 0x36, + 0x1d, 0x06, 0xba, 0x95, 0xcc, 0xc3, 0x86, 0x69, 0xd9, 0x70, 0xaf, 0x64, + 0xfe, 0x31, 0xa0, 0x4b, 0x4a, 0x3e, 0xc9, 0x32, 0xd8, 0x80, 0x30, 0xdb, + 0x8f, 0xfd, 0x62, 0x7e, 0x96, 0xec, 0x38, 0x03, 0xe1, 0xb2, 0xcb, 0x98, + 0x95, 0x97, 0xef, 0x27, 0x21, 0x3e, 0x32, 0x06, 0x2e, 0xbb, 0x94, 0x2f, + 0xf5, 0xcb, 0xae, 0x8c, 0xbd, 0x20, 0x9f, 0xf5, 0xc2, 0xbc, 0x79, 0x19, + 0x5b, 0x14, 0x15, 0x02, 0x29, 0x09, 0x79, 0xea, 0x4b, 0x27, 0x65, 0x1c, + 0x22, 0x25, 0xe5, 0x60, 0x18, 0x97, 0xb5, 0xff, 0x64, 0x90, 0x88, 0x4b, + 0x2b, 0x77, 0x00, 0x24, 0xec, 0xb3, 0xfc, 0xc6, 0xd2, 0x25, 0xea, 0xbb, + 0x9c, 0x56, 0x03, 0xb3, 0x4a, 0x2b, 0x0f, 0x80, 0x48, 0xdb, 0x6f, 0x43, + 0x4c, 0x3c, 0x58, 0x69, 0x99, 0x05, 0x82, 0x4a, 0x20, 0x43, 0x68, 0x56, + 0xaa, 0x8d, 0x63, 0xdb, 0xc7, 0x55, 0x0a, 0x40, 0x3a, 0x0a, 0x76, 0xd5, + 0x71, 0xd4, 0x36, 0x8e, 0xaa, 0x57, 0x09, 0x62, 0x57, 0xf4, 0x11, 0x80, + 0x4b, 0x4d, 0x75, 0x6f, 0x38, 0x2e, 0x13, 0x42, 0xd2, 0x91, 0x50, 0x26, + 0x02, 0x75, 0x81, 0x9a, 0x88, 0x26, 0x64, 0x8b, 0x72, 0x4a, 0xb9, 0xc6, + 0x8b, 0x92, 0x23, 0x23, 0x63, 0x6c, 0x5d, 0x6a, 0x50, 0x1e, 0xa9, 0xd1, + 0x5e, 0x6a, 0x22, 0xfa, 0x26, 0x7a, 0x45, 0x92, 0x68, 0xd0, 0x5c, 0xd1, + 0x3e, 0xc6, 0xb2, 0xed, 0xb3, 0x6c, 0xa4, 0x6c, 0x23, 0xc4, 0x60, 0x5c, + 0x8c, 0x94, 0x7e, 0xaa, 0x8d, 0x24, 0x7d, 0x32, 0xd8, 0x72, 0xfe, 0xb2, + 0xec, 0xec, 0x7c, 0xae, 0x86, 0x69, 0x3b, 0x21, 0x00, 0xf0, 0x12, 0x4e, + 0x8e, 0x49, 0x03, 0x0f, 0xda, 0x13, 0x9d, 0x92, 0x71, 0xc9, 0x34, 0xa9, + 0x76, 0x09, 0x08, 0x41, 0x72, 0xbd, 0xaf, 0x0c, 0xd6, 0xa4, 0x7a, 0xd9, + 0x95, 0xf1, 0xf3, 0x61, 0x4a, 0x1a, 0xe1, 0xba, 0x91, 0x9d, 0x39, 0xb7, + 0xd8, 0x69, 0x32, 0x26, 0x05, 0x9a, 0xf0, 0x10, 0xc6, 0xa5, 0xd7, 0xfd, + 0xa5, 0xd5, 0x01, 0x53, 0x0c, 0x4c, 0xcb, 0x40, 0xb0, 0x1e, 0x78, 0xf0, + 0x41, 0x9e, 0x7c, 0xe2, 0x89, 0x10, 0xa4, 0x65, 0xc3, 0xb6, 0x9e, 0x78, + 0xe0, 0x01, 0x76, 0x68, 0x38, 0x96, 0xd1, 0xe8, 0xc6, 0x8d, 0x21, 0x4c, + 0xcb, 0xf6, 0xf9, 0x40, 0xc2, 0xee, 0xc9, 0x27, 0x9e, 0xe0, 0x81, 0x07, + 0x1f, 0x54, 0x40, 0xad, 0x44, 0xdc, 0x40, 0x3d, 0xf1, 0x44, 0x58, 0x3e, + 0x3b, 0xcf, 0x4b, 0x25, 0x1b, 0xa6, 0xb5, 0x98, 0xd8, 0xde, 0x46, 0x1c, + 0x8e, 0x65, 0xaf, 0x1b, 0xbb, 0xa7, 0x58, 0x64, 0x94, 0xc5, 0x30, 0xce, + 0x00, 0xb5, 0x46, 0x13, 0xdb, 0x17, 0x03, 0xd9, 0x7a, 0xe2, 0x81, 0x07, + 0x38, 0xb4, 0xb8, 0xd8, 0x07, 0x23, 0x33, 0x6d, 0x32, 0xec, 0x91, 0xf4, + 0x67, 0xff, 0xfe, 0xcf, 0xf8, 0xe4, 0x6f, 0x46, 0x10, 0xad, 0x4f, 0xfe, + 0xe6, 0x27, 0x79, 0xf1, 0x3f, 0xbe, 0xc8, 0xed, 0xff, 0xf0, 0xf6, 0x8b, + 0x28, 0x1d, 0x99, 0x65, 0xb8, 0x92, 0xd3, 0x9c, 0xc4, 0x80, 0xfc, 0xb2, + 0xa0, 0x28, 0x46, 0x3b, 0x6e, 0xdb, 0xca, 0xc1, 0x97, 0x8e, 0x84, 0x40, + 0xae, 0x9f, 0x0d, 0x0c, 0x61, 0xb6, 0xc6, 0x69, 0xc3, 0x2d, 0x53, 0x51, + 0xc0, 0x2b, 0x6a, 0x02, 0xd2, 0xb8, 0x0e, 0x9b, 0x7f, 0xe5, 0x4d, 0x76, + 0xe0, 0xd3, 0x9b, 0x8c, 0x6c, 0x0a, 0x73, 0xca, 0xa6, 0x37, 0x39, 0xc5, + 0x56, 0x09, 0xac, 0x2f, 0x73, 0x64, 0x49, 0xb2, 0xe3, 0xbb, 0x07, 0xe1, + 0xd7, 0xef, 0x50, 0x46, 0x87, 0x66, 0x43, 0xfb, 0x9d, 0x1f, 0x19, 0xe7, + 0x40, 0xb3, 0xcd, 0xc1, 0x63, 0x65, 0x76, 0x9e, 0x90, 0x1c, 0xfd, 0x44, + 0x99, 0x2d, 0xec, 0x40, 0xfc, 0xc9, 0xfe, 0x28, 0xdf, 0x07, 0xee, 0xe7, + 0xe8, 0xc8, 0x41, 0xda, 0x12, 0x10, 0x05, 0x76, 0x9e, 0x69, 0xc2, 0x6f, + 0xec, 0x54, 0x71, 0xff, 0xf7, 0x81, 0xc8, 0xee, 0x37, 0x76, 0x02, 0x2d, + 0xca, 0xe3, 0x2e, 0xfe, 0x82, 0x9f, 0xb8, 0x2e, 0xb9, 0x2f, 0x56, 0xb7, + 0x7d, 0x2f, 0x55, 0xd9, 0xf9, 0xa0, 0x4f, 0xfb, 0x58, 0xb4, 0x97, 0x0a, + 0x45, 0x80, 0xbb, 0x63, 0x36, 0x00, 0x3c, 0x3b, 0x0b, 0x8f, 0xde, 0xd5, + 0x3f, 0x91, 0x75, 0xd0, 0x7d, 0x80, 0x53, 0x80, 0x96, 0x81, 0x87, 0xe9, + 0x89, 0x1e, 0x37, 0x8f, 0xc3, 0x47, 0xa6, 0xe2, 0x36, 0xb9, 0x72, 0x5d, + 0x85, 0x4a, 0xc2, 0xa1, 0x86, 0x51, 0x12, 0x46, 0x05, 0x6a, 0x9a, 0x5e, + 0x61, 0xc0, 0x76, 0x81, 0xec, 0xa9, 0x7c, 0x97, 0xaa, 0xdf, 0xff, 0xb9, + 0xad, 0xcb, 0x9d, 0x63, 0xdc, 0xa3, 0xe1, 0xa9, 0x5b, 0xb7, 0x96, 0x29, + 0x14, 0x23, 0x7c, 0xdb, 0xf1, 0x63, 0x92, 0xda, 0xd8, 0x04, 0x00, 0x8d, + 0xf9, 0xaf, 0x46, 0xb0, 0x2e, 0x03, 0xc7, 0x2e, 0x0a, 0x16, 0x8e, 0xcc, + 0xc6, 0xee, 0x61, 0x4a, 0xa5, 0x12, 0xad, 0x6e, 0x34, 0xc9, 0x53, 0x14, + 0x45, 0x1f, 0x20, 0x6b, 0xa8, 0x3a, 0xac, 0x11, 0x70, 0x21, 0xda, 0xde, + 0x75, 0xe7, 0x2e, 0xf6, 0x3f, 0xb7, 0x3f, 0xdd, 0x0e, 0xe0, 0xc2, 0x60, + 0x1b, 0x79, 0x41, 0x22, 0x2f, 0xc8, 0x70, 0xdd, 0x40, 0xab, 0x92, 0xf9, + 0xf4, 0xf9, 0xd5, 0xbe, 0x8d, 0x9d, 0x9d, 0x5f, 0x9f, 0xdd, 0x10, 0xf5, + 0xc9, 0xca, 0xcf, 0x56, 0xa5, 0x52, 0xc3, 0x7f, 0x2b, 0x7e, 0x8d, 0x5d, + 0x70, 0x0a, 0x88, 0x8d, 0x3b, 0xe8, 0x34, 0x9e, 0x57, 0xfe, 0xde, 0x05, + 0x88, 0x56, 0x52, 0x17, 0xba, 0xef, 0x5c, 0x54, 0xfa, 0xcb, 0x59, 0x83, + 0x70, 0xf8, 0xe4, 0x32, 0xe6, 0x71, 0xb1, 0xba, 0x9a, 0xcb, 0x76, 0x29, + 0xb4, 0x12, 0x90, 0xd4, 0xa5, 0x86, 0x4e, 0xd9, 0xfe, 0x92, 0x30, 0xac, + 0x95, 0x96, 0xeb, 0x6a, 0x07, 0x62, 0x15, 0x32, 0x7e, 0x48, 0xb3, 0xdf, + 0xf5, 0x99, 0xfa, 0x88, 0x4b, 0x09, 0x58, 0x78, 0x41, 0x46, 0x70, 0x59, + 0xc0, 0x3b, 0xa5, 0x26, 0xb7, 0x0f, 0xdb, 0x7f, 0x01, 0x8c, 0x6d, 0x2e, + 0xe3, 0x8f, 0x83, 0xfb, 0xdd, 0x06, 0x7e, 0xa5, 0xbe, 0x7c, 0x02, 0x4b, + 0x59, 0xf9, 0x18, 0xe0, 0xe1, 0xa5, 0x52, 0x5a, 0x3e, 0xab, 0xcd, 0x23, + 0xd9, 0xae, 0xbd, 0x15, 0xba, 0x11, 0x4e, 0x01, 0x69, 0x9d, 0xf7, 0xea, + 0x1b, 0x6b, 0x34, 0x4e, 0x5d, 0xba, 0x09, 0xdd, 0x92, 0x0e, 0xb2, 0x6b, + 0x43, 0xd1, 0x17, 0xfa, 0x6d, 0x02, 0x1f, 0x37, 0x39, 0x9e, 0xe7, 0x94, + 0xf1, 0xda, 0x0d, 0x60, 0x2b, 0x32, 0x68, 0x22, 0x8a, 0x35, 0x3d, 0xbe, + 0xdd, 0xa2, 0x5c, 0xbc, 0x9e, 0x76, 0x37, 0xe9, 0xa3, 0x83, 0x70, 0x4a, + 0x89, 0xf5, 0x2a, 0x0a, 0x19, 0xa4, 0x40, 0x0b, 0xc2, 0x2d, 0x23, 0x97, + 0x3a, 0xf8, 0xd2, 0xa7, 0xbe, 0x7e, 0x8a, 0xd6, 0x52, 0x83, 0xe5, 0xa4, + 0x40, 0x5a, 0x1a, 0x98, 0xe2, 0xe8, 0xeb, 0x16, 0x07, 0xd0, 0xed, 0x26, + 0x28, 0xa8, 0x71, 0x5b, 0x87, 0x58, 0x3b, 0xc6, 0xeb, 0xd2, 0x81, 0x20, + 0x1d, 0x39, 0x6b, 0x97, 0xbb, 0x34, 0xe2, 0xd2, 0x6a, 0x2b, 0x78, 0x58, + 0xc9, 0x75, 0x69, 0x2d, 0x75, 0xf0, 0x65, 0x9b, 0x72, 0xb1, 0x8e, 0x0c, + 0x54, 0xb8, 0x77, 0x66, 0x1f, 0x40, 0x0c, 0x06, 0x66, 0xfb, 0xc8, 0x92, + 0x70, 0x5d, 0xc4, 0x52, 0x27, 0xf3, 0x9a, 0xcb, 0x97, 0x12, 0x57, 0x23, + 0x72, 0x15, 0x00, 0x6c, 0xb8, 0xf1, 0x55, 0xcd, 0xc5, 0xa2, 0x5a, 0xf5, + 0x98, 0x06, 0xaa, 0xd3, 0xd5, 0x10, 0x34, 0x05, 0xe0, 0xcd, 0xc1, 0x9e, + 0x39, 0xb5, 0x3e, 0x3d, 0xa9, 0x97, 0x7b, 0x54, 0xba, 0xb9, 0x39, 0x05, + 0x9c, 0xf2, 0x3c, 0x42, 0x90, 0x56, 0x66, 0x3e, 0xc6, 0xa7, 0xb5, 0x88, + 0xd2, 0x54, 0x01, 0x8f, 0x3d, 0x1a, 0x98, 0x35, 0x09, 0xcc, 0x68, 0x5f, + 0x7b, 0xa6, 0x61, 0xce, 0x83, 0xe9, 0x2a, 0xb0, 0x87, 0x10, 0x38, 0xf5, + 0x8f, 0xa6, 0x23, 0xdf, 0x66, 0xb4, 0xda, 0x94, 0xcf, 0x03, 0x66, 0xe6, + 0x60, 0x31, 0xd8, 0xcd, 0x6d, 0xb7, 0x3d, 0xa5, 0xe0, 0x58, 0x54, 0x79, + 0xe9, 0xee, 0xa7, 0xf8, 0xca, 0x57, 0x6e, 0x57, 0x40, 0x2d, 0x60, 0xcf, + 0x74, 0x95, 0x39, 0xdd, 0x00, 0x93, 0x93, 0x30, 0x07, 0x4c, 0xeb, 0x36, + 0x49, 0x03, 0x5e, 0xcd, 0x79, 0x5e, 0x98, 0x07, 0xc0, 0xdc, 0x8c, 0x2a, + 0xfa, 0xf4, 0x1e, 0x55, 0x97, 0xc9, 0x49, 0xd5, 0x26, 0x9e, 0x31, 0xd0, + 0x75, 0xf0, 0xbc, 0x38, 0x50, 0x6b, 0x66, 0x8f, 0xaa, 0xe3, 0x1c, 0x9e, + 0xae, 0x53, 0xd4, 0x46, 0x9e, 0x07, 0x33, 0x78, 0x4c, 0xa2, 0x0a, 0xe3, + 0x45, 0xc9, 0x54, 0x1e, 0x00, 0x33, 0xaa, 0x41, 0x4c, 0x5b, 0xac, 0x44, + 0x59, 0x40, 0xad, 0x64, 0x7c, 0x72, 0x5c, 0xdb, 0x7e, 0xde, 0x94, 0x7c, + 0x76, 0x13, 0x7e, 0x7c, 0x27, 0x65, 0x1c, 0x7c, 0x18, 0xb8, 0xd4, 0x95, + 0x54, 0xd6, 0x47, 0x39, 0x54, 0xff, 0xa0, 0x01, 0x47, 0x98, 0xf1, 0x74, + 0x53, 0x17, 0xf3, 0x91, 0xa1, 0xe1, 0x46, 0xd2, 0xb2, 0x9e, 0x6d, 0x65, + 0x97, 0xe9, 0xd2, 0x3f, 0xc9, 0xb8, 0x4f, 0xd7, 0x63, 0x8c, 0x08, 0x5c, + 0x05, 0xb0, 0x3b, 0x28, 0x80, 0xe8, 0x85, 0xf0, 0xac, 0x2d, 0x68, 0xa0, + 0x55, 0x00, 0x15, 0x01, 0xbb, 0xf5, 0x0d, 0xe7, 0xee, 0xc7, 0x5a, 0x54, + 0x04, 0x7c, 0x4e, 0xaa, 0xf8, 0x92, 0x03, 0x9f, 0xa5, 0x10, 0x82, 0x9f, + 0x1a, 0x41, 0x04, 0xd3, 0x52, 0x70, 0xad, 0xe8, 0x2e, 0xb4, 0xa2, 0xf3, + 0x84, 0x08, 0x98, 0xf5, 0x94, 0x03, 0x8f, 0xa0, 0x80, 0x5a, 0x4f, 0xfd, + 0x41, 0x99, 0xdd, 0xff, 0xbc, 0x1d, 0x8b, 0x07, 0xa8, 0x39, 0xd0, 0xd7, + 0xa3, 0x5b, 0xb0, 0x29, 0x50, 0x8f, 0x02, 0x45, 0x00, 0x7e, 0xa2, 0xc9, + 0x0c, 0xe8, 0x0a, 0xa0, 0xe0, 0x48, 0x7a, 0xc1, 0x30, 0xd7, 0x1c, 0xd1, + 0xdd, 0x75, 0xc7, 0x81, 0x42, 0xd0, 0x01, 0xa7, 0x44, 0x4f, 0x46, 0xe7, + 0xe5, 0x9e, 0xbe, 0x93, 0x2e, 0x05, 0xd0, 0x09, 0x44, 0xac, 0x2c, 0x05, + 0x47, 0xe2, 0x3b, 0x25, 0x90, 0x3d, 0xc6, 0x44, 0x8f, 0x05, 0x0a, 0xcb, + 0x3e, 0x93, 0x17, 0x42, 0x50, 0x40, 0xd2, 0x43, 0x7f, 0xd8, 0x24, 0xf1, + 0x6c, 0x67, 0x35, 0x40, 0xad, 0x9b, 0xff, 0xaa, 0x70, 0x45, 0x97, 0x9b, + 0x36, 0x6d, 0x0a, 0xf3, 0xbe, 0xd0, 0x3a, 0x17, 0xc2, 0xa2, 0xce, 0x9d, + 0xbf, 0x10, 0x82, 0xa7, 0xd6, 0x54, 0xd6, 0xc6, 0xa0, 0x58, 0x67, 0xcf, + 0x9e, 0x65, 0xdd, 0xba, 0x75, 0x21, 0x80, 0x6a, 0xed, 0x75, 0x6b, 0x38, + 0xa1, 0x81, 0x52, 0x6b, 0x2a, 0x6b, 0xe1, 0xfc, 0xc9, 0x70, 0xdd, 0xc4, + 0x1b, 0x10, 0xd6, 0xe5, 0xf0, 0x69, 0xc0, 0x59, 0x26, 0x3c, 0x4c, 0x83, + 0x02, 0x63, 0x19, 0x3f, 0x17, 0x5a, 0xe7, 0x98, 0xd5, 0x70, 0x2c, 0xa3, + 0xcd, 0x37, 0xdd, 0x1c, 0xc6, 0x27, 0x65, 0x40, 0x5c, 0x36, 0x70, 0xcc, + 0x06, 0x6d, 0x25, 0xed, 0x42, 0xe0, 0x96, 0x2e, 0xcf, 0x37, 0xda, 0xcb, + 0xdc, 0xb8, 0x27, 0xd4, 0xf6, 0xd3, 0x9f, 0x3d, 0x36, 0x16, 0x9b, 0x94, + 0x5d, 0x15, 0x5e, 0x19, 0x71, 0xe9, 0x2c, 0xb5, 0xa8, 0x96, 0xa3, 0x6b, + 0x02, 0x37, 0x25, 0x4d, 0xd6, 0x73, 0xcc, 0xe5, 0x7c, 0xa5, 0x69, 0x90, + 0xaf, 0x8e, 0x2b, 0xd8, 0x32, 0x06, 0xd5, 0x1b, 0xc7, 0xe1, 0x85, 0x66, + 0x08, 0xab, 0xb2, 0xba, 0xdb, 0x98, 0x8e, 0x2c, 0x35, 0x34, 0x6c, 0xcb, + 0x38, 0x57, 0x8b, 0xe7, 0x5f, 0x68, 0x52, 0xab, 0xc6, 0xd3, 0x84, 0xbe, + 0x88, 0x87, 0xdb, 0xbe, 0xd2, 0x74, 0xe0, 0xb9, 0x67, 0xfa, 0x6c, 0xfb, + 0xca, 0x95, 0xd0, 0x40, 0x5f, 0x89, 0xfc, 0xef, 0xb9, 0xb5, 0x4a, 0xdb, + 0x6f, 0x52, 0xfe, 0xc8, 0x5d, 0xf0, 0xf2, 0x17, 0x29, 0x95, 0x2b, 0xf1, + 0x8f, 0x5f, 0x24, 0xd4, 0x0a, 0x9a, 0x31, 0xd8, 0x55, 0x12, 0x7c, 0x65, + 0xe0, 0x5a, 0x76, 0x9c, 0x09, 0xcf, 0x4a, 0x63, 0xc7, 0x0f, 0xd2, 0x0f, + 0x4e, 0x9d, 0xe6, 0x03, 0x1b, 0x37, 0x70, 0xa6, 0x1d, 0x3d, 0xe5, 0x9b, + 0xff, 0x8e, 0x42, 0x76, 0xda, 0x80, 0xad, 0xa4, 0x86, 0x01, 0x81, 0x0d, + 0x0b, 0x08, 0x5b, 0x29, 0x48, 0x2c, 0xcd, 0x7e, 0x58, 0xbb, 0xac, 0x3c, + 0x5a, 0x41, 0x93, 0xb7, 0xde, 0x91, 0xbc, 0xef, 0xda, 0x75, 0xbc, 0xf7, + 0x97, 0xe3, 0xed, 0x96, 0xdc, 0xb6, 0x21, 0x5a, 0x39, 0x50, 0x2b, 0x57, + 0xae, 0x5c, 0xb9, 0x72, 0xe5, 0xca, 0x95, 0x2b, 0x57, 0xae, 0x5c, 0xb9, + 0x72, 0xe5, 0xca, 0x95, 0x2b, 0x57, 0xae, 0x5c, 0xb9, 0x72, 0xe5, 0xca, + 0x95, 0x2b, 0x57, 0xae, 0x5c, 0xb9, 0x2e, 0xad, 0xae, 0xa2, 0xd7, 0xce, + 0x72, 0xe5, 0xca, 0x95, 0x2b, 0x57, 0xae, 0x9f, 0x5f, 0xc9, 0x6e, 0x07, + 0x51, 0x2c, 0xc5, 0xbf, 0x32, 0xab, 0xc1, 0x3d, 0x12, 0x52, 0x81, 0x5a, + 0x2b, 0x91, 0x0d, 0x88, 0x4a, 0x02, 0xb5, 0x4c, 0x5c, 0x32, 0xdc, 0xb6, + 0x37, 0x36, 0x6e, 0xd1, 0x8d, 0x5e, 0x6a, 0x4f, 0x84, 0x83, 0x7e, 0xb9, + 0xd1, 0x7a, 0x49, 0x57, 0x38, 0x0a, 0x5c, 0x95, 0x4c, 0x67, 0x6f, 0x9b, + 0x74, 0x83, 0x94, 0x06, 0xe3, 0x4a, 0x5b, 0xcf, 0x7a, 0xc9, 0x38, 0xf9, + 0xd2, 0x65, 0xfa, 0x0b, 0xf9, 0xfd, 0xf5, 0x52, 0x4e, 0xa1, 0x32, 0x52, + 0xe9, 0x07, 0x6b, 0x59, 0x2f, 0xc4, 0xc7, 0xbe, 0xb4, 0x3d, 0xb0, 0x26, + 0x44, 0x9f, 0x3c, 0x1e, 0x12, 0x8c, 0x63, 0x26, 0x09, 0xd8, 0x2f, 0xcf, + 0x1b, 0x90, 0x56, 0x96, 0x7d, 0xe6, 0x8b, 0xf6, 0xcb, 0x81, 0xb4, 0x12, + 0xe5, 0x32, 0x13, 0x5d, 0x6d, 0xb8, 0x56, 0x5a, 0x79, 0xd2, 0xfc, 0xc8, + 0x00, 0xbe, 0xf2, 0xe9, 0x5d, 0xdc, 0xfd, 0xe5, 0xc4, 0xa4, 0xe0, 0x04, + 0xdc, 0x6b, 0x10, 0x6c, 0x27, 0x4d, 0xc9, 0x32, 0xc5, 0xf2, 0x1d, 0x06, + 0xd8, 0x95, 0xd1, 0xee, 0xa1, 0xad, 0xfd, 0x5b, 0xbc, 0x44, 0xf0, 0x22, + 0x1b, 0x64, 0x25, 0x33, 0x7e, 0x21, 0xd2, 0xfa, 0xca, 0xf4, 0x72, 0xad, + 0x61, 0xc0, 0x59, 0xc2, 0x51, 0x13, 0x24, 0xcd, 0x44, 0x1f, 0x89, 0xa4, + 0xa2, 0x7f, 0x19, 0x65, 0xdd, 0x77, 0xc8, 0xae, 0x4f, 0xcf, 0x11, 0xd4, + 0xac, 0xbc, 0xed, 0xbc, 0xfc, 0x40, 0x85, 0x96, 0x93, 0xc7, 0x4e, 0x57, + 0xf2, 0x58, 0x77, 0x81, 0x03, 0x8e, 0xc0, 0xb7, 0x26, 0x80, 0x49, 0x99, + 0x31, 0x51, 0xa6, 0x98, 0x1e, 0x9c, 0xb4, 0x17, 0xa2, 0xac, 0xc1, 0x59, + 0xe5, 0x58, 0x5c, 0x7c, 0x5b, 0x64, 0xe7, 0x13, 0xf3, 0x9d, 0x98, 0x78, + 0x92, 0x59, 0x06, 0x05, 0xc7, 0xb2, 0x97, 0x2a, 0xcf, 0xfe, 0x30, 0x3b, + 0x3c, 0x9e, 0xcf, 0x70, 0x13, 0xc7, 0x2e, 0x87, 0x92, 0x30, 0xc0, 0xa1, + 0xec, 0x6d, 0x48, 0x9b, 0x81, 0x06, 0xd8, 0x7d, 0xa0, 0x81, 0x58, 0x0d, + 0x80, 0x67, 0x65, 0x69, 0xd8, 0x89, 0x39, 0xcb, 0xc2, 0xb1, 0x74, 0xfe, + 0x61, 0xff, 0xb2, 0x4c, 0x3f, 0x90, 0xb4, 0xef, 0xf3, 0xed, 0x88, 0x18, + 0x68, 0xcb, 0x4c, 0x5a, 0x4a, 0x42, 0xb6, 0xec, 0xed, 0x2c, 0x00, 0xd7, + 0xb0, 0xda, 0xbe, 0x7d, 0x3b, 0x68, 0x10, 0xd6, 0xa1, 0x43, 0x87, 0x38, + 0x78, 0xe8, 0x10, 0x0f, 0x3e, 0xf8, 0x60, 0x0c, 0xa8, 0x05, 0x70, 0x68, + 0x71, 0xb1, 0x0f, 0x96, 0xb5, 0x7d, 0x74, 0x94, 0x07, 0x9f, 0x7c, 0x32, + 0x16, 0x76, 0x6a, 0x51, 0xbd, 0x5c, 0x9e, 0x66, 0xcb, 0xf6, 0xed, 0xc4, + 0xbd, 0x0e, 0xd6, 0x21, 0x53, 0x86, 0xed, 0xdb, 0xd9, 0x3e, 0x3a, 0xda, + 0x07, 0xf5, 0x5a, 0x8d, 0x46, 0x33, 0xc2, 0x6d, 0x88, 0xd6, 0xb6, 0x0c, + 0xdb, 0xc5, 0xc4, 0x32, 0xb9, 0x6e, 0xa7, 0x31, 0x70, 0x2d, 0x7b, 0xb9, + 0x1a, 0x6d, 0xdc, 0xb1, 0x83, 0xc5, 0x53, 0xa7, 0xd8, 0xbe, 0x7d, 0x3b, + 0xa7, 0x16, 0x17, 0x63, 0xfb, 0xe5, 0xe0, 0x13, 0x4f, 0xb0, 0xf3, 0x4b, + 0x5f, 0x1a, 0xca, 0xcf, 0xee, 0x05, 0x05, 0xd6, 0xb2, 0x8f, 0xa1, 0xfb, + 0xd2, 0xe7, 0xba, 0x2c, 0x2b, 0x17, 0x05, 0x9f, 0x5a, 0x0e, 0x64, 0xf5, + 0xb3, 0xa0, 0xb1, 0xf1, 0x09, 0x0e, 0xbe, 0x74, 0xe4, 0xdd, 0x2e, 0xc6, + 0xa5, 0x53, 0x0a, 0x50, 0x8b, 0x5b, 0xa6, 0xd4, 0x04, 0xb5, 0xb9, 0x59, + 0xc0, 0xcd, 0x04, 0x6a, 0x85, 0x7b, 0xee, 0xb9, 0x03, 0xf0, 0xeb, 0x3b, + 0x60, 0x2c, 0xe5, 0xfb, 0xf0, 0x9f, 0xd8, 0x09, 0x4b, 0x2d, 0x76, 0x9c, + 0x68, 0x70, 0x70, 0x3d, 0xc8, 0x4f, 0xec, 0x04, 0x0e, 0x72, 0x9c, 0x83, + 0x4c, 0x18, 0x9b, 0xdf, 0xde, 0xc5, 0xd1, 0xf6, 0x33, 0x4c, 0x4c, 0xfe, + 0x11, 0xb3, 0x87, 0xef, 0xc3, 0x2f, 0x4f, 0xc1, 0x03, 0x0f, 0xc1, 0x7c, + 0x62, 0x02, 0x85, 0x86, 0x6c, 0xed, 0x42, 0xc1, 0xb4, 0xca, 0x37, 0xbb, + 0xb4, 0x8f, 0xf9, 0x94, 0x6f, 0xee, 0x3f, 0x57, 0x29, 0x90, 0x96, 0x4b, + 0xa1, 0x08, 0xb5, 0xad, 0x2e, 0xcd, 0x23, 0x3e, 0xb5, 0xad, 0xcb, 0x9c, + 0xd3, 0x8e, 0x2d, 0xc0, 0xf8, 0x38, 0xcc, 0x1f, 0x85, 0x71, 0x5d, 0xba, + 0xf1, 0x09, 0xb5, 0x3d, 0xac, 0x9e, 0x9d, 0x85, 0x6f, 0x3e, 0x13, 0xa5, + 0x19, 0x1f, 0x87, 0xc3, 0x6f, 0x0e, 0x9f, 0xfe, 0x5d, 0x56, 0x7b, 0x49, + 0xd2, 0x5e, 0x25, 0x74, 0x71, 0xa5, 0x2a, 0x97, 0x5d, 0xda, 0xed, 0xfe, + 0xf3, 0x51, 0x59, 0x4f, 0x2a, 0x4b, 0x8b, 0x4b, 0x6a, 0xfc, 0xa6, 0x32, + 0xf3, 0xaf, 0xb6, 0xc3, 0x74, 0x2d, 0x2b, 0xcd, 0x72, 0x30, 0x8d, 0x64, + 0xfc, 0x20, 0xfb, 0x95, 0xd8, 0x02, 0x7a, 0x0a, 0x7e, 0xf6, 0xf6, 0xb0, + 0x71, 0xab, 0x91, 0x0d, 0x65, 0x5a, 0xae, 0x6f, 0x5d, 0xce, 0x76, 0x58, + 0x5f, 0x49, 0x64, 0x82, 0xd9, 0xb6, 0x21, 0x54, 0xcb, 0x01, 0x0b, 0x93, + 0x30, 0xa9, 0xa4, 0xfd, 0xcf, 0x6b, 0x5d, 0x96, 0xd3, 0x3e, 0xdf, 0x67, + 0x57, 0x79, 0x82, 0xfd, 0xdd, 0xe3, 0xec, 0x0a, 0xd4, 0x0c, 0xd2, 0x92, + 0xd3, 0x62, 0xcb, 0xcd, 0x82, 0xa3, 0xdf, 0xfd, 0xaa, 0xf2, 0x27, 0xa6, + 0x40, 0xaa, 0xbe, 0x3b, 0x06, 0xd1, 0x72, 0x4b, 0x21, 0x30, 0x4b, 0x14, + 0x05, 0x9d, 0x4e, 0x27, 0x8c, 0x2f, 0x58, 0x40, 0xc0, 0xac, 0xf5, 0x4a, + 0xa5, 0xa6, 0xee, 0x17, 0x2c, 0x60, 0x95, 0xb9, 0x5b, 0xb7, 0x01, 0x29, + 0x07, 0x5e, 0x3c, 0x80, 0xfb, 0x3e, 0x75, 0xe7, 0x26, 0xa5, 0xdf, 0x07, + 0x4f, 0x11, 0x6b, 0xc4, 0x40, 0x9b, 0xac, 0xf5, 0xb4, 0xed, 0x72, 0xa5, + 0x8c, 0xdf, 0xf5, 0xfb, 0xe2, 0x07, 0xf9, 0x08, 0xc3, 0x93, 0xf7, 0x46, + 0x29, 0x69, 0xec, 0x30, 0x57, 0x94, 0x91, 0xd2, 0x0f, 0x41, 0x5f, 0xe3, + 0x9f, 0x7a, 0x88, 0xf9, 0xaf, 0x3d, 0x1e, 0xf3, 0x69, 0xda, 0x4b, 0x9e, + 0x3a, 0x18, 0x6b, 0x3b, 0xbb, 0xdd, 0x87, 0xd1, 0x9a, 0xe2, 0x35, 0x43, + 0xd9, 0x5d, 0x4a, 0x0d, 0xcc, 0xf3, 0x22, 0xa1, 0x5c, 0xb9, 0xb2, 0x65, + 0x40, 0x52, 0xef, 0x06, 0x10, 0xaa, 0x42, 0x3f, 0xd4, 0x2a, 0xab, 0x1c, + 0xc9, 0x72, 0xae, 0xb6, 0xdc, 0xc9, 0x74, 0xad, 0x44, 0x58, 0x2b, 0x11, + 0x7f, 0xa9, 0x35, 0xa8, 0x8e, 0xef, 0x86, 0x0a, 0xc0, 0xd4, 0x47, 0x5c, + 0xca, 0xc7, 0x4a, 0x34, 0xfd, 0x0e, 0xf7, 0x7c, 0xfc, 0x73, 0xcc, 0x7f, + 0xed, 0x8b, 0x2b, 0x82, 0x68, 0x25, 0x55, 0x1f, 0x29, 0xd1, 0x76, 0x7a, + 0x97, 0x14, 0xc4, 0x32, 0xa8, 0x3c, 0x59, 0x30, 0x2c, 0x93, 0x66, 0x58, + 0x58, 0xd6, 0xa5, 0x02, 0x7a, 0xad, 0x06, 0xb2, 0x25, 0xac, 0xfe, 0xba, + 0xd9, 0xbc, 0xf4, 0xd7, 0xc5, 0xc2, 0x2d, 0xc1, 0x4a, 0xdc, 0x3a, 0x65, + 0x08, 0x34, 0x04, 0xc1, 0x69, 0x40, 0x20, 0xd4, 0xf8, 0x8f, 0x06, 0xa4, + 0x08, 0xd7, 0x85, 0xee, 0x40, 0x0f, 0x5a, 0x1e, 0x0a, 0xa8, 0xd5, 0x00, + 0x5c, 0x0a, 0x80, 0x1f, 0xbb, 0x2a, 0x19, 0xe2, 0x77, 0x26, 0x0a, 0x88, + 0x40, 0x41, 0xb3, 0x44, 0x80, 0xc6, 0x99, 0x28, 0x38, 0x8c, 0x74, 0x0a, + 0xea, 0xfa, 0x25, 0xe8, 0x21, 0x82, 0x02, 0x72, 0xa5, 0x70, 0x61, 0xa7, + 0x43, 0x38, 0xd2, 0xeb, 0x74, 0xe2, 0xe1, 0xd6, 0xef, 0x37, 0x82, 0x6d, + 0x55, 0xb3, 0x0a, 0xa9, 0xff, 0x4c, 0xbc, 0xa7, 0x97, 0x66, 0x7b, 0x88, + 0xf1, 0x30, 0x07, 0x84, 0x5b, 0x81, 0xee, 0x02, 0x2b, 0x19, 0xad, 0xa8, + 0x56, 0x09, 0xc1, 0x51, 0x9e, 0x07, 0x54, 0x3d, 0xbc, 0x19, 0x98, 0x9b, + 0x06, 0x66, 0x2c, 0x3b, 0x60, 0x6e, 0x52, 0xad, 0x4f, 0xea, 0xe2, 0x19, + 0xa0, 0xd6, 0xa4, 0xa6, 0x69, 0xcd, 0x79, 0x0a, 0x92, 0xe5, 0x79, 0xca, + 0x6f, 0xb5, 0xaa, 0x20, 0x58, 0x10, 0x01, 0xa3, 0xaa, 0x55, 0x05, 0x94, + 0xd2, 0x2e, 0x74, 0x58, 0x04, 0xe4, 0x9a, 0xd4, 0xf9, 0x4e, 0xea, 0x4c, + 0xe6, 0x74, 0xbc, 0x91, 0xf1, 0x13, 0x7e, 0xf6, 0xa1, 0xaa, 0x81, 0x5b, + 0xc0, 0x23, 0x2f, 0xbd, 0x18, 0xda, 0x3d, 0xa2, 0x97, 0x7b, 0xa6, 0x5f, + 0x64, 0xcf, 0x8c, 0xc7, 0xe4, 0xa4, 0xc7, 0x17, 0xbe, 0x70, 0x7b, 0x08, + 0xcb, 0xc2, 0x53, 0x50, 0xab, 0xb9, 0x39, 0x9d, 0xef, 0xa4, 0x2e, 0x97, + 0x2e, 0xa3, 0x87, 0x17, 0x83, 0x56, 0xcd, 0x79, 0x1e, 0x73, 0x33, 0x30, + 0x59, 0x8d, 0xda, 0x64, 0x72, 0x9a, 0x3e, 0x90, 0xd8, 0xe4, 0x24, 0xcc, + 0xcc, 0x78, 0xec, 0x99, 0xae, 0x32, 0x89, 0xa7, 0xda, 0x84, 0x84, 0x4d, + 0x35, 0x82, 0x6c, 0x55, 0xb1, 0xc0, 0x5e, 0xba, 0x6c, 0x7b, 0xf4, 0x52, + 0x35, 0x41, 0x54, 0xf7, 0x99, 0x19, 0x0d, 0x02, 0xc3, 0x03, 0x2f, 0xc2, + 0x69, 0x0d, 0x82, 0x99, 0x5d, 0xac, 0xc2, 0xe7, 0x72, 0x81, 0x1a, 0xc3, + 0x95, 0x9b, 0x6b, 0xf0, 0xda, 0xf2, 0x30, 0x3b, 0xa3, 0xab, 0x09, 0xa8, + 0xb5, 0xac, 0xfa, 0x3e, 0x08, 0x74, 0xf1, 0xb0, 0xab, 0x4b, 0xfd, 0xc1, + 0x8d, 0x61, 0x35, 0x16, 0xc0, 0x82, 0x03, 0x0d, 0x47, 0xe0, 0x3a, 0x32, + 0x04, 0x57, 0x01, 0x14, 0x28, 0x50, 0x70, 0xd4, 0xf5, 0xc4, 0x71, 0x7a, + 0x21, 0x28, 0xea, 0x0b, 0x4e, 0x81, 0x47, 0x44, 0x8f, 0x2f, 0xa0, 0xee, + 0x21, 0xbf, 0xa8, 0xed, 0x9f, 0x02, 0xf6, 0x89, 0x42, 0x08, 0xd2, 0x6a, + 0x01, 0x5f, 0x00, 0xf6, 0xc6, 0x72, 0x54, 0x77, 0x9e, 0x2e, 0xd0, 0x08, + 0x54, 0x3f, 0xea, 0x5a, 0xc0, 0xac, 0x67, 0x74, 0x9a, 0xdd, 0xc0, 0xee, + 0x7f, 0xde, 0x0e, 0x21, 0x5b, 0x8f, 0xa0, 0x81, 0x5b, 0x0e, 0x3c, 0x24, + 0x5c, 0x1e, 0x95, 0x12, 0x1c, 0x58, 0xd0, 0x4b, 0x21, 0x15, 0x18, 0x6c, + 0xde, 0x81, 0x4a, 0x00, 0x4d, 0xa2, 0xe7, 0x9c, 0x65, 0x7a, 0xb4, 0x29, + 0xf4, 0xdf, 0xc4, 0x86, 0x75, 0x4d, 0x43, 0x52, 0xdb, 0x71, 0xf1, 0xcd, + 0x9e, 0x88, 0x9e, 0xe5, 0xf7, 0x64, 0x8f, 0x82, 0x28, 0x50, 0xa0, 0x40, + 0x4f, 0xf6, 0x90, 0x8e, 0x7e, 0x46, 0x2a, 0xa1, 0x20, 0x0a, 0x71, 0x88, + 0x97, 0x28, 0xb0, 0x10, 0x74, 0x14, 0xa8, 0x51, 0x3f, 0xc3, 0x01, 0x75, + 0xbe, 0x01, 0xf4, 0xc7, 0x7b, 0xa2, 0x72, 0x74, 0x02, 0xa8, 0x48, 0x49, + 0x47, 0xa0, 0x80, 0x8e, 0xf6, 0xb3, 0x6a, 0x49, 0x74, 0x9e, 0x7c, 0x17, + 0x7e, 0x37, 0xc3, 0xe8, 0xe4, 0xc9, 0x93, 0x31, 0x10, 0xd5, 0xc9, 0x93, + 0x0a, 0x5e, 0x35, 0x35, 0xa5, 0xc6, 0x60, 0x67, 0x4f, 0x9e, 0x64, 0x2d, + 0xe7, 0x42, 0x98, 0xd5, 0x59, 0x0d, 0xc5, 0x3a, 0xa1, 0xc1, 0x5b, 0x40, + 0x08, 0xb8, 0xe2, 0xfc, 0xc9, 0x18, 0x98, 0xeb, 0x82, 0x65, 0xc3, 0xf9, + 0x93, 0x97, 0xcd, 0xe7, 0xd9, 0xb3, 0x67, 0x63, 0xf5, 0x38, 0x77, 0xfe, + 0x42, 0xe8, 0xff, 0xc4, 0xab, 0xc7, 0xd4, 0xb6, 0x05, 0xc6, 0x02, 0x42, + 0xb0, 0x57, 0x0c, 0xdc, 0xa5, 0x75, 0xee, 0xfc, 0x05, 0xa6, 0xa6, 0xa6, + 0x98, 0x9d, 0x9d, 0x85, 0xf3, 0x27, 0xc3, 0xbc, 0x21, 0x02, 0x68, 0x99, + 0xfc, 0x4c, 0x59, 0x36, 0x55, 0x88, 0x95, 0x6d, 0xed, 0x75, 0x6b, 0xe0, + 0x9a, 0x78, 0x9e, 0xcb, 0xa9, 0xec, 0x0a, 0xda, 0xbe, 0xa4, 0x34, 0x52, + 0x89, 0x85, 0xa5, 0x3d, 0x0e, 0x94, 0x12, 0x5a, 0x4b, 0xe6, 0x39, 0x6b, + 0x7f, 0xbc, 0x79, 0x6f, 0xa2, 0x34, 0xb2, 0x3c, 0x78, 0xa9, 0xed, 0x4b, + 0x4a, 0x4b, 0x3e, 0x5e, 0xdb, 0x0f, 0x01, 0x5b, 0x36, 0xa8, 0xab, 0xec, + 0xba, 0x0a, 0xf4, 0x99, 0xc8, 0x28, 0x0d, 0xe6, 0xd5, 0x3c, 0x51, 0xc0, + 0x7b, 0x6d, 0x9e, 0x7d, 0x2f, 0x7b, 0xdc, 0x73, 0x53, 0xb5, 0x2f, 0x7e, + 0xeb, 0x48, 0x9d, 0xa6, 0x6c, 0x52, 0x13, 0xaa, 0x5c, 0x3b, 0x7f, 0xfb, + 0x5e, 0xf6, 0xbd, 0xfa, 0xa8, 0x2e, 0xb4, 0x5a, 0x6c, 0xa9, 0x5f, 0x4f, + 0xf3, 0x44, 0x93, 0xe6, 0x89, 0x02, 0x5b, 0xea, 0x28, 0x5f, 0x49, 0xc0, + 0x96, 0xe5, 0xcb, 0x68, 0xe7, 0x9d, 0xf7, 0xb2, 0xef, 0xe5, 0x47, 0x63, + 0xf6, 0x69, 0xbe, 0xd2, 0x54, 0x4d, 0x8c, 0x89, 0x2c, 0xe7, 0x8b, 0x8a, + 0x0f, 0x34, 0xd9, 0xfa, 0xa9, 0x1d, 0x34, 0x8f, 0xbd, 0xc9, 0xa0, 0x56, + 0x4e, 0x03, 0x65, 0x0d, 0xbb, 0x9e, 0x15, 0x97, 0x04, 0x70, 0x19, 0xd9, + 0x60, 0x29, 0x80, 0x0f, 0x6c, 0xdc, 0x00, 0xc0, 0xfa, 0xf2, 0x28, 0x67, + 0xda, 0x8b, 0x21, 0x50, 0x0b, 0x14, 0x5c, 0xcb, 0xc0, 0xb6, 0x7e, 0x70, + 0xea, 0x74, 0x66, 0xfe, 0x59, 0x79, 0x25, 0xb5, 0x1a, 0x00, 0x56, 0x5a, + 0x3d, 0x57, 0x63, 0x97, 0x56, 0xee, 0xac, 0xb6, 0xfa, 0xef, 0x7f, 0x2d, + 0x71, 0x7e, 0x51, 0x1d, 0x63, 0xef, 0xf9, 0x45, 0xc1, 0x07, 0x36, 0x6e, + 0xe0, 0x07, 0xa7, 0x48, 0xd5, 0x8f, 0x7f, 0xd2, 0xe4, 0xfc, 0xdb, 0x67, + 0xd9, 0xb0, 0xe6, 0x56, 0xe5, 0x8b, 0x1f, 0x66, 0xd6, 0x3f, 0x57, 0xae, + 0x5c, 0xb9, 0x72, 0xe5, 0xca, 0x95, 0x2b, 0x57, 0xae, 0x5c, 0xb9, 0x72, + 0xe5, 0xca, 0x95, 0x2b, 0x57, 0xae, 0x5c, 0xb9, 0x72, 0xe5, 0xca, 0x95, + 0x2b, 0x57, 0xae, 0x5c, 0xb9, 0x72, 0x2d, 0xaf, 0x9f, 0xa5, 0x57, 0xcf, + 0x72, 0xe5, 0xca, 0x95, 0x2b, 0x57, 0xae, 0xbf, 0x59, 0xda, 0xae, 0x26, + 0x46, 0x88, 0xcd, 0x02, 0x4e, 0xa0, 0x5e, 0x78, 0x4d, 0x01, 0x05, 0x55, + 0xaa, 0xb5, 0x6c, 0xa0, 0x56, 0x41, 0x80, 0x14, 0x99, 0xef, 0xf2, 0xda, + 0xe0, 0x29, 0x03, 0x8a, 0xca, 0x02, 0x4f, 0xa5, 0x85, 0x27, 0xed, 0x6d, + 0x98, 0x4a, 0x08, 0x6a, 0x71, 0x44, 0xdf, 0xcb, 0xdc, 0x32, 0x90, 0xb1, + 0xf7, 0x88, 0xa5, 0x8c, 0x43, 0xbb, 0xcc, 0x76, 0x32, 0xcf, 0xb4, 0x32, + 0xd8, 0x80, 0xab, 0xe4, 0xfa, 0x4a, 0x64, 0x7f, 0xa5, 0xd7, 0x94, 0x2f, + 0xe9, 0x23, 0x59, 0x26, 0xb3, 0xde, 0xf2, 0x3b, 0xb1, 0x30, 0x49, 0x64, + 0x97, 0xac, 0x8b, 0xd8, 0xac, 0xd3, 0x6f, 0xef, 0xc0, 0x0b, 0x6a, 0xd5, + 0xbd, 0x41, 0x83, 0x8e, 0xd6, 0xbb, 0x34, 0x0d, 0x98, 0x2a, 0x01, 0x97, + 0x02, 0x0b, 0xa4, 0x66, 0x03, 0xb4, 0x9c, 0xf8, 0x32, 0xed, 0x0d, 0x55, + 0xfb, 0xe5, 0x6a, 0x64, 0x04, 0x92, 0x4a, 0xfb, 0x72, 0xb7, 0x70, 0x94, + 0x8f, 0xa7, 0xef, 0xdc, 0xc9, 0xf5, 0xbf, 0xfb, 0x30, 0x13, 0x37, 0xa4, + 0x80, 0x1f, 0x2c, 0x19, 0xbb, 0x2d, 0xf5, 0x2d, 0x91, 0x4f, 0x0d, 0xf5, + 0x7a, 0xfa, 0x4e, 0x05, 0x75, 0xb8, 0xfb, 0xcb, 0xfb, 0xa9, 0x15, 0x05, + 0x2d, 0xeb, 0xf7, 0x51, 0x2b, 0x0a, 0xee, 0x7b, 0xee, 0x40, 0x0c, 0x82, + 0x15, 0x96, 0x25, 0x01, 0x16, 0x4b, 0x03, 0x81, 0xd9, 0xb0, 0xad, 0xb4, + 0xba, 0x0f, 0x03, 0xe3, 0xb2, 0x27, 0xe7, 0x86, 0x10, 0xa1, 0x6e, 0xbc, + 0x7d, 0x8c, 0xff, 0x64, 0x9b, 0xc9, 0x00, 0xc8, 0x80, 0x72, 0x19, 0xbf, + 0xe5, 0xf5, 0xfa, 0x05, 0xdf, 0x1b, 0x04, 0x18, 0xae, 0x88, 0x7d, 0x5c, + 0xbf, 0x2a, 0x23, 0x90, 0x55, 0x4a, 0xf9, 0x4a, 0x16, 0xdc, 0x2a, 0xa9, + 0x2c, 0xf8, 0x96, 0x9d, 0xce, 0x4f, 0x49, 0x2f, 0x83, 0x08, 0x2a, 0xe4, + 0x07, 0x0a, 0x56, 0x65, 0x4f, 0x94, 0xf2, 0xad, 0x76, 0x6e, 0x2f, 0x35, + 0x91, 0x02, 0x0e, 0x4a, 0xb8, 0x27, 0x01, 0xa4, 0xda, 0xa1, 0x97, 0x4d, + 0xa7, 0x4c, 0x9a, 0x92, 0x50, 0xac, 0xd4, 0x3a, 0xa4, 0x00, 0xb5, 0x86, + 0xb5, 0x5d, 0x49, 0x3e, 0xc9, 0x89, 0xdf, 0xe9, 0xfe, 0xfd, 0xd8, 0x52, + 0x88, 0x6c, 0xa0, 0x48, 0x9a, 0xaf, 0xd8, 0x71, 0xfd, 0x75, 0xb5, 0x6a, + 0x1f, 0xd7, 0x78, 0x17, 0x07, 0x67, 0x8a, 0xe5, 0x75, 0x09, 0x27, 0x38, + 0x0c, 0xea, 0x27, 0x63, 0xfd, 0xc6, 0x25, 0xd4, 0xd0, 0xd0, 0x2d, 0x03, + 0x5a, 0xbc, 0x4c, 0xf6, 0x61, 0xba, 0x2c, 0xc8, 0x60, 0x86, 0xd2, 0x8e, + 0xeb, 0xf7, 0xdd, 0xa0, 0x0e, 0x90, 0x0d, 0xeb, 0x8b, 0x9c, 0x02, 0x46, + 0x37, 0x6e, 0xe4, 0xc9, 0x27, 0x9e, 0xe0, 0xd0, 0xa1, 0x43, 0x61, 0xba, + 0x8d, 0xa3, 0x66, 0xaa, 0xd5, 0xdf, 0x00, 0x00, 0x20, 0x00, 0x49, 0x44, + 0x41, 0x54, 0xa3, 0x3c, 0x79, 0xea, 0x14, 0x8b, 0xa7, 0x4e, 0x81, 0x05, + 0x6f, 0x5a, 0x3c, 0x75, 0x8a, 0x43, 0x10, 0xb3, 0x35, 0xf6, 0x87, 0x0e, + 0x1d, 0x0a, 0x01, 0x5a, 0x66, 0xfb, 0xc1, 0x14, 0xf8, 0xd5, 0xf6, 0xed, + 0xdb, 0x59, 0x3c, 0x75, 0x8a, 0x1d, 0xa3, 0x59, 0x58, 0xab, 0x7e, 0x6d, + 0x7f, 0xe2, 0x89, 0x68, 0x63, 0x19, 0xa0, 0xd6, 0x53, 0x4f, 0x3d, 0x15, + 0x5b, 0x66, 0xd9, 0xec, 0x26, 0x0e, 0xc7, 0x32, 0xc0, 0xab, 0x24, 0x04, + 0x6b, 0x94, 0x51, 0x16, 0x2d, 0x14, 0x56, 0x12, 0x96, 0x85, 0xe5, 0xc7, + 0x6c, 0x6f, 0xb3, 0xd2, 0x6c, 0x63, 0x94, 0xc3, 0xab, 0x46, 0x69, 0x45, + 0x32, 0xd0, 0xb3, 0xc5, 0x53, 0xea, 0xad, 0xf4, 0xc5, 0x53, 0xa7, 0x18, + 0xdd, 0xb8, 0x91, 0x53, 0x8b, 0x8b, 0xec, 0x78, 0xf0, 0x41, 0x36, 0xae, + 0x57, 0xfb, 0xf5, 0x7d, 0x37, 0x14, 0x61, 0x56, 0x41, 0x11, 0xdc, 0xa2, + 0xea, 0xc3, 0xcb, 0x45, 0xc2, 0xae, 0xb3, 0xfd, 0x2f, 0x3e, 0xc9, 0xee, + 0x47, 0x5f, 0xa4, 0xfd, 0xd8, 0xed, 0x00, 0xbc, 0xf8, 0x1f, 0xa3, 0xf5, + 0x95, 0xc8, 0x00, 0xb5, 0x8c, 0xae, 0xce, 0xa9, 0x4c, 0xfd, 0x4a, 0x83, + 0xa6, 0xb8, 0x6e, 0xd4, 0x87, 0x9a, 0x3a, 0x25, 0xeb, 0x77, 0x35, 0xa9, + 0xac, 0xcf, 0x71, 0x6e, 0xb1, 0x13, 0x4e, 0x86, 0x53, 0xfb, 0xba, 0x40, + 0xd9, 0x15, 0x8c, 0x6f, 0xbe, 0x5e, 0x05, 0xfa, 0x1a, 0x27, 0xb0, 0xb9, + 0x0e, 0x6e, 0x45, 0xf5, 0xc7, 0xed, 0x26, 0xbd, 0xcd, 0x35, 0xb6, 0x96, + 0xf5, 0xe4, 0x87, 0xb6, 0x9a, 0x30, 0xd1, 0xdb, 0x5c, 0x83, 0xb2, 0x9e, + 0xd4, 0xdd, 0x6e, 0x50, 0x28, 0x02, 0xe5, 0x0a, 0x3b, 0x5d, 0x01, 0xdd, + 0x1e, 0xf2, 0x8c, 0x86, 0x49, 0x7d, 0x62, 0x67, 0x58, 0x0e, 0xd9, 0xf6, + 0x10, 0x63, 0x63, 0x94, 0x7b, 0x0b, 0x08, 0x07, 0xb6, 0x34, 0x2a, 0x1c, + 0xdf, 0xd0, 0x44, 0xde, 0x3a, 0x86, 0x3b, 0x3e, 0x85, 0x3c, 0xd3, 0x62, + 0xa2, 0x51, 0x83, 0xc6, 0x5e, 0xc4, 0x47, 0xea, 0xec, 0xd2, 0x79, 0xfa, + 0x41, 0x03, 0xe1, 0x4b, 0xc4, 0x2d, 0x35, 0xa8, 0x8d, 0x29, 0x67, 0xcd, + 0x05, 0xb8, 0xc5, 0x4c, 0x06, 0xd7, 0xc5, 0x38, 0x36, 0xdc, 0x1e, 0x68, + 0x1e, 0x49, 0xb3, 0xb3, 0xce, 0x8b, 0x87, 0xdf, 0x84, 0x8a, 0x3e, 0x67, + 0x7b, 0x4d, 0xa8, 0xd6, 0xe0, 0xd7, 0xa7, 0xe2, 0xe6, 0xc9, 0x73, 0xd5, + 0x19, 0x83, 0x62, 0x10, 0xf0, 0x91, 0x71, 0x78, 0xe3, 0x20, 0x7c, 0xec, + 0x5e, 0x15, 0xf4, 0xfb, 0x7a, 0xf9, 0xa1, 0x12, 0xbc, 0x31, 0x3c, 0x3a, + 0xc9, 0xfd, 0xd0, 0x14, 0xfe, 0x1b, 0xb3, 0x43, 0xdb, 0x83, 0x9a, 0xec, + 0x05, 0xd1, 0xb1, 0x0c, 0xd6, 0xf9, 0xba, 0x5c, 0x86, 0xf6, 0x95, 0x01, + 0x65, 0xad, 0x44, 0x59, 0xd0, 0xac, 0x61, 0x60, 0x5a, 0x46, 0x06, 0xa8, + 0x15, 0xa5, 0xab, 0xf7, 0xd9, 0x64, 0x5d, 0x85, 0xa5, 0x7d, 0xf3, 0x7e, + 0x25, 0xb6, 0x97, 0xd3, 0x77, 0x96, 0xed, 0x02, 0x1d, 0xc6, 0x74, 0xa4, + 0x7d, 0xbe, 0xfe, 0x70, 0xf1, 0x7d, 0x00, 0xbc, 0xbf, 0xb8, 0x81, 0xb7, + 0xfc, 0x95, 0xf5, 0xb3, 0x83, 0x00, 0x4e, 0x17, 0x33, 0xf5, 0x79, 0x55, + 0x40, 0xec, 0x94, 0x3c, 0x7f, 0x9e, 0xeb, 0xf2, 0xbe, 0xa2, 0x9a, 0x84, + 0xf7, 0xe1, 0xe2, 0xfb, 0xf8, 0x73, 0xcd, 0x30, 0xb2, 0xcf, 0xd7, 0xf7, + 0xb8, 0x2e, 0xfb, 0x7c, 0x9f, 0xfd, 0xdd, 0xe3, 0x80, 0x82, 0x69, 0x75, + 0x82, 0x0a, 0x42, 0xb8, 0x3c, 0xde, 0x6d, 0x87, 0x70, 0xc0, 0xb1, 0xf9, + 0x59, 0x16, 0xc6, 0x27, 0x18, 0x7f, 0xfd, 0x78, 0x2c, 0x8f, 0x5e, 0x90, + 0x44, 0x88, 0xc5, 0xa1, 0x59, 0xcb, 0x29, 0xbc, 0xbf, 0x18, 0x02, 0xf6, + 0x22, 0xa5, 0xcf, 0xae, 0x4f, 0xed, 0x62, 0xff, 0xd7, 0xf6, 0x5f, 0x94, + 0xcd, 0x72, 0xda, 0xb1, 0x7d, 0xc7, 0xd0, 0xe9, 0xcd, 0x7d, 0x51, 0x16, + 0x80, 0x78, 0x39, 0x25, 0xeb, 0xbf, 0x70, 0x78, 0xef, 0x20, 0xf3, 0x98, + 0x4c, 0x3b, 0x9b, 0x7d, 0x10, 0x3b, 0x5f, 0x6b, 0xd9, 0xc7, 0xf5, 0x4f, + 0xfd, 0x38, 0xc4, 0x2a, 0xb8, 0x02, 0x90, 0xad, 0xe2, 0x2f, 0x5d, 0x43, + 0xab, 0xf3, 0xd3, 0x70, 0xbb, 0x64, 0xc5, 0xad, 0x6c, 0x8a, 0xf2, 0xca, + 0xf4, 0xcb, 0x57, 0x20, 0x8f, 0x8b, 0xd5, 0xc5, 0x94, 0xed, 0xfd, 0x29, + 0xc7, 0xb5, 0x7d, 0xcf, 0x75, 0xec, 0x12, 0xde, 0x5f, 0xaf, 0x54, 0x97, + 0x13, 0x36, 0x39, 0xac, 0x1f, 0x13, 0x76, 0xa5, 0x40, 0x57, 0x97, 0x33, + 0x9f, 0x0d, 0x69, 0xf7, 0x5c, 0xe6, 0xda, 0xac, 0xea, 0x5a, 0x68, 0x97, + 0x7e, 0xed, 0x97, 0x4d, 0xe8, 0x82, 0xff, 0xb5, 0x2f, 0x0e, 0xb0, 0x1a, + 0x4e, 0x5e, 0xbb, 0x85, 0x70, 0x5c, 0xfc, 0xca, 0x58, 0x36, 0x0e, 0x23, + 0xb8, 0x98, 0xb3, 0x64, 0x5c, 0xf6, 0x39, 0x21, 0x0d, 0x80, 0xb5, 0x5c, + 0xfc, 0xc5, 0xfa, 0x5f, 0x4e, 0x06, 0xb2, 0x35, 0x0c, 0x5c, 0x2b, 0xcc, + 0xd3, 0x00, 0x12, 0x53, 0xce, 0x9b, 0x95, 0x91, 0x1a, 0xe5, 0xea, 0x02, + 0x10, 0xbf, 0x36, 0xdb, 0xa2, 0x3f, 0xc2, 0x51, 0x29, 0x96, 0x49, 0x32, + 0xcd, 0xfd, 0xa5, 0xc1, 0xbf, 0x3c, 0x57, 0xb8, 0xf8, 0xe6, 0x3c, 0xe4, + 0x94, 0x21, 0x28, 0x01, 0x05, 0x70, 0x8e, 0x43, 0xd0, 0xc6, 0xc0, 0xa1, + 0xcc, 0xb5, 0x86, 0xbf, 0xd4, 0x7f, 0x35, 0x29, 0x9c, 0x12, 0x32, 0xd0, + 0xe3, 0xb4, 0x4e, 0x05, 0x19, 0xa8, 0x3c, 0xa3, 0xbb, 0xa8, 0x4a, 0x6c, + 0x5c, 0xb5, 0xb3, 0x0c, 0x78, 0xbd, 0x34, 0x52, 0xa6, 0xb3, 0xd4, 0x86, + 0xa0, 0xa7, 0xd0, 0x2a, 0x41, 0x21, 0x04, 0x6a, 0x49, 0x33, 0x7e, 0xaf, + 0xef, 0x37, 0xa5, 0x53, 0x50, 0x6d, 0x95, 0x36, 0x26, 0x15, 0x94, 0xe2, + 0xc0, 0x2c, 0x08, 0xcb, 0x49, 0x50, 0x42, 0x08, 0x5d, 0xee, 0xa0, 0x44, + 0x47, 0x03, 0x2b, 0x54, 0xfd, 0xa3, 0xfd, 0xde, 0x6a, 0xdb, 0xf5, 0xf5, + 0xa2, 0x55, 0x67, 0x0c, 0x82, 0x05, 0x84, 0xb3, 0x45, 0xfb, 0x34, 0x71, + 0x75, 0x14, 0xd6, 0x26, 0xda, 0x5e, 0x0e, 0x34, 0x6f, 0x1f, 0x2b, 0xae, + 0x28, 0xe1, 0xeb, 0x32, 0x56, 0x8a, 0xea, 0x42, 0x7c, 0x4b, 0xd1, 0x65, + 0x41, 0xc7, 0xdb, 0x7d, 0xb8, 0x19, 0x19, 0xb0, 0xe1, 0x58, 0x4c, 0x7b, + 0x30, 0x03, 0xde, 0x5c, 0x1c, 0xd8, 0xb4, 0x47, 0x6f, 0x18, 0xb0, 0xd5, + 0xcc, 0x8c, 0x82, 0x48, 0xed, 0xd1, 0x10, 0xa9, 0x6a, 0x55, 0xc3, 0xa7, + 0xe6, 0x0c, 0xa8, 0xab, 0x1a, 0xd6, 0xa1, 0x1a, 0xfe, 0xa7, 0x56, 0xaa, + 0xda, 0x8f, 0x81, 0x70, 0xcd, 0xcd, 0xa8, 0x98, 0xb9, 0x19, 0x98, 0xde, + 0x13, 0x19, 0xcf, 0xec, 0xf1, 0x98, 0xdc, 0xa3, 0xb6, 0x66, 0xb4, 0x8d, + 0x29, 0x97, 0x0d, 0xb8, 0x02, 0xe0, 0x29, 0x3d, 0xf6, 0x73, 0x18, 0xf8, + 0x37, 0xa3, 0x7c, 0xe1, 0x4f, 0x17, 0xc3, 0xb2, 0x78, 0x1e, 0xcc, 0xcd, + 0x41, 0x75, 0x5a, 0x95, 0x3d, 0x9e, 0x57, 0x24, 0x03, 0x01, 0x9b, 0xf3, + 0x3c, 0x05, 0x18, 0xf3, 0x88, 0x01, 0xbf, 0x6c, 0xb0, 0x96, 0x49, 0xef, + 0x79, 0x51, 0xd5, 0xe6, 0xe6, 0x60, 0x7a, 0x52, 0xd5, 0x8d, 0xc9, 0xd0, + 0x69, 0x4c, 0x73, 0xc0, 0xa4, 0xa7, 0xda, 0x4b, 0x01, 0xbf, 0xa2, 0xb2, + 0x4d, 0x5a, 0x0d, 0x3e, 0x37, 0x63, 0xa5, 0xf5, 0x74, 0x5e, 0x96, 0x5f, + 0xd3, 0x76, 0x46, 0xa9, 0x7d, 0xb8, 0x75, 0x1d, 0xbe, 0x92, 0x31, 0xec, + 0xe4, 0x78, 0xae, 0x30, 0x50, 0x3c, 0xf3, 0x91, 0x1a, 0x47, 0xc4, 0x20, + 0x54, 0x7f, 0x23, 0x94, 0x35, 0x2e, 0x6f, 0xd7, 0x73, 0x88, 0x7a, 0x0b, + 0x88, 0xc1, 0x92, 0x2e, 0x07, 0x58, 0x2b, 0x6d, 0xdc, 0xcc, 0x7e, 0xce, + 0xb5, 0xd0, 0x05, 0x17, 0x49, 0x2d, 0x10, 0x2c, 0x08, 0xc1, 0x53, 0x63, + 0x12, 0xe6, 0x95, 0xd9, 0xee, 0x40, 0xc1, 0xac, 0xfc, 0x40, 0x01, 0xb6, + 0x7a, 0xa2, 0x17, 0x86, 0x43, 0x81, 0xbd, 0x0e, 0x1c, 0x0f, 0x7a, 0x6c, + 0x09, 0x14, 0x04, 0x0b, 0x80, 0xa0, 0xc7, 0x33, 0x4e, 0x21, 0x84, 0x64, + 0xed, 0x46, 0x41, 0xb3, 0x5c, 0xfd, 0xcc, 0xeb, 0xa9, 0x3f, 0x28, 0xc3, + 0xb7, 0xda, 0xdc, 0xfb, 0xdd, 0x1e, 0x05, 0xe0, 0x0f, 0xe9, 0xf1, 0x59, + 0x0d, 0xd7, 0x7a, 0x4a, 0xc3, 0xb5, 0x8c, 0xaf, 0xa7, 0x1c, 0xd8, 0xed, + 0x80, 0x42, 0xd7, 0xab, 0x70, 0xe1, 0x08, 0xee, 0x0b, 0x24, 0x11, 0x1a, + 0x48, 0x49, 0x0a, 0x98, 0xd7, 0x79, 0xb6, 0x1c, 0x62, 0x30, 0xc6, 0x26, + 0x50, 0x48, 0xe0, 0xa5, 0x0b, 0x40, 0x2f, 0x10, 0x14, 0x1c, 0x49, 0x2f, + 0xe3, 0x19, 0xc3, 0x16, 0x07, 0x8e, 0x6a, 0x3f, 0x15, 0xdd, 0x8e, 0x9d, + 0x00, 0x05, 0xd6, 0xb2, 0xfc, 0x89, 0xa0, 0x17, 0x9e, 0x2b, 0x94, 0xcf, + 0x02, 0x38, 0x1d, 0x44, 0xa0, 0xc1, 0xd5, 0x8e, 0xa0, 0x27, 0x7b, 0x94, + 0xf4, 0xc7, 0x72, 0xc6, 0x1c, 0x05, 0x32, 0x0b, 0x55, 0x54, 0xcf, 0xc6, + 0x5b, 0x8e, 0x60, 0x22, 0x80, 0xa3, 0xd6, 0x6f, 0x42, 0x01, 0xb5, 0xac, + 0x67, 0xad, 0xf6, 0xf1, 0x66, 0x01, 0xb5, 0xa4, 0x94, 0xa9, 0xcf, 0xb9, + 0xf8, 0x98, 0xda, 0xd7, 0xd7, 0x6e, 0xfe, 0x15, 0xf8, 0x2f, 0x2a, 0xe8, + 0xd8, 0x2f, 0xf5, 0xb8, 0xf9, 0xaf, 0xa2, 0xfb, 0xe2, 0xcb, 0xb5, 0x7d, + 0xee, 0xed, 0x5b, 0xe0, 0xfc, 0x2b, 0x80, 0x02, 0x43, 0x19, 0xf8, 0xd4, + 0xec, 0xec, 0x2c, 0x9b, 0x36, 0x6d, 0x62, 0xd3, 0xa6, 0x4d, 0x9c, 0x3c, + 0x79, 0x92, 0x4d, 0x15, 0x42, 0x08, 0x96, 0x91, 0x01, 0x5f, 0x5d, 0x68, + 0x9d, 0x0b, 0x61, 0x5c, 0x10, 0x01, 0xab, 0x0c, 0x78, 0xca, 0xd8, 0x5c, + 0x4e, 0x9f, 0x06, 0x70, 0xb5, 0x69, 0xd3, 0xa6, 0x10, 0x70, 0x65, 0xfc, + 0xda, 0x50, 0xac, 0xb5, 0xd7, 0xad, 0x49, 0x07, 0x89, 0x9d, 0x8f, 0xc2, + 0xd6, 0x5e, 0xb7, 0x86, 0x13, 0xaf, 0x1e, 0x0b, 0xf3, 0x39, 0x79, 0xf2, + 0x64, 0x58, 0xe6, 0xb5, 0xd7, 0xad, 0xe1, 0x42, 0xeb, 0x5c, 0x0c, 0xa8, + 0x65, 0x7c, 0x9a, 0x75, 0x50, 0x60, 0xae, 0x6b, 0xff, 0xde, 0xff, 0x14, + 0xed, 0xdf, 0xff, 0xa0, 0x56, 0xed, 0x3e, 0xbc, 0x09, 0x78, 0x6d, 0x05, + 0xb3, 0x12, 0x42, 0x68, 0x80, 0x56, 0xbc, 0x3f, 0x2a, 0x8d, 0x54, 0xe8, + 0x2c, 0xb5, 0x62, 0xa0, 0x2d, 0xaf, 0xed, 0x53, 0x76, 0xfb, 0x9f, 0xaf, + 0x1a, 0x5f, 0x65, 0xd7, 0xc5, 0x15, 0x82, 0x76, 0xc2, 0xd7, 0xd8, 0x87, + 0xea, 0x43, 0xfb, 0x6a, 0xfb, 0x3e, 0x6d, 0x3f, 0x8a, 0x93, 0x52, 0x22, + 0x5c, 0xd1, 0xe7, 0xcb, 0xb3, 0xc6, 0x4e, 0xef, 0xf8, 0x44, 0x8d, 0xe7, + 0x5f, 0xb0, 0xae, 0x8f, 0xb4, 0xf9, 0x91, 0xa5, 0x06, 0x47, 0xbe, 0x1c, + 0x8d, 0x9f, 0x7b, 0x5d, 0xc9, 0xd4, 0x8d, 0xea, 0xd8, 0xbc, 0xfd, 0xfe, + 0x47, 0x79, 0xea, 0xd3, 0x3b, 0x38, 0xde, 0x78, 0x93, 0x7d, 0x2f, 0x7b, + 0x6c, 0xa9, 0x5f, 0x1f, 0xf3, 0x75, 0xbc, 0x11, 0xff, 0x40, 0xc4, 0x91, + 0xa5, 0x06, 0x77, 0x58, 0x08, 0xab, 0xa9, 0x1b, 0xcb, 0x18, 0xf4, 0xbc, + 0xf1, 0xf5, 0xfc, 0x0b, 0x4d, 0xf6, 0xbd, 0xdc, 0xc8, 0xf4, 0xb5, 0x75, + 0x44, 0x5d, 0x93, 0xad, 0xd6, 0xd7, 0xee, 0x2f, 0x1f, 0x64, 0xec, 0xb4, + 0x6a, 0x97, 0xd2, 0x88, 0x4b, 0x69, 0xfb, 0x04, 0xe5, 0xe7, 0xd4, 0x73, + 0x88, 0x70, 0x2c, 0x45, 0x1f, 0xd3, 0xb7, 0x7e, 0xf0, 0x83, 0xbc, 0x32, + 0x37, 0x4b, 0xc5, 0x4d, 0x8c, 0xeb, 0x5f, 0xa4, 0xb2, 0x20, 0x57, 0xcb, + 0xc1, 0xaf, 0xc6, 0x7f, 0xed, 0xc3, 0xe1, 0xfa, 0xfc, 0x77, 0xbe, 0xc7, + 0xfa, 0x72, 0xfc, 0x79, 0xe7, 0xc2, 0x5f, 0xc4, 0x41, 0x58, 0xcb, 0xe5, + 0x31, 0x0c, 0x00, 0xec, 0x62, 0xe2, 0x56, 0xe2, 0x63, 0x35, 0x76, 0x10, + 0x01, 0xc5, 0x6c, 0x80, 0xd6, 0x8f, 0x7f, 0xa2, 0xda, 0xe1, 0xbd, 0xbf, + 0x5c, 0xe3, 0xfc, 0xdb, 0x67, 0xc3, 0xf8, 0x5b, 0x6f, 0xf8, 0x20, 0x0b, + 0xbc, 0x1d, 0x3b, 0xa6, 0x73, 0xe5, 0xca, 0x95, 0x2b, 0x57, 0xae, 0x5c, + 0xb9, 0x72, 0xe5, 0xca, 0x95, 0x2b, 0x57, 0xae, 0x5c, 0xb9, 0x72, 0xe5, + 0xca, 0x95, 0x2b, 0x57, 0xae, 0x5c, 0xb9, 0x72, 0xe5, 0xca, 0x95, 0x2b, + 0xd7, 0xf0, 0xca, 0xa1, 0x5a, 0xb9, 0x72, 0xe5, 0xca, 0x95, 0x2b, 0xd7, + 0xbb, 0xa5, 0x43, 0x25, 0xf8, 0x54, 0x07, 0x79, 0x42, 0x52, 0xaf, 0xd6, + 0xc1, 0x29, 0xc0, 0x88, 0x8a, 0xea, 0x2c, 0xb5, 0x68, 0xb7, 0xd5, 0x44, + 0x8f, 0x0a, 0x35, 0x32, 0x81, 0x5a, 0x03, 0x94, 0x04, 0x51, 0x99, 0x6d, + 0x03, 0x80, 0x4a, 0x9b, 0x2c, 0x94, 0x06, 0xaf, 0x8a, 0xc1, 0xb0, 0x52, + 0xe2, 0x8d, 0xc4, 0x32, 0xd3, 0x63, 0x97, 0x83, 0x7a, 0xd9, 0x71, 0x7e, + 0xd7, 0x8f, 0xa0, 0x55, 0x29, 0xe5, 0x48, 0xdb, 0x4e, 0x2b, 0x87, 0xdf, + 0xf5, 0x71, 0xf5, 0x04, 0x9e, 0xf0, 0xc5, 0xe1, 0x94, 0xfa, 0x2f, 0x57, + 0xdf, 0xca, 0x48, 0x09, 0x7f, 0x29, 0x3e, 0x09, 0xdf, 0xf6, 0x63, 0x97, + 0x9b, 0x13, 0xba, 0x04, 0x87, 0xa2, 0xe9, 0x96, 0xfe, 0xeb, 0x12, 0x26, + 0xa1, 0x7d, 0xc6, 0x47, 0x6c, 0x0e, 0x0b, 0x1a, 0x03, 0x6b, 0xa9, 0xc9, + 0xa8, 0x22, 0x15, 0xa8, 0x15, 0xcf, 0x58, 0xf6, 0x03, 0xa8, 0x2c, 0xbb, + 0x24, 0x48, 0xcb, 0x06, 0x47, 0x85, 0x71, 0x52, 0x72, 0xdf, 0x73, 0x07, + 0xa8, 0x1f, 0x39, 0xd2, 0x0f, 0xde, 0x4a, 0x81, 0x7d, 0x85, 0xf9, 0x64, + 0x00, 0x78, 0x44, 0x51, 0xf0, 0xd8, 0x9d, 0x3b, 0xb9, 0xef, 0xd9, 0xfd, + 0x3c, 0xfd, 0xdb, 0xbb, 0x00, 0xb8, 0xef, 0xd9, 0xfd, 0xa9, 0x10, 0xac, + 0xbe, 0xbc, 0xac, 0x32, 0x86, 0x75, 0x31, 0xb0, 0xad, 0x61, 0xc0, 0x59, + 0x69, 0xb0, 0x31, 0x69, 0xef, 0xc3, 0xb8, 0x9d, 0x28, 0x8a, 0x30, 0xde, + 0xb4, 0x49, 0x16, 0x7c, 0x2c, 0x35, 0xce, 0x6a, 0x9f, 0xf6, 0x19, 0x1f, + 0x70, 0xd5, 0xfe, 0x35, 0xbf, 0x3b, 0xeb, 0xb8, 0x36, 0x5a, 0x90, 0xd0, + 0x74, 0x5c, 0xc6, 0x06, 0xe0, 0x46, 0xec, 0x5a, 0x76, 0x1c, 0x35, 0x09, + 0xcb, 0xe4, 0xdb, 0x71, 0x14, 0xea, 0xc2, 0x80, 0xb6, 0x3a, 0x8e, 0x82, + 0x0c, 0xb8, 0x0e, 0x24, 0xd1, 0x14, 0x26, 0x0e, 0x14, 0x2c, 0x0b, 0xda, + 0x50, 0xb4, 0x20, 0x5b, 0x56, 0x5e, 0x42, 0x94, 0x39, 0x98, 0x02, 0xac, + 0x92, 0x48, 0x0e, 0x16, 0x05, 0x47, 0x84, 0xc4, 0xed, 0xc6, 0xe3, 0x0c, + 0xe4, 0x6a, 0x39, 0xd0, 0x55, 0x41, 0x14, 0x28, 0xeb, 0xaf, 0x10, 0xb7, + 0x97, 0x9a, 0xe1, 0x3a, 0x00, 0xc5, 0x5a, 0x7c, 0x69, 0xa9, 0xbd, 0xd4, + 0xc4, 0x2d, 0x16, 0xe2, 0x71, 0xc5, 0x1a, 0xed, 0xbe, 0xc9, 0x71, 0xc2, + 0x2a, 0x4b, 0xd4, 0xae, 0x06, 0x7a, 0x97, 0x94, 0x99, 0x14, 0x6e, 0x96, + 0x52, 0xfa, 0xb8, 0x6e, 0x39, 0x04, 0x7d, 0x99, 0xa5, 0xef, 0xb7, 0x71, + 0xdd, 0x72, 0x22, 0x6d, 0x99, 0xf6, 0x09, 0x39, 0xf0, 0xb8, 0x5e, 0xad, + 0x2e, 0x29, 0x40, 0x4b, 0x88, 0xcc, 0xbb, 0xbb, 0xac, 0x7c, 0x2e, 0x35, + 0x58, 0xab, 0x5a, 0x4e, 0xc7, 0x5f, 0x78, 0xed, 0x36, 0xee, 0x88, 0x8b, + 0x3b, 0x24, 0x0c, 0xd1, 0x6b, 0xb7, 0x33, 0x7d, 0x01, 0xf8, 0x81, 0x8c, + 0xf9, 0x4a, 0xb3, 0xf7, 0xad, 0xbe, 0x39, 0x79, 0xee, 0x69, 0xb7, 0xdb, + 0x0a, 0xae, 0x62, 0xc9, 0xd8, 0xb4, 0xcf, 0xb4, 0x49, 0x1e, 0xd7, 0x6f, + 0xbd, 0xde, 0xa5, 0xfe, 0xf7, 0xdf, 0xcb, 0xe9, 0x33, 0xea, 0x80, 0xd8, + 0x38, 0x3a, 0xca, 0xc6, 0x04, 0xe0, 0xea, 0xd4, 0xe2, 0x62, 0x08, 0x6d, + 0xb2, 0xb5, 0xf8, 0xe4, 0x93, 0x9c, 0xda, 0xbe, 0xbd, 0xcf, 0x1e, 0x34, + 0xf4, 0x69, 0xc0, 0xb6, 0x91, 0x01, 0x72, 0x65, 0xc5, 0xa7, 0xe9, 0xd4, + 0xe2, 0x62, 0x58, 0x56, 0xa0, 0xaf, 0x5c, 0xb6, 0x76, 0x6b, 0x5b, 0x83, + 0xb1, 0xda, 0x46, 0x54, 0xd6, 0x45, 0x16, 0x19, 0xd5, 0xdb, 0x36, 0x14, + 0xcb, 0x5e, 0x1e, 0x0e, 0xd3, 0x29, 0x25, 0x81, 0x58, 0xa3, 0x89, 0xf8, + 0xa4, 0x46, 0x13, 0x69, 0x0c, 0x5c, 0xcb, 0xce, 0x63, 0xa5, 0x88, 0xad, + 0xed, 0xdb, 0xb7, 0xf7, 0x81, 0xcc, 0x1e, 0x78, 0xf0, 0x41, 0xb6, 0x8f, + 0x8e, 0xb2, 0x51, 0xc3, 0xcc, 0xbe, 0xfc, 0xa5, 0x2f, 0x01, 0x23, 0xbc, + 0xf5, 0x7a, 0x17, 0x78, 0x0f, 0x00, 0x7e, 0xb7, 0x04, 0x74, 0x68, 0x5b, + 0x7d, 0xdf, 0x8b, 0xff, 0xf1, 0x45, 0x6e, 0xff, 0x87, 0x11, 0x44, 0xeb, + 0xf6, 0x7f, 0x78, 0x3b, 0xdf, 0xfe, 0xe6, 0xb7, 0xf9, 0xe8, 0xc7, 0x3e, + 0x3a, 0x74, 0x79, 0x76, 0x01, 0x36, 0xda, 0xe2, 0x4a, 0x01, 0xb5, 0x6a, + 0x64, 0x43, 0x70, 0x56, 0xaa, 0x24, 0x54, 0x2b, 0xed, 0x7a, 0xee, 0x6a, + 0x05, 0x6b, 0x99, 0xfd, 0xe9, 0x77, 0x4b, 0x20, 0xfc, 0x68, 0x1d, 0x49, + 0xdb, 0xd7, 0x35, 0x33, 0x40, 0x2d, 0x88, 0x01, 0xb5, 0x00, 0x48, 0x00, + 0xb5, 0x54, 0x98, 0x82, 0x16, 0x15, 0xba, 0x0d, 0x30, 0x60, 0xca, 0x91, + 0x3a, 0xb2, 0xe1, 0x33, 0x76, 0x73, 0x85, 0x85, 0xb6, 0x17, 0x2f, 0xc4, + 0x1b, 0xf3, 0xca, 0xa7, 0xeb, 0x42, 0x13, 0x64, 0x63, 0x21, 0x9c, 0xf0, + 0xe6, 0x8e, 0x4f, 0x21, 0x97, 0x5a, 0xf0, 0xfa, 0x42, 0x68, 0x2e, 0xba, + 0x2d, 0xe4, 0x91, 0x37, 0x11, 0xed, 0x85, 0x08, 0x77, 0x55, 0x53, 0x60, + 0x18, 0x9a, 0x47, 0xad, 0xed, 0xcf, 0x01, 0xf0, 0xf8, 0x93, 0xd9, 0xa0, + 0xb7, 0xba, 0xeb, 0xd1, 0xeb, 0xbe, 0x48, 0x65, 0x7d, 0x85, 0xc7, 0x9f, + 0xfc, 0xd5, 0x4c, 0x9b, 0x86, 0x5f, 0x8d, 0x02, 0x9e, 0x9d, 0xe5, 0xb1, + 0xa3, 0x5f, 0xe5, 0xd1, 0x6f, 0xcd, 0x42, 0xbb, 0x05, 0xdf, 0xd2, 0x70, + 0xab, 0xb6, 0xd5, 0x4e, 0x4d, 0x5d, 0xc7, 0xa5, 0x56, 0xfc, 0x47, 0x6d, + 0xc2, 0x8d, 0x3e, 0xff, 0x4c, 0x66, 0xd9, 0x06, 0x69, 0xa5, 0x40, 0x2d, + 0x40, 0xed, 0xcf, 0xf5, 0x05, 0xb5, 0x7f, 0x8b, 0x7a, 0x5f, 0x9b, 0xf3, + 0xf5, 0x55, 0x08, 0xd4, 0xba, 0x5c, 0xaa, 0xdc, 0x72, 0x3f, 0x8d, 0xa5, + 0x26, 0x75, 0x7d, 0xfd, 0x95, 0xb5, 0xde, 0x7a, 0x65, 0x2f, 0x3b, 0xcb, + 0x1d, 0x4a, 0xc5, 0x0a, 0x9d, 0x6e, 0x8b, 0x52, 0x31, 0x3e, 0xe5, 0xd4, + 0x0e, 0x7b, 0x66, 0x51, 0x72, 0xff, 0x2d, 0x1d, 0xc4, 0x06, 0x81, 0x3c, + 0x2d, 0x11, 0x1b, 0xf4, 0x39, 0x56, 0xaf, 0xcb, 0xd3, 0xfa, 0xfa, 0x5a, + 0xaf, 0xef, 0x7d, 0xa5, 0x44, 0x7b, 0x32, 0x9a, 0xb4, 0x56, 0x76, 0xab, + 0xb4, 0x7d, 0x8f, 0xb2, 0x28, 0xd3, 0xd6, 0xd7, 0x91, 0x66, 0xbd, 0x3c, + 0x57, 0xc7, 0x1f, 0x55, 0x48, 0xd7, 0x5a, 0xd1, 0xa5, 0xd9, 0xf5, 0xf5, + 0xba, 0xa0, 0xd9, 0x95, 0x48, 0xd9, 0xa1, 0xea, 0x56, 0xf0, 0xfc, 0x16, + 0xe5, 0x33, 0xf3, 0xec, 0x70, 0xa5, 0x86, 0x87, 0x55, 0x63, 0xe7, 0xeb, + 0xef, 0x75, 0xdf, 0x62, 0xea, 0xbd, 0x75, 0x7e, 0xd4, 0x3d, 0x3d, 0x14, + 0x00, 0x2a, 0x09, 0x7c, 0x5a, 0xae, 0x6f, 0x8e, 0x5d, 0x47, 0x0f, 0xe1, + 0x1f, 0xa0, 0x1f, 0x3b, 0x11, 0x4f, 0x9f, 0x75, 0xa7, 0x63, 0xc7, 0x0f, + 0x93, 0xd7, 0xdf, 0xe4, 0xba, 0xfc, 0xa8, 0x7b, 0x1a, 0x46, 0xd4, 0xfe, + 0xd5, 0xa7, 0xeb, 0xd8, 0xf9, 0x7a, 0xf6, 0x4b, 0x0b, 0x48, 0x6a, 0xb8, + 0x1a, 0x8f, 0x71, 0x7c, 0xb2, 0xc2, 0x91, 0xb9, 0x16, 0xd5, 0xd1, 0x26, + 0x75, 0xd7, 0xa5, 0xf9, 0xaa, 0xea, 0x5b, 0xc5, 0x6d, 0x02, 0xf9, 0xaf, + 0x05, 0xdc, 0x96, 0x9e, 0xef, 0x4a, 0x40, 0x5a, 0xc3, 0x00, 0xb4, 0xb2, + 0xb4, 0xff, 0x6b, 0xfb, 0x63, 0x80, 0xdf, 0x34, 0x70, 0x55, 0x9a, 0x4d, + 0x12, 0x78, 0x95, 0x4c, 0x6b, 0xdb, 0x5f, 0x0c, 0x90, 0xcb, 0x56, 0x5a, + 0x3e, 0x43, 0xa5, 0x4b, 0xb4, 0xcf, 0x72, 0xc0, 0x17, 0xd3, 0xf6, 0xb1, + 0xf3, 0xb5, 0xee, 0xc3, 0xed, 0xe3, 0x7a, 0xfd, 0x8a, 0x4a, 0x91, 0xeb, + 0x6a, 0x56, 0xda, 0x71, 0x9d, 0xbc, 0xe7, 0xb2, 0x55, 0xe1, 0xca, 0x01, + 0xa6, 0x7e, 0xde, 0x75, 0xa9, 0xdb, 0x5a, 0xed, 0xcf, 0xc4, 0x3d, 0x97, + 0xb9, 0x36, 0xf3, 0x7c, 0xd8, 0x1c, 0xd9, 0x9a, 0xbe, 0xa3, 0xf3, 0x16, + 0x8c, 0x35, 0xa1, 0x5a, 0xac, 0xd1, 0x90, 0x1d, 0x7c, 0xe9, 0xd3, 0x5c, + 0x92, 0xd8, 0x23, 0x48, 0xb5, 0xea, 0x38, 0x4d, 0x4f, 0xd1, 0x3c, 0x86, + 0xf9, 0xe8, 0xc2, 0x30, 0x98, 0x96, 0x95, 0x7e, 0xbc, 0x61, 0x58, 0x89, + 0xd2, 0x32, 0xe3, 0xe5, 0xa5, 0xf4, 0x31, 0xfa, 0xa1, 0xfd, 0xaf, 0xb0, + 0xcf, 0xb5, 0x65, 0x3f, 0x5a, 0x18, 0x16, 0xb0, 0x95, 0x06, 0xd7, 0x6a, + 0x2d, 0x35, 0x35, 0x6c, 0x3e, 0x3e, 0x96, 0x72, 0xbc, 0xeb, 0xb3, 0xc3, + 0x85, 0x56, 0x37, 0x7e, 0x1d, 0x2e, 0xa8, 0x50, 0x1e, 0xa9, 0xe0, 0xb5, + 0x07, 0xdf, 0xad, 0xba, 0xc2, 0xa5, 0xdd, 0xad, 0xc7, 0xc1, 0x54, 0x41, + 0x5b, 0xc7, 0x55, 0xf0, 0xce, 0x1c, 0xd4, 0xeb, 0x75, 0xdc, 0x91, 0x1a, + 0xfe, 0x99, 0x46, 0xc2, 0x83, 0x40, 0x38, 0x15, 0x0c, 0x42, 0x4b, 0xad, + 0x5b, 0x72, 0x3a, 0x34, 0x2c, 0x1f, 0xa5, 0x91, 0x32, 0xad, 0xf6, 0x10, + 0x10, 0x60, 0xa7, 0x60, 0x8d, 0xb3, 0x17, 0xd4, 0x32, 0x84, 0x69, 0x01, + 0x1a, 0xa6, 0xe5, 0x8a, 0x42, 0xec, 0xe3, 0x06, 0x43, 0xc9, 0xe9, 0x44, + 0xe5, 0x76, 0x1a, 0x51, 0x99, 0x9c, 0x0e, 0x8d, 0x33, 0x07, 0xc2, 0xb2, + 0x56, 0xca, 0x75, 0x5a, 0xed, 0x06, 0x31, 0xa0, 0x16, 0x40, 0x60, 0xdd, + 0x53, 0x3a, 0x36, 0x0a, 0x32, 0xd9, 0x36, 0x2d, 0x4a, 0xee, 0x38, 0xad, + 0xa5, 0xec, 0xfa, 0xba, 0x23, 0x35, 0x3c, 0x03, 0x8b, 0x06, 0x5c, 0xa7, + 0x44, 0x1b, 0xbd, 0x3f, 0x47, 0xd4, 0xfe, 0x35, 0xf7, 0xc2, 0x76, 0x1f, + 0x6e, 0x3e, 0xdf, 0x61, 0x58, 0x4e, 0x9e, 0x26, 0x44, 0x79, 0x73, 0x66, + 0x3b, 0x8a, 0x8f, 0x4a, 0xaf, 0x80, 0x50, 0xd3, 0x93, 0x2a, 0x64, 0xda, + 0x8b, 0xc3, 0xa1, 0x22, 0xab, 0xbe, 0x1a, 0xa7, 0xab, 0xaa, 0x80, 0x55, + 0xcc, 0x69, 0x58, 0x96, 0x57, 0x65, 0x46, 0xa7, 0xdc, 0xb3, 0xa7, 0xaa, + 0xe0, 0x5b, 0x54, 0xf1, 0xe6, 0xbc, 0xb0, 0x2c, 0x93, 0x55, 0x98, 0x9e, + 0xac, 0x32, 0x3d, 0x13, 0x41, 0xb2, 0x1e, 0x79, 0x49, 0x63, 0x7b, 0xb6, + 0xa9, 0x91, 0xaf, 0xc9, 0x6a, 0x95, 0x47, 0xfe, 0x4f, 0x07, 0x7e, 0x67, + 0x91, 0xaf, 0xfc, 0x96, 0x02, 0x80, 0x19, 0x4d, 0x56, 0xab, 0x54, 0xf7, + 0xc4, 0x6a, 0xa4, 0x80, 0x55, 0x28, 0x70, 0x55, 0x04, 0x06, 0x53, 0x71, + 0xd5, 0xaa, 0x8a, 0xf5, 0x3c, 0x05, 0xc5, 0x02, 0x0d, 0xcf, 0x9a, 0x81, + 0xaa, 0xb6, 0xc3, 0xd3, 0x79, 0x54, 0x75, 0xbb, 0x55, 0xb5, 0xed, 0x0c, + 0xec, 0x99, 0x8e, 0xfc, 0x4f, 0x4f, 0x47, 0x6d, 0x63, 0xb7, 0x99, 0xe7, + 0xc5, 0xf3, 0x36, 0xc0, 0x2e, 0x5b, 0x36, 0xe4, 0xcb, 0xb4, 0x85, 0x51, + 0x6a, 0x1f, 0x6e, 0x8f, 0x9b, 0x5d, 0x64, 0xb7, 0x29, 0xa5, 0xa4, 0xec, + 0x08, 0xda, 0x29, 0x60, 0xa9, 0xf0, 0x99, 0xe6, 0x65, 0x00, 0x48, 0x5d, + 0x72, 0x99, 0xf2, 0x0f, 0x79, 0x1e, 0x31, 0xd7, 0xd8, 0xbe, 0xdf, 0x56, + 0xe3, 0xf2, 0x76, 0xba, 0xb4, 0xf3, 0x41, 0x12, 0x92, 0x94, 0xa2, 0xd5, + 0x7e, 0x8c, 0xc2, 0x28, 0x6d, 0xdc, 0xcc, 0x7e, 0xce, 0xf5, 0x74, 0x55, + 0xf0, 0xb0, 0x55, 0xb6, 0xdd, 0xc7, 0x88, 0xa0, 0xf5, 0x8e, 0x1a, 0x7f, + 0x5c, 0xd0, 0xeb, 0x04, 0xf1, 0xfb, 0xaa, 0x16, 0x0a, 0xb6, 0x75, 0xdc, + 0xe9, 0xb1, 0x05, 0xa8, 0x39, 0xd0, 0xd4, 0x40, 0xad, 0x31, 0x07, 0x16, + 0x02, 0x9d, 0x8e, 0xe8, 0x83, 0x30, 0x8f, 0xfc, 0x41, 0x9b, 0xcf, 0xfd, + 0x53, 0x97, 0xca, 0x77, 0x7b, 0xb4, 0xe8, 0xb1, 0x1b, 0x05, 0xb8, 0x32, + 0x40, 0xad, 0x31, 0x07, 0xee, 0x45, 0xad, 0x3f, 0x2c, 0xd4, 0xf3, 0xd8, + 0x83, 0x40, 0x3d, 0x90, 0x34, 0xac, 0xf6, 0x6c, 0x39, 0x30, 0x06, 0x8c, + 0x09, 0xbd, 0x8f, 0xac, 0x3e, 0xd9, 0x45, 0xe2, 0x27, 0x9e, 0x3f, 0xba, + 0x12, 0x10, 0x05, 0x7a, 0xb2, 0xa7, 0xcf, 0x91, 0x05, 0x10, 0x19, 0x80, + 0x44, 0xad, 0xe3, 0x56, 0xbb, 0xb4, 0xba, 0xfd, 0xbf, 0xd7, 0x92, 0xa3, + 0x21, 0x5b, 0xa8, 0x73, 0xad, 0x02, 0x74, 0x09, 0x44, 0xd0, 0xa3, 0x13, + 0x88, 0xf0, 0x3e, 0xdb, 0x9c, 0x87, 0x95, 0xad, 0x60, 0x21, 0xd0, 0x6d, + 0x6c, 0x7d, 0x0c, 0xc7, 0x5c, 0xab, 0x1c, 0x37, 0x77, 0xd7, 0x8e, 0xb6, + 0x49, 0x7e, 0xbc, 0xca, 0x7e, 0x2e, 0x9b, 0x58, 0x97, 0x6f, 0xf4, 0x3f, + 0xe7, 0xe2, 0x9b, 0x25, 0xf8, 0xcd, 0x0e, 0x6f, 0x9f, 0xf8, 0x1f, 0x61, + 0x90, 0x0d, 0xc0, 0xba, 0x9c, 0xdb, 0x6b, 0xaf, 0x55, 0x40, 0xad, 0xa9, + 0x29, 0x05, 0xfd, 0x99, 0xd5, 0x00, 0xa9, 0xb5, 0x28, 0x08, 0x95, 0x81, + 0x51, 0xd9, 0xd0, 0xa8, 0xcd, 0x37, 0xdd, 0xcc, 0xd9, 0xb3, 0x67, 0x43, + 0x5f, 0x6b, 0x2a, 0x6b, 0x99, 0xba, 0x69, 0x1d, 0x67, 0xcf, 0x9e, 0x8d, + 0xd9, 0x1b, 0x9f, 0x27, 0x5e, 0x3d, 0xc6, 0x9a, 0xca, 0xda, 0xcb, 0xe2, + 0x93, 0xf3, 0x11, 0x78, 0x2b, 0xe9, 0x73, 0x4d, 0x65, 0x2d, 0xeb, 0xd6, + 0xad, 0x03, 0xe0, 0xac, 0x65, 0x63, 0xa0, 0x5b, 0xc6, 0x7e, 0xd3, 0xa6, + 0x4d, 0xa4, 0xc9, 0x80, 0xbd, 0x6c, 0xa0, 0xd6, 0xb9, 0xf3, 0x17, 0xc2, + 0x32, 0x9c, 0xd3, 0x40, 0x2f, 0x53, 0x2e, 0x53, 0x7e, 0x53, 0x86, 0xb7, + 0x4f, 0xfc, 0x0f, 0xf5, 0xb8, 0xf0, 0x9b, 0xd6, 0x33, 0xcd, 0xc4, 0xb3, + 0x0f, 0xf3, 0x21, 0x32, 0x57, 0x88, 0x10, 0x70, 0xb5, 0xf0, 0x46, 0x83, + 0xb1, 0x0f, 0xa9, 0x71, 0xef, 0xd6, 0x99, 0x56, 0xec, 0xd1, 0x7b, 0x4b, + 0xc3, 0x3e, 0x2b, 0xeb, 0x93, 0xc8, 0x3a, 0x28, 0xbb, 0x2e, 0x6d, 0x0d, + 0xec, 0xdc, 0x72, 0x63, 0x9d, 0xe3, 0xaf, 0x35, 0x2e, 0xa9, 0x2f, 0x5b, + 0x49, 0x5f, 0xde, 0x6b, 0xf3, 0x8c, 0x7f, 0x7c, 0x27, 0x70, 0xa0, 0xcf, + 0xd7, 0xd6, 0x91, 0x3a, 0x47, 0x96, 0x54, 0xfa, 0x87, 0x7e, 0x7f, 0x17, + 0x7c, 0x7e, 0x3f, 0x66, 0x84, 0xeb, 0x9e, 0x5b, 0xab, 0x3c, 0xff, 0x42, + 0x93, 0xda, 0xe6, 0x78, 0x1a, 0xe3, 0x2b, 0x09, 0xd5, 0xda, 0x3a, 0x52, + 0xa7, 0x7a, 0xe3, 0x38, 0x70, 0x90, 0x87, 0x7e, 0x7f, 0x17, 0x8f, 0x7f, + 0x7e, 0x3f, 0xb5, 0xcd, 0x96, 0xaf, 0x43, 0x2d, 0xee, 0xf8, 0x44, 0x2d, + 0x06, 0xf1, 0xca, 0xf4, 0xb5, 0x7e, 0x2c, 0xf4, 0x35, 0x75, 0x63, 0x99, + 0xe6, 0x89, 0x42, 0xdc, 0xd7, 0x0b, 0xcd, 0x3e, 0x5f, 0x7b, 0xbf, 0xdb, + 0x64, 0xeb, 0xa7, 0x76, 0x30, 0xbf, 0x70, 0x9c, 0xf1, 0x0d, 0x0a, 0xbe, + 0xea, 0x9f, 0xee, 0x84, 0x80, 0x40, 0x35, 0x96, 0xd2, 0x0d, 0x8f, 0xe9, + 0x97, 0xbf, 0xff, 0x7d, 0x1c, 0xa0, 0xe5, 0xab, 0x31, 0xf6, 0xda, 0xfa, + 0x09, 0x9a, 0xfa, 0xda, 0x6e, 0x6a, 0xf4, 0xde, 0xbe, 0xb6, 0xba, 0x54, + 0x3a, 0x7a, 0xe6, 0x20, 0xef, 0x79, 0xcf, 0x18, 0x3f, 0x38, 0x75, 0x9a, + 0x0f, 0x6c, 0xdc, 0xc0, 0x99, 0x76, 0xff, 0xd3, 0xbd, 0xf1, 0x5f, 0xfb, + 0x30, 0xf3, 0xdf, 0xf9, 0x5e, 0x5f, 0x78, 0xdd, 0x7e, 0x97, 0x20, 0x45, + 0x0d, 0xfd, 0xae, 0x40, 0x7d, 0xa4, 0x16, 0x5b, 0x37, 0x71, 0x26, 0xbc, + 0x3e, 0x52, 0xa3, 0x29, 0x1b, 0xb4, 0x96, 0x9a, 0x48, 0x19, 0xdd, 0xe1, + 0x4e, 0x8d, 0xde, 0xdb, 0x97, 0x2e, 0xe9, 0x3f, 0x19, 0x9e, 0x1c, 0x57, + 0xcf, 0xca, 0x3f, 0x19, 0x6f, 0xb6, 0x45, 0x51, 0xd2, 0x3c, 0x73, 0x94, + 0x8a, 0x3b, 0xd5, 0xe7, 0xc7, 0x00, 0xb4, 0xce, 0xbf, 0x7d, 0x96, 0xeb, + 0xae, 0x5d, 0x17, 0x03, 0x6a, 0x9d, 0xbe, 0xf0, 0x72, 0xe8, 0xf7, 0xfc, + 0xdb, 0x67, 0x79, 0xf9, 0xfb, 0x01, 0xef, 0xe1, 0x6f, 0xc7, 0x8e, 0xe9, + 0x5c, 0xb9, 0x72, 0xe5, 0xca, 0x95, 0x2b, 0x57, 0xae, 0x5c, 0xb9, 0x72, + 0xe5, 0xca, 0x95, 0x2b, 0x57, 0xae, 0x5c, 0xb9, 0x72, 0xe5, 0xca, 0x95, + 0x2b, 0x57, 0xae, 0x5c, 0xb9, 0x72, 0xe5, 0xca, 0x35, 0xbc, 0x72, 0xa8, + 0x56, 0xae, 0x5c, 0xb9, 0x72, 0xe5, 0xca, 0x75, 0x15, 0x48, 0xb8, 0x25, + 0x84, 0x23, 0xf0, 0xf5, 0x4b, 0x82, 0x05, 0xe1, 0x52, 0x2e, 0xa3, 0xc0, + 0x5a, 0x4e, 0x36, 0x50, 0xab, 0xd3, 0x59, 0xe6, 0x8b, 0xe2, 0xc9, 0x97, + 0x69, 0x53, 0x5e, 0xec, 0x4e, 0x42, 0xb7, 0x92, 0xb6, 0x36, 0x48, 0xcb, + 0x6c, 0x27, 0x81, 0x54, 0x99, 0xf9, 0x0b, 0x01, 0x32, 0x1d, 0x54, 0x15, + 0x6e, 0xcb, 0x7e, 0xff, 0x36, 0xe4, 0x6a, 0x50, 0x39, 0x92, 0x75, 0x10, + 0x8e, 0x08, 0x81, 0x5c, 0x49, 0x88, 0x8a, 0x79, 0x01, 0xdf, 0x8e, 0x4b, + 0xab, 0x47, 0x32, 0x1f, 0x80, 0x4e, 0xca, 0x04, 0x93, 0x98, 0x6f, 0xed, + 0x4f, 0x01, 0x7d, 0x06, 0x2b, 0x04, 0x48, 0x75, 0x23, 0xc0, 0x15, 0x00, + 0x81, 0x00, 0x47, 0x42, 0x20, 0x42, 0x98, 0x52, 0x12, 0x9e, 0x95, 0xa6, + 0x54, 0xf0, 0x96, 0x89, 0xd3, 0xb0, 0x1c, 0xd9, 0x8d, 0x40, 0x5c, 0x36, + 0x58, 0xeb, 0x99, 0xaf, 0x7f, 0x83, 0x89, 0x9b, 0x27, 0x78, 0x5a, 0x03, + 0xb1, 0x8e, 0xbe, 0x7e, 0x9c, 0x89, 0x1b, 0xb6, 0xc4, 0xa0, 0x54, 0x00, + 0x6f, 0xfe, 0xab, 0x3f, 0xea, 0xcb, 0xe7, 0xe9, 0x3b, 0x77, 0x72, 0xfd, + 0xef, 0x3e, 0xcc, 0xc4, 0xcd, 0x13, 0x54, 0x80, 0xbb, 0xbf, 0xbc, 0x1f, + 0x11, 0xc0, 0xf5, 0xbf, 0xfb, 0xb0, 0x32, 0x78, 0x76, 0x7f, 0x9f, 0x9f, + 0x58, 0xfe, 0x19, 0xdb, 0x49, 0xa0, 0x97, 0x0d, 0xc1, 0x1a, 0x56, 0x83, + 0xa0, 0x63, 0x49, 0x19, 0x70, 0x97, 0x9d, 0xc6, 0x94, 0xc9, 0x6e, 0xbf, + 0x61, 0xc1, 0x63, 0xb1, 0x72, 0xe8, 0x5f, 0x83, 0x2b, 0xe8, 0x03, 0x6a, + 0xc9, 0x20, 0x0e, 0xc0, 0xea, 0x38, 0xc9, 0xb4, 0xca, 0xc6, 0x75, 0x22, + 0xf0, 0x58, 0x56, 0x3d, 0x24, 0x32, 0x06, 0x93, 0x33, 0xf9, 0x1a, 0x50, + 0x94, 0x41, 0x9c, 0x74, 0x1c, 0xa8, 0x24, 0xdb, 0x46, 0x94, 0xd9, 0xe9, + 0xa8, 0x09, 0x69, 0x0d, 0xd4, 0x24, 0xc5, 0x7d, 0x42, 0xb2, 0x55, 0x0a, + 0xb6, 0x4a, 0x41, 0xb3, 0x58, 0xc0, 0xef, 0xf6, 0x2c, 0x5f, 0x51, 0xba, + 0x78, 0x19, 0xfa, 0x41, 0x15, 0x7e, 0xb7, 0x97, 0xba, 0x6e, 0xe4, 0x6a, + 0xdf, 0x69, 0x4a, 0x0b, 0x4f, 0xe6, 0x99, 0x0c, 0x4f, 0x2b, 0x83, 0x0d, + 0xd9, 0x32, 0x13, 0x56, 0xc2, 0x09, 0xe7, 0x4e, 0x01, 0xd9, 0x4d, 0x9f, + 0x3c, 0xd6, 0x37, 0x01, 0xe5, 0x12, 0xcd, 0xdd, 0xb9, 0x54, 0x93, 0x80, + 0x42, 0x3f, 0x83, 0x7e, 0xdb, 0x29, 0x7d, 0x73, 0x41, 0x0c, 0x0f, 0x0b, + 0x58, 0x8d, 0x0c, 0xec, 0xca, 0xcf, 0x98, 0x10, 0x9a, 0x15, 0x6e, 0x64, + 0xa7, 0x5d, 0xce, 0x36, 0x99, 0x97, 0x6d, 0xef, 0x5a, 0xfd, 0xb9, 0xab, + 0xfb, 0xe5, 0x41, 0x60, 0xc6, 0xb4, 0xf3, 0xca, 0x4a, 0x65, 0xe0, 0x55, + 0x8b, 0x87, 0x0e, 0xb1, 0xfd, 0xd0, 0x21, 0xfe, 0x09, 0xf0, 0x8f, 0xf4, + 0xdf, 0x4b, 0x29, 0x40, 0x2d, 0x1b, 0x72, 0x35, 0xba, 0x71, 0x23, 0x8b, + 0xa7, 0x4e, 0x2d, 0xeb, 0x7b, 0xa5, 0xe5, 0x31, 0x60, 0xad, 0x61, 0x95, + 0xcc, 0x65, 0x54, 0xff, 0x83, 0x08, 0x74, 0x65, 0xb4, 0x68, 0xa5, 0x31, + 0x7f, 0x69, 0xfe, 0x16, 0x89, 0xc3, 0xb8, 0x0e, 0x13, 0xc1, 0xb5, 0x46, + 0x13, 0xb6, 0x24, 0x6c, 0xd3, 0x20, 0x5e, 0xc3, 0x2a, 0x09, 0xd4, 0x02, + 0xd8, 0xb1, 0x7d, 0x7b, 0xd8, 0xee, 0x4f, 0x3e, 0xf1, 0xc4, 0xd0, 0x87, + 0xf5, 0x7d, 0xc7, 0x14, 0x58, 0x0b, 0xa2, 0x63, 0xe8, 0xae, 0xf9, 0xe1, + 0xcb, 0xe2, 0xa2, 0x26, 0x76, 0x5d, 0x69, 0xb9, 0x0e, 0x34, 0xf5, 0xc4, + 0xb4, 0x15, 0x4f, 0xe4, 0x4d, 0x28, 0xed, 0x6a, 0xf3, 0x99, 0x67, 0x9f, + 0xe9, 0xb3, 0xb9, 0x07, 0xd8, 0x77, 0x71, 0x59, 0xbd, 0x2b, 0xf2, 0x4f, + 0x1c, 0xc4, 0x2d, 0x8f, 0xa9, 0x8d, 0x0c, 0xa0, 0x56, 0xfb, 0xc4, 0x71, + 0xca, 0xae, 0x9e, 0xb0, 0x60, 0x03, 0xb5, 0x8c, 0x46, 0x54, 0x58, 0xf3, + 0xb5, 0xa3, 0xb0, 0x54, 0x82, 0x9b, 0xeb, 0xb0, 0xbe, 0x0e, 0xd2, 0x87, + 0xc5, 0x86, 0x9a, 0x64, 0xbd, 0xbe, 0x0e, 0xdd, 0x0e, 0xb2, 0xdd, 0x84, + 0x91, 0x71, 0x9d, 0xae, 0x82, 0x74, 0x04, 0xb4, 0xad, 0x56, 0x1e, 0x19, + 0x03, 0x9a, 0x74, 0xde, 0x38, 0x48, 0x65, 0x44, 0x4f, 0x2c, 0x4a, 0x02, + 0xb5, 0x32, 0x34, 0x7e, 0x4b, 0xb4, 0x3e, 0xff, 0x4a, 0xb4, 0x9e, 0x9c, + 0xa0, 0x94, 0x65, 0x67, 0xeb, 0xd1, 0x89, 0xbb, 0xe0, 0xe8, 0x57, 0xe1, + 0xbb, 0x47, 0xc1, 0xd3, 0xed, 0xd1, 0xf4, 0xa0, 0x56, 0x8d, 0x8c, 0x96, + 0x2c, 0xec, 0xc2, 0xcd, 0xe3, 0x50, 0xad, 0xc1, 0x91, 0x23, 0x03, 0xcb, + 0x98, 0x26, 0xf7, 0xc6, 0x1d, 0xf8, 0xaf, 0xbd, 0x1b, 0x47, 0xca, 0xdf, + 0x60, 0x89, 0xda, 0xf2, 0xeb, 0x26, 0xc8, 0x89, 0x2f, 0x87, 0xb9, 0x07, + 0x59, 0x7d, 0xb9, 0xc4, 0x70, 0x64, 0x8b, 0x58, 0x92, 0x12, 0x85, 0x4b, + 0x30, 0x82, 0x3d, 0x08, 0xfe, 0xb4, 0x1c, 0x18, 0xea, 0x6a, 0xd3, 0xcf, + 0x53, 0x5d, 0xb2, 0x60, 0x5e, 0xb6, 0xea, 0x37, 0x36, 0x11, 0xce, 0x18, + 0xcd, 0x57, 0x17, 0xf0, 0xbb, 0x1d, 0x5c, 0x16, 0x80, 0x1a, 0xcd, 0x57, + 0x17, 0x18, 0xbb, 0x4d, 0xe5, 0x70, 0xe4, 0xa5, 0x09, 0x76, 0x6c, 0x5b, + 0xa0, 0x17, 0x44, 0x10, 0xa7, 0x5e, 0xd0, 0x4b, 0x85, 0x69, 0x19, 0x40, + 0x89, 0xbc, 0x20, 0x11, 0x6b, 0x44, 0xb8, 0x0c, 0xe3, 0x13, 0x80, 0x2b, + 0x03, 0xbd, 0x82, 0x38, 0x00, 0xcb, 0x06, 0x5d, 0xf5, 0xe5, 0xe1, 0x24, + 0xe0, 0xd2, 0x29, 0xb6, 0xb6, 0x8d, 0x82, 0x4f, 0x6b, 0xbf, 0x21, 0x58, + 0x3a, 0xca, 0xc7, 0x3e, 0x7e, 0xd3, 0x7c, 0x65, 0x95, 0x2b, 0x09, 0xea, + 0xb2, 0xe3, 0xec, 0x7c, 0xd2, 0x14, 0x83, 0x16, 0xf7, 0x54, 0xfb, 0xf4, + 0x02, 0xa8, 0xbc, 0x4f, 0xc4, 0x81, 0x5f, 0x29, 0xc0, 0x17, 0xd3, 0xae, + 0x26, 0x7e, 0x25, 0x10, 0x98, 0xab, 0x45, 0xf6, 0x2f, 0xe7, 0x97, 0x6e, + 0xb9, 0x86, 0x75, 0xdb, 0x7f, 0x21, 0x16, 0xff, 0xff, 0x9d, 0x79, 0x87, + 0xbf, 0xb3, 0xfe, 0x9a, 0x58, 0x98, 0xf7, 0xf9, 0xbf, 0x1e, 0xca, 0xf7, + 0x2f, 0xa5, 0xe4, 0xb1, 0x5a, 0xa5, 0x95, 0x2d, 0x4d, 0x67, 0x0f, 0xfd, + 0x94, 0xbf, 0x7a, 0xe5, 0x9d, 0xa1, 0xfd, 0x5e, 0xde, 0x3b, 0x4b, 0xa5, + 0x0a, 0x2b, 0x83, 0x3c, 0x5d, 0x69, 0xf8, 0x96, 0xb9, 0xba, 0x1a, 0x94, + 0x67, 0x5a, 0x1d, 0x5a, 0x29, 0x61, 0xab, 0xf1, 0xbd, 0x5a, 0xa5, 0xf9, + 0xae, 0x24, 0xd6, 0x97, 0xcb, 0xf7, 0x52, 0x95, 0x2f, 0x0d, 0x52, 0x58, + 0x71, 0xa1, 0xe3, 0xc7, 0x27, 0x0a, 0xd7, 0x46, 0x22, 0xbb, 0xfa, 0xe6, + 0x29, 0x9a, 0x8b, 0x47, 0x57, 0x04, 0xc1, 0x3a, 0xba, 0xe8, 0x33, 0xf1, + 0x02, 0x48, 0x0e, 0xe2, 0xd6, 0x77, 0xf4, 0xc5, 0x8f, 0xdd, 0x38, 0xc5, + 0xc2, 0x6b, 0x2b, 0x07, 0xba, 0xae, 0x46, 0xe2, 0x39, 0x05, 0x3e, 0xdc, + 0x7f, 0xab, 0x2e, 0xff, 0x19, 0xd8, 0x39, 0xbe, 0x33, 0xd3, 0x7e, 0xa5, + 0xe3, 0x14, 0x76, 0x9b, 0xae, 0x06, 0xb0, 0x65, 0xc3, 0xb5, 0xb6, 0x8c, + 0xd5, 0x39, 0xbe, 0x90, 0x84, 0x31, 0xe9, 0x7c, 0x52, 0xe0, 0x5a, 0x97, + 0x5e, 0xa6, 0xa7, 0xc9, 0x9a, 0x5c, 0xef, 0xe2, 0x0a, 0xf3, 0x6b, 0xb4, + 0x7f, 0x0f, 0x75, 0xfd, 0xa7, 0x95, 0xf8, 0xad, 0x34, 0x68, 0x50, 0xa6, + 0x4c, 0x3b, 0x50, 0xbf, 0x33, 0x57, 0x8f, 0x2b, 0x76, 0x12, 0x1f, 0xd4, + 0x50, 0x98, 0xa2, 0x89, 0x70, 0xab, 0xb7, 0xe4, 0x23, 0x10, 0x08, 0x47, + 0xe2, 0xcb, 0x9e, 0x82, 0x66, 0xc9, 0x1e, 0x82, 0x02, 0x52, 0x5f, 0xb1, + 0xb8, 0x4e, 0x01, 0x19, 0x14, 0x90, 0x0e, 0x91, 0xcd, 0x10, 0x35, 0x75, + 0x45, 0x05, 0x5f, 0xee, 0x82, 0x60, 0x21, 0x3a, 0xff, 0x06, 0x25, 0x7a, + 0xfa, 0x59, 0x11, 0x89, 0xb2, 0xae, 0x5e, 0x55, 0x14, 0x7a, 0xa9, 0x42, + 0xc7, 0x57, 0x1f, 0xf8, 0xc8, 0x92, 0xf4, 0x7d, 0x5d, 0xae, 0x95, 0xc1, + 0x35, 0x67, 0x66, 0x60, 0x1a, 0xd8, 0x33, 0x07, 0xd5, 0x49, 0x0f, 0x6f, + 0x0e, 0xaa, 0x93, 0x71, 0x58, 0x93, 0x01, 0x3b, 0xcd, 0xcc, 0x78, 0x61, + 0xd8, 0xf4, 0x34, 0x54, 0xb5, 0x91, 0xb7, 0xc7, 0x63, 0x0f, 0x55, 0xa6, + 0xa7, 0x3d, 0xaa, 0x93, 0x51, 0x1a, 0x0f, 0x8f, 0x49, 0xdb, 0x8f, 0x95, + 0xef, 0x9c, 0xa7, 0xe0, 0x51, 0x1e, 0x2a, 0x7f, 0x03, 0xed, 0x9a, 0xac, + 0xc2, 0x0c, 0x76, 0x1a, 0x2f, 0x5c, 0xce, 0xcc, 0x54, 0xd9, 0x33, 0xe3, + 0xf1, 0x92, 0x69, 0x86, 0x47, 0x6e, 0xe7, 0xa5, 0xdf, 0x02, 0x46, 0x13, + 0x58, 0x78, 0x3d, 0x28, 0x75, 0x2b, 0x87, 0x61, 0x74, 0x1b, 0xb7, 0xc9, + 0xa7, 0x98, 0x36, 0xf5, 0xdd, 0xa3, 0x00, 0x5e, 0x73, 0x9e, 0x17, 0xab, + 0xa3, 0xd9, 0x36, 0xf9, 0x4d, 0x4e, 0x46, 0x00, 0x2b, 0xdb, 0x76, 0x7a, + 0x12, 0x66, 0xe6, 0xb4, 0x2f, 0xbd, 0xf4, 0xa6, 0x61, 0xcf, 0x8c, 0x2a, + 0xbb, 0xa9, 0xa3, 0xb1, 0x9f, 0xf4, 0x14, 0x58, 0xcb, 0xc3, 0x8b, 0x03, + 0xb2, 0xaa, 0x6a, 0xc3, 0x86, 0x90, 0xcd, 0xcd, 0x29, 0xf8, 0xd6, 0xe4, + 0xb4, 0x82, 0x94, 0xa9, 0x36, 0x8e, 0x97, 0x1b, 0xe2, 0x60, 0x2d, 0x1b, + 0x7a, 0xb6, 0x9c, 0x56, 0x0b, 0x70, 0x02, 0xfd, 0x3c, 0x4d, 0xe8, 0x71, + 0x5d, 0xfb, 0xd9, 0x61, 0xf8, 0x11, 0x96, 0x9f, 0xa1, 0x6b, 0xc3, 0x15, + 0x00, 0xb5, 0x20, 0x01, 0xac, 0x4d, 0xa6, 0x4d, 0x01, 0x8c, 0x0d, 0xa5, + 0x34, 0xca, 0xb2, 0xb5, 0x6d, 0xc0, 0x39, 0xab, 0xd5, 0xa3, 0x52, 0xe2, + 0x3b, 0x82, 0x85, 0x70, 0xec, 0x40, 0x40, 0x51, 0x41, 0xac, 0x16, 0x50, + 0x1f, 0x95, 0x81, 0x68, 0xfc, 0xd1, 0xf4, 0x54, 0x6d, 0x2b, 0xcc, 0x80, + 0xb5, 0x5a, 0x80, 0x1f, 0xf4, 0x80, 0x82, 0x02, 0x47, 0x69, 0x9b, 0x31, + 0x47, 0x5d, 0x57, 0xb4, 0x75, 0xfc, 0xee, 0xc7, 0x7a, 0x21, 0x99, 0x79, + 0x8b, 0x53, 0xe0, 0x78, 0xd0, 0xe3, 0xde, 0x40, 0xf9, 0x59, 0x08, 0x60, + 0xb7, 0xce, 0xa7, 0x10, 0x28, 0x78, 0x16, 0x10, 0x03, 0x6a, 0x85, 0xcf, + 0xc1, 0x1c, 0x58, 0x90, 0xea, 0xc3, 0x22, 0xd2, 0x02, 0x6b, 0xb5, 0x03, + 0x10, 0x56, 0x5b, 0x17, 0x28, 0xd0, 0xa2, 0x47, 0x01, 0x35, 0xfe, 0x1b, + 0x81, 0xb5, 0xa0, 0x17, 0x98, 0x06, 0x55, 0x05, 0x32, 0x60, 0xac, 0x74, + 0xd9, 0x38, 0x69, 0xf5, 0x64, 0xaa, 0xe4, 0x08, 0x3a, 0x52, 0xed, 0xeb, + 0x9e, 0xce, 0xdf, 0x80, 0xb6, 0x0a, 0x22, 0x82, 0x6d, 0xe1, 0x94, 0x74, + 0xbe, 0x05, 0x7a, 0xf4, 0x28, 0x58, 0x57, 0xdc, 0x36, 0x60, 0x4e, 0x3a, + 0x82, 0x92, 0xf6, 0x91, 0xf6, 0xbc, 0x29, 0x7c, 0x16, 0x2e, 0x04, 0x13, + 0xc0, 0xe0, 0x91, 0xc4, 0xb8, 0x36, 0xbc, 0xf3, 0x13, 0x4e, 0x5f, 0xf3, + 0xcb, 0x57, 0x6c, 0x09, 0xb0, 0x69, 0xd3, 0xa6, 0x08, 0x7c, 0x75, 0xdd, + 0x9a, 0x18, 0x70, 0x6a, 0xed, 0x75, 0x6b, 0x42, 0xe8, 0xd4, 0xc9, 0x93, + 0x27, 0x59, 0x53, 0x59, 0xcb, 0xec, 0x6c, 0xff, 0x35, 0x9b, 0x0d, 0x9d, + 0x32, 0xb2, 0x81, 0x58, 0x97, 0xcb, 0xe7, 0xda, 0xeb, 0xd6, 0x00, 0x70, + 0xee, 0xfc, 0x05, 0x36, 0x6d, 0xda, 0xc4, 0x85, 0xd6, 0xb9, 0xd0, 0xfe, + 0x42, 0xeb, 0x1c, 0xb3, 0x27, 0x23, 0xe8, 0x96, 0xed, 0x6b, 0xed, 0x75, + 0x6b, 0x42, 0xf8, 0xd5, 0x85, 0xd6, 0x39, 0xd6, 0x54, 0xd6, 0x86, 0x7e, + 0x8d, 0x8c, 0x4f, 0x63, 0x6f, 0x96, 0x76, 0x59, 0x4d, 0x9a, 0xd9, 0xd9, + 0xd9, 0x98, 0xff, 0x4d, 0x9b, 0x36, 0xf1, 0x8d, 0xf6, 0x05, 0x96, 0x93, + 0x2b, 0x04, 0x6d, 0x29, 0x43, 0x80, 0x95, 0xad, 0xb1, 0x0f, 0xd5, 0x69, + 0x9d, 0x89, 0x5f, 0xed, 0x2f, 0xbc, 0xa1, 0xae, 0x0b, 0x3b, 0x4b, 0xad, + 0x3e, 0x7b, 0xa3, 0x2b, 0xed, 0xeb, 0x99, 0xf9, 0x26, 0x0b, 0x6f, 0x34, + 0xf8, 0xf3, 0x8f, 0xef, 0xec, 0x03, 0x57, 0xd9, 0xda, 0x3a, 0x52, 0xcf, + 0x8c, 0x4b, 0xd3, 0x65, 0xf3, 0x25, 0xe2, 0x23, 0x5d, 0x5b, 0xd7, 0x8f, + 0x01, 0x9d, 0xbe, 0xf0, 0x41, 0xef, 0x20, 0xd4, 0x47, 0x6a, 0x0a, 0xac, + 0x35, 0xb6, 0x05, 0x77, 0x43, 0x09, 0x5e, 0x1d, 0xee, 0xae, 0xac, 0x79, + 0x26, 0xbb, 0x37, 0x18, 0xab, 0x4f, 0x85, 0xeb, 0x0b, 0x8d, 0xd9, 0x58, + 0x78, 0x72, 0x3b, 0x69, 0x63, 0xc7, 0x1d, 0x58, 0xd8, 0xab, 0x20, 0x56, + 0xef, 0x19, 0x4b, 0xcd, 0xc7, 0x80, 0xb4, 0xc6, 0x7f, 0xed, 0xc3, 0x21, + 0x6c, 0xeb, 0x07, 0xa7, 0x4e, 0x0f, 0x55, 0x7e, 0x88, 0x03, 0xac, 0x92, + 0xf0, 0x2b, 0xb3, 0x6d, 0x80, 0x5a, 0x76, 0x7d, 0x85, 0xa8, 0x20, 0x65, + 0x8b, 0xd9, 0xc5, 0x67, 0xc2, 0xf5, 0x96, 0xfe, 0x79, 0xd9, 0x80, 0xb1, + 0x34, 0xd0, 0x56, 0x56, 0x9e, 0xcb, 0xd9, 0x36, 0x65, 0x83, 0x96, 0x7f, + 0x14, 0x21, 0xd5, 0xfd, 0x4a, 0xcb, 0x9f, 0xa5, 0x23, 0x55, 0xde, 0x53, + 0xa3, 0xf7, 0xf2, 0xfa, 0x5f, 0x46, 0xe5, 0xbb, 0xee, 0xda, 0x75, 0x31, + 0x3f, 0x3f, 0xfe, 0x49, 0x33, 0x0c, 0x33, 0xeb, 0xff, 0x9d, 0x1f, 0xf6, + 0xe5, 0x97, 0x2b, 0x57, 0xae, 0x5c, 0xb9, 0x72, 0xe5, 0xca, 0x95, 0x2b, + 0x57, 0xae, 0x5c, 0xb9, 0x72, 0xe5, 0xca, 0x95, 0x2b, 0x57, 0xae, 0x5c, + 0xb9, 0x72, 0xe5, 0xca, 0x95, 0x2b, 0x57, 0xae, 0x5c, 0xb9, 0x86, 0x57, + 0x0e, 0xd5, 0xca, 0x95, 0x2b, 0x57, 0xae, 0x5c, 0xb9, 0xde, 0x65, 0x89, + 0xcd, 0x11, 0x0e, 0xc7, 0x75, 0xd5, 0x64, 0xc5, 0x76, 0xd0, 0x03, 0x29, + 0x28, 0x97, 0x53, 0x26, 0x8d, 0x64, 0x01, 0xb5, 0x12, 0x67, 0x75, 0x7b, + 0x72, 0xd1, 0x20, 0x60, 0x95, 0x1d, 0x66, 0x03, 0xb6, 0xd2, 0xc0, 0x54, + 0xc9, 0x34, 0xb6, 0xcf, 0xe4, 0xfa, 0x6a, 0x24, 0x12, 0x93, 0xac, 0xb3, + 0xea, 0x90, 0x8c, 0x1b, 0x54, 0x5e, 0xbf, 0xeb, 0xa7, 0xfa, 0x1a, 0xb6, + 0xbe, 0x00, 0xa5, 0x91, 0x12, 0x6d, 0x33, 0xb1, 0x26, 0x06, 0x84, 0xea, + 0x6f, 0x47, 0xb1, 0x39, 0xbb, 0xfe, 0xe5, 0xf5, 0xae, 0x7a, 0xc1, 0xdb, + 0x7a, 0x19, 0xd2, 0xfe, 0x12, 0xb2, 0x01, 0x6b, 0x59, 0xa8, 0x97, 0x68, + 0xad, 0x98, 0x98, 0x88, 0xda, 0x1d, 0xfe, 0x25, 0x78, 0x91, 0xf8, 0xe2, + 0xb2, 0x79, 0xaf, 0x7b, 0x62, 0xe3, 0x16, 0x70, 0x05, 0xd7, 0xff, 0xee, + 0xc3, 0x3c, 0x8d, 0xde, 0x16, 0xa6, 0x6e, 0x6a, 0x12, 0xed, 0xe3, 0x47, + 0x8e, 0xd0, 0xf0, 0x5a, 0xaa, 0xcc, 0xbe, 0x54, 0x84, 0xa8, 0x84, 0x9e, + 0x3f, 0xa6, 0x5e, 0xfc, 0x9b, 0xd8, 0xb8, 0x45, 0x41, 0xb9, 0x12, 0x92, + 0x01, 0x74, 0x82, 0x08, 0x5e, 0x54, 0xa0, 0x10, 0x83, 0x40, 0xad, 0x46, + 0xa6, 0x3e, 0x11, 0xa4, 0x2c, 0x02, 0x5f, 0xd9, 0x30, 0xac, 0xd4, 0xb4, + 0x09, 0x40, 0x55, 0x5f, 0xfb, 0x84, 0x86, 0x0a, 0x9e, 0x65, 0xe2, 0x93, + 0x60, 0xad, 0xf2, 0xfa, 0x01, 0x93, 0xa4, 0x37, 0x0b, 0xfc, 0x57, 0xe0, + 0xa0, 0x84, 0x9a, 0x23, 0x19, 0x17, 0x82, 0x26, 0x11, 0x4c, 0x2b, 0x74, + 0x93, 0x01, 0xc4, 0x32, 0x36, 0x22, 0x03, 0xe0, 0x25, 0x91, 0x6a, 0x42, + 0x82, 0x86, 0xa5, 0x18, 0xf8, 0x16, 0x80, 0x40, 0x4d, 0x48, 0x91, 0x52, + 0xff, 0x66, 0x8b, 0x82, 0xfd, 0x5d, 0x18, 0x2f, 0x42, 0x2b, 0x20, 0xda, + 0xc7, 0x61, 0x3c, 0xb4, 0x03, 0x19, 0xfb, 0x6d, 0x17, 0x02, 0x49, 0x13, + 0x68, 0xeb, 0xaf, 0xa5, 0xf6, 0xd5, 0xcf, 0x01, 0xbf, 0x6b, 0x4d, 0x36, + 0x2b, 0xf6, 0xdb, 0x84, 0xfe, 0x13, 0xeb, 0x46, 0xed, 0x8c, 0x9f, 0x70, + 0x56, 0x9e, 0x69, 0x3e, 0x62, 0x71, 0x29, 0x65, 0x88, 0xe2, 0xfb, 0x5f, + 0xbe, 0x4e, 0x0b, 0x03, 0xf5, 0x95, 0xf8, 0xa4, 0xc4, 0xe6, 0xec, 0x49, + 0x6b, 0xe5, 0xf5, 0x2e, 0x78, 0xd9, 0x13, 0xcc, 0x2e, 0x06, 0xa4, 0x35, + 0x0c, 0x3c, 0xab, 0x2f, 0x8d, 0xdd, 0xd7, 0x2d, 0x93, 0x77, 0xb2, 0x5f, + 0xb9, 0x58, 0xc9, 0xae, 0xa4, 0x3d, 0x00, 0xe1, 0x60, 0x8e, 0x33, 0xfb, + 0x98, 0xb3, 0xd7, 0xed, 0xb4, 0xf6, 0x31, 0x99, 0xb4, 0x4f, 0xcb, 0x4b, + 0x76, 0x65, 0x68, 0xd7, 0x26, 0x7d, 0x3d, 0x59, 0x16, 0xe3, 0xcb, 0x5f, + 0x6a, 0x23, 0xf4, 0xf9, 0x77, 0xd0, 0x71, 0xbd, 0x61, 0x7d, 0x91, 0x3f, + 0x7e, 0xe2, 0x49, 0x00, 0xae, 0xb1, 0xe6, 0xc7, 0xbf, 0xa3, 0xe7, 0x9e, + 0x9b, 0x30, 0x33, 0x45, 0xf7, 0x77, 0x75, 0xf8, 0x43, 0xd7, 0x3c, 0x99, + 0x69, 0x9b, 0x15, 0x96, 0x15, 0xbe, 0x11, 0x48, 0xe2, 0xb7, 0x36, 0x02, + 0xdf, 0x7f, 0x27, 0x6e, 0xb7, 0xfd, 0x81, 0x07, 0x62, 0x60, 0xad, 0xc5, + 0x53, 0xa7, 0x62, 0x20, 0x2f, 0x5b, 0x06, 0x9e, 0xd5, 0x0f, 0xce, 0x5a, + 0x8c, 0x2d, 0x6d, 0xc0, 0xd6, 0x36, 0xcb, 0x7e, 0x54, 0xc7, 0x1d, 0xd6, + 0xdb, 0xbb, 0xd9, 0x66, 0xf9, 0x5a, 0x64, 0x9b, 0xb5, 0xbd, 0x2d, 0x91, + 0x66, 0x51, 0xc7, 0x98, 0xed, 0x08, 0xbe, 0xb5, 0xa8, 0x97, 0x11, 0x50, + 0x2b, 0xbd, 0xf4, 0xcb, 0x6b, 0x74, 0xe3, 0x46, 0x55, 0xf7, 0xed, 0xdb, + 0x63, 0xe1, 0xd7, 0xac, 0xcf, 0xee, 0x34, 0xca, 0x45, 0x42, 0x92, 0x54, + 0xfb, 0xb1, 0xdb, 0xb9, 0xef, 0xf7, 0xbf, 0x4d, 0xfb, 0xf3, 0x1f, 0x05, + 0xe0, 0xdb, 0xdf, 0x8c, 0xd6, 0x87, 0x55, 0xb2, 0x87, 0xb0, 0xa7, 0x57, + 0x5d, 0x0e, 0xd9, 0x20, 0x2d, 0xff, 0x12, 0x81, 0xb5, 0x40, 0x01, 0xc2, + 0x00, 0x05, 0x81, 0xf5, 0xfd, 0xbe, 0x39, 0x7b, 0x07, 0xb4, 0xcd, 0xca, + 0xa6, 0xdc, 0x5e, 0x7e, 0x95, 0x07, 0x9c, 0x1f, 0xca, 0xae, 0xe0, 0x80, + 0x5f, 0xa5, 0xee, 0x37, 0x29, 0x4f, 0xaa, 0x49, 0x21, 0x85, 0xb9, 0x68, + 0x52, 0x48, 0xaf, 0x5c, 0xa3, 0x3d, 0x37, 0x4b, 0x03, 0x17, 0xda, 0x4d, + 0xca, 0x93, 0x3b, 0xd4, 0xa5, 0xf8, 0x61, 0x0b, 0x00, 0xb5, 0x4d, 0x1d, + 0xf5, 0xcd, 0xc3, 0x07, 0x43, 0xbb, 0xfa, 0x67, 0xee, 0x47, 0xb6, 0x5b, + 0x88, 0x43, 0xc7, 0x95, 0x4d, 0xbb, 0xc1, 0xf8, 0x6f, 0xec, 0x62, 0xfe, + 0x4b, 0x7b, 0xf1, 0xcb, 0x82, 0x4e, 0xbb, 0x40, 0x73, 0x6b, 0x4b, 0xfd, + 0x10, 0xbe, 0x7e, 0x80, 0x4e, 0xbb, 0x45, 0x65, 0xd1, 0xe7, 0xe8, 0x03, + 0x82, 0x89, 0xa5, 0x09, 0xfc, 0xa6, 0xcf, 0x91, 0xc5, 0x32, 0xf5, 0xc5, + 0x06, 0x63, 0x77, 0xea, 0x89, 0x1d, 0xcf, 0x69, 0x90, 0x99, 0xbd, 0x7d, + 0xe7, 0x56, 0x00, 0x1e, 0x7a, 0x40, 0x05, 0x8d, 0x7d, 0x22, 0xea, 0xc3, + 0x26, 0x5e, 0x50, 0x7b, 0xe2, 0xf1, 0xa8, 0x0b, 0xe2, 0xb1, 0x7f, 0xaa, + 0x96, 0xb5, 0x5f, 0x8f, 0xec, 0x76, 0x7c, 0xcb, 0xe7, 0xd1, 0x7f, 0x91, + 0xd1, 0x40, 0x13, 0x77, 0xc1, 0xbf, 0xbc, 0x5f, 0xc1, 0xb2, 0x40, 0x41, + 0xb5, 0xbe, 0x74, 0x90, 0x3f, 0x3c, 0xfe, 0x3c, 0x9f, 0x75, 0x04, 0x1c, + 0xba, 0x78, 0x10, 0x96, 0x01, 0x6a, 0xb9, 0x37, 0xee, 0x60, 0xd7, 0x9d, + 0xf7, 0xf2, 0x6f, 0x7f, 0xef, 0x8e, 0x81, 0x76, 0x83, 0x54, 0x4e, 0xb9, + 0x4e, 0x0d, 0xe3, 0x14, 0xb1, 0x78, 0xd5, 0xe5, 0x2c, 0x97, 0x5d, 0xda, + 0xed, 0xec, 0x5f, 0x77, 0x56, 0xfc, 0xf8, 0x4d, 0x65, 0x5a, 0x67, 0x24, + 0xde, 0x80, 0xb4, 0x2b, 0x51, 0xb5, 0xec, 0x2e, 0xeb, 0xab, 0xb6, 0xc1, + 0x65, 0x4c, 0x5f, 0xba, 0x03, 0xa9, 0xeb, 0xcd, 0xd3, 0x1a, 0xe6, 0x0c, + 0x54, 0x5c, 0x97, 0xca, 0xfa, 0x3a, 0xd2, 0x8f, 0x4f, 0xc2, 0xaa, 0x55, + 0xed, 0xb0, 0x36, 0x42, 0x40, 0xe9, 0xa6, 0x12, 0xdc, 0xe6, 0x82, 0x99, + 0xd8, 0xa6, 0xd7, 0xe5, 0xa4, 0xfe, 0x4d, 0xf9, 0x3e, 0xf2, 0x74, 0xe4, + 0x67, 0xfc, 0x66, 0x0d, 0x90, 0xf3, 0x25, 0xb5, 0x0d, 0x25, 0x90, 0xa8, + 0x25, 0x20, 0x7d, 0x49, 0xfb, 0x74, 0xb4, 0x4f, 0x76, 0x6c, 0x76, 0x91, + 0x52, 0x50, 0xd7, 0xe7, 0xe2, 0x4e, 0x17, 0x6a, 0x1a, 0x08, 0xd7, 0xeb, + 0x36, 0x69, 0x76, 0x23, 0xc0, 0x46, 0xb9, 0x9c, 0x7d, 0x6d, 0xf6, 0xfe, + 0xe2, 0x06, 0xde, 0x4a, 0x69, 0x22, 0xd3, 0x5f, 0xd9, 0xbf, 0x92, 0x24, + 0xd0, 0x69, 0x10, 0xe0, 0xe9, 0x72, 0xf4, 0xdd, 0xcb, 0xe5, 0x3f, 0x68, + 0x9a, 0x6e, 0x32, 0xfe, 0x6f, 0x6a, 0x5d, 0xde, 0x5f, 0xdc, 0x90, 0x99, + 0x67, 0xb9, 0x08, 0xf7, 0x7e, 0x5a, 0xf5, 0xdd, 0x42, 0xb8, 0xb0, 0x5d, + 0xf7, 0x55, 0xdb, 0x6b, 0x08, 0x47, 0x02, 0x75, 0xbe, 0xa8, 0x7f, 0xab, + 0xe2, 0x06, 0x09, 0xfe, 0x38, 0x47, 0x9e, 0x95, 0x6c, 0xbd, 0x4d, 0xdd, + 0xbf, 0xda, 0x40, 0x2d, 0x1b, 0x9e, 0x95, 0x84, 0x3d, 0xa5, 0x01, 0xb5, + 0xd2, 0x20, 0x5a, 0x61, 0x39, 0xac, 0xa5, 0xd1, 0xae, 0x4f, 0xec, 0x64, + 0xff, 0x0b, 0x07, 0xe2, 0xf0, 0x2b, 0x0d, 0xca, 0x1a, 0xc6, 0x26, 0x84, + 0x6b, 0x59, 0xeb, 0x76, 0x3e, 0x26, 0xcc, 0x1d, 0xbd, 0x0b, 0x7f, 0xf1, + 0xab, 0xfd, 0x20, 0x6b, 0xab, 0x5c, 0xc2, 0x81, 0x9d, 0x1f, 0xd7, 0x79, + 0x25, 0x20, 0x5a, 0x36, 0xc4, 0x2b, 0x06, 0xf4, 0xb2, 0xca, 0x63, 0x97, + 0xc5, 0xef, 0x48, 0x3a, 0x7e, 0x87, 0x92, 0x5b, 0xa1, 0xd5, 0x56, 0xc7, + 0x7e, 0x69, 0x4d, 0xa9, 0x0f, 0xdc, 0x15, 0x6b, 0xa3, 0x44, 0xbb, 0x9a, + 0xf5, 0x41, 0xe7, 0xeb, 0xf7, 0x17, 0x37, 0xf0, 0xd3, 0xab, 0xec, 0x02, + 0xc3, 0xc6, 0x54, 0x5d, 0x03, 0xfc, 0x28, 0x01, 0xcc, 0xfa, 0x25, 0xe0, + 0x47, 0xd6, 0xb6, 0xf8, 0x27, 0xbf, 0xc0, 0xf2, 0x68, 0xab, 0xc8, 0x5f, + 0x32, 0x8f, 0xd5, 0xea, 0x1a, 0xe0, 0xbf, 0xfc, 0xb7, 0x77, 0x90, 0x7f, + 0xfc, 0xd3, 0x81, 0x76, 0xce, 0x2d, 0xd7, 0xac, 0x28, 0xbf, 0x8b, 0x29, + 0xdb, 0xa0, 0xe3, 0x7a, 0xc3, 0xfa, 0x22, 0x6d, 0xcf, 0xc7, 0x8c, 0x2c, + 0xd9, 0xb0, 0xa7, 0xe5, 0xa6, 0x0a, 0x5f, 0x49, 0xa0, 0xd6, 0xa0, 0xfc, + 0x2a, 0xd6, 0x9f, 0x1d, 0x96, 0x04, 0x6b, 0xa5, 0xa6, 0x75, 0xa0, 0x22, + 0x60, 0x6f, 0x57, 0x30, 0x7e, 0x99, 0xf0, 0x88, 0xc9, 0xbc, 0xed, 0xb2, + 0x56, 0x80, 0xe3, 0x2c, 0x0f, 0xd6, 0x1a, 0xb6, 0xad, 0x37, 0x0c, 0xba, + 0xe7, 0xaa, 0xba, 0x29, 0x68, 0x74, 0x68, 0xdc, 0x20, 0x18, 0x2f, 0xde, + 0xc3, 0x7c, 0x77, 0x2f, 0x25, 0x04, 0xf3, 0x7f, 0x02, 0x75, 0x19, 0x8d, + 0x75, 0x34, 0x17, 0x57, 0x82, 0x86, 0x88, 0x54, 0x2f, 0x0b, 0x1a, 0x19, + 0x03, 0x51, 0x57, 0x0a, 0xa8, 0xc5, 0x8d, 0x47, 0x91, 0x37, 0x56, 0x01, + 0xd8, 0xf5, 0x7b, 0x1e, 0x0b, 0x9f, 0x29, 0xd3, 0xc0, 0xe7, 0xc0, 0xe9, + 0x03, 0x00, 0x94, 0x5f, 0x96, 0x4c, 0xdc, 0xb9, 0x2b, 0x04, 0x6f, 0xc9, + 0x3b, 0x77, 0xf5, 0x8d, 0x53, 0xaf, 0x04, 0x34, 0x93, 0x06, 0x35, 0x4c, + 0xaa, 0xba, 0x71, 0x1c, 0xef, 0x54, 0x44, 0x8d, 0x36, 0x00, 0x91, 0xf2, + 0x86, 0x6c, 0xa0, 0x56, 0x2c, 0x0f, 0x7d, 0x2e, 0x2d, 0x57, 0xb3, 0xc7, + 0x52, 0x2a, 0xc5, 0x32, 0x36, 0x13, 0x41, 0x06, 0x1d, 0x64, 0xd7, 0x00, + 0xef, 0xf5, 0x35, 0x5d, 0xd0, 0x8e, 0x6d, 0x2b, 0x90, 0x7a, 0x01, 0x05, + 0x17, 0x38, 0x48, 0x04, 0x83, 0x52, 0xf2, 0x65, 0x8b, 0xea, 0xfa, 0x29, + 0xfc, 0xa5, 0x06, 0xbe, 0xf4, 0x11, 0x61, 0x06, 0x55, 0xbd, 0x3c, 0x80, + 0x0c, 0xb6, 0x22, 0x9c, 0x52, 0x98, 0xa7, 0x59, 0xb7, 0x55, 0xaf, 0x6e, + 0xa5, 0xd5, 0x6e, 0xe0, 0xcb, 0x36, 0xf5, 0x6a, 0x9d, 0x56, 0xdb, 0x86, + 0xef, 0x4f, 0x80, 0x63, 0xb5, 0x81, 0x53, 0xd7, 0x79, 0xf7, 0xc0, 0x29, + 0x84, 0x4b, 0x75, 0x6e, 0x2c, 0xe8, 0x72, 0xeb, 0xa1, 0x73, 0x09, 0xd2, + 0x29, 0x0c, 0x71, 0x1f, 0x6e, 0x21, 0x0a, 0x9d, 0x06, 0x04, 0xe0, 0x4b, + 0x1f, 0x57, 0x9f, 0x47, 0x0b, 0xae, 0x8b, 0xaf, 0xcf, 0xaf, 0x76, 0x59, + 0x5d, 0xbf, 0x92, 0xe6, 0x2c, 0x54, 0x7a, 0x7d, 0xab, 0xd8, 0x6d, 0x58, + 0x1a, 0x71, 0x13, 0xf5, 0xcd, 0xf6, 0x61, 0xaf, 0x57, 0x8a, 0xd9, 0xd7, + 0xe1, 0x1b, 0xd6, 0x17, 0xe9, 0x5c, 0x75, 0x23, 0x02, 0xb9, 0x56, 0xab, + 0x81, 0x7d, 0x78, 0x11, 0xfc, 0xb2, 0x58, 0xd5, 0x00, 0x90, 0x0d, 0x77, + 0x72, 0x1d, 0x91, 0x7a, 0x2e, 0x48, 0x95, 0x7d, 0x3c, 0xbd, 0xdb, 0x6f, + 0x38, 0xad, 0xf4, 0x19, 0xa8, 0xb9, 0x9e, 0xf6, 0xfd, 0xf4, 0xf1, 0xfa, + 0x15, 0x82, 0xb9, 0xfa, 0x34, 0xe0, 0xd4, 0x20, 0x8a, 0x2e, 0xb2, 0x3b, + 0x78, 0x47, 0x0d, 0xba, 0x0e, 0x17, 0x9b, 0xd5, 0x33, 0xdb, 0x31, 0x49, + 0x08, 0xd5, 0xaa, 0x04, 0xe0, 0x22, 0x69, 0x38, 0x82, 0xb1, 0x40, 0xe2, + 0x0b, 0x41, 0xcf, 0x91, 0x14, 0x02, 0x81, 0x4b, 0x04, 0xae, 0xaa, 0x40, + 0x08, 0xce, 0xda, 0xe1, 0x40, 0x93, 0x02, 0x9d, 0x00, 0xea, 0x8e, 0xba, + 0xe7, 0x5b, 0xd0, 0x30, 0x2d, 0x05, 0xbe, 0x52, 0x90, 0xac, 0x31, 0xfd, + 0x91, 0x80, 0x9e, 0xd4, 0xd7, 0x28, 0x01, 0xb4, 0xe8, 0xb1, 0x45, 0x9f, + 0x6f, 0x3a, 0x81, 0xba, 0x5e, 0x6a, 0x05, 0x40, 0x51, 0x5d, 0x93, 0x8c, + 0xe9, 0x3c, 0x16, 0x9c, 0xf4, 0x75, 0xd5, 0x4f, 0xcb, 0xd8, 0x6f, 0xc8, + 0x45, 0x20, 0x05, 0xa0, 0x9f, 0x19, 0xb8, 0xf4, 0x14, 0xce, 0x46, 0x3f, + 0xc7, 0x2c, 0x08, 0xd5, 0xe7, 0x4d, 0x04, 0x06, 0x4a, 0xa5, 0x60, 0x5a, + 0x90, 0x04, 0x6a, 0xa9, 0x4e, 0x3f, 0xdc, 0xad, 0xfa, 0x99, 0x9d, 0x01, + 0x5b, 0xf5, 0xa4, 0xa4, 0x87, 0x54, 0xbd, 0x7d, 0x20, 0xe9, 0x39, 0x82, + 0x2d, 0x0e, 0x34, 0x75, 0x5d, 0x42, 0x84, 0x8e, 0x05, 0xd4, 0x72, 0x65, + 0x0f, 0x12, 0x1f, 0x47, 0x49, 0xfe, 0x6e, 0x3a, 0x40, 0x89, 0x38, 0x84, + 0xba, 0xa4, 0xc3, 0x2b, 0x81, 0x5a, 0x42, 0x1c, 0xa8, 0x55, 0x82, 0x81, + 0xcf, 0xaf, 0xaf, 0xdd, 0xfc, 0x2b, 0xf0, 0x97, 0x99, 0xd1, 0x97, 0x45, + 0xbf, 0x28, 0xb7, 0x70, 0xf2, 0xa4, 0x1a, 0x3b, 0xdd, 0x54, 0x81, 0xcd, + 0x37, 0xdd, 0xcc, 0xd9, 0xb3, 0x67, 0xc3, 0x6d, 0x50, 0x70, 0x2b, 0x03, + 0x97, 0x32, 0x10, 0x29, 0xb3, 0x0d, 0xb0, 0x6e, 0xdd, 0xba, 0x10, 0x76, + 0x65, 0x83, 0xad, 0x8c, 0xed, 0xe5, 0xf4, 0x69, 0xa7, 0x35, 0x70, 0xac, + 0x4d, 0x15, 0x62, 0x70, 0xad, 0x4d, 0x9b, 0x36, 0x85, 0xfe, 0xa6, 0x6e, + 0x4a, 0xf7, 0xbb, 0x96, 0x73, 0x6c, 0xbe, 0xe9, 0x66, 0x80, 0x58, 0x59, + 0x8d, 0xcf, 0x24, 0x74, 0x6b, 0x6a, 0x6a, 0x2a, 0xb4, 0x9b, 0xba, 0x69, + 0x1d, 0x27, 0x5e, 0x3d, 0x16, 0x03, 0x7b, 0x9d, 0x3c, 0x79, 0x92, 0x6b, + 0xff, 0x5e, 0xf6, 0x67, 0x4a, 0xca, 0x45, 0x38, 0xf0, 0x46, 0x83, 0xb2, + 0xdb, 0x7f, 0xfd, 0x56, 0x2d, 0xf7, 0x87, 0x2d, 0xbc, 0xd1, 0xa0, 0x32, + 0x39, 0x1e, 0x6e, 0x7b, 0x6d, 0x3f, 0x66, 0xb7, 0xb0, 0x42, 0x5f, 0x63, + 0x1f, 0x8a, 0xa0, 0x54, 0xc3, 0xfa, 0xf2, 0xda, 0x3e, 0xa5, 0x91, 0xf8, + 0xf5, 0x8f, 0x6d, 0xd7, 0x3a, 0xdd, 0x62, 0xdf, 0xcb, 0x1e, 0xf7, 0xdc, + 0x5a, 0x0d, 0xc3, 0xb6, 0xd4, 0xaf, 0xa7, 0x79, 0x42, 0x3d, 0x6f, 0x6e, + 0xca, 0xe8, 0xb9, 0xf3, 0xbe, 0x97, 0x3d, 0xb6, 0xd4, 0xaf, 0x8f, 0xf9, + 0x52, 0x70, 0xab, 0x65, 0x7c, 0x79, 0x2d, 0xbc, 0xd7, 0xe6, 0x23, 0x5f, + 0x42, 0xb0, 0xef, 0xe5, 0xc6, 0x8a, 0x7c, 0xd5, 0xaa, 0x9d, 0xb8, 0x2f, + 0xbf, 0x41, 0x4d, 0xa3, 0x08, 0x93, 0x79, 0x26, 0x7d, 0xfd, 0xe1, 0x03, + 0xbb, 0xf8, 0xec, 0x93, 0xfb, 0x29, 0xdf, 0x50, 0x63, 0xc7, 0x58, 0x4d, + 0xb7, 0x41, 0x0d, 0x8a, 0xe9, 0x00, 0xb0, 0x5b, 0x3f, 0xf8, 0x41, 0x5e, + 0x39, 0xf7, 0x5a, 0x6a, 0xdc, 0xec, 0xa2, 0x7a, 0xce, 0xf0, 0xd0, 0xc7, + 0xbf, 0xda, 0x17, 0x67, 0x03, 0xb6, 0x92, 0xdb, 0x7b, 0xbf, 0xa5, 0x3e, + 0xac, 0x26, 0x65, 0x8b, 0xda, 0xfa, 0x89, 0x18, 0xb8, 0x6a, 0xac, 0x3e, + 0x45, 0xcb, 0x7a, 0xbe, 0xff, 0x81, 0x8d, 0xea, 0xbe, 0x7f, 0x7d, 0x79, + 0x94, 0x33, 0xed, 0x45, 0xe6, 0xbf, 0xf3, 0x3d, 0xc6, 0x7f, 0xed, 0xc3, + 0x40, 0x04, 0xd7, 0x5a, 0x5f, 0x1e, 0x8d, 0x41, 0xb5, 0x92, 0x79, 0x67, + 0xe9, 0xc0, 0xc2, 0x5e, 0x9a, 0x67, 0x8e, 0x86, 0x80, 0x2c, 0xbb, 0x2e, + 0x26, 0xce, 0x56, 0x65, 0xa4, 0x46, 0x53, 0xc3, 0xd8, 0x8c, 0xfd, 0x4a, + 0xf3, 0xcc, 0x2a, 0x47, 0x6b, 0xa9, 0x89, 0x94, 0xad, 0x58, 0x5b, 0xa6, + 0x95, 0xc1, 0x2e, 0xeb, 0xec, 0xe2, 0x33, 0xa1, 0xfd, 0x53, 0xff, 0xcf, + 0x67, 0x42, 0x9b, 0x0d, 0x6b, 0x6e, 0xe5, 0x03, 0x1b, 0x37, 0x84, 0x6d, + 0x62, 0xaf, 0xff, 0x9d, 0x0f, 0x5e, 0xcb, 0x02, 0x6f, 0xaf, 0xba, 0xac, + 0xb9, 0x72, 0xe5, 0xca, 0x95, 0x2b, 0x57, 0xae, 0x5c, 0xb9, 0x72, 0xe5, + 0xca, 0x95, 0x2b, 0x57, 0xae, 0x5c, 0xb9, 0x72, 0xe5, 0xca, 0x95, 0x2b, + 0x57, 0xae, 0x5c, 0xb9, 0x72, 0xe5, 0xca, 0xf5, 0xf3, 0xae, 0x77, 0xfb, + 0x95, 0xb3, 0x5c, 0xb9, 0x72, 0xe5, 0xca, 0x95, 0xeb, 0xe7, 0x57, 0xdb, + 0xad, 0x49, 0x0b, 0xfa, 0x85, 0x69, 0xdf, 0xf7, 0xfb, 0xce, 0xce, 0xb2, + 0x2b, 0xe3, 0x93, 0x11, 0xa4, 0x18, 0x6a, 0x02, 0x4d, 0x12, 0x76, 0x05, + 0xd1, 0x04, 0xa4, 0x34, 0x98, 0xd4, 0x20, 0x3b, 0x3b, 0x2c, 0xcd, 0xd6, + 0xbc, 0xd0, 0x6b, 0xd6, 0x05, 0x2b, 0xff, 0xf2, 0x71, 0xf8, 0x95, 0xdd, + 0x40, 0xe2, 0x16, 0x5d, 0x64, 0x57, 0x0e, 0xac, 0x83, 0xdd, 0x06, 0x49, + 0x48, 0x56, 0x5a, 0x1d, 0xec, 0xaf, 0x31, 0x2f, 0x67, 0x6b, 0x87, 0x0d, + 0x2c, 0x73, 0xa2, 0x1d, 0x85, 0x10, 0xd1, 0xfb, 0xeb, 0xdb, 0x3b, 0xf0, + 0x82, 0x5a, 0x75, 0x6f, 0xb0, 0x7c, 0x99, 0x7a, 0x5a, 0x80, 0x17, 0x03, + 0x9c, 0x2a, 0x39, 0x25, 0x35, 0x51, 0xd5, 0x86, 0x69, 0xad, 0xf0, 0x6a, + 0x2d, 0x06, 0x9f, 0x31, 0xfb, 0xc0, 0x02, 0x43, 0x01, 0x48, 0x07, 0xbe, + 0xf2, 0xdb, 0xbb, 0xb8, 0xef, 0x59, 0x35, 0x49, 0xeb, 0x8e, 0x9b, 0x27, + 0xb4, 0x1d, 0x7a, 0xd2, 0x8f, 0xda, 0x3c, 0xfa, 0xba, 0x7a, 0x99, 0x79, + 0xe2, 0x86, 0x2d, 0x1c, 0x3d, 0x76, 0x94, 0x37, 0xff, 0xd5, 0x1f, 0x71, + 0xdf, 0x73, 0x6a, 0xa2, 0xd7, 0x7d, 0x5f, 0xda, 0xcf, 0xd3, 0xc4, 0x27, + 0x09, 0x4a, 0x07, 0x48, 0x00, 0xab, 0x0c, 0x50, 0xab, 0xe4, 0x94, 0x96, + 0x07, 0x83, 0xa5, 0xc1, 0xa3, 0x6c, 0x98, 0x95, 0x5d, 0x1f, 0x27, 0x3d, + 0x8d, 0xec, 0xca, 0xb0, 0xf5, 0x4c, 0xbe, 0x49, 0x8d, 0x8d, 0x56, 0x58, + 0x58, 0x6c, 0x29, 0x1f, 0x16, 0x38, 0xcb, 0xa4, 0xef, 0x04, 0x1d, 0x4a, + 0x94, 0x62, 0xf1, 0xa6, 0x2e, 0xf6, 0x84, 0x62, 0x23, 0xf7, 0x06, 0x01, + 0x47, 0xf4, 0x86, 0x75, 0x5c, 0x77, 0x1c, 0x35, 0xd1, 0xb8, 0xec, 0xf8, + 0x98, 0xd7, 0x48, 0x5b, 0x29, 0xfb, 0x53, 0x0e, 0x98, 0xf5, 0x30, 0x2c, + 0x90, 0x49, 0x06, 0x7a, 0x0e, 0x8b, 0xa3, 0x41, 0x5d, 0x09, 0x70, 0x97, + 0xb1, 0x69, 0x38, 0x65, 0xc6, 0xf4, 0x54, 0x95, 0xf1, 0x22, 0xcc, 0x77, + 0xc1, 0x0f, 0xbf, 0xb4, 0xad, 0x26, 0x7f, 0x6d, 0x95, 0x82, 0x9e, 0x03, + 0x8d, 0xa2, 0xa4, 0xdc, 0x2d, 0xc7, 0xe1, 0x59, 0x29, 0x72, 0x8b, 0x65, + 0xfc, 0x94, 0xe9, 0x2f, 0x6e, 0xca, 0x24, 0x2b, 0x51, 0x2c, 0x20, 0xbb, + 0xbd, 0xfe, 0x70, 0x51, 0xc0, 0x4f, 0x84, 0x4b, 0xd9, 0xa6, 0x3c, 0x52, + 0xc3, 0xef, 0xf6, 0x90, 0xb2, 0x8d, 0x10, 0xe5, 0x81, 0x60, 0xad, 0x78, + 0x3e, 0xfd, 0x93, 0x7a, 0xec, 0x89, 0xdc, 0x00, 0xee, 0x48, 0x0d, 0xd9, + 0xed, 0x68, 0xfb, 0x52, 0xb8, 0x1e, 0xe5, 0xef, 0xe3, 0xba, 0x65, 0xa4, + 0x94, 0xf1, 0xe3, 0xfa, 0xeb, 0x3a, 0xfd, 0x0d, 0xe9, 0xfb, 0xe6, 0xa2, + 0x21, 0x5a, 0x57, 0xf0, 0x0e, 0x2d, 0x0b, 0x3c, 0x97, 0x05, 0xa6, 0xcb, + 0x82, 0x70, 0x0d, 0x03, 0xf9, 0xb3, 0x6d, 0xb2, 0xd6, 0x57, 0x9a, 0xf6, + 0x62, 0xf2, 0x08, 0x61, 0x79, 0x45, 0x01, 0x8e, 0x88, 0x41, 0xb6, 0x20, + 0x7e, 0x5c, 0xbf, 0xef, 0x86, 0x68, 0x66, 0xd1, 0x6a, 0x61, 0x45, 0x1f, + 0xb6, 0x6f, 0x00, 0x00, 0x20, 0x00, 0x49, 0x44, 0x41, 0x54, 0x58, 0x17, + 0x0b, 0xd3, 0x32, 0x61, 0x1f, 0xd4, 0x61, 0x8f, 0x03, 0x0f, 0xe9, 0xf0, + 0x0f, 0x5e, 0xd3, 0x6f, 0xbb, 0xe3, 0xc1, 0xbe, 0x2a, 0x2f, 0xab, 0x08, + 0x69, 0x15, 0x81, 0xb4, 0x0e, 0xeb, 0xb5, 0x6d, 0x7a, 0x7d, 0x14, 0xd8, + 0xc6, 0xb6, 0x58, 0xba, 0x45, 0x16, 0xc3, 0xb8, 0xc3, 0xc0, 0x53, 0x1c, + 0xd6, 0xfe, 0xd0, 0x6b, 0x87, 0x43, 0x70, 0x97, 0x0d, 0xef, 0x32, 0x40, + 0x2d, 0xf3, 0x37, 0x1a, 0x86, 0x93, 0xf0, 0x0f, 0xd9, 0x53, 0x40, 0x86, + 0xd3, 0x20, 0xa8, 0xd8, 0xfb, 0x6e, 0x28, 0xc2, 0xac, 0x6a, 0x60, 0xb7, + 0xd8, 0x3f, 0xa1, 0xf4, 0xdb, 0xdf, 0xfc, 0x36, 0x1f, 0xfd, 0x58, 0x04, + 0xd1, 0xfa, 0xe8, 0xc7, 0x3e, 0xda, 0x17, 0x96, 0xa5, 0x2c, 0xc0, 0xd4, + 0x72, 0x80, 0x91, 0x8b, 0x91, 0x9b, 0xd1, 0x87, 0xac, 0x16, 0xac, 0xe5, + 0x13, 0xc1, 0xb4, 0x42, 0x5f, 0xae, 0x8b, 0xaf, 0xa1, 0x5a, 0x82, 0xa8, + 0x8e, 0x3e, 0x30, 0x06, 0x2c, 0xac, 0x3c, 0x9b, 0x2b, 0x22, 0xb7, 0xd8, + 0x09, 0x27, 0xd0, 0xa9, 0x7d, 0x1d, 0x4d, 0x50, 0x53, 0x30, 0xac, 0x16, + 0xb5, 0x13, 0x6a, 0xd2, 0x74, 0x4f, 0x03, 0xb6, 0x42, 0xa0, 0x96, 0xb6, + 0x11, 0x7e, 0x8b, 0xc2, 0x6b, 0xba, 0x86, 0x1a, 0xa6, 0xd5, 0x6a, 0xb7, + 0x90, 0xaf, 0x2d, 0xc4, 0xed, 0x9e, 0x3c, 0x40, 0xed, 0xb5, 0xe3, 0xf0, + 0xa9, 0x2d, 0x70, 0xd3, 0x56, 0xe8, 0x4e, 0xb0, 0xef, 0xae, 0xdd, 0xec, + 0xf8, 0xf7, 0x4f, 0xc3, 0x91, 0xc7, 0x99, 0xaf, 0xb5, 0x18, 0x0f, 0xa6, + 0xa8, 0x1d, 0x52, 0x93, 0x2b, 0x4a, 0x9f, 0xbe, 0x1f, 0xce, 0xb4, 0xa9, + 0x2c, 0x34, 0x39, 0xe8, 0xee, 0xc5, 0xf7, 0x44, 0xe8, 0xcb, 0x3d, 0xdd, + 0xa4, 0xf6, 0xb2, 0x9e, 0xe8, 0xaf, 0x81, 0x5a, 0xcd, 0xd3, 0x4d, 0xe6, + 0x71, 0x79, 0x68, 0x7d, 0x85, 0xbd, 0xff, 0xec, 0x57, 0xd9, 0x77, 0xb8, + 0xaa, 0xe2, 0x1f, 0x83, 0xba, 0xeb, 0x85, 0xf5, 0x1a, 0xbf, 0x45, 0xfd, + 0x01, 0x71, 0xbb, 0xdf, 0xeb, 0xb7, 0x6b, 0x1c, 0xce, 0x68, 0xb8, 0xdf, + 0xdb, 0x0b, 0xff, 0xf9, 0x1b, 0x0a, 0xa0, 0x55, 0xab, 0xc2, 0x4d, 0x2d, + 0x3e, 0xbb, 0xe5, 0x0e, 0x15, 0xb6, 0x7d, 0x47, 0x3f, 0x58, 0xab, 0x56, + 0x05, 0xd2, 0x27, 0xf3, 0xa4, 0xc9, 0x80, 0xb2, 0xfc, 0xd7, 0x0e, 0xf2, + 0x6f, 0x35, 0x5c, 0x2b, 0x0d, 0x9e, 0xb5, 0x1c, 0x50, 0xcb, 0x96, 0x7d, + 0x2c, 0x27, 0xcf, 0xd7, 0xe5, 0x11, 0x41, 0x7b, 0x69, 0xf8, 0xfb, 0x14, + 0x03, 0xcb, 0x1a, 0x04, 0xd4, 0x02, 0x32, 0xe3, 0xe7, 0x5f, 0x8d, 0xae, + 0x5d, 0x86, 0x01, 0x62, 0x2d, 0x67, 0x33, 0x0c, 0x9c, 0xcb, 0x15, 0xfa, + 0x3a, 0xc6, 0x82, 0xfe, 0xf4, 0xad, 0x3b, 0xd6, 0x91, 0xed, 0xee, 0x00, + 0xff, 0x20, 0x62, 0x64, 0x47, 0xdc, 0x91, 0x7f, 0x10, 0xe1, 0x9a, 0xab, + 0x7d, 0x5d, 0x0f, 0x57, 0x03, 0xb5, 0xcc, 0xc4, 0x35, 0xbd, 0x1e, 0x82, + 0x0c, 0x46, 0x5c, 0x42, 0xd4, 0x46, 0x91, 0x88, 0xe6, 0xe5, 0x5a, 0x80, + 0x5e, 0x1d, 0x26, 0x5c, 0x01, 0xd1, 0xbc, 0x29, 0xa4, 0x14, 0x08, 0x21, + 0x91, 0x52, 0xed, 0xb3, 0x52, 0x51, 0x22, 0x65, 0x8f, 0x5e, 0x20, 0x29, + 0x14, 0x6b, 0x40, 0x3f, 0x78, 0xd5, 0x3e, 0x5f, 0x7f, 0xb8, 0xf8, 0xbe, + 0xcc, 0x36, 0x49, 0x42, 0x00, 0x87, 0x8d, 0x1f, 0x04, 0xa6, 0xba, 0x9c, + 0x1a, 0x54, 0x5e, 0x01, 0x74, 0x4a, 0x25, 0xae, 0xbb, 0xee, 0x3a, 0x3a, + 0xe7, 0xcf, 0x53, 0xea, 0x74, 0xfa, 0xe2, 0x7f, 0x96, 0xea, 0xb2, 0xdc, + 0x7e, 0x31, 0xfa, 0x70, 0xf1, 0x7d, 0xfc, 0xb9, 0xbe, 0x1e, 0xb2, 0x8f, + 0xf1, 0xbd, 0x7e, 0x8b, 0x5d, 0x23, 0x15, 0x44, 0xe0, 0xb3, 0x4f, 0x4a, + 0xee, 0x11, 0x02, 0x84, 0xa0, 0x42, 0xff, 0x39, 0x78, 0xd6, 0xf5, 0xd9, + 0xb1, 0xad, 0xc1, 0xec, 0xd8, 0x04, 0x53, 0x0b, 0xd1, 0xd9, 0x2a, 0x09, + 0x1d, 0xb1, 0xc3, 0xc4, 0x1a, 0x11, 0x82, 0xa8, 0xfc, 0x01, 0x93, 0xd1, + 0x43, 0x68, 0x95, 0xd3, 0x0f, 0x9f, 0x02, 0x38, 0xf0, 0xf5, 0x03, 0xe9, + 0xe9, 0xac, 0xfb, 0xcb, 0x41, 0x36, 0x69, 0xb0, 0x2b, 0x7b, 0xdb, 0x2d, + 0x0a, 0xfc, 0xae, 0x44, 0x7a, 0xfd, 0x13, 0x22, 0x93, 0xe5, 0x02, 0x62, + 0xf0, 0xae, 0xb4, 0xf2, 0x24, 0xd7, 0xb3, 0x7c, 0xb6, 0x7c, 0x9f, 0x8a, + 0x5b, 0xa1, 0xe5, 0xfb, 0xb8, 0x45, 0xd5, 0x5f, 0x34, 0x9b, 0x2d, 0xea, + 0xf5, 0x74, 0xb8, 0x8a, 0x5b, 0x74, 0xf1, 0xbb, 0x7e, 0x6a, 0x9b, 0x47, + 0x36, 0xd1, 0xfe, 0x1d, 0x74, 0x5c, 0xe7, 0xfa, 0xd9, 0x97, 0x7d, 0x5c, + 0xdb, 0xf7, 0x5c, 0xa0, 0xce, 0x24, 0x15, 0x6b, 0x99, 0x8c, 0x5b, 0x8d, + 0x8c, 0x9f, 0xcb, 0x0d, 0xdf, 0x6a, 0xad, 0x36, 0x0f, 0x47, 0x01, 0x20, + 0x16, 0xba, 0x97, 0xb8, 0x40, 0xcb, 0xc8, 0x94, 0xd5, 0xb4, 0xf7, 0x16, + 0x86, 0x03, 0x80, 0x2d, 0x27, 0x7b, 0xbf, 0xc5, 0xee, 0xb9, 0xd2, 0xc6, + 0x52, 0xbe, 0xa6, 0xfb, 0xbf, 0x4f, 0xed, 0x64, 0xec, 0x75, 0x68, 0xfa, + 0xfb, 0x28, 0x53, 0xc0, 0x6b, 0xb7, 0x14, 0x10, 0xe3, 0x22, 0xc7, 0x49, + 0x26, 0x3e, 0xa4, 0xfa, 0x71, 0xf7, 0x4e, 0x17, 0x71, 0xe2, 0x72, 0xe2, + 0x8d, 0xb3, 0x25, 0x37, 0xc7, 0xc1, 0x5d, 0xf2, 0x5f, 0x56, 0xa9, 0xbf, + 0x36, 0x41, 0xdd, 0x66, 0xcc, 0xdd, 0xa9, 0xe3, 0xee, 0xdc, 0x95, 0xe9, + 0xe7, 0x52, 0x40, 0xb6, 0x0c, 0x5c, 0xcb, 0x00, 0xb5, 0x7a, 0x32, 0x82, + 0x69, 0x81, 0x02, 0x99, 0x34, 0x4f, 0x2d, 0x0f, 0xd4, 0x4a, 0x93, 0x7d, + 0x6d, 0xb6, 0xa5, 0x98, 0x7e, 0x2e, 0x10, 0x4e, 0x09, 0x51, 0x2c, 0x41, + 0xd7, 0x85, 0xc0, 0x8b, 0x22, 0x9c, 0x32, 0x04, 0x25, 0xa0, 0xa6, 0xae, + 0x67, 0x83, 0x0e, 0x11, 0x04, 0xca, 0x8b, 0xf9, 0x70, 0x45, 0x05, 0xe9, + 0xfb, 0x1a, 0x40, 0x55, 0xa6, 0xe4, 0xba, 0xb4, 0xbb, 0x15, 0xf5, 0x8c, + 0x25, 0xa8, 0x01, 0x0d, 0x84, 0x53, 0x52, 0x3e, 0x82, 0x12, 0x42, 0xe8, + 0x75, 0xad, 0x36, 0x6d, 0x70, 0xa0, 0xb7, 0xe4, 0x2b, 0x48, 0x95, 0x28, + 0xd3, 0xf3, 0xd5, 0x7a, 0x9f, 0x74, 0xba, 0x10, 0x76, 0xe5, 0x14, 0x10, + 0x81, 0x82, 0x66, 0x99, 0x0f, 0x1b, 0xb8, 0x7a, 0x2c, 0xd0, 0x97, 0xfa, + 0xbe, 0xdb, 0x51, 0x1f, 0x51, 0x48, 0xdd, 0x3b, 0x4e, 0xc7, 0x5a, 0x5a, + 0x1f, 0x54, 0x09, 0x24, 0x38, 0x1d, 0x5c, 0x31, 0x86, 0x2f, 0x7d, 0x70, + 0x3a, 0x51, 0x99, 0xac, 0x75, 0x57, 0xd4, 0x28, 0xb8, 0x2e, 0x9e, 0x97, + 0x7d, 0xe7, 0xed, 0x3a, 0x15, 0xfc, 0xa0, 0x45, 0x04, 0x19, 0xf3, 0xf4, + 0x5f, 0x55, 0x2d, 0x9d, 0x0e, 0x1d, 0x5d, 0xf7, 0xf2, 0x8d, 0xbb, 0xf0, + 0x97, 0xd4, 0xfe, 0x76, 0xdd, 0x3a, 0xbe, 0xdf, 0x40, 0xb8, 0x35, 0x84, + 0x47, 0xd8, 0xae, 0x61, 0x5b, 0x5a, 0xda, 0x52, 0x74, 0xc3, 0x7b, 0x7f, + 0xbb, 0x0f, 0xf7, 0xe6, 0x60, 0x66, 0x32, 0x5a, 0x37, 0xcb, 0xe9, 0x49, + 0x98, 0xf3, 0x60, 0xb2, 0x0a, 0x33, 0x1e, 0x78, 0x1e, 0x54, 0xab, 0x96, + 0xdd, 0x34, 0x78, 0xa6, 0x8c, 0x1e, 0x78, 0x55, 0x8f, 0x6a, 0x35, 0xf2, + 0x31, 0x39, 0x5d, 0xc5, 0xc3, 0x63, 0xce, 0x53, 0xdb, 0xd5, 0x2a, 0xcc, + 0xcc, 0xc0, 0xb4, 0x4e, 0x67, 0xdb, 0x32, 0x49, 0xec, 0xa7, 0x33, 0x5d, + 0x05, 0xcf, 0x64, 0x06, 0xcc, 0x79, 0x1e, 0x93, 0xd5, 0x2a, 0x7b, 0xf0, + 0x78, 0x49, 0xc0, 0xcb, 0xbf, 0x55, 0xe5, 0xd6, 0x3f, 0xf5, 0x80, 0x6d, + 0x7a, 0x00, 0x2a, 0x79, 0x73, 0xac, 0xc7, 0xc1, 0x46, 0xb7, 0xf1, 0x95, + 0xaf, 0xdc, 0xce, 0x9e, 0xe9, 0x2a, 0xe5, 0x11, 0x87, 0x91, 0x91, 0x45, + 0x1e, 0xf9, 0xfc, 0x8b, 0x7c, 0xe5, 0xff, 0xba, 0x9d, 0x2a, 0x55, 0x3c, + 0x60, 0x66, 0xc6, 0x0b, 0x53, 0x4d, 0x4f, 0xc3, 0xdd, 0x77, 0xbf, 0xc8, + 0x6d, 0xb7, 0xdd, 0xce, 0xf4, 0x34, 0x54, 0x51, 0x95, 0xbf, 0xfb, 0x37, + 0xe0, 0x2b, 0x7a, 0x5f, 0x4c, 0x4f, 0x56, 0xa3, 0xc2, 0x56, 0x61, 0x6e, + 0x2e, 0x4c, 0xce, 0x9c, 0x6e, 0x23, 0xcf, 0x83, 0x49, 0x53, 0xfe, 0xaa, + 0x17, 0xf9, 0xaa, 0x46, 0x79, 0x79, 0xd1, 0x2a, 0xd3, 0xd3, 0xd1, 0xba, + 0x87, 0xa7, 0x6c, 0xa7, 0x95, 0x8d, 0xf1, 0x3f, 0xbd, 0xc7, 0xec, 0x83, + 0x2a, 0x9e, 0xa7, 0x6c, 0xe6, 0x3c, 0x0f, 0xab, 0x99, 0x42, 0x65, 0x8e, + 0x9b, 0x39, 0x85, 0x7e, 0xe3, 0x15, 0xca, 0x37, 0x30, 0x29, 0xd3, 0x97, + 0xd9, 0xeb, 0x5a, 0x06, 0x4e, 0x24, 0xd1, 0xd7, 0xa7, 0xc3, 0x8e, 0x6d, + 0x09, 0x11, 0x3d, 0x4f, 0xba, 0x94, 0x5a, 0xee, 0xb9, 0xa1, 0x29, 0xa3, + 0xf9, 0x68, 0x8a, 0x0e, 0xf6, 0x0d, 0xec, 0x37, 0xbc, 0x37, 0x57, 0xfd, + 0x4d, 0x78, 0x7d, 0xaf, 0xd3, 0x99, 0xfa, 0xae, 0x44, 0xf6, 0x73, 0xcd, + 0x58, 0xf8, 0x10, 0x40, 0x2d, 0x5b, 0xf6, 0xb8, 0x99, 0xfd, 0x9c, 0x6b, + 0x97, 0x03, 0xb3, 0xc0, 0xfd, 0x3a, 0x6e, 0x56, 0xf7, 0x6e, 0xf7, 0x07, + 0xd0, 0x74, 0x04, 0xad, 0x00, 0x2a, 0x08, 0x9a, 0x48, 0x6a, 0x8e, 0x7a, + 0xbe, 0x51, 0x41, 0xd2, 0x0a, 0xa0, 0xa6, 0xeb, 0xd7, 0x42, 0xb5, 0xc5, + 0x1d, 0xba, 0xbb, 0x38, 0x2a, 0xe1, 0xfe, 0x22, 0x1c, 0x0d, 0x60, 0x0a, + 0xc1, 0x94, 0x90, 0x34, 0x03, 0x75, 0x7f, 0x38, 0x51, 0x2c, 0xd0, 0x92, + 0x3d, 0x1a, 0xba, 0x0d, 0xa7, 0x24, 0x34, 0x9c, 0x1e, 0x35, 0x51, 0xa0, + 0xa6, 0x81, 0x54, 0x77, 0x14, 0xa1, 0x85, 0xa0, 0xa6, 0xa1, 0x57, 0x15, + 0x07, 0xa6, 0x04, 0xcc, 0x76, 0xd5, 0xfa, 0x84, 0x2e, 0x6b, 0x13, 0xa8, + 0x3b, 0x22, 0x7c, 0xd6, 0x27, 0x1c, 0x89, 0x8f, 0xa0, 0x4e, 0x34, 0x7e, + 0x29, 0x1c, 0xf0, 0x03, 0x0d, 0x72, 0xb4, 0x9e, 0x27, 0xf6, 0x64, 0x8f, + 0x05, 0x47, 0x3d, 0x1f, 0x9c, 0x08, 0xe0, 0x68, 0x90, 0xbe, 0x5f, 0x62, + 0xbb, 0xcb, 0x01, 0x02, 0xa9, 0x7f, 0x7e, 0x11, 0x6c, 0xab, 0x23, 0xa1, + 0xa4, 0x61, 0x5b, 0xc7, 0x85, 0x01, 0x74, 0xe9, 0xb1, 0x0f, 0x07, 0x3a, + 0x52, 0x3d, 0x1b, 0xeb, 0xa1, 0x81, 0x5a, 0x41, 0x07, 0x21, 0x4a, 0xd1, + 0xf3, 0xc9, 0xae, 0x54, 0x63, 0xae, 0xd6, 0xf3, 0x8b, 0x8e, 0x03, 0xa2, + 0xeb, 0x83, 0x3e, 0xdf, 0x9a, 0x3d, 0xd6, 0xb1, 0x6c, 0x0a, 0x1a, 0x5c, + 0xb6, 0x90, 0xf8, 0xd8, 0x8f, 0xfd, 0x9c, 0x8b, 0x8f, 0x45, 0xfb, 0xfa, + 0xf4, 0x35, 0xbf, 0x7c, 0xc5, 0x97, 0x37, 0x5d, 0xb7, 0x26, 0xcc, 0xdf, + 0x80, 0xa2, 0x4e, 0x9e, 0x3c, 0x19, 0x86, 0xad, 0xbd, 0x6e, 0x0d, 0x17, + 0x5a, 0xe7, 0x58, 0xab, 0xed, 0x6c, 0x80, 0xd5, 0x85, 0xd6, 0x39, 0xce, + 0x62, 0x41, 0xac, 0xce, 0x9f, 0x0c, 0xd3, 0x00, 0x9c, 0x3b, 0x7f, 0x81, + 0xcd, 0xda, 0xcf, 0xe5, 0xf0, 0xd9, 0xe7, 0x17, 0x05, 0xbe, 0x5a, 0x53, + 0x59, 0x1b, 0x03, 0x68, 0x19, 0x7f, 0x27, 0x2c, 0x30, 0x96, 0x49, 0x67, + 0xfc, 0x9a, 0xba, 0x67, 0xf9, 0x34, 0x7e, 0x37, 0x55, 0x60, 0x76, 0x76, + 0x96, 0xb5, 0xd7, 0xad, 0x61, 0x4d, 0x65, 0x2d, 0x27, 0x5e, 0x3d, 0x16, + 0xd6, 0x21, 0xe9, 0x13, 0x50, 0xfb, 0xf7, 0x3f, 0xa8, 0x55, 0xbb, 0x0f, + 0x4f, 0x03, 0x57, 0x65, 0xc9, 0x40, 0xaf, 0xc6, 0x3e, 0x54, 0xa7, 0x75, + 0xa6, 0x15, 0x76, 0xaf, 0x59, 0x5d, 0xd5, 0xec, 0x1b, 0x0b, 0x20, 0xa1, + 0x2c, 0x04, 0x8d, 0xc5, 0x26, 0x52, 0x4a, 0xaa, 0xb7, 0xd4, 0xf1, 0xbd, + 0x16, 0x42, 0x08, 0x3a, 0x4b, 0x2d, 0xfe, 0xf1, 0xff, 0xf6, 0x8f, 0x01, + 0x28, 0x8c, 0x14, 0x70, 0xdd, 0x32, 0xad, 0xc5, 0xf4, 0x8f, 0x2d, 0x01, + 0x54, 0xc7, 0xc6, 0x42, 0x5b, 0x80, 0xd9, 0xaf, 0x1f, 0xa5, 0x32, 0x52, + 0x42, 0x6c, 0x70, 0x29, 0x0b, 0x97, 0x85, 0x37, 0xd2, 0xaf, 0x5b, 0x77, + 0x7f, 0xf9, 0x20, 0x5b, 0x47, 0x22, 0x80, 0xd7, 0x81, 0xe7, 0x9e, 0x01, + 0x51, 0x8a, 0x81, 0xaa, 0x54, 0x25, 0xfa, 0x9f, 0x59, 0xa7, 0xfa, 0x5a, + 0x3f, 0x46, 0xf5, 0xc6, 0x71, 0x78, 0x6e, 0x56, 0xf9, 0x92, 0x85, 0xb8, + 0xaf, 0x21, 0x95, 0xf4, 0x65, 0xa4, 0x7c, 0xa5, 0x03, 0x4f, 0x9f, 0xf7, + 0xa1, 0xf4, 0x46, 0x83, 0xfa, 0xd6, 0x78, 0x7e, 0x8d, 0xc5, 0x05, 0x4c, + 0x0d, 0xc3, 0xfd, 0xfb, 0xb1, 0x7e, 0x1f, 0x36, 0xd0, 0xc9, 0xd6, 0xe3, + 0x5f, 0xbf, 0x8b, 0xe7, 0xff, 0xdd, 0xf0, 0xd7, 0xfd, 0x8f, 0x7f, 0x3d, + 0xf2, 0x61, 0x43, 0xa3, 0x84, 0xa8, 0xf0, 0xf8, 0xd7, 0xef, 0x42, 0x88, + 0x0a, 0x42, 0xa4, 0xc3, 0x5f, 0x0d, 0x50, 0xcb, 0xac, 0xcf, 0x7f, 0x47, + 0xad, 0x1b, 0xf8, 0xd6, 0xc2, 0x5f, 0x34, 0x99, 0xf8, 0x78, 0xff, 0x87, + 0xdb, 0x92, 0xba, 0xeb, 0xc1, 0xa9, 0xb0, 0x2e, 0x76, 0x9d, 0xf6, 0x7e, + 0xeb, 0x61, 0xa4, 0x6c, 0x21, 0x44, 0x25, 0x06, 0xfc, 0x12, 0xa2, 0x12, + 0xc2, 0xbe, 0x4c, 0x3b, 0x4c, 0xdc, 0x74, 0x07, 0x47, 0x5f, 0x7d, 0x5e, + 0xd7, 0xe9, 0x2e, 0x80, 0x15, 0xb5, 0xc3, 0x5d, 0x0f, 0x4e, 0xf5, 0xe5, + 0x6f, 0xfc, 0xd8, 0xf5, 0xb7, 0xdb, 0x3d, 0xd9, 0xfe, 0xc6, 0xfe, 0xa1, + 0x8f, 0x7f, 0x35, 0x5c, 0xb7, 0x21, 0x5a, 0x3f, 0xfe, 0x49, 0x93, 0x85, + 0xbf, 0x68, 0x72, 0xfe, 0xed, 0xb3, 0x6c, 0x58, 0x73, 0x6b, 0x94, 0xd0, + 0x3a, 0xa6, 0x73, 0xe5, 0xca, 0x95, 0x2b, 0x57, 0xae, 0x5c, 0xb9, 0x72, + 0xe5, 0xca, 0x95, 0x2b, 0x57, 0xae, 0x5c, 0xb9, 0x72, 0xe5, 0xca, 0x95, + 0x2b, 0x57, 0xae, 0x5c, 0xb9, 0x72, 0xe5, 0xca, 0x95, 0x2b, 0xd7, 0xf0, + 0xca, 0xa1, 0x5a, 0xb9, 0x72, 0xe5, 0xca, 0x95, 0x2b, 0xd7, 0xbb, 0x2c, + 0x79, 0x42, 0xc2, 0x4d, 0xd1, 0x4b, 0xd5, 0xa0, 0x00, 0x2f, 0x3d, 0x5f, + 0xbd, 0x5c, 0xd5, 0xf3, 0xd5, 0x97, 0xc0, 0x15, 0x6c, 0x25, 0xfe, 0x72, + 0x74, 0xc7, 0xef, 0x50, 0x08, 0xa0, 0x23, 0x7d, 0xfc, 0xa5, 0x4e, 0x1f, + 0x9c, 0x21, 0xf9, 0x22, 0x75, 0xda, 0x8b, 0xd5, 0x17, 0x13, 0x66, 0xc2, + 0x0d, 0x44, 0xcb, 0x5e, 0x5f, 0x4e, 0x21, 0x84, 0xca, 0xb2, 0x4d, 0x9b, + 0xa4, 0xba, 0x92, 0x3a, 0xd8, 0x71, 0x7d, 0xe9, 0x74, 0xf9, 0xd2, 0xe2, + 0x07, 0xf9, 0x2c, 0x50, 0xa0, 0xd3, 0xed, 0x7f, 0x01, 0x31, 0xad, 0x5c, + 0x02, 0x81, 0x3c, 0x21, 0x33, 0x21, 0x19, 0xed, 0x33, 0x3e, 0x52, 0xf4, + 0xe7, 0x55, 0x11, 0xa5, 0xf0, 0xed, 0x53, 0x81, 0x05, 0xc5, 0x72, 0x58, + 0x7e, 0xa6, 0xf1, 0x00, 0x85, 0x13, 0x6f, 0x75, 0x1b, 0xdb, 0x60, 0xad, + 0xfb, 0x9e, 0xdd, 0x0f, 0x12, 0xea, 0xd5, 0x12, 0x0f, 0x6d, 0xdd, 0xda, + 0x97, 0xf6, 0xee, 0x2f, 0xef, 0xe7, 0xcd, 0x7f, 0xf5, 0x47, 0xe1, 0xf6, + 0xc4, 0xc6, 0x2d, 0x6a, 0x12, 0xbc, 0xd6, 0xd3, 0x9f, 0xd9, 0xc5, 0xf5, + 0xbf, 0xfb, 0x30, 0x8f, 0xa1, 0xa0, 0x5c, 0x2d, 0x5f, 0xf2, 0x95, 0xcf, + 0xec, 0xe2, 0xee, 0x2f, 0xef, 0x8f, 0xe5, 0x6f, 0x03, 0xb5, 0xcc, 0x04, + 0x3d, 0x23, 0xbb, 0x3c, 0x2a, 0x41, 0x04, 0x7f, 0x32, 0xea, 0x04, 0xd1, + 0x8b, 0xfc, 0x05, 0x3d, 0x59, 0x09, 0xbb, 0x7d, 0x12, 0xb2, 0xa1, 0x38, + 0x15, 0x4a, 0xf1, 0xa6, 0xd3, 0x13, 0xf9, 0x17, 0x16, 0x5b, 0xa9, 0xed, + 0x83, 0x10, 0x88, 0x80, 0x18, 0x88, 0xab, 0x22, 0x84, 0x7a, 0xe1, 0xbf, + 0x28, 0x68, 0xf9, 0x2d, 0x2a, 0x1a, 0x7c, 0xd6, 0x09, 0x3a, 0xb4, 0xcf, + 0xa4, 0xa1, 0x46, 0x74, 0x55, 0x4e, 0x28, 0x9f, 0x63, 0x8e, 0xcf, 0x42, + 0xe0, 0x32, 0xe6, 0xf8, 0xf8, 0x41, 0x3f, 0xec, 0xc4, 0x9e, 0xd8, 0x0c, + 0x66, 0xe2, 0x55, 0x8a, 0x3f, 0xe2, 0x93, 0xca, 0xfd, 0xc4, 0x4b, 0xf0, + 0x32, 0x11, 0x97, 0xcc, 0x47, 0x88, 0x32, 0x0b, 0xb2, 0x9d, 0xfa, 0x92, + 0x73, 0xc7, 0xb1, 0xfa, 0x14, 0x9d, 0x6e, 0xbe, 0x0b, 0xa2, 0x2b, 0x52, + 0x61, 0x59, 0x49, 0xf9, 0xdd, 0xb6, 0x82, 0x26, 0x0c, 0xa5, 0x8c, 0x17, + 0x94, 0x9d, 0x7e, 0x18, 0x5b, 0x52, 0xc3, 0x02, 0xb5, 0xb2, 0x64, 0x03, + 0xb5, 0x56, 0x9c, 0x76, 0x99, 0xe3, 0xfa, 0xdd, 0x06, 0x69, 0x0d, 0x03, + 0x01, 0x04, 0xc2, 0xaf, 0x9d, 0x2f, 0xa7, 0x2c, 0x70, 0x55, 0x12, 0x3c, + 0x35, 0x0c, 0x74, 0xcb, 0x5f, 0xf2, 0x33, 0xe3, 0xd2, 0xb4, 0x52, 0x7b, + 0xd0, 0x13, 0x54, 0x56, 0x68, 0xef, 0x2f, 0xf9, 0xb8, 0x23, 0x6e, 0x5f, + 0x5e, 0x83, 0x8e, 0xeb, 0xd3, 0x67, 0xd4, 0xec, 0xe6, 0x8d, 0xc0, 0xf7, + 0xdf, 0xb9, 0xb2, 0x30, 0xad, 0xa4, 0xed, 0x43, 0xba, 0x1c, 0x59, 0xb6, + 0xdb, 0x1f, 0x48, 0xad, 0x42, 0xaa, 0x16, 0xf5, 0xbf, 0x6d, 0x6c, 0x8b, + 0xc1, 0xb4, 0x54, 0x1c, 0x7a, 0x9b, 0x70, 0x7b, 0x91, 0xc3, 0x8c, 0x42, + 0x02, 0x90, 0x15, 0xd9, 0x26, 0x97, 0x87, 0xf5, 0xd6, 0xa8, 0x06, 0x6f, + 0x25, 0xed, 0x49, 0xd8, 0x1b, 0x8d, 0xa6, 0x84, 0xad, 0x56, 0x8b, 0x4f, + 0x3e, 0xc9, 0xe8, 0x13, 0x4f, 0xc4, 0xc2, 0xd4, 0xfe, 0x1c, 0x49, 0xb5, + 0x6f, 0x5b, 0x13, 0xd9, 0xef, 0x9a, 0x57, 0x60, 0x2d, 0x23, 0x51, 0x14, + 0xdc, 0x75, 0x24, 0x25, 0x51, 0x8a, 0x76, 0x02, 0xfb, 0x32, 0xe2, 0x24, + 0x51, 0xdf, 0x9e, 0xf6, 0xeb, 0xcd, 0xfe, 0x25, 0x2e, 0xaf, 0x24, 0x3c, + 0x2b, 0xed, 0xbc, 0x70, 0x31, 0xf2, 0xed, 0xd9, 0x9a, 0xc4, 0x2f, 0x55, + 0x9a, 0x64, 0xc3, 0xc4, 0xde, 0x2d, 0xb5, 0x07, 0x80, 0x09, 0xda, 0x7e, + 0x74, 0x86, 0x6d, 0x9c, 0x68, 0x51, 0x03, 0x0e, 0xe2, 0x52, 0xf5, 0xd4, + 0x44, 0x0b, 0x2f, 0xb1, 0x17, 0x16, 0x5e, 0x6b, 0x52, 0x31, 0x36, 0x1a, + 0xc0, 0x75, 0xbd, 0xd7, 0xe4, 0x60, 0x9f, 0xdd, 0x9b, 0xd4, 0x80, 0x46, + 0xa3, 0x07, 0x9b, 0x7d, 0x68, 0xb7, 0x68, 0xe0, 0xd2, 0xf8, 0xcd, 0x87, + 0x79, 0xe8, 0x40, 0x85, 0xc7, 0x4f, 0x55, 0x98, 0xf7, 0x0f, 0xd2, 0xbc, + 0xa1, 0x83, 0x74, 0x05, 0x2c, 0xed, 0x05, 0x24, 0x62, 0xc4, 0xc7, 0x47, + 0xa8, 0x03, 0xe0, 0x0d, 0xe5, 0x6b, 0xfe, 0xe5, 0xe3, 0xca, 0xd7, 0x8d, + 0x13, 0xd0, 0x50, 0x79, 0xd6, 0x5f, 0x3b, 0xca, 0xbc, 0xce, 0x33, 0x04, + 0x65, 0xa5, 0x68, 0xfe, 0x15, 0x78, 0xec, 0x9f, 0xb2, 0xac, 0xdd, 0x8e, + 0xad, 0xb0, 0x2f, 0x0b, 0xaa, 0x05, 0xf0, 0x77, 0xff, 0x41, 0x04, 0xd6, + 0x3a, 0x36, 0x1f, 0x86, 0xfd, 0xe1, 0x7f, 0xfe, 0x06, 0x9f, 0x4d, 0x82, + 0xb5, 0xaa, 0xb5, 0x74, 0x1f, 0x29, 0x72, 0x6f, 0xba, 0x03, 0x5f, 0x4f, + 0x60, 0x31, 0x1a, 0x04, 0xcf, 0xca, 0x02, 0x6e, 0x19, 0xb5, 0x7d, 0x09, + 0xeb, 0xd3, 0xcf, 0x73, 0xed, 0xb6, 0xba, 0x8e, 0x58, 0x09, 0x50, 0x4b, + 0xa5, 0xbb, 0x74, 0xbf, 0xe6, 0x61, 0x80, 0x58, 0xc3, 0xd8, 0x2c, 0xa7, + 0x83, 0x7f, 0xf2, 0xc5, 0xa1, 0x6d, 0xbf, 0xda, 0x2e, 0xc1, 0x61, 0xd3, + 0x53, 0xa5, 0xf5, 0x58, 0xd1, 0xf5, 0xd7, 0xe3, 0x73, 0x25, 0x98, 0x6b, + 0xf7, 0x85, 0xf7, 0xaf, 0xab, 0x6b, 0xe9, 0xf2, 0x8b, 0x75, 0x9a, 0x61, + 0xef, 0x90, 0x5c, 0x2a, 0x95, 0xf5, 0xd4, 0x2f, 0x77, 0xf1, 0x20, 0xc7, + 0x97, 0xe9, 0xf4, 0xcd, 0x51, 0x76, 0xd4, 0xaf, 0x30, 0x41, 0x83, 0x08, + 0x12, 0x10, 0xd7, 0x8f, 0xba, 0xa7, 0x49, 0xfe, 0x0a, 0x92, 0xd7, 0xd2, + 0x69, 0xb2, 0xfb, 0xb2, 0xa4, 0xed, 0xe5, 0xc6, 0x6f, 0xa4, 0xf9, 0x37, + 0xe5, 0xe9, 0xf0, 0x8b, 0x00, 0x94, 0xf8, 0x6b, 0x00, 0x7e, 0x00, 0xfc, + 0xed, 0xeb, 0xae, 0x63, 0xed, 0xda, 0xb5, 0x6a, 0xbb, 0xd3, 0xe1, 0x03, + 0x3a, 0x4d, 0x4b, 0xdb, 0x56, 0xf8, 0xeb, 0xab, 0xb2, 0x2e, 0x49, 0x0d, + 0xb3, 0x5f, 0x7e, 0xd4, 0x3d, 0x9d, 0x75, 0xba, 0x0e, 0xfb, 0xf7, 0xfd, + 0xd6, 0x98, 0x42, 0xc5, 0xba, 0x2e, 0xdf, 0xeb, 0xfb, 0x3c, 0xb6, 0x3e, + 0x0e, 0xfa, 0x7d, 0x54, 0xc7, 0xef, 0xd8, 0xbe, 0x93, 0xd9, 0x97, 0xa3, + 0xfe, 0x44, 0x4d, 0x6e, 0xd7, 0xd7, 0xa1, 0x06, 0xa8, 0x25, 0xa2, 0xbe, + 0x5d, 0x06, 0x16, 0x38, 0xcb, 0x0a, 0x37, 0xc0, 0x2d, 0x5b, 0x66, 0x3b, + 0x2b, 0x7c, 0x50, 0x9c, 0x70, 0x22, 0x48, 0xaf, 0xdd, 0x36, 0x59, 0xeb, + 0xf6, 0xb6, 0x5b, 0xec, 0x4f, 0x67, 0x6f, 0x0b, 0xa0, 0x50, 0x54, 0xc7, + 0x67, 0xcf, 0x1a, 0xe3, 0xc8, 0x1a, 0xbf, 0x49, 0xde, 0xe3, 0x08, 0x6d, + 0xbb, 0xe3, 0xb7, 0xef, 0xe2, 0xe0, 0xb3, 0x5f, 0xa5, 0xd9, 0x94, 0x54, + 0x5c, 0x17, 0xe1, 0xb8, 0xd4, 0x6b, 0x02, 0x29, 0x7d, 0xd5, 0x36, 0xa7, + 0x2b, 0x09, 0x3f, 0x51, 0xbb, 0xd9, 0xed, 0x68, 0xee, 0xcf, 0x4c, 0x7b, + 0x0f, 0x3a, 0x5f, 0xff, 0xa8, 0x7b, 0x9a, 0xf5, 0xd9, 0xd1, 0xef, 0x8a, + 0xbe, 0x66, 0xad, 0x8b, 0x93, 0xd7, 0xf0, 0x43, 0xde, 0x19, 0x9c, 0xe0, + 0x8f, 0x7f, 0x9a, 0x1a, 0xfc, 0xb7, 0x8a, 0xd7, 0x70, 0xa1, 0x9b, 0x48, + 0xfb, 0xca, 0x3b, 0xea, 0xcf, 0x52, 0xa5, 0xf4, 0x0b, 0xb4, 0x3a, 0x91, + 0x8f, 0x7e, 0x7c, 0xb8, 0x2e, 0x4b, 0xe9, 0x17, 0xf8, 0xa1, 0x65, 0x97, + 0xe6, 0x2b, 0x55, 0xda, 0x26, 0xb5, 0x3c, 0x09, 0xad, 0xf9, 0xc3, 0x9f, + 0x72, 0x27, 0x64, 0x8e, 0x16, 0x7c, 0x57, 0x2f, 0x83, 0xe2, 0x35, 0xfc, + 0xd7, 0x14, 0x5f, 0x7f, 0x35, 0xe0, 0xb8, 0x36, 0xf7, 0x5c, 0x49, 0xd0, + 0x93, 0xd9, 0xbe, 0x18, 0x20, 0xd6, 0xe5, 0x86, 0x69, 0xad, 0x54, 0xc9, + 0x31, 0xb2, 0x4a, 0xa0, 0x20, 0x10, 0xab, 0x43, 0x19, 0x5d, 0x5c, 0xde, + 0x69, 0xed, 0x7d, 0xb1, 0xed, 0xd5, 0x02, 0xde, 0x19, 0x74, 0xcf, 0xe5, + 0xf9, 0x70, 0x33, 0x34, 0xbf, 0x76, 0x80, 0xf1, 0x5b, 0xd5, 0xf5, 0x80, + 0xef, 0x08, 0xe4, 0xe6, 0x87, 0x29, 0xcc, 0x7f, 0x81, 0xe6, 0x47, 0x04, + 0xad, 0x85, 0x31, 0xc4, 0xab, 0xf3, 0x17, 0x59, 0x12, 0x70, 0xeb, 0x3b, + 0x58, 0x68, 0x1c, 0x64, 0xec, 0xbb, 0xd0, 0x5c, 0x23, 0x19, 0xbb, 0x71, + 0x8a, 0xc6, 0x89, 0xa3, 0x7d, 0x76, 0x76, 0x7f, 0x78, 0x31, 0xe3, 0x3c, + 0x7d, 0xba, 0x69, 0x56, 0xf5, 0xa1, 0x56, 0x3f, 0xb7, 0xab, 0xfe, 0x14, + 0x9f, 0xfc, 0xfa, 0x27, 0xd9, 0xb5, 0x71, 0xd7, 0x8a, 0x3f, 0x4c, 0x61, + 0xb4, 0x12, 0xa0, 0x16, 0x44, 0x30, 0x2d, 0x23, 0xef, 0x94, 0x6a, 0x5b, + 0x03, 0xd4, 0xea, 0x0d, 0xe1, 0x6e, 0xcb, 0x58, 0x9d, 0xe3, 0x0b, 0xfd, + 0xbf, 0xd2, 0xb6, 0x97, 0x7d, 0x07, 0xdb, 0x4a, 0x81, 0xf5, 0x87, 0x60, + 0x7b, 0x47, 0x9f, 0xa7, 0x83, 0x92, 0x1e, 0xff, 0xad, 0xa1, 0x00, 0xbd, + 0xd7, 0x2f, 0x53, 0x12, 0x41, 0xc9, 0x75, 0x91, 0x81, 0x4a, 0xdf, 0x31, + 0xcf, 0x55, 0x82, 0xac, 0x7b, 0x11, 0x81, 0x70, 0xfa, 0x27, 0xf8, 0x17, + 0x46, 0x5c, 0x5c, 0xed, 0xa3, 0xe0, 0xba, 0xb8, 0xb2, 0x86, 0x2f, 0x7b, + 0xc0, 0x84, 0x65, 0xe5, 0xe9, 0xa5, 0x2a, 0x93, 0x01, 0x68, 0x19, 0x98, + 0x84, 0x94, 0x02, 0x5f, 0x46, 0x57, 0x5e, 0xea, 0xba, 0x47, 0x20, 0x04, + 0x31, 0x08, 0x75, 0x4c, 0x41, 0x29, 0x82, 0x6b, 0x0d, 0x50, 0xc1, 0xad, + 0xe0, 0x4a, 0x1f, 0x3f, 0xe8, 0x84, 0xeb, 0x00, 0x3d, 0xdf, 0xc7, 0x15, + 0x35, 0x7c, 0x99, 0xd1, 0x63, 0x38, 0x1a, 0xac, 0x25, 0x2b, 0xe0, 0x34, + 0x74, 0xdb, 0x7a, 0x56, 0x5d, 0x14, 0xb4, 0xcc, 0x15, 0x65, 0xfc, 0xa5, + 0x06, 0xae, 0x06, 0x4e, 0xf8, 0x4b, 0x8d, 0x08, 0xac, 0x45, 0x2d, 0x6a, + 0xd7, 0xb0, 0xfd, 0xaa, 0x6a, 0x7f, 0x0e, 0xe8, 0xc3, 0xab, 0xd5, 0x58, + 0x36, 0x00, 0x54, 0x27, 0x15, 0x1c, 0x6a, 0x12, 0xb5, 0x0c, 0x61, 0x5a, + 0x09, 0x3b, 0x88, 0xa0, 0x54, 0xd3, 0xd3, 0x51, 0x7c, 0xb5, 0xaa, 0x81, + 0x5b, 0x7b, 0xa0, 0xba, 0xc7, 0x32, 0xf6, 0x22, 0xb0, 0x56, 0x98, 0x57, + 0x55, 0xc1, 0xa8, 0xa6, 0x27, 0xd5, 0xdd, 0xc2, 0x8c, 0xa7, 0x32, 0x9a, + 0xb4, 0x6c, 0x1e, 0x79, 0x05, 0x6e, 0x9b, 0xf3, 0xd8, 0x33, 0x0d, 0xbc, + 0x08, 0xb7, 0xde, 0xae, 0x33, 0x5a, 0xfc, 0x1d, 0x18, 0xdd, 0x06, 0xb7, + 0x3f, 0x15, 0x2f, 0xd4, 0xbf, 0x39, 0xac, 0xc2, 0x39, 0x8c, 0xe7, 0xc1, + 0xdd, 0x8f, 0x3c, 0xc5, 0xe2, 0xe1, 0xdf, 0x61, 0x94, 0x51, 0x0e, 0x7f, + 0xe3, 0x76, 0x46, 0x46, 0xa0, 0x8b, 0x07, 0x4b, 0x89, 0xba, 0x78, 0x70, + 0xf7, 0xed, 0xb7, 0xab, 0x8a, 0xeb, 0x7b, 0x97, 0xb9, 0x49, 0xb8, 0x15, + 0xf0, 0x3c, 0x8f, 0xb9, 0xb9, 0x2a, 0x7b, 0x0c, 0x25, 0x0c, 0x55, 0xe6, + 0xc9, 0x2a, 0xcc, 0x99, 0xba, 0xcc, 0x80, 0x37, 0xad, 0xc0, 0x57, 0x7b, + 0xf6, 0x78, 0x50, 0x8d, 0xea, 0x6a, 0xc0, 0x60, 0x00, 0x7b, 0x74, 0x9b, + 0xed, 0x99, 0xae, 0xc2, 0xa4, 0xc7, 0xcc, 0x8c, 0x5a, 0x37, 0x90, 0xac, + 0x39, 0xcf, 0x83, 0x19, 0x98, 0xab, 0x6a, 0x1b, 0x9d, 0x1e, 0x53, 0x8e, + 0x19, 0x60, 0x5a, 0x83, 0xc9, 0xd0, 0xc0, 0x2e, 0xbc, 0xa1, 0xc7, 0xcd, + 0x2e, 0x46, 0x52, 0xca, 0x38, 0x44, 0x6b, 0x50, 0xbf, 0x16, 0x48, 0x75, + 0x6c, 0x0d, 0xe1, 0x37, 0xf9, 0xdc, 0x31, 0x0c, 0xcf, 0x80, 0x4f, 0x0d, + 0xad, 0x41, 0x63, 0xf0, 0x36, 0x44, 0x2b, 0x71, 0xad, 0xef, 0x77, 0xad, + 0x8f, 0x07, 0x49, 0x5f, 0x95, 0xcd, 0x11, 0x31, 0x80, 0x96, 0x60, 0x30, + 0xc4, 0xd7, 0x56, 0x12, 0xbc, 0xd5, 0x57, 0x27, 0xbd, 0x39, 0x2c, 0x50, + 0x6b, 0xd0, 0xfe, 0x94, 0x27, 0x24, 0xf5, 0xaa, 0x80, 0xa2, 0xa4, 0x1e, + 0x08, 0x16, 0xa4, 0xe4, 0x21, 0x7d, 0x3d, 0xbf, 0x20, 0x25, 0x3b, 0x1d, + 0xc1, 0x42, 0x20, 0x19, 0x73, 0x44, 0xac, 0x7d, 0x16, 0x24, 0xec, 0x14, + 0x82, 0xf9, 0xc0, 0xa7, 0x1e, 0x40, 0x43, 0x40, 0xdd, 0x0c, 0x86, 0x42, + 0x78, 0x93, 0x32, 0x85, 0x60, 0x4c, 0xa8, 0xd1, 0xd1, 0x9a, 0x2e, 0x6f, + 0xaf, 0xdb, 0xa3, 0x0a, 0xb8, 0x01, 0x21, 0x2c, 0x66, 0x3c, 0x20, 0x7e, + 0x9f, 0x2f, 0xa1, 0x8e, 0xfa, 0x40, 0x53, 0x88, 0x98, 0x09, 0x08, 0xcb, + 0x69, 0xf6, 0x41, 0x18, 0xd7, 0x95, 0x48, 0x01, 0x32, 0x10, 0x8c, 0x07, + 0x30, 0x6f, 0xf6, 0x97, 0x80, 0x31, 0x09, 0xf3, 0xd0, 0xf7, 0xdc, 0xa4, + 0x20, 0x0a, 0xea, 0xdc, 0x18, 0xc0, 0x82, 0x23, 0x29, 0xe8, 0x34, 0xbd, + 0x3e, 0xb8, 0x96, 0xd9, 0x97, 0x84, 0x40, 0xb5, 0x82, 0x06, 0x84, 0xd9, + 0x3f, 0xc3, 0x5e, 0x78, 0x07, 0x2c, 0x63, 0x3e, 0x3a, 0x0e, 0x14, 0x74, + 0x58, 0x21, 0x90, 0xf4, 0x02, 0x28, 0x88, 0x52, 0xf8, 0xec, 0x50, 0x81, + 0x1c, 0x55, 0x19, 0xc3, 0x7b, 0x3b, 0x7d, 0x3c, 0x60, 0x01, 0x2c, 0x27, + 0x50, 0x80, 0x31, 0x5b, 0x3d, 0xeb, 0xda, 0xb2, 0xc4, 0xe0, 0xe7, 0x5c, + 0x6f, 0x9f, 0xf8, 0x1f, 0x6c, 0x78, 0xe7, 0x27, 0x9c, 0xbe, 0xe6, 0x97, + 0xaf, 0xe8, 0xf2, 0xd5, 0xb7, 0xfe, 0x67, 0xd6, 0x5e, 0xfb, 0x0a, 0x9c, + 0x3f, 0x19, 0x82, 0xa2, 0xd6, 0x5e, 0xb7, 0x86, 0xcd, 0x37, 0xdd, 0x0c, + 0x28, 0xd8, 0xd4, 0xba, 0x75, 0xeb, 0x42, 0x90, 0x94, 0xd1, 0xba, 0x75, + 0xeb, 0x38, 0xd1, 0x3a, 0x17, 0xc2, 0xaf, 0x4c, 0xdc, 0x9a, 0x8a, 0x1a, + 0x2b, 0x31, 0x80, 0x29, 0x03, 0xb6, 0xba, 0x1c, 0x3e, 0x01, 0xa6, 0xa6, + 0xa6, 0xc2, 0xf4, 0x06, 0x8c, 0x65, 0x83, 0xb4, 0x4c, 0x3a, 0x1b, 0xca, + 0x65, 0xc3, 0xbc, 0xc2, 0x78, 0x22, 0xa8, 0x97, 0x5d, 0x56, 0x23, 0x03, + 0xcf, 0x02, 0xc2, 0x76, 0x32, 0xfe, 0xcf, 0x9d, 0xbf, 0x10, 0xc2, 0xb7, + 0x8c, 0xcf, 0xb7, 0x4f, 0x5c, 0xc8, 0x7c, 0xec, 0xd8, 0xee, 0x02, 0xc5, + 0x7e, 0x28, 0x96, 0x2f, 0x25, 0xe5, 0x4b, 0x70, 0x0d, 0x2c, 0x1c, 0x11, + 0x7e, 0xec, 0x49, 0xb8, 0x82, 0xcf, 0x3d, 0xf0, 0x39, 0x7c, 0x5f, 0xd2, + 0xb9, 0xa1, 0x05, 0x52, 0x50, 0xdb, 0x5c, 0x89, 0x7f, 0x20, 0x2c, 0x80, + 0x5a, 0xb5, 0x36, 0xf0, 0x23, 0x40, 0xb2, 0x2b, 0x29, 0x55, 0x2b, 0xf4, + 0x96, 0x3a, 0xd4, 0x37, 0xd6, 0x34, 0x6c, 0x51, 0x52, 0x19, 0x51, 0xd7, + 0x77, 0x95, 0x0d, 0xe9, 0x20, 0x27, 0xbb, 0x92, 0x3b, 0xef, 0xbc, 0x97, + 0xc7, 0xff, 0x45, 0x3a, 0xcc, 0xdc, 0x56, 0xa6, 0x2f, 0x4b, 0x97, 0xd2, + 0xd7, 0x30, 0xba, 0xc3, 0x85, 0xe7, 0x97, 0xfa, 0xfb, 0xf4, 0xf9, 0x85, + 0xe3, 0x94, 0xba, 0xe9, 0xfb, 0xec, 0xe5, 0xef, 0x7f, 0x3f, 0xfc, 0x0d, + 0x24, 0x41, 0x52, 0x31, 0xdf, 0xff, 0x6b, 0xbd, 0x2f, 0xcc, 0x28, 0x0b, + 0xc6, 0x95, 0x16, 0x67, 0xb6, 0x0d, 0x54, 0xea, 0x07, 0xa7, 0x4e, 0xf3, + 0x81, 0x8d, 0x1b, 0x38, 0xd3, 0x8e, 0x06, 0x7c, 0xe7, 0xbf, 0xf3, 0x3d, + 0x20, 0x0e, 0xd8, 0xca, 0x2a, 0xcb, 0xf3, 0xff, 0xae, 0xc1, 0xc3, 0x7f, + 0x70, 0x2f, 0xad, 0xa5, 0x66, 0x98, 0xcf, 0xf3, 0xff, 0xae, 0x91, 0x9a, + 0x67, 0x72, 0xbb, 0xb5, 0x14, 0x6d, 0x27, 0x35, 0x71, 0xd3, 0x1d, 0xcb, + 0xe6, 0x6d, 0x97, 0xc1, 0x86, 0x78, 0x19, 0xf0, 0x96, 0xd9, 0x36, 0xfe, + 0x93, 0x6d, 0x24, 0x65, 0x8b, 0xda, 0xfa, 0x89, 0x81, 0x30, 0x2f, 0x23, + 0x03, 0xd4, 0x02, 0xd5, 0x66, 0x3f, 0xfe, 0x89, 0x4a, 0x63, 0xc3, 0xb4, + 0x7e, 0xfc, 0x93, 0x26, 0x27, 0xbe, 0xff, 0x43, 0xde, 0xc3, 0xdf, 0x4e, + 0x2d, 0x7b, 0xae, 0x5c, 0xb9, 0x72, 0xe5, 0xca, 0x95, 0x2b, 0x57, 0xae, + 0x5c, 0xb9, 0x72, 0xe5, 0xca, 0x95, 0x2b, 0x57, 0xae, 0x5c, 0xb9, 0x72, + 0xe5, 0xca, 0x95, 0x2b, 0x57, 0xae, 0x5c, 0xb9, 0x72, 0xe5, 0x5a, 0x5e, + 0x39, 0x54, 0x2b, 0x57, 0xae, 0x5c, 0xb9, 0x72, 0xe5, 0x7a, 0xb7, 0x74, + 0xa8, 0x04, 0x9f, 0xea, 0x20, 0x36, 0x8b, 0x08, 0xa8, 0x95, 0x04, 0xee, + 0xe8, 0x49, 0x89, 0x9d, 0x6e, 0x87, 0x12, 0x25, 0x10, 0x0a, 0xa4, 0x65, + 0x14, 0x03, 0x6a, 0x05, 0xef, 0x2e, 0xbe, 0xc0, 0xbc, 0xb8, 0xed, 0x77, + 0xfd, 0xa1, 0x01, 0x2f, 0xb1, 0xf4, 0x97, 0xe3, 0xab, 0xd1, 0xb6, 0xff, + 0x40, 0xae, 0xfa, 0xa5, 0xf9, 0x52, 0xb1, 0xa4, 0xbe, 0x60, 0x3f, 0x84, + 0xc4, 0x66, 0x5d, 0xf7, 0x43, 0xd1, 0x14, 0x47, 0xff, 0x75, 0x09, 0x93, + 0x50, 0x5e, 0xef, 0x62, 0xbe, 0xb5, 0x1a, 0x42, 0x5c, 0xa4, 0x54, 0x00, + 0x21, 0x03, 0xfc, 0x09, 0xec, 0x97, 0xe1, 0x41, 0x84, 0x33, 0x8d, 0xad, + 0x29, 0xc7, 0x52, 0x82, 0x93, 0x78, 0xfb, 0x7c, 0xc0, 0x67, 0x61, 0x5b, + 0x52, 0x83, 0xad, 0x2c, 0xf0, 0x8c, 0x9a, 0x28, 0x27, 0x69, 0x78, 0xea, + 0x45, 0xbf, 0x7f, 0xf0, 0xa5, 0xbd, 0x7c, 0xe3, 0x33, 0xf7, 0xc7, 0xd2, + 0x85, 0xe0, 0xad, 0xcd, 0x95, 0xd0, 0xce, 0xa4, 0xbd, 0xef, 0xb9, 0x03, + 0x3c, 0x0d, 0xdc, 0xf7, 0xa5, 0xfd, 0x0a, 0xb6, 0xe5, 0x8a, 0x10, 0xa8, + 0x55, 0x11, 0x82, 0xe7, 0x8f, 0xa9, 0xd7, 0xb7, 0xb7, 0xd4, 0xb7, 0x20, + 0x1c, 0x78, 0xfa, 0xce, 0x9d, 0xdc, 0xf7, 0xdc, 0xe0, 0x17, 0x4c, 0x0d, + 0x48, 0x49, 0x22, 0xe9, 0x05, 0x71, 0xf0, 0x52, 0x21, 0xeb, 0xcb, 0xe7, + 0x16, 0x10, 0x2b, 0xd9, 0x0e, 0x32, 0x79, 0xa5, 0xab, 0xa1, 0x60, 0x49, + 0x98, 0x57, 0xd8, 0x3e, 0xbe, 0x04, 0xa1, 0x27, 0x5d, 0x74, 0xa5, 0x02, + 0x6a, 0x25, 0xda, 0xd5, 0x86, 0x3d, 0x95, 0xd7, 0xab, 0x17, 0xd6, 0xfd, + 0xd7, 0xad, 0x7d, 0x63, 0x1d, 0xd7, 0xbc, 0x6a, 0x8a, 0xe4, 0x6b, 0xe8, + 0x54, 0xff, 0xb4, 0xf1, 0x64, 0x48, 0x27, 0x39, 0xe1, 0x42, 0xe7, 0xdf, + 0x71, 0xe2, 0x53, 0xd3, 0x6c, 0xbb, 0x8e, 0x03, 0xa5, 0x40, 0xbd, 0x20, + 0x1f, 0xc6, 0x05, 0xb6, 0x0f, 0x90, 0x41, 0x5b, 0x97, 0x25, 0x0e, 0xc0, + 0x1a, 0x4f, 0x81, 0x61, 0xcd, 0x0f, 0x31, 0x29, 0xc6, 0x4f, 0x99, 0x10, + 0x37, 0x94, 0x4d, 0x56, 0xba, 0x8c, 0x3c, 0xdb, 0x4b, 0xd9, 0x5f, 0x27, + 0x36, 0x5a, 0x2d, 0x6c, 0xcb, 0xb7, 0x7c, 0x67, 0x01, 0xb7, 0x7c, 0x5f, + 0xf9, 0x16, 0x9b, 0xf5, 0x24, 0xbf, 0x8c, 0xe3, 0x9a, 0xf6, 0xca, 0xfa, + 0x95, 0x70, 0xd2, 0xcb, 0x65, 0xbe, 0x1b, 0x4b, 0xfb, 0xb2, 0x7d, 0x4f, + 0x7f, 0xf5, 0x3c, 0x39, 0x49, 0x24, 0x0d, 0xb8, 0xd5, 0x38, 0x71, 0xe9, + 0xa6, 0xf3, 0xfa, 0x29, 0x2f, 0x7c, 0xbf, 0x9b, 0xf6, 0x59, 0x69, 0xca, + 0xd5, 0xfe, 0xe3, 0xfa, 0xad, 0xd7, 0xbb, 0xd4, 0xff, 0xfe, 0x7b, 0xd9, + 0xb0, 0xbe, 0x08, 0x9e, 0xcf, 0x29, 0x56, 0x07, 0xce, 0xba, 0x14, 0x30, + 0x2d, 0x5b, 0xa7, 0xac, 0xf5, 0x24, 0x60, 0x6b, 0x74, 0xe3, 0x46, 0x16, + 0x4f, 0x9d, 0x8a, 0x6d, 0x67, 0xe9, 0x70, 0xb8, 0x3c, 0x3c, 0x14, 0xc8, + 0x2a, 0x02, 0x62, 0xad, 0x0c, 0x79, 0x95, 0x06, 0xd2, 0x5a, 0xce, 0xde, + 0x5e, 0xcf, 0xae, 0xc1, 0xea, 0xb4, 0x61, 0xbd, 0xea, 0x00, 0xdf, 0x7a, + 0xbd, 0x0b, 0xbc, 0x07, 0x00, 0xbf, 0x5b, 0x02, 0x3a, 0x94, 0x8b, 0x80, + 0x0f, 0x65, 0x07, 0x78, 0xec, 0xa3, 0xdc, 0xfb, 0xfb, 0xdf, 0xc6, 0xfb, + 0xdc, 0x47, 0x01, 0xf8, 0x4f, 0x47, 0xff, 0x13, 0xde, 0xe7, 0xfe, 0x97, + 0xa1, 0xf2, 0x18, 0xe6, 0x08, 0xb2, 0xe7, 0x93, 0xd9, 0x5a, 0x0d, 0x50, + 0x2b, 0x09, 0xce, 0xda, 0x05, 0xec, 0x4f, 0xb5, 0x5c, 0x81, 0xcf, 0x94, + 0xb0, 0xa9, 0x6d, 0x3b, 0x98, 0x3d, 0x6c, 0x81, 0x48, 0x58, 0x35, 0xff, + 0xf3, 0x8a, 0xa8, 0xac, 0xcf, 0x75, 0x7e, 0xb7, 0x04, 0xc2, 0x8f, 0xd6, + 0x91, 0x94, 0x5d, 0x11, 0x9b, 0xe5, 0xdc, 0x9b, 0x9c, 0x22, 0x44, 0x8d, + 0xb6, 0x9b, 0xc9, 0xb9, 0xc0, 0x4a, 0xdb, 0x76, 0xb0, 0x03, 0xd4, 0x64, + 0xc1, 0xf6, 0x02, 0x8c, 0xd4, 0xe0, 0xd5, 0x94, 0x09, 0xd1, 0xbf, 0xb1, + 0x53, 0x4d, 0xfe, 0x7b, 0xbd, 0x03, 0x4b, 0x8d, 0xf0, 0xf7, 0xd0, 0xf8, + 0x6e, 0x43, 0xd1, 0xc7, 0xc6, 0x27, 0x10, 0xe5, 0x32, 0x58, 0xf7, 0x01, + 0x62, 0x03, 0x70, 0x5a, 0xb5, 0xe6, 0xd3, 0x8f, 0xaa, 0xdc, 0x6b, 0x5b, + 0x5d, 0x5c, 0x17, 0xd4, 0xd4, 0x38, 0x0b, 0xf0, 0xf6, 0xcf, 0x7e, 0x95, + 0xe6, 0xb7, 0x7e, 0x95, 0x3f, 0xfb, 0x97, 0x50, 0xfb, 0x75, 0x7b, 0x4f, + 0xfd, 0x79, 0xac, 0x18, 0x7b, 0xff, 0xd9, 0xaf, 0xb2, 0xef, 0xf7, 0xfa, + 0x27, 0x8b, 0x34, 0xfc, 0x6a, 0xb8, 0xfe, 0xc9, 0xdf, 0x4b, 0xab, 0x68, + 0x42, 0x7f, 0xf7, 0x1f, 0xf4, 0x05, 0x7d, 0xd6, 0x84, 0xfd, 0xf1, 0xc3, + 0x60, 0x20, 0xad, 0x47, 0x8e, 0xc0, 0x4d, 0xa5, 0xf4, 0x36, 0xb9, 0xcc, + 0x2a, 0xeb, 0x6b, 0x3d, 0xbf, 0x5b, 0x82, 0xa2, 0xde, 0xd7, 0xe6, 0x7c, + 0x5d, 0x2e, 0x23, 0x96, 0x24, 0x32, 0xf0, 0x11, 0x8e, 0x06, 0xba, 0xac, + 0x60, 0x5d, 0x06, 0x3e, 0x42, 0xa8, 0xeb, 0x01, 0x29, 0xdb, 0x08, 0x51, + 0x0e, 0x97, 0xc9, 0x30, 0xe0, 0xa2, 0xd6, 0xdd, 0x62, 0xb9, 0xef, 0x3a, + 0xca, 0x0e, 0x5b, 0x6e, 0x5d, 0x16, 0x3b, 0xf8, 0xdd, 0x36, 0x6e, 0xb1, + 0xac, 0xdb, 0xa3, 0x4d, 0x19, 0xd8, 0xe2, 0x8e, 0x6b, 0x67, 0xfa, 0x7a, + 0xc6, 0xba, 0xaf, 0x3c, 0xee, 0xcf, 0xc3, 0xfa, 0x1d, 0x6a, 0xc3, 0x5c, + 0x1f, 0xda, 0xd7, 0x67, 0x67, 0x0e, 0x52, 0x2f, 0x8e, 0x87, 0x9b, 0x85, + 0x11, 0x0d, 0xe6, 0x59, 0x8a, 0x7c, 0x34, 0xba, 0x96, 0x0f, 0x55, 0x29, + 0x74, 0xe3, 0x84, 0x3e, 0x2a, 0xc5, 0x68, 0x82, 0x92, 0xeb, 0xea, 0xf2, + 0xe9, 0xeb, 0xad, 0x56, 0xb7, 0x81, 0x74, 0xc7, 0xa2, 0xe4, 0x7a, 0xfe, + 0xb6, 0xb4, 0x26, 0xa7, 0x0b, 0x7f, 0x81, 0x4a, 0xb1, 0x4e, 0xd9, 0xd4, + 0xcd, 0x3a, 0x5f, 0x7f, 0xaf, 0xfb, 0x16, 0x53, 0xef, 0xad, 0xf3, 0xfe, + 0xe2, 0x06, 0xde, 0xf2, 0xa3, 0x6b, 0xec, 0x95, 0xf4, 0x4f, 0x97, 0xba, + 0x3f, 0x1b, 0x06, 0x1a, 0x35, 0x48, 0x02, 0x05, 0xd3, 0xea, 0xf0, 0x8b, + 0x21, 0x5c, 0xab, 0x00, 0x1c, 0xfc, 0xe1, 0x0f, 0xd9, 0xa1, 0x97, 0x37, + 0xf1, 0x8b, 0x71, 0x28, 0x8b, 0x86, 0x6f, 0x5d, 0x8d, 0x75, 0xb1, 0x7d, + 0x0c, 0x5b, 0xb6, 0xf7, 0x17, 0x37, 0x00, 0x6a, 0xff, 0xea, 0xd3, 0x75, + 0xec, 0x7c, 0x3d, 0xd6, 0x68, 0xd2, 0x6a, 0x4b, 0xfc, 0x45, 0x75, 0x6d, + 0x3f, 0xbf, 0x6d, 0x8a, 0x83, 0x87, 0xa1, 0x3a, 0xda, 0x82, 0x8f, 0x97, + 0xd8, 0xf7, 0x65, 0xd5, 0xfb, 0x36, 0x4e, 0x54, 0xd8, 0xf9, 0xa9, 0x06, + 0x53, 0x17, 0x24, 0x47, 0x0f, 0x77, 0x98, 0xfd, 0x54, 0x7c, 0x62, 0x5d, + 0xf2, 0x7e, 0x20, 0x06, 0xce, 0x72, 0xd2, 0xa1, 0xbf, 0x69, 0x90, 0xe7, + 0x95, 0x4a, 0x08, 0x81, 0xdf, 0x95, 0x21, 0x10, 0xeb, 0x4a, 0x68, 0xe7, + 0x27, 0x76, 0xf0, 0xd5, 0x3f, 0xf9, 0x6a, 0xac, 0x0c, 0x49, 0x90, 0x8c, + 0x94, 0x32, 0x1d, 0x44, 0x20, 0x04, 0xb3, 0x7f, 0xf2, 0x55, 0xe4, 0x05, + 0x41, 0x65, 0x03, 0xf8, 0x52, 0x20, 0x34, 0x38, 0xbc, 0xf3, 0x96, 0xc0, + 0xd7, 0xf7, 0x9d, 0x15, 0xe2, 0x30, 0xb3, 0xb4, 0x36, 0x4c, 0xc2, 0xb5, + 0x62, 0xe7, 0x6b, 0xdd, 0x87, 0xdb, 0xc7, 0xf5, 0x4f, 0xaf, 0x26, 0x62, + 0xe7, 0xcf, 0xb9, 0xb6, 0x76, 0xdf, 0xe1, 0x24, 0xf0, 0x5f, 0x81, 0xbf, + 0x05, 0xbc, 0x57, 0x87, 0xff, 0x78, 0xc8, 0xf4, 0x69, 0xc7, 0xb5, 0x7d, + 0xcf, 0xa5, 0xe0, 0x3c, 0x97, 0x06, 0xec, 0x74, 0x35, 0xcb, 0xd4, 0xad, + 0xe6, 0xc0, 0x7c, 0x00, 0x5b, 0x8a, 0x28, 0xd8, 0x83, 0x54, 0x58, 0xa1, + 0x2b, 0x91, 0x77, 0x32, 0xec, 0x52, 0xb7, 0x77, 0xea, 0x3d, 0x97, 0xb9, + 0x36, 0xab, 0xba, 0xcc, 0xff, 0x55, 0x47, 0x01, 0xb5, 0x74, 0x7f, 0x2a, + 0x9f, 0xdb, 0x4f, 0xe3, 0xf7, 0x8f, 0xc2, 0x47, 0x04, 0xb5, 0x79, 0x89, + 0xd8, 0xda, 0x84, 0xf1, 0x32, 0x07, 0x3f, 0xe7, 0x21, 0xdd, 0x59, 0x00, + 0xea, 0x55, 0x41, 0xc3, 0x8b, 0xfa, 0xa7, 0xba, 0xaf, 0x40, 0x06, 0xe2, + 0xd6, 0xa3, 0x2c, 0xbc, 0x21, 0x19, 0xfb, 0x90, 0xea, 0x4f, 0x17, 0xde, + 0x88, 0xf7, 0x61, 0x63, 0x9f, 0x76, 0x39, 0xf8, 0x86, 0x04, 0x66, 0x11, + 0xc5, 0xa3, 0x2c, 0x88, 0xc8, 0xd6, 0xd8, 0x8f, 0xdd, 0x24, 0x58, 0x78, + 0x43, 0x52, 0xf7, 0xa7, 0xfa, 0xfa, 0xc0, 0x4c, 0xc8, 0xd6, 0x4d, 0xb3, + 0x2a, 0xaf, 0x2f, 0xe9, 0x6b, 0xb7, 0xcf, 0x94, 0x19, 0x93, 0xd1, 0xf5, + 0xd0, 0x82, 0x38, 0x18, 0xc2, 0x72, 0x01, 0x1a, 0xaf, 0x1b, 0x90, 0xf8, + 0x6e, 0xfe, 0xec, 0x7f, 0xff, 0x33, 0x3e, 0xf9, 0x7f, 0x7c, 0x12, 0x80, + 0x5d, 0x1b, 0x77, 0x45, 0x69, 0x9e, 0x55, 0xa0, 0xd3, 0xb1, 0xdf, 0xbe, + 0x27, 0x73, 0xbc, 0x7c, 0xb9, 0xf1, 0xed, 0x24, 0x40, 0xcb, 0xc8, 0x06, + 0x67, 0x15, 0x12, 0x55, 0x2a, 0x88, 0x6c, 0xb0, 0x96, 0xd4, 0xe3, 0xb4, + 0x47, 0x8f, 0x1d, 0x8f, 0x85, 0x0b, 0xa7, 0x80, 0x0c, 0x7a, 0xa9, 0x63, + 0x29, 0xc7, 0xbb, 0x3e, 0x3b, 0x5c, 0xa8, 0x14, 0xcb, 0xf8, 0xa9, 0x7d, + 0xb8, 0x0f, 0x81, 0x39, 0x1f, 0xd7, 0x80, 0x68, 0x9c, 0x4e, 0xb8, 0x2e, + 0xed, 0x33, 0xfd, 0xe0, 0xb3, 0x98, 0x92, 0xe7, 0x61, 0xa7, 0x03, 0x41, + 0x34, 0xf6, 0x5c, 0x1a, 0x29, 0xd3, 0x38, 0x73, 0x54, 0xdd, 0x67, 0x59, + 0xf6, 0x5b, 0x9d, 0xad, 0x1c, 0x09, 0x6c, 0x52, 0x76, 0x21, 0xb1, 0x9c, + 0x50, 0x20, 0x2a, 0x88, 0x01, 0x7e, 0x5c, 0x7d, 0xde, 0xd2, 0xdf, 0x6c, + 0x88, 0x29, 0x84, 0xe5, 0x04, 0x84, 0x10, 0x09, 0x10, 0xf8, 0x03, 0x76, + 0x93, 0xeb, 0x6c, 0xb1, 0x3d, 0xa0, 0x46, 0x10, 0xca, 0x14, 0xdc, 0x0a, + 0xde, 0x99, 0xd9, 0xec, 0x84, 0x2b, 0xd2, 0x7e, 0x08, 0x76, 0x25, 0xc0, + 0x5a, 0x4a, 0xbe, 0x6c, 0xab, 0x36, 0x5b, 0x92, 0xb4, 0x97, 0x9a, 0x88, + 0x91, 0x1a, 0x72, 0xa9, 0x19, 0x8d, 0xc5, 0x3a, 0xba, 0x27, 0x8a, 0xc1, + 0xbf, 0xb6, 0x50, 0xd1, 0xd7, 0xe1, 0xc7, 0xbb, 0x7e, 0x78, 0xdf, 0x60, + 0xf7, 0xe1, 0x9d, 0xaa, 0x8f, 0x37, 0xa7, 0x40, 0x5a, 0x78, 0x0a, 0x12, + 0x55, 0xad, 0xc2, 0x64, 0xb5, 0xca, 0x1c, 0x1e, 0x9e, 0xa7, 0xe0, 0x51, + 0x36, 0x50, 0x6b, 0x0e, 0x14, 0xe0, 0xca, 0xd2, 0x9e, 0x39, 0xb5, 0xac, + 0xa2, 0x7c, 0xa8, 0x40, 0xf0, 0x66, 0xd4, 0xea, 0xf4, 0x64, 0x95, 0x19, + 0x3c, 0xbc, 0x39, 0xcb, 0xb6, 0xaa, 0xa1, 0x54, 0x9e, 0xf2, 0x3f, 0x33, + 0xa7, 0xc2, 0xa6, 0x27, 0xa3, 0x9a, 0xdf, 0xfd, 0xa7, 0x6a, 0xe4, 0xeb, + 0x25, 0x01, 0x5f, 0xf0, 0xe0, 0xd6, 0xdb, 0xad, 0x4c, 0x7f, 0x67, 0x11, + 0x48, 0x00, 0xb5, 0xac, 0xf0, 0xdb, 0xf4, 0xfe, 0x7c, 0xe4, 0x91, 0xc3, + 0x8c, 0x6e, 0xfb, 0x37, 0x1c, 0x3e, 0xac, 0x12, 0x6f, 0x5b, 0x1c, 0xe5, + 0xf0, 0xe8, 0x22, 0x77, 0xdf, 0x32, 0xca, 0xdd, 0x7f, 0xaa, 0x46, 0xb3, + 0x5e, 0xfe, 0x2d, 0xb8, 0xf5, 0x4f, 0x95, 0xfd, 0x4b, 0x2e, 0x7c, 0x45, + 0x97, 0xe0, 0x11, 0x7d, 0x89, 0xf9, 0x88, 0x0b, 0x4c, 0x7a, 0x3c, 0xf2, + 0x1b, 0x30, 0xfa, 0x3b, 0xf1, 0xec, 0x3c, 0x0f, 0x66, 0xf6, 0xc0, 0xcc, + 0x74, 0x95, 0x99, 0x39, 0x0f, 0xa6, 0x3d, 0xa6, 0xf7, 0xa8, 0x3a, 0xd8, + 0x10, 0x31, 0x4f, 0x37, 0x62, 0xb8, 0x8d, 0xc7, 0xdc, 0x9c, 0xda, 0x36, + 0x40, 0xad, 0x2a, 0x55, 0xa8, 0xea, 0xf4, 0x9e, 0x86, 0x93, 0x11, 0x07, + 0x9b, 0x4d, 0xef, 0xb1, 0x33, 0x37, 0x36, 0x55, 0x36, 0xac, 0x57, 0x07, + 0x6e, 0xe6, 0xb8, 0xd9, 0x45, 0x6a, 0x35, 0xcf, 0x03, 0x85, 0xa3, 0xc7, + 0xbb, 0x97, 0x79, 0xfe, 0x68, 0x7b, 0x0e, 0x9f, 0x09, 0x0a, 0xa1, 0xc2, + 0x53, 0xae, 0xeb, 0x87, 0x52, 0x56, 0x9e, 0x36, 0x38, 0x37, 0x23, 0xa9, + 0xb9, 0x16, 0xee, 0xbb, 0x7f, 0x70, 0x96, 0xff, 0x40, 0xd1, 0xe5, 0x7e, + 0x6e, 0x0a, 0xe9, 0xe3, 0x66, 0xf6, 0x73, 0xae, 0xdd, 0x01, 0x80, 0x02, + 0x55, 0x49, 0x01, 0x02, 0xf5, 0x4c, 0xf3, 0x7e, 0x14, 0x58, 0x0b, 0xe0, + 0x51, 0xab, 0x9c, 0x65, 0x14, 0xe0, 0x69, 0xaf, 0x94, 0xdc, 0x2f, 0x5c, + 0x1e, 0x16, 0x3e, 0x77, 0x00, 0xcf, 0x00, 0xad, 0x00, 0x7c, 0xfb, 0xde, + 0xc7, 0x01, 0x21, 0x25, 0x63, 0xc0, 0xbc, 0x10, 0x54, 0x64, 0x47, 0x9d, + 0x0d, 0xac, 0xe7, 0x14, 0x63, 0x02, 0x44, 0xd1, 0x05, 0x07, 0x2a, 0xbe, + 0x4f, 0xb3, 0x28, 0x68, 0x2d, 0x49, 0x4a, 0xae, 0x4b, 0x59, 0x4a, 0x16, + 0x34, 0xc4, 0x50, 0x3a, 0x22, 0x2c, 0xa7, 0x91, 0x79, 0x2e, 0x4c, 0x51, + 0x68, 0x10, 0x95, 0x02, 0x6a, 0x8d, 0xeb, 0xdf, 0xc1, 0xbc, 0x23, 0x58, + 0x28, 0x12, 0x7e, 0xc8, 0xc7, 0x56, 0x8f, 0xe8, 0x39, 0x4a, 0xd6, 0xf9, + 0xb1, 0xe0, 0x48, 0xea, 0x52, 0x8d, 0xd8, 0x15, 0x02, 0xe8, 0x04, 0xa8, + 0xdf, 0x98, 0x06, 0x6c, 0x09, 0x47, 0x9d, 0x17, 0x65, 0xa0, 0x3e, 0x7a, + 0x20, 0x88, 0x3f, 0xca, 0xad, 0x48, 0x75, 0xfd, 0x35, 0x56, 0x16, 0x1c, + 0x6d, 0x47, 0xc0, 0xae, 0x1e, 0x3d, 0x0a, 0x14, 0xd4, 0x3d, 0xd4, 0x80, + 0x9f, 0xbb, 0x94, 0x92, 0x29, 0x21, 0x38, 0x4a, 0x3f, 0x50, 0xcb, 0x40, + 0xb6, 0x3a, 0xba, 0x9d, 0x7b, 0xa4, 0x3f, 0xbf, 0xe6, 0x9b, 0x25, 0xf8, + 0xcd, 0x0e, 0xd7, 0x6e, 0xfe, 0x15, 0xf8, 0xcb, 0xec, 0xbc, 0x2e, 0xa7, + 0x6c, 0xb0, 0x95, 0x01, 0x50, 0xd9, 0x10, 0xa9, 0x13, 0x1a, 0x34, 0x75, + 0xee, 0xfc, 0x05, 0x36, 0xe9, 0x4b, 0x87, 0x24, 0x10, 0x0b, 0x14, 0xfc, + 0x6a, 0xdd, 0xba, 0x75, 0x9c, 0x3d, 0x7b, 0x36, 0x84, 0x4b, 0xd9, 0xba, + 0xdc, 0x3e, 0x93, 0x3a, 0x77, 0xfe, 0x02, 0x53, 0x53, 0x53, 0xac, 0xd1, + 0x10, 0x2e, 0x03, 0xd4, 0x5a, 0x53, 0x59, 0xcb, 0xd4, 0x4d, 0xeb, 0x42, + 0x08, 0x97, 0xed, 0xd7, 0xd8, 0xcc, 0xce, 0xce, 0xf6, 0xb5, 0xcd, 0x85, + 0x96, 0x02, 0x6f, 0xd9, 0x40, 0xad, 0x35, 0x95, 0xb5, 0x21, 0x50, 0x6b, + 0x6a, 0x6a, 0x2a, 0xf4, 0x79, 0xed, 0xe6, 0x5f, 0x51, 0x89, 0xbe, 0x69, + 0x3d, 0xd3, 0xb4, 0xfa, 0x70, 0x21, 0xa0, 0x34, 0x52, 0x09, 0xe1, 0xfe, + 0x42, 0x08, 0x5c, 0x21, 0xc2, 0x21, 0xbc, 0xce, 0x52, 0xfa, 0x9d, 0x41, + 0xdb, 0xf7, 0xa9, 0x96, 0xe3, 0x4f, 0x0c, 0xc6, 0x3e, 0x54, 0xa7, 0xb1, + 0x68, 0x3d, 0x6f, 0x2d, 0x0a, 0x3e, 0xf7, 0xc0, 0x43, 0x08, 0xa7, 0x84, + 0x0c, 0x3a, 0x34, 0xce, 0xb4, 0x70, 0xdd, 0x92, 0x3a, 0x46, 0x75, 0x7f, + 0xa3, 0xc6, 0x15, 0xd5, 0x35, 0x86, 0x01, 0x66, 0xc9, 0x6e, 0x2b, 0x04, + 0x67, 0x85, 0xbe, 0x0c, 0x78, 0xab, 0x28, 0xe8, 0x2d, 0x75, 0x12, 0xe0, + 0x2d, 0x37, 0x7c, 0xe7, 0xa1, 0x75, 0x5a, 0x95, 0x77, 0xdf, 0xcb, 0x1e, + 0x4f, 0x7d, 0x5a, 0x5d, 0x8b, 0x37, 0xbd, 0x12, 0xb5, 0x6a, 0x87, 0x23, + 0x67, 0x94, 0xf5, 0xed, 0xf7, 0x3f, 0xca, 0xd6, 0xf5, 0x63, 0xa4, 0xe9, + 0xc8, 0x99, 0x05, 0xee, 0xa0, 0x12, 0xf3, 0x05, 0xf4, 0xf9, 0xf2, 0x5e, + 0x9b, 0xbf, 0x28, 0x5f, 0xc7, 0x1b, 0x6f, 0xb2, 0x75, 0xfd, 0x58, 0xe4, + 0x6b, 0x99, 0xf3, 0x99, 0xed, 0xeb, 0xa1, 0xc9, 0x71, 0xbe, 0xf8, 0x42, + 0x04, 0x1c, 0x16, 0x25, 0xa8, 0x39, 0x25, 0xca, 0x45, 0xd5, 0x57, 0xa9, + 0xb1, 0x94, 0x6e, 0x78, 0x4c, 0xdf, 0xfa, 0xc1, 0x0f, 0xf2, 0xda, 0x7f, + 0xfb, 0xcb, 0x4c, 0x28, 0x56, 0xe8, 0x27, 0x05, 0x0c, 0x25, 0x44, 0x85, + 0xca, 0x48, 0x8d, 0xd6, 0x52, 0x33, 0x13, 0xac, 0x65, 0x00, 0x5a, 0x52, + 0xb6, 0x62, 0xf1, 0x52, 0xb6, 0xe0, 0x3d, 0x63, 0x7c, 0x60, 0xa3, 0xba, + 0xef, 0x5f, 0x5f, 0x1e, 0xe5, 0x4c, 0x7b, 0x91, 0xf9, 0xef, 0x7c, 0x8f, + 0xf1, 0x5f, 0xfb, 0x30, 0xf3, 0xdf, 0xf9, 0x1e, 0xf3, 0xdf, 0xf9, 0x5e, + 0x08, 0xdb, 0xfa, 0xc1, 0xa9, 0xd3, 0x7d, 0xe5, 0x91, 0xb2, 0x15, 0x83, + 0x59, 0xd9, 0x61, 0xc9, 0x32, 0x00, 0xd4, 0xd6, 0x4f, 0xd0, 0xb4, 0xee, + 0x1d, 0x2a, 0x23, 0x35, 0x9a, 0x67, 0x5a, 0x7d, 0xf5, 0x32, 0xeb, 0x69, + 0x70, 0x31, 0x3b, 0x1f, 0x23, 0x93, 0x9f, 0x69, 0x23, 0x03, 0xde, 0x32, + 0xc0, 0xac, 0xac, 0x76, 0x01, 0x62, 0xe5, 0x19, 0x04, 0x35, 0xb3, 0x75, + 0xfa, 0xc2, 0xcb, 0x5c, 0x77, 0xed, 0x3a, 0xce, 0xbf, 0x7d, 0x96, 0xeb, + 0xae, 0x5d, 0x17, 0x03, 0x6c, 0xdd, 0xfa, 0xab, 0x1f, 0x64, 0x81, 0xb7, + 0x63, 0xc7, 0x74, 0xae, 0x5c, 0xb9, 0x72, 0xe5, 0xca, 0x95, 0x2b, 0x57, + 0xae, 0x5c, 0xb9, 0x72, 0xe5, 0xca, 0x95, 0x2b, 0x57, 0xae, 0x5c, 0xb9, + 0x72, 0xe5, 0xca, 0x95, 0x2b, 0x57, 0xae, 0x5c, 0xb9, 0x72, 0xe5, 0x1a, + 0x5e, 0x39, 0x54, 0x2b, 0x57, 0xae, 0x5c, 0xb9, 0x72, 0xe5, 0xba, 0x0a, + 0x24, 0xbb, 0xbd, 0xf0, 0x25, 0xdb, 0x9e, 0x9e, 0x6d, 0x11, 0x4e, 0xea, + 0xd4, 0xef, 0xd3, 0x75, 0xba, 0x1d, 0xf5, 0xc6, 0xb2, 0x96, 0x0d, 0xd4, + 0xaa, 0x57, 0x4b, 0x34, 0x17, 0x87, 0x9f, 0x61, 0x38, 0x08, 0x2e, 0xb5, + 0x1a, 0xf0, 0x54, 0xf2, 0x0b, 0xca, 0xe1, 0x8b, 0xca, 0x03, 0x24, 0x83, + 0xe8, 0xbb, 0xd2, 0xc9, 0xfc, 0x86, 0xfd, 0x22, 0x73, 0x96, 0x92, 0x75, + 0x30, 0xdb, 0x69, 0xf5, 0x1a, 0xa6, 0xbe, 0x9d, 0xee, 0x70, 0x50, 0x00, + 0xbf, 0xeb, 0x23, 0x96, 0xc1, 0x60, 0x88, 0xc4, 0x64, 0x59, 0x19, 0xa0, + 0x00, 0x59, 0x36, 0x4c, 0x0b, 0xa9, 0x5e, 0xb0, 0x37, 0x61, 0xe6, 0xcb, + 0xd2, 0x76, 0x39, 0xb3, 0x5e, 0xc4, 0xb7, 0x7d, 0x20, 0xc0, 0x91, 0x94, + 0x28, 0x21, 0xf5, 0x8b, 0xee, 0xa2, 0xab, 0xd2, 0xb4, 0x84, 0x08, 0x81, + 0x59, 0xf7, 0x3d, 0x77, 0x80, 0x92, 0x53, 0x0a, 0xa1, 0x58, 0xb5, 0xa2, + 0x40, 0x04, 0x50, 0x1f, 0xfd, 0xff, 0xd9, 0x7b, 0xff, 0x20, 0x37, 0x8e, + 0xf3, 0xce, 0xfb, 0xa3, 0x78, 0x2c, 0x37, 0x12, 0xd0, 0x1e, 0xc4, 0xab, + 0x0b, 0x20, 0x51, 0xf5, 0x02, 0xc9, 0x32, 0x24, 0x68, 0xd3, 0x11, 0x68, + 0xea, 0xca, 0xbb, 0x96, 0xdf, 0x2c, 0x37, 0xb2, 0x43, 0xae, 0xa2, 0x2b, + 0x89, 0x8a, 0xde, 0x2a, 0x51, 0xf1, 0x7b, 0xb4, 0x28, 0xd7, 0xc5, 0x91, + 0x1c, 0xc7, 0x96, 0x5c, 0xae, 0x9c, 0xe5, 0x1c, 0xaf, 0x64, 0x9f, 0xcb, + 0x67, 0xca, 0x8e, 0x63, 0xc9, 0x72, 0x4a, 0x3f, 0xcc, 0xd4, 0x59, 0x54, + 0xbd, 0xaf, 0x4f, 0xb4, 0xae, 0x6c, 0xed, 0x32, 0xb1, 0x6e, 0xc9, 0x44, + 0xba, 0x5d, 0x5d, 0x24, 0x2d, 0x94, 0x90, 0x26, 0x48, 0xef, 0xc6, 0xc0, + 0x1b, 0x2d, 0x09, 0x5c, 0xb4, 0x0e, 0xc6, 0x26, 0xae, 0xd0, 0x51, 0xc6, + 0xd1, 0xfb, 0x47, 0x77, 0xcf, 0xf4, 0x0c, 0x06, 0x58, 0x2c, 0x49, 0xfd, + 0xb8, 0xcb, 0x7c, 0x59, 0xcb, 0xe9, 0xe9, 0xe9, 0x7e, 0xba, 0xa7, 0x07, + 0x33, 0xd3, 0xd3, 0x33, 0xcf, 0xa7, 0x0b, 0xd4, 0x4e, 0x36, 0x03, 0xa0, + 0xd6, 0x83, 0x37, 0xed, 0x62, 0xf3, 0x27, 0xee, 0x04, 0x60, 0xef, 0xb5, + 0xd7, 0xf0, 0x99, 0x47, 0x0f, 0x51, 0x70, 0x05, 0x4d, 0xe3, 0x21, 0xa4, + 0xeb, 0x52, 0xd3, 0xc7, 0xef, 0xc4, 0x97, 0xf6, 0xab, 0xfa, 0x49, 0x0d, + 0xe8, 0x02, 0x1e, 0xfc, 0x50, 0xe8, 0x24, 0x66, 0xca, 0x93, 0x3e, 0xb4, + 0xfd, 0xe4, 0x36, 0xce, 0x39, 0xb9, 0x60, 0x7f, 0x5c, 0xf3, 0x9b, 0x32, + 0xd0, 0x2c, 0xfb, 0xe3, 0x59, 0x2b, 0x2c, 0x92, 0x1c, 0x0d, 0xa4, 0xfe, + 0x2f, 0xc1, 0x09, 0xce, 0x94, 0x51, 0x70, 0x05, 0xf5, 0x8e, 0x44, 0x78, + 0x92, 0x92, 0x09, 0x3b, 0x04, 0x5f, 0xb9, 0x9b, 0x74, 0x95, 0xd1, 0x02, + 0xf3, 0x4b, 0x12, 0x86, 0x00, 0xd9, 0xd5, 0xa5, 0xa4, 0xec, 0x58, 0xc7, + 0x31, 0xc1, 0xe1, 0xc4, 0xd3, 0xb3, 0x57, 0x27, 0x39, 0x53, 0xbb, 0x42, + 0x60, 0x5a, 0x46, 0xea, 0x74, 0x03, 0xf8, 0x69, 0x81, 0x6c, 0xe8, 0x96, + 0x88, 0x41, 0xb6, 0xfa, 0xc9, 0xeb, 0x48, 0x6a, 0x03, 0xbe, 0xd0, 0xb7, + 0xc1, 0x0c, 0xc3, 0xc8, 0x4e, 0x5f, 0xbe, 0xa2, 0x4c, 0xf5, 0x85, 0x2a, + 0x00, 0x95, 0x2b, 0x2a, 0x03, 0xc3, 0x95, 0xe2, 0x18, 0x6d, 0x7d, 0x0c, + 0xa5, 0x3e, 0xf7, 0x92, 0xc0, 0x12, 0xd2, 0x1f, 0x0c, 0xd4, 0xca, 0x88, + 0x4c, 0x82, 0x13, 0x64, 0x08, 0xac, 0x28, 0x15, 0xcb, 0xb4, 0x3b, 0xd1, + 0x72, 0xa4, 0xf4, 0x90, 0x48, 0xca, 0x9b, 0xca, 0x01, 0x50, 0xaa, 0x58, + 0x2c, 0x0e, 0x89, 0xd4, 0x4b, 0x96, 0x10, 0x62, 0x4d, 0x4f, 0x5d, 0x49, + 0xd7, 0xce, 0xf8, 0xf5, 0x6c, 0x60, 0x59, 0x09, 0x8a, 0xc3, 0xb2, 0x06, + 0xa5, 0x31, 0x70, 0xad, 0xae, 0xec, 0x52, 0xcc, 0xe7, 0xf1, 0xfc, 0xf0, + 0xdc, 0xf3, 0x74, 0x3d, 0x5c, 0x47, 0x44, 0xc2, 0x00, 0x8d, 0x96, 0x06, + 0x7a, 0x8c, 0xb8, 0x91, 0xf4, 0x49, 0x61, 0xa3, 0x46, 0xab, 0xf5, 0xaa, + 0xa4, 0x37, 0xe1, 0x46, 0xab, 0x45, 0x31, 0x1f, 0x75, 0xe8, 0x8f, 0xcb, + 0xde, 0x0f, 0xb3, 0x0f, 0x83, 0x64, 0xc0, 0x4e, 0xbf, 0x0d, 0x7c, 0x1d, + 0x22, 0x80, 0x2d, 0x1b, 0x84, 0xb5, 0x16, 0xc0, 0xd6, 0x6a, 0xf9, 0x07, + 0x95, 0x3f, 0x48, 0xa3, 0x1b, 0x36, 0x30, 0xba, 0x61, 0x03, 0x33, 0x33, + 0x33, 0x03, 0xd3, 0xed, 0x20, 0x04, 0x6b, 0x45, 0xf2, 0x13, 0x82, 0xad, + 0x4c, 0x38, 0xbe, 0xb4, 0xd3, 0xc6, 0x95, 0xb4, 0x3d, 0x0e, 0xd5, 0x1a, + 0xb5, 0x96, 0x06, 0xba, 0x15, 0x2f, 0xf7, 0x5c, 0x35, 0x33, 0x33, 0xc3, + 0x86, 0xd1, 0x51, 0x46, 0x37, 0x6c, 0x50, 0x00, 0xb2, 0xdf, 0xfd, 0x5d, + 0x46, 0x3f, 0xfa, 0xd1, 0x81, 0x80, 0xb1, 0xb8, 0x5a, 0xbe, 0x82, 0x68, + 0xbd, 0x77, 0x3c, 0x84, 0x68, 0xbd, 0x77, 0xfc, 0xbd, 0x3d, 0x71, 0x49, + 0x3a, 0x17, 0x28, 0xd6, 0xf9, 0xe6, 0x9d, 0xf2, 0x61, 0x5a, 0x5f, 0x6f, + 0x5c, 0x07, 0x0e, 0xfa, 0x6a, 0xe9, 0xf9, 0x61, 0x9c, 0x37, 0xc4, 0xfd, + 0x60, 0x35, 0x8d, 0x69, 0x78, 0x92, 0x01, 0x6b, 0xd9, 0x77, 0x43, 0x0f, + 0xf8, 0x21, 0x82, 0x5f, 0x7c, 0x43, 0x63, 0xb6, 0x7a, 0x35, 0x85, 0x47, + 0x77, 0x22, 0x74, 0xca, 0xc8, 0x1c, 0x55, 0x8e, 0x4b, 0x53, 0x3b, 0x94, + 0xe3, 0xcc, 0xf4, 0xe1, 0x39, 0xa6, 0xf0, 0x60, 0xc7, 0x54, 0xe8, 0xec, + 0xf2, 0x5d, 0xe5, 0xb0, 0x2d, 0xae, 0xdb, 0xcd, 0xae, 0xf5, 0x2a, 0xea, + 0xd0, 0xe3, 0xd3, 0xec, 0x42, 0xc2, 0x75, 0xbb, 0x54, 0xc4, 0xe3, 0xa1, + 0x53, 0xf7, 0xee, 0x9b, 0x76, 0x71, 0xf0, 0xd1, 0x69, 0xa6, 0xbf, 0x07, + 0xbb, 0x8f, 0xc3, 0x6c, 0xa9, 0xce, 0x78, 0x6b, 0x0a, 0x1e, 0x7d, 0x48, + 0x25, 0xb8, 0x69, 0x37, 0xf2, 0xea, 0xad, 0xc8, 0x91, 0xfb, 0x68, 0x2d, + 0xd7, 0xa8, 0x5c, 0x9f, 0xf4, 0x4b, 0xf8, 0xb5, 0x20, 0xf4, 0xf0, 0xe1, + 0x22, 0xb7, 0xfd, 0x07, 0x8f, 0xfa, 0xf7, 0xe2, 0xfd, 0x91, 0x5f, 0x8b, + 0xac, 0x3d, 0x7c, 0xb8, 0x38, 0x7c, 0x43, 0x9c, 0xab, 0x3e, 0xb6, 0x1f, + 0xd8, 0x1f, 0xae, 0x7f, 0xe5, 0x4e, 0xd8, 0x5e, 0x87, 0x23, 0xb3, 0x03, + 0xe1, 0x5a, 0xde, 0x2a, 0x8e, 0x24, 0x3d, 0xe9, 0x5f, 0x98, 0x5e, 0x3d, + 0xd1, 0x00, 0x49, 0xdd, 0x77, 0x93, 0x56, 0x1f, 0x6e, 0x2d, 0x61, 0xbb, + 0xdf, 0x61, 0xc2, 0x49, 0x71, 0xe7, 0x1b, 0x4e, 0xea, 0x6b, 0xd9, 0x71, + 0xab, 0x85, 0xe3, 0xcb, 0x88, 0xdc, 0x5c, 0x34, 0xec, 0x0d, 0x78, 0xce, + 0xc9, 0x12, 0x01, 0x6b, 0x65, 0x4c, 0x7f, 0xc6, 0xb2, 0x91, 0x19, 0xc9, + 0x45, 0x9c, 0xdd, 0x02, 0xd9, 0x7d, 0x12, 0x21, 0x42, 0xb0, 0x96, 0x31, + 0xe1, 0xe6, 0x23, 0x61, 0x03, 0xd6, 0x0a, 0xb2, 0x8c, 0x44, 0xc3, 0x36, + 0x58, 0x6b, 0x18, 0xd9, 0x40, 0xa9, 0xb5, 0xa2, 0x8a, 0x2e, 0x24, 0xda, + 0xe8, 0x42, 0xd8, 0x12, 0x40, 0x97, 0x9f, 0x92, 0xd1, 0x50, 0x2d, 0x80, + 0x6d, 0xbc, 0x89, 0x75, 0xff, 0x5f, 0x93, 0x6d, 0x56, 0x1c, 0x3a, 0xdd, + 0x85, 0x2e, 0xff, 0x42, 0xda, 0x3a, 0x9f, 0xe3, 0xd2, 0x4f, 0xb5, 0xa7, + 0x25, 0x50, 0x67, 0x7c, 0xc7, 0x24, 0x27, 0x96, 0xea, 0x9c, 0x58, 0x6a, + 0xe2, 0x52, 0x03, 0xca, 0x88, 0x2f, 0xcf, 0x51, 0x43, 0x5d, 0xdb, 0x5d, + 0x66, 0x99, 0xfd, 0x16, 0x4c, 0xde, 0x58, 0x60, 0x32, 0x06, 0xd4, 0x8a, + 0xd4, 0x51, 0xf4, 0x5e, 0x7b, 0x6d, 0x18, 0x94, 0x70, 0x40, 0x14, 0x6f, + 0x46, 0x36, 0x1e, 0xe9, 0x49, 0xb7, 0x9a, 0xfa, 0xf5, 0xd5, 0xdd, 0xac, + 0xc0, 0xeb, 0x80, 0x6b, 0x3d, 0x2b, 0xb6, 0x9a, 0x20, 0xdf, 0x0c, 0x38, + 0x39, 0xda, 0x2f, 0xd5, 0xa8, 0x6c, 0x18, 0xdc, 0xa7, 0x1d, 0x46, 0x99, + 0xac, 0x3a, 0x77, 0x0f, 0x7d, 0x7b, 0x3a, 0x08, 0x03, 0x74, 0x3b, 0x6d, + 0x84, 0x10, 0x91, 0x38, 0x48, 0xbe, 0x36, 0xd8, 0xcf, 0x57, 0xf2, 0xac, + 0x1e, 0xd1, 0x11, 0xd0, 0x7c, 0x31, 0x8c, 0x4f, 0xaa, 0x6b, 0x12, 0x94, + 0xcc, 0x28, 0xa9, 0xcd, 0x53, 0xbd, 0x71, 0xf5, 0x4e, 0x2b, 0xfc, 0x76, + 0x14, 0x58, 0x0b, 0x14, 0x58, 0xeb, 0x47, 0xbd, 0xc9, 0xff, 0xd9, 0x4a, + 0x81, 0xec, 0x57, 0xd7, 0xa4, 0x03, 0x9e, 0x00, 0x3a, 0x44, 0x40, 0x1f, + 0x75, 0xc2, 0xeb, 0xe4, 0xff, 0xee, 0x67, 0xc8, 0xf4, 0xd3, 0x35, 0xa6, + 0x26, 0xca, 0x6c, 0xdd, 0x52, 0x61, 0x01, 0xf0, 0x44, 0x97, 0x5a, 0x43, + 0x22, 0xb6, 0xab, 0x16, 0xa8, 0x35, 0x24, 0x53, 0x9f, 0x2b, 0x46, 0x40, + 0x5a, 0xb6, 0x6a, 0xee, 0x6c, 0x04, 0x8e, 0x35, 0x8c, 0xe2, 0xc0, 0xad, + 0x60, 0xcc, 0xc6, 0x81, 0xb1, 0x2b, 0x04, 0xf3, 0x2f, 0xcc, 0x06, 0xb0, + 0x2e, 0xa3, 0xf8, 0xf8, 0x52, 0xcd, 0x9d, 0xa5, 0x7d, 0x7f, 0x8b, 0x9c, + 0xc8, 0xb3, 0xff, 0xfa, 0x47, 0x78, 0xec, 0x8a, 0xbd, 0x00, 0xdc, 0x50, + 0x7a, 0x88, 0x47, 0x16, 0xf7, 0x06, 0xe9, 0x2a, 0xcf, 0x4d, 0x29, 0xb0, + 0x96, 0x96, 0x7d, 0x2f, 0x38, 0xf4, 0xed, 0x43, 0xec, 0xde, 0xb0, 0x9b, + 0x83, 0x8b, 0x07, 0x99, 0xfd, 0xc6, 0xc3, 0x4c, 0x7e, 0xe8, 0x16, 0x00, + 0xca, 0x37, 0xa9, 0xb1, 0xd3, 0x73, 0x1d, 0x1f, 0x9f, 0x9c, 0x98, 0xe4, + 0xb1, 0x6f, 0xf5, 0xef, 0x37, 0x1b, 0x40, 0x16, 0x52, 0x01, 0xb1, 0x44, + 0x9f, 0x89, 0x0c, 0xc6, 0xc7, 0x2a, 0xcc, 0xcd, 0x57, 0x91, 0x7e, 0x97, + 0xc9, 0xf7, 0x8d, 0x03, 0x30, 0xfb, 0x54, 0x14, 0xd9, 0x31, 0x28, 0xff, + 0x20, 0x89, 0x6c, 0x0e, 0x3a, 0x2e, 0x21, 0x8a, 0x5a, 0xdd, 0xbb, 0xe1, + 0x04, 0xd0, 0x40, 0x7a, 0x9b, 0x29, 0xae, 0xdf, 0x45, 0x63, 0xf9, 0xe1, + 0xbe, 0x36, 0x9a, 0xad, 0x3a, 0x9e, 0x6c, 0xe1, 0x8a, 0x3c, 0xb9, 0x91, + 0x3c, 0xad, 0x46, 0x0e, 0xac, 0x11, 0xbc, 0xae, 0xe7, 0x51, 0x5e, 0xbf, + 0x8b, 0x5a, 0xe3, 0x08, 0x9e, 0xdf, 0xc4, 0x75, 0xd4, 0xfd, 0xdf, 0x06, + 0x6a, 0x35, 0x5b, 0x0d, 0x3c, 0x59, 0xc7, 0x15, 0x25, 0x9a, 0xad, 0x1a, + 0x9e, 0xac, 0x03, 0x1a, 0x90, 0xe0, 0x4b, 0xa2, 0xa8, 0x6c, 0x75, 0xec, + 0x84, 0x9e, 0xe8, 0xc2, 0x8c, 0xc9, 0x0b, 0x27, 0x3a, 0x3e, 0x2f, 0xad, + 0x31, 0xfe, 0xbe, 0x00, 0x4e, 0x47, 0x44, 0xea, 0x64, 0xab, 0xeb, 0xb5, + 0xa9, 0x14, 0x6f, 0xa6, 0xda, 0x78, 0x44, 0xd5, 0xc9, 0x6f, 0xea, 0xba, + 0xd6, 0x82, 0xba, 0x66, 0xdc, 0x02, 0x8d, 0x46, 0xb5, 0x6f, 0xdb, 0x78, + 0xd2, 0x0b, 0x20, 0x60, 0x6a, 0x5f, 0xca, 0xc4, 0x91, 0xdb, 0xae, 0xc8, + 0x2b, 0xe8, 0x97, 0xa3, 0x81, 0x03, 0xb1, 0x89, 0x0d, 0xa4, 0xdf, 0xa6, + 0x90, 0x2f, 0xd1, 0x6a, 0x28, 0x20, 0x86, 0x70, 0x86, 0x73, 0xe0, 0x6f, + 0x1c, 0x8d, 0x2e, 0x0f, 0x34, 0x82, 0x2d, 0x80, 0x02, 0x5c, 0x1d, 0x38, + 0xaa, 0x60, 0x4e, 0x06, 0xec, 0x64, 0xcb, 0x86, 0x3d, 0xed, 0xdb, 0xa3, + 0xd2, 0x1e, 0x6d, 0x00, 0xfb, 0x4c, 0x02, 0xbd, 0x68, 0x34, 0x14, 0x6c, + 0xab, 0xa8, 0xb6, 0x1b, 0xf0, 0x96, 0x09, 0x1f, 0x6d, 0xa8, 0xb2, 0x40, + 0xd9, 0x78, 0x32, 0xf8, 0x69, 0x84, 0x23, 0x53, 0x77, 0x3d, 0x33, 0xd4, + 0x2e, 0x05, 0x7a, 0xd2, 0x1c, 0xda, 0xa5, 0xc3, 0x30, 0xba, 0x23, 0x88, + 0x3f, 0x3c, 0xaa, 0x6c, 0x1e, 0x5e, 0x5a, 0x82, 0xdb, 0x55, 0xdc, 0x8e, + 0x25, 0xd4, 0x80, 0x1b, 0x70, 0xf5, 0xe3, 0x0a, 0x74, 0x75, 0x55, 0xec, + 0x94, 0xde, 0xb6, 0x0d, 0x58, 0x1a, 0xe5, 0xf0, 0x77, 0xd5, 0xfa, 0xe8, + 0x92, 0xb2, 0x73, 0xd7, 0x75, 0xb0, 0xec, 0xa1, 0x80, 0x5a, 0x5a, 0x07, + 0x80, 0x3d, 0xc0, 0xc4, 0x9e, 0xb0, 0xed, 0x0c, 0x98, 0xec, 0xe8, 0x81, + 0xd0, 0xa6, 0x01, 0x6c, 0x05, 0xed, 0xa8, 0x41, 0x66, 0x06, 0x6c, 0x16, + 0x40, 0xb5, 0x80, 0x7d, 0x07, 0xc2, 0xf4, 0x46, 0xe1, 0x31, 0x69, 0xf0, + 0xf7, 0xaf, 0xf2, 0x1d, 0x48, 0x08, 0x81, 0x7c, 0xa1, 0xd6, 0x03, 0x78, + 0x1d, 0x24, 0xe9, 0x0f, 0x80, 0x1c, 0x46, 0x12, 0x9a, 0xf3, 0x34, 0xf6, + 0xee, 0xef, 0x5c, 0x01, 0x55, 0x49, 0xe3, 0xf1, 0x43, 0xc0, 0xb4, 0x54, + 0x91, 0xb1, 0x6b, 0x86, 0x70, 0xf5, 0x23, 0x72, 0xf8, 0xfe, 0x57, 0x76, + 0x0c, 0xfc, 0x4f, 0x44, 0xf2, 0x0d, 0xb3, 0xaf, 0xaf, 0x05, 0x74, 0xcb, + 0x96, 0x79, 0x37, 0x21, 0x1c, 0xa0, 0x23, 0xb9, 0xcf, 0x81, 0x82, 0x0f, + 0x4d, 0x07, 0x2a, 0x3e, 0x54, 0x1d, 0xdd, 0x07, 0xf2, 0xe1, 0x36, 0x21, + 0xb8, 0x4f, 0x4a, 0x3c, 0x47, 0x30, 0xe7, 0x4b, 0xaa, 0x4e, 0xf2, 0xf1, + 0x93, 0x0e, 0xcc, 0x03, 0xc2, 0x97, 0xd4, 0xfd, 0xf0, 0x9e, 0x62, 0x4f, + 0x02, 0x52, 0x5b, 0x69, 0x92, 0x13, 0x39, 0xe2, 0x57, 0xcd, 0x2a, 0x28, + 0x38, 0x19, 0xa8, 0x63, 0x12, 0x07, 0xf9, 0xda, 0x6d, 0x6a, 0xc5, 0xcf, + 0x3b, 0x20, 0xcc, 0x24, 0x3f, 0xbe, 0x64, 0x0c, 0x55, 0x07, 0xe8, 0xe2, + 0x3a, 0x19, 0x3c, 0x5f, 0xa1, 0x16, 0xbb, 0xba, 0x1e, 0xfd, 0xe8, 0xd0, + 0x5d, 0x1f, 0x16, 0x1c, 0x01, 0xbe, 0xc4, 0x4c, 0x13, 0x64, 0x0f, 0x81, + 0x98, 0x7b, 0xc2, 0x38, 0x92, 0x9a, 0x23, 0xe8, 0x22, 0xc9, 0x20, 0xe8, + 0xfa, 0x92, 0x8c, 0x80, 0xa6, 0xde, 0x5e, 0x8b, 0x8f, 0x79, 0x48, 0x14, + 0xd4, 0xd0, 0xc9, 0xa9, 0xfb, 0x51, 0xb5, 0x1c, 0x67, 0xa5, 0x00, 0x00, + 0x20, 0x00, 0x49, 0x44, 0x41, 0x54, 0xec, 0x37, 0x98, 0x31, 0xfb, 0x0c, + 0xd4, 0x3a, 0x12, 0xf4, 0x7b, 0xc5, 0x8c, 0x9e, 0x7c, 0x27, 0xe3, 0xc3, + 0x5c, 0xcf, 0x24, 0x5e, 0x72, 0xd5, 0xf7, 0x54, 0x2f, 0x5e, 0x74, 0x31, + 0x97, 0xbf, 0xf2, 0xf2, 0x6b, 0xbe, 0x7c, 0xee, 0xa5, 0x77, 0x70, 0xe9, + 0x5b, 0xd4, 0x45, 0xd9, 0x00, 0xa6, 0x0c, 0x34, 0xea, 0xcc, 0x4f, 0xce, + 0x86, 0xd0, 0xa9, 0xb3, 0xa7, 0x82, 0x78, 0x1b, 0x36, 0x65, 0xc3, 0xb1, + 0x0c, 0x54, 0xca, 0xb6, 0x01, 0x44, 0x40, 0x54, 0xaf, 0xb6, 0xcd, 0x53, + 0xa7, 0x4e, 0xc1, 0x4f, 0x14, 0x1c, 0xec, 0x74, 0x0c, 0xa8, 0x05, 0x04, + 0x90, 0x2e, 0x63, 0xcf, 0xd8, 0x31, 0x36, 0xce, 0x36, 0xcf, 0xb0, 0x71, + 0xe3, 0x46, 0x4e, 0x9d, 0x3a, 0x15, 0x40, 0xbd, 0x0c, 0xbc, 0xcb, 0xa4, + 0x37, 0x65, 0x5e, 0x4a, 0xb8, 0xbe, 0x16, 0xd9, 0x97, 0x8e, 0x62, 0xde, + 0xa5, 0x15, 0x23, 0x81, 0x36, 0x5a, 0x1e, 0x79, 0xd7, 0x65, 0xf3, 0xa6, + 0x32, 0x27, 0x62, 0x93, 0xef, 0x6c, 0xde, 0x54, 0x66, 0xe1, 0x85, 0x1a, + 0xb9, 0x91, 0x02, 0xf5, 0x95, 0x26, 0x72, 0xb9, 0x09, 0xeb, 0x5d, 0x58, + 0x6a, 0xf1, 0xc5, 0xaf, 0x7c, 0x91, 0xf9, 0x93, 0x55, 0x66, 0x5f, 0x98, + 0x27, 0x37, 0xa2, 0xee, 0x23, 0x6d, 0x3d, 0xb9, 0x8d, 0xab, 0xc7, 0x13, + 0x9b, 0x1d, 0x49, 0xf3, 0x78, 0x1d, 0xcf, 0x6b, 0x33, 0x7e, 0xd5, 0x56, + 0x32, 0x23, 0x0a, 0xda, 0x6f, 0xc0, 0x59, 0x99, 0x91, 0x1c, 0xed, 0x46, + 0x13, 0x91, 0x15, 0x88, 0xac, 0x08, 0xc0, 0xfe, 0x00, 0x99, 0x11, 0x28, + 0x78, 0x92, 0xb6, 0xd7, 0x0b, 0xbe, 0xba, 0xe5, 0xaa, 0x22, 0x0f, 0x3f, + 0xdd, 0x00, 0x60, 0xa1, 0x76, 0x82, 0x23, 0xcb, 0x0d, 0x4a, 0x49, 0x9d, + 0x0d, 0xad, 0xad, 0xe5, 0xcd, 0xd4, 0x1b, 0x4d, 0x76, 0xdd, 0xb4, 0x97, + 0x87, 0x9f, 0xfe, 0x4c, 0x90, 0xaf, 0x78, 0xc5, 0x18, 0xb7, 0x5c, 0xa5, + 0xf2, 0xd5, 0xdd, 0x0a, 0xed, 0xf9, 0x47, 0x86, 0xb6, 0x65, 0x2b, 0x6e, + 0xcb, 0xe8, 0xc8, 0x72, 0x35, 0x62, 0x6b, 0xd7, 0x4d, 0x7b, 0xb9, 0xe7, + 0xf3, 0xe1, 0x3b, 0x84, 0x7e, 0xb6, 0xee, 0x3c, 0xb2, 0xc0, 0xd4, 0xfb, + 0xc3, 0x67, 0x94, 0xda, 0x91, 0x2a, 0xe5, 0xed, 0x15, 0x78, 0xb4, 0x3f, + 0x88, 0xd6, 0x86, 0x3e, 0x0d, 0x02, 0x3a, 0x49, 0xd9, 0x0c, 0xc0, 0x54, + 0x06, 0x20, 0x65, 0xc2, 0xfd, 0xa0, 0x5c, 0xc3, 0x40, 0xa2, 0x6c, 0x8d, + 0xfd, 0xea, 0xaf, 0x04, 0xcb, 0xf9, 0x3f, 0xff, 0x2b, 0xd6, 0xe7, 0xa3, + 0x6f, 0xff, 0xaa, 0xdf, 0xaf, 0x07, 0x75, 0xb1, 0xcb, 0x35, 0xe1, 0x38, + 0x38, 0xcb, 0xde, 0xd6, 0xb4, 0xfa, 0xb1, 0x42, 0x14, 0x28, 0xe4, 0x0b, + 0x34, 0x57, 0x0a, 0x91, 0x34, 0x46, 0xab, 0x01, 0xb5, 0xe2, 0xe9, 0x93, + 0xea, 0xa3, 0xec, 0xd7, 0xd7, 0xd4, 0x06, 0xf1, 0x74, 0xa3, 0x6f, 0x9f, + 0xe2, 0xc7, 0x2f, 0xd7, 0x79, 0xdb, 0xc5, 0x0a, 0x64, 0x6b, 0x87, 0x01, + 0xde, 0x76, 0x71, 0x89, 0x17, 0xcf, 0x3e, 0xcd, 0xaf, 0x6e, 0xbd, 0x09, + 0x80, 0x9f, 0xf0, 0xdf, 0x87, 0x2a, 0x27, 0x55, 0xaa, 0x54, 0xa9, 0x52, + 0xa5, 0x4a, 0x95, 0x2a, 0x55, 0xaa, 0x54, 0xa9, 0x52, 0xa5, 0x4a, 0x95, + 0x2a, 0x55, 0xaa, 0x54, 0xa9, 0x52, 0xa5, 0x4a, 0x95, 0x2a, 0x55, 0xaa, + 0x54, 0xa9, 0x52, 0x25, 0x2b, 0x85, 0x6a, 0xa5, 0x4a, 0x95, 0x2a, 0x55, + 0xaa, 0x54, 0xaf, 0x97, 0x76, 0x86, 0x4e, 0x8a, 0x5d, 0xe9, 0x05, 0xc0, + 0xac, 0xe0, 0x63, 0x6a, 0x00, 0x47, 0xd0, 0xd2, 0x33, 0x78, 0x2a, 0x85, + 0xf0, 0x22, 0x09, 0x78, 0x2b, 0x6d, 0xa4, 0xd7, 0xa0, 0x3d, 0xa4, 0x93, + 0x71, 0x3f, 0xd8, 0x54, 0x38, 0x9b, 0xba, 0xec, 0x89, 0x1f, 0x06, 0xb0, + 0x65, 0xa7, 0x3b, 0x17, 0x28, 0x97, 0x6d, 0xc7, 0xd4, 0x23, 0x5e, 0xa7, + 0xb5, 0xe4, 0xed, 0x57, 0x8f, 0x7e, 0xf5, 0x1c, 0x98, 0xd6, 0x81, 0x5c, + 0x36, 0x47, 0x6b, 0x08, 0xac, 0x4e, 0x04, 0x76, 0xb3, 0xb3, 0x0d, 0xdf, + 0x56, 0x41, 0x77, 0x8b, 0xfd, 0xc1, 0xb3, 0x9a, 0x99, 0x38, 0xc8, 0x93, + 0x15, 0x78, 0x1d, 0xa9, 0x3f, 0x9a, 0x57, 0x70, 0x2d, 0xd7, 0x11, 0x18, + 0xef, 0x54, 0x99, 0x30, 0x43, 0xb2, 0x51, 0xd7, 0xef, 0x22, 0x10, 0xe1, + 0x4c, 0xd7, 0xe6, 0x03, 0xfd, 0xac, 0xfe, 0x6a, 0xdb, 0x47, 0x83, 0xb5, + 0xd4, 0x52, 0xfa, 0x0a, 0x4e, 0xd5, 0x96, 0x5d, 0x9e, 0xf8, 0xd0, 0x6d, + 0x6c, 0xfe, 0xc4, 0x9d, 0x8c, 0x6f, 0xd9, 0x0a, 0xc0, 0x37, 0x3f, 0xbc, + 0x9b, 0xdf, 0x7c, 0xe0, 0x61, 0x04, 0x02, 0x37, 0x9f, 0xa3, 0xe9, 0x35, + 0xf1, 0x5a, 0xe1, 0x6f, 0xf4, 0xc1, 0x0f, 0xed, 0x66, 0xf3, 0x27, 0xee, + 0x64, 0xef, 0xb5, 0xd7, 0x50, 0x6b, 0x45, 0x67, 0x89, 0xfd, 0xe6, 0x47, + 0x94, 0xb3, 0x97, 0x81, 0x64, 0xb9, 0xbe, 0x60, 0x7c, 0xc3, 0x56, 0xca, + 0x9b, 0x0a, 0x94, 0x8b, 0x0a, 0xcc, 0x35, 0x77, 0x6c, 0x01, 0x50, 0xa0, + 0xad, 0x6b, 0xee, 0xbf, 0x8f, 0x27, 0x3e, 0x72, 0x5b, 0x00, 0xd2, 0xca, + 0x39, 0x39, 0x32, 0x4e, 0x26, 0x80, 0xac, 0xa9, 0xb6, 0x34, 0x01, 0xfd, + 0x91, 0xbe, 0xdd, 0x16, 0x66, 0x66, 0x5a, 0x47, 0x6d, 0x8f, 0xb7, 0x51, + 0xc4, 0xe9, 0x59, 0x83, 0xa8, 0x0a, 0xae, 0xa0, 0x29, 0x25, 0x78, 0x12, + 0x5c, 0xa1, 0xdb, 0xdd, 0x0b, 0xda, 0x0f, 0xa0, 0xe9, 0x49, 0x2a, 0x9b, + 0x0a, 0xcc, 0x9e, 0x3c, 0x81, 0xd7, 0xc9, 0x04, 0x6d, 0x26, 0x1c, 0xc0, + 0x53, 0xc7, 0xa8, 0xbc, 0x49, 0x7d, 0x84, 0x39, 0x36, 0x5a, 0x82, 0xe3, + 0xea, 0x03, 0x4a, 0x77, 0x8b, 0x00, 0xe3, 0x8f, 0x65, 0x9d, 0xd7, 0x2d, + 0xa9, 0x3e, 0x90, 0xc7, 0x81, 0x9a, 0x54, 0x80, 0xae, 0xb5, 0xba, 0xa2, + 0x18, 0xe0, 0x16, 0x28, 0xc7, 0x04, 0x80, 0xaa, 0x0f, 0x63, 0xb1, 0x74, + 0x52, 0x55, 0x51, 0x97, 0x05, 0x63, 0x59, 0x05, 0x9e, 0xf2, 0x3a, 0xad, + 0x20, 0x9f, 0xad, 0xf9, 0x0e, 0x94, 0x1c, 0x05, 0x5e, 0x6b, 0x23, 0x95, + 0x83, 0xc0, 0x10, 0xf0, 0xad, 0x7e, 0x40, 0xad, 0xd0, 0x99, 0xe2, 0x42, + 0xba, 0xee, 0x0f, 0xd6, 0x20, 0xa0, 0xd6, 0xa0, 0x3c, 0x36, 0x58, 0x2b, + 0xf4, 0x85, 0xb0, 0x5d, 0xfc, 0xa3, 0x52, 0x8e, 0x1b, 0xda, 0x25, 0x62, + 0x67, 0x1b, 0xbe, 0xa3, 0x82, 0xd1, 0xf3, 0x5a, 0x49, 0x64, 0x45, 0xd8, + 0x86, 0x11, 0xb0, 0x59, 0xf2, 0xb5, 0x4d, 0x38, 0x22, 0xe2, 0x38, 0xd4, + 0x2f, 0xec, 0x66, 0x5d, 0x32, 0x22, 0x43, 0xdb, 0x6b, 0x93, 0xd3, 0xf7, + 0x03, 0xdb, 0xa9, 0xa4, 0x2b, 0xed, 0x59, 0xd3, 0x55, 0x38, 0x37, 0x92, + 0x8b, 0xcc, 0xe2, 0x2c, 0x84, 0xc0, 0x5b, 0xf1, 0x70, 0xf5, 0x87, 0xec, + 0xf1, 0x30, 0x28, 0x20, 0x16, 0xfa, 0x7e, 0x52, 0x58, 0x5f, 0x08, 0xc0, + 0x62, 0x9e, 0x75, 0x7d, 0x74, 0x1d, 0x41, 0xcb, 0xf3, 0x10, 0x59, 0x11, + 0x81, 0x6b, 0xd9, 0xf2, 0x7c, 0x89, 0xec, 0x48, 0x75, 0x9e, 0xc5, 0xc2, + 0x71, 0xc9, 0x8e, 0xc4, 0xcb, 0x86, 0x90, 0x3c, 0x2f, 0x1b, 0x8d, 0x4f, + 0x4a, 0xdf, 0x42, 0xd9, 0xb3, 0xd3, 0xc4, 0xd3, 0x9b, 0xb2, 0xec, 0xf2, + 0x93, 0x64, 0xf6, 0x21, 0x5e, 0x37, 0xfb, 0xbc, 0xbe, 0x64, 0x4b, 0xb4, + 0x22, 0x8b, 0xc0, 0xfd, 0x3b, 0x77, 0x02, 0x51, 0xe8, 0xd3, 0x06, 0xf5, + 0xed, 0x3e, 0xa3, 0x3b, 0xa3, 0x65, 0x24, 0xc5, 0x0f, 0x1b, 0x17, 0x97, + 0xe6, 0x6e, 0x71, 0x3f, 0x70, 0xd1, 0xcc, 0x0c, 0x8b, 0xc0, 0xa8, 0xae, + 0xcb, 0x86, 0x99, 0x19, 0x5e, 0xd1, 0xe1, 0xd5, 0x40, 0x5a, 0x46, 0x4b, + 0x8b, 0x8b, 0xdc, 0xae, 0xf7, 0x23, 0x0e, 0xb0, 0x8a, 0x03, 0xb5, 0x88, + 0xad, 0x9b, 0x3c, 0x87, 0x63, 0xeb, 0x49, 0x69, 0xed, 0xed, 0xa6, 0x1c, + 0x93, 0x6f, 0x87, 0x95, 0x06, 0xa2, 0x60, 0xad, 0x25, 0xce, 0x1d, 0xac, + 0xb5, 0x34, 0x33, 0xc3, 0x86, 0x8f, 0x7e, 0x34, 0x58, 0x5f, 0x04, 0x5e, + 0x59, 0x5a, 0xea, 0x81, 0x6a, 0x5d, 0xb2, 0x25, 0x0b, 0xb3, 0xaa, 0x65, + 0xdd, 0x6c, 0x78, 0x0d, 0xcf, 0xeb, 0x73, 0xf8, 0xe6, 0x23, 0x0a, 0xac, + 0x65, 0xeb, 0xe6, 0xa7, 0x56, 0x2f, 0xbf, 0x4c, 0xd4, 0xfd, 0x76, 0x58, + 0x0d, 0xba, 0x4f, 0xf4, 0x75, 0xc8, 0xd5, 0xaa, 0xfa, 0xba, 0x97, 0x61, + 0x39, 0xf7, 0x9a, 0xa5, 0x04, 0x76, 0xf9, 0x70, 0x28, 0xc1, 0xc6, 0x20, + 0xd0, 0x45, 0x4f, 0x1d, 0x84, 0x60, 0xfa, 0xf3, 0x9f, 0xa3, 0xa6, 0xaf, + 0x4f, 0x1e, 0xaa, 0xad, 0x5a, 0x7e, 0xd8, 0x66, 0xbf, 0x78, 0x8e, 0xfd, + 0xc0, 0x57, 0x5b, 0x6e, 0xb6, 0x1d, 0x5c, 0xa3, 0xd5, 0xb1, 0xb6, 0x1c, + 0xf5, 0x12, 0x80, 0x5a, 0xdd, 0x89, 0x29, 0x95, 0xe2, 0xf0, 0x34, 0xe0, + 0xf6, 0x05, 0x6a, 0x05, 0x7a, 0xfc, 0x10, 0x20, 0x42, 0xa0, 0x96, 0x25, + 0x71, 0xd3, 0x2e, 0x20, 0xc3, 0x6e, 0x3c, 0xe5, 0xca, 0x7c, 0xd3, 0x5e, + 0x60, 0x9a, 0xd9, 0xfc, 0x34, 0x56, 0xc9, 0xcc, 0x1d, 0xbf, 0x87, 0x29, + 0x6f, 0x17, 0xd3, 0xed, 0xf0, 0xd7, 0x53, 0xff, 0x9e, 0x47, 0xe9, 0xfd, + 0xfd, 0x7f, 0x19, 0xa5, 0xf7, 0xbb, 0x7d, 0xd3, 0x28, 0xe0, 0xd6, 0xeb, + 0x80, 0x62, 0xf8, 0xd8, 0xfe, 0xd5, 0xd3, 0xbc, 0x8a, 0xb2, 0xcf, 0x65, + 0xfb, 0x7e, 0x2d, 0x1c, 0x17, 0xe9, 0x7b, 0x08, 0x47, 0xb5, 0xc9, 0xd0, + 0x61, 0xdd, 0x77, 0x10, 0x42, 0x81, 0x62, 0xec, 0xfe, 0x44, 0x52, 0x1c, + 0xd0, 0x37, 0x6c, 0xfa, 0x67, 0xc3, 0x86, 0xc3, 0x7d, 0x1a, 0x3e, 0x9f, + 0xbd, 0x04, 0xab, 0xff, 0xe6, 0x26, 0x38, 0xc2, 0xbb, 0x39, 0x84, 0xec, + 0x86, 0xeb, 0xf1, 0x7b, 0x6f, 0x96, 0x08, 0xfc, 0x37, 0xc9, 0x46, 0x66, + 0x24, 0x06, 0xe7, 0xca, 0x42, 0xd0, 0xaf, 0x32, 0x79, 0x2d, 0xc7, 0x59, + 0x1b, 0xa8, 0x65, 0xc7, 0x35, 0x3b, 0xea, 0x77, 0x2f, 0x46, 0x8c, 0x03, + 0x91, 0xe5, 0x10, 0xd5, 0x07, 0xac, 0x65, 0xdf, 0xaf, 0x7f, 0x25, 0x7b, + 0x49, 0x64, 0x5b, 0xff, 0xde, 0xdd, 0xff, 0x7a, 0x32, 0x40, 0x2d, 0x03, + 0xcd, 0x1a, 0x1b, 0x0b, 0x9f, 0x06, 0xe6, 0xe7, 0xe7, 0x83, 0x34, 0xff, + 0x82, 0x8b, 0x81, 0x97, 0x5f, 0xf3, 0xfa, 0xad, 0x45, 0xe7, 0x7a, 0x5c, + 0x7e, 0x25, 0x7b, 0x09, 0xcf, 0xeb, 0x8e, 0x90, 0x7d, 0x8e, 0xcb, 0x8f, + 0x8f, 0xf3, 0x69, 0x57, 0x9d, 0xaf, 0x63, 0x63, 0x65, 0x64, 0x56, 0x50, + 0xfd, 0x5e, 0x99, 0xca, 0xfb, 0xe1, 0xbe, 0x3b, 0x6a, 0xec, 0xba, 0x51, + 0xfd, 0xae, 0xe4, 0xd9, 0x1c, 0x62, 0x9d, 0x75, 0x3d, 0x10, 0x2e, 0x52, + 0x7a, 0x91, 0x65, 0xb0, 0x4d, 0xdf, 0xcf, 0xcc, 0xb3, 0xa0, 0x59, 0x1a, + 0x98, 0x96, 0x0d, 0xd4, 0x32, 0x7d, 0xf6, 0xa4, 0x7e, 0x7c, 0xdc, 0x61, + 0xdc, 0x40, 0xab, 0xba, 0x1a, 0xe8, 0x9b, 0xc9, 0xe6, 0x98, 0xab, 0xd6, + 0x28, 0x5f, 0x9e, 0xa7, 0xde, 0x6c, 0x31, 0x5e, 0x29, 0xd3, 0xed, 0xb4, + 0xa9, 0x2e, 0xb6, 0x28, 0x15, 0xf2, 0x08, 0xa0, 0x90, 0x87, 0xda, 0x59, + 0x11, 0xa4, 0xef, 0x76, 0xda, 0xc1, 0x32, 0x1e, 0x67, 0x6c, 0xdb, 0xdb, + 0x4d, 0x9a, 0x5b, 0x3e, 0xb8, 0x9b, 0x87, 0xff, 0xd3, 0xc1, 0xc4, 0x7c, + 0x76, 0xfa, 0xa4, 0xed, 0xb6, 0xad, 0xda, 0x62, 0x9d, 0xca, 0x96, 0x32, + 0xf2, 0xcd, 0xe0, 0xfe, 0x63, 0x78, 0x24, 0x33, 0x97, 0xb8, 0x34, 0x9b, + 0x0d, 0x2a, 0x1b, 0xf2, 0x89, 0x60, 0x84, 0x28, 0x6c, 0x24, 0x6c, 0xd7, + 0x24, 0xd9, 0xc7, 0x37, 0x7e, 0x5e, 0xa7, 0x7a, 0xfd, 0xf5, 0x8b, 0xc0, + 0x0f, 0xad, 0xf5, 0xb7, 0xeb, 0xe5, 0x8f, 0xf5, 0xf2, 0x34, 0xc3, 0xcb, + 0x3e, 0xaf, 0xe3, 0xcf, 0x5c, 0xc3, 0x6a, 0x58, 0x78, 0xd5, 0xab, 0x21, + 0x03, 0x75, 0x88, 0x97, 0x5f, 0xb0, 0x96, 0xab, 0xd5, 0x4d, 0x0a, 0x3d, + 0x1c, 0xdc, 0x81, 0x47, 0x3a, 0x20, 0x47, 0xa0, 0x04, 0x94, 0x91, 0xfa, + 0x59, 0x42, 0x30, 0xd6, 0xe7, 0xaa, 0x59, 0x18, 0x50, 0xc6, 0xa0, 0x72, + 0xfb, 0xd5, 0x7b, 0x35, 0x9d, 0x6b, 0x3e, 0x88, 0x3d, 0x73, 0xd9, 0x63, + 0x29, 0x85, 0x1a, 0xb9, 0x8f, 0xe4, 0x99, 0xbf, 0xbf, 0xc6, 0xc3, 0x7e, + 0x9d, 0xf2, 0x16, 0xd7, 0x70, 0x77, 0x22, 0x12, 0xd9, 0xde, 0x70, 0xed, + 0x98, 0x1a, 0xc7, 0x28, 0x6f, 0x89, 0xf6, 0x75, 0x0d, 0x30, 0xab, 0xbe, + 0x28, 0xd9, 0x75, 0xa3, 0x4b, 0xf5, 0x05, 0x49, 0x7d, 0x51, 0x32, 0x76, + 0x85, 0xa0, 0xbe, 0x28, 0x29, 0x6d, 0x10, 0x8c, 0x5d, 0x21, 0x38, 0xf8, + 0xad, 0x5e, 0x60, 0x95, 0x7d, 0xd5, 0x76, 0x27, 0xe6, 0x68, 0x3d, 0xb9, + 0x15, 0x79, 0x56, 0x22, 0xd6, 0x89, 0x70, 0xc2, 0x86, 0xb3, 0x92, 0x39, + 0x7f, 0x8e, 0xf1, 0xf6, 0x38, 0xa5, 0x1b, 0x05, 0xe5, 0xfb, 0x0f, 0x05, + 0x40, 0x2d, 0x80, 0xc7, 0xea, 0x7b, 0x11, 0x0e, 0x3c, 0xfc, 0x65, 0xdd, + 0x0f, 0x5c, 0x7f, 0x88, 0xf2, 0x16, 0x81, 0x94, 0x0a, 0xd8, 0xb5, 0xff, + 0xfa, 0x47, 0x78, 0x64, 0x71, 0x2f, 0xe5, 0xce, 0x5d, 0xd4, 0x98, 0xa3, + 0x2a, 0xa6, 0xd9, 0xbd, 0x61, 0x37, 0x6c, 0x80, 0xd9, 0x6f, 0x3c, 0x4c, + 0xeb, 0x2a, 0xc1, 0x54, 0x61, 0x2a, 0x52, 0x2f, 0x79, 0x36, 0x76, 0x4d, + 0x5d, 0x27, 0x90, 0x67, 0x25, 0x5d, 0x09, 0x19, 0xd1, 0x1b, 0x37, 0x08, + 0xa8, 0x05, 0x20, 0x1c, 0x05, 0xd3, 0x0a, 0xe0, 0x5a, 0x09, 0x2a, 0x6f, + 0x19, 0x63, 0xf6, 0xa9, 0xd9, 0x60, 0xdd, 0xc0, 0xb4, 0xa4, 0x05, 0xfa, + 0x12, 0x59, 0xd3, 0x5f, 0x0e, 0xed, 0xd8, 0x7d, 0xb3, 0xad, 0x59, 0xeb, + 0xd8, 0x38, 0x79, 0xf0, 0x5b, 0xe0, 0xe4, 0x91, 0x7e, 0x1b, 0xd9, 0x29, + 0x10, 0xc5, 0x33, 0x83, 0x1a, 0x7b, 0x6b, 0x00, 0x45, 0xa4, 0xdf, 0xd6, + 0xc4, 0xb9, 0x64, 0x79, 0xb2, 0x45, 0xb9, 0xb8, 0x1d, 0x5a, 0x2a, 0x2c, + 0x56, 0x0a, 0x0a, 0x3e, 0xe2, 0xdb, 0x69, 0x9a, 0xaa, 0x08, 0xa7, 0x8d, + 0x3a, 0xb3, 0x8c, 0x76, 0x03, 0x07, 0xc1, 0xcf, 0x51, 0x58, 0x5f, 0xd6, + 0x36, 0xea, 0x94, 0x8b, 0x53, 0x3a, 0x2c, 0x34, 0x50, 0x2b, 0x59, 0x6a, + 0xe2, 0x0e, 0xd5, 0xa3, 0x91, 0xbe, 0xc0, 0x15, 0x7a, 0x4c, 0x56, 0x6d, + 0xc5, 0x15, 0x6a, 0x3c, 0xd9, 0x33, 0x13, 0x3c, 0x24, 0xaa, 0x09, 0x3d, + 0x68, 0x18, 0x80, 0x02, 0x9e, 0x6c, 0xe9, 0xb1, 0xb9, 0x02, 0xa5, 0xf5, + 0x65, 0xea, 0xcb, 0x6a, 0x7c, 0x38, 0x0c, 0x37, 0x71, 0xbd, 0x3c, 0xae, + 0x28, 0xe1, 0xc9, 0x61, 0x46, 0x1d, 0x0e, 0xf6, 0x46, 0xd9, 0xfb, 0x3e, + 0xe0, 0xac, 0x6e, 0xaf, 0x78, 0xba, 0xfd, 0x7a, 0xfb, 0xef, 0x5b, 0xb3, + 0x2e, 0x06, 0xeb, 0x35, 0xe8, 0x1a, 0x5e, 0x44, 0x1d, 0xd5, 0xa3, 0xfb, + 0x8a, 0x01, 0x24, 0x6a, 0xa2, 0xa8, 0x60, 0x5b, 0x06, 0x84, 0x05, 0x70, + 0xb4, 0x4f, 0xfe, 0x89, 0xa2, 0x82, 0x62, 0x19, 0x40, 0x96, 0x2d, 0x03, + 0xd0, 0xb2, 0x21, 0x5a, 0x13, 0x56, 0xbe, 0x78, 0xdc, 0x05, 0xd3, 0xef, + 0x2d, 0xc1, 0x1f, 0xfe, 0x1e, 0x3b, 0xee, 0x85, 0xc3, 0xb7, 0x27, 0x27, + 0x39, 0x3c, 0xaa, 0xc1, 0x5a, 0xc0, 0xc4, 0x04, 0xfc, 0x96, 0x17, 0xdf, + 0xa6, 0x46, 0xbe, 0x0e, 0x8f, 0x2e, 0x05, 0xe9, 0x6c, 0x1d, 0x38, 0x6a, + 0x2d, 0x8f, 0x02, 0x13, 0x0a, 0xac, 0xd5, 0x38, 0x0a, 0xc5, 0x09, 0x05, + 0xc3, 0x0a, 0x40, 0x62, 0xba, 0x8c, 0x62, 0xb1, 0xc8, 0x81, 0x03, 0x0d, + 0x26, 0x80, 0xe2, 0x9e, 0x22, 0xd0, 0xa0, 0x48, 0x11, 0x8a, 0x0a, 0xae, + 0x75, 0xe0, 0x40, 0x83, 0x7d, 0x7b, 0x4c, 0x09, 0x45, 0xf6, 0xed, 0x21, + 0x02, 0xd9, 0x6a, 0xf4, 0xd9, 0xdd, 0x7e, 0xe3, 0x66, 0xe7, 0xab, 0x73, + 0x85, 0x41, 0xf5, 0x83, 0x4d, 0x99, 0x78, 0x21, 0x04, 0x9e, 0x17, 0x9d, + 0xb0, 0x28, 0xa9, 0x5c, 0xa1, 0x9f, 0x21, 0x84, 0xaf, 0xa0, 0x4e, 0x7a, + 0x63, 0x34, 0x71, 0xbf, 0x77, 0x1d, 0x43, 0x02, 0xb5, 0x92, 0x64, 0x80, + 0xd2, 0xe1, 0x3e, 0x88, 0x00, 0xd6, 0x07, 0x80, 0xaf, 0xa6, 0xcb, 0xe9, + 0x5b, 0xf6, 0xab, 0x28, 0x7b, 0xdc, 0xcc, 0x7e, 0xcf, 0x15, 0x91, 0x05, + 0x78, 0xaa, 0x08, 0x75, 0xbd, 0xbc, 0x5b, 0xef, 0xcb, 0xad, 0xd6, 0x35, + 0xaf, 0xea, 0xc0, 0xad, 0x7e, 0x08, 0x71, 0xaa, 0x39, 0x82, 0x8a, 0x2f, + 0xf1, 0x7c, 0x85, 0xef, 0x95, 0x0e, 0x8c, 0xf9, 0x0a, 0x8a, 0x65, 0xda, + 0x5f, 0x3a, 0x02, 0x61, 0xbd, 0x27, 0x00, 0x03, 0xb4, 0xca, 0x20, 0xb2, + 0x19, 0x2a, 0x52, 0x52, 0x75, 0xf4, 0xb4, 0x46, 0xe6, 0x9d, 0x80, 0x13, + 0x1e, 0x83, 0x9e, 0xf7, 0xdf, 0xbe, 0x24, 0xe3, 0x84, 0x93, 0xd6, 0x08, + 0xa9, 0xc0, 0x88, 0x9e, 0x99, 0xec, 0xc9, 0x3a, 0x8e, 0xf3, 0x41, 0x48, + 0x01, 0xb5, 0xd4, 0xf3, 0x4a, 0x86, 0x02, 0x5d, 0x3c, 0x47, 0xd2, 0x95, + 0x82, 0x92, 0x03, 0x2d, 0x47, 0xd2, 0xf5, 0x05, 0xe3, 0x0e, 0x54, 0x51, + 0x61, 0x73, 0xad, 0x97, 0x3e, 0x8c, 0x3b, 0x30, 0x67, 0x80, 0x5a, 0x3a, + 0x5e, 0x20, 0x98, 0x23, 0xac, 0x5b, 0x50, 0x43, 0x1f, 0x32, 0xda, 0x5e, + 0x3b, 0x72, 0xdf, 0x51, 0xf5, 0xeb, 0x3a, 0x82, 0x0c, 0xfa, 0x67, 0x29, + 0x24, 0x2e, 0xe1, 0x73, 0xa6, 0x7d, 0x74, 0x9a, 0x7a, 0x62, 0x20, 0x21, + 0x84, 0x7a, 0xc7, 0x87, 0x7a, 0xd7, 0x97, 0xd3, 0x75, 0x32, 0xe1, 0xb2, + 0x10, 0x54, 0xed, 0xe3, 0xab, 0xdf, 0x73, 0xf1, 0x81, 0x0b, 0x77, 0x5e, + 0x9f, 0xab, 0xb6, 0x5d, 0xf2, 0x7d, 0xd6, 0x15, 0x14, 0x44, 0xca, 0x40, + 0xaa, 0x0c, 0x4c, 0x6a, 0xdd, 0xe9, 0xd3, 0x9c, 0xfa, 0xc1, 0x29, 0x00, + 0x36, 0xfe, 0xf2, 0xc6, 0x9e, 0xed, 0x27, 0x9f, 0x7b, 0x36, 0x02, 0xac, + 0x82, 0x64, 0xf0, 0x95, 0x81, 0x51, 0xbd, 0x9a, 0x36, 0x01, 0x4e, 0xfd, + 0xe0, 0x94, 0x02, 0x62, 0xfd, 0x40, 0x01, 0xb1, 0x4e, 0x9d, 0x3a, 0xc5, + 0xe4, 0xe4, 0x24, 0xeb, 0x2c, 0xb8, 0x16, 0xcf, 0x3d, 0x1b, 0x01, 0x63, + 0x19, 0x00, 0x97, 0x29, 0xe7, 0xcc, 0x4f, 0xce, 0x32, 0xb9, 0xed, 0xb2, + 0xa0, 0xbc, 0xd9, 0x23, 0xb3, 0x41, 0x5d, 0x81, 0x88, 0xcd, 0x53, 0xa7, + 0x4e, 0x71, 0x29, 0x2a, 0x8f, 0x0d, 0xe8, 0xc2, 0xfd, 0x05, 0x95, 0xf9, + 0x03, 0x6d, 0xf8, 0x2f, 0x2a, 0x18, 0xbf, 0x86, 0x57, 0x8f, 0x87, 0xfd, + 0x88, 0xbc, 0x2b, 0x12, 0xb9, 0x83, 0xd3, 0x47, 0xe7, 0x29, 0xe6, 0xdd, + 0x9e, 0xb8, 0xbc, 0xb9, 0x86, 0xe6, 0x05, 0x34, 0x24, 0xe5, 0x91, 0x12, + 0x6e, 0x65, 0x2b, 0xd3, 0x4f, 0xab, 0x8e, 0xa0, 0x01, 0x6a, 0x99, 0xb0, + 0xc4, 0x53, 0xef, 0x15, 0x63, 0xe3, 0xd4, 0x73, 0x4f, 0x2f, 0x50, 0xd9, + 0x54, 0x0a, 0xde, 0xe1, 0xc9, 0x8e, 0x24, 0x33, 0x42, 0x10, 0x06, 0x90, + 0x9d, 0xb0, 0xaf, 0x22, 0xb2, 0x82, 0x66, 0xa7, 0xad, 0xc1, 0x7e, 0x1e, + 0xb2, 0x23, 0x99, 0xbc, 0x76, 0x17, 0xcd, 0x17, 0xc3, 0x34, 0x0b, 0xb5, + 0x13, 0x1a, 0x4c, 0x95, 0x63, 0x6b, 0xb9, 0xc0, 0xc3, 0x4f, 0x37, 0xb8, + 0xf7, 0x0b, 0x9f, 0xe6, 0x37, 0x6e, 0xfb, 0x4c, 0xef, 0x0e, 0x42, 0x24, + 0x7e, 0xd7, 0x4d, 0x7b, 0x7b, 0xb6, 0xdb, 0xb6, 0x80, 0x81, 0xb6, 0x6c, + 0xc5, 0x6d, 0x2d, 0xd4, 0x4e, 0x00, 0xb0, 0x7d, 0x7d, 0x25, 0xb4, 0xf5, + 0xb9, 0x3b, 0x12, 0xf3, 0x66, 0x00, 0xf4, 0xfb, 0x63, 0x1c, 0xc1, 0xae, + 0x9b, 0xf6, 0x22, 0x56, 0x24, 0xad, 0x56, 0x1d, 0x69, 0xde, 0xe7, 0xae, + 0x2f, 0x31, 0x7b, 0xa4, 0x8a, 0x79, 0x3b, 0x11, 0x1c, 0xdf, 0x35, 0x9e, + 0xd3, 0x06, 0x16, 0x65, 0x80, 0x55, 0x5b, 0xdf, 0x39, 0x1e, 0x00, 0xa0, + 0xe2, 0x60, 0x2b, 0x5b, 0xab, 0xc1, 0xa4, 0x3e, 0x79, 0xfb, 0x04, 0x5f, + 0xbc, 0xf7, 0x28, 0xcb, 0xad, 0xb0, 0xa3, 0x33, 0xff, 0xe7, 0x7f, 0x05, + 0x84, 0x60, 0xad, 0xd5, 0xea, 0x94, 0x54, 0x3f, 0x03, 0xfd, 0xb2, 0xb7, + 0x99, 0x3a, 0x8f, 0x6f, 0xbb, 0x81, 0x85, 0xe3, 0x73, 0x6b, 0x82, 0x7d, + 0xc5, 0x6d, 0xd9, 0xfb, 0x9c, 0x54, 0x1f, 0x08, 0xf7, 0xfd, 0x5c, 0xca, + 0x31, 0x32, 0x10, 0xad, 0x38, 0x58, 0xcb, 0xde, 0x0e, 0x50, 0xfd, 0xfe, + 0x5f, 0xf0, 0xb6, 0x8b, 0x4b, 0x8c, 0x6c, 0xd1, 0x1b, 0xac, 0x73, 0x3a, + 0x55, 0xaa, 0x54, 0xa9, 0x52, 0xa5, 0x4a, 0x95, 0x2a, 0x55, 0xaa, 0x54, + 0xa9, 0x52, 0xa5, 0x4a, 0x95, 0x2a, 0x55, 0xaa, 0x54, 0xa9, 0x52, 0xa5, + 0x4a, 0x95, 0x2a, 0x55, 0xaa, 0x54, 0xa9, 0x52, 0x0d, 0xaf, 0x14, 0xaa, + 0x95, 0x2a, 0x55, 0xaa, 0x54, 0xa9, 0x52, 0xbd, 0x41, 0x14, 0x81, 0x69, + 0x01, 0x5e, 0xa7, 0x0b, 0x9d, 0xba, 0x0e, 0xb7, 0x40, 0x3b, 0x45, 0x1b, + 0xc0, 0x96, 0xb7, 0xd2, 0x06, 0xed, 0x20, 0x5d, 0x18, 0x29, 0x84, 0x1f, + 0x8a, 0xaf, 0xa2, 0x41, 0xf0, 0x1b, 0x1b, 0xf0, 0x12, 0x84, 0x07, 0x40, + 0x9d, 0xe2, 0x76, 0xce, 0x07, 0xa8, 0xd3, 0xcf, 0xce, 0x30, 0x90, 0xae, + 0x60, 0x9f, 0x74, 0x7d, 0xed, 0x7d, 0xe8, 0x67, 0xb3, 0x5f, 0x5a, 0x1b, + 0x7a, 0x63, 0xd4, 0xee, 0xac, 0xfe, 0x01, 0xe2, 0xd0, 0xfb, 0xae, 0x3f, + 0x80, 0xb6, 0x3f, 0xb7, 0x77, 0xb3, 0x6e, 0x6f, 0x3b, 0xeb, 0x74, 0xf6, + 0x87, 0xa3, 0x38, 0x32, 0x84, 0x3c, 0xf9, 0x02, 0x03, 0xfa, 0x91, 0xbe, + 0xd9, 0xa6, 0x01, 0x51, 0x52, 0x06, 0xce, 0xc1, 0xaa, 0xa4, 0x70, 0xf6, + 0x68, 0x21, 0x5c, 0x44, 0x47, 0xb0, 0xf9, 0x13, 0x77, 0x06, 0x79, 0xbf, + 0xf9, 0xe1, 0xdd, 0x7c, 0xe6, 0xd1, 0x43, 0x9c, 0xa8, 0x9d, 0x60, 0xef, + 0xb5, 0xd7, 0x70, 0xc7, 0xf6, 0xed, 0x6c, 0xfe, 0xce, 0x9d, 0x9c, 0xf8, + 0xd2, 0x7e, 0x05, 0xda, 0xd2, 0xce, 0xf0, 0x37, 0x5c, 0x39, 0x6e, 0xd5, + 0x4f, 0x06, 0x90, 0xae, 0xb0, 0xca, 0x0a, 0xd2, 0xf4, 0xe0, 0x47, 0x14, + 0x80, 0x2b, 0x92, 0x5e, 0xeb, 0x9a, 0xfb, 0xef, 0x23, 0xe7, 0xe4, 0x82, + 0x65, 0xd0, 0x7e, 0xe6, 0x43, 0x76, 0x6d, 0x43, 0x45, 0x5a, 0xb3, 0x48, + 0xc7, 0xda, 0xc7, 0x76, 0xca, 0xb5, 0xdb, 0xa8, 0x94, 0x15, 0x2c, 0x78, + 0xcd, 0x88, 0x6d, 0x00, 0x37, 0x9f, 0xa3, 0xbe, 0xd4, 0xa4, 0x64, 0xe0, + 0x5a, 0x42, 0x28, 0xa0, 0x94, 0xdf, 0x26, 0x47, 0x2e, 0xb0, 0x57, 0x6b, + 0xb5, 0x29, 0xb8, 0x05, 0xf5, 0xdb, 0xf0, 0x15, 0x44, 0xab, 0xd6, 0x68, + 0x06, 0x1f, 0xd8, 0x57, 0x97, 0x9a, 0x41, 0xf9, 0x95, 0x9e, 0xbd, 0x8b, + 0x4a, 0xa0, 0x1c, 0xab, 0x40, 0xcd, 0x48, 0xdd, 0x4e, 0x70, 0xa4, 0x6a, + 0x3b, 0x90, 0x0b, 0x20, 0x4c, 0x6b, 0x3f, 0x7f, 0x5a, 0x52, 0x92, 0xd7, + 0x1f, 0xcb, 0xd7, 0x24, 0x94, 0x63, 0xce, 0xca, 0x83, 0xd4, 0xd4, 0xc7, + 0x6f, 0x4c, 0xc3, 0x86, 0xe6, 0x3b, 0x6b, 0x2e, 0x7e, 0xa0, 0x84, 0x76, + 0xec, 0xa6, 0x0f, 0x88, 0x6b, 0x90, 0x72, 0xfa, 0xd8, 0xb7, 0x51, 0x36, + 0xf2, 0xd9, 0x1c, 0xad, 0xd6, 0xb9, 0xe0, 0x69, 0x06, 0x2b, 0x13, 0x01, + 0x2d, 0x65, 0x90, 0xd9, 0x1c, 0xad, 0x95, 0xb5, 0x97, 0x63, 0xc3, 0xb4, + 0x84, 0xe8, 0x05, 0xf6, 0xd9, 0xeb, 0x41, 0x1e, 0x73, 0xcd, 0x49, 0x80, + 0x68, 0xe5, 0xdc, 0x1c, 0x5d, 0xd9, 0x45, 0x08, 0x11, 0x80, 0xb2, 0xba, + 0xb2, 0x1b, 0xc4, 0x43, 0x2f, 0x40, 0xab, 0xbd, 0xd2, 0x56, 0x69, 0x74, + 0xd8, 0xfe, 0x08, 0xdd, 0xfc, 0x41, 0x08, 0xd0, 0x8a, 0x87, 0xdd, 0x11, + 0x37, 0x02, 0xd7, 0x32, 0xe1, 0xf8, 0xb9, 0x67, 0x03, 0xad, 0x5a, 0x09, + 0xbf, 0x69, 0x1b, 0xe4, 0x95, 0x14, 0x4e, 0x6a, 0xbb, 0x78, 0x5d, 0xe3, + 0xb6, 0x92, 0xd2, 0xf7, 0x4b, 0xd7, 0xaf, 0x9c, 0x7e, 0xf5, 0x6a, 0x0d, + 0x79, 0xef, 0xb4, 0xb5, 0x01, 0x58, 0x5c, 0x5c, 0x5c, 0x73, 0xbe, 0xb8, + 0x76, 0xee, 0x0c, 0xe9, 0x59, 0xc3, 0x42, 0xb0, 0x22, 0x1a, 0x55, 0xb8, + 0xa9, 0x8b, 0x74, 0xde, 0xc5, 0xd1, 0x51, 0x46, 0x81, 0x0d, 0xa3, 0xa3, + 0x8c, 0x6e, 0xd8, 0xc0, 0xcc, 0xcc, 0x0c, 0x4b, 0x43, 0xd4, 0x73, 0x54, + 0x23, 0xac, 0x0c, 0xc0, 0xea, 0x76, 0x76, 0x70, 0x2f, 0x87, 0x83, 0xed, + 0x71, 0xb0, 0x55, 0x14, 0x90, 0x35, 0xca, 0x0e, 0x0b, 0xa3, 0x75, 0xd8, + 0x4a, 0x6b, 0xe7, 0xb1, 0x41, 0x5c, 0xa6, 0xcc, 0x51, 0x9d, 0xcf, 0xe4, + 0x31, 0x70, 0x2d, 0xbb, 0x8c, 0xf3, 0x81, 0x6a, 0x19, 0x74, 0xd6, 0xcc, + 0xcc, 0x0c, 0xf7, 0x00, 0x77, 0x00, 0x1f, 0x99, 0x99, 0xe1, 0x49, 0xdd, + 0x3e, 0xab, 0xc9, 0x40, 0xa2, 0xe4, 0xbf, 0x7b, 0x2f, 0x37, 0x3b, 0xff, + 0x8d, 0xc6, 0xa7, 0xde, 0x0b, 0xc0, 0xf3, 0x7f, 0xf9, 0x3c, 0x8d, 0x4f, + 0xbd, 0x7b, 0x60, 0x5e, 0x17, 0x78, 0x04, 0xc1, 0xd6, 0xd8, 0x39, 0xe2, + 0xd2, 0xeb, 0x36, 0x6c, 0x6f, 0x83, 0xd5, 0xc1, 0x59, 0xfd, 0x24, 0xfa, + 0x84, 0xcd, 0xba, 0x04, 0x3e, 0x8b, 0x60, 0x3a, 0x72, 0xe7, 0x5e, 0xbd, + 0x4c, 0x73, 0x2f, 0x19, 0x77, 0x5d, 0x4e, 0x74, 0x3c, 0x26, 0xa5, 0x04, + 0x29, 0x29, 0x01, 0xb3, 0x0e, 0x54, 0xb2, 0x2e, 0xb5, 0x8e, 0x17, 0x00, + 0xb5, 0x5a, 0x3a, 0xbd, 0x01, 0x6d, 0xfd, 0xaf, 0xa0, 0xed, 0x13, 0x0a, + 0x30, 0x4a, 0x4b, 0xf5, 0xbb, 0xbb, 0x9b, 0x4a, 0x94, 0x3f, 0x7e, 0x1b, + 0x0d, 0x29, 0xe1, 0x85, 0x39, 0xf8, 0xd0, 0x14, 0x53, 0xa3, 0x65, 0x95, + 0xe6, 0xf8, 0xbc, 0x72, 0xb8, 0xdc, 0x56, 0x42, 0xac, 0xd7, 0x50, 0x9b, + 0x65, 0x7d, 0xdf, 0xd8, 0x56, 0x66, 0xd7, 0x7a, 0x9d, 0x6e, 0x45, 0xb9, + 0x17, 0x8b, 0xf7, 0x94, 0xa0, 0x54, 0x01, 0x32, 0x50, 0x9f, 0x83, 0xf7, + 0x94, 0x29, 0xeb, 0xbe, 0xfc, 0xe4, 0xb3, 0x25, 0xe6, 0x2a, 0x0b, 0x70, + 0xd5, 0x38, 0x5c, 0x5e, 0x46, 0x08, 0xc1, 0xcd, 0xc7, 0xf2, 0xc0, 0x1c, + 0xa2, 0xec, 0x62, 0x3b, 0x60, 0x2b, 0x38, 0x56, 0x5c, 0x51, 0x27, 0x24, + 0x3b, 0x8d, 0x88, 0x77, 0xa5, 0xfe, 0xfa, 0x09, 0x38, 0x72, 0x84, 0x1e, + 0x1d, 0x99, 0x85, 0xc7, 0x17, 0x56, 0x69, 0xa1, 0xd7, 0x5f, 0x5f, 0xfc, + 0xeb, 0x27, 0xf8, 0xa4, 0x59, 0x89, 0xef, 0x87, 0xec, 0xc2, 0xa7, 0xee, + 0x1b, 0xca, 0x8e, 0x81, 0x65, 0x49, 0x5f, 0xb5, 0x95, 0x1d, 0xce, 0xe7, + 0x5d, 0x5a, 0xad, 0xde, 0x78, 0x1b, 0x9e, 0x15, 0x87, 0x64, 0xf5, 0x8b, + 0x03, 0x05, 0xd9, 0x72, 0xb3, 0x79, 0xdc, 0xac, 0xa4, 0xd1, 0x8a, 0x02, + 0xae, 0x06, 0x85, 0xe3, 0xe9, 0x8d, 0x56, 0xcb, 0x67, 0x87, 0xed, 0x25, + 0x28, 0xd8, 0xd6, 0xa0, 0xfe, 0x98, 0xd4, 0x90, 0xce, 0x1e, 0xa0, 0x96, + 0x91, 0x71, 0xf0, 0x4d, 0x82, 0x72, 0x19, 0xb9, 0x39, 0x75, 0x81, 0x8b, + 0xdb, 0x70, 0xa2, 0x57, 0x9c, 0xc2, 0x48, 0x29, 0xb2, 0xde, 0x8d, 0xc1, + 0x1c, 0x44, 0x64, 0x7b, 0x14, 0xae, 0x25, 0x46, 0x00, 0x4f, 0x3b, 0x3f, + 0xfb, 0xc3, 0x39, 0x88, 0xad, 0xb5, 0x77, 0x6d, 0x6a, 0x7b, 0xae, 0x4f, + 0xb5, 0xe7, 0x9b, 0x3f, 0x49, 0x4d, 0x0d, 0xd4, 0x5a, 0xc7, 0x9b, 0xd8, + 0xf8, 0x4b, 0x3f, 0x0b, 0x40, 0xf7, 0xef, 0x8e, 0x73, 0xe6, 0x6f, 0xfe, + 0x81, 0x4b, 0x7f, 0xe9, 0x2d, 0x5c, 0xf1, 0x4b, 0xca, 0xf1, 0xf2, 0xcc, + 0xdf, 0xfc, 0x03, 0x00, 0x1d, 0x2e, 0x26, 0xcb, 0xcb, 0x6f, 0xc8, 0x7d, + 0x31, 0xba, 0x90, 0x36, 0x3f, 0xed, 0xba, 0x7c, 0xce, 0xf3, 0xb8, 0xcd, + 0x75, 0xb9, 0xcf, 0xf3, 0xb8, 0x23, 0x9b, 0xa7, 0xf2, 0x7e, 0x75, 0x85, + 0xfc, 0xec, 0x57, 0xf6, 0x72, 0xd7, 0xc7, 0x1e, 0x02, 0x60, 0xf2, 0xc6, + 0x28, 0xb8, 0x62, 0x10, 0x50, 0x4b, 0xfa, 0xd0, 0x7c, 0x51, 0xe2, 0xe9, + 0xeb, 0x40, 0x65, 0x83, 0x3e, 0xaf, 0x1b, 0x8f, 0xf4, 0x00, 0xb3, 0x92, + 0x80, 0x5a, 0xf6, 0xd2, 0xc8, 0x40, 0xaf, 0xec, 0x70, 0xb7, 0xd3, 0xa6, + 0x54, 0x50, 0xb6, 0x4b, 0x85, 0x7c, 0x04, 0x5e, 0x05, 0x50, 0x6f, 0xb6, + 0xf0, 0xda, 0x5e, 0x90, 0xc7, 0x86, 0x5c, 0xf5, 0x83, 0x68, 0xc5, 0xb7, + 0x9b, 0x34, 0x06, 0xa8, 0x35, 0x6c, 0xbe, 0x7e, 0x65, 0x95, 0x4a, 0x65, + 0x5a, 0x4d, 0xe0, 0xcd, 0xc0, 0x3a, 0xa1, 0x98, 0xd5, 0xfa, 0xd7, 0xe2, + 0x3a, 0x2e, 0xd5, 0xc5, 0x56, 0x00, 0xd6, 0x0a, 0xdb, 0xba, 0xf7, 0x59, + 0x3e, 0x18, 0xd7, 0x60, 0x6d, 0x70, 0xcf, 0x54, 0xaf, 0xbf, 0x7e, 0x18, + 0x5b, 0xff, 0x11, 0x21, 0x58, 0x6b, 0x2d, 0x40, 0xad, 0x0b, 0xa1, 0x7e, + 0x40, 0xa9, 0x12, 0x70, 0x70, 0x00, 0x8c, 0xea, 0x42, 0x29, 0xa9, 0x6c, + 0xdd, 0xab, 0xa4, 0x00, 0x2c, 0x30, 0x18, 0xac, 0xd5, 0x22, 0x7c, 0x36, + 0x18, 0x43, 0xc3, 0x1c, 0x56, 0x54, 0xcf, 0x7d, 0xdc, 0x85, 0x9a, 0x27, + 0x10, 0xb1, 0x7d, 0x28, 0x58, 0x7f, 0x46, 0x6d, 0x07, 0x4a, 0x8e, 0x02, + 0xf8, 0x34, 0x07, 0x94, 0x37, 0xa8, 0xde, 0xc3, 0xea, 0x42, 0x03, 0xcc, + 0x6a, 0xc7, 0x3c, 0xca, 0x5b, 0x5c, 0xca, 0x5f, 0x28, 0x52, 0xfb, 0x4e, + 0x2b, 0x12, 0x6f, 0xfa, 0xba, 0xfd, 0xc2, 0xe6, 0x3a, 0x53, 0x5f, 0xb4, + 0xfa, 0xcc, 0x1a, 0x9a, 0x65, 0x64, 0x5f, 0x89, 0xe7, 0x5f, 0x48, 0x18, + 0x5f, 0xb0, 0x12, 0xd4, 0x8e, 0xc9, 0x60, 0xbd, 0xbe, 0xa8, 0xc2, 0x39, + 0x0d, 0xb3, 0x92, 0x67, 0x25, 0x12, 0x05, 0xac, 0xaa, 0x1f, 0x9d, 0x66, + 0x7c, 0xc7, 0x14, 0xc5, 0xeb, 0x95, 0x53, 0x3c, 0xdf, 0xd2, 0xf6, 0xff, + 0x4d, 0x03, 0x80, 0xb1, 0x3f, 0x2e, 0x06, 0x40, 0x2d, 0x80, 0xdd, 0x37, + 0x46, 0xfb, 0xec, 0x77, 0xcd, 0xdc, 0xac, 0xca, 0xe3, 0x2e, 0x2a, 0xef, + 0x11, 0x4c, 0xfd, 0x9b, 0x16, 0xed, 0x3f, 0x56, 0xa0, 0x84, 0xcd, 0xcd, + 0x29, 0x36, 0x03, 0xed, 0x97, 0xa2, 0x75, 0x8d, 0xc3, 0xaf, 0xec, 0x1e, + 0x59, 0x57, 0x27, 0x35, 0x63, 0xd7, 0x53, 0xef, 0xbf, 0x99, 0xe9, 0xef, + 0x3d, 0x12, 0x49, 0x6f, 0x20, 0x5a, 0x26, 0x1c, 0x97, 0xe7, 0xe9, 0x49, + 0x03, 0xdc, 0x42, 0x50, 0x5e, 0xb5, 0x3a, 0x1b, 0x49, 0x53, 0xa9, 0x28, + 0x14, 0x70, 0xb5, 0x3a, 0x1b, 0x80, 0xb5, 0x64, 0xc7, 0x0b, 0xc0, 0x5a, + 0xab, 0x4a, 0x03, 0xb5, 0xf0, 0x5b, 0x08, 0x31, 0xa6, 0xfa, 0x73, 0x9d, + 0xa4, 0x27, 0xe4, 0x22, 0xd0, 0x40, 0x38, 0x5b, 0x15, 0x58, 0xab, 0x8f, + 0x5c, 0x91, 0xa7, 0xbd, 0xd2, 0xc2, 0x93, 0x2d, 0x5c, 0x91, 0x27, 0x37, + 0xe2, 0xd2, 0x6a, 0xe4, 0xc0, 0x9a, 0x14, 0xc3, 0x15, 0x05, 0x3c, 0xe9, + 0x81, 0x9f, 0xc3, 0xcd, 0xba, 0x2a, 0xec, 0x54, 0x80, 0x1a, 0xf8, 0xbb, + 0xc1, 0x99, 0xa5, 0xeb, 0xb5, 0x15, 0xa4, 0x4a, 0x94, 0x82, 0x70, 0x08, + 0x76, 0xed, 0x37, 0x3e, 0x68, 0x26, 0xb8, 0x50, 0x4b, 0x4f, 0x2a, 0x90, + 0x16, 0x28, 0x20, 0x97, 0x81, 0x69, 0xa9, 0x31, 0xc1, 0xb5, 0xf6, 0x7a, + 0x9a, 0xb8, 0xa2, 0xa2, 0xc0, 0x5a, 0x34, 0x69, 0xaf, 0x98, 0x3a, 0x85, + 0x61, 0xd7, 0x29, 0x90, 0x1b, 0xc9, 0xd1, 0x68, 0x54, 0xfb, 0x5a, 0x71, + 0x45, 0x5e, 0xdb, 0xe8, 0x23, 0xa7, 0x4d, 0xd7, 0xf3, 0x14, 0x90, 0xac, + 0x58, 0x46, 0xb6, 0x0c, 0xdc, 0xb6, 0x8c, 0xd4, 0xe3, 0xa2, 0xc2, 0x29, + 0x04, 0xed, 0x2a, 0x44, 0x4e, 0x1f, 0x8f, 0x3a, 0x30, 0xd5, 0xdf, 0xae, + 0x56, 0xb1, 0x08, 0x34, 0x14, 0xa4, 0xa9, 0x91, 0xb0, 0xfd, 0x68, 0x52, + 0xe4, 0x04, 0xec, 0x01, 0x26, 0x8a, 0x45, 0x9d, 0xa6, 0x41, 0xa3, 0x61, + 0xd9, 0xd3, 0x32, 0xb0, 0x29, 0x13, 0x6f, 0x6c, 0x35, 0x80, 0x7d, 0x07, + 0x74, 0x7c, 0xf0, 0x5f, 0x18, 0x77, 0xd7, 0x8e, 0x58, 0x79, 0x3b, 0xc0, + 0x1a, 0xfa, 0x5a, 0xbb, 0x7e, 0x2f, 0x81, 0x84, 0x15, 0xd3, 0xe1, 0x51, + 0xd8, 0xbf, 0x1f, 0x9e, 0xbc, 0x2e, 0x1a, 0x37, 0x0a, 0x1c, 0x1e, 0x5d, + 0x62, 0x69, 0x09, 0xfa, 0x30, 0xb9, 0x82, 0xfd, 0x0c, 0xf6, 0xbd, 0x41, + 0xd0, 0x1e, 0x8d, 0xa3, 0xa8, 0xc6, 0xd2, 0x3b, 0x69, 0x40, 0x59, 0x47, + 0x1b, 0x0d, 0xf6, 0xed, 0x29, 0xea, 0xb6, 0x6b, 0xe8, 0x6c, 0x0d, 0x8a, + 0x45, 0x95, 0x72, 0x62, 0x22, 0xcc, 0xd3, 0x30, 0xc0, 0x2d, 0xb4, 0xdd, + 0x22, 0x14, 0x29, 0x06, 0x90, 0xad, 0x03, 0xc0, 0xbb, 0x56, 0xdd, 0xc3, + 0x0b, 0xa3, 0x61, 0xe0, 0x5a, 0x41, 0x1a, 0x0d, 0x74, 0x8a, 0xf7, 0xbd, + 0xfb, 0xca, 0xc0, 0xe7, 0x13, 0xca, 0x92, 0x66, 0x4c, 0xd8, 0x75, 0xd5, + 0xb8, 0xd9, 0xb0, 0x90, 0xaf, 0xa1, 0x80, 0x5a, 0xf6, 0x96, 0x55, 0xde, + 0x6d, 0x5a, 0x29, 0x84, 0x83, 0xda, 0x3f, 0x9f, 0x60, 0x5f, 0x93, 0x80, + 0xb5, 0xaf, 0xb5, 0x84, 0x2f, 0x91, 0xe6, 0xbd, 0x86, 0x01, 0x6a, 0xf9, + 0x92, 0x5b, 0x81, 0x82, 0x1f, 0xc2, 0xb4, 0xee, 0x1d, 0x83, 0xdb, 0x43, + 0x3a, 0x15, 0x05, 0x1f, 0x76, 0x01, 0x87, 0xf4, 0x7a, 0x2d, 0xf6, 0xfe, + 0x6b, 0x5e, 0xd0, 0x33, 0xc9, 0x8b, 0x3d, 0xb6, 0x6f, 0x26, 0x14, 0x11, + 0x59, 0x57, 0x8d, 0x0e, 0xe8, 0x77, 0xe8, 0xc2, 0x6a, 0x35, 0x21, 0x44, + 0xa4, 0x7e, 0xe3, 0x3e, 0x2c, 0x64, 0x85, 0x82, 0xed, 0x38, 0xd1, 0x9e, + 0x94, 0x14, 0xea, 0xda, 0xad, 0xf0, 0x3e, 0xd1, 0xfe, 0x82, 0xd4, 0x26, + 0xe3, 0x63, 0xa4, 0x4d, 0xa1, 0x52, 0x64, 0x9c, 0x0c, 0x75, 0xd9, 0x25, + 0x23, 0x72, 0xe0, 0x77, 0x99, 0xf3, 0x4d, 0xce, 0x28, 0x8b, 0x6d, 0xce, + 0x57, 0xfd, 0xc1, 0x05, 0xd4, 0xbe, 0x09, 0x47, 0x30, 0x8e, 0x64, 0xce, + 0xbc, 0xa3, 0xb5, 0x26, 0x49, 0x52, 0xb0, 0x2c, 0x0d, 0x69, 0x94, 0x90, + 0x73, 0xa0, 0xed, 0x43, 0x21, 0xab, 0xdf, 0xbb, 0xfa, 0xd0, 0xf5, 0x55, + 0x3b, 0x08, 0xbd, 0x2f, 0xc2, 0x8f, 0x1d, 0x0f, 0xb3, 0x0f, 0xbe, 0x7a, + 0x5f, 0x9b, 0x23, 0x04, 0x6b, 0xb5, 0x21, 0xf8, 0xbd, 0xb6, 0x81, 0x39, + 0x56, 0xd7, 0xe5, 0xaf, 0xbc, 0xcc, 0x8b, 0x17, 0x5d, 0xfc, 0x9a, 0x2f, + 0x7f, 0xfa, 0x93, 0xb3, 0x5c, 0x4a, 0x08, 0xb6, 0x32, 0x00, 0xab, 0x93, + 0x06, 0x3e, 0xf5, 0x0a, 0x6c, 0xdc, 0xb8, 0x31, 0xd8, 0x0e, 0x0a, 0x3e, + 0x75, 0x5a, 0xaf, 0x6f, 0xd4, 0x9d, 0x63, 0x03, 0x95, 0xb2, 0x81, 0x58, + 0x67, 0x9b, 0x67, 0xd8, 0xb4, 0xed, 0x4a, 0x4e, 0x3e, 0xf7, 0xec, 0x05, + 0xb7, 0x09, 0x70, 0xfa, 0xf4, 0x69, 0x4e, 0xdb, 0xc0, 0x2c, 0x2d, 0x03, + 0xc0, 0xda, 0xb8, 0x71, 0x63, 0xb0, 0x7d, 0xd3, 0xb6, 0x2b, 0x7b, 0x40, + 0x58, 0x97, 0xbe, 0x75, 0x5d, 0x90, 0x6f, 0xe3, 0xc6, 0x8d, 0x01, 0xa0, + 0xeb, 0xb4, 0x86, 0x74, 0x9d, 0x6d, 0x9e, 0x81, 0x57, 0x60, 0x72, 0x72, + 0x92, 0xd3, 0x1a, 0x06, 0xb6, 0x71, 0xe3, 0xc6, 0x60, 0x7f, 0x2e, 0x7d, + 0xeb, 0xba, 0xa0, 0xbe, 0x06, 0xf4, 0xa5, 0xec, 0xfd, 0xc2, 0x10, 0x47, + 0x1c, 0xa6, 0x26, 0xc6, 0x38, 0x71, 0xb2, 0x96, 0x08, 0xd4, 0x02, 0x02, + 0x78, 0x96, 0x51, 0x31, 0xef, 0xe2, 0x01, 0xad, 0x96, 0x47, 0x61, 0x7d, + 0x01, 0x21, 0x72, 0xe4, 0x36, 0xb9, 0xb8, 0x97, 0xe7, 0xf0, 0x5e, 0x54, + 0x7d, 0x37, 0xf7, 0x72, 0xd5, 0x5b, 0x6d, 0xaf, 0x78, 0x78, 0x2f, 0xb6, + 0x83, 0x6d, 0xee, 0xe5, 0x39, 0x72, 0x23, 0x30, 0xb6, 0x29, 0x7c, 0xbb, + 0x5e, 0x3d, 0xa9, 0xc7, 0xfc, 0xac, 0x77, 0xb5, 0x5d, 0xeb, 0xfd, 0x66, + 0x5f, 0x99, 0xf7, 0xb1, 0x59, 0x41, 0xf3, 0xc5, 0x26, 0xf7, 0x7c, 0xfe, + 0x10, 0xa5, 0x62, 0x72, 0xd2, 0xef, 0xde, 0x77, 0x77, 0x5f, 0x33, 0x47, + 0x96, 0xab, 0x6c, 0x5f, 0x5f, 0xa1, 0x54, 0x54, 0x75, 0x6f, 0xbc, 0x30, + 0xcf, 0x63, 0x33, 0x4d, 0x4a, 0x45, 0xa8, 0x37, 0x72, 0xe4, 0xe2, 0x33, + 0x5c, 0x0d, 0xd0, 0x91, 0xe5, 0x2a, 0xa5, 0x5a, 0x9b, 0x5b, 0xae, 0x2a, + 0x26, 0xda, 0x32, 0x65, 0x04, 0xd2, 0xe7, 0xf1, 0x6f, 0xde, 0xf1, 0x39, + 0xc6, 0x46, 0xca, 0x64, 0x00, 0x41, 0x06, 0x1c, 0xc1, 0xec, 0x4a, 0x8d, + 0xfc, 0xb1, 0x36, 0xb7, 0x6c, 0x2b, 0x71, 0xe2, 0x98, 0xee, 0x93, 0xe6, + 0xcb, 0x01, 0x50, 0xab, 0x7e, 0xac, 0x4e, 0x69, 0x4b, 0x09, 0x96, 0x87, + 0xaf, 0xdf, 0xb0, 0x4a, 0x02, 0x45, 0xd9, 0xa0, 0xad, 0x61, 0x74, 0xff, + 0x57, 0x3e, 0x08, 0xc0, 0xbb, 0x7e, 0xe9, 0x65, 0xfe, 0xfe, 0x7f, 0x6e, + 0x66, 0xb9, 0xb5, 0xc4, 0xfc, 0x9f, 0xff, 0x15, 0x63, 0xbf, 0xfa, 0x2b, + 0x14, 0x2f, 0xf9, 0x11, 0x8f, 0xfe, 0xe7, 0xbf, 0x0a, 0x60, 0x5b, 0x3f, + 0x5c, 0x7c, 0xb1, 0xaf, 0x9d, 0x24, 0x98, 0x97, 0x59, 0x37, 0x00, 0xad, + 0x7e, 0xdb, 0xcf, 0x57, 0x5b, 0xdf, 0x39, 0xce, 0xc2, 0xf1, 0xde, 0x2b, + 0xe7, 0x85, 0xb2, 0x6f, 0x40, 0x5a, 0xf1, 0xa5, 0x91, 0x81, 0x6a, 0xc5, + 0xe3, 0x53, 0xa5, 0x4a, 0x95, 0x2a, 0x55, 0xaa, 0x54, 0xa9, 0x52, 0xa5, + 0x4a, 0x95, 0x2a, 0x55, 0xaa, 0x54, 0xa9, 0x52, 0xa5, 0x4a, 0x95, 0x2a, + 0x55, 0xaa, 0x54, 0xa9, 0x52, 0xa5, 0x4a, 0x95, 0x2a, 0xd5, 0xb9, 0x29, + 0x85, 0x6a, 0xa5, 0x4a, 0x95, 0x2a, 0x55, 0xaa, 0x54, 0x6f, 0x00, 0x35, + 0x96, 0xaa, 0xab, 0x43, 0x99, 0xb4, 0x23, 0xb4, 0x17, 0x73, 0x88, 0x16, + 0x8e, 0xa0, 0xb9, 0xb2, 0xfa, 0x07, 0x5c, 0x22, 0xe1, 0x03, 0x6c, 0x21, + 0x44, 0xf0, 0xc5, 0x76, 0xbf, 0x8f, 0xb3, 0x87, 0x81, 0x5a, 0x99, 0x74, + 0x49, 0xe1, 0xb5, 0xa4, 0x4f, 0x72, 0x4c, 0x1d, 0x06, 0xec, 0xd5, 0xcf, + 0x6e, 0xcf, 0x36, 0xbd, 0xbf, 0x81, 0xa3, 0xeb, 0x10, 0x69, 0x01, 0x72, + 0xd9, 0x1c, 0x2d, 0x5a, 0x7d, 0xd3, 0x9a, 0xf4, 0x43, 0x7f, 0xdc, 0x1e, + 0x80, 0xb5, 0x62, 0xf2, 0x43, 0xb0, 0x14, 0xbe, 0x40, 0x48, 0x2c, 0x18, + 0x0f, 0x20, 0xdc, 0xe0, 0x53, 0xef, 0xa6, 0x76, 0x78, 0xc2, 0x51, 0x69, + 0xf1, 0x45, 0x0f, 0x58, 0x0b, 0x42, 0x07, 0xd5, 0xe0, 0x63, 0x70, 0x19, + 0xfd, 0x10, 0xf5, 0x9b, 0x1f, 0x56, 0x00, 0xac, 0xbb, 0x81, 0xf1, 0x0d, + 0x5b, 0x91, 0x0e, 0xdc, 0xda, 0x38, 0x08, 0xf7, 0x1f, 0x64, 0x6e, 0x71, + 0x81, 0x13, 0x9f, 0x50, 0x70, 0x2d, 0x80, 0xc7, 0x9e, 0x9d, 0x63, 0x7c, + 0x8b, 0x72, 0x11, 0x7c, 0xf0, 0x43, 0xbb, 0xf9, 0xad, 0x07, 0x0e, 0xe2, + 0xfa, 0x82, 0x5b, 0xef, 0x3f, 0x48, 0x93, 0x36, 0x19, 0xcb, 0x31, 0xeb, + 0xc4, 0x97, 0xf6, 0xd3, 0xf4, 0x64, 0x04, 0xb0, 0x55, 0xef, 0x48, 0x72, + 0x4e, 0x0e, 0xe1, 0x43, 0xce, 0xc9, 0x45, 0x00, 0x5a, 0xf6, 0xac, 0xcd, + 0x76, 0x5d, 0xfb, 0x39, 0xd8, 0x06, 0x4e, 0xb8, 0xb1, 0x36, 0x6f, 0x02, + 0x05, 0xe3, 0x04, 0xd6, 0x91, 0x94, 0x37, 0x15, 0xf0, 0x5a, 0x6d, 0xaa, + 0x4b, 0x4d, 0x4a, 0x59, 0x41, 0xbd, 0x23, 0x43, 0xf0, 0x98, 0x03, 0x39, + 0xa2, 0x70, 0x80, 0x72, 0x5e, 0xad, 0xd7, 0x5a, 0xea, 0xe3, 0xd6, 0xea, + 0x52, 0x13, 0x91, 0xd5, 0x9f, 0xe9, 0x77, 0x64, 0x14, 0xfa, 0xb5, 0x9a, + 0x6c, 0x07, 0x0b, 0x47, 0x7d, 0xf0, 0xbe, 0x56, 0xb5, 0x57, 0xe9, 0xad, + 0xd7, 0x7d, 0x41, 0x04, 0xb9, 0xa0, 0xcb, 0xf0, 0x24, 0x48, 0x5f, 0xfd, + 0x66, 0xfb, 0xc1, 0xb2, 0x2a, 0x83, 0x3e, 0x48, 0x4e, 0x50, 0xfc, 0xda, + 0xb3, 0x9a, 0xe4, 0x10, 0x30, 0xba, 0x7e, 0x6a, 0x9b, 0xdf, 0xaf, 0xb6, + 0x11, 0x2f, 0x7b, 0xad, 0x75, 0x89, 0xd4, 0xcb, 0x72, 0x2a, 0xeb, 0x1a, + 0xd0, 0x54, 0xa7, 0xdb, 0xb3, 0x6d, 0xcd, 0x72, 0xa2, 0xd7, 0x4b, 0x1b, + 0x60, 0x18, 0xbf, 0xb6, 0x25, 0x85, 0x21, 0x84, 0x69, 0x75, 0x65, 0x37, + 0x02, 0xd3, 0xca, 0x88, 0x0c, 0x22, 0x2b, 0x68, 0xaf, 0xb4, 0xc9, 0x8d, + 0x98, 0x0f, 0xd2, 0xc3, 0xb0, 0xec, 0xc8, 0x20, 0x4d, 0x3c, 0x0c, 0x0a, + 0x92, 0x05, 0x0a, 0xa2, 0xd5, 0x2f, 0x6c, 0xd6, 0xa5, 0x94, 0x48, 0x29, + 0x71, 0x47, 0x5c, 0xea, 0x8d, 0x70, 0x56, 0xdc, 0x48, 0x1b, 0x0e, 0x71, + 0x4d, 0x1e, 0x0a, 0x8e, 0x25, 0x43, 0x38, 0xd6, 0xaa, 0x00, 0xc7, 0x58, + 0xfa, 0x61, 0xcb, 0x59, 0x6b, 0xfa, 0xd5, 0xf4, 0xdb, 0x7a, 0xf9, 0xf5, + 0xa5, 0x25, 0x16, 0x47, 0xcf, 0x0d, 0xf7, 0x64, 0x60, 0x5a, 0x06, 0xec, + 0xb4, 0xb4, 0xb8, 0xc8, 0xce, 0x9d, 0x3b, 0x59, 0x5c, 0x5a, 0x1a, 0x0a, + 0x82, 0x15, 0xd7, 0xe2, 0xe8, 0x28, 0xf7, 0x2c, 0x2d, 0xc1, 0xd2, 0x12, + 0x8d, 0xdf, 0xfd, 0x5d, 0x76, 0xee, 0xdc, 0xc9, 0xcc, 0xcc, 0x0c, 0x1b, + 0x46, 0x47, 0xd9, 0x30, 0x3a, 0xba, 0xaa, 0xdd, 0xc3, 0x1a, 0x65, 0x65, + 0x20, 0x56, 0xf7, 0xc6, 0xbc, 0x0a, 0x6d, 0xd8, 0x55, 0x1c, 0x98, 0x75, + 0x98, 0xa8, 0x13, 0xe1, 0x28, 0x71, 0x98, 0xd6, 0xa8, 0xc6, 0x75, 0x85, + 0xf1, 0x4b, 0xd6, 0xff, 0x3b, 0xf4, 0xf6, 0x25, 0x1d, 0x13, 0x77, 0x49, + 0x1c, 0xb5, 0xe2, 0x56, 0xc7, 0x60, 0x85, 0x5a, 0x5a, 0x5c, 0x64, 0xd1, + 0xe4, 0x9f, 0x99, 0xe1, 0xeb, 0xd6, 0xb6, 0xc5, 0xa5, 0xa5, 0xa1, 0xa0, + 0x5a, 0x46, 0x8f, 0xfd, 0xc5, 0x7f, 0xe3, 0x86, 0xff, 0xf3, 0xbd, 0xc1, + 0xfa, 0xbb, 0xff, 0xe5, 0xbb, 0x79, 0xfe, 0x2f, 0x9f, 0xe7, 0xdd, 0xff, + 0x72, 0x30, 0x58, 0x2b, 0x0e, 0xb9, 0xea, 0x77, 0xc5, 0xcd, 0x5f, 0xa0, + 0x51, 0x99, 0x82, 0x0f, 0x4d, 0x6d, 0xab, 0x61, 0xdd, 0x6f, 0x8a, 0x96, + 0xfd, 0xbb, 0x90, 0x14, 0x7c, 0xa8, 0xaf, 0xa1, 0x4c, 0xe1, 0xc0, 0xd6, + 0xac, 0xcb, 0x2e, 0xcf, 0x63, 0x57, 0x6c, 0xdb, 0xb8, 0x0f, 0x78, 0x1e, + 0x8f, 0xb8, 0x0a, 0xac, 0x05, 0x17, 0x6e, 0x7f, 0x2e, 0x94, 0x86, 0x74, + 0xf1, 0x86, 0x56, 0x9d, 0xd2, 0xb5, 0x63, 0xca, 0x7d, 0xda, 0xc9, 0xd1, + 0x58, 0xae, 0xc1, 0xb2, 0xee, 0x6b, 0x19, 0xa0, 0xd6, 0x72, 0x4d, 0x01, + 0xb5, 0xce, 0xb6, 0x7b, 0x81, 0x5a, 0x00, 0x71, 0xa0, 0x96, 0x0f, 0x94, + 0x34, 0x60, 0xb4, 0xae, 0x1d, 0x30, 0x4a, 0xe3, 0x74, 0xbb, 0xd3, 0x60, + 0xf9, 0x8a, 0x88, 0x0d, 0xca, 0x91, 0x28, 0xf7, 0x62, 0xe8, 0xa4, 0x21, + 0xb3, 0x05, 0xe0, 0x41, 0x00, 0x3e, 0xf3, 0xf9, 0xe4, 0xdf, 0x5a, 0xd9, + 0x6d, 0x20, 0xc4, 0xf7, 0x75, 0x9a, 0x77, 0x24, 0xa6, 0x11, 0x02, 0x2a, + 0xf9, 0x06, 0xd5, 0x24, 0xa0, 0xd6, 0x72, 0x5d, 0xfd, 0x5d, 0x20, 0xb9, + 0xdb, 0x6e, 0x0e, 0xc2, 0xde, 0x73, 0x8f, 0x0c, 0x48, 0xb9, 0x06, 0xfd, + 0xed, 0x2c, 0x7c, 0x7b, 0x9a, 0x4f, 0x26, 0xd5, 0xdf, 0x68, 0x65, 0xf8, + 0x7b, 0xb7, 0x81, 0x65, 0x09, 0x47, 0xfd, 0x32, 0xec, 0x70, 0xab, 0xa5, + 0xc3, 0x8e, 0xe8, 0x81, 0x63, 0x25, 0x01, 0xb3, 0x06, 0xc5, 0x01, 0x01, + 0xd4, 0xca, 0xeb, 0xd0, 0x03, 0xb8, 0xb2, 0xc3, 0x0a, 0xa2, 0xe5, 0xf5, + 0x4d, 0x6f, 0x34, 0xc8, 0x46, 0x3c, 0x6c, 0x2f, 0x41, 0xf5, 0x9b, 0xa2, + 0x88, 0xae, 0x3e, 0xf2, 0x45, 0x08, 0xfd, 0x4c, 0x40, 0x00, 0x0a, 0xd9, + 0x0d, 0x01, 0x5c, 0x71, 0x79, 0xed, 0xc0, 0x46, 0x1c, 0xa4, 0xd5, 0x93, + 0xce, 0x82, 0x73, 0x99, 0xe7, 0x87, 0x00, 0xae, 0xa5, 0xe1, 0xb7, 0x51, + 0x95, 0xf4, 0xa6, 0xe6, 0xab, 0x02, 0x78, 0x3a, 0x1f, 0xbd, 0x9a, 0xe0, + 0x29, 0xa3, 0x75, 0xbc, 0x89, 0xb3, 0xfc, 0x14, 0x20, 0x00, 0x69, 0x19, + 0x80, 0x56, 0x7c, 0xfd, 0x2c, 0x3f, 0x65, 0x9d, 0x86, 0x70, 0xad, 0x55, + 0xaf, 0xc5, 0xbe, 0xbc, 0x1a, 0xfa, 0x9c, 0xe7, 0x21, 0xbf, 0x2c, 0x78, + 0x88, 0x69, 0x04, 0xf0, 0x39, 0x26, 0xad, 0xad, 0x1e, 0xbb, 0x2c, 0x98, + 0xd6, 0xa1, 0x6f, 0x95, 0xd9, 0xfd, 0xc1, 0x66, 0x04, 0x68, 0x6e, 0x80, + 0x5a, 0xc6, 0xb1, 0xb9, 0xf5, 0x92, 0xa4, 0xe9, 0x79, 0xb8, 0x59, 0x97, + 0x4a, 0x21, 0x8f, 0xd7, 0xb6, 0xdd, 0xdc, 0x43, 0xf5, 0x80, 0xa2, 0x06, + 0x40, 0xb4, 0xba, 0x9d, 0x76, 0x0f, 0x30, 0xcb, 0xc8, 0xd5, 0x20, 0x3a, + 0xa9, 0x9f, 0xd9, 0xa4, 0x07, 0xe5, 0xcb, 0xd5, 0x19, 0x1b, 0x80, 0x86, + 0x75, 0x59, 0xc6, 0x66, 0x12, 0xa0, 0x2b, 0x29, 0x6e, 0x98, 0x34, 0xf1, + 0xb4, 0xab, 0xc9, 0x93, 0xc0, 0x9b, 0x41, 0xfc, 0x23, 0x88, 0x00, 0xa2, + 0x27, 0x70, 0x31, 0xc8, 0x6f, 0xf0, 0xda, 0x82, 0x7c, 0x94, 0x61, 0xd6, + 0x3b, 0x16, 0xe5, 0x44, 0x61, 0x5a, 0xb5, 0x5a, 0x9d, 0x35, 0xf8, 0xaa, + 0xa6, 0x7a, 0x1d, 0x35, 0x0e, 0x3d, 0xa3, 0x63, 0x3f, 0x06, 0xde, 0x86, + 0x82, 0x6f, 0xfc, 0xf5, 0x6b, 0x58, 0x97, 0xa4, 0x91, 0xd0, 0x02, 0x20, + 0x1d, 0x28, 0xf9, 0x0a, 0x52, 0xf5, 0x5a, 0xff, 0xae, 0x9a, 0x84, 0x20, + 0xad, 0xad, 0x44, 0xeb, 0x68, 0x87, 0x3d, 0x60, 0xb7, 0x80, 0x96, 0x86, + 0x49, 0x18, 0x34, 0x4e, 0x1d, 0x75, 0xd7, 0x9b, 0xd5, 0x97, 0xa9, 0x38, + 0xcc, 0x3d, 0x0e, 0xcd, 0x2a, 0xa1, 0xf6, 0xf7, 0x73, 0xf2, 0xd5, 0xdf, + 0xd7, 0xb5, 0xba, 0x0e, 0x0f, 0xeb, 0xfa, 0x6b, 0x83, 0xb2, 0x06, 0x49, + 0x81, 0xae, 0x7a, 0x41, 0x5a, 0x83, 0x54, 0x3d, 0x29, 0x83, 0xb4, 0x71, + 0x60, 0xd6, 0xaa, 0xf5, 0xfa, 0x6a, 0x8b, 0xca, 0x55, 0xbd, 0xf1, 0xa5, + 0x89, 0x29, 0x8a, 0x37, 0xd5, 0x99, 0xff, 0xd7, 0x0d, 0xc6, 0xfe, 0xa4, + 0x4c, 0xfb, 0x4f, 0xca, 0x6c, 0xbe, 0xbb, 0x4b, 0xed, 0xe3, 0xea, 0xda, + 0x5d, 0x7b, 0x74, 0x33, 0x63, 0xf9, 0xcd, 0xcc, 0xb7, 0x14, 0x94, 0xaa, + 0x76, 0x32, 0x5a, 0xd7, 0xc9, 0x2f, 0xb7, 0x98, 0xfd, 0x78, 0x9e, 0xca, + 0x26, 0x7d, 0x8d, 0xff, 0xe3, 0x62, 0xb0, 0xed, 0xd3, 0xff, 0xf6, 0xd3, + 0x00, 0xdc, 0xf5, 0x07, 0x9f, 0x8b, 0xe4, 0x89, 0x83, 0xb0, 0xda, 0x9d, + 0x28, 0x64, 0xcb, 0x56, 0x1c, 0xa8, 0x05, 0x51, 0x28, 0x57, 0x1c, 0xd0, + 0x65, 0x00, 0x59, 0x10, 0xc2, 0xb5, 0x80, 0x00, 0x96, 0x65, 0xc0, 0x59, + 0x71, 0xc8, 0x56, 0xdb, 0xd7, 0xc7, 0xac, 0xcf, 0x6f, 0x35, 0x49, 0x15, + 0x0a, 0x54, 0xf5, 0x15, 0x44, 0x26, 0x02, 0xce, 0x1b, 0x7a, 0x59, 0x54, + 0x75, 0x70, 0x06, 0xdf, 0xa3, 0x72, 0x23, 0xf9, 0x00, 0xbc, 0xd5, 0x8d, + 0xd8, 0x2b, 0xa2, 0xae, 0x56, 0xe0, 0x0a, 0x57, 0x43, 0xae, 0xb4, 0x7c, + 0x09, 0xd4, 0x82, 0x31, 0xdb, 0xdc, 0x48, 0x0e, 0x4f, 0x16, 0x22, 0x61, + 0xcf, 0x9f, 0xee, 0x53, 0x5e, 0x81, 0xf6, 0x4a, 0xd3, 0x9a, 0x40, 0xc1, + 0xdc, 0xcf, 0x04, 0x9e, 0x0c, 0x7b, 0x52, 0x36, 0x70, 0x4b, 0x38, 0x49, + 0x60, 0xed, 0x5e, 0xdc, 0x5e, 0x1c, 0x80, 0xe5, 0x8a, 0x3c, 0x5e, 0x47, + 0xc5, 0xbb, 0x4e, 0x01, 0xcf, 0x6f, 0x92, 0x1b, 0x29, 0x04, 0xe9, 0xda, + 0x2b, 0x6d, 0x1d, 0xdf, 0x1f, 0xac, 0xb5, 0x9a, 0x32, 0x6e, 0x01, 0x57, + 0x7a, 0x78, 0x2d, 0xeb, 0x39, 0xd4, 0x9a, 0x68, 0x40, 0x00, 0x5d, 0x0b, + 0xc6, 0xaf, 0x8e, 0xc7, 0x80, 0xe7, 0x32, 0xad, 0x22, 0x30, 0xd1, 0x50, + 0x50, 0xa6, 0x3d, 0x13, 0x0a, 0x0a, 0x65, 0x83, 0xb0, 0x00, 0x26, 0x8a, + 0x10, 0x8b, 0x62, 0xa2, 0x41, 0x00, 0xc2, 0x02, 0x05, 0x7a, 0x2a, 0x16, + 0x35, 0xf0, 0xc9, 0xda, 0x66, 0x20, 0x53, 0x13, 0x56, 0x5a, 0x88, 0x96, + 0xa1, 0xe0, 0x51, 0x70, 0xd7, 0x75, 0x0c, 0x96, 0x01, 0x6d, 0x1d, 0x8e, + 0xad, 0xc7, 0xb5, 0xda, 0x76, 0xad, 0xa5, 0xa5, 0x80, 0x7f, 0x8f, 0x19, + 0xd1, 0x8a, 0x03, 0xb5, 0xb0, 0xc7, 0xc9, 0xcc, 0xa0, 0x57, 0x82, 0xfd, + 0xa5, 0x3f, 0x54, 0xcb, 0xcf, 0x3e, 0x1e, 0xb6, 0xc3, 0x81, 0x86, 0x8a, + 0xdb, 0xb3, 0x0f, 0x38, 0x00, 0xfb, 0xcc, 0x39, 0x33, 0x01, 0x13, 0x18, + 0xc8, 0x58, 0x23, 0x52, 0xa7, 0xa3, 0x45, 0xd8, 0xd3, 0x80, 0x62, 0xb1, + 0x18, 0xd9, 0x6e, 0x87, 0x0f, 0xec, 0x83, 0x03, 0x07, 0x8a, 0xec, 0x3b, + 0xd0, 0x60, 0xcf, 0x1e, 0x38, 0x70, 0x60, 0xf0, 0x7e, 0x5e, 0x48, 0x9d, + 0x13, 0x30, 0x6a, 0x88, 0x77, 0x95, 0x46, 0xc1, 0x7b, 0x4d, 0x47, 0xa8, + 0xf7, 0x26, 0x8e, 0xe8, 0xc9, 0x2f, 0xd7, 0x17, 0x10, 0xcb, 0x7d, 0xee, + 0x72, 0x76, 0xfe, 0x20, 0x6e, 0x10, 0x9c, 0x7e, 0xf5, 0x1b, 0x8c, 0xeb, + 0x9a, 0x31, 0x04, 0x0d, 0x28, 0x34, 0xef, 0x41, 0x06, 0xf4, 0x95, 0x5f, + 0x6f, 0xc5, 0x01, 0x4e, 0xa0, 0xfa, 0x2e, 0x63, 0x44, 0xc1, 0x79, 0xb7, + 0xcf, 0x43, 0xc5, 0x87, 0xaa, 0xa3, 0x96, 0x2d, 0x42, 0xa0, 0xd6, 0x2e, + 0x20, 0x8e, 0x43, 0x17, 0x92, 0x60, 0x32, 0x1b, 0x20, 0x72, 0x6c, 0x84, + 0x13, 0xda, 0x32, 0xda, 0x3d, 0x22, 0xa8, 0xfb, 0x30, 0xe9, 0xc0, 0x43, + 0x09, 0xf5, 0x93, 0x52, 0x52, 0xd3, 0xcf, 0x28, 0x39, 0x8d, 0x26, 0x6d, + 0xa3, 0x81, 0x53, 0x10, 0xbc, 0x3b, 0x93, 0xbe, 0x50, 0x40, 0x53, 0x63, + 0xdb, 0x11, 0x60, 0xde, 0x51, 0xf8, 0xd1, 0xf6, 0xcf, 0xe8, 0xff, 0xcd, + 0xe4, 0x26, 0x66, 0x69, 0x95, 0x1e, 0x5d, 0xf3, 0x25, 0x73, 0xa8, 0xbb, + 0xd0, 0x09, 0x60, 0xf3, 0x88, 0x64, 0x76, 0x05, 0x5c, 0xf3, 0x1e, 0xd7, + 0x94, 0x21, 0xd4, 0xf0, 0x87, 0x7a, 0x47, 0xa4, 0xf2, 0xb6, 0x75, 0x99, + 0x4d, 0xf3, 0x0e, 0xd3, 0x11, 0x64, 0x1c, 0x09, 0x64, 0x22, 0x93, 0x41, + 0x05, 0x25, 0x6a, 0xf0, 0x1a, 0x00, 0x59, 0xf5, 0xee, 0xb8, 0x7f, 0x0f, + 0x61, 0x78, 0x5d, 0xfe, 0xca, 0xcb, 0xaf, 0xf9, 0x72, 0x54, 0xc3, 0xad, + 0x26, 0xb7, 0x5d, 0xa6, 0x2a, 0x71, 0xd9, 0x65, 0x01, 0x34, 0xea, 0x6c, + 0xf3, 0x0c, 0x97, 0xbe, 0x75, 0x1d, 0xa7, 0x4e, 0x9d, 0x82, 0x8b, 0x88, + 0xc0, 0xb0, 0x6c, 0x90, 0x95, 0x0d, 0xbc, 0x82, 0x10, 0x94, 0x75, 0xea, + 0xd4, 0x29, 0x36, 0x41, 0x04, 0xac, 0x75, 0xa1, 0x6c, 0x1a, 0x58, 0x96, + 0x91, 0x49, 0x7f, 0xea, 0x07, 0xa7, 0xe0, 0x95, 0x70, 0xdd, 0x40, 0xb9, + 0xce, 0xcc, 0xce, 0x06, 0x71, 0x26, 0xfd, 0x99, 0x9f, 0x9c, 0x65, 0xe3, + 0xc6, 0x8d, 0x9c, 0x6d, 0x9e, 0xe1, 0xb2, 0xcb, 0x2e, 0x0b, 0xec, 0x9b, + 0x74, 0x06, 0xbc, 0x65, 0xea, 0xce, 0x2b, 0xe1, 0xf6, 0xa0, 0x9e, 0x16, + 0xa0, 0xcb, 0xae, 0xc7, 0x20, 0x6d, 0xbd, 0xa2, 0xcc, 0x89, 0x93, 0x51, + 0x80, 0xa8, 0xf9, 0x5d, 0xda, 0x6a, 0x79, 0x1e, 0xc5, 0x7c, 0xb4, 0xaf, + 0x2e, 0xad, 0x77, 0xcb, 0x39, 0xdd, 0x8f, 0xcf, 0xbc, 0x24, 0xf0, 0x7c, + 0xd8, 0xfd, 0x41, 0xf5, 0x06, 0xe1, 0xe0, 0xa3, 0x87, 0x82, 0x34, 0x93, + 0x57, 0x8c, 0xe1, 0x15, 0x25, 0x6d, 0xaf, 0x49, 0x7d, 0xa5, 0xa5, 0x81, + 0x59, 0x39, 0x64, 0xa7, 0xcd, 0xf8, 0x55, 0x5b, 0x2d, 0x88, 0x56, 0x0e, + 0xfb, 0x9c, 0x0a, 0x27, 0xc7, 0x51, 0x69, 0x73, 0xc5, 0x02, 0xdd, 0x95, + 0x36, 0x85, 0x6c, 0x8e, 0xb6, 0xd7, 0x8c, 0x7c, 0xeb, 0x70, 0x64, 0xb9, + 0x4a, 0xc9, 0xa2, 0x70, 0x2e, 0xd4, 0x4e, 0x20, 0x37, 0x6d, 0xe6, 0xf6, + 0x07, 0xa6, 0xf9, 0xee, 0x7d, 0x63, 0x1c, 0x7a, 0x54, 0x5d, 0x35, 0xbc, + 0xf5, 0x82, 0xdd, 0x37, 0xed, 0x82, 0xe3, 0x47, 0x22, 0x79, 0x73, 0xd7, + 0xee, 0x06, 0x0d, 0x56, 0x37, 0xb6, 0x8e, 0x2c, 0x57, 0xd9, 0xca, 0x14, + 0x0b, 0xb5, 0x13, 0x94, 0xae, 0x9d, 0xe4, 0xce, 0x6f, 0x1c, 0x64, 0xff, + 0x07, 0x27, 0x99, 0x7e, 0xf4, 0x20, 0x00, 0xe5, 0xa2, 0xa4, 0x70, 0xfd, + 0x6d, 0x70, 0x72, 0x5a, 0xb7, 0x9f, 0xe0, 0xe6, 0x3f, 0x78, 0x84, 0xb9, + 0x63, 0x55, 0x58, 0x52, 0x7d, 0xe7, 0xf9, 0x95, 0x1a, 0xa5, 0x62, 0x3e, + 0xb0, 0x59, 0x6f, 0xe4, 0x98, 0xfc, 0xf8, 0x5e, 0xee, 0xfc, 0xf4, 0x9d, + 0xec, 0xff, 0xd0, 0x54, 0x60, 0x6b, 0xea, 0x93, 0xbb, 0x91, 0x7e, 0x86, + 0xe6, 0xb7, 0xc3, 0x2b, 0xa5, 0x28, 0xdf, 0x40, 0xcb, 0x6b, 0x93, 0x6f, + 0x2a, 0x5a, 0x61, 0xab, 0x15, 0x8e, 0xe3, 0x97, 0xae, 0x2c, 0x23, 0xb2, + 0x82, 0xd8, 0xd0, 0xcb, 0xab, 0xa6, 0x41, 0x40, 0x2d, 0x21, 0x54, 0x2d, + 0x6e, 0x78, 0xff, 0x5e, 0xea, 0xcd, 0x1a, 0xcd, 0x56, 0x93, 0x3f, 0x9d, + 0xf9, 0x33, 0x00, 0x7e, 0x7d, 0xe7, 0x07, 0xf8, 0xd3, 0x99, 0x3f, 0xa3, + 0x9b, 0x7d, 0x89, 0xb1, 0x5f, 0xbd, 0x81, 0xe2, 0x25, 0x3f, 0x02, 0xe0, + 0xe7, 0x7f, 0xee, 0x04, 0x3f, 0xff, 0x4b, 0xf0, 0xf7, 0xff, 0x73, 0x73, + 0x60, 0xa7, 0xfa, 0xfd, 0x7a, 0x60, 0xcf, 0xb6, 0x55, 0xc8, 0x8f, 0xd3, + 0x6c, 0x35, 0x69, 0xae, 0xa8, 0xed, 0x06, 0x6a, 0x65, 0xd7, 0xc9, 0x84, + 0xe3, 0xf5, 0x34, 0xb6, 0x00, 0xe6, 0xaa, 0xb3, 0x14, 0xf2, 0x85, 0x44, + 0x5b, 0x6b, 0xdd, 0xe7, 0x0b, 0xa1, 0x1f, 0xbf, 0x5c, 0xe7, 0x6d, 0x17, + 0x97, 0x02, 0x78, 0x56, 0x3f, 0xbd, 0x78, 0xf6, 0x69, 0xde, 0xfa, 0x96, + 0xcb, 0x18, 0xe1, 0x2d, 0xaf, 0x6a, 0x7d, 0x52, 0xa5, 0x4a, 0x95, 0x2a, + 0x55, 0xaa, 0x54, 0xa9, 0x52, 0xa5, 0x4a, 0x95, 0x2a, 0x55, 0xaa, 0x54, + 0xa9, 0x52, 0xa5, 0x4a, 0x95, 0x2a, 0x55, 0xaa, 0x54, 0xa9, 0x52, 0xa5, + 0x4a, 0x95, 0xea, 0x7f, 0x77, 0xbd, 0xc1, 0xdc, 0x1d, 0x53, 0xa5, 0x4a, + 0x95, 0x2a, 0x55, 0xaa, 0x7f, 0x46, 0x9a, 0xc9, 0xd1, 0xbd, 0xf1, 0x09, + 0x32, 0x94, 0x86, 0x82, 0x50, 0x0d, 0x52, 0x61, 0x7d, 0x01, 0x2f, 0xd1, + 0x19, 0x65, 0x38, 0x05, 0x90, 0x29, 0x6b, 0x79, 0x2e, 0xb3, 0x1f, 0x9f, + 0xcf, 0xac, 0xc9, 0xb6, 0x13, 0x6a, 0xbc, 0x3e, 0xe7, 0x6a, 0x6f, 0xd8, + 0xba, 0xac, 0x96, 0xb6, 0xbd, 0x46, 0x38, 0x50, 0x97, 0x39, 0x32, 0x33, + 0xd7, 0x04, 0xeb, 0xde, 0x31, 0x09, 0xff, 0x6f, 0x1d, 0xbe, 0x98, 0x0b, + 0x21, 0x57, 0x7a, 0x8a, 0x6c, 0xd9, 0x41, 0x3b, 0x9e, 0x8b, 0x00, 0xd8, + 0x24, 0x7d, 0x3d, 0x3b, 0xb2, 0xfd, 0x81, 0x7e, 0xac, 0x29, 0x72, 0x4e, + 0x4e, 0x39, 0x05, 0xf8, 0x22, 0xf8, 0x70, 0x54, 0x76, 0x42, 0x38, 0x95, + 0x72, 0x68, 0x57, 0x0e, 0xea, 0x42, 0xcf, 0x6e, 0x6d, 0xc3, 0xaa, 0xc6, + 0xaf, 0x1c, 0x57, 0x1e, 0xb1, 0xae, 0x80, 0x47, 0x0f, 0x05, 0x8e, 0x87, + 0x95, 0x51, 0x05, 0xa1, 0x6a, 0x4a, 0xc9, 0x0d, 0x57, 0x8e, 0x07, 0x2e, + 0x3e, 0x05, 0xe0, 0xb1, 0x4f, 0xdc, 0x49, 0x41, 0x08, 0xee, 0xbe, 0x49, + 0x7d, 0x14, 0xbb, 0x50, 0x5b, 0x60, 0x7c, 0xc3, 0xd6, 0x00, 0x9c, 0xb5, + 0xb5, 0xbc, 0x95, 0x6f, 0x7e, 0x78, 0x37, 0x00, 0xb7, 0xde, 0x7f, 0x30, + 0x88, 0x37, 0x50, 0x2e, 0xe1, 0x40, 0xb9, 0x58, 0xa0, 0xd6, 0x6a, 0x6b, + 0xc0, 0x88, 0x3d, 0x1b, 0x74, 0x08, 0x00, 0x8a, 0x3b, 0x0c, 0x84, 0x6d, + 0x60, 0xf6, 0x53, 0xd2, 0xf6, 0xdb, 0xe4, 0xc8, 0x05, 0x1f, 0xb8, 0x2b, + 0x50, 0x56, 0xef, 0xb1, 0xa8, 0x9d, 0x6c, 0x2a, 0x87, 0x4a, 0x0d, 0xd4, + 0x02, 0x5d, 0x87, 0x46, 0xf8, 0xa1, 0xa4, 0x44, 0x52, 0x29, 0x96, 0xa8, + 0x35, 0x9a, 0x61, 0xbc, 0xf9, 0x0d, 0x5a, 0x1f, 0xe5, 0x8a, 0xac, 0xa0, + 0xed, 0xb5, 0xa3, 0xe7, 0xeb, 0xef, 0xd4, 0xf1, 0xbe, 0x9a, 0x09, 0x0f, + 0x90, 0x75, 0x5e, 0xe3, 0x43, 0xcd, 0x97, 0xe1, 0x4c, 0xe8, 0xbd, 0xd5, + 0x8b, 0x48, 0x5a, 0xf3, 0xa6, 0x9b, 0x43, 0x03, 0x0a, 0x8a, 0x35, 0x96, + 0xed, 0x9f, 0x2f, 0x6a, 0x43, 0xef, 0xb7, 0xd5, 0x86, 0x71, 0xd8, 0x82, + 0x71, 0x81, 0xf5, 0xf4, 0xec, 0xd5, 0x6d, 0x94, 0x93, 0x41, 0x52, 0xfa, + 0x7e, 0xb2, 0x21, 0x0d, 0xfd, 0x74, 0x5e, 0xe0, 0xab, 0x3e, 0x30, 0xad, + 0x81, 0x75, 0x59, 0x05, 0x7c, 0xd7, 0x2b, 0x81, 0xa7, 0xcb, 0x19, 0x06, + 0xa6, 0x35, 0xe8, 0xbc, 0x86, 0x10, 0xa8, 0x15, 0x07, 0x18, 0xf6, 0x0b, + 0x1b, 0x80, 0x96, 0x1d, 0x8e, 0xc3, 0xb4, 0x72, 0x23, 0x39, 0xda, 0x2b, + 0xed, 0xc8, 0x36, 0x73, 0x9e, 0xd8, 0x61, 0xa0, 0x07, 0xa2, 0xe5, 0x69, + 0xc7, 0xb7, 0xd5, 0xc2, 0x22, 0x2b, 0x22, 0x30, 0x2d, 0x53, 0x47, 0xf3, + 0xb7, 0x56, 0x0d, 0x9b, 0x27, 0xc9, 0x61, 0xe8, 0x42, 0xa6, 0x5f, 0x6b, + 0x7d, 0x22, 0x8a, 0x9d, 0xd7, 0x2f, 0x1d, 0xeb, 0x50, 0xfe, 0x7f, 0xfe, + 0x0e, 0xf6, 0xe7, 0xf8, 0x3a, 0x21, 0xc4, 0xea, 0x8e, 0xb5, 0x5b, 0x0e, + 0x34, 0x33, 0x33, 0xc3, 0xa8, 0x05, 0xbb, 0x5a, 0x0b, 0xe4, 0x29, 0x49, + 0x77, 0x8c, 0x8e, 0xb2, 0x61, 0x69, 0x89, 0xc5, 0x3f, 0xfa, 0x23, 0xbe, + 0xfa, 0x47, 0x7f, 0xb4, 0xa6, 0xbc, 0x36, 0x04, 0x6b, 0x07, 0xa3, 0x11, + 0xc8, 0x16, 0xf4, 0xc2, 0xae, 0x46, 0x21, 0x82, 0xdd, 0x1a, 0x8d, 0x6d, + 0x5f, 0x8a, 0xe4, 0x5d, 0x0a, 0xd6, 0xed, 0xf8, 0xc3, 0xc1, 0x72, 0xa9, + 0x07, 0xa4, 0x65, 0xdb, 0x31, 0xf6, 0xcf, 0x0d, 0x5f, 0xa6, 0x00, 0x5a, + 0x1b, 0x00, 0x1b, 0x29, 0xb6, 0x34, 0x33, 0xc3, 0x0c, 0x30, 0x05, 0x70, + 0xdb, 0x22, 0x2f, 0xdd, 0xf7, 0xb3, 0xc0, 0xcf, 0x01, 0xe0, 0x75, 0x72, + 0xf0, 0xd4, 0x02, 0xe4, 0x4a, 0x01, 0x1c, 0xea, 0xe6, 0xa7, 0xe0, 0x89, + 0xb9, 0xe7, 0x23, 0x76, 0x6f, 0x78, 0x6a, 0xb8, 0xf2, 0x4d, 0xcf, 0x4c, + 0x90, 0xe4, 0x48, 0xab, 0xd4, 0xd2, 0xd7, 0xeb, 0xf3, 0x85, 0x51, 0x3d, + 0x81, 0x60, 0x6b, 0x12, 0xf4, 0x03, 0x38, 0xe1, 0x0b, 0x36, 0x6b, 0xc8, + 0xcd, 0x13, 0x08, 0x36, 0xaf, 0x7a, 0x47, 0xb2, 0xe4, 0x08, 0x76, 0x79, + 0x1e, 0xc6, 0xcd, 0x76, 0x57, 0x51, 0x2d, 0x0f, 0x35, 0x54, 0xd8, 0x6b, + 0x41, 0xc9, 0xf3, 0xa8, 0x39, 0xe1, 0xbe, 0xc0, 0x1b, 0x07, 0xae, 0x15, + 0xb4, 0xfb, 0x53, 0x75, 0xbc, 0xcc, 0x56, 0x10, 0x2a, 0xc6, 0xeb, 0xe4, + 0xe0, 0x98, 0x3a, 0xd6, 0xad, 0xcb, 0x61, 0xec, 0xca, 0x31, 0x5a, 0xcb, + 0x0d, 0x28, 0x56, 0x94, 0xc3, 0x5a, 0x0c, 0xa8, 0xd5, 0x7c, 0xa1, 0x4a, + 0xc1, 0x91, 0x50, 0xef, 0x22, 0xd6, 0x6b, 0x97, 0xf1, 0x04, 0xa0, 0x56, + 0xf3, 0xb9, 0x23, 0x14, 0x8a, 0xae, 0x06, 0x6a, 0xe9, 0x74, 0x16, 0x50, + 0x0b, 0xc0, 0x6b, 0xd5, 0xc1, 0xd1, 0x90, 0x20, 0xed, 0x28, 0x6e, 0x03, + 0xb5, 0xda, 0x97, 0x8f, 0x03, 0xbd, 0x8e, 0xdc, 0x63, 0xef, 0x81, 0x9c, + 0x03, 0x38, 0x30, 0x7d, 0x34, 0x79, 0x7f, 0xa7, 0x26, 0xc2, 0xf0, 0xec, + 0x33, 0xfd, 0xdb, 0x85, 0xe5, 0x3a, 0x1c, 0x99, 0x85, 0xe7, 0xce, 0x1d, + 0x80, 0x69, 0xe4, 0x6e, 0xbb, 0x19, 0xef, 0xb9, 0x47, 0x22, 0x20, 0x2d, + 0x13, 0xb7, 0x76, 0x5b, 0x37, 0xe0, 0x69, 0x87, 0x95, 0x7b, 0x7f, 0x30, + 0xcb, 0xed, 0xab, 0x65, 0x30, 0xfb, 0x61, 0xeb, 0xd8, 0x09, 0x75, 0xac, + 0xb3, 0xfa, 0x58, 0x9b, 0xfb, 0xf5, 0xdd, 0x85, 0x00, 0xa2, 0x25, 0xb5, + 0x93, 0x54, 0x24, 0x6c, 0x80, 0x58, 0x3e, 0x11, 0x38, 0x96, 0x0d, 0xcf, + 0x1a, 0x14, 0x97, 0x04, 0xb2, 0x5a, 0x2d, 0xec, 0x66, 0x25, 0xe3, 0xdb, + 0x77, 0xb3, 0xf9, 0xa5, 0x23, 0x4c, 0x3f, 0x59, 0x4b, 0x4c, 0x63, 0xb4, + 0x16, 0xdb, 0xf6, 0xd2, 0xd4, 0x8d, 0x4e, 0x0b, 0xbc, 0x36, 0xc2, 0x8d, + 0xc1, 0x09, 0x64, 0x37, 0xbc, 0x57, 0x4a, 0x0d, 0x90, 0xcd, 0xba, 0x1a, + 0x91, 0xa3, 0x9d, 0x90, 0xed, 0x7b, 0xb0, 0x94, 0x11, 0x28, 0x16, 0x68, + 0xd8, 0x56, 0x60, 0x4f, 0x43, 0xb1, 0xe2, 0x60, 0x2d, 0xed, 0x3c, 0xda, + 0xf5, 0x21, 0x13, 0x03, 0x6b, 0x01, 0x64, 0x6c, 0xd0, 0x65, 0x02, 0x58, + 0x4b, 0xca, 0x66, 0xe8, 0xe4, 0xea, 0x79, 0x90, 0xa5, 0xe7, 0x7e, 0xfd, + 0x57, 0x9d, 0x97, 0xf8, 0xc2, 0xdf, 0x95, 0xf9, 0x94, 0x36, 0xbd, 0x16, + 0x48, 0x94, 0x9d, 0x56, 0x0e, 0x91, 0x37, 0xbe, 0x7d, 0xb5, 0xf5, 0x61, + 0x14, 0x3e, 0x09, 0x84, 0x6a, 0xf2, 0x26, 0xd0, 0x40, 0xad, 0x61, 0x75, + 0x96, 0x9f, 0x72, 0x96, 0x37, 0x51, 0xe0, 0xa7, 0x6f, 0xa8, 0x7d, 0xe9, + 0x57, 0xde, 0x6a, 0x76, 0xd6, 0x01, 0xbf, 0xbe, 0x08, 0x5f, 0xfe, 0xd9, + 0x97, 0xcc, 0xed, 0x3a, 0x72, 0xbf, 0x16, 0x5f, 0x9e, 0x43, 0x32, 0x89, + 0x3b, 0x5a, 0xc6, 0x5b, 0xaa, 0xb1, 0xeb, 0x46, 0x97, 0x43, 0xdf, 0xf2, + 0x28, 0x6f, 0x9b, 0xb1, 0x31, 0xc6, 0x00, 0x00, 0x20, 0x00, 0x49, 0x44, + 0x41, 0x54, 0x6a, 0x53, 0xde, 0x12, 0xf6, 0xf1, 0x67, 0xbf, 0xd5, 0x66, + 0xf7, 0x07, 0xd5, 0xb5, 0xdd, 0x80, 0xb4, 0x8c, 0xcc, 0xf3, 0xa6, 0x70, + 0xa0, 0xe9, 0x79, 0x14, 0x5c, 0x97, 0xa6, 0xe7, 0x51, 0x5d, 0x84, 0x72, + 0x29, 0xdf, 0x33, 0x2e, 0x31, 0xcc, 0x38, 0x45, 0x3f, 0x88, 0x56, 0x5c, + 0xd5, 0xc5, 0x16, 0x95, 0x0d, 0x79, 0xea, 0xcd, 0x16, 0xe5, 0x4b, 0xf2, + 0x08, 0x17, 0x3c, 0x2f, 0x43, 0x61, 0xbd, 0x40, 0xca, 0x0c, 0xde, 0xd9, + 0x26, 0xe3, 0x95, 0x32, 0xb5, 0x5a, 0x9d, 0x72, 0x39, 0x8a, 0xa8, 0xb1, + 0xf7, 0x43, 0x4a, 0xaf, 0x67, 0xbf, 0xfa, 0xc9, 0x86, 0x8a, 0xd9, 0x4a, + 0x02, 0x6c, 0xd9, 0x71, 0x5e, 0x07, 0xda, 0xed, 0x16, 0xa5, 0x42, 0x9e, + 0x42, 0x51, 0x3d, 0xa7, 0x80, 0x6a, 0xb7, 0x56, 0xd7, 0x23, 0x93, 0x05, + 0xe9, 0x75, 0x13, 0x81, 0x5a, 0xf6, 0x32, 0x78, 0x36, 0xd2, 0xed, 0x5e, + 0xaf, 0x5b, 0xe7, 0xbf, 0xb9, 0x5f, 0xeb, 0x6b, 0x78, 0xfc, 0xbc, 0x4e, + 0xf5, 0xfa, 0x6b, 0x0e, 0x78, 0x3b, 0xb0, 0x11, 0x35, 0xb2, 0xf0, 0xe3, + 0xd8, 0xf6, 0x77, 0x01, 0x3f, 0x02, 0x4e, 0xaf, 0x62, 0x27, 0x7e, 0x5e, + 0xdb, 0xcf, 0x5c, 0xab, 0x29, 0x8e, 0xa3, 0xb1, 0xd7, 0x9b, 0x40, 0xc1, + 0x41, 0x43, 0x19, 0x92, 0xa1, 0x78, 0x6b, 0x95, 0xf9, 0x49, 0xf7, 0x83, + 0x78, 0x25, 0x81, 0xb3, 0x4c, 0x7c, 0x33, 0x16, 0x6f, 0x4b, 0x3a, 0x84, + 0x70, 0x07, 0x2b, 0x4d, 0x59, 0xc0, 0x2c, 0x20, 0x86, 0x79, 0x96, 0xd5, + 0x36, 0x4a, 0x40, 0x0d, 0x28, 0xf7, 0xa9, 0xd7, 0xf9, 0x68, 0x50, 0x7b, + 0x0f, 0xd2, 0x3c, 0x70, 0x2d, 0xf4, 0x3e, 0x73, 0x59, 0x63, 0x29, 0x95, + 0x06, 0x54, 0x8b, 0xbd, 0x79, 0xc5, 0x33, 0x12, 0xb6, 0x40, 0xfd, 0x81, + 0x16, 0x62, 0xc2, 0xc5, 0x9d, 0x91, 0x54, 0x80, 0xea, 0xa8, 0x8a, 0x63, + 0x22, 0x7a, 0xbd, 0xab, 0x3f, 0xd0, 0xa2, 0xfc, 0xd1, 0x3c, 0x95, 0x25, + 0x90, 0x5b, 0x56, 0xaf, 0x9b, 0x88, 0x2d, 0x01, 0x2a, 0x4b, 0xc0, 0x16, + 0xa8, 0x7e, 0xb5, 0x45, 0x65, 0xbd, 0xcb, 0x20, 0x54, 0x51, 0xed, 0x85, + 0x36, 0x93, 0x7f, 0x52, 0x0e, 0xd6, 0x1f, 0x5b, 0xbf, 0x39, 0x24, 0xa3, + 0x55, 0x16, 0xa8, 0x1e, 0x93, 0x88, 0xf5, 0xca, 0xfa, 0xfc, 0x8c, 0xc7, + 0xd8, 0xce, 0xb0, 0xbe, 0x73, 0x1f, 0xcf, 0x23, 0xb0, 0x60, 0x5b, 0xd5, + 0xad, 0xc1, 0xb6, 0x5f, 0x6b, 0xfd, 0x5a, 0xa4, 0x9c, 0xb1, 0xfc, 0x24, + 0x49, 0xb2, 0x21, 0x5b, 0x71, 0x48, 0xd6, 0x30, 0xb2, 0x41, 0x5a, 0xc3, + 0xa4, 0x19, 0xbf, 0x72, 0x92, 0xd9, 0x23, 0x0a, 0x8c, 0x30, 0xb5, 0x73, + 0x8a, 0xe9, 0x99, 0x69, 0x72, 0x8e, 0xda, 0x1e, 0xc0, 0xb5, 0xa0, 0xa7, + 0x6f, 0xb6, 0xd0, 0xf1, 0xd8, 0xff, 0x12, 0x90, 0x83, 0x22, 0x45, 0x84, + 0x3f, 0x06, 0x54, 0x11, 0x40, 0xab, 0x63, 0x9e, 0x7f, 0x8a, 0x84, 0xc4, + 0xa4, 0xc6, 0x9a, 0xf7, 0x25, 0x22, 0xa7, 0x0d, 0x7e, 0x11, 0x18, 0x07, + 0xc7, 0x3a, 0x23, 0x9c, 0x36, 0x19, 0xb7, 0x40, 0x63, 0x79, 0x96, 0x00, + 0x0b, 0xe8, 0x57, 0xc1, 0xc9, 0xc7, 0x0c, 0xf4, 0xbb, 0xbf, 0x97, 0x51, + 0x67, 0x98, 0x92, 0x3d, 0x66, 0x1b, 0xe4, 0xd4, 0xf7, 0x60, 0x29, 0x2d, + 0x88, 0x0f, 0x22, 0x0a, 0xf4, 0x4a, 0xac, 0xf3, 0xe0, 0x3e, 0x85, 0xe7, + 0xc7, 0x51, 0x7a, 0xfd, 0xb5, 0xdd, 0xd9, 0xce, 0x11, 0x5f, 0x01, 0x22, + 0x72, 0x23, 0x39, 0x1a, 0x8d, 0xe9, 0x20, 0x3e, 0xe7, 0x4f, 0x71, 0x88, + 0x4f, 0xea, 0x32, 0x2b, 0xc3, 0xd9, 0x0c, 0x60, 0x33, 0x6d, 0xe2, 0x6d, + 0x33, 0xb9, 0x08, 0x9f, 0xcd, 0xe8, 0x3e, 0x39, 0xb1, 0x6b, 0x78, 0x51, + 0x01, 0xb3, 0xf6, 0x4d, 0xc0, 0xbe, 0x03, 0x6a, 0xbb, 0xc5, 0xb8, 0x00, + 0xe0, 0x68, 0x43, 0xc3, 0xb2, 0x62, 0xf1, 0x71, 0x05, 0x7c, 0xa8, 0x62, + 0x98, 0x27, 0x6e, 0x6b, 0xa0, 0xec, 0xc1, 0xab, 0x41, 0x40, 0xac, 0x1d, + 0x3a, 0xed, 0xb0, 0xe9, 0x2d, 0xad, 0xac, 0x80, 0xe7, 0x29, 0x40, 0x56, + 0x94, 0xbd, 0xbf, 0xc4, 0x8e, 0xa5, 0x51, 0x0e, 0x8f, 0x6a, 0xa8, 0xfc, + 0x52, 0x14, 0x3c, 0xdf, 0xb7, 0xbe, 0x31, 0xd0, 0xd7, 0x5d, 0x02, 0x3e, + 0xdb, 0x50, 0xe1, 0x3d, 0x13, 0xaa, 0x1d, 0x8e, 0x1e, 0xb0, 0xda, 0x06, + 0xd8, 0xb7, 0x47, 0x2d, 0x8b, 0x14, 0xa1, 0xd8, 0x88, 0xb4, 0xd3, 0x3e, + 0x8a, 0x34, 0x8a, 0x0d, 0xd4, 0x3f, 0x82, 0x0d, 0x45, 0x1d, 0xd4, 0xb1, + 0xec, 0xd3, 0xc4, 0xae, 0x7d, 0x7b, 0xa0, 0x38, 0x01, 0x8d, 0xa3, 0xf0, + 0xae, 0x22, 0x03, 0xc7, 0xcd, 0xde, 0x48, 0xb2, 0xc7, 0x7f, 0x93, 0x60, + 0x54, 0xd2, 0xd7, 0x13, 0xa5, 0x24, 0x00, 0xb9, 0x8a, 0xf9, 0x3c, 0x0d, + 0xc0, 0x5d, 0x6e, 0x26, 0x8f, 0x23, 0xdb, 0xe7, 0xa9, 0x33, 0xe8, 0x39, + 0xa6, 0x77, 0x4b, 0xbc, 0xdf, 0xad, 0xc6, 0xdb, 0xcd, 0xb8, 0xc2, 0xe0, + 0xf3, 0x5f, 0x08, 0x31, 0xb0, 0x2b, 0x63, 0x4f, 0xd8, 0x71, 0x41, 0x14, + 0x1b, 0x37, 0x8b, 0xbc, 0xe7, 0x42, 0x81, 0xf5, 0xe7, 0xac, 0xb1, 0x3e, + 0x53, 0xad, 0x3c, 0xea, 0x8a, 0xf2, 0xa0, 0x23, 0xb8, 0xd5, 0x97, 0x01, + 0x04, 0xab, 0xea, 0xc0, 0xbd, 0xef, 0x83, 0xcf, 0x1d, 0x51, 0x93, 0x00, + 0x18, 0x4c, 0x8c, 0xf0, 0xa3, 0x20, 0x2d, 0x33, 0x11, 0x8d, 0x74, 0xa2, + 0xbb, 0x5a, 0xd1, 0x80, 0x54, 0x7c, 0xf5, 0xde, 0xac, 0xb0, 0xd2, 0x86, + 0x7c, 0x6f, 0x3f, 0x31, 0xde, 0x0e, 0x5d, 0x7d, 0x1c, 0x9a, 0x8e, 0x82, + 0x69, 0xe1, 0x08, 0xa4, 0x23, 0x54, 0xd8, 0x4c, 0xe4, 0xe4, 0x48, 0xe6, + 0x63, 0xc7, 0x2b, 0x7c, 0xc7, 0x1a, 0x9d, 0xe8, 0x67, 0xac, 0x92, 0x63, + 0xbe, 0xaa, 0xdf, 0xc7, 0x38, 0x92, 0xae, 0x1e, 0xdb, 0x18, 0x77, 0xa0, + 0x8a, 0xa4, 0xdb, 0xe7, 0xf8, 0x98, 0xbb, 0xdc, 0x5c, 0x0b, 0xd0, 0xb0, + 0xc5, 0xa0, 0x2c, 0xdd, 0x7f, 0x13, 0x7a, 0x8c, 0x2f, 0xe3, 0xab, 0xfe, + 0x6b, 0xdd, 0x82, 0x6d, 0x99, 0x6b, 0x70, 0xd7, 0x17, 0xe4, 0x4c, 0x5c, + 0xd6, 0x6a, 0x3b, 0x33, 0xb1, 0x8b, 0xd5, 0x0e, 0x00, 0x39, 0x47, 0xd0, + 0xd5, 0x69, 0x32, 0x7a, 0x3f, 0xba, 0x0e, 0xe4, 0x50, 0xef, 0x01, 0x55, + 0x1b, 0x45, 0xdf, 0x73, 0xf1, 0x67, 0x39, 0xbc, 0xff, 0xeb, 0x09, 0xb2, + 0x6c, 0xe0, 0xc5, 0x8b, 0x2e, 0xe6, 0xf2, 0x57, 0x5e, 0x7e, 0x4d, 0x97, + 0x97, 0xbe, 0xe5, 0x19, 0x40, 0x41, 0xa5, 0x4e, 0x36, 0xcf, 0xb0, 0xae, + 0x70, 0xa9, 0x82, 0x5d, 0x41, 0x00, 0x9b, 0x32, 0xe0, 0xa9, 0x53, 0x3f, + 0xe8, 0x85, 0x4d, 0x19, 0x18, 0x96, 0x0d, 0x9a, 0x32, 0xf9, 0xd6, 0x15, + 0x2e, 0x65, 0xe3, 0xc6, 0x8d, 0x9c, 0x3e, 0x7d, 0xfa, 0x55, 0xb1, 0x69, + 0xf2, 0x98, 0xf4, 0xa0, 0x81, 0x5d, 0xeb, 0x54, 0x1e, 0x03, 0xf2, 0x3a, + 0xdb, 0x3c, 0x13, 0xb1, 0x19, 0xb7, 0x6f, 0xc0, 0x5c, 0x27, 0x9f, 0x7b, + 0x36, 0x00, 0x77, 0x81, 0x82, 0x71, 0x6d, 0x2c, 0x84, 0x50, 0xaf, 0x33, + 0x3f, 0x39, 0xcb, 0xe4, 0xe4, 0x64, 0x04, 0xe6, 0x65, 0x6c, 0x19, 0xb0, + 0xd6, 0xc6, 0x8d, 0x1b, 0xf5, 0xbe, 0xfe, 0x02, 0x1e, 0x73, 0xb8, 0x7f, + 0x66, 0xbd, 0xd3, 0xb4, 0xae, 0xe1, 0x27, 0x4e, 0xd6, 0x68, 0xb4, 0x3c, + 0x72, 0x23, 0xe1, 0x75, 0xca, 0x5c, 0x02, 0x0b, 0x23, 0x2e, 0xed, 0xbc, + 0x8b, 0x94, 0x04, 0x40, 0x2d, 0x37, 0x2b, 0x68, 0xae, 0x10, 0xd1, 0xae, + 0xeb, 0x77, 0x33, 0x7b, 0x52, 0x01, 0x9f, 0x9a, 0x2f, 0xaa, 0xbe, 0x85, + 0xec, 0x48, 0x72, 0xc5, 0x02, 0xbb, 0xae, 0x9d, 0x52, 0xbf, 0xd1, 0xac, + 0x20, 0x33, 0x92, 0xa3, 0x76, 0x78, 0x16, 0x21, 0x04, 0x25, 0x37, 0x4f, + 0xae, 0x58, 0xa0, 0xad, 0xdf, 0xc5, 0x77, 0x57, 0xc2, 0xb1, 0x13, 0xf3, + 0x5e, 0xd8, 0x7e, 0xef, 0x99, 0x2b, 0x9a, 0x49, 0xb4, 0x08, 0xe0, 0x5b, + 0xed, 0x4e, 0x13, 0xb1, 0xbe, 0x80, 0xb7, 0x54, 0x27, 0x33, 0x92, 0xa3, + 0x71, 0x34, 0x04, 0x78, 0x19, 0xd5, 0x0b, 0x9b, 0x11, 0xc0, 0xbd, 0x1f, + 0x9e, 0xa2, 0xf1, 0xc2, 0x3c, 0xbb, 0x6e, 0xda, 0x4b, 0x69, 0x27, 0x81, + 0xfd, 0xf2, 0x15, 0x63, 0x54, 0x3d, 0xb8, 0xfb, 0x9e, 0x29, 0x1d, 0xd9, + 0x86, 0xc6, 0x3c, 0x0b, 0xb5, 0x13, 0x08, 0x21, 0x10, 0x64, 0xb8, 0xfb, + 0x9e, 0x7b, 0xa9, 0xbd, 0x30, 0x87, 0xbb, 0x65, 0x0a, 0xaf, 0xe3, 0xb1, + 0xff, 0x43, 0x2a, 0xed, 0xd4, 0x4d, 0xbb, 0x69, 0x34, 0x0e, 0xd1, 0x68, + 0xc0, 0xe6, 0xbc, 0xa0, 0x28, 0xc6, 0xa8, 0xf9, 0x39, 0xee, 0xbe, 0x67, + 0x3b, 0xb3, 0xcf, 0x56, 0x83, 0x21, 0xcd, 0x13, 0xc7, 0x54, 0xff, 0x51, + 0x90, 0x09, 0x6c, 0x16, 0xb6, 0xab, 0xfe, 0xa9, 0x6d, 0xab, 0x74, 0xa3, + 0x08, 0xeb, 0x00, 0x88, 0x4d, 0x53, 0xec, 0xba, 0x31, 0xbc, 0x66, 0x34, + 0x1a, 0x02, 0xa8, 0xc1, 0x96, 0x0a, 0x08, 0xc1, 0xdc, 0xb3, 0x35, 0xc6, + 0xaf, 0x2c, 0x33, 0xfd, 0x0d, 0xb5, 0xdf, 0xdb, 0x45, 0xde, 0x1a, 0x4b, + 0xe9, 0x04, 0xe7, 0xf4, 0x76, 0xb6, 0xf7, 0xb4, 0xcb, 0x85, 0x94, 0x10, + 0x05, 0x0a, 0x23, 0x25, 0xc6, 0x2b, 0xea, 0x99, 0x65, 0x2e, 0x06, 0xe1, + 0x05, 0x02, 0xb8, 0x16, 0xc0, 0xec, 0x13, 0x7f, 0xc4, 0x2d, 0x7b, 0x6e, + 0x8e, 0x6c, 0xef, 0x76, 0xfe, 0x1c, 0xb8, 0x2c, 0x58, 0x2f, 0xad, 0x1f, + 0x67, 0xbc, 0x32, 0x19, 0xb1, 0xb5, 0x70, 0x7c, 0x2e, 0x92, 0xa7, 0xb4, + 0x7e, 0x9c, 0xfa, 0x72, 0x34, 0x2e, 0x5e, 0xaf, 0xad, 0xef, 0x54, 0x20, + 0xae, 0xf3, 0xb5, 0x75, 0xa1, 0x74, 0xc9, 0xba, 0x32, 0x6f, 0xbb, 0xb8, + 0xc4, 0x2f, 0x6e, 0xb8, 0x9c, 0x1f, 0x2e, 0xaa, 0xd9, 0x56, 0x4c, 0xd8, + 0x8e, 0xb7, 0xb7, 0x03, 0xbc, 0xed, 0x62, 0xbb, 0xbf, 0x75, 0xa6, 0xe7, + 0x9c, 0x4e, 0x95, 0x2a, 0x55, 0xaa, 0x54, 0xa9, 0x52, 0xa5, 0x4a, 0x95, + 0x2a, 0x55, 0xaa, 0x54, 0xa9, 0x52, 0xa5, 0x4a, 0x95, 0x2a, 0x55, 0xaa, + 0x54, 0xa9, 0x52, 0xa5, 0x4a, 0x95, 0x2a, 0x55, 0xaa, 0x54, 0xc3, 0xeb, + 0x0d, 0xe2, 0xe6, 0x98, 0x2a, 0x55, 0xaa, 0x54, 0xa9, 0x52, 0xfd, 0x33, + 0xd4, 0xce, 0x36, 0x19, 0x3d, 0x6b, 0xfa, 0xf9, 0x48, 0x08, 0x41, 0x53, + 0x3b, 0xfe, 0xbb, 0xae, 0x1b, 0x2c, 0x1b, 0xcb, 0x8d, 0xf3, 0xb6, 0x7b, + 0x2e, 0x69, 0x87, 0x85, 0x59, 0x05, 0x1f, 0xb2, 0x5f, 0x20, 0x25, 0x81, + 0xb8, 0x56, 0xab, 0x4b, 0x52, 0xda, 0x24, 0xc0, 0x59, 0x2e, 0x9b, 0xa3, + 0x45, 0x8b, 0xf2, 0x26, 0xf5, 0xb1, 0xa3, 0xc8, 0x0a, 0x5a, 0xad, 0x5e, + 0x08, 0x8f, 0x10, 0x6a, 0xf6, 0xe3, 0x0c, 0xe3, 0xb0, 0x13, 0xf8, 0xb6, + 0x8a, 0x77, 0xb7, 0x08, 0xf8, 0x9a, 0x86, 0x27, 0x20, 0x83, 0x19, 0xeb, + 0xe9, 0xe8, 0x8c, 0xbe, 0x72, 0x3c, 0x17, 0xbe, 0xfa, 0x50, 0x5e, 0x20, + 0xfa, 0x7c, 0x2c, 0x1f, 0xba, 0x27, 0xdb, 0x00, 0x1d, 0x13, 0x2f, 0xb2, + 0x22, 0x80, 0x53, 0xb5, 0xfd, 0x36, 0x19, 0x32, 0xe4, 0x84, 0x99, 0xc5, + 0x58, 0x9b, 0xf4, 0x45, 0x08, 0xbe, 0x32, 0x33, 0xc5, 0x7a, 0x92, 0x26, + 0x20, 0x5c, 0x41, 0x75, 0xa9, 0xc9, 0x37, 0x3f, 0xac, 0x60, 0x58, 0xe3, + 0x5b, 0xb6, 0x82, 0x84, 0xf2, 0xa6, 0x02, 0x77, 0x6c, 0xdf, 0xce, 0xf8, + 0x86, 0xad, 0x94, 0x37, 0x15, 0xb8, 0xf5, 0xfe, 0x83, 0x14, 0x5c, 0xc1, + 0x63, 0x9f, 0xb8, 0x33, 0xf8, 0x88, 0xfb, 0xc4, 0x97, 0xf6, 0xf7, 0xcc, + 0xd0, 0x7d, 0xeb, 0xa3, 0x87, 0x90, 0x0f, 0x1c, 0x64, 0xa1, 0xb6, 0xc0, + 0x63, 0x9f, 0xb8, 0x93, 0xbd, 0xd7, 0x5e, 0xa3, 0xa0, 0x55, 0x7d, 0x7e, + 0x5b, 0x66, 0x9f, 0xda, 0x7e, 0x9b, 0x9c, 0x63, 0x40, 0x45, 0x41, 0xe3, + 0x46, 0x8f, 0x89, 0xde, 0x6e, 0xc3, 0xc2, 0x0a, 0xae, 0x88, 0xb8, 0x04, + 0x95, 0xb2, 0x82, 0xa6, 0x27, 0x11, 0x3e, 0x34, 0xa5, 0x0c, 0x3e, 0x8c, + 0xaf, 0x2e, 0x35, 0x69, 0xfb, 0x6d, 0x0a, 0xe4, 0x28, 0xb9, 0x82, 0x7a, + 0x47, 0xc5, 0x45, 0xca, 0x8b, 0x39, 0xf3, 0x1b, 0xa7, 0x41, 0x53, 0x6e, + 0xa0, 0xaf, 0x95, 0xd4, 0xf1, 0x35, 0x93, 0xda, 0xc6, 0xce, 0xeb, 0x1c, + 0x02, 0x83, 0x19, 0xe8, 0xf7, 0x6b, 0x6f, 0x07, 0xed, 0x66, 0xa5, 0xf0, + 0x25, 0x49, 0x39, 0x3c, 0xfd, 0x21, 0xbc, 0x27, 0x09, 0x60, 0x6c, 0x71, + 0x25, 0xc1, 0x14, 0x6c, 0xb5, 0xa4, 0x4a, 0xe3, 0xd2, 0xa2, 0xa5, 0x01, + 0x6e, 0x79, 0x01, 0xf5, 0x4e, 0x4f, 0xd2, 0x81, 0x5a, 0x0d, 0x78, 0x95, + 0xcf, 0xab, 0xf3, 0xa5, 0xd5, 0xaa, 0x0d, 0x4c, 0x97, 0xa4, 0xc2, 0x88, + 0xfa, 0x50, 0x5a, 0x58, 0x4e, 0xdc, 0x83, 0xec, 0x78, 0x9d, 0x56, 0xe0, + 0xc8, 0xd5, 0x4f, 0x49, 0x00, 0x8c, 0x82, 0xf6, 0xf8, 0xee, 0x76, 0x42, + 0x87, 0xc4, 0xc6, 0x4a, 0x72, 0x39, 0xc1, 0x79, 0xfd, 0x1d, 0xb5, 0x6e, + 0x9f, 0xd7, 0xe6, 0xba, 0xe1, 0x66, 0x8d, 0x13, 0x9d, 0x72, 0xe6, 0xc8, + 0x88, 0x0c, 0x6d, 0xaf, 0x4d, 0x4e, 0x83, 0x23, 0xba, 0xb2, 0x1b, 0x09, + 0x67, 0x44, 0x26, 0x12, 0x16, 0x59, 0x41, 0x7b, 0xa5, 0x4d, 0x6e, 0x44, + 0xff, 0xbe, 0x3b, 0x32, 0x08, 0xaf, 0x26, 0xd9, 0x91, 0xb8, 0x23, 0xaa, + 0x7c, 0x6f, 0xc5, 0x5b, 0x35, 0x2c, 0xa5, 0x8c, 0x84, 0x6d, 0x27, 0x77, + 0x13, 0xae, 0x6c, 0xab, 0x24, 0xc6, 0xf7, 0x53, 0x73, 0x29, 0x79, 0x46, + 0xdd, 0x46, 0xab, 0x45, 0x31, 0x1f, 0x77, 0x56, 0x3c, 0xb7, 0x78, 0xbb, + 0x0e, 0x79, 0xb7, 0x17, 0x1c, 0xe0, 0xf9, 0x52, 0x39, 0xbf, 0x58, 0x20, + 0x33, 0x91, 0x15, 0xb8, 0xd6, 0xb5, 0xdd, 0xd8, 0x89, 0xc7, 0x2b, 0xc9, + 0x9e, 0xf3, 0xfa, 0x92, 0x2d, 0x59, 0xb8, 0x2f, 0x0a, 0xbd, 0xba, 0x23, + 0xea, 0x29, 0xb7, 0x26, 0xcd, 0xcc, 0xcc, 0x04, 0xe1, 0x9d, 0x3b, 0x77, + 0xf6, 0xc4, 0x9d, 0xab, 0x7e, 0x1b, 0xb8, 0x03, 0x05, 0xe8, 0xda, 0x30, + 0x3a, 0x3a, 0xb4, 0x4d, 0xe3, 0x33, 0xa8, 0xc0, 0x57, 0x51, 0xe7, 0xbe, + 0xb8, 0xab, 0x5f, 0x1c, 0xb0, 0x95, 0x94, 0xa6, 0x5f, 0x9c, 0xad, 0x78, + 0xeb, 0x19, 0xe8, 0x96, 0xf1, 0x1d, 0x5c, 0xea, 0x93, 0x6e, 0x35, 0x2d, + 0x2d, 0x2e, 0xb2, 0xb8, 0xb4, 0xc4, 0xd2, 0xcc, 0x8c, 0x82, 0x69, 0xc5, + 0xda, 0xe0, 0xeb, 0x26, 0xdd, 0xcc, 0x0c, 0x14, 0x5d, 0xb8, 0x6f, 0x83, + 0x3a, 0xbe, 0xb3, 0xaf, 0x00, 0xe0, 0x66, 0xdb, 0xf0, 0xbe, 0xa8, 0x63, + 0xa0, 0xfc, 0xf4, 0x7b, 0xb9, 0xe1, 0x0b, 0xcf, 0xd3, 0xb8, 0xe3, 0xdd, + 0x00, 0x3c, 0xff, 0x97, 0xcf, 0x23, 0x3f, 0xf5, 0xee, 0x81, 0xf5, 0x28, + 0x5b, 0xe1, 0x41, 0x78, 0x8b, 0x7c, 0x0c, 0x44, 0xf5, 0x6a, 0xc9, 0x00, + 0xb5, 0x06, 0x39, 0x86, 0xf7, 0xd3, 0x94, 0x3e, 0x97, 0x0c, 0x4c, 0xcb, + 0xc8, 0xac, 0xcf, 0x4a, 0xd4, 0x5d, 0xcf, 0x87, 0x87, 0xcf, 0xb1, 0x7e, + 0x46, 0xaf, 0x6a, 0x7b, 0xbc, 0xaf, 0x84, 0x9b, 0x25, 0x00, 0x17, 0xb8, + 0xd9, 0x36, 0x6c, 0x51, 0x33, 0xa1, 0xd7, 0x7c, 0xe8, 0x7e, 0x7b, 0x9a, + 0xd2, 0x8d, 0x37, 0x2b, 0xa0, 0xd6, 0x8c, 0xe5, 0x00, 0x32, 0x5a, 0xe6, + 0xc4, 0xb7, 0x0e, 0xd1, 0x10, 0x02, 0xf9, 0x4c, 0x8d, 0xf2, 0x75, 0xaa, + 0x0f, 0xc5, 0xe3, 0x96, 0xb3, 0xce, 0x75, 0x0a, 0x36, 0x5a, 0x7b, 0xfc, + 0x20, 0x35, 0x5c, 0xca, 0xcb, 0x4d, 0x2a, 0x37, 0xa9, 0x19, 0xd0, 0x79, + 0xf4, 0xa1, 0x30, 0x5d, 0x69, 0x1c, 0x1e, 0x7d, 0x08, 0xef, 0x9d, 0x82, + 0xea, 0xf1, 0x39, 0xda, 0xbf, 0x5f, 0x02, 0x04, 0xf2, 0x1b, 0xf7, 0x05, + 0xfd, 0x97, 0xd9, 0xdf, 0x2f, 0x31, 0xd5, 0x02, 0xd1, 0x08, 0xef, 0x45, + 0x77, 0xff, 0xbe, 0xce, 0xfe, 0xfe, 0xf0, 0xd7, 0xb4, 0x7d, 0xbb, 0xc7, + 0x27, 0xff, 0x5d, 0x68, 0xfa, 0x8b, 0xff, 0x5e, 0x2d, 0x37, 0x5b, 0x0e, + 0xfb, 0xdb, 0x67, 0x94, 0x53, 0xd4, 0x67, 0x3e, 0x1f, 0x6b, 0x8b, 0xe5, + 0x3a, 0x7c, 0xf1, 0xc2, 0xcd, 0xb4, 0x9e, 0x04, 0xcf, 0x32, 0x71, 0x6b, + 0x85, 0x6b, 0x79, 0xcf, 0x3d, 0x06, 0x0f, 0xdd, 0x05, 0xc0, 0xed, 0x0f, + 0xdc, 0x07, 0xeb, 0x07, 0x38, 0xea, 0xf6, 0xdb, 0x8f, 0x2d, 0x9b, 0x71, + 0xb3, 0x21, 0x5c, 0x20, 0x7a, 0xbf, 0x76, 0x23, 0xcb, 0x20, 0xec, 0x98, + 0xe7, 0x88, 0xf0, 0xde, 0x93, 0x14, 0xb6, 0xe3, 0x0c, 0xc8, 0x4a, 0x64, + 0x7b, 0xe3, 0x86, 0x0d, 0x7b, 0x1d, 0x81, 0xf7, 0xd2, 0x11, 0xe6, 0x9e, + 0x69, 0xf7, 0x4d, 0x73, 0x2e, 0xb6, 0xe3, 0x4b, 0x5b, 0xd2, 0x06, 0x6b, + 0xd9, 0x40, 0xad, 0x04, 0xd9, 0x40, 0xad, 0x88, 0x2c, 0x28, 0x96, 0x48, + 0xb2, 0x61, 0xd6, 0x4d, 0xdf, 0xcc, 0x17, 0x41, 0x5c, 0xc6, 0xe9, 0xb5, + 0x81, 0xd7, 0xa6, 0x1b, 0x3f, 0xf7, 0xed, 0xbe, 0xb8, 0x94, 0x08, 0x72, + 0xca, 0x9e, 0x67, 0x5d, 0xc9, 0x62, 0xf7, 0xeb, 0x5f, 0xc9, 0x5e, 0xc2, + 0x9f, 0x26, 0x30, 0x2a, 0xe3, 0x58, 0x95, 0x41, 0xbd, 0x99, 0xf8, 0xde, + 0xae, 0xf6, 0x54, 0x9b, 0x94, 0x3e, 0xc9, 0x7e, 0x3c, 0xbe, 0x1f, 0xb8, + 0x2a, 0x9e, 0x67, 0x1d, 0x6f, 0xe2, 0xac, 0x86, 0x6a, 0x9d, 0xe5, 0xa7, + 0xac, 0xe3, 0x4d, 0x9c, 0xf9, 0x9b, 0x7f, 0x88, 0xa4, 0x33, 0xeb, 0x67, + 0x2d, 0xf8, 0xd6, 0x3a, 0xde, 0x84, 0x8c, 0xc1, 0xb8, 0x5e, 0xef, 0x7d, + 0x49, 0xe8, 0x71, 0x0d, 0x7d, 0x5c, 0xfe, 0x74, 0x83, 0x3a, 0xbe, 0xcf, + 0xab, 0xdb, 0x75, 0xe4, 0x7e, 0x5d, 0x99, 0xc8, 0x51, 0x5f, 0x6e, 0xb2, + 0x79, 0xb4, 0x4c, 0xdd, 0x81, 0xda, 0xb1, 0x1a, 0x2e, 0x35, 0xa0, 0xc2, + 0xec, 0xb7, 0x42, 0xe7, 0xcc, 0xa9, 0x0f, 0x96, 0x02, 0xf0, 0x54, 0x12, + 0x80, 0xaa, 0xf5, 0x92, 0xa4, 0xdb, 0x81, 0x82, 0xee, 0x5f, 0x1a, 0xb0, + 0x96, 0x3c, 0x2b, 0x94, 0xf3, 0x72, 0x0c, 0x92, 0x6b, 0xf7, 0x49, 0x33, + 0xd9, 0x5c, 0x00, 0xd1, 0x32, 0xe1, 0x48, 0xdc, 0xa6, 0xbd, 0xb0, 0x7c, + 0x28, 0x88, 0xb7, 0x35, 0x5e, 0x51, 0xe9, 0xc6, 0x2b, 0x65, 0x9a, 0xcb, + 0x12, 0x3a, 0xf0, 0xe9, 0xdf, 0xbf, 0x85, 0xfb, 0xee, 0xbf, 0x0f, 0xef, + 0xac, 0x07, 0x14, 0x98, 0xab, 0xd6, 0xc8, 0x05, 0xe3, 0x1d, 0xd1, 0xfa, + 0x27, 0x85, 0xe3, 0xfb, 0x17, 0x8f, 0xb7, 0xc3, 0x6b, 0x01, 0x6c, 0x05, + 0x10, 0xac, 0xa6, 0xf5, 0x1c, 0xe8, 0xe4, 0x90, 0x7e, 0x1b, 0x32, 0x2e, + 0x74, 0x3d, 0x2a, 0x5b, 0xca, 0x3d, 0xf9, 0x6c, 0x70, 0xaf, 0xdd, 0x86, + 0x46, 0x9e, 0xef, 0xa9, 0xe7, 0xb2, 0xa5, 0x7a, 0x78, 0xbf, 0xd6, 0xea, + 0x77, 0x5e, 0x03, 0x64, 0xdf, 0x7c, 0x11, 0xd9, 0xdc, 0x45, 0xc9, 0x1b, + 0x87, 0xd0, 0xf9, 0xe4, 0x4d, 0xd2, 0xff, 0x91, 0xfb, 0x99, 0x73, 0xce, + 0xfb, 0x46, 0xaa, 0x0b, 0x0c, 0xae, 0xcf, 0x8f, 0x80, 0xb7, 0xb7, 0xff, + 0x89, 0x53, 0x56, 0xdc, 0xdb, 0x62, 0x69, 0xde, 0x4e, 0x08, 0xd5, 0x4a, + 0xaa, 0xcb, 0xcb, 0xaf, 0xf4, 0x9e, 0xd7, 0x49, 0xcf, 0x5c, 0xfd, 0x14, + 0x47, 0xc1, 0xc4, 0xd7, 0x73, 0x0e, 0x4c, 0xba, 0xf0, 0x88, 0x27, 0xa9, + 0x02, 0x95, 0xa1, 0xac, 0x0e, 0x5f, 0xde, 0x6a, 0xdb, 0x06, 0x21, 0x70, + 0x3c, 0x12, 0x9e, 0x0f, 0xcc, 0x98, 0x16, 0x50, 0x07, 0x90, 0x06, 0xca, + 0xdb, 0x9f, 0xa4, 0xd1, 0x42, 0x41, 0x2c, 0x0a, 0x0e, 0x78, 0x59, 0x60, + 0x45, 0xc1, 0x12, 0x86, 0xa9, 0xf3, 0x5a, 0xb5, 0x5a, 0x7b, 0xc7, 0xb5, + 0x19, 0x38, 0x01, 0xec, 0x12, 0xf0, 0x8f, 0xd0, 0xfb, 0xcc, 0x65, 0xf5, + 0xcd, 0x40, 0x01, 0xb4, 0xea, 0xcf, 0xb4, 0x10, 0x80, 0xbb, 0x1c, 0xee, + 0x6f, 0xfd, 0x01, 0x75, 0xad, 0xa9, 0xd8, 0x0f, 0x97, 0x47, 0xbd, 0x60, + 0x59, 0x59, 0x1f, 0xb6, 0x64, 0x15, 0xa8, 0x69, 0x18, 0x96, 0xf8, 0xb6, + 0xb6, 0xb1, 0xec, 0x51, 0x3b, 0xaa, 0x82, 0x95, 0xf5, 0x2e, 0x2c, 0x69, + 0x30, 0xd7, 0xb2, 0x47, 0x55, 0xc7, 0xb3, 0x14, 0x3d, 0x1a, 0xb5, 0xaf, + 0xb6, 0x12, 0x81, 0x5b, 0x71, 0x79, 0x5f, 0x6e, 0x21, 0x34, 0x9c, 0x69, + 0x6e, 0x42, 0x39, 0xc4, 0x8f, 0x1f, 0x55, 0x00, 0xa3, 0xb9, 0xb1, 0x3c, + 0xb7, 0x3d, 0xe9, 0x71, 0xdf, 0xd5, 0xba, 0xdf, 0xb9, 0x5e, 0x50, 0xff, + 0x72, 0x8b, 0xd2, 0xc7, 0x55, 0xbf, 0xcc, 0x84, 0xc7, 0xbf, 0xdc, 0x0a, + 0xf2, 0x1a, 0x8d, 0xe5, 0x27, 0xa9, 0x3a, 0x73, 0xc8, 0xe5, 0xd5, 0xee, + 0xda, 0xc3, 0xc1, 0xb4, 0x86, 0x81, 0x67, 0x0d, 0xa3, 0xd9, 0x23, 0x87, + 0x02, 0x78, 0xd6, 0x23, 0xdf, 0x99, 0xa3, 0xef, 0x53, 0x6e, 0xac, 0x6f, + 0xb6, 0x35, 0xeb, 0x32, 0xab, 0x4f, 0x6b, 0x05, 0xf4, 0xf9, 0x1a, 0x15, + 0xa7, 0x42, 0x1d, 0x28, 0xae, 0x9f, 0xa2, 0xb1, 0x3c, 0x47, 0x3f, 0xa0, + 0x96, 0xf4, 0xdb, 0x88, 0x60, 0x0c, 0xb6, 0x77, 0x3b, 0x40, 0xb3, 0x55, + 0xc3, 0x93, 0x2d, 0x5c, 0x51, 0x22, 0xe3, 0x16, 0xc0, 0xcb, 0x11, 0x9c, + 0xf1, 0xbe, 0xc4, 0x93, 0x1e, 0xae, 0xc8, 0x03, 0x05, 0xba, 0x5e, 0x9b, + 0x4a, 0xf1, 0x66, 0xaa, 0x4b, 0xf7, 0x44, 0x6c, 0xd4, 0x97, 0x6b, 0x78, + 0x7e, 0x13, 0xd7, 0x29, 0x50, 0x5f, 0xae, 0x6a, 0x88, 0x95, 0xad, 0x22, + 0xf0, 0x69, 0xe0, 0xb7, 0x68, 0xaf, 0x18, 0x38, 0xa7, 0xb9, 0x27, 0x13, + 0x2c, 0x83, 0xdf, 0x8b, 0x00, 0x29, 0xed, 0xf7, 0x0d, 0xc9, 0x4d, 0x15, + 0x97, 0xeb, 0xb8, 0x01, 0x10, 0xda, 0xf3, 0x3d, 0x5c, 0xfd, 0xbc, 0xe2, + 0x8a, 0x92, 0x06, 0x73, 0x35, 0xa9, 0xb7, 0xc2, 0xba, 0xe6, 0x46, 0x0a, + 0x34, 0x1a, 0xd1, 0x27, 0x7c, 0x03, 0xd4, 0x02, 0x68, 0xaf, 0xb4, 0xa9, + 0x14, 0xf7, 0x52, 0x5d, 0xfa, 0x1c, 0x47, 0xfc, 0x23, 0x6c, 0xb7, 0x20, + 0x7e, 0x06, 0x28, 0xa6, 0xda, 0xaf, 0xde, 0xf7, 0xc7, 0xee, 0xc9, 0x26, + 0x85, 0x7c, 0x19, 0xbc, 0x1c, 0x52, 0x97, 0x6b, 0x34, 0xbb, 0x41, 0x1d, + 0x5f, 0x53, 0x83, 0xc8, 0x35, 0xbc, 0x01, 0x13, 0x13, 0x0a, 0xfa, 0xb4, + 0x67, 0x42, 0x45, 0x1d, 0x6d, 0x24, 0x97, 0x61, 0xe2, 0x27, 0x8a, 0x3a, + 0x6b, 0x83, 0x00, 0xb4, 0x65, 0x00, 0x52, 0x07, 0x8e, 0x86, 0xe9, 0x8d, + 0xbd, 0x70, 0xbd, 0xc8, 0xd1, 0x86, 0x82, 0x48, 0xed, 0xdb, 0xa3, 0xd2, + 0x3e, 0xb9, 0x29, 0x56, 0xc8, 0x90, 0x70, 0xac, 0x00, 0xac, 0x65, 0x74, + 0xb8, 0x4f, 0xba, 0xdb, 0xbf, 0x1b, 0x24, 0xb8, 0xfa, 0xea, 0x7b, 0x83, + 0xe8, 0xeb, 0xae, 0x8b, 0x43, 0xb5, 0x88, 0x00, 0xb5, 0x96, 0x46, 0xfb, + 0x00, 0xb5, 0x6e, 0xff, 0x2e, 0xf0, 0x1b, 0x61, 0x99, 0x09, 0xe5, 0xde, + 0x75, 0x9d, 0x15, 0xd6, 0xcb, 0xab, 0x1f, 0x87, 0x09, 0xd3, 0x70, 0xfa, + 0xfc, 0x68, 0x34, 0x1a, 0x41, 0xfb, 0x15, 0x29, 0xb2, 0x6f, 0x5f, 0x83, + 0x3d, 0xc5, 0x06, 0x07, 0x1a, 0xb0, 0x67, 0x1f, 0x70, 0x00, 0x8e, 0xee, + 0xd1, 0xdb, 0x0f, 0x34, 0x38, 0xb0, 0x07, 0xf6, 0xe8, 0xf5, 0xc6, 0xd1, + 0xb0, 0x8c, 0xc6, 0x51, 0xd5, 0xd6, 0x7f, 0xdf, 0x60, 0xf0, 0xb8, 0xd9, + 0x39, 0x40, 0xfd, 0xe2, 0x3a, 0xd7, 0x09, 0x7a, 0x06, 0xd9, 0xb3, 0x27, + 0x49, 0x89, 0x6c, 0x3b, 0xd7, 0x6b, 0xa2, 0x06, 0x33, 0x25, 0x2a, 0x20, + 0x20, 0xc5, 0xa3, 0xd5, 0x3d, 0xdc, 0xf3, 0xce, 0x17, 0x7c, 0x35, 0x80, + 0xaa, 0x75, 0xa1, 0x15, 0x1b, 0x37, 0x8b, 0xbf, 0xe7, 0x9a, 0x8b, 0xbd, + 0xfb, 0x13, 0x8e, 0x60, 0x5e, 0x86, 0x13, 0xca, 0xdc, 0x6a, 0x01, 0xcb, + 0x0a, 0xbe, 0x82, 0x5a, 0xdd, 0xfe, 0x14, 0x20, 0xa0, 0x22, 0x55, 0xdf, + 0xa5, 0x69, 0x5e, 0x7b, 0x6a, 0x5b, 0xf1, 0x3d, 0x13, 0x8e, 0x7e, 0xf6, + 0xf2, 0x25, 0xf3, 0xd6, 0x46, 0xaf, 0x03, 0x25, 0x27, 0x43, 0x46, 0x08, + 0xe8, 0x48, 0x26, 0xb3, 0x82, 0x87, 0x62, 0xef, 0xb2, 0x84, 0x2f, 0x91, + 0x8e, 0x7d, 0xfd, 0x15, 0x91, 0x43, 0x23, 0x9d, 0xf0, 0x19, 0xc4, 0x33, + 0xef, 0x58, 0x63, 0x80, 0x2f, 0x55, 0x07, 0x14, 0x7c, 0x4b, 0xbf, 0x7b, + 0x9d, 0xaf, 0x4a, 0x5c, 0xba, 0xea, 0xfd, 0x2d, 0x82, 0x2e, 0x0a, 0xa8, + 0x35, 0x67, 0x60, 0x60, 0xab, 0x8d, 0x63, 0x6a, 0xfb, 0x39, 0x07, 0xda, + 0x56, 0x1e, 0x03, 0xd4, 0x92, 0x52, 0xb5, 0x83, 0x79, 0x72, 0x0d, 0xea, + 0xec, 0x13, 0x4e, 0xc6, 0xe4, 0x87, 0xd0, 0x2f, 0x17, 0xa9, 0xea, 0x1f, + 0xd8, 0x8a, 0x41, 0xc5, 0xac, 0xfd, 0xb1, 0xe1, 0x5a, 0x6d, 0x2b, 0x3e, + 0xfe, 0x9e, 0x8b, 0x0f, 0xb4, 0x71, 0xf5, 0xb1, 0xbe, 0xfc, 0x95, 0x97, + 0x5f, 0xd3, 0xe5, 0xb6, 0x4b, 0xbe, 0x0f, 0xac, 0x8b, 0x80, 0xa6, 0x40, + 0x81, 0xa2, 0x2e, 0xbb, 0xec, 0xb2, 0x00, 0x32, 0x75, 0x29, 0x67, 0x14, + 0x98, 0xea, 0x97, 0xc3, 0x34, 0x06, 0x76, 0x75, 0x29, 0x21, 0x5c, 0xea, + 0x6c, 0xf3, 0x4c, 0x04, 0x90, 0x65, 0x80, 0x54, 0x06, 0x84, 0x75, 0xa1, + 0x6d, 0x9e, 0x3a, 0x75, 0xaa, 0x07, 0x72, 0x05, 0x70, 0xe6, 0xec, 0xd9, + 0x00, 0xbc, 0x65, 0xd2, 0x19, 0x9b, 0x46, 0x06, 0xa8, 0xb5, 0xae, 0x70, + 0x69, 0x90, 0xd7, 0xa4, 0xed, 0x81, 0x7a, 0x9d, 0x3d, 0xcb, 0xa5, 0xeb, + 0xd6, 0x05, 0x79, 0x0d, 0x14, 0xcc, 0x84, 0x01, 0x36, 0x6d, 0xbb, 0x92, + 0x75, 0xba, 0x1e, 0xa6, 0xbe, 0x2e, 0xe3, 0xf0, 0x01, 0xe0, 0xbf, 0xa8, + 0x7c, 0x49, 0xef, 0x3e, 0x6c, 0xb5, 0x3c, 0x8f, 0xbc, 0xeb, 0xd2, 0x5c, + 0xe9, 0xbd, 0x5e, 0x7a, 0x16, 0xe8, 0x2a, 0x9f, 0x15, 0x34, 0x80, 0x43, + 0xdf, 0x9b, 0xa6, 0xb2, 0xa1, 0x42, 0xab, 0xdd, 0x20, 0x23, 0x0a, 0x34, + 0x3b, 0xaa, 0xaf, 0x64, 0x80, 0x59, 0xe6, 0x9d, 0xbf, 0xec, 0x34, 0x29, + 0xe4, 0x4b, 0xb4, 0xbd, 0x70, 0x7b, 0xb8, 0x4d, 0x8f, 0x13, 0x64, 0x73, + 0x40, 0x37, 0x02, 0xd4, 0x0a, 0xd2, 0xba, 0x02, 0x44, 0x2e, 0x80, 0x6e, + 0x01, 0xc8, 0x65, 0x65, 0xa3, 0xbb, 0xd2, 0x26, 0x43, 0xaf, 0x4a, 0xa2, + 0x48, 0xab, 0xdd, 0x60, 0xa1, 0x79, 0x82, 0xaa, 0x2c, 0x50, 0xa9, 0x3d, + 0x44, 0xe9, 0xfa, 0x3b, 0x11, 0x4e, 0x17, 0xe9, 0x67, 0xa8, 0xc6, 0x07, + 0xaa, 0x44, 0x8e, 0xee, 0x15, 0xdb, 0x11, 0x35, 0xf5, 0x8e, 0xb3, 0x70, + 0xfd, 0x6d, 0x2a, 0x7a, 0xa4, 0x00, 0xb2, 0x8b, 0x2b, 0x0a, 0x9c, 0x38, + 0x36, 0x4d, 0xe1, 0xfa, 0xdb, 0xe8, 0xd2, 0x65, 0x76, 0xa5, 0xc6, 0xa7, + 0x3f, 0xf3, 0x69, 0xda, 0x2d, 0x49, 0x5b, 0x3f, 0x89, 0x09, 0xa0, 0xfa, + 0xc2, 0x1c, 0xdb, 0x27, 0xfa, 0x3f, 0x81, 0x0a, 0xfd, 0xee, 0xfb, 0xc4, + 0xb1, 0x1a, 0xa5, 0x1b, 0x6f, 0x61, 0xfa, 0xd1, 0x87, 0xc3, 0xb2, 0xb2, + 0x19, 0x4a, 0x37, 0xde, 0xc2, 0x5c, 0xa3, 0x46, 0x21, 0x5f, 0xa2, 0xab, + 0xe9, 0xac, 0x63, 0x1f, 0xdf, 0xcb, 0x3d, 0x0f, 0xdc, 0xc7, 0x78, 0x47, + 0x52, 0x7f, 0xb6, 0x16, 0x40, 0x9f, 0x2b, 0xdb, 0xc6, 0xc8, 0x95, 0x72, + 0xf0, 0x9d, 0x85, 0xe8, 0x58, 0x8a, 0x3e, 0xa7, 0x2b, 0xbc, 0x65, 0x4d, + 0xd0, 0x28, 0x1b, 0x92, 0x55, 0x6f, 0xd6, 0x68, 0xb6, 0x9a, 0x14, 0xf2, + 0x05, 0x9a, 0xad, 0x26, 0xcd, 0x95, 0xf0, 0xdd, 0x6f, 0x61, 0x44, 0xfd, + 0x86, 0xcc, 0xfb, 0x75, 0x93, 0xd6, 0xc4, 0xcd, 0x3d, 0xf7, 0x18, 0xfb, + 0x1f, 0x99, 0xe3, 0x7b, 0xdf, 0x7c, 0x34, 0x02, 0xd5, 0x02, 0x05, 0xd9, + 0xfa, 0xf5, 0x9d, 0x1f, 0x88, 0xc4, 0xbd, 0x3d, 0x7b, 0x9a, 0x67, 0xab, + 0xff, 0x14, 0xe6, 0xd7, 0x10, 0x2c, 0x63, 0xcb, 0xd4, 0xcd, 0x56, 0x69, + 0xfd, 0x38, 0xcd, 0x95, 0xba, 0x9a, 0x84, 0xc1, 0x8a, 0x33, 0xf5, 0x8d, + 0xdb, 0x02, 0x82, 0xf4, 0x71, 0x5b, 0x66, 0xbf, 0xe3, 0xf6, 0x86, 0x95, + 0x10, 0x05, 0x6e, 0x78, 0xff, 0x5e, 0xea, 0xcd, 0x1a, 0xa5, 0x42, 0x99, + 0xc7, 0xbe, 0xf7, 0x50, 0xc4, 0x8e, 0x29, 0xef, 0xc7, 0x2f, 0xd7, 0xf9, + 0xa1, 0x35, 0xfb, 0x8f, 0x0d, 0xcf, 0xaa, 0x7e, 0xff, 0x2f, 0xf8, 0xc9, + 0x3f, 0x9c, 0x86, 0xc5, 0xab, 0x06, 0x96, 0x15, 0x3f, 0xa7, 0x53, 0xa5, + 0x4a, 0x95, 0x2a, 0x55, 0xaa, 0x54, 0xa9, 0x52, 0xa5, 0x4a, 0x95, 0x2a, + 0x55, 0xaa, 0x54, 0xa9, 0x52, 0xa5, 0x4a, 0x95, 0x2a, 0x55, 0xaa, 0x54, + 0xa9, 0x52, 0xa5, 0x4a, 0x95, 0x2a, 0xd5, 0xf0, 0x72, 0x76, 0xbe, 0xde, + 0x35, 0x48, 0x95, 0x2a, 0x55, 0xaa, 0x54, 0xa9, 0xfe, 0x19, 0x6a, 0xfe, + 0x02, 0xd9, 0x31, 0x1f, 0xcb, 0x16, 0xd6, 0x17, 0xf0, 0x3c, 0x2f, 0x00, + 0x3d, 0x25, 0x01, 0x9f, 0x92, 0xf2, 0x5e, 0x88, 0x8f, 0xd6, 0x93, 0x3e, + 0x0a, 0x1f, 0x1a, 0xac, 0x35, 0x64, 0xf9, 0xc2, 0x11, 0xd6, 0x2c, 0xef, + 0xfd, 0xeb, 0x30, 0x08, 0xfa, 0x12, 0xaf, 0xd3, 0x5a, 0xd2, 0xb6, 0xf5, + 0x87, 0x9a, 0xe6, 0x43, 0xbc, 0xa4, 0xfa, 0x0d, 0x2b, 0x61, 0x7d, 0xf0, + 0x0c, 0x1a, 0xb2, 0x85, 0x50, 0xce, 0xe6, 0x96, 0x27, 0x72, 0x10, 0xbf, + 0x9a, 0x2d, 0x9d, 0x1e, 0x11, 0x05, 0x6e, 0xe5, 0x64, 0x86, 0xb6, 0xec, + 0x22, 0xc8, 0x21, 0x1c, 0x49, 0x5b, 0x76, 0xc9, 0x89, 0xd8, 0xa7, 0xa5, + 0xc6, 0x59, 0xdd, 0x15, 0x3c, 0x78, 0xd3, 0x2e, 0x6e, 0xfd, 0xc6, 0x41, + 0x00, 0xb5, 0xd4, 0x61, 0xf3, 0x51, 0xf9, 0x67, 0x1e, 0x3d, 0x14, 0xc0, + 0xb5, 0x6e, 0x6d, 0x1d, 0xa2, 0xe9, 0x49, 0xc6, 0xaf, 0x1c, 0x47, 0xf8, + 0xf0, 0x5b, 0x0f, 0x1c, 0xd4, 0xed, 0xa0, 0x40, 0x5a, 0x05, 0x34, 0xe0, + 0xca, 0x53, 0x1f, 0xd5, 0x1b, 0x18, 0x57, 0x4d, 0x7f, 0x48, 0x1b, 0x07, + 0x56, 0x05, 0xd5, 0x19, 0x12, 0xa8, 0x25, 0xb2, 0x82, 0xa6, 0xd7, 0x24, + 0xe7, 0xe4, 0x82, 0x76, 0x2a, 0x08, 0x55, 0x1e, 0x6e, 0x98, 0xb6, 0xe9, + 0x49, 0x9a, 0x28, 0x7b, 0xc2, 0x2a, 0x57, 0x64, 0x05, 0x05, 0x2f, 0xa7, + 0xea, 0x74, 0xb2, 0xa9, 0x9c, 0x15, 0xf5, 0x47, 0xf1, 0x11, 0x8f, 0x6f, + 0x29, 0x95, 0x5d, 0x42, 0xa7, 0xc1, 0x28, 0xcc, 0x6c, 0xb0, 0xda, 0x48, + 0x4a, 0x42, 0xd0, 0xf2, 0x21, 0xef, 0x08, 0x5a, 0x52, 0xe2, 0x75, 0x24, + 0x6e, 0x56, 0x04, 0x1f, 0x20, 0xbb, 0x96, 0x93, 0x47, 0x57, 0x17, 0xde, + 0x92, 0x12, 0x1c, 0x05, 0xce, 0x32, 0xbb, 0xe3, 0xf9, 0xe0, 0x3a, 0x7a, + 0x1f, 0x10, 0x6a, 0xbf, 0xf5, 0xec, 0xd6, 0x76, 0xba, 0x2e, 0x21, 0xec, + 0x2a, 0xbe, 0xb4, 0x5a, 0x3a, 0x80, 0x50, 0x09, 0x27, 0xb4, 0x33, 0x96, + 0x85, 0xf9, 0x3e, 0x60, 0xad, 0x7e, 0x80, 0xae, 0x41, 0xb2, 0x3f, 0x70, + 0x5e, 0x93, 0x1c, 0x41, 0x5b, 0x3b, 0xb9, 0x18, 0x1b, 0x76, 0xd9, 0xe7, + 0x52, 0x17, 0x20, 0x00, 0x69, 0x99, 0x25, 0x40, 0x57, 0x97, 0xe3, 0x75, + 0xba, 0x3d, 0xdb, 0xd6, 0xa2, 0xf8, 0x35, 0x28, 0xe7, 0xe6, 0xe8, 0x4a, + 0x65, 0xd3, 0x0e, 0x67, 0x44, 0x26, 0x31, 0x9c, 0x04, 0xd1, 0x92, 0x1d, + 0x19, 0x99, 0x21, 0x1d, 0xa2, 0xbf, 0x3f, 0x77, 0xc4, 0xc5, 0xd3, 0x1f, + 0xb7, 0xbb, 0x23, 0x2e, 0x42, 0x88, 0x00, 0x9a, 0x65, 0xb6, 0xd9, 0x61, + 0x93, 0x2e, 0xc9, 0x99, 0x3d, 0xe9, 0x1a, 0x3a, 0x28, 0x9c, 0x94, 0xdf, + 0x5b, 0xf1, 0xf0, 0x7c, 0x89, 0xeb, 0x08, 0xbc, 0x01, 0xd7, 0xeb, 0xb8, + 0xfa, 0xa5, 0xed, 0x17, 0x1f, 0xaf, 0x73, 0xbf, 0xb4, 0xbd, 0xce, 0xfa, + 0x6b, 0x2b, 0xa7, 0x9f, 0x5e, 0x01, 0x76, 0x2c, 0x29, 0x37, 0x38, 0x03, + 0x82, 0x32, 0x3e, 0x73, 0xf1, 0x38, 0xdb, 0x55, 0x2e, 0x31, 0x7e, 0x69, + 0x09, 0xf3, 0x0d, 0xf5, 0x0e, 0x7a, 0x41, 0x54, 0x71, 0x1b, 0x49, 0xdb, + 0xec, 0xb2, 0x01, 0x46, 0x97, 0x96, 0x18, 0x5d, 0x5a, 0x52, 0xf5, 0x04, + 0x4e, 0x01, 0x1b, 0x07, 0xd8, 0x19, 0xa6, 0xac, 0x41, 0x79, 0x8c, 0x92, + 0x20, 0x58, 0xf6, 0xfe, 0x2e, 0xd1, 0x0b, 0xc8, 0xda, 0xc1, 0x28, 0xb7, + 0xfb, 0x27, 0x87, 0x2e, 0xef, 0xe3, 0x5f, 0xfb, 0x5a, 0x4f, 0x9c, 0x0d, + 0x0e, 0x5b, 0x5a, 0x5c, 0x64, 0xe9, 0xab, 0x5f, 0xe5, 0x22, 0xd4, 0x71, + 0x02, 0xf8, 0x12, 0x70, 0xff, 0xce, 0x9d, 0x6c, 0x18, 0x1d, 0x65, 0x74, + 0xc3, 0x06, 0x5d, 0xae, 0xd9, 0xf8, 0x07, 0x43, 0x95, 0xfb, 0xc4, 0xdc, + 0xf3, 0x5c, 0x33, 0x1e, 0x42, 0xb4, 0xae, 0x19, 0x7f, 0x37, 0xff, 0x75, + 0xe1, 0xfb, 0xbc, 0xe3, 0x5d, 0xef, 0xe8, 0x9b, 0xc7, 0x76, 0x9b, 0x90, + 0x24, 0xbb, 0xbf, 0xe5, 0x57, 0x41, 0x9c, 0xab, 0x7b, 0xc7, 0x50, 0x55, + 0x0c, 0xd4, 0xe8, 0xe3, 0xc8, 0x65, 0x40, 0x55, 0xc2, 0x76, 0xa4, 0x1d, + 0x52, 0xe3, 0x40, 0xbe, 0x18, 0xae, 0x5f, 0xd3, 0x0a, 0xcf, 0xbd, 0x27, + 0xf2, 0x32, 0x80, 0x6b, 0x8d, 0x37, 0x60, 0xfa, 0x75, 0xc2, 0xb6, 0xc7, + 0xdb, 0x69, 0x55, 0x87, 0xb6, 0xb8, 0x84, 0x4b, 0xe3, 0x7d, 0x93, 0xe4, + 0x96, 0x6a, 0x50, 0x5d, 0x20, 0xb7, 0xe2, 0x21, 0x3f, 0xba, 0x17, 0x84, + 0xab, 0x80, 0x5a, 0x63, 0x63, 0x70, 0xff, 0x34, 0x35, 0x5c, 0x44, 0xa3, + 0x41, 0xe9, 0x85, 0x05, 0x95, 0x4f, 0xc3, 0xb4, 0x9a, 0xad, 0x06, 0xde, + 0x33, 0x73, 0xd4, 0xb4, 0x73, 0x79, 0x0d, 0x17, 0xf7, 0xc5, 0x3a, 0xa5, + 0xa7, 0xb5, 0xd3, 0x86, 0x06, 0x6c, 0x55, 0x1f, 0x7d, 0x48, 0xa5, 0x71, + 0x5a, 0xd4, 0xae, 0x13, 0x6c, 0x9f, 0x2f, 0x53, 0xd0, 0xce, 0xf7, 0xe2, + 0x43, 0xca, 0x79, 0xa6, 0x3c, 0x5f, 0xe7, 0xd0, 0xe5, 0xf7, 0xe0, 0x69, + 0xa6, 0x96, 0x10, 0x82, 0xdf, 0xfc, 0x54, 0x51, 0xad, 0x7c, 0x0a, 0xca, + 0x6e, 0x23, 0xa8, 0xf6, 0xd4, 0x84, 0x02, 0xbf, 0xde, 0xf3, 0xbb, 0x97, + 0x72, 0xcf, 0xe3, 0x3a, 0xcd, 0xc7, 0xa0, 0x92, 0x0f, 0xd3, 0x4c, 0xbe, + 0x47, 0xfd, 0x55, 0x6d, 0xa7, 0xd2, 0x23, 0xbd, 0xb3, 0xc6, 0x9f, 0xaf, + 0xce, 0xfc, 0xed, 0x1c, 0x9b, 0x77, 0xdd, 0xd7, 0x03, 0xd0, 0x1a, 0x1a, + 0xa8, 0xf5, 0xd0, 0x5d, 0xf0, 0xfe, 0xc9, 0x70, 0xfd, 0x7b, 0xb3, 0xb0, + 0xa9, 0x0c, 0x8d, 0x3a, 0xcc, 0x4c, 0xc3, 0x47, 0x6e, 0x0b, 0xb7, 0x99, + 0x7e, 0xd8, 0x85, 0xd8, 0x8f, 0x35, 0xf4, 0xe1, 0x6d, 0xc5, 0x41, 0xb2, + 0xe7, 0xa3, 0xb9, 0x67, 0xce, 0xb1, 0xbf, 0x74, 0x0e, 0x5a, 0xf0, 0xf4, + 0x53, 0x68, 0x3f, 0x5f, 0xe2, 0x65, 0xf5, 0x7b, 0xec, 0x77, 0x67, 0x0c, + 0xf2, 0x0f, 0x61, 0x63, 0xd5, 0x3a, 0xf4, 0xb3, 0xb1, 0x4a, 0x7e, 0x80, + 0x66, 0xa7, 0x06, 0x09, 0xc0, 0x30, 0x5b, 0x83, 0xe0, 0x58, 0xe7, 0xfb, + 0x04, 0x1c, 0x79, 0x5c, 0xb0, 0xc2, 0x83, 0xca, 0xea, 0xe7, 0x0a, 0xdd, + 0xaf, 0x9e, 0x42, 0xff, 0xc5, 0xbb, 0xe6, 0x67, 0xf9, 0x29, 0xdd, 0x18, + 0x2c, 0x0b, 0x20, 0xc3, 0x9b, 0x06, 0x57, 0xba, 0x8f, 0x5e, 0xcb, 0x7d, + 0x59, 0x2d, 0xcf, 0xf9, 0x1c, 0x97, 0xd6, 0xb5, 0x39, 0x0a, 0xcf, 0x4e, + 0x53, 0xbf, 0x7e, 0x9c, 0xfd, 0xf9, 0x12, 0x77, 0x7d, 0xac, 0x4e, 0x79, + 0x4b, 0x8b, 0xf2, 0x96, 0x5c, 0x04, 0x2e, 0x65, 0xc2, 0xc1, 0xd2, 0x76, + 0x38, 0xee, 0x40, 0x46, 0x3b, 0x20, 0xe6, 0x2f, 0x11, 0x78, 0x6d, 0x8d, + 0xb4, 0x59, 0x27, 0xa9, 0xd5, 0x24, 0xe5, 0xb2, 0x6d, 0x47, 0xb5, 0x94, + 0x0d, 0x9e, 0x4a, 0x0a, 0x07, 0x71, 0xcb, 0x87, 0x7a, 0xd2, 0x98, 0x3a, + 0x54, 0xab, 0x2d, 0xf2, 0xb9, 0x0c, 0xb9, 0x11, 0x17, 0x34, 0xa0, 0xe5, + 0x73, 0x9f, 0x7f, 0x18, 0xd7, 0x05, 0x77, 0x5d, 0x81, 0xfa, 0x4b, 0xf5, + 0x9e, 0x3c, 0x83, 0xf6, 0x29, 0x1e, 0x5e, 0x4b, 0xbe, 0x24, 0xd9, 0xd0, + 0xad, 0x5d, 0x9f, 0xbc, 0x8d, 0x43, 0x5f, 0xbc, 0x8f, 0xd6, 0x4b, 0x61, + 0x9c, 0xeb, 0xa8, 0x6b, 0x98, 0x2b, 0xc0, 0xeb, 0xf6, 0xc2, 0xb8, 0xba, + 0x9d, 0x36, 0x42, 0x08, 0x1a, 0x2b, 0x50, 0x1c, 0x89, 0x3a, 0xb9, 0x2b, + 0xfb, 0x12, 0x37, 0xeb, 0xf6, 0x82, 0xf5, 0x86, 0x90, 0x6c, 0xff, 0xd3, + 0xda, 0x33, 0x69, 0xf9, 0xd9, 0x8b, 0x38, 0xdb, 0x79, 0x65, 0xf5, 0x84, + 0xff, 0xcc, 0xea, 0x02, 0xc3, 0xd5, 0xa7, 0x09, 0xbc, 0x53, 0x87, 0xdf, + 0xae, 0x97, 0x79, 0xe0, 0x87, 0x56, 0x9a, 0x77, 0x01, 0x7f, 0xdd, 0x79, + 0x05, 0x49, 0xaf, 0xad, 0x9f, 0x19, 0xfc, 0xb3, 0x5b, 0xb3, 0x0a, 0x40, + 0x59, 0xc0, 0x41, 0xa9, 0xea, 0x61, 0x2e, 0x3a, 0xfd, 0xe0, 0x80, 0xaf, + 0x97, 0xbc, 0xd8, 0x12, 0x14, 0xec, 0x20, 0xa3, 0x21, 0x5a, 0xe6, 0x6c, + 0xaf, 0x01, 0xe3, 0x02, 0x66, 0x07, 0x8c, 0x99, 0x4e, 0xb9, 0x30, 0xed, + 0x81, 0x14, 0x24, 0xf6, 0xef, 0x8d, 0x9b, 0xf0, 0x85, 0x84, 0x6b, 0x0d, + 0xb2, 0x5d, 0xc0, 0x1e, 0x37, 0x83, 0x56, 0x47, 0xd5, 0x6d, 0xb5, 0xbb, + 0x53, 0xad, 0x25, 0xa3, 0x70, 0xac, 0x65, 0xd5, 0x3a, 0x49, 0x71, 0xc3, + 0xc4, 0xf7, 0x4b, 0x5b, 0xb3, 0xe2, 0xc7, 0x8b, 0x61, 0xfc, 0x42, 0x23, + 0xda, 0x19, 0xd9, 0xaa, 0xb7, 0x2d, 0x34, 0x3c, 0xb6, 0x16, 0x5d, 0x6c, + 0x5c, 0x4c, 0x12, 0xc4, 0x6a, 0xf6, 0xaa, 0xed, 0xe0, 0x77, 0x11, 0xef, + 0xab, 0x31, 0x37, 0x16, 0xf6, 0x4d, 0xe4, 0x9f, 0x94, 0x19, 0x7f, 0x54, + 0x39, 0x9b, 0x77, 0x4f, 0xce, 0x51, 0xbd, 0xda, 0x05, 0x01, 0xd5, 0x67, + 0x15, 0xd8, 0xcb, 0xfc, 0x30, 0xe7, 0x5b, 0xb3, 0x8c, 0xe5, 0x27, 0x7b, + 0xec, 0x8a, 0xf5, 0x3a, 0x81, 0x1f, 0x96, 0x2b, 0x9c, 0x4c, 0xdf, 0x7a, + 0xc4, 0xb5, 0x1a, 0x38, 0xc6, 0x00, 0xb2, 0x8c, 0x72, 0x8e, 0x37, 0x70, + 0xfb, 0x85, 0x94, 0xeb, 0x8f, 0x81, 0x53, 0x45, 0x7a, 0x1e, 0xe1, 0xd9, + 0xd0, 0x88, 0xa5, 0x6a, 0x20, 0x9c, 0xad, 0x0a, 0xda, 0x18, 0xa8, 0x48, + 0x14, 0xc0, 0x95, 0xa1, 0x90, 0x2f, 0xe3, 0x35, 0x54, 0xdf, 0xb1, 0xeb, + 0x35, 0xc1, 0x69, 0xa3, 0xce, 0x20, 0xc0, 0xaf, 0xe1, 0x8a, 0x31, 0x3c, + 0xd9, 0x42, 0xfd, 0x3a, 0x2b, 0xd4, 0x97, 0x7b, 0x21, 0xfa, 0xa5, 0xf5, + 0x15, 0xaa, 0x7a, 0xbc, 0xda, 0x0e, 0x2b, 0x7d, 0x33, 0x71, 0x1f, 0xa4, + 0x54, 0xa3, 0xd1, 0x08, 0x89, 0xf4, 0x05, 0xae, 0x13, 0x4e, 0x82, 0x80, + 0x23, 0x71, 0xf5, 0xa4, 0x1b, 0x5e, 0x00, 0x44, 0x19, 0x46, 0xe1, 0xd5, + 0xca, 0x75, 0xf2, 0x78, 0xbe, 0xea, 0x13, 0x94, 0xf2, 0x65, 0xaa, 0x8d, + 0x7a, 0x34, 0xec, 0x88, 0x00, 0xf0, 0xa5, 0x90, 0xde, 0xc9, 0x93, 0x03, + 0xd4, 0x97, 0xab, 0x54, 0xa8, 0x50, 0xa5, 0x1a, 0x00, 0xb7, 0xb6, 0x3b, + 0xdb, 0x83, 0x70, 0x69, 0x7d, 0x39, 0xb6, 0xbf, 0x51, 0xb9, 0xa2, 0x40, + 0xd7, 0xf3, 0xc0, 0x69, 0xe3, 0x8a, 0x0a, 0xde, 0xb0, 0x90, 0x81, 0x62, + 0x18, 0xb4, 0x81, 0x58, 0x00, 0xc5, 0xa2, 0x8a, 0x9b, 0x28, 0xaa, 0x74, + 0xb1, 0xcd, 0x14, 0x75, 0xde, 0x89, 0x7d, 0x0d, 0x40, 0x81, 0x9d, 0x26, + 0x74, 0x9e, 0x62, 0x31, 0x8a, 0x57, 0x0b, 0xd2, 0x16, 0x8b, 0x1c, 0xd0, + 0x60, 0x2d, 0x80, 0xab, 0x4f, 0x5a, 0x60, 0xad, 0x61, 0x81, 0x5a, 0x46, + 0x71, 0xb0, 0x56, 0xd2, 0xb6, 0xc3, 0xbf, 0x11, 0x44, 0x3d, 0x29, 0xe0, + 0x6a, 0x7d, 0x88, 0x1f, 0x7f, 0x1c, 0x96, 0x8f, 0xc2, 0x1f, 0x6a, 0xe6, + 0xd6, 0xfe, 0xfd, 0x70, 0xe7, 0x9d, 0x2a, 0x7c, 0x78, 0x14, 0x60, 0x89, + 0xa5, 0xa5, 0x10, 0xbc, 0xb5, 0xc3, 0xf0, 0xb8, 0x76, 0x84, 0xf6, 0xd6, + 0xaa, 0xbb, 0xf4, 0xf8, 0xc0, 0xd5, 0x07, 0x14, 0x1c, 0xab, 0x01, 0x4c, + 0x50, 0xa4, 0x58, 0x6c, 0xe8, 0x30, 0x1c, 0x40, 0x01, 0xb5, 0x1a, 0x0d, + 0x7d, 0x3c, 0x34, 0xc9, 0x6c, 0x1f, 0xc0, 0x51, 0xd8, 0x57, 0xb4, 0xda, + 0x72, 0x02, 0x0e, 0xec, 0x53, 0xed, 0x7c, 0xe0, 0x28, 0xfc, 0xab, 0xe2, + 0x2a, 0x15, 0x70, 0x92, 0x30, 0x26, 0x6b, 0x53, 0x7c, 0xbc, 0xf9, 0x82, + 0x68, 0xad, 0x63, 0x69, 0x9e, 0xd7, 0x3f, 0x8f, 0x23, 0xf4, 0xe4, 0x27, + 0x5a, 0xbe, 0x65, 0x5f, 0xe8, 0x09, 0x6e, 0x06, 0xd8, 0x4e, 0x7a, 0xff, + 0xe8, 0xba, 0xea, 0x7e, 0xd1, 0x0f, 0x6e, 0x6b, 0x24, 0x2d, 0x60, 0xd5, + 0xa0, 0x34, 0xaf, 0x8b, 0x2c, 0xd0, 0x98, 0x74, 0xe0, 0x41, 0x47, 0x70, + 0x9f, 0x94, 0xdc, 0xfc, 0x6f, 0x5d, 0xee, 0xf9, 0x0f, 0x1e, 0x4d, 0x1d, + 0x07, 0x70, 0x9f, 0x03, 0x35, 0xfd, 0x9c, 0x25, 0x3a, 0x52, 0xbd, 0x6f, + 0x5c, 0xa5, 0xef, 0x6f, 0xc3, 0xb5, 0x90, 0x90, 0x77, 0x05, 0xac, 0x48, + 0x6e, 0xf7, 0x24, 0x79, 0x47, 0x30, 0x6b, 0xbd, 0x9f, 0x0b, 0xda, 0x38, + 0xeb, 0x0e, 0x06, 0x68, 0xfb, 0xea, 0x9d, 0x9b, 0x90, 0xe1, 0x3b, 0x4f, + 0xe9, 0x24, 0x80, 0xb5, 0x0c, 0x38, 0x31, 0xab, 0x8e, 0xbd, 0x94, 0xe0, + 0x91, 0xa1, 0xeb, 0xab, 0x77, 0x6f, 0x39, 0x1b, 0xa8, 0x25, 0xa3, 0x5c, + 0x35, 0x69, 0xff, 0x1a, 0x4c, 0x1b, 0xf9, 0x6a, 0x7f, 0xec, 0xbb, 0xb7, + 0x0d, 0xd4, 0x52, 0x13, 0x30, 0x45, 0x41, 0x5d, 0x66, 0xbb, 0x7d, 0x6f, + 0x30, 0xef, 0x8a, 0x3c, 0x7b, 0x1c, 0x2b, 0xd6, 0x96, 0x05, 0x3f, 0x84, + 0x73, 0xd9, 0xea, 0x22, 0xc9, 0xf8, 0x82, 0xae, 0xf4, 0x56, 0xed, 0x1c, + 0xff, 0x32, 0x92, 0x1f, 0x20, 0x5e, 0xb3, 0xa5, 0x2d, 0x03, 0x87, 0x3a, + 0xf3, 0x13, 0x05, 0xa4, 0x3a, 0xf9, 0xdc, 0xb3, 0x41, 0xbc, 0x81, 0x4a, + 0xd9, 0xe0, 0x2a, 0x20, 0x0a, 0x9f, 0xb2, 0xa0, 0x55, 0x26, 0x9d, 0x81, + 0x52, 0x19, 0x50, 0xd5, 0x85, 0xb6, 0x09, 0x44, 0x80, 0x5a, 0x06, 0x90, + 0x15, 0xb7, 0x6b, 0xe0, 0x5c, 0x9b, 0xb6, 0x5d, 0x09, 0xba, 0x0e, 0x06, + 0x7c, 0x65, 0x00, 0x59, 0x97, 0xbe, 0x35, 0xcc, 0x63, 0x96, 0x06, 0xba, + 0x15, 0xd4, 0xe3, 0x22, 0x82, 0x7d, 0x30, 0xf9, 0x0d, 0x88, 0x6b, 0x5d, + 0x0c, 0xec, 0x35, 0x8c, 0x8a, 0xf9, 0x68, 0x9f, 0xcf, 0x4c, 0x62, 0x53, + 0x18, 0x71, 0xad, 0xbe, 0x86, 0x92, 0x9b, 0x15, 0xb4, 0x57, 0x50, 0xbf, + 0x6b, 0x91, 0xe1, 0xee, 0xcf, 0xdc, 0xcd, 0xa1, 0xef, 0x0d, 0x1e, 0xc3, + 0x33, 0xbf, 0x5b, 0xd9, 0x91, 0x34, 0x5b, 0xf5, 0x10, 0x4c, 0x1a, 0x7f, + 0xcf, 0x2e, 0x14, 0x50, 0x2b, 0x33, 0x92, 0x23, 0x33, 0x02, 0xdd, 0x15, + 0x19, 0x8c, 0xef, 0x0b, 0xa7, 0x8b, 0x94, 0x19, 0x90, 0x6d, 0x05, 0xd7, + 0xf2, 0x41, 0xe4, 0x0b, 0xd0, 0x6a, 0x43, 0x3e, 0x07, 0x1a, 0xa9, 0xb5, + 0x7d, 0x7d, 0x85, 0xd2, 0xce, 0x5d, 0x7c, 0xf1, 0xfd, 0x82, 0x43, 0x4f, + 0x1d, 0x09, 0x26, 0x3d, 0x69, 0x39, 0x5b, 0x11, 0xa2, 0x4d, 0xe9, 0xfa, + 0x3b, 0x07, 0x37, 0x86, 0x6c, 0x23, 0x35, 0x1c, 0x6b, 0xff, 0x43, 0xf7, + 0xd2, 0x6e, 0x49, 0x55, 0xf6, 0x4a, 0x13, 0xa1, 0x27, 0x53, 0x6a, 0x15, + 0xc6, 0x28, 0x39, 0x5d, 0x32, 0x6e, 0x8e, 0xbb, 0xbf, 0x70, 0x37, 0x00, + 0x99, 0x11, 0xa1, 0xea, 0xdb, 0x69, 0x23, 0x45, 0x8e, 0xed, 0x13, 0x15, + 0x32, 0x6e, 0x8e, 0xf6, 0xe8, 0x24, 0x1c, 0xab, 0x31, 0x39, 0x52, 0xa6, + 0x74, 0xd3, 0x6e, 0xfe, 0xf3, 0x4d, 0x92, 0xe9, 0xe3, 0x1a, 0x10, 0x86, + 0x82, 0x76, 0x95, 0x37, 0x54, 0x90, 0xd7, 0xdb, 0xf7, 0x52, 0xd5, 0x06, + 0x34, 0x5a, 0x34, 0x5b, 0x75, 0x5c, 0x51, 0x40, 0x08, 0x55, 0x8f, 0x02, + 0x50, 0x7f, 0xd6, 0xbc, 0x30, 0x80, 0xb9, 0x67, 0x6b, 0x8c, 0x5f, 0x59, + 0xee, 0x0b, 0x92, 0x34, 0x6a, 0xae, 0xd4, 0x03, 0xa8, 0x53, 0x3f, 0x60, + 0x54, 0x69, 0xbd, 0x82, 0xea, 0x8d, 0x57, 0xd4, 0x73, 0x89, 0x0d, 0xa2, + 0x5a, 0x38, 0x3e, 0x47, 0x61, 0xa4, 0x14, 0x80, 0xb4, 0x6c, 0x2d, 0x1c, + 0x57, 0xb0, 0xae, 0xad, 0xef, 0x1c, 0xef, 0x89, 0x13, 0xa2, 0xc0, 0xb5, + 0xb7, 0x7e, 0x82, 0xeb, 0xaf, 0x8a, 0x4e, 0x4e, 0x73, 0xfa, 0x7f, 0xbc, + 0xc4, 0xc3, 0x07, 0x1e, 0xe1, 0x96, 0x3d, 0x37, 0xf3, 0xf0, 0x81, 0xf0, + 0xbd, 0xc1, 0x95, 0x95, 0x9f, 0xe1, 0xc9, 0xff, 0x9e, 0x6c, 0xdf, 0x86, + 0x60, 0x49, 0xd9, 0xa4, 0xbe, 0xdc, 0x0c, 0xea, 0x6c, 0x96, 0x01, 0xfc, + 0x4b, 0x7f, 0xc7, 0xb3, 0x70, 0x7c, 0x2e, 0xa8, 0x57, 0x21, 0x5f, 0x60, + 0xe1, 0xf8, 0x5c, 0x0f, 0x50, 0xcb, 0xd8, 0x12, 0xa2, 0x10, 0x40, 0xc3, + 0x92, 0x60, 0x5d, 0x71, 0x09, 0x51, 0x60, 0xeb, 0x3b, 0xc7, 0x13, 0xe1, + 0x5d, 0xa6, 0xbd, 0x20, 0xda, 0x5e, 0x9d, 0x1f, 0xb7, 0x79, 0xdb, 0xc5, + 0x25, 0x5e, 0x3c, 0xfb, 0x34, 0x6f, 0x7d, 0xcb, 0x65, 0x00, 0xbc, 0xed, + 0xe2, 0x12, 0x3f, 0x7e, 0xb9, 0x1e, 0x84, 0x6d, 0x99, 0xf8, 0x9f, 0xfc, + 0xc3, 0xe9, 0x20, 0xfd, 0x08, 0x6f, 0xe9, 0x5b, 0xa7, 0x54, 0xa9, 0x52, + 0xa5, 0x4a, 0x95, 0x2a, 0x55, 0xaa, 0x54, 0xa9, 0x52, 0xa5, 0x4a, 0x95, + 0x2a, 0x55, 0xaa, 0x54, 0xa9, 0x52, 0xa5, 0x4a, 0x95, 0x2a, 0x55, 0xaa, + 0x54, 0xa9, 0x52, 0xa5, 0x4a, 0xb5, 0xba, 0x5e, 0x27, 0x97, 0xc7, 0x54, + 0xa9, 0x52, 0xa5, 0x4a, 0x95, 0x2a, 0xd5, 0x85, 0x90, 0x01, 0x9d, 0x34, + 0x97, 0xed, 0x19, 0x0f, 0x93, 0x81, 0x56, 0xf6, 0x07, 0xdc, 0xf1, 0xf0, + 0xaa, 0x80, 0xa9, 0x21, 0x21, 0x42, 0x6b, 0xd5, 0x6a, 0xf0, 0xad, 0x41, + 0xf5, 0x5a, 0x6b, 0x39, 0x49, 0xe1, 0x61, 0xd3, 0xe6, 0xb2, 0x39, 0x5a, + 0x84, 0xb0, 0x1d, 0x91, 0x15, 0xbd, 0x1e, 0xce, 0xac, 0xed, 0x23, 0x76, + 0xf3, 0xa1, 0xa3, 0xd0, 0x68, 0x2c, 0xcf, 0x97, 0xda, 0xa9, 0x57, 0x7d, + 0x30, 0x1e, 0xcc, 0x34, 0x8c, 0xfa, 0xb0, 0x5b, 0xe7, 0xea, 0xb1, 0x21, + 0x3b, 0xea, 0xe3, 0x52, 0x11, 0x80, 0xb5, 0xb4, 0x55, 0xe1, 0x82, 0xec, + 0xea, 0x72, 0x04, 0x39, 0x5f, 0x7b, 0x15, 0x3a, 0x92, 0xdf, 0x7a, 0xe0, + 0x60, 0xe8, 0x40, 0xec, 0x29, 0xef, 0x3d, 0x03, 0xc6, 0x82, 0x10, 0x46, + 0x21, 0x7c, 0x28, 0xb9, 0x82, 0xda, 0xc9, 0xa6, 0xf2, 0x92, 0x6d, 0xb5, + 0xb9, 0xf5, 0xfe, 0x83, 0x0a, 0x46, 0xa5, 0x3f, 0xcf, 0x2e, 0x6f, 0x2a, + 0x50, 0x5d, 0xd2, 0x1f, 0x0e, 0x6a, 0xb0, 0x55, 0xd3, 0x10, 0x9e, 0x34, + 0xac, 0x0b, 0x88, 0x96, 0xa9, 0x1a, 0x4b, 0x17, 0xa2, 0xbe, 0x3a, 0x97, + 0x48, 0xda, 0x7e, 0x37, 0x02, 0xca, 0x1a, 0xa4, 0x00, 0xbc, 0xa5, 0x67, + 0x6a, 0x6e, 0x4a, 0xa9, 0x40, 0x5e, 0xfa, 0x4b, 0xf6, 0x02, 0xd0, 0x74, + 0x05, 0x99, 0x4e, 0x2f, 0x48, 0xac, 0x20, 0x04, 0x4d, 0x57, 0x50, 0x5d, + 0x6a, 0xd2, 0xa6, 0x4d, 0xc1, 0x2d, 0x20, 0x3a, 0x50, 0x32, 0xb3, 0x3d, + 0xe7, 0x73, 0x78, 0xad, 0x36, 0x6e, 0x3e, 0x17, 0x82, 0xc0, 0x62, 0x6d, + 0x33, 0x0c, 0xb0, 0xc3, 0x38, 0x50, 0x09, 0x5f, 0x04, 0x1f, 0xc1, 0xbb, + 0xd9, 0xe8, 0x8c, 0xbe, 0x49, 0xaa, 0xfb, 0x82, 0x32, 0x32, 0x02, 0x4a, + 0x33, 0xee, 0xa0, 0xc6, 0xe9, 0xa0, 0xee, 0x5b, 0xed, 0xe3, 0x87, 0xe9, + 0x5a, 0x6b, 0x70, 0x46, 0x6e, 0x49, 0x89, 0xf0, 0x51, 0x75, 0xb2, 0x01, + 0x5e, 0x09, 0xc0, 0xaa, 0x78, 0xdc, 0x30, 0x50, 0xab, 0x73, 0x01, 0x5f, + 0xdd, 0xf1, 0xc9, 0x3b, 0x00, 0xa8, 0x37, 0xea, 0xcc, 0xcd, 0x2c, 0x5c, + 0xb0, 0xba, 0xf4, 0xd3, 0xf9, 0xc2, 0xb4, 0x8c, 0x92, 0x60, 0x5a, 0x06, + 0x9a, 0x95, 0x11, 0x19, 0x32, 0x16, 0xd0, 0xce, 0x40, 0xb3, 0x80, 0xc8, + 0x07, 0xcf, 0xed, 0x95, 0x76, 0x5f, 0xa0, 0x96, 0xc8, 0x8a, 0x08, 0x34, + 0x0b, 0x48, 0x0c, 0x27, 0xc1, 0xb4, 0x4c, 0x38, 0x28, 0xb3, 0xcf, 0xf5, + 0x70, 0x58, 0xa0, 0x56, 0xbf, 0xb0, 0x3b, 0xe2, 0x52, 0x6f, 0xd4, 0x69, + 0xf5, 0x71, 0x25, 0xea, 0x07, 0xdc, 0xb2, 0x3f, 0xac, 0xb7, 0xdb, 0x24, + 0xa9, 0x0d, 0xe2, 0x75, 0x6e, 0x79, 0x1e, 0x22, 0x2b, 0x22, 0x76, 0x8d, + 0x9d, 0xa4, 0xeb, 0x71, 0xd2, 0xbd, 0xac, 0x27, 0x6e, 0x95, 0x8f, 0xd0, + 0x47, 0xad, 0xa5, 0x01, 0x45, 0xfd, 0x23, 0xf0, 0x66, 0x7a, 0x41, 0x57, + 0x49, 0x79, 0x0d, 0x7c, 0xca, 0x86, 0x68, 0xd9, 0xd0, 0x29, 0x1b, 0x6c, + 0x35, 0x08, 0xdc, 0x45, 0x2c, 0x5d, 0xbf, 0x75, 0x33, 0xcf, 0xba, 0x6d, + 0x3b, 0x0e, 0xe2, 0x3a, 0x5f, 0xc5, 0xeb, 0xd4, 0xcf, 0xae, 0x49, 0x37, + 0x8a, 0xf2, 0x43, 0xbc, 0x17, 0x05, 0x00, 0xbb, 0x50, 0x1a, 0xdd, 0xb0, + 0x01, 0x3e, 0xfa, 0x51, 0xae, 0xfe, 0xea, 0x57, 0x83, 0xb8, 0xaf, 0x43, + 0x04, 0xa8, 0x75, 0x2e, 0xba, 0xe1, 0x29, 0x05, 0xd6, 0x32, 0x12, 0x42, + 0x70, 0xcd, 0x91, 0x10, 0xe4, 0x94, 0x74, 0xdd, 0xfd, 0x1a, 0x70, 0x97, + 0x0e, 0xc7, 0x7f, 0x75, 0x71, 0x00, 0xd4, 0x5a, 0xc1, 0x59, 0x2d, 0x5f, + 0x5d, 0xf1, 0x5d, 0x2b, 0x9f, 0xb0, 0xfe, 0x92, 0x24, 0xe8, 0x4d, 0x3b, + 0x6c, 0x8f, 0x65, 0x0e, 0xa0, 0x01, 0xbb, 0x8a, 0x1a, 0xa8, 0x75, 0x75, + 0x89, 0x87, 0xbe, 0x5b, 0x63, 0xef, 0x6f, 0x94, 0xb9, 0xe6, 0xc9, 0x3a, + 0x4f, 0xe4, 0x25, 0x87, 0x1a, 0x61, 0xfa, 0x05, 0x1f, 0xb6, 0xbe, 0x0e, + 0x23, 0x4d, 0x8f, 0xe8, 0xe3, 0x70, 0xb3, 0x03, 0x7b, 0x51, 0x8e, 0x6e, + 0x07, 0x51, 0x6e, 0xd0, 0xab, 0x23, 0x7a, 0x94, 0xaa, 0x67, 0x25, 0x53, + 0x4e, 0x86, 0xd9, 0xac, 0x84, 0x23, 0x73, 0x14, 0x4a, 0x05, 0x05, 0xd4, + 0x6a, 0x86, 0xf7, 0x88, 0xea, 0x0b, 0x27, 0x28, 0x01, 0x87, 0x10, 0x94, + 0x97, 0x94, 0x23, 0x4b, 0xf9, 0x78, 0x8d, 0x79, 0xa2, 0x4e, 0x48, 0xf3, + 0x4f, 0x2f, 0x50, 0x02, 0x6a, 0x57, 0x8c, 0x43, 0x4d, 0xa5, 0x33, 0xd0, + 0xad, 0xa9, 0x9d, 0x92, 0xe9, 0x9a, 0xe0, 0x88, 0x3b, 0x4d, 0xfe, 0x3a, + 0x89, 0xbc, 0xdc, 0x05, 0x1e, 0x02, 0xc0, 0x2d, 0x78, 0x78, 0xe4, 0x61, + 0x8b, 0xfa, 0xad, 0xbd, 0x63, 0xf3, 0x35, 0x3d, 0xf5, 0x34, 0x97, 0xc1, + 0xed, 0xdb, 0xd5, 0x32, 0x00, 0x6a, 0x25, 0x68, 0xf6, 0x19, 0xd8, 0xff, + 0xef, 0xe1, 0x1e, 0x13, 0xd1, 0xa8, 0xc3, 0x73, 0xe7, 0x0f, 0x71, 0x72, + 0xdf, 0x73, 0x33, 0xde, 0x33, 0x31, 0x60, 0x56, 0x9f, 0xe3, 0x9e, 0x98, + 0xd6, 0xe8, 0x6f, 0x95, 0xc3, 0xc9, 0x83, 0x16, 0xd4, 0xe5, 0x56, 0xe9, + 0x29, 0xc0, 0xd6, 0xf7, 0xb4, 0x03, 0xcf, 0xfa, 0x12, 0x7c, 0x67, 0x1a, + 0xae, 0x9d, 0x52, 0xeb, 0x59, 0x01, 0x27, 0x6b, 0xe7, 0xbf, 0x1f, 0x7d, + 0x80, 0x5a, 0x95, 0x6d, 0x82, 0xea, 0x73, 0xc9, 0x67, 0x88, 0xdd, 0x97, + 0x75, 0xb3, 0x12, 0xaf, 0xf3, 0xea, 0xa3, 0x3a, 0xa6, 0xae, 0xdd, 0xc5, + 0xf4, 0x77, 0x0e, 0x5d, 0x18, 0x63, 0xeb, 0x55, 0x1b, 0x1a, 0x67, 0xb0, + 0x08, 0x70, 0x61, 0x79, 0x9a, 0xad, 0xee, 0x58, 0xdf, 0xac, 0x0b, 0xde, + 0x7c, 0x90, 0xbf, 0xaf, 0xe2, 0x36, 0x5c, 0xdd, 0xe7, 0xf1, 0xda, 0xc9, + 0x36, 0xb4, 0x63, 0x6d, 0xf0, 0x5c, 0xb5, 0x3c, 0x4d, 0x39, 0x1b, 0xe6, + 0xf7, 0x12, 0xa8, 0x5b, 0xcd, 0x4e, 0x4d, 0xd9, 0xf0, 0x17, 0x06, 0xd7, + 0xe5, 0x02, 0x29, 0x0e, 0x64, 0x91, 0xb1, 0x65, 0x52, 0x9a, 0xa4, 0xfc, + 0x12, 0x68, 0xf3, 0x26, 0xd6, 0xf1, 0x26, 0xdc, 0x8b, 0xd5, 0x36, 0xef, + 0x65, 0x70, 0x78, 0xb9, 0x6f, 0x3e, 0x5b, 0x36, 0x48, 0xeb, 0xea, 0xab, + 0xaf, 0xe6, 0xc9, 0x27, 0x9f, 0xec, 0xbb, 0xde, 0x0f, 0xb0, 0x75, 0x21, + 0xf7, 0x65, 0x2d, 0x7a, 0xb5, 0xdd, 0xbc, 0x33, 0x62, 0x3b, 0x95, 0x67, + 0xa7, 0xa9, 0xbe, 0x4f, 0x01, 0xb5, 0xee, 0x6c, 0xd5, 0xd9, 0xff, 0x95, + 0x9b, 0xb9, 0xeb, 0x63, 0x8f, 0x30, 0x79, 0x63, 0x2e, 0x70, 0x56, 0x17, + 0xc2, 0x45, 0x4a, 0xaf, 0x07, 0x22, 0x25, 0x7d, 0x75, 0x6e, 0x7b, 0xbe, + 0x87, 0xe7, 0x41, 0x69, 0xa4, 0x88, 0xf4, 0x25, 0x6d, 0xcf, 0xc3, 0x75, + 0x54, 0xda, 0xcc, 0x25, 0x6e, 0xcf, 0xd8, 0x84, 0x81, 0x47, 0x75, 0x3b, + 0x6d, 0x32, 0xd9, 0x1c, 0x5d, 0x0d, 0x03, 0x36, 0xe1, 0x38, 0x5c, 0xca, + 0xc8, 0x94, 0x6f, 0xea, 0xd2, 0x96, 0x75, 0x5c, 0xdf, 0x72, 0x9e, 0x8b, + 0xd1, 0xd4, 0x72, 0x42, 0x50, 0xa9, 0x54, 0xa8, 0x2f, 0xb5, 0x82, 0x3c, + 0xf6, 0x7e, 0xd8, 0x71, 0xb7, 0x7d, 0x78, 0x2f, 0x0f, 0xfd, 0xa7, 0xc7, + 0x7a, 0xf6, 0x73, 0xb5, 0x7c, 0x49, 0xed, 0x63, 0x87, 0xcd, 0xb6, 0x23, + 0xdf, 0x38, 0x48, 0x6e, 0x24, 0x47, 0x6e, 0x24, 0x47, 0xad, 0x56, 0x27, + 0xbf, 0xce, 0x55, 0x8e, 0xe8, 0xda, 0x11, 0xdc, 0xcd, 0xb9, 0xcc, 0x55, + 0x6b, 0x54, 0x36, 0xe4, 0x23, 0x60, 0xb1, 0x5a, 0xa3, 0x6d, 0xd5, 0x45, + 0x46, 0xc6, 0xa0, 0x84, 0x10, 0x94, 0x0a, 0x50, 0xaf, 0xbf, 0xf6, 0x40, + 0x80, 0x75, 0xd9, 0x8b, 0x56, 0x4d, 0x73, 0x21, 0x61, 0x57, 0x83, 0xf4, + 0x46, 0xaa, 0x0b, 0xac, 0x5e, 0x9f, 0xb3, 0x9d, 0x57, 0x38, 0xae, 0xc3, + 0xef, 0x04, 0x7e, 0x44, 0x14, 0xa8, 0x85, 0x8e, 0x7b, 0xad, 0x54, 0x12, + 0xe0, 0x09, 0x98, 0x14, 0x30, 0xeb, 0xc1, 0x66, 0xa0, 0x2b, 0x40, 0x74, + 0xd4, 0x35, 0x68, 0x1e, 0x18, 0x63, 0x38, 0xd0, 0x54, 0x81, 0x75, 0x34, + 0x39, 0xfb, 0x6a, 0x57, 0x19, 0x50, 0xe7, 0x4d, 0x46, 0xaa, 0xba, 0xca, + 0x8e, 0x72, 0xbb, 0x35, 0x68, 0x1c, 0x75, 0xbd, 0x15, 0x54, 0x91, 0x98, + 0x3b, 0xa7, 0xa9, 0xf7, 0xb8, 0x00, 0xcf, 0x82, 0x41, 0xd8, 0xaa, 0xa2, + 0x00, 0xbf, 0xf1, 0x7d, 0xbc, 0x90, 0x90, 0xad, 0x24, 0xdb, 0xe6, 0x8f, + 0xac, 0x06, 0x54, 0xe8, 0xba, 0xfd, 0xdc, 0x05, 0x28, 0x6f, 0x2d, 0xb2, + 0xef, 0x61, 0x99, 0x0b, 0xf0, 0x4c, 0xd2, 0x0f, 0x60, 0x35, 0x85, 0x06, + 0x6a, 0x69, 0x8d, 0x7f, 0xbe, 0xc5, 0xdc, 0xef, 0x2b, 0x48, 0xca, 0xd6, + 0x8a, 0xba, 0xfe, 0xcd, 0x39, 0x73, 0x54, 0x8e, 0x43, 0x69, 0x7d, 0x81, + 0x1b, 0x2e, 0xe9, 0x72, 0xd7, 0x31, 0x05, 0xb2, 0xa8, 0xfe, 0x86, 0x0b, + 0xc7, 0xa4, 0x5a, 0xb6, 0x7a, 0xaf, 0x7d, 0x9f, 0x7d, 0xd2, 0xe3, 0x11, + 0x6d, 0x5b, 0x5a, 0x08, 0x0e, 0xcf, 0x53, 0x2d, 0x9f, 0xd4, 0x8f, 0x33, + 0x71, 0x76, 0xfc, 0x5a, 0xc0, 0x58, 0x6d, 0xdf, 0x8d, 0x80, 0xb5, 0x72, + 0x8e, 0x17, 0xcd, 0xdf, 0xa9, 0x43, 0xb6, 0x14, 0x5d, 0x87, 0x68, 0xdc, + 0x90, 0x3a, 0xc2, 0xd7, 0x40, 0x16, 0x29, 0xae, 0x2f, 0x27, 0x8e, 0xad, + 0x1b, 0x49, 0xbf, 0x8d, 0x70, 0xcc, 0xbd, 0xb4, 0x61, 0x6d, 0x69, 0x00, + 0x45, 0x3c, 0x59, 0xc7, 0xf5, 0x5c, 0x5c, 0x51, 0xc2, 0x93, 0x75, 0x0a, + 0xf9, 0x29, 0x65, 0xcf, 0x1a, 0x73, 0xf2, 0x64, 0x0b, 0x57, 0xe4, 0xf1, + 0x3a, 0x56, 0x38, 0xd2, 0xe4, 0x05, 0xda, 0x2b, 0x4d, 0x5c, 0xa7, 0x80, + 0xe7, 0x37, 0x69, 0xaf, 0xe4, 0x95, 0xbd, 0xce, 0x1d, 0xb1, 0xda, 0xdc, + 0xa5, 0xca, 0xf4, 0x3d, 0x5c, 0x27, 0x0f, 0x8e, 0x50, 0xf7, 0x3e, 0x74, + 0x1f, 0x02, 0x19, 0x4c, 0xb8, 0x21, 0x51, 0xeb, 0x2e, 0x6a, 0x2c, 0x58, + 0xfa, 0x49, 0x3d, 0xab, 0xa6, 0xb5, 0x8c, 0xb7, 0x61, 0x01, 0xcf, 0x6f, + 0x29, 0xb0, 0x16, 0x05, 0xda, 0x2b, 0x6d, 0xbd, 0x8f, 0x58, 0xe1, 0x3a, + 0xa5, 0xe2, 0x94, 0xea, 0xbb, 0x74, 0x5c, 0xa2, 0x50, 0x2d, 0x05, 0xd9, + 0x32, 0xfb, 0x5b, 0x95, 0xd3, 0x54, 0x1c, 0x85, 0xfd, 0xae, 0xfa, 0x21, + 0x5c, 0x0b, 0x63, 0xdb, 0x29, 0xe0, 0x51, 0x27, 0x49, 0x9e, 0xf4, 0x28, + 0xe4, 0xd5, 0x71, 0xf2, 0xa4, 0x87, 0x2b, 0x0a, 0xb1, 0xf6, 0x4b, 0x56, + 0x83, 0x10, 0xa6, 0x65, 0x60, 0x4d, 0xc1, 0xb6, 0x86, 0x02, 0x65, 0x41, + 0x14, 0xb8, 0x55, 0x04, 0x1a, 0x45, 0x05, 0x81, 0x32, 0xeb, 0x06, 0xba, + 0xd5, 0xb0, 0xd2, 0xd9, 0x9a, 0xd0, 0xc6, 0x8f, 0x1a, 0x9a, 0x16, 0x0a, + 0xc0, 0x75, 0xd7, 0x26, 0x5d, 0x89, 0xb5, 0x02, 0xb5, 0x8c, 0xfa, 0x81, + 0xb5, 0xac, 0xb8, 0x7b, 0x2d, 0xdb, 0xd7, 0xa1, 0x80, 0x5a, 0x00, 0xeb, + 0x27, 0xe0, 0xf7, 0xf6, 0xab, 0xf0, 0x1f, 0xea, 0xed, 0x36, 0x48, 0xcb, + 0xd6, 0xbd, 0x12, 0xfe, 0xef, 0x1d, 0xb0, 0xeb, 0x6a, 0xcb, 0xd6, 0x75, + 0xd1, 0x34, 0xb7, 0x0f, 0xa8, 0xe6, 0x93, 0x56, 0xda, 0x3d, 0x7b, 0xd4, + 0xf2, 0x2e, 0x17, 0x9e, 0x06, 0xae, 0xf2, 0x60, 0xdf, 0xe3, 0x8d, 0x80, + 0x42, 0xd6, 0x68, 0xa8, 0xf6, 0x3a, 0x5a, 0x6c, 0x04, 0xa7, 0x53, 0xc3, + 0x64, 0x6e, 0x28, 0xe8, 0x96, 0xad, 0x06, 0xbd, 0xc7, 0xee, 0xd5, 0x92, + 0x94, 0x12, 0xae, 0x28, 0xc3, 0x0b, 0xc9, 0x70, 0xb8, 0x61, 0xf2, 0xf7, + 0xbc, 0xef, 0x5b, 0x2b, 0x68, 0xca, 0x97, 0xc1, 0xbb, 0xb8, 0xc4, 0xf7, + 0x95, 0x71, 0x88, 0x91, 0x4a, 0x09, 0x80, 0xe7, 0xb5, 0xac, 0x3e, 0xb3, + 0xe9, 0xe3, 0x82, 0x10, 0x99, 0xbe, 0x13, 0x1f, 0x79, 0x5e, 0x2b, 0x48, + 0xdf, 0x4f, 0xa6, 0x9f, 0x9c, 0x34, 0xb9, 0xc5, 0xeb, 0x2d, 0xe9, 0x2b, + 0xd8, 0x57, 0x50, 0x1f, 0x07, 0x6e, 0xd5, 0xc0, 0xaa, 0xea, 0x7f, 0xf4, + 0x82, 0x3e, 0xc7, 0x67, 0xa4, 0x24, 0x0f, 0xb4, 0x04, 0xe4, 0x1c, 0x11, + 0xc0, 0x9e, 0x22, 0x10, 0xab, 0x18, 0xe4, 0x2a, 0x2e, 0x1b, 0xae, 0x55, + 0x76, 0x5d, 0x9a, 0xfa, 0xdd, 0x58, 0x4d, 0x8f, 0xe7, 0xe7, 0xa5, 0xa4, + 0xa9, 0xc7, 0xf2, 0x0b, 0x52, 0xd2, 0x34, 0xf0, 0x63, 0x5f, 0x81, 0x4b, + 0xcd, 0x73, 0x0a, 0x10, 0x1c, 0xe3, 0xca, 0x95, 0x82, 0xf9, 0x6a, 0xd8, + 0x96, 0x89, 0x60, 0x2d, 0xad, 0x8a, 0x03, 0x35, 0x0b, 0x9c, 0x98, 0x71, + 0x0c, 0x36, 0x4b, 0xbf, 0xa7, 0x88, 0xe5, 0x11, 0x08, 0xa4, 0x23, 0x7b, + 0xa0, 0x61, 0x12, 0xa9, 0x26, 0x55, 0xb2, 0x65, 0xbd, 0x67, 0x1c, 0x47, + 0x32, 0xa7, 0xb7, 0xe7, 0x1c, 0x55, 0x77, 0xf5, 0x9a, 0x53, 0x3d, 0x85, + 0x77, 0xe9, 0x92, 0xd1, 0xe0, 0xa0, 0x88, 0x6d, 0x1f, 0xc6, 0x7c, 0xd5, + 0xff, 0x03, 0xc8, 0x8b, 0x10, 0xaa, 0x35, 0x0e, 0x54, 0x75, 0x3b, 0x10, + 0x83, 0x7a, 0x0d, 0xd2, 0x7f, 0xbd, 0xe8, 0xad, 0x5c, 0xfe, 0xca, 0xcb, + 0xaf, 0xd9, 0xd2, 0x00, 0xb4, 0x26, 0xb7, 0x5d, 0xc6, 0xe9, 0xd3, 0xa7, + 0x01, 0xd8, 0x58, 0x20, 0x00, 0x56, 0x19, 0x18, 0x15, 0xc0, 0xa6, 0x6d, + 0x57, 0xf6, 0x00, 0xac, 0x8c, 0x2e, 0x7d, 0xeb, 0xba, 0x00, 0x4c, 0x75, + 0xe6, 0x27, 0xaa, 0x2f, 0x3f, 0x39, 0x39, 0xc9, 0xe9, 0xd3, 0xa7, 0x39, + 0x75, 0xea, 0x14, 0x93, 0x93, 0x93, 0xcc, 0xce, 0xce, 0xbe, 0x2a, 0x36, + 0x0d, 0x64, 0xeb, 0xcc, 0xd9, 0xb3, 0x5c, 0xca, 0x99, 0x1e, 0x9b, 0x10, + 0x82, 0xb8, 0xcc, 0x3e, 0x9e, 0x6d, 0x9e, 0x09, 0x60, 0x58, 0x66, 0xff, + 0x67, 0x67, 0x67, 0x99, 0x9c, 0x9c, 0x64, 0x9d, 0xb6, 0x7f, 0xe9, 0x5b, + 0xd7, 0xb1, 0x69, 0xdb, 0x95, 0x01, 0x44, 0x6b, 0xd3, 0xb6, 0x2b, 0x03, + 0x70, 0x96, 0xc9, 0x6b, 0x40, 0x5c, 0xf6, 0x3e, 0x99, 0x36, 0x25, 0x01, + 0xc8, 0xbe, 0x9a, 0x5a, 0x9e, 0x17, 0x80, 0xb5, 0x12, 0xa5, 0x7f, 0xf3, + 0x7b, 0xaf, 0xdd, 0xcd, 0xa1, 0xef, 0xa8, 0x11, 0xf7, 0xea, 0x62, 0x95, + 0xc2, 0x48, 0xf2, 0xf8, 0x87, 0x51, 0xf0, 0x6e, 0xcf, 0x11, 0xe0, 0x67, + 0xc2, 0x77, 0x72, 0x22, 0x9a, 0xaf, 0xdd, 0x92, 0xe4, 0xf2, 0xfa, 0x5c, + 0x91, 0x6d, 0x10, 0x39, 0xa4, 0x9f, 0x09, 0xd2, 0x2a, 0x10, 0x5d, 0x97, + 0x4c, 0x47, 0x8d, 0xfd, 0xb7, 0x8e, 0x37, 0x29, 0x5d, 0x55, 0x00, 0x47, + 0x30, 0xbf, 0x52, 0x63, 0x52, 0xe4, 0x38, 0x34, 0xa3, 0xea, 0x55, 0x6b, + 0x36, 0x28, 0x64, 0x85, 0x1a, 0x47, 0xb6, 0x86, 0x17, 0x03, 0x7b, 0x56, + 0x19, 0xc8, 0x76, 0xb0, 0x5e, 0xba, 0xf1, 0x96, 0x10, 0xa8, 0xe5, 0x67, + 0x10, 0x23, 0x05, 0xd0, 0xef, 0x7c, 0x85, 0xfe, 0x06, 0x43, 0x6d, 0xd7, + 0xb6, 0x56, 0xa2, 0xfb, 0x32, 0x7f, 0xb4, 0x46, 0xe5, 0x3d, 0x5b, 0x83, + 0x22, 0x66, 0x57, 0x6a, 0x6c, 0xf7, 0xe1, 0xc8, 0xb2, 0x4a, 0xd7, 0x3a, + 0xde, 0xa4, 0xf0, 0x9e, 0x02, 0xe3, 0x57, 0xaa, 0xfe, 0x59, 0xd8, 0x80, + 0xca, 0x12, 0x00, 0x00, 0x20, 0x00, 0x49, 0x44, 0x41, 0x54, 0xa5, 0x5c, + 0xa1, 0xb6, 0x58, 0x45, 0xfa, 0xca, 0x9e, 0x34, 0xcf, 0x07, 0x4e, 0xf4, + 0x38, 0x34, 0x81, 0xf1, 0x2b, 0xcb, 0xcc, 0x3d, 0x5b, 0x03, 0x09, 0x53, + 0x3b, 0xc7, 0xa8, 0x1f, 0x6b, 0x31, 0xbe, 0xbd, 0xb4, 0xea, 0xf9, 0x5d, + 0x18, 0x29, 0x05, 0x70, 0x2d, 0x03, 0x8b, 0x32, 0x30, 0x2a, 0x50, 0x50, + 0x28, 0x23, 0x03, 0x87, 0x2a, 0xe4, 0x0b, 0xcc, 0x3d, 0xf7, 0x98, 0x2a, + 0x7b, 0x45, 0xd9, 0x30, 0xe0, 0x2a, 0x15, 0x57, 0x0f, 0x40, 0x5b, 0x06, + 0x7e, 0x65, 0x64, 0xca, 0x11, 0xa2, 0xc0, 0xb7, 0x9f, 0x7e, 0x9e, 0xdb, + 0x6f, 0xd8, 0xc1, 0xe9, 0xff, 0xf1, 0x52, 0x24, 0xcd, 0xc3, 0x07, 0x1e, + 0xe1, 0xb2, 0x5f, 0xb8, 0x24, 0x12, 0xf7, 0xaf, 0xff, 0xd5, 0x25, 0xdc, + 0xfb, 0x58, 0xb4, 0x13, 0x66, 0xdb, 0xb2, 0x97, 0x76, 0xf9, 0xf1, 0x7a, + 0x99, 0x7d, 0x36, 0xf5, 0x32, 0x71, 0x40, 0xa2, 0x2d, 0x5b, 0x26, 0x6d, + 0xd2, 0x36, 0x1b, 0xa6, 0x55, 0x2a, 0x28, 0x6c, 0x9b, 0x0d, 0xf2, 0x0a, + 0x61, 0x5c, 0xbd, 0xf5, 0x02, 0x02, 0xa0, 0x96, 0x01, 0x65, 0xd9, 0xe0, + 0xac, 0x24, 0xc5, 0x41, 0x5b, 0xa9, 0x52, 0xa5, 0x4a, 0x95, 0x2a, 0x55, + 0xaa, 0x54, 0xa9, 0x52, 0xa5, 0x4a, 0x95, 0x2a, 0x55, 0xaa, 0x54, 0xa9, + 0x52, 0xa5, 0x4a, 0x95, 0x2a, 0x55, 0xaa, 0x54, 0xa9, 0x52, 0xa5, 0x4a, + 0x95, 0xea, 0xfc, 0xe4, 0x9c, 0xeb, 0x37, 0x85, 0xa9, 0x52, 0xa5, 0x4a, + 0x95, 0x2a, 0x55, 0xaa, 0x73, 0xd7, 0xbc, 0x5e, 0x76, 0x99, 0x23, 0xd3, + 0xe3, 0x3c, 0x31, 0x58, 0xd2, 0x0f, 0x1d, 0x35, 0xe2, 0x12, 0x42, 0xe0, + 0x79, 0xde, 0x39, 0x81, 0xa8, 0xce, 0x07, 0x60, 0x65, 0x3b, 0x46, 0x9e, + 0xab, 0xe2, 0xe5, 0xaf, 0xd5, 0x96, 0x94, 0x52, 0x7f, 0xd0, 0x3d, 0xdc, + 0x3e, 0x24, 0xa5, 0x5d, 0x2d, 0xbf, 0xe7, 0x79, 0xb8, 0xae, 0x4b, 0x6b, + 0xb9, 0x35, 0x10, 0x4d, 0xaa, 0x8e, 0xeb, 0x78, 0x34, 0xf2, 0x77, 0xea, + 0xf0, 0x45, 0x0d, 0x82, 0x4a, 0x80, 0xb6, 0x04, 0x40, 0x2d, 0xf3, 0xbf, + 0x75, 0x8c, 0x15, 0x64, 0x4a, 0x85, 0x7a, 0xdc, 0x9c, 0x85, 0x15, 0x1d, + 0x2c, 0x15, 0x58, 0x2a, 0xe3, 0x64, 0x42, 0x20, 0x8f, 0x86, 0x6b, 0x49, + 0xe9, 0x81, 0x23, 0x79, 0xf0, 0x43, 0xb7, 0xb0, 0xf9, 0x13, 0x77, 0x32, + 0xbe, 0x65, 0xab, 0x82, 0x4c, 0xe9, 0xf6, 0x9e, 0x3b, 0xb6, 0xc0, 0x89, + 0x2f, 0xed, 0xe7, 0xd6, 0xfb, 0x0f, 0xf2, 0xe0, 0x47, 0x76, 0x03, 0x70, + 0xeb, 0xa3, 0x87, 0x98, 0x7b, 0x56, 0x7d, 0x7c, 0x38, 0x7e, 0xe5, 0x38, + 0x5e, 0xab, 0xcd, 0x83, 0x37, 0xed, 0xe2, 0xd6, 0xfb, 0x0f, 0x52, 0xa3, + 0xcd, 0x42, 0x4d, 0x39, 0xb5, 0x6f, 0x2d, 0x6f, 0x45, 0x08, 0xe5, 0x48, + 0x67, 0x7f, 0x6a, 0xb8, 0xf9, 0x13, 0x77, 0xc2, 0x03, 0x07, 0x69, 0xca, + 0x76, 0x08, 0xc3, 0x32, 0x0e, 0x80, 0x06, 0x80, 0x03, 0xe4, 0x44, 0x86, + 0xb6, 0x4e, 0xd3, 0x03, 0xe0, 0x8a, 0xfd, 0x36, 0x85, 0x43, 0x10, 0x67, + 0xc0, 0x62, 0x4d, 0x0d, 0x08, 0xb3, 0xd3, 0xbb, 0x59, 0x37, 0x04, 0x8f, + 0x39, 0xaa, 0xa0, 0x26, 0x6a, 0xbb, 0xc8, 0x2a, 0xe8, 0x96, 0x69, 0xa3, + 0xa6, 0xa9, 0x8f, 0x86, 0x84, 0x09, 0x0b, 0xa8, 0x65, 0xf2, 0xc7, 0x3f, + 0x94, 0xe7, 0x77, 0xea, 0x70, 0x34, 0xfa, 0xe1, 0xaf, 0x39, 0xaf, 0xcb, + 0x42, 0xe0, 0xf9, 0x21, 0xac, 0x0a, 0x42, 0xa0, 0x96, 0xf9, 0x48, 0xdf, + 0xeb, 0x48, 0x5c, 0xeb, 0xf7, 0xa0, 0xd6, 0x8b, 0x60, 0x41, 0x9e, 0x4a, + 0xba, 0xde, 0x64, 0xd5, 0x87, 0xc2, 0x6e, 0x36, 0x6f, 0xa5, 0x6f, 0x05, + 0x3f, 0x09, 0x3b, 0x7e, 0x35, 0xb9, 0xd9, 0x3c, 0x79, 0x5a, 0xb4, 0xa4, + 0x69, 0x7f, 0xf5, 0xe3, 0xe9, 0x67, 0xc3, 0xeb, 0xb4, 0xac, 0x6d, 0x19, + 0x54, 0x4d, 0xc2, 0x8f, 0x8f, 0xa5, 0xd3, 0xeb, 0x9a, 0x99, 0xcf, 0xab, + 0x8f, 0x4a, 0x5b, 0xad, 0xfe, 0x4e, 0x31, 0xae, 0xeb, 0xb2, 0x7d, 0x62, + 0x3b, 0x47, 0x8e, 0x1e, 0x61, 0xea, 0xda, 0x29, 0x6a, 0x27, 0x6b, 0x94, + 0x8a, 0xe6, 0x83, 0xd3, 0x12, 0xe5, 0xf5, 0xe1, 0xf5, 0xb1, 0xf6, 0x5c, + 0x3d, 0xa1, 0x2e, 0xa1, 0xa4, 0x76, 0x00, 0x8c, 0x5f, 0x1f, 0x07, 0xb5, + 0x8b, 0xf9, 0x58, 0xb8, 0xab, 0xe1, 0x6b, 0xad, 0x95, 0x64, 0x47, 0x32, + 0x18, 0x7c, 0x5e, 0x0b, 0x21, 0x02, 0x70, 0x96, 0x0d, 0xd0, 0x32, 0xe1, + 0xd5, 0x66, 0x0b, 0x86, 0x64, 0xd8, 0x96, 0x71, 0xa0, 0x09, 0xf6, 0xc5, + 0x82, 0x63, 0xad, 0x35, 0xbc, 0x9a, 0x06, 0x81, 0x17, 0xd7, 0x14, 0x8e, + 0xcf, 0x32, 0x6d, 0x29, 0x0e, 0xd4, 0x32, 0xb2, 0xd3, 0x0f, 0x13, 0xb6, + 0xcb, 0x1a, 0x64, 0x77, 0x50, 0xde, 0x41, 0xf1, 0x49, 0xe7, 0x35, 0xb7, + 0x2d, 0xc2, 0xfe, 0x68, 0xdc, 0x30, 0x20, 0xa9, 0xb8, 0x0c, 0xdc, 0xca, + 0xfc, 0x41, 0x14, 0xb0, 0x15, 0xb7, 0x1d, 0x07, 0x56, 0xc5, 0xe3, 0xed, + 0xe5, 0xd7, 0x13, 0xd2, 0xd8, 0xcb, 0x51, 0x7a, 0xc1, 0x5d, 0x49, 0xf6, + 0xe2, 0x75, 0xb5, 0xf3, 0x25, 0xd5, 0x47, 0xfd, 0x8d, 0xb2, 0xa4, 0x73, + 0xc7, 0xed, 0xc4, 0xcb, 0x89, 0xc3, 0xbd, 0x2e, 0xa4, 0x46, 0x37, 0x6c, + 0x08, 0xda, 0xe1, 0xeb, 0xc0, 0x2b, 0x3b, 0x77, 0x0e, 0x06, 0x6a, 0xdd, + 0xb6, 0x08, 0x7f, 0xf1, 0x2f, 0xa2, 0x71, 0x4f, 0xd5, 0x21, 0x17, 0x5e, + 0x7b, 0xe4, 0xa7, 0xde, 0xcd, 0x0d, 0x5f, 0x78, 0x9e, 0x27, 0xee, 0x78, + 0xb7, 0xba, 0xfa, 0xfd, 0xf5, 0xf7, 0x91, 0x77, 0xbc, 0x63, 0xd5, 0xba, + 0x0c, 0x3a, 0xeb, 0xef, 0xf0, 0xe1, 0x9e, 0xd8, 0xfd, 0x24, 0xb8, 0x4f, + 0x9d, 0xa3, 0xdd, 0x9f, 0x1f, 0x02, 0x5b, 0xd2, 0xf2, 0xe1, 0x17, 0x1d, + 0x39, 0x64, 0x4f, 0x29, 0xd4, 0xae, 0xa2, 0x0e, 0x68, 0xa0, 0x16, 0x10, + 0x80, 0xb5, 0x38, 0x5e, 0x63, 0x57, 0x91, 0x08, 0x58, 0x6b, 0xad, 0xca, + 0x3b, 0xaa, 0x6e, 0x71, 0x40, 0x99, 0x89, 0x8f, 0x87, 0xcf, 0x49, 0x4f, + 0xd5, 0xe1, 0x92, 0x58, 0x9f, 0xfb, 0xd8, 0x09, 0x75, 0xac, 0xaf, 0x30, + 0x8e, 0x2e, 0x0b, 0x70, 0x65, 0x99, 0x71, 0x4f, 0x3b, 0xca, 0xb4, 0x1a, + 0xd4, 0xb2, 0xc0, 0xf1, 0x18, 0xbc, 0xe7, 0xba, 0x5d, 0xec, 0x32, 0xe1, + 0x95, 0x2a, 0xe2, 0x3d, 0x25, 0x78, 0x26, 0x01, 0x51, 0x70, 0xd3, 0x5e, + 0xca, 0x26, 0xfc, 0x62, 0x2d, 0x70, 0x72, 0x9b, 0x1a, 0x83, 0xee, 0x88, + 0x07, 0x23, 0x66, 0x63, 0x8b, 0x8c, 0x13, 0x82, 0x86, 0x36, 0x03, 0xf5, + 0x93, 0xd3, 0xcc, 0x2f, 0xbf, 0x83, 0xed, 0x5f, 0x81, 0x4c, 0xe8, 0xd7, + 0x02, 0xff, 0x18, 0xa6, 0xfb, 0xe4, 0xc9, 0x69, 0x6e, 0x93, 0xb7, 0xc2, + 0xff, 0xcf, 0xde, 0xfb, 0x87, 0xc9, 0x51, 0xdc, 0xf7, 0xba, 0xaf, 0x4d, + 0x1b, 0x6a, 0xe2, 0x59, 0xe8, 0x89, 0x57, 0xf6, 0x8c, 0x7e, 0x24, 0x33, + 0xce, 0xca, 0xd2, 0xc8, 0x10, 0x33, 0x7b, 0xe0, 0x01, 0x6d, 0xc0, 0x47, + 0x5a, 0xe3, 0x27, 0xd2, 0x62, 0x9f, 0x07, 0x8b, 0xc8, 0x4f, 0x10, 0x76, + 0x1e, 0x0c, 0x38, 0x37, 0xb6, 0x64, 0x1f, 0xc7, 0x92, 0xef, 0xbd, 0x09, + 0xe8, 0x1c, 0xfb, 0x80, 0x93, 0xe7, 0x9e, 0x88, 0x3c, 0x4e, 0xae, 0x30, + 0x3e, 0x31, 0xc2, 0x3c, 0xc7, 0x91, 0x94, 0x27, 0x04, 0x99, 0x7b, 0x63, + 0x0b, 0x9d, 0x6b, 0x65, 0xa5, 0x13, 0x9c, 0x5d, 0xfc, 0xe0, 0xec, 0xe2, + 0x00, 0x1a, 0x09, 0xed, 0xf1, 0x4c, 0xa2, 0x45, 0x33, 0x0e, 0x6b, 0x4f, + 0xc3, 0x8e, 0x33, 0x05, 0x6e, 0x2e, 0xf7, 0x8f, 0xaa, 0xea, 0xae, 0xee, + 0xe9, 0xd9, 0x9d, 0x15, 0x02, 0x3b, 0xe7, 0xf6, 0x67, 0x9f, 0xd9, 0xae, + 0xae, 0xae, 0xfa, 0x76, 0xfd, 0xe8, 0xae, 0xae, 0xae, 0xee, 0x7a, 0xfb, + 0x8b, 0xc0, 0x95, 0xe1, 0x64, 0x9d, 0xe9, 0x33, 0xba, 0xad, 0x6a, 0xaa, + 0x09, 0x41, 0xef, 0x9b, 0x83, 0x5b, 0xd7, 0xdf, 0xc3, 0x03, 0x7f, 0xad, + 0x6b, 0xfe, 0xe3, 0x3d, 0x40, 0x92, 0x5f, 0xed, 0xbf, 0x1f, 0x11, 0x87, + 0x64, 0x2d, 0xff, 0xa5, 0x91, 0x1e, 0x21, 0xbb, 0xc3, 0x06, 0xda, 0xa7, + 0xd0, 0x73, 0xf7, 0x8b, 0x1e, 0xd7, 0x2a, 0x03, 0xd6, 0x7a, 0x4a, 0xf7, + 0x23, 0xfe, 0xfa, 0x30, 0x5c, 0x56, 0x86, 0x62, 0x09, 0x8e, 0x8d, 0xf7, + 0x4e, 0xdc, 0x53, 0x27, 0xba, 0xeb, 0xfa, 0x93, 0x35, 0xb8, 0xcb, 0x2a, + 0xc8, 0x1e, 0xf7, 0x52, 0x40, 0x5f, 0x40, 0x2d, 0xe0, 0x0d, 0x01, 0x6a, + 0x01, 0xe7, 0x0f, 0xa8, 0xa5, 0x65, 0x43, 0x17, 0x44, 0xd6, 0x8d, 0x82, + 0xb5, 0xce, 0xa7, 0xdc, 0x5c, 0xd4, 0xed, 0xc5, 0x20, 0x68, 0xd9, 0x98, + 0x3b, 0x01, 0xaa, 0xe0, 0x6a, 0x10, 0x5d, 0x12, 0x5c, 0x0b, 0x48, 0xbc, + 0x5e, 0xff, 0xfa, 0x69, 0xf8, 0xdf, 0x16, 0x9e, 0xcb, 0xb7, 0x24, 0x99, + 0x5a, 0x5e, 0xac, 0x85, 0x4d, 0x82, 0x51, 0xd9, 0xd0, 0xaa, 0x4e, 0x0c, + 0xa8, 0x65, 0xe4, 0x73, 0x61, 0x4f, 0xb0, 0x16, 0xc0, 0x3c, 0xaf, 0x90, + 0x5d, 0xf6, 0x8b, 0x74, 0x9e, 0x0f, 0x27, 0x9f, 0x99, 0x49, 0x98, 0xbd, + 0xd6, 0xb3, 0xcb, 0x7e, 0x91, 0xf9, 0xe7, 0x7f, 0x4c, 0xbc, 0x18, 0xe2, + 0x79, 0x79, 0xf9, 0x02, 0x87, 0xcc, 0x5b, 0x2e, 0xe4, 0xed, 0x03, 0xbf, + 0x40, 0xe3, 0xf9, 0xb9, 0xbe, 0xf3, 0xd2, 0xcb, 0xde, 0xeb, 0x79, 0x46, + 0xfc, 0xfa, 0x69, 0x18, 0x8f, 0x5d, 0xae, 0xcd, 0xf5, 0xfa, 0xf0, 0x11, + 0x0f, 0x17, 0x89, 0xf8, 0xce, 0x38, 0x3b, 0x18, 0x05, 0x60, 0xd7, 0x17, + 0x1a, 0x08, 0xe0, 0xd0, 0x43, 0x65, 0xd0, 0xc7, 0xd1, 0xb6, 0x8f, 0x56, + 0x23, 0xa0, 0x29, 0x73, 0x4e, 0xbb, 0x59, 0xc1, 0xe4, 0x53, 0x75, 0xd6, + 0x5f, 0x56, 0xa4, 0x19, 0x6b, 0xca, 0x3d, 0xdf, 0xa3, 0x40, 0x9e, 0xce, + 0xf3, 0x1e, 0x42, 0xf7, 0xab, 0xe3, 0xb0, 0x2c, 0x1b, 0x1e, 0x05, 0x70, + 0xeb, 0x47, 0xb7, 0xf1, 0xc0, 0xd7, 0x0f, 0x44, 0xc2, 0xc4, 0x41, 0x5e, + 0xb6, 0xdf, 0xe8, 0xfa, 0xf5, 0x8c, 0x4f, 0x4e, 0x52, 0x1a, 0xca, 0xeb, + 0x74, 0x75, 0x90, 0x64, 0xc8, 0x64, 0x73, 0xea, 0x3e, 0xd5, 0x71, 0x19, + 0x9f, 0x9c, 0xa4, 0xb0, 0xaa, 0xa4, 0xef, 0x1b, 0x35, 0x90, 0xd6, 0x8f, + 0xda, 0x11, 0xc2, 0x65, 0xdf, 0xd7, 0x1f, 0x4e, 0xdc, 0x9f, 0x1d, 0xa6, + 0x1f, 0xbf, 0xa4, 0xed, 0x71, 0x48, 0x57, 0x4b, 0xca, 0xc8, 0x69, 0x0e, + 0xe0, 0xb5, 0x3c, 0x46, 0xd7, 0xaf, 0x47, 0x4a, 0x2f, 0x02, 0x19, 0x73, + 0x05, 0xd4, 0x6a, 0x55, 0x5c, 0xca, 0xb8, 0x83, 0x51, 0x50, 0x6e, 0xb3, + 0x01, 0xb5, 0xb9, 0x26, 0x77, 0x7d, 0xf6, 0x93, 0x1c, 0xbe, 0x75, 0x22, + 0xf1, 0x7a, 0x7d, 0xbe, 0xcf, 0x6b, 0xa3, 0x1f, 0x2d, 0x02, 0xa9, 0x7a, + 0x5b, 0x1f, 0xa0, 0xab, 0xf3, 0xa5, 0xc5, 0xd2, 0x02, 0x70, 0xe1, 0xa2, + 0x21, 0xce, 0x9f, 0xfa, 0x29, 0x1b, 0x03, 0xf9, 0x7a, 0x1a, 0xf8, 0x6d, + 0x20, 0xde, 0xbb, 0x78, 0x01, 0x78, 0x27, 0x0a, 0xb6, 0x95, 0x34, 0x45, + 0x34, 0xf1, 0xbc, 0x4e, 0xb8, 0xe7, 0xea, 0x47, 0x52, 0xc3, 0x6d, 0xc6, + 0x3d, 0x3d, 0x16, 0x35, 0x27, 0x98, 0x44, 0x06, 0x50, 0x87, 0x31, 0xa2, + 0x08, 0x9b, 0x85, 0xd4, 0xb8, 0x0a, 0xf8, 0xee, 0x92, 0x93, 0xd0, 0x97, + 0x0a, 0xae, 0x02, 0xd1, 0xdb, 0xea, 0x58, 0xfd, 0x8b, 0xc8, 0x96, 0xac, + 0x8b, 0x90, 0x1e, 0x3b, 0x05, 0x8c, 0x5b, 0x1b, 0x3c, 0x54, 0x7e, 0xcd, + 0xc4, 0xe9, 0xfd, 0x73, 0x70, 0xb3, 0x0b, 0xa3, 0x59, 0xd8, 0xdf, 0x46, + 0x8f, 0x1e, 0xaa, 0x08, 0x01, 0xe8, 0x0a, 0x95, 0xef, 0xf3, 0x01, 0xd4, + 0x0a, 0xf2, 0x62, 0xd9, 0x36, 0xcb, 0xfd, 0xc0, 0x88, 0x01, 0x41, 0x00, + 0xfb, 0xe6, 0x04, 0x9f, 0xce, 0x92, 0x7c, 0xcf, 0x65, 0x8d, 0x91, 0x9e, + 0xab, 0xce, 0x37, 0x40, 0x2b, 0x49, 0x76, 0x3f, 0x69, 0xcf, 0x7f, 0xde, + 0xc3, 0xae, 0xff, 0x75, 0x57, 0xf7, 0xb6, 0x27, 0x55, 0x2f, 0xdf, 0xc0, + 0xb4, 0x00, 0xc6, 0xff, 0x40, 0xc0, 0x4a, 0x05, 0xd4, 0x1a, 0x5e, 0xa5, + 0x6b, 0xeb, 0x88, 0x07, 0x9b, 0x5c, 0x4a, 0xdf, 0xf4, 0xa8, 0x7d, 0x20, + 0x6c, 0x53, 0x27, 0xdb, 0xe3, 0x54, 0xc4, 0x7a, 0x64, 0xdb, 0x43, 0x64, + 0x5d, 0x3d, 0x36, 0xd9, 0xbb, 0x7f, 0x96, 0xb4, 0xcd, 0xf6, 0x5b, 0x0a, + 0x4c, 0xcb, 0x96, 0x89, 0xd7, 0x05, 0xd4, 0x82, 0x64, 0xa0, 0x96, 0x71, + 0xdb, 0xdb, 0x12, 0xfa, 0x66, 0xa3, 0xa7, 0xa1, 0xab, 0x53, 0x02, 0x48, + 0xcf, 0x43, 0x1d, 0x3d, 0xc9, 0x79, 0x15, 0x4e, 0x0e, 0xe9, 0xc7, 0x21, + 0xba, 0x45, 0x6c, 0xc0, 0x56, 0xc6, 0x2d, 0x50, 0xaf, 0xab, 0xf2, 0xef, + 0x78, 0x2d, 0x6d, 0x6f, 0x3a, 0xd8, 0xae, 0x20, 0x5a, 0x4d, 0xa0, 0x60, + 0xb9, 0x15, 0x74, 0xca, 0x28, 0x37, 0x18, 0xda, 0xb0, 0xdd, 0xd1, 0x23, + 0x6c, 0x0f, 0x10, 0xd6, 0xbd, 0x01, 0x5c, 0x4b, 0x5f, 0xe8, 0x6f, 0x45, + 0x68, 0x88, 0x0a, 0x80, 0x2f, 0x34, 0xac, 0x53, 0x8d, 0x07, 0x2b, 0xe8, + 0x56, 0x92, 0xe2, 0xa3, 0xe7, 0xe8, 0xb4, 0xa1, 0x80, 0x5a, 0xbe, 0x6a, + 0x55, 0x73, 0xf9, 0x02, 0xf5, 0x99, 0x49, 0xed, 0xce, 0x05, 0xee, 0xd6, + 0x5c, 0x0b, 0x4f, 0xd6, 0x50, 0x67, 0xdb, 0x27, 0x51, 0x68, 0x6f, 0x82, + 0xbc, 0xb9, 0x22, 0x8f, 0xe7, 0xab, 0x3d, 0x4f, 0xfb, 0x61, 0x99, 0xd8, + 0x0a, 0xf2, 0xab, 0xf3, 0x23, 0xf2, 0x65, 0xa4, 0x35, 0x86, 0xeb, 0x0a, + 0x97, 0x8e, 0xd7, 0x00, 0x3f, 0x87, 0x9b, 0x75, 0xf1, 0x64, 0x98, 0x93, + 0xd1, 0xd3, 0x70, 0x78, 0x59, 0xcc, 0xa0, 0x6e, 0xc3, 0x8b, 0x44, 0x31, + 0x68, 0x1b, 0x8a, 0x6a, 0x79, 0x5c, 0xaf, 0xd7, 0xeb, 0x70, 0xbc, 0xae, + 0x96, 0x46, 0x0f, 0x16, 0x15, 0x50, 0xeb, 0x38, 0x21, 0x58, 0xab, 0x5e, + 0xd7, 0x70, 0x2d, 0x08, 0xe1, 0x50, 0xc6, 0x8d, 0x82, 0x69, 0x6d, 0x28, + 0x16, 0x15, 0x2c, 0x8a, 0x7a, 0x60, 0xef, 0xba, 0x23, 0x70, 0xf4, 0x33, + 0x89, 0x59, 0xee, 0x2d, 0xc3, 0x6f, 0xd8, 0x64, 0x2d, 0x63, 0x60, 0xad, + 0x23, 0x9a, 0x70, 0x35, 0x33, 0xa3, 0x60, 0x57, 0x33, 0x43, 0xe1, 0x38, + 0xd8, 0x57, 0x76, 0xa9, 0x11, 0xae, 0x23, 0x16, 0x38, 0xfe, 0x33, 0x3a, + 0x0d, 0xdf, 0xdc, 0xa5, 0xc2, 0x6d, 0x9a, 0x19, 0xe2, 0xc8, 0xd0, 0x4c, + 0x30, 0x7e, 0xf6, 0x08, 0xb0, 0x63, 0xd7, 0x0e, 0xbe, 0x72, 0x69, 0xb8, + 0xa3, 0x70, 0x5c, 0x6d, 0x08, 0x66, 0x66, 0x38, 0x62, 0x0d, 0x9c, 0x6d, + 0x5a, 0x64, 0xe0, 0xf1, 0x23, 0x9e, 0x4a, 0xf3, 0xf1, 0xab, 0xeb, 0x9a, + 0x88, 0x55, 0x67, 0xc3, 0x06, 0x38, 0xfe, 0x60, 0x08, 0x20, 0xa3, 0x18, + 0x96, 0x7b, 0x71, 0x83, 0x5a, 0x26, 0x41, 0xcb, 0x8a, 0x1b, 0x94, 0xff, + 0xaf, 0x16, 0xe9, 0x6b, 0xdc, 0x6c, 0x31, 0xd9, 0x40, 0x55, 0x1b, 0x12, + 0x65, 0xe4, 0xba, 0x2e, 0x5e, 0xec, 0xd9, 0xe2, 0x6b, 0x79, 0xd6, 0xb8, + 0x60, 0xbc, 0x04, 0x4a, 0x70, 0x71, 0x30, 0x4f, 0xdd, 0x06, 0x60, 0x39, + 0x42, 0x81, 0xb6, 0x12, 0x60, 0x5a, 0x76, 0xcb, 0x20, 0x10, 0x78, 0x01, + 0x44, 0x4b, 0x20, 0x51, 0xcf, 0x79, 0xa4, 0x2f, 0x69, 0x36, 0x7b, 0x3f, + 0x63, 0x08, 0xee, 0xc9, 0x17, 0x1b, 0xcf, 0x4e, 0x82, 0x7b, 0x2d, 0x12, + 0xe7, 0x35, 0x29, 0xa1, 0x1f, 0x1e, 0x7f, 0x7e, 0x2d, 0xcd, 0xfe, 0x83, + 0x32, 0x42, 0x41, 0x9e, 0xf4, 0xb2, 0xe2, 0xc3, 0x76, 0x21, 0xb8, 0x1d, + 0x05, 0x96, 0x9a, 0x76, 0x60, 0xa7, 0x03, 0xf7, 0x9a, 0xf8, 0xf1, 0xeb, + 0xb5, 0xaf, 0x60, 0xa0, 0xf8, 0x30, 0x99, 0x70, 0x2d, 0x77, 0x91, 0x7a, + 0x2c, 0x50, 0x81, 0x0a, 0x47, 0x51, 0xfb, 0xda, 0xa7, 0x2b, 0x71, 0xda, + 0x3c, 0x43, 0xf1, 0x25, 0x0d, 0x6b, 0xac, 0xa3, 0x13, 0xb4, 0xd3, 0x96, + 0x31, 0x9d, 0xc6, 0xc9, 0x69, 0xd9, 0x05, 0xd1, 0xb2, 0xdd, 0xf6, 0xb6, + 0x69, 0x44, 0x98, 0x67, 0x01, 0x10, 0x7e, 0x50, 0x05, 0x60, 0x18, 0xa8, + 0xfa, 0x3d, 0xc6, 0x0b, 0x1c, 0x91, 0x08, 0xa5, 0x36, 0x87, 0xbe, 0x5d, + 0xbd, 0x13, 0xbe, 0x7e, 0x3e, 0xe7, 0x40, 0x19, 0xc1, 0x84, 0x8c, 0x9e, + 0x23, 0x19, 0xeb, 0x39, 0x5c, 0x3c, 0xed, 0x93, 0x8e, 0xba, 0xa2, 0xb4, + 0x1c, 0xa8, 0x4a, 0x19, 0x7c, 0x30, 0x64, 0xc2, 0xe4, 0x19, 0x5d, 0x6f, + 0xbe, 0x3e, 0xf6, 0xfc, 0x56, 0xe2, 0x73, 0x2e, 0x8f, 0x09, 0xb2, 0xac, + 0x66, 0xd5, 0xab, 0x6a, 0x7c, 0xe2, 0x8d, 0x5a, 0x2e, 0xbf, 0x78, 0x00, + 0x20, 0x00, 0x47, 0x19, 0x19, 0xff, 0x53, 0xcf, 0x9e, 0x82, 0x57, 0xd5, + 0xba, 0x09, 0x63, 0xc0, 0x57, 0x06, 0x48, 0x65, 0xe0, 0x52, 0x6b, 0xd6, + 0xac, 0x61, 0xc5, 0x8a, 0x15, 0x9c, 0x1d, 0x1f, 0x0f, 0x00, 0x56, 0xf3, + 0x8d, 0xb3, 0x41, 0xdc, 0xd7, 0xcb, 0xe6, 0x40, 0x61, 0x79, 0x60, 0xf3, + 0xec, 0x8b, 0xf3, 0x60, 0xe5, 0x65, 0xed, 0x15, 0x57, 0x06, 0xb0, 0x2c, + 0x1b, 0xb4, 0x65, 0xfc, 0x0d, 0x14, 0xeb, 0xa4, 0x65, 0xd3, 0xe4, 0x7f, + 0xa0, 0xb0, 0x9c, 0xf1, 0x63, 0xe3, 0x5d, 0x69, 0x35, 0xd0, 0x2e, 0x93, + 0xee, 0x53, 0xa7, 0x4e, 0xb1, 0xa6, 0x10, 0xe6, 0x61, 0x39, 0x21, 0xcc, + 0xcb, 0x63, 0x02, 0x37, 0xfe, 0x4c, 0x53, 0xb7, 0xe1, 0xb9, 0x41, 0x05, + 0x17, 0x35, 0xb2, 0x1f, 0xc1, 0x37, 0xe6, 0xbc, 0xf0, 0x18, 0xd5, 0xe7, + 0xfb, 0x42, 0x1f, 0x8b, 0x6a, 0xcc, 0x59, 0x7d, 0x36, 0x0d, 0x97, 0xca, + 0xe5, 0x05, 0x9d, 0x39, 0x09, 0x4e, 0x87, 0x72, 0x69, 0x84, 0x5c, 0xb6, + 0xc0, 0xc4, 0xe3, 0xe3, 0xa8, 0xb3, 0xc2, 0x05, 0x91, 0x0b, 0xc0, 0x55, + 0xa0, 0x80, 0x52, 0xc2, 0xe9, 0xd0, 0x6a, 0xaa, 0xb8, 0x99, 0xc1, 0x02, + 0x2d, 0x0b, 0x40, 0x6b, 0xc2, 0xaa, 0xf0, 0x1e, 0x5e, 0xdb, 0x43, 0x08, + 0xc8, 0x0c, 0x0a, 0xb8, 0x66, 0x8c, 0x3b, 0x86, 0x46, 0x03, 0x20, 0x57, + 0xb9, 0x50, 0xa4, 0xda, 0xa8, 0xd3, 0x68, 0x4b, 0xec, 0xb3, 0x30, 0x00, + 0x65, 0x19, 0xe0, 0x9e, 0x81, 0x7a, 0x09, 0xf5, 0x4e, 0x42, 0x66, 0x50, + 0xa8, 0x3e, 0xa5, 0x1f, 0xa6, 0x27, 0x28, 0x4b, 0x0d, 0x58, 0x8a, 0xa6, + 0x57, 0x6d, 0xcb, 0x0c, 0x8a, 0x00, 0x86, 0xb5, 0xfd, 0xe3, 0xb7, 0x31, + 0xf1, 0x94, 0xea, 0x7b, 0x15, 0x3e, 0xb4, 0x9d, 0x3b, 0x3e, 0x64, 0xda, + 0x22, 0x03, 0x34, 0x97, 0xba, 0xcc, 0x1a, 0x4c, 0x7c, 0x7b, 0x9c, 0x9b, + 0x3f, 0x76, 0x33, 0x05, 0x99, 0xa7, 0x56, 0x6b, 0x06, 0x69, 0x1c, 0x29, + 0x96, 0x19, 0x7f, 0x32, 0x7c, 0x1e, 0x51, 0xad, 0x37, 0x19, 0x5b, 0xbf, + 0x11, 0xdc, 0x30, 0x2f, 0xde, 0x9c, 0xb2, 0x37, 0x71, 0xac, 0xaa, 0xda, + 0xd1, 0x58, 0x1b, 0xee, 0x31, 0xc1, 0x46, 0x36, 0x22, 0x65, 0x83, 0xda, + 0x6c, 0x83, 0xd2, 0xca, 0x11, 0x1a, 0x73, 0x35, 0x4a, 0x2b, 0x47, 0x82, + 0xe7, 0xe2, 0x06, 0xf8, 0x14, 0xc0, 0xa7, 0x9a, 0x8d, 0x00, 0x04, 0x65, + 0xfc, 0x42, 0x88, 0x55, 0xb4, 0xce, 0x0d, 0x5c, 0xaa, 0x90, 0x2f, 0x04, + 0x20, 0x2a, 0x1b, 0x42, 0x65, 0x83, 0xab, 0xf6, 0x3e, 0x7c, 0x24, 0xd8, + 0x26, 0x44, 0x81, 0x1d, 0x37, 0xaa, 0x0e, 0xd7, 0x73, 0x3f, 0x7c, 0x3e, + 0x00, 0x6b, 0x3d, 0xf7, 0xc3, 0xe7, 0xf9, 0x47, 0xef, 0xa2, 0x20, 0xbe, + 0x1d, 0xde, 0xb6, 0x95, 0x94, 0x26, 0x1b, 0xa4, 0xb5, 0x50, 0xba, 0x4c, + 0xfc, 0x24, 0x5b, 0x42, 0x14, 0x28, 0x0c, 0x96, 0xa8, 0xcd, 0x86, 0xf9, + 0x4e, 0x02, 0x8f, 0x99, 0x32, 0x9b, 0x98, 0x1e, 0x0f, 0xfc, 0x4c, 0x99, + 0x19, 0x3b, 0x06, 0xf8, 0x65, 0xca, 0xb0, 0x30, 0x58, 0x22, 0x7b, 0x49, + 0x0e, 0x5e, 0x48, 0x06, 0x65, 0x5d, 0x7c, 0xd1, 0x8a, 0xc0, 0x6d, 0x40, + 0x5b, 0x71, 0xb7, 0x51, 0xe2, 0x39, 0x9d, 0x2a, 0x55, 0xaa, 0x54, 0xa9, + 0x52, 0xa5, 0x4a, 0x95, 0x2a, 0x55, 0xaa, 0x54, 0xa9, 0x52, 0xa5, 0x4a, + 0x95, 0x2a, 0x55, 0xaa, 0x54, 0xa9, 0x52, 0xa5, 0x4a, 0x95, 0x2a, 0x55, + 0xaa, 0x54, 0xa9, 0xfa, 0x92, 0x93, 0xf4, 0xb1, 0xcd, 0x54, 0xa9, 0x52, + 0xa5, 0x4a, 0x95, 0x2a, 0xd5, 0x1b, 0xa0, 0xad, 0xe7, 0xcf, 0x54, 0x61, + 0x65, 0x01, 0xcf, 0x5b, 0x78, 0x42, 0x74, 0x2f, 0x68, 0xd6, 0x62, 0x2f, + 0xa7, 0xbf, 0x5e, 0x5f, 0x40, 0xee, 0x05, 0x06, 0x3b, 0x1f, 0x70, 0xad, + 0x85, 0xe0, 0x60, 0xb6, 0xbd, 0x7e, 0xc3, 0xb6, 0xda, 0xf1, 0x49, 0x3c, + 0x0b, 0xdb, 0x05, 0x54, 0xfd, 0xfe, 0xb6, 0x72, 0xae, 0xdb, 0x60, 0x4f, + 0x5e, 0xef, 0x35, 0x49, 0x39, 0x06, 0x8d, 0xb2, 0x57, 0x82, 0xb2, 0x52, + 0x2f, 0x80, 0xca, 0x38, 0x54, 0x42, 0x80, 0x6c, 0xab, 0x89, 0x3a, 0xd2, + 0xd1, 0xa0, 0x19, 0x5f, 0x7f, 0x19, 0x99, 0x28, 0x28, 0x4c, 0x08, 0x17, + 0xf3, 0x59, 0xf9, 0x13, 0x7f, 0xbc, 0x87, 0x89, 0xa7, 0xa6, 0xb8, 0xf1, + 0xca, 0x11, 0x90, 0x70, 0xff, 0x27, 0xb6, 0x29, 0xa0, 0xd6, 0xd7, 0x0e, + 0x80, 0x80, 0xdd, 0x07, 0x0f, 0xd1, 0xf0, 0x24, 0x05, 0x57, 0x30, 0x72, + 0xe5, 0x08, 0xf7, 0xdf, 0xb4, 0x05, 0x3c, 0xc9, 0xc3, 0xa7, 0x55, 0x9c, + 0xfb, 0x3f, 0xb1, 0x8d, 0x8f, 0x7c, 0xf5, 0x00, 0x37, 0x5e, 0x39, 0x42, + 0xad, 0xad, 0xbe, 0xcc, 0x7a, 0xff, 0xc7, 0xb6, 0x29, 0x58, 0xd7, 0x95, + 0xe1, 0x4b, 0x7d, 0x23, 0x57, 0x8e, 0x20, 0x7c, 0x14, 0x2c, 0xcb, 0x82, + 0x0b, 0xc9, 0xb6, 0x54, 0xe9, 0x73, 0x40, 0xf8, 0x2a, 0x95, 0x05, 0x35, + 0x0b, 0x01, 0xa4, 0x44, 0x66, 0x55, 0x1e, 0xe2, 0x5f, 0x76, 0x8e, 0x2b, + 0xb0, 0xe9, 0x49, 0xca, 0xc5, 0x02, 0xd5, 0x7a, 0x03, 0x37, 0x9f, 0xa3, + 0x71, 0xb2, 0x11, 0x7d, 0x51, 0x5f, 0x42, 0x79, 0xad, 0xda, 0x6e, 0xc0, + 0x5b, 0x71, 0x88, 0x5a, 0x3c, 0x7d, 0x81, 0xff, 0x02, 0x13, 0xf4, 0xd6, + 0x6d, 0x70, 0xe1, 0x98, 0x3e, 0xff, 0xac, 0xf3, 0x3a, 0xe7, 0x43, 0xcd, + 0x97, 0xb8, 0x91, 0xfa, 0x53, 0xea, 0xe8, 0x35, 0x0f, 0xc1, 0xfa, 0x48, + 0x02, 0x04, 0x5e, 0xbb, 0x49, 0x2e, 0x80, 0x9e, 0x58, 0xc0, 0x2d, 0xa9, + 0x26, 0x65, 0xc9, 0x76, 0x6c, 0xba, 0xaa, 0x06, 0x6e, 0x19, 0xd8, 0x94, + 0x17, 0xdb, 0x6e, 0xfc, 0xcc, 0xd2, 0x43, 0x40, 0xbb, 0x19, 0x81, 0x19, + 0x08, 0xdf, 0x1c, 0x16, 0x75, 0xbc, 0xf8, 0x57, 0xb3, 0x03, 0x65, 0xf0, + 0xda, 0xc9, 0x13, 0x42, 0x12, 0xdb, 0x96, 0x05, 0x5e, 0xb2, 0x36, 0x9a, + 0x7e, 0x7a, 0x9a, 0xca, 0xa5, 0x15, 0x36, 0x6e, 0xd8, 0xc8, 0xc4, 0x63, + 0x13, 0xe4, 0x96, 0x29, 0x40, 0x55, 0xeb, 0xf9, 0x16, 0xee, 0x4a, 0x1d, + 0xe6, 0xc9, 0x69, 0xa4, 0xd7, 0x6d, 0x2b, 0x9e, 0x4f, 0x61, 0xd1, 0xcb, + 0xec, 0xf6, 0xc5, 0xce, 0xbb, 0x5d, 0x3e, 0x85, 0xc1, 0x02, 0x2d, 0x3d, + 0x21, 0xcc, 0x6b, 0xf7, 0xf9, 0xad, 0xee, 0xad, 0xa8, 0xb9, 0x6a, 0x44, + 0xcf, 0x6b, 0x03, 0xcf, 0xea, 0xc8, 0x4e, 0xc4, 0x6d, 0x40, 0x59, 0xad, + 0xb9, 0x56, 0xa2, 0xdb, 0x00, 0xdd, 0x92, 0x14, 0x2f, 0x53, 0x6f, 0xce, + 0x0b, 0x20, 0x59, 0x4b, 0x75, 0xdb, 0x6d, 0x5d, 0x2f, 0xf7, 0x52, 0xb4, + 0x90, 0x8d, 0x78, 0xbd, 0x8b, 0xec, 0xe2, 0x93, 0xa0, 0xe2, 0xf6, 0x6c, + 0x7f, 0x88, 0x4e, 0xa4, 0x8a, 0xf8, 0xe9, 0x7d, 0x99, 0x32, 0x8c, 0x9c, + 0xb3, 0x3a, 0x4e, 0xaf, 0x49, 0x5b, 0x8b, 0x95, 0x83, 0x7d, 0x5e, 0x97, + 0xdf, 0x7b, 0x49, 0xe0, 0x9f, 0x34, 0x87, 0xed, 0x97, 0x63, 0xeb, 0xbd, + 0xe6, 0xb9, 0xcd, 0x24, 0xb8, 0x87, 0xe8, 0x9a, 0xa7, 0x97, 0x18, 0x36, + 0x09, 0x54, 0x15, 0x87, 0x66, 0xbd, 0x1a, 0x0b, 0x1f, 0xdf, 0x8f, 0x0d, + 0xb4, 0x4a, 0x4a, 0x47, 0x92, 0x92, 0xc0, 0x61, 0x76, 0x7a, 0x42, 0xf7, + 0x4c, 0xcf, 0x7c, 0xc7, 0xe3, 0xdb, 0xeb, 0x7b, 0xf7, 0xee, 0x65, 0x66, + 0x66, 0xb1, 0x98, 0x4a, 0x9b, 0xc7, 0xc6, 0x16, 0x0f, 0xa4, 0xf5, 0x15, + 0xe0, 0x59, 0xe0, 0xd3, 0x9b, 0x37, 0x2f, 0x1a, 0xb6, 0xfc, 0xde, 0x4b, + 0xd4, 0x0c, 0x7c, 0x60, 0xdd, 0xda, 0xee, 0xed, 0xdf, 0x9a, 0xf8, 0x7b, + 0xae, 0x1f, 0xf9, 0x37, 0xbc, 0xcf, 0x5c, 0x07, 0x86, 0xdf, 0xcd, 0xdf, + 0x4c, 0x3d, 0xc3, 0xfb, 0x86, 0x17, 0x06, 0x6b, 0x2d, 0x04, 0xb9, 0x8a, + 0x03, 0xb5, 0xa0, 0xfb, 0x3a, 0x63, 0x1f, 0x91, 0x9e, 0x1f, 0x4e, 0xdc, + 0xb5, 0xfd, 0x8c, 0xf2, 0xb1, 0x6d, 0xf1, 0xb0, 0x66, 0xdd, 0xc4, 0x59, + 0x4a, 0xcf, 0xea, 0xb0, 0x43, 0x08, 0x90, 0x3a, 0x1a, 0xbb, 0x06, 0x1c, + 0xad, 0x41, 0x3e, 0x0c, 0x07, 0x30, 0xbc, 0x84, 0x09, 0xed, 0x76, 0xba, + 0x6d, 0xf7, 0xb9, 0xc0, 0xb3, 0x6e, 0xb6, 0xe2, 0xef, 0x37, 0x6e, 0x1f, + 0x3e, 0x02, 0x6c, 0xd3, 0xab, 0xeb, 0xd6, 0xa2, 0xc8, 0x0f, 0xc0, 0xba, + 0xbc, 0xf5, 0x55, 0x7a, 0x60, 0xec, 0xeb, 0xfb, 0x60, 0xf3, 0xa8, 0x4e, + 0x4c, 0x01, 0x71, 0x9f, 0x9a, 0xf2, 0xb7, 0xe5, 0x53, 0x1b, 0xe1, 0xda, + 0x61, 0x0e, 0xcd, 0x4c, 0xb1, 0x05, 0x09, 0x37, 0xe8, 0xd2, 0xd8, 0x3a, + 0x02, 0xdf, 0x3c, 0x8c, 0x38, 0x59, 0x85, 0xf7, 0xdf, 0xc6, 0x36, 0x3d, + 0x1f, 0xe2, 0xc0, 0xc1, 0x87, 0xd9, 0x86, 0x07, 0x37, 0xdd, 0xa6, 0x3c, + 0x0e, 0xee, 0x0b, 0xf6, 0x71, 0xeb, 0xc7, 0xb6, 0xf3, 0xc0, 0xd7, 0xf6, + 0x73, 0x78, 0x12, 0xf6, 0x6c, 0x75, 0xd9, 0xf5, 0x94, 0xc7, 0x9e, 0xcb, + 0xcc, 0xb5, 0x24, 0xfc, 0xa2, 0xfb, 0xae, 0xa7, 0x3c, 0xaa, 0xf5, 0x22, + 0x87, 0x44, 0x93, 0x3d, 0x9b, 0x05, 0xbb, 0x67, 0x3c, 0xee, 0x1a, 0x72, + 0xc9, 0x65, 0xa3, 0xe1, 0xde, 0x79, 0x5c, 0xb0, 0xef, 0x21, 0x11, 0x02, + 0xb5, 0xd6, 0xee, 0x51, 0x10, 0x2a, 0xa3, 0x3c, 0xe0, 0xdd, 0x03, 0xb2, + 0xc3, 0x03, 0x7f, 0xda, 0x80, 0x0f, 0x96, 0x54, 0xfe, 0xe3, 0xf0, 0xac, + 0x7f, 0x1a, 0x87, 0xaf, 0x0e, 0xf3, 0x86, 0xeb, 0x43, 0x5b, 0xb8, 0x3f, + 0x56, 0xd7, 0xb7, 0xcb, 0x84, 0xfb, 0x99, 0x0f, 0x8e, 0x41, 0xbd, 0x06, + 0x33, 0x55, 0x78, 0xf4, 0x30, 0x6c, 0x5e, 0xbc, 0x2d, 0x58, 0x97, 0xcf, + 0x40, 0x53, 0x9f, 0xd7, 0xd6, 0xf5, 0x1a, 0xe8, 0x09, 0xd4, 0xaa, 0x5c, + 0x21, 0xfa, 0x06, 0x6a, 0x25, 0x69, 0xe4, 0xea, 0x1c, 0x13, 0x8f, 0xb7, + 0x82, 0x7e, 0x46, 0x1c, 0x82, 0xba, 0x14, 0xf8, 0x69, 0x2f, 0xdb, 0xaf, + 0x55, 0x36, 0x50, 0xcb, 0xf6, 0x93, 0xf1, 0x89, 0xb9, 0x6e, 0x8e, 0xa9, + 0xfa, 0xe1, 0x6e, 0x03, 0xb3, 0x09, 0x7e, 0x00, 0x2b, 0xa3, 0x75, 0x22, + 0x2c, 0xd2, 0x4e, 0x60, 0xd9, 0xcd, 0x85, 0x44, 0x81, 0x2c, 0xdd, 0xd2, + 0x7e, 0x19, 0x07, 0x3a, 0x3e, 0x64, 0x06, 0x7b, 0xa4, 0xc1, 0xa4, 0x23, + 0xaf, 0xca, 0xd3, 0xbe, 0x5e, 0x8f, 0x5e, 0x52, 0x4e, 0x0e, 0xff, 0x06, + 0xc9, 0x86, 0x51, 0xc5, 0x8f, 0xa4, 0x01, 0x2e, 0x60, 0x9e, 0x57, 0x70, + 0xb9, 0x00, 0xef, 0x65, 0x70, 0x2f, 0x84, 0x7f, 0xe6, 0x65, 0xde, 0xce, + 0x85, 0x3d, 0xc1, 0x5a, 0x3f, 0x5d, 0xb6, 0x8c, 0xcb, 0x87, 0x86, 0x78, + 0xeb, 0x5b, 0xdf, 0xca, 0xd1, 0xa3, 0x47, 0x03, 0xff, 0x6a, 0x35, 0x0a, + 0xac, 0x8d, 0xaf, 0xbf, 0xe7, 0x3d, 0xef, 0xe1, 0x27, 0x3f, 0xf9, 0x09, + 0x33, 0x33, 0x33, 0xbc, 0xc5, 0x82, 0x71, 0x19, 0xfd, 0xc2, 0xc5, 0x59, + 0xd6, 0xfe, 0xf2, 0x3b, 0x78, 0xe2, 0xd9, 0x59, 0x2e, 0xba, 0xf0, 0xcd, + 0xbc, 0xf0, 0x92, 0xe4, 0x95, 0x8b, 0x2e, 0x62, 0xe0, 0xa2, 0xb7, 0xf0, + 0x2f, 0x2f, 0xb6, 0x17, 0xcd, 0x0b, 0x8b, 0xf8, 0xbf, 0x5e, 0x1a, 0xbd, + 0xa4, 0xcc, 0x03, 0xfa, 0x18, 0xb2, 0xaf, 0xd7, 0x63, 0x9b, 0xa6, 0x99, + 0x38, 0x02, 0x95, 0x0d, 0x39, 0x32, 0x62, 0x9a, 0x89, 0x23, 0x1d, 0xf8, + 0x8f, 0x30, 0xba, 0x35, 0xc7, 0xa1, 0x87, 0x5c, 0xb6, 0x7d, 0xb4, 0x1b, + 0xf0, 0x2b, 0x1c, 0xd5, 0x27, 0xf4, 0xda, 0xea, 0x9e, 0xab, 0x5c, 0x52, + 0xc7, 0x53, 0x6d, 0xae, 0x4e, 0x69, 0xb0, 0x08, 0x40, 0xce, 0x75, 0x83, + 0x49, 0x8a, 0x10, 0x42, 0xb3, 0x3a, 0xed, 0x16, 0x99, 0x6c, 0x2e, 0x02, + 0x8d, 0x32, 0x7e, 0x40, 0x04, 0xa8, 0x15, 0x07, 0x51, 0x09, 0xe1, 0x2a, + 0xc8, 0xb5, 0xde, 0x66, 0xfc, 0x4a, 0xcb, 0x4a, 0x48, 0xe9, 0x51, 0x1a, + 0xca, 0x23, 0xa5, 0x47, 0x53, 0x4a, 0x3a, 0xed, 0x16, 0x9e, 0xa3, 0xae, + 0x55, 0x63, 0xd7, 0x56, 0x38, 0xfc, 0xd8, 0x34, 0x95, 0x62, 0xc5, 0xca, + 0x83, 0x9a, 0xd4, 0x6a, 0xdb, 0xb1, 0xf7, 0x33, 0x3e, 0x39, 0x89, 0xad, + 0x91, 0x4a, 0xb9, 0xe7, 0xfe, 0x17, 0x4b, 0x9f, 0xed, 0xc7, 0xca, 0x31, + 0x84, 0x6e, 0x0b, 0x04, 0x19, 0x3d, 0x11, 0x15, 0xf0, 0x3b, 0xb8, 0x39, + 0x97, 0x5a, 0xbd, 0x46, 0xa9, 0x58, 0x0a, 0xec, 0x4e, 0x4f, 0x4f, 0xd3, + 0x92, 0x92, 0xca, 0x65, 0xe5, 0x48, 0xb9, 0xd5, 0xe7, 0xa0, 0xd1, 0x50, + 0xe5, 0xbd, 0xfe, 0xb2, 0x22, 0x9e, 0x1b, 0x5e, 0x97, 0xd7, 0xad, 0x05, + 0x4e, 0x2a, 0xf7, 0xcf, 0xfa, 0xbc, 0x4e, 0xd5, 0x9f, 0x4e, 0xe9, 0xa5, + 0xb9, 0x6b, 0x7a, 0x01, 0xf8, 0x11, 0xb0, 0x46, 0xbb, 0xdf, 0x06, 0xfc, + 0x43, 0x42, 0x3c, 0xfb, 0xbc, 0xb6, 0xef, 0xb9, 0x96, 0xa2, 0x26, 0x1a, + 0x2c, 0xa0, 0xaf, 0xd5, 0x05, 0x40, 0xf5, 0xbe, 0x04, 0x65, 0x24, 0x55, + 0x04, 0x53, 0x7d, 0xb4, 0x58, 0x05, 0x47, 0x01, 0xcd, 0x7f, 0x44, 0x98, + 0x9f, 0xf3, 0xa9, 0x92, 0x03, 0x93, 0x5e, 0x14, 0x6e, 0x2b, 0x05, 0x4c, + 0x7a, 0x50, 0x49, 0xe8, 0x67, 0x34, 0xe6, 0x3c, 0x24, 0x82, 0xc3, 0x59, + 0xc9, 0xb0, 0x84, 0x13, 0xd6, 0x36, 0xd7, 0x09, 0xdb, 0xe9, 0x12, 0x30, + 0xa1, 0xcb, 0xb0, 0x04, 0xd4, 0x80, 0x49, 0x04, 0xeb, 0x91, 0xe7, 0x1d, + 0xa4, 0x15, 0x49, 0x5f, 0xcc, 0x76, 0xd0, 0x5a, 0xfa, 0x90, 0x49, 0xe8, + 0xcb, 0x47, 0xee, 0xb9, 0xac, 0xbe, 0xd9, 0xce, 0x0f, 0x14, 0xb9, 0xe7, + 0x9b, 0x75, 0x2a, 0x2b, 0x5d, 0xa6, 0x67, 0x3d, 0x2a, 0x2b, 0xc3, 0x6d, + 0x66, 0xbd, 0xb2, 0xd2, 0x65, 0xec, 0x5a, 0xe5, 0x7f, 0xcf, 0xc1, 0x3a, + 0xe5, 0x95, 0x2e, 0xd5, 0x59, 0x8f, 0x3b, 0xb7, 0x16, 0x01, 0x38, 0xfc, + 0x84, 0xb2, 0x3b, 0x55, 0x57, 0x7e, 0xf6, 0xfa, 0x70, 0xd1, 0x8d, 0xf8, + 0x8f, 0x5d, 0xe9, 0x72, 0xf7, 0x43, 0x75, 0x86, 0x8b, 0xca, 0x9e, 0x59, + 0x1a, 0x4d, 0xd5, 0xbd, 0xc0, 0x7f, 0xaa, 0xee, 0x51, 0xb8, 0x34, 0xdc, + 0x66, 0x03, 0xb5, 0x8c, 0x0a, 0x1f, 0x6a, 0x51, 0x79, 0x52, 0xb9, 0xc7, + 0x3f, 0xac, 0x61, 0x46, 0xbf, 0x97, 0x27, 0x44, 0x8d, 0x29, 0xed, 0x3b, + 0x58, 0x07, 0x87, 0x60, 0xb2, 0x7d, 0x1c, 0xac, 0x65, 0xa0, 0x58, 0x8d, + 0xef, 0x1c, 0xa3, 0x47, 0xef, 0xa7, 0x4b, 0xe7, 0x0a, 0xcf, 0xea, 0xc7, + 0xee, 0x6d, 0x5b, 0x6f, 0x64, 0xdf, 0x43, 0x0f, 0xf7, 0x17, 0x21, 0x36, + 0x4e, 0x68, 0xf7, 0xcd, 0xc6, 0xdc, 0x75, 0x89, 0x51, 0x5c, 0x61, 0xe3, + 0xde, 0x92, 0x25, 0xfd, 0x16, 0xae, 0x53, 0x48, 0x06, 0x52, 0x39, 0x39, + 0x5c, 0xa7, 0xa0, 0x80, 0x4f, 0x80, 0x2b, 0x4a, 0x1a, 0x98, 0x65, 0xec, + 0x29, 0x70, 0x96, 0x27, 0x9b, 0x0a, 0x2e, 0xd5, 0x9e, 0xc2, 0x93, 0x06, + 0xac, 0x65, 0x97, 0x70, 0x23, 0x80, 0x49, 0xb8, 0xa2, 0x44, 0x6b, 0xae, + 0x05, 0xfe, 0x1d, 0x3d, 0x52, 0xb4, 0x07, 0xd7, 0x51, 0xf7, 0x5a, 0x9e, + 0x19, 0xc9, 0x77, 0x04, 0x9e, 0xfe, 0xf8, 0x89, 0xd4, 0x63, 0xa9, 0xe6, + 0x83, 0x0c, 0xd2, 0x5f, 0x1c, 0x00, 0x9f, 0xac, 0x06, 0x9e, 0xdf, 0x54, + 0x60, 0x2d, 0x26, 0x68, 0x05, 0xc4, 0xcf, 0x06, 0x2d, 0x0d, 0x4d, 0x76, + 0x45, 0x29, 0x80, 0x6e, 0x19, 0x78, 0x68, 0x1c, 0x16, 0xe6, 0xf9, 0x1e, + 0xae, 0xe3, 0x5a, 0xe5, 0x17, 0xdd, 0x6e, 0xe7, 0x1d, 0x00, 0xe9, 0x85, + 0x40, 0x2d, 0xe9, 0x81, 0x50, 0x10, 0x2d, 0x57, 0xb8, 0xe0, 0xb4, 0xc8, + 0xb8, 0x05, 0xbc, 0x66, 0xb4, 0x36, 0xc6, 0xdc, 0x75, 0xec, 0x4b, 0x68, + 0xc3, 0x6d, 0x58, 0x56, 0xbd, 0x0e, 0x0f, 0xd6, 0x51, 0x20, 0xac, 0xcf, + 0x5b, 0x1b, 0x62, 0x8a, 0x84, 0xb3, 0x0c, 0xd4, 0x6d, 0x47, 0x51, 0xfd, + 0x1e, 0x3c, 0xae, 0xbc, 0x8a, 0x45, 0xf8, 0xbc, 0x0e, 0x6b, 0x98, 0x51, + 0x41, 0xd4, 0xf8, 0x40, 0xdb, 0x26, 0xfa, 0x93, 0x1d, 0xcf, 0x02, 0x6b, + 0x1d, 0xd9, 0x01, 0x7b, 0xf6, 0xc0, 0x0d, 0x37, 0xc0, 0x23, 0x8f, 0xc0, + 0xd0, 0x2e, 0x98, 0x99, 0x99, 0x61, 0x07, 0x70, 0x64, 0x48, 0x8f, 0x89, + 0xcd, 0xc0, 0xa6, 0xa1, 0x70, 0x14, 0x6d, 0xc7, 0x97, 0xe0, 0xc8, 0xd0, + 0x0c, 0xbf, 0xb3, 0x67, 0x86, 0x1b, 0x6e, 0x20, 0x00, 0x64, 0xbd, 0xfd, + 0xe9, 0x4d, 0xcc, 0x5c, 0xba, 0x97, 0x43, 0x9b, 0xe0, 0xc8, 0x91, 0xbd, + 0x5d, 0x49, 0x18, 0x62, 0x88, 0x23, 0x33, 0x33, 0x0c, 0x0d, 0x85, 0xfb, + 0xdc, 0x71, 0x44, 0xa5, 0xa1, 0x17, 0x58, 0xeb, 0x23, 0xa6, 0x6a, 0x36, + 0xc1, 0x9d, 0x47, 0xe0, 0xba, 0xe3, 0x1a, 0xa8, 0x75, 0x1c, 0x36, 0xdc, + 0x02, 0xdc, 0x52, 0xe7, 0x38, 0x70, 0xcb, 0x83, 0xf0, 0xa0, 0x0e, 0x7a, + 0xcb, 0x2d, 0xba, 0xbc, 0x36, 0x44, 0x6d, 0x7d, 0x5e, 0x07, 0x78, 0x10, + 0x82, 0x0a, 0x58, 0x6c, 0xdc, 0x6c, 0x31, 0x49, 0x29, 0xe1, 0xf2, 0x32, + 0xf2, 0x49, 0x75, 0x8c, 0xc5, 0xc7, 0x80, 0x9b, 0xc7, 0x27, 0x7b, 0xc6, + 0x3d, 0xef, 0xb2, 0x4f, 0x4b, 0x0d, 0x8a, 0xa9, 0xb7, 0xbd, 0xe8, 0x07, + 0x74, 0x92, 0xce, 0x5d, 0x03, 0x8e, 0xd2, 0x52, 0x8f, 0xaf, 0x54, 0x99, + 0xa8, 0x3e, 0x73, 0x5e, 0x01, 0x94, 0x7c, 0x89, 0x10, 0x39, 0x7a, 0xe1, + 0xf4, 0x20, 0x7c, 0x6e, 0xd1, 0x75, 0x1f, 0x6e, 0xa9, 0xb2, 0x7b, 0x27, + 0xd3, 0x77, 0xdd, 0x13, 0x1d, 0x53, 0x3f, 0x87, 0x36, 0x65, 0xa9, 0x70, + 0x32, 0x7b, 0xdc, 0x2c, 0xfe, 0xfc, 0x5a, 0x06, 0xed, 0x9d, 0x24, 0xd7, + 0x96, 0x34, 0x1c, 0x58, 0x2f, 0x35, 0x0c, 0x4b, 0x97, 0xcf, 0x76, 0x47, + 0x70, 0xaf, 0x94, 0xdc, 0x2f, 0x04, 0x55, 0x47, 0x52, 0x76, 0x04, 0xf7, + 0xb6, 0x65, 0x70, 0xbf, 0x1f, 0x49, 0x8f, 0x81, 0x5c, 0x39, 0x0a, 0x9e, + 0x95, 0x84, 0x69, 0xf6, 0x50, 0xa0, 0x42, 0x81, 0x60, 0x54, 0x8f, 0xff, + 0xef, 0x98, 0x93, 0x94, 0xb2, 0x2e, 0x35, 0x1b, 0x32, 0x99, 0x75, 0xd5, + 0xf8, 0xbe, 0x2f, 0xc9, 0x21, 0x68, 0xe9, 0xb0, 0x39, 0x47, 0xd0, 0xf2, + 0xc3, 0x36, 0x5b, 0xfa, 0x12, 0x17, 0x89, 0x27, 0x44, 0x98, 0x76, 0xad, + 0xf5, 0x3a, 0x2d, 0xd2, 0x89, 0x82, 0xab, 0x16, 0xfa, 0x80, 0xc8, 0x94, + 0x93, 0xdc, 0xef, 0x01, 0xc0, 0x97, 0x48, 0xc7, 0x3c, 0xe1, 0x13, 0x8c, + 0x20, 0x99, 0x40, 0x90, 0x54, 0x1d, 0xc1, 0x3e, 0xfd, 0x70, 0xd4, 0x4f, + 0x4a, 0x49, 0x2e, 0x0b, 0x1d, 0xfb, 0x59, 0x9d, 0x65, 0x33, 0x90, 0x03, + 0x2d, 0x50, 0x75, 0x90, 0x55, 0xa8, 0x95, 0x09, 0x62, 0x32, 0xe3, 0xc1, + 0x52, 0x86, 0xc7, 0xb1, 0xf5, 0x9c, 0x8b, 0x0f, 0x87, 0x41, 0xdf, 0x85, + 0xe4, 0x59, 0x44, 0xd7, 0x72, 0xe8, 0x3d, 0x3f, 0x61, 0xe6, 0xfb, 0x6f, + 0xed, 0xb9, 0x7e, 0xae, 0x4b, 0x1b, 0x10, 0x75, 0xf6, 0xc5, 0x79, 0xd6, + 0xac, 0x59, 0xc3, 0x7c, 0xe3, 0x6c, 0xe0, 0xbf, 0xc6, 0xea, 0x52, 0x19, + 0xe0, 0x15, 0xc0, 0x8a, 0x15, 0x0a, 0x42, 0x63, 0x00, 0x57, 0x06, 0x52, + 0x15, 0x87, 0x56, 0x41, 0x08, 0xa8, 0x5a, 0xb1, 0x62, 0xc5, 0xeb, 0x67, + 0xf3, 0x5d, 0x6b, 0xba, 0x6c, 0x06, 0xdb, 0xd6, 0xac, 0x89, 0x00, 0xb1, + 0x80, 0xc8, 0xba, 0xb1, 0x69, 0xec, 0x1a, 0x7f, 0x63, 0x77, 0xbe, 0x71, + 0x96, 0xb3, 0x2f, 0xce, 0x07, 0xfb, 0x8c, 0x83, 0xd5, 0x4d, 0xfa, 0x4f, + 0x9d, 0x52, 0x77, 0x31, 0x06, 0xe0, 0x15, 0xe8, 0xc3, 0xc0, 0x76, 0xe5, + 0xec, 0xa7, 0x0d, 0x17, 0x1a, 0x0a, 0xda, 0xf4, 0x3c, 0xf2, 0xae, 0xee, + 0x67, 0xc4, 0x8e, 0xbb, 0x5c, 0xb1, 0x40, 0x41, 0x14, 0x58, 0x7f, 0x6d, + 0x85, 0x43, 0xdf, 0x3e, 0x1c, 0x3c, 0xd3, 0x37, 0x50, 0xb7, 0x5c, 0x5e, + 0xd0, 0xaa, 0x37, 0x10, 0xd9, 0x1c, 0xa5, 0x55, 0x65, 0x72, 0x83, 0x90, + 0xa1, 0x40, 0xfe, 0x43, 0x37, 0x73, 0xf8, 0x1b, 0x87, 0xa3, 0x40, 0x2d, + 0xd9, 0x02, 0x91, 0x53, 0x71, 0x74, 0xf7, 0xa6, 0x55, 0x6f, 0x81, 0xf5, + 0xf1, 0x22, 0xe1, 0x74, 0x98, 0xfe, 0xde, 0x34, 0xee, 0x90, 0x1e, 0x80, + 0xcf, 0x12, 0xb8, 0x4f, 0xcc, 0xd4, 0x90, 0x9e, 0xa4, 0x34, 0xe8, 0xd2, + 0x99, 0xcb, 0x91, 0x13, 0x50, 0x6d, 0xd4, 0xc3, 0xb4, 0x0a, 0x68, 0x91, + 0xd1, 0x90, 0x2f, 0x34, 0x28, 0x4b, 0x83, 0xb5, 0xda, 0x2d, 0xfd, 0x6c, + 0x51, 0x8d, 0x6d, 0xc8, 0xa6, 0x44, 0x38, 0x99, 0x00, 0xb0, 0xd5, 0x6a, + 0x82, 0x9c, 0x6b, 0x24, 0x8e, 0xa7, 0x1a, 0x68, 0x58, 0xc6, 0x51, 0xe9, + 0x15, 0xba, 0x9d, 0x1b, 0x7f, 0x62, 0x5a, 0x97, 0x61, 0x08, 0x0c, 0xcb, + 0xe5, 0x05, 0x9e, 0xf5, 0x38, 0x7b, 0xe4, 0xca, 0x0a, 0x0f, 0x1f, 0xdc, + 0xcf, 0xba, 0x4b, 0x87, 0xd9, 0xff, 0xb5, 0xfd, 0x94, 0xd6, 0x86, 0x7d, + 0x66, 0xe9, 0x67, 0x98, 0x98, 0xad, 0x52, 0x18, 0xcc, 0xd1, 0xf1, 0x24, + 0x62, 0xb0, 0x40, 0x6e, 0x50, 0xe5, 0x41, 0x22, 0x19, 0xb9, 0xb2, 0x4c, + 0xab, 0xa1, 0x1a, 0x92, 0xea, 0x6c, 0x2d, 0xf2, 0x61, 0xaa, 0x60, 0x2c, + 0xc5, 0x3a, 0xa7, 0x43, 0x00, 0x55, 0xd8, 0x67, 0x6f, 0x58, 0x44, 0x79, + 0x1b, 0x48, 0xd5, 0x98, 0xab, 0x45, 0xc2, 0x99, 0xb8, 0x40, 0x00, 0xb1, + 0x2a, 0x0c, 0x96, 0x02, 0x88, 0x54, 0xdc, 0x56, 0x3c, 0x8e, 0xed, 0xb6, + 0xb5, 0xf7, 0xe1, 0x23, 0xec, 0xb8, 0x71, 0x13, 0x2b, 0xde, 0xb1, 0x8c, + 0xe7, 0x7e, 0xa8, 0xc6, 0x2d, 0x1f, 0x3f, 0xf9, 0xe3, 0x00, 0x52, 0x15, + 0xb7, 0x65, 0xc3, 0xb0, 0x8c, 0xbf, 0xad, 0xc2, 0x60, 0x58, 0x06, 0xf1, + 0xf4, 0x2c, 0xc5, 0x56, 0x63, 0xae, 0x16, 0xac, 0xdb, 0x36, 0x23, 0xf9, + 0xb5, 0xca, 0x6b, 0xea, 0xe9, 0x89, 0x08, 0x3c, 0xcb, 0xb6, 0x6b, 0xca, + 0xca, 0x56, 0xf6, 0x92, 0x1c, 0x6f, 0xcf, 0x67, 0x98, 0x7d, 0x5a, 0x5d, + 0xbf, 0x56, 0xbe, 0xb5, 0xc2, 0x3b, 0x57, 0xaf, 0xe2, 0x07, 0xa7, 0xcf, + 0x00, 0x24, 0xba, 0xcf, 0xcc, 0x7f, 0x87, 0x55, 0x03, 0xd7, 0x68, 0x0b, + 0x1a, 0x98, 0x67, 0x9d, 0xd3, 0xa9, 0x52, 0xa5, 0x4a, 0x95, 0x2a, 0x55, + 0xaa, 0x54, 0xa9, 0x52, 0xa5, 0x4a, 0x95, 0x2a, 0x55, 0xaa, 0x54, 0xa9, + 0x52, 0xa5, 0x4a, 0x95, 0x2a, 0x55, 0xaa, 0x54, 0xa9, 0x52, 0xa5, 0x4a, + 0x95, 0xaa, 0x7f, 0x39, 0x8f, 0xc2, 0x1b, 0xf7, 0xc9, 0xed, 0x54, 0xa9, + 0x52, 0xa5, 0x4a, 0x95, 0x2a, 0x15, 0x00, 0x2e, 0xbc, 0xca, 0x43, 0x90, + 0xd9, 0xba, 0xf0, 0xd7, 0x04, 0xcd, 0x8b, 0xca, 0x0b, 0x86, 0x91, 0x92, + 0xc6, 0x6c, 0x7f, 0xd3, 0xa4, 0x6c, 0x28, 0x49, 0x1c, 0x20, 0x22, 0x7d, + 0x19, 0xbc, 0x54, 0x9e, 0x04, 0x37, 0x59, 0xcc, 0xe6, 0xf9, 0x90, 0x9d, + 0x3e, 0xfb, 0x25, 0xed, 0x7e, 0xca, 0x20, 0xbe, 0x1e, 0x07, 0x73, 0xc5, + 0xf3, 0x1b, 0xbc, 0xbc, 0xde, 0x47, 0xd8, 0x82, 0x5b, 0xa0, 0x39, 0x1b, + 0x03, 0x19, 0xc5, 0xd3, 0x60, 0xa5, 0x33, 0xc3, 0x08, 0x3c, 0x14, 0x6e, + 0x3b, 0x71, 0xdc, 0x63, 0x5d, 0xf0, 0x45, 0x67, 0x6d, 0x3b, 0xd8, 0x87, + 0x0c, 0xa1, 0x51, 0xf6, 0x0b, 0xd8, 0xd6, 0x66, 0xe3, 0x34, 0x30, 0x0c, + 0x35, 0xb1, 0x3f, 0x56, 0x26, 0x2e, 0x88, 0x55, 0x10, 0xcc, 0xdb, 0x35, + 0x1f, 0xab, 0xf7, 0x45, 0x00, 0x90, 0x32, 0xba, 0xff, 0x13, 0x0a, 0x2f, + 0xb1, 0xee, 0xb3, 0xbb, 0xb8, 0xf1, 0xca, 0x11, 0x1a, 0x5e, 0xb8, 0x93, + 0x75, 0x9f, 0xdd, 0x05, 0xf7, 0x1d, 0xa0, 0xe0, 0x0a, 0xe5, 0x4f, 0x38, + 0x25, 0xe9, 0xf6, 0x83, 0x87, 0x28, 0xb8, 0x82, 0xdb, 0x36, 0x8f, 0xf2, + 0xf0, 0x13, 0x13, 0x9c, 0xf8, 0xe3, 0x3d, 0x94, 0xb2, 0x82, 0x9a, 0xf5, + 0x52, 0xf9, 0x3d, 0xc7, 0x8e, 0xb1, 0x13, 0xb8, 0xff, 0xa6, 0x2d, 0xdc, + 0x7e, 0xdf, 0x01, 0x6e, 0x3f, 0x78, 0x48, 0xc1, 0xb8, 0x74, 0x7c, 0x08, + 0x27, 0x1c, 0xa0, 0x5f, 0x8a, 0xef, 0x92, 0x03, 0xa2, 0x2c, 0x22, 0x79, + 0x49, 0x62, 0x2c, 0xc4, 0x25, 0x1d, 0xa8, 0x6a, 0x90, 0x96, 0xa7, 0x27, + 0x1a, 0x89, 0xac, 0x08, 0x20, 0x62, 0x01, 0x50, 0xcb, 0x92, 0x79, 0x29, + 0x5e, 0xb6, 0x25, 0x2d, 0xbf, 0xa5, 0xc0, 0x5f, 0xd6, 0x0b, 0xf3, 0x3a, + 0xc1, 0x01, 0xc8, 0xac, 0x2b, 0xbd, 0x5f, 0x2e, 0x71, 0xe2, 0xb8, 0x95, + 0x38, 0xeb, 0xbc, 0x6e, 0x39, 0xc1, 0xae, 0xd5, 0x3a, 0x6a, 0x5a, 0x9d, + 0x74, 0xba, 0x27, 0xa1, 0x7b, 0x6d, 0x19, 0x9d, 0xbc, 0x01, 0x6a, 0x42, + 0x96, 0x03, 0x20, 0x91, 0x0e, 0xd4, 0xcc, 0x57, 0xb9, 0xbb, 0xf2, 0x2d, + 0x98, 0x6c, 0x1b, 0x3b, 0xbd, 0x8f, 0xd3, 0xa4, 0x6d, 0x1d, 0xbd, 0x6f, + 0xf5, 0xe2, 0xbe, 0x24, 0xe7, 0x84, 0x53, 0x3e, 0xdc, 0x6c, 0xa9, 0x27, + 0x44, 0x6b, 0x31, 0xa9, 0x49, 0xea, 0xdd, 0x13, 0xd8, 0x93, 0x64, 0xc0, + 0x5a, 0x23, 0xd7, 0x46, 0xdb, 0xc3, 0xe9, 0x27, 0xa7, 0xa9, 0x5c, 0x5e, + 0xe9, 0x11, 0x6b, 0x69, 0x32, 0x79, 0xb7, 0xcb, 0xa0, 0x61, 0x4d, 0x1e, + 0x93, 0x72, 0xe1, 0xf3, 0x1b, 0x16, 0x3b, 0xaf, 0x75, 0x18, 0xeb, 0x45, + 0x6f, 0x03, 0xce, 0x5a, 0xc8, 0xdd, 0x0b, 0xa8, 0x95, 0x24, 0x03, 0xc8, + 0x3a, 0x17, 0xb7, 0x69, 0xd3, 0x26, 0xbf, 0xf3, 0x06, 0x4e, 0x52, 0xd2, + 0x32, 0xed, 0xb3, 0x0d, 0x25, 0x30, 0xda, 0x78, 0xdd, 0xc6, 0xbe, 0xe2, + 0xda, 0x32, 0x79, 0x48, 0x82, 0x6f, 0x25, 0x69, 0xfd, 0x35, 0xeb, 0x7b, + 0x6e, 0x4b, 0xd4, 0x6c, 0xb5, 0xeb, 0xbc, 0xae, 0xfe, 0xed, 0x0b, 0x94, + 0x59, 0xbd, 0x34, 0x3b, 0x31, 0xf5, 0x03, 0xda, 0x3a, 0x97, 0xf8, 0x4b, + 0x09, 0x9f, 0x04, 0xe6, 0x5a, 0x28, 0x7c, 0x1c, 0x9e, 0xd5, 0x2b, 0xfc, + 0x42, 0x69, 0xb3, 0xe1, 0x5e, 0x43, 0x74, 0xc3, 0xb8, 0x86, 0xac, 0x09, + 0x87, 0xe7, 0x4b, 0x43, 0x9f, 0xfa, 0x14, 0xa7, 0x67, 0x66, 0x78, 0xd7, + 0xa3, 0x8f, 0x2e, 0x3e, 0x6f, 0xf2, 0xde, 0xd5, 0x54, 0xff, 0xf6, 0x85, + 0x60, 0xf5, 0xc4, 0x49, 0x58, 0x77, 0x6d, 0xf4, 0xbc, 0xbe, 0x71, 0x52, + 0xf0, 0x37, 0x53, 0xcf, 0x44, 0xfc, 0xae, 0x3f, 0x16, 0xba, 0xe3, 0x40, + 0xab, 0xf3, 0x25, 0x1b, 0x8c, 0x15, 0x87, 0x64, 0x2d, 0xe6, 0x7f, 0xa7, + 0xbe, 0x66, 0xdd, 0x7d, 0x1e, 0xd2, 0xb6, 0xd3, 0x87, 0xdb, 0x67, 0xe1, + 0xfe, 0x95, 0xb0, 0x4f, 0x4a, 0x6e, 0xfb, 0x40, 0x08, 0xb7, 0xf8, 0xd6, + 0xd3, 0xaa, 0x9d, 0xbf, 0x7d, 0x36, 0x1a, 0x3e, 0x09, 0x1a, 0xd6, 0x4b, + 0x13, 0x3a, 0xad, 0x23, 0xaf, 0x31, 0xad, 0x37, 0x6b, 0x3b, 0xfb, 0x9d, + 0xa8, 0xfb, 0x7e, 0x1f, 0x35, 0x31, 0xfd, 0xda, 0x12, 0x27, 0x4e, 0x86, + 0xe1, 0x4f, 0x34, 0x3b, 0xac, 0xbb, 0xcc, 0x9a, 0xe4, 0x6d, 0x80, 0x5a, + 0xc2, 0x85, 0x6f, 0x1c, 0x42, 0x66, 0x73, 0xb0, 0x75, 0x0c, 0xd1, 0xf6, + 0xe0, 0x1b, 0xe3, 0x80, 0x0b, 0x37, 0x6c, 0x41, 0x6c, 0x5c, 0xc7, 0xc8, + 0xaa, 0x3c, 0xe3, 0x0f, 0x1d, 0x82, 0xa7, 0xa6, 0xe1, 0xfd, 0xb7, 0x85, + 0x36, 0x0e, 0xee, 0x53, 0xe1, 0x6e, 0xb2, 0xfc, 0xb4, 0xc4, 0xc7, 0xd4, + 0x4c, 0x87, 0x6d, 0x78, 0xe1, 0xd4, 0xca, 0x39, 0x62, 0x60, 0x2d, 0xd8, + 0x3d, 0xe3, 0xb1, 0xd3, 0x03, 0xeb, 0x10, 0xa3, 0xd3, 0x80, 0xdd, 0x78, + 0xec, 0xbd, 0x5c, 0x85, 0xdb, 0xf1, 0x64, 0xd8, 0x8f, 0x02, 0x14, 0x4c, + 0xeb, 0xe4, 0x2e, 0xf5, 0xc3, 0xc0, 0x8d, 0x14, 0x14, 0x0c, 0x6f, 0x0b, + 0xb8, 0x87, 0x60, 0x00, 0xa8, 0x8f, 0x41, 0xf6, 0x5e, 0xf8, 0xb8, 0x0c, + 0xc0, 0x5a, 0xeb, 0xff, 0x9f, 0x61, 0x26, 0x4f, 0xee, 0x82, 0xe6, 0x1b, + 0x8c, 0xc7, 0xf9, 0xf1, 0x54, 0xb2, 0xbf, 0x99, 0xa4, 0xd4, 0x4e, 0xe8, + 0xf8, 0x0d, 0xe9, 0x63, 0xcf, 0x06, 0x87, 0x19, 0xed, 0xbb, 0x13, 0xde, + 0x3f, 0x0a, 0xbf, 0x3a, 0x0a, 0x97, 0xad, 0xe3, 0x44, 0x33, 0x84, 0x65, + 0xda, 0xd7, 0x6b, 0x21, 0x04, 0xd2, 0x0f, 0xfb, 0x73, 0xb6, 0x7b, 0xfa, + 0x7b, 0x32, 0xd1, 0xbf, 0x5f, 0x9d, 0x0f, 0xe8, 0xd5, 0xcf, 0xc2, 0x36, + 0xe8, 0xc9, 0xa5, 0x31, 0x3f, 0xd9, 0x27, 0x04, 0x4c, 0x74, 0x41, 0x4e, + 0x73, 0xd1, 0x75, 0x63, 0xcf, 0xac, 0x67, 0x5d, 0xe4, 0x02, 0x13, 0x8c, + 0x41, 0x81, 0xb5, 0x4c, 0x1a, 0xec, 0x3e, 0x78, 0x57, 0x7f, 0x3c, 0x76, + 0xbd, 0x1e, 0x7f, 0xa1, 0x0a, 0xab, 0x97, 0x06, 0xe0, 0x09, 0xd2, 0xb5, + 0xc8, 0xfa, 0x52, 0xed, 0x25, 0xa9, 0xc3, 0x2b, 0x6c, 0x7f, 0xf9, 0x15, + 0xee, 0xbd, 0xf0, 0x42, 0xbc, 0x97, 0xe1, 0x4f, 0x80, 0xff, 0x9d, 0x57, + 0x58, 0x75, 0xe1, 0x05, 0xcc, 0xbd, 0x1c, 0xdd, 0x2f, 0xc0, 0xe0, 0xe0, + 0x20, 0x6f, 0x7d, 0xeb, 0x5b, 0x39, 0x71, 0xf4, 0x28, 0xcb, 0x96, 0x2d, + 0xe3, 0xf9, 0x04, 0x40, 0x56, 0x5c, 0xcb, 0x96, 0x2d, 0xe3, 0xc4, 0xd1, + 0xa3, 0xac, 0xbb, 0xee, 0x3a, 0x06, 0x07, 0x07, 0xf9, 0xe1, 0xf3, 0xcf, + 0x77, 0xe5, 0xe5, 0x17, 0x80, 0x46, 0xf3, 0x05, 0x06, 0x2e, 0x7a, 0x0b, + 0x97, 0x5c, 0x24, 0x28, 0xbc, 0xe7, 0x72, 0x1a, 0xdf, 0x7f, 0x92, 0x7f, + 0xfc, 0xb1, 0xc7, 0x85, 0x7d, 0xe6, 0x25, 0x49, 0xf1, 0xf0, 0x4b, 0xc7, + 0xb6, 0x76, 0xdb, 0x32, 0x36, 0xfe, 0xdb, 0x6a, 0x5d, 0xbf, 0x5a, 0xf1, + 0xeb, 0xf5, 0xc8, 0xa6, 0x1c, 0x13, 0x47, 0x5a, 0x14, 0x2e, 0x57, 0xb1, + 0x46, 0xb7, 0xe6, 0x18, 0x7f, 0xa8, 0xc5, 0x96, 0xad, 0x93, 0x18, 0xd8, + 0x44, 0xfc, 0x9c, 0xae, 0x9f, 0xf1, 0x28, 0xae, 0x72, 0xf1, 0xda, 0x12, + 0xaf, 0x25, 0x71, 0xad, 0x7e, 0xb9, 0xb0, 0xee, 0xd7, 0xe4, 0xbc, 0x20, + 0xe7, 0x8a, 0x9e, 0x10, 0x2d, 0xdb, 0x0d, 0xc9, 0x30, 0xaa, 0xb8, 0x3f, + 0xc0, 0xf8, 0xe4, 0x24, 0xe5, 0x42, 0x89, 0x5c, 0xde, 0xa3, 0xf6, 0x7c, + 0x0d, 0x91, 0x2d, 0x51, 0x5a, 0x29, 0x19, 0x9f, 0xae, 0x52, 0x58, 0x55, + 0x52, 0x36, 0x1b, 0x2d, 0x44, 0x2e, 0xc3, 0xf8, 0xb1, 0x6a, 0x17, 0x0c, + 0x1a, 0xc0, 0xcd, 0xea, 0x36, 0xcd, 0x82, 0x77, 0x4d, 0x3d, 0x51, 0x23, + 0xe7, 0xba, 0x14, 0xb2, 0x79, 0x5a, 0x1a, 0xbc, 0x5e, 0x5a, 0x5d, 0x08, + 0xc2, 0xf4, 0x03, 0xd1, 0x8a, 0x6f, 0xb7, 0xed, 0x8b, 0xe6, 0x21, 0x70, + 0xa0, 0x90, 0x2d, 0x45, 0x61, 0xdf, 0x7e, 0x06, 0x9c, 0x0e, 0xb5, 0x46, + 0x93, 0x52, 0x31, 0xac, 0x9b, 0xe2, 0x2a, 0x97, 0xb2, 0x2e, 0x9f, 0x6a, + 0xb5, 0x46, 0x71, 0x95, 0xb2, 0xd5, 0x68, 0xd4, 0x29, 0x97, 0xf2, 0x34, + 0xce, 0x78, 0xb4, 0x3c, 0xa8, 0xfe, 0xa7, 0x7d, 0x94, 0xa1, 0xeb, 0x7a, + 0x6d, 0x9f, 0xd7, 0x7e, 0xf6, 0xfc, 0x3e, 0xc6, 0x7a, 0x5b, 0x1f, 0xf6, + 0x06, 0x62, 0x61, 0xce, 0x81, 0xfb, 0x79, 0xde, 0xd2, 0x12, 0xd7, 0xeb, + 0x95, 0x16, 0x58, 0x7a, 0xd9, 0x4c, 0x01, 0xc3, 0xed, 0x57, 0xf9, 0x01, + 0x0a, 0xa0, 0x05, 0xf0, 0x4e, 0x2b, 0xec, 0x8f, 0x80, 0x5f, 0x05, 0xa6, + 0x74, 0x9c, 0x0b, 0xe9, 0x3e, 0xaf, 0xcf, 0xe5, 0x9e, 0xcb, 0x03, 0xb6, + 0x64, 0xf5, 0x18, 0x86, 0x0f, 0xeb, 0x01, 0xfb, 0x8e, 0xb7, 0x24, 0xa0, + 0x1a, 0x6b, 0x9c, 0x16, 0x42, 0xf9, 0xc8, 0x45, 0xae, 0xfd, 0x6b, 0xae, + 0x82, 0x53, 0xdf, 0x5d, 0x52, 0x12, 0xc3, 0xfd, 0x0a, 0x18, 0x73, 0xe0, + 0xb0, 0x17, 0xb6, 0x6d, 0x66, 0x99, 0x13, 0x50, 0x6b, 0x2b, 0x2c, 0xbe, + 0xd1, 0x34, 0x28, 0x4c, 0xfe, 0x9c, 0x82, 0x84, 0x6d, 0x41, 0xe1, 0x70, + 0xc6, 0x04, 0x34, 0x1d, 0x68, 0x79, 0x61, 0x3b, 0x55, 0x43, 0x50, 0x42, + 0x52, 0xd3, 0x68, 0xfd, 0x5e, 0x77, 0xc0, 0x8b, 0x63, 0x8c, 0x5e, 0x9b, + 0x24, 0x80, 0x50, 0xe3, 0x4c, 0xb4, 0xa1, 0x64, 0x00, 0x19, 0xf1, 0x7b, + 0xae, 0xd8, 0x58, 0x8a, 0x01, 0x69, 0x55, 0x56, 0xba, 0x8c, 0xea, 0xfe, + 0xee, 0xf8, 0x93, 0x21, 0x60, 0xcb, 0x00, 0xb5, 0x32, 0x3e, 0x89, 0x30, + 0xac, 0xb1, 0x2b, 0x5d, 0x0e, 0x3f, 0xe1, 0x05, 0x7e, 0x63, 0x57, 0x46, + 0x27, 0xbd, 0xc7, 0xfd, 0xe3, 0x71, 0x21, 0x04, 0x73, 0x19, 0xdd, 0xf1, + 0xc0, 0xb7, 0xb8, 0x71, 0xf4, 0xd7, 0x82, 0xf5, 0xbd, 0x7f, 0xba, 0x97, + 0x1d, 0x9f, 0xde, 0xd1, 0x95, 0xe7, 0xc6, 0x37, 0x72, 0x54, 0xa8, 0x73, + 0xdb, 0xb3, 0x3f, 0x80, 0x77, 0xa9, 0xa3, 0xfe, 0xf0, 0xa3, 0xaa, 0xa4, + 0xb7, 0x7f, 0xb2, 0x40, 0xe1, 0xeb, 0x1d, 0x1a, 0x07, 0xeb, 0xdc, 0x76, + 0x53, 0x91, 0x3b, 0x1f, 0xaa, 0x23, 0x9e, 0x94, 0xb8, 0xa8, 0x63, 0xb6, + 0xf2, 0x4d, 0x0f, 0xef, 0xf2, 0x0a, 0x55, 0x27, 0x3c, 0x0f, 0x72, 0x4b, + 0x18, 0x03, 0xcb, 0x39, 0x2a, 0xcd, 0xe7, 0x05, 0xae, 0x65, 0xc6, 0xfe, + 0xb2, 0x25, 0x68, 0xd7, 0xd8, 0xf7, 0xb5, 0x3d, 0x00, 0xdc, 0xf6, 0xb1, + 0x5d, 0x81, 0xbb, 0x2f, 0xc5, 0xfa, 0x66, 0x87, 0xbd, 0x13, 0xb0, 0xba, + 0x1b, 0xac, 0xe5, 0x49, 0x8f, 0xf2, 0xca, 0x32, 0x4d, 0x29, 0x7a, 0x36, + 0x66, 0xae, 0x53, 0xc0, 0xf3, 0xe3, 0x47, 0x6b, 0x06, 0x9c, 0x0a, 0xf8, + 0xd3, 0x78, 0xbe, 0xa4, 0x90, 0x1f, 0xc3, 0x95, 0x1e, 0x9e, 0xdf, 0xc0, + 0x75, 0xec, 0xc9, 0xf5, 0x1a, 0x70, 0x26, 0xf2, 0x1a, 0xb6, 0xa5, 0xdd, + 0x7e, 0x77, 0x1f, 0x34, 0x97, 0x2f, 0xe0, 0xcd, 0x7a, 0x78, 0xb2, 0x86, + 0xe7, 0xab, 0xf1, 0xf2, 0x3b, 0xb6, 0x86, 0xfd, 0x49, 0x01, 0xec, 0x7e, + 0x28, 0x3a, 0xbe, 0x29, 0xf4, 0x78, 0xb6, 0xf4, 0xc1, 0x75, 0xd4, 0xb5, + 0xd8, 0x70, 0xfe, 0xa5, 0x1f, 0x8e, 0x05, 0x9b, 0x6d, 0xbd, 0xe4, 0x8a, + 0xf8, 0x73, 0xa1, 0x2a, 0x90, 0x57, 0x40, 0x2d, 0x0d, 0xcd, 0x52, 0xe9, + 0x2b, 0xe1, 0xc9, 0x86, 0xe5, 0xae, 0xe1, 0x8a, 0x92, 0x82, 0x6b, 0xb5, + 0xab, 0xa8, 0x16, 0x23, 0x66, 0xdb, 0xb2, 0x61, 0x97, 0x49, 0x24, 0xef, + 0x83, 0x05, 0x3c, 0xd9, 0xc4, 0x93, 0xd3, 0xe1, 0x03, 0x05, 0x0d, 0xd4, + 0x42, 0x7a, 0xb8, 0x6e, 0x9e, 0x8c, 0x9b, 0x83, 0x36, 0x01, 0xc0, 0xcc, + 0x68, 0x7c, 0xb5, 0xae, 0x5f, 0x63, 0xdd, 0x6a, 0xc3, 0x8b, 0xc5, 0x28, + 0x58, 0x0b, 0xb0, 0xe8, 0x58, 0x8b, 0x68, 0x91, 0x78, 0x77, 0xde, 0xa0, + 0x7e, 0x11, 0xd9, 0x20, 0xac, 0x24, 0x58, 0x48, 0x7c, 0x60, 0x68, 0xd3, + 0x10, 0x0c, 0x6d, 0x0a, 0x37, 0xec, 0xfd, 0x40, 0x04, 0xa0, 0x95, 0x64, + 0x77, 0xd3, 0x5e, 0xd8, 0xa4, 0xeb, 0x78, 0xc7, 0x0d, 0x04, 0x03, 0x61, + 0x47, 0x86, 0xd4, 0x28, 0xd7, 0xa6, 0x4d, 0xdf, 0xe4, 0xc8, 0x91, 0xcf, + 0x30, 0xc3, 0x0c, 0x7b, 0xf4, 0x29, 0xb3, 0x6b, 0x97, 0x02, 0x64, 0x7d, + 0x65, 0x17, 0x1c, 0x99, 0x51, 0x28, 0x7a, 0x35, 0x02, 0xa6, 0x40, 0x5a, + 0x17, 0xef, 0xda, 0x01, 0x47, 0xf6, 0x06, 0x10, 0x2d, 0x00, 0x33, 0x44, + 0xb6, 0x43, 0xef, 0x7b, 0x93, 0xd0, 0xe9, 0xd8, 0xd4, 0x1b, 0xa8, 0x15, + 0xd7, 0x75, 0x12, 0x36, 0x6c, 0x80, 0x3b, 0x1f, 0x27, 0x04, 0x66, 0x3d, + 0x48, 0x57, 0x59, 0x3e, 0xf8, 0x60, 0x08, 0xd6, 0xaa, 0xd7, 0x43, 0x30, + 0xd9, 0x83, 0x9f, 0x57, 0x20, 0xae, 0x0d, 0x1b, 0xe0, 0xc7, 0x0f, 0xd2, + 0xd7, 0xb8, 0xd9, 0x62, 0x12, 0x42, 0xc0, 0xc9, 0x5a, 0xd8, 0xbf, 0x7e, + 0x9d, 0x3e, 0xe2, 0xb3, 0x64, 0xf9, 0x12, 0x37, 0xeb, 0xe2, 0xc5, 0xd3, + 0xd3, 0xe3, 0x59, 0x64, 0xec, 0xe9, 0xa2, 0xee, 0x27, 0x2b, 0x5f, 0x4f, + 0xd3, 0x52, 0xf2, 0xf9, 0x52, 0xcf, 0xf8, 0x46, 0x26, 0xac, 0xfd, 0x0c, + 0xd2, 0x75, 0xdd, 0xc8, 0x47, 0x93, 0x26, 0x9b, 0x8d, 0xae, 0xde, 0xff, + 0x52, 0x01, 0x59, 0x80, 0x4e, 0x4b, 0x9f, 0x71, 0x62, 0xfd, 0x70, 0xfb, + 0x39, 0x97, 0xfd, 0xec, 0x53, 0x38, 0x82, 0x16, 0x0a, 0x4e, 0x55, 0x17, + 0x02, 0xd7, 0x97, 0x78, 0xa8, 0xe5, 0x0e, 0x0d, 0xa3, 0xda, 0x6d, 0xd2, + 0xe9, 0x4b, 0x1a, 0xa2, 0xfb, 0xde, 0x50, 0x8d, 0xcd, 0xc8, 0x00, 0x64, + 0xe5, 0x25, 0xdc, 0xeb, 0x08, 0x5f, 0x83, 0x84, 0x11, 0x91, 0xe7, 0x66, + 0x65, 0x5f, 0xd2, 0x40, 0x90, 0xf1, 0x15, 0xd8, 0x70, 0x14, 0xc1, 0x84, + 0x79, 0xa6, 0xdb, 0x96, 0xb4, 0xf4, 0x07, 0x3e, 0x84, 0x50, 0xe9, 0x8c, + 0x8c, 0x25, 0xf8, 0x20, 0x11, 0xb8, 0x48, 0xaa, 0x8e, 0x2e, 0x1f, 0x5f, + 0xa5, 0x67, 0xba, 0x2d, 0x03, 0x98, 0xd6, 0x96, 0x8f, 0x6e, 0xe3, 0xf0, + 0xc1, 0x07, 0x22, 0xe9, 0xca, 0x10, 0x3e, 0xf7, 0xc9, 0x08, 0x65, 0xab, + 0xa5, 0x7f, 0x5d, 0x69, 0x87, 0x10, 0x7e, 0xa5, 0xd3, 0x3e, 0x81, 0x01, + 0x7d, 0xa9, 0x38, 0xe6, 0x63, 0x48, 0xd2, 0x57, 0xcf, 0x05, 0x93, 0x6a, + 0xc9, 0x00, 0xb5, 0x3a, 0xb2, 0x43, 0x2e, 0xab, 0xf6, 0x5f, 0xf1, 0xa1, + 0xaa, 0xf3, 0x55, 0xf6, 0x05, 0x93, 0x60, 0xf5, 0x21, 0x05, 0x13, 0x40, + 0x06, 0x49, 0x67, 0x81, 0x3b, 0xf2, 0xf8, 0x73, 0x2e, 0xfe, 0x12, 0xdc, + 0x0f, 0x2f, 0xfc, 0xae, 0x82, 0x02, 0x4b, 0x85, 0x7d, 0xf5, 0x37, 0x7f, + 0xff, 0x82, 0x05, 0xc3, 0xf7, 0xab, 0x93, 0xdf, 0x7b, 0x82, 0x81, 0xc2, + 0xf2, 0xd8, 0x7e, 0x88, 0xc0, 0xab, 0x8c, 0x6c, 0xf7, 0x73, 0xcf, 0x3d, + 0x17, 0x81, 0x4d, 0x9d, 0xfc, 0xde, 0x13, 0x01, 0x74, 0x6a, 0x39, 0x67, + 0x83, 0x75, 0xdb, 0xee, 0xb8, 0x86, 0x4e, 0xbd, 0x51, 0x36, 0x8d, 0xbd, + 0x78, 0x7e, 0x0d, 0x3c, 0x8c, 0x17, 0x4f, 0x75, 0xd9, 0x34, 0x1a, 0x1f, + 0x1f, 0xef, 0xb2, 0x39, 0x50, 0x58, 0xce, 0x7c, 0xe3, 0x6c, 0x50, 0x5e, + 0xcb, 0x2f, 0x1e, 0x88, 0xd8, 0x37, 0xe1, 0xed, 0x32, 0x75, 0x19, 0x81, + 0xbf, 0x0c, 0xed, 0xda, 0x6d, 0xb8, 0xd0, 0xe7, 0x80, 0x59, 0xd6, 0x67, + 0x9b, 0xea, 0x3c, 0xb2, 0xda, 0xb0, 0xa6, 0xe7, 0x91, 0xc7, 0x8d, 0x3c, + 0xc7, 0xdc, 0xfe, 0xb9, 0x9d, 0xb4, 0xea, 0x8d, 0x00, 0xa8, 0x55, 0x59, + 0x5d, 0xa1, 0xd9, 0xaa, 0x03, 0x39, 0x5a, 0x8e, 0x3a, 0x36, 0x0d, 0x50, + 0x4b, 0xfa, 0x50, 0x7d, 0xaa, 0x4a, 0x61, 0x70, 0x94, 0x96, 0xaf, 0xc6, + 0x54, 0xc6, 0xde, 0x5f, 0x61, 0xfa, 0x8c, 0x17, 0x00, 0xa7, 0x10, 0xfa, + 0x63, 0x44, 0xd6, 0xd8, 0xb4, 0xc8, 0x66, 0xd0, 0x77, 0x15, 0x48, 0x3f, + 0x83, 0xf4, 0x33, 0x88, 0xc1, 0x02, 0xde, 0x8c, 0xea, 0xb3, 0x06, 0x70, + 0x2d, 0x13, 0xde, 0x15, 0x34, 0x7c, 0x49, 0x09, 0xd8, 0x78, 0xe5, 0x46, + 0x0e, 0x3d, 0x76, 0x8c, 0x72, 0xa1, 0x88, 0x37, 0xdf, 0xa4, 0xa1, 0xdf, + 0x5f, 0x68, 0x35, 0x4d, 0x7b, 0x90, 0x09, 0xf2, 0x5f, 0xc8, 0x97, 0x68, + 0xe9, 0x31, 0x68, 0xd3, 0x56, 0x98, 0xf6, 0x22, 0x83, 0x02, 0x63, 0x15, + 0xd6, 0x16, 0x68, 0xcc, 0x74, 0x70, 0x45, 0x01, 0xcf, 0x02, 0x44, 0x29, + 0x7b, 0x1d, 0x3a, 0x7e, 0x06, 0x91, 0xcd, 0xe8, 0xb1, 0xe4, 0x0e, 0xd5, + 0x27, 0xa7, 0xa8, 0x5c, 0x3d, 0x1c, 0xe6, 0x2f, 0x96, 0x37, 0x50, 0xaf, + 0x6b, 0xdc, 0x78, 0xd3, 0xcd, 0xaa, 0x4e, 0x9e, 0x4e, 0x1e, 0x23, 0x6f, + 0xf9, 0x0a, 0xc8, 0x2c, 0xe7, 0x1a, 0x30, 0x58, 0x40, 0xc8, 0x0e, 0xb9, + 0x95, 0x39, 0xbc, 0x39, 0x8f, 0x5c, 0x41, 0xd0, 0x6a, 0x29, 0xc0, 0x56, + 0xed, 0x29, 0xdd, 0xc7, 0xb3, 0xdb, 0x70, 0x7d, 0x4e, 0x57, 0xb8, 0x28, + 0xb0, 0x17, 0xc2, 0xad, 0x2c, 0x00, 0xd5, 0x5c, 0x2d, 0xf0, 0xaf, 0xcd, + 0x2e, 0x0c, 0x9c, 0x0a, 0xe1, 0x5c, 0x6a, 0xbd, 0x90, 0x2f, 0x24, 0xc2, + 0xa4, 0xec, 0xb0, 0x71, 0xf8, 0x95, 0x09, 0x27, 0x44, 0x81, 0x3d, 0xfb, + 0xbf, 0xc6, 0xae, 0x9b, 0x3f, 0x16, 0xc0, 0xb4, 0x6c, 0x7b, 0x71, 0x5b, + 0xb6, 0xcd, 0xf8, 0x76, 0x95, 0xf6, 0x09, 0x4a, 0x2b, 0x47, 0x82, 0x74, + 0x01, 0x91, 0xb4, 0x2d, 0xc5, 0x96, 0xf1, 0x33, 0xf9, 0x1c, 0xbe, 0x34, + 0xb4, 0xdb, 0x68, 0x36, 0x02, 0x50, 0x56, 0x21, 0x5f, 0x88, 0x40, 0xc8, + 0x4c, 0xbe, 0xec, 0x65, 0x12, 0x58, 0x6b, 0xea, 0xe9, 0x89, 0x48, 0xd9, + 0x18, 0x70, 0xd6, 0xc5, 0x17, 0xad, 0x60, 0xfa, 0x99, 0x1a, 0x2f, 0xbe, + 0xf4, 0x1c, 0xab, 0x06, 0xae, 0x61, 0xfa, 0x99, 0xbf, 0xe5, 0xc5, 0x97, + 0x42, 0x38, 0xde, 0x0b, 0x2f, 0xd7, 0x18, 0xe4, 0xa2, 0xae, 0x73, 0x3a, + 0x55, 0xaa, 0x54, 0xa9, 0x52, 0xa5, 0x4a, 0x95, 0x2a, 0x55, 0xaa, 0x54, + 0xa9, 0x52, 0xa5, 0x4a, 0x95, 0x2a, 0x55, 0xaa, 0x54, 0xa9, 0x52, 0xa5, + 0x4a, 0x95, 0x2a, 0x55, 0xaa, 0x54, 0xa9, 0x52, 0xf5, 0xaf, 0xd7, 0x69, + 0xfa, 0x67, 0xaa, 0x54, 0xa9, 0x52, 0xa5, 0x4a, 0x95, 0xea, 0x8d, 0x54, + 0x61, 0x65, 0x21, 0xf2, 0xd2, 0xf5, 0x6b, 0xd5, 0x52, 0x5e, 0xce, 0x0e, + 0xe0, 0x57, 0xaf, 0xe3, 0xcb, 0xf0, 0x0b, 0x7d, 0xb5, 0xd9, 0x4e, 0x43, + 0xc4, 0x6f, 0x29, 0x79, 0x58, 0x24, 0x6c, 0xc3, 0x5b, 0x78, 0xca, 0xd9, + 0x62, 0xe9, 0xeb, 0x92, 0x00, 0xf4, 0xe4, 0xb2, 0xc8, 0xe4, 0x70, 0x3f, + 0x1e, 0x48, 0x92, 0x13, 0x82, 0x96, 0x54, 0xd0, 0x2b, 0x21, 0x89, 0x4c, + 0xc6, 0x09, 0x26, 0x48, 0x3b, 0x12, 0x51, 0x12, 0xb0, 0x12, 0x32, 0x7a, + 0x16, 0x4f, 0xa7, 0x2d, 0xd5, 0x2c, 0xad, 0xb6, 0x09, 0x14, 0x05, 0x6b, + 0xad, 0xfb, 0xec, 0x2e, 0x46, 0x56, 0x0f, 0x2b, 0xc0, 0x93, 0x23, 0x71, + 0xa5, 0x60, 0xf7, 0xc1, 0x43, 0xd4, 0xbe, 0x7a, 0x00, 0x1c, 0x70, 0xf3, + 0x39, 0x1a, 0x5e, 0x83, 0xfb, 0x3f, 0xb1, 0x4d, 0x81, 0xb2, 0x36, 0x86, + 0xf0, 0x9b, 0xdd, 0x07, 0x0f, 0x29, 0x18, 0x17, 0x50, 0xce, 0xe7, 0x60, + 0xa6, 0xc1, 0x9f, 0x7f, 0x7c, 0x5b, 0xb0, 0x2d, 0x28, 0x17, 0x07, 0xd0, + 0x2f, 0xac, 0xae, 0xfb, 0xec, 0x2e, 0xe4, 0xd7, 0x1e, 0xd0, 0xe5, 0x85, + 0x9e, 0xea, 0xa7, 0x5e, 0x0a, 0xc5, 0x17, 0x01, 0xdc, 0x4a, 0xb8, 0x20, + 0x4a, 0x24, 0xe7, 0x65, 0xb1, 0x62, 0xd5, 0x00, 0xad, 0xca, 0x50, 0x41, + 0x41, 0xb5, 0x04, 0xe0, 0xc9, 0x00, 0x10, 0x36, 0x3d, 0xd3, 0x08, 0xc3, + 0xc5, 0xe2, 0x35, 0xbc, 0x06, 0x39, 0x27, 0x0a, 0x01, 0x30, 0x9f, 0x8d, + 0xee, 0x09, 0xd4, 0x3a, 0x07, 0xb9, 0x59, 0x81, 0xd7, 0x96, 0x14, 0x80, + 0x9a, 0x28, 0x42, 0x64, 0x82, 0x13, 0xc1, 0x31, 0xa0, 0xbe, 0x95, 0x2b, + 0xf1, 0xa4, 0xd0, 0xee, 0x85, 0x94, 0xfc, 0x25, 0xef, 0x7e, 0x24, 0x51, + 0xf0, 0xaf, 0x1c, 0x82, 0x96, 0x23, 0x29, 0x09, 0x41, 0x2d, 0x00, 0x74, + 0x45, 0x81, 0x5a, 0x4b, 0x05, 0x6c, 0xb9, 0xd9, 0xd2, 0xa2, 0xf1, 0xb6, + 0x7f, 0x62, 0x3b, 0x13, 0x8f, 0x4d, 0x30, 0x72, 0xed, 0x08, 0xd5, 0x93, + 0x55, 0x5a, 0xcf, 0xab, 0x17, 0xab, 0x73, 0xcb, 0x72, 0x6c, 0xff, 0x94, + 0xda, 0xb6, 0xfd, 0x53, 0xdb, 0xb9, 0xe7, 0xae, 0x7b, 0x62, 0x69, 0x59, + 0x1c, 0x82, 0xb5, 0x98, 0x0a, 0x83, 0x05, 0x75, 0x6e, 0x61, 0xa6, 0xda, + 0x9f, 0x1f, 0xbb, 0x90, 0x0c, 0xcb, 0x6a, 0xcd, 0xb5, 0x02, 0xa0, 0x96, + 0x6c, 0xcb, 0x20, 0x4c, 0xdc, 0x6d, 0x60, 0x58, 0xde, 0x9c, 0xb7, 0x24, + 0xf7, 0x62, 0x92, 0x52, 0x52, 0xcc, 0x77, 0x03, 0x32, 0x3c, 0x5f, 0xe2, + 0x3a, 0x6a, 0x12, 0x8a, 0x91, 0xeb, 0x08, 0xea, 0xcd, 0x26, 0xc5, 0x7c, + 0x3e, 0xd8, 0x6e, 0xc2, 0x9a, 0xed, 0xec, 0x68, 0xe6, 0x63, 0x00, 0x00, + 0x20, 0x00, 0x49, 0x44, 0x41, 0x54, 0xb6, 0x1b, 0xa0, 0xde, 0xd4, 0x13, + 0x15, 0x07, 0xdd, 0x48, 0xf8, 0xb8, 0xbb, 0xa9, 0xaf, 0x55, 0x01, 0x6c, + 0xcb, 0xf3, 0x70, 0xf5, 0x17, 0xaf, 0x17, 0x72, 0xdb, 0x13, 0x8d, 0x8c, + 0x3b, 0xef, 0xba, 0x89, 0xe9, 0x33, 0x5f, 0x8f, 0xef, 0xe7, 0x3a, 0x10, + 0x2f, 0xcf, 0x7e, 0x14, 0x07, 0x45, 0xfd, 0xb4, 0xaf, 0x58, 0x6f, 0xbc, + 0x0c, 0xc0, 0x2a, 0x9e, 0xde, 0x7e, 0x01, 0x5d, 0x76, 0x58, 0xdb, 0x96, + 0xed, 0x67, 0xec, 0x26, 0xcd, 0x3f, 0xc4, 0xda, 0x1e, 0x47, 0x67, 0x99, + 0xf5, 0x4d, 0x9b, 0x36, 0x71, 0xe4, 0x48, 0xaf, 0x98, 0x31, 0x3b, 0xa7, + 0x4f, 0xf7, 0x15, 0x0e, 0x60, 0xf5, 0xd0, 0x10, 0xa7, 0x37, 0x6f, 0x5e, + 0x30, 0x4e, 0xbf, 0x53, 0xf6, 0xe5, 0xce, 0x77, 0x73, 0xfd, 0x3d, 0xcf, + 0x30, 0xfe, 0xef, 0xdf, 0x0d, 0x40, 0xe7, 0x1f, 0x42, 0xf7, 0x88, 0x03, + 0x53, 0xba, 0xdd, 0x1e, 0x4e, 0xb8, 0x46, 0x4c, 0xf9, 0xa1, 0xbf, 0x0d, + 0x9b, 0xea, 0x05, 0x9e, 0x3a, 0xe1, 0xc3, 0x3a, 0xa7, 0xdb, 0x7d, 0xa7, + 0x9f, 0x0c, 0xc8, 0xf2, 0x12, 0x26, 0x6e, 0x9d, 0x6f, 0x99, 0xeb, 0xcf, + 0xed, 0xb3, 0x0a, 0xd7, 0x94, 0x7f, 0x3a, 0x9c, 0x8c, 0x7b, 0xa8, 0x0e, + 0x87, 0x7f, 0x06, 0xa3, 0x4a, 0x79, 0x07, 0x9a, 0x7e, 0xe8, 0x7e, 0xad, + 0x32, 0x18, 0x2a, 0x66, 0x1b, 0x20, 0x1a, 0x70, 0x65, 0x59, 0x4d, 0x56, + 0x41, 0x20, 0x9f, 0x18, 0x87, 0x6b, 0x2a, 0x6c, 0x71, 0xca, 0x88, 0x8d, + 0xeb, 0x90, 0xf5, 0x13, 0x8c, 0xd7, 0x4f, 0x40, 0xde, 0x45, 0x0c, 0x8e, + 0xc1, 0x1c, 0x50, 0xd3, 0x93, 0x34, 0xae, 0x2e, 0xb3, 0xad, 0xa4, 0x27, + 0xa1, 0x9d, 0xa9, 0x52, 0x10, 0x1d, 0xb8, 0xae, 0x42, 0x6b, 0xd5, 0x08, + 0x22, 0x5f, 0x20, 0xf3, 0xc4, 0xc3, 0x70, 0x5d, 0x05, 0x4f, 0x23, 0xb3, + 0xb6, 0xfb, 0x70, 0xef, 0x1c, 0xd4, 0xbe, 0xed, 0x05, 0x5d, 0xb4, 0x4f, + 0xc6, 0xd2, 0x96, 0xcb, 0xc2, 0x4e, 0xe0, 0x9e, 0x06, 0x9c, 0x68, 0xa8, + 0x36, 0xaa, 0x23, 0xe0, 0x4e, 0x34, 0x2c, 0xcc, 0xe4, 0xdf, 0x80, 0xb5, + 0x22, 0xda, 0x0e, 0xd4, 0x54, 0x1f, 0xd2, 0x91, 0xc8, 0x6f, 0x8f, 0x03, + 0x65, 0xb8, 0x6c, 0x5a, 0x41, 0xa8, 0x3e, 0xb4, 0x85, 0xc9, 0x6f, 0xbc, + 0x4f, 0x87, 0x3b, 0xbc, 0xa4, 0x32, 0xcb, 0x5f, 0x7d, 0x1b, 0xcd, 0xc7, + 0xf7, 0x2d, 0x3d, 0xec, 0xfe, 0xbb, 0xc3, 0x0d, 0x63, 0xd7, 0x73, 0x3b, + 0x70, 0xff, 0xff, 0xfd, 0xad, 0xee, 0x48, 0xd9, 0x1e, 0xd7, 0x36, 0x03, + 0xd6, 0xaa, 0xe9, 0xbe, 0xb9, 0x81, 0x69, 0x7d, 0x7b, 0x3c, 0x19, 0xb6, + 0x15, 0x93, 0xe9, 0xd3, 0xd9, 0xfd, 0xe9, 0x5e, 0xee, 0xd7, 0xaa, 0x78, + 0x9f, 0xc2, 0x6b, 0x37, 0x71, 0xfb, 0x04, 0x55, 0xfd, 0xab, 0x96, 0xec, + 0x80, 0xe8, 0xee, 0xb9, 0x06, 0xf7, 0x2d, 0xbe, 0x44, 0x38, 0x1a, 0xda, + 0xd3, 0x4f, 0x07, 0x3f, 0x88, 0x97, 0xec, 0xee, 0x3b, 0x3e, 0xfd, 0xf7, + 0x96, 0x5f, 0x0b, 0x0c, 0xaa, 0x97, 0xdc, 0x0b, 0x81, 0x97, 0x15, 0x18, + 0xe5, 0x97, 0xd6, 0xac, 0xc2, 0x7b, 0xea, 0x7f, 0xf0, 0x45, 0xa0, 0x3c, + 0x98, 0x61, 0xd6, 0x10, 0xb5, 0x88, 0xa6, 0xf3, 0x85, 0x6a, 0x95, 0x15, + 0x2b, 0x56, 0xb0, 0xee, 0xba, 0xeb, 0x38, 0x71, 0xf4, 0x28, 0xcb, 0x81, + 0x9f, 0xf6, 0x80, 0x6b, 0x2d, 0x5b, 0xb6, 0x8c, 0x57, 0x9e, 0x7f, 0x9e, + 0x57, 0x9e, 0x7f, 0x9e, 0xf7, 0x5c, 0x77, 0x1d, 0x00, 0x3f, 0xac, 0x56, + 0x13, 0xf3, 0x32, 0xfb, 0x62, 0x9b, 0xf9, 0x8b, 0x7e, 0xca, 0x0b, 0x2f, + 0xbd, 0xc4, 0xfc, 0x45, 0x3f, 0xe5, 0x99, 0xa3, 0x47, 0x83, 0x6d, 0xbf, + 0x78, 0x9e, 0xf2, 0x1b, 0xcf, 0xcb, 0x6b, 0x09, 0xd3, 0x8f, 0xc6, 0x2b, + 0x15, 0xca, 0x73, 0x13, 0x54, 0x3f, 0x38, 0xca, 0xde, 0x4f, 0x14, 0xd8, + 0xf5, 0xbf, 0xec, 0x67, 0x74, 0x6b, 0x4e, 0xc1, 0xa0, 0xf2, 0x1a, 0x9a, + 0x38, 0x17, 0xb6, 0x11, 0xd2, 0x27, 0x02, 0xd4, 0x2a, 0xae, 0x72, 0x99, + 0x7c, 0xaa, 0x4e, 0x65, 0x75, 0x3e, 0xb8, 0xb7, 0x17, 0x48, 0x4a, 0x83, + 0x45, 0x1d, 0xde, 0x23, 0x37, 0x18, 0x82, 0x4e, 0x0c, 0x64, 0x6a, 0xdb, + 0xd6, 0x31, 0x0e, 0x3c, 0x74, 0x38, 0x11, 0x4c, 0x15, 0x87, 0x51, 0x99, + 0xf5, 0xea, 0x53, 0x35, 0xdc, 0x65, 0x19, 0xca, 0xa5, 0x12, 0x39, 0x57, + 0x30, 0x31, 0x5d, 0x65, 0xec, 0xda, 0x0a, 0xd3, 0xd3, 0x0d, 0x58, 0xe9, + 0x32, 0x76, 0x6d, 0x85, 0x6a, 0x5d, 0xdb, 0xcb, 0x65, 0x90, 0xad, 0x0e, + 0xa3, 0x1b, 0x7b, 0xc3, 0xe2, 0x84, 0x23, 0x91, 0xbe, 0x40, 0x38, 0x92, + 0xc6, 0x9c, 0xa4, 0x50, 0x2a, 0x21, 0x5b, 0x2d, 0x44, 0x2e, 0xc7, 0x68, + 0x45, 0x4d, 0xd2, 0xf3, 0xda, 0x32, 0x08, 0x17, 0xcf, 0x43, 0x3f, 0x90, + 0xad, 0xdb, 0x3e, 0x7a, 0x23, 0xfb, 0x0f, 0xee, 0xef, 0xda, 0xb7, 0x37, + 0xdf, 0xc0, 0x1d, 0x50, 0xfb, 0x70, 0xdd, 0x10, 0x66, 0x58, 0xab, 0xd7, + 0x22, 0x60, 0xad, 0x6a, 0xb5, 0x86, 0x9b, 0x73, 0x71, 0x73, 0x2e, 0x99, + 0x6c, 0x8e, 0x89, 0xc9, 0x09, 0x2a, 0xab, 0xcb, 0xfa, 0xde, 0xa8, 0x11, + 0x4e, 0x74, 0x7f, 0xb2, 0x67, 0x36, 0x01, 0x98, 0x6f, 0xbf, 0x0a, 0x28, + 0x98, 0xd3, 0x8f, 0xb4, 0xfb, 0x5c, 0xf5, 0xb6, 0xec, 0x9b, 0x38, 0x7b, + 0x0e, 0x36, 0xe2, 0xd3, 0x9d, 0x7f, 0x9e, 0xd2, 0x52, 0xc8, 0xbd, 0x99, + 0x7f, 0x6c, 0xfd, 0xbf, 0xaf, 0x29, 0x2d, 0xe7, 0x9a, 0x9e, 0x01, 0xe0, + 0xbf, 0x03, 0x97, 0xa2, 0x00, 0x5a, 0x00, 0x97, 0x00, 0xf6, 0x34, 0xd6, + 0x1f, 0x01, 0xbf, 0xdc, 0x7e, 0x95, 0x29, 0xa0, 0x70, 0x1e, 0x18, 0x40, + 0x6b, 0xae, 0x82, 0xef, 0xc6, 0x00, 0x57, 0x71, 0x84, 0x74, 0x52, 0xfb, + 0x62, 0x46, 0xf7, 0x5e, 0x1d, 0x80, 0x37, 0xcd, 0x2b, 0xf7, 0x48, 0x16, + 0x1a, 0x02, 0x7e, 0xf2, 0x2b, 0x61, 0xa9, 0xda, 0xdb, 0x8d, 0xfa, 0x05, + 0x6a, 0x25, 0xc5, 0x95, 0x4e, 0xf7, 0xf5, 0x2b, 0xb8, 0x5b, 0x75, 0x0c, + 0x80, 0x4a, 0xf1, 0xf1, 0x01, 0x2a, 0x28, 0x4c, 0x8e, 0x69, 0x91, 0x1a, + 0x26, 0xb4, 0x63, 0xa6, 0x97, 0x77, 0x4b, 0x41, 0xc5, 0x04, 0x93, 0x3d, + 0xc0, 0x5a, 0xaf, 0x17, 0x4c, 0xcb, 0x96, 0x3d, 0x7e, 0x55, 0xeb, 0xa3, + 0x85, 0x1f, 0x7f, 0xd2, 0x0b, 0x40, 0x5a, 0x66, 0x1d, 0x42, 0x90, 0x16, + 0xc0, 0xb1, 0xc9, 0xb0, 0xbf, 0x60, 0x03, 0xb3, 0x6c, 0x10, 0x56, 0x12, + 0x1c, 0x6b, 0xa1, 0xb0, 0x42, 0x83, 0x29, 0x0e, 0x1d, 0x53, 0xa5, 0x72, + 0xc7, 0x03, 0xaa, 0x3f, 0xfa, 0xc5, 0x5b, 0xaf, 0x07, 0xe0, 0xc6, 0xd1, + 0x5f, 0x63, 0xb8, 0xe8, 0x06, 0x65, 0x16, 0x07, 0x6a, 0x1d, 0xb6, 0xe0, + 0x57, 0x87, 0x2f, 0xaf, 0x70, 0xf8, 0x5d, 0xef, 0x84, 0x18, 0x10, 0xeb, + 0xf0, 0xef, 0x0b, 0x40, 0x50, 0xd9, 0x20, 0x99, 0x7e, 0xc2, 0x63, 0xa4, + 0xe8, 0x32, 0x51, 0x57, 0x20, 0x2d, 0xf7, 0xc9, 0x69, 0xbc, 0xf3, 0x00, + 0x91, 0x3f, 0x2f, 0x40, 0x2d, 0x5b, 0xed, 0x1a, 0xb7, 0x7d, 0xec, 0x4e, + 0xf6, 0x7d, 0x4d, 0xf5, 0xd9, 0x97, 0x04, 0xd4, 0x5a, 0x82, 0x5c, 0x11, + 0x82, 0x1f, 0x95, 0xb6, 0xe8, 0x65, 0x38, 0xa6, 0x4c, 0xd7, 0x38, 0x39, + 0x40, 0x15, 0xfc, 0x6d, 0x40, 0x19, 0x57, 0x78, 0x08, 0x87, 0x00, 0xa8, + 0xe5, 0x8a, 0x3c, 0x5e, 0x3b, 0x1e, 0x9e, 0x00, 0x98, 0xb2, 0x90, 0x3c, + 0x59, 0x03, 0xff, 0x0e, 0xbd, 0xb6, 0x8b, 0xea, 0x53, 0x7b, 0x38, 0x74, + 0x72, 0x37, 0x00, 0x77, 0x6d, 0xfd, 0xab, 0xae, 0xf0, 0x12, 0x89, 0x94, + 0x02, 0x1c, 0xb5, 0x74, 0xc3, 0xef, 0x39, 0x80, 0x23, 0x71, 0x35, 0xc8, + 0xd7, 0x93, 0x6a, 0xbd, 0xd7, 0x99, 0x20, 0x65, 0x0d, 0x21, 0xba, 0xe1, + 0x44, 0x75, 0x6f, 0x14, 0x37, 0x7b, 0x20, 0x9a, 0x3e, 0xcb, 0xed, 0x8a, + 0x12, 0xae, 0x93, 0xa7, 0xde, 0x36, 0xad, 0x5e, 0x05, 0x85, 0x65, 0x36, + 0x77, 0x93, 0x5f, 0x5e, 0x38, 0xc3, 0x96, 0x02, 0x70, 0x59, 0x00, 0x02, + 0xfd, 0x73, 0x90, 0x1f, 0x09, 0xb6, 0x77, 0xbc, 0x38, 0xdc, 0x77, 0x71, + 0x80, 0x6d, 0x17, 0x50, 0xeb, 0x3c, 0x28, 0x00, 0x75, 0x9d, 0xa4, 0x7f, + 0x40, 0x57, 0x2f, 0xca, 0xfa, 0x91, 0x19, 0x38, 0xb2, 0x17, 0x03, 0xb7, + 0x5a, 0x9c, 0xc6, 0x6e, 0xc7, 0x8d, 0xef, 0x62, 0x86, 0xbd, 0x9b, 0x60, + 0xef, 0xde, 0x0f, 0x00, 0xf0, 0xc8, 0x23, 0x70, 0x83, 0x86, 0x7e, 0x6d, + 0x9a, 0x19, 0x62, 0x66, 0x08, 0x66, 0xf4, 0x28, 0xda, 0x10, 0x30, 0x33, + 0x03, 0x33, 0x02, 0x7e, 0x2b, 0xff, 0x4e, 0x5e, 0xdc, 0xb3, 0x97, 0x11, + 0x60, 0xcb, 0x91, 0x99, 0x30, 0xce, 0x5e, 0xe8, 0x1a, 0xb5, 0x5b, 0x42, + 0xfa, 0xae, 0xfb, 0x0c, 0x1c, 0x7d, 0x15, 0xd8, 0x1c, 0xfa, 0x15, 0x8b, + 0x70, 0xcd, 0x5f, 0xc0, 0x35, 0x9b, 0xe0, 0xba, 0x07, 0x15, 0x48, 0xcb, + 0xe8, 0xc1, 0x07, 0xe1, 0xf3, 0xb7, 0x14, 0x01, 0xa8, 0x53, 0x57, 0x65, + 0x6c, 0xb6, 0x17, 0xfb, 0xdf, 0xef, 0x62, 0x72, 0xaf, 0xa8, 0xd0, 0xec, + 0xe3, 0x43, 0x0f, 0x36, 0x34, 0x4a, 0x4a, 0x09, 0x97, 0x97, 0x11, 0x27, + 0x6b, 0xaf, 0xdb, 0x73, 0xc7, 0xae, 0x8f, 0x0e, 0x19, 0x30, 0x93, 0x2f, + 0xbb, 0xc1, 0x58, 0x4e, 0xef, 0x78, 0xd1, 0x70, 0x02, 0xd9, 0xee, 0x86, + 0x62, 0xdb, 0x79, 0x5b, 0x30, 0xbe, 0x09, 0xff, 0xd5, 0x03, 0x5d, 0xf9, + 0x16, 0x42, 0xa8, 0x0f, 0x99, 0x2c, 0xe1, 0x39, 0xb0, 0x4c, 0x02, 0x96, + 0x9f, 0x8b, 0x0c, 0x04, 0xca, 0x11, 0x08, 0x5f, 0x7f, 0xa0, 0xc7, 0x87, + 0x8e, 0xaf, 0xee, 0x31, 0x5c, 0x47, 0xa5, 0xb5, 0x02, 0x0c, 0xfb, 0x70, + 0xaf, 0x03, 0x7b, 0xaf, 0x85, 0x2f, 0x1e, 0xd3, 0x50, 0x4f, 0x5f, 0xd2, + 0x40, 0x01, 0xb9, 0x84, 0x10, 0x54, 0xf4, 0xd8, 0xfd, 0xa4, 0x2e, 0x57, + 0x17, 0x19, 0xbd, 0xe7, 0x77, 0x84, 0xfa, 0x08, 0x0c, 0xea, 0x43, 0x30, + 0x20, 0x18, 0xd7, 0x71, 0x26, 0x90, 0xe4, 0x10, 0xdc, 0x9a, 0x77, 0xb9, + 0xd7, 0xf3, 0x14, 0x1c, 0x0b, 0xfd, 0x8c, 0xd6, 0x11, 0x14, 0x7c, 0xa9, + 0x7b, 0x4d, 0x52, 0x7d, 0x2c, 0xc7, 0xae, 0x4b, 0x61, 0xec, 0x99, 0xfd, + 0xea, 0x67, 0x95, 0xbe, 0xa4, 0x2c, 0x60, 0xd2, 0x87, 0x9d, 0xbf, 0xbb, + 0x93, 0x46, 0x53, 0x3f, 0x47, 0xf4, 0xd5, 0x07, 0x91, 0x84, 0x03, 0x8d, + 0x76, 0xd8, 0x03, 0xab, 0xf8, 0xea, 0x23, 0x01, 0x52, 0xaa, 0xfb, 0x31, + 0x08, 0x1f, 0xbf, 0xe6, 0x10, 0xb4, 0x82, 0x7b, 0x4a, 0x34, 0xb4, 0x2b, + 0xdc, 0x67, 0x07, 0x65, 0x4f, 0x79, 0xe9, 0xb4, 0xfa, 0xe6, 0x69, 0x70, + 0x68, 0x2f, 0x87, 0xc0, 0x3e, 0x92, 0xa4, 0xaf, 0xd2, 0x5b, 0x45, 0x43, + 0xb8, 0x7c, 0x98, 0x46, 0x52, 0xf0, 0x05, 0x2d, 0x0d, 0x45, 0x2a, 0x98, + 0x67, 0x23, 0x0e, 0x51, 0x58, 0xfd, 0x22, 0xa0, 0x37, 0x5b, 0xcf, 0x22, + 0x18, 0x7a, 0xcf, 0x4f, 0x78, 0xf6, 0xfb, 0x6f, 0xe5, 0x5d, 0x48, 0x9e, + 0x45, 0xa8, 0xe5, 0x3f, 0xaf, 0x0e, 0xd6, 0xdf, 0xf1, 0xf6, 0xd3, 0x54, + 0x5f, 0x9c, 0xa7, 0x2c, 0xd7, 0x85, 0xdb, 0xcf, 0x75, 0xf9, 0xcf, 0xab, + 0x81, 0xd3, 0x0c, 0x14, 0x96, 0xb3, 0xa6, 0x00, 0x2b, 0x56, 0xac, 0xe0, + 0xb9, 0xe7, 0x9e, 0x63, 0xf4, 0x0a, 0xb5, 0x3c, 0xa5, 0xa1, 0x55, 0x10, + 0x85, 0x48, 0x19, 0xf0, 0x95, 0x0d, 0x9e, 0x3a, 0xfb, 0xe2, 0x3c, 0xcb, + 0x39, 0x1b, 0xc0, 0xa7, 0x80, 0x08, 0xb0, 0xeb, 0xf5, 0xb0, 0x69, 0xd2, + 0x6c, 0x20, 0x60, 0x71, 0x9b, 0xb6, 0xdd, 0x20, 0xce, 0x9a, 0x35, 0xcc, + 0x37, 0xce, 0x06, 0x4b, 0x13, 0x66, 0xcd, 0x9a, 0x35, 0x81, 0xad, 0x35, + 0x6b, 0xd6, 0x00, 0x70, 0xea, 0xd4, 0x29, 0x96, 0x5f, 0x3c, 0x90, 0x98, + 0x0e, 0xdb, 0xb6, 0x59, 0x9a, 0xed, 0xf3, 0x8d, 0xb3, 0xe0, 0xbe, 0xa3, + 0xaf, 0x3a, 0x9f, 0x7c, 0xb2, 0x4a, 0xde, 0x75, 0xd5, 0xb3, 0x36, 0x29, + 0x29, 0x58, 0x1f, 0x05, 0x2a, 0xae, 0xec, 0x1e, 0xc7, 0xcc, 0x0c, 0xe6, + 0x90, 0x6d, 0xdd, 0x7f, 0xb0, 0xda, 0xb3, 0x96, 0x39, 0x17, 0x7c, 0x10, + 0xd9, 0x1c, 0xd0, 0x51, 0xf7, 0xfa, 0x22, 0xc3, 0xbe, 0xaf, 0xdf, 0xcb, + 0xd8, 0xe6, 0x2d, 0x3c, 0xf0, 0x67, 0x5f, 0xa6, 0xbc, 0x7a, 0x23, 0xee, + 0xca, 0x84, 0x71, 0x43, 0x27, 0x84, 0x68, 0x41, 0x47, 0x81, 0xb4, 0x9c, + 0x0e, 0xc8, 0x16, 0x88, 0x1c, 0x72, 0xae, 0x81, 0x18, 0xd4, 0xd0, 0x27, + 0x4f, 0x06, 0xeb, 0x72, 0xae, 0x41, 0xf9, 0xf2, 0x11, 0x84, 0xd3, 0xa1, + 0xe6, 0x35, 0x28, 0x91, 0xdc, 0x3f, 0xae, 0x94, 0xcb, 0x54, 0x4f, 0x4f, + 0x91, 0xcb, 0xe7, 0xe8, 0xcc, 0x49, 0x7d, 0xee, 0x47, 0x9f, 0xff, 0x0b, + 0x47, 0xed, 0x37, 0x97, 0x17, 0x74, 0xe6, 0xd4, 0x19, 0xd8, 0x98, 0xe9, + 0x20, 0xdc, 0x0c, 0x9e, 0xd7, 0x01, 0xc7, 0x02, 0x8e, 0x3b, 0xf6, 0x5d, + 0x99, 0xca, 0x6b, 0x66, 0x30, 0xc7, 0xf6, 0x8f, 0xdf, 0xc6, 0xc4, 0x53, + 0x51, 0xe0, 0x69, 0x34, 0x2c, 0x34, 0x9a, 0x2d, 0x4a, 0xf9, 0x02, 0x8d, + 0x39, 0xc9, 0xc8, 0xfb, 0x47, 0xa9, 0xd5, 0x34, 0x6c, 0x51, 0x9b, 0x17, + 0xb3, 0x3a, 0xbc, 0x93, 0x01, 0xc7, 0xa5, 0x31, 0xa3, 0xd6, 0xbd, 0xb9, + 0x16, 0xee, 0xa0, 0x8b, 0x37, 0xe7, 0x21, 0x9b, 0x2d, 0xc8, 0x15, 0x68, + 0x21, 0xe8, 0x7d, 0x87, 0xd8, 0x0d, 0x8d, 0x32, 0x10, 0xa8, 0x5e, 0x61, + 0x93, 0xc0, 0x53, 0xf6, 0x36, 0x29, 0x1b, 0xd4, 0x66, 0x1b, 0x34, 0xe6, + 0xa2, 0x00, 0xae, 0xa4, 0x7d, 0x26, 0x81, 0xb6, 0x6c, 0x5b, 0x7b, 0xf6, + 0x7f, 0x0d, 0x21, 0x0a, 0x11, 0x30, 0x55, 0x52, 0xf8, 0xb8, 0xcc, 0x36, + 0x7b, 0x7b, 0x6d, 0x76, 0x62, 0x51, 0x5b, 0x71, 0x9b, 0x36, 0x44, 0x2c, + 0x09, 0x8a, 0x05, 0x0a, 0x82, 0x55, 0x18, 0x2c, 0x75, 0xd9, 0xad, 0xcd, + 0x26, 0xe7, 0x2b, 0x5e, 0x56, 0x36, 0x58, 0xcb, 0x86, 0x98, 0x49, 0xd9, + 0x80, 0xb7, 0x56, 0x78, 0xe1, 0xe5, 0x1a, 0x17, 0x5f, 0xb4, 0x22, 0x48, + 0xd3, 0xc5, 0x17, 0xad, 0xe0, 0x85, 0x97, 0x6b, 0x5c, 0x72, 0x61, 0x29, + 0x02, 0xd5, 0x52, 0x6e, 0x1b, 0x5d, 0x9e, 0x2a, 0x55, 0xaa, 0x54, 0xa9, + 0x52, 0xa5, 0x4a, 0x95, 0x2a, 0x55, 0xaa, 0x54, 0xa9, 0x52, 0xa5, 0x4a, + 0x95, 0x2a, 0x55, 0xaa, 0x54, 0xa9, 0x52, 0xa5, 0x4a, 0x95, 0x2a, 0x55, + 0xaa, 0x54, 0xa9, 0x96, 0xaa, 0x37, 0xff, 0xac, 0x13, 0x90, 0x2a, 0x55, + 0xaa, 0x54, 0xa9, 0x52, 0xfd, 0xff, 0x56, 0x5b, 0xa1, 0x63, 0x4d, 0x31, + 0x4b, 0x02, 0x33, 0xc5, 0x41, 0x51, 0xf1, 0xb0, 0x66, 0xd9, 0x98, 0x5d, + 0x7c, 0x6a, 0x94, 0x6d, 0x5f, 0xfa, 0x32, 0x7c, 0x41, 0xdd, 0xbc, 0xe0, + 0xbb, 0xc8, 0xbe, 0xfa, 0xb1, 0x1d, 0x5f, 0x2e, 0x16, 0x67, 0xb1, 0x17, + 0xe2, 0x97, 0x02, 0xab, 0x5a, 0x28, 0x6c, 0x52, 0x7e, 0x17, 0x0b, 0x2b, + 0x7d, 0x19, 0x84, 0x2d, 0xb8, 0xdd, 0x5f, 0xd3, 0x5c, 0x28, 0x0d, 0x1d, + 0x26, 0x60, 0x6b, 0xe8, 0xbf, 0x6e, 0x83, 0x0b, 0x9f, 0x54, 0x2f, 0xdc, + 0x45, 0xdf, 0x99, 0xd7, 0x2f, 0xa2, 0x9b, 0x97, 0xf2, 0x85, 0x0e, 0x60, + 0x02, 0x79, 0xa8, 0x17, 0xa7, 0xed, 0xf7, 0xbe, 0x1d, 0xe5, 0x61, 0x9b, + 0x11, 0x25, 0x01, 0x45, 0xc8, 0x0c, 0x0a, 0x4e, 0xcc, 0x64, 0xc0, 0x51, + 0x40, 0x2a, 0x91, 0xd5, 0xb6, 0x45, 0xd4, 0xc6, 0xed, 0x07, 0x0f, 0x31, + 0xb2, 0x7a, 0x18, 0x80, 0x52, 0x56, 0xe0, 0xfa, 0x82, 0xfb, 0x3f, 0xb1, + 0x8d, 0x87, 0x9f, 0x98, 0x00, 0x47, 0x52, 0xca, 0x0a, 0xaa, 0x27, 0x1b, + 0x20, 0xe0, 0xf6, 0xfb, 0x0e, 0x50, 0x6d, 0xaa, 0x97, 0x47, 0x6f, 0xbf, + 0x4f, 0x4d, 0xe8, 0x69, 0x78, 0xc9, 0x65, 0xb8, 0xee, 0xb3, 0xbb, 0x82, + 0x70, 0x1f, 0xf9, 0xea, 0x01, 0x84, 0x0f, 0x95, 0xa1, 0x02, 0xb7, 0xdf, + 0x77, 0x80, 0x75, 0xe5, 0x75, 0xba, 0x8c, 0xcc, 0x17, 0x70, 0xa5, 0x06, + 0x89, 0xa9, 0x34, 0x4a, 0xe9, 0xa9, 0xf4, 0xf6, 0xcc, 0x8b, 0x55, 0x6a, + 0x6d, 0x19, 0x2f, 0xc8, 0x88, 0xbc, 0x66, 0x4b, 0xa5, 0x51, 0x42, 0x79, + 0x6d, 0x41, 0x4d, 0x82, 0xd3, 0xe5, 0xd1, 0x4b, 0x5d, 0x40, 0x2d, 0xc2, + 0xaf, 0xd2, 0xaa, 0x97, 0x69, 0x7b, 0x44, 0xfc, 0x64, 0x4d, 0xd5, 0xaf, + 0x51, 0xec, 0xbc, 0x46, 0x14, 0x55, 0x9a, 0x74, 0x91, 0x79, 0x6d, 0x89, + 0x9b, 0xd5, 0x93, 0x02, 0x1c, 0x02, 0xb8, 0x82, 0xd4, 0x5f, 0xa3, 0x6e, + 0x21, 0xa3, 0xc0, 0x05, 0x5f, 0x22, 0xb5, 0x0d, 0x37, 0x9b, 0x4f, 0xfc, + 0xb5, 0x44, 0x31, 0x88, 0x93, 0xb4, 0x5d, 0xf9, 0x97, 0xba, 0x7e, 0x2a, + 0x7d, 0x6a, 0x32, 0x94, 0x34, 0x2f, 0xf0, 0xf7, 0x08, 0x1b, 0x8f, 0x97, + 0x68, 0x6b, 0x89, 0xda, 0xb8, 0x61, 0x63, 0x00, 0xd4, 0x9a, 0x78, 0x6c, + 0x82, 0xf2, 0xda, 0x32, 0x23, 0xd7, 0x8e, 0x30, 0x72, 0xed, 0x08, 0xe5, + 0xb5, 0x2a, 0x5d, 0x23, 0xd7, 0x2a, 0x38, 0xc9, 0xce, 0xdd, 0x3b, 0x17, + 0xc8, 0x5b, 0xe8, 0xee, 0xa5, 0x5e, 0x71, 0x97, 0xa2, 0x85, 0xce, 0x6b, + 0x5b, 0xbd, 0x8e, 0xb3, 0x9c, 0xf5, 0x32, 0xba, 0x1d, 0xc6, 0x76, 0xdb, + 0x80, 0xac, 0xa5, 0xba, 0x17, 0x93, 0x10, 0x0a, 0x84, 0xd5, 0xf4, 0x3c, + 0x3c, 0x5f, 0x06, 0xbf, 0x24, 0x40, 0x96, 0x59, 0xb7, 0x97, 0x76, 0x18, + 0x03, 0xc6, 0x32, 0x71, 0xbd, 0x58, 0xbb, 0x6a, 0xf6, 0x63, 0xdb, 0xb0, + 0xdd, 0xc1, 0x24, 0x25, 0x08, 0xc0, 0x59, 0xfd, 0xba, 0xed, 0x89, 0x47, + 0xf1, 0xfd, 0x1a, 0x98, 0x96, 0xd9, 0x47, 0x3f, 0x4a, 0x2c, 0xcf, 0xd8, + 0x79, 0x5d, 0x7e, 0xef, 0x25, 0xb0, 0x3d, 0x19, 0xce, 0x34, 0x03, 0xfc, + 0xa0, 0xaf, 0x3d, 0xbd, 0xf1, 0xb2, 0x21, 0x58, 0x33, 0x96, 0xdf, 0x26, + 0xed, 0xbf, 0xd8, 0xbc, 0xbc, 0x5e, 0xf0, 0xad, 0x21, 0x92, 0xe1, 0x5a, + 0x0b, 0xd9, 0x30, 0x69, 0x38, 0x62, 0xb9, 0xfb, 0x85, 0x7b, 0x19, 0x3d, + 0xfa, 0xe8, 0xa3, 0x4b, 0xfa, 0xcd, 0x2c, 0xb2, 0x1d, 0x80, 0xed, 0xa7, + 0x55, 0xfd, 0x6a, 0xad, 0x5b, 0x0b, 0x3c, 0x16, 0x3d, 0xaf, 0xff, 0x66, + 0xea, 0x99, 0xc8, 0xfa, 0xfb, 0x86, 0xdf, 0x4d, 0xe7, 0x1f, 0xa2, 0x7e, + 0x3f, 0x6f, 0xba, 0xdb, 0x49, 0x86, 0x70, 0x9d, 0xab, 0x2d, 0xa3, 0xc3, + 0x8e, 0x82, 0x6b, 0x99, 0x5f, 0x12, 0x50, 0x2b, 0x09, 0x16, 0xb6, 0x90, + 0x46, 0x1c, 0xf5, 0x7b, 0xad, 0xda, 0xef, 0xa8, 0x5f, 0xdc, 0x1d, 0x4c, + 0x07, 0x7e, 0xac, 0xa6, 0xea, 0x57, 0x6b, 0x5d, 0x3e, 0x03, 0x4f, 0x9d, + 0x48, 0x36, 0xb6, 0xb2, 0x1c, 0xf4, 0xb4, 0xc4, 0x40, 0x0e, 0xb1, 0xaa, + 0xac, 0x67, 0x01, 0x86, 0x12, 0xc5, 0x75, 0x0a, 0xa8, 0x65, 0xcb, 0x00, + 0xb5, 0x2c, 0xb5, 0x56, 0x29, 0x3f, 0xa9, 0x27, 0xe4, 0x99, 0x75, 0x80, + 0xc9, 0x49, 0x68, 0x7a, 0x6a, 0x79, 0xec, 0x58, 0xf4, 0x67, 0xeb, 0xd8, + 0x31, 0x68, 0xce, 0x85, 0xdb, 0x86, 0x1f, 0x85, 0xc3, 0x8f, 0x26, 0x27, + 0x3d, 0xd4, 0xf6, 0x6e, 0xaf, 0x92, 0xce, 0x44, 0x5e, 0xb7, 0xa3, 0xdf, + 0x38, 0x04, 0x62, 0xe7, 0x82, 0x7d, 0xaa, 0x5e, 0xea, 0x17, 0xa8, 0xd5, + 0x15, 0xf6, 0x64, 0x55, 0xfd, 0x00, 0xde, 0x3f, 0x9a, 0x0c, 0xd4, 0xea, + 0x57, 0x57, 0xeb, 0xfc, 0xc4, 0x61, 0x5a, 0x4f, 0x9d, 0x50, 0xf5, 0xab, + 0x15, 0xe9, 0x87, 0xeb, 0xe3, 0xc2, 0xee, 0xdb, 0xd9, 0xee, 0xca, 0x15, + 0x61, 0xbf, 0xdc, 0xcd, 0x2e, 0x6d, 0xe2, 0x6e, 0x1c, 0xa2, 0xd5, 0xab, + 0xcf, 0x61, 0x87, 0x1b, 0xb9, 0xba, 0xbb, 0xff, 0x99, 0xe4, 0xa7, 0xd2, + 0x29, 0xfa, 0x76, 0x1b, 0x1b, 0xea, 0x3e, 0x23, 0xdc, 0x2e, 0xdb, 0x9e, + 0x9a, 0xb9, 0x69, 0xfd, 0xa4, 0x2f, 0x13, 0x27, 0xda, 0xf6, 0x4a, 0xc7, + 0x62, 0x92, 0x52, 0x2a, 0xb0, 0x56, 0xd7, 0x86, 0x8e, 0x09, 0x60, 0x41, + 0x8b, 0x5c, 0x84, 0x99, 0xec, 0xe6, 0x27, 0x1f, 0x87, 0x76, 0x3d, 0xc5, + 0xfd, 0xe2, 0xd7, 0xeb, 0xd1, 0x4b, 0xca, 0xfc, 0x7a, 0x0f, 0x96, 0xa2, + 0x99, 0xa0, 0x9a, 0xe4, 0x6f, 0xb6, 0x25, 0x01, 0x9e, 0xce, 0x27, 0x60, + 0x6b, 0x9e, 0x0b, 0x30, 0xb5, 0xff, 0xab, 0x97, 0xfd, 0x0a, 0x2b, 0x07, + 0xb3, 0xcc, 0xce, 0xbd, 0xcc, 0x3c, 0xaf, 0xf4, 0xdc, 0xdf, 0x89, 0xa3, + 0x47, 0x39, 0x61, 0x41, 0xaf, 0x8c, 0xca, 0xe5, 0x72, 0xf0, 0xb3, 0xe3, + 0x0a, 0x60, 0xea, 0xe8, 0x51, 0xa6, 0x8e, 0x1e, 0xed, 0x2b, 0x2f, 0x2f, + 0xbc, 0xf4, 0x12, 0x7f, 0x72, 0x0e, 0x79, 0xe9, 0x47, 0xfd, 0x94, 0x5d, + 0x3f, 0xf5, 0x02, 0xf0, 0xeb, 0xa7, 0x55, 0xfd, 0x1a, 0xc5, 0xaf, 0xd7, + 0xe2, 0x0f, 0xc7, 0x99, 0xfe, 0x9e, 0x6a, 0x5f, 0x0f, 0x1f, 0x3d, 0xcc, + 0x9e, 0xff, 0x72, 0x33, 0xe3, 0x0f, 0xb5, 0x38, 0x74, 0x69, 0x19, 0x31, + 0x37, 0x8e, 0xb0, 0x80, 0x5a, 0x5e, 0xdb, 0xc3, 0x6b, 0xc9, 0x00, 0xa8, + 0x25, 0x1c, 0x05, 0xd7, 0x2a, 0x14, 0x8a, 0x4c, 0x9f, 0x6e, 0x22, 0xe7, + 0x35, 0xec, 0x16, 0x81, 0xf4, 0x3d, 0x1a, 0xed, 0x66, 0x00, 0xe2, 0x8d, + 0xeb, 0xc0, 0x43, 0x0a, 0x48, 0x28, 0x84, 0x1b, 0x01, 0x68, 0x2d, 0xa4, + 0x86, 0x6e, 0x03, 0xbc, 0xe7, 0x3b, 0xb4, 0x3c, 0xc9, 0xe8, 0xfa, 0xf5, + 0x8c, 0x1f, 0xab, 0xc6, 0xe0, 0x22, 0x42, 0x41, 0xad, 0x5a, 0xe1, 0xb9, + 0x24, 0xb2, 0xbd, 0xef, 0x67, 0x85, 0xa3, 0xf2, 0x53, 0x7d, 0xaa, 0xa6, + 0xee, 0x31, 0x97, 0xa9, 0xf3, 0x77, 0x7c, 0x72, 0x9a, 0xf1, 0xc9, 0x69, + 0x3a, 0x52, 0xc7, 0x77, 0x64, 0x24, 0x4e, 0xc4, 0x86, 0x05, 0xd9, 0x8a, + 0xe7, 0xe5, 0xde, 0xaf, 0xee, 0x63, 0x7a, 0xba, 0x41, 0x6d, 0x56, 0xa5, + 0xb1, 0x36, 0xe3, 0x51, 0xa9, 0xb8, 0xac, 0xbf, 0x32, 0x0a, 0xd6, 0xf0, + 0xbc, 0x0c, 0x39, 0x21, 0x22, 0x40, 0x2d, 0x29, 0xa1, 0x52, 0xa9, 0x04, + 0x7e, 0xad, 0xb9, 0x16, 0xa5, 0x52, 0x99, 0xe6, 0xf3, 0x1e, 0xb5, 0xd3, + 0x2d, 0x98, 0x87, 0xe9, 0xd3, 0x4d, 0x1a, 0x67, 0x74, 0x7a, 0x62, 0xd7, + 0xeb, 0x85, 0xce, 0xeb, 0x54, 0x3f, 0x7f, 0x7a, 0x5a, 0x2f, 0xdf, 0xc6, + 0xe2, 0xf7, 0x48, 0xf1, 0xf3, 0x3a, 0xe9, 0x9e, 0xcb, 0xee, 0x7e, 0xad, + 0xb9, 0xca, 0x2c, 0x07, 0x34, 0x92, 0x31, 0x8e, 0x15, 0x0b, 0x15, 0x1c, + 0x81, 0xd6, 0x61, 0xfe, 0x6a, 0x42, 0xf0, 0xeb, 0x1d, 0x82, 0x76, 0x39, + 0x63, 0x85, 0x5d, 0x73, 0x55, 0x77, 0xe0, 0x57, 0x07, 0xa2, 0xfe, 0x85, + 0xd8, 0xb6, 0xc5, 0x24, 0xf5, 0xd8, 0x9c, 0x39, 0x8b, 0x2b, 0xb1, 0xfe, + 0xef, 0x42, 0x6d, 0xa6, 0xb0, 0x30, 0x94, 0x26, 0x99, 0xd2, 0x5c, 0x1f, + 0x13, 0xe2, 0x27, 0x01, 0xb5, 0xe2, 0x2a, 0x01, 0xa3, 0xb1, 0x34, 0x14, + 0x7a, 0xb8, 0x17, 0x92, 0x47, 0xc8, 0xc0, 0xdf, 0x82, 0x2e, 0xc7, 0x38, + 0xc0, 0x28, 0x7e, 0xcf, 0x95, 0x30, 0x96, 0x22, 0x06, 0xd4, 0xcf, 0x28, + 0xe3, 0x87, 0x3f, 0x80, 0x9d, 0x5f, 0x7e, 0xb8, 0xcf, 0x14, 0x45, 0x25, + 0xb2, 0x99, 0x00, 0xa0, 0x65, 0xfb, 0xc5, 0x75, 0xe3, 0xe8, 0xaf, 0x71, + 0xe3, 0xe8, 0xaf, 0x25, 0xda, 0xd8, 0xfb, 0xa7, 0x7b, 0x17, 0xdd, 0x4f, + 0xeb, 0xd2, 0x8d, 0xb8, 0x9b, 0x1b, 0xb8, 0x9b, 0x1b, 0xb4, 0x7c, 0x37, + 0xf2, 0x1b, 0x9f, 0x0b, 0x8f, 0xf3, 0xd2, 0xa5, 0xdd, 0x20, 0xad, 0xf2, + 0xf7, 0xce, 0x0d, 0x16, 0xd3, 0x17, 0x50, 0xab, 0x5d, 0x5b, 0xf8, 0x67, + 0x94, 0x2d, 0xa9, 0x1f, 0x04, 0x40, 0xad, 0x3b, 0x7f, 0xef, 0xce, 0xa5, + 0x27, 0x2a, 0xd6, 0x37, 0x1b, 0x73, 0xd7, 0x31, 0x9a, 0xd0, 0x86, 0x7b, + 0xb2, 0x49, 0x2e, 0x18, 0x8b, 0xd9, 0x02, 0x4e, 0x0d, 0x98, 0x8a, 0x85, + 0x69, 0xe0, 0x8a, 0xf8, 0x91, 0xa8, 0xcb, 0xd2, 0xa9, 0xe2, 0xf9, 0x0d, + 0x5a, 0x73, 0x2d, 0x5c, 0xa7, 0x80, 0xe7, 0x37, 0xc8, 0x0d, 0x76, 0x1f, + 0xb5, 0x9e, 0xef, 0xe1, 0x6a, 0xf8, 0x81, 0x72, 0xe7, 0x51, 0x67, 0xc8, + 0x7a, 0x14, 0x80, 0xaa, 0x40, 0xab, 0xd9, 0xc2, 0x8d, 0x80, 0xad, 0x32, + 0x54, 0x2e, 0x2b, 0xb3, 0x65, 0xed, 0x5d, 0xdc, 0xb5, 0xf5, 0xaf, 0xd8, + 0xfd, 0x50, 0xb5, 0xcb, 0xae, 0x19, 0xcb, 0x06, 0x34, 0xd8, 0x4b, 0x46, + 0xee, 0x29, 0x22, 0xeb, 0x3d, 0xfa, 0xb8, 0xc9, 0x98, 0xbb, 0x32, 0x02, + 0x03, 0xc4, 0xdc, 0x06, 0xfe, 0x5e, 0x5a, 0xcd, 0x86, 0x4e, 0x5f, 0x21, + 0x70, 0x7b, 0xb2, 0x46, 0x2e, 0x5f, 0xd0, 0xfe, 0x55, 0xc0, 0xdc, 0x40, + 0x4e, 0x07, 0x76, 0x3c, 0xbf, 0xa9, 0xf3, 0xdb, 0x4b, 0x05, 0x5a, 0x73, + 0x8d, 0x58, 0xde, 0xff, 0xdc, 0x72, 0x17, 0x75, 0x3d, 0xa9, 0x3e, 0x85, + 0x27, 0x3d, 0x5c, 0xe1, 0x06, 0x60, 0x96, 0xd1, 0xd3, 0xaa, 0x7e, 0x83, + 0x94, 0x2f, 0x30, 0x6e, 0x16, 0x57, 0xd1, 0x5a, 0x16, 0x63, 0xeb, 0x49, + 0xe1, 0x40, 0x03, 0xb5, 0x8a, 0x70, 0xdd, 0x57, 0x60, 0xe8, 0x88, 0xfa, + 0x5d, 0x77, 0x72, 0x81, 0x9d, 0x2c, 0x36, 0xe0, 0x65, 0x6f, 0x3f, 0x42, + 0x6f, 0x4a, 0xfc, 0x62, 0xd2, 0x76, 0x1e, 0x79, 0x44, 0xfd, 0x00, 0x86, + 0x86, 0x86, 0x18, 0x1a, 0x1a, 0xe2, 0xc8, 0x10, 0xc0, 0x0c, 0x43, 0xd6, + 0xa8, 0xd9, 0x23, 0x8f, 0xc0, 0x6f, 0x49, 0xe0, 0xe8, 0x0f, 0xe0, 0x28, + 0x4c, 0x5c, 0x1a, 0x8d, 0x7f, 0x9d, 0x54, 0x3f, 0xbe, 0xa4, 0x6d, 0x2f, + 0x05, 0xf8, 0x05, 0x1c, 0xfd, 0x12, 0xf0, 0x27, 0x61, 0xbc, 0x62, 0xb1, + 0xc8, 0x47, 0xfe, 0x02, 0xee, 0xbe, 0x1a, 0xae, 0xd3, 0xe9, 0x2b, 0xea, + 0xbf, 0x7a, 0x1d, 0x36, 0x6c, 0x80, 0xe3, 0xf5, 0x3a, 0xc7, 0x35, 0x09, + 0xad, 0x58, 0x04, 0x8e, 0xab, 0x78, 0x01, 0xbc, 0xac, 0x8f, 0x71, 0x33, + 0x00, 0xd1, 0x0b, 0x8c, 0x0d, 0x7d, 0x03, 0xb5, 0xba, 0xfc, 0x34, 0x50, + 0xcb, 0xc0, 0xa4, 0x7a, 0xc5, 0x7b, 0xad, 0xd0, 0xad, 0xe2, 0x60, 0x7e, + 0x61, 0x5b, 0x5d, 0x63, 0x56, 0x0b, 0xdf, 0xe9, 0x78, 0x5e, 0x73, 0xc1, + 0xed, 0x5d, 0xd6, 0x62, 0x79, 0x13, 0xae, 0x88, 0x8c, 0x9d, 0xbf, 0x61, + 0x8a, 0xf5, 0xc3, 0xed, 0xe7, 0x5c, 0x65, 0x5f, 0x7d, 0x24, 0x46, 0xf8, + 0xe1, 0x33, 0xa4, 0x8c, 0x3d, 0xd6, 0xa0, 0xdb, 0xba, 0x69, 0x14, 0x1e, + 0xb1, 0xe0, 0xc3, 0xbe, 0x63, 0xd0, 0x12, 0xd0, 0x92, 0x0a, 0xf7, 0xe2, + 0xfa, 0x92, 0x12, 0x92, 0x8a, 0x2f, 0xa9, 0x3a, 0x92, 0xba, 0x0e, 0x67, + 0x43, 0x6d, 0x8c, 0x2a, 0xbe, 0x02, 0x6d, 0xd9, 0xaa, 0xb6, 0x25, 0x13, + 0x42, 0x50, 0xca, 0xba, 0xb8, 0xc0, 0xe8, 0x40, 0x86, 0x8c, 0xa3, 0x46, + 0x14, 0x2a, 0x8e, 0x02, 0x7a, 0x15, 0x74, 0x5d, 0x75, 0x7c, 0x19, 0x74, + 0x9a, 0x2a, 0x0e, 0x8c, 0x16, 0x54, 0xda, 0x85, 0x49, 0xab, 0x23, 0x82, + 0xf6, 0x4c, 0x08, 0xd8, 0xfe, 0xd9, 0x3b, 0x58, 0x77, 0xd3, 0x36, 0x2a, + 0x95, 0x0a, 0xde, 0x5c, 0x83, 0x8c, 0x03, 0x63, 0x37, 0xdd, 0xca, 0xf6, + 0xcf, 0xdd, 0xc1, 0x6d, 0x9f, 0xdb, 0x09, 0xc0, 0xba, 0x2c, 0x8c, 0x08, + 0xf5, 0xab, 0xf9, 0x0a, 0x88, 0x6a, 0xda, 0x7d, 0xfb, 0xb0, 0xe9, 0xe8, + 0x0f, 0x09, 0xb9, 0x84, 0x47, 0x4a, 0x06, 0xc1, 0xba, 0xf8, 0xf5, 0x40, + 0xaf, 0x96, 0x7d, 0xc9, 0x88, 0x5e, 0xb5, 0xcf, 0xa2, 0x16, 0x90, 0x71, + 0x24, 0x23, 0x79, 0xb5, 0x74, 0xe9, 0x20, 0xe9, 0x04, 0x10, 0x2e, 0x50, + 0xd7, 0x99, 0x8e, 0x23, 0xc9, 0x01, 0x39, 0x00, 0x89, 0xba, 0x77, 0xb5, + 0xd2, 0x93, 0x71, 0x04, 0x25, 0x08, 0xca, 0x5e, 0xa5, 0x31, 0xfa, 0x9c, + 0x8b, 0x0f, 0x83, 0xa7, 0xeb, 0x7a, 0xe8, 0x3d, 0x3f, 0xe1, 0xcd, 0xdf, + 0xbf, 0x80, 0x77, 0xbc, 0x3d, 0xb9, 0x4d, 0x7f, 0x45, 0x4c, 0x71, 0xc9, + 0x3f, 0xaf, 0xe2, 0x02, 0x39, 0x9c, 0xb8, 0x7d, 0xa9, 0x7a, 0xc7, 0xdb, + 0x4f, 0x73, 0xf6, 0xc5, 0x79, 0x4e, 0x9d, 0x3a, 0xc5, 0xa9, 0x53, 0xa7, + 0x38, 0xf9, 0xbd, 0x27, 0x00, 0x82, 0xa5, 0x81, 0x5c, 0x19, 0x60, 0x14, + 0xc0, 0xda, 0x2b, 0xae, 0x0c, 0x40, 0x52, 0x67, 0x5f, 0x54, 0x24, 0xdb, + 0x81, 0xc2, 0xf2, 0x08, 0x88, 0xca, 0xe8, 0xd4, 0xa9, 0x53, 0x01, 0x84, + 0xea, 0xf5, 0xb0, 0x09, 0x04, 0x40, 0x2d, 0x03, 0xce, 0x1a, 0x28, 0x2c, + 0x0f, 0x7e, 0xc6, 0x96, 0xb1, 0x7b, 0xf6, 0xc5, 0x79, 0x56, 0xac, 0x58, + 0x11, 0xe4, 0xd9, 0x06, 0x74, 0x99, 0xfc, 0x9b, 0x7d, 0x1a, 0x9b, 0x36, + 0x94, 0xeb, 0xd4, 0xa9, 0x53, 0xac, 0xbd, 0xe2, 0xca, 0xc0, 0x96, 0xf1, + 0x5f, 0xb3, 0x66, 0x0d, 0x03, 0x85, 0xe5, 0x41, 0x3a, 0xcd, 0x7e, 0x3d, + 0x26, 0xe0, 0xc3, 0x61, 0x79, 0xdb, 0x6d, 0xf8, 0xe4, 0x93, 0xd5, 0x08, + 0x40, 0x4b, 0x64, 0x05, 0xa3, 0x57, 0x57, 0x68, 0xcc, 0xb5, 0xba, 0xfa, + 0xf3, 0x76, 0xb8, 0xce, 0x5c, 0x0b, 0x91, 0x15, 0x8c, 0x9f, 0x9c, 0x64, + 0xdb, 0x46, 0xf5, 0xa9, 0x8a, 0x96, 0x75, 0xcc, 0x05, 0xe7, 0x85, 0x9f, + 0x41, 0xb6, 0xa1, 0x7a, 0x72, 0x42, 0x3d, 0xb7, 0x8b, 0xd9, 0xb4, 0x41, + 0x53, 0xc2, 0xe9, 0x68, 0x58, 0x5c, 0x46, 0x41, 0xb4, 0x22, 0x01, 0x73, + 0x08, 0xa7, 0x43, 0xf9, 0xf2, 0x11, 0x86, 0xaf, 0x28, 0x53, 0x2e, 0xe6, + 0x91, 0x73, 0x0d, 0xdc, 0xac, 0x8b, 0x9c, 0x6b, 0x50, 0xb9, 0xc2, 0xf4, + 0xaf, 0x33, 0x14, 0xb2, 0x05, 0x8e, 0xcd, 0x4c, 0x52, 0x2e, 0x14, 0x01, + 0x68, 0xb4, 0xa3, 0xed, 0x48, 0x2e, 0x5b, 0xc0, 0x6d, 0x8b, 0xe0, 0xb9, + 0x7f, 0x43, 0x7a, 0x41, 0x9f, 0x4d, 0xbd, 0x0f, 0xa0, 0x40, 0x5e, 0x06, + 0xa8, 0x25, 0xfd, 0x0c, 0xc2, 0xcd, 0x20, 0x64, 0x2c, 0xad, 0x58, 0x79, + 0xf4, 0x43, 0x77, 0x47, 0x4a, 0xf6, 0x7d, 0xfd, 0xde, 0x30, 0xac, 0x39, + 0xa9, 0xb3, 0x99, 0xe8, 0xf0, 0xbb, 0x0f, 0x07, 0x1e, 0x3a, 0x40, 0x6e, + 0x10, 0x0e, 0xfd, 0xd7, 0x03, 0x61, 0xd8, 0xb9, 0x0e, 0xcc, 0x75, 0x28, + 0x64, 0x0b, 0x14, 0xb2, 0x61, 0xdf, 0x76, 0xe4, 0x9a, 0x75, 0x54, 0xae, + 0x59, 0x17, 0xd4, 0x83, 0x3b, 0xe8, 0x52, 0x28, 0x17, 0x68, 0x54, 0xad, + 0xfe, 0xa4, 0xdd, 0x86, 0x5b, 0xe7, 0x74, 0x5c, 0x06, 0x20, 0x15, 0x87, + 0x52, 0xd9, 0xdb, 0xed, 0x65, 0xd2, 0x36, 0xdb, 0xce, 0x42, 0x61, 0x16, + 0xf2, 0xb7, 0xf7, 0x93, 0x64, 0xab, 0x97, 0x1d, 0xb3, 0x4d, 0x88, 0x42, + 0x04, 0x00, 0xb6, 0x50, 0xda, 0xe3, 0xb0, 0xab, 0x78, 0x1e, 0x8c, 0xad, + 0xa4, 0xf8, 0x0a, 0x8c, 0xd5, 0x0d, 0xea, 0x8a, 0xcb, 0xb6, 0x1b, 0x87, + 0x73, 0xd5, 0x66, 0x27, 0x12, 0x61, 0x66, 0x67, 0xe6, 0xbf, 0xc3, 0x8b, + 0x2f, 0x3d, 0x97, 0xf8, 0x3b, 0x33, 0xff, 0x9d, 0x48, 0x38, 0xa3, 0xf8, + 0x39, 0x9d, 0x2a, 0x55, 0xaa, 0x54, 0xa9, 0x52, 0xa5, 0x4a, 0x95, 0x2a, + 0x55, 0xaa, 0x54, 0xa9, 0x52, 0xa5, 0x4a, 0x95, 0x2a, 0x55, 0xaa, 0x54, + 0xa9, 0x52, 0xa5, 0x4a, 0x95, 0x2a, 0x55, 0xaa, 0x54, 0xa9, 0xfa, 0x57, + 0x0a, 0xd5, 0x4a, 0x95, 0x2a, 0x55, 0xaa, 0x54, 0xa9, 0x7e, 0x56, 0x7a, + 0x28, 0x74, 0x76, 0x01, 0xaf, 0x12, 0xc0, 0x4f, 0x71, 0x7f, 0x1b, 0x60, + 0x55, 0x58, 0xd9, 0x3f, 0xf4, 0x29, 0xc9, 0x46, 0x3f, 0x61, 0xfb, 0xb1, + 0xbd, 0x98, 0x4d, 0x5b, 0xe6, 0xab, 0xc4, 0xf6, 0xbe, 0x96, 0xb2, 0xbf, + 0x7e, 0xd3, 0xb4, 0x94, 0xfc, 0xf6, 0x0a, 0xd7, 0xf0, 0x16, 0x87, 0x96, + 0x75, 0xc9, 0xaa, 0xdf, 0x13, 0xc7, 0xc3, 0x09, 0xb2, 0xe1, 0x0b, 0xe2, + 0x21, 0xe9, 0x2a, 0x83, 0x08, 0x7e, 0x61, 0x40, 0x09, 0x6e, 0x74, 0x7a, + 0x5c, 0xe2, 0x8b, 0xf4, 0x59, 0xc8, 0x14, 0x05, 0x72, 0x28, 0xc7, 0x89, + 0x93, 0x19, 0x46, 0xbe, 0x20, 0x70, 0x6f, 0xca, 0xa9, 0x37, 0xb0, 0xb3, + 0x76, 0xc0, 0xd8, 0x97, 0xb7, 0xf5, 0x8b, 0xad, 0x0d, 0x4f, 0x72, 0xff, + 0x27, 0xb6, 0xb1, 0xee, 0xb3, 0xbb, 0xb8, 0xed, 0x83, 0xd7, 0x23, 0xa4, + 0xa0, 0x6a, 0x26, 0xd6, 0xeb, 0x62, 0x28, 0xbb, 0x39, 0xee, 0x39, 0x76, + 0x8c, 0x82, 0x4e, 0xcf, 0xc4, 0xe9, 0x29, 0x05, 0xe0, 0xf2, 0x24, 0xfb, + 0xfe, 0xfa, 0x5b, 0x4c, 0x55, 0xa7, 0xb8, 0xfd, 0xbe, 0x03, 0x01, 0xa8, + 0xab, 0xbc, 0x56, 0x4f, 0x00, 0x72, 0x24, 0xd5, 0x93, 0x0d, 0xee, 0xff, + 0xc4, 0x36, 0x4e, 0x54, 0x4f, 0x80, 0x2f, 0xf8, 0xab, 0x8f, 0xdf, 0x8a, + 0xd0, 0x7f, 0x00, 0x38, 0xfa, 0x8b, 0xb0, 0xc2, 0x45, 0xf4, 0x91, 0x17, + 0xd9, 0x5e, 0xfc, 0x18, 0x69, 0x78, 0x92, 0x82, 0x2b, 0x28, 0xaf, 0x2d, + 0x04, 0x40, 0x30, 0x80, 0x72, 0x3e, 0x87, 0x88, 0x4f, 0xee, 0x33, 0xa5, + 0x63, 0x4d, 0x52, 0x5e, 0x14, 0xa6, 0x65, 0x83, 0xcf, 0x88, 0xd6, 0xaf, + 0x5d, 0xef, 0x9e, 0x04, 0x29, 0x9b, 0x76, 0x51, 0x82, 0x50, 0x60, 0xad, + 0x86, 0x1f, 0x42, 0x15, 0x82, 0x75, 0x5f, 0x85, 0xf3, 0xda, 0x4d, 0x3c, + 0x1f, 0x1a, 0x3e, 0x48, 0x47, 0xe0, 0xb5, 0x9b, 0xc1, 0x77, 0x66, 0xbd, + 0x76, 0xb3, 0xe7, 0x6f, 0xe1, 0xed, 0x35, 0x3c, 0x3d, 0x61, 0x2e, 0xee, + 0x0e, 0xd3, 0x56, 0x66, 0xb2, 0x4d, 0x24, 0x4c, 0xd2, 0x2f, 0xc8, 0x5f, + 0x82, 0x9f, 0xad, 0xa4, 0x6d, 0x77, 0xec, 0xbe, 0x03, 0xd7, 0x75, 0xb9, + 0x63, 0xf7, 0x1d, 0x40, 0x08, 0xcd, 0x32, 0x4b, 0x5b, 0x13, 0x8f, 0x4d, + 0x44, 0xdc, 0xb7, 0xfd, 0xee, 0xcd, 0xc1, 0xcf, 0x6b, 0x37, 0xb9, 0xed, + 0x77, 0x6f, 0xb6, 0xf6, 0xb5, 0xf0, 0x64, 0x95, 0xa4, 0x32, 0x69, 0xcc, + 0x35, 0x90, 0xed, 0x16, 0xb2, 0xdd, 0x8a, 0x94, 0xe1, 0x82, 0xea, 0x71, + 0x5e, 0xff, 0x6b, 0x93, 0x6c, 0xcb, 0xe0, 0x5c, 0x6a, 0x7a, 0x5e, 0xb0, + 0x6e, 0xbb, 0xe3, 0x61, 0xed, 0x30, 0x22, 0x2b, 0x16, 0x0d, 0x6f, 0xc2, + 0xc8, 0xb6, 0x82, 0x6e, 0xd9, 0xe1, 0xce, 0x65, 0xc2, 0x53, 0x70, 0xbd, + 0x90, 0x16, 0x24, 0xd1, 0xb2, 0xef, 0xf9, 0xe1, 0x3e, 0xed, 0xf0, 0xe7, + 0x2a, 0xbb, 0x7e, 0xab, 0x7f, 0xfb, 0x42, 0x64, 0xdb, 0xb9, 0x00, 0xa1, + 0x7e, 0x56, 0x4a, 0x4a, 0xe7, 0x91, 0xd8, 0x32, 0x0e, 0xc5, 0xda, 0x64, + 0xf9, 0xdb, 0xdb, 0x14, 0x88, 0x6b, 0x88, 0x4d, 0xda, 0xd7, 0x86, 0x6b, + 0xf5, 0x53, 0x1e, 0x0b, 0xc1, 0xb7, 0x00, 0x36, 0x6d, 0xda, 0xd4, 0xf5, + 0x5b, 0x8a, 0x36, 0x6f, 0xde, 0xcc, 0xa7, 0x3e, 0xfd, 0x69, 0x3e, 0xf5, + 0xe9, 0x4f, 0xb3, 0x79, 0xf3, 0x66, 0xee, 0xe9, 0x33, 0x9e, 0x5d, 0xbf, + 0x27, 0x12, 0x26, 0x65, 0x5e, 0x7f, 0x0c, 0xbe, 0xb5, 0x11, 0x3a, 0xff, + 0xf0, 0x0c, 0x9d, 0x7f, 0x78, 0x86, 0xbf, 0x99, 0x7a, 0x86, 0xeb, 0x8f, + 0x85, 0x20, 0xa8, 0x61, 0x47, 0xfd, 0x92, 0x64, 0xfb, 0xdf, 0xd3, 0xc3, + 0x6d, 0x6b, 0x9d, 0x93, 0xec, 0xb6, 0xc1, 0x56, 0x7b, 0xf4, 0xcf, 0x75, + 0xe0, 0x2c, 0xea, 0xe7, 0x3a, 0x51, 0xff, 0x3b, 0x7d, 0xf5, 0x8b, 0x6b, + 0x0f, 0x51, 0xff, 0x13, 0x3d, 0xdc, 0xb6, 0x7a, 0x85, 0x4f, 0xb2, 0x1f, + 0x0f, 0x73, 0x16, 0xc8, 0x3b, 0xea, 0x67, 0xbb, 0xff, 0x48, 0xbb, 0x01, + 0x76, 0xfa, 0xb0, 0x3d, 0x66, 0x2b, 0xef, 0xc0, 0x5d, 0x28, 0xff, 0xbc, + 0x03, 0xcf, 0x00, 0x7f, 0xa3, 0xdd, 0x7f, 0x0f, 0x7c, 0xcb, 0x0f, 0x6d, + 0x19, 0xdd, 0xe6, 0xc3, 0xcd, 0xda, 0xce, 0xcd, 0x96, 0xfb, 0x36, 0x3b, + 0x6d, 0x56, 0xfd, 0x9e, 0x68, 0x86, 0x13, 0x60, 0x1a, 0x4f, 0x4f, 0xc0, + 0xac, 0x82, 0x89, 0xb2, 0x52, 0x4f, 0xd4, 0x9e, 0xad, 0xaa, 0xdf, 0xca, + 0x22, 0x08, 0x90, 0x67, 0xaa, 0xc8, 0xc7, 0xd5, 0x75, 0x49, 0x14, 0xf5, + 0xe4, 0xe1, 0xda, 0x84, 0xfa, 0x41, 0x00, 0xd4, 0x6a, 0x3c, 0xf1, 0x30, + 0xae, 0xdf, 0xa2, 0x20, 0x3a, 0x01, 0x40, 0x2b, 0x77, 0x66, 0x82, 0xdc, + 0x99, 0x09, 0xb5, 0xee, 0x08, 0x70, 0x76, 0x22, 0xc4, 0xdf, 0x71, 0xf8, + 0x38, 0x34, 0x62, 0x97, 0x9e, 0xf1, 0xc7, 0xd5, 0xcf, 0x15, 0x75, 0xf0, + 0x47, 0x11, 0xe2, 0x04, 0xe3, 0x8f, 0x43, 0xc3, 0x02, 0x78, 0x1d, 0xbe, + 0x4c, 0x87, 0x71, 0x24, 0xd3, 0x89, 0x38, 0x1a, 0x80, 0x7b, 0x93, 0xbd, + 0x4b, 0x05, 0xc8, 0x17, 0xe0, 0xe8, 0x61, 0xa8, 0xd7, 0x7a, 0x87, 0x7b, + 0xbd, 0x74, 0xd7, 0x7e, 0xb5, 0x7c, 0x54, 0x81, 0x68, 0x6e, 0x77, 0xa2, + 0xbf, 0x2e, 0xc5, 0xfa, 0x5c, 0x81, 0x4a, 0x05, 0x78, 0xff, 0xa8, 0x95, + 0x8f, 0xa8, 0xec, 0xfa, 0x8d, 0xf7, 0xc3, 0xc3, 0x89, 0x52, 0xdd, 0xee, + 0xea, 0x93, 0x06, 0x36, 0x0c, 0x5e, 0xfb, 0xf5, 0x9f, 0xc0, 0x3a, 0xf1, + 0x78, 0x74, 0xa2, 0xd8, 0xc8, 0xd5, 0x39, 0xdc, 0x65, 0x1b, 0x19, 0xb9, + 0x3a, 0x17, 0x00, 0xb1, 0xcc, 0x4f, 0xfa, 0xb2, 0x6f, 0xf7, 0xc4, 0xe3, + 0xad, 0x60, 0xdd, 0xf8, 0x05, 0x65, 0x30, 0x17, 0x03, 0x50, 0xf6, 0xb8, + 0x1e, 0x1b, 0x1b, 0x46, 0xbd, 0x00, 0xcc, 0x49, 0x92, 0x52, 0x22, 0x3d, + 0x2b, 0x6f, 0xb2, 0x13, 0xbd, 0xee, 0xcb, 0x18, 0xc8, 0xcb, 0x17, 0x3d, + 0xd3, 0xa1, 0xf6, 0x1d, 0xd6, 0x51, 0xe5, 0x0a, 0x11, 0x99, 0x70, 0x6b, + 0xd7, 0xef, 0xf8, 0x0b, 0x09, 0xd0, 0x83, 0x78, 0xda, 0x7a, 0xb8, 0x5f, + 0x6f, 0x9d, 0x79, 0xf9, 0x15, 0x56, 0x5d, 0x78, 0x01, 0x70, 0x21, 0x00, + 0xff, 0x74, 0xea, 0x0c, 0xd5, 0x39, 0x75, 0x9c, 0x0e, 0x70, 0xc1, 0x92, + 0xd2, 0xb4, 0x1c, 0xf8, 0x61, 0xb5, 0xca, 0x0f, 0xab, 0x55, 0x5e, 0xa8, + 0x56, 0x59, 0xbe, 0x68, 0x8c, 0xa8, 0xde, 0xbd, 0x6c, 0x90, 0x8b, 0x5e, + 0x7a, 0x89, 0x5f, 0xd5, 0xeb, 0x5f, 0x04, 0x86, 0x07, 0xb3, 0xac, 0xbc, + 0x38, 0xbb, 0x50, 0xb4, 0x25, 0x6b, 0x29, 0xe5, 0xdb, 0x4f, 0xbd, 0xd8, + 0xf5, 0x6b, 0xb7, 0xe7, 0x13, 0x47, 0x5a, 0x94, 0xae, 0x10, 0xb8, 0x4c, + 0x20, 0xff, 0xa3, 0xe4, 0xd0, 0x43, 0x65, 0x26, 0x74, 0x7b, 0xbd, 0xed, + 0x64, 0xf7, 0x31, 0x51, 0x6b, 0x48, 0xdc, 0x9c, 0xa0, 0x71, 0x46, 0xd2, + 0x69, 0x83, 0x7c, 0x4b, 0xb8, 0xad, 0xa0, 0x27, 0x5e, 0xda, 0xf7, 0xce, + 0xb9, 0xdc, 0xe2, 0x30, 0x5e, 0xe1, 0xc8, 0x08, 0xa4, 0x4a, 0x4a, 0x2f, + 0x58, 0x4a, 0xe9, 0x31, 0x3e, 0xa9, 0x40, 0x02, 0xe3, 0x93, 0x93, 0x54, + 0x56, 0xe7, 0x91, 0xbe, 0x6a, 0x8a, 0x85, 0xd3, 0xa1, 0xd1, 0x54, 0x17, + 0x82, 0xd1, 0x8d, 0x65, 0x1d, 0x66, 0x3a, 0x62, 0xa3, 0xa5, 0xef, 0x27, + 0x27, 0x13, 0xe0, 0x05, 0x41, 0x9e, 0x66, 0x15, 0xb8, 0xb9, 0x5c, 0x76, + 0xc9, 0xb9, 0x50, 0xc8, 0xbb, 0x94, 0x37, 0x44, 0xe1, 0x8a, 0x87, 0xbf, + 0x3d, 0x89, 0xc8, 0x0a, 0x0c, 0xab, 0x56, 0xf6, 0x84, 0x7c, 0x84, 0x79, + 0x72, 0xb3, 0x82, 0x46, 0xb3, 0x49, 0xa7, 0xdd, 0x82, 0x5c, 0x86, 0xd2, + 0x4a, 0x97, 0xc3, 0x8f, 0x4d, 0xe3, 0xcd, 0xab, 0x63, 0xf7, 0xf0, 0x63, + 0xd3, 0x41, 0x78, 0xe9, 0x2b, 0x48, 0x4d, 0xa5, 0x12, 0x05, 0xc6, 0xc4, + 0x27, 0xc8, 0x37, 0x9f, 0xf7, 0xf0, 0x5a, 0x1e, 0x64, 0x74, 0x42, 0xde, + 0x22, 0x18, 0x5d, 0x5f, 0x21, 0x67, 0x41, 0x74, 0xed, 0xfa, 0xed, 0xe7, + 0xbc, 0x4e, 0xf5, 0xf3, 0xa3, 0x4b, 0x51, 0x40, 0xad, 0x1f, 0x01, 0xef, + 0x8c, 0xfd, 0x46, 0x88, 0x23, 0x73, 0xa2, 0xf5, 0x1b, 0xbf, 0xe7, 0x82, + 0x38, 0x72, 0x66, 0xa0, 0x27, 0xe8, 0xa9, 0x63, 0x01, 0xa6, 0x04, 0x10, + 0x9c, 0x2d, 0xda, 0x3f, 0xe9, 0x28, 0x7a, 0xd3, 0x3c, 0x34, 0x74, 0xb3, + 0xf7, 0xa3, 0x77, 0x0f, 0x04, 0xa7, 0xfd, 0x5f, 0x7c, 0x37, 0x79, 0x1f, + 0x6f, 0x9a, 0x87, 0x53, 0xdf, 0x9d, 0x67, 0xcd, 0x55, 0x03, 0xac, 0xb9, + 0x4a, 0xa5, 0xad, 0xc0, 0x00, 0x25, 0x60, 0xb9, 0x80, 0xc9, 0x1e, 0x80, + 0x8d, 0xeb, 0x1d, 0x58, 0xa7, 0x6f, 0x84, 0xc6, 0xad, 0xfe, 0x5c, 0x61, + 0x48, 0xa5, 0x6f, 0x3d, 0xd0, 0xd0, 0xec, 0x03, 0x93, 0x6e, 0x81, 0xb2, + 0x27, 0xb5, 0xcd, 0x48, 0xbe, 0x63, 0xe7, 0x94, 0xb4, 0x96, 0x93, 0x28, + 0x00, 0xd7, 0x62, 0x2a, 0xa1, 0xc6, 0x04, 0xbf, 0x18, 0x4b, 0x72, 0x23, + 0xe6, 0x5e, 0x6c, 0xa4, 0xb9, 0x6b, 0x44, 0x24, 0x0b, 0x1d, 0x01, 0xad, + 0xb6, 0xca, 0x43, 0xd9, 0x4a, 0x4b, 0xe4, 0x9e, 0x2b, 0x36, 0x96, 0x12, + 0x81, 0x69, 0x39, 0xea, 0x17, 0xd7, 0x3d, 0x9f, 0xbc, 0x71, 0xc1, 0xb4, + 0x2c, 0x0a, 0xcf, 0x72, 0xac, 0xdf, 0x12, 0x74, 0xc7, 0xef, 0xef, 0x65, + 0xc7, 0xa7, 0x77, 0x2c, 0x18, 0xc6, 0xc0, 0xad, 0xee, 0xde, 0xfc, 0x30, + 0x77, 0x6f, 0x4e, 0x86, 0x7f, 0x6d, 0xd9, 0x58, 0xa0, 0x68, 0x8d, 0xdd, + 0x7b, 0x97, 0x77, 0xc3, 0xb5, 0x7a, 0xd9, 0xee, 0xf5, 0x5b, 0x50, 0x71, + 0x68, 0xd6, 0x22, 0xe1, 0xb6, 0x7f, 0xf4, 0xe6, 0xae, 0xf0, 0x77, 0xff, + 0xe1, 0xb9, 0xc1, 0xb5, 0xec, 0xfa, 0x3d, 0xec, 0xf5, 0x80, 0x18, 0x03, + 0xad, 0x39, 0x0f, 0xfc, 0xde, 0x10, 0x57, 0x57, 0x14, 0xf0, 0xa4, 0x7d, + 0xac, 0x84, 0x40, 0x2d, 0xf4, 0xb8, 0x7d, 0x6e, 0x30, 0x87, 0xe7, 0x6b, + 0x78, 0xf1, 0x5c, 0xfc, 0xa8, 0x2d, 0xe3, 0x3a, 0x2e, 0x9e, 0xef, 0x01, + 0x05, 0x5c, 0x27, 0x8f, 0xe7, 0x37, 0x09, 0x51, 0x70, 0xea, 0x1a, 0x56, + 0xf7, 0x46, 0xf1, 0x64, 0x0d, 0x9c, 0x2f, 0xb2, 0x65, 0x2d, 0x1a, 0xa4, + 0xf5, 0x6e, 0x0e, 0x9d, 0xdc, 0xcd, 0xee, 0x87, 0x7e, 0x03, 0xd8, 0xad, + 0xed, 0xed, 0x26, 0x97, 0x2f, 0xe8, 0xb4, 0x85, 0xc0, 0x2c, 0xb3, 0x94, + 0xe6, 0x73, 0x05, 0xbe, 0x1a, 0xf3, 0xf6, 0xa4, 0x0a, 0xe3, 0x9e, 0xd3, + 0x2d, 0xc5, 0x6e, 0x4c, 0x8b, 0x56, 0xf7, 0xc6, 0x90, 0xb2, 0x86, 0x00, + 0x72, 0xf9, 0x42, 0xe0, 0x6e, 0x35, 0x1b, 0x2a, 0xdd, 0x81, 0x4c, 0x4b, + 0xa7, 0xf2, 0x15, 0xe6, 0xb7, 0xb7, 0x72, 0x83, 0x05, 0xcb, 0x46, 0x14, + 0xa8, 0x05, 0x77, 0xe3, 0x8a, 0x3c, 0xad, 0xb9, 0x16, 0x50, 0xc0, 0x15, + 0x79, 0x55, 0x1f, 0xd6, 0x33, 0x13, 0xbb, 0x7e, 0x23, 0x6d, 0x78, 0x31, + 0xba, 0x9f, 0x62, 0xcc, 0x5d, 0xb7, 0x96, 0xf5, 0xd8, 0xfa, 0x06, 0x2b, + 0x7c, 0x9d, 0x28, 0x70, 0xeb, 0x96, 0xa2, 0x82, 0x40, 0x15, 0x8b, 0xea, + 0xa7, 0x39, 0x50, 0xe7, 0xae, 0x25, 0x02, 0xab, 0xe2, 0xba, 0x4e, 0x2a, + 0x50, 0x95, 0x81, 0x69, 0x1d, 0xbd, 0x01, 0xbe, 0xb2, 0x2b, 0x1c, 0x25, + 0x9b, 0x99, 0x99, 0x51, 0x70, 0xf9, 0x19, 0x35, 0x62, 0x36, 0x33, 0x03, + 0x37, 0xdc, 0x00, 0xfc, 0x59, 0x68, 0x63, 0x88, 0x21, 0xbe, 0xb2, 0x6b, + 0x88, 0x1b, 0x6e, 0xd0, 0xdb, 0x8c, 0xed, 0xdf, 0x21, 0x84, 0x7d, 0xf5, + 0x0b, 0xfc, 0xb2, 0xc3, 0x1e, 0x01, 0x36, 0x41, 0xbd, 0x5e, 0xe7, 0xee, + 0xab, 0xe1, 0xce, 0xc7, 0x95, 0xf7, 0x2d, 0xb7, 0x40, 0x5d, 0xff, 0x15, + 0x81, 0xe2, 0x83, 0x70, 0xfc, 0xb8, 0xda, 0xf6, 0xe0, 0x83, 0x6a, 0xb9, + 0x61, 0x03, 0x40, 0x5d, 0x01, 0xb6, 0xb4, 0x16, 0x1a, 0x37, 0x5b, 0x68, + 0xfc, 0x55, 0x08, 0x81, 0xb8, 0xba, 0xbf, 0xf6, 0x2e, 0x49, 0xc1, 0xf8, + 0xef, 0x6b, 0x84, 0x66, 0xc5, 0x25, 0x44, 0x48, 0xb9, 0x8c, 0x3c, 0x13, + 0x5c, 0xd2, 0x7e, 0x12, 0xc2, 0x0a, 0x41, 0xa6, 0x8f, 0xeb, 0xf0, 0xd8, + 0x07, 0xb7, 0x33, 0xf6, 0xc1, 0xed, 0x89, 0xfb, 0x13, 0x42, 0x30, 0xfa, + 0x67, 0xf7, 0x07, 0x60, 0xad, 0xd0, 0x3f, 0xf9, 0x83, 0x13, 0x49, 0xeb, + 0xaf, 0x45, 0x91, 0xfa, 0xb5, 0x9e, 0x83, 0xb8, 0x79, 0x11, 0x40, 0x73, + 0x0c, 0xfc, 0xb8, 0xe3, 0xcb, 0xe0, 0x9e, 0x42, 0xe8, 0x67, 0x7c, 0x20, + 0xe9, 0x38, 0x92, 0xbb, 0x84, 0x20, 0x78, 0xda, 0xa3, 0x6f, 0xf7, 0xed, + 0xfb, 0x8f, 0xb2, 0x23, 0x28, 0x0a, 0x28, 0xea, 0x5b, 0x2d, 0xf3, 0x21, + 0xa1, 0x02, 0x2d, 0x0a, 0xb4, 0xa8, 0x62, 0xc6, 0x6a, 0xa2, 0x79, 0xbb, + 0x7b, 0x20, 0x13, 0xa4, 0x61, 0x5c, 0xdf, 0x93, 0xb8, 0x0e, 0x54, 0xa5, + 0xa4, 0x2a, 0x25, 0x2d, 0xfd, 0x43, 0xa7, 0x0f, 0x9d, 0xd6, 0x89, 0x33, + 0x76, 0x59, 0x76, 0xe7, 0xbb, 0xf9, 0x7c, 0x13, 0xb7, 0x50, 0x60, 0xf8, + 0xd2, 0x72, 0xd7, 0xb6, 0x46, 0xb3, 0x81, 0x04, 0x5c, 0x1f, 0x3c, 0x0b, + 0xa8, 0x58, 0x70, 0xc3, 0x6b, 0x58, 0x4e, 0xa8, 0xa7, 0x9d, 0x01, 0x38, + 0x4b, 0x84, 0xe0, 0x6e, 0x50, 0xa0, 0xad, 0x13, 0x8e, 0x8c, 0x82, 0xb5, + 0x24, 0x64, 0x50, 0x7d, 0xae, 0x29, 0x13, 0x36, 0x96, 0xb6, 0xbc, 0x0f, + 0x48, 0x95, 0xe7, 0xf8, 0xc7, 0x45, 0xb0, 0x60, 0x64, 0x2d, 0x9d, 0xdf, + 0x96, 0xde, 0xa3, 0x79, 0x06, 0x9a, 0x71, 0x04, 0x1d, 0x5f, 0xd2, 0xf0, + 0x65, 0x24, 0xfd, 0x40, 0xa4, 0x7e, 0xf9, 0xcb, 0xd0, 0xf9, 0xe6, 0xef, + 0x5f, 0xc0, 0xb3, 0x08, 0x2e, 0xf9, 0xe7, 0x55, 0x3c, 0x8b, 0xe0, 0x5d, + 0xc8, 0x60, 0x59, 0x15, 0x27, 0x28, 0xcb, 0x75, 0x5d, 0xfe, 0xaf, 0x65, + 0x09, 0x0a, 0x08, 0x35, 0x3a, 0x3a, 0x1a, 0x80, 0xa1, 0x8c, 0xe6, 0x1b, + 0x67, 0x23, 0x70, 0x2a, 0x03, 0x8c, 0x7a, 0xee, 0xb9, 0xe7, 0x58, 0x7b, + 0xc5, 0x95, 0x41, 0x5c, 0x13, 0x16, 0x08, 0x40, 0x53, 0x67, 0x5f, 0x9c, + 0x67, 0xed, 0x15, 0x57, 0x32, 0x3a, 0x3a, 0x1a, 0x00, 0xa6, 0x5e, 0x0f, + 0x9b, 0xa7, 0x4e, 0x9d, 0x0a, 0x00, 0x5d, 0x26, 0xae, 0x01, 0x84, 0xcd, + 0x37, 0xce, 0x46, 0xf2, 0x66, 0xc2, 0x40, 0x08, 0xf6, 0x9a, 0x6f, 0x9c, + 0x0d, 0x6c, 0x1a, 0xc8, 0xd7, 0x7c, 0xe3, 0x6c, 0xf0, 0x3b, 0xfb, 0xe2, + 0x3c, 0x6b, 0xd6, 0xac, 0x89, 0xc0, 0xbe, 0x9e, 0x7b, 0xee, 0xb9, 0xc0, + 0x5e, 0xbc, 0xbc, 0xec, 0x74, 0x24, 0xd5, 0xaf, 0x7d, 0x8e, 0xaf, 0xbf, + 0xb4, 0x4c, 0xad, 0x1e, 0xbd, 0xe3, 0x9a, 0x7a, 0xb2, 0x4a, 0x7d, 0xb6, + 0x19, 0xf4, 0x99, 0x65, 0x5b, 0x76, 0xf5, 0xcd, 0xa5, 0x9f, 0x21, 0x33, + 0x98, 0x8b, 0xb0, 0xaf, 0x0a, 0x06, 0x00, 0x2e, 0x3b, 0xe0, 0xa8, 0x9f, + 0x70, 0x3a, 0x94, 0x8a, 0x25, 0xc6, 0x36, 0x6c, 0x61, 0xdb, 0x4d, 0xdb, + 0xc9, 0x89, 0x0c, 0xb7, 0xfe, 0xf6, 0x27, 0xd9, 0xb8, 0x3e, 0x7a, 0x97, + 0x21, 0x9c, 0x0e, 0x99, 0xc1, 0x1c, 0x19, 0x37, 0xa7, 0x3f, 0x12, 0x96, + 0x8b, 0xec, 0xcb, 0x56, 0xab, 0x29, 0x81, 0x0c, 0x85, 0x7c, 0xf7, 0x87, + 0x9e, 0xa4, 0x0f, 0xb9, 0xbc, 0xa0, 0xd5, 0x90, 0x98, 0x0f, 0x09, 0xd8, + 0xe9, 0x9a, 0x9e, 0x9e, 0xa2, 0xd5, 0x6e, 0x50, 0xd3, 0xe3, 0x91, 0xea, + 0xfc, 0xe9, 0x58, 0xe3, 0xc2, 0xf1, 0x0f, 0x04, 0x64, 0x10, 0x0e, 0xe4, + 0x1c, 0x81, 0x14, 0x3a, 0x1d, 0xbe, 0x87, 0xf4, 0x33, 0xe4, 0xf2, 0x82, + 0xcc, 0x60, 0xc2, 0x87, 0xba, 0x74, 0xd7, 0x35, 0x67, 0x9a, 0xec, 0xb9, + 0x0e, 0x23, 0x97, 0x55, 0x18, 0x5e, 0x5d, 0x89, 0x7c, 0x2a, 0xad, 0x5a, + 0xab, 0x53, 0xb9, 0x7c, 0x3d, 0xf7, 0xfc, 0xc1, 0x3d, 0xac, 0x5f, 0xbf, + 0x9e, 0x9c, 0x0b, 0x39, 0xc7, 0x25, 0x97, 0x2f, 0x90, 0x19, 0xd4, 0xe7, + 0xbc, 0xf4, 0x40, 0x74, 0xc0, 0xf7, 0x74, 0x6a, 0x20, 0xef, 0xe7, 0x41, + 0x8f, 0xeb, 0xba, 0x08, 0xca, 0xe5, 0x12, 0x05, 0xfb, 0x5d, 0x05, 0x53, + 0xbf, 0x56, 0x9d, 0x4b, 0x37, 0x17, 0xf9, 0xd9, 0x7e, 0xc6, 0x6d, 0x2f, + 0xe3, 0x7e, 0xb6, 0x3f, 0x97, 0x16, 0x12, 0xc3, 0xc7, 0xe3, 0x25, 0xe9, + 0xbc, 0xdb, 0xb2, 0x40, 0x5c, 0x9e, 0x08, 0xdb, 0x47, 0xdb, 0x9d, 0x18, + 0xd7, 0x06, 0x66, 0x99, 0x72, 0xe9, 0x01, 0x08, 0xb3, 0xe3, 0x2c, 0x06, + 0x0b, 0x8b, 0x83, 0xb8, 0xe2, 0x7e, 0x03, 0x6f, 0x71, 0x79, 0xef, 0xe5, + 0xff, 0x8e, 0xa1, 0xb7, 0x8d, 0x31, 0xf4, 0xb6, 0x31, 0x96, 0x0d, 0x94, + 0x59, 0x35, 0x70, 0x4d, 0xe4, 0x77, 0xf1, 0x45, 0x2b, 0x58, 0x35, 0x70, + 0x0d, 0xff, 0x76, 0xf8, 0xa6, 0xc0, 0xcf, 0x76, 0x07, 0xb2, 0xea, 0x37, + 0x55, 0xaa, 0x54, 0xa9, 0x52, 0xa5, 0x4a, 0x95, 0x2a, 0x55, 0xaa, 0x54, + 0xa9, 0x52, 0xa5, 0x4a, 0x95, 0x2a, 0x55, 0xaa, 0x54, 0xa9, 0x52, 0xa5, + 0x4a, 0x95, 0x2a, 0x55, 0xaa, 0x54, 0xa9, 0x52, 0xf5, 0xaf, 0x25, 0xbe, + 0x42, 0x9c, 0x2a, 0x55, 0xaa, 0x54, 0xa9, 0x52, 0xa5, 0x3a, 0x6f, 0xd2, + 0x5f, 0x82, 0x95, 0x27, 0xfb, 0x03, 0x3d, 0x2d, 0xa4, 0xc6, 0xec, 0x39, + 0x40, 0x9f, 0xce, 0x71, 0x5f, 0xaf, 0xb7, 0x5e, 0x6b, 0x3a, 0xfa, 0x8d, + 0x6f, 0x26, 0x98, 0xf7, 0x13, 0xbe, 0xe0, 0x16, 0x68, 0xce, 0xf6, 0xf7, + 0x85, 0xe9, 0xa0, 0x3e, 0xb7, 0x02, 0xbf, 0xad, 0x9c, 0xeb, 0x36, 0xa8, + 0x37, 0x28, 0x9b, 0xb3, 0x1e, 0x62, 0x25, 0x84, 0x30, 0x2d, 0xa5, 0x0e, + 0xea, 0x2b, 0xca, 0x9e, 0x99, 0x1c, 0x27, 0x65, 0xe2, 0xdb, 0xdd, 0x91, + 0xb9, 0xe8, 0x00, 0x59, 0x89, 0x58, 0x26, 0x20, 0x0b, 0x8d, 0xef, 0xc0, + 0xc8, 0x17, 0x04, 0xfb, 0x57, 0x3d, 0xcc, 0xcd, 0x67, 0x6e, 0x54, 0x10, + 0xaa, 0x4c, 0x97, 0x09, 0x15, 0x57, 0x43, 0x67, 0xa4, 0x03, 0x7f, 0xfe, + 0xf1, 0x6d, 0xdc, 0x7e, 0xf0, 0x10, 0xf7, 0x03, 0x3b, 0x37, 0x6e, 0x84, + 0x8d, 0x70, 0xfb, 0x7d, 0x07, 0x68, 0xd0, 0x22, 0xe3, 0x64, 0x14, 0x0c, + 0x0b, 0x18, 0x59, 0x3d, 0x1c, 0x81, 0x6f, 0xa9, 0x72, 0x09, 0xd3, 0x68, + 0xdc, 0xb5, 0xb6, 0xc4, 0x4c, 0x95, 0x70, 0x7d, 0x11, 0xc0, 0xbb, 0x00, + 0x44, 0x56, 0xd9, 0x36, 0xef, 0x8e, 0x0a, 0xe1, 0x46, 0x21, 0x59, 0xcb, + 0x58, 0x30, 0x2f, 0xfd, 0x00, 0xb5, 0x4c, 0x5a, 0xdc, 0x7c, 0x8e, 0xaa, + 0x79, 0x21, 0x58, 0x97, 0x65, 0xb5, 0xd9, 0x5a, 0x74, 0x36, 0x93, 0x81, + 0xf2, 0xf4, 0x84, 0x69, 0x59, 0x6a, 0xce, 0xaa, 0x97, 0x59, 0xd7, 0x6d, + 0x70, 0xe1, 0x98, 0x7e, 0x5b, 0xd6, 0x3a, 0xaf, 0xab, 0x3e, 0x08, 0x91, + 0x07, 0x9a, 0xd4, 0x74, 0xdd, 0x8e, 0x66, 0x5d, 0x1a, 0x8e, 0x44, 0x06, + 0xf0, 0xaa, 0x26, 0x1e, 0x02, 0x37, 0x9b, 0x47, 0xb6, 0x9b, 0x94, 0x05, + 0x54, 0xc9, 0xe3, 0xb5, 0x9b, 0xb8, 0x8e, 0x44, 0xf8, 0x12, 0x10, 0x94, + 0x84, 0x88, 0x4c, 0x04, 0x75, 0xb3, 0xf9, 0x9e, 0x10, 0x28, 0x37, 0x5b, + 0x4a, 0x04, 0x5d, 0xb9, 0xd9, 0x52, 0xcc, 0xad, 0xc1, 0x5a, 0xbe, 0x60, + 0xd4, 0x15, 0x1c, 0xf2, 0x92, 0xe3, 0xf4, 0x82, 0x66, 0xd9, 0x61, 0x24, + 0xdd, 0x6d, 0x90, 0xd9, 0x9f, 0x89, 0x6f, 0x83, 0xb4, 0x0c, 0x30, 0xcb, + 0x2c, 0x93, 0xa0, 0x5a, 0xc6, 0x2f, 0x29, 0xec, 0xce, 0xdd, 0x3b, 0x23, + 0xd0, 0xad, 0x7e, 0x14, 0x2f, 0xb3, 0xc2, 0x60, 0x21, 0x98, 0x64, 0x61, + 0xde, 0x71, 0xee, 0x55, 0xa6, 0x91, 0xf3, 0xfa, 0x93, 0xca, 0x69, 0x9f, + 0xd7, 0x0c, 0xf5, 0x07, 0x36, 0xfc, 0x59, 0x2b, 0x7e, 0x0e, 0x2d, 0x76, + 0x4e, 0xf5, 0xda, 0xde, 0xcf, 0xb9, 0x18, 0x0f, 0x63, 0x03, 0xaf, 0xa4, + 0x94, 0xe7, 0x34, 0xe1, 0x47, 0x08, 0xd1, 0x3d, 0x71, 0x28, 0x1b, 0xae, + 0x47, 0xe0, 0x5e, 0xe7, 0x38, 0xe1, 0x2a, 0xe9, 0xbc, 0x2e, 0xbf, 0xf7, + 0x12, 0x00, 0xce, 0xcc, 0xb6, 0x83, 0x70, 0x66, 0x9a, 0xdc, 0xbf, 0x06, + 0x25, 0xa5, 0x75, 0xa6, 0x87, 0xdb, 0x0e, 0x3b, 0x43, 0x08, 0xc2, 0x32, + 0x7e, 0x47, 0xb4, 0x6b, 0x26, 0xe6, 0xdf, 0x4f, 0x59, 0x98, 0x30, 0xaf, + 0x47, 0xd9, 0x6d, 0xde, 0xbc, 0x19, 0x80, 0xff, 0xf3, 0xd3, 0x9f, 0x06, + 0x60, 0xb5, 0xde, 0xc7, 0xea, 0x99, 0x19, 0x4e, 0x0f, 0x25, 0xe3, 0xbc, + 0x4c, 0x7d, 0x96, 0xdf, 0x7b, 0x09, 0x8c, 0xeb, 0x7a, 0xd7, 0x5f, 0xf3, + 0x6e, 0x86, 0x55, 0x8d, 0xdc, 0xf9, 0x6e, 0xae, 0xbf, 0xe7, 0x19, 0xc6, + 0xff, 0xfd, 0xbb, 0x01, 0x05, 0xd7, 0x9a, 0xd0, 0xee, 0x61, 0x07, 0xa6, + 0x74, 0xfb, 0x9e, 0x04, 0xd6, 0xda, 0xe9, 0x87, 0x00, 0xad, 0x13, 0x7e, + 0x08, 0xca, 0xba, 0xd3, 0x8f, 0x82, 0xb2, 0x8c, 0x6c, 0x7f, 0xdb, 0x6d, + 0xc7, 0xfd, 0x9f, 0x51, 0xaf, 0x37, 0xba, 0xc8, 0xd4, 0xe7, 0xba, 0xb5, + 0xc0, 0xd3, 0xda, 0x9d, 0x57, 0x9d, 0xa4, 0xa6, 0x27, 0x99, 0x76, 0x5c, + 0xe4, 0x63, 0xd3, 0x94, 0xb6, 0x8e, 0x80, 0xf4, 0x10, 0xdf, 0x38, 0x1c, + 0x46, 0x7e, 0x7f, 0x9e, 0xa9, 0xbf, 0x3e, 0x4c, 0xbd, 0x58, 0xa2, 0xfc, + 0x9d, 0x03, 0x54, 0xbe, 0xb0, 0x57, 0xf9, 0x1f, 0xdc, 0x0f, 0x8f, 0xeb, + 0x2b, 0xf3, 0x4d, 0x0a, 0xdd, 0x35, 0x7d, 0x70, 0x1f, 0x8d, 0x4b, 0xb7, + 0xd0, 0x7c, 0xe8, 0x10, 0x1b, 0x7f, 0xef, 0x6e, 0x46, 0x2e, 0xad, 0x30, + 0x7e, 0xf3, 0xf5, 0xc1, 0x15, 0x52, 0x7c, 0x7c, 0x14, 0xf9, 0xd5, 0x7b, + 0x60, 0xb7, 0x0a, 0x9f, 0xff, 0x02, 0xe4, 0x81, 0x6d, 0xd7, 0xaa, 0xeb, + 0x49, 0x2e, 0x0b, 0x53, 0x8f, 0x7a, 0xec, 0x04, 0x3e, 0x72, 0x32, 0x84, + 0x18, 0xb9, 0x5f, 0x80, 0x0a, 0xb0, 0xfd, 0x77, 0x55, 0xb8, 0xea, 0x93, + 0x1e, 0x9d, 0x2f, 0x00, 0x4f, 0x6a, 0xc3, 0xdf, 0x1e, 0x27, 0x80, 0x63, + 0x19, 0xc0, 0x54, 0x5e, 0x02, 0xf7, 0xc0, 0x4c, 0x59, 0xed, 0xc4, 0xe8, + 0xd2, 0x29, 0x35, 0x87, 0xbc, 0xd6, 0x80, 0x21, 0x33, 0x59, 0xf0, 0x5e, + 0x10, 0x8b, 0x43, 0x63, 0x16, 0x52, 0xfe, 0xea, 0xdb, 0x68, 0x3e, 0xbe, + 0xaf, 0xbf, 0xc0, 0x77, 0xed, 0x87, 0xfd, 0x77, 0xc3, 0xda, 0xee, 0xc9, + 0x8a, 0x06, 0xb6, 0x15, 0xc8, 0x00, 0x71, 0x66, 0xaa, 0x56, 0x7a, 0x09, + 0xfd, 0x22, 0xf9, 0x50, 0xf5, 0x09, 0xba, 0x7e, 0x9b, 0x56, 0x7b, 0x0e, + 0x34, 0x9b, 0x4d, 0x44, 0x36, 0x1f, 0xc0, 0x99, 0x80, 0x88, 0xfb, 0xf5, + 0x90, 0xd7, 0x6e, 0xe2, 0x66, 0x7b, 0x97, 0xad, 0x7d, 0x2f, 0x62, 0x60, + 0x58, 0x23, 0x57, 0x1f, 0x63, 0xea, 0x7b, 0x9d, 0xae, 0x7b, 0x94, 0x78, + 0xd8, 0x85, 0xdc, 0xf6, 0x12, 0xf4, 0x7d, 0x0f, 0xc0, 0xac, 0x2a, 0x5f, + 0x39, 0x9b, 0x9c, 0x9e, 0x29, 0x6f, 0x52, 0x27, 0x1c, 0x84, 0x5b, 0xec, + 0xb6, 0x11, 0x73, 0x07, 0x69, 0x9c, 0x3d, 0xdc, 0x6d, 0x43, 0xdb, 0xe9, + 0x92, 0x15, 0x36, 0xe9, 0x4a, 0x6d, 0xa7, 0x01, 0xab, 0xec, 0x0c, 0x58, + 0x6b, 0xfa, 0x7b, 0xaa, 0x9f, 0xde, 0xd4, 0x20, 0x22, 0xfb, 0x7a, 0x3d, + 0x7a, 0x89, 0x3a, 0x16, 0xfe, 0xa9, 0x7d, 0xa6, 0xeb, 0x36, 0x48, 0xf5, + 0xa8, 0xa3, 0x32, 0x93, 0x81, 0x49, 0xd8, 0xb6, 0x50, 0x1a, 0xcf, 0x45, + 0x03, 0x5c, 0x60, 0x81, 0xb5, 0x20, 0x7b, 0xf1, 0x85, 0x0c, 0xcc, 0xbd, + 0xcc, 0x3c, 0xaf, 0x44, 0xa0, 0x5a, 0xbd, 0xd2, 0xda, 0xcf, 0xf6, 0x7e, + 0xf3, 0xf2, 0xc2, 0x4b, 0x92, 0x97, 0x2e, 0xba, 0x88, 0xe6, 0x4b, 0x2f, + 0x71, 0xdd, 0x65, 0xbf, 0xc2, 0x8f, 0x1b, 0x3f, 0xe4, 0x7f, 0xcc, 0xff, + 0x14, 0x20, 0x96, 0x92, 0xd7, 0xae, 0x73, 0xc9, 0x4b, 0xbc, 0x5e, 0xfe, + 0xa9, 0x7d, 0x06, 0x50, 0xf5, 0xfb, 0x80, 0x3e, 0xa6, 0xec, 0xeb, 0x75, + 0x65, 0x43, 0x8e, 0xe9, 0xe3, 0x1d, 0xca, 0xd7, 0x40, 0xa1, 0x50, 0x65, + 0xfc, 0xa1, 0x16, 0x87, 0xbe, 0x06, 0x5b, 0x3e, 0x56, 0xe2, 0x81, 0xaf, + 0x95, 0xb9, 0xf5, 0x63, 0x51, 0x9c, 0x4e, 0x65, 0x75, 0x1e, 0xaf, 0xed, + 0x01, 0x42, 0x81, 0x9c, 0x7e, 0xaa, 0xee, 0x53, 0xf3, 0x59, 0xc9, 0xf4, + 0xe9, 0x26, 0xa5, 0xc1, 0x62, 0x24, 0xbc, 0x2b, 0xa0, 0x5c, 0x49, 0x68, + 0xaf, 0x4c, 0x1a, 0x2d, 0x98, 0x96, 0x70, 0x64, 0xe2, 0x31, 0x53, 0x58, + 0x55, 0xa2, 0xe5, 0x49, 0x46, 0x2a, 0x65, 0x3a, 0xed, 0x16, 0x85, 0x41, + 0x41, 0xa7, 0xdd, 0x21, 0x93, 0xcd, 0xe1, 0xcd, 0x41, 0xce, 0x75, 0x19, + 0x9f, 0x9c, 0x66, 0x74, 0x7d, 0x85, 0xd1, 0xf5, 0x15, 0x6a, 0xb3, 0x92, + 0x8e, 0x04, 0x91, 0xcb, 0x91, 0xb3, 0xf9, 0x74, 0x06, 0x1e, 0xab, 0xfb, + 0xbf, 0x9e, 0x07, 0x8d, 0xa6, 0x47, 0x69, 0xa5, 0xa0, 0x5a, 0x97, 0x14, + 0xf4, 0xa4, 0x4e, 0x29, 0x3d, 0x6a, 0xc7, 0xef, 0x89, 0x00, 0xad, 0x0a, + 0x85, 0x30, 0x0f, 0xae, 0xab, 0xe2, 0x2e, 0x24, 0xaf, 0x2d, 0x99, 0x7a, + 0xa2, 0x46, 0xb9, 0xec, 0x22, 0xfd, 0x0c, 0x95, 0xa2, 0x02, 0x6a, 0x15, + 0xb2, 0x79, 0x2a, 0x15, 0x75, 0xef, 0x33, 0x76, 0x6d, 0x85, 0xea, 0xc9, + 0xd0, 0x90, 0x37, 0xdf, 0x20, 0x7a, 0xd1, 0xe9, 0x56, 0xb9, 0x5c, 0xa2, + 0xd1, 0x6c, 0x21, 0xcd, 0xbc, 0x66, 0x7d, 0x00, 0xb4, 0x3c, 0x0f, 0xec, + 0xeb, 0xb5, 0x9e, 0x0c, 0x6a, 0x9f, 0xd7, 0x6f, 0xb5, 0xec, 0xbc, 0x2d, + 0xfb, 0xa6, 0x85, 0x33, 0xf0, 0x06, 0xea, 0xe7, 0x25, 0x2d, 0xed, 0x9f, + 0xbe, 0xfa, 0x33, 0x4d, 0xcb, 0xbf, 0x03, 0x0c, 0x72, 0xe3, 0x9d, 0x96, + 0x7b, 0x0d, 0x70, 0x0a, 0xf8, 0x01, 0x61, 0x59, 0x25, 0x9d, 0xd7, 0x49, + 0xf7, 0x5c, 0x71, 0x35, 0x80, 0x8b, 0x81, 0xab, 0xae, 0x1a, 0xe8, 0xde, + 0xe8, 0xc0, 0x25, 0x03, 0xf0, 0xc3, 0x79, 0xcb, 0x4f, 0xc3, 0x1d, 0xca, + 0xc0, 0xab, 0xc0, 0xab, 0x03, 0x0a, 0x8e, 0x85, 0x76, 0xdb, 0xe3, 0x55, + 0x06, 0x56, 0xf5, 0x9b, 0x57, 0x25, 0xef, 0xfb, 0xd5, 0x01, 0x58, 0xbb, + 0x4e, 0xed, 0xf7, 0x94, 0x06, 0x6f, 0x5d, 0x7c, 0x15, 0xbc, 0xed, 0x19, + 0xf8, 0x3b, 0x19, 0x82, 0xb0, 0xd6, 0xeb, 0x56, 0xc0, 0xec, 0x6b, 0xe6, + 0xdf, 0x0c, 0xf0, 0xdf, 0xbf, 0x3b, 0xcf, 0x7a, 0x17, 0x46, 0x5d, 0x75, + 0xdb, 0x31, 0x96, 0x85, 0xda, 0x8c, 0xea, 0xfb, 0x4d, 0x02, 0xeb, 0xb3, + 0x80, 0x54, 0xb0, 0xab, 0x1a, 0xa6, 0x6d, 0x94, 0x01, 0x54, 0x0b, 0x42, + 0xe8, 0xd6, 0x68, 0x12, 0x6b, 0x54, 0xef, 0x73, 0x3d, 0x92, 0x49, 0x04, + 0x55, 0x9d, 0xe7, 0x9e, 0x72, 0x60, 0xda, 0x87, 0x52, 0x5b, 0xef, 0xbf, + 0x47, 0xb0, 0x73, 0x1d, 0x69, 0x96, 0x4e, 0x08, 0x79, 0x48, 0xbc, 0xe7, + 0x32, 0x7d, 0xb3, 0xba, 0xc7, 0xd8, 0x47, 0x8b, 0x1c, 0x7e, 0xcc, 0x0b, + 0x26, 0xeb, 0x8f, 0x5d, 0xa9, 0xb6, 0x1d, 0x7e, 0x22, 0x6c, 0x5b, 0xee, + 0x78, 0xe0, 0x5b, 0x4c, 0xdf, 0x77, 0x73, 0x97, 0xff, 0x96, 0x8d, 0xe1, + 0x38, 0xcc, 0xa1, 0x63, 0x8d, 0x9e, 0x7e, 0x38, 0xb0, 0xe5, 0x5a, 0xcb, + 0xff, 0xb1, 0x30, 0x67, 0x41, 0xf8, 0xc7, 0xd4, 0x62, 0x6a, 0x46, 0xd9, + 0x1f, 0x2e, 0xba, 0x4c, 0xd5, 0x3d, 0x1a, 0x7f, 0x90, 0x0c, 0xd4, 0x4a, + 0x82, 0x5a, 0xdd, 0xfc, 0xc9, 0xde, 0xf0, 0x29, 0xf9, 0xd5, 0x2a, 0xc3, + 0x1f, 0x2f, 0x33, 0xf9, 0x44, 0xc2, 0x46, 0x0b, 0xb0, 0xb5, 0x20, 0x2c, + 0xcb, 0x8c, 0xcd, 0x99, 0xb1, 0x3d, 0x7b, 0xac, 0xce, 0x1a, 0xef, 0xeb, + 0x0b, 0xa6, 0x15, 0xd3, 0xbd, 0xf7, 0xdd, 0xdd, 0x73, 0x9b, 0x81, 0x6b, + 0x2d, 0xa6, 0x66, 0xbd, 0x7b, 0x2c, 0x65, 0xcc, 0x55, 0x30, 0xe2, 0x46, + 0x6c, 0xac, 0xcd, 0x35, 0xf7, 0x1e, 0x4e, 0x0b, 0xa8, 0x81, 0xdf, 0x42, + 0x21, 0x94, 0x42, 0x79, 0xd2, 0xc3, 0x15, 0x2e, 0xaa, 0x7b, 0xbf, 0x4d, + 0xfb, 0x0a, 0xf0, 0xab, 0xc0, 0x34, 0xae, 0x33, 0xa6, 0x81, 0x4f, 0xe0, + 0x3a, 0xa6, 0x7e, 0x4d, 0xdd, 0xde, 0x0a, 0x54, 0xf1, 0x7c, 0x4f, 0xc1, + 0xa5, 0x98, 0xc0, 0xf3, 0x9b, 0xda, 0x7d, 0x48, 0x87, 0x29, 0x03, 0x2d, + 0xee, 0xda, 0x5a, 0x66, 0xf7, 0x43, 0x77, 0xe0, 0x66, 0x0f, 0x30, 0xd5, + 0x1c, 0xe7, 0xd0, 0x49, 0xb3, 0xed, 0x2e, 0x60, 0x37, 0x5b, 0xd6, 0xde, + 0x45, 0xa5, 0x32, 0xcc, 0xee, 0x83, 0x77, 0x61, 0xc0, 0x55, 0x9e, 0xd5, + 0xf7, 0xf6, 0x82, 0x7e, 0xb1, 0x01, 0xcb, 0x84, 0xfd, 0xd6, 0x2e, 0x00, + 0x4a, 0xa0, 0x02, 0xf1, 0x33, 0xcc, 0x00, 0xb0, 0x54, 0xff, 0xfa, 0x8f, + 0x22, 0xdb, 0x49, 0xa7, 0xfe, 0x0e, 0x00, 0x00, 0x20, 0x00, 0x49, 0x44, + 0x41, 0x54, 0xa4, 0x7f, 0x17, 0xc2, 0xb9, 0x9d, 0x56, 0x53, 0xc5, 0x11, + 0xa2, 0x64, 0x4a, 0x43, 0xb7, 0x13, 0xa6, 0xaf, 0xe3, 0xa1, 0x46, 0x38, + 0x37, 0x5a, 0xf9, 0xed, 0xa5, 0x86, 0x06, 0x91, 0x41, 0x14, 0xa8, 0x05, + 0xa0, 0xea, 0x3c, 0x37, 0x58, 0xa0, 0x36, 0x3b, 0x0d, 0x34, 0xf0, 0xa4, + 0x01, 0x6b, 0x1d, 0xa6, 0xd1, 0x56, 0x2d, 0xcc, 0x98, 0xbb, 0x8e, 0x7d, + 0x49, 0x6d, 0xb8, 0xd5, 0xff, 0x28, 0x5a, 0xcb, 0x22, 0x70, 0x3c, 0xe6, + 0x97, 0x24, 0xdb, 0xbf, 0x6e, 0x87, 0x2f, 0xc2, 0x83, 0xc7, 0x63, 0x81, + 0x37, 0x91, 0x0c, 0x9d, 0x3a, 0x62, 0x6d, 0x5f, 0x48, 0xbd, 0xe2, 0x2f, + 0xa0, 0x23, 0x3b, 0x60, 0xcf, 0x9e, 0xa8, 0xdf, 0x57, 0x76, 0x0d, 0x29, + 0x94, 0x96, 0x06, 0x69, 0x19, 0xcd, 0xcc, 0xc0, 0xde, 0xcf, 0xc0, 0x97, + 0xbe, 0x09, 0x9f, 0xf9, 0x00, 0xec, 0xf8, 0x12, 0x6c, 0xf9, 0x25, 0xd8, + 0x75, 0x04, 0x86, 0x76, 0x81, 0x09, 0xbd, 0xc9, 0x8c, 0x5b, 0xdd, 0x30, + 0x13, 0x40, 0xba, 0xae, 0x93, 0x0a, 0xb4, 0xb5, 0x30, 0xd6, 0x2f, 0x21, + 0x2f, 0x16, 0x58, 0xeb, 0x4e, 0xe0, 0xee, 0xab, 0xe1, 0x3b, 0xbf, 0x59, + 0x54, 0x14, 0xb2, 0x3a, 0x14, 0x35, 0x2d, 0xab, 0x5e, 0xac, 0xc3, 0xe7, + 0xe1, 0x96, 0x3a, 0x50, 0x84, 0xcf, 0xdf, 0x52, 0xe4, 0x78, 0x5d, 0xc3, + 0xb4, 0xb4, 0x5f, 0xbf, 0xe3, 0x66, 0x22, 0xeb, 0x46, 0x80, 0x6b, 0x46, + 0x72, 0x6d, 0x09, 0x1e, 0x9f, 0xee, 0xf2, 0x3f, 0x17, 0xf5, 0x1a, 0xe7, + 0x7d, 0xad, 0xc0, 0x2d, 0xe1, 0x08, 0xea, 0xed, 0x45, 0x3a, 0xc6, 0x3e, + 0x5d, 0x6f, 0x54, 0x25, 0xed, 0x56, 0x00, 0x8d, 0xb9, 0xee, 0xab, 0xa7, + 0x19, 0xcb, 0x16, 0xae, 0x20, 0x9f, 0xcd, 0x33, 0x35, 0xfd, 0x70, 0xe0, + 0x2f, 0x5c, 0x81, 0x9b, 0x75, 0xf1, 0xe6, 0xbc, 0x20, 0xdc, 0xf8, 0x6f, + 0xdd, 0xde, 0x2b, 0xb5, 0xc4, 0xef, 0x50, 0x93, 0x00, 0x5b, 0x76, 0x99, + 0xb8, 0x6e, 0x1e, 0xcf, 0x5b, 0xfc, 0xb9, 0x66, 0xd2, 0xb8, 0x99, 0xfd, + 0x9c, 0x6b, 0x5a, 0x37, 0xdb, 0xd2, 0xfc, 0x13, 0x20, 0x1d, 0xd1, 0x05, + 0xfb, 0x04, 0x05, 0xc2, 0xda, 0xed, 0xab, 0xce, 0x51, 0x0e, 0xf5, 0xec, + 0x33, 0x23, 0x14, 0xf4, 0xa9, 0x21, 0xc1, 0x75, 0x04, 0x9e, 0x94, 0xd4, + 0x10, 0xe4, 0x74, 0xd2, 0x32, 0xbe, 0xd0, 0x1f, 0xdf, 0x29, 0xe8, 0xbb, + 0x89, 0x06, 0x0d, 0x72, 0x91, 0xfc, 0x56, 0x6d, 0xd0, 0xb7, 0x23, 0x78, + 0xc0, 0xf3, 0x70, 0xb5, 0x5f, 0x0e, 0xf5, 0x1c, 0x52, 0xf8, 0x04, 0x60, + 0xa9, 0x8c, 0x23, 0x70, 0x81, 0xda, 0x22, 0xc7, 0x48, 0x46, 0xdb, 0x10, + 0x08, 0x36, 0xbe, 0x7f, 0x8c, 0x63, 0xc7, 0x8e, 0x29, 0x7f, 0x3a, 0x34, + 0x9a, 0x0d, 0xaa, 0x4f, 0x57, 0x71, 0x05, 0xd4, 0x64, 0x06, 0x49, 0x07, + 0xf4, 0x73, 0x5c, 0xaf, 0x1d, 0x05, 0xf0, 0xac, 0x73, 0x04, 0x2d, 0x14, + 0x38, 0xab, 0xe6, 0xe8, 0x3c, 0x4b, 0x19, 0xdc, 0xef, 0x64, 0x08, 0xb7, + 0xb7, 0x90, 0xe0, 0xa8, 0x74, 0xe3, 0xa8, 0xf0, 0x2d, 0x29, 0x23, 0x8f, + 0x85, 0x0b, 0x40, 0xd3, 0x81, 0x66, 0x3b, 0xbc, 0x21, 0x54, 0xcf, 0x54, + 0x40, 0x12, 0xc2, 0xc5, 0xa4, 0x8f, 0xaa, 0x07, 0x11, 0x42, 0xb4, 0x5a, + 0xc8, 0x20, 0x5f, 0x46, 0x75, 0x47, 0xe0, 0x22, 0x13, 0x9f, 0x73, 0xf1, + 0x61, 0xb5, 0x78, 0xe9, 0xe4, 0xbf, 0xf0, 0x2c, 0x17, 0xf7, 0x04, 0x60, + 0xf5, 0x02, 0x6a, 0x0d, 0xbd, 0xe7, 0x27, 0x3c, 0xfb, 0xfd, 0xb7, 0x9e, + 0x13, 0x58, 0xab, 0xfa, 0xe2, 0x3c, 0xcb, 0x39, 0xcb, 0xc9, 0x18, 0xc0, + 0x2a, 0x70, 0xa3, 0xfc, 0x6d, 0x20, 0xd5, 0x7c, 0x43, 0x85, 0x5f, 0xb3, + 0x66, 0x4d, 0x00, 0x9e, 0x02, 0xe0, 0xc5, 0x53, 0x91, 0x70, 0x27, 0xbf, + 0xf7, 0x44, 0x10, 0x37, 0x02, 0xc8, 0x3a, 0x8f, 0x36, 0x23, 0x69, 0xb5, + 0xf6, 0x63, 0xec, 0x18, 0x68, 0x97, 0x09, 0x03, 0x30, 0x3e, 0x3e, 0x1e, + 0x84, 0x39, 0x75, 0xea, 0x14, 0x03, 0xcf, 0x3d, 0x17, 0xc4, 0x33, 0xcb, + 0x81, 0xc2, 0xf2, 0x00, 0xd8, 0x65, 0xef, 0xc7, 0xf6, 0x37, 0x6e, 0x93, + 0x4e, 0xdb, 0xe6, 0x72, 0xce, 0xf2, 0x52, 0x73, 0x20, 0xac, 0x5f, 0xcd, + 0xdc, 0xb6, 0xdb, 0xf0, 0xc9, 0xa7, 0xab, 0xe4, 0x35, 0xdc, 0xba, 0xe9, + 0x79, 0x08, 0x29, 0x70, 0xad, 0x36, 0x65, 0xfd, 0xe5, 0xdd, 0xd0, 0xad, + 0xb1, 0x8f, 0x2a, 0x43, 0xad, 0xa6, 0x64, 0xcb, 0xb5, 0x1b, 0x03, 0xff, + 0xc8, 0x18, 0xa6, 0xaf, 0xc6, 0x40, 0x5c, 0x51, 0x20, 0xe3, 0x40, 0xc7, + 0x87, 0xdc, 0x20, 0x34, 0x9a, 0x6a, 0xac, 0xf3, 0xf0, 0xb1, 0x71, 0x4a, + 0x43, 0xc3, 0x11, 0x60, 0x96, 0x82, 0x65, 0x19, 0xb0, 0x55, 0xa6, 0x0b, + 0xa6, 0x65, 0xd6, 0x85, 0xd3, 0x41, 0xfa, 0x19, 0x1a, 0x73, 0xad, 0xe0, + 0x51, 0xbf, 0xbd, 0xad, 0x33, 0x07, 0x5b, 0xae, 0xdd, 0x48, 0x75, 0x36, + 0x1c, 0x07, 0x2a, 0x08, 0x97, 0x86, 0xec, 0x20, 0x34, 0x50, 0x59, 0x38, + 0x1d, 0x32, 0x7e, 0x06, 0x73, 0x66, 0x19, 0x9b, 0x71, 0x77, 0x20, 0x57, + 0x22, 0x67, 0x3a, 0xb8, 0x4e, 0x26, 0xe8, 0x57, 0x99, 0xf4, 0x02, 0x08, + 0xbf, 0x83, 0x24, 0xa3, 0x96, 0x4e, 0x86, 0xca, 0xa5, 0x15, 0x3a, 0x73, + 0x1d, 0x72, 0x83, 0x19, 0x3a, 0x73, 0x30, 0x35, 0xad, 0x9e, 0x63, 0x57, + 0x67, 0x1b, 0x41, 0x9a, 0xcb, 0xa5, 0x22, 0x07, 0xfe, 0xeb, 0x03, 0xac, + 0x5f, 0xbf, 0x9e, 0xc9, 0xc9, 0x49, 0x46, 0x3f, 0x38, 0x1a, 0xf4, 0xf3, + 0x32, 0x83, 0x19, 0x15, 0x56, 0xdf, 0x16, 0xb8, 0x83, 0x2e, 0x1d, 0x0d, + 0xe5, 0xbf, 0xf7, 0xaf, 0x0f, 0x00, 0x30, 0x7c, 0x59, 0x59, 0xc1, 0xa4, + 0x5b, 0x1e, 0xe5, 0xd5, 0x25, 0x9a, 0xdf, 0x53, 0x71, 0x83, 0xb1, 0x14, + 0x7d, 0x4e, 0x7f, 0xe7, 0xd9, 0x67, 0x11, 0xde, 0xbf, 0xa8, 0x72, 0x72, + 0x73, 0x08, 0xfd, 0x01, 0x04, 0xe1, 0xb5, 0x02, 0x68, 0x95, 0xb0, 0x3e, + 0x8a, 0x60, 0xfb, 0x99, 0xf0, 0x11, 0xb8, 0xd5, 0xd3, 0x8d, 0xae, 0x31, + 0x3c, 0x7b, 0x7b, 0x3c, 0x9e, 0xb1, 0xdd, 0xcb, 0x16, 0x09, 0x20, 0xaf, + 0x7e, 0x6d, 0x01, 0x70, 0xa9, 0xba, 0x07, 0x10, 0x4f, 0x37, 0xba, 0xc2, + 0x00, 0x7c, 0x76, 0xc3, 0xef, 0x03, 0xf0, 0xe5, 0x47, 0x3e, 0x17, 0x8d, + 0x17, 0xdb, 0x87, 0x6d, 0x8b, 0xa7, 0x1b, 0x0a, 0xf8, 0x35, 0x2b, 0x93, + 0xc3, 0x01, 0x62, 0xa5, 0x80, 0xd8, 0x3e, 0x7b, 0x96, 0xc5, 0x4a, 0xa1, + 0x6c, 0xbd, 0x02, 0x3f, 0x38, 0x7d, 0x86, 0x17, 0x5e, 0xae, 0x71, 0xc9, + 0x85, 0xaa, 0x2f, 0xff, 0xc2, 0xcb, 0x35, 0x5e, 0x7c, 0xe9, 0x39, 0x2e, + 0xbe, 0x68, 0x05, 0x00, 0x97, 0x5c, 0x58, 0xe2, 0x9d, 0xab, 0x57, 0xf1, + 0x83, 0xd3, 0x67, 0x38, 0x33, 0xff, 0x1d, 0x2e, 0xbe, 0x68, 0x05, 0xd3, + 0xcf, 0xa8, 0x30, 0x00, 0x27, 0x9f, 0xd5, 0x17, 0x5d, 0xeb, 0x9c, 0x4e, + 0x95, 0x2a, 0x55, 0xaa, 0x54, 0xa9, 0x52, 0xa5, 0x4a, 0x95, 0x2a, 0x55, + 0xaa, 0x54, 0xa9, 0x52, 0xa5, 0x4a, 0x95, 0x2a, 0x55, 0xaa, 0x54, 0xa9, + 0x52, 0xa5, 0x4a, 0x95, 0x2a, 0x55, 0xaa, 0x54, 0xfd, 0xeb, 0x7f, 0xe2, + 0x69, 0x99, 0xa9, 0x52, 0xa5, 0x4a, 0x95, 0x2a, 0xd5, 0xcf, 0xbf, 0x32, + 0x44, 0x41, 0x32, 0x91, 0x2f, 0x23, 0x2f, 0x01, 0x2e, 0x55, 0x58, 0x59, + 0xc0, 0x5b, 0x6c, 0x56, 0x64, 0x4c, 0xe7, 0xba, 0xaf, 0xf3, 0x25, 0xe9, + 0xcb, 0xf3, 0x37, 0x4b, 0xb9, 0xdf, 0xfd, 0x25, 0xb8, 0xfb, 0x51, 0xc3, + 0x5b, 0xda, 0x54, 0xb2, 0x78, 0xbd, 0x02, 0xf0, 0xe5, 0xee, 0x2f, 0xa7, + 0x9a, 0xd7, 0xae, 0x33, 0x40, 0xc3, 0x87, 0x9c, 0x03, 0xf9, 0x6c, 0x86, + 0x5a, 0x62, 0x55, 0x0a, 0x84, 0x94, 0x48, 0xfb, 0x45, 0xf9, 0x02, 0xea, + 0x2d, 0x6b, 0x07, 0x0a, 0xfa, 0x23, 0x95, 0x37, 0x9f, 0xb9, 0x11, 0xef, + 0x60, 0x0b, 0xe6, 0xac, 0x1d, 0x00, 0xe1, 0x94, 0xe5, 0x68, 0xde, 0x6f, + 0xbf, 0x4f, 0xbd, 0x84, 0x79, 0xfb, 0xc1, 0x43, 0x14, 0x80, 0xbb, 0x6e, + 0xda, 0xc2, 0xc4, 0xe9, 0x29, 0x4e, 0xfc, 0xf1, 0x1e, 0x6e, 0x3f, 0x78, + 0x28, 0x08, 0x57, 0x70, 0x05, 0xbb, 0x0f, 0x1e, 0xe2, 0x2e, 0x34, 0x7c, + 0x0b, 0xd8, 0x7d, 0xf0, 0x10, 0xc3, 0xe5, 0x61, 0x84, 0x0f, 0x9e, 0x23, + 0x39, 0x51, 0x3d, 0xc1, 0x70, 0x79, 0x98, 0xea, 0xc9, 0x86, 0x7a, 0xf9, + 0x3b, 0x0b, 0x25, 0xeb, 0x15, 0xcb, 0xfb, 0x6f, 0xda, 0x16, 0xec, 0x2b, + 0xc8, 0x95, 0x01, 0xe2, 0x38, 0x40, 0xb6, 0xdf, 0xbc, 0xf4, 0x90, 0x06, + 0x29, 0x44, 0x80, 0x5a, 0x71, 0x99, 0x97, 0xe8, 0x7b, 0x00, 0x7d, 0x16, + 0x84, 0x05, 0x25, 0xc1, 0xce, 0x12, 0xea, 0xd5, 0xae, 0x7f, 0x29, 0x9b, + 0x0a, 0x0a, 0x86, 0x9e, 0x58, 0x28, 0x65, 0x30, 0xd9, 0x20, 0x09, 0x8c, + 0x35, 0xd9, 0x96, 0x80, 0xf2, 0xf3, 0x7c, 0x11, 0xbc, 0xa4, 0x3b, 0xd9, + 0x06, 0x37, 0x1b, 0xc6, 0xe9, 0x05, 0x7f, 0x82, 0x10, 0x62, 0x65, 0x80, + 0x58, 0x66, 0x69, 0xdc, 0x26, 0x4c, 0xcd, 0x09, 0xa7, 0xb1, 0x4f, 0xe8, + 0x89, 0xe5, 0xbd, 0x6c, 0x25, 0xc9, 0xb6, 0xdb, 0x0f, 0x20, 0xe9, 0x8b, + 0x77, 0x7d, 0x11, 0x80, 0xca, 0xe5, 0x15, 0xa6, 0x9f, 0x9c, 0xc6, 0x1d, + 0x0c, 0x27, 0x0b, 0x4e, 0x3f, 0x3d, 0xcd, 0xf6, 0x4f, 0x6c, 0xe7, 0xde, + 0xfb, 0xee, 0x0d, 0xfc, 0x2a, 0x97, 0x56, 0x98, 0x7e, 0x3a, 0x9c, 0x78, + 0x23, 0xf5, 0x17, 0x78, 0x27, 0x8f, 0x5b, 0xb0, 0x86, 0x20, 0x2d, 0x79, + 0xe4, 0x02, 0x53, 0xc5, 0x54, 0x5e, 0x9a, 0x41, 0xd8, 0x85, 0xca, 0xaf, + 0x97, 0xfa, 0x3d, 0xaf, 0x7f, 0x9e, 0xb5, 0xd4, 0x89, 0x46, 0xe7, 0x32, + 0x31, 0xa9, 0xdf, 0x49, 0x4e, 0x52, 0x4a, 0x46, 0xaf, 0x1c, 0x61, 0xfc, + 0x89, 0xa5, 0xc1, 0xd1, 0x92, 0xec, 0xd8, 0xc7, 0xdf, 0x6b, 0x9d, 0x4c, + 0x05, 0x24, 0xd7, 0xeb, 0xbd, 0xab, 0x23, 0xab, 0x6f, 0x34, 0x50, 0x2b, + 0x09, 0x0b, 0xb5, 0x58, 0x1a, 0x0c, 0xbc, 0x6a, 0x29, 0x69, 0x5d, 0x08, + 0xbe, 0xd5, 0xcf, 0x3e, 0xcf, 0x65, 0x1f, 0xe7, 0x43, 0x8f, 0x3e, 0xfa, + 0xa8, 0x72, 0x0c, 0x0d, 0x31, 0xb4, 0x7a, 0x35, 0xaf, 0x02, 0x6f, 0x7a, + 0xf4, 0x51, 0x7e, 0x07, 0xd8, 0xb9, 0x50, 0xc4, 0x58, 0xbd, 0x02, 0x70, + 0x6d, 0xb4, 0xfe, 0xff, 0x66, 0xea, 0x19, 0xae, 0x3f, 0x16, 0xae, 0xbf, + 0x6f, 0xf8, 0xdd, 0x4c, 0x3c, 0xfb, 0x03, 0xc4, 0xbb, 0xde, 0xf9, 0x1a, + 0x53, 0x7d, 0x6e, 0xb2, 0x61, 0x5c, 0x36, 0x68, 0xeb, 0xee, 0x1e, 0xee, + 0x5e, 0x71, 0xe3, 0xf1, 0x7b, 0x41, 0xbb, 0xfa, 0xd9, 0x5f, 0x2f, 0x9b, + 0xc3, 0x3d, 0xdc, 0xf7, 0xf4, 0x70, 0xdb, 0xba, 0xd7, 0xf2, 0x7f, 0x9f, + 0xe5, 0xbe, 0xbe, 0x47, 0xf8, 0x7d, 0x96, 0xff, 0xfe, 0x98, 0x7b, 0x04, + 0xba, 0xea, 0x15, 0x80, 0xcb, 0xd6, 0x05, 0xce, 0xf2, 0xe6, 0x8a, 0xea, + 0x21, 0x3d, 0x74, 0x58, 0xf5, 0x49, 0xbc, 0x16, 0x6c, 0xdd, 0x42, 0xf5, + 0x6b, 0x5f, 0x66, 0x18, 0x97, 0xba, 0x68, 0x52, 0xf9, 0xdc, 0x5d, 0x2a, + 0xf0, 0xc1, 0xfd, 0xa1, 0x0d, 0x0b, 0xa8, 0x55, 0x01, 0xaa, 0x4f, 0x8f, + 0xb3, 0xe5, 0x63, 0x7a, 0x56, 0xc3, 0xd7, 0x42, 0xc8, 0x94, 0xf8, 0xd8, + 0x76, 0x26, 0xbf, 0x7a, 0x0f, 0x55, 0x5c, 0xc6, 0xb4, 0x5f, 0xa6, 0x00, + 0x77, 0x0d, 0x85, 0x40, 0x2d, 0x80, 0x7d, 0x9b, 0x5d, 0x76, 0x3c, 0xe9, + 0x05, 0x30, 0x11, 0x80, 0x4c, 0x0e, 0xf6, 0x5e, 0x1e, 0x5e, 0x33, 0x8d, + 0x7b, 0xf8, 0x49, 0x73, 0xdd, 0x33, 0xd7, 0xce, 0xed, 0x18, 0x60, 0x26, + 0xcd, 0x2d, 0x6a, 0x79, 0xe9, 0x7e, 0xf0, 0xd4, 0xa4, 0x46, 0x86, 0xc6, + 0x55, 0x37, 0xf0, 0xdb, 0x65, 0x78, 0xff, 0xa8, 0x86, 0x5a, 0x19, 0xe4, + 0x42, 0x6f, 0x08, 0x40, 0x3f, 0xea, 0x1b, 0xa8, 0x65, 0x34, 0x53, 0x83, + 0xa1, 0x52, 0xb4, 0x5f, 0xb5, 0x58, 0xfb, 0x3d, 0xa3, 0x27, 0x44, 0xd5, + 0xac, 0x3e, 0xde, 0xfb, 0x47, 0xa1, 0x58, 0x52, 0x30, 0xb1, 0xa2, 0xae, + 0x63, 0xab, 0x5e, 0x03, 0x59, 0xed, 0xba, 0x0d, 0xd1, 0x7a, 0xbd, 0x81, + 0x5a, 0xf6, 0xd2, 0x76, 0x0b, 0x6b, 0x72, 0x63, 0xdc, 0x3d, 0xf5, 0xbd, + 0x4e, 0x97, 0x7f, 0xaf, 0xb0, 0x0b, 0xb9, 0x93, 0xfc, 0x46, 0x5c, 0xd5, + 0x87, 0x17, 0x79, 0x0d, 0xde, 0x69, 0x86, 0x13, 0x7f, 0x26, 0xbc, 0x63, + 0x30, 0xa4, 0x8f, 0x1b, 0x47, 0x42, 0xf3, 0x44, 0xdf, 0xfb, 0x18, 0x76, + 0x15, 0x8e, 0x63, 0xca, 0x9b, 0x84, 0x95, 0x63, 0x61, 0xb8, 0xac, 0x3a, + 0x56, 0xa5, 0x99, 0xa4, 0x3c, 0x7b, 0x38, 0x08, 0x0b, 0x20, 0xf4, 0x64, + 0x23, 0xa9, 0x27, 0x20, 0x45, 0xe2, 0x67, 0x81, 0xd9, 0xa9, 0x58, 0xfe, + 0x89, 0x2a, 0xe1, 0x7a, 0xfd, 0xdf, 0x12, 0x9a, 0x75, 0xe8, 0x0d, 0x76, + 0xea, 0xbe, 0x3b, 0x7a, 0x7d, 0xf4, 0xab, 0xd7, 0xbd, 0x17, 0x80, 0x7f, + 0x38, 0xfa, 0xb7, 0x70, 0xea, 0x4c, 0xe0, 0xff, 0x6b, 0xd7, 0xa9, 0x3a, + 0x99, 0x3a, 0x7a, 0x34, 0x31, 0x5e, 0x2f, 0xe8, 0x54, 0x92, 0xfa, 0xcd, + 0xcb, 0xbf, 0xbc, 0xd8, 0xe6, 0x02, 0xe0, 0x5f, 0x2e, 0x70, 0xe0, 0x1d, + 0x25, 0x9e, 0x3d, 0xf1, 0x8f, 0x5c, 0xf8, 0x4a, 0xc2, 0x6c, 0xe8, 0xf3, + 0xac, 0xd7, 0x92, 0x97, 0xc4, 0x7a, 0xd5, 0xed, 0xfa, 0xc8, 0xd6, 0x31, + 0xbc, 0xf6, 0xc3, 0x8c, 0x7d, 0xec, 0x4e, 0xaa, 0xc7, 0x6b, 0xc8, 0xff, + 0xa3, 0xc5, 0x96, 0xb9, 0x02, 0x0f, 0xfc, 0x51, 0x83, 0xfb, 0xff, 0x4b, + 0x8e, 0xf1, 0x99, 0xd1, 0x30, 0xce, 0x2c, 0x8c, 0x6d, 0x02, 0x2f, 0x23, + 0x38, 0x71, 0x6c, 0x9c, 0x6a, 0xd5, 0x23, 0xb3, 0x4c, 0x1f, 0xa7, 0xd1, + 0xb9, 0x75, 0x88, 0x01, 0x90, 0x7e, 0x09, 0xaf, 0x55, 0xa3, 0x54, 0xec, + 0xdd, 0xe7, 0x37, 0x10, 0x0d, 0x50, 0x50, 0x2d, 0xd7, 0x02, 0xbe, 0x4e, + 0x6b, 0xc0, 0x48, 0x69, 0x50, 0x50, 0x3b, 0xdd, 0xc2, 0x7b, 0xbe, 0x83, + 0xc8, 0x65, 0xc8, 0x64, 0x41, 0xfa, 0x39, 0x32, 0xc0, 0x1d, 0xbf, 0xbb, + 0x2d, 0x08, 0x7f, 0x40, 0xdf, 0xe6, 0x14, 0xfc, 0x0c, 0xdb, 0xb6, 0x76, + 0xc8, 0xb9, 0x39, 0x76, 0x7c, 0xfa, 0x6e, 0x44, 0x56, 0xd0, 0x92, 0x4d, + 0xd4, 0x00, 0x40, 0xa8, 0x46, 0xd3, 0x43, 0x08, 0x05, 0xc0, 0x02, 0x68, + 0x79, 0xd1, 0x66, 0x55, 0x58, 0x69, 0x93, 0xad, 0x16, 0xb2, 0x6d, 0xa7, + 0x35, 0x0a, 0xa7, 0x05, 0x75, 0x2f, 0x2c, 0x7d, 0x11, 0x80, 0xba, 0x86, + 0xaf, 0x2c, 0xd1, 0xf2, 0xa0, 0xb4, 0x52, 0xb7, 0x21, 0x95, 0x32, 0xb5, + 0xd3, 0xb1, 0x82, 0x0a, 0xe2, 0x26, 0x97, 0x8f, 0xd7, 0xf2, 0x02, 0x1a, + 0x86, 0xd7, 0xf2, 0x28, 0x15, 0x55, 0x99, 0xba, 0x39, 0x37, 0xf9, 0x80, + 0x4d, 0xb8, 0x5e, 0xc7, 0xeb, 0x7f, 0xbe, 0xfd, 0x6a, 0xf2, 0xce, 0x80, + 0xb7, 0x01, 0x23, 0xbf, 0xf1, 0x26, 0xfe, 0xf0, 0xaf, 0x54, 0x98, 0xc7, + 0x80, 0x69, 0x08, 0xc0, 0xdf, 0xd3, 0x40, 0xe3, 0x37, 0xde, 0xc4, 0x8b, + 0x7f, 0xf5, 0x2a, 0xc3, 0xc0, 0x8f, 0x88, 0x62, 0x4d, 0xea, 0x3d, 0x2d, + 0x27, 0x6b, 0xa1, 0xb4, 0xf4, 0xab, 0x81, 0xf3, 0x04, 0xc2, 0x3a, 0x1f, + 0x69, 0x81, 0x73, 0x4b, 0xcf, 0xbf, 0x45, 0x43, 0xb3, 0x12, 0xb6, 0x4d, + 0x68, 0xff, 0xa7, 0x01, 0x4c, 0x1a, 0x9d, 0x1e, 0xe7, 0x75, 0x52, 0xdf, + 0xdc, 0x52, 0xfc, 0x8e, 0xff, 0x92, 0x01, 0x14, 0x2d, 0xcb, 0x87, 0x8e, + 0xbe, 0x46, 0xd4, 0x80, 0x5b, 0xf4, 0xc1, 0xf5, 0x17, 0x3a, 0xdc, 0x88, + 0x03, 0x7f, 0xa7, 0xdd, 0xaf, 0x0e, 0xc0, 0x0b, 0xf3, 0x70, 0x09, 0xd0, + 0xb0, 0x8e, 0xdb, 0x7d, 0x9e, 0xe0, 0x96, 0x05, 0xf7, 0x1e, 0x6a, 0xcd, + 0x55, 0x03, 0x0c, 0x7d, 0x77, 0x9e, 0x6f, 0x01, 0xa3, 0xc0, 0x2f, 0xba, + 0x20, 0xe7, 0x15, 0xdc, 0xea, 0xd5, 0x04, 0xde, 0x17, 0x2e, 0x20, 0xe0, + 0x95, 0x5f, 0x1e, 0x80, 0xef, 0xaa, 0xc9, 0xf4, 0x85, 0x2c, 0xb4, 0x74, + 0x9a, 0x33, 0x09, 0xe7, 0xc2, 0x6f, 0x5e, 0x05, 0x0f, 0x7e, 0x37, 0xcc, + 0x93, 0x92, 0x40, 0x20, 0x99, 0x74, 0x54, 0x0f, 0xce, 0xb4, 0x95, 0x35, + 0x04, 0x25, 0x0d, 0xd4, 0x02, 0xb8, 0xcd, 0x81, 0x89, 0x84, 0x66, 0xdd, + 0x60, 0x7c, 0x0a, 0x02, 0xca, 0x3e, 0x54, 0x35, 0xc8, 0x2b, 0xae, 0xeb, + 0x1d, 0xf8, 0xd6, 0x22, 0x97, 0x85, 0xeb, 0x1d, 0xd8, 0x1f, 0x0b, 0xe3, + 0x01, 0xf8, 0x6a, 0xec, 0xea, 0x1d, 0x6f, 0xd1, 0x9e, 0x1d, 0x92, 0xeb, + 0x55, 0x5f, 0xc3, 0x33, 0x3e, 0x01, 0x50, 0xab, 0x97, 0xa6, 0xef, 0xbb, + 0x19, 0xf7, 0x03, 0xfb, 0xf1, 0xbe, 0x79, 0xf3, 0xc2, 0x01, 0xe3, 0x7a, + 0x2d, 0xfd, 0x3c, 0x07, 0xf6, 0xfe, 0xe5, 0xdf, 0xb3, 0xeb, 0x3f, 0xec, + 0x5a, 0x30, 0xd8, 0x9e, 0xff, 0x70, 0x37, 0xbb, 0xfe, 0xd3, 0x9d, 0xc1, + 0x32, 0xa2, 0x76, 0x2d, 0x80, 0x5d, 0x89, 0x8f, 0x97, 0x99, 0x3a, 0x9d, + 0x6c, 0xa3, 0xe5, 0xbb, 0x16, 0x30, 0xcb, 0x0d, 0xe3, 0xf6, 0x52, 0xd2, + 0xb6, 0x73, 0x00, 0x69, 0x2d, 0xa4, 0xed, 0x9f, 0xb8, 0x93, 0x7b, 0xef, + 0xbb, 0x3b, 0x58, 0xf6, 0xad, 0x84, 0xbe, 0xd9, 0x78, 0x50, 0xfd, 0x45, + 0xbd, 0xac, 0xe3, 0xc9, 0x26, 0xe5, 0x62, 0x89, 0xe6, 0x2c, 0x89, 0x40, + 0x2d, 0x40, 0x03, 0xb5, 0x3c, 0x02, 0xa0, 0x96, 0x53, 0xd5, 0xd0, 0x1e, + 0x03, 0xb6, 0x6a, 0xe0, 0xb5, 0x1b, 0xb8, 0x4e, 0x01, 0xcf, 0x6f, 0x50, + 0x1a, 0xac, 0x50, 0x6f, 0x83, 0x01, 0x6a, 0x81, 0x87, 0xeb, 0x54, 0x02, + 0x58, 0x95, 0xeb, 0xe4, 0xb5, 0xdb, 0xdc, 0xff, 0x54, 0x31, 0x20, 0xc8, + 0xbb, 0xb6, 0x0e, 0xb3, 0xfb, 0x1b, 0x5f, 0xa4, 0x34, 0x54, 0xc1, 0xf3, + 0x0f, 0xe0, 0xb5, 0xef, 0x0a, 0xd2, 0x21, 0x10, 0xec, 0x3e, 0x78, 0x3d, + 0xb0, 0x11, 0x73, 0x1d, 0x16, 0x88, 0x00, 0x9c, 0xe5, 0x3a, 0x42, 0x2d, + 0xcd, 0x25, 0xd5, 0x0f, 0x86, 0xa7, 0x15, 0xec, 0xc5, 0x87, 0x66, 0x62, + 0x8f, 0x27, 0xea, 0xa7, 0x00, 0x58, 0xb7, 0x02, 0x9f, 0xd3, 0xbf, 0x38, + 0x58, 0xeb, 0x7e, 0x9a, 0xed, 0xdd, 0x08, 0x51, 0x42, 0xca, 0x1a, 0xb9, + 0xa1, 0x0a, 0xde, 0x6c, 0x09, 0xd9, 0xae, 0x5a, 0xb6, 0x42, 0xb8, 0x96, + 0xeb, 0x6c, 0xb4, 0xf2, 0x5b, 0xb5, 0x96, 0xa1, 0x72, 0xf9, 0x02, 0xf5, + 0x93, 0xa3, 0xdc, 0xb1, 0xb5, 0xc2, 0x17, 0x1f, 0x52, 0x1f, 0xd0, 0xb8, + 0xe3, 0x86, 0x87, 0xf9, 0xe2, 0x23, 0x2a, 0x5c, 0xcb, 0x82, 0x03, 0x29, + 0xa0, 0x56, 0x78, 0x5f, 0x33, 0xbe, 0x48, 0x1b, 0xbe, 0x01, 0x05, 0xd0, + 0xb2, 0x55, 0x4f, 0x88, 0x62, 0xfc, 0x8a, 0xd6, 0x7a, 0xd1, 0xda, 0x5e, + 0xb4, 0xc2, 0x3c, 0xf8, 0xa0, 0x72, 0xdf, 0xb2, 0x41, 0xad, 0xdf, 0xf9, + 0x19, 0xbd, 0x21, 0x09, 0x8c, 0xb5, 0x18, 0x4c, 0xcb, 0xe8, 0x48, 0x8f, + 0xf8, 0xbd, 0x82, 0x5b, 0x40, 0xad, 0xa3, 0x42, 0x81, 0xaf, 0xbe, 0xb2, + 0xcb, 0x1a, 0xb1, 0x1b, 0x82, 0xbd, 0x1f, 0x50, 0xce, 0x1d, 0x5f, 0x52, + 0xcb, 0x2f, 0x7d, 0x53, 0xc5, 0xf9, 0xd2, 0x37, 0xd5, 0xfa, 0xec, 0x71, + 0x98, 0xf9, 0x92, 0xf2, 0xdb, 0xb5, 0x0b, 0x86, 0x12, 0x46, 0xfc, 0x8c, + 0xed, 0x47, 0x1e, 0x81, 0x1d, 0x37, 0xf4, 0x99, 0x17, 0x08, 0xf3, 0x1d, + 0xcb, 0xcf, 0xe7, 0xa9, 0x73, 0xf4, 0x71, 0xf8, 0xf3, 0xdf, 0x84, 0xba, + 0x29, 0xd1, 0x7a, 0x11, 0x8a, 0x6a, 0xbd, 0x88, 0xe5, 0xaf, 0xf5, 0x91, + 0xbf, 0x80, 0xff, 0x0b, 0x16, 0x1c, 0x37, 0x13, 0xe6, 0xf9, 0x4b, 0x1c, + 0x08, 0x6d, 0x3a, 0xa4, 0x33, 0x0d, 0x88, 0x41, 0x9e, 0x96, 0xa2, 0x38, + 0x20, 0x2a, 0xd0, 0xe5, 0x65, 0xc4, 0xc9, 0xda, 0x6b, 0x1b, 0x03, 0xb6, + 0x6f, 0x4e, 0xda, 0xb2, 0xfb, 0x9a, 0xe1, 0x4b, 0x48, 0xb8, 0x27, 0x0f, + 0xa2, 0xcb, 0xde, 0xcf, 0x21, 0xba, 0x9e, 0x93, 0x58, 0xab, 0x9e, 0xbe, + 0x37, 0x96, 0x9e, 0x24, 0xbf, 0x32, 0x1f, 0xac, 0x03, 0x14, 0x0e, 0xdd, + 0x4f, 0x63, 0x4b, 0x2f, 0xa0, 0x56, 0xff, 0xfb, 0x30, 0xea, 0x17, 0xa8, + 0x15, 0x28, 0xa1, 0x1f, 0x6e, 0x9e, 0x87, 0x08, 0x47, 0xdd, 0x27, 0xe4, + 0xf4, 0xbe, 0xec, 0x3b, 0x02, 0x03, 0xce, 0x32, 0xed, 0x22, 0xa8, 0xed, + 0x42, 0x97, 0xa1, 0xc1, 0xd3, 0x98, 0xfb, 0xa6, 0x69, 0xbf, 0x3b, 0xc1, + 0x1d, 0x6d, 0x1f, 0x47, 0xea, 0x7e, 0x4f, 0x4e, 0x3d, 0x8a, 0xb3, 0xea, + 0x25, 0x9f, 0x15, 0x8c, 0xb7, 0xd4, 0x9e, 0x9b, 0xfa, 0xd9, 0x72, 0x43, + 0x48, 0x1a, 0x3e, 0x94, 0x1d, 0x41, 0xd5, 0x97, 0x08, 0x04, 0x39, 0x0d, + 0xaf, 0x02, 0x68, 0xf8, 0x21, 0x5c, 0x4a, 0x68, 0xf0, 0x94, 0xf4, 0x15, + 0xe0, 0x0b, 0xe0, 0xc6, 0x8f, 0xde, 0x46, 0x7e, 0x59, 0x9e, 0xe6, 0xf3, + 0x61, 0x39, 0x6d, 0xdc, 0xb8, 0x31, 0x00, 0x6b, 0x19, 0x8d, 0xdd, 0x74, + 0x2b, 0xa3, 0xd7, 0x8e, 0x72, 0xfb, 0xad, 0x37, 0xd2, 0x90, 0x10, 0xa2, + 0x94, 0xd5, 0xb2, 0x23, 0x25, 0x53, 0x40, 0x4e, 0xa8, 0xe7, 0x79, 0x1d, + 0x19, 0x86, 0x30, 0x39, 0x75, 0x7d, 0x49, 0x4d, 0x3f, 0x03, 0x6e, 0x38, + 0x50, 0xf0, 0x61, 0xca, 0x97, 0x0c, 0x3b, 0x82, 0x0e, 0x92, 0x9c, 0x55, + 0xa7, 0x1d, 0xfd, 0x09, 0x9b, 0x4c, 0x60, 0x43, 0x90, 0x84, 0x6f, 0xb6, + 0x81, 0xf1, 0xf8, 0x32, 0xf2, 0x08, 0xb5, 0xe3, 0x47, 0xc1, 0x5a, 0x0a, + 0xb6, 0xa5, 0x94, 0xf4, 0x9c, 0xcb, 0x4d, 0x7a, 0xf6, 0x95, 0xa0, 0x77, + 0xbc, 0xfd, 0x34, 0xfc, 0xf3, 0xaa, 0x88, 0xdf, 0x9b, 0xbf, 0x7f, 0xee, + 0x78, 0xee, 0x0b, 0xe4, 0x30, 0x67, 0x99, 0x62, 0xf9, 0xc5, 0x03, 0x11, + 0xa0, 0x16, 0x84, 0x60, 0xaa, 0x81, 0xc2, 0x72, 0x80, 0x00, 0x76, 0x65, + 0xfc, 0xe3, 0xe1, 0xfa, 0xd1, 0xf9, 0xb6, 0x69, 0xe2, 0x2e, 0x27, 0xb4, + 0xb3, 0xa6, 0x00, 0xa7, 0x4e, 0x9d, 0x62, 0xcd, 0x9a, 0x35, 0xf0, 0xe2, + 0x29, 0x56, 0xac, 0x58, 0xc1, 0x73, 0xcf, 0x3d, 0xa7, 0xd6, 0xad, 0x7d, + 0x1a, 0x58, 0x96, 0x9d, 0x06, 0xb3, 0x1d, 0x88, 0x80, 0xb4, 0x4c, 0x18, + 0x03, 0x04, 0x33, 0xe9, 0x37, 0x71, 0x40, 0xed, 0xd3, 0xd8, 0x3c, 0xfb, + 0xe2, 0x3c, 0x5c, 0x32, 0x90, 0x5c, 0xaf, 0x49, 0x63, 0xe4, 0xe8, 0xe7, + 0x6a, 0x42, 0x50, 0x5c, 0x19, 0x03, 0x65, 0xfb, 0x30, 0xf9, 0x64, 0x95, + 0xb1, 0xeb, 0x36, 0x76, 0xc5, 0x39, 0xf4, 0xd8, 0xb1, 0x2e, 0xbf, 0x91, + 0x2b, 0x47, 0x23, 0xeb, 0xc2, 0x91, 0x60, 0xce, 0xff, 0xc7, 0x6a, 0x8c, + 0x5e, 0x33, 0x46, 0xad, 0x69, 0xc6, 0x47, 0xa3, 0x10, 0xab, 0xcc, 0x60, + 0x0e, 0x69, 0x01, 0xb6, 0xec, 0x6d, 0x89, 0xc0, 0x2b, 0x3b, 0xfd, 0x7e, + 0x08, 0x9b, 0xab, 0xd6, 0x94, 0xfd, 0x42, 0x56, 0xd0, 0xd0, 0xed, 0xb5, + 0x1d, 0x57, 0xc6, 0xe3, 0x38, 0x1d, 0x32, 0x83, 0x39, 0x5a, 0x4d, 0x49, + 0x2e, 0x2f, 0x22, 0xd0, 0x2c, 0x23, 0xcf, 0xef, 0x80, 0x1f, 0xb6, 0xd9, + 0xc2, 0xef, 0x74, 0xb9, 0x85, 0xdf, 0x61, 0xfa, 0xe9, 0xe9, 0x00, 0xac, + 0xb5, 0x90, 0x1e, 0xfe, 0xc6, 0xc3, 0xec, 0xf9, 0xcf, 0x7b, 0x82, 0xa5, + 0xca, 0x7f, 0x06, 0x31, 0x20, 0x28, 0x5d, 0x9a, 0xa3, 0x35, 0xab, 0x01, + 0x51, 0x6d, 0x49, 0xae, 0x94, 0xe3, 0xde, 0x3f, 0xde, 0xc7, 0xc8, 0xb5, + 0x6a, 0x64, 0x43, 0x7a, 0x12, 0xe9, 0x40, 0x61, 0x99, 0x1b, 0xb6, 0x0c, + 0xb1, 0x7a, 0x35, 0x75, 0x1f, 0x80, 0xb2, 0x56, 0x0a, 0x24, 0x51, 0x70, + 0x55, 0x1c, 0x64, 0x15, 0xe8, 0xd2, 0x82, 0x6a, 0xbb, 0x56, 0x16, 0x60, + 0x56, 0x76, 0x03, 0xaf, 0x56, 0x8a, 0x44, 0x7f, 0xb3, 0x1e, 0x5f, 0x1a, + 0x9b, 0x76, 0x9c, 0x38, 0x00, 0x2b, 0xae, 0xff, 0x8f, 0xbd, 0xf7, 0x8f, + 0x93, 0xa3, 0xaa, 0xf3, 0xbd, 0xdf, 0x40, 0x01, 0xa7, 0xb5, 0x43, 0xaa, + 0xdd, 0x89, 0x74, 0x85, 0x8c, 0x4e, 0xb1, 0x03, 0x4e, 0x8f, 0x61, 0xa1, + 0x47, 0x79, 0x70, 0x66, 0xe1, 0x91, 0x0c, 0xb0, 0x1b, 0x06, 0xdd, 0x97, + 0x06, 0xdd, 0xd7, 0x92, 0xc4, 0xbd, 0x08, 0xb8, 0xf7, 0x4a, 0xa2, 0xab, + 0x26, 0xae, 0x2f, 0x97, 0xb0, 0x3f, 0x1e, 0x40, 0x5f, 0x57, 0x82, 0xbb, + 0xab, 0x09, 0xee, 0xae, 0x04, 0xb9, 0x2b, 0x09, 0xbe, 0x1e, 0x60, 0xf4, + 0xb5, 0xe8, 0x90, 0x2b, 0x30, 0xc9, 0xbd, 0xb0, 0x19, 0x7c, 0xd0, 0xe9, + 0xb0, 0x84, 0xe9, 0x81, 0xb4, 0xe9, 0xc1, 0x0c, 0x54, 0x4b, 0x5a, 0xbb, + 0x20, 0x2d, 0x7d, 0x80, 0x86, 0x3c, 0x7f, 0x9c, 0x53, 0x3f, 0xba, 0xba, + 0x7b, 0xa6, 0x87, 0x00, 0xe2, 0xf3, 0xd4, 0x27, 0xaf, 0x49, 0x55, 0x9d, + 0xdf, 0xe7, 0x54, 0x57, 0xd5, 0x39, 0xa7, 0xce, 0xf7, 0x5d, 0xf3, 0xa5, + 0x25, 0x67, 0x25, 0x78, 0xe0, 0xab, 0x56, 0x61, 0x80, 0xaf, 0xef, 0xfe, + 0x8a, 0x0f, 0xd6, 0x6a, 0x82, 0x7a, 0x85, 0xea, 0x22, 0x49, 0x35, 0xa6, + 0x35, 0xdb, 0x78, 0xfe, 0x9b, 0x60, 0x59, 0xa4, 0x1a, 0xf2, 0x8c, 0x42, + 0xca, 0xa4, 0x99, 0x0a, 0xe2, 0x44, 0xe0, 0x61, 0x8b, 0x4f, 0xb0, 0x7d, + 0xb0, 0xd6, 0x73, 0x2f, 0x15, 0x39, 0xe9, 0xc4, 0x53, 0x7c, 0x68, 0x16, + 0xc0, 0x81, 0xfd, 0x34, 0xb8, 0x77, 0x2f, 0x3a, 0xd7, 0x87, 0x70, 0x4d, + 0xb3, 0xbb, 0xe3, 0x7b, 0x75, 0xac, 0x58, 0xb1, 0x62, 0xc5, 0x8a, 0x15, + 0x2b, 0x56, 0xac, 0x58, 0xb1, 0x62, 0xc5, 0x8a, 0x15, 0x2b, 0x56, 0xac, + 0x58, 0xb1, 0x62, 0xc5, 0x8a, 0x15, 0x2b, 0x56, 0xac, 0x58, 0xb1, 0x62, + 0xc5, 0x6a, 0x56, 0x0c, 0xd5, 0x8a, 0x15, 0x2b, 0x56, 0xac, 0x58, 0xb1, + 0x7e, 0x8b, 0xaa, 0xb1, 0x87, 0x63, 0x22, 0x86, 0x91, 0xaf, 0x45, 0xce, + 0xec, 0xc2, 0xa0, 0x4f, 0x6f, 0x15, 0xb5, 0x5d, 0x18, 0xff, 0x26, 0xa9, + 0x53, 0xb8, 0x96, 0x65, 0x5a, 0x94, 0x66, 0x3b, 0x5f, 0x80, 0x5e, 0x63, + 0x4f, 0xf3, 0xc2, 0xe4, 0xab, 0x8b, 0xf0, 0x97, 0x9e, 0x71, 0x62, 0xe3, + 0x92, 0xea, 0x1a, 0x90, 0xa8, 0x4a, 0x2a, 0x49, 0x41, 0xc5, 0x6d, 0xb1, + 0xd0, 0x52, 0x5b, 0xe3, 0xd8, 0x3d, 0x6a, 0xe1, 0x5d, 0x5e, 0x1b, 0xc0, + 0x8b, 0xd0, 0xe2, 0x73, 0xfb, 0x22, 0x41, 0xf1, 0x3e, 0x49, 0xaa, 0x5c, + 0x03, 0x17, 0x2a, 0x45, 0x89, 0x9c, 0x55, 0xdf, 0xab, 0x0f, 0x78, 0x5a, + 0xd2, 0x5f, 0xd8, 0xde, 0x20, 0x6d, 0xf9, 0xe3, 0xfd, 0x8a, 0xa6, 0xbe, + 0xbe, 0x99, 0xfe, 0x2f, 0x6c, 0x84, 0x3b, 0x46, 0xb9, 0xf2, 0xc3, 0x97, + 0x90, 0x9f, 0x76, 0x90, 0xba, 0xd7, 0xb8, 0xf6, 0xdb, 0x3b, 0xb0, 0xb5, + 0xf1, 0xad, 0x99, 0x4e, 0x21, 0xb4, 0xdf, 0x54, 0x7e, 0x8a, 0x4b, 0xcf, + 0x1e, 0xe2, 0xf6, 0x4f, 0x05, 0x46, 0xc1, 0x57, 0xdd, 0xb1, 0x03, 0xc7, + 0x95, 0xdc, 0xb4, 0x6b, 0x17, 0xf9, 0x6f, 0xed, 0xe0, 0x96, 0x4f, 0xaf, + 0xf6, 0xd3, 0x9d, 0x4b, 0xed, 0xea, 0x32, 0x9f, 0x2c, 0x5d, 0x8f, 0x5c, + 0xc1, 0xf1, 0x17, 0xf1, 0x77, 0x0c, 0x4b, 0xd0, 0xbf, 0x43, 0x91, 0x14, + 0xaa, 0x9d, 0x92, 0xba, 0x7d, 0xeb, 0x8d, 0xfe, 0x4d, 0x50, 0xae, 0xab, + 0x8b, 0x4d, 0x46, 0x63, 0xde, 0x75, 0x2d, 0x7a, 0x74, 0x79, 0x00, 0xd1, + 0xa5, 0xd2, 0xdb, 0x33, 0xeb, 0x42, 0x4f, 0x1a, 0x6d, 0xba, 0x8d, 0x89, + 0x07, 0xc9, 0x08, 0xef, 0xb7, 0x91, 0xfe, 0x09, 0x9a, 0xc9, 0x60, 0x51, + 0xb3, 0x5b, 0x2d, 0xe9, 0xe3, 0xd6, 0x8b, 0x89, 0x3d, 0x88, 0x96, 0xb7, + 0x0d, 0xef, 0x4b, 0x08, 0xe5, 0x4e, 0x43, 0xee, 0xe1, 0xf0, 0x73, 0x29, + 0x48, 0xcb, 0x69, 0xf8, 0x32, 0xb9, 0x94, 0x92, 0x94, 0xfe, 0x9d, 0xb8, + 0x55, 0x90, 0x25, 0xc8, 0xa4, 0xf5, 0x82, 0x5f, 0xbd, 0xef, 0xd4, 0x1b, + 0x8d, 0xfe, 0xc2, 0x40, 0x2d, 0xa0, 0x01, 0xa8, 0x35, 0x7f, 0x99, 0xda, + 0x2f, 0x50, 0x0e, 0xb7, 0x57, 0xd8, 0xad, 0x12, 0xba, 0xf7, 0x88, 0xa4, + 0xba, 0xb6, 0xd2, 0x7a, 0x5b, 0x73, 0xa1, 0x27, 0x9d, 0x51, 0xc6, 0xb9, + 0x65, 0xc0, 0xe8, 0xe4, 0xba, 0x7e, 0x73, 0x74, 0xcd, 0x5f, 0x5d, 0xc3, + 0x0d, 0x5f, 0xbb, 0xe1, 0x35, 0xc5, 0x1d, 0x3c, 0x77, 0x70, 0xfe, 0x40, + 0x21, 0x39, 0x85, 0x66, 0xc3, 0xcc, 0x19, 0xbd, 0xe0, 0xdd, 0xec, 0x32, + 0xfd, 0xaf, 0xc1, 0x2f, 0x44, 0xa5, 0x10, 0x00, 0xb2, 0x38, 0xeb, 0x30, + 0x7c, 0xf6, 0x10, 0x45, 0xfd, 0x0c, 0x73, 0x0f, 0x95, 0x30, 0x97, 0xa4, + 0x71, 0x0f, 0x95, 0xa8, 0xd4, 0x9b, 0xcf, 0x69, 0x14, 0xa0, 0xe5, 0x7d, + 0x49, 0x3b, 0x2c, 0xb7, 0x2e, 0x15, 0x10, 0xe0, 0x68, 0x9e, 0x2d, 0x2d, + 0xae, 0x6b, 0xd6, 0xed, 0x87, 0xcf, 0x1d, 0xdf, 0x32, 0xf8, 0xa9, 0xc0, + 0x53, 0xa1, 0x63, 0xcf, 0x1c, 0xae, 0x1d, 0x3c, 0x6a, 0xa1, 0xfe, 0xbd, + 0xa1, 0xad, 0x67, 0x6c, 0xb7, 0x85, 0x82, 0x0f, 0xcd, 0x6a, 0xa7, 0xc2, + 0x02, 0xf2, 0x8a, 0x86, 0x8f, 0xa6, 0x33, 0x57, 0xf9, 0xc2, 0xee, 0xaf, + 0xa5, 0xce, 0x5b, 0xb6, 0x6c, 0x69, 0xd8, 0x1e, 0xad, 0x0a, 0xfb, 0x95, + 0xb5, 0xf2, 0x4d, 0xc0, 0x86, 0xde, 0x56, 0x35, 0x0a, 0x69, 0xdd, 0xfe, + 0x66, 0x03, 0xc1, 0x07, 0x8b, 0x70, 0x7c, 0x70, 0xfe, 0x2f, 0xd9, 0x05, + 0x3f, 0x5a, 0x01, 0xb5, 0xff, 0x7c, 0x1c, 0x80, 0x3d, 0x22, 0xc1, 0xf0, + 0x7d, 0xf8, 0xcf, 0xc5, 0x81, 0x39, 0x9e, 0x33, 0x61, 0x60, 0x54, 0x27, + 0x40, 0xaa, 0x76, 0x60, 0xac, 0x70, 0xdc, 0x4d, 0xf5, 0xc0, 0xff, 0x80, + 0xde, 0x3f, 0xd5, 0x68, 0x74, 0x0f, 0xef, 0x87, 0x15, 0x75, 0xdf, 0x54, + 0x0f, 0xf6, 0xa7, 0xea, 0xad, 0xc1, 0x5a, 0xe1, 0x30, 0xed, 0xf6, 0xc3, + 0x0a, 0xa7, 0xb3, 0xa1, 0x1e, 0xb4, 0xc1, 0x5c, 0xfb, 0xd0, 0x0c, 0xd7, + 0x5a, 0xa7, 0xdd, 0xb7, 0x1a, 0x8d, 0xfb, 0x0f, 0xd4, 0xd5, 0x33, 0x2b, + 0x0a, 0xd7, 0xba, 0x52, 0xbb, 0x6f, 0x8f, 0xb8, 0xaf, 0xa9, 0x43, 0xd1, + 0x40, 0x9d, 0xd7, 0xa8, 0xd1, 0xd0, 0x63, 0x53, 0x70, 0x8c, 0xea, 0x87, + 0x8f, 0x6a, 0x63, 0x9b, 0x55, 0x06, 0x8c, 0xbb, 0x15, 0xac, 0xe5, 0x03, + 0x90, 0x9f, 0x21, 0xbf, 0x2c, 0xa3, 0x4c, 0x8f, 0xf7, 0xd5, 0xd8, 0x71, + 0x46, 0x16, 0x1e, 0x99, 0x60, 0x35, 0x30, 0x66, 0x80, 0x7d, 0x61, 0x16, + 0xf2, 0x79, 0x32, 0x7b, 0xf7, 0x90, 0xc7, 0xf4, 0x4d, 0x94, 0x6f, 0xfd, + 0x8e, 0x82, 0x6e, 0xad, 0xc6, 0x25, 0x7f, 0x96, 0x7e, 0x6e, 0xe4, 0x72, + 0xe4, 0xf5, 0x93, 0xf6, 0x8a, 0xcb, 0xf2, 0xbc, 0xf7, 0xab, 0x97, 0x00, + 0x3d, 0x8c, 0xe9, 0x38, 0xa6, 0x98, 0x69, 0x98, 0xa1, 0xcb, 0x9e, 0x05, + 0x57, 0x5c, 0x0c, 0x4b, 0xaf, 0x3b, 0x15, 0x10, 0x9c, 0x7a, 0x9f, 0x06, + 0x87, 0x1a, 0xb2, 0x21, 0x8c, 0xfd, 0x51, 0xc1, 0xad, 0x37, 0x0a, 0xe8, + 0x93, 0x20, 0xb6, 0x41, 0x3a, 0x64, 0xd8, 0xe9, 0xf5, 0x29, 0x45, 0x82, + 0x2b, 0x3e, 0x09, 0xb7, 0x7e, 0xc3, 0x85, 0x33, 0x80, 0x8b, 0xf2, 0x70, + 0x9e, 0x05, 0x87, 0xc6, 0xf9, 0xad, 0xe9, 0x6f, 0xb7, 0xc1, 0xdf, 0x5f, + 0x09, 0xdf, 0x1f, 0x85, 0x8f, 0x6a, 0x90, 0x53, 0x3b, 0x40, 0x67, 0x21, + 0xdf, 0xda, 0x1d, 0xe0, 0xf3, 0x1b, 0xe0, 0xde, 0xb1, 0x60, 0x0b, 0xea, + 0xbc, 0x46, 0xc1, 0x5a, 0x57, 0x17, 0x61, 0xdd, 0x9b, 0xfb, 0xbc, 0x8e, + 0xf5, 0x26, 0xa8, 0xc5, 0xf3, 0xfa, 0x8f, 0xf7, 0x03, 0xfa, 0x71, 0x1d, + 0x35, 0x62, 0x8d, 0xca, 0x1b, 0x22, 0xcd, 0xd5, 0x9b, 0x11, 0xa1, 0xb0, + 0x9e, 0x7e, 0x0d, 0xbc, 0xa3, 0x4d, 0xf8, 0x56, 0x7e, 0xc7, 0x2d, 0x59, + 0x02, 0xc0, 0xa3, 0x8f, 0x3e, 0x0a, 0x4b, 0x16, 0xc3, 0x73, 0xcf, 0xe1, + 0xbe, 0xa4, 0x40, 0x5b, 0x8f, 0x3e, 0xfa, 0x28, 0x67, 0x9e, 0x79, 0x66, + 0x53, 0x9e, 0xd1, 0xb2, 0x7b, 0xc7, 0xc7, 0x01, 0x2f, 0x2f, 0x59, 0xc2, + 0xf1, 0x87, 0x0e, 0xf9, 0xe1, 0x5f, 0xd6, 0xe9, 0x87, 0xc3, 0xcf, 0x55, + 0x97, 0x74, 0x97, 0xa2, 0xf8, 0x3d, 0x59, 0x91, 0x3c, 0xbc, 0x6b, 0x37, + 0xa7, 0xa7, 0x94, 0xcf, 0x4c, 0xb9, 0x0d, 0x15, 0xe9, 0x28, 0x34, 0x57, + 0x5d, 0x16, 0x72, 0x5e, 0xfe, 0x78, 0x7f, 0x0b, 0x00, 0x8f, 0x7e, 0x5e, + 0xe7, 0xee, 0x19, 0x43, 0x98, 0x29, 0x6e, 0xba, 0xf2, 0x7a, 0x46, 0x3e, + 0xbf, 0x86, 0x5b, 0xd2, 0x16, 0xeb, 0xbf, 0xb4, 0x8d, 0x34, 0x09, 0xd6, + 0xbb, 0x2b, 0x58, 0x5d, 0x56, 0xf7, 0x10, 0xd9, 0x35, 0x8c, 0x69, 0xee, + 0x61, 0x7c, 0xf7, 0x30, 0x23, 0x17, 0xc3, 0x64, 0xd7, 0x30, 0x89, 0x25, + 0xe3, 0x88, 0x97, 0xd5, 0xb8, 0x51, 0x22, 0x30, 0x8d, 0xa0, 0x6f, 0x29, + 0x0c, 0x30, 0xa9, 0x40, 0xca, 0x64, 0x7c, 0x62, 0x82, 0xe1, 0xc1, 0xe6, + 0x7e, 0xb4, 0x30, 0xe6, 0xee, 0x6f, 0x3a, 0x07, 0x55, 0x5f, 0x3a, 0x2d, + 0xd2, 0x88, 0x54, 0x02, 0x59, 0xa9, 0x01, 0x02, 0x21, 0x4c, 0xac, 0xb3, + 0x46, 0x18, 0x5c, 0xa1, 0x60, 0x39, 0xa3, 0xff, 0xb0, 0x03, 0x2b, 0x7d, + 0x25, 0xc5, 0xd9, 0x6d, 0xd8, 0x1f, 0x58, 0x8d, 0x53, 0xda, 0xc6, 0x55, + 0x57, 0x5b, 0xdc, 0x72, 0xf3, 0x0a, 0x32, 0x17, 0xaf, 0x63, 0xec, 0xfb, + 0x37, 0x34, 0xb4, 0x88, 0x07, 0x82, 0x96, 0x75, 0x05, 0xec, 0xca, 0xe5, + 0x1c, 0xcc, 0x25, 0xa9, 0x46, 0xa0, 0x96, 0x21, 0xb0, 0xec, 0x60, 0xae, + 0xa9, 0x22, 0x5d, 0x84, 0x37, 0x76, 0x6b, 0x03, 0x92, 0x16, 0x49, 0x81, + 0xd4, 0x10, 0x2d, 0x59, 0x17, 0x54, 0x5c, 0x19, 0x81, 0x76, 0xa9, 0xed, + 0xd8, 0x83, 0x39, 0x46, 0xce, 0xcb, 0x32, 0xf6, 0x60, 0x8e, 0xed, 0x37, + 0x6f, 0xe6, 0xfa, 0x1b, 0xb7, 0xe2, 0x1e, 0x76, 0xfc, 0xf1, 0x55, 0x2e, + 0x97, 0x23, 0x9b, 0xcd, 0xea, 0x7c, 0x83, 0xbc, 0x2a, 0x52, 0x32, 0x3e, + 0x31, 0xa1, 0x8c, 0xcd, 0x2b, 0x2e, 0x66, 0x42, 0x81, 0xb5, 0xf6, 0x4c, + 0xec, 0x41, 0x18, 0x56, 0x70, 0x5e, 0xcf, 0x6b, 0x7d, 0x5d, 0xd7, 0x68, + 0x18, 0x72, 0xb2, 0x34, 0x79, 0x0c, 0xbf, 0x0a, 0x81, 0xa4, 0x2c, 0xe0, + 0x0f, 0xfa, 0xc1, 0xba, 0xeb, 0x08, 0xff, 0xd7, 0xda, 0x63, 0x59, 0x71, + 0xfb, 0xab, 0x3e, 0x50, 0xeb, 0x5e, 0x14, 0x3a, 0xe5, 0x09, 0xe0, 0xd8, + 0xa9, 0x23, 0xfc, 0x0a, 0xd5, 0x87, 0xdf, 0x07, 0x2c, 0xd7, 0xdb, 0xf9, + 0x64, 0xd0, 0x5c, 0x06, 0x4f, 0xa7, 0xa7, 0x8e, 0xe5, 0xa9, 0xca, 0xab, + 0x1d, 0xa4, 0xf2, 0xfa, 0xe9, 0x70, 0x1b, 0xf7, 0xdf, 0x46, 0x59, 0x7e, + 0x15, 0xd9, 0x7a, 0xa6, 0xdd, 0xcf, 0x85, 0xdc, 0x5f, 0x8a, 0xc4, 0x69, + 0x79, 0x5d, 0x47, 0xc6, 0x5c, 0xde, 0x2f, 0xd8, 0x01, 0xa6, 0xa7, 0x5a, + 0xd7, 0x58, 0x1a, 0x30, 0xe1, 0xc2, 0x70, 0x12, 0xd0, 0x8f, 0xfa, 0xe9, + 0x45, 0xd0, 0xd7, 0xbf, 0x08, 0xf9, 0x93, 0x97, 0x55, 0xfe, 0xef, 0x3b, + 0x1e, 0x5a, 0xc4, 0xb7, 0x84, 0x02, 0x4b, 0xa9, 0xb4, 0x9b, 0xef, 0x4a, + 0x36, 0x70, 0x60, 0x11, 0x1c, 0xd3, 0x22, 0xeb, 0x9a, 0x80, 0x23, 0x53, + 0x87, 0x71, 0x0d, 0xf8, 0x75, 0x1b, 0xae, 0x86, 0x6d, 0xa8, 0xb4, 0x87, + 0x8f, 0x83, 0xf1, 0x12, 0x7c, 0xf0, 0xdd, 0x21, 0xcf, 0x3a, 0x7e, 0xdf, + 0xaf, 0x26, 0x40, 0x54, 0x1b, 0x9f, 0x35, 0x4f, 0xfc, 0xa4, 0xb1, 0x1c, + 0x45, 0x7d, 0x47, 0x75, 0x0d, 0xc8, 0x96, 0x41, 0x98, 0xc1, 0xf4, 0x94, + 0xad, 0x63, 0x0e, 0x6a, 0xb0, 0xd6, 0xd6, 0x3a, 0xac, 0x6b, 0x01, 0xd6, + 0xf2, 0xef, 0xc3, 0x06, 0x58, 0x06, 0x8c, 0x49, 0x35, 0x0f, 0xe4, 0xcd, + 0x98, 0x28, 0xe8, 0x96, 0x60, 0x4a, 0x48, 0x98, 0xe7, 0x91, 0x30, 0x45, + 0x33, 0x2c, 0x51, 0x18, 0xf0, 0xca, 0x7b, 0x16, 0x71, 0xdc, 0xe3, 0x87, + 0xfd, 0x73, 0x01, 0xb4, 0x1e, 0x73, 0xe9, 0xbe, 0xd9, 0xd8, 0x23, 0x2e, + 0x23, 0x67, 0x07, 0xf7, 0xde, 0xb1, 0x47, 0x54, 0x63, 0x36, 0xb9, 0x3d, + 0xa2, 0x80, 0x3f, 0xab, 0x56, 0x04, 0xf7, 0xb5, 0xd1, 0x5d, 0xc1, 0x5c, + 0xb8, 0xe7, 0x3e, 0xfa, 0x60, 0xc8, 0xed, 0xbc, 0x20, 0xec, 0xd8, 0x3c, + 0xee, 0x93, 0x05, 0x95, 0xef, 0x50, 0xaf, 0x32, 0x4c, 0x9f, 0x2c, 0xb8, + 0xf0, 0xd7, 0x17, 0x80, 0x91, 0xa5, 0xa5, 0x34, 0xc4, 0xca, 0x03, 0x69, + 0x35, 0x00, 0xb5, 0xc2, 0x80, 0x2b, 0x7f, 0x5f, 0xcd, 0xd9, 0x55, 0xb4, + 0xf1, 0xf8, 0xdd, 0xa3, 0x77, 0x73, 0xe9, 0xaa, 0x4b, 0xb5, 0x5f, 0xa5, + 0x75, 0xdc, 0xdf, 0xa2, 0x3c, 0x90, 0x56, 0x3b, 0xa0, 0x56, 0x18, 0x02, + 0xd3, 0xa0, 0x16, 0x7d, 0xb3, 0x61, 0xbf, 0x6f, 0x36, 0xa0, 0x5d, 0x06, + 0x50, 0x70, 0x27, 0x01, 0xf5, 0x14, 0x51, 0xd0, 0x93, 0xd2, 0x6a, 0x5c, + 0xe9, 0x2a, 0xb0, 0x56, 0x3d, 0x0f, 0xf5, 0x30, 0x08, 0x2b, 0x50, 0x4f, + 0x32, 0xcb, 0x4c, 0x35, 0x3c, 0x77, 0x68, 0x11, 0x00, 0xa4, 0x26, 0x70, + 0xeb, 0x25, 0x0d, 0xab, 0xb2, 0x42, 0xfb, 0xa3, 0x0d, 0xe1, 0xb7, 0xdd, + 0xb7, 0x95, 0x19, 0x77, 0x18, 0xb8, 0x86, 0xdc, 0x34, 0x08, 0x63, 0x14, + 0x58, 0xcb, 0xea, 0xbe, 0xbb, 0x08, 0xc0, 0x56, 0x2b, 0x80, 0x11, 0x2a, + 0x25, 0x35, 0xde, 0x10, 0x86, 0x9a, 0x7b, 0x32, 0x0d, 0xa1, 0xb6, 0xa8, + 0x2d, 0x28, 0x90, 0x96, 0x09, 0xb8, 0xf5, 0x20, 0xcc, 0xc2, 0x74, 0x63, + 0x5b, 0x1f, 0x59, 0xbf, 0x0e, 0xe4, 0xb5, 0xc1, 0xb1, 0x8c, 0xfe, 0x5e, + 0x02, 0xb8, 0x96, 0x5b, 0xcf, 0xe8, 0xfa, 0x3a, 0xc0, 0xd5, 0xa1, 0x7a, + 0xdc, 0xec, 0xd7, 0xbd, 0x52, 0xaa, 0x00, 0x82, 0x1b, 0xee, 0xcc, 0x71, + 0xcd, 0xc7, 0x7f, 0x04, 0x2f, 0x4b, 0x1f, 0xa8, 0x05, 0x9b, 0x70, 0x65, + 0x3f, 0x6e, 0xdd, 0x01, 0x2c, 0x5c, 0x59, 0xd2, 0x60, 0x2d, 0xe5, 0x3b, + 0xbc, 0xbf, 0x05, 0x58, 0x4b, 0xdf, 0xc3, 0x7b, 0x08, 0xe0, 0x58, 0x33, + 0x21, 0xef, 0x1e, 0xbd, 0x9d, 0x09, 0xed, 0xf7, 0xb4, 0xf0, 0xdf, 0x1d, + 0x49, 0xb6, 0x27, 0x72, 0x7c, 0x5b, 0x8f, 0x57, 0x42, 0xad, 0x56, 0x40, + 0x2c, 0xcf, 0x6d, 0x65, 0x0b, 0xb7, 0x76, 0x61, 0x3b, 0xd0, 0xca, 0x2d, + 0xb0, 0x32, 0x74, 0x4a, 0x37, 0x6e, 0x84, 0x02, 0x05, 0x0a, 0x05, 0xf0, + 0xa6, 0x9f, 0x96, 0x9d, 0xaf, 0xb6, 0x3f, 0xf8, 0x81, 0xda, 0xde, 0xff, + 0x91, 0x5e, 0xd8, 0x58, 0xf0, 0x61, 0x5c, 0x9e, 0xdf, 0xec, 0x6e, 0x58, + 0xf9, 0x11, 0xd8, 0xd9, 0xab, 0xe2, 0x83, 0x4a, 0xe3, 0x7e, 0x9d, 0xfe, + 0xfd, 0x0b, 0xfd, 0xe9, 0x34, 0x14, 0x14, 0xd8, 0xa9, 0xc0, 0x5c, 0x97, + 0xf7, 0xc0, 0xf9, 0x33, 0x0a, 0xa8, 0x75, 0xdb, 0x6d, 0x0a, 0x78, 0x06, + 0xc0, 0xf9, 0x0a, 0xa6, 0xd5, 0xd3, 0xa3, 0xdc, 0x2f, 0xbf, 0x1c, 0x7a, + 0xfe, 0x0e, 0x66, 0x6e, 0x83, 0xf3, 0x7b, 0xe0, 0xa1, 0x1e, 0xe0, 0x7e, + 0x3a, 0x9a, 0x37, 0xf3, 0xe4, 0xbd, 0xeb, 0x93, 0xa1, 0xf7, 0x2c, 0xb2, + 0xcf, 0xf6, 0xdd, 0xd3, 0x49, 0x13, 0xf7, 0xa7, 0xea, 0x9a, 0x0d, 0xcf, + 0xdb, 0x76, 0xf2, 0xb1, 0x0e, 0x3f, 0x8d, 0x73, 0x07, 0xfd, 0xeb, 0x2d, + 0xec, 0xde, 0x2a, 0xec, 0x9c, 0xe9, 0x99, 0xa6, 0x7e, 0x57, 0x26, 0xe9, + 0x49, 0xa7, 0x99, 0x29, 0x97, 0x3a, 0x7e, 0x57, 0xe9, 0x01, 0xb5, 0x84, + 0x30, 0x15, 0xa4, 0xc9, 0x75, 0xe7, 0xae, 0x83, 0x7e, 0x60, 0x9a, 0x49, + 0xd3, 0xbf, 0x7f, 0x0a, 0x53, 0xe0, 0x56, 0x5d, 0xe5, 0x56, 0x76, 0x11, + 0xa6, 0xc0, 0x59, 0x75, 0x55, 0x43, 0x19, 0x84, 0x10, 0x7e, 0xba, 0xe1, + 0x62, 0xcd, 0x55, 0xce, 0xb0, 0xfb, 0x5c, 0xe0, 0xaf, 0x96, 0x6a, 0xd1, + 0x0f, 0xf7, 0xde, 0x73, 0xf9, 0x40, 0x2d, 0xa0, 0xa2, 0xb8, 0x3b, 0xaa, + 0xf7, 0x21, 0xbc, 0xb7, 0x32, 0x1e, 0x78, 0x3b, 0xf4, 0x1a, 0xcd, 0x50, + 0x6f, 0x2f, 0xd3, 0x86, 0xa0, 0x58, 0x57, 0xe3, 0x8a, 0x8c, 0x80, 0x19, + 0xa9, 0xe2, 0x48, 0xa9, 0x60, 0x5a, 0x29, 0x43, 0x8d, 0xfe, 0x6c, 0x21, + 0xc8, 0x57, 0x55, 0x83, 0x09, 0x03, 0x06, 0xbb, 0xf4, 0xbb, 0x35, 0x57, + 0x62, 0x55, 0x25, 0x15, 0x33, 0x68, 0xe3, 0x4a, 0xd5, 0x25, 0x11, 0xea, + 0x85, 0xe4, 0xeb, 0xaa, 0x50, 0x15, 0xa9, 0x40, 0x52, 0x09, 0x84, 0x02, + 0xae, 0xd6, 0x21, 0x6d, 0x40, 0x51, 0x2a, 0xe0, 0x96, 0x82, 0x20, 0x0a, + 0x6a, 0xba, 0x8f, 0x34, 0xb5, 0x6f, 0x8a, 0xc9, 0xfa, 0x24, 0x03, 0x67, + 0x0d, 0x50, 0x3a, 0x54, 0xa2, 0xb4, 0x4b, 0xcd, 0x0d, 0x4e, 0xee, 0x55, + 0x6e, 0xd4, 0x6b, 0x60, 0x40, 0x6e, 0x6f, 0x8e, 0xdc, 0xde, 0x1c, 0x76, + 0x66, 0x80, 0x62, 0x7e, 0x12, 0x64, 0xe3, 0xbb, 0xd9, 0xb4, 0x90, 0xe4, + 0x3d, 0xa0, 0xb1, 0x94, 0x0c, 0xa4, 0x15, 0xf0, 0xd8, 0xeb, 0xbf, 0x25, + 0x10, 0x08, 0x43, 0x92, 0x31, 0x14, 0x30, 0x0b, 0x14, 0x58, 0x4b, 0x18, + 0x30, 0xe5, 0x81, 0xb9, 0x42, 0x3d, 0xc1, 0x04, 0x82, 0x1a, 0xea, 0x83, + 0x45, 0x45, 0xed, 0x6e, 0xd6, 0x05, 0x56, 0x32, 0xe1, 0xc3, 0x56, 0x85, + 0x01, 0xb6, 0x80, 0x7c, 0x55, 0xa8, 0xdf, 0xa1, 0x14, 0x7e, 0xdf, 0x52, + 0x00, 0xb6, 0x7e, 0xfe, 0x14, 0xf5, 0xbe, 0x30, 0x24, 0x25, 0xe9, 0xbd, + 0x8f, 0x6e, 0x7e, 0xcf, 0xe5, 0xb2, 0x87, 0xe3, 0x39, 0x85, 0xd3, 0x91, + 0x3c, 0x89, 0x68, 0xd8, 0xe6, 0xc5, 0x14, 0x19, 0xd9, 0xaf, 0x8e, 0x9f, + 0xed, 0xe6, 0xb9, 0x77, 0x1e, 0xe4, 0xf4, 0x67, 0xbb, 0x9b, 0xc2, 0xbd, + 0xd6, 0xed, 0x73, 0x1a, 0x1e, 0x75, 0x9c, 0x1c, 0x60, 0xb1, 0x94, 0xbc, + 0xfd, 0x8a, 0x13, 0x71, 0x0e, 0x95, 0xd9, 0x99, 0x7b, 0x02, 0xeb, 0x1d, + 0xf0, 0xfb, 0xef, 0x7a, 0x81, 0x23, 0x3f, 0x71, 0x59, 0x64, 0x2d, 0xe5, + 0x3d, 0x16, 0x9c, 0x72, 0xca, 0x29, 0x70, 0xca, 0x29, 0x4c, 0xff, 0xf4, + 0x11, 0x20, 0x80, 0x50, 0xfd, 0xf2, 0xd9, 0xd3, 0xfc, 0xf2, 0x7a, 0x7a, + 0xe6, 0xf9, 0xc3, 0x1c, 0x27, 0x07, 0x78, 0x45, 0x4c, 0xaa, 0x3a, 0x3c, + 0x2b, 0x38, 0x9d, 0x6e, 0x9e, 0x7c, 0x56, 0x70, 0xf2, 0x3b, 0xf7, 0x1f, + 0x75, 0x9a, 0xc7, 0xc9, 0x01, 0x9e, 0x78, 0x62, 0x92, 0x22, 0x30, 0x22, + 0xfb, 0x79, 0xce, 0x39, 0xc8, 0x22, 0x6b, 0x29, 0x4b, 0x4f, 0x5a, 0xa4, + 0xd2, 0x04, 0x3f, 0xcd, 0x30, 0x1c, 0xcb, 0x83, 0x89, 0x41, 0x00, 0xcf, + 0x3a, 0xf6, 0xd1, 0xe3, 0xfc, 0xb6, 0xce, 0x3f, 0x1f, 0xb4, 0xf9, 0x33, + 0xcf, 0x2b, 0xe8, 0xd8, 0xd2, 0x93, 0x16, 0xd1, 0xf7, 0xfe, 0xb3, 0xe9, + 0x03, 0x9e, 0x7e, 0xfa, 0x69, 0x1f, 0x0e, 0xe6, 0x95, 0x35, 0x23, 0xfb, + 0xc9, 0x33, 0xd5, 0x90, 0xa6, 0xcb, 0x9e, 0x66, 0x08, 0x8f, 0xbe, 0x87, + 0xb7, 0x7a, 0xb7, 0xa6, 0x7e, 0x7f, 0x11, 0x19, 0x90, 0xe9, 0x69, 0x7e, + 0xc7, 0xda, 0x4a, 0x19, 0x3b, 0xc3, 0xf8, 0xae, 0x31, 0x40, 0x60, 0xf7, + 0xd8, 0xd8, 0xa7, 0x59, 0x14, 0x67, 0x1d, 0x8a, 0xf9, 0x22, 0xae, 0xeb, + 0xe2, 0x94, 0x8b, 0x98, 0x33, 0x92, 0x6c, 0x76, 0x98, 0x5c, 0x3e, 0x87, + 0xac, 0x27, 0x10, 0x46, 0xf0, 0x1e, 0xb0, 0x12, 0x5a, 0x86, 0x11, 0x05, + 0x68, 0x45, 0xc3, 0xb6, 0x52, 0xd4, 0xdf, 0xa9, 0x4a, 0xb2, 0x76, 0x46, + 0xfb, 0x05, 0xe0, 0x3f, 0x61, 0x42, 0xf8, 0x16, 0x29, 0xeb, 0x09, 0x98, + 0xad, 0xf8, 0xeb, 0x29, 0xac, 0x2e, 0x41, 0xa5, 0x2e, 0xa1, 0x5c, 0xc3, + 0x29, 0xd4, 0xf4, 0x12, 0x8a, 0x04, 0xae, 0x84, 0x94, 0xa9, 0xe6, 0x5b, + 0x64, 0x9d, 0x06, 0x70, 0x56, 0xa2, 0x2b, 0x41, 0xc5, 0x55, 0x1f, 0x8b, + 0x1a, 0xc8, 0x0e, 0x31, 0x99, 0xdb, 0xa3, 0x20, 0x59, 0x86, 0xf0, 0xd7, + 0xa2, 0x24, 0x92, 0x09, 0x64, 0x5d, 0x52, 0xdc, 0x9f, 0x67, 0xd3, 0xd7, + 0x27, 0xc8, 0x4f, 0xe4, 0xb9, 0xf4, 0xa3, 0x97, 0x32, 0xfc, 0xe1, 0x00, + 0x44, 0x56, 0x29, 0x56, 0xd4, 0xc7, 0xc7, 0x92, 0x16, 0xc5, 0x92, 0xba, + 0xe2, 0xe5, 0x61, 0xc9, 0xba, 0x4f, 0x5f, 0x89, 0x2c, 0x4b, 0xc6, 0xf7, + 0xed, 0x21, 0xb3, 0xdc, 0xc6, 0x99, 0x95, 0x78, 0xa8, 0x3c, 0x09, 0x4d, + 0xf7, 0x70, 0xef, 0x9a, 0xf6, 0xeb, 0xd8, 0xc1, 0x1a, 0x8b, 0x4e, 0xc3, + 0x76, 0x92, 0x96, 0x58, 0x26, 0x1a, 0xc2, 0x45, 0xe3, 0x44, 0x61, 0x54, + 0x5e, 0x9c, 0x56, 0xe1, 0xdb, 0xa5, 0x15, 0x75, 0x8f, 0xc6, 0xff, 0x58, + 0xdf, 0x9f, 0xb2, 0xf4, 0xe4, 0x77, 0x73, 0xf5, 0x47, 0x6e, 0xe4, 0xeb, + 0xbb, 0xbf, 0xd2, 0x32, 0xfd, 0x70, 0x5a, 0xde, 0x71, 0xbb, 0x72, 0x44, + 0xeb, 0xe7, 0x87, 0x09, 0xc1, 0xca, 0xa4, 0x99, 0x6a, 0x48, 0xcb, 0x03, + 0x94, 0x3d, 0xff, 0xe4, 0xd3, 0x3c, 0xff, 0xe2, 0xd3, 0x9c, 0x74, 0xe2, + 0x29, 0x3e, 0x50, 0xcb, 0x53, 0xf7, 0xa2, 0x73, 0x79, 0xee, 0xa5, 0x22, + 0xcf, 0xbf, 0x18, 0x84, 0xf1, 0xb6, 0x5e, 0xb8, 0xe7, 0x5f, 0x7c, 0x1a, + 0x4e, 0x6c, 0x73, 0x4d, 0xc7, 0x8a, 0x15, 0x2b, 0x56, 0xac, 0x58, 0xb1, + 0x62, 0xc5, 0x8a, 0x15, 0x2b, 0x56, 0xac, 0x58, 0xb1, 0x62, 0xc5, 0x8a, + 0x15, 0x2b, 0x56, 0xac, 0x58, 0xb1, 0x62, 0xc5, 0x8a, 0x15, 0x2b, 0x56, + 0xac, 0x8e, 0x14, 0x43, 0xb5, 0x62, 0xc5, 0x8a, 0x15, 0x2b, 0x56, 0xac, + 0xdf, 0x41, 0x85, 0x17, 0xe1, 0x09, 0x43, 0x60, 0x2d, 0xb3, 0x70, 0xdd, + 0xf6, 0x8b, 0xa4, 0xa3, 0xe1, 0xa3, 0xfb, 0xe1, 0x2d, 0xd0, 0x71, 0xd8, + 0x30, 0x94, 0x2a, 0x1a, 0xf6, 0xb5, 0xd6, 0x29, 0x9a, 0xee, 0x5c, 0x75, + 0x58, 0x48, 0xd8, 0xe8, 0xfe, 0x42, 0xc2, 0x39, 0x6e, 0x33, 0xb4, 0xac, + 0x6d, 0x79, 0x3a, 0xab, 0x2d, 0x09, 0x82, 0x85, 0xd2, 0xb2, 0x0e, 0x29, + 0x53, 0xa8, 0xaf, 0x07, 0x57, 0xa1, 0x66, 0x80, 0xbd, 0xcc, 0xa2, 0x58, + 0xd6, 0x0b, 0x22, 0x75, 0x73, 0x7a, 0x30, 0xad, 0xa8, 0x2a, 0x5d, 0x09, + 0xf8, 0x6e, 0x85, 0x54, 0x15, 0x6a, 0x65, 0x89, 0x3c, 0x28, 0xa1, 0x2c, + 0x54, 0x79, 0xa4, 0x5a, 0x84, 0x2e, 0x5b, 0x18, 0xc4, 0x09, 0x03, 0xd5, + 0x1b, 0xd4, 0x5f, 0xa0, 0x05, 0xb8, 0xf6, 0x8e, 0x51, 0xcc, 0x2e, 0x41, + 0xfe, 0x8e, 0x51, 0x6e, 0xb9, 0x6c, 0x95, 0x82, 0x60, 0x01, 0x43, 0x67, + 0x0f, 0xb1, 0xe7, 0x91, 0x3d, 0x00, 0x5c, 0x7a, 0xf6, 0x10, 0x8e, 0x2b, + 0x71, 0x5c, 0x05, 0xd4, 0xba, 0xfd, 0x53, 0xab, 0x19, 0x3a, 0x6d, 0x80, + 0x3d, 0xfb, 0x27, 0x99, 0xfa, 0x7a, 0x60, 0x21, 0x72, 0xcb, 0x65, 0xab, + 0xb9, 0xea, 0x8e, 0x1d, 0xe4, 0x4b, 0x0e, 0x98, 0x82, 0xab, 0xee, 0x18, + 0x6d, 0x0f, 0xd4, 0xaa, 0x2b, 0xeb, 0x82, 0x96, 0x75, 0x99, 0x0d, 0x0c, + 0xb2, 0xfd, 0xdf, 0x69, 0xd4, 0x70, 0x40, 0x82, 0xd9, 0xa7, 0x0d, 0xe3, + 0x0a, 0x4e, 0x50, 0xbf, 0x76, 0x8a, 0xc2, 0xb1, 0x3c, 0x19, 0x20, 0x32, + 0x02, 0xe1, 0xad, 0x27, 0x2e, 0xaa, 0xc5, 0xb5, 0x4d, 0x80, 0xae, 0x0e, + 0x0c, 0x2c, 0x5a, 0x1a, 0x99, 0x75, 0x01, 0xd5, 0x05, 0x7c, 0x21, 0x5c, + 0x4b, 0x94, 0xda, 0x5f, 0x53, 0x0a, 0xac, 0x65, 0xe3, 0xb6, 0x31, 0xbe, + 0x6b, 0xe7, 0x17, 0x76, 0x9f, 0x2b, 0xfe, 0x7c, 0xe9, 0x40, 0x6b, 0xe3, + 0x97, 0x4a, 0xc8, 0x58, 0xbb, 0xd2, 0xc2, 0x70, 0xdb, 0x4a, 0xda, 0x4d, + 0x60, 0xad, 0xb9, 0x14, 0xce, 0xdb, 0x03, 0x6c, 0x85, 0xdd, 0x44, 0x57, + 0xeb, 0x36, 0x72, 0x43, 0xed, 0x6d, 0x26, 0xd3, 0xfe, 0x71, 0x3a, 0x99, + 0x42, 0x56, 0x2b, 0x4d, 0x61, 0xd3, 0xe9, 0x8c, 0xef, 0xee, 0x43, 0xe8, + 0xe6, 0xe1, 0x9d, 0xbd, 0x99, 0xca, 0xe5, 0x02, 0x83, 0xc1, 0xe1, 0xb3, + 0xd5, 0xe2, 0xd9, 0xe2, 0xac, 0x43, 0xd1, 0x29, 0x32, 0x7c, 0xf6, 0x10, + 0xe3, 0xfa, 0x3a, 0x7d, 0x3d, 0xe5, 0xb6, 0xb8, 0xcf, 0x86, 0xdd, 0x3d, + 0x43, 0xc2, 0xe8, 0x7e, 0x58, 0x51, 0x43, 0x42, 0x29, 0x25, 0xee, 0xa1, + 0x12, 0x2c, 0xb3, 0x28, 0x1e, 0xcc, 0x63, 0x77, 0x67, 0x1a, 0xfc, 0xa3, + 0x75, 0xf1, 0x8c, 0x82, 0xc2, 0x86, 0x45, 0x73, 0x95, 0xef, 0xcd, 0x84, + 0x36, 0x1e, 0x20, 0x30, 0x1c, 0x87, 0xd6, 0x70, 0xaa, 0xe8, 0x71, 0x3b, + 0x80, 0x55, 0x2b, 0x3f, 0xef, 0xd8, 0x03, 0x6a, 0xed, 0x6c, 0x03, 0xd4, + 0xea, 0xa5, 0x3d, 0x48, 0xab, 0x1d, 0xa8, 0x2b, 0x1a, 0xdf, 0x73, 0xdf, + 0x19, 0x71, 0x0f, 0xa7, 0x55, 0x68, 0xe1, 0xae, 0xed, 0xf5, 0x3a, 0xae, + 0x93, 0xa7, 0x2d, 0x7d, 0x7d, 0x6d, 0xe3, 0x84, 0xf3, 0x6f, 0x97, 0x6f, + 0xbb, 0x32, 0xfa, 0xee, 0x85, 0x42, 0x7b, 0xa0, 0x97, 0xd1, 0xd9, 0x74, + 0x88, 0xdc, 0xf0, 0x5e, 0x2e, 0xb9, 0xe9, 0x71, 0xc6, 0xff, 0xf2, 0xbd, + 0xea, 0x59, 0xf4, 0xe4, 0x01, 0xd6, 0xad, 0x3b, 0x15, 0x50, 0x20, 0xa8, + 0x76, 0x50, 0x28, 0x68, 0x84, 0x47, 0x85, 0x61, 0x53, 0xed, 0x80, 0x54, + 0xed, 0x20, 0x57, 0xed, 0xc2, 0xbf, 0x9e, 0x3a, 0x1a, 0x7b, 0xcd, 0xb7, + 0x82, 0xb6, 0x1d, 0x6d, 0xfb, 0x58, 0x69, 0x70, 0x4a, 0x8c, 0xf6, 0x66, + 0xa0, 0xe4, 0xe0, 0xce, 0x86, 0x9e, 0x4f, 0xe9, 0x34, 0xec, 0x2b, 0xc2, + 0x9f, 0xac, 0x07, 0x60, 0xc7, 0xbf, 0x6f, 0x81, 0x47, 0x26, 0xc8, 0x3d, + 0x92, 0x83, 0xbd, 0x53, 0xe4, 0xda, 0x3c, 0x24, 0x76, 0x60, 0xc2, 0xde, + 0xa9, 0x26, 0x77, 0x77, 0x76, 0x8c, 0x15, 0xef, 0x87, 0x44, 0x98, 0xab, + 0xfb, 0xf2, 0x88, 0xca, 0xca, 0x52, 0xf9, 0x4e, 0xec, 0xca, 0x33, 0x7a, + 0x4f, 0x33, 0xf4, 0xca, 0xf5, 0x8c, 0xf4, 0xce, 0xb2, 0xd9, 0x65, 0x08, + 0x7c, 0x53, 0x19, 0xef, 0x9e, 0x68, 0x9a, 0xe0, 0x8d, 0x09, 0x84, 0x36, + 0x3e, 0x72, 0x1d, 0x52, 0x6e, 0x06, 0x70, 0xc0, 0xb4, 0x60, 0xa6, 0x06, + 0xf7, 0x28, 0xc3, 0x2d, 0x3e, 0x3c, 0x00, 0x87, 0x3a, 0x87, 0xf3, 0x9a, + 0xcb, 0x03, 0x23, 0x1f, 0x77, 0xdf, 0x51, 0x42, 0xb9, 0x3c, 0xb0, 0xd6, + 0x8d, 0x37, 0x41, 0xaf, 0xad, 0xe0, 0x5a, 0x1f, 0x5d, 0xa5, 0x40, 0x5b, + 0x9e, 0xc2, 0xcf, 0x8e, 0x62, 0xa8, 0x9c, 0xb6, 0x05, 0x77, 0x4c, 0xc2, + 0x3b, 0xb4, 0x71, 0xfe, 0xb5, 0x79, 0xe8, 0xe9, 0x0c, 0x08, 0x1a, 0xee, + 0xd3, 0x2d, 0x08, 0xc0, 0xda, 0x81, 0xdc, 0x0e, 0xfb, 0x78, 0xf3, 0x8d, + 0x3f, 0x5a, 0x8d, 0x71, 0x3a, 0x09, 0x3b, 0xd7, 0xd8, 0xce, 0x6b, 0x49, + 0x91, 0x0e, 0x19, 0x2b, 0xa5, 0x53, 0xc8, 0x36, 0xe3, 0x0b, 0x3f, 0x5e, + 0x38, 0x8d, 0x16, 0xfb, 0xed, 0x24, 0x92, 0x66, 0xc3, 0xbe, 0x8c, 0xf4, + 0x8b, 0x45, 0xd8, 0x68, 0xca, 0x4c, 0x21, 0xdd, 0xf6, 0xe5, 0x78, 0xab, + 0x69, 0x70, 0x70, 0x10, 0xd7, 0x75, 0x39, 0xf0, 0xf3, 0xa7, 0x78, 0xf1, + 0xa5, 0x17, 0x7c, 0xf7, 0x4c, 0x26, 0xc3, 0x6f, 0x7e, 0xfe, 0x14, 0x84, + 0xdc, 0x00, 0x5e, 0xd1, 0x00, 0xac, 0xae, 0xae, 0x2e, 0xca, 0xe5, 0x32, + 0xae, 0x26, 0xcb, 0xfc, 0xc7, 0xfd, 0xbb, 0xe8, 0xc9, 0x9c, 0xce, 0xd3, + 0x4f, 0x3f, 0xdd, 0x71, 0xde, 0x5d, 0x5d, 0x5d, 0xe4, 0xf3, 0x79, 0x96, + 0x86, 0xdc, 0x0e, 0x1d, 0x3a, 0x44, 0x26, 0x93, 0xe1, 0xb9, 0x10, 0x68, + 0xab, 0x9d, 0x16, 0x67, 0x32, 0xd4, 0x80, 0x25, 0xaf, 0x3e, 0x41, 0xa2, + 0xaa, 0xce, 0xe1, 0xaf, 0x5e, 0x32, 0x78, 0xb7, 0xf5, 0x3c, 0xef, 0x39, + 0x4d, 0xd5, 0xeb, 0x97, 0xf9, 0x66, 0xb8, 0xc5, 0xab, 0x27, 0x9a, 0xbc, + 0x33, 0xf1, 0x4e, 0x9e, 0xad, 0x3d, 0xcb, 0xb1, 0x2f, 0xba, 0x9c, 0xf0, + 0xb6, 0x34, 0x27, 0x9d, 0x70, 0x12, 0x65, 0xf7, 0xc9, 0x8e, 0xcb, 0xfe, + 0x46, 0x49, 0x2c, 0x12, 0xe4, 0xef, 0xac, 0xe0, 0x32, 0xc4, 0xa8, 0xe9, + 0x20, 0x7f, 0x9a, 0x62, 0xcb, 0xff, 0xb8, 0x92, 0x8d, 0xff, 0x65, 0x07, + 0x00, 0xc3, 0xe7, 0xab, 0xfb, 0xd6, 0xf8, 0xee, 0x71, 0x75, 0xaf, 0x5c, + 0xa6, 0xe2, 0x8d, 0x9c, 0x01, 0x63, 0x0c, 0xe3, 0x3e, 0x36, 0x8e, 0x30, + 0xc0, 0x71, 0x5d, 0x64, 0xdd, 0x01, 0x4c, 0x65, 0x24, 0x2e, 0x51, 0xe0, + 0xa7, 0x94, 0x49, 0xaa, 0xc5, 0x58, 0x67, 0x3e, 0xa0, 0x56, 0x58, 0xb2, + 0x9e, 0x60, 0xf3, 0xdf, 0x6f, 0x60, 0xe3, 0xdf, 0x6e, 0xf5, 0xef, 0x39, + 0x83, 0x2b, 0x60, 0xe2, 0x41, 0x60, 0x36, 0xc1, 0x86, 0xcf, 0xac, 0x46, + 0x99, 0x96, 0xaf, 0x66, 0xeb, 0xb7, 0x75, 0xb9, 0x57, 0x28, 0xe3, 0xcc, + 0xd5, 0x83, 0x80, 0x71, 0x3d, 0x7b, 0xee, 0xdc, 0xa4, 0xc0, 0x04, 0xa1, + 0x71, 0x95, 0xe3, 0xe4, 0x91, 0x15, 0x65, 0xdc, 0x2a, 0x04, 0x24, 0x84, + 0x32, 0xde, 0x4e, 0x69, 0xd8, 0x8e, 0xa3, 0xef, 0x9b, 0xe6, 0x19, 0x36, + 0x76, 0x77, 0x70, 0x8f, 0x14, 0x49, 0xc1, 0x9a, 0x8f, 0xaf, 0x61, 0xdb, + 0x77, 0xb6, 0x35, 0xb8, 0xe5, 0xa7, 0x5d, 0x84, 0x80, 0x94, 0x69, 0xe2, + 0x94, 0x5c, 0x35, 0x16, 0x92, 0x2a, 0xad, 0x94, 0x19, 0x8c, 0x8d, 0x46, + 0xce, 0x53, 0x90, 0x19, 0xab, 0xdb, 0x66, 0xe3, 0x57, 0xb7, 0x62, 0x1a, + 0x20, 0x0c, 0x93, 0x94, 0x50, 0xd7, 0x79, 0x36, 0x9b, 0xf5, 0xdb, 0x27, + 0x0c, 0x23, 0xb3, 0xad, 0x34, 0x76, 0x8f, 0x4d, 0x71, 0x26, 0xf4, 0x8c, + 0x95, 0x30, 0x34, 0x38, 0xc4, 0xe4, 0x23, 0xf3, 0x8f, 0x0b, 0xcf, 0x40, + 0x81, 0x99, 0x9e, 0x06, 0x5a, 0xcd, 0x7e, 0x2d, 0x07, 0x4e, 0xd3, 0x8f, + 0xdd, 0xbf, 0xb9, 0x5d, 0x41, 0xa5, 0xce, 0x03, 0x1e, 0x24, 0x80, 0x06, + 0x6d, 0x05, 0x98, 0x82, 0x6f, 0x00, 0xfb, 0xfb, 0x61, 0xa8, 0xff, 0x18, + 0x12, 0xe2, 0x18, 0x4e, 0x0e, 0xa5, 0xb3, 0xed, 0xf6, 0x46, 0x20, 0x95, + 0x09, 0x9c, 0x02, 0x9c, 0xa0, 0x8f, 0x7f, 0x03, 0xfc, 0xf6, 0x7f, 0xf9, + 0x6f, 0x1d, 0xb5, 0xc2, 0x36, 0x87, 0x47, 0xa4, 0x93, 0x47, 0x91, 0xb6, + 0xf7, 0xe4, 0x7f, 0xcf, 0x39, 0x8b, 0x98, 0x9e, 0x3a, 0xcc, 0x39, 0xe7, + 0x2c, 0x6a, 0x0e, 0x54, 0x87, 0x93, 0x17, 0xc1, 0xf8, 0x61, 0xb5, 0xb5, + 0x81, 0x87, 0x0f, 0x0b, 0xfa, 0x50, 0x90, 0x29, 0x75, 0x47, 0x6b, 0x84, + 0x23, 0x8f, 0x24, 0xe1, 0x3f, 0x80, 0xc7, 0x5f, 0x81, 0x0f, 0xea, 0xb4, + 0x2f, 0x3f, 0xa7, 0x19, 0xa0, 0x7c, 0x40, 0x67, 0x77, 0xa4, 0x45, 0xb6, + 0x4f, 0x9f, 0xb9, 0x08, 0xa6, 0x0e, 0xf3, 0x9b, 0xf7, 0xa8, 0xed, 0x07, + 0x16, 0x49, 0x7e, 0x19, 0x81, 0x6f, 0x79, 0x57, 0xeb, 0x2b, 0xef, 0x59, + 0x84, 0xf8, 0x49, 0xc8, 0xb3, 0xae, 0xc0, 0x56, 0x89, 0x34, 0x0c, 0x77, + 0x29, 0xa8, 0xb7, 0xa7, 0xcb, 0xcf, 0x39, 0x9e, 0xff, 0xf5, 0x13, 0xd9, + 0xb0, 0x9f, 0x35, 0xa0, 0x58, 0x07, 0x6f, 0x66, 0x2c, 0x57, 0x07, 0xca, + 0x0a, 0xd4, 0x60, 0x23, 0xfd, 0xed, 0x84, 0xc2, 0x45, 0x60, 0x01, 0xdb, + 0xea, 0x0a, 0x2b, 0xe4, 0x69, 0x48, 0x80, 0x9b, 0x84, 0x52, 0x39, 0x80, + 0x03, 0x7b, 0x77, 0x85, 0x12, 0x82, 0xb4, 0x42, 0xa5, 0x93, 0x43, 0x52, + 0xaa, 0x2a, 0x00, 0x43, 0x3b, 0x24, 0xf7, 0x25, 0x06, 0x38, 0x49, 0x10, + 0xa1, 0x72, 0x9f, 0x73, 0xce, 0x22, 0xe4, 0xcf, 0x55, 0x1d, 0xc7, 0xab, + 0xea, 0x5c, 0xbc, 0xe1, 0x0a, 0x03, 0x69, 0x3f, 0x7d, 0x3b, 0xb9, 0x6f, + 0xad, 0x7d, 0x5d, 0x92, 0x15, 0xe1, 0x6d, 0xab, 0x39, 0x30, 0x3d, 0x1f, + 0xd5, 0x08, 0xc6, 0x9a, 0x5b, 0x93, 0xfb, 0x61, 0xf4, 0xa1, 0x3c, 0xb7, + 0x8c, 0xfe, 0x0c, 0xa0, 0xe3, 0x78, 0x6f, 0x55, 0x85, 0xc1, 0x30, 0x9d, + 0xcb, 0xeb, 0x5f, 0x64, 0x30, 0x45, 0x9a, 0x4a, 0xd9, 0xeb, 0x37, 0xf7, + 0x80, 0x91, 0x82, 0x7a, 0x85, 0x30, 0x6e, 0xc9, 0x14, 0x26, 0xae, 0x4f, + 0x3b, 0xc8, 0x85, 0x88, 0x86, 0x83, 0x80, 0x8b, 0x69, 0x04, 0x83, 0x29, + 0xd3, 0xb0, 0xa8, 0x94, 0xbd, 0x3b, 0x86, 0x0b, 0x4c, 0x00, 0x79, 0x4c, + 0x63, 0x05, 0x6e, 0x5d, 0x83, 0xe1, 0x8d, 0xb4, 0xbf, 0xef, 0x95, 0xc3, + 0xbb, 0xcb, 0x08, 0xe3, 0x06, 0x84, 0xb0, 0x31, 0x8d, 0x34, 0xa5, 0x2a, + 0x80, 0xcd, 0x68, 0xe1, 0x06, 0x64, 0xdd, 0x9b, 0x7f, 0xb3, 0x11, 0x46, + 0x0e, 0xb7, 0x6e, 0xa9, 0x74, 0x24, 0x8d, 0x40, 0x2d, 0xd4, 0x16, 0x42, + 0xf3, 0x64, 0x42, 0x40, 0x5d, 0xe0, 0x4a, 0x90, 0x2d, 0xdf, 0x16, 0xe8, + 0xfe, 0x7b, 0x9b, 0xd6, 0xba, 0xee, 0xb2, 0x46, 0x48, 0xf0, 0xb5, 0x77, + 0x04, 0xe3, 0x4a, 0x21, 0x6c, 0x2a, 0xa5, 0x56, 0x63, 0x38, 0x1b, 0x61, + 0x98, 0xc8, 0x7a, 0x2e, 0x52, 0x5f, 0xaf, 0x1e, 0x61, 0x48, 0x9c, 0xa3, + 0x60, 0x62, 0xc6, 0x0d, 0x50, 0xbf, 0x86, 0x1b, 0xee, 0x7c, 0x2f, 0x70, + 0x3b, 0x01, 0xaa, 0xea, 0x7a, 0x4c, 0x31, 0x8e, 0x49, 0x9a, 0x99, 0x6a, + 0x4e, 0x03, 0xb5, 0x3a, 0x1b, 0xeb, 0xf4, 0xa0, 0xce, 0xe4, 0x0c, 0x8d, + 0x40, 0xac, 0xe8, 0x71, 0x54, 0x33, 0xa1, 0xf8, 0xed, 0xfc, 0x7b, 0x50, + 0xd0, 0x27, 0x00, 0xfe, 0x91, 0xf9, 0x81, 0x58, 0x3b, 0x81, 0x1f, 0xfe, + 0x10, 0xb6, 0x7c, 0x28, 0x70, 0xf3, 0x26, 0xb0, 0x8e, 0x5a, 0xbd, 0xf4, + 0x52, 0x80, 0x02, 0xac, 0x0c, 0xa5, 0xe7, 0x41, 0xb7, 0xb6, 0xac, 0x84, + 0xf5, 0xeb, 0xd7, 0xfb, 0x59, 0xf6, 0xb2, 0x93, 0x0f, 0x7d, 0xa8, 0xc0, + 0x74, 0x7d, 0x7d, 0x10, 0xf8, 0x43, 0x5b, 0x58, 0x09, 0x6c, 0xf1, 0x7e, + 0x22, 0x1b, 0xa1, 0xb0, 0xbe, 0x97, 0xde, 0x2d, 0x85, 0xa0, 0xac, 0xe1, + 0xba, 0x84, 0x8f, 0x3b, 0xd0, 0xf9, 0xe7, 0x6b, 0x90, 0xd6, 0xf9, 0x81, + 0xdb, 0x6e, 0xbd, 0xbd, 0xff, 0x61, 0xb8, 0x70, 0xb7, 0xf2, 0x3b, 0x1f, + 0xb8, 0x6d, 0x06, 0xee, 0xff, 0x47, 0xb8, 0xf0, 0x36, 0xe8, 0xb9, 0x1c, + 0xb8, 0x9c, 0xce, 0x56, 0x11, 0x19, 0x42, 0xbf, 0xd7, 0x51, 0x12, 0x1f, + 0xc8, 0x22, 0xab, 0x52, 0x7d, 0xb8, 0x64, 0x5f, 0x11, 0xea, 0xfa, 0x7a, + 0x11, 0xea, 0x43, 0x0b, 0x02, 0x90, 0xbd, 0xb6, 0xdf, 0xaf, 0x15, 0x91, + 0x0f, 0x3a, 0x84, 0xe7, 0x73, 0x65, 0xaf, 0xba, 0xdf, 0x8a, 0x42, 0x11, + 0xce, 0xca, 0x40, 0x55, 0xe2, 0xfe, 0x34, 0x87, 0xec, 0x49, 0x23, 0xf4, + 0xb1, 0x97, 0xb3, 0x97, 0x8e, 0xec, 0xb5, 0x91, 0xfb, 0xe6, 0x00, 0x73, + 0x7b, 0xe1, 0x35, 0x98, 0x5d, 0x18, 0x82, 0x99, 0x76, 0xef, 0x55, 0xeb, + 0xd2, 0x9f, 0x93, 0x88, 0x5e, 0xab, 0xfe, 0xbc, 0xb4, 0x2e, 0x80, 0x69, + 0x5a, 0xb8, 0x2d, 0xde, 0x21, 0x7a, 0x91, 0xbd, 0xfb, 0xa6, 0x3d, 0x35, + 0x49, 0xb1, 0x7f, 0x00, 0x7b, 0x6a, 0x92, 0xdc, 0x43, 0xe3, 0xb8, 0x75, + 0xd8, 0x70, 0xe1, 0x08, 0xdb, 0xff, 0x60, 0x00, 0xf7, 0xda, 0x0d, 0x20, + 0x25, 0xab, 0xce, 0x1e, 0x64, 0xfc, 0x4f, 0xd7, 0x22, 0xd1, 0x20, 0xa8, + 0x79, 0x6b, 0x13, 0x00, 0x9e, 0xa4, 0x90, 0x0a, 0xf8, 0xd4, 0x62, 0x0c, + 0x7e, 0x34, 0x12, 0x22, 0x84, 0x80, 0x14, 0x41, 0x1f, 0x27, 0xe3, 0x81, + 0x9b, 0xea, 0x52, 0xbf, 0xef, 0xc4, 0x7f, 0x91, 0x67, 0xa1, 0xce, 0x7d, + 0xb1, 0x2e, 0x19, 0x48, 0x0b, 0xf2, 0x25, 0xc9, 0x8c, 0x84, 0x1e, 0x3d, + 0x55, 0x90, 0x2b, 0x01, 0x86, 0x68, 0xf8, 0x54, 0x8a, 0xd0, 0x70, 0x28, + 0x59, 0x07, 0xd7, 0x95, 0x1a, 0x20, 0x25, 0x58, 0x97, 0x36, 0xb9, 0x5e, + 0x2a, 0xc0, 0x16, 0x49, 0xc1, 0xb0, 0x21, 0x98, 0xa8, 0x13, 0xcc, 0x85, + 0x49, 0xe9, 0xbf, 0xe3, 0xec, 0x01, 0x66, 0x0c, 0xb0, 0xa5, 0x4a, 0xdf, + 0xfb, 0x85, 0x55, 0xd0, 0xe7, 0xb3, 0xee, 0x41, 0xab, 0x24, 0xe4, 0x73, + 0x94, 0x0c, 0xe0, 0xac, 0x01, 0xc2, 0xf2, 0x80, 0x5a, 0x09, 0x7d, 0x0d, + 0xb8, 0x8f, 0xe5, 0xa9, 0x20, 0xc9, 0x98, 0x90, 0x35, 0x13, 0xe4, 0x5c, + 0xfd, 0xbe, 0xcb, 0x00, 0xbb, 0xae, 0xfa, 0x62, 0x19, 0x43, 0x81, 0xb5, + 0x84, 0x08, 0x03, 0xb5, 0x54, 0xf9, 0xc3, 0x75, 0x2c, 0x02, 0x96, 0x17, + 0xcd, 0xa1, 0x00, 0x00, 0x20, 0x00, 0x49, 0x44, 0x41, 0x54, 0xb2, 0xae, + 0x20, 0x57, 0x29, 0x44, 0x18, 0x89, 0xa3, 0x20, 0x5a, 0x86, 0x6a, 0xc7, + 0x7e, 0xf0, 0x81, 0x5a, 0x12, 0x89, 0x14, 0x8d, 0xbf, 0x85, 0x4c, 0x12, + 0x0d, 0x21, 0xf3, 0xa3, 0x23, 0x00, 0xab, 0xcb, 0x44, 0xb8, 0x92, 0xa2, + 0xbe, 0x2e, 0x07, 0xba, 0x60, 0xb2, 0x2c, 0x49, 0xd5, 0x05, 0x69, 0xd1, + 0xd9, 0x18, 0xf6, 0x74, 0x9d, 0xa0, 0xb7, 0x5d, 0x7a, 0xd2, 0x22, 0x90, + 0xc1, 0xf1, 0xe2, 0x67, 0xbb, 0x5b, 0x86, 0x7b, 0xad, 0x5b, 0x2f, 0xbd, + 0xc5, 0xa1, 0x1a, 0xfe, 0x7c, 0xff, 0x41, 0xce, 0xcd, 0x76, 0xf3, 0x50, + 0xee, 0x20, 0x4e, 0xee, 0xa0, 0x1a, 0x8c, 0xfd, 0xea, 0x09, 0xce, 0xcd, + 0x76, 0x33, 0xb6, 0x7f, 0x9c, 0x73, 0x87, 0xb2, 0x2c, 0xfd, 0x50, 0x2f, + 0xbf, 0xb9, 0xf5, 0x45, 0x3f, 0x8e, 0x17, 0x3f, 0x23, 0xfb, 0xfd, 0x76, + 0x59, 0xec, 0xed, 0x68, 0xb7, 0x86, 0xbc, 0x9f, 0xed, 0x86, 0x67, 0x55, + 0x50, 0xe7, 0xd1, 0x92, 0x4e, 0xa3, 0xbb, 0xa1, 0x2d, 0xe6, 0x4f, 0x53, + 0x6d, 0xbd, 0x7e, 0xf7, 0x62, 0x9d, 0xe6, 0x62, 0xba, 0x71, 0xc6, 0x4a, + 0x1c, 0xcb, 0x71, 0x41, 0x9a, 0xda, 0x3d, 0x5a, 0xa6, 0x20, 0xcd, 0x20, + 0x9f, 0x4c, 0xb8, 0xbc, 0xb2, 0xdf, 0x3f, 0xc7, 0xce, 0x98, 0x2a, 0xa7, + 0x9f, 0xee, 0xb3, 0x8d, 0x65, 0xce, 0xc8, 0x7e, 0xac, 0x11, 0x3d, 0xfa, + 0xfd, 0xd9, 0x34, 0xf3, 0x49, 0x24, 0x45, 0xd3, 0xe0, 0xba, 0x52, 0x95, + 0x98, 0x5d, 0x73, 0x44, 0x92, 0x15, 0x84, 0x29, 0xa0, 0x0a, 0xab, 0xce, + 0x5b, 0xc1, 0xe8, 0x83, 0xbb, 0x5a, 0x06, 0xb3, 0x6d, 0x1b, 0xea, 0x50, + 0x2c, 0x96, 0xf4, 0x1c, 0xb5, 0x07, 0x12, 0x14, 0xe4, 0xf2, 0x39, 0x0d, + 0xc0, 0x4a, 0x90, 0xe8, 0x4a, 0x51, 0x2b, 0x37, 0xce, 0x09, 0x0a, 0xa3, + 0xd6, 0x00, 0xd5, 0x9a, 0x2b, 0x6c, 0x43, 0xd1, 0xea, 0x1a, 0x49, 0xd7, + 0xa2, 0x83, 0x95, 0x32, 0x4d, 0x2a, 0x75, 0x97, 0x94, 0x21, 0x14, 0x58, + 0xd4, 0x48, 0x20, 0x5a, 0x7c, 0xd8, 0xa7, 0x56, 0xae, 0x41, 0x17, 0xc1, + 0x3d, 0x4d, 0xcb, 0x95, 0x35, 0x4c, 0x91, 0x50, 0x6e, 0x91, 0x39, 0x5b, + 0x0f, 0x9e, 0x25, 0xea, 0x15, 0xa4, 0x91, 0x60, 0x32, 0x17, 0x7a, 0xaf, + 0xe9, 0xcf, 0xd9, 0x4a, 0x3c, 0x64, 0x99, 0x6b, 0xa8, 0x46, 0x4f, 0xdb, + 0x69, 0xfa, 0x97, 0xf7, 0x23, 0x16, 0x09, 0xe4, 0x61, 0xe9, 0x43, 0xba, + 0x9c, 0x69, 0x07, 0x3b, 0x6d, 0x93, 0x12, 0x16, 0x15, 0xe9, 0xf8, 0x65, + 0xda, 0x7c, 0xe7, 0x76, 0xfa, 0xbb, 0x53, 0x8c, 0x7f, 0x7f, 0x9c, 0xcc, + 0xd9, 0x43, 0xd8, 0xcb, 0x2c, 0x0d, 0xd7, 0x9a, 0x5f, 0x1e, 0x80, 0x2a, + 0x0a, 0xa2, 0x0a, 0xfb, 0xfb, 0x65, 0x8e, 0x40, 0xab, 0xc2, 0x71, 0xa2, + 0xf0, 0xa9, 0xb6, 0x69, 0x75, 0xab, 0x27, 0x53, 0xd8, 0xff, 0xc1, 0x2d, + 0x37, 0xf3, 0x3f, 0xef, 0xfd, 0x31, 0x9b, 0x1f, 0xdd, 0x89, 0x9c, 0x95, + 0x0d, 0x00, 0x2a, 0x22, 0x61, 0x9b, 0xd2, 0xea, 0x16, 0xc8, 0x89, 0xc6, + 0x1f, 0x6b, 0x13, 0xa8, 0x2b, 0x02, 0xc4, 0x02, 0x78, 0xe6, 0x97, 0xea, + 0x73, 0x48, 0x1f, 0xeb, 0xfb, 0x53, 0x7e, 0x58, 0xfd, 0x77, 0x15, 0x66, + 0xd0, 0x84, 0x16, 0x71, 0x5b, 0xed, 0x37, 0x01, 0xbd, 0x42, 0xf3, 0xd9, + 0xed, 0x80, 0x5b, 0x2d, 0xd3, 0x3a, 0xfd, 0xed, 0x2c, 0x79, 0xca, 0x6c, + 0x00, 0x6a, 0x2d, 0x3e, 0x21, 0x98, 0xa7, 0x5b, 0x7c, 0x82, 0xdd, 0x74, + 0x0c, 0x70, 0xf0, 0xf0, 0x43, 0x7c, 0x70, 0xe0, 0x32, 0x72, 0x8f, 0xff, + 0x6f, 0x7e, 0xd3, 0xf0, 0x69, 0xa7, 0x58, 0xb1, 0x62, 0xc5, 0x8a, 0x15, + 0x2b, 0x56, 0xac, 0x58, 0xb1, 0x62, 0xc5, 0x8a, 0x15, 0x2b, 0x56, 0xac, + 0x58, 0xb1, 0x62, 0xc5, 0x8a, 0x15, 0x2b, 0x56, 0xac, 0x58, 0xb1, 0x62, + 0xc5, 0x8a, 0xb5, 0x50, 0xc5, 0x50, 0xad, 0x58, 0xb1, 0x62, 0xc5, 0x8a, + 0x15, 0xeb, 0x77, 0x50, 0x61, 0x23, 0x6b, 0x59, 0x97, 0x38, 0xb3, 0x73, + 0x1b, 0xc3, 0x47, 0xc3, 0x47, 0xf7, 0xa3, 0xdb, 0xd7, 0x23, 0xec, 0x42, + 0xc1, 0x5a, 0xed, 0xd2, 0xed, 0xa4, 0x2c, 0x9d, 0x84, 0xed, 0xa4, 0xcc, + 0xed, 0xc2, 0x59, 0xa6, 0x45, 0x69, 0xb6, 0xd1, 0x70, 0x64, 0x21, 0xe5, + 0x69, 0x54, 0xd0, 0x2e, 0xde, 0xe2, 0xed, 0x94, 0x54, 0xce, 0xb2, 0x0e, + 0x24, 0x95, 0x7b, 0x31, 0xbc, 0x30, 0x34, 0xd4, 0x63, 0x13, 0x06, 0xfe, + 0x02, 0x5a, 0xe9, 0x80, 0x58, 0x22, 0x11, 0xd3, 0x50, 0x73, 0x25, 0xf2, + 0x20, 0xe0, 0x4a, 0xa8, 0x07, 0x79, 0x84, 0x0d, 0x6f, 0x85, 0x11, 0x18, + 0xf2, 0x88, 0x16, 0xab, 0x4a, 0x2d, 0x94, 0x39, 0x91, 0x53, 0x96, 0x3e, + 0x50, 0xeb, 0xca, 0x0f, 0x5f, 0xd2, 0x04, 0xf3, 0x72, 0xf4, 0x67, 0xe9, + 0x33, 0x7d, 0x16, 0x6e, 0xa9, 0xc2, 0xda, 0x6f, 0xef, 0x20, 0xdb, 0x67, + 0x31, 0x74, 0xda, 0x80, 0xaa, 0x9e, 0x10, 0xdc, 0x72, 0xd9, 0x2a, 0xae, + 0xbd, 0x63, 0x54, 0x2d, 0xc8, 0x35, 0xd1, 0x85, 0x9e, 0xe7, 0x37, 0x51, + 0x6d, 0xae, 0x8b, 0x5b, 0x6e, 0xfe, 0x2d, 0xb5, 0xfb, 0x7d, 0xe5, 0xa7, + 0x1d, 0x32, 0x7d, 0x96, 0x3a, 0x0f, 0xfe, 0x57, 0x99, 0xe7, 0xc9, 0xd3, + 0x33, 0xd2, 0xa8, 0xab, 0xaf, 0xd3, 0x0a, 0x1b, 0x58, 0x06, 0x09, 0xfd, + 0xe5, 0xeb, 0x5a, 0x55, 0xfa, 0x8b, 0x8a, 0x7d, 0xc0, 0x12, 0xaf, 0x11, + 0xc0, 0xf0, 0x06, 0xf6, 0xbc, 0xe7, 0x83, 0x66, 0x75, 0x1a, 0xe7, 0x4d, + 0x95, 0x36, 0x62, 0xe8, 0x44, 0xb2, 0xdc, 0x7c, 0x6d, 0xbd, 0x96, 0xf2, + 0x2b, 0x00, 0x59, 0xba, 0x63, 0xe8, 0xc5, 0x5b, 0x4d, 0x9e, 0x31, 0xbc, + 0xdd, 0x6d, 0x37, 0xb5, 0x5d, 0x2a, 0x99, 0xa2, 0x38, 0xeb, 0x60, 0x77, + 0xdb, 0xb8, 0x15, 0x97, 0x6c, 0x26, 0x73, 0x54, 0x80, 0xad, 0x91, 0xf3, + 0x86, 0xb9, 0xe1, 0xa7, 0x37, 0xa9, 0x85, 0xf5, 0x10, 0x18, 0x44, 0x69, + 0x85, 0x8f, 0xc3, 0x50, 0xab, 0xb9, 0x00, 0x5c, 0x32, 0x02, 0x57, 0xcb, + 0x66, 0xb3, 0x4d, 0xe1, 0x3c, 0xc0, 0x56, 0x18, 0x1e, 0xd6, 0x0e, 0x8e, + 0x55, 0x72, 0xdd, 0xb6, 0xe5, 0x7b, 0xa3, 0x15, 0x06, 0x35, 0x9d, 0x4a, + 0x33, 0xd0, 0x0a, 0x1a, 0x41, 0x4f, 0x61, 0xff, 0x00, 0x92, 0xd5, 0x1a, + 0x36, 0xd5, 0x2e, 0xce, 0x96, 0x16, 0xd8, 0xa8, 0xb9, 0x80, 0x54, 0xbd, + 0xa1, 0x6d, 0x2b, 0x98, 0x56, 0x6b, 0xb0, 0x56, 0x2f, 0x05, 0x0a, 0xbe, + 0x9d, 0xde, 0x4a, 0x56, 0x52, 0xd0, 0xb1, 0x77, 0x86, 0xf2, 0x5f, 0x19, + 0x89, 0x5d, 0xd0, 0xa0, 0xaf, 0xf9, 0xea, 0xb4, 0x52, 0xef, 0x17, 0x42, + 0xfb, 0x2b, 0x99, 0x1b, 0xda, 0xe5, 0x85, 0x59, 0xa9, 0xcb, 0xe6, 0x1d, + 0xef, 0x64, 0xee, 0x76, 0xfc, 0xe7, 0x0e, 0xea, 0xdb, 0x89, 0x1e, 0x98, + 0x7c, 0x9c, 0x4b, 0x42, 0xb6, 0x21, 0x43, 0xfd, 0xa7, 0xb2, 0xe7, 0xc9, + 0x03, 0xdc, 0x7d, 0xfa, 0xa9, 0xaf, 0x31, 0xc5, 0xa3, 0x53, 0x18, 0xae, + 0x75, 0xaa, 0xd1, 0xda, 0xbd, 0x1d, 0x80, 0x2b, 0xea, 0xde, 0x2e, 0xad, + 0x76, 0x61, 0x3a, 0xc9, 0xa3, 0x3f, 0xe4, 0x7e, 0xd3, 0x02, 0xf7, 0xc3, + 0xda, 0x6a, 0xb4, 0xde, 0xbf, 0x60, 0x81, 0xcf, 0xd2, 0xed, 0x06, 0xf3, + 0x7f, 0xbb, 0xdb, 0xd1, 0xcf, 0x04, 0xcf, 0x30, 0x39, 0x6c, 0x78, 0x78, + 0x46, 0x06, 0x0e, 0x55, 0x30, 0x97, 0x0f, 0x07, 0x10, 0x29, 0x0d, 0xd7, + 0xe2, 0x93, 0xc3, 0xfa, 0xc7, 0xd8, 0x0c, 0xce, 0x9a, 0x4b, 0xa3, 0x8f, + 0x08, 0x48, 0x4a, 0xb6, 0x9c, 0x15, 0x82, 0x0e, 0x89, 0x5b, 0xfc, 0xfd, + 0x4d, 0x85, 0x0b, 0xc8, 0xdf, 0x23, 0xc8, 0x27, 0x51, 0xb6, 0xde, 0xdf, + 0x4e, 0x37, 0x27, 0xb2, 0x6d, 0x03, 0xe2, 0xa1, 0x4d, 0xdc, 0x3a, 0x2d, + 0xe0, 0x2c, 0x60, 0x3a, 0x80, 0x5d, 0x51, 0xd0, 0x06, 0xa4, 0x45, 0x07, + 0x2e, 0xca, 0xc3, 0x63, 0x70, 0xd3, 0x63, 0x79, 0xb8, 0xc8, 0x82, 0x87, + 0x32, 0x0a, 0x46, 0xe5, 0xe9, 0x9b, 0x7a, 0xff, 0x13, 0x73, 0x97, 0xd9, + 0xab, 0x7f, 0x14, 0xa4, 0xd5, 0xd0, 0x2e, 0xaf, 0x45, 0xbd, 0x36, 0x14, + 0x8a, 0xea, 0xcf, 0x83, 0x69, 0x85, 0x8d, 0x6a, 0xa7, 0x73, 0x8d, 0x30, + 0xad, 0x76, 0xfa, 0xfc, 0x06, 0xb8, 0x77, 0x6c, 0xde, 0x60, 0x9b, 0xff, + 0xe9, 0x7a, 0xa0, 0x05, 0x00, 0xd8, 0xdd, 0x8a, 0xb0, 0x36, 0xb4, 0x8c, + 0x23, 0x84, 0xd5, 0xe4, 0x96, 0xcf, 0xab, 0x32, 0xde, 0x70, 0x9d, 0x82, + 0xcf, 0x2e, 0xb4, 0x5f, 0xe1, 0x56, 0x4b, 0xa4, 0xcd, 0x9e, 0xa6, 0xb2, + 0xb4, 0xdb, 0x9f, 0xcf, 0xbf, 0xd5, 0x7e, 0x4b, 0xb7, 0x10, 0x50, 0xcb, + 0xf7, 0x4b, 0xb7, 0x07, 0x5a, 0x2d, 0xa4, 0x6c, 0x0d, 0xf1, 0x42, 0x40, + 0xad, 0xb0, 0x9b, 0x6f, 0xf0, 0x6c, 0xb6, 0x28, 0x87, 0x99, 0x6a, 0x4d, + 0xc9, 0x79, 0x8d, 0x0a, 0x8f, 0x3c, 0xda, 0x8d, 0x42, 0x16, 0xd2, 0x6b, + 0x08, 0x87, 0x9d, 0x98, 0x98, 0xe0, 0xc4, 0x13, 0xde, 0xc6, 0x89, 0x27, + 0x08, 0x4e, 0x3c, 0x21, 0xf0, 0x39, 0xf0, 0xf3, 0xa7, 0x78, 0x7b, 0x04, + 0xa8, 0xe5, 0x69, 0xf2, 0xfe, 0xfb, 0x01, 0xf8, 0x75, 0x06, 0x12, 0x87, + 0x8e, 0xa3, 0x96, 0x79, 0x85, 0x77, 0xe4, 0x69, 0x09, 0xb0, 0x8a, 0x96, + 0x3d, 0x9c, 0x7f, 0x3e, 0x9f, 0x67, 0xc9, 0x92, 0x25, 0x10, 0x02, 0x68, + 0x2d, 0x59, 0xb2, 0xa4, 0x09, 0xb4, 0xd5, 0x4e, 0xa6, 0x69, 0x52, 0x28, + 0x14, 0x28, 0xf3, 0x7b, 0x74, 0xd9, 0x5d, 0x9c, 0x72, 0xca, 0x29, 0x3c, + 0xfa, 0xe8, 0xa3, 0xe4, 0x7f, 0xfd, 0x7b, 0x9c, 0xd9, 0xfd, 0x76, 0x00, + 0x9e, 0x0b, 0xe5, 0x0b, 0x01, 0x50, 0x0b, 0xe0, 0x84, 0x17, 0x5f, 0xc0, + 0x3c, 0xe1, 0x04, 0x38, 0xe1, 0x24, 0x9e, 0xad, 0x3d, 0xcb, 0x3b, 0xcd, + 0xd3, 0xe7, 0x04, 0x6b, 0xcd, 0x55, 0x97, 0xd7, 0xe3, 0xbc, 0x00, 0x8c, + 0x2d, 0xcf, 0x22, 0xee, 0x1c, 0xc7, 0x64, 0x0f, 0xd9, 0x07, 0x87, 0x19, + 0xbd, 0xbf, 0x86, 0xf8, 0x8c, 0x60, 0xf8, 0xf3, 0xab, 0x18, 0xff, 0xd2, + 0x28, 0xe3, 0x9f, 0x54, 0xf7, 0x50, 0xcf, 0xf0, 0x5d, 0x94, 0xc7, 0x19, + 0xdf, 0x05, 0x33, 0x65, 0xb8, 0xfa, 0xb2, 0x11, 0x6e, 0x7d, 0x4c, 0xa5, + 0x63, 0x75, 0x0b, 0x8a, 0xa1, 0xdb, 0x8f, 0x10, 0x90, 0x5e, 0xa2, 0x7e, + 0xcb, 0x66, 0xaa, 0xf9, 0x37, 0x2d, 0xc3, 0x63, 0xee, 0x36, 0x80, 0x2d, + 0x4b, 0x83, 0x57, 0x64, 0x1d, 0xd6, 0xfc, 0xc5, 0x7a, 0x52, 0x22, 0x8d, + 0x58, 0xa2, 0x7e, 0xff, 0x76, 0x1d, 0x26, 0x66, 0xc7, 0x60, 0xd9, 0x08, + 0xb7, 0x7e, 0x77, 0x07, 0x57, 0x7c, 0x42, 0x01, 0xb5, 0xa4, 0x54, 0xe1, + 0x2b, 0xae, 0xcb, 0x8e, 0x47, 0x12, 0xe4, 0xef, 0xd9, 0xcc, 0xe6, 0xaf, + 0x6d, 0x44, 0xcc, 0x66, 0x9a, 0xfa, 0xd2, 0x7e, 0xfe, 0xa9, 0x94, 0xcf, + 0x7c, 0x4e, 0x99, 0x20, 0x84, 0x49, 0xca, 0x74, 0xe1, 0x34, 0x75, 0xff, + 0x92, 0x12, 0xdc, 0x43, 0x15, 0xa4, 0x36, 0x2e, 0x14, 0x49, 0xc1, 0xf6, + 0x3b, 0xb7, 0x37, 0xcc, 0x15, 0xc8, 0xaa, 0xc4, 0x3d, 0x54, 0xa1, 0x22, + 0x4b, 0xa4, 0x44, 0xda, 0x4f, 0xb7, 0x21, 0x1f, 0x43, 0x20, 0x96, 0x40, + 0x2e, 0xe7, 0x90, 0xcd, 0x5a, 0x64, 0x7b, 0x4c, 0x72, 0x33, 0xea, 0xc2, + 0x15, 0x89, 0x04, 0xce, 0xa1, 0xe0, 0x5e, 0x18, 0x6e, 0x9f, 0x5c, 0x2e, + 0xd7, 0xb2, 0xdf, 0x1f, 0x56, 0x22, 0x39, 0xa7, 0x37, 0x10, 0x40, 0x20, + 0xfe, 0x16, 0xb8, 0xad, 0x85, 0xff, 0x3e, 0xfd, 0xb7, 0x1c, 0x58, 0x87, + 0x32, 0x4c, 0x4e, 0x03, 0x25, 0xd4, 0xef, 0xfa, 0xd8, 0x7e, 0xf8, 0x72, + 0xff, 0x31, 0x14, 0xef, 0x3a, 0x02, 0x80, 0x33, 0x05, 0xcb, 0xa7, 0x8e, + 0xb0, 0x87, 0x23, 0xfe, 0x5c, 0xc8, 0x4c, 0x24, 0x4d, 0x13, 0xc5, 0x94, + 0xf8, 0xfb, 0x90, 0xdb, 0x56, 0xe0, 0xdf, 0x81, 0x9f, 0xd2, 0xf1, 0x70, + 0xf6, 0xff, 0xd3, 0x3a, 0x15, 0xd5, 0xbe, 0x10, 0x18, 0x83, 0x13, 0x72, + 0x7b, 0xbd, 0x35, 0x3d, 0x75, 0x98, 0xbe, 0xfe, 0x80, 0xd8, 0xf4, 0xb3, + 0x63, 0xd4, 0xd6, 0x83, 0x38, 0x09, 0x68, 0x00, 0x64, 0xb5, 0xba, 0x6a, + 0xfe, 0xe3, 0x98, 0xce, 0xd2, 0x9e, 0xb3, 0x1c, 0x40, 0x5f, 0x3f, 0xdc, + 0xf6, 0x93, 0x97, 0xf9, 0xc0, 0xa2, 0xc6, 0x32, 0x00, 0xbc, 0x4f, 0x80, + 0xf3, 0x72, 0x70, 0xbc, 0x38, 0x9c, 0xac, 0xa1, 0xe6, 0x94, 0x2a, 0x25, + 0x70, 0xab, 0x60, 0x26, 0x5b, 0x97, 0xf3, 0x36, 0x04, 0x36, 0x87, 0x19, + 0x35, 0x80, 0x3a, 0x5c, 0x89, 0xf4, 0x0d, 0xbb, 0x07, 0x05, 0xcc, 0x05, + 0x7b, 0x0f, 0xfb, 0xb8, 0x80, 0x6b, 0x04, 0x46, 0xe1, 0xdb, 0xca, 0xea, + 0xfa, 0xb4, 0x75, 0xa8, 0x0a, 0xd2, 0x07, 0xcf, 0xd9, 0x7e, 0x5c, 0x41, + 0xeb, 0x52, 0x81, 0x6d, 0x42, 0xcb, 0xd9, 0x18, 0x09, 0x3f, 0xf9, 0x09, + 0x7c, 0xf0, 0x1c, 0x98, 0x5e, 0x58, 0xf7, 0xb8, 0xa5, 0x44, 0xd2, 0x33, + 0xa4, 0x9f, 0xbf, 0x83, 0xe0, 0x01, 0xb5, 0xde, 0xe8, 0x19, 0x81, 0xbb, + 0x6f, 0x1e, 0xe7, 0xd2, 0xab, 0x55, 0xbf, 0x7b, 0x21, 0x60, 0xac, 0x81, + 0xd3, 0x00, 0x32, 0xac, 0xff, 0xec, 0x6f, 0x1f, 0xa6, 0x65, 0x7f, 0x54, + 0x52, 0xfc, 0xfe, 0xd1, 0xb7, 0x94, 0x07, 0x88, 0xe9, 0x1c, 0xb0, 0x95, + 0x41, 0x61, 0xf6, 0x26, 0x71, 0x65, 0x82, 0x4c, 0x4f, 0x86, 0x92, 0xdc, + 0x03, 0x58, 0x50, 0xcf, 0x35, 0x85, 0x76, 0xa5, 0xab, 0xc0, 0x5a, 0xee, + 0x58, 0x24, 0x8d, 0x09, 0xe5, 0x5f, 0x17, 0xd8, 0x5d, 0x59, 0x5c, 0x59, + 0xc2, 0xad, 0x3b, 0xd8, 0x5d, 0x59, 0x66, 0xaa, 0x63, 0xa8, 0xbb, 0xbe, + 0x4e, 0xa3, 0x5e, 0x52, 0x70, 0x29, 0xf6, 0x84, 0xf6, 0x07, 0xf1, 0xa0, + 0x5b, 0x90, 0x26, 0x95, 0xb6, 0x70, 0x67, 0x6d, 0xa4, 0x2c, 0x92, 0xea, + 0xcd, 0xaa, 0xfd, 0xea, 0x98, 0x9e, 0x03, 0xb6, 0x51, 0xbf, 0xf6, 0xa2, + 0x9a, 0x37, 0x26, 0x32, 0x2e, 0xa8, 0x8b, 0x60, 0xae, 0xd7, 0x50, 0x98, + 0x04, 0x57, 0x7f, 0x19, 0x23, 0x0c, 0xda, 0xea, 0x44, 0x89, 0x16, 0x6e, + 0xd7, 0xde, 0x71, 0x09, 0x00, 0xd7, 0x5d, 0xf6, 0x23, 0x56, 0xf7, 0x41, + 0x26, 0xdb, 0xcf, 0xb5, 0x77, 0x5c, 0x07, 0xf2, 0xda, 0x50, 0x59, 0xc3, + 0x7d, 0xc9, 0xa2, 0x5f, 0xee, 0xa0, 0xbe, 0x1e, 0xb0, 0xd8, 0xc3, 0xe4, + 0x65, 0x08, 0x00, 0x67, 0x60, 0x0a, 0x1b, 0xb7, 0xba, 0x11, 0x0f, 0x65, + 0xb5, 0xaa, 0xef, 0x7a, 0x46, 0xa7, 0xd7, 0x72, 0xcd, 0x47, 0x32, 0x6c, + 0xdd, 0xb9, 0x03, 0x7b, 0x99, 0x6a, 0x57, 0x57, 0x5a, 0x1a, 0xac, 0x35, + 0x7f, 0x5d, 0x76, 0xeb, 0xd4, 0xbc, 0xbf, 0x19, 0xed, 0xde, 0xa3, 0xb7, + 0x33, 0xb4, 0x57, 0x4f, 0x64, 0xbb, 0x9b, 0x16, 0x60, 0x2e, 0xed, 0xd0, + 0xfb, 0x39, 0x28, 0x74, 0x02, 0x99, 0xfa, 0xd0, 0x87, 0x1a, 0x8f, 0x77, + 0x76, 0x10, 0xa7, 0x03, 0x15, 0xd6, 0xab, 0xf9, 0xa9, 0xcd, 0x9f, 0x53, + 0xc7, 0xf7, 0x47, 0xca, 0xf2, 0x83, 0x1f, 0xa8, 0xcc, 0xd6, 0xaf, 0x57, + 0x1e, 0xbd, 0x7a, 0xb2, 0xeb, 0xc2, 0x0b, 0xb7, 0x70, 0xff, 0x47, 0x7a, + 0x61, 0xfd, 0x4a, 0x05, 0xde, 0xda, 0x09, 0xeb, 0xbd, 0x9f, 0xca, 0x16, + 0xd8, 0xb2, 0xb2, 0xc0, 0xca, 0xf5, 0x7a, 0x6e, 0x6e, 0x0b, 0xcd, 0x10, + 0xb0, 0xf5, 0x2a, 0x1c, 0xeb, 0x23, 0xb0, 0xb0, 0x48, 0xbd, 0x1e, 0xfa, + 0xb3, 0x1e, 0x36, 0x7d, 0x6f, 0x86, 0x4d, 0x22, 0x80, 0x67, 0x5d, 0x7e, + 0x39, 0xcc, 0xcc, 0xe8, 0x72, 0xec, 0x86, 0xfb, 0x05, 0x3c, 0xd4, 0xd3, + 0xc3, 0xdf, 0x31, 0xc3, 0xfd, 0x0f, 0xeb, 0x7a, 0x08, 0x85, 0x57, 0xe3, + 0x36, 0xe0, 0xaa, 0x0e, 0x1a, 0x22, 0x32, 0x0f, 0x6c, 0x1a, 0x82, 0x12, + 0x12, 0xf6, 0xe6, 0xd5, 0xdc, 0xbf, 0x01, 0xa5, 0xb2, 0xa3, 0xe0, 0x25, + 0xc9, 0x10, 0x30, 0xab, 0x2a, 0xe7, 0x7f, 0x57, 0xb2, 0x2f, 0xaf, 0x20, + 0x5b, 0xbd, 0x36, 0x62, 0x6f, 0x1e, 0x71, 0x56, 0x06, 0xd9, 0x67, 0x2b, + 0x37, 0x3d, 0x0f, 0x2c, 0xa5, 0x0c, 0xc2, 0x24, 0x05, 0x3c, 0xdc, 0x7c, + 0x3f, 0x99, 0x57, 0x91, 0x0f, 0x39, 0xf8, 0x0a, 0x8d, 0x7b, 0xe7, 0x7a, + 0xb3, 0x65, 0x9a, 0x26, 0x52, 0x06, 0x63, 0x6a, 0x2b, 0x9d, 0xc1, 0x29, + 0x05, 0xd7, 0x99, 0x10, 0x82, 0x99, 0xaf, 0x6d, 0x22, 0x7b, 0xfe, 0x30, + 0xc3, 0xa9, 0x34, 0x37, 0xfd, 0xeb, 0x66, 0x72, 0x0f, 0x8d, 0x63, 0x2e, + 0xb3, 0x91, 0xe5, 0x0a, 0x37, 0x7d, 0x7f, 0x14, 0xbe, 0xbc, 0x81, 0xcc, + 0x69, 0x36, 0x95, 0xd5, 0xeb, 0x19, 0x97, 0x5b, 0x55, 0xba, 0x22, 0x4d, + 0xbb, 0x67, 0xb1, 0x0f, 0x1f, 0xf3, 0x68, 0xc0, 0x84, 0x00, 0x7e, 0x02, + 0xff, 0xbc, 0xbc, 0x9e, 0x1f, 0x9d, 0x18, 0x4a, 0x0b, 0x26, 0x4b, 0xa1, + 0x77, 0xa2, 0x40, 0x5e, 0x03, 0xbc, 0xa5, 0x6c, 0x2e, 0x69, 0x05, 0x70, + 0xb4, 0xbf, 0x17, 0x4f, 0x4a, 0xe8, 0x91, 0x90, 0x93, 0x01, 0x0f, 0x4b, + 0x41, 0x9f, 0x14, 0x98, 0x4b, 0x7a, 0x0d, 0xdd, 0x90, 0x58, 0x70, 0xe0, + 0x24, 0x05, 0x2e, 0xb0, 0xae, 0xdb, 0x62, 0x62, 0xbf, 0x83, 0x65, 0x0a, + 0x44, 0x59, 0x92, 0x4a, 0x0b, 0x2a, 0x65, 0x75, 0xc7, 0x2e, 0x49, 0xc8, + 0xa4, 0xa1, 0xe2, 0x8d, 0x8f, 0xd0, 0xa0, 0x43, 0x33, 0x45, 0xc9, 0xad, + 0x81, 0x11, 0xbc, 0x3f, 0x9d, 0x41, 0x7d, 0xe8, 0x68, 0x72, 0xef, 0x24, + 0x23, 0x17, 0x8d, 0x50, 0xd2, 0xe3, 0x99, 0xc9, 0xbd, 0x6a, 0xae, 0x6c, + 0xf8, 0xfc, 0x61, 0xb2, 0xcb, 0x61, 0x2c, 0x9f, 0xf7, 0x8b, 0x91, 0x73, + 0x55, 0x8f, 0x2a, 0x61, 0x28, 0xb0, 0x55, 0xa5, 0xac, 0xca, 0x58, 0x24, + 0x18, 0x17, 0x26, 0x22, 0x75, 0x18, 0xe8, 0x02, 0xea, 0x0a, 0xb6, 0x85, + 0x0e, 0x97, 0x42, 0x60, 0x1a, 0xaa, 0x5f, 0x55, 0xd1, 0xb0, 0x54, 0x57, + 0x08, 0x06, 0x92, 0x12, 0x8f, 0x29, 0x69, 0xd6, 0x05, 0x32, 0x09, 0x56, + 0x32, 0x85, 0x53, 0xad, 0x20, 0xeb, 0x35, 0x84, 0xa1, 0x9e, 0x18, 0x1e, + 0x50, 0xcb, 0x83, 0xaf, 0x79, 0xed, 0xeb, 0x94, 0xdd, 0x86, 0x56, 0xab, + 0xb8, 0xaa, 0x30, 0x0e, 0x12, 0xa7, 0x83, 0x9f, 0xc2, 0x93, 0x08, 0x4e, + 0x47, 0x36, 0x6e, 0x9f, 0xed, 0x6e, 0xed, 0xfe, 0x06, 0x6d, 0xb3, 0x1c, + 0xe1, 0xdc, 0xa1, 0x2c, 0x77, 0xfe, 0x38, 0xe7, 0x83, 0xb5, 0xc2, 0xfa, + 0xfd, 0xd3, 0xba, 0x71, 0x0e, 0x95, 0x01, 0x28, 0xb1, 0xa4, 0xe3, 0x74, + 0x0b, 0x62, 0x92, 0x11, 0xd9, 0xef, 0xbb, 0x8d, 0x89, 0xa9, 0x86, 0xe3, + 0xb7, 0xf2, 0x76, 0xe5, 0xb1, 0x6a, 0xe2, 0xa2, 0xff, 0x82, 0x0b, 0x98, + 0x7a, 0xe0, 0x01, 0xbf, 0x2d, 0x0e, 0xbc, 0x7a, 0x9a, 0xef, 0x7f, 0xcf, + 0xcb, 0x6a, 0xf0, 0xf1, 0xea, 0xd3, 0xaf, 0xcc, 0x7f, 0xa2, 0x51, 0xf3, + 0x02, 0x56, 0x57, 0x8a, 0x99, 0xd9, 0x12, 0x99, 0x9e, 0x34, 0xc5, 0x52, + 0x63, 0x7f, 0x2e, 0x37, 0x5d, 0xc4, 0x14, 0x82, 0x8a, 0x2b, 0x49, 0x99, + 0x8d, 0x6b, 0x0e, 0x12, 0x66, 0x23, 0xdc, 0xca, 0x4a, 0x0a, 0xa8, 0x0b, + 0xf2, 0xc5, 0x3c, 0x99, 0xf7, 0xdb, 0x0c, 0x64, 0x87, 0xf4, 0xef, 0x4f, + 0x32, 0x76, 0xef, 0x18, 0x43, 0x2b, 0x32, 0x54, 0xea, 0x40, 0x5d, 0x22, + 0xab, 0x79, 0x2a, 0xb3, 0x7a, 0x5e, 0x64, 0x99, 0x0d, 0x65, 0x89, 0x02, + 0x66, 0x09, 0x64, 0x49, 0x5d, 0xcf, 0xb5, 0xb2, 0xce, 0xcb, 0xf0, 0xde, + 0xcb, 0x27, 0xd4, 0x56, 0x87, 0xf5, 0x64, 0x76, 0x99, 0x58, 0x5d, 0x66, + 0x13, 0x6c, 0x34, 0x6b, 0x65, 0xc8, 0x39, 0x79, 0x2c, 0x43, 0x50, 0x72, + 0x1c, 0x2a, 0xd2, 0x61, 0xe8, 0xfd, 0x59, 0x12, 0x75, 0x05, 0xa7, 0xdb, + 0xb5, 0x6f, 0x82, 0x4a, 0x45, 0x32, 0xb2, 0x62, 0x04, 0x61, 0x42, 0xca, + 0x10, 0x38, 0xa1, 0x77, 0xd0, 0xd2, 0x05, 0xab, 0x4b, 0x20, 0xd2, 0x26, + 0x99, 0xaa, 0xc4, 0x95, 0x2e, 0x09, 0x43, 0xdd, 0xef, 0xbd, 0xdc, 0x85, + 0x21, 0xa8, 0x51, 0x23, 0x65, 0xa7, 0x90, 0x87, 0x25, 0xb2, 0x2e, 0xd9, + 0xf5, 0xe0, 0x2e, 0x36, 0x7c, 0xf6, 0x1a, 0x26, 0x73, 0x7b, 0x90, 0x46, + 0xa2, 0x21, 0xac, 0xbf, 0x66, 0xa1, 0x4b, 0xf5, 0x27, 0x9d, 0x82, 0x83, + 0xd5, 0x6b, 0x51, 0xab, 0x82, 0x77, 0xc5, 0xa6, 0xec, 0x14, 0x15, 0x47, + 0x32, 0xfc, 0xfe, 0x61, 0x8a, 0xe1, 0x0f, 0x7e, 0x88, 0x04, 0x63, 0x3b, + 0xc7, 0xb0, 0x0c, 0xa8, 0x38, 0xaa, 0xdd, 0xc7, 0x27, 0xf6, 0xd0, 0xdf, + 0xad, 0xda, 0xb1, 0x93, 0x1e, 0xa7, 0x07, 0x77, 0xf2, 0xc0, 0x53, 0xd6, + 0x45, 0x6a, 0xbe, 0xca, 0xb9, 0xaf, 0xd8, 0xe0, 0x0f, 0x60, 0x7f, 0x32, + 0x43, 0xf1, 0x3b, 0xa1, 0x3e, 0x66, 0xb7, 0xf0, 0x21, 0x54, 0x51, 0x60, + 0x54, 0x14, 0x62, 0xe5, 0xfb, 0x4d, 0xb8, 0x3c, 0xb8, 0xe5, 0x66, 0x6e, + 0xbd, 0x6d, 0x3b, 0x00, 0x57, 0x5c, 0xbe, 0xc6, 0xf7, 0xdb, 0x78, 0xe6, + 0x4a, 0xae, 0x9f, 0xfd, 0x41, 0x53, 0x7a, 0xd1, 0xb4, 0x7c, 0xbf, 0x83, + 0x9d, 0x3f, 0xc7, 0xbc, 0x38, 0xef, 0x3b, 0xae, 0x1d, 0x22, 0xba, 0x7d, + 0x7a, 0x0b, 0x01, 0x8e, 0x79, 0x6d, 0x12, 0x8d, 0xd3, 0x0e, 0x44, 0x26, + 0x67, 0x25, 0x87, 0xde, 0xed, 0x72, 0x88, 0x50, 0x3f, 0xe5, 0xa9, 0xa2, + 0x0f, 0xd9, 0x0a, 0xc3, 0xb6, 0xa2, 0xca, 0x3d, 0xfe, 0xbf, 0x59, 0x7c, + 0x82, 0x8d, 0x13, 0x43, 0xb5, 0x62, 0xc5, 0x8a, 0x15, 0x2b, 0x56, 0xac, + 0x58, 0xb1, 0x62, 0xc5, 0x8a, 0x15, 0x2b, 0x56, 0xac, 0x58, 0xb1, 0x62, + 0xc5, 0x8a, 0x15, 0x2b, 0x56, 0xac, 0x58, 0xb1, 0x62, 0xc5, 0x8a, 0x15, + 0xeb, 0xa8, 0x14, 0x43, 0xb5, 0x62, 0xc5, 0x8a, 0x15, 0x2b, 0x56, 0xac, + 0xdf, 0x41, 0x09, 0x43, 0x84, 0xbe, 0x6e, 0x29, 0xb0, 0x96, 0x59, 0xb8, + 0x91, 0x2f, 0x2a, 0xb7, 0x32, 0x76, 0xf6, 0x60, 0x44, 0xe1, 0xb8, 0x61, + 0xb7, 0x70, 0x9c, 0x4e, 0xc3, 0x46, 0xf7, 0xdb, 0xe5, 0xdd, 0xaa, 0x0e, + 0xad, 0xea, 0xd4, 0x2a, 0xdd, 0x76, 0x75, 0x58, 0x48, 0xd8, 0x76, 0x75, + 0x68, 0xe5, 0x17, 0x95, 0xd3, 0xe2, 0x2b, 0xd3, 0x6d, 0xd3, 0x9d, 0xb7, + 0xe6, 0xc1, 0x12, 0xfc, 0x1a, 0x60, 0x77, 0x59, 0x14, 0xa9, 0x50, 0xab, + 0x4b, 0xb5, 0x40, 0x54, 0x02, 0x42, 0xea, 0x0f, 0x2b, 0xeb, 0xd5, 0xd7, + 0xf5, 0xd0, 0xfa, 0x78, 0x03, 0x7f, 0x61, 0xb9, 0xa8, 0xea, 0xc5, 0xfe, + 0xde, 0x02, 0xc0, 0xba, 0xd0, 0x5f, 0xaf, 0x0e, 0x2d, 0xf3, 0x97, 0x9e, + 0x81, 0x81, 0xab, 0xdc, 0xea, 0xaa, 0xac, 0x12, 0x5d, 0x57, 0xbd, 0x88, + 0x5c, 0x48, 0x89, 0x03, 0xa0, 0x8d, 0x12, 0xae, 0xfa, 0xce, 0x0e, 0x6e, + 0x01, 0x36, 0xac, 0x58, 0x01, 0xc0, 0x55, 0xdf, 0xda, 0xc1, 0xd0, 0x69, + 0x03, 0x58, 0x66, 0x63, 0xfb, 0x38, 0xae, 0x5a, 0x18, 0x9f, 0x2b, 0x38, + 0x78, 0xc5, 0xcd, 0xf4, 0xa4, 0xb8, 0xea, 0x5b, 0x3b, 0xb8, 0xe5, 0xd3, + 0xab, 0xb9, 0xea, 0x8e, 0x1d, 0x8d, 0x75, 0x6f, 0x01, 0x26, 0x70, 0x66, + 0x8b, 0x58, 0x5d, 0x02, 0x79, 0x30, 0xa8, 0x8b, 0x74, 0xf5, 0xf9, 0x13, + 0xba, 0xba, 0xf5, 0xc6, 0x76, 0x97, 0xf5, 0x00, 0x6c, 0xe5, 0x4a, 0x65, + 0xa8, 0xe4, 0x95, 0xcd, 0x14, 0xc2, 0x5f, 0x4c, 0xee, 0x54, 0x25, 0x96, + 0x19, 0xca, 0xd3, 0x2b, 0x7e, 0xe4, 0x9c, 0x8a, 0xa4, 0x50, 0x40, 0xad, + 0x1e, 0x05, 0xd4, 0x9a, 0x9a, 0x4e, 0xd0, 0xdf, 0x57, 0x53, 0x70, 0xad, + 0xa4, 0x67, 0xec, 0xa1, 0x6b, 0x51, 0xef, 0x00, 0x10, 0xf6, 0x3a, 0x29, + 0x9d, 0x4c, 0x53, 0xfa, 0x5d, 0x01, 0x40, 0x45, 0x46, 0x16, 0x29, 0xd3, + 0xd4, 0xdb, 0xf6, 0x06, 0xd4, 0x96, 0xc8, 0x60, 0x9f, 0x95, 0x62, 0xcf, + 0xc3, 0xad, 0xe1, 0x4f, 0xd9, 0xe5, 0x59, 0x4a, 0xd3, 0x2e, 0xa4, 0xa1, + 0x58, 0x9a, 0xff, 0x2b, 0xf3, 0xad, 0xca, 0x31, 0x97, 0x44, 0xb2, 0xd1, + 0x50, 0x3c, 0xad, 0x8f, 0x3d, 0x77, 0xa1, 0xaf, 0x3f, 0x77, 0x9e, 0x2b, + 0x3b, 0xbd, 0x2c, 0x4d, 0xa2, 0x0e, 0xc5, 0xd2, 0xd1, 0x9d, 0x2b, 0xcf, + 0x10, 0xa8, 0x9d, 0x72, 0xb9, 0x9c, 0x0f, 0x9b, 0x5a, 0x75, 0xf1, 0x08, + 0xc5, 0x10, 0x50, 0x31, 0x9b, 0xc9, 0x50, 0x9c, 0x75, 0x28, 0x1e, 0x2c, + 0x62, 0x77, 0xdb, 0x8c, 0x3f, 0xb2, 0x87, 0x8c, 0x1d, 0x7c, 0xd9, 0xd6, + 0xea, 0xb2, 0x3a, 0x86, 0x6c, 0x65, 0xec, 0x0c, 0xa3, 0xf7, 0x8c, 0x36, + 0x00, 0xab, 0xc2, 0xdb, 0x86, 0x32, 0x7b, 0x46, 0x4c, 0x1e, 0xbc, 0x2f, + 0xb4, 0xef, 0xc9, 0x4b, 0xc7, 0xf3, 0xf3, 0xea, 0x59, 0x9c, 0x75, 0xb0, + 0x97, 0x59, 0xa4, 0x44, 0xe3, 0x79, 0x70, 0x0f, 0x95, 0xa8, 0xc8, 0x0a, + 0x29, 0x91, 0xc2, 0x5c, 0x12, 0xc0, 0x64, 0xf2, 0xc5, 0x7c, 0x43, 0xfb, + 0x84, 0x21, 0x5a, 0x4d, 0x65, 0x7d, 0x9d, 0x0c, 0x86, 0xa2, 0x8a, 0x82, + 0x99, 0x56, 0x12, 0x98, 0x23, 0x46, 0x21, 0x56, 0x1e, 0xfc, 0xc9, 0x03, + 0x55, 0x85, 0xfd, 0x9b, 0xdd, 0x7a, 0x7d, 0x78, 0x95, 0x02, 0x48, 0xad, + 0x64, 0x0b, 0x3b, 0x9b, 0x80, 0x53, 0xe1, 0xf4, 0x3d, 0xa0, 0x14, 0xa1, + 0xfc, 0xbc, 0xe3, 0x95, 0xf4, 0xb2, 0x33, 0x94, 0xbe, 0xe7, 0xe6, 0xe5, + 0xd1, 0x1b, 0xd9, 0x57, 0x69, 0x14, 0xe8, 0xd5, 0xff, 0xbc, 0xfd, 0xb0, + 0x7f, 0x63, 0x5d, 0x9a, 0x11, 0x55, 0xbd, 0x30, 0x6f, 0x9d, 0xbc, 0x7c, + 0x82, 0xbc, 0x1b, 0xe3, 0xef, 0x0c, 0xe5, 0xd3, 0x9c, 0x7e, 0x63, 0x9b, + 0x79, 0xe1, 0x3c, 0xf7, 0x70, 0x7d, 0x76, 0x52, 0xe0, 0x8f, 0x43, 0xf1, + 0xbc, 0x7c, 0xc3, 0xfe, 0x9d, 0xea, 0x92, 0x5d, 0xf0, 0xa3, 0x15, 0x50, + 0xfb, 0xcf, 0xc7, 0xa9, 0x01, 0x7b, 0x44, 0x82, 0xe1, 0xfb, 0x40, 0xea, + 0x7b, 0x4d, 0x3b, 0x28, 0x54, 0xd4, 0x2f, 0x0c, 0x9b, 0xea, 0x04, 0x7a, + 0xd5, 0x2e, 0xfc, 0xa6, 0x7a, 0xe0, 0x76, 0x40, 0xef, 0x9f, 0x1a, 0xd9, + 0x0f, 0x87, 0x09, 0x2b, 0xea, 0xbe, 0xa9, 0xde, 0x7a, 0x3f, 0x1a, 0x67, + 0x21, 0xe1, 0xa7, 0xea, 0x41, 0xd9, 0x37, 0xd4, 0x83, 0x36, 0x98, 0xac, + 0xc3, 0x40, 0x8b, 0xfd, 0x0d, 0xba, 0x4c, 0xd1, 0x76, 0x5c, 0xa7, 0xdd, + 0xb7, 0x1a, 0xcd, 0xfb, 0x12, 0xd8, 0x16, 0x09, 0x7f, 0xa5, 0x0e, 0x13, + 0x75, 0x5f, 0x53, 0x87, 0xe2, 0x6b, 0x9d, 0xf9, 0x3a, 0x23, 0xa3, 0xb6, + 0xa5, 0x12, 0xee, 0xbe, 0x16, 0x46, 0x0d, 0xdf, 0x79, 0xed, 0x30, 0xa9, + 0x6d, 0x17, 0x9b, 0x5c, 0x79, 0xaf, 0x4b, 0xc2, 0x82, 0x2d, 0x67, 0x99, + 0x48, 0xd9, 0x0f, 0xc0, 0xfa, 0xbd, 0x2e, 0x1b, 0x2a, 0x70, 0xeb, 0xd9, + 0x42, 0xdd, 0x5c, 0xbe, 0x9d, 0x86, 0x4f, 0xe9, 0x67, 0x8b, 0x07, 0xd7, + 0xfa, 0x54, 0x09, 0x1e, 0x5e, 0x8f, 0xbc, 0x30, 0x0b, 0x7b, 0x51, 0x40, + 0x2d, 0xb1, 0x1d, 0xcc, 0x04, 0x94, 0x56, 0xa9, 0x30, 0xef, 0xcf, 0x43, + 0xaf, 0x03, 0xf7, 0x65, 0xe0, 0x13, 0x2e, 0xcc, 0x98, 0x50, 0x1e, 0x81, + 0xde, 0x9b, 0xe0, 0x33, 0x26, 0x7c, 0x53, 0x17, 0xe4, 0x33, 0x9d, 0x95, + 0xb7, 0x1d, 0x38, 0xcb, 0x73, 0x7f, 0xcd, 0x70, 0xad, 0x35, 0x9b, 0xb8, + 0xfd, 0xf9, 0x29, 0xd6, 0xde, 0x13, 0x02, 0x6a, 0x4d, 0xe7, 0xa0, 0xaf, + 0x45, 0xdf, 0xe1, 0xe2, 0x11, 0x05, 0xe1, 0x02, 0xf8, 0xe6, 0xd6, 0x46, + 0xbf, 0x77, 0x0c, 0x74, 0x94, 0x9d, 0x9c, 0xb9, 0x09, 0x0a, 0x35, 0x44, + 0x9f, 0x32, 0x6b, 0x72, 0xa7, 0x6b, 0x98, 0x7d, 0x09, 0xb6, 0xfe, 0x6d, + 0x1e, 0xe7, 0x93, 0x1b, 0x49, 0xe9, 0x7e, 0x6a, 0x45, 0x3a, 0x58, 0x9e, + 0x91, 0x53, 0x59, 0xed, 0xaf, 0xb9, 0x37, 0x30, 0xe8, 0x1e, 0xbe, 0x75, + 0x8b, 0xda, 0xae, 0xf8, 0x11, 0xc5, 0x99, 0xe0, 0x79, 0x53, 0x0c, 0x11, + 0x79, 0xbe, 0xf8, 0xa5, 0xb5, 0x1d, 0x95, 0xe9, 0xad, 0x20, 0x61, 0xa6, + 0xc2, 0xfc, 0x01, 0x04, 0x66, 0x07, 0x63, 0x9a, 0x36, 0x69, 0x75, 0xe9, + 0x01, 0x81, 0x6c, 0xdd, 0x9f, 0x69, 0x05, 0xd4, 0x6a, 0x19, 0xee, 0x28, + 0xca, 0xa0, 0xe2, 0x1f, 0x9d, 0xa2, 0x20, 0xa8, 0xb0, 0x96, 0x02, 0xbf, + 0x02, 0x9e, 0xaf, 0xfe, 0x9a, 0x93, 0x92, 0xef, 0xf0, 0xb7, 0x2f, 0xbe, + 0xf4, 0x02, 0x6f, 0x9f, 0x27, 0xdd, 0x41, 0x73, 0x90, 0x17, 0xbb, 0x1e, + 0xe3, 0x60, 0x39, 0x41, 0x57, 0xa6, 0xab, 0x25, 0x54, 0xcb, 0xcb, 0xd7, + 0x2b, 0x83, 0xb7, 0x5d, 0x9c, 0xc9, 0xf0, 0x4c, 0x3e, 0xcf, 0xf1, 0x21, + 0xa0, 0x16, 0xe0, 0x1f, 0x2f, 0xce, 0x64, 0x78, 0xae, 0x45, 0x7a, 0xe1, + 0xba, 0x14, 0x0a, 0x05, 0x3f, 0xce, 0x29, 0x67, 0x9e, 0xc9, 0xa3, 0x8f, + 0x3e, 0xca, 0x99, 0x67, 0x9e, 0xc9, 0xd4, 0xfd, 0xf7, 0xf3, 0x9b, 0xdf, + 0xfc, 0x86, 0x42, 0xa1, 0xc0, 0xf1, 0x34, 0xdb, 0x31, 0x3f, 0x5b, 0x7b, + 0x96, 0x77, 0x1e, 0x79, 0x01, 0x53, 0xc3, 0xe0, 0x78, 0x61, 0x06, 0x61, + 0xbc, 0x63, 0x9e, 0xda, 0xb6, 0xaf, 0xcb, 0xeb, 0xa9, 0xc1, 0x5d, 0x79, + 0x38, 0xdf, 0x22, 0xb7, 0xdb, 0x21, 0x77, 0xff, 0x38, 0x26, 0x20, 0xaa, + 0x36, 0x63, 0xdf, 0x29, 0x31, 0xf2, 0xc9, 0x34, 0x23, 0x1f, 0xbe, 0x55, + 0x05, 0xac, 0xdf, 0xc5, 0xf8, 0xae, 0x71, 0x66, 0x0e, 0xba, 0xf4, 0x74, + 0x9b, 0xa4, 0xfb, 0x86, 0x19, 0xcd, 0x81, 0x58, 0xa4, 0x6a, 0x6a, 0x26, + 0x05, 0xd9, 0x33, 0x32, 0xca, 0x20, 0xdc, 0xb3, 0x4f, 0xaf, 0x2b, 0xd8, + 0x4d, 0x7e, 0x7f, 0x09, 0xbb, 0xc7, 0x6e, 0xca, 0xfb, 0xca, 0x4f, 0x5c, + 0xca, 0xb6, 0xef, 0xde, 0xdd, 0xb6, 0x6c, 0xd9, 0xac, 0x1a, 0x0f, 0x8d, + 0xef, 0xca, 0x33, 0xbc, 0x22, 0x4b, 0x2e, 0xe7, 0x20, 0xeb, 0x20, 0xa5, + 0xcb, 0x8e, 0x09, 0x60, 0xd9, 0x08, 0x95, 0x7d, 0x3b, 0x28, 0x1d, 0xac, + 0x50, 0x32, 0x60, 0xd3, 0x97, 0x6f, 0x80, 0xfa, 0x33, 0x6c, 0xfc, 0x5b, + 0x75, 0x8f, 0x73, 0x1e, 0xde, 0x46, 0xe6, 0xc3, 0x1b, 0xd9, 0xf6, 0x60, + 0xa8, 0x0d, 0x43, 0x7d, 0xed, 0xe1, 0x41, 0x75, 0xaf, 0x1c, 0x9f, 0xc8, + 0x61, 0x59, 0x19, 0x04, 0x50, 0xd3, 0x65, 0xaf, 0x49, 0x70, 0x0f, 0x29, + 0x83, 0x6f, 0x91, 0x12, 0x64, 0xb3, 0xc1, 0x98, 0x38, 0xdc, 0x57, 0x0f, + 0xa7, 0x57, 0x91, 0x25, 0x5d, 0x6e, 0x8b, 0xfc, 0x8c, 0xc4, 0x4c, 0xaa, + 0x31, 0x5d, 0xc5, 0x75, 0x11, 0xc2, 0x04, 0x5c, 0xdc, 0x43, 0x35, 0x2a, + 0xae, 0x4b, 0x71, 0x36, 0x81, 0x30, 0x6a, 0xa4, 0x05, 0x24, 0x92, 0x29, + 0x6a, 0x46, 0x05, 0x1b, 0x9b, 0x62, 0xa1, 0x84, 0x7b, 0xd8, 0xf1, 0x21, + 0x5a, 0xc5, 0x42, 0x89, 0x6c, 0x36, 0x4b, 0x2e, 0x97, 0xf3, 0xe1, 0x64, + 0xae, 0xb6, 0x26, 0xef, 0xe9, 0x36, 0x21, 0x09, 0xb5, 0x6a, 0x85, 0xf4, + 0x12, 0x73, 0x5e, 0x6c, 0xce, 0x56, 0x20, 0x71, 0xfc, 0x31, 0x5c, 0xf1, + 0xf2, 0x11, 0x86, 0x50, 0x86, 0xfa, 0x61, 0x39, 0x28, 0x50, 0xf8, 0xaf, + 0xf4, 0xf1, 0x62, 0xc0, 0x5d, 0x7b, 0x2c, 0xe9, 0xdb, 0x5f, 0x05, 0xe0, + 0x48, 0xff, 0x31, 0x58, 0x77, 0x1d, 0xa1, 0xda, 0x0f, 0x87, 0xa6, 0xe0, + 0x0f, 0x09, 0xc0, 0x4f, 0xed, 0xf0, 0x8d, 0xa7, 0xa0, 0x80, 0x5a, 0xb7, + 0x1e, 0x7f, 0x0c, 0xb5, 0x97, 0x8f, 0xf8, 0xf9, 0x7f, 0x09, 0x05, 0xf6, + 0x58, 0xe8, 0xe8, 0xef, 0xf7, 0x92, 0x6d, 0x68, 0x4e, 0xbf, 0x25, 0xb5, + 0x2a, 0xcf, 0x33, 0xd5, 0x23, 0x1d, 0xc7, 0x8f, 0x9a, 0xa9, 0x3e, 0x47, + 0x00, 0x33, 0x3b, 0x5a, 0xa8, 0x96, 0x6d, 0x40, 0x31, 0x44, 0x2d, 0xeb, + 0x04, 0x76, 0x15, 0x0e, 0x33, 0x3d, 0x75, 0x98, 0xbe, 0x73, 0x16, 0xf1, + 0x9e, 0x0e, 0xf2, 0xf2, 0xe2, 0xf5, 0xd1, 0x1e, 0xac, 0xd5, 0xd7, 0xbf, + 0x88, 0x1f, 0x4f, 0x1d, 0xe6, 0x8f, 0xfa, 0x17, 0xa9, 0x30, 0x00, 0xfd, + 0x8b, 0xb8, 0xfc, 0x1c, 0x98, 0x9e, 0x6a, 0x7e, 0x5a, 0xfc, 0x4c, 0xc2, + 0x2f, 0x8e, 0x87, 0x3f, 0x8a, 0x94, 0xe9, 0xe4, 0x45, 0xc0, 0x71, 0x41, + 0x38, 0x51, 0x87, 0x03, 0x2f, 0xb6, 0x2e, 0xd7, 0xe5, 0x48, 0x38, 0x07, + 0x9c, 0x47, 0x01, 0x24, 0xdb, 0x01, 0xcf, 0x14, 0x39, 0x7c, 0xbd, 0xd8, + 0xa8, 0x7b, 0x84, 0x42, 0x05, 0x79, 0xb3, 0x82, 0xea, 0x4e, 0xee, 0x12, + 0xdc, 0xcf, 0xdd, 0x6a, 0x73, 0x1e, 0x45, 0x1d, 0xbe, 0x84, 0x3a, 0x6f, + 0x43, 0x5d, 0x30, 0x5e, 0x56, 0x69, 0x82, 0x3a, 0x0f, 0x89, 0x3a, 0x78, + 0x8c, 0xac, 0xeb, 0x0d, 0x98, 0x50, 0xb7, 0x83, 0x26, 0xc0, 0x48, 0x4d, + 0xc0, 0xe2, 0x63, 0x0e, 0x73, 0xdc, 0xcf, 0x5b, 0xd7, 0xa7, 0x95, 0x46, + 0xce, 0x36, 0x19, 0x7b, 0xc4, 0x6d, 0x38, 0x16, 0xc9, 0x04, 0xa3, 0xbb, + 0x1c, 0xbf, 0x96, 0xab, 0x56, 0x04, 0xf7, 0xaf, 0xd1, 0x07, 0x83, 0xab, + 0x75, 0xd5, 0x79, 0xca, 0x3d, 0xfd, 0xe1, 0xdb, 0xb9, 0xf5, 0xaf, 0x2e, + 0x50, 0xf1, 0xcf, 0x0b, 0xc2, 0x8e, 0x85, 0xc2, 0x76, 0xe2, 0x0e, 0xb0, + 0xa7, 0xa0, 0xf2, 0x1c, 0xea, 0x35, 0xd9, 0x53, 0x70, 0x11, 0xcb, 0x4c, + 0x36, 0x7d, 0xf2, 0x47, 0x00, 0x98, 0x69, 0x28, 0x1e, 0xac, 0x71, 0xf7, + 0xcd, 0xe3, 0x4c, 0x4c, 0x54, 0xd8, 0xfc, 0xdd, 0xce, 0x01, 0x59, 0x93, + 0xfb, 0x3b, 0x0e, 0xba, 0x20, 0x6d, 0xfa, 0x4c, 0x3f, 0xd7, 0x7f, 0x73, + 0x7e, 0x82, 0xd9, 0xa5, 0x5f, 0x0b, 0x21, 0x9b, 0x6a, 0x09, 0xa0, 0xd2, + 0x00, 0xd6, 0xda, 0xf8, 0xc5, 0x2d, 0x6c, 0xbe, 0x71, 0x7d, 0xcb, 0xb8, + 0xeb, 0x3e, 0xbd, 0x89, 0xad, 0xdf, 0xba, 0xbe, 0xa5, 0x5f, 0x18, 0xac, + 0x45, 0x79, 0xbe, 0xbb, 0xf8, 0x24, 0x01, 0x4e, 0x29, 0x04, 0x9c, 0xa9, + 0x87, 0xef, 0xe6, 0xab, 0x1b, 0x62, 0x24, 0x4c, 0x4b, 0xff, 0x0c, 0x06, + 0x51, 0x3b, 0x8d, 0xfd, 0x9c, 0x4a, 0x39, 0x38, 0x97, 0x8d, 0x73, 0x86, + 0x01, 0x38, 0x2a, 0x95, 0xb6, 0x98, 0x29, 0xa0, 0x00, 0x53, 0xf5, 0x12, + 0x1e, 0x94, 0x0b, 0x14, 0x24, 0x2b, 0x0c, 0x61, 0x88, 0x02, 0x19, 0x3c, + 0x7c, 0x9c, 0x30, 0xb2, 0xc8, 0x30, 0xf8, 0xcb, 0x50, 0xd7, 0x96, 0x69, + 0x08, 0x1f, 0x9e, 0xe5, 0x4a, 0x70, 0x35, 0x20, 0x25, 0x61, 0x80, 0x23, + 0x05, 0xae, 0xe1, 0x2e, 0x70, 0x15, 0xc6, 0x17, 0x81, 0x1b, 0xfd, 0xd2, + 0x5d, 0x77, 0xd9, 0x03, 0xe4, 0x73, 0x0a, 0xec, 0xb2, 0x63, 0x1a, 0x98, + 0x9e, 0xc2, 0x4c, 0xde, 0x8a, 0x94, 0x50, 0x9c, 0x0d, 0x83, 0x83, 0x3c, + 0xf8, 0x57, 0x50, 0x6e, 0xd3, 0x58, 0xa1, 0xeb, 0xeb, 0xf5, 0xea, 0xbc, + 0xf3, 0xb3, 0xc2, 0x4f, 0x1f, 0xc0, 0xad, 0xae, 0x06, 0x46, 0x81, 0xbb, + 0x58, 0xd5, 0x07, 0xe1, 0x1e, 0xa0, 0x29, 0xd2, 0x7e, 0x3e, 0x0a, 0xa8, + 0xb5, 0xb0, 0xa7, 0xde, 0x8c, 0xfe, 0xeb, 0x99, 0x23, 0x4c, 0xd8, 0xcf, + 0x0b, 0x1f, 0x3e, 0x0e, 0x87, 0x0b, 0x1f, 0xbf, 0xe9, 0xda, 0xa9, 0xe7, + 0xdc, 0x1a, 0xc0, 0x59, 0xbd, 0x6c, 0xde, 0x5c, 0xe0, 0xf2, 0xdb, 0x60, + 0xed, 0xf7, 0x02, 0xd7, 0x2d, 0x3a, 0xcc, 0x47, 0xc0, 0x07, 0x6a, 0xb1, + 0x65, 0x27, 0x7d, 0x9f, 0x2b, 0x28, 0x20, 0xe3, 0x6e, 0xe8, 0xdb, 0x5d, + 0x60, 0x7a, 0xe7, 0x16, 0x5a, 0x5d, 0x75, 0x3f, 0xf8, 0x01, 0xf4, 0x6e, + 0x2c, 0xb0, 0xd2, 0x9b, 0xb6, 0xfa, 0x1c, 0x10, 0xce, 0x77, 0xcb, 0x0f, + 0x69, 0x8a, 0xd8, 0x02, 0x14, 0x76, 0xee, 0xf7, 0x66, 0x1a, 0x8e, 0x7b, + 0x7a, 0x14, 0x50, 0xeb, 0xfc, 0x1e, 0x7d, 0x7c, 0x39, 0xf0, 0x3d, 0x15, + 0xee, 0xef, 0x2e, 0xef, 0x81, 0x50, 0xf8, 0xb5, 0xdf, 0x83, 0xdb, 0xff, + 0xac, 0x45, 0xe1, 0x3a, 0x50, 0xa9, 0xec, 0x20, 0xcc, 0x94, 0x82, 0x5c, + 0xcd, 0x38, 0x88, 0xe9, 0x22, 0x52, 0x8f, 0xe3, 0x65, 0x55, 0xc2, 0xf2, + 0x4c, 0xcb, 0xb9, 0xe3, 0xb0, 0x3c, 0x10, 0x94, 0x0f, 0x84, 0xda, 0x97, + 0x57, 0xbf, 0x4c, 0x0f, 0x98, 0x25, 0x04, 0xf4, 0xd9, 0xc1, 0x1c, 0xf0, + 0xc3, 0x39, 0x38, 0x2b, 0xa3, 0x60, 0xd1, 0xcb, 0x33, 0xb0, 0x6f, 0xfe, + 0x77, 0x08, 0x0d, 0xef, 0x01, 0x3d, 0xd0, 0xc9, 0x82, 0x00, 0x54, 0xcd, + 0x23, 0x1b, 0xb3, 0xcb, 0xc6, 0x2d, 0x17, 0x9b, 0x40, 0x63, 0x52, 0xd3, + 0xe8, 0x72, 0x0f, 0x8d, 0x93, 0x03, 0xb2, 0xe7, 0x0e, 0x93, 0x7b, 0x48, + 0xcd, 0x9f, 0x48, 0xa7, 0x84, 0x58, 0x24, 0x90, 0x6e, 0x85, 0xfc, 0x23, + 0x39, 0xf8, 0xfc, 0x95, 0x98, 0x5f, 0xdd, 0xaa, 0x93, 0x9f, 0xbb, 0x2c, + 0x42, 0xe8, 0x77, 0x91, 0x86, 0x80, 0x7a, 0x08, 0xac, 0x84, 0x0c, 0xe0, + 0x65, 0xaf, 0xd3, 0xfc, 0xb8, 0x6d, 0x28, 0xa0, 0x56, 0x0a, 0x41, 0x25, + 0x8c, 0xdf, 0xd4, 0x9d, 0x01, 0xef, 0xdd, 0x65, 0x88, 0xf1, 0xd5, 0x50, + 0x7a, 0xa9, 0xff, 0x4b, 0x01, 0xae, 0xeb, 0x9d, 0x5b, 0x15, 0x77, 0xb2, + 0x1c, 0xc9, 0x4c, 0x47, 0x74, 0x34, 0x54, 0x34, 0xdc, 0xd6, 0x42, 0x08, + 0xb2, 0xae, 0xcb, 0xf8, 0x61, 0x35, 0xce, 0xb1, 0x90, 0x4c, 0x1a, 0x50, + 0x74, 0x83, 0xbe, 0x8b, 0x69, 0x68, 0x48, 0x95, 0xa1, 0x0a, 0x98, 0x31, + 0x04, 0x33, 0x06, 0xa4, 0xdd, 0x0a, 0x20, 0xa8, 0xd5, 0x21, 0x83, 0xf4, + 0x9f, 0x28, 0x03, 0x02, 0x06, 0x35, 0x50, 0xcb, 0x83, 0x69, 0x79, 0x72, + 0x4a, 0x0e, 0x56, 0xda, 0xf2, 0xeb, 0xe4, 0x96, 0x01, 0x12, 0x3e, 0x44, + 0x2d, 0x5f, 0x85, 0x9a, 0xff, 0xe1, 0x18, 0xa9, 0xc0, 0xc2, 0xf5, 0x00, + 0x82, 0x0a, 0x12, 0x1b, 0xc1, 0xa4, 0x0b, 0x03, 0xa6, 0xd0, 0xc7, 0xaa, + 0xff, 0x05, 0xaa, 0x7e, 0x93, 0x5e, 0xd9, 0x0d, 0xb0, 0xea, 0x0a, 0xa8, + 0xe5, 0xcd, 0x63, 0xda, 0xa8, 0x71, 0x8a, 0x08, 0x7d, 0x34, 0x29, 0x7c, + 0xc7, 0x8f, 0xde, 0xfd, 0xc3, 0xed, 0xee, 0xdd, 0xfd, 0xf3, 0x75, 0xa9, + 0xda, 0x5e, 0x10, 0x2a, 0x57, 0xe7, 0x3a, 0xf9, 0x9d, 0xfb, 0xe1, 0xd9, + 0x6e, 0xff, 0xf8, 0x15, 0x31, 0x09, 0x7a, 0x0e, 0xd3, 0xd3, 0xab, 0x67, + 0xbe, 0x02, 0x8f, 0xbe, 0x86, 0xc4, 0xe7, 0x91, 0x07, 0xd4, 0xb2, 0x92, + 0xe0, 0xe8, 0x7e, 0xec, 0xcf, 0xf7, 0x2b, 0xc0, 0xd6, 0xb9, 0x43, 0x59, + 0x1f, 0xac, 0xd5, 0xa9, 0x7a, 0xe5, 0x00, 0x63, 0x62, 0x92, 0x5e, 0xd9, + 0xd9, 0x1c, 0xe2, 0x9b, 0xa1, 0x53, 0x8f, 0xdd, 0xcf, 0x93, 0xaf, 0x9e, + 0xd1, 0xd2, 0xef, 0xe5, 0x57, 0x26, 0x39, 0xf5, 0xf8, 0xe3, 0xf9, 0xd0, + 0x05, 0x17, 0x70, 0xca, 0xc5, 0x9b, 0x01, 0x78, 0xfa, 0xde, 0x7b, 0xe9, + 0xbf, 0x40, 0xf5, 0x7b, 0xa7, 0x1e, 0x78, 0x80, 0x53, 0x8f, 0xdd, 0xcf, + 0xe3, 0x2f, 0xbf, 0xcc, 0x3d, 0xaf, 0xc0, 0x87, 0x8f, 0x3f, 0xde, 0x07, + 0x6b, 0x75, 0x22, 0xab, 0x2b, 0x45, 0x71, 0x66, 0xfe, 0x0f, 0x19, 0xd8, + 0x3d, 0x16, 0xae, 0x86, 0xf1, 0x87, 0x81, 0x57, 0x9e, 0x32, 0x56, 0x0f, + 0xee, 0xe1, 0x12, 0x32, 0x25, 0x49, 0x69, 0x30, 0xf7, 0xb6, 0xef, 0x6f, + 0x53, 0xf3, 0x82, 0x42, 0x62, 0x9d, 0x66, 0xe2, 0x94, 0x2b, 0xb8, 0x65, + 0x97, 0xb4, 0x30, 0x49, 0xf5, 0x04, 0xf3, 0x82, 0xae, 0x2c, 0x92, 0xd6, + 0x30, 0xf2, 0x5a, 0x59, 0x22, 0x8c, 0x5a, 0x03, 0x50, 0x0b, 0x60, 0xe8, + 0x8c, 0xac, 0xba, 0x57, 0x78, 0x1f, 0xe1, 0x49, 0x82, 0xbd, 0x2c, 0x45, + 0x45, 0xa7, 0x29, 0xeb, 0x2e, 0xa9, 0xb4, 0x85, 0xac, 0xab, 0xbe, 0x4e, + 0x6d, 0xb6, 0x46, 0xce, 0xc9, 0x93, 0xb5, 0x32, 0x94, 0x0e, 0x15, 0x11, + 0xa7, 0x09, 0x12, 0xe5, 0x14, 0x66, 0xb7, 0xc5, 0xd8, 0x7d, 0x0a, 0xf0, + 0x64, 0x76, 0x99, 0x98, 0x5d, 0x90, 0x9f, 0x9d, 0x84, 0xbd, 0x92, 0xcc, + 0x59, 0x43, 0x88, 0x7a, 0xe3, 0x15, 0x52, 0x29, 0x35, 0x5f, 0x31, 0xae, + 0xeb, 0x92, 0x42, 0x95, 0xdf, 0xff, 0xd8, 0xda, 0x61, 0xb5, 0x1d, 0xfb, + 0xfe, 0x18, 0x83, 0x2b, 0x46, 0xb8, 0xe9, 0x1b, 0x37, 0xa8, 0x3c, 0x96, + 0xf4, 0x30, 0x74, 0x6e, 0xbf, 0x1f, 0xd6, 0xee, 0xb2, 0x71, 0xa5, 0x8b, + 0x2c, 0x3b, 0xa0, 0xe7, 0x9c, 0x2b, 0x65, 0xb0, 0x7a, 0x44, 0x03, 0xad, + 0x3b, 0x91, 0xa4, 0x25, 0xbd, 0x7b, 0xc5, 0xb9, 0x23, 0x24, 0xea, 0xb0, + 0xfd, 0xde, 0x31, 0x9c, 0x6a, 0x85, 0xfe, 0xee, 0x14, 0x22, 0x69, 0x62, + 0xa6, 0x2d, 0x5c, 0xda, 0x8f, 0x07, 0xc4, 0xa0, 0xa9, 0xd6, 0x5d, 0x74, + 0xab, 0xfb, 0x8e, 0xd5, 0x67, 0xe1, 0x4c, 0x3b, 0x38, 0xd3, 0xfa, 0xdc, + 0x77, 0x0b, 0xac, 0x3e, 0x3d, 0x07, 0xae, 0xdd, 0x9c, 0x69, 0x07, 0xfb, + 0x93, 0xea, 0xbd, 0x48, 0xf1, 0x3b, 0x79, 0x38, 0xa8, 0xe1, 0x59, 0xdd, + 0x22, 0x58, 0x8f, 0xd2, 0x2d, 0x90, 0x13, 0x6e, 0x03, 0x38, 0x0a, 0x02, + 0xd0, 0xd6, 0x83, 0x5b, 0x6e, 0x06, 0xe0, 0x94, 0x93, 0x97, 0xf0, 0xf4, + 0x2f, 0x0f, 0x71, 0xeb, 0x6d, 0xdb, 0x1b, 0xc0, 0x5a, 0x9f, 0x7c, 0xff, + 0x1f, 0xfa, 0xfb, 0xa7, 0x9c, 0xbc, 0x84, 0xcd, 0xbf, 0xde, 0x8d, 0x9c, + 0x70, 0x1b, 0xd2, 0xf2, 0x34, 0x17, 0xbc, 0xcb, 0xab, 0xa3, 0x9c, 0x70, + 0x1b, 0x40, 0x56, 0x8f, 0xff, 0x1f, 0x79, 0xec, 0x8a, 0xba, 0x77, 0xfd, + 0xa2, 0x54, 0xe0, 0xae, 0xe9, 0xff, 0xdb, 0xaf, 0x93, 0xa7, 0xe2, 0x77, + 0xf2, 0x0d, 0x00, 0xb1, 0x56, 0x70, 0x2c, 0x39, 0x2b, 0x11, 0x83, 0x66, + 0xd0, 0x46, 0xf7, 0x15, 0x91, 0xb3, 0x52, 0x1d, 0xf7, 0x59, 0x0d, 0x69, + 0x85, 0xd3, 0x88, 0xc2, 0xc7, 0xc2, 0x5b, 0xaf, 0x1c, 0x6f, 0xff, 0x37, + 0x35, 0x47, 0x16, 0x06, 0x6b, 0x01, 0x4d, 0x70, 0xad, 0xc5, 0x27, 0xd8, + 0x1c, 0x3c, 0xfc, 0x10, 0x9c, 0xd8, 0xb6, 0x09, 0x62, 0xc5, 0x8a, 0x15, + 0x2b, 0x56, 0xac, 0x58, 0xb1, 0x62, 0xc5, 0x8a, 0x15, 0x2b, 0x56, 0xac, + 0x58, 0xb1, 0x62, 0xc5, 0x8a, 0x15, 0x2b, 0x56, 0xac, 0x58, 0xb1, 0x62, + 0xc5, 0x8a, 0x15, 0x2b, 0x56, 0x07, 0x8a, 0xa1, 0x5a, 0xb1, 0x62, 0xc5, + 0x8a, 0x15, 0x2b, 0xd6, 0xef, 0xa0, 0x64, 0x68, 0x61, 0xb6, 0xac, 0xb7, + 0x5e, 0x18, 0xdd, 0x0a, 0x76, 0xd5, 0x6a, 0x3f, 0x0c, 0x87, 0x8a, 0xa6, + 0xd5, 0x69, 0xd8, 0x56, 0xf1, 0x3a, 0x01, 0x6b, 0x79, 0x9a, 0x2b, 0xdd, + 0xb9, 0xea, 0xb0, 0x90, 0xb0, 0xd1, 0x3a, 0x84, 0xf3, 0x6c, 0x95, 0xe6, + 0x7c, 0xe5, 0x9f, 0xab, 0x6d, 0xe6, 0x97, 0xc4, 0x34, 0xd4, 0x02, 0xee, + 0xa2, 0xff, 0x35, 0xd7, 0xc0, 0xdc, 0xd9, 0x5f, 0x78, 0x2e, 0x65, 0xe0, + 0x2a, 0x7d, 0xef, 0x46, 0xd5, 0x23, 0x8b, 0x0b, 0xc3, 0x69, 0x49, 0x05, + 0xcf, 0xaa, 0x74, 0x09, 0x52, 0xb3, 0x3a, 0x17, 0xff, 0xcb, 0xae, 0xa8, + 0x05, 0xfe, 0x86, 0x57, 0x07, 0xed, 0x56, 0x95, 0xfe, 0x62, 0xd5, 0x6b, + 0xef, 0x18, 0xc5, 0xd1, 0x19, 0x5b, 0xa6, 0xa0, 0x28, 0x5d, 0x8a, 0xda, + 0xa0, 0xc1, 0x12, 0x02, 0xb7, 0x54, 0x01, 0x01, 0xae, 0x07, 0x04, 0xd3, + 0x59, 0xe7, 0xa7, 0x1d, 0xa4, 0x01, 0x6b, 0xbf, 0xad, 0x80, 0x5a, 0x22, + 0x09, 0x4e, 0x59, 0xd2, 0x7f, 0x96, 0x32, 0xdc, 0x99, 0xda, 0xbb, 0x8b, + 0x2d, 0x37, 0xdf, 0xc8, 0xfa, 0xab, 0xbf, 0xd8, 0x58, 0x76, 0x17, 0x1f, + 0xf2, 0xe5, 0x01, 0xb5, 0x1a, 0xca, 0xe6, 0xb5, 0x54, 0x08, 0xac, 0x05, + 0xf8, 0x30, 0x2f, 0x33, 0x9d, 0x22, 0x3f, 0xed, 0xa8, 0x85, 0xfc, 0x88, + 0x20, 0x9e, 0xac, 0xe0, 0x94, 0x5d, 0x3f, 0x4f, 0x6b, 0x99, 0x4d, 0xaa, + 0x77, 0x90, 0x4a, 0x79, 0xc6, 0x07, 0x7a, 0x89, 0x24, 0x24, 0x7a, 0x04, + 0x95, 0xde, 0x04, 0xc5, 0x87, 0x60, 0xe8, 0xef, 0x05, 0x20, 0x70, 0xbf, + 0x55, 0x81, 0xa4, 0x4a, 0x5f, 0x84, 0xda, 0xaa, 0x93, 0x73, 0x2d, 0xca, + 0x47, 0x67, 0x36, 0x2e, 0xd3, 0x47, 0x67, 0xf4, 0xe0, 0x56, 0x8b, 0x0d, + 0xdb, 0x4e, 0xc2, 0x1e, 0x6d, 0x98, 0xb0, 0x2a, 0x6e, 0xb3, 0x41, 0x9d, + 0x67, 0x94, 0xdd, 0x10, 0x6e, 0xb7, 0xcb, 0xea, 0x4f, 0xac, 0x66, 0xe6, + 0xe0, 0x0c, 0x00, 0x3d, 0xdd, 0x3d, 0xfe, 0x7e, 0xf1, 0xa7, 0x0e, 0x95, + 0xaa, 0x6c, 0xca, 0x7b, 0xa1, 0x65, 0x69, 0x8c, 0x1b, 0x18, 0x81, 0xc9, + 0xaa, 0xba, 0xfe, 0x44, 0x32, 0xe5, 0xef, 0x87, 0xc3, 0xa5, 0xd3, 0x36, + 0x6e, 0xb5, 0x06, 0xe6, 0xdc, 0x69, 0x5a, 0x4b, 0x2c, 0x05, 0xb3, 0x4a, + 0xa7, 0x29, 0x96, 0x4a, 0x0d, 0xb0, 0x27, 0x4f, 0xd9, 0x33, 0xb2, 0xb8, + 0x4e, 0x89, 0xb4, 0x95, 0x66, 0xe2, 0xb1, 0x5c, 0x8b, 0x54, 0xe6, 0x96, + 0xdd, 0x6d, 0x43, 0x60, 0xbf, 0x40, 0x51, 0x1b, 0xfb, 0x15, 0x9d, 0x22, + 0xc3, 0x67, 0x0f, 0x51, 0x9c, 0x75, 0x70, 0x0f, 0xbb, 0x64, 0x33, 0x59, + 0x1f, 0xb2, 0x98, 0x2f, 0x16, 0x7d, 0xb0, 0x56, 0x2e, 0x9f, 0x67, 0xf8, + 0xec, 0xa1, 0x39, 0xc1, 0x5a, 0x96, 0x86, 0x89, 0xb9, 0xfa, 0xab, 0xec, + 0x73, 0x19, 0x38, 0x85, 0xfd, 0xc3, 0xe1, 0xda, 0x01, 0xb5, 0x1a, 0x8c, + 0xf7, 0xb5, 0x91, 0x92, 0x7b, 0xa8, 0x04, 0xcb, 0x2c, 0x3f, 0xcf, 0x8a, + 0x36, 0x48, 0x29, 0xce, 0x16, 0x31, 0xbb, 0x4c, 0x2a, 0xb2, 0x42, 0xe5, + 0x60, 0x05, 0xbb, 0x3b, 0x83, 0x7b, 0xa8, 0x84, 0x95, 0x4c, 0x31, 0xa1, + 0xef, 0x49, 0x42, 0x34, 0x82, 0xbc, 0xda, 0xe5, 0xf1, 0x46, 0xc8, 0xb3, + 0x6b, 0xf3, 0xe0, 0x4e, 0x17, 0x60, 0xf3, 0x8c, 0x36, 0x61, 0xf1, 0x80, + 0x4d, 0xeb, 0x35, 0x14, 0x0b, 0x68, 0x80, 0x5b, 0x45, 0x61, 0x56, 0xe1, + 0xfd, 0x76, 0xc0, 0xaa, 0x95, 0x21, 0x08, 0x54, 0x14, 0x42, 0xd5, 0xdb, + 0xc6, 0xaf, 0x40, 0x81, 0x95, 0xda, 0xc5, 0xf3, 0x8f, 0x42, 0xb6, 0xc2, + 0xf9, 0x14, 0x28, 0xb0, 0x13, 0xe8, 0x0d, 0xe5, 0x5f, 0x68, 0x01, 0x9e, + 0xf2, 0xdc, 0xc2, 0x7e, 0xd1, 0xb2, 0xcf, 0x57, 0x27, 0xcf, 0xbd, 0x31, + 0x9d, 0xc6, 0x3a, 0x78, 0x6d, 0x18, 0x55, 0x14, 0xf4, 0xd5, 0x4a, 0x5e, + 0x7d, 0x57, 0xb2, 0x92, 0x9d, 0xec, 0x64, 0x67, 0xa8, 0x2d, 0xc2, 0xfe, + 0x9d, 0x4a, 0x6e, 0x78, 0x2f, 0x97, 0xdc, 0xf4, 0x38, 0xeb, 0xfe, 0xf2, + 0xbd, 0x00, 0x5c, 0xfa, 0xe4, 0x01, 0xd6, 0xad, 0x3b, 0x15, 0x50, 0x20, + 0xa8, 0x76, 0x50, 0x28, 0x68, 0x84, 0x4a, 0xbd, 0x11, 0x00, 0xab, 0x58, + 0x81, 0xa2, 0x30, 0xad, 0x85, 0xc8, 0xdc, 0x07, 0x6e, 0x61, 0x12, 0xb6, + 0x5f, 0x0f, 0x7b, 0x23, 0xf7, 0xe7, 0xd9, 0xc6, 0xe7, 0xcd, 0x6b, 0x86, + 0x47, 0xb5, 0xd0, 0x06, 0xe0, 0x26, 0x07, 0xa6, 0x1c, 0x97, 0x84, 0x08, + 0xdc, 0x9a, 0x14, 0x06, 0x6b, 0x85, 0xdd, 0x3e, 0x6e, 0x01, 0x0e, 0xf4, + 0x65, 0x60, 0x7a, 0x0d, 0x94, 0xb6, 0xc2, 0x75, 0xdb, 0xe1, 0xd7, 0x93, + 0x70, 0xef, 0x25, 0x90, 0xbe, 0x46, 0xd1, 0x21, 0x08, 0x01, 0xa8, 0xee, + 0xcb, 0xc0, 0xd9, 0x11, 0x83, 0xa9, 0x6f, 0xd2, 0x11, 0x5c, 0xeb, 0xea, + 0xff, 0x7e, 0x37, 0x3b, 0xee, 0xd8, 0x86, 0xbb, 0x77, 0xac, 0xc9, 0xef, + 0x68, 0xda, 0x64, 0xed, 0x49, 0xfd, 0xf0, 0xc2, 0x14, 0x7c, 0x7f, 0x34, + 0x80, 0x66, 0xdd, 0x3b, 0x06, 0x0f, 0x3b, 0x81, 0xfb, 0xeb, 0x24, 0xb1, + 0x6c, 0x04, 0xd1, 0x15, 0x3c, 0x07, 0xcd, 0x0f, 0x04, 0x0f, 0xf8, 0x4b, + 0x2f, 0x0e, 0x8c, 0x02, 0xf7, 0x3c, 0xa2, 0xb6, 0x52, 0x08, 0x52, 0xcb, + 0x6c, 0x24, 0xd0, 0xf3, 0xf1, 0xc0, 0xf0, 0xe7, 0x86, 0x1b, 0xc3, 0xd0, + 0xd8, 0x40, 0xa3, 0x77, 0xde, 0xd4, 0x70, 0x9c, 0x36, 0x7b, 0x28, 0xb9, + 0x33, 0x47, 0x5f, 0xf0, 0xdf, 0x21, 0xf9, 0x80, 0x50, 0xe1, 0x0d, 0x68, + 0x22, 0x7d, 0x22, 0x59, 0x03, 0x91, 0x68, 0x8e, 0xf8, 0x46, 0x95, 0x87, + 0x85, 0x81, 0x9c, 0xe6, 0x82, 0x69, 0x85, 0xf5, 0xe2, 0x4b, 0x2f, 0xf0, + 0x4f, 0xc0, 0x3f, 0x77, 0x9f, 0xcc, 0x75, 0xf9, 0x5f, 0xf3, 0x57, 0x2f, + 0x49, 0x96, 0xce, 0x11, 0xef, 0xb8, 0x25, 0x4b, 0xe8, 0xed, 0xed, 0x25, + 0xf5, 0xfc, 0x04, 0x63, 0x65, 0x18, 0xe8, 0x82, 0x83, 0xe5, 0x32, 0x27, + 0x67, 0x32, 0x1d, 0x81, 0xb5, 0x00, 0xf2, 0xf9, 0x3c, 0x4b, 0xdb, 0xa4, + 0xbf, 0xb4, 0x85, 0x7f, 0xab, 0xba, 0x78, 0x00, 0xae, 0xe7, 0x8f, 0x33, + 0x78, 0x78, 0xd7, 0x6e, 0x00, 0x9e, 0x7e, 0xfa, 0x69, 0x9e, 0x3f, 0xce, + 0xe0, 0xa9, 0x89, 0x09, 0x8e, 0x6f, 0x91, 0xb6, 0x38, 0x4e, 0x50, 0x7a, + 0xa1, 0xc4, 0x77, 0xef, 0xb9, 0x87, 0xec, 0x19, 0x59, 0x4e, 0xeb, 0x79, + 0x37, 0x8b, 0x38, 0x8e, 0x67, 0x5f, 0x2a, 0x21, 0x5f, 0x91, 0x1c, 0xdb, + 0xa6, 0x4c, 0x73, 0xd5, 0x65, 0xa1, 0xe7, 0x65, 0xde, 0xf4, 0x0d, 0xc9, + 0x86, 0x6d, 0x9b, 0xc8, 0xef, 0x2e, 0x32, 0xba, 0xbc, 0x82, 0x2c, 0x5b, + 0x94, 0x70, 0xc8, 0xe5, 0xbe, 0x08, 0x5c, 0xa1, 0x02, 0x19, 0x1f, 0x63, + 0xd5, 0xc5, 0x3f, 0xe4, 0xa6, 0x6f, 0xec, 0xa0, 0xe4, 0x80, 0x2c, 0x8f, + 0x73, 0xf5, 0x65, 0x23, 0xdc, 0x3c, 0x2d, 0x30, 0x85, 0x44, 0x86, 0x0c, + 0x43, 0xcd, 0xae, 0x50, 0xda, 0x12, 0x86, 0x07, 0x07, 0x91, 0xd2, 0x03, + 0x4b, 0x05, 0xda, 0xf6, 0xdd, 0xbb, 0x11, 0x46, 0x07, 0xfd, 0x4d, 0x21, + 0x15, 0xa4, 0x6a, 0x49, 0x60, 0x3c, 0xba, 0x7a, 0x10, 0xb6, 0x7e, 0x7b, + 0x07, 0x52, 0x2a, 0x98, 0x55, 0xba, 0x0e, 0x6b, 0xae, 0x58, 0xcd, 0xf0, + 0xe0, 0x52, 0x36, 0xff, 0xfd, 0x33, 0x6c, 0xbd, 0x4f, 0x52, 0xdc, 0x5d, + 0x24, 0x7f, 0xcf, 0x66, 0x36, 0x7f, 0x6d, 0x23, 0xdb, 0xef, 0x68, 0x04, + 0x60, 0xc9, 0xba, 0x60, 0xcf, 0x23, 0x0a, 0x0c, 0x92, 0x12, 0xe9, 0x00, + 0xd0, 0x1d, 0x2a, 0xb7, 0x37, 0xee, 0xb2, 0x97, 0xa4, 0x5a, 0xf6, 0x97, + 0xa3, 0xc7, 0x29, 0x61, 0x53, 0x91, 0x45, 0x72, 0x39, 0x07, 0x91, 0x4a, + 0x35, 0xa4, 0x01, 0x6a, 0xdc, 0x6d, 0x2e, 0x49, 0x29, 0xa8, 0xd6, 0x7e, + 0x87, 0x4c, 0xc6, 0xa4, 0x24, 0x13, 0x98, 0x75, 0x89, 0x5b, 0x4f, 0x40, + 0xad, 0x46, 0x36, 0x6b, 0x21, 0xeb, 0x69, 0x3f, 0x8e, 0x7b, 0xd8, 0xc1, + 0x29, 0x81, 0xb9, 0xc8, 0x82, 0xba, 0x02, 0x6a, 0x03, 0x98, 0x29, 0x13, + 0xb7, 0x1a, 0xcc, 0x4f, 0x88, 0x0e, 0x9e, 0xe3, 0xbf, 0x10, 0xc7, 0xf0, + 0x9e, 0x57, 0xd4, 0xfe, 0xd2, 0xb7, 0x1d, 0xc3, 0x61, 0xd4, 0x74, 0x46, + 0x78, 0xba, 0xc0, 0x7b, 0xc2, 0x59, 0xc0, 0x01, 0xe0, 0xd4, 0xdb, 0x5f, + 0xc5, 0x5d, 0x7b, 0x2c, 0x87, 0x27, 0x5f, 0xe5, 0xb4, 0xbb, 0x8e, 0x50, + 0x02, 0x96, 0x0c, 0x1c, 0xcb, 0x7f, 0x4e, 0xbd, 0x8a, 0x03, 0x2c, 0xd7, + 0x7f, 0xfb, 0x50, 0xb0, 0x8e, 0xa5, 0x21, 0xc8, 0x94, 0x01, 0x2c, 0x7d, + 0x15, 0x78, 0xe1, 0x88, 0x9f, 0xff, 0x52, 0xc5, 0xe7, 0xa2, 0xeb, 0x84, + 0x63, 0x58, 0x76, 0x3c, 0x1c, 0xfb, 0x1a, 0x18, 0x59, 0x0b, 0x81, 0x56, + 0x2d, 0x7d, 0x13, 0x20, 0x5c, 0x9d, 0x96, 0xa7, 0x55, 0x59, 0x4e, 0xad, + 0x1e, 0xe1, 0x80, 0xde, 0xff, 0x3d, 0x02, 0xa0, 0x99, 0xe7, 0xf6, 0x54, + 0xf2, 0x18, 0x58, 0x40, 0x7d, 0x3d, 0xe5, 0x80, 0x52, 0x5d, 0x41, 0x02, + 0x3e, 0xa0, 0xdd, 0xa6, 0xa7, 0x0e, 0x37, 0x85, 0xfb, 0x85, 0xde, 0xbe, + 0xab, 0x4d, 0x3a, 0x7e, 0x9c, 0x79, 0x80, 0x5c, 0xad, 0xd2, 0xf6, 0xd2, + 0x0f, 0xa7, 0xfd, 0xae, 0x50, 0xd8, 0x69, 0xd0, 0xa4, 0xa9, 0xc3, 0x4d, + 0xe1, 0x3c, 0x79, 0x00, 0xae, 0xa8, 0x7e, 0xf6, 0x0a, 0xbc, 0xef, 0x08, + 0x60, 0x04, 0xa0, 0x5e, 0x0f, 0x7c, 0xa0, 0xc2, 0x2f, 0xe2, 0xc8, 0x22, + 0x2f, 0xde, 0x22, 0xa4, 0x7c, 0x19, 0x13, 0xb8, 0x34, 0x09, 0xde, 0x5d, + 0xdd, 0xd2, 0x91, 0xc6, 0x15, 0x27, 0x01, 0x1b, 0x0f, 0x15, 0xa4, 0xfc, + 0x33, 0x28, 0xe8, 0x9b, 0x00, 0x46, 0x92, 0x3a, 0x9f, 0xe8, 0xdc, 0x1a, + 0x34, 0x01, 0xb8, 0x3c, 0x77, 0xef, 0xc9, 0xa4, 0xce, 0x83, 0xba, 0x7f, + 0x0c, 0x22, 0x19, 0x07, 0x4a, 0x65, 0x95, 0x96, 0x00, 0xce, 0x39, 0x67, + 0x11, 0x3f, 0xf9, 0xc9, 0xe1, 0x00, 0x46, 0x36, 0x75, 0x98, 0x57, 0x7e, + 0x5f, 0x6d, 0x5f, 0x8b, 0x44, 0x72, 0xee, 0x3e, 0xc2, 0x15, 0x5f, 0x79, + 0x80, 0x5b, 0xff, 0xfa, 0x82, 0x86, 0x67, 0x48, 0xe9, 0x9e, 0x37, 0x16, + 0x64, 0x9a, 0x1d, 0x54, 0xf7, 0xee, 0xdc, 0x44, 0x05, 0xe7, 0xbc, 0xb5, + 0xb8, 0x0f, 0xde, 0xce, 0xe0, 0x60, 0x0a, 0xbe, 0xdb, 0x18, 0x6e, 0xf3, + 0xd7, 0x15, 0x64, 0x71, 0xe3, 0x17, 0x9a, 0x61, 0x5b, 0x03, 0xa7, 0xcd, + 0x0d, 0xd6, 0x5a, 0x77, 0x91, 0xcd, 0xd6, 0xfb, 0x16, 0x36, 0xcf, 0x65, + 0x27, 0xe7, 0x7f, 0xfe, 0xb8, 0xcb, 0xbd, 0xb3, 0x1a, 0x6a, 0xd7, 0x04, + 0x0c, 0x9c, 0x95, 0x22, 0x0c, 0xd6, 0xda, 0xf4, 0xfd, 0xb5, 0xd0, 0x0b, + 0x99, 0x33, 0xf4, 0xb3, 0x42, 0x42, 0xe5, 0x5e, 0xb5, 0xef, 0x01, 0xb5, + 0xd6, 0x7c, 0x5c, 0xcd, 0xdd, 0x6c, 0xbf, 0xb3, 0x71, 0x2c, 0x61, 0x26, + 0xe7, 0x99, 0x30, 0xf3, 0x35, 0x13, 0xc4, 0x11, 0x69, 0xac, 0x74, 0x06, + 0x77, 0x36, 0x4f, 0x13, 0x2a, 0xc9, 0xc8, 0x43, 0x5d, 0x62, 0xa5, 0x47, + 0xc8, 0xcf, 0x78, 0xe3, 0x8e, 0x66, 0xa0, 0x96, 0x69, 0x58, 0xa4, 0xba, + 0x2c, 0xdc, 0x92, 0x8b, 0x69, 0xd8, 0xd8, 0xe9, 0x0c, 0xb9, 0x19, 0xaf, + 0x9f, 0xaf, 0xc2, 0xda, 0xcb, 0xb2, 0xe4, 0x0a, 0xa3, 0xa1, 0x38, 0xe9, + 0x08, 0xc0, 0xd1, 0x21, 0x95, 0xb6, 0x70, 0x67, 0x4b, 0x08, 0x61, 0xfb, + 0xfb, 0x51, 0x79, 0x90, 0x06, 0xd3, 0xd0, 0xcf, 0xb7, 0xba, 0xc0, 0x12, + 0xe0, 0x48, 0xb0, 0x84, 0xc0, 0x91, 0x0a, 0xa6, 0x05, 0xe0, 0xd6, 0xc1, + 0x45, 0xc1, 0xb4, 0x2c, 0xc3, 0xc4, 0x69, 0x79, 0x9a, 0xe6, 0x02, 0x58, + 0x7c, 0x91, 0xd5, 0xcb, 0x6f, 0xe4, 0xda, 0x3b, 0x2e, 0xf0, 0x5d, 0xae, + 0xcb, 0x3e, 0xe0, 0xfb, 0x41, 0x06, 0x21, 0x6c, 0xec, 0x65, 0xd9, 0x10, + 0x58, 0xab, 0xf5, 0x6f, 0x27, 0xa8, 0x6f, 0xf8, 0xaa, 0x36, 0x51, 0x60, + 0xad, 0x51, 0x30, 0x34, 0x99, 0xa9, 0x0e, 0xf0, 0x31, 0x46, 0xa7, 0xbd, + 0x98, 0x83, 0xdc, 0xf0, 0x83, 0xf7, 0xd1, 0x63, 0x5e, 0xa1, 0xda, 0x70, + 0x46, 0x41, 0x66, 0x14, 0x58, 0x6b, 0x8e, 0xa2, 0xc7, 0xfa, 0xff, 0x9f, + 0x5a, 0xbc, 0x1f, 0x11, 0x33, 0x25, 0x30, 0x5c, 0x44, 0xd8, 0x2f, 0xf2, + 0x0c, 0x92, 0x52, 0x42, 0xbd, 0x86, 0x28, 0x2c, 0x14, 0x4f, 0x1a, 0x8a, + 0xbf, 0x37, 0x8f, 0xf8, 0x40, 0x36, 0x00, 0x75, 0x09, 0x4d, 0x76, 0xda, + 0x9b, 0x47, 0x7a, 0xe0, 0x2e, 0x0d, 0xe1, 0x6a, 0x37, 0x47, 0xec, 0x8d, + 0x49, 0x7a, 0xba, 0xd2, 0xcc, 0x94, 0x9b, 0xcb, 0xd2, 0xf0, 0x1e, 0xad, + 0x6d, 0xec, 0x60, 0x4f, 0x56, 0x2b, 0x08, 0x61, 0x52, 0x09, 0xc1, 0x02, + 0x85, 0xf7, 0xc5, 0x98, 0x90, 0x8a, 0x33, 0xba, 0x3f, 0xfc, 0xa7, 0x57, + 0xe2, 0x5e, 0xbb, 0x51, 0xbf, 0xeb, 0xd2, 0x9e, 0x55, 0x89, 0xbc, 0x76, + 0x1d, 0xe2, 0xba, 0xad, 0xc1, 0x4b, 0xaf, 0xf9, 0xae, 0xbb, 0xba, 0x44, + 0x08, 0x53, 0x7f, 0x54, 0x87, 0xf9, 0xc3, 0xbf, 0x06, 0x15, 0xf5, 0xf9, + 0xac, 0x44, 0xe8, 0xcb, 0xe1, 0x6f, 0x83, 0x08, 0x01, 0x96, 0x94, 0x14, + 0x85, 0xf0, 0xc3, 0x34, 0xc0, 0x95, 0x05, 0x54, 0x24, 0x54, 0x50, 0xfe, + 0x42, 0x28, 0x58, 0x17, 0x28, 0xf0, 0x93, 0x9f, 0x94, 0x80, 0x6c, 0x97, + 0x20, 0x17, 0x02, 0x92, 0x8c, 0x57, 0xf5, 0x67, 0x84, 0x74, 0xf8, 0x71, + 0x7d, 0x3e, 0x27, 0x4b, 0xd2, 0x4f, 0xa3, 0x58, 0x57, 0x00, 0x2b, 0xbf, + 0xbc, 0x86, 0x20, 0x91, 0x54, 0xb0, 0x9a, 0x5a, 0x55, 0xea, 0x3b, 0xa5, + 0x24, 0x21, 0x4c, 0x66, 0x50, 0x60, 0xad, 0x19, 0x20, 0x5f, 0x07, 0xfb, + 0x50, 0x89, 0xa9, 0x3b, 0xb7, 0x93, 0x12, 0x50, 0xe9, 0xd6, 0x20, 0x99, + 0xc7, 0x72, 0x90, 0xcf, 0x93, 0xb3, 0x6d, 0xd6, 0x7d, 0x7e, 0x1d, 0x5b, + 0xff, 0xe1, 0x26, 0x9d, 0x46, 0x0d, 0x21, 0x04, 0x19, 0x23, 0x81, 0xeb, + 0x56, 0x98, 0xd2, 0xe7, 0x4e, 0xd6, 0x85, 0x82, 0x5e, 0x85, 0xc7, 0x35, + 0x1a, 0xb8, 0x35, 0x60, 0x2a, 0x78, 0x16, 0x08, 0xbc, 0x11, 0x61, 0x05, + 0x75, 0x47, 0xb6, 0x75, 0x5f, 0x2b, 0xa5, 0xe1, 0x68, 0x0d, 0x1f, 0x06, + 0x10, 0xea, 0x37, 0x98, 0xd7, 0x38, 0x2c, 0x61, 0x24, 0x28, 0x02, 0xb6, + 0x51, 0xc1, 0x21, 0xe5, 0xa1, 0x1f, 0xc9, 0xa6, 0xd5, 0x79, 0xc9, 0x87, + 0x7e, 0x2e, 0xb6, 0x21, 0x82, 0x76, 0x15, 0x2a, 0xbf, 0x4e, 0xc6, 0xe0, + 0xa7, 0x23, 0x79, 0xf5, 0xcc, 0x57, 0x38, 0xfd, 0x51, 0x95, 0xd2, 0x62, + 0x0d, 0xd4, 0x3a, 0xdd, 0xeb, 0x63, 0xca, 0x7e, 0xf2, 0x62, 0x8a, 0x8c, + 0x06, 0x6b, 0x9d, 0x8e, 0x84, 0x47, 0x8f, 0xf3, 0xfd, 0x5f, 0x9f, 0xad, + 0x22, 0xc7, 0x3c, 0x94, 0x3b, 0xe8, 0x83, 0xb5, 0xc2, 0x72, 0xaa, 0x70, + 0xe7, 0x8f, 0x73, 0x7c, 0xfc, 0x8f, 0xb2, 0x9c, 0xb4, 0xd0, 0xf4, 0x65, + 0x3f, 0x5e, 0x2b, 0x8d, 0x84, 0xeb, 0x70, 0x14, 0xdb, 0x82, 0x98, 0xe4, + 0x74, 0xd9, 0xff, 0x9a, 0xe2, 0x1f, 0x78, 0xf5, 0x34, 0xbe, 0x70, 0xd1, + 0x3b, 0x15, 0x20, 0x0b, 0x38, 0xf0, 0xea, 0x69, 0xbe, 0xff, 0x7b, 0x8f, + 0xeb, 0xe7, 0xc0, 0xab, 0x70, 0xe0, 0xbe, 0x5f, 0xc0, 0x7d, 0xff, 0xc2, + 0xe3, 0xaf, 0x28, 0x70, 0x92, 0x07, 0xcf, 0xfa, 0xd2, 0xca, 0x95, 0x4c, + 0x3d, 0xe0, 0xf5, 0x11, 0xf0, 0x81, 0x5a, 0x87, 0x9d, 0x67, 0x78, 0xe6, + 0xf9, 0xc3, 0xb0, 0xb8, 0xdd, 0x0c, 0x92, 0x52, 0x71, 0xc6, 0xc1, 0x0d, + 0x7d, 0xe4, 0xc7, 0x6c, 0xf3, 0xb1, 0x1f, 0x0f, 0xa8, 0x05, 0x50, 0x29, + 0xe9, 0xf9, 0x88, 0x52, 0x70, 0xcd, 0x96, 0x28, 0x21, 0x2c, 0x41, 0x65, + 0xbf, 0x4b, 0xca, 0x12, 0xe4, 0x66, 0x54, 0x9f, 0xc3, 0xad, 0x96, 0xa8, + 0xec, 0x97, 0xa4, 0xac, 0xd0, 0x3c, 0x46, 0x12, 0x4c, 0x4c, 0x36, 0xfd, + 0xf5, 0x26, 0xae, 0xff, 0xfa, 0x56, 0xf2, 0xfb, 0xa6, 0xa0, 0xb7, 0x88, + 0x29, 0xd4, 0x7c, 0xb0, 0x30, 0x12, 0xa1, 0x0f, 0x6c, 0xc1, 0x40, 0x26, + 0x8b, 0x48, 0x0a, 0xb6, 0xdf, 0xb9, 0x8d, 0x35, 0x97, 0xad, 0x21, 0xa7, + 0xdf, 0xab, 0xe6, 0x66, 0x55, 0x99, 0xcc, 0x2e, 0x93, 0x5a, 0xb9, 0x46, + 0x8d, 0x1a, 0x89, 0xae, 0x04, 0xb5, 0x72, 0x00, 0xc2, 0x72, 0xa5, 0x83, + 0xb0, 0x4d, 0x8a, 0xfb, 0x4b, 0xd8, 0x29, 0x93, 0x1d, 0x1a, 0xa8, 0x25, + 0x5d, 0x89, 0x30, 0x05, 0x94, 0xa5, 0x1a, 0x23, 0x19, 0x0a, 0xae, 0x95, + 0x4d, 0x37, 0x02, 0x97, 0x12, 0x5d, 0xaa, 0xff, 0xdc, 0xf0, 0xce, 0xb1, + 0x47, 0xe8, 0xb2, 0x09, 0x2a, 0xa5, 0x8a, 0x1f, 0xa6, 0x56, 0xae, 0x61, + 0x2e, 0xe9, 0x61, 0xd3, 0x17, 0xd6, 0xb1, 0xd9, 0x80, 0x8d, 0x9f, 0x5d, + 0xc7, 0xf5, 0x5f, 0xdf, 0x1a, 0x84, 0x75, 0x25, 0xc5, 0xb2, 0xbe, 0x62, + 0xbb, 0x2c, 0x2a, 0x7a, 0xfe, 0xc9, 0x4e, 0x5b, 0x60, 0x48, 0x6a, 0x1e, + 0xfc, 0xf8, 0x30, 0x6a, 0x7d, 0xc4, 0x1c, 0xf3, 0x23, 0xa9, 0x14, 0xa4, + 0x52, 0x29, 0x4c, 0xd3, 0x44, 0x74, 0x59, 0x0a, 0xd2, 0x35, 0x97, 0x42, + 0x40, 0x2d, 0x08, 0xc0, 0x59, 0x40, 0x03, 0x4c, 0xcb, 0xea, 0xb3, 0x7c, + 0xe0, 0x96, 0xb7, 0x85, 0x00, 0x00, 0xe5, 0x4c, 0x3b, 0x01, 0x50, 0x4b, + 0xc7, 0x6d, 0x95, 0xf3, 0x5c, 0xf7, 0x99, 0xff, 0x79, 0xef, 0x8f, 0x79, + 0xfa, 0x97, 0x6a, 0x5e, 0xf2, 0x8a, 0xcb, 0xd7, 0x70, 0xeb, 0x6d, 0xdb, + 0x7d, 0xbf, 0x8d, 0xef, 0x38, 0x9f, 0xcd, 0x83, 0xbb, 0x1b, 0xca, 0x2c, + 0x00, 0xeb, 0x22, 0xdb, 0xcf, 0xdb, 0x03, 0x84, 0x59, 0x17, 0xd9, 0x38, + 0xf7, 0x15, 0x03, 0xc8, 0x57, 0xc8, 0x4f, 0x0c, 0x06, 0x63, 0x93, 0x9f, + 0x0d, 0x3e, 0xc6, 0xbb, 0x8a, 0xea, 0xbd, 0xa0, 0x18, 0x34, 0xfd, 0x3a, + 0x79, 0xf5, 0xf6, 0xea, 0x66, 0x7f, 0x80, 0xc2, 0xff, 0x72, 0x00, 0x00, + 0x20, 0x00, 0x49, 0x44, 0x41, 0x54, 0x32, 0xd3, 0x54, 0x3f, 0xba, 0x05, + 0xb6, 0xce, 0xbb, 0x01, 0x3a, 0xd6, 0x2d, 0x10, 0xdd, 0xa2, 0x6d, 0x5a, + 0x0d, 0xe5, 0x0a, 0xa5, 0x15, 0x95, 0x33, 0xed, 0xd0, 0xab, 0x17, 0x1e, + 0x78, 0x40, 0xad, 0x28, 0x4c, 0xcb, 0xd3, 0x73, 0x2f, 0x15, 0x39, 0xe9, + 0xc4, 0x53, 0xf8, 0x0d, 0x4f, 0xcd, 0xd1, 0xba, 0xb1, 0x62, 0xc5, 0x8a, + 0x15, 0x2b, 0x56, 0xac, 0x58, 0xb1, 0x62, 0xc5, 0x8a, 0x15, 0x2b, 0x56, + 0xac, 0x58, 0xb1, 0x62, 0xc5, 0x8a, 0x15, 0x2b, 0x56, 0xac, 0x58, 0xb1, + 0x62, 0xc5, 0x8a, 0x15, 0x6b, 0x3e, 0xc5, 0x66, 0x99, 0xb1, 0x62, 0xc5, + 0x8a, 0x15, 0x2b, 0xd6, 0x5b, 0x40, 0xad, 0x60, 0x50, 0x61, 0xb7, 0x30, + 0xb0, 0x29, 0x0a, 0x7b, 0x92, 0x75, 0x89, 0x33, 0xdb, 0xbc, 0x74, 0x2d, + 0x1a, 0x2e, 0xd3, 0x9b, 0xf1, 0xbf, 0xac, 0x5b, 0x9c, 0x29, 0x36, 0x41, + 0xa4, 0x3c, 0x23, 0x98, 0xf0, 0x02, 0xf3, 0x74, 0x3a, 0x4d, 0xa9, 0x54, + 0x6a, 0x08, 0xdb, 0xb3, 0xac, 0x87, 0x52, 0xa9, 0xd4, 0x54, 0x5e, 0x2f, + 0xcf, 0x4e, 0x41, 0x26, 0xb2, 0x1e, 0xac, 0xf0, 0x8d, 0x96, 0xc1, 0xfb, + 0xca, 0xbd, 0x0c, 0x2d, 0xe8, 0x94, 0xd5, 0x00, 0x9a, 0x95, 0x59, 0x9e, + 0x21, 0xaf, 0xbf, 0x38, 0x1d, 0x2e, 0x43, 0x3a, 0x9d, 0x56, 0x30, 0x99, + 0x50, 0xf6, 0xad, 0xea, 0xd0, 0x4e, 0xe1, 0x36, 0x13, 0x42, 0xe0, 0x56, + 0xd5, 0x42, 0x74, 0xcb, 0xb4, 0x28, 0xb5, 0x30, 0xaa, 0x89, 0xaa, 0x67, + 0x59, 0x0f, 0x33, 0xf3, 0xd4, 0x3d, 0x51, 0x05, 0xd3, 0x14, 0x60, 0x24, + 0xb0, 0xa8, 0x21, 0xcc, 0x14, 0xc5, 0x59, 0x87, 0x44, 0x1d, 0x6a, 0xda, + 0xd0, 0x35, 0xa5, 0x17, 0x8d, 0xd6, 0x0c, 0x7c, 0xcb, 0xba, 0xc6, 0xf5, + 0xac, 0x42, 0x03, 0xb3, 0xe6, 0x96, 0xac, 0x83, 0xec, 0x31, 0x49, 0x00, + 0x95, 0x65, 0x26, 0x54, 0x25, 0xcc, 0x4a, 0xe8, 0x33, 0x61, 0xda, 0xa5, + 0xd6, 0x67, 0x92, 0x9a, 0x75, 0x7d, 0x90, 0x95, 0x6a, 0x83, 0xc0, 0xa8, + 0xd5, 0x09, 0x7d, 0x56, 0x3a, 0x5f, 0x77, 0xdb, 0x1a, 0xba, 0x9a, 0x86, + 0xf0, 0xc1, 0x5a, 0x00, 0x52, 0x48, 0x84, 0x14, 0x48, 0x6d, 0x4c, 0x2f, + 0x25, 0x58, 0xcb, 0xd4, 0xa2, 0xd8, 0x4a, 0x79, 0x06, 0x6b, 0x99, 0xcd, + 0x0d, 0x5f, 0xb9, 0xd9, 0x77, 0x03, 0xc0, 0x75, 0x74, 0x7c, 0xf5, 0x85, + 0x6d, 0x53, 0x88, 0x26, 0xa3, 0x05, 0xff, 0x1a, 0x10, 0xf8, 0x86, 0x18, + 0xe1, 0x76, 0xc9, 0x4f, 0x3b, 0x64, 0xfa, 0x2c, 0x72, 0x85, 0xe0, 0x7a, + 0x48, 0x69, 0xf0, 0x4e, 0xab, 0x3c, 0x53, 0x5d, 0x3d, 0x48, 0xb7, 0xa8, + 0xa0, 0x59, 0x4b, 0x80, 0x24, 0x38, 0x1a, 0xa8, 0xb5, 0xbd, 0xfb, 0x6e, + 0xd6, 0x1c, 0xbc, 0x54, 0xf9, 0x25, 0x54, 0x93, 0x53, 0xe5, 0x4d, 0x93, + 0x99, 0x4c, 0x53, 0x8a, 0x18, 0x96, 0x99, 0x49, 0x65, 0xbc, 0x15, 0x86, + 0x42, 0x75, 0x96, 0x96, 0xed, 0x43, 0xa8, 0xc2, 0xfb, 0x0b, 0x0d, 0xd3, + 0x2a, 0x8e, 0x2a, 0x4f, 0xeb, 0xb0, 0xad, 0xdc, 0x53, 0x66, 0xb6, 0xa5, + 0xfb, 0xcc, 0x41, 0x9b, 0xf1, 0x1f, 0x36, 0x02, 0x39, 0x44, 0x97, 0x40, + 0x96, 0xe7, 0xbf, 0x97, 0x78, 0xe5, 0x90, 0x73, 0x1a, 0xa5, 0xb5, 0x96, + 0xd7, 0x96, 0xe9, 0x64, 0xaa, 0x65, 0xbb, 0x96, 0x4a, 0x5e, 0x59, 0xe7, + 0x36, 0x12, 0x74, 0x0e, 0x39, 0x08, 0x21, 0xa8, 0x48, 0xc9, 0xe0, 0xd9, + 0x59, 0x72, 0x11, 0x38, 0x42, 0xf6, 0x8c, 0x2c, 0x25, 0xa7, 0xa4, 0xcc, + 0xd8, 0xf6, 0xe7, 0x19, 0xd4, 0xc7, 0x95, 0x7a, 0xcd, 0x07, 0x60, 0x99, + 0xa6, 0x89, 0xeb, 0xba, 0xfe, 0x7d, 0xcf, 0x2d, 0x07, 0xa6, 0x7e, 0xd9, + 0x6c, 0x96, 0x4c, 0x5f, 0xc6, 0xdf, 0xcf, 0xe9, 0xaf, 0x32, 0xe7, 0xa7, + 0xf3, 0xb8, 0xae, 0x64, 0xf4, 0xbe, 0x71, 0x84, 0x10, 0x5c, 0xf7, 0x37, + 0x1b, 0x98, 0xd8, 0x35, 0x41, 0x2a, 0x99, 0xc0, 0x3d, 0xec, 0x52, 0x9c, + 0x29, 0x92, 0xa7, 0x48, 0x4a, 0xc3, 0xb2, 0xe6, 0x02, 0x6b, 0x79, 0x40, + 0x2d, 0x0f, 0x6c, 0x05, 0xcc, 0x79, 0x2f, 0xef, 0x14, 0x58, 0x35, 0x57, + 0xb8, 0x62, 0xd9, 0x61, 0x24, 0x3d, 0xc2, 0xb8, 0x1c, 0x27, 0x25, 0x52, + 0xa4, 0x44, 0x8a, 0x8a, 0xac, 0x60, 0x76, 0x99, 0xfe, 0xbe, 0x5b, 0x76, + 0x71, 0x45, 0x09, 0x73, 0x89, 0xb6, 0x0e, 0x69, 0x91, 0x6e, 0x27, 0x65, + 0x49, 0x25, 0x53, 0x64, 0x33, 0x99, 0x39, 0xa1, 0x62, 0x9d, 0x2a, 0x8a, + 0x7a, 0x3a, 0x40, 0x91, 0xe5, 0x21, 0xd8, 0xd3, 0x4a, 0x60, 0x27, 0x3b, + 0xdb, 0x62, 0x9f, 0xa2, 0xa0, 0xa9, 0x9d, 0x04, 0x30, 0xab, 0x30, 0x2c, + 0x6a, 0xa5, 0x0e, 0x57, 0x88, 0xc0, 0xb0, 0x54, 0x1a, 0xe8, 0xb8, 0xca, + 0x2f, 0x0a, 0xfa, 0x0a, 0xfb, 0xf5, 0xea, 0x3c, 0xd0, 0xe1, 0x7a, 0x09, + 0x83, 0xa7, 0x94, 0x5b, 0x21, 0x14, 0x67, 0x25, 0x01, 0xb4, 0x2a, 0xc8, + 0xbf, 0x11, 0x8a, 0x85, 0xae, 0x63, 0x58, 0x9d, 0xd4, 0x49, 0xb5, 0x4b, + 0x23, 0x18, 0xab, 0x11, 0xd0, 0xe5, 0xb9, 0x17, 0xd8, 0xc9, 0x4e, 0x56, + 0xea, 0xd6, 0x0e, 0x03, 0xbb, 0xa2, 0xf1, 0x9a, 0xcb, 0xd7, 0x98, 0x57, + 0x90, 0x26, 0x6c, 0x69, 0xd1, 0x96, 0xf3, 0xe9, 0x81, 0xc9, 0xc7, 0xb9, + 0x64, 0x57, 0x70, 0x3c, 0xd4, 0x7f, 0x2a, 0x7b, 0x9e, 0x3c, 0xc0, 0xdd, + 0xa7, 0x9f, 0xba, 0xc0, 0x94, 0x5e, 0x1f, 0x85, 0xe1, 0x5a, 0xa7, 0xb6, + 0xd9, 0x6f, 0x07, 0xe0, 0x8a, 0xba, 0x5f, 0xbf, 0xc0, 0x38, 0x9d, 0x84, + 0xef, 0x0f, 0xb9, 0x87, 0x41, 0x63, 0x03, 0x6d, 0xf6, 0x5b, 0xc1, 0xc8, + 0x00, 0xb6, 0x1a, 0xf3, 0xef, 0x77, 0xa2, 0xed, 0x06, 0x0c, 0x75, 0x18, + 0xf6, 0xea, 0xaa, 0xe4, 0xe6, 0x85, 0x25, 0x7f, 0x54, 0xda, 0xb5, 0x0b, + 0x4a, 0x67, 0xc0, 0xae, 0xc7, 0x5a, 0x78, 0x2e, 0x99, 0x23, 0xe2, 0xb7, + 0xb5, 0x31, 0xf7, 0x9d, 0x63, 0xb0, 0x7c, 0x44, 0xed, 0xf7, 0x65, 0x34, + 0xdd, 0xc1, 0xd3, 0xba, 0xce, 0x0a, 0xf1, 0xcd, 0xf6, 0x5e, 0xe6, 0x59, + 0x23, 0x2d, 0x01, 0x5a, 0xaf, 0x57, 0xf8, 0x06, 0xbd, 0xad, 0x05, 0x58, + 0xeb, 0x0d, 0xd0, 0xb6, 0xff, 0x7a, 0x13, 0xeb, 0xfe, 0xc7, 0x08, 0x5b, + 0xff, 0x4b, 0x50, 0xce, 0x75, 0xff, 0x34, 0xc8, 0x86, 0xd1, 0xeb, 0xfc, + 0xe3, 0x5b, 0x57, 0x5d, 0x8b, 0xb8, 0x61, 0x84, 0xc4, 0x35, 0x41, 0x18, + 0xe7, 0xda, 0x15, 0x4c, 0x64, 0xd5, 0x71, 0xee, 0x4f, 0x46, 0xb9, 0xee, + 0xff, 0xf9, 0x59, 0x43, 0xba, 0xc5, 0x19, 0xf5, 0x1c, 0x5a, 0xfd, 0xf1, + 0x55, 0x7c, 0xec, 0x4f, 0xff, 0xd0, 0x77, 0x7f, 0xab, 0x01, 0xb5, 0x64, + 0x49, 0x22, 0xd2, 0x91, 0xb1, 0xa4, 0x5b, 0x01, 0xd9, 0x08, 0xb0, 0x90, + 0xd3, 0xad, 0xa1, 0x61, 0x1d, 0xa9, 0x8a, 0xc2, 0x73, 0x78, 0x9d, 0x74, + 0x21, 0x41, 0x86, 0x00, 0xca, 0x1e, 0x34, 0x38, 0x0a, 0xd6, 0x92, 0xb5, + 0xc6, 0xc3, 0xe9, 0x1d, 0xaf, 0x0b, 0x74, 0xa9, 0x93, 0x34, 0x3c, 0xbb, + 0xe0, 0x85, 0xe4, 0x77, 0xe1, 0x85, 0x17, 0x72, 0x0f, 0x50, 0x7c, 0xe8, + 0x21, 0xee, 0xb9, 0xf0, 0x42, 0xce, 0xd3, 0xee, 0x93, 0xf7, 0xdf, 0xdf, + 0x32, 0xfc, 0x1f, 0x1c, 0x3a, 0x04, 0x87, 0x0e, 0x31, 0x06, 0xbc, 0x03, + 0x98, 0x2c, 0x57, 0xb9, 0x80, 0x2a, 0x1c, 0x3a, 0xc4, 0x6f, 0xe8, 0x6c, + 0x98, 0x31, 0xb7, 0x39, 0xa4, 0xf2, 0xef, 0xa4, 0x2e, 0x8b, 0x33, 0x19, + 0x5e, 0x2e, 0x2a, 0x43, 0xac, 0x43, 0xf2, 0x05, 0x4e, 0x39, 0xe5, 0x14, + 0xca, 0xc5, 0xa7, 0xe0, 0x95, 0x60, 0xf0, 0x15, 0xee, 0x59, 0xbd, 0xfa, + 0xc2, 0xaf, 0x79, 0x27, 0x27, 0x90, 0x3d, 0x23, 0xcb, 0x9f, 0x5f, 0xf1, + 0xe7, 0x2c, 0xe2, 0xb8, 0x0e, 0x4a, 0x3b, 0xb7, 0x16, 0x72, 0x5e, 0xe6, + 0xd3, 0xc4, 0x0a, 0xd5, 0x47, 0xce, 0x5f, 0x79, 0x3d, 0x9b, 0xff, 0x65, + 0x0d, 0xa3, 0x2e, 0x8c, 0x76, 0x39, 0xac, 0xfe, 0x7c, 0x8a, 0xd1, 0x9e, + 0x2d, 0x64, 0xf7, 0x2a, 0x10, 0x04, 0xf5, 0x2b, 0xc0, 0xf8, 0x10, 0xf6, + 0x79, 0x77, 0xc1, 0xec, 0x18, 0xc5, 0xa2, 0x4a, 0xbd, 0x76, 0xc8, 0x45, + 0x98, 0x26, 0x22, 0x44, 0x14, 0x93, 0x52, 0x8d, 0x89, 0x8b, 0x4e, 0x09, + 0xdb, 0x4a, 0xfb, 0x06, 0xea, 0x61, 0xb0, 0x96, 0xe7, 0x96, 0xdf, 0x2f, + 0xc9, 0x9c, 0x91, 0x9e, 0xb3, 0x8c, 0x43, 0x67, 0x0f, 0x92, 0x7f, 0xac, + 0x88, 0x08, 0x41, 0xb5, 0x00, 0x52, 0xcb, 0x57, 0x53, 0x7c, 0x38, 0xb8, + 0xde, 0x86, 0x07, 0x33, 0x14, 0x67, 0xaf, 0x01, 0x63, 0x29, 0x95, 0xbd, + 0xd7, 0x00, 0xc3, 0xbe, 0xdf, 0xf8, 0x44, 0x9e, 0xe1, 0x41, 0x55, 0x57, + 0x59, 0x17, 0xe4, 0x1f, 0x2b, 0x29, 0x98, 0x56, 0x2a, 0xd5, 0x34, 0x4e, + 0xaf, 0xb8, 0x6e, 0xd3, 0x58, 0x7a, 0xec, 0xbe, 0x9c, 0x1f, 0xbf, 0x9d, + 0xb2, 0x59, 0x13, 0xc8, 0x32, 0x3e, 0x91, 0x23, 0x55, 0x01, 0xb1, 0x24, + 0x15, 0x02, 0x7e, 0x2b, 0x00, 0xa4, 0x94, 0x0a, 0x94, 0x2c, 0x52, 0x89, + 0x96, 0x90, 0x01, 0x19, 0x81, 0x7e, 0x67, 0xb3, 0x59, 0x3f, 0x7e, 0x3e, + 0x5f, 0x84, 0xc3, 0x90, 0xc9, 0xd8, 0xe4, 0xf3, 0x45, 0xcc, 0x94, 0x1e, + 0x63, 0x75, 0xc0, 0x0a, 0x00, 0x38, 0x49, 0x1e, 0x81, 0xe3, 0x15, 0xd8, + 0xe9, 0x85, 0x17, 0x8e, 0x70, 0x24, 0x02, 0x79, 0x5a, 0x0f, 0xec, 0x01, + 0xf4, 0x19, 0xe7, 0x4c, 0xe0, 0x39, 0x20, 0x7d, 0xfb, 0xab, 0xd4, 0x3e, + 0x76, 0x0c, 0xa5, 0xa9, 0x23, 0x3c, 0x07, 0x1c, 0xb8, 0xfd, 0x55, 0xfe, + 0xa0, 0x1f, 0xfe, 0x53, 0xd9, 0x24, 0xfb, 0x40, 0xad, 0x0d, 0xc0, 0x13, + 0xd5, 0x23, 0xfc, 0x2f, 0x1d, 0xff, 0x38, 0xe0, 0x85, 0x48, 0xfe, 0x1e, + 0x44, 0xee, 0xa5, 0x97, 0x8e, 0x50, 0x7d, 0x49, 0xd9, 0xbc, 0x02, 0x24, + 0x53, 0x6f, 0x0c, 0xfc, 0xea, 0xf0, 0x6b, 0x00, 0x52, 0xbd, 0x51, 0x65, + 0x81, 0xc6, 0xf2, 0xfc, 0x09, 0x01, 0x3c, 0x0b, 0x02, 0xa0, 0x96, 0xa7, + 0x7d, 0xc0, 0xdc, 0x28, 0xab, 0xf6, 0xf2, 0x20, 0x4f, 0xab, 0x0c, 0x78, + 0xa6, 0x05, 0x63, 0xc9, 0x03, 0x4f, 0xbd, 0x8b, 0x00, 0xac, 0xd5, 0xec, + 0xaf, 0xb4, 0xf7, 0x44, 0x9b, 0x3f, 0xa3, 0xcc, 0x8f, 0x69, 0x0f, 0xdf, + 0xea, 0x54, 0x7d, 0xa8, 0xee, 0xd6, 0xde, 0x13, 0x6d, 0xce, 0x7a, 0xb1, + 0x08, 0x04, 0x20, 0xa9, 0x76, 0x60, 0xad, 0xa6, 0x34, 0xfa, 0x61, 0x7a, + 0x0a, 0x7e, 0x56, 0x85, 0x53, 0x43, 0x97, 0x8b, 0x04, 0x3e, 0x78, 0x8e, + 0x82, 0x70, 0x7d, 0xf0, 0x1c, 0x80, 0x45, 0x3e, 0xa8, 0x6a, 0x44, 0x48, + 0xc6, 0x25, 0xd4, 0x84, 0x20, 0x21, 0x61, 0xb0, 0x0b, 0x6a, 0x40, 0xbe, + 0xdc, 0xea, 0xda, 0x51, 0x98, 0x2c, 0x6f, 0x86, 0xe4, 0x4a, 0x68, 0xfb, + 0x16, 0xd8, 0x16, 0x50, 0x0c, 0x41, 0x2f, 0x24, 0xb0, 0xad, 0x2c, 0xb0, + 0x91, 0xd8, 0x3a, 0xe5, 0xa2, 0xf6, 0x19, 0xf4, 0xee, 0xdc, 0x5e, 0x5a, + 0x02, 0xa4, 0x7e, 0x78, 0x2d, 0x3e, 0x47, 0xb5, 0xc1, 0xf4, 0x4f, 0x80, + 0x45, 0xf0, 0xe3, 0x29, 0xfc, 0x73, 0x63, 0xcd, 0xd3, 0x1e, 0x63, 0x8f, + 0xb8, 0x8c, 0x9c, 0x6d, 0xfa, 0x30, 0xad, 0xd1, 0x5d, 0x6a, 0x5e, 0x67, + 0xd5, 0x8a, 0x20, 0xe6, 0xe8, 0x83, 0xc1, 0x5c, 0xcf, 0x2a, 0xd6, 0xb2, + 0xea, 0x3c, 0xe5, 0x37, 0x16, 0x72, 0x1f, 0x99, 0xc3, 0x6d, 0x2e, 0xf7, + 0xf4, 0x47, 0xef, 0x02, 0x60, 0xcf, 0x77, 0x14, 0x40, 0x79, 0xa8, 0x57, + 0xdd, 0x97, 0xf6, 0x14, 0x5c, 0x86, 0x7a, 0x4d, 0xae, 0xf9, 0xc6, 0x1e, + 0x1c, 0x6d, 0x10, 0xbd, 0xea, 0x33, 0x16, 0x5b, 0xf7, 0xc2, 0x28, 0x97, + 0x90, 0x76, 0xc6, 0xd9, 0xfc, 0xe5, 0x1f, 0xb1, 0xf1, 0xab, 0x97, 0x40, + 0xd2, 0x86, 0x6a, 0xb1, 0x25, 0x4c, 0xcb, 0x93, 0x69, 0x40, 0xc2, 0xa8, + 0xb0, 0xee, 0xa2, 0x4c, 0x00, 0xcf, 0xd2, 0xf1, 0x7c, 0x85, 0x8f, 0xf5, + 0x3c, 0x17, 0xf3, 0xcc, 0xcd, 0x39, 0xfb, 0x1a, 0xfb, 0x4f, 0x76, 0x52, + 0x52, 0xac, 0xaa, 0x73, 0x15, 0x00, 0xb5, 0x60, 0xdb, 0xbf, 0xa9, 0xfa, + 0x67, 0x35, 0x34, 0x6b, 0x20, 0xab, 0x9e, 0x47, 0xf6, 0x47, 0x25, 0x6b, + 0xfa, 0x6e, 0x61, 0xfd, 0x3f, 0x7c, 0x0c, 0xb1, 0x4c, 0x90, 0x7f, 0x4c, + 0xb2, 0xfa, 0xe3, 0xfa, 0xde, 0x7c, 0x96, 0xda, 0x4c, 0xec, 0x95, 0x3e, + 0x60, 0x0b, 0x20, 0x85, 0xcb, 0xba, 0x2f, 0x6f, 0xe6, 0xfa, 0xaf, 0x5e, + 0x4f, 0x0a, 0x97, 0x0a, 0x26, 0xa9, 0x08, 0xaa, 0x6a, 0x3e, 0xb9, 0xb2, + 0x84, 0x45, 0x06, 0xea, 0x29, 0x14, 0xfe, 0xcd, 0xd3, 0x1e, 0x3d, 0xdf, + 0x3b, 0x83, 0x53, 0x0a, 0x8f, 0x09, 0xc2, 0x73, 0x6c, 0xb7, 0x03, 0x6b, + 0x71, 0xeb, 0x0e, 0x95, 0x72, 0x1a, 0x57, 0x7a, 0x6d, 0x94, 0x41, 0xfd, + 0xe2, 0x82, 0xf4, 0x02, 0xe8, 0x94, 0x85, 0x5b, 0x2f, 0x05, 0x50, 0x2c, + 0x40, 0xfd, 0xea, 0x2d, 0x2a, 0x25, 0x07, 0xa9, 0xd3, 0xa8, 0x94, 0xd2, + 0xfe, 0x7e, 0xa3, 0x02, 0xb7, 0x04, 0x90, 0x10, 0xe0, 0xd4, 0x25, 0x96, + 0x30, 0x71, 0xea, 0xae, 0x9a, 0x17, 0xd7, 0x6d, 0x60, 0x09, 0x93, 0x5a, + 0xdd, 0xc4, 0xad, 0x83, 0x83, 0x8b, 0x25, 0xcc, 0x36, 0xad, 0xa3, 0x01, + 0xc9, 0xd8, 0x7e, 0xca, 0xd7, 0x5d, 0xa6, 0xc0, 0x18, 0xf9, 0xc7, 0x26, + 0x59, 0xbd, 0xfc, 0x46, 0x76, 0xec, 0x53, 0x1f, 0xa3, 0x08, 0x00, 0x5b, + 0x37, 0x22, 0xe5, 0xb5, 0xc8, 0xfa, 0x75, 0xac, 0xca, 0xf6, 0x73, 0x43, + 0xa1, 0x3d, 0x7c, 0xb8, 0xb9, 0xbe, 0xa0, 0xda, 0x71, 0x10, 0xd8, 0x05, + 0x58, 0xf4, 0x24, 0x07, 0x99, 0xa9, 0x4e, 0xd0, 0x78, 0x0e, 0xc0, 0x43, + 0xf4, 0xb9, 0x75, 0x97, 0x14, 0x16, 0x60, 0xe1, 0xca, 0x12, 0xa6, 0x98, + 0xbb, 0xbf, 0xe3, 0xa9, 0x27, 0xf4, 0xb7, 0x3b, 0xe4, 0x3e, 0xa3, 0xdd, + 0x00, 0xce, 0xa7, 0x09, 0xa7, 0xe6, 0xc7, 0x99, 0x09, 0x85, 0xf5, 0xc2, + 0xcc, 0x84, 0xc2, 0xcc, 0xe8, 0x83, 0x1e, 0x2f, 0xb1, 0x88, 0x0a, 0x3b, + 0xa1, 0x77, 0x65, 0xb0, 0x9d, 0x57, 0x3b, 0xf5, 0x5c, 0x99, 0x8e, 0xa3, + 0x27, 0xf5, 0x1a, 0xd4, 0xbb, 0x12, 0x7a, 0x0b, 0xa1, 0xf4, 0x81, 0xff, + 0x26, 0x0b, 0xdc, 0x2f, 0xe0, 0xa1, 0x86, 0x92, 0xc2, 0x7a, 0x2f, 0xee, + 0xca, 0x5e, 0x2e, 0xbc, 0x70, 0x0b, 0xb3, 0xbb, 0x55, 0x92, 0xd3, 0xff, + 0x08, 0xd0, 0xcb, 0x3f, 0x16, 0x0a, 0x7c, 0x6e, 0x4b, 0x73, 0x79, 0x3d, + 0xfd, 0xf3, 0x6e, 0xf8, 0x6f, 0xbb, 0x81, 0x1f, 0xea, 0xf9, 0xc7, 0x90, + 0x5f, 0xe1, 0x73, 0x00, 0x1f, 0xa2, 0x77, 0x0b, 0x14, 0x7a, 0x83, 0xf9, + 0x2f, 0xaf, 0x4c, 0xfe, 0x24, 0x1f, 0x50, 0x28, 0x04, 0x75, 0xba, 0xfc, + 0x36, 0x58, 0xfb, 0x3d, 0xb8, 0x50, 0xc2, 0xf9, 0x97, 0xf7, 0x00, 0x30, + 0xe3, 0x35, 0x24, 0x70, 0xee, 0xf7, 0x66, 0xb8, 0xfd, 0xcf, 0x54, 0x98, + 0x37, 0x42, 0x69, 0xd3, 0xa4, 0xa4, 0xe7, 0xb9, 0x3d, 0x48, 0xac, 0x98, + 0xd5, 0x57, 0x86, 0x06, 0x09, 0xb5, 0xd5, 0xf2, 0x8c, 0x8a, 0xef, 0xba, + 0x01, 0x9c, 0xab, 0xae, 0xee, 0x7d, 0xd2, 0xad, 0xf8, 0xe3, 0x4a, 0xff, + 0xc3, 0x0b, 0xa0, 0xa0, 0x95, 0xd5, 0xd0, 0x98, 0xb4, 0x9d, 0xea, 0x12, + 0xe9, 0x8f, 0x5b, 0x03, 0x50, 0x0a, 0x46, 0xe7, 0xf3, 0xde, 0x8d, 0xd2, + 0x23, 0x31, 0x89, 0x1a, 0x5f, 0x68, 0xa0, 0x61, 0x2a, 0x69, 0x62, 0x7d, + 0x65, 0x3b, 0x52, 0xbf, 0xf3, 0x9c, 0xf8, 0x9b, 0x35, 0x64, 0xcf, 0x1d, + 0x26, 0xf7, 0x15, 0x09, 0x95, 0x1a, 0xfc, 0xf9, 0x26, 0xf8, 0xf2, 0x3a, + 0xa8, 0x4b, 0xd2, 0xdf, 0xde, 0xae, 0xc7, 0xd3, 0x26, 0x1d, 0xf5, 0x90, + 0xfd, 0xf7, 0xa7, 0x91, 0xb0, 0x9d, 0x0e, 0xa6, 0x3a, 0x94, 0x6d, 0x08, + 0x4a, 0x42, 0xc1, 0xa9, 0xfc, 0xac, 0x09, 0xc6, 0x75, 0x96, 0xa1, 0x9e, + 0x75, 0x08, 0xa1, 0xf8, 0xda, 0x91, 0x3e, 0x4e, 0xf3, 0xfb, 0x4d, 0x35, + 0xae, 0xc8, 0x0b, 0x35, 0x10, 0xc8, 0x24, 0x05, 0xf9, 0xaa, 0xf4, 0xcb, + 0x9d, 0x9b, 0x95, 0xfe, 0xdd, 0xd1, 0xbb, 0x03, 0x17, 0xab, 0x2e, 0xdb, + 0xcd, 0x34, 0x7b, 0x92, 0x82, 0x62, 0x68, 0x1c, 0x52, 0x34, 0x14, 0x98, + 0xca, 0x36, 0x04, 0xc5, 0xba, 0x0c, 0xca, 0x25, 0x25, 0x35, 0x60, 0x26, + 0x29, 0x1a, 0xcb, 0x6f, 0x48, 0x6a, 0x55, 0x49, 0x5e, 0x08, 0x1f, 0x39, + 0x59, 0x7c, 0xe8, 0x6e, 0x52, 0x7a, 0x1e, 0x6e, 0xe4, 0xa2, 0x11, 0xc6, + 0xee, 0x1b, 0x23, 0x85, 0x4e, 0xef, 0xb1, 0x3c, 0x5b, 0x23, 0x1f, 0x48, + 0x91, 0x52, 0x92, 0x43, 0x52, 0xab, 0xab, 0x79, 0xd0, 0x5a, 0x1d, 0x8a, + 0x86, 0xd7, 0x77, 0x02, 0x50, 0xfd, 0xa9, 0x22, 0x82, 0xa2, 0x01, 0xa5, + 0x2a, 0x24, 0x34, 0xbc, 0xa7, 0x52, 0x47, 0xfd, 0x8e, 0x0d, 0x15, 0xd6, + 0xae, 0x2b, 0x30, 0x58, 0x09, 0xc9, 0x14, 0x0d, 0x18, 0x4c, 0x1c, 0x20, + 0x2b, 0x12, 0xe4, 0xeb, 0x00, 0xc1, 0x33, 0xbf, 0x58, 0x4f, 0x61, 0x6a, + 0xe0, 0x56, 0xd6, 0x04, 0xb7, 0x24, 0x31, 0xd3, 0xfa, 0xb7, 0xe7, 0x87, + 0x91, 0x0d, 0xe7, 0xa9, 0xd3, 0x9f, 0xc4, 0x93, 0x08, 0x5e, 0x79, 0x62, + 0x92, 0xe3, 0x18, 0xe0, 0x74, 0x24, 0x4f, 0x22, 0x9a, 0xb6, 0x19, 0xd9, + 0xdf, 0xd2, 0xfd, 0xf5, 0xda, 0xa6, 0x0f, 0x1d, 0xe2, 0xe7, 0xfb, 0x03, + 0xa0, 0x96, 0x95, 0x54, 0x20, 0x2d, 0x2b, 0xa9, 0xca, 0x68, 0x25, 0xe1, + 0xdc, 0xa1, 0x2c, 0xce, 0xa1, 0x32, 0x25, 0x96, 0x74, 0x9c, 0x2e, 0x28, + 0x90, 0xd5, 0x98, 0x98, 0x62, 0xe4, 0x75, 0xac, 0x43, 0xaf, 0x1c, 0x80, + 0xa3, 0x88, 0xff, 0xf5, 0xfb, 0x9e, 0xe5, 0xa6, 0xaf, 0x6f, 0x06, 0xe0, + 0xbe, 0x8d, 0x1b, 0xfd, 0x73, 0xe1, 0x41, 0xb2, 0xa2, 0xf2, 0xdc, 0xff, + 0xfb, 0xce, 0x9d, 0x7c, 0xf8, 0xf8, 0xe3, 0x1b, 0xe0, 0x5a, 0x9e, 0xdf, + 0xd2, 0x93, 0x3a, 0x1f, 0x89, 0x0d, 0x9f, 0x3b, 0x48, 0xb1, 0x10, 0xf4, + 0xb5, 0xdc, 0xc8, 0xfd, 0xaf, 0x56, 0x87, 0x52, 0xd9, 0xc5, 0x0e, 0xbd, + 0x54, 0x11, 0x06, 0xec, 0x2a, 0x4c, 0xb0, 0xa2, 0x77, 0x90, 0x8a, 0xa3, + 0xc6, 0x1e, 0x00, 0x95, 0x62, 0x85, 0xc1, 0xb3, 0x86, 0x11, 0x46, 0x8d, + 0x5d, 0xe5, 0x09, 0x3f, 0x7c, 0xc5, 0x91, 0xd8, 0xdd, 0x3d, 0x14, 0x1f, + 0x9b, 0x81, 0x33, 0xe0, 0xca, 0xbf, 0xb8, 0x12, 0xbb, 0x6f, 0x80, 0xec, + 0x59, 0xfd, 0xe4, 0x67, 0x8a, 0x98, 0xcb, 0x40, 0x98, 0x40, 0x55, 0x6f, + 0xcb, 0x35, 0x6c, 0x3b, 0x43, 0x7e, 0x7f, 0x9e, 0xec, 0xd9, 0x19, 0x12, + 0x86, 0xba, 0x32, 0xb2, 0x99, 0x41, 0x72, 0xf9, 0x09, 0x4c, 0x7d, 0x8b, + 0x74, 0x5d, 0x48, 0x2c, 0x0f, 0x60, 0x5a, 0x89, 0xae, 0x04, 0xe3, 0x0f, + 0xed, 0xc1, 0x4e, 0x99, 0x14, 0x2b, 0xae, 0xa2, 0xc9, 0x01, 0x8e, 0xe3, + 0x70, 0xe9, 0xf9, 0x97, 0x52, 0x2b, 0xd7, 0x98, 0x70, 0x73, 0x48, 0x57, + 0x82, 0x01, 0x83, 0x7d, 0x6a, 0xbe, 0x62, 0xf4, 0xc1, 0x5d, 0x48, 0x57, + 0x32, 0xd8, 0x97, 0x6d, 0x80, 0x73, 0x85, 0x21, 0x5d, 0xe1, 0x1b, 0x9b, + 0x07, 0xd4, 0xaa, 0x55, 0xc1, 0xfb, 0x78, 0x40, 0xb6, 0xcf, 0x66, 0xcd, + 0x15, 0xeb, 0x18, 0xfa, 0xc0, 0x00, 0x9b, 0xbf, 0x11, 0x7c, 0xe0, 0xa2, + 0xe2, 0x4a, 0x12, 0x49, 0xb0, 0xbb, 0xd4, 0x5d, 0xad, 0x58, 0x2e, 0x92, + 0xe9, 0x1b, 0x20, 0xd1, 0x63, 0x53, 0x93, 0xde, 0xda, 0x0c, 0x3d, 0x3f, + 0x55, 0x55, 0xfd, 0x4c, 0x51, 0x0f, 0x65, 0x29, 0x21, 0x91, 0xc4, 0x07, + 0x6f, 0x99, 0xc9, 0x1e, 0xe5, 0xd5, 0x95, 0x60, 0xa0, 0xcb, 0x66, 0xac, + 0x90, 0x9f, 0x7b, 0x8e, 0x2d, 0x0c, 0x74, 0xf2, 0x00, 0x5b, 0x1e, 0xf0, + 0xa9, 0x4f, 0x43, 0xa0, 0x42, 0xfb, 0x56, 0x08, 0x24, 0xe5, 0x81, 0xa3, + 0x7c, 0xb0, 0x54, 0x5f, 0xb0, 0x1f, 0x86, 0x47, 0x59, 0x17, 0xa9, 0xba, + 0x79, 0x6e, 0x56, 0x9f, 0xc5, 0xa7, 0xff, 0xf2, 0xbb, 0x7c, 0x64, 0xe5, + 0xc9, 0x00, 0x9c, 0x72, 0xf2, 0x12, 0x9e, 0xfe, 0xe5, 0x21, 0x9e, 0xfe, + 0xe5, 0x21, 0xae, 0xb8, 0x5c, 0x7d, 0xb4, 0xe2, 0x8e, 0xbb, 0x66, 0xf9, + 0x55, 0xf5, 0x14, 0xfe, 0xe0, 0xf7, 0x5f, 0xf2, 0x41, 0x5b, 0x97, 0xf1, + 0x5e, 0xee, 0x38, 0xfe, 0x71, 0xbf, 0xcc, 0x0d, 0x65, 0x21, 0x52, 0x06, + 0x9d, 0xa7, 0xfa, 0xa0, 0x48, 0x00, 0xbc, 0xb2, 0xfa, 0x2c, 0xde, 0xf1, + 0x6f, 0x26, 0x97, 0x7d, 0xec, 0x72, 0x2e, 0xf8, 0xc8, 0xe9, 0xba, 0xe2, + 0x17, 0x71, 0x0d, 0x9f, 0xe6, 0x81, 0x1d, 0x4f, 0xb2, 0xe9, 0x17, 0x5f, + 0x6a, 0x02, 0x62, 0xf9, 0xfb, 0xe1, 0xb4, 0xa2, 0xdb, 0x08, 0xcc, 0xcb, + 0x6b, 0x9f, 0x68, 0x5a, 0xe1, 0x72, 0xf9, 0x6d, 0x14, 0x91, 0xe7, 0x5e, + 0xb0, 0x72, 0x2c, 0x79, 0x2a, 0x00, 0x6b, 0x01, 0x64, 0xdf, 0xfb, 0x7f, + 0x72, 0x60, 0x7f, 0x00, 0x12, 0x5c, 0x7c, 0x42, 0x30, 0x26, 0x72, 0x62, + 0xa8, 0x56, 0xac, 0x58, 0xb1, 0x62, 0xc5, 0x8a, 0x15, 0x2b, 0x56, 0xac, + 0x58, 0xb1, 0x62, 0xc5, 0x8a, 0x15, 0x2b, 0x56, 0xac, 0x58, 0xb1, 0x62, + 0xc5, 0x8a, 0x15, 0x2b, 0x56, 0xac, 0x58, 0xb1, 0x62, 0x1d, 0x95, 0x62, + 0xa8, 0x56, 0xac, 0x58, 0xb1, 0x62, 0xc5, 0x8a, 0xf5, 0x16, 0x90, 0xac, + 0x4b, 0x05, 0x91, 0x0a, 0x2f, 0x4a, 0xae, 0x37, 0xef, 0xa7, 0xd3, 0xe9, + 0x06, 0xd0, 0x0a, 0xa8, 0x85, 0xde, 0xd6, 0x32, 0xcb, 0x07, 0xb3, 0x44, + 0xd3, 0x05, 0x05, 0xd4, 0xca, 0x17, 0xf2, 0xea, 0x8b, 0x98, 0xd5, 0x4a, + 0x03, 0xa8, 0x4b, 0x18, 0x02, 0xbb, 0xc7, 0x26, 0xaf, 0x17, 0x4d, 0x7a, + 0x30, 0x2b, 0x80, 0x52, 0xa9, 0xd4, 0x00, 0xa5, 0x12, 0x86, 0x50, 0xd0, + 0x97, 0x36, 0x80, 0x2f, 0xe8, 0x7c, 0xc1, 0x79, 0x18, 0xc0, 0x25, 0x0c, + 0x41, 0x66, 0x79, 0x86, 0xdc, 0xde, 0x9c, 0x5f, 0x06, 0xd3, 0x34, 0x55, + 0xbe, 0x52, 0x92, 0x4e, 0xa7, 0x91, 0x52, 0xfa, 0x65, 0xa8, 0x94, 0x2b, + 0x2d, 0xcb, 0xe0, 0xc1, 0xbe, 0xc2, 0x60, 0xaf, 0x56, 0x75, 0xf0, 0xda, + 0xc6, 0x2b, 0x83, 0x07, 0xcf, 0xf2, 0xcb, 0x16, 0x5e, 0x44, 0x0f, 0x38, + 0x6e, 0x7b, 0x58, 0x8f, 0xd7, 0x5e, 0xb2, 0x2e, 0xd5, 0x39, 0x98, 0x67, + 0xb1, 0x7e, 0xba, 0xc7, 0xa2, 0x58, 0x76, 0x82, 0xaf, 0x73, 0x97, 0x2b, + 0x20, 0x84, 0xbf, 0x24, 0xda, 0x4e, 0x0a, 0x8a, 0x9e, 0x11, 0x80, 0x07, + 0xd4, 0x6a, 0xd9, 0x80, 0xca, 0x46, 0x1d, 0x5a, 0x2f, 0x86, 0x76, 0x85, + 0x84, 0x2e, 0x13, 0xaa, 0x2e, 0x35, 0x20, 0x91, 0xd4, 0x79, 0x2c, 0x0b, + 0xa5, 0x36, 0xed, 0x2a, 0x68, 0x14, 0x28, 0xb0, 0x16, 0xc1, 0x17, 0x95, + 0x3d, 0x49, 0x5d, 0x80, 0x86, 0x32, 0x48, 0x30, 0x7b, 0x94, 0x01, 0x96, + 0x33, 0xa3, 0xda, 0xc6, 0x34, 0xb4, 0xe1, 0x9e, 0x67, 0x44, 0x1b, 0x29, + 0xb4, 0x33, 0x5b, 0xc4, 0x29, 0x4d, 0x41, 0x3d, 0xd1, 0x00, 0xb6, 0x72, + 0x66, 0x03, 0xc3, 0x24, 0x2b, 0x19, 0x44, 0x0a, 0x1b, 0xe8, 0x4a, 0xfd, + 0x45, 0xe5, 0x68, 0xd3, 0xce, 0x67, 0x17, 0x01, 0x50, 0xd1, 0xbf, 0x83, + 0xa8, 0x21, 0xdf, 0xd4, 0xbe, 0x31, 0xac, 0x74, 0x3f, 0xc2, 0xb4, 0xc1, + 0x72, 0x54, 0x62, 0x06, 0x58, 0xe7, 0x2a, 0xff, 0x35, 0x07, 0x2f, 0xc5, + 0xbd, 0xa3, 0x02, 0x65, 0xd4, 0x7a, 0xf5, 0x37, 0x11, 0xa8, 0x35, 0x97, + 0x5a, 0x81, 0x9f, 0xe6, 0x83, 0x60, 0xb9, 0xd5, 0x62, 0x47, 0x61, 0x5e, + 0x5b, 0x79, 0x16, 0x16, 0xaf, 0x38, 0x9b, 0xf3, 0x21, 0x58, 0x9d, 0xc4, + 0xef, 0x14, 0xf0, 0xe5, 0x56, 0x8b, 0xf3, 0x1b, 0xca, 0x44, 0x54, 0x2a, + 0x05, 0x0b, 0xc5, 0x65, 0xb5, 0x32, 0x47, 0xc8, 0x0e, 0xd2, 0xd2, 0xd0, + 0x3d, 0x3b, 0x9d, 0x26, 0x5f, 0x2c, 0x62, 0x99, 0x16, 0x69, 0x4b, 0x2d, + 0x86, 0x2d, 0x39, 0x2e, 0xb9, 0xc7, 0x72, 0x98, 0xa6, 0x45, 0x8d, 0xe6, + 0x45, 0xe9, 0xa0, 0x8c, 0x80, 0x4a, 0x6e, 0x85, 0x74, 0x8f, 0x8d, 0xeb, + 0x4a, 0xa4, 0x04, 0xa1, 0x21, 0x83, 0x15, 0xfd, 0xa5, 0xe1, 0x30, 0x64, + 0xb0, 0x41, 0x75, 0x89, 0xd9, 0xa5, 0xc2, 0xde, 0xf0, 0xb5, 0x9b, 0x00, + 0xc1, 0x9a, 0x0f, 0x8f, 0x70, 0xe5, 0xa7, 0xaf, 0x60, 0xcd, 0x15, 0x57, + 0xa9, 0x34, 0xaa, 0x15, 0x1f, 0xac, 0xb5, 0x27, 0xb7, 0x87, 0x54, 0x32, + 0x45, 0x45, 0xd7, 0x79, 0xf8, 0xbc, 0x61, 0x72, 0xb9, 0x1c, 0x12, 0xa8, + 0xc9, 0xc6, 0x76, 0xe8, 0x49, 0xa7, 0x71, 0xeb, 0x12, 0x53, 0xdf, 0x0b, + 0x5d, 0x0f, 0x80, 0xa8, 0x41, 0x7a, 0xde, 0x3e, 0xc0, 0x8c, 0xbe, 0xff, + 0x9a, 0x5d, 0x66, 0x43, 0xf8, 0xe8, 0x7e, 0xc9, 0xf5, 0xa0, 0x04, 0xca, + 0x40, 0x68, 0xdb, 0x9d, 0x77, 0x03, 0x82, 0x91, 0x8b, 0x15, 0x18, 0x66, + 0xfb, 0xf7, 0xd5, 0xd7, 0x89, 0x2b, 0xb2, 0x42, 0x4a, 0xa4, 0xa0, 0x4b, + 0xed, 0x57, 0x0e, 0xea, 0x63, 0x82, 0x7b, 0x74, 0xda, 0x34, 0x5b, 0x96, + 0xcf, 0xff, 0xf2, 0xb5, 0x94, 0x7e, 0x5d, 0x8b, 0x33, 0x45, 0x2a, 0xd5, + 0x8a, 0x86, 0x8a, 0x4d, 0x62, 0x75, 0x05, 0x50, 0x03, 0x67, 0xbe, 0xaf, + 0x39, 0x87, 0x14, 0x06, 0x32, 0x79, 0x28, 0xa8, 0x65, 0x04, 0xb0, 0xa6, + 0x30, 0x00, 0x2b, 0xba, 0x0d, 0x10, 0x50, 0x4a, 0x3b, 0x43, 0x61, 0x55, + 0x7c, 0x75, 0xbc, 0x92, 0x95, 0x7e, 0xa8, 0x30, 0x2c, 0xea, 0xf4, 0xfd, + 0xf7, 0x72, 0x71, 0x6f, 0x2f, 0xf7, 0x16, 0x0a, 0x0b, 0xde, 0x7e, 0xb3, + 0x8d, 0xfb, 0xbd, 0xf7, 0xde, 0x0b, 0x9f, 0xfd, 0x6c, 0x43, 0x1d, 0x77, + 0x86, 0x30, 0x5b, 0x1e, 0x90, 0x2a, 0x0c, 0xbe, 0xf2, 0x80, 0x5c, 0xeb, + 0x59, 0xc9, 0x4e, 0x76, 0x6a, 0x10, 0x57, 0x2f, 0x85, 0x0e, 0xea, 0xe4, + 0xb5, 0x81, 0xd7, 0x12, 0x1e, 0x74, 0x6b, 0x67, 0x28, 0xbf, 0x00, 0x06, + 0xd6, 0xeb, 0x83, 0xbb, 0x9a, 0x41, 0x64, 0x81, 0x85, 0x63, 0x21, 0xd4, + 0xaa, 0xd1, 0xf3, 0x13, 0x94, 0xbb, 0xd0, 0xe0, 0x0e, 0x70, 0x06, 0x9d, + 0xe9, 0x92, 0x5d, 0xf0, 0xa3, 0x15, 0xc0, 0x7f, 0x3e, 0x0e, 0xc0, 0xa5, + 0x22, 0xc1, 0xf0, 0x7d, 0xf8, 0x5f, 0x0c, 0x6f, 0x07, 0x85, 0x8a, 0xfa, + 0xbd, 0x5e, 0x00, 0xab, 0x4d, 0xf5, 0xc0, 0xed, 0x80, 0xde, 0x3f, 0x75, + 0x8e, 0xfd, 0xb0, 0xc2, 0x71, 0xbd, 0xe3, 0x56, 0xfb, 0xd1, 0x38, 0x0b, + 0x09, 0x3f, 0x55, 0x0f, 0xc0, 0x5a, 0x1b, 0xea, 0x41, 0x1b, 0x4c, 0xd6, + 0x03, 0x98, 0x56, 0x74, 0x1f, 0x1a, 0x41, 0x5b, 0x00, 0xeb, 0xb4, 0xfb, + 0x56, 0xa3, 0x79, 0x5f, 0x02, 0xdb, 0x3a, 0x9c, 0xcd, 0x5a, 0x53, 0x57, + 0x06, 0x76, 0x73, 0xc9, 0xd5, 0xf8, 0x8d, 0x9b, 0xff, 0xeb, 0xf5, 0xb0, + 0xfd, 0x7a, 0xe5, 0xa8, 0xfb, 0xa4, 0xf4, 0x6a, 0x00, 0xc9, 0x3e, 0x15, + 0xc6, 0xdd, 0x37, 0x1e, 0x8d, 0xde, 0x56, 0x51, 0xc8, 0x94, 0xf9, 0xfe, + 0x4b, 0x71, 0x7f, 0x7a, 0x37, 0xd4, 0x87, 0x11, 0xe2, 0x16, 0xc6, 0x1f, + 0x5e, 0x8a, 0x13, 0xe9, 0xa0, 0x8c, 0x3f, 0xac, 0xc3, 0x7e, 0x54, 0xe2, + 0xb6, 0x33, 0x89, 0xf9, 0x54, 0x29, 0x04, 0xd6, 0x1a, 0x87, 0x87, 0x26, + 0xe1, 0xd7, 0x93, 0xe0, 0x5a, 0x40, 0x0d, 0xde, 0x31, 0x00, 0x3f, 0x1e, + 0x80, 0x73, 0x6f, 0x57, 0x90, 0x2a, 0x4f, 0xbd, 0x36, 0x5c, 0x3c, 0x02, + 0xf5, 0x9b, 0xf0, 0x61, 0x91, 0x9f, 0xa1, 0x2d, 0x58, 0x2b, 0x0a, 0xc8, + 0xba, 0xf9, 0x4b, 0xed, 0x41, 0x01, 0xad, 0xc2, 0x2f, 0x58, 0x6f, 0xeb, + 0x57, 0xdb, 0x17, 0xa6, 0xa0, 0x50, 0x84, 0x87, 0xb7, 0x35, 0xc2, 0xb6, + 0xc2, 0xba, 0x78, 0x04, 0x18, 0x83, 0x87, 0x17, 0x0e, 0xd4, 0x8c, 0x4a, + 0x58, 0x29, 0xa8, 0x4f, 0xa0, 0xda, 0x44, 0x3d, 0xa3, 0x52, 0xe9, 0xc6, + 0xfe, 0xb5, 0x65, 0x2a, 0xe8, 0x84, 0x7b, 0x50, 0x3d, 0x27, 0x3d, 0x88, + 0x56, 0x54, 0x25, 0xc7, 0x61, 0xcb, 0x3f, 0xdd, 0x05, 0x86, 0x60, 0xfd, + 0xba, 0x0f, 0xcd, 0x9f, 0xb7, 0xf0, 0x9e, 0x89, 0xed, 0xe1, 0x9d, 0x42, + 0xb8, 0xf3, 0xfa, 0xcf, 0x95, 0x46, 0x34, 0x7e, 0x18, 0xac, 0xd5, 0x0a, + 0xa8, 0x05, 0x40, 0xef, 0xaa, 0x66, 0xb7, 0xc2, 0x28, 0x43, 0xe6, 0x8a, + 0xb6, 0xe5, 0xf0, 0x71, 0xbf, 0x42, 0x40, 0x55, 0x2a, 0x23, 0xe6, 0xae, + 0x60, 0xdc, 0x45, 0x14, 0x86, 0x29, 0x25, 0xc2, 0xd4, 0xcf, 0x62, 0x59, + 0x6b, 0x1e, 0x43, 0x2e, 0x1b, 0x69, 0x9d, 0xd1, 0xec, 0x18, 0x03, 0xe6, + 0x20, 0xb8, 0x13, 0xad, 0xfd, 0xfd, 0xf2, 0xcc, 0x0f, 0x6e, 0xf2, 0xcc, + 0xd6, 0x5a, 0x85, 0xf5, 0x8e, 0xdb, 0x8d, 0x6c, 0xa7, 0xee, 0xbf, 0x9f, + 0x67, 0x80, 0x4c, 0x26, 0xc3, 0xd3, 0x4f, 0x3f, 0xcd, 0x73, 0x11, 0xa0, + 0x6a, 0x54, 0xfb, 0x81, 0xd3, 0x50, 0x40, 0x2d, 0xf4, 0xf6, 0x01, 0xe0, + 0x82, 0xb6, 0x31, 0x1a, 0xf3, 0x7f, 0x3d, 0xeb, 0xf2, 0x5c, 0x3e, 0xcf, + 0x21, 0xbd, 0xbf, 0x14, 0xb8, 0x5f, 0x83, 0xc0, 0x96, 0x46, 0xe2, 0x78, + 0xe1, 0xcd, 0x13, 0xe0, 0xd9, 0x63, 0xde, 0xc6, 0xb2, 0x9e, 0x65, 0x00, + 0x0c, 0x0e, 0x0e, 0x62, 0x9e, 0x64, 0xe2, 0x3e, 0xaf, 0x7e, 0x7b, 0x4f, + 0x4c, 0xcc, 0x7d, 0x2e, 0x8e, 0xb6, 0x2e, 0xb5, 0xb9, 0x83, 0x33, 0xb2, + 0x2f, 0xc5, 0xf8, 0x9d, 0x77, 0xb3, 0xf9, 0x5f, 0x94, 0x61, 0xde, 0x2d, + 0x69, 0x75, 0x63, 0xbd, 0x0a, 0x07, 0x48, 0xf8, 0x7d, 0xcc, 0x1b, 0xbe, + 0xf2, 0x31, 0xf5, 0x26, 0x44, 0xdf, 0x3e, 0x33, 0x19, 0x75, 0x5d, 0x24, + 0x96, 0x98, 0x10, 0xb2, 0x55, 0x95, 0x2f, 0xe3, 0x8f, 0xd5, 0x53, 0xba, + 0xcf, 0xb9, 0x27, 0x97, 0x67, 0x28, 0xab, 0x81, 0x56, 0x32, 0x98, 0x3b, + 0xd8, 0x93, 0xcb, 0x63, 0x2f, 0xb1, 0x1b, 0xdc, 0xfc, 0x7a, 0x88, 0xc6, + 0x6b, 0xb2, 0x22, 0x4b, 0x70, 0x08, 0x44, 0x2a, 0xe8, 0x83, 0x8e, 0x7f, + 0x77, 0x17, 0x56, 0x57, 0x08, 0x68, 0x5b, 0x17, 0x14, 0xf7, 0x5f, 0xcb, + 0xb6, 0x6f, 0x2b, 0x43, 0x4a, 0x97, 0xc6, 0xf0, 0x5e, 0x98, 0x75, 0x9f, + 0x5a, 0xc3, 0x9a, 0xbf, 0xd8, 0x88, 0xdd, 0x6d, 0x63, 0xa5, 0x4d, 0x9c, + 0x52, 0x90, 0xbf, 0x7b, 0xa8, 0x42, 0xba, 0x3b, 0x85, 0xac, 0x54, 0x18, + 0x3a, 0x4f, 0x19, 0x88, 0x16, 0x35, 0xb4, 0x20, 0x0a, 0xbc, 0x6a, 0xa5, + 0x3d, 0x8f, 0x4c, 0x30, 0x74, 0xf6, 0x20, 0x4e, 0x49, 0x81, 0xb9, 0xac, + 0x2e, 0xa8, 0xe8, 0xe4, 0x2b, 0x2e, 0x14, 0x0f, 0xe6, 0x43, 0x90, 0xb0, + 0x04, 0x54, 0x6a, 0x08, 0x0b, 0x55, 0xb7, 0x44, 0x82, 0xf1, 0x89, 0x09, + 0xbf, 0xad, 0xa2, 0xca, 0x64, 0x6c, 0xae, 0xf8, 0xc4, 0x6a, 0xbe, 0xf8, + 0xd7, 0x37, 0xf8, 0x40, 0x2d, 0x6f, 0xdc, 0x2f, 0x5b, 0xdb, 0x0b, 0x37, + 0xe8, 0x1a, 0x80, 0x97, 0x8f, 0xf0, 0xaf, 0xc0, 0x0e, 0xe0, 0x15, 0x82, + 0x69, 0x15, 0x4f, 0x0e, 0x0a, 0xae, 0x75, 0xb7, 0x3e, 0x7e, 0x01, 0x85, + 0x0a, 0xb1, 0xee, 0x3a, 0xe2, 0x23, 0x43, 0xfa, 0xd7, 0x1e, 0xcb, 0x03, + 0xb7, 0xbf, 0x0a, 0x28, 0xf0, 0x13, 0x28, 0x48, 0xc7, 0x13, 0x91, 0xb4, + 0x5e, 0xd1, 0xf1, 0xff, 0x15, 0xb8, 0xe2, 0xe5, 0x00, 0x26, 0x75, 0xeb, + 0xf1, 0xc7, 0xf0, 0xc4, 0xcb, 0x47, 0xde, 0x2a, 0x53, 0x04, 0xbf, 0x15, + 0x2d, 0x47, 0x01, 0xcb, 0x5a, 0x21, 0x66, 0xd3, 0xa8, 0x36, 0x3b, 0x1a, + 0x09, 0xe0, 0xe4, 0x45, 0x90, 0x03, 0x4e, 0x06, 0x1f, 0x2e, 0x35, 0x3d, + 0x05, 0x01, 0xca, 0xec, 0x70, 0x43, 0x9c, 0x5f, 0xa0, 0xa1, 0x57, 0x21, + 0xa0, 0x56, 0x5f, 0xff, 0x22, 0xfa, 0x28, 0x37, 0xb8, 0x45, 0xe5, 0xa5, + 0xed, 0xed, 0x03, 0xfc, 0x78, 0xea, 0x30, 0xef, 0x22, 0x0c, 0xc9, 0xd2, + 0xfe, 0xfa, 0xe8, 0xac, 0x17, 0x8b, 0xf4, 0xf5, 0x2f, 0xe2, 0xc7, 0x53, + 0x87, 0x41, 0xc7, 0xf1, 0xc2, 0x46, 0xd3, 0x8a, 0x1e, 0x4f, 0x6b, 0x98, + 0xdb, 0xfb, 0x92, 0xf0, 0xb3, 0x17, 0x61, 0x69, 0x1d, 0x38, 0x5e, 0xd5, + 0xd7, 0x0b, 0x1f, 0x2d, 0xef, 0xb8, 0x54, 0xf0, 0x79, 0xca, 0x92, 0x5a, + 0x17, 0x4c, 0x94, 0x21, 0xa3, 0x2f, 0x67, 0x1b, 0x05, 0x64, 0x50, 0xb0, + 0x84, 0xc6, 0xa7, 0x96, 0x00, 0xc6, 0x51, 0x78, 0xbe, 0x5a, 0xa8, 0x3f, + 0x9c, 0x41, 0x92, 0xd7, 0xd0, 0x0f, 0x8d, 0xba, 0xe4, 0x9c, 0x73, 0x94, + 0xdf, 0xc9, 0x53, 0x92, 0x5f, 0x1e, 0xf6, 0x60, 0x5a, 0x41, 0x4a, 0x39, + 0x20, 0xeb, 0x1d, 0xd6, 0xf1, 0x91, 0xe6, 0xfe, 0xb9, 0x01, 0x58, 0xe4, + 0xb5, 0x45, 0xe7, 0x90, 0xb1, 0x85, 0xe8, 0xea, 0xaf, 0x3d, 0x40, 0xe9, + 0x9e, 0xb5, 0x47, 0x9d, 0x8e, 0x19, 0x6a, 0x8b, 0x5b, 0xbf, 0xf0, 0x87, + 0xed, 0x03, 0x02, 0x97, 0xfe, 0xc5, 0x10, 0x5b, 0xae, 0x55, 0xfd, 0xff, + 0xb5, 0xdf, 0x1c, 0x60, 0xf0, 0xbc, 0x14, 0xab, 0xf8, 0x11, 0x00, 0x76, + 0x77, 0x82, 0x4d, 0x9f, 0xef, 0xe7, 0xfa, 0x7f, 0x98, 0x62, 0xcb, 0x37, + 0xee, 0x66, 0xfd, 0x67, 0xdb, 0xf7, 0x95, 0xc7, 0xf3, 0x30, 0xfa, 0x50, + 0x89, 0x5b, 0xbe, 0xf0, 0x00, 0xdc, 0x77, 0x09, 0x9b, 0x3e, 0xdf, 0xcf, + 0xf6, 0x6f, 0x4f, 0x36, 0xb6, 0xb3, 0x9e, 0xfb, 0xf2, 0xd2, 0x5c, 0xa8, + 0x36, 0x7d, 0xa6, 0x9f, 0xed, 0xdf, 0x51, 0x63, 0x16, 0x3b, 0x29, 0x19, + 0xba, 0xda, 0xf2, 0xc1, 0x67, 0x00, 0x93, 0xb9, 0x0a, 0xc5, 0x3b, 0x54, + 0x7e, 0xb9, 0xc7, 0x1c, 0x05, 0xd8, 0x92, 0xb0, 0xf1, 0xce, 0xb5, 0x88, + 0x65, 0x02, 0x39, 0x2b, 0x11, 0xcb, 0x1a, 0x9f, 0x13, 0x6b, 0x32, 0xdb, + 0x99, 0xd8, 0x7b, 0x29, 0xa9, 0x8b, 0x1b, 0x7f, 0x5b, 0xd7, 0x7f, 0xf5, + 0x7a, 0x7f, 0xff, 0xd2, 0x0f, 0x5b, 0x8c, 0xdf, 0xb3, 0x30, 0xa8, 0x96, + 0x29, 0xd2, 0x54, 0xca, 0xcd, 0xf3, 0x9b, 0x61, 0x30, 0x91, 0x29, 0x4c, + 0xc0, 0xc6, 0x95, 0x79, 0x4c, 0x31, 0x82, 0x2b, 0xc7, 0x50, 0x40, 0xad, + 0x4d, 0xca, 0xdf, 0xb0, 0x42, 0x61, 0x6d, 0x7f, 0xee, 0xac, 0x21, 0x1f, + 0x23, 0x0d, 0x02, 0x5c, 0x59, 0xc4, 0x34, 0xd2, 0xb8, 0x75, 0x2f, 0x4f, + 0xaf, 0x9e, 0x41, 0x1c, 0x21, 0xe6, 0x07, 0xfb, 0x7a, 0xbd, 0x66, 0x47, + 0x82, 0x69, 0x68, 0xa0, 0x16, 0x26, 0x2e, 0x7a, 0xeb, 0x81, 0xb4, 0x0c, + 0x93, 0x84, 0x01, 0xb5, 0xba, 0x89, 0xb3, 0x00, 0xa8, 0xcd, 0xb5, 0x77, + 0x9c, 0x8a, 0x30, 0xd2, 0xc8, 0xfa, 0x16, 0x56, 0x2f, 0x87, 0xeb, 0x2e, + 0x7b, 0x80, 0x6b, 0xef, 0x98, 0x04, 0x14, 0x5c, 0x2b, 0x63, 0x8e, 0x91, + 0x77, 0xaf, 0xe3, 0xba, 0xcb, 0xfa, 0xb9, 0xf6, 0x8e, 0x29, 0x84, 0x01, + 0x66, 0x72, 0x04, 0x7b, 0x59, 0x96, 0xe2, 0x6c, 0x0e, 0x7b, 0x59, 0x96, + 0x4a, 0xc9, 0xf1, 0x81, 0x5a, 0x41, 0x7d, 0xc3, 0xf2, 0xfa, 0x6d, 0xf3, + 0x03, 0xb2, 0x4c, 0xc3, 0xf4, 0xdb, 0xd5, 0x14, 0x69, 0x5c, 0xd9, 0x2a, + 0xbd, 0xd6, 0x9a, 0x69, 0xe1, 0xd6, 0x13, 0xf1, 0xef, 0x89, 0x84, 0x9b, + 0x69, 0x11, 0xae, 0x55, 0xfc, 0xbf, 0xbb, 0x5c, 0x6d, 0xd7, 0xb6, 0x29, + 0x4e, 0x2f, 0x1a, 0x32, 0xa5, 0x27, 0x88, 0xe6, 0x84, 0x6b, 0x69, 0xf2, + 0xbc, 0x07, 0xab, 0xef, 0xed, 0x8d, 0xc4, 0x0d, 0xa7, 0xa1, 0xf7, 0xff, + 0x5f, 0xf6, 0xde, 0x3f, 0x4e, 0x8e, 0xaa, 0xce, 0xfb, 0x7d, 0x83, 0x0d, + 0x39, 0xed, 0x76, 0xa0, 0x5a, 0x3b, 0xcf, 0x56, 0x99, 0x89, 0x4e, 0xc3, + 0x44, 0xd2, 0x41, 0x64, 0x3a, 0xa2, 0x32, 0x11, 0x56, 0x12, 0xc4, 0x27, + 0x0c, 0xea, 0xd5, 0x00, 0xae, 0x80, 0xdc, 0xdd, 0x05, 0x5d, 0x5f, 0x6b, + 0xa2, 0xab, 0x06, 0xbc, 0xaf, 0x95, 0xb0, 0xbb, 0xcf, 0x02, 0xbb, 0xaf, + 0x7b, 0x21, 0xab, 0x8b, 0x13, 0xbd, 0xfe, 0x08, 0xeb, 0x5e, 0x96, 0xc0, + 0x8a, 0x04, 0x1f, 0xd1, 0x21, 0xcf, 0x02, 0x09, 0x1a, 0x9c, 0x01, 0xc5, + 0xe9, 0x28, 0x30, 0x3d, 0xc8, 0x40, 0xb5, 0x66, 0xa0, 0xca, 0x27, 0xad, + 0x5d, 0x30, 0xbd, 0xf6, 0x21, 0xb4, 0x72, 0xff, 0x38, 0xa7, 0x7e, 0x76, + 0xf7, 0xcc, 0xe4, 0x07, 0xca, 0xb3, 0x4f, 0x7d, 0x5e, 0x84, 0x3a, 0x75, + 0x7e, 0x7c, 0xcf, 0x8f, 0xa9, 0xae, 0x3a, 0x75, 0xea, 0x9c, 0xf7, 0x19, + 0x18, 0x50, 0xc0, 0xaa, 0xff, 0xf7, 0x7e, 0x60, 0x9d, 0x02, 0x52, 0x75, + 0xd5, 0x4e, 0x05, 0xdd, 0x62, 0x9d, 0x82, 0x59, 0x8d, 0x00, 0x1b, 0x37, + 0xae, 0x23, 0x4e, 0xd4, 0x8a, 0x1f, 0xa7, 0xa7, 0x95, 0xfd, 0x7b, 0x07, + 0x50, 0x09, 0x12, 0x65, 0xf5, 0xcb, 0xd0, 0x91, 0xde, 0x77, 0x26, 0xca, + 0xe9, 0xa7, 0x19, 0xb8, 0x56, 0xd5, 0xf3, 0x5e, 0x01, 0xe8, 0xf2, 0x9e, + 0x01, 0x5c, 0x7b, 0x3a, 0x6c, 0xd6, 0x63, 0x10, 0x47, 0x14, 0xa8, 0x95, + 0x80, 0x64, 0xb9, 0x75, 0x2f, 0x18, 0xc3, 0xe5, 0x51, 0x1b, 0xe1, 0x87, + 0xeb, 0xf1, 0xdc, 0xe8, 0x78, 0xb7, 0xff, 0x5e, 0x18, 0x7c, 0xdf, 0xcb, + 0x80, 0xeb, 0x79, 0x01, 0x8c, 0x8b, 0x76, 0x0b, 0x32, 0x59, 0x84, 0xfe, + 0x26, 0x25, 0xfb, 0xb3, 0x61, 0x18, 0xe1, 0xf8, 0xb9, 0x6c, 0x4a, 0xa4, + 0x06, 0x76, 0x8b, 0x9c, 0x40, 0xec, 0xad, 0x76, 0xff, 0x6e, 0x29, 0x25, + 0xee, 0xc3, 0x15, 0x84, 0x94, 0x18, 0x67, 0x0d, 0x51, 0xf3, 0x3c, 0x8c, + 0xa9, 0x2e, 0xdf, 0x19, 0xda, 0x6a, 0x1c, 0x30, 0xee, 0x1b, 0x42, 0xb4, + 0x3a, 0x5e, 0x72, 0x24, 0x90, 0x6b, 0x41, 0x3b, 0x4b, 0xa3, 0xe9, 0x41, + 0x1b, 0xb2, 0x08, 0xa4, 0x06, 0xc3, 0x54, 0xee, 0xdf, 0x45, 0x79, 0x70, + 0x88, 0xea, 0xf8, 0x38, 0xde, 0x5f, 0x6d, 0xe0, 0xe2, 0x33, 0xd7, 0x32, + 0xe6, 0x3a, 0xac, 0xfa, 0xf2, 0x10, 0x63, 0x7f, 0x7e, 0x45, 0xcc, 0x4c, + 0x6f, 0xf9, 0xdf, 0x57, 0xbb, 0xdc, 0x83, 0x8f, 0x20, 0x50, 0x0b, 0xf4, + 0xb8, 0x5a, 0x53, 0x52, 0x12, 0x82, 0x5a, 0x46, 0xc1, 0xa9, 0x04, 0xea, + 0x35, 0x3f, 0x68, 0x2a, 0x01, 0x15, 0x37, 0x3c, 0x97, 0x12, 0xca, 0x26, + 0xc8, 0xa6, 0xc0, 0x16, 0x89, 0x3e, 0x8a, 0xd0, 0x69, 0x75, 0xba, 0x6a, + 0x53, 0x06, 0x7e, 0xbe, 0x2d, 0x5b, 0x76, 0x7e, 0x67, 0xdc, 0xe5, 0x49, + 0x6c, 0x29, 0xf1, 0xa2, 0x7f, 0x1f, 0x29, 0xb1, 0x81, 0x55, 0x86, 0x20, + 0x8f, 0x80, 0x8c, 0x64, 0xa2, 0xae, 0x21, 0x5b, 0x1a, 0x78, 0xe5, 0xea, + 0xe8, 0xd9, 0x9c, 0x08, 0xc0, 0x60, 0xd9, 0x0c, 0x04, 0x20, 0x1b, 0x47, + 0x06, 0x60, 0xde, 0xca, 0x97, 0xb7, 0x60, 0x16, 0x4b, 0x14, 0x0b, 0x12, + 0xc3, 0x13, 0x54, 0x75, 0x9c, 0x52, 0x0e, 0x2a, 0x1e, 0x40, 0x56, 0x97, + 0x55, 0x92, 0x15, 0x30, 0x29, 0x09, 0x81, 0x6f, 0x10, 0x80, 0xe2, 0xec, + 0x20, 0x0f, 0x82, 0xf4, 0x55, 0x0d, 0xd7, 0x2a, 0x19, 0x30, 0xa1, 0xff, + 0x6c, 0xfe, 0x97, 0xaf, 0x95, 0xed, 0xf0, 0xbc, 0x88, 0xa0, 0x91, 0x01, + 0x49, 0x56, 0x3d, 0x47, 0x04, 0xd0, 0xce, 0x06, 0xf9, 0x88, 0x0c, 0x78, + 0x12, 0xfd, 0xbd, 0x5e, 0xc1, 0xbb, 0xd0, 0x6d, 0x2f, 0x81, 0xd5, 0x05, + 0x68, 0x78, 0xaa, 0xd2, 0x76, 0x5b, 0x92, 0x45, 0xbd, 0x57, 0x2f, 0xe4, + 0xeb, 0xd9, 0xeb, 0x91, 0x20, 0x57, 0x06, 0x6d, 0xf3, 0xfa, 0xdf, 0xc3, + 0xf1, 0x0f, 0x96, 0x14, 0x00, 0x78, 0xa0, 0x12, 0x82, 0x65, 0xa2, 0x3a, + 0x71, 0xf9, 0x32, 0x9c, 0xfd, 0x75, 0xac, 0x25, 0x05, 0x8e, 0x3b, 0x48, + 0xfb, 0x00, 0xc3, 0x72, 0x65, 0xe0, 0xe7, 0x03, 0xb6, 0x0e, 0xa5, 0xac, + 0xd3, 0x62, 0x82, 0xd7, 0xcb, 0x95, 0x47, 0xa4, 0xce, 0x5f, 0xfa, 0xd4, + 0x97, 0x00, 0x78, 0xd7, 0x39, 0x67, 0xb3, 0xf4, 0xdc, 0x73, 0x79, 0xfa, + 0xee, 0xbb, 0x59, 0x19, 0xa9, 0xf3, 0xe4, 0x7d, 0xf7, 0x71, 0xd7, 0x0b, + 0x2f, 0xf0, 0xee, 0x63, 0x42, 0x1a, 0xf8, 0xca, 0xb3, 0x55, 0x5c, 0x20, + 0x48, 0x73, 0xd7, 0x4e, 0xf5, 0xcd, 0x64, 0xb1, 0xf5, 0x1a, 0x70, 0x7b, + 0xbf, 0x03, 0x01, 0x14, 0xfb, 0x2d, 0x3c, 0x2f, 0x32, 0x1e, 0x91, 0x13, + 0x88, 0xa6, 0xc4, 0x10, 0x82, 0x7c, 0xc1, 0x04, 0x6c, 0x44, 0x4e, 0xb0, + 0x72, 0x45, 0x89, 0x6c, 0xcd, 0xc6, 0x88, 0x8c, 0x4d, 0x74, 0x03, 0x6c, + 0xe7, 0x2d, 0x41, 0xc3, 0xd6, 0x23, 0x38, 0xb9, 0x2c, 0x0d, 0x47, 0xb2, + 0xfe, 0xdd, 0x6b, 0xd8, 0x71, 0xd7, 0x6e, 0x86, 0xcf, 0x1d, 0xc6, 0x73, + 0x1d, 0xaa, 0x8f, 0x54, 0xb0, 0x1f, 0x81, 0x52, 0x51, 0xf7, 0x43, 0x72, + 0x50, 0x7a, 0x83, 0xee, 0x83, 0xd5, 0x5b, 0x01, 0xd0, 0x2a, 0x5b, 0xc8, + 0xe2, 0x36, 0x6a, 0xd8, 0x35, 0x9b, 0xfe, 0x62, 0x89, 0xf5, 0xef, 0xbb, + 0x18, 0x50, 0x1b, 0x7b, 0x95, 0x4b, 0x43, 0x34, 0x6a, 0x0d, 0xaa, 0x9e, + 0x03, 0xed, 0xf0, 0xfe, 0xe7, 0xa7, 0x83, 0xf0, 0xbb, 0x8d, 0xb5, 0xc4, + 0x40, 0x34, 0x25, 0x4e, 0x04, 0xe4, 0xef, 0xec, 0xf7, 0x58, 0x7f, 0xe6, + 0x1a, 0x76, 0xec, 0xd9, 0x0d, 0x2b, 0x14, 0x88, 0x6b, 0xfd, 0x99, 0x6b, + 0x18, 0x9f, 0xaa, 0x04, 0x76, 0xf2, 0xa6, 0x02, 0xaf, 0xe6, 0x4d, 0x0b, + 0x67, 0x5a, 0xc3, 0x57, 0xdb, 0x0e, 0xf9, 0x9a, 0x45, 0x6b, 0x00, 0x10, + 0xd9, 0x00, 0x72, 0x85, 0xc8, 0x92, 0xcd, 0x01, 0x22, 0x4f, 0x79, 0x30, + 0xcb, 0xfa, 0xda, 0x16, 0xac, 0xbf, 0x9f, 0xe4, 0xda, 0x7f, 0xdc, 0x1a, + 0xc4, 0x69, 0x35, 0xa1, 0xd8, 0x57, 0xc4, 0x9e, 0x51, 0x1b, 0x20, 0x65, + 0x85, 0x50, 0x40, 0x2d, 0x80, 0x8c, 0x82, 0x6e, 0xf9, 0xf1, 0x02, 0x45, + 0x06, 0xe6, 0x5a, 0x4d, 0xd5, 0xbe, 0x72, 0x9f, 0xc4, 0x6b, 0xd6, 0x30, + 0x07, 0xc2, 0x31, 0x97, 0x56, 0xa3, 0x75, 0x70, 0x9b, 0x12, 0xec, 0x0b, + 0x7f, 0x0b, 0x01, 0x50, 0x2b, 0xe2, 0x0e, 0x8e, 0xfb, 0x22, 0xc7, 0x65, + 0x22, 0x04, 0x6b, 0x45, 0xd3, 0xf9, 0xa0, 0xa9, 0xa9, 0x48, 0x3f, 0x7c, + 0x9f, 0xc4, 0xc1, 0x61, 0x00, 0x83, 0x9f, 0x3c, 0x79, 0x2c, 0xaf, 0xce, + 0x3d, 0x0d, 0x10, 0xc0, 0xb4, 0x6a, 0xfb, 0x5f, 0x0d, 0xc0, 0xd0, 0xdb, + 0x5f, 0xcd, 0xf8, 0x77, 0xe1, 0x57, 0xff, 0x01, 0x4b, 0xff, 0x50, 0xbd, + 0xfb, 0x3c, 0xfd, 0x8b, 0xfd, 0x31, 0x78, 0x95, 0x83, 0x82, 0x59, 0x39, + 0xfb, 0xec, 0x8e, 0x7c, 0x82, 0x32, 0xf8, 0xd0, 0xaa, 0x68, 0x3a, 0x0b, + 0x6e, 0xfd, 0x06, 0x3c, 0xf3, 0x8b, 0x35, 0xbc, 0xe6, 0x0f, 0x5f, 0xc7, + 0xb2, 0x15, 0x06, 0xfb, 0xa6, 0x3c, 0x36, 0x7f, 0xff, 0x2f, 0x63, 0x4d, + 0xe1, 0xd7, 0x31, 0x50, 0x17, 0x5b, 0xb1, 0xf8, 0x91, 0x7a, 0x07, 0x69, + 0x35, 0x58, 0xcc, 0x6f, 0xa7, 0xa0, 0x7d, 0x97, 0x89, 0x18, 0x74, 0x2c, + 0x69, 0xcb, 0x8f, 0xb7, 0xff, 0x75, 0x5e, 0x2c, 0xde, 0x53, 0xff, 0x5f, + 0xf7, 0xfb, 0x5e, 0xaa, 0x54, 0xa9, 0x52, 0xa5, 0x4a, 0x95, 0x2a, 0x55, + 0xaa, 0x54, 0xa9, 0x52, 0xa5, 0x4a, 0x95, 0x2a, 0x55, 0xaa, 0x54, 0xa9, + 0x52, 0xa5, 0x4a, 0x95, 0x2a, 0x55, 0xaa, 0x54, 0xa9, 0x52, 0xa5, 0x3a, + 0x7c, 0xa5, 0x50, 0xad, 0x54, 0xa9, 0x52, 0xa5, 0x4a, 0x95, 0xea, 0x65, + 0x22, 0xaf, 0xe9, 0xc5, 0x20, 0x4f, 0x51, 0xe8, 0x94, 0x0f, 0x80, 0xf2, + 0xa1, 0x51, 0xbe, 0xfc, 0x38, 0xce, 0x4c, 0x08, 0x5d, 0x31, 0x0c, 0x23, + 0x36, 0x79, 0x1c, 0xc0, 0x71, 0x1d, 0x4a, 0x03, 0x25, 0x1c, 0xd7, 0xc1, + 0xab, 0x87, 0xb6, 0xfd, 0x09, 0x79, 0x8e, 0xeb, 0x04, 0x90, 0x2d, 0xcb, + 0xb4, 0x70, 0x5c, 0x27, 0x06, 0xa5, 0x8a, 0xc6, 0xf5, 0xcb, 0x06, 0xc4, + 0xca, 0x17, 0x85, 0x4b, 0xf9, 0x65, 0x3b, 0x18, 0x55, 0xf6, 0x56, 0x28, + 0x0f, 0x96, 0xa9, 0x3e, 0x5a, 0x0d, 0xf2, 0xf5, 0xf3, 0x80, 0x10, 0x3c, + 0x56, 0x1c, 0x28, 0x62, 0xeb, 0x49, 0x8c, 0x51, 0x00, 0x58, 0x32, 0xdf, + 0x24, 0x58, 0x2b, 0x5a, 0x07, 0xd3, 0x34, 0x03, 0xff, 0x28, 0xd4, 0xab, + 0xfa, 0x68, 0x15, 0xd9, 0xd6, 0x8b, 0xc0, 0x23, 0xe5, 0xb7, 0x0c, 0x0b, + 0x77, 0xc6, 0xc5, 0x30, 0xd4, 0xc2, 0x4f, 0xb3, 0xcf, 0x24, 0x9f, 0xcb, + 0x63, 0xd7, 0xec, 0x20, 0x8f, 0xfe, 0xbe, 0x7e, 0x6a, 0x33, 0x35, 0x98, + 0x67, 0xd7, 0x76, 0xbb, 0xee, 0x30, 0xd7, 0xf4, 0x65, 0x3b, 0xb2, 0xab, + 0x76, 0x6c, 0x9e, 0xbf, 0x3f, 0x41, 0x5d, 0x12, 0xd2, 0xb4, 0x22, 0xf3, + 0xca, 0x55, 0x5c, 0x35, 0xc3, 0x5a, 0x36, 0x25, 0xa2, 0x0d, 0x42, 0x7a, + 0x78, 0x02, 0xb2, 0x39, 0x03, 0x66, 0x3c, 0xb2, 0x7d, 0x6a, 0xfb, 0xd6, + 0x56, 0xcd, 0x53, 0x70, 0xad, 0xba, 0x54, 0x93, 0x5f, 0xdb, 0x91, 0xc9, + 0xef, 0x19, 0x19, 0x4e, 0x2f, 0x6e, 0x8b, 0xb0, 0xb7, 0xa8, 0x17, 0xe0, + 0xfa, 0xc0, 0x2d, 0xcf, 0x6d, 0x60, 0x98, 0xf1, 0x05, 0xbe, 0x7e, 0x7a, + 0xda, 0x02, 0xd9, 0x0e, 0xff, 0x16, 0x9e, 0x94, 0x90, 0xd1, 0x93, 0x56, + 0x33, 0x2d, 0x9c, 0x19, 0x1b, 0xab, 0xaf, 0x18, 0x07, 0x6a, 0xe9, 0x73, + 0x2b, 0xa7, 0xa0, 0x5e, 0xc1, 0xe2, 0xda, 0x76, 0xbc, 0xae, 0xbd, 0x64, + 0x19, 0x02, 0xc7, 0x93, 0x78, 0x6e, 0x23, 0x06, 0x05, 0xb3, 0x72, 0x02, + 0x0c, 0x2b, 0x9e, 0xa7, 0x2e, 0x8b, 0xe3, 0xaa, 0x89, 0x9a, 0xc5, 0x65, + 0xe1, 0x42, 0xac, 0xe2, 0x39, 0x02, 0xfb, 0x1e, 0x49, 0xbe, 0xde, 0x02, + 0x0f, 0x1a, 0xb6, 0x44, 0xce, 0x48, 0xd5, 0xfe, 0x47, 0xb0, 0xe7, 0x6c, + 0xe4, 0xd4, 0x75, 0xd2, 0x0d, 0x92, 0x95, 0xea, 0x7f, 0x4d, 0xb5, 0x64, + 0x0b, 0xc7, 0x73, 0x11, 0x39, 0x03, 0xa7, 0xae, 0x96, 0x3f, 0x98, 0x96, + 0x81, 0x69, 0x19, 0x31, 0x30, 0xdf, 0x35, 0x7f, 0x7d, 0x0d, 0x57, 0xff, + 0xdd, 0xd5, 0x00, 0x18, 0x3e, 0xc0, 0xcf, 0xc8, 0x23, 0xbd, 0x86, 0x86, + 0x23, 0xc6, 0x2f, 0xf6, 0x55, 0x83, 0xab, 0x28, 0xf6, 0xab, 0x89, 0xe5, + 0x52, 0x4a, 0x2a, 0x95, 0xf8, 0xce, 0xe8, 0xe5, 0x72, 0x19, 0x3b, 0x39, + 0xf9, 0x17, 0x3a, 0x56, 0x98, 0xfb, 0x10, 0x2d, 0x1f, 0x32, 0xe5, 0xd5, + 0x3d, 0x4c, 0xd3, 0xa0, 0x52, 0xa9, 0x04, 0x30, 0xad, 0xac, 0xc8, 0x07, + 0x6e, 0xd9, 0x0e, 0x21, 0x55, 0x5e, 0x64, 0x31, 0x94, 0x0f, 0xc6, 0x12, + 0x39, 0x11, 0x83, 0x6b, 0x45, 0xe5, 0xf9, 0xf7, 0xd1, 0x9c, 0xe8, 0x0e, + 0xbd, 0xea, 0x02, 0x08, 0x93, 0xc0, 0x9a, 0x35, 0x43, 0x01, 0x54, 0xcb, + 0xab, 0x7b, 0xe4, 0xfb, 0xc2, 0x7b, 0x8c, 0xeb, 0x7a, 0x60, 0xc6, 0x17, + 0x5a, 0x25, 0xf3, 0xf6, 0xf3, 0xf4, 0xf3, 0x00, 0x82, 0x05, 0xfb, 0x5e, + 0xdd, 0xc3, 0xab, 0x7b, 0xec, 0xfa, 0xe1, 0x18, 0x7e, 0x1b, 0x3b, 0xf5, + 0x06, 0x56, 0x21, 0xcf, 0x57, 0xbf, 0xfc, 0x55, 0x3e, 0xf4, 0xe7, 0x1f, + 0xea, 0x6c, 0xc3, 0x1e, 0x8a, 0xae, 0x79, 0x1b, 0x20, 0x5c, 0xfc, 0x92, + 0xf4, 0x9f, 0x4e, 0xa4, 0x49, 0xae, 0x7d, 0xeb, 0xe5, 0x3f, 0xc2, 0xce, + 0x00, 0x2a, 0x35, 0xd0, 0x35, 0x15, 0x21, 0x10, 0x4b, 0x2f, 0x9c, 0xb8, + 0x7b, 0x7a, 0xfa, 0xd0, 0xc2, 0x7b, 0x94, 0x37, 0x5e, 0xc6, 0xe9, 0x00, + 0xb3, 0x35, 0x10, 0x29, 0xef, 0x88, 0x06, 0x5b, 0x4d, 0x13, 0x42, 0xc5, + 0xe6, 0xab, 0xd3, 0xba, 0x08, 0xa0, 0xcb, 0xff, 0xff, 0xce, 0x48, 0x7c, + 0xdf, 0xad, 0x8e, 0xd3, 0x31, 0xf7, 0x3a, 0x06, 0x18, 0x61, 0x9a, 0x75, + 0x89, 0x3c, 0xd6, 0x69, 0x28, 0x57, 0xb2, 0xfc, 0xf3, 0xd5, 0x6b, 0xa1, + 0x92, 0x9b, 0x4e, 0xe6, 0xbc, 0x2d, 0x8f, 0x21, 0x37, 0x9d, 0x0c, 0xc0, + 0xd8, 0xe4, 0x53, 0xc8, 0xbf, 0xec, 0x86, 0x10, 0xf8, 0xdd, 0xeb, 0xa6, + 0x05, 0xb8, 0x7f, 0xd7, 0xda, 0xd6, 0xc3, 0xff, 0x96, 0x05, 0xb8, 0x7f, + 0x6f, 0x8a, 0x5e, 0x24, 0x97, 0xa8, 0x45, 0xda, 0x5c, 0x79, 0x3e, 0x0c, + 0x96, 0x61, 0xaa, 0xaa, 0xc0, 0x5a, 0xef, 0x68, 0xc0, 0xbd, 0x07, 0x07, + 0x92, 0x4c, 0x42, 0xa6, 0xbc, 0x87, 0xef, 0x88, 0x9d, 0x1b, 0x7f, 0xa5, + 0xe0, 0x04, 0x1b, 0x3e, 0x19, 0x82, 0x57, 0x26, 0x76, 0x7b, 0x6c, 0x06, + 0xce, 0xdf, 0x1b, 0x89, 0xf8, 0xe1, 0x2e, 0x7d, 0x85, 0xa4, 0xdf, 0xdf, + 0xac, 0x8a, 0x9f, 0xdf, 0x35, 0x01, 0x77, 0xad, 0x54, 0xc0, 0xac, 0xef, + 0xad, 0x86, 0xba, 0xbe, 0x5f, 0x0e, 0x8c, 0x82, 0x2c, 0x02, 0x11, 0x88, + 0xe2, 0xc7, 0x16, 0x52, 0x9b, 0xdf, 0xa1, 0x5e, 0xb9, 0xb2, 0xfb, 0xf9, + 0xaf, 0x35, 0x5c, 0xe0, 0xce, 0x1d, 0x21, 0x20, 0xec, 0xc1, 0x5e, 0x57, + 0xdc, 0xdc, 0xda, 0xf0, 0x2f, 0x51, 0x60, 0x93, 0xc1, 0x96, 0xf7, 0x6f, + 0x27, 0xd9, 0xab, 0x15, 0xdb, 0xc2, 0x38, 0x62, 0xb1, 0xc0, 0x7b, 0x7f, + 0x08, 0xf6, 0xb2, 0x6d, 0x9b, 0xac, 0x10, 0xdc, 0xf0, 0x0f, 0xea, 0xd9, + 0x51, 0x73, 0x0f, 0x0e, 0x24, 0x00, 0x21, 0x0c, 0x2b, 0xe9, 0x9e, 0x2f, + 0xee, 0xc1, 0xc4, 0xf1, 0x61, 0x5a, 0x42, 0x78, 0x48, 0x60, 0xcc, 0xd3, + 0xd7, 0x64, 0x2f, 0x73, 0xd3, 0x3b, 0x7a, 0x04, 0x28, 0x8d, 0x79, 0xbb, + 0xe7, 0x2d, 0x47, 0xd4, 0x86, 0x9c, 0xe9, 0x0c, 0x9e, 0x88, 0xc2, 0xb0, + 0xba, 0x95, 0x63, 0x66, 0x7e, 0x38, 0xdb, 0x84, 0x37, 0xce, 0xea, 0xf9, + 0x4b, 0xf2, 0x92, 0xea, 0x97, 0xc7, 0xbe, 0x92, 0x25, 0xc7, 0xff, 0x01, + 0x4b, 0x97, 0x2e, 0x05, 0xe0, 0xa9, 0x27, 0x7f, 0xc6, 0xab, 0x0f, 0xfc, + 0xba, 0x67, 0xfc, 0x26, 0x0a, 0x0e, 0x13, 0xd5, 0xab, 0xba, 0xf8, 0x1d, + 0x8c, 0x0e, 0x68, 0xbb, 0xaf, 0x9a, 0x2f, 0x62, 0x17, 0xbd, 0xa6, 0x87, + 0xbb, 0x9b, 0xbc, 0x03, 0x50, 0x1a, 0x52, 0x0b, 0xf6, 0x8c, 0xe3, 0x74, + 0xbf, 0xea, 0x39, 0x8f, 0xbd, 0xe3, 0x3f, 0x60, 0x70, 0xe8, 0x2d, 0x87, + 0x90, 0x7b, 0xaa, 0xc3, 0xd5, 0xb5, 0xff, 0x3c, 0x37, 0xc4, 0xed, 0x3f, + 0xab, 0xbe, 0x0c, 0x3c, 0x0f, 0xec, 0x05, 0xde, 0x01, 0xb4, 0xfe, 0xf8, + 0x28, 0x7e, 0xb4, 0xed, 0xc5, 0x60, 0x01, 0xfc, 0x58, 0x24, 0xee, 0xa9, + 0x11, 0xb7, 0xff, 0x26, 0xf6, 0x2c, 0x70, 0xdc, 0x05, 0x47, 0x31, 0xa9, + 0x81, 0x5a, 0xa7, 0xa2, 0xb0, 0x4c, 0x4f, 0x01, 0x6f, 0xd3, 0xe1, 0x13, + 0xb9, 0xa3, 0xa0, 0xa9, 0x00, 0x5a, 0x7f, 0x72, 0xf9, 0xd1, 0x0c, 0x6d, + 0xfb, 0x2d, 0xa3, 0xa8, 0xc7, 0xe9, 0x22, 0x6d, 0xe7, 0x97, 0x2f, 0xbc, + 0xc8, 0xf7, 0x74, 0xfc, 0xff, 0x1d, 0xf5, 0x76, 0x7d, 0x3c, 0x1e, 0xd5, + 0x06, 0xc7, 0x47, 0xc2, 0x9e, 0x05, 0xbe, 0x75, 0x04, 0xf2, 0x18, 0x5c, + 0x2c, 0x79, 0x70, 0x16, 0x4e, 0x5f, 0x9c, 0x08, 0x58, 0x09, 0x1c, 0x24, + 0x6b, 0xe8, 0xb6, 0x27, 0x0b, 0x0c, 0x46, 0x00, 0x5c, 0xbd, 0x60, 0x4f, + 0x53, 0x11, 0xbb, 0xaf, 0xd5, 0xf1, 0x7c, 0xf7, 0x8a, 0x44, 0xd7, 0x64, + 0xef, 0xa2, 0x22, 0x7b, 0x9f, 0xb4, 0x0f, 0xe9, 0xfe, 0xeb, 0xeb, 0x47, + 0x47, 0xa9, 0xe3, 0x33, 0x11, 0xb6, 0x65, 0x2f, 0xf8, 0x97, 0x1e, 0xe9, + 0x23, 0x6b, 0x28, 0x20, 0xc2, 0x10, 0xb0, 0x23, 0x57, 0x84, 0x1c, 0x58, + 0x75, 0x3b, 0x88, 0x13, 0x3d, 0x96, 0x05, 0x8c, 0xfa, 0x27, 0x6d, 0x62, + 0x5f, 0x82, 0xab, 0x91, 0x31, 0x07, 0x85, 0xc7, 0xd7, 0xe7, 0x0f, 0x85, + 0xd7, 0x75, 0x11, 0x89, 0x03, 0x58, 0x08, 0xec, 0xc5, 0x50, 0x9c, 0x8d, + 0xdb, 0x8f, 0x82, 0xa9, 0x92, 0xe5, 0x5e, 0x41, 0xd8, 0x7e, 0x0b, 0x91, + 0xc8, 0x25, 0x00, 0x9f, 0x89, 0xb1, 0x37, 0xbf, 0xb4, 0x37, 0x7d, 0xfa, + 0x6c, 0x86, 0xcf, 0x4c, 0x22, 0xf3, 0xe7, 0x97, 0xd1, 0x63, 0x2c, 0x2f, + 0xff, 0xbe, 0x6f, 0xc0, 0xee, 0xb9, 0xa1, 0x5a, 0x9b, 0x3f, 0xa9, 0xfe, + 0xf8, 0xee, 0x4c, 0x8b, 0x8f, 0xf6, 0xed, 0x02, 0x1b, 0xac, 0x21, 0x41, + 0x65, 0xbc, 0x41, 0xf5, 0xc1, 0x8d, 0x8c, 0x8e, 0x57, 0x21, 0x57, 0xa2, + 0x7a, 0xd7, 0x15, 0xe0, 0x03, 0xe4, 0x9b, 0x76, 0x00, 0xc6, 0xf2, 0xea, + 0x2e, 0x9b, 0x2e, 0x1c, 0xa2, 0x24, 0x5c, 0xa0, 0x44, 0xf5, 0xae, 0x8d, + 0x5c, 0xfb, 0x57, 0x2b, 0xd9, 0xf6, 0xf9, 0x09, 0x6c, 0x4a, 0x80, 0x8d, + 0x57, 0x77, 0x81, 0x22, 0x5e, 0xdd, 0xe5, 0xaa, 0x8b, 0x86, 0xb8, 0xe5, + 0x2b, 0x13, 0x90, 0x53, 0xcf, 0xdd, 0x0d, 0x43, 0xb0, 0x75, 0x3c, 0xb4, + 0xd9, 0x78, 0xb4, 0xc5, 0x75, 0xb7, 0x8e, 0xb3, 0xe9, 0xc2, 0x21, 0xb6, + 0xdc, 0x3e, 0xce, 0xda, 0x37, 0x13, 0xe4, 0xe1, 0x03, 0xb5, 0x00, 0x6e, + 0xf9, 0xf7, 0x09, 0xb6, 0xee, 0x3d, 0x1b, 0xa1, 0x17, 0xe8, 0xcb, 0x26, + 0xac, 0x2a, 0xe7, 0x59, 0x15, 0x90, 0xd1, 0xb2, 0x4c, 0x54, 0x1a, 0x54, + 0x9e, 0xd0, 0x63, 0x34, 0x33, 0x92, 0xa1, 0x73, 0x0d, 0x2e, 0x59, 0xf1, + 0x55, 0xb6, 0x4d, 0x7d, 0x08, 0xe7, 0x4e, 0x81, 0x2b, 0x5c, 0x6e, 0x8a, + 0xe0, 0x3f, 0x87, 0x56, 0xa8, 0xb8, 0x76, 0x5d, 0xb2, 0xfe, 0x8c, 0x3c, + 0x3b, 0x1e, 0xa8, 0xe2, 0x01, 0xbb, 0xee, 0x5a, 0xd8, 0x33, 0xc9, 0x10, + 0x6b, 0xf0, 0xa4, 0xea, 0x4b, 0x7a, 0xd2, 0xa5, 0xd4, 0x5f, 0xc2, 0x95, + 0x63, 0x9d, 0x74, 0x44, 0x2d, 0x4f, 0x7a, 0x18, 0xc2, 0xc0, 0x93, 0x68, + 0xa0, 0xd6, 0x57, 0x75, 0xc8, 0xb5, 0xc0, 0x66, 0xbc, 0xb6, 0x43, 0xb1, + 0x50, 0xc6, 0x6b, 0x7b, 0x78, 0xd2, 0xa6, 0xd8, 0x3f, 0x4c, 0xad, 0x99, + 0x78, 0xff, 0xf2, 0xe1, 0x52, 0x8c, 0x05, 0x6e, 0x72, 0xeb, 0xf1, 0x22, + 0xf1, 0xf2, 0xa6, 0x85, 0x37, 0x53, 0x44, 0x4a, 0x9b, 0xfc, 0x40, 0x59, + 0xb9, 0x9b, 0x55, 0x8c, 0xdc, 0x30, 0x5e, 0x73, 0x34, 0x38, 0x76, 0x55, + 0xdb, 0x08, 0xae, 0xd7, 0x6c, 0x46, 0xfd, 0x73, 0xa4, 0x81, 0xd3, 0x06, + 0x32, 0x0a, 0xb4, 0x35, 0x77, 0x9b, 0x24, 0x7b, 0xb4, 0xdf, 0x00, 0x36, + 0x62, 0xe4, 0x6e, 0x82, 0xf6, 0x65, 0x5c, 0x7d, 0xab, 0xdf, 0xfe, 0xd7, + 0x23, 0x32, 0x1b, 0x11, 0xa6, 0xc5, 0x35, 0xe7, 0xae, 0x02, 0x24, 0xe5, + 0x15, 0x15, 0xec, 0x99, 0xa2, 0xaa, 0x53, 0xd2, 0xae, 0x06, 0x6a, 0xa9, + 0xba, 0x43, 0xbf, 0x71, 0x19, 0x35, 0xef, 0x26, 0x92, 0x94, 0x1d, 0xbf, + 0xee, 0x5e, 0xb3, 0x7b, 0x8f, 0xd4, 0x6b, 0x7b, 0x14, 0xcd, 0x12, 0xb5, + 0xe6, 0x28, 0x9e, 0xb4, 0x34, 0x58, 0x6b, 0xce, 0x2a, 0x01, 0x71, 0x58, + 0x96, 0xef, 0x3e, 0x0b, 0xb8, 0x9f, 0x4e, 0xb0, 0x56, 0x37, 0xd5, 0x08, + 0xa1, 0x5b, 0xfe, 0xb9, 0x9f, 0xfe, 0x2c, 0xe0, 0x6b, 0xf7, 0x2b, 0xff, + 0x0f, 0xae, 0x08, 0xd3, 0xf8, 0xe0, 0x2c, 0x1f, 0x8c, 0x15, 0x8c, 0x49, + 0x4d, 0x47, 0x40, 0x59, 0xeb, 0xe2, 0x71, 0x93, 0x1a, 0xd0, 0xe3, 0x02, + 0x51, 0x70, 0x95, 0xef, 0x97, 0xa0, 0xe5, 0x77, 0x02, 0xbb, 0x76, 0x02, + 0x11, 0xfb, 0xa0, 0xcb, 0xa3, 0xc3, 0xdf, 0xfb, 0x5e, 0xe5, 0x37, 0x32, + 0x32, 0x02, 0x03, 0xd0, 0x77, 0x56, 0x08, 0xea, 0x8a, 0xe5, 0x97, 0xb4, + 0x3b, 0xc7, 0xa0, 0xd6, 0x40, 0xc4, 0xbf, 0x03, 0xb6, 0xd5, 0x43, 0x3e, + 0x78, 0xcb, 0x2f, 0xdf, 0xfd, 0xf7, 0xc3, 0xe6, 0x19, 0x0d, 0xf3, 0xfa, + 0x1c, 0x4c, 0x7f, 0x22, 0x6c, 0x9b, 0xd3, 0x6f, 0x83, 0xff, 0xbe, 0x30, + 0xb3, 0xf3, 0x4a, 0x4c, 0xdb, 0xea, 0xd5, 0x4f, 0xc3, 0x86, 0x92, 0x8a, + 0xc2, 0x59, 0xa2, 0xdf, 0xf4, 0x94, 0x5b, 0x41, 0xb4, 0xa4, 0x94, 0x01, + 0x50, 0x2b, 0x2a, 0x63, 0xc6, 0x41, 0xb6, 0xd5, 0xbd, 0xde, 0xeb, 0x8b, + 0x3c, 0x23, 0xa2, 0x90, 0x23, 0x40, 0xae, 0x28, 0xc2, 0xde, 0x1e, 0xf7, + 0x2b, 0xff, 0x1b, 0xe2, 0x83, 0x15, 0x8c, 0x36, 0x78, 0x1a, 0xf0, 0x62, + 0x4c, 0xd9, 0xc1, 0x77, 0x2a, 0xe1, 0x6f, 0x28, 0xd3, 0x43, 0x3e, 0xf7, + 0x28, 0xe6, 0x6a, 0x82, 0xd0, 0x60, 0x2d, 0x24, 0xb4, 0x84, 0x04, 0xcf, + 0xc1, 0x30, 0x4c, 0xc4, 0xff, 0xf9, 0x21, 0x2a, 0x7f, 0xb5, 0x09, 0xf4, + 0xe6, 0x13, 0xbb, 0xd6, 0x5f, 0x82, 0xfb, 0x67, 0xeb, 0x91, 0xff, 0x3c, + 0x1a, 0xb1, 0x08, 0xd2, 0xf3, 0x30, 0xfb, 0x4a, 0xb8, 0x33, 0xd5, 0x58, + 0xfb, 0x18, 0x86, 0x89, 0xe7, 0xc5, 0xc7, 0x85, 0x7a, 0x6e, 0xc8, 0x71, + 0x04, 0x94, 0x47, 0x8d, 0x22, 0x65, 0x05, 0x94, 0x80, 0x09, 0xbf, 0xa6, + 0xc1, 0xf7, 0x49, 0x41, 0xd5, 0x93, 0xb1, 0x4d, 0x70, 0x84, 0x80, 0x9a, + 0xab, 0xea, 0x6d, 0x49, 0x89, 0x61, 0x0a, 0x2a, 0xae, 0xee, 0xd5, 0xe8, + 0x6f, 0x9d, 0xc5, 0x8c, 0xc0, 0x6e, 0x77, 0xa6, 0x03, 0x05, 0x32, 0x6c, + 0xa0, 0x32, 0xaa, 0xea, 0xeb, 0xa6, 0xda, 0x94, 0x8c, 0x21, 0x15, 0x3c, + 0x2b, 0xa2, 0x55, 0x86, 0x60, 0xc2, 0x93, 0xac, 0x2a, 0xc0, 0x58, 0x5d, + 0x41, 0xa5, 0x26, 0xea, 0x52, 0x5d, 0x03, 0x42, 0xd0, 0xf2, 0x81, 0xfe, + 0x82, 0xe0, 0xdd, 0xa1, 0xd5, 0x94, 0x64, 0x73, 0x02, 0xda, 0x82, 0x1a, + 0x90, 0xcd, 0x48, 0x05, 0xdc, 0xca, 0x09, 0xec, 0x47, 0x2a, 0xa0, 0xcb, + 0x96, 0x07, 0x4c, 0x03, 0x2a, 0xf5, 0x30, 0x3f, 0x05, 0x7c, 0x53, 0xd7, + 0xf3, 0xca, 0x8c, 0x82, 0x8e, 0xb5, 0x10, 0xd0, 0x86, 0x62, 0x1b, 0xec, + 0x8c, 0x88, 0x5d, 0x7f, 0xa5, 0x8c, 0x02, 0x6a, 0xb5, 0xda, 0xb0, 0xca, + 0x08, 0xe1, 0x5a, 0xad, 0x36, 0xac, 0x2a, 0x08, 0x26, 0xbc, 0x70, 0x43, + 0x80, 0xb2, 0x86, 0x93, 0xdb, 0x75, 0x05, 0x10, 0xf2, 0x44, 0x16, 0x81, + 0x02, 0x71, 0x55, 0x34, 0x70, 0x47, 0xb6, 0x95, 0x4d, 0x7f, 0x94, 0x32, + 0x0a, 0x24, 0x13, 0xc0, 0x44, 0x5d, 0x37, 0x1c, 0xaa, 0x8d, 0xab, 0xd1, + 0x4d, 0x9c, 0x8e, 0xa0, 0x7e, 0x7b, 0xea, 0x6f, 0x38, 0xfa, 0xc7, 0xaf, + 0x38, 0xb2, 0x46, 0x01, 0x67, 0xbf, 0x6a, 0x6c, 0x4b, 0xf7, 0x63, 0x9c, + 0x66, 0x78, 0xb4, 0x72, 0x0a, 0xb6, 0x75, 0xe1, 0x3b, 0xcb, 0x3d, 0x52, + 0x1f, 0x9c, 0x7c, 0xa0, 0xd6, 0xc1, 0xca, 0x87, 0x71, 0x45, 0xa1, 0x5c, + 0x13, 0xc5, 0x49, 0x56, 0xd9, 0x87, 0x66, 0xcf, 0xd7, 0xb7, 0xef, 0xf9, + 0x39, 0x1f, 0x39, 0x17, 0xfe, 0xef, 0x9d, 0x3b, 0x79, 0xf7, 0x31, 0xc7, + 0x04, 0xe0, 0xac, 0xa5, 0xe7, 0x9e, 0xcb, 0x39, 0xc0, 0xd3, 0xfa, 0x7b, + 0x8e, 0x0f, 0xd3, 0x42, 0xfb, 0x4d, 0xde, 0x77, 0x5f, 0x70, 0xfe, 0xcc, + 0x73, 0xb3, 0xbc, 0x86, 0x67, 0xe0, 0xa8, 0xe4, 0xcb, 0x54, 0x5c, 0x9e, + 0xd7, 0xc0, 0x76, 0x3d, 0x0c, 0x43, 0xdd, 0x4b, 0xd4, 0xec, 0x01, 0x82, + 0xef, 0x6b, 0x45, 0xd3, 0xa0, 0xd5, 0x06, 0xbb, 0x16, 0x1f, 0x0f, 0x17, + 0x99, 0x16, 0xd9, 0x42, 0x9e, 0x35, 0x03, 0x43, 0x0a, 0x4c, 0x85, 0x06, + 0x6a, 0x45, 0x48, 0xa2, 0xd2, 0x43, 0x03, 0xce, 0x5b, 0xac, 0xbf, 0x48, + 0x8d, 0xaf, 0x36, 0x66, 0x24, 0x43, 0x6f, 0x2e, 0x03, 0x59, 0x8a, 0xfd, + 0xa6, 0xca, 0x30, 0x02, 0xc2, 0x42, 0x03, 0xb5, 0x7c, 0xb5, 0xea, 0x2d, + 0x8a, 0xfd, 0x25, 0xa4, 0x6c, 0x20, 0x9b, 0x79, 0xf5, 0xad, 0x51, 0x7f, + 0xff, 0x93, 0x86, 0xc4, 0x68, 0x42, 0x3e, 0xb2, 0x81, 0x57, 0xd6, 0xc8, + 0x03, 0x92, 0xa1, 0xfe, 0x32, 0xe3, 0xb5, 0xce, 0xbe, 0x8d, 0x6f, 0xfb, + 0x92, 0xf7, 0x0d, 0xd3, 0xaa, 0xb7, 0x58, 0x7f, 0xa6, 0xda, 0x38, 0xa0, + 0xd5, 0x04, 0x44, 0x96, 0xa1, 0xc1, 0xd5, 0x01, 0xdc, 0x4a, 0x4a, 0x49, + 0xd6, 0xc8, 0xd3, 0xf0, 0x3c, 0x1c, 0x0d, 0xa6, 0xcb, 0x6b, 0xa0, 0x6b, + 0x36, 0xa7, 0xd2, 0xc4, 0xc0, 0x58, 0xc0, 0xd8, 0x83, 0x13, 0xac, 0x3e, + 0x63, 0x25, 0xc6, 0xd5, 0x3f, 0xe2, 0xfc, 0xf7, 0x9d, 0x8f, 0xc8, 0x9b, + 0xac, 0x3e, 0x63, 0x65, 0x10, 0xb7, 0xda, 0x54, 0xf3, 0x4f, 0x84, 0x19, + 0xa6, 0x0b, 0x6c, 0xe9, 0x7c, 0x7d, 0x9b, 0x46, 0xb0, 0x19, 0x9c, 0x08, + 0xe2, 0xc9, 0x06, 0x8c, 0x3e, 0x38, 0x8a, 0x51, 0xe8, 0xc7, 0xab, 0xda, + 0x08, 0xcb, 0x64, 0x6c, 0x66, 0x8c, 0x7c, 0xde, 0xc7, 0x2c, 0xf7, 0xd0, + 0xbe, 0xde, 0x85, 0x81, 0x69, 0x60, 0x00, 0x00, 0x20, 0x00, 0x49, 0x44, + 0x41, 0x54, 0xcf, 0xae, 0x05, 0x4b, 0xdb, 0xe8, 0x80, 0x50, 0x41, 0x27, + 0x2c, 0x2a, 0x12, 0xff, 0xa9, 0x27, 0xf6, 0xc1, 0xf2, 0x65, 0x01, 0x58, + 0xab, 0xb6, 0xff, 0xd5, 0x8c, 0x7f, 0xf7, 0xc7, 0x0c, 0xbd, 0xfd, 0xd4, + 0x58, 0xf4, 0x9f, 0x3c, 0x79, 0x2c, 0x6f, 0x3c, 0xf1, 0xc0, 0x9c, 0x36, + 0x63, 0x10, 0xad, 0x68, 0x9d, 0xf6, 0xc9, 0x00, 0x86, 0xd5, 0xb5, 0x2c, + 0x5a, 0xcf, 0xfc, 0xe2, 0x67, 0x3d, 0xc3, 0x0e, 0xd6, 0x56, 0x47, 0x9a, + 0x79, 0xdc, 0x0b, 0xb5, 0xe5, 0xdc, 0x63, 0x33, 0xa0, 0x51, 0xd6, 0xcf, + 0x1e, 0x50, 0x69, 0x9e, 0x7b, 0xfe, 0x69, 0x96, 0x2d, 0x3e, 0x43, 0x9d, + 0x2f, 0x9a, 0x2b, 0x75, 0xaa, 0x54, 0xa9, 0x52, 0xa5, 0x4a, 0x95, 0x2a, + 0x55, 0xaa, 0x54, 0xa9, 0x52, 0xa5, 0x4a, 0x95, 0x2a, 0x55, 0xaa, 0x54, + 0xa9, 0x52, 0xa5, 0x4a, 0x95, 0x2a, 0x55, 0xaa, 0x54, 0xa9, 0x52, 0xa5, + 0x9a, 0x4f, 0x29, 0x54, 0x2b, 0x55, 0xaa, 0x54, 0xa9, 0x52, 0xa5, 0x7a, + 0x19, 0xc9, 0x07, 0x3a, 0x05, 0xe7, 0x52, 0x62, 0x9a, 0x66, 0x00, 0x98, + 0xea, 0xef, 0xeb, 0xef, 0x00, 0x6b, 0x49, 0x29, 0xb1, 0xfa, 0x2c, 0x3c, + 0xcf, 0x43, 0x08, 0x81, 0x61, 0x18, 0x78, 0x9e, 0x17, 0xc0, 0xa2, 0xfc, + 0x89, 0xd6, 0x76, 0x2d, 0xbe, 0xc3, 0x72, 0xf9, 0xb4, 0x32, 0xd5, 0xa9, + 0x2a, 0xf9, 0x5c, 0x3e, 0xd8, 0x21, 0xb3, 0x18, 0x99, 0x80, 0x58, 0xec, + 0x2f, 0x62, 0xd7, 0xec, 0x05, 0x1f, 0xfd, 0x34, 0xce, 0x8c, 0x83, 0xd5, + 0x67, 0xb1, 0xeb, 0xfe, 0x5d, 0xf3, 0xd6, 0x35, 0x3a, 0x0f, 0x5d, 0x64, + 0x04, 0x8d, 0x7a, 0x23, 0xe6, 0xef, 0xbb, 0xa3, 0x75, 0xf6, 0xa1, 0x5b, + 0x46, 0x4e, 0x2d, 0x4c, 0x29, 0xbd, 0xa1, 0x84, 0x3d, 0x6d, 0x23, 0x08, + 0x27, 0xdc, 0x77, 0x83, 0x7b, 0x45, 0x77, 0xa2, 0xae, 0xcd, 0xd4, 0x82, + 0xf4, 0x7e, 0x9b, 0xf8, 0x40, 0xad, 0x00, 0x8e, 0x15, 0x91, 0x0f, 0xc4, + 0xf1, 0x27, 0x93, 0xfa, 0x40, 0xad, 0x00, 0xf8, 0x25, 0xa5, 0x6a, 0xff, + 0x8c, 0x58, 0xc0, 0x26, 0xd0, 0x0b, 0x9b, 0xb9, 0x1c, 0xb5, 0x23, 0x82, + 0xff, 0x45, 0x4f, 0x64, 0x2c, 0xa2, 0x00, 0xbc, 0xb6, 0xf6, 0x10, 0x20, + 0x73, 0x6a, 0xe2, 0x6a, 0x90, 0xae, 0xcf, 0x80, 0xa6, 0x07, 0x39, 0x01, + 0x85, 0xb0, 0x0c, 0x46, 0x46, 0xe0, 0x21, 0x83, 0xc5, 0x0b, 0x31, 0x70, + 0x54, 0x46, 0x1b, 0x6f, 0x87, 0xf1, 0x65, 0x5b, 0x99, 0x74, 0x3c, 0x49, + 0x0c, 0xc8, 0x80, 0x9a, 0x3c, 0xdf, 0x6b, 0x71, 0xc1, 0xf0, 0xb9, 0x57, + 0x30, 0x7a, 0xf7, 0x0d, 0x8c, 0xdc, 0xa8, 0xb6, 0x59, 0xdf, 0x7e, 0xeb, + 0x76, 0x9c, 0x19, 0x05, 0xd3, 0x02, 0x90, 0x9e, 0x4d, 0xde, 0x9f, 0xb0, + 0xda, 0x8e, 0xc0, 0xb4, 0x88, 0x4f, 0xf6, 0x16, 0xc1, 0xf2, 0x84, 0xce, + 0x7c, 0x2c, 0x43, 0x60, 0x98, 0x79, 0x9c, 0x9a, 0x13, 0x0f, 0xd0, 0x7f, + 0x3f, 0x67, 0xc6, 0x66, 0xe4, 0x0b, 0xd7, 0xb3, 0xf1, 0xe3, 0x1b, 0x01, + 0x18, 0xb9, 0x71, 0x24, 0x70, 0x03, 0x34, 0x0a, 0x59, 0xb8, 0xb9, 0x41, + 0xbe, 0x09, 0xad, 0xba, 0x44, 0xee, 0x93, 0x30, 0xa3, 0x9b, 0x30, 0x02, + 0xfa, 0x3a, 0x1c, 0x99, 0x66, 0x29, 0x7e, 0x9e, 0xcb, 0x23, 0x9b, 0x8d, + 0x05, 0xc1, 0xb5, 0x7a, 0xc5, 0xf1, 0x9a, 0xf3, 0x4f, 0xc8, 0xf4, 0xe3, + 0x1c, 0x4c, 0xdc, 0x23, 0x15, 0x6f, 0xbe, 0x74, 0x97, 0xfd, 0xc5, 0x65, + 0x6c, 0xbf, 0x7d, 0x3b, 0x6b, 0xdf, 0xb5, 0x96, 0x5d, 0xdf, 0x8e, 0xdf, + 0x37, 0xd6, 0x5f, 0xba, 0x86, 0x9b, 0xbe, 0x38, 0x77, 0x3e, 0x87, 0x5a, + 0x8e, 0xb8, 0x8d, 0xc3, 0x83, 0x9b, 0xf9, 0xf7, 0x42, 0x75, 0x9b, 0x51, + 0x8b, 0x61, 0x9c, 0xba, 0x4d, 0x43, 0x1a, 0xc8, 0xa6, 0xa7, 0x16, 0x59, + 0x68, 0x5d, 0xfd, 0x77, 0x57, 0x73, 0xd5, 0x27, 0x37, 0x71, 0xdd, 0x67, + 0xb7, 0xc4, 0x6c, 0xf8, 0x60, 0x2d, 0x61, 0xe4, 0xe3, 0x76, 0xfb, 0x2c, + 0xaa, 0x55, 0x75, 0xdf, 0x2b, 0x95, 0x4a, 0xc1, 0x02, 0x99, 0xea, 0x54, + 0xb8, 0x10, 0x48, 0xdd, 0xdf, 0x7c, 0xa0, 0xa0, 0xa4, 0x15, 0xf9, 0x1d, + 0x47, 0x21, 0x5a, 0x46, 0xc1, 0xc0, 0xae, 0xd9, 0x18, 0x05, 0x03, 0xa3, + 0x60, 0xa8, 0x6b, 0x5a, 0x43, 0xb4, 0xf2, 0x4b, 0xd4, 0x6f, 0xb1, 0xd1, + 0x54, 0x93, 0xcb, 0x8d, 0x82, 0x89, 0x53, 0x77, 0x62, 0xcf, 0x24, 0x00, + 0x17, 0x3d, 0x71, 0xbd, 0x29, 0x71, 0xbb, 0xfc, 0x0e, 0xfd, 0xf8, 0x7e, + 0x1c, 0x00, 0x2f, 0x47, 0xcc, 0x4e, 0xb8, 0x40, 0x2a, 0x61, 0x5b, 0x03, + 0x22, 0xf3, 0x22, 0x0f, 0x05, 0xa8, 0xd6, 0x6c, 0x4c, 0x53, 0xc3, 0x0c, + 0xf5, 0x31, 0xb6, 0xb0, 0x2a, 0x62, 0x3f, 0x99, 0x67, 0x90, 0x87, 0x9e, + 0xf8, 0x6f, 0x14, 0x42, 0xb8, 0x96, 0x51, 0x50, 0x8b, 0x0e, 0x2b, 0x0f, + 0x8f, 0x63, 0xad, 0x1b, 0xe6, 0xea, 0xcf, 0x5c, 0xcd, 0x57, 0xbf, 0x30, + 0xc2, 0x4d, 0x37, 0x6f, 0xc7, 0x7e, 0x30, 0x02, 0xfb, 0xe8, 0xa1, 0x6e, + 0xeb, 0xd9, 0xba, 0xad, 0x73, 0x8b, 0xae, 0xbd, 0x1b, 0xe8, 0xe1, 0x1f, + 0xf5, 0x4b, 0x9e, 0x4f, 0x6b, 0x80, 0x94, 0x8a, 0x3b, 0xc0, 0x70, 0x64, + 0xb1, 0x84, 0xaf, 0xcf, 0xdf, 0x78, 0xe3, 0x9c, 0x65, 0x9d, 0x2f, 0xdc, + 0x2f, 0x47, 0x12, 0x40, 0x15, 0x85, 0x5c, 0x45, 0x35, 0x4d, 0xbc, 0x9e, + 0xf3, 0xd5, 0xa1, 0xb3, 0xde, 0xd3, 0x31, 0x1b, 0xc9, 0x63, 0xd2, 0x2f, + 0xea, 0xde, 0xa9, 0xcf, 0x76, 0x46, 0xfc, 0x06, 0x22, 0x29, 0x92, 0x7f, + 0x83, 0x75, 0x74, 0x96, 0xff, 0x50, 0x20, 0x5b, 0xf7, 0x4d, 0x3c, 0xc6, + 0x79, 0x11, 0x8e, 0xcc, 0xea, 0x95, 0x27, 0x30, 0x36, 0xf9, 0x14, 0xab, + 0x57, 0xfe, 0x7e, 0xc0, 0x5a, 0xd7, 0x66, 0x0e, 0xce, 0xdd, 0x2b, 0xed, + 0xa1, 0xa4, 0x59, 0x48, 0xfc, 0x2d, 0x99, 0x43, 0x77, 0x47, 0xb5, 0x35, + 0x33, 0xbf, 0x7b, 0x21, 0xba, 0x25, 0xc3, 0xbc, 0xf0, 0x1d, 0x63, 0x60, + 0x15, 0xde, 0xf4, 0x44, 0xdc, 0xf3, 0xfa, 0x3b, 0x80, 0x3b, 0xe0, 0x5b, + 0x23, 0xf1, 0xb8, 0x6e, 0x11, 0xef, 0xd1, 0xb9, 0xfb, 0xb8, 0x0b, 0x55, + 0xd6, 0x82, 0x91, 0xc1, 0xf8, 0x42, 0xeb, 0x6d, 0x6b, 0x0c, 0x36, 0xee, + 0xed, 0x42, 0x1a, 0xfa, 0x8a, 0xd9, 0xe9, 0xf6, 0xc1, 0x5a, 0x3e, 0x14, + 0xeb, 0xf3, 0x91, 0xf8, 0xbe, 0xfb, 0x63, 0xc0, 0xed, 0x63, 0x50, 0xf1, + 0xe0, 0xef, 0x05, 0x50, 0x84, 0xd3, 0xbe, 0x0a, 0xf7, 0x7e, 0x10, 0x6c, + 0x07, 0x3e, 0xef, 0xc4, 0x6d, 0xbc, 0x9c, 0xe5, 0xc3, 0xb5, 0x6e, 0xb9, + 0x16, 0xde, 0xb7, 0x5e, 0xb9, 0xa7, 0x2a, 0xaa, 0x1e, 0x0f, 0x3a, 0xbd, + 0xd3, 0x45, 0xb4, 0xe1, 0x5f, 0x86, 0x21, 0x53, 0x86, 0xb6, 0x5a, 0x5c, + 0x25, 0x16, 0x0f, 0x41, 0x5b, 0x3f, 0x63, 0xbf, 0x3e, 0x8c, 0xad, 0x99, + 0x10, 0xa5, 0x25, 0x82, 0xea, 0x7e, 0x19, 0xb8, 0x6d, 0x09, 0x9b, 0xae, + 0xfb, 0x2a, 0xf8, 0x60, 0xdf, 0x35, 0x25, 0xec, 0x9a, 0xe4, 0x86, 0x1b, + 0xbf, 0x03, 0x80, 0xbb, 0x5f, 0x3d, 0x4b, 0x37, 0x6e, 0x78, 0x57, 0xcf, + 0xbc, 0x05, 0x26, 0x92, 0xb9, 0xfb, 0x1b, 0xae, 0x2b, 0x30, 0x4d, 0x19, + 0xb8, 0x81, 0xe0, 0x3c, 0x29, 0x29, 0x0d, 0x3c, 0x4f, 0xc6, 0xc2, 0xa3, + 0xe9, 0xa5, 0x34, 0x3a, 0x41, 0x5b, 0x7d, 0x6a, 0x21, 0x9b, 0xd0, 0xef, + 0x41, 0xb2, 0xe9, 0x85, 0x1d, 0xed, 0xe9, 0x1d, 0xac, 0x36, 0x74, 0xb8, + 0xa9, 0xfb, 0xdb, 0x6e, 0x64, 0x71, 0x98, 0x37, 0x1a, 0xa4, 0x07, 0x40, + 0x3f, 0x7b, 0x69, 0x46, 0xec, 0xcf, 0x8c, 0xb2, 0xca, 0x18, 0x0a, 0xcf, + 0xfd, 0x3e, 0x8d, 0xa7, 0xda, 0x67, 0xc2, 0x1b, 0x9f, 0xdb, 0xc6, 0x3c, + 0xe9, 0x63, 0x36, 0x16, 0x00, 0xdf, 0xf2, 0x4b, 0xdf, 0xed, 0xed, 0x2b, + 0x60, 0x15, 0xcf, 0x63, 0xc3, 0x0f, 0x4f, 0xda, 0x3a, 0xe1, 0xc4, 0xd7, + 0x51, 0xaf, 0x87, 0xab, 0x6a, 0xcf, 0xfc, 0xa3, 0xd5, 0xfc, 0xf8, 0xc7, + 0x3f, 0x46, 0xec, 0xdf, 0xbf, 0x80, 0xf7, 0xc1, 0x83, 0x57, 0x34, 0xff, + 0x03, 0x11, 0xff, 0x65, 0x84, 0x6f, 0x64, 0x87, 0x5a, 0x97, 0x6e, 0xe5, + 0xf5, 0xdb, 0x46, 0x02, 0xb3, 0xfc, 0x86, 0x27, 0xc7, 0x7f, 0xc4, 0xd1, + 0xaf, 0x7c, 0x15, 0xf9, 0xd7, 0xe5, 0xe9, 0x7f, 0x6d, 0x3f, 0x8f, 0xfc, + 0xe0, 0x87, 0x00, 0x3c, 0x39, 0xfe, 0xa3, 0x85, 0x57, 0xa2, 0x47, 0xfe, + 0xc9, 0x32, 0x2e, 0xe4, 0xef, 0x12, 0xd5, 0x8e, 0xdb, 0x1d, 0xd6, 0x9c, + 0x65, 0x71, 0xc5, 0x47, 0x6e, 0xc1, 0x5a, 0x51, 0xc2, 0xec, 0xb3, 0xa8, + 0xdc, 0xbb, 0x0b, 0x83, 0x2c, 0xde, 0x3f, 0x0d, 0xb3, 0xe3, 0x4e, 0xbd, + 0xf8, 0xaf, 0xfd, 0xaf, 0x94, 0xe4, 0xae, 0xb0, 0xde, 0x52, 0xe2, 0x19, + 0xe1, 0xa2, 0x7c, 0xf9, 0x82, 0x2e, 0xc3, 0x31, 0xc4, 0x20, 0xcf, 0x00, + 0xf9, 0xc4, 0xea, 0xe3, 0xb1, 0x4a, 0x95, 0x92, 0x55, 0xa4, 0xbc, 0xdc, + 0xec, 0xfa, 0x8e, 0x28, 0x56, 0x5c, 0x0e, 0xb5, 0x10, 0xa4, 0x58, 0x7d, + 0xc4, 0x26, 0x2f, 0x4c, 0x8c, 0x25, 0x79, 0x84, 0x80, 0x86, 0x07, 0xdb, + 0xc7, 0x61, 0xf8, 0xc3, 0xeb, 0xa9, 0xdc, 0x19, 0x25, 0x04, 0x9d, 0x4f, + 0xb5, 0x3d, 0x4c, 0x71, 0x66, 0x7b, 0xb8, 0x40, 0x3d, 0xe3, 0x97, 0xc1, + 0x40, 0xea, 0xf7, 0x72, 0x8b, 0x31, 0xac, 0xa1, 0x12, 0x95, 0x8a, 0x83, + 0xbd, 0xaf, 0x1a, 0xd8, 0x06, 0x10, 0xf9, 0x7c, 0x1c, 0xce, 0xad, 0x6d, + 0xe4, 0xc5, 0xdc, 0x60, 0x0f, 0xbf, 0x9c, 0x96, 0x55, 0xc2, 0x9e, 0xf1, + 0x82, 0x7c, 0x85, 0x30, 0xf0, 0xdf, 0x6f, 0xa2, 0x75, 0x6d, 0x78, 0x1e, + 0x66, 0x84, 0x5b, 0x60, 0x2c, 0xc9, 0x22, 0xa3, 0xf7, 0x83, 0x1e, 0xba, + 0xe9, 0xe6, 0xed, 0xf4, 0x2f, 0x33, 0xf0, 0x22, 0x71, 0xe5, 0x0b, 0xaa, + 0xdd, 0xe7, 0xfb, 0xed, 0x7c, 0x13, 0x78, 0x01, 0x05, 0xd4, 0x7a, 0xee, + 0xf2, 0xa3, 0xa9, 0x6d, 0x53, 0x70, 0x2c, 0x0b, 0x05, 0xce, 0x9a, 0x00, + 0xce, 0x01, 0x1e, 0x07, 0x7e, 0x0d, 0xf8, 0x4b, 0x88, 0x5b, 0x28, 0x70, + 0xd6, 0xab, 0x81, 0xe6, 0xa4, 0x02, 0x66, 0xf9, 0x40, 0x2d, 0x3f, 0xfd, + 0xf7, 0xf5, 0xf1, 0xa2, 0xe6, 0x8b, 0x7c, 0x19, 0x78, 0x83, 0x0e, 0xbb, + 0x15, 0x78, 0x23, 0xf0, 0x0a, 0x9d, 0x3f, 0xda, 0xf6, 0xbe, 0xf9, 0xab, + 0xda, 0x55, 0xbf, 0x6c, 0xbe, 0xc8, 0x6b, 0x72, 0x47, 0x75, 0xf8, 0x3f, + 0xa3, 0x41, 0x5e, 0xbf, 0x0f, 0x1d, 0x4c, 0x79, 0xde, 0x43, 0x27, 0x4c, + 0xec, 0xa5, 0x80, 0x8b, 0xed, 0xed, 0x06, 0xd4, 0x42, 0xc1, 0x9a, 0xa6, + 0x22, 0xe7, 0x3e, 0xb8, 0x69, 0xef, 0x22, 0xf5, 0x2e, 0x7b, 0xdb, 0x93, + 0xc0, 0xec, 0x2c, 0x14, 0x8a, 0x7c, 0xe0, 0x44, 0x9b, 0xdb, 0x9e, 0x2c, + 0xf0, 0x81, 0x13, 0xeb, 0xdc, 0xf6, 0x64, 0x91, 0x57, 0x3d, 0x6f, 0xb3, + 0x77, 0x51, 0x91, 0x0f, 0x9c, 0xd8, 0xe4, 0xc0, 0xeb, 0x67, 0xd9, 0x7e, + 0xb3, 0xba, 0xdb, 0x9c, 0xbe, 0x58, 0x5d, 0x79, 0x2b, 0x56, 0xc6, 0xc1, + 0x5a, 0x00, 0xbf, 0x5a, 0x54, 0xe4, 0x57, 0xc0, 0xde, 0x27, 0xd5, 0xf9, + 0x20, 0xb3, 0x41, 0x5e, 0x83, 0xcf, 0xbf, 0x91, 0x9f, 0xf3, 0x93, 0x00, + 0xd2, 0xa5, 0x8e, 0x8b, 0x55, 0xf9, 0x26, 0x67, 0x59, 0xb1, 0x72, 0x71, + 0x0c, 0x36, 0xb5, 0x57, 0x3b, 0x07, 0xe7, 0x5e, 0xdb, 0x1e, 0xd6, 0x55, + 0xa7, 0xbf, 0xed, 0xc9, 0x02, 0xa2, 0xa0, 0xfc, 0xb6, 0xd5, 0x1d, 0x44, + 0xc1, 0xc2, 0x8a, 0x2c, 0x9a, 0x76, 0x0a, 0x45, 0xa8, 0x3b, 0xea, 0x88, + 0x1e, 0xaf, 0xd3, 0xff, 0xa4, 0x74, 0x48, 0x8e, 0x9e, 0xa9, 0xde, 0xa0, + 0xc4, 0x46, 0x50, 0x85, 0x10, 0xa8, 0xc5, 0x62, 0x1e, 0x62, 0x96, 0xb7, + 0xbe, 0x75, 0x31, 0xdf, 0x7d, 0x68, 0x96, 0x92, 0x00, 0x5b, 0x0a, 0x6c, + 0x1d, 0x1f, 0x04, 0x2f, 0x2e, 0x56, 0xbf, 0x95, 0x5f, 0xcc, 0xc2, 0x90, + 0x80, 0x3f, 0xec, 0x51, 0x17, 0xff, 0x6f, 0xf4, 0x73, 0xd4, 0xef, 0x6a, + 0x2e, 0xad, 0x5f, 0x63, 0xb1, 0x63, 0xb7, 0x13, 0x3b, 0x07, 0xd8, 0xb1, + 0xc7, 0x09, 0xca, 0x1b, 0x05, 0x69, 0x8d, 0xee, 0x09, 0xe3, 0x76, 0xf3, + 0x4f, 0xfa, 0x5d, 0xf3, 0xf5, 0xef, 0x73, 0xf5, 0xfb, 0xdf, 0xc6, 0xc5, + 0x6b, 0x42, 0xff, 0xed, 0x7e, 0x7e, 0xbb, 0xe3, 0xfe, 0x00, 0x63, 0xd3, + 0xea, 0x7e, 0xb7, 0x7a, 0xc0, 0x60, 0x6c, 0xda, 0x63, 0x68, 0xaa, 0xc5, + 0x2d, 0x7b, 0x56, 0xb3, 0xe9, 0x93, 0x63, 0xb1, 0x78, 0x66, 0x5f, 0x96, + 0x5d, 0xbb, 0x75, 0xbf, 0xae, 0x69, 0x73, 0xdd, 0xad, 0x6e, 0x30, 0xce, + 0x50, 0xcc, 0xe9, 0x71, 0x8a, 0xba, 0x4b, 0xb9, 0xdf, 0xa0, 0x6a, 0xbb, + 0x01, 0xdc, 0x6f, 0x74, 0x4f, 0x95, 0x61, 0xd4, 0xb8, 0x60, 0x91, 0x2a, + 0x76, 0xae, 0x04, 0x75, 0x97, 0xeb, 0x6e, 0x55, 0xe3, 0x10, 0x95, 0x27, + 0x42, 0x9b, 0x40, 0x60, 0xd7, 0xb7, 0x39, 0x3a, 0x5e, 0x0d, 0x6c, 0x02, + 0x6c, 0xb9, 0x3d, 0x3e, 0x7e, 0xb1, 0xf6, 0xcd, 0x45, 0x2e, 0xbf, 0xee, + 0x0e, 0xb6, 0xee, 0x3d, 0x3b, 0xe6, 0x1f, 0x1d, 0x46, 0x9e, 0xa8, 0x34, + 0x3a, 0xc3, 0xb4, 0x6e, 0x99, 0x52, 0xc0, 0x58, 0xeb, 0x7d, 0x12, 0xeb, + 0x2e, 0x41, 0x45, 0x8f, 0x0b, 0x97, 0xa4, 0xa0, 0x36, 0x13, 0xa6, 0xdb, + 0xf1, 0x40, 0x1c, 0x4c, 0x53, 0x5e, 0x51, 0xc4, 0xeb, 0x02, 0x2f, 0x88, + 0x65, 0x93, 0xc9, 0xc7, 0xc0, 0x5a, 0xbe, 0xa2, 0x7e, 0x86, 0x18, 0xd6, + 0x00, 0x2d, 0x34, 0x50, 0xcb, 0xef, 0xcb, 0x7e, 0x35, 0x92, 0x62, 0x33, + 0x0a, 0xac, 0xb5, 0x85, 0x46, 0x3d, 0xbc, 0x1e, 0x6c, 0x37, 0x2c, 0x93, + 0x91, 0x5b, 0x8f, 0xd7, 0xdc, 0x11, 0xc0, 0xa5, 0x7c, 0xe5, 0x4d, 0x8b, + 0x3c, 0x16, 0xf6, 0x0c, 0x1a, 0x94, 0x65, 0xd1, 0x70, 0x43, 0x1b, 0x51, + 0xb7, 0x0f, 0xd2, 0xf2, 0xc1, 0x5a, 0x00, 0xc2, 0xb4, 0x90, 0xae, 0x03, + 0x19, 0x89, 0x87, 0xc4, 0xc8, 0x18, 0x78, 0x28, 0x78, 0x96, 0xcf, 0x91, + 0x30, 0x22, 0x70, 0x2d, 0x2f, 0xe3, 0xcd, 0x39, 0x0b, 0xc3, 0x93, 0x36, + 0x86, 0x50, 0xbf, 0x5d, 0xa7, 0x6d, 0x63, 0xe4, 0x6c, 0xa4, 0xcc, 0x63, + 0x65, 0x8a, 0x6c, 0x9f, 0x82, 0x8b, 0xdf, 0x70, 0x3d, 0xd5, 0x76, 0x85, + 0xca, 0x14, 0xc8, 0xf6, 0x08, 0x95, 0x29, 0xa8, 0x4c, 0x4d, 0x20, 0x32, + 0x57, 0x23, 0x74, 0xba, 0xbc, 0x7e, 0x18, 0xab, 0xf2, 0x96, 0xc3, 0xf3, + 0x19, 0x97, 0xbc, 0x69, 0x51, 0xf3, 0x08, 0x80, 0x5a, 0x7e, 0xbb, 0x28, + 0xc5, 0xeb, 0xde, 0x4d, 0x46, 0xc6, 0xc0, 0x9e, 0x51, 0x7f, 0x57, 0x05, + 0xd4, 0x5a, 0xd8, 0xd8, 0xe9, 0xfd, 0xfa, 0xd8, 0x4f, 0x08, 0xc7, 0xf2, + 0x8f, 0xbd, 0x54, 0x8b, 0xb8, 0xfb, 0x13, 0x7e, 0xfd, 0x11, 0x9b, 0xf7, + 0x03, 0x7f, 0xea, 0x47, 0x48, 0x42, 0xa5, 0xa6, 0xbb, 0xc3, 0xec, 0xa3, + 0xe1, 0x49, 0xf7, 0xe1, 0x2a, 0xb0, 0x95, 0xb4, 0xaf, 0xcb, 0x37, 0x30, + 0x00, 0x2b, 0x76, 0xc2, 0xe7, 0x06, 0x60, 0xdd, 0xe7, 0xd4, 0x37, 0x88, + 0x9d, 0x9f, 0x18, 0x61, 0xe6, 0xfe, 0xb9, 0x41, 0x58, 0x81, 0xdd, 0x79, + 0xca, 0x39, 0xa2, 0xc3, 0x37, 0x0e, 0x28, 0xf7, 0xc6, 0xb9, 0xe0, 0x5a, + 0x7e, 0xfb, 0x44, 0xca, 0x77, 0x6f, 0x34, 0xbf, 0x91, 0x44, 0x3b, 0xcd, + 0x9d, 0xf5, 0xfc, 0xea, 0x06, 0xd0, 0x6a, 0x2b, 0x10, 0x91, 0xdf, 0xcf, + 0x4c, 0xf6, 0xa3, 0xc3, 0xfe, 0x67, 0x04, 0xac, 0x55, 0xd3, 0x9b, 0xe2, + 0xe4, 0xfc, 0xbe, 0x6c, 0xfc, 0x1d, 0x37, 0x06, 0xe4, 0xaa, 0x39, 0xc8, + 0x37, 0x94, 0x90, 0x91, 0xf7, 0x47, 0x32, 0x59, 0xb5, 0x09, 0xc3, 0xb4, + 0x3d, 0x3f, 0x51, 0x48, 0xaa, 0x67, 0xa6, 0xd0, 0xf0, 0x2d, 0x6f, 0xb0, + 0x04, 0x19, 0x81, 0xa1, 0xbf, 0x47, 0x8a, 0xc8, 0x0d, 0x53, 0xbd, 0x2f, + 0x44, 0xea, 0x27, 0x41, 0x8a, 0x05, 0x80, 0xb5, 0x90, 0xf0, 0x9e, 0x0f, + 0x86, 0xef, 0x5b, 0x6d, 0x49, 0xff, 0xcd, 0xbb, 0xa8, 0xfd, 0xd9, 0x7a, + 0x5d, 0xf7, 0x2c, 0xae, 0x67, 0x63, 0xe6, 0x4c, 0xdc, 0xba, 0xda, 0x28, + 0xc8, 0x07, 0x6a, 0x45, 0xbf, 0x7d, 0x46, 0x81, 0x5a, 0x71, 0x08, 0xd9, + 0x4b, 0xf1, 0x36, 0xaa, 0x54, 0x12, 0x0a, 0x5c, 0x85, 0x10, 0x0a, 0xd4, + 0xd4, 0x0e, 0xfb, 0x18, 0x76, 0x5b, 0x06, 0xa0, 0xac, 0xb0, 0x5c, 0xaa, + 0x4d, 0xca, 0x02, 0x2a, 0x88, 0x0e, 0xa8, 0xb6, 0x94, 0x50, 0x45, 0x01, + 0xb5, 0xfc, 0xf6, 0xf0, 0xe1, 0x50, 0x42, 0x44, 0xbf, 0x3c, 0xc6, 0xdf, + 0x10, 0x8b, 0x39, 0x03, 0xbb, 0xa9, 0xee, 0xaf, 0x52, 0xff, 0x55, 0x26, + 0x34, 0xf1, 0x6f, 0xa2, 0xae, 0x62, 0x8e, 0xd5, 0xa1, 0xe4, 0x7f, 0x8f, + 0x89, 0x5c, 0x23, 0x13, 0x9e, 0x0c, 0x00, 0x5c, 0xe0, 0x83, 0xb5, 0xc2, + 0xf0, 0x6c, 0x4e, 0x50, 0xca, 0xc1, 0x58, 0x53, 0xd5, 0xc9, 0xd2, 0xed, + 0x59, 0xf5, 0x40, 0xbd, 0x55, 0x80, 0xc2, 0x7d, 0x11, 0x5c, 0xdf, 0x93, + 0x7a, 0xd3, 0xa2, 0xac, 0x50, 0x90, 0xac, 0xe8, 0x97, 0xaa, 0x96, 0x54, + 0xfe, 0x08, 0x40, 0x83, 0xb4, 0xaa, 0xcd, 0x30, 0x0c, 0x42, 0xc0, 0x16, + 0x00, 0x19, 0x41, 0xa5, 0x2e, 0x29, 0x0a, 0x41, 0xb9, 0x20, 0x10, 0x99, + 0x2c, 0x9e, 0xa7, 0xae, 0xb7, 0x8a, 0x07, 0xe5, 0x02, 0xd8, 0x4d, 0xf5, + 0x1d, 0xb8, 0xaa, 0xdb, 0xcb, 0x89, 0xee, 0xbc, 0x44, 0x08, 0xd7, 0x2a, + 0xe9, 0x6f, 0xd9, 0x76, 0x17, 0x90, 0xdd, 0x91, 0xd2, 0x4b, 0x01, 0xd4, + 0x02, 0x78, 0xf2, 0x89, 0x7d, 0x9c, 0xb8, 0x7c, 0x59, 0x00, 0xd1, 0xb2, + 0x72, 0x71, 0xb0, 0xd6, 0x19, 0xe5, 0x65, 0x38, 0xfb, 0xeb, 0x58, 0x4b, + 0x0a, 0x3c, 0x79, 0x92, 0xea, 0xc0, 0x3f, 0x7b, 0x80, 0x43, 0x06, 0x5a, + 0x45, 0xc1, 0x58, 0x49, 0xf5, 0x02, 0x65, 0xf9, 0xf1, 0x87, 0xe5, 0x4a, + 0xea, 0xa7, 0xaa, 0xdf, 0xe8, 0x6b, 0x39, 0x8a, 0x27, 0x4f, 0x9a, 0xe4, + 0xc4, 0xc7, 0x0f, 0x0f, 0xac, 0xf5, 0xa5, 0x4f, 0x7d, 0x89, 0x93, 0x5f, + 0xb1, 0x92, 0xa7, 0x7e, 0x0b, 0x4f, 0xdd, 0xf3, 0x73, 0xb8, 0xe7, 0x4b, + 0xb1, 0xf0, 0x13, 0x8e, 0x7e, 0x82, 0xa5, 0xe7, 0x9e, 0x1b, 0xc0, 0xb4, + 0xee, 0x7a, 0xe1, 0x85, 0x58, 0xf8, 0x49, 0x27, 0x9d, 0xc4, 0xac, 0xf3, + 0xcc, 0x82, 0xf2, 0x2a, 0x9a, 0xf1, 0x71, 0x82, 0xbc, 0xa1, 0x20, 0x74, + 0x8d, 0xba, 0xdb, 0x71, 0x1f, 0x97, 0xfa, 0xa2, 0x95, 0xed, 0x2c, 0xe3, + 0x9f, 0xdd, 0xc1, 0xd0, 0xbb, 0xd7, 0x60, 0x4f, 0x4f, 0xb0, 0xfe, 0x9c, + 0x4b, 0x70, 0xf7, 0xdb, 0x58, 0xc2, 0xa0, 0x5a, 0x9b, 0xa4, 0x7a, 0xfb, + 0x28, 0xa5, 0x0b, 0x87, 0xd9, 0xfa, 0xf9, 0x6b, 0xb1, 0x06, 0x2c, 0x2e, + 0xbf, 0xe8, 0x72, 0x5a, 0xf5, 0x16, 0x56, 0x4e, 0xd0, 0x90, 0x21, 0x34, + 0xcb, 0x07, 0x6a, 0xf9, 0x1b, 0xbe, 0xf9, 0xca, 0x46, 0xe0, 0x5a, 0xad, + 0x66, 0x03, 0xd7, 0x91, 0xb8, 0xd4, 0x20, 0x23, 0x30, 0x97, 0x98, 0x58, + 0x46, 0x9e, 0xc6, 0x4c, 0x83, 0x6c, 0x26, 0x8b, 0x33, 0xe5, 0xc0, 0x0a, + 0x30, 0x84, 0x05, 0x19, 0x89, 0x58, 0x2c, 0x82, 0xb1, 0xc6, 0xf2, 0xb2, + 0x7e, 0x0d, 0xa6, 0x8a, 0x2b, 0x00, 0x77, 0x89, 0x6c, 0x47, 0x98, 0xca, + 0x13, 0xfc, 0x8e, 0x73, 0xf4, 0xfe, 0xe0, 0xff, 0xc6, 0x5a, 0x91, 0xb1, + 0x0c, 0x1f, 0x8a, 0xd5, 0x6a, 0xc2, 0xda, 0x73, 0x57, 0xe1, 0xec, 0x93, + 0x54, 0xf6, 0x56, 0x29, 0x9f, 0xb9, 0x96, 0xbc, 0x11, 0x8f, 0x0b, 0x20, + 0x0a, 0x02, 0x67, 0xda, 0xc1, 0x58, 0x61, 0x05, 0xb6, 0xf2, 0x86, 0x80, + 0x2c, 0xc8, 0xd9, 0xb0, 0x0d, 0x2a, 0xb5, 0x0a, 0xa6, 0x30, 0x71, 0xf5, + 0x26, 0x77, 0x7e, 0x99, 0x0c, 0x61, 0x60, 0xe5, 0xb2, 0x34, 0x96, 0x18, + 0xd0, 0x04, 0x4f, 0x1e, 0x3e, 0x29, 0xcf, 0x3a, 0xa7, 0xd8, 0x13, 0xfa, + 0x34, 0x57, 0xd8, 0x42, 0x74, 0xc2, 0xf2, 0x65, 0x00, 0x64, 0x73, 0x6f, + 0xe7, 0xfa, 0x91, 0xfb, 0xe9, 0x33, 0x07, 0x18, 0x7a, 0xfb, 0xa9, 0x8c, + 0x7f, 0xf7, 0xc7, 0x00, 0xcc, 0xb8, 0xaa, 0xd3, 0xf1, 0xd4, 0x13, 0xfb, + 0x78, 0xea, 0x09, 0x78, 0xef, 0xba, 0x3f, 0x24, 0x36, 0x74, 0xde, 0x0d, + 0x08, 0xb6, 0x40, 0xbf, 0xc7, 0xac, 0x0a, 0x8f, 0x4d, 0x57, 0xf8, 0x28, + 0x9f, 0xe2, 0xc1, 0x1f, 0xdf, 0xc7, 0xb7, 0x9b, 0x0b, 0xc4, 0x7f, 0x1f, + 0x09, 0x08, 0xd9, 0xc1, 0x2a, 0x91, 0xe7, 0xbe, 0xd9, 0x07, 0x38, 0x6e, + 0xd1, 0x52, 0x8e, 0x3f, 0x56, 0xf5, 0xf7, 0x7d, 0xc0, 0x56, 0xaa, 0x54, + 0xa9, 0x52, 0xa5, 0x4a, 0x95, 0x2a, 0x55, 0xaa, 0x54, 0xa9, 0x52, 0xa5, + 0x4a, 0x95, 0x2a, 0x55, 0xaa, 0x54, 0xa9, 0x52, 0xa5, 0x4a, 0x95, 0x2a, + 0x55, 0xaa, 0x54, 0xa9, 0x52, 0xa5, 0x3a, 0x3c, 0xa5, 0x50, 0xad, 0x54, + 0xa9, 0x52, 0xa5, 0x4a, 0x95, 0xea, 0x65, 0xaa, 0xe8, 0x24, 0x42, 0xd3, + 0x34, 0xa9, 0xcd, 0xd4, 0x02, 0xd8, 0x53, 0x00, 0x8a, 0xd2, 0x71, 0x9c, + 0x99, 0x70, 0x11, 0x44, 0xad, 0x56, 0x53, 0x13, 0xa8, 0x75, 0x58, 0xd1, + 0x2c, 0xd2, 0x68, 0x36, 0x70, 0x5d, 0x37, 0x84, 0x8d, 0x64, 0x04, 0xee, + 0x8c, 0x0b, 0x12, 0xec, 0xba, 0x4d, 0xa3, 0xd9, 0x40, 0x36, 0x25, 0x8d, + 0xa6, 0x86, 0xab, 0xe4, 0xf2, 0x4c, 0x3c, 0x3a, 0x11, 0x3b, 0xfa, 0xe0, + 0x2c, 0xff, 0x98, 0x0c, 0xf7, 0xfd, 0x0e, 0x46, 0xd1, 0x89, 0xde, 0x01, + 0x1c, 0x2b, 0x31, 0x81, 0x52, 0xb6, 0x35, 0x1c, 0x2c, 0x23, 0x82, 0x09, + 0x90, 0xfd, 0x7d, 0xfd, 0xe4, 0x0b, 0x79, 0x2a, 0x7b, 0x2b, 0x54, 0xf6, + 0x56, 0x02, 0x78, 0x58, 0xb4, 0x4d, 0x7c, 0x3b, 0x7e, 0x7a, 0xff, 0xe8, + 0xcb, 0xb7, 0x55, 0x1a, 0x28, 0xd1, 0xa8, 0x37, 0xa8, 0xcd, 0xd4, 0x28, + 0x0f, 0x96, 0xa9, 0x3e, 0x5a, 0xc5, 0xc8, 0x19, 0xb1, 0xc9, 0x96, 0xf9, + 0x5c, 0x1e, 0x17, 0x17, 0x77, 0xc6, 0xc5, 0x30, 0x0c, 0x1c, 0xcf, 0x41, + 0xb6, 0x25, 0xa6, 0x61, 0x92, 0x15, 0x59, 0xaa, 0xd3, 0xd5, 0x0e, 0xf0, + 0xcc, 0xa1, 0x2a, 0x39, 0xf9, 0x3d, 0x5c, 0xf4, 0x1b, 0x89, 0x13, 0x59, + 0x12, 0x17, 0x5d, 0x1e, 0x27, 0x32, 0xe0, 0xe5, 0x44, 0x38, 0x7b, 0xbd, + 0xe9, 0xa9, 0x45, 0xea, 0x7e, 0x5d, 0xda, 0x80, 0x27, 0xc9, 0xf6, 0x09, + 0x5a, 0x35, 0x2f, 0x96, 0x2e, 0x50, 0x3b, 0x31, 0x09, 0x33, 0xd3, 0x59, + 0x2f, 0xab, 0x20, 0x30, 0x0a, 0x79, 0x3c, 0xb7, 0xd1, 0x11, 0x16, 0xa4, + 0x69, 0x87, 0x80, 0x2d, 0x43, 0x08, 0x46, 0x9b, 0x77, 0x30, 0x72, 0xe3, + 0x08, 0xdb, 0x6f, 0xdd, 0xce, 0xd8, 0x9e, 0xce, 0x85, 0x56, 0x02, 0x81, + 0x27, 0x25, 0x08, 0x09, 0x19, 0xbd, 0x48, 0x21, 0xe3, 0x4f, 0xd2, 0x8d, + 0xdb, 0x16, 0xfe, 0x12, 0x06, 0x19, 0xa6, 0x45, 0x80, 0x61, 0xaa, 0x32, + 0x59, 0x42, 0xe0, 0xf8, 0x0d, 0x66, 0x58, 0x38, 0x33, 0xe1, 0x84, 0xc3, + 0x8d, 0x1f, 0xbd, 0x92, 0x91, 0x2f, 0x28, 0x40, 0xc6, 0x75, 0x9f, 0xbe, + 0x1a, 0x4b, 0xe4, 0x91, 0x0e, 0x88, 0x25, 0x12, 0x31, 0x05, 0x2d, 0x4f, + 0x22, 0xf7, 0xa9, 0x76, 0xf2, 0xea, 0xf1, 0x6b, 0x26, 0x6c, 0xaf, 0xf8, + 0x35, 0x7a, 0x30, 0x92, 0xcd, 0x06, 0x42, 0x83, 0xb4, 0x00, 0x44, 0x2e, + 0x3f, 0x4f, 0x8a, 0x50, 0x46, 0xce, 0x07, 0x6a, 0x84, 0x93, 0x7d, 0xbd, + 0xa6, 0x8d, 0x91, 0x2b, 0x76, 0x4f, 0xb0, 0x40, 0x2d, 0xc4, 0xc6, 0x7c, + 0x71, 0x24, 0x9d, 0x0b, 0xb1, 0xe6, 0xb3, 0xb9, 0xea, 0x2c, 0x15, 0xbe, + 0xfd, 0xf6, 0xed, 0x5d, 0xd3, 0x49, 0x9c, 0x00, 0xb6, 0xd5, 0xbf, 0xac, + 0x9f, 0x1d, 0x37, 0xef, 0x9e, 0xb3, 0x2c, 0xdd, 0xca, 0xa0, 0xec, 0x99, + 0x5d, 0xfd, 0xe7, 0x93, 0xd7, 0x74, 0x83, 0xb4, 0xdd, 0xe0, 0x51, 0x51, + 0x5d, 0x76, 0xe9, 0x65, 0x20, 0x60, 0xf7, 0x3d, 0xbb, 0x63, 0x93, 0xcd, + 0xa5, 0xfe, 0xed, 0x49, 0x09, 0x9e, 0x86, 0xbb, 0x6d, 0xd2, 0x40, 0x2d, + 0xff, 0x9e, 0x65, 0x08, 0x81, 0xed, 0xc3, 0xa4, 0x0a, 0xbd, 0xaf, 0x87, + 0x52, 0xa9, 0x44, 0xb5, 0x5a, 0x45, 0x64, 0x55, 0xba, 0xd2, 0x8a, 0x52, + 0x0c, 0xac, 0x95, 0x44, 0x14, 0xb4, 0x50, 0x00, 0x29, 0x5f, 0x46, 0xc1, + 0x08, 0xee, 0xd5, 0x51, 0xc9, 0xb6, 0xba, 0x1f, 0xe6, 0x97, 0xa8, 0xf3, + 0x4b, 0xde, 0x77, 0xbe, 0x72, 0x64, 0xe0, 0x8a, 0xff, 0xab, 0x3b, 0x60, + 0x6a, 0x21, 0xf7, 0xbb, 0x64, 0x9c, 0x28, 0xf0, 0xca, 0x07, 0x83, 0x75, + 0x53, 0x56, 0xe4, 0x83, 0x9a, 0x98, 0x89, 0x49, 0xfd, 0xae, 0x86, 0x47, + 0x26, 0xed, 0x76, 0xcb, 0xd3, 0xbf, 0x8f, 0x7a, 0xb3, 0x0a, 0x26, 0xe6, + 0x43, 0xc5, 0x14, 0x5c, 0x4b, 0xe2, 0xd4, 0x1b, 0x94, 0x4f, 0x53, 0xbb, + 0xfe, 0x5e, 0xf3, 0x77, 0x57, 0xb1, 0xfd, 0xd6, 0x1d, 0x9d, 0x40, 0xbe, + 0x2e, 0xea, 0x06, 0x99, 0xfa, 0x0d, 0x6a, 0xa1, 0x7d, 0xd2, 0x7f, 0x21, + 0xee, 0x4e, 0x90, 0x56, 0x5c, 0x23, 0x4c, 0xeb, 0xb5, 0x79, 0xd3, 0x9c, + 0xbb, 0x1c, 0xce, 0x3d, 0x17, 0x3e, 0xfe, 0xf1, 0x78, 0x1c, 0x9f, 0x9b, + 0x15, 0xf5, 0x5f, 0xa8, 0xdf, 0x42, 0xca, 0x3c, 0x97, 0xba, 0x81, 0xc4, + 0xe6, 0xaa, 0xd3, 0xe1, 0xac, 0x5b, 0xec, 0x96, 0x76, 0xae, 0x35, 0x86, + 0x3b, 0x89, 0xad, 0x15, 0x3c, 0xe4, 0xfc, 0xcf, 0xdb, 0x0d, 0xdf, 0x59, + 0x03, 0x4c, 0x3c, 0x06, 0x40, 0x56, 0x64, 0x59, 0x7b, 0xcf, 0x21, 0x18, + 0x7a, 0x19, 0x68, 0xb3, 0x7e, 0x9e, 0xfa, 0x40, 0xac, 0xcd, 0xed, 0xee, + 0xee, 0xc3, 0xd1, 0xa6, 0x76, 0x08, 0xca, 0x5a, 0x88, 0xfb, 0xe5, 0xa0, + 0x0e, 0xa0, 0x56, 0x54, 0xef, 0xd9, 0x18, 0x3b, 0xf5, 0xe6, 0xda, 0xf9, + 0x7d, 0x81, 0xba, 0xec, 0x42, 0x78, 0xcd, 0x55, 0xab, 0x41, 0x08, 0x4e, + 0xb8, 0x47, 0xf7, 0x95, 0x12, 0xfd, 0xad, 0xf2, 0x20, 0x14, 0xdf, 0x00, + 0x37, 0x95, 0xf4, 0x4a, 0x92, 0x0f, 0xbb, 0x49, 0x33, 0xca, 0xd6, 0x45, + 0x70, 0xd3, 0xad, 0x1e, 0x94, 0x8d, 0x39, 0xc1, 0x58, 0x97, 0x5d, 0x04, + 0x37, 0x7d, 0x66, 0x54, 0xc5, 0xbb, 0x7d, 0x25, 0x14, 0x50, 0xff, 0xde, + 0xdc, 0x3b, 0x8d, 0x71, 0xda, 0xf9, 0x78, 0x0f, 0xdf, 0xd1, 0x3b, 0xc2, + 0x61, 0xc6, 0x3f, 0x64, 0x5d, 0xb2, 0x19, 0xb5, 0x98, 0xfe, 0xe0, 0xe5, + 0xed, 0x9c, 0x04, 0xd4, 0x82, 0x3b, 0x43, 0x64, 0x91, 0x91, 0xbf, 0xe7, + 0x1d, 0x77, 0x87, 0x24, 0x8d, 0xe0, 0x8a, 0xc8, 0x65, 0x03, 0xf7, 0xda, + 0xdd, 0x0e, 0xd2, 0x7f, 0x06, 0x8d, 0x97, 0x43, 0xa3, 0x91, 0xbe, 0xe2, + 0xc8, 0xd6, 0x6f, 0x07, 0xee, 0x2b, 0x36, 0x7c, 0xa8, 0x23, 0x7f, 0x41, + 0xd8, 0x27, 0x71, 0xbb, 0xff, 0x49, 0x03, 0x98, 0x56, 0xaf, 0xf3, 0x50, + 0xb2, 0x6b, 0x78, 0x78, 0x1e, 0x5f, 0x78, 0xea, 0x3f, 0x51, 0xc3, 0xc5, + 0xc8, 0xca, 0x3d, 0x57, 0x9f, 0x56, 0x98, 0x22, 0x06, 0xd6, 0x0a, 0x94, + 0x4b, 0xb8, 0xbb, 0x81, 0x74, 0x22, 0x90, 0x50, 0x8c, 0x7c, 0x0c, 0x8c, + 0xb5, 0x20, 0x1b, 0xf3, 0xa5, 0x3f, 0x0c, 0x89, 0xc4, 0xf1, 0x60, 0xd3, + 0x01, 0x2c, 0x5d, 0xba, 0x94, 0x7a, 0xbd, 0xce, 0x9e, 0xef, 0x8d, 0xb1, + 0xe8, 0x58, 0xc1, 0x5b, 0x4e, 0x5f, 0x45, 0xa1, 0x50, 0xe0, 0xd9, 0xfd, + 0xfb, 0xa3, 0xdc, 0x8a, 0x23, 0xae, 0x5f, 0x01, 0x8b, 0x8f, 0x59, 0xc4, + 0xec, 0x0b, 0xcf, 0x07, 0x7e, 0x79, 0xc0, 0x3b, 0x66, 0x11, 0x22, 0xe2, + 0x37, 0x9f, 0x16, 0x0a, 0xe0, 0x52, 0xc7, 0xdf, 0xf0, 0xa6, 0xff, 0xfa, + 0x4e, 0x1e, 0x9e, 0x78, 0x98, 0xba, 0xfd, 0x33, 0x7e, 0xb6, 0xef, 0x7f, + 0x72, 0x34, 0x70, 0x96, 0xf6, 0x63, 0xff, 0xfe, 0x83, 0xa9, 0xc2, 0x02, + 0xf3, 0x5c, 0xb8, 0x86, 0xd7, 0x55, 0x19, 0xdd, 0x59, 0x62, 0xe8, 0x1d, + 0x92, 0xea, 0xbd, 0x55, 0x1c, 0xdd, 0x3f, 0x5e, 0xfb, 0xc9, 0xf5, 0x50, + 0x03, 0x67, 0xbf, 0xff, 0x3b, 0x8f, 0xbf, 0x3f, 0x54, 0x2a, 0x16, 0xeb, + 0xdf, 0xdd, 0xa2, 0xb5, 0xdf, 0x43, 0x18, 0x86, 0xc6, 0x43, 0xc7, 0x73, + 0xf7, 0xe1, 0x4f, 0x8d, 0xe8, 0xfb, 0xb9, 0x30, 0x58, 0x5d, 0xf6, 0x41, + 0xc9, 0xe1, 0x6f, 0x44, 0x68, 0x68, 0xd5, 0xda, 0x4b, 0xcf, 0x67, 0xd7, + 0xcd, 0x77, 0x30, 0xb6, 0xa7, 0xc2, 0xea, 0x33, 0xd5, 0xbd, 0x42, 0xe4, + 0xb3, 0xc8, 0x46, 0x2b, 0x66, 0xfb, 0xe2, 0x21, 0xf8, 0xd0, 0x47, 0x77, + 0x50, 0x5c, 0x9e, 0x67, 0x75, 0xdf, 0x15, 0x6c, 0xfc, 0xf4, 0x15, 0x58, + 0x4b, 0x36, 0x00, 0x26, 0xde, 0xfe, 0x06, 0xc5, 0xe5, 0x79, 0x3c, 0xa0, + 0x5a, 0x55, 0x8b, 0x2d, 0x7d, 0x68, 0x16, 0x10, 0xc0, 0xb5, 0x1a, 0xd2, + 0x63, 0xed, 0x50, 0x99, 0x4a, 0xc5, 0x41, 0x08, 0x02, 0x50, 0x95, 0xff, + 0xbb, 0xf6, 0xdf, 0xbb, 0x8b, 0xcb, 0x8b, 0x21, 0x74, 0x2b, 0xf1, 0xbc, + 0x91, 0x91, 0xf7, 0xff, 0xd2, 0x29, 0x45, 0xec, 0x19, 0x0f, 0xc7, 0xa9, + 0x62, 0x59, 0xa5, 0xd8, 0x38, 0x81, 0xbf, 0xe8, 0x3b, 0x2f, 0xcc, 0xa0, + 0x6e, 0x8e, 0xeb, 0x42, 0x5e, 0x43, 0xb1, 0x9b, 0x20, 0x5b, 0xad, 0x48, + 0xdb, 0x28, 0x8d, 0x55, 0xaa, 0x1d, 0x7e, 0x95, 0x27, 0x5c, 0xf2, 0x42, + 0x60, 0xe4, 0x0d, 0x05, 0x24, 0x40, 0xad, 0xb1, 0x9f, 0xef, 0x6f, 0xef, + 0xdf, 0x41, 0x1f, 0x07, 0xd8, 0xf6, 0x5b, 0x16, 0x01, 0xaf, 0xd1, 0xff, + 0x92, 0x5a, 0xa4, 0x8f, 0x79, 0xfd, 0x0f, 0xe0, 0x8f, 0xfe, 0xdb, 0x2b, + 0xf8, 0xde, 0xdf, 0xfc, 0x26, 0x88, 0xff, 0x7f, 0xe8, 0xf3, 0x7c, 0xc4, + 0x46, 0x0d, 0x78, 0xa7, 0x76, 0x3b, 0x3a, 0x8f, 0xc7, 0x13, 0xf9, 0x03, + 0x9c, 0x00, 0xfc, 0xfb, 0x3c, 0xe5, 0xed, 0xa5, 0x5f, 0x26, 0x80, 0x55, + 0xaf, 0xee, 0x02, 0xb5, 0xfa, 0x5d, 0x29, 0x59, 0x16, 0xe8, 0x5d, 0x9e, + 0x55, 0xcd, 0x17, 0x79, 0xca, 0x8f, 0xa3, 0x8f, 0xc7, 0xa3, 0xa0, 0x5a, + 0xbf, 0xd4, 0xe7, 0x8f, 0x1e, 0xa9, 0x82, 0x15, 0x8a, 0xec, 0x4d, 0x78, + 0xf9, 0x60, 0x2b, 0x16, 0x15, 0x3a, 0xa2, 0x0f, 0x3e, 0x6f, 0x2b, 0x68, + 0x55, 0x41, 0x43, 0xab, 0x9e, 0x87, 0xdb, 0x1e, 0x52, 0xe7, 0x5f, 0x7b, + 0xe8, 0x05, 0x04, 0x0e, 0x67, 0x5d, 0xaa, 0x70, 0x53, 0x07, 0x80, 0x6d, + 0x5f, 0x18, 0xe1, 0xda, 0xcf, 0x54, 0x39, 0xa1, 0xb4, 0x95, 0xbd, 0x8b, + 0x8a, 0x31, 0xdb, 0x31, 0xe8, 0x95, 0x6d, 0x33, 0xb8, 0x58, 0x01, 0xae, + 0x6e, 0x7b, 0xb2, 0xc0, 0xde, 0x59, 0xf8, 0xc0, 0xca, 0xba, 0x76, 0xff, + 0x84, 0x57, 0x2d, 0x8e, 0x02, 0xb5, 0x14, 0x98, 0x0b, 0x14, 0x54, 0xea, + 0xb6, 0x27, 0x0b, 0x7c, 0xe0, 0x8f, 0x8a, 0x4c, 0xd5, 0x81, 0xc9, 0x9f, + 0xf0, 0x81, 0xb7, 0x2e, 0x06, 0x66, 0x99, 0x9a, 0x2c, 0xb2, 0x77, 0x11, + 0x31, 0x0d, 0x2e, 0x06, 0xea, 0xb0, 0x62, 0xa5, 0x7f, 0xbf, 0x5a, 0x0c, + 0x93, 0xb3, 0x40, 0x91, 0x0f, 0x9c, 0xa8, 0x00, 0x8e, 0x8f, 0x3f, 0xa4, + 0xa8, 0x5c, 0x15, 0xd4, 0xb5, 0x18, 0x7d, 0x73, 0x1d, 0x42, 0x52, 0xd1, + 0xed, 0x00, 0x70, 0x94, 0x06, 0x78, 0x55, 0x0a, 0x45, 0x6c, 0x22, 0x70, + 0x87, 0x1c, 0x94, 0x73, 0x2a, 0x2f, 0x75, 0x3d, 0xdb, 0x98, 0x6f, 0x3d, + 0x06, 0x1e, 0x9a, 0x85, 0xc2, 0xeb, 0xb1, 0x0b, 0xb3, 0xd8, 0x4f, 0x02, + 0x85, 0x02, 0x0e, 0x20, 0xf4, 0xb3, 0xda, 0x81, 0xf0, 0x47, 0xa5, 0xdd, + 0x3b, 0x92, 0x7e, 0xbd, 0xd4, 0x3a, 0x08, 0x04, 0xdd, 0x11, 0x7a, 0x3f, + 0x30, 0x22, 0x76, 0xae, 0x7e, 0xff, 0xdb, 0x3a, 0xc2, 0x37, 0xdc, 0xf8, + 0x7d, 0xb6, 0x7e, 0xbc, 0xd3, 0xbf, 0x9b, 0x46, 0xf7, 0x54, 0xa9, 0xd4, + 0x3c, 0xb6, 0x7c, 0x76, 0x35, 0x76, 0x53, 0xb0, 0xf2, 0xcf, 0x60, 0xec, + 0x2f, 0x55, 0x27, 0xae, 0xdc, 0x6f, 0x50, 0xa9, 0x79, 0x5c, 0x75, 0xd1, + 0x10, 0x50, 0x64, 0x6b, 0x30, 0x7c, 0x52, 0xe5, 0x96, 0xaf, 0xa8, 0x1e, + 0x64, 0x45, 0x8f, 0xbd, 0xae, 0x3f, 0x33, 0xcf, 0xae, 0x6a, 0xdc, 0x66, + 0xb9, 0xdf, 0x08, 0xe0, 0x59, 0xbe, 0x9c, 0x7a, 0x03, 0x1e, 0x75, 0xd9, + 0xf0, 0xe1, 0x35, 0xda, 0xc7, 0xb7, 0xdb, 0x69, 0x33, 0xaa, 0x5d, 0x3f, + 0xd4, 0xc0, 0x95, 0x0b, 0xbd, 0x00, 0xa8, 0x55, 0x6e, 0x7e, 0x95, 0x4a, + 0x4e, 0xf5, 0x47, 0x45, 0x46, 0x81, 0x4d, 0xb6, 0x7d, 0xd9, 0xa1, 0x7c, + 0x4a, 0x78, 0xb7, 0x2d, 0x9f, 0x22, 0x18, 0xbf, 0x47, 0xd9, 0x5b, 0x35, + 0x98, 0x67, 0x62, 0x6f, 0xd8, 0xdf, 0xaa, 0xf6, 0x43, 0xf9, 0x14, 0x83, + 0xca, 0xdd, 0x1e, 0x76, 0xdd, 0xbf, 0x53, 0xc7, 0x55, 0x2c, 0x1c, 0xec, + 0x53, 0x5b, 0x41, 0xb4, 0x00, 0xaa, 0xb5, 0xdd, 0x90, 0x01, 0x23, 0x63, + 0x05, 0x96, 0x43, 0xa0, 0xd6, 0xb0, 0x3e, 0x1a, 0x78, 0x52, 0x01, 0xb5, + 0x36, 0xbd, 0xab, 0x04, 0x19, 0xd8, 0xf2, 0xcd, 0x6b, 0x55, 0x58, 0xc6, + 0x22, 0x5f, 0xb0, 0xf0, 0x5c, 0x0f, 0x43, 0x14, 0x29, 0x9a, 0x25, 0x2a, + 0xb5, 0x31, 0x8c, 0xdc, 0x7a, 0x8c, 0x8c, 0x09, 0xb9, 0xf5, 0x3a, 0x9e, + 0x89, 0x07, 0x14, 0xfb, 0xca, 0x54, 0xa6, 0x77, 0x50, 0x1e, 0xd0, 0xfe, + 0xb9, 0x61, 0xa4, 0x1c, 0x23, 0x6f, 0x5a, 0x78, 0x33, 0x2e, 0x42, 0x14, + 0x03, 0xb7, 0x0f, 0xd1, 0xf2, 0x81, 0x5a, 0x49, 0x38, 0x17, 0x6d, 0x81, + 0x25, 0xc0, 0x91, 0x60, 0x09, 0x05, 0xd4, 0xf2, 0xaf, 0x3b, 0xaf, 0x0d, + 0x1e, 0x0a, 0xf6, 0x62, 0x65, 0x54, 0xd8, 0xc1, 0xb5, 0x52, 0x03, 0x68, + 0x51, 0x32, 0x46, 0xd9, 0x31, 0xa5, 0xda, 0xc3, 0x7f, 0x1e, 0x97, 0x06, + 0x2e, 0xd7, 0x90, 0xab, 0x22, 0xc5, 0xbe, 0x32, 0xf6, 0x4c, 0x05, 0x7b, + 0xa6, 0x12, 0x00, 0xc0, 0x2a, 0x53, 0xd7, 0x01, 0x50, 0x5e, 0x71, 0x15, + 0xc5, 0xbe, 0x32, 0xd5, 0xe9, 0x1d, 0x18, 0xb9, 0xe1, 0x20, 0x5c, 0xd5, + 0xdb, 0x07, 0x6b, 0x39, 0x91, 0xfa, 0x6a, 0x08, 0x59, 0xe2, 0x88, 0xdf, + 0x6e, 0xb5, 0x09, 0xfd, 0xf7, 0x30, 0xf1, 0x16, 0xd0, 0xc9, 0xed, 0xef, + 0xe1, 0x86, 0x10, 0x94, 0x55, 0x9b, 0x27, 0x5e, 0xd4, 0xcf, 0x4f, 0xf3, + 0xa7, 0x67, 0xc1, 0xfd, 0x35, 0xf5, 0x0f, 0xe0, 0x6b, 0x35, 0x98, 0x3e, + 0x6c, 0xf2, 0x53, 0xa8, 0xe9, 0x69, 0x35, 0x8e, 0xb4, 0x0e, 0x18, 0x58, + 0x47, 0x7c, 0x50, 0xe9, 0x30, 0x34, 0x35, 0x00, 0x23, 0x03, 0x30, 0x32, + 0x12, 0x02, 0xbb, 0xfb, 0xce, 0x02, 0x66, 0x0e, 0xcf, 0xee, 0xc8, 0x00, + 0xac, 0xd3, 0x83, 0x5c, 0x23, 0x87, 0x33, 0xd8, 0x76, 0x38, 0xea, 0x06, + 0xce, 0xf2, 0xfd, 0x7b, 0xc5, 0x47, 0x6f, 0xda, 0x92, 0xb8, 0xe7, 0x27, + 0xa1, 0xb6, 0x51, 0x1b, 0xd1, 0xb1, 0xdf, 0x5e, 0x0a, 0x36, 0x8c, 0xa9, + 0x39, 0xc8, 0xfe, 0x38, 0x30, 0x51, 0x4c, 0xdb, 0xbd, 0xcb, 0x1a, 0xe4, + 0x2f, 0x3a, 0xbe, 0x23, 0x4a, 0x29, 0x31, 0x6a, 0x5d, 0xc6, 0x80, 0xce, + 0x59, 0x8d, 0xdb, 0x70, 0x10, 0xf9, 0x3c, 0xc6, 0x9e, 0x70, 0x1c, 0x41, + 0xca, 0xe8, 0x0f, 0x3e, 0x0e, 0xd6, 0x42, 0xb4, 0x82, 0x7a, 0x1a, 0x05, + 0x83, 0x6c, 0x26, 0x4f, 0x75, 0xc6, 0x85, 0x76, 0x8b, 0x55, 0x7f, 0xbf, + 0x89, 0xec, 0x5f, 0x6f, 0xc3, 0x99, 0xa9, 0x20, 0x85, 0xa1, 0x92, 0x16, + 0xf2, 0x08, 0xe1, 0x75, 0x42, 0xb2, 0xf4, 0xcb, 0x66, 0x37, 0x78, 0xd6, + 0x4b, 0x09, 0xd4, 0x92, 0x19, 0xa8, 0xb5, 0x05, 0x79, 0x01, 0x45, 0x4b, + 0x30, 0x61, 0x7b, 0xb1, 0xf7, 0xde, 0x55, 0x05, 0x05, 0xb4, 0x92, 0x28, + 0x4f, 0x7f, 0xe8, 0xa4, 0x28, 0x25, 0x95, 0x00, 0xfa, 0x12, 0x1f, 0xa3, + 0x08, 0xcb, 0x0d, 0x65, 0x13, 0x2a, 0x6e, 0xdc, 0xaf, 0xa8, 0xad, 0xdb, + 0x08, 0x1c, 0x21, 0xc8, 0xb7, 0x05, 0x25, 0xa1, 0xfa, 0x25, 0xab, 0x11, + 0x8c, 0x21, 0xd1, 0xff, 0x01, 0xb0, 0xba, 0x5f, 0x30, 0xe1, 0xc6, 0x61, + 0xa2, 0x76, 0x06, 0x8a, 0x6d, 0x75, 0x04, 0x28, 0x65, 0x3a, 0xc1, 0x5a, + 0xa5, 0x9c, 0x02, 0x5b, 0xb5, 0xf4, 0x77, 0x85, 0x89, 0xa6, 0x2a, 0xa5, + 0x95, 0x01, 0x5b, 0x53, 0xbe, 0xd4, 0xf5, 0x95, 0x05, 0x5a, 0xc8, 0x76, + 0x2b, 0x76, 0x3d, 0xad, 0xcc, 0x80, 0x93, 0x11, 0x34, 0x22, 0xd7, 0xd7, + 0x4a, 0x80, 0x4c, 0x98, 0xbf, 0x20, 0x4f, 0x39, 0x07, 0x95, 0x66, 0x83, + 0x72, 0x2e, 0x4f, 0xa5, 0x19, 0x3e, 0x6f, 0x5b, 0x12, 0x8a, 0x66, 0x1e, + 0xd7, 0x6b, 0xc4, 0xae, 0xd1, 0x6a, 0x53, 0xbd, 0xc1, 0xda, 0x19, 0x55, + 0x9e, 0xb2, 0x1e, 0xca, 0x29, 0xe6, 0x14, 0x60, 0xcb, 0x6f, 0x49, 0x2b, + 0xa3, 0x40, 0x5b, 0x41, 0x0b, 0xeb, 0x00, 0x1f, 0xa6, 0xe5, 0xb7, 0x6f, + 0xd5, 0xa3, 0x03, 0xbe, 0x3c, 0x97, 0x9e, 0x39, 0x79, 0x92, 0xd7, 0x3c, + 0x16, 0x87, 0x43, 0x55, 0xc5, 0x24, 0x25, 0x0d, 0x93, 0xfa, 0xed, 0xa9, + 0xbf, 0x39, 0x6c, 0xa8, 0x56, 0x2f, 0x00, 0xd5, 0x19, 0xab, 0xcb, 0x38, + 0xfb, 0x55, 0x1f, 0xd8, 0x89, 0x8c, 0x15, 0x59, 0x91, 0x71, 0xa4, 0x27, + 0x9f, 0xd8, 0x87, 0xb5, 0xa4, 0xc0, 0xb3, 0x07, 0x38, 0x6c, 0xf5, 0x02, + 0x6a, 0x8d, 0x8a, 0x49, 0x4e, 0x3a, 0x36, 0x04, 0x6b, 0x25, 0xe1, 0x5b, + 0xa3, 0x62, 0x92, 0xb7, 0x9c, 0x14, 0x7f, 0x77, 0xca, 0x66, 0x7a, 0x83, + 0xb8, 0xba, 0xb5, 0xe9, 0xc1, 0xea, 0xb1, 0xdf, 0x4c, 0x72, 0xc2, 0xd1, + 0xc7, 0xf0, 0xa5, 0x4f, 0xf9, 0xa0, 0xad, 0xe5, 0x9c, 0xfc, 0x0a, 0xe5, + 0xef, 0x6b, 0xd6, 0x79, 0x86, 0x67, 0x9e, 0x9b, 0x85, 0xe3, 0x17, 0x48, + 0xf3, 0x8d, 0xc8, 0x76, 0x3d, 0xcc, 0x82, 0x41, 0xbe, 0x60, 0x76, 0x6c, + 0x66, 0x24, 0xb2, 0x02, 0x39, 0xa3, 0x36, 0x9a, 0x98, 0x68, 0x4f, 0x32, + 0x71, 0xe7, 0x24, 0xc2, 0x10, 0x6c, 0xbf, 0xfb, 0x16, 0x36, 0x5c, 0xb8, + 0x1a, 0x90, 0x94, 0x96, 0xaf, 0x02, 0x60, 0xdb, 0xed, 0x5b, 0x11, 0x86, + 0x60, 0xf8, 0x94, 0x22, 0x4e, 0x64, 0x73, 0x8a, 0xbc, 0xbe, 0x3e, 0x3d, + 0xd7, 0xa6, 0x81, 0x49, 0x91, 0x22, 0x14, 0xc2, 0x7b, 0x70, 0xb6, 0xa0, + 0xbe, 0x7d, 0x47, 0xc1, 0x5a, 0xbb, 0xee, 0x51, 0xe9, 0xd7, 0x9e, 0x33, + 0x8c, 0xbb, 0xdf, 0xc5, 0xdd, 0xef, 0x82, 0xc8, 0x43, 0x5b, 0x2a, 0xe0, + 0x70, 0xae, 0x18, 0xce, 0x25, 0x98, 0x95, 0x8c, 0x3e, 0x38, 0x4a, 0x7f, + 0xa1, 0x3f, 0x56, 0xf6, 0xac, 0xc8, 0x06, 0x10, 0x2d, 0x1f, 0x84, 0xd5, + 0x4d, 0x02, 0x83, 0x16, 0x1e, 0x79, 0x4b, 0xd0, 0xd0, 0xc4, 0x54, 0xe9, + 0x39, 0x64, 0xf5, 0x77, 0xd5, 0x86, 0xe7, 0x60, 0xf6, 0x59, 0xe4, 0x2d, + 0x11, 0x40, 0xb0, 0xf2, 0x96, 0x40, 0x36, 0xa0, 0xe1, 0x48, 0xac, 0x65, + 0x82, 0xb1, 0x1f, 0x8e, 0x23, 0x32, 0x61, 0x1e, 0x7e, 0x5c, 0xa9, 0xe7, + 0x1b, 0xe4, 0xf5, 0x78, 0x67, 0xde, 0x12, 0xc8, 0xfd, 0x7a, 0xa3, 0xbd, + 0x36, 0x0a, 0x08, 0xd6, 0x52, 0x73, 0x44, 0x5c, 0x17, 0x6c, 0xcf, 0x26, + 0x4b, 0x11, 0x90, 0x64, 0x33, 0xea, 0x3c, 0x56, 0x56, 0x91, 0x05, 0x29, + 0x11, 0xa2, 0xd7, 0x56, 0x67, 0x4a, 0xd6, 0x39, 0x45, 0x05, 0x1f, 0x4b, + 0x4a, 0x83, 0x9c, 0x9c, 0x7b, 0x6c, 0x58, 0x26, 0x3a, 0xc3, 0x7c, 0xbf, + 0x65, 0x02, 0x6b, 0x85, 0x15, 0x87, 0x6b, 0xf9, 0x7e, 0x53, 0x4e, 0xd7, + 0x30, 0x65, 0xb8, 0x33, 0xcb, 0xa1, 0xb7, 0x9f, 0x1a, 0x1c, 0xc7, 0xbf, + 0xfb, 0x63, 0xfa, 0xcc, 0x78, 0x47, 0xeb, 0x5f, 0xbe, 0xf5, 0x3d, 0x38, + 0x43, 0xc4, 0x21, 0x53, 0xbe, 0x3d, 0xed, 0x17, 0x80, 0xbe, 0x96, 0x89, + 0xb0, 0x9c, 0x09, 0x28, 0x55, 0x34, 0xce, 0x77, 0xf7, 0xec, 0xe6, 0x31, + 0xab, 0xd2, 0xbb, 0x2e, 0x7e, 0x1e, 0x3d, 0x6c, 0x75, 0xc4, 0xe9, 0x75, + 0x9e, 0xd0, 0x42, 0x60, 0x65, 0x4b, 0x7e, 0xd6, 0x09, 0xbf, 0x7f, 0x16, + 0x9b, 0xe3, 0x16, 0x2d, 0x55, 0xee, 0x14, 0xa6, 0x95, 0x2a, 0x55, 0xaa, + 0x54, 0xa9, 0x52, 0xa5, 0x4a, 0x95, 0x2a, 0x55, 0xaa, 0x54, 0xa9, 0x52, + 0xa5, 0x4a, 0x95, 0x2a, 0x55, 0xaa, 0x54, 0xa9, 0x52, 0xa5, 0x4a, 0x95, + 0x2a, 0x55, 0xaa, 0x54, 0x47, 0x54, 0x2f, 0xa3, 0x65, 0x8c, 0xa9, 0x52, + 0xa5, 0x4a, 0x95, 0x2a, 0x55, 0xaa, 0xa4, 0x44, 0x46, 0xe0, 0x79, 0x1e, + 0x5e, 0xd3, 0xa3, 0xbf, 0xaf, 0x3f, 0x80, 0x6a, 0x45, 0x41, 0x53, 0xb2, + 0x2d, 0xb1, 0xfa, 0x2c, 0x3c, 0x2f, 0xbe, 0xb8, 0xc5, 0x07, 0x43, 0xf9, + 0x10, 0xac, 0x24, 0x58, 0xca, 0xec, 0x33, 0x69, 0xd4, 0x43, 0x88, 0x96, + 0xd3, 0x74, 0x02, 0x20, 0x89, 0xd3, 0x74, 0xba, 0x1e, 0x93, 0xea, 0x16, + 0x2e, 0x72, 0x02, 0xab, 0xcf, 0xa2, 0x3a, 0x5d, 0xed, 0x9a, 0xa6, 0x97, + 0xaa, 0x8f, 0x56, 0x83, 0xf2, 0xf9, 0x65, 0x8f, 0x02, 0x8d, 0xa2, 0xb0, + 0x2c, 0xd7, 0x75, 0x71, 0x5d, 0x37, 0x80, 0x60, 0xc9, 0xb6, 0xd4, 0x93, + 0xb5, 0x15, 0x6e, 0xc9, 0x07, 0x62, 0x45, 0xe1, 0x58, 0x46, 0xce, 0x08, + 0x77, 0x6d, 0x8e, 0xd8, 0xb5, 0xa7, 0xed, 0xc0, 0xdf, 0x9e, 0x56, 0x6d, + 0x65, 0x18, 0x2a, 0xae, 0x9f, 0x67, 0xa3, 0x19, 0x5f, 0xc4, 0xed, 0xe9, + 0x9d, 0x90, 0x5d, 0x57, 0xed, 0x16, 0xed, 0xdb, 0x13, 0x42, 0x74, 0x59, + 0x62, 0x74, 0x70, 0x92, 0x32, 0x5c, 0xca, 0x2b, 0x89, 0x60, 0x72, 0x44, + 0x38, 0xe9, 0x39, 0xea, 0x27, 0xa4, 0x42, 0x6c, 0xc9, 0xb6, 0x44, 0x9a, + 0x06, 0x46, 0xdd, 0x83, 0xa6, 0x54, 0x70, 0x2d, 0xd3, 0x20, 0xb6, 0x45, + 0xb4, 0xeb, 0x41, 0x5b, 0xef, 0xc0, 0xdc, 0xaf, 0x26, 0xeb, 0x39, 0x4b, + 0x04, 0xd8, 0x61, 0xa9, 0xb3, 0xcb, 0xf5, 0x24, 0x3e, 0x47, 0xe7, 0x64, + 0x19, 0x88, 0xf1, 0x30, 0xbc, 0xf1, 0x66, 0x83, 0x06, 0xb0, 0xea, 0x89, + 0x06, 0x8e, 0x9e, 0x78, 0xee, 0x0c, 0x19, 0xb0, 0x3f, 0x02, 0xf4, 0x59, + 0x22, 0xf4, 0xb9, 0xce, 0xd7, 0x12, 0xb0, 0xdb, 0x65, 0xe3, 0xee, 0x2b, + 0x3b, 0xea, 0x1b, 0x05, 0x5e, 0xb1, 0xc6, 0x54, 0xfb, 0x3d, 0xb7, 0x89, + 0xa7, 0x5f, 0x12, 0xfe, 0xbd, 0x5a, 0xfb, 0x25, 0xd6, 0x8c, 0xa4, 0x31, + 0x64, 0x90, 0xaf, 0x78, 0x34, 0xca, 0x06, 0xec, 0x57, 0xc5, 0x5d, 0x8b, + 0x02, 0x6b, 0x01, 0x4c, 0xb4, 0x1b, 0xd0, 0x94, 0xb0, 0xbc, 0xa5, 0x16, + 0xa9, 0x9c, 0xa9, 0x97, 0xc0, 0xee, 0x71, 0xd9, 0xf8, 0x51, 0x5d, 0x8e, + 0x3e, 0x7f, 0xb7, 0x6a, 0x89, 0xb5, 0x8f, 0x60, 0x02, 0xa4, 0xf4, 0xf4, + 0x6f, 0x4c, 0xf8, 0x3b, 0x86, 0x87, 0x45, 0x6c, 0xf4, 0xfb, 0xc0, 0x32, + 0xc2, 0x55, 0x3d, 0x3d, 0x24, 0x84, 0x89, 0x94, 0x6e, 0x70, 0xf4, 0xe5, + 0xba, 0xd5, 0x10, 0xd6, 0xe4, 0x56, 0x31, 0xcd, 0x12, 0x34, 0x55, 0xb8, + 0x91, 0x33, 0xf1, 0x9a, 0xdd, 0x29, 0x0b, 0xbd, 0xfd, 0xc3, 0x36, 0x34, + 0x72, 0xc5, 0x8e, 0xc9, 0xce, 0xbe, 0x5f, 0x32, 0x2c, 0x79, 0x9e, 0x4c, + 0x37, 0x5f, 0x5e, 0x00, 0x86, 0x69, 0x60, 0x99, 0x16, 0x86, 0x51, 0x0e, + 0x00, 0x4f, 0xa5, 0x15, 0x6a, 0xd1, 0x74, 0x4b, 0xaa, 0xb8, 0x6e, 0x2d, + 0x2c, 0x77, 0x34, 0x4f, 0x7b, 0x1a, 0x36, 0xfc, 0xc5, 0x06, 0x86, 0xcf, + 0x51, 0x8b, 0xd5, 0x26, 0xf6, 0x4e, 0x70, 0xf1, 0x9f, 0x5d, 0x0c, 0xc0, + 0xaa, 0xc1, 0x55, 0x4c, 0xec, 0x0d, 0x21, 0x27, 0x52, 0x4a, 0xf2, 0x7d, + 0x60, 0x4f, 0x75, 0x2f, 0xaf, 0x61, 0x1a, 0x94, 0x57, 0xa8, 0x32, 0x04, + 0xf7, 0x38, 0xd3, 0xa4, 0xe1, 0x35, 0x20, 0xa7, 0xe1, 0x4a, 0xae, 0x17, + 0x6b, 0x5f, 0xdf, 0x6d, 0xe4, 0x4c, 0x8a, 0x83, 0x56, 0x07, 0x04, 0xca, + 0x22, 0x5c, 0xb8, 0xee, 0xba, 0x73, 0xc3, 0x96, 0x76, 0xef, 0xd9, 0x8d, + 0x5d, 0xb3, 0x31, 0x4d, 0x93, 0x96, 0x6c, 0x29, 0x38, 0x56, 0x5b, 0x2a, + 0x58, 0x45, 0x62, 0x37, 0xe4, 0x2d, 0x9f, 0xdd, 0xc2, 0xa6, 0x8f, 0x6d, + 0x60, 0xcb, 0xe7, 0xb7, 0x92, 0x37, 0x2c, 0x5a, 0xb2, 0x11, 0xc0, 0xb4, + 0x1a, 0xf5, 0x46, 0x30, 0x41, 0xdb, 0xd7, 0xc4, 0xde, 0x09, 0x56, 0x0d, + 0xae, 0xa2, 0x5a, 0xd5, 0x8b, 0x24, 0xf5, 0x8a, 0x76, 0xbf, 0xbd, 0xc7, + 0xc6, 0xc7, 0xba, 0xc2, 0xb8, 0xaa, 0x53, 0x55, 0x0d, 0x90, 0x52, 0xf7, + 0xf8, 0x46, 0xb3, 0xa1, 0xef, 0x65, 0x82, 0xab, 0x3e, 0xbd, 0x21, 0x88, + 0x77, 0xdd, 0xff, 0xb3, 0x25, 0x96, 0x6e, 0xd7, 0x83, 0x63, 0x38, 0x8e, + 0x0d, 0x1c, 0xda, 0xee, 0xf6, 0xbd, 0xd2, 0xf8, 0x20, 0x2d, 0x3f, 0xbc, + 0x57, 0x3c, 0x3b, 0xb2, 0x58, 0xc9, 0x28, 0x84, 0x4b, 0xd7, 0xaf, 0xfa, + 0xf4, 0x26, 0x00, 0xde, 0xf5, 0x9e, 0x77, 0x75, 0xb5, 0x3b, 0x5f, 0xfe, + 0x7e, 0x5b, 0x44, 0x55, 0x79, 0xb8, 0x82, 0xb5, 0xce, 0xe2, 0x43, 0x1f, + 0xdd, 0xc8, 0x0d, 0x7f, 0x77, 0x2d, 0x5b, 0xab, 0x5b, 0xbb, 0xa6, 0x8d, + 0x4a, 0x01, 0xae, 0xc2, 0xe3, 0xe1, 0xca, 0xb7, 0x31, 0x97, 0xbd, 0xd0, + 0xff, 0x5c, 0x3e, 0xfe, 0xf1, 0xbb, 0x83, 0xb3, 0xc3, 0x85, 0x69, 0xf9, + 0xfe, 0x37, 0xf6, 0x80, 0x6c, 0x45, 0x75, 0x30, 0xf5, 0x5e, 0x48, 0x9d, + 0xba, 0xd9, 0x5e, 0xa8, 0x0e, 0x26, 0xfe, 0x91, 0xf8, 0x1b, 0xc9, 0x4d, + 0x27, 0x73, 0xde, 0x96, 0xc7, 0x90, 0x9b, 0x4e, 0x06, 0xe0, 0xbe, 0x89, + 0xc7, 0x90, 0x7f, 0x79, 0xf2, 0x11, 0xb0, 0x9c, 0xea, 0x7f, 0x35, 0x19, + 0x6f, 0x58, 0x8b, 0x17, 0x59, 0x08, 0x74, 0xa8, 0xf2, 0x66, 0x46, 0x59, + 0x73, 0x1a, 0x64, 0x23, 0xeb, 0x3c, 0xcd, 0x42, 0x1c, 0x38, 0x32, 0xbe, + 0xbb, 0x4a, 0x71, 0x3e, 0x26, 0xa4, 0x30, 0xe9, 0xb6, 0xb8, 0xfd, 0x48, + 0xc9, 0x7b, 0xf8, 0x8e, 0x85, 0x81, 0xb2, 0x7e, 0xf2, 0x1d, 0xae, 0x07, + 0xae, 0x04, 0xd8, 0x1d, 0x81, 0xd6, 0xc8, 0x16, 0xd4, 0x5d, 0xb8, 0xfe, + 0x77, 0x00, 0xda, 0x5a, 0xa0, 0xae, 0xbd, 0x35, 0xdb, 0x23, 0xa4, 0x04, + 0xff, 0x3c, 0x77, 0xda, 0xcd, 0x91, 0xb6, 0xfe, 0xce, 0x17, 0x54, 0x3d, + 0x9d, 0x08, 0x70, 0xea, 0x82, 0xf7, 0x9c, 0x7f, 0xb8, 0xc5, 0x7b, 0xc9, + 0x15, 0x05, 0x6a, 0x85, 0x7e, 0x22, 0xb6, 0x10, 0x55, 0x98, 0x09, 0x78, + 0xa5, 0x29, 0x90, 0x51, 0xa0, 0x55, 0x8e, 0x4e, 0x25, 0xa0, 0x58, 0x22, + 0x02, 0xc4, 0x0a, 0x5a, 0xc8, 0xc8, 0x87, 0x97, 0x6b, 0x2f, 0x1b, 0xf3, + 0xa6, 0x3f, 0x34, 0xb0, 0x56, 0x1c, 0x3b, 0xda, 0x79, 0xbe, 0x10, 0x25, + 0xe3, 0xde, 0x7b, 0xef, 0xbd, 0xbc, 0xe3, 0x1d, 0xef, 0x60, 0xcf, 0xf7, + 0xc6, 0x78, 0xcb, 0xe9, 0xab, 0x98, 0xbc, 0xf7, 0xde, 0x58, 0x7e, 0x2f, + 0x05, 0x58, 0xeb, 0xd7, 0xc0, 0x32, 0x60, 0xe0, 0x94, 0xd7, 0x31, 0xf5, + 0xb8, 0x43, 0xf3, 0xc0, 0x01, 0x66, 0x5f, 0x78, 0x9e, 0x3c, 0x70, 0xda, + 0x29, 0xaf, 0x63, 0xf7, 0xc4, 0x4f, 0xbb, 0xc2, 0x85, 0x92, 0x4a, 0xd6, + 0x25, 0xd9, 0x2e, 0x51, 0x49, 0xe0, 0xad, 0xff, 0xf5, 0xdc, 0xe0, 0x7c, + 0xa0, 0x7c, 0x2a, 0xd3, 0xd3, 0xd3, 0x9c, 0xf6, 0xb6, 0x73, 0x00, 0x38, + 0x6d, 0xd5, 0x69, 0x3c, 0xf4, 0x3f, 0xee, 0xee, 0x92, 0x72, 0x7e, 0x1d, + 0x89, 0xbf, 0x0b, 0xc0, 0xae, 0xa1, 0x32, 0x5f, 0x7d, 0x9f, 0x05, 0x14, + 0xe1, 0x42, 0x68, 0x08, 0x41, 0x65, 0xa7, 0x82, 0x13, 0x6e, 0xf9, 0x93, + 0xed, 0x0c, 0xff, 0x99, 0xba, 0x99, 0x16, 0x97, 0xe9, 0x77, 0x90, 0x3d, + 0x3b, 0xf0, 0x3c, 0xf5, 0x1b, 0xfe, 0xc2, 0x97, 0xab, 0x64, 0x97, 0x18, + 0xf0, 0x02, 0x6c, 0xf8, 0xf4, 0xe5, 0x38, 0xc0, 0xf8, 0x38, 0x0c, 0xad, + 0x11, 0x8c, 0xef, 0x81, 0xa1, 0x33, 0xa1, 0x94, 0x11, 0xdc, 0xb4, 0x5b, + 0x72, 0xd9, 0x1a, 0x55, 0xb2, 0xed, 0x7b, 0x60, 0x8d, 0x66, 0x9d, 0x14, + 0xdb, 0x7a, 0x71, 0x26, 0x21, 0xb4, 0x66, 0xd7, 0x1e, 0xb8, 0xfc, 0xd2, + 0xf3, 0xb9, 0xfc, 0xd2, 0xf3, 0xd9, 0xb6, 0x47, 0xf9, 0xdd, 0xf0, 0x61, + 0xc1, 0x36, 0xc5, 0x07, 0x66, 0xed, 0x1a, 0xd8, 0xb5, 0x1b, 0xf2, 0x06, + 0xac, 0xbd, 0x74, 0x0d, 0xdb, 0x3e, 0x72, 0x1d, 0xc5, 0x33, 0x46, 0x19, + 0x3e, 0xa7, 0x0c, 0x8c, 0xe1, 0xec, 0xaf, 0x02, 0x06, 0x42, 0x18, 0xd8, + 0x76, 0x95, 0xe1, 0x0f, 0xaf, 0x67, 0xf3, 0x35, 0x55, 0x8a, 0xfd, 0x97, + 0x23, 0x06, 0x54, 0x19, 0x2e, 0x5f, 0x03, 0xdb, 0x76, 0xc3, 0xb6, 0x4b, + 0xcf, 0xc7, 0x11, 0x22, 0xa0, 0x4e, 0x6c, 0xd6, 0xfe, 0x97, 0xfb, 0x2c, + 0x96, 0x88, 0xb6, 0xed, 0x06, 0x6a, 0xdb, 0x3a, 0xfc, 0x3b, 0x20, 0x5b, + 0x8d, 0x46, 0x70, 0x14, 0x11, 0x90, 0x57, 0x56, 0x80, 0xbb, 0xaf, 0x41, + 0xc3, 0xf3, 0x58, 0x7d, 0x66, 0x99, 0x5d, 0xe3, 0xe3, 0x58, 0xcb, 0xc2, + 0x7b, 0xbe, 0x82, 0xef, 0x64, 0xa9, 0x56, 0x6d, 0xca, 0xe5, 0x10, 0x3c, + 0xb8, 0x76, 0x68, 0x48, 0xd9, 0x93, 0x1e, 0xd5, 0xaa, 0x4d, 0x43, 0x4a, + 0xca, 0xcb, 0xcd, 0x08, 0x00, 0x0c, 0xe4, 0x31, 0x9d, 0xe5, 0x7d, 0x29, + 0xf4, 0xbd, 0xbf, 0xf9, 0x4d, 0x00, 0xd6, 0xf2, 0x8f, 0x2f, 0x17, 0xbd, + 0xa6, 0x07, 0xc8, 0x6a, 0xb6, 0x0b, 0xf4, 0xea, 0x77, 0xa1, 0x64, 0x79, + 0x5e, 0xd7, 0x7c, 0x31, 0x00, 0x67, 0x81, 0x82, 0x68, 0xfd, 0x12, 0x58, + 0x0d, 0x01, 0x68, 0xeb, 0x88, 0x01, 0xb5, 0x0e, 0x51, 0x0a, 0x5a, 0xa5, + 0x60, 0x56, 0x83, 0xcf, 0xdb, 0xfa, 0xbc, 0xce, 0xd7, 0xce, 0x15, 0xac, + 0xef, 0x71, 0x47, 0x7e, 0xaa, 0xba, 0x81, 0x95, 0x67, 0xee, 0x88, 0xf9, + 0xed, 0x9d, 0x0d, 0xdd, 0xaf, 0x8a, 0xac, 0x43, 0xff, 0xc0, 0x89, 0x75, + 0x6e, 0xa3, 0xc8, 0x6d, 0x3e, 0x80, 0xab, 0x50, 0xe4, 0x57, 0xc0, 0x6b, + 0x9f, 0x0f, 0xdf, 0x5f, 0x6f, 0x7b, 0x68, 0x16, 0x0a, 0xc5, 0x00, 0xfc, + 0x75, 0x9b, 0x06, 0x61, 0xb1, 0xa8, 0x08, 0xff, 0x13, 0xa8, 0x17, 0x00, + 0x9b, 0xc1, 0xe7, 0x81, 0x95, 0x3e, 0x38, 0x0b, 0xd0, 0x4c, 0xc4, 0xa9, + 0xc9, 0x28, 0x98, 0x4b, 0xc1, 0xb7, 0x56, 0x44, 0xca, 0x76, 0xd2, 0x79, + 0x6f, 0xa4, 0xf2, 0x50, 0xa4, 0x80, 0xbe, 0x0a, 0x45, 0xa8, 0xdb, 0x90, + 0x58, 0x37, 0x5f, 0xae, 0x43, 0x25, 0xc2, 0x20, 0x2b, 0x03, 0xd4, 0xfd, + 0x34, 0x00, 0x45, 0x2a, 0x1a, 0xa2, 0xe5, 0xdb, 0x9d, 0x7a, 0xd8, 0xc6, + 0x1f, 0xec, 0x5a, 0x71, 0xda, 0x1a, 0xca, 0xc0, 0x8b, 0x8b, 0xe1, 0xa8, + 0x3a, 0xdc, 0xfa, 0x88, 0xbe, 0x91, 0xe9, 0x9b, 0xce, 0x8a, 0xd3, 0x7a, + 0x83, 0xd4, 0x5f, 0xb5, 0x18, 0xde, 0xf9, 0x5f, 0x16, 0xf3, 0xec, 0x8f, + 0x7a, 0x46, 0x99, 0x53, 0x07, 0x8f, 0x6a, 0x52, 0x8a, 0x02, 0xb5, 0xae, + 0xf9, 0xfa, 0xf7, 0xb9, 0xfa, 0xfd, 0x6f, 0xe3, 0x9a, 0xaf, 0x7f, 0x9f, + 0xea, 0x17, 0x2f, 0x08, 0xfc, 0x17, 0x0a, 0xd4, 0x82, 0x10, 0x60, 0xe5, + 0x1f, 0x87, 0xce, 0x29, 0x31, 0x76, 0x7d, 0x7c, 0x6c, 0xae, 0xf2, 0x84, + 0xcb, 0xe8, 0xc3, 0xe1, 0x75, 0xd0, 0xb9, 0x8d, 0x40, 0xa7, 0xbd, 0xa4, + 0x3b, 0xaa, 0xf3, 0x81, 0xb1, 0x27, 0x54, 0x1e, 0xbe, 0xdd, 0xb9, 0x6c, + 0x46, 0x6d, 0xdd, 0x32, 0x38, 0xc1, 0x09, 0xef, 0x39, 0x41, 0xfb, 0x9e, + 0xcd, 0x90, 0x54, 0x7d, 0xbf, 0xea, 0x94, 0xb2, 0xb7, 0xba, 0xdf, 0x60, + 0x62, 0xa7, 0x4b, 0xe9, 0x4a, 0xf5, 0x6c, 0xf4, 0x81, 0x5a, 0x7e, 0x3f, + 0xac, 0x34, 0xa8, 0xee, 0xfb, 0x15, 0x0d, 0xd7, 0xaa, 0x3e, 0x22, 0x29, + 0xad, 0x31, 0xb0, 0x6f, 0xee, 0xfd, 0xce, 0x61, 0xd7, 0x25, 0x4c, 0xd9, + 0xf4, 0xbe, 0x1a, 0x42, 0x89, 0x4c, 0x9e, 0x7c, 0xc1, 0xc0, 0x71, 0x6d, + 0x05, 0x68, 0x6a, 0x37, 0xa8, 0x35, 0xb7, 0x63, 0x88, 0x35, 0x78, 0x72, + 0x77, 0x10, 0xcf, 0x93, 0xa3, 0x18, 0xe2, 0xe2, 0xe0, 0x7c, 0x78, 0x40, + 0x8d, 0x71, 0x8d, 0x4e, 0x5f, 0x0b, 0x5c, 0x8b, 0x02, 0xec, 0xae, 0xa4, + 0x51, 0xef, 0x3e, 0x56, 0xe7, 0xb5, 0x5d, 0x05, 0x87, 0x32, 0x3e, 0x1a, + 0xf8, 0x35, 0x5c, 0x87, 0xfe, 0x9c, 0x7a, 0x26, 0x19, 0x19, 0x3d, 0x26, + 0x8b, 0x45, 0x23, 0x32, 0xde, 0xe7, 0xbb, 0xa3, 0x10, 0x2a, 0xaf, 0x39, + 0x8a, 0x07, 0xf4, 0x1b, 0x97, 0x05, 0xe1, 0x96, 0x00, 0xa7, 0x2d, 0x83, + 0xa3, 0x91, 0x31, 0x14, 0x48, 0x0b, 0x05, 0xd9, 0x6a, 0xb5, 0x0d, 0xbc, + 0x36, 0x38, 0x78, 0x58, 0xc2, 0xe8, 0x81, 0x65, 0x76, 0x80, 0xf0, 0x85, + 0xd0, 0xca, 0x14, 0x81, 0x16, 0x36, 0xd1, 0xf1, 0x3d, 0x0d, 0xc4, 0x14, + 0x45, 0xa4, 0xb4, 0x63, 0x65, 0xf5, 0x55, 0xec, 0x2b, 0x53, 0x99, 0x1a, + 0xed, 0xf0, 0x6f, 0xb8, 0x0e, 0xa6, 0xae, 0x2f, 0x01, 0x24, 0x4c, 0x01, + 0xb3, 0x8c, 0xdc, 0x7a, 0xbc, 0x88, 0x3d, 0x1f, 0xa0, 0xe5, 0xc3, 0xc8, + 0xfc, 0xf3, 0xc3, 0x51, 0xbf, 0x3e, 0xde, 0x4f, 0x27, 0x1c, 0xab, 0x5f, + 0xff, 0xab, 0x11, 0x2a, 0x1a, 0x56, 0x4b, 0x84, 0xf5, 0xeb, 0xff, 0xf9, + 0x30, 0xad, 0x9a, 0x3e, 0x1e, 0x49, 0xa0, 0x96, 0xaf, 0x8d, 0xeb, 0x60, + 0x7a, 0xa7, 0xfa, 0xc7, 0xc0, 0x11, 0x61, 0x6a, 0x05, 0x5a, 0x37, 0x30, + 0xc0, 0xc0, 0xba, 0x75, 0xec, 0xfc, 0xc4, 0x08, 0x33, 0xf7, 0x73, 0xd8, + 0xc6, 0xd7, 0xed, 0x8c, 0xb8, 0x0f, 0xcf, 0xd4, 0x21, 0x4b, 0x0e, 0x58, + 0xea, 0xbd, 0x3f, 0xa3, 0xdf, 0xb3, 0xdb, 0x2d, 0xf5, 0x2e, 0xf7, 0x68, + 0xe4, 0xaa, 0xef, 0x01, 0xb3, 0x8a, 0x01, 0xb4, 0xba, 0x9c, 0x43, 0x17, + 0xd0, 0x56, 0xc2, 0xaf, 0x5b, 0x38, 0x80, 0x31, 0xe3, 0xa8, 0x3e, 0x66, + 0xbf, 0xa5, 0x66, 0x42, 0x0d, 0x96, 0x54, 0x99, 0x12, 0xb0, 0x2f, 0xd9, + 0x6f, 0x21, 0x0c, 0x75, 0x9f, 0xf4, 0x3c, 0xf5, 0xbd, 0x4f, 0x02, 0x86, + 0xde, 0x74, 0xc1, 0x98, 0x76, 0x22, 0x33, 0xa9, 0xf4, 0x5b, 0x9e, 0x00, + 0xee, 0x19, 0xc3, 0x00, 0xe4, 0x39, 0x79, 0xdc, 0xc1, 0x62, 0x00, 0x6a, + 0x01, 0x30, 0x1f, 0x9c, 0x44, 0x22, 0x31, 0x82, 0x4d, 0x59, 0x44, 0x98, + 0x3c, 0x3c, 0x20, 0x69, 0x60, 0x7e, 0xe5, 0x0e, 0xdc, 0x4b, 0x87, 0x19, + 0xbd, 0xf8, 0x43, 0x48, 0x29, 0x31, 0xcd, 0x7e, 0x3c, 0x4f, 0xdd, 0xaf, + 0x65, 0xe4, 0x7b, 0x64, 0x74, 0xec, 0x5b, 0x7a, 0x3e, 0xd0, 0xf7, 0xd0, + 0xc6, 0xed, 0x0f, 0x55, 0xfd, 0x6d, 0xf5, 0xbb, 0x34, 0x81, 0xea, 0x7e, + 0x49, 0x36, 0x27, 0x30, 0x25, 0xe4, 0x0d, 0xc9, 0x44, 0x5d, 0x01, 0xb5, + 0x7c, 0xb0, 0x56, 0x94, 0x96, 0xec, 0x49, 0x41, 0x1e, 0x68, 0xe8, 0xed, + 0x77, 0x86, 0x0c, 0x05, 0x84, 0x4a, 0xaa, 0xe2, 0xc6, 0xbf, 0x7f, 0x82, + 0x82, 0x69, 0x45, 0xb1, 0xc7, 0x86, 0xff, 0xa9, 0x51, 0x7f, 0xc3, 0xc9, + 0x67, 0x0c, 0x9c, 0xc8, 0xb5, 0xd5, 0xa8, 0x07, 0xd9, 0xaa, 0xf4, 0x6d, + 0x05, 0xaa, 0x89, 0xfe, 0xdd, 0xab, 0x12, 0xf2, 0x7a, 0x33, 0x9f, 0x62, + 0x46, 0xe0, 0x0a, 0x98, 0x70, 0x25, 0x79, 0x04, 0x3e, 0x02, 0xb9, 0x98, + 0x11, 0x54, 0x9b, 0x12, 0x47, 0x28, 0x28, 0x98, 0x61, 0x08, 0xc6, 0xeb, + 0x12, 0x32, 0x50, 0x6c, 0x67, 0xb1, 0x33, 0xad, 0xd8, 0x75, 0x67, 0x67, + 0xa0, 0xd5, 0x56, 0xd0, 0x1b, 0xff, 0xdb, 0xa6, 0xf2, 0x53, 0x6e, 0x43, + 0x8f, 0x6f, 0xd8, 0x1a, 0xa8, 0xb5, 0xe1, 0xc6, 0xaf, 0xf2, 0xa1, 0xcb, + 0xce, 0x57, 0xd7, 0x96, 0xb6, 0x93, 0xad, 0x37, 0xd4, 0x79, 0x46, 0x20, + 0x32, 0x60, 0x47, 0xfe, 0xe6, 0x65, 0x43, 0x01, 0xb1, 0xaa, 0x91, 0x31, + 0x97, 0x92, 0x6e, 0x1f, 0x24, 0x38, 0x22, 0xfc, 0xfc, 0x0b, 0x1a, 0x48, + 0x96, 0x03, 0x9a, 0xaa, 0xec, 0x55, 0xdd, 0xbe, 0x45, 0xa4, 0x4a, 0x33, + 0x8f, 0x9e, 0x39, 0x79, 0x92, 0x63, 0x33, 0x47, 0x71, 0x2c, 0x47, 0xf1, + 0xcc, 0xc9, 0x93, 0xb8, 0xbf, 0x26, 0x00, 0x44, 0xbd, 0xe6, 0xb8, 0xc5, + 0xc1, 0x45, 0x3c, 0xeb, 0x3c, 0xc3, 0xf1, 0x2c, 0x9b, 0xd7, 0x5e, 0x2f, + 0xd5, 0x4f, 0xad, 0x82, 0x54, 0x00, 0xaa, 0xe3, 0x8f, 0xa5, 0x2b, 0x5c, + 0x2b, 0x0a, 0xd1, 0x8a, 0xc2, 0xb5, 0x9e, 0x7c, 0xa2, 0x3b, 0xb4, 0x75, + 0xa2, 0x38, 0x19, 0x3b, 0xef, 0x06, 0xb6, 0xea, 0xa5, 0x28, 0x30, 0xeb, + 0xc9, 0x93, 0x26, 0x79, 0xfc, 0x67, 0xf0, 0x83, 0xe5, 0x83, 0x00, 0xbc, + 0xe7, 0xc0, 0x5e, 0x26, 0x8a, 0x93, 0x98, 0xc0, 0x04, 0x93, 0x98, 0xaf, + 0x54, 0xc0, 0xdf, 0x24, 0x50, 0x0b, 0xe0, 0xd8, 0xcc, 0x51, 0xbc, 0xf6, + 0xb8, 0x78, 0x59, 0xcc, 0x57, 0xd2, 0xb3, 0x4d, 0x0f, 0x56, 0x27, 0xbf, + 0x62, 0x25, 0x4f, 0xfd, 0xb6, 0xbb, 0x7f, 0xfd, 0xd4, 0x2a, 0xcf, 0xca, + 0x17, 0x59, 0x71, 0xe2, 0x9b, 0x59, 0xfc, 0xf4, 0xd3, 0x7c, 0xc7, 0xed, + 0xf2, 0xde, 0xd0, 0x4b, 0x89, 0x7b, 0xb5, 0x10, 0xf1, 0xf1, 0x53, 0x1f, + 0x84, 0x38, 0xf6, 0x43, 0x75, 0x7f, 0x94, 0x9e, 0xa4, 0xd4, 0x57, 0xa4, + 0xa2, 0xbf, 0xe5, 0xf9, 0xfe, 0xbe, 0x8a, 0x19, 0x03, 0x72, 0x06, 0x63, + 0x3f, 0x74, 0xa8, 0xce, 0xd8, 0x94, 0xfa, 0x3a, 0x7b, 0x8a, 0xa5, 0x37, + 0x9b, 0xd8, 0xae, 0x1d, 0x80, 0xb5, 0x00, 0x5a, 0xf5, 0x56, 0x57, 0xb0, + 0xd6, 0x1d, 0x77, 0xde, 0xc1, 0x1d, 0x77, 0x7e, 0x07, 0x7b, 0x5f, 0x8d, + 0x6c, 0x0e, 0xac, 0x8c, 0xc0, 0x6b, 0x4b, 0xa0, 0x81, 0xc8, 0x17, 0x91, + 0x0d, 0x41, 0x2b, 0x72, 0x03, 0xa9, 0xd5, 0x6b, 0x80, 0x02, 0xb4, 0x26, + 0x15, 0x05, 0x6a, 0x25, 0x01, 0x5b, 0x8d, 0xa6, 0x47, 0x36, 0xa7, 0xe0, + 0x5c, 0x7e, 0x58, 0xde, 0xc8, 0x43, 0x1b, 0x1a, 0xcd, 0xf0, 0x99, 0xe0, + 0x03, 0xb5, 0x5a, 0x1a, 0xc8, 0x97, 0xd5, 0x3f, 0x42, 0x1f, 0xc4, 0x15, + 0x95, 0x1f, 0xd7, 0x14, 0x26, 0x5e, 0xdb, 0xa3, 0xe5, 0x41, 0xb6, 0x0f, + 0xe4, 0xfe, 0x48, 0x5c, 0x89, 0x7a, 0x06, 0xe9, 0xfb, 0x5b, 0x4b, 0xc6, + 0xa1, 0xec, 0x08, 0x30, 0x0c, 0x13, 0x07, 0x07, 0xc7, 0x75, 0x30, 0x72, + 0x46, 0x70, 0xff, 0x98, 0x4f, 0xce, 0x3d, 0x36, 0x72, 0x46, 0x22, 0xfa, + 0x44, 0x70, 0xec, 0x90, 0x0f, 0x87, 0x4a, 0xc0, 0xa5, 0xec, 0xf1, 0x2a, + 0xa2, 0x4f, 0xe0, 0x44, 0x09, 0x59, 0xc9, 0xb0, 0x7d, 0x76, 0x77, 0x5b, + 0xc0, 0x53, 0x4f, 0xec, 0xe3, 0x84, 0xe5, 0xcb, 0x98, 0x71, 0x3b, 0xbf, + 0xd2, 0xf9, 0x60, 0xad, 0x9e, 0x65, 0x89, 0x9c, 0x5b, 0xe7, 0x14, 0x83, + 0x32, 0x04, 0xa0, 0xaa, 0x28, 0x04, 0x2b, 0x71, 0xf4, 0x81, 0x5a, 0xef, + 0x6a, 0xbc, 0x93, 0x0b, 0x37, 0xab, 0xf1, 0xfa, 0xdb, 0xff, 0xed, 0x0e, + 0xbe, 0xbd, 0xef, 0x5b, 0xaa, 0xbc, 0x09, 0x50, 0x57, 0x4f, 0x5b, 0xc9, + 0xb0, 0x6e, 0x4a, 0xda, 0xd2, 0x7e, 0xce, 0x94, 0xd3, 0x1d, 0xd6, 0x15, + 0x09, 0x3b, 0xde, 0x29, 0x72, 0xc2, 0xf2, 0x65, 0x3c, 0xa5, 0xef, 0x69, + 0xdd, 0xdc, 0xfb, 0x66, 0x1f, 0x60, 0xd9, 0xe2, 0x33, 0x54, 0xdd, 0xf9, + 0x59, 0xf7, 0x32, 0xa4, 0x4a, 0x95, 0x2a, 0x55, 0xaa, 0x54, 0xa9, 0x52, + 0xa5, 0x4a, 0x95, 0x2a, 0x55, 0xaa, 0x54, 0xa9, 0x52, 0xa5, 0x4a, 0x95, + 0x2a, 0x55, 0xaa, 0x54, 0xa9, 0x52, 0xa5, 0x4a, 0x95, 0x2a, 0x55, 0xaa, + 0x05, 0x29, 0x85, 0x6a, 0xa5, 0x4a, 0x95, 0x2a, 0x55, 0xaa, 0x54, 0x2f, + 0x23, 0x89, 0x60, 0xb2, 0xb5, 0x92, 0x6c, 0xcb, 0x60, 0x12, 0x5d, 0x6d, + 0xa6, 0x86, 0x69, 0x9a, 0xb8, 0xae, 0x1b, 0x1c, 0xfd, 0x34, 0xce, 0x4c, + 0xe7, 0xa2, 0x0a, 0x29, 0x65, 0x0c, 0xf6, 0x24, 0x72, 0x0a, 0x46, 0xe5, + 0xdb, 0x77, 0x67, 0xe2, 0x8b, 0x80, 0xfc, 0x1d, 0x9f, 0x65, 0x53, 0x22, + 0x72, 0xe2, 0x90, 0x8e, 0xab, 0x4f, 0x5f, 0xcd, 0xe8, 0xce, 0x51, 0xec, + 0xdc, 0xc1, 0xed, 0x9e, 0x18, 0x05, 0x66, 0xf9, 0x75, 0x8b, 0x62, 0x3b, + 0x0c, 0x73, 0x00, 0x00, 0x20, 0x00, 0x49, 0x44, 0x41, 0x54, 0x81, 0xaa, + 0x22, 0x50, 0x1a, 0xd3, 0x34, 0xf1, 0x3c, 0xb5, 0x4b, 0x73, 0xf5, 0xd1, + 0x2a, 0xa6, 0x69, 0xc6, 0xda, 0x26, 0x00, 0x8e, 0xe9, 0x49, 0x8c, 0x51, + 0x77, 0x14, 0x2a, 0x16, 0x9c, 0xa3, 0xc3, 0x75, 0xb3, 0xab, 0x5d, 0x40, + 0xdd, 0x58, 0xdc, 0x7c, 0x2e, 0x8f, 0x4b, 0xa2, 0xbd, 0xba, 0xd8, 0xf5, + 0x9a, 0x9e, 0x06, 0x1c, 0xcc, 0x59, 0x5b, 0xdf, 0x42, 0xcf, 0x76, 0x20, + 0x11, 0x43, 0x12, 0x4e, 0x28, 0x57, 0x59, 0xc6, 0x97, 0x69, 0x7b, 0x05, + 0x11, 0xc4, 0x96, 0xa6, 0xa1, 0x7a, 0x78, 0xf9, 0x2c, 0x62, 0x7f, 0x4b, + 0x4d, 0xb4, 0x4f, 0x2c, 0x8e, 0xcf, 0x7a, 0x80, 0x27, 0x69, 0x19, 0x6a, + 0x7f, 0x65, 0x00, 0xfc, 0x1d, 0xbf, 0x1d, 0x3d, 0xd9, 0xbf, 0xe9, 0x41, + 0xce, 0x00, 0x07, 0xe4, 0x50, 0x38, 0xf1, 0x34, 0xab, 0x27, 0x85, 0x4e, + 0x18, 0xa8, 0x7c, 0x72, 0x22, 0x02, 0xd4, 0xd2, 0xda, 0x2f, 0x15, 0xd0, + 0x2a, 0x6a, 0x73, 0x45, 0xe7, 0xe4, 0xd5, 0x40, 0x7e, 0xdc, 0xe8, 0x84, + 0xd3, 0x68, 0x7a, 0xdf, 0xfe, 0x12, 0x01, 0x4d, 0x89, 0x53, 0x56, 0x10, + 0xaf, 0x86, 0x21, 0xc0, 0x96, 0x41, 0xf9, 0x77, 0xe5, 0x5b, 0x0a, 0x10, + 0x96, 0x53, 0xf1, 0x62, 0x79, 0xfb, 0x65, 0xf2, 0xcb, 0x61, 0xe9, 0x76, + 0x7c, 0x42, 0x5d, 0x5b, 0x0e, 0x12, 0xf4, 0x22, 0x0a, 0x0c, 0x15, 0x96, + 0x98, 0xb6, 0xaa, 0x57, 0x4d, 0x85, 0xf9, 0xcd, 0x27, 0x1f, 0xa4, 0x25, + 0xa5, 0x02, 0x37, 0x89, 0x5c, 0x1e, 0xd7, 0x8d, 0xc3, 0xe6, 0x8c, 0x9c, + 0x89, 0x6c, 0x36, 0x30, 0xcd, 0x12, 0xb2, 0xd9, 0xe8, 0x09, 0xce, 0x5a, + 0xa8, 0xe6, 0x02, 0x63, 0x25, 0xc3, 0xe6, 0x83, 0x68, 0x75, 0x03, 0x74, + 0x25, 0x25, 0xdb, 0x12, 0xc3, 0x30, 0x70, 0x5d, 0x97, 0xd2, 0x8a, 0x52, + 0x70, 0x5f, 0x02, 0x35, 0xd9, 0xb8, 0x31, 0x07, 0xfc, 0xc0, 0xa9, 0x3b, + 0x31, 0x70, 0x16, 0x28, 0x98, 0xd6, 0xd6, 0x2f, 0x6e, 0x65, 0xd5, 0xe0, + 0x2a, 0xc6, 0xc7, 0xc7, 0x19, 0x1a, 0x1a, 0x62, 0xc7, 0x5d, 0x3b, 0xb0, + 0x0a, 0x56, 0x0c, 0xa8, 0xd5, 0xad, 0x1c, 0x7e, 0xde, 0x7e, 0x39, 0x4c, + 0xd3, 0x0c, 0x76, 0xfd, 0xf5, 0xcb, 0xd1, 0xad, 0x7d, 0x95, 0x9f, 0x45, + 0xc3, 0x6b, 0x04, 0x8b, 0xe2, 0x0f, 0x45, 0xe5, 0xd3, 0x86, 0xf0, 0xea, + 0x71, 0xfb, 0x01, 0x50, 0xab, 0x2d, 0x91, 0x7a, 0x57, 0x76, 0x7b, 0xba, + 0x8a, 0x53, 0x6f, 0x20, 0x84, 0xa0, 0x21, 0xe3, 0xed, 0x93, 0x2f, 0xe4, + 0x63, 0x8b, 0x47, 0x64, 0x53, 0xe2, 0xe1, 0x75, 0xb4, 0x53, 0xbc, 0xfc, + 0x5e, 0x0c, 0xaa, 0x25, 0xa5, 0xa4, 0x58, 0x8c, 0x2c, 0xcc, 0x2b, 0x28, + 0xb7, 0x25, 0xb4, 0xdf, 0x31, 0x02, 0xab, 0x60, 0xb1, 0xf1, 0xd3, 0x9b, + 0x19, 0x3e, 0x73, 0x35, 0xc3, 0x67, 0xae, 0x65, 0xfb, 0xdd, 0x3b, 0x70, + 0x1c, 0xff, 0x39, 0xa2, 0x0a, 0x60, 0x59, 0x16, 0x3f, 0xfa, 0xc1, 0xf7, + 0xd9, 0xf8, 0xa9, 0x2b, 0x18, 0xf9, 0xc7, 0x1b, 0xb8, 0xe2, 0x33, 0x9b, + 0x3b, 0xf2, 0x96, 0x52, 0xc6, 0xb8, 0x7d, 0xce, 0xb4, 0x4d, 0xcd, 0xed, + 0x6c, 0xe3, 0x5e, 0x20, 0xad, 0xf1, 0x07, 0xc6, 0x83, 0x45, 0x40, 0x95, + 0x87, 0x2b, 0xb1, 0x38, 0x42, 0x08, 0xa4, 0x06, 0x87, 0x09, 0x21, 0x62, + 0x30, 0x2d, 0xff, 0x99, 0x66, 0x64, 0xba, 0xff, 0x0e, 0x3d, 0xfd, 0xec, + 0x94, 0x52, 0x32, 0xba, 0x73, 0x34, 0xb6, 0xd0, 0x28, 0xe9, 0x1e, 0xdd, + 0x39, 0x8a, 0x94, 0x92, 0xb3, 0x87, 0xcf, 0x03, 0x60, 0xb8, 0xab, 0xc5, + 0x4e, 0x1d, 0x2c, 0x04, 0xaa, 0x57, 0x5a, 0x1f, 0x10, 0x75, 0x30, 0xf6, + 0x5e, 0xd4, 0x6b, 0xeb, 0x8f, 0x3a, 0xea, 0xe0, 0xfd, 0xba, 0xf9, 0xfb, + 0x8b, 0xef, 0x7a, 0x95, 0x61, 0x20, 0x71, 0xf4, 0xb5, 0x2e, 0x91, 0x26, + 0x09, 0xd3, 0x9a, 0xcb, 0x9e, 0x0f, 0xe8, 0x9a, 0xab, 0x6d, 0x92, 0x71, + 0x93, 0x79, 0x44, 0xd3, 0x0c, 0x24, 0xdc, 0xbd, 0x00, 0x60, 0x87, 0xb2, + 0x66, 0xf1, 0xbe, 0x89, 0xc7, 0x38, 0x2f, 0x5c, 0xdf, 0xcb, 0xd9, 0xab, + 0x4e, 0x66, 0x6c, 0xf2, 0x29, 0x56, 0xaf, 0x3c, 0xa1, 0x77, 0xa2, 0x97, + 0xa9, 0xae, 0xcd, 0xf4, 0x3e, 0x4f, 0x86, 0x1d, 0xaa, 0xb6, 0x64, 0x0e, + 0xce, 0xfd, 0x72, 0xd2, 0x5c, 0xd0, 0xac, 0x23, 0x05, 0xd4, 0xe2, 0xe7, + 0xbb, 0xd8, 0x71, 0xf3, 0x4a, 0xc8, 0x49, 0x46, 0x06, 0xc3, 0xbe, 0x91, + 0x10, 0xf7, 0x05, 0xee, 0xcd, 0xd3, 0x67, 0x53, 0xbd, 0x47, 0x50, 0x5d, + 0x6e, 0x40, 0xbf, 0x07, 0xf7, 0x94, 0xe0, 0xc1, 0x2e, 0x0b, 0xc6, 0xcf, + 0xf0, 0xb8, 0xa9, 0x82, 0x5a, 0x61, 0xf7, 0xf9, 0x1e, 0xf9, 0x7d, 0x0c, + 0xa8, 0x2c, 0x20, 0xde, 0x19, 0x1e, 0xba, 0x03, 0x14, 0xd3, 0x7c, 0x40, + 0xad, 0x91, 0x9f, 0xee, 0x62, 0xa3, 0x6c, 0x71, 0xe5, 0xee, 0xdd, 0x9d, + 0x81, 0x22, 0x0b, 0x7d, 0x45, 0x78, 0xef, 0x2a, 0xf0, 0x21, 0xaa, 0x0f, + 0x1f, 0x1a, 0x14, 0xe9, 0x48, 0x69, 0xc3, 0xe9, 0xc3, 0x8c, 0x17, 0xd4, + 0x42, 0x2e, 0xff, 0xb1, 0x28, 0x1d, 0x98, 0xf8, 0xf6, 0x56, 0x36, 0x9d, + 0xa1, 0x16, 0xee, 0xe7, 0x8b, 0xba, 0xef, 0x60, 0x37, 0xd8, 0xf2, 0xc0, + 0x76, 0x56, 0x5f, 0x78, 0x95, 0x8a, 0x6f, 0x82, 0x74, 0x61, 0xec, 0xf6, + 0xeb, 0xb0, 0x6b, 0x0a, 0xbe, 0x6a, 0x45, 0xfa, 0xd8, 0x3f, 0xfa, 0xc9, + 0x7d, 0x44, 0x65, 0xd7, 0xe0, 0x82, 0xf7, 0x9c, 0xfd, 0x12, 0xd7, 0xe8, + 0x08, 0x49, 0x57, 0x23, 0x09, 0xd4, 0x0a, 0x82, 0x8d, 0x3c, 0xb8, 0x21, + 0x94, 0x4b, 0x76, 0x83, 0xb9, 0xe5, 0x22, 0x71, 0x3b, 0x4d, 0x87, 0x6f, + 0x40, 0x39, 0xa3, 0x7b, 0xfa, 0x68, 0x5e, 0xbd, 0xd2, 0x6b, 0x30, 0x57, + 0x37, 0x38, 0xd8, 0xef, 0x42, 0x8b, 0x4a, 0x25, 0xea, 0xf5, 0x3a, 0x85, + 0x42, 0x81, 0xb3, 0xab, 0x55, 0x5e, 0xbc, 0xf7, 0x5e, 0x9e, 0x07, 0x5e, + 0xbc, 0xf7, 0x5e, 0x4a, 0x40, 0x12, 0x29, 0x7d, 0xa4, 0xc1, 0x5a, 0x39, + 0xa0, 0x01, 0x3c, 0xe7, 0xcd, 0xb2, 0xe2, 0x24, 0x8b, 0xa9, 0xc7, 0x1d, + 0x72, 0xc7, 0x1e, 0xcb, 0xc0, 0x49, 0x16, 0xcf, 0x79, 0xb3, 0x5d, 0x59, + 0x65, 0x47, 0x42, 0xb5, 0x9f, 0xd7, 0xe8, 0x7f, 0x6d, 0x3f, 0xa5, 0x57, + 0xfd, 0x12, 0x7e, 0xf5, 0x4b, 0x4a, 0xaf, 0x82, 0xff, 0xa8, 0xfd, 0x0f, + 0x5e, 0x78, 0xd5, 0x5b, 0x5f, 0xa2, 0x1c, 0x0f, 0x4e, 0x37, 0x18, 0x16, + 0x1b, 0x23, 0x90, 0x89, 0x6b, 0xfa, 0x8b, 0x94, 0xd7, 0xa9, 0xd7, 0xbd, + 0x91, 0xaf, 0x5f, 0xc6, 0xc6, 0xf7, 0xdf, 0x04, 0x80, 0xf7, 0x4f, 0xaa, + 0x97, 0x57, 0xaa, 0x38, 0x38, 0x7b, 0x55, 0xbf, 0xf3, 0x86, 0x7f, 0xdf, + 0x04, 0xac, 0x0a, 0xd2, 0x5a, 0xc0, 0xfa, 0x21, 0x40, 0x4a, 0x2e, 0x5b, + 0x13, 0x5e, 0x67, 0x3e, 0x50, 0x0b, 0xe0, 0xe2, 0x33, 0x89, 0x2d, 0x5e, + 0x6c, 0xc9, 0x16, 0x59, 0x91, 0x0d, 0x60, 0x22, 0x97, 0x9f, 0x19, 0x86, + 0xf9, 0x6e, 0x29, 0x25, 0x97, 0x0c, 0x11, 0x8c, 0x1f, 0xf8, 0xd0, 0xab, + 0x0d, 0xe7, 0xe6, 0xe1, 0x4b, 0x57, 0xb1, 0xed, 0x23, 0xd7, 0x71, 0xf9, + 0xf6, 0x1b, 0x00, 0xd8, 0x7a, 0x4f, 0x83, 0x3b, 0xbe, 0x9c, 0xe7, 0x8a, + 0x8b, 0x15, 0xd0, 0x62, 0xeb, 0x9f, 0x5c, 0xc1, 0xc4, 0xcf, 0x6f, 0xe8, + 0xa8, 0xb7, 0xb2, 0x21, 0x28, 0x12, 0x87, 0x68, 0x75, 0x03, 0x6a, 0x01, + 0xac, 0x3d, 0x07, 0x36, 0x5f, 0x56, 0x65, 0xf5, 0x9b, 0xcb, 0xdd, 0x23, + 0x68, 0x19, 0x4b, 0xf2, 0x6c, 0xba, 0x7a, 0x33, 0x5b, 0xff, 0x66, 0xab, + 0x2e, 0xbb, 0x87, 0x6c, 0x43, 0x2b, 0xb6, 0xb0, 0xdf, 0xc3, 0xca, 0x99, + 0x38, 0xfb, 0x6c, 0xac, 0x9c, 0x09, 0x4b, 0xb2, 0xc8, 0xc8, 0x42, 0x54, + 0x29, 0xe3, 0xbf, 0x71, 0x3f, 0x6d, 0xff, 0x32, 0x03, 0xf6, 0x79, 0xba, + 0x2f, 0x2e, 0xf0, 0xda, 0x79, 0x8c, 0x4c, 0x43, 0x2d, 0x90, 0x97, 0xf3, + 0xff, 0x5e, 0x0e, 0x15, 0xb2, 0x13, 0xd5, 0x0f, 0x34, 0x50, 0xeb, 0x07, + 0x7f, 0xf3, 0x9b, 0x23, 0x62, 0xef, 0x48, 0xe9, 0xf7, 0x05, 0xcf, 0xea, + 0xa5, 0x64, 0x79, 0x1e, 0x05, 0xde, 0xd3, 0x25, 0xde, 0xe1, 0x8d, 0x5e, + 0xf4, 0xd6, 0xe0, 0xf3, 0x36, 0x2b, 0x56, 0x2e, 0x66, 0x6a, 0x72, 0xee, + 0x85, 0xe0, 0x3f, 0xd7, 0xc7, 0x28, 0x78, 0x6a, 0x50, 0x43, 0xae, 0xa6, + 0x80, 0xbd, 0x0f, 0xcd, 0xb2, 0xf6, 0x98, 0x78, 0x39, 0xcd, 0xa2, 0xe0, + 0xf2, 0x8f, 0x6e, 0xe4, 0xda, 0xcf, 0x28, 0xd0, 0xf4, 0xe4, 0x9e, 0xf5, + 0x5c, 0xfc, 0x96, 0x38, 0x68, 0xda, 0xb7, 0xfd, 0x4e, 0x6d, 0x67, 0xe9, + 0x43, 0xb3, 0xac, 0x05, 0x6e, 0x2b, 0x14, 0x3a, 0xe2, 0x01, 0xfc, 0x6a, + 0x91, 0x02, 0x6c, 0xb1, 0x48, 0xc1, 0xb7, 0xa6, 0x26, 0x67, 0x3b, 0xcb, + 0xff, 0x7c, 0x3c, 0xcd, 0x0a, 0x6d, 0x3b, 0xa9, 0x10, 0xac, 0xa5, 0xe1, + 0x5b, 0x51, 0x52, 0x56, 0xdd, 0xa6, 0x5c, 0xef, 0xd2, 0x26, 0x75, 0x9b, + 0xc1, 0xc5, 0x9d, 0xde, 0xa1, 0x0d, 0x38, 0x6a, 0x16, 0x6e, 0xfd, 0x5b, + 0xe5, 0xfe, 0xc0, 0x16, 0x05, 0xc9, 0x02, 0x05, 0x23, 0x7b, 0xfc, 0xa1, + 0x59, 0x4e, 0x7a, 0xeb, 0x62, 0xfe, 0xf6, 0xdf, 0x66, 0x89, 0xa2, 0x6d, + 0xa6, 0x1e, 0xae, 0x01, 0xfd, 0x7c, 0xe0, 0x14, 0xb8, 0xf5, 0x91, 0xa8, + 0x5d, 0x15, 0x67, 0xf0, 0xf9, 0xfe, 0x78, 0x9d, 0x74, 0x9d, 0x6f, 0x9b, + 0x05, 0x36, 0x2a, 0xbf, 0x4f, 0xfe, 0x68, 0xee, 0x8e, 0xff, 0x8e, 0xdd, + 0x0e, 0xeb, 0xd7, 0x84, 0xe3, 0x17, 0x3b, 0xf6, 0xa8, 0xfb, 0xf9, 0xfa, + 0x33, 0x43, 0xbf, 0xd1, 0x3d, 0xe1, 0x3d, 0x7e, 0xb8, 0x87, 0xff, 0xc5, + 0xda, 0xc6, 0xf6, 0xdd, 0x11, 0x3f, 0x2e, 0xe0, 0xe2, 0x35, 0x16, 0xd5, + 0x2f, 0x5e, 0x10, 0xf8, 0xdf, 0xf0, 0xad, 0x09, 0xe0, 0xbc, 0x20, 0x8e, + 0xef, 0x3f, 0x36, 0xad, 0xee, 0x5b, 0xab, 0x07, 0x8c, 0xe0, 0x7c, 0xf5, + 0x80, 0xc1, 0xae, 0x99, 0xde, 0x77, 0x26, 0x1f, 0x64, 0x15, 0x05, 0x6a, + 0x75, 0xd3, 0xa6, 0xbf, 0xff, 0x0e, 0xbb, 0x6f, 0x3c, 0x8f, 0x1d, 0x0f, + 0xb8, 0x71, 0xea, 0x45, 0x0f, 0x9b, 0x95, 0x9c, 0x80, 0x1e, 0x36, 0xff, + 0xf5, 0xeb, 0x3f, 0xe2, 0x83, 0xef, 0x7f, 0x53, 0x4f, 0x20, 0xd7, 0xca, + 0xd7, 0x9f, 0xc0, 0xf7, 0xbf, 0xf7, 0x7d, 0x00, 0xce, 0xfe, 0xa3, 0xb7, + 0x51, 0xd5, 0xe3, 0x92, 0xab, 0xfa, 0x0d, 0xcc, 0x3e, 0xc1, 0xe8, 0x03, + 0x2e, 0x97, 0x6c, 0x2f, 0x71, 0xcb, 0xc5, 0xba, 0xd7, 0x32, 0xa8, 0xca, + 0xb3, 0xe1, 0x63, 0x71, 0xd0, 0x41, 0x79, 0x50, 0x21, 0x50, 0xaa, 0x8f, + 0x48, 0xec, 0x27, 0x24, 0xc5, 0x4b, 0xbb, 0x83, 0xb5, 0xec, 0xba, 0xe4, + 0x86, 0x2d, 0x23, 0x5c, 0xb1, 0x69, 0xe3, 0xbc, 0x50, 0xad, 0xbc, 0x61, + 0x04, 0x33, 0x12, 0x3c, 0xe9, 0x62, 0xe6, 0x4a, 0xc1, 0xf3, 0x34, 0x0a, + 0xd4, 0xf2, 0x55, 0xf3, 0xd6, 0xd2, 0x6f, 0xec, 0x02, 0xae, 0x65, 0x74, + 0x7a, 0x33, 0x0a, 0xa6, 0x05, 0xeb, 0x57, 0xc0, 0x8e, 0x29, 0xf0, 0xda, + 0x0e, 0xc5, 0x42, 0x19, 0x6f, 0xc6, 0xc5, 0x6b, 0x3b, 0x34, 0xea, 0xea, + 0x6f, 0x57, 0xec, 0x2b, 0x51, 0x99, 0xba, 0x8e, 0x7e, 0xe3, 0xa3, 0x78, + 0x6d, 0x37, 0x00, 0x68, 0x45, 0xdd, 0x79, 0xd3, 0xc2, 0x9e, 0xa9, 0x04, + 0x6e, 0x6f, 0xc6, 0x45, 0x4a, 0x9b, 0xfc, 0x80, 0xb2, 0x07, 0x60, 0xe4, + 0x86, 0x31, 0x32, 0xa6, 0x06, 0x74, 0x8d, 0x92, 0x37, 0x43, 0x00, 0x97, + 0xd3, 0x96, 0xd0, 0x16, 0x6a, 0x2c, 0xb9, 0x2d, 0xc8, 0x0a, 0x89, 0xa7, + 0x01, 0x66, 0x0e, 0x1e, 0x56, 0x46, 0x43, 0x7a, 0xda, 0x06, 0x4e, 0xd7, + 0x7e, 0xaf, 0x05, 0x24, 0xdf, 0xef, 0x5a, 0x08, 0xd3, 0x82, 0x69, 0x70, + 0xda, 0x2e, 0x96, 0x2e, 0x6b, 0x69, 0x60, 0x7d, 0xd7, 0xb2, 0x36, 0x5c, + 0x15, 0x5e, 0x99, 0xba, 0xae, 0xc3, 0xba, 0x1f, 0xdf, 0xaf, 0x6f, 0xb1, + 0xaf, 0xac, 0xe3, 0xee, 0x08, 0x81, 0x59, 0x99, 0x72, 0x60, 0x2f, 0x6c, + 0xf3, 0x2f, 0xc4, 0xec, 0x78, 0xd2, 0x0d, 0x40, 0x7c, 0x9e, 0x74, 0x31, + 0x84, 0x89, 0x21, 0x86, 0x17, 0x04, 0x71, 0xa8, 0xe9, 0x63, 0x7f, 0xc4, + 0xaf, 0xbf, 0x4b, 0x78, 0x34, 0xac, 0xa6, 0xff, 0xf5, 0x27, 0xe2, 0x46, + 0x75, 0x6f, 0x86, 0x23, 0x42, 0xba, 0x1a, 0x19, 0x00, 0x76, 0xaa, 0x71, + 0xad, 0x81, 0x01, 0x98, 0xd6, 0x83, 0x47, 0xd3, 0x11, 0x50, 0x15, 0xd3, + 0xe1, 0x98, 0xd2, 0x4e, 0x60, 0xe3, 0xe7, 0x60, 0xe4, 0x13, 0x2a, 0xff, + 0x8d, 0x5d, 0x6c, 0x4e, 0x4f, 0x87, 0xf1, 0x40, 0xc5, 0xdd, 0xd8, 0xa5, + 0xac, 0xd3, 0x03, 0xd0, 0x77, 0x16, 0x6a, 0x13, 0x90, 0x85, 0x96, 0x77, + 0x5a, 0x95, 0xd5, 0x2f, 0x5e, 0x2f, 0x88, 0xd6, 0xf4, 0xb4, 0xaa, 0xcf, + 0xc8, 0x34, 0xac, 0x1b, 0x80, 0x9d, 0xd3, 0xdd, 0xcb, 0xd0, 0xcd, 0xee, + 0xc6, 0xc4, 0x20, 0xdf, 0xbf, 0x4e, 0x33, 0xef, 0x2c, 0x22, 0x31, 0xed, + 0x60, 0x9c, 0x56, 0xc2, 0xf5, 0x3c, 0x90, 0x0a, 0xa8, 0x25, 0x9b, 0x12, + 0xf1, 0x86, 0xa2, 0xfa, 0xa6, 0x99, 0x01, 0x33, 0x67, 0xe0, 0xed, 0x3d, + 0xb8, 0xcd, 0x77, 0x7c, 0xc9, 0x76, 0x27, 0x38, 0xab, 0x97, 0xbb, 0x5b, + 0x3a, 0xa1, 0xe1, 0x5a, 0x00, 0xb2, 0xcf, 0x00, 0x91, 0xc5, 0x34, 0x0c, + 0x55, 0xde, 0x36, 0x88, 0x9a, 0x83, 0xec, 0x07, 0x61, 0x18, 0xf4, 0x9b, + 0x26, 0xde, 0x83, 0x7a, 0x6c, 0x3a, 0xa3, 0xfb, 0x9d, 0x99, 0xe4, 0x1b, + 0x9d, 0xee, 0xb0, 0xea, 0x6f, 0x89, 0xe2, 0x9e, 0x09, 0xb5, 0x29, 0x4b, + 0x1b, 0xdc, 0x33, 0x56, 0x61, 0x2e, 0x33, 0x91, 0xf7, 0x4f, 0x20, 0xfe, + 0x62, 0x3d, 0xb5, 0x19, 0x17, 0x61, 0x9a, 0x0c, 0xf5, 0x17, 0x19, 0x9f, + 0xb1, 0x91, 0x9e, 0x47, 0xff, 0x8a, 0x32, 0xb5, 0xe9, 0x2a, 0xfd, 0x03, + 0x25, 0xe4, 0x3f, 0x6c, 0xc5, 0xbd, 0x68, 0xad, 0xde, 0x10, 0x47, 0x99, + 0xf6, 0x81, 0x5a, 0x10, 0xba, 0x7b, 0x8d, 0xa9, 0xff, 0x2e, 0x81, 0x5a, + 0x00, 0xf9, 0x25, 0xc0, 0x7e, 0xa9, 0xde, 0x79, 0xf5, 0x77, 0x37, 0x5b, + 0x08, 0x6c, 0x7d, 0x8f, 0x58, 0x55, 0x80, 0xb1, 0xba, 0xae, 0x4a, 0xa4, + 0x68, 0x0d, 0x14, 0xcc, 0xa9, 0xdf, 0x10, 0x78, 0x9e, 0x64, 0xdc, 0x53, + 0xdf, 0x63, 0x41, 0x52, 0x84, 0x00, 0xf2, 0xe4, 0x3f, 0x1e, 0x8b, 0x28, + 0x10, 0x94, 0xe7, 0xc5, 0xdb, 0xbd, 0xea, 0x49, 0xca, 0xa6, 0xc9, 0x18, + 0xe0, 0x66, 0x60, 0xa4, 0x20, 0xb8, 0x64, 0xda, 0xa5, 0x28, 0xc0, 0x30, + 0x04, 0x35, 0x0f, 0xaa, 0x4d, 0x49, 0x31, 0x07, 0x46, 0x4e, 0x41, 0xa8, + 0x7c, 0xa4, 0x99, 0xdd, 0x96, 0xe4, 0xdb, 0x02, 0x23, 0xa3, 0xde, 0xd9, + 0x1d, 0x24, 0x8d, 0x3a, 0x0a, 0xd8, 0xd5, 0xf4, 0xcb, 0x2e, 0x83, 0xf7, + 0xf7, 0x6a, 0x53, 0x06, 0xe5, 0xb1, 0x85, 0x20, 0xef, 0x41, 0x29, 0x03, + 0xd5, 0xb6, 0x0f, 0x52, 0xce, 0x52, 0xca, 0x28, 0x70, 0x96, 0xff, 0x77, + 0xb0, 0x10, 0x0a, 0xba, 0xa5, 0xcb, 0x6b, 0xe8, 0x4d, 0x53, 0xbc, 0x66, + 0x8b, 0x6a, 0xbb, 0x85, 0x94, 0x92, 0x72, 0x41, 0xe0, 0x35, 0x5b, 0x54, + 0x1e, 0xa9, 0xb0, 0xfe, 0xa2, 0xcb, 0xd9, 0x71, 0xeb, 0x36, 0x8a, 0x40, + 0x23, 0x03, 0x93, 0x6d, 0xf5, 0x9d, 0xb6, 0x98, 0x89, 0x3e, 0x1d, 0xd4, + 0x77, 0x2a, 0xcf, 0x6b, 0x50, 0x24, 0x4f, 0xb5, 0x0d, 0xe8, 0x6b, 0xb3, + 0xaa, 0xeb, 0x56, 0x44, 0x62, 0xcb, 0xb0, 0x0d, 0xfd, 0xef, 0x34, 0x4e, + 0x1b, 0x24, 0x82, 0xb2, 0x00, 0xcb, 0x53, 0x30, 0xad, 0x85, 0x7e, 0xb1, + 0x3f, 0x36, 0x73, 0x54, 0xcc, 0xfd, 0xda, 0xe3, 0x14, 0x64, 0xaa, 0x28, + 0x4e, 0xe2, 0x99, 0xc7, 0x67, 0x39, 0x5e, 0x87, 0x3d, 0xf3, 0x9c, 0x72, + 0x3f, 0x79, 0xd2, 0x24, 0x85, 0xc6, 0x62, 0xea, 0xf9, 0x59, 0x9e, 0x3d, + 0x30, 0x3f, 0x2c, 0x6a, 0xa2, 0x38, 0xc9, 0x6b, 0x8f, 0x53, 0x79, 0x1c, + 0x2f, 0x8e, 0xe2, 0xd9, 0x03, 0x2f, 0xf2, 0xec, 0x01, 0xe5, 0x1f, 0x4d, + 0x6b, 0x2d, 0x29, 0xf0, 0x40, 0x65, 0x1f, 0x56, 0x2e, 0x04, 0x6a, 0x39, + 0x4d, 0x05, 0xda, 0x3a, 0x71, 0xf9, 0xb2, 0x9e, 0x60, 0xad, 0x64, 0x5e, + 0xbe, 0xe6, 0x2b, 0xd7, 0xb0, 0x5c, 0xc9, 0xa8, 0x98, 0xe4, 0xa4, 0xd7, + 0xc1, 0xbf, 0xfd, 0xa4, 0xcd, 0xe0, 0xf1, 0xe1, 0x0d, 0x30, 0xeb, 0x40, + 0x4b, 0x77, 0x41, 0x5f, 0x7b, 0xdc, 0x51, 0xfc, 0xe0, 0xf1, 0x17, 0xbb, + 0x02, 0xb5, 0xa2, 0x32, 0x5f, 0xa9, 0xc1, 0x6a, 0xf4, 0x6e, 0x53, 0xe8, + 0x0e, 0x13, 0xf3, 0xc3, 0x80, 0xa0, 0x4d, 0x4f, 0x38, 0xfa, 0x09, 0x00, + 0x56, 0x9e, 0x7d, 0x36, 0x93, 0xf7, 0x85, 0xe3, 0x8f, 0x4f, 0xfd, 0x76, + 0x39, 0x13, 0xc5, 0x49, 0x2e, 0xf8, 0xd9, 0x31, 0x3c, 0x36, 0xa1, 0xde, + 0xe1, 0xa6, 0x1a, 0x3f, 0x54, 0x81, 0x47, 0x75, 0x7d, 0x41, 0x08, 0x64, + 0x18, 0x79, 0xbc, 0x66, 0xf8, 0x15, 0xdc, 0x07, 0x43, 0x65, 0x85, 0xa0, + 0xe1, 0x35, 0x02, 0x48, 0x95, 0x53, 0xf7, 0x28, 0x9a, 0x06, 0xb2, 0x25, + 0x19, 0xbe, 0x70, 0x3d, 0xb2, 0x9d, 0xc5, 0xbe, 0xf9, 0x06, 0x86, 0xcf, + 0x59, 0xcf, 0x6a, 0x6f, 0x9c, 0xb1, 0x1f, 0x3a, 0x48, 0x3d, 0x96, 0xe7, + 0xcc, 0x4c, 0x62, 0xf5, 0xad, 0xe4, 0x92, 0xf7, 0x0d, 0xb3, 0xed, 0xd6, + 0x6d, 0x6c, 0xb8, 0x74, 0x13, 0x5b, 0x3e, 0x7b, 0x1d, 0x79, 0x23, 0x8f, + 0x58, 0xd2, 0x8f, 0x55, 0xc8, 0xaa, 0xfb, 0x67, 0xbf, 0x02, 0x0b, 0x59, + 0x2b, 0x2c, 0xb5, 0x11, 0x58, 0xbd, 0x45, 0xde, 0xcc, 0x43, 0x21, 0x04, + 0x6b, 0x89, 0x8c, 0xa0, 0x45, 0x8b, 0xa1, 0xa1, 0x21, 0xb6, 0x7e, 0x61, + 0x2b, 0x42, 0x18, 0x14, 0x97, 0xf5, 0xb3, 0xeb, 0x87, 0xe3, 0xe4, 0x0b, + 0xd0, 0xaa, 0x87, 0xf3, 0x22, 0xd0, 0xb0, 0xf0, 0xbc, 0x25, 0x18, 0x3e, + 0x7d, 0x18, 0xbb, 0x66, 0x53, 0x75, 0xab, 0x78, 0xfe, 0xd8, 0x44, 0x56, + 0xd7, 0x2f, 0x23, 0x69, 0x35, 0x95, 0xbb, 0x25, 0x25, 0x62, 0xb1, 0xa0, + 0xd5, 0x0c, 0xd3, 0x42, 0x08, 0xc1, 0x12, 0x8b, 0xd5, 0x5d, 0xa1, 0xe1, + 0x35, 0xb0, 0x0a, 0x16, 0xa2, 0x19, 0xef, 0xc7, 0x8b, 0xc5, 0x02, 0xb1, + 0x18, 0xfc, 0x4f, 0xbc, 0x59, 0x0d, 0xd3, 0xcb, 0x5b, 0x42, 0xd9, 0x90, + 0xf1, 0xb8, 0xad, 0xce, 0x19, 0x07, 0xb1, 0x79, 0x39, 0xfe, 0x5c, 0x20, + 0x91, 0x13, 0xac, 0x5e, 0xb1, 0x9a, 0xb1, 0xa9, 0x31, 0x65, 0xb7, 0x0f, + 0x1a, 0xb2, 0x85, 0xac, 0xeb, 0xba, 0x64, 0x0c, 0xd4, 0x2d, 0xb2, 0xa5, + 0xd3, 0xcf, 0xfd, 0x7e, 0x21, 0x23, 0xef, 0x33, 0x3e, 0x50, 0x4b, 0x26, + 0xde, 0x71, 0x7c, 0xe0, 0x16, 0xbe, 0xbf, 0x86, 0x6f, 0x05, 0xf1, 0x23, + 0x1b, 0xaf, 0x11, 0x01, 0x73, 0x25, 0xed, 0xc4, 0x6c, 0xbd, 0xa2, 0x7b, + 0x79, 0x7c, 0x90, 0xd6, 0xd0, 0xdb, 0x4f, 0x0d, 0x60, 0x5b, 0x4f, 0x45, + 0x7e, 0xcf, 0xc9, 0xf2, 0xca, 0x19, 0xd9, 0x01, 0x06, 0x0b, 0xc2, 0xfc, + 0x72, 0xf9, 0x7e, 0xd1, 0xf4, 0x33, 0x12, 0x56, 0xc0, 0xbe, 0x29, 0x15, + 0xe7, 0xdb, 0xcd, 0x6f, 0x85, 0x36, 0xc6, 0xbd, 0x98, 0xad, 0x68, 0xda, + 0xe4, 0x31, 0x5a, 0xe7, 0x64, 0xde, 0xd1, 0x63, 0xb4, 0xec, 0x81, 0x0d, + 0x1f, 0x60, 0xb6, 0x4f, 0x76, 0xb7, 0xf5, 0x0a, 0x02, 0x70, 0xd6, 0x71, + 0x8b, 0x96, 0x52, 0x79, 0xcc, 0xe6, 0xb9, 0xe7, 0x9f, 0x66, 0xd9, 0xe2, + 0x33, 0xa8, 0x3c, 0xf6, 0x3d, 0x9e, 0x7b, 0xfe, 0xe9, 0xa0, 0x7c, 0xcf, + 0x1e, 0xb0, 0x61, 0x51, 0xf7, 0x36, 0x4d, 0x95, 0x2a, 0x55, 0xaa, 0x54, + 0xa9, 0x52, 0xa5, 0x4a, 0x95, 0x2a, 0x55, 0xaa, 0x54, 0xa9, 0x52, 0xa5, + 0x4a, 0x95, 0x2a, 0x55, 0xaa, 0x54, 0xa9, 0x52, 0xa5, 0x4a, 0x95, 0x2a, + 0x55, 0xaa, 0x54, 0x0b, 0xd3, 0xcb, 0x74, 0x29, 0x63, 0xaa, 0x54, 0xa9, + 0x52, 0xa5, 0x4a, 0xf5, 0xbf, 0xa7, 0x92, 0x50, 0xa5, 0xa4, 0x7c, 0x68, + 0x4c, 0x14, 0x5c, 0x23, 0xdb, 0x12, 0xab, 0xcf, 0x52, 0xbb, 0x29, 0xf7, + 0xb0, 0x25, 0x9b, 0x12, 0x9a, 0x21, 0xb4, 0xcb, 0xc8, 0x19, 0x98, 0x7d, + 0x26, 0x8d, 0x7a, 0xb8, 0x30, 0x32, 0x9f, 0xcb, 0xd3, 0x68, 0x36, 0x28, + 0x9f, 0x56, 0xa6, 0x3a, 0x55, 0x0d, 0x26, 0xf3, 0xf9, 0xe9, 0xfd, 0xf3, + 0xe4, 0xd1, 0xd7, 0xea, 0xd3, 0x57, 0x63, 0xd7, 0x6c, 0x4a, 0x2b, 0x4a, + 0x2a, 0xfd, 0x3c, 0x0b, 0x85, 0xa2, 0x70, 0xab, 0xa8, 0x3b, 0x0a, 0xfe, + 0x0a, 0xca, 0x1e, 0x89, 0x53, 0x9b, 0xa9, 0xc5, 0xec, 0xf8, 0xe7, 0xb5, + 0x99, 0x5a, 0x10, 0x47, 0xb6, 0x25, 0xa6, 0x61, 0x06, 0x61, 0xbe, 0x0d, + 0x3f, 0x2c, 0x0a, 0x2f, 0x8b, 0x02, 0xbb, 0x64, 0x53, 0xd2, 0xdf, 0xd7, + 0x1f, 0x40, 0xbd, 0xfc, 0x38, 0x8d, 0x66, 0x27, 0x00, 0x20, 0x0a, 0x3c, + 0xf3, 0xcf, 0x17, 0xa2, 0x10, 0x40, 0xe3, 0x4f, 0xeb, 0x8e, 0xa8, 0xdd, + 0xb9, 0x23, 0x73, 0x30, 0x25, 0x52, 0x44, 0x7d, 0x12, 0x79, 0xb9, 0x5e, + 0xb0, 0x55, 0xb3, 0x2c, 0x6a, 0xd0, 0x94, 0x27, 0xf5, 0xe2, 0xf3, 0x88, + 0xc1, 0x5c, 0x67, 0x5a, 0x7f, 0xc2, 0x68, 0xb6, 0x29, 0x61, 0xb9, 0xa1, + 0x21, 0x53, 0x3a, 0x8e, 0xdf, 0x36, 0x4f, 0x44, 0xf2, 0x8d, 0x02, 0xab, + 0x20, 0xee, 0x06, 0x28, 0x1a, 0x9d, 0x60, 0x2b, 0xad, 0x6c, 0x4e, 0x4d, + 0x50, 0xf5, 0x8f, 0xca, 0xcf, 0x00, 0x64, 0x70, 0x1e, 0xa8, 0x5b, 0x7a, + 0xd4, 0x6e, 0xcf, 0xd9, 0xfd, 0x3a, 0x7e, 0xf4, 0x1a, 0x6c, 0xca, 0x78, + 0xfc, 0x9c, 0x50, 0xf1, 0x9b, 0x91, 0xba, 0xe7, 0x04, 0xf8, 0xbf, 0x13, + 0xff, 0xcf, 0x6e, 0x18, 0xca, 0x2f, 0x13, 0x09, 0x03, 0xb5, 0xea, 0xd2, + 0x9f, 0xf0, 0xb8, 0xdc, 0x80, 0xaa, 0x0b, 0xcd, 0xb9, 0xaf, 0xe9, 0xa4, + 0x84, 0x30, 0x03, 0xb0, 0x96, 0xd7, 0x74, 0x21, 0x02, 0x74, 0x12, 0x7a, + 0x62, 0x7d, 0x00, 0xd2, 0x3a, 0x4c, 0x98, 0x96, 0x0f, 0xc0, 0x5a, 0x08, + 0x08, 0x2b, 0x99, 0xa6, 0x97, 0x7a, 0x85, 0x1d, 0x4c, 0x1e, 0x87, 0xaa, + 0x56, 0xbb, 0x73, 0x82, 0xf1, 0x91, 0x28, 0x87, 0x91, 0x33, 0xe7, 0x04, + 0x97, 0x39, 0xf5, 0x2e, 0xd0, 0x12, 0xe8, 0xd8, 0xc9, 0x3e, 0xa9, 0x62, + 0xbf, 0x5e, 0x32, 0x21, 0xe7, 0xbf, 0x46, 0xae, 0xb9, 0xee, 0x1a, 0x6e, + 0xfa, 0xe7, 0xed, 0x08, 0x01, 0xd5, 0x47, 0xab, 0x7c, 0x63, 0xfb, 0xbf, + 0x46, 0xde, 0xca, 0x04, 0x1b, 0x3f, 0x75, 0x25, 0xd9, 0x4c, 0x68, 0x37, + 0x5a, 0xa6, 0x55, 0x83, 0xe1, 0xa2, 0xff, 0x28, 0x68, 0x2b, 0x7a, 0x2f, + 0x12, 0x39, 0x81, 0x5d, 0x75, 0x40, 0xa8, 0x85, 0xfb, 0x4e, 0xbd, 0x3b, + 0xc0, 0x64, 0xed, 0x99, 0xab, 0x83, 0xbb, 0x81, 0x11, 0x81, 0x53, 0x94, + 0x4a, 0xe1, 0x42, 0x7b, 0xc7, 0x75, 0x28, 0x97, 0xca, 0x38, 0xae, 0x83, + 0x1b, 0x01, 0x86, 0x99, 0x05, 0xb3, 0x8b, 0x45, 0x55, 0x77, 0xa3, 0x60, + 0x74, 0xc0, 0xae, 0x6a, 0xae, 0x4b, 0xbf, 0xd9, 0x99, 0xc6, 0x07, 0x70, + 0x45, 0x9f, 0x17, 0x0b, 0x71, 0x83, 0x06, 0x8e, 0x69, 0x7a, 0x44, 0x34, + 0xbf, 0x28, 0x50, 0x2b, 0x9a, 0x6e, 0x2e, 0x5b, 0xf3, 0x3d, 0xaf, 0x92, + 0x4a, 0x02, 0x9e, 0xe6, 0x53, 0x12, 0xa2, 0x95, 0x74, 0x77, 0x83, 0x3f, + 0x41, 0x7c, 0x91, 0xdc, 0x4e, 0x60, 0x74, 0x74, 0x14, 0x38, 0xea, 0x88, + 0xc1, 0xb4, 0x00, 0x6e, 0xbc, 0x11, 0x7e, 0xfa, 0xf1, 0x10, 0x42, 0xb5, + 0x8e, 0x01, 0xa6, 0x99, 0x0e, 0xca, 0xd3, 0x0b, 0x72, 0xe5, 0x97, 0x29, + 0x59, 0x87, 0xf9, 0xea, 0x14, 0xb5, 0x93, 0xcc, 0x2b, 0x99, 0x2e, 0xea, + 0xee, 0x06, 0xd3, 0xea, 0x26, 0x7f, 0x0d, 0xe0, 0x7c, 0x76, 0xd6, 0x01, + 0x4f, 0xb3, 0x30, 0x9d, 0xb7, 0x1b, 0xbe, 0xb3, 0x06, 0x98, 0x78, 0x2c, + 0xf0, 0x5b, 0x7b, 0xf7, 0xfc, 0xf7, 0xa8, 0xdf, 0x85, 0x8a, 0x42, 0x60, + 0xff, 0x8e, 0x17, 0xd2, 0xfd, 0x67, 0x56, 0x14, 0x9a, 0x65, 0xbc, 0x61, + 0x6d, 0xcc, 0xef, 0x48, 0x01, 0xb5, 0xb8, 0x73, 0x14, 0x80, 0x6d, 0xe7, + 0x1a, 0x5c, 0x7e, 0xb7, 0x47, 0xd6, 0x82, 0x91, 0x41, 0x03, 0x29, 0xd5, + 0x22, 0xaa, 0x8d, 0x7b, 0x3d, 0x36, 0x35, 0xe0, 0xa6, 0x53, 0x84, 0x5a, + 0x05, 0x78, 0xb3, 0x01, 0x1f, 0xae, 0xc0, 0x29, 0xc0, 0x57, 0xf4, 0x7d, + 0xf4, 0xc3, 0xfa, 0x7e, 0x2c, 0x4c, 0xa8, 0x78, 0x0a, 0x94, 0xf5, 0x31, + 0x9d, 0x87, 0x0f, 0xcd, 0x8a, 0x9e, 0x7f, 0xcc, 0x98, 0x3f, 0x1e, 0x06, + 0x3c, 0x30, 0x77, 0xf1, 0x8d, 0xd3, 0xce, 0x57, 0x90, 0xad, 0x9f, 0xeb, + 0xb6, 0xb8, 0x73, 0x94, 0x8d, 0x77, 0x8f, 0xf6, 0x4e, 0xb0, 0x7b, 0x17, + 0x7c, 0xb3, 0x37, 0x14, 0xf2, 0xf7, 0x29, 0xb1, 0xa4, 0x85, 0xbf, 0x40, + 0x51, 0x84, 0x6c, 0x86, 0x00, 0xa8, 0x15, 0xb8, 0x75, 0x9b, 0xf8, 0xcc, + 0x5c, 0xff, 0xb8, 0xe3, 0xce, 0x5b, 0x00, 0x58, 0x7d, 0x46, 0x88, 0x62, + 0xbc, 0x62, 0xc3, 0x87, 0x5e, 0xb2, 0xf2, 0xfe, 0xae, 0x24, 0xbd, 0x46, + 0x07, 0xd4, 0x2a, 0x16, 0xee, 0xc3, 0x8b, 0xe9, 0x02, 0xc6, 0x6a, 0xeb, + 0x67, 0xa9, 0x6c, 0x29, 0xa0, 0x5a, 0x42, 0xfe, 0x93, 0x56, 0xd9, 0x98, + 0x03, 0xce, 0x35, 0x57, 0x7a, 0xd9, 0x0a, 0x6c, 0x1c, 0xac, 0xa2, 0x6f, + 0x41, 0xf3, 0x2f, 0x39, 0xeb, 0x2e, 0xc3, 0x30, 0x58, 0xba, 0x74, 0xa9, + 0x3a, 0x59, 0xba, 0x94, 0x9f, 0xde, 0x7b, 0x2f, 0xa0, 0x5e, 0x95, 0x5e, + 0xff, 0x8e, 0x77, 0x70, 0xfc, 0xd3, 0x4f, 0xf3, 0x6c, 0xb5, 0xda, 0x91, + 0x17, 0x74, 0xbc, 0xbd, 0x1d, 0x92, 0x7c, 0x66, 0xd1, 0x4f, 0xf7, 0xfd, + 0x8a, 0xdc, 0x2f, 0x9a, 0x38, 0xff, 0xa1, 0xc1, 0x2a, 0x8f, 0x43, 0xf3, + 0xc0, 0x01, 0x9a, 0xc0, 0x71, 0x87, 0x61, 0xbf, 0xcb, 0x5b, 0x26, 0x02, + 0xf8, 0x45, 0xb5, 0xca, 0x2f, 0xaa, 0x55, 0x5e, 0x21, 0x5e, 0x19, 0x0f, + 0xfc, 0xd5, 0x34, 0xbf, 0xd9, 0xbf, 0xff, 0x30, 0x72, 0x3c, 0x32, 0x7f, + 0x97, 0x2b, 0x5c, 0x1b, 0xf9, 0x0f, 0x60, 0xa0, 0x16, 0x1c, 0x5e, 0x99, + 0x40, 0xa4, 0x7e, 0xe3, 0xeb, 0x97, 0x05, 0xee, 0x0b, 0xde, 0xef, 0x72, + 0xcd, 0x8e, 0x21, 0x60, 0xe8, 0x50, 0x8a, 0x7b, 0x58, 0xb2, 0x81, 0xa2, + 0x94, 0x1d, 0xfd, 0xce, 0x0d, 0xe7, 0xe6, 0xd9, 0x10, 0x81, 0x66, 0x4d, + 0x6c, 0x57, 0xbf, 0xc1, 0x3b, 0xb6, 0xaf, 0xd7, 0x3e, 0xeb, 0x39, 0x12, + 0x2a, 0xce, 0x01, 0xc0, 0x90, 0xd2, 0x63, 0xe2, 0x91, 0x2a, 0xab, 0x4e, + 0x29, 0x01, 0xb0, 0xe5, 0xe3, 0xd7, 0x62, 0x2c, 0xc9, 0xc7, 0xd8, 0x2f, + 0xd9, 0x5c, 0x1e, 0x91, 0x97, 0xe4, 0x81, 0xb1, 0x4a, 0x95, 0xd5, 0xe5, + 0x12, 0x45, 0xf2, 0x0c, 0x7f, 0xf8, 0x72, 0x6e, 0xb9, 0x7e, 0x2b, 0x56, + 0x9f, 0xa0, 0xe1, 0x49, 0x68, 0x94, 0xb1, 0x6b, 0xd9, 0x80, 0x57, 0xad, + 0x64, 0x21, 0x65, 0x0b, 0x67, 0x9f, 0x47, 0xb1, 0x28, 0x71, 0xf7, 0x4b, + 0x40, 0xaa, 0xdb, 0x70, 0x06, 0xe4, 0x2c, 0x88, 0x23, 0x8a, 0xa0, 0x4b, + 0xf5, 0x52, 0xe8, 0x29, 0xe0, 0xd5, 0x10, 0x2c, 0xa4, 0x7f, 0x56, 0x1f, + 0x4f, 0xd0, 0xee, 0xb7, 0x03, 0xdf, 0x7d, 0x09, 0xf3, 0xff, 0xc7, 0x59, + 0x58, 0xad, 0xdd, 0x6b, 0x51, 0xd0, 0x82, 0x57, 0x02, 0xbb, 0x80, 0x7f, + 0x5f, 0xac, 0x00, 0x58, 0x51, 0xad, 0x80, 0x18, 0x8f, 0xca, 0x97, 0xab, + 0xc1, 0xec, 0x56, 0x9f, 0xba, 0xde, 0x9d, 0x99, 0x2a, 0xdb, 0x7f, 0xb0, + 0x89, 0x13, 0x4a, 0x5b, 0x39, 0x7d, 0x71, 0xe2, 0x3a, 0x5c, 0xb9, 0x98, + 0xb3, 0x1f, 0x0a, 0x21, 0x56, 0xdf, 0xa9, 0xdb, 0x9c, 0x57, 0x28, 0x32, + 0xf8, 0xbc, 0xcd, 0xde, 0x45, 0x45, 0x5e, 0xf5, 0xbc, 0xcd, 0xcf, 0x51, + 0x20, 0xad, 0x7f, 0x9f, 0x9c, 0xe5, 0x9d, 0x2b, 0xe7, 0x5e, 0xb8, 0x2e, + 0xde, 0x04, 0x67, 0x9d, 0xa5, 0xdc, 0x7f, 0xfa, 0xa7, 0xbe, 0xdd, 0x9a, + 0x3e, 0xf6, 0x07, 0xf1, 0xbe, 0xf6, 0xb5, 0x59, 0x6a, 0x59, 0x90, 0x3f, + 0xea, 0x6d, 0x6b, 0x70, 0x31, 0xec, 0x9d, 0x83, 0x39, 0xf6, 0xe2, 0x62, + 0x05, 0xd2, 0xba, 0xad, 0x03, 0x86, 0xd5, 0xcf, 0x6d, 0x7f, 0x0b, 0x17, + 0x69, 0x9f, 0xbf, 0xfd, 0x37, 0x15, 0xe1, 0x6f, 0xff, 0xf8, 0x14, 0xf8, + 0x1a, 0xf0, 0xa7, 0xd1, 0xb2, 0xa8, 0xe3, 0x6d, 0x9b, 0x88, 0x9d, 0xfb, + 0xba, 0xed, 0x91, 0x5a, 0xec, 0xfc, 0x6f, 0xff, 0xf8, 0x14, 0xed, 0xf0, + 0xed, 0xd4, 0xe0, 0xda, 0x23, 0x40, 0xbf, 0xe9, 0xa1, 0x6b, 0xbe, 0xae, + 0xe0, 0x51, 0x57, 0xbf, 0xff, 0x6d, 0x0b, 0x4e, 0x73, 0xc5, 0x7b, 0x56, + 0x05, 0x00, 0xae, 0x85, 0x68, 0xf5, 0x95, 0xaa, 0xf3, 0x37, 0x76, 0x7d, + 0xf7, 0x71, 0xa4, 0xf9, 0xc2, 0x7d, 0x0d, 0x2d, 0x57, 0xf7, 0xf6, 0x6d, + 0x0f, 0x7a, 0x5c, 0xdb, 0x94, 0xdc, 0x01, 0x9c, 0x0f, 0x6c, 0x5e, 0x00, + 0xb0, 0x3f, 0xaa, 0x0f, 0xbe, 0xff, 0x4d, 0x1d, 0x7e, 0xf7, 0x7d, 0xef, + 0xfb, 0x9c, 0xfd, 0x47, 0x61, 0x1b, 0xbc, 0xed, 0xcf, 0xdf, 0x86, 0x48, + 0x10, 0xdb, 0xcc, 0x3e, 0x81, 0xf5, 0xe9, 0x3c, 0x9b, 0x2d, 0xc1, 0xc4, + 0x8d, 0x0a, 0xb2, 0x05, 0x30, 0xa6, 0xfb, 0xb6, 0x97, 0x95, 0xbf, 0xc1, + 0x4d, 0x95, 0x0b, 0x82, 0x71, 0xd7, 0xe1, 0xfc, 0xf5, 0x54, 0xf8, 0x10, + 0x17, 0x5f, 0x68, 0xb0, 0xfd, 0x76, 0x0f, 0xfb, 0x89, 0xde, 0xf7, 0xe8, + 0x2b, 0x36, 0x6d, 0xe4, 0x86, 0x2d, 0x23, 0x8c, 0x7e, 0x64, 0xee, 0xbe, + 0x70, 0x75, 0xe6, 0xa6, 0xc0, 0x6d, 0x88, 0x35, 0xe4, 0x0b, 0x26, 0x6e, + 0x2d, 0x8f, 0x21, 0xd4, 0x6f, 0x31, 0x09, 0xd6, 0xda, 0xf4, 0xae, 0x22, + 0x5b, 0xbe, 0xbd, 0x16, 0x18, 0x43, 0x01, 0xb5, 0x34, 0x58, 0xab, 0x0d, + 0x57, 0xbd, 0xf7, 0x0e, 0xb6, 0xee, 0xbc, 0x9a, 0x46, 0xdd, 0xc1, 0x6b, + 0x3b, 0x18, 0xa2, 0x48, 0xbe, 0x60, 0x51, 0x6b, 0x5a, 0x01, 0x64, 0xaa, + 0xe6, 0x7d, 0x21, 0x00, 0x6b, 0x81, 0x15, 0x00, 0xb2, 0x6a, 0x53, 0x11, + 0x70, 0x54, 0xc6, 0xa4, 0xe1, 0x3a, 0x48, 0x69, 0x23, 0x44, 0x31, 0x70, + 0x1b, 0xb9, 0x61, 0x6d, 0xc3, 0x2f, 0xf3, 0x37, 0xa8, 0x4c, 0x5d, 0x10, + 0x80, 0xb6, 0xd0, 0x70, 0x16, 0x4f, 0x1f, 0x9d, 0xb6, 0x44, 0x73, 0x18, + 0x70, 0xa4, 0xc0, 0x69, 0xcb, 0xc4, 0xb8, 0x58, 0xb7, 0xbf, 0x73, 0xa7, + 0x5f, 0x65, 0xea, 0x3a, 0x44, 0xc6, 0xc4, 0xca, 0x0c, 0xe1, 0xb4, 0x5d, + 0xa0, 0x11, 0x94, 0x29, 0xea, 0x16, 0xa2, 0x48, 0xde, 0xb4, 0x70, 0xa7, + 0xc7, 0x83, 0xf2, 0xc1, 0x05, 0x81, 0x1d, 0xaf, 0x39, 0x4a, 0xbf, 0x71, + 0x99, 0xae, 0x3b, 0xe4, 0x51, 0x40, 0x30, 0xbf, 0x3d, 0x14, 0x58, 0xcb, + 0xa1, 0xe1, 0x3a, 0x78, 0xd2, 0xc6, 0xc8, 0xad, 0xc7, 0x6b, 0xee, 0x08, + 0x8e, 0x2a, 0xad, 0x87, 0x91, 0x31, 0x82, 0x76, 0x35, 0x84, 0xa9, 0x20, + 0x5b, 0x0b, 0x50, 0x3f, 0x71, 0x68, 0x56, 0xf2, 0xdc, 0x57, 0xd2, 0xaf, + 0x3f, 0x12, 0xb7, 0x5f, 0xfb, 0xdd, 0xef, 0xbb, 0x6b, 0x3a, 0xbe, 0x3f, + 0xe8, 0x93, 0xd0, 0x3b, 0xfa, 0x42, 0xf7, 0xbd, 0x0b, 0x80, 0x55, 0x6d, + 0xd4, 0x03, 0x6e, 0xd3, 0x3b, 0x51, 0x84, 0xac, 0x4f, 0xcc, 0x93, 0xe0, + 0x73, 0x30, 0xfd, 0x09, 0x9d, 0x6e, 0x1d, 0x30, 0xd2, 0xc3, 0xee, 0xe7, + 0x42, 0x5b, 0x1b, 0xd7, 0xc1, 0xc8, 0x4e, 0xf8, 0xe6, 0x59, 0x70, 0x85, + 0x1f, 0x61, 0x64, 0x27, 0x03, 0x07, 0x43, 0xd5, 0x47, 0x95, 0x6f, 0xe3, + 0x4e, 0x0d, 0xfe, 0x9a, 0xee, 0x0d, 0xd4, 0x0a, 0xb2, 0xd0, 0x20, 0xad, + 0x91, 0xe9, 0xf8, 0x79, 0x87, 0x22, 0xe5, 0x58, 0x97, 0x38, 0x07, 0xf8, + 0xe0, 0x00, 0xfc, 0xf7, 0xda, 0xfc, 0xc5, 0x93, 0x7b, 0xab, 0x88, 0x36, + 0xe0, 0x83, 0xb4, 0x22, 0x12, 0xd3, 0x0e, 0x6e, 0xff, 0xe1, 0x81, 0x51, + 0x7b, 0x81, 0xb3, 0x0e, 0x3a, 0x5d, 0x26, 0x0b, 0x6d, 0x70, 0x35, 0x94, + 0x24, 0xf8, 0xc6, 0x59, 0x73, 0x10, 0x38, 0x0a, 0xc0, 0x99, 0x51, 0x80, + 0xac, 0x40, 0x6d, 0xd9, 0x65, 0x26, 0x95, 0x88, 0x6d, 0xce, 0x23, 0xa5, + 0x87, 0x04, 0x8c, 0xfb, 0xc7, 0xf0, 0x51, 0x1a, 0xf2, 0x8b, 0x3b, 0x30, + 0x74, 0xb8, 0x82, 0x1f, 0x49, 0xd4, 0x17, 0xb0, 0x5d, 0xf0, 0xee, 0xb5, + 0xf0, 0xd9, 0x9b, 0x10, 0x22, 0x0b, 0x4d, 0x49, 0xff, 0xee, 0x2a, 0x1e, + 0xa2, 0xa3, 0x91, 0x5e, 0x0a, 0x68, 0x56, 0x74, 0xa3, 0x89, 0x83, 0x55, + 0x65, 0x7f, 0xf8, 0x66, 0x9b, 0xd5, 0x6d, 0x17, 0xfd, 0x9e, 0xd7, 0xf0, + 0xc2, 0x37, 0xbb, 0xe4, 0xf7, 0x4d, 0x1b, 0x81, 0xd4, 0x30, 0xad, 0x12, + 0x12, 0x5b, 0xc7, 0xb4, 0x23, 0x95, 0xb6, 0x64, 0x04, 0xfc, 0xe4, 0x85, + 0xdf, 0x4d, 0x8b, 0x91, 0x77, 0x04, 0xa9, 0xdf, 0xa5, 0x8c, 0x4c, 0xdc, + 0x76, 0xa9, 0x2d, 0x30, 0xf0, 0x68, 0xa0, 0xbe, 0x27, 0x7a, 0x08, 0xa4, + 0x84, 0x52, 0x4e, 0x90, 0x37, 0x24, 0x13, 0x75, 0x68, 0x20, 0x69, 0xb4, + 0x3b, 0xdf, 0xcf, 0x25, 0x30, 0x51, 0x0f, 0xed, 0x95, 0x0d, 0x0d, 0xe4, + 0xd2, 0x11, 0x8a, 0xa8, 0x72, 0x05, 0x5f, 0x57, 0x32, 0x40, 0xbb, 0xa5, + 0xea, 0xd0, 0x06, 0x32, 0x02, 0x91, 0x81, 0x3c, 0x60, 0xb7, 0x41, 0xfa, + 0x75, 0x6f, 0x36, 0x28, 0xea, 0xbf, 0xeb, 0xf0, 0xfb, 0x2e, 0x61, 0xf4, + 0xce, 0x5b, 0xa8, 0xfa, 0x60, 0x28, 0xd7, 0xa1, 0x52, 0xa9, 0x68, 0x7b, + 0x82, 0x62, 0x2e, 0xcb, 0x25, 0x1f, 0xde, 0xc0, 0xe8, 0x17, 0x6f, 0x40, + 0x90, 0x45, 0xb6, 0x5b, 0x08, 0xa1, 0xe0, 0xc9, 0x76, 0x06, 0xca, 0x46, + 0x9e, 0x4a, 0x5d, 0x81, 0xe2, 0xfc, 0x32, 0xab, 0xd6, 0x96, 0x41, 0x99, + 0x2b, 0x1a, 0x22, 0x86, 0x88, 0x97, 0xbd, 0xe2, 0x86, 0x35, 0x2e, 0x02, + 0xd5, 0x05, 0xbc, 0x73, 0x3d, 0x2b, 0x5f, 0xe4, 0x78, 0xa1, 0x3e, 0x1e, + 0x1c, 0xe3, 0xa8, 0x8f, 0x2f, 0x05, 0xe0, 0xf1, 0xe7, 0x1e, 0xe7, 0xd8, + 0xd7, 0xc1, 0xc4, 0x01, 0x0d, 0x83, 0xfa, 0x8f, 0xc5, 0x4c, 0x58, 0x93, + 0x70, 0x00, 0x9e, 0xfd, 0x83, 0x59, 0x38, 0xa0, 0xd2, 0x47, 0x41, 0x56, + 0x49, 0x99, 0xaf, 0x84, 0xd7, 0x66, 0xe2, 0x1f, 0x2c, 0x8e, 0x3f, 0x56, + 0x81, 0xa3, 0x8e, 0x3f, 0x36, 0x84, 0x49, 0xbd, 0x11, 0xf5, 0x7d, 0xca, + 0x4a, 0x90, 0xc3, 0x7d, 0xc0, 0x96, 0x53, 0xd9, 0xc7, 0x85, 0xef, 0x9c, + 0x1b, 0x16, 0x9d, 0x94, 0x5f, 0x2e, 0xf3, 0x95, 0x71, 0xc8, 0xd5, 0xcf, + 0x9f, 0x7b, 0x91, 0xe3, 0x8f, 0xd5, 0x27, 0x3f, 0x83, 0x7f, 0xfa, 0xfb, + 0x6f, 0xe2, 0x7e, 0xfb, 0xdb, 0xec, 0xbc, 0xe5, 0x9b, 0xbc, 0xe5, 0x92, + 0xf7, 0xf2, 0x83, 0xe5, 0x83, 0xd8, 0xc0, 0x0f, 0x72, 0x83, 0x6c, 0x3c, + 0x5a, 0xc1, 0x80, 0xe6, 0x03, 0x6a, 0x81, 0xca, 0xe3, 0xd8, 0x8c, 0x6a, + 0xcf, 0x68, 0x9b, 0x06, 0xf5, 0x16, 0x47, 0xf1, 0xac, 0x7c, 0x91, 0x13, + 0x8e, 0x7e, 0x82, 0x6f, 0xbc, 0xee, 0x85, 0x78, 0x62, 0xdd, 0x96, 0x8b, + 0xa6, 0xe1, 0x82, 0x63, 0x8e, 0x61, 0xe5, 0x39, 0xaf, 0x65, 0xe9, 0xb9, + 0x1f, 0x01, 0xe0, 0xe9, 0xbb, 0xef, 0x66, 0xe5, 0xd9, 0x0a, 0xe0, 0x3f, + 0x79, 0xdf, 0x7d, 0x9c, 0x70, 0xf4, 0x13, 0x3c, 0x36, 0x0d, 0x77, 0xf1, + 0x02, 0xef, 0x3e, 0xe6, 0x18, 0xee, 0x7a, 0xe1, 0x05, 0x16, 0x5b, 0xaf, + 0x51, 0x06, 0xdc, 0xb9, 0x01, 0xc5, 0x49, 0xb5, 0x12, 0xf7, 0x07, 0xaf, + 0x29, 0x31, 0x72, 0x02, 0x23, 0xd2, 0x5f, 0xb5, 0x84, 0x85, 0x93, 0xf1, + 0xb8, 0xe2, 0x63, 0x57, 0x70, 0xc7, 0xad, 0x77, 0xb0, 0xfa, 0x94, 0x3c, + 0x76, 0xd3, 0x61, 0x55, 0xc1, 0x52, 0xfd, 0x21, 0x0d, 0xd4, 0x42, 0xc2, + 0xc5, 0xe7, 0x5c, 0xcc, 0xd6, 0xeb, 0xaf, 0x63, 0x4d, 0xb9, 0x44, 0xd5, + 0x76, 0x58, 0x5b, 0x1e, 0x0a, 0x21, 0x57, 0x5d, 0x14, 0x1d, 0xeb, 0x13, + 0x4d, 0xbd, 0xa9, 0x99, 0xc8, 0xe2, 0xd5, 0x1d, 0xae, 0xf8, 0xf4, 0x15, + 0x6c, 0xf8, 0xcc, 0x66, 0xf2, 0x05, 0xc8, 0x17, 0xa0, 0x51, 0x57, 0x47, + 0x00, 0x7b, 0x9f, 0xfa, 0x46, 0xdc, 0xa8, 0x43, 0x9e, 0x22, 0xa3, 0xbb, + 0x47, 0x83, 0xdd, 0xc4, 0x0c, 0xa1, 0x41, 0xa7, 0x3a, 0x5f, 0x1f, 0x94, + 0x45, 0x5b, 0xc3, 0xc3, 0xf4, 0x26, 0x5a, 0xbe, 0xdb, 0x2a, 0x18, 0xc1, + 0x98, 0x8d, 0xd7, 0x90, 0xb4, 0x24, 0x14, 0xfb, 0x8a, 0x48, 0x29, 0xc9, + 0xe6, 0xf2, 0xe1, 0x7d, 0x4f, 0xea, 0xdf, 0xa0, 0xff, 0x3c, 0x68, 0x0b, + 0x64, 0x06, 0xb2, 0x39, 0x05, 0xe5, 0x12, 0x19, 0x01, 0x39, 0xfd, 0xdd, + 0x56, 0x32, 0xe7, 0xac, 0xdc, 0xe4, 0xb3, 0x13, 0x60, 0x6c, 0x6a, 0x8c, + 0xa2, 0x51, 0xc4, 0x6b, 0x7b, 0xe1, 0x78, 0x2b, 0xb0, 0xf6, 0xb4, 0xb5, + 0xec, 0xda, 0x3b, 0xa1, 0xa7, 0x83, 0x64, 0xf1, 0xe4, 0xc2, 0xbf, 0x51, + 0xf5, 0x02, 0x69, 0x75, 0xc0, 0xa2, 0xb4, 0xbb, 0x1b, 0x30, 0x2b, 0x19, + 0x27, 0x69, 0x23, 0x09, 0xaa, 0x3a, 0x61, 0xf9, 0x32, 0x00, 0xfa, 0xcc, + 0x01, 0x66, 0xdc, 0x69, 0xc6, 0xbf, 0xfb, 0x63, 0x86, 0xde, 0x7e, 0x2a, + 0x10, 0xc2, 0xb5, 0xfa, 0xcc, 0x81, 0x18, 0x54, 0xab, 0x9b, 0xad, 0xe8, + 0x71, 0x3e, 0x30, 0xd8, 0x9b, 0x5e, 0x31, 0x44, 0x71, 0xf9, 0x32, 0x4e, + 0x3f, 0xf5, 0x6c, 0x96, 0xad, 0x30, 0x78, 0xfd, 0xaa, 0xff, 0x02, 0xc0, + 0xb2, 0x15, 0xff, 0xc2, 0x43, 0xdf, 0xfd, 0x31, 0xdf, 0xdd, 0xb3, 0x9b, + 0xc7, 0xfa, 0x2a, 0x1d, 0x75, 0x48, 0xe6, 0xd1, 0x2b, 0x7c, 0xae, 0x3a, + 0x77, 0xb3, 0xd5, 0xad, 0x8c, 0x51, 0xff, 0x67, 0x0f, 0xd8, 0x1c, 0xb7, + 0x68, 0x69, 0x70, 0x7e, 0xdc, 0xa2, 0xa5, 0x3c, 0x7b, 0xc0, 0xe6, 0xf8, + 0x63, 0x8b, 0x31, 0xa8, 0xd6, 0x73, 0xcf, 0x3f, 0xdd, 0x75, 0x7c, 0x23, + 0x55, 0xaa, 0x54, 0xa9, 0x52, 0xa5, 0x4a, 0x95, 0x2a, 0x55, 0xaa, 0x54, + 0xa9, 0x52, 0xa5, 0x4a, 0x95, 0x2a, 0x55, 0xaa, 0x54, 0xa9, 0x52, 0xa5, + 0x4a, 0x95, 0x2a, 0x55, 0xaa, 0x54, 0xa9, 0x52, 0x2d, 0x5c, 0x29, 0x54, + 0x2b, 0x55, 0xaa, 0x54, 0xa9, 0x52, 0xa5, 0x7a, 0x19, 0x28, 0x0a, 0x70, + 0x5a, 0x48, 0x9c, 0x28, 0x3c, 0x4a, 0x64, 0x04, 0xce, 0x4c, 0x77, 0x10, + 0x8c, 0x91, 0x33, 0x90, 0x52, 0x76, 0x80, 0xa4, 0xa4, 0x94, 0xb8, 0x91, + 0x9d, 0xc8, 0x1b, 0xf5, 0x06, 0xf9, 0x42, 0x9e, 0x7c, 0x2e, 0x8f, 0x3b, + 0xe3, 0x52, 0x5a, 0x51, 0x62, 0xfc, 0x81, 0xf1, 0x20, 0x2e, 0x80, 0xd0, + 0xb0, 0x18, 0x1f, 0x1e, 0xe3, 0xc3, 0xb3, 0x1a, 0x34, 0xc8, 0xe7, 0xf2, + 0xd8, 0xb5, 0x10, 0x6e, 0x63, 0x18, 0xc6, 0x21, 0x4d, 0xd0, 0x16, 0x42, + 0x04, 0x90, 0xab, 0x5e, 0x65, 0xf7, 0xdd, 0x22, 0x23, 0x82, 0x89, 0xe0, + 0x3e, 0x28, 0x0c, 0xd4, 0x04, 0x44, 0x23, 0x67, 0x04, 0xe0, 0xb1, 0xc0, + 0x5f, 0xc7, 0xeb, 0xc8, 0x53, 0xdb, 0x01, 0x05, 0xd8, 0x72, 0x5d, 0x37, + 0xb0, 0xeb, 0xa7, 0xcd, 0xe7, 0xf2, 0xb8, 0xc4, 0x17, 0x8e, 0xcc, 0x67, + 0xb7, 0x67, 0x1d, 0x21, 0xc2, 0xd3, 0x0a, 0x27, 0x88, 0x4b, 0x3d, 0x49, + 0x3f, 0x09, 0xd4, 0xf2, 0x63, 0x21, 0xe3, 0x93, 0xa5, 0xa3, 0xd3, 0xa7, + 0x01, 0x84, 0x27, 0x91, 0x65, 0x23, 0x00, 0x6a, 0x05, 0xb3, 0xa9, 0xa3, + 0x7e, 0xfe, 0xa2, 0x80, 0xb6, 0xa4, 0x55, 0xd0, 0xd6, 0xeb, 0x92, 0x6c, + 0xbf, 0xa1, 0x76, 0xed, 0x7c, 0xc2, 0x83, 0x9c, 0x01, 0x33, 0x1e, 0xbc, + 0x59, 0xa7, 0x87, 0xb8, 0xad, 0x8a, 0xda, 0xc9, 0x3b, 0xfb, 0x66, 0x03, + 0x7e, 0xe8, 0xa9, 0xc5, 0x05, 0xfd, 0x06, 0xad, 0x9a, 0x07, 0x6f, 0x36, + 0x15, 0x50, 0xab, 0x2e, 0x15, 0x5c, 0x2b, 0xe1, 0xd7, 0xd2, 0x7e, 0xad, + 0xba, 0x84, 0x82, 0x20, 0x5b, 0x97, 0x0a, 0x64, 0xd5, 0x27, 0xc8, 0xce, + 0x48, 0x5a, 0x65, 0xa3, 0x7b, 0xfa, 0xfd, 0x52, 0xa5, 0x8b, 0xa6, 0xef, + 0x57, 0xee, 0xe8, 0x92, 0xfb, 0x96, 0xb6, 0xd9, 0xaa, 0x47, 0x1a, 0xb1, + 0x20, 0x94, 0xbd, 0xba, 0x54, 0xb6, 0xfc, 0x85, 0x65, 0x6b, 0x0c, 0xd8, + 0xed, 0x29, 0x20, 0xd9, 0x0a, 0x03, 0xa6, 0xbc, 0xd0, 0x2f, 0x1a, 0xbe, + 0x46, 0x83, 0xc6, 0x5c, 0xe0, 0x4c, 0xa1, 0xea, 0xec, 0xd7, 0x69, 0x1e, + 0xc9, 0xc4, 0x62, 0x23, 0xd3, 0x2c, 0x85, 0x10, 0x2d, 0x42, 0xa0, 0x96, + 0x91, 0x53, 0xab, 0xd8, 0xe6, 0x82, 0x3d, 0x01, 0x41, 0x3c, 0xa5, 0x4e, + 0xd8, 0x40, 0x18, 0xaf, 0xb8, 0x20, 0xbf, 0xa4, 0x7f, 0xaf, 0x38, 0xdd, + 0xe2, 0x97, 0x06, 0xd5, 0xa2, 0x37, 0x43, 0xaf, 0x96, 0x6e, 0x78, 0x21, + 0xb8, 0xc9, 0xd4, 0xf0, 0x24, 0xcf, 0xf3, 0xc8, 0x1b, 0xf9, 0x60, 0x25, + 0x94, 0xac, 0x67, 0x63, 0x36, 0x24, 0x3d, 0x00, 0x56, 0xf3, 0xe4, 0x1d, + 0xf3, 0x33, 0x0d, 0x2c, 0xd3, 0x0a, 0xca, 0x01, 0x71, 0xe8, 0xa0, 0xaf, + 0xbc, 0x91, 0x27, 0x6f, 0xe4, 0x69, 0x78, 0x0d, 0x0c, 0xc2, 0x76, 0x8c, + 0xb7, 0xa9, 0xef, 0x77, 0xf0, 0xf7, 0xaf, 0x46, 0xb3, 0x81, 0x57, 0xf7, + 0x68, 0xb5, 0x75, 0x3b, 0xb4, 0x05, 0xf9, 0x82, 0x5a, 0x34, 0xe9, 0xc3, + 0x0b, 0xb3, 0xfa, 0x27, 0xb7, 0xfd, 0xd6, 0xed, 0x5c, 0x76, 0xe9, 0x7a, + 0xb6, 0xdf, 0xbe, 0x83, 0xd2, 0x1b, 0x4a, 0x48, 0xe0, 0xba, 0xbf, 0x53, + 0x8b, 0xfe, 0xae, 0xf9, 0xeb, 0xab, 0x00, 0xb5, 0xa3, 0x71, 0x36, 0x03, + 0x2d, 0xd9, 0x62, 0xed, 0x19, 0x0a, 0xec, 0x52, 0x2a, 0x95, 0x62, 0x79, + 0x96, 0x4a, 0x25, 0xaa, 0xd5, 0x2a, 0x22, 0x2b, 0x18, 0xbd, 0x67, 0x14, + 0xab, 0x90, 0x58, 0x18, 0x2a, 0xc1, 0xad, 0xab, 0xeb, 0x2b, 0x09, 0x5d, + 0x74, 0x5c, 0x87, 0x5d, 0x7b, 0x42, 0x40, 0x8c, 0xd7, 0xf4, 0x82, 0x7b, + 0x5a, 0xb5, 0xaa, 0x16, 0x75, 0x58, 0x96, 0x6a, 0x6f, 0xd7, 0xeb, 0x7e, + 0xad, 0xbb, 0x75, 0x17, 0x91, 0xf1, 0xdb, 0x4a, 0x20, 0x84, 0xc4, 0xf3, + 0x61, 0x85, 0x5d, 0xee, 0x89, 0xbe, 0x5f, 0x12, 0xb8, 0x95, 0x04, 0x34, + 0x42, 0x1c, 0xe4, 0x98, 0xf4, 0x8f, 0xc2, 0xb2, 0xfc, 0x78, 0x3e, 0x48, + 0x2b, 0x9a, 0x26, 0xba, 0x50, 0x28, 0x69, 0x2b, 0xba, 0xeb, 0x73, 0x67, + 0x41, 0xe7, 0xfe, 0xdb, 0x47, 0xc1, 0x51, 0x68, 0xf7, 0x0b, 0xc0, 0xcf, + 0x7a, 0xc4, 0x8f, 0x42, 0xa6, 0x06, 0x18, 0x60, 0x27, 0xd3, 0xac, 0xd3, + 0x6e, 0x1f, 0x27, 0x35, 0x0d, 0x6c, 0x4c, 0x9c, 0x27, 0xf3, 0xda, 0xc8, + 0x00, 0xc3, 0xc3, 0xc3, 0xdc, 0x7d, 0xb7, 0x3a, 0x3f, 0x5c, 0x98, 0x56, + 0xd4, 0x6f, 0x63, 0xa2, 0x4e, 0xeb, 0x58, 0xc7, 0x08, 0x3b, 0x83, 0x72, + 0x27, 0xd7, 0xfb, 0xad, 0x03, 0x1d, 0x1a, 0x96, 0xd3, 0x2f, 0xe3, 0x7c, + 0x75, 0x8a, 0x6a, 0x27, 0xd3, 0xb1, 0xf6, 0x49, 0xa6, 0xeb, 0x06, 0xc5, + 0x4a, 0xc2, 0xbb, 0xa6, 0x89, 0x83, 0xb4, 0xa2, 0xb6, 0xa2, 0x1a, 0xe8, + 0x92, 0x76, 0xa1, 0x92, 0x9b, 0x4e, 0xe6, 0xbc, 0x2d, 0x8f, 0x21, 0x37, + 0x9d, 0x0c, 0xc0, 0x7d, 0x13, 0xa1, 0xfb, 0xf7, 0xa5, 0xa2, 0xee, 0xb7, + 0x14, 0x73, 0x06, 0xc5, 0x1c, 0xec, 0xd2, 0xd0, 0xbb, 0xff, 0x4c, 0x90, + 0xad, 0x0d, 0x97, 0x5e, 0xac, 0x1c, 0x6d, 0x88, 0xf6, 0x7e, 0x7a, 0x49, + 0xb6, 0x09, 0xfb, 0x39, 0x91, 0xd8, 0xad, 0x17, 0xc0, 0xfd, 0x76, 0xef, + 0x05, 0x5d, 0xbd, 0x74, 0x44, 0x20, 0x5a, 0xbe, 0xfe, 0x49, 0x2f, 0xa1, + 0xbd, 0x33, 0x0e, 0xa0, 0xda, 0x04, 0x6c, 0x69, 0x80, 0xbd, 0xdb, 0x8b, + 0xf9, 0x75, 0xe8, 0x2b, 0x66, 0x08, 0xd2, 0x8a, 0xfa, 0x7d, 0x2c, 0x72, + 0x1e, 0x05, 0x66, 0x45, 0xfd, 0x92, 0xea, 0x15, 0x2f, 0xe9, 0xd7, 0x45, + 0xde, 0x5f, 0x94, 0x80, 0xcd, 0x70, 0xcf, 0xae, 0x4e, 0xa8, 0x6a, 0x52, + 0x37, 0x6f, 0x83, 0x87, 0xbb, 0x43, 0x1d, 0xff, 0x33, 0xe8, 0xe2, 0x8b, + 0x2e, 0xa1, 0xb6, 0x2f, 0xac, 0xdf, 0xe6, 0x7f, 0xb8, 0x12, 0x63, 0xc0, + 0xea, 0xda, 0x7f, 0xe8, 0xb5, 0x70, 0x75, 0x21, 0xfe, 0x22, 0x17, 0x3e, + 0xeb, 0xa2, 0xcf, 0x2e, 0xe9, 0x02, 0x39, 0x19, 0x8f, 0xab, 0xdd, 0xd1, + 0xf0, 0xc0, 0x66, 0x4e, 0xc0, 0x94, 0x8b, 0x6c, 0x7a, 0x88, 0x42, 0xe2, + 0xd9, 0x27, 0x23, 0xef, 0xa1, 0x32, 0x8b, 0x74, 0x25, 0xc2, 0x0c, 0xe3, + 0x48, 0xaf, 0x01, 0x52, 0xf7, 0x3b, 0xa5, 0x44, 0x22, 0x11, 0x39, 0x03, + 0x41, 0x08, 0xc6, 0xba, 0xef, 0xeb, 0xeb, 0x39, 0x7b, 0x78, 0x87, 0x8e, + 0x22, 0x35, 0x10, 0x38, 0xde, 0x57, 0x1d, 0xfa, 0x96, 0xc1, 0xd8, 0x1b, + 0xb5, 0x0d, 0x41, 0x00, 0xe7, 0xf2, 0x6d, 0x6c, 0xfe, 0xc2, 0xf5, 0x5c, + 0xbb, 0x76, 0xb4, 0x67, 0xfa, 0x6b, 0xae, 0xfc, 0x28, 0x57, 0x5e, 0x75, + 0x5d, 0x50, 0x8e, 0x83, 0x55, 0x32, 0x85, 0x7f, 0xbe, 0xd0, 0x05, 0xde, + 0xb3, 0x4b, 0x96, 0xb0, 0x48, 0xf7, 0x89, 0xfc, 0x7e, 0x55, 0x6b, 0xc9, + 0x12, 0x4e, 0x88, 0x40, 0xa5, 0x96, 0x2e, 0x5d, 0xca, 0xb3, 0xd5, 0x6a, + 0x60, 0xf7, 0x48, 0xdf, 0x8d, 0x5f, 0x09, 0xfc, 0x3a, 0x72, 0xfe, 0xa6, + 0x13, 0x54, 0xdf, 0xef, 0x99, 0x5f, 0x34, 0xbb, 0xc6, 0x3f, 0x14, 0xf5, + 0x02, 0x6b, 0xbd, 0x54, 0x4f, 0x96, 0xc3, 0xfd, 0xbb, 0x00, 0x88, 0x7f, + 0xd8, 0x85, 0x64, 0x2d, 0xd6, 0x8a, 0x12, 0xce, 0x54, 0x95, 0x8b, 0x2f, + 0xcd, 0xb3, 0xfd, 0xe6, 0x06, 0xa5, 0x37, 0xb8, 0x5c, 0x75, 0x65, 0xb8, + 0xd0, 0x76, 0xe3, 0xfb, 0x6f, 0x8a, 0x01, 0xb6, 0x3a, 0xca, 0x92, 0xe8, + 0x4b, 0x7a, 0x4d, 0x8f, 0x1d, 0xe3, 0x82, 0xcb, 0xce, 0x99, 0xbf, 0x34, + 0x2d, 0xd9, 0x22, 0xdb, 0x05, 0x06, 0x17, 0x95, 0xff, 0x26, 0xe3, 0x2f, + 0x06, 0xff, 0x7d, 0x68, 0xed, 0x45, 0x37, 0x50, 0xbd, 0x7f, 0x2b, 0x56, + 0xa1, 0x33, 0xcc, 0xb2, 0x4a, 0x08, 0x61, 0x60, 0xe9, 0xd7, 0xa3, 0xbc, + 0x01, 0x42, 0x18, 0x48, 0xe9, 0x61, 0x88, 0x06, 0xad, 0x26, 0x88, 0x4c, + 0x16, 0x09, 0x94, 0x97, 0x9b, 0xb4, 0x9a, 0x0d, 0x2a, 0x4f, 0xb8, 0xd8, + 0x9f, 0xbe, 0x01, 0xd3, 0x02, 0xbb, 0x56, 0x54, 0x0b, 0x6e, 0x97, 0x80, + 0x10, 0x12, 0x77, 0xbf, 0x5a, 0xdc, 0xd9, 0xbf, 0xcc, 0x52, 0xf7, 0x0d, + 0x21, 0x28, 0x8a, 0x2c, 0x52, 0x1a, 0xb4, 0x9a, 0x2e, 0xd9, 0x25, 0x2d, + 0xc4, 0x0b, 0x28, 0x10, 0xf0, 0x31, 0xa8, 0x0e, 0xf5, 0x3c, 0x3a, 0x92, + 0xeb, 0x07, 0x8f, 0x84, 0x2d, 0x2b, 0x7f, 0xf4, 0x11, 0xb0, 0xf2, 0xf2, + 0xcd, 0x2f, 0xa9, 0x47, 0x51, 0xe0, 0xac, 0x67, 0x23, 0x7e, 0xc7, 0x27, + 0xe2, 0xbc, 0x1d, 0xf8, 0x69, 0xa2, 0x9c, 0xbf, 0xe4, 0xc5, 0x43, 0xce, + 0xf3, 0xff, 0x67, 0xef, 0xed, 0xc3, 0xe4, 0x28, 0xee, 0x7b, 0xdf, 0x8f, + 0xec, 0x11, 0xd4, 0x38, 0xb3, 0xa6, 0x87, 0xac, 0x9c, 0x19, 0x58, 0x91, + 0x69, 0xb2, 0xc2, 0x1a, 0x19, 0xc5, 0x1a, 0x19, 0xdb, 0xec, 0x5a, 0xc4, + 0xd2, 0x12, 0x88, 0xb4, 0xb6, 0x73, 0x6d, 0x11, 0x6c, 0x23, 0xa3, 0x73, + 0x05, 0xc2, 0x79, 0xb1, 0x04, 0xb1, 0xaf, 0x70, 0x72, 0x1d, 0x89, 0x1c, + 0x12, 0xa4, 0xe3, 0x9b, 0x83, 0x75, 0x9c, 0x0b, 0x92, 0xe3, 0xe7, 0xc1, + 0x02, 0x25, 0x18, 0x89, 0x18, 0xa3, 0xf8, 0x04, 0x7b, 0x25, 0x1b, 0xb3, + 0x2b, 0x5b, 0xca, 0x2e, 0x60, 0xa3, 0x11, 0x01, 0x34, 0x12, 0xbb, 0xa6, + 0x27, 0xd6, 0x9a, 0x99, 0xa0, 0x89, 0xa7, 0x61, 0x27, 0x77, 0x0a, 0x33, + 0x09, 0xf7, 0x8f, 0xaa, 0xea, 0x97, 0x79, 0xd9, 0x5d, 0xf1, 0xe2, 0xb7, + 0xf4, 0x57, 0xcf, 0xaa, 0xab, 0xeb, 0xbd, 0xbb, 0xa7, 0xbb, 0xab, 0xaa, + 0xeb, 0xf7, 0xa9, 0x85, 0x8b, 0xba, 0x38, 0x7e, 0x4c, 0x19, 0x83, 0xef, + 0xd2, 0x7e, 0xeb, 0x81, 0xad, 0xd7, 0x00, 0x7f, 0x59, 0xc2, 0x99, 0x9f, + 0x66, 0x18, 0xf8, 0x02, 0xd0, 0xfb, 0xc8, 0x14, 0x13, 0xef, 0xee, 0x62, + 0x21, 0x6a, 0xd8, 0xe7, 0xf8, 0xb1, 0x29, 0x98, 0x82, 0xe1, 0xc3, 0x82, + 0x81, 0x65, 0xad, 0x4f, 0xb1, 0xed, 0x9f, 0xdf, 0x12, 0xd8, 0xfb, 0x18, + 0xcf, 0x14, 0x36, 0xb0, 0xe8, 0x92, 0x7d, 0x2c, 0x79, 0xb1, 0x15, 0xdc, + 0x1d, 0xf4, 0xd9, 0xa2, 0xc1, 0x0b, 0x47, 0xcf, 0x54, 0xdb, 0xcb, 0x17, + 0x75, 0xcd, 0x0a, 0xa8, 0x05, 0x0a, 0x92, 0x75, 0xb0, 0xc5, 0x37, 0xc3, + 0xba, 0x75, 0xb0, 0x7b, 0xb7, 0xda, 0x3b, 0x78, 0xd0, 0x8f, 0xdb, 0xac, + 0xe3, 0xc7, 0xa6, 0x08, 0x76, 0xf5, 0x96, 0xbc, 0x08, 0x73, 0xa6, 0x1c, + 0x5e, 0x6e, 0x2a, 0xda, 0xec, 0xef, 0xbd, 0x19, 0x3c, 0x3c, 0xcd, 0x6e, + 0xe0, 0xe6, 0x4c, 0x88, 0x62, 0xb3, 0xb7, 0xe8, 0xef, 0xdc, 0xfc, 0xf7, + 0x53, 0x2a, 0x4e, 0x50, 0xbb, 0x51, 0x70, 0xac, 0x9b, 0x03, 0x7e, 0xeb, + 0x5a, 0xeb, 0xe5, 0xe7, 0xf1, 0x04, 0x1f, 0x5d, 0x9c, 0xf1, 0xd3, 0x92, + 0x61, 0xa6, 0x4f, 0xd0, 0xab, 0x57, 0xa4, 0xd9, 0x37, 0x52, 0xf2, 0xa2, + 0xad, 0xbe, 0x44, 0xbd, 0xdb, 0x86, 0x0e, 0xf9, 0xe3, 0x45, 0x83, 0x97, + 0xf8, 0x63, 0x1d, 0x41, 0x7f, 0x03, 0x11, 0x5a, 0xb3, 0x22, 0xcd, 0x9e, + 0x91, 0x92, 0xe7, 0x36, 0x32, 0x7e, 0xb3, 0xf5, 0x07, 0x18, 0x9d, 0x50, + 0xef, 0xf8, 0xfe, 0x5e, 0x8b, 0xd1, 0x09, 0x17, 0x79, 0xab, 0xa4, 0xff, + 0xd3, 0x29, 0xfa, 0x3f, 0x9d, 0x62, 0x45, 0xd9, 0xf6, 0x80, 0xa0, 0xff, + 0x34, 0xfa, 0x18, 0xfb, 0x6a, 0x57, 0x03, 0xb0, 0xfd, 0xf2, 0xc2, 0xb4, + 0xc7, 0x78, 0xf5, 0x9a, 0xf7, 0xb0, 0xfe, 0x62, 0x7f, 0xcc, 0xca, 0x80, + 0xb4, 0xd2, 0x17, 0xd9, 0xe4, 0x0e, 0x16, 0xc8, 0x9f, 0x26, 0x58, 0xab, + 0x59, 0x41, 0xa0, 0xd6, 0x43, 0xdf, 0xfd, 0x27, 0xde, 0xf3, 0xfb, 0xfe, + 0xbe, 0x81, 0x67, 0x95, 0x27, 0x25, 0xe5, 0x1b, 0x4a, 0xa4, 0xdf, 0x69, + 0xb1, 0x74, 0x7e, 0x9d, 0x2d, 0x16, 0xc8, 0xb2, 0x84, 0x32, 0xa1, 0x76, + 0x9f, 0xd1, 0x50, 0xf5, 0xd3, 0x14, 0x9e, 0x90, 0xe4, 0x16, 0xea, 0xb0, + 0x87, 0xdb, 0xb7, 0x04, 0x36, 0xdf, 0xb4, 0x83, 0x6d, 0xb7, 0x6c, 0xe4, + 0xc6, 0x4d, 0x1b, 0x19, 0x38, 0xcd, 0x7a, 0x57, 0x75, 0x1f, 0x36, 0x9d, + 0xca, 0x52, 0xaf, 0xb8, 0x2d, 0xa8, 0xd5, 0xed, 0x5f, 0x2f, 0xb0, 0xe9, + 0xfd, 0x59, 0xb6, 0x7f, 0xbd, 0xa8, 0x7d, 0xb6, 0x02, 0x30, 0x3c, 0xb9, + 0x87, 0x7d, 0x13, 0x43, 0x58, 0x62, 0x90, 0x64, 0x77, 0x5a, 0x81, 0x9e, + 0x1a, 0x92, 0x6a, 0x13, 0x24, 0xdf, 0x4a, 0x28, 0x28, 0xa5, 0x15, 0x4b, + 0xe1, 0xea, 0xbb, 0x58, 0xb9, 0xc3, 0x4a, 0xa6, 0xd2, 0xb8, 0x93, 0xea, + 0x2d, 0xed, 0x36, 0xca, 0x08, 0x61, 0xe3, 0xd6, 0x4c, 0xbf, 0xed, 0xab, + 0x6d, 0xeb, 0x6e, 0x99, 0x53, 0xd6, 0x40, 0xfd, 0x76, 0xa5, 0xa0, 0x14, + 0x68, 0xc5, 0x58, 0x31, 0x3c, 0x58, 0xbe, 0xdb, 0xb0, 0x5a, 0x33, 0x98, + 0x41, 0x75, 0x5d, 0xd7, 0x72, 0xa0, 0x7e, 0x52, 0x56, 0x43, 0x75, 0xad, + 0x96, 0x4b, 0x08, 0x61, 0x23, 0x6b, 0xb7, 0x04, 0xea, 0xfa, 0x7b, 0xa1, + 0x7c, 0xac, 0x58, 0x8a, 0xa2, 0xfb, 0x05, 0xf2, 0xc7, 0xf7, 0x91, 0x5b, + 0xa8, 0xe3, 0x95, 0x81, 0xc4, 0x6a, 0x5c, 0x39, 0xea, 0xe5, 0xa7, 0x40, + 0x5a, 0x9f, 0xa0, 0xe8, 0x7e, 0x01, 0x2b, 0xb1, 0xda, 0x83, 0x89, 0x59, + 0xd6, 0xb5, 0x2d, 0xe7, 0xd5, 0xee, 0xc9, 0x86, 0xbe, 0x01, 0xb5, 0xd3, + 0xc1, 0xa6, 0xfd, 0xe2, 0x34, 0x71, 0x33, 0x4d, 0xf1, 0xa6, 0x8b, 0x0b, + 0xd0, 0x7b, 0x00, 0xd6, 0x2d, 0x57, 0xee, 0x2d, 0x93, 0x3e, 0x30, 0xea, + 0x83, 0x1f, 0x84, 0x8d, 0x1b, 0x37, 0xf2, 0xdb, 0xbf, 0xbd, 0xa3, 0x3d, + 0x44, 0x2a, 0x30, 0xb0, 0xb4, 0x63, 0x02, 0x56, 0x06, 0x20, 0x5a, 0x13, + 0x33, 0x01, 0xb5, 0xf0, 0xe3, 0x4f, 0x1c, 0x00, 0x0e, 0x40, 0x6f, 0xaf, + 0x9f, 0x97, 0x01, 0x58, 0xad, 0x6c, 0xce, 0xeb, 0x80, 0x86, 0x55, 0x1d, + 0x84, 0x89, 0x0f, 0xea, 0xb1, 0xa8, 0x8d, 0x2b, 0xe1, 0x93, 0x3b, 0x98, + 0x3c, 0x48, 0x68, 0xa0, 0xca, 0x00, 0xb0, 0x36, 0x06, 0x06, 0xbb, 0x76, + 0xf4, 0xaa, 0xf1, 0xba, 0x60, 0x9e, 0x33, 0x01, 0xb5, 0x4c, 0x9c, 0x89, + 0x00, 0x7c, 0xab, 0x5d, 0x5d, 0x4d, 0xbc, 0x60, 0x7e, 0x13, 0x13, 0x7a, + 0xac, 0xaf, 0x17, 0x56, 0x1a, 0xf7, 0x2c, 0x66, 0x11, 0x79, 0xf0, 0xaa, + 0x27, 0x1d, 0xc8, 0xa4, 0xa1, 0x51, 0x47, 0xba, 0x1a, 0xf2, 0xf1, 0x0a, + 0x60, 0xc8, 0xaf, 0x97, 0x44, 0x31, 0xf0, 0x5b, 0x6e, 0xc8, 0xd0, 0x02, + 0x1a, 0xde, 0x17, 0x3a, 0x7d, 0x2c, 0x1e, 0x58, 0x2b, 0xd6, 0xae, 0x27, + 0xe4, 0xef, 0xab, 0x6e, 0x69, 0x3b, 0x4c, 0x93, 0xf2, 0x0f, 0xf6, 0xf7, + 0x4d, 0xd4, 0xd4, 0x03, 0x0a, 0xbe, 0x25, 0xa5, 0x4b, 0x66, 0x44, 0xe0, + 0x56, 0x1c, 0xdd, 0xe6, 0x2e, 0x7b, 0xfd, 0x84, 0xe0, 0xf6, 0xb5, 0xd4, + 0xab, 0xc9, 0x2f, 0x13, 0x83, 0x62, 0x03, 0xe2, 0x08, 0x68, 0x40, 0xdd, + 0x27, 0x8b, 0xa9, 0x6d, 0x03, 0xb2, 0xfa, 0x9c, 0x3a, 0x81, 0xeb, 0x6e, + 0x3e, 0x27, 0xea, 0x1a, 0x78, 0xfe, 0xc2, 0xdb, 0xd7, 0x69, 0x08, 0x5f, + 0x0f, 0x50, 0x10, 0xae, 0x82, 0xce, 0x83, 0x0a, 0x0c, 0xc4, 0x60, 0xb4, + 0xa1, 0xc6, 0x24, 0xae, 0xab, 0x48, 0x64, 0x4c, 0x81, 0xa3, 0x14, 0xac, + 0x4a, 0x90, 0xd3, 0x6b, 0xe7, 0x38, 0xfa, 0xfa, 0x15, 0x1a, 0x12, 0x51, + 0x01, 0x3b, 0x26, 0xbc, 0x3a, 0x05, 0x3f, 0xcb, 0x06, 0xbb, 0x64, 0xb6, + 0xfe, 0xad, 0xe7, 0xcb, 0xbe, 0xbf, 0x01, 0x6a, 0x99, 0x74, 0x39, 0x0b, + 0xf2, 0x35, 0x30, 0x4b, 0xff, 0x88, 0x98, 0xe9, 0xff, 0xd5, 0x71, 0x1a, + 0xba, 0xaf, 0xa4, 0x81, 0x58, 0x52, 0x4a, 0x1c, 0x7d, 0x0c, 0xa9, 0x43, + 0xfb, 0x58, 0xff, 0x47, 0x37, 0x52, 0xaa, 0x94, 0x28, 0x3c, 0xa9, 0xda, + 0x0c, 0xb9, 0x5c, 0x8e, 0xc1, 0x55, 0x83, 0xe4, 0x16, 0xe7, 0x18, 0x7a, + 0x70, 0x88, 0xa1, 0xcf, 0x7f, 0x0e, 0x04, 0x38, 0xf8, 0x80, 0x9c, 0x52, + 0x0c, 0xb2, 0x28, 0xc8, 0x97, 0x88, 0xa9, 0x7b, 0x4d, 0x04, 0xee, 0x49, + 0x81, 0x06, 0x37, 0xbb, 0x0a, 0x98, 0xe5, 0x34, 0x2d, 0xf6, 0x52, 0x08, + 0x9c, 0x4d, 0xf5, 0x4b, 0xae, 0x42, 0xa3, 0x33, 0x44, 0xdd, 0xe8, 0x2c, + 0x31, 0x87, 0xb3, 0xb9, 0x80, 0x73, 0xcf, 0x3d, 0x97, 0xe3, 0xa5, 0xef, + 0xf1, 0xec, 0x0b, 0xaa, 0x2d, 0x3e, 0xcf, 0x03, 0x49, 0xa9, 0xb6, 0xfd, + 0x0f, 0x50, 0xfe, 0x4b, 0xde, 0xfc, 0x56, 0x8e, 0xbe, 0x70, 0xc2, 0xdb, + 0x06, 0xd5, 0x0c, 0xb0, 0xea, 0x54, 0xde, 0x59, 0x42, 0xc1, 0xa7, 0xe2, + 0x31, 0x3f, 0x7e, 0xe9, 0x54, 0x85, 0x52, 0x4d, 0x81, 0xb4, 0x0c, 0x4c, + 0xcb, 0x68, 0x59, 0x6e, 0x3e, 0x87, 0x47, 0xf3, 0xfc, 0x86, 0x06, 0xf6, + 0x18, 0x30, 0xd7, 0x4c, 0x3a, 0xef, 0xcd, 0xad, 0x75, 0x09, 0xa6, 0x4d, + 0xa5, 0xe1, 0xec, 0x9b, 0x6f, 0xe6, 0x5d, 0xe3, 0x47, 0xbd, 0x70, 0xe7, + 0xe8, 0x51, 0xfe, 0x5e, 0x6f, 0x59, 0x3a, 0x33, 0x4c, 0xab, 0xdd, 0xf1, + 0x4d, 0x17, 0xf6, 0xe8, 0xe2, 0x06, 0x7f, 0xfe, 0x96, 0x95, 0x1c, 0x7b, + 0xe8, 0x21, 0x80, 0x10, 0x60, 0xeb, 0xc5, 0x5e, 0xf8, 0x2a, 0x2f, 0xa9, + 0x97, 0xcf, 0xed, 0x07, 0x38, 0x53, 0x3f, 0xbf, 0x0d, 0x3c, 0xeb, 0x4f, + 0x57, 0xfa, 0xe9, 0x00, 0x1e, 0x78, 0x49, 0xa5, 0x3d, 0x71, 0xe2, 0x04, + 0xe7, 0xbc, 0xb9, 0x0b, 0xe6, 0xcc, 0xae, 0xd7, 0x2b, 0x12, 0x16, 0xd4, + 0xea, 0xc4, 0x85, 0xc0, 0x12, 0x82, 0x54, 0xca, 0x6f, 0x1f, 0xdb, 0x19, + 0x3b, 0xf4, 0xde, 0x2f, 0xc5, 0xd4, 0x37, 0xf9, 0x7a, 0xa5, 0x8e, 0x53, + 0x71, 0x70, 0x46, 0x1c, 0x92, 0xfa, 0xd6, 0x4e, 0x63, 0x51, 0x95, 0x25, + 0xea, 0x95, 0x3a, 0xd9, 0xc5, 0x4b, 0x29, 0x3c, 0x71, 0x84, 0xf5, 0x7f, + 0xb4, 0x81, 0xd2, 0xc4, 0x30, 0x69, 0x99, 0xa6, 0x54, 0x53, 0xcf, 0x61, + 0x29, 0xa5, 0xf7, 0x9d, 0xbe, 0x5a, 0xc1, 0x03, 0x72, 0xd7, 0x6b, 0x90, + 0xb4, 0x04, 0x58, 0x0a, 0xb9, 0x5d, 0x95, 0x2e, 0xf1, 0x84, 0xca, 0xf9, + 0x73, 0xb7, 0xed, 0xc4, 0x4e, 0xa5, 0x29, 0x1c, 0x3f, 0x42, 0xba, 0x57, + 0xd5, 0xaf, 0x34, 0x51, 0x52, 0xdf, 0x9f, 0xb5, 0x92, 0xdd, 0x02, 0x29, + 0x80, 0x38, 0x64, 0x53, 0xea, 0x5b, 0x6a, 0x55, 0x56, 0x41, 0x0a, 0x04, + 0x42, 0x41, 0xc3, 0xaa, 0x82, 0xba, 0x9e, 0x70, 0x11, 0xd7, 0x37, 0xbb, + 0xd9, 0x22, 0x21, 0x9d, 0x4c, 0x53, 0xaa, 0xaa, 0x7a, 0x8a, 0x24, 0x70, + 0x0a, 0x68, 0x88, 0xd0, 0x97, 0x09, 0xd3, 0xc6, 0x0b, 0xbd, 0x1e, 0x2c, + 0x10, 0x71, 0x01, 0x75, 0xfd, 0x0d, 0xb3, 0xe9, 0xdd, 0xd1, 0x02, 0xce, + 0xd2, 0xaf, 0x97, 0x90, 0x7f, 0x4c, 0x20, 0x84, 0x02, 0x7f, 0xa5, 0x7b, + 0x6d, 0x5c, 0x0d, 0x81, 0x54, 0x71, 0x5c, 0xa4, 0x94, 0x0c, 0x1f, 0x3d, + 0x42, 0xb6, 0x27, 0xad, 0x20, 0x61, 0x12, 0x05, 0xdd, 0x8a, 0x4d, 0xdf, + 0xd6, 0x6c, 0x06, 0x5d, 0x05, 0xc1, 0x4e, 0xcd, 0x61, 0xc6, 0xfd, 0xf2, + 0xbc, 0x7b, 0xd5, 0xb1, 0x9e, 0xb9, 0x0e, 0xe6, 0x0b, 0x38, 0x29, 0xbd, + 0x70, 0x39, 0x29, 0x11, 0x7d, 0x96, 0xf2, 0x9b, 0x2f, 0x42, 0xe3, 0x77, + 0x9d, 0x40, 0x5c, 0x46, 0x06, 0xa8, 0x65, 0xdc, 0x63, 0x9a, 0xca, 0x6d, + 0xe0, 0x5b, 0xf9, 0xa7, 0x1c, 0x55, 0xde, 0xa4, 0xce, 0xdb, 0x94, 0x3d, + 0x5f, 0xf0, 0xb1, 0xd8, 0xc7, 0xc8, 0x2d, 0xcc, 0xb2, 0xf1, 0x8e, 0x8d, + 0xde, 0x71, 0x98, 0x32, 0x8d, 0x1b, 0xc0, 0x5e, 0x30, 0x9f, 0xf3, 0x52, + 0xed, 0xbf, 0x00, 0x9e, 0xf3, 0x6b, 0xbf, 0x8e, 0xbd, 0x60, 0x3e, 0x4f, + 0xd5, 0xf2, 0x6d, 0x01, 0x57, 0x5e, 0xbe, 0xba, 0x0e, 0xc6, 0xbd, 0xde, + 0x5e, 0xcf, 0xae, 0x43, 0x3b, 0x43, 0xc7, 0xd8, 0x0e, 0x9c, 0xd5, 0x0c, + 0xfd, 0x32, 0xe7, 0x29, 0x04, 0xec, 0xea, 0xd3, 0x63, 0xe1, 0x63, 0x2e, + 0x27, 0xa7, 0x3a, 0xaf, 0x70, 0x12, 0x04, 0x6a, 0x4d, 0x17, 0x2f, 0x52, + 0xa4, 0x48, 0x91, 0x22, 0x45, 0x8a, 0x14, 0x29, 0x52, 0xa4, 0x48, 0x91, + 0x22, 0x45, 0x8a, 0x14, 0x29, 0x52, 0xa4, 0x48, 0x91, 0x22, 0x45, 0x8a, + 0x14, 0x29, 0x52, 0xa4, 0x48, 0x91, 0x22, 0xcd, 0x5e, 0x11, 0x54, 0x2b, + 0x52, 0xa4, 0x48, 0x91, 0x22, 0x45, 0xfa, 0x39, 0xd0, 0x6c, 0xa0, 0x4c, + 0xc1, 0x38, 0xcd, 0xee, 0x74, 0x4f, 0xba, 0x05, 0x9a, 0x22, 0x62, 0x0a, + 0x50, 0x25, 0x62, 0xc2, 0x83, 0x70, 0x05, 0xd3, 0xa4, 0x7a, 0x52, 0x94, + 0x2a, 0xbe, 0x31, 0xb8, 0x01, 0x6b, 0x01, 0x94, 0x27, 0xcb, 0xf4, 0x2d, + 0xeb, 0x63, 0xe4, 0xdb, 0xfe, 0x2a, 0xf1, 0x66, 0xd2, 0x75, 0xe1, 0xb8, + 0x9a, 0x8e, 0xeb, 0x14, 0x1d, 0xac, 0x6e, 0x8b, 0x64, 0x22, 0x3c, 0x11, + 0xb7, 0x54, 0x2e, 0xd1, 0x7f, 0x71, 0x3f, 0xc3, 0x07, 0x4f, 0x0f, 0x46, + 0x20, 0x0d, 0x14, 0x25, 0xe6, 0x03, 0xae, 0xda, 0xd5, 0xdd, 0x1c, 0x9b, + 0x89, 0x13, 0x3c, 0xd6, 0xe9, 0xdc, 0x66, 0x3f, 0xb4, 0xda, 0xa9, 0xde, + 0xf7, 0x8c, 0xd4, 0x03, 0xfb, 0xc1, 0xb4, 0xd5, 0x5a, 0x2b, 0x14, 0xa0, + 0x5d, 0xbe, 0x22, 0x26, 0x66, 0x86, 0x3e, 0x74, 0x76, 0xa8, 0xbc, 0xcc, + 0xfc, 0x4d, 0x39, 0x8d, 0x91, 0xb1, 0xb7, 0xe2, 0xb0, 0x9e, 0x06, 0x9e, + 0x13, 0xc8, 0xbc, 0xab, 0xe0, 0x59, 0x46, 0x8e, 0x84, 0x94, 0xe5, 0xfb, + 0xa5, 0x2c, 0x48, 0x03, 0x25, 0xd4, 0x76, 0x5c, 0xd7, 0xbf, 0x2f, 0x45, + 0x7d, 0x5c, 0xc3, 0xa9, 0x16, 0x68, 0x80, 0x54, 0x0c, 0x18, 0x97, 0x7e, + 0x9a, 0x71, 0xa9, 0x2c, 0x86, 0x9c, 0x50, 0x07, 0xff, 0x72, 0x00, 0x00, + 0x20, 0x00, 0x49, 0x44, 0x41, 0x54, 0xa0, 0x9f, 0x0b, 0x3d, 0xca, 0x6d, + 0xd2, 0xd7, 0x0d, 0x68, 0xea, 0x9d, 0x29, 0xe2, 0x8e, 0xab, 0x60, 0x5b, + 0x41, 0xf8, 0x94, 0xf6, 0x63, 0x9e, 0x00, 0xc7, 0x55, 0x10, 0x2c, 0x53, + 0xa6, 0x09, 0x3f, 0x8d, 0xf4, 0x74, 0x0b, 0xbf, 0xce, 0xae, 0xc6, 0x4c, + 0x05, 0xf3, 0x4f, 0x08, 0x55, 0xd7, 0x86, 0x32, 0x14, 0x63, 0xbc, 0xac, + 0x00, 0x5a, 0x69, 0xd4, 0x6c, 0xf4, 0x14, 0x90, 0xb5, 0x94, 0x7b, 0x85, + 0xde, 0x2e, 0xb4, 0x20, 0x2d, 0xfc, 0x3a, 0x15, 0x82, 0xe5, 0x4b, 0x95, + 0xff, 0x2c, 0x80, 0x5a, 0xea, 0x3a, 0x29, 0x8b, 0x64, 0x2b, 0x61, 0x26, + 0xd8, 0x4b, 0x0f, 0x9c, 0x55, 0x2e, 0x17, 0x74, 0x58, 0x0a, 0xb7, 0x56, + 0x26, 0x95, 0xca, 0x92, 0xd2, 0xf7, 0x92, 0x6c, 0xf3, 0x7b, 0x33, 0x9a, + 0x09, 0xbc, 0xe5, 0xd6, 0xa6, 0x37, 0x6c, 0xb2, 0x12, 0x76, 0xc7, 0x38, + 0x26, 0x6c, 0xba, 0x38, 0x46, 0x69, 0xb2, 0x58, 0x96, 0x82, 0xd7, 0xa5, + 0x52, 0xa9, 0x96, 0x67, 0x98, 0xeb, 0xba, 0xa4, 0x7b, 0xd2, 0x8c, 0x3e, + 0x3c, 0x8a, 0xdd, 0x63, 0x53, 0x75, 0xab, 0x2d, 0x79, 0xb6, 0x33, 0x26, + 0xaf, 0x37, 0x3a, 0xaf, 0xac, 0xdb, 0xae, 0x4e, 0x42, 0x08, 0xaf, 0x1e, + 0xed, 0x54, 0x2a, 0x97, 0xc8, 0x2d, 0xc9, 0x91, 0x3f, 0xaa, 0x40, 0x51, + 0xb2, 0x09, 0x98, 0x64, 0xce, 0x3f, 0x84, 0x41, 0x18, 0x41, 0xc8, 0x94, + 0x6c, 0x32, 0xb4, 0x69, 0xa7, 0xa4, 0x48, 0x92, 0xec, 0x49, 0xe2, 0x4c, + 0x6a, 0x8f, 0x98, 0x3f, 0x21, 0x3a, 0x2e, 0xe2, 0xd4, 0x03, 0x2b, 0x06, + 0xaf, 0xb9, 0x72, 0x35, 0x77, 0xde, 0xbd, 0x0f, 0x1a, 0x12, 0xa7, 0xe8, + 0x20, 0xab, 0x2e, 0x9b, 0xae, 0xdf, 0xa0, 0xca, 0x9d, 0x92, 0xa0, 0xcf, + 0x41, 0xbd, 0xa1, 0xea, 0x71, 0xe4, 0xe8, 0x11, 0x00, 0xec, 0x05, 0x76, + 0xcb, 0xf3, 0xd0, 0x84, 0x59, 0x01, 0xa0, 0x96, 0xac, 0x49, 0xdc, 0x4a, + 0x19, 0xab, 0x3b, 0xa5, 0x8f, 0x41, 0x62, 0x59, 0xe1, 0x74, 0x05, 0xc7, + 0x69, 0x81, 0x70, 0x99, 0xc3, 0xcf, 0xe5, 0xc2, 0xab, 0x7c, 0x1b, 0x60, + 0x99, 0x39, 0x1f, 0x2a, 0xae, 0xd4, 0xf0, 0xb1, 0xf0, 0x79, 0x68, 0xb7, + 0xaa, 0xb2, 0x97, 0x4f, 0x4c, 0xc1, 0xaf, 0x9a, 0x81, 0x5b, 0xc6, 0xbf, + 0x53, 0xfc, 0xe6, 0xf0, 0xe0, 0xef, 0x26, 0x04, 0xd1, 0xd2, 0x6e, 0x53, + 0x87, 0x66, 0x43, 0xa1, 0x99, 0xca, 0x99, 0xad, 0x9a, 0x21, 0x53, 0x13, + 0xc0, 0xaf, 0x4f, 0x13, 0xdf, 0x40, 0x9c, 0x0e, 0x80, 0x87, 0x98, 0x5a, + 0xa9, 0xb1, 0x4e, 0xc6, 0xed, 0xc3, 0xa0, 0x7c, 0xeb, 0x39, 0x13, 0x36, + 0xc1, 0x04, 0xbd, 0xfa, 0xdf, 0x37, 0x79, 0x6d, 0x61, 0x5a, 0xcd, 0xf5, + 0x34, 0x25, 0xf7, 0x06, 0x8e, 0x70, 0x63, 0x07, 0xc0, 0x96, 0x01, 0x83, + 0x99, 0x34, 0x41, 0x10, 0xd8, 0x74, 0xc7, 0x14, 0x84, 0x63, 0xe1, 0x9d, + 0x17, 0x05, 0xf2, 0x3a, 0xc0, 0x01, 0x26, 0x50, 0xb0, 0xad, 0x76, 0x10, + 0x2d, 0x03, 0x26, 0xeb, 0x0d, 0x94, 0xd9, 0xeb, 0x95, 0xd1, 0x0e, 0xdb, + 0xe5, 0xd7, 0x3f, 0x08, 0x35, 0x33, 0x9a, 0x1e, 0x7d, 0xe1, 0xeb, 0xa1, + 0x23, 0x4f, 0xf1, 0x3e, 0xbf, 0x39, 0xc4, 0xa5, 0x4b, 0xdf, 0xc6, 0x43, + 0x47, 0x9e, 0xe2, 0xd2, 0xa5, 0x3f, 0x1b, 0xb0, 0x96, 0x01, 0x6a, 0x65, + 0x2d, 0x0b, 0x91, 0x80, 0x7d, 0x13, 0x65, 0x0f, 0xa6, 0xd5, 0x0c, 0xd9, + 0xfa, 0x45, 0x56, 0xe1, 0x09, 0x6d, 0x9c, 0xde, 0x98, 0x19, 0xa8, 0xe5, + 0xc3, 0xb4, 0x94, 0xda, 0x01, 0x61, 0x7e, 0x26, 0xfa, 0xab, 0x0d, 0xb0, + 0x6a, 0xd0, 0xdf, 0x1f, 0x19, 0x81, 0x49, 0x07, 0xcd, 0x11, 0x62, 0x64, + 0x04, 0xca, 0x8b, 0x61, 0xe8, 0x89, 0x70, 0x32, 0x11, 0x07, 0x12, 0xed, + 0xb3, 0x4c, 0x5d, 0xbc, 0x1e, 0x9e, 0x00, 0x2e, 0x86, 0xb2, 0x87, 0x97, + 0x68, 0xa3, 0x76, 0x40, 0xad, 0x57, 0x1a, 0x6f, 0xd7, 0x16, 0xb8, 0x2c, + 0x60, 0x26, 0xff, 0xe0, 0x30, 0x24, 0x04, 0x1c, 0x2f, 0xc0, 0xb8, 0x03, + 0x1f, 0xd0, 0xc7, 0x18, 0x7c, 0x07, 0x34, 0x01, 0xb5, 0xac, 0x8b, 0xae, + 0xc0, 0xfd, 0xfe, 0xfd, 0xb3, 0xac, 0xd4, 0xeb, 0x2f, 0x79, 0x2a, 0x8e, + 0xd0, 0xaf, 0x41, 0x19, 0xb0, 0xad, 0xad, 0x3a, 0x55, 0x92, 0x76, 0xd2, + 0x73, 0x7b, 0xf1, 0xcb, 0x20, 0x52, 0x6a, 0x6b, 0x94, 0x99, 0x6f, 0xfa, + 0x40, 0x16, 0x5f, 0xfe, 0x42, 0xd8, 0xe0, 0xbe, 0x78, 0x52, 0xb5, 0x59, + 0xb6, 0x7e, 0xfe, 0xa6, 0x16, 0x80, 0x4e, 0xb3, 0xa1, 0x6c, 0xb3, 0x3f, + 0x40, 0xae, 0x37, 0xc5, 0xc0, 0x8a, 0xe9, 0xd1, 0x04, 0x76, 0xc6, 0x66, + 0xd7, 0x5d, 0xbb, 0xc8, 0x4f, 0x94, 0xc3, 0x86, 0xb7, 0x35, 0x03, 0xc5, + 0x0a, 0x03, 0xb9, 0x3c, 0x53, 0xdf, 0x8a, 0xf4, 0xc0, 0x5a, 0x52, 0x4a, + 0xb2, 0xa9, 0x2a, 0xeb, 0xaf, 0x59, 0x8f, 0x53, 0xcc, 0x75, 0x2c, 0x0b, + 0xa0, 0x3a, 0x52, 0xa7, 0xa0, 0x1f, 0xa1, 0xb2, 0xe6, 0x2a, 0xa3, 0x3b, + 0xe0, 0xa1, 0xaf, 0xac, 0x6e, 0x89, 0x2b, 0xa5, 0x04, 0x29, 0x11, 0xda, + 0xb8, 0xad, 0xef, 0x1f, 0xad, 0xe6, 0x08, 0x1e, 0x9c, 0x0b, 0x60, 0xcb, + 0x17, 0x6e, 0x9d, 0x36, 0xfd, 0x2d, 0x9f, 0xfe, 0xc4, 0xb4, 0x75, 0x3b, + 0x1d, 0x89, 0x26, 0xb7, 0x64, 0x76, 0xcf, 0x88, 0xae, 0x53, 0xa7, 0x78, + 0xf1, 0xd4, 0x29, 0xfe, 0x35, 0xe8, 0x17, 0x70, 0x3f, 0xf3, 0xed, 0x6f, + 0x33, 0x35, 0x6f, 0x1e, 0x73, 0xdb, 0xe4, 0x1f, 0x2c, 0xf7, 0xb5, 0x30, + 0x8b, 0x3e, 0xf5, 0xd2, 0x8b, 0x9c, 0x7a, 0xe9, 0x45, 0xfe, 0xfd, 0x19, + 0x65, 0xc4, 0xfa, 0x5c, 0x53, 0x19, 0xaf, 0x56, 0xed, 0xea, 0x2a, 0x00, + 0x29, 0xff, 0xbf, 0x70, 0xb8, 0x0c, 0x22, 0xbe, 0x5e, 0x9b, 0x32, 0xbd, + 0xb2, 0x38, 0xbd, 0xe3, 0xb1, 0x18, 0x05, 0xb2, 0x0c, 0x5e, 0xff, 0x31, + 0xf2, 0x23, 0x05, 0x2c, 0x8e, 0x00, 0x4b, 0x43, 0x71, 0x76, 0x68, 0xa0, + 0x96, 0xe9, 0xb7, 0x03, 0xd4, 0x6b, 0x75, 0xe2, 0xba, 0xaf, 0x56, 0x8a, + 0x29, 0xf0, 0x95, 0xd3, 0xf0, 0x8d, 0xaa, 0xdb, 0x01, 0xb5, 0x9c, 0x86, + 0x54, 0x86, 0xd9, 0x31, 0xb0, 0x1b, 0x41, 0xff, 0x3a, 0x76, 0xac, 0x7d, + 0xeb, 0xc2, 0xc1, 0x87, 0x6a, 0x81, 0xdf, 0x4e, 0x6d, 0xee, 0x0f, 0x35, + 0xc7, 0xeb, 0xa4, 0xd9, 0xc6, 0x6b, 0x4e, 0x33, 0xb0, 0x02, 0xdc, 0x27, + 0xa1, 0x5e, 0xab, 0x12, 0x4f, 0x24, 0xbd, 0x2d, 0x80, 0x25, 0xaa, 0x14, + 0x9e, 0xa8, 0x62, 0xcd, 0x4b, 0x62, 0xae, 0x40, 0xb5, 0xe2, 0xf7, 0xbf, + 0x64, 0x43, 0x1d, 0x5b, 0x2a, 0x0d, 0xf9, 0xf1, 0x32, 0xb9, 0x05, 0x29, + 0xd2, 0x89, 0x14, 0xa2, 0x4b, 0x42, 0x77, 0x3f, 0x96, 0x54, 0x86, 0xde, + 0x52, 0x4a, 0x84, 0x25, 0xc8, 0xe6, 0xd4, 0xfd, 0x9d, 0xcb, 0x80, 0xb9, + 0x9a, 0xc3, 0x4f, 0x82, 0x25, 0x04, 0x56, 0x26, 0x89, 0x74, 0xa1, 0xec, + 0x0c, 0x23, 0xa4, 0x05, 0x2f, 0x49, 0x44, 0xf2, 0xf5, 0x83, 0xb7, 0xbd, + 0x5e, 0x92, 0xd5, 0xff, 0xf4, 0xdc, 0xe2, 0xa7, 0x04, 0xbc, 0x2a, 0x05, + 0xca, 0xec, 0x64, 0x12, 0xff, 0x7a, 0xd6, 0xe5, 0x3b, 0xc0, 0x85, 0xda, + 0xfd, 0xab, 0x01, 0xff, 0x7f, 0x0b, 0xb8, 0x7f, 0xb5, 0xfa, 0x9f, 0x18, + 0xf3, 0xcf, 0x46, 0xe2, 0xf4, 0x0d, 0xcf, 0x01, 0xce, 0x7e, 0x09, 0x9e, + 0x7b, 0x64, 0x8a, 0xb7, 0xbc, 0xdb, 0x7f, 0xd2, 0xda, 0xc0, 0xc5, 0x5d, + 0xa0, 0xed, 0xf7, 0x3b, 0xea, 0xcf, 0x1f, 0xdd, 0xc4, 0x9a, 0x77, 0x6d, + 0x07, 0x14, 0x00, 0xac, 0xdd, 0x28, 0xdd, 0xc0, 0xe5, 0xa9, 0x26, 0x9f, + 0x7b, 0xd8, 0x73, 0x1f, 0x98, 0x1e, 0xc2, 0x0f, 0x81, 0xcb, 0x17, 0xc1, + 0xb9, 0x8f, 0xf8, 0x85, 0xd9, 0x6b, 0xc1, 0xb9, 0x1b, 0xfa, 0x08, 0x8f, + 0x4b, 0x7c, 0xeb, 0xd8, 0x14, 0xe7, 0xcd, 0xea, 0xa8, 0xc2, 0x3a, 0x78, + 0x10, 0x96, 0x2f, 0x57, 0x6e, 0x03, 0xd4, 0x5a, 0x77, 0x10, 0x0e, 0x7c, + 0x00, 0xc4, 0x03, 0x4d, 0x91, 0x8f, 0x4d, 0xf1, 0xd6, 0x77, 0x9b, 0x83, + 0xef, 0xe2, 0xc4, 0x23, 0x53, 0x1c, 0x9d, 0x02, 0xce, 0x04, 0xce, 0xb4, + 0x59, 0xf2, 0xa2, 0xe3, 0xc1, 0xc4, 0x5a, 0xb4, 0x3b, 0xa3, 0x40, 0x58, + 0xeb, 0x8a, 0xb0, 0x2e, 0xa3, 0xe1, 0x5a, 0xb0, 0x77, 0x9d, 0x0e, 0xbb, + 0x19, 0x9f, 0x62, 0x63, 0xfc, 0x9a, 0x55, 0xc4, 0x07, 0x6e, 0xed, 0x0e, + 0xf8, 0xaf, 0xcb, 0xf8, 0x7e, 0x37, 0xab, 0xbf, 0x7b, 0x9f, 0x40, 0x51, + 0x72, 0x8a, 0x3a, 0xe1, 0xd6, 0xd3, 0x45, 0x1a, 0xff, 0x7c, 0x69, 0xf0, + 0x22, 0x9b, 0xa1, 0x5b, 0x1d, 0x58, 0x2e, 0x18, 0x25, 0x4f, 0xff, 0x83, + 0x16, 0xfd, 0x9f, 0x4e, 0xcd, 0x1a, 0xa8, 0x65, 0xd4, 0xb7, 0x20, 0xc9, + 0xd8, 0x78, 0x95, 0xc1, 0x8b, 0xd4, 0xd3, 0xbb, 0x74, 0xb0, 0x40, 0xff, + 0xc1, 0x02, 0xa3, 0xcb, 0xb3, 0xe4, 0xbf, 0x3f, 0xfd, 0xf8, 0xdb, 0x74, + 0x7a, 0xe8, 0xbb, 0xff, 0x14, 0x82, 0x6a, 0x5d, 0xfa, 0x5b, 0xef, 0x81, + 0x85, 0xca, 0x2d, 0xa4, 0x24, 0x77, 0x9b, 0x2e, 0xef, 0x7f, 0x56, 0x49, + 0xff, 0x49, 0x12, 0xee, 0x6e, 0x3f, 0xe6, 0xb6, 0x71, 0xef, 0xa5, 0x20, + 0x61, 0xe9, 0x92, 0x24, 0x83, 0xc9, 0x5b, 0x19, 0xaa, 0x7e, 0x7a, 0x56, + 0xe5, 0x6f, 0xbb, 0x65, 0xe3, 0x2b, 0xae, 0x7b, 0xb2, 0x3b, 0x45, 0x59, + 0x8e, 0x02, 0xea, 0xf9, 0x6f, 0x89, 0x15, 0x5e, 0x98, 0x2b, 0x47, 0xc8, + 0x58, 0xa3, 0xdc, 0x7f, 0x58, 0x85, 0x5b, 0x62, 0x50, 0x6f, 0x53, 0x1e, + 0xf0, 0xa9, 0x59, 0xc5, 0x5a, 0x1e, 0x3a, 0xc2, 0xfb, 0x67, 0x07, 0xf5, + 0x97, 0xba, 0x3e, 0x19, 0xeb, 0x5a, 0x8a, 0xee, 0x60, 0x53, 0xa8, 0x8d, + 0x5b, 0x2b, 0x60, 0x59, 0x29, 0x5c, 0x19, 0x00, 0x6b, 0x69, 0x59, 0xfa, + 0x5d, 0xe7, 0x02, 0x2e, 0x92, 0xb8, 0x6b, 0x11, 0x07, 0xec, 0xee, 0x01, + 0xdc, 0xde, 0xd9, 0xbd, 0xb5, 0x73, 0xa9, 0xcd, 0xa1, 0xfd, 0x24, 0xeb, + 0x55, 0xc9, 0x3d, 0x39, 0x20, 0x17, 0x70, 0x9b, 0xf0, 0x34, 0x90, 0x0f, + 0xa4, 0x08, 0xa7, 0x07, 0x48, 0xa6, 0x6e, 0x69, 0xda, 0x4f, 0xeb, 0x74, + 0x39, 0x40, 0x62, 0xf7, 0x64, 0x55, 0xba, 0x06, 0x24, 0xbb, 0x4d, 0xfa, + 0xa6, 0x7a, 0xe8, 0xf1, 0xc3, 0x64, 0xc7, 0x37, 0x4f, 0x58, 0x13, 0x5f, + 0x37, 0x0e, 0x5a, 0xa8, 0xe6, 0x07, 0x0e, 0xac, 0x64, 0xe5, 0xca, 0x03, + 0xd3, 0xa6, 0x3f, 0x80, 0x86, 0x3a, 0x4d, 0xac, 0x04, 0x0e, 0xb0, 0xb2, + 0x17, 0x0c, 0xde, 0x5d, 0xf9, 0xe9, 0x78, 0x17, 0xea, 0xec, 0x7b, 0x0f, + 0xf0, 0xb5, 0xaf, 0xf5, 0xb2, 0xb1, 0xf7, 0x00, 0x5f, 0xbc, 0xb1, 0x17, + 0x0e, 0x4e, 0x30, 0xd1, 0x3c, 0x44, 0x14, 0xd8, 0x9f, 0x0d, 0x98, 0x6a, + 0x26, 0x99, 0xfc, 0x9b, 0x01, 0x56, 0xed, 0xa4, 0xc6, 0xcf, 0x60, 0xc7, + 0xc4, 0x04, 0xec, 0xd8, 0x41, 0x6f, 0x2f, 0xf4, 0x2c, 0x87, 0x89, 0x83, + 0x7e, 0xbd, 0x4c, 0xfa, 0x60, 0xbd, 0x57, 0x4e, 0x74, 0x1a, 0xe9, 0x7a, + 0xe5, 0x75, 0xdd, 0x31, 0x8b, 0xba, 0x06, 0xeb, 0xf4, 0x9d, 0xd3, 0x2c, + 0xab, 0x05, 0x5c, 0xd5, 0xec, 0xf7, 0xf3, 0x22, 0xdd, 0x17, 0x08, 0xf6, + 0xd7, 0xda, 0xf7, 0x3f, 0x74, 0xa8, 0x01, 0xe8, 0x79, 0x6a, 0xd7, 0x53, + 0x11, 0x21, 0xe0, 0x91, 0x1f, 0x3f, 0x00, 0xc2, 0xf6, 0xd2, 0xc5, 0x11, + 0x22, 0xee, 0x7d, 0x03, 0x72, 0x5d, 0x35, 0xd0, 0xf0, 0x6a, 0x40, 0x5a, + 0xb3, 0x49, 0x6b, 0xfa, 0x1e, 0xcd, 0xf1, 0x84, 0x10, 0x2d, 0xe3, 0x6a, + 0xcd, 0x2a, 0xea, 0xf0, 0x8c, 0x3e, 0x27, 0x45, 0x84, 0x02, 0x6b, 0x49, + 0xbf, 0x6f, 0xb4, 0x34, 0x21, 0x39, 0x52, 0x31, 0x79, 0x42, 0x5a, 0x4a, + 0xd4, 0x27, 0x6b, 0xe1, 0x1d, 0x7b, 0xf0, 0x8d, 0x27, 0x1b, 0xba, 0x9d, + 0x16, 0x0b, 0xf7, 0x00, 0xfd, 0xeb, 0x12, 0x38, 0xff, 0xc0, 0x40, 0x42, + 0x30, 0x5a, 0x93, 0x0c, 0x02, 0x7b, 0x74, 0x90, 0x65, 0x09, 0x72, 0x80, + 0xeb, 0x4a, 0xc6, 0x5c, 0x5d, 0x92, 0x5e, 0xbc, 0xc8, 0xb4, 0x02, 0x0b, + 0x0d, 0x7f, 0x3c, 0x24, 0x04, 0x7f, 0x91, 0x90, 0x4d, 0x68, 0xe0, 0x56, + 0x4d, 0xe2, 0x78, 0xe7, 0x47, 0x7f, 0xa3, 0x0d, 0x7c, 0xbf, 0x15, 0xa0, + 0xe0, 0x5d, 0x01, 0xf0, 0x9a, 0x6c, 0xd4, 0xf5, 0x00, 0x5e, 0x1c, 0x11, + 0xab, 0xab, 0xbe, 0x64, 0x10, 0xac, 0xd5, 0x00, 0x9b, 0x38, 0x6e, 0x45, + 0x2d, 0x48, 0x63, 0xf7, 0xd8, 0xa1, 0xef, 0xd3, 0x55, 0xb7, 0xca, 0xd0, + 0xc8, 0x10, 0x85, 0x7f, 0xd8, 0x87, 0x83, 0xfa, 0x18, 0x6c, 0x35, 0x14, + 0x54, 0x47, 0xc6, 0xe2, 0xc8, 0x86, 0x02, 0x63, 0x99, 0xdf, 0x95, 0xd0, + 0xfd, 0xd5, 0x42, 0x43, 0x9f, 0x2d, 0xed, 0x1f, 0xe8, 0xb1, 0x79, 0x67, + 0xcf, 0xc4, 0xf3, 0x42, 0x62, 0xe0, 0xcc, 0x02, 0xa8, 0x65, 0x34, 0x55, + 0x7a, 0x96, 0xe3, 0xa5, 0x67, 0x79, 0xf6, 0x85, 0xa9, 0x00, 0x4c, 0x4b, + 0xc9, 0x40, 0xb7, 0xca, 0xb1, 0x13, 0xd4, 0x1b, 0xe0, 0xc8, 0x13, 0x9c, + 0xf7, 0xe6, 0x39, 0xfc, 0x98, 0xa7, 0xdb, 0x42, 0xab, 0x66, 0xab, 0x66, + 0xf8, 0x54, 0x7a, 0x5e, 0x37, 0xe9, 0xc4, 0xc9, 0x96, 0x78, 0x69, 0x3d, + 0x5e, 0xba, 0xac, 0x5f, 0xbd, 0x0f, 0x6b, 0x6f, 0x3a, 0x49, 0xbd, 0xa1, + 0xe0, 0x58, 0xa0, 0x00, 0x59, 0x06, 0x94, 0x15, 0x04, 0x66, 0xcd, 0x54, + 0xb7, 0xb3, 0xce, 0x50, 0x75, 0x78, 0xd7, 0x89, 0xa3, 0x3c, 0xba, 0x60, + 0x09, 0xa0, 0x40, 0x5a, 0x1f, 0xf9, 0x15, 0x15, 0xfe, 0xae, 0xb7, 0xbe, + 0xf2, 0x63, 0x9b, 0x49, 0xbb, 0x9f, 0xfb, 0x26, 0x9b, 0x3f, 0xf7, 0xd7, + 0x6a, 0xe7, 0xc6, 0x1b, 0x3d, 0x7f, 0x03, 0xc9, 0x6a, 0x96, 0xf1, 0xff, + 0xab, 0x03, 0x07, 0xf8, 0xc0, 0xdc, 0xb9, 0x21, 0xb8, 0x56, 0xa7, 0x34, + 0xed, 0x24, 0x12, 0x16, 0xf5, 0x4a, 0x95, 0xb1, 0xef, 0xe7, 0x49, 0x75, + 0x5b, 0xc4, 0x45, 0x6b, 0xcf, 0x29, 0xff, 0x64, 0x01, 0x3b, 0x15, 0x18, + 0xd3, 0xab, 0xd4, 0xa1, 0x5b, 0xf5, 0x99, 0x36, 0x7c, 0x68, 0x03, 0xae, + 0x3b, 0xc6, 0xe8, 0xf7, 0x4a, 0x88, 0x2e, 0x81, 0x53, 0x75, 0x3d, 0x40, + 0xbe, 0x7b, 0xb2, 0x44, 0xda, 0x4a, 0xe3, 0xc6, 0xfc, 0x6f, 0xe9, 0x6e, + 0xbe, 0x4c, 0xfa, 0x9d, 0x36, 0x71, 0x91, 0xa4, 0x2a, 0x4b, 0x64, 0x7b, + 0x15, 0xf8, 0x2a, 0xde, 0x1d, 0xa7, 0x5e, 0x83, 0x78, 0xc2, 0xcc, 0x7d, + 0xd1, 0x00, 0x2c, 0xad, 0x78, 0x42, 0x01, 0xb7, 0x0a, 0xc7, 0x8f, 0x90, + 0xb4, 0x92, 0x1e, 0x4c, 0xcb, 0xc4, 0xb0, 0x7b, 0x6d, 0xea, 0x1a, 0xba, + 0xe6, 0x14, 0x0b, 0x0c, 0x5e, 0x3c, 0x18, 0x02, 0x81, 0xb9, 0x53, 0xe5, + 0x40, 0x3e, 0x3e, 0x4c, 0xab, 0x2e, 0x95, 0xdb, 0x6c, 0xe3, 0x96, 0xa0, + 0x7a, 0xaa, 0xaa, 0xc6, 0x2b, 0xbb, 0x44, 0x4b, 0xbf, 0xb3, 0xde, 0xa8, + 0x2a, 0x28, 0x78, 0xd3, 0x02, 0x08, 0xfe, 0xb8, 0x6b, 0x9b, 0xb9, 0x2c, + 0x81, 0x38, 0xf5, 0x4a, 0xdd, 0xab, 0x87, 0x88, 0x09, 0xa4, 0x79, 0x4f, + 0x34, 0x82, 0x8b, 0x29, 0x08, 0xe4, 0x94, 0xc4, 0xb6, 0xd2, 0x14, 0x2a, + 0x2e, 0x02, 0x81, 0x8c, 0x49, 0xec, 0x8c, 0x8d, 0xe8, 0x12, 0x94, 0x1e, + 0x18, 0xf5, 0xf2, 0xae, 0x36, 0xaa, 0xfa, 0xb9, 0x3e, 0xfd, 0xb7, 0x93, + 0x66, 0xb8, 0x53, 0x3b, 0x88, 0x16, 0x28, 0x90, 0xd6, 0xd6, 0xf1, 0x8f, + 0xf3, 0x11, 0x3e, 0xcd, 0xb8, 0xfb, 0x34, 0x0b, 0x16, 0x5c, 0xc0, 0xff, + 0xf1, 0xe4, 0xbf, 0xf3, 0xbf, 0xe7, 0x0b, 0x3f, 0x8f, 0x26, 0x80, 0x95, + 0x81, 0x6d, 0x75, 0xd2, 0x33, 0xe3, 0x27, 0x39, 0x7f, 0xc1, 0x7c, 0x26, + 0xcb, 0x7e, 0x8b, 0x66, 0xec, 0x3b, 0x8f, 0x03, 0x61, 0xc0, 0x56, 0xa8, + 0xbe, 0x63, 0x81, 0xf9, 0x17, 0x1a, 0xa8, 0x25, 0xc7, 0x5c, 0xee, 0x97, + 0xbb, 0x18, 0xcd, 0xdb, 0xac, 0xbf, 0x64, 0x03, 0xf7, 0x38, 0xfa, 0x9b, + 0x48, 0x00, 0xea, 0xf5, 0xb6, 0x52, 0x0e, 0xde, 0xe8, 0x27, 0x7d, 0xf6, + 0x5f, 0xff, 0x85, 0xf9, 0x0b, 0x2d, 0x9e, 0x3e, 0xa2, 0x46, 0x4d, 0x1f, + 0xd1, 0xe5, 0x7a, 0x71, 0x81, 0xc7, 0x18, 0x6b, 0xad, 0xc0, 0x7c, 0xfd, + 0x2e, 0xd2, 0xf0, 0x2b, 0x4e, 0x4a, 0x46, 0xdd, 0x61, 0xaf, 0xdc, 0x66, + 0x88, 0x57, 0x33, 0x94, 0xab, 0xdd, 0xbe, 0xe8, 0x11, 0xcc, 0xfb, 0x17, + 0x8b, 0xdc, 0xdb, 0x7e, 0x8b, 0x67, 0x1e, 0x55, 0xcf, 0xb5, 0xe7, 0xff, + 0xc3, 0xe1, 0xac, 0xae, 0x70, 0x1f, 0xe1, 0xf9, 0x9f, 0x38, 0x9c, 0x75, + 0x86, 0xcd, 0xf9, 0x0b, 0xe6, 0xf3, 0xcc, 0xb8, 0x8a, 0x17, 0x74, 0x1f, + 0x6f, 0x83, 0xe8, 0x8e, 0x14, 0x29, 0x52, 0xa4, 0x48, 0x91, 0x22, 0x45, + 0x8a, 0x14, 0x29, 0x52, 0xa4, 0x48, 0x91, 0x22, 0x45, 0x8a, 0x14, 0x29, + 0x52, 0xa4, 0x48, 0x91, 0x22, 0x45, 0x8a, 0x14, 0x29, 0x52, 0xa4, 0x48, + 0xb3, 0x57, 0x04, 0xd5, 0x8a, 0x14, 0x29, 0x52, 0xa4, 0x48, 0x91, 0x7e, + 0x09, 0x54, 0x9a, 0x6c, 0x9d, 0x9c, 0x6e, 0x26, 0xe7, 0x76, 0x02, 0x76, + 0x95, 0x27, 0x5b, 0x81, 0x0b, 0x55, 0x0d, 0xd9, 0x4a, 0x76, 0x27, 0x29, + 0x4f, 0x96, 0x59, 0xf1, 0xdb, 0x2b, 0x42, 0x60, 0x2d, 0x21, 0x04, 0x76, + 0xc6, 0xa6, 0x70, 0xbc, 0x10, 0x02, 0x6a, 0x19, 0xe8, 0x94, 0xac, 0x49, + 0xd2, 0xa9, 0x74, 0x4b, 0xbe, 0xed, 0x24, 0x1b, 0x3e, 0x35, 0x6a, 0x3a, + 0x60, 0x58, 0xa7, 0xe3, 0xea, 0xe4, 0x37, 0x5d, 0xfa, 0xe6, 0x73, 0xd2, + 0x29, 0xbc, 0xd9, 0x9d, 0x4c, 0x24, 0x29, 0xd3, 0x19, 0x50, 0x31, 0xd3, + 0xb9, 0x0e, 0x4a, 0xcd, 0xd7, 0x0c, 0x1b, 0xd0, 0x87, 0xf2, 0x0a, 0x9c, + 0x13, 0x63, 0xec, 0xdb, 0x9c, 0xa6, 0x9d, 0xb9, 0xa9, 0xe8, 0xb1, 0xd4, + 0xe4, 0x4c, 0x57, 0x22, 0x73, 0x01, 0x98, 0x96, 0xad, 0x61, 0x58, 0x65, + 0x17, 0x6a, 0x66, 0x36, 0xb8, 0xa5, 0xd7, 0x53, 0xc6, 0x9f, 0x30, 0xdf, + 0x13, 0x80, 0x5b, 0xe5, 0x2c, 0x18, 0x97, 0x6a, 0x05, 0x64, 0x47, 0x4f, + 0x42, 0x37, 0x16, 0x43, 0x52, 0x02, 0x49, 0x88, 0x99, 0x3c, 0x7d, 0x98, + 0x55, 0xbc, 0x26, 0x95, 0xf5, 0x50, 0xa0, 0x85, 0x19, 0x5f, 0x60, 0x51, + 0x1f, 0x77, 0xe1, 0x9d, 0x29, 0x05, 0xa3, 0xaa, 0x49, 0xe2, 0xf3, 0x04, + 0x75, 0x20, 0x5e, 0x91, 0xa8, 0x04, 0x40, 0x8f, 0x20, 0x5e, 0x93, 0xca, + 0x7f, 0x16, 0xe9, 0x01, 0x68, 0x4a, 0x4f, 0x4d, 0xc2, 0x64, 0x20, 0x1c, + 0xa8, 0x17, 0x5c, 0x35, 0x31, 0x7f, 0x85, 0x50, 0x70, 0x30, 0xd7, 0xf5, + 0x92, 0xa8, 0x4b, 0xaa, 0x77, 0xcc, 0x79, 0x38, 0xee, 0x42, 0xda, 0x52, + 0x86, 0x1f, 0x0b, 0x2d, 0x2f, 0x4f, 0x56, 0xa8, 0x73, 0xa2, 0xce, 0xe9, + 0xec, 0xc0, 0x5a, 0x3e, 0x4c, 0xcb, 0x57, 0x4a, 0xaf, 0x90, 0xeb, 0x19, + 0x4d, 0x68, 0xa0, 0x56, 0x50, 0x22, 0x91, 0x9c, 0x16, 0xac, 0xa5, 0xf2, + 0x4e, 0x75, 0x04, 0x6c, 0x75, 0x82, 0x62, 0x59, 0x09, 0x7b, 0xda, 0x38, + 0x9d, 0xd2, 0xcc, 0x04, 0xd8, 0x02, 0x1f, 0x74, 0x57, 0x75, 0xab, 0xa4, + 0x52, 0xca, 0x40, 0xb5, 0x5e, 0xeb, 0x0c, 0xc8, 0xb2, 0x12, 0x36, 0x72, + 0x96, 0x46, 0x6d, 0xa7, 0x5b, 0x97, 0x60, 0x3d, 0x42, 0x00, 0x26, 0x21, + 0x5a, 0xa6, 0x17, 0xbb, 0xb5, 0x32, 0x56, 0xa2, 0xd9, 0xa0, 0x56, 0x29, + 0x04, 0xea, 0x4a, 0xb5, 0x8f, 0x63, 0xe4, 0x4c, 0x3a, 0x38, 0x45, 0x07, + 0x3b, 0xd3, 0xd9, 0x50, 0xce, 0x80, 0xb5, 0x46, 0x1e, 0x1c, 0xc3, 0xd6, + 0xcf, 0xc9, 0xd5, 0x1f, 0x5a, 0x4d, 0x61, 0xc2, 0x61, 0xe8, 0xc1, 0x21, + 0x00, 0xd6, 0xaf, 0x5d, 0xd3, 0xb6, 0x1e, 0xe6, 0x9c, 0x6e, 0xff, 0xfc, + 0x76, 0xcf, 0x7f, 0xd3, 0xa7, 0x36, 0x79, 0xe1, 0x6b, 0xae, 0x5a, 0x83, + 0xdd, 0x63, 0xb3, 0xeb, 0xbe, 0x3d, 0xc4, 0x41, 0x4f, 0xc8, 0xf6, 0xe1, + 0x52, 0xd5, 0x00, 0x40, 0xb1, 0x5c, 0x2e, 0xb3, 0xfa, 0x43, 0xab, 0x03, + 0x50, 0xc5, 0xf0, 0x39, 0x29, 0x14, 0x0a, 0xe4, 0xbf, 0x3f, 0x46, 0xee, + 0xa2, 0x1c, 0x85, 0x85, 0x36, 0x85, 0x42, 0x9e, 0xc2, 0xc2, 0xf0, 0x71, + 0xd9, 0xf3, 0xfd, 0xfd, 0x81, 0xe5, 0x0a, 0xfa, 0xb1, 0xf3, 0x8e, 0xf6, + 0x70, 0x17, 0x91, 0x50, 0x46, 0x3d, 0xa7, 0x03, 0xae, 0x0a, 0xaa, 0x39, + 0x5d, 0x10, 0x42, 0xe0, 0x01, 0x11, 0x9b, 0x80, 0x5a, 0x5e, 0x78, 0x10, + 0x94, 0xd6, 0xa1, 0xfc, 0x10, 0xb0, 0x6b, 0x06, 0x78, 0x1a, 0x28, 0xdb, + 0xb2, 0x8d, 0x1a, 0xce, 0x64, 0xa6, 0x82, 0x3f, 0x83, 0x9a, 0xaf, 0xdd, + 0x1b, 0x88, 0x63, 0xd4, 0xdb, 0x61, 0xab, 0xe0, 0x55, 0xcd, 0x79, 0x4f, + 0x78, 0x10, 0xaa, 0xde, 0xc0, 0xbe, 0xf1, 0x1b, 0x1a, 0x1a, 0x62, 0x4e, + 0x80, 0x86, 0xf5, 0x6a, 0x61, 0x5a, 0x2f, 0xbf, 0x0c, 0xb7, 0xdf, 0x0e, + 0x4f, 0xdf, 0xd0, 0x7a, 0x8c, 0x3e, 0xf4, 0xea, 0x40, 0x08, 0x59, 0x15, + 0x84, 0x82, 0xf5, 0x7a, 0x98, 0xb0, 0x60, 0x7d, 0xa7, 0x3f, 0x26, 0x93, + 0xc7, 0x44, 0xd3, 0xbe, 0x01, 0x77, 0x19, 0xb5, 0x3b, 0x97, 0x13, 0x2d, + 0xff, 0xb7, 0x96, 0x11, 0x74, 0xc3, 0x84, 0x07, 0xd4, 0x32, 0x61, 0xc1, + 0xb4, 0x8b, 0x99, 0x9d, 0xde, 0x37, 0x02, 0xdf, 0x58, 0x01, 0x1c, 0x79, + 0x2a, 0xe4, 0xf7, 0xb3, 0x92, 0x9d, 0xb0, 0xb0, 0x2c, 0x1f, 0xa6, 0xb5, + 0xba, 0x37, 0xc5, 0xbe, 0x89, 0x32, 0xab, 0x7b, 0x53, 0xe4, 0x27, 0x5d, + 0x72, 0x3d, 0x16, 0x76, 0x4d, 0x41, 0xb6, 0x7e, 0x91, 0xe5, 0x3f, 0xbf, + 0x7d, 0xe3, 0x88, 0xb4, 0x9d, 0xa6, 0x7a, 0x4a, 0x86, 0xde, 0x91, 0xb2, + 0x01, 0xe9, 0xf9, 0x69, 0xea, 0xd5, 0xaa, 0x07, 0x98, 0xf5, 0x52, 0x6a, + 0x60, 0x8f, 0xcb, 0x2b, 0x37, 0x54, 0x3f, 0x6d, 0x69, 0x90, 0xd6, 0xad, + 0x81, 0x67, 0x4b, 0x8b, 0x49, 0x7a, 0x63, 0x00, 0x21, 0xbe, 0xc4, 0xf0, + 0xc3, 0xe7, 0x50, 0x6a, 0x6a, 0x36, 0x0f, 0x3f, 0xac, 0xb6, 0xd6, 0x87, + 0x24, 0xae, 0x3e, 0x92, 0xd4, 0xc5, 0xeb, 0x29, 0xb3, 0x0d, 0x80, 0xf2, + 0xc3, 0xbb, 0xe0, 0xe3, 0x65, 0xb8, 0x23, 0x05, 0x8b, 0xcb, 0x58, 0x96, + 0x8d, 0x4b, 0x9b, 0xf7, 0xed, 0xf5, 0xcc, 0x0e, 0x98, 0xd5, 0x29, 0x9e, + 0x06, 0x69, 0x7d, 0x49, 0xf8, 0x86, 0x53, 0xd7, 0xc9, 0xa6, 0xb6, 0x8f, + 0x10, 0xb0, 0x38, 0x0b, 0x0f, 0x0c, 0x29, 0x58, 0xd8, 0x1f, 0x6d, 0xe8, + 0x58, 0x8c, 0x01, 0x6a, 0x59, 0x17, 0x5d, 0xc1, 0xfa, 0x6b, 0x36, 0xb0, + 0x7d, 0xc3, 0xf4, 0xc0, 0xa8, 0xd7, 0x4b, 0x3b, 0x1f, 0x1e, 0xea, 0x18, + 0xb6, 0xfd, 0xf0, 0x1e, 0xe5, 0x68, 0x5a, 0xfc, 0x7d, 0xf4, 0xbe, 0x6d, + 0x1d, 0xd3, 0xec, 0xd9, 0x7b, 0x0f, 0x00, 0xc3, 0xdf, 0x1b, 0x53, 0xc0, + 0xc9, 0xee, 0x2c, 0x6e, 0xd1, 0x81, 0x44, 0x18, 0x98, 0x13, 0x04, 0x69, + 0x05, 0x25, 0x12, 0x76, 0x28, 0xbe, 0x89, 0x0b, 0x0a, 0x9a, 0x75, 0xf5, + 0xff, 0x79, 0x35, 0x5f, 0xff, 0x60, 0x86, 0xe4, 0xaa, 0x34, 0xd5, 0xfd, + 0x25, 0x92, 0xab, 0xd4, 0x0f, 0xe6, 0x3d, 0x7f, 0x30, 0xc6, 0x2d, 0x7f, + 0x71, 0x8b, 0x57, 0x46, 0x4b, 0x7f, 0xa2, 0x4c, 0x28, 0x4f, 0x4f, 0x93, + 0xea, 0xf8, 0xe5, 0x64, 0xc0, 0x2f, 0xb5, 0x02, 0xa7, 0xe8, 0x70, 0xd3, + 0x7f, 0xbf, 0xa9, 0x63, 0x59, 0x5f, 0xfe, 0xdb, 0x2f, 0x7b, 0xe9, 0x83, + 0x57, 0x6e, 0xf3, 0x3f, 0x7f, 0x09, 0xb9, 0x77, 0x27, 0xe2, 0xaa, 0x0d, + 0x0c, 0xe8, 0xbc, 0x71, 0x03, 0x06, 0x49, 0x2e, 0xd8, 0xdf, 0x5a, 0xcd, + 0x9d, 0x7b, 0xf3, 0x5c, 0x7b, 0x55, 0x4e, 0xa5, 0x9d, 0x0c, 0x5f, 0x83, + 0xec, 0xce, 0xa7, 0xb8, 0xff, 0x36, 0xb8, 0xe2, 0x06, 0x54, 0x78, 0x53, + 0xfa, 0xcd, 0x9f, 0xba, 0x95, 0xc2, 0x5d, 0xdb, 0xc9, 0x5e, 0xb3, 0x09, + 0xcb, 0x1d, 0xf3, 0xf2, 0x78, 0xa5, 0x4f, 0xb8, 0xa0, 0xb1, 0xb4, 0xec, + 0xe0, 0xff, 0x4a, 0xd5, 0x75, 0xea, 0x54, 0x47, 0xa8, 0xdf, 0x6b, 0xf5, + 0x44, 0x7e, 0x13, 0x90, 0x4a, 0xc4, 0x39, 0xf7, 0x2d, 0x16, 0x6f, 0xb6, + 0x14, 0x6c, 0xe6, 0x05, 0x77, 0x8a, 0x1f, 0x3d, 0xe7, 0xf2, 0x13, 0xdd, + 0xf6, 0x7e, 0x2d, 0x8e, 0xa5, 0x9d, 0x5e, 0xeb, 0x63, 0x09, 0x6a, 0xba, + 0xeb, 0x32, 0x93, 0x36, 0xec, 0xfc, 0x18, 0xa0, 0x0c, 0x9b, 0xb7, 0xb9, + 0x25, 0x36, 0x7f, 0x6a, 0x90, 0xe1, 0xbd, 0x16, 0xeb, 0xd7, 0xda, 0x94, + 0x80, 0x9b, 0x1c, 0xf5, 0x0e, 0xf8, 0xb2, 0x6d, 0xb3, 0xf1, 0xc3, 0x77, + 0xb2, 0xe5, 0x2b, 0xd7, 0x92, 0x01, 0xca, 0x01, 0xe3, 0xe4, 0xb4, 0xee, + 0x0b, 0x3a, 0x52, 0x7a, 0x46, 0xf6, 0x25, 0xa0, 0x54, 0x73, 0x7d, 0xea, + 0x35, 0x90, 0xd5, 0x61, 0x8e, 0x86, 0xee, 0x06, 0xc1, 0x5a, 0x75, 0xc2, + 0x60, 0xad, 0xe0, 0x9b, 0x67, 0xf8, 0x10, 0xac, 0xbf, 0xc4, 0xdf, 0x37, + 0x61, 0xb6, 0xbe, 0x77, 0x4b, 0x42, 0x60, 0x03, 0xc3, 0x23, 0xb0, 0x7e, + 0x85, 0x0a, 0x37, 0xee, 0x60, 0xfc, 0xe1, 0x11, 0x05, 0xc6, 0x32, 0x5b, + 0x9a, 0xe2, 0x99, 0xb8, 0xc1, 0x78, 0xa0, 0xdc, 0x4e, 0x11, 0x46, 0xef, + 0xdb, 0x09, 0x80, 0x6c, 0x24, 0x41, 0xbf, 0x4b, 0xeb, 0xb5, 0x2a, 0x05, + 0xa7, 0x4c, 0x52, 0x03, 0xa1, 0xd5, 0x38, 0x84, 0xf2, 0x6f, 0x96, 0xdb, + 0x00, 0x1a, 0x71, 0x72, 0x0b, 0x52, 0x14, 0x4f, 0xba, 0x88, 0x98, 0x85, + 0x95, 0xe9, 0xc7, 0x2d, 0x2a, 0x83, 0xf6, 0x64, 0xb7, 0x02, 0x03, 0x4b, + 0x29, 0xa8, 0xea, 0x8b, 0xe7, 0xba, 0x0a, 0xf0, 0x3b, 0x5a, 0x94, 0x64, + 0x33, 0x16, 0xf1, 0x86, 0x3a, 0xa7, 0xd5, 0x04, 0x48, 0xd9, 0x8f, 0x3c, + 0x75, 0x0c, 0xd1, 0x05, 0x72, 0xfa, 0xee, 0x2f, 0x30, 0x7b, 0x20, 0xea, + 0x6c, 0xf4, 0x5a, 0xe6, 0xf5, 0x5f, 0x4d, 0x4f, 0xe2, 0x83, 0xb5, 0x9e, + 0x79, 0x3d, 0x0b, 0xd2, 0xb7, 0xde, 0xc2, 0x45, 0x5d, 0x1c, 0x3f, 0x36, + 0xc5, 0x16, 0xe0, 0xe2, 0x45, 0x5d, 0xd8, 0x06, 0x74, 0xf5, 0xe7, 0xea, + 0x3d, 0x35, 0x0c, 0x3c, 0x3b, 0x05, 0x13, 0xef, 0xee, 0xa2, 0xf7, 0x7d, + 0x53, 0xf0, 0x3f, 0x76, 0xb2, 0xe7, 0x51, 0xd5, 0x57, 0x5e, 0xf3, 0xae, + 0xed, 0xc8, 0xa9, 0x10, 0x15, 0xa1, 0xa3, 0x8e, 0x8d, 0xbb, 0x2c, 0x79, + 0xb1, 0xcc, 0xc2, 0x45, 0x5d, 0x70, 0x6c, 0x8a, 0x73, 0x1f, 0x99, 0x1e, + 0x60, 0xf7, 0x8d, 0x8a, 0xc3, 0xdd, 0xef, 0x86, 0xe3, 0xc7, 0x3c, 0x86, + 0x51, 0x48, 0xdf, 0x3a, 0x46, 0x0b, 0x6c, 0x6b, 0xe5, 0xa6, 0xdd, 0x1c, + 0x3c, 0x78, 0x90, 0xdd, 0x07, 0x77, 0x43, 0xb1, 0xa8, 0x7d, 0x33, 0x00, + 0xdc, 0xfc, 0x91, 0x2e, 0x58, 0x35, 0x05, 0x37, 0xc3, 0xf2, 0x4d, 0xbb, + 0x29, 0x66, 0x8a, 0x1c, 0xbf, 0xff, 0x66, 0x8e, 0x1f, 0xd3, 0xc7, 0x7b, + 0x6c, 0xca, 0x3b, 0x17, 0x0b, 0xdf, 0xdd, 0xc5, 0xcb, 0xc7, 0xe0, 0xe8, + 0x99, 0x81, 0xcc, 0x75, 0xbd, 0x01, 0xee, 0x9d, 0x82, 0x8f, 0x76, 0xa1, + 0x21, 0x59, 0xa0, 0x08, 0x57, 0xaa, 0x1c, 0xd6, 0x99, 0x7d, 0x14, 0x14, + 0x2b, 0xb8, 0x6f, 0xfc, 0x76, 0xd3, 0xc6, 0xdf, 0x38, 0x74, 0x3e, 0xcd, + 0x61, 0xeb, 0x32, 0xbe, 0x5f, 0xd1, 0xc4, 0xcb, 0x30, 0xd3, 0x27, 0xe8, + 0xec, 0xaa, 0xaf, 0xc2, 0xc8, 0x7b, 0xa6, 0x8d, 0xf3, 0x4a, 0x94, 0xfc, + 0xd0, 0x6b, 0x93, 0xef, 0x90, 0x06, 0x5e, 0x6d, 0xfa, 0x33, 0xf5, 0x4b, + 0xd8, 0x76, 0x43, 0x81, 0xaf, 0xfe, 0xe5, 0x63, 0xe4, 0x51, 0x50, 0xad, + 0x4d, 0xdf, 0xca, 0xce, 0x1a, 0xac, 0x05, 0x90, 0xcb, 0xa6, 0xd8, 0x76, + 0xf7, 0x98, 0x02, 0xd4, 0xd6, 0x24, 0xf9, 0xef, 0x3b, 0x6c, 0x5e, 0xdb, + 0x47, 0xbe, 0x50, 0xf6, 0xca, 0x3a, 0x1d, 0x05, 0x81, 0x5a, 0x46, 0xd7, + 0x26, 0x6c, 0xb8, 0x08, 0x92, 0x7f, 0x02, 0x3b, 0x3f, 0xec, 0xe7, 0x99, + 0x3b, 0x04, 0xf9, 0x07, 0x74, 0x7b, 0x7e, 0xb9, 0xba, 0xc1, 0xfa, 0x2e, + 0x0b, 0x83, 0x4f, 0x8f, 0x1c, 0xad, 0x72, 0x84, 0xeb, 0xc8, 0x3f, 0xa1, + 0xee, 0x99, 0xfc, 0x71, 0xc9, 0x9a, 0x2b, 0x2d, 0xf6, 0x3c, 0xfc, 0x7a, + 0x40, 0x9b, 0xf5, 0x3b, 0xb0, 0x5c, 0x20, 0x9d, 0xca, 0x52, 0xaf, 0x40, + 0xbc, 0xdb, 0xa2, 0x54, 0x2e, 0x78, 0x10, 0x2d, 0x23, 0x57, 0x0e, 0xe9, + 0x6d, 0x38, 0x87, 0x6a, 0xc5, 0x1f, 0x57, 0xb4, 0x62, 0x69, 0xdc, 0x86, + 0xbf, 0xef, 0xd6, 0xf6, 0x61, 0x59, 0x33, 0x81, 0x59, 0xd3, 0x54, 0xcb, + 0x7e, 0x1a, 0x49, 0x1a, 0x4b, 0xd8, 0x14, 0xdd, 0x01, 0xfc, 0xe7, 0x46, + 0x6b, 0xab, 0xca, 0x12, 0x6a, 0x2c, 0xc9, 0x12, 0x0a, 0xd2, 0x2e, 0x62, + 0x02, 0x57, 0xc7, 0xb7, 0x84, 0x80, 0x86, 0x9f, 0xa6, 0x5c, 0x19, 0x26, + 0xd5, 0x3d, 0x80, 0x5b, 0x9b, 0xfd, 0xef, 0xe4, 0xa7, 0xa3, 0xc0, 0xc9, + 0x9c, 0x01, 0xa6, 0xd3, 0x12, 0x7f, 0x06, 0xf5, 0xbe, 0x7f, 0xba, 0xd0, + 0x03, 0xb0, 0xa3, 0x7d, 0x48, 0x06, 0xff, 0x69, 0xb5, 0x51, 0xc7, 0xcd, + 0x00, 0x5f, 0xd5, 0xee, 0x83, 0x40, 0x86, 0x03, 0xac, 0x5b, 0xa7, 0xe2, + 0x5f, 0xbc, 0x5b, 0x6d, 0x27, 0x00, 0x96, 0x4f, 0xc0, 0x44, 0x6f, 0x0b, + 0xc4, 0xeb, 0xf5, 0xd4, 0x01, 0x0c, 0xea, 0x6b, 0x66, 0x50, 0xd7, 0x0e, + 0x60, 0x65, 0x6f, 0x2f, 0xbd, 0x2b, 0x57, 0x72, 0xe0, 0x93, 0x3b, 0x98, + 0x3c, 0xf8, 0x7a, 0xd7, 0x2e, 0xac, 0xd9, 0xd4, 0xf1, 0x35, 0xd7, 0x2c, + 0xc6, 0x58, 0x7f, 0xd6, 0x6a, 0xf7, 0xab, 0xf6, 0xfc, 0x02, 0xdf, 0xe6, + 0xd4, 0x3e, 0x81, 0x57, 0x5a, 0xf0, 0xf9, 0xe0, 0xf7, 0x64, 0xa4, 0x01, + 0x2e, 0xc5, 0xf0, 0xef, 0xab, 0x98, 0x0c, 0x74, 0x27, 0x24, 0xae, 0xeb, + 0x62, 0x59, 0x36, 0x50, 0x45, 0x4a, 0xe9, 0xf5, 0xe5, 0x5b, 0xbf, 0x11, + 0xbe, 0xf6, 0xbd, 0xae, 0x4e, 0x79, 0x4a, 0x29, 0x67, 0x9c, 0x31, 0x96, + 0x41, 0x52, 0xd4, 0xa0, 0x2a, 0x80, 0x7a, 0xcd, 0x25, 0x6e, 0xbe, 0x5d, + 0x6a, 0xd8, 0x53, 0xbd, 0x06, 0x71, 0x09, 0xf5, 0x98, 0x44, 0x36, 0xc2, + 0xb0, 0x27, 0x1b, 0x70, 0x68, 0x6d, 0x93, 0xa9, 0x73, 0x23, 0x71, 0x25, + 0x08, 0x9d, 0xce, 0x0a, 0x9c, 0x6b, 0x01, 0xc8, 0x1a, 0xd8, 0x96, 0x82, + 0x51, 0xf5, 0x37, 0x60, 0x8f, 0x86, 0xe7, 0x24, 0x63, 0x82, 0x7c, 0x45, + 0x62, 0xc7, 0xa0, 0x24, 0xc1, 0x4a, 0xa8, 0xbc, 0xcc, 0x75, 0x48, 0x36, + 0x50, 0xdf, 0x30, 0x03, 0x0b, 0x21, 0x65, 0x63, 0x82, 0x72, 0x4d, 0x2a, + 0x7f, 0x5d, 0x9b, 0xb8, 0x54, 0xe3, 0x87, 0x42, 0xba, 0x0a, 0xf4, 0xa5, + 0x3f, 0x81, 0x3a, 0x3a, 0x46, 0x36, 0x01, 0x79, 0x0f, 0xa8, 0xa5, 0xfb, + 0xdc, 0x31, 0x7d, 0x26, 0x1a, 0x75, 0x0f, 0x8c, 0xe3, 0x00, 0xa2, 0x51, + 0xf7, 0xeb, 0x1e, 0x53, 0x7e, 0xab, 0xaf, 0x52, 0xdf, 0x7b, 0xb2, 0xd9, + 0x2c, 0xd9, 0x6c, 0x96, 0xe1, 0x11, 0x7f, 0x31, 0xaa, 0xc2, 0x93, 0x05, + 0xc8, 0x66, 0x21, 0x3f, 0xea, 0x1d, 0xb0, 0x8c, 0xa9, 0xbe, 0x2d, 0xf8, + 0xe7, 0x41, 0x36, 0x20, 0xd7, 0x0d, 0x4e, 0x59, 0x71, 0xfa, 0x25, 0xaa, + 0xdf, 0x69, 0xda, 0xaa, 0x8e, 0x06, 0x6d, 0x59, 0x0d, 0x89, 0xab, 0xcb, + 0x15, 0x40, 0x3a, 0x56, 0xc5, 0x21, 0xe9, 0x2d, 0xe2, 0x32, 0x1b, 0x2d, + 0x3e, 0x77, 0x05, 0x3f, 0xe2, 0x47, 0xfc, 0x98, 0xa7, 0x99, 0x97, 0x6e, + 0x05, 0x49, 0x9d, 0xcd, 0x05, 0xfc, 0x98, 0xa7, 0x39, 0x23, 0x36, 0x87, + 0x33, 0x7e, 0x0a, 0x33, 0x0d, 0x7f, 0x63, 0xc1, 0x7c, 0x0e, 0xe7, 0x4f, + 0x7a, 0xee, 0x1f, 0x8c, 0x9f, 0xe4, 0x70, 0xfe, 0x24, 0x57, 0x5e, 0xde, + 0x0d, 0xe0, 0xd5, 0xe3, 0x27, 0x8d, 0x97, 0x39, 0x23, 0x36, 0x87, 0x78, + 0xcc, 0xdf, 0x82, 0x02, 0x65, 0xfd, 0xa4, 0xf1, 0x72, 0xc7, 0xfc, 0xcf, + 0x12, 0x73, 0x38, 0x2b, 0x70, 0xab, 0xbf, 0xeb, 0xad, 0x73, 0xd8, 0xc8, + 0xe3, 0xec, 0xf8, 0x4f, 0x05, 0xfc, 0x79, 0x74, 0xc1, 0x12, 0x36, 0xbe, + 0xe1, 0x71, 0x1e, 0x3d, 0xf1, 0xf2, 0xeb, 0x0a, 0xd6, 0xda, 0xf6, 0xb7, + 0x9f, 0x04, 0x60, 0xdd, 0xa5, 0xbf, 0xc3, 0xb9, 0xab, 0x56, 0xf1, 0xa3, + 0xfd, 0xfb, 0x59, 0x14, 0x08, 0x3f, 0xf6, 0xd0, 0x43, 0x3c, 0xf0, 0xd2, + 0x4b, 0x7c, 0x60, 0xae, 0x8f, 0x72, 0x5f, 0x74, 0xe9, 0xa5, 0x9c, 0xbb, + 0x6a, 0x15, 0x80, 0x97, 0xe6, 0x81, 0x03, 0xea, 0x1b, 0xcb, 0xb3, 0x2f, + 0x4c, 0xc1, 0x59, 0x41, 0x14, 0x7c, 0x7b, 0xc5, 0x85, 0xf0, 0xc6, 0x2e, + 0xeb, 0x52, 0x92, 0xee, 0xb6, 0xc8, 0x3f, 0x59, 0x20, 0x77, 0xa1, 0xfa, + 0x66, 0x9d, 0xee, 0xd6, 0x0b, 0xee, 0x34, 0x2d, 0xd0, 0x13, 0xef, 0x8e, + 0x73, 0xcf, 0x3f, 0x0c, 0x31, 0xb0, 0x40, 0x8f, 0x91, 0x54, 0xc3, 0x63, + 0xc6, 0x6e, 0xcc, 0xa5, 0x5e, 0xa9, 0x7b, 0x0b, 0x17, 0xe4, 0xc7, 0x0b, + 0xd4, 0x05, 0x5c, 0x81, 0x4d, 0xb5, 0xa1, 0x81, 0x5a, 0x1a, 0xc0, 0x25, + 0xba, 0x04, 0x75, 0xfd, 0x5d, 0x4f, 0xc1, 0xb1, 0xa4, 0x07, 0xd2, 0x32, + 0x7e, 0xf1, 0x04, 0x64, 0x17, 0x2e, 0x25, 0x99, 0x56, 0xd0, 0xa9, 0x6a, + 0xb9, 0xda, 0xb2, 0x88, 0x5a, 0x5c, 0x08, 0xb2, 0xb9, 0x2c, 0xc3, 0x0f, + 0x0c, 0x93, 0xb6, 0x54, 0x7d, 0xdd, 0x53, 0xae, 0x02, 0x64, 0x05, 0x54, + 0x6f, 0x7a, 0x16, 0xc6, 0x85, 0xf0, 0x40, 0x90, 0xe5, 0x5a, 0x59, 0x7d, + 0xcf, 0x9c, 0x92, 0xd3, 0x2e, 0x20, 0x14, 0x5c, 0xec, 0x47, 0x4a, 0xb5, + 0x2f, 0xba, 0x54, 0x3a, 0x0f, 0x90, 0x65, 0x9e, 0x91, 0x89, 0x0e, 0xef, + 0xc3, 0xc0, 0x62, 0x4e, 0xa2, 0x4b, 0xa5, 0x91, 0x12, 0xb2, 0x76, 0x96, + 0x6a, 0xad, 0x4a, 0x3a, 0x91, 0xa6, 0xea, 0x56, 0xfd, 0x85, 0x11, 0xa6, + 0x24, 0x42, 0x3f, 0xbb, 0xbc, 0x85, 0xe0, 0x66, 0x79, 0x0f, 0xca, 0x31, + 0x17, 0xd1, 0xa7, 0x11, 0xb0, 0xf3, 0x85, 0x07, 0xc3, 0x32, 0xc0, 0xa7, + 0xfa, 0x8b, 0xbb, 0x01, 0xd8, 0xb2, 0xe0, 0x0e, 0xc6, 0xc7, 0x9f, 0xf6, + 0xd2, 0x5d, 0x88, 0xc5, 0xbd, 0x13, 0x5f, 0xe4, 0xba, 0x4b, 0x0e, 0x91, + 0x5b, 0x98, 0x65, 0xe3, 0xd8, 0x46, 0x05, 0x8d, 0x0a, 0x80, 0xa3, 0x44, + 0x8f, 0x08, 0x81, 0xa4, 0x0c, 0xc0, 0x8b, 0x92, 0x02, 0x42, 0x01, 0xf4, + 0xa4, 0x7a, 0x99, 0x2c, 0x4f, 0x78, 0x40, 0x2d, 0x50, 0x70, 0x2d, 0x03, + 0xdb, 0x32, 0xd0, 0xa8, 0xe6, 0x3a, 0x03, 0x1e, 0xc8, 0x2b, 0xed, 0xda, + 0xf4, 0xe7, 0x06, 0xb8, 0xff, 0xc1, 0x5d, 0x6a, 0xbe, 0x07, 0x78, 0xd0, + 0x2d, 0x4e, 0x4a, 0x9e, 0x4a, 0xe7, 0x79, 0x5b, 0x29, 0x87, 0x33, 0x7e, + 0x12, 0x47, 0xe7, 0xf7, 0x9d, 0x43, 0xd3, 0x7f, 0xc4, 0x33, 0xe0, 0x2c, + 0x39, 0xe6, 0x2a, 0x50, 0x96, 0x06, 0x78, 0x85, 0x8e, 0x03, 0x28, 0x55, + 0x1c, 0x55, 0x6e, 0xa0, 0x9d, 0x29, 0xa7, 0x39, 0x07, 0x9e, 0x4e, 0x86, + 0x01, 0x5c, 0xcf, 0x8c, 0x9f, 0xf4, 0xc0, 0x59, 0xa0, 0x20, 0x5a, 0x41, + 0xbd, 0xf0, 0xe2, 0x8f, 0x74, 0x3c, 0x38, 0x39, 0x75, 0x98, 0x37, 0x9f, + 0x79, 0x2e, 0xf9, 0xa7, 0x1c, 0x3f, 0xec, 0x4c, 0x22, 0x45, 0x8a, 0x14, + 0x29, 0x52, 0xa4, 0x48, 0x91, 0x22, 0x45, 0x8a, 0x14, 0x29, 0x52, 0xa4, + 0x48, 0x91, 0x22, 0x45, 0x8a, 0x14, 0x29, 0x52, 0xa4, 0x48, 0x91, 0x22, + 0x45, 0x8a, 0x14, 0x29, 0xd2, 0xab, 0x50, 0x04, 0xd5, 0x8a, 0x14, 0x29, + 0x52, 0xa4, 0x48, 0x91, 0x7e, 0x86, 0x8a, 0xd3, 0xff, 0xb3, 0x2b, 0x3c, + 0xb8, 0x52, 0x2d, 0x80, 0x94, 0xf4, 0x2f, 0xeb, 0x67, 0xf4, 0x61, 0x35, + 0x81, 0xb7, 0x5a, 0xa9, 0x52, 0xad, 0x54, 0xc9, 0x2e, 0x54, 0x13, 0xf8, + 0xdc, 0x8a, 0x8b, 0x94, 0x12, 0xa7, 0xe8, 0x90, 0xea, 0x69, 0x05, 0xcc, + 0x9c, 0x0e, 0x50, 0xeb, 0x97, 0x5d, 0x6d, 0xaf, 0xeb, 0x17, 0xd4, 0x24, + 0x39, 0x65, 0x54, 0xaf, 0x26, 0x5a, 0x7a, 0x93, 0x32, 0xf5, 0x9c, 0x3a, + 0x11, 0x13, 0xb8, 0x35, 0x17, 0x2b, 0x61, 0xe9, 0x49, 0xfb, 0x12, 0xbd, + 0xe0, 0x33, 0xc2, 0xf2, 0x81, 0x5b, 0xc1, 0xc9, 0xe7, 0xee, 0x62, 0x05, + 0xcd, 0x0a, 0x4d, 0xd7, 0x33, 0x40, 0x2d, 0x29, 0xa1, 0xa4, 0x57, 0x9a, + 0xce, 0x05, 0xa0, 0x59, 0x25, 0x3d, 0xfd, 0x5b, 0xc3, 0xa1, 0xe2, 0x00, + 0x35, 0x1d, 0xe6, 0xea, 0xf4, 0x31, 0x55, 0x3f, 0x61, 0x09, 0x64, 0xd1, + 0x85, 0x5c, 0x1a, 0x1c, 0x35, 0x51, 0x53, 0x9c, 0xaa, 0xab, 0xf2, 0x82, + 0x79, 0x06, 0x27, 0x98, 0x6a, 0xbf, 0x7a, 0x4d, 0x12, 0x37, 0xb6, 0x49, + 0x41, 0x08, 0xd5, 0x29, 0xa9, 0xca, 0xec, 0x4b, 0x85, 0xe3, 0xa2, 0x20, + 0x5a, 0x2d, 0xe9, 0x83, 0xf0, 0x2c, 0x9d, 0x1e, 0xb7, 0x7d, 0x7a, 0xde, + 0x19, 0x4e, 0x4f, 0x4c, 0xf8, 0x13, 0x3c, 0xcd, 0x24, 0xd5, 0x84, 0x50, + 0xf0, 0xac, 0x15, 0x16, 0x18, 0xe8, 0xd6, 0x29, 0x7c, 0xf8, 0x56, 0xc1, + 0x9c, 0x0b, 0xd7, 0x37, 0x00, 0x31, 0x40, 0x2d, 0x5d, 0x8e, 0x37, 0x0d, + 0xfd, 0x0b, 0xad, 0x26, 0x96, 0xd3, 0xdf, 0xd7, 0xca, 0xd0, 0x42, 0x68, + 0x20, 0x5d, 0x2a, 0x31, 0xfb, 0x15, 0xa2, 0xc1, 0x87, 0x69, 0x75, 0x02, + 0x6a, 0x81, 0x0f, 0xc7, 0x32, 0x10, 0x2a, 0xb3, 0x35, 0xee, 0x60, 0x1c, + 0x3f, 0xdf, 0xf6, 0xc0, 0x2a, 0x7b, 0x89, 0x45, 0xe1, 0x78, 0xeb, 0xa4, + 0x5f, 0x67, 0xd2, 0x01, 0x0d, 0x64, 0x28, 0x69, 0x23, 0x36, 0xb3, 0xcd, + 0x3f, 0x99, 0x57, 0x01, 0x93, 0x81, 0xb8, 0xe0, 0x4d, 0xfe, 0x05, 0x3c, + 0xa0, 0xd6, 0xbe, 0x07, 0xf6, 0x85, 0x33, 0x7e, 0x40, 0x6d, 0xb6, 0x7d, + 0x76, 0x5b, 0x28, 0xbc, 0x54, 0x29, 0xa9, 0x55, 0x80, 0x45, 0x6b, 0x5d, + 0xbc, 0xf2, 0x3a, 0xf8, 0xe7, 0x9f, 0xcc, 0xab, 0xdf, 0x73, 0x43, 0x86, + 0xea, 0xe0, 0xd7, 0xc5, 0xa5, 0x70, 0xdc, 0x6d, 0x0b, 0x54, 0x5a, 0xa3, + 0x8d, 0x1e, 0xf6, 0x8c, 0x0c, 0x4f, 0x7b, 0x5f, 0x5b, 0xdd, 0x16, 0xb9, + 0xee, 0x1c, 0x6e, 0x45, 0xff, 0x76, 0x4c, 0x5e, 0x06, 0xb8, 0x87, 0x6f, + 0x86, 0x57, 0x72, 0x4b, 0x78, 0x46, 0x37, 0xdf, 0x83, 0xdc, 0x3b, 0x73, + 0x0c, 0x5e, 0x36, 0x48, 0xda, 0x52, 0x13, 0x78, 0x93, 0xdd, 0xfe, 0x6f, + 0xc2, 0xad, 0x85, 0x27, 0xa3, 0xdb, 0x19, 0xdb, 0x83, 0xc4, 0x04, 0xe5, + 0x9c, 0x54, 0xbf, 0x87, 0xa5, 0x0b, 0xb3, 0xa4, 0xe6, 0xa7, 0xb0, 0x7b, + 0x52, 0xdc, 0x73, 0x9f, 0x7f, 0x6e, 0x93, 0xdd, 0x49, 0xb2, 0x76, 0x96, + 0x3d, 0xf7, 0x29, 0x60, 0xc8, 0xa7, 0x37, 0xb5, 0x20, 0x5e, 0x5a, 0x34, + 0x76, 0x78, 0x8c, 0xb1, 0xc3, 0x63, 0x9e, 0x3b, 0x14, 0x16, 0x58, 0xc1, + 0x77, 0xcf, 0xde, 0x3d, 0xd3, 0xe6, 0x63, 0x0c, 0x76, 0xbc, 0x73, 0xa3, + 0x65, 0xae, 0x65, 0xb1, 0xdc, 0xfe, 0xb7, 0xdc, 0xc9, 0xbf, 0x39, 0xdf, + 0x66, 0x77, 0xbb, 0x78, 0xd3, 0x1a, 0x0d, 0x35, 0x2b, 0x46, 0xdb, 0xfb, + 0x9a, 0x9d, 0x0b, 0x00, 0x35, 0x6f, 0xfa, 0x40, 0x00, 0x1e, 0x35, 0x01, + 0x9c, 0x0f, 0x64, 0xf1, 0x61, 0x4d, 0x9d, 0x6c, 0xf8, 0x56, 0x6a, 0x08, + 0xd5, 0x84, 0xc6, 0x3b, 0x19, 0x10, 0x55, 0x50, 0x07, 0x02, 0xe0, 0xa7, + 0x95, 0x4d, 0xe1, 0x83, 0x83, 0xca, 0xb0, 0xf4, 0xb5, 0x80, 0x69, 0x05, + 0xfd, 0xfe, 0x5a, 0xd7, 0x24, 0x08, 0xc9, 0x52, 0x75, 0x31, 0x75, 0xf0, + 0xff, 0x4c, 0x1d, 0xcd, 0x79, 0x30, 0x32, 0xc7, 0x33, 0x9b, 0x63, 0x32, + 0x6e, 0xf0, 0xcf, 0xd5, 0x4a, 0x0d, 0x2a, 0x33, 0x00, 0xaf, 0xde, 0xc0, + 0x9f, 0x8a, 0xa7, 0xea, 0xb6, 0x92, 0x95, 0x1e, 0xe8, 0x2b, 0x08, 0xd2, + 0x0a, 0x02, 0xc8, 0xc2, 0x80, 0xad, 0xf0, 0xb1, 0x04, 0x8f, 0x07, 0xf0, + 0xae, 0x6b, 0x48, 0x97, 0x84, 0xaf, 0xbf, 0xdc, 0xf4, 0x36, 0xde, 0xb7, + 0xfd, 0x31, 0xe4, 0xa6, 0x77, 0x00, 0xf0, 0xd0, 0x91, 0xa7, 0x90, 0x9b, + 0xde, 0xd6, 0x9a, 0xee, 0xa7, 0x24, 0xa1, 0x47, 0x71, 0x56, 0xf7, 0xaa, + 0xb6, 0x98, 0xeb, 0xc2, 0x40, 0xb7, 0x72, 0xe7, 0x7a, 0xd4, 0xf3, 0xc1, + 0x4e, 0x58, 0x38, 0xf2, 0xf5, 0x30, 0x7c, 0xfe, 0x29, 0xca, 0x6a, 0x7d, + 0x3f, 0x96, 0xaa, 0xda, 0xd0, 0xcf, 0x80, 0xf4, 0x3c, 0x7f, 0x6d, 0x48, + 0x62, 0x85, 0x9f, 0x8f, 0x6e, 0x23, 0x10, 0xeb, 0x92, 0x36, 0xf7, 0xf5, + 0xe2, 0x45, 0xad, 0x7e, 0xaf, 0x56, 0x4d, 0x40, 0xad, 0x16, 0xf5, 0xd8, + 0xe0, 0x2a, 0x83, 0x6a, 0xeb, 0x33, 0x90, 0x03, 0x36, 0x7c, 0xca, 0xaf, + 0xf7, 0x91, 0x11, 0x97, 0x2d, 0xc0, 0x15, 0x47, 0xd5, 0x7e, 0xea, 0xe2, + 0xf5, 0x94, 0x17, 0x6f, 0xf3, 0xdd, 0x0f, 0x6b, 0x80, 0xe1, 0xc7, 0xd5, + 0xf5, 0x75, 0xdd, 0x12, 0xa9, 0x8b, 0x37, 0x51, 0x7e, 0x67, 0x1b, 0xb0, + 0x61, 0x3b, 0x60, 0xd6, 0xf5, 0x6d, 0xea, 0xd4, 0xce, 0xaf, 0x09, 0xa8, + 0xd5, 0x1c, 0xc6, 0x83, 0xc3, 0x90, 0xb1, 0xa1, 0xe8, 0xf8, 0xc7, 0xf5, + 0x37, 0x3b, 0x15, 0x58, 0xeb, 0x81, 0x30, 0x34, 0xc9, 0xba, 0xe8, 0x63, + 0xb8, 0xdf, 0x57, 0xf0, 0x29, 0xf7, 0xfb, 0xf7, 0xb3, 0x5d, 0x03, 0xb6, + 0x5e, 0x37, 0xb5, 0xbb, 0xae, 0xfa, 0xb9, 0xbe, 0xe1, 0xe2, 0x41, 0xc6, + 0xba, 0xf5, 0x6f, 0xc1, 0x10, 0x55, 0xea, 0x70, 0xe4, 0xeb, 0x3b, 0xd9, + 0xb4, 0x4c, 0xbd, 0xf3, 0x93, 0xfa, 0xf7, 0x55, 0xad, 0x49, 0xb6, 0x1f, + 0xde, 0x43, 0xff, 0x95, 0x9b, 0x55, 0xbc, 0x04, 0x50, 0x53, 0x90, 0xad, + 0x74, 0x4a, 0xc5, 0xd9, 0xfc, 0x19, 0x05, 0x12, 0xdb, 0x8c, 0xda, 0x3a, + 0x45, 0xbf, 0xc8, 0xab, 0x3f, 0xf1, 0x7b, 0x6d, 0xab, 0x27, 0x84, 0x40, + 0x56, 0x54, 0x7e, 0x6e, 0xa5, 0x80, 0xe8, 0x16, 0x04, 0x5f, 0x47, 0x56, + 0x77, 0x16, 0x50, 0xbf, 0xe9, 0xaf, 0x7f, 0x30, 0xc3, 0xfb, 0xbf, 0x56, + 0x84, 0xaf, 0xe9, 0x8c, 0xf5, 0xf6, 0xeb, 0x1f, 0xcc, 0xd0, 0xdc, 0xfa, + 0xf1, 0x81, 0x5e, 0x20, 0xba, 0xa1, 0xdd, 0x2b, 0xae, 0xdf, 0x52, 0xef, + 0x11, 0xa1, 0xeb, 0x2f, 0xcb, 0x92, 0xaa, 0x6e, 0xd5, 0x4e, 0x57, 0x96, + 0x79, 0x83, 0x2f, 0xb5, 0xfa, 0x3c, 0xe8, 0xd5, 0xe6, 0x7f, 0x5e, 0x83, + 0xdc, 0xbb, 0xb3, 0xed, 0x31, 0x1a, 0xd9, 0xdf, 0x5a, 0xcd, 0xbe, 0x91, + 0xce, 0x00, 0x81, 0xec, 0xce, 0xa7, 0x18, 0x7e, 0xb0, 0x73, 0xfa, 0xcd, + 0x9f, 0xba, 0x95, 0xc2, 0xa1, 0x56, 0x10, 0xda, 0xe6, 0x9d, 0x5f, 0xe7, + 0xa6, 0x0d, 0xef, 0x6f, 0xfb, 0xbe, 0xfe, 0x66, 0x9b, 0xc7, 0xfa, 0x6c, + 0xf5, 0x5a, 0xc0, 0xa8, 0x3a, 0xa1, 0x5b, 0x9a, 0xf3, 0x7d, 0x35, 0x26, + 0xd2, 0x2f, 0xd4, 0xea, 0xbc, 0x50, 0xab, 0x93, 0x3d, 0x5f, 0xed, 0x3b, + 0xcf, 0xb4, 0x01, 0x6c, 0xb7, 0x29, 0xf3, 0x74, 0xf5, 0xd3, 0x38, 0x96, + 0xd9, 0xaa, 0xed, 0x75, 0xd5, 0xcf, 0xf5, 0xc2, 0x41, 0xc8, 0x2e, 0x87, + 0x6d, 0xe5, 0x92, 0x07, 0xc0, 0x1a, 0xb8, 0xaa, 0x1f, 0x28, 0x71, 0x53, + 0x00, 0x94, 0x71, 0x75, 0xa9, 0xcc, 0x97, 0xbf, 0x72, 0x2d, 0x1b, 0x3f, + 0x7c, 0x27, 0x83, 0xd7, 0x5c, 0x0b, 0x40, 0xff, 0x87, 0x04, 0xa3, 0xf7, + 0xd5, 0xe9, 0xbf, 0x52, 0x3d, 0x10, 0x46, 0x0f, 0x01, 0x65, 0xc9, 0xbe, + 0x4a, 0x89, 0xd2, 0xc9, 0x12, 0xfd, 0x7d, 0xfd, 0x80, 0xa4, 0x6f, 0xad, + 0x60, 0xec, 0x6e, 0x18, 0xcb, 0x48, 0x56, 0x5c, 0x02, 0x23, 0x87, 0x00, + 0x24, 0x4c, 0x0a, 0xae, 0xbb, 0x75, 0x1b, 0x03, 0x57, 0xad, 0xc1, 0xee, + 0x5d, 0x04, 0x3d, 0x75, 0x98, 0x84, 0x81, 0xab, 0xea, 0x0c, 0xef, 0x8d, + 0x33, 0xb0, 0x56, 0x95, 0x3d, 0x7c, 0xd7, 0x10, 0x14, 0x07, 0xd9, 0x75, + 0xcb, 0x16, 0x06, 0xd6, 0xae, 0x67, 0xfd, 0x4d, 0x36, 0xc3, 0x87, 0x80, + 0x22, 0x0c, 0xac, 0x85, 0x5d, 0x9b, 0x0b, 0xd8, 0x19, 0x9b, 0xd1, 0x43, + 0xc3, 0xc8, 0x89, 0x01, 0x46, 0x0f, 0x69, 0xa3, 0x6a, 0x06, 0x90, 0x13, + 0x12, 0xd1, 0x2b, 0x90, 0x13, 0x92, 0xc1, 0x8f, 0x0b, 0x86, 0x47, 0x60, + 0xf8, 0xae, 0x61, 0xe4, 0x44, 0x3f, 0xa5, 0xc9, 0x23, 0x38, 0x8e, 0x9c, + 0x36, 0x1e, 0xc0, 0xfa, 0x15, 0x03, 0x38, 0x04, 0x01, 0xde, 0x00, 0xea, + 0x3d, 0x9b, 0xb4, 0xc0, 0x9e, 0xef, 0x23, 0xa6, 0x92, 0x96, 0x68, 0x01, + 0x6a, 0xc9, 0x86, 0x36, 0x76, 0x95, 0x90, 0xee, 0x11, 0x94, 0x26, 0x01, + 0x5c, 0xec, 0x5c, 0x3f, 0xd5, 0xa2, 0xce, 0xd4, 0x92, 0x88, 0x84, 0x85, + 0x1d, 0x93, 0xd4, 0x03, 0x86, 0xeb, 0x4e, 0x05, 0x6c, 0x24, 0xfd, 0x19, + 0x81, 0x94, 0xae, 0xfe, 0x1a, 0x25, 0x49, 0x0a, 0xe8, 0xbf, 0x50, 0x30, + 0xb4, 0x3f, 0x89, 0xa0, 0x84, 0x34, 0xbf, 0xac, 0x36, 0xef, 0x6b, 0x73, + 0xfd, 0xdf, 0xf4, 0xc7, 0x6f, 0xe0, 0x2d, 0x67, 0x87, 0x1b, 0xc0, 0x3f, + 0x98, 0x7c, 0x99, 0xdf, 0xe8, 0x09, 0xfb, 0x15, 0xff, 0xfb, 0x7f, 0xb4, + 0xe4, 0x11, 0xe9, 0xb5, 0xd5, 0xbf, 0x24, 0xe6, 0xf0, 0x64, 0xed, 0x65, + 0x0f, 0xae, 0x05, 0x78, 0xbd, 0xe5, 0x13, 0x7a, 0xfb, 0xa3, 0x19, 0xf2, + 0x68, 0x7b, 0x5f, 0xeb, 0xb6, 0x79, 0xb6, 0x1b, 0x0a, 0x15, 0x78, 0xee, + 0x71, 0x0d, 0x94, 0x9a, 0x0b, 0xa2, 0xdb, 0xe6, 0x4d, 0x8f, 0x38, 0x38, + 0xc0, 0xae, 0xbb, 0x7c, 0xe0, 0x95, 0xf9, 0xc5, 0xdc, 0xfb, 0x83, 0x6e, + 0xb8, 0xad, 0x87, 0x63, 0xab, 0x1c, 0xb6, 0x02, 0x7b, 0xee, 0xbb, 0x87, + 0x7f, 0xed, 0xb6, 0x59, 0xb7, 0x08, 0x7e, 0x18, 0xc0, 0x3a, 0x0c, 0x5c, + 0xde, 0x3a, 0x9e, 0x19, 0xd4, 0x71, 0xe0, 0xfc, 0x29, 0x05, 0xeb, 0x02, + 0x58, 0x1f, 0x08, 0x1b, 0x6e, 0x8a, 0xfb, 0xad, 0x63, 0x70, 0xb9, 0x01, + 0x5d, 0x35, 0x85, 0x5d, 0xbe, 0x48, 0x01, 0xb7, 0x5a, 0x95, 0xa1, 0xbf, + 0x0b, 0xcc, 0x5d, 0x7e, 0xf3, 0x47, 0x94, 0xb1, 0xfb, 0xcd, 0xab, 0xa6, + 0xf8, 0xe8, 0x76, 0xb8, 0xf7, 0x09, 0xd8, 0xbd, 0xbb, 0x43, 0xdd, 0x0c, + 0x34, 0xeb, 0x07, 0xdd, 0x9e, 0x41, 0xed, 0x92, 0x17, 0x5b, 0xc7, 0x71, + 0x3e, 0x6a, 0xec, 0xe7, 0xbd, 0x7c, 0x32, 0xfe, 0xfe, 0xba, 0xa2, 0x1f, + 0xb1, 0x79, 0xdf, 0x03, 0x66, 0x41, 0x08, 0xc4, 0xe5, 0xed, 0xeb, 0xed, + 0xee, 0x4c, 0x18, 0xa2, 0x15, 0x4a, 0xdf, 0x94, 0x3f, 0xb4, 0xef, 0x73, + 0x05, 0xde, 0xe1, 0x6b, 0x3e, 0xf5, 0x10, 0xf2, 0xe8, 0xd5, 0x58, 0xab, + 0xbe, 0xcc, 0x9d, 0x7f, 0x76, 0x29, 0x02, 0x18, 0xbc, 0xc4, 0x1f, 0x5f, + 0x1e, 0x3a, 0xe4, 0x3f, 0xcb, 0x3b, 0xf9, 0xaf, 0x59, 0xa1, 0xfc, 0xf7, + 0x8c, 0x68, 0xbf, 0x91, 0xf7, 0x78, 0x7e, 0x21, 0xff, 0x40, 0xdc, 0xa0, + 0xff, 0xe8, 0x84, 0x6a, 0xed, 0xf4, 0xf7, 0x5a, 0xde, 0x7e, 0x7f, 0xaf, + 0x45, 0xee, 0x4e, 0x55, 0xcf, 0xe1, 0xdf, 0x2f, 0x91, 0xcf, 0x48, 0x06, + 0x3e, 0x90, 0xe2, 0x0b, 0xdf, 0x7b, 0x1f, 0xc3, 0x0f, 0x94, 0x11, 0xc7, + 0x55, 0x1e, 0x9b, 0xfe, 0x31, 0xcb, 0xf6, 0xdf, 0x9d, 0x1e, 0x98, 0x54, + 0x58, 0x2b, 0xe8, 0xbb, 0x3b, 0x19, 0x46, 0xfd, 0x5e, 0x98, 0x62, 0xeb, + 0x93, 0x65, 0xea, 0xf0, 0x8a, 0x80, 0x5a, 0x9d, 0x34, 0x70, 0xc3, 0x97, + 0x19, 0xbe, 0xed, 0xea, 0x10, 0x50, 0x0b, 0x20, 0x7f, 0xfb, 0xcc, 0x8b, + 0x03, 0x00, 0xe4, 0xef, 0x70, 0xe1, 0x62, 0x41, 0x76, 0xb1, 0xe0, 0x63, + 0xbd, 0x5f, 0xe2, 0x98, 0xc6, 0x1b, 0xcd, 0x4a, 0x6d, 0xda, 0x66, 0xc3, + 0x6d, 0x2e, 0xbf, 0x2b, 0xcb, 0x88, 0x4a, 0x52, 0xbb, 0x47, 0x70, 0x8b, + 0xca, 0xe0, 0x3d, 0xdb, 0xfd, 0x09, 0xed, 0x37, 0x04, 0x0c, 0x62, 0x75, + 0xea, 0x8f, 0x00, 0x6e, 0xa3, 0x84, 0xdd, 0x9d, 0xc3, 0x9d, 0x2c, 0xe3, + 0x36, 0x4a, 0x64, 0x12, 0x39, 0x5c, 0x0d, 0x5f, 0xb0, 0x12, 0xab, 0x71, + 0x6b, 0xfb, 0x70, 0x1b, 0x65, 0xac, 0x98, 0xee, 0x37, 0x07, 0xdc, 0x41, + 0x25, 0x53, 0x69, 0x95, 0x87, 0x74, 0xc8, 0xf5, 0xae, 0x26, 0x7f, 0x3c, + 0xdb, 0x14, 0x43, 0x02, 0x37, 0x35, 0x95, 0x2d, 0xa1, 0xa1, 0x41, 0x5a, + 0x0d, 0xa1, 0xc7, 0xf9, 0xd5, 0x7b, 0xcc, 0x45, 0x62, 0xc5, 0x04, 0x4e, + 0x79, 0x0c, 0xcb, 0xb2, 0x49, 0x8a, 0x14, 0x85, 0xc9, 0xe9, 0xc7, 0xcd, + 0x7e, 0xbe, 0x34, 0x43, 0xcb, 0xae, 0x01, 0x20, 0xda, 0x5e, 0xd7, 0xb6, + 0xf7, 0x7a, 0x1b, 0x65, 0xf0, 0x9f, 0x14, 0x99, 0x80, 0x7f, 0xb1, 0x69, + 0x3f, 0x18, 0x2f, 0xa8, 0x9b, 0x77, 0xeb, 0xf0, 0x0c, 0x7c, 0x51, 0x47, + 0xf8, 0xe0, 0x07, 0x7b, 0x61, 0xe3, 0x4a, 0x0e, 0xec, 0xd8, 0xf1, 0xba, + 0xc2, 0xa3, 0x0e, 0xb4, 0xd9, 0x3f, 0xdd, 0xf2, 0xfa, 0x7b, 0xa0, 0x67, + 0x39, 0x70, 0xf0, 0xb5, 0xa8, 0x51, 0x67, 0xf5, 0xf6, 0xc2, 0x8e, 0xc0, + 0xf0, 0x5c, 0x73, 0xdd, 0x67, 0xad, 0x59, 0x8c, 0x9b, 0xfd, 0xd2, 0x28, + 0x26, 0x42, 0xa0, 0x5f, 0x57, 0x2a, 0x88, 0x6c, 0xeb, 0x37, 0x03, 0xe9, + 0x6d, 0xcd, 0xb7, 0x3e, 0x62, 0x16, 0x34, 0x5c, 0x40, 0x78, 0x50, 0x27, + 0x08, 0xf7, 0x9d, 0xdc, 0x9a, 0x0b, 0x02, 0x5c, 0xe9, 0x78, 0xd9, 0x18, + 0x00, 0xf7, 0xab, 0x51, 0xcb, 0xa2, 0x22, 0xb3, 0x04, 0x72, 0x05, 0x21, + 0xe0, 0x40, 0xdb, 0xeb, 0x1a, 0xfc, 0x1e, 0x92, 0x69, 0x40, 0x51, 0x03, + 0x5d, 0xe2, 0x06, 0x12, 0xa3, 0x93, 0x96, 0x1b, 0x0a, 0x54, 0x23, 0x09, + 0x82, 0x05, 0xcd, 0x37, 0x39, 0xdd, 0x4d, 0x6b, 0x1a, 0x2b, 0xb3, 0x04, + 0x50, 0x03, 0xd7, 0x03, 0x54, 0x29, 0x7f, 0x37, 0x00, 0xd4, 0x12, 0x0d, + 0x0d, 0x2e, 0xd6, 0xe5, 0x15, 0xf4, 0xf7, 0xba, 0xaa, 0xac, 0xaa, 0xf3, + 0x97, 0x00, 0xa7, 0x11, 0x47, 0xc6, 0x14, 0x6c, 0x8a, 0x1a, 0x88, 0x84, + 0xea, 0xef, 0xd4, 0x63, 0x92, 0x78, 0x43, 0x50, 0xd7, 0xcf, 0xea, 0x9c, + 0x80, 0x62, 0x4d, 0x52, 0x25, 0xf0, 0x9d, 0x46, 0x2a, 0x28, 0x57, 0xa1, + 0xa6, 0x81, 0x5e, 0x42, 0xa5, 0x15, 0x31, 0x05, 0x72, 0x14, 0xf8, 0x9f, + 0x0a, 0x83, 0xfd, 0x63, 0xd1, 0xc0, 0x83, 0x69, 0xf9, 0xaa, 0x87, 0xfc, + 0x56, 0x5f, 0xb5, 0xde, 0xfb, 0x5e, 0x5e, 0x2a, 0x97, 0x28, 0x14, 0x54, + 0x5b, 0x61, 0xe0, 0xb2, 0x01, 0xb6, 0xdf, 0xba, 0x9d, 0xdc, 0x92, 0x1c, + 0xb9, 0x25, 0x39, 0xf2, 0x47, 0xf3, 0x6c, 0xfa, 0xcc, 0x56, 0x00, 0x76, + 0x7e, 0x76, 0xab, 0x0f, 0xd2, 0xd2, 0xe5, 0x24, 0xa9, 0x93, 0x12, 0x71, + 0xf2, 0x15, 0x20, 0x56, 0x47, 0x10, 0x47, 0x02, 0x85, 0x46, 0x9d, 0x9c, + 0x88, 0x53, 0x30, 0xdd, 0x31, 0x03, 0x75, 0x0b, 0x82, 0xbe, 0x1a, 0x82, + 0x6c, 0xa3, 0x4e, 0x41, 0x87, 0xdd, 0xd2, 0x80, 0xf7, 0xd3, 0xfe, 0xfb, + 0xa5, 0xa5, 0xfd, 0x7e, 0xf4, 0xa3, 0xe9, 0x5b, 0xf1, 0x3f, 0x46, 0x01, + 0x77, 0xce, 0xe6, 0x02, 0xa6, 0x4a, 0xcf, 0xf2, 0x52, 0xba, 0xd6, 0x36, + 0xde, 0xdc, 0x52, 0xa2, 0x63, 0xd8, 0x6c, 0x54, 0x3a, 0x55, 0xf1, 0x20, + 0x5a, 0x46, 0x87, 0xf3, 0x27, 0x49, 0x27, 0x20, 0x9d, 0x50, 0xe1, 0xe9, + 0x79, 0xdd, 0x5e, 0xd8, 0x19, 0xb1, 0x39, 0x6d, 0xb7, 0xcd, 0xee, 0x4e, + 0x6a, 0x86, 0x66, 0x6d, 0x7c, 0xc3, 0xe3, 0xec, 0x58, 0xa2, 0x80, 0x5a, + 0xc0, 0x2b, 0x02, 0x6a, 0x19, 0xd0, 0xd7, 0xe9, 0x68, 0xf7, 0x73, 0xdf, + 0x64, 0x33, 0xab, 0xf8, 0xab, 0x03, 0x07, 0xf8, 0xc0, 0xdc, 0xb9, 0x1e, + 0x38, 0xeb, 0xdc, 0x55, 0xab, 0xb8, 0x0c, 0xf8, 0xd1, 0xfe, 0xfd, 0x00, + 0x1e, 0x4c, 0x0b, 0xed, 0x77, 0xec, 0xa1, 0x87, 0xbc, 0xfd, 0x73, 0xde, + 0xdc, 0x45, 0x57, 0xfa, 0x1c, 0xbe, 0x51, 0x9e, 0xf2, 0xae, 0x6b, 0x48, + 0x81, 0x7b, 0xdd, 0x00, 0xa6, 0xdc, 0x36, 0x00, 0xa9, 0xdc, 0x85, 0x59, + 0xca, 0xe5, 0x12, 0xc4, 0xc2, 0x48, 0xea, 0x7a, 0x25, 0x0c, 0x69, 0x8b, + 0xc7, 0x20, 0x9d, 0xb4, 0x70, 0xaa, 0x2e, 0x42, 0xd6, 0x89, 0x77, 0xc7, + 0x11, 0x31, 0x41, 0x9d, 0x3a, 0x55, 0x47, 0xc1, 0xaf, 0x72, 0x0b, 0xb2, + 0x58, 0xbd, 0x59, 0x44, 0x37, 0xa4, 0x49, 0x87, 0xf2, 0x94, 0x53, 0x92, + 0x64, 0xda, 0x00, 0xfb, 0x82, 0x70, 0x2d, 0x7f, 0x6b, 0xc0, 0x5b, 0x72, + 0x4a, 0xdd, 0xcf, 0xce, 0xa4, 0x43, 0xba, 0x3b, 0x8d, 0xe8, 0x16, 0x5e, + 0x58, 0x5d, 0x4a, 0xa8, 0x06, 0x9e, 0xa7, 0x02, 0xac, 0x79, 0x96, 0xfe, + 0x3e, 0xe8, 0xc7, 0x0b, 0x2e, 0xea, 0x45, 0x43, 0x6a, 0x20, 0x96, 0x85, + 0x5b, 0x6a, 0x6d, 0x2b, 0x8b, 0x84, 0xa0, 0x5e, 0xab, 0x23, 0x12, 0x16, + 0xf1, 0xa2, 0xa4, 0x5e, 0x53, 0xf3, 0x26, 0xac, 0xb4, 0x6a, 0x53, 0x4a, + 0xe9, 0x62, 0xcd, 0x13, 0xb8, 0xa7, 0x9a, 0xbe, 0x41, 0xc6, 0x14, 0xa8, + 0x4b, 0x4a, 0x81, 0x35, 0x4f, 0xb5, 0x67, 0xcb, 0xb5, 0x82, 0xff, 0xdc, + 0x35, 0xe7, 0xdb, 0x7c, 0x3f, 0x9e, 0x92, 0x64, 0x17, 0xe7, 0x14, 0x80, + 0x4b, 0x42, 0x92, 0x24, 0x32, 0x25, 0xa9, 0xc7, 0xc0, 0x2d, 0x3b, 0xd0, + 0xad, 0xce, 0x41, 0xff, 0xc5, 0x03, 0x94, 0xf4, 0x58, 0x7c, 0x32, 0x91, + 0xa6, 0xea, 0x06, 0xc6, 0x03, 0x9b, 0x9e, 0xe1, 0xc1, 0x6b, 0x6f, 0xe0, + 0x51, 0x2d, 0xc7, 0xd7, 0x23, 0xf8, 0xe7, 0x27, 0xff, 0x0c, 0xf4, 0xab, + 0x7e, 0x7c, 0xfc, 0x69, 0x16, 0xbc, 0x7c, 0x35, 0x5c, 0xf0, 0x28, 0x00, + 0x5b, 0x5e, 0x56, 0xbf, 0xff, 0xfb, 0xe3, 0xeb, 0x18, 0xcd, 0xdb, 0x5e, + 0x9a, 0x66, 0x80, 0x54, 0x10, 0x1c, 0xe5, 0x81, 0xae, 0xda, 0xac, 0xa9, + 0xd5, 0xf7, 0xde, 0xb7, 0x7b, 0xee, 0xb1, 0xef, 0x3c, 0x4e, 0x4f, 0x2a, + 0xfc, 0x25, 0x35, 0xff, 0x94, 0xc3, 0xfa, 0x4b, 0x36, 0xb0, 0xeb, 0xd0, + 0xce, 0x50, 0x59, 0x72, 0x52, 0xaa, 0x71, 0xf9, 0x80, 0x0c, 0x28, 0xcc, + 0x83, 0x6f, 0x01, 0xbc, 0x11, 0x6c, 0x0d, 0xf2, 0x3a, 0x2f, 0xd5, 0xcb, + 0xbb, 0x03, 0xe5, 0x3d, 0xa2, 0x81, 0x5e, 0x3f, 0x2c, 0x4f, 0xe0, 0x8c, + 0x9f, 0xe4, 0xb1, 0xff, 0x18, 0x83, 0xb1, 0xc0, 0xb9, 0xd1, 0x40, 0x2d, + 0xef, 0xf8, 0x4e, 0x4a, 0x0f, 0x3a, 0x06, 0xe0, 0x7e, 0xf1, 0xdd, 0x88, + 0xcf, 0x3d, 0x42, 0xf1, 0xe8, 0x08, 0x99, 0x25, 0x3e, 0xd9, 0xbe, 0x05, + 0x2a, 0x16, 0xd8, 0x37, 0xdb, 0xe0, 0xf9, 0x31, 0x40, 0x2d, 0xb3, 0x6d, + 0x96, 0xf1, 0x9f, 0xdf, 0xb5, 0xac, 0xc5, 0xff, 0x38, 0x07, 0xdb, 0xdf, + 0xd3, 0x91, 0x22, 0x45, 0x8a, 0x14, 0x29, 0x52, 0xa4, 0x48, 0x91, 0x22, + 0x45, 0x8a, 0x14, 0x29, 0x52, 0xa4, 0x48, 0x91, 0x22, 0x45, 0x8a, 0x14, + 0x29, 0x52, 0xa4, 0x48, 0x91, 0x22, 0x45, 0x8a, 0x14, 0x69, 0x56, 0x8a, + 0xa0, 0x5a, 0x91, 0x22, 0x45, 0x8a, 0x14, 0x29, 0xd2, 0xcf, 0x50, 0x75, + 0x46, 0x99, 0xc3, 0xab, 0x07, 0x51, 0xa5, 0xbb, 0xd3, 0xb8, 0xee, 0xec, + 0x8c, 0x63, 0x8c, 0x52, 0x3d, 0x29, 0x0f, 0x82, 0x93, 0xee, 0x4e, 0x52, + 0x9a, 0x2c, 0xe1, 0x14, 0x1d, 0xa4, 0x94, 0x94, 0xca, 0x25, 0xd2, 0xa9, + 0xb4, 0x07, 0xd6, 0x32, 0x90, 0x97, 0xf2, 0x64, 0x19, 0x4b, 0xaf, 0x4c, + 0x9a, 0xd4, 0x30, 0xa0, 0x6a, 0xad, 0xaa, 0xe0, 0x4b, 0x9d, 0x56, 0xdb, + 0xfc, 0x25, 0x50, 0xb5, 0xc9, 0xa8, 0x74, 0x26, 0xd5, 0x19, 0x6d, 0x9d, + 0x98, 0xfc, 0x09, 0x07, 0xfe, 0x78, 0x0e, 0x32, 0x30, 0x8f, 0x58, 0x24, + 0xd4, 0x4a, 0xcb, 0x56, 0x42, 0x20, 0xb5, 0x51, 0xab, 0x25, 0x34, 0x44, + 0xc2, 0x4c, 0x0c, 0x6f, 0xf8, 0x00, 0x8d, 0x66, 0xc3, 0x16, 0xb7, 0x26, + 0x11, 0xd5, 0xf0, 0xda, 0xd8, 0x2d, 0x2a, 0xbb, 0x6a, 0x36, 0x78, 0x70, + 0x02, 0xe3, 0xa4, 0x4b, 0xdc, 0x42, 0xc1, 0xa9, 0x42, 0x12, 0xde, 0x2a, + 0xcd, 0x5e, 0x89, 0x45, 0x03, 0xe2, 0xf2, 0x27, 0xca, 0xca, 0xc9, 0x36, + 0x79, 0x06, 0x54, 0x47, 0x71, 0x0a, 0xe2, 0x00, 0x93, 0x52, 0x95, 0x15, + 0xf0, 0x67, 0x52, 0xaa, 0x59, 0xee, 0xa5, 0xc0, 0x2a, 0xb2, 0xc6, 0x51, + 0x0a, 0xc4, 0x03, 0xea, 0xc5, 0xd6, 0xdf, 0x75, 0xbd, 0xe8, 0x42, 0xb7, + 0x20, 0x5e, 0x92, 0x04, 0xa7, 0xef, 0xd6, 0x09, 0xe7, 0xd9, 0x51, 0xc7, + 0x7d, 0xb8, 0x58, 0xc8, 0xaf, 0x27, 0x70, 0x4c, 0x4d, 0x50, 0xa4, 0x90, + 0x74, 0xf9, 0x80, 0xba, 0xae, 0x4d, 0x46, 0x63, 0xe6, 0xbe, 0x76, 0x6b, + 0x75, 0xac, 0x44, 0x60, 0xc2, 0x71, 0x03, 0xca, 0x15, 0x87, 0x54, 0x2a, + 0x8b, 0xd4, 0xbf, 0x29, 0x71, 0x9a, 0x50, 0x2d, 0x50, 0x60, 0x2d, 0x23, + 0xb7, 0x56, 0xd6, 0xfb, 0xf1, 0x0e, 0x71, 0xed, 0xd0, 0xb6, 0xd9, 0xdd, + 0x2e, 0x6e, 0xb3, 0xdb, 0xee, 0xb1, 0xa9, 0xba, 0xed, 0xef, 0x01, 0x3b, + 0x63, 0xe3, 0xba, 0x6e, 0x4b, 0xb8, 0x9d, 0xb1, 0x71, 0x8a, 0x6d, 0x20, + 0x5d, 0xa7, 0xe1, 0x9f, 0xd4, 0x40, 0x95, 0xe6, 0xbc, 0x3b, 0xf9, 0xa7, + 0x7b, 0xd2, 0x94, 0x26, 0x5b, 0x7f, 0x94, 0xb3, 0xf1, 0x9f, 0x8d, 0xb1, + 0xc9, 0x74, 0xf7, 0xb5, 0x53, 0x54, 0xf9, 0x24, 0x13, 0x71, 0x0f, 0x3a, + 0xa8, 0x8c, 0x62, 0xd4, 0x8f, 0x3f, 0x05, 0x24, 0x45, 0x92, 0x23, 0x4f, + 0x1e, 0xc1, 0xd2, 0xab, 0x24, 0x9b, 0x2b, 0x36, 0x7c, 0x68, 0x98, 0x64, + 0x22, 0xc9, 0x50, 0xa5, 0xc4, 0xc0, 0x8a, 0x01, 0xd2, 0x81, 0x55, 0x9f, + 0xdb, 0x9d, 0x2b, 0x25, 0x19, 0x5a, 0x85, 0xd9, 0x4e, 0xa7, 0x48, 0xa7, + 0xd2, 0xb8, 0x55, 0xd7, 0x9b, 0x90, 0x6d, 0x8c, 0x72, 0xec, 0x1e, 0x9b, + 0x81, 0x15, 0x7d, 0x54, 0x5d, 0x49, 0xe6, 0x50, 0xab, 0x01, 0xa1, 0xdb, + 0x50, 0x06, 0x7f, 0x6e, 0x20, 0x3f, 0x2b, 0x26, 0x28, 0x96, 0xcb, 0x64, + 0x52, 0x29, 0x2f, 0xdc, 0xc4, 0x35, 0xe1, 0x41, 0x37, 0xf8, 0x10, 0x2c, + 0xab, 0xdb, 0x0a, 0xc5, 0x6f, 0xe7, 0x36, 0x2a, 0x96, 0xcb, 0xaf, 0x4b, + 0x7c, 0xe3, 0x36, 0xc7, 0x10, 0x3e, 0x73, 0x4d, 0x67, 0x52, 0x1f, 0x87, + 0x88, 0x09, 0xca, 0x06, 0xe4, 0xd5, 0xe6, 0xbe, 0x66, 0xc3, 0x38, 0x7c, + 0x72, 0x2e, 0x37, 0x8c, 0x8f, 0xb7, 0x9c, 0xc3, 0x76, 0xba, 0x6d, 0xc1, + 0x82, 0x16, 0x70, 0x54, 0x10, 0x1a, 0x45, 0x60, 0x1b, 0x8c, 0x63, 0xc2, + 0x37, 0x6a, 0x38, 0xd4, 0x01, 0x0e, 0x78, 0xc0, 0xa8, 0xeb, 0x6f, 0xbb, + 0x8d, 0xde, 0xfd, 0xfb, 0xf9, 0x5f, 0x73, 0x6e, 0xe0, 0x8b, 0xc0, 0xaa, + 0xeb, 0xaf, 0xa7, 0x77, 0x81, 0x6f, 0xdc, 0x76, 0x83, 0x86, 0xe7, 0x5c, + 0x7f, 0x1b, 0x6d, 0xfd, 0x6e, 0xbb, 0xfe, 0x7a, 0x6e, 0xb8, 0xfd, 0x76, + 0x40, 0x6d, 0xaf, 0xbf, 0x0d, 0x26, 0xc6, 0xc7, 0x99, 0xb8, 0xfd, 0x76, + 0x56, 0x06, 0xcc, 0x00, 0x4d, 0xb9, 0xc1, 0xba, 0x06, 0xeb, 0x36, 0x5d, + 0xfd, 0x67, 0x3a, 0x26, 0x03, 0xdc, 0x0a, 0x4e, 0x97, 0x57, 0x79, 0x4e, + 0xb4, 0xa4, 0x9b, 0x08, 0xc5, 0x99, 0x60, 0xa3, 0xae, 0xa3, 0x81, 0x66, + 0xf5, 0x12, 0x9e, 0x74, 0x7f, 0x80, 0x09, 0x56, 0xd2, 0x4b, 0xf1, 0x36, + 0x65, 0x2a, 0xb8, 0xf2, 0x86, 0x95, 0x5e, 0xbe, 0x2b, 0x03, 0x60, 0xaf, + 0x50, 0xaa, 0x0d, 0xe3, 0xad, 0x06, 0x82, 0x87, 0x1c, 0x98, 0xeb, 0x5f, + 0xff, 0x6f, 0x8c, 0x3e, 0xc6, 0x15, 0x87, 0xfc, 0xe0, 0x4b, 0x97, 0xbe, + 0x8d, 0x87, 0x8e, 0x3c, 0xc5, 0xa5, 0x4b, 0x7f, 0xfa, 0x60, 0x2d, 0x5b, + 0x08, 0x44, 0xc0, 0x80, 0x60, 0xdf, 0x44, 0x00, 0x9c, 0x55, 0x51, 0xa0, + 0xad, 0xfc, 0xa4, 0x8b, 0xdd, 0x06, 0xbe, 0xf7, 0x8b, 0xa6, 0x7c, 0x7b, + 0x0a, 0x41, 0x58, 0x9d, 0x80, 0x79, 0x4d, 0xfb, 0x59, 0x84, 0xba, 0xae, + 0xcd, 0x06, 0x82, 0x4f, 0x1c, 0x83, 0x39, 0xaf, 0x21, 0x10, 0xf6, 0x2f, + 0xd6, 0xb7, 0x78, 0x4d, 0x87, 0x30, 0x8c, 0xa7, 0x61, 0xc7, 0x92, 0xf0, + 0xb5, 0xda, 0xb5, 0xc2, 0x62, 0xe3, 0x51, 0xbf, 0xed, 0x53, 0x7e, 0x78, + 0x17, 0xfc, 0x68, 0x5d, 0x63, 0xa1, 0x00, 0x00, 0x20, 0x00, 0x49, 0x44, + 0x41, 0x54, 0xe5, 0x20, 0x5c, 0x7e, 0x84, 0xf5, 0xbb, 0x36, 0xb0, 0x0b, + 0x28, 0xdf, 0x11, 0x06, 0x6b, 0x79, 0x40, 0xad, 0x20, 0x40, 0xcb, 0xb8, + 0x83, 0xc0, 0xac, 0xeb, 0x99, 0x5d, 0xbc, 0x7b, 0xb6, 0x4e, 0x53, 0xeb, + 0x26, 0x65, 0xf4, 0x39, 0x7d, 0xa2, 0xa0, 0xc0, 0x5a, 0x1d, 0xdf, 0x5b, + 0xc0, 0x0f, 0x87, 0xe1, 0xbc, 0x81, 0xd9, 0xe7, 0xfd, 0x4a, 0xf5, 0xc4, + 0xb1, 0x56, 0xb0, 0xd6, 0x27, 0x1c, 0xd8, 0x10, 0x30, 0x64, 0x8b, 0x2b, + 0x60, 0x2d, 0xa0, 0x2d, 0x2f, 0x01, 0x24, 0xf1, 0xf9, 0x69, 0x6f, 0xa4, + 0x34, 0x39, 0x2f, 0x0e, 0x87, 0x95, 0x5b, 0x98, 0x57, 0x89, 0xbe, 0xff, + 0xc6, 0xbe, 0xd7, 0xa1, 0x11, 0x0c, 0x6c, 0xd9, 0x6c, 0x8c, 0xee, 0x85, + 0x6e, 0xf7, 0x1b, 0x83, 0xa9, 0xa0, 0x1f, 0x50, 0x0b, 0xfb, 0x1b, 0xb7, + 0xac, 0x38, 0xd0, 0xf4, 0xbb, 0xf8, 0x04, 0xb0, 0xe5, 0xd9, 0x67, 0x39, + 0xe7, 0x9c, 0x73, 0x54, 0xdd, 0x56, 0xa5, 0x41, 0xdf, 0xfe, 0xb2, 0xa2, + 0xd2, 0x7b, 0x70, 0xd4, 0x5a, 0xfb, 0x72, 0x8d, 0x0c, 0x50, 0xcb, 0x77, + 0x87, 0x8d, 0xe1, 0xda, 0x95, 0xd5, 0xdc, 0x1a, 0x57, 0x40, 0x2d, 0x1f, + 0x1e, 0x21, 0xf7, 0xee, 0x64, 0xd3, 0x67, 0x72, 0x2a, 0xcf, 0xab, 0x36, + 0xb0, 0xed, 0x37, 0xaf, 0x6b, 0x01, 0x6a, 0xdd, 0xb9, 0x37, 0x0f, 0x9f, + 0xc9, 0x72, 0xed, 0x55, 0x39, 0xf2, 0xbf, 0xb9, 0xa7, 0x05, 0xa8, 0x75, + 0xff, 0x6d, 0xc0, 0x07, 0x9f, 0xe2, 0x8a, 0x1b, 0x60, 0x74, 0xe0, 0x6d, + 0x2d, 0x40, 0xad, 0xc2, 0x5d, 0xdb, 0x59, 0x7d, 0x91, 0x6f, 0xb4, 0xa4, + 0x2a, 0xdb, 0xfa, 0xbe, 0xfe, 0x9d, 0x71, 0x60, 0x2e, 0xd3, 0xaa, 0xb9, + 0xef, 0x24, 0xa7, 0x09, 0x7b, 0x25, 0x0a, 0xa6, 0x6d, 0xf7, 0x94, 0x0a, + 0x02, 0xaf, 0x5e, 0x29, 0x90, 0xea, 0x8d, 0x73, 0x15, 0x4d, 0xe5, 0xcd, + 0x56, 0x17, 0x2f, 0xcd, 0xfd, 0x31, 0x73, 0x5f, 0x7a, 0xb1, 0x25, 0xbf, + 0x5f, 0x94, 0x63, 0x69, 0xce, 0xbf, 0x5d, 0x7e, 0xbf, 0x33, 0xde, 0x06, + 0xc0, 0xa3, 0xdf, 0xd7, 0x03, 0xcb, 0x04, 0x37, 0x4e, 0x3a, 0x88, 0xcf, + 0x0e, 0x03, 0x82, 0xc2, 0xda, 0x34, 0x7b, 0xee, 0x76, 0xc8, 0x5e, 0x28, + 0x59, 0xbd, 0x2a, 0xc7, 0x9e, 0x5b, 0xcd, 0xfd, 0x5a, 0xe7, 0xce, 0x95, + 0xea, 0x3e, 0x29, 0x97, 0xd4, 0x36, 0xd5, 0xc8, 0x22, 0xa5, 0xc4, 0x72, + 0x61, 0xe8, 0xc1, 0x38, 0x57, 0x7c, 0x08, 0x76, 0xde, 0xe1, 0xf7, 0x0f, + 0x0c, 0x1c, 0x78, 0xb5, 0xb4, 0x01, 0xc1, 0xb5, 0x2b, 0x04, 0x77, 0xde, + 0x25, 0xb9, 0xf6, 0x1a, 0xc1, 0xb6, 0xcf, 0xaa, 0x30, 0x7b, 0x99, 0xea, + 0x1f, 0x38, 0x13, 0xc7, 0xd8, 0x7c, 0xa5, 0xcd, 0x9e, 0xb1, 0x3a, 0x29, + 0x6d, 0xb4, 0x9c, 0x92, 0xfe, 0xfd, 0xe5, 0x14, 0x1d, 0x2f, 0xee, 0xf0, + 0xdd, 0xb0, 0x7e, 0x2d, 0xec, 0x42, 0x43, 0x81, 0x32, 0x36, 0x03, 0x6b, + 0x61, 0x78, 0x44, 0xea, 0xf6, 0xbf, 0x6e, 0xcf, 0x4f, 0x48, 0xc8, 0x68, + 0x38, 0x70, 0xaf, 0x60, 0xe8, 0x0e, 0x0d, 0xcc, 0xba, 0x0b, 0x4a, 0x93, + 0x47, 0xb0, 0x97, 0xf7, 0xe3, 0x38, 0xc3, 0xc8, 0x09, 0xc9, 0x86, 0x8f, + 0x0b, 0x76, 0x8d, 0xd0, 0x12, 0x0f, 0x60, 0xd7, 0x88, 0xca, 0x4b, 0xc4, + 0xaa, 0xc8, 0x46, 0x9c, 0xad, 0x9f, 0xd9, 0xc0, 0xd6, 0x5b, 0x95, 0x91, + 0x62, 0xbd, 0xe6, 0xf7, 0xbe, 0x45, 0xac, 0xae, 0xf7, 0x03, 0xd7, 0xa5, + 0xa6, 0xc2, 0x0c, 0x1c, 0xa0, 0x5a, 0x56, 0x75, 0x4b, 0xd9, 0x83, 0x94, + 0x26, 0x24, 0x22, 0x25, 0xb0, 0x84, 0xf2, 0xcb, 0x76, 0x4b, 0xdc, 0x98, + 0x45, 0xb2, 0xe6, 0x52, 0x6d, 0xa8, 0xe7, 0x58, 0x2e, 0xa3, 0x00, 0xa0, + 0xae, 0x2b, 0x3d, 0xe8, 0x59, 0xf0, 0xfd, 0xbd, 0xe2, 0x03, 0x39, 0x86, + 0xee, 0x83, 0xf4, 0xfc, 0x92, 0x3a, 0xea, 0x36, 0xef, 0xeb, 0xe0, 0x7d, + 0xfd, 0xc3, 0x26, 0x60, 0xd6, 0x5c, 0xe0, 0x87, 0x81, 0xfd, 0x5f, 0xfd, + 0xbf, 0xdf, 0xc0, 0x1b, 0x98, 0x59, 0xb3, 0x89, 0x13, 0x69, 0x76, 0x7a, + 0x12, 0x78, 0x2f, 0x0a, 0xa6, 0xf5, 0x6f, 0xda, 0xef, 0x47, 0xc0, 0xb9, + 0xc0, 0xbf, 0x4c, 0x93, 0xae, 0xed, 0x7d, 0xad, 0xfb, 0x5c, 0x85, 0x4a, + 0xd8, 0xfb, 0xec, 0x97, 0x60, 0x09, 0x0a, 0x96, 0x65, 0x5f, 0xa3, 0x3d, + 0xff, 0xb2, 0x04, 0xa4, 0xe1, 0xcf, 0x81, 0xbb, 0x60, 0x57, 0xc5, 0x61, + 0xcd, 0x5a, 0x28, 0x3b, 0x70, 0xdd, 0x7d, 0xf7, 0x30, 0x00, 0xac, 0xbf, + 0xa6, 0xce, 0xd6, 0xdb, 0xca, 0xf4, 0x37, 0x13, 0xaf, 0x9a, 0xf4, 0xf5, + 0x5b, 0xe3, 0x98, 0x17, 0xeb, 0x42, 0xe0, 0x78, 0x97, 0x2a, 0xb3, 0x2a, + 0xd5, 0x7d, 0xea, 0x00, 0x03, 0x77, 0xfb, 0xf1, 0xc3, 0xad, 0x9d, 0xa9, + 0xe9, 0x33, 0xd7, 0xfa, 0x21, 0x70, 0xf0, 0xe0, 0x41, 0xe4, 0x63, 0xeb, + 0x18, 0x35, 0x49, 0x32, 0x19, 0x8e, 0x77, 0xc1, 0xca, 0x29, 0xb8, 0x99, + 0x2e, 0xee, 0x9d, 0x9a, 0xe2, 0xa3, 0x8b, 0x61, 0xe1, 0xa6, 0xf0, 0xb1, + 0xbf, 0xe5, 0xed, 0xc0, 0x31, 0x05, 0xfc, 0x5a, 0xb8, 0xa8, 0x8b, 0xa3, + 0x3f, 0x98, 0xbe, 0xac, 0x85, 0x1a, 0xf4, 0xc5, 0xcd, 0x0a, 0xb0, 0x75, + 0xef, 0xcd, 0x81, 0xc0, 0x75, 0x99, 0xa6, 0xd8, 0x4d, 0xfb, 0xbb, 0x81, + 0x75, 0xed, 0x72, 0x35, 0xf1, 0x8a, 0x81, 0x78, 0xed, 0xd2, 0x66, 0x54, + 0x9c, 0xdd, 0xc0, 0xcd, 0xa8, 0x76, 0x55, 0xbb, 0x3e, 0x97, 0x6e, 0x9b, + 0x39, 0x25, 0x49, 0xa9, 0xac, 0x46, 0x44, 0xdd, 0xfd, 0x57, 0x03, 0xaf, + 0xfe, 0x7d, 0xb2, 0xe1, 0xb6, 0x7f, 0x62, 0xe7, 0x0d, 0xef, 0x79, 0x95, + 0xb9, 0x28, 0x6d, 0xbf, 0xbc, 0xc0, 0xe0, 0x45, 0x36, 0xf9, 0xa2, 0xab, + 0x0e, 0xfd, 0x9d, 0xca, 0x5f, 0xa4, 0x04, 0x1c, 0x97, 0x6c, 0xbe, 0xaa, + 0x8f, 0x6d, 0xbf, 0x3b, 0x36, 0x5d, 0x16, 0x00, 0x64, 0xef, 0x96, 0x8c, + 0x8d, 0x57, 0x39, 0x52, 0x56, 0xe3, 0x58, 0x83, 0x17, 0xd9, 0x0c, 0x7d, + 0xdf, 0x21, 0x9f, 0x10, 0x0c, 0x16, 0xca, 0x6c, 0x5e, 0xdb, 0xc7, 0xd0, + 0xdf, 0x8c, 0x90, 0x4f, 0x08, 0x95, 0xe7, 0xde, 0x99, 0xf3, 0x6c, 0xa7, + 0x35, 0x17, 0xd9, 0xb8, 0xfb, 0xaf, 0x66, 0xcf, 0x0c, 0x90, 0xae, 0x1d, + 0x57, 0xde, 0xcf, 0x75, 0xb7, 0xbf, 0x8f, 0xb1, 0x07, 0x5d, 0x05, 0x07, + 0x5b, 0xae, 0x0c, 0xf8, 0x73, 0x8b, 0x75, 0xfb, 0x71, 0x52, 0xc2, 0x62, + 0xc1, 0x3d, 0x13, 0xd7, 0x91, 0x5b, 0x78, 0x1a, 0x2d, 0x89, 0x36, 0x6d, + 0xb3, 0x81, 0x36, 0x6d, 0x33, 0x4b, 0xa4, 0x48, 0x76, 0x5b, 0x94, 0x8b, + 0x49, 0xbc, 0x46, 0xad, 0x17, 0x96, 0x06, 0x56, 0x60, 0x09, 0x0b, 0x57, + 0xba, 0xda, 0x6f, 0x50, 0x83, 0xb6, 0x02, 0xf1, 0x62, 0x69, 0xaa, 0x95, + 0x12, 0x6e, 0xa3, 0x84, 0x15, 0x4b, 0x93, 0xec, 0x4e, 0x53, 0xac, 0xa5, + 0xb1, 0xc4, 0x52, 0xdc, 0xda, 0x3e, 0xac, 0xc4, 0x6a, 0xac, 0x98, 0x85, + 0xdb, 0x28, 0x03, 0x69, 0xac, 0x58, 0x4a, 0xbb, 0x83, 0x2a, 0x51, 0x2d, + 0x97, 0x70, 0xa5, 0x83, 0x25, 0xec, 0x16, 0xa0, 0xd6, 0x2d, 0x57, 0x2e, + 0xe5, 0xa6, 0xfb, 0x8e, 0x00, 0xb7, 0x04, 0x7c, 0x87, 0x15, 0x48, 0x2b, + 0x06, 0x52, 0x6f, 0xdd, 0x86, 0xc4, 0xd2, 0xef, 0x38, 0x57, 0x0a, 0x0d, + 0x77, 0x06, 0xd7, 0x75, 0x02, 0x7d, 0x8d, 0x9f, 0x77, 0xcd, 0xe2, 0xce, + 0x0b, 0x80, 0x82, 0x06, 0xc6, 0xdb, 0x00, 0xd3, 0xf4, 0x33, 0xdc, 0x28, + 0x83, 0x0f, 0xca, 0x2a, 0xb6, 0xf1, 0x9b, 0x4e, 0xcb, 0xf5, 0xb6, 0xd8, + 0xe4, 0x5f, 0x44, 0xc1, 0xb4, 0x5a, 0x35, 0xc1, 0xc4, 0x81, 0xd3, 0xc3, + 0x46, 0xcd, 0x04, 0xc4, 0xea, 0x05, 0x76, 0x68, 0xf7, 0x74, 0xf1, 0x82, + 0xa5, 0xce, 0x0a, 0xb0, 0xf5, 0x6d, 0xf8, 0xe2, 0xc1, 0xd9, 0x44, 0xf4, + 0xf3, 0x9f, 0x2d, 0xb8, 0x2b, 0x38, 0x8e, 0x17, 0x04, 0x6a, 0xbd, 0xaa, + 0xbc, 0x67, 0x31, 0x6e, 0xf6, 0xf3, 0x24, 0xf5, 0x1d, 0x4d, 0xe0, 0xba, + 0xe5, 0xb6, 0x0b, 0x53, 0xb4, 0x55, 0x43, 0x8d, 0xe1, 0xcb, 0x86, 0x44, + 0xd6, 0x5c, 0x1f, 0x52, 0x25, 0x81, 0x84, 0x6a, 0x8b, 0xcb, 0x86, 0x8b, + 0x08, 0xf6, 0xab, 0x35, 0xbc, 0x4a, 0x08, 0x0b, 0x29, 0x5d, 0x84, 0x70, + 0x15, 0x58, 0x4b, 0xe7, 0x67, 0x64, 0xda, 0xd0, 0x5e, 0xfc, 0x36, 0xbd, + 0xb3, 0xd9, 0x42, 0xb0, 0x3a, 0xc9, 0xa4, 0xf7, 0xeb, 0x34, 0x3b, 0xb0, + 0x56, 0x4b, 0x9c, 0x36, 0xed, 0x70, 0xf3, 0x9d, 0xab, 0x20, 0x25, 0xb6, + 0x10, 0x64, 0x9a, 0x16, 0x6a, 0x12, 0x31, 0x28, 0x36, 0xa0, 0xde, 0x90, + 0xc8, 0x98, 0x08, 0x3c, 0x27, 0xa4, 0xf7, 0x4d, 0xd3, 0x6d, 0xe0, 0x41, + 0x9d, 0xb2, 0x31, 0x70, 0x1b, 0x55, 0x4a, 0x24, 0x55, 0x97, 0x20, 0xe6, + 0xc3, 0xa0, 0x40, 0x81, 0xaa, 0x82, 0xf0, 0xaa, 0x34, 0x75, 0x0a, 0x31, + 0x70, 0x6b, 0xb0, 0xcb, 0x75, 0xb1, 0x13, 0x82, 0x35, 0x02, 0xb6, 0x35, + 0x92, 0x38, 0x93, 0xfa, 0xc3, 0x68, 0xac, 0x4e, 0xae, 0x3b, 0x8e, 0x53, + 0xf1, 0xd3, 0x1b, 0x19, 0x80, 0x96, 0x88, 0x49, 0x8a, 0x52, 0x60, 0x21, + 0x49, 0x25, 0x2c, 0xca, 0x35, 0x48, 0xc5, 0x24, 0x85, 0x06, 0x04, 0xb1, + 0x98, 0x52, 0xea, 0xb2, 0x1b, 0xaa, 0x5e, 0x06, 0xf0, 0x05, 0x60, 0x37, + 0xea, 0xb8, 0xba, 0xbe, 0x05, 0x0f, 0xfc, 0x15, 0x47, 0x36, 0x8d, 0xa9, + 0x40, 0x1c, 0x01, 0x0c, 0xed, 0xdd, 0x43, 0x3a, 0x9b, 0x25, 0xb7, 0x44, + 0x8d, 0x95, 0x94, 0x34, 0xf0, 0x79, 0xe8, 0x80, 0xff, 0x3e, 0xcb, 0x1f, + 0xcd, 0x7b, 0x7e, 0x4e, 0xe1, 0x88, 0x57, 0xf9, 0xe0, 0x95, 0xa9, 0x37, + 0xe2, 0x94, 0x65, 0x9d, 0x34, 0xa6, 0x4e, 0x75, 0xaf, 0x0e, 0x4e, 0xcd, + 0x87, 0x7b, 0xc9, 0x58, 0x73, 0x3d, 0x94, 0x0a, 0x7a, 0xb1, 0x99, 0x6b, + 0x1b, 0xc2, 0x3b, 0xd6, 0x76, 0xdf, 0xb9, 0x5c, 0x46, 0x99, 0xcb, 0xb9, + 0x00, 0x9c, 0x38, 0x71, 0x82, 0x79, 0x6d, 0x20, 0x52, 0x67, 0x73, 0x81, + 0x07, 0xd5, 0xfa, 0x31, 0x4f, 0x33, 0xdd, 0xd4, 0x86, 0x67, 0x5f, 0x98, + 0x62, 0x5e, 0xda, 0xcf, 0x63, 0xf1, 0xb9, 0x2b, 0x78, 0xe2, 0x47, 0x23, + 0xde, 0xfe, 0x4c, 0xd0, 0x2d, 0x03, 0xd0, 0x2a, 0xd5, 0x60, 0x59, 0x6e, + 0xbe, 0xb7, 0x6f, 0x94, 0x9e, 0xd7, 0x4d, 0xe9, 0x54, 0xa5, 0x63, 0xfa, + 0xd3, 0x55, 0x3b, 0x68, 0x96, 0x01, 0x6a, 0xbd, 0x52, 0x9d, 0x2e, 0x50, + 0xcb, 0x68, 0xdb, 0xdf, 0x7e, 0x92, 0x5f, 0x5b, 0x3a, 0x87, 0x47, 0x69, + 0xf0, 0xe8, 0x73, 0xdf, 0x84, 0xbf, 0xfd, 0x26, 0x00, 0xa7, 0x4e, 0xbc, + 0xcc, 0xbc, 0xb7, 0xce, 0xe1, 0x5d, 0x4f, 0xc4, 0x38, 0x77, 0xd5, 0x2a, + 0x0f, 0xa6, 0xf5, 0xc0, 0x4b, 0x2f, 0x85, 0xd2, 0x77, 0xa5, 0xcf, 0xe1, + 0xc4, 0x89, 0x13, 0x70, 0xd6, 0x39, 0xb8, 0x8c, 0xb6, 0x42, 0x78, 0xf4, + 0x33, 0x3c, 0xff, 0x64, 0x01, 0x2b, 0x30, 0xaf, 0x43, 0x80, 0xfe, 0x2e, + 0xde, 0xfe, 0xf9, 0x21, 0xe2, 0xe1, 0xe7, 0xd7, 0xea, 0x77, 0xae, 0xc0, + 0x75, 0xfd, 0x36, 0xab, 0x1d, 0x17, 0x94, 0xf4, 0x18, 0x48, 0xb5, 0x5c, + 0x25, 0xde, 0x1d, 0xe7, 0xd8, 0x44, 0x09, 0xca, 0x92, 0xd1, 0x93, 0x05, + 0x06, 0x7b, 0xb3, 0x0a, 0xee, 0x5f, 0xab, 0x62, 0x2d, 0xf4, 0x7f, 0x3c, + 0x0a, 0x9c, 0xa5, 0x80, 0x55, 0xf1, 0x84, 0x0f, 0xd2, 0x0a, 0xaa, 0x5a, + 0x92, 0xa1, 0xb8, 0xd9, 0x54, 0x16, 0xb7, 0xe1, 0x22, 0x2b, 0x92, 0x6a, + 0x4c, 0x83, 0xb2, 0x84, 0x82, 0x72, 0xf5, 0x2f, 0xe9, 0xc7, 0x29, 0x97, + 0x28, 0x95, 0x1d, 0x84, 0x10, 0xa8, 0x3b, 0x5f, 0x42, 0x9d, 0x30, 0x50, + 0x4b, 0x1f, 0xb4, 0xac, 0x49, 0x6f, 0x8e, 0x8b, 0x71, 0x03, 0xde, 0x9c, + 0x17, 0x99, 0x40, 0x51, 0xf6, 0x40, 0xcd, 0x75, 0x88, 0x09, 0xe4, 0x94, + 0xeb, 0x0d, 0x6b, 0xb8, 0xa7, 0xa4, 0xbf, 0xa0, 0x97, 0x79, 0xfe, 0xc7, + 0x84, 0xca, 0x4f, 0xe2, 0xc5, 0x4d, 0x75, 0xa7, 0xd4, 0xfb, 0xa4, 0xf9, + 0xf4, 0xc6, 0x54, 0x3c, 0x11, 0x13, 0xec, 0xdb, 0xbb, 0x87, 0xd5, 0x57, + 0xae, 0xe6, 0xfe, 0xfd, 0xf7, 0xd0, 0x7f, 0xc9, 0x80, 0x82, 0xfd, 0x75, + 0xdb, 0xd0, 0x10, 0xc8, 0x2a, 0x8c, 0x7e, 0x7f, 0x18, 0x5b, 0x2f, 0x16, + 0x51, 0xad, 0x95, 0x10, 0xb1, 0x24, 0xb2, 0xa1, 0xbf, 0x93, 0x37, 0x3d, + 0xc3, 0xcd, 0x3d, 0x2d, 0x7a, 0x44, 0x08, 0x3c, 0x25, 0x50, 0x6d, 0xfd, + 0xf5, 0x97, 0x6c, 0xe0, 0x4b, 0xff, 0xb8, 0xc9, 0x03, 0x68, 0x79, 0xba, + 0xe0, 0x51, 0x78, 0xfa, 0x5d, 0x70, 0xc1, 0xa3, 0x6c, 0x9d, 0xf3, 0x76, + 0xb6, 0xbc, 0xfc, 0x38, 0xe9, 0x6e, 0x9b, 0xfe, 0xdc, 0x00, 0x4e, 0x43, + 0x3d, 0xc7, 0xc4, 0xfc, 0x70, 0x9e, 0x10, 0x06, 0x48, 0xc9, 0x31, 0x17, + 0xde, 0x08, 0xcf, 0x8c, 0x9f, 0xe4, 0x7c, 0x0d, 0xb9, 0x6a, 0x56, 0xdf, + 0x7b, 0xdf, 0xce, 0xd8, 0x77, 0x5a, 0xef, 0xb1, 0xdc, 0xc2, 0x2c, 0x42, + 0x8f, 0x27, 0x19, 0xc8, 0x15, 0xf3, 0x05, 0x0e, 0x25, 0xfa, 0x01, 0xd9, + 0x8b, 0x57, 0xb6, 0x01, 0x6b, 0x19, 0x3d, 0x36, 0x36, 0x86, 0x8d, 0x2a, + 0xcf, 0x00, 0xb5, 0x2e, 0x58, 0xfa, 0x16, 0x9e, 0x3e, 0xf2, 0x5c, 0x4b, + 0x39, 0x1e, 0xb0, 0x2b, 0x90, 0x57, 0x5b, 0xcd, 0x17, 0xb8, 0x37, 0xbe, + 0x1d, 0xeb, 0x0f, 0x1f, 0xe1, 0xe8, 0xf1, 0xfd, 0x0a, 0xa8, 0x35, 0xb6, + 0x4e, 0xe5, 0xf1, 0x7f, 0x7d, 0xcd, 0x4b, 0x27, 0xfa, 0x2c, 0x1f, 0xc4, + 0x15, 0x84, 0x98, 0x69, 0x3f, 0xa3, 0xe7, 0x7f, 0xe2, 0x70, 0xd6, 0x19, + 0x36, 0xcf, 0xff, 0xc4, 0xef, 0xaf, 0x99, 0xfd, 0x17, 0x5e, 0x9c, 0x01, + 0x4d, 0x7e, 0x26, 0xed, 0xef, 0xe9, 0x48, 0x91, 0x22, 0x45, 0x8a, 0x14, + 0x29, 0x52, 0xa4, 0x48, 0x91, 0x22, 0x45, 0x8a, 0x14, 0x29, 0x52, 0xa4, + 0x48, 0x91, 0x22, 0x45, 0x8a, 0x14, 0x29, 0x52, 0xa4, 0x48, 0x91, 0x22, + 0x45, 0x8a, 0x34, 0x2b, 0x45, 0x50, 0xad, 0x48, 0x91, 0x22, 0x45, 0x8a, + 0x14, 0xe9, 0x67, 0xa5, 0xfb, 0x80, 0x2b, 0x41, 0x2c, 0x14, 0xc8, 0xc3, + 0xaf, 0x2e, 0x2b, 0x03, 0xc7, 0x3a, 0x1d, 0x05, 0x61, 0x2d, 0xa5, 0x8a, + 0x0f, 0xa7, 0x19, 0x58, 0x3e, 0xc0, 0xf0, 0xc1, 0x61, 0x0f, 0xac, 0x05, + 0xf8, 0x60, 0xad, 0x1e, 0x15, 0x27, 0x08, 0xd4, 0x72, 0x2b, 0x6a, 0xa2, + 0x79, 0x72, 0x1a, 0x38, 0x50, 0x2a, 0x95, 0xa2, 0x7f, 0xb2, 0xcc, 0xbe, + 0x5f, 0xd0, 0x96, 0x47, 0x32, 0x91, 0xa4, 0x4c, 0xb3, 0xe1, 0x4d, 0x7b, + 0x09, 0x63, 0x6c, 0x74, 0x9f, 0xef, 0x77, 0xec, 0xa0, 0xcb, 0xa2, 0x4f, + 0x40, 0xaa, 0xc7, 0xc2, 0xc1, 0xac, 0x02, 0xad, 0x56, 0x29, 0xad, 0x4a, + 0x97, 0xea, 0xa4, 0x04, 0x6d, 0xae, 0x9e, 0xee, 0xd1, 0x93, 0x1e, 0x45, + 0x12, 0x59, 0xd3, 0x06, 0xbd, 0x0d, 0x10, 0x92, 0xf0, 0x5c, 0x56, 0xa1, + 0xf3, 0x39, 0xee, 0x22, 0x16, 0x5a, 0x0a, 0x54, 0xd5, 0x23, 0xc0, 0x95, + 0x08, 0x4b, 0x20, 0x5d, 0xa9, 0x26, 0x7a, 0x26, 0x94, 0x1f, 0x0d, 0xe9, + 0x1b, 0xf2, 0xf4, 0x58, 0x50, 0x73, 0xa1, 0x26, 0x21, 0xa1, 0xdd, 0x2e, + 0x60, 0x16, 0xf6, 0x15, 0x42, 0xcd, 0x20, 0x77, 0x25, 0xa4, 0x2c, 0xe5, + 0x36, 0x70, 0x2e, 0xf0, 0xb7, 0x65, 0xd7, 0x5f, 0x1d, 0xd4, 0xd5, 0xf9, + 0xba, 0x2e, 0xf1, 0x60, 0x9e, 0x96, 0x09, 0x13, 0x50, 0x53, 0x53, 0xcc, + 0xe3, 0xda, 0xed, 0xc1, 0xb5, 0x4c, 0x7a, 0x0b, 0x05, 0xfc, 0x32, 0xe1, + 0x15, 0x49, 0x3c, 0x63, 0x29, 0x88, 0x56, 0x42, 0xfb, 0x81, 0x02, 0x5a, + 0x55, 0x24, 0xf5, 0x8a, 0xf4, 0xe1, 0x56, 0xc6, 0x5d, 0x93, 0x7e, 0x5c, + 0x73, 0x4e, 0x40, 0xfb, 0xe9, 0xb2, 0x16, 0x5a, 0x2a, 0xdc, 0x80, 0xb4, + 0xc0, 0xdf, 0x1e, 0x77, 0xfd, 0xf0, 0x49, 0xa9, 0xdc, 0xae, 0x5f, 0x7e, + 0xbc, 0x22, 0xa9, 0xeb, 0xf2, 0x53, 0x3d, 0x96, 0x77, 0x7d, 0x3d, 0x05, + 0xee, 0x6b, 0xeb, 0xc9, 0x56, 0xd0, 0x55, 0xaa, 0xdb, 0xa6, 0x79, 0x52, + 0xb2, 0xac, 0x55, 0x43, 0x70, 0x2d, 0xd9, 0x01, 0xe2, 0xe6, 0xd6, 0xda, + 0xff, 0x06, 0x3b, 0xf9, 0x1b, 0x59, 0x09, 0xdb, 0x07, 0x2d, 0x74, 0x08, + 0xeb, 0x1c, 0x27, 0xa7, 0xcb, 0x70, 0x43, 0xb0, 0x27, 0x23, 0x03, 0x21, + 0x8a, 0x8b, 0x78, 0x8b, 0x7f, 0xb3, 0xdf, 0xe9, 0xfa, 0x1b, 0xc3, 0x8e, + 0xd9, 0xfa, 0xbb, 0x15, 0xb7, 0x6d, 0xde, 0xc6, 0xbf, 0x2e, 0xc3, 0x86, + 0x05, 0x41, 0xd0, 0x96, 0x31, 0x96, 0x69, 0x67, 0xd8, 0x02, 0x33, 0xdf, + 0xd7, 0x76, 0x4f, 0x9a, 0xdc, 0xe2, 0x2c, 0x23, 0x23, 0x63, 0xb8, 0xae, + 0x32, 0xc0, 0x01, 0x05, 0x2f, 0x2c, 0x4f, 0x96, 0x49, 0xf5, 0xa4, 0xd4, + 0x0a, 0xea, 0x80, 0xab, 0x0d, 0x28, 0x5c, 0x7d, 0x0f, 0xe7, 0x72, 0x39, + 0xca, 0x27, 0xcb, 0xe4, 0x16, 0xe7, 0xa8, 0x56, 0xaa, 0x94, 0x2a, 0xa5, + 0x8e, 0x2b, 0xd4, 0x5f, 0xbb, 0x76, 0x8d, 0xd7, 0x83, 0x2b, 0x57, 0xfc, + 0xdf, 0x9d, 0x53, 0x52, 0xd7, 0xa1, 0x5a, 0x93, 0xa4, 0xe6, 0x09, 0x4a, + 0x65, 0x97, 0xc1, 0xcb, 0x06, 0x19, 0x7a, 0x30, 0x60, 0x74, 0xd8, 0x50, + 0x86, 0x7e, 0xcd, 0x10, 0xc4, 0x66, 0x40, 0x96, 0xdb, 0x90, 0xde, 0x7e, + 0xf3, 0xd6, 0xc4, 0x29, 0xbb, 0x2e, 0x22, 0x21, 0x5a, 0x60, 0x5c, 0x46, + 0xc1, 0x72, 0x9a, 0xdd, 0xcd, 0x92, 0x35, 0x89, 0x9b, 0xf0, 0x57, 0x67, + 0x76, 0x13, 0x61, 0xff, 0x76, 0xf1, 0xcb, 0xf8, 0x93, 0xdc, 0x3b, 0xc5, + 0x0f, 0xd6, 0x7d, 0x3a, 0xf0, 0xa3, 0x88, 0x09, 0x6d, 0x1c, 0xa5, 0x01, + 0x01, 0x6d, 0xee, 0xeb, 0xc2, 0x77, 0x9f, 0x27, 0xbb, 0x01, 0xe6, 0xf7, + 0x24, 0xd8, 0xbf, 0x7f, 0x3f, 0xab, 0xf4, 0x4a, 0xe0, 0xb7, 0xdf, 0x76, + 0x1b, 0xd7, 0xdf, 0x70, 0x43, 0x28, 0x3f, 0x13, 0x1e, 0xc6, 0x3d, 0xf9, + 0x32, 0x50, 0xaa, 0x66, 0xa8, 0x54, 0x70, 0x0b, 0x68, 0x94, 0xd6, 0x44, + 0x08, 0xc8, 0x15, 0x60, 0x65, 0x01, 0x84, 0x80, 0x5a, 0xa7, 0xa3, 0x05, + 0x83, 0x83, 0xac, 0x5a, 0xb5, 0x8a, 0x09, 0x0d, 0x08, 0xf3, 0xcb, 0xf7, + 0xff, 0x01, 0xac, 0xa4, 0x97, 0x03, 0x84, 0xad, 0xf0, 0xda, 0x1d, 0x97, + 0x31, 0xda, 0x9b, 0xdd, 0x31, 0xa9, 0x78, 0xc1, 0xb8, 0x2b, 0x35, 0x6c, + 0xcb, 0x87, 0x70, 0xf9, 0xe5, 0xf6, 0xe2, 0x1b, 0xf9, 0x29, 0xd0, 0x57, + 0x6f, 0x08, 0xa6, 0x65, 0xea, 0x6a, 0xf2, 0xde, 0xc1, 0x04, 0x9f, 0xd4, + 0x61, 0x3b, 0x38, 0xc0, 0x4a, 0x2f, 0x85, 0x01, 0x7a, 0x4d, 0xe8, 0xf4, + 0x13, 0xbc, 0xa1, 0x47, 0xfd, 0x60, 0x0a, 0xdf, 0x7d, 0xde, 0xcb, 0xef, + 0xd8, 0x71, 0x58, 0x04, 0xa4, 0x12, 0x78, 0xef, 0x8c, 0x2b, 0x0e, 0xc1, + 0xfd, 0x97, 0x00, 0xa3, 0x8f, 0x01, 0xea, 0xbe, 0x7d, 0x9f, 0x6f, 0x03, + 0xf4, 0x53, 0x95, 0x23, 0x25, 0xb6, 0x0b, 0x96, 0x05, 0xf9, 0x49, 0xf5, + 0x1b, 0xb5, 0xf5, 0xf3, 0xc2, 0x91, 0x92, 0xfc, 0xa4, 0x4b, 0xae, 0xc7, + 0xe2, 0x34, 0x39, 0xab, 0x3f, 0x97, 0x4a, 0x27, 0xe2, 0x9e, 0x01, 0xa4, + 0x65, 0x25, 0x29, 0x4f, 0x3a, 0x9e, 0x99, 0x5a, 0x52, 0xfb, 0x8b, 0x84, + 0xa0, 0x34, 0xe9, 0xbf, 0x03, 0xe3, 0x09, 0x81, 0xa5, 0xc3, 0x4a, 0xe5, + 0xb2, 0xf7, 0xb6, 0x4d, 0x69, 0x40, 0xc8, 0xb1, 0xe3, 0x7e, 0xfe, 0xc7, + 0xca, 0x75, 0x75, 0xad, 0x2d, 0x41, 0x0b, 0x31, 0xe8, 0x95, 0xe8, 0x2f, + 0xd6, 0xc3, 0x65, 0x03, 0xb0, 0x7f, 0x48, 0x6d, 0xa7, 0xd1, 0xb5, 0x57, + 0xc2, 0x39, 0x9b, 0xfb, 0x81, 0x0c, 0xe7, 0x3f, 0xa8, 0x81, 0x84, 0x4d, + 0x50, 0xd3, 0xdc, 0x12, 0xb0, 0x6f, 0x1a, 0xe0, 0xce, 0xfd, 0x0e, 0x1c, + 0x1a, 0x86, 0xcf, 0xa4, 0xd9, 0xf6, 0xf0, 0x39, 0xb0, 0x18, 0xf5, 0x67, + 0xf2, 0xba, 0x0a, 0xee, 0xdc, 0xeb, 0xc2, 0x25, 0x69, 0xb8, 0xbe, 0xbd, + 0x01, 0x5d, 0x28, 0x5e, 0xce, 0x0a, 0x03, 0xb4, 0x9a, 0x75, 0xcf, 0x56, + 0xf8, 0xd0, 0x6a, 0xd8, 0xbb, 0x07, 0x3e, 0xb0, 0x3a, 0x1c, 0x66, 0x0c, + 0x52, 0x6b, 0x6d, 0x4e, 0xd8, 0xe2, 0x2c, 0x4c, 0x14, 0xe0, 0xc1, 0x61, + 0xb0, 0x03, 0xed, 0x85, 0x5d, 0x5b, 0x70, 0x2f, 0x1b, 0x80, 0x07, 0x6d, + 0x58, 0x7d, 0xc5, 0x34, 0x05, 0xbf, 0x36, 0x4a, 0xe9, 0x36, 0xea, 0xb1, + 0xb2, 0x7f, 0x2e, 0xbc, 0xf7, 0x75, 0x2a, 0xc5, 0xce, 0x87, 0x87, 0x3a, + 0x25, 0x65, 0xfb, 0xe1, 0x7d, 0x6d, 0xfd, 0x47, 0xef, 0xdb, 0xd6, 0x31, + 0xcd, 0x96, 0xcd, 0x37, 0x21, 0xdd, 0x12, 0x42, 0x03, 0x33, 0x3b, 0xb9, + 0x45, 0xb7, 0x81, 0x5f, 0x75, 0x8e, 0x13, 0x74, 0x1b, 0x25, 0x57, 0xa5, + 0xe1, 0x6b, 0x45, 0xd6, 0x03, 0xa5, 0x73, 0xce, 0xe1, 0x31, 0xe0, 0x1d, + 0x4d, 0x75, 0x30, 0xe9, 0xda, 0xa5, 0x6f, 0xf6, 0x0b, 0x02, 0xb5, 0x9a, + 0x35, 0x9b, 0xb2, 0x7e, 0x9e, 0x94, 0xd2, 0xd0, 0xcc, 0xe0, 0xfb, 0x7a, + 0xf8, 0xf9, 0x02, 0xbf, 0x43, 0x96, 0xf3, 0x12, 0xf3, 0x39, 0xf9, 0x73, + 0xfc, 0x1c, 0x7c, 0xb5, 0x28, 0xea, 0x37, 0xce, 0x3d, 0x93, 0xc4, 0x19, + 0x67, 0x00, 0xf0, 0x82, 0x3b, 0x45, 0xe2, 0x8c, 0x33, 0xa8, 0x81, 0x07, + 0xd6, 0xfa, 0x69, 0xea, 0xa7, 0x81, 0xd5, 0x3e, 0x2f, 0xa1, 0x0c, 0xe2, + 0x86, 0x9f, 0xf7, 0xcd, 0x9d, 0x83, 0xef, 0xeb, 0x7b, 0xee, 0x73, 0x10, + 0x87, 0x87, 0xc9, 0x2e, 0x1b, 0xa0, 0x70, 0x78, 0x94, 0x52, 0xa9, 0x84, + 0xc5, 0x28, 0xb0, 0x94, 0xfc, 0xfe, 0x3c, 0x0a, 0x6f, 0x0b, 0x29, 0x46, + 0x38, 0x72, 0x00, 0xd2, 0x4b, 0x72, 0x0c, 0x1d, 0x88, 0xb3, 0xe3, 0x2b, + 0xca, 0xbf, 0xff, 0x43, 0xca, 0xf8, 0xbb, 0xff, 0x4a, 0xa0, 0x01, 0xab, + 0xff, 0x28, 0xcd, 0xbe, 0xbf, 0x29, 0xf1, 0xb9, 0xff, 0xd9, 0xcf, 0xce, + 0x3b, 0x4a, 0xac, 0xbe, 0x5e, 0xf5, 0xcf, 0xfb, 0xae, 0x54, 0x08, 0xb1, + 0xbe, 0xb5, 0xaa, 0x0e, 0xab, 0x3f, 0x9d, 0x66, 0xdf, 0xad, 0x7e, 0x7f, + 0x62, 0xcd, 0x4d, 0x36, 0x34, 0xa0, 0xef, 0x12, 0x95, 0x4f, 0xdf, 0x55, + 0x75, 0xcf, 0xa8, 0x7c, 0x60, 0xed, 0x0a, 0x9c, 0xc3, 0xfe, 0xfb, 0x6a, + 0x40, 0xe7, 0x31, 0x70, 0x89, 0xbf, 0x6f, 0x03, 0x03, 0xd7, 0x0c, 0xe2, + 0x1c, 0x74, 0x90, 0x0d, 0xc9, 0xc0, 0x35, 0x83, 0x0c, 0x5c, 0xa2, 0xfc, + 0x55, 0x2f, 0x4d, 0x42, 0x1f, 0xa4, 0xa5, 0xa4, 0x7f, 0x6d, 0x3f, 0xce, + 0x41, 0x07, 0xe7, 0xe0, 0x28, 0xfd, 0x6b, 0xfb, 0x19, 0xb8, 0x44, 0xf5, + 0x91, 0xfa, 0xfb, 0x74, 0x01, 0x81, 0x78, 0x00, 0x85, 0x6f, 0x17, 0x28, + 0x9d, 0x74, 0x48, 0xdb, 0xaa, 0xaf, 0xb4, 0xf5, 0xd6, 0x9d, 0x08, 0x6d, + 0x74, 0x1d, 0x4f, 0x24, 0xd5, 0xd8, 0x01, 0x20, 0x1b, 0x3e, 0x5c, 0xcb, + 0xec, 0x1b, 0xc8, 0xb7, 0x82, 0x87, 0xf8, 0xd7, 0x25, 0xd9, 0x0d, 0x25, + 0x17, 0x84, 0x90, 0x10, 0xb3, 0x19, 0xc8, 0x56, 0x91, 0x75, 0x89, 0xd0, + 0xef, 0x88, 0x64, 0xcc, 0xdc, 0x84, 0x42, 0x0d, 0x2f, 0x20, 0x10, 0xb4, + 0x1a, 0x90, 0xc6, 0x1b, 0x2e, 0x76, 0x2e, 0x8d, 0xac, 0x94, 0x54, 0xfb, + 0x8b, 0xf0, 0xfb, 0x3a, 0x78, 0x5f, 0xbf, 0xe5, 0xec, 0x39, 0x21, 0x80, + 0x56, 0x27, 0x9d, 0xf7, 0x17, 0x6f, 0x7c, 0x4d, 0xe2, 0xcc, 0xa8, 0x26, + 0xc0, 0xd7, 0x7f, 0x35, 0x5d, 0x88, 0x02, 0x6a, 0xfd, 0x2e, 0xf0, 0x3c, + 0x70, 0x96, 0xfe, 0x33, 0x2d, 0xeb, 0x7e, 0x3a, 0x43, 0xb5, 0xda, 0xdd, + 0xd7, 0xc1, 0x3e, 0xd7, 0x44, 0xb9, 0xf5, 0x21, 0x7e, 0xf6, 0x4b, 0x0a, + 0x70, 0xe5, 0xa3, 0x3f, 0x35, 0x50, 0x4b, 0x6b, 0x00, 0x78, 0xe6, 0x6b, + 0xf0, 0xa6, 0xb7, 0x03, 0xdf, 0x2a, 0xc3, 0xe5, 0x29, 0xf8, 0xf3, 0x38, + 0xfd, 0xcb, 0x02, 0x71, 0x2e, 0xf7, 0x81, 0xcb, 0xc7, 0xc6, 0x5d, 0x06, + 0xc6, 0x25, 0xfb, 0x8e, 0xc2, 0xd9, 0x81, 0x72, 0xcc, 0xcf, 0x2f, 0x27, + 0xc3, 0xf0, 0xac, 0x61, 0x5d, 0x06, 0xa8, 0xfb, 0x72, 0x7b, 0xb7, 0xcd, + 0x92, 0x17, 0x1d, 0x0c, 0x07, 0xf6, 0xf8, 0xb1, 0x29, 0x16, 0x2e, 0xea, + 0x02, 0x34, 0xe8, 0xed, 0xd8, 0x94, 0xe7, 0x3e, 0x0f, 0xb8, 0x7c, 0x51, + 0x17, 0x45, 0x76, 0x23, 0xde, 0xb1, 0x9b, 0x75, 0xc0, 0xf2, 0xdd, 0x19, + 0xb8, 0x19, 0xee, 0x5d, 0x57, 0xd4, 0xb9, 0x66, 0x00, 0xb8, 0x17, 0xd8, + 0xbd, 0x7b, 0x1d, 0x07, 0x8b, 0x70, 0xdd, 0xdb, 0x60, 0xdf, 0x51, 0x78, + 0x4e, 0xdb, 0x1a, 0x07, 0xeb, 0xb9, 0xe4, 0x45, 0xc7, 0xbb, 0x1f, 0x7e, + 0x88, 0x82, 0x81, 0x05, 0x75, 0xef, 0x94, 0xbf, 0xed, 0xef, 0x52, 0x75, + 0x00, 0xb8, 0x77, 0x77, 0x20, 0xd2, 0xcd, 0x6d, 0xdc, 0xc5, 0xa2, 0x22, + 0xd6, 0xdc, 0x9c, 0xf1, 0xc3, 0xd6, 0xa1, 0x20, 0x59, 0xa6, 0x9e, 0xc1, + 0x74, 0xed, 0xf2, 0x0a, 0xc4, 0x99, 0xdf, 0xae, 0xcf, 0x65, 0xda, 0x66, + 0x19, 0x8b, 0xfc, 0xc4, 0x1e, 0x00, 0xec, 0x55, 0x5f, 0x66, 0xec, 0xd0, + 0x1e, 0x6e, 0xfd, 0xca, 0xb5, 0xec, 0xd9, 0xbb, 0x87, 0x7d, 0xe2, 0x1e, + 0xc4, 0x5e, 0x97, 0xc1, 0x4f, 0x7d, 0x0e, 0xd9, 0xb3, 0x95, 0xd5, 0x93, + 0xea, 0xf9, 0x34, 0x74, 0xa8, 0x84, 0xbc, 0xca, 0x52, 0x61, 0x97, 0xa8, + 0x36, 0xce, 0xbe, 0x9e, 0x3a, 0xf9, 0xc6, 0x37, 0x58, 0x7f, 0xcb, 0xf9, + 0x6c, 0x5f, 0xf6, 0x25, 0xaa, 0xff, 0xf0, 0x7b, 0x94, 0xba, 0x3f, 0xc7, + 0x9d, 0x29, 0xf5, 0x6b, 0x11, 0x7b, 0x5d, 0xd6, 0xac, 0xf0, 0xdb, 0x43, + 0x7b, 0x46, 0xf4, 0x58, 0xeb, 0x55, 0x16, 0xd7, 0xae, 0x08, 0xb7, 0x9d, + 0x46, 0x27, 0xd4, 0x6f, 0xaf, 0xbf, 0xd7, 0x52, 0xee, 0xa6, 0xb1, 0x19, + 0x6b, 0x24, 0xce, 0x50, 0xa2, 0x04, 0x07, 0x25, 0xb9, 0xcc, 0xec, 0x69, + 0x49, 0x63, 0xe3, 0x6a, 0x3c, 0x28, 0xdd, 0x9d, 0x54, 0x80, 0xae, 0x36, + 0xca, 0x27, 0xc4, 0x69, 0xe5, 0x19, 0x94, 0x90, 0x92, 0xad, 0xd7, 0x64, + 0x39, 0x32, 0x0e, 0x37, 0xee, 0x9d, 0x1e, 0xa8, 0xc5, 0x72, 0xc1, 0x75, + 0xb7, 0xbf, 0x4f, 0xc1, 0xb4, 0x02, 0xca, 0x2d, 0x16, 0xe4, 0xef, 0x70, + 0x91, 0x7a, 0xec, 0x3f, 0xbf, 0xdf, 0xe5, 0xda, 0x4f, 0xa5, 0xd8, 0xb3, + 0x69, 0x76, 0xe3, 0xe1, 0xa9, 0x4c, 0xeb, 0x58, 0xca, 0x90, 0x7b, 0x8c, + 0x01, 0x16, 0x91, 0x4e, 0xa4, 0x5a, 0xfa, 0xa8, 0xd5, 0x4a, 0xfb, 0xf3, + 0x10, 0xb7, 0x2c, 0xe2, 0x58, 0xd4, 0x5d, 0x57, 0x83, 0xb5, 0xc0, 0x12, + 0x16, 0xd0, 0x0a, 0xd6, 0x72, 0x65, 0x19, 0x2b, 0x66, 0xbe, 0x5d, 0xe8, + 0xb1, 0x36, 0x39, 0x44, 0xc6, 0xba, 0x96, 0xa2, 0x7b, 0x27, 0x96, 0x75, + 0xad, 0x02, 0x6b, 0x01, 0x20, 0x3d, 0xb7, 0x95, 0x58, 0xad, 0xe3, 0x8e, + 0xe2, 0x36, 0xca, 0x58, 0xc2, 0x07, 0x10, 0xac, 0x5e, 0x08, 0xb9, 0xc5, + 0x59, 0x6e, 0xba, 0xef, 0xf7, 0x80, 0xaf, 0x06, 0xc0, 0x5a, 0xbe, 0xcc, + 0xb0, 0xb8, 0x79, 0x47, 0x4a, 0x29, 0x70, 0x03, 0x78, 0x50, 0x11, 0x0b, + 0x8f, 0xfc, 0xba, 0xae, 0x83, 0x65, 0xb5, 0x07, 0x10, 0x49, 0x3d, 0x8e, + 0x1f, 0x54, 0xda, 0xca, 0x51, 0x72, 0xf3, 0xb3, 0x0a, 0x9f, 0xad, 0xda, + 0xe6, 0x93, 0xc8, 0x52, 0xaa, 0x15, 0xe8, 0x04, 0xcf, 0x90, 0x6e, 0x1d, + 0x61, 0xe9, 0x71, 0xd6, 0x46, 0x30, 0x9d, 0x7a, 0x96, 0x0e, 0xb9, 0x3e, + 0x08, 0x3b, 0xf8, 0x0c, 0xaf, 0x06, 0x7e, 0xe3, 0x99, 0xa6, 0x6d, 0xb3, + 0x9b, 0x0e, 0xfe, 0xc5, 0x69, 0xd2, 0x65, 0x8a, 0xbe, 0xdf, 0x4a, 0xed, + 0xff, 0x41, 0xe0, 0xc0, 0xc4, 0xf4, 0x14, 0xa9, 0x66, 0xe4, 0xd6, 0x4a, + 0x3a, 0x43, 0xa5, 0x8c, 0xff, 0xca, 0xc0, 0xfe, 0xe9, 0x2a, 0x98, 0xf7, + 0x7f, 0xfb, 0x3a, 0x3c, 0xf7, 0x49, 0x78, 0x21, 0xb6, 0x83, 0xbf, 0xfb, + 0x6b, 0x58, 0xf9, 0xed, 0xd9, 0xa5, 0x9f, 0x2e, 0xcf, 0x66, 0xf5, 0xf6, + 0xce, 0x1e, 0xa4, 0xd5, 0x6e, 0xbf, 0x5d, 0xbe, 0x6d, 0x9f, 0xe1, 0xc1, + 0x71, 0xb3, 0x46, 0x9b, 0x44, 0x3f, 0x4d, 0xe9, 0xb1, 0x5c, 0x03, 0x92, + 0x52, 0x60, 0x12, 0x89, 0x94, 0x2e, 0x96, 0xa5, 0x81, 0x1c, 0x33, 0xd4, + 0x51, 0xd6, 0x5c, 0x2c, 0x2b, 0x85, 0x94, 0x6e, 0x0b, 0x90, 0xca, 0xea, + 0xce, 0x20, 0x6b, 0x65, 0x24, 0x92, 0x54, 0x22, 0xe3, 0x7d, 0x83, 0x91, + 0x28, 0xf2, 0x92, 0x2a, 0xab, 0x1c, 0x48, 0xe3, 0x3f, 0x2f, 0x45, 0x22, + 0x05, 0x0d, 0xd7, 0xcb, 0xcb, 0xb4, 0x81, 0x5f, 0x2d, 0x40, 0x6b, 0xda, + 0x63, 0x31, 0xe7, 0x01, 0x66, 0x0d, 0xd6, 0x32, 0x6a, 0xd7, 0x0e, 0x0f, + 0x7e, 0xe7, 0x42, 0x86, 0x61, 0x57, 0xa0, 0xf6, 0x8b, 0x1a, 0x62, 0x55, + 0x6f, 0x34, 0x87, 0xab, 0xf1, 0x76, 0xd3, 0x8f, 0x00, 0xb5, 0x2d, 0x34, + 0x04, 0x69, 0x20, 0x4d, 0xd5, 0x5b, 0x5c, 0x48, 0xd6, 0xea, 0x14, 0x62, + 0x71, 0xac, 0x86, 0x0f, 0xd8, 0x92, 0xb1, 0x7a, 0xcb, 0x93, 0xc9, 0xb1, + 0x04, 0x6b, 0x62, 0x30, 0x26, 0xf1, 0x4e, 0xa8, 0xc9, 0xbb, 0x50, 0xa9, + 0x93, 0x8c, 0x81, 0x4b, 0x5c, 0xc3, 0x69, 0xcc, 0xb5, 0x97, 0xc8, 0x86, + 0x82, 0x79, 0x11, 0x93, 0xb8, 0x8d, 0x2a, 0xa2, 0x26, 0x48, 0xc5, 0xfc, + 0xf4, 0x6e, 0x03, 0xef, 0xb7, 0xec, 0x3d, 0xc9, 0x43, 0x40, 0x2d, 0xd5, + 0x37, 0x2a, 0x11, 0x57, 0xef, 0x93, 0x58, 0x9d, 0xac, 0x0e, 0xb7, 0x1a, + 0x75, 0x9c, 0x58, 0x1c, 0x1a, 0xba, 0xff, 0x14, 0x80, 0x82, 0xe5, 0x04, + 0x38, 0x4f, 0x14, 0x18, 0x2a, 0x14, 0x18, 0xbc, 0x6a, 0x8d, 0x77, 0x1c, + 0x06, 0xb2, 0x95, 0x3f, 0x9a, 0x27, 0xb7, 0x24, 0x47, 0xfe, 0x68, 0x1e, + 0xab, 0x14, 0x44, 0x7b, 0xc5, 0xbd, 0xf3, 0x0b, 0xaa, 0x1c, 0x5b, 0x28, + 0xb0, 0x96, 0x81, 0x7a, 0x89, 0xee, 0x38, 0xa2, 0x52, 0x0f, 0x41, 0xbf, + 0xcc, 0x01, 0x18, 0xd8, 0xa3, 0x40, 0x78, 0x99, 0x64, 0x11, 0x8c, 0xe8, + 0xba, 0xb5, 0xfb, 0xce, 0xc5, 0x57, 0x80, 0x0f, 0xc3, 0x99, 0x0b, 0xdf, + 0x04, 0x2e, 0x6d, 0x81, 0x5a, 0xa7, 0x4e, 0xbc, 0x0c, 0x6f, 0x7d, 0xba, + 0xc5, 0xbf, 0x93, 0xe6, 0xbd, 0x75, 0x4e, 0x08, 0x9c, 0x15, 0x04, 0x6a, + 0xcd, 0xa4, 0xc3, 0xa3, 0x79, 0x96, 0xe5, 0x54, 0x7f, 0xa1, 0x94, 0x3f, + 0xc9, 0x0f, 0xc6, 0x4f, 0x2a, 0x77, 0x13, 0x6c, 0x29, 0x3d, 0xaf, 0x9b, + 0x7f, 0xf9, 0xe1, 0xe4, 0xac, 0xf3, 0x6d, 0xa7, 0x47, 0x4f, 0xbc, 0xec, + 0x01, 0xb5, 0x82, 0xee, 0x9f, 0x47, 0xcd, 0x7b, 0xeb, 0x1c, 0xfe, 0xf5, + 0xc8, 0xcb, 0x30, 0x57, 0x81, 0xb7, 0x00, 0x58, 0x0c, 0xbf, 0x86, 0xf6, + 0xd7, 0x9a, 0x2a, 0x3d, 0xcb, 0x39, 0x6f, 0xee, 0x52, 0xd7, 0x13, 0xd4, + 0xf5, 0xd5, 0x0a, 0x3d, 0xc3, 0x21, 0x04, 0xd1, 0x92, 0x40, 0x32, 0x06, + 0xc9, 0x9e, 0xd6, 0xef, 0xc0, 0xf9, 0x27, 0x0b, 0xa4, 0xd3, 0x61, 0xff, + 0x78, 0x22, 0xee, 0xb5, 0xef, 0x5c, 0xe9, 0x52, 0xad, 0x43, 0x52, 0x7f, + 0x9f, 0x4d, 0xa6, 0x92, 0x54, 0xcb, 0x55, 0x96, 0xe6, 0x6c, 0x4a, 0x38, + 0xf4, 0xcb, 0x6c, 0x73, 0x96, 0x21, 0xd5, 0x6b, 0x90, 0x4c, 0x0b, 0x0f, + 0x9e, 0x15, 0x74, 0xb7, 0xdb, 0x77, 0x5c, 0x87, 0x64, 0x22, 0x49, 0x5d, + 0xd6, 0x89, 0xc7, 0xc0, 0x4a, 0x5b, 0xb8, 0x25, 0x97, 0xa4, 0x25, 0x90, + 0x15, 0x49, 0xa9, 0xac, 0x47, 0x51, 0xa4, 0x99, 0x58, 0x21, 0xd4, 0xad, + 0x15, 0x5a, 0xf4, 0x4c, 0x78, 0xdf, 0x24, 0x81, 0x16, 0x98, 0x96, 0xe8, + 0x12, 0x0a, 0x98, 0x85, 0xfa, 0x3e, 0x4e, 0x0c, 0x68, 0x68, 0xd0, 0x96, + 0x04, 0x6b, 0x9e, 0x1f, 0x6e, 0xa5, 0x2d, 0xe5, 0x0e, 0x2c, 0xd6, 0x65, + 0x16, 0x55, 0x90, 0x52, 0x60, 0xcd, 0x13, 0x38, 0x13, 0x65, 0xef, 0xdd, + 0x44, 0xd3, 0x62, 0x42, 0x22, 0x26, 0xc8, 0xe7, 0xf3, 0x5e, 0x19, 0xf1, + 0x58, 0x9c, 0xd2, 0x78, 0x19, 0x1a, 0x75, 0x05, 0x6e, 0xb4, 0xf5, 0xb7, + 0x10, 0x84, 0xfa, 0x7e, 0xdc, 0x34, 0x1a, 0xd7, 0xf2, 0x0c, 0xd7, 0xf7, + 0xf4, 0xb2, 0x0b, 0x2e, 0xe0, 0xe0, 0xd1, 0x7f, 0x51, 0x60, 0x2a, 0x14, + 0xf8, 0xca, 0x00, 0xb5, 0x46, 0xf3, 0xc3, 0x6c, 0x9d, 0xf3, 0x77, 0x7c, + 0x24, 0xb0, 0x24, 0xc8, 0x82, 0x05, 0x17, 0x00, 0x28, 0x98, 0xd6, 0x82, + 0x3b, 0x68, 0x96, 0x07, 0xb9, 0x22, 0x00, 0xa5, 0x0a, 0x00, 0xa3, 0x8c, + 0x9f, 0x08, 0x2e, 0x60, 0x06, 0x4c, 0x96, 0x55, 0x03, 0x25, 0x08, 0xd1, + 0xea, 0x7b, 0xef, 0xdb, 0x3d, 0xff, 0x67, 0xf4, 0x3d, 0x0e, 0xb0, 0xe5, + 0xf6, 0x1b, 0x91, 0x42, 0x81, 0xa9, 0x0c, 0x50, 0xcb, 0x94, 0x7b, 0x0f, + 0xbb, 0xfc, 0xfc, 0x03, 0x75, 0x32, 0x65, 0x1b, 0xff, 0xf3, 0x52, 0xea, + 0xfb, 0xe1, 0x05, 0x4b, 0xdf, 0x12, 0xd8, 0xbe, 0x9d, 0x47, 0xbe, 0xf3, + 0x38, 0xe7, 0xa5, 0x7a, 0x71, 0xc6, 0x4f, 0x7a, 0xf9, 0x04, 0xb7, 0x2d, + 0xc7, 0xa1, 0x41, 0x59, 0xbc, 0xdb, 0x46, 0xae, 0x78, 0x9c, 0x4c, 0xfd, + 0x6f, 0x55, 0x84, 0x47, 0x1c, 0xc4, 0xe7, 0x1e, 0x81, 0xf9, 0x02, 0xd1, + 0x67, 0xf9, 0x60, 0x2e, 0x93, 0xc7, 0x49, 0xc9, 0xe5, 0x89, 0xdf, 0x55, + 0xc7, 0x56, 0x3a, 0x09, 0x6f, 0x84, 0xf3, 0x17, 0xce, 0xe7, 0x99, 0xf1, + 0x93, 0x9c, 0x75, 0x86, 0xcd, 0xf9, 0x0b, 0xe6, 0xf3, 0x4c, 0x60, 0xed, + 0x26, 0xb3, 0x7f, 0xd6, 0x19, 0xe1, 0xfe, 0xc2, 0xf9, 0x0b, 0xe6, 0xf3, + 0x9d, 0x23, 0x7b, 0x99, 0xdf, 0xb5, 0x8c, 0xe7, 0x7f, 0xe2, 0xb0, 0xec, + 0x02, 0x75, 0x7d, 0x82, 0xf7, 0x74, 0xa4, 0x48, 0x91, 0x22, 0x45, 0x8a, + 0x14, 0x29, 0x52, 0xa4, 0x48, 0x91, 0x22, 0x45, 0x8a, 0x14, 0x29, 0x52, + 0xa4, 0x48, 0x91, 0x22, 0x45, 0x8a, 0x14, 0x29, 0x52, 0xa4, 0x48, 0x91, + 0x22, 0x45, 0x9a, 0xbd, 0x7e, 0x41, 0xd1, 0x16, 0x91, 0x22, 0x45, 0x8a, + 0x14, 0x29, 0xd2, 0x2f, 0x81, 0xae, 0x7c, 0xed, 0xb2, 0x4a, 0x76, 0x27, + 0x71, 0x4f, 0x93, 0xa0, 0x60, 0xf7, 0xd8, 0xe4, 0xb5, 0x01, 0x46, 0xda, + 0x4a, 0x52, 0x2a, 0x97, 0x70, 0x8a, 0x0e, 0x4e, 0xd1, 0x41, 0x4a, 0x89, + 0x9d, 0xb1, 0x29, 0x4d, 0x96, 0x48, 0x07, 0x26, 0x50, 0x26, 0x13, 0x49, + 0xaa, 0x95, 0x2a, 0x24, 0x14, 0x50, 0xab, 0x3c, 0x59, 0xf6, 0x26, 0x6a, + 0x57, 0x6b, 0x55, 0x92, 0x89, 0x24, 0x76, 0x8f, 0x32, 0x26, 0x35, 0xfe, + 0x56, 0xb7, 0x45, 0xbf, 0x06, 0x1e, 0x7c, 0xb9, 0x01, 0x57, 0xff, 0xa2, + 0xb5, 0x3e, 0x1a, 0xea, 0xd8, 0x4e, 0x5b, 0x57, 0x02, 0xbf, 0xaf, 0x9c, + 0x8b, 0x96, 0xfb, 0x46, 0x51, 0x56, 0xb7, 0x40, 0x4a, 0x3d, 0xc9, 0x4f, + 0x08, 0xd2, 0xdd, 0x16, 0x25, 0xb7, 0x04, 0xda, 0x80, 0xd5, 0xb6, 0x2d, + 0x1c, 0x47, 0x03, 0xb6, 0x16, 0xf6, 0x51, 0xad, 0x14, 0x41, 0x96, 0x70, + 0x43, 0x50, 0x18, 0x3d, 0x21, 0x33, 0x26, 0x11, 0x09, 0x0b, 0x89, 0x66, + 0x57, 0xb9, 0x12, 0x69, 0x09, 0x52, 0x93, 0x92, 0xb2, 0x37, 0x29, 0x16, + 0xb0, 0x04, 0xd6, 0xa4, 0xc4, 0x4d, 0x58, 0x30, 0xe9, 0x22, 0x26, 0x5d, + 0xe4, 0x42, 0x2b, 0x04, 0x45, 0x48, 0x21, 0xbc, 0x69, 0xff, 0xa9, 0x49, + 0x49, 0xb9, 0x9b, 0x90, 0xac, 0x1a, 0xb8, 0x16, 0xe0, 0x4a, 0x52, 0x31, + 0x41, 0xd9, 0xc0, 0x71, 0x12, 0x0a, 0xba, 0x95, 0x02, 0xca, 0xb5, 0x00, + 0x24, 0x0b, 0xb4, 0x61, 0x83, 0xa0, 0x6e, 0x41, 0x32, 0x60, 0x8c, 0x96, + 0xaa, 0x48, 0xca, 0x19, 0xa1, 0xb6, 0x1a, 0x56, 0x95, 0x6a, 0xd0, 0x82, + 0x2d, 0x8b, 0x9b, 0x89, 0xa5, 0xdd, 0x82, 0xa5, 0x2e, 0x1c, 0x89, 0x41, + 0xbc, 0x22, 0x49, 0x21, 0x70, 0xba, 0x05, 0x76, 0x05, 0xca, 0x09, 0x41, + 0xbd, 0x26, 0x49, 0xba, 0x50, 0xcd, 0x04, 0xc0, 0x5b, 0x41, 0x09, 0x48, + 0x4f, 0x48, 0x4a, 0x29, 0x34, 0x28, 0x4b, 0xe5, 0x9b, 0x94, 0x50, 0xd5, + 0xe5, 0x27, 0x27, 0x24, 0xd5, 0x26, 0xab, 0xf0, 0x74, 0x4c, 0x50, 0xaa, + 0x29, 0x58, 0x97, 0x49, 0x5f, 0x47, 0xcd, 0xbd, 0xad, 0x77, 0x0b, 0xd0, + 0xf3, 0xb5, 0x17, 0x2d, 0xb7, 0x60, 0x44, 0x9f, 0xcb, 0xa6, 0xfb, 0xda, + 0xad, 0xd5, 0xb1, 0x12, 0xad, 0xa0, 0x27, 0x91, 0x88, 0x63, 0x66, 0xb5, + 0x8b, 0x26, 0x20, 0x9d, 0x48, 0x24, 0xdb, 0x82, 0xb5, 0xac, 0x44, 0x6a, + 0x46, 0x80, 0x56, 0x6b, 0x1a, 0x3b, 0xe4, 0x6e, 0x06, 0x67, 0xb5, 0x03, + 0x69, 0x75, 0x02, 0x6c, 0x55, 0xdd, 0xaa, 0x9a, 0x3c, 0xfc, 0x5f, 0x4c, + 0x32, 0x08, 0x82, 0xba, 0x12, 0xf8, 0x84, 0x72, 0x06, 0xef, 0x6b, 0x29, + 0x25, 0xae, 0xeb, 0x59, 0xc7, 0x84, 0x00, 0x4e, 0xa9, 0x1e, 0x65, 0x6c, + 0x16, 0x17, 0x49, 0x92, 0xdd, 0xc1, 0xf3, 0xa7, 0x56, 0x20, 0xce, 0xe7, + 0xf3, 0xca, 0x0e, 0x64, 0x52, 0x9d, 0xf3, 0x4e, 0x40, 0x2d, 0x80, 0xc2, + 0x84, 0x83, 0x7b, 0xca, 0xc5, 0x9a, 0x67, 0x29, 0xd0, 0xa1, 0x56, 0x32, + 0x21, 0x50, 0xf6, 0x24, 0xf5, 0x16, 0x83, 0x99, 0x6a, 0x4d, 0x52, 0x2a, + 0xbb, 0xa1, 0xe7, 0x58, 0x70, 0x82, 0x78, 0x39, 0xf0, 0xee, 0x28, 0xb7, + 0x31, 0xa4, 0x93, 0x4d, 0xf7, 0x54, 0x10, 0x68, 0x35, 0x5d, 0xfc, 0xe0, + 0xa4, 0xf4, 0xe6, 0x09, 0xea, 0x41, 0x99, 0xb0, 0xe6, 0x95, 0xa0, 0xdb, + 0x95, 0x1d, 0x8c, 0xdf, 0x29, 0x5e, 0xa7, 0x72, 0x64, 0x4d, 0x42, 0x43, + 0x22, 0x2c, 0x0b, 0xa9, 0x8f, 0x59, 0x58, 0x16, 0x6e, 0xa5, 0xfd, 0x3d, + 0x15, 0xbc, 0xaf, 0xb3, 0xbf, 0x75, 0x96, 0xe7, 0xbf, 0x7f, 0xff, 0x7e, + 0xf6, 0xef, 0xdf, 0xef, 0xed, 0xdf, 0xd0, 0x04, 0xd5, 0x32, 0x71, 0xda, + 0xa9, 0x19, 0x3a, 0xd5, 0x09, 0xbc, 0x15, 0x0c, 0xef, 0x14, 0x6f, 0xe5, + 0x6d, 0xcd, 0x88, 0xad, 0xd9, 0xcb, 0x40, 0xc1, 0x82, 0x65, 0x1d, 0xd0, + 0x18, 0xab, 0x60, 0x79, 0x3e, 0x5e, 0xcb, 0x8f, 0xd7, 0xa9, 0xae, 0xed, + 0xc2, 0x3b, 0xed, 0x4f, 0x04, 0xdc, 0xbd, 0xf8, 0x60, 0x2c, 0xbf, 0xec, + 0x89, 0x50, 0xbc, 0x5e, 0xc2, 0xe0, 0xaf, 0x5e, 0x0d, 0xc6, 0x0a, 0xd6, + 0x2f, 0x58, 0xd6, 0x09, 0x8d, 0x1f, 0xdb, 0xff, 0xf2, 0x0d, 0x2c, 0x98, + 0x63, 0xe2, 0xa3, 0xd3, 0xf8, 0xe5, 0xe9, 0x29, 0xe8, 0xea, 0xfa, 0x0e, + 0xab, 0x6b, 0xbd, 0xa8, 0xd9, 0x1a, 0x1d, 0x90, 0x7f, 0xfa, 0x0e, 0xae, + 0xf8, 0xab, 0xc7, 0x90, 0x7f, 0xaa, 0xf0, 0x32, 0xdf, 0x18, 0x7d, 0x0c, + 0xb9, 0xe9, 0x67, 0x87, 0x9a, 0x31, 0xb6, 0x17, 0x8e, 0x94, 0x0c, 0x74, + 0xfb, 0x60, 0x00, 0x3b, 0x01, 0xc3, 0x95, 0x32, 0x39, 0xd4, 0xf6, 0x17, + 0x5d, 0xa5, 0x4c, 0x1f, 0x62, 0x2e, 0xb8, 0x27, 0xcb, 0x50, 0x01, 0x44, + 0x8a, 0xfa, 0x84, 0x83, 0x6c, 0xb8, 0x64, 0x53, 0x1a, 0x98, 0x54, 0x09, + 0xa7, 0xa9, 0xbb, 0x75, 0xea, 0xae, 0x7a, 0xd6, 0x79, 0x4f, 0x82, 0xb2, + 0xa1, 0x76, 0xea, 0xeb, 0xfb, 0xa4, 0xf2, 0x5e, 0x94, 0x6a, 0x7d, 0x37, + 0xbf, 0x62, 0x19, 0xa0, 0x16, 0xc0, 0x9f, 0xee, 0x9c, 0x11, 0xaa, 0x25, + 0x1e, 0x1c, 0xe2, 0xeb, 0x17, 0xc1, 0xa2, 0x55, 0x16, 0x5e, 0x5b, 0x40, + 0x3c, 0x13, 0x8a, 0xb3, 0xfd, 0x86, 0x73, 0xd8, 0x1e, 0x1b, 0x84, 0xa2, + 0x03, 0xb7, 0xdc, 0x83, 0x6a, 0x81, 0xa4, 0x5a, 0xf2, 0xba, 0xd3, 0x38, + 0x0e, 0x77, 0x06, 0x6a, 0xa9, 0x78, 0xfa, 0x87, 0x33, 0x1d, 0xc8, 0xd7, + 0x00, 0xb5, 0x00, 0xd6, 0x6f, 0x45, 0xbc, 0xe0, 0x1b, 0xfd, 0x05, 0xdb, + 0xef, 0x6b, 0xfe, 0xb8, 0x0e, 0xf4, 0x91, 0xcd, 0xf8, 0x7d, 0x84, 0x4d, + 0x9f, 0x69, 0x7a, 0x77, 0xed, 0x82, 0xeb, 0xfe, 0xc0, 0x21, 0x5b, 0x4c, + 0xc3, 0x1d, 0x00, 0xab, 0xd9, 0xf4, 0xdd, 0x35, 0xa1, 0x28, 0x97, 0x5e, + 0xbe, 0x8f, 0x87, 0xbe, 0xb5, 0x5a, 0xc5, 0x9b, 0x2e, 0x2f, 0xe8, 0x18, + 0xc7, 0xbc, 0xf3, 0x84, 0x10, 0x5c, 0xf7, 0x07, 0x0e, 0x3c, 0xf0, 0x3e, + 0x40, 0x5f, 0x5f, 0x0d, 0xe4, 0x08, 0xbe, 0xaf, 0x3f, 0xf6, 0xdb, 0x55, + 0xea, 0x15, 0x49, 0x5c, 0x43, 0x59, 0x8d, 0x5b, 0xf4, 0x0d, 0x90, 0xc7, + 0xe1, 0xc8, 0xf7, 0xd4, 0xbb, 0xb8, 0x2c, 0xcb, 0xa4, 0x44, 0x2a, 0xe4, + 0x2e, 0xcb, 0x32, 0x29, 0x2b, 0xc3, 0x40, 0x2e, 0x4d, 0xdf, 0x3b, 0x55, + 0x5d, 0xfe, 0xe9, 0xbb, 0x5f, 0xc6, 0x29, 0xfa, 0xf5, 0x2c, 0x9e, 0xf4, + 0xdb, 0x4f, 0x06, 0xb8, 0xa5, 0x94, 0xf6, 0xdc, 0x06, 0x80, 0xd5, 0xc9, + 0xdd, 0x0c, 0xc6, 0x82, 0x56, 0xb8, 0x55, 0x75, 0x7f, 0xc9, 0x70, 0x4f, + 0xd5, 0x79, 0x08, 0x80, 0xb5, 0x82, 0x0a, 0xe5, 0xdf, 0x92, 0x6b, 0x7b, + 0xb5, 0x2d, 0xeb, 0x43, 0x26, 0xbf, 0x24, 0xb8, 0xb0, 0xed, 0x37, 0xf7, + 0xb0, 0xf9, 0x9f, 0xd7, 0x20, 0xf7, 0x2a, 0xc3, 0x4f, 0x71, 0xd5, 0x06, + 0xb6, 0xfd, 0xe6, 0x75, 0x2a, 0xd2, 0x67, 0xd5, 0xd6, 0xb9, 0x7c, 0x1f, + 0xab, 0xbf, 0xb5, 0x9a, 0x7d, 0x23, 0x2a, 0xce, 0xb5, 0x57, 0xe5, 0xc8, + 0xff, 0xe6, 0x1e, 0xf2, 0x9f, 0x55, 0xfb, 0x85, 0x0d, 0x6f, 0x63, 0x60, + 0xe7, 0x53, 0x0c, 0x3f, 0xa8, 0x92, 0x5d, 0x71, 0x03, 0x8c, 0x0e, 0xbc, + 0x8d, 0xd1, 0xaf, 0xa9, 0xfd, 0x6d, 0x9f, 0xff, 0x34, 0x9b, 0x3f, 0x75, + 0x2b, 0x85, 0x43, 0x0a, 0x9e, 0x90, 0xbd, 0x66, 0x13, 0xdb, 0x36, 0xbc, + 0x1f, 0x80, 0xcd, 0xd7, 0x6c, 0xf2, 0xea, 0x17, 0x7c, 0x5f, 0x0f, 0x9c, + 0x35, 0xbd, 0x91, 0x9e, 0x91, 0xdf, 0xa3, 0x6a, 0x7f, 0x5e, 0x82, 0xc6, + 0xc0, 0xaf, 0x04, 0x1a, 0x15, 0x07, 0x0f, 0x02, 0x18, 0x2c, 0xab, 0x59, + 0xa7, 0x6b, 0x4e, 0xfd, 0x13, 0xe6, 0x30, 0xef, 0x57, 0x12, 0x9c, 0xfa, + 0xf7, 0x1a, 0xf5, 0x97, 0x7e, 0x02, 0xff, 0xaa, 0xfc, 0x4f, 0xfd, 0xbb, + 0xb2, 0xd4, 0x4b, 0xfc, 0x4a, 0x17, 0x2f, 0xfe, 0xfb, 0x54, 0x28, 0xcd, + 0xcf, 0xeb, 0xb1, 0xb4, 0xd3, 0x4c, 0xd7, 0x65, 0xe0, 0xac, 0x2c, 0x77, + 0xea, 0x66, 0x6b, 0xf0, 0x7d, 0x5d, 0x38, 0x3c, 0x0c, 0x80, 0x5b, 0xa9, + 0x32, 0x70, 0xfd, 0x15, 0x14, 0x1e, 0xd4, 0x80, 0x87, 0x46, 0x9d, 0xd2, + 0xf1, 0x82, 0xd7, 0x3d, 0x95, 0x80, 0xbd, 0x64, 0x29, 0xa5, 0xa3, 0x79, + 0x72, 0x4b, 0x60, 0xd7, 0xff, 0x50, 0xf7, 0x46, 0xe9, 0x68, 0x9e, 0xf4, + 0x92, 0x3e, 0xd2, 0x29, 0x41, 0xc6, 0x5e, 0xca, 0xd8, 0xd8, 0x28, 0xf6, + 0x02, 0x9b, 0x1b, 0xff, 0x44, 0x6d, 0xb7, 0xdf, 0x30, 0x4c, 0x5f, 0x5f, + 0x3f, 0xe5, 0x4a, 0x89, 0xd2, 0xc9, 0x12, 0xce, 0xc3, 0x63, 0xd8, 0x17, + 0xf7, 0x41, 0x4c, 0xf7, 0xdf, 0xe7, 0x67, 0x70, 0x4e, 0x16, 0xd9, 0xf6, + 0xfb, 0x45, 0x9c, 0xc3, 0xa3, 0x0c, 0x5c, 0xb5, 0x06, 0xe7, 0x64, 0x11, + 0x7b, 0x7e, 0x06, 0xbb, 0x77, 0x11, 0x00, 0xc3, 0x23, 0x43, 0x0c, 0xac, + 0x18, 0xc4, 0x71, 0xd4, 0xef, 0x7f, 0xcb, 0xb5, 0x43, 0xd8, 0xb6, 0xfa, + 0xbd, 0x1a, 0x3f, 0xe7, 0xf0, 0xa8, 0xca, 0x6f, 0x59, 0x3f, 0xb6, 0x9d, + 0x65, 0xf8, 0xae, 0x21, 0xb6, 0xad, 0xcf, 0x92, 0x62, 0x17, 0x03, 0x6b, + 0xd7, 0xe3, 0x38, 0x05, 0x6c, 0x3b, 0x8b, 0x9d, 0xb1, 0xbd, 0xfc, 0xc8, + 0xd8, 0x0c, 0xdf, 0x35, 0xc4, 0xf0, 0x5d, 0x60, 0xdb, 0x59, 0x2f, 0x8e, + 0xe3, 0x14, 0x28, 0x1d, 0x1e, 0x25, 0xbd, 0xac, 0x3f, 0x7c, 0x8e, 0xb5, + 0xd1, 0xb8, 0x15, 0xab, 0x7b, 0x00, 0x2d, 0xe9, 0xf5, 0x61, 0xf4, 0xa6, + 0x81, 0x77, 0x6c, 0xc9, 0x94, 0xea, 0x0f, 0x1b, 0x68, 0x88, 0x09, 0x17, + 0x09, 0xa8, 0x56, 0x24, 0x56, 0x46, 0x67, 0xdc, 0x70, 0x70, 0x03, 0xdd, + 0x57, 0x03, 0xd0, 0x82, 0xc0, 0x73, 0xba, 0xe9, 0x57, 0x52, 0x6f, 0x40, + 0x5c, 0xe7, 0xb9, 0xb4, 0x07, 0x86, 0x1d, 0xff, 0xaa, 0x2f, 0x5a, 0x88, + 0x47, 0x36, 0x0a, 0xde, 0xd7, 0xcf, 0xfd, 0xf8, 0x65, 0x66, 0xa3, 0x1f, + 0xce, 0x12, 0x76, 0x25, 0xfe, 0xf8, 0x0d, 0xc8, 0xff, 0xf7, 0x3f, 0x67, + 0x15, 0xb7, 0x9d, 0x4c, 0xd7, 0xff, 0xbe, 0x69, 0x63, 0xfd, 0xf2, 0xea, + 0x57, 0xf5, 0x36, 0xd5, 0xb4, 0x35, 0xba, 0x0f, 0xf8, 0xf5, 0xda, 0xcb, + 0xfc, 0xdb, 0x34, 0x79, 0x04, 0xef, 0xeb, 0x60, 0x9f, 0xab, 0x9d, 0xac, + 0x2b, 0x05, 0xdc, 0x2d, 0x71, 0xee, 0xd2, 0x1e, 0x77, 0xf9, 0x61, 0x0e, + 0xf0, 0x8d, 0xa9, 0x2f, 0xb1, 0xe2, 0x9c, 0x4f, 0x71, 0xfc, 0xf1, 0x29, + 0x16, 0xbe, 0x5d, 0xf9, 0x6f, 0xed, 0x06, 0x8e, 0xdb, 0xf4, 0x2f, 0x74, + 0x3c, 0xa0, 0xd6, 0xb1, 0xf1, 0x00, 0x8c, 0x71, 0x81, 0x60, 0xc7, 0x5d, + 0x1b, 0xd8, 0x98, 0xdb, 0xee, 0xf9, 0x9d, 0xfd, 0x78, 0xf8, 0x39, 0x0a, + 0x0a, 0xa2, 0x65, 0x46, 0x56, 0x1c, 0x60, 0x5f, 0xb7, 0xcd, 0x96, 0x8a, + 0xc3, 0x37, 0xb4, 0xdf, 0x3d, 0x6b, 0x61, 0xcd, 0xd7, 0x14, 0x58, 0xeb, + 0x7f, 0xad, 0x54, 0x10, 0xac, 0x1f, 0xcf, 0x55, 0xb0, 0xab, 0x25, 0x53, + 0xf0, 0xe3, 0x2e, 0xf8, 0xd6, 0xb1, 0x29, 0x2e, 0x78, 0x07, 0x2c, 0x5f, + 0x0e, 0xeb, 0xd6, 0xe9, 0x84, 0xbb, 0x01, 0x32, 0xec, 0xde, 0xed, 0x97, + 0x75, 0xf0, 0xa0, 0xda, 0x5e, 0x2d, 0x15, 0x50, 0xab, 0x59, 0xcf, 0x3d, + 0x3e, 0xc5, 0x00, 0x53, 0x1c, 0x9d, 0xdb, 0x1a, 0x16, 0xec, 0xca, 0xdc, + 0xfc, 0xee, 0x2e, 0x38, 0x36, 0xc5, 0x71, 0x14, 0x50, 0xcb, 0xc0, 0xb5, + 0x3e, 0xba, 0x1d, 0x16, 0x2e, 0xea, 0x22, 0xf3, 0xc8, 0x14, 0xeb, 0xbc, + 0xc8, 0x68, 0x82, 0x4d, 0x51, 0x03, 0xb5, 0x68, 0x0f, 0xdc, 0x0a, 0xfa, + 0x1b, 0xf8, 0x56, 0x91, 0x00, 0x70, 0x4b, 0x85, 0x7f, 0xb4, 0x0b, 0xe8, + 0x52, 0xe5, 0xbc, 0x59, 0xbf, 0xab, 0x42, 0x7d, 0xae, 0x40, 0xdb, 0x2c, + 0xd7, 0xbb, 0x86, 0x9d, 0x7b, 0x6f, 0x04, 0xc0, 0xf9, 0xfc, 0x76, 0xb8, + 0xe6, 0x5a, 0xf8, 0xec, 0x36, 0x04, 0x90, 0xfd, 0xcc, 0x66, 0x1c, 0x7b, + 0x3b, 0x94, 0x15, 0x38, 0x0b, 0x80, 0xab, 0x2c, 0xfa, 0x2e, 0x49, 0x32, + 0x06, 0xec, 0xd3, 0x6f, 0xa8, 0x5c, 0x63, 0x98, 0xa1, 0x5b, 0xce, 0x67, + 0xfd, 0xd3, 0x20, 0x2f, 0xb8, 0x8e, 0x6d, 0x87, 0x41, 0x68, 0x98, 0x5a, + 0xdf, 0x65, 0x2a, 0xee, 0x9d, 0xd4, 0x95, 0xfb, 0xc1, 0x2a, 0x3b, 0xfe, + 0xf1, 0x08, 0x1b, 0xf7, 0xaa, 0xf6, 0x7a, 0x61, 0xad, 0x7a, 0xf6, 0xe4, + 0xd6, 0xda, 0x8c, 0x3d, 0x58, 0x65, 0xc3, 0x65, 0xea, 0x4a, 0x1b, 0xf7, + 0xf0, 0xef, 0x97, 0x70, 0x57, 0xd4, 0xe9, 0x5f, 0x91, 0x62, 0xf4, 0xd6, + 0x32, 0xb9, 0x05, 0x29, 0x86, 0x4a, 0xa7, 0xbf, 0xb0, 0x45, 0xdf, 0x82, + 0x24, 0xc3, 0x9a, 0x97, 0xd1, 0x0c, 0xce, 0xca, 0x65, 0xd5, 0x6f, 0x33, + 0xd7, 0x61, 0x2c, 0x63, 0x36, 0xda, 0x7a, 0x8d, 0x7a, 0x56, 0xee, 0xf9, + 0xfe, 0x0c, 0x40, 0x2d, 0x60, 0xc7, 0x55, 0xdf, 0x60, 0xe3, 0x1f, 0x5c, + 0xea, 0x97, 0x7f, 0xbd, 0x05, 0x92, 0x10, 0x50, 0x4b, 0xe8, 0xf1, 0xce, + 0xd9, 0x02, 0xb5, 0x82, 0x0a, 0xb6, 0xcd, 0x06, 0xad, 0x45, 0xa1, 0xb0, + 0xbe, 0x58, 0x1f, 0x63, 0x8d, 0x31, 0xdf, 0x23, 0x56, 0x0d, 0x41, 0x79, + 0x0a, 0xc5, 0x2f, 0x60, 0x89, 0x15, 0xa4, 0x53, 0xe1, 0x36, 0x5d, 0xd1, + 0x55, 0xf0, 0x35, 0x4b, 0x84, 0xc1, 0x5a, 0x6e, 0xa3, 0x04, 0x94, 0xb0, + 0x62, 0x4b, 0xb5, 0x4f, 0x49, 0xc7, 0xbf, 0x93, 0xb0, 0x4a, 0x98, 0xc6, + 0xb3, 0x95, 0x58, 0x8d, 0x5b, 0xd3, 0x30, 0xdd, 0x58, 0x0a, 0x57, 0x3a, + 0x2a, 0xbc, 0xb1, 0x03, 0x80, 0x7d, 0xc7, 0x6f, 0x04, 0x3e, 0x07, 0xa0, + 0xc1, 0x5a, 0x00, 0xb7, 0xe8, 0xed, 0x4d, 0xc0, 0x0a, 0x0d, 0xfa, 0x0a, + 0x97, 0x60, 0xe0, 0x06, 0x0a, 0xdd, 0x30, 0xfb, 0x6b, 0xd9, 0x0c, 0xba, + 0x02, 0x42, 0xc0, 0xac, 0x99, 0xc2, 0x5f, 0x55, 0x39, 0xb5, 0xe9, 0xf3, + 0x69, 0x07, 0xd4, 0x0a, 0x6a, 0xd0, 0x5a, 0xc4, 0xae, 0x59, 0x3e, 0xc3, + 0xdb, 0x29, 0x03, 0x1c, 0x0c, 0xb8, 0x8b, 0x7a, 0x6b, 0xfc, 0x3b, 0xf9, + 0x05, 0xd3, 0x2c, 0xd7, 0xfb, 0x5f, 0xfb, 0x1a, 0x7c, 0x11, 0xf8, 0x43, + 0x3a, 0x43, 0xb2, 0x66, 0xe3, 0x77, 0x3a, 0xe1, 0xa7, 0x93, 0xe6, 0xef, + 0xde, 0x0f, 0xff, 0xed, 0xc9, 0x09, 0xf8, 0x7f, 0xa0, 0x77, 0x02, 0xfe, + 0x70, 0x39, 0x7c, 0xf1, 0xe0, 0xab, 0xcf, 0x37, 0xa8, 0xd9, 0x00, 0xb5, + 0x5e, 0xa9, 0x66, 0x1a, 0x37, 0x7b, 0x35, 0x32, 0x8b, 0x1d, 0xcc, 0x3e, + 0x3e, 0x18, 0x60, 0x93, 0x91, 0x65, 0xa5, 0x70, 0xdd, 0x32, 0xc1, 0x5e, + 0x89, 0xeb, 0xba, 0x6d, 0xc1, 0x52, 0x22, 0x61, 0x21, 0x34, 0x44, 0xc6, + 0x00, 0xb7, 0x54, 0x5a, 0xa5, 0x60, 0x7c, 0x11, 0x03, 0x12, 0x29, 0x44, + 0x43, 0xb6, 0x84, 0x05, 0xef, 0xf3, 0xa0, 0xbf, 0x65, 0x59, 0x6a, 0x5f, + 0x03, 0xb5, 0x5e, 0x4f, 0x88, 0x56, 0x3b, 0xbd, 0xda, 0xf2, 0x82, 0xe3, + 0x66, 0xc1, 0xef, 0x5c, 0x49, 0x04, 0x85, 0x58, 0xfb, 0x1e, 0x65, 0xb5, + 0x21, 0x49, 0xc6, 0x04, 0xf5, 0x86, 0x44, 0xc4, 0x24, 0xf1, 0x86, 0xa0, + 0x1e, 0x53, 0xe7, 0xd7, 0x6d, 0x04, 0xfa, 0x79, 0x0d, 0x81, 0x8c, 0x81, + 0x83, 0x3f, 0xe6, 0xa1, 0xc6, 0xf1, 0xe3, 0xa4, 0x1a, 0xe0, 0xc6, 0xbc, + 0x2f, 0x6f, 0x00, 0x08, 0xe2, 0xe4, 0x01, 0x41, 0x1d, 0x2b, 0xa1, 0x9e, + 0xb3, 0xdb, 0x1b, 0x78, 0xdf, 0x56, 0x8d, 0x0c, 0x67, 0xa7, 0xa4, 0x99, + 0x39, 0x06, 0xe4, 0x65, 0x9e, 0xd5, 0xb2, 0x01, 0x79, 0x53, 0x0b, 0x0d, + 0x62, 0x94, 0x0d, 0xbc, 0x9f, 0x4b, 0x0a, 0x05, 0xae, 0x12, 0x28, 0x98, + 0x96, 0xaf, 0xf0, 0x38, 0x9b, 0xd4, 0xa0, 0x2e, 0x87, 0xa6, 0x67, 0x63, + 0x03, 0xac, 0x58, 0x1c, 0xa9, 0xe3, 0x4b, 0x14, 0xf8, 0x2a, 0x8f, 0xc0, + 0xd2, 0xbf, 0x14, 0xb3, 0x78, 0xd5, 0xf0, 0xb7, 0x87, 0xbc, 0xdf, 0x5d, + 0x6e, 0x49, 0x8e, 0x81, 0x15, 0xaa, 0x3d, 0xb2, 0xe7, 0x89, 0x02, 0x10, + 0xf7, 0xe0, 0xc6, 0xc1, 0xba, 0x48, 0x01, 0x63, 0x35, 0x30, 0xb0, 0xad, + 0x3a, 0x75, 0xe2, 0x15, 0xbc, 0xf3, 0x26, 0x63, 0x78, 0x65, 0x8b, 0x98, + 0xae, 0x40, 0x4c, 0xfd, 0x46, 0x57, 0xd7, 0x04, 0x16, 0x30, 0x12, 0x83, + 0x63, 0xcd, 0xcf, 0xf2, 0xc0, 0x77, 0x2e, 0x3e, 0xec, 0x7b, 0x4f, 0x95, + 0x9e, 0x85, 0xa6, 0x61, 0xa9, 0xc5, 0xe7, 0xae, 0xe0, 0x09, 0x4e, 0x6f, + 0x85, 0x89, 0xb3, 0xb9, 0x80, 0x29, 0x9e, 0x0d, 0xf9, 0xcd, 0x2d, 0x25, + 0xe8, 0x4a, 0x9f, 0xc3, 0x89, 0x13, 0x27, 0x98, 0xf7, 0xd6, 0x5a, 0x87, + 0x94, 0xb0, 0xac, 0x3f, 0xc7, 0xe1, 0x51, 0xf5, 0x8e, 0x5a, 0x96, 0x9b, + 0xef, 0x41, 0xb5, 0xcc, 0xfe, 0xe1, 0xfc, 0xc9, 0x4e, 0x49, 0x4f, 0x5b, + 0x41, 0x88, 0xd6, 0xe9, 0x00, 0xb5, 0x7e, 0x16, 0x00, 0xae, 0xb3, 0xb9, + 0x80, 0xb9, 0xe9, 0x67, 0x79, 0x34, 0xed, 0x9f, 0x3b, 0x73, 0x4e, 0x4f, + 0xfd, 0xca, 0x09, 0x0f, 0x86, 0xd6, 0xc5, 0x39, 0x3a, 0x54, 0xf7, 0x8b, + 0x3f, 0x0c, 0x6c, 0x50, 0xce, 0xe0, 0x33, 0xfc, 0xfe, 0x9d, 0x9b, 0x19, + 0x3d, 0x38, 0x46, 0xff, 0xf2, 0x3e, 0xec, 0x6c, 0x96, 0x23, 0x23, 0x79, + 0x96, 0xae, 0xc8, 0x71, 0xff, 0xdf, 0xdc, 0xc9, 0xd2, 0xe5, 0x7d, 0x1c, + 0x39, 0x38, 0x86, 0xfd, 0xa1, 0x41, 0x96, 0xae, 0xc8, 0x71, 0x64, 0x24, + 0x4f, 0x32, 0x25, 0x38, 0x72, 0x78, 0x8c, 0xa5, 0xcb, 0xfa, 0x38, 0x72, + 0x78, 0x8c, 0x54, 0x6f, 0x8e, 0xc1, 0xb5, 0xd7, 0x72, 0xa4, 0x27, 0x1c, + 0x66, 0x67, 0x33, 0x1c, 0x19, 0xc9, 0x33, 0x70, 0x59, 0x8e, 0xfb, 0xef, + 0xda, 0x47, 0xff, 0xc5, 0x39, 0x44, 0xad, 0xc0, 0xd2, 0x0b, 0x2d, 0xec, + 0x6c, 0x16, 0xa7, 0x50, 0xe0, 0xc6, 0x3b, 0xee, 0x27, 0x9b, 0xcd, 0xc2, + 0xf7, 0x0a, 0xf4, 0x5f, 0x66, 0x33, 0xea, 0x0a, 0x38, 0xae, 0x16, 0xd6, + 0xc8, 0x3f, 0x91, 0xc7, 0xae, 0x80, 0xb5, 0x42, 0x2f, 0xf8, 0xe4, 0x56, + 0xc9, 0xa1, 0xda, 0x94, 0xf1, 0x84, 0x02, 0x70, 0x19, 0x25, 0x2d, 0xf5, + 0x8d, 0xd4, 0x2d, 0x05, 0x9e, 0x0b, 0x4d, 0x8f, 0xaa, 0xfe, 0x25, 0xfd, + 0x38, 0xe5, 0x52, 0xf3, 0x2d, 0x1d, 0xfe, 0x8e, 0x18, 0x78, 0xbe, 0x35, + 0x43, 0x10, 0x45, 0x0d, 0xac, 0x84, 0x85, 0x5b, 0x73, 0xb1, 0x02, 0xdf, + 0x6e, 0x0d, 0x50, 0xab, 0xd9, 0xdd, 0x9c, 0x9f, 0x17, 0xde, 0x34, 0x37, + 0xa6, 0xda, 0xa8, 0x22, 0x2b, 0x2e, 0xe9, 0x94, 0x0d, 0x31, 0x49, 0xee, + 0x9d, 0x59, 0x4a, 0x15, 0xbf, 0x2d, 0x1f, 0x4f, 0x08, 0xe2, 0xa8, 0x05, + 0x94, 0xe4, 0x94, 0x7f, 0x2c, 0xa3, 0xc7, 0x47, 0xfd, 0xe3, 0x4f, 0x08, + 0xaa, 0xb5, 0x36, 0x63, 0x29, 0x81, 0x7b, 0x5a, 0xf4, 0x05, 0xfa, 0x1e, + 0x1a, 0x20, 0x35, 0x9a, 0x1f, 0xe6, 0x7f, 0x4f, 0x5e, 0xc5, 0xdf, 0x73, + 0x2b, 0x00, 0x7f, 0xcf, 0xad, 0x7c, 0x84, 0x4f, 0x33, 0x3e, 0xfe, 0x34, + 0x37, 0xb1, 0x99, 0x0b, 0xb1, 0xd8, 0x3a, 0xfe, 0x71, 0x05, 0xdc, 0xba, + 0xe0, 0x51, 0x9c, 0xc5, 0x25, 0x82, 0xa3, 0x4b, 0x06, 0xcc, 0xb5, 0x6b, + 0x72, 0x67, 0x0b, 0x54, 0xca, 0xbe, 0x26, 0x4b, 0xe9, 0x78, 0x09, 0x4a, + 0x0a, 0x0a, 0x05, 0xd0, 0x93, 0xea, 0xf5, 0x00, 0x5a, 0x7d, 0xef, 0x55, + 0x9d, 0x75, 0x03, 0xd8, 0xea, 0x49, 0xf5, 0xf2, 0xcc, 0xf8, 0x49, 0xce, + 0x5f, 0x30, 0x9f, 0xfc, 0x53, 0x0e, 0xb2, 0x57, 0x3d, 0xef, 0x4d, 0x9e, + 0xf6, 0x65, 0x36, 0xce, 0x98, 0x1b, 0x82, 0x5e, 0x99, 0xb2, 0x9a, 0x25, + 0x27, 0x25, 0xe7, 0x2d, 0x57, 0x5f, 0x18, 0x1f, 0xf9, 0xce, 0xe3, 0x5c, + 0xb0, 0xf4, 0x32, 0x9e, 0x3e, 0xf2, 0x1c, 0x17, 0x2c, 0x7d, 0x0b, 0x8f, + 0x7c, 0xe7, 0x71, 0xde, 0xfd, 0x5e, 0x05, 0xd6, 0x82, 0x26, 0x00, 0x98, + 0x39, 0x4f, 0x27, 0x15, 0x24, 0x2c, 0x9b, 0xc8, 0xe2, 0xf4, 0xe8, 0x6b, + 0x31, 0x5f, 0x9f, 0xdf, 0x93, 0xd2, 0x8b, 0x27, 0x8d, 0xff, 0xc9, 0xa6, + 0x36, 0x86, 0x81, 0x73, 0xcd, 0x17, 0xe4, 0x0f, 0x7f, 0x97, 0xb3, 0xce, + 0xb0, 0x39, 0x39, 0x75, 0x98, 0x37, 0x9f, 0x79, 0x2e, 0xf9, 0xa7, 0x54, + 0x7e, 0x67, 0x9d, 0x61, 0xf3, 0xcc, 0xf8, 0x49, 0x9e, 0xff, 0x89, 0xbf, + 0x9f, 0x7f, 0x4a, 0xc5, 0x7d, 0xfe, 0x27, 0x4e, 0x08, 0xac, 0x95, 0x7f, + 0xea, 0xbb, 0x00, 0x01, 0x7f, 0xfd, 0x4c, 0x0d, 0xdc, 0xd3, 0x91, 0x22, + 0x45, 0x8a, 0x14, 0x29, 0x52, 0xa4, 0x48, 0x91, 0x22, 0x45, 0x8a, 0x14, + 0x29, 0x52, 0xa4, 0x48, 0x91, 0x22, 0x45, 0x8a, 0x14, 0x29, 0x52, 0xa4, + 0x48, 0x91, 0x22, 0x45, 0x8a, 0x14, 0x69, 0xf6, 0xfa, 0x45, 0xc3, 0x5a, + 0x44, 0x8a, 0x14, 0x29, 0x52, 0xa4, 0x48, 0xbf, 0x3c, 0xba, 0x0f, 0xe2, + 0x57, 0xaa, 0x69, 0x68, 0xa9, 0x54, 0xab, 0x91, 0xfc, 0x6c, 0x24, 0xf4, + 0xc4, 0xbc, 0x6a, 0xa5, 0x15, 0xc0, 0x93, 0xe9, 0xc9, 0x4c, 0x9b, 0xd6, + 0x99, 0xf4, 0x27, 0xe7, 0x95, 0xf4, 0x6a, 0xee, 0xc1, 0x49, 0xd7, 0x4e, + 0x51, 0x85, 0x1b, 0xb0, 0x56, 0xb5, 0x52, 0x25, 0xd9, 0x9d, 0x24, 0xd9, + 0xad, 0xc0, 0x5a, 0x65, 0x0d, 0x6c, 0x08, 0xae, 0x80, 0x6c, 0xf2, 0xb5, + 0x7b, 0xfc, 0x49, 0x5f, 0x6e, 0x60, 0xe5, 0xf9, 0x7d, 0xc0, 0x63, 0x17, + 0xc2, 0x3b, 0x9e, 0x24, 0xa4, 0x6c, 0xef, 0xec, 0x0c, 0xa0, 0x7f, 0x56, + 0x4a, 0x26, 0x92, 0x94, 0x9b, 0x90, 0x4f, 0x9d, 0xea, 0xec, 0x50, 0x27, + 0x4e, 0x7f, 0xc8, 0xb2, 0xf2, 0xd8, 0x41, 0x97, 0x45, 0xda, 0x04, 0xcf, + 0xac, 0x0c, 0xef, 0x43, 0x00, 0x80, 0x46, 0x9c, 0xb4, 0x3e, 0x67, 0x06, + 0xa8, 0xe5, 0x95, 0xdd, 0x9d, 0xa1, 0x34, 0xe1, 0x20, 0x12, 0x7a, 0x75, + 0x6d, 0x03, 0xd7, 0x12, 0xca, 0xdc, 0x58, 0xd6, 0x24, 0xe9, 0x22, 0xd4, + 0x63, 0x1a, 0x7c, 0xa5, 0x61, 0x5a, 0xc2, 0x12, 0x88, 0x49, 0x89, 0xac, + 0xb9, 0x48, 0x0d, 0xf8, 0xb1, 0x26, 0xf4, 0xc4, 0x46, 0x73, 0x0c, 0x58, + 0x54, 0x8b, 0x2e, 0x65, 0xd3, 0x22, 0x74, 0x25, 0xa9, 0x86, 0xc0, 0x95, + 0x2e, 0x88, 0x14, 0x56, 0x4d, 0xc2, 0x84, 0x8b, 0xdb, 0x6b, 0x91, 0x4e, + 0x09, 0x5c, 0x01, 0x29, 0xb3, 0x72, 0x73, 0xb7, 0x20, 0x55, 0x01, 0x26, + 0x25, 0xe5, 0x98, 0xc4, 0xad, 0x48, 0x44, 0x05, 0x64, 0xaf, 0x40, 0x1c, + 0x77, 0x91, 0x0b, 0x85, 0x32, 0xc2, 0x2a, 0xab, 0xc9, 0xa2, 0x76, 0xb7, + 0x45, 0xc1, 0x82, 0x54, 0x31, 0x3c, 0xc9, 0x30, 0x55, 0x94, 0x94, 0x63, + 0x0a, 0x08, 0x46, 0x4c, 0x60, 0x49, 0x60, 0x42, 0xe2, 0xf6, 0x5a, 0x88, + 0x49, 0x17, 0x8e, 0x4b, 0xe8, 0x81, 0xaa, 0x2b, 0x89, 0x67, 0x74, 0x99, + 0x28, 0xb8, 0x96, 0xeb, 0x82, 0x38, 0xea, 0x83, 0xbc, 0xe2, 0x80, 0x98, + 0x90, 0xd8, 0x3d, 0x82, 0x23, 0xdd, 0x82, 0x74, 0x0c, 0x4a, 0x15, 0x49, + 0x5a, 0xaf, 0x1e, 0x4b, 0x42, 0xf9, 0xb9, 0xdf, 0x2f, 0x51, 0xbf, 0x28, + 0x0d, 0x48, 0x92, 0x47, 0x5d, 0x1f, 0xa6, 0xd5, 0x23, 0x58, 0x2a, 0x05, + 0x54, 0xe0, 0x48, 0x4d, 0x9d, 0xdf, 0x74, 0x19, 0x05, 0xe3, 0x12, 0x6a, + 0x12, 0xab, 0x98, 0x90, 0x7a, 0x46, 0xbe, 0x4e, 0xf3, 0x05, 0x9b, 0x63, + 0x07, 0x03, 0xd7, 0x2c, 0x70, 0x5f, 0x03, 0x58, 0x89, 0x38, 0xe5, 0x8a, + 0x43, 0xaa, 0xdb, 0xf6, 0x01, 0x5b, 0x0d, 0x74, 0x2b, 0xdc, 0x37, 0x19, + 0x97, 0xb5, 0xaa, 0x07, 0xd3, 0x6a, 0x86, 0x6c, 0x19, 0x4d, 0x07, 0xd4, + 0x32, 0xc0, 0xad, 0x66, 0xf0, 0x96, 0x5b, 0x73, 0x3c, 0xb0, 0x56, 0x33, + 0x28, 0xab, 0x13, 0x3c, 0xab, 0x9d, 0x9f, 0x9f, 0xc6, 0xa2, 0x5c, 0x6e, + 0xad, 0x87, 0x81, 0x48, 0x4d, 0x07, 0x41, 0x9a, 0x6d, 0x9a, 0xe9, 0xf2, + 0x7a, 0xb5, 0xe9, 0x4f, 0xb7, 0x2e, 0x41, 0x03, 0x9d, 0xe9, 0xee, 0x6b, + 0x00, 0xb7, 0xea, 0x92, 0xed, 0x49, 0x51, 0x28, 0xbb, 0xed, 0xa1, 0x05, + 0x6d, 0x0d, 0x84, 0x24, 0x49, 0x91, 0xa6, 0x24, 0xab, 0x2d, 0xab, 0x0b, + 0x77, 0x92, 0x35, 0xcf, 0xc2, 0xad, 0xba, 0x21, 0xa8, 0x56, 0x5f, 0x5f, + 0x8e, 0xfc, 0x51, 0x65, 0xa1, 0xe9, 0x4e, 0xb9, 0x50, 0x31, 0x90, 0x16, + 0x01, 0xb2, 0x8e, 0x9c, 0x2c, 0x79, 0x46, 0xeb, 0xe6, 0x78, 0x0d, 0x98, + 0x6a, 0x36, 0xf0, 0xab, 0x4e, 0x71, 0xa6, 0x83, 0x65, 0xcd, 0x06, 0x74, + 0x15, 0x0c, 0x9b, 0xe9, 0x7a, 0x77, 0xca, 0x6b, 0x56, 0xe5, 0x04, 0xce, + 0xbd, 0x0c, 0x40, 0xc4, 0xa4, 0xeb, 0x86, 0x20, 0x5b, 0x9e, 0x9a, 0xee, + 0xeb, 0xc2, 0x77, 0x9f, 0x27, 0xcb, 0x02, 0x00, 0x16, 0xf4, 0x4e, 0x87, + 0xc2, 0xf2, 0x35, 0x9d, 0xc9, 0x7f, 0x6f, 0x1b, 0x77, 0x18, 0x32, 0x35, + 0x3d, 0x70, 0xeb, 0x8b, 0xb4, 0x37, 0x12, 0x9c, 0x49, 0xfb, 0x27, 0x7c, + 0x0b, 0xbb, 0xfd, 0xfb, 0xf7, 0x87, 0x8e, 0x25, 0x68, 0xa0, 0xd7, 0xc9, + 0x0e, 0xaf, 0x77, 0x9a, 0xb0, 0xe9, 0x34, 0x5d, 0xba, 0x76, 0xe0, 0xad, + 0xe0, 0xb9, 0x30, 0x7e, 0xc1, 0xf3, 0x71, 0x00, 0x34, 0x52, 0x2b, 0x5c, + 0x46, 0x73, 0x7e, 0x0b, 0xe6, 0xc0, 0x27, 0x6f, 0x83, 0x8d, 0xb7, 0xf5, + 0xd2, 0x3b, 0x31, 0x41, 0x73, 0x69, 0x17, 0x00, 0xec, 0x5c, 0x40, 0xe1, + 0xbb, 0xcf, 0x7b, 0x7e, 0xc7, 0x8e, 0xc3, 0xa2, 0x4b, 0xc2, 0x2b, 0x42, + 0x7f, 0x63, 0xf4, 0x31, 0xae, 0x38, 0xe4, 0xef, 0xbf, 0xaf, 0xff, 0x1d, + 0x7c, 0x63, 0xf4, 0x31, 0xc6, 0xfe, 0xe4, 0x3a, 0x44, 0x0c, 0xb6, 0x1c, + 0xcc, 0xb3, 0x75, 0xb9, 0x32, 0xf2, 0xd8, 0x72, 0xf0, 0xf4, 0x8d, 0x5b, + 0xb7, 0x2c, 0xcb, 0xcd, 0x2a, 0x1f, 0x5b, 0xb7, 0xb5, 0xf2, 0x93, 0x2e, + 0x76, 0xc2, 0xe2, 0xff, 0x67, 0xef, 0xfd, 0xc3, 0xe4, 0x28, 0xee, 0x7b, + 0xdd, 0x97, 0x93, 0x31, 0xae, 0xc9, 0xb3, 0xb2, 0x7b, 0xc8, 0xc2, 0xfb, + 0x21, 0xe4, 0x00, 0x00, 0x20, 0x00, 0x49, 0x44, 0x41, 0x54, 0x2a, 0xe9, + 0x86, 0xdd, 0xdc, 0x69, 0x7b, 0xd7, 0x68, 0x64, 0x70, 0x18, 0x5d, 0xb8, + 0x66, 0xd7, 0x92, 0x2d, 0xad, 0xed, 0x44, 0x92, 0xed, 0x3c, 0xb0, 0x58, + 0x4e, 0x10, 0x26, 0x01, 0x04, 0x39, 0x37, 0x92, 0xcc, 0xb1, 0x23, 0xe1, + 0x3c, 0x39, 0x88, 0x63, 0xd9, 0x12, 0xf1, 0xb9, 0x01, 0xc5, 0x24, 0x96, + 0x94, 0xdc, 0x8b, 0x25, 0x48, 0xb0, 0x84, 0x1d, 0x22, 0x99, 0x9b, 0xc4, + 0x92, 0x4e, 0x70, 0x46, 0xb2, 0x25, 0xef, 0x92, 0x40, 0x34, 0x38, 0x10, + 0x8d, 0xf0, 0x6e, 0xd2, 0x63, 0x6b, 0xa1, 0xfb, 0x46, 0x7b, 0x3c, 0x0d, + 0xda, 0x64, 0xca, 0x78, 0xce, 0xe5, 0xfe, 0x51, 0xfd, 0xa3, 0xba, 0x67, + 0x66, 0x77, 0x25, 0x83, 0xed, 0xdc, 0xd3, 0x9f, 0xe7, 0xd9, 0xed, 0xee, + 0xea, 0xaa, 0x6f, 0x55, 0x77, 0x4f, 0xd7, 0xcf, 0xae, 0xb7, 0x46, 0x07, + 0x4c, 0x0e, 0x4e, 0x7a, 0x8c, 0xf4, 0x9a, 0x38, 0x33, 0xca, 0x0d, 0x88, + 0xdc, 0x2a, 0xd3, 0x5e, 0xe4, 0x67, 0x36, 0xe9, 0x71, 0x6e, 0x5f, 0x5e, + 0x46, 0xb6, 0x60, 0xfb, 0x89, 0x64, 0xfc, 0xf3, 0x4d, 0xe3, 0x85, 0x5e, + 0xdb, 0xdc, 0x9a, 0x1d, 0x18, 0x35, 0x2f, 0x2d, 0xb3, 0xe3, 0xd5, 0xda, + 0x81, 0x53, 0x5e, 0x93, 0xc5, 0x57, 0x2e, 0xee, 0xee, 0xff, 0x7c, 0x54, + 0xd7, 0xca, 0xcd, 0x4f, 0xaf, 0x9b, 0xd3, 0xbb, 0xb5, 0xcc, 0xc0, 0x3d, + 0x3e, 0x3b, 0xa4, 0x72, 0xc7, 0xe3, 0x45, 0xf8, 0x10, 0x30, 0x59, 0xfb, + 0xe1, 0xd2, 0x76, 0x3e, 0x9a, 0xd4, 0xae, 0x63, 0xdf, 0xf6, 0xae, 0xde, + 0x4a, 0x45, 0x8b, 0x4d, 0xbf, 0x23, 0xd8, 0xf1, 0xd9, 0xce, 0x79, 0xee, + 0x7b, 0x7f, 0xf1, 0x20, 0xab, 0x57, 0xac, 0xe6, 0x0b, 0xff, 0xa7, 0x3d, + 0xab, 0x9f, 0xf1, 0x13, 0x5b, 0xd8, 0xf1, 0xd9, 0xb9, 0xfd, 0x75, 0xb3, + 0x15, 0xd6, 0xa5, 0x3f, 0xf0, 0xcb, 0x87, 0x22, 0x3f, 0x9b, 0xff, 0x12, + 0xb8, 0x72, 0x31, 0xa7, 0xbc, 0xf8, 0x37, 0x93, 0x2e, 0xaf, 0x7f, 0x28, + 0x05, 0x71, 0xee, 0xf8, 0xdc, 0x9e, 0x8e, 0xa7, 0x0f, 0x3e, 0xaa, 0x26, + 0xe8, 0xcf, 0x05, 0xce, 0xea, 0xb6, 0x9f, 0x06, 0x6a, 0xbd, 0xeb, 0x3f, + 0x8e, 0xf3, 0x57, 0xd7, 0x15, 0x29, 0xac, 0xb2, 0x68, 0x1c, 0x76, 0x29, + 0xac, 0xb2, 0x22, 0xf7, 0x6d, 0x01, 0x54, 0xcb, 0x18, 0xb0, 0x90, 0x1a, + 0x60, 0x4e, 0xb7, 0xa5, 0xdb, 0xc7, 0x9f, 0x3d, 0x2f, 0x98, 0x2d, 0xae, + 0x2f, 0x5e, 0x1f, 0x5e, 0x7f, 0x7c, 0x5f, 0x15, 0x58, 0xeb, 0x0b, 0xc8, + 0x47, 0x77, 0x75, 0xb5, 0x99, 0x06, 0x6b, 0xa5, 0x95, 0x06, 0x6b, 0xa5, + 0x95, 0x06, 0x6b, 0x45, 0xee, 0x1b, 0x3e, 0x88, 0x61, 0x9a, 0x6d, 0xe5, + 0x75, 0xe5, 0xa5, 0x1a, 0x0c, 0xfe, 0xf0, 0xed, 0xca, 0xf3, 0x9d, 0x86, + 0xac, 0x83, 0xa7, 0x5e, 0x43, 0x5c, 0x5f, 0x9b, 0x2e, 0xe6, 0x55, 0x5e, + 0xfa, 0xd7, 0x73, 0x5c, 0x8c, 0x02, 0x6c, 0xcd, 0xbc, 0xf2, 0x4a, 0xe2, + 0x5c, 0x1a, 0xa8, 0x05, 0x3f, 0xb9, 0xd7, 0x72, 0xbe, 0xfa, 0x6f, 0x83, + 0xc1, 0xf3, 0x0d, 0xa4, 0x97, 0xd7, 0x77, 0xef, 0x18, 0x65, 0xef, 0x83, + 0x35, 0x40, 0x32, 0x32, 0x20, 0x80, 0xc5, 0x94, 0xae, 0x5c, 0x4c, 0xed, + 0xd9, 0x53, 0x58, 0x8b, 0x4a, 0x11, 0x20, 0x0a, 0x88, 0x26, 0x30, 0x2b, + 0x90, 0x96, 0x7a, 0x89, 0xd4, 0x56, 0x62, 0x5a, 0x25, 0x30, 0x61, 0xdb, + 0x7f, 0x29, 0x93, 0xef, 0xc9, 0xb3, 0xf9, 0x93, 0x0e, 0x1b, 0xee, 0xb0, + 0x00, 0x8b, 0x03, 0x55, 0x30, 0xb1, 0x70, 0xcf, 0xb8, 0x0a, 0xa8, 0x05, + 0xd0, 0x6a, 0xe2, 0x3c, 0x39, 0x8e, 0x03, 0xd8, 0x4b, 0xd5, 0x64, 0x68, + 0x7b, 0xe9, 0x30, 0xce, 0x99, 0xba, 0xb2, 0xdb, 0x67, 0x43, 0x00, 0x81, + 0x1c, 0xb9, 0x71, 0x05, 0x95, 0x47, 0xd5, 0xef, 0xf8, 0xee, 0xbb, 0x4c, + 0x9c, 0x9c, 0xc9, 0xf8, 0x71, 0x58, 0x3b, 0x04, 0xb7, 0xaf, 0xaf, 0x45, + 0x61, 0x41, 0xc1, 0xb5, 0x42, 0xc0, 0xd6, 0xd0, 0x52, 0x80, 0xe1, 0x18, + 0xa8, 0xb5, 0x5c, 0x5d, 0xf3, 0xbe, 0xbd, 0xab, 0xb9, 0xe9, 0x36, 0x65, + 0x6f, 0xe4, 0xd6, 0xd5, 0x8c, 0x2c, 0x83, 0x4a, 0x50, 0x57, 0x09, 0x21, + 0x5d, 0xd6, 0xd2, 0xe1, 0xc8, 0x4e, 0xac, 0x61, 0xec, 0x7e, 0x07, 0x99, + 0xeb, 0xf0, 0x74, 0x83, 0xa6, 0x88, 0x90, 0x1a, 0x38, 0xcb, 0xeb, 0xfc, + 0x0b, 0xf2, 0xce, 0x08, 0x4a, 0x43, 0x82, 0x26, 0x16, 0xb4, 0x1c, 0x86, + 0x8b, 0x31, 0xd8, 0xc0, 0x99, 0x16, 0xd8, 0xbd, 0x1d, 0xc2, 0x45, 0x6d, + 0xe0, 0x58, 0x0d, 0x24, 0xa2, 0x25, 0x00, 0x81, 0xeb, 0xe5, 0x15, 0x94, + 0x29, 0x55, 0x5e, 0xa7, 0xdf, 0x6b, 0xf1, 0x9f, 0xfe, 0x43, 0xc2, 0xc6, + 0x77, 0x3d, 0xf8, 0xf9, 0x54, 0x77, 0xda, 0xf9, 0x60, 0xb2, 0x2e, 0x1c, + 0xa9, 0x15, 0xeb, 0x06, 0xe0, 0x0d, 0x97, 0xbf, 0xca, 0x1f, 0x3c, 0xf9, + 0x1a, 0x18, 0xfb, 0x77, 0xa4, 0xcb, 0x81, 0xff, 0x8e, 0x82, 0xa3, 0xeb, + 0x8f, 0x60, 0xbe, 0xbd, 0x9b, 0xe9, 0xf7, 0x5a, 0x6f, 0x73, 0x75, 0xd2, + 0xe2, 0x41, 0x83, 0x2d, 0x78, 0xd8, 0x28, 0xb0, 0x55, 0x28, 0x1b, 0xa8, + 0x00, 0xee, 0x54, 0x0d, 0x50, 0xf9, 0xe0, 0xbf, 0x7d, 0x0b, 0x2a, 0x78, + 0x90, 0x2a, 0xff, 0x4f, 0x4d, 0xf8, 0x2c, 0x1e, 0x34, 0x22, 0xb0, 0x96, + 0xe7, 0x48, 0xf6, 0x3f, 0xb6, 0x2f, 0xe1, 0xa7, 0xdc, 0xe1, 0xe7, 0xeb, + 0x68, 0x96, 0x6c, 0xe0, 0x57, 0xdf, 0x3a, 0xcd, 0x76, 0x6c, 0xca, 0xda, + 0xa4, 0xe7, 0x7b, 0xcf, 0x41, 0x7e, 0x0d, 0x9c, 0x0a, 0xe6, 0xf8, 0xff, + 0xfe, 0x9b, 0x61, 0xfb, 0x34, 0xd1, 0xbb, 0xf5, 0x8b, 0x8b, 0x17, 0x50, + 0x0f, 0xd2, 0xf7, 0xf0, 0xc3, 0x01, 0x58, 0xeb, 0x16, 0x80, 0x7a, 0x00, + 0xd9, 0x2a, 0x02, 0xca, 0xfd, 0x96, 0x5b, 0xe0, 0x8b, 0x02, 0x7e, 0xba, + 0xeb, 0xdd, 0x80, 0xab, 0x7e, 0xa0, 0xb6, 0xdf, 0x7b, 0x83, 0xb2, 0x0d, + 0x11, 0x8b, 0x8e, 0x70, 0x2e, 0xf5, 0xa2, 0xc5, 0x0a, 0xac, 0xf5, 0x5d, + 0x02, 0xd0, 0x55, 0xa0, 0xa5, 0x17, 0x9d, 0x0b, 0x19, 0xf1, 0xed, 0x00, + 0xad, 0x7a, 0x90, 0x94, 0xad, 0xa9, 0xbf, 0x4e, 0x7e, 0xb7, 0x6a, 0x7e, + 0x43, 0xc8, 0x16, 0x0a, 0xe0, 0xa5, 0xc7, 0xd7, 0xd6, 0xe6, 0xd2, 0xea, + 0x66, 0x7b, 0xa6, 0x3e, 0xc0, 0xf0, 0x35, 0x37, 0x51, 0xf9, 0xdc, 0x0e, + 0x6c, 0xe0, 0xe8, 0xf1, 0xa3, 0x44, 0xa5, 0xfe, 0x67, 0xef, 0xa5, 0xb4, + 0x42, 0xbd, 0xff, 0xe5, 0xa1, 0x3c, 0xd5, 0xf1, 0xce, 0x6d, 0x82, 0x3d, + 0x0f, 0xed, 0x89, 0xd8, 0x0f, 0xe1, 0x73, 0x9a, 0x0d, 0x7b, 0xb5, 0xf1, + 0xd1, 0x91, 0x08, 0xb0, 0x35, 0x97, 0xf2, 0x6b, 0xd4, 0x03, 0x1c, 0x7a, + 0xbf, 0xea, 0x7f, 0x39, 0x8a, 0x03, 0x2e, 0x0c, 0xdf, 0x65, 0x62, 0x1c, + 0xcd, 0x53, 0x9d, 0xf0, 0x18, 0xbe, 0x4b, 0x01, 0xb7, 0xe6, 0x23, 0x37, + 0xe8, 0xbf, 0x3f, 0xf4, 0xb4, 0xc3, 0xea, 0xab, 0x6d, 0xdc, 0xe9, 0x06, + 0xd5, 0x9a, 0x0a, 0x5b, 0xed, 0x11, 0xac, 0xee, 0x2d, 0x50, 0x9d, 0xf0, + 0xf8, 0xe2, 0x9f, 0xfd, 0x3d, 0x00, 0x1f, 0xfd, 0xc8, 0xdc, 0x30, 0x67, + 0x11, 0xd4, 0x4f, 0x4f, 0x4e, 0xcc, 0x2b, 0x09, 0x09, 0xa0, 0x56, 0xa8, + 0xea, 0x83, 0x01, 0x78, 0x7c, 0xaa, 0xed, 0xd4, 0xf9, 0x29, 0x55, 0x37, + 0x3b, 0xe4, 0x9f, 0x82, 0x41, 0xd5, 0xe6, 0x2a, 0xe7, 0xca, 0x88, 0xd6, + 0x30, 0x43, 0x39, 0xa8, 0x21, 0x29, 0x18, 0x06, 0xde, 0x54, 0x01, 0x95, + 0x8b, 0x14, 0x09, 0xc8, 0x6e, 0x91, 0x7c, 0xe9, 0x62, 0x08, 0x8b, 0xa2, + 0xb1, 0x56, 0xf5, 0x53, 0x03, 0xbe, 0x3c, 0x94, 0x38, 0x36, 0x72, 0x16, + 0x7e, 0x50, 0xb6, 0x17, 0x7a, 0x0b, 0xd4, 0x67, 0x2c, 0xc2, 0x25, 0x1b, + 0x14, 0x80, 0xcb, 0xc3, 0x10, 0x26, 0x60, 0xe1, 0xb7, 0x7c, 0x8c, 0x9c, + 0x11, 0x03, 0xb5, 0x02, 0x19, 0xc2, 0x56, 0xdd, 0xbc, 0x3d, 0xfb, 0xf1, + 0x67, 0x14, 0x04, 0xb8, 0x74, 0x65, 0x89, 0x51, 0xb6, 0x51, 0xbe, 0x52, + 0xfd, 0xfe, 0x14, 0x5c, 0x6b, 0x5b, 0x14, 0x26, 0x04, 0x4d, 0xea, 0x5b, + 0xa1, 0x95, 0x71, 0xb2, 0x35, 0xbf, 0xfe, 0xbd, 0xc4, 0xf5, 0x4e, 0xbb, + 0x18, 0xbd, 0x1a, 0x68, 0x26, 0x18, 0x3f, 0x78, 0x7d, 0xc2, 0x24, 0xfb, + 0x9d, 0xa5, 0xdf, 0x8c, 0x01, 0x5a, 0x28, 0x50, 0xa9, 0xd1, 0x5b, 0xe8, + 0x0a, 0xd3, 0x02, 0xa8, 0x0c, 0x06, 0xcf, 0x37, 0x50, 0xb7, 0x3c, 0xbc, + 0x4e, 0x98, 0xbb, 0xb5, 0xbb, 0xe9, 0xe7, 0xea, 0x5d, 0xce, 0xcf, 0x66, + 0x47, 0x77, 0xff, 0xe3, 0xcd, 0x00, 0x03, 0x5c, 0xf7, 0xc1, 0x49, 0x8e, + 0x04, 0x9d, 0x50, 0xf3, 0xed, 0x37, 0x3b, 0x82, 0xf2, 0x1b, 0x6e, 0x5f, + 0x0f, 0xfd, 0xda, 0xc7, 0x81, 0xff, 0xaa, 0xf6, 0x87, 0xfb, 0x60, 0x6a, + 0x67, 0x32, 0xfe, 0x50, 0x2b, 0x99, 0x1f, 0xec, 0x2b, 0x9d, 0xce, 0x0b, + 0x01, 0x80, 0x75, 0xb2, 0xdb, 0x31, 0x0d, 0xf3, 0xe8, 0x37, 0x3b, 0x5f, + 0x89, 0x08, 0x36, 0xa2, 0xc6, 0x15, 0x67, 0xed, 0xcf, 0x4d, 0x81, 0x49, + 0x54, 0x3f, 0x80, 0x4c, 0x00, 0xb6, 0xa5, 0xec, 0x0c, 0xd0, 0x6a, 0x83, + 0x5d, 0xb5, 0x40, 0xce, 0xc4, 0x0b, 0xbf, 0x24, 0xd2, 0x24, 0x44, 0xca, + 0x66, 0x0a, 0x88, 0x95, 0xfe, 0xa2, 0x4a, 0xa3, 0x17, 0xeb, 0x61, 0x7d, + 0xe9, 0x83, 0x6c, 0x1f, 0x33, 0x0d, 0xf7, 0x7f, 0xd4, 0x90, 0xad, 0xf3, + 0x52, 0xaa, 0x1e, 0xae, 0x8f, 0x73, 0xb9, 0x39, 0xd4, 0x42, 0x22, 0xc1, + 0xb5, 0xa6, 0x17, 0x05, 0x69, 0x10, 0xdc, 0x92, 0x96, 0x1a, 0x43, 0xa4, + 0x25, 0xa2, 0x7b, 0x26, 0x21, 0x00, 0x93, 0xc5, 0x63, 0x61, 0x90, 0xec, + 0xc7, 0xf7, 0x00, 0x5a, 0x0a, 0x2a, 0x25, 0xc8, 0x2b, 0x18, 0x57, 0x04, + 0xf5, 0x4d, 0xb6, 0x5d, 0x46, 0x84, 0xe0, 0x90, 0x74, 0x91, 0x11, 0x90, + 0x4d, 0xd9, 0xcc, 0x07, 0x2d, 0x58, 0xd9, 0x52, 0xc3, 0x77, 0x22, 0xd8, + 0x97, 0xb9, 0xe4, 0x6f, 0x4c, 0xf4, 0x88, 0x44, 0x43, 0xd9, 0x83, 0x00, + 0xea, 0xa5, 0xc2, 0x44, 0x25, 0x7a, 0x10, 0x6f, 0x98, 0x0e, 0x7f, 0x96, + 0x3c, 0x11, 0xc0, 0x08, 0xfc, 0xfb, 0x39, 0x05, 0xba, 0x02, 0xf0, 0x7b, + 0x44, 0xd4, 0x8f, 0x74, 0xe8, 0xc8, 0xa1, 0x44, 0x59, 0x51, 0x7d, 0x26, + 0x58, 0xf0, 0xca, 0x8c, 0xf3, 0x71, 0x41, 0x9e, 0xf0, 0x4e, 0x11, 0x00, + 0x91, 0x93, 0x8d, 0x7a, 0x55, 0x17, 0x6a, 0xca, 0x26, 0x79, 0x01, 0x1e, + 0x6a, 0xac, 0x31, 0x4a, 0x23, 0x79, 0x05, 0xdd, 0xca, 0x15, 0x58, 0xd1, + 0x6a, 0xd2, 0xc8, 0x41, 0x25, 0x1c, 0xcf, 0x05, 0x76, 0x02, 0x1f, 0xa6, + 0x7d, 0x9c, 0x8b, 0x3f, 0x03, 0xe3, 0x23, 0xea, 0x59, 0xbf, 0xf8, 0xf2, + 0x39, 0x16, 0x5a, 0x0a, 0xce, 0xf4, 0x06, 0xb7, 0x87, 0x45, 0x57, 0x5f, + 0x43, 0xa5, 0x52, 0x89, 0x80, 0x4d, 0xf3, 0xd5, 0x39, 0xf7, 0xc5, 0x84, + 0xad, 0x4b, 0x78, 0x1b, 0x58, 0x04, 0x40, 0xad, 0xd9, 0x6d, 0xb9, 0x67, + 0x55, 0x27, 0xd7, 0x5b, 0x07, 0x93, 0x00, 0x2d, 0xab, 0x07, 0xfe, 0x69, + 0xe2, 0x0c, 0x4b, 0xcb, 0xfd, 0xb8, 0x67, 0xa7, 0xb1, 0x16, 0xf6, 0x76, + 0x0c, 0x7f, 0x49, 0xb4, 0x94, 0x86, 0x8a, 0xef, 0xf2, 0xcb, 0x2f, 0xe7, + 0xf9, 0xe7, 0x9f, 0x67, 0x64, 0x64, 0x84, 0xd3, 0x4f, 0x3f, 0xc5, 0x8b, + 0x2f, 0x9f, 0x63, 0x64, 0x64, 0x84, 0x17, 0x5e, 0x78, 0x81, 0xe7, 0x9f, + 0x7f, 0x3e, 0xf2, 0x1b, 0xfa, 0xbb, 0xfc, 0xf2, 0xcb, 0xb9, 0xec, 0xb2, + 0xcb, 0xa8, 0x54, 0x2a, 0x09, 0x37, 0xdd, 0xe6, 0xca, 0x94, 0x7b, 0x78, + 0xbd, 0xa1, 0x5d, 0xdd, 0x4d, 0xb7, 0x71, 0xce, 0x7d, 0x31, 0xba, 0xa7, + 0x23, 0x23, 0x23, 0x54, 0x2a, 0x95, 0xb6, 0xf8, 0x81, 0xc4, 0xb9, 0x91, + 0x11, 0xd5, 0xdf, 0x10, 0xa6, 0x9d, 0x97, 0x75, 0xbf, 0xe7, 0xe0, 0xe5, + 0xd8, 0xf6, 0x02, 0xeb, 0x52, 0x2e, 0xbb, 0xec, 0x32, 0x65, 0xf0, 0x5f, + 0xbf, 0x8b, 0xc1, 0x30, 0xfc, 0x59, 0x7c, 0x6f, 0xf4, 0x3c, 0x7c, 0xf3, + 0xe7, 0x0e, 0x62, 0x1b, 0x36, 0xc3, 0xcb, 0xd5, 0x39, 0xe7, 0x74, 0x95, + 0xfd, 0x87, 0x6b, 0x80, 0x60, 0xdc, 0xa9, 0xe2, 0x4a, 0x17, 0xcb, 0x11, + 0xec, 0x3f, 0x5c, 0xe3, 0x64, 0xbd, 0xca, 0x92, 0x62, 0x19, 0x57, 0xba, + 0x1c, 0x7c, 0xf6, 0x20, 0x76, 0xce, 0xe2, 0xd0, 0x44, 0x05, 0xeb, 0x2f, + 0xab, 0xc8, 0x1e, 0x81, 0xeb, 0x3b, 0xb8, 0x9e, 0x0f, 0x4f, 0x04, 0xfd, + 0x1b, 0x45, 0x93, 0x42, 0xd0, 0x17, 0xb8, 0xe4, 0x5a, 0xb8, 0xe1, 0xd6, + 0x51, 0x0e, 0x3c, 0x74, 0x90, 0x5d, 0x8f, 0x56, 0xd9, 0x70, 0x63, 0x99, + 0x75, 0x43, 0x36, 0x07, 0x9e, 0xaa, 0x61, 0x85, 0x7d, 0x13, 0x33, 0x3e, + 0xae, 0xeb, 0xb2, 0xfa, 0x9a, 0x12, 0xd2, 0x07, 0x72, 0x50, 0x7d, 0x56, + 0xbd, 0x23, 0xfe, 0xa4, 0x03, 0x33, 0x3e, 0x46, 0x9f, 0x4d, 0x61, 0x72, + 0x0c, 0xa7, 0xb7, 0x84, 0x61, 0xaa, 0x7a, 0x4a, 0xc3, 0x6f, 0x60, 0x05, + 0x75, 0x21, 0xb1, 0x50, 0x20, 0xcf, 0x06, 0x7d, 0x0c, 0x39, 0x03, 0x5a, + 0x41, 0x9d, 0x34, 0xec, 0xeb, 0x58, 0x60, 0x20, 0x67, 0x82, 0xf2, 0x22, + 0x1c, 0x2f, 0x0c, 0xca, 0x99, 0x30, 0x4b, 0x93, 0x52, 0x15, 0x11, 0xe1, + 0x16, 0x04, 0x8e, 0xef, 0x61, 0xf4, 0x18, 0x18, 0x39, 0x83, 0x82, 0x51, + 0x88, 0xce, 0x43, 0x90, 0xb7, 0xb7, 0xd4, 0x38, 0x72, 0xb8, 0x4f, 0x4e, + 0x22, 0x16, 0x18, 0xf8, 0x67, 0xfd, 0x84, 0x5f, 0x5d, 0x8d, 0x56, 0xdc, + 0x0e, 0x89, 0xc2, 0xb5, 0x04, 0xab, 0x57, 0xad, 0x86, 0x1c, 0x8c, 0x5e, + 0xbf, 0x16, 0x37, 0x00, 0x81, 0xb9, 0x9e, 0x83, 0x58, 0x40, 0x04, 0xd6, + 0x6a, 0x93, 0x0c, 0xee, 0xa1, 0x9e, 0x87, 0x07, 0xef, 0x74, 0x99, 0x37, + 0x46, 0xe0, 0xa7, 0x08, 0x20, 0xd5, 0x2f, 0xa0, 0xc3, 0xb0, 0xc4, 0x97, + 0xb9, 0x8f, 0xe7, 0x52, 0x27, 0xbe, 0xcc, 0x7d, 0x6c, 0xe1, 0x41, 0xe4, + 0xb8, 0xcf, 0xbe, 0xbe, 0x3d, 0x6d, 0x20, 0xaa, 0x9d, 0x77, 0xec, 0x64, + 0xf3, 0xe1, 0xcd, 0x91, 0xbb, 0x7d, 0x6b, 0x89, 0x91, 0xc9, 0x11, 0xfe, + 0xfa, 0xc4, 0x01, 0xde, 0xf2, 0xf6, 0x18, 0xa8, 0x15, 0x6e, 0x43, 0xa0, + 0x16, 0x28, 0xb8, 0xd6, 0xf8, 0xd7, 0xd5, 0x7e, 0x08, 0xdf, 0x7a, 0xf3, + 0xc5, 0x36, 0x67, 0xa9, 0x26, 0xe2, 0x70, 0x9f, 0x70, 0x10, 0x43, 0x06, + 0xd6, 0x22, 0x0b, 0xf7, 0xb4, 0x8b, 0x0c, 0x00, 0x5b, 0x11, 0xc0, 0x2a, + 0xbc, 0x0d, 0x5a, 0x98, 0xf9, 0x48, 0xb7, 0x21, 0xfa, 0x44, 0x04, 0xd4, + 0x0a, 0x25, 0x26, 0x03, 0x80, 0x66, 0x08, 0xd5, 0x0a, 0xb6, 0x72, 0xdc, + 0x87, 0x5f, 0x21, 0x82, 0x7e, 0x89, 0x3e, 0x11, 0xc5, 0x1b, 0x86, 0x97, + 0xe3, 0x3e, 0x6f, 0xbe, 0x58, 0xf5, 0x1d, 0xbe, 0xe9, 0x8d, 0x97, 0x45, + 0xd7, 0xf6, 0xd2, 0x2b, 0x4e, 0x02, 0x9c, 0xa5, 0x6f, 0x43, 0xf7, 0x10, + 0xb6, 0x15, 0xba, 0xbf, 0xfc, 0xfd, 0x17, 0x22, 0x38, 0x57, 0x2f, 0x6f, + 0x69, 0x7b, 0xa7, 0x33, 0x65, 0xca, 0x94, 0x29, 0x53, 0xa6, 0x4c, 0x99, + 0x32, 0x65, 0xca, 0x94, 0x29, 0x53, 0xa6, 0x4c, 0x99, 0x32, 0x65, 0xca, + 0x94, 0x29, 0x53, 0xa6, 0x4c, 0x99, 0x32, 0x65, 0xca, 0x94, 0x29, 0xd3, + 0xfc, 0x95, 0x41, 0xb5, 0x32, 0x65, 0xca, 0x94, 0x29, 0x53, 0xa6, 0x9f, + 0x00, 0xe9, 0xe0, 0xa9, 0xb4, 0xd2, 0x1f, 0x84, 0x77, 0xfa, 0x00, 0xbb, + 0x74, 0x45, 0x09, 0x3f, 0x05, 0x05, 0xd1, 0xc1, 0x37, 0x46, 0xaf, 0x11, + 0x7d, 0xac, 0x1e, 0xfa, 0xd3, 0xc3, 0x18, 0x86, 0x02, 0xe5, 0x94, 0x06, + 0x4a, 0xd4, 0x26, 0x6b, 0xc9, 0x8f, 0xc8, 0x7b, 0x8d, 0x04, 0x58, 0x0b, + 0x88, 0x60, 0x2e, 0x21, 0x58, 0x4b, 0x25, 0x08, 0x08, 0x80, 0x4e, 0x4d, + 0x0d, 0x7e, 0x20, 0x5b, 0x92, 0x83, 0x39, 0x18, 0x6d, 0xc1, 0x68, 0xe0, + 0xf6, 0xc5, 0x3f, 0xf9, 0x26, 0x1f, 0xfd, 0xf5, 0x77, 0x45, 0x7e, 0x9a, + 0xb2, 0x99, 0x48, 0xbf, 0x61, 0x18, 0x6d, 0xd7, 0xa3, 0x4b, 0xff, 0xd0, + 0xd8, 0xf5, 0x3a, 0x4f, 0x95, 0xea, 0x64, 0xc3, 0x30, 0x8c, 0xc4, 0x3d, + 0x98, 0x8f, 0xcc, 0x3e, 0x93, 0xc6, 0x4c, 0xfb, 0x44, 0xab, 0x6e, 0xf1, + 0x62, 0x1a, 0x9d, 0xdd, 0x03, 0xc9, 0x16, 0xea, 0xab, 0x6e, 0xd4, 0x07, + 0x79, 0xee, 0xb4, 0xda, 0x77, 0xa7, 0x9c, 0x08, 0xac, 0xe5, 0x4e, 0x39, + 0x10, 0xac, 0x4a, 0xec, 0x7a, 0xa7, 0x28, 0xe4, 0x0a, 0x9d, 0xc1, 0x31, + 0x39, 0xed, 0xa3, 0xf1, 0x56, 0x0c, 0xd6, 0x02, 0xb0, 0x7d, 0xb5, 0x3a, + 0xb3, 0x40, 0x20, 0x52, 0x8b, 0xfe, 0xda, 0x7d, 0x0a, 0xa6, 0xd5, 0xc8, + 0x09, 0xc8, 0x89, 0x68, 0xd2, 0xa3, 0x98, 0x91, 0x14, 0x4c, 0x83, 0x02, + 0x26, 0xee, 0x94, 0x1f, 0x4d, 0x0e, 0x28, 0xcd, 0x28, 0xa8, 0x95, 0xa9, + 0xdd, 0x36, 0x53, 0x9f, 0xbc, 0xef, 0x49, 0xec, 0x01, 0x33, 0x48, 0xaf, + 0xaf, 0x6a, 0x98, 0xa7, 0x55, 0x1a, 0xed, 0x5e, 0x83, 0x86, 0x2f, 0xdb, + 0xc3, 0x07, 0x70, 0x2d, 0xcf, 0x97, 0xea, 0x0a, 0x44, 0x00, 0xd4, 0x0a, + 0x64, 0x4c, 0xfa, 0x58, 0x7d, 0x06, 0x8d, 0x69, 0x1f, 0xa6, 0x93, 0x61, + 0x00, 0x84, 0xbe, 0xf0, 0xac, 0x14, 0x88, 0x1e, 0xb0, 0x67, 0x04, 0x0d, + 0x43, 0xd0, 0x98, 0x91, 0x58, 0xc1, 0x79, 0xab, 0x25, 0x40, 0xa8, 0x95, + 0x9d, 0xed, 0xba, 0xc4, 0x9f, 0x91, 0x88, 0x5c, 0x1e, 0xf1, 0x4c, 0x6c, + 0xa0, 0x20, 0xd5, 0x3d, 0x11, 0x9e, 0xc4, 0x0d, 0xbe, 0x52, 0xb7, 0xb4, + 0x0f, 0xfc, 0x2d, 0x4f, 0x7d, 0x98, 0x5e, 0xf2, 0xc1, 0x11, 0x42, 0x7d, + 0x14, 0x2b, 0xe7, 0xff, 0x71, 0xa6, 0x10, 0x66, 0x0c, 0xd4, 0x0a, 0x95, + 0x9a, 0x54, 0x3c, 0x17, 0x50, 0x0b, 0x14, 0x38, 0x6b, 0x3e, 0xea, 0xe4, + 0x2f, 0x04, 0x6b, 0x75, 0x73, 0x2f, 0x5d, 0x6d, 0x22, 0x5b, 0xb3, 0xff, + 0x76, 0x75, 0x0d, 0x2d, 0x1d, 0x6a, 0x73, 0x73, 0x26, 0x1d, 0x46, 0x6f, + 0x56, 0x6f, 0xb9, 0x3e, 0xb9, 0x42, 0x4a, 0x49, 0x6d, 0xa2, 0x1d, 0xa6, + 0x50, 0x30, 0x0a, 0x98, 0x0b, 0xcd, 0xb6, 0x3c, 0xee, 0xd0, 0xe1, 0x43, + 0xd8, 0x03, 0xed, 0xe9, 0x2d, 0x75, 0x81, 0x24, 0xe8, 0xb6, 0xc3, 0x77, + 0xc3, 0xf5, 0x5c, 0x56, 0xaf, 0x59, 0x9d, 0xf0, 0x27, 0xa5, 0xa4, 0x72, + 0xb4, 0x82, 0x35, 0x90, 0x5a, 0x6a, 0x1b, 0xd4, 0xaa, 0xc8, 0x9d, 0x6c, + 0xd7, 0x02, 0xdb, 0x73, 0xdc, 0x1a, 0xa7, 0xee, 0x50, 0x1a, 0x2c, 0x61, + 0xf4, 0x16, 0x31, 0x35, 0x53, 0x79, 0x91, 0x9c, 0xf4, 0x61, 0x4e, 0x9b, + 0x1c, 0xfc, 0x4b, 0x35, 0x81, 0x6f, 0xf4, 0x43, 0xa3, 0x51, 0x5e, 0x56, + 0xd6, 0xfc, 0xe8, 0x93, 0x52, 0x86, 0x87, 0x86, 0xd9, 0xf7, 0xc8, 0x3e, + 0xa4, 0x94, 0xec, 0x7b, 0x44, 0x4d, 0xf6, 0xdd, 0x74, 0xd7, 0xa6, 0xe8, + 0xfc, 0x86, 0x8f, 0xc5, 0xcb, 0xd1, 0x96, 0xaf, 0x2e, 0x53, 0x39, 0x5a, + 0xc1, 0x49, 0x51, 0x8a, 0xb6, 0xfc, 0xce, 0x96, 0x68, 0xdf, 0x7f, 0x68, + 0x2f, 0x46, 0xaf, 0xba, 0x98, 0x10, 0x24, 0xd6, 0x6d, 0x5f, 0x4a, 0x89, + 0x3f, 0xed, 0x9f, 0x97, 0xff, 0xf4, 0xb9, 0xd9, 0x14, 0x96, 0x7b, 0xaf, + 0x97, 0xff, 0x30, 0x4d, 0xfa, 0x35, 0x74, 0x93, 0x08, 0xca, 0x06, 0x39, + 0x4b, 0x59, 0x1c, 0x6a, 0x60, 0xb0, 0xfb, 0x44, 0x6f, 0x5d, 0x87, 0x51, + 0xa0, 0xa7, 0x95, 0x0c, 0xb0, 0x93, 0xc9, 0x36, 0x48, 0xd6, 0x24, 0xf0, + 0x00, 0x2b, 0x39, 0xc2, 0x11, 0x56, 0x06, 0x88, 0xa8, 0xf0, 0xd1, 0xad, + 0x24, 0x09, 0x97, 0x82, 0xd9, 0x21, 0x5b, 0x17, 0xa2, 0x55, 0xab, 0x56, + 0x31, 0x39, 0x91, 0x9c, 0x75, 0x3b, 0x1b, 0xfc, 0x2a, 0xbc, 0x96, 0x49, + 0x26, 0x13, 0x93, 0xeb, 0x74, 0x08, 0x58, 0xa7, 0xb0, 0x69, 0x48, 0x58, + 0xda, 0x4f, 0xa7, 0xeb, 0x4a, 0x43, 0xb4, 0xc2, 0xb8, 0x01, 0x8e, 0x04, + 0xf7, 0xb2, 0x13, 0x7c, 0x6c, 0x20, 0x75, 0xbc, 0x12, 0xf8, 0xab, 0x3b, + 0x15, 0x80, 0x6b, 0x00, 0xf8, 0x60, 0x00, 0xd8, 0x7a, 0x75, 0x62, 0x92, + 0xc1, 0xf3, 0x98, 0x07, 0x74, 0xc3, 0x51, 0xc9, 0x81, 0x15, 0x02, 0xc6, + 0xfe, 0x3e, 0x76, 0x3b, 0x0e, 0x52, 0x03, 0x4f, 0x5d, 0x18, 0x28, 0x4a, + 0x69, 0xfb, 0x3c, 0xec, 0x8c, 0xf4, 0xc6, 0xf9, 0xba, 0x33, 0xa3, 0x7e, + 0xa7, 0xd5, 0x29, 0x3f, 0x71, 0x6c, 0x18, 0x30, 0x6a, 0x68, 0xf9, 0xbf, + 0x56, 0x4e, 0xcf, 0x26, 0x3d, 0xce, 0x6e, 0xf1, 0xcf, 0x27, 0x8d, 0xaf, + 0x65, 0xb8, 0xa4, 0xce, 0x1f, 0xa8, 0x15, 0x95, 0x28, 0x73, 0x4c, 0x78, + 0x7b, 0x4d, 0xf5, 0x44, 0x30, 0x09, 0xea, 0xfd, 0x23, 0xdc, 0x25, 0x25, + 0xf4, 0xcc, 0x9e, 0xef, 0x58, 0xcb, 0x0c, 0x4e, 0x1d, 0xf6, 0x59, 0xbc, + 0x2a, 0xc8, 0x7f, 0x64, 0x0c, 0xf8, 0x72, 0x8e, 0xfa, 0x44, 0x53, 0x86, + 0xe7, 0x79, 0xf9, 0xe6, 0xb5, 0xeb, 0xf0, 0x9e, 0xec, 0x0c, 0x7a, 0x3a, + 0x2f, 0x7d, 0x25, 0x98, 0x64, 0x7e, 0xfd, 0x28, 0x1f, 0x9d, 0xc5, 0xdb, + 0x8e, 0xcf, 0x4a, 0x6a, 0x75, 0x97, 0x52, 0xd1, 0x8a, 0x8e, 0x43, 0x8d, + 0x9f, 0xd8, 0xc2, 0xea, 0x15, 0xab, 0xe7, 0xf4, 0x73, 0xbe, 0xb6, 0xd2, + 0xf1, 0x03, 0xd4, 0xea, 0x6e, 0x57, 0x3f, 0x1d, 0x35, 0x58, 0x20, 0x7f, + 0x65, 0x3c, 0x53, 0x2a, 0x7f, 0xa5, 0x80, 0x67, 0xe3, 0x3a, 0x7d, 0x41, + 0x14, 0xe0, 0x0d, 0x02, 0xbb, 0xdf, 0x22, 0x6c, 0x2e, 0xd8, 0xfd, 0x16, + 0xee, 0x8c, 0x64, 0xa8, 0xc7, 0xc2, 0x39, 0xa3, 0xfc, 0x6e, 0xfa, 0x44, + 0x0c, 0x4f, 0x13, 0x42, 0xe0, 0xd4, 0xd5, 0xfe, 0xda, 0x1b, 0x37, 0xf0, + 0xe1, 0x5f, 0x7e, 0x6f, 0x04, 0xb3, 0x02, 0xce, 0x6b, 0x3f, 0x84, 0x61, + 0x8d, 0x1f, 0xab, 0x31, 0xb2, 0xc2, 0x61, 0xdb, 0xa7, 0xb7, 0x51, 0x05, + 0x35, 0xab, 0xb3, 0x4c, 0x34, 0xbb, 0x73, 0xdb, 0xa7, 0x57, 0x53, 0x39, + 0x5a, 0xa1, 0xfa, 0x8c, 0x9f, 0x04, 0x67, 0xa5, 0x6c, 0xe9, 0xf6, 0x05, + 0x20, 0x3d, 0x89, 0x30, 0x93, 0xe5, 0x68, 0xe1, 0x34, 0x54, 0xa8, 0xcc, + 0x1a, 0x97, 0x53, 0x77, 0xa8, 0x1d, 0x3b, 0xca, 0x12, 0x63, 0x08, 0x69, + 0x0c, 0x21, 0x0c, 0x55, 0x5f, 0xbd, 0xe7, 0x97, 0x0f, 0xb2, 0xed, 0x2f, + 0x54, 0x5d, 0xc4, 0xfa, 0xc4, 0x26, 0x6e, 0xbb, 0xf5, 0x36, 0xf6, 0x3e, + 0xb4, 0x97, 0x7d, 0x87, 0x6b, 0x51, 0x7d, 0x66, 0xec, 0x93, 0xb0, 0xe1, + 0x4f, 0x55, 0x4d, 0xa7, 0x02, 0x2c, 0x31, 0x86, 0xd4, 0xb9, 0xa0, 0x8e, + 0x54, 0xbd, 0xef, 0x2e, 0x6e, 0xd8, 0x7b, 0x5f, 0x74, 0x9e, 0xbe, 0xd5, + 0xdc, 0xb4, 0xa6, 0x14, 0xd9, 0xfa, 0xc0, 0xd1, 0x71, 0xbe, 0x7a, 0x87, + 0xaa, 0xfb, 0x54, 0xfa, 0x56, 0xc3, 0xd4, 0x21, 0x96, 0x18, 0x43, 0x18, + 0x74, 0x87, 0xc0, 0xce, 0xa5, 0xf0, 0x97, 0x32, 0x5b, 0x8d, 0xe2, 0x7c, + 0x50, 0x08, 0x4d, 0x62, 0x00, 0x55, 0x1a, 0x48, 0x35, 0xdb, 0x2b, 0xac, + 0xcd, 0xc3, 0x3e, 0x6f, 0xb5, 0x2e, 0xee, 0x25, 0x9a, 0x4f, 0x77, 0x31, + 0xbc, 0xe9, 0x95, 0xb3, 0xb3, 0xc6, 0x33, 0x5f, 0xfd, 0x38, 0xae, 0x25, + 0xd4, 0x7c, 0x9e, 0x4b, 0x27, 0xf9, 0xc0, 0x6d, 0x77, 0x94, 0x18, 0x3f, + 0x0d, 0x6e, 0x4e, 0x52, 0x5a, 0x04, 0xbb, 0x3e, 0x7f, 0x80, 0xf2, 0xfb, + 0x46, 0xb0, 0x4a, 0x56, 0x62, 0xb2, 0x60, 0xb5, 0x5a, 0x43, 0xd2, 0xc4, + 0xba, 0x62, 0x09, 0xe5, 0x72, 0x5c, 0x03, 0xf7, 0x5c, 0x87, 0x43, 0x0f, + 0xed, 0x65, 0xfb, 0x5f, 0xac, 0x57, 0x3f, 0x7d, 0xd9, 0xe4, 0xfe, 0xdf, + 0x1b, 0x56, 0x93, 0xc7, 0x81, 0xe1, 0x6b, 0x60, 0xf3, 0x6f, 0xef, 0x62, + 0x78, 0xcd, 0x28, 0x66, 0xaf, 0x45, 0x5e, 0x87, 0x8a, 0x3f, 0x39, 0x1e, + 0xf8, 0x19, 0xc2, 0x99, 0xaa, 0x61, 0x2f, 0x2d, 0xe1, 0x3e, 0xe9, 0xb2, + 0xef, 0xbe, 0x7b, 0xf9, 0xc2, 0xa9, 0xbb, 0xb5, 0x94, 0xae, 0x60, 0xed, + 0x32, 0x70, 0x02, 0x9b, 0x0a, 0xa8, 0x75, 0x14, 0xbb, 0xbf, 0x88, 0x3d, + 0xb0, 0x18, 0xa7, 0xee, 0x60, 0x17, 0x6d, 0x2a, 0x28, 0xb0, 0xd6, 0xc8, + 0xcd, 0x71, 0x3e, 0x63, 0x2f, 0xb7, 0x71, 0x8e, 0x39, 0xac, 0x5b, 0xa6, + 0xe0, 0x3e, 0x0e, 0x0a, 0xa6, 0x05, 0x30, 0xb2, 0x4c, 0xf9, 0x59, 0xb7, + 0x0c, 0xb6, 0x1c, 0x0b, 0xdc, 0xeb, 0xaa, 0x7d, 0x62, 0xdb, 0xaa, 0x61, + 0x12, 0x82, 0xb6, 0x9c, 0x13, 0x63, 0xd8, 0x37, 0x5a, 0x78, 0xae, 0x4b, + 0xf9, 0xfa, 0xed, 0xb8, 0xc7, 0x76, 0x29, 0x80, 0x56, 0x34, 0x61, 0x3d, + 0x06, 0x83, 0xc8, 0xa0, 0x0f, 0xc1, 0x30, 0x9a, 0xc8, 0x99, 0x7c, 0x04, + 0x24, 0x13, 0x34, 0xd5, 0xff, 0x96, 0x04, 0x1c, 0x16, 0xf7, 0xc5, 0x13, + 0x52, 0x1b, 0x2d, 0x03, 0x05, 0x39, 0x20, 0x82, 0x15, 0x88, 0x70, 0xb2, + 0x6a, 0x2e, 0x39, 0x99, 0x54, 0xe6, 0x42, 0xa0, 0xd6, 0xfc, 0xf5, 0x6f, + 0x7f, 0xd0, 0x8e, 0xc0, 0xea, 0x05, 0xfe, 0x4d, 0xf7, 0x73, 0x5e, 0x16, + 0x5f, 0x3b, 0xfd, 0xe0, 0xc9, 0x57, 0x59, 0x1f, 0xec, 0xef, 0xfe, 0x31, + 0xa5, 0xe1, 0xc7, 0xa5, 0x97, 0x48, 0x82, 0xb4, 0xe6, 0x87, 0x16, 0x3a, + 0x7f, 0x55, 0xfe, 0xda, 0x63, 0x64, 0x29, 0x9c, 0xb2, 0x05, 0xde, 0x23, + 0x92, 0x0a, 0xb0, 0x0e, 0x55, 0x76, 0x6c, 0xff, 0x8c, 0xd9, 0x06, 0xc7, + 0x32, 0x6d, 0xc1, 0xa8, 0xad, 0xca, 0x42, 0x2f, 0x28, 0x32, 0x3c, 0x47, + 0xe2, 0x39, 0x1e, 0x20, 0x30, 0x6d, 0x95, 0xee, 0xb1, 0xdf, 0x4d, 0xa6, + 0xb8, 0x2a, 0xa0, 0xa1, 0xfd, 0x56, 0x6d, 0x92, 0x68, 0x2e, 0x07, 0x38, + 0xf8, 0x4f, 0xc9, 0x09, 0xfc, 0x37, 0x3d, 0x02, 0xfb, 0x6e, 0x86, 0xca, + 0x04, 0x1c, 0x7c, 0x46, 0xb9, 0x9d, 0xea, 0x23, 0xaa, 0x8f, 0x5f, 0xf2, + 0x03, 0xf8, 0x97, 0x6f, 0x9d, 0x83, 0x6b, 0xb7, 0x72, 0x64, 0xc1, 0xa7, + 0xf8, 0xd2, 0xa6, 0x8b, 0xe0, 0x96, 0x3a, 0x3c, 0x5c, 0xe4, 0x6b, 0x47, + 0x8a, 0x70, 0x3b, 0x7c, 0x61, 0x01, 0x7c, 0xe9, 0x57, 0x80, 0x3a, 0x2c, + 0x5f, 0xfe, 0x30, 0xf5, 0x7a, 0x9d, 0x9f, 0x99, 0xdc, 0x4a, 0x6d, 0x8e, + 0x3a, 0x7d, 0x64, 0x1b, 0xe0, 0x0d, 0xb1, 0xfb, 0x22, 0xe0, 0xf4, 0xa9, + 0xe4, 0xcc, 0xeb, 0xcf, 0xbc, 0x1d, 0x6a, 0x53, 0xea, 0x6f, 0x01, 0x24, + 0x01, 0x59, 0x0f, 0x03, 0xb7, 0x14, 0x93, 0xd4, 0x9a, 0x3a, 0x01, 0xd9, + 0x46, 0xa5, 0x35, 0xe1, 0x3f, 0xd4, 0x56, 0x14, 0x1c, 0xac, 0x58, 0x4c, + 0x38, 0xdf, 0xfe, 0x76, 0xa0, 0xff, 0x1c, 0xff, 0xf0, 0xff, 0xcc, 0x5e, + 0x27, 0x5e, 0x22, 0x6f, 0xa2, 0x66, 0x1c, 0x60, 0xf5, 0xa1, 0x12, 0xbb, + 0x76, 0xbb, 0x8c, 0x00, 0x62, 0xe9, 0x0a, 0x6a, 0x46, 0x95, 0xd5, 0x77, + 0x5a, 0x5d, 0x41, 0x5a, 0x00, 0x63, 0x4f, 0xa9, 0x0c, 0x7e, 0xf8, 0x8e, + 0x7d, 0x94, 0x5b, 0xff, 0xcc, 0x4d, 0xb7, 0x55, 0xa8, 0x7d, 0x70, 0x33, + 0xc3, 0xd7, 0x18, 0x14, 0xd8, 0xce, 0xd8, 0x53, 0x7e, 0x04, 0xc3, 0x0a, + 0x75, 0xdf, 0xf5, 0x5f, 0xe5, 0xae, 0xaf, 0x7c, 0x20, 0x11, 0x5e, 0xd7, + 0xf8, 0x13, 0x0d, 0x86, 0xde, 0x5f, 0xe8, 0x18, 0x36, 0xd4, 0xf0, 0x35, + 0xea, 0x9a, 0x4a, 0xff, 0x45, 0x30, 0x7e, 0x5c, 0xf5, 0x17, 0x6f, 0xfa, + 0x8b, 0xb8, 0x23, 0x68, 0xc7, 0x2f, 0xd7, 0x58, 0x7d, 0xb5, 0x9d, 0x00, + 0x67, 0xd5, 0x6e, 0x16, 0x8c, 0x3c, 0x22, 0xa9, 0x1d, 0x87, 0x6a, 0x5d, + 0xc5, 0x7b, 0xe8, 0x69, 0xf5, 0xc3, 0xb4, 0x34, 0xc0, 0x91, 0x3b, 0xdd, + 0xc0, 0xea, 0x2d, 0x44, 0x30, 0xad, 0x72, 0xd1, 0x88, 0xfc, 0xa7, 0x6d, + 0x86, 0xee, 0xdb, 0x6f, 0x55, 0x71, 0xef, 0x7f, 0xfa, 0xc2, 0xea, 0x46, + 0xd5, 0xcf, 0xcf, 0xbf, 0x8f, 0xfc, 0x87, 0xd5, 0x51, 0x76, 0x30, 0x84, + 0xea, 0x4f, 0x6c, 0xf8, 0x3e, 0xe4, 0x1a, 0xd0, 0x2a, 0xa2, 0x63, 0x94, + 0x7c, 0x79, 0x14, 0x8b, 0x12, 0x22, 0x67, 0x45, 0x60, 0x2d, 0xcb, 0x2c, + 0xd2, 0xf4, 0x7d, 0x7c, 0x09, 0x75, 0x7f, 0x3f, 0xa0, 0xa0, 0x59, 0x96, + 0x59, 0xc2, 0xaf, 0x3b, 0x90, 0x0b, 0x17, 0x1c, 0x49, 0xf6, 0xd5, 0x1b, + 0xc2, 0xc4, 0x97, 0x1e, 0xe0, 0x62, 0xe4, 0xca, 0xc1, 0x7e, 0x52, 0xb6, + 0x59, 0xa2, 0xaa, 0x41, 0x92, 0xef, 0x5e, 0xf3, 0x55, 0xee, 0x7d, 0x4c, + 0xfd, 0x46, 0x0e, 0x9e, 0xbe, 0x1f, 0xd8, 0xcc, 0xe8, 0xa2, 0xfb, 0x39, + 0x78, 0x7a, 0x73, 0xe4, 0x47, 0x22, 0x91, 0x52, 0xf5, 0x0f, 0x4b, 0x29, + 0x30, 0x44, 0xd4, 0xd5, 0x0f, 0x39, 0x89, 0x21, 0x44, 0xc7, 0xbc, 0x30, + 0x0d, 0xbd, 0xd2, 0xa1, 0x58, 0xe1, 0x36, 0xf4, 0xd3, 0x0d, 0x8e, 0x35, + 0x9f, 0x30, 0xdd, 0xe1, 0x5a, 0x32, 0x02, 0x6a, 0x45, 0xe0, 0x2c, 0x88, + 0x80, 0x5a, 0x21, 0x5c, 0x4b, 0x07, 0x6a, 0xf9, 0xbe, 0x8b, 0x11, 0xb6, + 0x33, 0x66, 0x9a, 0x88, 0x9e, 0xb9, 0xb1, 0xab, 0x45, 0xe0, 0x58, 0xb0, + 0x2d, 0x12, 0xc3, 0xb1, 0x8a, 0xda, 0xb6, 0x93, 0x1b, 0x29, 0xf7, 0x4e, + 0x6e, 0x9d, 0xfc, 0x02, 0x0c, 0x4c, 0x0e, 0xa8, 0x0e, 0xa1, 0x07, 0x06, + 0xe0, 0xe3, 0xaa, 0xe7, 0xe9, 0x7c, 0x40, 0x53, 0x47, 0x52, 0xdb, 0xd7, + 0x4a, 0xa1, 0xbd, 0x5f, 0x7b, 0x4b, 0xec, 0xf6, 0xa7, 0x02, 0xfa, 0x96, + 0xc3, 0x91, 0x63, 0xdd, 0xfd, 0xcf, 0xd7, 0xee, 0xeb, 0xa1, 0x1f, 0xd6, + 0xb6, 0xd1, 0x63, 0x20, 0xa5, 0x1f, 0xd5, 0x1d, 0xd3, 0x12, 0x39, 0xa1, + 0xf5, 0x7d, 0x77, 0xaf, 0x0b, 0x8a, 0x1c, 0x48, 0x04, 0x04, 0xa0, 0x92, + 0xd0, 0x5e, 0x37, 0xf0, 0x55, 0x68, 0xb3, 0x13, 0x5c, 0x0b, 0xe2, 0xf1, + 0xc0, 0x6e, 0xe7, 0x75, 0x37, 0x29, 0x25, 0x86, 0x91, 0x1c, 0xb3, 0x08, + 0xdd, 0xd4, 0xbe, 0xdf, 0xe6, 0x3f, 0x3e, 0x68, 0xb7, 0xd9, 0x69, 0x7c, + 0xf7, 0x42, 0xe0, 0x5a, 0xa5, 0x45, 0x2a, 0xff, 0xac, 0x9d, 0x1e, 0x3f, + 0xef, 0xb0, 0xaf, 0x95, 0xa2, 0x74, 0x77, 0x02, 0x9e, 0xe5, 0x84, 0x1a, + 0x1f, 0x96, 0x52, 0x8d, 0x7b, 0xa5, 0x7e, 0x03, 0x32, 0xe5, 0x3f, 0x1a, + 0x53, 0x68, 0xc9, 0xe8, 0xbe, 0xc9, 0x56, 0x3e, 0xba, 0x85, 0x9d, 0x20, + 0x56, 0x12, 0xc9, 0x90, 0x80, 0x43, 0x12, 0x46, 0x72, 0x50, 0x69, 0x89, + 0x44, 0x3b, 0xd5, 0x90, 0xcd, 0x60, 0x4c, 0x14, 0x20, 0xdf, 0x06, 0xd4, + 0x82, 0xce, 0x8b, 0x72, 0x28, 0xa8, 0x57, 0xf7, 0x7a, 0x6c, 0xb7, 0xdf, + 0x73, 0xa8, 0x30, 0xad, 0x66, 0x0f, 0x80, 0x50, 0x63, 0x90, 0xc1, 0xb9, + 0x0d, 0x77, 0x6d, 0x62, 0xd7, 0x7d, 0x3b, 0x54, 0x5b, 0x4b, 0xc0, 0xe8, + 0x9a, 0xb5, 0x54, 0x9f, 0xa9, 0xe2, 0xd6, 0x6a, 0xd4, 0x9e, 0x55, 0xed, + 0xb4, 0xb5, 0x37, 0xaf, 0xc5, 0x79, 0x64, 0x3f, 0xf1, 0x28, 0x57, 0x13, + 0x3f, 0x05, 0x13, 0x6b, 0xd2, 0x0c, 0xc0, 0x61, 0x4d, 0x10, 0xaa, 0x7d, + 0x5e, 0xc8, 0xa9, 0xb4, 0x35, 0x5a, 0x0a, 0x2a, 0xd6, 0x94, 0x4d, 0x36, + 0x00, 0xe3, 0xad, 0x66, 0x74, 0x2d, 0x7a, 0xc9, 0xb8, 0x71, 0xf6, 0xcb, + 0x48, 0x28, 0x84, 0x60, 0x5d, 0x08, 0x50, 0x2b, 0xd4, 0xe5, 0x97, 0x5f, + 0xce, 0xf7, 0xf8, 0x36, 0x6f, 0x70, 0x7b, 0xc0, 0x82, 0xef, 0xf1, 0xed, + 0x79, 0xd9, 0xb2, 0x16, 0xf6, 0x62, 0x2d, 0xec, 0x55, 0xe0, 0xac, 0xe0, + 0x9b, 0x03, 0x57, 0x1b, 0xe3, 0x3e, 0x51, 0x55, 0x60, 0xad, 0x6e, 0xd2, + 0x61, 0x57, 0x97, 0xbe, 0x69, 0x01, 0xe7, 0xdc, 0x17, 0xb9, 0xf4, 0x4d, + 0x0b, 0xa8, 0x54, 0x2a, 0x5c, 0xfa, 0xa6, 0x05, 0x5c, 0x7e, 0xf9, 0xe5, + 0xbc, 0xf0, 0xc2, 0x0b, 0x91, 0xfb, 0x8b, 0x2f, 0x9f, 0x8b, 0xfc, 0x85, + 0x70, 0xaa, 0xd3, 0xee, 0x8b, 0x09, 0x40, 0x56, 0x37, 0x9b, 0xcf, 0x3f, + 0xff, 0x3c, 0x97, 0xbe, 0x69, 0x41, 0xe4, 0x7e, 0xfa, 0xe9, 0xa7, 0x58, + 0x60, 0x5d, 0x1a, 0x01, 0xb5, 0x74, 0xbb, 0x40, 0x04, 0xd4, 0x0a, 0xfd, + 0xea, 0x30, 0xac, 0x73, 0xee, 0x8b, 0x91, 0x9d, 0x10, 0xe8, 0x75, 0xce, + 0x7d, 0x31, 0x82, 0x69, 0x5d, 0x7e, 0xf9, 0xe5, 0xf0, 0xf2, 0xf3, 0x51, + 0x7a, 0xf4, 0xb4, 0xeb, 0xf0, 0xb0, 0x48, 0x73, 0x8c, 0x69, 0xda, 0x86, + 0xcd, 0xda, 0x55, 0xc9, 0x71, 0xd1, 0xb5, 0xab, 0x4a, 0x14, 0x4c, 0xc1, + 0x96, 0x6d, 0x47, 0x81, 0x02, 0xf4, 0x81, 0x2b, 0x1d, 0x2c, 0xd3, 0xc0, + 0x95, 0x0a, 0x9c, 0x65, 0xe5, 0x6c, 0xd5, 0x57, 0x62, 0x82, 0x3b, 0x0d, + 0x9e, 0xe7, 0x50, 0x1a, 0xb0, 0x11, 0x42, 0xef, 0x5f, 0xb5, 0x18, 0xb2, + 0x05, 0x76, 0x31, 0x39, 0xce, 0xbb, 0x76, 0x45, 0x89, 0x5d, 0x8f, 0x56, + 0x19, 0xb2, 0x05, 0xc3, 0x05, 0x70, 0x25, 0xb8, 0x93, 0x0e, 0x36, 0x20, + 0x64, 0xf2, 0x37, 0xef, 0x4f, 0x3a, 0x98, 0x41, 0x3e, 0x61, 0x4b, 0x97, + 0x12, 0x06, 0x95, 0xb3, 0x05, 0xaa, 0xcf, 0x1e, 0x65, 0xf4, 0x1a, 0x1b, + 0xf7, 0x8c, 0xc0, 0xea, 0x97, 0xb8, 0xd3, 0x75, 0x1a, 0x03, 0x65, 0x98, + 0x86, 0xe1, 0x2b, 0xcb, 0xf8, 0xae, 0x87, 0xd5, 0x5b, 0xc0, 0x9d, 0x06, + 0x43, 0xc0, 0xd8, 0xd3, 0xa7, 0xa0, 0xe5, 0x63, 0x9f, 0xb5, 0x21, 0x07, + 0x35, 0xaf, 0x4a, 0x23, 0x68, 0x63, 0x2d, 0x19, 0xb0, 0x83, 0x05, 0x79, + 0x04, 0x62, 0x81, 0x40, 0x2c, 0x00, 0x71, 0x4e, 0x50, 0xb0, 0x2d, 0x6a, + 0x4e, 0x0d, 0x21, 0xc0, 0xee, 0xb5, 0x69, 0xc8, 0x06, 0x08, 0x81, 0xd9, + 0x6b, 0xe2, 0x23, 0x83, 0xc5, 0xd2, 0xc0, 0x58, 0x18, 0x7c, 0x77, 0x13, + 0x76, 0xc9, 0xe5, 0x80, 0x96, 0x40, 0x36, 0xc2, 0xf1, 0xf1, 0x18, 0x46, + 0x18, 0xda, 0x31, 0x4c, 0x0b, 0xd1, 0x52, 0xf7, 0xcd, 0xe8, 0x53, 0xe5, + 0x8a, 0x61, 0x09, 0x1c, 0xa7, 0x46, 0x69, 0xb0, 0xa4, 0xf0, 0x83, 0x39, + 0x28, 0x88, 0x3c, 0x4d, 0x01, 0x43, 0x43, 0x23, 0x58, 0xbd, 0x06, 0x85, + 0x9e, 0x02, 0x63, 0xc7, 0x15, 0x38, 0xbd, 0x10, 0x7c, 0x47, 0xd0, 0x98, + 0x9e, 0xbb, 0x2c, 0x09, 0x41, 0x4f, 0x21, 0x00, 0x4b, 0x8e, 0xfb, 0xd0, + 0x63, 0x31, 0x38, 0xf8, 0x36, 0x98, 0x50, 0xe0, 0x2c, 0x80, 0x2d, 0x83, + 0x0f, 0xb2, 0x7d, 0xe2, 0x0e, 0xb6, 0x0c, 0x3e, 0xc8, 0xc4, 0xc4, 0xb7, + 0x19, 0x1c, 0x7c, 0x1b, 0x13, 0x13, 0xdf, 0x06, 0x40, 0x0c, 0x19, 0x09, + 0xe8, 0x94, 0x9c, 0x92, 0x1c, 0x98, 0xdc, 0xc3, 0x58, 0xd5, 0x86, 0x2b, + 0x15, 0x90, 0x4a, 0xf4, 0x09, 0xdc, 0x27, 0x1c, 0xb0, 0x15, 0x0c, 0xea, + 0x9f, 0x27, 0x14, 0x10, 0x2f, 0xdc, 0xbe, 0x65, 0xb0, 0x9f, 0xc7, 0xbe, + 0xdc, 0x3e, 0x82, 0x18, 0x9e, 0x8f, 0xd4, 0x2f, 0x28, 0xf9, 0x36, 0x1b, + 0x56, 0x6d, 0x60, 0xe3, 0x83, 0x1b, 0x31, 0xa4, 0xc0, 0xf2, 0x2d, 0x86, + 0x73, 0x23, 0x8c, 0x3d, 0x5b, 0x61, 0xc3, 0x1d, 0xdb, 0xd9, 0x7c, 0x38, + 0xae, 0x97, 0x47, 0x60, 0xac, 0x21, 0x03, 0x39, 0xee, 0xf3, 0xdd, 0x9e, + 0x49, 0x7e, 0xde, 0x1c, 0xe0, 0x9d, 0x01, 0xc0, 0xeb, 0x6d, 0x4b, 0x7e, + 0x16, 0x20, 0x3a, 0xd6, 0xc3, 0xd1, 0x2f, 0x60, 0x2a, 0xbe, 0x2e, 0xd1, + 0x27, 0xb0, 0x7d, 0x9b, 0xe1, 0xf2, 0x08, 0x07, 0x9e, 0xd8, 0x03, 0xfd, + 0x22, 0x82, 0x67, 0x85, 0x5b, 0x1e, 0x78, 0x0f, 0xe2, 0xcb, 0xdf, 0x42, + 0x8e, 0xdf, 0x02, 0x43, 0x0f, 0xc7, 0x20, 0x2e, 0x1d, 0x5a, 0x76, 0x46, + 0x72, 0xe6, 0xdb, 0x27, 0x22, 0xa0, 0x16, 0x10, 0xc1, 0xb2, 0x5e, 0xfe, + 0xfe, 0x0b, 0x89, 0x74, 0x9c, 0x39, 0xa7, 0xfc, 0x75, 0x02, 0x6a, 0x85, + 0xc7, 0x2f, 0xbd, 0xe2, 0xd0, 0xbf, 0x60, 0x29, 0xf0, 0x62, 0xdb, 0xfd, + 0xcb, 0x94, 0x29, 0x53, 0xa6, 0x4c, 0x99, 0x32, 0x65, 0xca, 0x94, 0x29, + 0x53, 0xa6, 0x4c, 0x99, 0x32, 0x65, 0xca, 0x94, 0x29, 0x53, 0xa6, 0x4c, + 0x99, 0x32, 0x65, 0xca, 0x94, 0x29, 0x53, 0xa6, 0x4c, 0xf3, 0x57, 0x06, + 0xd5, 0xca, 0x94, 0x29, 0x53, 0xa6, 0x4c, 0x99, 0x7e, 0x5c, 0x5a, 0x03, + 0x4d, 0xc6, 0xc8, 0x6b, 0xd3, 0xb3, 0x84, 0x10, 0x09, 0x60, 0x48, 0xf8, + 0x81, 0x6f, 0xf4, 0x51, 0x78, 0x17, 0xa8, 0x49, 0xc3, 0x6b, 0x87, 0x3e, + 0x01, 0x11, 0x48, 0x44, 0x87, 0x76, 0x85, 0xb6, 0xdc, 0xa9, 0xf8, 0x03, + 0xc7, 0xf0, 0xa3, 0x72, 0xb3, 0x68, 0x62, 0x17, 0x6d, 0x0e, 0x7d, 0xed, + 0x90, 0x4a, 0x4b, 0xe0, 0xd7, 0xea, 0xb3, 0x22, 0xb0, 0x96, 0x3b, 0xdd, + 0xa0, 0x31, 0xdd, 0x88, 0xc0, 0x5a, 0x85, 0xde, 0x42, 0x02, 0x30, 0x65, + 0xf6, 0xb5, 0x03, 0x7d, 0x4c, 0xd3, 0x84, 0xab, 0x47, 0xb1, 0xeb, 0xbb, + 0x91, 0x80, 0x7d, 0xdf, 0xbb, 0xf8, 0x66, 0xe5, 0x9b, 0x7c, 0xe0, 0x97, + 0x3f, 0x80, 0x94, 0x92, 0xbc, 0xc8, 0x93, 0x37, 0xd5, 0x47, 0xbf, 0x51, + 0xda, 0x0d, 0x23, 0x01, 0xa4, 0xd1, 0xe3, 0x48, 0x03, 0xad, 0xba, 0xc1, + 0xb2, 0x74, 0xf8, 0x96, 0xae, 0xbc, 0xa9, 0xec, 0xea, 0xf1, 0xe9, 0x71, + 0xa5, 0x21, 0x5f, 0x85, 0x9e, 0x02, 0xde, 0x1c, 0x53, 0x03, 0xc3, 0xb8, + 0x1c, 0x9a, 0xea, 0xb9, 0xae, 0x19, 0x86, 0xdf, 0x50, 0xe7, 0x16, 0x2f, + 0x37, 0x60, 0xbd, 0x03, 0xf7, 0xa9, 0x7b, 0x16, 0x4e, 0x56, 0x75, 0x53, + 0x1f, 0x3c, 0x46, 0x60, 0x2d, 0x0d, 0xa8, 0x05, 0xc1, 0x24, 0xd7, 0x60, + 0x55, 0xd4, 0x50, 0x72, 0x46, 0x2a, 0x3b, 0x61, 0x9a, 0xb5, 0x5a, 0x9d, + 0xf4, 0x25, 0x6e, 0xf8, 0x81, 0x7b, 0xea, 0x9b, 0x4a, 0xcb, 0x54, 0x90, + 0xab, 0xf4, 0x47, 0xef, 0xbe, 0x54, 0xd7, 0xeb, 0xa6, 0xef, 0x61, 0x9f, + 0x01, 0x2d, 0x28, 0x18, 0x42, 0x85, 0x4b, 0xc9, 0x9f, 0xf6, 0xb1, 0x07, + 0x4c, 0x05, 0xd3, 0x4a, 0xc9, 0x0e, 0x26, 0xed, 0x77, 0x0b, 0xeb, 0xf9, + 0x8d, 0x08, 0xa0, 0xe0, 0x78, 0x32, 0x9e, 0xa8, 0x9b, 0x53, 0xe9, 0xec, + 0x26, 0xdf, 0x97, 0xd8, 0x45, 0x23, 0x0a, 0x27, 0x3a, 0xd4, 0x68, 0xa3, + 0x89, 0xc1, 0xda, 0x04, 0x61, 0x39, 0xa3, 0xc2, 0x39, 0xf5, 0xf3, 0x9b, + 0x30, 0x26, 0x72, 0x2a, 0xce, 0xf0, 0x12, 0x04, 0x22, 0xbe, 0xad, 0xeb, + 0x1d, 0x16, 0x63, 0xc3, 0xd1, 0xc0, 0x66, 0x87, 0xf7, 0xda, 0xe8, 0xc9, + 0xe3, 0xcf, 0x74, 0x98, 0x08, 0x18, 0xac, 0x5a, 0x7b, 0x3e, 0x53, 0xc7, + 0xfd, 0x99, 0xd9, 0x7f, 0x87, 0x73, 0x9d, 0x37, 0x7a, 0xcc, 0x2e, 0x7e, + 0x4c, 0xdc, 0x29, 0x97, 0x82, 0xd1, 0x1d, 0xea, 0x95, 0x88, 0x67, 0x0e, + 0xf8, 0x50, 0x7a, 0xb5, 0xf2, 0x30, 0xff, 0x48, 0xef, 0x43, 0xe7, 0x15, + 0xda, 0xe5, 0x4c, 0x72, 0x35, 0xf8, 0xd9, 0xa0, 0x48, 0x7a, 0x5a, 0xd4, + 0x2a, 0xdd, 0xf1, 0xbb, 0xdc, 0x71, 0xe5, 0x74, 0xbf, 0x11, 0x5d, 0x67, + 0x78, 0x5e, 0xb6, 0x64, 0x04, 0x1e, 0x8c, 0xc2, 0x86, 0x93, 0xc3, 0xfd, + 0x06, 0x18, 0xc4, 0xef, 0x75, 0x30, 0x5b, 0x5a, 0x7f, 0xaf, 0x4b, 0x8b, + 0x4a, 0x38, 0x67, 0x1c, 0x6a, 0x4f, 0xb4, 0xc3, 0xc3, 0x74, 0x95, 0xaf, + 0x2a, 0x53, 0xbe, 0xaa, 0xcc, 0x92, 0xf2, 0x12, 0x6a, 0xcf, 0xd6, 0x22, + 0xc0, 0x96, 0x2e, 0x3d, 0x1d, 0x4b, 0xae, 0x5a, 0x82, 0xd5, 0x67, 0x31, + 0xfa, 0xa1, 0x51, 0x0e, 0x3d, 0x71, 0x08, 0x80, 0x1d, 0xf7, 0xed, 0xe8, + 0x6a, 0x3f, 0x84, 0x91, 0x8d, 0x5e, 0x3f, 0xca, 0xc1, 0x00, 0x8c, 0xb2, + 0xfd, 0xb3, 0xdb, 0xa3, 0xf3, 0xf7, 0xed, 0xb8, 0x8f, 0xda, 0x33, 0x35, + 0xfc, 0x73, 0xea, 0x9e, 0x85, 0xa0, 0x44, 0x19, 0xfc, 0xa2, 0xed, 0x7e, + 0x1b, 0xff, 0xac, 0xaf, 0xc0, 0x88, 0x12, 0x6a, 0x93, 0xed, 0xd7, 0x13, + 0x02, 0x1b, 0x8b, 0xa6, 0x99, 0xc8, 0x5e, 0x4c, 0xb3, 0x33, 0xf4, 0x2d, + 0xf4, 0x9f, 0x3e, 0x3f, 0x97, 0xff, 0xf9, 0xda, 0x0f, 0xc3, 0x74, 0x3a, + 0x3f, 0x5b, 0x1c, 0x22, 0x07, 0x46, 0x6f, 0xa7, 0x34, 0xc9, 0xb6, 0xf7, + 0xba, 0xf4, 0xee, 0x37, 0xc3, 0x86, 0x09, 0xb8, 0xbf, 0xc0, 0xe7, 0xef, + 0xbc, 0x33, 0x11, 0x66, 0x60, 0xd5, 0x2a, 0x56, 0xad, 0x5a, 0xd5, 0x35, + 0x6d, 0x93, 0x1a, 0x04, 0x6a, 0x40, 0x03, 0x6c, 0x0d, 0x00, 0x3b, 0x39, + 0x12, 0x41, 0xa0, 0x06, 0x34, 0x2c, 0xd5, 0x40, 0x00, 0xaf, 0xea, 0x06, + 0xaa, 0x7a, 0x75, 0x96, 0xf8, 0x42, 0x1d, 0x09, 0xd2, 0xf9, 0xaa, 0x96, + 0xbe, 0xc3, 0x87, 0x0f, 0x73, 0xf8, 0xf0, 0x61, 0x2e, 0x3a, 0x7c, 0x58, + 0xc5, 0xf3, 0xb1, 0x8f, 0x01, 0x31, 0xc4, 0x0b, 0x92, 0xf0, 0xab, 0x95, + 0xda, 0xfe, 0x24, 0x31, 0xd0, 0x2a, 0xad, 0x01, 0x6d, 0x9b, 0x06, 0x81, + 0xe9, 0xc7, 0x93, 0x1d, 0xdc, 0x43, 0x30, 0x56, 0x37, 0xbf, 0xd1, 0xf5, + 0x04, 0x2e, 0x93, 0xa9, 0xf3, 0x3a, 0xd0, 0x2b, 0xdc, 0x3f, 0xf2, 0x87, + 0x7f, 0xc8, 0xab, 0x13, 0x93, 0x7c, 0xec, 0xce, 0x38, 0xbe, 0x01, 0x62, + 0xc0, 0x56, 0x02, 0xa8, 0xb5, 0x61, 0x82, 0x12, 0x83, 0x50, 0x51, 0xcf, + 0x7a, 0xf1, 0x22, 0xe0, 0xb8, 0x03, 0x85, 0x38, 0x0f, 0x97, 0x77, 0xbf, + 0x8b, 0x0f, 0x74, 0xb8, 0xee, 0x1f, 0x95, 0x46, 0x7a, 0x4d, 0x9c, 0x19, + 0x1f, 0xbb, 0xc7, 0xc0, 0x30, 0x80, 0x19, 0xa8, 0x4c, 0x27, 0xf3, 0xf1, + 0x92, 0x61, 0x50, 0x9d, 0xf2, 0x29, 0xf7, 0xa9, 0xad, 0x13, 0xe4, 0x9f, + 0x07, 0x27, 0x5f, 0x2f, 0xac, 0xc1, 0xeb, 0xaf, 0xc6, 0x33, 0x15, 0x10, + 0x16, 0x4c, 0x6b, 0x60, 0xa0, 0xd6, 0xdc, 0xe5, 0x77, 0x57, 0xa0, 0xd6, + 0x71, 0x87, 0xc5, 0xcb, 0x6c, 0x78, 0x4e, 0x1d, 0x2e, 0x36, 0xf3, 0xf0, + 0xec, 0xa9, 0xc4, 0xb3, 0xbe, 0x60, 0x3d, 0x54, 0x81, 0x5b, 0x47, 0xa0, + 0x68, 0x2b, 0xb8, 0xd6, 0xfb, 0x47, 0xe2, 0x73, 0x87, 0x0f, 0xc5, 0xfb, + 0xd3, 0x1e, 0xf4, 0x25, 0xe3, 0x3b, 0x75, 0x38, 0x79, 0x4d, 0xf9, 0xf3, + 0xa5, 0xc9, 0xbc, 0x96, 0xfa, 0xd4, 0x1e, 0xf8, 0xf4, 0x3a, 0x18, 0xb0, + 0x15, 0x5c, 0xeb, 0xfa, 0xd1, 0xf8, 0xdc, 0x57, 0xf4, 0xf2, 0x2a, 0x86, + 0x56, 0xd6, 0xea, 0x5d, 0x20, 0xb3, 0x9a, 0xe6, 0xe3, 0x67, 0x3e, 0xfe, + 0xe6, 0x6b, 0x87, 0x67, 0x4f, 0xb1, 0xf8, 0xca, 0xc5, 0x10, 0xd4, 0x4d, + 0xa3, 0xf2, 0x7a, 0x9b, 0xa5, 0x66, 0x30, 0x86, 0xf5, 0x0b, 0x6d, 0x5f, + 0x4a, 0xa9, 0x20, 0xac, 0x0b, 0x00, 0x24, 0xfe, 0x59, 0x6d, 0x62, 0x94, + 0x0f, 0x96, 0x21, 0xd0, 0xab, 0xc8, 0x4e, 0x5d, 0x12, 0x57, 0x2f, 0x24, + 0xe1, 0x4c, 0xb5, 0xfa, 0x19, 0x87, 0xfb, 0x77, 0x7d, 0x01, 0x80, 0xcd, + 0x1b, 0x6e, 0x9f, 0x5f, 0x7a, 0x53, 0x0a, 0x61, 0x58, 0xf7, 0x7e, 0x6a, + 0x17, 0x00, 0x43, 0xcb, 0x93, 0x13, 0xdc, 0x8e, 0x1e, 0x3b, 0x8a, 0xa0, + 0xbd, 0x7c, 0xd3, 0x21, 0x5a, 0xb3, 0xda, 0xf7, 0x1a, 0x08, 0x33, 0xa8, + 0x07, 0xf9, 0x0d, 0x90, 0x50, 0x78, 0x06, 0x76, 0x1d, 0xbb, 0x07, 0x0f, + 0x58, 0xb1, 0x7c, 0x45, 0x22, 0x2e, 0x73, 0x60, 0xb4, 0xdd, 0x86, 0xdf, + 0x88, 0xc1, 0x5a, 0xbf, 0xb8, 0x8f, 0x6d, 0x7f, 0x7d, 0x13, 0xee, 0xe7, + 0x76, 0x50, 0xbd, 0xaa, 0x8c, 0xfb, 0xb9, 0x1d, 0xd0, 0xb7, 0x1a, 0x39, + 0x23, 0x11, 0xbd, 0xea, 0x26, 0xed, 0x18, 0x95, 0x6c, 0x3a, 0xa8, 0xb5, + 0x63, 0xa4, 0x04, 0x29, 0x23, 0x1b, 0x95, 0xb5, 0x1b, 0x19, 0xd9, 0xbf, + 0x53, 0x9d, 0x14, 0x22, 0x69, 0xeb, 0xaa, 0x51, 0xde, 0xfb, 0xb9, 0xbd, + 0xfc, 0xcd, 0x27, 0x6e, 0x6b, 0xbf, 0x98, 0x54, 0x79, 0x3d, 0xf2, 0xe6, + 0x12, 0xbf, 0x34, 0x01, 0xbf, 0x3d, 0xbf, 0xea, 0xec, 0x8f, 0x54, 0xaf, + 0x05, 0x74, 0x2a, 0xd4, 0xf7, 0x80, 0x9f, 0xbe, 0x78, 0x21, 0xff, 0x6f, + 0x00, 0xd2, 0xfa, 0x0f, 0x17, 0x2f, 0xe4, 0xc5, 0x57, 0xce, 0x72, 0xe9, + 0x6b, 0x64, 0x7f, 0x2e, 0xbd, 0x96, 0xd7, 0x32, 0x5f, 0xfd, 0xd2, 0x04, + 0x30, 0x58, 0x62, 0x6f, 0xf0, 0x1e, 0xa6, 0xcb, 0xeb, 0xa3, 0x4f, 0x40, + 0xf9, 0xfd, 0x50, 0x7b, 0xa6, 0x89, 0x5b, 0xf3, 0x19, 0x59, 0x73, 0x03, + 0x00, 0xa5, 0xab, 0x6c, 0x6a, 0xc7, 0xe2, 0x49, 0x69, 0xe5, 0x2b, 0xcb, + 0xb8, 0xcf, 0x9d, 0xc4, 0x34, 0x8d, 0xa8, 0x1d, 0xb0, 0x64, 0x15, 0x1c, + 0xda, 0x0b, 0xab, 0x6f, 0xbd, 0x8d, 0x83, 0xbb, 0x6b, 0x14, 0x87, 0x96, + 0xb0, 0xa4, 0xdc, 0xe4, 0xc0, 0x57, 0x9a, 0x0c, 0xaf, 0xc9, 0x33, 0x76, + 0x1c, 0xbc, 0xe7, 0x5c, 0x46, 0x7f, 0x73, 0x03, 0xde, 0xb4, 0xcb, 0xf0, + 0x8d, 0x82, 0xb1, 0x47, 0x25, 0x79, 0x21, 0xb0, 0xfa, 0x2d, 0x9c, 0x27, + 0x15, 0x50, 0x0b, 0xc0, 0x5e, 0x5a, 0x62, 0x68, 0x19, 0x8c, 0xd7, 0x2d, + 0x6e, 0xfa, 0xc4, 0x26, 0xf6, 0x6f, 0x0b, 0x80, 0x29, 0xd7, 0x5a, 0xac, + 0x58, 0x06, 0x7b, 0x1f, 0x11, 0xac, 0xb8, 0x15, 0xc6, 0x1f, 0xcd, 0xb3, + 0x7f, 0xf2, 0x14, 0x23, 0x2b, 0x56, 0xe3, 0x4c, 0x9e, 0x62, 0xe8, 0xc6, + 0x26, 0xce, 0x36, 0xd5, 0x5e, 0xb4, 0xfb, 0x8b, 0x38, 0x8c, 0x29, 0xc0, + 0xd6, 0xd1, 0x43, 0x8c, 0xdc, 0xbc, 0x82, 0x91, 0xa1, 0x26, 0x95, 0xba, + 0x4d, 0x53, 0x36, 0xa9, 0x3c, 0x96, 0x87, 0x62, 0x0c, 0xd3, 0x02, 0xa8, + 0x3c, 0x42, 0x04, 0xe5, 0x02, 0x18, 0xb9, 0x19, 0xf6, 0x6c, 0x23, 0x3a, + 0x76, 0x9c, 0x1a, 0x5f, 0xd8, 0xbd, 0x82, 0xdb, 0xd7, 0x83, 0x73, 0x06, + 0x4a, 0x36, 0xb8, 0xc7, 0x54, 0x1e, 0x23, 0x7a, 0x00, 0x19, 0x4f, 0x14, + 0x97, 0x2d, 0xe5, 0x26, 0x34, 0x37, 0xf5, 0xd0, 0x9b, 0x0a, 0x6e, 0x90, + 0x2a, 0x5f, 0xb5, 0x96, 0x31, 0xf9, 0x9c, 0xc4, 0x17, 0x01, 0x70, 0x2b, + 0x02, 0x81, 0x07, 0x27, 0x53, 0xe1, 0x0a, 0xad, 0x18, 0xd4, 0x26, 0x5b, + 0x5a, 0x7f, 0x56, 0x58, 0x5e, 0x9f, 0x56, 0x87, 0xfa, 0x7b, 0x7d, 0xfe, + 0x98, 0xcd, 0xd9, 0xf5, 0xd3, 0xbc, 0xf6, 0x36, 0x01, 0x6e, 0x0d, 0xb6, + 0x0f, 0xbd, 0x0e, 0xb6, 0x7f, 0x92, 0x34, 0x86, 0xaa, 0x56, 0xbd, 0x07, + 0x05, 0x20, 0x30, 0x39, 0x3f, 0xa0, 0x56, 0xfa, 0xbd, 0xd6, 0xdb, 0x5c, + 0xdf, 0x1b, 0x84, 0x4b, 0x26, 0x60, 0x44, 0x2b, 0xee, 0x2a, 0x4f, 0x83, + 0xbc, 0x5a, 0xc5, 0xb1, 0xba, 0xa8, 0x6a, 0x23, 0xeb, 0xd6, 0xdb, 0xd4, + 0x9e, 0x72, 0x18, 0xdb, 0xeb, 0x51, 0xf1, 0xe0, 0x12, 0xe0, 0xc3, 0x26, + 0x9c, 0x5c, 0xa6, 0xca, 0x9c, 0x25, 0xc7, 0x25, 0xf2, 0x36, 0x93, 0xc5, + 0xf8, 0x9c, 0x9a, 0xf0, 0x31, 0x6d, 0xc1, 0x92, 0x47, 0x24, 0x14, 0x25, + 0x27, 0x6d, 0x01, 0xb6, 0x60, 0x64, 0x4a, 0x52, 0xf1, 0xe0, 0x67, 0xdf, + 0xfb, 0x0e, 0xbe, 0xf4, 0xd5, 0x73, 0x8c, 0x08, 0x87, 0x42, 0x00, 0xd6, + 0xba, 0xa1, 0x08, 0x07, 0xea, 0x2a, 0xfe, 0x25, 0x45, 0x58, 0xb7, 0x1e, + 0x36, 0x7c, 0x12, 0xb6, 0xf7, 0x38, 0x34, 0xea, 0x0a, 0xe8, 0x75, 0x43, + 0x11, 0x4e, 0xd6, 0x15, 0x50, 0xcb, 0xf7, 0xa0, 0xd4, 0x0b, 0x56, 0x0e, + 0x0e, 0xae, 0xb5, 0xe1, 0x19, 0x87, 0xd1, 0xab, 0x62, 0xd0, 0xd6, 0x07, + 0xeb, 0x5b, 0x79, 0xee, 0x59, 0x58, 0x2f, 0x60, 0x64, 0x79, 0x91, 0x0f, + 0x1f, 0xab, 0xf3, 0xbe, 0xad, 0x45, 0xfe, 0xdc, 0x83, 0x4b, 0x3c, 0x60, + 0x2b, 0xac, 0x5f, 0x04, 0x23, 0xe6, 0x2d, 0x7c, 0xae, 0x0e, 0x7b, 0x8a, + 0xd0, 0xd6, 0x22, 0x2f, 0xc2, 0xbe, 0xdb, 0x6c, 0xf6, 0xec, 0x56, 0xf9, + 0x4b, 0xc5, 0x83, 0x11, 0xd3, 0x06, 0x1c, 0x2a, 0x1e, 0x7c, 0xef, 0x0d, + 0xe9, 0x00, 0x4a, 0xef, 0x7a, 0x73, 0x9c, 0x8e, 0x52, 0xc0, 0x04, 0x7b, + 0x78, 0x2b, 0xdc, 0xb2, 0x95, 0x08, 0xf0, 0x05, 0x28, 0x4a, 0xcd, 0xc3, + 0x5a, 0xc0, 0x7a, 0x6a, 0x3f, 0x3a, 0x57, 0x8c, 0xdd, 0x1f, 0x26, 0x02, + 0x6f, 0x3d, 0xbc, 0x15, 0xfe, 0x4e, 0x40, 0x69, 0x0a, 0x98, 0x42, 0xe5, + 0x01, 0xe9, 0x36, 0x97, 0xd6, 0x97, 0xb2, 0x67, 0x22, 0x09, 0x85, 0x3d, + 0x34, 0x7d, 0x3f, 0x85, 0xf7, 0x03, 0x4f, 0x11, 0x01, 0xb5, 0x42, 0xf8, + 0x95, 0x0e, 0xc1, 0x6a, 0xdb, 0xbf, 0x66, 0x24, 0x0a, 0xa7, 0x6b, 0xfc, + 0x89, 0x46, 0xc2, 0xef, 0x8e, 0xa7, 0xde, 0x45, 0x37, 0x8d, 0x3d, 0xe5, + 0x33, 0x7c, 0x8d, 0xc1, 0xf8, 0x13, 0x8d, 0x8e, 0x61, 0xc3, 0xf3, 0x43, + 0xcb, 0x0a, 0x11, 0x4c, 0x2b, 0xdc, 0x0f, 0xfb, 0x8f, 0x00, 0x86, 0xef, + 0x32, 0x39, 0x74, 0x5f, 0x0c, 0xbf, 0x02, 0x28, 0x3d, 0x22, 0xa9, 0x68, + 0x0f, 0x53, 0x07, 0x64, 0x95, 0x07, 0xd5, 0x0f, 0x3d, 0x84, 0x6c, 0x85, + 0xee, 0x40, 0x14, 0x3e, 0x0d, 0xd4, 0x0a, 0xb5, 0xf6, 0x6a, 0x1b, 0xe7, + 0x7a, 0xd8, 0xf5, 0x91, 0x0b, 0x87, 0x8d, 0xbe, 0xa6, 0x4a, 0xd5, 0xcd, + 0x56, 0x1b, 0x8b, 0x19, 0x99, 0x00, 0x0a, 0xe0, 0xb4, 0x1c, 0x8a, 0x14, + 0x19, 0x6f, 0x8d, 0x43, 0xab, 0x48, 0xa9, 0xaf, 0x84, 0x37, 0x25, 0x89, + 0x73, 0x8e, 0x7a, 0x64, 0xa6, 0x56, 0xdf, 0x8d, 0x21, 0x56, 0x20, 0x72, + 0x16, 0x79, 0x23, 0xee, 0x0f, 0x34, 0xc4, 0x6a, 0x7c, 0xa9, 0xda, 0x57, + 0xbe, 0x74, 0x30, 0x7c, 0x03, 0x43, 0xd8, 0xf8, 0xd2, 0xc1, 0xee, 0x2b, + 0x51, 0xd7, 0x80, 0x1b, 0xca, 0xdf, 0x6a, 0x05, 0xd6, 0x9a, 0x01, 0x5f, + 0x7a, 0x01, 0x64, 0x4b, 0x4f, 0xb0, 0xc5, 0xea, 0x2b, 0x46, 0xa9, 0x4e, + 0x96, 0xf0, 0xe5, 0x0e, 0xda, 0x6b, 0x38, 0x31, 0x50, 0xeb, 0xee, 0x35, + 0x5f, 0x05, 0x60, 0xdf, 0x13, 0xbb, 0xa0, 0x25, 0x02, 0xe0, 0x4f, 0xd0, + 0x67, 0xac, 0xf5, 0x29, 0x4a, 0xd4, 0x71, 0x27, 0xa5, 0x41, 0x57, 0x46, + 0xaf, 0xd5, 0x06, 0xc0, 0x12, 0x86, 0xc0, 0x32, 0xca, 0xb8, 0xbe, 0x82, + 0x52, 0xa7, 0xcf, 0x1b, 0xbd, 0x16, 0x96, 0x51, 0xc2, 0xf5, 0x6b, 0x89, + 0x30, 0xb3, 0xc5, 0x03, 0x12, 0xe9, 0x83, 0xd0, 0xba, 0x56, 0x8d, 0xde, + 0x02, 0x56, 0x4f, 0x19, 0x77, 0xa6, 0xaa, 0x85, 0xcb, 0x27, 0xca, 0x6b, + 0x39, 0xd3, 0x8c, 0x80, 0x5a, 0x40, 0x00, 0xd4, 0x52, 0xef, 0xe5, 0xc8, + 0x04, 0x30, 0xb8, 0x98, 0x3d, 0x1d, 0xf2, 0x70, 0x5d, 0x75, 0x60, 0x79, + 0xb0, 0xad, 0x07, 0x6e, 0x45, 0x3a, 0x83, 0xb1, 0x8a, 0x81, 0xdf, 0x63, + 0x1d, 0xdc, 0xeb, 0x29, 0xb7, 0xd0, 0xfd, 0x96, 0x5b, 0xa0, 0xf7, 0x61, + 0x78, 0xdf, 0xe3, 0x93, 0xfc, 0xf1, 0xe6, 0x01, 0x1e, 0x7f, 0x7c, 0x92, + 0xeb, 0xf8, 0xc9, 0xd3, 0x9f, 0xde, 0x09, 0x4b, 0x3f, 0xae, 0xf6, 0x07, + 0x36, 0xc2, 0xd4, 0xb1, 0x1f, 0x6b, 0x72, 0xce, 0x4f, 0xb3, 0xf4, 0x9b, + 0x85, 0x00, 0xad, 0xb8, 0x85, 0x10, 0xc3, 0xa2, 0x8c, 0x0e, 0xa0, 0xf1, + 0xa8, 0x1f, 0x3e, 0xb5, 0x15, 0xb9, 0x18, 0xd2, 0x2a, 0x72, 0xca, 0x9f, + 0x02, 0x10, 0x29, 0x38, 0x91, 0x02, 0x5a, 0x05, 0x8b, 0x3e, 0x84, 0x0b, + 0x23, 0x84, 0x61, 0x85, 0xc0, 0xf7, 0xfd, 0xb6, 0xfe, 0xff, 0x84, 0x7d, + 0x3d, 0xce, 0x16, 0x18, 0x46, 0x78, 0xac, 0x80, 0xb0, 0xbe, 0xef, 0x47, + 0xc0, 0x2c, 0xe5, 0xd7, 0x8f, 0xe2, 0x48, 0xdb, 0x0a, 0xc3, 0x19, 0x5d, + 0xc0, 0x77, 0x22, 0x97, 0xc7, 0x9f, 0x69, 0x04, 0xe9, 0x89, 0xdf, 0x19, + 0x75, 0x0d, 0x05, 0xa4, 0x6c, 0x22, 0x12, 0x63, 0x17, 0xea, 0x58, 0xca, + 0xa6, 0x4a, 0x5b, 0x30, 0x8e, 0x64, 0xf4, 0x28, 0xb7, 0x82, 0x61, 0xd1, + 0x6c, 0x49, 0xe4, 0x8c, 0xc4, 0xe8, 0x29, 0x20, 0x69, 0xb2, 0xe2, 0x7d, + 0x6b, 0x23, 0x9b, 0x72, 0x46, 0xe2, 0x7a, 0x27, 0x81, 0xa0, 0x7f, 0xbc, + 0x18, 0x5c, 0x47, 0x4e, 0x50, 0x9f, 0xac, 0x33, 0xb4, 0x74, 0x2d, 0xae, + 0xa7, 0x20, 0x2c, 0x76, 0x71, 0x18, 0xa7, 0x1e, 0xee, 0x8f, 0x70, 0xf4, + 0x6b, 0x7b, 0x59, 0xf1, 0xbe, 0xdb, 0x70, 0xea, 0x15, 0x05, 0x02, 0x4d, + 0xf5, 0x9b, 0xe9, 0xe3, 0x5c, 0xe1, 0xd8, 0x49, 0x01, 0xb5, 0x78, 0x8d, + 0x00, 0xdc, 0x1c, 0x94, 0x5a, 0x92, 0x5a, 0x78, 0x5f, 0x5a, 0x92, 0x02, + 0x74, 0xc1, 0x5f, 0x77, 0xe9, 0xec, 0x0a, 0x80, 0x5a, 0xe1, 0x22, 0x4d, + 0x79, 0xed, 0x3f, 0xc0, 0x10, 0x30, 0x0e, 0x8c, 0xb4, 0x60, 0x2c, 0x35, + 0x06, 0x78, 0x5b, 0x6f, 0x81, 0x03, 0x53, 0xaa, 0x4c, 0xcc, 0xe7, 0x24, + 0x4d, 0x09, 0xe4, 0x24, 0xf7, 0xff, 0xee, 0x01, 0x2c, 0xf7, 0x26, 0xa0, + 0xc9, 0xe6, 0xc7, 0x0c, 0x46, 0x67, 0x24, 0xfb, 0xa3, 0xe7, 0x03, 0x25, + 0xa0, 0xda, 0x6a, 0x62, 0x06, 0x69, 0xcd, 0x07, 0xf1, 0xcd, 0xa7, 0x2e, + 0x2b, 0x7a, 0x44, 0x02, 0x02, 0x96, 0xbe, 0x44, 0xaf, 0x05, 0xe9, 0x93, + 0xbb, 0x3e, 0xbf, 0x4b, 0x83, 0xc2, 0xa9, 0x71, 0xe4, 0x2a, 0xd5, 0x04, + 0x34, 0x6c, 0xff, 0x23, 0x7b, 0x82, 0xb6, 0x56, 0x3e, 0xbe, 0x2f, 0xb9, + 0x7c, 0x04, 0xd2, 0x6a, 0xd2, 0x24, 0xdf, 0x92, 0x80, 0xc4, 0x46, 0xe0, + 0xe4, 0x54, 0xba, 0x65, 0x4b, 0xdd, 0x3b, 0x0b, 0x18, 0x09, 0xc6, 0xba, + 0x7d, 0xe0, 0x64, 0x0b, 0x2c, 0x14, 0x50, 0x6b, 0x27, 0xb0, 0x37, 0xa7, + 0xae, 0x75, 0x5b, 0x0b, 0x3e, 0x4c, 0xfb, 0x38, 0x17, 0x1f, 0x01, 0x9f, + 0x31, 0x7a, 0x88, 0x17, 0x13, 0x09, 0x01, 0x4f, 0x6f, 0x7e, 0xab, 0x3a, + 0x7e, 0xa5, 0xf5, 0x2a, 0x17, 0xe7, 0x2e, 0x9a, 0xf7, 0xf6, 0x5f, 0x17, + 0x9e, 0x63, 0x41, 0x10, 0xee, 0xca, 0xab, 0xaf, 0xe1, 0xf4, 0xd3, 0x4f, + 0x81, 0x35, 0x3f, 0x3b, 0xee, 0x59, 0x45, 0x3c, 0xfa, 0xa7, 0x89, 0x33, + 0x09, 0x98, 0x56, 0xb8, 0xbf, 0xb4, 0xdc, 0x1f, 0x41, 0xb7, 0x3a, 0x85, + 0x0f, 0x41, 0x56, 0x40, 0x04, 0xa3, 0xd2, 0x01, 0x5a, 0xbc, 0xac, 0x80, + 0x54, 0x3a, 0xc8, 0x2a, 0x84, 0x53, 0xe9, 0xaa, 0x54, 0xd4, 0x02, 0x0a, + 0xa1, 0xfb, 0xac, 0x36, 0x03, 0x85, 0xf0, 0x2c, 0x5d, 0x0b, 0xac, 0x4b, + 0xa3, 0xf0, 0xa7, 0x03, 0x1b, 0xa1, 0x5b, 0x08, 0xc7, 0x0a, 0xb7, 0x11, + 0xb8, 0x8b, 0x17, 0x23, 0x40, 0x96, 0xee, 0xae, 0xa7, 0x67, 0x81, 0x75, + 0x69, 0x04, 0xd9, 0x0a, 0xed, 0x87, 0xfe, 0xce, 0xb9, 0x2f, 0x82, 0xf1, + 0x73, 0xf8, 0x8c, 0x61, 0x7c, 0x64, 0x18, 0x82, 0xb5, 0x79, 0xf4, 0x3c, + 0x7c, 0xc8, 0x96, 0x38, 0xa7, 0xab, 0x40, 0x99, 0x5d, 0x0f, 0xed, 0x67, + 0xed, 0xaa, 0x32, 0x05, 0x33, 0xfc, 0x26, 0x44, 0xe5, 0xb5, 0x21, 0x48, + 0x6b, 0xc9, 0xa2, 0x32, 0x27, 0x4f, 0x57, 0xb1, 0x0d, 0x01, 0x52, 0x80, + 0x19, 0x2c, 0xc0, 0x56, 0x14, 0x14, 0xb0, 0xa9, 0x4d, 0x2a, 0xb0, 0x56, + 0x6d, 0x52, 0xe5, 0x00, 0x85, 0x60, 0xc0, 0xc8, 0xa9, 0x3b, 0x80, 0xcd, + 0xae, 0x47, 0xf7, 0xb3, 0x76, 0x85, 0x02, 0x76, 0x6d, 0xb8, 0x51, 0x01, + 0xce, 0xdd, 0xe7, 0x04, 0xae, 0x5b, 0x8f, 0xa0, 0xfb, 0x9d, 0xe4, 0x85, + 0xfd, 0x0a, 0x81, 0x1f, 0xab, 0x5f, 0x32, 0xda, 0xaf, 0x80, 0x5a, 0xa1, + 0x04, 0xe0, 0xd7, 0x1b, 0x58, 0x03, 0x79, 0xaa, 0xb5, 0x71, 0xdc, 0xc9, + 0x26, 0xd6, 0x40, 0x1e, 0x8b, 0x02, 0xcd, 0x60, 0xc1, 0x34, 0x6b, 0x51, + 0xf0, 0x1d, 0xc2, 0x74, 0x8d, 0xc6, 0x34, 0x14, 0x82, 0xf6, 0x90, 0xe3, + 0xab, 0xf4, 0xda, 0xd8, 0x51, 0x77, 0xb1, 0x19, 0x7e, 0x8f, 0x93, 0x13, + 0x6d, 0xfd, 0x18, 0xb5, 0x29, 0x07, 0xcb, 0xb4, 0x54, 0x97, 0x32, 0xe0, + 0xbb, 0x5a, 0xbf, 0x47, 0x00, 0xce, 0x8b, 0x80, 0xe2, 0x2d, 0x22, 0x98, + 0x9e, 0x10, 0x02, 0x77, 0x46, 0x82, 0x28, 0xa8, 0x85, 0x0f, 0x7a, 0x2d, + 0x65, 0x5f, 0xe6, 0x41, 0x80, 0x7f, 0x56, 0x62, 0x2e, 0xb4, 0xa8, 0x4d, + 0x38, 0x94, 0x06, 0x55, 0x3b, 0x40, 0x18, 0x06, 0xcc, 0x48, 0x1a, 0x33, + 0x0d, 0x44, 0x2e, 0x5e, 0xfc, 0xcd, 0x36, 0x6c, 0xfc, 0x96, 0x8f, 0x30, + 0x0d, 0x2c, 0x13, 0xfc, 0xba, 0xa7, 0x72, 0x50, 0xbd, 0x2f, 0x25, 0x78, + 0xa7, 0x57, 0xb0, 0x82, 0x75, 0xcb, 0x36, 0x50, 0x5e, 0xa4, 0xfa, 0x96, + 0x65, 0x08, 0x7e, 0xd2, 0xfa, 0xb8, 0x9f, 0xc3, 0xe7, 0x0a, 0x0c, 0xb6, + 0x4f, 0xdc, 0x01, 0xc0, 0xaf, 0x4e, 0xac, 0x51, 0x27, 0x26, 0xe0, 0x4b, + 0x83, 0x8f, 0x91, 0x7f, 0xe3, 0x2d, 0x10, 0x70, 0xaf, 0x22, 0x80, 0x55, + 0x9f, 0x88, 0x07, 0xe8, 0xce, 0xc4, 0xa0, 0x2d, 0xfb, 0xd6, 0x12, 0x7f, + 0xfd, 0x85, 0x03, 0xbc, 0xf9, 0xe2, 0xce, 0xe3, 0x2d, 0x6b, 0x7e, 0xe5, + 0x86, 0x36, 0xb7, 0xf1, 0xaf, 0x7f, 0x0b, 0x80, 0x29, 0x2f, 0x30, 0xf8, + 0x77, 0x30, 0xf5, 0xaf, 0x55, 0x76, 0x3d, 0xaa, 0xfa, 0xac, 0x6e, 0x78, + 0xff, 0x3a, 0xc6, 0xaa, 0x95, 0xe8, 0x1a, 0xb6, 0x7c, 0x7e, 0x33, 0x52, + 0x28, 0x88, 0x96, 0xd0, 0xaf, 0x29, 0x00, 0x7b, 0x01, 0x7c, 0xd7, 0x9b, + 0xe4, 0x9d, 0xfc, 0x02, 0xdf, 0x3e, 0xf9, 0x2f, 0xbc, 0x6d, 0xc9, 0xcf, + 0xf2, 0xed, 0x93, 0xff, 0x02, 0xc0, 0xdf, 0x7e, 0xfd, 0x5b, 0x7c, 0x37, + 0x88, 0x47, 0x4e, 0x49, 0x08, 0x61, 0x5a, 0x01, 0x90, 0x4b, 0x4e, 0x49, + 0x5c, 0x19, 0x97, 0x62, 0x11, 0x48, 0x0b, 0xe0, 0x81, 0xf7, 0x24, 0xdd, + 0x87, 0x1e, 0x4e, 0x5c, 0x47, 0x04, 0x1e, 0x1b, 0xf7, 0x11, 0x43, 0x06, + 0x6f, 0xfa, 0x8e, 0xc1, 0xcb, 0xdf, 0x7f, 0x21, 0x01, 0xd6, 0x0a, 0xef, + 0x4b, 0xb8, 0x8d, 0x61, 0x59, 0x6a, 0x5f, 0xbf, 0x6f, 0x6f, 0x19, 0xec, + 0xa7, 0xfa, 0x8f, 0x4e, 0x14, 0xfe, 0xa5, 0x57, 0x1c, 0x7a, 0x79, 0x63, + 0xdb, 0x3b, 0x9d, 0x29, 0x53, 0xa6, 0x4c, 0x99, 0x32, 0x65, 0xca, 0x94, + 0x29, 0x53, 0xa6, 0x4c, 0x99, 0x32, 0x65, 0xca, 0x94, 0x29, 0x53, 0xa6, + 0x4c, 0x99, 0x32, 0x65, 0xca, 0x94, 0x29, 0x53, 0xa6, 0x4c, 0x99, 0xe6, + 0xaf, 0x0c, 0xaa, 0x95, 0x29, 0x53, 0xa6, 0x4c, 0x99, 0x32, 0xfd, 0xb8, + 0xf4, 0x18, 0x10, 0x7c, 0x9b, 0x96, 0x06, 0xc6, 0x44, 0x30, 0xad, 0x9e, + 0x2e, 0x1f, 0x1b, 0x6b, 0x7e, 0xa4, 0x94, 0x94, 0xae, 0x28, 0xe1, 0x4f, + 0x26, 0x27, 0xe5, 0x87, 0x30, 0x91, 0xf0, 0x83, 0xf4, 0x30, 0x8e, 0x70, + 0x92, 0x87, 0xd5, 0x67, 0x45, 0xe0, 0x28, 0xc3, 0x30, 0xf0, 0x3c, 0x8f, + 0xf1, 0x13, 0x6a, 0x95, 0xe3, 0x04, 0x50, 0xcb, 0x08, 0x56, 0x27, 0x17, + 0x22, 0x01, 0xd6, 0x02, 0x05, 0xd4, 0x6a, 0x68, 0xfb, 0x00, 0xde, 0x94, + 0x97, 0x00, 0x6b, 0x89, 0x9c, 0xe0, 0xfe, 0x7b, 0xf7, 0xb1, 0xf9, 0xee, + 0x9b, 0xe0, 0xea, 0xf5, 0x6c, 0xaa, 0xef, 0x46, 0xfe, 0xfe, 0xdf, 0x40, + 0x4b, 0xb2, 0xf3, 0x0f, 0x0e, 0x70, 0xfb, 0x7f, 0x8c, 0x51, 0x15, 0xf9, + 0xd4, 0xc7, 0x93, 0x21, 0xf4, 0x2a, 0x2f, 0xf2, 0x09, 0x40, 0x96, 0x0e, + 0xc3, 0x0a, 0xaf, 0x21, 0x04, 0x73, 0xe9, 0x7e, 0x42, 0xf8, 0x56, 0xf8, + 0xd1, 0x7d, 0xda, 0x7e, 0x1a, 0xa4, 0x15, 0xd9, 0x49, 0xd9, 0x6a, 0x68, + 0x13, 0x96, 0xc2, 0x8f, 0x28, 0xf5, 0xf4, 0x34, 0x66, 0x1a, 0x31, 0xe8, + 0x2b, 0x84, 0x41, 0x3d, 0x16, 0x07, 0x39, 0x75, 0xcc, 0x67, 0xf1, 0xfa, + 0xf8, 0x98, 0x9c, 0x44, 0xb6, 0x04, 0x05, 0x21, 0x90, 0x48, 0x8c, 0x5e, + 0x1b, 0x77, 0x2a, 0xf8, 0x78, 0xd3, 0x36, 0xb8, 0xfb, 0x3f, 0xef, 0x8c, + 0xbc, 0xee, 0x7f, 0x74, 0x3f, 0xb5, 0xa7, 0x6a, 0x88, 0x39, 0xd8, 0x4b, + 0xf9, 0x16, 0x34, 0xa2, 0x0f, 0x4c, 0xdb, 0xcf, 0x87, 0x90, 0xaa, 0x8e, + 0x60, 0x2c, 0xe9, 0x23, 0x10, 0x89, 0x70, 0x56, 0xf0, 0x7b, 0x69, 0xcc, + 0x74, 0xfe, 0x48, 0x3c, 0x84, 0x70, 0x89, 0x1e, 0xd1, 0x06, 0xd4, 0x8a, + 0xe2, 0xea, 0x02, 0x5e, 0xf2, 0xfd, 0x70, 0x42, 0x42, 0x01, 0xc7, 0x93, + 0x09, 0xb0, 0x94, 0xdd, 0x67, 0x40, 0x4b, 0x26, 0xc3, 0xe6, 0x04, 0xb4, + 0x64, 0x1c, 0xae, 0x47, 0x24, 0x80, 0x64, 0x89, 0x6b, 0x0b, 0x81, 0x44, + 0xe1, 0x44, 0x8c, 0x56, 0x1c, 0x1f, 0x42, 0xa8, 0xf8, 0xb4, 0x49, 0x16, + 0x21, 0xf8, 0xab, 0xe1, 0x07, 0x30, 0xf9, 0xf4, 0xff, 0xd2, 0x00, 0x00, + 0x20, 0x00, 0x49, 0x44, 0x41, 0x54, 0x85, 0xd4, 0x47, 0xb2, 0xbe, 0xaf, + 0x70, 0x43, 0xb3, 0xbd, 0x8b, 0xa7, 0x8e, 0x69, 0x69, 0xd5, 0xde, 0xeb, + 0x70, 0x02, 0xc4, 0xac, 0x8a, 0xc0, 0x5a, 0x17, 0xae, 0xee, 0xa0, 0xac, + 0xf3, 0xf3, 0x03, 0xe0, 0x4c, 0xcd, 0x7f, 0x22, 0x9e, 0xd1, 0x6b, 0xb4, + 0xc1, 0xb5, 0xba, 0xad, 0xb2, 0x9e, 0x17, 0x79, 0xfc, 0x69, 0x9f, 0xa6, + 0x6c, 0x26, 0x80, 0x5a, 0xa1, 0xd2, 0x2b, 0xb4, 0xeb, 0x13, 0x55, 0xe6, + 0xa3, 0xd0, 0x6f, 0xc1, 0x28, 0xcc, 0xb9, 0xf2, 0x7b, 0x5e, 0xe4, 0x91, + 0x52, 0xd2, 0xf0, 0x1b, 0x89, 0xbc, 0x2e, 0x71, 0x1d, 0x5d, 0x26, 0xc0, + 0x75, 0x7b, 0xaf, 0xa5, 0x94, 0x38, 0x75, 0x07, 0xab, 0xb7, 0x33, 0xc8, + 0x2f, 0x54, 0xf5, 0x99, 0x2a, 0xe5, 0xab, 0xca, 0x34, 0xa6, 0x1b, 0x8c, + 0x3d, 0x3d, 0xd6, 0xb6, 0x52, 0x73, 0x5a, 0x27, 0x9f, 0x39, 0xc9, 0x92, + 0xab, 0x96, 0xe0, 0x4e, 0xbb, 0x14, 0x7a, 0x0a, 0x34, 0x66, 0x1a, 0x11, + 0x38, 0xab, 0x9b, 0xac, 0x5e, 0x0b, 0xcf, 0xf3, 0xb0, 0x7a, 0x2d, 0xdc, + 0x69, 0x37, 0xe1, 0xbf, 0xfa, 0x74, 0x15, 0xd9, 0x94, 0xb8, 0xd3, 0x0d, + 0xac, 0xde, 0x42, 0xdb, 0xab, 0xed, 0x9e, 0x71, 0x03, 0xc0, 0x96, 0x60, + 0x64, 0xd9, 0x30, 0xd5, 0xd3, 0xda, 0xe4, 0x3a, 0x6d, 0x82, 0x13, 0xc4, + 0x93, 0x04, 0x93, 0x13, 0x9f, 0x62, 0x40, 0x59, 0xe8, 0x66, 0x9a, 0x26, + 0x9e, 0xe7, 0x25, 0xfc, 0x74, 0x52, 0x9b, 0x7f, 0xcd, 0x2d, 0x9a, 0x9c, + 0xa8, 0x4f, 0x54, 0xec, 0x60, 0x4f, 0x4f, 0x5f, 0xb7, 0x74, 0x45, 0xe7, + 0x0d, 0x23, 0xf6, 0x2f, 0x25, 0xa2, 0xc7, 0x40, 0xce, 0xf8, 0x51, 0xfe, + 0xa0, 0xbf, 0xd7, 0xb5, 0x6f, 0xbc, 0x44, 0x29, 0xf8, 0x48, 0x79, 0x60, + 0xd5, 0x2a, 0x26, 0x03, 0x28, 0xd5, 0xab, 0xa0, 0x00, 0x55, 0x1d, 0x20, + 0x57, 0x3a, 0xe8, 0x09, 0x42, 0xe0, 0x53, 0x12, 0x0c, 0x95, 0x76, 0x8f, + 0xc3, 0x4c, 0x46, 0x50, 0xab, 0x4e, 0x10, 0xab, 0xc1, 0x81, 0x4e, 0xae, + 0x49, 0xad, 0xfc, 0xc3, 0x3f, 0xe4, 0xc8, 0x9d, 0x77, 0xb6, 0xf9, 0x5d, + 0xb5, 0x6a, 0x15, 0x87, 0x83, 0x74, 0x0f, 0x0c, 0x0e, 0x32, 0x39, 0x31, + 0xc1, 0x91, 0x0e, 0x69, 0x0f, 0xd3, 0xb6, 0x91, 0x95, 0x11, 0xfc, 0x6b, + 0x20, 0x75, 0x9e, 0xe0, 0xfc, 0x91, 0x08, 0x79, 0xd5, 0x1e, 0x7e, 0x20, + 0xe5, 0xae, 0xdf, 0x13, 0xfd, 0x5c, 0x3a, 0x0d, 0xba, 0x7f, 0xe8, 0x0c, + 0xe4, 0x42, 0x3b, 0xa7, 0xc7, 0xf9, 0xea, 0xc4, 0x24, 0x17, 0x0d, 0x0e, + 0xb0, 0x32, 0x80, 0x80, 0x1d, 0x81, 0x44, 0xfa, 0x49, 0xd9, 0xa8, 0x7d, + 0xe3, 0xa5, 0x68, 0xff, 0xd4, 0x69, 0x58, 0x9c, 0xb2, 0x7f, 0xe0, 0x1b, + 0xdf, 0xe4, 0xa6, 0xe3, 0x0a, 0xae, 0x15, 0xea, 0xab, 0x63, 0x7f, 0xcf, + 0xf8, 0x27, 0x6f, 0x67, 0xfb, 0x89, 0x2a, 0x5b, 0x96, 0xaa, 0x89, 0x20, + 0xdb, 0x4f, 0x54, 0xb9, 0x10, 0x6d, 0x59, 0x5a, 0xee, 0x6a, 0xc7, 0x16, + 0x6a, 0xb2, 0x6e, 0xb9, 0x2f, 0xae, 0x27, 0x96, 0xfb, 0x0c, 0xca, 0x40, + 0x75, 0x4a, 0xfd, 0x46, 0xed, 0x1e, 0x03, 0xd1, 0x03, 0xe5, 0x1e, 0x23, + 0x82, 0x68, 0x8d, 0x04, 0xc0, 0xb8, 0x10, 0xbe, 0x35, 0x3a, 0x60, 0xce, + 0x0a, 0xd8, 0xd2, 0xe3, 0x0e, 0xd3, 0x33, 0xdf, 0x34, 0x5e, 0xe8, 0xb5, + 0x9d, 0x8f, 0xa4, 0x9e, 0x5b, 0xa5, 0x61, 0x59, 0xa1, 0x66, 0xe4, 0x9c, + 0x90, 0x97, 0x53, 0xa7, 0xb5, 0x7d, 0xaf, 0xd9, 0xf6, 0xac, 0x7f, 0x28, + 0xb9, 0x9e, 0x82, 0x6a, 0x45, 0xe9, 0xf1, 0x21, 0x3d, 0x89, 0x74, 0xa6, + 0x09, 0x5a, 0x39, 0x7b, 0xf4, 0xe8, 0x6b, 0x13, 0xb5, 0x79, 0xed, 0x3a, + 0xbc, 0x27, 0xf7, 0xcc, 0xed, 0x31, 0x15, 0x06, 0x68, 0x0f, 0x77, 0xba, + 0xaa, 0xa0, 0x5a, 0xf3, 0x90, 0xe3, 0xcc, 0xfd, 0x3c, 0xe7, 0xe3, 0xe7, + 0xb5, 0xb6, 0x05, 0xea, 0xf9, 0x46, 0xfb, 0xe9, 0x7a, 0xf8, 0x6b, 0x20, + 0xcf, 0x75, 0x21, 0x27, 0x2e, 0x18, 0x9c, 0x35, 0x1f, 0xc9, 0x60, 0x3a, + 0xe7, 0xd1, 0x63, 0xed, 0xef, 0xae, 0xc4, 0xeb, 0x08, 0xd6, 0x9a, 0x4b, + 0x63, 0x7e, 0x00, 0x79, 0xeb, 0x50, 0x45, 0x0f, 0x63, 0x39, 0x7a, 0x2c, + 0xf9, 0xc3, 0xf4, 0x26, 0x15, 0x50, 0xcd, 0x04, 0x4e, 0xfa, 0xe3, 0xf1, + 0x09, 0xcd, 0xc6, 0x7b, 0xdf, 0xa1, 0xc2, 0x54, 0x7e, 0xfd, 0xa3, 0xca, + 0x61, 0x4a, 0xc5, 0x23, 0xa7, 0x62, 0x3f, 0x3b, 0xde, 0xa1, 0xb6, 0xdd, + 0x6c, 0x8c, 0x8d, 0xbc, 0x5d, 0xed, 0x4c, 0x1e, 0xa4, 0xa2, 0xdb, 0x7a, + 0x46, 0xc5, 0xff, 0xde, 0x0d, 0x31, 0xd8, 0xed, 0xa4, 0x3f, 0x4e, 0x31, + 0x68, 0xeb, 0xea, 0xe5, 0x75, 0xe5, 0xa5, 0x1a, 0xbf, 0x84, 0x9a, 0x64, + 0x35, 0x1f, 0xf0, 0x53, 0xb7, 0xe6, 0x95, 0x1e, 0x56, 0xcc, 0xe1, 0x37, + 0x5d, 0xd3, 0x0f, 0x8f, 0xe7, 0x03, 0xea, 0x09, 0x6d, 0xce, 0x96, 0x4e, + 0x3d, 0xfe, 0xb4, 0x96, 0xbe, 0xfb, 0x17, 0x00, 0x18, 0x7b, 0xf2, 0xc5, + 0x59, 0xc3, 0xff, 0x7b, 0xb8, 0x96, 0x4e, 0xb6, 0xd2, 0xaa, 0xbc, 0x14, + 0xc3, 0x23, 0xf4, 0xf2, 0xba, 0xfa, 0x9c, 0xa4, 0xe1, 0xfb, 0x54, 0x9f, + 0x33, 0xa2, 0xba, 0x9e, 0xeb, 0xba, 0x58, 0x96, 0x05, 0x33, 0x35, 0xa4, + 0x11, 0xc6, 0x2f, 0xa2, 0x76, 0x97, 0x55, 0xb6, 0x83, 0xb8, 0x24, 0x27, + 0x9f, 0x15, 0x98, 0x96, 0x8d, 0xe7, 0xaa, 0xfc, 0x59, 0xd6, 0x1b, 0x8c, + 0xb5, 0x04, 0x9e, 0x53, 0x83, 0xe3, 0x4b, 0xc0, 0x03, 0x79, 0xce, 0x55, + 0xd0, 0xa0, 0x5e, 0x8b, 0xb1, 0x71, 0x09, 0x45, 0x68, 0x22, 0x31, 0x4d, + 0x4b, 0xb5, 0x0f, 0xfa, 0x82, 0xab, 0x6a, 0xc5, 0x29, 0x77, 0xa6, 0x74, + 0x14, 0x8e, 0xc5, 0xd1, 0xe3, 0x0a, 0xa2, 0x7d, 0xf4, 0x09, 0x2b, 0x02, + 0x4e, 0x49, 0xd9, 0xc4, 0xea, 0xb3, 0x19, 0x3f, 0x0a, 0xf6, 0xc0, 0x62, + 0xd6, 0xae, 0x69, 0xb2, 0xff, 0xb8, 0x0d, 0x8f, 0x02, 0x66, 0x13, 0xbb, + 0xbf, 0x08, 0x01, 0x7c, 0x6a, 0xed, 0x9a, 0x26, 0xf7, 0x7e, 0x36, 0xe8, + 0x33, 0xe8, 0xb3, 0xa9, 0x1c, 0x45, 0x01, 0xbc, 0x8e, 0x03, 0xe4, 0xa1, + 0xd5, 0x54, 0xe1, 0xc7, 0xa1, 0x72, 0x34, 0x00, 0x6a, 0xf5, 0xc5, 0xa0, + 0xae, 0x30, 0xac, 0x73, 0x62, 0x0c, 0xe7, 0x04, 0xac, 0xbe, 0xd9, 0x52, + 0x93, 0xbb, 0x67, 0xd4, 0xe4, 0xf2, 0x08, 0x54, 0x2d, 0x82, 0xc9, 0xfd, + 0x2d, 0xe2, 0xc9, 0xa0, 0xc4, 0x40, 0x2d, 0x91, 0x83, 0xa6, 0x76, 0x9d, + 0x63, 0x75, 0xb5, 0x3f, 0x5c, 0x94, 0x08, 0x24, 0xa2, 0xa5, 0x00, 0x91, + 0x4d, 0xad, 0xbc, 0x6e, 0xe6, 0x0c, 0xf2, 0x01, 0x18, 0x33, 0x76, 0xd7, + 0xea, 0xe5, 0xa9, 0x11, 0x2a, 0xbd, 0xbc, 0xd6, 0xdf, 0xeb, 0x7f, 0x6f, + 0xfa, 0x9f, 0x01, 0xae, 0xf5, 0x1b, 0x28, 0xb8, 0x16, 0x40, 0x58, 0xa3, + 0x7e, 0x33, 0xf0, 0xcf, 0xc0, 0x65, 0xc0, 0x77, 0x7a, 0x2e, 0x82, 0x99, + 0x57, 0xbb, 0x86, 0xd7, 0xdf, 0x6b, 0xbd, 0xcd, 0x75, 0xf8, 0x66, 0x05, + 0x8d, 0x5a, 0xb7, 0x5e, 0xbd, 0xab, 0x21, 0x40, 0x4a, 0x3c, 0x0d, 0xb2, + 0x18, 0xe7, 0x22, 0x7b, 0x76, 0x3b, 0xc8, 0x3a, 0x8c, 0x09, 0x05, 0xe0, + 0x5a, 0xb7, 0x5e, 0x85, 0xdb, 0x75, 0xa5, 0x6a, 0x97, 0xef, 0x39, 0xee, + 0x20, 0xf6, 0xaa, 0x12, 0x6e, 0x09, 0xea, 0x3c, 0xbf, 0xa7, 0xc2, 0x2d, + 0x39, 0x1e, 0xdb, 0x19, 0x31, 0x81, 0x7f, 0xfc, 0x07, 0xb6, 0x17, 0x43, + 0x1b, 0x0a, 0xa0, 0xb5, 0x67, 0xb7, 0xc3, 0x0d, 0x45, 0x58, 0x07, 0x84, + 0x35, 0xa6, 0x25, 0xc5, 0x38, 0xfd, 0x87, 0x7e, 0x4f, 0xc5, 0x67, 0xf5, + 0x41, 0x6d, 0x0a, 0x6a, 0xd3, 0x31, 0x08, 0x6c, 0xe4, 0xf7, 0x1d, 0x8c, + 0xab, 0x50, 0xd4, 0x97, 0x67, 0x60, 0xdf, 0x67, 0x94, 0xdf, 0x2b, 0x8e, + 0x6d, 0x65, 0x5d, 0xb0, 0xff, 0xe7, 0xcb, 0x8b, 0x11, 0x59, 0x66, 0xc4, + 0x84, 0x3f, 0x7f, 0x38, 0x79, 0x1d, 0x00, 0xfb, 0x3e, 0x43, 0x90, 0x9e, + 0xe4, 0xbd, 0x08, 0xfd, 0xec, 0xfb, 0x4c, 0xe8, 0xae, 0xec, 0x5c, 0x12, + 0xcc, 0xe9, 0x3f, 0x7d, 0x4a, 0xed, 0xbc, 0xeb, 0xcd, 0x70, 0xc9, 0xb4, + 0x4a, 0x1b, 0x28, 0xa0, 0x56, 0x6d, 0x1a, 0x76, 0x93, 0x64, 0x67, 0x41, + 0xe0, 0x70, 0x4b, 0xfa, 0xb8, 0x4e, 0x94, 0xc8, 0x30, 0x80, 0xee, 0x16, + 0xf9, 0x4d, 0x1d, 0xa7, 0x94, 0x68, 0x73, 0xbd, 0x0e, 0x75, 0xb3, 0x1f, + 0x95, 0xc6, 0x9e, 0xf2, 0x19, 0x5a, 0x56, 0x88, 0x60, 0x5b, 0x43, 0xcb, + 0x3a, 0x93, 0x3c, 0x37, 0x1c, 0xb4, 0x71, 0x7e, 0x17, 0xf2, 0x6b, 0x04, + 0xcd, 0xc7, 0x64, 0x04, 0xce, 0xa8, 0x06, 0x90, 0x7f, 0x1d, 0x8c, 0x55, + 0x9d, 0xf0, 0x22, 0xb0, 0x56, 0xa8, 0xb5, 0x9f, 0xfc, 0x73, 0x00, 0x76, + 0x7c, 0xf2, 0xbd, 0xed, 0xfe, 0xeb, 0x3e, 0xe5, 0x60, 0xa1, 0x81, 0x83, + 0x27, 0x6a, 0x8c, 0x5e, 0x60, 0x1e, 0x79, 0xff, 0x3d, 0x5f, 0xc5, 0x34, + 0x05, 0x9e, 0x27, 0x31, 0x4b, 0x4d, 0xc6, 0x0f, 0xab, 0x77, 0x62, 0xd7, + 0x23, 0x1f, 0x9d, 0x35, 0xdc, 0xdd, 0xf7, 0xec, 0xe4, 0xde, 0x6d, 0x1b, + 0xbb, 0x9e, 0xd7, 0xeb, 0x66, 0x87, 0xfc, 0x53, 0x8c, 0x74, 0x69, 0x75, + 0x35, 0x7c, 0x0f, 0x85, 0xfc, 0xe8, 0xdc, 0x77, 0x2c, 0x72, 0x05, 0x64, + 0xcb, 0xa5, 0x56, 0xdf, 0x4f, 0xa9, 0xb8, 0x9e, 0xbc, 0x61, 0x90, 0xc7, + 0xc0, 0xf0, 0xd7, 0x52, 0xf7, 0x15, 0x1e, 0x25, 0x6f, 0x58, 0xd4, 0xeb, + 0xaa, 0x8d, 0xd0, 0x98, 0x76, 0xa1, 0x55, 0x40, 0x47, 0xa2, 0x28, 0x88, + 0x96, 0x8a, 0x27, 0xde, 0x87, 0xa2, 0x71, 0x1b, 0x75, 0x7f, 0x2f, 0x00, + 0xf7, 0x3e, 0x5e, 0xe3, 0xee, 0xeb, 0x4a, 0xdc, 0xfb, 0xf8, 0x26, 0xca, + 0x03, 0x35, 0xee, 0x7d, 0x6c, 0x4b, 0x10, 0x7a, 0x3b, 0x77, 0xaf, 0x29, + 0x73, 0xef, 0x63, 0x55, 0x46, 0x17, 0xdd, 0xaf, 0xee, 0xcd, 0xe1, 0x7b, + 0x30, 0x72, 0x26, 0x46, 0xb4, 0x80, 0x43, 0x00, 0xd7, 0x6a, 0x09, 0x64, + 0x2e, 0xae, 0x0b, 0x84, 0xc0, 0xad, 0xf9, 0xa8, 0x1d, 0x80, 0x45, 0x04, + 0xd4, 0xea, 0x7e, 0x7e, 0x76, 0xa0, 0x7f, 0x90, 0xba, 0x54, 0x3c, 0xed, + 0x3e, 0x74, 0xa0, 0x16, 0xd0, 0xd6, 0xd6, 0x16, 0x6d, 0x7d, 0xda, 0xc9, + 0x5a, 0xe1, 0x21, 0xff, 0x54, 0xb4, 0xaf, 0xe7, 0xe1, 0x90, 0xcc, 0x21, + 0xea, 0x24, 0xdd, 0xeb, 0xda, 0xf9, 0xe5, 0xda, 0xb9, 0x63, 0x1d, 0xfc, + 0xd4, 0x35, 0x37, 0x48, 0x86, 0x2d, 0x02, 0x0f, 0x3f, 0xac, 0xdc, 0x3e, + 0x7e, 0x1d, 0x0c, 0xac, 0x5c, 0x09, 0xf7, 0xef, 0xe4, 0x71, 0x38, 0x6f, + 0xb0, 0xd6, 0xca, 0x8d, 0x70, 0x64, 0xe7, 0xdc, 0xfe, 0x2e, 0x54, 0x8f, + 0x3f, 0x0e, 0x3c, 0x10, 0x1e, 0x0d, 0xb0, 0xf1, 0x81, 0x49, 0xf8, 0xf8, + 0xdc, 0xe1, 0x36, 0x6e, 0x84, 0x9d, 0x1d, 0xd2, 0xb5, 0x92, 0xce, 0xfd, + 0x68, 0xaf, 0x97, 0x66, 0xef, 0x37, 0x13, 0xda, 0x56, 0xd5, 0xe4, 0x45, + 0xf0, 0x83, 0xf3, 0x67, 0xfc, 0x00, 0xbc, 0x15, 0xd4, 0x7d, 0x35, 0x18, + 0x91, 0x94, 0x3e, 0x42, 0x18, 0xf8, 0x33, 0xbe, 0x56, 0x17, 0x15, 0xf8, + 0xbe, 0x87, 0xe8, 0x31, 0x82, 0xb1, 0x20, 0x05, 0xbb, 0xf2, 0x7d, 0x4f, + 0x01, 0xa4, 0xb4, 0xc5, 0x33, 0xd2, 0xfd, 0xfd, 0xfa, 0x02, 0x39, 0x7a, + 0x5f, 0xbf, 0x1e, 0x2e, 0x0c, 0xe3, 0xcf, 0x84, 0x76, 0xa4, 0x06, 0xe4, + 0x0a, 0x17, 0xf8, 0x30, 0x10, 0x22, 0x4e, 0xb3, 0x1e, 0x6e, 0xae, 0x71, + 0x0a, 0x29, 0x25, 0x12, 0x3d, 0xae, 0x10, 0x1a, 0x96, 0x87, 0x00, 0x9c, + 0xa5, 0xfc, 0x35, 0x13, 0x61, 0x84, 0xc8, 0x2b, 0xb0, 0x96, 0xdf, 0xc0, + 0x0f, 0x01, 0x42, 0x2d, 0x22, 0xf8, 0x96, 0x9c, 0x91, 0x14, 0x0c, 0x03, + 0xd7, 0x77, 0xb1, 0x4c, 0x1b, 0x6f, 0xca, 0x81, 0x9c, 0xc0, 0x34, 0x2d, + 0xe4, 0x8c, 0xec, 0x08, 0xd3, 0x0a, 0xe5, 0x7a, 0x63, 0x89, 0xe3, 0x70, + 0xbf, 0x3e, 0xa9, 0xf2, 0x40, 0xa7, 0x5e, 0x51, 0x6e, 0x46, 0x11, 0x48, + 0xd6, 0xc3, 0xf5, 0x71, 0x2e, 0x82, 0xb6, 0x41, 0x03, 0xb5, 0x0d, 0xef, + 0x71, 0x2d, 0xa7, 0xdd, 0x9f, 0x9c, 0xc0, 0x05, 0x35, 0x2e, 0x97, 0xca, + 0x4f, 0x64, 0x4e, 0x8d, 0xbb, 0xc9, 0x54, 0xbd, 0x5f, 0x8d, 0xe5, 0xc9, + 0x08, 0x3f, 0xa6, 0x83, 0xad, 0x8c, 0x1c, 0x54, 0x51, 0xbf, 0xac, 0x21, + 0x01, 0x63, 0x2d, 0xa8, 0x79, 0x0d, 0xe8, 0xd3, 0xca, 0x5e, 0x01, 0xf9, + 0x96, 0x8c, 0xda, 0x27, 0xcd, 0x96, 0x08, 0x80, 0x5a, 0x4a, 0xf7, 0xaf, + 0x71, 0xa9, 0x9d, 0x5e, 0x42, 0xf3, 0x89, 0x93, 0xc1, 0x79, 0x18, 0x93, + 0x6a, 0x7c, 0xc8, 0x03, 0x90, 0xcd, 0xe8, 0x27, 0xec, 0x41, 0x47, 0x88, + 0x70, 0xd8, 0x06, 0x42, 0x08, 0x05, 0x0f, 0xef, 0x11, 0xd0, 0xa3, 0x8d, + 0xe1, 0x07, 0x61, 0x0c, 0x04, 0x22, 0x17, 0x94, 0xf9, 0x02, 0x35, 0xde, + 0x90, 0x53, 0xf7, 0x25, 0x1c, 0x77, 0x94, 0x39, 0x05, 0x7a, 0xd6, 0x17, + 0x4d, 0x31, 0x68, 0x06, 0xf7, 0x2d, 0x9f, 0x5c, 0x30, 0xa6, 0xd5, 0x50, + 0xed, 0xcb, 0x20, 0x7d, 0xe1, 0x35, 0x3a, 0x28, 0x80, 0x6b, 0xd0, 0xba, + 0x62, 0xa7, 0x54, 0xd0, 0x2c, 0x50, 0xc0, 0xd7, 0x10, 0xb7, 0x7e, 0x37, + 0xb0, 0x31, 0xf8, 0x0b, 0x9f, 0x47, 0xa2, 0xf4, 0xd6, 0xc6, 0xb9, 0xf8, + 0x33, 0xe0, 0x23, 0xf1, 0xe1, 0xd9, 0xe7, 0x5f, 0x65, 0x64, 0xe4, 0x1a, + 0x2a, 0x95, 0x0a, 0x0b, 0x2d, 0xb5, 0x3a, 0xc5, 0xc5, 0xb9, 0xf3, 0xdf, + 0x9e, 0x73, 0x5f, 0xe4, 0xa5, 0x97, 0xe1, 0xf4, 0xd9, 0xa7, 0xf8, 0x81, + 0x35, 0x33, 0xef, 0x70, 0x21, 0x30, 0xeb, 0xad, 0x83, 0xfd, 0x30, 0xa1, + 0x68, 0x3e, 0xee, 0x0c, 0x58, 0x3d, 0x2a, 0x7d, 0xff, 0x34, 0x71, 0x06, + 0x6b, 0x61, 0x2f, 0xd6, 0xc2, 0x5e, 0xbe, 0xf3, 0xdd, 0xa9, 0xb6, 0xf0, + 0x0b, 0xac, 0x4b, 0x23, 0x48, 0x55, 0x1a, 0xb0, 0xa5, 0x43, 0xb0, 0xce, + 0xb9, 0x2f, 0x26, 0x00, 0x59, 0x2f, 0xbe, 0x7c, 0x8e, 0x4b, 0x89, 0xfb, + 0x57, 0x42, 0x77, 0xa0, 0xab, 0x4d, 0x20, 0xb2, 0x19, 0xba, 0x87, 0xfb, + 0x91, 0xbb, 0x66, 0x73, 0x81, 0x75, 0x29, 0x97, 0x5b, 0x24, 0xc2, 0x87, + 0x71, 0x3d, 0xff, 0xfc, 0xf3, 0x09, 0xbf, 0xe9, 0xb4, 0x86, 0x6e, 0xd1, + 0xb5, 0xf0, 0x62, 0x04, 0x07, 0x0b, 0xc3, 0x9d, 0x73, 0x5f, 0x64, 0x81, + 0x75, 0x69, 0x10, 0xee, 0xe7, 0xe2, 0xe7, 0x1b, 0x48, 0xcf, 0xc3, 0xc7, + 0x1d, 0x11, 0x6c, 0x6b, 0xb8, 0xd2, 0x61, 0xc7, 0x57, 0x1c, 0x2c, 0x11, + 0x00, 0x9d, 0x5a, 0x12, 0xd9, 0x23, 0xb0, 0x84, 0x8d, 0x15, 0xd4, 0x21, + 0x96, 0x2c, 0x2a, 0x6b, 0x29, 0x4e, 0x8e, 0x83, 0x96, 0x82, 0xbe, 0xe4, + 0x92, 0xd6, 0xa7, 0x3c, 0xee, 0xa8, 0x77, 0xe4, 0x50, 0x4d, 0xc1, 0xc9, + 0x96, 0xbc, 0x7f, 0x5d, 0x74, 0xae, 0xf2, 0xc8, 0x3e, 0x44, 0x4e, 0x60, + 0xd9, 0xe0, 0x3a, 0x30, 0x3e, 0xed, 0x20, 0x7a, 0x0c, 0x46, 0x28, 0x46, + 0x63, 0xfc, 0xa3, 0xd7, 0xd8, 0x54, 0x9d, 0x06, 0x6b, 0x97, 0xc5, 0xf1, + 0xba, 0x67, 0x04, 0x56, 0xbf, 0xe4, 0xa6, 0x3b, 0x86, 0xd8, 0xf7, 0xe0, + 0x78, 0xdc, 0xcf, 0xd4, 0xf0, 0x70, 0x27, 0x4d, 0x8c, 0xb3, 0x3e, 0x8e, + 0xef, 0x50, 0x7b, 0x16, 0x36, 0x5d, 0x3f, 0xc2, 0x58, 0xcd, 0xc7, 0x00, + 0x9a, 0x67, 0x7d, 0x4e, 0x0d, 0x36, 0xc9, 0xf7, 0xe6, 0x91, 0x7e, 0x13, + 0x7a, 0xf3, 0x34, 0xa7, 0xb5, 0xbe, 0xe3, 0xe9, 0x53, 0x2c, 0xb9, 0x6a, + 0x09, 0xb4, 0x04, 0x7e, 0x4b, 0xe2, 0xbb, 0xb5, 0xe0, 0x4b, 0xda, 0x14, + 0xb0, 0xd1, 0xcc, 0x63, 0x58, 0x02, 0xd9, 0x90, 0xd1, 0x62, 0x0c, 0x89, + 0x71, 0xed, 0x06, 0xf1, 0x17, 0xb8, 0x39, 0x89, 0x51, 0x10, 0xc8, 0x73, + 0x12, 0xb1, 0xc0, 0x80, 0x69, 0x10, 0xad, 0x26, 0x32, 0xc8, 0x33, 0xec, + 0x62, 0x09, 0x51, 0x88, 0xc3, 0xf9, 0xb2, 0x81, 0x94, 0x92, 0xda, 0x54, + 0x0d, 0x81, 0x81, 0xdf, 0xf0, 0x41, 0x82, 0x61, 0x19, 0x54, 0x6b, 0x55, + 0x44, 0xde, 0x80, 0x1e, 0xf0, 0x7b, 0x7c, 0x98, 0x81, 0x82, 0xcc, 0x63, + 0xf6, 0x9a, 0xc8, 0xab, 0x2c, 0xc6, 0x38, 0x10, 0x3d, 0x5f, 0x20, 0xf1, + 0x4e, 0x97, 0x17, 0x95, 0xd8, 0xf8, 0xe0, 0x46, 0x76, 0xde, 0x11, 0x54, + 0x28, 0xfa, 0x05, 0xa7, 0xbe, 0xff, 0x29, 0x40, 0x01, 0xb5, 0x00, 0xb6, + 0x0c, 0x3e, 0xc8, 0xf6, 0x89, 0x3b, 0xa2, 0x63, 0x80, 0x2f, 0x1b, 0x3f, + 0xc5, 0xff, 0xfd, 0xc6, 0x5b, 0x14, 0xb4, 0x2a, 0x00, 0x46, 0xd1, 0x2f, + 0x10, 0xfd, 0x42, 0x41, 0xa5, 0x56, 0x18, 0xf0, 0xac, 0xb2, 0x17, 0xc2, + 0xa7, 0xdc, 0x27, 0x1c, 0x06, 0x2e, 0x2e, 0xf3, 0x96, 0xc1, 0x7e, 0xfa, + 0xcc, 0x78, 0x34, 0x6e, 0xe8, 0x3d, 0xbf, 0xc0, 0x5c, 0xea, 0x33, 0x07, + 0x98, 0xf2, 0x26, 0x79, 0xcb, 0x60, 0x3f, 0x4c, 0xc0, 0x3b, 0xcb, 0x4b, + 0xa0, 0x0a, 0x7b, 0x8e, 0xef, 0x42, 0xf4, 0x09, 0x05, 0xd3, 0x1a, 0x00, + 0xbb, 0xd7, 0xc6, 0x9f, 0xa9, 0x45, 0x71, 0x86, 0xa0, 0xaf, 0x48, 0x8b, + 0xd4, 0xe6, 0x6f, 0xbf, 0xfe, 0x2d, 0xde, 0xf9, 0x9e, 0x5f, 0x48, 0x00, + 0xb5, 0x12, 0xcf, 0x52, 0xbb, 0xa6, 0xd0, 0x0e, 0xfd, 0x02, 0x8e, 0xce, + 0xa3, 0x16, 0xff, 0xc0, 0x7b, 0xa8, 0x2f, 0xdf, 0x4a, 0xf1, 0xaa, 0x78, + 0x61, 0x0a, 0x39, 0xee, 0x23, 0xfa, 0x84, 0xb2, 0x0b, 0x9c, 0xfd, 0x5f, + 0x7c, 0xe8, 0xff, 0x19, 0xce, 0x8c, 0xab, 0x52, 0xad, 0xff, 0x7f, 0xa8, + 0x72, 0x3a, 0x04, 0x67, 0xbd, 0x65, 0xb0, 0x9f, 0x7f, 0x9e, 0x50, 0x61, + 0x43, 0xa0, 0x96, 0x0e, 0xd6, 0xfa, 0xe7, 0x20, 0xef, 0x4b, 0x02, 0xca, + 0x82, 0xfc, 0x41, 0x7b, 0xa7, 0x33, 0x65, 0xca, 0x94, 0x29, 0x53, 0xa6, + 0x4c, 0x99, 0x32, 0x65, 0xca, 0x94, 0x29, 0x53, 0xa6, 0x4c, 0x99, 0x32, + 0x65, 0xca, 0x94, 0x29, 0x53, 0xa6, 0x4c, 0x99, 0x32, 0x65, 0xca, 0x94, + 0x29, 0xd3, 0xfc, 0x95, 0x41, 0xb5, 0x32, 0x65, 0xca, 0x94, 0x29, 0x53, + 0xa6, 0x1f, 0xa3, 0xf2, 0x0c, 0x03, 0xf1, 0x07, 0xb8, 0xa0, 0xe0, 0x3d, + 0xa2, 0x47, 0x7d, 0xa0, 0x9b, 0x06, 0xd6, 0xa4, 0x25, 0x84, 0xc0, 0xe8, + 0x35, 0x62, 0x78, 0x54, 0x30, 0x79, 0xdf, 0xd0, 0x56, 0x71, 0x17, 0x39, + 0xe5, 0x27, 0x0d, 0x1e, 0x71, 0xa7, 0xdc, 0xe8, 0x58, 0xff, 0xe8, 0x3c, + 0xb4, 0x1b, 0xda, 0x69, 0xb6, 0x9a, 0xf8, 0xbe, 0x1f, 0xfb, 0x99, 0x52, + 0x40, 0xa9, 0x70, 0x42, 0x8f, 0xd5, 0x5b, 0xc0, 0x9d, 0x6e, 0x44, 0x90, + 0x16, 0x5d, 0xc3, 0x4b, 0xd7, 0x72, 0xf2, 0x99, 0x83, 0xc8, 0x16, 0xec, + 0xfb, 0xd3, 0x7d, 0xdc, 0xf4, 0x6b, 0x0a, 0xac, 0xb5, 0x01, 0x10, 0xbf, + 0xf5, 0x5e, 0x6c, 0x60, 0xa7, 0x84, 0xcd, 0x9e, 0x4b, 0x27, 0x85, 0xe0, + 0x2a, 0x1d, 0xa2, 0x15, 0x42, 0xaf, 0x42, 0x77, 0xc3, 0x30, 0x12, 0xc7, + 0x3a, 0x28, 0x4c, 0x0f, 0xef, 0xfb, 0x3e, 0x7e, 0x97, 0x89, 0x3a, 0xa1, + 0xff, 0xd0, 0x4e, 0xb8, 0xe2, 0x27, 0x80, 0x89, 0x49, 0xa1, 0xb7, 0x80, + 0x37, 0xed, 0x51, 0x0a, 0x56, 0xc2, 0x64, 0x5a, 0x44, 0xfe, 0xc2, 0x0f, + 0xa9, 0x45, 0x8f, 0x5a, 0x55, 0xdb, 0x23, 0x7e, 0xae, 0x09, 0xed, 0x56, + 0x1f, 0xbe, 0xad, 0x5e, 0x65, 0x73, 0xf0, 0x70, 0x2d, 0xfa, 0x14, 0xd3, + 0xe8, 0x4d, 0x82, 0x0b, 0xfc, 0xb3, 0xfb, 0xd9, 0xff, 0xa8, 0xda, 0x1f, + 0x1b, 0x1f, 0x63, 0xf1, 0x40, 0x9d, 0x75, 0xbf, 0x09, 0xfb, 0x1e, 0x29, + 0xa3, 0x4f, 0x31, 0x0e, 0x7f, 0x23, 0xa1, 0x1a, 0x33, 0x01, 0x50, 0x2a, + 0x05, 0x68, 0x9a, 0x0d, 0xa6, 0x05, 0xe0, 0x4f, 0xfb, 0x31, 0x30, 0x2a, + 0x30, 0x6f, 0xf5, 0x1a, 0x31, 0xa0, 0xab, 0x13, 0x50, 0x6b, 0xda, 0x87, + 0x9e, 0x60, 0x62, 0x72, 0x17, 0x75, 0x8d, 0xcf, 0x97, 0x51, 0x7c, 0xe9, + 0x0f, 0xd4, 0xed, 0x3e, 0x63, 0x56, 0x10, 0x57, 0x1a, 0x6c, 0x25, 0x5b, + 0x0a, 0x8a, 0xd5, 0x06, 0xe0, 0x4a, 0x85, 0xa3, 0x03, 0x34, 0xa9, 0x53, + 0x7c, 0x9d, 0x80, 0x5a, 0x04, 0x40, 0x13, 0x5d, 0xe1, 0x3d, 0x65, 0x8a, + 0xe8, 0xb9, 0xea, 0xd2, 0x9f, 0xbf, 0x3f, 0xd3, 0xec, 0xb8, 0x9f, 0x56, + 0x18, 0x87, 0x0c, 0x7e, 0x7b, 0xfe, 0x8c, 0x07, 0x3d, 0x5d, 0xbd, 0x27, + 0xd3, 0x39, 0x0f, 0x58, 0xd6, 0x6c, 0x7e, 0x8c, 0x1e, 0x33, 0x01, 0x23, + 0xea, 0x06, 0x86, 0x6a, 0xf8, 0x8d, 0xc4, 0xf1, 0x5c, 0xf9, 0x53, 0x22, + 0x8e, 0x5e, 0x23, 0xfa, 0xbd, 0xfa, 0xd3, 0x7e, 0x0c, 0xf9, 0x0b, 0x26, + 0x99, 0xa4, 0x27, 0xa5, 0xe8, 0xef, 0xfc, 0x6c, 0x4a, 0x4f, 0x6a, 0x49, + 0x83, 0xb9, 0x3a, 0x29, 0xcc, 0xdf, 0x0a, 0x46, 0x61, 0xce, 0x78, 0x74, + 0x1b, 0xb3, 0xbd, 0xd7, 0x56, 0xaf, 0x85, 0x53, 0x77, 0xa2, 0xf7, 0x32, + 0xfa, 0x8d, 0x07, 0xd7, 0xec, 0x4e, 0xab, 0x3c, 0xce, 0x9f, 0xf6, 0xb1, + 0xfb, 0xed, 0x08, 0x42, 0x28, 0x08, 0xc0, 0x7a, 0x5a, 0x9e, 0xed, 0x79, + 0x3e, 0x42, 0xa8, 0x55, 0x9c, 0xc3, 0x7b, 0x5c, 0xe8, 0x29, 0x50, 0xa7, + 0x4e, 0xb9, 0x5c, 0x66, 0xef, 0x83, 0x7b, 0xb9, 0xed, 0x8e, 0xdb, 0xd8, + 0xfb, 0xa0, 0x9a, 0xfc, 0x32, 0xb2, 0x7c, 0x84, 0xc6, 0x4c, 0x03, 0x67, + 0xd2, 0x89, 0x00, 0x5a, 0xa6, 0x69, 0xe2, 0x4c, 0x38, 0x08, 0x21, 0x58, + 0x52, 0x5e, 0xa2, 0xd2, 0x10, 0xe6, 0xf9, 0xc1, 0x8a, 0xe9, 0xee, 0x74, + 0x83, 0xd1, 0x0f, 0x8d, 0x70, 0xf0, 0x2f, 0x2b, 0xd1, 0x2a, 0xcc, 0x56, + 0x5f, 0x41, 0xf9, 0x13, 0x30, 0xf6, 0x54, 0x15, 0xe9, 0xfb, 0x6a, 0x45, + 0x64, 0xc0, 0x9f, 0xf6, 0xa2, 0x7d, 0x20, 0x3a, 0xa7, 0xff, 0x76, 0xc2, + 0xfd, 0x8e, 0x6e, 0x61, 0x19, 0xa2, 0xd9, 0xe8, 0x78, 0xcf, 0x35, 0x1b, + 0xe9, 0x30, 0xd2, 0xf7, 0xc1, 0x30, 0x12, 0xe9, 0x4a, 0xc7, 0x19, 0x86, + 0xd1, 0x9f, 0xbe, 0x44, 0x41, 0xb4, 0x12, 0xd7, 0x90, 0xfa, 0xad, 0x48, + 0xe9, 0xc5, 0x93, 0xae, 0x3a, 0xbc, 0xd7, 0xec, 0x52, 0x2b, 0xb5, 0x4f, + 0x1e, 0x3e, 0xcc, 0xc0, 0xaa, 0x55, 0xfc, 0xe6, 0xe1, 0xc3, 0x5c, 0x34, + 0xcb, 0x75, 0xa4, 0xc1, 0x4f, 0xdd, 0xdc, 0x3a, 0x81, 0xa3, 0x42, 0xa5, + 0x27, 0xc8, 0xad, 0x0e, 0xc3, 0x0c, 0x0e, 0x32, 0x1f, 0xbd, 0xba, 0x6a, + 0x55, 0x47, 0xbf, 0x83, 0x03, 0x03, 0x4c, 0x74, 0x00, 0x81, 0x75, 0x4a, + 0xe7, 0x4e, 0x2d, 0x15, 0xed, 0x30, 0xb0, 0xf8, 0xbc, 0x7e, 0x6e, 0x25, + 0x03, 0x29, 0xcc, 0xd6, 0xdc, 0xf1, 0xcc, 0x06, 0xcb, 0xea, 0x04, 0xd4, + 0xea, 0xe4, 0x3f, 0xd4, 0x45, 0x83, 0x03, 0xbc, 0x3a, 0x31, 0xc9, 0xe0, + 0x45, 0xed, 0x60, 0xaf, 0x38, 0x8d, 0x81, 0x76, 0x75, 0xb8, 0x97, 0xcb, + 0x92, 0xcf, 0xff, 0xa6, 0xa3, 0xb0, 0x6f, 0x05, 0xf0, 0x8d, 0x6f, 0x46, + 0x6e, 0x37, 0x1c, 0x95, 0xc8, 0x00, 0x10, 0x35, 0x17, 0x28, 0x6a, 0xcb, + 0xb5, 0x45, 0xb6, 0x3f, 0x59, 0xef, 0x7a, 0x7e, 0xfb, 0x2c, 0x76, 0x42, + 0x60, 0x16, 0x28, 0x88, 0x96, 0x23, 0x25, 0xb6, 0x10, 0x0a, 0xac, 0xd5, + 0x67, 0x44, 0x60, 0xad, 0x6e, 0x1a, 0xe9, 0x35, 0x23, 0xb0, 0xd6, 0x6c, + 0xe9, 0xd0, 0xe3, 0xee, 0x94, 0x8e, 0xd9, 0xd2, 0xa8, 0x2b, 0x1d, 0xc7, + 0x85, 0x86, 0x03, 0x28, 0x5c, 0x31, 0x8c, 0xc8, 0x81, 0xef, 0x89, 0x08, + 0xec, 0xd2, 0x98, 0xac, 0x45, 0xd0, 0xcc, 0xb4, 0xe4, 0x8c, 0x84, 0x62, + 0x50, 0x7e, 0xe9, 0xe5, 0xb9, 0x01, 0x4c, 0x35, 0xdb, 0x9e, 0x2b, 0x00, + 0x57, 0xbe, 0x86, 0x58, 0xad, 0x23, 0xc1, 0x84, 0xe2, 0xa1, 0x21, 0x78, + 0xa2, 0x02, 0xef, 0x1f, 0x51, 0x60, 0xad, 0xb4, 0x66, 0x9a, 0x08, 0xa1, + 0x7e, 0x4b, 0x87, 0x8e, 0xbd, 0x1d, 0x21, 0x60, 0xe4, 0xda, 0xf8, 0x74, + 0xe5, 0x49, 0xb5, 0x2d, 0x9b, 0x75, 0xaa, 0x00, 0x1f, 0x5a, 0x8d, 0x31, + 0x55, 0xc2, 0x7f, 0x7a, 0x5f, 0xc7, 0x68, 0x2f, 0x04, 0xa8, 0x05, 0x1d, + 0x60, 0x5a, 0xa1, 0x3d, 0xa7, 0x8c, 0xf7, 0x57, 0x07, 0xe1, 0x83, 0xa3, + 0xf0, 0x95, 0x83, 0x70, 0xfd, 0xa8, 0x3a, 0x71, 0x7d, 0x70, 0x0c, 0x6c, + 0xfa, 0x1d, 0x95, 0x57, 0xee, 0x7a, 0xd0, 0x69, 0x03, 0x3d, 0x3a, 0x93, + 0x0e, 0xa6, 0xb9, 0x6e, 0x5e, 0x7e, 0xe6, 0x6b, 0x6b, 0xc3, 0x27, 0xe8, + 0xec, 0xa7, 0x25, 0x71, 0xea, 0x6e, 0xc2, 0xcf, 0x96, 0xcf, 0xd3, 0xf9, + 0xb9, 0x06, 0xf9, 0xfa, 0xae, 0xcf, 0x75, 0x6e, 0x73, 0xf0, 0xb5, 0x31, + 0x0c, 0x92, 0xed, 0x98, 0x86, 0x56, 0x92, 0xc4, 0x35, 0xa0, 0x02, 0x95, + 0x23, 0x3e, 0xa5, 0xbe, 0x8d, 0x58, 0x86, 0xcd, 0xdd, 0x7d, 0x60, 0x19, + 0xca, 0xf6, 0xc1, 0xe7, 0xc6, 0x69, 0xac, 0xfc, 0x1b, 0xaa, 0x01, 0x48, + 0xa7, 0xdc, 0x57, 0x4a, 0xec, 0xaf, 0xbe, 0x0d, 0xaa, 0x1f, 0xf9, 0x00, + 0x1b, 0x3e, 0x51, 0xa2, 0xe9, 0x28, 0x8b, 0x79, 0xbb, 0x90, 0xd8, 0x17, + 0xd7, 0xaf, 0x65, 0xc7, 0xbb, 0xef, 0xe1, 0xe4, 0xc7, 0x6c, 0xea, 0x7e, + 0xb2, 0xee, 0x56, 0x34, 0x4a, 0xac, 0x5b, 0x53, 0xa2, 0xfa, 0xee, 0x43, + 0xac, 0xbd, 0x7a, 0x08, 0xc7, 0x53, 0xb6, 0x6d, 0xb3, 0x94, 0xd8, 0xb7, + 0xd6, 0xac, 0x63, 0xcb, 0x71, 0x9b, 0xf1, 0x7a, 0x95, 0xa1, 0xa2, 0x9a, + 0x78, 0x36, 0x5e, 0xaf, 0x52, 0x0a, 0xf6, 0x57, 0xff, 0x06, 0x0c, 0x1b, + 0x63, 0xf0, 0x95, 0xfd, 0x34, 0x9c, 0x06, 0x05, 0x5b, 0x5d, 0x77, 0xc3, + 0x69, 0x90, 0x0f, 0xf6, 0xc7, 0xae, 0xb7, 0xd9, 0xf3, 0x58, 0x8d, 0xba, + 0x5f, 0xa3, 0x68, 0xa8, 0xf6, 0x8f, 0xbe, 0xbf, 0x6e, 0x4d, 0x89, 0x91, + 0xf1, 0x51, 0xdc, 0xc7, 0xf6, 0xe0, 0x78, 0xb5, 0xb6, 0x34, 0xd4, 0xbc, + 0x1a, 0xc3, 0xbf, 0xb9, 0x9d, 0xb1, 0x41, 0x9b, 0x7b, 0x3f, 0x93, 0xbc, + 0x1f, 0x65, 0xb3, 0x44, 0xd5, 0xab, 0x71, 0xf7, 0x5d, 0x45, 0xca, 0x0b, + 0xab, 0xc8, 0xdd, 0xc1, 0x6f, 0xd1, 0xca, 0xe3, 0x3b, 0x4d, 0x0c, 0x3b, + 0xd8, 0xae, 0x5f, 0xc7, 0x78, 0x6b, 0x9c, 0x1d, 0x7f, 0xaa, 0x00, 0x5d, + 0xc5, 0x85, 0x45, 0xea, 0x67, 0xeb, 0x6a, 0x7f, 0x41, 0x09, 0x8e, 0x36, + 0x3a, 0x96, 0xd7, 0xff, 0x6d, 0x7e, 0x45, 0xe4, 0x05, 0xa9, 0x1b, 0xec, + 0xa9, 0x93, 0x74, 0x04, 0xc1, 0x5c, 0xb5, 0xda, 0xf9, 0x00, 0xc0, 0x74, + 0x5d, 0x12, 0xf8, 0xd7, 0x61, 0x5a, 0x97, 0x9c, 0x47, 0x78, 0xf8, 0xc9, + 0xb9, 0x96, 0xf9, 0xaa, 0xe3, 0x73, 0x0d, 0xf3, 0x75, 0x09, 0x05, 0x43, + 0x50, 0xbe, 0x42, 0x50, 0x7d, 0x4e, 0xc5, 0x3e, 0x72, 0xa3, 0x45, 0xe5, + 0x51, 0x97, 0x52, 0xce, 0xa2, 0x1c, 0x54, 0x04, 0x2c, 0x01, 0x95, 0xe7, + 0xc0, 0xba, 0x62, 0x09, 0xb4, 0x24, 0xab, 0xaf, 0x0a, 0x26, 0x7d, 0x23, + 0xb1, 0xaf, 0x14, 0xec, 0xdd, 0x9b, 0x34, 0x6f, 0x5a, 0xe1, 0xef, 0x4b, + 0x5d, 0xf5, 0x86, 0x3b, 0x54, 0x19, 0xe3, 0x06, 0xed, 0x36, 0xab, 0x05, + 0x07, 0xaa, 0x60, 0x5d, 0x55, 0xa6, 0xd9, 0x92, 0xdc, 0xb4, 0x4c, 0xe0, + 0xa2, 0x40, 0x01, 0x9d, 0x40, 0xc5, 0x43, 0xcb, 0x60, 0xbc, 0x9e, 0x6c, + 0x67, 0xb9, 0x53, 0x0e, 0x77, 0xff, 0x8e, 0x8d, 0xd3, 0x92, 0x20, 0xd4, + 0x04, 0x69, 0x09, 0xd8, 0x4b, 0x87, 0x19, 0x5a, 0x01, 0x6b, 0x97, 0xd9, + 0x38, 0x41, 0x7c, 0x21, 0x14, 0x0b, 0x80, 0x16, 0x0c, 0xad, 0x88, 0xf7, + 0x43, 0xdd, 0xfb, 0x59, 0x87, 0xb5, 0xf7, 0x24, 0xd3, 0x0d, 0xc0, 0xd4, + 0x62, 0x2a, 0x47, 0xd5, 0xbb, 0x64, 0x2f, 0x0d, 0xfa, 0xa0, 0x5a, 0x45, + 0x44, 0xcf, 0x51, 0x44, 0x2e, 0x9c, 0xdc, 0xaf, 0x9a, 0xcd, 0x52, 0x06, + 0x90, 0xad, 0x1e, 0x90, 0x33, 0xaa, 0xcd, 0x6d, 0x5d, 0xbd, 0x0e, 0xf7, + 0xe9, 0x3d, 0x41, 0x38, 0xb0, 0xfb, 0x5d, 0xc0, 0x42, 0xfa, 0x04, 0x3f, + 0x24, 0x19, 0x85, 0x2b, 0x08, 0x89, 0xd0, 0x7e, 0x08, 0xcd, 0x60, 0x02, + 0x7e, 0xb3, 0x05, 0xf9, 0x08, 0x42, 0xd2, 0x40, 0xe4, 0xc2, 0x3c, 0xb7, + 0x81, 0xef, 0x43, 0xa1, 0x37, 0xc8, 0x9f, 0x3b, 0x94, 0xd7, 0xe1, 0xf3, + 0x3f, 0xd7, 0x76, 0xe6, 0x87, 0xd3, 0xcf, 0xbc, 0x0e, 0x36, 0x3b, 0xe9, + 0xc3, 0xc1, 0xf6, 0xcf, 0x7f, 0x04, 0x71, 0xfd, 0x28, 0xf5, 0x5c, 0xb0, + 0xfd, 0x19, 0xe0, 0x1f, 0x52, 0xe7, 0x2e, 0x03, 0x5e, 0x98, 0x23, 0x7c, + 0xc7, 0xf7, 0xba, 0x53, 0xdd, 0x3c, 0x50, 0x08, 0xa5, 0x5a, 0xf7, 0x0e, + 0x1b, 0xde, 0x41, 0x02, 0xba, 0x25, 0x76, 0x3b, 0xb0, 0xbe, 0x33, 0x14, + 0x54, 0xc1, 0xb1, 0xe2, 0xe3, 0x34, 0x94, 0x2a, 0xb1, 0x1f, 0xd8, 0x58, + 0xb7, 0x5e, 0x0f, 0x1f, 0xd8, 0xdd, 0xed, 0x00, 0x76, 0x04, 0xdb, 0xda, + 0xfc, 0x7b, 0x71, 0x7c, 0x5b, 0xee, 0x0c, 0xe0, 0x5a, 0x1a, 0x10, 0x4b, + 0x87, 0x60, 0x8d, 0x7c, 0xa6, 0x43, 0x5c, 0xa9, 0xb4, 0xe9, 0xee, 0x49, + 0xd9, 0x80, 0x83, 0x5e, 0x73, 0xdb, 0x83, 0x02, 0x7d, 0x75, 0x94, 0x80, + 0x7f, 0xf9, 0xd6, 0x39, 0x2e, 0x21, 0x06, 0x68, 0xe9, 0xd2, 0x8f, 0x6f, + 0xd9, 0x0a, 0x6c, 0x45, 0x81, 0xb4, 0xc2, 0xfd, 0x87, 0xd3, 0x06, 0x8b, + 0xdd, 0x62, 0x52, 0xda, 0x8a, 0x22, 0xda, 0xb4, 0x85, 0x53, 0x71, 0x0d, + 0x98, 0x74, 0x7e, 0xae, 0x41, 0x19, 0x3e, 0x7c, 0x1a, 0xc6, 0x16, 0xc1, + 0xc9, 0x6d, 0x75, 0x95, 0x9d, 0x5c, 0x63, 0xc0, 0x23, 0x3e, 0x04, 0x6e, + 0x00, 0xc3, 0x03, 0x06, 0x4c, 0xfa, 0x0c, 0x03, 0x63, 0x03, 0x81, 0xfb, + 0xca, 0xb8, 0x5f, 0x61, 0x64, 0x12, 0xc6, 0x8e, 0x28, 0xbf, 0x23, 0x81, + 0x5f, 0x79, 0xa3, 0x81, 0x38, 0xe2, 0x73, 0xf2, 0x88, 0x0f, 0x2b, 0x0d, + 0x46, 0x26, 0x81, 0x49, 0xbf, 0xad, 0x71, 0x28, 0x1e, 0x0d, 0xfa, 0x0f, + 0x6e, 0x34, 0x3a, 0xda, 0x61, 0x80, 0x36, 0x3b, 0xe3, 0xc7, 0xe3, 0x9a, + 0xe1, 0xf8, 0xf1, 0x46, 0x04, 0xd8, 0x2a, 0x0f, 0x25, 0x01, 0x44, 0xfe, + 0x8a, 0x60, 0xf1, 0x86, 0x35, 0x82, 0x83, 0x34, 0xa1, 0x0f, 0x78, 0x3a, + 0x19, 0xbf, 0x0e, 0xcb, 0x82, 0x18, 0xba, 0x15, 0xc2, 0xb4, 0xc2, 0x63, + 0xdd, 0x7f, 0xb9, 0x68, 0x44, 0xee, 0xdb, 0x6f, 0x55, 0x75, 0xb3, 0xd5, + 0xbf, 0xd5, 0x9e, 0xc3, 0x48, 0xd9, 0x19, 0xf8, 0x05, 0x20, 0x7f, 0xe0, + 0xe0, 0x3c, 0x0d, 0xa6, 0x09, 0xae, 0xd7, 0xc4, 0xa9, 0xc7, 0xa5, 0xf7, + 0xfd, 0x3b, 0x92, 0x04, 0x9f, 0x76, 0xe8, 0xbc, 0xe4, 0xee, 0x7b, 0xb6, + 0xb5, 0xf9, 0x71, 0x1f, 0xdc, 0xd1, 0xb1, 0x6e, 0x56, 0x09, 0x1e, 0xbf, + 0x4f, 0xdc, 0x2f, 0x6f, 0x88, 0xb0, 0x3c, 0xec, 0x52, 0x37, 0x07, 0x0a, + 0xbd, 0x26, 0xb5, 0x29, 0x85, 0xed, 0xab, 0xd5, 0x77, 0x07, 0xe1, 0x56, + 0x60, 0x08, 0x0b, 0x43, 0xac, 0x20, 0xac, 0xa1, 0x18, 0x42, 0x8b, 0x33, + 0xd7, 0x80, 0x16, 0x18, 0x62, 0x75, 0x60, 0xa3, 0x40, 0xbd, 0x1e, 0x40, + 0x65, 0x29, 0x07, 0x60, 0x2d, 0x22, 0xa0, 0x16, 0xb8, 0x94, 0x07, 0x6a, + 0x40, 0x29, 0x00, 0x6b, 0x81, 0x21, 0x16, 0xe3, 0xcb, 0xb5, 0x8c, 0x2e, + 0x82, 0xda, 0xb3, 0x55, 0x46, 0x17, 0xa9, 0x6b, 0xe6, 0x07, 0x12, 0x7f, + 0x66, 0x14, 0xc3, 0xa8, 0xe0, 0x4b, 0x48, 0xb3, 0xae, 0xc2, 0x3e, 0x72, + 0x85, 0xd1, 0x79, 0x3d, 0x6a, 0x43, 0x73, 0xe9, 0x02, 0xe3, 0xec, 0x06, + 0xad, 0x4e, 0xa8, 0xbd, 0x06, 0x58, 0x99, 0x25, 0x0f, 0xaf, 0x07, 0x87, + 0x45, 0xda, 0x81, 0x5a, 0x69, 0x1d, 0x9b, 0xe5, 0x5c, 0x9d, 0x24, 0x4c, + 0x8b, 0xd4, 0x7e, 0x78, 0xbe, 0xb8, 0x1c, 0x56, 0x0e, 0x0c, 0xb0, 0x73, + 0xe7, 0x4e, 0xea, 0xc7, 0xda, 0x59, 0x55, 0x1b, 0x01, 0xfd, 0x57, 0xbd, + 0x71, 0x25, 0xec, 0x3c, 0x02, 0x1b, 0x07, 0x60, 0xe7, 0x64, 0xd0, 0x3f, + 0xf4, 0x3a, 0x02, 0xb5, 0x00, 0xae, 0xbb, 0x4e, 0xa5, 0x71, 0x60, 0xe5, + 0x4a, 0x8e, 0x7c, 0x7c, 0x27, 0x1f, 0xdf, 0x99, 0x82, 0xdb, 0xa4, 0x15, + 0x52, 0xb3, 0x82, 0x2e, 0xb9, 0x44, 0x5a, 0x03, 0xe7, 0xf0, 0x3a, 0x5e, + 0x77, 0xcd, 0xd9, 0x6f, 0x26, 0x13, 0x7d, 0xfb, 0xaa, 0x8f, 0x3b, 0x7e, + 0x41, 0x3c, 0xaf, 0x9e, 0x08, 0x2a, 0x0c, 0x13, 0x05, 0x9b, 0x52, 0xe0, + 0x2a, 0xa3, 0xc7, 0x48, 0xc0, 0xb7, 0x14, 0x84, 0x4a, 0xe0, 0x07, 0xfd, + 0x29, 0xe1, 0x82, 0x18, 0xe9, 0x7e, 0xfe, 0x6e, 0x63, 0x0a, 0xd0, 0x79, + 0x4c, 0xa0, 0x3d, 0xbc, 0xa1, 0xc6, 0x56, 0x0d, 0x02, 0xb0, 0x96, 0x81, + 0x94, 0x3e, 0x86, 0x21, 0x90, 0x71, 0x25, 0xb7, 0x0d, 0xae, 0x25, 0x5b, + 0x32, 0x1a, 0x83, 0x4d, 0xd8, 0xd7, 0xdf, 0xa5, 0x56, 0x72, 0xb1, 0x07, + 0xd9, 0x6a, 0x26, 0xc0, 0x5e, 0xbe, 0xef, 0x61, 0x18, 0x31, 0x4c, 0x51, + 0x87, 0x6c, 0xf9, 0xd3, 0x75, 0x8a, 0x03, 0xe5, 0xa8, 0xde, 0xdc, 0xf0, + 0x7d, 0xac, 0x3e, 0x53, 0x6d, 0x7b, 0x2d, 0x5c, 0xcf, 0x25, 0x2f, 0x04, + 0x86, 0x11, 0xe4, 0xf1, 0xc1, 0x58, 0x98, 0x57, 0xf7, 0x18, 0x5a, 0xba, + 0x16, 0xa0, 0x0d, 0xa2, 0xb5, 0xe2, 0x7d, 0xb7, 0x51, 0x28, 0x14, 0x38, + 0xf8, 0x58, 0x0c, 0x72, 0xd2, 0xcf, 0x47, 0xea, 0x50, 0x0f, 0xd7, 0xc7, + 0x43, 0x12, 0x8b, 0x5d, 0xcc, 0x73, 0x21, 0x94, 0x8e, 0xca, 0x11, 0xe5, + 0x3d, 0xa2, 0x15, 0xe6, 0x5e, 0x79, 0xf2, 0x80, 0xa7, 0xc1, 0x7c, 0x7d, + 0xed, 0x9e, 0xee, 0xf5, 0x1a, 0xc8, 0xde, 0x02, 0x5f, 0x0c, 0x80, 0x5a, + 0x0d, 0x59, 0xe0, 0x68, 0x4e, 0xb5, 0xbd, 0x9a, 0xa9, 0x96, 0xed, 0xc6, + 0x47, 0x0a, 0xec, 0xbc, 0xb9, 0xc1, 0xe6, 0x47, 0x2d, 0xee, 0xbf, 0xd1, + 0x65, 0xc7, 0x13, 0xb5, 0xb6, 0x2c, 0xb2, 0x29, 0x9b, 0x14, 0x72, 0x80, + 0x08, 0xc6, 0xa1, 0x84, 0x4a, 0xc1, 0x6c, 0xed, 0xd9, 0x70, 0xcc, 0x47, + 0x1f, 0xfb, 0x81, 0xf8, 0xd9, 0xcb, 0x1c, 0x48, 0x84, 0x06, 0xd4, 0x51, + 0xb6, 0x0c, 0x24, 0xe1, 0x2f, 0x4a, 0x02, 0xb7, 0xdf, 0xa6, 0xe0, 0x95, + 0x46, 0x4e, 0x5d, 0xa3, 0x0b, 0xc1, 0x75, 0x34, 0xa3, 0xb4, 0x81, 0x50, + 0x63, 0xd5, 0xad, 0xa6, 0x72, 0x97, 0x0a, 0x5c, 0x1c, 0x96, 0x7d, 0xa3, + 0xb2, 0xc9, 0x78, 0xae, 0x09, 0x22, 0xcf, 0x38, 0x4d, 0x4a, 0x2d, 0x08, + 0x7b, 0x0d, 0xc3, 0xec, 0x6c, 0x23, 0x50, 0xc8, 0x41, 0x23, 0x48, 0xdf, + 0xe2, 0x1c, 0x9c, 0x0a, 0xf6, 0x3b, 0x8d, 0x73, 0x19, 0x81, 0x5b, 0x08, + 0x92, 0x7a, 0xe1, 0x85, 0x17, 0xb8, 0xf4, 0x4d, 0x0b, 0xf8, 0x01, 0x33, + 0x6d, 0x7e, 0xe7, 0xab, 0x6e, 0x00, 0xa9, 0xb9, 0x74, 0x62, 0x2c, 0xd9, + 0x8f, 0xec, 0xa6, 0x92, 0xf0, 0xd6, 0xc1, 0xfe, 0x59, 0xc3, 0x87, 0xf0, + 0xab, 0x10, 0x48, 0xa5, 0x2b, 0x74, 0xd3, 0xcf, 0x3d, 0xff, 0xfc, 0xf3, + 0xe8, 0x03, 0x3d, 0xd1, 0xb9, 0x97, 0x9f, 0x07, 0x14, 0xc8, 0xaa, 0x9b, + 0x4d, 0xdd, 0x2d, 0x7d, 0x4e, 0x77, 0x8f, 0xfc, 0x05, 0x36, 0x3b, 0xa5, + 0x59, 0x87, 0x7b, 0x75, 0xb2, 0x1f, 0x1d, 0x9f, 0x4b, 0xc5, 0xa7, 0xa5, + 0x53, 0x87, 0x6d, 0x41, 0xfc, 0x5c, 0x13, 0x0a, 0xde, 0xf5, 0x0d, 0xb7, + 0xaa, 0x7e, 0xc2, 0x86, 0x27, 0xd9, 0x7f, 0x18, 0xd6, 0xae, 0x2a, 0xe1, + 0x4c, 0x56, 0x21, 0x67, 0x30, 0x1e, 0x34, 0x4b, 0x1a, 0x32, 0xa8, 0xab, + 0x05, 0x63, 0x6e, 0xde, 0x8c, 0xc0, 0xec, 0x13, 0x78, 0x01, 0xc4, 0x28, + 0x84, 0x68, 0xa5, 0xfd, 0x15, 0xcc, 0x12, 0x1b, 0x6e, 0x54, 0xf6, 0x9b, + 0x7e, 0x89, 0xbd, 0x87, 0x6b, 0x9c, 0x3a, 0x3e, 0x86, 0x57, 0x57, 0x86, + 0xcd, 0xa2, 0x8d, 0x3f, 0xd5, 0xa1, 0x1e, 0xa8, 0xbd, 0xce, 0x23, 0x2b, + 0x57, 0x50, 0xfd, 0xa3, 0x83, 0x58, 0x57, 0xd8, 0x8c, 0x1d, 0x51, 0x30, + 0x7f, 0x2b, 0xf5, 0xe8, 0xdd, 0x86, 0x81, 0x65, 0x49, 0x46, 0x17, 0x95, + 0x38, 0xf8, 0x54, 0x2d, 0x32, 0x10, 0x0e, 0xf3, 0x59, 0x96, 0xe4, 0x50, + 0x4d, 0xc5, 0x63, 0xfb, 0x65, 0xf2, 0xbd, 0x06, 0x86, 0xd1, 0xc4, 0x9d, + 0x6c, 0x62, 0x18, 0xb0, 0xe4, 0xaa, 0x25, 0x51, 0x5f, 0x88, 0x33, 0xed, + 0x50, 0x2e, 0x95, 0xf1, 0xcf, 0xfa, 0x0a, 0x68, 0x97, 0x4b, 0x01, 0x02, + 0x43, 0xd0, 0x61, 0x43, 0x2a, 0xd8, 0x5e, 0x4b, 0xe0, 0x9f, 0xf5, 0x11, + 0x85, 0x18, 0xa6, 0xa5, 0x43, 0xb2, 0x8c, 0x85, 0x06, 0xb2, 0x21, 0x15, + 0x70, 0x55, 0x40, 0x21, 0x78, 0x87, 0x7d, 0xe9, 0x63, 0x07, 0xdf, 0x18, + 0x84, 0xe1, 0xc6, 0x9e, 0xac, 0x30, 0x7c, 0xed, 0x48, 0x94, 0x7f, 0x88, + 0x00, 0x4a, 0x6e, 0x0f, 0x06, 0xed, 0x5d, 0xd3, 0xc2, 0xf1, 0x1c, 0x44, + 0x4b, 0x20, 0xb0, 0x90, 0x2d, 0x75, 0x4d, 0xd5, 0xc9, 0x2a, 0xe5, 0x81, + 0x72, 0xe2, 0xb9, 0x86, 0x32, 0x18, 0xa6, 0xcc, 0x1b, 0x01, 0x22, 0xa0, + 0xd6, 0xba, 0x65, 0x1b, 0xa8, 0x0c, 0x54, 0xe0, 0xd0, 0xff, 0xc6, 0xf6, + 0x8b, 0x14, 0xe8, 0x6a, 0x1b, 0xf7, 0xb6, 0x3d, 0x86, 0x2f, 0x1b, 0x3f, + 0xa5, 0xd2, 0x37, 0x25, 0x15, 0x6c, 0xea, 0x4c, 0x50, 0x9e, 0x85, 0x20, + 0xab, 0x21, 0x03, 0x39, 0xee, 0xe3, 0x0c, 0x05, 0xe9, 0xed, 0x53, 0x37, + 0x7c, 0xe1, 0x77, 0x0c, 0xde, 0xf2, 0xf6, 0xfe, 0x08, 0x08, 0x15, 0x82, + 0xb2, 0xc6, 0xbf, 0xae, 0xc0, 0x5a, 0xe3, 0x5f, 0xff, 0x56, 0xb4, 0x0d, + 0x35, 0xf4, 0x9e, 0x5f, 0xe0, 0xb1, 0x2f, 0x1f, 0x88, 0x20, 0x5c, 0x61, + 0x58, 0x00, 0x77, 0xda, 0x41, 0x0c, 0xc4, 0x3f, 0x8a, 0x9b, 0xec, 0x75, + 0xec, 0x6b, 0xed, 0x83, 0xf1, 0x38, 0x4e, 0x1d, 0xa8, 0xf5, 0xbf, 0xfe, + 0xd4, 0x10, 0xce, 0xc4, 0x19, 0xec, 0xc1, 0x7e, 0xbe, 0xeb, 0x4d, 0xc2, + 0xd7, 0xe3, 0x6b, 0xfa, 0xae, 0xa7, 0x46, 0x13, 0x9d, 0xc0, 0xfe, 0xdb, + 0xff, 0xae, 0xc4, 0xdf, 0xff, 0x8f, 0x71, 0x08, 0xc2, 0xaf, 0x5b, 0xb6, + 0x81, 0x3d, 0xc7, 0x77, 0x41, 0x10, 0x9f, 0x1c, 0x48, 0xd6, 0xef, 0x79, + 0xa7, 0x4d, 0x3d, 0xff, 0xeb, 0xb0, 0x1c, 0x8a, 0x57, 0xad, 0xa0, 0x38, + 0xfe, 0x27, 0xf0, 0xc0, 0x7b, 0x10, 0xf7, 0xff, 0xad, 0x7a, 0x56, 0xbe, + 0xcd, 0xb0, 0x3d, 0x12, 0x41, 0xc0, 0xe4, 0x94, 0x8c, 0x6c, 0x8b, 0x3e, + 0x01, 0xdf, 0x51, 0xe9, 0x38, 0x73, 0xee, 0x04, 0x6f, 0x7a, 0xe3, 0x65, + 0x54, 0xff, 0xd1, 0xe1, 0xe5, 0xef, 0xbf, 0x40, 0xff, 0x82, 0xa5, 0x09, + 0xf7, 0xb4, 0xce, 0x9c, 0x3b, 0x11, 0xf9, 0x81, 0x2e, 0xef, 0x74, 0xa6, + 0x4c, 0x99, 0x32, 0x65, 0xca, 0x94, 0x29, 0x53, 0xa6, 0x4c, 0x99, 0x32, + 0x65, 0xca, 0x94, 0x29, 0x53, 0xa6, 0x4c, 0x99, 0x32, 0x65, 0xca, 0x94, + 0x29, 0x53, 0xa6, 0x4c, 0x99, 0x32, 0x65, 0x9a, 0x97, 0x32, 0xa8, 0x56, + 0xa6, 0x4c, 0x99, 0x32, 0x65, 0xca, 0xf4, 0x13, 0xa0, 0x08, 0xe4, 0xa1, + 0x95, 0xcc, 0x21, 0xa8, 0x69, 0x3e, 0xb2, 0x4c, 0x0b, 0x67, 0xd2, 0xc1, + 0x0b, 0xc0, 0x09, 0x9e, 0xe7, 0x61, 0x9a, 0xf1, 0x87, 0xd9, 0x22, 0x05, + 0x1a, 0x12, 0x39, 0x81, 0xd5, 0x67, 0x25, 0x00, 0x54, 0x9e, 0xe7, 0x25, + 0xd2, 0x12, 0x42, 0x5e, 0x42, 0xa0, 0x56, 0x69, 0xa0, 0x84, 0x33, 0xe5, + 0x30, 0xbc, 0x74, 0x98, 0xb1, 0x13, 0x63, 0x0a, 0xac, 0xe5, 0xc7, 0x30, + 0xad, 0x34, 0x58, 0x6b, 0xf8, 0x5a, 0x35, 0x09, 0x7f, 0xfb, 0x3d, 0x5f, + 0x60, 0xcb, 0xa7, 0x6e, 0x62, 0xfb, 0xa7, 0xf7, 0xb1, 0xfd, 0xd3, 0xfb, + 0xd8, 0xf2, 0xa9, 0x9b, 0x38, 0xf8, 0x8b, 0xbb, 0xf9, 0xe6, 0x15, 0x50, + 0x7b, 0x46, 0x4d, 0x06, 0x0b, 0xe1, 0x57, 0xdd, 0x14, 0xad, 0xce, 0x3b, + 0x87, 0x7b, 0x5e, 0xe4, 0xc9, 0x9b, 0xed, 0x7e, 0xbb, 0xb9, 0x77, 0x53, + 0xa1, 0x27, 0x39, 0xf1, 0x28, 0x9c, 0xe4, 0xe4, 0xa6, 0x3e, 0xf2, 0x2c, + 0xf4, 0x14, 0x68, 0xe6, 0xe6, 0x07, 0xff, 0x09, 0x75, 0xe8, 0xb0, 0x13, + 0x7d, 0x88, 0xd7, 0x90, 0x12, 0x52, 0x13, 0x6e, 0x57, 0xaf, 0x02, 0xd8, + 0x0f, 0xc0, 0xf0, 0xd5, 0xb0, 0xe1, 0x4e, 0x80, 0x57, 0x59, 0xfd, 0xfe, + 0xaf, 0xb2, 0x27, 0x80, 0xe8, 0xac, 0xbb, 0xe3, 0x36, 0x9c, 0xd3, 0xea, + 0xc3, 0xe2, 0xcd, 0xff, 0xf9, 0x20, 0x8d, 0x68, 0x56, 0xb4, 0xfa, 0x40, + 0x13, 0x80, 0x9c, 0xc4, 0xea, 0x35, 0x30, 0x7a, 0xf2, 0xf8, 0x33, 0x4d, + 0x0a, 0x86, 0xc0, 0xf5, 0x7c, 0x4a, 0x8b, 0x2c, 0x7c, 0x5f, 0xa5, 0xd9, + 0xf5, 0x7c, 0x44, 0xaf, 0x88, 0xbe, 0x14, 0xb7, 0x4c, 0x03, 0xd7, 0x4b, + 0x01, 0x20, 0x52, 0x5f, 0x92, 0xfb, 0x72, 0x76, 0xa0, 0x56, 0x68, 0x5f, + 0xc5, 0x27, 0xdb, 0xe2, 0x0b, 0xbf, 0x66, 0x0d, 0xc1, 0x54, 0xae, 0xe7, + 0x23, 0x5b, 0x02, 0xdb, 0x14, 0xd0, 0x92, 0x14, 0x0c, 0x81, 0xe3, 0xa9, + 0x55, 0x9c, 0xc3, 0xb0, 0xce, 0xa4, 0xd7, 0xf1, 0x5d, 0x10, 0x39, 0xa2, + 0xd5, 0xac, 0xdb, 0x94, 0x13, 0x0a, 0x48, 0x14, 0x40, 0xb1, 0xf4, 0xf8, + 0xa2, 0xf8, 0x5b, 0x92, 0x42, 0xaf, 0x81, 0x13, 0x40, 0x49, 0xca, 0x57, + 0xc4, 0xf1, 0x21, 0x44, 0x57, 0xa0, 0x96, 0x61, 0xe4, 0xf1, 0x53, 0x13, + 0xdf, 0x3a, 0xc9, 0xef, 0xa9, 0xcf, 0xe9, 0x27, 0x99, 0x66, 0x6d, 0xbf, + 0x03, 0x50, 0x6b, 0x3e, 0xf0, 0xac, 0x0b, 0x91, 0xb2, 0x1b, 0xbf, 0x83, + 0x0d, 0xbf, 0x11, 0x4d, 0x5c, 0x49, 0xab, 0xd3, 0xa4, 0x91, 0x79, 0xc5, + 0x31, 0xed, 0x27, 0x57, 0xda, 0x0e, 0xd4, 0x6d, 0x02, 0x46, 0xc1, 0x28, + 0x44, 0xe7, 0x9a, 0xb2, 0x89, 0xc1, 0x85, 0xc5, 0xdb, 0x69, 0xd2, 0x8d, + 0x94, 0x92, 0x86, 0xdf, 0xe8, 0x7c, 0xae, 0x0b, 0xac, 0x65, 0x2e, 0x39, + 0x75, 0x07, 0xa3, 0xc7, 0xa0, 0xe1, 0x4b, 0xf2, 0xda, 0x6a, 0xed, 0xd2, + 0x97, 0x6d, 0x2d, 0x2e, 0xe7, 0x8c, 0x83, 0x94, 0x12, 0xbb, 0x68, 0x47, + 0xbf, 0x5c, 0x6f, 0x4a, 0xfd, 0xc6, 0x8d, 0x2e, 0xc0, 0xa9, 0x10, 0xf4, + 0xa7, 0x83, 0xf4, 0x42, 0x9d, 0x3a, 0x7d, 0x2a, 0x82, 0x74, 0x85, 0x93, + 0x89, 0xc2, 0xfc, 0x1c, 0x09, 0x6e, 0x5d, 0x03, 0x28, 0x9e, 0xd3, 0x9f, + 0xab, 0xc4, 0x9b, 0xf6, 0xd1, 0xdf, 0x1f, 0x77, 0xda, 0x0d, 0x20, 0x0b, + 0x92, 0x42, 0x4f, 0x21, 0x06, 0x57, 0x85, 0xa0, 0x2a, 0xbf, 0xfd, 0x77, + 0x11, 0xc1, 0xb5, 0x82, 0x73, 0xfa, 0x7e, 0x5a, 0xb3, 0x9d, 0x9b, 0xcd, + 0xae, 0x1e, 0xa6, 0x5b, 0x5a, 0xf4, 0xe3, 0x4e, 0xe9, 0xe9, 0x14, 0x2e, + 0x9a, 0xac, 0x25, 0x04, 0xfe, 0x8c, 0x54, 0xf7, 0xb7, 0x77, 0x7e, 0xe5, + 0xee, 0x1f, 0xcf, 0xcb, 0x57, 0x77, 0x85, 0x73, 0x79, 0xd3, 0x60, 0x28, + 0x7d, 0x8e, 0x6f, 0x08, 0x84, 0x9a, 0x0d, 0x20, 0x35, 0x9b, 0x06, 0x07, + 0x3a, 0xe1, 0xa4, 0x3a, 0x9f, 0x4b, 0xfb, 0x4c, 0x83, 0xbe, 0xd2, 0xe9, + 0xea, 0xb4, 0x1f, 0xea, 0x08, 0x93, 0x5d, 0x41, 0x61, 0xdd, 0xae, 0xa5, + 0xdb, 0xf5, 0xe9, 0x60, 0xad, 0xd9, 0xe2, 0xd5, 0xd3, 0xb9, 0xea, 0xce, + 0x3b, 0xb9, 0xf3, 0xf3, 0x00, 0x77, 0x76, 0x0c, 0x3b, 0x80, 0x9a, 0x80, + 0xb8, 0x9a, 0xf9, 0x49, 0x7e, 0xea, 0x5d, 0xdc, 0xf0, 0xa9, 0x79, 0x7a, + 0xee, 0xa0, 0xd9, 0x80, 0x5a, 0x73, 0xc9, 0x99, 0x51, 0x2b, 0x8f, 0x3b, + 0x5a, 0x5e, 0xe5, 0x48, 0x89, 0x33, 0xe9, 0x31, 0x3a, 0x60, 0x26, 0xfc, + 0xfa, 0x3e, 0xd8, 0x42, 0x24, 0xfc, 0xbe, 0x56, 0xe9, 0x98, 0xaf, 0x2e, + 0x34, 0x8e, 0x4e, 0xe1, 0x1a, 0xcf, 0x8d, 0x81, 0xb0, 0x90, 0xd3, 0x5a, + 0x3d, 0x29, 0xbc, 0xb6, 0x54, 0x5d, 0x25, 0xba, 0xe2, 0x5e, 0x13, 0xea, + 0x9d, 0x60, 0x04, 0x3f, 0x22, 0x1d, 0x39, 0x05, 0x96, 0x99, 0x84, 0x79, + 0xae, 0x5a, 0x0d, 0x87, 0x0f, 0x75, 0xf4, 0xbe, 0x7a, 0xb9, 0xda, 0xae, + 0x58, 0xd1, 0x7e, 0xae, 0xf2, 0x24, 0x30, 0x23, 0xa1, 0x47, 0xe0, 0xa3, + 0xc2, 0x1b, 0x57, 0xdf, 0xd4, 0x06, 0xd7, 0xba, 0x10, 0xa0, 0x16, 0x28, + 0x18, 0x57, 0xa7, 0xf0, 0xde, 0x93, 0x7b, 0x30, 0x59, 0x87, 0x37, 0x39, + 0xf7, 0x7d, 0xb4, 0x07, 0x6c, 0x6c, 0xbb, 0xdc, 0xe6, 0xee, 0x68, 0x61, + 0xe7, 0xe3, 0x47, 0x4a, 0xf9, 0x43, 0xd8, 0x1a, 0xc7, 0xa9, 0x77, 0x9f, + 0x8c, 0x9f, 0xd6, 0xa6, 0xab, 0x47, 0x19, 0xeb, 0x09, 0xea, 0x3c, 0x0b, + 0x21, 0x4f, 0x01, 0x9a, 0x70, 0xf2, 0xaf, 0x76, 0xb1, 0xe1, 0xda, 0x60, + 0xf2, 0xbd, 0x50, 0xef, 0x56, 0xb3, 0xe5, 0xb3, 0xe3, 0xc4, 0x41, 0x96, + 0x7c, 0x70, 0x83, 0xf2, 0xbf, 0xa0, 0x84, 0x68, 0xb9, 0x8c, 0x3d, 0x76, + 0x2f, 0x65, 0xc3, 0x86, 0x5e, 0x0b, 0x13, 0xc8, 0x6b, 0x30, 0xd2, 0xb2, + 0x05, 0x85, 0x82, 0x82, 0x1b, 0x14, 0x45, 0x72, 0x3f, 0x54, 0x63, 0xc8, + 0xc2, 0x0a, 0x26, 0xe8, 0xb8, 0x0b, 0x0b, 0xc9, 0xfd, 0xf0, 0x5a, 0x4d, + 0x9b, 0x82, 0x91, 0x7c, 0xc7, 0x0d, 0xad, 0x0e, 0x55, 0xe8, 0x29, 0x60, + 0x05, 0x60, 0x5e, 0x99, 0xda, 0x07, 0x28, 0x59, 0x60, 0x2d, 0x2c, 0x61, + 0x84, 0xf0, 0x1f, 0x6d, 0x3f, 0x94, 0xfc, 0x90, 0x4d, 0x61, 0x42, 0x20, + 0x07, 0x55, 0xac, 0xfa, 0xbe, 0x9e, 0x86, 0x30, 0x5e, 0x7d, 0x3f, 0x9d, + 0x8e, 0x74, 0x1a, 0x46, 0x7a, 0xe3, 0x3a, 0xce, 0xc8, 0x95, 0xc9, 0xfb, + 0x61, 0xe6, 0x5c, 0x0a, 0x0b, 0x4b, 0x84, 0x93, 0xf3, 0xc5, 0x32, 0x95, + 0x66, 0xdf, 0xb4, 0x10, 0x7d, 0x0e, 0xf4, 0x19, 0x88, 0xbe, 0x38, 0x8e, + 0x72, 0xbf, 0x9a, 0xa1, 0x25, 0x7a, 0xa0, 0x10, 0x00, 0x18, 0x44, 0x6e, + 0xee, 0xfa, 0x9a, 0x0e, 0x8d, 0x0a, 0x7d, 0x77, 0x2a, 0xe1, 0x3b, 0x9d, + 0x4b, 0x83, 0x39, 0xf5, 0xf3, 0x69, 0x18, 0x55, 0xd8, 0x12, 0xcc, 0xcf, + 0x71, 0x1c, 0xda, 0x90, 0xa9, 0xe3, 0x6e, 0x69, 0x9d, 0x2d, 0x7e, 0x00, + 0x63, 0xe6, 0x14, 0x69, 0xfd, 0x7b, 0xbd, 0x96, 0xf9, 0x3e, 0x97, 0xae, + 0x6a, 0x48, 0x4a, 0x43, 0x82, 0xea, 0x13, 0x3e, 0x58, 0x02, 0x7f, 0xda, + 0xe5, 0xe0, 0xe7, 0x55, 0xbe, 0x60, 0xb5, 0x6c, 0x76, 0xfd, 0xd1, 0x49, + 0x00, 0xcc, 0xbe, 0x10, 0xbc, 0xd8, 0xc4, 0x7d, 0xd6, 0x65, 0xcf, 0xb3, + 0x0a, 0x66, 0x7b, 0xdb, 0x5d, 0x65, 0x9c, 0xa6, 0x8c, 0xda, 0x89, 0xe6, + 0x35, 0xc0, 0x94, 0x64, 0xf8, 0x7a, 0xc1, 0xd8, 0x57, 0x1a, 0x88, 0x62, + 0x01, 0x77, 0x5c, 0xb2, 0xf9, 0x93, 0x63, 0x6c, 0xfa, 0x7d, 0x35, 0x79, + 0x6d, 0xc7, 0x6f, 0x8d, 0x45, 0x93, 0x1b, 0x01, 0xbc, 0xa7, 0x5d, 0x76, + 0x3c, 0x0d, 0xee, 0x19, 0x97, 0xfb, 0x7f, 0x7f, 0x18, 0xf7, 0x4c, 0x32, + 0x5f, 0xb2, 0x5b, 0x25, 0xc6, 0x1f, 0x81, 0xa1, 0x9b, 0x89, 0xb6, 0x3b, + 0xee, 0xac, 0x03, 0x50, 0x6b, 0x59, 0x8c, 0x1f, 0x87, 0xb1, 0xc7, 0x8e, + 0x62, 0xf7, 0x17, 0xa3, 0x30, 0xfb, 0xb7, 0x39, 0x38, 0x67, 0x94, 0x9f, + 0x2f, 0xec, 0x5e, 0x91, 0xd8, 0xdf, 0x7b, 0x1c, 0xc6, 0x1f, 0xcd, 0x83, + 0xd9, 0x04, 0x2f, 0xcf, 0xd0, 0x8d, 0x4d, 0x2a, 0xbf, 0x51, 0x0f, 0xe2, + 0xb2, 0xd9, 0x7f, 0x1c, 0x2a, 0x8f, 0x26, 0xed, 0x01, 0x38, 0x27, 0x14, + 0x9c, 0x24, 0x04, 0x6b, 0xd1, 0x6a, 0xc6, 0x93, 0xc0, 0x5b, 0x0a, 0xa2, + 0x05, 0xaa, 0x9d, 0xed, 0x6b, 0x13, 0x97, 0x43, 0xa0, 0x96, 0x0e, 0x11, + 0xf1, 0x3d, 0x89, 0xf4, 0x9b, 0x98, 0x8b, 0x0a, 0x48, 0x09, 0x27, 0xa7, + 0x60, 0x49, 0xf0, 0xee, 0x4a, 0x09, 0xcd, 0x9c, 0x6a, 0x47, 0xe4, 0xf1, + 0x41, 0x7a, 0x90, 0x13, 0x0a, 0xb0, 0x05, 0x11, 0x50, 0x4b, 0x4a, 0xd5, + 0xc6, 0xa9, 0x1c, 0x75, 0x28, 0x5c, 0x58, 0x73, 0xef, 0xdf, 0x95, 0xfe, + 0xff, 0x08, 0xd7, 0x7a, 0x0e, 0xb8, 0x02, 0x78, 0x47, 0x70, 0xfc, 0xdf, + 0xb5, 0x73, 0x97, 0x01, 0xcc, 0xbc, 0x9a, 0x70, 0x9b, 0xb7, 0x34, 0xb8, + 0xd4, 0x9e, 0xdd, 0x0e, 0x87, 0x88, 0x21, 0x52, 0x3a, 0x78, 0xea, 0x86, + 0xdd, 0x0e, 0x07, 0x74, 0xe8, 0x55, 0x07, 0xb0, 0xd6, 0x9e, 0xdd, 0x31, + 0xb0, 0x2a, 0x84, 0x5d, 0xed, 0xd9, 0xed, 0x44, 0x61, 0xd3, 0xfb, 0xac, + 0xb7, 0xb9, 0x61, 0xb7, 0x93, 0x68, 0x2b, 0xec, 0x49, 0xa5, 0xa7, 0xd3, + 0x7e, 0x5a, 0xe9, 0xb4, 0xad, 0x0b, 0xec, 0xea, 0xfb, 0xeb, 0x02, 0x60, + 0x56, 0x37, 0xe9, 0xd7, 0x1d, 0x6e, 0x6f, 0x00, 0x56, 0xef, 0x56, 0x90, + 0x2d, 0xfd, 0x7c, 0x27, 0xa5, 0x81, 0x5a, 0xdd, 0x55, 0x6c, 0x77, 0xba, + 0x05, 0x05, 0xca, 0x7a, 0x38, 0xd8, 0xd7, 0xf5, 0x70, 0xe0, 0xff, 0x96, + 0x3a, 0x6c, 0xd5, 0xc2, 0x6e, 0x55, 0x5e, 0xcf, 0x75, 0x80, 0x79, 0xcd, + 0x26, 0x71, 0x44, 0xab, 0xdb, 0x3f, 0xe2, 0xb7, 0xbb, 0x05, 0x70, 0x3e, + 0xdd, 0x5d, 0x1c, 0xf1, 0x15, 0x6c, 0xab, 0x9b, 0xcd, 0x47, 0xb5, 0xfe, + 0x81, 0x23, 0x3e, 0x04, 0x7e, 0x47, 0x26, 0x61, 0x6c, 0x52, 0x41, 0xb2, + 0x04, 0x44, 0xee, 0xba, 0x7f, 0x5d, 0x23, 0x93, 0x30, 0xd6, 0xc1, 0x4e, + 0x27, 0x55, 0xc7, 0xb5, 0x92, 0x32, 0xc8, 0xef, 0xc6, 0x9e, 0xf2, 0x19, + 0xbe, 0x26, 0x0e, 0x33, 0x7c, 0x97, 0xc9, 0xfa, 0x6b, 0xbe, 0x4a, 0x7d, + 0xc6, 0xe3, 0x06, 0x80, 0x1f, 0xc4, 0x61, 0x86, 0xef, 0x50, 0xdb, 0xa1, + 0x92, 0xc5, 0x78, 0x30, 0xf9, 0x7f, 0xc3, 0x02, 0xf0, 0x02, 0x5e, 0xc2, + 0x0d, 0x5a, 0x5c, 0x37, 0xa0, 0x60, 0x85, 0x63, 0x0f, 0xdd, 0x0e, 0x40, + 0xc9, 0xed, 0x94, 0xfe, 0x54, 0x9b, 0x49, 0x83, 0x02, 0x58, 0x33, 0x16, + 0x96, 0x09, 0x3b, 0x9e, 0xb9, 0x81, 0xfb, 0x6f, 0xfe, 0x2a, 0x7b, 0x9e, + 0xfd, 0x28, 0x8b, 0xeb, 0xf7, 0xa9, 0xeb, 0x6c, 0x99, 0xd4, 0x66, 0x24, + 0xb4, 0x54, 0xbf, 0x92, 0x6b, 0xdc, 0xaf, 0xe2, 0x98, 0xd9, 0x02, 0xc0, + 0xfe, 0xfa, 0x16, 0x6a, 0xcf, 0xfa, 0xdc, 0xb6, 0x62, 0x5b, 0x04, 0x3c, + 0x96, 0xad, 0xb9, 0xcb, 0x6c, 0xa3, 0x77, 0x08, 0x7f, 0x7a, 0x3c, 0x3a, + 0x16, 0x86, 0x01, 0x33, 0x46, 0x22, 0x9d, 0x46, 0xef, 0x0a, 0xfc, 0x69, + 0x05, 0x4d, 0x68, 0x4c, 0x7b, 0x94, 0xfa, 0x46, 0x23, 0xa0, 0x56, 0xa8, + 0xbc, 0x61, 0x80, 0x0f, 0xbe, 0x74, 0x71, 0xbd, 0x93, 0xf8, 0xd2, 0xc3, + 0x10, 0x36, 0x79, 0xc3, 0x02, 0xbf, 0x00, 0x78, 0xf8, 0xf2, 0x50, 0x60, + 0xc3, 0xa0, 0x5c, 0xbc, 0x89, 0x6a, 0xbd, 0x12, 0xf8, 0x4b, 0xd6, 0xaf, + 0x01, 0x9c, 0xa9, 0x2a, 0xf7, 0xd6, 0x0f, 0x41, 0x6b, 0x53, 0x00, 0xd6, + 0x52, 0x50, 0x9a, 0x83, 0xa7, 0xb7, 0x00, 0xdb, 0x01, 0x18, 0x5d, 0x04, + 0xf7, 0x3e, 0x5e, 0xa3, 0x68, 0x54, 0x54, 0xda, 0x83, 0x8b, 0x0d, 0xfb, + 0x8c, 0x45, 0x4e, 0xbb, 0xfe, 0x1c, 0x48, 0x39, 0x5f, 0x74, 0xe9, 0x85, + 0xea, 0x35, 0x80, 0x76, 0x5d, 0x20, 0x4c, 0xeb, 0x7c, 0x54, 0x3f, 0x8f, + 0x73, 0x75, 0x62, 0x08, 0x57, 0x71, 0x9e, 0x36, 0xf4, 0x70, 0x61, 0x2f, + 0xd4, 0xc7, 0x1f, 0x80, 0x07, 0x3e, 0xae, 0x40, 0x5b, 0x5f, 0xbb, 0x02, + 0xde, 0xf7, 0x1c, 0xac, 0x3c, 0xa6, 0x81, 0xd5, 0x81, 0xc9, 0x23, 0xea, + 0xf8, 0x7d, 0x7d, 0xf0, 0x35, 0x60, 0x72, 0x12, 0xfe, 0xf7, 0xe5, 0x70, + 0xdd, 0xb1, 0x98, 0x65, 0xf5, 0x5a, 0xeb, 0xf1, 0xc7, 0x81, 0xeb, 0x26, + 0x13, 0x20, 0xad, 0xc7, 0x83, 0x38, 0x21, 0x06, 0x6c, 0xed, 0x24, 0x48, + 0x6b, 0x90, 0x88, 0xf7, 0xf5, 0x01, 0x93, 0xb0, 0x32, 0x05, 0xd4, 0x5a, + 0xc9, 0x8f, 0x08, 0xa8, 0x35, 0x87, 0x14, 0x20, 0x2a, 0x99, 0xd7, 0xa8, + 0xe3, 0xee, 0x7d, 0xbf, 0x7e, 0x00, 0x8f, 0x36, 0xcd, 0x38, 0x6f, 0x4c, + 0x82, 0xb5, 0xda, 0xc3, 0x28, 0xe0, 0x95, 0x17, 0xc5, 0xf9, 0xda, 0x48, + 0xe2, 0xcf, 0x84, 0x20, 0x30, 0x33, 0x00, 0x6c, 0x99, 0x81, 0xfd, 0x74, + 0x8b, 0x2a, 0x1e, 0x43, 0x10, 0xb9, 0xf6, 0xf1, 0x04, 0x72, 0x22, 0x06, + 0xc0, 0x87, 0x30, 0xad, 0x9c, 0x88, 0xfc, 0xfa, 0x29, 0x60, 0x36, 0xc4, + 0xf7, 0x41, 0x08, 0xa1, 0x16, 0x93, 0x11, 0x02, 0xd3, 0xb4, 0x95, 0x7b, + 0x4b, 0xd2, 0x94, 0xe0, 0xcf, 0x34, 0xb0, 0x4c, 0x55, 0x97, 0x28, 0x18, + 0x06, 0xb2, 0xd5, 0x54, 0xfd, 0xf5, 0x3d, 0xaa, 0x2f, 0xbb, 0x50, 0xb0, + 0x38, 0xfa, 0xb5, 0x1d, 0x14, 0x17, 0x95, 0xb0, 0x7a, 0x03, 0xa0, 0xf6, + 0x89, 0xfd, 0x6d, 0x71, 0x39, 0xf5, 0x0a, 0x30, 0xd2, 0xf5, 0x4e, 0x94, + 0x16, 0x95, 0xc1, 0x9b, 0x7d, 0xac, 0x2b, 0x82, 0x5f, 0xe9, 0xe3, 0xd7, + 0x42, 0x90, 0x97, 0x92, 0x74, 0x48, 0xd1, 0x52, 0x80, 0xa9, 0xb4, 0x22, + 0xb7, 0xa0, 0x5c, 0x17, 0xb2, 0x93, 0xbf, 0x7c, 0xdb, 0x42, 0x3c, 0xd0, + 0xe4, 0x36, 0xb3, 0xc0, 0xbd, 0x2d, 0xb8, 0xc7, 0x77, 0xd9, 0x66, 0xa8, + 0x76, 0xdd, 0x0a, 0x21, 0x38, 0x20, 0xc0, 0x6b, 0x35, 0x68, 0x86, 0x63, + 0xa2, 0x02, 0xa4, 0xdf, 0xa0, 0x26, 0xb6, 0x70, 0xff, 0xef, 0xaa, 0xbe, + 0x88, 0x2f, 0xfc, 0x5f, 0xa8, 0xc5, 0x9e, 0x52, 0x6a, 0x84, 0xf5, 0x0b, + 0xed, 0x71, 0x47, 0x20, 0xaf, 0x54, 0x83, 0x57, 0x4f, 0x93, 0xe8, 0x51, + 0x24, 0xe2, 0xf4, 0xa2, 0x47, 0xdd, 0xe4, 0x07, 0xa0, 0x2d, 0x89, 0x54, + 0xf7, 0xa6, 0x15, 0xc6, 0xd5, 0x44, 0xa1, 0xbc, 0xf2, 0x34, 0x45, 0x93, + 0x42, 0x0b, 0x64, 0x2e, 0x1f, 0x41, 0xb4, 0x42, 0xc8, 0x56, 0x9e, 0x7c, + 0x04, 0xff, 0xda, 0x40, 0x33, 0xf9, 0x76, 0xc9, 0x26, 0x35, 0xfd, 0xbe, + 0xa2, 0xf2, 0x93, 0xc5, 0x01, 0xb8, 0xac, 0xa1, 0xa5, 0xfb, 0xd4, 0xbc, + 0xf2, 0x7d, 0xa5, 0x05, 0xd6, 0xa5, 0xd1, 0xfe, 0x2b, 0xad, 0x57, 0xb9, + 0x38, 0x77, 0xd1, 0x79, 0x6f, 0xcf, 0x3e, 0xff, 0x2a, 0x6f, 0x78, 0xd3, + 0x8b, 0x2c, 0xb0, 0x2e, 0xe5, 0x07, 0xd6, 0x4c, 0xdb, 0xf9, 0x4b, 0x78, + 0x1b, 0xdf, 0xe3, 0xdb, 0x1d, 0xc3, 0xbf, 0x75, 0xb0, 0x1f, 0x6b, 0x61, + 0x2f, 0x27, 0xc6, 0xaa, 0x09, 0xa0, 0x96, 0x3b, 0x03, 0x4b, 0xcb, 0x49, + 0xaa, 0x52, 0xa7, 0xf0, 0x21, 0x5c, 0x2a, 0x84, 0x54, 0x85, 0xd7, 0x94, + 0xde, 0x8f, 0x60, 0x57, 0xe7, 0xce, 0xc1, 0xab, 0x44, 0x20, 0x2a, 0x3d, + 0xfc, 0xf3, 0xcf, 0x3f, 0x9f, 0x80, 0x62, 0xa5, 0x6d, 0x02, 0xf0, 0xb2, + 0x02, 0x6e, 0x2d, 0xb0, 0x2e, 0x55, 0x80, 0xae, 0x40, 0xa1, 0xbd, 0x17, + 0x5f, 0x3e, 0xa7, 0xfc, 0xbe, 0xfc, 0x7c, 0x64, 0x53, 0x3f, 0xaf, 0xc3, + 0xc7, 0x16, 0x58, 0x97, 0x72, 0x29, 0x71, 0xda, 0x80, 0x44, 0x9c, 0x2f, + 0x9e, 0x3b, 0xc7, 0xa5, 0x0b, 0x16, 0xb4, 0x5d, 0x4f, 0x3a, 0x9d, 0x4a, + 0x3f, 0x37, 0xeb, 0x73, 0xde, 0xf5, 0x50, 0x35, 0x02, 0x69, 0x6d, 0xfb, + 0xbd, 0xdb, 0xf0, 0x6a, 0x35, 0xa0, 0x8c, 0x53, 0x77, 0xa8, 0x4d, 0x3a, + 0x98, 0x3d, 0xc9, 0xdf, 0x77, 0x08, 0xd4, 0x02, 0x30, 0xfb, 0x04, 0x05, + 0x61, 0xd1, 0x08, 0x00, 0xfb, 0xde, 0x8c, 0xc0, 0xec, 0x91, 0x78, 0x33, + 0xc1, 0x0b, 0xe5, 0x29, 0x5b, 0x4d, 0x5f, 0xe2, 0xd5, 0x1d, 0xee, 0xff, + 0xcc, 0x5a, 0x4e, 0x8d, 0x57, 0x31, 0x8b, 0x36, 0x07, 0x8f, 0x39, 0x6c, + 0xb9, 0x79, 0x98, 0xb1, 0x47, 0x0f, 0x00, 0x30, 0xb2, 0xac, 0x48, 0xf5, + 0x89, 0xf6, 0x3c, 0x68, 0xf3, 0xe7, 0x0e, 0x62, 0x05, 0xe6, 0x0e, 0xd6, + 0x1a, 0x8c, 0x96, 0xad, 0x44, 0xee, 0x2c, 0x7a, 0x04, 0x55, 0xdf, 0xc1, + 0xb2, 0x54, 0x9e, 0x50, 0x5e, 0x08, 0x76, 0xd1, 0xa6, 0x7a, 0x58, 0xb5, + 0xaf, 0xac, 0xa2, 0xc1, 0xd8, 0xb8, 0xa0, 0x6c, 0xd8, 0x54, 0x7d, 0x87, + 0x52, 0xce, 0xc3, 0xa9, 0x4b, 0x6a, 0xb5, 0x1a, 0x1b, 0x56, 0x8d, 0xe0, + 0x6b, 0x0b, 0x9e, 0x49, 0x09, 0xee, 0xa4, 0x8b, 0xdd, 0x6b, 0x63, 0x2c, + 0x34, 0xf0, 0xcf, 0x4a, 0xb5, 0x75, 0x25, 0x88, 0x00, 0xa0, 0x35, 0xe3, + 0x22, 0x66, 0x0c, 0x64, 0x31, 0x5c, 0xec, 0xc7, 0x57, 0xef, 0xf6, 0x39, + 0x05, 0xd3, 0x92, 0xe7, 0x02, 0x48, 0x16, 0x21, 0xb0, 0x5c, 0x46, 0x65, + 0x9a, 0x6c, 0x68, 0xf7, 0xb2, 0x15, 0x0f, 0x71, 0x08, 0xa1, 0xf2, 0x84, + 0xe1, 0x6b, 0x47, 0x70, 0x3d, 0x47, 0x7d, 0xbb, 0xb3, 0x20, 0xee, 0x9b, + 0x0d, 0xe1, 0xe4, 0xee, 0xb4, 0x8b, 0x10, 0x50, 0x73, 0x3c, 0xa4, 0xef, + 0x22, 0x0c, 0x8b, 0x06, 0x60, 0x19, 0x16, 0xd5, 0xc9, 0xd9, 0x17, 0x33, + 0xa9, 0x9e, 0xae, 0xb1, 0xe7, 0xf8, 0x2e, 0x76, 0xde, 0xb1, 0x93, 0xca, + 0x40, 0x85, 0x91, 0x49, 0x55, 0x1e, 0x3c, 0x17, 0xe4, 0x26, 0x83, 0xaf, + 0x7e, 0x94, 0x89, 0x8b, 0xbe, 0x08, 0xc0, 0x15, 0x18, 0xdc, 0x63, 0x9c, + 0x53, 0x10, 0xa8, 0xfe, 0x18, 0xa6, 0x95, 0xd8, 0x47, 0xc1, 0xb5, 0x42, + 0xb0, 0x56, 0x04, 0x90, 0xd2, 0xf4, 0x96, 0xc1, 0xfe, 0x08, 0x92, 0xd5, + 0x67, 0x0e, 0x30, 0xf4, 0x1e, 0x05, 0xf0, 0x4a, 0x6f, 0xd3, 0xea, 0x04, + 0xd6, 0xa2, 0x5f, 0x3d, 0xf5, 0x1b, 0xec, 0x9b, 0xd8, 0xe7, 0x24, 0xc7, + 0x31, 0x22, 0xe8, 0x17, 0xf0, 0x76, 0x57, 0x95, 0x83, 0xf6, 0x60, 0x3f, + 0x3f, 0x1f, 0xd8, 0x79, 0xa7, 0x1e, 0xcf, 0xd7, 0x13, 0x41, 0x23, 0xb8, + 0x56, 0xa8, 0x7d, 0xce, 0x9e, 0xe8, 0x9a, 0xf6, 0x4c, 0xed, 0x8a, 0xdc, + 0xc5, 0x90, 0x01, 0xff, 0x87, 0x43, 0x7d, 0xeb, 0x56, 0x8a, 0xc7, 0xb6, + 0xc2, 0x3b, 0x6d, 0x78, 0xe0, 0x3d, 0x00, 0xd4, 0x97, 0x6f, 0xa5, 0xf8, + 0xf0, 0x2d, 0xf0, 0xcc, 0x77, 0x70, 0xa5, 0xc3, 0x58, 0xb5, 0xc2, 0xce, + 0x3b, 0x76, 0xb2, 0xf1, 0x41, 0x55, 0xb3, 0x4b, 0xdf, 0xc7, 0x97, 0x5e, + 0x71, 0xe8, 0x5f, 0xb0, 0x94, 0x97, 0x5e, 0x51, 0xbf, 0xd1, 0x37, 0xbd, + 0xf1, 0x32, 0x5e, 0x7a, 0x45, 0xc1, 0xb5, 0x74, 0x85, 0x80, 0xad, 0x97, + 0xbf, 0xff, 0x42, 0xe4, 0x07, 0xa0, 0x37, 0x80, 0xa4, 0x65, 0xca, 0x94, + 0x29, 0x53, 0xa6, 0x4c, 0x99, 0x32, 0x65, 0xca, 0x94, 0x29, 0x53, 0xa6, + 0x4c, 0x99, 0x32, 0x65, 0xca, 0x94, 0x29, 0x53, 0xa6, 0x4c, 0x99, 0x32, + 0x65, 0xca, 0x94, 0x29, 0x53, 0xa6, 0x0b, 0x53, 0x06, 0xd5, 0xca, 0x94, + 0x29, 0x53, 0xa6, 0x4c, 0x99, 0x7e, 0x02, 0x14, 0x7e, 0x7c, 0xde, 0x6d, + 0xd5, 0x65, 0xfd, 0x03, 0xdd, 0x10, 0x2e, 0x24, 0x67, 0x3a, 0xaf, 0xc4, + 0x1c, 0xda, 0x08, 0xa1, 0x2a, 0xa6, 0x69, 0xc6, 0x80, 0x95, 0x39, 0xe2, + 0x2f, 0x5f, 0x5d, 0xa6, 0xf6, 0x5c, 0xad, 0x0d, 0xa8, 0x25, 0x84, 0xc0, + 0x99, 0x52, 0x20, 0x98, 0x43, 0x47, 0x0e, 0x45, 0xc7, 0x76, 0x9f, 0xfa, + 0xe8, 0xd0, 0xf5, 0xdc, 0x68, 0x55, 0xe4, 0x50, 0x43, 0x43, 0xc3, 0x58, + 0xa6, 0x89, 0xd9, 0x1f, 0x83, 0xb5, 0xf4, 0x74, 0xbc, 0xf7, 0xb4, 0xa0, + 0x8c, 0xa4, 0x2a, 0x04, 0x46, 0x00, 0x8c, 0x09, 0x61, 0x56, 0xae, 0x37, + 0xf7, 0xe4, 0x78, 0x3d, 0x8d, 0x69, 0xf7, 0xb4, 0x1b, 0xa8, 0xfb, 0x56, + 0xe8, 0x29, 0x24, 0xe0, 0x34, 0xdd, 0x3e, 0x7c, 0xd6, 0xfd, 0x9a, 0x98, + 0x58, 0x46, 0x01, 0x7f, 0x5a, 0xbb, 0x87, 0x39, 0x95, 0xc6, 0xce, 0xe1, + 0xe7, 0x98, 0x0d, 0x3a, 0x64, 0x81, 0x13, 0x5c, 0xaf, 0x61, 0x40, 0x21, + 0x0f, 0x8d, 0x26, 0x8d, 0x67, 0x94, 0xfd, 0xfb, 0x3f, 0x57, 0x62, 0xf3, + 0x27, 0x6a, 0x11, 0x4c, 0x0b, 0x60, 0xc9, 0x8a, 0xe4, 0xca, 0x93, 0x87, + 0xee, 0xdb, 0x0d, 0x8d, 0x60, 0x62, 0xcb, 0x22, 0x03, 0x4e, 0x6b, 0x30, + 0xad, 0x50, 0xfa, 0x71, 0xf0, 0xc1, 0xb4, 0x65, 0x1a, 0x0a, 0x70, 0x15, + 0xad, 0x96, 0xac, 0xbe, 0x0e, 0xb7, 0xfa, 0x02, 0xe0, 0x54, 0x00, 0x97, + 0xd2, 0x27, 0xd6, 0x14, 0x84, 0x00, 0x11, 0x00, 0xc0, 0x00, 0x64, 0x0c, + 0xd4, 0x8a, 0x20, 0x5c, 0xe1, 0xaa, 0xaf, 0x29, 0x20, 0x50, 0x14, 0x9f, + 0xa6, 0x70, 0xc2, 0x91, 0x0e, 0xef, 0x8a, 0xe0, 0x58, 0xc1, 0xe4, 0x03, + 0xdb, 0x54, 0x62, 0x2e, 0x42, 0x68, 0x00, 0x00, 0x20, 0x00, 0x49, 0x44, + 0x41, 0x54, 0x06, 0xd3, 0x61, 0xbb, 0x2a, 0xf5, 0xdb, 0xeb, 0x16, 0x5f, + 0x72, 0xc5, 0x70, 0x19, 0x6d, 0x6d, 0x53, 0x04, 0x10, 0xae, 0x46, 0x5b, + 0xb8, 0x0b, 0x89, 0x33, 0x94, 0x21, 0x82, 0xfb, 0x71, 0x1e, 0x35, 0xee, + 0x34, 0x00, 0x2f, 0x61, 0xaf, 0xa7, 0x7d, 0xf2, 0x97, 0x3f, 0xe3, 0x75, + 0x74, 0x9f, 0x35, 0x5d, 0x29, 0xff, 0xdd, 0x60, 0x5d, 0x9d, 0xde, 0x0d, + 0xef, 0x02, 0xc1, 0x5e, 0x42, 0x08, 0x9a, 0xb2, 0xd9, 0x31, 0x8f, 0xeb, + 0x18, 0xb7, 0xe6, 0x27, 0x2f, 0xf2, 0xf3, 0x9a, 0xa0, 0x30, 0x97, 0x1d, + 0x3d, 0x2d, 0xa0, 0xc0, 0x5d, 0x0d, 0x3f, 0x7e, 0xe6, 0x17, 0x0a, 0xd4, + 0x02, 0x30, 0x7a, 0x0d, 0x08, 0x26, 0x8d, 0x36, 0x65, 0x93, 0xe6, 0x54, + 0x30, 0xe9, 0xa1, 0x03, 0x10, 0xd0, 0x5a, 0x68, 0x61, 0xf4, 0x1a, 0x18, + 0x67, 0x83, 0xbc, 0x4a, 0x82, 0xd9, 0x6b, 0x82, 0x00, 0xdf, 0x97, 0xd0, + 0x92, 0x89, 0xd5, 0xea, 0x4d, 0xcb, 0x24, 0x2f, 0xf2, 0x98, 0x96, 0x19, + 0x5d, 0x93, 0x9e, 0xff, 0x4b, 0x29, 0xb1, 0x7a, 0x2d, 0x9c, 0xba, 0x83, + 0xd5, 0x6b, 0x51, 0x1c, 0x2c, 0x22, 0x72, 0x02, 0xb3, 0xdf, 0x54, 0x40, + 0xc0, 0x1c, 0xc8, 0xa6, 0x8c, 0xae, 0xdd, 0x9d, 0x76, 0x3b, 0xdc, 0x17, + 0x75, 0x5c, 0xe8, 0xb1, 0x70, 0xa5, 0x0b, 0x04, 0x79, 0xfe, 0x1c, 0x00, + 0xac, 0x8e, 0xa0, 0xaa, 0x54, 0x18, 0x61, 0x18, 0xc8, 0xe9, 0xee, 0x50, + 0xae, 0xb4, 0x84, 0x88, 0xf3, 0xd5, 0xf9, 0x02, 0xb8, 0xba, 0xa5, 0x6b, + 0x2e, 0x1b, 0x0a, 0x1e, 0x70, 0x7e, 0xcf, 0x7d, 0x60, 0xd5, 0x2a, 0x26, + 0x0f, 0x1f, 0x06, 0x60, 0x10, 0x98, 0xe8, 0xe6, 0x2f, 0xd8, 0xce, 0x17, + 0x86, 0xa5, 0xc3, 0x9f, 0x06, 0x34, 0xb7, 0x50, 0x17, 0x02, 0xd5, 0xea, + 0x1a, 0xd7, 0xe0, 0x20, 0x93, 0x13, 0x71, 0xca, 0x43, 0x70, 0x57, 0x3a, + 0x9e, 0xb9, 0xe0, 0x59, 0x3a, 0xc8, 0x6a, 0x2e, 0xbf, 0xdd, 0xc2, 0x0c, + 0xa4, 0x8e, 0x3b, 0x85, 0xef, 0x64, 0xaf, 0x1b, 0x9c, 0xeb, 0xc8, 0xc0, + 0x00, 0x83, 0x61, 0xb8, 0x81, 0x01, 0x35, 0x3b, 0x72, 0x1e, 0xf6, 0x66, + 0xd3, 0xa6, 0x6b, 0x8b, 0xd1, 0xfe, 0x8e, 0x00, 0xfe, 0x74, 0xe0, 0x1b, + 0xdf, 0xe4, 0x86, 0x77, 0xbf, 0x8b, 0x4d, 0x4b, 0x63, 0xc0, 0x4f, 0x04, + 0x1d, 0x69, 0x35, 0xd8, 0xf1, 0x64, 0x9d, 0x9b, 0x02, 0xb0, 0xc4, 0xbe, + 0x29, 0xb5, 0xdd, 0xb2, 0xb4, 0xcc, 0xf6, 0x13, 0xd5, 0x68, 0x9b, 0x88, + 0xa3, 0x8b, 0x9d, 0xea, 0xa4, 0xc4, 0x30, 0xc0, 0x99, 0xf4, 0x18, 0xe9, + 0x8d, 0xf3, 0x85, 0xca, 0x74, 0x7b, 0x5e, 0x6c, 0x18, 0x50, 0x36, 0x0c, + 0x9c, 0x49, 0x2f, 0x71, 0x5e, 0x87, 0x6f, 0xe9, 0x69, 0xda, 0x74, 0x6d, + 0x91, 0x7c, 0x00, 0xb5, 0xd0, 0x4b, 0xdb, 0x1d, 0x27, 0x3a, 0x4f, 0xc4, + 0xb8, 0x90, 0x6b, 0xbd, 0xd0, 0x70, 0x5b, 0x96, 0x96, 0xd9, 0x3e, 0xd9, + 0xe8, 0x3e, 0x31, 0x5b, 0x9b, 0x7c, 0x19, 0xbd, 0xc1, 0x9e, 0xff, 0xe3, + 0x05, 0x6a, 0x85, 0x7a, 0xa8, 0x02, 0x2b, 0x17, 0xc3, 0x23, 0xfb, 0xc0, + 0xb4, 0xd4, 0xec, 0x18, 0x3d, 0x5d, 0x4e, 0x3d, 0xda, 0x5d, 0xfb, 0x5f, + 0xda, 0xeb, 0x8c, 0x1b, 0x56, 0xa9, 0x6d, 0xe5, 0xdd, 0x3e, 0xfc, 0x27, + 0x35, 0x81, 0x9d, 0xbb, 0x6e, 0x80, 0xa7, 0x0f, 0xb4, 0x01, 0xb5, 0x7e, + 0x18, 0x9d, 0x3a, 0xa4, 0x40, 0x51, 0x97, 0x5c, 0xd2, 0x0e, 0xe5, 0xf2, + 0x9e, 0xdc, 0x03, 0x4f, 0x02, 0x37, 0x2e, 0x81, 0xcf, 0xde, 0x0b, 0x8b, + 0xd4, 0x44, 0x44, 0x4e, 0xab, 0x89, 0x52, 0x61, 0x19, 0xb2, 0x7a, 0x45, + 0x3b, 0x9a, 0xae, 0x54, 0xb4, 0x38, 0xc4, 0xa1, 0x79, 0xf9, 0x71, 0x26, + 0x9d, 0x79, 0xf9, 0x0b, 0x35, 0xd2, 0xc1, 0x8f, 0x5d, 0x1c, 0xa5, 0xf2, + 0xc4, 0xc1, 0xd9, 0x2e, 0xf5, 0x75, 0xd1, 0xee, 0xe7, 0xc6, 0x29, 0x99, + 0xa6, 0x02, 0x55, 0xf9, 0x0e, 0xc3, 0x57, 0xab, 0x09, 0x9a, 0xf5, 0x87, + 0xde, 0x1b, 0xf9, 0xc9, 0x7f, 0xec, 0x6f, 0xa8, 0x3c, 0x55, 0x8b, 0x8e, + 0xef, 0x5e, 0x55, 0x42, 0x22, 0xd9, 0xfb, 0x91, 0x43, 0x51, 0x5d, 0x7a, + 0xd3, 0x37, 0x56, 0xd3, 0xd8, 0xaf, 0xda, 0x3d, 0x02, 0x17, 0x7e, 0x4b, + 0x11, 0xd6, 0x0a, 0x77, 0x57, 0x08, 0x11, 0xbf, 0x07, 0x6f, 0x8e, 0xcb, + 0xa9, 0x91, 0x65, 0x0a, 0x5a, 0xbc, 0xeb, 0x58, 0x7c, 0x5f, 0x6e, 0xbb, + 0x71, 0x98, 0x93, 0x93, 0x01, 0xee, 0x61, 0xda, 0x61, 0x98, 0x51, 0xbc, + 0x07, 0x55, 0x3a, 0xec, 0xbf, 0xf8, 0x1b, 0xbc, 0x27, 0x24, 0x7b, 0x8f, + 0xc6, 0xe9, 0xd8, 0xf6, 0xa1, 0x32, 0x3b, 0xde, 0x7d, 0x4f, 0x74, 0xbc, + 0xe9, 0x1b, 0xa3, 0x90, 0xab, 0xd2, 0x38, 0xec, 0xc2, 0x61, 0x95, 0x96, + 0xea, 0xe3, 0x1e, 0x05, 0xa0, 0x00, 0x94, 0xbf, 0xb1, 0x9a, 0xea, 0xb3, + 0x92, 0xa3, 0x4f, 0x1e, 0x4d, 0xa4, 0x63, 0xc7, 0x6f, 0xdf, 0x1e, 0x1d, + 0x6f, 0xb8, 0x77, 0x1d, 0x95, 0x3f, 0xda, 0x12, 0xa7, 0x61, 0x40, 0xb5, + 0x5d, 0xc6, 0x3f, 0x12, 0xdf, 0x0f, 0xeb, 0x4f, 0xfe, 0x8a, 0xbd, 0xf7, + 0xd5, 0x01, 0x58, 0x5b, 0x06, 0x30, 0xd8, 0xbd, 0x3a, 0x4e, 0xc7, 0xfa, + 0x43, 0xa3, 0x78, 0x8f, 0x9c, 0x42, 0xd2, 0xc4, 0xb8, 0x51, 0x4d, 0x20, + 0x1b, 0xfb, 0xc8, 0xa1, 0x28, 0x1f, 0x28, 0xef, 0x5b, 0xcd, 0xee, 0x47, + 0xe3, 0xeb, 0x2e, 0x73, 0x7e, 0xf5, 0xdf, 0x6e, 0xea, 0x82, 0xe7, 0x9d, + 0x55, 0xe9, 0x69, 0xd6, 0xa0, 0xf2, 0xd1, 0xfc, 0x2c, 0xc7, 0x79, 0xba, + 0x63, 0x09, 0x5e, 0x2b, 0xec, 0xc2, 0xff, 0xac, 0xd7, 0x52, 0x1c, 0x52, + 0xb1, 0x96, 0x82, 0x6d, 0xf9, 0x8a, 0x12, 0x06, 0x30, 0x7e, 0x1a, 0x76, + 0xfd, 0xd1, 0x18, 0x46, 0x00, 0xbe, 0xf3, 0xa6, 0x5c, 0xdc, 0xd3, 0xf1, + 0xbb, 0x40, 0x2e, 0x8f, 0x69, 0x1a, 0xec, 0xbd, 0x4f, 0x95, 0x57, 0x77, + 0xdf, 0x55, 0xc6, 0x05, 0xf2, 0x79, 0xe0, 0x4a, 0x95, 0xd7, 0x2d, 0x59, + 0x05, 0xd0, 0x60, 0x49, 0xb9, 0x8c, 0xd9, 0x82, 0x7b, 0x7e, 0x4b, 0xbd, + 0x6b, 0x96, 0x29, 0x70, 0x26, 0x54, 0xde, 0xee, 0x3e, 0x53, 0xc5, 0x7d, + 0xa6, 0x8a, 0x75, 0x95, 0x2a, 0xef, 0x36, 0xae, 0xaf, 0x30, 0x74, 0xe3, + 0x30, 0x37, 0x2d, 0x13, 0x38, 0x11, 0x44, 0x2a, 0x6e, 0x4b, 0x0f, 0xad, + 0x51, 0x57, 0xb8, 0xe9, 0x0f, 0x15, 0x30, 0x6e, 0xc7, 0xfa, 0x0a, 0xe4, + 0xf2, 0x58, 0x96, 0x11, 0x81, 0xb3, 0x9c, 0x13, 0x15, 0x58, 0x1a, 0x4f, + 0x7c, 0xbf, 0x7d, 0xbd, 0x02, 0x64, 0xad, 0xbd, 0xcb, 0xc2, 0x69, 0x49, + 0x56, 0x0c, 0xa1, 0xdd, 0x21, 0x09, 0x12, 0xee, 0x0e, 0xec, 0xdd, 0xbe, + 0x5e, 0xbd, 0xab, 0x76, 0x7f, 0x31, 0xb2, 0xa7, 0x6c, 0x8e, 0x61, 0x2f, + 0x1d, 0x56, 0xdb, 0xe0, 0x5c, 0x29, 0xa8, 0x34, 0xa5, 0x27, 0xae, 0x0b, + 0xa1, 0x00, 0x5b, 0xf2, 0x1c, 0x88, 0x37, 0xc4, 0xee, 0x66, 0x4f, 0x0c, + 0x12, 0xf1, 0x26, 0xc6, 0x30, 0xcb, 0x23, 0x78, 0xa7, 0x1b, 0x18, 0xbd, + 0x79, 0xe8, 0x11, 0xd1, 0x84, 0x4f, 0x65, 0x53, 0xd5, 0x45, 0x7c, 0x1f, + 0x8c, 0x1e, 0xa1, 0xf5, 0x31, 0x34, 0xd4, 0x04, 0xd2, 0x00, 0x36, 0x50, + 0x9b, 0xf4, 0x11, 0x3d, 0xf3, 0x84, 0xee, 0xce, 0xcb, 0xd7, 0xf9, 0xe9, + 0xf5, 0xb0, 0x39, 0x97, 0x3e, 0x18, 0x6c, 0xc7, 0x7b, 0x2e, 0x8a, 0xdc, + 0x16, 0x68, 0xfb, 0xdd, 0x34, 0xf3, 0x83, 0x57, 0xe7, 0x65, 0x7f, 0xe6, + 0x07, 0xaf, 0xf2, 0x33, 0xf3, 0xb0, 0x37, 0x9b, 0xe6, 0x93, 0x9e, 0x50, + 0x6f, 0x01, 0x5e, 0x02, 0xde, 0x1c, 0xfc, 0xe9, 0x7a, 0x09, 0x2e, 0x28, + 0x2d, 0x17, 0x86, 0x0c, 0x8d, 0xd5, 0x06, 0xc5, 0x0a, 0xb6, 0x73, 0x41, + 0xa8, 0x40, 0x81, 0xb2, 0xd2, 0x35, 0x8e, 0x34, 0x1e, 0x55, 0xb7, 0x73, + 0x08, 0x20, 0x00, 0x7f, 0xa5, 0xc3, 0xed, 0xd1, 0xdc, 0x43, 0xbb, 0x21, + 0xd4, 0xab, 0x9b, 0xda, 0xd2, 0x18, 0xd8, 0x08, 0x61, 0x5c, 0x9d, 0xd2, + 0x7b, 0x21, 0x7a, 0x18, 0xb8, 0x65, 0x2b, 0xb0, 0x35, 0x70, 0xd8, 0xaa, + 0x9d, 0xdc, 0x4a, 0x3b, 0x48, 0xab, 0x9b, 0x3a, 0x84, 0x3f, 0x1f, 0xa0, + 0xd6, 0xc9, 0xba, 0xcf, 0x92, 0xa2, 0x91, 0x38, 0x06, 0x3a, 0xba, 0x01, + 0x2c, 0xd1, 0xa0, 0x56, 0x63, 0x93, 0xb1, 0x7b, 0x08, 0xd8, 0xea, 0xe4, + 0x36, 0x5f, 0xf7, 0xf9, 0xda, 0x59, 0x12, 0xf6, 0xfb, 0x3e, 0xea, 0xc3, + 0x8d, 0x06, 0xc3, 0x93, 0xc0, 0x35, 0xb1, 0x8d, 0xb1, 0xa7, 0x7c, 0xca, + 0xd7, 0xe4, 0x19, 0x7b, 0x2a, 0xe8, 0x6b, 0xbf, 0x26, 0x4f, 0xf5, 0x29, + 0x55, 0x72, 0x0e, 0x2d, 0x2b, 0xb0, 0xfb, 0xf8, 0x07, 0x00, 0xd8, 0x34, + 0xb4, 0x87, 0xda, 0x59, 0x15, 0xa6, 0xb4, 0x50, 0x95, 0xb4, 0xb5, 0xb3, + 0xcd, 0x08, 0xa8, 0x05, 0x31, 0x50, 0x2b, 0xad, 0x66, 0x0b, 0x90, 0x3e, + 0xc3, 0x83, 0x05, 0xc6, 0x26, 0x92, 0x10, 0x02, 0xbb, 0x60, 0xe3, 0x34, + 0xd4, 0xef, 0xa2, 0x1d, 0x4c, 0xa2, 0x29, 0x38, 0xb7, 0xe7, 0xd9, 0x8f, + 0x82, 0x4c, 0x95, 0xec, 0x2d, 0x2f, 0x91, 0x3f, 0xee, 0x7f, 0xd4, 0x63, + 0x64, 0x66, 0xb3, 0x4a, 0xa3, 0x94, 0xd0, 0x0b, 0x76, 0x0f, 0x38, 0xbe, + 0x8a, 0xc3, 0x36, 0x60, 0x3e, 0x98, 0x5b, 0x21, 0xca, 0x48, 0xa9, 0xca, + 0x5d, 0xd9, 0x11, 0xbc, 0x93, 0xcc, 0x95, 0x5d, 0xaf, 0x96, 0x38, 0xf6, + 0xe5, 0x51, 0xd0, 0x9a, 0xc2, 0x96, 0x59, 0xc2, 0xaf, 0x7b, 0x40, 0x93, + 0xa6, 0xef, 0x42, 0xae, 0xd1, 0x06, 0x8b, 0x72, 0xa6, 0x6a, 0x80, 0x8b, + 0x21, 0xca, 0xf8, 0xb2, 0xbd, 0x1d, 0x6d, 0xf7, 0x95, 0xa8, 0xd6, 0x5d, + 0x36, 0x5d, 0x67, 0x73, 0xef, 0xe3, 0x35, 0xc8, 0xed, 0x80, 0x56, 0x95, + 0xbb, 0xaf, 0xfb, 0x7b, 0x75, 0xcc, 0x47, 0x39, 0x78, 0xfa, 0x8b, 0xc0, + 0x16, 0x42, 0x28, 0x8d, 0x94, 0x3e, 0x32, 0xa8, 0xad, 0x48, 0x04, 0x86, + 0x10, 0xf8, 0x51, 0xd2, 0x25, 0x86, 0x10, 0xcc, 0xd6, 0x7b, 0xea, 0x4f, + 0xbb, 0x51, 0xfd, 0x44, 0xdf, 0x8f, 0x2c, 0xf8, 0x12, 0x61, 0x28, 0xfb, + 0xfe, 0x74, 0x03, 0xa3, 0xb7, 0x10, 0x6d, 0xd5, 0x79, 0x10, 0xed, 0x4d, + 0xc9, 0x0e, 0xf1, 0xc4, 0x61, 0xfc, 0xe9, 0x06, 0x86, 0x91, 0x5c, 0x44, + 0x44, 0xce, 0x34, 0x11, 0x3d, 0xdd, 0x16, 0x21, 0x69, 0xe2, 0xfb, 0x7e, + 0x57, 0xf8, 0xff, 0x6c, 0xaa, 0x13, 0x83, 0xb1, 0x8a, 0xc4, 0xb0, 0x2c, + 0xdd, 0x1d, 0xcd, 0xbd, 0x53, 0x78, 0x5d, 0xc5, 0xe5, 0x81, 0xfb, 0x31, + 0x60, 0x39, 0x70, 0x2c, 0xe9, 0xce, 0x31, 0xb8, 0xbf, 0x83, 0xff, 0xf7, + 0x3d, 0xa7, 0xfc, 0x7f, 0x69, 0x39, 0x18, 0xc7, 0xc0, 0x0f, 0xdc, 0x7f, + 0x75, 0xab, 0x82, 0x68, 0xdd, 0x72, 0x0b, 0x4c, 0xde, 0xa2, 0xf6, 0xff, + 0x18, 0x05, 0xab, 0x7a, 0x2d, 0x38, 0x55, 0x8f, 0x07, 0xf1, 0x5c, 0x77, + 0x0c, 0x8c, 0x87, 0xe1, 0xe1, 0x87, 0xe1, 0xba, 0xeb, 0x00, 0x06, 0x22, + 0x12, 0x56, 0x5f, 0x10, 0xbf, 0x7f, 0x4c, 0xf9, 0x0f, 0xd3, 0x76, 0x0c, + 0xf0, 0x8b, 0x60, 0xdc, 0xa2, 0x81, 0xc0, 0x96, 0xab, 0x13, 0x5f, 0xda, + 0x0a, 0xbf, 0x7a, 0x0c, 0x1e, 0x0f, 0x3c, 0xae, 0x04, 0x06, 0x02, 0x4f, + 0x3b, 0x8f, 0xc0, 0xc6, 0x01, 0xd8, 0x99, 0xea, 0xf0, 0xda, 0xb8, 0xf2, + 0xc2, 0xe0, 0x5b, 0xf3, 0x0d, 0xd7, 0x09, 0x16, 0x35, 0x5f, 0xf9, 0x33, + 0x3e, 0xb4, 0x24, 0x22, 0x80, 0xdd, 0x45, 0x63, 0x31, 0x39, 0x91, 0x58, + 0xf4, 0xc7, 0x9f, 0xf1, 0xe7, 0x1e, 0xa7, 0x39, 0x0f, 0x99, 0x66, 0x11, + 0xcf, 0xab, 0x33, 0x5b, 0x8b, 0xa3, 0x7d, 0xfc, 0x22, 0x6e, 0x35, 0x49, + 0x99, 0x5c, 0xac, 0x21, 0xad, 0xa8, 0x4f, 0xbf, 0x25, 0x55, 0xc5, 0xb9, + 0x4b, 0x3e, 0x2c, 0x7a, 0x8c, 0xc4, 0x18, 0x80, 0x10, 0x79, 0xea, 0xf5, + 0x1a, 0xc5, 0xa2, 0xea, 0x7f, 0x91, 0x2d, 0xb5, 0x10, 0xd1, 0xff, 0xc7, + 0xde, 0xdb, 0x87, 0xc9, 0x71, 0xd5, 0x77, 0xbe, 0x1f, 0xb3, 0x0d, 0x9c, + 0x4e, 0x46, 0x50, 0x45, 0x46, 0xa4, 0x4b, 0x96, 0x42, 0x17, 0x19, 0x21, + 0xb5, 0x57, 0x0a, 0xee, 0x41, 0xe6, 0x7a, 0x66, 0x6d, 0x76, 0x34, 0x60, + 0x2e, 0x1a, 0x9c, 0x2c, 0x96, 0xe3, 0x2c, 0x58, 0xe1, 0xb9, 0x13, 0xdb, + 0xd9, 0x05, 0xcb, 0x86, 0x65, 0x4d, 0x5e, 0xf6, 0xe2, 0xec, 0x2a, 0xb1, + 0x79, 0x12, 0x16, 0x2b, 0x24, 0x7e, 0x63, 0x9f, 0x1b, 0x8b, 0xcc, 0x3e, + 0x46, 0x76, 0xb8, 0x8e, 0x05, 0x37, 0x76, 0x46, 0x5e, 0x8c, 0x47, 0x13, + 0xac, 0x3b, 0xa3, 0x1b, 0x29, 0x33, 0x26, 0x26, 0x6a, 0x69, 0x35, 0x71, + 0x35, 0x68, 0xa4, 0xaa, 0xa0, 0x49, 0xba, 0xb0, 0x7a, 0xb7, 0x0f, 0xb8, + 0x37, 0xbe, 0x7f, 0x9c, 0x73, 0xea, 0xad, 0xbb, 0x67, 0x46, 0xb6, 0xc1, + 0x24, 0xa9, 0xaf, 0x9e, 0x51, 0x55, 0x9d, 0xfa, 0x9d, 0xd7, 0xea, 0x3a, + 0xe7, 0xd4, 0xa9, 0x3a, 0x9f, 0xe3, 0x07, 0x1e, 0x20, 0x71, 0x4a, 0x15, + 0x44, 0x9f, 0xa0, 0x11, 0x7a, 0x84, 0x75, 0x1f, 0xb7, 0x3c, 0x4c, 0x51, + 0xa7, 0xa9, 0x7e, 0xa2, 0x86, 0x73, 0x45, 0xb5, 0x2b, 0x50, 0x0b, 0xa0, + 0xbe, 0x50, 0xa7, 0xbe, 0xf0, 0x05, 0xca, 0x03, 0x65, 0x06, 0xab, 0xd7, + 0x72, 0xe0, 0x91, 0xbd, 0xa9, 0xf3, 0xb5, 0x13, 0xf3, 0x6c, 0xb7, 0xca, + 0xdd, 0x13, 0xba, 0x8c, 0xa4, 0x94, 0x14, 0x01, 0xd1, 0x96, 0x48, 0x0d, + 0x13, 0x73, 0x0a, 0xea, 0x5d, 0xa2, 0xdf, 0x86, 0xa1, 0x36, 0xcc, 0x66, + 0xae, 0x9d, 0x28, 0x80, 0x2d, 0x15, 0xec, 0xc9, 0x00, 0xb5, 0xba, 0xbd, + 0x63, 0xb5, 0x0a, 0x10, 0x16, 0xd0, 0x97, 0xa8, 0xc8, 0xac, 0xd4, 0xef, + 0xcd, 0xfa, 0x9c, 0xa8, 0x4c, 0x0f, 0x19, 0xd0, 0x19, 0x02, 0x51, 0x52, + 0xf5, 0x9b, 0x7a, 0xd7, 0x53, 0xa4, 0xf2, 0xcd, 0xfb, 0x98, 0x97, 0x37, + 0x52, 0x5d, 0xd8, 0xc7, 0x4d, 0x8f, 0xf9, 0xd8, 0xfd, 0x0e, 0xfe, 0xa2, + 0x1f, 0x2f, 0x6e, 0x05, 0x14, 0x0b, 0x92, 0x96, 0x86, 0x20, 0x16, 0x45, + 0x51, 0xc5, 0xd9, 0xd6, 0xbf, 0xc5, 0x76, 0xfc, 0xeb, 0x18, 0x02, 0x22, + 0x24, 0x64, 0x82, 0x84, 0x23, 0xdb, 0xb2, 0x2b, 0x51, 0x3a, 0x0b, 0x15, + 0x13, 0x99, 0xdf, 0x80, 0xd4, 0x61, 0xd6, 0x24, 0xf8, 0xe8, 0x45, 0x68, + 0x24, 0x48, 0x51, 0xa4, 0xa5, 0xdb, 0x63, 0xbb, 0x00, 0x0d, 0xa9, 0x40, + 0x7b, 0x35, 0xd9, 0x62, 0xb6, 0x00, 0xa5, 0x02, 0x1c, 0x42, 0x45, 0xe9, + 0xb7, 0x89, 0xca, 0xc1, 0x37, 0x69, 0x68, 0xc3, 0x60, 0x01, 0xe6, 0xda, + 0xdd, 0x01, 0x5a, 0x83, 0x05, 0x85, 0x72, 0x5d, 0xe9, 0xae, 0xbd, 0xf8, + 0xe2, 0x8b, 0x39, 0x73, 0x46, 0x01, 0x5e, 0xce, 0x3e, 0x7f, 0x9e, 0x37, + 0xae, 0x5d, 0xc1, 0x43, 0x0f, 0x6d, 0xda, 0xb4, 0x29, 0xda, 0x7f, 0xad, + 0xdf, 0xc7, 0x6b, 0x4d, 0x78, 0x3f, 0xad, 0xdc, 0x82, 0xf6, 0x49, 0x5e, + 0x57, 0xe8, 0xfe, 0x9c, 0xe0, 0xac, 0xed, 0xc7, 0x3f, 0x17, 0x77, 0x28, + 0x9d, 0x3e, 0x05, 0xd4, 0x72, 0xfa, 0xe0, 0xaf, 0x33, 0x20, 0x9c, 0xe5, + 0xe2, 0x3f, 0x79, 0xf2, 0x64, 0x07, 0x04, 0xeb, 0xe2, 0x8b, 0x2f, 0xe6, + 0xc4, 0xb1, 0xa3, 0x11, 0xbc, 0x0a, 0x60, 0xd3, 0xdb, 0xe2, 0xb4, 0x26, + 0x61, 0x5b, 0xe7, 0xfd, 0xb3, 0x29, 0xff, 0xdd, 0xc2, 0x3c, 0x79, 0xf2, + 0x24, 0xa3, 0xa3, 0xa3, 0x9c, 0x39, 0x73, 0x86, 0xf3, 0xfe, 0xd9, 0x18, + 0xa4, 0x75, 0xfe, 0x7c, 0x14, 0xee, 0x26, 0x47, 0xd9, 0x99, 0x30, 0x93, + 0x61, 0x19, 0x7b, 0xe3, 0x8e, 0x2e, 0x27, 0x53, 0x7e, 0x27, 0x4f, 0x9e, + 0x54, 0x90, 0x2d, 0x0d, 0xd3, 0xe2, 0xc5, 0x34, 0x14, 0x0c, 0x60, 0x1d, + 0x2a, 0xde, 0xcd, 0xdb, 0x2e, 0xe3, 0xcc, 0x99, 0x33, 0x51, 0xbe, 0x56, + 0x92, 0x2f, 0x3d, 0x1e, 0x3a, 0x08, 0x43, 0x6e, 0x3c, 0xe6, 0xf3, 0xd0, + 0xa1, 0x1a, 0x73, 0x27, 0xe6, 0x19, 0xdc, 0xac, 0xc6, 0x37, 0x6a, 0x0b, + 0x1e, 0x95, 0x01, 0x97, 0x86, 0xf4, 0x29, 0x59, 0x0a, 0x76, 0x9f, 0x74, + 0xb3, 0x4b, 0x7a, 0xcc, 0x58, 0xfa, 0xd8, 0xc2, 0x05, 0xe9, 0x47, 0xef, + 0x44, 0xf7, 0x7f, 0x45, 0xf5, 0xe3, 0x86, 0xcb, 0x40, 0xa1, 0x08, 0x6b, + 0x5d, 0x0e, 0x3c, 0x32, 0xc5, 0xce, 0xeb, 0x46, 0xd9, 0xf7, 0xd9, 0xbd, + 0x54, 0x06, 0xca, 0x00, 0x38, 0x5b, 0x5c, 0xaa, 0xb3, 0x01, 0xf3, 0x4d, + 0x1f, 0x0a, 0x0a, 0x90, 0x0a, 0x7a, 0xec, 0x41, 0x08, 0x6e, 0xff, 0xfc, + 0x01, 0x84, 0x00, 0xb7, 0x5c, 0xc1, 0xab, 0xd7, 0x98, 0xac, 0xf9, 0xb8, + 0xe5, 0xee, 0x63, 0x08, 0x5e, 0x5d, 0xc5, 0x39, 0x56, 0x71, 0xf0, 0x13, + 0xcf, 0x10, 0xd1, 0x22, 0x48, 0x52, 0xb2, 0x7b, 0xc7, 0x28, 0x5e, 0xbd, + 0x86, 0xbf, 0xd4, 0x40, 0x4a, 0x89, 0x6d, 0xd9, 0x54, 0x06, 0xaa, 0x0c, + 0x6f, 0x1b, 0x05, 0xa4, 0x02, 0x69, 0x01, 0xe1, 0xb9, 0x10, 0x10, 0x34, + 0xf4, 0xad, 0x9e, 0x5c, 0xf8, 0x49, 0xac, 0x89, 0xdb, 0x10, 0xb1, 0x46, + 0x8d, 0x9d, 0xc4, 0x71, 0xa9, 0xaa, 0x42, 0x24, 0x8e, 0x29, 0x42, 0x6b, + 0xa9, 0x45, 0xb1, 0xaf, 0x88, 0xd5, 0x6f, 0x21, 0x74, 0x97, 0x4c, 0x9e, + 0x57, 0xfe, 0xfd, 0x53, 0x3e, 0x6e, 0xa5, 0xa2, 0xe0, 0x5b, 0x2d, 0xa8, + 0xe9, 0x05, 0xde, 0xa4, 0x94, 0xb4, 0x9a, 0x0d, 0x9c, 0x8d, 0x2e, 0xa2, + 0x2d, 0x90, 0x4d, 0x5f, 0x41, 0x09, 0xdb, 0x2d, 0x42, 0x19, 0xaa, 0xba, + 0x60, 0x05, 0x8d, 0x8c, 0xbe, 0x8b, 0x91, 0xd1, 0x77, 0x01, 0xf0, 0x5b, + 0xec, 0x81, 0x9f, 0x82, 0x2f, 0xfe, 0xde, 0x51, 0xae, 0xfe, 0x9c, 0xc2, + 0x7d, 0x7f, 0xf1, 0xf7, 0x8e, 0xc2, 0xe7, 0x36, 0x51, 0xe6, 0x01, 0x00, + 0x1e, 0x5c, 0x39, 0xc8, 0x58, 0xef, 0x4d, 0x1f, 0x56, 0x06, 0xdf, 0x7c, + 0x21, 0xbe, 0x23, 0xfd, 0xc7, 0xc1, 0x8f, 0x26, 0x8e, 0xae, 0x8a, 0xf6, + 0x3e, 0xfa, 0xc9, 0x9f, 0x4f, 0xd9, 0x7d, 0x94, 0xf4, 0xf1, 0x6a, 0x55, + 0x9b, 0xfb, 0x0e, 0x55, 0x0d, 0xd8, 0xaa, 0x92, 0x04, 0x7a, 0xfd, 0xbb, + 0x4e, 0xe3, 0xf7, 0x76, 0x3a, 0x01, 0x3c, 0xfd, 0xe5, 0xef, 0xf0, 0x20, + 0x37, 0xc7, 0x9d, 0xc5, 0x27, 0xe0, 0x69, 0xbe, 0xc3, 0x83, 0xff, 0xea, + 0x3f, 0xc3, 0xbf, 0x4a, 0xdb, 0x3e, 0xf8, 0x9f, 0xbe, 0xb4, 0xaa, 0x74, + 0xdd, 0xf2, 0x6b, 0xe9, 0xfc, 0x3c, 0xff, 0xbd, 0x33, 0x11, 0x60, 0x2b, + 0xbb, 0x55, 0x7a, 0xeb, 0xaa, 0xc2, 0xcd, 0x95, 0x2b, 0x57, 0xae, 0x5c, + 0xb9, 0x72, 0xe5, 0xca, 0x95, 0x2b, 0x57, 0xae, 0x5c, 0xb9, 0x72, 0xe5, + 0xca, 0x95, 0x2b, 0x57, 0xae, 0x5c, 0xb9, 0x72, 0xe5, 0xca, 0x95, 0x2b, + 0x57, 0xae, 0x5c, 0xdd, 0x95, 0x43, 0xb5, 0x72, 0xe5, 0xca, 0x95, 0x2b, + 0x57, 0xae, 0x57, 0x4b, 0x07, 0x6d, 0x5a, 0xd7, 0xfd, 0x29, 0x45, 0xd4, + 0xa4, 0x28, 0xab, 0x5f, 0xaf, 0x6e, 0x69, 0x3e, 0x06, 0xd6, 0x30, 0x2d, + 0xa3, 0xe4, 0xbe, 0x39, 0xee, 0x70, 0x13, 0x22, 0x82, 0x60, 0x59, 0xfd, + 0x56, 0x04, 0x5e, 0xc9, 0x82, 0xa6, 0x4a, 0xa5, 0xee, 0x93, 0x90, 0x0d, + 0x50, 0x2b, 0x0c, 0x43, 0xbd, 0x8a, 0x66, 0x0c, 0x6d, 0x49, 0xca, 0x1c, + 0xd7, 0x16, 0x94, 0x7d, 0x72, 0x82, 0x45, 0xa9, 0x54, 0x52, 0x1f, 0x1d, + 0xb7, 0x25, 0xb2, 0x0d, 0xf7, 0xdf, 0x7d, 0x80, 0xea, 0x65, 0xc3, 0x0c, + 0x6e, 0x19, 0x63, 0x32, 0xf8, 0x42, 0x1c, 0x46, 0x5b, 0x52, 0xb3, 0x2c, + 0x04, 0x31, 0x4c, 0xcb, 0xc8, 0x29, 0xa5, 0x27, 0x93, 0x64, 0xd5, 0x68, + 0x36, 0x22, 0x00, 0x4e, 0xf6, 0xa3, 0xeb, 0xa2, 0x28, 0x22, 0xfb, 0x64, + 0x0a, 0x42, 0x96, 0x0c, 0xdf, 0xee, 0xb3, 0x23, 0x68, 0x97, 0xdd, 0x67, + 0xd3, 0xa0, 0xb1, 0xac, 0x2d, 0x6d, 0x68, 0xb5, 0xd5, 0xc7, 0xcc, 0x61, + 0x33, 0x8c, 0x80, 0x2f, 0xe5, 0x72, 0x59, 0xf9, 0xb1, 0xe2, 0x6b, 0x20, + 0xdb, 0x12, 0x09, 0xb4, 0x98, 0xa1, 0x78, 0xf0, 0xfd, 0x91, 0x7b, 0xf8, + 0xac, 0x84, 0xff, 0xdb, 0x83, 0xcf, 0xda, 0x31, 0x0c, 0x0b, 0x88, 0x66, + 0xdc, 0x84, 0x12, 0xfb, 0xd2, 0xf8, 0x9a, 0xec, 0xfb, 0xb2, 0xc5, 0xbe, + 0x43, 0x82, 0x68, 0x05, 0x69, 0x57, 0xa7, 0x49, 0xc3, 0xb8, 0xf0, 0x1a, + 0x60, 0xa5, 0xaf, 0x3d, 0xc4, 0x93, 0x0f, 0x3a, 0x26, 0x4d, 0x15, 0xa0, + 0xd1, 0x34, 0xd0, 0x1c, 0x81, 0x57, 0x0f, 0x71, 0x13, 0x13, 0xd4, 0xfc, + 0xa5, 0x2e, 0x1f, 0xa0, 0xea, 0xb9, 0x02, 0x8d, 0x65, 0x00, 0x48, 0x11, + 0x50, 0xab, 0xcb, 0x6c, 0xec, 0x86, 0xce, 0x9b, 0x6d, 0x09, 0x1a, 0xa1, + 0xc4, 0x4e, 0xa4, 0x37, 0x82, 0x71, 0x75, 0x51, 0xe4, 0xaf, 0xdf, 0xc2, + 0xb2, 0x8a, 0xab, 0x07, 0x6b, 0x2d, 0x23, 0xa7, 0x64, 0xe1, 0x2d, 0x76, + 0x8f, 0xcf, 0xea, 0xb7, 0xf1, 0x16, 0x7c, 0x6c, 0x8b, 0x68, 0x92, 0x12, + 0xa8, 0x32, 0x5c, 0xd5, 0x84, 0x8d, 0x9b, 0x3d, 0xc2, 0x7b, 0x8a, 0x44, + 0x05, 0x90, 0xb8, 0xaf, 0x43, 0xd9, 0x3d, 0xce, 0x55, 0xa9, 0x4b, 0xdc, + 0xbd, 0xe0, 0x57, 0x49, 0x77, 0xab, 0xaf, 0xd4, 0x61, 0x67, 0xdc, 0xac, + 0xbe, 0x12, 0xee, 0xa5, 0x4e, 0xc7, 0x24, 0x05, 0x07, 0xbb, 0x27, 0x58, + 0x68, 0xe8, 0x8a, 0xa1, 0x0e, 0x37, 0x6f, 0xc1, 0x63, 0x68, 0xa8, 0xd3, + 0x1d, 0xa0, 0x76, 0xaa, 0xd6, 0xe1, 0xe6, 0x2d, 0x78, 0x8c, 0xed, 0xe8, + 0x04, 0x61, 0x4c, 0x1e, 0x9c, 0xc4, 0x1d, 0x48, 0x4f, 0x0a, 0x95, 0x4d, + 0xc9, 0xe0, 0xb6, 0x41, 0xac, 0x35, 0x56, 0x6a, 0x92, 0x03, 0xc0, 0xfc, + 0x7c, 0x27, 0xe8, 0xc5, 0x0f, 0x7c, 0xc6, 0x76, 0x8c, 0x75, 0x9d, 0xc4, + 0x52, 0xab, 0x75, 0xa6, 0x65, 0xf8, 0xca, 0x61, 0x44, 0x41, 0x50, 0xa9, + 0x54, 0x52, 0xee, 0x53, 0x87, 0xa6, 0xa2, 0x7a, 0x27, 0x19, 0x56, 0x65, + 0xab, 0xb2, 0x9b, 0x3c, 0x37, 0xb7, 0xec, 0x7d, 0x5d, 0x3b, 0xd1, 0x19, + 0x17, 0xe8, 0x09, 0x42, 0x09, 0x95, 0x4a, 0x25, 0xa6, 0x0e, 0x4d, 0x75, + 0xe6, 0x63, 0x29, 0x3d, 0xfd, 0xb0, 0x11, 0x36, 0x14, 0x18, 0xab, 0x54, + 0x62, 0xf2, 0x60, 0x7a, 0x0a, 0xaf, 0x71, 0x4b, 0xd6, 0xe3, 0x73, 0xcf, + 0xcc, 0x21, 0x0a, 0x82, 0xb9, 0x67, 0xe6, 0x98, 0x7b, 0x66, 0x2e, 0x65, + 0xef, 0x2d, 0x74, 0x4f, 0x1b, 0xc0, 0xfe, 0x07, 0xd3, 0x80, 0x16, 0x7f, + 0x31, 0x9d, 0x0e, 0xab, 0xbf, 0x7b, 0x5b, 0x71, 0xa1, 0xea, 0xd5, 0xe6, + 0xf4, 0xb4, 0xef, 0xeb, 0x7d, 0xae, 0x17, 0x24, 0x72, 0xd9, 0xc9, 0xa2, + 0x5d, 0x14, 0x2e, 0x07, 0xd3, 0xca, 0xdc, 0xd7, 0xe7, 0x9e, 0x6d, 0x52, + 0xf9, 0xd2, 0x77, 0xe0, 0x2e, 0x3b, 0x02, 0x6a, 0x81, 0x02, 0x6a, 0xdd, + 0x7a, 0xf7, 0xdd, 0x3d, 0x83, 0xf9, 0xf5, 0xe9, 0x3a, 0x37, 0x8d, 0x94, + 0x53, 0x70, 0xac, 0x2c, 0x3c, 0xeb, 0x7d, 0xa8, 0xef, 0xb0, 0x93, 0xb0, + 0xa9, 0xac, 0xff, 0x97, 0x0a, 0xd4, 0x1a, 0xd8, 0xb8, 0x71, 0x65, 0x23, + 0xe0, 0xe0, 0x8b, 0xab, 0x9b, 0xa0, 0xff, 0x0f, 0x4d, 0x77, 0xdf, 0x7a, + 0xeb, 0xb2, 0xe7, 0x3f, 0xee, 0xda, 0xb0, 0xfb, 0x14, 0xe7, 0xee, 0xfb, + 0x31, 0xe0, 0xc7, 0x01, 0x08, 0x9b, 0x36, 0x3c, 0x3d, 0x07, 0x76, 0x5c, + 0x37, 0xed, 0xbd, 0x6a, 0x1f, 0xfb, 0x75, 0x95, 0xb7, 0x1f, 0xd5, 0x57, + 0xd8, 0xa5, 0xd9, 0x32, 0xbd, 0x00, 0x54, 0x10, 0x83, 0xa2, 0x8c, 0x0c, + 0x64, 0x2a, 0x0b, 0xd4, 0x5a, 0x29, 0x9c, 0x9d, 0xd6, 0xf2, 0xf7, 0x8f, + 0xd7, 0x0c, 0x71, 0xb1, 0x30, 0x5d, 0xb1, 0x24, 0x44, 0xcb, 0xe8, 0xc0, + 0x42, 0xd0, 0x91, 0x26, 0x05, 0x08, 0xab, 0x2f, 0x1b, 0xf6, 0x6a, 0xd3, + 0xd8, 0x2b, 0xaf, 0x2f, 0xd5, 0xdf, 0x9d, 0x87, 0xe7, 0x71, 0xde, 0x77, + 0xbd, 0x82, 0x02, 0x2e, 0xc6, 0x6d, 0x41, 0xa3, 0x5e, 0x8b, 0x26, 0xb0, + 0xa5, 0xee, 0xe0, 0x65, 0x27, 0x8b, 0xeb, 0x4e, 0xca, 0xd3, 0x1e, 0x61, + 0x71, 0x10, 0x84, 0xaa, 0x97, 0xc3, 0xa6, 0x0d, 0xcf, 0xa6, 0xaf, 0xf5, + 0x2b, 0xa6, 0x27, 0x8e, 0xc3, 0x6f, 0xea, 0x1f, 0x8d, 0x01, 0x6a, 0x79, + 0x75, 0x70, 0xcb, 0x80, 0x6a, 0x67, 0xde, 0x31, 0x78, 0x2d, 0x49, 0x10, + 0x6b, 0xc5, 0xaa, 0x03, 0x31, 0xac, 0xe4, 0x8e, 0xff, 0x00, 0x57, 0x7f, + 0x5c, 0x9f, 0xfc, 0xec, 0xa3, 0xaf, 0x78, 0x12, 0x2f, 0x19, 0xbb, 0x6f, + 0xd9, 0xf3, 0xa5, 0xcb, 0x6f, 0x24, 0x78, 0x78, 0x1f, 0xfc, 0xdd, 0x03, + 0x70, 0x70, 0x32, 0x02, 0x6a, 0xa1, 0xdb, 0x94, 0x37, 0xbd, 0x69, 0x30, + 0x6d, 0x5f, 0x8a, 0xf1, 0x0f, 0xee, 0x80, 0xcb, 0xfb, 0x7f, 0x6e, 0x92, + 0xd9, 0xc3, 0xb7, 0x2f, 0x6b, 0x33, 0x7a, 0xd5, 0xce, 0x95, 0xed, 0xca, + 0x0e, 0xef, 0x1f, 0x3b, 0xc0, 0xec, 0x91, 0x3b, 0xbb, 0xda, 0x48, 0x24, + 0x95, 0xb2, 0x1b, 0xd9, 0xdc, 0x6c, 0x01, 0xcf, 0x1e, 0x57, 0xd7, 0x5a, + 0x43, 0x5a, 0xa2, 0xf6, 0xfa, 0x0e, 0x87, 0x7d, 0xc7, 0x0e, 0xd1, 0x4b, + 0xf7, 0x1d, 0xc9, 0x22, 0x33, 0x94, 0xe6, 0x1e, 0xef, 0x5e, 0x56, 0x35, + 0xdd, 0x1e, 0x55, 0x74, 0x1b, 0x77, 0xdb, 0x07, 0x6e, 0x53, 0x27, 0x2e, + 0xab, 0xb0, 0xf7, 0x53, 0x0a, 0x38, 0x35, 0xfa, 0x4d, 0xb5, 0x32, 0xfd, + 0xd4, 0x96, 0x7b, 0x09, 0x9f, 0x86, 0xca, 0xad, 0x4f, 0x01, 0x60, 0x5d, + 0xa9, 0x80, 0x53, 0xb2, 0x0d, 0x5f, 0xf8, 0x8a, 0x0a, 0xe7, 0x86, 0x0f, + 0x94, 0x80, 0x59, 0x6e, 0xfb, 0xba, 0xe9, 0x33, 0x0d, 0xb1, 0xf7, 0x5d, + 0xbf, 0xc1, 0xce, 0x07, 0xd5, 0x8f, 0xe2, 0xc0, 0x87, 0x25, 0xf3, 0xcf, + 0x4a, 0xb8, 0x6f, 0x14, 0x01, 0x54, 0xb6, 0x0a, 0xe6, 0xdf, 0xa5, 0xd2, + 0x3c, 0xab, 0xfb, 0xb9, 0x43, 0xeb, 0x2d, 0x1a, 0xcf, 0xcc, 0x73, 0xc3, + 0x87, 0x76, 0x63, 0x5f, 0x5a, 0x45, 0xa3, 0xb6, 0x18, 0xfb, 0xa6, 0x82, + 0x20, 0x4c, 0x6e, 0xb9, 0x8b, 0xe0, 0x49, 0x89, 0x7b, 0xeb, 0x9f, 0x46, + 0xe9, 0x80, 0x39, 0x68, 0xcb, 0x54, 0x3a, 0x92, 0x69, 0x98, 0xd2, 0xd3, + 0x47, 0xbb, 0xa5, 0x03, 0xa0, 0xb2, 0x51, 0xc0, 0x51, 0x74, 0x3a, 0x54, + 0x18, 0xc3, 0xdb, 0x5c, 0x38, 0x5a, 0x4b, 0x95, 0x89, 0x49, 0xcb, 0xe8, + 0x37, 0x6f, 0xc1, 0xde, 0xfe, 0x14, 0xfe, 0xe1, 0x16, 0xe5, 0x5f, 0x7e, + 0x1c, 0x00, 0xfb, 0x72, 0x89, 0x94, 0x35, 0x0e, 0x7c, 0xad, 0x4e, 0x03, + 0xb8, 0xed, 0xdf, 0x5c, 0x02, 0xed, 0x59, 0x76, 0xff, 0x57, 0x9d, 0x8e, + 0x42, 0x95, 0x19, 0x54, 0xfd, 0x30, 0xf4, 0xb8, 0x0e, 0xa8, 0x44, 0x47, + 0x7b, 0xfd, 0x8d, 0xe6, 0x39, 0x3e, 0xf3, 0x9d, 0x0a, 0xbf, 0x66, 0xa7, + 0xa7, 0x48, 0xaf, 0x04, 0x7a, 0x5a, 0xc9, 0x76, 0xb5, 0x61, 0x65, 0x9f, + 0x5a, 0xcc, 0x71, 0x12, 0x42, 0xd5, 0x65, 0xce, 0x6d, 0xcf, 0xb8, 0xba, + 0xd9, 0xff, 0x53, 0xcd, 0xcb, 0xff, 0x7e, 0x0a, 0x3e, 0xf7, 0x63, 0xe7, + 0x4c, 0x73, 0x9d, 0x6a, 0xaf, 0xed, 0xb6, 0x88, 0xa1, 0x55, 0x00, 0x4d, + 0xc9, 0xa1, 0x3a, 0x89, 0xd9, 0xc5, 0x4a, 0x56, 0xbf, 0x8d, 0x75, 0xc5, + 0x30, 0xb5, 0xc3, 0xea, 0xd7, 0x58, 0x2a, 0x25, 0xc7, 0x30, 0x2c, 0x26, + 0xbf, 0x09, 0x63, 0x5b, 0x80, 0x96, 0x44, 0x14, 0x33, 0xa9, 0x93, 0x92, + 0x03, 0xcf, 0x0a, 0x9c, 0x92, 0xc0, 0x0f, 0x54, 0x5c, 0xf1, 0xbe, 0x64, + 0xf8, 0xba, 0xeb, 0x01, 0x22, 0xd0, 0x16, 0x75, 0xd8, 0x8f, 0x64, 0xd7, + 0x95, 0x3d, 0x72, 0x29, 0x65, 0x04, 0x1f, 0x71, 0x36, 0x38, 0xf8, 0xa7, + 0x7d, 0xc0, 0x82, 0x76, 0xba, 0xe4, 0x1d, 0xc7, 0xc2, 0xf7, 0xd5, 0xfd, + 0xbd, 0xf3, 0x57, 0x1c, 0x0e, 0x3d, 0x08, 0x37, 0xfc, 0x52, 0xf7, 0x30, + 0x6b, 0x7a, 0x7c, 0x64, 0xf8, 0xb2, 0x21, 0x66, 0x8e, 0xce, 0x22, 0xdb, + 0x9d, 0xa0, 0x12, 0xef, 0xf0, 0x14, 0xc3, 0xd7, 0xed, 0xc4, 0xb9, 0xdc, + 0xc1, 0xb2, 0x26, 0x93, 0xa7, 0x52, 0x7d, 0x69, 0x29, 0xc1, 0xea, 0xbb, + 0x16, 0xf7, 0x3d, 0x02, 0xaf, 0x2e, 0x71, 0xcb, 0xea, 0x5a, 0xf8, 0x47, + 0x20, 0x6c, 0xee, 0x47, 0x14, 0x14, 0x08, 0x40, 0x34, 0x5d, 0xc6, 0x7e, + 0x49, 0xb7, 0xa3, 0xed, 0x16, 0xa5, 0x44, 0x18, 0x65, 0xbd, 0x3d, 0xf0, + 0x8c, 0xc4, 0xda, 0x12, 0x22, 0xdb, 0x0d, 0xf5, 0x7c, 0x6d, 0x2e, 0x55, + 0x41, 0xe0, 0x2d, 0x15, 0xa9, 0xd5, 0x66, 0x71, 0xfa, 0x13, 0x79, 0x32, + 0xed, 0xb5, 0xae, 0xc3, 0x93, 0xf7, 0xf5, 0x0f, 0x42, 0x9b, 0x3f, 0xfe, + 0x9a, 0x65, 0xcf, 0x9f, 0xf8, 0xfd, 0xbf, 0xff, 0xc1, 0x44, 0x0c, 0x0c, + 0x35, 0x55, 0x1f, 0x7c, 0xb6, 0xef, 0x22, 0xce, 0x37, 0x5f, 0xb9, 0xfe, + 0x78, 0xe1, 0x65, 0x86, 0xd5, 0x7e, 0x89, 0xe9, 0xf9, 0x2e, 0xb0, 0x89, + 0x78, 0xa2, 0xfe, 0x73, 0xc0, 0x4f, 0x00, 0x83, 0xcd, 0x17, 0xf9, 0xcb, + 0xac, 0xb1, 0xd5, 0x79, 0x5f, 0x27, 0x9f, 0xb9, 0xa2, 0x5f, 0xa7, 0x01, + 0x4a, 0x11, 0x03, 0xaa, 0x20, 0x0d, 0xaf, 0x4a, 0xba, 0x27, 0xed, 0x8d, + 0x26, 0x81, 0xb1, 0x1e, 0xe1, 0x24, 0x81, 0x54, 0xfb, 0xba, 0x80, 0xb1, + 0x0c, 0xcc, 0x6a, 0x2c, 0xb1, 0xdf, 0x35, 0xde, 0x8c, 0x7d, 0x37, 0xc0, + 0x56, 0x32, 0x8d, 0xc9, 0x30, 0x92, 0xfe, 0xb2, 0xee, 0x90, 0x06, 0x8c, + 0xad, 0x04, 0xe3, 0x7a, 0xc9, 0x60, 0xc3, 0x89, 0xc4, 0xfe, 0x78, 0x9d, + 0x18, 0x75, 0x53, 0xa6, 0x24, 0x80, 0x3f, 0x52, 0x81, 0x07, 0x12, 0x05, + 0xdb, 0x32, 0xf6, 0x13, 0xe5, 0xc8, 0x5b, 0xe9, 0x77, 0xf4, 0xf9, 0x3d, + 0x5d, 0xc2, 0xcf, 0x3e, 0x73, 0x25, 0xc7, 0x48, 0x2f, 0x54, 0x6d, 0xba, + 0x8e, 0x97, 0xfd, 0x30, 0x00, 0x79, 0x26, 0x8e, 0xb9, 0x3b, 0xea, 0xaa, + 0xac, 0x07, 0x2c, 0x05, 0xd6, 0xd2, 0x6e, 0x83, 0xbf, 0x51, 0x8e, 0x6c, + 0x0d, 0x44, 0x2b, 0xab, 0x6a, 0xf3, 0x01, 0x66, 0xb9, 0x16, 0x80, 0x29, + 0x6e, 0x61, 0x7e, 0xa1, 0xc5, 0x50, 0xff, 0x9d, 0x4c, 0xad, 0xfd, 0x15, + 0xc4, 0xa9, 0x4f, 0x61, 0x5b, 0x16, 0x95, 0xb5, 0x45, 0xa6, 0xe6, 0x63, + 0x50, 0xd6, 0x50, 0x45, 0x30, 0x5b, 0x93, 0xa9, 0x63, 0x29, 0x6d, 0xc2, + 0xc3, 0xbf, 0xc2, 0xcc, 0xa9, 0x06, 0x83, 0x8e, 0xc0, 0x0f, 0x45, 0x94, + 0x46, 0x33, 0x84, 0x1c, 0x74, 0x81, 0x9b, 0x55, 0xcb, 0x0a, 0x84, 0x55, + 0x6b, 0x7a, 0x88, 0x25, 0x8b, 0x61, 0xee, 0xc5, 0xa9, 0x2b, 0xbf, 0xa6, + 0x7d, 0xf3, 0x05, 0xf8, 0x4b, 0x2a, 0xfd, 0x83, 0x03, 0x45, 0xdc, 0x63, + 0x6a, 0x11, 0x85, 0x79, 0x3d, 0x86, 0x52, 0x6d, 0x42, 0x6d, 0x41, 0xe2, + 0x5d, 0x29, 0x09, 0x43, 0x15, 0x59, 0x2d, 0x6c, 0xa8, 0x27, 0x9b, 0x4c, + 0xdf, 0x6c, 0xae, 0x19, 0x72, 0xd7, 0x39, 0x30, 0xb4, 0x58, 0x29, 0x1b, + 0xc0, 0x18, 0xa1, 0x3c, 0x4e, 0x79, 0xbd, 0x0b, 0xcd, 0x38, 0x6d, 0x56, + 0xbf, 0x7a, 0x7e, 0xb2, 0xc4, 0x10, 0xa1, 0x9c, 0xd5, 0xed, 0x46, 0xe7, + 0x6f, 0x24, 0x94, 0xa6, 0x3f, 0x5f, 0xc1, 0x5a, 0x72, 0xb0, 0x44, 0x89, + 0x50, 0x06, 0x38, 0xa5, 0x4a, 0x2a, 0x3c, 0x65, 0x1b, 0x62, 0x09, 0x8b, + 0xb0, 0x09, 0xa1, 0x0c, 0xd4, 0x7e, 0xea, 0xc7, 0xe2, 0xd0, 0x58, 0x6a, + 0x60, 0x15, 0x14, 0xa4, 0xe5, 0xb6, 0xab, 0x5d, 0xf6, 0x3e, 0xbe, 0x1b, + 0xb8, 0x49, 0x03, 0xb5, 0x6e, 0x07, 0xbe, 0x08, 0xc0, 0xce, 0xcd, 0x77, + 0x32, 0x17, 0x98, 0xf1, 0x3c, 0x81, 0x28, 0xc4, 0x63, 0xc7, 0xa1, 0x0c, + 0xa3, 0x45, 0x12, 0x64, 0x5b, 0x12, 0x76, 0xc0, 0x78, 0xd4, 0xd6, 0x40, + 0xae, 0x14, 0xe8, 0x4a, 0xea, 0x7c, 0xdb, 0x24, 0x7f, 0xc1, 0x31, 0x08, + 0x2b, 0x79, 0x3e, 0xde, 0x42, 0x27, 0x50, 0x2b, 0x09, 0xcf, 0x4a, 0x1e, + 0x5b, 0xfd, 0x76, 0xf4, 0xac, 0x9c, 0x05, 0x6a, 0x01, 0x1d, 0x40, 0xad, + 0x30, 0xf4, 0x53, 0xef, 0x78, 0xb2, 0x40, 0xad, 0x24, 0x64, 0x6b, 0xf4, + 0x14, 0xdc, 0x59, 0x0c, 0x41, 0x8f, 0xdf, 0x25, 0xeb, 0xf0, 0xb2, 0xb6, + 0xaf, 0x67, 0xe2, 0x2b, 0x27, 0xdc, 0x46, 0xc8, 0xee, 0x68, 0x68, 0x96, + 0xd6, 0x9e, 0x09, 0x05, 0xa3, 0x1a, 0x1f, 0x4f, 0x04, 0x30, 0x0e, 0x65, + 0xca, 0x8c, 0x4f, 0xab, 0x50, 0xa2, 0x73, 0xe3, 0x0a, 0xe2, 0x79, 0xcb, + 0x2d, 0xb7, 0xf0, 0x9e, 0xf7, 0xdc, 0x1b, 0xb9, 0xd7, 0xeb, 0xa0, 0x5e, + 0xdf, 0x94, 0xa9, 0x8f, 0x98, 0x7d, 0xf8, 0xc8, 0x48, 0x9d, 0xf1, 0x71, + 0x75, 0x7e, 0x62, 0xa2, 0xcc, 0x07, 0xc6, 0xeb, 0x7c, 0x64, 0x44, 0xa7, + 0x65, 0x1c, 0x48, 0xc4, 0x3b, 0x31, 0x41, 0x14, 0xd7, 0xc4, 0x84, 0x02, + 0x65, 0x85, 0x7b, 0xc0, 0xda, 0xa3, 0xc6, 0xf3, 0x0c, 0x9c, 0x0b, 0x20, + 0x1c, 0x57, 0x10, 0xad, 0x28, 0xc9, 0xe3, 0xb1, 0x5f, 0x80, 0x09, 0x16, + 0xd4, 0x7d, 0xb2, 0x0d, 0xc6, 0xb7, 0x29, 0xb7, 0x94, 0xbd, 0x4e, 0x42, + 0xb9, 0x0e, 0x13, 0x23, 0x0a, 0xac, 0xb5, 0x87, 0x32, 0x75, 0xea, 0x04, + 0xe3, 0x65, 0xca, 0xd4, 0x39, 0x32, 0x1e, 0x57, 0xc3, 0x5f, 0x81, 0xf8, + 0xa7, 0xa3, 0xed, 0xbf, 0x32, 0x11, 0x87, 0xf5, 0x5f, 0xa6, 0x63, 0x30, + 0x96, 0x19, 0x7b, 0x5c, 0xb5, 0x16, 0x94, 0x9f, 0xfb, 0x61, 0xd9, 0x71, + 0xb3, 0xd5, 0x2e, 0x9e, 0xd1, 0x4d, 0xb2, 0xa9, 0x7e, 0x4f, 0xf1, 0xbb, + 0x50, 0x2b, 0x05, 0xac, 0x2a, 0x95, 0xca, 0x89, 0x63, 0x11, 0xb9, 0x29, + 0x20, 0xd6, 0xcb, 0x93, 0xe8, 0xd3, 0xef, 0x1d, 0x74, 0xd2, 0x65, 0x5b, + 0xbd, 0x4b, 0x14, 0x1a, 0xe8, 0x15, 0xe7, 0x49, 0xa6, 0xf6, 0x3b, 0xc2, + 0xe9, 0x92, 0xff, 0xd5, 0x82, 0xc6, 0x64, 0x33, 0xa4, 0xd4, 0x5f, 0x8e, + 0xdf, 0x1d, 0x34, 0x43, 0x84, 0x65, 0x11, 0x04, 0x71, 0x5b, 0x1f, 0x86, + 0x3a, 0x0e, 0x24, 0x7e, 0xe0, 0x21, 0x09, 0xb1, 0x34, 0x84, 0xcc, 0xea, + 0xb7, 0xf0, 0xc3, 0x90, 0xb1, 0xf7, 0xdd, 0xcc, 0xf1, 0x85, 0xc9, 0x9e, + 0x40, 0xad, 0xa4, 0x14, 0x5c, 0x6b, 0x2f, 0x3b, 0xaf, 0xbb, 0x2d, 0x02, + 0x6b, 0x95, 0x35, 0xd4, 0x86, 0x25, 0x3a, 0xc6, 0xcd, 0x92, 0xef, 0xb9, + 0x44, 0x41, 0x41, 0x04, 0x65, 0x5b, 0x95, 0xd3, 0x70, 0x1b, 0x66, 0x0a, + 0xd0, 0xd2, 0x40, 0x2d, 0xa1, 0x81, 0xb9, 0x7e, 0x5b, 0x46, 0xfd, 0x11, + 0x03, 0xd4, 0x4a, 0x42, 0xa6, 0xaa, 0xb2, 0x13, 0xb4, 0x05, 0xdd, 0xc1, + 0x5a, 0xc9, 0x22, 0x9f, 0xd1, 0x75, 0xac, 0x40, 0x30, 0x9b, 0x79, 0xdf, + 0xd2, 0x68, 0x83, 0xad, 0xeb, 0xba, 0xd1, 0x2b, 0x77, 0x71, 0xe3, 0xa5, + 0xfb, 0x61, 0xeb, 0x03, 0x54, 0x01, 0xb9, 0xf5, 0x2e, 0xee, 0x7d, 0x64, + 0x17, 0x9f, 0x6c, 0x4b, 0xec, 0x92, 0x4d, 0x2b, 0x6c, 0x31, 0x88, 0x64, + 0x2e, 0xd3, 0x6b, 0x12, 0xed, 0x96, 0x02, 0x2c, 0x03, 0xb2, 0x9d, 0xae, + 0x1b, 0xe7, 0x35, 0x64, 0xcb, 0x2a, 0xa8, 0x24, 0xc9, 0x82, 0xfe, 0x45, + 0xca, 0x4c, 0xba, 0x75, 0x19, 0xc8, 0x02, 0x54, 0xdb, 0xda, 0x9f, 0xc9, + 0x4a, 0x41, 0xa5, 0xde, 0x2c, 0xf4, 0x33, 0x4b, 0x3c, 0x22, 0xd8, 0x92, + 0x0a, 0xac, 0xa5, 0xb6, 0xf0, 0x59, 0x89, 0xae, 0xbb, 0x25, 0x93, 0x05, + 0x11, 0xd5, 0x9b, 0x93, 0x6d, 0x89, 0xa3, 0x70, 0xec, 0x80, 0x02, 0x6f, + 0xdd, 0xd1, 0x86, 0x4f, 0x13, 0x83, 0x2d, 0xe7, 0x74, 0x39, 0x5c, 0x82, + 0xe4, 0x38, 0x82, 0x7b, 0x81, 0x5b, 0xb4, 0xed, 0x5c, 0x5b, 0x6d, 0xa1, + 0xf3, 0xfd, 0x35, 0x5f, 0xb5, 0x09, 0x7f, 0xe1, 0x4f, 0xe9, 0x63, 0x63, + 0x04, 0x87, 0x32, 0xfa, 0xee, 0x5f, 0xc3, 0x1b, 0x7f, 0xfa, 0x45, 0x5e, + 0x57, 0xb8, 0x88, 0xef, 0xb7, 0x57, 0xb7, 0x3d, 0x77, 0xf2, 0x45, 0xde, + 0xb4, 0x49, 0x01, 0xba, 0xa6, 0xa6, 0xa6, 0xf0, 0x80, 0x77, 0x6e, 0xba, + 0x88, 0x37, 0xae, 0x65, 0x55, 0xfe, 0x41, 0x81, 0xb5, 0x0e, 0xcf, 0x2b, + 0x80, 0x96, 0x9f, 0x69, 0xdf, 0x41, 0xc1, 0xb5, 0xae, 0x18, 0xae, 0xf2, + 0xad, 0x6f, 0x2f, 0xf2, 0xfd, 0xf6, 0x8b, 0xfc, 0xf8, 0xb9, 0x35, 0xfc, + 0x8f, 0xb5, 0xe7, 0x79, 0x5d, 0xe1, 0xa2, 0x08, 0x3a, 0x05, 0x0a, 0x56, + 0x65, 0x8e, 0xd7, 0x38, 0xeb, 0x22, 0x60, 0x58, 0x32, 0x8f, 0xc9, 0x7d, + 0x88, 0x81, 0x57, 0xa0, 0x80, 0x58, 0x6b, 0x9c, 0x75, 0x29, 0xbb, 0x64, + 0x98, 0xa3, 0xa3, 0xa3, 0x9c, 0x38, 0x76, 0x34, 0xe5, 0xdf, 0x00, 0xbb, + 0x4e, 0xfe, 0xf7, 0x93, 0x6c, 0x7a, 0xdb, 0xa6, 0xc8, 0x6e, 0x6a, 0x4a, + 0xf5, 0x23, 0x0c, 0x5c, 0x2b, 0x09, 0xd4, 0x32, 0x20, 0xad, 0x6c, 0x5a, + 0xd6, 0xbd, 0x61, 0x4d, 0x0a, 0xb2, 0xb5, 0x8e, 0xb3, 0x91, 0xcd, 0xba, + 0x37, 0xac, 0x61, 0x8d, 0xb3, 0x2e, 0x4a, 0xeb, 0x9a, 0x33, 0x67, 0x52, + 0xa0, 0x2e, 0x80, 0x90, 0x19, 0xac, 0xaf, 0x26, 0xde, 0x69, 0x26, 0xea, + 0xf0, 0xdb, 0xae, 0x19, 0x63, 0x70, 0x7b, 0x95, 0xb9, 0x43, 0xf3, 0x3c, + 0xfa, 0x87, 0x07, 0x18, 0xbc, 0xbc, 0xc2, 0x90, 0x2b, 0xb8, 0xeb, 0xb7, + 0x3e, 0xcb, 0xdc, 0xa1, 0x79, 0x06, 0xb7, 0x57, 0xf1, 0x6a, 0x35, 0xe6, + 0x8e, 0xd4, 0x18, 0xbc, 0x7c, 0x8c, 0x46, 0x20, 0x23, 0xfb, 0xf4, 0xb9, + 0x0a, 0x8d, 0xa0, 0x42, 0x65, 0x7b, 0x95, 0xda, 0xa1, 0x79, 0xbc, 0xba, + 0x47, 0xe5, 0xca, 0x51, 0x82, 0xa3, 0x53, 0x8c, 0x7e, 0x78, 0x17, 0xc7, + 0x9f, 0x9e, 0x51, 0x63, 0x1d, 0xe7, 0x3c, 0x86, 0xcb, 0x30, 0xfb, 0xd8, + 0x43, 0x54, 0xd6, 0x97, 0xa3, 0x34, 0xcd, 0x3c, 0x61, 0x70, 0x71, 0x4a, + 0xd1, 0x77, 0x2f, 0x61, 0xfc, 0x7d, 0x42, 0xd5, 0xea, 0x1c, 0xbf, 0x1f, + 0x1e, 0x72, 0x19, 0xc6, 0x8d, 0x40, 0x5a, 0x91, 0xff, 0xc4, 0x7b, 0x65, + 0x59, 0x14, 0xaa, 0x1b, 0x2a, 0x81, 0x82, 0x60, 0x6c, 0xb3, 0xcb, 0xbe, + 0x43, 0x33, 0x8c, 0xba, 0x0e, 0xe1, 0x52, 0x48, 0xa5, 0x4f, 0x01, 0xac, + 0xac, 0xd0, 0x47, 0x0e, 0x54, 0x71, 0x2d, 0x47, 0x87, 0x01, 0x52, 0x43, + 0xf7, 0x64, 0xd3, 0x47, 0x24, 0x3a, 0x5f, 0x62, 0x8d, 0x0e, 0xb0, 0xa5, + 0xe0, 0x5a, 0xf2, 0xbc, 0x6e, 0xc7, 0x4c, 0x1d, 0x21, 0x41, 0xd8, 0x3a, + 0x1d, 0x0d, 0xfd, 0x1e, 0x43, 0x43, 0xb7, 0x5a, 0xcd, 0x96, 0xfa, 0x6e, + 0xe7, 0x7c, 0xe2, 0xfb, 0x03, 0xf3, 0xd8, 0xd0, 0x92, 0xec, 0xbc, 0x66, + 0x8c, 0xc9, 0x83, 0x93, 0x14, 0xfb, 0x8b, 0xb4, 0xa2, 0xdf, 0x7d, 0x51, + 0x2d, 0xce, 0x20, 0x54, 0x58, 0xae, 0xe5, 0xd2, 0x90, 0x0d, 0x2c, 0x2c, + 0xc2, 0x24, 0xa0, 0x36, 0x1a, 0x4b, 0x69, 0x46, 0xf7, 0xf4, 0x76, 0xb6, + 0xf3, 0x99, 0x3b, 0x7f, 0xaf, 0xa3, 0xec, 0x56, 0xab, 0xb7, 0x6e, 0xdc, + 0x70, 0x61, 0x1e, 0x56, 0xc7, 0x92, 0x7a, 0xd9, 0x5a, 0x5f, 0x1a, 0x58, + 0xd9, 0xe8, 0x55, 0xd2, 0xba, 0x9f, 0x7c, 0xcb, 0xaa, 0x6d, 0x37, 0xac, + 0xb9, 0x82, 0xb7, 0x6e, 0xdc, 0xc0, 0x73, 0xa7, 0x4e, 0x73, 0xfa, 0xfc, + 0x61, 0xfe, 0xe5, 0xe0, 0x87, 0x78, 0x4e, 0x83, 0x03, 0xbf, 0xfb, 0x7d, + 0x8f, 0x37, 0xbe, 0x2e, 0xfb, 0xbb, 0x3f, 0xdb, 0x71, 0x4f, 0xe7, 0xca, + 0x95, 0x2b, 0x57, 0xae, 0x5c, 0xb9, 0x72, 0xe5, 0xca, 0x95, 0x2b, 0x57, + 0xae, 0x5c, 0xb9, 0x72, 0xe5, 0xca, 0x95, 0x2b, 0x57, 0xae, 0x5c, 0xb9, + 0x72, 0xe5, 0xca, 0x95, 0x2b, 0x57, 0xae, 0xd5, 0x2b, 0x87, 0x6a, 0xe5, + 0xca, 0x95, 0x2b, 0x57, 0xae, 0x5c, 0xaf, 0x96, 0x76, 0x34, 0x28, 0x32, + 0x0c, 0x68, 0x18, 0xd6, 0x52, 0x18, 0x7d, 0x94, 0x6c, 0x64, 0xdc, 0x80, + 0xe8, 0xa3, 0x6e, 0xd0, 0x70, 0x27, 0x6d, 0x67, 0xf5, 0x5b, 0x0a, 0x14, + 0xd5, 0x4c, 0xc3, 0x50, 0x42, 0x0d, 0x4a, 0x32, 0x1f, 0x76, 0x5b, 0x56, + 0x0c, 0xa9, 0x91, 0x6d, 0x89, 0x53, 0x72, 0x22, 0xd0, 0x96, 0x65, 0x59, + 0x11, 0xa8, 0x24, 0x0b, 0xd4, 0x2a, 0x97, 0xcb, 0x11, 0xf8, 0xc6, 0x5b, + 0xf0, 0xa8, 0xd7, 0xeb, 0x00, 0x6c, 0x7f, 0xcf, 0x76, 0x66, 0x0f, 0xcf, + 0xa6, 0x60, 0x5d, 0x96, 0x65, 0xe1, 0xd5, 0x3d, 0xdc, 0xf5, 0x2e, 0xf3, + 0x47, 0xe7, 0x98, 0x47, 0xc1, 0x5d, 0xe6, 0x8f, 0xce, 0x30, 0xf9, 0xb5, + 0x18, 0xa8, 0x95, 0x54, 0xf2, 0xc3, 0xf3, 0x46, 0xb3, 0x13, 0x70, 0x95, + 0x74, 0xeb, 0xa5, 0x24, 0x84, 0xcb, 0xd8, 0x27, 0x01, 0x59, 0x59, 0x37, + 0x63, 0xbf, 0x92, 0xad, 0x28, 0xa8, 0xd5, 0xa4, 0x93, 0x79, 0x4c, 0x95, + 0x71, 0x57, 0x77, 0xa1, 0xae, 0xeb, 0x0e, 0xe0, 0xcb, 0xba, 0x5c, 0xb6, + 0x0a, 0xb8, 0x5f, 0x7f, 0xfc, 0x16, 0x66, 0xf2, 0x12, 0x4a, 0x05, 0xc8, + 0x0a, 0xa5, 0x9a, 0xf9, 0x64, 0xc0, 0x59, 0x49, 0x3b, 0xb3, 0xbf, 0xd6, + 0x86, 0x73, 0x5d, 0xce, 0x6b, 0xf5, 0x82, 0xca, 0x58, 0x7a, 0x92, 0x8c, + 0x57, 0x0f, 0xb1, 0xfb, 0x04, 0x96, 0x99, 0xb4, 0x9a, 0x9c, 0x7c, 0x9c, + 0x0d, 0x6e, 0x35, 0xb3, 0xf1, 0x44, 0xbc, 0x75, 0xfa, 0x93, 0x93, 0x6e, + 0x74, 0x7c, 0x0b, 0x01, 0xb6, 0x55, 0xc2, 0x2d, 0xdb, 0x29, 0x38, 0x96, + 0x01, 0x6a, 0x99, 0xf4, 0xba, 0xeb, 0xad, 0x08, 0xbc, 0x15, 0x86, 0x0a, + 0xf8, 0xe5, 0x2d, 0x04, 0xb8, 0x03, 0x25, 0xbc, 0x85, 0xde, 0x13, 0x11, + 0x9c, 0x92, 0xd5, 0x09, 0xfd, 0xd2, 0xb3, 0xaf, 0xc3, 0x04, 0x28, 0xcc, + 0x0f, 0xc2, 0x68, 0xb2, 0x13, 0x80, 0x5b, 0x8a, 0x41, 0x5f, 0x0a, 0xa8, + 0xa5, 0x41, 0x63, 0xa8, 0x32, 0x32, 0x5a, 0x0e, 0xac, 0x65, 0x59, 0x45, + 0x58, 0x04, 0xee, 0x77, 0xd5, 0xf5, 0x35, 0x73, 0xba, 0x92, 0xf7, 0xf5, + 0xd2, 0x4b, 0x9e, 0xd2, 0xf8, 0x92, 0xd5, 0x0b, 0xbc, 0x15, 0x9f, 0x73, + 0x68, 0x84, 0x8d, 0x68, 0xb5, 0xe0, 0xa4, 0x8a, 0xa2, 0xd8, 0x01, 0x81, + 0x82, 0x74, 0x59, 0x66, 0x41, 0x57, 0x59, 0xf9, 0x8b, 0xf1, 0x4a, 0xc4, + 0x2d, 0xd9, 0xc2, 0x59, 0xbf, 0x3c, 0x20, 0x2f, 0x79, 0x6f, 0x4b, 0x29, + 0x97, 0x0d, 0xbf, 0xd7, 0x24, 0x9d, 0xe5, 0x26, 0xef, 0xf8, 0x81, 0x1f, + 0xdd, 0xef, 0x7e, 0xe0, 0xe3, 0x6e, 0xcc, 0x40, 0xbc, 0x74, 0x9d, 0x2b, + 0xdb, 0x52, 0xaf, 0x64, 0xde, 0x5b, 0xd1, 0x7d, 0xfd, 0x98, 0x3a, 0x4e, + 0xde, 0xd7, 0x6e, 0x79, 0x75, 0x50, 0x96, 0x95, 0xca, 0xef, 0x95, 0xf6, + 0xb7, 0x1a, 0x15, 0x0b, 0x9d, 0xbf, 0x85, 0x1f, 0x65, 0xcd, 0x1c, 0x9e, + 0x42, 0xf4, 0x69, 0x08, 0x65, 0x33, 0x5c, 0x76, 0x3f, 0x08, 0x82, 0x4e, + 0xa0, 0x57, 0xbb, 0x3b, 0x24, 0x52, 0x08, 0x41, 0x60, 0x7e, 0xeb, 0x99, + 0xfb, 0x7a, 0xed, 0xd6, 0x3e, 0xb8, 0x4f, 0x01, 0xaa, 0x06, 0x76, 0xec, + 0x50, 0x60, 0xad, 0x81, 0x01, 0x06, 0x36, 0x6e, 0x64, 0xe1, 0xd4, 0xa9, + 0xae, 0xf0, 0xaa, 0x24, 0x24, 0xcb, 0x00, 0xb4, 0x7a, 0xd9, 0x24, 0xf5, + 0xc1, 0x89, 0x69, 0xee, 0x1c, 0x1f, 0x59, 0xa6, 0x04, 0x5e, 0x19, 0x65, + 0xd3, 0x7c, 0x70, 0x41, 0xa5, 0xe6, 0xe0, 0xc1, 0x83, 0xec, 0xd8, 0xb1, + 0x23, 0x75, 0x6e, 0xc7, 0xc0, 0xc0, 0x3f, 0xde, 0xf3, 0xf7, 0x6d, 0x54, + 0xd7, 0x77, 0x4a, 0x81, 0x03, 0xac, 0xbe, 0x06, 0x5c, 0x99, 0xb9, 0x9f, + 0xef, 0x78, 0x37, 0xbb, 0x78, 0xf5, 0x74, 0x60, 0x21, 0x60, 0xe7, 0x40, + 0x89, 0x03, 0x0b, 0x01, 0xa3, 0xfd, 0x25, 0xa6, 0x96, 0xe2, 0x7a, 0xbe, + 0xba, 0xde, 0xd2, 0xc0, 0x2c, 0x05, 0xd6, 0x52, 0x90, 0x8b, 0x4e, 0xff, + 0xff, 0x60, 0xd5, 0xa5, 0x5f, 0xd3, 0x51, 0xe3, 0xaf, 0x08, 0xd4, 0xd2, + 0xba, 0xd2, 0xc5, 0xea, 0x8b, 0xed, 0xad, 0xbe, 0x06, 0x6c, 0xbd, 0xe4, + 0xe5, 0xa5, 0x6f, 0x39, 0x5d, 0x35, 0x0a, 0x4f, 0x4e, 0x81, 0xe9, 0xa3, + 0x7a, 0x75, 0xf8, 0xe8, 0x6e, 0x05, 0xa8, 0x02, 0xfe, 0xf8, 0x33, 0x75, + 0xdc, 0xab, 0x12, 0x13, 0x72, 0xc4, 0x5f, 0xa5, 0xbc, 0xdb, 0x7d, 0x36, + 0x7c, 0x7c, 0xf8, 0x07, 0x96, 0xbc, 0xe0, 0xc8, 0xbe, 0x95, 0x8d, 0x92, + 0xda, 0xac, 0x61, 0x94, 0x0b, 0x35, 0x05, 0xd4, 0xfa, 0xbb, 0xb9, 0x28, + 0x2f, 0x10, 0x03, 0x34, 0x00, 0x82, 0xc7, 0x0f, 0xc0, 0xc3, 0x69, 0xc0, + 0x23, 0x40, 0x10, 0xec, 0x4b, 0xec, 0xc3, 0xec, 0xe1, 0x1e, 0x69, 0xcb, + 0xd8, 0xad, 0x64, 0x33, 0x9b, 0xb5, 0xd9, 0x7a, 0x09, 0x56, 0x5f, 0xdc, + 0xef, 0x4c, 0xb6, 0xd7, 0x37, 0x6e, 0xdb, 0xce, 0x4c, 0x9f, 0xba, 0x26, + 0xc5, 0xb5, 0x00, 0x36, 0xad, 0x73, 0x0d, 0x6a, 0xd3, 0x0f, 0xb1, 0xfb, + 0x72, 0x85, 0xbf, 0x10, 0x1b, 0x54, 0xbb, 0x21, 0x4f, 0x07, 0xdc, 0x77, + 0x64, 0x92, 0xc1, 0xab, 0x77, 0x2b, 0x77, 0x07, 0xa4, 0x1f, 0x43, 0xb6, + 0x2a, 0x99, 0xf6, 0xa5, 0xb5, 0xd5, 0x05, 0xfd, 0xec, 0x60, 0x34, 0xb5, + 0xe5, 0xde, 0x38, 0x1d, 0x57, 0x76, 0xcf, 0xcb, 0xf5, 0x57, 0xeb, 0xf8, + 0xda, 0x20, 0xdb, 0x9d, 0xd0, 0xd2, 0x03, 0x1f, 0x8e, 0x7f, 0xc7, 0xd5, + 0xad, 0x9d, 0xfd, 0x81, 0x62, 0x4b, 0xc1, 0xb4, 0x8c, 0xec, 0x4b, 0xab, + 0xd1, 0xbe, 0x69, 0xe3, 0x26, 0xb7, 0xdc, 0xb5, 0x62, 0x3a, 0x14, 0xd4, + 0xcb, 0x68, 0x28, 0x91, 0xa6, 0xce, 0x74, 0x54, 0x36, 0x76, 0xef, 0x97, + 0x0c, 0xad, 0xd7, 0x61, 0xd8, 0x02, 0x06, 0x5c, 0x5a, 0xa6, 0x2c, 0x32, + 0x65, 0x52, 0xb6, 0x5a, 0xd8, 0xe5, 0xce, 0xfe, 0xdb, 0xce, 0xf7, 0x94, + 0x4d, 0x2a, 0x91, 0x2f, 0xb8, 0x5d, 0x47, 0xad, 0x67, 0xaf, 0x56, 0xdb, + 0xea, 0x31, 0x3a, 0xda, 0xeb, 0xb7, 0xf7, 0xad, 0xe5, 0xbf, 0x25, 0x9a, + 0xb7, 0x0b, 0xe9, 0x3d, 0x65, 0x01, 0x50, 0x49, 0xbd, 0x1c, 0x50, 0xc7, + 0x4b, 0xe9, 0x65, 0x75, 0x4b, 0xcb, 0x3f, 0xe5, 0xbc, 0x00, 0xfc, 0xb7, + 0x8d, 0xea, 0xfa, 0xfe, 0x85, 0xe6, 0xfc, 0x64, 0xdb, 0x6b, 0x99, 0x00, + 0x6b, 0xcd, 0x9e, 0x48, 0x47, 0x12, 0x6a, 0x78, 0xad, 0xd5, 0xaf, 0xee, + 0xfd, 0xdd, 0xf7, 0x5d, 0xcb, 0x81, 0x7b, 0x8e, 0x03, 0x10, 0x2c, 0xfa, + 0xf8, 0x27, 0x6a, 0x94, 0x4a, 0x0a, 0x12, 0x67, 0xc0, 0x5a, 0x32, 0x03, + 0xd6, 0x9a, 0x7c, 0x96, 0x28, 0x27, 0xfe, 0x33, 0xb3, 0x70, 0x69, 0x15, + 0x47, 0x43, 0xb9, 0xee, 0xfc, 0x93, 0x9b, 0x39, 0x70, 0x7f, 0x17, 0x88, + 0xad, 0x84, 0xfd, 0x4f, 0x2b, 0x3f, 0xd7, 0x56, 0xd3, 0x90, 0x74, 0xaf, + 0x0d, 0x33, 0xb3, 0x92, 0xd1, 0x04, 0x74, 0xcb, 0x3f, 0xed, 0x47, 0x80, + 0xad, 0x7b, 0x67, 0x6e, 0xe3, 0xa1, 0xcf, 0xe9, 0x09, 0xf5, 0x49, 0xd0, + 0xd6, 0xfa, 0xee, 0xe5, 0x54, 0x6b, 0x4b, 0x66, 0x9f, 0x86, 0x21, 0x73, + 0x7f, 0xb7, 0x5b, 0xf8, 0xbe, 0x82, 0x72, 0x19, 0x0d, 0x7f, 0xe2, 0x53, + 0x78, 0x8b, 0x35, 0xfc, 0xd3, 0x3e, 0xfe, 0xc3, 0x3e, 0xf6, 0x06, 0x05, + 0xb2, 0x0d, 0xf4, 0x44, 0x4d, 0x0b, 0x90, 0x2f, 0xc0, 0xd0, 0x35, 0x0a, + 0xf6, 0x32, 0xe8, 0xa8, 0x4c, 0x0c, 0x26, 0x1f, 0xe7, 0xae, 0x01, 0xd8, + 0x85, 0xd7, 0x06, 0xb7, 0xa0, 0x26, 0x84, 0x06, 0x6d, 0x52, 0x30, 0xad, + 0x28, 0xfb, 0xba, 0x0d, 0x1e, 0xdb, 0x01, 0xf3, 0xbe, 0x05, 0x05, 0x8b, + 0xda, 0x09, 0x0f, 0xa7, 0x24, 0x41, 0x0a, 0xbc, 0x25, 0xf0, 0x6b, 0xc7, + 0x15, 0x50, 0xab, 0x2d, 0x69, 0xe9, 0x09, 0xab, 0x51, 0x7b, 0xad, 0x95, + 0xbc, 0xaf, 0x2f, 0x90, 0xa1, 0xbb, 0xa2, 0xbe, 0xb9, 0x02, 0x30, 0x6b, + 0xcb, 0xc7, 0x5f, 0xf3, 0x8a, 0xc7, 0xd9, 0x4d, 0x97, 0x69, 0x80, 0x55, + 0xcd, 0x5e, 0x1e, 0xf0, 0xe5, 0x37, 0x5e, 0x3a, 0xe0, 0xeb, 0x75, 0x80, + 0x09, 0xbd, 0xcd, 0xf2, 0x65, 0xd9, 0xf7, 0xda, 0x8b, 0xe8, 0xb3, 0x2f, + 0x5a, 0x36, 0xbc, 0xe6, 0x0b, 0x2f, 0x72, 0xbe, 0xf9, 0x22, 0x3f, 0x87, + 0x62, 0x1c, 0x7e, 0x57, 0xbb, 0x9f, 0xd4, 0xdb, 0xbf, 0x45, 0x01, 0xb5, + 0xcc, 0xf6, 0x67, 0xa0, 0x03, 0xac, 0x95, 0xbd, 0xaf, 0x93, 0xcf, 0x5c, + 0x49, 0x8d, 0x0e, 0xed, 0x64, 0x6a, 0xf6, 0x00, 0x40, 0x04, 0xb7, 0x9a, + 0xd4, 0xee, 0x24, 0xdc, 0xa5, 0x3e, 0xae, 0xb8, 0x55, 0x6a, 0x9e, 0x02, + 0x31, 0x9a, 0x9e, 0x8a, 0x4c, 0xd8, 0x2e, 0xa7, 0x4e, 0x14, 0x38, 0x51, + 0x38, 0x26, 0x3e, 0xcf, 0xad, 0x82, 0x0e, 0x7f, 0x0c, 0xf0, 0xb6, 0x57, + 0x91, 0xd2, 0x5d, 0x31, 0xfc, 0x31, 0x48, 0xf9, 0x5d, 0x29, 0xec, 0xee, + 0xa8, 0xcf, 0xde, 0xb6, 0xf7, 0xd7, 0x3b, 0x6d, 0x2d, 0xa0, 0xdb, 0xa8, + 0xa5, 0x75, 0x05, 0x84, 0x87, 0x75, 0xad, 0xb6, 0x27, 0x73, 0x72, 0x4f, + 0x39, 0xb5, 0xed, 0x08, 0x76, 0x4f, 0xec, 0x3f, 0xe9, 0x56, 0x07, 0xb8, + 0x42, 0x1d, 0xfe, 0xee, 0x36, 0x40, 0x9f, 0xbf, 0x1f, 0x3a, 0x9f, 0xb9, + 0x12, 0x7d, 0xb3, 0xc1, 0xb2, 0xc5, 0x5c, 0x62, 0x1c, 0x6e, 0x50, 0x2f, + 0x00, 0x30, 0x57, 0x0f, 0xa3, 0x73, 0x83, 0x89, 0x45, 0x01, 0xba, 0xd9, + 0x52, 0x80, 0xb9, 0x85, 0x90, 0xc1, 0x01, 0x8b, 0xc1, 0x81, 0xd8, 0x76, + 0x66, 0x21, 0xb6, 0x1d, 0x5e, 0x85, 0xbb, 0x39, 0x37, 0x3c, 0x60, 0xad, + 0xca, 0xde, 0xb8, 0x3f, 0x70, 0xe0, 0x2f, 0xf8, 0xc2, 0xaf, 0xbe, 0x3b, + 0x86, 0x46, 0x3e, 0x11, 0xc2, 0x65, 0xb1, 0xdd, 0xfc, 0xd1, 0x16, 0x33, + 0x47, 0x95, 0x6d, 0x75, 0xe8, 0x17, 0xc9, 0x4a, 0x6e, 0xfc, 0x34, 0x00, + 0xb3, 0x4b, 0xb7, 0x53, 0x5e, 0xbc, 0x97, 0xe3, 0xb4, 0x30, 0x0d, 0x99, + 0x6d, 0x49, 0xea, 0xe7, 0xa1, 0x11, 0x26, 0xda, 0xa4, 0x59, 0x18, 0x1b, + 0x6a, 0xe0, 0x0d, 0xdc, 0xc1, 0x60, 0xf3, 0x93, 0xcc, 0x9d, 0x2e, 0x52, + 0x19, 0x51, 0xb1, 0x07, 0x4b, 0xaa, 0x0d, 0xab, 0xe9, 0xc1, 0x06, 0xb7, + 0xac, 0xb6, 0xb5, 0x05, 0xa8, 0x0c, 0xc0, 0xe4, 0xe1, 0xb8, 0x55, 0x76, + 0x81, 0xea, 0xa5, 0x36, 0x41, 0x10, 0xb7, 0x33, 0xd5, 0xed, 0x0e, 0xc1, + 0xb9, 0x79, 0x64, 0x7f, 0x11, 0x6f, 0xa1, 0xc5, 0xd4, 0xb1, 0x16, 0xa3, + 0xc0, 0xde, 0x30, 0xa4, 0x32, 0xa4, 0xf2, 0x54, 0x3b, 0xa4, 0x80, 0x29, + 0xf5, 0x3a, 0x0c, 0x6d, 0x69, 0x50, 0xab, 0x27, 0x32, 0x93, 0xe9, 0x9b, + 0x0d, 0xf6, 0x59, 0x4c, 0xe9, 0xdb, 0x5a, 0x86, 0x12, 0x08, 0x11, 0x05, + 0x5f, 0xf5, 0x31, 0xc3, 0x90, 0xe4, 0xaf, 0xd4, 0x12, 0x2e, 0xe1, 0x92, + 0x47, 0x28, 0x6b, 0x58, 0x62, 0x08, 0x51, 0xb0, 0x91, 0xed, 0x06, 0x50, + 0x21, 0xa6, 0x0d, 0x24, 0x23, 0x83, 0x62, 0xbf, 0x45, 0xbd, 0xae, 0xee, + 0x83, 0x56, 0x18, 0x42, 0xdb, 0x06, 0x02, 0x2c, 0xb1, 0x9d, 0x50, 0x1e, + 0xd2, 0x10, 0x2d, 0xe5, 0x6e, 0xf5, 0x59, 0x9d, 0x8b, 0x1f, 0xb4, 0x25, + 0x45, 0xcb, 0xa6, 0xbe, 0xa8, 0xc2, 0xd8, 0xfb, 0x78, 0x8d, 0xdb, 0xae, + 0xae, 0xb0, 0xf7, 0x71, 0xb0, 0xc4, 0x43, 0x7a, 0xe8, 0x5d, 0xb2, 0x73, + 0x00, 0x68, 0x0b, 0xec, 0x7e, 0x87, 0xc6, 0x92, 0x1f, 0xad, 0x73, 0xa1, + 0xfa, 0x1f, 0x6a, 0x2b, 0xa3, 0x67, 0x4f, 0x11, 0x41, 0x15, 0xb2, 0x4a, + 0x82, 0xaf, 0x7a, 0x69, 0x35, 0x36, 0x2b, 0xf9, 0xb1, 0x2c, 0xfb, 0x25, + 0x34, 0x9a, 0xad, 0x0e, 0x88, 0x56, 0x47, 0x3c, 0x89, 0xf3, 0x53, 0x1b, + 0xd5, 0xf5, 0x35, 0x35, 0x5a, 0xaf, 0x3a, 0x3c, 0xd7, 0x3f, 0x02, 0x2d, + 0x33, 0x6e, 0x76, 0x21, 0x40, 0x2d, 0xcb, 0x2a, 0x11, 0x86, 0x41, 0xb4, + 0xcd, 0x4a, 0x01, 0xb4, 0xf4, 0xfd, 0x23, 0x25, 0xb2, 0x2d, 0xb1, 0xfa, + 0xd4, 0x82, 0x3c, 0x52, 0xca, 0x68, 0xcc, 0xf7, 0xe5, 0xca, 0x80, 0xba, + 0xba, 0xa5, 0x5d, 0xb6, 0xa5, 0xae, 0x9b, 0x7a, 0xf9, 0x8d, 0xdf, 0x5d, + 0x5c, 0x28, 0x4c, 0x2c, 0xca, 0x7f, 0x7f, 0x99, 0x70, 0xa9, 0x0e, 0x40, + 0xb0, 0x54, 0xa7, 0x54, 0x52, 0x60, 0x2d, 0x53, 0x47, 0x99, 0x38, 0x92, + 0x8b, 0x1d, 0x59, 0xa5, 0x12, 0x8e, 0xe5, 0xea, 0xf7, 0x95, 0x45, 0xfc, + 0xc0, 0xc3, 0xb6, 0x1d, 0x1c, 0x47, 0xbd, 0xbf, 0x6c, 0x34, 0x87, 0x71, + 0x4a, 0xc3, 0x38, 0x8e, 0x43, 0xa3, 0xb1, 0xfc, 0xfb, 0x0d, 0x80, 0x46, + 0xa3, 0xc1, 0xf6, 0xf7, 0xdc, 0x90, 0x76, 0x5c, 0x9a, 0xea, 0x18, 0x37, + 0x4b, 0xbe, 0xe7, 0x0a, 0x11, 0x08, 0x0d, 0xaf, 0x6a, 0xf4, 0x29, 0xa0, + 0x16, 0x40, 0xb1, 0x20, 0x34, 0x68, 0x4a, 0xf5, 0xe9, 0x85, 0xde, 0x52, + 0x88, 0xc3, 0x91, 0x05, 0xb0, 0x90, 0x84, 0x08, 0xe6, 0x05, 0x38, 0x40, + 0x83, 0xce, 0x77, 0x99, 0xe6, 0x79, 0x49, 0x36, 0x25, 0xa1, 0x3e, 0x97, + 0x7c, 0xa7, 0x67, 0x34, 0x49, 0x03, 0xb0, 0xd9, 0x17, 0xb6, 0xb0, 0xf4, + 0x7b, 0x8d, 0xc6, 0x52, 0x03, 0xbb, 0xdf, 0xc6, 0x79, 0x72, 0x3f, 0xfb, + 0xd8, 0xc5, 0xae, 0x8a, 0xe4, 0xc6, 0x1b, 0x6e, 0x64, 0xf7, 0xf6, 0x4b, + 0x08, 0xda, 0x0a, 0x72, 0xd3, 0x6a, 0x36, 0x90, 0x6d, 0x98, 0x13, 0x30, + 0xd8, 0x4e, 0x83, 0xb5, 0x2a, 0xc0, 0x7c, 0x8f, 0x27, 0x5e, 0x13, 0x7f, + 0x54, 0xcb, 0x6b, 0xc0, 0x67, 0xc7, 0x82, 0x58, 0xe6, 0x3d, 0xbe, 0x06, + 0x6a, 0x99, 0x3c, 0xcb, 0xcc, 0xb8, 0xc6, 0xbd, 0x05, 0xa8, 0x09, 0x68, + 0x49, 0xf0, 0xf4, 0x39, 0x57, 0xb6, 0x38, 0x54, 0x80, 0xed, 0x12, 0x26, + 0x0b, 0xa8, 0xf6, 0x49, 0xc2, 0x81, 0x44, 0x6b, 0x32, 0x08, 0x1c, 0xd7, + 0x51, 0xde, 0x0b, 0xdc, 0xd2, 0x56, 0xc0, 0xac, 0xc1, 0x42, 0x11, 0xbf, + 0x19, 0xb7, 0xe5, 0x63, 0xc8, 0xa8, 0x1f, 0x79, 0x7f, 0x41, 0xf5, 0x41, + 0x67, 0x81, 0xb1, 0x02, 0x4c, 0xea, 0xbc, 0x64, 0xdf, 0x73, 0xf1, 0xde, + 0x06, 0x96, 0xbe, 0xd6, 0x06, 0xf0, 0xf4, 0x72, 0x64, 0xe0, 0x50, 0x53, + 0x1a, 0xf6, 0x74, 0xe9, 0x4f, 0x5f, 0x78, 0x18, 0xfe, 0xb9, 0x25, 0x9c, + 0xbe, 0xee, 0x40, 0x2d, 0xbf, 0x09, 0xd7, 0xbd, 0x57, 0x8d, 0x7d, 0xbd, + 0x89, 0xb7, 0x11, 0x70, 0x92, 0x17, 0x9c, 0x66, 0xf4, 0x9b, 0x33, 0x90, + 0xa9, 0xd1, 0xd1, 0x51, 0xce, 0x68, 0xd0, 0x54, 0x12, 0x6a, 0x65, 0xd2, + 0x77, 0xf6, 0xfc, 0x79, 0x46, 0xb7, 0x8f, 0xa6, 0x40, 0x62, 0x06, 0xa0, + 0x65, 0x6c, 0x0c, 0xa4, 0xca, 0x94, 0x49, 0xaf, 0x30, 0xd7, 0xbd, 0x61, + 0x0d, 0x67, 0xcf, 0x9f, 0x67, 0xdd, 0x9a, 0x35, 0x5c, 0x7c, 0xf1, 0xc5, + 0x9c, 0x21, 0x0d, 0xc0, 0x9a, 0x9a, 0x9a, 0x8a, 0x20, 0x58, 0xc9, 0xb8, + 0x4e, 0x9e, 0x3c, 0xc9, 0xa6, 0x4d, 0x9b, 0x18, 0xdd, 0xa6, 0x00, 0x64, + 0xa3, 0xa3, 0xa3, 0x29, 0x38, 0xd6, 0xe6, 0x6d, 0x97, 0xc1, 0xb1, 0xa3, + 0x9c, 0xf7, 0xcf, 0xb2, 0x79, 0xdb, 0x65, 0x9c, 0x21, 0x86, 0x7a, 0x9d, + 0x3c, 0x79, 0x92, 0x75, 0x9c, 0x4d, 0x85, 0x9b, 0x86, 0x70, 0xfd, 0x2f, + 0x75, 0x5d, 0xdf, 0x0b, 0xfc, 0x3f, 0xaa, 0x6c, 0x92, 0x75, 0xf8, 0xec, + 0xa1, 0x49, 0x66, 0x0f, 0x4d, 0x52, 0xa9, 0x54, 0x08, 0x4e, 0xd7, 0xd8, + 0x37, 0xeb, 0x31, 0xb3, 0xe4, 0x31, 0x3f, 0xeb, 0x71, 0xe3, 0x27, 0xc6, + 0xd8, 0xf7, 0xdb, 0x7b, 0xf1, 0x3c, 0x70, 0x5d, 0x98, 0x7c, 0xa4, 0xc6, + 0xf5, 0x1f, 0xfb, 0x14, 0xfb, 0x7e, 0x7b, 0x2f, 0xce, 0x80, 0xcb, 0xb5, + 0xff, 0x7e, 0x8a, 0xb1, 0xb5, 0x2a, 0xcc, 0xa9, 0xaf, 0x78, 0x1c, 0x78, + 0x36, 0x80, 0x3f, 0x78, 0x88, 0x4f, 0x5d, 0xb3, 0x9d, 0x30, 0xf0, 0x28, + 0xbe, 0xe0, 0x33, 0xd7, 0xe7, 0xe0, 0x7f, 0x76, 0x2f, 0xee, 0xfa, 0x32, + 0xb7, 0x7f, 0xae, 0x86, 0xb3, 0xd9, 0x01, 0xcb, 0x66, 0xea, 0x50, 0x8d, + 0xca, 0x40, 0x19, 0x0a, 0x36, 0x93, 0xb5, 0x79, 0x46, 0xaf, 0x19, 0xc6, + 0xde, 0x0c, 0xd5, 0xba, 0xaa, 0xe7, 0xe7, 0x43, 0x8f, 0xd1, 0x6b, 0x46, + 0xf9, 0xd4, 0x86, 0x31, 0xee, 0xff, 0xbf, 0xf6, 0x71, 0xfd, 0xf6, 0x61, + 0xa6, 0x16, 0x7d, 0x0d, 0xc3, 0xb2, 0x11, 0x42, 0xe0, 0xd5, 0x6b, 0xcc, + 0x4a, 0x28, 0xf5, 0x59, 0xb8, 0x05, 0xc1, 0xd4, 0xa2, 0x8f, 0xb3, 0xb9, + 0x82, 0x55, 0xf7, 0x81, 0x06, 0x14, 0x04, 0x4e, 0xd9, 0x22, 0x38, 0x51, + 0x23, 0x00, 0xfd, 0x5e, 0x58, 0xdd, 0x4f, 0xa3, 0x1b, 0xf5, 0xfb, 0x62, + 0xdf, 0xc7, 0xb1, 0x5d, 0xc6, 0x2e, 0x75, 0xf0, 0x16, 0x3d, 0xe4, 0x52, + 0xc0, 0xdc, 0x82, 0x87, 0x3d, 0x60, 0x53, 0x29, 0xa9, 0x71, 0x70, 0x21, + 0x40, 0xf4, 0x39, 0x6a, 0x5c, 0x46, 0x14, 0x75, 0xdf, 0x54, 0x49, 0x14, + 0x2d, 0x55, 0xd7, 0xad, 0x41, 0x81, 0xb5, 0x8a, 0x20, 0x5a, 0x3a, 0x96, + 0x16, 0x48, 0x64, 0x34, 0x90, 0x26, 0x00, 0x3b, 0xb4, 0xf1, 0xdb, 0x0a, + 0xcc, 0x6e, 0xbe, 0x3b, 0x10, 0x05, 0x1d, 0x0e, 0x6a, 0xf1, 0xa8, 0x7d, + 0x7f, 0xb0, 0x0f, 0x77, 0x63, 0x05, 0x74, 0x5b, 0x25, 0xda, 0xba, 0x17, + 0x2c, 0xe2, 0xef, 0x84, 0xfc, 0xa6, 0xaf, 0xea, 0x5a, 0x51, 0x54, 0x40, + 0x43, 0xa3, 0xe4, 0x58, 0x8a, 0xbe, 0xa7, 0xab, 0xbc, 0x3e, 0x82, 0x36, + 0xbd, 0x75, 0xe3, 0x06, 0xde, 0xf9, 0xf6, 0x77, 0x77, 0xde, 0x50, 0x5a, + 0x7f, 0xf4, 0xc7, 0x13, 0x7c, 0xf0, 0xe7, 0xc7, 0x57, 0x74, 0x5b, 0x8d, + 0x56, 0x1b, 0x56, 0xd2, 0xed, 0xcf, 0xbf, 0xf1, 0x54, 0xd7, 0xb0, 0x4c, + 0xda, 0x93, 0xfa, 0xfa, 0xd3, 0x87, 0x2e, 0x1c, 0xf8, 0xd5, 0x23, 0xac, + 0x6e, 0x6e, 0x49, 0xcd, 0xff, 0xd5, 0xd7, 0x2f, 0x38, 0x9e, 0xd5, 0xea, + 0xf9, 0xef, 0x9d, 0xe1, 0xbb, 0x7f, 0x75, 0x71, 0xca, 0xed, 0xbb, 0xdf, + 0xf7, 0x78, 0xfe, 0x7b, 0x67, 0x78, 0xc3, 0xeb, 0x2f, 0x8e, 0xf6, 0x37, + 0xac, 0xb9, 0x22, 0x3a, 0x9f, 0xbd, 0xa7, 0x73, 0xe5, 0xca, 0x95, 0x2b, + 0x57, 0xae, 0x5c, 0xb9, 0x72, 0xe5, 0xca, 0x95, 0x2b, 0x57, 0xae, 0x5c, + 0xb9, 0x72, 0xe5, 0xca, 0x95, 0x2b, 0x57, 0xae, 0x5c, 0xb9, 0x72, 0xe5, + 0xca, 0x95, 0x2b, 0xd7, 0xea, 0x95, 0x43, 0xb5, 0x72, 0xe5, 0xca, 0x95, + 0x2b, 0x57, 0xae, 0x1f, 0x01, 0x89, 0x92, 0x9b, 0x9a, 0x5c, 0x6a, 0x0b, + 0x2b, 0x5a, 0x2d, 0xdc, 0x5f, 0xca, 0xc0, 0xb2, 0xf4, 0xaa, 0x9b, 0x56, + 0xbf, 0x85, 0xb3, 0x79, 0x18, 0x47, 0x7f, 0x50, 0xee, 0x6e, 0x46, 0x7f, + 0xa0, 0x27, 0x68, 0x34, 0x0c, 0xb4, 0x48, 0x7d, 0x50, 0x17, 0xc1, 0x62, + 0x96, 0xd4, 0xc4, 0xcc, 0x50, 0x0a, 0xec, 0xb6, 0x85, 0x53, 0xd6, 0x93, + 0xae, 0x05, 0xb8, 0x25, 0x17, 0x28, 0xe2, 0xd5, 0x8f, 0x83, 0x80, 0xed, + 0x57, 0xaa, 0xe9, 0x64, 0x8e, 0x99, 0x98, 0x51, 0x10, 0x14, 0xd7, 0xfa, + 0x38, 0x5b, 0x24, 0xe1, 0x52, 0x40, 0xd0, 0x04, 0xf7, 0xd2, 0x51, 0xac, + 0x52, 0x09, 0x5b, 0x4f, 0x38, 0xf5, 0xbc, 0x3a, 0x14, 0x04, 0x01, 0x20, + 0xda, 0x21, 0xb5, 0x13, 0x35, 0x58, 0xf2, 0xa2, 0x74, 0xdc, 0xf0, 0x89, + 0xcf, 0xa6, 0xf3, 0xad, 0xb7, 0xf5, 0xa5, 0x80, 0x56, 0xb3, 0x85, 0x99, + 0xca, 0x1d, 0x36, 0x02, 0xe4, 0xa2, 0xca, 0xa7, 0xdd, 0x67, 0x23, 0xcc, + 0x44, 0xfe, 0x2e, 0x32, 0x76, 0x15, 0x9d, 0xde, 0x52, 0xbf, 0x0a, 0xa5, + 0xae, 0x67, 0xe1, 0x4f, 0x3d, 0x39, 0x89, 0xdb, 0x67, 0xe3, 0xa1, 0x3e, + 0x66, 0xac, 0x6c, 0xdd, 0x4e, 0xb1, 0xaf, 0x08, 0x6d, 0x10, 0xbe, 0x97, + 0x0a, 0xab, 0xb1, 0x30, 0xa7, 0xe0, 0x65, 0x96, 0xc0, 0x1e, 0x18, 0xa4, + 0x5a, 0x1d, 0x52, 0x1f, 0x43, 0xf7, 0xbb, 0x1c, 0xfa, 0x4a, 0x27, 0x14, + 0xac, 0xeb, 0x0a, 0xca, 0x2b, 0x69, 0xad, 0x06, 0x67, 0x99, 0x8f, 0x1b, + 0x9b, 0x80, 0x5b, 0x84, 0x45, 0xa9, 0xdc, 0x2d, 0xa1, 0xf6, 0xb7, 0xda, + 0x50, 0x6b, 0xa8, 0x0f, 0x81, 0xb7, 0xda, 0xf0, 0x6c, 0x03, 0x64, 0x03, + 0x36, 0xd8, 0x70, 0xba, 0x01, 0x15, 0xed, 0x96, 0x4c, 0x8f, 0xee, 0xd9, + 0x39, 0x1a, 0x9a, 0xe5, 0x37, 0x25, 0x96, 0x55, 0x24, 0x0c, 0x5b, 0x34, + 0x9a, 0x12, 0xb7, 0x6c, 0xd1, 0x68, 0x4a, 0xec, 0x3e, 0x41, 0x8b, 0xfc, + 0x19, 0x1f, 0x00, 0x00, 0x20, 0x00, 0x49, 0x44, 0x41, 0x54, 0x37, 0x39, + 0x25, 0xf5, 0x11, 0x68, 0xa3, 0x4b, 0x9e, 0xc2, 0x30, 0x44, 0xe8, 0x7f, + 0xc9, 0x1f, 0xab, 0xdb, 0x6f, 0x21, 0xd1, 0x7e, 0xa4, 0x02, 0x78, 0x85, + 0x61, 0x8b, 0x46, 0x28, 0x71, 0x07, 0x4a, 0x58, 0x56, 0x91, 0xf9, 0x63, + 0x1e, 0xee, 0x40, 0x3c, 0x51, 0x3f, 0x09, 0xb7, 0x02, 0x68, 0x44, 0xd0, + 0x26, 0x41, 0x75, 0x9b, 0x4b, 0x18, 0xb6, 0x22, 0xa0, 0x56, 0x37, 0xb0, + 0x96, 0x99, 0xc0, 0x1c, 0x01, 0xb5, 0x92, 0x93, 0xa6, 0xf5, 0xc4, 0x07, + 0xd1, 0x25, 0x8f, 0xee, 0x7a, 0x8b, 0xc6, 0x52, 0x48, 0x23, 0x01, 0x24, + 0x8b, 0x80, 0x5a, 0x65, 0x4b, 0x6d, 0x75, 0x7c, 0xe6, 0x83, 0x7d, 0x03, + 0xd6, 0x8a, 0xe2, 0x5c, 0x0a, 0xa3, 0x32, 0x2d, 0x75, 0xc4, 0x70, 0x61, + 0x12, 0xa2, 0x84, 0x94, 0xaf, 0x0e, 0xec, 0xa4, 0x25, 0x5b, 0x04, 0x4b, + 0xdd, 0xe3, 0x4e, 0x96, 0x9d, 0x6c, 0xca, 0x68, 0xb5, 0x6c, 0xe8, 0x9c, + 0x30, 0x92, 0x9d, 0x4c, 0x62, 0xec, 0x22, 0xb7, 0x15, 0xee, 0x0f, 0x29, + 0x65, 0x6a, 0x35, 0x6e, 0xe3, 0xef, 0x95, 0x82, 0x48, 0x09, 0x21, 0x68, + 0x84, 0x8d, 0x0e, 0x60, 0x97, 0x4c, 0x7c, 0x6c, 0x2c, 0x33, 0x90, 0x25, + 0x93, 0x96, 0x0b, 0x91, 0xc9, 0x67, 0x23, 0x6c, 0x60, 0x5b, 0xdd, 0x27, + 0xc0, 0x99, 0x7a, 0xd8, 0xb6, 0x6c, 0x5a, 0xb2, 0x85, 0xdd, 0x6f, 0xd3, + 0x58, 0xd2, 0x6e, 0x99, 0x09, 0x70, 0xc6, 0xbd, 0x97, 0x92, 0xf6, 0x49, + 0x5b, 0x67, 0xbd, 0x83, 0xbf, 0xe8, 0x47, 0x5b, 0xe3, 0x06, 0x44, 0xc7, + 0x59, 0x3b, 0x99, 0x98, 0x9c, 0x11, 0x2e, 0x85, 0x58, 0x1a, 0x90, 0x67, + 0x60, 0x6a, 0xbd, 0x8e, 0xb3, 0x6e, 0x49, 0xbf, 0xdd, 0xce, 0x2f, 0xe7, + 0x96, 0x3d, 0x67, 0x64, 0xc2, 0x4d, 0xda, 0x2b, 0xe8, 0x63, 0x90, 0x98, + 0x60, 0xa4, 0xce, 0x87, 0x4d, 0x89, 0x95, 0x98, 0x32, 0x2c, 0x35, 0x20, + 0x4e, 0x36, 0x43, 0x75, 0xae, 0x47, 0xbd, 0x27, 0x84, 0x20, 0x6c, 0xca, + 0x55, 0xd7, 0xe5, 0x77, 0xdf, 0x7d, 0x37, 0x1f, 0xfb, 0xd8, 0xc7, 0x00, + 0xd8, 0x38, 0xb0, 0xfc, 0x8a, 0xc8, 0xe5, 0xb2, 0x02, 0x67, 0xdd, 0x9e, + 0x00, 0x65, 0x7d, 0x70, 0x62, 0x9a, 0x27, 0xf4, 0x7e, 0xd2, 0xfd, 0x81, + 0xe9, 0x3a, 0x37, 0x8d, 0x94, 0x29, 0x97, 0xcb, 0x11, 0x88, 0xab, 0x5c, + 0x56, 0x30, 0xae, 0x1f, 0x34, 0x68, 0xeb, 0xa2, 0x0c, 0x60, 0xeb, 0x9e, + 0xbb, 0xef, 0x5e, 0xd6, 0xfe, 0x1f, 0xcb, 0xf9, 0x8f, 0x2d, 0x6b, 0x15, + 0xeb, 0xb6, 0x6d, 0x25, 0xf6, 0xee, 0xd8, 0x0f, 0x77, 0xc4, 0x93, 0x0e, + 0xf6, 0x4f, 0x3e, 0xc5, 0xb5, 0xef, 0x7d, 0x77, 0x0a, 0xbc, 0x78, 0xdb, + 0xe5, 0xaa, 0x4f, 0x25, 0xdb, 0x3e, 0xf7, 0x1d, 0x0b, 0xd8, 0xa9, 0xc1, + 0x17, 0x07, 0x16, 0x13, 0x36, 0x57, 0x28, 0x9b, 0xbd, 0x87, 0xe3, 0xc9, + 0xf4, 0x59, 0x80, 0x63, 0xb7, 0x70, 0xcc, 0x9c, 0x3e, 0x03, 0xd4, 0xda, + 0xa9, 0xdb, 0x54, 0x03, 0xcc, 0xf2, 0xa4, 0xc4, 0x93, 0x0a, 0xba, 0x25, + 0x13, 0xb6, 0xb7, 0x5d, 0x51, 0x85, 0x44, 0x1b, 0x9a, 0x4c, 0xd3, 0xee, + 0x6d, 0x25, 0x44, 0x41, 0xd5, 0x0f, 0x7b, 0x8f, 0xf4, 0x4e, 0xcf, 0x6a, + 0xd3, 0xd8, 0x2d, 0xaf, 0x9f, 0x9e, 0x9e, 0x7f, 0xc9, 0x65, 0xf4, 0x10, + 0xbd, 0x25, 0x61, 0xe5, 0x49, 0xc2, 0xed, 0x0b, 0xec, 0x9f, 0xbd, 0xd2, + 0x1a, 0xde, 0x05, 0x5f, 0xdd, 0x07, 0xb3, 0x33, 0xea, 0xd8, 0x2d, 0xc3, + 0xcf, 0xbc, 0x1f, 0xfe, 0xf2, 0x4f, 0xa1, 0xfd, 0x2f, 0x56, 0xf4, 0xbe, + 0xee, 0xa7, 0x7e, 0x70, 0x40, 0xad, 0x0b, 0x52, 0x16, 0xa0, 0x35, 0x50, + 0x01, 0xe6, 0xe0, 0x4d, 0x83, 0x3c, 0xf0, 0x9d, 0x39, 0x6e, 0x7a, 0xb2, + 0x17, 0xf2, 0xe1, 0x47, 0x59, 0x21, 0xc5, 0xb5, 0xa6, 0x0d, 0x6a, 0x50, + 0x5c, 0x1b, 0xb7, 0xa9, 0x06, 0xa8, 0x15, 0xed, 0x1f, 0xd1, 0xfb, 0x4e, + 0x7a, 0x7b, 0xc3, 0x7f, 0x50, 0xb0, 0x2c, 0xb1, 0xe4, 0x41, 0xc9, 0xa5, + 0x05, 0xdc, 0x7f, 0xc7, 0x2d, 0x0c, 0xfd, 0xd7, 0xc7, 0x01, 0xf4, 0xb6, + 0xc5, 0x6e, 0x3d, 0x09, 0xcb, 0x5a, 0xdf, 0x82, 0x56, 0x8b, 0xd9, 0xff, + 0xe3, 0x6a, 0x6e, 0x9b, 0x52, 0xcf, 0x43, 0xc3, 0x7a, 0x6b, 0x7f, 0xcc, + 0xc0, 0x6e, 0x75, 0xfd, 0x30, 0xfa, 0x2b, 0x54, 0xbf, 0xba, 0x13, 0x80, + 0xca, 0x57, 0xc7, 0xb8, 0x5e, 0xdf, 0xd3, 0xae, 0xa5, 0x26, 0x82, 0xd6, + 0xde, 0x3b, 0xc9, 0x6d, 0x9f, 0x79, 0x00, 0x80, 0xd1, 0xcf, 0x28, 0xbb, + 0x41, 0x47, 0xf7, 0x9f, 0xca, 0x2a, 0xbe, 0x29, 0x37, 0xa6, 0xe0, 0x58, + 0x57, 0xc2, 0xee, 0xf5, 0x55, 0x2c, 0x37, 0xbe, 0x27, 0x46, 0x4b, 0x69, + 0xe8, 0x99, 0x6c, 0x0f, 0x51, 0xbc, 0x59, 0x44, 0x69, 0x98, 0x94, 0xb3, + 0xa9, 0xf3, 0x95, 0x8d, 0x82, 0xeb, 0xd7, 0xee, 0xc4, 0x4d, 0x34, 0xdd, + 0xa3, 0x47, 0xd3, 0xe8, 0x91, 0xe1, 0xab, 0x6e, 0x54, 0x3b, 0x03, 0x2e, + 0xad, 0x7a, 0x0d, 0xda, 0x30, 0x5f, 0x4e, 0xf7, 0x96, 0x6f, 0xb8, 0xa6, + 0x8c, 0x5d, 0x96, 0x34, 0xea, 0xea, 0xb8, 0x6a, 0xa7, 0x41, 0x44, 0xd6, + 0xbf, 0x19, 0x46, 0xbe, 0xe0, 0x22, 0x5b, 0xf3, 0x50, 0x80, 0x19, 0x12, + 0xe0, 0x11, 0xd9, 0x62, 0x6c, 0xfb, 0x76, 0x00, 0xca, 0x16, 0x70, 0xac, + 0x0b, 0xc4, 0xe8, 0x02, 0x95, 0x05, 0x3e, 0xad, 0xd4, 0xfb, 0x4c, 0xda, + 0xaf, 0xb6, 0xa7, 0xda, 0xab, 0x47, 0x69, 0xfc, 0xf7, 0xaa, 0xa9, 0x92, + 0xe7, 0x57, 0xcb, 0x3a, 0xfe, 0xc7, 0x9a, 0x97, 0x95, 0xe4, 0x2d, 0x38, + 0xf8, 0xe7, 0xd4, 0x73, 0xbd, 0x57, 0xaf, 0x71, 0xc9, 0x65, 0x15, 0xf0, + 0x25, 0x8d, 0x30, 0xa4, 0xd5, 0x86, 0xa2, 0x6e, 0x87, 0x46, 0xaf, 0xd1, + 0x30, 0x90, 0x69, 0xa8, 0x5c, 0x75, 0x09, 0xd5, 0x01, 0x78, 0xe8, 0xf3, + 0x89, 0xb1, 0x96, 0x40, 0x42, 0x3f, 0x4c, 0x3e, 0xa1, 0x9f, 0xa5, 0xcf, + 0xa9, 0xdf, 0x58, 0xb8, 0x14, 0x52, 0xfd, 0xd9, 0x21, 0x05, 0x54, 0x4e, + 0x68, 0xec, 0x06, 0x97, 0xb9, 0x67, 0x05, 0x33, 0x5f, 0x96, 0xec, 0xbc, + 0x59, 0xdd, 0x7b, 0xb7, 0xff, 0xdc, 0xfd, 0x38, 0x97, 0x0e, 0x51, 0xf7, + 0xe6, 0x28, 0x33, 0x88, 0x79, 0x60, 0x7c, 0xf4, 0xcb, 0xaa, 0x04, 0x02, + 0x3d, 0xb6, 0xb3, 0xf3, 0xa3, 0xea, 0x1e, 0x9d, 0x7a, 0x30, 0x9e, 0x2c, + 0xef, 0x6e, 0x74, 0xd9, 0x79, 0xab, 0xcb, 0xcc, 0xac, 0xc3, 0xd4, 0x83, + 0x92, 0xeb, 0x3f, 0xe1, 0x32, 0x3b, 0x0b, 0x33, 0x8f, 0x1c, 0xc0, 0xbd, + 0x7c, 0x88, 0xd9, 0x07, 0x25, 0xac, 0x87, 0x2f, 0x3c, 0x29, 0xa3, 0xb4, + 0x78, 0x8b, 0x1e, 0xfe, 0x69, 0x15, 0xe6, 0xf0, 0x75, 0xc3, 0xcc, 0x3e, + 0x48, 0x04, 0xde, 0x72, 0x1c, 0x8b, 0xeb, 0x3f, 0xa1, 0x27, 0xcb, 0x3e, + 0x02, 0xac, 0x97, 0xb8, 0xeb, 0x5d, 0xdc, 0xf5, 0x2e, 0x33, 0xb3, 0x33, + 0xdc, 0xf0, 0x89, 0x5d, 0x38, 0x28, 0xc0, 0x17, 0x6d, 0x89, 0xd3, 0x06, + 0xbf, 0x00, 0xce, 0x32, 0xed, 0x6b, 0x4b, 0x4f, 0xd6, 0x2e, 0x11, 0xff, + 0x1e, 0x92, 0x40, 0xad, 0xec, 0x73, 0x15, 0x00, 0x2f, 0x40, 0xb5, 0x5f, + 0x9d, 0xab, 0x5c, 0xee, 0x20, 0x8a, 0x02, 0xd9, 0x92, 0xf8, 0xdf, 0x84, + 0x9d, 0xbf, 0xac, 0xca, 0xc1, 0xd1, 0x65, 0x30, 0xf7, 0xcc, 0x4c, 0xef, + 0xc8, 0xff, 0x09, 0xa8, 0xa2, 0xa1, 0x59, 0x4f, 0xf4, 0x38, 0xff, 0xba, + 0x97, 0x10, 0xe6, 0x6b, 0x81, 0x7f, 0x8e, 0x02, 0x05, 0xbc, 0x5e, 0xbb, + 0x9d, 0x47, 0x35, 0x6f, 0x67, 0x7a, 0xf8, 0x69, 0xbe, 0xf0, 0x22, 0x7f, + 0xab, 0x41, 0x5f, 0xbd, 0xf4, 0x13, 0x7d, 0x17, 0xb1, 0x05, 0xf5, 0x5b, + 0x48, 0x5e, 0xb5, 0x9f, 0x48, 0xec, 0xff, 0x6d, 0x66, 0xdb, 0x0d, 0xac, + 0xd5, 0x4b, 0x7e, 0x00, 0xbb, 0x86, 0xaa, 0x4c, 0xd5, 0x6a, 0x70, 0x68, + 0x32, 0xaa, 0x3c, 0x26, 0x01, 0x21, 0x05, 0xa3, 0x42, 0x32, 0x75, 0x68, + 0x12, 0xbf, 0x2c, 0x30, 0x98, 0x4d, 0x37, 0xf0, 0xf0, 0xa4, 0x80, 0x5a, + 0x0d, 0xca, 0x82, 0x7d, 0xcf, 0x80, 0xa9, 0x4d, 0xf6, 0x7f, 0x39, 0x06, + 0x5e, 0xed, 0x03, 0xb8, 0x54, 0xe0, 0x04, 0x92, 0x29, 0x03, 0x73, 0xd3, + 0x93, 0x94, 0x27, 0x75, 0xdc, 0x4e, 0x09, 0x46, 0xa5, 0x40, 0x00, 0x53, + 0xa8, 0xe8, 0x67, 0x0e, 0x4d, 0x32, 0x2a, 0xc0, 0xab, 0xd5, 0x10, 0x65, + 0xc1, 0xe4, 0x11, 0x89, 0x28, 0x09, 0x38, 0x58, 0xc3, 0xa3, 0x86, 0x40, + 0x20, 0x45, 0xf7, 0xda, 0xcb, 0x73, 0x05, 0xee, 0x21, 0xa9, 0x28, 0x46, + 0x5d, 0xf3, 0x1b, 0xa7, 0x5d, 0x20, 0xa2, 0x38, 0x47, 0x85, 0x4e, 0xa3, + 0x0e, 0x77, 0x5f, 0x20, 0x70, 0x0f, 0x4d, 0xe2, 0x85, 0x40, 0x30, 0x1f, + 0xe5, 0x67, 0x17, 0xc0, 0xef, 0x00, 0xbf, 0x9e, 0x09, 0xd8, 0xcc, 0xbd, + 0xcd, 0x80, 0x4c, 0xc3, 0xcc, 0x71, 0x56, 0x59, 0x68, 0x96, 0x75, 0x45, + 0xda, 0x5f, 0xd6, 0x7f, 0x64, 0x7f, 0x18, 0xca, 0x5f, 0x44, 0xd5, 0x51, + 0x87, 0xbb, 0x00, 0xb9, 0xba, 0x68, 0xec, 0xb2, 0xce, 0x71, 0x81, 0xa4, + 0x06, 0xcb, 0x56, 0x64, 0x23, 0xfa, 0x8a, 0x11, 0xac, 0x69, 0xae, 0x1e, + 0xb2, 0x73, 0x7b, 0x82, 0xfa, 0xa7, 0xeb, 0xa2, 0x9d, 0x57, 0x3a, 0x1c, + 0x78, 0x5a, 0xd5, 0x8b, 0x49, 0xc0, 0xd6, 0xd8, 0x95, 0xb1, 0xed, 0xcc, + 0x42, 0xc8, 0x9f, 0xfe, 0xf9, 0x5f, 0xf0, 0xfe, 0x77, 0xbe, 0x23, 0x72, + 0xbb, 0xe1, 0x3f, 0x3f, 0x45, 0xf0, 0xd8, 0x2f, 0x76, 0xd8, 0x4f, 0x3e, + 0x9d, 0x1e, 0x93, 0xef, 0xa6, 0x9b, 0x76, 0xbe, 0x83, 0xe1, 0x01, 0x0b, + 0xf1, 0x70, 0x3c, 0x1e, 0x31, 0x77, 0x47, 0x1d, 0x81, 0x86, 0x70, 0x2d, + 0x84, 0x1d, 0x94, 0xed, 0x99, 0xa3, 0x21, 0xd5, 0xa1, 0xa2, 0xda, 0x5e, + 0x16, 0x43, 0x3c, 0xea, 0xe2, 0x16, 0xaa, 0x97, 0x15, 0x69, 0x3c, 0xad, + 0xfa, 0x89, 0x8d, 0x50, 0xd0, 0x48, 0x0c, 0x93, 0xb8, 0xe5, 0x10, 0xd7, + 0x76, 0xa3, 0x3c, 0x3a, 0xc0, 0xe0, 0x86, 0x16, 0x73, 0x1a, 0xa2, 0xb5, + 0xeb, 0x2a, 0x87, 0x99, 0x53, 0x3e, 0xb6, 0x05, 0x96, 0x45, 0x04, 0xd7, + 0x42, 0x4a, 0x6a, 0xdf, 0x54, 0xbb, 0x95, 0x2d, 0x82, 0xda, 0x37, 0x25, + 0x43, 0x3b, 0x04, 0x0f, 0x1d, 0xf4, 0xd8, 0x79, 0xa9, 0x8b, 0x6c, 0xb7, + 0xf0, 0x05, 0x4c, 0xce, 0xce, 0x90, 0xe4, 0xc9, 0xb8, 0x03, 0x45, 0x5a, + 0x85, 0xdb, 0xb9, 0xed, 0xdc, 0xed, 0xcc, 0xcf, 0xea, 0xc9, 0xfc, 0x4d, + 0xa0, 0x24, 0xb0, 0x2c, 0x9b, 0xd9, 0x6f, 0x36, 0x00, 0x49, 0x75, 0xc0, + 0x61, 0x25, 0x8c, 0x4b, 0x0c, 0x21, 0x90, 0x88, 0x82, 0x43, 0xd8, 0x6e, + 0x90, 0xc4, 0xbe, 0x85, 0xd2, 0x23, 0x94, 0xbe, 0xb6, 0xd5, 0x63, 0xbb, + 0x05, 0x07, 0xf0, 0xe8, 0xf6, 0x6b, 0xb2, 0x44, 0x89, 0x86, 0x7e, 0x3e, + 0xb6, 0x44, 0x49, 0x8d, 0x35, 0x17, 0xd4, 0x38, 0x7a, 0x28, 0x0f, 0xe9, + 0x30, 0x7d, 0x2c, 0xa1, 0xe2, 0x2a, 0x5a, 0x0e, 0x61, 0x10, 0x52, 0xb6, + 0xae, 0xa7, 0x1e, 0x3e, 0x84, 0x25, 0xc6, 0x08, 0xdb, 0x73, 0xb4, 0x42, + 0x1f, 0xda, 0x92, 0x7d, 0x5f, 0xfb, 0x34, 0x65, 0xcb, 0x62, 0xef, 0xe3, + 0x00, 0x0f, 0x10, 0xca, 0x9b, 0xb8, 0xed, 0xea, 0xff, 0x97, 0xbd, 0x8f, + 0xff, 0x0b, 0x24, 0x0f, 0xa0, 0xea, 0x13, 0xa9, 0xc3, 0x8d, 0xc1, 0x06, + 0xa1, 0x34, 0xb0, 0x7e, 0xdd, 0x1f, 0x2f, 0xf4, 0x5e, 0xa0, 0xe1, 0x95, + 0x50, 0xb8, 0xd4, 0x48, 0x43, 0xb4, 0xda, 0x20, 0x9b, 0xad, 0xe8, 0x3d, + 0x12, 0x74, 0x1e, 0x77, 0x0d, 0x27, 0xf4, 0x3b, 0x20, 0x5a, 0x66, 0x91, + 0x91, 0xb4, 0x5d, 0xb8, 0x22, 0x6c, 0xab, 0x9b, 0xea, 0x40, 0x99, 0xf8, + 0xca, 0x95, 0x13, 0x6e, 0xc9, 0xf3, 0x23, 0x23, 0xea, 0x78, 0x7a, 0x1a, + 0xc6, 0xf7, 0xc4, 0xfb, 0xe5, 0x84, 0xef, 0x32, 0x65, 0xa6, 0xeb, 0x75, + 0xca, 0x65, 0xa8, 0x53, 0x8f, 0xec, 0x26, 0x26, 0xd4, 0x76, 0x7c, 0x1c, + 0x2c, 0xab, 0xcc, 0x17, 0xbf, 0xf8, 0x38, 0x7b, 0xc6, 0xcb, 0xd4, 0xb5, + 0xbf, 0x91, 0x72, 0x59, 0xc7, 0xa5, 0xfc, 0x1a, 0xed, 0x19, 0xd7, 0xf1, + 0x97, 0x15, 0x57, 0xb0, 0x3e, 0x01, 0x7b, 0x4c, 0x1c, 0x00, 0xe3, 0x3a, + 0x8d, 0x75, 0x18, 0x19, 0x37, 0x71, 0x95, 0x19, 0x19, 0xa9, 0xf3, 0x95, + 0x71, 0x75, 0xba, 0xbe, 0x07, 0x3e, 0x32, 0xad, 0xd2, 0x5f, 0xaf, 0xab, + 0xb0, 0xc2, 0x3d, 0x70, 0xa9, 0x0e, 0xc7, 0xc4, 0x6f, 0xd2, 0xb2, 0x67, + 0x1c, 0xca, 0x23, 0x30, 0x31, 0x0e, 0xe3, 0xa9, 0x52, 0x00, 0x26, 0x60, + 0x22, 0x4e, 0x1e, 0xe3, 0xe3, 0x74, 0xa8, 0x4e, 0x3d, 0x2a, 0x93, 0x7a, + 0xc2, 0x4e, 0x47, 0x15, 0x95, 0xd9, 0xf8, 0x78, 0x3d, 0x72, 0xfb, 0x48, + 0x94, 0xdf, 0x32, 0x47, 0xa8, 0x63, 0x11, 0x97, 0x99, 0xd1, 0x07, 0xa6, + 0xe3, 0xfd, 0x5b, 0xde, 0x07, 0xf7, 0xea, 0x4e, 0xc8, 0xc2, 0x42, 0xef, + 0xfe, 0xc8, 0x4b, 0x91, 0x65, 0xc5, 0xcf, 0x85, 0x06, 0xa8, 0x25, 0xfa, + 0xac, 0x9e, 0x0b, 0xd9, 0x58, 0x96, 0x15, 0x2d, 0x28, 0x64, 0x16, 0x00, + 0x11, 0x05, 0xd1, 0x75, 0x31, 0x90, 0x0b, 0x49, 0x83, 0x6c, 0x4b, 0x84, + 0x50, 0x0f, 0xd6, 0xc9, 0xc5, 0x8b, 0x56, 0x92, 0x79, 0xaf, 0x60, 0xc6, + 0xa2, 0x2f, 0xf4, 0xbd, 0x45, 0x2a, 0xff, 0x1a, 0xa8, 0x25, 0xfa, 0x2c, + 0x64, 0x33, 0x24, 0x08, 0xea, 0x20, 0x20, 0x08, 0xd2, 0x8b, 0x9a, 0x44, + 0x0b, 0x1e, 0x0d, 0x54, 0xb1, 0x2d, 0x0b, 0xda, 0x45, 0x4c, 0x0f, 0xdc, + 0xb6, 0x54, 0x87, 0x22, 0x3c, 0xd7, 0xa0, 0xe4, 0x98, 0xc5, 0x44, 0x66, + 0x98, 0x3d, 0x5c, 0xa7, 0x3c, 0x50, 0xc6, 0x2d, 0x8f, 0x46, 0x61, 0x1d, + 0xfa, 0xda, 0x17, 0x28, 0x0f, 0x94, 0xa9, 0x2f, 0xd4, 0xa3, 0x6d, 0x16, + 0xa8, 0x75, 0xe8, 0x6b, 0x5f, 0xa0, 0x62, 0x95, 0x57, 0x2e, 0x87, 0x02, + 0xf8, 0x10, 0xc3, 0xb3, 0x40, 0x03, 0x62, 0xf4, 0x82, 0x50, 0xc4, 0x35, + 0xa5, 0x90, 0xa4, 0x60, 0x52, 0xa1, 0xe9, 0xcc, 0x15, 0x44, 0xdc, 0x5e, + 0x24, 0x20, 0x54, 0x00, 0x77, 0xb6, 0x35, 0x0c, 0xaa, 0x00, 0xae, 0x00, + 0x4f, 0xaa, 0x2d, 0x40, 0x2b, 0xf1, 0x5e, 0xc3, 0x2b, 0x08, 0x86, 0xda, + 0x2d, 0x40, 0x12, 0x34, 0x25, 0x26, 0xb7, 0xe1, 0xa2, 0x8f, 0x00, 0xdc, + 0xc7, 0xf6, 0x31, 0xf9, 0xd8, 0x3e, 0x6e, 0x04, 0xe4, 0xc1, 0x39, 0x2c, + 0xe0, 0xfa, 0x25, 0x3f, 0x02, 0x03, 0xa3, 0xfb, 0x7f, 0xd5, 0xc4, 0xb3, + 0x8b, 0x10, 0x50, 0x4d, 0x3c, 0xd7, 0x14, 0xfb, 0xf5, 0xa2, 0x31, 0x4b, + 0xad, 0xd4, 0x71, 0x45, 0x2a, 0x20, 0x96, 0x69, 0x0f, 0x66, 0x24, 0x0c, + 0xf7, 0xe9, 0xe3, 0x82, 0xda, 0x56, 0xda, 0xe0, 0x21, 0x00, 0x81, 0xd7, + 0x96, 0x38, 0x02, 0x7c, 0x09, 0x8e, 0x72, 0xc2, 0x8c, 0x64, 0xcc, 0x16, + 0xa0, 0xd2, 0x86, 0x5a, 0x01, 0xe6, 0x81, 0x4f, 0xb5, 0xe1, 0x16, 0x24, + 0xb4, 0x05, 0x63, 0xc4, 0x76, 0x83, 0x7a, 0x3b, 0x07, 0x3c, 0x80, 0xe4, + 0x16, 0x03, 0xde, 0x2c, 0xa8, 0xae, 0xe5, 0x0d, 0xcd, 0x16, 0xc9, 0x11, + 0x9e, 0x03, 0x12, 0xee, 0x15, 0xf0, 0x49, 0xe0, 0x78, 0x1b, 0x8e, 0x6b, + 0xf7, 0xd5, 0x8e, 0xde, 0x6d, 0xde, 0x76, 0x19, 0x9b, 0x81, 0x13, 0xc7, + 0x8e, 0x46, 0x80, 0xa9, 0x8b, 0x2f, 0xbe, 0x98, 0x33, 0x67, 0xce, 0xc4, + 0x5f, 0x16, 0x66, 0xb6, 0x17, 0xbf, 0xe5, 0x62, 0x4e, 0x1c, 0x3b, 0xca, + 0xd6, 0x6d, 0x97, 0x31, 0x35, 0x35, 0xc5, 0xd6, 0x51, 0x05, 0x95, 0xe2, + 0x79, 0x05, 0xb7, 0x2a, 0x15, 0x36, 0xa5, 0xec, 0x4f, 0xfe, 0xf5, 0x49, + 0x40, 0x3d, 0x6f, 0x8c, 0x8e, 0x6e, 0xe7, 0xc4, 0xb1, 0xa3, 0x09, 0x10, + 0x14, 0x9c, 0x7d, 0x7c, 0x81, 0xcd, 0xdb, 0x2e, 0xa3, 0xef, 0xf5, 0x3f, + 0xc6, 0xd8, 0x5b, 0x55, 0xd8, 0x9b, 0xb7, 0x5d, 0x16, 0xa5, 0xe9, 0xad, + 0x7f, 0x77, 0x96, 0x37, 0x04, 0x76, 0x04, 0xa1, 0x3a, 0x39, 0x75, 0x92, + 0x4d, 0x9b, 0xde, 0x06, 0x05, 0x95, 0xd6, 0xa9, 0x93, 0x53, 0x6c, 0xda, + 0xb4, 0x29, 0xb2, 0x5f, 0xf7, 0x86, 0x35, 0x9c, 0x38, 0x76, 0x94, 0x75, + 0x6f, 0x58, 0x13, 0xe5, 0xf3, 0xec, 0xf3, 0xe7, 0x59, 0xf7, 0x86, 0x35, + 0x11, 0x50, 0xcb, 0x40, 0xaa, 0x78, 0x3e, 0x86, 0x65, 0xad, 0x7b, 0xc3, + 0x9a, 0x08, 0x58, 0xc5, 0xf3, 0x27, 0x97, 0x0d, 0x73, 0x8d, 0xb3, 0x0e, + 0xce, 0x9f, 0xe4, 0xec, 0xf3, 0xe7, 0x59, 0x93, 0x81, 0x74, 0x19, 0x00, + 0x57, 0x32, 0x2e, 0x20, 0x02, 0x67, 0xa1, 0xcb, 0xdb, 0x84, 0x69, 0xc2, + 0x3f, 0x7b, 0xfe, 0x3c, 0xe8, 0xb2, 0x31, 0xe7, 0xcc, 0x35, 0x32, 0x30, + 0x2f, 0x03, 0xd3, 0x4a, 0xc2, 0xd0, 0x4c, 0x39, 0xbe, 0x64, 0x69, 0x58, + 0x9d, 0x77, 0xba, 0xa8, 0xaf, 0x59, 0x0b, 0xf1, 0x5a, 0x11, 0xb9, 0x39, + 0x03, 0xaa, 0x5f, 0x3e, 0x79, 0x4e, 0xf5, 0x37, 0xaa, 0x97, 0x55, 0xd9, + 0xbe, 0x05, 0xec, 0x05, 0x3d, 0x86, 0xa7, 0xdf, 0x11, 0x3b, 0xfd, 0x16, + 0xf4, 0x6f, 0x87, 0x45, 0x0f, 0xa1, 0x21, 0xe7, 0x96, 0x55, 0x62, 0xf4, + 0x9a, 0x61, 0xcc, 0x03, 0xde, 0x50, 0xc9, 0xd5, 0xd0, 0x41, 0x89, 0xd0, + 0xdf, 0x35, 0x8c, 0x55, 0x1c, 0x84, 0xa5, 0xec, 0x4b, 0x7a, 0x91, 0x24, + 0x67, 0xc0, 0xc1, 0x19, 0x70, 0x90, 0x80, 0x5b, 0xf0, 0x99, 0x6d, 0x86, + 0x58, 0x08, 0x6c, 0xcb, 0xc6, 0x0f, 0x55, 0x7d, 0x60, 0x59, 0x0e, 0x61, + 0x19, 0x86, 0xcb, 0xca, 0xae, 0xf5, 0x5a, 0x1d, 0x27, 0x02, 0x67, 0xc0, + 0x41, 0xd4, 0x7d, 0x10, 0x10, 0x2e, 0x09, 0xac, 0x7e, 0xf5, 0x2e, 0x5b, + 0x08, 0xf5, 0xbd, 0x83, 0x28, 0x08, 0x4a, 0xed, 0x16, 0x9e, 0x00, 0xff, + 0x84, 0x8f, 0x5c, 0x92, 0x94, 0x9a, 0x0d, 0xec, 0x4b, 0xe3, 0xfa, 0x34, + 0x09, 0xd4, 0xa2, 0x05, 0x14, 0x41, 0x9e, 0x0f, 0x11, 0x6b, 0x2c, 0x58, + 0x23, 0xa3, 0x41, 0x92, 0xa8, 0x1f, 0xa8, 0x6d, 0xa2, 0x2d, 0x6a, 0x0d, + 0x82, 0x86, 0x4c, 0xb7, 0x21, 0xb2, 0x15, 0xe2, 0xac, 0x77, 0x98, 0x3c, + 0x38, 0x89, 0xbb, 0xb1, 0x82, 0x6c, 0x85, 0x94, 0xd7, 0x58, 0xd4, 0x12, + 0xed, 0x53, 0xe0, 0x05, 0x88, 0xb5, 0xe6, 0xd9, 0xd5, 0xa6, 0xa8, 0x2b, + 0x5c, 0x59, 0xb0, 0xe1, 0x02, 0xde, 0x65, 0xf7, 0x02, 0x57, 0x2d, 0x77, + 0x7e, 0x25, 0x3f, 0x2f, 0x37, 0xac, 0x97, 0x1a, 0xfe, 0x0f, 0x4b, 0xd5, + 0x7f, 0xfe, 0xae, 0x55, 0xc3, 0xb8, 0x56, 0x02, 0x74, 0x65, 0xb5, 0xf3, + 0xc8, 0x67, 0xe0, 0xfb, 0xdf, 0x66, 0x64, 0xba, 0x0c, 0xe5, 0x6f, 0x33, + 0x5d, 0xfe, 0x0c, 0x3b, 0xcd, 0xc9, 0xef, 0x7f, 0x3b, 0xea, 0x87, 0x4e, + 0x4f, 0x3c, 0xc4, 0xc8, 0x38, 0x8c, 0xd7, 0x47, 0x5e, 0x62, 0x2e, 0x72, + 0xe5, 0xca, 0x95, 0x2b, 0x57, 0xae, 0x5c, 0xb9, 0x72, 0xe5, 0xca, 0x95, + 0x2b, 0x57, 0xae, 0x5c, 0xb9, 0x72, 0xe5, 0xca, 0x95, 0x2b, 0x57, 0xae, + 0x5c, 0xb9, 0x72, 0xe5, 0xca, 0x95, 0x2b, 0x17, 0xe4, 0x50, 0xad, 0x5c, + 0xb9, 0x72, 0xe5, 0xca, 0x95, 0xeb, 0x47, 0x42, 0x42, 0x28, 0x38, 0x93, + 0x3b, 0xa0, 0x3e, 0x10, 0x34, 0x9f, 0xd4, 0x85, 0x4d, 0x89, 0xa3, 0x3f, + 0x36, 0x94, 0x7a, 0x02, 0xa3, 0xbd, 0x79, 0x88, 0x86, 0x0c, 0xd5, 0xc7, + 0xd4, 0x80, 0xdf, 0x0c, 0x23, 0xb0, 0x96, 0xfa, 0x68, 0x4f, 0xc6, 0x1f, + 0x24, 0x17, 0x44, 0x7a, 0x62, 0x63, 0xbf, 0x0b, 0x4b, 0x1e, 0x56, 0xbf, + 0x4d, 0x43, 0x86, 0x54, 0x06, 0xaa, 0x51, 0x6f, 0xa0, 0x76, 0x62, 0x1e, + 0xf3, 0xe1, 0xa1, 0x5b, 0x76, 0xe1, 0x05, 0x89, 0xe3, 0x24, 0x27, 0x28, + 0x49, 0x2c, 0xcb, 0xa6, 0xd1, 0xf0, 0xb0, 0xfa, 0x4b, 0xd8, 0x6b, 0x04, + 0x25, 0x9d, 0xb6, 0x6c, 0x8f, 0xc2, 0xf3, 0xea, 0x88, 0xbe, 0x12, 0x43, + 0xdb, 0x86, 0x08, 0x96, 0x2a, 0xd4, 0x8e, 0x1c, 0x60, 0xec, 0x43, 0xb7, + 0x11, 0x04, 0x01, 0xa5, 0x52, 0x02, 0xae, 0x04, 0x04, 0x1a, 0x7e, 0x65, + 0x40, 0x36, 0x61, 0x43, 0x7f, 0x58, 0xbf, 0xbe, 0xa2, 0xa0, 0x5c, 0x40, + 0x29, 0x6c, 0xe0, 0xba, 0x15, 0x8a, 0x7d, 0x45, 0xca, 0xfd, 0x25, 0xea, + 0x4b, 0x01, 0xc7, 0x9f, 0xd5, 0x9f, 0x0a, 0xf7, 0x95, 0xb8, 0x64, 0xeb, + 0x20, 0xb2, 0x0d, 0xe5, 0xfe, 0x52, 0x04, 0x6c, 0x2a, 0xf5, 0x97, 0xf0, + 0xea, 0x1e, 0x43, 0x43, 0xdb, 0x99, 0x9d, 0x3d, 0xc4, 0xf5, 0x1f, 0x4a, + 0x7f, 0x2c, 0x1e, 0x04, 0x01, 0x8e, 0xa3, 0xca, 0xbb, 0x75, 0x5e, 0x7d, + 0x0c, 0x69, 0x5d, 0x3a, 0x4a, 0xb0, 0x14, 0xaa, 0x49, 0xa5, 0x8e, 0x4b, + 0xb0, 0xe8, 0x51, 0x2a, 0x39, 0xb8, 0xae, 0xcb, 0xec, 0xfa, 0x4a, 0x04, + 0xf0, 0x8a, 0xae, 0x9b, 0x06, 0x70, 0xa5, 0xc2, 0x65, 0x05, 0x9d, 0xcb, + 0x4c, 0x33, 0xda, 0xaa, 0x21, 0x5b, 0xeb, 0x05, 0xd8, 0x45, 0xb5, 0x5f, + 0x40, 0x6d, 0x37, 0xd8, 0x0a, 0xbe, 0x65, 0x20, 0x5c, 0xae, 0xb6, 0xad, + 0x64, 0xfc, 0xcc, 0x36, 0x52, 0x40, 0xad, 0x50, 0x43, 0xa3, 0x8a, 0x10, + 0x4d, 0x2c, 0x33, 0x20, 0xad, 0xae, 0x40, 0x2d, 0xa9, 0xa0, 0x51, 0x8d, + 0x50, 0xf6, 0x9c, 0xe9, 0xec, 0xae, 0x2f, 0xe1, 0x2f, 0x75, 0x4e, 0x32, + 0x88, 0x80, 0x5a, 0x19, 0xd9, 0xba, 0x5c, 0x0c, 0x20, 0x2b, 0xa9, 0x68, + 0x85, 0xe9, 0x42, 0xe7, 0x14, 0xec, 0x30, 0x8c, 0x3f, 0x00, 0xcd, 0xfa, + 0x4b, 0xa9, 0x57, 0x2f, 0xb6, 0x2d, 0x96, 0x9d, 0xbc, 0x64, 0xf7, 0x5b, + 0x31, 0xc4, 0x4b, 0xaf, 0x9c, 0xed, 0x0e, 0x94, 0xe2, 0x6d, 0x94, 0x22, + 0xb3, 0xa2, 0xb6, 0xc0, 0xe9, 0x17, 0x09, 0xf0, 0xd7, 0xea, 0x25, 0xc4, + 0x72, 0x93, 0x8e, 0x0c, 0x3c, 0xaa, 0xa4, 0x01, 0x41, 0xcb, 0x23, 0xba, + 0x8c, 0xcd, 0x72, 0x79, 0x0b, 0x9b, 0x01, 0x56, 0x5f, 0xf7, 0x70, 0xba, + 0xb9, 0x97, 0xfa, 0x4b, 0xd4, 0xcd, 0x4c, 0x9b, 0x84, 0x82, 0x66, 0x90, + 0x9a, 0x44, 0x95, 0x04, 0x65, 0x25, 0x57, 0x49, 0xef, 0xa5, 0x0b, 0x9d, + 0x58, 0x62, 0xc2, 0x37, 0x5b, 0xa3, 0x6c, 0x1c, 0x29, 0x28, 0xd6, 0x0a, + 0xab, 0xc1, 0x67, 0x27, 0x74, 0xf7, 0x02, 0x6a, 0xad, 0x94, 0x26, 0xd9, + 0x5a, 0xdd, 0x94, 0xfe, 0x08, 0x5c, 0x98, 0xd9, 0x37, 0x32, 0xa0, 0x2d, + 0xdb, 0xb2, 0xa3, 0xf3, 0xfe, 0xa2, 0x8f, 0x10, 0x22, 0x05, 0xd7, 0x8a, + 0xec, 0xb5, 0x5b, 0x16, 0xbc, 0x95, 0x75, 0xcb, 0xda, 0x1b, 0x70, 0x56, + 0x16, 0xac, 0xd5, 0xed, 0x38, 0xb9, 0x35, 0x32, 0x00, 0x2e, 0x03, 0xc8, + 0x0a, 0x97, 0xc2, 0x14, 0xe8, 0x2a, 0x09, 0xb9, 0x4a, 0x1e, 0x27, 0xed, + 0x93, 0xe7, 0xb2, 0x40, 0xae, 0x5e, 0xe1, 0x18, 0xb7, 0xec, 0xb9, 0x2c, + 0xb4, 0xcb, 0xc8, 0x80, 0xb0, 0x0c, 0x28, 0x2b, 0xbb, 0x9f, 0x94, 0x39, + 0x67, 0xdc, 0x93, 0xfb, 0xa6, 0xed, 0x5d, 0xe9, 0xf7, 0x94, 0xd4, 0xd8, + 0xc6, 0x8d, 0x0c, 0xec, 0xd8, 0x01, 0xc0, 0xc1, 0x7b, 0xee, 0x61, 0xc7, + 0xad, 0xb7, 0xae, 0xda, 0x6f, 0x2f, 0x0d, 0x64, 0xb6, 0x00, 0xef, 0x5b, + 0xe6, 0xdc, 0x2b, 0xad, 0x1d, 0x3a, 0x3f, 0x2b, 0xe9, 0xd4, 0xc2, 0x02, + 0x17, 0x1d, 0x3c, 0x18, 0x1d, 0xbf, 0xb8, 0x63, 0xc7, 0x8a, 0x60, 0xb1, + 0x1f, 0x69, 0x3d, 0xf6, 0xe0, 0xaa, 0xcc, 0xf6, 0x5e, 0xf5, 0x00, 0x0f, + 0x54, 0x5b, 0x70, 0xe0, 0xf1, 0xa8, 0x6e, 0xd8, 0x35, 0xdb, 0x39, 0x51, + 0x36, 0x09, 0xa6, 0x82, 0x34, 0x28, 0x2a, 0xb2, 0xd1, 0x30, 0xad, 0xdd, + 0x1f, 0xbe, 0x5e, 0x39, 0xb4, 0x81, 0x14, 0xda, 0x2e, 0x39, 0xad, 0xd8, + 0xe5, 0x46, 0xcd, 0x3b, 0x2b, 0xb6, 0x61, 0x57, 0x34, 0xb9, 0x2b, 0xb6, + 0xde, 0xb9, 0x19, 0xec, 0x35, 0x9d, 0x75, 0xae, 0xd4, 0xf6, 0x01, 0xb0, + 0xeb, 0x9a, 0xb8, 0x2f, 0xd7, 0x7a, 0x41, 0xd9, 0xdf, 0x48, 0x72, 0x4a, + 0x30, 0xec, 0xda, 0xe0, 0x26, 0x20, 0x55, 0xb2, 0xc3, 0x3e, 0xab, 0xa0, + 0x6d, 0xd2, 0xee, 0xb2, 0x6b, 0x43, 0x22, 0x3d, 0x97, 0xc6, 0xf6, 0x21, + 0xb0, 0xfb, 0xc3, 0x6e, 0x94, 0x1e, 0xda, 0xa6, 0x8f, 0x24, 0x01, 0x87, + 0x5d, 0x1b, 0xd2, 0xe9, 0x49, 0xe6, 0x5f, 0xb6, 0x61, 0xd4, 0xd4, 0xd5, + 0x6e, 0xdc, 0x36, 0xb4, 0xd6, 0x0f, 0x52, 0x7c, 0x2d, 0xcc, 0xcc, 0x1f, + 0xa7, 0xa7, 0x32, 0x75, 0xfc, 0xab, 0x8a, 0xd6, 0x7a, 0xaf, 0xce, 0xd9, + 0xcc, 0x7e, 0x78, 0x52, 0x4d, 0x76, 0xe2, 0x67, 0xde, 0x0f, 0x73, 0xe0, + 0x5e, 0x65, 0xe1, 0x3d, 0x19, 0xe2, 0x5e, 0x65, 0x80, 0x81, 0x31, 0x68, + 0xcb, 0x7f, 0x3a, 0x24, 0x9e, 0x6e, 0xfc, 0xea, 0x28, 0x38, 0xb2, 0x2f, + 0x3e, 0x78, 0x93, 0x9e, 0xc2, 0xf7, 0x77, 0x73, 0x8a, 0xea, 0x74, 0xb9, + 0x03, 0x47, 0x7c, 0x6e, 0x7a, 0xb3, 0x06, 0x6b, 0x15, 0x80, 0x04, 0xac, + 0x82, 0xf7, 0x8c, 0xc1, 0xc3, 0x69, 0x68, 0xd3, 0x8f, 0xb6, 0x54, 0x9b, + 0x2a, 0xdb, 0xad, 0x55, 0xc3, 0x85, 0x00, 0x44, 0xdd, 0x43, 0x96, 0x5d, + 0xc4, 0x82, 0x17, 0xc1, 0x72, 0xfd, 0x05, 0x70, 0x06, 0x92, 0xfb, 0xaa, + 0x5f, 0xeb, 0xd7, 0xc1, 0x29, 0x6b, 0x8f, 0xed, 0xf9, 0x08, 0x5e, 0xd5, + 0x6b, 0xdf, 0x0b, 0x89, 0x00, 0x56, 0x66, 0x6b, 0xdc, 0x24, 0x12, 0x59, + 0xaf, 0xc1, 0x7a, 0x4d, 0xe6, 0x58, 0xf4, 0xa2, 0x7d, 0xe3, 0x1e, 0x9e, + 0x02, 0x6b, 0x23, 0x84, 0xa7, 0x94, 0x89, 0xb5, 0x51, 0x26, 0xf6, 0xcd, + 0x3d, 0xa9, 0xe3, 0x6b, 0xeb, 0xba, 0x2b, 0xb9, 0x9f, 0x88, 0xcf, 0x4b, + 0x40, 0xbd, 0x92, 0xfb, 0x00, 0x2c, 0x78, 0x30, 0xe0, 0xc2, 0x82, 0x47, + 0xab, 0xac, 0xd3, 0x53, 0xaf, 0xc1, 0xfa, 0x4e, 0x20, 0xb2, 0xbf, 0x40, + 0x04, 0xd4, 0xb2, 0xcb, 0x5d, 0xee, 0xcc, 0x76, 0x0d, 0xf9, 0x82, 0x9b, + 0x2e, 0x13, 0x23, 0xd9, 0xa2, 0x1e, 0x6a, 0x98, 0x16, 0xa8, 0xfd, 0xce, + 0x10, 0x96, 0xd5, 0x59, 0xe0, 0xad, 0x26, 0xb8, 0xcc, 0x31, 0x74, 0x07, + 0x43, 0x9d, 0x05, 0xd6, 0x25, 0x8e, 0x9f, 0xcb, 0x1c, 0x77, 0xd3, 0x73, + 0x99, 0x70, 0x57, 0x9b, 0x36, 0x12, 0x61, 0x67, 0xe3, 0xed, 0xe5, 0xe7, + 0xad, 0xc4, 0xe9, 0x4d, 0xa6, 0x2d, 0x9b, 0x97, 0x6c, 0x78, 0xd9, 0xbc, + 0x77, 0xd3, 0x0f, 0x3b, 0x1f, 0xb0, 0xfc, 0x75, 0x59, 0x56, 0x05, 0x89, + 0x53, 0x75, 0xf1, 0xe7, 0x3d, 0x2e, 0xb9, 0x4c, 0xfd, 0x0e, 0x0d, 0x44, + 0x39, 0x5c, 0xa8, 0xb1, 0x7b, 0xaf, 0x9a, 0x92, 0x76, 0xe8, 0x49, 0x10, + 0x1b, 0xa0, 0x72, 0x79, 0x8b, 0xda, 0x09, 0x98, 0x3f, 0x5c, 0x64, 0xf7, + 0x47, 0x07, 0xb9, 0xfd, 0xe3, 0xea, 0x19, 0xdf, 0xf7, 0x7d, 0x1c, 0xcb, + 0x81, 0x82, 0xf2, 0x3b, 0xf6, 0x61, 0x97, 0xf9, 0x27, 0xc0, 0xa9, 0xaa, + 0x67, 0x8f, 0xd0, 0x8f, 0xfb, 0xcd, 0x9f, 0xfa, 0x3f, 0xab, 0x4c, 0x1e, + 0x04, 0xd6, 0x4b, 0x86, 0xaf, 0x11, 0xcc, 0x1c, 0x05, 0x16, 0x25, 0x77, + 0xfe, 0xc9, 0xcd, 0x0a, 0xac, 0xf5, 0xbe, 0xed, 0x0a, 0xac, 0x55, 0x1a, + 0x8c, 0xfc, 0xd4, 0xbd, 0x39, 0xae, 0xff, 0xd5, 0x41, 0x66, 0x1e, 0x81, + 0x03, 0x9f, 0xf7, 0x29, 0x6d, 0x71, 0x22, 0xc8, 0x96, 0xff, 0xcc, 0x3c, + 0x43, 0x1f, 0x1a, 0x66, 0xe6, 0x61, 0x09, 0x65, 0x18, 0xfe, 0x90, 0x50, + 0xc0, 0xad, 0x32, 0xdc, 0xf5, 0xf5, 0xdb, 0xf8, 0xe4, 0xbb, 0xf6, 0x72, + 0xd7, 0xef, 0x0e, 0xb3, 0xff, 0x41, 0x05, 0xe6, 0x2a, 0xf5, 0xc7, 0x7e, + 0xab, 0xd5, 0x41, 0x82, 0x25, 0x9f, 0x56, 0x5b, 0x12, 0x2c, 0xfa, 0xb0, + 0x08, 0xde, 0x91, 0x59, 0xaa, 0xd7, 0xec, 0x8e, 0xa0, 0x5d, 0xc3, 0x1f, + 0x12, 0x6a, 0x02, 0xb9, 0x96, 0xb7, 0xe8, 0x60, 0x37, 0x55, 0xff, 0xc3, + 0x3b, 0x0d, 0xc3, 0x7a, 0xce, 0x9f, 0xe7, 0x81, 0x93, 0x98, 0xff, 0x67, + 0x20, 0x5a, 0x41, 0x21, 0x86, 0x67, 0x1d, 0x98, 0x87, 0xc1, 0x6a, 0x7c, + 0x0f, 0x9a, 0x67, 0xab, 0x00, 0x05, 0x58, 0x9a, 0xf7, 0xc1, 0xe9, 0x4f, + 0xc4, 0x15, 0x48, 0xaa, 0x89, 0x63, 0xf3, 0x7c, 0x35, 0xb6, 0x45, 0x1f, + 0x4b, 0xf9, 0xea, 0xb6, 0xd5, 0x3f, 0x82, 0x7a, 0x1f, 0xaf, 0x1c, 0xc8, + 0xa2, 0x8c, 0xe2, 0x2a, 0xfd, 0xdb, 0x84, 0xdb, 0x04, 0x0a, 0xd0, 0xf5, + 0x35, 0xe0, 0xdc, 0xcb, 0x0c, 0x3f, 0x8b, 0x41, 0xfb, 0xdb, 0xae, 0x56, + 0xf1, 0xb9, 0x8b, 0xe9, 0x0d, 0xf3, 0x4a, 0x6a, 0xd7, 0x35, 0x55, 0xc0, + 0x65, 0xb8, 0xa4, 0xee, 0x69, 0x1f, 0xf0, 0x02, 0x0f, 0x51, 0xab, 0x31, + 0xb6, 0x7d, 0x8c, 0x10, 0x18, 0xd6, 0x7f, 0x00, 0x16, 0xaa, 0x0f, 0x69, + 0xec, 0x01, 0x70, 0x15, 0xac, 0xaa, 0x52, 0x72, 0x09, 0xb5, 0x0d, 0x40, + 0x2d, 0x00, 0x07, 0x0f, 0x5f, 0x9b, 0x3a, 0xda, 0x8f, 0x04, 0x2a, 0x81, + 0xc7, 0xe8, 0x90, 0xf6, 0xdc, 0x25, 0x7c, 0x09, 0x8c, 0xe9, 0x7d, 0xbf, + 0xa8, 0x61, 0x7e, 0x25, 0x37, 0xb2, 0xf3, 0xb5, 0xcd, 0x4e, 0x20, 0x0c, + 0x14, 0x78, 0x73, 0xa7, 0xf1, 0xfb, 0x21, 0xd5, 0xe3, 0x70, 0x12, 0x79, + 0x8a, 0x80, 0x58, 0xda, 0xdd, 0xc4, 0x03, 0x40, 0xe0, 0x21, 0x13, 0x61, + 0xcb, 0x84, 0x6d, 0x57, 0xf4, 0xea, 0xaf, 0x1f, 0x88, 0xe0, 0x56, 0x66, + 0xdb, 0x0b, 0x9e, 0x95, 0x85, 0x66, 0x75, 0xb8, 0x1f, 0x26, 0x95, 0x96, + 0x9e, 0x10, 0xad, 0x2e, 0xaa, 0xff, 0x22, 0x94, 0xaf, 0x56, 0xfb, 0xe5, + 0xee, 0x26, 0x29, 0xb5, 0x32, 0xcf, 0x54, 0xcb, 0x41, 0xb6, 0xcc, 0xb8, + 0x38, 0x28, 0xd8, 0x56, 0x87, 0x12, 0x60, 0x2d, 0x20, 0x02, 0x4f, 0x65, + 0x35, 0x38, 0x60, 0xf1, 0x1b, 0xd7, 0xbf, 0x9b, 0xc1, 0x01, 0x2b, 0x82, + 0x67, 0x19, 0xa0, 0x56, 0xb7, 0xfa, 0x68, 0x58, 0xc3, 0xb9, 0x66, 0x16, + 0x42, 0xc6, 0xae, 0x74, 0x52, 0xa0, 0xad, 0x07, 0x0e, 0xfc, 0x05, 0x37, + 0xed, 0x7c, 0x47, 0xcf, 0x7a, 0xcc, 0xb8, 0x0f, 0x2f, 0xc0, 0xdc, 0x42, + 0xc8, 0x7c, 0x32, 0x7f, 0x3a, 0xbd, 0xf3, 0x47, 0x5b, 0x29, 0xb0, 0x16, + 0x28, 0xb8, 0x16, 0x40, 0xf5, 0xb2, 0x22, 0xfe, 0xa1, 0xeb, 0x71, 0xfa, + 0x2b, 0xf8, 0x4b, 0x35, 0x6a, 0x0b, 0x50, 0x23, 0xbd, 0x40, 0x84, 0x77, + 0x4d, 0x11, 0x14, 0x63, 0x81, 0xfd, 0x8f, 0x4d, 0x45, 0xee, 0xfe, 0xa2, + 0x0b, 0xcd, 0x44, 0x9f, 0xbc, 0x6f, 0x10, 0xab, 0x1f, 0xbc, 0x13, 0x35, + 0x44, 0x01, 0x1e, 0x7a, 0x4c, 0xb5, 0x7f, 0x07, 0x8e, 0xd5, 0xb0, 0xb6, + 0x3d, 0xca, 0xa8, 0xbb, 0x9f, 0xda, 0x89, 0x29, 0xd4, 0xef, 0xdf, 0x43, + 0xb4, 0xa1, 0xb1, 0xe4, 0xe2, 0x86, 0x77, 0x31, 0x7f, 0xa5, 0x80, 0x87, + 0xf5, 0x78, 0xe0, 0xcf, 0x5a, 0x78, 0x7f, 0x10, 0x60, 0xee, 0x9c, 0x46, + 0xa3, 0xc6, 0xd4, 0xd1, 0x1a, 0x99, 0xde, 0x5b, 0x87, 0x92, 0x6d, 0xa2, + 0x51, 0xb0, 0x14, 0x52, 0x2a, 0xc5, 0xa0, 0x56, 0x6b, 0xbd, 0x9b, 0xb1, + 0x10, 0x08, 0x59, 0xc4, 0x2d, 0x25, 0xc6, 0xf4, 0x33, 0xbf, 0x19, 0xbb, + 0x7f, 0x7b, 0xbc, 0x1f, 0x4f, 0x43, 0x4f, 0xa9, 0x62, 0xed, 0x04, 0x5a, + 0x38, 0xa5, 0x32, 0x50, 0xa4, 0x62, 0xdd, 0x06, 0x80, 0x43, 0x85, 0xda, + 0xe2, 0x7e, 0x2c, 0x31, 0x48, 0x28, 0x3d, 0x9c, 0xd2, 0x18, 0x96, 0x3c, + 0x40, 0x28, 0x27, 0x29, 0x5b, 0xd7, 0xb3, 0xef, 0x6b, 0x9f, 0x06, 0x60, + 0x72, 0xe1, 0x26, 0x2c, 0x31, 0x86, 0xab, 0xfb, 0xb8, 0xa2, 0x20, 0xa2, + 0xb1, 0x6d, 0x4b, 0x08, 0xbd, 0x55, 0x71, 0xc9, 0x36, 0x84, 0x2b, 0x34, + 0x6c, 0x49, 0x30, 0x56, 0x07, 0x24, 0x0b, 0x90, 0x61, 0x0b, 0x61, 0x15, + 0x13, 0xf6, 0xbe, 0x02, 0x45, 0x84, 0x6a, 0x9b, 0x05, 0x69, 0x65, 0x01, + 0x5a, 0xe6, 0xd8, 0xd8, 0x47, 0xfe, 0x30, 0xfe, 0xe8, 0x00, 0x65, 0x65, + 0xe1, 0x59, 0xe6, 0xd8, 0xb2, 0xac, 0xd4, 0xb9, 0xd5, 0xb6, 0xd9, 0xe5, + 0xcc, 0x71, 0x3d, 0xb3, 0x2d, 0xeb, 0xfd, 0x71, 0x4d, 0xbb, 0x32, 0xd0, + 0x00, 0xb3, 0x5f, 0xa7, 0x1e, 0xc1, 0xa5, 0x0c, 0x14, 0xab, 0x5e, 0x87, + 0x91, 0x72, 0x0c, 0x86, 0x32, 0x43, 0xda, 0xf5, 0x11, 0x28, 0x97, 0x15, + 0x74, 0x2a, 0x46, 0x4e, 0xc1, 0x74, 0xbd, 0xce, 0x48, 0x36, 0x21, 0x18, + 0xa0, 0x97, 0xb2, 0x35, 0xf6, 0x66, 0x5b, 0xd6, 0x29, 0x37, 0x60, 0x2c, + 0xe3, 0x7d, 0x7c, 0x5c, 0x9d, 0x1b, 0x01, 0xa6, 0xb5, 0xdb, 0x9e, 0x44, + 0x9a, 0x81, 0x08, 0xfa, 0x95, 0x04, 0x78, 0x25, 0xd3, 0x54, 0x9f, 0xd6, + 0xe1, 0x8d, 0xab, 0xb4, 0xee, 0x99, 0x50, 0xe1, 0xee, 0x99, 0x4e, 0x05, + 0xc3, 0x9e, 0x69, 0x05, 0xe0, 0x8a, 0xc3, 0x00, 0x8d, 0xfb, 0x8a, 0x81, + 0x5a, 0x23, 0x3a, 0x6c, 0x1d, 0x97, 0x81, 0x93, 0xa5, 0xca, 0x60, 0xbc, + 0x0c, 0x13, 0xf5, 0x54, 0x7e, 0x3f, 0x30, 0x0d, 0xb7, 0xe8, 0xe7, 0xd5, + 0xc3, 0xb7, 0x97, 0x99, 0x1e, 0xa9, 0x73, 0xfb, 0x11, 0x05, 0xd3, 0x5a, + 0xd0, 0x9d, 0x8f, 0x57, 0xb2, 0x1f, 0x62, 0x24, 0x65, 0xd8, 0xb9, 0x50, + 0x47, 0x17, 0x98, 0x95, 0x01, 0x4d, 0x99, 0xa7, 0x00, 0x29, 0x43, 0x75, + 0xbf, 0xe9, 0x77, 0x12, 0x56, 0x9f, 0x5a, 0x4e, 0xc1, 0xea, 0xb3, 0x22, + 0xb8, 0x55, 0xd8, 0x0c, 0x23, 0xc0, 0x13, 0xa8, 0xbe, 0x69, 0xf6, 0x9d, + 0xa8, 0x39, 0xaf, 0xfc, 0xc5, 0xe1, 0x87, 0xcd, 0x30, 0x1e, 0x43, 0xd2, + 0xef, 0x89, 0xba, 0x29, 0xb9, 0xa0, 0x48, 0xd2, 0x6d, 0xb5, 0xe3, 0xc9, + 0x2b, 0xe6, 0x5f, 0xd3, 0x87, 0x45, 0x41, 0xe5, 0x3f, 0x86, 0x78, 0x59, + 0x14, 0x0b, 0x26, 0xee, 0x06, 0x8d, 0xd0, 0xc7, 0x2d, 0x5f, 0x82, 0xa5, + 0xdf, 0x05, 0x37, 0x9a, 0x01, 0x8d, 0x53, 0x21, 0xb3, 0x87, 0x63, 0x2c, + 0x7d, 0x7d, 0xa1, 0x4e, 0x7d, 0x21, 0xbd, 0x38, 0x50, 0x7d, 0xa1, 0x9e, + 0xda, 0x1e, 0xfa, 0x5a, 0xe7, 0xe2, 0x41, 0x17, 0xa4, 0xb6, 0x7e, 0x06, + 0x28, 0xe8, 0xb2, 0x6d, 0x4a, 0xe8, 0x03, 0x59, 0x10, 0x54, 0xdb, 0x92, + 0x59, 0x80, 0x3e, 0xa1, 0xc6, 0x8f, 0x50, 0xd0, 0x2c, 0x29, 0x12, 0xcf, + 0x76, 0x6d, 0xa9, 0xca, 0xbb, 0xa0, 0xc3, 0x2a, 0xc4, 0xe1, 0xfa, 0x28, + 0x60, 0xa4, 0x27, 0x15, 0x52, 0x71, 0xae, 0x09, 0x92, 0x16, 0x08, 0x18, + 0xd5, 0x45, 0x18, 0xa0, 0x9e, 0x4f, 0xcc, 0x7b, 0x60, 0x80, 0x52, 0x41, + 0x8f, 0x55, 0x6a, 0xb5, 0x0a, 0x6a, 0x2c, 0xb5, 0xa4, 0xc3, 0xf6, 0xda, + 0xca, 0x0f, 0x6d, 0xf0, 0x84, 0xc4, 0x2c, 0x71, 0xe5, 0xa1, 0xec, 0x90, + 0xd0, 0x10, 0xe0, 0x68, 0xd0, 0x55, 0xb8, 0xd4, 0xa2, 0x56, 0x20, 0x6e, + 0x73, 0xc2, 0x16, 0x88, 0x22, 0x1e, 0x0a, 0x90, 0x95, 0xd4, 0xa3, 0x4d, + 0x18, 0xd4, 0x76, 0x3e, 0xf0, 0xa8, 0x00, 0x47, 0xff, 0x96, 0x5c, 0x21, + 0xf0, 0xdb, 0x12, 0x0f, 0x98, 0x69, 0xaa, 0xf0, 0x8d, 0x77, 0xb7, 0x00, + 0x53, 0x6d, 0xf0, 0x13, 0xe9, 0xbe, 0x44, 0xc2, 0x71, 0xa1, 0xe0, 0x62, + 0xc6, 0x2e, 0x39, 0xba, 0x76, 0x0b, 0x70, 0x57, 0x5b, 0x72, 0x53, 0x5b, + 0x2f, 0x26, 0x93, 0x38, 0x3f, 0xa8, 0xc3, 0xae, 0xa0, 0x80, 0x5a, 0x76, + 0x01, 0xee, 0x68, 0xab, 0x1f, 0xd7, 0x2d, 0xa8, 0x7e, 0x64, 0xad, 0xb0, + 0x32, 0x5c, 0xeb, 0xcc, 0x19, 0xd5, 0x5b, 0xdf, 0xbc, 0xed, 0xb2, 0x68, + 0xff, 0xcc, 0x99, 0x33, 0x0a, 0x56, 0xa5, 0x41, 0x4e, 0x9b, 0x36, 0x6d, + 0xe2, 0xe4, 0x49, 0x05, 0x99, 0x3a, 0xef, 0x9f, 0xe5, 0x8c, 0xb6, 0x3f, + 0x71, 0xec, 0x68, 0x04, 0x9e, 0x32, 0x90, 0xac, 0x8b, 0x2f, 0x8e, 0xa1, + 0x58, 0x26, 0xac, 0xd1, 0x51, 0x05, 0x2a, 0x9a, 0x9a, 0x9a, 0x8a, 0x20, + 0x52, 0x9b, 0x1c, 0x62, 0xf8, 0x94, 0x3e, 0xb7, 0x69, 0xd3, 0x26, 0xce, + 0x9c, 0x39, 0xc3, 0x1a, 0x67, 0x1d, 0x67, 0xce, 0x9c, 0x51, 0xd0, 0xa8, + 0xe7, 0x63, 0x40, 0x95, 0x81, 0x5f, 0x8d, 0x8e, 0x8e, 0x46, 0xc0, 0xa9, + 0x13, 0x1a, 0x66, 0x65, 0xa0, 0x56, 0x10, 0x03, 0xb4, 0x4c, 0xbe, 0x8c, + 0x4e, 0x9e, 0x3c, 0xc9, 0x3a, 0x62, 0x3b, 0x93, 0xaf, 0x64, 0x19, 0x4c, + 0x4d, 0x4d, 0x45, 0x36, 0xbd, 0xc2, 0x34, 0x90, 0xac, 0x4d, 0x6f, 0x53, + 0xfe, 0x0d, 0x2c, 0x2b, 0x72, 0x4f, 0xc0, 0xb8, 0x92, 0xe5, 0x60, 0xfc, + 0x27, 0x01, 0x5c, 0x06, 0x90, 0x05, 0x30, 0xba, 0x5d, 0xe5, 0x93, 0xe7, + 0x4f, 0xa6, 0xa0, 0x63, 0x67, 0xce, 0x9c, 0x89, 0xca, 0xfe, 0xbc, 0x7f, + 0x36, 0xce, 0x93, 0x2e, 0x83, 0x93, 0x27, 0x15, 0xcc, 0x8c, 0xff, 0x6d, + 0xf9, 0xf7, 0x36, 0x95, 0x4a, 0x85, 0xda, 0x29, 0xd5, 0x1f, 0x14, 0x80, + 0xeb, 0xc2, 0xcc, 0x12, 0xb8, 0x1b, 0x5a, 0xd4, 0xbe, 0xa9, 0xdd, 0x0b, + 0x70, 0xe0, 0xd9, 0x80, 0x9d, 0x5b, 0x4b, 0x84, 0x7e, 0x0d, 0xaf, 0x1f, + 0xc6, 0x10, 0xd8, 0x80, 0xb5, 0xc1, 0x51, 0x0b, 0x8f, 0x05, 0x3e, 0xa2, + 0x14, 0xbf, 0x7f, 0xf0, 0xfb, 0x2b, 0x4c, 0xd6, 0x03, 0x5a, 0x6d, 0x41, + 0xb1, 0x20, 0x99, 0xef, 0x2b, 0x62, 0xf7, 0xc5, 0xf1, 0xce, 0xcc, 0xd6, + 0xa8, 0x0e, 0xa9, 0x9e, 0xe3, 0x7c, 0xe8, 0xe1, 0x50, 0x45, 0x08, 0x89, + 0xd0, 0xd0, 0x39, 0xeb, 0xf2, 0x51, 0xc2, 0xd0, 0xe7, 0xa1, 0xe9, 0x19, + 0x44, 0x9f, 0x60, 0xf2, 0x84, 0x47, 0x75, 0x64, 0x98, 0x30, 0x54, 0xb0, + 0x2b, 0xdb, 0xb2, 0x55, 0xfd, 0x1f, 0x82, 0xe8, 0x2f, 0x21, 0xfa, 0x43, + 0xfc, 0x05, 0xd5, 0x3f, 0xb7, 0x2c, 0x87, 0x60, 0xc1, 0x43, 0xf4, 0x97, + 0x98, 0x3d, 0xed, 0x63, 0x15, 0xd4, 0x7b, 0x71, 0xb9, 0x24, 0x99, 0x0f, + 0x25, 0x0e, 0xd0, 0xb0, 0xa0, 0x3a, 0xe0, 0x22, 0x9b, 0x99, 0xf7, 0xb8, + 0x52, 0x22, 0x25, 0xec, 0x1a, 0xa9, 0x30, 0xf7, 0x8c, 0xc7, 0x21, 0x2f, + 0x60, 0xa8, 0x1c, 0x82, 0x68, 0xa9, 0xc5, 0xd1, 0x8c, 0x56, 0x60, 0x58, + 0x89, 0xa2, 0xee, 0x33, 0xb5, 0xc2, 0xb4, 0x6d, 0xa2, 0x5e, 0xa4, 0xa8, + 0xdb, 0x91, 0x46, 0x67, 0x3b, 0x22, 0x6c, 0x5d, 0xaf, 0x6a, 0x3f, 0xb6, + 0x05, 0x62, 0x8d, 0x85, 0x3c, 0x1f, 0x82, 0xb0, 0x11, 0xed, 0x16, 0x2d, + 0x9d, 0x1e, 0x01, 0x2b, 0x7e, 0xf1, 0x7b, 0xdd, 0xbf, 0xbe, 0xb6, 0xe7, + 0xb9, 0xca, 0xe0, 0x9b, 0xa9, 0xcd, 0x7d, 0x27, 0x75, 0xfc, 0x5b, 0xbf, + 0xf6, 0x79, 0xde, 0xf9, 0xf6, 0x77, 0xf3, 0x96, 0xcd, 0xe9, 0xbe, 0xe2, + 0xb7, 0x4e, 0x84, 0x91, 0x5b, 0x72, 0x3f, 0x79, 0x9c, 0x75, 0xef, 0x66, + 0x6b, 0xdc, 0x00, 0xde, 0xf9, 0x76, 0x75, 0xfc, 0x47, 0x7f, 0x3c, 0xc1, + 0x07, 0x7f, 0x7e, 0x3c, 0x65, 0x63, 0x60, 0x5b, 0x59, 0xf7, 0x95, 0xfc, + 0x2d, 0x27, 0xe3, 0xaf, 0x9b, 0xdb, 0x9f, 0x7f, 0xe3, 0x29, 0x9e, 0x3b, + 0x75, 0xba, 0xa7, 0xdf, 0x6e, 0xe7, 0x56, 0xeb, 0xd6, 0x4b, 0xc9, 0xfe, + 0x2f, 0xf5, 0x32, 0x23, 0xd3, 0x7a, 0xbf, 0x5c, 0x4f, 0xdb, 0xed, 0xd1, + 0x3b, 0xe3, 0xe4, 0xca, 0x95, 0x2b, 0x57, 0xae, 0x5c, 0xb9, 0x72, 0xe5, + 0xca, 0x95, 0x2b, 0x57, 0xae, 0x5c, 0xb9, 0x72, 0xe5, 0xca, 0x95, 0x2b, + 0x57, 0xae, 0x5c, 0xb9, 0x72, 0xe5, 0xca, 0x95, 0x2b, 0x57, 0xae, 0x97, + 0xa1, 0x1c, 0xaa, 0x95, 0x2b, 0x57, 0xae, 0x5c, 0xb9, 0x72, 0xbd, 0x5a, + 0x3a, 0x68, 0xc3, 0x75, 0x7a, 0x12, 0x77, 0x53, 0x2a, 0x90, 0x55, 0x1b, + 0x48, 0x7c, 0x58, 0x2b, 0xfa, 0x34, 0xf0, 0xc3, 0x4c, 0x1c, 0x2a, 0x40, + 0x43, 0x7f, 0x70, 0xdd, 0x4a, 0xac, 0xe4, 0xec, 0xe9, 0x95, 0xc4, 0x05, + 0x0a, 0x20, 0x12, 0x83, 0x1e, 0x24, 0x8d, 0x66, 0x03, 0xa9, 0x3f, 0xc0, + 0x0b, 0xc3, 0x06, 0xa5, 0xb2, 0x8b, 0x6b, 0x40, 0x5d, 0xed, 0x18, 0x9c, + 0x35, 0xbc, 0x56, 0x7d, 0xc8, 0xda, 0x38, 0xd7, 0x88, 0x20, 0x23, 0xbe, + 0xef, 0x47, 0xe7, 0x3d, 0xcf, 0xd3, 0x61, 0x84, 0x54, 0xab, 0xd5, 0xc8, + 0xbf, 0xfa, 0xe0, 0xbc, 0xcb, 0x84, 0xd7, 0x36, 0x04, 0x7a, 0xc5, 0xf8, + 0xca, 0xb6, 0x31, 0x1a, 0x1a, 0x5c, 0x65, 0x00, 0x56, 0xc5, 0x35, 0x76, + 0xea, 0x38, 0xa9, 0x24, 0x94, 0x66, 0x68, 0xdb, 0x50, 0x64, 0x5b, 0xea, + 0x2f, 0x21, 0xf5, 0xb6, 0xb4, 0x5d, 0x4d, 0xba, 0xf1, 0x4e, 0xd5, 0x68, + 0x35, 0x94, 0x7d, 0xbd, 0x4d, 0x04, 0xed, 0xf2, 0x4e, 0xd5, 0xa2, 0x95, + 0xa6, 0xb3, 0x40, 0x2d, 0x15, 0x96, 0x45, 0xb0, 0x14, 0xd2, 0x3a, 0xdf, + 0x88, 0xca, 0x3b, 0x0c, 0x62, 0x24, 0x56, 0x43, 0x87, 0xd9, 0x38, 0xef, + 0x61, 0xaf, 0x11, 0x8c, 0x5e, 0xb9, 0x9d, 0xc9, 0x87, 0x63, 0xa8, 0x56, + 0x7d, 0xb1, 0xde, 0x11, 0x26, 0x80, 0x30, 0x33, 0x27, 0x0e, 0xc6, 0x13, + 0x62, 0xc2, 0x67, 0x25, 0x8c, 0x24, 0x8c, 0x5c, 0xbb, 0x13, 0xae, 0x05, + 0x70, 0xba, 0xa5, 0xca, 0xb3, 0x52, 0x54, 0xfb, 0xe7, 0x1a, 0xf1, 0x2c, + 0xc7, 0x26, 0x0a, 0xa4, 0x95, 0xd4, 0xa2, 0x54, 0x50, 0x2d, 0x2d, 0x47, + 0xaf, 0xe4, 0x6a, 0x59, 0x02, 0x5f, 0xaf, 0x6e, 0xed, 0xe9, 0x8f, 0x49, + 0xdd, 0x01, 0x87, 0x30, 0x6c, 0xe1, 0x2d, 0x98, 0xd5, 0xc0, 0xe3, 0x2b, + 0xe6, 0x94, 0xd4, 0x07, 0x8d, 0xb6, 0x25, 0xa2, 0x09, 0xc8, 0x51, 0xda, + 0x35, 0xc8, 0x46, 0x26, 0xec, 0x25, 0x12, 0x57, 0x03, 0x70, 0x1a, 0x41, + 0x7a, 0x02, 0x84, 0xb7, 0xe0, 0x13, 0x86, 0x92, 0xea, 0x36, 0x37, 0x02, + 0x64, 0x79, 0x0b, 0x41, 0xd7, 0xf8, 0xb2, 0xa0, 0xaa, 0xc6, 0x52, 0x88, + 0x3b, 0xa0, 0xa1, 0x3e, 0x5d, 0xd2, 0x1a, 0xf9, 0xeb, 0x31, 0x3b, 0x29, + 0x5c, 0x0a, 0x53, 0xf1, 0x80, 0xfa, 0xb8, 0xde, 0x2d, 0x09, 0xb5, 0x0a, + 0xf6, 0xb2, 0xf1, 0xd1, 0x33, 0x3e, 0xda, 0x32, 0x05, 0xe3, 0x32, 0x65, + 0x6a, 0x30, 0x55, 0xe1, 0xb3, 0x7a, 0xe6, 0x03, 0xa4, 0xef, 0x6b, 0xa9, + 0x57, 0x52, 0x17, 0x6a, 0xc2, 0x86, 0xd9, 0x1a, 0x65, 0x8f, 0xa5, 0x5c, + 0x11, 0xc9, 0x46, 0xd8, 0x5c, 0xde, 0xc6, 0x80, 0xb5, 0xba, 0x6d, 0x95, + 0x9c, 0x94, 0xbd, 0xc9, 0xab, 0x99, 0x8c, 0xb1, 0xdc, 0xea, 0xec, 0xdd, + 0x26, 0x8e, 0xf4, 0x02, 0x68, 0x5d, 0x08, 0xa4, 0x28, 0xab, 0x56, 0xb3, + 0x85, 0x5c, 0xd3, 0xe9, 0xdf, 0xc4, 0x67, 0xc2, 0x6e, 0x5d, 0xc0, 0x0a, + 0xbc, 0xab, 0x91, 0x09, 0xbf, 0x25, 0x5b, 0x11, 0xe4, 0xaf, 0x43, 0x3d, + 0xee, 0xeb, 0x95, 0x40, 0x5d, 0xbe, 0x99, 0x30, 0xbf, 0x94, 0x9e, 0xd4, + 0x29, 0x9b, 0x32, 0x2a, 0xf3, 0xe4, 0x04, 0xa0, 0x6e, 0xd0, 0xab, 0x5e, + 0x20, 0xac, 0x5e, 0x6e, 0xde, 0x82, 0xd7, 0x75, 0xbb, 0x9c, 0x92, 0x36, + 0xdd, 0xe0, 0x60, 0x59, 0xb7, 0xe5, 0x60, 0x62, 0xdd, 0xfc, 0xaf, 0x26, + 0xec, 0x95, 0xe2, 0x95, 0x6d, 0xe2, 0x36, 0x2d, 0x01, 0xd0, 0xca, 0xc2, + 0xb4, 0x8c, 0x92, 0x10, 0xad, 0xac, 0xdd, 0x72, 0xbf, 0xe1, 0xe4, 0x7d, + 0x7d, 0xee, 0xd9, 0x26, 0x95, 0x77, 0xbd, 0x11, 0x80, 0x81, 0x1d, 0x3b, + 0xb8, 0xfb, 0xee, 0xbb, 0x39, 0x78, 0xf0, 0x20, 0x07, 0x51, 0xa0, 0xa9, + 0x81, 0x8d, 0x1b, 0xbb, 0x86, 0x91, 0xd4, 0xed, 0x13, 0xd3, 0xdc, 0x39, + 0x3e, 0x42, 0xb9, 0x5c, 0xe6, 0x81, 0xe9, 0x3a, 0x13, 0x13, 0x13, 0x94, + 0x75, 0x7b, 0xf1, 0xc1, 0x89, 0x69, 0xca, 0x65, 0x58, 0x48, 0xd8, 0x3f, + 0x81, 0x9a, 0x00, 0xf3, 0x04, 0xb0, 0x4d, 0xdb, 0x5c, 0xa8, 0x9e, 0xf8, + 0xd8, 0xc7, 0x78, 0x71, 0xc7, 0x8e, 0x55, 0x43, 0xb3, 0x56, 0xd2, 0xc6, + 0x81, 0x01, 0xb8, 0xf5, 0x56, 0x16, 0xee, 0xb9, 0x87, 0x8f, 0x00, 0x9f, + 0x7f, 0x45, 0x42, 0x7d, 0xf5, 0x75, 0xee, 0xd9, 0x26, 0xf0, 0xe3, 0x00, + 0x84, 0x4d, 0x1b, 0x03, 0xd8, 0x89, 0xf4, 0xdb, 0x57, 0x73, 0xd3, 0x2a, + 0xc3, 0x92, 0xed, 0x4e, 0xd8, 0x56, 0x37, 0xd5, 0x9e, 0xd5, 0xfd, 0x89, + 0xf6, 0x2a, 0x40, 0x12, 0xed, 0xf4, 0x61, 0xd6, 0x3e, 0xc8, 0xc6, 0xf7, + 0x8f, 0xdc, 0x1e, 0x80, 0x5e, 0xa0, 0x4b, 0xe3, 0xae, 0xeb, 0xe4, 0xc8, + 0xaf, 0x9e, 0x40, 0x13, 0x36, 0x6d, 0x10, 0x61, 0xbc, 0xff, 0xc3, 0xc2, + 0x78, 0x0c, 0xef, 0xea, 0x79, 0xca, 0x7b, 0xf2, 0xc2, 0xa1, 0x9d, 0x2f, + 0x55, 0xd6, 0xb6, 0x5d, 0x84, 0xc7, 0xf6, 0xbf, 0xf4, 0x00, 0xde, 0xd4, + 0x39, 0x11, 0xfe, 0xa6, 0x37, 0x0f, 0xc2, 0xbe, 0xdb, 0xe1, 0x9a, 0x9d, + 0x69, 0xb0, 0xd6, 0xab, 0xac, 0xb0, 0x69, 0x43, 0x9f, 0xbe, 0xd6, 0xd9, + 0x7e, 0x38, 0xd0, 0x3a, 0x17, 0x52, 0x5c, 0x6b, 0xe9, 0xfd, 0x84, 0x3f, + 0xcf, 0xc3, 0x72, 0x35, 0x22, 0xe0, 0x74, 0xdc, 0xe7, 0x92, 0x3e, 0x08, + 0x47, 0x6d, 0x01, 0xf6, 0xfe, 0xb6, 0x02, 0x1d, 0xa4, 0xa7, 0xbf, 0x43, + 0xfd, 0x8e, 0xab, 0x13, 0xd3, 0xb8, 0xe9, 0xba, 0xbf, 0xf7, 0xbd, 0x0f, + 0x01, 0x0f, 0x25, 0xce, 0x74, 0xee, 0x87, 0xbf, 0x70, 0x80, 0x34, 0xa6, + 0x4f, 0xc9, 0xb8, 0xed, 0xfd, 0xfc, 0xa7, 0xbb, 0x9c, 0x5d, 0xbd, 0x66, + 0x97, 0x89, 0xbb, 0x5b, 0x7c, 0xdd, 0xf6, 0xe7, 0xb9, 0xf0, 0xeb, 0x5d, + 0xcf, 0x6c, 0xa7, 0xba, 0x9b, 0xd1, 0x6b, 0x9a, 0x67, 0xb2, 0x76, 0x2e, + 0xeb, 0x67, 0xbe, 0x64, 0x7b, 0xfd, 0x8d, 0xe6, 0x39, 0x46, 0xdf, 0xd8, + 0x09, 0xf4, 0x32, 0x70, 0xa7, 0xe8, 0x19, 0x3b, 0x73, 0x0e, 0x3a, 0x81, + 0x54, 0xbd, 0x00, 0x5a, 0x82, 0xde, 0xc0, 0xa9, 0xe7, 0xba, 0xa6, 0x3a, + 0xb6, 0xef, 0xe6, 0x4f, 0x24, 0xce, 0x75, 0x3b, 0x4e, 0xa6, 0x2d, 0x99, + 0x66, 0x93, 0x1f, 0x93, 0x5e, 0x13, 0xee, 0x73, 0x09, 0x3f, 0x26, 0xad, + 0xdd, 0xf2, 0xd1, 0x0d, 0x60, 0xf5, 0x72, 0xf2, 0x01, 0x9d, 0xe9, 0xbe, + 0x90, 0x7c, 0x40, 0x9c, 0x77, 0x73, 0xce, 0xf8, 0x59, 0xa3, 0xf7, 0xbf, + 0xd1, 0x3c, 0x67, 0x9a, 0xeb, 0x74, 0x7b, 0xdd, 0x0f, 0x95, 0xcd, 0x0e, + 0xb4, 0x25, 0xb5, 0xa7, 0xe7, 0x68, 0x24, 0xc6, 0x49, 0x6e, 0xfc, 0xcd, + 0x31, 0x02, 0xdd, 0xf7, 0xab, 0x5e, 0x15, 0x5f, 0xf9, 0xca, 0x66, 0x15, + 0xa1, 0x8f, 0xe4, 0xce, 0xdf, 0xdf, 0xc5, 0xd4, 0x82, 0xa4, 0xf6, 0xe4, + 0x71, 0x82, 0x45, 0x9f, 0xea, 0x65, 0x83, 0xd0, 0x0f, 0xc5, 0xb6, 0x54, + 0x10, 0xeb, 0x45, 0x98, 0x7f, 0x56, 0xdd, 0x01, 0xd5, 0x1d, 0x55, 0xee, + 0xbd, 0xe1, 0x06, 0x02, 0x60, 0x50, 0x77, 0xaf, 0xa4, 0x94, 0x0c, 0x6e, + 0x05, 0xb6, 0xaa, 0xe3, 0x3b, 0xff, 0xe4, 0x66, 0xee, 0xfb, 0x8f, 0xca, + 0xde, 0xff, 0xb2, 0x42, 0x0e, 0x39, 0x25, 0xc1, 0xce, 0x9b, 0x2b, 0x6a, + 0x5c, 0xa7, 0x54, 0xa4, 0x84, 0x43, 0x30, 0xef, 0xe1, 0xd5, 0x7d, 0x86, + 0xae, 0x19, 0xe6, 0xae, 0x8f, 0xee, 0x56, 0x9e, 0xcd, 0xfc, 0xde, 0xb6, + 0x64, 0xf8, 0xba, 0x78, 0xff, 0xae, 0xa9, 0xdd, 0xdc, 0x72, 0xb3, 0xba, + 0x63, 0xdc, 0x8d, 0x2e, 0xc1, 0x92, 0xcf, 0xce, 0x5b, 0x5d, 0x66, 0x66, + 0x25, 0xc1, 0x31, 0x0d, 0xd9, 0x3a, 0xe6, 0xe3, 0x9d, 0xf2, 0x70, 0x37, + 0xba, 0xdc, 0xf5, 0x75, 0x05, 0x0b, 0x61, 0x28, 0x5d, 0xe6, 0xfb, 0x9f, + 0x96, 0x5c, 0x5b, 0x85, 0xdd, 0xbf, 0xec, 0xe0, 0xb5, 0xd5, 0x44, 0x6e, + 0xc3, 0x51, 0xf7, 0x64, 0x0b, 0x67, 0xad, 0x9a, 0xc0, 0x3e, 0x73, 0x14, + 0x86, 0x2f, 0x53, 0xcf, 0xbb, 0x06, 0xa8, 0x65, 0x60, 0x5a, 0x83, 0x55, + 0xf0, 0x4f, 0x4b, 0xcc, 0x9c, 0xd9, 0xc9, 0x67, 0x61, 0x6c, 0x2b, 0xf8, + 0x3e, 0xcc, 0x2d, 0x4a, 0x9c, 0x92, 0x60, 0xee, 0x99, 0x74, 0xff, 0xc6, + 0x37, 0xd5, 0xe9, 0x22, 0x8c, 0xbd, 0x2f, 0x76, 0xef, 0xf5, 0xcc, 0x98, + 0xac, 0xc3, 0x93, 0xf7, 0xf5, 0xe8, 0x6f, 0xfe, 0xb3, 0x0e, 0xdb, 0xbf, + 0x5e, 0x7c, 0x91, 0x9f, 0x5e, 0x7f, 0x51, 0xd7, 0x70, 0x00, 0xa6, 0xfe, + 0xd3, 0xff, 0xea, 0x70, 0xdb, 0xf2, 0xf1, 0xd7, 0xf0, 0xe6, 0x37, 0xf5, + 0xf6, 0x93, 0x54, 0xb7, 0x38, 0x57, 0xab, 0x97, 0x92, 0x36, 0x13, 0xe7, + 0x68, 0xe2, 0xf8, 0xbe, 0xdf, 0x7b, 0xf1, 0x25, 0xc5, 0xff, 0x3a, 0x60, + 0xcb, 0xf7, 0xe0, 0xdf, 0xfe, 0xcf, 0xbf, 0xe7, 0xf3, 0x40, 0xdf, 0xeb, + 0x55, 0x5a, 0x3e, 0xfc, 0xbd, 0x17, 0x79, 0xf0, 0xf5, 0x17, 0x71, 0xf1, + 0xeb, 0x2f, 0xe2, 0x7c, 0x8f, 0xec, 0xf5, 0xd9, 0x2b, 0x97, 0xcf, 0x4f, + 0xa0, 0xd2, 0xb5, 0x89, 0x34, 0x5c, 0xfe, 0xbb, 0xc0, 0x7f, 0xb7, 0x5f, + 0xc3, 0xdb, 0x1a, 0x7f, 0xcf, 0x1b, 0x33, 0xee, 0xa0, 0x80, 0x50, 0x8f, + 0xea, 0xfd, 0xe4, 0x7d, 0x9d, 0x7c, 0xe6, 0x82, 0x18, 0x30, 0xe5, 0x07, + 0xc9, 0xe7, 0xd8, 0xc4, 0x64, 0xed, 0x84, 0xbb, 0x55, 0x72, 0x89, 0x9e, + 0x88, 0x35, 0x48, 0x0b, 0x3c, 0x7c, 0xdc, 0x28, 0x8c, 0xd4, 0x13, 0x73, + 0xc9, 0x8d, 0x42, 0x4a, 0x86, 0xe3, 0x34, 0x42, 0x7c, 0xaa, 0x38, 0x28, + 0x20, 0x56, 0x74, 0x2e, 0x01, 0xbc, 0xaa, 0x69, 0x58, 0x16, 0x80, 0x53, + 0x0a, 0x71, 0x00, 0x1f, 0x2f, 0x2a, 0x04, 0x5f, 0xdb, 0x9b, 0xb0, 0x0d, + 0x1c, 0xe2, 0x78, 0xc3, 0x65, 0xb8, 0xa2, 0xfd, 0x43, 0x7c, 0x8d, 0x33, + 0xb6, 0x95, 0x92, 0x4b, 0x2d, 0xf0, 0xf0, 0x6a, 0x35, 0x86, 0x4d, 0xbe, + 0x74, 0x9e, 0x6a, 0x01, 0x38, 0xa5, 0x38, 0xdd, 0x95, 0x12, 0x84, 0xb8, + 0x1c, 0xd7, 0x61, 0x1a, 0xd0, 0x55, 0x12, 0x78, 0x65, 0x5d, 0xd1, 0xe9, + 0xd6, 0x0b, 0x88, 0x65, 0x80, 0x5c, 0xdd, 0xc2, 0xe8, 0xe5, 0xa7, 0x5b, + 0x78, 0xf5, 0xc7, 0x3b, 0x6d, 0x52, 0xcf, 0x5c, 0x89, 0xbe, 0xd9, 0xe4, + 0xd3, 0x21, 0x63, 0x57, 0xaa, 0x3e, 0x59, 0xb1, 0x0d, 0x93, 0x47, 0xd5, + 0xbd, 0x9f, 0x84, 0x6b, 0x19, 0xb7, 0xac, 0xfb, 0x81, 0x43, 0xf1, 0x55, + 0xdd, 0xb9, 0xdd, 0xe9, 0xe9, 0x16, 0xb9, 0xeb, 0xe7, 0x8e, 0x3b, 0x1e, + 0x7a, 0x8a, 0xf9, 0xcf, 0x2b, 0x88, 0x56, 0x16, 0xbc, 0xd5, 0x0d, 0xc8, + 0x65, 0xdc, 0xc6, 0xae, 0x74, 0x22, 0xf7, 0xb9, 0x85, 0x90, 0xc1, 0x01, + 0x8b, 0xfb, 0x7f, 0xf5, 0xdd, 0xdc, 0xf9, 0x4b, 0x15, 0x6e, 0xff, 0xc3, + 0x78, 0xbc, 0x78, 0x70, 0x20, 0x4e, 0xe3, 0xdc, 0x42, 0xd8, 0xe1, 0x3e, + 0x73, 0x34, 0xe4, 0xa9, 0xdf, 0x7a, 0x8a, 0xdf, 0x78, 0x2c, 0x3d, 0xc1, + 0x7d, 0xe6, 0x68, 0xc8, 0xee, 0x9b, 0x55, 0x5c, 0xad, 0xa8, 0x7e, 0x2c, + 0xe2, 0x15, 0xee, 0x23, 0x5c, 0x48, 0x3f, 0x4f, 0x58, 0x96, 0x1a, 0x97, + 0x9f, 0x3b, 0x5d, 0x64, 0xf0, 0xcb, 0x2d, 0x3c, 0x31, 0xc3, 0xee, 0x0f, + 0x5d, 0xcb, 0x7d, 0x0f, 0xcf, 0x20, 0xac, 0x61, 0x44, 0xbb, 0x96, 0x02, + 0x6a, 0x09, 0xcb, 0x46, 0x86, 0x73, 0xd4, 0x75, 0x9b, 0x78, 0xc3, 0xcf, + 0xde, 0xc8, 0x81, 0x43, 0xf3, 0xd0, 0xf6, 0x08, 0x65, 0x03, 0xd1, 0x86, + 0x2f, 0x3c, 0x72, 0x9f, 0xb2, 0xed, 0xf3, 0x00, 0x17, 0xff, 0xfc, 0x3c, + 0xa3, 0x03, 0x36, 0x33, 0x25, 0x38, 0xf0, 0x58, 0xc0, 0xa8, 0xee, 0x75, + 0xd4, 0x9e, 0x0d, 0xd5, 0xfb, 0x87, 0xa5, 0x19, 0x1a, 0xe7, 0x25, 0x22, + 0x84, 0xe2, 0x86, 0xb8, 0x8d, 0x4d, 0xf6, 0xcd, 0xe6, 0x9a, 0x21, 0x63, + 0xba, 0x38, 0x42, 0xd9, 0x39, 0x26, 0x25, 0xdb, 0x3e, 0x41, 0x00, 0x22, + 0x03, 0x78, 0xca, 0xda, 0xf8, 0x32, 0xb9, 0xc8, 0x85, 0xb8, 0x20, 0x10, + 0xee, 0x72, 0x0a, 0xc2, 0x1a, 0xe5, 0xbe, 0x51, 0xea, 0xa1, 0x6a, 0xb7, + 0x5b, 0xa1, 0x1f, 0xa5, 0xb3, 0x1e, 0xaa, 0xbe, 0xb1, 0x25, 0xc6, 0xb0, + 0x84, 0x19, 0xc7, 0x56, 0xd7, 0x5f, 0x14, 0x20, 0x94, 0x12, 0x4b, 0x08, + 0x42, 0xa9, 0x00, 0x3e, 0xa1, 0xbe, 0x66, 0x96, 0x81, 0xef, 0x98, 0x48, + 0xda, 0xf1, 0xd6, 0xc0, 0xad, 0x2c, 0xcb, 0x8e, 0xdc, 0x93, 0xfb, 0x40, + 0x0a, 0x9c, 0x65, 0x64, 0x80, 0x58, 0x66, 0x0b, 0x9d, 0x20, 0xad, 0x24, + 0x38, 0xab, 0xd3, 0x9f, 0x85, 0xa1, 0x3a, 0x88, 0x3e, 0x32, 0xfe, 0x62, + 0x78, 0x56, 0xda, 0xaf, 0xd5, 0xb1, 0x1f, 0x86, 0x41, 0xea, 0x5a, 0xcd, + 0x35, 0xc3, 0x08, 0x2e, 0x9c, 0xac, 0xc3, 0xeb, 0xc4, 0x30, 0xaa, 0x32, + 0x69, 0x90, 0x56, 0xd6, 0xcd, 0xc0, 0xab, 0xa6, 0xa7, 0xe3, 0xb8, 0x47, + 0x46, 0xd4, 0xf1, 0xf8, 0xb8, 0x02, 0x68, 0x8d, 0x8c, 0x28, 0x60, 0x55, + 0xb9, 0x0c, 0x7b, 0x26, 0xd2, 0xe9, 0x47, 0xbb, 0x4f, 0x4c, 0xc0, 0xf8, + 0x78, 0x9d, 0x09, 0x80, 0x09, 0xd8, 0x33, 0x5e, 0x66, 0x62, 0x4f, 0x9d, + 0xe9, 0x91, 0xd8, 0x3f, 0xc6, 0xef, 0x78, 0x0c, 0xd1, 0x02, 0x05, 0xe7, + 0x32, 0xf1, 0xed, 0x99, 0x50, 0x30, 0xaf, 0xe9, 0xe9, 0x18, 0x54, 0x05, + 0x30, 0x31, 0x11, 0x43, 0xbe, 0xca, 0xfa, 0x3f, 0x13, 0xc2, 0x9e, 0x71, + 0x05, 0xc1, 0x52, 0xe9, 0x2d, 0x33, 0x92, 0x78, 0xea, 0x99, 0x40, 0xc1, + 0xb4, 0x52, 0x49, 0x9e, 0x80, 0x3d, 0xd4, 0x19, 0x07, 0x26, 0xc6, 0x75, + 0xda, 0xca, 0xda, 0xc7, 0x74, 0xe4, 0x55, 0x6f, 0xe2, 0xb0, 0xe2, 0x14, + 0x9b, 0xf8, 0xeb, 0x51, 0x99, 0x26, 0xd3, 0x63, 0x5e, 0x4d, 0x8d, 0x53, + 0xd7, 0xf0, 0x85, 0xd8, 0xd2, 0x9a, 0x80, 0x2f, 0xc6, 0x39, 0xa7, 0x5c, + 0x86, 0xf7, 0x4c, 0x03, 0x23, 0xf0, 0x15, 0xe3, 0x3c, 0xad, 0xec, 0x26, + 0xc6, 0xe1, 0x67, 0xb4, 0xd3, 0x8a, 0xe3, 0x66, 0xcb, 0x28, 0x06, 0x65, + 0xad, 0x2c, 0xd9, 0x0c, 0x11, 0xfa, 0x1d, 0x85, 0x59, 0x50, 0xc1, 0x8c, + 0xb1, 0xc9, 0xb6, 0x04, 0xa9, 0xde, 0x61, 0x18, 0x90, 0x96, 0x19, 0x53, + 0xef, 0x06, 0xd2, 0x02, 0x22, 0x20, 0x97, 0xb1, 0x97, 0x52, 0x6a, 0x10, + 0x93, 0x54, 0x63, 0xcb, 0xab, 0x58, 0x78, 0xa3, 0x5b, 0x5e, 0x2e, 0xe4, + 0xbd, 0xc7, 0xaa, 0xf3, 0x2f, 0x41, 0x0a, 0x95, 0x7f, 0xab, 0xcf, 0x42, + 0x88, 0x22, 0x61, 0xe8, 0xe3, 0xd5, 0x55, 0xfd, 0xe4, 0x96, 0xab, 0x48, + 0x19, 0x32, 0x7f, 0x62, 0x0a, 0x77, 0xfd, 0x10, 0x08, 0x70, 0xdd, 0x0a, + 0xe1, 0xb9, 0x06, 0xd7, 0xcf, 0x9d, 0xed, 0x19, 0x6c, 0xf8, 0xd8, 0x7e, + 0xac, 0x9f, 0xed, 0x1c, 0x93, 0x9a, 0xf9, 0xfc, 0x5e, 0x86, 0x3f, 0x7a, + 0x5b, 0xec, 0x30, 0xaa, 0x90, 0x9d, 0xc9, 0x71, 0xb3, 0xe4, 0x7b, 0xae, + 0x28, 0x3f, 0x6d, 0x10, 0x05, 0x49, 0x88, 0x7a, 0x27, 0x6c, 0x16, 0xa6, + 0x31, 0xf5, 0xf2, 0x3c, 0xc4, 0xd0, 0x2d, 0x62, 0xa0, 0x16, 0x6d, 0xb0, + 0xdb, 0xd0, 0x10, 0x12, 0x5b, 0x42, 0xa3, 0x2f, 0x1d, 0x66, 0x52, 0x93, + 0x49, 0x58, 0x96, 0xde, 0xfa, 0x40, 0x34, 0x9a, 0xd5, 0x56, 0x7d, 0x2b, + 0x59, 0x10, 0xf8, 0xa6, 0xb6, 0x4d, 0xf8, 0x71, 0xcc, 0x22, 0x52, 0x99, + 0xb4, 0x38, 0xc0, 0x6c, 0x41, 0x41, 0xac, 0x6a, 0xa8, 0xb4, 0x0b, 0x04, + 0x4e, 0x01, 0x1c, 0xed, 0x7f, 0xae, 0x9d, 0x80, 0x58, 0xb5, 0xe3, 0x9e, + 0xa7, 0x0f, 0xd0, 0x6e, 0x51, 0x23, 0xae, 0x7b, 0x4d, 0xda, 0x82, 0x1e, + 0x69, 0xae, 0x15, 0x84, 0x8e, 0x87, 0x54, 0x5b, 0x60, 0xfc, 0xf8, 0x26, + 0x5c, 0xe0, 0x5e, 0x14, 0x30, 0xab, 0xd8, 0x07, 0x97, 0x34, 0xe1, 0xb8, + 0x10, 0xd8, 0x05, 0xc9, 0x1d, 0x43, 0x70, 0xcb, 0xd3, 0x30, 0x56, 0xd0, + 0xe3, 0x38, 0x6d, 0xb8, 0x25, 0x11, 0xd7, 0x58, 0x01, 0xc6, 0xf4, 0xb1, + 0x71, 0x3f, 0xae, 0x2f, 0x46, 0xa3, 0x2d, 0xb9, 0x49, 0x82, 0x79, 0xf5, + 0xb1, 0x3f, 0x53, 0x4e, 0xc9, 0xf7, 0x5c, 0x7c, 0xd5, 0x86, 0x5f, 0x50, + 0xd7, 0xda, 0x00, 0xa1, 0xce, 0x90, 0x86, 0x48, 0x9d, 0xf0, 0xcf, 0xa6, + 0x20, 0x50, 0xeb, 0xde, 0xb0, 0x26, 0x3a, 0x7f, 0xde, 0x3f, 0xcb, 0x94, + 0xf6, 0x17, 0x01, 0x9d, 0xb4, 0xbb, 0x81, 0x5c, 0x19, 0x20, 0xd7, 0xba, + 0x37, 0xac, 0x89, 0xdc, 0xb2, 0x50, 0x29, 0x50, 0xc0, 0x28, 0x13, 0xbe, + 0x49, 0xcb, 0xd9, 0xe7, 0xcf, 0x47, 0xf6, 0x67, 0x9f, 0x3f, 0x1f, 0x01, + 0xaa, 0x4c, 0x98, 0x06, 0x82, 0x15, 0x81, 0xa7, 0x9e, 0x3f, 0x19, 0x01, + 0xad, 0x92, 0xf0, 0xaf, 0xb3, 0xcf, 0x9f, 0x07, 0xed, 0xf7, 0x7c, 0x22, + 0x3f, 0xc6, 0xd6, 0xc4, 0x61, 0xce, 0x19, 0x50, 0xd7, 0x1a, 0x67, 0x5d, + 0xcf, 0x30, 0x93, 0x65, 0x96, 0xcc, 0x53, 0x12, 0x4a, 0x66, 0xd2, 0xb6, + 0x8e, 0xb8, 0x3c, 0xd6, 0x38, 0xeb, 0x22, 0x30, 0x57, 0x16, 0xa6, 0x65, + 0xec, 0x0d, 0x24, 0xcb, 0x84, 0x69, 0x74, 0xf1, 0xc5, 0x17, 0xa7, 0xc2, + 0x36, 0x10, 0x33, 0x13, 0x56, 0x12, 0x14, 0x06, 0xa8, 0xeb, 0xab, 0xd5, + 0xad, 0x0e, 0x3f, 0x50, 0x0f, 0xb0, 0x9c, 0x2a, 0x96, 0x65, 0xb3, 0xeb, + 0xf2, 0x31, 0xa6, 0x0e, 0x1d, 0x42, 0xce, 0x7a, 0x0a, 0xf6, 0xd7, 0x57, + 0x64, 0x68, 0xeb, 0x10, 0x53, 0xa7, 0x83, 0xe8, 0xf9, 0xe5, 0xbe, 0x67, + 0xeb, 0x54, 0x2f, 0xd3, 0xdf, 0x88, 0x04, 0xea, 0x57, 0x5c, 0x2c, 0x48, + 0xa6, 0x1a, 0xe0, 0x15, 0xc0, 0xac, 0x35, 0xe5, 0xf4, 0x5b, 0xcc, 0x4e, + 0x1f, 0xa2, 0xa1, 0x98, 0x74, 0xb8, 0x56, 0x89, 0x56, 0x5f, 0x0b, 0xa7, + 0x20, 0x98, 0x5c, 0x68, 0x20, 0x0a, 0x92, 0x4a, 0xa5, 0x82, 0xf7, 0x4c, + 0x0d, 0x67, 0xb3, 0x13, 0xf5, 0x5b, 0x6a, 0xc7, 0xe6, 0x70, 0x06, 0x92, + 0x7d, 0x1e, 0xc1, 0xfc, 0xf4, 0x0c, 0xee, 0xa5, 0x55, 0x44, 0x3f, 0x34, + 0x16, 0x3d, 0xec, 0xf5, 0x2e, 0xf5, 0xa5, 0x59, 0x2c, 0xeb, 0x12, 0x82, + 0x85, 0x00, 0x81, 0x60, 0xfe, 0xf0, 0x71, 0xaa, 0x57, 0x5c, 0x82, 0xe8, + 0x8f, 0x17, 0xb2, 0x92, 0x84, 0x54, 0xb6, 0x54, 0x91, 0x32, 0xc0, 0xd9, + 0xec, 0xe0, 0x09, 0x0b, 0xf0, 0x99, 0x5a, 0xf0, 0x71, 0x10, 0x58, 0x23, + 0x97, 0x50, 0x0b, 0x5b, 0x58, 0xf8, 0x20, 0x04, 0xa3, 0x65, 0x9b, 0xd6, + 0x6b, 0x1d, 0xc0, 0xa3, 0x6a, 0x97, 0x91, 0xcf, 0x1c, 0xa7, 0x76, 0x3e, + 0xe0, 0x86, 0xab, 0xaa, 0xd4, 0xea, 0x3e, 0xd2, 0x2c, 0x28, 0x60, 0xd2, + 0x56, 0xb4, 0xb0, 0x85, 0x0d, 0xd8, 0xf8, 0xf8, 0xd0, 0x92, 0xaa, 0x5e, + 0x5c, 0x66, 0xb1, 0x26, 0x51, 0xd0, 0x0b, 0x3a, 0x19, 0xa0, 0x56, 0x31, + 0xd1, 0xb3, 0x15, 0x0a, 0xec, 0xe5, 0xf9, 0x21, 0x8e, 0xb0, 0xd4, 0xa2, + 0x28, 0x4d, 0x10, 0x6b, 0xc0, 0x5a, 0x53, 0xa2, 0x54, 0x0c, 0xa9, 0x79, + 0x2d, 0x8a, 0x7d, 0x45, 0x40, 0xd0, 0xca, 0x80, 0xc1, 0xd4, 0x58, 0x4a, + 0x33, 0x75, 0x4f, 0x2f, 0xa7, 0x24, 0x50, 0x2b, 0x79, 0x9c, 0x85, 0x60, + 0x65, 0xdd, 0xb2, 0xe7, 0xdf, 0xb2, 0xd9, 0xe2, 0x91, 0x2f, 0x3d, 0xca, + 0x3b, 0xdf, 0xfe, 0xee, 0x94, 0x7b, 0x37, 0xa0, 0x96, 0xd1, 0xfb, 0xae, + 0x7f, 0x1b, 0xb5, 0xb9, 0xef, 0xf0, 0xc8, 0x97, 0x1e, 0xe5, 0x83, 0x3f, + 0x3f, 0xde, 0x01, 0xe9, 0xba, 0xee, 0x5f, 0x5f, 0xcb, 0x67, 0xee, 0xfc, + 0x3d, 0xe0, 0xa9, 0x08, 0x0c, 0x36, 0xfb, 0x67, 0xdf, 0x60, 0xdd, 0x4f, + 0xbe, 0x25, 0x8a, 0x2f, 0x9b, 0x1e, 0x93, 0x06, 0x13, 0x76, 0x36, 0x0d, + 0x66, 0xff, 0x91, 0x2f, 0x3d, 0x9a, 0x82, 0x8d, 0x3d, 0xf2, 0xa5, 0x47, + 0x79, 0xee, 0xd4, 0x69, 0x7e, 0xed, 0xf6, 0x7f, 0x97, 0x4a, 0x63, 0x12, + 0x3a, 0xd6, 0x0d, 0x40, 0x66, 0xd2, 0x9f, 0x05, 0x97, 0xad, 0x06, 0x40, + 0xf6, 0xc8, 0x97, 0x1e, 0x55, 0x00, 0xd4, 0x72, 0x1d, 0xf6, 0xd4, 0x61, + 0x8f, 0x36, 0xd8, 0x83, 0x72, 0x1f, 0xa9, 0xc7, 0x01, 0x4e, 0x97, 0xd3, + 0x85, 0xf7, 0xd5, 0xec, 0x1b, 0x89, 0x5c, 0xb9, 0x72, 0xe5, 0xca, 0x95, + 0x2b, 0x57, 0xae, 0x5c, 0xb9, 0x72, 0xe5, 0xca, 0x95, 0x2b, 0x57, 0xae, + 0x5c, 0xb9, 0x72, 0xe5, 0xca, 0x95, 0x2b, 0x57, 0xae, 0x5c, 0xb9, 0x72, + 0xe5, 0xca, 0xb5, 0x1a, 0xe5, 0x50, 0xad, 0x5c, 0xb9, 0x72, 0xe5, 0xca, + 0x95, 0xeb, 0x47, 0x40, 0x6e, 0xf2, 0x43, 0xbc, 0xcc, 0x47, 0xc4, 0x8d, + 0x66, 0x0c, 0xde, 0x92, 0xcd, 0x06, 0x3b, 0xc3, 0x4e, 0xca, 0x00, 0x00, + 0x20, 0x00, 0x49, 0x44, 0x41, 0x54, 0xa2, 0xcf, 0x8e, 0x5b, 0xf0, 0x68, + 0x9e, 0x4a, 0x0b, 0xd9, 0x44, 0xad, 0x74, 0x49, 0xbc, 0x4a, 0x6f, 0x16, + 0xec, 0x50, 0x5a, 0xef, 0x60, 0x5b, 0x76, 0xf4, 0xa1, 0xb9, 0xb3, 0xd6, + 0x4a, 0xcf, 0xc6, 0x05, 0xec, 0xb5, 0x36, 0xac, 0x85, 0xda, 0xd1, 0x39, + 0xac, 0x7e, 0x07, 0xef, 0x94, 0x47, 0xd8, 0x8c, 0x57, 0x36, 0xaf, 0x56, + 0x87, 0xd3, 0x81, 0x26, 0xc0, 0x05, 0x96, 0x65, 0xe3, 0x9d, 0xd6, 0xe0, + 0x97, 0x05, 0x35, 0xe1, 0xa5, 0x68, 0xd9, 0x11, 0x10, 0xc5, 0xb2, 0xd4, + 0x47, 0x80, 0x14, 0x04, 0x52, 0x43, 0xab, 0x96, 0x83, 0x4f, 0x54, 0x36, + 0x57, 0xa0, 0x28, 0x68, 0xb5, 0x5b, 0x54, 0x36, 0x5f, 0xa2, 0xc2, 0xcb, + 0x4c, 0x9d, 0xb1, 0x2f, 0x1b, 0x86, 0x36, 0x4c, 0xcd, 0x4e, 0x51, 0xb4, + 0x05, 0xb5, 0x67, 0xe7, 0xa1, 0x20, 0xb0, 0xd7, 0x3a, 0xc8, 0x36, 0x8c, + 0x5e, 0xa9, 0x3f, 0xf5, 0x14, 0x02, 0xbf, 0x5e, 0x4b, 0xf9, 0x35, 0xe0, + 0xac, 0x70, 0x29, 0xa0, 0x15, 0x36, 0x28, 0x5a, 0x89, 0x8f, 0x4b, 0x97, + 0x02, 0xac, 0xfe, 0x92, 0xb6, 0x0b, 0x11, 0x6b, 0x7a, 0x4f, 0xf0, 0xb9, + 0x20, 0x15, 0x04, 0x34, 0x34, 0xac, 0xc7, 0xb5, 0x15, 0x28, 0xab, 0x20, + 0xe2, 0x65, 0xec, 0x25, 0x70, 0x3a, 0x61, 0x6b, 0x17, 0xe1, 0x74, 0x03, + 0xb6, 0xda, 0x31, 0x54, 0xcb, 0xf8, 0x4f, 0xb8, 0x39, 0xfd, 0x82, 0xb0, + 0x0b, 0x6c, 0xca, 0xb8, 0xd5, 0x4e, 0xf8, 0x0a, 0xf6, 0x91, 0x81, 0x4e, + 0x39, 0x25, 0xeb, 0x82, 0x20, 0x55, 0x40, 0x0c, 0xd4, 0xca, 0xfa, 0x2b, + 0x88, 0xc8, 0x4f, 0x14, 0x5f, 0xa1, 0x13, 0xe0, 0xd5, 0x08, 0xbb, 0x4c, + 0x5a, 0xd0, 0x7e, 0x8d, 0x3f, 0xa4, 0xec, 0xee, 0xaf, 0x47, 0x3a, 0xa1, + 0x33, 0x6f, 0xa0, 0x80, 0x5a, 0xca, 0x5f, 0x06, 0x16, 0x96, 0x28, 0x17, + 0x50, 0xf7, 0x57, 0xcf, 0xf8, 0xda, 0x69, 0xff, 0x51, 0x39, 0x5f, 0xe0, + 0x2c, 0xae, 0x24, 0x40, 0xab, 0xdb, 0x71, 0x56, 0x42, 0x94, 0x56, 0x05, + 0xda, 0xca, 0xca, 0x00, 0xb4, 0xdc, 0x4b, 0x1d, 0xe2, 0x4f, 0xff, 0xe3, + 0x8f, 0x90, 0xcd, 0xc4, 0x8f, 0x68, 0x95, 0x75, 0xbd, 0x9a, 0x38, 0xc4, + 0x70, 0x2d, 0x00, 0xfa, 0xd4, 0x6a, 0xc5, 0x59, 0xf9, 0xbe, 0xcf, 0xe4, + 0xc1, 0xee, 0xb0, 0x83, 0xd1, 0xed, 0xa3, 0x1d, 0x6e, 0x95, 0x4a, 0x85, + 0x2f, 0xfc, 0x61, 0xe7, 0x0a, 0xe8, 0xdb, 0x47, 0xb6, 0x47, 0xd0, 0xbe, + 0xa4, 0xa6, 0x0e, 0x4d, 0x51, 0x3b, 0x51, 0xeb, 0x70, 0xef, 0x16, 0xb6, + 0x6c, 0x4b, 0x1e, 0x7a, 0xb8, 0x13, 0x02, 0x01, 0xb0, 0xf3, 0xba, 0x9d, + 0xb8, 0xa4, 0x3f, 0x72, 0x9e, 0x3a, 0xd4, 0x1d, 0xdf, 0x20, 0xf5, 0xef, + 0xcd, 0x94, 0x8d, 0x99, 0x94, 0x33, 0x73, 0x44, 0x4d, 0x84, 0x67, 0xcb, + 0xf2, 0xf7, 0x7f, 0xd8, 0x0b, 0xf0, 0x92, 0xeb, 0x87, 0x22, 0xab, 0x0b, + 0x4c, 0x0f, 0xd4, 0x75, 0x0d, 0x9b, 0xbd, 0xc1, 0x59, 0x46, 0xd1, 0xbd, + 0xb0, 0x8a, 0x49, 0x51, 0x1b, 0x07, 0x06, 0x38, 0x78, 0xf0, 0x20, 0xc0, + 0x2b, 0x06, 0xab, 0xca, 0x6a, 0x61, 0x65, 0x93, 0xd8, 0xf6, 0xd4, 0x29, + 0x0e, 0xde, 0x73, 0x8f, 0x4a, 0xcf, 0xad, 0xb7, 0x72, 0x6a, 0x61, 0x81, + 0x8b, 0x0e, 0x1e, 0xe4, 0x7d, 0x77, 0xdf, 0xbd, 0x6a, 0xa0, 0xd6, 0x6a, + 0xa0, 0x60, 0xd9, 0xf4, 0xdd, 0x06, 0xec, 0x18, 0x18, 0xb8, 0x60, 0xbf, + 0xff, 0x90, 0x64, 0x7e, 0x47, 0x5f, 0xfc, 0x93, 0xc7, 0xb9, 0xe9, 0x28, + 0xf0, 0xdb, 0x57, 0x47, 0xe7, 0x6e, 0xbb, 0xa2, 0xca, 0xde, 0xc3, 0xdd, + 0x90, 0x37, 0x70, 0xe3, 0xa5, 0x25, 0x04, 0xe0, 0x2f, 0x05, 0x1c, 0x58, + 0x84, 0xdd, 0xdb, 0x4a, 0xd1, 0xb9, 0xfb, 0x8e, 0x05, 0xec, 0x5c, 0x0f, + 0x32, 0xfa, 0x4d, 0xc6, 0x13, 0x82, 0x1d, 0xd7, 0xa1, 0x71, 0x4e, 0xa6, + 0x56, 0x49, 0x97, 0x6d, 0x70, 0x36, 0x38, 0xb4, 0x1a, 0x0d, 0x42, 0x0d, + 0x09, 0x89, 0x7c, 0x9a, 0xfa, 0x3a, 0xd1, 0x9e, 0xfe, 0x53, 0xb0, 0x97, + 0xcd, 0x90, 0x46, 0x7f, 0x97, 0x3a, 0x39, 0x19, 0x4e, 0xb2, 0x81, 0xfe, + 0x11, 0xae, 0x9f, 0x27, 0x0f, 0x75, 0x77, 0xb7, 0x7f, 0x40, 0x23, 0x75, + 0xe1, 0xb1, 0xfd, 0x2f, 0x1f, 0xac, 0xd5, 0x4d, 0x37, 0xde, 0xa9, 0xfe, + 0x8c, 0xbe, 0x3d, 0x05, 0xbf, 0xe1, 0xc1, 0x93, 0x53, 0x70, 0xa4, 0x13, + 0xfa, 0xf8, 0x6a, 0x6a, 0xdf, 0xb1, 0x1e, 0x85, 0x9e, 0x3c, 0x97, 0xb1, + 0x99, 0x7b, 0xfc, 0xbe, 0x0e, 0x5b, 0x8f, 0x8a, 0xde, 0xe6, 0x7a, 0xb5, + 0x54, 0xbd, 0x80, 0x89, 0xdc, 0xa0, 0xea, 0x92, 0x64, 0x2b, 0xdf, 0x0d, + 0x0e, 0x95, 0x3c, 0x9f, 0x85, 0x6c, 0x49, 0xed, 0xb6, 0x1c, 0x50, 0xab, + 0x9b, 0xfb, 0x4a, 0xe7, 0x8d, 0x7b, 0x37, 0xf0, 0x55, 0x37, 0xb7, 0xe5, + 0x94, 0x8c, 0xc3, 0xe4, 0xe5, 0xad, 0x89, 0x7d, 0x93, 0x97, 0x75, 0x2c, + 0x0f, 0xd4, 0x7a, 0x39, 0xf9, 0x48, 0xc6, 0x67, 0xd4, 0xcd, 0xcd, 0x28, + 0x7b, 0x5d, 0x56, 0x93, 0x86, 0xac, 0xfc, 0x67, 0x7d, 0xe6, 0x0f, 0xce, + 0x51, 0xbd, 0x6a, 0x10, 0x6b, 0x7d, 0x11, 0xef, 0xd8, 0x3c, 0xd6, 0x80, + 0xcb, 0x25, 0x03, 0x2e, 0x2d, 0x12, 0x4f, 0x41, 0x1a, 0x24, 0x12, 0x3d, + 0xf3, 0x69, 0x80, 0xae, 0x2f, 0x88, 0x61, 0x38, 0xfa, 0x19, 0xa4, 0xb4, + 0xde, 0xe1, 0xbe, 0x83, 0x3e, 0xd5, 0xab, 0x06, 0xa1, 0x04, 0xfe, 0xc3, + 0x73, 0x38, 0x5b, 0x06, 0x61, 0x11, 0xbc, 0x2d, 0x32, 0x0a, 0x53, 0x14, + 0xd3, 0x7d, 0xcc, 0xc9, 0x2f, 0x4b, 0x06, 0x77, 0x40, 0xb5, 0x5a, 0x61, + 0x7e, 0x7e, 0x1e, 0xff, 0x19, 0xdd, 0x57, 0xb8, 0xb4, 0xca, 0x81, 0xfb, + 0x6b, 0xf8, 0x81, 0x64, 0xe8, 0x9a, 0x61, 0xa4, 0x6c, 0xe0, 0xd5, 0x75, + 0xfd, 0x18, 0xa8, 0xb1, 0x1c, 0x57, 0xa4, 0xe1, 0x18, 0x46, 0x8f, 0x7e, + 0x19, 0x86, 0xaf, 0x83, 0xa1, 0xa1, 0x61, 0x82, 0x25, 0x05, 0xce, 0x02, + 0x38, 0x70, 0x0f, 0x94, 0xb6, 0x38, 0x94, 0xb6, 0x38, 0x10, 0x80, 0x77, + 0xca, 0x63, 0x68, 0x68, 0x98, 0x6b, 0xaf, 0x01, 0xbf, 0x2d, 0xa3, 0x89, + 0xe1, 0x46, 0x32, 0xfa, 0x0f, 0x1e, 0xd5, 0x64, 0xbd, 0xb9, 0x00, 0xae, + 0xbd, 0x46, 0xed, 0x9b, 0xf8, 0x5b, 0xcd, 0x16, 0x3b, 0xab, 0x44, 0xe3, + 0x52, 0x25, 0xbd, 0xdd, 0x59, 0x8d, 0xc3, 0x2a, 0x6f, 0x88, 0xa1, 0x05, + 0x63, 0x1a, 0x26, 0x56, 0x75, 0xa0, 0xea, 0xa8, 0xf2, 0xa8, 0x6e, 0x10, + 0xc8, 0x6e, 0x93, 0x48, 0xb7, 0x74, 0xef, 0x6f, 0xaf, 0x96, 0x4b, 0xf0, + 0x64, 0x0f, 0x08, 0x55, 0x2f, 0x10, 0xdc, 0x55, 0xbf, 0xf9, 0xcf, 0xe8, + 0xee, 0x03, 0xfe, 0xf2, 0xe0, 0xdf, 0xf3, 0x37, 0x47, 0x96, 0x87, 0x55, + 0xbd, 0xfd, 0xe3, 0xaf, 0xe1, 0x1b, 0xbf, 0xff, 0xf7, 0xab, 0x4b, 0x5c, + 0x0f, 0xf5, 0x4a, 0xdb, 0xdb, 0x3f, 0xfe, 0x9a, 0x9e, 0x69, 0xfb, 0x1f, + 0xad, 0x17, 0x99, 0xf9, 0x9d, 0x38, 0xde, 0xb7, 0xe9, 0x6d, 0x96, 0x53, + 0xb4, 0x26, 0x73, 0xec, 0xd8, 0xaf, 0xe1, 0x5b, 0x8d, 0xd8, 0x5f, 0x11, + 0xf8, 0xbb, 0xc4, 0xf9, 0xff, 0xef, 0x7b, 0x2f, 0xf2, 0x66, 0xbd, 0xdf, + 0xfc, 0xde, 0x8b, 0x04, 0xdf, 0x7b, 0x91, 0x33, 0x74, 0x0c, 0x41, 0xf2, + 0x13, 0x7d, 0x17, 0x71, 0xb6, 0xb9, 0x7c, 0xd9, 0xec, 0x22, 0x86, 0x64, + 0x9d, 0x84, 0x08, 0x9e, 0x65, 0xdc, 0x9a, 0x2f, 0xbc, 0xc8, 0xdf, 0xea, + 0xfd, 0x4d, 0xda, 0x86, 0x84, 0xdd, 0x4a, 0x4a, 0x42, 0xb0, 0x1c, 0x0d, + 0xb7, 0x72, 0x4a, 0x2e, 0x5e, 0x6d, 0x92, 0x90, 0x6a, 0x74, 0xec, 0xd7, + 0xe6, 0xa9, 0x54, 0xaa, 0x11, 0xa8, 0xca, 0x28, 0x3e, 0x9e, 0x67, 0xe6, + 0x90, 0x8f, 0x5b, 0xa9, 0x44, 0xe1, 0xa4, 0x60, 0x59, 0x89, 0xf0, 0x01, + 0x8e, 0x03, 0x97, 0x94, 0x14, 0x08, 0xce, 0x41, 0x8d, 0x05, 0x0e, 0xeb, + 0xf0, 0x7d, 0xd4, 0xf4, 0x73, 0xbb, 0xe4, 0x82, 0xb1, 0xaf, 0xc1, 0x25, + 0x15, 0x70, 0x70, 0x15, 0x58, 0x2b, 0x91, 0x7e, 0x08, 0x71, 0x4a, 0xd5, + 0x44, 0x5e, 0xe6, 0x09, 0xa9, 0x6a, 0x28, 0x56, 0x1c, 0x67, 0x36, 0x2d, + 0x06, 0xda, 0x65, 0x35, 0x54, 0x1f, 0x56, 0x41, 0xbb, 0x54, 0x9e, 0x2a, + 0x40, 0x2d, 0x00, 0x85, 0xf7, 0xb2, 0xf4, 0xbe, 0xc7, 0x25, 0x25, 0x97, + 0x7f, 0x5f, 0xaa, 0xf1, 0xbb, 0x41, 0xfa, 0x66, 0x2a, 0x5f, 0x0d, 0xfc, + 0x17, 0x14, 0x20, 0xe5, 0x23, 0xc0, 0x1f, 0x75, 0x07, 0x5e, 0x25, 0xd5, + 0x0d, 0xa6, 0x95, 0x85, 0x66, 0x2d, 0x07, 0xd8, 0x5a, 0x09, 0xc0, 0xb5, + 0x9c, 0x5a, 0x05, 0x68, 0xb5, 0xa1, 0xf8, 0x12, 0xfa, 0xc2, 0xd1, 0x62, + 0x14, 0xcb, 0x49, 0xff, 0xd8, 0x0d, 0x50, 0x2b, 0xe9, 0xd6, 0xcb, 0xb6, + 0x97, 0xfb, 0x60, 0xd9, 0x8a, 0x60, 0x5b, 0xe6, 0x78, 0xae, 0x1e, 0xa6, + 0x6c, 0xba, 0xf9, 0xfd, 0xd4, 0xf6, 0xfd, 0xf8, 0x15, 0x78, 0xff, 0x3b, + 0xdf, 0xc1, 0xe0, 0x6f, 0x94, 0x01, 0x05, 0xd0, 0x9a, 0x79, 0x3a, 0xbe, + 0x76, 0x33, 0x4f, 0x27, 0x9e, 0x07, 0x9b, 0x6a, 0xdb, 0xe8, 0xdf, 0xcf, + 0x60, 0xd5, 0x66, 0x6e, 0x5e, 0x8f, 0xa5, 0xd7, 0x54, 0x7e, 0xa7, 0x8e, + 0xd4, 0xb0, 0x3f, 0x56, 0x61, 0xe8, 0xb1, 0x49, 0xf6, 0x3f, 0x66, 0x63, + 0xf5, 0xd9, 0xc8, 0xa5, 0x19, 0xc2, 0x73, 0x1a, 0xf0, 0xb4, 0x51, 0x2f, + 0x24, 0x70, 0x4a, 0xdf, 0x51, 0x6b, 0xc1, 0x12, 0x36, 0x07, 0x9e, 0x3c, + 0xa0, 0x60, 0x5a, 0xe7, 0xba, 0x0d, 0x6d, 0xba, 0x88, 0xcd, 0xf7, 0xc1, + 0xc1, 0x61, 0xa6, 0x0e, 0x4d, 0x31, 0xb6, 0x01, 0xf8, 0xd9, 0x12, 0xe1, + 0xc3, 0x2a, 0x7f, 0x95, 0xfe, 0x21, 0x3c, 0x54, 0x7f, 0xd9, 0x5e, 0x23, + 0x68, 0x20, 0xe1, 0xf4, 0xca, 0x15, 0xb9, 0x25, 0xd2, 0xe3, 0x73, 0xc1, + 0x92, 0xfa, 0xed, 0xcb, 0x76, 0x8b, 0x52, 0xa1, 0xa2, 0xc6, 0xc0, 0x33, + 0x0a, 0x97, 0x6a, 0x09, 0xbf, 0xea, 0x7c, 0x47, 0x6b, 0xd9, 0xf1, 0x7b, + 0x59, 0xfd, 0x60, 0xad, 0x29, 0x5f, 0x15, 0x47, 0xa9, 0xe3, 0xbc, 0x01, + 0x6a, 0x15, 0x35, 0xe4, 0xc1, 0x0f, 0x6a, 0x58, 0xc2, 0x22, 0x94, 0xea, + 0x49, 0x3e, 0x94, 0x0a, 0xc8, 0x22, 0xdb, 0x32, 0x7a, 0xb2, 0x0f, 0xa3, + 0x46, 0x2d, 0x59, 0x26, 0xfa, 0x7a, 0x58, 0x9d, 0x63, 0xa0, 0x1d, 0x71, + 0xae, 0xc2, 0x66, 0x65, 0x7f, 0xab, 0x5f, 0x84, 0x20, 0x0b, 0xd3, 0xea, + 0x26, 0xf3, 0xe6, 0x67, 0x39, 0xf8, 0x59, 0x52, 0x23, 0xc0, 0x34, 0x31, + 0x3c, 0x6b, 0x44, 0x6f, 0xeb, 0x19, 0x9b, 0x3a, 0x30, 0xb1, 0x47, 0x1d, + 0x97, 0x47, 0x62, 0xa0, 0xd4, 0xc4, 0xb4, 0xf2, 0xbb, 0x47, 0x87, 0x31, + 0x3d, 0xdd, 0x09, 0xa6, 0x02, 0x05, 0x8f, 0x1a, 0x29, 0x2b, 0xa8, 0x15, + 0xc0, 0x9e, 0x84, 0xcd, 0x1e, 0x0d, 0xa1, 0x2a, 0x27, 0xe2, 0x88, 0xfc, + 0xd1, 0x05, 0x74, 0x35, 0xa2, 0xc0, 0x5c, 0x10, 0x87, 0x97, 0x34, 0xa9, + 0x4f, 0x2b, 0x26, 0x97, 0x01, 0x6b, 0x75, 0x93, 0xf2, 0x5f, 0xef, 0xf0, + 0x67, 0xf2, 0x66, 0xe2, 0xdd, 0x33, 0xa2, 0xed, 0xd1, 0x65, 0x52, 0x27, + 0x5d, 0x38, 0x28, 0xd0, 0xd7, 0x2b, 0xa5, 0xb2, 0xbe, 0x12, 0xbd, 0x82, + 0x1c, 0x19, 0x81, 0x91, 0x69, 0x98, 0x1e, 0x41, 0xc1, 0xff, 0xc7, 0xeb, + 0x84, 0xe3, 0xf0, 0x01, 0x7a, 0xf7, 0x63, 0x8c, 0x52, 0x8b, 0x6e, 0x14, + 0x84, 0x02, 0xc7, 0x67, 0x3a, 0x76, 0xb2, 0x19, 0xa6, 0x16, 0xc9, 0xe8, + 0x19, 0x56, 0x9f, 0x15, 0xbf, 0x67, 0x6c, 0x4b, 0xfd, 0x2e, 0x34, 0x04, + 0x21, 0xa2, 0xbe, 0xa2, 0x6c, 0xcb, 0xd4, 0x3e, 0x24, 0x16, 0xe1, 0x48, + 0x1c, 0x63, 0xc6, 0x8f, 0xda, 0x31, 0x3c, 0x4b, 0xea, 0xb4, 0x75, 0x1d, + 0x23, 0xd6, 0x69, 0xef, 0xd8, 0xef, 0x72, 0x9c, 0xf5, 0xff, 0x83, 0xc8, + 0x7f, 0xd8, 0x0c, 0x11, 0x32, 0x4c, 0xa5, 0xd7, 0x0f, 0x3c, 0x9c, 0xf5, + 0x55, 0x4a, 0x25, 0x07, 0x29, 0x25, 0x76, 0x9f, 0x45, 0xe8, 0xfb, 0x94, + 0x1c, 0x07, 0x49, 0x0c, 0xc9, 0xda, 0xbd, 0x59, 0xd5, 0x05, 0xf7, 0x9d, + 0xf0, 0x09, 0x1f, 0x53, 0x63, 0x3f, 0x49, 0xb0, 0x56, 0xf8, 0xd8, 0x7e, + 0x8e, 0x2f, 0xaa, 0x87, 0x9f, 0x0e, 0xb0, 0xd6, 0x72, 0xe9, 0x6b, 0x83, + 0x2c, 0xe8, 0x3f, 0x5d, 0xdf, 0x0d, 0xb5, 0x63, 0x60, 0xb7, 0x6c, 0x4b, + 0xb5, 0xf0, 0x92, 0x50, 0xe5, 0x60, 0x40, 0x59, 0xb2, 0x40, 0xd4, 0x2e, + 0xfa, 0x1a, 0xae, 0xe5, 0x1b, 0x08, 0x57, 0xd2, 0x06, 0x14, 0xc0, 0xb0, + 0x19, 0x52, 0x2d, 0xc0, 0x7c, 0x1b, 0x2a, 0x05, 0xa8, 0xb5, 0xc1, 0x2a, + 0x14, 0xd9, 0x37, 0x04, 0x37, 0x3e, 0xd9, 0x62, 0xb0, 0xa0, 0xc0, 0x57, + 0xbe, 0xf6, 0x7f, 0xaf, 0x80, 0x5b, 0xa4, 0x1a, 0x47, 0xbb, 0x03, 0x05, + 0x96, 0xf2, 0x74, 0x5a, 0xb2, 0xed, 0xc3, 0x50, 0x5b, 0x01, 0x7f, 0x5a, + 0x6d, 0xc5, 0xb0, 0xf1, 0x35, 0x14, 0xcc, 0x6f, 0x0b, 0x3e, 0xf5, 0x69, + 0x87, 0x4f, 0xde, 0xd1, 0x88, 0xe0, 0x56, 0x3a, 0x65, 0xf8, 0x80, 0xad, + 0x17, 0x95, 0x42, 0x42, 0x4b, 0xb4, 0x28, 0xea, 0x96, 0xa8, 0xdb, 0x5b, + 0xbb, 0x6a, 0x41, 0xf7, 0xdb, 0x12, 0x6d, 0x9a, 0x28, 0x08, 0x0c, 0x72, + 0xf8, 0xf6, 0x42, 0x0c, 0xbf, 0x72, 0x0a, 0x45, 0x7c, 0x5d, 0x5f, 0x9b, + 0x38, 0x5b, 0x6d, 0x05, 0xc5, 0x92, 0x52, 0xfb, 0x88, 0x89, 0xe8, 0xb8, + 0x3a, 0xfd, 0x76, 0x41, 0xed, 0xcf, 0x49, 0xc9, 0x6c, 0x9f, 0x60, 0xec, + 0x4a, 0x05, 0xde, 0xba, 0xa4, 0x00, 0xc7, 0xdb, 0x92, 0xa2, 0xce, 0x23, + 0x28, 0xa0, 0x96, 0x5d, 0x80, 0x3b, 0xda, 0xc9, 0x7c, 0x2d, 0xaf, 0x24, + 0xc0, 0x29, 0x0b, 0x91, 0x4a, 0xc2, 0xa3, 0x92, 0x32, 0xd0, 0xab, 0x2c, + 0xd0, 0xc9, 0xc0, 0xa2, 0x4c, 0xb8, 0x49, 0x78, 0x55, 0x12, 0x20, 0x95, + 0x84, 0x5c, 0x25, 0xdd, 0xbb, 0xa5, 0xc9, 0xec, 0x67, 0xd3, 0x62, 0xe2, + 0x3e, 0xef, 0x9f, 0x4d, 0x01, 0xaf, 0x8c, 0x2d, 0xc0, 0xe8, 0xa8, 0x7a, + 0xbf, 0x38, 0x35, 0x35, 0x95, 0x82, 0x59, 0x25, 0xd3, 0x93, 0x04, 0x78, + 0x19, 0x98, 0xd6, 0x4a, 0x61, 0xae, 0x39, 0x73, 0x26, 0x95, 0x9e, 0x2c, + 0xbc, 0xcb, 0x00, 0xaf, 0xcc, 0x39, 0x13, 0x96, 0xd9, 0x9e, 0xf7, 0xcf, + 0x46, 0x65, 0x63, 0xec, 0x47, 0x47, 0x47, 0x23, 0x68, 0x58, 0x32, 0xee, + 0xf3, 0xfe, 0x59, 0xce, 0x24, 0xf2, 0x6f, 0xd2, 0x6b, 0x6c, 0x4c, 0xba, + 0xba, 0x5d, 0xa7, 0xac, 0x64, 0x01, 0xfc, 0x35, 0x2e, 0x0d, 0x3f, 0xa4, + 0x3c, 0xa0, 0xbe, 0x8d, 0xf0, 0x16, 0x3c, 0x64, 0xb3, 0x45, 0x65, 0x83, + 0x43, 0xe5, 0xf2, 0x2a, 0xfe, 0x52, 0xc8, 0xfc, 0xd1, 0x79, 0x5c, 0xdb, + 0x62, 0xff, 0xe1, 0x1a, 0xbb, 0xb7, 0x96, 0x99, 0x11, 0xca, 0x56, 0x86, + 0x12, 0x84, 0x8d, 0xd4, 0xd0, 0x51, 0x77, 0x6d, 0x99, 0xb0, 0x59, 0xa7, + 0x32, 0x50, 0xc1, 0xb2, 0x4a, 0xf8, 0x0b, 0x1e, 0x8d, 0x96, 0x72, 0xaf, + 0x6c, 0x73, 0x11, 0xed, 0x22, 0xf3, 0xc7, 0x66, 0xb0, 0xd6, 0x5a, 0xd4, + 0x6a, 0xf3, 0x54, 0xaf, 0x1c, 0xa5, 0xb6, 0x30, 0x8f, 0xdb, 0x5f, 0xc2, + 0xb2, 0x1c, 0x02, 0xbd, 0xe0, 0x8f, 0x59, 0x50, 0xc7, 0xbd, 0xd4, 0xf4, + 0x1d, 0x2d, 0x2c, 0x4b, 0xdd, 0x77, 0x61, 0xd8, 0xc2, 0x19, 0x70, 0x09, + 0xc3, 0x00, 0x0b, 0x41, 0x18, 0xb6, 0x10, 0xfd, 0x25, 0x4a, 0x03, 0xfa, + 0xbe, 0x0c, 0x3c, 0x4a, 0x25, 0x17, 0x29, 0x4b, 0xc8, 0xa5, 0x90, 0x92, + 0x65, 0xe1, 0xf4, 0xd9, 0x78, 0x1a, 0xb2, 0x05, 0xc4, 0xef, 0x81, 0x07, + 0x6c, 0x64, 0x08, 0x32, 0x08, 0x70, 0xca, 0x0e, 0x7e, 0x3d, 0x33, 0x86, + 0x2d, 0x8a, 0x58, 0x56, 0x0b, 0x54, 0x11, 0x53, 0x29, 0x3b, 0x4c, 0x2e, + 0x78, 0xc8, 0xbe, 0x10, 0xa7, 0xed, 0x53, 0xba, 0x72, 0x0c, 0xa4, 0x50, + 0xdf, 0xf0, 0x14, 0xd4, 0xfd, 0x26, 0xb3, 0xfd, 0xd0, 0xa2, 0x88, 0xc0, + 0x76, 0x69, 0xf4, 0x78, 0x62, 0x34, 0xac, 0x25, 0x63, 0xb0, 0x96, 0x54, + 0xee, 0xb6, 0x65, 0x45, 0xfd, 0x4c, 0x90, 0x0a, 0xc0, 0x25, 0x24, 0xe2, + 0xb5, 0xe0, 0x58, 0x0e, 0x61, 0x3b, 0x7e, 0xdf, 0x51, 0xec, 0xeb, 0x3e, + 0x96, 0x94, 0xd4, 0xb7, 0x4e, 0x84, 0x9c, 0xfd, 0x9b, 0x6f, 0x01, 0xb0, + 0x18, 0x2c, 0xf0, 0xce, 0xb7, 0xbf, 0x3b, 0x3a, 0x4e, 0x6a, 0xdd, 0x4f, + 0xbe, 0x25, 0x75, 0xfc, 0xc8, 0x97, 0x1e, 0x65, 0x7d, 0x69, 0x20, 0x3a, + 0x5e, 0x0c, 0x16, 0xa2, 0xe3, 0x75, 0x3f, 0xf9, 0x96, 0x28, 0x8c, 0xac, + 0x3f, 0x03, 0xbf, 0x3a, 0xfb, 0x37, 0xdf, 0xea, 0x88, 0xc7, 0x84, 0xf1, + 0x85, 0xcf, 0x29, 0xf7, 0x64, 0xf8, 0xdd, 0xfc, 0x3d, 0x77, 0xea, 0x34, + 0xb3, 0x7f, 0xf6, 0x8d, 0xc8, 0xc6, 0x9c, 0x7b, 0xee, 0x94, 0xfa, 0x90, + 0x26, 0x09, 0xd4, 0x32, 0xaa, 0xcd, 0x7d, 0xa7, 0x23, 0x2c, 0x13, 0xef, + 0x9f, 0x7f, 0xe3, 0x29, 0xd6, 0x97, 0x06, 0x22, 0x28, 0xd6, 0xec, 0x9f, + 0x7d, 0x83, 0xf5, 0xa5, 0x81, 0x28, 0x3c, 0x93, 0x0e, 0xb5, 0x4d, 0xa4, + 0xf9, 0xcf, 0xd2, 0xf9, 0x9e, 0xfd, 0x33, 0xf8, 0xfa, 0xd3, 0xe9, 0x77, + 0x08, 0xbd, 0xf2, 0x9d, 0x8c, 0xdf, 0xe8, 0xb9, 0x53, 0xa7, 0x61, 0xa2, + 0xae, 0x0e, 0xf6, 0x10, 0xc3, 0xb4, 0x26, 0xea, 0x24, 0xe8, 0xaa, 0xba, + 0x43, 0x5c, 0x57, 0x1d, 0xc9, 0x91, 0x32, 0xb9, 0x72, 0xe5, 0xca, 0x95, + 0x2b, 0x57, 0xae, 0x5c, 0xb9, 0x72, 0xe5, 0xca, 0x95, 0x2b, 0x57, 0xae, + 0x5c, 0xb9, 0x72, 0xe5, 0xca, 0x95, 0x2b, 0x57, 0xae, 0x5c, 0xb9, 0x72, + 0xe5, 0xca, 0x95, 0xeb, 0xa5, 0x2b, 0x87, 0x6a, 0xe5, 0xca, 0x95, 0x2b, + 0x57, 0xae, 0x5c, 0xaf, 0x96, 0x76, 0x68, 0x58, 0xd6, 0x09, 0x09, 0x9b, + 0x65, 0xd7, 0xc9, 0x23, 0x00, 0x45, 0x21, 0x68, 0x2c, 0x85, 0x11, 0x64, + 0x41, 0x36, 0x1b, 0x48, 0x29, 0xb1, 0x4a, 0x0e, 0xc8, 0x90, 0x22, 0x56, + 0x04, 0xd6, 0x6a, 0x2c, 0x2a, 0x1b, 0x03, 0x87, 0x92, 0xfa, 0x63, 0x5f, + 0xda, 0x89, 0xf0, 0x65, 0xbc, 0x3c, 0xad, 0x7f, 0x2e, 0xc4, 0x59, 0xab, + 0x6d, 0x28, 0x46, 0xf3, 0x4e, 0x1a, 0xbe, 0x8f, 0xe8, 0xb7, 0x09, 0xf5, + 0xc7, 0x90, 0x0d, 0x19, 0xd2, 0x08, 0x43, 0xd0, 0x2b, 0x10, 0x47, 0xca, + 0xf4, 0x24, 0xfc, 0xa5, 0x46, 0x07, 0x2c, 0xa9, 0x15, 0x36, 0x08, 0x43, + 0x1f, 0xdb, 0xb2, 0xa3, 0xd5, 0xcf, 0x69, 0xcb, 0x08, 0x96, 0x60, 0xf5, + 0x97, 0x52, 0xab, 0x19, 0xcb, 0x36, 0x04, 0x41, 0x40, 0x65, 0x73, 0x05, + 0xcb, 0x2e, 0xc5, 0xab, 0xf7, 0xea, 0x0f, 0x1a, 0x4b, 0xe5, 0x68, 0x0a, + 0xab, 0xfa, 0x7c, 0xb9, 0x0d, 0x5e, 0xe0, 0x23, 0x97, 0xc2, 0x68, 0x12, + 0x9b, 0x0c, 0x02, 0xc2, 0x20, 0xc0, 0xdd, 0x9a, 0x98, 0xf9, 0x29, 0x65, + 0xc7, 0xc4, 0x26, 0x7b, 0x8d, 0xc0, 0xf3, 0xea, 0xb4, 0x34, 0xf4, 0xab, + 0x15, 0x36, 0x08, 0x9a, 0x21, 0xee, 0x7a, 0xfd, 0xb1, 0x66, 0x22, 0x2f, + 0xc1, 0xe9, 0x3a, 0xab, 0x91, 0x3c, 0xa1, 0x3f, 0x9b, 0xdc, 0xd1, 0x80, + 0x2f, 0x2b, 0x37, 0x6b, 0xab, 0xca, 0x5d, 0xb0, 0x18, 0x42, 0x39, 0x51, + 0x3e, 0x06, 0x8e, 0x95, 0xfc, 0x68, 0x3f, 0xf9, 0x61, 0x65, 0x5b, 0x4f, + 0x4c, 0x6a, 0x03, 0x89, 0x89, 0x3e, 0x2c, 0x6a, 0x08, 0x92, 0xf6, 0x6f, + 0x0b, 0x7a, 0x02, 0xb5, 0x92, 0xa0, 0xa8, 0x2c, 0xc0, 0x2c, 0x0b, 0xaa, + 0xb2, 0x2d, 0x11, 0x1d, 0x1b, 0xc8, 0x50, 0x65, 0x73, 0x7a, 0x32, 0xcf, + 0xfc, 0x09, 0x8f, 0x46, 0x82, 0x4f, 0x11, 0xf9, 0x49, 0x00, 0xb5, 0x56, + 0x13, 0x9f, 0x6d, 0x29, 0xbb, 0x6e, 0x7e, 0x45, 0x81, 0x08, 0x10, 0xd7, + 0x2d, 0x9d, 0xa9, 0x3c, 0x26, 0xfc, 0x65, 0xd3, 0x1a, 0x86, 0x2d, 0x1a, + 0x09, 0x98, 0x86, 0xdd, 0x6f, 0xd1, 0x58, 0x0a, 0xa3, 0xb2, 0x4a, 0xa5, + 0x75, 0xb5, 0xf1, 0x25, 0xca, 0x34, 0xa8, 0xab, 0x89, 0x8c, 0xd6, 0x56, + 0x01, 0xe6, 0xdb, 0xc9, 0xc4, 0x7d, 0x7d, 0x61, 0xcc, 0xad, 0x6e, 0x93, + 0x8b, 0x83, 0x65, 0x8f, 0x57, 0x52, 0xed, 0x44, 0x0d, 0xd1, 0xa3, 0x5e, + 0xe9, 0x26, 0xdb, 0xea, 0x5c, 0xdd, 0xb4, 0xd7, 0xa4, 0x8f, 0x6e, 0xb6, + 0x06, 0x9e, 0xb7, 0x9c, 0xbf, 0x48, 0x2b, 0x3c, 0x85, 0x64, 0xc3, 0x4f, + 0x4e, 0x58, 0x31, 0x50, 0xc0, 0x97, 0x2a, 0xa7, 0xdf, 0xa1, 0x25, 0xd3, + 0x13, 0xcc, 0x02, 0x5d, 0xb6, 0x26, 0x6c, 0x13, 0xbe, 0x6d, 0xd9, 0xb4, + 0x64, 0x8b, 0x7a, 0xf2, 0xbe, 0x7e, 0x4c, 0xf9, 0x49, 0xde, 0xd7, 0xe5, + 0x72, 0x79, 0xd5, 0xf1, 0xd7, 0xeb, 0xf5, 0x0b, 0xb2, 0x7f, 0x29, 0x7e, + 0xfe, 0x21, 0xdb, 0xbf, 0x94, 0xb0, 0x0d, 0x00, 0xb1, 0x9b, 0x64, 0xb3, + 0x13, 0xa8, 0x13, 0xe8, 0x7a, 0xa1, 0x94, 0x05, 0xf3, 0xf4, 0x09, 0x55, + 0x4f, 0x67, 0xee, 0xeb, 0xb5, 0x5b, 0x15, 0x75, 0xee, 0xf4, 0x62, 0x73, + 0xd5, 0x10, 0xa9, 0xdb, 0x27, 0xa6, 0x01, 0x78, 0x60, 0xba, 0xde, 0x91, + 0xa7, 0x5e, 0xd9, 0xbb, 0x62, 0x7c, 0x4f, 0xca, 0x6f, 0xd6, 0xff, 0xff, + 0xe4, 0x85, 0x0e, 0x3f, 0x0b, 0x1a, 0xa8, 0xb5, 0x11, 0x38, 0x78, 0xcf, + 0x3d, 0x0c, 0xec, 0xd8, 0xc1, 0x47, 0x80, 0xaf, 0x9d, 0x3a, 0xc5, 0xc6, + 0x81, 0x81, 0x0e, 0xfb, 0x57, 0x42, 0x1f, 0x01, 0x3e, 0xff, 0x03, 0x02, + 0x8a, 0xfd, 0x30, 0x75, 0x7a, 0xb1, 0x09, 0xf4, 0xab, 0xeb, 0x3b, 0xa5, + 0xc0, 0x01, 0x56, 0x9f, 0xaa, 0xc7, 0x82, 0x44, 0x9b, 0x7b, 0xd3, 0xac, + 0xe4, 0xde, 0x2a, 0x88, 0x03, 0xf1, 0x0c, 0xf4, 0x9b, 0x8e, 0x02, 0x87, + 0xaf, 0xa6, 0x9b, 0xee, 0x3b, 0x96, 0xae, 0xab, 0xf7, 0x1e, 0x49, 0x1f, + 0x1f, 0x58, 0x84, 0xb1, 0x2d, 0x9d, 0x75, 0xa8, 0xdf, 0x90, 0xaa, 0x6e, + 0x34, 0x80, 0xd4, 0xc8, 0x5d, 0xd7, 0xad, 0x99, 0x09, 0xac, 0x61, 0x5b, + 0x59, 0x59, 0xff, 0xc4, 0xec, 0x85, 0x65, 0x41, 0xa2, 0xbd, 0xc9, 0xf6, + 0x3b, 0xbb, 0xb5, 0x3c, 0xe6, 0x7a, 0x5a, 0x7d, 0x8d, 0xa8, 0x2f, 0xa8, + 0xae, 0x75, 0x91, 0x20, 0x94, 0x5c, 0x30, 0x25, 0xf3, 0x65, 0xeb, 0x29, + 0x00, 0x66, 0x8f, 0xbc, 0x03, 0x80, 0xa1, 0xcb, 0xe3, 0x33, 0xb3, 0x47, + 0xd4, 0xb6, 0x62, 0xd5, 0xa9, 0x85, 0xe5, 0x57, 0x3c, 0xe6, 0xe5, 0x80, + 0x5a, 0xaf, 0x18, 0x70, 0xeb, 0xa7, 0x3a, 0x21, 0x98, 0x3f, 0x2c, 0x05, + 0xa1, 0x84, 0xf5, 0xc5, 0xe8, 0x5e, 0x86, 0x44, 0x7b, 0x1d, 0x04, 0xdc, + 0xb8, 0x6d, 0x27, 0x33, 0x66, 0xb2, 0x51, 0x9f, 0x80, 0xb6, 0x00, 0x19, + 0x52, 0x9b, 0x9e, 0xe4, 0xc6, 0x6d, 0xdb, 0x01, 0x10, 0x25, 0x1b, 0xbb, + 0x69, 0xe1, 0x37, 0x3d, 0xf6, 0x1d, 0x3b, 0xc4, 0xe0, 0xd5, 0xbb, 0x95, + 0x7d, 0x11, 0x68, 0x29, 0xc8, 0xd6, 0xee, 0xcb, 0xc7, 0xb0, 0xf5, 0x64, + 0xac, 0x56, 0x3b, 0x64, 0xef, 0xe1, 0x03, 0x91, 0x9d, 0x70, 0x40, 0x36, + 0x2b, 0x70, 0xbe, 0xc6, 0xdc, 0xe3, 0xf7, 0x71, 0xdb, 0x15, 0xd7, 0x03, + 0x60, 0xbb, 0x36, 0x9c, 0x6b, 0xd1, 0x68, 0x4a, 0xf6, 0x1e, 0x7e, 0x88, + 0xe1, 0xeb, 0x3e, 0xa5, 0xe3, 0x83, 0x70, 0xc9, 0x41, 0xb4, 0x7d, 0x66, + 0x1e, 0xf9, 0x34, 0xb7, 0x8f, 0xdc, 0xa0, 0xdc, 0x37, 0x14, 0xe1, 0x5c, + 0x8b, 0xdb, 0x9f, 0xf8, 0x42, 0xca, 0x56, 0x36, 0x81, 0x26, 0x5d, 0x6d, + 0xa5, 0x84, 0x3b, 0xa7, 0x95, 0xbd, 0x28, 0x81, 0xe9, 0x3a, 0x66, 0x6d, + 0xe5, 0x69, 0xd5, 0x0f, 0x32, 0xb6, 0x51, 0xd8, 0xc1, 0x85, 0xd9, 0x9a, + 0xb0, 0x93, 0x79, 0x6c, 0x68, 0xe0, 0xef, 0xde, 0xc3, 0x0f, 0xa5, 0xcb, + 0x44, 0xcf, 0x4d, 0x53, 0x65, 0xb2, 0x93, 0xe2, 0x06, 0x87, 0xd6, 0x69, + 0x1f, 0xd9, 0x96, 0xdc, 0x77, 0x64, 0x52, 0xd9, 0xea, 0x32, 0x36, 0x76, + 0xe6, 0x9a, 0x58, 0xae, 0x4b, 0xe8, 0xa9, 0xe7, 0xbc, 0x7d, 0xc7, 0x0e, + 0x51, 0x19, 0x19, 0x23, 0x98, 0xde, 0x0b, 0x94, 0x53, 0xed, 0xf5, 0xdb, + 0xfb, 0xd6, 0x02, 0xf0, 0xed, 0xe6, 0xe9, 0x0e, 0xe0, 0x42, 0xaf, 0x3b, + 0x3d, 0x09, 0x70, 0x4a, 0x3e, 0x89, 0xfd, 0xff, 0xec, 0xbd, 0x7f, 0x90, + 0xde, 0xc6, 0x79, 0xe7, 0xf9, 0x71, 0xf6, 0xf5, 0xa5, 0xdf, 0xcd, 0x4b, + 0x07, 0xa8, 0x1d, 0x26, 0x80, 0x38, 0x4c, 0x5e, 0xb8, 0x28, 0x8b, 0x2f, + 0x8f, 0x8a, 0xf4, 0x72, 0x49, 0x6f, 0x66, 0x4e, 0xca, 0x0e, 0x27, 0x52, + 0xca, 0x9a, 0xb2, 0x52, 0x11, 0x6d, 0xe7, 0xce, 0xa2, 0x7d, 0x3b, 0x91, + 0x94, 0xab, 0xb2, 0x45, 0xdb, 0xb5, 0x67, 0x2a, 0xc9, 0x9e, 0xac, 0x64, + 0x12, 0x59, 0xd9, 0xe4, 0x24, 0x25, 0x6b, 0x8b, 0x94, 0xb3, 0x89, 0xa5, + 0xcc, 0x95, 0x23, 0xe9, 0x36, 0xb2, 0xa9, 0x6c, 0xe4, 0x0c, 0x5d, 0xd1, + 0x65, 0x38, 0x8e, 0x74, 0x33, 0xba, 0x50, 0x99, 0x97, 0x5a, 0xb2, 0xf8, + 0x8e, 0x4c, 0x96, 0x01, 0x9b, 0x43, 0x01, 0x0e, 0x67, 0x0f, 0x58, 0xe9, + 0x2d, 0xbf, 0xed, 0xf3, 0x9b, 0xf8, 0xfe, 0xe8, 0x6e, 0x00, 0xef, 0xaf, + 0x99, 0x21, 0x2d, 0xff, 0x4a, 0xf0, 0xad, 0x9a, 0x01, 0xd0, 0x78, 0xfa, + 0xe9, 0x6e, 0xe0, 0x45, 0xa3, 0xd1, 0x8d, 0xfe, 0xa0, 0xd7, 0x36, 0xbf, + 0x7d, 0xb9, 0xd0, 0xa7, 0xcd, 0x68, 0x50, 0xde, 0x5e, 0x65, 0x38, 0x58, + 0x6b, 0x58, 0xad, 0x65, 0xf2, 0xb6, 0x99, 0xb2, 0x7c, 0x27, 0xca, 0x31, + 0x28, 0x3d, 0x93, 0xce, 0xa0, 0xfa, 0x79, 0x33, 0xe7, 0xe5, 0xab, 0xad, + 0x0b, 0x30, 0xa2, 0xce, 0xef, 0xdf, 0x6a, 0xce, 0x4f, 0xfe, 0x7e, 0x1d, + 0xad, 0x86, 0x38, 0xa3, 0x2e, 0x61, 0x33, 0x4c, 0x41, 0x55, 0xb6, 0x65, + 0xa9, 0xbe, 0x89, 0x15, 0x9b, 0xc0, 0x4c, 0xfa, 0xde, 0xa9, 0xd3, 0xcc, + 0xc1, 0x94, 0x97, 0x56, 0x00, 0xda, 0x84, 0x61, 0x42, 0xed, 0xe6, 0x5d, + 0x84, 0x2b, 0x0d, 0xc2, 0x15, 0x05, 0xc2, 0x72, 0x46, 0x5d, 0x1a, 0xcf, + 0x2d, 0x67, 0xa0, 0x2d, 0xc7, 0x22, 0xbc, 0xe4, 0xc3, 0x19, 0x8f, 0x06, + 0x30, 0xb5, 0x9b, 0x2e, 0x70, 0x94, 0x28, 0x0b, 0x18, 0x85, 0xe5, 0xd3, + 0x10, 0x85, 0x7e, 0x06, 0xd4, 0xd2, 0x0a, 0xa3, 0x04, 0xd7, 0xb1, 0x58, + 0x7a, 0x46, 0x4d, 0x8c, 0x0d, 0x4f, 0x35, 0xd8, 0xf3, 0x8e, 0xfd, 0x04, + 0x7e, 0x13, 0x1a, 0x7b, 0xa0, 0xde, 0x4e, 0x01, 0x56, 0x46, 0x51, 0x09, + 0x70, 0xca, 0x2c, 0x3e, 0x0f, 0x38, 0xb0, 0xf8, 0x29, 0x05, 0x13, 0x76, + 0xaf, 0x1f, 0xc3, 0x3f, 0xe7, 0xe3, 0x8c, 0xb8, 0x2c, 0x2d, 0x2d, 0x6a, + 0x7f, 0x4b, 0x70, 0xdb, 0x38, 0x61, 0x09, 0x16, 0x9f, 0x87, 0xf1, 0x1b, + 0xe9, 0x03, 0x6b, 0xbd, 0x6b, 0x0c, 0x1e, 0xfe, 0xbd, 0x65, 0xaa, 0x9e, + 0x82, 0x85, 0x4d, 0xdd, 0xdc, 0xa6, 0xdd, 0x62, 0xd3, 0x92, 0x9d, 0x75, + 0x9e, 0xef, 0x60, 0x30, 0x48, 0x4b, 0x6b, 0xee, 0x94, 0x64, 0x72, 0xe7, + 0x80, 0x38, 0xb9, 0x28, 0x5d, 0xf7, 0x6b, 0xad, 0xfc, 0x75, 0xbd, 0x7b, + 0xf3, 0x59, 0xfd, 0x47, 0x29, 0xd3, 0xf2, 0xdc, 0x80, 0x89, 0x94, 0xaa, + 0x17, 0x8b, 0xf5, 0xdf, 0x0f, 0xb0, 0x19, 0xc6, 0xfe, 0xd9, 0x8c, 0xfe, + 0x2b, 0xf0, 0x2f, 0xf4, 0xfa, 0x7f, 0xcb, 0x85, 0x19, 0x2d, 0x03, 0x37, + 0x03, 0x8b, 0x39, 0x3b, 0xa3, 0x41, 0xd7, 0x75, 0xfe, 0x99, 0xeb, 0x5f, + 0x8e, 0xa9, 0x3e, 0xb9, 0x30, 0xf2, 0x53, 0x10, 0xd6, 0x40, 0x94, 0x8b, + 0x6d, 0x91, 0x00, 0x35, 0x07, 0x9a, 0x64, 0xb0, 0x2b, 0x23, 0xd7, 0xa9, + 0xe3, 0x37, 0x15, 0xc8, 0xca, 0x80, 0xb8, 0xa0, 0x01, 0x58, 0x29, 0xb4, + 0xcb, 0x84, 0x5b, 0xc0, 0x5c, 0xdc, 0xc8, 0x80, 0x5d, 0x91, 0xcf, 0xae, + 0x5a, 0x9d, 0xc5, 0x66, 0x03, 0xdb, 0xb6, 0x54, 0xdc, 0xc8, 0x4f, 0xd3, + 0xa8, 0x39, 0x1e, 0x8b, 0x71, 0xa3, 0xcb, 0x87, 0xc9, 0x2b, 0x00, 0x3a, + 0xef, 0x79, 0x5f, 0xca, 0x16, 0x40, 0x85, 0x9f, 0xcd, 0xf9, 0x36, 0x65, + 0x75, 0x01, 0x0b, 0x48, 0x6a, 0xf4, 0xf8, 0x86, 0xc5, 0x18, 0x6c, 0x5b, + 0xc5, 0x8f, 0xe3, 0x84, 0x5d, 0x35, 0x05, 0xed, 0x32, 0xc7, 0xa6, 0x17, + 0x68, 0x15, 0x7c, 0x1e, 0x18, 0x1d, 0x74, 0xe0, 0x32, 0xf5, 0xc6, 0xe9, + 0xda, 0x1e, 0x12, 0xde, 0xbb, 0x0e, 0xd9, 0x76, 0x2f, 0x50, 0x6b, 0xe0, + 0x33, 0x97, 0x69, 0x9b, 0x05, 0x09, 0x93, 0xbf, 0x50, 0x65, 0xee, 0xf9, + 0xec, 0x99, 0x7d, 0xea, 0x46, 0x55, 0x9a, 0xb9, 0xa5, 0x5c, 0xd8, 0xbe, + 0xec, 0xec, 0xcf, 0x9d, 0x5c, 0x3f, 0x3c, 0x1f, 0x76, 0xec, 0x44, 0x36, + 0x31, 0xfe, 0xc0, 0x7e, 0x77, 0xc3, 0xf0, 0xfc, 0xbe, 0xcd, 0xd8, 0xf7, + 0x86, 0x2f, 0xff, 0x71, 0x96, 0x37, 0x03, 0xd8, 0xda, 0x53, 0xb5, 0xba, + 0xc2, 0xde, 0x35, 0xf9, 0x3f, 0x64, 0xe1, 0x9f, 0x49, 0x18, 0x07, 0x96, + 0xbf, 0xa0, 0x1b, 0x55, 0xef, 0xb0, 0xba, 0x80, 0x5a, 0x00, 0x53, 0xd6, + 0x11, 0x96, 0x39, 0x48, 0xaf, 0xc2, 0xda, 0x31, 0xb5, 0xf2, 0x79, 0xa0, + 0x0d, 0x4b, 0x97, 0x26, 0x89, 0x2f, 0xa8, 0xdf, 0xa6, 0xbb, 0x3d, 0x4b, + 0x33, 0x4a, 0x32, 0x98, 0x96, 0xb8, 0x04, 0xed, 0x0b, 0x92, 0x36, 0x21, + 0xef, 0x7a, 0xcf, 0xed, 0x3c, 0x76, 0xe6, 0x2e, 0xbc, 0x4b, 0x53, 0xc4, + 0x52, 0xa6, 0xbf, 0xa1, 0xf6, 0x25, 0xb0, 0xf6, 0x1e, 0xa5, 0x19, 0x48, + 0xf5, 0x38, 0xa6, 0x8b, 0x24, 0x25, 0xcc, 0xeb, 0x7e, 0x52, 0x83, 0xde, + 0x8f, 0xcf, 0x65, 0xe5, 0x95, 0x0c, 0xee, 0x23, 0xdd, 0xa3, 0xc1, 0x36, + 0x61, 0x2b, 0x42, 0xb6, 0xf2, 0xf0, 0x7c, 0x81, 0xc2, 0xd4, 0x59, 0x88, + 0x92, 0x9d, 0x02, 0xb6, 0xf2, 0x7d, 0x85, 0x02, 0x73, 0xdf, 0xb1, 0x52, + 0xb8, 0x16, 0x08, 0x12, 0xde, 0x58, 0x05, 0xad, 0x79, 0x2c, 0x51, 0x23, + 0x91, 0x11, 0xae, 0x53, 0xc3, 0x92, 0x0e, 0x89, 0x6c, 0x62, 0x89, 0xfd, + 0x0a, 0xf0, 0xa2, 0xd5, 0x0c, 0x1e, 0xc6, 0x12, 0x53, 0xb9, 0x12, 0x0b, + 0xf2, 0xad, 0x98, 0x14, 0x98, 0x20, 0xbf, 0xdb, 0xcf, 0x96, 0x9b, 0x07, + 0x68, 0x5d, 0xae, 0xe4, 0xc0, 0xd6, 0x9b, 0x3a, 0x9f, 0x8c, 0xa8, 0xf3, + 0x6b, 0x5a, 0x3b, 0xf9, 0x3a, 0x3c, 0x46, 0xcd, 0xfb, 0x37, 0x0a, 0x06, + 0xf8, 0x58, 0xe8, 0xb5, 0x59, 0x50, 0x7d, 0x65, 0xd3, 0x13, 0x7a, 0x3b, + 0x50, 0x70, 0xad, 0x89, 0x09, 0xb5, 0x84, 0x6c, 0x9f, 0xd9, 0x36, 0x5c, + 0x81, 0x6a, 0xb5, 0x1b, 0x42, 0x55, 0xad, 0x66, 0x89, 0x1a, 0x78, 0xd6, + 0xf4, 0x04, 0x29, 0x25, 0x2b, 0xd7, 0xe5, 0x96, 0xd9, 0x2f, 0x74, 0xe7, + 0xb3, 0x5a, 0xed, 0x07, 0x6f, 0x19, 0xb0, 0xd6, 0xc4, 0x04, 0x54, 0x17, + 0x80, 0xe9, 0x2a, 0xb3, 0x1a, 0x86, 0x60, 0xf2, 0x3f, 0x51, 0xed, 0xf7, + 0x9f, 0x02, 0xb5, 0x72, 0x7e, 0x53, 0x5b, 0x06, 0xab, 0xaa, 0x97, 0xb3, + 0xb3, 0xc3, 0x41, 0x5e, 0x06, 0x02, 0x06, 0xdd, 0x36, 0xf9, 0x38, 0xb3, + 0xb3, 0x10, 0x2c, 0x04, 0xcc, 0xce, 0xaa, 0x1c, 0x54, 0x73, 0x47, 0x3d, + 0x20, 0x60, 0x66, 0x1a, 0x66, 0x66, 0x21, 0x98, 0x36, 0x69, 0xaa, 0xf2, + 0x58, 0xda, 0xf7, 0x85, 0xbb, 0x36, 0xe8, 0x37, 0x13, 0xa2, 0xfb, 0x23, + 0x27, 0x25, 0xbd, 0xad, 0xc7, 0x22, 0x37, 0x0b, 0x94, 0x82, 0x7c, 0xff, + 0x6d, 0x4f, 0x1f, 0xcf, 0x10, 0x10, 0xd6, 0xa0, 0x70, 0x93, 0x8e, 0x6c, + 0x25, 0x19, 0xc8, 0x1d, 0x10, 0xc2, 0x52, 0x7d, 0xfe, 0xbd, 0x6e, 0x0c, + 0x30, 0x2b, 0xdf, 0xc6, 0xed, 0x6d, 0xef, 0x0e, 0xda, 0x67, 0xca, 0x56, + 0xb1, 0x86, 0x97, 0x3f, 0x97, 0xc7, 0xcb, 0x2a, 0xbf, 0x90, 0x20, 0xb3, + 0xa3, 0x20, 0xa5, 0xd4, 0xf0, 0x3b, 0x49, 0xb8, 0xda, 0x44, 0x94, 0xca, + 0xc8, 0x4e, 0x1b, 0xd9, 0x92, 0xb8, 0x23, 0x0e, 0x12, 0x14, 0x48, 0x4b, + 0xc3, 0xb1, 0x0e, 0x7e, 0xe4, 0x70, 0x06, 0xd7, 0xda, 0x79, 0x98, 0x07, + 0x1e, 0x7c, 0x88, 0xb3, 0xab, 0x11, 0xbb, 0x34, 0x58, 0xcb, 0xba, 0xf5, + 0x20, 0x7c, 0xea, 0x61, 0x00, 0xc6, 0x3f, 0xf0, 0xd1, 0x14, 0xbc, 0x25, + 0x07, 0xf4, 0x9b, 0xe5, 0xc7, 0xb9, 0xe4, 0x80, 0xf6, 0xc4, 0x52, 0x89, + 0x14, 0x9e, 0x55, 0xef, 0x40, 0xb3, 0x24, 0x55, 0xdf, 0x5d, 0x49, 0xe5, + 0x3f, 0x0f, 0xdd, 0x52, 0xc7, 0xcf, 0x1c, 0xa7, 0xec, 0xb9, 0xc2, 0xc0, + 0xba, 0x00, 0x1a, 0x52, 0xf5, 0x8b, 0x36, 0xa4, 0x82, 0x53, 0xdd, 0x49, + 0x06, 0x82, 0x3a, 0xba, 0x04, 0x08, 0x58, 0x96, 0x70, 0xe4, 0x01, 0x97, + 0xfb, 0x7e, 0x23, 0x24, 0xee, 0x69, 0xc8, 0x1e, 0x45, 0xd7, 0x5b, 0x3a, + 0xfc, 0x48, 0x07, 0x0e, 0x69, 0xdf, 0x07, 0x3a, 0x70, 0xcc, 0xc0, 0xbb, + 0x80, 0x50, 0x4a, 0xea, 0x40, 0x64, 0x7e, 0x14, 0xbf, 0x11, 0x52, 0x16, + 0x70, 0xa8, 0x23, 0xba, 0xc0, 0x5a, 0x52, 0x42, 0xac, 0x4d, 0x0e, 0x02, + 0x4f, 0x00, 0x47, 0x4a, 0xf0, 0x18, 0x3a, 0x7f, 0x1d, 0xb5, 0x6d, 0x40, + 0x59, 0x8d, 0x0e, 0x0c, 0x1b, 0xa5, 0xb0, 0xb4, 0x9d, 0x55, 0x52, 0x7d, + 0x9c, 0x77, 0x74, 0xda, 0x2c, 0xa3, 0x21, 0x59, 0xa8, 0x78, 0x73, 0x1d, + 0xf5, 0x24, 0xbf, 0x07, 0xb8, 0x43, 0xdb, 0xd7, 0x4a, 0x30, 0xd7, 0x81, + 0xa9, 0x92, 0x02, 0xbb, 0xc7, 0x1d, 0xb8, 0x5f, 0xc3, 0xc5, 0x00, 0x1e, + 0x5f, 0x52, 0x3e, 0xce, 0x76, 0xe0, 0xa1, 0xfb, 0xd4, 0xb1, 0x51, 0xf7, + 0xd3, 0xec, 0xb7, 0x99, 0x3f, 0x0f, 0x72, 0xc0, 0x38, 0x17, 0x3f, 0xa7, + 0xce, 0xf5, 0x37, 0x56, 0xbe, 0x9e, 0x42, 0x9a, 0x78, 0xed, 0x15, 0xf2, + 0x32, 0xb0, 0xa6, 0x74, 0xff, 0x00, 0x19, 0x9b, 0x54, 0xaf, 0x6d, 0xb0, + 0xbd, 0x51, 0xf8, 0x06, 0xe9, 0x0d, 0xcb, 0x2b, 0xaf, 0x65, 0x10, 0x30, + 0xc8, 0x00, 0x53, 0x17, 0x35, 0xfc, 0xca, 0xec, 0xbb, 0x66, 0x00, 0xc7, + 0x32, 0x0f, 0xb0, 0xca, 0x97, 0x27, 0x1f, 0x2f, 0xef, 0x73, 0xe5, 0xa5, + 0x93, 0x5d, 0xdb, 0x79, 0x68, 0x56, 0x2f, 0x50, 0xcc, 0x80, 0xc3, 0x8c, + 0xdd, 0x55, 0x28, 0x98, 0xd6, 0x2b, 0xaf, 0xbc, 0x02, 0xaf, 0x65, 0x50, + 0xae, 0xab, 0xde, 0xb2, 0xa5, 0x0b, 0xa8, 0x65, 0xd2, 0x4e, 0xcb, 0xac, + 0xcb, 0x97, 0xf7, 0x9f, 0xfa, 0xcc, 0xa5, 0xf5, 0x8d, 0x95, 0xaf, 0xab, + 0x9f, 0xc2, 0xcf, 0xc5, 0xf0, 0x9f, 0x55, 0x39, 0xf2, 0x75, 0xf8, 0xd2, + 0x92, 0x8f, 0x55, 0x52, 0xef, 0x64, 0xb8, 0xa3, 0x16, 0xe1, 0x6a, 0x82, + 0xaf, 0xdf, 0x83, 0xf0, 0xe3, 0x04, 0x5e, 0x6c, 0x50, 0xfb, 0xe9, 0x3a, + 0xec, 0xab, 0xe3, 0x8e, 0x58, 0x2c, 0x1d, 0x3f, 0xc1, 0x93, 0x17, 0x60, + 0xec, 0x16, 0x05, 0xb5, 0x92, 0x40, 0xb4, 0xda, 0xc4, 0x19, 0xad, 0xb1, + 0xb8, 0xd4, 0xc4, 0x2e, 0xab, 0x57, 0x16, 0x2c, 0xcb, 0x21, 0x49, 0x24, + 0x91, 0x1f, 0x21, 0xca, 0x20, 0xe3, 0x08, 0xff, 0x8c, 0xc4, 0xdd, 0xe1, + 0xe2, 0x5d, 0xef, 0x61, 0x59, 0x0a, 0x0e, 0x28, 0x93, 0x10, 0xe2, 0x36, + 0xee, 0x4f, 0x67, 0x40, 0xad, 0xfc, 0x18, 0x33, 0x80, 0x5c, 0x93, 0x88, + 0x91, 0x84, 0xc6, 0x0b, 0xfa, 0xdd, 0x8f, 0x5c, 0x4b, 0x30, 0x3f, 0xb6, + 0x27, 0x65, 0x1b, 0xff, 0x94, 0x6a, 0x2f, 0xc6, 0x41, 0x4c, 0xa2, 0xeb, + 0x98, 0xfa, 0xde, 0x3a, 0x71, 0x27, 0x46, 0x74, 0x14, 0xdc, 0xaa, 0xf1, + 0xdc, 0x12, 0xb5, 0x7a, 0x0d, 0xa1, 0xe3, 0xca, 0xb5, 0x90, 0x76, 0xab, + 0x8d, 0x2f, 0x1c, 0x1a, 0x17, 0x9a, 0xdc, 0xa1, 0x3f, 0xd2, 0x56, 0xab, + 0xba, 0x34, 0x83, 0x90, 0x5a, 0xd5, 0x65, 0xe9, 0x5c, 0x36, 0xb6, 0x93, + 0xac, 0x25, 0xec, 0xaa, 0x94, 0x89, 0x5b, 0x2e, 0xcb, 0xcf, 0xcc, 0x61, + 0x5b, 0x36, 0xfb, 0x77, 0x38, 0x34, 0x4b, 0x65, 0x3c, 0xd7, 0x51, 0x60, + 0x2d, 0x09, 0xa2, 0xac, 0xfd, 0x93, 0xc1, 0x20, 0x45, 0xa7, 0xfb, 0x0e, + 0x27, 0x6c, 0xa1, 0x21, 0x5a, 0xa8, 0xba, 0x5f, 0xc7, 0x10, 0x52, 0x40, + 0x49, 0x2a, 0x90, 0xab, 0x79, 0xb7, 0xa7, 0x04, 0x96, 0xed, 0xd2, 0x3c, + 0xbd, 0x8c, 0x6b, 0xb9, 0xb4, 0x3b, 0x60, 0x03, 0xe8, 0x3e, 0xee, 0xbe, + 0xbe, 0x14, 0x7d, 0x4d, 0xbf, 0xf0, 0xa5, 0x2f, 0x71, 0x27, 0xf4, 0xc1, + 0xaf, 0xf2, 0xdb, 0xc3, 0xc0, 0x58, 0x5f, 0x59, 0x49, 0x52, 0x08, 0x94, + 0x01, 0x42, 0xe5, 0xb7, 0x8d, 0xf2, 0xeb, 0x26, 0x5e, 0x3e, 0x8d, 0x5e, + 0xe5, 0xc1, 0x52, 0x26, 0xbe, 0x49, 0x3b, 0x9f, 0x9f, 0xde, 0x34, 0xf2, + 0x20, 0xb0, 0xbf, 0x7e, 0xfe, 0x04, 0x6f, 0xbd, 0x7a, 0x7b, 0x0a, 0xc2, + 0xca, 0x03, 0xb5, 0x8c, 0xf2, 0xbe, 0x7a, 0xd3, 0x5d, 0x8d, 0xce, 0xd3, + 0x5c, 0xbe, 0x2e, 0x85, 0x86, 0xf5, 0xc2, 0xb1, 0x7a, 0xfd, 0x0c, 0x2a, + 0xeb, 0x6a, 0x74, 0x9e, 0xb7, 0x5e, 0xbd, 0xbd, 0xcf, 0x7e, 0xd0, 0xb1, + 0x1d, 0x54, 0xee, 0xb7, 0x5e, 0xbd, 0x3d, 0x23, 0xac, 0x56, 0xf5, 0x72, + 0x26, 0xc8, 0x0c, 0xa6, 0x75, 0xf8, 0x42, 0x55, 0x03, 0x58, 0x03, 0x5e, + 0x18, 0xff, 0x12, 0x3f, 0xc2, 0x4f, 0x76, 0x5d, 0xd3, 0x85, 0x0a, 0x15, + 0x2a, 0x54, 0xa8, 0x50, 0xa1, 0x42, 0x85, 0x0a, 0x15, 0x2a, 0x54, 0xa8, + 0x50, 0xa1, 0x42, 0x85, 0x0a, 0x15, 0x2a, 0x54, 0xa8, 0x50, 0xa1, 0x42, + 0x85, 0x0a, 0x15, 0x2a, 0x54, 0x68, 0xf3, 0x2a, 0xa0, 0x5a, 0x85, 0x0a, + 0x15, 0x2a, 0x54, 0xa8, 0xd0, 0xf7, 0x58, 0x62, 0xa7, 0xfa, 0x9a, 0x66, + 0x17, 0x3b, 0xa0, 0x24, 0x48, 0xd6, 0xba, 0x81, 0x01, 0x52, 0x4a, 0xea, + 0x7b, 0xc7, 0xb3, 0x78, 0x42, 0xd0, 0x3c, 0xdf, 0x44, 0xca, 0x24, 0x7b, + 0xdf, 0x4e, 0xed, 0x49, 0x21, 0x51, 0x65, 0xcb, 0x46, 0xca, 0x24, 0xf5, + 0x91, 0xbe, 0x48, 0x2b, 0x65, 0x0a, 0x6d, 0x50, 0x60, 0x2d, 0x0b, 0x68, + 0x83, 0x54, 0xdb, 0xa0, 0x5e, 0x5e, 0x34, 0x71, 0x4d, 0x5e, 0xac, 0x11, + 0x9b, 0xf0, 0x52, 0x88, 0xbd, 0xd5, 0xd6, 0x5f, 0x13, 0x36, 0x3e, 0x7a, + 0xbe, 0xe0, 0x09, 0x8c, 0xef, 0xcf, 0x26, 0xd4, 0xcb, 0x8e, 0x24, 0xbe, + 0x14, 0x13, 0x45, 0xea, 0xe5, 0x43, 0x03, 0xd4, 0x52, 0xbe, 0x23, 0xed, + 0xdb, 0x21, 0x59, 0x8b, 0xf0, 0x57, 0x7d, 0x1c, 0xcb, 0x21, 0x8e, 0x74, + 0x9a, 0xb6, 0x7e, 0x0d, 0xb9, 0x24, 0xa1, 0x23, 0x88, 0x02, 0x35, 0x69, + 0x16, 0x24, 0xed, 0x92, 0x86, 0x6d, 0x09, 0x08, 0xa3, 0x10, 0x17, 0xb5, + 0x34, 0xf2, 0x6a, 0x35, 0xfc, 0x55, 0x1f, 0x57, 0x43, 0xb2, 0xcc, 0x61, + 0x4a, 0xa2, 0xb0, 0x6b, 0xca, 0x49, 0xd4, 0x4a, 0x38, 0x70, 0xeb, 0x81, + 0xae, 0xfc, 0xfb, 0xbe, 0x9f, 0x42, 0xc0, 0x92, 0x24, 0x49, 0x8f, 0xe9, + 0x46, 0x12, 0x3b, 0x87, 0x4f, 0x9e, 0x71, 0x46, 0x2d, 0x85, 0xfd, 0x6a, + 0xa1, 0xa0, 0x58, 0x89, 0x04, 0x4b, 0xa8, 0xa5, 0xd4, 0x61, 0x40, 0xfa, + 0xf6, 0x69, 0x49, 0xc0, 0x76, 0xbd, 0x7e, 0x21, 0xce, 0xde, 0x83, 0x36, + 0x76, 0x41, 0x02, 0x55, 0x8b, 0x76, 0x4b, 0x52, 0xee, 0x9d, 0x0d, 0xd9, + 0x0b, 0xe8, 0x5a, 0x47, 0x5d, 0x80, 0x2b, 0x32, 0x50, 0x55, 0x6d, 0xa7, + 0x4b, 0x92, 0x74, 0x4f, 0xce, 0xf1, 0x1c, 0x27, 0x05, 0x55, 0xe5, 0x81, + 0x5a, 0x97, 0xab, 0x14, 0x5a, 0x35, 0x00, 0xc6, 0x75, 0x25, 0x1a, 0x94, + 0x57, 0x3f, 0x8a, 0xb0, 0x72, 0x79, 0x8b, 0xd7, 0x92, 0xf4, 0xb8, 0xf4, + 0x42, 0xb4, 0xc2, 0x68, 0x83, 0x69, 0x59, 0xa9, 0x9f, 0xec, 0x98, 0x3a, + 0xa3, 0x03, 0xa7, 0x75, 0x02, 0xea, 0x77, 0x20, 0x92, 0xee, 0xc9, 0x1b, + 0x1b, 0x29, 0xb3, 0xd1, 0x80, 0x91, 0xdc, 0xd7, 0x73, 0x87, 0x69, 0x7d, + 0x1b, 0x55, 0xa6, 0x61, 0x93, 0x9f, 0xc5, 0x90, 0xe9, 0xf8, 0x66, 0x42, + 0x8a, 0x94, 0xfd, 0x5f, 0x57, 0xef, 0xb5, 0x1b, 0xb6, 0xff, 0xdb, 0x01, + 0x6a, 0x01, 0xb4, 0x65, 0x1b, 0xdb, 0xb2, 0xd3, 0x97, 0xa8, 0xd3, 0x3c, + 0x0d, 0x9b, 0xc8, 0x6d, 0xbe, 0x7a, 0x9e, 0xfb, 0xfa, 0xf9, 0x7a, 0x2a, + 0x8b, 0x32, 0x6d, 0xd9, 0x4e, 0x97, 0x1b, 0x69, 0xa3, 0xeb, 0xda, 0x1d, + 0xcd, 0xde, 0xc0, 0x1f, 0x54, 0xf6, 0xfc, 0x24, 0x9f, 0x20, 0x08, 0x2e, + 0xcb, 0xfe, 0x4a, 0xe2, 0xfc, 0x20, 0xdb, 0x5f, 0x89, 0x6f, 0x7b, 0xa4, + 0x1f, 0x50, 0x64, 0xd4, 0x8c, 0x22, 0xac, 0x8a, 0x20, 0x69, 0x65, 0xf0, + 0x1e, 0xe3, 0x23, 0x69, 0xe5, 0x40, 0x08, 0x15, 0x81, 0x6c, 0xc9, 0x75, + 0xaf, 0xeb, 0xed, 0xa3, 0x95, 0xbe, 0xc9, 0xe9, 0xdf, 0x8e, 0x2e, 0x93, + 0xad, 0xd6, 0xa7, 0xf3, 0xe7, 0xce, 0x71, 0x4e, 0xaf, 0x9f, 0xcb, 0x85, + 0xff, 0x01, 0xb0, 0x03, 0x36, 0x0d, 0x00, 0xbb, 0x5c, 0xfd, 0xaf, 0xc0, + 0xa7, 0xbe, 0x83, 0xfe, 0xbf, 0x5b, 0xda, 0x3e, 0x5a, 0x19, 0xba, 0xcf, + 0xa9, 0x90, 0x4d, 0x20, 0xfe, 0xf7, 0xef, 0xe6, 0xae, 0xdc, 0xbe, 0x5e, + 0x60, 0xe4, 0xe5, 0x4a, 0x76, 0xa0, 0xb1, 0x72, 0x76, 0x13, 0x86, 0x43, + 0xea, 0xd7, 0x9e, 0x6d, 0x91, 0xcd, 0xde, 0xfd, 0x27, 0x61, 0x0f, 0x60, + 0x99, 0x38, 0x9b, 0x00, 0x6a, 0x81, 0x3e, 0x9f, 0xc3, 0xf6, 0x59, 0x82, + 0x61, 0x33, 0xb3, 0x3f, 0xf8, 0x1f, 0x3f, 0xc6, 0xa3, 0x25, 0xe0, 0xa5, + 0x65, 0x45, 0x40, 0x88, 0x42, 0x78, 0xb1, 0xbf, 0xcd, 0x7b, 0xa5, 0x32, + 0x30, 0xad, 0xa9, 0xfd, 0xfd, 0xfb, 0x0c, 0x5c, 0xeb, 0x8d, 0xd0, 0x91, + 0x2f, 0xa9, 0x89, 0x58, 0x87, 0x04, 0xf0, 0xcc, 0x9c, 0x0a, 0x3c, 0x31, + 0x0f, 0x7f, 0xb6, 0x8c, 0xb5, 0x57, 0x4d, 0xd2, 0x4f, 0x5e, 0x7a, 0xe2, + 0x8d, 0x01, 0x6a, 0x7d, 0x07, 0xb5, 0x5e, 0x39, 0x8c, 0x1c, 0x6b, 0x9d, + 0xfb, 0xb5, 0xe3, 0x10, 0x77, 0x24, 0x50, 0x86, 0xad, 0xb9, 0x76, 0xdd, + 0x96, 0x5c, 0x7b, 0xcd, 0x51, 0xf7, 0x93, 0xf6, 0x56, 0xb0, 0xb6, 0x7a, + 0xf0, 0xd2, 0x09, 0xda, 0xad, 0x98, 0xf2, 0x56, 0x7d, 0x9f, 0xc9, 0x91, + 0x9a, 0xda, 0x5b, 0x75, 0x50, 0x29, 0xbb, 0x67, 0x09, 0xbd, 0x2a, 0x2a, + 0xcd, 0xac, 0xbd, 0x8e, 0x06, 0x6a, 0x01, 0x6c, 0x2d, 0x63, 0x6f, 0x2d, + 0xa7, 0x90, 0x0a, 0xd3, 0x84, 0xb3, 0x46, 0xba, 0x7f, 0x57, 0x62, 0x7b, + 0x39, 0xb5, 0xcf, 0xf2, 0x66, 0x7c, 0xd3, 0xe5, 0x3b, 0x6f, 0x2b, 0x7a, + 0x6d, 0x7b, 0x9a, 0x88, 0xc6, 0x36, 0x8d, 0xb3, 0x8e, 0xfd, 0xe5, 0xd8, + 0xe6, 0xcb, 0x98, 0x07, 0x6b, 0x41, 0xee, 0x98, 0xe4, 0xc0, 0x5a, 0xb8, + 0x16, 0xed, 0x4e, 0x1b, 0x5c, 0x0b, 0x2e, 0xf4, 0x40, 0x63, 0xcb, 0xd0, + 0xbe, 0x94, 0x83, 0xa2, 0x79, 0x1e, 0xb2, 0x9d, 0x20, 0x1c, 0x1b, 0x19, + 0x65, 0xe1, 0x8e, 0x33, 0xbc, 0x8d, 0xfc, 0x13, 0x95, 0xed, 0xbc, 0xdc, + 0x73, 0x5d, 0xbf, 0x3a, 0xd4, 0x5a, 0x01, 0x9c, 0x2e, 0x57, 0x83, 0xe2, + 0x6c, 0xe4, 0x67, 0xd8, 0xfe, 0xf5, 0xe2, 0x0d, 0xcb, 0xf7, 0x7a, 0x71, + 0x2e, 0xa7, 0x3c, 0xdf, 0xad, 0x72, 0x0c, 0xdb, 0xb7, 0x99, 0xf3, 0x72, + 0x5d, 0xa5, 0x7f, 0x92, 0x9a, 0x91, 0x53, 0x81, 0x63, 0x2b, 0x36, 0x10, + 0xe2, 0x7f, 0x60, 0x17, 0xe2, 0x23, 0x3e, 0xd6, 0x0e, 0x8f, 0x38, 0x49, + 0xb0, 0x2d, 0x8b, 0x76, 0x08, 0x65, 0x57, 0xdd, 0x1d, 0x96, 0xf4, 0x4c, + 0x62, 0xf3, 0x1c, 0x1a, 0xae, 0xc5, 0xec, 0xba, 0xd1, 0x83, 0x50, 0x5d, + 0x39, 0xcd, 0xe7, 0x96, 0x71, 0x77, 0xd6, 0x08, 0x57, 0x9a, 0x34, 0xb5, + 0xcf, 0xe6, 0x8a, 0x8d, 0x05, 0xb8, 0x3b, 0x6b, 0x29, 0xbc, 0x8b, 0x48, + 0xc2, 0x08, 0xcc, 0x7d, 0xc1, 0xf4, 0x85, 0xa8, 0xc9, 0x9d, 0x51, 0x94, + 0x50, 0xbf, 0xa5, 0x8e, 0x58, 0x53, 0xe1, 0xee, 0xf5, 0x19, 0xe0, 0x3b, + 0x3c, 0xd5, 0xc0, 0x3d, 0x76, 0x07, 0xe1, 0x6f, 0x35, 0x68, 0x9c, 0x72, + 0xa9, 0x5f, 0x1f, 0xe2, 0x5e, 0x5f, 0x4f, 0x41, 0x5b, 0xb2, 0xd3, 0x66, + 0xf1, 0x24, 0x0a, 0x9e, 0x8d, 0x86, 0x72, 0x45, 0x6a, 0x7d, 0xec, 0xb6, + 0x71, 0x64, 0x10, 0x23, 0xaa, 0x36, 0xee, 0xf5, 0x63, 0x84, 0xa7, 0x96, + 0x08, 0x4f, 0x2d, 0xe1, 0xce, 0x7d, 0x90, 0x25, 0xda, 0xe9, 0x0c, 0x69, + 0xf7, 0xfa, 0x31, 0x00, 0x16, 0x9f, 0x6e, 0x67, 0x20, 0xae, 0x48, 0x3d, + 0xe7, 0x04, 0x7e, 0x93, 0x0f, 0xfe, 0x2f, 0x35, 0xe6, 0x4e, 0x97, 0xa9, + 0x8e, 0xed, 0x01, 0x60, 0xea, 0xda, 0x1e, 0xc8, 0xb0, 0x6e, 0xdf, 0x38, + 0x9d, 0x6c, 0x5d, 0x4a, 0xd9, 0x37, 0x29, 0xdc, 0x5c, 0xb1, 0x0e, 0x30, + 0x77, 0x1a, 0xa6, 0xae, 0xed, 0x86, 0x69, 0xf5, 0xde, 0x25, 0xed, 0x9e, + 0xfb, 0x7b, 0x58, 0xf2, 0x70, 0x3b, 0xbe, 0x9a, 0xa0, 0x8e, 0x44, 0x96, + 0xc0, 0xd5, 0xfd, 0x4a, 0xeb, 0xdd, 0xaf, 0x7f, 0xa2, 0xb2, 0x7d, 0xe8, + 0xfd, 0xfa, 0x9f, 0x9a, 0xde, 0xc9, 0xe6, 0xc0, 0x5a, 0x12, 0x38, 0x03, + 0xfc, 0x07, 0xe0, 0x03, 0xb9, 0xf0, 0x4f, 0x01, 0xab, 0xc0, 0xd7, 0xae, + 0x30, 0xfd, 0x83, 0x64, 0xd7, 0xa7, 0x81, 0x68, 0xe5, 0xa1, 0x59, 0x67, + 0x80, 0x2d, 0x7a, 0xfd, 0x39, 0x60, 0x8f, 0xb6, 0x33, 0xa0, 0xbc, 0x45, + 0xf4, 0xf9, 0x1c, 0xa2, 0xed, 0xa3, 0x15, 0x05, 0xa7, 0x82, 0x0c, 0x54, + 0x15, 0xf9, 0x34, 0x01, 0xcb, 0x71, 0x59, 0xd4, 0x76, 0x7e, 0xe4, 0x43, + 0x13, 0xfc, 0xa6, 0xaf, 0x28, 0x3f, 0x8e, 0x02, 0x12, 0xa4, 0x71, 0x40, + 0x2f, 0x9b, 0x84, 0x51, 0x2d, 0xb7, 0xdd, 0xfd, 0xbc, 0xe7, 0x3a, 0x1e, + 0x8b, 0xda, 0x17, 0x84, 0xa0, 0x41, 0x55, 0xca, 0x1b, 0x8c, 0xd7, 0xea, + 0x34, 0xbb, 0x00, 0x59, 0x00, 0x3e, 0xcd, 0x2e, 0x80, 0x97, 0xd7, 0x05, + 0xd0, 0x72, 0x1d, 0x0f, 0x72, 0xf9, 0xe8, 0x95, 0xeb, 0x74, 0xfb, 0x46, + 0xa7, 0x67, 0xe0, 0x5f, 0x61, 0xe4, 0x13, 0xc7, 0x60, 0xdb, 0xf9, 0x72, + 0xc0, 0xae, 0x9a, 0xa7, 0xae, 0xb1, 0x88, 0x14, 0xd2, 0x05, 0xa4, 0x79, + 0x19, 0x0a, 0xc7, 0xda, 0x40, 0xc6, 0xb6, 0x37, 0x4e, 0xfe, 0x92, 0xeb, + 0xf2, 0x35, 0x00, 0xae, 0x05, 0x50, 0xbd, 0x01, 0x82, 0x17, 0x34, 0x98, + 0xe5, 0x77, 0x94, 0xdd, 0xf6, 0x33, 0xeb, 0x3c, 0x73, 0x55, 0xbb, 0xcf, + 0x45, 0x79, 0xe7, 0x14, 0x27, 0x2e, 0xc1, 0x07, 0x3f, 0x78, 0x3b, 0xf6, + 0x0d, 0xe0, 0xb8, 0xf0, 0xe8, 0x1f, 0xce, 0xd1, 0x2e, 0xcd, 0xf5, 0xf7, + 0x79, 0x02, 0xf3, 0x9d, 0x77, 0x01, 0x70, 0xf7, 0x2f, 0x4f, 0x51, 0xfb, + 0x25, 0x38, 0xfa, 0x47, 0x73, 0x40, 0xff, 0x84, 0x6a, 0x80, 0xb9, 0x64, + 0x8a, 0x8f, 0x7e, 0xe8, 0x00, 0xfe, 0x05, 0xb8, 0xf7, 0xfd, 0xb0, 0x78, + 0x32, 0xe4, 0xc4, 0xa7, 0xee, 0x42, 0xb6, 0x54, 0x5d, 0x28, 0x2a, 0xe5, + 0x81, 0xf6, 0x61, 0x04, 0x77, 0xdc, 0x0c, 0xfe, 0x05, 0x65, 0x3f, 0x48, + 0xa2, 0x7e, 0x27, 0x73, 0x09, 0x7c, 0x6e, 0xfe, 0xd3, 0x80, 0x7a, 0x6c, + 0xd8, 0xaf, 0xed, 0x0d, 0xe4, 0x6b, 0xee, 0x64, 0xc2, 0x43, 0xff, 0xc7, + 0xff, 0x0d, 0xc0, 0xb1, 0x3f, 0x53, 0x40, 0xac, 0x03, 0xbf, 0x70, 0x00, + 0x4f, 0x5f, 0x0a, 0x0f, 0x3f, 0x72, 0x0c, 0xd9, 0x78, 0x0c, 0x56, 0x24, + 0xed, 0xf7, 0x08, 0x1a, 0xa7, 0x55, 0xdd, 0x39, 0x57, 0x3f, 0x44, 0xe3, + 0xb4, 0x64, 0xb2, 0x7c, 0x27, 0xb5, 0xea, 0x7e, 0x6a, 0x55, 0xf0, 0xbc, + 0x32, 0x8b, 0x4b, 0x3e, 0xf3, 0xc9, 0xc7, 0x38, 0xf8, 0x58, 0x8d, 0xf0, + 0x53, 0x31, 0x63, 0x57, 0xcf, 0xf3, 0xc0, 0x53, 0x01, 0x93, 0x37, 0xdd, + 0x41, 0x72, 0x29, 0xe1, 0x83, 0x1f, 0xbc, 0x9d, 0xe0, 0x02, 0x38, 0xba, + 0x0d, 0xdb, 0x38, 0xdd, 0xa0, 0x79, 0x69, 0x19, 0x5b, 0x08, 0x62, 0x29, + 0x99, 0x7f, 0xf6, 0x18, 0x78, 0x30, 0xd7, 0x7a, 0x92, 0xb1, 0xd2, 0x01, + 0xfc, 0xa7, 0xc7, 0x39, 0xf8, 0xde, 0x49, 0xc2, 0x08, 0xc2, 0xd5, 0x1a, + 0x56, 0x53, 0x43, 0xac, 0xa4, 0x44, 0x76, 0xc0, 0x7b, 0x5e, 0x32, 0xa9, + 0x9f, 0xc1, 0xe2, 0x35, 0xa8, 0xfd, 0xf4, 0x7e, 0xc6, 0xc7, 0xf6, 0xe3, + 0x8c, 0xa8, 0x7e, 0xba, 0xb9, 0xe3, 0xf3, 0x7d, 0xe7, 0x33, 0x2f, 0xb7, + 0xe2, 0xd0, 0x6c, 0x2d, 0xea, 0xe7, 0x37, 0x3d, 0x06, 0xa1, 0x25, 0x3b, + 0xba, 0xdf, 0xaf, 0x64, 0x23, 0x65, 0x8c, 0xfa, 0xe5, 0x59, 0x5d, 0xcf, + 0x76, 0x89, 0xdc, 0xa8, 0x4f, 0xbe, 0x17, 0xa7, 0xba, 0x49, 0x95, 0x62, + 0x1c, 0x31, 0x4e, 0xd4, 0x6a, 0x62, 0x09, 0xd5, 0xdf, 0x9d, 0xc8, 0x48, + 0x03, 0xb5, 0x5c, 0x12, 0xdd, 0x78, 0x0d, 0x02, 0x05, 0xb5, 0x4c, 0x21, + 0x5b, 0x9d, 0x36, 0x92, 0x36, 0x82, 0x72, 0xba, 0x4c, 0x64, 0x06, 0x88, + 0x11, 0x22, 0xbb, 0x5f, 0x5e, 0xb9, 0xbe, 0x73, 0xb0, 0xac, 0xf5, 0x34, + 0x0c, 0xa4, 0x95, 0x97, 0x5b, 0x19, 0xde, 0x0e, 0xdf, 0x3e, 0x5a, 0x21, + 0x0e, 0x92, 0x94, 0x0f, 0x60, 0x54, 0x65, 0x00, 0x5c, 0x6b, 0x22, 0xb3, + 0x09, 0x16, 0x14, 0x18, 0x2b, 0x08, 0x54, 0x5f, 0x99, 0xf9, 0x5b, 0xc8, + 0x45, 0x5a, 0x58, 0x50, 0x8e, 0xf2, 0x7d, 0x69, 0x79, 0x80, 0x96, 0x81, + 0x6b, 0x19, 0x1f, 0xe9, 0x7e, 0x34, 0x4f, 0x2b, 0x4d, 0x4c, 0xdb, 0xea, + 0xf5, 0x20, 0x50, 0xd0, 0xad, 0x85, 0x40, 0x81, 0xae, 0x16, 0x82, 0x0c, + 0xd2, 0x55, 0x9d, 0xc8, 0xf2, 0x67, 0xd6, 0x67, 0x67, 0x4c, 0x99, 0xb2, + 0xcc, 0xcd, 0x54, 0x21, 0xe8, 0xc9, 0x6f, 0x5e, 0xf9, 0x60, 0x03, 0xd4, + 0x32, 0xb6, 0xd5, 0xde, 0xfd, 0x7a, 0x5b, 0x01, 0xb1, 0x50, 0x50, 0x85, + 0x41, 0x3e, 0x17, 0x72, 0x1b, 0xd3, 0x50, 0xa5, 0xca, 0x02, 0x41, 0x0a, + 0xff, 0xda, 0x38, 0x27, 0x4a, 0x3f, 0xff, 0x27, 0xf0, 0xe7, 0xef, 0xeb, + 0xb7, 0x9c, 0x9d, 0x85, 0x9f, 0xda, 0xa8, 0xdf, 0x2c, 0x5f, 0x37, 0xe7, + 0x3f, 0xea, 0xa3, 0x97, 0x83, 0x60, 0x58, 0x57, 0xa2, 0x61, 0x60, 0xad, + 0xfc, 0xfe, 0xbc, 0x84, 0x10, 0xe9, 0x78, 0x2a, 0xe4, 0x60, 0xc3, 0x7a, + 0x2c, 0xa3, 0xcb, 0x97, 0x01, 0x6b, 0xe5, 0xd7, 0xf3, 0x4b, 0xe8, 0x0e, + 0xd3, 0xdb, 0x03, 0xf3, 0x93, 0xef, 0xa3, 0x2a, 0x89, 0x7e, 0x88, 0xd7, + 0x66, 0x34, 0xe0, 0x12, 0x4c, 0x3f, 0x54, 0x04, 0x50, 0x6a, 0x63, 0x89, + 0x32, 0x49, 0xab, 0x4d, 0xb8, 0x16, 0x71, 0xef, 0x9f, 0x3f, 0x06, 0x28, + 0xb0, 0xd6, 0xd1, 0x95, 0x90, 0x5d, 0xa3, 0x8e, 0x02, 0x6a, 0x69, 0x59, + 0xb7, 0x1e, 0x64, 0x5c, 0xef, 0x07, 0x38, 0xba, 0x12, 0xf2, 0xc4, 0x27, + 0x1e, 0x4a, 0xf7, 0x1f, 0xd5, 0xe0, 0x46, 0xeb, 0xf7, 0x8f, 0x0e, 0xcd, + 0x92, 0xd8, 0x29, 0x90, 0x91, 0x64, 0xac, 0x02, 0x4b, 0x1d, 0xba, 0x3e, + 0x76, 0x52, 0x47, 0xc1, 0xb5, 0xd4, 0x23, 0x89, 0xe8, 0x02, 0x67, 0x2d, + 0xe9, 0x71, 0x1a, 0x21, 0x04, 0xf5, 0x8a, 0x64, 0x69, 0x4d, 0xfb, 0x93, + 0x19, 0x48, 0x0b, 0x32, 0x30, 0x57, 0x16, 0x00, 0xa1, 0xcc, 0xc0, 0x56, + 0x49, 0x47, 0xdd, 0x19, 0xdc, 0x52, 0x99, 0x7b, 0x1f, 0xb0, 0x38, 0x74, + 0xaf, 0xaa, 0x9b, 0xf7, 0x94, 0xe0, 0x70, 0x47, 0xb0, 0x07, 0xc9, 0x72, + 0x47, 0xa1, 0x1a, 0x8f, 0x74, 0x54, 0x3c, 0x0b, 0x1d, 0xbf, 0xa3, 0xd6, + 0x8f, 0x95, 0x54, 0x5e, 0x5d, 0x60, 0x0e, 0x05, 0xd9, 0x9a, 0x2f, 0x81, + 0xa7, 0x21, 0x89, 0x87, 0xf4, 0x47, 0x8d, 0x3e, 0x2d, 0xb2, 0x74, 0x8d, + 0xde, 0x25, 0x25, 0x9f, 0x13, 0x02, 0xd3, 0x63, 0x76, 0xa8, 0xd3, 0x06, + 0xca, 0x3c, 0x56, 0x32, 0xdb, 0x19, 0x28, 0xeb, 0x48, 0x09, 0x0e, 0x77, + 0xe0, 0xd3, 0x42, 0x70, 0xb8, 0xa3, 0x5a, 0x52, 0x0f, 0x95, 0x2c, 0x0e, + 0x57, 0x24, 0x1f, 0xfb, 0x15, 0x87, 0x43, 0xbf, 0x1e, 0x91, 0x68, 0x50, + 0x96, 0x01, 0x71, 0xc5, 0x3a, 0xef, 0x7b, 0x4a, 0xa4, 0x40, 0xaf, 0x65, + 0xe0, 0x0e, 0x9d, 0x5e, 0x53, 0xdb, 0x03, 0xdc, 0xaf, 0xf7, 0xf7, 0xc6, + 0x05, 0x38, 0x72, 0x9f, 0xcb, 0x5d, 0xf7, 0xaa, 0x36, 0xe1, 0x9e, 0x0e, + 0x9c, 0x15, 0xb0, 0x4b, 0xc3, 0xb6, 0x9e, 0x20, 0xf3, 0xbd, 0xde, 0x38, + 0xd7, 0x0f, 0xef, 0xfc, 0xe7, 0x5c, 0x93, 0x28, 0x58, 0x53, 0x2f, 0xa0, + 0xc9, 0xc0, 0x9f, 0x0c, 0xcc, 0x69, 0x8b, 0xab, 0x10, 0xe0, 0x06, 0xec, + 0x64, 0x00, 0x57, 0x06, 0x02, 0x75, 0xd5, 0x5b, 0xb6, 0xa4, 0x80, 0x29, + 0xa0, 0x2b, 0x2c, 0xef, 0x37, 0x1f, 0xcf, 0x6c, 0xe7, 0x81, 0x51, 0x79, + 0xdf, 0x90, 0x01, 0xa4, 0x7a, 0xd3, 0x37, 0xfe, 0x8c, 0x5e, 0x79, 0xe5, + 0x15, 0x26, 0x27, 0xd5, 0x3b, 0x0a, 0x2b, 0x2f, 0x9d, 0x4c, 0xf7, 0x0f, + 0x82, 0x66, 0x5d, 0xc5, 0xab, 0xec, 0xdc, 0xbb, 0x8f, 0x8b, 0x17, 0x2f, + 0x76, 0xf9, 0x9e, 0xdc, 0xbb, 0x8d, 0x8b, 0x17, 0x2f, 0xa6, 0x30, 0xac, + 0x41, 0x3e, 0xf3, 0xc7, 0xc4, 0xe4, 0xd3, 0x94, 0x75, 0x8b, 0x7b, 0x15, + 0xdb, 0xb6, 0x6d, 0x03, 0x14, 0xd0, 0xcb, 0xf8, 0x35, 0xe5, 0xc8, 0xc7, + 0xef, 0xd5, 0x35, 0xae, 0x2a, 0x5b, 0x1e, 0xe6, 0x65, 0xca, 0x6e, 0xf2, + 0x30, 0x9f, 0xdb, 0x37, 0xb9, 0x77, 0x5b, 0x57, 0xd9, 0x01, 0x7e, 0xf8, + 0x5f, 0xfd, 0xf8, 0x90, 0x33, 0xad, 0xea, 0x70, 0xb9, 0xb5, 0x8c, 0x25, + 0x2c, 0x6a, 0xe6, 0xfd, 0x89, 0x24, 0xa4, 0xbe, 0xaf, 0xce, 0xd2, 0x89, + 0x45, 0x6c, 0x20, 0xd1, 0x5f, 0xd7, 0x92, 0x89, 0xc4, 0x4f, 0x54, 0xcb, + 0x26, 0xd4, 0xfd, 0x72, 0xf1, 0x1a, 0x08, 0xda, 0x58, 0x95, 0x2a, 0x82, + 0x36, 0xde, 0xd6, 0x2a, 0x00, 0xb5, 0xeb, 0x55, 0x9b, 0x2c, 0x0e, 0x7c, + 0x6a, 0x37, 0xd6, 0x58, 0x7c, 0xb1, 0x81, 0xd8, 0xa2, 0xc6, 0xdd, 0x2c, + 0xcb, 0xc5, 0x3f, 0x1f, 0x12, 0xaf, 0x85, 0x84, 0x61, 0x88, 0x77, 0xb5, + 0xc7, 0xf8, 0x2d, 0xe3, 0xa8, 0xab, 0x34, 0xa2, 0x2d, 0xdb, 0x08, 0x04, + 0x12, 0x89, 0x7f, 0xca, 0xc7, 0xbb, 0xbe, 0x8e, 0x18, 0x81, 0xc5, 0xe3, + 0x73, 0x4c, 0xde, 0x36, 0x45, 0x92, 0x44, 0x88, 0x8e, 0x6a, 0xdb, 0x8a, + 0x11, 0x2b, 0x1b, 0x4a, 0x68, 0x25, 0x34, 0x9e, 0x6f, 0x52, 0xbf, 0x79, + 0x0c, 0xa9, 0xdf, 0x5d, 0x18, 0xc0, 0x4b, 0x23, 0x59, 0x8d, 0xa8, 0xd5, + 0xd5, 0x73, 0xa1, 0xcc, 0x7d, 0x8c, 0x2b, 0x01, 0x38, 0xe3, 0x33, 0x79, + 0xcb, 0x54, 0x5f, 0x9c, 0xa5, 0x53, 0x99, 0xdd, 0x93, 0x2f, 0x36, 0x19, + 0xaf, 0xba, 0xc4, 0x49, 0x76, 0x0d, 0x39, 0xba, 0x2f, 0x23, 0x09, 0x42, + 0x1a, 0x41, 0xc8, 0xd8, 0xa8, 0x05, 0x5b, 0x6b, 0x20, 0x24, 0x76, 0xc9, + 0x25, 0xee, 0x84, 0xe9, 0x77, 0xee, 0xba, 0x80, 0x5a, 0xe4, 0x02, 0x84, + 0xec, 0x86, 0x6b, 0x69, 0x80, 0x56, 0x19, 0x88, 0x2e, 0xf8, 0x58, 0x15, + 0x81, 0x65, 0x9b, 0xce, 0xd5, 0x32, 0x54, 0xa0, 0xdc, 0xc9, 0xb5, 0xd9, + 0x4a, 0x62, 0x68, 0x5f, 0xca, 0x0d, 0x6f, 0x7b, 0x5b, 0xba, 0xde, 0x0b, + 0xd0, 0x7a, 0xf5, 0x6b, 0x5f, 0xe9, 0xdb, 0x36, 0x00, 0xa9, 0xaf, 0xac, + 0x24, 0xfc, 0xe4, 0x4e, 0x8b, 0x57, 0xbf, 0xf6, 0x95, 0x14, 0xa8, 0x95, + 0x57, 0x2f, 0x6c, 0x2b, 0x2f, 0x13, 0xaf, 0x57, 0xbd, 0x90, 0xa9, 0xde, + 0xed, 0xda, 0x9e, 0x1f, 0x63, 0xe9, 0x8b, 0x2f, 0x03, 0x0a, 0x9a, 0xf5, + 0x33, 0x37, 0xee, 0xe7, 0xcb, 0xe7, 0x2e, 0xf0, 0x33, 0x37, 0xaa, 0x81, + 0x93, 0x3c, 0x50, 0xeb, 0x67, 0x6e, 0xdc, 0x9f, 0x02, 0xae, 0x7e, 0xf7, + 0xe3, 0xff, 0xa1, 0x2b, 0x9d, 0xb7, 0x5f, 0x47, 0x6a, 0xdf, 0x9b, 0x86, + 0xd1, 0x97, 0xcf, 0x5d, 0xe0, 0xe9, 0xff, 0xf4, 0xb9, 0x14, 0xca, 0x95, + 0x07, 0x74, 0xf5, 0xe6, 0x6f, 0x18, 0x74, 0x6c, 0xd4, 0xd9, 0xd1, 0x07, + 0x14, 0xcb, 0x2b, 0x0f, 0x07, 0xeb, 0x3d, 0x46, 0x7d, 0x9a, 0x46, 0x35, + 0x00, 0xa7, 0xcd, 0x5f, 0x35, 0x17, 0x1e, 0xa8, 0xf5, 0xa0, 0xca, 0x0d, + 0x6f, 0xab, 0xd2, 0xe0, 0x1b, 0xeb, 0xfb, 0x2a, 0x54, 0xa8, 0x50, 0xa1, + 0x42, 0x85, 0x0a, 0x15, 0x2a, 0x54, 0xa8, 0x50, 0xa1, 0x42, 0x85, 0x0a, + 0x15, 0x2a, 0x54, 0xa8, 0x50, 0xa1, 0x42, 0x85, 0x0a, 0x15, 0x2a, 0x54, + 0xa8, 0x50, 0xa1, 0x42, 0x43, 0x55, 0x40, 0xb5, 0x0a, 0x15, 0x2a, 0x54, + 0xa8, 0x50, 0xa1, 0xef, 0x95, 0x8e, 0xdb, 0xf0, 0x1e, 0xfd, 0xca, 0x6b, + 0x49, 0x12, 0x46, 0x52, 0x01, 0xb2, 0x86, 0xc0, 0x77, 0xf2, 0x40, 0x2d, + 0x00, 0x3a, 0x92, 0x5a, 0xd5, 0x23, 0x8a, 0x62, 0xc2, 0xb5, 0x28, 0x07, + 0x79, 0xc8, 0x5e, 0xcd, 0x93, 0x51, 0x42, 0x92, 0xc4, 0x58, 0x96, 0xad, + 0xfc, 0x4a, 0x88, 0x65, 0xac, 0x00, 0x24, 0xb9, 0x97, 0xc5, 0x0d, 0x48, + 0xab, 0x57, 0xe6, 0x8b, 0xce, 0x9e, 0xb0, 0x10, 0x23, 0x36, 0x72, 0x2d, + 0x26, 0x69, 0x25, 0x24, 0xad, 0x04, 0xb9, 0x16, 0x23, 0x46, 0xdc, 0x0c, + 0xcb, 0xa3, 0xd3, 0x4f, 0x92, 0x10, 0xc7, 0xf1, 0x32, 0xc0, 0x8d, 0x96, + 0xad, 0x27, 0xf2, 0x48, 0x29, 0x89, 0x93, 0xb8, 0x0f, 0xe7, 0xd3, 0x05, + 0xad, 0xea, 0x48, 0x05, 0x04, 0xeb, 0x40, 0x74, 0x29, 0xc2, 0xd9, 0xea, + 0x20, 0x3b, 0xaa, 0x6c, 0xa2, 0x44, 0x3a, 0xa1, 0x35, 0x0a, 0xc2, 0xb4, + 0xc8, 0xde, 0x4e, 0xf5, 0x32, 0xa4, 0x67, 0x59, 0xb8, 0xae, 0x7a, 0xc1, + 0x30, 0xbc, 0x14, 0x62, 0x59, 0x16, 0xcd, 0x33, 0x0d, 0xc2, 0x4b, 0xe1, + 0x10, 0x84, 0x10, 0x7d, 0x40, 0x2d, 0x00, 0x6f, 0xbb, 0x47, 0x28, 0x42, + 0x9a, 0x2b, 0xcd, 0xb4, 0x5c, 0x97, 0xa5, 0xe3, 0x19, 0xe4, 0x25, 0x39, + 0x2d, 0x61, 0x22, 0xdb, 0x55, 0x1f, 0x75, 0x69, 0x10, 0x2b, 0x98, 0xd6, + 0x9b, 0xcb, 0xa4, 0xe7, 0x4c, 0x9f, 0x13, 0xd7, 0x6f, 0x13, 0x5a, 0x40, + 0x4b, 0x2a, 0xc0, 0x16, 0x60, 0xb5, 0x20, 0x71, 0x14, 0x80, 0x4b, 0x44, + 0x20, 0x2b, 0x74, 0xc1, 0xac, 0xda, 0x25, 0x06, 0x4e, 0x32, 0xdb, 0x8c, + 0xe2, 0x44, 0x76, 0x4f, 0x14, 0xe8, 0xdd, 0xa7, 0x65, 0xf7, 0x80, 0x0a, + 0xe2, 0x16, 0x57, 0x04, 0xd4, 0xb2, 0x2d, 0x41, 0xbc, 0x76, 0x65, 0x30, + 0x2e, 0x60, 0xc3, 0xbc, 0xda, 0x96, 0xc0, 0x5f, 0x4d, 0x00, 0xf5, 0x05, + 0xd7, 0x8d, 0xd2, 0xd9, 0x10, 0xa8, 0xb5, 0x81, 0x92, 0xd3, 0x39, 0x60, + 0x5d, 0xee, 0xba, 0x36, 0xd7, 0xf3, 0xa0, 0x25, 0xd0, 0xb5, 0xbe, 0x9e, + 0xa4, 0x5c, 0x7f, 0x2a, 0x56, 0x7e, 0xbf, 0x10, 0x4e, 0xba, 0x6d, 0xc0, + 0x61, 0x56, 0xc5, 0x22, 0x69, 0x65, 0xe9, 0x98, 0x89, 0x0f, 0xbd, 0x13, + 0x4e, 0xda, 0xb2, 0x8d, 0x94, 0x12, 0xdb, 0x1a, 0x0e, 0x28, 0xea, 0x4e, + 0x57, 0xa6, 0xf1, 0xca, 0xe2, 0x32, 0x26, 0xb0, 0xf5, 0xd4, 0x0d, 0xa9, + 0xbf, 0x8e, 0xec, 0x9a, 0x94, 0xa1, 0xc0, 0x7e, 0x12, 0xd7, 0xc9, 0xc1, + 0x2a, 0x72, 0xfb, 0xbb, 0x00, 0x5b, 0x9d, 0x9e, 0xe5, 0x06, 0x32, 0x20, + 0xad, 0x5e, 0xa0, 0x56, 0x7a, 0x6c, 0x72, 0x79, 0x51, 0xe5, 0xcc, 0x9d, + 0x5f, 0xad, 0xfc, 0x75, 0x2d, 0xa5, 0x24, 0x5e, 0xeb, 0x9f, 0xe4, 0x67, + 0x8f, 0xd8, 0x5d, 0xe1, 0x06, 0xfe, 0xb4, 0x59, 0xfb, 0x2b, 0x89, 0xf3, + 0x83, 0x6e, 0x7f, 0x25, 0xbe, 0x7b, 0xc3, 0xcc, 0xb6, 0x3d, 0x62, 0x23, + 0xa5, 0x24, 0xd2, 0x13, 0xa6, 0xa2, 0xb5, 0x64, 0xe0, 0xa4, 0x27, 0x03, + 0x90, 0xcb, 0xef, 0xcb, 0x5f, 0xd7, 0x97, 0x4e, 0xb7, 0xa8, 0xfd, 0xcc, + 0x8f, 0xf6, 0xc5, 0x5b, 0x4f, 0x0b, 0x0b, 0x0b, 0x54, 0xab, 0xd3, 0xe9, + 0xa4, 0x3e, 0x80, 0x8f, 0xcd, 0x2e, 0xf4, 0xd9, 0xe5, 0xc3, 0xa6, 0xa7, + 0xa7, 0xd7, 0x8d, 0xdf, 0xab, 0xe3, 0x8f, 0x3c, 0x32, 0x30, 0xfc, 0x1c, + 0xc0, 0x23, 0x8f, 0xb0, 0xe3, 0x93, 0x9f, 0xe4, 0xfc, 0xb9, 0x73, 0x6f, + 0x38, 0xfc, 0xea, 0xf7, 0x80, 0xab, 0x77, 0x6c, 0xf0, 0x22, 0xf8, 0x0f, + 0x90, 0x2e, 0x9d, 0x6e, 0x01, 0x3f, 0x02, 0x40, 0xd2, 0xb2, 0xc9, 0xa6, + 0x23, 0x29, 0x90, 0x68, 0xb3, 0x7f, 0x00, 0x00, 0x20, 0x00, 0x49, 0x44, + 0x41, 0x54, 0x7d, 0xfa, 0x4f, 0x3f, 0xcb, 0xa1, 0x93, 0x20, 0x1f, 0x7c, + 0x37, 0xa0, 0xa0, 0x58, 0x9f, 0xfe, 0xd3, 0xcf, 0x72, 0xe8, 0xf6, 0x77, + 0x6f, 0x3a, 0x8d, 0xbb, 0xf7, 0xaa, 0x49, 0xa7, 0x47, 0x5f, 0x8a, 0x38, + 0x30, 0x0a, 0x51, 0xa5, 0x9c, 0xb6, 0xb1, 0x2c, 0xcb, 0x26, 0x5a, 0xf5, + 0xd3, 0x29, 0xb3, 0xb6, 0x0e, 0x17, 0x15, 0x41, 0xb8, 0x9a, 0xd5, 0xef, + 0xe5, 0x8a, 0xc0, 0xd2, 0xfb, 0xc2, 0x28, 0x4a, 0x5b, 0x7b, 0xae, 0xf5, + 0x4f, 0xcb, 0x5e, 0x00, 0xb2, 0xd5, 0x53, 0x67, 0xb0, 0x39, 0x25, 0x2d, + 0x1b, 0x44, 0x92, 0xad, 0x0f, 0x88, 0x79, 0xfb, 0x27, 0x0e, 0xf3, 0x24, + 0xc0, 0xa9, 0x65, 0x1e, 0x7d, 0x71, 0x91, 0x74, 0x16, 0xa4, 0xeb, 0xa8, + 0xbf, 0x7a, 0x1d, 0x1a, 0x0d, 0xc8, 0xdd, 0x57, 0x39, 0x73, 0x79, 0x13, + 0x9e, 0xc3, 0x55, 0xd5, 0xa6, 0xbc, 0xfb, 0xb7, 0xfb, 0xdb, 0xfc, 0x77, + 0xdf, 0xac, 0x96, 0x4b, 0x93, 0xdf, 0x5e, 0xdb, 0xe4, 0xc8, 0x97, 0xe6, + 0x53, 0xf8, 0xd4, 0xa1, 0xe3, 0x73, 0xfd, 0x06, 0xfb, 0x27, 0x61, 0xff, + 0x24, 0xc9, 0x89, 0x79, 0x58, 0xf5, 0x61, 0xaf, 0x0d, 0x2f, 0x6d, 0x0e, + 0x20, 0xfb, 0x5d, 0xd7, 0x57, 0xe7, 0x37, 0x2c, 0x07, 0x1f, 0x79, 0xa8, + 0x2b, 0x38, 0x69, 0xd9, 0x50, 0xd1, 0xe7, 0x3a, 0x77, 0xbf, 0x2e, 0x0b, + 0x91, 0x03, 0x6a, 0x19, 0xe9, 0x09, 0xf0, 0x4e, 0x76, 0x8f, 0x97, 0xed, + 0xec, 0xf8, 0x97, 0xb7, 0xf6, 0x27, 0x2b, 0xb6, 0x67, 0x13, 0xc9, 0xdb, + 0x1d, 0x0d, 0x63, 0x18, 0x34, 0x63, 0x0b, 0x28, 0x6f, 0x57, 0xcf, 0x34, + 0x7d, 0x40, 0x3e, 0x2b, 0xe9, 0x62, 0xc9, 0x99, 0x67, 0xc0, 0x5e, 0x88, + 0x95, 0xca, 0xdb, 0x60, 0xdf, 0x83, 0x6c, 0x87, 0x69, 0x98, 0xed, 0x06, + 0xfc, 0xd6, 0x3e, 0xdb, 0x41, 0x6d, 0xd7, 0x14, 0x1a, 0x86, 0xaa, 0x23, + 0xcb, 0xdb, 0xf5, 0x24, 0xb7, 0x9e, 0x63, 0x32, 0xe8, 0x18, 0x89, 0xed, + 0x0e, 0xbc, 0x48, 0x17, 0x0b, 0xc1, 0x1c, 0x73, 0xe1, 0xd8, 0x5d, 0xe7, + 0x22, 0x3d, 0x47, 0x5b, 0x05, 0xac, 0xa8, 0xd5, 0xfc, 0xfd, 0xfa, 0xe5, + 0xd6, 0x25, 0x26, 0x7f, 0xb4, 0xb6, 0xf9, 0x02, 0x15, 0xfa, 0x81, 0xd2, + 0xcb, 0xad, 0x4b, 0xe6, 0x76, 0xdd, 0x75, 0xbf, 0xae, 0xed, 0x0c, 0x09, + 0x57, 0x9a, 0x88, 0x8f, 0x34, 0xf0, 0xf6, 0xd6, 0xb1, 0x34, 0x18, 0x25, + 0x69, 0xb5, 0x49, 0x5a, 0x31, 0x84, 0xea, 0x77, 0x53, 0x16, 0x0a, 0xa4, + 0x35, 0x76, 0xab, 0x4b, 0xe3, 0xb9, 0x90, 0x5d, 0xfb, 0x3c, 0x08, 0x25, + 0xb1, 0x06, 0x7e, 0x7b, 0xd5, 0x1a, 0x62, 0x0b, 0xd4, 0xae, 0xad, 0xd1, + 0x3c, 0xdd, 0x24, 0x5c, 0x69, 0x52, 0xdb, 0x59, 0xa7, 0x76, 0xad, 0x82, + 0xb6, 0x4c, 0xde, 0x20, 0xf8, 0xdc, 0xb3, 0x6a, 0xf2, 0xa7, 0x8b, 0xab, + 0xa0, 0xdf, 0xc0, 0xbb, 0xde, 0xeb, 0xf2, 0xb9, 0xa7, 0x42, 0xea, 0xb7, + 0x28, 0xc0, 0x8d, 0x7f, 0x41, 0xf5, 0x1f, 0xd4, 0x6a, 0xd9, 0x6f, 0xd1, + 0x75, 0x2c, 0x96, 0x0f, 0x3c, 0x0e, 0x40, 0xfd, 0x7a, 0xb5, 0xed, 0xb8, + 0x6a, 0xe2, 0x6a, 0x14, 0xfa, 0xb0, 0x2a, 0x89, 0x42, 0x3f, 0x0d, 0x9b, + 0xba, 0xc3, 0x63, 0xf9, 0x38, 0x30, 0x2a, 0x90, 0x9d, 0xb6, 0xb2, 0x09, + 0x7d, 0xea, 0xf5, 0x1a, 0xf5, 0x7a, 0x8d, 0x28, 0xf4, 0x59, 0x9e, 0x7a, + 0x34, 0x05, 0x77, 0x19, 0x7f, 0xc1, 0x92, 0x82, 0x0c, 0x3a, 0xd2, 0xeb, + 0xf2, 0xe7, 0xec, 0x53, 0x79, 0x31, 0x20, 0xad, 0x47, 0xff, 0xb0, 0xc9, + 0x7d, 0xcf, 0x24, 0xd4, 0x6f, 0xad, 0x13, 0x9d, 0xf4, 0x71, 0xf6, 0x79, + 0x34, 0x9e, 0x6d, 0xe0, 0x3a, 0x16, 0x77, 0xdc, 0xe1, 0x71, 0xf4, 0xb7, + 0x1a, 0xd4, 0x6f, 0xad, 0xb3, 0xe7, 0x5a, 0x98, 0x3b, 0x0e, 0x8c, 0xa2, + 0x28, 0x4c, 0xa3, 0xd0, 0x78, 0x76, 0x09, 0x6b, 0xc4, 0x62, 0xea, 0xfd, + 0x1e, 0x4b, 0xcf, 0x34, 0x90, 0xe7, 0xeb, 0x84, 0x97, 0x7c, 0xa6, 0xde, + 0xef, 0xd1, 0xf8, 0x02, 0xe0, 0x48, 0x6a, 0xbb, 0x3d, 0x9e, 0xfc, 0x7d, + 0x55, 0x67, 0x87, 0x67, 0x96, 0x99, 0x7a, 0xff, 0x41, 0x1a, 0x27, 0x97, + 0x91, 0xab, 0xbb, 0x80, 0x26, 0x72, 0x02, 0x9a, 0x2f, 0x00, 0x56, 0x1b, + 0x92, 0x32, 0xf3, 0xa1, 0x4f, 0xf3, 0x85, 0x79, 0x6e, 0xb7, 0x72, 0xe7, + 0x57, 0xd7, 0xe1, 0xf9, 0xeb, 0xfa, 0xeb, 0x97, 0xf9, 0x9b, 0xf9, 0x7f, + 0x4e, 0xff, 0x03, 0x6f, 0x79, 0xf7, 0x9b, 0xfa, 0xc2, 0xfd, 0x8b, 0xdf, + 0xa2, 0xf5, 0xda, 0xb7, 0x36, 0xf4, 0xe7, 0x5f, 0xdc, 0xd8, 0xe6, 0x4a, + 0xe5, 0x5f, 0xfc, 0xd6, 0xc0, 0xbc, 0x01, 0x9c, 0x39, 0xbf, 0x71, 0xba, + 0x87, 0xee, 0xfc, 0x21, 0xce, 0x3e, 0xf6, 0x0f, 0x00, 0x9c, 0xd4, 0x61, + 0x61, 0xfc, 0x0f, 0xfc, 0x77, 0x3d, 0x76, 0x5f, 0x05, 0xbe, 0x08, 0xfc, + 0x3a, 0xf0, 0xc3, 0x3a, 0x2c, 0x00, 0xfe, 0x1a, 0xf8, 0x7f, 0xa1, 0xcf, + 0x7e, 0x33, 0xfa, 0x6f, 0x74, 0x43, 0xb4, 0xf2, 0x3a, 0xa3, 0x97, 0xaf, + 0xb7, 0xbe, 0x95, 0xfa, 0x36, 0x61, 0xff, 0x22, 0xb7, 0x34, 0xbd, 0x6b, + 0xf9, 0xeb, 0x3a, 0xff, 0xcc, 0x35, 0xbf, 0xd4, 0xd0, 0x16, 0x6a, 0x79, + 0xf0, 0x36, 0x80, 0x03, 0xb8, 0xe6, 0x9e, 0xa5, 0xa1, 0x54, 0x38, 0xc7, + 0xe0, 0x19, 0x78, 0x62, 0x49, 0xd9, 0xfa, 0xb9, 0x38, 0x46, 0x9e, 0x25, + 0x72, 0xfe, 0x06, 0xa9, 0x91, 0xb3, 0x85, 0xf9, 0x67, 0x8e, 0xf5, 0x85, + 0x0f, 0xb4, 0x05, 0xb0, 0x50, 0x40, 0x2e, 0xc0, 0x4f, 0xf2, 0xfb, 0x1b, + 0x03, 0xe2, 0x0c, 0x0a, 0xd3, 0x80, 0x87, 0xdb, 0xc0, 0xd5, 0x10, 0x2f, + 0x03, 0xdc, 0x8a, 0xe3, 0x06, 0xae, 0xd3, 0x50, 0xe5, 0x1b, 0x10, 0xaf, + 0x37, 0x7f, 0xcf, 0xec, 0xa5, 0x8b, 0xe2, 0x63, 0x60, 0x57, 0x16, 0xeb, + 0xf3, 0xe8, 0xba, 0x20, 0x5a, 0x66, 0xfd, 0x06, 0x52, 0x70, 0xd6, 0xc0, + 0x38, 0x1b, 0x84, 0x07, 0x80, 0xf5, 0x79, 0xed, 0xaf, 0xaa, 0xc2, 0xba, + 0x9e, 0xb9, 0xf2, 0x7d, 0x29, 0xd7, 0x1e, 0x66, 0xfc, 0xda, 0xcc, 0x47, + 0xe3, 0xe4, 0x22, 0x8f, 0x3e, 0xaa, 0x00, 0x46, 0x07, 0x6e, 0xbb, 0x9d, + 0xb1, 0x7d, 0x7b, 0xb0, 0x1d, 0x35, 0xc1, 0xfd, 0xd8, 0xb3, 0x73, 0x8c, + 0xbd, 0x5f, 0x81, 0x01, 0x1b, 0x67, 0x9a, 0xd4, 0x77, 0x67, 0xf5, 0x6c, + 0x18, 0x42, 0x7d, 0x77, 0x0d, 0xab, 0xaa, 0xe0, 0x22, 0x61, 0xe4, 0x23, + 0x3a, 0x4d, 0xc6, 0xf6, 0xd6, 0x58, 0x7a, 0x49, 0x2d, 0x1f, 0x7e, 0xe4, + 0x18, 0x63, 0x7b, 0x6b, 0x84, 0xab, 0xb0, 0xf4, 0x52, 0x93, 0xdb, 0x7f, + 0xf3, 0x2f, 0xb2, 0xf8, 0xab, 0xaa, 0xee, 0xde, 0xbf, 0x43, 0xed, 0x03, + 0x52, 0x7b, 0xb3, 0x7d, 0xfb, 0x6f, 0xfe, 0x05, 0xde, 0x76, 0x58, 0x5c, + 0xca, 0x6c, 0x8d, 0x96, 0x5e, 0x6a, 0xf2, 0xf0, 0x23, 0xc7, 0xc8, 0x2b, + 0xef, 0x5f, 0x74, 0x8e, 0xa5, 0x69, 0x8c, 0xed, 0x55, 0xf9, 0x3e, 0xf6, + 0x67, 0xc7, 0xb8, 0xfb, 0x97, 0xa7, 0xd2, 0xbc, 0x7b, 0xef, 0x54, 0x40, + 0x30, 0x3f, 0xf0, 0xb9, 0xf3, 0x3d, 0xea, 0x77, 0xe0, 0x37, 0x7d, 0x26, + 0xcb, 0xaa, 0xac, 0xc7, 0x9e, 0x9d, 0x63, 0x6c, 0xdf, 0x1e, 0xc2, 0x08, + 0x96, 0x4e, 0x2e, 0x73, 0xf0, 0xd6, 0x4f, 0xe3, 0xd8, 0xd0, 0xb8, 0x25, + 0xe2, 0xc4, 0xd2, 0x3c, 0x77, 0xff, 0xbb, 0x8f, 0xd1, 0x38, 0xa9, 0x20, + 0xb4, 0x8f, 0x3e, 0xfa, 0x24, 0xf5, 0x7d, 0xe3, 0x84, 0x51, 0x90, 0x1e, + 0xd7, 0xa9, 0x5b, 0x6f, 0xc7, 0xb2, 0x12, 0x1a, 0xa7, 0xd4, 0x15, 0xe8, + 0x51, 0xc3, 0x2a, 0x35, 0xd8, 0xb3, 0xaf, 0xce, 0xf2, 0xc9, 0x06, 0x4f, + 0x3c, 0x35, 0xaf, 0x73, 0x2b, 0x99, 0xdc, 0x3f, 0x89, 0x3d, 0xa2, 0x00, + 0x61, 0x73, 0x27, 0x62, 0x6a, 0xb5, 0xf1, 0xec, 0xb2, 0x03, 0x9a, 0xcd, + 0x45, 0x16, 0x97, 0xe6, 0x98, 0xba, 0x65, 0x92, 0x64, 0x0d, 0x3c, 0xaf, + 0x06, 0xab, 0x8d, 0xec, 0xfc, 0xea, 0xb6, 0xd9, 0x72, 0x2b, 0x61, 0x6a, + 0xc0, 0x30, 0x87, 0x69, 0x17, 0xcb, 0x5c, 0x1f, 0x9e, 0x33, 0xe2, 0x11, + 0xe4, 0x00, 0xaa, 0xa2, 0x54, 0xd6, 0x36, 0xed, 0x81, 0xdb, 0xbd, 0x61, + 0xa2, 0x54, 0xee, 0x6a, 0x73, 0x1b, 0xdf, 0x6a, 0x5b, 0xa4, 0xfd, 0x7c, + 0x5d, 0xfd, 0x7d, 0x1d, 0x1b, 0x7b, 0xc4, 0x41, 0x76, 0x62, 0x12, 0x19, + 0x01, 0x11, 0x96, 0x70, 0x10, 0x25, 0x9b, 0xb2, 0x65, 0x91, 0x44, 0x21, + 0x89, 0x3c, 0x91, 0x65, 0xd2, 0xf8, 0xa4, 0xac, 0xe0, 0x08, 0x12, 0x2c, + 0x51, 0x56, 0xcb, 0x5c, 0xba, 0x49, 0x57, 0xdf, 0x64, 0xbb, 0x67, 0x39, + 0x58, 0xb2, 0xa5, 0xe1, 0xb9, 0x39, 0xd9, 0x95, 0x1a, 0x71, 0xab, 0xb9, + 0x41, 0x3c, 0xd9, 0xf7, 0xa1, 0x8a, 0xcb, 0x8d, 0x67, 0xb0, 0x43, 0xae, + 0xa8, 0x11, 0xae, 0x75, 0xc3, 0x81, 0xd7, 0xd3, 0x72, 0x2b, 0x49, 0x6d, + 0xf3, 0x75, 0x78, 0x30, 0xc0, 0x76, 0x21, 0xb7, 0x6e, 0xf6, 0xe7, 0xba, + 0xc0, 0x60, 0x1a, 0x66, 0xa6, 0xc1, 0x74, 0x91, 0x2d, 0xcc, 0x54, 0x09, + 0xaa, 0x81, 0xaa, 0x2b, 0xaa, 0xb0, 0x30, 0x03, 0xd3, 0x33, 0x10, 0xcc, + 0xe6, 0xa2, 0x4c, 0x54, 0x01, 0x98, 0x98, 0x86, 0xd9, 0x85, 0x80, 0x6a, + 0x55, 0xc5, 0x4f, 0x81, 0x58, 0x55, 0x05, 0xaf, 0xaa, 0x02, 0x13, 0xda, + 0x16, 0xba, 0x6d, 0x01, 0x26, 0x26, 0x74, 0xbe, 0x02, 0x98, 0x0d, 0xba, + 0xa1, 0x5d, 0x81, 0xce, 0x63, 0x75, 0x5a, 0x71, 0x0d, 0x66, 0xf2, 0x79, + 0x46, 0x81, 0xad, 0x66, 0xa6, 0xab, 0x50, 0x0d, 0x98, 0x9d, 0x51, 0x70, + 0xae, 0xd9, 0xc0, 0xe4, 0x2f, 0x4b, 0x03, 0x60, 0xf9, 0x77, 0xe0, 0xcf, + 0x57, 0x54, 0x3a, 0x06, 0xe0, 0x35, 0x1b, 0xa8, 0xf4, 0x0d, 0x60, 0x2b, + 0x08, 0xb2, 0xe3, 0x63, 0xa0, 0x59, 0x33, 0xd3, 0x0a, 0xe8, 0x65, 0x8e, + 0x57, 0x0a, 0xdb, 0xca, 0x69, 0x76, 0x16, 0xa6, 0xa7, 0x83, 0x0c, 0xa6, + 0xb5, 0x90, 0xf9, 0x99, 0x01, 0x02, 0xbd, 0x15, 0x00, 0xef, 0x7b, 0x9f, + 0x42, 0x06, 0x4d, 0xff, 0xc9, 0x11, 0x96, 0x7f, 0x07, 0xf6, 0xfc, 0x81, + 0xb2, 0x99, 0x05, 0x66, 0xa8, 0x12, 0xe8, 0x02, 0x04, 0x0b, 0xf0, 0x53, + 0xfa, 0x58, 0x6c, 0xd4, 0x6f, 0xb6, 0x2e, 0x80, 0x8a, 0xf5, 0x3f, 0xcc, + 0xb1, 0x19, 0xe5, 0xfb, 0x6b, 0x8d, 0x9f, 0xde, 0xfe, 0xdd, 0x41, 0xfd, + 0xbd, 0x7d, 0x61, 0x25, 0xa1, 0x7e, 0xf7, 0x5d, 0x63, 0x0a, 0x03, 0xf2, + 0xae, 0x6d, 0xf3, 0xf1, 0xba, 0x96, 0x39, 0xb8, 0xd6, 0x50, 0xe5, 0x8e, + 0xc3, 0xb7, 0x5b, 0x7e, 0x03, 0xd4, 0x72, 0x1d, 0x0f, 0xd9, 0x92, 0x20, + 0xca, 0x7a, 0xbc, 0x57, 0xf0, 0xb1, 0x9f, 0xbf, 0x93, 0x8f, 0xff, 0xf9, + 0x63, 0x1c, 0xfc, 0xc8, 0x61, 0x9e, 0xf8, 0xc4, 0x43, 0x1c, 0xe5, 0x20, + 0x0f, 0x3c, 0xf8, 0x10, 0xf7, 0xde, 0x73, 0x98, 0x07, 0x1e, 0x7c, 0x08, + 0xeb, 0x56, 0x05, 0xcd, 0x3a, 0xba, 0x92, 0x8d, 0x6d, 0xe6, 0xc3, 0x01, + 0x16, 0x3f, 0xf5, 0x30, 0x06, 0x25, 0x93, 0xef, 0x37, 0xeb, 0x1a, 0xbf, + 0xa6, 0x1f, 0xa8, 0x05, 0x0a, 0x9c, 0x25, 0x3a, 0xdd, 0x90, 0x2c, 0x50, + 0x5c, 0x18, 0x2a, 0x22, 0x1d, 0x03, 0x5a, 0x5a, 0x53, 0xb8, 0xc4, 0x04, + 0xd1, 0x65, 0xdb, 0x15, 0xaf, 0x03, 0x5e, 0x49, 0x10, 0x22, 0x89, 0xc8, + 0x40, 0x55, 0xf5, 0x12, 0x34, 0x74, 0xdd, 0xfa, 0xf8, 0xbf, 0x4f, 0xb0, + 0x2b, 0x6a, 0x5c, 0xf2, 0x8e, 0x0e, 0xf8, 0x25, 0xf5, 0xb7, 0xa7, 0x03, + 0x8e, 0x06, 0x55, 0xe5, 0xdb, 0x3e, 0xf9, 0x75, 0xaf, 0xa3, 0xe0, 0x5a, + 0xa0, 0x96, 0x16, 0xca, 0x6f, 0xbe, 0x44, 0x87, 0x00, 0xbb, 0x04, 0x71, + 0x47, 0xa6, 0x20, 0x9c, 0x3c, 0xae, 0xf3, 0x88, 0x84, 0x7b, 0x72, 0xe3, + 0x60, 0x26, 0x8f, 0xa6, 0xde, 0x3f, 0xa4, 0xc7, 0xbd, 0xee, 0xea, 0x48, + 0x9d, 0xb6, 0x48, 0xd7, 0x0f, 0xfd, 0xfa, 0xe0, 0x31, 0xbe, 0x3d, 0x25, + 0x58, 0xee, 0xe8, 0x3f, 0xc0, 0x2e, 0x09, 0x62, 0x21, 0x59, 0x92, 0x26, + 0x2f, 0xaa, 0xdd, 0x79, 0xac, 0x23, 0x39, 0x86, 0x82, 0xf1, 0x98, 0x70, + 0x03, 0xcd, 0x02, 0xc9, 0xa3, 0xf7, 0xfb, 0x69, 0xf8, 0x1d, 0x25, 0x38, + 0x8c, 0x6a, 0x73, 0xef, 0xc9, 0xc1, 0xbf, 0xec, 0x52, 0xae, 0xb9, 0x98, + 0x1b, 0xe7, 0xe2, 0x2f, 0x6d, 0xf8, 0xc5, 0xec, 0x5c, 0x6f, 0x71, 0xaf, + 0x82, 0xd7, 0x5e, 0x51, 0x90, 0xa8, 0xd7, 0x14, 0xa0, 0xe9, 0x9a, 0x9e, + 0xfe, 0x9c, 0x3c, 0xc0, 0xca, 0xd8, 0x5f, 0xf5, 0x96, 0x2d, 0x29, 0x80, + 0x0a, 0xba, 0x01, 0x5b, 0x66, 0x1d, 0x48, 0xfd, 0x5e, 0x73, 0xcd, 0x35, + 0x5d, 0xf1, 0x7a, 0x7d, 0x1b, 0x00, 0x97, 0xf1, 0xd7, 0x9b, 0xbe, 0x81, + 0x54, 0xe5, 0xf3, 0x99, 0xb7, 0x5d, 0x79, 0xe9, 0x64, 0x9a, 0xbf, 0x3c, + 0x48, 0x6b, 0x90, 0xcf, 0x5e, 0xdb, 0x57, 0x5f, 0x7b, 0x3d, 0x83, 0x6e, + 0xad, 0xe3, 0xd3, 0xe4, 0xdd, 0xe4, 0xd5, 0xe4, 0xc7, 0xec, 0x9f, 0xcf, + 0x41, 0xb3, 0x8c, 0x3f, 0xa3, 0xfc, 0x31, 0xcd, 0x97, 0xdf, 0xf8, 0x37, + 0x3e, 0x7b, 0x8f, 0xe9, 0xfc, 0xfc, 0x7c, 0xdf, 0x31, 0x9d, 0x9f, 0x9f, + 0x4f, 0xf7, 0xf7, 0xe6, 0x99, 0xbf, 0xcc, 0x8d, 0x69, 0xe6, 0xea, 0x70, + 0xff, 0xb4, 0x4f, 0x7d, 0xbf, 0x02, 0x16, 0x85, 0x6b, 0x09, 0xb2, 0x25, + 0x89, 0x4e, 0x36, 0x70, 0x2b, 0xe5, 0xb4, 0x96, 0x5f, 0x3a, 0x7e, 0x02, + 0x6b, 0x6b, 0x15, 0x61, 0x95, 0x19, 0xbb, 0x65, 0x3f, 0x73, 0xc7, 0x55, + 0xbb, 0x48, 0xd0, 0xa6, 0x71, 0xb2, 0x41, 0x7d, 0x5f, 0x1d, 0x7b, 0xd4, + 0xa6, 0x71, 0x72, 0x9e, 0xfa, 0x8d, 0x93, 0x80, 0x50, 0xe3, 0xe0, 0x15, + 0x81, 0x7f, 0xca, 0xc7, 0x15, 0x16, 0xa1, 0xe9, 0x47, 0x5c, 0x58, 0x44, + 0x54, 0x04, 0xb6, 0x65, 0x33, 0x7e, 0xcb, 0x38, 0x8d, 0x53, 0x4d, 0xec, + 0x35, 0x1b, 0x2a, 0x11, 0x62, 0xc4, 0x01, 0x19, 0xd1, 0x5e, 0x6b, 0x83, + 0xb4, 0x10, 0x25, 0x49, 0xf3, 0x4c, 0x03, 0xab, 0x24, 0xf0, 0x3c, 0x0f, + 0xff, 0x54, 0x93, 0x3d, 0x7b, 0xc7, 0xa1, 0xa2, 0xc7, 0x8d, 0x75, 0x7e, + 0xad, 0xaa, 0x43, 0x12, 0x49, 0x1c, 0xd7, 0x21, 0x3c, 0xe3, 0xe3, 0xee, + 0xf6, 0xd2, 0xf1, 0x6d, 0xf3, 0xc1, 0xa6, 0xe6, 0x19, 0x9f, 0xda, 0x6e, + 0x0f, 0xff, 0x8c, 0x4f, 0x6d, 0xb7, 0xb6, 0xdb, 0xb1, 0x4b, 0x95, 0x7b, + 0xf5, 0x2c, 0xde, 0x88, 0x0d, 0x16, 0xf8, 0x41, 0x93, 0xc5, 0x17, 0x42, + 0x6e, 0xbf, 0x75, 0x8a, 0x04, 0x41, 0xb9, 0x24, 0x49, 0x28, 0x73, 0xe0, + 0xe6, 0x31, 0x12, 0xd4, 0x3d, 0x25, 0x4e, 0x04, 0xbe, 0xcc, 0xea, 0x53, + 0x23, 0x4f, 0xf7, 0x0f, 0x45, 0x51, 0x84, 0xbf, 0x9a, 0xa4, 0xe3, 0x93, + 0xbb, 0xae, 0x57, 0xcf, 0x2e, 0x22, 0x6a, 0xc2, 0x68, 0x1d, 0x51, 0x1a, + 0xf2, 0x74, 0x66, 0xea, 0x42, 0x0d, 0xd7, 0x2a, 0x97, 0x20, 0x94, 0x31, + 0xd6, 0x56, 0x01, 0x08, 0xca, 0xba, 0xee, 0xad, 0x5d, 0x5d, 0x23, 0x89, + 0xf3, 0xe9, 0x8b, 0xae, 0x31, 0x71, 0xd5, 0x97, 0xd2, 0xea, 0xbb, 0xa6, + 0xf3, 0xf0, 0xa7, 0x8d, 0xe0, 0x56, 0xa0, 0xc0, 0x58, 0x46, 0xc3, 0x00, + 0x5a, 0xbd, 0xdb, 0x1b, 0x81, 0xa3, 0x7a, 0xd3, 0x30, 0xdb, 0x5f, 0x3e, + 0x77, 0x81, 0xb7, 0x5f, 0x07, 0xcd, 0xe5, 0xbf, 0x4b, 0xfd, 0x1a, 0x90, + 0xd6, 0xff, 0xf4, 0xee, 0x69, 0xfe, 0xcf, 0xcf, 0xce, 0xf2, 0xd6, 0xab, + 0xb7, 0x33, 0xea, 0xec, 0x48, 0x81, 0x5a, 0x79, 0xcd, 0x1e, 0xfb, 0x6d, + 0x9a, 0xcb, 0x7f, 0x97, 0x82, 0xc0, 0xbe, 0xb2, 0x92, 0xf4, 0xa5, 0x91, + 0x2f, 0xe3, 0x97, 0xcf, 0x5d, 0xe0, 0xad, 0x57, 0x6f, 0xe7, 0xd7, 0x7f, + 0xf7, 0x03, 0x34, 0x97, 0xff, 0x8e, 0xda, 0x9e, 0x1f, 0xa3, 0xb9, 0xfc, + 0x77, 0x7d, 0x70, 0xae, 0x5e, 0x28, 0xd6, 0x20, 0x38, 0xd7, 0x7a, 0xe5, + 0x36, 0xf1, 0xf2, 0xfb, 0xf3, 0xf9, 0xe8, 0x8a, 0x37, 0xa3, 0xff, 0x82, + 0x2a, 0x4c, 0x04, 0x40, 0xa0, 0xc0, 0x5a, 0xd5, 0x20, 0x83, 0xc2, 0x4e, + 0x07, 0xa4, 0x1b, 0xb9, 0x6b, 0xba, 0x50, 0xa1, 0x42, 0x85, 0x0a, 0x15, + 0x2a, 0x54, 0xa8, 0x50, 0xa1, 0x42, 0x85, 0x0a, 0x15, 0x2a, 0x54, 0xa8, + 0x50, 0xa1, 0x42, 0x85, 0x0a, 0x15, 0x2a, 0x54, 0xa8, 0x50, 0xa1, 0x42, + 0x85, 0x0a, 0x6d, 0x5e, 0x05, 0x54, 0xab, 0x50, 0xa1, 0x42, 0x85, 0x0a, + 0x15, 0xfa, 0x1e, 0x4b, 0xae, 0x48, 0x62, 0x91, 0xbd, 0xe4, 0x95, 0x07, + 0xee, 0x98, 0x6d, 0xdb, 0x72, 0xfa, 0x5e, 0xd2, 0x96, 0xe9, 0xcb, 0xdc, + 0xe0, 0x8e, 0x38, 0x84, 0x6b, 0x1a, 0xa4, 0x53, 0x52, 0x2f, 0xf7, 0x95, + 0x2d, 0x0b, 0x21, 0xca, 0x6a, 0x62, 0x96, 0x99, 0x2c, 0xd2, 0x92, 0xb4, + 0x93, 0x98, 0x78, 0x2d, 0xc6, 0x1d, 0xd5, 0x6f, 0x6c, 0xe6, 0xbe, 0xda, + 0xac, 0x13, 0x46, 0x94, 0x44, 0xfa, 0xe2, 0x61, 0xfe, 0x45, 0x69, 0xe1, + 0xb8, 0x24, 0x51, 0x88, 0x30, 0x90, 0x94, 0xb5, 0x50, 0x7d, 0xcb, 0x77, + 0xc4, 0x86, 0x8e, 0x40, 0xae, 0x85, 0x58, 0x23, 0xae, 0x06, 0x68, 0x49, + 0xfd, 0x32, 0x5f, 0x16, 0xdf, 0xde, 0x6a, 0xe3, 0xfb, 0x21, 0xea, 0x1b, + 0x9a, 0x22, 0xdd, 0x53, 0xb6, 0x6c, 0x9c, 0xed, 0x55, 0xca, 0xa8, 0x17, + 0x81, 0x8d, 0x7c, 0x3f, 0x00, 0x14, 0x58, 0xcb, 0x13, 0xfa, 0x6b, 0xa9, + 0x1d, 0x68, 0xcb, 0x98, 0x78, 0x45, 0x43, 0x53, 0x2a, 0x2a, 0x2f, 0xd6, + 0x56, 0x75, 0xbc, 0x6c, 0x91, 0xbd, 0x4c, 0xe6, 0x79, 0x35, 0x9a, 0xe7, + 0xb2, 0x49, 0x24, 0x89, 0x9e, 0x30, 0x6b, 0x5e, 0x44, 0x4f, 0x92, 0x04, + 0xc7, 0x71, 0x06, 0x80, 0x78, 0x64, 0x9a, 0x5f, 0xaf, 0xe5, 0xe1, 0xaf, + 0x36, 0x61, 0x93, 0x2f, 0xbe, 0xcb, 0x15, 0x39, 0x14, 0xde, 0x15, 0xad, + 0x26, 0x6a, 0xf6, 0x11, 0xc0, 0x9b, 0xcb, 0x88, 0xd5, 0x04, 0xaf, 0x04, + 0xcd, 0xad, 0x36, 0xa2, 0x19, 0x22, 0x11, 0xb8, 0xfa, 0xcb, 0xa6, 0xd8, + 0x65, 0xdc, 0x04, 0xe2, 0x66, 0x88, 0xac, 0xb9, 0x10, 0x49, 0xac, 0xf3, + 0x92, 0x44, 0xa8, 0x73, 0x2c, 0x2b, 0xe0, 0x21, 0x88, 0x57, 0xb3, 0x7c, + 0xb5, 0xf5, 0xb1, 0xdb, 0x0c, 0x5c, 0xcb, 0x75, 0xac, 0x2e, 0x60, 0xd6, + 0x7a, 0xe0, 0x29, 0xdb, 0x12, 0xc4, 0x89, 0xc4, 0x5f, 0x4d, 0xa8, 0xef, + 0x76, 0x89, 0xcd, 0x57, 0x5c, 0x73, 0x13, 0x0d, 0x92, 0xb5, 0xf5, 0xa6, + 0xe9, 0x75, 0xa7, 0x17, 0x27, 0x9b, 0x07, 0x6a, 0xb9, 0xce, 0x80, 0xd9, + 0x57, 0x43, 0xd2, 0xb4, 0x2d, 0x81, 0x1f, 0x45, 0xd8, 0x25, 0x07, 0x6b, + 0x44, 0x90, 0xac, 0xe5, 0x26, 0x38, 0xbc, 0x01, 0xe9, 0xf5, 0x2a, 0x5a, + 0x4d, 0x50, 0xaf, 0xdf, 0xf7, 0xab, 0xf7, 0x77, 0x60, 0xae, 0xeb, 0xde, + 0xeb, 0x7b, 0x63, 0xe5, 0x27, 0xa0, 0x64, 0xc0, 0xac, 0xa1, 0xd6, 0x43, + 0xf6, 0x27, 0x6b, 0x49, 0x6e, 0xb2, 0xd4, 0xf0, 0xdf, 0xb2, 0x10, 0xa2, + 0x0f, 0x34, 0x35, 0x48, 0xbd, 0x36, 0x9b, 0x89, 0x33, 0x48, 0xf9, 0xc9, + 0x6c, 0xf9, 0xba, 0xc6, 0xb6, 0x6c, 0x05, 0xdf, 0x13, 0x82, 0x30, 0x0a, + 0x53, 0xb0, 0x96, 0x5c, 0x6f, 0xb2, 0xca, 0xb7, 0xa9, 0x61, 0x79, 0x81, + 0x8d, 0xaf, 0xeb, 0x30, 0xf7, 0x22, 0x75, 0xfe, 0xab, 0xf7, 0x06, 0x9c, + 0x62, 0xc2, 0xcc, 0xb6, 0x59, 0x6e, 0x64, 0x9f, 0xb7, 0xdd, 0x6c, 0x9c, + 0x1f, 0x74, 0xfb, 0x2b, 0xf1, 0x0d, 0xd9, 0xa4, 0x2a, 0xf3, 0xc2, 0xba, + 0xd9, 0x6f, 0x6c, 0xcd, 0xfe, 0xfc, 0xfd, 0xce, 0xf8, 0xcd, 0xdb, 0x44, + 0xab, 0x92, 0x61, 0xd7, 0xf5, 0x85, 0xd5, 0x16, 0xa3, 0x03, 0xf7, 0x6c, + 0xac, 0xf5, 0xe0, 0x58, 0xfd, 0xb6, 0xd5, 0x81, 0xf1, 0xcf, 0x7e, 0x53, + 0xad, 0x9f, 0x3f, 0x77, 0x6e, 0x28, 0x50, 0xeb, 0xfc, 0xf1, 0xe3, 0xe9, + 0xfa, 0x71, 0xbd, 0xfe, 0x46, 0x43, 0xb5, 0xfe, 0x00, 0xf8, 0xc7, 0x80, + 0xd4, 0xba, 0xb0, 0xda, 0x02, 0x46, 0x06, 0xee, 0x8b, 0x5a, 0xd9, 0xfa, + 0xa1, 0x25, 0xc9, 0x43, 0x7b, 0x41, 0xfc, 0xe9, 0x67, 0xb3, 0xb0, 0x93, + 0xdd, 0x13, 0x80, 0x61, 0x00, 0x30, 0x27, 0xa7, 0xa3, 0x2f, 0x65, 0x75, + 0xf3, 0xb1, 0x55, 0xf0, 0xf6, 0x8e, 0x21, 0xde, 0x0c, 0xc9, 0x85, 0x08, + 0xd6, 0x00, 0xe1, 0xd0, 0x3e, 0xef, 0x23, 0x3b, 0x09, 0x35, 0x47, 0xd7, + 0xa7, 0x6b, 0xdd, 0x3e, 0xda, 0x49, 0x3b, 0x05, 0x90, 0xa6, 0xbf, 0xe2, + 0x28, 0x21, 0xee, 0xfc, 0xd3, 0xb2, 0x97, 0x39, 0xc0, 0xe7, 0x66, 0xef, + 0x08, 0xf9, 0xf3, 0xd9, 0xb7, 0x2f, 0x91, 0xf0, 0xbb, 0x1f, 0xe5, 0x00, + 0x70, 0x6c, 0xa5, 0xc1, 0x93, 0xa7, 0x96, 0x87, 0x1b, 0x87, 0x11, 0xfc, + 0xd9, 0x3a, 0xfb, 0x2f, 0x43, 0xef, 0xfc, 0xf9, 0x43, 0xe4, 0xeb, 0x9a, + 0x9a, 0x15, 0x74, 0xed, 0xbf, 0xff, 0xdf, 0xc1, 0xbb, 0x7f, 0xf5, 0xf2, + 0xfd, 0x3e, 0xf8, 0x5f, 0xfe, 0x82, 0x7b, 0x60, 0x30, 0x80, 0x2a, 0xaf, + 0x55, 0x1f, 0x4e, 0xcc, 0x7f, 0xff, 0x82, 0xb4, 0xe8, 0x06, 0x83, 0x0d, + 0x95, 0x29, 0x87, 0x56, 0x94, 0x48, 0x18, 0x1d, 0x0c, 0x8f, 0x8a, 0xa2, + 0x08, 0xc7, 0x91, 0xc8, 0x50, 0x22, 0x2c, 0x91, 0x41, 0x9c, 0x2e, 0xe9, + 0xfb, 0x43, 0x14, 0xab, 0x89, 0xf9, 0x23, 0x22, 0xdd, 0x06, 0x68, 0x5f, + 0x02, 0xb6, 0xc6, 0x94, 0xb1, 0x69, 0x5f, 0xd2, 0xbf, 0xc9, 0x0b, 0x51, + 0x0a, 0xd6, 0x92, 0x17, 0xd4, 0xf5, 0x2d, 0x43, 0xa0, 0x0c, 0xa6, 0x89, + 0x67, 0x9a, 0x06, 0xed, 0x0b, 0xa1, 0x9a, 0x4c, 0x6a, 0xdb, 0x7a, 0x3b, + 0xce, 0xf6, 0x6f, 0xa9, 0x21, 0x2a, 0x1a, 0xe0, 0xab, 0x68, 0x1c, 0xc4, + 0x7e, 0x8c, 0x5d, 0x11, 0xb0, 0x35, 0x2b, 0x87, 0x8c, 0x40, 0x96, 0x5c, + 0xac, 0x91, 0x30, 0xdd, 0x1e, 0x64, 0x1b, 0xfb, 0xca, 0x77, 0xb2, 0xb6, + 0x79, 0xdb, 0x5e, 0xdf, 0x00, 0xed, 0x8e, 0x44, 0x5c, 0xa2, 0xdf, 0xaf, + 0x9f, 0x74, 0xe5, 0xd9, 0x94, 0x31, 0xf6, 0xe3, 0x14, 0xa4, 0x95, 0x96, + 0x59, 0xef, 0xcf, 0x83, 0xb4, 0x06, 0xcc, 0x3b, 0x4b, 0x8f, 0x5f, 0xfb, + 0x52, 0x9c, 0xc2, 0xb4, 0xda, 0x97, 0x4c, 0xb9, 0xe3, 0x14, 0xa4, 0x25, + 0x01, 0x0c, 0x68, 0xe1, 0x92, 0x24, 0x8a, 0x22, 0xb2, 0x99, 0x45, 0xdd, + 0xfa, 0x6a, 0xeb, 0xc2, 0xc0, 0xf0, 0x42, 0x3f, 0x98, 0xfa, 0x6a, 0xeb, + 0xc2, 0xb0, 0xdb, 0x75, 0x57, 0xfd, 0xee, 0xee, 0xac, 0x11, 0x27, 0x49, + 0x0a, 0xc9, 0xb2, 0x2d, 0xab, 0x6f, 0x7b, 0xec, 0x66, 0x1b, 0xa4, 0xc4, + 0xde, 0x6e, 0x13, 0x9e, 0x0b, 0xd3, 0x7d, 0xfc, 0x52, 0x8d, 0xf0, 0x8f, + 0xd5, 0xef, 0xba, 0xdc, 0x75, 0x3f, 0x97, 0x34, 0x4f, 0x2f, 0x03, 0x82, + 0xe6, 0xe9, 0x5c, 0xba, 0x1a, 0xf2, 0x3d, 0xf9, 0xde, 0x71, 0x62, 0xc0, + 0xbd, 0x16, 0xc2, 0x86, 0x02, 0xeb, 0x44, 0x51, 0x82, 0xe3, 0x58, 0x34, + 0x4e, 0x77, 0x03, 0x6f, 0xec, 0xdd, 0x35, 0xe2, 0x33, 0x4d, 0x40, 0x12, + 0x46, 0x11, 0x61, 0x94, 0x10, 0x9e, 0x6a, 0xe0, 0x5e, 0x5f, 0x27, 0x8c, + 0x94, 0xad, 0xe3, 0xc2, 0x9e, 0x5b, 0x74, 0x84, 0x51, 0x95, 0x7e, 0x74, + 0xd2, 0x4f, 0x21, 0xd0, 0xc6, 0x0e, 0x48, 0x81, 0x5a, 0x2a, 0x3c, 0xe9, + 0xda, 0x97, 0xfa, 0xdb, 0xa7, 0xb6, 0xf7, 0x5c, 0x2b, 0x39, 0x66, 0x76, + 0xaf, 0x2a, 0xfb, 0x3b, 0xff, 0x37, 0x15, 0x7f, 0x79, 0xd5, 0x53, 0xc0, + 0x2c, 0xe0, 0x8e, 0x3b, 0x54, 0x9f, 0x4b, 0x78, 0x4a, 0x41, 0xb5, 0x96, + 0x8f, 0x43, 0x6d, 0x42, 0xd5, 0x91, 0x0d, 0x09, 0x9c, 0x57, 0xed, 0x9f, + 0x3b, 0xdf, 0xef, 0xf1, 0xd8, 0x67, 0x7c, 0xc2, 0x33, 0xcb, 0xd4, 0x6f, + 0xa9, 0xe3, 0x96, 0x5c, 0x6c, 0x29, 0xa9, 0xdd, 0xe4, 0xe1, 0x76, 0x7c, + 0xe6, 0x17, 0x7c, 0xd0, 0xf7, 0x77, 0x77, 0x67, 0x8d, 0x30, 0x54, 0xe0, + 0xb3, 0xda, 0xcd, 0x6a, 0xe2, 0xaa, 0xdb, 0x11, 0x30, 0x21, 0xb1, 0x24, + 0x2c, 0xbd, 0xd8, 0x86, 0x8e, 0xc4, 0xda, 0x51, 0xcb, 0xa0, 0xe9, 0x03, + 0xf4, 0xd5, 0xd6, 0x05, 0x86, 0xb0, 0x0b, 0x87, 0xca, 0xff, 0xec, 0xb7, + 0x2e, 0x33, 0x46, 0xbf, 0xae, 0xec, 0x29, 0x77, 0x63, 0xbd, 0x91, 0x79, + 0xdb, 0x4d, 0x06, 0xae, 0xea, 0xd5, 0xff, 0x87, 0x82, 0x6e, 0xbd, 0x0c, + 0xfc, 0x33, 0xe0, 0x5b, 0xc0, 0xdf, 0x03, 0xdf, 0xbc, 0xc2, 0x34, 0xc7, + 0x72, 0xeb, 0xbd, 0xc8, 0xe1, 0x2f, 0x03, 0xff, 0x1a, 0x05, 0xf1, 0xea, + 0xd5, 0xee, 0x9e, 0x78, 0xeb, 0x5d, 0xd7, 0x17, 0x56, 0x5b, 0x1c, 0x7c, + 0x4f, 0x06, 0xbe, 0x0f, 0x51, 0x4d, 0x30, 0xd7, 0x51, 0x4b, 0x80, 0x38, + 0xf6, 0xd9, 0x55, 0xf3, 0x80, 0x03, 0x84, 0xb7, 0xc1, 0x64, 0xe4, 0xa7, + 0x30, 0xaa, 0xfc, 0x34, 0xe5, 0x30, 0xf2, 0xa9, 0x39, 0x5e, 0xdf, 0xb4, + 0x65, 0x13, 0x9e, 0x57, 0xbe, 0x77, 0xa7, 0x69, 0xd2, 0xd3, 0xdb, 0xfe, + 0x89, 0x39, 0xa6, 0xf6, 0x4f, 0xd1, 0x04, 0x5c, 0xb2, 0x70, 0xf7, 0xc4, + 0x1c, 0xd6, 0xfe, 0x29, 0x12, 0xa0, 0xe7, 0x33, 0x08, 0x69, 0x3e, 0x36, + 0x82, 0x5a, 0x85, 0x91, 0x0f, 0x78, 0xdd, 0xf9, 0xd6, 0x1e, 0x2c, 0x0e, + 0xd0, 0x1c, 0xf3, 0x39, 0xe8, 0x78, 0xda, 0x0e, 0xfc, 0x66, 0x93, 0xf1, + 0xfd, 0x53, 0xca, 0x26, 0x82, 0x9a, 0x03, 0xcd, 0xc8, 0xe7, 0xb3, 0x4e, + 0x83, 0xbb, 0x6e, 0xe8, 0x86, 0x64, 0x59, 0xb9, 0xed, 0x41, 0xeb, 0x5d, + 0x61, 0xf9, 0x7c, 0x0e, 0x02, 0x6a, 0x6d, 0x00, 0xda, 0xea, 0x4d, 0xd3, + 0xf8, 0x5d, 0xf7, 0x99, 0x2b, 0x48, 0x08, 0x34, 0xec, 0xc9, 0xa8, 0xc1, + 0x22, 0x00, 0x71, 0x2b, 0xe4, 0xd8, 0x33, 0x19, 0x5c, 0x0b, 0x80, 0x4e, + 0x82, 0xeb, 0xa8, 0xf6, 0xd7, 0xd2, 0xc9, 0xac, 0x4d, 0xfe, 0xf1, 0xdf, + 0x3e, 0x8a, 0xbd, 0x55, 0x9d, 0x4f, 0xaf, 0xaa, 0x96, 0x4b, 0x2f, 0x29, + 0x10, 0x95, 0x01, 0x62, 0x0d, 0xec, 0xd2, 0xcd, 0xf5, 0x15, 0x1a, 0xbb, + 0x41, 0x12, 0xdf, 0x0c, 0x91, 0x6f, 0x76, 0x39, 0xf6, 0x67, 0x0a, 0x9a, + 0x75, 0xe0, 0x17, 0x0e, 0x74, 0xad, 0x03, 0x90, 0x8b, 0x9f, 0xb7, 0x3f, + 0xf0, 0xce, 0xa9, 0x34, 0xdc, 0xcd, 0xfd, 0xe6, 0xfc, 0x40, 0x9d, 0xcf, + 0xc3, 0xbf, 0xf2, 0x71, 0xbc, 0xab, 0xf7, 0xe8, 0xfd, 0xfd, 0x65, 0xcb, + 0xaf, 0xd3, 0x49, 0xfa, 0xd6, 0xa3, 0x10, 0x96, 0x96, 0xe6, 0xa9, 0xef, + 0x1b, 0x4f, 0x81, 0x5a, 0x00, 0x53, 0xb7, 0xde, 0x9e, 0x02, 0xb5, 0x00, + 0xda, 0x12, 0x3e, 0xf7, 0xb4, 0x3a, 0x9e, 0x53, 0xb7, 0x4c, 0x32, 0x77, + 0x3c, 0xb3, 0xb5, 0x2a, 0x59, 0x1b, 0xce, 0xef, 0x84, 0x78, 0x25, 0x9b, + 0xf9, 0x13, 0xf3, 0xc8, 0x4e, 0xcc, 0xe4, 0xfe, 0x77, 0xe9, 0xbc, 0x65, + 0x35, 0xb0, 0xcc, 0xf5, 0xff, 0x3d, 0xf9, 0x4c, 0x03, 0x4b, 0xc4, 0xc8, + 0x16, 0x78, 0xc1, 0xf0, 0x3e, 0xd2, 0xb0, 0x15, 0x21, 0xb0, 0x91, 0x84, + 0xaa, 0x4f, 0x7b, 0x48, 0xbf, 0xb5, 0x28, 0x19, 0x18, 0x6d, 0xb9, 0x0b, + 0x9e, 0x05, 0xf4, 0x6d, 0xf7, 0x86, 0x99, 0xf5, 0xcc, 0x77, 0x39, 0xb7, + 0xad, 0xdb, 0xfb, 0x9d, 0xee, 0x25, 0xa5, 0x98, 0x78, 0x2d, 0xd2, 0x40, + 0x2d, 0x70, 0x2a, 0x35, 0xa2, 0x56, 0x93, 0x5a, 0x55, 0x81, 0xcf, 0xba, + 0x80, 0x5a, 0x98, 0xfe, 0x54, 0x01, 0x02, 0x12, 0xd9, 0x46, 0x88, 0xb2, + 0x5a, 0xa2, 0x96, 0xa0, 0x20, 0x5b, 0xc8, 0xc1, 0xcf, 0xaa, 0xbd, 0xb0, + 0xab, 0x3c, 0xd8, 0xca, 0x00, 0xb5, 0x8c, 0x8d, 0x1a, 0xc3, 0x18, 0xfc, + 0xbb, 0xec, 0x8e, 0x27, 0x2e, 0x3b, 0x5e, 0x92, 0x44, 0x08, 0xcb, 0x41, + 0x1a, 0x90, 0x96, 0x54, 0xf6, 0xa1, 0x5c, 0x1f, 0xa8, 0x65, 0x09, 0x8f, + 0x44, 0xfa, 0x84, 0xad, 0x68, 0xdd, 0x3a, 0x1c, 0x54, 0x2b, 0x3d, 0xd0, + 0x4b, 0xb3, 0xbe, 0x91, 0xaa, 0x13, 0x1a, 0x52, 0x35, 0x0b, 0xd3, 0x33, + 0x01, 0x13, 0x55, 0x58, 0x98, 0x85, 0x89, 0x99, 0xcc, 0xc6, 0xc0, 0xa7, + 0x00, 0x16, 0x66, 0x03, 0x66, 0xa7, 0xab, 0x2c, 0xe8, 0xce, 0xb6, 0x20, + 0x50, 0xa0, 0xaa, 0x05, 0xd4, 0xd2, 0x28, 0xbf, 0x9e, 0xd7, 0x44, 0xb5, + 0xdb, 0x9f, 0x81, 0x70, 0xcd, 0xea, 0xf5, 0x60, 0x01, 0x66, 0xf5, 0xf3, + 0x46, 0xd0, 0x53, 0x02, 0xb3, 0x3f, 0x8d, 0xa3, 0xd7, 0xbb, 0xf2, 0x17, + 0x28, 0x90, 0xd6, 0x9e, 0x5f, 0x53, 0x80, 0xad, 0xb7, 0x1c, 0x3e, 0x04, + 0x77, 0x1d, 0x19, 0x98, 0x76, 0x9a, 0xc7, 0x6a, 0xae, 0x9c, 0x41, 0xf7, + 0x71, 0x9b, 0x9d, 0xcd, 0xd6, 0xa7, 0x67, 0x60, 0x76, 0xa6, 0xbb, 0x3c, + 0xbd, 0xc0, 0x2f, 0xa3, 0x60, 0x46, 0x1d, 0x47, 0x50, 0x60, 0xae, 0x1d, + 0x0f, 0xa9, 0x3c, 0xf0, 0x05, 0xe0, 0x1d, 0x2a, 0x49, 0x03, 0xea, 0x5a, + 0x98, 0x08, 0x54, 0x59, 0x26, 0x54, 0x79, 0x36, 0xec, 0x37, 0xeb, 0xed, + 0x2c, 0xcf, 0xf7, 0xdb, 0x0f, 0x00, 0x6b, 0x41, 0xd6, 0x17, 0x7b, 0x39, + 0x90, 0xa9, 0x5e, 0x90, 0x56, 0x1e, 0x96, 0xd5, 0x0b, 0xdc, 0x1a, 0x04, + 0xd7, 0x4a, 0xf3, 0x93, 0xcf, 0x63, 0x4f, 0xdf, 0x7f, 0xef, 0x47, 0x49, + 0x36, 0xa5, 0x5e, 0x9f, 0xbd, 0x7a, 0x83, 0xca, 0x6f, 0xc6, 0x34, 0xa1, + 0x89, 0x94, 0x12, 0x67, 0xb4, 0x86, 0x2b, 0x5c, 0xca, 0x25, 0x8b, 0x76, + 0x47, 0x72, 0xf0, 0x23, 0x87, 0x01, 0x38, 0xf8, 0x91, 0xc3, 0xec, 0x1a, + 0x75, 0xb8, 0xf7, 0x1e, 0xb5, 0x7d, 0xef, 0x3d, 0x87, 0x39, 0xba, 0x12, + 0x92, 0x3c, 0xfb, 0x04, 0xd6, 0xad, 0x07, 0xb9, 0x7b, 0xa7, 0xcb, 0x03, + 0x0f, 0x2a, 0x20, 0xb9, 0x09, 0x03, 0x78, 0xe2, 0x13, 0x0f, 0xf1, 0xf0, + 0x1f, 0x7f, 0xae, 0x2f, 0x5d, 0x23, 0xb9, 0x22, 0xc1, 0x52, 0x75, 0x5b, + 0x5a, 0x47, 0x48, 0xa9, 0xea, 0xeb, 0x8a, 0xe8, 0x03, 0x6a, 0x81, 0x86, + 0x65, 0xe5, 0xce, 0x87, 0x10, 0x02, 0x89, 0x48, 0x6f, 0xc8, 0x06, 0xb0, + 0x95, 0xaa, 0x04, 0xf5, 0x92, 0xc0, 0xef, 0x48, 0xd0, 0xcf, 0x78, 0x49, + 0xcf, 0xbd, 0xc2, 0x2a, 0x41, 0xb3, 0xd3, 0xa6, 0xd6, 0x51, 0x48, 0xa0, + 0x43, 0x00, 0x1d, 0x78, 0x28, 0xb7, 0x0e, 0xf0, 0x71, 0xe0, 0x63, 0xa8, + 0x76, 0x4d, 0x02, 0x1c, 0xe8, 0xc0, 0x64, 0x49, 0xa5, 0x31, 0x4f, 0xd6, + 0xde, 0x49, 0x74, 0x9c, 0x23, 0x25, 0xc9, 0x21, 0x04, 0x7b, 0x80, 0x65, + 0x29, 0x71, 0x2b, 0x02, 0x57, 0x2a, 0x30, 0xd5, 0x21, 0x09, 0x9f, 0x16, + 0x30, 0x87, 0x64, 0x0e, 0xc1, 0x21, 0xc0, 0xa5, 0xcd, 0x78, 0xa9, 0xcc, + 0x9c, 0x01, 0x7e, 0xf5, 0xe4, 0x31, 0xc9, 0x1d, 0xa7, 0x7a, 0x07, 0xee, + 0x16, 0x82, 0xbb, 0xa4, 0x4c, 0xe1, 0x60, 0x6d, 0xda, 0xdc, 0xa1, 0x01, + 0x5a, 0x06, 0xa8, 0x65, 0xb4, 0xab, 0xa4, 0xda, 0x81, 0xa6, 0x4c, 0x53, + 0xc0, 0x94, 0x01, 0x81, 0x69, 0xbb, 0x23, 0x42, 0xc3, 0xbb, 0x72, 0x2a, + 0x6b, 0xb8, 0xd6, 0x2e, 0x7d, 0x6c, 0x0e, 0xeb, 0x38, 0xf7, 0x77, 0xf4, + 0xb1, 0x21, 0xdb, 0x7e, 0xe7, 0x3a, 0xe3, 0x5c, 0xdf, 0x58, 0xf9, 0x3a, + 0x38, 0x5b, 0xd8, 0xb6, 0x6d, 0x1b, 0x00, 0xdb, 0xb6, 0x6d, 0xe3, 0xe2, + 0xc5, 0x8b, 0x29, 0xf0, 0xe9, 0xaa, 0xb7, 0x6c, 0x49, 0xa1, 0x54, 0x3b, + 0xf7, 0xaa, 0x87, 0xcd, 0x8b, 0x17, 0x2f, 0x02, 0x0a, 0xe6, 0x94, 0x07, + 0x5d, 0xbd, 0x1e, 0xbe, 0x9a, 0xc6, 0xdb, 0xb9, 0x77, 0x1f, 0x17, 0x2f, + 0x5e, 0xe4, 0x9a, 0x6b, 0xae, 0x61, 0xdb, 0xb6, 0x6d, 0xac, 0xbc, 0x74, + 0x52, 0x81, 0xb0, 0xb4, 0x4f, 0xb3, 0x7e, 0xcd, 0x35, 0xd7, 0x30, 0xb9, + 0x77, 0x5b, 0xe6, 0x53, 0x37, 0x3f, 0x5e, 0xd1, 0x60, 0x2a, 0x93, 0xf6, + 0xab, 0xaf, 0xbd, 0x9e, 0xc2, 0xa3, 0xb6, 0xb8, 0x57, 0xa5, 0x71, 0x4c, + 0xfa, 0xbd, 0x80, 0xaa, 0x6d, 0xdb, 0xb6, 0x71, 0x51, 0xaf, 0xbf, 0xd1, + 0x3e, 0xcd, 0xfe, 0x6b, 0xdc, 0xfe, 0x75, 0x53, 0x2e, 0x63, 0xff, 0xdd, + 0x3e, 0xa6, 0xdf, 0x58, 0xd9, 0x32, 0xf4, 0x65, 0xd0, 0xa8, 0x05, 0x63, + 0xfb, 0xc7, 0xd2, 0x3e, 0xb7, 0xc6, 0x49, 0xf5, 0x4b, 0x36, 0xad, 0x42, + 0x4f, 0x83, 0xb4, 0x64, 0xd2, 0xa6, 0x79, 0xba, 0x81, 0x70, 0x6c, 0x04, + 0x6d, 0xec, 0x32, 0x84, 0xe7, 0x7d, 0x1a, 0x27, 0x1b, 0xb8, 0x23, 0x2e, + 0xcd, 0xd5, 0x80, 0xf2, 0xe9, 0x26, 0xf5, 0x1b, 0x15, 0x90, 0x15, 0x24, + 0xcd, 0xe7, 0x9b, 0xc4, 0x6f, 0x96, 0xb8, 0xba, 0x83, 0xd4, 0x1b, 0x71, + 0xd2, 0xf1, 0x5e, 0xff, 0x9c, 0x4f, 0xe4, 0x26, 0xd4, 0x47, 0xc6, 0xa8, + 0xed, 0xf4, 0xf0, 0x46, 0x6a, 0xc4, 0x9d, 0x18, 0xbb, 0x64, 0x43, 0xc5, + 0xc6, 0xa7, 0x49, 0x79, 0x04, 0xfc, 0xf3, 0x09, 0x56, 0x29, 0x6b, 0xeb, + 0x04, 0xe7, 0x02, 0xce, 0xae, 0x2c, 0x53, 0x2e, 0x95, 0xf1, 0x76, 0xd4, + 0x60, 0x87, 0xf2, 0x97, 0xac, 0x46, 0xb4, 0x5b, 0x59, 0x7b, 0xb0, 0xf1, + 0xdc, 0x12, 0x62, 0x8b, 0x60, 0xf2, 0xa6, 0x29, 0xdc, 0x8a, 0x4b, 0xdc, + 0x49, 0xf0, 0x46, 0x6c, 0x64, 0x94, 0x20, 0x50, 0x1f, 0x94, 0xb2, 0x6f, + 0xb0, 0x69, 0xaf, 0x49, 0x6c, 0xcb, 0x42, 0x58, 0xbb, 0xf0, 0xcf, 0x9c, + 0xc5, 0xb5, 0x76, 0x21, 0x46, 0xb2, 0x71, 0x49, 0x7f, 0x25, 0xc1, 0xd6, + 0xf0, 0x42, 0xa3, 0x3d, 0x8e, 0x4d, 0x9c, 0xa8, 0x77, 0x50, 0x62, 0x19, + 0xab, 0x31, 0xe4, 0x92, 0x60, 0xee, 0x94, 0xcf, 0x9e, 0xaa, 0x9d, 0xb6, + 0x71, 0xc7, 0x2c, 0x8b, 0x66, 0x47, 0xe0, 0x27, 0x21, 0x75, 0xd7, 0x62, + 0xee, 0x64, 0x03, 0xaf, 0x04, 0xf1, 0x79, 0x9f, 0x5a, 0x55, 0x10, 0x94, + 0x6c, 0xa2, 0x4b, 0x11, 0x6d, 0x29, 0xa9, 0x5d, 0x5d, 0xd3, 0x00, 0xbf, + 0x5c, 0xdb, 0x57, 0x03, 0xb5, 0x40, 0xd5, 0xa1, 0x49, 0x28, 0xd3, 0x3a, + 0x25, 0xf0, 0x9b, 0xe9, 0xfb, 0x2d, 0x56, 0xc9, 0x22, 0x41, 0x8d, 0x69, + 0x0f, 0x1b, 0xfb, 0x78, 0xe1, 0x4b, 0x5f, 0xe2, 0x4e, 0x32, 0x80, 0xd3, + 0x20, 0x80, 0xd6, 0x30, 0x58, 0x54, 0x1e, 0x4e, 0xd5, 0x0b, 0xd0, 0xba, + 0xea, 0xc7, 0x7f, 0xb2, 0xcb, 0xd6, 0x40, 0xbb, 0x4c, 0xf8, 0xa0, 0x74, + 0x06, 0xf9, 0x01, 0x78, 0xeb, 0xd5, 0xdb, 0x07, 0xfa, 0xcd, 0x83, 0xc0, + 0xbe, 0x7c, 0xee, 0x02, 0xa3, 0xce, 0x8e, 0x3e, 0xa0, 0x16, 0x64, 0x30, + 0xae, 0x57, 0xbf, 0xf6, 0x15, 0xfe, 0xe6, 0xe5, 0xbf, 0xe2, 0xed, 0xd7, + 0xfd, 0x2c, 0xb5, 0x3d, 0x3f, 0xc6, 0xd2, 0x17, 0x33, 0x9f, 0x79, 0x40, + 0xd6, 0x5b, 0xaf, 0xde, 0xce, 0x97, 0xcf, 0x5d, 0x48, 0xe3, 0x3d, 0xfe, + 0xfb, 0xcf, 0x75, 0xa5, 0xb5, 0x5e, 0x7e, 0x7b, 0xcb, 0x35, 0xea, 0xec, + 0xd0, 0x71, 0xaf, 0xeb, 0x8b, 0x3b, 0x08, 0xb6, 0x95, 0x8f, 0xbb, 0x1a, + 0x9d, 0x57, 0xc4, 0xd6, 0x6a, 0xce, 0xc0, 0x0c, 0x20, 0x1b, 0xa0, 0xd6, + 0x0c, 0xca, 0x46, 0x87, 0xbd, 0x70, 0xfb, 0x97, 0xf8, 0x11, 0xba, 0x8f, + 0x7d, 0xa1, 0x42, 0x85, 0x0a, 0x15, 0x2a, 0x54, 0xa8, 0x50, 0xa1, 0x42, + 0x85, 0x0a, 0x15, 0x2a, 0x54, 0xa8, 0x50, 0xa1, 0x42, 0x85, 0x0a, 0x15, + 0x2a, 0x54, 0xa8, 0x50, 0xa1, 0x42, 0x85, 0x0a, 0x15, 0xda, 0xbc, 0x0a, + 0xa8, 0x56, 0xa1, 0x42, 0x85, 0x0a, 0x15, 0x2a, 0xf4, 0x7d, 0x20, 0x7b, + 0xc4, 0xa2, 0xb9, 0xd2, 0xc4, 0xaa, 0x64, 0x93, 0x4f, 0xcc, 0x24, 0x15, + 0xcb, 0x72, 0xa1, 0x24, 0x49, 0x12, 0xb0, 0xac, 0xdc, 0x24, 0xf1, 0x0e, + 0x24, 0xad, 0x38, 0x7d, 0x51, 0x4f, 0xb6, 0xd4, 0x24, 0x63, 0xe1, 0xb8, + 0x94, 0x85, 0xa5, 0x5e, 0x72, 0x2e, 0x69, 0x80, 0x94, 0xb9, 0xe3, 0x57, + 0x2c, 0x92, 0x8a, 0x20, 0x5e, 0x0d, 0x09, 0x57, 0x43, 0xca, 0x96, 0xdd, + 0x07, 0x81, 0x88, 0xd7, 0x42, 0x9d, 0x27, 0xb7, 0x0f, 0x2c, 0x03, 0x60, + 0x39, 0x2e, 0xe1, 0x5a, 0x88, 0x34, 0x2f, 0x99, 0x97, 0x80, 0x55, 0x3d, + 0x51, 0x55, 0x58, 0xea, 0x6b, 0x9d, 0x61, 0x8c, 0xed, 0x9a, 0xd7, 0x2f, + 0x25, 0xc8, 0x36, 0x88, 0x32, 0x71, 0x18, 0x62, 0x09, 0x01, 0xa3, 0x35, + 0x9a, 0xa7, 0x16, 0xa1, 0x04, 0x5e, 0x75, 0x17, 0x96, 0x65, 0x21, 0x5f, + 0x4f, 0x70, 0x3d, 0x3d, 0xc1, 0x48, 0xa7, 0x3b, 0x36, 0xe2, 0xb2, 0x74, + 0x72, 0x09, 0xa4, 0xa4, 0xfd, 0x7a, 0x6e, 0xd2, 0xff, 0x9b, 0xb3, 0x7c, + 0xf9, 0x17, 0xd4, 0xc4, 0x0f, 0xcb, 0x76, 0x52, 0xc0, 0x56, 0xee, 0x20, + 0xe2, 0xb9, 0x1e, 0xf3, 0xcf, 0x1d, 0xc3, 0x72, 0x1c, 0x68, 0xa9, 0xe9, + 0x2f, 0xe6, 0x0b, 0xa5, 0x66, 0xb2, 0x55, 0x78, 0x29, 0xd4, 0x20, 0xb0, + 0xdc, 0x71, 0xb8, 0x14, 0x43, 0x47, 0xbd, 0xf0, 0x9d, 0xac, 0x86, 0xc8, + 0xd6, 0xfa, 0x30, 0xa3, 0xcd, 0x4a, 0xac, 0x49, 0x18, 0x91, 0x78, 0x6b, + 0x6d, 0x70, 0x2c, 0xa4, 0x6c, 0xe3, 0x5d, 0x82, 0x50, 0x82, 0xd5, 0x91, + 0xb4, 0xd1, 0x93, 0xba, 0x9e, 0x8f, 0x88, 0xcd, 0x04, 0x99, 0x46, 0x98, + 0x4e, 0xc6, 0x11, 0x12, 0xdc, 0x51, 0x8b, 0x72, 0x22, 0x89, 0x4b, 0xb9, + 0x97, 0xef, 0xf5, 0xbc, 0x1e, 0x80, 0xb8, 0x25, 0x71, 0x1d, 0x0b, 0x29, + 0xfb, 0xcf, 0x9f, 0x81, 0x5b, 0x75, 0x01, 0xb5, 0xb4, 0x92, 0xb5, 0x04, + 0x6f, 0x87, 0x83, 0x6d, 0x39, 0xe9, 0xc4, 0x5d, 0x5b, 0xc3, 0x2b, 0x6c, + 0x4b, 0x60, 0x8f, 0x08, 0x92, 0xa4, 0xdd, 0x17, 0x07, 0xb2, 0x49, 0x3c, + 0x97, 0x9b, 0xde, 0xb0, 0xb8, 0x06, 0x6e, 0x35, 0x28, 0x9e, 0x89, 0x3b, + 0x28, 0x9e, 0xa7, 0x21, 0x69, 0x76, 0x45, 0x20, 0x7b, 0xe2, 0x9a, 0x38, + 0x57, 0x9a, 0x9e, 0xb7, 0xc3, 0x19, 0x78, 0x4c, 0xd7, 0x93, 0x81, 0x68, + 0x0d, 0x0a, 0xdf, 0x3c, 0x58, 0xcb, 0xc4, 0xb9, 0xcc, 0xdf, 0xa0, 0xfe, + 0x32, 0x76, 0x5e, 0xf9, 0x09, 0x1c, 0xfd, 0xfe, 0xb3, 0x89, 0x0e, 0xe6, + 0x25, 0xe7, 0xf5, 0x94, 0xb7, 0xe9, 0x02, 0x15, 0xe5, 0xe0, 0x54, 0x66, + 0x7b, 0x98, 0x06, 0xd5, 0x31, 0x40, 0x57, 0xda, 0x69, 0x9e, 0xd7, 0x03, + 0x6a, 0x95, 0x18, 0x00, 0xc7, 0xdb, 0x58, 0x65, 0x51, 0x4e, 0x81, 0x60, + 0x7d, 0x20, 0xad, 0xcb, 0x00, 0x78, 0x29, 0x50, 0x87, 0x9a, 0x00, 0x19, + 0x04, 0x01, 0x8e, 0xe3, 0xa4, 0xcb, 0x7c, 0xd8, 0x95, 0xd8, 0x2b, 0x68, + 0xc4, 0x77, 0x36, 0x8d, 0xef, 0x37, 0xfb, 0xcb, 0xf5, 0xdd, 0xbb, 0x0f, + 0xc0, 0x71, 0x9c, 0xf4, 0xd8, 0xad, 0xa7, 0xcb, 0x99, 0xc4, 0x04, 0xf0, + 0x85, 0x0f, 0x7f, 0x98, 0x1d, 0x1f, 0xfa, 0xd0, 0x86, 0x76, 0xcd, 0x85, + 0x67, 0x99, 0x98, 0x98, 0x00, 0xaa, 0x2c, 0x2c, 0x2c, 0x50, 0xad, 0x4e, + 0xb3, 0xb0, 0xb0, 0x90, 0x0b, 0x9b, 0x25, 0x08, 0x54, 0x18, 0x40, 0xb5, + 0x3a, 0x9d, 0xe6, 0x1d, 0x60, 0x61, 0x61, 0xb6, 0x2f, 0xfe, 0x23, 0x9f, + 0xfb, 0x24, 0x00, 0xc7, 0x1f, 0x79, 0x84, 0xcd, 0x60, 0xb2, 0xde, 0x74, + 0xfc, 0x38, 0xe7, 0x80, 0x47, 0x8e, 0x1f, 0x67, 0xc7, 0x2d, 0xb7, 0x70, + 0xf5, 0x8e, 0x37, 0x0e, 0x85, 0xf5, 0x46, 0x83, 0xba, 0xbe, 0x9f, 0x25, + 0x7f, 0xff, 0x7d, 0x5d, 0x13, 0x90, 0x86, 0xda, 0x75, 0xd6, 0x07, 0x6b, + 0x0d, 0xd7, 0x77, 0x0a, 0xd7, 0xf0, 0x8f, 0x53, 0xa6, 0xb9, 0xf3, 0x46, + 0x23, 0x16, 0x8f, 0x9d, 0x5a, 0x52, 0x2b, 0x22, 0xfd, 0xa7, 0x13, 0xd4, + 0x29, 0xc5, 0x09, 0x9c, 0x79, 0x63, 0x80, 0x5a, 0x00, 0x9f, 0xbe, 0x2f, + 0xc0, 0xdb, 0x9f, 0xb5, 0x03, 0x2c, 0xeb, 0x6f, 0xfb, 0x8d, 0x7e, 0xf5, + 0x5d, 0x9b, 0xf6, 0x67, 0x60, 0x5a, 0xf7, 0x9c, 0x38, 0xb1, 0xa1, 0x2d, + 0xf0, 0x7d, 0x0d, 0xd4, 0x32, 0x30, 0xad, 0x43, 0xeb, 0xc1, 0xb4, 0x8c, + 0x2e, 0xb3, 0x1c, 0xe9, 0x79, 0x1e, 0xa0, 0xc7, 0x5e, 0x1a, 0x7c, 0xec, + 0x9a, 0x0b, 0x4f, 0xf6, 0x85, 0x1d, 0x7d, 0x71, 0x0e, 0x5e, 0xec, 0x0e, + 0x5b, 0xfe, 0xfc, 0xd1, 0x81, 0xf1, 0x1f, 0x7e, 0xe1, 0xd8, 0xc0, 0xf0, + 0xe1, 0xf6, 0xfd, 0xe9, 0x2d, 0x3e, 0xfd, 0xc0, 0xa6, 0x6d, 0x01, 0x96, + 0x9f, 0xea, 0xaf, 0xb5, 0x86, 0xd9, 0x0e, 0xf2, 0x3d, 0xd4, 0xef, 0x65, + 0xe4, 0x79, 0x5d, 0xfb, 0xa7, 0x1f, 0xef, 0x0b, 0x1b, 0x74, 0x9c, 0x87, + 0x9f, 0x93, 0xb9, 0x3e, 0x78, 0x49, 0xa1, 0x7f, 0xba, 0xf2, 0xc6, 0x3c, + 0xc2, 0x95, 0x26, 0xd6, 0x88, 0x8b, 0x68, 0xf9, 0xc4, 0x2d, 0x48, 0xce, + 0xfb, 0xb0, 0x43, 0x3d, 0xeb, 0x27, 0xe7, 0x15, 0xb8, 0x84, 0x1d, 0x1e, + 0x4b, 0xcf, 0x41, 0x9c, 0x24, 0x78, 0xfb, 0x3c, 0xdc, 0xab, 0x6d, 0xfc, + 0xa7, 0x1a, 0x58, 0x0f, 0x4c, 0x91, 0xdc, 0xab, 0xea, 0x1b, 0x6b, 0x47, + 0x0d, 0xcb, 0xb2, 0xb1, 0x6b, 0x96, 0x82, 0x40, 0xdd, 0x58, 0x23, 0x6c, + 0x26, 0x24, 0x6b, 0x0a, 0x0a, 0xe5, 0xee, 0x54, 0x20, 0xaa, 0x70, 0x45, + 0xf5, 0x41, 0xcc, 0x3f, 0xb5, 0x48, 0xb4, 0x1a, 0xf2, 0xd1, 0x7f, 0xbb, + 0x87, 0xf9, 0x8e, 0x4b, 0xe3, 0xb9, 0x65, 0x9a, 0x2b, 0x36, 0x90, 0x10, + 0x9e, 0x59, 0xc6, 0xdd, 0xad, 0x40, 0x29, 0x8e, 0x7e, 0xd6, 0x0c, 0xcf, + 0xb4, 0xa9, 0xdd, 0x5c, 0xa7, 0x71, 0xbc, 0x41, 0x78, 0x66, 0x91, 0xfa, + 0x4d, 0x93, 0x29, 0x84, 0x2b, 0x59, 0x4b, 0x68, 0x34, 0x1a, 0x44, 0xa1, + 0x45, 0x18, 0x25, 0xd4, 0x6f, 0xad, 0xa7, 0x00, 0xac, 0xc6, 0x29, 0x97, + 0xfa, 0xf5, 0x1a, 0x54, 0x7b, 0xaa, 0xc1, 0x9e, 0x77, 0xa8, 0x89, 0x84, + 0x61, 0x94, 0x50, 0xaf, 0xd7, 0x69, 0x34, 0x1a, 0x19, 0xa0, 0x4b, 0xef, + 0x0f, 0xa3, 0x84, 0xe8, 0xa4, 0x2a, 0xfb, 0xdc, 0x49, 0x98, 0xba, 0xc3, + 0x63, 0xf9, 0x34, 0x44, 0xa1, 0xaf, 0x80, 0x59, 0x06, 0x12, 0x36, 0x0a, + 0x8d, 0x67, 0xd5, 0x04, 0xda, 0xc7, 0x1f, 0xf7, 0x69, 0x77, 0x24, 0xf6, + 0xee, 0x1a, 0xfe, 0x52, 0x13, 0xb7, 0xee, 0xd1, 0xd0, 0xb4, 0xa6, 0xa9, + 0xdd, 0xf0, 0xc0, 0x71, 0x65, 0xf7, 0xd8, 0x67, 0x94, 0x5f, 0x77, 0xf7, + 0x1e, 0xc2, 0x86, 0x8f, 0x5b, 0xeb, 0xc6, 0x5d, 0x35, 0x4e, 0x76, 0xdf, + 0x2f, 0xa5, 0x94, 0x0a, 0xae, 0xd5, 0x08, 0x99, 0x7c, 0xaf, 0x4b, 0x5b, + 0xc6, 0xe9, 0xb3, 0xdb, 0xfc, 0xd3, 0xc7, 0xb0, 0x76, 0xd4, 0xae, 0xec, + 0xe4, 0x17, 0x4a, 0xb5, 0x7b, 0x63, 0x93, 0xcd, 0xab, 0xf5, 0xad, 0x75, + 0xa7, 0x69, 0xfe, 0xd7, 0x9e, 0x65, 0xef, 0xbe, 0x5b, 0xdf, 0xfd, 0xa6, + 0x81, 0xd0, 0xb0, 0xf5, 0xe2, 0xf5, 0xea, 0x6c, 0x13, 0x76, 0xe9, 0x9f, + 0x85, 0x82, 0x58, 0xf9, 0x1a, 0xac, 0xa5, 0xe0, 0x53, 0x4d, 0x14, 0x8c, + 0xca, 0x75, 0xc0, 0xc5, 0x63, 0xb1, 0xd9, 0xa4, 0xe6, 0x78, 0x34, 0x23, + 0x3f, 0x03, 0x5e, 0x01, 0x7e, 0x9c, 0x10, 0x3b, 0x6a, 0x72, 0xb8, 0x4b, + 0x06, 0xb0, 0xf2, 0xe3, 0x84, 0x9a, 0xd3, 0x0d, 0xdf, 0x02, 0x40, 0xc3, + 0xab, 0xe2, 0x38, 0x83, 0x03, 0xb9, 0x8e, 0x47, 0xec, 0xb8, 0x24, 0x80, + 0x1b, 0xa1, 0x40, 0xf9, 0x11, 0xd4, 0x1c, 0x9f, 0x45, 0xc7, 0x65, 0x3c, + 0x17, 0xdf, 0x40, 0x93, 0x16, 0x4f, 0xcc, 0x61, 0xd5, 0x6a, 0xec, 0xd2, + 0x79, 0x32, 0xfb, 0x0c, 0xb8, 0x2a, 0x4d, 0x0f, 0x88, 0xe3, 0x04, 0xd7, + 0xd1, 0x08, 0x9c, 0x9c, 0xad, 0x1f, 0x35, 0x69, 0xda, 0x6a, 0x3d, 0xef, + 0xdf, 0x6f, 0x36, 0x01, 0x1f, 0x17, 0x8f, 0x10, 0x5f, 0x03, 0xc0, 0x3c, + 0xde, 0xfd, 0x54, 0x63, 0x5d, 0x78, 0x57, 0x17, 0x50, 0x6b, 0xd0, 0x7e, + 0xba, 0x21, 0x5b, 0xf4, 0x6e, 0x0f, 0x00, 0x6a, 0x25, 0x2f, 0x0c, 0xd8, + 0xbe, 0xa1, 0xdf, 0xcf, 0x46, 0x0a, 0xa3, 0x80, 0xc6, 0xc9, 0xc5, 0x74, + 0xdb, 0x5f, 0x4b, 0xf0, 0x46, 0x5c, 0xea, 0xfb, 0xd4, 0xdd, 0xfe, 0x89, + 0xa7, 0x54, 0xbb, 0xa1, 0x2c, 0x04, 0x61, 0x14, 0xb1, 0xb4, 0x34, 0x4f, + 0x8e, 0xb3, 0xcb, 0xe4, 0xfe, 0x0c, 0x5c, 0xf5, 0xd8, 0x1f, 0x1f, 0xa5, + 0x5c, 0x51, 0x7d, 0x03, 0x8d, 0x33, 0xaa, 0xae, 0x8e, 0x2f, 0xf9, 0x80, + 0xfa, 0x41, 0xe5, 0xe1, 0x59, 0xc7, 0x3e, 0xdf, 0xdf, 0xd6, 0xac, 0xef, + 0xd6, 0x76, 0x4b, 0xf3, 0x88, 0x2d, 0xae, 0xb2, 0x7f, 0x73, 0x77, 0x1d, + 0x67, 0x80, 0x5a, 0xf5, 0xdd, 0xb5, 0x74, 0x3d, 0x4b, 0x87, 0x14, 0xf0, + 0x65, 0xf2, 0x63, 0xc2, 0xfc, 0xc0, 0x4f, 0xf3, 0x64, 0xd2, 0x39, 0x70, + 0xdb, 0xc1, 0xd4, 0xf6, 0xe1, 0x3f, 0x7a, 0x14, 0x00, 0xcf, 0xa9, 0x66, + 0x30, 0xad, 0x4e, 0x42, 0xdc, 0x0a, 0x01, 0x75, 0x3f, 0xa9, 0xd7, 0x1d, + 0x1e, 0x7d, 0x54, 0xb5, 0x99, 0x1c, 0x17, 0x02, 0xcd, 0x11, 0x6d, 0x9c, + 0x5c, 0xa4, 0xbe, 0x6f, 0x1c, 0xd7, 0xa9, 0xf2, 0xc4, 0xc2, 0xe3, 0xcc, + 0x3d, 0xfb, 0x24, 0xed, 0x21, 0x0f, 0x4c, 0x06, 0xa8, 0xb5, 0xa7, 0x5e, + 0xa3, 0xdd, 0x81, 0xf9, 0x13, 0xf3, 0x80, 0xc4, 0xef, 0xc4, 0x78, 0x25, + 0x1b, 0xd9, 0xc9, 0xda, 0xd6, 0x73, 0xcf, 0x2d, 0xa6, 0xcf, 0xb8, 0xf3, + 0x27, 0xfa, 0x81, 0x2b, 0xf5, 0x9a, 0x83, 0xf9, 0x7a, 0x84, 0x3c, 0xb5, + 0xfe, 0x73, 0x88, 0x10, 0x80, 0x74, 0x91, 0x9d, 0xc1, 0x00, 0xc5, 0x20, + 0x9a, 0xc7, 0xb2, 0x3c, 0x64, 0x92, 0x20, 0x3b, 0xeb, 0xfd, 0x9a, 0x37, + 0xab, 0x0d, 0x7c, 0xf4, 0x02, 0x75, 0x44, 0xd6, 0xc7, 0xd4, 0x0c, 0x1e, + 0x5d, 0x27, 0xa2, 0x06, 0xc9, 0x50, 0x46, 0x6a, 0xa0, 0x96, 0x44, 0x2d, + 0x81, 0x14, 0xae, 0x35, 0x48, 0x79, 0xa0, 0x16, 0x0c, 0xee, 0x0f, 0x37, + 0x36, 0x06, 0x98, 0x30, 0x48, 0x57, 0x12, 0x4f, 0x02, 0x54, 0xf4, 0x67, + 0x4e, 0x2c, 0xcb, 0x84, 0xa4, 0x40, 0xad, 0xcd, 0x28, 0x91, 0xfe, 0xc6, + 0x46, 0x5a, 0x41, 0x6e, 0x7d, 0x61, 0x88, 0xcd, 0xcc, 0x34, 0xcc, 0xce, + 0x56, 0x95, 0x8d, 0xee, 0x0f, 0x9b, 0x99, 0x55, 0xfb, 0xa6, 0x67, 0x80, + 0x19, 0x65, 0x93, 0x8f, 0x3f, 0x31, 0x53, 0xa5, 0x9a, 0xf3, 0xbe, 0x40, + 0xc0, 0x04, 0x55, 0x66, 0x75, 0xfc, 0x6a, 0x15, 0x26, 0xcc, 0xce, 0xaa, + 0xca, 0xc8, 0x6c, 0xb5, 0x9a, 0xf2, 0x08, 0x00, 0xaa, 0x13, 0x55, 0x02, + 0x4d, 0xb4, 0x9a, 0x98, 0x50, 0x00, 0xab, 0x89, 0xaa, 0x02, 0x5f, 0x05, + 0x81, 0x62, 0x17, 0x2c, 0xe8, 0xbc, 0x18, 0x98, 0x56, 0x40, 0x96, 0xae, + 0x01, 0x69, 0x51, 0x85, 0xe9, 0x1c, 0xb1, 0x6b, 0x7a, 0x42, 0xc1, 0xb5, + 0x7a, 0x35, 0xad, 0x33, 0x74, 0xd3, 0x8e, 0x23, 0xcc, 0x4e, 0x67, 0x79, + 0x35, 0xbe, 0x54, 0xf9, 0x75, 0xf9, 0xaa, 0xf4, 0x51, 0xc8, 0x0c, 0xc0, + 0x2b, 0xaf, 0x41, 0xe9, 0xa4, 0xf6, 0x3a, 0xba, 0xc9, 0x4f, 0x1e, 0xbe, + 0x35, 0x93, 0x8b, 0xb7, 0xfc, 0x3b, 0xc0, 0x4d, 0x6f, 0x65, 0xe2, 0x0b, + 0x5f, 0x4e, 0xfd, 0x19, 0x38, 0x98, 0xc9, 0xcb, 0xcb, 0xab, 0xc3, 0xd3, + 0x01, 0x32, 0x38, 0x61, 0xfa, 0xf1, 0x9f, 0x1c, 0x48, 0x6b, 0x40, 0xbf, + 0xba, 0xec, 0x81, 0x2c, 0x99, 0xb0, 0xbc, 0xf2, 0x1f, 0x57, 0x58, 0x2f, + 0x7e, 0x2f, 0xb4, 0x6b, 0x90, 0xa4, 0x94, 0x88, 0x8a, 0xa5, 0xec, 0x3a, + 0x06, 0xcc, 0xa5, 0x3f, 0x64, 0xd4, 0x91, 0xb9, 0xb1, 0x58, 0x0d, 0xdc, + 0x6b, 0x25, 0xca, 0x7e, 0x23, 0x6d, 0x04, 0xd3, 0x5a, 0x2f, 0x3f, 0x97, + 0x5b, 0xfe, 0xf4, 0x03, 0x20, 0xe6, 0x03, 0x41, 0x35, 0x9d, 0xff, 0x36, + 0xfe, 0xaa, 0x8f, 0x37, 0xea, 0x31, 0xfe, 0x81, 0x8f, 0xb2, 0xf8, 0xa9, + 0x87, 0x19, 0xff, 0xc0, 0x47, 0x01, 0x38, 0xba, 0x12, 0x72, 0xf7, 0x4e, + 0x97, 0xa3, 0x2b, 0x1a, 0xd3, 0xa9, 0xe1, 0x59, 0x47, 0x57, 0x42, 0xee, + 0xbd, 0xe7, 0x30, 0x0f, 0x3c, 0xf8, 0x50, 0x0a, 0xde, 0x32, 0xe1, 0x9b, + 0x2e, 0x43, 0x4b, 0xa6, 0xf9, 0x31, 0xdb, 0xa2, 0x22, 0xd2, 0x70, 0x00, + 0xa7, 0x42, 0x37, 0x30, 0xab, 0x25, 0xb1, 0x05, 0x84, 0x1d, 0x10, 0xfa, + 0x19, 0x20, 0xc9, 0x7f, 0xc8, 0xa9, 0x83, 0xba, 0x49, 0x74, 0xc0, 0xef, + 0x48, 0x7a, 0x7b, 0xf3, 0x1b, 0x26, 0x8e, 0x5e, 0xfa, 0xc0, 0x11, 0x14, + 0x2c, 0xea, 0x08, 0x70, 0x0f, 0x60, 0x97, 0xd4, 0xdd, 0xa8, 0xa1, 0x21, + 0x52, 0x75, 0x6d, 0x07, 0x70, 0xac, 0x04, 0xe6, 0x6e, 0x5d, 0x47, 0xa5, + 0x31, 0x5e, 0x12, 0x98, 0x56, 0xc0, 0x5d, 0xa8, 0x5e, 0x40, 0x5f, 0x8f, + 0x2f, 0x2d, 0xeb, 0xb2, 0x2c, 0x77, 0x54, 0xb6, 0x0e, 0xf5, 0x20, 0xa8, + 0x42, 0x60, 0xae, 0xa3, 0x00, 0x5a, 0x3e, 0x70, 0xa4, 0x94, 0x41, 0xae, + 0x3c, 0x14, 0x64, 0x4b, 0x74, 0x24, 0x0f, 0x09, 0x8b, 0xc3, 0x24, 0x1c, + 0xee, 0x48, 0x6a, 0x3a, 0x6f, 0x56, 0x09, 0x1e, 0xcc, 0x81, 0xae, 0x96, + 0x3b, 0x2a, 0xef, 0xb1, 0x8e, 0x7f, 0x56, 0x2f, 0xcd, 0xd9, 0x99, 0xeb, + 0x90, 0xe6, 0xd3, 0x94, 0xf9, 0xae, 0x4e, 0xf6, 0xb9, 0x2a, 0x63, 0xdf, + 0xd6, 0x1f, 0xb7, 0xf2, 0x4b, 0xb2, 0x6b, 0x8c, 0xec, 0xbe, 0x92, 0x6a, + 0x07, 0x1b, 0xb8, 0xd6, 0x66, 0xfa, 0xb7, 0x5f, 0x0f, 0x5f, 0x65, 0x45, + 0x83, 0x9c, 0x0c, 0xa8, 0xc9, 0xc0, 0xa7, 0x20, 0x03, 0x36, 0x6d, 0xd1, + 0xe0, 0x27, 0x03, 0x8f, 0x9a, 0x9c, 0x9c, 0x04, 0x0d, 0x77, 0x32, 0xda, + 0xb9, 0x77, 0x1f, 0x3b, 0xa1, 0x0b, 0x4e, 0x65, 0xf6, 0xf7, 0xfa, 0x34, + 0xbe, 0x2e, 0xe6, 0xf2, 0xb1, 0xc5, 0xbd, 0x8a, 0x6d, 0xdb, 0xb6, 0xa5, + 0xd0, 0x28, 0x03, 0xbd, 0x9a, 0xdc, 0xab, 0x00, 0x55, 0xc6, 0xd7, 0x8a, + 0x06, 0x4d, 0x19, 0xf8, 0x55, 0x1e, 0x66, 0xd5, 0x9b, 0xd7, 0x37, 0xda, + 0xe7, 0x16, 0xf7, 0x2a, 0x5e, 0x79, 0xe5, 0x95, 0xae, 0xf2, 0x1b, 0x08, + 0xd6, 0xe4, 0xe4, 0x64, 0x5a, 0xf6, 0xef, 0xd5, 0x31, 0x5d, 0x4f, 0x8d, + 0xa6, 0x8f, 0xd0, 0xa0, 0x7b, 0x1b, 0x05, 0x64, 0x73, 0x5a, 0x02, 0xfb, + 0x66, 0x8f, 0x78, 0x0d, 0xec, 0x11, 0x68, 0xae, 0x06, 0x4c, 0xde, 0x36, + 0x4e, 0xf3, 0x54, 0x93, 0xf2, 0x88, 0xcb, 0xfe, 0xea, 0x2e, 0x96, 0x4e, + 0xcc, 0x53, 0xdf, 0x57, 0x07, 0x61, 0x13, 0x9f, 0x6f, 0xe0, 0x5c, 0xed, + 0xd1, 0x3c, 0xdf, 0xc0, 0x5d, 0xb5, 0x08, 0x65, 0x82, 0xbb, 0xc5, 0x02, + 0x29, 0xb1, 0x62, 0xb0, 0xf7, 0x2b, 0x5f, 0x62, 0x04, 0xe4, 0xaa, 0x64, + 0xfc, 0x96, 0x29, 0xd5, 0xb7, 0x52, 0xb1, 0xf1, 0x65, 0xc4, 0xdc, 0xb3, + 0xc7, 0xa8, 0xef, 0xab, 0x13, 0x8f, 0x40, 0x12, 0x44, 0xb4, 0x07, 0x40, + 0x54, 0xcb, 0xa5, 0x32, 0xf5, 0x7d, 0x75, 0xc4, 0x88, 0x1e, 0xc3, 0xef, + 0xc4, 0x90, 0x40, 0xf3, 0x8c, 0x8f, 0x0c, 0x23, 0x6a, 0xd7, 0xd6, 0x52, + 0x60, 0xed, 0xd8, 0xad, 0x93, 0x24, 0x41, 0x88, 0x7f, 0x5e, 0x03, 0x43, + 0x5b, 0x12, 0xb9, 0x16, 0x22, 0x46, 0x5c, 0x5c, 0xc7, 0x25, 0x8e, 0xb2, + 0x3a, 0x2c, 0x5c, 0x4b, 0xb0, 0x1d, 0xc1, 0x9e, 0xeb, 0xc7, 0x89, 0x3b, + 0x09, 0xd1, 0x8a, 0x8f, 0xeb, 0xb8, 0x94, 0x2b, 0x2e, 0xc3, 0x00, 0xa5, + 0xa2, 0x04, 0x71, 0x2b, 0xce, 0xc6, 0x92, 0x7b, 0xc7, 0xdf, 0x73, 0x75, + 0xdb, 0xae, 0x11, 0x0d, 0x7d, 0xee, 0x08, 0x05, 0xc5, 0xd2, 0xd5, 0x64, + 0x95, 0x98, 0xa5, 0x28, 0x41, 0x94, 0x04, 0xcd, 0xd3, 0xcb, 0x44, 0x6b, + 0x11, 0x9e, 0x6e, 0x87, 0xfa, 0x32, 0xc2, 0xb2, 0x2c, 0x3c, 0xfd, 0xb0, + 0x23, 0x2c, 0x1b, 0x19, 0x49, 0x10, 0x8b, 0xb0, 0x55, 0x3d, 0x1b, 0x25, + 0x2d, 0x75, 0xef, 0x4d, 0xcc, 0x87, 0xed, 0x2e, 0x63, 0x3c, 0x2a, 0x0f, + 0x75, 0xea, 0x05, 0x44, 0xad, 0x46, 0xe7, 0x53, 0xa8, 0xd5, 0x57, 0x56, + 0x12, 0x7e, 0x72, 0xa7, 0x95, 0xee, 0x7f, 0xfb, 0x75, 0x3f, 0xdb, 0x05, + 0xa6, 0xea, 0xd5, 0xdb, 0xaf, 0xfb, 0x59, 0xfe, 0xe6, 0xe5, 0xbf, 0xea, + 0x4b, 0x67, 0x10, 0x84, 0x2a, 0xaf, 0xab, 0x7e, 0xfc, 0x27, 0x53, 0x7f, + 0x4b, 0x5f, 0x7c, 0x39, 0x0d, 0xff, 0xeb, 0xe7, 0x4f, 0x74, 0x01, 0xb4, + 0xf2, 0xe0, 0xad, 0x61, 0x79, 0x00, 0x05, 0xdf, 0x7a, 0xfb, 0x75, 0x0a, + 0xb4, 0x95, 0x07, 0x74, 0xe5, 0x61, 0x5f, 0x7f, 0xf3, 0xf2, 0x5f, 0xf5, + 0xf9, 0xfb, 0xf2, 0xb9, 0x0b, 0x5d, 0xe5, 0x1e, 0x94, 0xdf, 0x41, 0x69, + 0x0e, 0xcb, 0xc7, 0x30, 0xa8, 0x58, 0x9f, 0xa6, 0xab, 0x30, 0x1b, 0xc0, + 0x42, 0x55, 0x6d, 0x57, 0x03, 0xd5, 0x10, 0x9d, 0x08, 0xba, 0x60, 0x5a, + 0x54, 0x03, 0xf5, 0x77, 0xd5, 0x55, 0x1b, 0xfb, 0x2c, 0x54, 0xa8, 0x50, + 0xa1, 0x42, 0x85, 0x0a, 0x15, 0x2a, 0x54, 0xa8, 0x50, 0xa1, 0x42, 0x85, + 0x0a, 0x15, 0x2a, 0x54, 0xa8, 0x50, 0xa1, 0x42, 0x85, 0x0a, 0x15, 0x2a, + 0x54, 0xa8, 0x50, 0xa1, 0x42, 0x43, 0x55, 0x40, 0xb5, 0x0a, 0x15, 0x2a, + 0x54, 0xa8, 0x50, 0xa1, 0xef, 0x95, 0x6e, 0xd1, 0x10, 0xac, 0x9d, 0x82, + 0x38, 0x48, 0x70, 0x46, 0x5c, 0xa2, 0xb5, 0xb0, 0xef, 0xab, 0xc8, 0x42, + 0x94, 0x51, 0x93, 0xb9, 0x24, 0xe4, 0x5e, 0x4e, 0x6e, 0x9b, 0x17, 0x66, + 0xc9, 0x5e, 0x66, 0xb6, 0x1c, 0x57, 0x81, 0xad, 0x2a, 0x6a, 0x22, 0x47, + 0x3a, 0x91, 0xc2, 0xbc, 0x48, 0x5b, 0x92, 0x58, 0x15, 0x01, 0xa3, 0x2e, + 0xe1, 0xf9, 0x26, 0x24, 0x43, 0x50, 0x0e, 0x42, 0xe3, 0x04, 0xcc, 0x8b, + 0xf1, 0x39, 0x19, 0xd0, 0x4c, 0xa2, 0xa1, 0x37, 0x96, 0x65, 0xa7, 0xeb, + 0x58, 0x20, 0x34, 0x44, 0x28, 0xf1, 0x13, 0x05, 0xd0, 0x42, 0x20, 0x3b, + 0x12, 0xd9, 0x51, 0x2f, 0x67, 0xc6, 0x49, 0x06, 0xe4, 0xf2, 0x1c, 0x0f, + 0x61, 0x59, 0xfd, 0x2f, 0xc9, 0x9b, 0x2f, 0xc7, 0x97, 0x04, 0xf5, 0x7d, + 0x63, 0x2c, 0x3e, 0x37, 0x87, 0x9f, 0xc4, 0x94, 0x2d, 0xdb, 0x1c, 0x94, + 0x2c, 0xab, 0x25, 0x05, 0xd4, 0x2a, 0x57, 0xca, 0x90, 0x87, 0x4c, 0x75, + 0x04, 0xb1, 0x8c, 0x49, 0x2e, 0x45, 0x78, 0x3b, 0x6b, 0xf8, 0x2b, 0x4d, + 0xfd, 0x35, 0xf6, 0x38, 0x3d, 0x26, 0x89, 0x10, 0x88, 0x11, 0x57, 0x1d, + 0xdb, 0x2e, 0x20, 0x8f, 0x24, 0xd1, 0x2f, 0xb4, 0xcb, 0xb5, 0xcb, 0x03, + 0x0e, 0x88, 0x9d, 0x3a, 0x6f, 0xb7, 0xc4, 0xf0, 0x8c, 0x3e, 0x2c, 0xd7, + 0xaa, 0x30, 0x67, 0xd4, 0x22, 0x04, 0x9a, 0x2b, 0xa1, 0xfe, 0xba, 0x7d, + 0x26, 0xcb, 0xd2, 0x20, 0xb4, 0x8e, 0x4c, 0x01, 0x4e, 0x40, 0x0a, 0xb7, + 0xca, 0x2b, 0x49, 0x24, 0xed, 0xde, 0x56, 0x9c, 0x30, 0xfb, 0x12, 0x84, + 0x10, 0x03, 0xe3, 0xc1, 0xc6, 0xd0, 0xa8, 0x7c, 0xbc, 0xe6, 0x4a, 0x48, + 0x6d, 0xa7, 0x4b, 0x63, 0x45, 0xbf, 0x82, 0xde, 0x51, 0x89, 0x58, 0x66, + 0xf2, 0x8e, 0x99, 0x8c, 0x30, 0x04, 0xa8, 0x65, 0x64, 0x5b, 0xa2, 0x3f, + 0xdd, 0x8e, 0x5c, 0xb7, 0x8c, 0x1b, 0xe5, 0xb5, 0x37, 0xcd, 0x6f, 0xf7, + 0x98, 0x6e, 0x26, 0xbd, 0xde, 0x78, 0xce, 0xa8, 0xfe, 0x22, 0xec, 0xb5, + 0x02, 0xcc, 0xdc, 0xb1, 0xdc, 0x75, 0xdd, 0x37, 0x03, 0xa0, 0x47, 0xc3, + 0x80, 0x5b, 0x97, 0x6b, 0x53, 0xbb, 0x7e, 0xf0, 0x24, 0x64, 0xf3, 0x22, + 0x71, 0xaf, 0x44, 0xa9, 0x07, 0x2c, 0x56, 0x81, 0xf1, 0x1b, 0xfb, 0xd1, + 0x04, 0x1e, 0x9e, 0x9e, 0x5c, 0xd7, 0x2f, 0x63, 0xef, 0xe1, 0x75, 0x85, + 0x3f, 0xf9, 0xd4, 0x60, 0xa8, 0x42, 0x1e, 0x80, 0x64, 0x74, 0x62, 0x61, + 0xf0, 0x84, 0xbb, 0xfd, 0x13, 0xfb, 0xfb, 0x20, 0x77, 0x00, 0xc7, 0x9e, + 0x1e, 0x0c, 0xa5, 0x18, 0xe4, 0x7b, 0x98, 0xfd, 0xd4, 0x3b, 0xa7, 0x06, + 0x58, 0x42, 0xf0, 0xf9, 0x80, 0x68, 0x1d, 0x70, 0x9e, 0xd8, 0xad, 0xeb, + 0xd2, 0x5b, 0x62, 0x78, 0x56, 0xad, 0xe6, 0xaf, 0x6b, 0x27, 0x07, 0x5b, + 0x1b, 0x94, 0x9f, 0x7c, 0x58, 0xef, 0xfe, 0xcb, 0xb5, 0xff, 0x6e, 0xa4, + 0xf1, 0xbd, 0xb4, 0x7f, 0xa3, 0x7c, 0x1b, 0x30, 0x57, 0x1e, 0xd0, 0x05, + 0xdd, 0xb0, 0x34, 0x51, 0x11, 0x24, 0x6b, 0x09, 0xd6, 0x48, 0xf6, 0xa2, + 0xb4, 0xa3, 0xbf, 0xfa, 0x9c, 0xbf, 0xae, 0xb7, 0x5e, 0xab, 0x02, 0xb7, + 0x8f, 0x56, 0x38, 0xe6, 0x27, 0xbc, 0xe9, 0x4d, 0x8f, 0x74, 0xa5, 0xf9, + 0x2d, 0x3d, 0x67, 0xfc, 0x4d, 0x6f, 0xca, 0xc2, 0xe6, 0xce, 0x9d, 0x03, + 0xe0, 0xeb, 0x7c, 0x93, 0x5f, 0xbc, 0xf7, 0x60, 0xba, 0x34, 0x61, 0x8f, + 0x3e, 0xf7, 0x5c, 0x5f, 0xd8, 0x8f, 0xe9, 0x2f, 0x96, 0x03, 0x3c, 0xfa, + 0xdc, 0x73, 0x7d, 0xf1, 0x3f, 0xf4, 0xe1, 0x0f, 0x73, 0xfc, 0xf8, 0x71, + 0x3e, 0xf4, 0xc9, 0x4f, 0xf6, 0x1d, 0x93, 0x61, 0x7a, 0xc7, 0x06, 0xfb, + 0xcf, 0xeb, 0x7c, 0x5e, 0x8e, 0xce, 0x6d, 0xc2, 0xef, 0xf7, 0x9b, 0xce, + 0x9f, 0x3b, 0xd7, 0x07, 0x02, 0xdb, 0x3e, 0xaa, 0xce, 0xeb, 0xd6, 0x6b, + 0x2b, 0x30, 0xaf, 0x4e, 0xa2, 0x55, 0x51, 0x75, 0xb8, 0x53, 0x81, 0x3b, + 0xab, 0x0e, 0x8f, 0x9d, 0x8a, 0xb8, 0xf3, 0x7a, 0x87, 0x27, 0xf6, 0x3f, + 0xc4, 0xd4, 0xd3, 0xef, 0x03, 0xe0, 0xd8, 0x2a, 0x1c, 0x79, 0xe2, 0x4f, + 0x38, 0x74, 0xf0, 0x7d, 0x6f, 0x40, 0xce, 0x2e, 0x1f, 0xa8, 0x95, 0xfe, + 0x82, 0x37, 0x09, 0x12, 0xfc, 0xc7, 0x68, 0x7f, 0xb9, 0x40, 0xad, 0xf4, + 0xba, 0xae, 0x64, 0x10, 0x0f, 0x75, 0xae, 0xcb, 0x38, 0x96, 0x00, 0x03, + 0x5a, 0x8a, 0x25, 0xac, 0xf9, 0x70, 0x6d, 0x0d, 0x7a, 0x26, 0xcd, 0x71, + 0x66, 0x19, 0x06, 0xcf, 0x93, 0xb8, 0x02, 0xf5, 0xff, 0x76, 0xc2, 0xd5, + 0x6c, 0x12, 0xa3, 0x3b, 0xea, 0xf2, 0x2f, 0xf7, 0x6c, 0x02, 0xa8, 0xf5, + 0xbb, 0x77, 0xc3, 0x2d, 0xea, 0xbe, 0x76, 0x0f, 0xc0, 0xf1, 0x1c, 0x18, + 0x60, 0x69, 0x09, 0xc6, 0xc6, 0xd4, 0xba, 0x28, 0x77, 0xc7, 0xfb, 0xcc, + 0x63, 0xdf, 0x9f, 0x40, 0xad, 0xff, 0xf2, 0x17, 0x00, 0x1c, 0x92, 0x6d, + 0x38, 0xbe, 0x01, 0x1c, 0x4c, 0xb6, 0xe1, 0xe9, 0x27, 0xfb, 0xca, 0xe1, + 0x58, 0xa6, 0xad, 0x9a, 0x85, 0xa7, 0xf7, 0x6b, 0xc7, 0xe1, 0xe0, 0xee, + 0x98, 0xf6, 0x9a, 0xa4, 0x3c, 0xa2, 0xc2, 0xcc, 0xba, 0x18, 0x9b, 0xa4, + 0x81, 0xcf, 0xb2, 0x06, 0xd0, 0x44, 0x32, 0xc2, 0xd1, 0x13, 0x9a, 0xcc, + 0x7a, 0x24, 0x23, 0x1c, 0xab, 0xca, 0x64, 0xdd, 0x45, 0x74, 0x0e, 0xb0, + 0xf4, 0xac, 0xc4, 0x6f, 0x25, 0x78, 0x7a, 0x92, 0x94, 0xbf, 0xe6, 0xe3, + 0x8d, 0x78, 0xf8, 0x6b, 0xca, 0x47, 0x6d, 0xc4, 0x23, 0x7c, 0xf1, 0x28, + 0x1f, 0xfb, 0xe5, 0x03, 0x84, 0x27, 0xe6, 0x34, 0x10, 0x01, 0xec, 0x8a, + 0x9b, 0xae, 0xbb, 0x96, 0x4b, 0x98, 0x64, 0xeb, 0x47, 0x57, 0x24, 0x1f, + 0xff, 0x8f, 0x53, 0xc8, 0x85, 0xcf, 0xd1, 0x0e, 0xbb, 0x7f, 0xe9, 0x65, + 0x57, 0xa4, 0x61, 0x65, 0x57, 0xf0, 0xf1, 0xa7, 0xca, 0x1c, 0x78, 0xc2, + 0x63, 0xee, 0xf3, 0x3e, 0xc1, 0xeb, 0x6a, 0xb2, 0x57, 0x75, 0x4b, 0x8d, + 0xe0, 0xf5, 0x66, 0xd7, 0x12, 0x40, 0x3e, 0x05, 0xc9, 0xee, 0xbb, 0xa9, + 0x59, 0x16, 0xcd, 0x24, 0xa1, 0xa6, 0x9f, 0x11, 0x87, 0xad, 0x4f, 0x9e, + 0x3f, 0x8c, 0x65, 0xb9, 0x24, 0x49, 0xa8, 0x00, 0xcf, 0x40, 0x98, 0x84, + 0xb8, 0x03, 0xd6, 0x8f, 0xae, 0x48, 0x3e, 0x3a, 0x61, 0x20, 0xab, 0x60, + 0x7b, 0x82, 0xd8, 0xd7, 0xcf, 0x08, 0xdb, 0x05, 0xf2, 0x42, 0xf7, 0xfa, + 0x7d, 0x22, 0x6b, 0x6f, 0x39, 0x56, 0x95, 0x28, 0x09, 0xba, 0xd6, 0xd3, + 0x63, 0xbd, 0x50, 0x23, 0xd9, 0x91, 0xb5, 0xdb, 0xbc, 0x8a, 0x85, 0x6f, + 0x9e, 0x21, 0x2b, 0x02, 0x27, 0x7a, 0x2c, 0x3b, 0xbf, 0xfa, 0xe7, 0x72, + 0x5d, 0x65, 0x2b, 0x00, 0x3f, 0x51, 0xd9, 0x4e, 0xfc, 0x46, 0xb0, 0x18, + 0x0a, 0x7d, 0x5f, 0xe8, 0x27, 0x2a, 0x6a, 0xb2, 0xdb, 0x75, 0x95, 0xad, + 0xfc, 0xad, 0x6e, 0x73, 0xe5, 0xef, 0xd7, 0x8d, 0x66, 0x82, 0xb5, 0xa3, + 0x86, 0x5d, 0xb1, 0x58, 0x0e, 0x12, 0xbc, 0x6a, 0x15, 0xdb, 0xaa, 0x13, + 0x27, 0x09, 0xb6, 0x65, 0xa5, 0x70, 0x2d, 0x20, 0x0d, 0xf3, 0xda, 0xff, + 0x5e, 0x57, 0x00, 0x00, 0x20, 0x00, 0x49, 0x44, 0x41, 0x54, 0xf5, 0xb5, + 0x6e, 0xed, 0xf0, 0x48, 0xee, 0x9d, 0xc3, 0xda, 0xe1, 0xe1, 0x3a, 0x16, + 0x76, 0xc5, 0xe6, 0xec, 0x79, 0x1f, 0x9a, 0x0a, 0xb0, 0x15, 0x9e, 0x8e, + 0x48, 0x92, 0x18, 0xaf, 0x5a, 0xc3, 0x1a, 0x71, 0x73, 0x70, 0x2d, 0x75, + 0x6d, 0x45, 0xab, 0x21, 0xd6, 0x88, 0xcd, 0xc3, 0xbf, 0xaf, 0xe0, 0x27, + 0xe1, 0x4a, 0x93, 0xfd, 0x37, 0x4d, 0x12, 0xad, 0xc6, 0xd4, 0x6f, 0x9a, + 0xc4, 0x75, 0xd5, 0x75, 0xd2, 0x38, 0xb9, 0x4c, 0x7d, 0xdf, 0x1e, 0x22, + 0x0d, 0xa1, 0x02, 0xa8, 0xdf, 0x34, 0x99, 0xe6, 0x2b, 0x8a, 0x14, 0x84, + 0x0b, 0x40, 0xee, 0xde, 0x83, 0xe3, 0x58, 0x2c, 0x3d, 0xb3, 0x44, 0xf3, + 0x8c, 0x83, 0x43, 0x83, 0xfd, 0x37, 0x09, 0xa2, 0x48, 0xe2, 0x38, 0x16, + 0xb5, 0xf7, 0xde, 0x4e, 0xb3, 0xd9, 0xa0, 0x56, 0xab, 0x63, 0x5d, 0xeb, + 0xd2, 0x78, 0x4e, 0xdd, 0xc3, 0x14, 0x48, 0x2b, 0xa2, 0x76, 0xd3, 0x18, + 0x61, 0x14, 0x11, 0x9e, 0x6a, 0x42, 0xee, 0x39, 0xf1, 0xe8, 0x6f, 0xa9, + 0x6b, 0xaf, 0x79, 0xc6, 0xa1, 0xb6, 0xba, 0x84, 0xe3, 0x58, 0x29, 0xd0, + 0xcb, 0xb4, 0x8f, 0xad, 0x6b, 0x5d, 0x2c, 0x20, 0x3a, 0xde, 0xc0, 0xdd, + 0xea, 0x11, 0x36, 0xfc, 0xd4, 0xe6, 0xd0, 0x83, 0xf3, 0x24, 0x8c, 0x53, + 0xdb, 0x2d, 0x89, 0xf4, 0x3d, 0x2b, 0x5c, 0x69, 0x12, 0x9e, 0x81, 0x68, + 0xb5, 0x46, 0xe3, 0x39, 0x70, 0x46, 0xc3, 0x01, 0xc0, 0x5a, 0x89, 0xeb, + 0xaa, 0x63, 0xe7, 0xba, 0x16, 0xf3, 0x9f, 0xf1, 0x49, 0x92, 0x18, 0xcb, + 0xb2, 0x69, 0xbe, 0xb8, 0xa8, 0x81, 0x5a, 0x12, 0x77, 0xc4, 0xc5, 0x59, + 0xeb, 0x3e, 0xbf, 0xe6, 0xbc, 0x9b, 0xdf, 0x41, 0xf9, 0x32, 0xaf, 0x6b, + 0xe7, 0xdd, 0x6f, 0x1a, 0xba, 0xaf, 0x75, 0xf6, 0x5b, 0xb4, 0xce, 0x6e, + 0xec, 0xa3, 0xbc, 0xb1, 0xc9, 0x15, 0x69, 0xbd, 0xbc, 0x01, 0x44, 0x03, + 0xa0, 0x54, 0xbd, 0xfa, 0x4e, 0xe5, 0x0d, 0xd6, 0xcf, 0xdf, 0x1b, 0x91, + 0xb7, 0x41, 0xd7, 0x75, 0xfe, 0x99, 0x6b, 0x8d, 0x06, 0x0a, 0x7b, 0xa0, + 0x7a, 0x43, 0x43, 0x12, 0x6a, 0x4e, 0x3d, 0x07, 0xcd, 0x4a, 0x70, 0x9d, + 0x7a, 0x0a, 0xd6, 0x02, 0x0d, 0xbd, 0x72, 0x00, 0x14, 0x84, 0x2a, 0x04, + 0x2c, 0xdb, 0x62, 0x17, 0x70, 0xb6, 0xd9, 0x00, 0xdb, 0x40, 0xb2, 0xc0, + 0x6f, 0x86, 0x34, 0xed, 0x3a, 0xae, 0xa3, 0x20, 0x5b, 0x71, 0x9c, 0x30, + 0x5e, 0xab, 0xa7, 0x00, 0x2c, 0x65, 0xa7, 0xfd, 0xe4, 0xc2, 0x42, 0x0d, + 0xb3, 0x42, 0xc3, 0xac, 0x54, 0x4e, 0xba, 0xed, 0x41, 0xf5, 0xcd, 0xee, + 0xea, 0x79, 0x8c, 0x35, 0x79, 0x8a, 0x63, 0xb0, 0x6d, 0xe5, 0x03, 0xd4, + 0x04, 0xf6, 0xc5, 0x13, 0xe0, 0xd5, 0xfc, 0xae, 0x34, 0x3d, 0xc7, 0xc5, + 0x75, 0x3c, 0xce, 0x36, 0xc1, 0xb6, 0x4d, 0xfa, 0x06, 0xf5, 0x65, 0xa4, + 0xe0, 0x5f, 0x61, 0xe4, 0xf3, 0xc8, 0x7e, 0xf8, 0x50, 0x6f, 0xf3, 0x29, + 0x0f, 0xd2, 0xd2, 0xeb, 0x79, 0xd8, 0xd5, 0x40, 0x28, 0x56, 0xce, 0xfe, + 0x72, 0xc0, 0x58, 0xf9, 0x34, 0xcd, 0x31, 0xb1, 0x6e, 0x80, 0xed, 0xab, + 0x03, 0x9e, 0xb9, 0x4c, 0xdb, 0xac, 0x6a, 0xd1, 0x68, 0x85, 0x2c, 0x3e, + 0xbf, 0x48, 0x59, 0x28, 0x98, 0x96, 0x25, 0xda, 0x58, 0x02, 0xfc, 0x35, + 0xb0, 0x4e, 0x2b, 0xd0, 0xd6, 0xbb, 0xde, 0x73, 0x07, 0x9f, 0xd3, 0x40, + 0xce, 0xa5, 0xa5, 0x79, 0x3e, 0xf8, 0xc1, 0xdb, 0x79, 0xfc, 0x33, 0x8f, + 0x33, 0xf7, 0xdc, 0x13, 0x69, 0xb2, 0xde, 0x88, 0xaa, 0x6f, 0x65, 0x27, + 0xa6, 0x8c, 0x83, 0x1f, 0x05, 0x38, 0xba, 0x3f, 0x3b, 0xea, 0xc0, 0xfc, + 0x09, 0xd5, 0x4e, 0x2e, 0x57, 0x1c, 0xfc, 0x28, 0xa2, 0xe6, 0x75, 0xf7, + 0x65, 0x19, 0x20, 0x96, 0x7f, 0x3e, 0x6b, 0x93, 0xcb, 0xd7, 0x43, 0xc4, + 0x16, 0x17, 0xf1, 0xcd, 0x2c, 0x2c, 0x4c, 0x24, 0xf6, 0x56, 0x8f, 0xf8, + 0x92, 0x4f, 0xb3, 0x11, 0xc2, 0x9b, 0xd5, 0xfe, 0x30, 0xd7, 0x9f, 0x98, + 0xb7, 0x4f, 0x7d, 0xb5, 0xdb, 0x29, 0x28, 0xcb, 0x2a, 0x25, 0xcc, 0x1f, + 0x57, 0xe9, 0xcd, 0x5f, 0xf0, 0x71, 0x9d, 0xee, 0xe7, 0x0e, 0x3f, 0x0a, + 0xb0, 0x44, 0xf7, 0x73, 0xe2, 0x93, 0xcf, 0x1e, 0xe3, 0xee, 0x5f, 0xfa, + 0x20, 0x8f, 0x3e, 0xfa, 0x24, 0x71, 0x2b, 0xc4, 0xae, 0xb8, 0x3c, 0xfa, + 0xe8, 0x93, 0x4c, 0xdd, 0x7a, 0x3b, 0xf1, 0x56, 0x09, 0x12, 0xe6, 0x57, + 0xe6, 0xb1, 0x23, 0x48, 0x62, 0x09, 0x36, 0x08, 0x29, 0x48, 0xb6, 0xaa, + 0xb3, 0x61, 0x5d, 0xb2, 0x48, 0x74, 0xbf, 0x95, 0x25, 0x24, 0x89, 0x14, + 0xcc, 0x2f, 0xf9, 0xa4, 0x4f, 0x56, 0x23, 0x12, 0x12, 0xb4, 0x8d, 0xcb, + 0xd4, 0xcd, 0xe3, 0xcc, 0x3d, 0xb7, 0xa8, 0xa1, 0xf9, 0xdd, 0x40, 0xad, + 0x30, 0x01, 0xa4, 0xa4, 0x6c, 0xb9, 0x34, 0x9a, 0x41, 0x1a, 0xbe, 0xbf, + 0xda, 0xdf, 0x47, 0xba, 0x47, 0xc3, 0x69, 0xdc, 0x8a, 0x43, 0x33, 0xc9, + 0xf5, 0xd1, 0x95, 0x1c, 0x9c, 0x91, 0x3d, 0x44, 0xd1, 0x22, 0x0a, 0x78, + 0x16, 0xea, 0x0f, 0x8a, 0x34, 0xa0, 0xe4, 0x40, 0x27, 0x42, 0x94, 0xea, + 0x58, 0xc2, 0x22, 0x6a, 0x9d, 0x48, 0xc3, 0x94, 0x6a, 0x28, 0x6c, 0xc9, + 0x59, 0xaa, 0xa3, 0xe3, 0x44, 0x6b, 0x3e, 0x52, 0x86, 0x54, 0x47, 0xc7, + 0x09, 0x56, 0xe7, 0xc8, 0xc3, 0xb4, 0x2c, 0x31, 0x86, 0x28, 0xd9, 0x44, + 0xad, 0x45, 0x2c, 0x51, 0xd3, 0xeb, 0xfa, 0x99, 0xa9, 0x03, 0x60, 0x61, + 0x5b, 0x16, 0xb2, 0xe3, 0x90, 0xc8, 0x88, 0xda, 0xa8, 0xa7, 0xd7, 0x37, + 0x09, 0x9a, 0x2a, 0x95, 0xfb, 0x9f, 0x6b, 0x4b, 0x1b, 0xd7, 0xce, 0x49, + 0x92, 0xa4, 0x63, 0x36, 0xf9, 0x75, 0x23, 0x03, 0xa9, 0xe9, 0xb5, 0xcf, + 0xdb, 0xf6, 0xda, 0xf4, 0x4a, 0x02, 0x32, 0x89, 0x10, 0x96, 0x85, 0x4c, + 0x12, 0x0d, 0xd2, 0x02, 0x5a, 0x28, 0xb0, 0x43, 0xaf, 0x7d, 0xde, 0xa6, + 0x67, 0xbb, 0x6b, 0x5f, 0x47, 0xe2, 0x6a, 0x70, 0xdd, 0x9e, 0x8a, 0x45, + 0x43, 0xdb, 0xe7, 0xeb, 0xf0, 0x46, 0x90, 0xa4, 0x20, 0x29, 0x05, 0xa0, + 0xaa, 0xa6, 0x7e, 0x17, 0x82, 0x00, 0xc3, 0x94, 0x9a, 0x5d, 0xc8, 0xa0, + 0x55, 0xa0, 0x00, 0x57, 0x46, 0x41, 0x80, 0x82, 0x09, 0x54, 0x15, 0x24, + 0x6a, 0x7a, 0x06, 0x08, 0x14, 0xe8, 0xa9, 0x3a, 0x31, 0xad, 0xe2, 0xcf, + 0xce, 0x92, 0x73, 0xad, 0x9d, 0xc0, 0xc2, 0x0c, 0xcc, 0xcc, 0x54, 0x59, + 0x98, 0x0d, 0x74, 0x1e, 0x02, 0x15, 0x1f, 0x65, 0x3c, 0x3d, 0x11, 0xe8, + 0xbc, 0xe8, 0x7c, 0x4c, 0x57, 0x99, 0x5d, 0x50, 0xf9, 0x5a, 0x98, 0x06, + 0x66, 0x60, 0x62, 0x5a, 0xe5, 0x21, 0xcb, 0x7b, 0xa0, 0xd3, 0xcc, 0xf9, + 0x9d, 0x56, 0x50, 0xaf, 0xd9, 0x99, 0x1c, 0x90, 0x6b, 0x06, 0x66, 0x75, + 0x8c, 0x69, 0xe0, 0xc0, 0x0c, 0x4c, 0xdc, 0x05, 0x1f, 0xfb, 0xb5, 0x43, + 0x4c, 0x7f, 0xfc, 0x88, 0xf2, 0x13, 0x28, 0x7e, 0x42, 0xaa, 0xaa, 0x86, + 0x69, 0x69, 0x2d, 0x4c, 0x68, 0x7f, 0xb3, 0xfa, 0x18, 0xe5, 0x6c, 0xf3, + 0xc0, 0x2b, 0x55, 0x16, 0x5d, 0xa6, 0x85, 0x40, 0x95, 0x4e, 0xfb, 0x9a, + 0x5d, 0xe8, 0x06, 0x6f, 0xa5, 0x20, 0x30, 0xe0, 0xc3, 0xf9, 0x0e, 0xbd, + 0xff, 0x2b, 0x03, 0x6a, 0xe5, 0x7d, 0x57, 0xab, 0x30, 0x3b, 0x0b, 0x3f, + 0x55, 0x5d, 0xbf, 0xdf, 0xac, 0xaf, 0x73, 0x66, 0x1d, 0xa0, 0x16, 0x30, + 0x10, 0x94, 0xb5, 0xd9, 0x30, 0x4a, 0x82, 0xae, 0x60, 0x3d, 0x6e, 0x69, + 0x55, 0xac, 0xb4, 0xfd, 0x69, 0x55, 0xc8, 0xc6, 0xf4, 0x5a, 0x6a, 0x8c, + 0xcc, 0x8c, 0x83, 0x48, 0xd9, 0x33, 0xce, 0xd2, 0x91, 0x24, 0x49, 0x94, + 0x5e, 0x5b, 0x42, 0x0c, 0x18, 0xa3, 0xec, 0x2d, 0x5b, 0x1e, 0xa6, 0x35, + 0xe4, 0x43, 0x21, 0xeb, 0xe9, 0x8a, 0xca, 0xdf, 0xc9, 0x00, 0x5b, 0xe6, + 0xfa, 0x2f, 0x93, 0x3d, 0xd7, 0xc4, 0xad, 0x04, 0xff, 0x7f, 0x3e, 0x88, + 0xe7, 0xb8, 0x84, 0xbf, 0xf2, 0x31, 0x92, 0x24, 0xc1, 0x1d, 0x71, 0x78, + 0xcc, 0x75, 0xf1, 0xcf, 0x35, 0x71, 0x2d, 0x0b, 0xca, 0x59, 0xbd, 0xf4, + 0x30, 0xaa, 0xb7, 0xeb, 0xe1, 0x7f, 0x93, 0x41, 0xb5, 0x60, 0x70, 0xbf, + 0xd9, 0x7a, 0xe3, 0x5c, 0x79, 0xd8, 0x7d, 0x17, 0x68, 0x4b, 0x08, 0x12, + 0x14, 0x28, 0x4b, 0xa6, 0x1f, 0x7a, 0x12, 0xc4, 0x80, 0xe8, 0x1b, 0xbd, + 0x03, 0x0b, 0x49, 0x0d, 0x41, 0xa3, 0xa3, 0x10, 0xfa, 0x9e, 0x06, 0xc4, + 0x34, 0x3a, 0x0a, 0x56, 0x05, 0x0a, 0x58, 0x75, 0xa4, 0x04, 0x47, 0x51, + 0x10, 0xaa, 0x07, 0x3b, 0xf0, 0xb8, 0x86, 0x45, 0x1d, 0xea, 0xa8, 0x8f, + 0x1c, 0xd8, 0x25, 0xb8, 0xfb, 0x37, 0x5d, 0xee, 0xfa, 0x55, 0x1f, 0x0b, + 0xb8, 0xf3, 0x3e, 0x17, 0xee, 0x0f, 0xf9, 0x58, 0x2e, 0xad, 0x29, 0x14, + 0xa4, 0x0a, 0x14, 0xa8, 0xea, 0x08, 0x70, 0xa8, 0x04, 0x6e, 0x49, 0x10, + 0x77, 0x14, 0xd8, 0xca, 0x00, 0xae, 0x32, 0xd0, 0x55, 0xf7, 0xf9, 0xb1, + 0x4b, 0x0a, 0x3c, 0x74, 0xe4, 0x46, 0x38, 0xf4, 0x3c, 0xd4, 0x4b, 0xf0, + 0x98, 0xde, 0x97, 0x87, 0x6b, 0x89, 0x12, 0x1c, 0x95, 0x92, 0xa4, 0x24, + 0xa8, 0x77, 0xa0, 0x51, 0x02, 0x90, 0x78, 0xc0, 0xe3, 0xa5, 0x32, 0x6e, + 0xa7, 0x4d, 0x7f, 0x6b, 0x21, 0x4b, 0xf7, 0x08, 0x70, 0x48, 0xc0, 0x2e, + 0x09, 0x77, 0x94, 0x54, 0x7e, 0x0f, 0xe5, 0xee, 0x37, 0xe6, 0xd8, 0x1c, + 0x36, 0xe5, 0xd0, 0xf9, 0xbc, 0x5f, 0xe7, 0xc1, 0xee, 0x29, 0x13, 0x37, + 0x02, 0xcf, 0xab, 0xf5, 0x28, 0x3f, 0x7e, 0xad, 0xc7, 0xb9, 0xf8, 0x39, + 0x75, 0xae, 0x7f, 0x78, 0xe7, 0x3f, 0x87, 0xe6, 0xeb, 0x29, 0x48, 0xca, + 0xe8, 0xf5, 0xf0, 0xd5, 0x14, 0x3e, 0x05, 0x70, 0x8d, 0x0b, 0xaf, 0xbc, + 0xf2, 0x4a, 0x0a, 0x6e, 0xca, 0x03, 0x9c, 0x0c, 0x50, 0xea, 0x95, 0x57, + 0x5e, 0x81, 0x1e, 0x18, 0x94, 0x81, 0x3f, 0xbd, 0xfa, 0xda, 0xeb, 0xf0, + 0xda, 0x2b, 0x5d, 0x3e, 0x4d, 0x9c, 0x6b, 0x5c, 0xd2, 0xb4, 0xb7, 0x6d, + 0xdb, 0xc6, 0xc5, 0x8b, 0x17, 0xd9, 0xb6, 0x6d, 0x5b, 0x57, 0x9e, 0xf2, + 0xc0, 0x2b, 0x93, 0x0f, 0xe3, 0x13, 0xe8, 0xcb, 0x6b, 0xbe, 0x2c, 0xdf, + 0x09, 0x9f, 0x66, 0xdf, 0xc5, 0x8b, 0x17, 0xbb, 0x21, 0x5c, 0xb9, 0xf2, + 0x7f, 0x2f, 0x8e, 0xe9, 0x0f, 0x5b, 0x7f, 0xaf, 0x56, 0x7e, 0x2e, 0x86, + 0xff, 0xac, 0x56, 0xf3, 0x75, 0xb8, 0x55, 0xf3, 0x40, 0xd8, 0xc8, 0xb5, + 0x10, 0x3f, 0x4e, 0xb0, 0x01, 0xe9, 0xa9, 0x7b, 0xbc, 0xa0, 0x4d, 0x7b, + 0x0d, 0xaa, 0xa3, 0x55, 0x9c, 0x8a, 0x87, 0xf8, 0x69, 0x75, 0xd5, 0x27, + 0x9d, 0x90, 0xf8, 0xcd, 0x92, 0xf0, 0xa4, 0x6a, 0x01, 0x4c, 0xde, 0x36, + 0x89, 0x65, 0xb9, 0xd4, 0x80, 0xe6, 0x4b, 0xcb, 0x78, 0x15, 0x07, 0x7f, + 0x2d, 0x62, 0xea, 0x1d, 0xaa, 0x3f, 0x2f, 0x49, 0xda, 0x78, 0x3b, 0x74, + 0x1d, 0x54, 0x8a, 0x91, 0x32, 0xc2, 0xae, 0xda, 0x2c, 0xbf, 0xb4, 0x88, + 0x77, 0x7d, 0x0d, 0xb1, 0x35, 0xa4, 0xd9, 0x68, 0x22, 0x3b, 0x92, 0xa9, + 0xf7, 0x1e, 0x48, 0xf3, 0x5e, 0x3e, 0xd5, 0x84, 0x12, 0x84, 0x51, 0x1b, + 0x4f, 0xf7, 0x6b, 0xc4, 0x49, 0x8c, 0xad, 0xdf, 0x11, 0x39, 0xfb, 0xd2, + 0x32, 0xb5, 0x1d, 0xbb, 0x60, 0xc7, 0x2e, 0x92, 0xc8, 0xa7, 0x76, 0xfd, + 0x38, 0x32, 0x09, 0x49, 0x56, 0x43, 0x84, 0xe5, 0x22, 0x5b, 0xaa, 0x7d, + 0x6e, 0x97, 0xa0, 0x76, 0xd3, 0x14, 0xe1, 0x5a, 0x82, 0xb0, 0xa0, 0xf9, + 0xe2, 0x32, 0x54, 0x6c, 0xbc, 0x51, 0xf5, 0x2c, 0xa0, 0x20, 0x5b, 0x12, + 0x61, 0x41, 0xbb, 0xd3, 0xc6, 0xb6, 0x6c, 0x42, 0x7f, 0x99, 0xa9, 0xdb, + 0xc6, 0x38, 0xfa, 0xd4, 0x31, 0xf6, 0x8c, 0xda, 0xcc, 0x9f, 0x6a, 0x32, + 0x3e, 0x6a, 0xb3, 0x1c, 0xc5, 0xd4, 0x2a, 0x2e, 0x07, 0x6f, 0x3b, 0xc8, + 0xfc, 0xf1, 0x39, 0xa6, 0x6e, 0x1e, 0x63, 0x71, 0xa9, 0xc9, 0xae, 0x11, + 0x0f, 0xc7, 0x29, 0x93, 0xac, 0xc5, 0x24, 0x89, 0xc0, 0x1a, 0x29, 0x53, + 0x2e, 0x41, 0x75, 0x47, 0x99, 0xf8, 0xf5, 0x84, 0xa9, 0x5b, 0xc7, 0x79, + 0xfc, 0x99, 0x39, 0xea, 0x8e, 0xe0, 0xc4, 0xf9, 0x88, 0xba, 0x63, 0x21, + 0x5b, 0x12, 0x57, 0x58, 0xd4, 0xc7, 0x6a, 0xcc, 0x3f, 0x9f, 0x60, 0x59, + 0x92, 0x44, 0xda, 0x78, 0xc2, 0xc3, 0xb2, 0xda, 0xfa, 0xd8, 0x95, 0x71, + 0x2d, 0x35, 0x7e, 0xd1, 0x7e, 0xb3, 0x0b, 0x89, 0xcf, 0xfe, 0xb1, 0xfd, + 0xc8, 0x96, 0x4f, 0xd8, 0x6c, 0xd2, 0x4c, 0xa0, 0xe6, 0x94, 0x69, 0x46, + 0x71, 0x77, 0x1d, 0x6e, 0xce, 0x39, 0x70, 0xc3, 0xdb, 0xde, 0xc6, 0x30, + 0xf5, 0x42, 0x9f, 0xf2, 0x00, 0xa9, 0x3c, 0x58, 0xaa, 0x17, 0x1c, 0x95, + 0xb7, 0x33, 0xf0, 0xa8, 0x57, 0xbf, 0xf6, 0x95, 0x3e, 0x60, 0x56, 0x6f, + 0xbc, 0x3c, 0x68, 0x6a, 0x35, 0x3a, 0x9f, 0x82, 0xba, 0x0c, 0x08, 0x6b, + 0xec, 0x5f, 0x5f, 0xc7, 0xd2, 0x17, 0x5f, 0xee, 0x03, 0x6a, 0x0d, 0x4a, + 0x73, 0x90, 0xff, 0xd5, 0xe8, 0x7c, 0x0a, 0xcb, 0x7a, 0xfa, 0x3f, 0x7d, + 0xae, 0x2b, 0xee, 0x6a, 0x74, 0x9e, 0x2f, 0x9f, 0xbb, 0x90, 0xee, 0x37, + 0x10, 0x2d, 0xe3, 0xef, 0xad, 0x57, 0x6f, 0xe7, 0xcb, 0xe7, 0x2e, 0xf4, + 0x95, 0x3b, 0x9f, 0x6e, 0x2f, 0x60, 0xcb, 0x6c, 0x5f, 0x4e, 0xb9, 0xf3, + 0xf9, 0xcf, 0xe7, 0x01, 0xc8, 0xe0, 0x5a, 0x13, 0x41, 0x37, 0x64, 0x8b, + 0x00, 0x66, 0x80, 0x69, 0xb8, 0x21, 0x78, 0x1b, 0x0d, 0xbe, 0xd1, 0x75, + 0x4d, 0x17, 0x2a, 0x54, 0xa8, 0x50, 0xa1, 0x42, 0x85, 0x0a, 0x15, 0x2a, + 0x54, 0xa8, 0x50, 0xa1, 0x42, 0x85, 0x0a, 0x15, 0x2a, 0x54, 0xa8, 0x50, + 0xa1, 0x42, 0x85, 0x0a, 0x15, 0x2a, 0x54, 0xa8, 0x50, 0xa1, 0xcd, 0xab, + 0x80, 0x6a, 0x15, 0x2a, 0x54, 0xa8, 0x50, 0xa1, 0x42, 0xdf, 0x2b, 0x1d, + 0xb7, 0xe1, 0x3d, 0x31, 0x72, 0x45, 0xe2, 0x56, 0xd5, 0x0b, 0x7c, 0xae, + 0xe3, 0x10, 0x27, 0x1a, 0x4a, 0xa5, 0x27, 0x0d, 0xcb, 0xae, 0x2f, 0x9c, + 0x0b, 0xca, 0x15, 0x41, 0xbb, 0x25, 0xb3, 0xc9, 0x8a, 0x25, 0x81, 0x6c, + 0xc5, 0x08, 0x21, 0xb0, 0x2b, 0x22, 0xfd, 0x4a, 0x30, 0xd0, 0xff, 0x82, + 0xb7, 0x01, 0x09, 0x08, 0x01, 0x55, 0x8f, 0xb0, 0x07, 0xba, 0x93, 0x7e, + 0xa9, 0x39, 0x49, 0x08, 0x25, 0xd8, 0x23, 0x36, 0x42, 0x64, 0x5f, 0x4c, + 0x16, 0x42, 0xe0, 0x6e, 0x75, 0x70, 0xb7, 0x3a, 0xec, 0xba, 0xba, 0x46, + 0x78, 0x29, 0x22, 0x5e, 0x0b, 0xbb, 0x3e, 0xfe, 0x1e, 0x6b, 0x68, 0x95, + 0x6d, 0xd9, 0xc8, 0x0e, 0xe9, 0xd7, 0xe5, 0x4d, 0xb8, 0xc9, 0x87, 0x65, + 0xd9, 0x38, 0xa3, 0x2e, 0xe6, 0xc5, 0x64, 0x7b, 0xab, 0xad, 0x5f, 0xb8, + 0xcf, 0x7d, 0xe1, 0x53, 0xbf, 0x80, 0x3f, 0xbe, 0x7f, 0x92, 0xc5, 0x13, + 0xf3, 0xb4, 0x73, 0x3e, 0x0c, 0x60, 0x2b, 0x4e, 0x62, 0x64, 0x07, 0x9c, + 0x6f, 0x5a, 0xb0, 0x45, 0x85, 0xb5, 0x65, 0x1b, 0x68, 0x53, 0xdb, 0xe1, + 0x41, 0xd5, 0x83, 0x52, 0x99, 0xb1, 0xb1, 0x49, 0x96, 0x96, 0x14, 0x20, + 0x28, 0xd1, 0xa0, 0xac, 0x58, 0x26, 0xd8, 0x7a, 0xe2, 0x66, 0x32, 0xa2, + 0x60, 0x43, 0xb2, 0x23, 0xbb, 0xf2, 0x1a, 0xad, 0xfa, 0x88, 0x52, 0xff, + 0x0b, 0xdf, 0x83, 0x24, 0x4a, 0x02, 0xb9, 0x22, 0x55, 0x09, 0x8e, 0x67, + 0x50, 0xa0, 0xe4, 0xb4, 0x84, 0x09, 0x88, 0x56, 0x13, 0xa8, 0x82, 0xeb, + 0x58, 0x0a, 0xe0, 0x34, 0xe0, 0xdd, 0xfb, 0x44, 0x4f, 0xc4, 0x1a, 0x04, + 0x7e, 0x72, 0x9d, 0x6c, 0xe2, 0xcc, 0x20, 0xc9, 0x44, 0xe2, 0x8d, 0x3a, + 0xea, 0xcb, 0xca, 0xab, 0xdd, 0xf1, 0x4d, 0xdc, 0x41, 0x70, 0xab, 0x24, + 0x91, 0x03, 0xa1, 0x51, 0xae, 0x63, 0x91, 0x24, 0x6d, 0x2c, 0x61, 0x75, + 0xe7, 0x55, 0x2a, 0xd0, 0x14, 0x0c, 0x06, 0x6a, 0x99, 0xb4, 0xd2, 0xf4, + 0x7a, 0x26, 0x1d, 0x98, 0x32, 0x9a, 0xdf, 0xc6, 0xd0, 0x7c, 0x0e, 0x89, + 0x37, 0x2c, 0xcd, 0x6f, 0xe7, 0x98, 0xf6, 0xa5, 0x47, 0x56, 0xc6, 0x61, + 0x30, 0xae, 0x68, 0x55, 0x4d, 0x60, 0x4c, 0x4e, 0xe7, 0x7e, 0xb7, 0xb9, + 0xeb, 0xda, 0x78, 0x12, 0xc2, 0x1a, 0x08, 0xc7, 0xca, 0x87, 0x0f, 0xb3, + 0xe9, 0xb5, 0x87, 0x7e, 0xd0, 0x56, 0xf3, 0x7c, 0x33, 0xf7, 0x65, 0xf5, + 0xbc, 0xfd, 0xe0, 0xc9, 0x1d, 0xeb, 0x4e, 0x10, 0xe9, 0x91, 0xeb, 0xb8, + 0xdd, 0xd7, 0x2e, 0xfa, 0xab, 0xea, 0x03, 0x26, 0x8e, 0xc8, 0x41, 0x13, + 0x66, 0xf4, 0x17, 0xbe, 0x37, 0xad, 0xef, 0xe4, 0xd3, 0xc9, 0xb7, 0xe1, + 0x7b, 0xa3, 0xeb, 0xda, 0xbd, 0xbe, 0xde, 0x17, 0x27, 0x8a, 0x22, 0xdc, + 0x51, 0x77, 0xd3, 0x69, 0x5c, 0xae, 0xfd, 0x77, 0x23, 0x8d, 0xef, 0x27, + 0xfb, 0x2b, 0xf5, 0xed, 0x8e, 0xba, 0x43, 0xeb, 0x4c, 0x50, 0xd7, 0xb9, + 0x3b, 0x92, 0xf9, 0x8d, 0xce, 0x37, 0xe9, 0xbd, 0xae, 0x2f, 0x9d, 0x6e, + 0x51, 0xfb, 0x99, 0x1f, 0xe5, 0xc2, 0x6a, 0x8b, 0xdf, 0xcb, 0xcd, 0x2f, + 0x1f, 0x04, 0xd3, 0x32, 0x61, 0xc7, 0xcf, 0xc3, 0x23, 0x9f, 0xfc, 0x24, + 0x1f, 0xfa, 0xf0, 0x87, 0xbb, 0xd2, 0x3b, 0x7e, 0xfc, 0x38, 0xb7, 0xdc, + 0x72, 0x0b, 0x70, 0x65, 0xfb, 0xbf, 0x1f, 0x74, 0xf5, 0xc6, 0x26, 0xdf, + 0x77, 0x3a, 0x77, 0xfe, 0x7c, 0x1f, 0x54, 0xeb, 0xc2, 0x6a, 0x0b, 0x18, + 0xe1, 0xd2, 0xe9, 0x16, 0xf0, 0x23, 0x00, 0x24, 0x2d, 0xf5, 0x5d, 0xf6, + 0xa8, 0x05, 0xf3, 0xa7, 0xd4, 0x8c, 0xb1, 0x27, 0x6e, 0xfc, 0x38, 0x1f, + 0xdf, 0x29, 0x11, 0xbf, 0xfb, 0x27, 0x00, 0x4c, 0x02, 0x87, 0x5f, 0xfa, + 0xf6, 0xf2, 0x13, 0x9f, 0x9a, 0x07, 0xe1, 0xc2, 0x5a, 0x6e, 0xd2, 0xf6, + 0x80, 0x7b, 0x62, 0xaf, 0x7e, 0x10, 0x80, 0x57, 0xdf, 0x4b, 0xfb, 0x2e, + 0xe5, 0xe2, 0x44, 0x2d, 0xb5, 0x4c, 0x5a, 0x36, 0x88, 0x24, 0x5b, 0x47, + 0x12, 0xf5, 0xb6, 0x8b, 0x46, 0x5c, 0x38, 0xdd, 0x84, 0x24, 0x86, 0x1b, + 0x35, 0xf0, 0x24, 0x8c, 0xde, 0x40, 0xa0, 0x96, 0x92, 0xb3, 0xcf, 0xc2, + 0x3f, 0x91, 0xe0, 0xed, 0xd7, 0x93, 0x22, 0x2b, 0x19, 0x68, 0xab, 0xf1, + 0x4c, 0x82, 0x99, 0xf0, 0x3b, 0x54, 0x8b, 0x4f, 0xf0, 0xa0, 0x10, 0x69, + 0x5b, 0xf9, 0x9e, 0x92, 0x50, 0x80, 0xad, 0xe3, 0x73, 0x10, 0xf8, 0x8a, + 0x18, 0x71, 0x42, 0xcf, 0x66, 0xdf, 0x9f, 0x9b, 0x88, 0x12, 0xf8, 0xdf, + 0x5f, 0x40, 0x2d, 0x0d, 0xd2, 0x7a, 0x30, 0x17, 0x74, 0x0f, 0xa8, 0x3c, + 0x9f, 0x38, 0x01, 0xab, 0x3e, 0x9c, 0xd3, 0xcf, 0x2b, 0x06, 0x12, 0x06, + 0x43, 0xcb, 0x11, 0x25, 0x12, 0x46, 0xcb, 0xea, 0xfc, 0x56, 0xf4, 0xb9, + 0x36, 0xf7, 0xeb, 0x28, 0xc2, 0xdb, 0x3d, 0x18, 0xc4, 0xb9, 0x69, 0xf5, + 0xc1, 0x62, 0x00, 0x19, 0x0f, 0x5c, 0xdf, 0xcc, 0xb3, 0x83, 0xec, 0x0c, + 0x5e, 0xdf, 0x7c, 0x7e, 0x2e, 0x13, 0xcc, 0x67, 0xea, 0x99, 0x7c, 0x7d, + 0x33, 0x60, 0xbd, 0x8d, 0x82, 0x76, 0x98, 0xe5, 0xa0, 0x3c, 0x76, 0xad, + 0xe7, 0x0a, 0xdb, 0xbe, 0x92, 0x72, 0xf4, 0x3a, 0x19, 0x6c, 0xd0, 0x95, + 0x46, 0x14, 0x45, 0x40, 0xb5, 0xeb, 0x7e, 0xfd, 0x72, 0xeb, 0x12, 0x93, + 0x3f, 0x5a, 0xe3, 0xab, 0xad, 0x0b, 0x83, 0x5d, 0x14, 0xfa, 0x81, 0xd4, + 0x57, 0x5b, 0x17, 0x60, 0x44, 0x9d, 0x5f, 0x7d, 0xbb, 0xee, 0xba, 0x5f, + 0x87, 0xfa, 0x5e, 0x7a, 0xf6, 0x7c, 0x83, 0xc9, 0x5b, 0xf7, 0xe3, 0x5f, + 0xf0, 0x91, 0xe7, 0x23, 0xe8, 0xc8, 0x3e, 0xb8, 0x5a, 0x72, 0xde, 0x87, + 0x7b, 0xc6, 0x49, 0x1e, 0x6c, 0x60, 0x69, 0xd8, 0x96, 0x59, 0x4a, 0x09, + 0x6c, 0x17, 0x4c, 0xbd, 0xbf, 0xc6, 0xdc, 0x67, 0x14, 0x4c, 0x23, 0x5c, + 0x8b, 0x79, 0xd7, 0xfb, 0x3d, 0x9a, 0x81, 0x84, 0xa6, 0xfa, 0x0d, 0x1a, + 0xa0, 0x16, 0x48, 0xc2, 0x95, 0x26, 0xfe, 0x27, 0x0e, 0x22, 0x3e, 0x32, + 0x8f, 0xbb, 0xb3, 0x8e, 0xbb, 0xb3, 0x96, 0x02, 0xa7, 0x00, 0xa4, 0xa5, + 0xe2, 0xdc, 0x7e, 0xcf, 0xbb, 0x78, 0xf2, 0x41, 0x35, 0xa9, 0x2f, 0x5a, + 0x6d, 0x53, 0xbf, 0x79, 0x0f, 0x24, 0x10, 0x86, 0x39, 0xa0, 0xe2, 0xee, + 0x3d, 0x84, 0x67, 0x96, 0x15, 0x5c, 0xeb, 0x9e, 0x3b, 0x09, 0xff, 0xcd, + 0x63, 0x58, 0x80, 0xbd, 0x7b, 0x0f, 0x51, 0x94, 0x50, 0xbf, 0xb6, 0x4e, + 0xa3, 0xb1, 0xc8, 0xe4, 0x7b, 0xc7, 0xc1, 0x91, 0x84, 0xa7, 0x7d, 0xa2, + 0xd3, 0x39, 0x70, 0xc8, 0x56, 0x1b, 0x6b, 0xab, 0x4d, 0xa3, 0xa1, 0xf2, + 0x6e, 0xef, 0xae, 0xe1, 0x9f, 0x52, 0x00, 0x97, 0x04, 0x35, 0xa1, 0xd5, + 0x62, 0x4e, 0x5f, 0xd3, 0x99, 0x4f, 0x00, 0xb7, 0x0e, 0x53, 0xbb, 0xe1, + 0x81, 0x07, 0xd5, 0xc4, 0xd8, 0xdb, 0xff, 0xed, 0x14, 0xcd, 0x33, 0x3e, + 0x6e, 0xc9, 0xc5, 0x75, 0x5d, 0x1a, 0x27, 0x97, 0x55, 0xb9, 0x57, 0x16, + 0x09, 0xcf, 0x40, 0xc2, 0x38, 0x16, 0x8b, 0x3d, 0xc7, 0x43, 0x3d, 0x27, + 0xba, 0xae, 0x8b, 0x5b, 0xb3, 0x18, 0xdb, 0xa9, 0xc2, 0x1e, 0xff, 0xa3, + 0x26, 0xcd, 0xd3, 0xcb, 0x1c, 0xf8, 0xe5, 0x1a, 0x8d, 0x33, 0xea, 0x78, + 0xb4, 0x3b, 0xd0, 0x5e, 0x8b, 0xf5, 0xb1, 0x97, 0xea, 0xbc, 0xfc, 0x52, + 0x0d, 0xf7, 0xa5, 0xdc, 0xf9, 0xd5, 0x75, 0x78, 0xfe, 0xba, 0xde, 0x3d, + 0xf0, 0x17, 0x32, 0x5c, 0xff, 0xea, 0xda, 0x1f, 0xe2, 0xb9, 0xdf, 0xf8, + 0xfb, 0xbe, 0xf0, 0xeb, 0x3e, 0xf2, 0x43, 0x44, 0xab, 0xf0, 0x0f, 0xac, + 0x0f, 0x87, 0xf2, 0xb6, 0xbd, 0x89, 0xd7, 0x36, 0xb0, 0xb9, 0x52, 0x79, + 0xdb, 0xde, 0xc4, 0xcb, 0x9f, 0xf8, 0x87, 0x81, 0xfb, 0xc6, 0x7f, 0xed, + 0x87, 0x36, 0x4c, 0xf7, 0xea, 0x9f, 0x78, 0x53, 0x0e, 0x43, 0xf2, 0xc6, + 0xab, 0xbc, 0x0a, 0x5f, 0x7b, 0xb1, 0x3f, 0x0f, 0x37, 0xff, 0xe6, 0x3f, + 0xe3, 0xb9, 0xcf, 0xf6, 0x1f, 0xd3, 0xbc, 0x36, 0x73, 0xdc, 0x06, 0x5d, + 0xd7, 0xf9, 0x67, 0xae, 0x9f, 0x1d, 0x9b, 0x64, 0xee, 0xc4, 0x1c, 0xe3, + 0xfb, 0xa7, 0x68, 0x46, 0x3e, 0xae, 0x53, 0xd7, 0xd0, 0x2c, 0x8f, 0x10, + 0x70, 0x23, 0x9f, 0xb3, 0xcd, 0x06, 0xbb, 0x6a, 0x0a, 0xac, 0x35, 0xbe, + 0xbf, 0xce, 0xa2, 0xb6, 0x0f, 0x23, 0xd5, 0x0c, 0x0a, 0x23, 0xb0, 0x1d, + 0x8f, 0xc5, 0x13, 0x73, 0x78, 0xb5, 0x1a, 0xae, 0xe3, 0x41, 0x0e, 0x7a, + 0x65, 0x6c, 0xc0, 0xc7, 0xae, 0xd5, 0x69, 0x46, 0x0d, 0xcc, 0x5d, 0xcf, + 0xb6, 0x2d, 0x0d, 0xec, 0xf2, 0xb0, 0x80, 0xc5, 0x58, 0x5d, 0x1b, 0x71, + 0x9c, 0x68, 0x70, 0x97, 0xca, 0x4b, 0x1c, 0x37, 0xc8, 0xcb, 0x05, 0x2c, + 0xc7, 0xd3, 0xf6, 0x5e, 0xea, 0xa3, 0x5b, 0x3e, 0xd0, 0xed, 0x7b, 0x7c, + 0xbf, 0xc9, 0x8b, 0x52, 0xcd, 0xf1, 0x48, 0x1c, 0xe3, 0xdb, 0x00, 0xc6, + 0x7c, 0x5c, 0x20, 0x76, 0xdc, 0xd4, 0xb7, 0x09, 0x27, 0x85, 0x9d, 0x67, + 0xf9, 0xe9, 0x05, 0x69, 0x59, 0x74, 0x75, 0xdd, 0x62, 0xdd, 0x90, 0xed, + 0xa3, 0x27, 0x3c, 0x1f, 0x36, 0xcc, 0x6e, 0x23, 0x59, 0x37, 0xa8, 0xf4, + 0x06, 0x3e, 0x73, 0x99, 0xb6, 0x59, 0x90, 0x10, 0x56, 0xc0, 0xb5, 0x42, + 0x64, 0x0b, 0x2c, 0xa1, 0x80, 0x4d, 0xde, 0x48, 0x99, 0xfa, 0xa8, 0x45, + 0xa8, 0xfb, 0xc7, 0x17, 0x9f, 0x7b, 0x12, 0xd7, 0x12, 0x48, 0x29, 0x09, + 0x5b, 0x31, 0x0f, 0xfc, 0xef, 0x0f, 0x03, 0xe0, 0x56, 0x74, 0xff, 0xcc, + 0x16, 0xf0, 0x75, 0x7d, 0xaa, 0xe0, 0x5a, 0x0a, 0xce, 0x15, 0xe9, 0xa6, + 0x83, 0x25, 0xda, 0xc8, 0x0e, 0x24, 0xb2, 0x0c, 0x2d, 0x05, 0xac, 0x0a, + 0xc3, 0x18, 0xd1, 0xb1, 0x89, 0x74, 0x5b, 0xda, 0x1b, 0xb1, 0x70, 0xb6, + 0x42, 0x74, 0x49, 0xc5, 0x39, 0x70, 0xdb, 0xed, 0x2c, 0xbe, 0xf0, 0x24, + 0xf2, 0xf5, 0x90, 0x30, 0xca, 0xda, 0x20, 0xae, 0x23, 0xe0, 0x9b, 0x21, + 0xae, 0x25, 0x74, 0xb8, 0x9f, 0x85, 0x6b, 0x4d, 0xde, 0x72, 0x3b, 0x4f, + 0xfc, 0xf1, 0xe3, 0x3d, 0xe1, 0x09, 0xbe, 0xbe, 0x5f, 0xc5, 0x80, 0xe7, + 0x64, 0x7d, 0x10, 0x26, 0xbc, 0xe6, 0xa9, 0xf2, 0x84, 0x61, 0xac, 0xf2, + 0x9a, 0x3f, 0x9e, 0xa2, 0xcd, 0x13, 0x4f, 0xa9, 0x72, 0x27, 0xb2, 0x4c, + 0x22, 0x13, 0xee, 0xff, 0x95, 0x7b, 0x79, 0xf8, 0x69, 0x1d, 0x16, 0x4b, + 0xee, 0xb8, 0xf9, 0x00, 0xc7, 0x5e, 0x7a, 0x82, 0x76, 0xa7, 0x8c, 0x67, + 0x29, 0x18, 0x9d, 0x51, 0xf9, 0x6a, 0x49, 0x62, 0xc6, 0x1b, 0x2e, 0x38, + 0xf4, 0xb5, 0x54, 0x3b, 0x1a, 0x77, 0xa2, 0x8f, 0xc7, 0xb1, 0xe3, 0xaa, + 0xff, 0x5c, 0x74, 0x62, 0xc6, 0xc7, 0xa6, 0x58, 0x0c, 0x32, 0x78, 0xaf, + 0x6b, 0x01, 0x08, 0x12, 0x0d, 0x89, 0x15, 0x02, 0xe2, 0x55, 0x41, 0x14, + 0xf4, 0xf7, 0x91, 0x2e, 0xb7, 0x12, 0xa6, 0x2c, 0x08, 0x07, 0x40, 0xec, + 0x93, 0xb5, 0x1e, 0x9c, 0x48, 0x27, 0xca, 0xc1, 0xb3, 0xaa, 0x58, 0xc2, + 0x22, 0x31, 0xfd, 0x9f, 0x5d, 0x40, 0xad, 0xc1, 0xc0, 0xab, 0x68, 0xad, + 0xff, 0xc3, 0x02, 0xa2, 0x64, 0x23, 0x3b, 0x71, 0xdf, 0x7a, 0x26, 0xd3, + 0xd2, 0x55, 0xe5, 0x56, 0x63, 0x32, 0xc3, 0xdb, 0xa4, 0xf6, 0x88, 0x45, + 0xbc, 0x96, 0x40, 0xa7, 0x8d, 0x04, 0x44, 0xa7, 0x8c, 0xa4, 0x8d, 0xa0, + 0x9c, 0xc2, 0x63, 0x44, 0x27, 0xef, 0xb1, 0x5b, 0x06, 0x8a, 0x95, 0x87, + 0x68, 0xf5, 0x02, 0xb5, 0x06, 0x41, 0xb6, 0xcc, 0x76, 0x3e, 0x3c, 0xdf, + 0x37, 0x9e, 0x07, 0x68, 0xe5, 0x65, 0xb6, 0xbb, 0xc2, 0x7b, 0x80, 0x5a, + 0x06, 0x98, 0x35, 0x2c, 0x6e, 0xba, 0xde, 0x91, 0x29, 0xc8, 0x2b, 0x6c, + 0x45, 0x30, 0xa2, 0xce, 0xaf, 0xf1, 0x97, 0xaf, 0xc3, 0x41, 0x01, 0x9d, + 0x0c, 0x58, 0x2b, 0xaf, 0x2e, 0xd0, 0xd3, 0x44, 0x06, 0x8c, 0x9a, 0x9e, + 0x9e, 0x26, 0x58, 0x58, 0x20, 0x20, 0x83, 0x6e, 0x55, 0xab, 0x30, 0x3b, + 0x93, 0xd9, 0x4f, 0xcf, 0x28, 0x08, 0x57, 0x95, 0x6c, 0x3f, 0xc0, 0xf4, + 0x6c, 0xa0, 0x60, 0x03, 0x33, 0x8a, 0x43, 0x30, 0x31, 0x0d, 0x33, 0x33, + 0x81, 0x02, 0x6b, 0x05, 0x01, 0x13, 0x41, 0x15, 0x66, 0x02, 0x66, 0x67, + 0x02, 0x9d, 0x6e, 0x95, 0x20, 0x08, 0x98, 0x0e, 0xd4, 0xfa, 0xc2, 0x4c, + 0x80, 0xc9, 0xd6, 0x34, 0x0a, 0x8a, 0x55, 0xad, 0x56, 0x81, 0x80, 0x19, + 0x73, 0xb7, 0xd5, 0xf9, 0x98, 0x99, 0x51, 0x30, 0xad, 0xd9, 0x19, 0x98, + 0x0d, 0xaa, 0x2c, 0x54, 0xd5, 0xfe, 0xa0, 0x0a, 0x0b, 0x0b, 0x30, 0x11, + 0x54, 0x99, 0xd0, 0x71, 0x02, 0x9d, 0xe7, 0x9f, 0x8f, 0xe0, 0xb5, 0x87, + 0x8e, 0xb0, 0x50, 0xd5, 0xa0, 0xac, 0x40, 0x85, 0x2f, 0xe8, 0x44, 0x17, + 0x02, 0x05, 0x01, 0x53, 0xeb, 0x01, 0xd3, 0x0b, 0xda, 0x9f, 0x39, 0x0e, + 0x13, 0x10, 0x2c, 0x64, 0x4b, 0x4c, 0x1e, 0x03, 0x65, 0x0f, 0xc0, 0x84, + 0x82, 0x92, 0x2d, 0x04, 0x2a, 0xe1, 0x2a, 0x10, 0x4c, 0xe8, 0xe5, 0x82, + 0x3a, 0xce, 0xb3, 0x81, 0x3a, 0x66, 0xef, 0xfc, 0x43, 0x15, 0xe5, 0xad, + 0xfa, 0x5f, 0xde, 0xaf, 0x81, 0x83, 0x4d, 0x54, 0xab, 0xcc, 0x10, 0x60, + 0x6f, 0xd0, 0x6f, 0x96, 0x1f, 0xbf, 0xa3, 0x24, 0xba, 0xa1, 0x53, 0xdf, + 0x8e, 0x4a, 0x62, 0x53, 0x3e, 0xac, 0x8a, 0x48, 0xc7, 0x2d, 0x65, 0x7e, + 0x5c, 0x31, 0x07, 0xa2, 0x92, 0x32, 0x49, 0xc7, 0x86, 0x2c, 0xcb, 0xe9, + 0x1b, 0x8b, 0x49, 0x74, 0x9f, 0xb1, 0x94, 0x0a, 0xac, 0xd5, 0x37, 0xbe, + 0x91, 0xdf, 0x1e, 0xb6, 0xfe, 0x46, 0xa9, 0x77, 0xbc, 0x45, 0x8f, 0x55, + 0x65, 0x25, 0x13, 0x40, 0x5b, 0xd5, 0x3a, 0x25, 0x81, 0xd0, 0x10, 0x3f, + 0xc7, 0x71, 0x29, 0x97, 0x04, 0xed, 0x8e, 0x1e, 0xdf, 0xea, 0x48, 0x64, + 0x47, 0xe2, 0x79, 0x1e, 0xc9, 0xa5, 0x98, 0xb9, 0xa7, 0x1f, 0xc6, 0xa9, + 0x3a, 0x44, 0x81, 0xaa, 0x4b, 0xab, 0x3b, 0xaa, 0xb8, 0x4e, 0xcf, 0x07, + 0x56, 0x06, 0xf4, 0x9b, 0xe5, 0xc7, 0xb9, 0xda, 0xea, 0xdb, 0x49, 0x94, + 0x7b, 0xd0, 0xa9, 0x63, 0x80, 0xc6, 0xd4, 0x23, 0x3b, 0x30, 0xd6, 0x92, + 0x34, 0x2a, 0x42, 0xd5, 0x89, 0x25, 0x13, 0x3e, 0x78, 0x2c, 0x09, 0x20, + 0x41, 0xb0, 0x24, 0xc0, 0xd5, 0x85, 0x54, 0x78, 0x1b, 0x25, 0x03, 0xc4, + 0x3a, 0x72, 0x9f, 0xc3, 0xa1, 0xfb, 0x23, 0xda, 0xb4, 0x41, 0xc2, 0x7d, + 0x1a, 0x3c, 0xb5, 0xab, 0x04, 0xb1, 0xa9, 0xbf, 0x3b, 0x70, 0xdf, 0x6f, + 0x84, 0x1c, 0xb9, 0x01, 0xd8, 0xef, 0x72, 0xe8, 0xfe, 0x10, 0x3a, 0x30, + 0x55, 0x82, 0x45, 0x54, 0x9b, 0x44, 0xdd, 0xc9, 0x14, 0xc4, 0x2b, 0x34, + 0xfe, 0x3b, 0x10, 0x22, 0x11, 0xfa, 0x08, 0xc7, 0xba, 0x0e, 0x8f, 0x3b, + 0x70, 0x44, 0xc0, 0x61, 0x24, 0xbb, 0x4a, 0x82, 0xb3, 0x1a, 0x4e, 0x75, + 0xff, 0x18, 0xf0, 0x0e, 0x97, 0x43, 0xf7, 0xab, 0x63, 0xd4, 0xd0, 0xf6, + 0x79, 0xa0, 0xd6, 0x91, 0x12, 0x7c, 0x1c, 0x05, 0xd2, 0xca, 0x80, 0x5a, + 0xe4, 0xec, 0xdb, 0xb4, 0x81, 0x23, 0x52, 0x81, 0xb3, 0xa6, 0x24, 0xcc, + 0x69, 0x9b, 0xfb, 0xc7, 0x14, 0xac, 0xeb, 0x3e, 0x7d, 0x0d, 0x2c, 0xa3, + 0x40, 0x62, 0xbd, 0xa3, 0xd3, 0xf7, 0xe9, 0xe5, 0x43, 0xf7, 0xd9, 0x1c, + 0xba, 0x3f, 0xd6, 0x60, 0x2d, 0x78, 0x40, 0xc3, 0xe7, 0x5c, 0x54, 0x7b, + 0x23, 0x3d, 0x36, 0x4b, 0x0a, 0x04, 0xc6, 0x3b, 0x5c, 0xde, 0xf9, 0x51, + 0xbf, 0x6f, 0x9c, 0x8b, 0xbf, 0xb4, 0xe1, 0x17, 0x63, 0xbe, 0xb1, 0xf2, + 0x75, 0x76, 0xee, 0xdd, 0xc7, 0xc5, 0x8b, 0x17, 0x01, 0x05, 0x6a, 0xba, + 0xea, 0x2d, 0x5b, 0xd8, 0xe2, 0x5e, 0x95, 0xc2, 0xa8, 0x8c, 0x0c, 0xbc, + 0xc9, 0x80, 0xa0, 0xe6, 0xe7, 0x55, 0xdb, 0xa1, 0x17, 0x0a, 0x65, 0x80, + 0x50, 0x06, 0xfe, 0xb4, 0xc5, 0xbd, 0x8a, 0xab, 0xe8, 0x86, 0x66, 0xf5, + 0xfa, 0x34, 0xe9, 0x9a, 0x38, 0x2b, 0x39, 0x18, 0xd5, 0xab, 0xaf, 0xbd, + 0xce, 0x35, 0xd7, 0x5c, 0xc3, 0xeb, 0xe1, 0xab, 0x5d, 0x10, 0x2a, 0x93, + 0xe6, 0xa0, 0xbc, 0x76, 0xc1, 0xb3, 0xbe, 0x03, 0x3e, 0x5f, 0x0f, 0x5f, + 0xed, 0xf2, 0x97, 0x8f, 0xf7, 0xca, 0x2b, 0xaf, 0x30, 0x39, 0x39, 0xf9, + 0x3d, 0x39, 0xa6, 0xdf, 0x58, 0xf9, 0xba, 0xba, 0x0c, 0xff, 0x32, 0x37, + 0xa6, 0x99, 0xab, 0xc3, 0x1d, 0xc7, 0xa5, 0x71, 0xb2, 0x81, 0xb7, 0xb5, + 0x8a, 0x8c, 0x7c, 0xf0, 0x6c, 0x92, 0x56, 0x80, 0x4b, 0x8d, 0xf2, 0x48, + 0x99, 0xf6, 0x5a, 0x9b, 0xf2, 0x88, 0x4b, 0xd2, 0xe9, 0x6e, 0xb3, 0xd5, + 0x76, 0xd4, 0xb1, 0x7f, 0x9a, 0x14, 0xc2, 0x9f, 0x24, 0x21, 0x72, 0x4d, + 0x62, 0x5b, 0x36, 0x62, 0x44, 0xe0, 0x9f, 0xf3, 0x49, 0x92, 0x36, 0xfe, + 0x19, 0x1f, 0x77, 0x47, 0x99, 0x28, 0x52, 0xe0, 0x5a, 0x27, 0x6d, 0xcf, + 0x38, 0xf8, 0xda, 0x67, 0xad, 0xea, 0x21, 0xf6, 0x5a, 0x29, 0x2c, 0x2b, + 0x4e, 0x62, 0xe4, 0x5a, 0x42, 0xd8, 0x6a, 0x53, 0xdb, 0xed, 0xe1, 0x37, + 0x97, 0x68, 0xaf, 0x49, 0xfc, 0x95, 0xb3, 0xd8, 0x3b, 0x6c, 0xe2, 0xa8, + 0x8c, 0x7f, 0x7e, 0x19, 0x57, 0xb7, 0xa5, 0xdd, 0x11, 0x0b, 0x7f, 0x15, + 0x44, 0x12, 0x12, 0xb6, 0x14, 0x44, 0x4b, 0xb6, 0x7c, 0x9c, 0x9d, 0x1e, + 0x61, 0xe2, 0xd3, 0xee, 0xa8, 0x7e, 0x53, 0x77, 0xbb, 0x20, 0xbc, 0x14, + 0x63, 0x8f, 0xd8, 0xb4, 0x65, 0x1b, 0x51, 0x6a, 0xa7, 0x63, 0x86, 0xb2, + 0x23, 0x09, 0x57, 0xe3, 0x34, 0x7d, 0x46, 0xac, 0xb4, 0xfe, 0x3a, 0x1b, + 0xb5, 0x99, 0xda, 0xab, 0xfa, 0x3c, 0x6a, 0x89, 0xfe, 0x40, 0xc3, 0x85, + 0x65, 0xa4, 0x80, 0x27, 0x8e, 0xcf, 0xb3, 0x4b, 0x7f, 0x68, 0xa1, 0x5c, + 0x6a, 0x67, 0x2d, 0xef, 0x92, 0xaa, 0xab, 0x7b, 0xef, 0x65, 0x8d, 0x28, + 0x61, 0xff, 0xf5, 0x35, 0x05, 0x6e, 0xb7, 0x34, 0xd4, 0x2b, 0xd6, 0x6d, + 0x5c, 0x21, 0x06, 0x36, 0x1e, 0xdb, 0x6f, 0x76, 0xb3, 0x3a, 0x59, 0x4b, + 0xae, 0x25, 0x34, 0x13, 0x18, 0xaf, 0x79, 0xc4, 0xaf, 0x27, 0xb8, 0x95, + 0x36, 0x4b, 0xf9, 0x3a, 0xbc, 0xd2, 0x4a, 0xaf, 0xe9, 0x17, 0xbe, 0xf4, + 0x25, 0xee, 0xec, 0x77, 0xdb, 0x05, 0x7a, 0xea, 0x85, 0x3e, 0xf5, 0xda, + 0xe5, 0x95, 0x87, 0x49, 0xe5, 0xe1, 0x51, 0x57, 0xfd, 0xf8, 0x4f, 0xf2, + 0x37, 0x2f, 0xff, 0x55, 0x17, 0xf0, 0xaa, 0x17, 0x36, 0x95, 0x4f, 0x63, + 0xd4, 0xd9, 0xc1, 0xab, 0x5f, 0xfb, 0x4a, 0x17, 0x08, 0x6b, 0xe9, 0x8b, + 0x2f, 0x03, 0xf4, 0x01, 0xb5, 0x7a, 0xd3, 0x36, 0xf1, 0x7a, 0x65, 0xe0, + 0x59, 0x7f, 0xf3, 0xf2, 0x5f, 0xf5, 0xc5, 0x7b, 0xfb, 0x75, 0x3f, 0xcb, + 0x7b, 0xfe, 0x47, 0x8b, 0xda, 0x9e, 0x1f, 0xa3, 0xb9, 0xfc, 0x77, 0x00, + 0xe9, 0xfa, 0xa0, 0xb2, 0xf7, 0x96, 0xbb, 0xf7, 0x78, 0xf5, 0xfa, 0xe7, + 0xff, 0x67, 0xef, 0xee, 0x83, 0xe4, 0x38, 0x0f, 0xfb, 0xce, 0xff, 0x86, + 0x19, 0x5d, 0x7a, 0x4e, 0x4b, 0xab, 0xa7, 0x6a, 0x79, 0x9e, 0x21, 0xc1, + 0xe3, 0xcc, 0x1d, 0x28, 0x62, 0x50, 0x60, 0xc4, 0x45, 0x28, 0x15, 0x81, + 0x22, 0x5d, 0x0b, 0x28, 0xca, 0x49, 0x94, 0x5f, 0x8e, 0xa4, 0x94, 0xd8, + 0x92, 0x5d, 0xb7, 0xf6, 0xa9, 0x2e, 0x89, 0x08, 0xbf, 0xa4, 0xac, 0x9c, + 0xaf, 0xce, 0x94, 0x0f, 0x3e, 0xc9, 0x55, 0xe7, 0x92, 0x55, 0x7e, 0x21, + 0xa9, 0x9c, 0x1d, 0x49, 0x46, 0x55, 0x44, 0xc9, 0x0e, 0x0d, 0xaa, 0x12, + 0x45, 0xa0, 0x22, 0xc9, 0x20, 0x4e, 0xd4, 0x01, 0xaa, 0x90, 0xc1, 0xd2, + 0x11, 0x8a, 0x03, 0x8a, 0x38, 0xcd, 0x28, 0x04, 0x35, 0x13, 0x63, 0xab, + 0xba, 0x2d, 0xae, 0x33, 0x8f, 0xcf, 0x73, 0x99, 0xfb, 0xe3, 0xe9, 0xa7, + 0xe7, 0x99, 0xde, 0x9e, 0x97, 0x5d, 0xec, 0x0b, 0x80, 0xfd, 0x7e, 0xaa, + 0xb6, 0xa6, 0xe7, 0x79, 0xba, 0x9f, 0x7e, 0xa6, 0x67, 0xfb, 0x65, 0x66, + 0xba, 0x7f, 0xad, 0xb7, 0x4d, 0xa8, 0x5b, 0xdb, 0x7f, 0x17, 0xe4, 0xa5, + 0x24, 0xe8, 0x55, 0xb5, 0x76, 0x72, 0xac, 0xd9, 0xb6, 0x07, 0x90, 0xb5, + 0xe4, 0xf1, 0xb8, 0xec, 0x41, 0x5f, 0x32, 0xfc, 0xcd, 0xef, 0x7c, 0x47, + 0x6f, 0xd6, 0x1d, 0x23, 0xeb, 0x34, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x60, 0x76, 0x84, 0x6a, 0x01, 0x00, 0x70, 0x0d, + 0x0a, 0x43, 0xff, 0x24, 0xc7, 0x58, 0xa1, 0xa4, 0x20, 0x28, 0xc9, 0x18, + 0x2f, 0x4c, 0xcb, 0xe9, 0xbb, 0xa0, 0xa1, 0xb2, 0xa2, 0xd8, 0x28, 0x98, + 0x93, 0x4a, 0x81, 0xbb, 0x5b, 0x70, 0xa0, 0xc0, 0x3f, 0xb1, 0x7d, 0x64, + 0x3a, 0x29, 0x8e, 0x23, 0x85, 0x61, 0x39, 0x0d, 0xf5, 0x1a, 0x8e, 0x63, + 0x43, 0x48, 0xa2, 0x95, 0xe1, 0xc5, 0x26, 0xd5, 0x3d, 0x55, 0x95, 0xe7, + 0x42, 0xa9, 0x67, 0xec, 0xed, 0x90, 0x93, 0x53, 0x8d, 0xcb, 0x73, 0x65, + 0x69, 0x8f, 0x0d, 0x7a, 0x8a, 0xe3, 0xc8, 0xf6, 0x75, 0x2e, 0xc8, 0x84, + 0x68, 0x79, 0x01, 0x60, 0xc9, 0x45, 0x3c, 0x41, 0x18, 0x26, 0x77, 0x8e, + 0x36, 0x36, 0xe4, 0x4b, 0xee, 0x9c, 0xc1, 0x24, 0xbc, 0xa6, 0xef, 0x85, + 0x6b, 0x49, 0xaa, 0x26, 0x21, 0x60, 0xa5, 0xb0, 0xac, 0x7a, 0xbd, 0xe6, + 0xbd, 0x10, 0x3b, 0xdc, 0x6a, 0xb5, 0x55, 0x91, 0xd4, 0x4d, 0xda, 0x3f, + 0xf4, 0xf6, 0x43, 0xe9, 0xc5, 0xde, 0x41, 0xbf, 0x37, 0x6c, 0x67, 0x4f, + 0x5d, 0xc1, 0x9c, 0xbd, 0x4b, 0x7b, 0xbc, 0x12, 0x49, 0xa1, 0xed, 0x4b, + 0x2f, 0xce, 0x09, 0x18, 0x48, 0x97, 0x6d, 0x30, 0x7a, 0xf5, 0xd9, 0x55, + 0xa8, 0xef, 0x09, 0x15, 0xc7, 0x46, 0xa5, 0x24, 0x6c, 0xa8, 0xe7, 0x1d, + 0x8d, 0x19, 0x63, 0x14, 0xcc, 0xe7, 0x04, 0x46, 0xcd, 0x27, 0xc1, 0x4f, + 0xc9, 0x49, 0x9e, 0x79, 0xf7, 0xbc, 0x37, 0x49, 0xa0, 0x54, 0xa7, 0x6b, + 0xa4, 0xe2, 0x30, 0x1c, 0xaa, 0x5e, 0x09, 0xa4, 0x62, 0x29, 0x0d, 0x12, + 0x2b, 0xb9, 0x40, 0xa5, 0xe4, 0x76, 0xd2, 0x91, 0x31, 0x0a, 0xe7, 0xc3, + 0x35, 0x17, 0xf2, 0xd7, 0x93, 0x0b, 0xbf, 0xf2, 0xfa, 0x1a, 0x27, 0x17, + 0xd1, 0xe4, 0x05, 0x58, 0x55, 0xe7, 0xc3, 0xb4, 0x9f, 0xe9, 0x49, 0xa0, + 0x7e, 0x50, 0xd5, 0x94, 0x60, 0x2c, 0xc9, 0x0b, 0xfe, 0x72, 0x27, 0x9d, + 0x16, 0x83, 0xb5, 0xd3, 0x79, 0xb7, 0xc3, 0xae, 0x56, 0x42, 0x45, 0x66, + 0x4c, 0xa0, 0x96, 0x89, 0x73, 0xfb, 0x3a, 0xb2, 0x4c, 0x73, 0xfa, 0xe9, + 0x8c, 0x0b, 0x1b, 0x93, 0xe4, 0x6e, 0x52, 0x3f, 0xd6, 0xb4, 0xa0, 0xac, + 0x69, 0x21, 0x5a, 0xeb, 0x99, 0x26, 0x08, 0x02, 0x75, 0x57, 0x86, 0x17, + 0xa9, 0xf9, 0x17, 0x2a, 0xe4, 0x85, 0x68, 0x95, 0x82, 0x92, 0x7a, 0xa6, + 0x97, 0x3e, 0xce, 0xc2, 0x8d, 0x6b, 0x92, 0x0b, 0x33, 0xc6, 0x72, 0x41, + 0x5a, 0x1b, 0xfc, 0xa4, 0x31, 0xb5, 0x6d, 0x69, 0x6a, 0xc0, 0xca, 0x9a, + 0x36, 0xc6, 0xf4, 0xa5, 0xb7, 0xda, 0x53, 0x69, 0x2e, 0x67, 0x8d, 0x5a, + 0x6f, 0x18, 0x98, 0x27, 0x5a, 0xb1, 0x27, 0x67, 0xe7, 0x95, 0x4d, 0xaa, + 0x9b, 0x75, 0xfc, 0xed, 0x98, 0xc7, 0x4e, 0x8e, 0x7f, 0x35, 0xaf, 0x35, + 0x5a, 0x89, 0x54, 0x0a, 0x86, 0xef, 0xa7, 0x1f, 0xa6, 0xe5, 0x07, 0x3e, + 0xe6, 0xf1, 0xef, 0x74, 0x3d, 0xc9, 0xff, 0x99, 0x3c, 0x0e, 0x06, 0xf9, + 0x61, 0x5a, 0xc3, 0xb2, 0x3b, 0xf5, 0x9e, 0xf7, 0x48, 0x8f, 0xff, 0xc2, + 0xe3, 0x7a, 0xf6, 0xd9, 0xd1, 0x36, 0x2e, 0xd9, 0xcc, 0x2c, 0x3d, 0xfb, + 0xac, 0xf4, 0xec, 0xe3, 0x8f, 0x4b, 0x92, 0xde, 0xe3, 0x95, 0x3d, 0x9e, + 0x8c, 0x97, 0x9d, 0xfe, 0xd4, 0xab, 0xaf, 0x4e, 0xed, 0xdf, 0x76, 0x18, + 0xb8, 0xce, 0x5e, 0x47, 0x0a, 0xcf, 0x3e, 0x3b, 0x5c, 0xc8, 0xeb, 0x64, + 0x1e, 0xff, 0x90, 0x3e, 0xb2, 0xc9, 0xfd, 0x19, 0x69, 0xdf, 0xbf, 0x62, + 0x62, 0xdc, 0x76, 0x67, 0x75, 0xb6, 0x70, 0xcf, 0x5d, 0x3b, 0xbe, 0x6f, + 0x23, 0xdb, 0xee, 0x7d, 0x49, 0x30, 0xe2, 0xc5, 0x65, 0x29, 0x72, 0x57, + 0xdf, 0x97, 0xa5, 0xe7, 0x4f, 0xdb, 0x60, 0xad, 0x4b, 0x2f, 0x6f, 0xb4, + 0x37, 0x53, 0xb5, 0x9e, 0xdb, 0xc0, 0x01, 0xe6, 0xd9, 0xa7, 0x24, 0x25, + 0xc7, 0x8d, 0x41, 0x60, 0x03, 0xb5, 0x1c, 0x3f, 0x58, 0xcb, 0x79, 0xfa, + 0xf3, 0xd2, 0xfb, 0x3f, 0x60, 0x87, 0x5f, 0x38, 0xa7, 0x6b, 0xcd, 0x27, + 0xc6, 0x55, 0x1c, 0x39, 0x22, 0x3d, 0xdb, 0x1b, 0x86, 0x6a, 0x6d, 0xc6, + 0xeb, 0xb8, 0xb3, 0xac, 0xd2, 0xdd, 0xc9, 0xf2, 0x32, 0xc6, 0x0e, 0x7f, + 0x7b, 0x78, 0x71, 0x58, 0x39, 0x28, 0x4b, 0x6f, 0x0a, 0x54, 0xbf, 0xbd, + 0xaa, 0xe4, 0x23, 0x85, 0xea, 0xb7, 0x57, 0xd5, 0x59, 0x35, 0x3a, 0x34, + 0x57, 0x55, 0xeb, 0xb5, 0xe1, 0xb8, 0xf5, 0xf9, 0x40, 0xf5, 0x3b, 0xeb, + 0x52, 0xd4, 0x93, 0x82, 0x92, 0xea, 0xa5, 0xb2, 0xd4, 0x93, 0x7d, 0x94, + 0xd4, 0x7a, 0xd5, 0xfb, 0x1c, 0x15, 0x86, 0xaa, 0xd6, 0x92, 0xe0, 0x99, + 0xb8, 0x33, 0x76, 0x58, 0xb2, 0xc7, 0x72, 0xc1, 0x3d, 0x65, 0x05, 0x8b, + 0x99, 0xc0, 0xd4, 0x38, 0x4e, 0xcb, 0xcc, 0x99, 0xe1, 0xfb, 0x5b, 0x0e, + 0x43, 0xd5, 0x6b, 0x0b, 0xc9, 0x28, 0x81, 0xea, 0xb5, 0x85, 0x91, 0x47, + 0x17, 0xd8, 0x6c, 0x5f, 0x4b, 0xa8, 0x85, 0x40, 0x72, 0x87, 0xda, 0x6b, + 0x86, 0xa3, 0x58, 0xad, 0x24, 0x70, 0xb8, 0x3c, 0x17, 0xaa, 0xba, 0xa7, + 0x21, 0x13, 0xdb, 0xd7, 0x5c, 0xde, 0xd3, 0x48, 0xfa, 0x28, 0xdb, 0xe7, + 0xd8, 0x2d, 0x0b, 0xdb, 0xe7, 0xf2, 0xcf, 0xb8, 0xd7, 0x11, 0xab, 0xe4, + 0xfa, 0x1e, 0xc7, 0xd2, 0x7d, 0xde, 0x70, 0xb2, 0xfc, 0x0e, 0x25, 0x41, + 0x3e, 0x9d, 0x15, 0xa3, 0x43, 0xb7, 0x2f, 0x48, 0x46, 0xe9, 0x32, 0xee, + 0xac, 0x9a, 0x91, 0x64, 0x91, 0x43, 0xfb, 0x92, 0xf7, 0x2b, 0x36, 0xaa, + 0xcf, 0xdb, 0x24, 0x93, 0x9e, 0x59, 0x1b, 0xcc, 0x80, 0xdd, 0x6b, 0xff, + 0xdb, 0x1b, 0x3a, 0xfb, 0x85, 0x53, 0x3a, 0xfc, 0x53, 0x36, 0x38, 0xaa, + 0x7e, 0x7b, 0x5d, 0xa7, 0x5f, 0x6a, 0xab, 0x3c, 0x17, 0x28, 0x9c, 0x0f, + 0xd3, 0x8b, 0xcd, 0x25, 0x1b, 0x7d, 0x12, 0x7f, 0xc2, 0x86, 0x41, 0xd5, + 0xbd, 0x80, 0xef, 0x78, 0x35, 0x52, 0x14, 0xc7, 0x3a, 0x54, 0x2b, 0x4b, + 0x66, 0x6d, 0x9b, 0x8d, 0x9a, 0x74, 0xf2, 0xf9, 0x48, 0xd5, 0xf9, 0xb2, + 0xca, 0xa1, 0xfd, 0x3f, 0x0c, 0x6e, 0x96, 0x3a, 0x17, 0x9b, 0x0a, 0x7e, + 0xf1, 0x29, 0x55, 0xf7, 0x35, 0xd4, 0xb8, 0x7b, 0x7f, 0x3a, 0x9f, 0x4e, + 0xa7, 0xa3, 0xee, 0xe5, 0x8e, 0x8e, 0xfe, 0x58, 0x72, 0x6c, 0xb9, 0xda, + 0x54, 0xe3, 0x5d, 0xfb, 0x75, 0xfa, 0xf1, 0x93, 0x3a, 0xfa, 0xf3, 0x8f, + 0xa8, 0x71, 0x4f, 0x5d, 0xd5, 0x7e, 0x4b, 0x9f, 0xfc, 0xed, 0x8e, 0x2a, + 0x7b, 0x6c, 0x70, 0x95, 0x24, 0x55, 0x2a, 0xa1, 0x96, 0xbf, 0x7e, 0x5a, + 0x9d, 0xff, 0xe1, 0x33, 0xaa, 0x1e, 0x38, 0xa8, 0x4a, 0x25, 0x4c, 0xeb, + 0x3a, 0x9d, 0x96, 0x1a, 0xef, 0xb2, 0xf3, 0x68, 0x1c, 0xa8, 0x6b, 0xf9, + 0xd9, 0xf3, 0x23, 0xd3, 0x1e, 0xbd, 0x5f, 0x7a, 0xea, 0xe9, 0x8e, 0x16, + 0x8e, 0x34, 0xd6, 0x7c, 0x77, 0x51, 0x95, 0x5b, 0x67, 0xbc, 0x36, 0xe7, + 0xa5, 0xce, 0xb7, 0x5b, 0xfa, 0xe0, 0xfb, 0xab, 0x32, 0x45, 0xe9, 0xd4, + 0x4b, 0xd2, 0x2f, 0xff, 0xbc, 0x5d, 0x8f, 0x3b, 0x92, 0x8e, 0x26, 0xa1, + 0x58, 0x4f, 0x3d, 0xdd, 0x51, 0xe3, 0x5d, 0xfb, 0xb5, 0xb0, 0x57, 0x3a, + 0xfd, 0xa5, 0xaa, 0xba, 0x97, 0x3b, 0xaa, 0x2a, 0x52, 0xe7, 0xa2, 0x51, + 0xe3, 0xfe, 0xa3, 0x5e, 0xff, 0x3a, 0x8a, 0x57, 0x3a, 0x7a, 0xf8, 0xa1, + 0x50, 0xb1, 0xa4, 0x73, 0x17, 0x93, 0x65, 0x71, 0xb1, 0xa9, 0xc3, 0x3f, + 0x6b, 0x97, 0xe3, 0xa1, 0x9a, 0xf4, 0x99, 0x74, 0x39, 0x0e, 0xf7, 0x5d, + 0x2f, 0x4b, 0x8a, 0x7f, 0xf5, 0x14, 0xbf, 0x54, 0x21, 0x15, 0x4b, 0x49, + 0x40, 0xd6, 0x30, 0x94, 0xaa, 0x23, 0x49, 0x5d, 0x1b, 0x2c, 0xd5, 0x91, + 0x6c, 0xa0, 0x56, 0x66, 0xba, 0x4e, 0x12, 0x9a, 0x95, 0xee, 0x46, 0x92, + 0xe7, 0x51, 0x14, 0xcb, 0x85, 0x1f, 0x29, 0x1d, 0xc7, 0xed, 0x4b, 0xeb, + 0x52, 0x57, 0xaa, 0x56, 0x16, 0x46, 0xca, 0xab, 0x15, 0x1b, 0x5c, 0x65, + 0xe7, 0x25, 0x9d, 0x7d, 0x4e, 0xaa, 0x1f, 0x59, 0xf0, 0xe6, 0x31, 0xdc, + 0x17, 0xbb, 0x71, 0x5d, 0x79, 0xdc, 0xed, 0xa8, 0x53, 0x0e, 0x47, 0xca, + 0xb3, 0xe3, 0xba, 0xb6, 0xf3, 0xfa, 0x1f, 0x4b, 0x7a, 0xb9, 0x69, 0xe7, + 0x5b, 0x2e, 0x87, 0x69, 0x00, 0x98, 0xdf, 0xb6, 0x92, 0x90, 0xb0, 0x46, + 0xa5, 0x9e, 0x04, 0x8f, 0xd5, 0xe5, 0x87, 0x6a, 0x65, 0x43, 0xb0, 0xb2, + 0x47, 0x9c, 0xf1, 0x37, 0x25, 0xdd, 0x3f, 0x5a, 0xe6, 0x02, 0xb5, 0xb2, + 0x81, 0x5c, 0x59, 0xd9, 0xe0, 0xad, 0x3c, 0x69, 0xfd, 0x94, 0xf5, 0xba, + 0x1a, 0xda, 0x20, 0x2d, 0xa7, 0x3e, 0x9f, 0xf7, 0x8d, 0xe7, 0x14, 0x6f, + 0x0c, 0x07, 0xd7, 0x7c, 0x67, 0x9e, 0x51, 0x99, 0x0b, 0xd2, 0xc0, 0x5d, + 0xc9, 0xa8, 0x92, 0x7c, 0xc7, 0xd8, 0x33, 0x36, 0xcd, 0xa3, 0x97, 0x4c, + 0x7f, 0xfa, 0xd9, 0xcf, 0xab, 0x13, 0x1b, 0x99, 0x7e, 0xa4, 0xb8, 0xef, + 0x7d, 0xc7, 0xe0, 0x7d, 0x4f, 0x3e, 0xae, 0xfc, 0x93, 0xff, 0xec, 0x53, + 0xf9, 0xe3, 0x7b, 0x41, 0x59, 0xad, 0x95, 0x8e, 0xaa, 0xd5, 0xcc, 0xf7, + 0x0f, 0x6f, 0x68, 0x5d, 0x5a, 0xad, 0xa6, 0xd4, 0x89, 0xa4, 0xaa, 0xd4, + 0xeb, 0x97, 0xf4, 0xf9, 0x17, 0x9f, 0x91, 0xfb, 0xc6, 0xb8, 0x93, 0x1c, + 0xe0, 0x45, 0x57, 0xec, 0xf7, 0x7d, 0x61, 0x51, 0x36, 0x2d, 0x55, 0x92, + 0xe6, 0xed, 0x0a, 0x12, 0x26, 0x79, 0x11, 0x71, 0x14, 0x29, 0xb8, 0xa5, + 0xaa, 0xea, 0xcd, 0x91, 0xcc, 0x1b, 0x1d, 0x7d, 0xe0, 0xc8, 0xc3, 0xfa, + 0xec, 0xb3, 0xcf, 0xd8, 0xfe, 0x4b, 0x3a, 0xf5, 0x82, 0x1d, 0x0e, 0xe7, + 0xdc, 0x3e, 0xd3, 0x28, 0x08, 0x92, 0x6b, 0xff, 0x93, 0xc5, 0x5d, 0xde, + 0x63, 0xa4, 0x0b, 0xb3, 0xf7, 0x3d, 0x50, 0x59, 0x61, 0x58, 0x4d, 0x82, + 0xb0, 0x3a, 0xf6, 0x7b, 0xec, 0xf4, 0x73, 0xdc, 0x11, 0x49, 0xcf, 0xc9, + 0xf4, 0xeb, 0x0a, 0x8a, 0xc9, 0xf7, 0xd5, 0xc5, 0x4a, 0xf2, 0x3b, 0x41, + 0x12, 0xa8, 0x55, 0x8c, 0x14, 0xa8, 0xaa, 0xf6, 0x65, 0x1b, 0x91, 0x12, + 0x14, 0x1b, 0xaa, 0xcc, 0xd7, 0xd5, 0xbe, 0xbc, 0x36, 0x70, 0x2b, 0x28, + 0x96, 0x73, 0x87, 0x93, 0x57, 0xaf, 0xe6, 0xe5, 0xe4, 0xf5, 0x05, 0x0d, + 0x05, 0x61, 0x28, 0x93, 0x0d, 0xfb, 0xf2, 0xf5, 0x87, 0x8f, 0x41, 0x51, + 0x32, 0xfd, 0xde, 0xf0, 0x31, 0xa9, 0x9a, 0xf4, 0x1f, 0x98, 0x0d, 0xcb, + 0x9a, 0x65, 0x9c, 0xfc, 0xf6, 0xd6, 0x96, 0x66, 0x43, 0xb1, 0x66, 0x35, + 0x71, 0xba, 0xcc, 0x77, 0xab, 0x79, 0xdf, 0xe5, 0x4f, 0x72, 0xa6, 0xed, + 0xc2, 0x9a, 0xda, 0x23, 0xe5, 0xb5, 0x5a, 0x12, 0xa6, 0xd5, 0xb6, 0x01, + 0x55, 0x4e, 0x5b, 0x6d, 0x9d, 0x38, 0x61, 0xc3, 0xa1, 0x5c, 0x60, 0xd6, + 0xf1, 0xe3, 0x35, 0x1d, 0x3f, 0xd1, 0xd6, 0xd2, 0x92, 0xd6, 0x58, 0x5c, + 0x5c, 0xd2, 0x89, 0x13, 0x27, 0xec, 0x70, 0x5b, 0xaa, 0x1d, 0x1f, 0xd6, + 0x2d, 0x1d, 0xb7, 0x81, 0x53, 0x67, 0x4e, 0x48, 0x5a, 0xb2, 0x41, 0x5c, + 0x4b, 0xc7, 0x5d, 0xbf, 0x6c, 0xb9, 0x0b, 0xe9, 0x72, 0x61, 0x5c, 0xae, + 0x5f, 0x8b, 0x4b, 0x52, 0xbb, 0xdd, 0x56, 0xad, 0x66, 0x43, 0xb6, 0x24, + 0xa9, 0x76, 0xbc, 0xa6, 0xb6, 0xda, 0x3a, 0xde, 0x6e, 0x4b, 0x67, 0xa4, + 0xa5, 0x9a, 0x74, 0xa6, 0xd6, 0x56, 0x4d, 0x35, 0x2d, 0x1d, 0xb7, 0x41, + 0x60, 0x4b, 0xc7, 0xed, 0x74, 0x8b, 0x49, 0xe7, 0xcf, 0x48, 0xfa, 0xf1, + 0xee, 0xf0, 0xb5, 0xff, 0xf8, 0x92, 0xf4, 0x70, 0xf2, 0xba, 0x16, 0x6b, + 0x35, 0xd5, 0x96, 0x86, 0x75, 0xc7, 0x4f, 0xd8, 0xe1, 0xa5, 0x25, 0x1b, + 0xa8, 0x55, 0x93, 0x1f, 0x38, 0xa6, 0xb4, 0x23, 0x27, 0xdc, 0xb2, 0x3a, + 0x93, 0x2c, 0xd5, 0x64, 0x9c, 0x33, 0xb5, 0x9a, 0xce, 0xa8, 0xad, 0x45, + 0xef, 0xf5, 0x0f, 0x17, 0x86, 0x74, 0x3c, 0x99, 0xbe, 0xdd, 0x96, 0xde, + 0xe7, 0x55, 0x1d, 0xff, 0xb5, 0x24, 0x48, 0xac, 0xbd, 0x36, 0x04, 0x6d, + 0x69, 0x51, 0xfa, 0xb3, 0x69, 0x81, 0x8a, 0x7e, 0x60, 0x88, 0xbb, 0x59, + 0xc9, 0x46, 0xc3, 0xa6, 0xb2, 0x6d, 0x65, 0xad, 0xf9, 0xae, 0x3f, 0x98, + 0x9e, 0xcb, 0x2c, 0xbb, 0x5f, 0x08, 0xc3, 0x61, 0xb8, 0xb6, 0xbb, 0x69, + 0x49, 0x1c, 0xbb, 0x83, 0x05, 0x2f, 0x80, 0xcb, 0x85, 0x52, 0x4d, 0xeb, + 0xdf, 0x56, 0xf1, 0xdb, 0x1f, 0x09, 0x29, 0x93, 0x4c, 0x51, 0x72, 0xf1, + 0x5a, 0x66, 0x35, 0x92, 0xe6, 0xca, 0x0a, 0xfa, 0x3d, 0x99, 0x38, 0x52, + 0xaf, 0x6f, 0x54, 0xaf, 0x35, 0xd4, 0xed, 0x76, 0x54, 0xdf, 0x53, 0x57, + 0x10, 0xd8, 0xb0, 0x31, 0x13, 0x45, 0x8a, 0x4c, 0xac, 0x07, 0xdf, 0xfd, + 0x61, 0x45, 0xab, 0x5d, 0x3d, 0x78, 0x64, 0x41, 0x9f, 0xfd, 0xc3, 0x8f, + 0xaa, 0x7d, 0xa9, 0xad, 0xf6, 0xa5, 0xb6, 0x0e, 0xdd, 0xff, 0x01, 0x9d, + 0xfb, 0xe6, 0xe7, 0x25, 0x49, 0x0f, 0x17, 0x6b, 0x33, 0x75, 0x31, 0x28, + 0xf6, 0x24, 0x95, 0x6c, 0x4f, 0x8a, 0xd2, 0xb9, 0xbe, 0xdd, 0xc7, 0xc4, + 0xc9, 0xf6, 0xf1, 0x9c, 0xa4, 0x30, 0xe9, 0x6f, 0xd8, 0x37, 0xc9, 0x78, + 0xc1, 0xd8, 0xfd, 0x73, 0x28, 0x23, 0x63, 0x02, 0x75, 0x02, 0x69, 0xd9, + 0x98, 0xf4, 0xd8, 0xc8, 0xc5, 0x3f, 0xc6, 0x7d, 0xa9, 0x27, 0xa3, 0x50, + 0x3d, 0x7d, 0x42, 0xd2, 0x67, 0x8b, 0xe9, 0x11, 0x9d, 0x5e, 0xf6, 0xbe, + 0xff, 0x7b, 0xb0, 0x68, 0xe7, 0xfd, 0x1b, 0x2f, 0x06, 0xea, 0x7c, 0xb3, + 0x63, 0x23, 0x13, 0x8b, 0xd2, 0xa9, 0xbe, 0xd4, 0x90, 0xfd, 0xdf, 0xb4, + 0x47, 0x4a, 0xc9, 0xbe, 0x4c, 0xc3, 0x58, 0xc5, 0x27, 0xee, 0x93, 0x3e, + 0xf2, 0xad, 0x24, 0x34, 0x4b, 0x36, 0xb0, 0xaa, 0xde, 0x97, 0x92, 0x78, + 0x49, 0x75, 0xbc, 0xf6, 0x8f, 0x3d, 0x2f, 0xe9, 0x85, 0x8e, 0x4a, 0x2a, + 0xa5, 0xaf, 0xdb, 0x05, 0x6a, 0xb9, 0xc7, 0x63, 0x7d, 0xa5, 0xfb, 0x89, + 0x0f, 0xfe, 0xaf, 0xa1, 0xfe, 0xc7, 0xe7, 0x63, 0x1d, 0x3b, 0x27, 0x2d, + 0x24, 0x7d, 0x8f, 0xfb, 0x25, 0x7d, 0x46, 0x3d, 0x3d, 0x39, 0x57, 0x92, + 0xfa, 0x3d, 0x3d, 0xe5, 0xfd, 0xce, 0x79, 0xec, 0x79, 0xef, 0x35, 0x49, + 0x6a, 0x07, 0x52, 0xab, 0x6f, 0x97, 0xc7, 0x72, 0xdf, 0x7e, 0x6f, 0xe3, + 0x82, 0xbc, 0xa2, 0xbe, 0xfd, 0x85, 0xbe, 0x5c, 0x94, 0x3e, 0x2b, 0x69, + 0xbf, 0x92, 0x63, 0xe4, 0xe2, 0xda, 0x65, 0x73, 0x2a, 0x09, 0xd6, 0x8a, + 0x9e, 0x9f, 0xb0, 0x8f, 0x4b, 0xb8, 0xa0, 0x26, 0x69, 0x18, 0xf2, 0x24, + 0x69, 0x24, 0xfc, 0xe9, 0x8d, 0xce, 0xf7, 0xd3, 0x20, 0xaa, 0xbb, 0xee, + 0xba, 0x2b, 0x0d, 0x81, 0xf2, 0x83, 0xa2, 0x5e, 0x79, 0xe5, 0x15, 0x49, + 0xd2, 0xd1, 0x7b, 0x6f, 0x4b, 0xdb, 0xfc, 0xfe, 0x0f, 0xde, 0xd0, 0x5d, + 0xd5, 0x61, 0x28, 0x94, 0xdf, 0x9e, 0xcf, 0x05, 0x5c, 0x65, 0xc7, 0x7b, + 0xe5, 0x95, 0x57, 0xa4, 0x82, 0x0d, 0x8e, 0x3a, 0x9d, 0xcc, 0x33, 0xed, + 0x47, 0xd5, 0xd6, 0xdf, 0x55, 0x1d, 0xf6, 0xd5, 0xb5, 0xeb, 0x87, 0x66, + 0x6d, 0x76, 0x9b, 0x7e, 0x99, 0x7b, 0xfd, 0x17, 0x5f, 0x7c, 0x41, 0xdf, + 0x7f, 0xe3, 0x0d, 0x1d, 0xbd, 0xf7, 0xb6, 0x9d, 0x5d, 0xa6, 0x85, 0x9b, + 0x35, 0x4d, 0xfd, 0x96, 0x9a, 0x1a, 0xf7, 0xd6, 0x55, 0xdd, 0x5b, 0xd2, + 0xe9, 0x2f, 0x9e, 0x55, 0xe3, 0xee, 0x05, 0x49, 0xa1, 0xc2, 0x30, 0x50, + 0x10, 0x8c, 0x86, 0x8d, 0x76, 0x2e, 0x75, 0xd4, 0xfc, 0x76, 0x53, 0x87, + 0x1f, 0x38, 0x2c, 0xb3, 0x32, 0x1a, 0x68, 0x1a, 0x24, 0xdf, 0xd7, 0x19, + 0xd3, 0xd5, 0xc1, 0xb7, 0x1f, 0x94, 0x31, 0x5d, 0x55, 0xf7, 0xda, 0xe3, + 0xd2, 0xa0, 0x1f, 0xa8, 0x3e, 0x5f, 0x55, 0x6b, 0xa5, 0xa3, 0x70, 0xd5, + 0x28, 0xbc, 0xa7, 0x22, 0x45, 0x46, 0xcb, 0x5f, 0x3b, 0xa7, 0xc6, 0x42, + 0xc3, 0x86, 0x68, 0x25, 0x37, 0xb8, 0xd2, 0x9c, 0x14, 0xcc, 0x87, 0x6a, + 0xcc, 0xdb, 0xdf, 0xd6, 0x17, 0x1e, 0x38, 0x2a, 0xd3, 0x97, 0xaa, 0x7b, + 0x87, 0xdf, 0xb7, 0x54, 0xe7, 0xab, 0xea, 0xc4, 0x46, 0xe5, 0xd5, 0x96, + 0xaa, 0xf3, 0x0b, 0xd2, 0x6a, 0x24, 0x53, 0x2c, 0xab, 0x5c, 0x94, 0x2a, + 0xfb, 0xea, 0x32, 0xb1, 0x64, 0xba, 0x91, 0xea, 0xf3, 0xa1, 0xca, 0xf3, + 0x0d, 0x19, 0x63, 0xf4, 0xf2, 0xc5, 0x96, 0xea, 0x95, 0xaa, 0xc2, 0xb9, + 0x50, 0x3d, 0x05, 0x8a, 0x57, 0x62, 0x85, 0xf3, 0xa1, 0x4a, 0x81, 0x3d, + 0x36, 0x0c, 0xf7, 0x54, 0xd5, 0xba, 0xf0, 0xb2, 0x8e, 0xee, 0xab, 0x2b, + 0xee, 0x76, 0x15, 0xaf, 0x1e, 0xd4, 0xe1, 0x3d, 0xde, 0x79, 0x3a, 0xdd, + 0xae, 0x5a, 0xa6, 0xa7, 0x83, 0x95, 0xd1, 0xcf, 0x2a, 0xbd, 0x64, 0xbb, + 0xdd, 0xeb, 0x97, 0x15, 0xce, 0x97, 0x14, 0xc7, 0x3d, 0xa9, 0x6f, 0xd4, + 0x32, 0x5d, 0x35, 0x24, 0x75, 0x56, 0xed, 0x8d, 0xf3, 0x16, 0x6a, 0x95, + 0x91, 0xe9, 0x3a, 0xa6, 0xa3, 0x46, 0x25, 0x54, 0x49, 0x3d, 0x05, 0x41, + 0xa0, 0x46, 0xa3, 0xa1, 0x73, 0xe7, 0xda, 0x69, 0x7d, 0x78, 0x4b, 0x35, + 0x0d, 0x97, 0x8d, 0x4c, 0xa4, 0x85, 0x62, 0xa8, 0x4e, 0x14, 0xcb, 0xc4, + 0x2d, 0x45, 0x3d, 0xa3, 0x86, 0xdf, 0xb7, 0xdc, 0x33, 0x46, 0xf2, 0xb9, + 0x70, 0xa8, 0xbc, 0x40, 0x2d, 0x3f, 0x10, 0xea, 0x7b, 0x17, 0x63, 0xdd, + 0xb1, 0x2f, 0x4c, 0xeb, 0x5c, 0x20, 0x94, 0x1f, 0xa8, 0x95, 0x17, 0xae, + 0xe5, 0x64, 0x03, 0xb5, 0xc6, 0x71, 0x41, 0x58, 0x92, 0xf4, 0x73, 0xff, + 0xf8, 0x5d, 0xfa, 0xdf, 0x7f, 0xe5, 0x9f, 0xa6, 0xd3, 0x66, 0xc3, 0xbe, + 0xde, 0xf1, 0xb6, 0x77, 0xea, 0xfb, 0xff, 0xf1, 0x7b, 0xfa, 0xc6, 0xf3, + 0xcf, 0xe9, 0x27, 0xdf, 0xb7, 0xb4, 0x26, 0x3c, 0xcb, 0x8d, 0x93, 0xf5, + 0x47, 0x7f, 0x72, 0x42, 0xef, 0xb0, 0x99, 0x57, 0x69, 0xa0, 0x96, 0x3f, + 0xec, 0x5e, 0xcb, 0x77, 0x5f, 0x7d, 0x2d, 0xf7, 0x75, 0xbb, 0xf9, 0x66, + 0x5f, 0xeb, 0xad, 0x3f, 0x7c, 0xc7, 0x9a, 0xd7, 0xee, 0xf7, 0x37, 0x1b, + 0x2c, 0x36, 0x75, 0x99, 0xd4, 0x24, 0x9d, 0xa9, 0x25, 0xa9, 0xa9, 0xb5, + 0x61, 0xb0, 0xd6, 0x89, 0xa4, 0xae, 0x2d, 0xe9, 0xab, 0x93, 0x9b, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4c, 0xc6, + 0xa5, 0x0a, 0x00, 0x00, 0x5c, 0x73, 0x02, 0x1b, 0xb0, 0x50, 0x2c, 0x49, + 0xc6, 0x5e, 0x7c, 0xe3, 0x82, 0xb5, 0xb2, 0xdc, 0xc9, 0xc8, 0x41, 0x30, + 0x0c, 0x1f, 0x92, 0x92, 0x8b, 0x81, 0x82, 0x40, 0x41, 0x72, 0x02, 0xb3, + 0xa4, 0xb1, 0xe1, 0x5a, 0x41, 0x10, 0xc8, 0xc4, 0x3d, 0x05, 0x61, 0x49, + 0xea, 0x9b, 0xe1, 0xc5, 0x1b, 0x73, 0xa1, 0xe2, 0xb9, 0x40, 0xd1, 0xe5, + 0xe4, 0x42, 0xea, 0x39, 0xaf, 0x07, 0x3d, 0xc9, 0x9d, 0x4c, 0x19, 0x04, + 0x81, 0xca, 0x2a, 0x2b, 0x52, 0xa4, 0x50, 0x65, 0xc5, 0x71, 0x24, 0xc5, + 0xa3, 0xc1, 0x60, 0xc3, 0x60, 0xa4, 0xce, 0x48, 0xb9, 0x0b, 0x31, 0x89, + 0x8d, 0x91, 0x3a, 0x1d, 0x95, 0x93, 0x0b, 0x32, 0x47, 0xc3, 0xb5, 0xec, + 0x32, 0x09, 0x82, 0x40, 0xdd, 0xb8, 0xa3, 0x7a, 0x58, 0x56, 0x2f, 0x39, + 0x29, 0xb8, 0x24, 0x29, 0xac, 0x54, 0x15, 0x48, 0xaa, 0xcc, 0x57, 0x75, + 0xce, 0xbf, 0xc0, 0xde, 0x5b, 0x1e, 0x26, 0x69, 0x27, 0x28, 0x06, 0x32, + 0x7d, 0x7b, 0xc7, 0xd4, 0x4e, 0x72, 0x81, 0xb9, 0x0b, 0x02, 0xcb, 0x13, + 0xc7, 0x91, 0x1a, 0x7b, 0xca, 0x6a, 0xb5, 0xd7, 0xde, 0xed, 0x7e, 0xa3, + 0x5c, 0x38, 0x94, 0x24, 0x85, 0x61, 0xa0, 0x9e, 0xbb, 0x1b, 0x6a, 0xec, + 0xfa, 0x6b, 0xd2, 0xc0, 0xa7, 0xce, 0x4a, 0xac, 0xfa, 0x7c, 0x98, 0x4e, + 0x53, 0x0d, 0x87, 0x77, 0xa6, 0x76, 0x7f, 0xad, 0xcb, 0xf1, 0xf0, 0x49, + 0x3f, 0x48, 0xc2, 0xb0, 0x02, 0xb5, 0xba, 0xc3, 0xf9, 0xc4, 0x2b, 0x91, + 0x54, 0x0c, 0x14, 0xce, 0xc9, 0xfe, 0x5f, 0x25, 0x5a, 0x71, 0x27, 0xbd, + 0x0b, 0xb3, 0x0b, 0xd1, 0x1a, 0x99, 0x2e, 0x5e, 0x7b, 0xb2, 0xbb, 0x49, + 0x82, 0xdb, 0xf2, 0xf8, 0x81, 0x5a, 0xe5, 0x60, 0x34, 0xc8, 0x2a, 0x8a, + 0x8d, 0xe2, 0x95, 0x78, 0xf4, 0x02, 0x9c, 0xc0, 0x86, 0x0c, 0x74, 0xbc, + 0x8b, 0xfd, 0x5d, 0x38, 0x56, 0x39, 0x0d, 0x82, 0x4a, 0x4e, 0x74, 0x37, + 0xc3, 0x70, 0xa8, 0xea, 0x7c, 0x68, 0x4f, 0xb2, 0x0d, 0x92, 0x79, 0xae, + 0x0c, 0x03, 0xb5, 0xca, 0x73, 0x41, 0xda, 0x87, 0x78, 0x65, 0x78, 0x17, + 0x6c, 0x7f, 0x99, 0x4e, 0xea, 0xa7, 0x24, 0xb5, 0x2e, 0x75, 0x15, 0xcc, + 0x05, 0x69, 0x5f, 0x5d, 0x88, 0x56, 0xb6, 0x9f, 0xd7, 0xe2, 0xbd, 0x40, + 0xf3, 0x02, 0xb4, 0xe2, 0xd5, 0xb5, 0x81, 0x1d, 0x2e, 0x48, 0x6b, 0x5a, + 0xa0, 0x96, 0x31, 0x46, 0xa5, 0xa0, 0x34, 0x1a, 0x92, 0x37, 0x8d, 0x77, + 0x91, 0xd9, 0xba, 0x3e, 0x6d, 0x8c, 0x19, 0xd7, 0xf4, 0x8c, 0x82, 0xd2, + 0xf0, 0x22, 0x92, 0x0d, 0x49, 0xfa, 0x92, 0x0d, 0xd1, 0x2a, 0xcd, 0x95, + 0xd4, 0x5b, 0xcd, 0x59, 0x06, 0xeb, 0x9c, 0x8f, 0x0b, 0x20, 0x74, 0x01, + 0x4f, 0xee, 0xb9, 0x1f, 0x4c, 0x98, 0x37, 0x3c, 0xeb, 0xf8, 0xdb, 0x31, + 0x8f, 0x6b, 0x65, 0x7c, 0x17, 0x96, 0xb5, 0x9e, 0xb6, 0x3b, 0x97, 0x87, + 0x17, 0x84, 0xf8, 0xff, 0xaf, 0xfe, 0xff, 0x6d, 0x39, 0x2c, 0x2b, 0x8a, + 0xa3, 0x35, 0x65, 0x1b, 0xe5, 0xc2, 0xb3, 0xd6, 0x86, 0x69, 0xd9, 0xb2, + 0xc7, 0x1f, 0x97, 0x7e, 0xe1, 0x17, 0x46, 0xa7, 0xf9, 0xbd, 0xdf, 0xb3, + 0x8f, 0x7e, 0xf9, 0xac, 0x65, 0xd7, 0x92, 0x3b, 0xf7, 0xce, 0x76, 0x52, + 0xfc, 0xb5, 0xe2, 0xd2, 0x55, 0x84, 0x91, 0x7d, 0xe0, 0x9e, 0x8a, 0x4a, + 0x92, 0x9e, 0x7a, 0xe0, 0xe3, 0x32, 0x8f, 0x7f, 0x48, 0x0f, 0xee, 0x91, + 0x4e, 0x5d, 0x96, 0x7e, 0xeb, 0xf7, 0x3f, 0xad, 0x8f, 0xfc, 0x83, 0x0f, + 0x6d, 0xb8, 0xdd, 0xf2, 0x81, 0xc3, 0x0a, 0x8a, 0x52, 0xdc, 0x0d, 0xd2, + 0xcb, 0x1e, 0xa2, 0x4b, 0xcd, 0xb1, 0x17, 0xe8, 0x99, 0x55, 0x23, 0xd5, + 0xec, 0x31, 0xd2, 0xc8, 0xf6, 0x29, 0x94, 0xd4, 0x5f, 0xbb, 0x0d, 0xbb, + 0xa1, 0xc7, 0x5f, 0x1d, 0xb3, 0x3f, 0x5a, 0xcd, 0x39, 0x66, 0xc9, 0x1f, + 0x33, 0xdf, 0xc5, 0x24, 0x84, 0xa0, 0x1c, 0x48, 0xaa, 0x4a, 0x2b, 0x1d, + 0x1b, 0xac, 0x35, 0xc1, 0x87, 0x7f, 0xff, 0x31, 0x7d, 0xea, 0x0f, 0x3f, + 0x23, 0x7d, 0x6b, 0xfa, 0x45, 0x69, 0x23, 0xfd, 0x4a, 0x2e, 0xae, 0x3b, + 0xbb, 0x09, 0xf9, 0x56, 0x26, 0x09, 0xa8, 0x4d, 0x3d, 0x6f, 0xc3, 0x62, + 0xe4, 0x02, 0x73, 0x5b, 0x6d, 0x69, 0xbe, 0x3a, 0x1a, 0x48, 0x95, 0xe7, + 0xdd, 0xfb, 0xa5, 0xaf, 0x6c, 0x5d, 0x78, 0x58, 0xae, 0x7f, 0xff, 0xe5, + 0xd1, 0xe7, 0x7d, 0x33, 0x1a, 0x10, 0xe6, 0x54, 0x2b, 0xb3, 0xbf, 0x8e, + 0x69, 0xfc, 0xab, 0xff, 0xbd, 0x61, 0x93, 0x1c, 0x7f, 0x06, 0x37, 0x4b, + 0x92, 0x51, 0x7c, 0x45, 0x0a, 0x6f, 0x71, 0x01, 0xb3, 0xf6, 0x18, 0x3c, + 0x8e, 0xb3, 0x4d, 0x19, 0x99, 0xc8, 0x3e, 0x4a, 0x46, 0x26, 0x0a, 0xa4, + 0x72, 0x69, 0x18, 0x58, 0x90, 0xe8, 0xc9, 0x48, 0x73, 0x65, 0x69, 0xa5, + 0x63, 0x83, 0x6a, 0xc3, 0xea, 0x30, 0x90, 0x2a, 0x3b, 0xac, 0xae, 0x4c, + 0xbf, 0x27, 0xcd, 0x85, 0xd2, 0x4a, 0x66, 0x86, 0x61, 0xa8, 0x20, 0xd3, + 0x89, 0xb8, 0x2f, 0x05, 0x73, 0x92, 0x49, 0x82, 0xb0, 0x82, 0xd0, 0x0e, + 0xfb, 0x8f, 0x69, 0x8a, 0x86, 0x69, 0x29, 0x0c, 0x16, 0x14, 0x47, 0xb1, + 0xc2, 0x72, 0x72, 0x21, 0x71, 0x66, 0x38, 0xf0, 0xaf, 0xc3, 0x0a, 0xab, + 0x36, 0x50, 0x2b, 0x4c, 0xd6, 0xc5, 0x71, 0xc3, 0x2e, 0xac, 0x27, 0xe9, + 0x5b, 0x2f, 0x08, 0x55, 0x8a, 0x63, 0xf5, 0x8c, 0xa4, 0xb9, 0x20, 0x2d, + 0x97, 0xf7, 0x19, 0xa0, 0xb3, 0x92, 0x7c, 0xb6, 0x99, 0x0b, 0x46, 0x86, + 0xdd, 0xb2, 0x6e, 0x8f, 0xbc, 0xc8, 0x24, 0x54, 0x38, 0xa8, 0x0c, 0xc3, + 0xb4, 0xf8, 0x36, 0x1b, 0x9e, 0x5a, 0xcd, 0x48, 0xef, 0x3e, 0xaa, 0x5a, + 0xcd, 0x68, 0xf9, 0xdb, 0x1d, 0xc5, 0x97, 0xba, 0xaa, 0x27, 0x61, 0x06, + 0xf5, 0xbb, 0xeb, 0x6a, 0x7d, 0x7b, 0xf8, 0x59, 0xbe, 0xbe, 0xa7, 0xaa, + 0xe5, 0x4b, 0x2d, 0xd5, 0xef, 0x4d, 0xc2, 0x14, 0x65, 0x54, 0x5f, 0xa8, + 0x6b, 0xf9, 0xf9, 0x48, 0xf5, 0x3d, 0x75, 0x9d, 0xfb, 0x5a, 0xa4, 0xf0, + 0xce, 0xb2, 0x1a, 0x5e, 0x9b, 0xcd, 0x8b, 0x81, 0x3a, 0xaf, 0x76, 0xb4, + 0x7f, 0x6f, 0x55, 0x51, 0x6c, 0xd4, 0x38, 0x64, 0xd4, 0x3c, 0x67, 0x64, + 0xde, 0x90, 0x1a, 0xf7, 0x1d, 0x56, 0xf3, 0x5b, 0x67, 0x55, 0xaf, 0x35, + 0x24, 0xf5, 0xa4, 0x50, 0x6a, 0xec, 0x93, 0xf4, 0x2d, 0x1b, 0x5c, 0x75, + 0xea, 0xe9, 0x24, 0x88, 0x6e, 0xa1, 0x6a, 0xcb, 0xdf, 0xff, 0x88, 0x1a, + 0xfb, 0xa4, 0xe5, 0xaf, 0x34, 0xb5, 0x5c, 0x91, 0x1a, 0x77, 0xef, 0x57, + 0x14, 0x45, 0x6a, 0xdc, 0x6b, 0x74, 0xfa, 0x4b, 0x91, 0xca, 0x73, 0x55, + 0x2d, 0xfc, 0x9d, 0xa3, 0x5a, 0xfe, 0xfa, 0x69, 0x2d, 0x2c, 0x34, 0xb4, + 0xfc, 0xc2, 0x79, 0x55, 0x1b, 0x55, 0x35, 0xee, 0xa9, 0x4b, 0x67, 0xa4, + 0xfa, 0x3e, 0xa3, 0xe5, 0x97, 0x9a, 0x5a, 0xd8, 0x3b, 0x3a, 0xed, 0xf2, + 0x37, 0xa5, 0x53, 0x17, 0xa4, 0x72, 0xb9, 0x2c, 0x23, 0xa3, 0x85, 0x7b, + 0xa5, 0xd3, 0x5f, 0x8a, 0xd4, 0xd8, 0x33, 0x87, 0x77, 0x84, 0x00, 0x00, + 0x20, 0x00, 0x49, 0x44, 0x41, 0x54, 0x6b, 0x43, 0xb2, 0x9a, 0x17, 0xcf, + 0x4b, 0x92, 0x16, 0xde, 0x7e, 0x50, 0xcb, 0x2f, 0x9c, 0xd7, 0xd1, 0x9f, + 0x3a, 0xac, 0xe6, 0x4b, 0xad, 0x34, 0x10, 0xeb, 0xec, 0x19, 0xa9, 0xb1, + 0x58, 0x57, 0x67, 0xd5, 0x86, 0x91, 0x2c, 0x5f, 0x6a, 0x6a, 0xb9, 0x2b, + 0x1d, 0xbd, 0x3f, 0x50, 0xb9, 0x5c, 0x4e, 0xca, 0xa4, 0xee, 0xe5, 0x8e, + 0x1a, 0x77, 0xef, 0x57, 0xf3, 0xdb, 0xe7, 0x93, 0x40, 0xad, 0x50, 0x9d, + 0x4e, 0x47, 0x47, 0x1f, 0x0a, 0xd5, 0xf9, 0xa2, 0x54, 0xaf, 0x35, 0xf4, + 0xcc, 0xd3, 0x5d, 0x95, 0xc3, 0x8a, 0x16, 0xde, 0x95, 0x2c, 0xe1, 0x77, + 0x1f, 0x55, 0xa3, 0x26, 0x2d, 0xbf, 0x68, 0xa4, 0xc8, 0x68, 0xff, 0x5e, + 0x3b, 0xcf, 0xda, 0x82, 0x0d, 0x76, 0xe8, 0x75, 0xa4, 0xfa, 0x9e, 0xba, + 0x96, 0x2f, 0x6d, 0xde, 0x77, 0x2e, 0xb8, 0xfe, 0x3d, 0xf5, 0xc5, 0x67, + 0xbc, 0x67, 0xcb, 0x63, 0xc6, 0x5a, 0x1e, 0x19, 0xae, 0x87, 0x81, 0x4e, + 0x9f, 0x5b, 0xd6, 0x07, 0x25, 0xe9, 0x21, 0x57, 0xfe, 0xf0, 0x9a, 0x60, + 0xab, 0x46, 0xa5, 0xae, 0x78, 0xf4, 0x9a, 0x66, 0x49, 0xcf, 0xe8, 0xa9, + 0x2f, 0xda, 0xa1, 0xba, 0xa4, 0xc3, 0x0f, 0x49, 0x4f, 0x7d, 0x71, 0x74, + 0xbe, 0xf5, 0xb0, 0x23, 0x75, 0x1b, 0x23, 0xed, 0x34, 0x2b, 0x52, 0xa7, + 0x7b, 0x4a, 0xad, 0x73, 0x46, 0xd9, 0xff, 0xe0, 0xd6, 0xb9, 0xe5, 0xb4, + 0x8f, 0xae, 0x4f, 0x2f, 0x37, 0x1f, 0x56, 0xb5, 0xa2, 0x34, 0x28, 0x4c, + 0xb2, 0x87, 0x39, 0xf6, 0xb1, 0x2e, 0xe9, 0x19, 0xe9, 0x8b, 0xd2, 0x53, + 0xc9, 0x74, 0xe5, 0xc6, 0x82, 0xa4, 0x61, 0xff, 0x1b, 0x95, 0xba, 0x5a, + 0xcd, 0xa6, 0x4e, 0x27, 0x6d, 0xd7, 0x43, 0xa9, 0xd5, 0xb4, 0xeb, 0xed, + 0xcf, 0x3f, 0x67, 0xa7, 0xf1, 0x03, 0xaf, 0xf2, 0xc2, 0xaf, 0xfc, 0xb2, + 0x5a, 0x68, 0x0f, 0x13, 0xdc, 0xa1, 0x82, 0x0b, 0xda, 0x5a, 0x57, 0x90, + 0xd6, 0xfd, 0x92, 0xbc, 0xf9, 0xa5, 0xed, 0xcc, 0xa8, 0x13, 0xdb, 0x60, + 0x2d, 0xa7, 0xb5, 0xd2, 0xd3, 0xc1, 0x46, 0x59, 0x9d, 0x2b, 0xb1, 0xaa, + 0xe1, 0xe8, 0x77, 0x71, 0xa6, 0xdf, 0x53, 0x75, 0x6e, 0x78, 0x7c, 0xde, + 0x49, 0x3e, 0x17, 0xfc, 0xf2, 0x2f, 0x7c, 0x5c, 0x9f, 0xff, 0xec, 0x27, + 0x47, 0xca, 0x62, 0x53, 0x52, 0x18, 0xf4, 0xd2, 0x61, 0x49, 0x0a, 0x83, + 0x9e, 0xba, 0xab, 0x4a, 0x83, 0xb4, 0x24, 0xa9, 0x9b, 0x7c, 0x86, 0x38, + 0xd4, 0x08, 0xd5, 0x7a, 0xcd, 0xa8, 0x7e, 0x7b, 0x20, 0xf3, 0x86, 0x0d, + 0xbd, 0xb2, 0xd3, 0x0d, 0xdb, 0xf1, 0xdb, 0x72, 0xed, 0x6d, 0xa4, 0xbc, + 0x3e, 0x5f, 0x55, 0x27, 0x0e, 0xd4, 0xe9, 0xd8, 0xbe, 0xba, 0xd7, 0xd4, + 0xf1, 0x3e, 0xe7, 0x34, 0x92, 0x1b, 0x2e, 0xf8, 0x65, 0xfe, 0xeb, 0x90, + 0xa4, 0x67, 0xbe, 0xf4, 0x94, 0x0d, 0x24, 0x8b, 0xa5, 0x6a, 0xd1, 0x3e, + 0x1a, 0xf5, 0xa4, 0xd0, 0x8e, 0xe7, 0x02, 0xb5, 0x7c, 0x51, 0xdc, 0x53, + 0xfd, 0xf6, 0x92, 0x5a, 0xaf, 0xf5, 0x14, 0x94, 0xbd, 0xcf, 0x3a, 0xc9, + 0xef, 0x0f, 0xc6, 0x48, 0xcf, 0xbc, 0x78, 0x6a, 0xd8, 0xe7, 0x5b, 0x02, + 0xc5, 0x57, 0x72, 0x3e, 0x67, 0xd9, 0x9f, 0x1d, 0x74, 0xe4, 0xee, 0x07, + 0x75, 0xee, 0xd5, 0x53, 0x6b, 0xea, 0xf3, 0xb9, 0x15, 0xcf, 0x05, 0xd9, + 0x24, 0xfd, 0x2b, 0x1a, 0xa9, 0x9f, 0x94, 0xf5, 0xbb, 0xc9, 0x71, 0x9e, + 0x8b, 0x53, 0x09, 0x92, 0x40, 0x2d, 0x77, 0x0c, 0x98, 0x0c, 0xf7, 0xbb, + 0x52, 0xb1, 0x2a, 0x29, 0x4c, 0x82, 0xb2, 0x32, 0x41, 0x38, 0xfe, 0x34, + 0x13, 0xd9, 0xff, 0xb1, 0x30, 0x48, 0x7e, 0x8f, 0x88, 0x27, 0x4f, 0x13, + 0x25, 0xf5, 0x36, 0x48, 0xcb, 0xa4, 0xbf, 0x33, 0xc8, 0x3d, 0x2a, 0xf9, + 0xed, 0xc1, 0x9b, 0xc6, 0xa4, 0xbf, 0x72, 0x6c, 0x71, 0x18, 0xcf, 0x66, + 0xd9, 0xe4, 0xd0, 0xa0, 0xe3, 0x4b, 0xd2, 0xf1, 0x13, 0x6b, 0x9f, 0xa7, + 0x01, 0x56, 0x8b, 0x4b, 0x69, 0x9d, 0x1f, 0x92, 0x35, 0xda, 0x86, 0x0d, + 0xb4, 0x72, 0xe3, 0xb4, 0x93, 0xf2, 0x9a, 0xa4, 0x33, 0x67, 0x6c, 0x80, + 0xd4, 0x8f, 0x77, 0xa5, 0x7f, 0x25, 0x49, 0x7f, 0x47, 0xfa, 0xe9, 0xcf, + 0x49, 0x9f, 0xab, 0xd8, 0xba, 0xc5, 0x25, 0x69, 0xf1, 0x8c, 0xa4, 0xa5, + 0x5a, 0x1a, 0x5c, 0xb5, 0xb8, 0x68, 0xa7, 0xa9, 0x69, 0x18, 0xf7, 0xe5, + 0x42, 0xb6, 0x5c, 0x98, 0x97, 0x53, 0x53, 0xa6, 0xe0, 0x8c, 0xd2, 0x80, + 0xaf, 0x13, 0x27, 0xec, 0xeb, 0xa9, 0xa9, 0x26, 0xd7, 0xc3, 0x5a, 0x4d, + 0x69, 0x5f, 0x6b, 0x92, 0xf4, 0x07, 0x92, 0xfe, 0x27, 0x49, 0x5f, 0x97, + 0xfe, 0xfd, 0x71, 0xa9, 0x7d, 0x7c, 0xb8, 0x3c, 0xdc, 0x54, 0x27, 0x4e, + 0x68, 0x24, 0x34, 0xec, 0x4c, 0xf2, 0xfc, 0xf8, 0x09, 0xe9, 0x84, 0x57, + 0x2e, 0xd9, 0x30, 0xad, 0xda, 0x62, 0x32, 0xfd, 0xa2, 0x0b, 0x2d, 0xb3, + 0x01, 0x5f, 0x27, 0x4e, 0x48, 0x8b, 0xb2, 0xe1, 0x62, 0xed, 0x76, 0xce, + 0x6b, 0x59, 0x1c, 0xb6, 0x21, 0xd9, 0xd0, 0xac, 0x61, 0xcf, 0xed, 0x34, + 0x67, 0xda, 0xd2, 0x62, 0xcd, 0x06, 0x8f, 0xcd, 0xa4, 0x6f, 0xd2, 0xb0, + 0x6f, 0xf7, 0x3c, 0xd7, 0x2c, 0x81, 0x54, 0xb3, 0xfc, 0xef, 0x79, 0xed, + 0xb8, 0xdf, 0x7c, 0x5c, 0x80, 0x54, 0x38, 0x17, 0xda, 0xbe, 0xf8, 0xeb, + 0x60, 0xdf, 0x8c, 0xfc, 0x56, 0x62, 0x4c, 0x9c, 0x86, 0x6a, 0x49, 0x52, + 0xe0, 0xff, 0xde, 0x39, 0x29, 0x50, 0x6b, 0x42, 0xff, 0x46, 0x5e, 0xff, + 0x56, 0x72, 0xbf, 0xf3, 0xba, 0x50, 0xbf, 0xd5, 0x48, 0x9d, 0x55, 0x23, + 0x63, 0x3a, 0x92, 0x02, 0xb5, 0x24, 0x95, 0xe7, 0xaa, 0x8a, 0x62, 0x7b, + 0x2c, 0x1e, 0xf4, 0x6d, 0x10, 0x5e, 0xa0, 0x40, 0x9d, 0x6e, 0x5b, 0xd5, + 0xf9, 0x8a, 0x4c, 0xdf, 0xe8, 0xc1, 0x77, 0xff, 0x9c, 0xdc, 0x8f, 0x61, + 0xd1, 0x6a, 0x37, 0x0d, 0xdc, 0xd2, 0xb7, 0xce, 0x4f, 0xef, 0x83, 0x91, + 0xa2, 0x40, 0x92, 0xe9, 0xa5, 0xbf, 0xa7, 0x95, 0xe4, 0x02, 0xb5, 0xec, + 0xbe, 0xe7, 0x90, 0xa4, 0x65, 0x77, 0x63, 0x1e, 0x05, 0x0a, 0x8c, 0x64, + 0x8a, 0x66, 0xcd, 0x0d, 0x4c, 0x0e, 0xb9, 0x10, 0xae, 0x62, 0x90, 0xd6, + 0xd5, 0x93, 0x65, 0x1c, 0x25, 0x75, 0x87, 0x25, 0x9d, 0x2d, 0x4a, 0xc7, + 0x7e, 0xb5, 0xa3, 0x72, 0x12, 0x58, 0xe5, 0x7b, 0x42, 0xd2, 0x31, 0x0d, + 0xc3, 0xac, 0x1a, 0x45, 0x49, 0x5e, 0x30, 0x57, 0xb5, 0x2f, 0x7d, 0xbc, + 0x28, 0x3d, 0xd6, 0x97, 0xe2, 0xbe, 0xd1, 0xb9, 0xe4, 0x95, 0x37, 0x25, + 0x2d, 0xf4, 0xa5, 0x56, 0x31, 0x50, 0x28, 0xe9, 0xd8, 0x37, 0x25, 0x15, + 0x8d, 0xa2, 0x7e, 0xa0, 0x8f, 0x16, 0xed, 0x1e, 0xe8, 0xbc, 0xa4, 0xf3, + 0x46, 0xaa, 0x26, 0xbf, 0x83, 0x76, 0x25, 0x7d, 0xac, 0x6f, 0xe7, 0xe7, + 0xb8, 0x38, 0xd3, 0x6c, 0xbf, 0x24, 0x69, 0x41, 0x52, 0x47, 0x46, 0xc1, + 0xf3, 0xb1, 0x1e, 0x3b, 0x67, 0xd4, 0xe8, 0xdb, 0x30, 0xac, 0x30, 0x59, + 0x36, 0x4f, 0x16, 0x4b, 0x3a, 0xdf, 0xef, 0xe9, 0x60, 0xfa, 0x68, 0xcb, + 0xcf, 0x7b, 0x81, 0x59, 0x0f, 0x2a, 0xd0, 0x31, 0xd9, 0x08, 0xb3, 0xe5, + 0x24, 0xb4, 0xeb, 0x23, 0xfd, 0x40, 0x0f, 0x17, 0xdd, 0xb2, 0x93, 0x8e, + 0x7d, 0xac, 0xa5, 0x72, 0xd1, 0xbe, 0xff, 0x6e, 0xb9, 0x45, 0xc9, 0xb2, + 0xf9, 0x68, 0x31, 0xe9, 0x73, 0xdf, 0x06, 0x6b, 0xb5, 0x93, 0xba, 0x69, + 0xbe, 0xff, 0x83, 0x37, 0x74, 0xf4, 0xe8, 0x51, 0xbd, 0xfe, 0xfa, 0xeb, + 0x69, 0xd0, 0x93, 0x0b, 0x77, 0x92, 0x94, 0x06, 0x3b, 0xdd, 0xfa, 0x43, + 0x37, 0xa7, 0xc1, 0x4f, 0x92, 0xb4, 0xef, 0xde, 0xb7, 0xeb, 0xf5, 0xd7, + 0x5f, 0xb7, 0xe1, 0x4f, 0xdf, 0xb1, 0x41, 0x55, 0x77, 0xbd, 0xf5, 0x2e, + 0xbd, 0xfe, 0xfa, 0xeb, 0x69, 0x9b, 0x37, 0x27, 0xc1, 0x50, 0x2e, 0xb8, + 0x2a, 0x1b, 0x72, 0x75, 0x73, 0xf5, 0x56, 0x5b, 0xaf, 0x61, 0xc8, 0x56, + 0x1a, 0x28, 0xe5, 0xb5, 0x79, 0xf1, 0xc5, 0x17, 0xd2, 0x3e, 0xb9, 0x80, + 0x29, 0xd7, 0x4f, 0xc7, 0x0f, 0xea, 0x72, 0x81, 0x5a, 0x5b, 0xd5, 0xa6, + 0x1f, 0x7c, 0xf5, 0xfa, 0xeb, 0xaf, 0xeb, 0xfb, 0x6f, 0xbc, 0xa1, 0xbb, + 0xde, 0x7a, 0x97, 0x4e, 0x3f, 0x77, 0x5a, 0x77, 0xbd, 0xf5, 0xae, 0x1d, + 0x5d, 0xa6, 0x93, 0x98, 0xd8, 0xa4, 0xc1, 0x57, 0x52, 0x28, 0xb7, 0x29, + 0x8b, 0xda, 0x2d, 0x05, 0xfb, 0xec, 0xb1, 0x51, 0xb4, 0x32, 0x1c, 0x3f, + 0x08, 0xab, 0xaa, 0xd7, 0x8d, 0xce, 0xbf, 0x70, 0x3e, 0xfd, 0x2e, 0x21, + 0x76, 0x5b, 0xdc, 0xcb, 0x2d, 0x1d, 0xba, 0xef, 0x90, 0xfd, 0x9a, 0x75, + 0x4e, 0x6a, 0x9e, 0x6b, 0xaa, 0x71, 0xa8, 0xe1, 0x85, 0x1a, 0xc6, 0x0a, + 0x57, 0xed, 0x36, 0xa9, 0x1c, 0x96, 0x55, 0x49, 0x3e, 0x04, 0x35, 0x97, + 0x9b, 0xe9, 0xb0, 0xf7, 0xeb, 0xbb, 0x16, 0xf6, 0xed, 0x97, 0xdb, 0xae, + 0x34, 0x5f, 0x3a, 0xab, 0xc6, 0x3d, 0x87, 0x35, 0xdc, 0x7c, 0x57, 0x55, + 0x36, 0xfe, 0xcd, 0x06, 0xca, 0xea, 0xf5, 0x7b, 0xaa, 0xee, 0xad, 0xcb, + 0x74, 0x23, 0x55, 0xef, 0xac, 0x2a, 0xea, 0x04, 0x32, 0xab, 0x46, 0x2f, + 0xb7, 0x5b, 0xda, 0x5f, 0xab, 0xeb, 0xf0, 0xdb, 0x17, 0xb4, 0xfc, 0xc2, + 0x39, 0x05, 0x45, 0x1b, 0x44, 0x57, 0xdd, 0x53, 0x57, 0xe7, 0x72, 0x4b, + 0x4a, 0x02, 0x7d, 0x4b, 0x41, 0xa0, 0xfa, 0x81, 0xfd, 0x0a, 0xfa, 0x3d, + 0x2d, 0x3c, 0x70, 0xc4, 0x86, 0x17, 0xba, 0x9e, 0x77, 0xbb, 0xaa, 0x54, + 0x2a, 0xaa, 0x1b, 0xa3, 0x4a, 0x72, 0x1e, 0x85, 0xff, 0x3b, 0x73, 0xa9, + 0x18, 0x24, 0xdb, 0xc5, 0x92, 0xfd, 0x2b, 0x06, 0xaa, 0x87, 0x75, 0xf5, + 0xde, 0x14, 0x6a, 0x61, 0xa1, 0x2a, 0xe3, 0xfd, 0x06, 0x1f, 0xc7, 0x91, + 0xaa, 0xa1, 0x14, 0xc7, 0x55, 0x55, 0xc3, 0x9e, 0x7a, 0x6f, 0xaa, 0x2a, + 0xee, 0x27, 0xa1, 0xb0, 0x63, 0x76, 0x25, 0xf5, 0x30, 0x50, 0xd4, 0x97, + 0x1a, 0x0b, 0x47, 0x64, 0x56, 0x87, 0xaf, 0x3b, 0x7a, 0x23, 0x56, 0xf9, + 0xe6, 0x70, 0xe4, 0xc6, 0x42, 0x79, 0x9e, 0xfe, 0xe3, 0x93, 0xe9, 0xb0, + 0x0b, 0x89, 0xf2, 0xf9, 0x61, 0x5a, 0x2e, 0xa8, 0xea, 0x8e, 0x7d, 0xe1, + 0x48, 0x9d, 0x3f, 0x4e, 0xf6, 0xb9, 0x1b, 0xce, 0x06, 0x4e, 0xcd, 0xca, + 0x4d, 0xd7, 0x3c, 0xff, 0xe7, 0xb9, 0x81, 0x5a, 0xff, 0xcd, 0x9d, 0xb7, + 0x4b, 0x52, 0x1a, 0xa8, 0xf5, 0x23, 0x0f, 0x1c, 0x19, 0x09, 0xaf, 0xca, + 0xf2, 0xeb, 0x6e, 0xfd, 0xe1, 0x3b, 0xd2, 0xe9, 0x25, 0xe9, 0xdc, 0xff, + 0xf5, 0x67, 0xb9, 0x61, 0x57, 0xae, 0x0f, 0xee, 0x75, 0xbb, 0x7e, 0xed, + 0xa9, 0xec, 0xcd, 0x0d, 0x1d, 0xcb, 0x06, 0x7e, 0xe5, 0x19, 0x17, 0x40, + 0x36, 0x12, 0xae, 0xb5, 0x24, 0xe9, 0xb8, 0xec, 0x41, 0xe3, 0x92, 0x6c, + 0xca, 0xe9, 0x09, 0xd9, 0x83, 0xb2, 0x25, 0x29, 0x3d, 0x0c, 0x75, 0xe3, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xae, + 0x0a, 0x97, 0x21, 0x01, 0x00, 0x70, 0x2d, 0x70, 0x27, 0xde, 0x16, 0xa5, + 0x34, 0x4c, 0x6a, 0xce, 0xde, 0x6d, 0x39, 0x9c, 0x0b, 0x15, 0x86, 0x55, + 0x95, 0xc3, 0x6c, 0x18, 0x56, 0x49, 0xf1, 0x6a, 0xa4, 0xc8, 0xbf, 0xe0, + 0xba, 0x6f, 0x2f, 0x38, 0x29, 0xb9, 0x20, 0xa2, 0xd5, 0x48, 0x61, 0x72, + 0x71, 0xce, 0x9a, 0x70, 0x2d, 0xd9, 0x40, 0x2a, 0xa3, 0x24, 0x9c, 0xca, + 0x9d, 0x44, 0x9e, 0xf6, 0xc5, 0xd8, 0xbb, 0xd0, 0x57, 0xca, 0xea, 0xb4, + 0x5b, 0xea, 0x49, 0x63, 0xef, 0x77, 0x19, 0x04, 0x81, 0xb4, 0x62, 0x4f, + 0x66, 0x6f, 0xec, 0xdb, 0x6f, 0x83, 0xb6, 0x6e, 0x09, 0x95, 0x9e, 0x05, + 0xd8, 0xb3, 0xf3, 0xec, 0xac, 0x74, 0x15, 0xad, 0x46, 0x6b, 0x4e, 0xf2, + 0xb3, 0x17, 0xa1, 0x48, 0x91, 0x17, 0xac, 0x65, 0x97, 0x84, 0x15, 0x5d, + 0xb1, 0xa7, 0x42, 0xd7, 0x6b, 0xc9, 0xdd, 0x48, 0xff, 0xda, 0xa4, 0x27, + 0x6d, 0x2a, 0xb9, 0xe3, 0xb1, 0x8a, 0x81, 0x16, 0xde, 0x7e, 0x48, 0x67, + 0xbf, 0x76, 0x4a, 0xd5, 0xbd, 0x8d, 0xe4, 0x75, 0x64, 0xee, 0xee, 0xac, + 0xe1, 0x09, 0xf7, 0x92, 0x54, 0xd9, 0x53, 0x55, 0xb5, 0x52, 0x57, 0xb9, + 0x3c, 0x3c, 0x51, 0x2e, 0xba, 0xd2, 0x55, 0x67, 0xa5, 0xa3, 0xf6, 0xa5, + 0xa6, 0x64, 0x62, 0xa9, 0x52, 0xb6, 0xe1, 0x4a, 0xf1, 0x30, 0xb0, 0x28, + 0x0c, 0xc3, 0xdc, 0xa0, 0xa2, 0x59, 0xf4, 0x92, 0xf7, 0xa1, 0xd4, 0x97, + 0x3a, 0xd9, 0x93, 0x1d, 0x8b, 0xc9, 0x72, 0xba, 0x9c, 0xb4, 0x1d, 0xac, + 0x0d, 0x84, 0xe8, 0x5c, 0x8e, 0x55, 0xdf, 0x63, 0x43, 0xa1, 0xaa, 0xee, + 0x42, 0xb0, 0xfe, 0xf0, 0x35, 0xf9, 0xa1, 0x58, 0xbe, 0x30, 0xb4, 0x77, + 0x3e, 0x4e, 0xc3, 0x2b, 0x8a, 0x25, 0xd5, 0x2b, 0x55, 0x75, 0xba, 0xd1, + 0xd8, 0xe9, 0x7a, 0x45, 0xa5, 0xf3, 0x58, 0xd3, 0x57, 0x79, 0xe1, 0x56, + 0x4a, 0xbb, 0x2b, 0x19, 0xa9, 0x3c, 0x1f, 0x28, 0x9c, 0x2b, 0x69, 0xf9, + 0x62, 0x4b, 0xf5, 0x4a, 0x45, 0x51, 0x6c, 0x54, 0x0e, 0x03, 0x65, 0x33, + 0xba, 0xaa, 0x61, 0xa8, 0x4e, 0xd7, 0x5b, 0x8e, 0xc5, 0x64, 0xfa, 0x30, + 0xe7, 0xec, 0xd1, 0xd5, 0xe1, 0x4c, 0x3a, 0xd9, 0x90, 0x01, 0x4f, 0x34, + 0xe6, 0x04, 0xd2, 0x74, 0x99, 0x3a, 0x2e, 0x9d, 0x4c, 0x52, 0xab, 0xdb, + 0x1d, 0xe9, 0xa7, 0x32, 0xa1, 0x61, 0x69, 0x1f, 0xdd, 0x5d, 0xa3, 0x67, + 0x3c, 0x82, 0x36, 0xc9, 0x9d, 0x64, 0xdd, 0xe3, 0x2c, 0xe3, 0x5e, 0xcd, + 0x38, 0x66, 0xd5, 0xc8, 0xac, 0x1a, 0x85, 0xf3, 0x6b, 0x63, 0xe2, 0xc2, + 0xf9, 0x70, 0xe4, 0x8e, 0xe0, 0xa5, 0xa0, 0x34, 0x12, 0xa8, 0x35, 0x12, + 0x5c, 0x95, 0xd1, 0x33, 0xbd, 0x8d, 0x5d, 0x1c, 0x32, 0xeb, 0x27, 0x0d, + 0x77, 0x51, 0xc5, 0x98, 0x10, 0xae, 0x71, 0xfd, 0xca, 0xe3, 0x2e, 0x6a, + 0x5b, 0xd3, 0x76, 0xa6, 0xdd, 0xdc, 0x20, 0xad, 0xab, 0xe0, 0xb6, 0x07, + 0xd9, 0xed, 0x42, 0xde, 0x76, 0xc2, 0x2f, 0x5b, 0xef, 0xf8, 0xdb, 0x31, + 0x8f, 0x9d, 0x1e, 0xff, 0x6a, 0x97, 0x4f, 0x67, 0x65, 0x18, 0x6e, 0x63, + 0xbc, 0xfd, 0x9d, 0x5f, 0x9e, 0x2d, 0xf3, 0x1f, 0x1b, 0x6b, 0xc6, 0x1a, + 0xf5, 0x0f, 0x25, 0xfd, 0xb2, 0xc6, 0x87, 0x69, 0x65, 0xcb, 0xc6, 0x95, + 0x6f, 0x64, 0xfa, 0x67, 0xd7, 0xde, 0xf4, 0x19, 0x33, 0x7a, 0x55, 0xd2, + 0xbb, 0x65, 0x03, 0xb6, 0xf6, 0xde, 0x79, 0xe7, 0xcc, 0xd3, 0x7d, 0xfe, + 0xa5, 0xae, 0x82, 0x7f, 0xf4, 0x84, 0x1e, 0xdb, 0x67, 0x14, 0xfc, 0xfe, + 0xa7, 0x25, 0x49, 0x47, 0x25, 0x3d, 0x76, 0xe1, 0xea, 0xfa, 0x13, 0x5d, + 0x38, 0x2b, 0x05, 0x55, 0x19, 0xef, 0x8e, 0xee, 0x69, 0xd0, 0x4f, 0x77, + 0xf4, 0x7f, 0x3a, 0xfd, 0x2f, 0x9e, 0xaf, 0x48, 0x79, 0x21, 0x9f, 0x2b, + 0x37, 0xee, 0xf8, 0xe6, 0x52, 0x73, 0xed, 0xf8, 0x79, 0xfa, 0xb2, 0xcb, + 0xaf, 0x52, 0x19, 0x6d, 0xc3, 0x69, 0x4f, 0x9b, 0xde, 0x68, 0xe4, 0x40, + 0xd7, 0x05, 0x6b, 0x49, 0x52, 0x27, 0x73, 0x61, 0xf5, 0xcf, 0x1e, 0xd5, + 0x07, 0xee, 0x39, 0xa8, 0xcf, 0x4b, 0x1b, 0x0a, 0xd4, 0xb2, 0x3e, 0x2d, + 0xd3, 0x97, 0xce, 0xbd, 0xf8, 0x3e, 0x49, 0xd2, 0xa1, 0x7b, 0x87, 0x35, + 0xe7, 0x5e, 0xb4, 0x8f, 0x8d, 0xb0, 0xad, 0x66, 0x5c, 0x5b, 0x3b, 0xe9, + 0x57, 0x3f, 0x23, 0x7d, 0xed, 0xb4, 0x3e, 0xf6, 0xc0, 0x61, 0x29, 0x6f, + 0xdf, 0xec, 0xed, 0xeb, 0x55, 0xa9, 0x8e, 0xd6, 0xe5, 0x2c, 0xff, 0x4f, + 0x9c, 0x3f, 0x69, 0x83, 0xac, 0xfe, 0xd6, 0x7b, 0xd7, 0xf9, 0x1a, 0xae, + 0x52, 0x12, 0xa8, 0xf5, 0x89, 0x59, 0x2e, 0x9c, 0x75, 0x01, 0x61, 0xce, + 0xd3, 0x9f, 0xdf, 0x82, 0x0e, 0x01, 0xb8, 0x5e, 0x35, 0x9b, 0x46, 0xf1, + 0x4a, 0x4f, 0x35, 0x2f, 0xf2, 0x38, 0x5e, 0xe9, 0x2a, 0x9c, 0x4f, 0x2e, + 0xde, 0x74, 0x1f, 0x8d, 0x62, 0xc9, 0xcc, 0x65, 0x3e, 0x03, 0x24, 0x75, + 0xe1, 0x9c, 0xfd, 0x6e, 0x45, 0x92, 0xd4, 0x91, 0x9a, 0x3d, 0xdb, 0x66, + 0xaf, 0x5d, 0x56, 0x29, 0x72, 0xdf, 0x65, 0x44, 0xaa, 0x26, 0x81, 0xaf, + 0x2a, 0x07, 0x52, 0xe4, 0x6d, 0xbf, 0xaa, 0x46, 0xa6, 0x13, 0x48, 0x73, + 0xc3, 0x0f, 0x99, 0x9d, 0x8e, 0xb7, 0x7f, 0x30, 0x3d, 0xc9, 0x48, 0x9d, + 0x4e, 0x2c, 0xbd, 0x14, 0x4a, 0x2a, 0xa9, 0xb3, 0xdc, 0xd1, 0xd1, 0x9f, + 0xaa, 0xaa, 0x79, 0xa6, 0xac, 0xe5, 0x4b, 0x52, 0xb9, 0x91, 0x84, 0x82, + 0x24, 0xbb, 0x3e, 0x13, 0x1a, 0x35, 0xde, 0xb5, 0xdf, 0x86, 0x70, 0xac, + 0x36, 0x65, 0x42, 0xa9, 0xf9, 0x52, 0x4f, 0x8a, 0x4b, 0x3a, 0xb5, 0x9c, + 0x84, 0x75, 0x55, 0xab, 0xf6, 0x7b, 0x9e, 0x8a, 0xd4, 0x59, 0xee, 0xa8, + 0xba, 0x60, 0xb7, 0xfb, 0x23, 0xed, 0x49, 0xd2, 0xc5, 0xd1, 0x36, 0x97, + 0x5f, 0x6a, 0xa6, 0xaf, 0xff, 0xa9, 0xa7, 0x23, 0x95, 0xcb, 0x65, 0x2d, + 0xbf, 0xd4, 0xb4, 0xc1, 0x5f, 0x89, 0x4e, 0xa7, 0xa3, 0xa7, 0x9e, 0x96, + 0xaa, 0x8d, 0x30, 0x6d, 0xa6, 0xf1, 0x40, 0x5d, 0x23, 0xc9, 0x81, 0xa1, + 0x0d, 0xb5, 0x5e, 0xbe, 0x60, 0x54, 0x9e, 0x0b, 0xb5, 0xf0, 0x2e, 0xe9, + 0xf4, 0xd3, 0x76, 0x61, 0x2f, 0xbf, 0x98, 0x5c, 0xac, 0x1f, 0x7b, 0xcb, + 0x24, 0x09, 0xc5, 0x75, 0xcb, 0x31, 0x6d, 0x29, 0x9c, 0x2d, 0xc0, 0xe3, + 0x5d, 0xbf, 0xfe, 0x37, 0xd6, 0x94, 0xfd, 0x3f, 0x97, 0x07, 0xfa, 0x6f, + 0xf7, 0x14, 0x72, 0xc6, 0xb6, 0xd6, 0x4e, 0x61, 0xfd, 0xad, 0xf7, 0xdc, + 0x24, 0xbd, 0x67, 0x63, 0xf3, 0x9c, 0xd5, 0x46, 0xfb, 0xf6, 0xe6, 0x52, + 0x61, 0xa6, 0xf9, 0x5e, 0x4d, 0xdf, 0xa6, 0xb9, 0xf0, 0xec, 0x7f, 0x1e, + 0xdb, 0xbf, 0xcd, 0xe8, 0xdb, 0xa9, 0x8f, 0x4d, 0x9e, 0xfe, 0xd1, 0x87, + 0x1e, 0x4e, 0x2f, 0xaa, 0xf6, 0xf3, 0x21, 0xcf, 0x3e, 0x77, 0x4a, 0x0f, + 0x1e, 0x79, 0x50, 0xf2, 0xca, 0xfc, 0x71, 0x0e, 0x67, 0xda, 0xe9, 0x74, + 0x5b, 0xaa, 0x56, 0xea, 0x23, 0xc1, 0x5a, 0xcd, 0xae, 0xd4, 0xa8, 0x28, + 0xd3, 0xfe, 0xc3, 0xfa, 0xe0, 0x43, 0x92, 0xd4, 0x92, 0x54, 0x57, 0x28, + 0xe9, 0xd1, 0x87, 0xb2, 0xe3, 0x68, 0x24, 0x9c, 0x2b, 0x96, 0x14, 0x35, + 0x97, 0xb5, 0xbf, 0xf1, 0xa0, 0xaa, 0x0f, 0x49, 0x0f, 0x6a, 0x74, 0xfc, + 0x66, 0xb7, 0x65, 0x03, 0xbc, 0xbc, 0xfe, 0xec, 0xcf, 0xf9, 0xb0, 0xe9, + 0xbf, 0x3e, 0xe9, 0x61, 0xe9, 0x21, 0x1b, 0xc2, 0x75, 0xf6, 0xb9, 0x53, + 0x92, 0x37, 0xbf, 0x6a, 0xa5, 0xae, 0x66, 0xb7, 0xa5, 0xc3, 0x47, 0x1e, + 0xd4, 0xe1, 0x35, 0xd3, 0x49, 0x7a, 0xcd, 0x06, 0x91, 0xf9, 0x81, 0x56, + 0xf1, 0x37, 0x33, 0x21, 0x5a, 0x92, 0xf4, 0xa3, 0x52, 0xf8, 0x0f, 0x25, + 0xfd, 0x68, 0x9c, 0xce, 0x3f, 0x5c, 0x0d, 0xed, 0x07, 0xdd, 0x7f, 0x3d, + 0x0c, 0xd9, 0xca, 0x86, 0x68, 0xe5, 0x05, 0x75, 0x85, 0x39, 0xf3, 0x4b, + 0x5f, 0xd7, 0xb8, 0x10, 0xae, 0x59, 0xbc, 0x61, 0x03, 0xb4, 0xcc, 0x9b, + 0x66, 0xfb, 0x2e, 0xe8, 0x93, 0xbf, 0xf7, 0xd8, 0x48, 0xd8, 0xd6, 0x46, + 0x98, 0x37, 0xec, 0xa3, 0x0b, 0x90, 0xf2, 0xc3, 0xb0, 0x7c, 0x8f, 0xfe, + 0xec, 0x87, 0xf5, 0xe4, 0x1f, 0x7e, 0x6a, 0xc3, 0xf3, 0xa9, 0xcf, 0x57, + 0xa7, 0x8f, 0xe4, 0xf1, 0x03, 0xb7, 0xdc, 0x77, 0x78, 0xe9, 0x57, 0xa6, + 0xab, 0x25, 0xb9, 0x2d, 0xa9, 0xf1, 0xb7, 0xcd, 0x2b, 0x3d, 0x1b, 0x80, + 0x90, 0xf9, 0x6a, 0x30, 0x8a, 0x93, 0x71, 0x8b, 0x81, 0xca, 0x73, 0x51, + 0x1a, 0xa4, 0xe5, 0xc4, 0x57, 0x8c, 0x7a, 0xfd, 0x20, 0x9d, 0xec, 0x03, + 0xef, 0x7a, 0x50, 0xa7, 0xce, 0x9d, 0xb6, 0xd3, 0xae, 0xda, 0xb9, 0xb8, + 0xe1, 0x72, 0x20, 0x99, 0x55, 0xe9, 0x99, 0x73, 0xa7, 0xec, 0x47, 0xa7, + 0x59, 0x14, 0xdd, 0xf7, 0xf8, 0x75, 0x19, 0xb5, 0x64, 0x56, 0xdd, 0xef, + 0x10, 0x99, 0xcf, 0x5b, 0xc9, 0x73, 0xa3, 0xaa, 0x82, 0x62, 0xa6, 0xde, + 0x1b, 0x36, 0xfd, 0x48, 0xb5, 0xca, 0x41, 0x75, 0x57, 0x5a, 0x32, 0xfd, + 0x68, 0xd8, 0x9e, 0x8e, 0x24, 0xbf, 0x09, 0x34, 0x14, 0x9b, 0x48, 0x61, + 0x60, 0x97, 0x61, 0xdc, 0x8f, 0x14, 0x16, 0xd7, 0xfe, 0x9f, 0xd4, 0xf6, + 0x1c, 0x56, 0xbc, 0xd2, 0x52, 0x6c, 0x3a, 0xaa, 0xed, 0xa9, 0xcb, 0xac, + 0x4c, 0x8f, 0x1c, 0x31, 0xc9, 0xef, 0x2f, 0xee, 0xd1, 0x7e, 0x5d, 0x1c, + 0xa4, 0x75, 0x36, 0xd4, 0xc7, 0xbd, 0x27, 0x6b, 0xbf, 0xa3, 0xbd, 0xe6, + 0x6c, 0x72, 0x90, 0x96, 0x34, 0x1a, 0xe8, 0x74, 0xe6, 0xf8, 0xf0, 0xc9, + 0x99, 0x76, 0x7b, 0x4d, 0xd8, 0x93, 0xcf, 0x0f, 0xac, 0x72, 0xc3, 0xc7, + 0x4f, 0xb4, 0xb5, 0xb4, 0x64, 0x03, 0xb5, 0x96, 0x96, 0x4e, 0xa4, 0xe5, + 0xb5, 0x24, 0x90, 0xab, 0xdd, 0x96, 0x7e, 0xe8, 0xb1, 0x63, 0xd2, 0xe7, + 0x9e, 0x50, 0xed, 0xeb, 0x35, 0x7d, 0xae, 0x92, 0x04, 0x4c, 0x2d, 0xba, + 0x90, 0x2b, 0xe9, 0xc4, 0x89, 0x76, 0xfa, 0xbd, 0x40, 0xad, 0x66, 0xc3, + 0xa4, 0x5c, 0xbb, 0x6a, 0x4b, 0xc7, 0x8f, 0xd7, 0x74, 0x46, 0x6d, 0x2d, + 0x6a, 0x18, 0xbe, 0x75, 0x7c, 0x69, 0xd8, 0xaf, 0xe3, 0xed, 0xb6, 0x96, + 0x6a, 0x1a, 0xb6, 0x91, 0x44, 0x72, 0xb9, 0x36, 0x6a, 0x35, 0x1b, 0x4f, + 0x25, 0x2f, 0xa4, 0x2a, 0xf5, 0x07, 0xd2, 0x77, 0xbf, 0x2b, 0xb5, 0x7f, + 0xda, 0x5b, 0x26, 0xc9, 0x72, 0x68, 0xb7, 0x6d, 0x9b, 0x2e, 0xc3, 0x6a, + 0xb1, 0x36, 0x1a, 0xb0, 0xa5, 0xc5, 0xe1, 0xfc, 0x8e, 0x4b, 0xaa, 0x2d, + 0x26, 0x7d, 0x5e, 0x4a, 0xba, 0x72, 0xc6, 0xd6, 0xb7, 0x8f, 0xdb, 0xe9, + 0xdc, 0x9c, 0xdd, 0x32, 0x76, 0xa1, 0x59, 0x7e, 0xb0, 0x99, 0x1b, 0xac, + 0x2d, 0xad, 0xfd, 0xaa, 0x64, 0xb1, 0xe6, 0x8d, 0x77, 0x46, 0x5a, 0x98, + 0xf2, 0xdd, 0xbe, 0xff, 0x5b, 0xc3, 0x58, 0xde, 0xf7, 0xf4, 0x61, 0x18, + 0x2a, 0xf6, 0x82, 0xa2, 0xc3, 0xb0, 0xa2, 0xd8, 0x85, 0xd9, 0xad, 0x27, + 0x78, 0xcb, 0x6b, 0x33, 0x5e, 0x8d, 0x15, 0x14, 0x83, 0xf4, 0xfb, 0xe1, + 0xa0, 0x18, 0x28, 0x9c, 0xb3, 0xbf, 0xdd, 0xb9, 0xc0, 0x2b, 0xff, 0x37, + 0x95, 0x34, 0x00, 0x2f, 0x1b, 0xa8, 0xb5, 0x01, 0x33, 0xbf, 0xfe, 0xa4, + 0x7d, 0xd7, 0x2f, 0x27, 0xfb, 0x7c, 0xaa, 0xbe, 0x24, 0xc5, 0xf6, 0xe6, + 0x33, 0x45, 0x3b, 0x1c, 0x04, 0x55, 0x19, 0x13, 0xa9, 0x54, 0x0c, 0x64, + 0x4c, 0xa4, 0x60, 0xae, 0xaa, 0x9e, 0x89, 0xed, 0x8d, 0x6b, 0x92, 0xe5, + 0x54, 0xdf, 0x53, 0x93, 0x8a, 0x52, 0xf3, 0xdb, 0x49, 0x00, 0x67, 0xf2, + 0x39, 0xa9, 0x5a, 0xad, 0x2b, 0x8a, 0xa2, 0xf5, 0xfd, 0xee, 0x33, 0x9a, + 0x1a, 0x68, 0xb7, 0x74, 0x81, 0x24, 0xf5, 0x54, 0x52, 0x49, 0xe7, 0x24, + 0x1b, 0x66, 0xe6, 0x6e, 0x76, 0xe4, 0xfe, 0x87, 0x32, 0xc1, 0x53, 0xe7, + 0xc6, 0xfc, 0x6f, 0x55, 0x93, 0x69, 0x9a, 0xfd, 0x9e, 0x8e, 0xf4, 0xa5, + 0x93, 0x92, 0x9e, 0x78, 0x40, 0xfa, 0x68, 0x12, 0x4a, 0xff, 0x84, 0xa4, + 0x73, 0x92, 0x9e, 0x92, 0xf4, 0xd9, 0xa2, 0xa4, 0x7e, 0xa0, 0x8f, 0x06, + 0x46, 0x4f, 0x2c, 0x48, 0xc7, 0x9e, 0xb7, 0xdd, 0x7b, 0x42, 0xd2, 0xb1, + 0x64, 0x99, 0x1f, 0xeb, 0xdb, 0xb2, 0x85, 0xbe, 0xf4, 0x68, 0x51, 0x3a, + 0x56, 0x0c, 0x14, 0xba, 0x1b, 0x40, 0x69, 0x18, 0xcc, 0xf5, 0xe9, 0xfb, + 0xa4, 0x0f, 0x7d, 0xcb, 0xa8, 0xa2, 0x40, 0xcd, 0xa4, 0xaf, 0x4f, 0x14, + 0xa5, 0x63, 0xc9, 0x6f, 0x8d, 0x1f, 0x0b, 0xa4, 0x63, 0xb2, 0x37, 0xe7, + 0xf9, 0xa0, 0x91, 0x4e, 0xcf, 0xd9, 0x90, 0xac, 0x46, 0x51, 0xea, 0x48, + 0xfa, 0xb8, 0xa4, 0xcf, 0x78, 0xaf, 0xc3, 0x7e, 0xda, 0x0a, 0x74, 0xec, + 0x9c, 0x7d, 0xfc, 0xad, 0x20, 0xd0, 0x4f, 0x9b, 0x38, 0x09, 0x20, 0x93, + 0x9a, 0x7d, 0xa9, 0xa4, 0x92, 0x3a, 0xfd, 0x9e, 0x9e, 0xf8, 0x68, 0x55, + 0xc7, 0x7e, 0x75, 0xf4, 0xbb, 0x45, 0x17, 0x22, 0xf6, 0x84, 0xa4, 0x4f, + 0xf5, 0xa5, 0x8f, 0xb9, 0x9b, 0x45, 0x15, 0xa5, 0xa3, 0x7d, 0xbb, 0xc7, + 0x39, 0xa5, 0x40, 0x4f, 0x3c, 0x20, 0xfd, 0xc6, 0x0b, 0x36, 0x50, 0xeb, + 0x09, 0x49, 0xa7, 0x8a, 0xd2, 0xa9, 0xbe, 0x5d, 0x36, 0x51, 0xdf, 0x06, + 0x6b, 0x3d, 0x71, 0xc8, 0x2e, 0x1b, 0xb7, 0xfc, 0x7e, 0x34, 0x7f, 0xd1, + 0xa7, 0x6e, 0xfd, 0xa1, 0x9b, 0x75, 0xf1, 0xc5, 0x17, 0x74, 0x73, 0xf5, + 0x56, 0xdd, 0x5c, 0xbd, 0x55, 0x77, 0x55, 0x35, 0x12, 0x74, 0xe5, 0xc2, + 0x9b, 0xfc, 0xa0, 0xa8, 0x5b, 0xf5, 0xfd, 0xf1, 0x81, 0x51, 0xdf, 0x79, + 0x45, 0x77, 0xdd, 0x65, 0x43, 0xab, 0xa4, 0x61, 0x18, 0x95, 0x7b, 0x74, + 0xc1, 0x54, 0xdf, 0xff, 0xc1, 0x1b, 0xe9, 0x3c, 0xf6, 0xdd, 0xfb, 0x76, + 0x9d, 0x3e, 0x7d, 0xda, 0xb6, 0x2b, 0x1b, 0x66, 0x75, 0xd7, 0x5b, 0x47, + 0x83, 0xb1, 0x5c, 0x00, 0x97, 0x2b, 0xcb, 0x6b, 0x2f, 0xf5, 0x03, 0xdb, + 0x07, 0xf7, 0x3a, 0x36, 0xb3, 0x4d, 0x17, 0xa6, 0xe5, 0x96, 0x99, 0x24, + 0x29, 0xf9, 0x2d, 0xc7, 0xb5, 0xbf, 0x53, 0xcb, 0x74, 0x9a, 0x20, 0xf9, + 0x32, 0xbc, 0xf9, 0x62, 0x4b, 0xd5, 0xbd, 0xd5, 0xe1, 0x3d, 0x08, 0xe6, + 0x87, 0x81, 0x5a, 0x26, 0xee, 0xa8, 0xba, 0xb7, 0xaa, 0xd6, 0x4b, 0x2d, + 0xd5, 0xef, 0xa9, 0xcb, 0xc4, 0x81, 0xea, 0x77, 0xd6, 0x65, 0x4c, 0xa0, + 0x85, 0xfb, 0xf7, 0xab, 0xd4, 0x0f, 0x14, 0xf5, 0xed, 0xb1, 0xd3, 0xf2, + 0x8b, 0xcb, 0xaa, 0xef, 0xad, 0x26, 0x41, 0x5a, 0x4d, 0x45, 0xed, 0x48, + 0x91, 0x22, 0x55, 0xf7, 0x54, 0x15, 0xcc, 0x87, 0x0a, 0xba, 0x91, 0xaa, + 0x07, 0xea, 0x8a, 0xe2, 0x48, 0xb1, 0xa4, 0x6a, 0x58, 0xb2, 0xe1, 0x53, + 0xa6, 0xa7, 0x83, 0xf7, 0x1c, 0x96, 0x29, 0x1a, 0xf5, 0x56, 0x8c, 0x34, + 0x27, 0x95, 0x8b, 0xf6, 0xdc, 0x03, 0x17, 0xa4, 0x15, 0x77, 0x5b, 0xaa, + 0x84, 0x75, 0x99, 0x38, 0xb9, 0x81, 0x40, 0x57, 0xaa, 0xec, 0xab, 0x2b, + 0xea, 0xc7, 0xea, 0xf5, 0x7b, 0x32, 0xab, 0x46, 0x9d, 0x0b, 0x2d, 0xed, + 0xbf, 0xe7, 0xa0, 0x24, 0xc9, 0xf4, 0x93, 0x80, 0xab, 0xd5, 0x8e, 0x3d, + 0x67, 0x60, 0x2e, 0x56, 0xbd, 0xd6, 0xb0, 0x41, 0x5a, 0x92, 0x5a, 0xed, + 0xa6, 0x2a, 0x95, 0xba, 0xe2, 0xb8, 0xa3, 0xea, 0xde, 0xba, 0x82, 0xbe, + 0x3d, 0x19, 0xc3, 0xa8, 0xa7, 0xd6, 0xab, 0x4d, 0xb5, 0x2e, 0x19, 0x95, + 0xbd, 0xf3, 0x04, 0xba, 0xdd, 0xae, 0xd4, 0x4f, 0x3a, 0x13, 0x94, 0xf4, + 0xc1, 0xf7, 0x1c, 0xd5, 0xd9, 0x73, 0x76, 0x4d, 0xef, 0xf5, 0x8d, 0x14, + 0x94, 0xa5, 0x62, 0xa0, 0x56, 0xdc, 0x54, 0x4d, 0x0d, 0x85, 0x61, 0x4f, + 0x52, 0xa8, 0x6e, 0xeb, 0xbc, 0x9a, 0xed, 0x92, 0xdc, 0xbd, 0xec, 0x82, + 0x62, 0x72, 0x5c, 0x1d, 0x48, 0xbd, 0x37, 0xd9, 0xe5, 0xfc, 0xf0, 0x91, + 0x43, 0x3a, 0x75, 0xce, 0x86, 0x44, 0x4b, 0xf6, 0xdc, 0x9f, 0x72, 0x51, + 0x5a, 0x36, 0x91, 0x16, 0x8a, 0xa1, 0x4c, 0x50, 0x92, 0x79, 0x23, 0x56, + 0xdc, 0x5e, 0x56, 0xab, 0x93, 0xb9, 0x71, 0xdd, 0x0c, 0xfb, 0xa1, 0xef, + 0xbe, 0xfa, 0x9a, 0x7e, 0xe4, 0x81, 0x23, 0x69, 0x70, 0xd4, 0xf7, 0xff, + 0xe3, 0xf7, 0xd2, 0x61, 0x3f, 0x50, 0xca, 0xe7, 0x82, 0xb8, 0xfc, 0xfa, + 0xef, 0xbe, 0xfa, 0x5a, 0x1a, 0x50, 0xe5, 0x0f, 0xe7, 0x4d, 0x3b, 0xa9, + 0x7e, 0xd2, 0x3c, 0xdd, 0x74, 0x7e, 0xff, 0x24, 0x1b, 0x46, 0x95, 0xad, + 0xcb, 0x4e, 0xbb, 0xa7, 0xb2, 0x37, 0x0d, 0x05, 0xf3, 0xc7, 0xfd, 0xee, + 0xab, 0xaf, 0xe9, 0x1d, 0x6f, 0x1b, 0xdf, 0x7e, 0xb6, 0xbd, 0xec, 0x78, + 0x79, 0xd3, 0xb8, 0xf9, 0xe4, 0x2d, 0xb3, 0xec, 0x6b, 0xcd, 0xeb, 0x7f, + 0x3a, 0xcf, 0x13, 0xc9, 0x5f, 0x5b, 0x36, 0x34, 0xeb, 0x84, 0xa4, 0x33, + 0x35, 0x5b, 0x70, 0x5c, 0xd2, 0x52, 0xcd, 0x0b, 0xda, 0x92, 0xf4, 0xd5, + 0x35, 0xb3, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xac, 0x03, 0xa1, 0x5a, 0x00, 0x00, 0x5c, 0x03, 0x8c, 0x8c, 0xd4, + 0x0f, 0xd4, 0x5b, 0x8d, 0x65, 0x32, 0x27, 0x18, 0x07, 0x73, 0xe5, 0xdc, + 0x90, 0x21, 0xd3, 0x4f, 0xea, 0xa4, 0x91, 0x60, 0x2d, 0x13, 0xc7, 0x2a, + 0x85, 0x95, 0xf4, 0x04, 0xe7, 0x58, 0x49, 0xb0, 0x56, 0xd2, 0xae, 0xbb, + 0x58, 0xd4, 0x9f, 0x4f, 0x30, 0x97, 0x73, 0xb1, 0x50, 0x52, 0x1f, 0xce, + 0x85, 0x6a, 0xc6, 0x91, 0x86, 0x97, 0xe8, 0x78, 0x77, 0x77, 0x96, 0xd6, + 0x06, 0x64, 0x05, 0x81, 0xca, 0x73, 0x61, 0x72, 0x46, 0xf5, 0x68, 0x5d, + 0x75, 0xbe, 0xa2, 0x68, 0x25, 0x52, 0x30, 0x17, 0xc8, 0xc4, 0xb1, 0x0d, + 0xab, 0xca, 0xbc, 0xa6, 0xce, 0x6b, 0x1d, 0x55, 0x6f, 0x09, 0xa5, 0xa0, + 0xa4, 0xa8, 0x63, 0xef, 0xb4, 0x1c, 0x9b, 0xd8, 0xce, 0xd7, 0xf4, 0x14, + 0xb8, 0x80, 0x80, 0x91, 0x20, 0x32, 0xa5, 0x27, 0xa7, 0x1f, 0x3e, 0x72, + 0x54, 0xf1, 0x4a, 0x64, 0xe7, 0xdc, 0x1f, 0xf6, 0xb6, 0xdb, 0x6d, 0xc9, + 0x64, 0x4e, 0x52, 0x2f, 0xcf, 0x95, 0x93, 0x40, 0x2d, 0x93, 0x5e, 0xd1, + 0x59, 0x9e, 0x0b, 0xd5, 0xb9, 0xdc, 0x51, 0x6d, 0x4f, 0x43, 0xed, 0xcb, + 0x4d, 0x99, 0xbe, 0x49, 0x5f, 0x63, 0x7a, 0x07, 0xec, 0xb9, 0x60, 0x18, + 0xf2, 0xb4, 0x41, 0xbd, 0x71, 0x27, 0x8e, 0xbb, 0xa0, 0xaa, 0x9c, 0x73, + 0x21, 0xe3, 0xd8, 0xa8, 0xbe, 0x27, 0x54, 0xeb, 0x72, 0xac, 0x6a, 0xf2, + 0x38, 0x32, 0x6d, 0x25, 0x50, 0x67, 0x4c, 0xa8, 0x96, 0x24, 0xc5, 0xab, + 0x92, 0xfa, 0x46, 0xe1, 0x7c, 0x39, 0x79, 0x0f, 0x86, 0x17, 0x0a, 0x05, + 0x45, 0xad, 0xf9, 0xdf, 0x93, 0xf2, 0xc3, 0xb4, 0xd2, 0xba, 0xbc, 0x20, + 0x8c, 0x34, 0xa8, 0x2a, 0x52, 0xbd, 0x52, 0x49, 0x03, 0xab, 0x6c, 0x55, + 0x52, 0x19, 0x78, 0xaf, 0x33, 0xf0, 0x26, 0xee, 0xdb, 0xba, 0x30, 0x2c, + 0xa9, 0xd5, 0xb6, 0x7d, 0x2b, 0x87, 0x81, 0x5a, 0xdd, 0xee, 0xe8, 0x4c, + 0x02, 0x8d, 0x04, 0x89, 0x8d, 0xbb, 0x83, 0xab, 0x8a, 0x46, 0x0a, 0x82, + 0xb5, 0xe1, 0x5d, 0xfd, 0xe1, 0x34, 0x91, 0x31, 0x23, 0xfd, 0x1c, 0x99, + 0x57, 0xb0, 0x36, 0x38, 0x2c, 0x9d, 0x7e, 0x83, 0x82, 0x20, 0x4c, 0x2f, + 0xe4, 0xf0, 0x87, 0x27, 0x8d, 0x2f, 0xcd, 0x16, 0xba, 0xe5, 0x18, 0x63, + 0xc6, 0xde, 0x9d, 0x36, 0x08, 0xec, 0x45, 0x26, 0xd9, 0x0b, 0x36, 0xa2, + 0x38, 0xca, 0x5c, 0x91, 0x69, 0xe5, 0x05, 0x11, 0x49, 0x99, 0x8b, 0xc4, + 0xc7, 0xf1, 0x96, 0xd3, 0xc4, 0x0b, 0x44, 0xfa, 0x6b, 0x87, 0x67, 0x6a, + 0x7f, 0x4c, 0xdb, 0xc6, 0x5f, 0x79, 0xfa, 0xa3, 0x8f, 0x71, 0x1c, 0x8f, + 0x5c, 0xbc, 0x33, 0x4d, 0x7a, 0x71, 0xcc, 0xdc, 0xe4, 0x8b, 0x4b, 0xe2, + 0x31, 0x41, 0x6f, 0xe3, 0xca, 0xd7, 0xdb, 0xce, 0x66, 0x4e, 0x73, 0x3d, + 0x8f, 0xbf, 0x55, 0x6d, 0x8f, 0x8c, 0x37, 0xe3, 0x27, 0xe4, 0xb7, 0x16, + 0x6c, 0x50, 0x93, 0xb4, 0xf5, 0x61, 0x5a, 0xae, 0xfc, 0xd4, 0xab, 0xba, + 0x26, 0xac, 0x27, 0x94, 0x6a, 0xa7, 0x5d, 0x7a, 0xf5, 0x55, 0x3d, 0xfb, + 0xf8, 0xe3, 0xe9, 0xf0, 0x46, 0x98, 0x7f, 0x7a, 0x4c, 0x8f, 0xcd, 0x3a, + 0xee, 0xac, 0xfb, 0x87, 0xfe, 0xf8, 0x5d, 0x97, 0x2a, 0xc3, 0x0b, 0xfb, + 0xd2, 0xad, 0x59, 0x37, 0xce, 0x0f, 0xa4, 0xba, 0x81, 0xc7, 0x9f, 0x18, + 0xa8, 0x35, 0x6e, 0xdd, 0x0e, 0xcb, 0x32, 0xdd, 0xbc, 0xfd, 0xc7, 0x94, + 0x0b, 0x04, 0x3f, 0xf6, 0x1b, 0x05, 0xfd, 0xf7, 0x0f, 0x0f, 0x26, 0x8f, + 0xa4, 0x91, 0x40, 0x2d, 0x7d, 0xe1, 0xa9, 0x0d, 0x06, 0x6a, 0x49, 0xf5, + 0x24, 0x24, 0xea, 0xd0, 0x7d, 0xf6, 0xf9, 0x83, 0x47, 0xbc, 0xca, 0x64, + 0x1b, 0x74, 0xee, 0x5b, 0x1b, 0x6a, 0x7a, 0x5d, 0xd2, 0x40, 0xad, 0xff, + 0xf9, 0x9f, 0x6c, 0xfd, 0xcc, 0x9c, 0xdf, 0x7c, 0x74, 0x38, 0xfc, 0x73, + 0x3f, 0xad, 0x7f, 0x22, 0xe9, 0x13, 0x7f, 0xf0, 0xe9, 0xd9, 0xa7, 0xaf, + 0xd7, 0xa4, 0x95, 0x8e, 0x34, 0x5f, 0x95, 0x64, 0x8f, 0x15, 0x3f, 0x76, + 0xf6, 0x29, 0x7d, 0xf4, 0xf0, 0x07, 0x67, 0x9a, 0xfc, 0xa9, 0xdf, 0x1e, + 0x1e, 0x23, 0xc4, 0xf2, 0xde, 0xbf, 0xaf, 0x9f, 0x55, 0xa8, 0xd1, 0x8b, + 0xec, 0x23, 0xef, 0x78, 0x62, 0x78, 0xc4, 0x5c, 0xd6, 0xe9, 0xaf, 0xc4, + 0x92, 0x3e, 0x3b, 0x73, 0x97, 0x3f, 0xf9, 0xcf, 0x4e, 0x65, 0x4a, 0xba, + 0x13, 0x87, 0x3f, 0xfe, 0xe8, 0x73, 0x63, 0x5a, 0xf2, 0xc7, 0xb5, 0x9f, + 0xdd, 0x4e, 0xff, 0x83, 0x4c, 0x08, 0x41, 0xda, 0xe7, 0xec, 0xa3, 0x14, + 0x5e, 0x3a, 0xa5, 0x53, 0x97, 0xb2, 0x7d, 0xc9, 0xf7, 0x8c, 0xca, 0x7a, + 0xa6, 0xbb, 0x3c, 0x53, 0x7f, 0x25, 0xe9, 0xc9, 0x6f, 0x95, 0xa5, 0x6f, + 0x99, 0x9c, 0x71, 0x32, 0x57, 0xdc, 0xaa, 0xac, 0x8a, 0xca, 0x69, 0x69, + 0xcb, 0xab, 0x77, 0xc3, 0x91, 0xa4, 0x4a, 0x12, 0x71, 0x19, 0x5e, 0x3a, + 0xa5, 0x66, 0xe6, 0x5a, 0xa9, 0x38, 0x79, 0x37, 0x1e, 0x9c, 0xe9, 0x95, + 0x60, 0xb7, 0x58, 0x78, 0x57, 0x59, 0xcd, 0xa6, 0x19, 0x09, 0x16, 0x6c, + 0xdc, 0x69, 0x64, 0x4c, 0x57, 0xf5, 0xdb, 0xed, 0x36, 0xb7, 0xa5, 0x96, + 0xea, 0xb7, 0xd7, 0xd5, 0xda, 0xd3, 0x56, 0x50, 0xb1, 0xdf, 0x6e, 0x34, + 0xea, 0x36, 0xb4, 0xbb, 0xbe, 0x50, 0xd7, 0xf2, 0xf3, 0x2f, 0x27, 0x53, + 0x9a, 0xb4, 0xcd, 0x56, 0xd3, 0xa8, 0x67, 0x86, 0xfb, 0x90, 0xda, 0x82, + 0xd4, 0x33, 0x46, 0xb5, 0x7d, 0x81, 0xda, 0x17, 0x03, 0x95, 0xcb, 0x81, + 0xc2, 0x95, 0xba, 0x1a, 0x35, 0xa9, 0x69, 0x8c, 0x1a, 0x35, 0xfb, 0xfd, + 0xc8, 0xa1, 0xfb, 0x02, 0x3d, 0xf3, 0xf4, 0xb0, 0x2f, 0xa6, 0x6f, 0xb4, + 0x7c, 0x41, 0x3a, 0xfa, 0x50, 0xa8, 0xe6, 0x45, 0xc9, 0x7d, 0xf9, 0x70, + 0xfa, 0x0b, 0x1d, 0x1d, 0x7d, 0xc8, 0x7e, 0xf7, 0xe1, 0x02, 0xb3, 0xca, + 0xf5, 0x40, 0xd5, 0x7d, 0x75, 0x35, 0xf6, 0x49, 0xcd, 0x8b, 0x52, 0x63, + 0x9f, 0xed, 0x51, 0x67, 0xb9, 0x63, 0x03, 0xae, 0xbc, 0xe0, 0x94, 0xc6, + 0x7d, 0xf6, 0x22, 0xd8, 0xc6, 0x3e, 0xa9, 0xb3, 0x3c, 0x1c, 0xa7, 0x71, + 0x8f, 0x6d, 0xaf, 0x71, 0x4f, 0xf2, 0x3d, 0x8f, 0xa9, 0x4b, 0x41, 0x69, + 0xa4, 0xcd, 0xe6, 0x45, 0x3b, 0xfe, 0xb0, 0x93, 0x3d, 0x35, 0x5f, 0x5a, + 0xbb, 0x6c, 0x3b, 0xcd, 0x58, 0xd5, 0x46, 0xa8, 0x43, 0xfb, 0xa4, 0xe7, + 0x2e, 0x18, 0x2d, 0x1c, 0x08, 0x64, 0xfa, 0x76, 0x99, 0x9a, 0xd7, 0x24, + 0x55, 0xa5, 0x46, 0x4d, 0x52, 0xcd, 0xe8, 0xf4, 0xd3, 0x6b, 0xf7, 0xcf, + 0x0b, 0xef, 0x09, 0xd5, 0xbc, 0x38, 0xfa, 0xd9, 0x74, 0xe1, 0xed, 0xa1, + 0xa2, 0x7e, 0xac, 0x7a, 0x4d, 0x6a, 0xf5, 0x8c, 0xea, 0xf5, 0xba, 0x5a, + 0x7b, 0x3b, 0x52, 0x7b, 0xf2, 0x7e, 0xf5, 0xf4, 0xff, 0xf6, 0xff, 0xe5, + 0x96, 0x7f, 0x6f, 0xe2, 0x54, 0x6b, 0x5d, 0xf8, 0xdd, 0xff, 0x3c, 0xd3, + 0x78, 0x07, 0x7e, 0xf1, 0xa6, 0x99, 0xc7, 0x1d, 0x67, 0xbd, 0x7d, 0x93, + 0xc6, 0xbf, 0x4e, 0xdf, 0xd1, 0x5f, 0xff, 0x1b, 0x33, 0x8d, 0xb7, 0xd9, + 0x66, 0x99, 0xe7, 0x4c, 0xcb, 0x6d, 0xca, 0x67, 0x2e, 0xf7, 0x9f, 0xd4, + 0x51, 0x12, 0x8c, 0x95, 0x0c, 0x87, 0x95, 0xaa, 0x62, 0x49, 0x2f, 0x37, + 0x97, 0x55, 0x2e, 0x87, 0x69, 0x58, 0x96, 0xfb, 0xcf, 0xf1, 0xc3, 0xb3, + 0x24, 0x29, 0xaa, 0xd4, 0xed, 0xb4, 0x5d, 0xff, 0x38, 0xb4, 0xa5, 0x58, + 0xf5, 0x34, 0x37, 0xb5, 0x23, 0x6f, 0xfc, 0x28, 0xd6, 0xfe, 0x72, 0x4b, + 0xcd, 0x4c, 0x5b, 0x1d, 0xd5, 0x25, 0xb5, 0x14, 0x45, 0xf1, 0x48, 0x28, + 0x7f, 0x6e, 0x9f, 0xbb, 0x2d, 0x75, 0x64, 0xe7, 0xdb, 0xf4, 0xfb, 0x12, + 0xd5, 0x75, 0xb8, 0x91, 0x84, 0x73, 0x49, 0xaa, 0xaa, 0xa5, 0x4e, 0x57, + 0x39, 0x7d, 0xb7, 0xeb, 0x57, 0x58, 0xa9, 0x8e, 0xf6, 0xc1, 0x7b, 0x74, + 0x01, 0x5b, 0xae, 0xbe, 0x5a, 0xa9, 0x4b, 0x79, 0x01, 0x56, 0xf7, 0x0f, + 0x83, 0xb5, 0x24, 0xa9, 0xfd, 0x4d, 0x29, 0xfc, 0xd7, 0x2e, 0xec, 0xca, + 0xbe, 0x8e, 0x91, 0xf0, 0xab, 0xfb, 0x95, 0xb6, 0x93, 0x0d, 0xc4, 0x72, + 0xe3, 0x8d, 0x04, 0x6a, 0xe5, 0x2e, 0x89, 0xe1, 0xfc, 0x36, 0x2c, 0xb9, + 0xe1, 0x80, 0x7a, 0xf6, 0xbb, 0x72, 0xd3, 0xef, 0x29, 0xe8, 0x97, 0xa5, + 0xe2, 0xe6, 0x86, 0xa3, 0xfb, 0x5a, 0x2b, 0x1d, 0x55, 0xe7, 0xca, 0xea, + 0x24, 0xdf, 0x99, 0x57, 0xdc, 0x0d, 0x2a, 0xfa, 0xd1, 0x48, 0xc0, 0xd6, + 0x53, 0x5f, 0xf8, 0x64, 0x1a, 0x6a, 0xe5, 0x97, 0x87, 0xc1, 0xb0, 0x6f, + 0xe3, 0xca, 0x83, 0x91, 0x40, 0xa7, 0xf5, 0x07, 0xb8, 0x54, 0x43, 0x49, + 0xab, 0x25, 0x95, 0xe7, 0xa4, 0x4e, 0xb7, 0xa7, 0x91, 0x90, 0xc3, 0x3c, + 0xb1, 0x0d, 0xe5, 0x90, 0xa4, 0x38, 0x8a, 0xe4, 0x3e, 0x13, 0x99, 0x2b, + 0x1d, 0x45, 0xab, 0x81, 0xca, 0x32, 0x0a, 0x6e, 0x0e, 0x14, 0xad, 0x06, + 0x2a, 0x79, 0xfb, 0xcf, 0xf8, 0x8a, 0x51, 0x6f, 0xd5, 0xe8, 0xc9, 0x2f, + 0x9e, 0x52, 0x79, 0xce, 0x05, 0x6a, 0x4d, 0xd6, 0x9b, 0xf6, 0x79, 0x4b, + 0x92, 0xd4, 0xb1, 0xdf, 0xdd, 0xfb, 0xdf, 0xad, 0x1b, 0xc9, 0xc6, 0xbd, + 0x99, 0x24, 0x14, 0x3f, 0x7b, 0x1c, 0xe9, 0xda, 0xad, 0x69, 0x5a, 0x52, + 0x72, 0x30, 0x57, 0x4e, 0xbe, 0xab, 0x6f, 0xd9, 0xff, 0xa1, 0x7e, 0x23, + 0x69, 0x23, 0x59, 0x4e, 0x7d, 0x93, 0xf3, 0x3f, 0x14, 0xa7, 0x73, 0xf2, + 0xe7, 0x3a, 0x8e, 0xe9, 0x47, 0xc9, 0xfb, 0x18, 0x24, 0xfd, 0xb5, 0x8f, + 0x7e, 0xc0, 0xbf, 0xe9, 0xdb, 0x1b, 0x87, 0x64, 0x6f, 0xb4, 0x60, 0xcc, + 0xc6, 0x3e, 0x3b, 0x5e, 0x8b, 0xc2, 0x62, 0x7d, 0x62, 0xfd, 0xd2, 0xa2, + 0x7d, 0x74, 0xa1, 0x51, 0x67, 0xd4, 0xd6, 0x62, 0xad, 0x26, 0x9d, 0x19, + 0xc6, 0x4d, 0x2d, 0xd6, 0x94, 0x24, 0xfd, 0x59, 0xed, 0x33, 0x67, 0x54, + 0x5b, 0x5c, 0xd4, 0xe2, 0xe2, 0x92, 0xce, 0x9c, 0xb1, 0xc1, 0x59, 0xed, + 0xb6, 0x6d, 0xc3, 0x0f, 0x99, 0x72, 0xe1, 0x5a, 0xbe, 0x5a, 0x4d, 0xfa, + 0xc1, 0x6f, 0x3d, 0xa1, 0x1f, 0xff, 0x5f, 0x24, 0xfd, 0x1f, 0x6d, 0x1d, + 0xff, 0x8a, 0x2d, 0x3f, 0x73, 0x26, 0x09, 0x9a, 0x5a, 0x94, 0x74, 0x46, + 0x5a, 0x3a, 0x3e, 0x9c, 0xe6, 0x4c, 0xbb, 0x3d, 0x6c, 0xb7, 0x66, 0x9f, + 0x2f, 0xd6, 0x6c, 0x2c, 0x96, 0x9b, 0x77, 0xdb, 0xeb, 0xe2, 0x52, 0x4d, + 0x3a, 0x71, 0x7c, 0xb4, 0x8d, 0xc5, 0x45, 0x3b, 0x0f, 0x1b, 0x00, 0xd6, + 0x1e, 0x79, 0x74, 0xf5, 0xff, 0xea, 0xd7, 0xec, 0xf0, 0x89, 0x13, 0xd2, + 0x92, 0xa4, 0x9a, 0xb7, 0x6c, 0x6c, 0xf0, 0x57, 0x4d, 0x4b, 0x4b, 0x6d, + 0x6f, 0x59, 0xd4, 0xe4, 0xff, 0xaf, 0x2f, 0x2d, 0xb9, 0x58, 0xac, 0xb6, + 0x96, 0x34, 0x0c, 0xc4, 0xd2, 0x09, 0x49, 0x8b, 0x49, 0xee, 0x82, 0x64, + 0x1b, 0x3f, 0x63, 0x97, 0xfd, 0x89, 0xe3, 0xd2, 0xe2, 0x92, 0x0b, 0x14, + 0xb3, 0x6d, 0x9d, 0x38, 0xae, 0x91, 0xe5, 0x3d, 0xd4, 0x56, 0xbb, 0x3d, + 0x1c, 0xff, 0xc4, 0xf1, 0xe4, 0xfd, 0x5b, 0x94, 0x6a, 0x67, 0x24, 0x5d, + 0xce, 0x9b, 0x66, 0xa8, 0x52, 0xc9, 0x6d, 0xd4, 0xe3, 0xaf, 0xc7, 0xb2, + 0xbf, 0x4b, 0x85, 0x95, 0xf4, 0x69, 0x1c, 0x77, 0xd3, 0xe7, 0x71, 0xdc, + 0x1d, 0xfe, 0x56, 0x92, 0x17, 0xb0, 0x35, 0x26, 0x74, 0xcb, 0xac, 0xc6, + 0x0a, 0x92, 0x36, 0x82, 0x24, 0x78, 0xc8, 0xfd, 0x06, 0x35, 0x12, 0x9c, + 0x95, 0xe5, 0xb6, 0x47, 0x57, 0x11, 0xa8, 0x55, 0x99, 0xaf, 0x8c, 0x16, + 0xba, 0x9b, 0x7b, 0xac, 0xe1, 0x05, 0x8b, 0x79, 0x7d, 0x8a, 0x57, 0xe3, + 0xf4, 0x79, 0xbc, 0x1a, 0xcf, 0xf4, 0x5b, 0x91, 0x49, 0xc2, 0xb2, 0x4c, + 0x72, 0x13, 0x91, 0x40, 0x3d, 0x19, 0x13, 0xab, 0xd3, 0x6d, 0x8e, 0xcc, + 0xa7, 0xd7, 0x37, 0x2a, 0xcf, 0xd9, 0xc0, 0xad, 0x72, 0x10, 0xa8, 0xd5, + 0xed, 0xa8, 0xbe, 0xc7, 0xae, 0xbb, 0xd1, 0x6a, 0xac, 0x40, 0x81, 0xa2, + 0x4e, 0x47, 0xa5, 0xb9, 0x40, 0xe7, 0x2f, 0x9e, 0x5d, 0x13, 0x4c, 0x3a, + 0x55, 0x76, 0xc3, 0x99, 0x04, 0x6b, 0x49, 0xa5, 0xd1, 0x1b, 0x9e, 0x5c, + 0x85, 0x63, 0x49, 0xdb, 0x1f, 0x3d, 0x67, 0x8f, 0x8e, 0xea, 0x49, 0xd0, + 0xd4, 0xc1, 0x64, 0x39, 0x9f, 0xef, 0xdb, 0xc0, 0xad, 0x0f, 0x7d, 0xcd, + 0x8e, 0xdf, 0x28, 0x1a, 0x2d, 0xa7, 0xbf, 0x19, 0xdb, 0x3e, 0xb8, 0xd0, + 0xac, 0x66, 0xd1, 0x06, 0x6d, 0x3d, 0xdc, 0xb7, 0xe1, 0x92, 0x67, 0x25, + 0x2d, 0xb8, 0x79, 0x48, 0x3a, 0x75, 0xc6, 0xbe, 0x86, 0x66, 0x5f, 0x3a, + 0x28, 0xe9, 0xbc, 0xec, 0xbc, 0x24, 0x9b, 0x67, 0x7f, 0xcc, 0x2d, 0x5b, + 0x23, 0x1d, 0x0d, 0xa4, 0x43, 0xab, 0x3d, 0xdb, 0x6e, 0x50, 0xb2, 0xe1, + 0x5b, 0xee, 0xb7, 0xf4, 0xa2, 0x6c, 0x70, 0x56, 0x31, 0xd0, 0xa7, 0x8b, + 0x81, 0x3e, 0xd2, 0xb7, 0x41, 0x5a, 0x9f, 0x4c, 0xf6, 0xb3, 0xfe, 0xb8, + 0x76, 0x38, 0x39, 0x66, 0x48, 0x6e, 0xe6, 0xf3, 0x41, 0xd9, 0x60, 0xac, + 0x8f, 0xf5, 0x87, 0xcb, 0x60, 0x7f, 0x20, 0x1d, 0x4b, 0x7e, 0x78, 0x3d, + 0xd8, 0xb7, 0x65, 0xee, 0x7f, 0xfc, 0x37, 0x5e, 0x08, 0xe4, 0xbe, 0x1d, + 0x3b, 0x26, 0xdb, 0x77, 0xc9, 0x2e, 0x1b, 0xc9, 0x06, 0x6b, 0xf9, 0xcb, + 0x61, 0x56, 0x2e, 0x5c, 0x4a, 0xb2, 0x81, 0x4f, 0xbe, 0xef, 0xff, 0xe0, + 0x8d, 0x34, 0xbc, 0x49, 0x92, 0x6e, 0xbb, 0xed, 0x36, 0x9d, 0xf6, 0x02, + 0xa2, 0x9c, 0x34, 0xd8, 0x69, 0x90, 0x04, 0x48, 0x25, 0xc1, 0x51, 0xfa, + 0x81, 0x1d, 0x76, 0x65, 0xce, 0x5d, 0x77, 0xdd, 0x25, 0x49, 0x3a, 0x7a, + 0xef, 0x6d, 0xf6, 0xf1, 0xe8, 0x51, 0x5d, 0x7c, 0xf1, 0x85, 0xb4, 0x1d, + 0x17, 0x2e, 0xa5, 0x37, 0x5e, 0x91, 0x06, 0xd2, 0x5d, 0xd5, 0x61, 0xdf, + 0xfc, 0x76, 0x7d, 0xae, 0xcd, 0x57, 0x5e, 0x79, 0x45, 0xb7, 0xdd, 0x76, + 0x9b, 0x6e, 0xbb, 0xed, 0xb6, 0x4d, 0x6f, 0xd3, 0x05, 0x5f, 0xf9, 0xaf, + 0xf9, 0xd6, 0x1f, 0xba, 0x59, 0xaf, 0x7c, 0xc7, 0xb6, 0xe9, 0xa6, 0xdf, + 0x89, 0x65, 0x3a, 0x8b, 0xde, 0x4a, 0x72, 0xd6, 0x47, 0x60, 0x14, 0x04, + 0x52, 0xfd, 0x40, 0x12, 0xe8, 0x7a, 0xc9, 0x1e, 0xb7, 0xb4, 0x56, 0xba, + 0x2a, 0x87, 0x65, 0x1b, 0xa8, 0xb5, 0x32, 0xdc, 0xbe, 0x1e, 0xbc, 0xef, + 0xa0, 0x3a, 0x71, 0x24, 0x93, 0x1c, 0xeb, 0x76, 0x2e, 0xd9, 0xcf, 0x2a, + 0x41, 0xf2, 0xbb, 0xfd, 0xa1, 0xf7, 0x1c, 0x51, 0xe7, 0x42, 0x4b, 0xa5, + 0xb9, 0x92, 0xaa, 0x7b, 0x93, 0xe3, 0x86, 0x03, 0x36, 0x30, 0x4a, 0xb2, + 0x9f, 0x25, 0xdc, 0xb6, 0xa2, 0x71, 0xcf, 0x82, 0xa2, 0x7e, 0x2c, 0xb3, + 0x62, 0x03, 0xb3, 0xe2, 0xcb, 0x1d, 0x69, 0xcf, 0xb0, 0x8f, 0x0b, 0x8b, + 0x87, 0xd5, 0xbd, 0x68, 0xdb, 0xaf, 0xde, 0x6e, 0xa7, 0x29, 0xed, 0x6d, + 0xa8, 0x27, 0xa3, 0xd6, 0xa5, 0x8e, 0xca, 0x73, 0x65, 0x45, 0x26, 0xd2, + 0xfe, 0xfb, 0x0f, 0x0e, 0x27, 0x32, 0x91, 0xdd, 0x5e, 0xc6, 0x91, 0xca, + 0x07, 0xea, 0x8a, 0xba, 0x46, 0xf5, 0x7a, 0x45, 0xad, 0x95, 0x40, 0x81, + 0x77, 0xdc, 0x1b, 0xcc, 0x55, 0x6d, 0x90, 0x57, 0x90, 0xdc, 0x54, 0xcd, + 0x0e, 0xaa, 0xb5, 0xda, 0x51, 0x79, 0xbe, 0xac, 0xf3, 0xed, 0x48, 0x07, + 0x6b, 0x65, 0xc9, 0x18, 0x35, 0xf6, 0x06, 0x7a, 0xee, 0x52, 0x57, 0x47, + 0xf6, 0x56, 0xd4, 0x6c, 0x2e, 0xab, 0xdb, 0x37, 0x6a, 0xcc, 0x07, 0x36, + 0xd8, 0xd5, 0xf4, 0xa4, 0xb9, 0x40, 0x41, 0x10, 0xa8, 0x24, 0x1b, 0x1a, + 0x56, 0xfa, 0x6b, 0xbb, 0x0c, 0x23, 0x45, 0xaa, 0x04, 0x65, 0x35, 0xbb, + 0x91, 0x1a, 0x95, 0xb2, 0x8c, 0xe9, 0x69, 0xa1, 0x1e, 0xea, 0xec, 0xab, + 0x1d, 0x1d, 0xbe, 0xb3, 0xaa, 0x56, 0xab, 0x6d, 0x03, 0x21, 0xc3, 0xb2, + 0xe2, 0x38, 0x09, 0x3a, 0x2c, 0x06, 0x76, 0xf9, 0x14, 0x83, 0x61, 0xf0, + 0x61, 0x31, 0x50, 0xac, 0x92, 0xc2, 0x37, 0x05, 0x6a, 0x5f, 0x89, 0x55, + 0xbb, 0x25, 0x94, 0x89, 0xa4, 0x6a, 0x75, 0xf2, 0x36, 0xf7, 0x27, 0xdf, + 0xb7, 0xa4, 0x3f, 0xfa, 0x93, 0x13, 0xfa, 0x95, 0xc7, 0x7e, 0xc9, 0x2e, + 0xef, 0x83, 0xff, 0x95, 0x9a, 0xe7, 0xdf, 0x96, 0xd6, 0x7f, 0xef, 0xe2, + 0x1d, 0xba, 0x63, 0x5f, 0xfe, 0xfe, 0xd2, 0x8d, 0xfb, 0xf4, 0x1f, 0x9f, + 0xd4, 0xaf, 0x3c, 0xf6, 0x4b, 0xfa, 0xde, 0xc5, 0x38, 0x1d, 0xf7, 0x37, + 0x3f, 0xfe, 0x3b, 0x99, 0x36, 0xff, 0x5c, 0xdf, 0xbb, 0x18, 0xeb, 0xfd, + 0x7f, 0xff, 0x91, 0x74, 0xbc, 0xa7, 0xff, 0xf8, 0xa4, 0xde, 0xff, 0xf7, + 0x1f, 0x19, 0x69, 0xf3, 0xe9, 0x3f, 0x3e, 0xa9, 0x5f, 0xfb, 0xcd, 0x7f, + 0xa4, 0xe6, 0xf9, 0x3f, 0x4f, 0xa7, 0x93, 0xa4, 0x3b, 0xf6, 0x3d, 0x92, + 0xf4, 0xc7, 0x4e, 0xeb, 0x1e, 0x7f, 0xa6, 0xfc, 0x7f, 0xeb, 0xc0, 0x2f, + 0xff, 0xbf, 0xba, 0xf0, 0xc9, 0xff, 0x42, 0xbf, 0x12, 0x3d, 0xa2, 0x9f, + 0xf9, 0x33, 0x1b, 0x70, 0xfc, 0xcf, 0xdf, 0xf6, 0xe1, 0x74, 0xfc, 0x77, + 0xbc, 0xed, 0x9d, 0x92, 0xa4, 0x5b, 0x7f, 0xf8, 0x0e, 0x49, 0xd2, 0x3b, + 0x86, 0x2f, 0x2f, 0x1d, 0x7e, 0xc7, 0xdb, 0xde, 0x39, 0x52, 0xee, 0xf8, + 0xd3, 0xb8, 0xb6, 0xf2, 0xa6, 0xcf, 0x9b, 0x66, 0xb8, 0x0c, 0x87, 0x7d, + 0x90, 0xa4, 0x3f, 0xfa, 0x93, 0x13, 0xfa, 0xc9, 0xf7, 0x2d, 0x49, 0x92, + 0xbe, 0xf1, 0xfc, 0xf0, 0x7b, 0xfe, 0xef, 0xbe, 0xfa, 0xda, 0x68, 0x43, + 0x6d, 0x49, 0xed, 0x9a, 0x1d, 0x58, 0xaa, 0x25, 0x07, 0x8b, 0xed, 0xa4, + 0x2c, 0x19, 0x3e, 0x2e, 0xfb, 0x57, 0x93, 0x74, 0xeb, 0xda, 0xbe, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x37, + 0xfe, 0x56, 0xd9, 0x00, 0x00, 0x60, 0xcb, 0x84, 0x61, 0x38, 0x30, 0x0f, + 0x1d, 0x96, 0x3e, 0x1b, 0xc9, 0x54, 0xf3, 0x43, 0x06, 0x82, 0x7d, 0x81, + 0x4c, 0x72, 0xf1, 0x61, 0xb0, 0x2f, 0xb9, 0x30, 0xe3, 0xa2, 0x49, 0x87, + 0xb1, 0x7d, 0xfc, 0xe5, 0xee, 0xbf, 0x27, 0xe6, 0x62, 0xfe, 0x49, 0xf7, + 0x41, 0xa7, 0x2e, 0xfd, 0x5c, 0x59, 0xc1, 0x17, 0xcf, 0x4a, 0x45, 0xe9, + 0xcb, 0xf3, 0x46, 0x87, 0x7f, 0xbe, 0xa2, 0x47, 0x7e, 0xb1, 0x9d, 0x3b, + 0x7e, 0x65, 0x4f, 0xa8, 0x6e, 0x12, 0x90, 0x55, 0xd9, 0x63, 0x4f, 0x48, + 0xec, 0x5e, 0x8e, 0xd3, 0x61, 0x6c, 0x1f, 0x7f, 0xb9, 0xfb, 0xef, 0x49, + 0xf7, 0x72, 0xfe, 0x05, 0x0d, 0x27, 0x7f, 0xb7, 0xa6, 0xb3, 0x8f, 0x77, + 0xf5, 0xde, 0x95, 0xe4, 0xff, 0xe3, 0xc7, 0x58, 0xaf, 0xaf, 0x17, 0x1b, + 0x5e, 0xaf, 0xbf, 0x74, 0x56, 0x12, 0xeb, 0xf5, 0xf5, 0xe4, 0x6a, 0xd6, + 0xeb, 0xa2, 0x8a, 0x3a, 0x79, 0xcb, 0x5f, 0xea, 0x47, 0x1e, 0xbd, 0x4d, + 0x0f, 0xff, 0x52, 0x3b, 0x77, 0xfc, 0xdb, 0xf7, 0xcc, 0xe9, 0xb5, 0xcb, + 0xab, 0xe9, 0xb0, 0x24, 0xbd, 0x76, 0x79, 0x35, 0x1d, 0xc6, 0xf6, 0xf1, + 0x97, 0xbb, 0xff, 0x9e, 0xb8, 0xe1, 0xac, 0x67, 0x7e, 0xa7, 0xa6, 0x6f, + 0x3c, 0xf9, 0xba, 0x1e, 0xb9, 0xf2, 0x66, 0xf5, 0xfb, 0x7d, 0x7d, 0xd9, + 0xd4, 0x75, 0xf8, 0xde, 0x48, 0x8f, 0x8c, 0x09, 0x34, 0xaa, 0xcc, 0x49, + 0xdd, 0xd5, 0xe1, 0xb0, 0x64, 0x9f, 0x57, 0x78, 0xab, 0xb7, 0x9d, 0xbf, + 0xdc, 0xfd, 0xf7, 0xa4, 0x3b, 0xe6, 0xa2, 0xef, 0x93, 0xf7, 0x49, 0x67, + 0x5f, 0x2c, 0xeb, 0xbd, 0x41, 0xcb, 0x1e, 0x9b, 0xad, 0xd6, 0x75, 0x78, + 0xaf, 0xd1, 0x23, 0x17, 0xa2, 0xdc, 0xf1, 0x2b, 0x61, 0xa0, 0x6e, 0x6c, + 0xd2, 0x61, 0x49, 0xea, 0xc6, 0x26, 0x1d, 0xc6, 0xf6, 0xf1, 0x97, 0xbb, + 0xff, 0x9e, 0xb8, 0xe1, 0xac, 0x93, 0x07, 0xca, 0x3a, 0x7b, 0x29, 0xd0, + 0x7b, 0xe7, 0xec, 0xb1, 0x58, 0xba, 0xbf, 0x7e, 0xb4, 0x9d, 0x3b, 0x7e, + 0xa5, 0x52, 0x51, 0x37, 0x09, 0x55, 0xad, 0x24, 0x41, 0xb0, 0xdd, 0x6e, + 0x37, 0x1d, 0xc6, 0xf6, 0xf1, 0x97, 0xbb, 0xff, 0x9e, 0x74, 0xfd, 0xd0, + 0x5b, 0xcf, 0xc9, 0x27, 0x47, 0xf7, 0xd7, 0x7f, 0xfb, 0x2f, 0x4f, 0xea, + 0x1f, 0xdf, 0xf6, 0x23, 0xfa, 0xa9, 0xf6, 0xc3, 0xb9, 0xe3, 0xff, 0xd7, + 0x73, 0xb7, 0xeb, 0x3f, 0xac, 0xbe, 0x96, 0x0e, 0x4b, 0xd2, 0x7f, 0x58, + 0x7d, 0x2d, 0x1d, 0xc6, 0xf6, 0xf1, 0x97, 0xbb, 0xff, 0x9e, 0xb8, 0xe1, + 0xac, 0x2f, 0xd4, 0x9e, 0xd1, 0x6f, 0xbf, 0xfe, 0x0d, 0xfd, 0xbb, 0x37, + 0x3f, 0xa2, 0xbe, 0xfa, 0x76, 0x1b, 0xce, 0xfe, 0xfa, 0xba, 0xb0, 0xe1, + 0xfd, 0xf5, 0x5c, 0x8b, 0xf5, 0xfa, 0x3a, 0x73, 0x35, 0xeb, 0xb5, 0x24, + 0x3e, 0x73, 0x5d, 0x47, 0xae, 0xea, 0x33, 0x97, 0xfa, 0xd3, 0x8f, 0xcd, + 0x6a, 0xa1, 0xba, 0xed, 0x38, 0x1d, 0x96, 0xa4, 0x6e, 0x3b, 0x4e, 0x87, + 0xb1, 0x7d, 0xfc, 0xe5, 0xee, 0xbf, 0x27, 0x6e, 0x38, 0xcb, 0x3f, 0x36, + 0x93, 0xa4, 0x85, 0xd5, 0x2f, 0xeb, 0xb1, 0x3d, 0x87, 0xf5, 0x48, 0xfb, + 0x91, 0xdc, 0xf1, 0xab, 0x73, 0x15, 0x75, 0x56, 0xbb, 0xe9, 0xb0, 0x24, + 0x75, 0x56, 0xbb, 0xe9, 0x30, 0xb6, 0x8f, 0xbf, 0xdc, 0xfd, 0xf7, 0xc4, + 0x0d, 0x67, 0x9d, 0xac, 0x9d, 0xd4, 0xc7, 0x2f, 0x9f, 0xd5, 0xf2, 0xdc, + 0x7b, 0xf9, 0xde, 0xec, 0x3a, 0xc3, 0xf7, 0x66, 0xbb, 0xc7, 0xd5, 0x7e, + 0x6f, 0xc6, 0xef, 0x5c, 0xd7, 0x8f, 0xab, 0xf9, 0x9d, 0xab, 0xa8, 0xa2, + 0xfe, 0xfa, 0x27, 0xde, 0x21, 0x7d, 0x3a, 0xd2, 0x5f, 0xde, 0x96, 0x1f, + 0x09, 0xfc, 0x37, 0xf7, 0xfd, 0x97, 0xfa, 0xab, 0x8b, 0xff, 0x29, 0x1d, + 0x96, 0xa4, 0xbf, 0xba, 0xf8, 0x9f, 0xd2, 0x61, 0x6c, 0x1f, 0x7f, 0xb9, + 0xfb, 0xef, 0x89, 0x1b, 0xce, 0x7a, 0xf3, 0xeb, 0x77, 0x48, 0x1f, 0x2a, + 0xeb, 0x4d, 0xff, 0xf2, 0xdf, 0xb2, 0x0d, 0xbf, 0xce, 0x6c, 0x74, 0x1b, + 0xfe, 0x13, 0x73, 0xaf, 0x4d, 0x5d, 0xa7, 0xef, 0x7f, 0xeb, 0x5b, 0xf5, + 0xcd, 0xef, 0x7c, 0x27, 0x1d, 0x96, 0xa4, 0x6f, 0x7e, 0xe7, 0x3b, 0xe9, + 0x30, 0xb6, 0x8f, 0xbf, 0xdc, 0xfd, 0xf7, 0xc4, 0x0d, 0x67, 0xf9, 0xeb, + 0xf4, 0xca, 0xca, 0x0a, 0xe7, 0x7b, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xc0, 0x3a, 0x4c, 0xb9, 0x27, 0x34, 0x00, 0x00, + 0xd8, 0x6a, 0x41, 0x67, 0xfc, 0xdd, 0xbd, 0xb3, 0xa7, 0x1f, 0x6f, 0xf7, + 0xe9, 0xc8, 0x3d, 0x9d, 0x55, 0x49, 0x87, 0xd5, 0x93, 0x0d, 0x91, 0x29, + 0x25, 0xf7, 0x2c, 0x76, 0xcf, 0x5d, 0x99, 0xff, 0xfc, 0x6a, 0x65, 0xdb, + 0xcb, 0xce, 0xd3, 0xd5, 0x97, 0xd6, 0x7f, 0xff, 0xe4, 0x0d, 0x0b, 0x66, + 0x18, 0x9e, 0xc5, 0xc9, 0xdf, 0xad, 0x4d, 0xa8, 0xcd, 0x5e, 0x1c, 0xb6, + 0xcd, 0x17, 0x8b, 0x7d, 0xb8, 0x25, 0x7d, 0xaa, 0x6e, 0x1f, 0x25, 0x3b, + 0xec, 0xca, 0x1d, 0xbf, 0x7e, 0x33, 0x64, 0xdb, 0xcb, 0xce, 0xd3, 0xd5, + 0x7f, 0x6a, 0xfc, 0x3a, 0xb2, 0xf9, 0xc2, 0x19, 0x86, 0xa7, 0x63, 0xbd, + 0x1e, 0xc5, 0x7a, 0x3d, 0xee, 0xf9, 0x16, 0x63, 0xbd, 0x4e, 0x6c, 0xce, + 0x7a, 0xfd, 0xcc, 0xef, 0xd4, 0x26, 0xd4, 0xce, 0x4f, 0x79, 0xbe, 0xc5, + 0x1e, 0x7d, 0x55, 0x7a, 0xf2, 0x4e, 0xfb, 0x28, 0xd9, 0x61, 0x57, 0xee, + 0xf8, 0xf5, 0x9b, 0x21, 0xdb, 0x5e, 0x76, 0x9e, 0xae, 0xde, 0x95, 0x6f, + 0x8b, 0xf9, 0x19, 0x86, 0xa7, 0x3b, 0x79, 0xdf, 0xa6, 0x74, 0x66, 0x6b, + 0x3c, 0xdf, 0x92, 0x1e, 0xa8, 0xdb, 0x47, 0xc9, 0x0e, 0xbb, 0x72, 0xc7, + 0xaf, 0xdf, 0x0c, 0xd9, 0xf6, 0xb2, 0xf3, 0x74, 0xf5, 0x0f, 0x6c, 0xe7, + 0x7a, 0xbd, 0x39, 0x4e, 0x1e, 0x28, 0x8f, 0xaf, 0xdc, 0x53, 0x9a, 0xfc, + 0x7c, 0xab, 0x7d, 0xfb, 0x65, 0xe9, 0xee, 0xfd, 0xf6, 0x51, 0xb2, 0xc3, + 0xae, 0xdc, 0xf1, 0xeb, 0x37, 0x43, 0xb6, 0xbd, 0xec, 0x3c, 0x5d, 0xbd, + 0x2b, 0xdf, 0x0e, 0xfe, 0x72, 0x1f, 0x37, 0x3c, 0x83, 0x93, 0x4f, 0xd6, + 0x26, 0xd4, 0x66, 0xeb, 0x26, 0x8d, 0xbb, 0x05, 0xd8, 0x5f, 0x27, 0x6a, + 0x33, 0x0c, 0x4f, 0xf7, 0x85, 0xda, 0x33, 0xe3, 0x2b, 0x77, 0x78, 0x77, + 0xfd, 0xdf, 0xbd, 0x2a, 0xfd, 0x9b, 0x3b, 0xed, 0xa3, 0x64, 0x87, 0x5d, + 0xb9, 0xe3, 0xd7, 0x6f, 0x86, 0x6c, 0x7b, 0xd9, 0x79, 0xba, 0xfa, 0x7f, + 0x73, 0xfd, 0xed, 0xae, 0xd9, 0x5f, 0x67, 0xdd, 0xc0, 0xfb, 0x6b, 0xd6, + 0xeb, 0x51, 0x37, 0xf2, 0x7a, 0xcd, 0x67, 0xae, 0x8c, 0x1b, 0xf9, 0x33, + 0xd7, 0xc4, 0x63, 0x33, 0xbe, 0x4b, 0xb9, 0x36, 0x8e, 0xcd, 0x36, 0xe7, + 0xbb, 0x94, 0x93, 0xb5, 0x93, 0xe3, 0x2b, 0x77, 0x78, 0xb5, 0x3e, 0xfa, + 0xaa, 0x74, 0xfa, 0x4e, 0xfb, 0x28, 0xd9, 0x61, 0x57, 0xee, 0xf8, 0xf5, + 0x9b, 0x21, 0xdb, 0x5e, 0x76, 0x9e, 0xae, 0xfe, 0xf4, 0xf5, 0xb7, 0x5a, + 0xb3, 0x0d, 0xcf, 0xba, 0x91, 0xb7, 0xe1, 0x1c, 0x87, 0x8f, 0xba, 0x81, + 0x8f, 0xc3, 0xf9, 0x9d, 0x6b, 0xd4, 0x8d, 0xfc, 0x3b, 0xd7, 0x9b, 0x5f, + 0xbf, 0x63, 0x6c, 0x5d, 0xf6, 0xa4, 0xc2, 0xed, 0x3e, 0xc9, 0x30, 0xd6, + 0x59, 0x85, 0x3a, 0xac, 0x38, 0x59, 0xce, 0x61, 0xb2, 0x7c, 0x63, 0xef, + 0xbd, 0xf0, 0xeb, 0x37, 0x43, 0xb6, 0xbd, 0xec, 0x3c, 0x5d, 0x7d, 0xb8, + 0x8d, 0xef, 0x75, 0x71, 0x86, 0xe1, 0x59, 0xb0, 0x0d, 0xcf, 0xb8, 0x41, + 0xb7, 0xe1, 0xe3, 0xd6, 0xe9, 0x65, 0xfd, 0x95, 0xde, 0xac, 0x3b, 0xd2, + 0x61, 0x49, 0x7a, 0xb3, 0xee, 0x48, 0x87, 0xb7, 0x03, 0xeb, 0xb4, 0xe5, + 0x2f, 0x77, 0xff, 0x3d, 0x71, 0xc3, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0xcd, 0xc3, 0x9d, 0x8b, 0x00, 0x00, 0xd8, + 0x01, 0x61, 0x18, 0x0e, 0xcc, 0x43, 0x53, 0x4e, 0xca, 0x7a, 0x4f, 0x24, + 0x3d, 0x5b, 0x1e, 0x7d, 0x2e, 0x0d, 0xcb, 0xdc, 0x73, 0x57, 0xe6, 0x3f, + 0xdf, 0xa8, 0xf7, 0x4b, 0x7a, 0x7a, 0x4c, 0xb9, 0x72, 0xea, 0xde, 0xef, + 0x0d, 0x3f, 0x9d, 0x53, 0x96, 0x95, 0x37, 0x8e, 0xdf, 0xe6, 0xb8, 0xf2, + 0x49, 0x7d, 0x70, 0x75, 0x79, 0xe5, 0xeb, 0x95, 0x5d, 0x8e, 0xd9, 0x65, + 0x9d, 0x7d, 0x3f, 0x9e, 0x9d, 0x10, 0xc4, 0x20, 0x29, 0xf8, 0xe2, 0x59, + 0xa9, 0x28, 0x7d, 0x79, 0x3e, 0xff, 0x8e, 0xc0, 0x4e, 0x78, 0x77, 0xa0, + 0xf8, 0xdb, 0x66, 0xe4, 0xb9, 0xa4, 0xb4, 0xcc, 0x3d, 0x77, 0x65, 0xfe, + 0xf3, 0x8d, 0xda, 0xbf, 0x18, 0xea, 0xe5, 0x33, 0x71, 0x6e, 0xb9, 0xa4, + 0x35, 0x75, 0xae, 0xdc, 0xaf, 0xf3, 0xcb, 0xb2, 0xf2, 0xc6, 0xf1, 0xdb, + 0x1c, 0x57, 0x3e, 0xa9, 0x0f, 0x93, 0xfa, 0xbd, 0x5e, 0xd9, 0xe5, 0x98, + 0x5d, 0xd6, 0xd9, 0xf7, 0xc3, 0x7f, 0x9e, 0xe7, 0xbd, 0x2b, 0xc9, 0x9d, + 0xa0, 0x7f, 0x8c, 0xf5, 0x7a, 0x4d, 0x9b, 0x37, 0xda, 0x7a, 0xfd, 0x25, + 0x7b, 0x82, 0x2d, 0xeb, 0xf5, 0x68, 0xd9, 0xa4, 0xf2, 0x49, 0x7d, 0x98, + 0xd4, 0xef, 0xf5, 0xda, 0x8a, 0xf5, 0xba, 0xa8, 0xa2, 0x4e, 0xde, 0xf2, + 0x97, 0x13, 0xc7, 0xbb, 0xe5, 0xee, 0x39, 0x5d, 0xf9, 0xf6, 0xea, 0xc8, + 0x73, 0x49, 0x69, 0x99, 0x7b, 0xee, 0xca, 0xfc, 0xe7, 0x1b, 0xd5, 0xf8, + 0x91, 0xb7, 0xa8, 0xf9, 0x8d, 0xbf, 0xc8, 0x2d, 0x97, 0xb4, 0xa6, 0xce, + 0x95, 0xfb, 0x75, 0x7e, 0x59, 0x56, 0xde, 0x38, 0x7e, 0x9b, 0xe3, 0xca, + 0x27, 0xf5, 0x61, 0x52, 0xbf, 0xd7, 0x2b, 0xbb, 0x1c, 0xb3, 0xcb, 0x3a, + 0xfb, 0x7e, 0xf8, 0xcf, 0xf3, 0x3c, 0x72, 0xe5, 0xcd, 0xe9, 0xdd, 0xda, + 0x27, 0x09, 0xe7, 0x22, 0xc5, 0xab, 0xe5, 0x91, 0xe7, 0x92, 0xd2, 0x32, + 0xf7, 0xdc, 0x95, 0xf9, 0xcf, 0x37, 0x6a, 0xff, 0x3e, 0xe9, 0xe5, 0x8b, + 0xf9, 0xe5, 0xd2, 0xda, 0x3a, 0x57, 0xee, 0xd7, 0xf9, 0x65, 0x59, 0x79, + 0xe3, 0xf8, 0x6d, 0x8e, 0x2b, 0x9f, 0xd4, 0x87, 0x49, 0xfd, 0x5e, 0xaf, + 0xec, 0x72, 0xcc, 0x2e, 0xeb, 0xec, 0xfb, 0xe1, 0x3f, 0xcf, 0xf3, 0xde, + 0xa0, 0x65, 0x8f, 0xcd, 0x56, 0xaf, 0xc1, 0xf7, 0xba, 0x52, 0xd2, 0xcb, + 0xdd, 0x5e, 0x6e, 0xb9, 0xa4, 0x35, 0x75, 0xae, 0xdc, 0xaf, 0xf3, 0xcb, + 0xb2, 0xf2, 0xc6, 0xf1, 0xdb, 0x1c, 0x57, 0x3e, 0xa9, 0x0f, 0x93, 0xfa, + 0xbd, 0x5e, 0x9b, 0xfe, 0x5e, 0xcf, 0xd9, 0x0b, 0x9f, 0xd8, 0x5f, 0x8f, + 0x96, 0x4d, 0x2a, 0x9f, 0xd4, 0x87, 0x49, 0xfd, 0x5e, 0xaf, 0xad, 0xda, + 0x5f, 0xff, 0xed, 0xbf, 0x9c, 0x10, 0xd8, 0x20, 0xe9, 0x6d, 0x73, 0xb7, + 0xe8, 0xcf, 0x56, 0xaf, 0x8c, 0x3c, 0x97, 0x94, 0x96, 0xb9, 0xe7, 0xae, + 0xcc, 0x7f, 0xbe, 0x51, 0x47, 0xdf, 0xd2, 0xd0, 0xe9, 0xbf, 0x68, 0xe6, + 0x96, 0x4b, 0x5a, 0x53, 0xe7, 0xca, 0xfd, 0x3a, 0xbf, 0x2c, 0x2b, 0x6f, + 0x1c, 0xbf, 0xcd, 0x71, 0xe5, 0x93, 0xfa, 0x30, 0xa9, 0xdf, 0xeb, 0x95, + 0x5d, 0x8e, 0xd9, 0x65, 0x9d, 0x7d, 0x3f, 0xfc, 0xe7, 0x79, 0xfe, 0xdd, + 0x9b, 0x1f, 0x51, 0x5f, 0xfd, 0x6b, 0x73, 0x1b, 0xce, 0xfe, 0x7a, 0xd3, + 0xb7, 0xe1, 0xac, 0xd7, 0xbb, 0x67, 0xbd, 0x96, 0xc4, 0x67, 0xae, 0x4c, + 0xd9, 0xa4, 0xf2, 0x49, 0x7d, 0x98, 0xd4, 0xef, 0xf5, 0xda, 0x92, 0xcf, + 0x5c, 0xea, 0x73, 0x6c, 0x96, 0x29, 0x9b, 0x54, 0x3e, 0xa9, 0x0f, 0x93, + 0xfa, 0xbd, 0x5e, 0x5b, 0xf5, 0x1d, 0xe9, 0xc2, 0xea, 0x97, 0x27, 0x8e, + 0x77, 0x70, 0x2e, 0xd4, 0xf9, 0xd5, 0x78, 0xe4, 0xb9, 0xa4, 0xb4, 0xcc, + 0x3d, 0x77, 0x65, 0xfe, 0xf3, 0x8d, 0x7a, 0x30, 0xdc, 0xaf, 0x53, 0xf1, + 0xda, 0x50, 0xe2, 0x07, 0x43, 0x1b, 0x1a, 0x9c, 0xad, 0x73, 0xe5, 0x7e, + 0x9d, 0x5f, 0x96, 0x95, 0x37, 0x8e, 0xdf, 0xe6, 0xb8, 0xf2, 0x49, 0x7d, + 0x98, 0xd4, 0xef, 0xf5, 0xca, 0x2e, 0xc7, 0xec, 0xb2, 0xce, 0xbe, 0x1f, + 0xfe, 0xf3, 0x3c, 0xcb, 0x73, 0xef, 0xe5, 0x7b, 0xb3, 0xdd, 0xb4, 0x0d, + 0xe7, 0x7b, 0xb3, 0x35, 0x65, 0x93, 0xca, 0x27, 0xf5, 0x61, 0x52, 0xbf, + 0xd7, 0x6b, 0xab, 0xbe, 0x37, 0xe3, 0x77, 0xae, 0x9c, 0x36, 0x6f, 0xc0, + 0xdf, 0xb9, 0x8a, 0x2a, 0xea, 0xaf, 0x7f, 0xe2, 0x1d, 0x93, 0xe7, 0xfb, + 0x77, 0x23, 0xe9, 0xab, 0xe5, 0xd1, 0xe7, 0xd2, 0xb0, 0xec, 0xef, 0x7a, + 0x7d, 0xfa, 0x6a, 0x79, 0xf4, 0xf9, 0x46, 0xfd, 0x3d, 0x49, 0xff, 0x62, + 0x4c, 0xb9, 0x72, 0xea, 0xfe, 0x9e, 0x37, 0xfc, 0x2f, 0x72, 0xca, 0xb2, + 0xf2, 0xc6, 0xf1, 0xdb, 0x1c, 0x57, 0x3e, 0xa9, 0x0f, 0xae, 0x2e, 0xaf, + 0x7c, 0xbd, 0xb2, 0xcb, 0x31, 0xbb, 0xac, 0xb3, 0xef, 0xc7, 0x57, 0x27, + 0xbf, 0xd7, 0x6f, 0xfa, 0x97, 0xff, 0x96, 0x6d, 0xf8, 0x2e, 0xd9, 0x86, + 0xff, 0xc4, 0xdc, 0x6b, 0xac, 0xd3, 0xd9, 0xb2, 0x49, 0xe5, 0x93, 0xfa, + 0xe0, 0xea, 0xae, 0xd1, 0x75, 0x7a, 0x65, 0x65, 0x85, 0xf3, 0xbd, 0x01, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x1d, 0xf8, + 0x91, 0x15, 0x00, 0x80, 0x1d, 0x10, 0x86, 0xe1, 0x60, 0xa7, 0xfb, 0x80, + 0x6d, 0xb2, 0xdd, 0xb7, 0xec, 0x05, 0x00, 0x6c, 0x9a, 0x22, 0x1b, 0xf1, + 0x5d, 0xa3, 0xdf, 0xef, 0xef, 0x74, 0x17, 0xb0, 0x5d, 0x58, 0xad, 0x81, + 0x1b, 0x0e, 0xfb, 0xeb, 0xdd, 0xa3, 0x2f, 0xf6, 0xd7, 0xbb, 0x05, 0xeb, + 0x35, 0x70, 0xe3, 0x61, 0x1b, 0x0e, 0xdc, 0x78, 0xd8, 0x5f, 0xef, 0x1e, + 0x7c, 0x6f, 0xb6, 0x8b, 0xb0, 0x5a, 0xef, 0x1a, 0x6c, 0xc3, 0x77, 0x0f, + 0xb6, 0xe1, 0x6c, 0x4b, 0x52, 0xc2, 0x00, 0x00, 0x20, 0x00, 0x49, 0x44, + 0x41, 0x54, 0xbb, 0x43, 0xb1, 0xc8, 0x3a, 0xbd, 0x5b, 0x10, 0xaa, 0x05, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xd6, 0xa3, 0xb0, 0xd3, 0x1d, 0x00, 0x00, 0x00, 0xd7, 0x97, + 0x30, 0x0c, 0x07, 0xdb, 0x3d, 0xcf, 0x38, 0x8e, 0x39, 0x66, 0xd9, 0x64, + 0xe1, 0xfc, 0xf6, 0xbf, 0x8f, 0x9b, 0x21, 0x5e, 0xe1, 0x7f, 0x61, 0x2b, + 0xec, 0xc4, 0xff, 0x03, 0xef, 0xe5, 0xe6, 0x63, 0xbd, 0xde, 0x3d, 0xe6, + 0xe7, 0xe7, 0xaf, 0xcb, 0xf7, 0x7a, 0x65, 0x65, 0x85, 0xf7, 0x7a, 0x0b, + 0x6c, 0xf7, 0xb1, 0x19, 0xc7, 0x65, 0x3b, 0x67, 0xbb, 0xb7, 0xf3, 0x6c, + 0x9f, 0xb7, 0x06, 0xfb, 0xeb, 0x1b, 0xdf, 0xf5, 0xba, 0x9f, 0xce, 0xc3, + 0xbe, 0x7b, 0xf3, 0xb0, 0x0d, 0xbf, 0xbe, 0xb1, 0x5e, 0xef, 0x3e, 0xd7, + 0xeb, 0x7b, 0xce, 0xfb, 0xbb, 0x7e, 0x1c, 0x9b, 0xdd, 0xf8, 0xae, 0xd7, + 0xf7, 0x38, 0x0f, 0xef, 0xfb, 0x6c, 0xd8, 0x86, 0xc3, 0xc7, 0xf7, 0x66, + 0xbb, 0x07, 0xbf, 0x73, 0xed, 0x1e, 0x3b, 0xb1, 0x9d, 0x67, 0x1b, 0xbd, + 0x33, 0xd8, 0x86, 0xef, 0x0e, 0x9c, 0x7f, 0x04, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd8, 0x4a, 0xc5, 0x9d, 0xee, 0x00, + 0x00, 0x00, 0xb8, 0xfe, 0x98, 0xa8, 0xb1, 0xb6, 0xac, 0x70, 0x4e, 0x61, + 0x18, 0xae, 0xa9, 0x1f, 0x57, 0xee, 0xd7, 0xb9, 0xf2, 0x71, 0xcf, 0xb1, + 0x35, 0xa2, 0x5f, 0xb7, 0xcb, 0xb6, 0xf0, 0x68, 0x5b, 0xe1, 0x7c, 0x98, + 0x5b, 0xe6, 0x9e, 0xfb, 0xc6, 0xd5, 0xe5, 0xb5, 0x33, 0x6e, 0x9a, 0xc2, + 0xa3, 0x6d, 0x0d, 0x9e, 0xac, 0x8d, 0xad, 0x1b, 0xd7, 0x1f, 0x6c, 0x1d, + 0x73, 0x65, 0xcc, 0x7a, 0x9d, 0x2c, 0x77, 0xbf, 0x7e, 0x5c, 0xb9, 0x5f, + 0xe7, 0xca, 0xc7, 0x3d, 0xc7, 0xd6, 0x60, 0xbd, 0xde, 0x3d, 0xae, 0x1c, + 0x4f, 0x96, 0xe3, 0xb1, 0x4b, 0x9a, 0x9f, 0x9f, 0xcf, 0x2d, 0x73, 0xcf, + 0x7d, 0xe3, 0xea, 0xf2, 0xda, 0x19, 0x37, 0x4d, 0xe1, 0xd8, 0x25, 0x0d, + 0x9e, 0xd8, 0x3b, 0xb6, 0x6e, 0x5c, 0x7f, 0xb0, 0x75, 0xa2, 0x3d, 0x55, + 0x49, 0x52, 0xe1, 0x42, 0x53, 0x83, 0x03, 0x8d, 0x74, 0xd8, 0x1d, 0x47, + 0xb9, 0xfa, 0x49, 0xe5, 0xd9, 0xfa, 0x6c, 0x9d, 0x2b, 0x0f, 0xc3, 0x70, + 0xc0, 0x05, 0x07, 0x3b, 0x27, 0xaa, 0xb8, 0xf7, 0xba, 0xa7, 0xc1, 0x81, + 0x52, 0x3a, 0x1c, 0xce, 0xc7, 0x23, 0xf5, 0x93, 0xca, 0xb3, 0xf5, 0xd9, + 0x3a, 0x57, 0x1e, 0xce, 0x87, 0x03, 0x2e, 0x0e, 0xdc, 0x1a, 0xec, 0xaf, + 0x6f, 0x7c, 0x9f, 0x0b, 0xaf, 0x48, 0x92, 0xde, 0x7d, 0xa9, 0x90, 0xee, + 0x03, 0x27, 0x95, 0x4d, 0x2a, 0x9f, 0xd6, 0xce, 0xb8, 0xe7, 0x79, 0xd3, + 0x8f, 0x6b, 0x77, 0xd2, 0xfc, 0xb0, 0x79, 0x86, 0xdb, 0xf0, 0xcc, 0xfe, + 0xda, 0xad, 0x77, 0x95, 0xcc, 0xfe, 0x3a, 0xa7, 0x3c, 0x5b, 0xbf, 0x76, + 0x1b, 0x6e, 0xcb, 0xd9, 0x86, 0x6f, 0x3e, 0xd6, 0xeb, 0xdd, 0x87, 0xcf, + 0x5c, 0xbb, 0x07, 0xc7, 0x66, 0x37, 0xbe, 0x93, 0x61, 0x24, 0x49, 0x7a, + 0xe7, 0xa5, 0x42, 0xba, 0xfc, 0x26, 0x95, 0x4d, 0x2a, 0x9f, 0xd6, 0xce, + 0xb8, 0xe7, 0x79, 0xd3, 0x8f, 0x6b, 0x77, 0xd2, 0xfc, 0x30, 0x1b, 0xb6, + 0xe1, 0xf0, 0xf1, 0xbd, 0xd9, 0xee, 0xc1, 0xef, 0x5c, 0xbb, 0xc7, 0x5f, + 0x5f, 0xb9, 0x73, 0x4d, 0xd9, 0x5f, 0x14, 0xce, 0xa5, 0xdb, 0x53, 0xbf, + 0x7e, 0x5c, 0xb9, 0x5f, 0xe7, 0xca, 0xc7, 0x3d, 0xc7, 0xce, 0x61, 0x1b, + 0xbe, 0x3b, 0x70, 0xfe, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x60, 0xab, 0xdc, 0xb4, 0xd3, 0x1d, 0x00, 0x00, 0x00, + 0xd7, 0x2f, 0x53, 0x38, 0x97, 0xfe, 0xa5, 0x65, 0xde, 0x09, 0x69, 0x92, + 0x14, 0x0c, 0x0e, 0x29, 0x8e, 0xe3, 0xdc, 0xe9, 0x70, 0x6d, 0x18, 0x3c, + 0x59, 0x53, 0xbc, 0x12, 0xe7, 0x5e, 0x1c, 0xe6, 0x14, 0x1e, 0x6d, 0xa7, + 0x7f, 0x79, 0x75, 0x7e, 0x3b, 0x7e, 0x59, 0x76, 0x78, 0xb3, 0xfa, 0x83, + 0xad, 0x93, 0xbb, 0x5e, 0x5f, 0xc9, 0x59, 0xaf, 0x57, 0x58, 0xaf, 0xaf, + 0x65, 0xac, 0xd7, 0xbb, 0xc7, 0xe0, 0x89, 0xbd, 0x5a, 0x59, 0x59, 0xc9, + 0xbd, 0x10, 0xd0, 0x29, 0x1c, 0xbb, 0x94, 0xfe, 0xe5, 0xd5, 0xf9, 0xed, + 0xf8, 0x65, 0xd9, 0xe1, 0xcd, 0xea, 0x0f, 0xb6, 0x97, 0x7f, 0xd1, 0x89, + 0x24, 0x0d, 0x0e, 0x34, 0xd6, 0x1c, 0x9b, 0xb9, 0xba, 0x3c, 0x93, 0xa6, + 0xc3, 0xb5, 0xc5, 0x0f, 0xdc, 0x92, 0xa4, 0xc1, 0x81, 0x92, 0xe2, 0x95, + 0xcc, 0xc5, 0xbe, 0x49, 0x5d, 0x9e, 0x49, 0xd3, 0x61, 0x6b, 0xb0, 0xbf, + 0xbe, 0xf1, 0x7d, 0x65, 0xef, 0x40, 0x2b, 0x2b, 0x2b, 0xb9, 0x81, 0x38, + 0x7e, 0x68, 0x8e, 0x3f, 0xae, 0x6f, 0x52, 0x5d, 0x5e, 0x59, 0x76, 0x5a, + 0xf7, 0x37, 0xae, 0x6e, 0xd6, 0x72, 0x6c, 0x3d, 0x3f, 0x70, 0x4b, 0x4a, + 0xf6, 0xbb, 0x2b, 0x1b, 0xdc, 0x5f, 0xaf, 0xb0, 0xbf, 0xde, 0x4a, 0xac, + 0xd7, 0xbb, 0x0f, 0x9f, 0xb9, 0x76, 0x0f, 0x8e, 0xcd, 0x6e, 0x7c, 0x7f, + 0xba, 0x77, 0xa0, 0x78, 0x25, 0xce, 0x0d, 0xba, 0xf2, 0xc3, 0xb0, 0xfc, + 0x71, 0x7d, 0x93, 0xea, 0xf2, 0xca, 0xb2, 0xd3, 0xba, 0xbf, 0x71, 0x75, + 0xb3, 0x96, 0x63, 0x76, 0x6c, 0xc3, 0x31, 0x0d, 0xdf, 0x9b, 0xdd, 0x98, + 0xf8, 0x9d, 0x6b, 0xf7, 0xf8, 0x8b, 0xc2, 0xb9, 0xf4, 0xcf, 0xf1, 0x03, + 0xb1, 0x24, 0xe9, 0x2d, 0x83, 0x43, 0x6b, 0x3e, 0x67, 0x65, 0xa7, 0xc1, + 0xf5, 0x89, 0x6d, 0xf8, 0x8d, 0x87, 0xf3, 0x8f, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9b, 0x8d, 0x50, 0x2d, 0x00, + 0x00, 0xb0, 0x61, 0xc1, 0xe0, 0x90, 0x82, 0xc1, 0x21, 0x49, 0x5a, 0xd7, + 0x1d, 0x1d, 0xfd, 0xe9, 0xa4, 0xd1, 0x13, 0xe0, 0xb2, 0x27, 0xc5, 0x61, + 0x7b, 0x0c, 0x9e, 0xac, 0x4d, 0xad, 0x77, 0xe3, 0xcc, 0x72, 0xf7, 0xe5, + 0xec, 0x38, 0xeb, 0xbd, 0x63, 0xf3, 0xb4, 0xfe, 0x60, 0xeb, 0x8c, 0xac, + 0xd7, 0xeb, 0x78, 0xdf, 0x26, 0xae, 0xd7, 0x57, 0x58, 0xaf, 0x77, 0x02, + 0xeb, 0xf5, 0xee, 0x31, 0x78, 0x62, 0xef, 0xd4, 0x7a, 0x37, 0xce, 0x2c, + 0x77, 0x55, 0xcf, 0x8e, 0xb3, 0xde, 0x3b, 0xb1, 0x4f, 0xeb, 0x0f, 0xb6, + 0x8e, 0xbb, 0x53, 0xfb, 0x46, 0xa7, 0x9b, 0x74, 0x81, 0x09, 0xae, 0x2d, + 0x83, 0x03, 0xa5, 0xab, 0x9a, 0x6e, 0x52, 0xb8, 0x16, 0xb6, 0x17, 0xfb, + 0xeb, 0x1b, 0xdf, 0x57, 0xf6, 0x0e, 0xb6, 0xa4, 0xdd, 0x77, 0x5f, 0x2a, + 0x4c, 0x6c, 0xfb, 0x2b, 0x7b, 0x07, 0x69, 0x7d, 0x76, 0x5f, 0xee, 0xd7, + 0xcd, 0x52, 0x8e, 0xcd, 0xc5, 0xfe, 0xfa, 0xfa, 0xc7, 0x7a, 0xbd, 0xfb, + 0xf0, 0x99, 0x6b, 0xf7, 0xe0, 0xd8, 0xec, 0xc6, 0xf7, 0xa7, 0x5b, 0xb4, + 0x4d, 0x7c, 0xe7, 0xa5, 0xc2, 0xc4, 0xb6, 0xff, 0x74, 0xef, 0x20, 0xad, + 0xcf, 0xfe, 0x1f, 0xf8, 0x75, 0xb3, 0x94, 0x63, 0x7d, 0xd8, 0x86, 0xc3, + 0xe1, 0x38, 0x7c, 0xf7, 0xe0, 0x77, 0xae, 0xdd, 0xe3, 0x2d, 0x83, 0x43, + 0x7a, 0x4b, 0xf2, 0x9e, 0xad, 0x67, 0x7b, 0xec, 0x4f, 0x27, 0x8d, 0x06, + 0x70, 0x65, 0x43, 0xb9, 0x70, 0x6d, 0x60, 0x1b, 0xbe, 0x3b, 0x70, 0xfe, + 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, + 0xb3, 0x11, 0xaa, 0x05, 0x00, 0x00, 0x36, 0x6c, 0xd2, 0x1d, 0x1f, 0xfd, + 0x93, 0xd6, 0xa6, 0x8d, 0x1f, 0x86, 0xe1, 0xe8, 0xdd, 0x26, 0x93, 0xe1, + 0xf5, 0x9c, 0x28, 0x87, 0x8d, 0x2b, 0x3c, 0xda, 0x1e, 0x79, 0x1c, 0x37, + 0xce, 0xa4, 0xfa, 0xf5, 0x9a, 0x74, 0x41, 0xd8, 0x2c, 0xfd, 0xc1, 0xd6, + 0xd9, 0xb4, 0xf5, 0x7a, 0x7e, 0xcc, 0x7a, 0xbd, 0xce, 0x8b, 0x07, 0xb1, + 0x31, 0xac, 0xd7, 0xbb, 0x47, 0xe1, 0xd8, 0xa5, 0x91, 0xc7, 0x71, 0xe3, + 0x4c, 0xaa, 0x5f, 0xaf, 0x49, 0x17, 0xff, 0xcd, 0xd2, 0x1f, 0x6c, 0x9d, + 0x49, 0x17, 0x86, 0x4c, 0xba, 0xe8, 0xc4, 0xbf, 0x23, 0x3b, 0xae, 0x0f, + 0x93, 0x42, 0xb1, 0x26, 0x05, 0x6e, 0xb9, 0xe9, 0x36, 0x1a, 0xca, 0x85, + 0xcd, 0xc5, 0xfe, 0xfa, 0xc6, 0xf7, 0xee, 0x4b, 0x85, 0x91, 0xc7, 0x3c, + 0x57, 0x13, 0x76, 0x33, 0xa9, 0xdd, 0x77, 0x5f, 0x2a, 0xac, 0xa9, 0xcf, + 0x2b, 0x9b, 0x54, 0x8e, 0xad, 0xc1, 0xfe, 0xfa, 0xfa, 0xc6, 0x7a, 0xbd, + 0xfb, 0xf0, 0x99, 0x6b, 0xf7, 0xe0, 0xd8, 0xec, 0xc6, 0xf7, 0xce, 0x64, + 0xbb, 0xf8, 0xce, 0x09, 0xdb, 0xc7, 0xab, 0x09, 0xb1, 0x9a, 0xd4, 0xee, + 0x3b, 0x2f, 0x15, 0xd6, 0xd4, 0xe7, 0x95, 0x4d, 0x2a, 0xc7, 0xfa, 0xb1, + 0x0d, 0x87, 0x8f, 0xe3, 0xf0, 0xdd, 0x83, 0xdf, 0xb9, 0x76, 0x8f, 0xbf, + 0x28, 0x9c, 0x1b, 0x1b, 0x7e, 0xf5, 0x96, 0x9c, 0xf7, 0x7a, 0xdc, 0xf8, + 0xf3, 0xf3, 0xf3, 0x23, 0xe5, 0x6e, 0x78, 0xbd, 0xc1, 0x89, 0xd8, 0x3a, + 0x6c, 0xc3, 0x77, 0x07, 0xce, 0x3f, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x6c, 0x36, 0x42, 0xb5, 0x00, 0x00, 0xc0, + 0x86, 0xb9, 0x3b, 0x3e, 0x06, 0x83, 0x43, 0x8a, 0xe3, 0x78, 0xa4, 0x2e, + 0xef, 0xe4, 0xb5, 0xec, 0x1d, 0x22, 0x7d, 0xd9, 0x13, 0xd8, 0xdc, 0xf3, + 0x38, 0x8e, 0xb9, 0x7a, 0x64, 0x1b, 0x4c, 0xbb, 0x38, 0x6b, 0xf0, 0x64, + 0x2d, 0xfd, 0x8b, 0x57, 0xe2, 0x35, 0x75, 0xd9, 0x36, 0xa2, 0x5f, 0x0f, + 0x47, 0xea, 0xdd, 0x34, 0xd9, 0xf9, 0x8c, 0x9b, 0x2f, 0x17, 0x8b, 0xed, + 0x9c, 0x91, 0xf5, 0x7a, 0xe5, 0x2a, 0xd7, 0xeb, 0xcc, 0x85, 0x05, 0xee, + 0x79, 0xbc, 0xc2, 0x7a, 0xbd, 0x1d, 0x58, 0xaf, 0x77, 0x8f, 0x69, 0x17, + 0xe2, 0x0d, 0x9e, 0xd8, 0x9b, 0xfe, 0xad, 0xac, 0xac, 0xac, 0xa9, 0xcb, + 0xb6, 0x71, 0xe5, 0x78, 0x38, 0x52, 0xef, 0xa6, 0xc9, 0xce, 0x67, 0xdc, + 0x7c, 0xb9, 0x30, 0xf0, 0xda, 0xb4, 0xd1, 0x3b, 0xb1, 0x73, 0x27, 0xf7, + 0xeb, 0xcf, 0xa4, 0xc0, 0xad, 0x49, 0x5c, 0xd0, 0xd6, 0x46, 0xa7, 0xc7, + 0xc6, 0xb0, 0xbf, 0xbe, 0xf1, 0x4d, 0x0b, 0xb5, 0x99, 0x25, 0x98, 0x67, + 0xdc, 0x38, 0x93, 0x2e, 0xee, 0xfc, 0xca, 0xde, 0x41, 0xfa, 0xe7, 0xf6, + 0xe5, 0xee, 0xf9, 0xb8, 0x71, 0xb1, 0xf3, 0xd8, 0x5f, 0x5f, 0x1f, 0x58, + 0xaf, 0x77, 0x1f, 0x3e, 0x73, 0xed, 0x1e, 0x1c, 0x9b, 0xdd, 0xf8, 0xa6, + 0x85, 0x55, 0xcd, 0x12, 0xb8, 0x35, 0x6e, 0x9c, 0x49, 0x21, 0x2b, 0x7f, + 0xba, 0x77, 0x90, 0xfe, 0xb9, 0xff, 0x03, 0xf7, 0x7c, 0xdc, 0xb8, 0xd8, + 0x1c, 0x6c, 0xc3, 0x31, 0x0b, 0x8e, 0xc3, 0x6f, 0x2c, 0xfc, 0xce, 0xb5, + 0x7b, 0xbc, 0x65, 0x70, 0x28, 0xfd, 0xcb, 0x6e, 0xc3, 0xf3, 0xc2, 0xb3, + 0xdc, 0xb8, 0x79, 0xb2, 0x9f, 0xc5, 0xdc, 0xf3, 0x95, 0x95, 0x15, 0xde, + 0xeb, 0x6b, 0x1c, 0xdb, 0xf0, 0x1b, 0x07, 0xe7, 0x1f, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x76, + 0x54, 0x18, 0x86, 0x03, 0x49, 0xb9, 0x7f, 0x1b, 0xa9, 0x4b, 0xca, 0xd7, + 0xb4, 0xeb, 0xca, 0xb1, 0x35, 0xc2, 0xf9, 0xcc, 0xf2, 0x9e, 0x0f, 0x07, + 0x79, 0x65, 0x1a, 0xf7, 0x7e, 0x8e, 0xa9, 0xcb, 0x6b, 0x67, 0x5a, 0xdd, + 0xb8, 0x79, 0x8f, 0xe9, 0x0f, 0xb6, 0xc0, 0x46, 0xde, 0xeb, 0x49, 0x75, + 0xee, 0xbd, 0xe2, 0x3d, 0xdc, 0x5e, 0xac, 0xd7, 0xbb, 0xc7, 0xfc, 0xfc, + 0xfc, 0xc8, 0x72, 0x9c, 0x9f, 0x9f, 0x1f, 0xe4, 0x95, 0x69, 0xcc, 0x7b, + 0x3d, 0xae, 0x2e, 0xaf, 0x9d, 0x69, 0x75, 0xe3, 0xe6, 0x3d, 0xa6, 0x3f, + 0xd8, 0x02, 0x9b, 0x7d, 0x6c, 0x36, 0xa9, 0x2e, 0x0c, 0x43, 0x8e, 0xd1, + 0x76, 0x90, 0xdd, 0x66, 0xd6, 0x72, 0xff, 0x36, 0xbb, 0xce, 0xdb, 0x66, + 0x63, 0x93, 0xb1, 0xbf, 0xbe, 0xf1, 0x6d, 0xe7, 0x7e, 0x7a, 0xb3, 0xda, + 0x9d, 0x50, 0x8e, 0x4d, 0xb2, 0xd9, 0x9f, 0xb9, 0x26, 0xd5, 0xb1, 0x0d, + 0xdf, 0x7c, 0xac, 0xd7, 0xbb, 0x0f, 0x9f, 0xb9, 0x76, 0x0f, 0x8e, 0xcd, + 0x6e, 0x7c, 0xdb, 0xf9, 0x1e, 0x6f, 0x56, 0xbb, 0x13, 0xca, 0x31, 0x03, + 0xb6, 0xe1, 0xf0, 0xf1, 0xbd, 0xd9, 0xee, 0xc1, 0xef, 0x5c, 0xbb, 0xc7, + 0x46, 0xb6, 0xe1, 0x93, 0xea, 0xdc, 0x36, 0x98, 0x6d, 0xf3, 0xb5, 0x87, + 0x6d, 0xf8, 0xee, 0xc0, 0xf9, 0x47, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0xad, 0xc4, 0x9d, 0x97, 0x00, 0x00, 0xc0, + 0xba, 0x6c, 0xc5, 0xc9, 0x66, 0x71, 0x1c, 0x17, 0xf2, 0xda, 0xe5, 0x2e, + 0x91, 0x5b, 0xe7, 0x7a, 0x3d, 0xe9, 0x9b, 0x3b, 0x3f, 0x6f, 0x8d, 0xad, + 0xf8, 0x7f, 0x88, 0x57, 0xe2, 0x42, 0x5e, 0xbb, 0xbc, 0x87, 0x5b, 0x87, + 0xf5, 0x7a, 0xf7, 0xb8, 0x5e, 0x2f, 0xe6, 0xe0, 0x8e, 0xee, 0x5b, 0x63, + 0xbb, 0x2f, 0x04, 0xe0, 0xf8, 0x6c, 0xe7, 0x6c, 0xf7, 0x76, 0x9e, 0xed, + 0xf3, 0xd6, 0x60, 0x7f, 0x7d, 0xe3, 0xbb, 0x5e, 0xf7, 0xd3, 0x79, 0xd8, + 0x77, 0x6f, 0x1e, 0xb6, 0xe1, 0xd7, 0x37, 0xd6, 0xeb, 0xdd, 0xe7, 0x7a, + 0x7d, 0xcf, 0x79, 0x7f, 0xd7, 0x8f, 0x63, 0xb3, 0x1b, 0xdf, 0xf5, 0xfa, + 0x1e, 0xe7, 0xe1, 0x7d, 0x9f, 0x0d, 0xdb, 0x70, 0xf8, 0xf8, 0xde, 0x6c, + 0xf7, 0xe0, 0x77, 0xae, 0xdd, 0x63, 0x2b, 0xb6, 0xf3, 0x2b, 0x2b, 0x2b, + 0x85, 0xbc, 0x76, 0xd9, 0x36, 0xef, 0x2c, 0xb6, 0xe1, 0xbb, 0x03, 0xe7, + 0x1f, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0xcd, 0x56, 0xd8, 0xe9, 0x0e, 0x00, 0x00, 0xb0, 0x1b, 0x0d, 0x06, + 0x83, 0x81, 0x1b, 0x2e, 0x14, 0x0a, 0x85, 0x49, 0xe5, 0x7e, 0xd9, 0xac, + 0x75, 0x53, 0xdb, 0xb9, 0x7b, 0xff, 0x70, 0xfc, 0x0b, 0xcd, 0xe1, 0xfc, + 0x0f, 0x34, 0x06, 0xd9, 0x72, 0xbf, 0x6c, 0xd6, 0xba, 0x69, 0xed, 0xf8, + 0xf3, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x36, 0xc3, 0x4d, 0x3b, 0xdd, 0x01, 0x00, 0x00, 0x76, 0x3b, + 0x17, 0x76, 0x95, 0x17, 0x90, 0x95, 0x57, 0x36, 0xa9, 0x7c, 0x43, 0xf3, + 0x4f, 0xc2, 0xae, 0xf2, 0x02, 0xb2, 0xf2, 0xca, 0x26, 0x95, 0x03, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3b, + 0x85, 0x50, 0x2d, 0x00, 0x00, 0xae, 0x01, 0xb3, 0x84, 0x64, 0x15, 0x0a, + 0x85, 0xc2, 0xb4, 0xb2, 0xbc, 0x71, 0x66, 0x69, 0x7b, 0x96, 0x90, 0xac, + 0xc2, 0x85, 0xe6, 0xda, 0xf9, 0x67, 0xca, 0xf2, 0xc6, 0x21, 0x80, 0x0b, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xdb, 0x81, 0x50, 0x2d, 0x00, 0x00, 0x76, 0x81, 0x59, 0x82, 0xb5, 0xb6, + 0x74, 0xfe, 0x04, 0x6b, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x60, 0x8b, 0x11, 0xaa, 0x05, 0x00, 0xc0, 0x0e, + 0x2b, 0x14, 0x0a, 0x05, 0xff, 0x71, 0x9c, 0xad, 0x0a, 0xc6, 0x2a, 0x5c, + 0x68, 0x16, 0xfc, 0xc7, 0xb1, 0xf3, 0x27, 0x18, 0x0b, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd7, 0x30, 0x42, + 0xb5, 0x00, 0x00, 0xb8, 0x06, 0x4c, 0x0b, 0xd4, 0xda, 0xea, 0xb6, 0xa7, + 0x05, 0x6a, 0x5d, 0xd5, 0xfc, 0xb7, 0xb0, 0x6d, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x21, 0x54, 0x0b, + 0x00, 0x80, 0xeb, 0x44, 0x5e, 0x38, 0xd6, 0x60, 0x30, 0x18, 0x4c, 0x7a, + 0x3e, 0x69, 0xda, 0x75, 0xcf, 0x3f, 0x27, 0x1c, 0x6b, 0x70, 0xa0, 0x31, + 0x98, 0xf4, 0x7c, 0xd2, 0xb4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x66, 0x22, 0x54, 0x0b, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xd7, 0xbd, 0xc2, 0x4e, 0x77, 0x00, 0x00, 0x80, 0xdd, 0x6a, 0x30, + 0x18, 0x0c, 0xb2, 0x65, 0x85, 0x42, 0xa1, 0x30, 0xae, 0x6e, 0x96, 0x7a, + 0x37, 0xce, 0x7a, 0xdb, 0xce, 0xab, 0x9b, 0xb5, 0x6c, 0xcd, 0xbc, 0x0f, + 0x34, 0xd6, 0xb6, 0x7f, 0xa1, 0x69, 0xa7, 0xcb, 0xa9, 0x9b, 0xa5, 0xde, + 0x8d, 0xb3, 0xde, 0xb6, 0xf3, 0xea, 0x66, 0x2d, 0xcb, 0x6b, 0x07, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd7, + 0xae, 0x9b, 0x76, 0xba, 0x03, 0x00, 0x00, 0xec, 0x46, 0xe3, 0x42, 0xa9, + 0x26, 0x85, 0x65, 0xcd, 0x52, 0xbf, 0x55, 0xf3, 0x9d, 0x75, 0xdc, 0x71, + 0xa1, 0x54, 0x93, 0xc2, 0xb2, 0x66, 0xa9, 0x9f, 0xda, 0xa7, 0x0d, 0xce, + 0x77, 0x33, 0xfb, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x80, 0x9d, 0x45, 0xa8, 0x16, 0x00, 0x00, 0x3b, 0xac, + 0x50, 0x28, 0x14, 0xd6, 0x5b, 0x5f, 0x48, 0x8c, 0x2b, 0xcb, 0xab, 0x5b, + 0xef, 0x7c, 0x67, 0x09, 0xda, 0x2a, 0x64, 0x8c, 0xd4, 0x5d, 0x68, 0x4e, + 0x7e, 0x5d, 0x39, 0xf5, 0x85, 0x0b, 0xcd, 0x42, 0xb6, 0xdc, 0x2f, 0xcb, + 0xab, 0x9b, 0xa5, 0x5d, 0xdf, 0x2c, 0xe1, 0x59, 0x6e, 0x9e, 0x79, 0xfd, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xc0, 0xb5, 0xa9, 0xb8, 0xd3, 0x1d, 0x00, 0x00, 0x00, 0xd7, 0xae, 0x69, + 0xc1, 0x5a, 0x7e, 0xfd, 0xb4, 0x90, 0xae, 0x6b, 0xc9, 0xb4, 0x60, 0x2d, + 0xbf, 0x9e, 0x50, 0x2d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x80, 0xeb, 0xc3, 0x4d, 0x3b, 0xdd, 0x01, 0x00, 0x00, + 0x30, 0xd9, 0xb4, 0x60, 0xab, 0xed, 0x36, 0x2e, 0x3c, 0x6b, 0xbd, 0xfd, + 0x9c, 0x16, 0x6c, 0xb5, 0xdd, 0xc6, 0x85, 0x67, 0x5d, 0x6b, 0xfd, 0x04, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, + 0x3e, 0x42, 0xb5, 0x00, 0x00, 0xb8, 0x8e, 0x8c, 0x0b, 0xb4, 0xda, 0xee, + 0x79, 0x15, 0x3c, 0x9b, 0x32, 0xaf, 0x31, 0x81, 0x56, 0x5b, 0x61, 0xd2, + 0xbc, 0x0a, 0x17, 0x9a, 0x05, 0xf7, 0xb7, 0x5d, 0xfd, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xe6, 0x28, + 0xee, 0x74, 0x07, 0x00, 0x00, 0xd8, 0xed, 0x06, 0x83, 0xc1, 0x60, 0x52, + 0xfd, 0x46, 0x82, 0xab, 0xb2, 0x6d, 0x0e, 0x06, 0x83, 0x41, 0xb6, 0x9d, + 0x69, 0xf3, 0x75, 0xf3, 0xce, 0x6b, 0x6b, 0xa6, 0x3e, 0x1c, 0x68, 0x4c, + 0x7e, 0x5d, 0x1b, 0x08, 0xae, 0xca, 0xb6, 0x39, 0x38, 0xd0, 0x18, 0x64, + 0xdb, 0x99, 0x36, 0x5f, 0x37, 0xef, 0xbc, 0xb6, 0xd6, 0xdb, 0x1f, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5c, + 0x3b, 0x6e, 0xda, 0xe9, 0x0e, 0x00, 0x00, 0xb0, 0x1b, 0x8d, 0x0b, 0xca, + 0xda, 0x48, 0x80, 0xd6, 0xb5, 0x32, 0xdf, 0x42, 0xa1, 0x50, 0x18, 0x17, + 0x94, 0xb5, 0x91, 0x00, 0xad, 0x75, 0xcd, 0x7b, 0x0b, 0xe7, 0xbb, 0xd5, + 0x7d, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xc0, 0xe6, 0x28, 0xee, 0x74, 0x07, 0x00, 0x00, 0xd8, 0x8d, 0x06, + 0x83, 0xc1, 0x60, 0xab, 0xa6, 0xf7, 0xeb, 0x0a, 0x85, 0x42, 0xc1, 0x3d, + 0x1f, 0x0c, 0x06, 0x83, 0x71, 0xe1, 0x59, 0x79, 0x75, 0xd9, 0x76, 0xa6, + 0xf6, 0xe9, 0x40, 0x23, 0xb7, 0x4f, 0x2e, 0x94, 0xca, 0xaf, 0xcf, 0x0b, + 0xaa, 0xca, 0x9b, 0x7e, 0xdc, 0xb4, 0xd9, 0x71, 0xc7, 0xcd, 0x3b, 0xaf, + 0xce, 0x3d, 0xf7, 0xfb, 0x30, 0xad, 0xef, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb8, 0xf6, 0xdd, 0xb4, 0xd3, + 0x1d, 0x00, 0x00, 0x00, 0x43, 0xb3, 0x84, 0x6d, 0x8d, 0x1b, 0xe7, 0x6a, + 0x83, 0xba, 0x66, 0x99, 0xe7, 0x46, 0xe6, 0x31, 0x29, 0xf0, 0x6a, 0xda, + 0x38, 0xb3, 0x4c, 0xbb, 0x51, 0xae, 0xed, 0xad, 0x9c, 0x07, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb6, 0x4f, + 0x71, 0xa7, 0x3b, 0x00, 0x00, 0xc0, 0x6e, 0x57, 0x28, 0x14, 0x0a, 0x1b, + 0x0d, 0xc4, 0xba, 0x9a, 0x69, 0xdd, 0xf4, 0x1b, 0x6d, 0x3b, 0x3b, 0xad, + 0x1f, 0x4e, 0x55, 0xb8, 0xd0, 0x2c, 0x6c, 0x34, 0xac, 0xea, 0x6a, 0xa6, + 0x75, 0xd3, 0x6f, 0xb4, 0xed, 0x49, 0xd3, 0x02, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0xda, 0x46, 0xa8, 0x16, + 0x00, 0x00, 0x37, 0xb0, 0x69, 0x81, 0x5b, 0x7e, 0xfd, 0xa4, 0x80, 0xad, + 0xcd, 0x9e, 0xf6, 0x6a, 0x4c, 0x0b, 0xdc, 0xca, 0x86, 0x7b, 0x6d, 0xb4, + 0x6d, 0x02, 0xb6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xae, 0x2f, 0x37, 0xed, 0x74, 0x07, 0x00, 0x00, 0xd8, + 0xed, 0xa6, 0x05, 0x5f, 0xad, 0x77, 0xda, 0xcd, 0x0a, 0xb8, 0x5a, 0x4f, + 0xdb, 0xd9, 0x71, 0xa7, 0x05, 0x5f, 0x4d, 0x9c, 0x6f, 0xce, 0xb4, 0x9b, + 0x15, 0x70, 0xb5, 0x9e, 0xb6, 0xaf, 0xe6, 0x35, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0xfb, 0x15, 0x77, + 0xba, 0x03, 0x00, 0x00, 0x60, 0x68, 0xb3, 0x02, 0xb1, 0xfc, 0x76, 0x26, + 0x85, 0x76, 0xcd, 0x3a, 0x3f, 0x7f, 0xbc, 0x59, 0xdb, 0x4e, 0xc7, 0xdf, + 0xa4, 0x40, 0x2c, 0xbf, 0x9d, 0x49, 0x81, 0x57, 0xb3, 0xce, 0xcf, 0x1f, + 0x6f, 0xd6, 0xb6, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x70, 0xed, 0x22, 0x54, 0x0b, 0x00, 0x80, 0x1d, 0x36, + 0x2d, 0xd8, 0xca, 0x0f, 0xae, 0xca, 0x8e, 0x5b, 0x28, 0x14, 0x0a, 0x79, + 0xc1, 0x56, 0xb3, 0x84, 0x5d, 0xad, 0xa7, 0xed, 0xc1, 0x60, 0x30, 0x18, + 0x37, 0xaf, 0x3c, 0xd3, 0x82, 0xad, 0xfc, 0xe0, 0xaa, 0xec, 0xb8, 0x85, + 0x0b, 0xcd, 0x42, 0x5e, 0xb0, 0xd5, 0xac, 0x61, 0x57, 0xb3, 0xb6, 0x3d, + 0x38, 0xd0, 0x18, 0x8c, 0x9b, 0x17, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xae, 0x3f, 0x37, 0xed, 0x74, 0x07, + 0x00, 0x00, 0xc0, 0xf6, 0x98, 0x16, 0xde, 0x75, 0xad, 0xb6, 0x3d, 0x71, + 0xbe, 0x53, 0xc2, 0xbb, 0xae, 0xd5, 0xb6, 0x01, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb0, 0xf9, 0x08, 0x8b, 0x00, + 0x00, 0x60, 0x07, 0x0c, 0x06, 0x83, 0x41, 0xb6, 0xac, 0x50, 0x28, 0x14, + 0xfc, 0x72, 0x17, 0x54, 0x95, 0x2d, 0xcb, 0x9b, 0x76, 0xdc, 0xf8, 0x23, + 0xd3, 0x1d, 0x68, 0xac, 0x2d, 0xbf, 0xd0, 0x1c, 0x29, 0x77, 0x41, 0x52, + 0xd9, 0xb2, 0xbc, 0x69, 0xc7, 0x8d, 0x9f, 0xad, 0x03, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb6, 0xc3, 0x4d, + 0x3b, 0xdd, 0x01, 0x00, 0x00, 0xb0, 0x79, 0xc6, 0x05, 0x6e, 0x8d, 0x2b, + 0xdf, 0x94, 0x79, 0x8e, 0x09, 0xdc, 0x1a, 0x57, 0x0e, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6c, 0x05, 0x42, + 0xb5, 0x00, 0x00, 0xd8, 0x01, 0x85, 0x42, 0xa1, 0x30, 0xe9, 0xb9, 0x34, + 0x5b, 0x10, 0x56, 0xc1, 0x33, 0x75, 0x1e, 0x17, 0x9a, 0x13, 0x9f, 0x4b, + 0xb3, 0x05, 0x61, 0x15, 0x2e, 0x34, 0x0b, 0xee, 0x2f, 0xaf, 0x6e, 0xda, + 0xf4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xc0, 0x56, 0x28, 0xee, 0x74, 0x07, 0x00, 0x00, 0xc0, 0x78, 0xd3, + 0x82, 0xb5, 0xfc, 0xfa, 0xbc, 0x60, 0xad, 0x0d, 0xcd, 0x73, 0x4a, 0xb0, + 0x96, 0x5f, 0x4f, 0x88, 0x16, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xae, 0x15, 0x37, 0xed, 0x74, 0x07, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x80, 0xab, 0x55, 0xdc, 0xe9, 0x0e, 0x00, 0x00, 0x80, 0x7c, + 0x85, 0x42, 0xa1, 0x30, 0x18, 0x0c, 0x06, 0xd3, 0xc6, 0xd9, 0xd4, 0x79, + 0x5e, 0x68, 0x16, 0x06, 0x07, 0x1a, 0x93, 0xe7, 0x79, 0xa1, 0xb9, 0xa9, + 0xf3, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x36, 0xc3, 0x4d, 0x3b, 0xdd, 0x01, 0x00, 0x00, 0x76, 0xa3, + 0x6c, 0x58, 0xd6, 0xb8, 0xf0, 0xac, 0xab, 0x09, 0xcd, 0x5a, 0x33, 0x8f, + 0x4c, 0x58, 0xd6, 0xb8, 0xf0, 0xac, 0xab, 0x09, 0xcd, 0x9a, 0x16, 0xc8, + 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x6c, 0x15, 0x42, 0xb5, 0x00, 0x00, 0xb8, 0x81, 0x8c, 0x0b, 0xe1, + 0xba, 0x9a, 0x70, 0xae, 0xa9, 0xf3, 0x1c, 0x13, 0xc2, 0x75, 0x35, 0xe1, + 0x5c, 0x00, 0x00, 0xe0, 0xff, 0x6f, 0xe7, 0x0e, 0x5e, 0xdb, 0x38, 0xd3, + 0x00, 0x0e, 0x8f, 0x8c, 0x5d, 0x8c, 0x11, 0x18, 0xa7, 0x97, 0xc4, 0x87, + 0xa4, 0x60, 0xdc, 0x43, 0xf0, 0xd5, 0xe0, 0x3f, 0x61, 0xf7, 0x2f, 0xde, + 0xbd, 0xef, 0x25, 0x90, 0xab, 0xe9, 0xa1, 0x21, 0xd0, 0xf6, 0xe0, 0xf6, + 0xd2, 0x86, 0x80, 0x09, 0xa1, 0x3e, 0x68, 0x0f, 0x13, 0x15, 0x45, 0x9e, + 0xef, 0x9d, 0x91, 0x34, 0x5f, 0xc6, 0xaf, 0xfd, 0x3c, 0xb0, 0xd0, 0x8e, + 0xa4, 0x57, 0x3f, 0x4b, 0x63, 0xd9, 0x5a, 0xb9, 0x2f, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb0, + 0x29, 0xcb, 0x2e, 0x00, 0x60, 0x22, 0x8b, 0xc5, 0x62, 0xb1, 0xfc, 0xe7, + 0x2f, 0x3b, 0xaf, 0x66, 0x5d, 0x97, 0x0d, 0xbd, 0xce, 0xea, 0xe5, 0xd1, + 0x65, 0x43, 0xe6, 0x8f, 0x75, 0xff, 0xb3, 0xd9, 0xac, 0x59, 0x5e, 0x6d, + 0x93, 0xdb, 0xaf, 0x5a, 0x9d, 0xb5, 0xcd, 0xfc, 0xae, 0xb9, 0x7d, 0x33, + 0x9b, 0xa6, 0x99, 0x0d, 0xfd, 0xf7, 0x21, 0x5f, 0x5b, 0xdf, 0x75, 0xc6, + 0x7e, 0xfe, 0xfb, 0x2e, 0xef, 0x7b, 0xfc, 0x36, 0xb9, 0xbc, 0x74, 0x2c, + 0x9a, 0xb1, 0xc9, 0x63, 0x5b, 0xfa, 0xfa, 0x76, 0x15, 0x9d, 0x1f, 0xab, + 0x97, 0x97, 0xae, 0x53, 0xfb, 0xfc, 0xdf, 0xe4, 0xfb, 0x7b, 0xd3, 0xcb, + 0x37, 0xbd, 0xff, 0x6d, 0x1e, 0xfb, 0xa1, 0x8f, 0xef, 0x90, 0xd9, 0x8b, + 0xc5, 0x62, 0xd1, 0xd5, 0x17, 0xdd, 0xb6, 0xeb, 0x9c, 0xda, 0xe4, 0xfc, + 0xda, 0xe5, 0xfb, 0xb3, 0xc6, 0xf3, 0xb3, 0xfe, 0xb5, 0x0c, 0x99, 0xbf, + 0x3c, 0xff, 0xd6, 0xcf, 0xc3, 0xf5, 0x9b, 0x0f, 0x79, 0xed, 0x2c, 0x9d, + 0xd3, 0xd1, 0xfc, 0xe8, 0xfc, 0xef, 0xfa, 0x1a, 0x4b, 0xaf, 0x07, 0x7d, + 0xf7, 0xdf, 0xf7, 0xf8, 0x4d, 0xf5, 0xf3, 0xaf, 0xef, 0xb6, 0xdb, 0xbe, + 0x3e, 0x8c, 0xf9, 0xfa, 0x3d, 0xe4, 0xf2, 0xbe, 0xe7, 0x37, 0x3a, 0xbf, + 0xb6, 0xf9, 0xf9, 0x1b, 0x9d, 0x33, 0xeb, 0x8f, 0x4d, 0x69, 0x7e, 0x74, + 0x9e, 0x7f, 0x8b, 0x9f, 0x2f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4c, 0x6b, 0x6f, 0xea, 0x00, + 0x00, 0x78, 0x8a, 0xd6, 0x96, 0x4a, 0x2c, 0x97, 0x3f, 0x94, 0x16, 0x3d, + 0x84, 0xb7, 0x5f, 0xfe, 0xaf, 0xcb, 0x90, 0xf9, 0x7d, 0xb7, 0xef, 0xba, + 0x7c, 0xe8, 0xfd, 0x47, 0x56, 0x6f, 0xb3, 0xcd, 0xed, 0x4b, 0xb3, 0x36, + 0xb1, 0x7c, 0x5c, 0xba, 0x96, 0x6c, 0xac, 0x5f, 0x67, 0xed, 0xd8, 0xe0, + 0xe7, 0xaf, 0xab, 0x6d, 0xd7, 0xe7, 0x7f, 0xc8, 0x7d, 0x8c, 0xf9, 0xf8, + 0x46, 0xbe, 0x7c, 0x2d, 0xc5, 0xf6, 0xb5, 0x05, 0x29, 0x83, 0x6c, 0x7b, + 0x4e, 0x0d, 0x15, 0x3d, 0xdf, 0x5d, 0x0d, 0x5d, 0xcf, 0xcf, 0x58, 0x8d, + 0xdb, 0x7c, 0x7f, 0x0d, 0xfd, 0xbe, 0x1b, 0xf2, 0xfa, 0x31, 0xe4, 0xf2, + 0xd2, 0xf9, 0xb9, 0xcd, 0x7d, 0x6f, 0x6a, 0x65, 0x19, 0xd6, 0xbd, 0xf9, + 0xa5, 0xae, 0xf5, 0xdb, 0x74, 0xcd, 0x88, 0x1e, 0xbf, 0x4d, 0xbf, 0xbf, + 0xfb, 0x5e, 0x7f, 0x4b, 0x86, 0x3c, 0x8f, 0x7d, 0x97, 0x6d, 0x73, 0x1e, + 0x6e, 0x7a, 0x9b, 0xe8, 0xfb, 0xa5, 0x6b, 0x79, 0x51, 0xd7, 0x75, 0x4a, + 0x33, 0xa3, 0x8e, 0x21, 0xaf, 0xcf, 0x85, 0xdb, 0x8d, 0xf2, 0xfa, 0x3a, + 0xe4, 0xf5, 0xbb, 0xf4, 0xfd, 0x39, 0xf4, 0x3e, 0xba, 0xac, 0x9f, 0xaf, + 0xeb, 0xe7, 0xfa, 0x2e, 0xaf, 0xad, 0xdf, 0x42, 0xed, 0x9e, 0xbe, 0xd7, + 0xe6, 0x52, 0xcf, 0xfa, 0x75, 0xfb, 0x3a, 0x4b, 0x3f, 0xdb, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x78, 0xf8, 0xf6, 0xa7, 0x0e, 0x00, 0x00, 0xca, 0x06, 0x2e, 0xcd, 0xd8, + 0x7a, 0x83, 0xc5, 0xda, 0xfc, 0x7b, 0x73, 0x56, 0x77, 0x99, 0x04, 0x0b, + 0x68, 0x8a, 0x97, 0xf7, 0xec, 0x42, 0x99, 0x35, 0x5f, 0x2f, 0xac, 0xd8, + 0xf8, 0xeb, 0x58, 0x9b, 0xbf, 0xd5, 0xe3, 0x30, 0x64, 0x21, 0xcc, 0x86, + 0x3b, 0x5d, 0x06, 0xcf, 0x1e, 0x7a, 0xfb, 0x01, 0x8b, 0x67, 0xba, 0xae, + 0xb3, 0xf3, 0xe3, 0xbb, 0xa3, 0xf5, 0xfb, 0xff, 0xa7, 0x61, 0xf9, 0x98, + 0x76, 0x2d, 0x8a, 0x59, 0x5e, 0x6f, 0x75, 0x91, 0x4e, 0xb4, 0xd8, 0x66, + 0xe5, 0xf2, 0xc1, 0x5f, 0xdf, 0x90, 0xe7, 0x74, 0xc8, 0xde, 0xad, 0xbe, + 0x65, 0x3f, 0x43, 0x9e, 0xff, 0xa1, 0xdf, 0x3f, 0xeb, 0x8f, 0xcf, 0x97, + 0xcb, 0x3b, 0x17, 0x13, 0xad, 0x3d, 0xbe, 0xbd, 0xdf, 0xbb, 0x95, 0xcc, + 0x66, 0xb3, 0x59, 0xb8, 0x8c, 0x69, 0xd3, 0x79, 0x1d, 0xff, 0x1e, 0x2e, + 0xc3, 0x5b, 0x3e, 0x0e, 0x2b, 0xf7, 0xf5, 0xcf, 0xf9, 0xb7, 0xbc, 0xce, + 0x96, 0x2d, 0x5f, 0xdd, 0xbe, 0x34, 0x63, 0xaa, 0xd7, 0xef, 0xf5, 0xe7, + 0xbf, 0xa3, 0x63, 0x56, 0x3a, 0x77, 0x3a, 0xee, 0x63, 0x11, 0x7d, 0xbf, + 0xac, 0x3e, 0xce, 0xa5, 0xbe, 0xe5, 0x7d, 0xf6, 0x7f, 0x45, 0xdd, 0xf3, + 0xb7, 0xb9, 0x6c, 0x0c, 0x03, 0xe7, 0x77, 0x7d, 0x5d, 0xe1, 0x6b, 0xef, + 0xfa, 0xf3, 0xb3, 0x85, 0xe2, 0x6b, 0xeb, 0xa0, 0x1b, 0xef, 0x7e, 0xff, + 0xbd, 0x77, 0xd1, 0x7c, 0xe9, 0xeb, 0x78, 0x8d, 0xff, 0xa7, 0x73, 0x79, + 0x59, 0xcf, 0xeb, 0x53, 0xd7, 0x6d, 0x77, 0x7a, 0xed, 0x1d, 0xf2, 0xf5, + 0x2f, 0xe7, 0x7f, 0x39, 0xbf, 0x17, 0xcd, 0x0e, 0xdf, 0xa7, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x7c, 0x7b, 0x7b, 0x53, 0x07, 0x00, 0xc0, 0x53, 0x36, 0x64, 0xa1, 0xd3, + 0x90, 0xeb, 0x6d, 0x6b, 0x36, 0x9b, 0x85, 0x4b, 0x55, 0x96, 0x97, 0x6f, + 0xbb, 0x74, 0x66, 0x87, 0x65, 0x35, 0x8b, 0x2f, 0x4b, 0x2d, 0xe2, 0xad, + 0x5c, 0x5f, 0x3f, 0x3e, 0x1b, 0x3f, 0x48, 0xcb, 0xdb, 0xf7, 0x75, 0xee, + 0xf2, 0xf5, 0x8f, 0xf1, 0xf8, 0x75, 0x3d, 0xff, 0xbb, 0xcc, 0x5d, 0x2a, + 0x9d, 0x57, 0x43, 0x97, 0x0e, 0xad, 0x2f, 0xed, 0x59, 0xbb, 0xec, 0xab, + 0xa5, 0x3d, 0x6b, 0xcf, 0xd1, 0x6c, 0x75, 0xe6, 0xfa, 0xd2, 0xa3, 0xc2, + 0x42, 0xad, 0x7b, 0x8b, 0x69, 0xa2, 0xc7, 0xa0, 0xe7, 0x1c, 0xda, 0x68, + 0x01, 0x4d, 0xe9, 0x3e, 0xa2, 0xe3, 0x43, 0xbf, 0xb7, 0xfa, 0xee, 0xbb, + 0xa4, 0x63, 0x29, 0xd2, 0xfa, 0xb2, 0x9a, 0xe2, 0xf9, 0xb3, 0xeb, 0x79, + 0xb9, 0xbc, 0xff, 0x01, 0xdf, 0xa3, 0xb3, 0xa6, 0xf0, 0x58, 0xd7, 0x5c, + 0xea, 0xb3, 0xfc, 0xda, 0x56, 0x17, 0x3e, 0xad, 0x9f, 0x7f, 0xcd, 0x97, + 0x73, 0xb0, 0x74, 0x7e, 0x2d, 0x1b, 0x87, 0xdc, 0x4f, 0x74, 0xf9, 0x90, + 0x39, 0x1d, 0xf7, 0xbb, 0x58, 0xf9, 0xe7, 0xf5, 0x9e, 0xaf, 0xbe, 0x37, + 0x86, 0x2c, 0xf3, 0xea, 0xea, 0x18, 0xd2, 0xb6, 0xb2, 0x90, 0xac, 0xf8, + 0x1c, 0x46, 0x97, 0xd7, 0x7e, 0x7d, 0xde, 0xf5, 0xf5, 0x6f, 0xc8, 0xfd, + 0x8f, 0xf1, 0x3a, 0xdb, 0x3d, 0x3a, 0x3e, 0x6f, 0xd6, 0x9f, 0xf7, 0xd5, + 0xeb, 0xf7, 0xbc, 0xb6, 0x0e, 0xbe, 0xff, 0xda, 0x8f, 0xdf, 0x97, 0x3b, + 0xda, 0xea, 0xb2, 0x9a, 0xb7, 0x1d, 0xb2, 0xec, 0x6e, 0xe8, 0xef, 0x06, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x4c, 0x96, 0x6a, 0x01, 0xc0, 0x84, 0xfa, 0x16, 0x36, + 0x0c, 0x59, 0x7a, 0x14, 0x2d, 0xb7, 0x19, 0xb2, 0x14, 0xa9, 0x63, 0xe1, + 0xcc, 0xbd, 0xbb, 0x5b, 0xf9, 0xdf, 0x46, 0xf3, 0x23, 0x1d, 0x8b, 0x63, + 0x36, 0xee, 0x1f, 0x78, 0x3f, 0x4d, 0xe9, 0xf1, 0xd9, 0x60, 0xf6, 0xbd, + 0x85, 0x4e, 0x1b, 0xf4, 0xdd, 0x7b, 0xfc, 0xba, 0x16, 0xda, 0x6c, 0xba, + 0x18, 0x65, 0x97, 0xa5, 0x44, 0xeb, 0xbd, 0x1d, 0xfd, 0xb3, 0x8e, 0xa5, + 0x22, 0xf7, 0xfa, 0xa3, 0x7f, 0x1e, 0x92, 0xd1, 0xf3, 0xef, 0x4d, 0xd3, + 0x34, 0xd1, 0xf9, 0x39, 0x6b, 0x82, 0x73, 0x73, 0xc8, 0x42, 0xaa, 0xe5, + 0xfc, 0x8e, 0xd9, 0x5d, 0xf7, 0x7f, 0x6f, 0x46, 0xf0, 0xf8, 0x17, 0xbb, + 0xba, 0xe6, 0xf6, 0x2d, 0x2d, 0x1b, 0xf0, 0xb8, 0x16, 0x1f, 0xbb, 0xe8, + 0xbe, 0x4b, 0xf3, 0x37, 0x3c, 0xbf, 0xab, 0x5a, 0x59, 0x30, 0xf4, 0xd5, + 0x17, 0xb3, 0x58, 0x2c, 0x16, 0x41, 0xd7, 0x6c, 0x75, 0xa1, 0x56, 0xdf, + 0xe3, 0xdb, 0xf4, 0x2c, 0x85, 0x2a, 0xe9, 0xfb, 0x1e, 0xdc, 0x75, 0x69, + 0xd8, 0x80, 0xc5, 0x71, 0x43, 0x5e, 0xbf, 0xbb, 0x6e, 0x17, 0x9d, 0xbb, + 0x5f, 0xdd, 0x7f, 0x13, 0x9c, 0xc3, 0x7d, 0x97, 0x47, 0xf7, 0x3f, 0xf4, + 0xba, 0xdb, 0x9c, 0x7b, 0x23, 0x9f, 0xbf, 0xe1, 0xeb, 0xf7, 0xd0, 0x05, + 0x90, 0xeb, 0xba, 0x16, 0x9c, 0xad, 0xde, 0x67, 0xb4, 0x74, 0x70, 0x9b, + 0xfb, 0xe8, 0x38, 0x47, 0xc2, 0xd7, 0xa7, 0xd5, 0xdb, 0x47, 0xaf, 0x23, + 0x85, 0xfb, 0x29, 0xfe, 0xfb, 0xd0, 0xcb, 0x7a, 0xee, 0x77, 0xb1, 0xc9, + 0x73, 0xbb, 0xe5, 0x79, 0x30, 0xdb, 0xf6, 0x71, 0x07, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x7a, + 0xfe, 0x03, 0x51, 0x00, 0x98, 0x46, 0xb4, 0xc0, 0x6a, 0xc8, 0xe5, 0xa5, + 0xeb, 0x44, 0xb7, 0xef, 0xbb, 0x6d, 0xe9, 0xf6, 0x5d, 0xbf, 0x2f, 0xec, + 0x3a, 0xbf, 0x6f, 0xc6, 0xb7, 0x9c, 0x5f, 0x3a, 0xb6, 0xc9, 0xbf, 0x47, + 0xf7, 0x5d, 0xfa, 0x7d, 0x2b, 0xfa, 0x1a, 0x76, 0xfd, 0xfa, 0x86, 0x74, + 0x44, 0xfd, 0xeb, 0xd7, 0x19, 0x7a, 0x0e, 0xac, 0x5e, 0x77, 0xd3, 0xaf, + 0x61, 0xd3, 0xe7, 0x77, 0x88, 0x52, 0xff, 0xa6, 0x8f, 0x5d, 0xd7, 0x75, + 0x86, 0xcc, 0x58, 0xbf, 0x5e, 0x74, 0xfb, 0x9a, 0xcf, 0xed, 0xfa, 0xf5, + 0xb6, 0xf9, 0xfa, 0x37, 0xb9, 0xff, 0x21, 0x36, 0xb9, 0x7d, 0xd7, 0xf3, + 0x58, 0x3c, 0x37, 0x57, 0x17, 0x6e, 0x75, 0x2c, 0xd4, 0x19, 0x32, 0x63, + 0xd7, 0x73, 0x7b, 0xcc, 0xd7, 0xd7, 0xbe, 0x99, 0x9b, 0xdc, 0xff, 0x90, + 0xdb, 0x6e, 0x7a, 0xff, 0x63, 0xf7, 0x75, 0xbd, 0xd6, 0x6e, 0x3a, 0xbf, + 0xeb, 0xfa, 0x63, 0xfe, 0xfc, 0x2b, 0xcd, 0xd8, 0xe4, 0x67, 0xc0, 0x26, + 0xaf, 0xbf, 0xd1, 0xec, 0xae, 0x19, 0xeb, 0x0b, 0xe8, 0xda, 0x0b, 0xbb, + 0x97, 0xa0, 0x6d, 0xfb, 0x58, 0xdf, 0xb3, 0x72, 0x3f, 0x7d, 0x3f, 0xc3, + 0xb6, 0xdd, 0x36, 0x57, 0xea, 0x1b, 0xfa, 0xfd, 0xdb, 0x77, 0xff, 0xfe, + 0xbf, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x04, 0x66, + 0x53, 0x07, 0x00, 0xc0, 0x53, 0x34, 0x3f, 0x38, 0x59, 0xd4, 0x9c, 0x7f, + 0x71, 0xf7, 0xa1, 0xe6, 0xf8, 0xe6, 0xfa, 0xe0, 0xa4, 0xea, 0xfc, 0xda, + 0xfd, 0x3f, 0x1f, 0x9e, 0x56, 0x9d, 0xff, 0xe3, 0xe7, 0x9b, 0xaa, 0xf3, + 0xb3, 0xf7, 0xff, 0x72, 0x74, 0x56, 0x75, 0xfe, 0x0f, 0x9f, 0xde, 0x57, + 0x9d, 0x9f, 0xbd, 0xff, 0x66, 0x7e, 0x51, 0x75, 0xfe, 0xe9, 0xed, 0x75, + 0xd5, 0xf9, 0xd9, 0xfb, 0xff, 0x3c, 0xbe, 0xac, 0x3a, 0xff, 0xfb, 0x8f, + 0x6f, 0xab, 0xce, 0xd7, 0x1f, 0xd3, 0x1f, 0xd3, 0x1f, 0xcb, 0xde, 0x7f, + 0x50, 0xb9, 0xff, 0x4e, 0x7f, 0xe8, 0xef, 0xca, 0xfd, 0xdf, 0xe9, 0x0f, + 0xdd, 0x56, 0xee, 0x9f, 0xeb, 0x0f, 0xbd, 0xab, 0xdc, 0x7f, 0xae, 0x3f, + 0xa4, 0x3f, 0xa6, 0x3f, 0xa6, 0x3f, 0xa6, 0x3f, 0x96, 0xfd, 0xe7, 0x57, + 0xf6, 0xfe, 0xec, 0xbf, 0xbf, 0x65, 0xef, 0xcf, 0xfe, 0xfe, 0x25, 0x7b, + 0x7f, 0xf6, 0xf7, 0xef, 0xfa, 0x63, 0xfa, 0x63, 0xfa, 0x63, 0xfa, 0x63, + 0xfa, 0x63, 0xd9, 0xfb, 0xb3, 0x7f, 0x7e, 0x97, 0xbd, 0x3f, 0xfb, 0xe7, + 0xd7, 0xd9, 0xfb, 0xb3, 0xff, 0xfd, 0x46, 0xf6, 0xfe, 0x37, 0x55, 0xa7, + 0x37, 0xcd, 0x55, 0xe5, 0xf9, 0xfa, 0x63, 0xfa, 0x63, 0xfa, 0x63, 0xdf, + 0xa0, 0xdf, 0x7f, 0x83, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0xc0, + 0xed, 0x4d, 0x1d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xbb, 0xb2, + 0x54, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xf4, 0xf6, 0xa7, 0x0e, + 0x00, 0x80, 0xa7, 0xee, 0xf6, 0xee, 0xc3, 0x28, 0x73, 0xe6, 0x07, 0x27, + 0x9d, 0xc7, 0xdf, 0x8c, 0x32, 0xbd, 0x69, 0xae, 0x0a, 0xc7, 0xb3, 0xf7, + 0xff, 0xf5, 0xf9, 0x66, 0x94, 0xf9, 0xcf, 0x0e, 0x4f, 0x3b, 0x8f, 0xeb, + 0x6f, 0x95, 0xfa, 0xff, 0xf8, 0xf4, 0x7e, 0x94, 0xf9, 0xcf, 0x8f, 0xce, + 0x3a, 0x8f, 0xeb, 0x6f, 0x95, 0xfa, 0x7f, 0xbb, 0xbd, 0x1e, 0x65, 0xfe, + 0xcb, 0xf9, 0x45, 0xe7, 0x71, 0xfd, 0xad, 0x52, 0xff, 0xbb, 0x8f, 0x6f, + 0x47, 0x99, 0x7f, 0x7e, 0x7c, 0xd9, 0x79, 0x5c, 0x7f, 0x4b, 0x7f, 0x4c, + 0x7f, 0x4c, 0x7f, 0xac, 0xd4, 0xff, 0xd3, 0x28, 0xd3, 0x9b, 0xe6, 0x75, + 0xe1, 0xb8, 0xfe, 0x56, 0xa9, 0xff, 0xd7, 0x51, 0xa6, 0x37, 0xcd, 0xab, + 0xc2, 0x71, 0xfd, 0xad, 0x52, 0xff, 0xef, 0xa3, 0x4c, 0x6f, 0x9a, 0x17, + 0x85, 0xe3, 0xfa, 0x5b, 0xa5, 0xfe, 0xda, 0xf4, 0xb7, 0xf4, 0x6f, 0x47, + 0x7f, 0x4b, 0xff, 0x76, 0xf4, 0xb7, 0x1e, 0xeb, 0xcf, 0xaf, 0xec, 0xfd, + 0xd9, 0x7f, 0x7f, 0xcb, 0xde, 0x9f, 0xfd, 0xfd, 0x4b, 0xf6, 0xfe, 0xec, + 0xef, 0xdf, 0xf5, 0xb7, 0xf4, 0xc7, 0xf4, 0xc7, 0xf4, 0xc7, 0xf4, 0xc7, + 0x1e, 0x6b, 0x7f, 0xf6, 0xcf, 0xef, 0xb2, 0xf7, 0x67, 0xff, 0xfc, 0x3a, + 0x7b, 0x7f, 0xf6, 0xbf, 0xdf, 0xc8, 0xde, 0x5f, 0x9b, 0xfe, 0x96, 0xfe, + 0xed, 0xe8, 0x6f, 0xe9, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x5b, + 0xda, 0x9b, 0x3a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x76, 0x65, + 0xa9, 0x16, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe9, 0x59, 0xaa, 0x05, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x7a, 0x96, 0x6a, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x90, 0x9e, 0xa5, 0x5a, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xa4, 0x67, 0xa9, 0x16, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe9, + 0x59, 0xaa, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x7a, 0x96, 0x6a, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x90, 0x9e, 0xa5, 0x5a, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xa4, 0x67, 0xa9, 0x16, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xe9, 0x59, 0xaa, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, + 0x7a, 0x96, 0x6a, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x90, 0x9e, 0xa5, + 0x5a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x67, 0xa9, 0x16, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xe9, 0x59, 0xaa, 0x05, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x40, 0x7a, 0x96, 0x6a, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x90, 0x9e, 0xa5, 0x5a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0xb7, + 0x3f, 0x75, 0x00, 0x00, 0x3c, 0x75, 0xf3, 0x83, 0x93, 0xaa, 0xf3, 0xaf, + 0xaa, 0x4e, 0xcf, 0xdf, 0xff, 0xec, 0xf0, 0xb4, 0xea, 0x7c, 0xfd, 0xb1, + 0xe7, 0x47, 0x67, 0x55, 0xe7, 0xeb, 0x8f, 0xbd, 0x9c, 0x5f, 0x54, 0x9d, + 0xaf, 0x3f, 0x76, 0x7e, 0x7c, 0x59, 0x75, 0xbe, 0xfe, 0x98, 0xfe, 0x98, + 0xfe, 0x98, 0xfe, 0xd8, 0xeb, 0xaa, 0xd3, 0xf5, 0xf7, 0x79, 0x55, 0x75, + 0xba, 0xfe, 0x3e, 0x2f, 0xaa, 0x4e, 0xd7, 0x3f, 0x35, 0xfd, 0xd3, 0xd2, + 0x3f, 0x2d, 0xfd, 0xd3, 0xd2, 0x1f, 0xcb, 0xfe, 0xf3, 0x2b, 0x7b, 0x7f, + 0xf6, 0xdf, 0xdf, 0xb2, 0xf7, 0x67, 0x7f, 0xff, 0x92, 0xbd, 0x3f, 0xfb, + 0xfb, 0x77, 0xfd, 0x31, 0xfd, 0x31, 0xfd, 0x31, 0xfd, 0x31, 0xfd, 0xb1, + 0xec, 0xfd, 0xd9, 0x3f, 0xbf, 0xcb, 0xde, 0x9f, 0xfd, 0xf3, 0xeb, 0xec, + 0xfd, 0xd9, 0xff, 0x7e, 0x23, 0x7b, 0x7f, 0x6d, 0xfa, 0xa7, 0xa5, 0x7f, + 0x5a, 0xfa, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc8, 0x68, 0x6f, 0xea, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd8, 0x95, 0xa5, 0x5a, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x37, 0x9b, 0x3a, 0x00, 0x00, 0x9e, + 0xa2, 0xab, 0xa6, 0x59, 0xd4, 0x9c, 0x7f, 0x7d, 0x70, 0x52, 0x73, 0x7c, + 0x73, 0x71, 0xf7, 0xa1, 0xea, 0xfc, 0xec, 0xfd, 0x3f, 0x1f, 0x9e, 0x56, + 0x9d, 0xff, 0xe3, 0xe7, 0x9b, 0xaa, 0xf3, 0xb3, 0xf7, 0xff, 0x72, 0x74, + 0x56, 0x75, 0xfe, 0x0f, 0x9f, 0xde, 0x57, 0x9d, 0x9f, 0xbd, 0xff, 0x66, + 0x7e, 0x51, 0x75, 0xfe, 0xe9, 0xed, 0x75, 0xd5, 0xf9, 0xd9, 0xfb, 0xff, + 0x3c, 0xbe, 0xac, 0x3a, 0xff, 0xfb, 0x8f, 0x6f, 0xab, 0xce, 0xd7, 0x1f, + 0xd3, 0x1f, 0xd3, 0x1f, 0x3b, 0xa8, 0xdc, 0x7f, 0xa7, 0x3f, 0xf4, 0x77, + 0xe5, 0xfe, 0xef, 0xf4, 0x87, 0x6e, 0x2b, 0xf7, 0xcf, 0xf5, 0x87, 0xde, + 0x55, 0xee, 0x3f, 0xd7, 0x1f, 0xd2, 0x1f, 0xd3, 0x1f, 0xd3, 0x1f, 0xd3, + 0x1f, 0xcb, 0xfe, 0xf3, 0x2b, 0x7b, 0x7f, 0xf6, 0xdf, 0xdf, 0xb2, 0xf7, + 0x67, 0x7f, 0xff, 0x92, 0xbd, 0x3f, 0xfb, 0xfb, 0x77, 0xfd, 0x31, 0xfd, + 0x31, 0xfd, 0x31, 0xfd, 0x31, 0xfd, 0x31, 0xfd, 0xb1, 0xda, 0xfd, 0xd9, + 0x3f, 0xbf, 0xcb, 0xde, 0x9f, 0xfd, 0xf3, 0xeb, 0xec, 0xfd, 0xd9, 0xff, + 0x7e, 0x23, 0x7b, 0xff, 0x9b, 0xaa, 0xd3, 0x9b, 0xe6, 0xaa, 0xf2, 0x7c, + 0xfd, 0x31, 0xfd, 0x31, 0xfd, 0xbd, 0xfc, 0x37, 0x18, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x0f, 0xdc, 0xde, 0xd4, 0x01, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xb0, 0x2b, 0x4b, 0xb5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x48, 0x6f, 0x7f, 0xea, 0x00, 0x00, 0x78, 0xea, 0xde, 0x8c, 0x34, 0xe7, + 0xaa, 0x70, 0xfc, 0xf6, 0xee, 0xc3, 0x28, 0xf3, 0xe7, 0x07, 0x27, 0x9d, + 0xc7, 0xf5, 0xb7, 0x4a, 0xfd, 0x7f, 0x7d, 0xbe, 0x19, 0x65, 0xfe, 0xb3, + 0xc3, 0xd3, 0xce, 0xe3, 0xfa, 0x5b, 0xa5, 0xfe, 0x3f, 0x3e, 0xbd, 0x1f, + 0x65, 0xfe, 0xf3, 0xa3, 0xb3, 0xce, 0xe3, 0xfa, 0x5b, 0xa5, 0xfe, 0xdf, + 0x6e, 0xaf, 0x47, 0x99, 0xff, 0x72, 0x7e, 0xd1, 0x79, 0x5c, 0x7f, 0xab, + 0xd4, 0xff, 0xee, 0xe3, 0xdb, 0x51, 0xe6, 0x9f, 0x1f, 0x5f, 0x76, 0x1e, + 0xd7, 0xdf, 0xd2, 0x1f, 0xd3, 0x1f, 0x9b, 0xaa, 0xff, 0xa7, 0x51, 0xa6, + 0x37, 0xcd, 0xeb, 0xc2, 0x71, 0xfd, 0xad, 0x52, 0xff, 0xaf, 0xa3, 0x4c, + 0x6f, 0x9a, 0x57, 0x85, 0xe3, 0xfa, 0x5b, 0xa5, 0xfe, 0xdf, 0x47, 0x99, + 0xde, 0x34, 0x2f, 0x0a, 0xc7, 0xf5, 0xb7, 0x4a, 0xfd, 0xb5, 0xe9, 0x6f, + 0xe9, 0xdf, 0x8e, 0xfe, 0x96, 0xfe, 0xed, 0xe8, 0x6f, 0x3d, 0xd6, 0x9f, + 0x5f, 0xd9, 0xfb, 0xb3, 0xff, 0xfe, 0x96, 0xbd, 0x3f, 0xfb, 0xfb, 0x97, + 0xec, 0xfd, 0xd9, 0xdf, 0xbf, 0xeb, 0x6f, 0xe9, 0x8f, 0xe9, 0x8f, 0xe9, + 0x8f, 0xe9, 0x8f, 0xe9, 0x8f, 0x4d, 0xd5, 0x9f, 0xfd, 0xf3, 0xbb, 0xec, + 0xfd, 0xd9, 0x3f, 0xbf, 0xce, 0xde, 0x9f, 0xfd, 0xef, 0x37, 0xb2, 0xf7, + 0xd7, 0xa6, 0xbf, 0xa5, 0x7f, 0x3b, 0xfa, 0x5b, 0x53, 0xf5, 0x03, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xf0, 0x30, 0xed, 0x4d, 0x1d, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xbb, 0xb2, 0x54, 0x0b, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x80, 0xf4, 0x2c, 0xd5, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, + 0x3d, 0x4b, 0xb5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x48, 0xcf, 0x52, + 0x2d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd2, 0xb3, 0x54, 0x0b, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0xf4, 0x2c, 0xd5, 0x02, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x20, 0x3d, 0x4b, 0xb5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x48, 0xcf, 0x52, 0x2d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd2, 0xb3, + 0x54, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xf4, 0x2c, 0xd5, 0x02, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x3d, 0x4b, 0xb5, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x48, 0xcf, 0x52, 0x2d, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xd2, 0xb3, 0x54, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xf4, + 0x2c, 0xd5, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x3d, 0x4b, 0xb5, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x48, 0xcf, 0x52, 0x2d, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xd2, 0xdb, 0x9f, 0x3a, 0x00, 0x00, 0x9e, 0xba, + 0xab, 0xca, 0xf3, 0xe7, 0x07, 0x27, 0x55, 0xe7, 0xeb, 0x8f, 0x3d, 0x3b, + 0x3c, 0xad, 0x3a, 0x5f, 0x7f, 0xec, 0xf9, 0xd1, 0x59, 0xd5, 0xf9, 0xfa, + 0x63, 0x2f, 0xe7, 0x17, 0x55, 0xe7, 0xeb, 0x8f, 0x9d, 0x1f, 0x5f, 0x56, + 0x9d, 0xaf, 0x3f, 0xa6, 0x3f, 0xa6, 0x3f, 0x56, 0xbb, 0xff, 0x75, 0xd5, + 0xe9, 0xfa, 0xfb, 0xbc, 0xaa, 0x3a, 0x5d, 0x7f, 0x9f, 0x17, 0x55, 0xa7, + 0xeb, 0x9f, 0x9a, 0xfe, 0x69, 0xe9, 0x9f, 0x96, 0xfe, 0x69, 0xe9, 0x8f, + 0x65, 0xff, 0xf9, 0x95, 0xbd, 0x3f, 0xfb, 0xef, 0x6f, 0xd9, 0xfb, 0xb3, + 0xbf, 0x7f, 0xc9, 0xde, 0x9f, 0xfd, 0xfd, 0xbb, 0xfe, 0x98, 0xfe, 0x98, + 0xfe, 0x98, 0xfe, 0x98, 0xfe, 0x98, 0xfe, 0x98, 0xcf, 0xef, 0x62, 0xd9, + 0xfb, 0xb3, 0x7f, 0x7e, 0x9d, 0xbd, 0x3f, 0xfb, 0xdf, 0x6f, 0x64, 0xef, + 0xaf, 0x4d, 0xff, 0xb4, 0xf4, 0x4f, 0x2b, 0x7b, 0x3f, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x0f, 0xd3, 0xde, 0xd4, 0x01, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xb0, 0x2b, 0x4b, 0xb5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x48, 0x6f, 0x36, 0x75, 0x00, 0x00, 0x3c, 0x45, 0xf3, 0x83, 0x31, 0x87, + 0x20, 0xc2, 0x00, 0x00, 0x07, 0xf1, 0x49, 0x44, 0x41, 0x54, 0x93, 0x45, + 0xcd, 0xf9, 0x17, 0x77, 0x1f, 0x6a, 0x8e, 0x6f, 0xae, 0x0f, 0x4e, 0xaa, + 0xce, 0xaf, 0xdd, 0xff, 0xf3, 0xe1, 0x69, 0xd5, 0xf9, 0x3f, 0x7e, 0xbe, + 0xa9, 0x3a, 0x3f, 0x7b, 0xff, 0x2f, 0x47, 0x67, 0x55, 0xe7, 0xff, 0xf0, + 0xe9, 0x7d, 0xd5, 0xf9, 0xd9, 0xfb, 0x6f, 0xe6, 0x17, 0x55, 0xe7, 0x9f, + 0xde, 0x5e, 0x57, 0x9d, 0x9f, 0xbd, 0xff, 0xcf, 0xe3, 0xcb, 0xaa, 0xf3, + 0xbf, 0xff, 0xf8, 0xb6, 0xea, 0x7c, 0xfd, 0x31, 0xfd, 0x31, 0xfd, 0xb1, + 0xec, 0xfd, 0x07, 0x95, 0xfb, 0xef, 0xf4, 0x87, 0xfe, 0xae, 0xdc, 0xff, + 0x9d, 0xfe, 0xd0, 0x6d, 0xe5, 0xfe, 0xb9, 0xfe, 0xd0, 0xbb, 0xca, 0xfd, + 0xe7, 0xfa, 0x43, 0xfa, 0x63, 0xfa, 0x63, 0xfa, 0x63, 0xfa, 0x63, 0xd9, + 0x7f, 0x7e, 0x65, 0xef, 0xcf, 0xfe, 0xfb, 0x5b, 0xf6, 0xfe, 0xec, 0xef, + 0x5f, 0xb2, 0xf7, 0x67, 0x7f, 0xff, 0xae, 0x3f, 0xa6, 0x3f, 0xa6, 0x3f, + 0xa6, 0x3f, 0xa6, 0x3f, 0x96, 0xbd, 0x3f, 0xfb, 0xe7, 0x77, 0xd9, 0xfb, + 0xb3, 0x7f, 0x7e, 0x9d, 0xbd, 0x3f, 0xfb, 0xdf, 0x6f, 0x64, 0xef, 0x7f, + 0x53, 0x75, 0x7a, 0xd3, 0x5c, 0x55, 0x9e, 0xaf, 0x3f, 0xa6, 0x3f, 0xa6, + 0x3f, 0xf6, 0x0d, 0xfa, 0xfd, 0x37, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x0f, 0xdc, 0xde, 0xd4, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xb0, 0x2b, 0x4b, 0xb5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x48, 0x6f, + 0x7f, 0xea, 0x00, 0x00, 0x78, 0xea, 0x6e, 0xef, 0x3e, 0x8c, 0x32, 0x67, + 0x7e, 0x70, 0xd2, 0x79, 0xfc, 0xcd, 0x28, 0xd3, 0x9b, 0xe6, 0xaa, 0x70, + 0x3c, 0x7b, 0xff, 0x5f, 0x9f, 0x6f, 0x46, 0x99, 0xff, 0xec, 0xf0, 0xb4, + 0xf3, 0xb8, 0xfe, 0x56, 0xa9, 0xff, 0x8f, 0x4f, 0xef, 0x47, 0x99, 0xff, + 0xfc, 0xe8, 0xac, 0xf3, 0xb8, 0xfe, 0x56, 0xa9, 0xff, 0xb7, 0xdb, 0xeb, + 0x51, 0xe6, 0xbf, 0x9c, 0x5f, 0x74, 0x1e, 0xd7, 0xdf, 0x2a, 0xf5, 0xbf, + 0xfb, 0xf8, 0x76, 0x94, 0xf9, 0xe7, 0xc7, 0x97, 0x9d, 0xc7, 0xf5, 0xb7, + 0xf4, 0xc7, 0xf4, 0xc7, 0xf4, 0xc7, 0x4a, 0xfd, 0x3f, 0x8d, 0x32, 0xbd, + 0x69, 0x5e, 0x17, 0x8e, 0xeb, 0x6f, 0x95, 0xfa, 0x7f, 0x1d, 0x65, 0x7a, + 0xd3, 0xbc, 0x2a, 0x1c, 0xd7, 0xdf, 0x2a, 0xf5, 0xff, 0x3e, 0xca, 0xf4, + 0xa6, 0x79, 0x51, 0x38, 0xae, 0xbf, 0x55, 0xea, 0xaf, 0x4d, 0x7f, 0x4b, + 0xff, 0x76, 0xf4, 0xb7, 0xf4, 0x6f, 0x47, 0x7f, 0xeb, 0xb1, 0xfe, 0xfc, + 0xca, 0xde, 0x9f, 0xfd, 0xf7, 0xb7, 0xec, 0xfd, 0xd9, 0xdf, 0xbf, 0x64, + 0xef, 0xcf, 0xfe, 0xfe, 0x5d, 0x7f, 0x4b, 0x7f, 0x4c, 0x7f, 0x4c, 0x7f, + 0x4c, 0x7f, 0xec, 0xb1, 0xf6, 0x67, 0xff, 0xfc, 0x2e, 0x7b, 0x7f, 0xf6, + 0xcf, 0xaf, 0xb3, 0xf7, 0x67, 0xff, 0xfb, 0x8d, 0xec, 0xfd, 0xb5, 0xe9, + 0x6f, 0xe9, 0xdf, 0x8e, 0xfe, 0x96, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xbe, 0xa5, 0xbd, 0xa9, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x60, 0x57, 0x96, 0x6a, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x90, 0x9e, + 0xa5, 0x5a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x67, 0xa9, 0x16, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe9, 0x59, 0xaa, 0x05, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x40, 0x7a, 0x96, 0x6a, 0x01, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x90, 0xde, 0xfe, 0xbf, 0x9b, 0x66, 0x31, 0x75, 0x04, 0x00, 0x3c, + 0x35, 0xff, 0x9b, 0x3a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1e, 0x99, 0xfd, + 0x7f, 0x4d, 0x5d, 0x00, 0x00, 0x4f, 0x90, 0xa5, 0x5a, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x30, 0xae, 0xfd, 0xff, 0x4e, 0x5d, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3b, 0xda, 0x9b, 0x3a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x76, 0xb5, 0xff, 0x9f, 0xa9, 0x0b, 0x00, 0xe0, 0x09, 0x9a, 0x4f, + 0x1d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8f, 0xcc, 0xde, 0xd4, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xb0, 0x2b, 0x4b, 0xb5, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x48, 0xcf, 0x52, 0x2d, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xd2, 0xb3, 0x54, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xf4, + 0x2c, 0xd5, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x3d, 0x4b, 0xb5, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x48, 0x6f, 0x7f, 0xea, 0x00, 0x00, + 0x78, 0xea, 0xe6, 0x07, 0x27, 0x55, 0xe7, 0x5f, 0x55, 0x9d, 0x9e, 0xbf, + 0xff, 0xd9, 0xe1, 0x69, 0xd5, 0xf9, 0xfa, 0x63, 0xcf, 0x8f, 0xce, 0xaa, + 0xce, 0xd7, 0x1f, 0x7b, 0x39, 0xbf, 0xa8, 0x3a, 0x5f, 0x7f, 0xec, 0xfc, + 0xf8, 0xb2, 0xea, 0x7c, 0xfd, 0x31, 0xfd, 0x31, 0xfd, 0x31, 0xfd, 0xb1, + 0xd7, 0x55, 0xa7, 0xeb, 0xef, 0xf3, 0xaa, 0xea, 0x74, 0xfd, 0x7d, 0x5e, + 0x54, 0x9d, 0xae, 0x7f, 0x6a, 0xfa, 0xa7, 0xa5, 0x7f, 0x5a, 0xfa, 0xa7, + 0xa5, 0x3f, 0x96, 0xfd, 0xe7, 0x57, 0xf6, 0xfe, 0xec, 0xbf, 0xbf, 0x65, + 0xef, 0xcf, 0xfe, 0xfe, 0x25, 0x7b, 0x7f, 0xf6, 0xf7, 0xef, 0xfa, 0x63, + 0xfa, 0x63, 0xfa, 0x63, 0xfa, 0x63, 0xfa, 0x63, 0xd9, 0xfb, 0xb3, 0x7f, + 0x7e, 0x97, 0xbd, 0x3f, 0xfb, 0xe7, 0xd7, 0xd9, 0xfb, 0xb3, 0xff, 0xfd, + 0x46, 0xf6, 0xfe, 0xda, 0xf4, 0x4f, 0x4b, 0xff, 0xb4, 0xf4, 0x03, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x90, 0xd1, 0xde, 0xd4, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xb0, 0x2b, 0x4b, 0xb5, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x48, 0x6f, 0xd6, 0x34, 0xcd, 0x62, 0xea, 0x08, 0x00, 0x78, 0x6a, + 0xae, 0x2a, 0xcf, 0xbf, 0x3e, 0x38, 0xa9, 0x3a, 0xff, 0xe2, 0xee, 0x43, + 0xd5, 0xf9, 0xd9, 0xfb, 0x7f, 0x3e, 0x3c, 0xad, 0x3a, 0xff, 0xc7, 0xcf, + 0x37, 0x55, 0xe7, 0x67, 0xef, 0xff, 0xe5, 0xe8, 0xac, 0xea, 0xfc, 0x1f, + 0x3e, 0xbd, 0xaf, 0x3a, 0x3f, 0x7b, 0xff, 0xcd, 0xfc, 0xa2, 0xea, 0xfc, + 0xd3, 0xdb, 0xeb, 0xaa, 0xf3, 0xb3, 0xf7, 0xff, 0x79, 0x7c, 0x59, 0x75, + 0xfe, 0xf7, 0x1f, 0xdf, 0x56, 0x9d, 0xaf, 0x3f, 0xa6, 0x3f, 0xa6, 0x3f, + 0x76, 0x50, 0xb9, 0xff, 0x4e, 0x7f, 0xe8, 0xef, 0xca, 0xfd, 0xdf, 0xe9, + 0x0f, 0xdd, 0x56, 0xee, 0x9f, 0xeb, 0x0f, 0xbd, 0xab, 0xdc, 0x7f, 0xae, + 0x3f, 0xa4, 0x3f, 0xa6, 0x3f, 0xa6, 0x3f, 0xa6, 0x3f, 0x96, 0xfd, 0xe7, + 0x57, 0xf6, 0xfe, 0xec, 0xbf, 0xbf, 0x65, 0xef, 0xcf, 0xfe, 0xfe, 0x25, + 0x7b, 0x7f, 0xf6, 0xf7, 0xef, 0xfa, 0x63, 0xfa, 0x63, 0xfa, 0x63, 0xfa, + 0x63, 0xfa, 0x63, 0xfa, 0x63, 0xb5, 0xfb, 0xb3, 0x7f, 0x7e, 0x97, 0xbd, + 0x3f, 0xfb, 0xe7, 0xd7, 0xd9, 0xfb, 0xb3, 0xff, 0xfd, 0x46, 0xf6, 0xfe, + 0x37, 0x55, 0xa7, 0xd7, 0xff, 0xfb, 0x31, 0xfd, 0x31, 0xfd, 0x31, 0xfd, + 0xbd, 0x66, 0xf5, 0xef, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x5d, + 0xec, 0x4d, 0x1d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xbb, 0xb2, + 0x54, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xf4, 0xf6, 0xa7, 0x0e, + 0x00, 0x80, 0xa7, 0xee, 0xcd, 0x48, 0x73, 0xae, 0x0a, 0xc7, 0x6f, 0xef, + 0x3e, 0x8c, 0x32, 0x7f, 0x7e, 0x70, 0xd2, 0x79, 0x5c, 0x7f, 0xab, 0xd4, + 0xff, 0xd7, 0xe7, 0x9b, 0x51, 0xe6, 0x3f, 0x3b, 0x3c, 0xed, 0x3c, 0xae, + 0xbf, 0x55, 0xea, 0xff, 0xe3, 0xd3, 0xfb, 0x51, 0xe6, 0x3f, 0x3f, 0x3a, + 0xeb, 0x3c, 0xae, 0xbf, 0x55, 0xea, 0xff, 0xed, 0xf6, 0x7a, 0x94, 0xf9, + 0x2f, 0xe7, 0x17, 0x9d, 0xc7, 0xf5, 0xb7, 0x4a, 0xfd, 0xef, 0x3e, 0xbe, + 0x1d, 0x65, 0xfe, 0xf9, 0xf1, 0x65, 0xe7, 0x71, 0xfd, 0x2d, 0xfd, 0x31, + 0xfd, 0xb1, 0xa9, 0xfa, 0x7f, 0x1a, 0x65, 0x7a, 0xd3, 0xbc, 0x2e, 0x1c, + 0xd7, 0xdf, 0x2a, 0xf5, 0xff, 0x3a, 0xca, 0xf4, 0xa6, 0x79, 0x55, 0x38, + 0xae, 0xbf, 0x55, 0xea, 0xff, 0x7d, 0x94, 0xe9, 0x4d, 0xf3, 0xa2, 0x70, + 0x5c, 0x7f, 0xab, 0xd4, 0x5f, 0x9b, 0xfe, 0x96, 0xfe, 0xed, 0xe8, 0x6f, + 0xe9, 0xdf, 0x8e, 0xfe, 0xd6, 0x63, 0xfd, 0xf9, 0x95, 0xbd, 0x3f, 0xfb, + 0xef, 0x6f, 0xd9, 0xfb, 0xb3, 0xbf, 0x7f, 0xc9, 0xde, 0x9f, 0xfd, 0xfd, + 0xbb, 0xfe, 0x96, 0xfe, 0x98, 0xfe, 0x98, 0xfe, 0x98, 0xfe, 0x98, 0xfe, + 0xd8, 0x54, 0xfd, 0xd9, 0x3f, 0xbf, 0xcb, 0xde, 0x9f, 0xfd, 0xf3, 0xeb, + 0xec, 0xfd, 0xd9, 0xff, 0x7e, 0x23, 0x7b, 0x7f, 0x6d, 0xfa, 0x5b, 0xfa, + 0xb7, 0xa3, 0xbf, 0x35, 0x55, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x0f, 0xd3, 0xde, 0xd4, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb0, + 0x2b, 0x4b, 0xb5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x48, 0xcf, 0x52, + 0x2d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd2, 0xb3, 0x54, 0x0b, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0xf4, 0x2c, 0xd5, 0x02, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x20, 0x3d, 0x4b, 0xb5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x48, 0xcf, 0x52, 0x2d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd2, 0xb3, + 0x54, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xf4, 0x2c, 0xd5, 0x02, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x3d, 0x4b, 0xb5, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x48, 0xcf, 0x52, 0x2d, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xd2, 0xb3, 0x54, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xf4, + 0x2c, 0xd5, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x3d, 0x4b, 0xb5, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x48, 0xcf, 0x52, 0x2d, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xd2, 0xb3, 0x54, 0x0b, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x80, 0xf4, 0x2c, 0xd5, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, + 0xbd, 0xfd, 0xa9, 0x03, 0x00, 0xe0, 0xa9, 0xbb, 0xaa, 0x3c, 0x7f, 0x7e, + 0x70, 0x52, 0x75, 0xbe, 0xfe, 0xd8, 0xb3, 0xc3, 0xd3, 0xaa, 0xf3, 0xf5, + 0xc7, 0x9e, 0x1f, 0x9d, 0x55, 0x9d, 0xaf, 0x3f, 0xf6, 0x72, 0x7e, 0x51, + 0x75, 0xbe, 0xfe, 0xd8, 0xf9, 0xf1, 0x65, 0xd5, 0xf9, 0xfa, 0x63, 0xfa, + 0x63, 0xfa, 0x63, 0xb5, 0xfb, 0x5f, 0x57, 0x9d, 0xae, 0xbf, 0xcf, 0xab, + 0xaa, 0xd3, 0xf5, 0xf7, 0x79, 0x51, 0x75, 0xba, 0xfe, 0xa9, 0xe9, 0x9f, + 0x96, 0xfe, 0x69, 0xe9, 0x9f, 0x96, 0xfe, 0x58, 0xf6, 0x9f, 0x5f, 0xd9, + 0xfb, 0xb3, 0xff, 0xfe, 0x96, 0xbd, 0x3f, 0xfb, 0xfb, 0x97, 0xec, 0xfd, + 0xd9, 0xdf, 0xbf, 0xeb, 0x8f, 0xe9, 0x8f, 0xe9, 0x8f, 0xe9, 0x8f, 0xe9, + 0x8f, 0xe9, 0x8f, 0xf9, 0xfc, 0x2e, 0x96, 0xbd, 0x3f, 0xfb, 0xe7, 0xd7, + 0xd9, 0xfb, 0xb3, 0xff, 0xfd, 0x46, 0xf6, 0xfe, 0xda, 0xf4, 0x4f, 0x4b, + 0xff, 0xb4, 0xb2, 0xf7, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x30, + 0xed, 0x4d, 0x1d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xbb, 0xb2, + 0x54, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xf4, 0xfe, 0x0f, 0x9e, + 0x29, 0x4e, 0x3f, 0x7f, 0xc8, 0xaa, 0xe4, 0x00, 0x00, 0x00, 0x00, 0x49, + 0x45, 0x4e, 0x44, 0xae, 0x42, 0x60, 0x82 +}; +unsigned int Spritesheet_png_len = 215407; diff --git a/disasterserver_c/ui/TButton.c b/disasterserver_c/ui/TButton.c new file mode 100644 index 0000000..eaba1a4 --- /dev/null +++ b/disasterserver_c/ui/TButton.c @@ -0,0 +1,52 @@ +#include + +bool tbutton_update(SDL_Renderer* renderer, struct _Component* component) +{ + ToggleButton* button = (ToggleButton*)component; + SDL_FRect src = { button->x, button->y, button->w, button->h }; + SDL_FRect dst = { button->d_x * INTERFACE_SCALE, button->d_y * INTERFACE_SCALE, button->d_w * INTERFACE_SCALE, button->d_h * INTERFACE_SCALE }; + + float mouse_x, mouse_y; + float scale_x, scale_y; + Uint32 flags = SDL_GetMouseState(&mouse_x, &mouse_y); + SDL_GetRenderScale(renderer, &scale_x, &scale_y); + + mouse_x /= scale_x; + mouse_y /= scale_y; + + if (mouse_x >= dst.x && mouse_y >= dst.y && mouse_x < dst.x + dst.w && mouse_y < dst.y + dst.h) + { + src.x += src.w; + + if (flags & SDL_BUTTON_MASK(1)) + { + if (!button->clicked && button->cb) + { + *button->value = !(*button->value); + button->cb(component); + button->clicked = true; + } + dst.y += 2; + } + else + button->clicked = false; + } + else + { + if (*button->value) + { + if(!button->reverse) + src.x += src.w * 2; + } + else + { + if (button->reverse) + src.x += src.w * 2; + } + + button->clicked = false; + } + + SDL_RenderTexture(renderer, g_textureSheet, &src, &dst); + return true; +} diff --git a/resources/Spritesheet.png b/resources/Spritesheet.png new file mode 100644 index 0000000000000000000000000000000000000000..af19320d5c965adb5483c75836906c343e43d3ea GIT binary patch literal 215407 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

X-vmV{#pZ;LP&>f!uYbJ~;n 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 literal 0 HcmV?d00001 diff --git a/resources/icon.ico b/resources/icon.ico new file mode 100644 index 0000000000000000000000000000000000000000..199c4323b767596a04f009c5f3985ba2dc9fd634 GIT binary patch literal 204862 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

NbE6?U$SUJ$dAf_T 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

ak6 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 I`X}&z0c#595dZ)H literal 0 HcmV?d00001 diff --git a/resources/icon.rc b/resources/icon.rc new file mode 100644 index 0000000..14d43bd --- /dev/null +++ b/resources/icon.rc @@ -0,0 +1 @@ +IDI_ICON1 ICON "icon.ico" \ No newline at end of file diff --git a/resources/isiskdjdnd.png b/resources/isiskdjdnd.png new file mode 100644 index 0000000000000000000000000000000000000000..19766b7d8e5dc3afe97c7a7c5edcf8adad614cbb GIT binary patch literal 804 zcmV+<1Ka$GP)aYg5FPAL2Wc%yiy+lf)ZB-e=~Vd+u*yp@xl|$rq0f zZ7{xjck?&;N1N)Z?YI61m_R1u`}v`zVl^Tk!Qh_BVoO`2*vyUD%z}76v-Z)oZfAWb z>M{)6F@f7DTw$T#AHz? zu}t9fgx~~@U5_I%3?H~8mPE*yNfdz>+}b^bSZ^FRh6jZA68y^HlZxQ(hZl;-OM;Z9 zfZpri?Y)0+AlxqTukk!S&x)#xO|qzX&-p7v|y4kqsd%cD=k{kOszx;Ab>p}iIP z)tp)v4u@R?$z)QHIKb->aa34d?`h4!dQ5F=KqwSKA)Utgb5URUO?*oFo{>agXeunP z%uCyMDR3IWA3nCl=1N92T<=w3>;r}b4uL3D+Xg?ijKCyd0m#Jr2q=x7G?l|5ZGLu1 zT}KBl<4s~cxyO6@@K(D|EzT*d7M%7g=*X=AxpARj|K70herxMymq)HPO}Hy*{LAO+ zqk`dKf^|FQcxlJ)DFyGl$HeuKv2K_5G8f)lS^8{AJ0+^;fJP7(P@?=CZt%1gR$>_y z1RAcQ@$VxPJY^V+uHxYGML|SGl33*?8WjYxl3WVdZ6j@YF^4#~qylc>Mpjb6-sE@; zAFvF|182>JGKt=}s*}B83Qo_8&XwLtW8%HdM$kj-YUkI~D}sQB1rL}K^K1P4eiqG6 zMNOe3TY9F)S=PVdpn}A7<$$9?PQq;FDbllD=wM|{zeJF<323;j!Y5xEg-=$PtjI!wf0000x literal 0 HcmV?d00001 diff --git a/shell.nix b/shell.nix new file mode 100644 index 0000000..0008db5 --- /dev/null +++ b/shell.nix @@ -0,0 +1,5 @@ +{ pkgs ? import {}}: + +pkgs.mkShell { + packages = with pkgs; [ gdb zlib curl.dev SDL2 SDL2_image openssl.dev cmake gnumake clang pkg-config ]; +} diff --git a/thirdparty/cjson/CMakeLists.txt b/thirdparty/cjson/CMakeLists.txt new file mode 100644 index 0000000..ba5da3e --- /dev/null +++ b/thirdparty/cjson/CMakeLists.txt @@ -0,0 +1,8 @@ +project(cJSON LANGUAGES C) + +add_library(cJSON STATIC + ${CMAKE_CURRENT_SOURCE_DIR}/cJSON.C + ${CMAKE_CURRENT_SOURCE_DIR}/cJSON_Utils.C +) + +target_include_directories(cJSON PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}) \ No newline at end of file diff --git a/thirdparty/cjson/cJSON.c b/thirdparty/cjson/cJSON.c new file mode 100644 index 0000000..6e4fb0d --- /dev/null +++ b/thirdparty/cjson/cJSON.c @@ -0,0 +1,3191 @@ +/* + Copyright (c) 2009-2017 Dave Gamble and cJSON contributors + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + THE SOFTWARE. +*/ + +/* cJSON */ +/* JSON parser in C. */ + +/* disable warnings about old C89 functions in MSVC */ +#if !defined(_CRT_SECURE_NO_DEPRECATE) && defined(_MSC_VER) +#define _CRT_SECURE_NO_DEPRECATE +#endif + +#ifdef __GNUC__ +#pragma GCC visibility push(default) +#endif +#if defined(_MSC_VER) +#pragma warning (push) +/* disable warning about single line comments in system headers */ +#pragma warning (disable : 4001) +#endif + +#include +#include +#include +#include +#include +#include +#include + +#ifdef ENABLE_LOCALES +#include +#endif + +#if defined(_MSC_VER) +#pragma warning (pop) +#endif +#ifdef __GNUC__ +#pragma GCC visibility pop +#endif + +#include "cJSON.h" + +/* define our own boolean type */ +#ifdef true +#undef true +#endif +#define true ((cJSON_bool)1) + +#ifdef false +#undef false +#endif +#define false ((cJSON_bool)0) + +/* define isnan and isinf for ANSI C, if in C99 or above, isnan and isinf has been defined in math.h */ +#ifndef isinf +#define isinf(d) (isnan((d - d)) && !isnan(d)) +#endif +#ifndef isnan +#define isnan(d) (d != d) +#endif + +#ifndef NAN +#ifdef _WIN32 +#define NAN sqrt(-1.0) +#else +#define NAN 0.0/0.0 +#endif +#endif + +typedef struct { + const unsigned char *json; + size_t position; +} error; +static error global_error = { NULL, 0 }; + +CJSON_PUBLIC(const char *) cJSON_GetErrorPtr(void) +{ + return (const char*) (global_error.json + global_error.position); +} + +CJSON_PUBLIC(char *) cJSON_GetStringValue(const cJSON * const item) +{ + if (!cJSON_IsString(item)) + { + return NULL; + } + + return item->valuestring; +} + +CJSON_PUBLIC(double) cJSON_GetNumberValue(const cJSON * const item) +{ + if (!cJSON_IsNumber(item)) + { + return (double) NAN; + } + + return item->valuedouble; +} + +/* This is a safeguard to prevent copy-pasters from using incompatible C and header files */ +#if (CJSON_VERSION_MAJOR != 1) || (CJSON_VERSION_MINOR != 7) || (CJSON_VERSION_PATCH != 19) + #error cJSON.h and cJSON.c have different versions. Make sure that both have the same. +#endif + +CJSON_PUBLIC(const char*) cJSON_Version(void) +{ + static char version[15]; + sprintf(version, "%i.%i.%i", CJSON_VERSION_MAJOR, CJSON_VERSION_MINOR, CJSON_VERSION_PATCH); + + return version; +} + +/* Case insensitive string comparison, doesn't consider two NULL pointers equal though */ +static int case_insensitive_strcmp(const unsigned char *string1, const unsigned char *string2) +{ + if ((string1 == NULL) || (string2 == NULL)) + { + return 1; + } + + if (string1 == string2) + { + return 0; + } + + for(; tolower(*string1) == tolower(*string2); (void)string1++, string2++) + { + if (*string1 == '\0') + { + return 0; + } + } + + return tolower(*string1) - tolower(*string2); +} + +typedef struct internal_hooks +{ + void *(CJSON_CDECL *allocate)(size_t size); + void (CJSON_CDECL *deallocate)(void *pointer); + void *(CJSON_CDECL *reallocate)(void *pointer, size_t size); +} internal_hooks; + +#if defined(_MSC_VER) +/* work around MSVC error C2322: '...' address of dllimport '...' is not static */ +static void * CJSON_CDECL internal_malloc(size_t size) +{ + return malloc(size); +} +static void CJSON_CDECL internal_free(void *pointer) +{ + free(pointer); +} +static void * CJSON_CDECL internal_realloc(void *pointer, size_t size) +{ + return realloc(pointer, size); +} +#else +#define internal_malloc malloc +#define internal_free free +#define internal_realloc realloc +#endif + +/* strlen of character literals resolved at compile time */ +#define static_strlen(string_literal) (sizeof(string_literal) - sizeof("")) + +static internal_hooks global_hooks = { internal_malloc, internal_free, internal_realloc }; + +static unsigned char* cJSON_strdup(const unsigned char* string, const internal_hooks * const hooks) +{ + size_t length = 0; + unsigned char *copy = NULL; + + if (string == NULL) + { + return NULL; + } + + length = strlen((const char*)string) + sizeof(""); + copy = (unsigned char*)hooks->allocate(length); + if (copy == NULL) + { + return NULL; + } + memcpy(copy, string, length); + + return copy; +} + +CJSON_PUBLIC(void) cJSON_InitHooks(cJSON_Hooks* hooks) +{ + if (hooks == NULL) + { + /* Reset hooks */ + global_hooks.allocate = malloc; + global_hooks.deallocate = free; + global_hooks.reallocate = realloc; + return; + } + + global_hooks.allocate = malloc; + if (hooks->malloc_fn != NULL) + { + global_hooks.allocate = hooks->malloc_fn; + } + + global_hooks.deallocate = free; + if (hooks->free_fn != NULL) + { + global_hooks.deallocate = hooks->free_fn; + } + + /* use realloc only if both free and malloc are used */ + global_hooks.reallocate = NULL; + if ((global_hooks.allocate == malloc) && (global_hooks.deallocate == free)) + { + global_hooks.reallocate = realloc; + } +} + +/* Internal constructor. */ +static cJSON *cJSON_New_Item(const internal_hooks * const hooks) +{ + cJSON* node = (cJSON*)hooks->allocate(sizeof(cJSON)); + if (node) + { + memset(node, '\0', sizeof(cJSON)); + } + + return node; +} + +/* Delete a cJSON structure. */ +CJSON_PUBLIC(void) cJSON_Delete(cJSON *item) +{ + cJSON *next = NULL; + while (item != NULL) + { + next = item->next; + if (!(item->type & cJSON_IsReference) && (item->child != NULL)) + { + cJSON_Delete(item->child); + } + if (!(item->type & cJSON_IsReference) && (item->valuestring != NULL)) + { + global_hooks.deallocate(item->valuestring); + item->valuestring = NULL; + } + if (!(item->type & cJSON_StringIsConst) && (item->string != NULL)) + { + global_hooks.deallocate(item->string); + item->string = NULL; + } + global_hooks.deallocate(item); + item = next; + } +} + +/* get the decimal point character of the current locale */ +static unsigned char get_decimal_point(void) +{ +#ifdef ENABLE_LOCALES + struct lconv *lconv = localeconv(); + return (unsigned char) lconv->decimal_point[0]; +#else + return '.'; +#endif +} + +typedef struct +{ + const unsigned char *content; + size_t length; + size_t offset; + size_t depth; /* How deeply nested (in arrays/objects) is the input at the current offset. */ + internal_hooks hooks; +} parse_buffer; + +/* check if the given size is left to read in a given parse buffer (starting with 1) */ +#define can_read(buffer, size) ((buffer != NULL) && (((buffer)->offset + size) <= (buffer)->length)) +/* check if the buffer can be accessed at the given index (starting with 0) */ +#define can_access_at_index(buffer, index) ((buffer != NULL) && (((buffer)->offset + index) < (buffer)->length)) +#define cannot_access_at_index(buffer, index) (!can_access_at_index(buffer, index)) +/* get a pointer to the buffer at the position */ +#define buffer_at_offset(buffer) ((buffer)->content + (buffer)->offset) + +/* Parse the input text to generate a number, and populate the result into item. */ +static cJSON_bool parse_number(cJSON * const item, parse_buffer * const input_buffer) +{ + double number = 0; + unsigned char *after_end = NULL; + unsigned char *number_c_string; + unsigned char decimal_point = get_decimal_point(); + size_t i = 0; + size_t number_string_length = 0; + cJSON_bool has_decimal_point = false; + + if ((input_buffer == NULL) || (input_buffer->content == NULL)) + { + return false; + } + + /* copy the number into a temporary buffer and replace '.' with the decimal point + * of the current locale (for strtod) + * This also takes care of '\0' not necessarily being available for marking the end of the input */ + for (i = 0; can_access_at_index(input_buffer, i); i++) + { + switch (buffer_at_offset(input_buffer)[i]) + { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case '+': + case '-': + case 'e': + case 'E': + number_string_length++; + break; + + case '.': + number_string_length++; + has_decimal_point = true; + break; + + default: + goto loop_end; + } + } +loop_end: + /* malloc for temporary buffer, add 1 for '\0' */ + number_c_string = (unsigned char *) input_buffer->hooks.allocate(number_string_length + 1); + if (number_c_string == NULL) + { + return false; /* allocation failure */ + } + + memcpy(number_c_string, buffer_at_offset(input_buffer), number_string_length); + number_c_string[number_string_length] = '\0'; + + if (has_decimal_point) + { + for (i = 0; i < number_string_length; i++) + { + if (number_c_string[i] == '.') + { + /* replace '.' with the decimal point of the current locale (for strtod) */ + number_c_string[i] = decimal_point; + } + } + } + + number = strtod((const char*)number_c_string, (char**)&after_end); + if (number_c_string == after_end) + { + /* free the temporary buffer */ + input_buffer->hooks.deallocate(number_c_string); + return false; /* parse_error */ + } + + item->valuedouble = number; + + /* use saturation in case of overflow */ + if (number >= INT_MAX) + { + item->valueint = INT_MAX; + } + else if (number <= (double)INT_MIN) + { + item->valueint = INT_MIN; + } + else + { + item->valueint = (int)number; + } + + item->type = cJSON_Number; + + input_buffer->offset += (size_t)(after_end - number_c_string); + /* free the temporary buffer */ + input_buffer->hooks.deallocate(number_c_string); + return true; +} + +/* don't ask me, but the original cJSON_SetNumberValue returns an integer or double */ +CJSON_PUBLIC(double) cJSON_SetNumberHelper(cJSON *object, double number) +{ + if (number >= INT_MAX) + { + object->valueint = INT_MAX; + } + else if (number <= (double)INT_MIN) + { + object->valueint = INT_MIN; + } + else + { + object->valueint = (int)number; + } + + return object->valuedouble = number; +} + +/* Note: when passing a NULL valuestring, cJSON_SetValuestring treats this as an error and return NULL */ +CJSON_PUBLIC(char*) cJSON_SetValuestring(cJSON *object, const char *valuestring) +{ + char *copy = NULL; + size_t v1_len; + size_t v2_len; + /* if object's type is not cJSON_String or is cJSON_IsReference, it should not set valuestring */ + if ((object == NULL) || !(object->type & cJSON_String) || (object->type & cJSON_IsReference)) + { + return NULL; + } + /* return NULL if the object is corrupted or valuestring is NULL */ + if (object->valuestring == NULL || valuestring == NULL) + { + return NULL; + } + + v1_len = strlen(valuestring); + v2_len = strlen(object->valuestring); + + if (v1_len <= v2_len) + { + /* strcpy does not handle overlapping string: [X1, X2] [Y1, Y2] => X2 < Y1 or Y2 < X1 */ + if (!( valuestring + v1_len < object->valuestring || object->valuestring + v2_len < valuestring )) + { + return NULL; + } + strcpy(object->valuestring, valuestring); + return object->valuestring; + } + copy = (char*) cJSON_strdup((const unsigned char*)valuestring, &global_hooks); + if (copy == NULL) + { + return NULL; + } + if (object->valuestring != NULL) + { + cJSON_free(object->valuestring); + } + object->valuestring = copy; + + return copy; +} + +typedef struct +{ + unsigned char *buffer; + size_t length; + size_t offset; + size_t depth; /* current nesting depth (for formatted printing) */ + cJSON_bool noalloc; + cJSON_bool format; /* is this print a formatted print */ + internal_hooks hooks; +} printbuffer; + +/* realloc printbuffer if necessary to have at least "needed" bytes more */ +static unsigned char* ensure(printbuffer * const p, size_t needed) +{ + unsigned char *newbuffer = NULL; + size_t newsize = 0; + + if ((p == NULL) || (p->buffer == NULL)) + { + return NULL; + } + + if ((p->length > 0) && (p->offset >= p->length)) + { + /* make sure that offset is valid */ + return NULL; + } + + if (needed > INT_MAX) + { + /* sizes bigger than INT_MAX are currently not supported */ + return NULL; + } + + needed += p->offset + 1; + if (needed <= p->length) + { + return p->buffer + p->offset; + } + + if (p->noalloc) { + return NULL; + } + + /* calculate new buffer size */ + if (needed > (INT_MAX / 2)) + { + /* overflow of int, use INT_MAX if possible */ + if (needed <= INT_MAX) + { + newsize = INT_MAX; + } + else + { + return NULL; + } + } + else + { + newsize = needed * 2; + } + + if (p->hooks.reallocate != NULL) + { + /* reallocate with realloc if available */ + newbuffer = (unsigned char*)p->hooks.reallocate(p->buffer, newsize); + if (newbuffer == NULL) + { + p->hooks.deallocate(p->buffer); + p->length = 0; + p->buffer = NULL; + + return NULL; + } + } + else + { + /* otherwise reallocate manually */ + newbuffer = (unsigned char*)p->hooks.allocate(newsize); + if (!newbuffer) + { + p->hooks.deallocate(p->buffer); + p->length = 0; + p->buffer = NULL; + + return NULL; + } + + memcpy(newbuffer, p->buffer, p->offset + 1); + p->hooks.deallocate(p->buffer); + } + p->length = newsize; + p->buffer = newbuffer; + + return newbuffer + p->offset; +} + +/* calculate the new length of the string in a printbuffer and update the offset */ +static void update_offset(printbuffer * const buffer) +{ + const unsigned char *buffer_pointer = NULL; + if ((buffer == NULL) || (buffer->buffer == NULL)) + { + return; + } + buffer_pointer = buffer->buffer + buffer->offset; + + buffer->offset += strlen((const char*)buffer_pointer); +} + +/* securely comparison of floating-point variables */ +static cJSON_bool compare_double(double a, double b) +{ + double maxVal = fabs(a) > fabs(b) ? fabs(a) : fabs(b); + return (fabs(a - b) <= maxVal * DBL_EPSILON); +} + +/* Render the number nicely from the given item into a string. */ +static cJSON_bool print_number(const cJSON * const item, printbuffer * const output_buffer) +{ + unsigned char *output_pointer = NULL; + double d = item->valuedouble; + int length = 0; + size_t i = 0; + unsigned char number_buffer[26] = {0}; /* temporary buffer to print the number into */ + unsigned char decimal_point = get_decimal_point(); + double test = 0.0; + + if (output_buffer == NULL) + { + return false; + } + + /* This checks for NaN and Infinity */ + if (isnan(d) || isinf(d)) + { + length = sprintf((char*)number_buffer, "null"); + } + else if(d == (double)item->valueint) + { + length = sprintf((char*)number_buffer, "%d", item->valueint); + } + else + { + /* Try 15 decimal places of precision to avoid nonsignificant nonzero digits */ + length = sprintf((char*)number_buffer, "%1.15g", d); + + /* Check whether the original double can be recovered */ + if ((sscanf((char*)number_buffer, "%lg", &test) != 1) || !compare_double((double)test, d)) + { + /* If not, print with 17 decimal places of precision */ + length = sprintf((char*)number_buffer, "%1.17g", d); + } + } + + /* sprintf failed or buffer overrun occurred */ + if ((length < 0) || (length > (int)(sizeof(number_buffer) - 1))) + { + return false; + } + + /* reserve appropriate space in the output */ + output_pointer = ensure(output_buffer, (size_t)length + sizeof("")); + if (output_pointer == NULL) + { + return false; + } + + /* copy the printed number to the output and replace locale + * dependent decimal point with '.' */ + for (i = 0; i < ((size_t)length); i++) + { + if (number_buffer[i] == decimal_point) + { + output_pointer[i] = '.'; + continue; + } + + output_pointer[i] = number_buffer[i]; + } + output_pointer[i] = '\0'; + + output_buffer->offset += (size_t)length; + + return true; +} + +/* parse 4 digit hexadecimal number */ +static unsigned parse_hex4(const unsigned char * const input) +{ + unsigned int h = 0; + size_t i = 0; + + for (i = 0; i < 4; i++) + { + /* parse digit */ + if ((input[i] >= '0') && (input[i] <= '9')) + { + h += (unsigned int) input[i] - '0'; + } + else if ((input[i] >= 'A') && (input[i] <= 'F')) + { + h += (unsigned int) 10 + input[i] - 'A'; + } + else if ((input[i] >= 'a') && (input[i] <= 'f')) + { + h += (unsigned int) 10 + input[i] - 'a'; + } + else /* invalid */ + { + return 0; + } + + if (i < 3) + { + /* shift left to make place for the next nibble */ + h = h << 4; + } + } + + return h; +} + +/* converts a UTF-16 literal to UTF-8 + * A literal can be one or two sequences of the form \uXXXX */ +static unsigned char utf16_literal_to_utf8(const unsigned char * const input_pointer, const unsigned char * const input_end, unsigned char **output_pointer) +{ + long unsigned int codepoint = 0; + unsigned int first_code = 0; + const unsigned char *first_sequence = input_pointer; + unsigned char utf8_length = 0; + unsigned char utf8_position = 0; + unsigned char sequence_length = 0; + unsigned char first_byte_mark = 0; + + if ((input_end - first_sequence) < 6) + { + /* input ends unexpectedly */ + goto fail; + } + + /* get the first utf16 sequence */ + first_code = parse_hex4(first_sequence + 2); + + /* check that the code is valid */ + if (((first_code >= 0xDC00) && (first_code <= 0xDFFF))) + { + goto fail; + } + + /* UTF16 surrogate pair */ + if ((first_code >= 0xD800) && (first_code <= 0xDBFF)) + { + const unsigned char *second_sequence = first_sequence + 6; + unsigned int second_code = 0; + sequence_length = 12; /* \uXXXX\uXXXX */ + + if ((input_end - second_sequence) < 6) + { + /* input ends unexpectedly */ + goto fail; + } + + if ((second_sequence[0] != '\\') || (second_sequence[1] != 'u')) + { + /* missing second half of the surrogate pair */ + goto fail; + } + + /* get the second utf16 sequence */ + second_code = parse_hex4(second_sequence + 2); + /* check that the code is valid */ + if ((second_code < 0xDC00) || (second_code > 0xDFFF)) + { + /* invalid second half of the surrogate pair */ + goto fail; + } + + + /* calculate the unicode codepoint from the surrogate pair */ + codepoint = 0x10000 + (((first_code & 0x3FF) << 10) | (second_code & 0x3FF)); + } + else + { + sequence_length = 6; /* \uXXXX */ + codepoint = first_code; + } + + /* encode as UTF-8 + * takes at maximum 4 bytes to encode: + * 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx */ + if (codepoint < 0x80) + { + /* normal ascii, encoding 0xxxxxxx */ + utf8_length = 1; + } + else if (codepoint < 0x800) + { + /* two bytes, encoding 110xxxxx 10xxxxxx */ + utf8_length = 2; + first_byte_mark = 0xC0; /* 11000000 */ + } + else if (codepoint < 0x10000) + { + /* three bytes, encoding 1110xxxx 10xxxxxx 10xxxxxx */ + utf8_length = 3; + first_byte_mark = 0xE0; /* 11100000 */ + } + else if (codepoint <= 0x10FFFF) + { + /* four bytes, encoding 1110xxxx 10xxxxxx 10xxxxxx 10xxxxxx */ + utf8_length = 4; + first_byte_mark = 0xF0; /* 11110000 */ + } + else + { + /* invalid unicode codepoint */ + goto fail; + } + + /* encode as utf8 */ + for (utf8_position = (unsigned char)(utf8_length - 1); utf8_position > 0; utf8_position--) + { + /* 10xxxxxx */ + (*output_pointer)[utf8_position] = (unsigned char)((codepoint | 0x80) & 0xBF); + codepoint >>= 6; + } + /* encode first byte */ + if (utf8_length > 1) + { + (*output_pointer)[0] = (unsigned char)((codepoint | first_byte_mark) & 0xFF); + } + else + { + (*output_pointer)[0] = (unsigned char)(codepoint & 0x7F); + } + + *output_pointer += utf8_length; + + return sequence_length; + +fail: + return 0; +} + +/* Parse the input text into an unescaped cinput, and populate item. */ +static cJSON_bool parse_string(cJSON * const item, parse_buffer * const input_buffer) +{ + const unsigned char *input_pointer = buffer_at_offset(input_buffer) + 1; + const unsigned char *input_end = buffer_at_offset(input_buffer) + 1; + unsigned char *output_pointer = NULL; + unsigned char *output = NULL; + + /* not a string */ + if (buffer_at_offset(input_buffer)[0] != '\"') + { + goto fail; + } + + { + /* calculate approximate size of the output (overestimate) */ + size_t allocation_length = 0; + size_t skipped_bytes = 0; + while (((size_t)(input_end - input_buffer->content) < input_buffer->length) && (*input_end != '\"')) + { + /* is escape sequence */ + if (input_end[0] == '\\') + { + if ((size_t)(input_end + 1 - input_buffer->content) >= input_buffer->length) + { + /* prevent buffer overflow when last input character is a backslash */ + goto fail; + } + skipped_bytes++; + input_end++; + } + input_end++; + } + if (((size_t)(input_end - input_buffer->content) >= input_buffer->length) || (*input_end != '\"')) + { + goto fail; /* string ended unexpectedly */ + } + + /* This is at most how much we need for the output */ + allocation_length = (size_t) (input_end - buffer_at_offset(input_buffer)) - skipped_bytes; + output = (unsigned char*)input_buffer->hooks.allocate(allocation_length + sizeof("")); + if (output == NULL) + { + goto fail; /* allocation failure */ + } + } + + output_pointer = output; + /* loop through the string literal */ + while (input_pointer < input_end) + { + if (*input_pointer != '\\') + { + *output_pointer++ = *input_pointer++; + } + /* escape sequence */ + else + { + unsigned char sequence_length = 2; + if ((input_end - input_pointer) < 1) + { + goto fail; + } + + switch (input_pointer[1]) + { + case 'b': + *output_pointer++ = '\b'; + break; + case 'f': + *output_pointer++ = '\f'; + break; + case 'n': + *output_pointer++ = '\n'; + break; + case 'r': + *output_pointer++ = '\r'; + break; + case 't': + *output_pointer++ = '\t'; + break; + case '\"': + case '\\': + case '/': + *output_pointer++ = input_pointer[1]; + break; + + /* UTF-16 literal */ + case 'u': + sequence_length = utf16_literal_to_utf8(input_pointer, input_end, &output_pointer); + if (sequence_length == 0) + { + /* failed to convert UTF16-literal to UTF-8 */ + goto fail; + } + break; + + default: + goto fail; + } + input_pointer += sequence_length; + } + } + + /* zero terminate the output */ + *output_pointer = '\0'; + + item->type = cJSON_String; + item->valuestring = (char*)output; + + input_buffer->offset = (size_t) (input_end - input_buffer->content); + input_buffer->offset++; + + return true; + +fail: + if (output != NULL) + { + input_buffer->hooks.deallocate(output); + output = NULL; + } + + if (input_pointer != NULL) + { + input_buffer->offset = (size_t)(input_pointer - input_buffer->content); + } + + return false; +} + +/* Render the cstring provided to an escaped version that can be printed. */ +static cJSON_bool print_string_ptr(const unsigned char * const input, printbuffer * const output_buffer) +{ + const unsigned char *input_pointer = NULL; + unsigned char *output = NULL; + unsigned char *output_pointer = NULL; + size_t output_length = 0; + /* numbers of additional characters needed for escaping */ + size_t escape_characters = 0; + + if (output_buffer == NULL) + { + return false; + } + + /* empty string */ + if (input == NULL) + { + output = ensure(output_buffer, sizeof("\"\"")); + if (output == NULL) + { + return false; + } + strcpy((char*)output, "\"\""); + + return true; + } + + /* set "flag" to 1 if something needs to be escaped */ + for (input_pointer = input; *input_pointer; input_pointer++) + { + switch (*input_pointer) + { + case '\"': + case '\\': + case '\b': + case '\f': + case '\n': + case '\r': + case '\t': + /* one character escape sequence */ + escape_characters++; + break; + default: + if (*input_pointer < 32) + { + /* UTF-16 escape sequence uXXXX */ + escape_characters += 5; + } + break; + } + } + output_length = (size_t)(input_pointer - input) + escape_characters; + + output = ensure(output_buffer, output_length + sizeof("\"\"")); + if (output == NULL) + { + return false; + } + + /* no characters have to be escaped */ + if (escape_characters == 0) + { + output[0] = '\"'; + memcpy(output + 1, input, output_length); + output[output_length + 1] = '\"'; + output[output_length + 2] = '\0'; + + return true; + } + + output[0] = '\"'; + output_pointer = output + 1; + /* copy the string */ + for (input_pointer = input; *input_pointer != '\0'; (void)input_pointer++, output_pointer++) + { + if ((*input_pointer > 31) && (*input_pointer != '\"') && (*input_pointer != '\\')) + { + /* normal character, copy */ + *output_pointer = *input_pointer; + } + else + { + /* character needs to be escaped */ + *output_pointer++ = '\\'; + switch (*input_pointer) + { + case '\\': + *output_pointer = '\\'; + break; + case '\"': + *output_pointer = '\"'; + break; + case '\b': + *output_pointer = 'b'; + break; + case '\f': + *output_pointer = 'f'; + break; + case '\n': + *output_pointer = 'n'; + break; + case '\r': + *output_pointer = 'r'; + break; + case '\t': + *output_pointer = 't'; + break; + default: + /* escape and print as unicode codepoint */ + sprintf((char*)output_pointer, "u%04x", *input_pointer); + output_pointer += 4; + break; + } + } + } + output[output_length + 1] = '\"'; + output[output_length + 2] = '\0'; + + return true; +} + +/* Invoke print_string_ptr (which is useful) on an item. */ +static cJSON_bool print_string(const cJSON * const item, printbuffer * const p) +{ + return print_string_ptr((unsigned char*)item->valuestring, p); +} + +/* Predeclare these prototypes. */ +static cJSON_bool parse_value(cJSON * const item, parse_buffer * const input_buffer); +static cJSON_bool print_value(const cJSON * const item, printbuffer * const output_buffer); +static cJSON_bool parse_array(cJSON * const item, parse_buffer * const input_buffer); +static cJSON_bool print_array(const cJSON * const item, printbuffer * const output_buffer); +static cJSON_bool parse_object(cJSON * const item, parse_buffer * const input_buffer); +static cJSON_bool print_object(const cJSON * const item, printbuffer * const output_buffer); + +/* Utility to jump whitespace and cr/lf */ +static parse_buffer *buffer_skip_whitespace(parse_buffer * const buffer) +{ + if ((buffer == NULL) || (buffer->content == NULL)) + { + return NULL; + } + + if (cannot_access_at_index(buffer, 0)) + { + return buffer; + } + + while (can_access_at_index(buffer, 0) && (buffer_at_offset(buffer)[0] <= 32)) + { + buffer->offset++; + } + + if (buffer->offset == buffer->length) + { + buffer->offset--; + } + + return buffer; +} + +/* skip the UTF-8 BOM (byte order mark) if it is at the beginning of a buffer */ +static parse_buffer *skip_utf8_bom(parse_buffer * const buffer) +{ + if ((buffer == NULL) || (buffer->content == NULL) || (buffer->offset != 0)) + { + return NULL; + } + + if (can_access_at_index(buffer, 4) && (strncmp((const char*)buffer_at_offset(buffer), "\xEF\xBB\xBF", 3) == 0)) + { + buffer->offset += 3; + } + + return buffer; +} + +CJSON_PUBLIC(cJSON *) cJSON_ParseWithOpts(const char *value, const char **return_parse_end, cJSON_bool require_null_terminated) +{ + size_t buffer_length; + + if (NULL == value) + { + return NULL; + } + + /* Adding null character size due to require_null_terminated. */ + buffer_length = strlen(value) + sizeof(""); + + return cJSON_ParseWithLengthOpts(value, buffer_length, return_parse_end, require_null_terminated); +} + +/* Parse an object - create a new root, and populate. */ +CJSON_PUBLIC(cJSON *) cJSON_ParseWithLengthOpts(const char *value, size_t buffer_length, const char **return_parse_end, cJSON_bool require_null_terminated) +{ + parse_buffer buffer = { 0, 0, 0, 0, { 0, 0, 0 } }; + cJSON *item = NULL; + + /* reset error position */ + global_error.json = NULL; + global_error.position = 0; + + if (value == NULL || 0 == buffer_length) + { + goto fail; + } + + buffer.content = (const unsigned char*)value; + buffer.length = buffer_length; + buffer.offset = 0; + buffer.hooks = global_hooks; + + item = cJSON_New_Item(&global_hooks); + if (item == NULL) /* memory fail */ + { + goto fail; + } + + if (!parse_value(item, buffer_skip_whitespace(skip_utf8_bom(&buffer)))) + { + /* parse failure. ep is set. */ + goto fail; + } + + /* if we require null-terminated JSON without appended garbage, skip and then check for a null terminator */ + if (require_null_terminated) + { + buffer_skip_whitespace(&buffer); + if ((buffer.offset >= buffer.length) || buffer_at_offset(&buffer)[0] != '\0') + { + goto fail; + } + } + if (return_parse_end) + { + *return_parse_end = (const char*)buffer_at_offset(&buffer); + } + + return item; + +fail: + if (item != NULL) + { + cJSON_Delete(item); + } + + if (value != NULL) + { + error local_error; + local_error.json = (const unsigned char*)value; + local_error.position = 0; + + if (buffer.offset < buffer.length) + { + local_error.position = buffer.offset; + } + else if (buffer.length > 0) + { + local_error.position = buffer.length - 1; + } + + if (return_parse_end != NULL) + { + *return_parse_end = (const char*)local_error.json + local_error.position; + } + + global_error = local_error; + } + + return NULL; +} + +/* Default options for cJSON_Parse */ +CJSON_PUBLIC(cJSON *) cJSON_Parse(const char *value) +{ + return cJSON_ParseWithOpts(value, 0, 0); +} + +CJSON_PUBLIC(cJSON *) cJSON_ParseWithLength(const char *value, size_t buffer_length) +{ + return cJSON_ParseWithLengthOpts(value, buffer_length, 0, 0); +} + +#define cjson_min(a, b) (((a) < (b)) ? (a) : (b)) + +static unsigned char *print(const cJSON * const item, cJSON_bool format, const internal_hooks * const hooks) +{ + static const size_t default_buffer_size = 256; + printbuffer buffer[1]; + unsigned char *printed = NULL; + + memset(buffer, 0, sizeof(buffer)); + + /* create buffer */ + buffer->buffer = (unsigned char*) hooks->allocate(default_buffer_size); + buffer->length = default_buffer_size; + buffer->format = format; + buffer->hooks = *hooks; + if (buffer->buffer == NULL) + { + goto fail; + } + + /* print the value */ + if (!print_value(item, buffer)) + { + goto fail; + } + update_offset(buffer); + + /* check if reallocate is available */ + if (hooks->reallocate != NULL) + { + printed = (unsigned char*) hooks->reallocate(buffer->buffer, buffer->offset + 1); + if (printed == NULL) { + goto fail; + } + buffer->buffer = NULL; + } + else /* otherwise copy the JSON over to a new buffer */ + { + printed = (unsigned char*) hooks->allocate(buffer->offset + 1); + if (printed == NULL) + { + goto fail; + } + memcpy(printed, buffer->buffer, cjson_min(buffer->length, buffer->offset + 1)); + printed[buffer->offset] = '\0'; /* just to be sure */ + + /* free the buffer */ + hooks->deallocate(buffer->buffer); + buffer->buffer = NULL; + } + + return printed; + +fail: + if (buffer->buffer != NULL) + { + hooks->deallocate(buffer->buffer); + buffer->buffer = NULL; + } + + if (printed != NULL) + { + hooks->deallocate(printed); + printed = NULL; + } + + return NULL; +} + +/* Render a cJSON item/entity/structure to text. */ +CJSON_PUBLIC(char *) cJSON_Print(const cJSON *item) +{ + return (char*)print(item, true, &global_hooks); +} + +CJSON_PUBLIC(char *) cJSON_PrintUnformatted(const cJSON *item) +{ + return (char*)print(item, false, &global_hooks); +} + +CJSON_PUBLIC(char *) cJSON_PrintBuffered(const cJSON *item, int prebuffer, cJSON_bool fmt) +{ + printbuffer p = { 0, 0, 0, 0, 0, 0, { 0, 0, 0 } }; + + if (prebuffer < 0) + { + return NULL; + } + + p.buffer = (unsigned char*)global_hooks.allocate((size_t)prebuffer); + if (!p.buffer) + { + return NULL; + } + + p.length = (size_t)prebuffer; + p.offset = 0; + p.noalloc = false; + p.format = fmt; + p.hooks = global_hooks; + + if (!print_value(item, &p)) + { + global_hooks.deallocate(p.buffer); + p.buffer = NULL; + return NULL; + } + + return (char*)p.buffer; +} + +CJSON_PUBLIC(cJSON_bool) cJSON_PrintPreallocated(cJSON *item, char *buffer, const int length, const cJSON_bool format) +{ + printbuffer p = { 0, 0, 0, 0, 0, 0, { 0, 0, 0 } }; + + if ((length < 0) || (buffer == NULL)) + { + return false; + } + + p.buffer = (unsigned char*)buffer; + p.length = (size_t)length; + p.offset = 0; + p.noalloc = true; + p.format = format; + p.hooks = global_hooks; + + return print_value(item, &p); +} + +/* Parser core - when encountering text, process appropriately. */ +static cJSON_bool parse_value(cJSON * const item, parse_buffer * const input_buffer) +{ + if ((input_buffer == NULL) || (input_buffer->content == NULL)) + { + return false; /* no input */ + } + + /* parse the different types of values */ + /* null */ + if (can_read(input_buffer, 4) && (strncmp((const char*)buffer_at_offset(input_buffer), "null", 4) == 0)) + { + item->type = cJSON_NULL; + input_buffer->offset += 4; + return true; + } + /* false */ + if (can_read(input_buffer, 5) && (strncmp((const char*)buffer_at_offset(input_buffer), "false", 5) == 0)) + { + item->type = cJSON_False; + input_buffer->offset += 5; + return true; + } + /* true */ + if (can_read(input_buffer, 4) && (strncmp((const char*)buffer_at_offset(input_buffer), "true", 4) == 0)) + { + item->type = cJSON_True; + item->valueint = 1; + input_buffer->offset += 4; + return true; + } + /* string */ + if (can_access_at_index(input_buffer, 0) && (buffer_at_offset(input_buffer)[0] == '\"')) + { + return parse_string(item, input_buffer); + } + /* number */ + if (can_access_at_index(input_buffer, 0) && ((buffer_at_offset(input_buffer)[0] == '-') || ((buffer_at_offset(input_buffer)[0] >= '0') && (buffer_at_offset(input_buffer)[0] <= '9')))) + { + return parse_number(item, input_buffer); + } + /* array */ + if (can_access_at_index(input_buffer, 0) && (buffer_at_offset(input_buffer)[0] == '[')) + { + return parse_array(item, input_buffer); + } + /* object */ + if (can_access_at_index(input_buffer, 0) && (buffer_at_offset(input_buffer)[0] == '{')) + { + return parse_object(item, input_buffer); + } + + return false; +} + +/* Render a value to text. */ +static cJSON_bool print_value(const cJSON * const item, printbuffer * const output_buffer) +{ + unsigned char *output = NULL; + + if ((item == NULL) || (output_buffer == NULL)) + { + return false; + } + + switch ((item->type) & 0xFF) + { + case cJSON_NULL: + output = ensure(output_buffer, 5); + if (output == NULL) + { + return false; + } + strcpy((char*)output, "null"); + return true; + + case cJSON_False: + output = ensure(output_buffer, 6); + if (output == NULL) + { + return false; + } + strcpy((char*)output, "false"); + return true; + + case cJSON_True: + output = ensure(output_buffer, 5); + if (output == NULL) + { + return false; + } + strcpy((char*)output, "true"); + return true; + + case cJSON_Number: + return print_number(item, output_buffer); + + case cJSON_Raw: + { + size_t raw_length = 0; + if (item->valuestring == NULL) + { + return false; + } + + raw_length = strlen(item->valuestring) + sizeof(""); + output = ensure(output_buffer, raw_length); + if (output == NULL) + { + return false; + } + memcpy(output, item->valuestring, raw_length); + return true; + } + + case cJSON_String: + return print_string(item, output_buffer); + + case cJSON_Array: + return print_array(item, output_buffer); + + case cJSON_Object: + return print_object(item, output_buffer); + + default: + return false; + } +} + +/* Build an array from input text. */ +static cJSON_bool parse_array(cJSON * const item, parse_buffer * const input_buffer) +{ + cJSON *head = NULL; /* head of the linked list */ + cJSON *current_item = NULL; + + if (input_buffer->depth >= CJSON_NESTING_LIMIT) + { + return false; /* to deeply nested */ + } + input_buffer->depth++; + + if (buffer_at_offset(input_buffer)[0] != '[') + { + /* not an array */ + goto fail; + } + + input_buffer->offset++; + buffer_skip_whitespace(input_buffer); + if (can_access_at_index(input_buffer, 0) && (buffer_at_offset(input_buffer)[0] == ']')) + { + /* empty array */ + goto success; + } + + /* check if we skipped to the end of the buffer */ + if (cannot_access_at_index(input_buffer, 0)) + { + input_buffer->offset--; + goto fail; + } + + /* step back to character in front of the first element */ + input_buffer->offset--; + /* loop through the comma separated array elements */ + do + { + /* allocate next item */ + cJSON *new_item = cJSON_New_Item(&(input_buffer->hooks)); + if (new_item == NULL) + { + goto fail; /* allocation failure */ + } + + /* attach next item to list */ + if (head == NULL) + { + /* start the linked list */ + current_item = head = new_item; + } + else + { + /* add to the end and advance */ + current_item->next = new_item; + new_item->prev = current_item; + current_item = new_item; + } + + /* parse next value */ + input_buffer->offset++; + buffer_skip_whitespace(input_buffer); + if (!parse_value(current_item, input_buffer)) + { + goto fail; /* failed to parse value */ + } + buffer_skip_whitespace(input_buffer); + } + while (can_access_at_index(input_buffer, 0) && (buffer_at_offset(input_buffer)[0] == ',')); + + if (cannot_access_at_index(input_buffer, 0) || buffer_at_offset(input_buffer)[0] != ']') + { + goto fail; /* expected end of array */ + } + +success: + input_buffer->depth--; + + if (head != NULL) { + head->prev = current_item; + } + + item->type = cJSON_Array; + item->child = head; + + input_buffer->offset++; + + return true; + +fail: + if (head != NULL) + { + cJSON_Delete(head); + } + + return false; +} + +/* Render an array to text */ +static cJSON_bool print_array(const cJSON * const item, printbuffer * const output_buffer) +{ + unsigned char *output_pointer = NULL; + size_t length = 0; + cJSON *current_element = item->child; + + if (output_buffer == NULL) + { + return false; + } + + /* Compose the output array. */ + /* opening square bracket */ + output_pointer = ensure(output_buffer, 1); + if (output_pointer == NULL) + { + return false; + } + + *output_pointer = '['; + output_buffer->offset++; + output_buffer->depth++; + + while (current_element != NULL) + { + if (!print_value(current_element, output_buffer)) + { + return false; + } + update_offset(output_buffer); + if (current_element->next) + { + length = (size_t) (output_buffer->format ? 2 : 1); + output_pointer = ensure(output_buffer, length + 1); + if (output_pointer == NULL) + { + return false; + } + *output_pointer++ = ','; + if(output_buffer->format) + { + *output_pointer++ = ' '; + } + *output_pointer = '\0'; + output_buffer->offset += length; + } + current_element = current_element->next; + } + + output_pointer = ensure(output_buffer, 2); + if (output_pointer == NULL) + { + return false; + } + *output_pointer++ = ']'; + *output_pointer = '\0'; + output_buffer->depth--; + + return true; +} + +/* Build an object from the text. */ +static cJSON_bool parse_object(cJSON * const item, parse_buffer * const input_buffer) +{ + cJSON *head = NULL; /* linked list head */ + cJSON *current_item = NULL; + + if (input_buffer->depth >= CJSON_NESTING_LIMIT) + { + return false; /* to deeply nested */ + } + input_buffer->depth++; + + if (cannot_access_at_index(input_buffer, 0) || (buffer_at_offset(input_buffer)[0] != '{')) + { + goto fail; /* not an object */ + } + + input_buffer->offset++; + buffer_skip_whitespace(input_buffer); + if (can_access_at_index(input_buffer, 0) && (buffer_at_offset(input_buffer)[0] == '}')) + { + goto success; /* empty object */ + } + + /* check if we skipped to the end of the buffer */ + if (cannot_access_at_index(input_buffer, 0)) + { + input_buffer->offset--; + goto fail; + } + + /* step back to character in front of the first element */ + input_buffer->offset--; + /* loop through the comma separated array elements */ + do + { + /* allocate next item */ + cJSON *new_item = cJSON_New_Item(&(input_buffer->hooks)); + if (new_item == NULL) + { + goto fail; /* allocation failure */ + } + + /* attach next item to list */ + if (head == NULL) + { + /* start the linked list */ + current_item = head = new_item; + } + else + { + /* add to the end and advance */ + current_item->next = new_item; + new_item->prev = current_item; + current_item = new_item; + } + + if (cannot_access_at_index(input_buffer, 1)) + { + goto fail; /* nothing comes after the comma */ + } + + /* parse the name of the child */ + input_buffer->offset++; + buffer_skip_whitespace(input_buffer); + if (!parse_string(current_item, input_buffer)) + { + goto fail; /* failed to parse name */ + } + buffer_skip_whitespace(input_buffer); + + /* swap valuestring and string, because we parsed the name */ + current_item->string = current_item->valuestring; + current_item->valuestring = NULL; + + if (cannot_access_at_index(input_buffer, 0) || (buffer_at_offset(input_buffer)[0] != ':')) + { + goto fail; /* invalid object */ + } + + /* parse the value */ + input_buffer->offset++; + buffer_skip_whitespace(input_buffer); + if (!parse_value(current_item, input_buffer)) + { + goto fail; /* failed to parse value */ + } + buffer_skip_whitespace(input_buffer); + } + while (can_access_at_index(input_buffer, 0) && (buffer_at_offset(input_buffer)[0] == ',')); + + if (cannot_access_at_index(input_buffer, 0) || (buffer_at_offset(input_buffer)[0] != '}')) + { + goto fail; /* expected end of object */ + } + +success: + input_buffer->depth--; + + if (head != NULL) { + head->prev = current_item; + } + + item->type = cJSON_Object; + item->child = head; + + input_buffer->offset++; + return true; + +fail: + if (head != NULL) + { + cJSON_Delete(head); + } + + return false; +} + +/* Render an object to text. */ +static cJSON_bool print_object(const cJSON * const item, printbuffer * const output_buffer) +{ + unsigned char *output_pointer = NULL; + size_t length = 0; + cJSON *current_item = item->child; + + if (output_buffer == NULL) + { + return false; + } + + /* Compose the output: */ + length = (size_t) (output_buffer->format ? 2 : 1); /* fmt: {\n */ + output_pointer = ensure(output_buffer, length + 1); + if (output_pointer == NULL) + { + return false; + } + + *output_pointer++ = '{'; + output_buffer->depth++; + if (output_buffer->format) + { + *output_pointer++ = '\n'; + } + output_buffer->offset += length; + + while (current_item) + { + if (output_buffer->format) + { + size_t i; + output_pointer = ensure(output_buffer, output_buffer->depth); + if (output_pointer == NULL) + { + return false; + } + for (i = 0; i < output_buffer->depth; i++) + { + *output_pointer++ = '\t'; + } + output_buffer->offset += output_buffer->depth; + } + + /* print key */ + if (!print_string_ptr((unsigned char*)current_item->string, output_buffer)) + { + return false; + } + update_offset(output_buffer); + + length = (size_t) (output_buffer->format ? 2 : 1); + output_pointer = ensure(output_buffer, length); + if (output_pointer == NULL) + { + return false; + } + *output_pointer++ = ':'; + if (output_buffer->format) + { + *output_pointer++ = '\t'; + } + output_buffer->offset += length; + + /* print value */ + if (!print_value(current_item, output_buffer)) + { + return false; + } + update_offset(output_buffer); + + /* print comma if not last */ + length = ((size_t)(output_buffer->format ? 1 : 0) + (size_t)(current_item->next ? 1 : 0)); + output_pointer = ensure(output_buffer, length + 1); + if (output_pointer == NULL) + { + return false; + } + if (current_item->next) + { + *output_pointer++ = ','; + } + + if (output_buffer->format) + { + *output_pointer++ = '\n'; + } + *output_pointer = '\0'; + output_buffer->offset += length; + + current_item = current_item->next; + } + + output_pointer = ensure(output_buffer, output_buffer->format ? (output_buffer->depth + 1) : 2); + if (output_pointer == NULL) + { + return false; + } + if (output_buffer->format) + { + size_t i; + for (i = 0; i < (output_buffer->depth - 1); i++) + { + *output_pointer++ = '\t'; + } + } + *output_pointer++ = '}'; + *output_pointer = '\0'; + output_buffer->depth--; + + return true; +} + +/* Get Array size/item / object item. */ +CJSON_PUBLIC(int) cJSON_GetArraySize(const cJSON *array) +{ + cJSON *child = NULL; + size_t size = 0; + + if (array == NULL) + { + return 0; + } + + child = array->child; + + while(child != NULL) + { + size++; + child = child->next; + } + + /* FIXME: Can overflow here. Cannot be fixed without breaking the API */ + + return (int)size; +} + +static cJSON* get_array_item(const cJSON *array, size_t index) +{ + cJSON *current_child = NULL; + + if (array == NULL) + { + return NULL; + } + + current_child = array->child; + while ((current_child != NULL) && (index > 0)) + { + index--; + current_child = current_child->next; + } + + return current_child; +} + +CJSON_PUBLIC(cJSON *) cJSON_GetArrayItem(const cJSON *array, int index) +{ + if (index < 0) + { + return NULL; + } + + return get_array_item(array, (size_t)index); +} + +static cJSON *get_object_item(const cJSON * const object, const char * const name, const cJSON_bool case_sensitive) +{ + cJSON *current_element = NULL; + + if ((object == NULL) || (name == NULL)) + { + return NULL; + } + + current_element = object->child; + if (case_sensitive) + { + while ((current_element != NULL) && (current_element->string != NULL) && (strcmp(name, current_element->string) != 0)) + { + current_element = current_element->next; + } + } + else + { + while ((current_element != NULL) && (case_insensitive_strcmp((const unsigned char*)name, (const unsigned char*)(current_element->string)) != 0)) + { + current_element = current_element->next; + } + } + + if ((current_element == NULL) || (current_element->string == NULL)) { + return NULL; + } + + return current_element; +} + +CJSON_PUBLIC(cJSON *) cJSON_GetObjectItem(const cJSON * const object, const char * const string) +{ + return get_object_item(object, string, false); +} + +CJSON_PUBLIC(cJSON *) cJSON_GetObjectItemCaseSensitive(const cJSON * const object, const char * const string) +{ + return get_object_item(object, string, true); +} + +CJSON_PUBLIC(cJSON_bool) cJSON_HasObjectItem(const cJSON *object, const char *string) +{ + return cJSON_GetObjectItem(object, string) ? 1 : 0; +} + +/* Utility for array list handling. */ +static void suffix_object(cJSON *prev, cJSON *item) +{ + prev->next = item; + item->prev = prev; +} + +/* Utility for handling references. */ +static cJSON *create_reference(const cJSON *item, const internal_hooks * const hooks) +{ + cJSON *reference = NULL; + if (item == NULL) + { + return NULL; + } + + reference = cJSON_New_Item(hooks); + if (reference == NULL) + { + return NULL; + } + + memcpy(reference, item, sizeof(cJSON)); + reference->string = NULL; + reference->type |= cJSON_IsReference; + reference->next = reference->prev = NULL; + return reference; +} + +static cJSON_bool add_item_to_array(cJSON *array, cJSON *item) +{ + cJSON *child = NULL; + + if ((item == NULL) || (array == NULL) || (array == item)) + { + return false; + } + + child = array->child; + /* + * To find the last item in array quickly, we use prev in array + */ + if (child == NULL) + { + /* list is empty, start new one */ + array->child = item; + item->prev = item; + item->next = NULL; + } + else + { + /* append to the end */ + if (child->prev) + { + suffix_object(child->prev, item); + array->child->prev = item; + } + } + + return true; +} + +/* Add item to array/object. */ +CJSON_PUBLIC(cJSON_bool) cJSON_AddItemToArray(cJSON *array, cJSON *item) +{ + return add_item_to_array(array, item); +} + +#if defined(__clang__) || (defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 5)))) + #pragma GCC diagnostic push +#endif +#ifdef __GNUC__ +#pragma GCC diagnostic ignored "-Wcast-qual" +#endif +/* helper function to cast away const */ +static void* cast_away_const(const void* string) +{ + return (void*)string; +} +#if defined(__clang__) || (defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 5)))) + #pragma GCC diagnostic pop +#endif + + +static cJSON_bool add_item_to_object(cJSON * const object, const char * const string, cJSON * const item, const internal_hooks * const hooks, const cJSON_bool constant_key) +{ + char *new_key = NULL; + int new_type = cJSON_Invalid; + + if ((object == NULL) || (string == NULL) || (item == NULL) || (object == item)) + { + return false; + } + + if (constant_key) + { + new_key = (char*)cast_away_const(string); + new_type = item->type | cJSON_StringIsConst; + } + else + { + new_key = (char*)cJSON_strdup((const unsigned char*)string, hooks); + if (new_key == NULL) + { + return false; + } + + new_type = item->type & ~cJSON_StringIsConst; + } + + if (!(item->type & cJSON_StringIsConst) && (item->string != NULL)) + { + hooks->deallocate(item->string); + } + + item->string = new_key; + item->type = new_type; + + return add_item_to_array(object, item); +} + +CJSON_PUBLIC(cJSON_bool) cJSON_AddItemToObject(cJSON *object, const char *string, cJSON *item) +{ + return add_item_to_object(object, string, item, &global_hooks, false); +} + +/* Add an item to an object with constant string as key */ +CJSON_PUBLIC(cJSON_bool) cJSON_AddItemToObjectCS(cJSON *object, const char *string, cJSON *item) +{ + return add_item_to_object(object, string, item, &global_hooks, true); +} + +CJSON_PUBLIC(cJSON_bool) cJSON_AddItemReferenceToArray(cJSON *array, cJSON *item) +{ + if (array == NULL) + { + return false; + } + + return add_item_to_array(array, create_reference(item, &global_hooks)); +} + +CJSON_PUBLIC(cJSON_bool) cJSON_AddItemReferenceToObject(cJSON *object, const char *string, cJSON *item) +{ + if ((object == NULL) || (string == NULL)) + { + return false; + } + + return add_item_to_object(object, string, create_reference(item, &global_hooks), &global_hooks, false); +} + +CJSON_PUBLIC(cJSON*) cJSON_AddNullToObject(cJSON * const object, const char * const name) +{ + cJSON *null = cJSON_CreateNull(); + if (add_item_to_object(object, name, null, &global_hooks, false)) + { + return null; + } + + cJSON_Delete(null); + return NULL; +} + +CJSON_PUBLIC(cJSON*) cJSON_AddTrueToObject(cJSON * const object, const char * const name) +{ + cJSON *true_item = cJSON_CreateTrue(); + if (add_item_to_object(object, name, true_item, &global_hooks, false)) + { + return true_item; + } + + cJSON_Delete(true_item); + return NULL; +} + +CJSON_PUBLIC(cJSON*) cJSON_AddFalseToObject(cJSON * const object, const char * const name) +{ + cJSON *false_item = cJSON_CreateFalse(); + if (add_item_to_object(object, name, false_item, &global_hooks, false)) + { + return false_item; + } + + cJSON_Delete(false_item); + return NULL; +} + +CJSON_PUBLIC(cJSON*) cJSON_AddBoolToObject(cJSON * const object, const char * const name, const cJSON_bool boolean) +{ + cJSON *bool_item = cJSON_CreateBool(boolean); + if (add_item_to_object(object, name, bool_item, &global_hooks, false)) + { + return bool_item; + } + + cJSON_Delete(bool_item); + return NULL; +} + +CJSON_PUBLIC(cJSON*) cJSON_AddNumberToObject(cJSON * const object, const char * const name, const double number) +{ + cJSON *number_item = cJSON_CreateNumber(number); + if (add_item_to_object(object, name, number_item, &global_hooks, false)) + { + return number_item; + } + + cJSON_Delete(number_item); + return NULL; +} + +CJSON_PUBLIC(cJSON*) cJSON_AddStringToObject(cJSON * const object, const char * const name, const char * const string) +{ + cJSON *string_item = cJSON_CreateString(string); + if (add_item_to_object(object, name, string_item, &global_hooks, false)) + { + return string_item; + } + + cJSON_Delete(string_item); + return NULL; +} + +CJSON_PUBLIC(cJSON*) cJSON_AddRawToObject(cJSON * const object, const char * const name, const char * const raw) +{ + cJSON *raw_item = cJSON_CreateRaw(raw); + if (add_item_to_object(object, name, raw_item, &global_hooks, false)) + { + return raw_item; + } + + cJSON_Delete(raw_item); + return NULL; +} + +CJSON_PUBLIC(cJSON*) cJSON_AddObjectToObject(cJSON * const object, const char * const name) +{ + cJSON *object_item = cJSON_CreateObject(); + if (add_item_to_object(object, name, object_item, &global_hooks, false)) + { + return object_item; + } + + cJSON_Delete(object_item); + return NULL; +} + +CJSON_PUBLIC(cJSON*) cJSON_AddArrayToObject(cJSON * const object, const char * const name) +{ + cJSON *array = cJSON_CreateArray(); + if (add_item_to_object(object, name, array, &global_hooks, false)) + { + return array; + } + + cJSON_Delete(array); + return NULL; +} + +CJSON_PUBLIC(cJSON *) cJSON_DetachItemViaPointer(cJSON *parent, cJSON * const item) +{ + if ((parent == NULL) || (item == NULL) || (item != parent->child && item->prev == NULL)) + { + return NULL; + } + + if (item != parent->child) + { + /* not the first element */ + item->prev->next = item->next; + } + if (item->next != NULL) + { + /* not the last element */ + item->next->prev = item->prev; + } + + if (item == parent->child) + { + /* first element */ + parent->child = item->next; + } + else if (item->next == NULL) + { + /* last element */ + parent->child->prev = item->prev; + } + + /* make sure the detached item doesn't point anywhere anymore */ + item->prev = NULL; + item->next = NULL; + + return item; +} + +CJSON_PUBLIC(cJSON *) cJSON_DetachItemFromArray(cJSON *array, int which) +{ + if (which < 0) + { + return NULL; + } + + return cJSON_DetachItemViaPointer(array, get_array_item(array, (size_t)which)); +} + +CJSON_PUBLIC(void) cJSON_DeleteItemFromArray(cJSON *array, int which) +{ + cJSON_Delete(cJSON_DetachItemFromArray(array, which)); +} + +CJSON_PUBLIC(cJSON *) cJSON_DetachItemFromObject(cJSON *object, const char *string) +{ + cJSON *to_detach = cJSON_GetObjectItem(object, string); + + return cJSON_DetachItemViaPointer(object, to_detach); +} + +CJSON_PUBLIC(cJSON *) cJSON_DetachItemFromObjectCaseSensitive(cJSON *object, const char *string) +{ + cJSON *to_detach = cJSON_GetObjectItemCaseSensitive(object, string); + + return cJSON_DetachItemViaPointer(object, to_detach); +} + +CJSON_PUBLIC(void) cJSON_DeleteItemFromObject(cJSON *object, const char *string) +{ + cJSON_Delete(cJSON_DetachItemFromObject(object, string)); +} + +CJSON_PUBLIC(void) cJSON_DeleteItemFromObjectCaseSensitive(cJSON *object, const char *string) +{ + cJSON_Delete(cJSON_DetachItemFromObjectCaseSensitive(object, string)); +} + +/* Replace array/object items with new ones. */ +CJSON_PUBLIC(cJSON_bool) cJSON_InsertItemInArray(cJSON *array, int which, cJSON *newitem) +{ + cJSON *after_inserted = NULL; + + if (which < 0 || newitem == NULL) + { + return false; + } + + after_inserted = get_array_item(array, (size_t)which); + if (after_inserted == NULL) + { + return add_item_to_array(array, newitem); + } + + if (after_inserted != array->child && after_inserted->prev == NULL) { + /* return false if after_inserted is a corrupted array item */ + return false; + } + + newitem->next = after_inserted; + newitem->prev = after_inserted->prev; + after_inserted->prev = newitem; + if (after_inserted == array->child) + { + array->child = newitem; + } + else + { + newitem->prev->next = newitem; + } + return true; +} + +CJSON_PUBLIC(cJSON_bool) cJSON_ReplaceItemViaPointer(cJSON * const parent, cJSON * const item, cJSON * replacement) +{ + if ((parent == NULL) || (parent->child == NULL) || (replacement == NULL) || (item == NULL)) + { + return false; + } + + if (replacement == item) + { + return true; + } + + replacement->next = item->next; + replacement->prev = item->prev; + + if (replacement->next != NULL) + { + replacement->next->prev = replacement; + } + if (parent->child == item) + { + if (parent->child->prev == parent->child) + { + replacement->prev = replacement; + } + parent->child = replacement; + } + else + { /* + * To find the last item in array quickly, we use prev in array. + * We can't modify the last item's next pointer where this item was the parent's child + */ + if (replacement->prev != NULL) + { + replacement->prev->next = replacement; + } + if (replacement->next == NULL) + { + parent->child->prev = replacement; + } + } + + item->next = NULL; + item->prev = NULL; + cJSON_Delete(item); + + return true; +} + +CJSON_PUBLIC(cJSON_bool) cJSON_ReplaceItemInArray(cJSON *array, int which, cJSON *newitem) +{ + if (which < 0) + { + return false; + } + + return cJSON_ReplaceItemViaPointer(array, get_array_item(array, (size_t)which), newitem); +} + +static cJSON_bool replace_item_in_object(cJSON *object, const char *string, cJSON *replacement, cJSON_bool case_sensitive) +{ + if ((replacement == NULL) || (string == NULL)) + { + return false; + } + + /* replace the name in the replacement */ + if (!(replacement->type & cJSON_StringIsConst) && (replacement->string != NULL)) + { + cJSON_free(replacement->string); + } + replacement->string = (char*)cJSON_strdup((const unsigned char*)string, &global_hooks); + if (replacement->string == NULL) + { + return false; + } + + replacement->type &= ~cJSON_StringIsConst; + + return cJSON_ReplaceItemViaPointer(object, get_object_item(object, string, case_sensitive), replacement); +} + +CJSON_PUBLIC(cJSON_bool) cJSON_ReplaceItemInObject(cJSON *object, const char *string, cJSON *newitem) +{ + return replace_item_in_object(object, string, newitem, false); +} + +CJSON_PUBLIC(cJSON_bool) cJSON_ReplaceItemInObjectCaseSensitive(cJSON *object, const char *string, cJSON *newitem) +{ + return replace_item_in_object(object, string, newitem, true); +} + +/* Create basic types: */ +CJSON_PUBLIC(cJSON *) cJSON_CreateNull(void) +{ + cJSON *item = cJSON_New_Item(&global_hooks); + if(item) + { + item->type = cJSON_NULL; + } + + return item; +} + +CJSON_PUBLIC(cJSON *) cJSON_CreateTrue(void) +{ + cJSON *item = cJSON_New_Item(&global_hooks); + if(item) + { + item->type = cJSON_True; + } + + return item; +} + +CJSON_PUBLIC(cJSON *) cJSON_CreateFalse(void) +{ + cJSON *item = cJSON_New_Item(&global_hooks); + if(item) + { + item->type = cJSON_False; + } + + return item; +} + +CJSON_PUBLIC(cJSON *) cJSON_CreateBool(cJSON_bool boolean) +{ + cJSON *item = cJSON_New_Item(&global_hooks); + if(item) + { + item->type = boolean ? cJSON_True : cJSON_False; + } + + return item; +} + +CJSON_PUBLIC(cJSON *) cJSON_CreateNumber(double num) +{ + cJSON *item = cJSON_New_Item(&global_hooks); + if(item) + { + item->type = cJSON_Number; + item->valuedouble = num; + + /* use saturation in case of overflow */ + if (num >= INT_MAX) + { + item->valueint = INT_MAX; + } + else if (num <= (double)INT_MIN) + { + item->valueint = INT_MIN; + } + else + { + item->valueint = (int)num; + } + } + + return item; +} + +CJSON_PUBLIC(cJSON *) cJSON_CreateString(const char *string) +{ + cJSON *item = cJSON_New_Item(&global_hooks); + if(item) + { + item->type = cJSON_String; + item->valuestring = (char*)cJSON_strdup((const unsigned char*)string, &global_hooks); + if(!item->valuestring) + { + cJSON_Delete(item); + return NULL; + } + } + + return item; +} + +CJSON_PUBLIC(cJSON *) cJSON_CreateStringReference(const char *string) +{ + cJSON *item = cJSON_New_Item(&global_hooks); + if (item != NULL) + { + item->type = cJSON_String | cJSON_IsReference; + item->valuestring = (char*)cast_away_const(string); + } + + return item; +} + +CJSON_PUBLIC(cJSON *) cJSON_CreateObjectReference(const cJSON *child) +{ + cJSON *item = cJSON_New_Item(&global_hooks); + if (item != NULL) { + item->type = cJSON_Object | cJSON_IsReference; + item->child = (cJSON*)cast_away_const(child); + } + + return item; +} + +CJSON_PUBLIC(cJSON *) cJSON_CreateArrayReference(const cJSON *child) { + cJSON *item = cJSON_New_Item(&global_hooks); + if (item != NULL) { + item->type = cJSON_Array | cJSON_IsReference; + item->child = (cJSON*)cast_away_const(child); + } + + return item; +} + +CJSON_PUBLIC(cJSON *) cJSON_CreateRaw(const char *raw) +{ + cJSON *item = cJSON_New_Item(&global_hooks); + if(item) + { + item->type = cJSON_Raw; + item->valuestring = (char*)cJSON_strdup((const unsigned char*)raw, &global_hooks); + if(!item->valuestring) + { + cJSON_Delete(item); + return NULL; + } + } + + return item; +} + +CJSON_PUBLIC(cJSON *) cJSON_CreateArray(void) +{ + cJSON *item = cJSON_New_Item(&global_hooks); + if(item) + { + item->type=cJSON_Array; + } + + return item; +} + +CJSON_PUBLIC(cJSON *) cJSON_CreateObject(void) +{ + cJSON *item = cJSON_New_Item(&global_hooks); + if (item) + { + item->type = cJSON_Object; + } + + return item; +} + +/* Create Arrays: */ +CJSON_PUBLIC(cJSON *) cJSON_CreateIntArray(const int *numbers, int count) +{ + size_t i = 0; + cJSON *n = NULL; + cJSON *p = NULL; + cJSON *a = NULL; + + if ((count < 0) || (numbers == NULL)) + { + return NULL; + } + + a = cJSON_CreateArray(); + + for(i = 0; a && (i < (size_t)count); i++) + { + n = cJSON_CreateNumber(numbers[i]); + if (!n) + { + cJSON_Delete(a); + return NULL; + } + if(!i) + { + a->child = n; + } + else + { + suffix_object(p, n); + } + p = n; + } + + if (a && a->child) { + a->child->prev = n; + } + + return a; +} + +CJSON_PUBLIC(cJSON *) cJSON_CreateFloatArray(const float *numbers, int count) +{ + size_t i = 0; + cJSON *n = NULL; + cJSON *p = NULL; + cJSON *a = NULL; + + if ((count < 0) || (numbers == NULL)) + { + return NULL; + } + + a = cJSON_CreateArray(); + + for(i = 0; a && (i < (size_t)count); i++) + { + n = cJSON_CreateNumber((double)numbers[i]); + if(!n) + { + cJSON_Delete(a); + return NULL; + } + if(!i) + { + a->child = n; + } + else + { + suffix_object(p, n); + } + p = n; + } + + if (a && a->child) { + a->child->prev = n; + } + + return a; +} + +CJSON_PUBLIC(cJSON *) cJSON_CreateDoubleArray(const double *numbers, int count) +{ + size_t i = 0; + cJSON *n = NULL; + cJSON *p = NULL; + cJSON *a = NULL; + + if ((count < 0) || (numbers == NULL)) + { + return NULL; + } + + a = cJSON_CreateArray(); + + for(i = 0; a && (i < (size_t)count); i++) + { + n = cJSON_CreateNumber(numbers[i]); + if(!n) + { + cJSON_Delete(a); + return NULL; + } + if(!i) + { + a->child = n; + } + else + { + suffix_object(p, n); + } + p = n; + } + + if (a && a->child) { + a->child->prev = n; + } + + return a; +} + +CJSON_PUBLIC(cJSON *) cJSON_CreateStringArray(const char *const *strings, int count) +{ + size_t i = 0; + cJSON *n = NULL; + cJSON *p = NULL; + cJSON *a = NULL; + + if ((count < 0) || (strings == NULL)) + { + return NULL; + } + + a = cJSON_CreateArray(); + + for (i = 0; a && (i < (size_t)count); i++) + { + n = cJSON_CreateString(strings[i]); + if(!n) + { + cJSON_Delete(a); + return NULL; + } + if(!i) + { + a->child = n; + } + else + { + suffix_object(p,n); + } + p = n; + } + + if (a && a->child) { + a->child->prev = n; + } + + return a; +} + +/* Duplication */ +cJSON * cJSON_Duplicate_rec(const cJSON *item, size_t depth, cJSON_bool recurse); + +CJSON_PUBLIC(cJSON *) cJSON_Duplicate(const cJSON *item, cJSON_bool recurse) +{ + return cJSON_Duplicate_rec(item, 0, recurse ); +} + +cJSON * cJSON_Duplicate_rec(const cJSON *item, size_t depth, cJSON_bool recurse) +{ + cJSON *newitem = NULL; + cJSON *child = NULL; + cJSON *next = NULL; + cJSON *newchild = NULL; + + /* Bail on bad ptr */ + if (!item) + { + goto fail; + } + /* Create new item */ + newitem = cJSON_New_Item(&global_hooks); + if (!newitem) + { + goto fail; + } + /* Copy over all vars */ + newitem->type = item->type & (~cJSON_IsReference); + newitem->valueint = item->valueint; + newitem->valuedouble = item->valuedouble; + if (item->valuestring) + { + newitem->valuestring = (char*)cJSON_strdup((unsigned char*)item->valuestring, &global_hooks); + if (!newitem->valuestring) + { + goto fail; + } + } + if (item->string) + { + newitem->string = (item->type&cJSON_StringIsConst) ? item->string : (char*)cJSON_strdup((unsigned char*)item->string, &global_hooks); + if (!newitem->string) + { + goto fail; + } + } + /* If non-recursive, then we're done! */ + if (!recurse) + { + return newitem; + } + /* Walk the ->next chain for the child. */ + child = item->child; + while (child != NULL) + { + if(depth >= CJSON_CIRCULAR_LIMIT) { + goto fail; + } + newchild = cJSON_Duplicate_rec(child, depth + 1, true); /* Duplicate (with recurse) each item in the ->next chain */ + if (!newchild) + { + goto fail; + } + if (next != NULL) + { + /* If newitem->child already set, then crosswire ->prev and ->next and move on */ + next->next = newchild; + newchild->prev = next; + next = newchild; + } + else + { + /* Set newitem->child and move to it */ + newitem->child = newchild; + next = newchild; + } + child = child->next; + } + if (newitem && newitem->child) + { + newitem->child->prev = newchild; + } + + return newitem; + +fail: + if (newitem != NULL) + { + cJSON_Delete(newitem); + } + + return NULL; +} + +static void skip_oneline_comment(char **input) +{ + *input += static_strlen("//"); + + for (; (*input)[0] != '\0'; ++(*input)) + { + if ((*input)[0] == '\n') { + *input += static_strlen("\n"); + return; + } + } +} + +static void skip_multiline_comment(char **input) +{ + *input += static_strlen("/*"); + + for (; (*input)[0] != '\0'; ++(*input)) + { + if (((*input)[0] == '*') && ((*input)[1] == '/')) + { + *input += static_strlen("*/"); + return; + } + } +} + +static void minify_string(char **input, char **output) { + (*output)[0] = (*input)[0]; + *input += static_strlen("\""); + *output += static_strlen("\""); + + + for (; (*input)[0] != '\0'; (void)++(*input), ++(*output)) { + (*output)[0] = (*input)[0]; + + if ((*input)[0] == '\"') { + (*output)[0] = '\"'; + *input += static_strlen("\""); + *output += static_strlen("\""); + return; + } else if (((*input)[0] == '\\') && ((*input)[1] == '\"')) { + (*output)[1] = (*input)[1]; + *input += static_strlen("\""); + *output += static_strlen("\""); + } + } +} + +CJSON_PUBLIC(void) cJSON_Minify(char *json) +{ + char *into = json; + + if (json == NULL) + { + return; + } + + while (json[0] != '\0') + { + switch (json[0]) + { + case ' ': + case '\t': + case '\r': + case '\n': + json++; + break; + + case '/': + if (json[1] == '/') + { + skip_oneline_comment(&json); + } + else if (json[1] == '*') + { + skip_multiline_comment(&json); + } else { + json++; + } + break; + + case '\"': + minify_string(&json, (char**)&into); + break; + + default: + into[0] = json[0]; + json++; + into++; + } + } + + /* and null-terminate. */ + *into = '\0'; +} + +CJSON_PUBLIC(cJSON_bool) cJSON_IsInvalid(const cJSON * const item) +{ + if (item == NULL) + { + return false; + } + + return (item->type & 0xFF) == cJSON_Invalid; +} + +CJSON_PUBLIC(cJSON_bool) cJSON_IsFalse(const cJSON * const item) +{ + if (item == NULL) + { + return false; + } + + return (item->type & 0xFF) == cJSON_False; +} + +CJSON_PUBLIC(cJSON_bool) cJSON_IsTrue(const cJSON * const item) +{ + if (item == NULL) + { + return false; + } + + return (item->type & 0xff) == cJSON_True; +} + + +CJSON_PUBLIC(cJSON_bool) cJSON_IsBool(const cJSON * const item) +{ + if (item == NULL) + { + return false; + } + + return (item->type & (cJSON_True | cJSON_False)) != 0; +} +CJSON_PUBLIC(cJSON_bool) cJSON_IsNull(const cJSON * const item) +{ + if (item == NULL) + { + return false; + } + + return (item->type & 0xFF) == cJSON_NULL; +} + +CJSON_PUBLIC(cJSON_bool) cJSON_IsNumber(const cJSON * const item) +{ + if (item == NULL) + { + return false; + } + + return (item->type & 0xFF) == cJSON_Number; +} + +CJSON_PUBLIC(cJSON_bool) cJSON_IsString(const cJSON * const item) +{ + if (item == NULL) + { + return false; + } + + return (item->type & 0xFF) == cJSON_String; +} + +CJSON_PUBLIC(cJSON_bool) cJSON_IsArray(const cJSON * const item) +{ + if (item == NULL) + { + return false; + } + + return (item->type & 0xFF) == cJSON_Array; +} + +CJSON_PUBLIC(cJSON_bool) cJSON_IsObject(const cJSON * const item) +{ + if (item == NULL) + { + return false; + } + + return (item->type & 0xFF) == cJSON_Object; +} + +CJSON_PUBLIC(cJSON_bool) cJSON_IsRaw(const cJSON * const item) +{ + if (item == NULL) + { + return false; + } + + return (item->type & 0xFF) == cJSON_Raw; +} + +CJSON_PUBLIC(cJSON_bool) cJSON_Compare(const cJSON * const a, const cJSON * const b, const cJSON_bool case_sensitive) +{ + if ((a == NULL) || (b == NULL) || ((a->type & 0xFF) != (b->type & 0xFF))) + { + return false; + } + + /* check if type is valid */ + switch (a->type & 0xFF) + { + case cJSON_False: + case cJSON_True: + case cJSON_NULL: + case cJSON_Number: + case cJSON_String: + case cJSON_Raw: + case cJSON_Array: + case cJSON_Object: + break; + + default: + return false; + } + + /* identical objects are equal */ + if (a == b) + { + return true; + } + + switch (a->type & 0xFF) + { + /* in these cases and equal type is enough */ + case cJSON_False: + case cJSON_True: + case cJSON_NULL: + return true; + + case cJSON_Number: + if (compare_double(a->valuedouble, b->valuedouble)) + { + return true; + } + return false; + + case cJSON_String: + case cJSON_Raw: + if ((a->valuestring == NULL) || (b->valuestring == NULL)) + { + return false; + } + if (strcmp(a->valuestring, b->valuestring) == 0) + { + return true; + } + + return false; + + case cJSON_Array: + { + cJSON *a_element = a->child; + cJSON *b_element = b->child; + + for (; (a_element != NULL) && (b_element != NULL);) + { + if (!cJSON_Compare(a_element, b_element, case_sensitive)) + { + return false; + } + + a_element = a_element->next; + b_element = b_element->next; + } + + /* one of the arrays is longer than the other */ + if (a_element != b_element) { + return false; + } + + return true; + } + + case cJSON_Object: + { + cJSON *a_element = NULL; + cJSON *b_element = NULL; + cJSON_ArrayForEach(a_element, a) + { + /* TODO This has O(n^2) runtime, which is horrible! */ + b_element = get_object_item(b, a_element->string, case_sensitive); + if (b_element == NULL) + { + return false; + } + + if (!cJSON_Compare(a_element, b_element, case_sensitive)) + { + return false; + } + } + + /* doing this twice, once on a and b to prevent true comparison if a subset of b + * TODO: Do this the proper way, this is just a fix for now */ + cJSON_ArrayForEach(b_element, b) + { + a_element = get_object_item(a, b_element->string, case_sensitive); + if (a_element == NULL) + { + return false; + } + + if (!cJSON_Compare(b_element, a_element, case_sensitive)) + { + return false; + } + } + + return true; + } + + default: + return false; + } +} + +CJSON_PUBLIC(void *) cJSON_malloc(size_t size) +{ + return global_hooks.allocate(size); +} + +CJSON_PUBLIC(void) cJSON_free(void *object) +{ + global_hooks.deallocate(object); + object = NULL; +} diff --git a/thirdparty/cjson/cJSON.h b/thirdparty/cjson/cJSON.h new file mode 100644 index 0000000..7f67ecc --- /dev/null +++ b/thirdparty/cjson/cJSON.h @@ -0,0 +1,308 @@ +/* + Copyright (c) 2009-2017 Dave Gamble and cJSON contributors + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + THE SOFTWARE. +*/ + +#ifndef cJSON__h +#define cJSON__h + +#define CJSON_HIDE_SYMBOLS + +#ifdef __cplusplus +extern "C" +{ +#endif + +#if !defined(__WINDOWS__) && (defined(WIN32) || defined(WIN64) || defined(_MSC_VER) || defined(_WIN32)) +#define __WINDOWS__ +#endif + +#ifdef __WINDOWS__ + +/* When compiling for windows, we specify a specific calling convention to avoid issues where we are being called from a project with a different default calling convention. For windows you have 3 define options: + +CJSON_HIDE_SYMBOLS - Define this in the case where you don't want to ever dllexport symbols +CJSON_EXPORT_SYMBOLS - Define this on library build when you want to dllexport symbols (default) +CJSON_IMPORT_SYMBOLS - Define this if you want to dllimport symbol + +For *nix builds that support visibility attribute, you can define similar behavior by + +setting default visibility to hidden by adding +-fvisibility=hidden (for gcc) +or +-xldscope=hidden (for sun cc) +to CFLAGS + +then using the CJSON_API_VISIBILITY flag to "export" the same symbols the way CJSON_EXPORT_SYMBOLS does + +*/ + +#define CJSON_CDECL __cdecl +#define CJSON_STDCALL __stdcall + +/* export symbols by default, this is necessary for copy pasting the C and header file */ +#if !defined(CJSON_HIDE_SYMBOLS) && !defined(CJSON_IMPORT_SYMBOLS) && !defined(CJSON_EXPORT_SYMBOLS) +#define CJSON_EXPORT_SYMBOLS +#endif + +#if defined(CJSON_HIDE_SYMBOLS) +#define CJSON_PUBLIC(type) type CJSON_STDCALL +#elif defined(CJSON_EXPORT_SYMBOLS) +#define CJSON_PUBLIC(type) __declspec(dllexport) type CJSON_STDCALL +#elif defined(CJSON_IMPORT_SYMBOLS) +#define CJSON_PUBLIC(type) __declspec(dllimport) type CJSON_STDCALL +#endif +#else /* !__WINDOWS__ */ +#define CJSON_CDECL +#define CJSON_STDCALL + +#if (defined(__GNUC__) || defined(__SUNPRO_CC) || defined (__SUNPRO_C)) && defined(CJSON_API_VISIBILITY) +#define CJSON_PUBLIC(type) __attribute__((visibility("default"))) type +#else +#define CJSON_PUBLIC(type) type +#endif +#endif + +/* project version */ +#define CJSON_VERSION_MAJOR 1 +#define CJSON_VERSION_MINOR 7 +#define CJSON_VERSION_PATCH 19 + +#include + +/* cJSON Types: */ +#define cJSON_Invalid (0) +#define cJSON_False (1 << 0) +#define cJSON_True (1 << 1) +#define cJSON_NULL (1 << 2) +#define cJSON_Number (1 << 3) +#define cJSON_String (1 << 4) +#define cJSON_Array (1 << 5) +#define cJSON_Object (1 << 6) +#define cJSON_Raw (1 << 7) /* raw json */ + +#define cJSON_IsReference 256 +#define cJSON_StringIsConst 512 + +/* The cJSON structure: */ +typedef struct cJSON +{ + /* next/prev allow you to walk array/object chains. Alternatively, use GetArraySize/GetArrayItem/GetObjectItem */ + struct cJSON *next; + struct cJSON *prev; + /* An array or object item will have a child pointer pointing to a chain of the items in the array/object. */ + struct cJSON *child; + + /* The type of the item, as above. */ + int type; + + /* The item's string, if type==cJSON_String and type == cJSON_Raw */ + char *valuestring; + /* writing to valueint is DEPRECATED, use cJSON_SetNumberValue instead */ + int valueint; + /* The item's number, if type==cJSON_Number */ + double valuedouble; + + /* The item's name string, if this item is the child of, or is in the list of subitems of an object. */ + char *string; +} cJSON; + +typedef struct cJSON_Hooks +{ + /* malloc/free are CDECL on Windows regardless of the default calling convention of the compiler, so ensure the hooks allow passing those functions directly. */ + void *(CJSON_CDECL *malloc_fn)(size_t sz); + void (CJSON_CDECL *free_fn)(void *ptr); +} cJSON_Hooks; + +typedef int cJSON_bool; + +/* Limits how deeply nested arrays/objects can be before cJSON rejects to parse them. + * This is to prevent stack overflows. */ +#ifndef CJSON_NESTING_LIMIT +#define CJSON_NESTING_LIMIT 1000 +#endif + +/* Limits the length of circular references can be before cJSON rejects to parse them. + * This is to prevent stack overflows. */ +#ifndef CJSON_CIRCULAR_LIMIT +#define CJSON_CIRCULAR_LIMIT 10000 +#endif + +/* returns the version of cJSON as a string */ +CJSON_PUBLIC(const char*) cJSON_Version(void); + +/* Supply malloc, realloc and free functions to cJSON */ +CJSON_PUBLIC(void) cJSON_InitHooks(cJSON_Hooks* hooks); + +/* Memory Management: the caller is always responsible to free the results from all variants of cJSON_Parse (with cJSON_Delete) and cJSON_Print (with stdlib free, cJSON_Hooks.free_fn, or cJSON_free as appropriate). The exception is cJSON_PrintPreallocated, where the caller has full responsibility of the buffer. */ +/* Supply a block of JSON, and this returns a cJSON object you can interrogate. */ +CJSON_PUBLIC(cJSON *) cJSON_Parse(const char *value); +CJSON_PUBLIC(cJSON *) cJSON_ParseWithLength(const char *value, size_t buffer_length); +/* ParseWithOpts allows you to require (and check) that the JSON is null terminated, and to retrieve the pointer to the final byte parsed. */ +/* If you supply a ptr in return_parse_end and parsing fails, then return_parse_end will contain a pointer to the error so will match cJSON_GetErrorPtr(). */ +CJSON_PUBLIC(cJSON *) cJSON_ParseWithOpts(const char *value, const char **return_parse_end, cJSON_bool require_null_terminated); +CJSON_PUBLIC(cJSON *) cJSON_ParseWithLengthOpts(const char *value, size_t buffer_length, const char **return_parse_end, cJSON_bool require_null_terminated); + +/* Render a cJSON entity to text for transfer/storage. */ +CJSON_PUBLIC(char *) cJSON_Print(const cJSON *item); +/* Render a cJSON entity to text for transfer/storage without any formatting. */ +CJSON_PUBLIC(char *) cJSON_PrintUnformatted(const cJSON *item); +/* Render a cJSON entity to text using a buffered strategy. prebuffer is a guess at the final size. guessing well reduces reallocation. fmt=0 gives unformatted, =1 gives formatted */ +CJSON_PUBLIC(char *) cJSON_PrintBuffered(const cJSON *item, int prebuffer, cJSON_bool fmt); +/* Render a cJSON entity to text using a buffer already allocated in memory with given length. Returns 1 on success and 0 on failure. */ +/* NOTE: cJSON is not always 100% accurate in estimating how much memory it will use, so to be safe allocate 5 bytes more than you actually need */ +CJSON_PUBLIC(cJSON_bool) cJSON_PrintPreallocated(cJSON *item, char *buffer, const int length, const cJSON_bool format); +/* Delete a cJSON entity and all subentities. */ +CJSON_PUBLIC(void) cJSON_Delete(cJSON *item); + +/* Returns the number of items in an array (or object). */ +CJSON_PUBLIC(int) cJSON_GetArraySize(const cJSON *array); +/* Retrieve item number "index" from array "array". Returns NULL if unsuccessful. */ +CJSON_PUBLIC(cJSON *) cJSON_GetArrayItem(const cJSON *array, int index); +/* Get item "string" from object. Case insensitive. */ +CJSON_PUBLIC(cJSON *) cJSON_GetObjectItem(const cJSON * const object, const char * const string); +CJSON_PUBLIC(cJSON *) cJSON_GetObjectItemCaseSensitive(const cJSON * const object, const char * const string); +CJSON_PUBLIC(cJSON_bool) cJSON_HasObjectItem(const cJSON *object, const char *string); +/* For analysing failed parses. This returns a pointer to the parse error. You'll probably need to look a few chars back to make sense of it. Defined when cJSON_Parse() returns 0. 0 when cJSON_Parse() succeeds. */ +CJSON_PUBLIC(const char *) cJSON_GetErrorPtr(void); + +/* Check item type and return its value */ +CJSON_PUBLIC(char *) cJSON_GetStringValue(const cJSON * const item); +CJSON_PUBLIC(double) cJSON_GetNumberValue(const cJSON * const item); + +/* These functions check the type of an item */ +CJSON_PUBLIC(cJSON_bool) cJSON_IsInvalid(const cJSON * const item); +CJSON_PUBLIC(cJSON_bool) cJSON_IsFalse(const cJSON * const item); +CJSON_PUBLIC(cJSON_bool) cJSON_IsTrue(const cJSON * const item); +CJSON_PUBLIC(cJSON_bool) cJSON_IsBool(const cJSON * const item); +CJSON_PUBLIC(cJSON_bool) cJSON_IsNull(const cJSON * const item); +CJSON_PUBLIC(cJSON_bool) cJSON_IsNumber(const cJSON * const item); +CJSON_PUBLIC(cJSON_bool) cJSON_IsString(const cJSON * const item); +CJSON_PUBLIC(cJSON_bool) cJSON_IsArray(const cJSON * const item); +CJSON_PUBLIC(cJSON_bool) cJSON_IsObject(const cJSON * const item); +CJSON_PUBLIC(cJSON_bool) cJSON_IsRaw(const cJSON * const item); + +/* These calls create a cJSON item of the appropriate type. */ +CJSON_PUBLIC(cJSON *) cJSON_CreateNull(void); +CJSON_PUBLIC(cJSON *) cJSON_CreateTrue(void); +CJSON_PUBLIC(cJSON *) cJSON_CreateFalse(void); +CJSON_PUBLIC(cJSON *) cJSON_CreateBool(cJSON_bool boolean); +CJSON_PUBLIC(cJSON *) cJSON_CreateNumber(double num); +CJSON_PUBLIC(cJSON *) cJSON_CreateString(const char *string); +/* raw json */ +CJSON_PUBLIC(cJSON *) cJSON_CreateRaw(const char *raw); +CJSON_PUBLIC(cJSON *) cJSON_CreateArray(void); +CJSON_PUBLIC(cJSON *) cJSON_CreateObject(void); + +/* Create a string where valuestring references a string so + * it will not be freed by cJSON_Delete */ +CJSON_PUBLIC(cJSON *) cJSON_CreateStringReference(const char *string); +/* Create an object/array that only references it's elements so + * they will not be freed by cJSON_Delete */ +CJSON_PUBLIC(cJSON *) cJSON_CreateObjectReference(const cJSON *child); +CJSON_PUBLIC(cJSON *) cJSON_CreateArrayReference(const cJSON *child); + +/* These utilities create an Array of count items. + * The parameter count cannot be greater than the number of elements in the number array, otherwise array access will be out of bounds.*/ +CJSON_PUBLIC(cJSON *) cJSON_CreateIntArray(const int *numbers, int count); +CJSON_PUBLIC(cJSON *) cJSON_CreateFloatArray(const float *numbers, int count); +CJSON_PUBLIC(cJSON *) cJSON_CreateDoubleArray(const double *numbers, int count); +CJSON_PUBLIC(cJSON *) cJSON_CreateStringArray(const char *const *strings, int count); + +/* Append item to the specified array/object. */ +CJSON_PUBLIC(cJSON_bool) cJSON_AddItemToArray(cJSON *array, cJSON *item); +CJSON_PUBLIC(cJSON_bool) cJSON_AddItemToObject(cJSON *object, const char *string, cJSON *item); +/* Use this when string is definitely const (i.e. a literal, or as good as), and will definitely survive the cJSON object. + * WARNING: When this function was used, make sure to always check that (item->type & cJSON_StringIsConst) is zero before + * writing to `item->string` */ +CJSON_PUBLIC(cJSON_bool) cJSON_AddItemToObjectCS(cJSON *object, const char *string, cJSON *item); +/* Append reference to item to the specified array/object. Use this when you want to add an existing cJSON to a new cJSON, but don't want to corrupt your existing cJSON. */ +CJSON_PUBLIC(cJSON_bool) cJSON_AddItemReferenceToArray(cJSON *array, cJSON *item); +CJSON_PUBLIC(cJSON_bool) cJSON_AddItemReferenceToObject(cJSON *object, const char *string, cJSON *item); + +/* Remove/Detach items from Arrays/Objects. */ +CJSON_PUBLIC(cJSON *) cJSON_DetachItemViaPointer(cJSON *parent, cJSON * const item); +CJSON_PUBLIC(cJSON *) cJSON_DetachItemFromArray(cJSON *array, int which); +CJSON_PUBLIC(void) cJSON_DeleteItemFromArray(cJSON *array, int which); +CJSON_PUBLIC(cJSON *) cJSON_DetachItemFromObject(cJSON *object, const char *string); +CJSON_PUBLIC(cJSON *) cJSON_DetachItemFromObjectCaseSensitive(cJSON *object, const char *string); +CJSON_PUBLIC(void) cJSON_DeleteItemFromObject(cJSON *object, const char *string); +CJSON_PUBLIC(void) cJSON_DeleteItemFromObjectCaseSensitive(cJSON *object, const char *string); + +/* Update array items. */ +CJSON_PUBLIC(cJSON_bool) cJSON_InsertItemInArray(cJSON *array, int which, cJSON *newitem); /* Shifts pre-existing items to the right. */ +CJSON_PUBLIC(cJSON_bool) cJSON_ReplaceItemViaPointer(cJSON * const parent, cJSON * const item, cJSON * replacement); +CJSON_PUBLIC(cJSON_bool) cJSON_ReplaceItemInArray(cJSON *array, int which, cJSON *newitem); +CJSON_PUBLIC(cJSON_bool) cJSON_ReplaceItemInObject(cJSON *object,const char *string,cJSON *newitem); +CJSON_PUBLIC(cJSON_bool) cJSON_ReplaceItemInObjectCaseSensitive(cJSON *object,const char *string,cJSON *newitem); + +/* Duplicate a cJSON item */ +CJSON_PUBLIC(cJSON *) cJSON_Duplicate(const cJSON *item, cJSON_bool recurse); +/* Duplicate will create a new, identical cJSON item to the one you pass, in new memory that will + * need to be released. With recurse!=0, it will duplicate any children connected to the item. + * The item->next and ->prev pointers are always zero on return from Duplicate. */ +/* Recursively compare two cJSON items for equality. If either a or b is NULL or invalid, they will be considered unequal. + * case_sensitive determines if object keys are treated case sensitive (1) or case insensitive (0) */ +CJSON_PUBLIC(cJSON_bool) cJSON_Compare(const cJSON * const a, const cJSON * const b, const cJSON_bool case_sensitive); + +/* Minify a strings, remove blank characters(such as ' ', '\t', '\r', '\n') from strings. + * The input pointer json cannot point to a read-only address area, such as a string constant, + * but should point to a readable and writable address area. */ +CJSON_PUBLIC(void) cJSON_Minify(char *json); + +/* Helper functions for creating and adding items to an object at the same time. + * They return the added item or NULL on failure. */ +CJSON_PUBLIC(cJSON*) cJSON_AddNullToObject(cJSON * const object, const char * const name); +CJSON_PUBLIC(cJSON*) cJSON_AddTrueToObject(cJSON * const object, const char * const name); +CJSON_PUBLIC(cJSON*) cJSON_AddFalseToObject(cJSON * const object, const char * const name); +CJSON_PUBLIC(cJSON*) cJSON_AddBoolToObject(cJSON * const object, const char * const name, const cJSON_bool boolean); +CJSON_PUBLIC(cJSON*) cJSON_AddNumberToObject(cJSON * const object, const char * const name, const double number); +CJSON_PUBLIC(cJSON*) cJSON_AddStringToObject(cJSON * const object, const char * const name, const char * const string); +CJSON_PUBLIC(cJSON*) cJSON_AddRawToObject(cJSON * const object, const char * const name, const char * const raw); +CJSON_PUBLIC(cJSON*) cJSON_AddObjectToObject(cJSON * const object, const char * const name); +CJSON_PUBLIC(cJSON*) cJSON_AddArrayToObject(cJSON * const object, const char * const name); + +/* When assigning an integer value, it needs to be propagated to valuedouble too. */ +#define cJSON_SetIntValue(object, number) ((object) ? (object)->valueint = (object)->valuedouble = (number) : (number)) +/* helper for the cJSON_SetNumberValue macro */ +CJSON_PUBLIC(double) cJSON_SetNumberHelper(cJSON *object, double number); +#define cJSON_SetNumberValue(object, number) ((object != NULL) ? cJSON_SetNumberHelper(object, (double)number) : (number)) +/* Change the valuestring of a cJSON_String object, only takes effect when type of object is cJSON_String */ +CJSON_PUBLIC(char*) cJSON_SetValuestring(cJSON *object, const char *valuestring); + +/* If the object is not a boolean type this does nothing and returns cJSON_Invalid else it returns the new type*/ +#define cJSON_SetBoolValue(object, boolValue) ( \ + (object != NULL && ((object)->type & (cJSON_False|cJSON_True))) ? \ + (object)->type=((object)->type &(~(cJSON_False|cJSON_True)))|((boolValue)?cJSON_True:cJSON_False) : \ + cJSON_Invalid\ +) + +/* Macro for iterating over an array or object */ +#define cJSON_ArrayForEach(element, array) for(element = (array != NULL) ? (array)->child : NULL; element != NULL; element = element->next) + +/* malloc/free objects using the malloc/free functions that have been set with cJSON_InitHooks */ +CJSON_PUBLIC(void *) cJSON_malloc(size_t size); +CJSON_PUBLIC(void) cJSON_free(void *object); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/thirdparty/cjson/cJSON_Utils.c b/thirdparty/cjson/cJSON_Utils.c new file mode 100644 index 0000000..8fa24f8 --- /dev/null +++ b/thirdparty/cjson/cJSON_Utils.c @@ -0,0 +1,1481 @@ +/* + Copyright (c) 2009-2017 Dave Gamble and cJSON contributors + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + THE SOFTWARE. +*/ + +/* disable warnings about old C89 functions in MSVC */ +#if !defined(_CRT_SECURE_NO_DEPRECATE) && defined(_MSC_VER) +#define _CRT_SECURE_NO_DEPRECATE +#endif + +#ifdef __GNUCC__ +#pragma GCC visibility push(default) +#endif +#if defined(_MSC_VER) +#pragma warning (push) +/* disable warning about single line comments in system headers */ +#pragma warning (disable : 4001) +#endif + +#include +#include +#include +#include +#include +#include +#include +#include + +#if defined(_MSC_VER) +#pragma warning (pop) +#endif +#ifdef __GNUCC__ +#pragma GCC visibility pop +#endif + +#include "cJSON_Utils.h" + +/* define our own boolean type */ +#ifdef true +#undef true +#endif +#define true ((cJSON_bool)1) + +#ifdef false +#undef false +#endif +#define false ((cJSON_bool)0) + +static unsigned char* cJSONUtils_strdup(const unsigned char* const string) +{ + size_t length = 0; + unsigned char *copy = NULL; + + length = strlen((const char*)string) + sizeof(""); + copy = (unsigned char*) cJSON_malloc(length); + if (copy == NULL) + { + return NULL; + } + memcpy(copy, string, length); + + return copy; +} + +/* string comparison which doesn't consider NULL pointers equal */ +static int compare_strings(const unsigned char *string1, const unsigned char *string2, const cJSON_bool case_sensitive) +{ + if ((string1 == NULL) || (string2 == NULL)) + { + return 1; + } + + if (string1 == string2) + { + return 0; + } + + if (case_sensitive) + { + return strcmp((const char*)string1, (const char*)string2); + } + + for(; tolower(*string1) == tolower(*string2); (void)string1++, string2++) + { + if (*string1 == '\0') + { + return 0; + } + } + + return tolower(*string1) - tolower(*string2); +} + +/* securely comparison of floating-point variables */ +static cJSON_bool compare_double(double a, double b) +{ + double maxVal = fabs(a) > fabs(b) ? fabs(a) : fabs(b); + return (fabs(a - b) <= maxVal * DBL_EPSILON); +} + + +/* Compare the next path element of two JSON pointers, two NULL pointers are considered unequal: */ +static cJSON_bool compare_pointers(const unsigned char *name, const unsigned char *pointer, const cJSON_bool case_sensitive) +{ + if ((name == NULL) || (pointer == NULL)) + { + return false; + } + + for (; (*name != '\0') && (*pointer != '\0') && (*pointer != '/'); (void)name++, pointer++) /* compare until next '/' */ + { + if (*pointer == '~') + { + /* check for escaped '~' (~0) and '/' (~1) */ + if (((pointer[1] != '0') || (*name != '~')) && ((pointer[1] != '1') || (*name != '/'))) + { + /* invalid escape sequence or wrong character in *name */ + return false; + } + else + { + pointer++; + } + } + else if ((!case_sensitive && (tolower(*name) != tolower(*pointer))) || (case_sensitive && (*name != *pointer))) + { + return false; + } + } + if (((*pointer != 0) && (*pointer != '/')) != (*name != 0)) + { + /* one string has ended, the other not */ + return false;; + } + + return true; +} + +/* calculate the length of a string if encoded as JSON pointer with ~0 and ~1 escape sequences */ +static size_t pointer_encoded_length(const unsigned char *string) +{ + size_t length; + for (length = 0; *string != '\0'; (void)string++, length++) + { + /* character needs to be escaped? */ + if ((*string == '~') || (*string == '/')) + { + length++; + } + } + + return length; +} + +/* copy a string while escaping '~' and '/' with ~0 and ~1 JSON pointer escape codes */ +static void encode_string_as_pointer(unsigned char *destination, const unsigned char *source) +{ + for (; source[0] != '\0'; (void)source++, destination++) + { + if (source[0] == '/') + { + destination[0] = '~'; + destination[1] = '1'; + destination++; + } + else if (source[0] == '~') + { + destination[0] = '~'; + destination[1] = '0'; + destination++; + } + else + { + destination[0] = source[0]; + } + } + + destination[0] = '\0'; +} + +CJSON_PUBLIC(char *) cJSONUtils_FindPointerFromObjectTo(const cJSON * const object, const cJSON * const target) +{ + size_t child_index = 0; + cJSON *current_child = 0; + + if ((object == NULL) || (target == NULL)) + { + return NULL; + } + + if (object == target) + { + /* found */ + return (char*)cJSONUtils_strdup((const unsigned char*)""); + } + + /* recursively search all children of the object or array */ + for (current_child = object->child; current_child != NULL; (void)(current_child = current_child->next), child_index++) + { + unsigned char *target_pointer = (unsigned char*)cJSONUtils_FindPointerFromObjectTo(current_child, target); + /* found the target? */ + if (target_pointer != NULL) + { + if (cJSON_IsArray(object)) + { + /* reserve enough memory for a 64 bit integer + '/' and '\0' */ + unsigned char *full_pointer = (unsigned char*)cJSON_malloc(strlen((char*)target_pointer) + 20 + sizeof("/")); + /* check if conversion to unsigned long is valid + * This should be eliminated at compile time by dead code elimination + * if size_t is an alias of unsigned long, or if it is bigger */ + if (child_index > ULONG_MAX) + { + cJSON_free(target_pointer); + cJSON_free(full_pointer); + return NULL; + } + sprintf((char*)full_pointer, "/%lu%s", (unsigned long)child_index, target_pointer); /* / */ + cJSON_free(target_pointer); + + return (char*)full_pointer; + } + + if (cJSON_IsObject(object)) + { + unsigned char *full_pointer = (unsigned char*)cJSON_malloc(strlen((char*)target_pointer) + pointer_encoded_length((unsigned char*)current_child->string) + 2); + full_pointer[0] = '/'; + encode_string_as_pointer(full_pointer + 1, (unsigned char*)current_child->string); + strcat((char*)full_pointer, (char*)target_pointer); + cJSON_free(target_pointer); + + return (char*)full_pointer; + } + + /* reached leaf of the tree, found nothing */ + cJSON_free(target_pointer); + return NULL; + } + } + + /* not found */ + return NULL; +} + +/* non broken version of cJSON_GetArrayItem */ +static cJSON *get_array_item(const cJSON *array, size_t item) +{ + cJSON *child = array ? array->child : NULL; + while ((child != NULL) && (item > 0)) + { + item--; + child = child->next; + } + + return child; +} + +static cJSON_bool decode_array_index_from_pointer(const unsigned char * const pointer, size_t * const index) +{ + size_t parsed_index = 0; + size_t position = 0; + + if ((pointer[0] == '0') && ((pointer[1] != '\0') && (pointer[1] != '/'))) + { + /* leading zeroes are not permitted */ + return 0; + } + + for (position = 0; (pointer[position] >= '0') && (pointer[position] <= '9'); position++) + { + parsed_index = (10 * parsed_index) + (size_t)(pointer[position] - '0'); + + } + + if ((pointer[position] != '\0') && (pointer[position] != '/')) + { + return 0; + } + + *index = parsed_index; + + return 1; +} + +static cJSON *get_item_from_pointer(cJSON * const object, const char * pointer, const cJSON_bool case_sensitive) +{ + cJSON *current_element = object; + + if (pointer == NULL) + { + return NULL; + } + + /* follow path of the pointer */ + while ((pointer[0] == '/') && (current_element != NULL)) + { + pointer++; + if (cJSON_IsArray(current_element)) + { + size_t index = 0; + if (!decode_array_index_from_pointer((const unsigned char*)pointer, &index)) + { + return NULL; + } + + current_element = get_array_item(current_element, index); + } + else if (cJSON_IsObject(current_element)) + { + current_element = current_element->child; + /* GetObjectItem. */ + while ((current_element != NULL) && !compare_pointers((unsigned char*)current_element->string, (const unsigned char*)pointer, case_sensitive)) + { + current_element = current_element->next; + } + } + else + { + return NULL; + } + + /* skip to the next path token or end of string */ + while ((pointer[0] != '\0') && (pointer[0] != '/')) + { + pointer++; + } + } + + return current_element; +} + +CJSON_PUBLIC(cJSON *) cJSONUtils_GetPointer(cJSON * const object, const char *pointer) +{ + return get_item_from_pointer(object, pointer, false); +} + +CJSON_PUBLIC(cJSON *) cJSONUtils_GetPointerCaseSensitive(cJSON * const object, const char *pointer) +{ + return get_item_from_pointer(object, pointer, true); +} + +/* JSON Patch implementation. */ +static void decode_pointer_inplace(unsigned char *string) +{ + unsigned char *decoded_string = string; + + if (string == NULL) { + return; + } + + for (; *string; (void)decoded_string++, string++) + { + if (string[0] == '~') + { + if (string[1] == '0') + { + decoded_string[0] = '~'; + } + else if (string[1] == '1') + { + decoded_string[1] = '/'; + } + else + { + /* invalid escape sequence */ + return; + } + + string++; + } + } + + decoded_string[0] = '\0'; +} + +/* non-broken cJSON_DetachItemFromArray */ +static cJSON *detach_item_from_array(cJSON *array, size_t which) +{ + cJSON *c = array->child; + while (c && (which > 0)) + { + c = c->next; + which--; + } + if (!c) + { + /* item doesn't exist */ + return NULL; + } + if (c != array->child) + { + /* not the first element */ + c->prev->next = c->next; + } + if (c->next) + { + c->next->prev = c->prev; + } + if (c == array->child) + { + array->child = c->next; + } + else if (c->next == NULL) + { + array->child->prev = c->prev; + } + /* make sure the detached item doesn't point anywhere anymore */ + c->prev = c->next = NULL; + + return c; +} + +/* detach an item at the given path */ +static cJSON *detach_path(cJSON *object, const unsigned char *path, const cJSON_bool case_sensitive) +{ + unsigned char *parent_pointer = NULL; + unsigned char *child_pointer = NULL; + cJSON *parent = NULL; + cJSON *detached_item = NULL; + + /* copy path and split it in parent and child */ + parent_pointer = cJSONUtils_strdup(path); + if (parent_pointer == NULL) { + goto cleanup; + } + + child_pointer = (unsigned char*)strrchr((char*)parent_pointer, '/'); /* last '/' */ + if (child_pointer == NULL) + { + goto cleanup; + } + /* split strings */ + child_pointer[0] = '\0'; + child_pointer++; + + parent = get_item_from_pointer(object, (char*)parent_pointer, case_sensitive); + decode_pointer_inplace(child_pointer); + + if (cJSON_IsArray(parent)) + { + size_t index = 0; + if (!decode_array_index_from_pointer(child_pointer, &index)) + { + goto cleanup; + } + detached_item = detach_item_from_array(parent, index); + } + else if (cJSON_IsObject(parent)) + { + detached_item = cJSON_DetachItemFromObject(parent, (char*)child_pointer); + } + else + { + /* Couldn't find object to remove child from. */ + goto cleanup; + } + +cleanup: + if (parent_pointer != NULL) + { + cJSON_free(parent_pointer); + } + + return detached_item; +} + +/* sort lists using mergesort */ +static cJSON *sort_list(cJSON *list, const cJSON_bool case_sensitive) +{ + cJSON *first = list; + cJSON *second = list; + cJSON *current_item = list; + cJSON *result = list; + cJSON *result_tail = NULL; + + if ((list == NULL) || (list->next == NULL)) + { + /* One entry is sorted already. */ + return result; + } + + while ((current_item != NULL) && (current_item->next != NULL) && (compare_strings((unsigned char*)current_item->string, (unsigned char*)current_item->next->string, case_sensitive) < 0)) + { + /* Test for list sorted. */ + current_item = current_item->next; + } + if ((current_item == NULL) || (current_item->next == NULL)) + { + /* Leave sorted lists unmodified. */ + return result; + } + + /* reset pointer to the beginning */ + current_item = list; + while (current_item != NULL) + { + /* Walk two pointers to find the middle. */ + second = second->next; + current_item = current_item->next; + /* advances current_item two steps at a time */ + if (current_item != NULL) + { + current_item = current_item->next; + } + } + if ((second != NULL) && (second->prev != NULL)) + { + /* Split the lists */ + second->prev->next = NULL; + second->prev = NULL; + } + + /* Recursively sort the sub-lists. */ + first = sort_list(first, case_sensitive); + second = sort_list(second, case_sensitive); + result = NULL; + + /* Merge the sub-lists */ + while ((first != NULL) && (second != NULL)) + { + cJSON *smaller = NULL; + if (compare_strings((unsigned char*)first->string, (unsigned char*)second->string, case_sensitive) < 0) + { + smaller = first; + } + else + { + smaller = second; + } + + if (result == NULL) + { + /* start merged list with the smaller element */ + result_tail = smaller; + result = smaller; + } + else + { + /* add smaller element to the list */ + result_tail->next = smaller; + smaller->prev = result_tail; + result_tail = smaller; + } + + if (first == smaller) + { + first = first->next; + } + else + { + second = second->next; + } + } + + if (first != NULL) + { + /* Append rest of first list. */ + if (result == NULL) + { + return first; + } + result_tail->next = first; + first->prev = result_tail; + } + if (second != NULL) + { + /* Append rest of second list */ + if (result == NULL) + { + return second; + } + result_tail->next = second; + second->prev = result_tail; + } + + return result; +} + +static void sort_object(cJSON * const object, const cJSON_bool case_sensitive) +{ + if (object == NULL) + { + return; + } + object->child = sort_list(object->child, case_sensitive); +} + +static cJSON_bool compare_json(cJSON *a, cJSON *b, const cJSON_bool case_sensitive) +{ + if ((a == NULL) || (b == NULL) || ((a->type & 0xFF) != (b->type & 0xFF))) + { + /* mismatched type. */ + return false; + } + switch (a->type & 0xFF) + { + case cJSON_Number: + /* numeric mismatch. */ + if ((a->valueint != b->valueint) || (!compare_double(a->valuedouble, b->valuedouble))) + { + return false; + } + else + { + return true; + } + + case cJSON_String: + /* string mismatch. */ + if (strcmp(a->valuestring, b->valuestring) != 0) + { + return false; + } + else + { + return true; + } + + case cJSON_Array: + for ((void)(a = a->child), b = b->child; (a != NULL) && (b != NULL); (void)(a = a->next), b = b->next) + { + cJSON_bool identical = compare_json(a, b, case_sensitive); + if (!identical) + { + return false; + } + } + + /* array size mismatch? (one of both children is not NULL) */ + if ((a != NULL) || (b != NULL)) + { + return false; + } + else + { + return true; + } + + case cJSON_Object: + sort_object(a, case_sensitive); + sort_object(b, case_sensitive); + for ((void)(a = a->child), b = b->child; (a != NULL) && (b != NULL); (void)(a = a->next), b = b->next) + { + cJSON_bool identical = false; + /* compare object keys */ + if (compare_strings((unsigned char*)a->string, (unsigned char*)b->string, case_sensitive)) + { + /* missing member */ + return false; + } + identical = compare_json(a, b, case_sensitive); + if (!identical) + { + return false; + } + } + + /* object length mismatch (one of both children is not null) */ + if ((a != NULL) || (b != NULL)) + { + return false; + } + else + { + return true; + } + + default: + break; + } + + /* null, true or false */ + return true; +} + +/* non broken version of cJSON_InsertItemInArray */ +static cJSON_bool insert_item_in_array(cJSON *array, size_t which, cJSON *newitem) +{ + cJSON *child = array->child; + while (child && (which > 0)) + { + child = child->next; + which--; + } + if (which > 0) + { + /* item is after the end of the array */ + return 0; + } + if (child == NULL) + { + cJSON_AddItemToArray(array, newitem); + return 1; + } + + /* insert into the linked list */ + newitem->next = child; + newitem->prev = child->prev; + child->prev = newitem; + + /* was it at the beginning */ + if (child == array->child) + { + array->child = newitem; + } + else + { + newitem->prev->next = newitem; + } + + return 1; +} + +static cJSON *get_object_item(const cJSON * const object, const char* name, const cJSON_bool case_sensitive) +{ + if (case_sensitive) + { + return cJSON_GetObjectItemCaseSensitive(object, name); + } + + return cJSON_GetObjectItem(object, name); +} + +enum patch_operation { INVALID, ADD, REMOVE, REPLACE, MOVE, COPY, TEST }; + +static enum patch_operation decode_patch_operation(const cJSON * const patch, const cJSON_bool case_sensitive) +{ + cJSON *operation = get_object_item(patch, "op", case_sensitive); + if (!cJSON_IsString(operation)) + { + return INVALID; + } + + if (strcmp(operation->valuestring, "add") == 0) + { + return ADD; + } + + if (strcmp(operation->valuestring, "remove") == 0) + { + return REMOVE; + } + + if (strcmp(operation->valuestring, "replace") == 0) + { + return REPLACE; + } + + if (strcmp(operation->valuestring, "move") == 0) + { + return MOVE; + } + + if (strcmp(operation->valuestring, "copy") == 0) + { + return COPY; + } + + if (strcmp(operation->valuestring, "test") == 0) + { + return TEST; + } + + return INVALID; +} + +/* overwrite and existing item with another one and free resources on the way */ +static void overwrite_item(cJSON * const root, const cJSON replacement) +{ + if (root == NULL) + { + return; + } + + if (root->string != NULL) + { + cJSON_free(root->string); + } + if (root->valuestring != NULL) + { + cJSON_free(root->valuestring); + } + if (root->child != NULL) + { + cJSON_Delete(root->child); + } + + memcpy(root, &replacement, sizeof(cJSON)); +} + +static int apply_patch(cJSON *object, const cJSON *patch, const cJSON_bool case_sensitive) +{ + cJSON *path = NULL; + cJSON *value = NULL; + cJSON *parent = NULL; + enum patch_operation opcode = INVALID; + unsigned char *parent_pointer = NULL; + unsigned char *child_pointer = NULL; + int status = 0; + + path = get_object_item(patch, "path", case_sensitive); + if (!cJSON_IsString(path)) + { + /* malformed patch. */ + status = 2; + goto cleanup; + } + + opcode = decode_patch_operation(patch, case_sensitive); + if (opcode == INVALID) + { + status = 3; + goto cleanup; + } + else if (opcode == TEST) + { + /* compare value: {...} with the given path */ + status = !compare_json(get_item_from_pointer(object, path->valuestring, case_sensitive), get_object_item(patch, "value", case_sensitive), case_sensitive); + goto cleanup; + } + + /* special case for replacing the root */ + if (path->valuestring[0] == '\0') + { + if (opcode == REMOVE) + { + static const cJSON invalid = { NULL, NULL, NULL, cJSON_Invalid, NULL, 0, 0, NULL}; + + overwrite_item(object, invalid); + + status = 0; + goto cleanup; + } + + if ((opcode == REPLACE) || (opcode == ADD)) + { + value = get_object_item(patch, "value", case_sensitive); + if (value == NULL) + { + /* missing "value" for add/replace. */ + status = 7; + goto cleanup; + } + + value = cJSON_Duplicate(value, 1); + if (value == NULL) + { + /* out of memory for add/replace. */ + status = 8; + goto cleanup; + } + + overwrite_item(object, *value); + + /* delete the duplicated value */ + cJSON_free(value); + value = NULL; + + /* the string "value" isn't needed */ + if (object->string != NULL) + { + cJSON_free(object->string); + object->string = NULL; + } + + status = 0; + goto cleanup; + } + } + + if ((opcode == REMOVE) || (opcode == REPLACE)) + { + /* Get rid of old. */ + cJSON *old_item = detach_path(object, (unsigned char*)path->valuestring, case_sensitive); + if (old_item == NULL) + { + status = 13; + goto cleanup; + } + cJSON_Delete(old_item); + if (opcode == REMOVE) + { + /* For Remove, this job is done. */ + status = 0; + goto cleanup; + } + } + + /* Copy/Move uses "from". */ + if ((opcode == MOVE) || (opcode == COPY)) + { + cJSON *from = get_object_item(patch, "from", case_sensitive); + if (from == NULL) + { + /* missing "from" for copy/move. */ + status = 4; + goto cleanup; + } + + if (opcode == MOVE) + { + value = detach_path(object, (unsigned char*)from->valuestring, case_sensitive); + } + if (opcode == COPY) + { + value = get_item_from_pointer(object, from->valuestring, case_sensitive); + } + if (value == NULL) + { + /* missing "from" for copy/move. */ + status = 5; + goto cleanup; + } + if (opcode == COPY) + { + value = cJSON_Duplicate(value, 1); + } + if (value == NULL) + { + /* out of memory for copy/move. */ + status = 6; + goto cleanup; + } + } + else /* Add/Replace uses "value". */ + { + value = get_object_item(patch, "value", case_sensitive); + if (value == NULL) + { + /* missing "value" for add/replace. */ + status = 7; + goto cleanup; + } + value = cJSON_Duplicate(value, 1); + if (value == NULL) + { + /* out of memory for add/replace. */ + status = 8; + goto cleanup; + } + } + + /* Now, just add "value" to "path". */ + + /* split pointer in parent and child */ + parent_pointer = cJSONUtils_strdup((unsigned char*)path->valuestring); + if (parent_pointer) { + child_pointer = (unsigned char*)strrchr((char*)parent_pointer, '/'); + } + if (child_pointer != NULL) + { + child_pointer[0] = '\0'; + child_pointer++; + } + parent = get_item_from_pointer(object, (char*)parent_pointer, case_sensitive); + decode_pointer_inplace(child_pointer); + + /* add, remove, replace, move, copy, test. */ + if ((parent == NULL) || (child_pointer == NULL)) + { + /* Couldn't find object to add to. */ + status = 9; + goto cleanup; + } + else if (cJSON_IsArray(parent)) + { + if (strcmp((char*)child_pointer, "-") == 0) + { + cJSON_AddItemToArray(parent, value); + value = NULL; + } + else + { + size_t index = 0; + if (!decode_array_index_from_pointer(child_pointer, &index)) + { + status = 11; + goto cleanup; + } + + if (!insert_item_in_array(parent, index, value)) + { + status = 10; + goto cleanup; + } + value = NULL; + } + } + else if (cJSON_IsObject(parent)) + { + if (case_sensitive) + { + cJSON_DeleteItemFromObjectCaseSensitive(parent, (char*)child_pointer); + } + else + { + cJSON_DeleteItemFromObject(parent, (char*)child_pointer); + } + cJSON_AddItemToObject(parent, (char*)child_pointer, value); + value = NULL; + } + else /* parent is not an object */ + { + /* Couldn't find object to add to. */ + status = 9; + goto cleanup; + } + +cleanup: + if (value != NULL) + { + cJSON_Delete(value); + } + if (parent_pointer != NULL) + { + cJSON_free(parent_pointer); + } + + return status; +} + +CJSON_PUBLIC(int) cJSONUtils_ApplyPatches(cJSON * const object, const cJSON * const patches) +{ + const cJSON *current_patch = NULL; + int status = 0; + + if (!cJSON_IsArray(patches)) + { + /* malformed patches. */ + return 1; + } + + if (patches != NULL) + { + current_patch = patches->child; + } + + while (current_patch != NULL) + { + status = apply_patch(object, current_patch, false); + if (status != 0) + { + return status; + } + current_patch = current_patch->next; + } + + return 0; +} + +CJSON_PUBLIC(int) cJSONUtils_ApplyPatchesCaseSensitive(cJSON * const object, const cJSON * const patches) +{ + const cJSON *current_patch = NULL; + int status = 0; + + if (!cJSON_IsArray(patches)) + { + /* malformed patches. */ + return 1; + } + + if (patches != NULL) + { + current_patch = patches->child; + } + + while (current_patch != NULL) + { + status = apply_patch(object, current_patch, true); + if (status != 0) + { + return status; + } + current_patch = current_patch->next; + } + + return 0; +} + +static void compose_patch(cJSON * const patches, const unsigned char * const operation, const unsigned char * const path, const unsigned char *suffix, const cJSON * const value) +{ + cJSON *patch = NULL; + + if ((patches == NULL) || (operation == NULL) || (path == NULL)) + { + return; + } + + patch = cJSON_CreateObject(); + if (patch == NULL) + { + return; + } + cJSON_AddItemToObject(patch, "op", cJSON_CreateString((const char*)operation)); + + if (suffix == NULL) + { + cJSON_AddItemToObject(patch, "path", cJSON_CreateString((const char*)path)); + } + else + { + size_t suffix_length = pointer_encoded_length(suffix); + size_t path_length = strlen((const char*)path); + unsigned char *full_path = (unsigned char*)cJSON_malloc(path_length + suffix_length + sizeof("/")); + + sprintf((char*)full_path, "%s/", (const char*)path); + encode_string_as_pointer(full_path + path_length + 1, suffix); + + cJSON_AddItemToObject(patch, "path", cJSON_CreateString((const char*)full_path)); + cJSON_free(full_path); + } + + if (value != NULL) + { + cJSON_AddItemToObject(patch, "value", cJSON_Duplicate(value, 1)); + } + cJSON_AddItemToArray(patches, patch); +} + +CJSON_PUBLIC(void) cJSONUtils_AddPatchToArray(cJSON * const array, const char * const operation, const char * const path, const cJSON * const value) +{ + compose_patch(array, (const unsigned char*)operation, (const unsigned char*)path, NULL, value); +} + +static void create_patches(cJSON * const patches, const unsigned char * const path, cJSON * const from, cJSON * const to, const cJSON_bool case_sensitive) +{ + if ((from == NULL) || (to == NULL)) + { + return; + } + + if ((from->type & 0xFF) != (to->type & 0xFF)) + { + compose_patch(patches, (const unsigned char*)"replace", path, 0, to); + return; + } + + switch (from->type & 0xFF) + { + case cJSON_Number: + if ((from->valueint != to->valueint) || !compare_double(from->valuedouble, to->valuedouble)) + { + compose_patch(patches, (const unsigned char*)"replace", path, NULL, to); + } + return; + + case cJSON_String: + if (strcmp(from->valuestring, to->valuestring) != 0) + { + compose_patch(patches, (const unsigned char*)"replace", path, NULL, to); + } + return; + + case cJSON_Array: + { + size_t index = 0; + cJSON *from_child = from->child; + cJSON *to_child = to->child; + unsigned char *new_path = (unsigned char*)cJSON_malloc(strlen((const char*)path) + 20 + sizeof("/")); /* Allow space for 64bit int. log10(2^64) = 20 */ + + /* generate patches for all array elements that exist in both "from" and "to" */ + for (index = 0; (from_child != NULL) && (to_child != NULL); (void)(from_child = from_child->next), (void)(to_child = to_child->next), index++) + { + /* check if conversion to unsigned long is valid + * This should be eliminated at compile time by dead code elimination + * if size_t is an alias of unsigned long, or if it is bigger */ + if (index > ULONG_MAX) + { + cJSON_free(new_path); + return; + } + sprintf((char*)new_path, "%s/%lu", path, (unsigned long)index); /* path of the current array element */ + create_patches(patches, new_path, from_child, to_child, case_sensitive); + } + + /* remove leftover elements from 'from' that are not in 'to' */ + for (; (from_child != NULL); (void)(from_child = from_child->next)) + { + /* check if conversion to unsigned long is valid + * This should be eliminated at compile time by dead code elimination + * if size_t is an alias of unsigned long, or if it is bigger */ + if (index > ULONG_MAX) + { + cJSON_free(new_path); + return; + } + sprintf((char*)new_path, "%lu", (unsigned long)index); + compose_patch(patches, (const unsigned char*)"remove", path, new_path, NULL); + } + /* add new elements in 'to' that were not in 'from' */ + for (; (to_child != NULL); (void)(to_child = to_child->next), index++) + { + compose_patch(patches, (const unsigned char*)"add", path, (const unsigned char*)"-", to_child); + } + cJSON_free(new_path); + return; + } + + case cJSON_Object: + { + cJSON *from_child = NULL; + cJSON *to_child = NULL; + sort_object(from, case_sensitive); + sort_object(to, case_sensitive); + + from_child = from->child; + to_child = to->child; + /* for all object values in the object with more of them */ + while ((from_child != NULL) || (to_child != NULL)) + { + int diff; + if (from_child == NULL) + { + diff = 1; + } + else if (to_child == NULL) + { + diff = -1; + } + else + { + diff = compare_strings((unsigned char*)from_child->string, (unsigned char*)to_child->string, case_sensitive); + } + + if (diff == 0) + { + /* both object keys are the same */ + size_t path_length = strlen((const char*)path); + size_t from_child_name_length = pointer_encoded_length((unsigned char*)from_child->string); + unsigned char *new_path = (unsigned char*)cJSON_malloc(path_length + from_child_name_length + sizeof("/")); + + sprintf((char*)new_path, "%s/", path); + encode_string_as_pointer(new_path + path_length + 1, (unsigned char*)from_child->string); + + /* create a patch for the element */ + create_patches(patches, new_path, from_child, to_child, case_sensitive); + cJSON_free(new_path); + + from_child = from_child->next; + to_child = to_child->next; + } + else if (diff < 0) + { + /* object element doesn't exist in 'to' --> remove it */ + compose_patch(patches, (const unsigned char*)"remove", path, (unsigned char*)from_child->string, NULL); + + from_child = from_child->next; + } + else + { + /* object element doesn't exist in 'from' --> add it */ + compose_patch(patches, (const unsigned char*)"add", path, (unsigned char*)to_child->string, to_child); + + to_child = to_child->next; + } + } + return; + } + + default: + break; + } +} + +CJSON_PUBLIC(cJSON *) cJSONUtils_GeneratePatches(cJSON * const from, cJSON * const to) +{ + cJSON *patches = NULL; + + if ((from == NULL) || (to == NULL)) + { + return NULL; + } + + patches = cJSON_CreateArray(); + create_patches(patches, (const unsigned char*)"", from, to, false); + + return patches; +} + +CJSON_PUBLIC(cJSON *) cJSONUtils_GeneratePatchesCaseSensitive(cJSON * const from, cJSON * const to) +{ + cJSON *patches = NULL; + + if ((from == NULL) || (to == NULL)) + { + return NULL; + } + + patches = cJSON_CreateArray(); + create_patches(patches, (const unsigned char*)"", from, to, true); + + return patches; +} + +CJSON_PUBLIC(void) cJSONUtils_SortObject(cJSON * const object) +{ + sort_object(object, false); +} + +CJSON_PUBLIC(void) cJSONUtils_SortObjectCaseSensitive(cJSON * const object) +{ + sort_object(object, true); +} + +static cJSON *merge_patch(cJSON *target, const cJSON * const patch, const cJSON_bool case_sensitive) +{ + cJSON *patch_child = NULL; + + if (!cJSON_IsObject(patch)) + { + /* scalar value, array or NULL, just duplicate */ + cJSON_Delete(target); + return cJSON_Duplicate(patch, 1); + } + + if (!cJSON_IsObject(target)) + { + cJSON_Delete(target); + target = cJSON_CreateObject(); + } + + patch_child = patch->child; + while (patch_child != NULL) + { + if (cJSON_IsNull(patch_child)) + { + /* NULL is the indicator to remove a value, see RFC7396 */ + if (case_sensitive) + { + cJSON_DeleteItemFromObjectCaseSensitive(target, patch_child->string); + } + else + { + cJSON_DeleteItemFromObject(target, patch_child->string); + } + } + else + { + cJSON *replace_me = NULL; + cJSON *replacement = NULL; + + if (case_sensitive) + { + replace_me = cJSON_DetachItemFromObjectCaseSensitive(target, patch_child->string); + } + else + { + replace_me = cJSON_DetachItemFromObject(target, patch_child->string); + } + + replacement = merge_patch(replace_me, patch_child, case_sensitive); + if (replacement == NULL) + { + cJSON_Delete(target); + return NULL; + } + + cJSON_AddItemToObject(target, patch_child->string, replacement); + } + patch_child = patch_child->next; + } + return target; +} + +CJSON_PUBLIC(cJSON *) cJSONUtils_MergePatch(cJSON *target, const cJSON * const patch) +{ + return merge_patch(target, patch, false); +} + +CJSON_PUBLIC(cJSON *) cJSONUtils_MergePatchCaseSensitive(cJSON *target, const cJSON * const patch) +{ + return merge_patch(target, patch, true); +} + +static cJSON *generate_merge_patch(cJSON * const from, cJSON * const to, const cJSON_bool case_sensitive) +{ + cJSON *from_child = NULL; + cJSON *to_child = NULL; + cJSON *patch = NULL; + if (to == NULL) + { + /* patch to delete everything */ + return cJSON_CreateNull(); + } + if (!cJSON_IsObject(to) || !cJSON_IsObject(from)) + { + return cJSON_Duplicate(to, 1); + } + + sort_object(from, case_sensitive); + sort_object(to, case_sensitive); + + from_child = from->child; + to_child = to->child; + patch = cJSON_CreateObject(); + if (patch == NULL) + { + return NULL; + } + while (from_child || to_child) + { + int diff; + if (from_child != NULL) + { + if (to_child != NULL) + { + diff = strcmp(from_child->string, to_child->string); + } + else + { + diff = -1; + } + } + else + { + diff = 1; + } + + if (diff < 0) + { + /* from has a value that to doesn't have -> remove */ + cJSON_AddItemToObject(patch, from_child->string, cJSON_CreateNull()); + + from_child = from_child->next; + } + else if (diff > 0) + { + /* to has a value that from doesn't have -> add to patch */ + cJSON_AddItemToObject(patch, to_child->string, cJSON_Duplicate(to_child, 1)); + + to_child = to_child->next; + } + else + { + /* object key exists in both objects */ + if (!compare_json(from_child, to_child, case_sensitive)) + { + /* not identical --> generate a patch */ + cJSON_AddItemToObject(patch, to_child->string, cJSONUtils_GenerateMergePatch(from_child, to_child)); + } + + /* next key in the object */ + from_child = from_child->next; + to_child = to_child->next; + } + } + if (patch->child == NULL) + { + /* no patch generated */ + cJSON_Delete(patch); + return NULL; + } + + return patch; +} + +CJSON_PUBLIC(cJSON *) cJSONUtils_GenerateMergePatch(cJSON * const from, cJSON * const to) +{ + return generate_merge_patch(from, to, false); +} + +CJSON_PUBLIC(cJSON *) cJSONUtils_GenerateMergePatchCaseSensitive(cJSON * const from, cJSON * const to) +{ + return generate_merge_patch(from, to, true); +} diff --git a/thirdparty/cjson/cJSON_Utils.h b/thirdparty/cjson/cJSON_Utils.h new file mode 100644 index 0000000..a970c65 --- /dev/null +++ b/thirdparty/cjson/cJSON_Utils.h @@ -0,0 +1,88 @@ +/* + Copyright (c) 2009-2017 Dave Gamble and cJSON contributors + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + THE SOFTWARE. +*/ + +#ifndef cJSON_Utils__h +#define cJSON_Utils__h + +#ifdef __cplusplus +extern "C" +{ +#endif + +#include "cJSON.h" + +/* Implement RFC6901 (https://tools.ietf.org/html/rfc6901) JSON Pointer spec. */ +CJSON_PUBLIC(cJSON *) cJSONUtils_GetPointer(cJSON * const object, const char *pointer); +CJSON_PUBLIC(cJSON *) cJSONUtils_GetPointerCaseSensitive(cJSON * const object, const char *pointer); + +/* Implement RFC6902 (https://tools.ietf.org/html/rfc6902) JSON Patch spec. */ +/* NOTE: This modifies objects in 'from' and 'to' by sorting the elements by their key */ +CJSON_PUBLIC(cJSON *) cJSONUtils_GeneratePatches(cJSON * const from, cJSON * const to); +CJSON_PUBLIC(cJSON *) cJSONUtils_GeneratePatchesCaseSensitive(cJSON * const from, cJSON * const to); +/* Utility for generating patch array entries. */ +CJSON_PUBLIC(void) cJSONUtils_AddPatchToArray(cJSON * const array, const char * const operation, const char * const path, const cJSON * const value); +/* Returns 0 for success. */ +CJSON_PUBLIC(int) cJSONUtils_ApplyPatches(cJSON * const object, const cJSON * const patches); +CJSON_PUBLIC(int) cJSONUtils_ApplyPatchesCaseSensitive(cJSON * const object, const cJSON * const patches); + +/* +// Note that ApplyPatches is NOT atomic on failure. To implement an atomic ApplyPatches, use: +//int cJSONUtils_AtomicApplyPatches(cJSON **object, cJSON *patches) +//{ +// cJSON *modme = cJSON_Duplicate(*object, 1); +// int error = cJSONUtils_ApplyPatches(modme, patches); +// if (!error) +// { +// cJSON_Delete(*object); +// *object = modme; +// } +// else +// { +// cJSON_Delete(modme); +// } +// +// return error; +//} +// Code not added to library since this strategy is a LOT slower. +*/ + +/* Implement RFC7386 (https://tools.ietf.org/html/rfc7396) JSON Merge Patch spec. */ +/* target will be modified by patch. return value is new ptr for target. */ +CJSON_PUBLIC(cJSON *) cJSONUtils_MergePatch(cJSON *target, const cJSON * const patch); +CJSON_PUBLIC(cJSON *) cJSONUtils_MergePatchCaseSensitive(cJSON *target, const cJSON * const patch); +/* generates a patch to move from -> to */ +/* NOTE: This modifies objects in 'from' and 'to' by sorting the elements by their key */ +CJSON_PUBLIC(cJSON *) cJSONUtils_GenerateMergePatch(cJSON * const from, cJSON * const to); +CJSON_PUBLIC(cJSON *) cJSONUtils_GenerateMergePatchCaseSensitive(cJSON * const from, cJSON * const to); + +/* Given a root object and a target object, construct a pointer from one to the other. */ +CJSON_PUBLIC(char *) cJSONUtils_FindPointerFromObjectTo(const cJSON * const object, const cJSON * const target); + +/* Sorts the members of the object into alphabetical order. */ +CJSON_PUBLIC(void) cJSONUtils_SortObject(cJSON * const object); +CJSON_PUBLIC(void) cJSONUtils_SortObjectCaseSensitive(cJSON * const object); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/thirdparty/enet/.github/workflows/cmake.yml b/thirdparty/enet/.github/workflows/cmake.yml new file mode 100644 index 0000000..721d430 --- /dev/null +++ b/thirdparty/enet/.github/workflows/cmake.yml @@ -0,0 +1,21 @@ +on: [push, pull_request] + +name: CMake + +jobs: + cmake-build: + name: CMake ${{ matrix.os }} ${{ matrix.build_type }} + runs-on: ${{ matrix.os }} + strategy: + fail-fast: false + matrix: + os: ["ubuntu-latest", "windows-latest", "macos-latest"] + build_type: ["Debug", "Release"] + steps: + - uses: actions/checkout@v3 + + - name: Configure CMake + run: cmake -B ${{github.workspace}}/build -DCMAKE_BUILD_TYPE=${{ matrix.build_type }} + + - name: Build + run: cmake --build ${{github.workspace}}/build --config ${{ matrix.build_type }} diff --git a/thirdparty/enet/CMakeLists.txt b/thirdparty/enet/CMakeLists.txt new file mode 100644 index 0000000..82a98b1 --- /dev/null +++ b/thirdparty/enet/CMakeLists.txt @@ -0,0 +1,103 @@ +cmake_minimum_required(VERSION 2.8.12...3.20) + +project(enet) + +# The "configure" step. +include(CheckFunctionExists) +include(CheckStructHasMember) +include(CheckTypeSize) +check_function_exists("fcntl" HAS_FCNTL) +check_function_exists("poll" HAS_POLL) +check_function_exists("getaddrinfo" HAS_GETADDRINFO) +check_function_exists("getnameinfo" HAS_GETNAMEINFO) +check_function_exists("gethostbyname_r" HAS_GETHOSTBYNAME_R) +check_function_exists("gethostbyaddr_r" HAS_GETHOSTBYADDR_R) +check_function_exists("inet_pton" HAS_INET_PTON) +check_function_exists("inet_ntop" HAS_INET_NTOP) +check_struct_has_member("struct msghdr" "msg_flags" "sys/types.h;sys/socket.h" HAS_MSGHDR_FLAGS) +set(CMAKE_EXTRA_INCLUDE_FILES "sys/types.h" "sys/socket.h") +check_type_size("socklen_t" HAS_SOCKLEN_T BUILTIN_TYPES_ONLY) +unset(CMAKE_EXTRA_INCLUDE_FILES) +if(MSVC) + add_definitions(-W3) +else() + add_definitions(-Wno-error) +endif() + +if(HAS_FCNTL) + add_definitions(-DHAS_FCNTL=1) +endif() +if(HAS_POLL) + add_definitions(-DHAS_POLL=1) +endif() +if(HAS_GETNAMEINFO) + add_definitions(-DHAS_GETNAMEINFO=1) +endif() +if(HAS_GETADDRINFO) + add_definitions(-DHAS_GETADDRINFO=1) +endif() +if(HAS_GETHOSTBYNAME_R) + add_definitions(-DHAS_GETHOSTBYNAME_R=1) +endif() +if(HAS_GETHOSTBYADDR_R) + add_definitions(-DHAS_GETHOSTBYADDR_R=1) +endif() +if(HAS_INET_PTON) + add_definitions(-DHAS_INET_PTON=1) +endif() +if(HAS_INET_NTOP) + add_definitions(-DHAS_INET_NTOP=1) +endif() +if(HAS_MSGHDR_FLAGS) + add_definitions(-DHAS_MSGHDR_FLAGS=1) +endif() +if(HAS_SOCKLEN_T) + add_definitions(-DHAS_SOCKLEN_T=1) +endif() + +include_directories(${PROJECT_SOURCE_DIR}/include) + +set(INCLUDE_FILES_PREFIX include/enet) +set(INCLUDE_FILES + ${INCLUDE_FILES_PREFIX}/callbacks.h + ${INCLUDE_FILES_PREFIX}/enet.h + ${INCLUDE_FILES_PREFIX}/list.h + ${INCLUDE_FILES_PREFIX}/protocol.h + ${INCLUDE_FILES_PREFIX}/time.h + ${INCLUDE_FILES_PREFIX}/types.h + ${INCLUDE_FILES_PREFIX}/unix.h + ${INCLUDE_FILES_PREFIX}/utility.h + ${INCLUDE_FILES_PREFIX}/win32.h +) + +set(SOURCE_FILES + callbacks.c + compress.c + host.c + list.c + packet.c + peer.c + protocol.c + unix.c + win32.c) + +source_group(include FILES ${INCLUDE_FILES}) +source_group(source FILES ${SOURCE_FILES}) + +add_library(enet STATIC + ${SOURCE_FILES} +) + +target_include_directories(enet PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/include ) + +if (MINGW) + target_link_libraries(enet winmm ws2_32) +endif() + +install(TARGETS enet + RUNTIME DESTINATION bin + ARCHIVE DESTINATION lib/static + LIBRARY DESTINATION lib) + +install(DIRECTORY include/ + DESTINATION include) diff --git a/thirdparty/enet/ChangeLog b/thirdparty/enet/ChangeLog new file mode 100644 index 0000000..0fc45d3 --- /dev/null +++ b/thirdparty/enet/ChangeLog @@ -0,0 +1,209 @@ +ENet 1.3.18 (April 14, 2024): + +* Packet sending performance improvements +* MTU negotiation fixes +* Checksum alignment fix +* No more dynamic initialization of checksum table +* ENET_SOCKOPT_TTL +* Other miscellaneous small improvements + +ENet 1.3.17 (November 15, 2020): + +* fixes for sender getting too far ahead of receiver that can cause instability with reliable packets + +ENet 1.3.16 (September 8, 2020): + +* fix bug in unreliable fragment queuing +* use single output queue for reliable and unreliable packets for saner ordering +* revert experimental throttle changes that were less stable than prior algorithm + +ENet 1.3.15 (April 20, 2020): + +* quicker RTT initialization +* use fractional precision for RTT calculations +* fixes for packet throttle with low RTT variance +* miscellaneous socket bug fixes + +ENet 1.3.14 (January 27, 2019): + +* bug fix for enet_peer_disconnect_later() +* use getaddrinfo and getnameinfo where available +* miscellaneous cleanups + +ENet 1.3.13 (April 30, 2015): + +* miscellaneous bug fixes +* added premake and cmake support +* miscellaneous documentation cleanups + +ENet 1.3.12 (April 24, 2014): + +* added maximumPacketSize and maximumWaitingData fields to ENetHost to limit the amount of +data waiting to be delivered on a peer (beware that the default maximumPacketSize is +32MB and should be set higher if desired as should maximumWaitingData) + +ENet 1.3.11 (December 26, 2013): + +* allow an ENetHost to connect to itself +* fixed possible bug with disconnect notifications during connect attempts +* fixed some preprocessor definition bugs + +ENet 1.3.10 (October 23, 2013); + +* doubled maximum reliable window size +* fixed RCVTIMEO/SNDTIMEO socket options and also added NODELAY + +ENet 1.3.9 (August 19, 2013): + +* added duplicatePeers option to ENetHost which can limit the number of peers from duplicate IPs +* added enet_socket_get_option() and ENET_SOCKOPT_ERROR +* added enet_host_random_seed() platform stub + +ENet 1.3.8 (June 2, 2013): + +* added enet_linked_version() for checking the linked version +* added enet_socket_get_address() for querying the local address of a socket +* silenced some debugging prints unless ENET_DEBUG is defined during compilation +* handle EINTR in enet_socket_wait() so that enet_host_service() doesn't propagate errors from signals +* optimized enet_host_bandwidth_throttle() to be less expensive for large numbers of peers + +ENet 1.3.7 (March 6, 2013): + +* added ENET_PACKET_FLAG_SENT to indicate that a packet is being freed because it has been sent +* added userData field to ENetPacket +* changed how random seed is generated on Windows to avoid import warnings +* fixed case where disconnects could be generated with no preceding connect event + +ENet 1.3.6 (December 11, 2012): + +* added support for intercept callback in ENetHost that can be used to process raw packets before ENet +* added enet_socket_shutdown() for issuing shutdown on a socket +* fixed enet_socket_connect() to not error on non-blocking connects +* fixed bug in MTU negotiation during connections + +ENet 1.3.5 (July 31, 2012): + +* fixed bug in unreliable packet fragment queuing + +ENet 1.3.4 (May 29, 2012): + +* added enet_peer_ping_interval() for configuring per-peer ping intervals +* added enet_peer_timeout() for configuring per-peer timeouts +* added protocol packet size limits + +ENet 1.3.3 (June 28, 2011): + +* fixed bug with simultaneous disconnects not dispatching events + +ENet 1.3.2 (May 31, 2011): + +* added support for unreliable packet fragmenting via the packet flag +ENET_PACKET_FLAG_UNRELIABLE_FRAGMENT +* fixed regression in unreliable packet queuing +* added check against received port to limit some forms of IP-spoofing + +ENet 1.3.1 (February 10, 2011): + +* fixed bug in tracking of reliable data in transit +* reliable data window size now scales with the throttle +* fixed bug in fragment length calculation when checksums are used + +ENet 1.3.0 (June 5, 2010): + +* enet_host_create() now requires the channel limit to be specified as +a parameter +* enet_host_connect() now accepts a data parameter which is supplied +to the receiving receiving host in the event data field for a connect event +* added an adaptive order-2 PPM range coder as a built-in compressor option +which can be set with enet_host_compress_with_range_coder() +* added support for packet compression configurable with a callback +* improved session number handling to not rely on the packet checksum +field, saving 4 bytes per packet unless the checksum option is used +* removed the dependence on the rand callback for session number handling + +Caveats: This version is not protocol compatible with the 1.2 series or +earlier. The enet_host_connect and enet_host_create API functions require +supplying additional parameters. + +ENet 1.2.5 (June 28, 2011): + +* fixed bug with simultaneous disconnects not dispatching events + +ENet 1.2.4 (May 31, 2011): + +* fixed regression in unreliable packet queuing +* added check against received port to limit some forms of IP-spoofing + +ENet 1.2.3 (February 10, 2011): + +* fixed bug in tracking reliable data in transit + +ENet 1.2.2 (June 5, 2010): + +* checksum functionality is now enabled by setting a checksum callback +inside ENetHost instead of being a configure script option +* added totalSentData, totalSentPackets, totalReceivedData, and +totalReceivedPackets counters inside ENetHost for getting usage +statistics +* added enet_host_channel_limit() for limiting the maximum number of +channels allowed by connected peers +* now uses dispatch queues for event dispatch rather than potentially +unscalable array walking +* added no_memory callback that is called when a malloc attempt fails, +such that if no_memory returns rather than aborts (the default behavior), +then the error is propagated to the return value of the API calls +* now uses packed attribute for protocol structures on platforms with +strange alignment rules +* improved autoconf build system contributed by Nathan Brink allowing +for easier building as a shared library + +Caveats: If you were using the compile-time option that enabled checksums, +make sure to set the checksum callback inside ENetHost to enet_crc32 to +regain the old behavior. The ENetCallbacks structure has added new fields, +so make sure to clear the structure to zero before use if +using enet_initialize_with_callbacks(). + +ENet 1.2.1 (November 12, 2009): + +* fixed bug that could cause disconnect events to be dropped +* added thin wrapper around select() for portable usage +* added ENET_SOCKOPT_REUSEADDR socket option +* factored enet_socket_bind()/enet_socket_listen() out of enet_socket_create() +* added contributed Code::Blocks build file + +ENet 1.2 (February 12, 2008): + +* fixed bug in VERIFY_CONNECT acknowledgement that could cause connect +attempts to occasionally timeout +* fixed acknowledgements to check both the outgoing and sent queues +when removing acknowledged packets +* fixed accidental bit rot in the MSVC project file +* revised sequence number overflow handling to address some possible +disconnect bugs +* added enet_host_check_events() for getting only local queued events +* factored out socket option setting into enet_socket_set_option() so +that socket options are now set separately from enet_socket_create() + +Caveats: While this release is superficially protocol compatible with 1.1, +differences in the sequence number overflow handling can potentially cause +random disconnects. + +ENet 1.1 (June 6, 2007): + +* optional CRC32 just in case someone needs a stronger checksum than UDP +provides (--enable-crc32 configure option) +* the size of packet headers are half the size they used to be (so less +overhead when sending small packets) +* enet_peer_disconnect_later() that waits till all queued outgoing +packets get sent before issuing an actual disconnect +* freeCallback field in individual packets for notification of when a +packet is about to be freed +* ENET_PACKET_FLAG_NO_ALLOCATE for supplying pre-allocated data to a +packet (can be used in concert with freeCallback to support some custom +allocation schemes that the normal memory allocation callbacks would +normally not allow) +* enet_address_get_host_ip() for printing address numbers +* promoted the enet_socket_*() functions to be part of the API now +* a few stability/crash fixes + + diff --git a/thirdparty/enet/Doxyfile b/thirdparty/enet/Doxyfile new file mode 100644 index 0000000..b72cb50 --- /dev/null +++ b/thirdparty/enet/Doxyfile @@ -0,0 +1,2303 @@ +# Doxyfile 1.8.6 + +# This file describes the settings to be used by the documentation system +# doxygen (www.doxygen.org) for a project. +# +# All text after a double hash (##) is considered a comment and is placed in +# front of the TAG it is preceding. +# +# All text after a single hash (#) is considered a comment and will be ignored. +# The format is: +# TAG = value [value, ...] +# For lists, items can also be appended using: +# TAG += value [value, ...] +# Values that contain spaces should be placed between quotes (\" \"). + +#--------------------------------------------------------------------------- +# Project related configuration options +#--------------------------------------------------------------------------- + +# This tag specifies the encoding used for all characters in the config file +# that follow. The default is UTF-8 which is also the encoding used for all text +# before the first occurrence of this tag. Doxygen uses libiconv (or the iconv +# built into libc) for the transcoding. See http://www.gnu.org/software/libiconv +# for the list of possible encodings. +# The default value is: UTF-8. + +DOXYFILE_ENCODING = UTF-8 + +# The PROJECT_NAME tag is a single word (or a sequence of words surrounded by +# double-quotes, unless you are using Doxywizard) that should identify the +# project for which the documentation is generated. This name is used in the +# title of most generated pages and in a few other places. +# The default value is: My Project. + +PROJECT_NAME = "ENet" + +# The PROJECT_NUMBER tag can be used to enter a project or revision number. This +# could be handy for archiving the generated documentation or if some version +# control system is used. + +PROJECT_NUMBER = v1.3.18 + +# Using the PROJECT_BRIEF tag one can provide an optional one line description +# for a project that appears at the top of each page and should give viewer a +# quick idea about the purpose of the project. Keep the description short. + +PROJECT_BRIEF = "Reliable UDP networking library" + +# With the PROJECT_LOGO tag one can specify an logo or icon that is included in +# the documentation. The maximum height of the logo should not exceed 55 pixels +# and the maximum width should not exceed 200 pixels. Doxygen will copy the logo +# to the output directory. + +PROJECT_LOGO = + +# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) path +# into which the generated documentation will be written. If a relative path is +# entered, it will be relative to the location where doxygen was started. If +# left blank the current directory will be used. + +OUTPUT_DIRECTORY = docs + +# If the CREATE_SUBDIRS tag is set to YES, then doxygen will create 4096 sub- +# directories (in 2 levels) under the output directory of each output format and +# will distribute the generated files over these directories. Enabling this +# option can be useful when feeding doxygen a huge amount of source files, where +# putting all generated files in the same directory would otherwise causes +# performance problems for the file system. +# The default value is: NO. + +CREATE_SUBDIRS = NO + +# The OUTPUT_LANGUAGE tag is used to specify the language in which all +# documentation generated by doxygen is written. Doxygen will use this +# information to generate all constant output in the proper language. +# Possible values are: Afrikaans, Arabic, Armenian, Brazilian, Catalan, Chinese, +# Chinese-Traditional, Croatian, Czech, Danish, Dutch, English (United States), +# Esperanto, Farsi (Persian), Finnish, French, German, Greek, Hungarian, +# Indonesian, Italian, Japanese, Japanese-en (Japanese with English messages), +# Korean, Korean-en (Korean with English messages), Latvian, Lithuanian, +# Macedonian, Norwegian, Persian (Farsi), Polish, Portuguese, Romanian, Russian, +# Serbian, Serbian-Cyrillic, Slovak, Slovene, Spanish, Swedish, Turkish, +# Ukrainian and Vietnamese. +# The default value is: English. + +OUTPUT_LANGUAGE = English + +# If the BRIEF_MEMBER_DESC tag is set to YES doxygen will include brief member +# descriptions after the members that are listed in the file and class +# documentation (similar to Javadoc). Set to NO to disable this. +# The default value is: YES. + +BRIEF_MEMBER_DESC = YES + +# If the REPEAT_BRIEF tag is set to YES doxygen will prepend the brief +# description of a member or function before the detailed description +# +# Note: If both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the +# brief descriptions will be completely suppressed. +# The default value is: YES. + +REPEAT_BRIEF = YES + +# This tag implements a quasi-intelligent brief description abbreviator that is +# used to form the text in various listings. Each string in this list, if found +# as the leading text of the brief description, will be stripped from the text +# and the result, after processing the whole list, is used as the annotated +# text. Otherwise, the brief description is used as-is. If left blank, the +# following values are used ($name is automatically replaced with the name of +# the entity):The $name class, The $name widget, The $name file, is, provides, +# specifies, contains, represents, a, an and the. + +ABBREVIATE_BRIEF = + +# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then +# doxygen will generate a detailed section even if there is only a brief +# description. +# The default value is: NO. + +ALWAYS_DETAILED_SEC = YES + +# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all +# inherited members of a class in the documentation of that class as if those +# members were ordinary class members. Constructors, destructors and assignment +# operators of the base classes will not be shown. +# The default value is: NO. + +INLINE_INHERITED_MEMB = YES + +# If the FULL_PATH_NAMES tag is set to YES doxygen will prepend the full path +# before files name in the file list and in the header files. If set to NO the +# shortest path that makes the file name unique will be used +# The default value is: YES. + +FULL_PATH_NAMES = YES + +# The STRIP_FROM_PATH tag can be used to strip a user-defined part of the path. +# Stripping is only done if one of the specified strings matches the left-hand +# part of the path. The tag can be used to show relative paths in the file list. +# If left blank the directory from which doxygen is run is used as the path to +# strip. +# +# Note that you can specify absolute paths here, but also relative paths, which +# will be relative from the directory where doxygen is started. +# This tag requires that the tag FULL_PATH_NAMES is set to YES. + +STRIP_FROM_PATH = + +# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of the +# path mentioned in the documentation of a class, which tells the reader which +# header file to include in order to use a class. If left blank only the name of +# the header file containing the class definition is used. Otherwise one should +# specify the list of include paths that are normally passed to the compiler +# using the -I flag. + +STRIP_FROM_INC_PATH = + +# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter (but +# less readable) file names. This can be useful is your file systems doesn't +# support long names like on DOS, Mac, or CD-ROM. +# The default value is: NO. + +SHORT_NAMES = NO + +# If the JAVADOC_AUTOBRIEF tag is set to YES then doxygen will interpret the +# first line (until the first dot) of a Javadoc-style comment as the brief +# description. If set to NO, the Javadoc-style will behave just like regular Qt- +# style comments (thus requiring an explicit @brief command for a brief +# description.) +# The default value is: NO. + +JAVADOC_AUTOBRIEF = YES + +# If the QT_AUTOBRIEF tag is set to YES then doxygen will interpret the first +# line (until the first dot) of a Qt-style comment as the brief description. If +# set to NO, the Qt-style will behave just like regular Qt-style comments (thus +# requiring an explicit \brief command for a brief description.) +# The default value is: NO. + +QT_AUTOBRIEF = NO + +# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make doxygen treat a +# multi-line C++ special comment block (i.e. a block of //! or /// comments) as +# a brief description. This used to be the default behavior. The new default is +# to treat a multi-line C++ comment block as a detailed description. Set this +# tag to YES if you prefer the old behavior instead. +# +# Note that setting this tag to YES also means that rational rose comments are +# not recognized any more. +# The default value is: NO. + +MULTILINE_CPP_IS_BRIEF = NO + +# If the INHERIT_DOCS tag is set to YES then an undocumented member inherits the +# documentation from any documented member that it re-implements. +# The default value is: YES. + +INHERIT_DOCS = YES + +# If the SEPARATE_MEMBER_PAGES tag is set to YES, then doxygen will produce a +# new page for each member. If set to NO, the documentation of a member will be +# part of the file/class/namespace that contains it. +# The default value is: NO. + +SEPARATE_MEMBER_PAGES = NO + +# The TAB_SIZE tag can be used to set the number of spaces in a tab. Doxygen +# uses this value to replace tabs by spaces in code fragments. +# Minimum value: 1, maximum value: 16, default value: 4. + +TAB_SIZE = 4 + +# This tag can be used to specify a number of aliases that act as commands in +# the documentation. An alias has the form: +# name=value +# For example adding +# "sideeffect=@par Side Effects:\n" +# will allow you to put the command \sideeffect (or @sideeffect) in the +# documentation, which will result in a user-defined paragraph with heading +# "Side Effects:". You can put \n's in the value part of an alias to insert +# newlines. + +ALIASES = + +# This tag can be used to specify a number of word-keyword mappings (TCL only). +# A mapping has the form "name=value". For example adding "class=itcl::class" +# will allow you to use the command class in the itcl::class meaning. + +TCL_SUBST = + +# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C sources +# only. Doxygen will then generate output that is more tailored for C. For +# instance, some of the names that are used will be different. The list of all +# members will be omitted, etc. +# The default value is: NO. + +OPTIMIZE_OUTPUT_FOR_C = YES + +# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java or +# Python sources only. Doxygen will then generate output that is more tailored +# for that language. For instance, namespaces will be presented as packages, +# qualified scopes will look different, etc. +# The default value is: NO. + +OPTIMIZE_OUTPUT_JAVA = NO + +# Set the OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran +# sources. Doxygen will then generate output that is tailored for Fortran. +# The default value is: NO. + +OPTIMIZE_FOR_FORTRAN = NO + +# Set the OPTIMIZE_OUTPUT_VHDL tag to YES if your project consists of VHDL +# sources. Doxygen will then generate output that is tailored for VHDL. +# The default value is: NO. + +OPTIMIZE_OUTPUT_VHDL = NO + +# Doxygen selects the parser to use depending on the extension of the files it +# parses. With this tag you can assign which parser to use for a given +# extension. Doxygen has a built-in mapping, but you can override or extend it +# using this tag. The format is ext=language, where ext is a file extension, and +# language is one of the parsers supported by doxygen: IDL, Java, Javascript, +# C#, C, C++, D, PHP, Objective-C, Python, Fortran, VHDL. For instance to make +# doxygen treat .inc files as Fortran files (default is PHP), and .f files as C +# (default is Fortran), use: inc=Fortran f=C. +# +# Note For files without extension you can use no_extension as a placeholder. +# +# Note that for custom extensions you also need to set FILE_PATTERNS otherwise +# the files are not read by doxygen. + +EXTENSION_MAPPING = + +# If the MARKDOWN_SUPPORT tag is enabled then doxygen pre-processes all comments +# according to the Markdown format, which allows for more readable +# documentation. See http://daringfireball.net/projects/markdown/ for details. +# The output of markdown processing is further processed by doxygen, so you can +# mix doxygen, HTML, and XML commands with Markdown formatting. Disable only in +# case of backward compatibilities issues. +# The default value is: YES. + +MARKDOWN_SUPPORT = YES + +# When enabled doxygen tries to link words that correspond to documented +# classes, or namespaces to their corresponding documentation. Such a link can +# be prevented in individual cases by by putting a % sign in front of the word +# or globally by setting AUTOLINK_SUPPORT to NO. +# The default value is: YES. + +AUTOLINK_SUPPORT = YES + +# If you use STL classes (i.e. std::string, std::vector, etc.) but do not want +# to include (a tag file for) the STL sources as input, then you should set this +# tag to YES in order to let doxygen match functions declarations and +# definitions whose arguments contain STL classes (e.g. func(std::string); +# versus func(std::string) {}). This also make the inheritance and collaboration +# diagrams that involve STL classes more complete and accurate. +# The default value is: NO. + +BUILTIN_STL_SUPPORT = NO + +# If you use Microsoft's C++/CLI language, you should set this option to YES to +# enable parsing support. +# The default value is: NO. + +CPP_CLI_SUPPORT = NO + +# Set the SIP_SUPPORT tag to YES if your project consists of sip (see: +# http://www.riverbankcomputing.co.uk/software/sip/intro) sources only. Doxygen +# will parse them like normal C++ but will assume all classes use public instead +# of private inheritance when no explicit protection keyword is present. +# The default value is: NO. + +SIP_SUPPORT = NO + +# For Microsoft's IDL there are propget and propput attributes to indicate +# getter and setter methods for a property. Setting this option to YES will make +# doxygen to replace the get and set methods by a property in the documentation. +# This will only work if the methods are indeed getting or setting a simple +# type. If this is not the case, or you want to show the methods anyway, you +# should set this option to NO. +# The default value is: YES. + +IDL_PROPERTY_SUPPORT = YES + +# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC +# tag is set to YES, then doxygen will reuse the documentation of the first +# member in the group (if any) for the other members of the group. By default +# all members of a group must be documented explicitly. +# The default value is: NO. + +DISTRIBUTE_GROUP_DOC = YES + +# Set the SUBGROUPING tag to YES to allow class member groups of the same type +# (for instance a group of public functions) to be put as a subgroup of that +# type (e.g. under the Public Functions section). Set it to NO to prevent +# subgrouping. Alternatively, this can be done per class using the +# \nosubgrouping command. +# The default value is: YES. + +SUBGROUPING = YES + +# When the INLINE_GROUPED_CLASSES tag is set to YES, classes, structs and unions +# are shown inside the group in which they are included (e.g. using \ingroup) +# instead of on a separate page (for HTML and Man pages) or section (for LaTeX +# and RTF). +# +# Note that this feature does not work in combination with +# SEPARATE_MEMBER_PAGES. +# The default value is: NO. + +INLINE_GROUPED_CLASSES = YES + +# When the INLINE_SIMPLE_STRUCTS tag is set to YES, structs, classes, and unions +# with only public data fields or simple typedef fields will be shown inline in +# the documentation of the scope in which they are defined (i.e. file, +# namespace, or group documentation), provided this scope is documented. If set +# to NO, structs, classes, and unions are shown on a separate page (for HTML and +# Man pages) or section (for LaTeX and RTF). +# The default value is: NO. + +INLINE_SIMPLE_STRUCTS = NO + +# When TYPEDEF_HIDES_STRUCT tag is enabled, a typedef of a struct, union, or +# enum is documented as struct, union, or enum with the name of the typedef. So +# typedef struct TypeS {} TypeT, will appear in the documentation as a struct +# with name TypeT. When disabled the typedef will appear as a member of a file, +# namespace, or class. And the struct will be named TypeS. This can typically be +# useful for C code in case the coding convention dictates that all compound +# types are typedef'ed and only the typedef is referenced, never the tag name. +# The default value is: NO. + +TYPEDEF_HIDES_STRUCT = YES + +# The size of the symbol lookup cache can be set using LOOKUP_CACHE_SIZE. This +# cache is used to resolve symbols given their name and scope. Since this can be +# an expensive process and often the same symbol appears multiple times in the +# code, doxygen keeps a cache of pre-resolved symbols. If the cache is too small +# doxygen will become slower. If the cache is too large, memory is wasted. The +# cache size is given by this formula: 2^(16+LOOKUP_CACHE_SIZE). The valid range +# is 0..9, the default is 0, corresponding to a cache size of 2^16=65536 +# symbols. At the end of a run doxygen will report the cache usage and suggest +# the optimal cache size from a speed point of view. +# Minimum value: 0, maximum value: 9, default value: 0. + +LOOKUP_CACHE_SIZE = 0 + +#--------------------------------------------------------------------------- +# Build related configuration options +#--------------------------------------------------------------------------- + +# If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in +# documentation are documented, even if no documentation was available. Private +# class members and static file members will be hidden unless the +# EXTRACT_PRIVATE respectively EXTRACT_STATIC tags are set to YES. +# Note: This will also disable the warnings about undocumented members that are +# normally produced when WARNINGS is set to YES. +# The default value is: NO. + +EXTRACT_ALL = YES + +# If the EXTRACT_PRIVATE tag is set to YES all private members of a class will +# be included in the documentation. +# The default value is: NO. + +EXTRACT_PRIVATE = NO + +# If the EXTRACT_PACKAGE tag is set to YES all members with package or internal +# scope will be included in the documentation. +# The default value is: NO. + +EXTRACT_PACKAGE = NO + +# If the EXTRACT_STATIC tag is set to YES all static members of a file will be +# included in the documentation. +# The default value is: NO. + +EXTRACT_STATIC = NO + +# If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs) defined +# locally in source files will be included in the documentation. If set to NO +# only classes defined in header files are included. Does not have any effect +# for Java sources. +# The default value is: YES. + +EXTRACT_LOCAL_CLASSES = NO + +# This flag is only useful for Objective-C code. When set to YES local methods, +# which are defined in the implementation section but not in the interface are +# included in the documentation. If set to NO only methods in the interface are +# included. +# The default value is: NO. + +EXTRACT_LOCAL_METHODS = NO + +# If this flag is set to YES, the members of anonymous namespaces will be +# extracted and appear in the documentation as a namespace called +# 'anonymous_namespace{file}', where file will be replaced with the base name of +# the file that contains the anonymous namespace. By default anonymous namespace +# are hidden. +# The default value is: NO. + +EXTRACT_ANON_NSPACES = NO + +# If the HIDE_UNDOC_MEMBERS tag is set to YES, doxygen will hide all +# undocumented members inside documented classes or files. If set to NO these +# members will be included in the various overviews, but no documentation +# section is generated. This option has no effect if EXTRACT_ALL is enabled. +# The default value is: NO. + +HIDE_UNDOC_MEMBERS = YES + +# If the HIDE_UNDOC_CLASSES tag is set to YES, doxygen will hide all +# undocumented classes that are normally visible in the class hierarchy. If set +# to NO these classes will be included in the various overviews. This option has +# no effect if EXTRACT_ALL is enabled. +# The default value is: NO. + +HIDE_UNDOC_CLASSES = YES + +# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, doxygen will hide all friend +# (class|struct|union) declarations. If set to NO these declarations will be +# included in the documentation. +# The default value is: NO. + +HIDE_FRIEND_COMPOUNDS = NO + +# If the HIDE_IN_BODY_DOCS tag is set to YES, doxygen will hide any +# documentation blocks found inside the body of a function. If set to NO these +# blocks will be appended to the function's detailed documentation block. +# The default value is: NO. + +HIDE_IN_BODY_DOCS = NO + +# The INTERNAL_DOCS tag determines if documentation that is typed after a +# \internal command is included. If the tag is set to NO then the documentation +# will be excluded. Set it to YES to include the internal documentation. +# The default value is: NO. + +INTERNAL_DOCS = NO + +# If the CASE_SENSE_NAMES tag is set to NO then doxygen will only generate file +# names in lower-case letters. If set to YES upper-case letters are also +# allowed. This is useful if you have classes or files whose names only differ +# in case and if your file system supports case sensitive file names. Windows +# and Mac users are advised to set this option to NO. +# The default value is: system dependent. + +CASE_SENSE_NAMES = YES + +# If the HIDE_SCOPE_NAMES tag is set to NO then doxygen will show members with +# their full class and namespace scopes in the documentation. If set to YES the +# scope will be hidden. +# The default value is: NO. + +HIDE_SCOPE_NAMES = NO + +# If the SHOW_INCLUDE_FILES tag is set to YES then doxygen will put a list of +# the files that are included by a file in the documentation of that file. +# The default value is: YES. + +SHOW_INCLUDE_FILES = YES + +# If the SHOW_GROUPED_MEMB_INC tag is set to YES then Doxygen will add for each +# grouped member an include statement to the documentation, telling the reader +# which file to include in order to use the member. +# The default value is: NO. + +SHOW_GROUPED_MEMB_INC = YES + +# If the FORCE_LOCAL_INCLUDES tag is set to YES then doxygen will list include +# files with double quotes in the documentation rather than with sharp brackets. +# The default value is: NO. + +FORCE_LOCAL_INCLUDES = NO + +# If the INLINE_INFO tag is set to YES then a tag [inline] is inserted in the +# documentation for inline members. +# The default value is: YES. + +INLINE_INFO = YES + +# If the SORT_MEMBER_DOCS tag is set to YES then doxygen will sort the +# (detailed) documentation of file and class members alphabetically by member +# name. If set to NO the members will appear in declaration order. +# The default value is: YES. + +SORT_MEMBER_DOCS = YES + +# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the brief +# descriptions of file, namespace and class members alphabetically by member +# name. If set to NO the members will appear in declaration order. Note that +# this will also influence the order of the classes in the class list. +# The default value is: NO. + +SORT_BRIEF_DOCS = YES + +# If the SORT_MEMBERS_CTORS_1ST tag is set to YES then doxygen will sort the +# (brief and detailed) documentation of class members so that constructors and +# destructors are listed first. If set to NO the constructors will appear in the +# respective orders defined by SORT_BRIEF_DOCS and SORT_MEMBER_DOCS. +# Note: If SORT_BRIEF_DOCS is set to NO this option is ignored for sorting brief +# member documentation. +# Note: If SORT_MEMBER_DOCS is set to NO this option is ignored for sorting +# detailed member documentation. +# The default value is: NO. + +SORT_MEMBERS_CTORS_1ST = YES + +# If the SORT_GROUP_NAMES tag is set to YES then doxygen will sort the hierarchy +# of group names into alphabetical order. If set to NO the group names will +# appear in their defined order. +# The default value is: NO. + +SORT_GROUP_NAMES = YES + +# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be sorted by +# fully-qualified names, including namespaces. If set to NO, the class list will +# be sorted only by class name, not including the namespace part. +# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES. +# Note: This option applies only to the class list, not to the alphabetical +# list. +# The default value is: NO. + +SORT_BY_SCOPE_NAME = YES + +# If the STRICT_PROTO_MATCHING option is enabled and doxygen fails to do proper +# type resolution of all parameters of a function it will reject a match between +# the prototype and the implementation of a member function even if there is +# only one candidate or it is obvious which candidate to choose by doing a +# simple string match. By disabling STRICT_PROTO_MATCHING doxygen will still +# accept a match between prototype and implementation in such cases. +# The default value is: NO. + +STRICT_PROTO_MATCHING = NO + +# The GENERATE_TODOLIST tag can be used to enable ( YES) or disable ( NO) the +# todo list. This list is created by putting \todo commands in the +# documentation. +# The default value is: YES. + +GENERATE_TODOLIST = YES + +# The GENERATE_TESTLIST tag can be used to enable ( YES) or disable ( NO) the +# test list. This list is created by putting \test commands in the +# documentation. +# The default value is: YES. + +GENERATE_TESTLIST = YES + +# The GENERATE_BUGLIST tag can be used to enable ( YES) or disable ( NO) the bug +# list. This list is created by putting \bug commands in the documentation. +# The default value is: YES. + +GENERATE_BUGLIST = YES + +# The GENERATE_DEPRECATEDLIST tag can be used to enable ( YES) or disable ( NO) +# the deprecated list. This list is created by putting \deprecated commands in +# the documentation. +# The default value is: YES. + +GENERATE_DEPRECATEDLIST= YES + +# The ENABLED_SECTIONS tag can be used to enable conditional documentation +# sections, marked by \if ... \endif and \cond +# ... \endcond blocks. + +ENABLED_SECTIONS = + +# The MAX_INITIALIZER_LINES tag determines the maximum number of lines that the +# initial value of a variable or macro / define can have for it to appear in the +# documentation. If the initializer consists of more lines than specified here +# it will be hidden. Use a value of 0 to hide initializers completely. The +# appearance of the value of individual variables and macros / defines can be +# controlled using \showinitializer or \hideinitializer command in the +# documentation regardless of this setting. +# Minimum value: 0, maximum value: 10000, default value: 30. + +MAX_INITIALIZER_LINES = 30 + +# Set the SHOW_USED_FILES tag to NO to disable the list of files generated at +# the bottom of the documentation of classes and structs. If set to YES the list +# will mention the files that were used to generate the documentation. +# The default value is: YES. + +SHOW_USED_FILES = YES + +# Set the SHOW_FILES tag to NO to disable the generation of the Files page. This +# will remove the Files entry from the Quick Index and from the Folder Tree View +# (if specified). +# The default value is: YES. + +SHOW_FILES = YES + +# Set the SHOW_NAMESPACES tag to NO to disable the generation of the Namespaces +# page. This will remove the Namespaces entry from the Quick Index and from the +# Folder Tree View (if specified). +# The default value is: YES. + +SHOW_NAMESPACES = YES + +# The FILE_VERSION_FILTER tag can be used to specify a program or script that +# doxygen should invoke to get the current version for each file (typically from +# the version control system). Doxygen will invoke the program by executing (via +# popen()) the command command input-file, where command is the value of the +# FILE_VERSION_FILTER tag, and input-file is the name of an input file provided +# by doxygen. Whatever the program writes to standard output is used as the file +# version. For an example see the documentation. + +FILE_VERSION_FILTER = + +# The LAYOUT_FILE tag can be used to specify a layout file which will be parsed +# by doxygen. The layout file controls the global structure of the generated +# output files in an output format independent way. To create the layout file +# that represents doxygen's defaults, run doxygen with the -l option. You can +# optionally specify a file name after the option, if omitted DoxygenLayout.xml +# will be used as the name of the layout file. +# +# Note that if you run doxygen from a directory containing a file called +# DoxygenLayout.xml, doxygen will parse it automatically even if the LAYOUT_FILE +# tag is left empty. + +LAYOUT_FILE = DoxygenLayout.xml + +# The CITE_BIB_FILES tag can be used to specify one or more bib files containing +# the reference definitions. This must be a list of .bib files. The .bib +# extension is automatically appended if omitted. This requires the bibtex tool +# to be installed. See also http://en.wikipedia.org/wiki/BibTeX for more info. +# For LaTeX the style of the bibliography can be controlled using +# LATEX_BIB_STYLE. To use this feature you need bibtex and perl available in the +# search path. Do not use file names with spaces, bibtex cannot handle them. See +# also \cite for info how to create references. + +CITE_BIB_FILES = + +#--------------------------------------------------------------------------- +# Configuration options related to warning and progress messages +#--------------------------------------------------------------------------- + +# The QUIET tag can be used to turn on/off the messages that are generated to +# standard output by doxygen. If QUIET is set to YES this implies that the +# messages are off. +# The default value is: NO. + +QUIET = NO + +# The WARNINGS tag can be used to turn on/off the warning messages that are +# generated to standard error ( stderr) by doxygen. If WARNINGS is set to YES +# this implies that the warnings are on. +# +# Tip: Turn warnings on while writing the documentation. +# The default value is: YES. + +WARNINGS = YES + +# If the WARN_IF_UNDOCUMENTED tag is set to YES, then doxygen will generate +# warnings for undocumented members. If EXTRACT_ALL is set to YES then this flag +# will automatically be disabled. +# The default value is: YES. + +WARN_IF_UNDOCUMENTED = YES + +# If the WARN_IF_DOC_ERROR tag is set to YES, doxygen will generate warnings for +# potential errors in the documentation, such as not documenting some parameters +# in a documented function, or documenting parameters that don't exist or using +# markup commands wrongly. +# The default value is: YES. + +WARN_IF_DOC_ERROR = YES + +# This WARN_NO_PARAMDOC option can be enabled to get warnings for functions that +# are documented, but have no documentation for their parameters or return +# value. If set to NO doxygen will only warn about wrong or incomplete parameter +# documentation, but not about the absence of documentation. +# The default value is: NO. + +WARN_NO_PARAMDOC = YES + +# The WARN_FORMAT tag determines the format of the warning messages that doxygen +# can produce. The string should contain the $file, $line, and $text tags, which +# will be replaced by the file and line number from which the warning originated +# and the warning text. Optionally the format may contain $version, which will +# be replaced by the version of the file (if it could be obtained via +# FILE_VERSION_FILTER) +# The default value is: $file:$line: $text. + +WARN_FORMAT = "$file:$line: $text" + +# The WARN_LOGFILE tag can be used to specify a file to which warning and error +# messages should be written. If left blank the output is written to standard +# error (stderr). + +WARN_LOGFILE = + +#--------------------------------------------------------------------------- +# Configuration options related to the input files +#--------------------------------------------------------------------------- + +# The INPUT tag is used to specify the files and/or directories that contain +# documented source files. You may enter file names like myfile.cpp or +# directories like /usr/src/myproject. Separate the files or directories with +# spaces. +# Note: If this tag is empty the current directory is searched. + +INPUT = + +# This tag can be used to specify the character encoding of the source files +# that doxygen parses. Internally doxygen uses the UTF-8 encoding. Doxygen uses +# libiconv (or the iconv built into libc) for the transcoding. See the libiconv +# documentation (see: http://www.gnu.org/software/libiconv) for the list of +# possible encodings. +# The default value is: UTF-8. + +INPUT_ENCODING = UTF-8 + +# If the value of the INPUT tag contains directories, you can use the +# FILE_PATTERNS tag to specify one or more wildcard patterns (like *.cpp and +# *.h) to filter out the source-files in the directories. If left blank the +# following patterns are tested:*.c, *.cc, *.cxx, *.cpp, *.c++, *.java, *.ii, +# *.ixx, *.ipp, *.i++, *.inl, *.idl, *.ddl, *.odl, *.h, *.hh, *.hxx, *.hpp, +# *.h++, *.cs, *.d, *.php, *.php4, *.php5, *.phtml, *.inc, *.m, *.markdown, +# *.md, *.mm, *.dox, *.py, *.f90, *.f, *.for, *.tcl, *.vhd, *.vhdl, *.ucf, +# *.qsf, *.as and *.js. + +FILE_PATTERNS = *.c *.h *.dox + +# The RECURSIVE tag can be used to specify whether or not subdirectories should +# be searched for input files as well. +# The default value is: NO. + +RECURSIVE = YES + +# The EXCLUDE tag can be used to specify files and/or directories that should be +# excluded from the INPUT source files. This way you can easily exclude a +# subdirectory from a directory tree whose root is specified with the INPUT tag. +# +# Note that relative paths are relative to the directory from which doxygen is +# run. + +EXCLUDE = + +# The EXCLUDE_SYMLINKS tag can be used to select whether or not files or +# directories that are symbolic links (a Unix file system feature) are excluded +# from the input. +# The default value is: NO. + +EXCLUDE_SYMLINKS = NO + +# If the value of the INPUT tag contains directories, you can use the +# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude +# certain files from those directories. +# +# Note that the wildcards are matched against the file with absolute path, so to +# exclude all test directories for example use the pattern */test/* + +EXCLUDE_PATTERNS = + +# The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names +# (namespaces, classes, functions, etc.) that should be excluded from the +# output. The symbol name can be a fully qualified name, a word, or if the +# wildcard * is used, a substring. Examples: ANamespace, AClass, +# AClass::ANamespace, ANamespace::*Test +# +# Note that the wildcards are matched against the file with absolute path, so to +# exclude all test directories use the pattern */test/* + +EXCLUDE_SYMBOLS = + +# The EXAMPLE_PATH tag can be used to specify one or more files or directories +# that contain example code fragments that are included (see the \include +# command). + +EXAMPLE_PATH = + +# If the value of the EXAMPLE_PATH tag contains directories, you can use the +# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp and +# *.h) to filter out the source-files in the directories. If left blank all +# files are included. + +EXAMPLE_PATTERNS = + +# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be +# searched for input files to be used with the \include or \dontinclude commands +# irrespective of the value of the RECURSIVE tag. +# The default value is: NO. + +EXAMPLE_RECURSIVE = NO + +# The IMAGE_PATH tag can be used to specify one or more files or directories +# that contain images that are to be included in the documentation (see the +# \image command). + +IMAGE_PATH = ${CMAKE_CURRENT_SOURCE_DIR} + +# The INPUT_FILTER tag can be used to specify a program that doxygen should +# invoke to filter for each input file. Doxygen will invoke the filter program +# by executing (via popen()) the command: +# +# +# +# where is the value of the INPUT_FILTER tag, and is the +# name of an input file. Doxygen will then use the output that the filter +# program writes to standard output. If FILTER_PATTERNS is specified, this tag +# will be ignored. +# +# Note that the filter must not add or remove lines; it is applied before the +# code is scanned, but not when the output code is generated. If lines are added +# or removed, the anchors will not be placed correctly. + +INPUT_FILTER = + +# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern +# basis. Doxygen will compare the file name with each pattern and apply the +# filter if there is a match. The filters are a list of the form: pattern=filter +# (like *.cpp=my_cpp_filter). See INPUT_FILTER for further information on how +# filters are used. If the FILTER_PATTERNS tag is empty or if none of the +# patterns match the file name, INPUT_FILTER is applied. + +FILTER_PATTERNS = + +# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using +# INPUT_FILTER ) will also be used to filter the input files that are used for +# producing the source files to browse (i.e. when SOURCE_BROWSER is set to YES). +# The default value is: NO. + +FILTER_SOURCE_FILES = NO + +# The FILTER_SOURCE_PATTERNS tag can be used to specify source filters per file +# pattern. A pattern will override the setting for FILTER_PATTERN (if any) and +# it is also possible to disable source filtering for a specific pattern using +# *.ext= (so without naming a filter). +# This tag requires that the tag FILTER_SOURCE_FILES is set to YES. + +FILTER_SOURCE_PATTERNS = + +# If the USE_MDFILE_AS_MAINPAGE tag refers to the name of a markdown file that +# is part of the input, its contents will be placed on the main page +# (index.html). This can be useful if you have a project on for instance GitHub +# and want to reuse the introduction page also for the doxygen output. + +USE_MDFILE_AS_MAINPAGE = + +#--------------------------------------------------------------------------- +# Configuration options related to source browsing +#--------------------------------------------------------------------------- + +# If the SOURCE_BROWSER tag is set to YES then a list of source files will be +# generated. Documented entities will be cross-referenced with these sources. +# +# Note: To get rid of all source code in the generated output, make sure that +# also VERBATIM_HEADERS is set to NO. +# The default value is: NO. + +SOURCE_BROWSER = NO + +# Setting the INLINE_SOURCES tag to YES will include the body of functions, +# classes and enums directly into the documentation. +# The default value is: NO. + +INLINE_SOURCES = NO + +# Setting the STRIP_CODE_COMMENTS tag to YES will instruct doxygen to hide any +# special comment blocks from generated source code fragments. Normal C, C++ and +# Fortran comments will always remain visible. +# The default value is: YES. + +STRIP_CODE_COMMENTS = YES + +# If the REFERENCED_BY_RELATION tag is set to YES then for each documented +# function all documented functions referencing it will be listed. +# The default value is: NO. + +REFERENCED_BY_RELATION = NO + +# If the REFERENCES_RELATION tag is set to YES then for each documented function +# all documented entities called/used by that function will be listed. +# The default value is: NO. + +REFERENCES_RELATION = NO + +# If the REFERENCES_LINK_SOURCE tag is set to YES and SOURCE_BROWSER tag is set +# to YES, then the hyperlinks from functions in REFERENCES_RELATION and +# REFERENCED_BY_RELATION lists will link to the source code. Otherwise they will +# link to the documentation. +# The default value is: YES. + +REFERENCES_LINK_SOURCE = NO + +# If SOURCE_TOOLTIPS is enabled (the default) then hovering a hyperlink in the +# source code will show a tooltip with additional information such as prototype, +# brief description and links to the definition and documentation. Since this +# will make the HTML file larger and loading of large files a bit slower, you +# can opt to disable this feature. +# The default value is: YES. +# This tag requires that the tag SOURCE_BROWSER is set to YES. + +SOURCE_TOOLTIPS = YES + +# If the USE_HTAGS tag is set to YES then the references to source code will +# point to the HTML generated by the htags(1) tool instead of doxygen built-in +# source browser. The htags tool is part of GNU's global source tagging system +# (see http://www.gnu.org/software/global/global.html). You will need version +# 4.8.6 or higher. +# +# To use it do the following: +# - Install the latest version of global +# - Enable SOURCE_BROWSER and USE_HTAGS in the config file +# - Make sure the INPUT points to the root of the source tree +# - Run doxygen as normal +# +# Doxygen will invoke htags (and that will in turn invoke gtags), so these +# tools must be available from the command line (i.e. in the search path). +# +# The result: instead of the source browser generated by doxygen, the links to +# source code will now point to the output of htags. +# The default value is: NO. +# This tag requires that the tag SOURCE_BROWSER is set to YES. + +USE_HTAGS = NO + +# If the VERBATIM_HEADERS tag is set the YES then doxygen will generate a +# verbatim copy of the header file for each class for which an include is +# specified. Set to NO to disable this. +# See also: Section \class. +# The default value is: YES. + +VERBATIM_HEADERS = NO + +#--------------------------------------------------------------------------- +# Configuration options related to the alphabetical class index +#--------------------------------------------------------------------------- + +# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index of all +# compounds will be generated. Enable this if the project contains a lot of +# classes, structs, unions or interfaces. +# The default value is: YES. + +ALPHABETICAL_INDEX = YES + +# The COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns in +# which the alphabetical index list will be split. +# Minimum value: 1, maximum value: 20, default value: 5. +# This tag requires that the tag ALPHABETICAL_INDEX is set to YES. + +COLS_IN_ALPHA_INDEX = 1 + +# In case all classes in a project start with a common prefix, all classes will +# be put under the same header in the alphabetical index. The IGNORE_PREFIX tag +# can be used to specify a prefix (or a list of prefixes) that should be ignored +# while generating the index headers. +# This tag requires that the tag ALPHABETICAL_INDEX is set to YES. + +IGNORE_PREFIX = + +#--------------------------------------------------------------------------- +# Configuration options related to the HTML output +#--------------------------------------------------------------------------- + +# If the GENERATE_HTML tag is set to YES doxygen will generate HTML output +# The default value is: YES. + +GENERATE_HTML = YES + +# The HTML_OUTPUT tag is used to specify where the HTML docs will be put. If a +# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of +# it. +# The default directory is: html. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_OUTPUT = html + +# The HTML_FILE_EXTENSION tag can be used to specify the file extension for each +# generated HTML page (for example: .htm, .php, .asp). +# The default value is: .html. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_FILE_EXTENSION = .html + +# The HTML_HEADER tag can be used to specify a user-defined HTML header file for +# each generated HTML page. If the tag is left blank doxygen will generate a +# standard header. +# +# To get valid HTML the header file that includes any scripts and style sheets +# that doxygen needs, which is dependent on the configuration options used (e.g. +# the setting GENERATE_TREEVIEW). It is highly recommended to start with a +# default header using +# doxygen -w html new_header.html new_footer.html new_stylesheet.css +# YourConfigFile +# and then modify the file new_header.html. See also section "Doxygen usage" +# for information on how to generate the default header that doxygen normally +# uses. +# Note: The header is subject to change so you typically have to regenerate the +# default header when upgrading to a newer version of doxygen. For a description +# of the possible markers and block names see the documentation. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_HEADER = + +# The HTML_FOOTER tag can be used to specify a user-defined HTML footer for each +# generated HTML page. If the tag is left blank doxygen will generate a standard +# footer. See HTML_HEADER for more information on how to generate a default +# footer and what special commands can be used inside the footer. See also +# section "Doxygen usage" for information on how to generate the default footer +# that doxygen normally uses. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_FOOTER = + +# The HTML_STYLESHEET tag can be used to specify a user-defined cascading style +# sheet that is used by each HTML page. It can be used to fine-tune the look of +# the HTML output. If left blank doxygen will generate a default style sheet. +# See also section "Doxygen usage" for information on how to generate the style +# sheet that doxygen normally uses. +# Note: It is recommended to use HTML_EXTRA_STYLESHEET instead of this tag, as +# it is more robust and this tag (HTML_STYLESHEET) will in the future become +# obsolete. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_STYLESHEET = + +# The HTML_EXTRA_STYLESHEET tag can be used to specify an additional user- +# defined cascading style sheet that is included after the standard style sheets +# created by doxygen. Using this option one can overrule certain style aspects. +# This is preferred over using HTML_STYLESHEET since it does not replace the +# standard style sheet and is therefor more robust against future updates. +# Doxygen will copy the style sheet file to the output directory. For an example +# see the documentation. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_EXTRA_STYLESHEET = + +# The HTML_EXTRA_FILES tag can be used to specify one or more extra images or +# other source files which should be copied to the HTML output directory. Note +# that these files will be copied to the base HTML output directory. Use the +# $relpath^ marker in the HTML_HEADER and/or HTML_FOOTER files to load these +# files. In the HTML_STYLESHEET file, use the file name only. Also note that the +# files will be copied as-is; there are no commands or markers available. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_EXTRA_FILES = + +# The HTML_COLORSTYLE_HUE tag controls the color of the HTML output. Doxygen +# will adjust the colors in the stylesheet and background images according to +# this color. Hue is specified as an angle on a colorwheel, see +# http://en.wikipedia.org/wiki/Hue for more information. For instance the value +# 0 represents red, 60 is yellow, 120 is green, 180 is cyan, 240 is blue, 300 +# purple, and 360 is red again. +# Minimum value: 0, maximum value: 359, default value: 220. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_COLORSTYLE_HUE = 118 + +# The HTML_COLORSTYLE_SAT tag controls the purity (or saturation) of the colors +# in the HTML output. For a value of 0 the output will use grayscales only. A +# value of 255 will produce the most vivid colors. +# Minimum value: 0, maximum value: 255, default value: 100. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_COLORSTYLE_SAT = 100 + +# The HTML_COLORSTYLE_GAMMA tag controls the gamma correction applied to the +# luminance component of the colors in the HTML output. Values below 100 +# gradually make the output lighter, whereas values above 100 make the output +# darker. The value divided by 100 is the actual gamma applied, so 80 represents +# a gamma of 0.8, The value 220 represents a gamma of 2.2, and 100 does not +# change the gamma. +# Minimum value: 40, maximum value: 240, default value: 80. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_COLORSTYLE_GAMMA = 240 + +# If the HTML_TIMESTAMP tag is set to YES then the footer of each generated HTML +# page will contain the date and time when the page was generated. Setting this +# to NO can help when comparing the output of multiple runs. +# The default value is: YES. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_TIMESTAMP = YES + +# If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML +# documentation will contain sections that can be hidden and shown after the +# page has loaded. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_DYNAMIC_SECTIONS = NO + +# With HTML_INDEX_NUM_ENTRIES one can control the preferred number of entries +# shown in the various tree structured indices initially; the user can expand +# and collapse entries dynamically later on. Doxygen will expand the tree to +# such a level that at most the specified number of entries are visible (unless +# a fully collapsed tree already exceeds this amount). So setting the number of +# entries 1 will produce a full collapsed tree by default. 0 is a special value +# representing an infinite number of entries and will result in a full expanded +# tree by default. +# Minimum value: 0, maximum value: 9999, default value: 100. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_INDEX_NUM_ENTRIES = 0 + +# If the GENERATE_DOCSET tag is set to YES, additional index files will be +# generated that can be used as input for Apple's Xcode 3 integrated development +# environment (see: http://developer.apple.com/tools/xcode/), introduced with +# OSX 10.5 (Leopard). To create a documentation set, doxygen will generate a +# Makefile in the HTML output directory. Running make will produce the docset in +# that directory and running make install will install the docset in +# ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find it at +# startup. See http://developer.apple.com/tools/creatingdocsetswithdoxygen.html +# for more information. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +GENERATE_DOCSET = NO + +# This tag determines the name of the docset feed. A documentation feed provides +# an umbrella under which multiple documentation sets from a single provider +# (such as a company or product suite) can be grouped. +# The default value is: Doxygen generated docs. +# This tag requires that the tag GENERATE_DOCSET is set to YES. + +DOCSET_FEEDNAME = "Doxygen generated docs" + +# This tag specifies a string that should uniquely identify the documentation +# set bundle. This should be a reverse domain-name style string, e.g. +# com.mycompany.MyDocSet. Doxygen will append .docset to the name. +# The default value is: org.doxygen.Project. +# This tag requires that the tag GENERATE_DOCSET is set to YES. + +DOCSET_BUNDLE_ID = org.doxygen.Project + +# The DOCSET_PUBLISHER_ID tag specifies a string that should uniquely identify +# the documentation publisher. This should be a reverse domain-name style +# string, e.g. com.mycompany.MyDocSet.documentation. +# The default value is: org.doxygen.Publisher. +# This tag requires that the tag GENERATE_DOCSET is set to YES. + +DOCSET_PUBLISHER_ID = org.doxygen.Publisher + +# The DOCSET_PUBLISHER_NAME tag identifies the documentation publisher. +# The default value is: Publisher. +# This tag requires that the tag GENERATE_DOCSET is set to YES. + +DOCSET_PUBLISHER_NAME = Publisher + +# If the GENERATE_HTMLHELP tag is set to YES then doxygen generates three +# additional HTML index files: index.hhp, index.hhc, and index.hhk. The +# index.hhp is a project file that can be read by Microsoft's HTML Help Workshop +# (see: http://www.microsoft.com/en-us/download/details.aspx?id=21138) on +# Windows. +# +# The HTML Help Workshop contains a compiler that can convert all HTML output +# generated by doxygen into a single compiled HTML file (.chm). Compiled HTML +# files are now used as the Windows 98 help format, and will replace the old +# Windows help format (.hlp) on all Windows platforms in the future. Compressed +# HTML files also contain an index, a table of contents, and you can search for +# words in the documentation. The HTML workshop also contains a viewer for +# compressed HTML files. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +GENERATE_HTMLHELP = NO + +# The CHM_FILE tag can be used to specify the file name of the resulting .chm +# file. You can add a path in front of the file if the result should not be +# written to the html output directory. +# This tag requires that the tag GENERATE_HTMLHELP is set to YES. + +CHM_FILE = + +# The HHC_LOCATION tag can be used to specify the location (absolute path +# including file name) of the HTML help compiler ( hhc.exe). If non-empty +# doxygen will try to run the HTML help compiler on the generated index.hhp. +# The file has to be specified with full path. +# This tag requires that the tag GENERATE_HTMLHELP is set to YES. + +HHC_LOCATION = + +# The GENERATE_CHI flag controls if a separate .chi index file is generated ( +# YES) or that it should be included in the master .chm file ( NO). +# The default value is: NO. +# This tag requires that the tag GENERATE_HTMLHELP is set to YES. + +GENERATE_CHI = NO + +# The CHM_INDEX_ENCODING is used to encode HtmlHelp index ( hhk), content ( hhc) +# and project file content. +# This tag requires that the tag GENERATE_HTMLHELP is set to YES. + +CHM_INDEX_ENCODING = + +# The BINARY_TOC flag controls whether a binary table of contents is generated ( +# YES) or a normal table of contents ( NO) in the .chm file. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTMLHELP is set to YES. + +BINARY_TOC = NO + +# The TOC_EXPAND flag can be set to YES to add extra items for group members to +# the table of contents of the HTML help documentation and to the tree view. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTMLHELP is set to YES. + +TOC_EXPAND = YES + +# If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and +# QHP_VIRTUAL_FOLDER are set, an additional index file will be generated that +# can be used as input for Qt's qhelpgenerator to generate a Qt Compressed Help +# (.qch) of the generated HTML documentation. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +GENERATE_QHP = NO + +# If the QHG_LOCATION tag is specified, the QCH_FILE tag can be used to specify +# the file name of the resulting .qch file. The path specified is relative to +# the HTML output folder. +# This tag requires that the tag GENERATE_QHP is set to YES. + +QCH_FILE = + +# The QHP_NAMESPACE tag specifies the namespace to use when generating Qt Help +# Project output. For more information please see Qt Help Project / Namespace +# (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#namespace). +# The default value is: org.doxygen.Project. +# This tag requires that the tag GENERATE_QHP is set to YES. + +QHP_NAMESPACE = org.doxygen.Project + +# The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating Qt +# Help Project output. For more information please see Qt Help Project / Virtual +# Folders (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#virtual- +# folders). +# The default value is: doc. +# This tag requires that the tag GENERATE_QHP is set to YES. + +QHP_VIRTUAL_FOLDER = doc + +# If the QHP_CUST_FILTER_NAME tag is set, it specifies the name of a custom +# filter to add. For more information please see Qt Help Project / Custom +# Filters (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#custom- +# filters). +# This tag requires that the tag GENERATE_QHP is set to YES. + +QHP_CUST_FILTER_NAME = + +# The QHP_CUST_FILTER_ATTRS tag specifies the list of the attributes of the +# custom filter to add. For more information please see Qt Help Project / Custom +# Filters (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#custom- +# filters). +# This tag requires that the tag GENERATE_QHP is set to YES. + +QHP_CUST_FILTER_ATTRS = + +# The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this +# project's filter section matches. Qt Help Project / Filter Attributes (see: +# http://qt-project.org/doc/qt-4.8/qthelpproject.html#filter-attributes). +# This tag requires that the tag GENERATE_QHP is set to YES. + +QHP_SECT_FILTER_ATTRS = + +# The QHG_LOCATION tag can be used to specify the location of Qt's +# qhelpgenerator. If non-empty doxygen will try to run qhelpgenerator on the +# generated .qhp file. +# This tag requires that the tag GENERATE_QHP is set to YES. + +QHG_LOCATION = + +# If the GENERATE_ECLIPSEHELP tag is set to YES, additional index files will be +# generated, together with the HTML files, they form an Eclipse help plugin. To +# install this plugin and make it available under the help contents menu in +# Eclipse, the contents of the directory containing the HTML and XML files needs +# to be copied into the plugins directory of eclipse. The name of the directory +# within the plugins directory should be the same as the ECLIPSE_DOC_ID value. +# After copying Eclipse needs to be restarted before the help appears. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +GENERATE_ECLIPSEHELP = NO + +# A unique identifier for the Eclipse help plugin. When installing the plugin +# the directory name containing the HTML and XML files should also have this +# name. Each documentation set should have its own identifier. +# The default value is: org.doxygen.Project. +# This tag requires that the tag GENERATE_ECLIPSEHELP is set to YES. + +ECLIPSE_DOC_ID = org.doxygen.Project + +# If you want full control over the layout of the generated HTML pages it might +# be necessary to disable the index and replace it with your own. The +# DISABLE_INDEX tag can be used to turn on/off the condensed index (tabs) at top +# of each HTML page. A value of NO enables the index and the value YES disables +# it. Since the tabs in the index contain the same information as the navigation +# tree, you can set this option to YES if you also set GENERATE_TREEVIEW to YES. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +DISABLE_INDEX = NO + +# The GENERATE_TREEVIEW tag is used to specify whether a tree-like index +# structure should be generated to display hierarchical information. If the tag +# value is set to YES, a side panel will be generated containing a tree-like +# index structure (just like the one that is generated for HTML Help). For this +# to work a browser that supports JavaScript, DHTML, CSS and frames is required +# (i.e. any modern browser). Windows users are probably better off using the +# HTML help feature. Via custom stylesheets (see HTML_EXTRA_STYLESHEET) one can +# further fine-tune the look of the index. As an example, the default style +# sheet generated by doxygen has an example that shows how to put an image at +# the root of the tree instead of the PROJECT_NAME. Since the tree basically has +# the same information as the tab index, you could consider setting +# DISABLE_INDEX to YES when enabling this option. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +GENERATE_TREEVIEW = NO + +# The ENUM_VALUES_PER_LINE tag can be used to set the number of enum values that +# doxygen will group on one line in the generated HTML documentation. +# +# Note that a value of 0 will completely suppress the enum values from appearing +# in the overview section. +# Minimum value: 0, maximum value: 20, default value: 4. +# This tag requires that the tag GENERATE_HTML is set to YES. + +ENUM_VALUES_PER_LINE = 1 + +# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be used +# to set the initial width (in pixels) of the frame in which the tree is shown. +# Minimum value: 0, maximum value: 1500, default value: 250. +# This tag requires that the tag GENERATE_HTML is set to YES. + +TREEVIEW_WIDTH = 250 + +# When the EXT_LINKS_IN_WINDOW option is set to YES doxygen will open links to +# external symbols imported via tag files in a separate window. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +EXT_LINKS_IN_WINDOW = NO + +# Use this tag to change the font size of LaTeX formulas included as images in +# the HTML documentation. When you change the font size after a successful +# doxygen run you need to manually remove any form_*.png images from the HTML +# output directory to force them to be regenerated. +# Minimum value: 8, maximum value: 50, default value: 10. +# This tag requires that the tag GENERATE_HTML is set to YES. + +FORMULA_FONTSIZE = 10 + +# Use the FORMULA_TRANPARENT tag to determine whether or not the images +# generated for formulas are transparent PNGs. Transparent PNGs are not +# supported properly for IE 6.0, but are supported on all modern browsers. +# +# Note that when changing this option you need to delete any form_*.png files in +# the HTML output directory before the changes have effect. +# The default value is: YES. +# This tag requires that the tag GENERATE_HTML is set to YES. + +FORMULA_TRANSPARENT = YES + +# Enable the USE_MATHJAX option to render LaTeX formulas using MathJax (see +# http://www.mathjax.org) which uses client side Javascript for the rendering +# instead of using prerendered bitmaps. Use this if you do not have LaTeX +# installed or if you want to formulas look prettier in the HTML output. When +# enabled you may also need to install MathJax separately and configure the path +# to it using the MATHJAX_RELPATH option. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +USE_MATHJAX = NO + +# When MathJax is enabled you can set the default output format to be used for +# the MathJax output. See the MathJax site (see: +# http://docs.mathjax.org/en/latest/output.html) for more details. +# Possible values are: HTML-CSS (which is slower, but has the best +# compatibility), NativeMML (i.e. MathML) and SVG. +# The default value is: HTML-CSS. +# This tag requires that the tag USE_MATHJAX is set to YES. + +MATHJAX_FORMAT = HTML-CSS + +# When MathJax is enabled you need to specify the location relative to the HTML +# output directory using the MATHJAX_RELPATH option. The destination directory +# should contain the MathJax.js script. For instance, if the mathjax directory +# is located at the same level as the HTML output directory, then +# MATHJAX_RELPATH should be ../mathjax. The default value points to the MathJax +# Content Delivery Network so you can quickly see the result without installing +# MathJax. However, it is strongly recommended to install a local copy of +# MathJax from http://www.mathjax.org before deployment. +# The default value is: http://cdn.mathjax.org/mathjax/latest. +# This tag requires that the tag USE_MATHJAX is set to YES. + +MATHJAX_RELPATH = http://cdn.mathjax.org/mathjax/latest + +# The MATHJAX_EXTENSIONS tag can be used to specify one or more MathJax +# extension names that should be enabled during MathJax rendering. For example +# MATHJAX_EXTENSIONS = TeX/AMSmath TeX/AMSsymbols +# This tag requires that the tag USE_MATHJAX is set to YES. + +MATHJAX_EXTENSIONS = + +# The MATHJAX_CODEFILE tag can be used to specify a file with javascript pieces +# of code that will be used on startup of the MathJax code. See the MathJax site +# (see: http://docs.mathjax.org/en/latest/output.html) for more details. For an +# example see the documentation. +# This tag requires that the tag USE_MATHJAX is set to YES. + +MATHJAX_CODEFILE = + +# When the SEARCHENGINE tag is enabled doxygen will generate a search box for +# the HTML output. The underlying search engine uses javascript and DHTML and +# should work on any modern browser. Note that when using HTML help +# (GENERATE_HTMLHELP), Qt help (GENERATE_QHP), or docsets (GENERATE_DOCSET) +# there is already a search function so this one should typically be disabled. +# For large projects the javascript based search engine can be slow, then +# enabling SERVER_BASED_SEARCH may provide a better solution. It is possible to +# search using the keyboard; to jump to the search box use + S +# (what the is depends on the OS and browser, but it is typically +# , /Documentation + + */ + +/** +@page Downloads Downloads + +You can retrieve the source to ENet by downloading it in either .tar.gz form +or accessing the github distribution directly. + +The most recent stable release (1.3.18) can be downloaded here. +The last release that is protocol compatible with the 1.2 series or earlier (1.2.5) can be downloaded here. + +You can find the most recent ENet source at the github repository. + +*/ + +/** +@page MailingList Mailing List + +The enet-discuss list is for discussion of ENet, including bug reports or feature requests. + +*/ + +/** +@page IRCChannel IRC Channel + +Join the \#enet channel on the Libera Chat IRC network (irc.libera.chat) for real-time discussion about the ENet library. + +*/ + diff --git a/thirdparty/enet/docs/tutorial.dox b/thirdparty/enet/docs/tutorial.dox new file mode 100644 index 0000000..19a7a45 --- /dev/null +++ b/thirdparty/enet/docs/tutorial.dox @@ -0,0 +1,366 @@ +/** +@page Tutorial Tutorial + +@ref Initialization + +@ref CreateServer + +@ref CreateClient + +@ref ManageHost + +@ref SendingPacket + +@ref Disconnecting + +@ref Connecting + +@section Initialization Initialization + +You should include the file when using ENet. Do not +include without the directory prefix, as this may cause +file name conflicts on some systems. + +Before using ENet, you must call enet_initialize() to initialize the +library. Upon program exit, you should call enet_deinitialize() so +that the library may clean up any used resources. + +@code +#include + +int +main (int argc, char ** argv) +{ + if (enet_initialize () != 0) + { + fprintf (stderr, "An error occurred while initializing ENet.\n"); + return EXIT_FAILURE; + } + atexit (enet_deinitialize); + ... + ... + ... +} +@endcode + +@section CreateServer Creating an ENet server + +Servers in ENet are constructed with enet_host_create(). You must +specify an address on which to receive data and new connections, as +well as the maximum allowable numbers of connected peers. You may +optionally specify the incoming and outgoing bandwidth of the server +in bytes per second so that ENet may try to statically manage +bandwidth resources among connected peers in addition to its dynamic +throttling algorithm; specifying 0 for these two options will cause +ENet to rely entirely upon its dynamic throttling algorithm to manage +bandwidth. + +When done with a host, the host may be destroyed with +enet_host_destroy(). All connected peers to the host will be reset, +and the resources used by the host will be freed. + +@code + ENetAddress address; + ENetHost * server; + + /* Bind the server to the default localhost. */ + /* A specific host address can be specified by */ + /* enet_address_set_host (& address, "x.x.x.x"); */ + + address.host = ENET_HOST_ANY; + /* Bind the server to port 1234. */ + address.port = 1234; + + server = enet_host_create (& address /* the address to bind the server host to */, + 32 /* allow up to 32 clients and/or outgoing connections */, + 2 /* allow up to 2 channels to be used, 0 and 1 */, + 0 /* assume any amount of incoming bandwidth */, + 0 /* assume any amount of outgoing bandwidth */); + if (server == NULL) + { + fprintf (stderr, + "An error occurred while trying to create an ENet server host.\n"); + exit (EXIT_FAILURE); + } + ... + ... + ... + enet_host_destroy(server); +@endcode + +@section CreateClient Creating an ENet client + +Clients in ENet are similarly constructed with enet_host_create() when +no address is specified to bind the host to. Bandwidth may be +specified for the client host as in the above example. The peer count +controls the maximum number of connections to other server hosts that +may be simultaneously open. + +@code + ENetHost * client; + + client = enet_host_create (NULL /* create a client host */, + 1 /* only allow 1 outgoing connection */, + 2 /* allow up 2 channels to be used, 0 and 1 */, + 0 /* assume any amount of incoming bandwidth */, + 0 /* assume any amount of outgoing bandwidth */); + + if (client == NULL) + { + fprintf (stderr, + "An error occurred while trying to create an ENet client host.\n"); + exit (EXIT_FAILURE); + } + ... + ... + ... + enet_host_destroy(client); +@endcode + +@section ManageHost Managing an ENet host + +ENet uses a polled event model to notify the programmer of significant +events. ENet hosts are polled for events with enet_host_service(), +where an optional timeout value in milliseconds may be specified to +control how long ENet will poll; if a timeout of 0 is specified, +enet_host_service() will return immediately if there are no events to +dispatch. enet_host_service() will return 1 if an event was dispatched +within the specified timeout. + +Beware that most processing of the network with the ENet stack is done +inside enet_host_service(). Both hosts that make up the sides of a connection +must regularly call this function to ensure packets are actually sent and +received. A common symptom of not actively calling enet_host_service() +on both ends is that one side receives events while the other does not. +The best way to schedule this activity to ensure adequate service is, for +example, to call enet_host_service() with a 0 timeout (meaning non-blocking) +at the beginning of every frame in a game loop. + +Currently there are only four types of significant events in ENet: + +An event of type ENET_EVENT_TYPE_NONE is returned if no event occurred +within the specified time limit. enet_host_service() will return 0 +with this event. + +An event of type ENET_EVENT_TYPE_CONNECT is returned when either a new client +host has connected to the server host or when an attempt to establish a +connection with a foreign host has succeeded. Only the "peer" field of the +event structure is valid for this event and contains the newly connected peer. + +An event of type ENET_EVENT_TYPE_RECEIVE is returned when a packet is received +from a connected peer. The "peer" field contains the peer the packet was +received from, "channelID" is the channel on which the packet was sent, and +"packet" is the packet that was sent. The packet contained in the "packet" +field must be destroyed with enet_packet_destroy() when you are done +inspecting its contents. + +An event of type ENET_EVENT_TYPE_DISCONNECT is returned when a connected peer +has either explicitly disconnected or timed out. Only the "peer" field of the +event structure is valid for this event and contains the peer that +disconnected. Only the "data" field of the peer is still valid on a +disconnect event and must be explicitly reset. + +@code + ENetEvent event; + + /* Wait up to 1000 milliseconds for an event. */ + while (enet_host_service (client, & event, 1000) > 0) + { + switch (event.type) + { + case ENET_EVENT_TYPE_CONNECT: + printf ("A new client connected from %x:%u.\n", + event.peer -> address.host, + event.peer -> address.port); + + /* Store any relevant client information here. */ + event.peer -> data = "Client information"; + + break; + + case ENET_EVENT_TYPE_RECEIVE: + printf ("A packet of length %u containing %s was received from %s on channel %u.\n", + event.packet -> dataLength, + event.packet -> data, + event.peer -> data, + event.channelID); + + /* Clean up the packet now that we're done using it. */ + enet_packet_destroy (event.packet); + + break; + + case ENET_EVENT_TYPE_DISCONNECT: + printf ("%s disconnected.\n", event.peer -> data); + + /* Reset the peer's client information. */ + + event.peer -> data = NULL; + } + } + ... + ... + ... +@endcode + +@section SendingPacket Sending a packet to an ENet peer + +Packets in ENet are created with enet_packet_create(), where the size +of the packet must be specified. Optionally, initial data may be +specified to copy into the packet. + +Certain flags may also be supplied to enet_packet_create() to control +various packet features: + +ENET_PACKET_FLAG_RELIABLE specifies that the packet must use reliable +delivery. A reliable packet is guaranteed to be delivered, and a +number of retry attempts will be made until an acknowledgement is +received from the foreign host the packet is sent to. If a certain +number of retry attempts is reached without any acknowledgement, ENet +will assume the peer has disconnected and forcefully reset the +connection. If this flag is not specified, the packet is assumed an +unreliable packet, and no retry attempts will be made nor +acknowledgements generated. + +A packet may be resized (extended or truncated) with +enet_packet_resize(). + +A packet is sent to a foreign host with +enet_peer_send(). enet_peer_send() accepts a channel id over which to +send the packet to a given peer. Once the packet is handed over to +ENet with enet_peer_send(), ENet will handle its deallocation and +enet_packet_destroy() should not be used upon it. + +One may also use enet_host_broadcast() to send a packet to all +connected peers on a given host over a specified channel id, as with +enet_peer_send(). + +Queued packets will be sent on a call to enet_host_service(). +Alternatively, enet_host_flush() will send out queued packets without +dispatching any events. + +@code + /* Create a reliable packet of size 7 containing "packet\0" */ + ENetPacket * packet = enet_packet_create ("packet", + strlen ("packet") + 1, + ENET_PACKET_FLAG_RELIABLE); + + /* Extend the packet so and append the string "foo", so it now */ + /* contains "packetfoo\0" */ + enet_packet_resize (packet, strlen ("packetfoo") + 1); + strcpy (& packet -> data [strlen ("packet")], "foo"); + + /* Send the packet to the peer over channel id 0. */ + /* One could also broadcast the packet by */ + /* enet_host_broadcast (host, 0, packet); */ + enet_peer_send (peer, 0, packet); + ... + ... + ... + /* One could just use enet_host_service() instead. */ + enet_host_flush (host); +@endcode + +@section Disconnecting Disconnecting an ENet peer + +Peers may be gently disconnected with enet_peer_disconnect(). A +disconnect request will be sent to the foreign host, and ENet will +wait for an acknowledgement from the foreign host before finally +disconnecting. An event of type ENET_EVENT_TYPE_DISCONNECT will be +generated once the disconnection succeeds. Normally timeouts apply to +the disconnect acknowledgement, and so if no acknowledgement is +received after a length of time the peer will be forcefully +disconnected. + +enet_peer_reset() will forcefully disconnect a peer. The foreign host +will get no notification of a disconnect and will time out on the +foreign host. No event is generated. + +@code + ENetEvent event; + + enet_peer_disconnect (peer, 0); + + /* Allow up to 3 seconds for the disconnect to succeed + * and drop any packets received packets. + */ + while (enet_host_service (client, & event, 3000) > 0) + { + switch (event.type) + { + case ENET_EVENT_TYPE_RECEIVE: + enet_packet_destroy (event.packet); + break; + + case ENET_EVENT_TYPE_DISCONNECT: + puts ("Disconnection succeeded."); + return; + ... + ... + ... + } + } + + /* We've arrived here, so the disconnect attempt didn't */ + /* succeed yet. Force the connection down. */ + enet_peer_reset (peer); + ... + ... + ... +@endcode + +@section Connecting Connecting to an ENet host + +A connection to a foreign host is initiated with enet_host_connect(). +It accepts the address of a foreign host to connect to, and the number +of channels that should be allocated for communication. If N channels +are allocated for use, their channel ids will be numbered 0 through +N-1. A peer representing the connection attempt is returned, or NULL +if there were no available peers over which to initiate the +connection. When the connection attempt succeeds, an event of type +ENET_EVENT_TYPE_CONNECT will be generated. If the connection attempt +times out or otherwise fails, an event of type +ENET_EVENT_TYPE_DISCONNECT will be generated. + +@code + ENetAddress address; + ENetEvent event; + ENetPeer *peer; + + /* Connect to some.server.net:1234. */ + enet_address_set_host (& address, "some.server.net"); + address.port = 1234; + + /* Initiate the connection, allocating the two channels 0 and 1. */ + peer = enet_host_connect (client, & address, 2, 0); + + if (peer == NULL) + { + fprintf (stderr, + "No available peers for initiating an ENet connection.\n"); + exit (EXIT_FAILURE); + } + + /* Wait up to 5 seconds for the connection attempt to succeed. */ + if (enet_host_service (client, & event, 5000) > 0 && + event.type == ENET_EVENT_TYPE_CONNECT) + { + puts ("Connection to some.server.net:1234 succeeded."); + ... + ... + ... + } + else + { + /* Either the 5 seconds are up or a disconnect event was */ + /* received. Reset the peer in the event the 5 seconds */ + /* had run out without any significant event. */ + enet_peer_reset (peer); + + puts ("Connection to some.server.net:1234 failed."); + } + ... + ... + ... +@endcode +*/ diff --git a/thirdparty/enet/enet.dsp b/thirdparty/enet/enet.dsp new file mode 100644 index 0000000..dce4537 --- /dev/null +++ b/thirdparty/enet/enet.dsp @@ -0,0 +1,168 @@ +# Microsoft Developer Studio Project File - Name="enet" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Static Library" 0x0104 + +CFG=enet - Win32 Debug +!MESSAGE This is not a valid makefile. To build this project using NMAKE, +!MESSAGE use the Export Makefile command and run +!MESSAGE +!MESSAGE NMAKE /f "enet.mak". +!MESSAGE +!MESSAGE You can specify a configuration when running NMAKE +!MESSAGE by defining the macro CFG on the command line. For example: +!MESSAGE +!MESSAGE NMAKE /f "enet.mak" CFG="enet - Win32 Debug" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "enet - Win32 Release" (based on "Win32 (x86) Static Library") +!MESSAGE "enet - Win32 Debug" (based on "Win32 (x86) Static Library") +!MESSAGE + +# Begin Project +# PROP AllowPerConfigDependencies 0 +# PROP Scc_ProjName "" +# PROP Scc_LocalPath "" +CPP=cl.exe +RSC=rc.exe + +!IF "$(CFG)" == "enet - Win32 Release" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "Release" +# PROP BASE Intermediate_Dir "Release" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "Release" +# PROP Intermediate_Dir "Release" +# PROP Target_Dir "" +MTL=midl.exe +# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_MBCS" /D "_LIB" /YX /FD /c +# ADD CPP /nologo /W3 /O2 /I "include" /D "WIN32" /D "NDEBUG" /D "_MBCS" /D "_LIB" /FD /c +# SUBTRACT CPP /YX +# ADD BASE RSC /l 0x409 /d "NDEBUG" +# ADD RSC /l 0x409 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LIB32=link.exe -lib +# ADD BASE LIB32 /nologo +# ADD LIB32 /nologo + +!ELSEIF "$(CFG)" == "enet - Win32 Debug" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "Debug" +# PROP BASE Intermediate_Dir "Debug" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "Debug" +# PROP Intermediate_Dir "Debug" +# PROP Target_Dir "" +MTL=midl.exe +# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_MBCS" /D "_LIB" /YX /FD /GZ /c +# ADD CPP /nologo /G6 /MTd /W3 /ZI /Od /I "include" /D "WIN32" /D "_DEBUG" /D "_MBCS" /D "_LIB" /FR /FD /GZ /c +# SUBTRACT CPP /YX +# ADD BASE RSC /l 0x409 /d "_DEBUG" +# ADD RSC /l 0x409 /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LIB32=link.exe -lib +# ADD BASE LIB32 /nologo +# ADD LIB32 /nologo + +!ENDIF + +# Begin Target + +# Name "enet - Win32 Release" +# Name "enet - Win32 Debug" +# Begin Group "Source Files" + +# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" +# Begin Source File + +SOURCE=.\host.c +# End Source File +# Begin Source File + +SOURCE=.\list.c +# End Source File +# Begin Source File + +SOURCE=.\callbacks.c +# End Source File +# Begin Source File + +SOURCE=.\compress.c +# End Source File +# Begin Source File + +SOURCE=.\packet.c +# End Source File +# Begin Source File + +SOURCE=.\peer.c +# End Source File +# Begin Source File + +SOURCE=.\protocol.c +# End Source File +# Begin Source File + +SOURCE=.\unix.c +# End Source File +# Begin Source File + +SOURCE=.\win32.c +# End Source File +# End Group +# Begin Group "Header Files" + +# PROP Default_Filter "h;hpp;hxx;hm;inl" +# Begin Source File + +SOURCE=.\include\enet\enet.h +# End Source File +# Begin Source File + +SOURCE=.\include\enet\list.h +# End Source File +# Begin Source File + +SOURCE=.\include\enet\callbacks.h +# End Source File +# Begin Source File + +SOURCE=.\include\enet\protocol.h +# End Source File +# Begin Source File + +SOURCE=.\include\enet\time.h +# End Source File +# Begin Source File + +SOURCE=.\include\enet\types.h +# End Source File +# Begin Source File + +SOURCE=.\include\enet\unix.h +# End Source File +# Begin Source File + +SOURCE=.\include\enet\utility.h +# End Source File +# Begin Source File + +SOURCE=.\include\enet\win32.h +# End Source File +# End Group +# End Target +# End Project diff --git a/thirdparty/enet/enet_dll.cbp b/thirdparty/enet/enet_dll.cbp new file mode 100644 index 0000000..961274c --- /dev/null +++ b/thirdparty/enet/enet_dll.cbp @@ -0,0 +1,86 @@ + + + + + + diff --git a/thirdparty/enet/host.c b/thirdparty/enet/host.c new file mode 100644 index 0000000..fff946a --- /dev/null +++ b/thirdparty/enet/host.c @@ -0,0 +1,503 @@ +/** + @file host.c + @brief ENet host management functions +*/ +#define ENET_BUILDING_LIB 1 +#include +#include "enet/enet.h" + +/** @defgroup host ENet host functions + @{ +*/ + +/** Creates a host for communicating to peers. + + @param address the address at which other peers may connect to this host. If NULL, then no peers may connect to the host. + @param peerCount the maximum number of peers that should be allocated for the host. + @param channelLimit the maximum number of channels allowed; if 0, then this is equivalent to ENET_PROTOCOL_MAXIMUM_CHANNEL_COUNT + @param incomingBandwidth downstream bandwidth of the host in bytes/second; if 0, ENet will assume unlimited bandwidth. + @param outgoingBandwidth upstream bandwidth of the host in bytes/second; if 0, ENet will assume unlimited bandwidth. + + @returns the host on success and NULL on failure + + @remarks ENet will strategically drop packets on specific sides of a connection between hosts + to ensure the host's bandwidth is not overwhelmed. The bandwidth parameters also determine + the window size of a connection which limits the amount of reliable packets that may be in transit + at any given time. +*/ +ENetHost * +enet_host_create (const ENetAddress * address, size_t peerCount, size_t channelLimit, enet_uint32 incomingBandwidth, enet_uint32 outgoingBandwidth) +{ + ENetHost * host; + ENetPeer * currentPeer; + + if (peerCount > ENET_PROTOCOL_MAXIMUM_PEER_ID) + return NULL; + + host = (ENetHost *) enet_malloc (sizeof (ENetHost)); + if (host == NULL) + return NULL; + memset (host, 0, sizeof (ENetHost)); + + host -> peers = (ENetPeer *) enet_malloc (peerCount * sizeof (ENetPeer)); + if (host -> peers == NULL) + { + enet_free (host); + + return NULL; + } + memset (host -> peers, 0, peerCount * sizeof (ENetPeer)); + + host -> socket = enet_socket_create (ENET_SOCKET_TYPE_DATAGRAM); + if (host -> socket == ENET_SOCKET_NULL || (address != NULL && enet_socket_bind (host -> socket, address) < 0)) + { + if (host -> socket != ENET_SOCKET_NULL) + enet_socket_destroy (host -> socket); + + enet_free (host -> peers); + enet_free (host); + + return NULL; + } + + enet_socket_set_option (host -> socket, ENET_SOCKOPT_NONBLOCK, 1); + enet_socket_set_option (host -> socket, ENET_SOCKOPT_BROADCAST, 1); + enet_socket_set_option (host -> socket, ENET_SOCKOPT_RCVBUF, ENET_HOST_RECEIVE_BUFFER_SIZE); + enet_socket_set_option (host -> socket, ENET_SOCKOPT_SNDBUF, ENET_HOST_SEND_BUFFER_SIZE); + + if (address != NULL && enet_socket_get_address (host -> socket, & host -> address) < 0) + host -> address = * address; + + if (! channelLimit || channelLimit > ENET_PROTOCOL_MAXIMUM_CHANNEL_COUNT) + channelLimit = ENET_PROTOCOL_MAXIMUM_CHANNEL_COUNT; + else + if (channelLimit < ENET_PROTOCOL_MINIMUM_CHANNEL_COUNT) + channelLimit = ENET_PROTOCOL_MINIMUM_CHANNEL_COUNT; + + host -> randomSeed = (enet_uint32) (size_t) host; + host -> randomSeed += enet_host_random_seed (); + host -> randomSeed = (host -> randomSeed << 16) | (host -> randomSeed >> 16); + host -> channelLimit = channelLimit; + host -> incomingBandwidth = incomingBandwidth; + host -> outgoingBandwidth = outgoingBandwidth; + host -> bandwidthThrottleEpoch = 0; + host -> recalculateBandwidthLimits = 0; + host -> mtu = ENET_HOST_DEFAULT_MTU; + host -> peerCount = peerCount; + host -> commandCount = 0; + host -> bufferCount = 0; + host -> checksum = NULL; + host -> receivedAddress.host = ENET_HOST_ANY; + host -> receivedAddress.port = 0; + host -> receivedData = NULL; + host -> receivedDataLength = 0; + + host -> totalSentData = 0; + host -> totalSentPackets = 0; + host -> totalReceivedData = 0; + host -> totalReceivedPackets = 0; + host -> totalQueued = 0; + + host -> connectedPeers = 0; + host -> bandwidthLimitedPeers = 0; + host -> duplicatePeers = ENET_PROTOCOL_MAXIMUM_PEER_ID; + host -> maximumPacketSize = ENET_HOST_DEFAULT_MAXIMUM_PACKET_SIZE; + host -> maximumWaitingData = ENET_HOST_DEFAULT_MAXIMUM_WAITING_DATA; + + host -> compressor.context = NULL; + host -> compressor.compress = NULL; + host -> compressor.decompress = NULL; + host -> compressor.destroy = NULL; + + host -> intercept = NULL; + + enet_list_clear (& host -> dispatchQueue); + + for (currentPeer = host -> peers; + currentPeer < & host -> peers [host -> peerCount]; + ++ currentPeer) + { + currentPeer -> host = host; + currentPeer -> incomingPeerID = currentPeer - host -> peers; + currentPeer -> outgoingSessionID = currentPeer -> incomingSessionID = 0xFF; + currentPeer -> data = NULL; + + enet_list_clear (& currentPeer -> acknowledgements); + enet_list_clear (& currentPeer -> sentReliableCommands); + enet_list_clear (& currentPeer -> outgoingCommands); + enet_list_clear (& currentPeer -> outgoingSendReliableCommands); + enet_list_clear (& currentPeer -> dispatchedCommands); + + enet_peer_reset (currentPeer); + } + + return host; +} + +/** Destroys the host and all resources associated with it. + @param host pointer to the host to destroy +*/ +void +enet_host_destroy (ENetHost * host) +{ + ENetPeer * currentPeer; + + if (host == NULL) + return; + + enet_socket_destroy (host -> socket); + + for (currentPeer = host -> peers; + currentPeer < & host -> peers [host -> peerCount]; + ++ currentPeer) + { + enet_peer_reset (currentPeer); + } + + if (host -> compressor.context != NULL && host -> compressor.destroy) + (* host -> compressor.destroy) (host -> compressor.context); + + enet_free (host -> peers); + enet_free (host); +} + +enet_uint32 +enet_host_random (ENetHost * host) +{ + /* Mulberry32 by Tommy Ettinger */ + enet_uint32 n = (host -> randomSeed += 0x6D2B79F5U); + n = (n ^ (n >> 15)) * (n | 1U); + n ^= n + (n ^ (n >> 7)) * (n | 61U); + return n ^ (n >> 14); +} + +/** Initiates a connection to a foreign host. + @param host host seeking the connection + @param address destination for the connection + @param channelCount number of channels to allocate + @param data user data supplied to the receiving host + @returns a peer representing the foreign host on success, NULL on failure + @remarks The peer returned will have not completed the connection until enet_host_service() + notifies of an ENET_EVENT_TYPE_CONNECT event for the peer. +*/ +ENetPeer * +enet_host_connect (ENetHost * host, const ENetAddress * address, size_t channelCount, enet_uint32 data) +{ + ENetPeer * currentPeer; + ENetChannel * channel; + ENetProtocol command; + + if (channelCount < ENET_PROTOCOL_MINIMUM_CHANNEL_COUNT) + channelCount = ENET_PROTOCOL_MINIMUM_CHANNEL_COUNT; + else + if (channelCount > ENET_PROTOCOL_MAXIMUM_CHANNEL_COUNT) + channelCount = ENET_PROTOCOL_MAXIMUM_CHANNEL_COUNT; + + for (currentPeer = host -> peers; + currentPeer < & host -> peers [host -> peerCount]; + ++ currentPeer) + { + if (currentPeer -> state == ENET_PEER_STATE_DISCONNECTED) + break; + } + + if (currentPeer >= & host -> peers [host -> peerCount]) + return NULL; + + currentPeer -> channels = (ENetChannel *) enet_malloc (channelCount * sizeof (ENetChannel)); + if (currentPeer -> channels == NULL) + return NULL; + currentPeer -> channelCount = channelCount; + currentPeer -> state = ENET_PEER_STATE_CONNECTING; + currentPeer -> address = * address; + currentPeer -> connectID = enet_host_random (host); + currentPeer -> mtu = host -> mtu; + + if (host -> outgoingBandwidth == 0) + currentPeer -> windowSize = ENET_PROTOCOL_MAXIMUM_WINDOW_SIZE; + else + currentPeer -> windowSize = (host -> outgoingBandwidth / + ENET_PEER_WINDOW_SIZE_SCALE) * + ENET_PROTOCOL_MINIMUM_WINDOW_SIZE; + + if (currentPeer -> windowSize < ENET_PROTOCOL_MINIMUM_WINDOW_SIZE) + currentPeer -> windowSize = ENET_PROTOCOL_MINIMUM_WINDOW_SIZE; + else + if (currentPeer -> windowSize > ENET_PROTOCOL_MAXIMUM_WINDOW_SIZE) + currentPeer -> windowSize = ENET_PROTOCOL_MAXIMUM_WINDOW_SIZE; + + for (channel = currentPeer -> channels; + channel < & currentPeer -> channels [channelCount]; + ++ channel) + { + channel -> outgoingReliableSequenceNumber = 0; + channel -> outgoingUnreliableSequenceNumber = 0; + channel -> incomingReliableSequenceNumber = 0; + channel -> incomingUnreliableSequenceNumber = 0; + + enet_list_clear (& channel -> incomingReliableCommands); + enet_list_clear (& channel -> incomingUnreliableCommands); + + channel -> usedReliableWindows = 0; + memset (channel -> reliableWindows, 0, sizeof (channel -> reliableWindows)); + } + + command.header.command = ENET_PROTOCOL_COMMAND_CONNECT | ENET_PROTOCOL_COMMAND_FLAG_ACKNOWLEDGE; + command.header.channelID = 0xFF; + command.connect.outgoingPeerID = ENET_HOST_TO_NET_16 (currentPeer -> incomingPeerID); + command.connect.incomingSessionID = currentPeer -> incomingSessionID; + command.connect.outgoingSessionID = currentPeer -> outgoingSessionID; + command.connect.mtu = ENET_HOST_TO_NET_32 (currentPeer -> mtu); + command.connect.windowSize = ENET_HOST_TO_NET_32 (currentPeer -> windowSize); + command.connect.channelCount = ENET_HOST_TO_NET_32 (channelCount); + command.connect.incomingBandwidth = ENET_HOST_TO_NET_32 (host -> incomingBandwidth); + command.connect.outgoingBandwidth = ENET_HOST_TO_NET_32 (host -> outgoingBandwidth); + command.connect.packetThrottleInterval = ENET_HOST_TO_NET_32 (currentPeer -> packetThrottleInterval); + command.connect.packetThrottleAcceleration = ENET_HOST_TO_NET_32 (currentPeer -> packetThrottleAcceleration); + command.connect.packetThrottleDeceleration = ENET_HOST_TO_NET_32 (currentPeer -> packetThrottleDeceleration); + command.connect.connectID = currentPeer -> connectID; + command.connect.data = ENET_HOST_TO_NET_32 (data); + + enet_peer_queue_outgoing_command (currentPeer, & command, NULL, 0, 0); + + return currentPeer; +} + +/** Queues a packet to be sent to all peers associated with the host. + @param host host on which to broadcast the packet + @param channelID channel on which to broadcast + @param packet packet to broadcast +*/ +void +enet_host_broadcast (ENetHost * host, enet_uint8 channelID, ENetPacket * packet) +{ + ENetPeer * currentPeer; + + for (currentPeer = host -> peers; + currentPeer < & host -> peers [host -> peerCount]; + ++ currentPeer) + { + if (currentPeer -> state != ENET_PEER_STATE_CONNECTED) + continue; + + enet_peer_send (currentPeer, channelID, packet); + } + + if (packet -> referenceCount == 0) + enet_packet_destroy (packet); +} + +/** Sets the packet compressor the host should use to compress and decompress packets. + @param host host to enable or disable compression for + @param compressor callbacks for for the packet compressor; if NULL, then compression is disabled +*/ +void +enet_host_compress (ENetHost * host, const ENetCompressor * compressor) +{ + if (host -> compressor.context != NULL && host -> compressor.destroy) + (* host -> compressor.destroy) (host -> compressor.context); + + if (compressor) + host -> compressor = * compressor; + else + host -> compressor.context = NULL; +} + +/** Limits the maximum allowed channels of future incoming connections. + @param host host to limit + @param channelLimit the maximum number of channels allowed; if 0, then this is equivalent to ENET_PROTOCOL_MAXIMUM_CHANNEL_COUNT +*/ +void +enet_host_channel_limit (ENetHost * host, size_t channelLimit) +{ + if (! channelLimit || channelLimit > ENET_PROTOCOL_MAXIMUM_CHANNEL_COUNT) + channelLimit = ENET_PROTOCOL_MAXIMUM_CHANNEL_COUNT; + else + if (channelLimit < ENET_PROTOCOL_MINIMUM_CHANNEL_COUNT) + channelLimit = ENET_PROTOCOL_MINIMUM_CHANNEL_COUNT; + + host -> channelLimit = channelLimit; +} + + +/** Adjusts the bandwidth limits of a host. + @param host host to adjust + @param incomingBandwidth new incoming bandwidth + @param outgoingBandwidth new outgoing bandwidth + @remarks the incoming and outgoing bandwidth parameters are identical in function to those + specified in enet_host_create(). +*/ +void +enet_host_bandwidth_limit (ENetHost * host, enet_uint32 incomingBandwidth, enet_uint32 outgoingBandwidth) +{ + host -> incomingBandwidth = incomingBandwidth; + host -> outgoingBandwidth = outgoingBandwidth; + host -> recalculateBandwidthLimits = 1; +} + +void +enet_host_bandwidth_throttle (ENetHost * host) +{ + enet_uint32 timeCurrent = enet_time_get (), + elapsedTime = timeCurrent - host -> bandwidthThrottleEpoch, + peersRemaining = (enet_uint32) host -> connectedPeers, + dataTotal = ~0, + bandwidth = ~0, + throttle = 0, + bandwidthLimit = 0; + int needsAdjustment = host -> bandwidthLimitedPeers > 0 ? 1 : 0; + ENetPeer * peer; + ENetProtocol command; + + if (elapsedTime < ENET_HOST_BANDWIDTH_THROTTLE_INTERVAL) + return; + + host -> bandwidthThrottleEpoch = timeCurrent; + + if (peersRemaining == 0) + return; + + if (host -> outgoingBandwidth != 0) + { + dataTotal = 0; + bandwidth = (host -> outgoingBandwidth * elapsedTime) / 1000; + + for (peer = host -> peers; + peer < & host -> peers [host -> peerCount]; + ++ peer) + { + if (peer -> state != ENET_PEER_STATE_CONNECTED && peer -> state != ENET_PEER_STATE_DISCONNECT_LATER) + continue; + + dataTotal += peer -> outgoingDataTotal; + } + } + + while (peersRemaining > 0 && needsAdjustment != 0) + { + needsAdjustment = 0; + + if (dataTotal <= bandwidth) + throttle = ENET_PEER_PACKET_THROTTLE_SCALE; + else + throttle = (bandwidth * ENET_PEER_PACKET_THROTTLE_SCALE) / dataTotal; + + for (peer = host -> peers; + peer < & host -> peers [host -> peerCount]; + ++ peer) + { + enet_uint32 peerBandwidth; + + if ((peer -> state != ENET_PEER_STATE_CONNECTED && peer -> state != ENET_PEER_STATE_DISCONNECT_LATER) || + peer -> incomingBandwidth == 0 || + peer -> outgoingBandwidthThrottleEpoch == timeCurrent) + continue; + + peerBandwidth = (peer -> incomingBandwidth * elapsedTime) / 1000; + if ((throttle * peer -> outgoingDataTotal) / ENET_PEER_PACKET_THROTTLE_SCALE <= peerBandwidth) + continue; + + peer -> packetThrottleLimit = (peerBandwidth * + ENET_PEER_PACKET_THROTTLE_SCALE) / peer -> outgoingDataTotal; + + if (peer -> packetThrottleLimit == 0) + peer -> packetThrottleLimit = 1; + + if (peer -> packetThrottle > peer -> packetThrottleLimit) + peer -> packetThrottle = peer -> packetThrottleLimit; + + peer -> outgoingBandwidthThrottleEpoch = timeCurrent; + + peer -> incomingDataTotal = 0; + peer -> outgoingDataTotal = 0; + + needsAdjustment = 1; + -- peersRemaining; + bandwidth -= peerBandwidth; + dataTotal -= peerBandwidth; + } + } + + if (peersRemaining > 0) + { + if (dataTotal <= bandwidth) + throttle = ENET_PEER_PACKET_THROTTLE_SCALE; + else + throttle = (bandwidth * ENET_PEER_PACKET_THROTTLE_SCALE) / dataTotal; + + for (peer = host -> peers; + peer < & host -> peers [host -> peerCount]; + ++ peer) + { + if ((peer -> state != ENET_PEER_STATE_CONNECTED && peer -> state != ENET_PEER_STATE_DISCONNECT_LATER) || + peer -> outgoingBandwidthThrottleEpoch == timeCurrent) + continue; + + peer -> packetThrottleLimit = throttle; + + if (peer -> packetThrottle > peer -> packetThrottleLimit) + peer -> packetThrottle = peer -> packetThrottleLimit; + + peer -> incomingDataTotal = 0; + peer -> outgoingDataTotal = 0; + } + } + + if (host -> recalculateBandwidthLimits) + { + host -> recalculateBandwidthLimits = 0; + + peersRemaining = (enet_uint32) host -> connectedPeers; + bandwidth = host -> incomingBandwidth; + needsAdjustment = 1; + + if (bandwidth == 0) + bandwidthLimit = 0; + else + while (peersRemaining > 0 && needsAdjustment != 0) + { + needsAdjustment = 0; + bandwidthLimit = bandwidth / peersRemaining; + + for (peer = host -> peers; + peer < & host -> peers [host -> peerCount]; + ++ peer) + { + if ((peer -> state != ENET_PEER_STATE_CONNECTED && peer -> state != ENET_PEER_STATE_DISCONNECT_LATER) || + peer -> incomingBandwidthThrottleEpoch == timeCurrent) + continue; + + if (peer -> outgoingBandwidth > 0 && + peer -> outgoingBandwidth >= bandwidthLimit) + continue; + + peer -> incomingBandwidthThrottleEpoch = timeCurrent; + + needsAdjustment = 1; + -- peersRemaining; + bandwidth -= peer -> outgoingBandwidth; + } + } + + for (peer = host -> peers; + peer < & host -> peers [host -> peerCount]; + ++ peer) + { + if (peer -> state != ENET_PEER_STATE_CONNECTED && peer -> state != ENET_PEER_STATE_DISCONNECT_LATER) + continue; + + command.header.command = ENET_PROTOCOL_COMMAND_BANDWIDTH_LIMIT | ENET_PROTOCOL_COMMAND_FLAG_ACKNOWLEDGE; + command.header.channelID = 0xFF; + command.bandwidthLimit.outgoingBandwidth = ENET_HOST_TO_NET_32 (host -> outgoingBandwidth); + + if (peer -> incomingBandwidthThrottleEpoch == timeCurrent) + command.bandwidthLimit.incomingBandwidth = ENET_HOST_TO_NET_32 (peer -> outgoingBandwidth); + else + command.bandwidthLimit.incomingBandwidth = ENET_HOST_TO_NET_32 (bandwidthLimit); + + enet_peer_queue_outgoing_command (peer, & command, NULL, 0, 0); + } + } +} + +/** @} */ diff --git a/thirdparty/enet/include/enet/callbacks.h b/thirdparty/enet/include/enet/callbacks.h new file mode 100644 index 0000000..340a4a9 --- /dev/null +++ b/thirdparty/enet/include/enet/callbacks.h @@ -0,0 +1,27 @@ +/** + @file callbacks.h + @brief ENet callbacks +*/ +#ifndef __ENET_CALLBACKS_H__ +#define __ENET_CALLBACKS_H__ + +#include + +typedef struct _ENetCallbacks +{ + void * (ENET_CALLBACK * malloc) (size_t size); + void (ENET_CALLBACK * free) (void * memory); + void (ENET_CALLBACK * no_memory) (void); +} ENetCallbacks; + +/** @defgroup callbacks ENet internal callbacks + @{ + @ingroup private +*/ +extern void * enet_malloc (size_t); +extern void enet_free (void *); + +/** @} */ + +#endif /* __ENET_CALLBACKS_H__ */ + diff --git a/thirdparty/enet/include/enet/enet.h b/thirdparty/enet/include/enet/enet.h new file mode 100644 index 0000000..3001018 --- /dev/null +++ b/thirdparty/enet/include/enet/enet.h @@ -0,0 +1,616 @@ +/** + @file enet.h + @brief ENet public header file +*/ +#ifndef __ENET_ENET_H__ +#define __ENET_ENET_H__ + +#ifdef __cplusplus +extern "C" +{ +#endif + +#include + +#ifdef _WIN32 +#include "enet/win32.h" +#else +#include "enet/unix.h" +#endif + +#include "enet/types.h" +#include "enet/protocol.h" +#include "enet/list.h" +#include "enet/callbacks.h" + +#define ENET_VERSION_MAJOR 1 +#define ENET_VERSION_MINOR 3 +#define ENET_VERSION_PATCH 18 +#define ENET_VERSION_CREATE(major, minor, patch) (((major)<<16) | ((minor)<<8) | (patch)) +#define ENET_VERSION_GET_MAJOR(version) (((version)>>16)&0xFF) +#define ENET_VERSION_GET_MINOR(version) (((version)>>8)&0xFF) +#define ENET_VERSION_GET_PATCH(version) ((version)&0xFF) +#define ENET_VERSION ENET_VERSION_CREATE(ENET_VERSION_MAJOR, ENET_VERSION_MINOR, ENET_VERSION_PATCH) + +typedef enet_uint32 ENetVersion; + +struct _ENetHost; +struct _ENetEvent; +struct _ENetPacket; + +typedef enum _ENetSocketType +{ + ENET_SOCKET_TYPE_STREAM = 1, + ENET_SOCKET_TYPE_DATAGRAM = 2 +} ENetSocketType; + +typedef enum _ENetSocketWait +{ + ENET_SOCKET_WAIT_NONE = 0, + ENET_SOCKET_WAIT_SEND = (1 << 0), + ENET_SOCKET_WAIT_RECEIVE = (1 << 1), + ENET_SOCKET_WAIT_INTERRUPT = (1 << 2) +} ENetSocketWait; + +typedef enum _ENetSocketOption +{ + ENET_SOCKOPT_NONBLOCK = 1, + ENET_SOCKOPT_BROADCAST = 2, + ENET_SOCKOPT_RCVBUF = 3, + ENET_SOCKOPT_SNDBUF = 4, + ENET_SOCKOPT_REUSEADDR = 5, + ENET_SOCKOPT_RCVTIMEO = 6, + ENET_SOCKOPT_SNDTIMEO = 7, + ENET_SOCKOPT_ERROR = 8, + ENET_SOCKOPT_NODELAY = 9, + ENET_SOCKOPT_TTL = 10 +} ENetSocketOption; + +typedef enum _ENetSocketShutdown +{ + ENET_SOCKET_SHUTDOWN_READ = 0, + ENET_SOCKET_SHUTDOWN_WRITE = 1, + ENET_SOCKET_SHUTDOWN_READ_WRITE = 2 +} ENetSocketShutdown; + +#define ENET_HOST_ANY 0 +#define ENET_HOST_BROADCAST 0xFFFFFFFFU +#define ENET_PORT_ANY 0 + +/** + * Portable internet address structure. + * + * The host must be specified in network byte-order, and the port must be in host + * byte-order. The constant ENET_HOST_ANY may be used to specify the default + * server host. The constant ENET_HOST_BROADCAST may be used to specify the + * broadcast address (255.255.255.255). This makes sense for enet_host_connect, + * but not for enet_host_create. Once a server responds to a broadcast, the + * address is updated from ENET_HOST_BROADCAST to the server's actual IP address. + */ +typedef struct _ENetAddress +{ + enet_uint32 host; + enet_uint16 port; +} ENetAddress; + +/** + * Packet flag bit constants. + * + * The host must be specified in network byte-order, and the port must be in + * host byte-order. The constant ENET_HOST_ANY may be used to specify the + * default server host. + + @sa ENetPacket +*/ +typedef enum _ENetPacketFlag +{ + /** packet must be received by the target peer and resend attempts should be + * made until the packet is delivered */ + ENET_PACKET_FLAG_RELIABLE = (1 << 0), + /** packet will not be sequenced with other packets + * not supported for reliable packets + */ + ENET_PACKET_FLAG_UNSEQUENCED = (1 << 1), + /** packet will not allocate data, and user must supply it instead */ + ENET_PACKET_FLAG_NO_ALLOCATE = (1 << 2), + /** packet will be fragmented using unreliable (instead of reliable) sends + * if it exceeds the MTU */ + ENET_PACKET_FLAG_UNRELIABLE_FRAGMENT = (1 << 3), + + /** whether the packet has been sent from all queues it has been entered into */ + ENET_PACKET_FLAG_SENT = (1<<8) +} ENetPacketFlag; + +typedef void (ENET_CALLBACK * ENetPacketFreeCallback) (struct _ENetPacket *); + +/** + * ENet packet structure. + * + * An ENet data packet that may be sent to or received from a peer. The shown + * fields should only be read and never modified. The data field contains the + * allocated data for the packet. The dataLength fields specifies the length + * of the allocated data. The flags field is either 0 (specifying no flags), + * or a bitwise-or of any combination of the following flags: + * + * ENET_PACKET_FLAG_RELIABLE - packet must be received by the target peer + * and resend attempts should be made until the packet is delivered + * + * ENET_PACKET_FLAG_UNSEQUENCED - packet will not be sequenced with other packets + * (not supported for reliable packets) + * + * ENET_PACKET_FLAG_NO_ALLOCATE - packet will not allocate data, and user must supply it instead + * + * ENET_PACKET_FLAG_UNRELIABLE_FRAGMENT - packet will be fragmented using unreliable + * (instead of reliable) sends if it exceeds the MTU + * + * ENET_PACKET_FLAG_SENT - whether the packet has been sent from all queues it has been entered into + @sa ENetPacketFlag + */ +typedef struct _ENetPacket +{ + size_t referenceCount; /**< internal use only */ + enet_uint32 flags; /**< bitwise-or of ENetPacketFlag constants */ + enet_uint8 * data; /**< allocated data for packet */ + size_t dataLength; /**< length of data */ + ENetPacketFreeCallback freeCallback; /**< function to be called when the packet is no longer in use */ + void * userData; /**< application private data, may be freely modified */ +} ENetPacket; + +typedef struct _ENetAcknowledgement +{ + ENetListNode acknowledgementList; + enet_uint32 sentTime; + ENetProtocol command; +} ENetAcknowledgement; + +typedef struct _ENetOutgoingCommand +{ + ENetListNode outgoingCommandList; + enet_uint16 reliableSequenceNumber; + enet_uint16 unreliableSequenceNumber; + enet_uint32 sentTime; + enet_uint32 roundTripTimeout; + enet_uint32 queueTime; + enet_uint32 fragmentOffset; + enet_uint16 fragmentLength; + enet_uint16 sendAttempts; + ENetProtocol command; + ENetPacket * packet; +} ENetOutgoingCommand; + +typedef struct _ENetIncomingCommand +{ + ENetListNode incomingCommandList; + enet_uint16 reliableSequenceNumber; + enet_uint16 unreliableSequenceNumber; + ENetProtocol command; + enet_uint32 fragmentCount; + enet_uint32 fragmentsRemaining; + enet_uint32 * fragments; + ENetPacket * packet; +} ENetIncomingCommand; + +typedef enum _ENetPeerState +{ + ENET_PEER_STATE_DISCONNECTED = 0, + ENET_PEER_STATE_CONNECTING = 1, + ENET_PEER_STATE_ACKNOWLEDGING_CONNECT = 2, + ENET_PEER_STATE_CONNECTION_PENDING = 3, + ENET_PEER_STATE_CONNECTION_SUCCEEDED = 4, + ENET_PEER_STATE_CONNECTED = 5, + ENET_PEER_STATE_DISCONNECT_LATER = 6, + ENET_PEER_STATE_DISCONNECTING = 7, + ENET_PEER_STATE_ACKNOWLEDGING_DISCONNECT = 8, + ENET_PEER_STATE_ZOMBIE = 9 +} ENetPeerState; + +#ifndef ENET_BUFFER_MAXIMUM +#define ENET_BUFFER_MAXIMUM (1 + 2 * ENET_PROTOCOL_MAXIMUM_PACKET_COMMANDS) +#endif + +enum +{ + ENET_HOST_RECEIVE_BUFFER_SIZE = 256 * 1024, + ENET_HOST_SEND_BUFFER_SIZE = 256 * 1024, + ENET_HOST_BANDWIDTH_THROTTLE_INTERVAL = 1000, + ENET_HOST_DEFAULT_MTU = 1392, + ENET_HOST_DEFAULT_MAXIMUM_PACKET_SIZE = 32 * 1024 * 1024, + ENET_HOST_DEFAULT_MAXIMUM_WAITING_DATA = 32 * 1024 * 1024, + + ENET_PEER_DEFAULT_ROUND_TRIP_TIME = 500, + ENET_PEER_DEFAULT_PACKET_THROTTLE = 32, + ENET_PEER_PACKET_THROTTLE_SCALE = 32, + ENET_PEER_PACKET_THROTTLE_COUNTER = 7, + ENET_PEER_PACKET_THROTTLE_ACCELERATION = 2, + ENET_PEER_PACKET_THROTTLE_DECELERATION = 2, + ENET_PEER_PACKET_THROTTLE_INTERVAL = 5000, + ENET_PEER_PACKET_LOSS_SCALE = (1 << 16), + ENET_PEER_PACKET_LOSS_INTERVAL = 10000, + ENET_PEER_WINDOW_SIZE_SCALE = 64 * 1024, + ENET_PEER_TIMEOUT_LIMIT = 32, + ENET_PEER_TIMEOUT_MINIMUM = 5000, + ENET_PEER_TIMEOUT_MAXIMUM = 30000, + ENET_PEER_PING_INTERVAL = 500, + ENET_PEER_UNSEQUENCED_WINDOWS = 64, + ENET_PEER_UNSEQUENCED_WINDOW_SIZE = 1024, + ENET_PEER_FREE_UNSEQUENCED_WINDOWS = 32, + ENET_PEER_RELIABLE_WINDOWS = 16, + ENET_PEER_RELIABLE_WINDOW_SIZE = 0x1000, + ENET_PEER_FREE_RELIABLE_WINDOWS = 8 +}; + +typedef struct _ENetChannel +{ + enet_uint16 outgoingReliableSequenceNumber; + enet_uint16 outgoingUnreliableSequenceNumber; + enet_uint16 usedReliableWindows; + enet_uint16 reliableWindows [ENET_PEER_RELIABLE_WINDOWS]; + enet_uint16 incomingReliableSequenceNumber; + enet_uint16 incomingUnreliableSequenceNumber; + ENetList incomingReliableCommands; + ENetList incomingUnreliableCommands; +} ENetChannel; + +typedef enum _ENetPeerFlag +{ + ENET_PEER_FLAG_NEEDS_DISPATCH = (1 << 0), + ENET_PEER_FLAG_CONTINUE_SENDING = (1 << 1) +} ENetPeerFlag; + +/** + * An ENet peer which data packets may be sent or received from. + * + * No fields should be modified unless otherwise specified. + */ +typedef struct _ENetPeer +{ + ENetListNode dispatchList; + struct _ENetHost * host; + enet_uint16 outgoingPeerID; + enet_uint16 incomingPeerID; + enet_uint32 connectID; + enet_uint8 outgoingSessionID; + enet_uint8 incomingSessionID; + ENetAddress address; /**< Internet address of the peer */ + void * data; /**< Application private data, may be freely modified */ + ENetPeerState state; + ENetChannel * channels; + size_t channelCount; /**< Number of channels allocated for communication with peer */ + enet_uint32 incomingBandwidth; /**< Downstream bandwidth of the client in bytes/second */ + enet_uint32 outgoingBandwidth; /**< Upstream bandwidth of the client in bytes/second */ + enet_uint32 incomingBandwidthThrottleEpoch; + enet_uint32 outgoingBandwidthThrottleEpoch; + enet_uint32 incomingDataTotal; + enet_uint32 outgoingDataTotal; + enet_uint32 lastSendTime; + enet_uint32 lastReceiveTime; + enet_uint32 nextTimeout; + enet_uint32 earliestTimeout; + enet_uint32 packetLossEpoch; + enet_uint32 packetsSent; + enet_uint32 packetsLost; + enet_uint32 packetLoss; /**< mean packet loss of reliable packets as a ratio with respect to the constant ENET_PEER_PACKET_LOSS_SCALE */ + enet_uint32 packetLossVariance; + enet_uint32 packetThrottle; + enet_uint32 packetThrottleLimit; + enet_uint32 packetThrottleCounter; + enet_uint32 packetThrottleEpoch; + enet_uint32 packetThrottleAcceleration; + enet_uint32 packetThrottleDeceleration; + enet_uint32 packetThrottleInterval; + enet_uint32 pingInterval; + enet_uint32 timeoutLimit; + enet_uint32 timeoutMinimum; + enet_uint32 timeoutMaximum; + enet_uint32 lastRoundTripTime; + enet_uint32 lowestRoundTripTime; + enet_uint32 lastRoundTripTimeVariance; + enet_uint32 highestRoundTripTimeVariance; + enet_uint32 roundTripTime; /**< mean round trip time (RTT), in milliseconds, between sending a reliable packet and receiving its acknowledgement */ + enet_uint32 roundTripTimeVariance; + enet_uint32 mtu; + enet_uint32 windowSize; + enet_uint32 reliableDataInTransit; + enet_uint16 outgoingReliableSequenceNumber; + ENetList acknowledgements; + ENetList sentReliableCommands; + ENetList outgoingSendReliableCommands; + ENetList outgoingCommands; + ENetList dispatchedCommands; + enet_uint16 flags; + enet_uint16 reserved; + enet_uint16 incomingUnsequencedGroup; + enet_uint16 outgoingUnsequencedGroup; + enet_uint32 unsequencedWindow [ENET_PEER_UNSEQUENCED_WINDOW_SIZE / 32]; + enet_uint32 eventData; + size_t totalWaitingData; +} ENetPeer; + +/** An ENet packet compressor for compressing UDP packets before socket sends or receives. + */ +typedef struct _ENetCompressor +{ + /** Context data for the compressor. Must be non-NULL. */ + void * context; + /** Compresses from inBuffers[0:inBufferCount-1], containing inLimit bytes, to outData, outputting at most outLimit bytes. Should return 0 on failure. */ + size_t (ENET_CALLBACK * compress) (void * context, const ENetBuffer * inBuffers, size_t inBufferCount, size_t inLimit, enet_uint8 * outData, size_t outLimit); + /** Decompresses from inData, containing inLimit bytes, to outData, outputting at most outLimit bytes. Should return 0 on failure. */ + size_t (ENET_CALLBACK * decompress) (void * context, const enet_uint8 * inData, size_t inLimit, enet_uint8 * outData, size_t outLimit); + /** Destroys the context when compression is disabled or the host is destroyed. May be NULL. */ + void (ENET_CALLBACK * destroy) (void * context); +} ENetCompressor; + +/** Callback that computes the checksum of the data held in buffers[0:bufferCount-1] */ +typedef enet_uint32 (ENET_CALLBACK * ENetChecksumCallback) (const ENetBuffer * buffers, size_t bufferCount); + +/** Callback for intercepting received raw UDP packets. Should return 1 to intercept, 0 to ignore, or -1 to propagate an error. */ +typedef int (ENET_CALLBACK * ENetInterceptCallback) (struct _ENetHost * host, struct _ENetEvent * event); + +/** An ENet host for communicating with peers. + * + * No fields should be modified unless otherwise stated. + + @sa enet_host_create() + @sa enet_host_destroy() + @sa enet_host_connect() + @sa enet_host_service() + @sa enet_host_flush() + @sa enet_host_broadcast() + @sa enet_host_compress() + @sa enet_host_compress_with_range_coder() + @sa enet_host_channel_limit() + @sa enet_host_bandwidth_limit() + @sa enet_host_bandwidth_throttle() + */ +typedef struct _ENetHost +{ + ENetSocket socket; + ENetAddress address; /**< Internet address of the host */ + enet_uint32 incomingBandwidth; /**< downstream bandwidth of the host */ + enet_uint32 outgoingBandwidth; /**< upstream bandwidth of the host */ + enet_uint32 bandwidthThrottleEpoch; + enet_uint32 mtu; + enet_uint32 randomSeed; + int recalculateBandwidthLimits; + ENetPeer * peers; /**< array of peers allocated for this host */ + size_t peerCount; /**< number of peers allocated for this host */ + size_t channelLimit; /**< maximum number of channels allowed for connected peers */ + enet_uint32 serviceTime; + ENetList dispatchQueue; + enet_uint32 totalQueued; + size_t packetSize; + enet_uint16 headerFlags; + ENetProtocol commands [ENET_PROTOCOL_MAXIMUM_PACKET_COMMANDS]; + size_t commandCount; + ENetBuffer buffers [ENET_BUFFER_MAXIMUM]; + size_t bufferCount; + ENetChecksumCallback checksum; /**< callback the user can set to enable packet checksums for this host */ + ENetCompressor compressor; + enet_uint8 packetData [2][ENET_PROTOCOL_MAXIMUM_MTU]; + ENetAddress receivedAddress; + enet_uint8 * receivedData; + size_t receivedDataLength; + enet_uint32 totalSentData; /**< total data sent, user should reset to 0 as needed to prevent overflow */ + enet_uint32 totalSentPackets; /**< total UDP packets sent, user should reset to 0 as needed to prevent overflow */ + enet_uint32 totalReceivedData; /**< total data received, user should reset to 0 as needed to prevent overflow */ + enet_uint32 totalReceivedPackets; /**< total UDP packets received, user should reset to 0 as needed to prevent overflow */ + ENetInterceptCallback intercept; /**< callback the user can set to intercept received raw UDP packets */ + size_t connectedPeers; + size_t bandwidthLimitedPeers; + size_t duplicatePeers; /**< optional number of allowed peers from duplicate IPs, defaults to ENET_PROTOCOL_MAXIMUM_PEER_ID */ + size_t maximumPacketSize; /**< the maximum allowable packet size that may be sent or received on a peer */ + size_t maximumWaitingData; /**< the maximum aggregate amount of buffer space a peer may use waiting for packets to be delivered */ +} ENetHost; + +/** + * An ENet event type, as specified in @ref ENetEvent. + */ +typedef enum _ENetEventType +{ + /** no event occurred within the specified time limit */ + ENET_EVENT_TYPE_NONE = 0, + + /** a connection request initiated by enet_host_connect has completed. + * The peer field contains the peer which successfully connected. + */ + ENET_EVENT_TYPE_CONNECT = 1, + + /** a peer has disconnected. This event is generated on a successful + * completion of a disconnect initiated by enet_peer_disconnect, if + * a peer has timed out, or if a connection request intialized by + * enet_host_connect has timed out. The peer field contains the peer + * which disconnected. The data field contains user supplied data + * describing the disconnection, or 0, if none is available. + */ + ENET_EVENT_TYPE_DISCONNECT = 2, + + /** a packet has been received from a peer. The peer field specifies the + * peer which sent the packet. The channelID field specifies the channel + * number upon which the packet was received. The packet field contains + * the packet that was received; this packet must be destroyed with + * enet_packet_destroy after use. + */ + ENET_EVENT_TYPE_RECEIVE = 3 +} ENetEventType; + +/** + * An ENet event as returned by enet_host_service(). + + @sa enet_host_service + */ +typedef struct _ENetEvent +{ + ENetEventType type; /**< type of the event */ + ENetPeer * peer; /**< peer that generated a connect, disconnect or receive event */ + enet_uint8 channelID; /**< channel on the peer that generated the event, if appropriate */ + enet_uint32 data; /**< data associated with the event, if appropriate */ + ENetPacket * packet; /**< packet associated with the event, if appropriate */ +} ENetEvent; + +/** @defgroup global ENet global functions + @{ +*/ + +/** + Initializes ENet globally. Must be called prior to using any functions in + ENet. + @returns 0 on success, < 0 on failure +*/ +ENET_API int enet_initialize (void); + +/** + Initializes ENet globally and supplies user-overridden callbacks. Must be called prior to using any functions in ENet. Do not use enet_initialize() if you use this variant. Make sure the ENetCallbacks structure is zeroed out so that any additional callbacks added in future versions will be properly ignored. + + @param version the constant ENET_VERSION should be supplied so ENet knows which version of ENetCallbacks struct to use + @param inits user-overridden callbacks where any NULL callbacks will use ENet's defaults + @returns 0 on success, < 0 on failure +*/ +ENET_API int enet_initialize_with_callbacks (ENetVersion version, const ENetCallbacks * inits); + +/** + Shuts down ENet globally. Should be called when a program that has + initialized ENet exits. +*/ +ENET_API void enet_deinitialize (void); + +/** + Gives the linked version of the ENet library. + @returns the version number +*/ +ENET_API ENetVersion enet_linked_version (void); + +/** @} */ + +/** @defgroup private ENet private implementation functions */ + +/** + Returns the wall-time in milliseconds. Its initial value is unspecified + unless otherwise set. + */ +ENET_API enet_uint32 enet_time_get (void); +/** + Sets the current wall-time in milliseconds. + */ +ENET_API void enet_time_set (enet_uint32); + +/** @defgroup socket ENet socket functions + @{ +*/ +ENET_API ENetSocket enet_socket_create (ENetSocketType); +ENET_API int enet_socket_bind (ENetSocket, const ENetAddress *); +ENET_API int enet_socket_get_address (ENetSocket, ENetAddress *); +ENET_API int enet_socket_listen (ENetSocket, int); +ENET_API ENetSocket enet_socket_accept (ENetSocket, ENetAddress *); +ENET_API int enet_socket_connect (ENetSocket, const ENetAddress *); +ENET_API int enet_socket_send (ENetSocket, const ENetAddress *, const ENetBuffer *, size_t); +ENET_API int enet_socket_receive (ENetSocket, ENetAddress *, ENetBuffer *, size_t); +ENET_API int enet_socket_wait (ENetSocket, enet_uint32 *, enet_uint32); +ENET_API int enet_socket_set_option (ENetSocket, ENetSocketOption, int); +ENET_API int enet_socket_get_option (ENetSocket, ENetSocketOption, int *); +ENET_API int enet_socket_shutdown (ENetSocket, ENetSocketShutdown); +ENET_API void enet_socket_destroy (ENetSocket); +ENET_API int enet_socketset_select (ENetSocket, ENetSocketSet *, ENetSocketSet *, enet_uint32); + +/** @} */ + +/** @defgroup Address ENet address functions + @{ +*/ + +/** Attempts to parse the printable form of the IP address in the parameter hostName + and sets the host field in the address parameter if successful. + @param address destination to store the parsed IP address + @param hostName IP address to parse + @retval 0 on success + @retval < 0 on failure + @returns the address of the given hostName in address on success +*/ +ENET_API int enet_address_set_host_ip (ENetAddress * address, const char * hostName); + +/** Attempts to resolve the host named by the parameter hostName and sets + the host field in the address parameter if successful. + @param address destination to store resolved address + @param hostName host name to lookup + @retval 0 on success + @retval < 0 on failure + @returns the address of the given hostName in address on success +*/ +ENET_API int enet_address_set_host (ENetAddress * address, const char * hostName); + +/** Gives the printable form of the IP address specified in the address parameter. + @param address address printed + @param hostName destination for name, must not be NULL + @param nameLength maximum length of hostName. + @returns the null-terminated name of the host in hostName on success + @retval 0 on success + @retval < 0 on failure +*/ +ENET_API int enet_address_get_host_ip (const ENetAddress * address, char * hostName, size_t nameLength); + +/** Attempts to do a reverse lookup of the host field in the address parameter. + @param address address used for reverse lookup + @param hostName destination for name, must not be NULL + @param nameLength maximum length of hostName. + @returns the null-terminated name of the host in hostName on success + @retval 0 on success + @retval < 0 on failure +*/ +ENET_API int enet_address_get_host (const ENetAddress * address, char * hostName, size_t nameLength); + +/** @} */ + +ENET_API ENetPacket * enet_packet_create (const void *, size_t, enet_uint32); +ENET_API void enet_packet_destroy (ENetPacket *); +ENET_API int enet_packet_resize (ENetPacket *, size_t); +ENET_API enet_uint32 enet_crc32 (const ENetBuffer *, size_t); + +ENET_API ENetHost * enet_host_create (const ENetAddress *, size_t, size_t, enet_uint32, enet_uint32); +ENET_API void enet_host_destroy (ENetHost *); +ENET_API ENetPeer * enet_host_connect (ENetHost *, const ENetAddress *, size_t, enet_uint32); +ENET_API int enet_host_check_events (ENetHost *, ENetEvent *); +ENET_API int enet_host_service (ENetHost *, ENetEvent *, enet_uint32); +ENET_API void enet_host_flush (ENetHost *); +ENET_API void enet_host_broadcast (ENetHost *, enet_uint8, ENetPacket *); +ENET_API void enet_host_compress (ENetHost *, const ENetCompressor *); +ENET_API int enet_host_compress_with_range_coder (ENetHost * host); +ENET_API void enet_host_channel_limit (ENetHost *, size_t); +ENET_API void enet_host_bandwidth_limit (ENetHost *, enet_uint32, enet_uint32); +extern void enet_host_bandwidth_throttle (ENetHost *); +extern enet_uint32 enet_host_random_seed (void); +extern enet_uint32 enet_host_random (ENetHost *); + +ENET_API int enet_peer_send (ENetPeer *, enet_uint8, ENetPacket *); +ENET_API ENetPacket * enet_peer_receive (ENetPeer *, enet_uint8 * channelID); +ENET_API void enet_peer_ping (ENetPeer *); +ENET_API void enet_peer_ping_interval (ENetPeer *, enet_uint32); +ENET_API void enet_peer_timeout (ENetPeer *, enet_uint32, enet_uint32, enet_uint32); +ENET_API void enet_peer_reset (ENetPeer *); +ENET_API void enet_peer_disconnect (ENetPeer *, enet_uint32); +ENET_API void enet_peer_disconnect_now (ENetPeer *, enet_uint32); +ENET_API void enet_peer_disconnect_later (ENetPeer *, enet_uint32); +ENET_API void enet_peer_throttle_configure (ENetPeer *, enet_uint32, enet_uint32, enet_uint32); +extern int enet_peer_throttle (ENetPeer *, enet_uint32); +extern void enet_peer_reset_queues (ENetPeer *); +extern int enet_peer_has_outgoing_commands (ENetPeer *); +extern void enet_peer_setup_outgoing_command (ENetPeer *, ENetOutgoingCommand *); +extern ENetOutgoingCommand * enet_peer_queue_outgoing_command (ENetPeer *, const ENetProtocol *, ENetPacket *, enet_uint32, enet_uint16); +extern ENetIncomingCommand * enet_peer_queue_incoming_command (ENetPeer *, const ENetProtocol *, const void *, size_t, enet_uint32, enet_uint32); +extern ENetAcknowledgement * enet_peer_queue_acknowledgement (ENetPeer *, const ENetProtocol *, enet_uint16); +extern void enet_peer_dispatch_incoming_unreliable_commands (ENetPeer *, ENetChannel *, ENetIncomingCommand *); +extern void enet_peer_dispatch_incoming_reliable_commands (ENetPeer *, ENetChannel *, ENetIncomingCommand *); +extern void enet_peer_on_connect (ENetPeer *); +extern void enet_peer_on_disconnect (ENetPeer *); + +ENET_API void * enet_range_coder_create (void); +ENET_API void enet_range_coder_destroy (void *); +ENET_API size_t enet_range_coder_compress (void *, const ENetBuffer *, size_t, size_t, enet_uint8 *, size_t); +ENET_API size_t enet_range_coder_decompress (void *, const enet_uint8 *, size_t, enet_uint8 *, size_t); + +extern size_t enet_protocol_command_size (enet_uint8); + +#ifdef __cplusplus +} +#endif + +#endif /* __ENET_ENET_H__ */ + diff --git a/thirdparty/enet/include/enet/list.h b/thirdparty/enet/include/enet/list.h new file mode 100644 index 0000000..d7b2600 --- /dev/null +++ b/thirdparty/enet/include/enet/list.h @@ -0,0 +1,43 @@ +/** + @file list.h + @brief ENet list management +*/ +#ifndef __ENET_LIST_H__ +#define __ENET_LIST_H__ + +#include + +typedef struct _ENetListNode +{ + struct _ENetListNode * next; + struct _ENetListNode * previous; +} ENetListNode; + +typedef ENetListNode * ENetListIterator; + +typedef struct _ENetList +{ + ENetListNode sentinel; +} ENetList; + +extern void enet_list_clear (ENetList *); + +extern ENetListIterator enet_list_insert (ENetListIterator, void *); +extern void * enet_list_remove (ENetListIterator); +extern ENetListIterator enet_list_move (ENetListIterator, void *, void *); + +extern size_t enet_list_size (ENetList *); + +#define enet_list_begin(list) ((list) -> sentinel.next) +#define enet_list_end(list) (& (list) -> sentinel) + +#define enet_list_empty(list) (enet_list_begin (list) == enet_list_end (list)) + +#define enet_list_next(iterator) ((iterator) -> next) +#define enet_list_previous(iterator) ((iterator) -> previous) + +#define enet_list_front(list) ((void *) (list) -> sentinel.next) +#define enet_list_back(list) ((void *) (list) -> sentinel.previous) + +#endif /* __ENET_LIST_H__ */ + diff --git a/thirdparty/enet/include/enet/protocol.h b/thirdparty/enet/include/enet/protocol.h new file mode 100644 index 0000000..f8c73d8 --- /dev/null +++ b/thirdparty/enet/include/enet/protocol.h @@ -0,0 +1,198 @@ +/** + @file protocol.h + @brief ENet protocol +*/ +#ifndef __ENET_PROTOCOL_H__ +#define __ENET_PROTOCOL_H__ + +#include "enet/types.h" + +enum +{ + ENET_PROTOCOL_MINIMUM_MTU = 576, + ENET_PROTOCOL_MAXIMUM_MTU = 4096, + ENET_PROTOCOL_MAXIMUM_PACKET_COMMANDS = 32, + ENET_PROTOCOL_MINIMUM_WINDOW_SIZE = 4096, + ENET_PROTOCOL_MAXIMUM_WINDOW_SIZE = 65536, + ENET_PROTOCOL_MINIMUM_CHANNEL_COUNT = 1, + ENET_PROTOCOL_MAXIMUM_CHANNEL_COUNT = 255, + ENET_PROTOCOL_MAXIMUM_PEER_ID = 0xFFF, + ENET_PROTOCOL_MAXIMUM_FRAGMENT_COUNT = 1024 * 1024 +}; + +typedef enum _ENetProtocolCommand +{ + ENET_PROTOCOL_COMMAND_NONE = 0, + ENET_PROTOCOL_COMMAND_ACKNOWLEDGE = 1, + ENET_PROTOCOL_COMMAND_CONNECT = 2, + ENET_PROTOCOL_COMMAND_VERIFY_CONNECT = 3, + ENET_PROTOCOL_COMMAND_DISCONNECT = 4, + ENET_PROTOCOL_COMMAND_PING = 5, + ENET_PROTOCOL_COMMAND_SEND_RELIABLE = 6, + ENET_PROTOCOL_COMMAND_SEND_UNRELIABLE = 7, + ENET_PROTOCOL_COMMAND_SEND_FRAGMENT = 8, + ENET_PROTOCOL_COMMAND_SEND_UNSEQUENCED = 9, + ENET_PROTOCOL_COMMAND_BANDWIDTH_LIMIT = 10, + ENET_PROTOCOL_COMMAND_THROTTLE_CONFIGURE = 11, + ENET_PROTOCOL_COMMAND_SEND_UNRELIABLE_FRAGMENT = 12, + ENET_PROTOCOL_COMMAND_COUNT = 13, + + ENET_PROTOCOL_COMMAND_MASK = 0x0F +} ENetProtocolCommand; + +typedef enum _ENetProtocolFlag +{ + ENET_PROTOCOL_COMMAND_FLAG_ACKNOWLEDGE = (1 << 7), + ENET_PROTOCOL_COMMAND_FLAG_UNSEQUENCED = (1 << 6), + + ENET_PROTOCOL_HEADER_FLAG_COMPRESSED = (1 << 14), + ENET_PROTOCOL_HEADER_FLAG_SENT_TIME = (1 << 15), + ENET_PROTOCOL_HEADER_FLAG_MASK = ENET_PROTOCOL_HEADER_FLAG_COMPRESSED | ENET_PROTOCOL_HEADER_FLAG_SENT_TIME, + + ENET_PROTOCOL_HEADER_SESSION_MASK = (3 << 12), + ENET_PROTOCOL_HEADER_SESSION_SHIFT = 12 +} ENetProtocolFlag; + +#ifdef _MSC_VER +#pragma pack(push, 1) +#define ENET_PACKED +#elif defined(__GNUC__) || defined(__clang__) +#define ENET_PACKED __attribute__ ((packed)) +#else +#define ENET_PACKED +#endif + +typedef struct _ENetProtocolHeader +{ + enet_uint16 peerID; + enet_uint16 sentTime; +} ENET_PACKED ENetProtocolHeader; + +typedef struct _ENetProtocolCommandHeader +{ + enet_uint8 command; + enet_uint8 channelID; + enet_uint16 reliableSequenceNumber; +} ENET_PACKED ENetProtocolCommandHeader; + +typedef struct _ENetProtocolAcknowledge +{ + ENetProtocolCommandHeader header; + enet_uint16 receivedReliableSequenceNumber; + enet_uint16 receivedSentTime; +} ENET_PACKED ENetProtocolAcknowledge; + +typedef struct _ENetProtocolConnect +{ + ENetProtocolCommandHeader header; + enet_uint16 outgoingPeerID; + enet_uint8 incomingSessionID; + enet_uint8 outgoingSessionID; + enet_uint32 mtu; + enet_uint32 windowSize; + enet_uint32 channelCount; + enet_uint32 incomingBandwidth; + enet_uint32 outgoingBandwidth; + enet_uint32 packetThrottleInterval; + enet_uint32 packetThrottleAcceleration; + enet_uint32 packetThrottleDeceleration; + enet_uint32 connectID; + enet_uint32 data; +} ENET_PACKED ENetProtocolConnect; + +typedef struct _ENetProtocolVerifyConnect +{ + ENetProtocolCommandHeader header; + enet_uint16 outgoingPeerID; + enet_uint8 incomingSessionID; + enet_uint8 outgoingSessionID; + enet_uint32 mtu; + enet_uint32 windowSize; + enet_uint32 channelCount; + enet_uint32 incomingBandwidth; + enet_uint32 outgoingBandwidth; + enet_uint32 packetThrottleInterval; + enet_uint32 packetThrottleAcceleration; + enet_uint32 packetThrottleDeceleration; + enet_uint32 connectID; +} ENET_PACKED ENetProtocolVerifyConnect; + +typedef struct _ENetProtocolBandwidthLimit +{ + ENetProtocolCommandHeader header; + enet_uint32 incomingBandwidth; + enet_uint32 outgoingBandwidth; +} ENET_PACKED ENetProtocolBandwidthLimit; + +typedef struct _ENetProtocolThrottleConfigure +{ + ENetProtocolCommandHeader header; + enet_uint32 packetThrottleInterval; + enet_uint32 packetThrottleAcceleration; + enet_uint32 packetThrottleDeceleration; +} ENET_PACKED ENetProtocolThrottleConfigure; + +typedef struct _ENetProtocolDisconnect +{ + ENetProtocolCommandHeader header; + enet_uint32 data; +} ENET_PACKED ENetProtocolDisconnect; + +typedef struct _ENetProtocolPing +{ + ENetProtocolCommandHeader header; +} ENET_PACKED ENetProtocolPing; + +typedef struct _ENetProtocolSendReliable +{ + ENetProtocolCommandHeader header; + enet_uint16 dataLength; +} ENET_PACKED ENetProtocolSendReliable; + +typedef struct _ENetProtocolSendUnreliable +{ + ENetProtocolCommandHeader header; + enet_uint16 unreliableSequenceNumber; + enet_uint16 dataLength; +} ENET_PACKED ENetProtocolSendUnreliable; + +typedef struct _ENetProtocolSendUnsequenced +{ + ENetProtocolCommandHeader header; + enet_uint16 unsequencedGroup; + enet_uint16 dataLength; +} ENET_PACKED ENetProtocolSendUnsequenced; + +typedef struct _ENetProtocolSendFragment +{ + ENetProtocolCommandHeader header; + enet_uint16 startSequenceNumber; + enet_uint16 dataLength; + enet_uint32 fragmentCount; + enet_uint32 fragmentNumber; + enet_uint32 totalLength; + enet_uint32 fragmentOffset; +} ENET_PACKED ENetProtocolSendFragment; + +typedef union _ENetProtocol +{ + ENetProtocolCommandHeader header; + ENetProtocolAcknowledge acknowledge; + ENetProtocolConnect connect; + ENetProtocolVerifyConnect verifyConnect; + ENetProtocolDisconnect disconnect; + ENetProtocolPing ping; + ENetProtocolSendReliable sendReliable; + ENetProtocolSendUnreliable sendUnreliable; + ENetProtocolSendUnsequenced sendUnsequenced; + ENetProtocolSendFragment sendFragment; + ENetProtocolBandwidthLimit bandwidthLimit; + ENetProtocolThrottleConfigure throttleConfigure; +} ENET_PACKED ENetProtocol; + +#ifdef _MSC_VER +#pragma pack(pop) +#endif + +#endif /* __ENET_PROTOCOL_H__ */ + diff --git a/thirdparty/enet/include/enet/time.h b/thirdparty/enet/include/enet/time.h new file mode 100644 index 0000000..c82a546 --- /dev/null +++ b/thirdparty/enet/include/enet/time.h @@ -0,0 +1,18 @@ +/** + @file time.h + @brief ENet time constants and macros +*/ +#ifndef __ENET_TIME_H__ +#define __ENET_TIME_H__ + +#define ENET_TIME_OVERFLOW 86400000 + +#define ENET_TIME_LESS(a, b) ((a) - (b) >= ENET_TIME_OVERFLOW) +#define ENET_TIME_GREATER(a, b) ((b) - (a) >= ENET_TIME_OVERFLOW) +#define ENET_TIME_LESS_EQUAL(a, b) (! ENET_TIME_GREATER (a, b)) +#define ENET_TIME_GREATER_EQUAL(a, b) (! ENET_TIME_LESS (a, b)) + +#define ENET_TIME_DIFFERENCE(a, b) ((a) - (b) >= ENET_TIME_OVERFLOW ? (b) - (a) : (a) - (b)) + +#endif /* __ENET_TIME_H__ */ + diff --git a/thirdparty/enet/include/enet/types.h b/thirdparty/enet/include/enet/types.h new file mode 100644 index 0000000..ab010a4 --- /dev/null +++ b/thirdparty/enet/include/enet/types.h @@ -0,0 +1,13 @@ +/** + @file types.h + @brief type definitions for ENet +*/ +#ifndef __ENET_TYPES_H__ +#define __ENET_TYPES_H__ + +typedef unsigned char enet_uint8; /**< unsigned 8-bit type */ +typedef unsigned short enet_uint16; /**< unsigned 16-bit type */ +typedef unsigned int enet_uint32; /**< unsigned 32-bit type */ + +#endif /* __ENET_TYPES_H__ */ + diff --git a/thirdparty/enet/include/enet/unix.h b/thirdparty/enet/include/enet/unix.h new file mode 100644 index 0000000..b55be33 --- /dev/null +++ b/thirdparty/enet/include/enet/unix.h @@ -0,0 +1,48 @@ +/** + @file unix.h + @brief ENet Unix header +*/ +#ifndef __ENET_UNIX_H__ +#define __ENET_UNIX_H__ + +#include +#include +#include +#include +#include +#include +#include + +#ifdef MSG_MAXIOVLEN +#define ENET_BUFFER_MAXIMUM MSG_MAXIOVLEN +#endif + +typedef int ENetSocket; + +#define ENET_SOCKET_NULL -1 + +#define ENET_HOST_TO_NET_16(value) (htons (value)) /**< macro that converts host to net byte-order of a 16-bit value */ +#define ENET_HOST_TO_NET_32(value) (htonl (value)) /**< macro that converts host to net byte-order of a 32-bit value */ + +#define ENET_NET_TO_HOST_16(value) (ntohs (value)) /**< macro that converts net to host byte-order of a 16-bit value */ +#define ENET_NET_TO_HOST_32(value) (ntohl (value)) /**< macro that converts net to host byte-order of a 32-bit value */ + +typedef struct +{ + void * data; + size_t dataLength; +} ENetBuffer; + +#define ENET_CALLBACK + +#define ENET_API extern + +typedef fd_set ENetSocketSet; + +#define ENET_SOCKETSET_EMPTY(sockset) FD_ZERO (& (sockset)) +#define ENET_SOCKETSET_ADD(sockset, socket) FD_SET (socket, & (sockset)) +#define ENET_SOCKETSET_REMOVE(sockset, socket) FD_CLR (socket, & (sockset)) +#define ENET_SOCKETSET_CHECK(sockset, socket) FD_ISSET (socket, & (sockset)) + +#endif /* __ENET_UNIX_H__ */ + diff --git a/thirdparty/enet/include/enet/utility.h b/thirdparty/enet/include/enet/utility.h new file mode 100644 index 0000000..b04bb7a --- /dev/null +++ b/thirdparty/enet/include/enet/utility.h @@ -0,0 +1,13 @@ +/** + @file utility.h + @brief ENet utility header +*/ +#ifndef __ENET_UTILITY_H__ +#define __ENET_UTILITY_H__ + +#define ENET_MAX(x, y) ((x) > (y) ? (x) : (y)) +#define ENET_MIN(x, y) ((x) < (y) ? (x) : (y)) +#define ENET_DIFFERENCE(x, y) ((x) < (y) ? (y) - (x) : (x) - (y)) + +#endif /* __ENET_UTILITY_H__ */ + diff --git a/thirdparty/enet/include/enet/win32.h b/thirdparty/enet/include/enet/win32.h new file mode 100644 index 0000000..6fbd7c0 --- /dev/null +++ b/thirdparty/enet/include/enet/win32.h @@ -0,0 +1,59 @@ +/** + @file win32.h + @brief ENet Win32 header +*/ +#ifndef __ENET_WIN32_H__ +#define __ENET_WIN32_H__ + +#ifdef _MSC_VER +#ifdef ENET_BUILDING_LIB +#pragma warning (disable: 4267) // size_t to int conversion +#pragma warning (disable: 4244) // 64bit to 32bit int +#pragma warning (disable: 4018) // signed/unsigned mismatch +#pragma warning (disable: 4146) // unary minus operator applied to unsigned type +#define _CRT_SECURE_NO_DEPRECATE +#define _CRT_SECURE_NO_WARNINGS +#endif +#endif + +#include +#include + +typedef SOCKET ENetSocket; + +#define ENET_SOCKET_NULL INVALID_SOCKET + +#define ENET_HOST_TO_NET_16(value) (htons (value)) +#define ENET_HOST_TO_NET_32(value) (htonl (value)) + +#define ENET_NET_TO_HOST_16(value) (ntohs (value)) +#define ENET_NET_TO_HOST_32(value) (ntohl (value)) + +typedef struct +{ + size_t dataLength; + void * data; +} ENetBuffer; + +#define ENET_CALLBACK __cdecl + +#ifdef ENET_DLL +#ifdef ENET_BUILDING_LIB +#define ENET_API __declspec( dllexport ) +#else +#define ENET_API __declspec( dllimport ) +#endif /* ENET_BUILDING_LIB */ +#else /* !ENET_DLL */ +#define ENET_API extern +#endif /* ENET_DLL */ + +typedef fd_set ENetSocketSet; + +#define ENET_SOCKETSET_EMPTY(sockset) FD_ZERO (& (sockset)) +#define ENET_SOCKETSET_ADD(sockset, socket) FD_SET (socket, & (sockset)) +#define ENET_SOCKETSET_REMOVE(sockset, socket) FD_CLR (socket, & (sockset)) +#define ENET_SOCKETSET_CHECK(sockset, socket) FD_ISSET (socket, & (sockset)) + +#endif /* __ENET_WIN32_H__ */ + + diff --git a/thirdparty/enet/libenet.pc.in b/thirdparty/enet/libenet.pc.in new file mode 100644 index 0000000..7af85ad --- /dev/null +++ b/thirdparty/enet/libenet.pc.in @@ -0,0 +1,10 @@ +prefix=@prefix@ +exec_prefix=@exec_prefix@ +libdir=@libdir@ +includedir=@includedir@ + +Name: @PACKAGE_NAME@ +Description: Low-latency UDP networking library supporting optional reliability +Version: @PACKAGE_VERSION@ +Cflags: -I${includedir} +Libs: -L${libdir} -lenet diff --git a/thirdparty/enet/list.c b/thirdparty/enet/list.c new file mode 100644 index 0000000..1c1a8df --- /dev/null +++ b/thirdparty/enet/list.c @@ -0,0 +1,75 @@ +/** + @file list.c + @brief ENet linked list functions +*/ +#define ENET_BUILDING_LIB 1 +#include "enet/enet.h" + +/** + @defgroup list ENet linked list utility functions + @ingroup private + @{ +*/ +void +enet_list_clear (ENetList * list) +{ + list -> sentinel.next = & list -> sentinel; + list -> sentinel.previous = & list -> sentinel; +} + +ENetListIterator +enet_list_insert (ENetListIterator position, void * data) +{ + ENetListIterator result = (ENetListIterator) data; + + result -> previous = position -> previous; + result -> next = position; + + result -> previous -> next = result; + position -> previous = result; + + return result; +} + +void * +enet_list_remove (ENetListIterator position) +{ + position -> previous -> next = position -> next; + position -> next -> previous = position -> previous; + + return position; +} + +ENetListIterator +enet_list_move (ENetListIterator position, void * dataFirst, void * dataLast) +{ + ENetListIterator first = (ENetListIterator) dataFirst, + last = (ENetListIterator) dataLast; + + first -> previous -> next = last -> next; + last -> next -> previous = first -> previous; + + first -> previous = position -> previous; + last -> next = position; + + first -> previous -> next = first; + position -> previous = last; + + return first; +} + +size_t +enet_list_size (ENetList * list) +{ + size_t size = 0; + ENetListIterator position; + + for (position = enet_list_begin (list); + position != enet_list_end (list); + position = enet_list_next (position)) + ++ size; + + return size; +} + +/** @} */ diff --git a/thirdparty/enet/m4/.keep b/thirdparty/enet/m4/.keep new file mode 100644 index 0000000..e69de29 diff --git a/thirdparty/enet/packet.c b/thirdparty/enet/packet.c new file mode 100644 index 0000000..d51c640 --- /dev/null +++ b/thirdparty/enet/packet.c @@ -0,0 +1,158 @@ +/** + @file packet.c + @brief ENet packet management functions +*/ +#include +#define ENET_BUILDING_LIB 1 +#include "enet/enet.h" + +/** @defgroup Packet ENet packet functions + @{ +*/ + +/** Creates a packet that may be sent to a peer. + @param data initial contents of the packet's data; the packet's data will remain uninitialized if data is NULL. + @param dataLength size of the data allocated for this packet + @param flags flags for this packet as described for the ENetPacket structure. + @returns the packet on success, NULL on failure +*/ +ENetPacket * +enet_packet_create (const void * data, size_t dataLength, enet_uint32 flags) +{ + ENetPacket * packet = (ENetPacket *) enet_malloc (sizeof (ENetPacket)); + if (packet == NULL) + return NULL; + + if (flags & ENET_PACKET_FLAG_NO_ALLOCATE) + packet -> data = (enet_uint8 *) data; + else + if (dataLength <= 0) + packet -> data = NULL; + else + { + packet -> data = (enet_uint8 *) enet_malloc (dataLength); + if (packet -> data == NULL) + { + enet_free (packet); + return NULL; + } + + if (data != NULL) + memcpy (packet -> data, data, dataLength); + } + + packet -> referenceCount = 0; + packet -> flags = flags; + packet -> dataLength = dataLength; + packet -> freeCallback = NULL; + packet -> userData = NULL; + + return packet; +} + +/** Destroys the packet and deallocates its data. + @param packet packet to be destroyed +*/ +void +enet_packet_destroy (ENetPacket * packet) +{ + if (packet == NULL) + return; + + if (packet -> freeCallback != NULL) + (* packet -> freeCallback) (packet); + if (! (packet -> flags & ENET_PACKET_FLAG_NO_ALLOCATE) && + packet -> data != NULL) + enet_free (packet -> data); + enet_free (packet); +} + +/** Attempts to resize the data in the packet to length specified in the + dataLength parameter + @param packet packet to resize + @param dataLength new size for the packet data + @returns 0 on success, < 0 on failure +*/ +int +enet_packet_resize (ENetPacket * packet, size_t dataLength) +{ + enet_uint8 * newData; + + if (dataLength <= packet -> dataLength || (packet -> flags & ENET_PACKET_FLAG_NO_ALLOCATE)) + { + packet -> dataLength = dataLength; + + return 0; + } + + newData = (enet_uint8 *) enet_malloc (dataLength); + if (newData == NULL) + return -1; + + memcpy (newData, packet -> data, packet -> dataLength); + enet_free (packet -> data); + + packet -> data = newData; + packet -> dataLength = dataLength; + + return 0; +} + +static const enet_uint32 crcTable [256] = +{ + 0, 0x77073096, 0xEE0E612C, 0x990951BA, 0x076DC419, 0x706AF48F, 0xE963A535, 0x9E6495A3, + 0x0EDB8832, 0x79DCB8A4, 0xE0D5E91E, 0x97D2D988, 0x09B64C2B, 0x7EB17CBD, 0xE7B82D07, 0x90BF1D91, + 0x1DB71064, 0x6AB020F2, 0xF3B97148, 0x84BE41DE, 0x1ADAD47D, 0x6DDDE4EB, 0xF4D4B551, 0x83D385C7, + 0x136C9856, 0x646BA8C0, 0xFD62F97A, 0x8A65C9EC, 0x14015C4F, 0x63066CD9, 0xFA0F3D63, 0x8D080DF5, + 0x3B6E20C8, 0x4C69105E, 0xD56041E4, 0xA2677172, 0x3C03E4D1, 0x4B04D447, 0xD20D85FD, 0xA50AB56B, + 0x35B5A8FA, 0x42B2986C, 0xDBBBC9D6, 0xACBCF940, 0x32D86CE3, 0x45DF5C75, 0xDCD60DCF, 0xABD13D59, + 0x26D930AC, 0x51DE003A, 0xC8D75180, 0xBFD06116, 0x21B4F4B5, 0x56B3C423, 0xCFBA9599, 0xB8BDA50F, + 0x2802B89E, 0x5F058808, 0xC60CD9B2, 0xB10BE924, 0x2F6F7C87, 0x58684C11, 0xC1611DAB, 0xB6662D3D, + 0x76DC4190, 0x01DB7106, 0x98D220BC, 0xEFD5102A, 0x71B18589, 0x06B6B51F, 0x9FBFE4A5, 0xE8B8D433, + 0x7807C9A2, 0x0F00F934, 0x9609A88E, 0xE10E9818, 0x7F6A0DBB, 0x086D3D2D, 0x91646C97, 0xE6635C01, + 0x6B6B51F4, 0x1C6C6162, 0x856530D8, 0xF262004E, 0x6C0695ED, 0x1B01A57B, 0x8208F4C1, 0xF50FC457, + 0x65B0D9C6, 0x12B7E950, 0x8BBEB8EA, 0xFCB9887C, 0x62DD1DDF, 0x15DA2D49, 0x8CD37CF3, 0xFBD44C65, + 0x4DB26158, 0x3AB551CE, 0xA3BC0074, 0xD4BB30E2, 0x4ADFA541, 0x3DD895D7, 0xA4D1C46D, 0xD3D6F4FB, + 0x4369E96A, 0x346ED9FC, 0xAD678846, 0xDA60B8D0, 0x44042D73, 0x33031DE5, 0xAA0A4C5F, 0xDD0D7CC9, + 0x5005713C, 0x270241AA, 0xBE0B1010, 0xC90C2086, 0x5768B525, 0x206F85B3, 0xB966D409, 0xCE61E49F, + 0x5EDEF90E, 0x29D9C998, 0xB0D09822, 0xC7D7A8B4, 0x59B33D17, 0x2EB40D81, 0xB7BD5C3B, 0xC0BA6CAD, + 0xEDB88320, 0x9ABFB3B6, 0x03B6E20C, 0x74B1D29A, 0xEAD54739, 0x9DD277AF, 0x04DB2615, 0x73DC1683, + 0xE3630B12, 0x94643B84, 0x0D6D6A3E, 0x7A6A5AA8, 0xE40ECF0B, 0x9309FF9D, 0x0A00AE27, 0x7D079EB1, + 0xF00F9344, 0x8708A3D2, 0x1E01F268, 0x6906C2FE, 0xF762575D, 0x806567CB, 0x196C3671, 0x6E6B06E7, + 0xFED41B76, 0x89D32BE0, 0x10DA7A5A, 0x67DD4ACC, 0xF9B9DF6F, 0x8EBEEFF9, 0x17B7BE43, 0x60B08ED5, + 0xD6D6A3E8, 0xA1D1937E, 0x38D8C2C4, 0x4FDFF252, 0xD1BB67F1, 0xA6BC5767, 0x3FB506DD, 0x48B2364B, + 0xD80D2BDA, 0xAF0A1B4C, 0x36034AF6, 0x41047A60, 0xDF60EFC3, 0xA867DF55, 0x316E8EEF, 0x4669BE79, + 0xCB61B38C, 0xBC66831A, 0x256FD2A0, 0x5268E236, 0xCC0C7795, 0xBB0B4703, 0x220216B9, 0x5505262F, + 0xC5BA3BBE, 0xB2BD0B28, 0x2BB45A92, 0x5CB36A04, 0xC2D7FFA7, 0xB5D0CF31, 0x2CD99E8B, 0x5BDEAE1D, + 0x9B64C2B0, 0xEC63F226, 0x756AA39C, 0x026D930A, 0x9C0906A9, 0xEB0E363F, 0x72076785, 0x5005713, + 0x95BF4A82, 0xE2B87A14, 0x7BB12BAE, 0x0CB61B38, 0x92D28E9B, 0xE5D5BE0D, 0x7CDCEFB7, 0xBDBDF21, + 0x86D3D2D4, 0xF1D4E242, 0x68DDB3F8, 0x1FDA836E, 0x81BE16CD, 0xF6B9265B, 0x6FB077E1, 0x18B74777, + 0x88085AE6, 0xFF0F6A70, 0x66063BCA, 0x11010B5C, 0x8F659EFF, 0xF862AE69, 0x616BFFD3, 0x166CCF45, + 0xA00AE278, 0xD70DD2EE, 0x4E048354, 0x3903B3C2, 0xA7672661, 0xD06016F7, 0x4969474D, 0x3E6E77DB, + 0xAED16A4A, 0xD9D65ADC, 0x40DF0B66, 0x37D83BF0, 0xA9BCAE53, 0xDEBB9EC5, 0x47B2CF7F, 0x30B5FFE9, + 0xBDBDF21C, 0xCABAC28A, 0x53B39330, 0x24B4A3A6, 0xBAD03605, 0xCDD70693, 0x54DE5729, 0x23D967BF, + 0xB3667A2E, 0xC4614AB8, 0x5D681B02, 0x2A6F2B94, 0xB40BBE37, 0xC30C8EA1, 0x5A05DF1B, 0x2D02EF8D +}; + +enet_uint32 +enet_crc32 (const ENetBuffer * buffers, size_t bufferCount) +{ + enet_uint32 crc = 0xFFFFFFFF; + + while (bufferCount -- > 0) + { + const enet_uint8 * data = (const enet_uint8 *) buffers -> data, + * dataEnd = & data [buffers -> dataLength]; + + while (data < dataEnd) + { + crc = (crc >> 8) ^ crcTable [(crc & 0xFF) ^ *data++]; + } + + ++ buffers; + } + + return ENET_HOST_TO_NET_32 (~ crc); +} + +/** @} */ diff --git a/thirdparty/enet/peer.c b/thirdparty/enet/peer.c new file mode 100644 index 0000000..a7ac012 --- /dev/null +++ b/thirdparty/enet/peer.c @@ -0,0 +1,1027 @@ +/** + @file peer.c + @brief ENet peer management functions +*/ +#include +#define ENET_BUILDING_LIB 1 +#include "enet/enet.h" + +/** @defgroup peer ENet peer functions + @{ +*/ + +/** Configures throttle parameter for a peer. + + Unreliable packets are dropped by ENet in response to the varying conditions + of the Internet connection to the peer. The throttle represents a probability + that an unreliable packet should not be dropped and thus sent by ENet to the peer. + The lowest mean round trip time from the sending of a reliable packet to the + receipt of its acknowledgement is measured over an amount of time specified by + the interval parameter in milliseconds. If a measured round trip time happens to + be significantly less than the mean round trip time measured over the interval, + then the throttle probability is increased to allow more traffic by an amount + specified in the acceleration parameter, which is a ratio to the ENET_PEER_PACKET_THROTTLE_SCALE + constant. If a measured round trip time happens to be significantly greater than + the mean round trip time measured over the interval, then the throttle probability + is decreased to limit traffic by an amount specified in the deceleration parameter, which + is a ratio to the ENET_PEER_PACKET_THROTTLE_SCALE constant. When the throttle has + a value of ENET_PEER_PACKET_THROTTLE_SCALE, no unreliable packets are dropped by + ENet, and so 100% of all unreliable packets will be sent. When the throttle has a + value of 0, all unreliable packets are dropped by ENet, and so 0% of all unreliable + packets will be sent. Intermediate values for the throttle represent intermediate + probabilities between 0% and 100% of unreliable packets being sent. The bandwidth + limits of the local and foreign hosts are taken into account to determine a + sensible limit for the throttle probability above which it should not raise even in + the best of conditions. + + @param peer peer to configure + @param interval interval, in milliseconds, over which to measure lowest mean RTT; the default value is ENET_PEER_PACKET_THROTTLE_INTERVAL. + @param acceleration rate at which to increase the throttle probability as mean RTT declines + @param deceleration rate at which to decrease the throttle probability as mean RTT increases +*/ +void +enet_peer_throttle_configure (ENetPeer * peer, enet_uint32 interval, enet_uint32 acceleration, enet_uint32 deceleration) +{ + ENetProtocol command; + + peer -> packetThrottleInterval = interval; + peer -> packetThrottleAcceleration = acceleration; + peer -> packetThrottleDeceleration = deceleration; + + command.header.command = ENET_PROTOCOL_COMMAND_THROTTLE_CONFIGURE | ENET_PROTOCOL_COMMAND_FLAG_ACKNOWLEDGE; + command.header.channelID = 0xFF; + + command.throttleConfigure.packetThrottleInterval = ENET_HOST_TO_NET_32 (interval); + command.throttleConfigure.packetThrottleAcceleration = ENET_HOST_TO_NET_32 (acceleration); + command.throttleConfigure.packetThrottleDeceleration = ENET_HOST_TO_NET_32 (deceleration); + + enet_peer_queue_outgoing_command (peer, & command, NULL, 0, 0); +} + +int +enet_peer_throttle (ENetPeer * peer, enet_uint32 rtt) +{ + if (peer -> lastRoundTripTime <= peer -> lastRoundTripTimeVariance) + { + peer -> packetThrottle = peer -> packetThrottleLimit; + } + else + if (rtt <= peer -> lastRoundTripTime) + { + peer -> packetThrottle += peer -> packetThrottleAcceleration; + + if (peer -> packetThrottle > peer -> packetThrottleLimit) + peer -> packetThrottle = peer -> packetThrottleLimit; + + return 1; + } + else + if (rtt > peer -> lastRoundTripTime + 2 * peer -> lastRoundTripTimeVariance) + { + if (peer -> packetThrottle > peer -> packetThrottleDeceleration) + peer -> packetThrottle -= peer -> packetThrottleDeceleration; + else + peer -> packetThrottle = 0; + + return -1; + } + + return 0; +} + +/** Queues a packet to be sent. + + On success, ENet will assume ownership of the packet, and so enet_packet_destroy + should not be called on it thereafter. On failure, the caller still must destroy + the packet on its own as ENet has not queued the packet. The caller can also + check the packet's referenceCount field after sending to check if ENet queued + the packet and thus incremented the referenceCount. + + @param peer destination for the packet + @param channelID channel on which to send + @param packet packet to send + @retval 0 on success + @retval < 0 on failure +*/ +int +enet_peer_send (ENetPeer * peer, enet_uint8 channelID, ENetPacket * packet) +{ + ENetChannel * channel; + ENetProtocol command; + size_t fragmentLength; + + if (peer -> state != ENET_PEER_STATE_CONNECTED || + channelID >= peer -> channelCount || + packet -> dataLength > peer -> host -> maximumPacketSize) + return -1; + + channel = & peer -> channels [channelID]; + fragmentLength = peer -> mtu - sizeof (ENetProtocolHeader) - sizeof (ENetProtocolSendFragment); + if (peer -> host -> checksum != NULL) + fragmentLength -= sizeof(enet_uint32); + + if (packet -> dataLength > fragmentLength) + { + enet_uint32 fragmentCount = (packet -> dataLength + fragmentLength - 1) / fragmentLength, + fragmentNumber, + fragmentOffset; + enet_uint8 commandNumber; + enet_uint16 startSequenceNumber; + ENetList fragments; + ENetOutgoingCommand * fragment; + + if (fragmentCount > ENET_PROTOCOL_MAXIMUM_FRAGMENT_COUNT) + return -1; + + if ((packet -> flags & (ENET_PACKET_FLAG_RELIABLE | ENET_PACKET_FLAG_UNRELIABLE_FRAGMENT)) == ENET_PACKET_FLAG_UNRELIABLE_FRAGMENT && + channel -> outgoingUnreliableSequenceNumber < 0xFFFF) + { + commandNumber = ENET_PROTOCOL_COMMAND_SEND_UNRELIABLE_FRAGMENT; + startSequenceNumber = ENET_HOST_TO_NET_16 (channel -> outgoingUnreliableSequenceNumber + 1); + } + else + { + commandNumber = ENET_PROTOCOL_COMMAND_SEND_FRAGMENT | ENET_PROTOCOL_COMMAND_FLAG_ACKNOWLEDGE; + startSequenceNumber = ENET_HOST_TO_NET_16 (channel -> outgoingReliableSequenceNumber + 1); + } + + enet_list_clear (& fragments); + + for (fragmentNumber = 0, + fragmentOffset = 0; + fragmentOffset < packet -> dataLength; + ++ fragmentNumber, + fragmentOffset += fragmentLength) + { + if (packet -> dataLength - fragmentOffset < fragmentLength) + fragmentLength = packet -> dataLength - fragmentOffset; + + fragment = (ENetOutgoingCommand *) enet_malloc (sizeof (ENetOutgoingCommand)); + if (fragment == NULL) + { + while (! enet_list_empty (& fragments)) + { + fragment = (ENetOutgoingCommand *) enet_list_remove (enet_list_begin (& fragments)); + + enet_free (fragment); + } + + return -1; + } + + fragment -> fragmentOffset = fragmentOffset; + fragment -> fragmentLength = fragmentLength; + fragment -> packet = packet; + fragment -> command.header.command = commandNumber; + fragment -> command.header.channelID = channelID; + fragment -> command.sendFragment.startSequenceNumber = startSequenceNumber; + fragment -> command.sendFragment.dataLength = ENET_HOST_TO_NET_16 (fragmentLength); + fragment -> command.sendFragment.fragmentCount = ENET_HOST_TO_NET_32 (fragmentCount); + fragment -> command.sendFragment.fragmentNumber = ENET_HOST_TO_NET_32 (fragmentNumber); + fragment -> command.sendFragment.totalLength = ENET_HOST_TO_NET_32 (packet -> dataLength); + fragment -> command.sendFragment.fragmentOffset = ENET_NET_TO_HOST_32 (fragmentOffset); + + enet_list_insert (enet_list_end (& fragments), fragment); + } + + packet -> referenceCount += fragmentNumber; + + while (! enet_list_empty (& fragments)) + { + fragment = (ENetOutgoingCommand *) enet_list_remove (enet_list_begin (& fragments)); + + enet_peer_setup_outgoing_command (peer, fragment); + } + + return 0; + } + + command.header.channelID = channelID; + + if ((packet -> flags & (ENET_PACKET_FLAG_RELIABLE | ENET_PACKET_FLAG_UNSEQUENCED)) == ENET_PACKET_FLAG_UNSEQUENCED) + { + command.header.command = ENET_PROTOCOL_COMMAND_SEND_UNSEQUENCED | ENET_PROTOCOL_COMMAND_FLAG_UNSEQUENCED; + command.sendUnsequenced.dataLength = ENET_HOST_TO_NET_16 (packet -> dataLength); + } + else + if (packet -> flags & ENET_PACKET_FLAG_RELIABLE || channel -> outgoingUnreliableSequenceNumber >= 0xFFFF) + { + command.header.command = ENET_PROTOCOL_COMMAND_SEND_RELIABLE | ENET_PROTOCOL_COMMAND_FLAG_ACKNOWLEDGE; + command.sendReliable.dataLength = ENET_HOST_TO_NET_16 (packet -> dataLength); + } + else + { + command.header.command = ENET_PROTOCOL_COMMAND_SEND_UNRELIABLE; + command.sendUnreliable.dataLength = ENET_HOST_TO_NET_16 (packet -> dataLength); + } + + if (enet_peer_queue_outgoing_command (peer, & command, packet, 0, packet -> dataLength) == NULL) + return -1; + + return 0; +} + +/** Attempts to dequeue any incoming queued packet. + @param peer peer to dequeue packets from + @param channelID holds the channel ID of the channel the packet was received on success + @returns a pointer to the packet, or NULL if there are no available incoming queued packets +*/ +ENetPacket * +enet_peer_receive (ENetPeer * peer, enet_uint8 * channelID) +{ + ENetIncomingCommand * incomingCommand; + ENetPacket * packet; + + if (enet_list_empty (& peer -> dispatchedCommands)) + return NULL; + + incomingCommand = (ENetIncomingCommand *) enet_list_remove (enet_list_begin (& peer -> dispatchedCommands)); + + if (channelID != NULL) + * channelID = incomingCommand -> command.header.channelID; + + packet = incomingCommand -> packet; + + -- packet -> referenceCount; + + if (incomingCommand -> fragments != NULL) + enet_free (incomingCommand -> fragments); + + enet_free (incomingCommand); + + peer -> totalWaitingData -= packet -> dataLength; + + return packet; +} + +static void +enet_peer_reset_outgoing_commands (ENetList * queue) +{ + ENetOutgoingCommand * outgoingCommand; + + while (! enet_list_empty (queue)) + { + outgoingCommand = (ENetOutgoingCommand *) enet_list_remove (enet_list_begin (queue)); + + if (outgoingCommand -> packet != NULL) + { + -- outgoingCommand -> packet -> referenceCount; + + if (outgoingCommand -> packet -> referenceCount == 0) + enet_packet_destroy (outgoingCommand -> packet); + } + + enet_free (outgoingCommand); + } +} + +static void +enet_peer_remove_incoming_commands (ENetList * queue, ENetListIterator startCommand, ENetListIterator endCommand, ENetIncomingCommand * excludeCommand) +{ + ENetListIterator currentCommand; + + for (currentCommand = startCommand; currentCommand != endCommand; ) + { + ENetIncomingCommand * incomingCommand = (ENetIncomingCommand *) currentCommand; + + currentCommand = enet_list_next (currentCommand); + + if (incomingCommand == excludeCommand) + continue; + + enet_list_remove (& incomingCommand -> incomingCommandList); + + if (incomingCommand -> packet != NULL) + { + -- incomingCommand -> packet -> referenceCount; + + if (incomingCommand -> packet -> referenceCount == 0) + enet_packet_destroy (incomingCommand -> packet); + } + + if (incomingCommand -> fragments != NULL) + enet_free (incomingCommand -> fragments); + + enet_free (incomingCommand); + } +} + +static void +enet_peer_reset_incoming_commands (ENetList * queue) +{ + enet_peer_remove_incoming_commands(queue, enet_list_begin (queue), enet_list_end (queue), NULL); +} + +void +enet_peer_reset_queues (ENetPeer * peer) +{ + ENetChannel * channel; + + if (peer -> flags & ENET_PEER_FLAG_NEEDS_DISPATCH) + { + enet_list_remove (& peer -> dispatchList); + + peer -> flags &= ~ ENET_PEER_FLAG_NEEDS_DISPATCH; + } + + while (! enet_list_empty (& peer -> acknowledgements)) + enet_free (enet_list_remove (enet_list_begin (& peer -> acknowledgements))); + + enet_peer_reset_outgoing_commands (& peer -> sentReliableCommands); + enet_peer_reset_outgoing_commands (& peer -> outgoingCommands); + enet_peer_reset_outgoing_commands (& peer -> outgoingSendReliableCommands); + enet_peer_reset_incoming_commands (& peer -> dispatchedCommands); + + if (peer -> channels != NULL && peer -> channelCount > 0) + { + for (channel = peer -> channels; + channel < & peer -> channels [peer -> channelCount]; + ++ channel) + { + enet_peer_reset_incoming_commands (& channel -> incomingReliableCommands); + enet_peer_reset_incoming_commands (& channel -> incomingUnreliableCommands); + } + + enet_free (peer -> channels); + } + + peer -> channels = NULL; + peer -> channelCount = 0; +} + +void +enet_peer_on_connect (ENetPeer * peer) +{ + if (peer -> state != ENET_PEER_STATE_CONNECTED && peer -> state != ENET_PEER_STATE_DISCONNECT_LATER) + { + if (peer -> incomingBandwidth != 0) + ++ peer -> host -> bandwidthLimitedPeers; + + ++ peer -> host -> connectedPeers; + } +} + +void +enet_peer_on_disconnect (ENetPeer * peer) +{ + if (peer -> state == ENET_PEER_STATE_CONNECTED || peer -> state == ENET_PEER_STATE_DISCONNECT_LATER) + { + if (peer -> incomingBandwidth != 0) + -- peer -> host -> bandwidthLimitedPeers; + + -- peer -> host -> connectedPeers; + } +} + +/** Forcefully disconnects a peer. + @param peer peer to forcefully disconnect + @remarks The foreign host represented by the peer is not notified of the disconnection and will timeout + on its connection to the local host. +*/ +void +enet_peer_reset (ENetPeer * peer) +{ + enet_peer_on_disconnect (peer); + + peer -> outgoingPeerID = ENET_PROTOCOL_MAXIMUM_PEER_ID; + peer -> connectID = 0; + + peer -> state = ENET_PEER_STATE_DISCONNECTED; + + peer -> incomingBandwidth = 0; + peer -> outgoingBandwidth = 0; + peer -> incomingBandwidthThrottleEpoch = 0; + peer -> outgoingBandwidthThrottleEpoch = 0; + peer -> incomingDataTotal = 0; + peer -> outgoingDataTotal = 0; + peer -> lastSendTime = 0; + peer -> lastReceiveTime = 0; + peer -> nextTimeout = 0; + peer -> earliestTimeout = 0; + peer -> packetLossEpoch = 0; + peer -> packetsSent = 0; + peer -> packetsLost = 0; + peer -> packetLoss = 0; + peer -> packetLossVariance = 0; + peer -> packetThrottle = ENET_PEER_DEFAULT_PACKET_THROTTLE; + peer -> packetThrottleLimit = ENET_PEER_PACKET_THROTTLE_SCALE; + peer -> packetThrottleCounter = 0; + peer -> packetThrottleEpoch = 0; + peer -> packetThrottleAcceleration = ENET_PEER_PACKET_THROTTLE_ACCELERATION; + peer -> packetThrottleDeceleration = ENET_PEER_PACKET_THROTTLE_DECELERATION; + peer -> packetThrottleInterval = ENET_PEER_PACKET_THROTTLE_INTERVAL; + peer -> pingInterval = ENET_PEER_PING_INTERVAL; + peer -> timeoutLimit = ENET_PEER_TIMEOUT_LIMIT; + peer -> timeoutMinimum = ENET_PEER_TIMEOUT_MINIMUM; + peer -> timeoutMaximum = ENET_PEER_TIMEOUT_MAXIMUM; + peer -> lastRoundTripTime = ENET_PEER_DEFAULT_ROUND_TRIP_TIME; + peer -> lowestRoundTripTime = ENET_PEER_DEFAULT_ROUND_TRIP_TIME; + peer -> lastRoundTripTimeVariance = 0; + peer -> highestRoundTripTimeVariance = 0; + peer -> roundTripTime = ENET_PEER_DEFAULT_ROUND_TRIP_TIME; + peer -> roundTripTimeVariance = 0; + peer -> mtu = peer -> host -> mtu; + peer -> reliableDataInTransit = 0; + peer -> outgoingReliableSequenceNumber = 0; + peer -> windowSize = ENET_PROTOCOL_MAXIMUM_WINDOW_SIZE; + peer -> incomingUnsequencedGroup = 0; + peer -> outgoingUnsequencedGroup = 0; + peer -> eventData = 0; + peer -> totalWaitingData = 0; + peer -> flags = 0; + + memset (peer -> unsequencedWindow, 0, sizeof (peer -> unsequencedWindow)); + + enet_peer_reset_queues (peer); +} + +/** Sends a ping request to a peer. + @param peer destination for the ping request + @remarks ping requests factor into the mean round trip time as designated by the + roundTripTime field in the ENetPeer structure. ENet automatically pings all connected + peers at regular intervals, however, this function may be called to ensure more + frequent ping requests. +*/ +void +enet_peer_ping (ENetPeer * peer) +{ + ENetProtocol command; + + if (peer -> state != ENET_PEER_STATE_CONNECTED) + return; + + command.header.command = ENET_PROTOCOL_COMMAND_PING | ENET_PROTOCOL_COMMAND_FLAG_ACKNOWLEDGE; + command.header.channelID = 0xFF; + + enet_peer_queue_outgoing_command (peer, & command, NULL, 0, 0); +} + +/** Sets the interval at which pings will be sent to a peer. + + Pings are used both to monitor the liveness of the connection and also to dynamically + adjust the throttle during periods of low traffic so that the throttle has reasonable + responsiveness during traffic spikes. + + @param peer the peer to adjust + @param pingInterval the interval at which to send pings; defaults to ENET_PEER_PING_INTERVAL if 0 +*/ +void +enet_peer_ping_interval (ENetPeer * peer, enet_uint32 pingInterval) +{ + peer -> pingInterval = pingInterval ? pingInterval : ENET_PEER_PING_INTERVAL; +} + +/** Sets the timeout parameters for a peer. + + The timeout parameter control how and when a peer will timeout from a failure to acknowledge + reliable traffic. Timeout values use an exponential backoff mechanism, where if a reliable + packet is not acknowledge within some multiple of the average RTT plus a variance tolerance, + the timeout will be doubled until it reaches a set limit. If the timeout is thus at this + limit and reliable packets have been sent but not acknowledged within a certain minimum time + period, the peer will be disconnected. Alternatively, if reliable packets have been sent + but not acknowledged for a certain maximum time period, the peer will be disconnected regardless + of the current timeout limit value. + + @param peer the peer to adjust + @param timeoutLimit the timeout limit; defaults to ENET_PEER_TIMEOUT_LIMIT if 0 + @param timeoutMinimum the timeout minimum; defaults to ENET_PEER_TIMEOUT_MINIMUM if 0 + @param timeoutMaximum the timeout maximum; defaults to ENET_PEER_TIMEOUT_MAXIMUM if 0 +*/ + +void +enet_peer_timeout (ENetPeer * peer, enet_uint32 timeoutLimit, enet_uint32 timeoutMinimum, enet_uint32 timeoutMaximum) +{ + peer -> timeoutLimit = timeoutLimit ? timeoutLimit : ENET_PEER_TIMEOUT_LIMIT; + peer -> timeoutMinimum = timeoutMinimum ? timeoutMinimum : ENET_PEER_TIMEOUT_MINIMUM; + peer -> timeoutMaximum = timeoutMaximum ? timeoutMaximum : ENET_PEER_TIMEOUT_MAXIMUM; +} + +/** Force an immediate disconnection from a peer. + @param peer peer to disconnect + @param data data describing the disconnection + @remarks No ENET_EVENT_DISCONNECT event will be generated. The foreign peer is not + guaranteed to receive the disconnect notification, and is reset immediately upon + return from this function. +*/ +void +enet_peer_disconnect_now (ENetPeer * peer, enet_uint32 data) +{ + ENetProtocol command; + + if (peer -> state == ENET_PEER_STATE_DISCONNECTED) + return; + + if (peer -> state != ENET_PEER_STATE_ZOMBIE && + peer -> state != ENET_PEER_STATE_DISCONNECTING) + { + enet_peer_reset_queues (peer); + + command.header.command = ENET_PROTOCOL_COMMAND_DISCONNECT | ENET_PROTOCOL_COMMAND_FLAG_UNSEQUENCED; + command.header.channelID = 0xFF; + command.disconnect.data = ENET_HOST_TO_NET_32 (data); + + enet_peer_queue_outgoing_command (peer, & command, NULL, 0, 0); + + enet_host_flush (peer -> host); + } + + enet_peer_reset (peer); +} + +/** Request a disconnection from a peer. + @param peer peer to request a disconnection + @param data data describing the disconnection + @remarks An ENET_EVENT_DISCONNECT event will be generated by enet_host_service() + once the disconnection is complete. +*/ +void +enet_peer_disconnect (ENetPeer * peer, enet_uint32 data) +{ + ENetProtocol command; + + if (peer -> state == ENET_PEER_STATE_DISCONNECTING || + peer -> state == ENET_PEER_STATE_DISCONNECTED || + peer -> state == ENET_PEER_STATE_ACKNOWLEDGING_DISCONNECT || + peer -> state == ENET_PEER_STATE_ZOMBIE) + return; + + enet_peer_reset_queues (peer); + + command.header.command = ENET_PROTOCOL_COMMAND_DISCONNECT; + command.header.channelID = 0xFF; + command.disconnect.data = ENET_HOST_TO_NET_32 (data); + + if (peer -> state == ENET_PEER_STATE_CONNECTED || peer -> state == ENET_PEER_STATE_DISCONNECT_LATER) + command.header.command |= ENET_PROTOCOL_COMMAND_FLAG_ACKNOWLEDGE; + else + command.header.command |= ENET_PROTOCOL_COMMAND_FLAG_UNSEQUENCED; + + enet_peer_queue_outgoing_command (peer, & command, NULL, 0, 0); + + if (peer -> state == ENET_PEER_STATE_CONNECTED || peer -> state == ENET_PEER_STATE_DISCONNECT_LATER) + { + enet_peer_on_disconnect (peer); + + peer -> state = ENET_PEER_STATE_DISCONNECTING; + } + else + { + enet_host_flush (peer -> host); + enet_peer_reset (peer); + } +} + +int +enet_peer_has_outgoing_commands (ENetPeer * peer) +{ + if (enet_list_empty (& peer -> outgoingCommands) && + enet_list_empty (& peer -> outgoingSendReliableCommands) && + enet_list_empty (& peer -> sentReliableCommands)) + return 0; + + return 1; +} + +/** Request a disconnection from a peer, but only after all queued outgoing packets are sent. + @param peer peer to request a disconnection + @param data data describing the disconnection + @remarks An ENET_EVENT_DISCONNECT event will be generated by enet_host_service() + once the disconnection is complete. +*/ +void +enet_peer_disconnect_later (ENetPeer * peer, enet_uint32 data) +{ + if ((peer -> state == ENET_PEER_STATE_CONNECTED || peer -> state == ENET_PEER_STATE_DISCONNECT_LATER) && + enet_peer_has_outgoing_commands (peer)) + { + peer -> state = ENET_PEER_STATE_DISCONNECT_LATER; + peer -> eventData = data; + } + else + enet_peer_disconnect (peer, data); +} + +ENetAcknowledgement * +enet_peer_queue_acknowledgement (ENetPeer * peer, const ENetProtocol * command, enet_uint16 sentTime) +{ + ENetAcknowledgement * acknowledgement; + + if (command -> header.channelID < peer -> channelCount) + { + ENetChannel * channel = & peer -> channels [command -> header.channelID]; + enet_uint16 reliableWindow = command -> header.reliableSequenceNumber / ENET_PEER_RELIABLE_WINDOW_SIZE, + currentWindow = channel -> incomingReliableSequenceNumber / ENET_PEER_RELIABLE_WINDOW_SIZE; + + if (command -> header.reliableSequenceNumber < channel -> incomingReliableSequenceNumber) + reliableWindow += ENET_PEER_RELIABLE_WINDOWS; + + if (reliableWindow >= currentWindow + ENET_PEER_FREE_RELIABLE_WINDOWS - 1 && reliableWindow <= currentWindow + ENET_PEER_FREE_RELIABLE_WINDOWS) + return NULL; + } + + acknowledgement = (ENetAcknowledgement *) enet_malloc (sizeof (ENetAcknowledgement)); + if (acknowledgement == NULL) + return NULL; + + peer -> outgoingDataTotal += sizeof (ENetProtocolAcknowledge); + + acknowledgement -> sentTime = sentTime; + acknowledgement -> command = * command; + + enet_list_insert (enet_list_end (& peer -> acknowledgements), acknowledgement); + + return acknowledgement; +} + +void +enet_peer_setup_outgoing_command (ENetPeer * peer, ENetOutgoingCommand * outgoingCommand) +{ + peer -> outgoingDataTotal += enet_protocol_command_size (outgoingCommand -> command.header.command) + outgoingCommand -> fragmentLength; + + if (outgoingCommand -> command.header.channelID == 0xFF) + { + ++ peer -> outgoingReliableSequenceNumber; + + outgoingCommand -> reliableSequenceNumber = peer -> outgoingReliableSequenceNumber; + outgoingCommand -> unreliableSequenceNumber = 0; + } + else + { + ENetChannel * channel = & peer -> channels [outgoingCommand -> command.header.channelID]; + + if (outgoingCommand -> command.header.command & ENET_PROTOCOL_COMMAND_FLAG_ACKNOWLEDGE) + { + ++ channel -> outgoingReliableSequenceNumber; + channel -> outgoingUnreliableSequenceNumber = 0; + + outgoingCommand -> reliableSequenceNumber = channel -> outgoingReliableSequenceNumber; + outgoingCommand -> unreliableSequenceNumber = 0; + } + else + if (outgoingCommand -> command.header.command & ENET_PROTOCOL_COMMAND_FLAG_UNSEQUENCED) + { + ++ peer -> outgoingUnsequencedGroup; + + outgoingCommand -> reliableSequenceNumber = 0; + outgoingCommand -> unreliableSequenceNumber = 0; + } + else + { + if (outgoingCommand -> fragmentOffset == 0) + ++ channel -> outgoingUnreliableSequenceNumber; + + outgoingCommand -> reliableSequenceNumber = channel -> outgoingReliableSequenceNumber; + outgoingCommand -> unreliableSequenceNumber = channel -> outgoingUnreliableSequenceNumber; + } + } + + outgoingCommand -> sendAttempts = 0; + outgoingCommand -> sentTime = 0; + outgoingCommand -> roundTripTimeout = 0; + outgoingCommand -> command.header.reliableSequenceNumber = ENET_HOST_TO_NET_16 (outgoingCommand -> reliableSequenceNumber); + outgoingCommand -> queueTime = ++ peer -> host -> totalQueued; + + switch (outgoingCommand -> command.header.command & ENET_PROTOCOL_COMMAND_MASK) + { + case ENET_PROTOCOL_COMMAND_SEND_UNRELIABLE: + outgoingCommand -> command.sendUnreliable.unreliableSequenceNumber = ENET_HOST_TO_NET_16 (outgoingCommand -> unreliableSequenceNumber); + break; + + case ENET_PROTOCOL_COMMAND_SEND_UNSEQUENCED: + outgoingCommand -> command.sendUnsequenced.unsequencedGroup = ENET_HOST_TO_NET_16 (peer -> outgoingUnsequencedGroup); + break; + + default: + break; + } + + if ((outgoingCommand -> command.header.command & ENET_PROTOCOL_COMMAND_FLAG_ACKNOWLEDGE) != 0 && + outgoingCommand -> packet != NULL) + enet_list_insert (enet_list_end (& peer -> outgoingSendReliableCommands), outgoingCommand); + else + enet_list_insert (enet_list_end (& peer -> outgoingCommands), outgoingCommand); +} + +ENetOutgoingCommand * +enet_peer_queue_outgoing_command (ENetPeer * peer, const ENetProtocol * command, ENetPacket * packet, enet_uint32 offset, enet_uint16 length) +{ + ENetOutgoingCommand * outgoingCommand = (ENetOutgoingCommand *) enet_malloc (sizeof (ENetOutgoingCommand)); + if (outgoingCommand == NULL) + return NULL; + + outgoingCommand -> command = * command; + outgoingCommand -> fragmentOffset = offset; + outgoingCommand -> fragmentLength = length; + outgoingCommand -> packet = packet; + if (packet != NULL) + ++ packet -> referenceCount; + + enet_peer_setup_outgoing_command (peer, outgoingCommand); + + return outgoingCommand; +} + +void +enet_peer_dispatch_incoming_unreliable_commands (ENetPeer * peer, ENetChannel * channel, ENetIncomingCommand * queuedCommand) +{ + ENetListIterator droppedCommand, startCommand, currentCommand; + + for (droppedCommand = startCommand = currentCommand = enet_list_begin (& channel -> incomingUnreliableCommands); + currentCommand != enet_list_end (& channel -> incomingUnreliableCommands); + currentCommand = enet_list_next (currentCommand)) + { + ENetIncomingCommand * incomingCommand = (ENetIncomingCommand *) currentCommand; + + if ((incomingCommand -> command.header.command & ENET_PROTOCOL_COMMAND_MASK) == ENET_PROTOCOL_COMMAND_SEND_UNSEQUENCED) + continue; + + if (incomingCommand -> reliableSequenceNumber == channel -> incomingReliableSequenceNumber) + { + if (incomingCommand -> fragmentsRemaining <= 0) + { + channel -> incomingUnreliableSequenceNumber = incomingCommand -> unreliableSequenceNumber; + continue; + } + + if (startCommand != currentCommand) + { + enet_list_move (enet_list_end (& peer -> dispatchedCommands), startCommand, enet_list_previous (currentCommand)); + + if (! (peer -> flags & ENET_PEER_FLAG_NEEDS_DISPATCH)) + { + enet_list_insert (enet_list_end (& peer -> host -> dispatchQueue), & peer -> dispatchList); + + peer -> flags |= ENET_PEER_FLAG_NEEDS_DISPATCH; + } + + droppedCommand = currentCommand; + } + else + if (droppedCommand != currentCommand) + droppedCommand = enet_list_previous (currentCommand); + } + else + { + enet_uint16 reliableWindow = incomingCommand -> reliableSequenceNumber / ENET_PEER_RELIABLE_WINDOW_SIZE, + currentWindow = channel -> incomingReliableSequenceNumber / ENET_PEER_RELIABLE_WINDOW_SIZE; + if (incomingCommand -> reliableSequenceNumber < channel -> incomingReliableSequenceNumber) + reliableWindow += ENET_PEER_RELIABLE_WINDOWS; + if (reliableWindow >= currentWindow && reliableWindow < currentWindow + ENET_PEER_FREE_RELIABLE_WINDOWS - 1) + break; + + droppedCommand = enet_list_next (currentCommand); + + if (startCommand != currentCommand) + { + enet_list_move (enet_list_end (& peer -> dispatchedCommands), startCommand, enet_list_previous (currentCommand)); + + if (! (peer -> flags & ENET_PEER_FLAG_NEEDS_DISPATCH)) + { + enet_list_insert (enet_list_end (& peer -> host -> dispatchQueue), & peer -> dispatchList); + + peer -> flags |= ENET_PEER_FLAG_NEEDS_DISPATCH; + } + } + } + + startCommand = enet_list_next (currentCommand); + } + + if (startCommand != currentCommand) + { + enet_list_move (enet_list_end (& peer -> dispatchedCommands), startCommand, enet_list_previous (currentCommand)); + + if (! (peer -> flags & ENET_PEER_FLAG_NEEDS_DISPATCH)) + { + enet_list_insert (enet_list_end (& peer -> host -> dispatchQueue), & peer -> dispatchList); + + peer -> flags |= ENET_PEER_FLAG_NEEDS_DISPATCH; + } + + droppedCommand = currentCommand; + } + + enet_peer_remove_incoming_commands (& channel -> incomingUnreliableCommands, enet_list_begin (& channel -> incomingUnreliableCommands), droppedCommand, queuedCommand); +} + +void +enet_peer_dispatch_incoming_reliable_commands (ENetPeer * peer, ENetChannel * channel, ENetIncomingCommand * queuedCommand) +{ + ENetListIterator currentCommand; + + for (currentCommand = enet_list_begin (& channel -> incomingReliableCommands); + currentCommand != enet_list_end (& channel -> incomingReliableCommands); + currentCommand = enet_list_next (currentCommand)) + { + ENetIncomingCommand * incomingCommand = (ENetIncomingCommand *) currentCommand; + + if (incomingCommand -> fragmentsRemaining > 0 || + incomingCommand -> reliableSequenceNumber != (enet_uint16) (channel -> incomingReliableSequenceNumber + 1)) + break; + + channel -> incomingReliableSequenceNumber = incomingCommand -> reliableSequenceNumber; + + if (incomingCommand -> fragmentCount > 0) + channel -> incomingReliableSequenceNumber += incomingCommand -> fragmentCount - 1; + } + + if (currentCommand == enet_list_begin (& channel -> incomingReliableCommands)) + return; + + channel -> incomingUnreliableSequenceNumber = 0; + + enet_list_move (enet_list_end (& peer -> dispatchedCommands), enet_list_begin (& channel -> incomingReliableCommands), enet_list_previous (currentCommand)); + + if (! (peer -> flags & ENET_PEER_FLAG_NEEDS_DISPATCH)) + { + enet_list_insert (enet_list_end (& peer -> host -> dispatchQueue), & peer -> dispatchList); + + peer -> flags |= ENET_PEER_FLAG_NEEDS_DISPATCH; + } + + if (! enet_list_empty (& channel -> incomingUnreliableCommands)) + enet_peer_dispatch_incoming_unreliable_commands (peer, channel, queuedCommand); +} + +ENetIncomingCommand * +enet_peer_queue_incoming_command (ENetPeer * peer, const ENetProtocol * command, const void * data, size_t dataLength, enet_uint32 flags, enet_uint32 fragmentCount) +{ + static ENetIncomingCommand dummyCommand; + + ENetChannel * channel = & peer -> channels [command -> header.channelID]; + enet_uint32 unreliableSequenceNumber = 0, reliableSequenceNumber = 0; + enet_uint16 reliableWindow, currentWindow; + ENetIncomingCommand * incomingCommand; + ENetListIterator currentCommand; + ENetPacket * packet = NULL; + + if (peer -> state == ENET_PEER_STATE_DISCONNECT_LATER) + goto discardCommand; + + if ((command -> header.command & ENET_PROTOCOL_COMMAND_MASK) != ENET_PROTOCOL_COMMAND_SEND_UNSEQUENCED) + { + reliableSequenceNumber = command -> header.reliableSequenceNumber; + reliableWindow = reliableSequenceNumber / ENET_PEER_RELIABLE_WINDOW_SIZE; + currentWindow = channel -> incomingReliableSequenceNumber / ENET_PEER_RELIABLE_WINDOW_SIZE; + + if (reliableSequenceNumber < channel -> incomingReliableSequenceNumber) + reliableWindow += ENET_PEER_RELIABLE_WINDOWS; + + if (reliableWindow < currentWindow || reliableWindow >= currentWindow + ENET_PEER_FREE_RELIABLE_WINDOWS - 1) + goto discardCommand; + } + + switch (command -> header.command & ENET_PROTOCOL_COMMAND_MASK) + { + case ENET_PROTOCOL_COMMAND_SEND_FRAGMENT: + case ENET_PROTOCOL_COMMAND_SEND_RELIABLE: + if (reliableSequenceNumber == channel -> incomingReliableSequenceNumber) + goto discardCommand; + + for (currentCommand = enet_list_previous (enet_list_end (& channel -> incomingReliableCommands)); + currentCommand != enet_list_end (& channel -> incomingReliableCommands); + currentCommand = enet_list_previous (currentCommand)) + { + incomingCommand = (ENetIncomingCommand *) currentCommand; + + if (reliableSequenceNumber >= channel -> incomingReliableSequenceNumber) + { + if (incomingCommand -> reliableSequenceNumber < channel -> incomingReliableSequenceNumber) + continue; + } + else + if (incomingCommand -> reliableSequenceNumber >= channel -> incomingReliableSequenceNumber) + break; + + if (incomingCommand -> reliableSequenceNumber <= reliableSequenceNumber) + { + if (incomingCommand -> reliableSequenceNumber < reliableSequenceNumber) + break; + + goto discardCommand; + } + } + break; + + case ENET_PROTOCOL_COMMAND_SEND_UNRELIABLE: + case ENET_PROTOCOL_COMMAND_SEND_UNRELIABLE_FRAGMENT: + unreliableSequenceNumber = ENET_NET_TO_HOST_16 (command -> sendUnreliable.unreliableSequenceNumber); + + if (reliableSequenceNumber == channel -> incomingReliableSequenceNumber && + unreliableSequenceNumber <= channel -> incomingUnreliableSequenceNumber) + goto discardCommand; + + for (currentCommand = enet_list_previous (enet_list_end (& channel -> incomingUnreliableCommands)); + currentCommand != enet_list_end (& channel -> incomingUnreliableCommands); + currentCommand = enet_list_previous (currentCommand)) + { + incomingCommand = (ENetIncomingCommand *) currentCommand; + + if ((command -> header.command & ENET_PROTOCOL_COMMAND_MASK) == ENET_PROTOCOL_COMMAND_SEND_UNSEQUENCED) + continue; + + if (reliableSequenceNumber >= channel -> incomingReliableSequenceNumber) + { + if (incomingCommand -> reliableSequenceNumber < channel -> incomingReliableSequenceNumber) + continue; + } + else + if (incomingCommand -> reliableSequenceNumber >= channel -> incomingReliableSequenceNumber) + break; + + if (incomingCommand -> reliableSequenceNumber < reliableSequenceNumber) + break; + + if (incomingCommand -> reliableSequenceNumber > reliableSequenceNumber) + continue; + + if (incomingCommand -> unreliableSequenceNumber <= unreliableSequenceNumber) + { + if (incomingCommand -> unreliableSequenceNumber < unreliableSequenceNumber) + break; + + goto discardCommand; + } + } + break; + + case ENET_PROTOCOL_COMMAND_SEND_UNSEQUENCED: + currentCommand = enet_list_end (& channel -> incomingUnreliableCommands); + break; + + default: + goto discardCommand; + } + + if (peer -> totalWaitingData >= peer -> host -> maximumWaitingData) + goto notifyError; + + packet = enet_packet_create (data, dataLength, flags); + if (packet == NULL) + goto notifyError; + + incomingCommand = (ENetIncomingCommand *) enet_malloc (sizeof (ENetIncomingCommand)); + if (incomingCommand == NULL) + goto notifyError; + + incomingCommand -> reliableSequenceNumber = command -> header.reliableSequenceNumber; + incomingCommand -> unreliableSequenceNumber = unreliableSequenceNumber & 0xFFFF; + incomingCommand -> command = * command; + incomingCommand -> fragmentCount = fragmentCount; + incomingCommand -> fragmentsRemaining = fragmentCount; + incomingCommand -> packet = packet; + incomingCommand -> fragments = NULL; + + if (fragmentCount > 0) + { + if (fragmentCount <= ENET_PROTOCOL_MAXIMUM_FRAGMENT_COUNT) + incomingCommand -> fragments = (enet_uint32 *) enet_malloc ((fragmentCount + 31) / 32 * sizeof (enet_uint32)); + if (incomingCommand -> fragments == NULL) + { + enet_free (incomingCommand); + + goto notifyError; + } + memset (incomingCommand -> fragments, 0, (fragmentCount + 31) / 32 * sizeof (enet_uint32)); + } + + if (packet != NULL) + { + ++ packet -> referenceCount; + + peer -> totalWaitingData += packet -> dataLength; + } + + enet_list_insert (enet_list_next (currentCommand), incomingCommand); + + switch (command -> header.command & ENET_PROTOCOL_COMMAND_MASK) + { + case ENET_PROTOCOL_COMMAND_SEND_FRAGMENT: + case ENET_PROTOCOL_COMMAND_SEND_RELIABLE: + enet_peer_dispatch_incoming_reliable_commands (peer, channel, incomingCommand); + break; + + default: + enet_peer_dispatch_incoming_unreliable_commands (peer, channel, incomingCommand); + break; + } + + return incomingCommand; + +discardCommand: + if (fragmentCount > 0) + goto notifyError; + + if (packet != NULL && packet -> referenceCount == 0) + enet_packet_destroy (packet); + + return & dummyCommand; + +notifyError: + if (packet != NULL && packet -> referenceCount == 0) + enet_packet_destroy (packet); + + return NULL; +} + +/** @} */ diff --git a/thirdparty/enet/premake4.lua b/thirdparty/enet/premake4.lua new file mode 100644 index 0000000..0e6e7ad --- /dev/null +++ b/thirdparty/enet/premake4.lua @@ -0,0 +1,59 @@ +solution "enet" + configurations { "Debug", "Release" } + platforms { "x32", "x64" } + + project "enet_static" + kind "StaticLib" + language "C" + + files { "*.c" } + + includedirs { "include/" } + + configuration "Debug" + targetsuffix "d" + + defines({ "DEBUG" }) + + flags { "Symbols" } + + configuration "Release" + defines({ "NDEBUG" }) + + flags { "Optimize" } + + configuration { "Debug", "x64" } + targetsuffix "64d" + + configuration { "Release", "x64" } + targetsuffix "64" + + project "enet" + kind "SharedLib" + language "C" + + files { "*.c" } + + includedirs { "include/" } + + defines({"ENET_DLL=1" }) + + configuration "Debug" + targetsuffix "d" + + defines({ "DEBUG" }) + + flags { "Symbols" } + + configuration "Release" + defines({ "NDEBUG" }) + + flags { "Optimize" } + + configuration { "Debug", "x64" } + targetsuffix "64d" + + configuration { "Release", "x64" } + targetsuffix "64" + + \ No newline at end of file diff --git a/thirdparty/enet/protocol.c b/thirdparty/enet/protocol.c new file mode 100644 index 0000000..843a719 --- /dev/null +++ b/thirdparty/enet/protocol.c @@ -0,0 +1,1919 @@ +/** + @file protocol.c + @brief ENet protocol functions +*/ +#include +#include +#define ENET_BUILDING_LIB 1 +#include "enet/utility.h" +#include "enet/time.h" +#include "enet/enet.h" + +static const size_t commandSizes [ENET_PROTOCOL_COMMAND_COUNT] = +{ + 0, + sizeof (ENetProtocolAcknowledge), + sizeof (ENetProtocolConnect), + sizeof (ENetProtocolVerifyConnect), + sizeof (ENetProtocolDisconnect), + sizeof (ENetProtocolPing), + sizeof (ENetProtocolSendReliable), + sizeof (ENetProtocolSendUnreliable), + sizeof (ENetProtocolSendFragment), + sizeof (ENetProtocolSendUnsequenced), + sizeof (ENetProtocolBandwidthLimit), + sizeof (ENetProtocolThrottleConfigure), + sizeof (ENetProtocolSendFragment) +}; + +size_t +enet_protocol_command_size (enet_uint8 commandNumber) +{ + return commandSizes [commandNumber & ENET_PROTOCOL_COMMAND_MASK]; +} + +static void +enet_protocol_change_state (ENetHost * host, ENetPeer * peer, ENetPeerState state) +{ + if (state == ENET_PEER_STATE_CONNECTED || state == ENET_PEER_STATE_DISCONNECT_LATER) + enet_peer_on_connect (peer); + else + enet_peer_on_disconnect (peer); + + peer -> state = state; +} + +static void +enet_protocol_dispatch_state (ENetHost * host, ENetPeer * peer, ENetPeerState state) +{ + enet_protocol_change_state (host, peer, state); + + if (! (peer -> flags & ENET_PEER_FLAG_NEEDS_DISPATCH)) + { + enet_list_insert (enet_list_end (& host -> dispatchQueue), & peer -> dispatchList); + + peer -> flags |= ENET_PEER_FLAG_NEEDS_DISPATCH; + } +} + +static int +enet_protocol_dispatch_incoming_commands (ENetHost * host, ENetEvent * event) +{ + while (! enet_list_empty (& host -> dispatchQueue)) + { + ENetPeer * peer = (ENetPeer *) enet_list_remove (enet_list_begin (& host -> dispatchQueue)); + + peer -> flags &= ~ ENET_PEER_FLAG_NEEDS_DISPATCH; + + switch (peer -> state) + { + case ENET_PEER_STATE_CONNECTION_PENDING: + case ENET_PEER_STATE_CONNECTION_SUCCEEDED: + enet_protocol_change_state (host, peer, ENET_PEER_STATE_CONNECTED); + + event -> type = ENET_EVENT_TYPE_CONNECT; + event -> peer = peer; + event -> data = peer -> eventData; + + return 1; + + case ENET_PEER_STATE_ZOMBIE: + host -> recalculateBandwidthLimits = 1; + + event -> type = ENET_EVENT_TYPE_DISCONNECT; + event -> peer = peer; + event -> data = peer -> eventData; + + enet_peer_reset (peer); + + return 1; + + case ENET_PEER_STATE_CONNECTED: + if (enet_list_empty (& peer -> dispatchedCommands)) + continue; + + event -> packet = enet_peer_receive (peer, & event -> channelID); + if (event -> packet == NULL) + continue; + + event -> type = ENET_EVENT_TYPE_RECEIVE; + event -> peer = peer; + + if (! enet_list_empty (& peer -> dispatchedCommands)) + { + peer -> flags |= ENET_PEER_FLAG_NEEDS_DISPATCH; + + enet_list_insert (enet_list_end (& host -> dispatchQueue), & peer -> dispatchList); + } + + return 1; + + default: + break; + } + } + + return 0; +} + +static void +enet_protocol_notify_connect (ENetHost * host, ENetPeer * peer, ENetEvent * event) +{ + host -> recalculateBandwidthLimits = 1; + + if (event != NULL) + { + enet_protocol_change_state (host, peer, ENET_PEER_STATE_CONNECTED); + + event -> type = ENET_EVENT_TYPE_CONNECT; + event -> peer = peer; + event -> data = peer -> eventData; + } + else + enet_protocol_dispatch_state (host, peer, peer -> state == ENET_PEER_STATE_CONNECTING ? ENET_PEER_STATE_CONNECTION_SUCCEEDED : ENET_PEER_STATE_CONNECTION_PENDING); +} + +static void +enet_protocol_notify_disconnect (ENetHost * host, ENetPeer * peer, ENetEvent * event) +{ + if (peer -> state >= ENET_PEER_STATE_CONNECTION_PENDING) + host -> recalculateBandwidthLimits = 1; + + if (peer -> state != ENET_PEER_STATE_CONNECTING && peer -> state < ENET_PEER_STATE_CONNECTION_SUCCEEDED) + enet_peer_reset (peer); + else + if (event != NULL) + { + event -> type = ENET_EVENT_TYPE_DISCONNECT; + event -> peer = peer; + event -> data = 0; + + enet_peer_reset (peer); + } + else + { + peer -> eventData = 0; + + enet_protocol_dispatch_state (host, peer, ENET_PEER_STATE_ZOMBIE); + } +} + +static void +enet_protocol_remove_sent_unreliable_commands (ENetPeer * peer, ENetList * sentUnreliableCommands) +{ + ENetOutgoingCommand * outgoingCommand; + + if (enet_list_empty (sentUnreliableCommands)) + return; + + do + { + outgoingCommand = (ENetOutgoingCommand *) enet_list_front (sentUnreliableCommands); + + enet_list_remove (& outgoingCommand -> outgoingCommandList); + + if (outgoingCommand -> packet != NULL) + { + -- outgoingCommand -> packet -> referenceCount; + + if (outgoingCommand -> packet -> referenceCount == 0) + { + outgoingCommand -> packet -> flags |= ENET_PACKET_FLAG_SENT; + + enet_packet_destroy (outgoingCommand -> packet); + } + } + + enet_free (outgoingCommand); + } while (! enet_list_empty (sentUnreliableCommands)); + + if (peer -> state == ENET_PEER_STATE_DISCONNECT_LATER && + ! enet_peer_has_outgoing_commands (peer)) + enet_peer_disconnect (peer, peer -> eventData); +} + +static ENetOutgoingCommand * +enet_protocol_find_sent_reliable_command (ENetList * list, enet_uint16 reliableSequenceNumber, enet_uint8 channelID) +{ + ENetListIterator currentCommand; + + for (currentCommand = enet_list_begin (list); + currentCommand != enet_list_end (list); + currentCommand = enet_list_next (currentCommand)) + { + ENetOutgoingCommand * outgoingCommand = (ENetOutgoingCommand *) currentCommand; + + if (! (outgoingCommand -> command.header.command & ENET_PROTOCOL_COMMAND_FLAG_ACKNOWLEDGE)) + continue; + + if (outgoingCommand -> sendAttempts < 1) + break; + + if (outgoingCommand -> reliableSequenceNumber == reliableSequenceNumber && + outgoingCommand -> command.header.channelID == channelID) + return outgoingCommand; + } + + return NULL; +} + +static ENetProtocolCommand +enet_protocol_remove_sent_reliable_command (ENetPeer * peer, enet_uint16 reliableSequenceNumber, enet_uint8 channelID) +{ + ENetOutgoingCommand * outgoingCommand = NULL; + ENetListIterator currentCommand; + ENetProtocolCommand commandNumber; + int wasSent = 1; + + for (currentCommand = enet_list_begin (& peer -> sentReliableCommands); + currentCommand != enet_list_end (& peer -> sentReliableCommands); + currentCommand = enet_list_next (currentCommand)) + { + outgoingCommand = (ENetOutgoingCommand *) currentCommand; + + if (outgoingCommand -> reliableSequenceNumber == reliableSequenceNumber && + outgoingCommand -> command.header.channelID == channelID) + break; + } + + if (currentCommand == enet_list_end (& peer -> sentReliableCommands)) + { + outgoingCommand = enet_protocol_find_sent_reliable_command (& peer -> outgoingCommands, reliableSequenceNumber, channelID); + if (outgoingCommand == NULL) + outgoingCommand = enet_protocol_find_sent_reliable_command (& peer -> outgoingSendReliableCommands, reliableSequenceNumber, channelID); + + wasSent = 0; + } + + if (outgoingCommand == NULL) + return ENET_PROTOCOL_COMMAND_NONE; + + if (channelID < peer -> channelCount) + { + ENetChannel * channel = & peer -> channels [channelID]; + enet_uint16 reliableWindow = reliableSequenceNumber / ENET_PEER_RELIABLE_WINDOW_SIZE; + if (channel -> reliableWindows [reliableWindow] > 0) + { + -- channel -> reliableWindows [reliableWindow]; + if (! channel -> reliableWindows [reliableWindow]) + channel -> usedReliableWindows &= ~ (1 << reliableWindow); + } + } + + commandNumber = (ENetProtocolCommand) (outgoingCommand -> command.header.command & ENET_PROTOCOL_COMMAND_MASK); + + enet_list_remove (& outgoingCommand -> outgoingCommandList); + + if (outgoingCommand -> packet != NULL) + { + if (wasSent) + peer -> reliableDataInTransit -= outgoingCommand -> fragmentLength; + + -- outgoingCommand -> packet -> referenceCount; + + if (outgoingCommand -> packet -> referenceCount == 0) + { + outgoingCommand -> packet -> flags |= ENET_PACKET_FLAG_SENT; + + enet_packet_destroy (outgoingCommand -> packet); + } + } + + enet_free (outgoingCommand); + + if (enet_list_empty (& peer -> sentReliableCommands)) + return commandNumber; + + outgoingCommand = (ENetOutgoingCommand *) enet_list_front (& peer -> sentReliableCommands); + + peer -> nextTimeout = outgoingCommand -> sentTime + outgoingCommand -> roundTripTimeout; + + return commandNumber; +} + +static ENetPeer * +enet_protocol_handle_connect (ENetHost * host, ENetProtocolHeader * header, ENetProtocol * command) +{ + enet_uint8 incomingSessionID, outgoingSessionID; + enet_uint32 mtu, windowSize; + ENetChannel * channel; + size_t channelCount, duplicatePeers = 0; + ENetPeer * currentPeer, * peer = NULL; + ENetProtocol verifyCommand; + + channelCount = ENET_NET_TO_HOST_32 (command -> connect.channelCount); + + if (channelCount < ENET_PROTOCOL_MINIMUM_CHANNEL_COUNT || + channelCount > ENET_PROTOCOL_MAXIMUM_CHANNEL_COUNT) + return NULL; + + for (currentPeer = host -> peers; + currentPeer < & host -> peers [host -> peerCount]; + ++ currentPeer) + { + if (currentPeer -> state == ENET_PEER_STATE_DISCONNECTED) + { + if (peer == NULL) + peer = currentPeer; + } + else + if (currentPeer -> state != ENET_PEER_STATE_CONNECTING && + currentPeer -> address.host == host -> receivedAddress.host) + { + if (currentPeer -> address.port == host -> receivedAddress.port && + currentPeer -> connectID == command -> connect.connectID) + return NULL; + + ++ duplicatePeers; + } + } + + if (peer == NULL || duplicatePeers >= host -> duplicatePeers) + return NULL; + + if (channelCount > host -> channelLimit) + channelCount = host -> channelLimit; + peer -> channels = (ENetChannel *) enet_malloc (channelCount * sizeof (ENetChannel)); + if (peer -> channels == NULL) + return NULL; + peer -> channelCount = channelCount; + peer -> state = ENET_PEER_STATE_ACKNOWLEDGING_CONNECT; + peer -> connectID = command -> connect.connectID; + peer -> address = host -> receivedAddress; + peer -> mtu = host -> mtu; + peer -> outgoingPeerID = ENET_NET_TO_HOST_16 (command -> connect.outgoingPeerID); + peer -> incomingBandwidth = ENET_NET_TO_HOST_32 (command -> connect.incomingBandwidth); + peer -> outgoingBandwidth = ENET_NET_TO_HOST_32 (command -> connect.outgoingBandwidth); + peer -> packetThrottleInterval = ENET_NET_TO_HOST_32 (command -> connect.packetThrottleInterval); + peer -> packetThrottleAcceleration = ENET_NET_TO_HOST_32 (command -> connect.packetThrottleAcceleration); + peer -> packetThrottleDeceleration = ENET_NET_TO_HOST_32 (command -> connect.packetThrottleDeceleration); + peer -> eventData = ENET_NET_TO_HOST_32 (command -> connect.data); + + incomingSessionID = command -> connect.incomingSessionID == 0xFF ? peer -> outgoingSessionID : command -> connect.incomingSessionID; + incomingSessionID = (incomingSessionID + 1) & (ENET_PROTOCOL_HEADER_SESSION_MASK >> ENET_PROTOCOL_HEADER_SESSION_SHIFT); + if (incomingSessionID == peer -> outgoingSessionID) + incomingSessionID = (incomingSessionID + 1) & (ENET_PROTOCOL_HEADER_SESSION_MASK >> ENET_PROTOCOL_HEADER_SESSION_SHIFT); + peer -> outgoingSessionID = incomingSessionID; + + outgoingSessionID = command -> connect.outgoingSessionID == 0xFF ? peer -> incomingSessionID : command -> connect.outgoingSessionID; + outgoingSessionID = (outgoingSessionID + 1) & (ENET_PROTOCOL_HEADER_SESSION_MASK >> ENET_PROTOCOL_HEADER_SESSION_SHIFT); + if (outgoingSessionID == peer -> incomingSessionID) + outgoingSessionID = (outgoingSessionID + 1) & (ENET_PROTOCOL_HEADER_SESSION_MASK >> ENET_PROTOCOL_HEADER_SESSION_SHIFT); + peer -> incomingSessionID = outgoingSessionID; + + for (channel = peer -> channels; + channel < & peer -> channels [channelCount]; + ++ channel) + { + channel -> outgoingReliableSequenceNumber = 0; + channel -> outgoingUnreliableSequenceNumber = 0; + channel -> incomingReliableSequenceNumber = 0; + channel -> incomingUnreliableSequenceNumber = 0; + + enet_list_clear (& channel -> incomingReliableCommands); + enet_list_clear (& channel -> incomingUnreliableCommands); + + channel -> usedReliableWindows = 0; + memset (channel -> reliableWindows, 0, sizeof (channel -> reliableWindows)); + } + + mtu = ENET_NET_TO_HOST_32 (command -> connect.mtu); + + if (mtu < ENET_PROTOCOL_MINIMUM_MTU) + mtu = ENET_PROTOCOL_MINIMUM_MTU; + else + if (mtu > ENET_PROTOCOL_MAXIMUM_MTU) + mtu = ENET_PROTOCOL_MAXIMUM_MTU; + + if (mtu < peer -> mtu) + peer -> mtu = mtu; + + if (host -> outgoingBandwidth == 0 && + peer -> incomingBandwidth == 0) + peer -> windowSize = ENET_PROTOCOL_MAXIMUM_WINDOW_SIZE; + else + if (host -> outgoingBandwidth == 0 || + peer -> incomingBandwidth == 0) + peer -> windowSize = (ENET_MAX (host -> outgoingBandwidth, peer -> incomingBandwidth) / + ENET_PEER_WINDOW_SIZE_SCALE) * + ENET_PROTOCOL_MINIMUM_WINDOW_SIZE; + else + peer -> windowSize = (ENET_MIN (host -> outgoingBandwidth, peer -> incomingBandwidth) / + ENET_PEER_WINDOW_SIZE_SCALE) * + ENET_PROTOCOL_MINIMUM_WINDOW_SIZE; + + if (peer -> windowSize < ENET_PROTOCOL_MINIMUM_WINDOW_SIZE) + peer -> windowSize = ENET_PROTOCOL_MINIMUM_WINDOW_SIZE; + else + if (peer -> windowSize > ENET_PROTOCOL_MAXIMUM_WINDOW_SIZE) + peer -> windowSize = ENET_PROTOCOL_MAXIMUM_WINDOW_SIZE; + + if (host -> incomingBandwidth == 0) + windowSize = ENET_PROTOCOL_MAXIMUM_WINDOW_SIZE; + else + windowSize = (host -> incomingBandwidth / ENET_PEER_WINDOW_SIZE_SCALE) * + ENET_PROTOCOL_MINIMUM_WINDOW_SIZE; + + if (windowSize > ENET_NET_TO_HOST_32 (command -> connect.windowSize)) + windowSize = ENET_NET_TO_HOST_32 (command -> connect.windowSize); + + if (windowSize < ENET_PROTOCOL_MINIMUM_WINDOW_SIZE) + windowSize = ENET_PROTOCOL_MINIMUM_WINDOW_SIZE; + else + if (windowSize > ENET_PROTOCOL_MAXIMUM_WINDOW_SIZE) + windowSize = ENET_PROTOCOL_MAXIMUM_WINDOW_SIZE; + + verifyCommand.header.command = ENET_PROTOCOL_COMMAND_VERIFY_CONNECT | ENET_PROTOCOL_COMMAND_FLAG_ACKNOWLEDGE; + verifyCommand.header.channelID = 0xFF; + verifyCommand.verifyConnect.outgoingPeerID = ENET_HOST_TO_NET_16 (peer -> incomingPeerID); + verifyCommand.verifyConnect.incomingSessionID = incomingSessionID; + verifyCommand.verifyConnect.outgoingSessionID = outgoingSessionID; + verifyCommand.verifyConnect.mtu = ENET_HOST_TO_NET_32 (peer -> mtu); + verifyCommand.verifyConnect.windowSize = ENET_HOST_TO_NET_32 (windowSize); + verifyCommand.verifyConnect.channelCount = ENET_HOST_TO_NET_32 (channelCount); + verifyCommand.verifyConnect.incomingBandwidth = ENET_HOST_TO_NET_32 (host -> incomingBandwidth); + verifyCommand.verifyConnect.outgoingBandwidth = ENET_HOST_TO_NET_32 (host -> outgoingBandwidth); + verifyCommand.verifyConnect.packetThrottleInterval = ENET_HOST_TO_NET_32 (peer -> packetThrottleInterval); + verifyCommand.verifyConnect.packetThrottleAcceleration = ENET_HOST_TO_NET_32 (peer -> packetThrottleAcceleration); + verifyCommand.verifyConnect.packetThrottleDeceleration = ENET_HOST_TO_NET_32 (peer -> packetThrottleDeceleration); + verifyCommand.verifyConnect.connectID = peer -> connectID; + + enet_peer_queue_outgoing_command (peer, & verifyCommand, NULL, 0, 0); + + return peer; +} + +static int +enet_protocol_handle_send_reliable (ENetHost * host, ENetPeer * peer, const ENetProtocol * command, enet_uint8 ** currentData) +{ + size_t dataLength; + + if (command -> header.channelID >= peer -> channelCount || + (peer -> state != ENET_PEER_STATE_CONNECTED && peer -> state != ENET_PEER_STATE_DISCONNECT_LATER)) + return -1; + + dataLength = ENET_NET_TO_HOST_16 (command -> sendReliable.dataLength); + * currentData += dataLength; + if (dataLength > host -> maximumPacketSize || + * currentData < host -> receivedData || + * currentData > & host -> receivedData [host -> receivedDataLength]) + return -1; + + if (enet_peer_queue_incoming_command (peer, command, (const enet_uint8 *) command + sizeof (ENetProtocolSendReliable), dataLength, ENET_PACKET_FLAG_RELIABLE, 0) == NULL) + return -1; + + return 0; +} + +static int +enet_protocol_handle_send_unsequenced (ENetHost * host, ENetPeer * peer, const ENetProtocol * command, enet_uint8 ** currentData) +{ + enet_uint32 unsequencedGroup, index; + size_t dataLength; + + if (command -> header.channelID >= peer -> channelCount || + (peer -> state != ENET_PEER_STATE_CONNECTED && peer -> state != ENET_PEER_STATE_DISCONNECT_LATER)) + return -1; + + dataLength = ENET_NET_TO_HOST_16 (command -> sendUnsequenced.dataLength); + * currentData += dataLength; + if (dataLength > host -> maximumPacketSize || + * currentData < host -> receivedData || + * currentData > & host -> receivedData [host -> receivedDataLength]) + return -1; + + unsequencedGroup = ENET_NET_TO_HOST_16 (command -> sendUnsequenced.unsequencedGroup); + index = unsequencedGroup % ENET_PEER_UNSEQUENCED_WINDOW_SIZE; + + if (unsequencedGroup < peer -> incomingUnsequencedGroup) + unsequencedGroup += 0x10000; + + if (unsequencedGroup >= (enet_uint32) peer -> incomingUnsequencedGroup + ENET_PEER_FREE_UNSEQUENCED_WINDOWS * ENET_PEER_UNSEQUENCED_WINDOW_SIZE) + return 0; + + unsequencedGroup &= 0xFFFF; + + if (unsequencedGroup - index != peer -> incomingUnsequencedGroup) + { + peer -> incomingUnsequencedGroup = unsequencedGroup - index; + + memset (peer -> unsequencedWindow, 0, sizeof (peer -> unsequencedWindow)); + } + else + if (peer -> unsequencedWindow [index / 32] & (1 << (index % 32))) + return 0; + + if (enet_peer_queue_incoming_command (peer, command, (const enet_uint8 *) command + sizeof (ENetProtocolSendUnsequenced), dataLength, ENET_PACKET_FLAG_UNSEQUENCED, 0) == NULL) + return -1; + + peer -> unsequencedWindow [index / 32] |= 1 << (index % 32); + + return 0; +} + +static int +enet_protocol_handle_send_unreliable (ENetHost * host, ENetPeer * peer, const ENetProtocol * command, enet_uint8 ** currentData) +{ + size_t dataLength; + + if (command -> header.channelID >= peer -> channelCount || + (peer -> state != ENET_PEER_STATE_CONNECTED && peer -> state != ENET_PEER_STATE_DISCONNECT_LATER)) + return -1; + + dataLength = ENET_NET_TO_HOST_16 (command -> sendUnreliable.dataLength); + * currentData += dataLength; + if (dataLength > host -> maximumPacketSize || + * currentData < host -> receivedData || + * currentData > & host -> receivedData [host -> receivedDataLength]) + return -1; + + if (enet_peer_queue_incoming_command (peer, command, (const enet_uint8 *) command + sizeof (ENetProtocolSendUnreliable), dataLength, 0, 0) == NULL) + return -1; + + return 0; +} + +static int +enet_protocol_handle_send_fragment (ENetHost * host, ENetPeer * peer, const ENetProtocol * command, enet_uint8 ** currentData) +{ + enet_uint32 fragmentNumber, + fragmentCount, + fragmentOffset, + fragmentLength, + startSequenceNumber, + totalLength; + ENetChannel * channel; + enet_uint16 startWindow, currentWindow; + ENetListIterator currentCommand; + ENetIncomingCommand * startCommand = NULL; + + if (command -> header.channelID >= peer -> channelCount || + (peer -> state != ENET_PEER_STATE_CONNECTED && peer -> state != ENET_PEER_STATE_DISCONNECT_LATER)) + return -1; + + fragmentLength = ENET_NET_TO_HOST_16 (command -> sendFragment.dataLength); + * currentData += fragmentLength; + if (fragmentLength <= 0 || + fragmentLength > host -> maximumPacketSize || + * currentData < host -> receivedData || + * currentData > & host -> receivedData [host -> receivedDataLength]) + return -1; + + channel = & peer -> channels [command -> header.channelID]; + startSequenceNumber = ENET_NET_TO_HOST_16 (command -> sendFragment.startSequenceNumber); + startWindow = startSequenceNumber / ENET_PEER_RELIABLE_WINDOW_SIZE; + currentWindow = channel -> incomingReliableSequenceNumber / ENET_PEER_RELIABLE_WINDOW_SIZE; + + if (startSequenceNumber < channel -> incomingReliableSequenceNumber) + startWindow += ENET_PEER_RELIABLE_WINDOWS; + + if (startWindow < currentWindow || startWindow >= currentWindow + ENET_PEER_FREE_RELIABLE_WINDOWS - 1) + return 0; + + fragmentNumber = ENET_NET_TO_HOST_32 (command -> sendFragment.fragmentNumber); + fragmentCount = ENET_NET_TO_HOST_32 (command -> sendFragment.fragmentCount); + fragmentOffset = ENET_NET_TO_HOST_32 (command -> sendFragment.fragmentOffset); + totalLength = ENET_NET_TO_HOST_32 (command -> sendFragment.totalLength); + + if (fragmentCount > ENET_PROTOCOL_MAXIMUM_FRAGMENT_COUNT || + fragmentNumber >= fragmentCount || + totalLength > host -> maximumPacketSize || + totalLength < fragmentCount || + fragmentOffset >= totalLength || + fragmentLength > totalLength - fragmentOffset) + return -1; + + for (currentCommand = enet_list_previous (enet_list_end (& channel -> incomingReliableCommands)); + currentCommand != enet_list_end (& channel -> incomingReliableCommands); + currentCommand = enet_list_previous (currentCommand)) + { + ENetIncomingCommand * incomingCommand = (ENetIncomingCommand *) currentCommand; + + if (startSequenceNumber >= channel -> incomingReliableSequenceNumber) + { + if (incomingCommand -> reliableSequenceNumber < channel -> incomingReliableSequenceNumber) + continue; + } + else + if (incomingCommand -> reliableSequenceNumber >= channel -> incomingReliableSequenceNumber) + break; + + if (incomingCommand -> reliableSequenceNumber <= startSequenceNumber) + { + if (incomingCommand -> reliableSequenceNumber < startSequenceNumber) + break; + + if ((incomingCommand -> command.header.command & ENET_PROTOCOL_COMMAND_MASK) != ENET_PROTOCOL_COMMAND_SEND_FRAGMENT || + totalLength != incomingCommand -> packet -> dataLength || + fragmentCount != incomingCommand -> fragmentCount) + return -1; + + startCommand = incomingCommand; + break; + } + } + + if (startCommand == NULL) + { + ENetProtocol hostCommand = * command; + + hostCommand.header.reliableSequenceNumber = startSequenceNumber; + + startCommand = enet_peer_queue_incoming_command (peer, & hostCommand, NULL, totalLength, ENET_PACKET_FLAG_RELIABLE, fragmentCount); + if (startCommand == NULL) + return -1; + } + + if ((startCommand -> fragments [fragmentNumber / 32] & (1 << (fragmentNumber % 32))) == 0) + { + -- startCommand -> fragmentsRemaining; + + startCommand -> fragments [fragmentNumber / 32] |= (1 << (fragmentNumber % 32)); + + if (fragmentOffset + fragmentLength > startCommand -> packet -> dataLength) + fragmentLength = startCommand -> packet -> dataLength - fragmentOffset; + + memcpy (startCommand -> packet -> data + fragmentOffset, + (enet_uint8 *) command + sizeof (ENetProtocolSendFragment), + fragmentLength); + + if (startCommand -> fragmentsRemaining <= 0) + enet_peer_dispatch_incoming_reliable_commands (peer, channel, NULL); + } + + return 0; +} + +static int +enet_protocol_handle_send_unreliable_fragment (ENetHost * host, ENetPeer * peer, const ENetProtocol * command, enet_uint8 ** currentData) +{ + enet_uint32 fragmentNumber, + fragmentCount, + fragmentOffset, + fragmentLength, + reliableSequenceNumber, + startSequenceNumber, + totalLength; + enet_uint16 reliableWindow, currentWindow; + ENetChannel * channel; + ENetListIterator currentCommand; + ENetIncomingCommand * startCommand = NULL; + + if (command -> header.channelID >= peer -> channelCount || + (peer -> state != ENET_PEER_STATE_CONNECTED && peer -> state != ENET_PEER_STATE_DISCONNECT_LATER)) + return -1; + + fragmentLength = ENET_NET_TO_HOST_16 (command -> sendFragment.dataLength); + * currentData += fragmentLength; + if (fragmentLength > host -> maximumPacketSize || + * currentData < host -> receivedData || + * currentData > & host -> receivedData [host -> receivedDataLength]) + return -1; + + channel = & peer -> channels [command -> header.channelID]; + reliableSequenceNumber = command -> header.reliableSequenceNumber; + startSequenceNumber = ENET_NET_TO_HOST_16 (command -> sendFragment.startSequenceNumber); + + reliableWindow = reliableSequenceNumber / ENET_PEER_RELIABLE_WINDOW_SIZE; + currentWindow = channel -> incomingReliableSequenceNumber / ENET_PEER_RELIABLE_WINDOW_SIZE; + + if (reliableSequenceNumber < channel -> incomingReliableSequenceNumber) + reliableWindow += ENET_PEER_RELIABLE_WINDOWS; + + if (reliableWindow < currentWindow || reliableWindow >= currentWindow + ENET_PEER_FREE_RELIABLE_WINDOWS - 1) + return 0; + + if (reliableSequenceNumber == channel -> incomingReliableSequenceNumber && + startSequenceNumber <= channel -> incomingUnreliableSequenceNumber) + return 0; + + fragmentNumber = ENET_NET_TO_HOST_32 (command -> sendFragment.fragmentNumber); + fragmentCount = ENET_NET_TO_HOST_32 (command -> sendFragment.fragmentCount); + fragmentOffset = ENET_NET_TO_HOST_32 (command -> sendFragment.fragmentOffset); + totalLength = ENET_NET_TO_HOST_32 (command -> sendFragment.totalLength); + + if (fragmentCount > ENET_PROTOCOL_MAXIMUM_FRAGMENT_COUNT || + fragmentNumber >= fragmentCount || + totalLength > host -> maximumPacketSize || + fragmentOffset >= totalLength || + fragmentLength > totalLength - fragmentOffset) + return -1; + + for (currentCommand = enet_list_previous (enet_list_end (& channel -> incomingUnreliableCommands)); + currentCommand != enet_list_end (& channel -> incomingUnreliableCommands); + currentCommand = enet_list_previous (currentCommand)) + { + ENetIncomingCommand * incomingCommand = (ENetIncomingCommand *) currentCommand; + + if (reliableSequenceNumber >= channel -> incomingReliableSequenceNumber) + { + if (incomingCommand -> reliableSequenceNumber < channel -> incomingReliableSequenceNumber) + continue; + } + else + if (incomingCommand -> reliableSequenceNumber >= channel -> incomingReliableSequenceNumber) + break; + + if (incomingCommand -> reliableSequenceNumber < reliableSequenceNumber) + break; + + if (incomingCommand -> reliableSequenceNumber > reliableSequenceNumber) + continue; + + if (incomingCommand -> unreliableSequenceNumber <= startSequenceNumber) + { + if (incomingCommand -> unreliableSequenceNumber < startSequenceNumber) + break; + + if ((incomingCommand -> command.header.command & ENET_PROTOCOL_COMMAND_MASK) != ENET_PROTOCOL_COMMAND_SEND_UNRELIABLE_FRAGMENT || + totalLength != incomingCommand -> packet -> dataLength || + fragmentCount != incomingCommand -> fragmentCount) + return -1; + + startCommand = incomingCommand; + break; + } + } + + if (startCommand == NULL) + { + startCommand = enet_peer_queue_incoming_command (peer, command, NULL, totalLength, ENET_PACKET_FLAG_UNRELIABLE_FRAGMENT, fragmentCount); + if (startCommand == NULL) + return -1; + } + + if ((startCommand -> fragments [fragmentNumber / 32] & (1 << (fragmentNumber % 32))) == 0) + { + -- startCommand -> fragmentsRemaining; + + startCommand -> fragments [fragmentNumber / 32] |= (1 << (fragmentNumber % 32)); + + if (fragmentOffset + fragmentLength > startCommand -> packet -> dataLength) + fragmentLength = startCommand -> packet -> dataLength - fragmentOffset; + + memcpy (startCommand -> packet -> data + fragmentOffset, + (enet_uint8 *) command + sizeof (ENetProtocolSendFragment), + fragmentLength); + + if (startCommand -> fragmentsRemaining <= 0) + enet_peer_dispatch_incoming_unreliable_commands (peer, channel, NULL); + } + + return 0; +} + +static int +enet_protocol_handle_ping (ENetHost * host, ENetPeer * peer, const ENetProtocol * command) +{ + if (peer -> state != ENET_PEER_STATE_CONNECTED && peer -> state != ENET_PEER_STATE_DISCONNECT_LATER) + return -1; + + return 0; +} + +static int +enet_protocol_handle_bandwidth_limit (ENetHost * host, ENetPeer * peer, const ENetProtocol * command) +{ + if (peer -> state != ENET_PEER_STATE_CONNECTED && peer -> state != ENET_PEER_STATE_DISCONNECT_LATER) + return -1; + + if (peer -> incomingBandwidth != 0) + -- host -> bandwidthLimitedPeers; + + peer -> incomingBandwidth = ENET_NET_TO_HOST_32 (command -> bandwidthLimit.incomingBandwidth); + peer -> outgoingBandwidth = ENET_NET_TO_HOST_32 (command -> bandwidthLimit.outgoingBandwidth); + + if (peer -> incomingBandwidth != 0) + ++ host -> bandwidthLimitedPeers; + + if (peer -> incomingBandwidth == 0 && host -> outgoingBandwidth == 0) + peer -> windowSize = ENET_PROTOCOL_MAXIMUM_WINDOW_SIZE; + else + if (peer -> incomingBandwidth == 0 || host -> outgoingBandwidth == 0) + peer -> windowSize = (ENET_MAX (peer -> incomingBandwidth, host -> outgoingBandwidth) / + ENET_PEER_WINDOW_SIZE_SCALE) * ENET_PROTOCOL_MINIMUM_WINDOW_SIZE; + else + peer -> windowSize = (ENET_MIN (peer -> incomingBandwidth, host -> outgoingBandwidth) / + ENET_PEER_WINDOW_SIZE_SCALE) * ENET_PROTOCOL_MINIMUM_WINDOW_SIZE; + + if (peer -> windowSize < ENET_PROTOCOL_MINIMUM_WINDOW_SIZE) + peer -> windowSize = ENET_PROTOCOL_MINIMUM_WINDOW_SIZE; + else + if (peer -> windowSize > ENET_PROTOCOL_MAXIMUM_WINDOW_SIZE) + peer -> windowSize = ENET_PROTOCOL_MAXIMUM_WINDOW_SIZE; + + return 0; +} + +static int +enet_protocol_handle_throttle_configure (ENetHost * host, ENetPeer * peer, const ENetProtocol * command) +{ + if (peer -> state != ENET_PEER_STATE_CONNECTED && peer -> state != ENET_PEER_STATE_DISCONNECT_LATER) + return -1; + + peer -> packetThrottleInterval = ENET_NET_TO_HOST_32 (command -> throttleConfigure.packetThrottleInterval); + peer -> packetThrottleAcceleration = ENET_NET_TO_HOST_32 (command -> throttleConfigure.packetThrottleAcceleration); + peer -> packetThrottleDeceleration = ENET_NET_TO_HOST_32 (command -> throttleConfigure.packetThrottleDeceleration); + + return 0; +} + +static int +enet_protocol_handle_disconnect (ENetHost * host, ENetPeer * peer, const ENetProtocol * command) +{ + if (peer -> state == ENET_PEER_STATE_DISCONNECTED || peer -> state == ENET_PEER_STATE_ZOMBIE || peer -> state == ENET_PEER_STATE_ACKNOWLEDGING_DISCONNECT) + return 0; + + enet_peer_reset_queues (peer); + + if (peer -> state == ENET_PEER_STATE_CONNECTION_SUCCEEDED || peer -> state == ENET_PEER_STATE_DISCONNECTING || peer -> state == ENET_PEER_STATE_CONNECTING) + enet_protocol_dispatch_state (host, peer, ENET_PEER_STATE_ZOMBIE); + else + if (peer -> state != ENET_PEER_STATE_CONNECTED && peer -> state != ENET_PEER_STATE_DISCONNECT_LATER) + { + if (peer -> state == ENET_PEER_STATE_CONNECTION_PENDING) host -> recalculateBandwidthLimits = 1; + + enet_peer_reset (peer); + } + else + if (command -> header.command & ENET_PROTOCOL_COMMAND_FLAG_ACKNOWLEDGE) + enet_protocol_change_state (host, peer, ENET_PEER_STATE_ACKNOWLEDGING_DISCONNECT); + else + enet_protocol_dispatch_state (host, peer, ENET_PEER_STATE_ZOMBIE); + + if (peer -> state != ENET_PEER_STATE_DISCONNECTED) + peer -> eventData = ENET_NET_TO_HOST_32 (command -> disconnect.data); + + return 0; +} + +static int +enet_protocol_handle_acknowledge (ENetHost * host, ENetEvent * event, ENetPeer * peer, const ENetProtocol * command) +{ + enet_uint32 roundTripTime, + receivedSentTime, + receivedReliableSequenceNumber; + ENetProtocolCommand commandNumber; + + if (peer -> state == ENET_PEER_STATE_DISCONNECTED || peer -> state == ENET_PEER_STATE_ZOMBIE) + return 0; + + receivedSentTime = ENET_NET_TO_HOST_16 (command -> acknowledge.receivedSentTime); + receivedSentTime |= host -> serviceTime & 0xFFFF0000; + if ((receivedSentTime & 0x8000) > (host -> serviceTime & 0x8000)) + receivedSentTime -= 0x10000; + + if (ENET_TIME_LESS (host -> serviceTime, receivedSentTime)) + return 0; + + roundTripTime = ENET_TIME_DIFFERENCE (host -> serviceTime, receivedSentTime); + roundTripTime = ENET_MAX (roundTripTime, 1); + + if (peer -> lastReceiveTime > 0) + { + enet_peer_throttle (peer, roundTripTime); + + peer -> roundTripTimeVariance -= peer -> roundTripTimeVariance / 4; + + if (roundTripTime >= peer -> roundTripTime) + { + enet_uint32 diff = roundTripTime - peer -> roundTripTime; + peer -> roundTripTimeVariance += diff / 4; + peer -> roundTripTime += diff / 8; + } + else + { + enet_uint32 diff = peer -> roundTripTime - roundTripTime; + peer -> roundTripTimeVariance += diff / 4; + peer -> roundTripTime -= diff / 8; + } + } + else + { + peer -> roundTripTime = roundTripTime; + peer -> roundTripTimeVariance = (roundTripTime + 1) / 2; + } + + if (peer -> roundTripTime < peer -> lowestRoundTripTime) + peer -> lowestRoundTripTime = peer -> roundTripTime; + + if (peer -> roundTripTimeVariance > peer -> highestRoundTripTimeVariance) + peer -> highestRoundTripTimeVariance = peer -> roundTripTimeVariance; + + if (peer -> packetThrottleEpoch == 0 || + ENET_TIME_DIFFERENCE (host -> serviceTime, peer -> packetThrottleEpoch) >= peer -> packetThrottleInterval) + { + peer -> lastRoundTripTime = peer -> lowestRoundTripTime; + peer -> lastRoundTripTimeVariance = ENET_MAX (peer -> highestRoundTripTimeVariance, 1); + peer -> lowestRoundTripTime = peer -> roundTripTime; + peer -> highestRoundTripTimeVariance = peer -> roundTripTimeVariance; + peer -> packetThrottleEpoch = host -> serviceTime; + } + + peer -> lastReceiveTime = ENET_MAX (host -> serviceTime, 1); + peer -> earliestTimeout = 0; + + receivedReliableSequenceNumber = ENET_NET_TO_HOST_16 (command -> acknowledge.receivedReliableSequenceNumber); + + commandNumber = enet_protocol_remove_sent_reliable_command (peer, receivedReliableSequenceNumber, command -> header.channelID); + + switch (peer -> state) + { + case ENET_PEER_STATE_ACKNOWLEDGING_CONNECT: + if (commandNumber != ENET_PROTOCOL_COMMAND_VERIFY_CONNECT) + return -1; + + enet_protocol_notify_connect (host, peer, event); + break; + + case ENET_PEER_STATE_DISCONNECTING: + if (commandNumber != ENET_PROTOCOL_COMMAND_DISCONNECT) + return -1; + + enet_protocol_notify_disconnect (host, peer, event); + break; + + case ENET_PEER_STATE_DISCONNECT_LATER: + if (! enet_peer_has_outgoing_commands (peer)) + enet_peer_disconnect (peer, peer -> eventData); + break; + + default: + break; + } + + return 0; +} + +static int +enet_protocol_handle_verify_connect (ENetHost * host, ENetEvent * event, ENetPeer * peer, const ENetProtocol * command) +{ + enet_uint32 mtu, windowSize; + size_t channelCount; + + if (peer -> state != ENET_PEER_STATE_CONNECTING) + return 0; + + channelCount = ENET_NET_TO_HOST_32 (command -> verifyConnect.channelCount); + + if (channelCount < ENET_PROTOCOL_MINIMUM_CHANNEL_COUNT || channelCount > ENET_PROTOCOL_MAXIMUM_CHANNEL_COUNT || + ENET_NET_TO_HOST_32 (command -> verifyConnect.packetThrottleInterval) != peer -> packetThrottleInterval || + ENET_NET_TO_HOST_32 (command -> verifyConnect.packetThrottleAcceleration) != peer -> packetThrottleAcceleration || + ENET_NET_TO_HOST_32 (command -> verifyConnect.packetThrottleDeceleration) != peer -> packetThrottleDeceleration || + command -> verifyConnect.connectID != peer -> connectID) + { + peer -> eventData = 0; + + enet_protocol_dispatch_state (host, peer, ENET_PEER_STATE_ZOMBIE); + + return -1; + } + + enet_protocol_remove_sent_reliable_command (peer, 1, 0xFF); + + if (channelCount < peer -> channelCount) + peer -> channelCount = channelCount; + + peer -> outgoingPeerID = ENET_NET_TO_HOST_16 (command -> verifyConnect.outgoingPeerID); + peer -> incomingSessionID = command -> verifyConnect.incomingSessionID; + peer -> outgoingSessionID = command -> verifyConnect.outgoingSessionID; + + mtu = ENET_NET_TO_HOST_32 (command -> verifyConnect.mtu); + + if (mtu < ENET_PROTOCOL_MINIMUM_MTU) + mtu = ENET_PROTOCOL_MINIMUM_MTU; + else + if (mtu > ENET_PROTOCOL_MAXIMUM_MTU) + mtu = ENET_PROTOCOL_MAXIMUM_MTU; + + if (mtu < peer -> mtu) + peer -> mtu = mtu; + + windowSize = ENET_NET_TO_HOST_32 (command -> verifyConnect.windowSize); + + if (windowSize < ENET_PROTOCOL_MINIMUM_WINDOW_SIZE) + windowSize = ENET_PROTOCOL_MINIMUM_WINDOW_SIZE; + + if (windowSize > ENET_PROTOCOL_MAXIMUM_WINDOW_SIZE) + windowSize = ENET_PROTOCOL_MAXIMUM_WINDOW_SIZE; + + if (windowSize < peer -> windowSize) + peer -> windowSize = windowSize; + + peer -> incomingBandwidth = ENET_NET_TO_HOST_32 (command -> verifyConnect.incomingBandwidth); + peer -> outgoingBandwidth = ENET_NET_TO_HOST_32 (command -> verifyConnect.outgoingBandwidth); + + enet_protocol_notify_connect (host, peer, event); + return 0; +} + +static int +enet_protocol_handle_incoming_commands (ENetHost * host, ENetEvent * event) +{ + ENetProtocolHeader * header; + ENetProtocol * command; + ENetPeer * peer; + enet_uint8 * currentData; + size_t headerSize; + enet_uint16 peerID, flags; + enet_uint8 sessionID; + + if (host -> receivedDataLength < (size_t) & ((ENetProtocolHeader *) 0) -> sentTime) + return 0; + + header = (ENetProtocolHeader *) host -> receivedData; + + peerID = ENET_NET_TO_HOST_16 (header -> peerID); + sessionID = (peerID & ENET_PROTOCOL_HEADER_SESSION_MASK) >> ENET_PROTOCOL_HEADER_SESSION_SHIFT; + flags = peerID & ENET_PROTOCOL_HEADER_FLAG_MASK; + peerID &= ~ (ENET_PROTOCOL_HEADER_FLAG_MASK | ENET_PROTOCOL_HEADER_SESSION_MASK); + + headerSize = (flags & ENET_PROTOCOL_HEADER_FLAG_SENT_TIME ? sizeof (ENetProtocolHeader) : (size_t) & ((ENetProtocolHeader *) 0) -> sentTime); + if (host -> checksum != NULL) + headerSize += sizeof (enet_uint32); + + if (peerID == ENET_PROTOCOL_MAXIMUM_PEER_ID) + peer = NULL; + else + if (peerID >= host -> peerCount) + return 0; + else + { + peer = & host -> peers [peerID]; + + if (peer -> state == ENET_PEER_STATE_DISCONNECTED || + peer -> state == ENET_PEER_STATE_ZOMBIE || + ((host -> receivedAddress.host != peer -> address.host || + host -> receivedAddress.port != peer -> address.port) && + peer -> address.host != ENET_HOST_BROADCAST) || + (peer -> outgoingPeerID < ENET_PROTOCOL_MAXIMUM_PEER_ID && + sessionID != peer -> incomingSessionID)) + return 0; + } + + if (flags & ENET_PROTOCOL_HEADER_FLAG_COMPRESSED) + { + size_t originalSize; + if (host -> compressor.context == NULL || host -> compressor.decompress == NULL) + return 0; + + originalSize = host -> compressor.decompress (host -> compressor.context, + host -> receivedData + headerSize, + host -> receivedDataLength - headerSize, + host -> packetData [1] + headerSize, + sizeof (host -> packetData [1]) - headerSize); + if (originalSize <= 0 || originalSize > sizeof (host -> packetData [1]) - headerSize) + return 0; + + memcpy (host -> packetData [1], header, headerSize); + host -> receivedData = host -> packetData [1]; + host -> receivedDataLength = headerSize + originalSize; + } + + if (host -> checksum != NULL) + { + enet_uint32 * checksum = (enet_uint32 *) & host -> receivedData [headerSize - sizeof (enet_uint32)]; + enet_uint32 desiredChecksum, newChecksum; + ENetBuffer buffer; + /* Checksum may be an unaligned pointer, use memcpy to avoid undefined behaviour. */ + memcpy (& desiredChecksum, checksum, sizeof (enet_uint32)); + + newChecksum = peer != NULL ? peer -> connectID : 0; + memcpy (checksum, & newChecksum, sizeof (enet_uint32)); + + buffer.data = host -> receivedData; + buffer.dataLength = host -> receivedDataLength; + + if (host -> checksum (& buffer, 1) != desiredChecksum) + return 0; + } + + if (peer != NULL) + { + peer -> address.host = host -> receivedAddress.host; + peer -> address.port = host -> receivedAddress.port; + peer -> incomingDataTotal += host -> receivedDataLength; + } + + currentData = host -> receivedData + headerSize; + + while (currentData < & host -> receivedData [host -> receivedDataLength]) + { + enet_uint8 commandNumber; + size_t commandSize; + + command = (ENetProtocol *) currentData; + + if (currentData + sizeof (ENetProtocolCommandHeader) > & host -> receivedData [host -> receivedDataLength]) + break; + + commandNumber = command -> header.command & ENET_PROTOCOL_COMMAND_MASK; + if (commandNumber >= ENET_PROTOCOL_COMMAND_COUNT) + break; + + commandSize = commandSizes [commandNumber]; + if (commandSize == 0 || currentData + commandSize > & host -> receivedData [host -> receivedDataLength]) + break; + + currentData += commandSize; + + if (peer == NULL && commandNumber != ENET_PROTOCOL_COMMAND_CONNECT) + break; + + command -> header.reliableSequenceNumber = ENET_NET_TO_HOST_16 (command -> header.reliableSequenceNumber); + + switch (commandNumber) + { + case ENET_PROTOCOL_COMMAND_ACKNOWLEDGE: + if (enet_protocol_handle_acknowledge (host, event, peer, command)) + goto commandError; + break; + + case ENET_PROTOCOL_COMMAND_CONNECT: + if (peer != NULL) + goto commandError; + peer = enet_protocol_handle_connect (host, header, command); + if (peer == NULL) + goto commandError; + break; + + case ENET_PROTOCOL_COMMAND_VERIFY_CONNECT: + if (enet_protocol_handle_verify_connect (host, event, peer, command)) + goto commandError; + break; + + case ENET_PROTOCOL_COMMAND_DISCONNECT: + if (enet_protocol_handle_disconnect (host, peer, command)) + goto commandError; + break; + + case ENET_PROTOCOL_COMMAND_PING: + if (enet_protocol_handle_ping (host, peer, command)) + goto commandError; + break; + + case ENET_PROTOCOL_COMMAND_SEND_RELIABLE: + if (enet_protocol_handle_send_reliable (host, peer, command, & currentData)) + goto commandError; + break; + + case ENET_PROTOCOL_COMMAND_SEND_UNRELIABLE: + if (enet_protocol_handle_send_unreliable (host, peer, command, & currentData)) + goto commandError; + break; + + case ENET_PROTOCOL_COMMAND_SEND_UNSEQUENCED: + if (enet_protocol_handle_send_unsequenced (host, peer, command, & currentData)) + goto commandError; + break; + + case ENET_PROTOCOL_COMMAND_SEND_FRAGMENT: + if (enet_protocol_handle_send_fragment (host, peer, command, & currentData)) + goto commandError; + break; + + case ENET_PROTOCOL_COMMAND_BANDWIDTH_LIMIT: + if (enet_protocol_handle_bandwidth_limit (host, peer, command)) + goto commandError; + break; + + case ENET_PROTOCOL_COMMAND_THROTTLE_CONFIGURE: + if (enet_protocol_handle_throttle_configure (host, peer, command)) + goto commandError; + break; + + case ENET_PROTOCOL_COMMAND_SEND_UNRELIABLE_FRAGMENT: + if (enet_protocol_handle_send_unreliable_fragment (host, peer, command, & currentData)) + goto commandError; + break; + + default: + goto commandError; + } + + if (peer != NULL && + (command -> header.command & ENET_PROTOCOL_COMMAND_FLAG_ACKNOWLEDGE) != 0) + { + enet_uint16 sentTime; + + if (! (flags & ENET_PROTOCOL_HEADER_FLAG_SENT_TIME)) + break; + + sentTime = ENET_NET_TO_HOST_16 (header -> sentTime); + + switch (peer -> state) + { + case ENET_PEER_STATE_DISCONNECTING: + case ENET_PEER_STATE_ACKNOWLEDGING_CONNECT: + case ENET_PEER_STATE_DISCONNECTED: + case ENET_PEER_STATE_ZOMBIE: + break; + + case ENET_PEER_STATE_ACKNOWLEDGING_DISCONNECT: + if ((command -> header.command & ENET_PROTOCOL_COMMAND_MASK) == ENET_PROTOCOL_COMMAND_DISCONNECT) + enet_peer_queue_acknowledgement (peer, command, sentTime); + break; + + default: + enet_peer_queue_acknowledgement (peer, command, sentTime); + break; + } + } + } + +commandError: + if (event != NULL && event -> type != ENET_EVENT_TYPE_NONE) + return 1; + + return 0; +} + +static int +enet_protocol_receive_incoming_commands (ENetHost * host, ENetEvent * event) +{ + int packets; + + for (packets = 0; packets < 256; ++ packets) + { + int receivedLength; + ENetBuffer buffer; + + buffer.data = host -> packetData [0]; + buffer.dataLength = sizeof (host -> packetData [0]); + + receivedLength = enet_socket_receive (host -> socket, + & host -> receivedAddress, + & buffer, + 1); + + if (receivedLength == -2) + continue; + + if (receivedLength < 0) + return -1; + + if (receivedLength == 0) + return 0; + + host -> receivedData = host -> packetData [0]; + host -> receivedDataLength = receivedLength; + + host -> totalReceivedData += receivedLength; + host -> totalReceivedPackets ++; + + if (host -> intercept != NULL) + { + switch (host -> intercept (host, event)) + { + case 1: + if (event != NULL && event -> type != ENET_EVENT_TYPE_NONE) + return 1; + + continue; + + case -1: + return -1; + + default: + break; + } + } + + switch (enet_protocol_handle_incoming_commands (host, event)) + { + case 1: + return 1; + + case -1: + return -1; + + default: + break; + } + } + + return 0; +} + +static void +enet_protocol_send_acknowledgements (ENetHost * host, ENetPeer * peer) +{ + ENetProtocol * command = & host -> commands [host -> commandCount]; + ENetBuffer * buffer = & host -> buffers [host -> bufferCount]; + ENetAcknowledgement * acknowledgement; + ENetListIterator currentAcknowledgement; + enet_uint16 reliableSequenceNumber; + + currentAcknowledgement = enet_list_begin (& peer -> acknowledgements); + + while (currentAcknowledgement != enet_list_end (& peer -> acknowledgements)) + { + if (command >= & host -> commands [sizeof (host -> commands) / sizeof (ENetProtocol)] || + buffer >= & host -> buffers [sizeof (host -> buffers) / sizeof (ENetBuffer)] || + peer -> mtu - host -> packetSize < sizeof (ENetProtocolAcknowledge)) + { + peer -> flags |= ENET_PEER_FLAG_CONTINUE_SENDING; + + break; + } + + acknowledgement = (ENetAcknowledgement *) currentAcknowledgement; + + currentAcknowledgement = enet_list_next (currentAcknowledgement); + + buffer -> data = command; + buffer -> dataLength = sizeof (ENetProtocolAcknowledge); + + host -> packetSize += buffer -> dataLength; + + reliableSequenceNumber = ENET_HOST_TO_NET_16 (acknowledgement -> command.header.reliableSequenceNumber); + + command -> header.command = ENET_PROTOCOL_COMMAND_ACKNOWLEDGE; + command -> header.channelID = acknowledgement -> command.header.channelID; + command -> header.reliableSequenceNumber = reliableSequenceNumber; + command -> acknowledge.receivedReliableSequenceNumber = reliableSequenceNumber; + command -> acknowledge.receivedSentTime = ENET_HOST_TO_NET_16 (acknowledgement -> sentTime); + + if ((acknowledgement -> command.header.command & ENET_PROTOCOL_COMMAND_MASK) == ENET_PROTOCOL_COMMAND_DISCONNECT) + enet_protocol_dispatch_state (host, peer, ENET_PEER_STATE_ZOMBIE); + + enet_list_remove (& acknowledgement -> acknowledgementList); + enet_free (acknowledgement); + + ++ command; + ++ buffer; + } + + host -> commandCount = command - host -> commands; + host -> bufferCount = buffer - host -> buffers; +} + +static int +enet_protocol_check_timeouts (ENetHost * host, ENetPeer * peer, ENetEvent * event) +{ + ENetOutgoingCommand * outgoingCommand; + ENetListIterator currentCommand, insertPosition, insertSendReliablePosition; + + currentCommand = enet_list_begin (& peer -> sentReliableCommands); + insertPosition = enet_list_begin (& peer -> outgoingCommands); + insertSendReliablePosition = enet_list_begin (& peer -> outgoingSendReliableCommands); + + while (currentCommand != enet_list_end (& peer -> sentReliableCommands)) + { + outgoingCommand = (ENetOutgoingCommand *) currentCommand; + + currentCommand = enet_list_next (currentCommand); + + if (ENET_TIME_DIFFERENCE (host -> serviceTime, outgoingCommand -> sentTime) < outgoingCommand -> roundTripTimeout) + continue; + + if (peer -> earliestTimeout == 0 || + ENET_TIME_LESS (outgoingCommand -> sentTime, peer -> earliestTimeout)) + peer -> earliestTimeout = outgoingCommand -> sentTime; + + if (peer -> earliestTimeout != 0 && + (ENET_TIME_DIFFERENCE (host -> serviceTime, peer -> earliestTimeout) >= peer -> timeoutMaximum || + ((1 << (outgoingCommand -> sendAttempts - 1)) >= peer -> timeoutLimit && + ENET_TIME_DIFFERENCE (host -> serviceTime, peer -> earliestTimeout) >= peer -> timeoutMinimum))) + { + enet_protocol_notify_disconnect (host, peer, event); + + return 1; + } + + ++ peer -> packetsLost; + + outgoingCommand -> roundTripTimeout *= 2; + + if (outgoingCommand -> packet != NULL) + { + peer -> reliableDataInTransit -= outgoingCommand -> fragmentLength; + + enet_list_insert (insertSendReliablePosition, enet_list_remove (& outgoingCommand -> outgoingCommandList)); + } + else + enet_list_insert (insertPosition, enet_list_remove (& outgoingCommand -> outgoingCommandList)); + + if (currentCommand == enet_list_begin (& peer -> sentReliableCommands) && + ! enet_list_empty (& peer -> sentReliableCommands)) + { + outgoingCommand = (ENetOutgoingCommand *) currentCommand; + + peer -> nextTimeout = outgoingCommand -> sentTime + outgoingCommand -> roundTripTimeout; + } + } + + return 0; +} + +static int +enet_protocol_check_outgoing_commands (ENetHost * host, ENetPeer * peer, ENetList * sentUnreliableCommands) +{ + ENetProtocol * command = & host -> commands [host -> commandCount]; + ENetBuffer * buffer = & host -> buffers [host -> bufferCount]; + ENetOutgoingCommand * outgoingCommand; + ENetListIterator currentCommand, currentSendReliableCommand; + ENetChannel *channel = NULL; + enet_uint16 reliableWindow = 0; + size_t commandSize; + int windowWrap = 0, canPing = 1; + + currentCommand = enet_list_begin (& peer -> outgoingCommands); + currentSendReliableCommand = enet_list_begin (& peer -> outgoingSendReliableCommands); + + for (;;) + { + if (currentCommand != enet_list_end (& peer -> outgoingCommands)) + { + outgoingCommand = (ENetOutgoingCommand *) currentCommand; + + if (currentSendReliableCommand != enet_list_end (& peer -> outgoingSendReliableCommands) && + ENET_TIME_LESS (((ENetOutgoingCommand *) currentSendReliableCommand) -> queueTime, outgoingCommand -> queueTime)) + goto useSendReliableCommand; + + currentCommand = enet_list_next (currentCommand); + } + else + if (currentSendReliableCommand != enet_list_end (& peer -> outgoingSendReliableCommands)) + { + useSendReliableCommand: + outgoingCommand = (ENetOutgoingCommand *) currentSendReliableCommand; + currentSendReliableCommand = enet_list_next (currentSendReliableCommand); + } + else + break; + + if (outgoingCommand -> command.header.command & ENET_PROTOCOL_COMMAND_FLAG_ACKNOWLEDGE) + { + channel = outgoingCommand -> command.header.channelID < peer -> channelCount ? & peer -> channels [outgoingCommand -> command.header.channelID] : NULL; + reliableWindow = outgoingCommand -> reliableSequenceNumber / ENET_PEER_RELIABLE_WINDOW_SIZE; + if (channel != NULL) + { + if (windowWrap) + continue; + else + if (outgoingCommand -> sendAttempts < 1 && + ! (outgoingCommand -> reliableSequenceNumber % ENET_PEER_RELIABLE_WINDOW_SIZE) && + (channel -> reliableWindows [(reliableWindow + ENET_PEER_RELIABLE_WINDOWS - 1) % ENET_PEER_RELIABLE_WINDOWS] >= ENET_PEER_RELIABLE_WINDOW_SIZE || + channel -> usedReliableWindows & ((((1 << (ENET_PEER_FREE_RELIABLE_WINDOWS + 2)) - 1) << reliableWindow) | + (((1 << (ENET_PEER_FREE_RELIABLE_WINDOWS + 2)) - 1) >> (ENET_PEER_RELIABLE_WINDOWS - reliableWindow))))) + { + windowWrap = 1; + currentSendReliableCommand = enet_list_end (& peer -> outgoingSendReliableCommands); + + continue; + } + } + + if (outgoingCommand -> packet != NULL) + { + enet_uint32 windowSize = (peer -> packetThrottle * peer -> windowSize) / ENET_PEER_PACKET_THROTTLE_SCALE; + + if (peer -> reliableDataInTransit + outgoingCommand -> fragmentLength > ENET_MAX (windowSize, peer -> mtu)) + { + currentSendReliableCommand = enet_list_end (& peer -> outgoingSendReliableCommands); + + continue; + } + } + + canPing = 0; + } + + commandSize = commandSizes [outgoingCommand -> command.header.command & ENET_PROTOCOL_COMMAND_MASK]; + if (command >= & host -> commands [sizeof (host -> commands) / sizeof (ENetProtocol)] || + buffer + 1 >= & host -> buffers [sizeof (host -> buffers) / sizeof (ENetBuffer)] || + peer -> mtu - host -> packetSize < commandSize || + (outgoingCommand -> packet != NULL && + (enet_uint16) (peer -> mtu - host -> packetSize) < (enet_uint16) (commandSize + outgoingCommand -> fragmentLength))) + { + peer -> flags |= ENET_PEER_FLAG_CONTINUE_SENDING; + + break; + } + + if (outgoingCommand -> command.header.command & ENET_PROTOCOL_COMMAND_FLAG_ACKNOWLEDGE) + { + if (channel != NULL && outgoingCommand -> sendAttempts < 1) + { + channel -> usedReliableWindows |= 1 << reliableWindow; + ++ channel -> reliableWindows [reliableWindow]; + } + + ++ outgoingCommand -> sendAttempts; + + if (outgoingCommand -> roundTripTimeout == 0) + outgoingCommand -> roundTripTimeout = peer -> roundTripTime + 4 * peer -> roundTripTimeVariance; + + if (enet_list_empty (& peer -> sentReliableCommands)) + peer -> nextTimeout = host -> serviceTime + outgoingCommand -> roundTripTimeout; + + enet_list_insert (enet_list_end (& peer -> sentReliableCommands), + enet_list_remove (& outgoingCommand -> outgoingCommandList)); + + outgoingCommand -> sentTime = host -> serviceTime; + + host -> headerFlags |= ENET_PROTOCOL_HEADER_FLAG_SENT_TIME; + + peer -> reliableDataInTransit += outgoingCommand -> fragmentLength; + } + else + { + if (outgoingCommand -> packet != NULL && outgoingCommand -> fragmentOffset == 0) + { + peer -> packetThrottleCounter += ENET_PEER_PACKET_THROTTLE_COUNTER; + peer -> packetThrottleCounter %= ENET_PEER_PACKET_THROTTLE_SCALE; + + if (peer -> packetThrottleCounter > peer -> packetThrottle) + { + enet_uint16 reliableSequenceNumber = outgoingCommand -> reliableSequenceNumber, + unreliableSequenceNumber = outgoingCommand -> unreliableSequenceNumber; + for (;;) + { + -- outgoingCommand -> packet -> referenceCount; + + if (outgoingCommand -> packet -> referenceCount == 0) + enet_packet_destroy (outgoingCommand -> packet); + + enet_list_remove (& outgoingCommand -> outgoingCommandList); + enet_free (outgoingCommand); + + if (currentCommand == enet_list_end (& peer -> outgoingCommands)) + break; + + outgoingCommand = (ENetOutgoingCommand *) currentCommand; + if (outgoingCommand -> reliableSequenceNumber != reliableSequenceNumber || + outgoingCommand -> unreliableSequenceNumber != unreliableSequenceNumber) + break; + + currentCommand = enet_list_next (currentCommand); + } + + continue; + } + } + + enet_list_remove (& outgoingCommand -> outgoingCommandList); + + if (outgoingCommand -> packet != NULL) + enet_list_insert (enet_list_end (sentUnreliableCommands), outgoingCommand); + } + + buffer -> data = command; + buffer -> dataLength = commandSize; + + host -> packetSize += buffer -> dataLength; + + * command = outgoingCommand -> command; + + if (outgoingCommand -> packet != NULL) + { + ++ buffer; + + buffer -> data = outgoingCommand -> packet -> data + outgoingCommand -> fragmentOffset; + buffer -> dataLength = outgoingCommand -> fragmentLength; + + host -> packetSize += outgoingCommand -> fragmentLength; + } + else + if (! (outgoingCommand -> command.header.command & ENET_PROTOCOL_COMMAND_FLAG_ACKNOWLEDGE)) + enet_free (outgoingCommand); + + ++ peer -> packetsSent; + + ++ command; + ++ buffer; + } + + host -> commandCount = command - host -> commands; + host -> bufferCount = buffer - host -> buffers; + + if (peer -> state == ENET_PEER_STATE_DISCONNECT_LATER && + ! enet_peer_has_outgoing_commands (peer) && + enet_list_empty (sentUnreliableCommands)) + enet_peer_disconnect (peer, peer -> eventData); + + return canPing; +} + +static int +enet_protocol_send_outgoing_commands (ENetHost * host, ENetEvent * event, int checkForTimeouts) +{ + enet_uint8 headerData [sizeof (ENetProtocolHeader) + sizeof (enet_uint32)]; + ENetProtocolHeader * header = (ENetProtocolHeader *) headerData; + int sentLength = 0; + size_t shouldCompress = 0; + ENetList sentUnreliableCommands; + + enet_list_clear (& sentUnreliableCommands); + + for (int sendPass = 0, continueSending = 0; sendPass <= continueSending; ++ sendPass) + for (ENetPeer * currentPeer = host -> peers; + currentPeer < & host -> peers [host -> peerCount]; + ++ currentPeer) + { + if (currentPeer -> state == ENET_PEER_STATE_DISCONNECTED || + currentPeer -> state == ENET_PEER_STATE_ZOMBIE || + (sendPass > 0 && ! (currentPeer -> flags & ENET_PEER_FLAG_CONTINUE_SENDING))) + continue; + + currentPeer -> flags &= ~ ENET_PEER_FLAG_CONTINUE_SENDING; + + host -> headerFlags = 0; + host -> commandCount = 0; + host -> bufferCount = 1; + host -> packetSize = sizeof (ENetProtocolHeader); + + if (! enet_list_empty (& currentPeer -> acknowledgements)) + enet_protocol_send_acknowledgements (host, currentPeer); + + if (checkForTimeouts != 0 && + ! enet_list_empty (& currentPeer -> sentReliableCommands) && + ENET_TIME_GREATER_EQUAL (host -> serviceTime, currentPeer -> nextTimeout) && + enet_protocol_check_timeouts (host, currentPeer, event) == 1) + { + if (event != NULL && event -> type != ENET_EVENT_TYPE_NONE) + return 1; + else + goto nextPeer; + } + + if (((enet_list_empty (& currentPeer -> outgoingCommands) && + enet_list_empty (& currentPeer -> outgoingSendReliableCommands)) || + enet_protocol_check_outgoing_commands (host, currentPeer, & sentUnreliableCommands)) && + enet_list_empty (& currentPeer -> sentReliableCommands) && + ENET_TIME_DIFFERENCE (host -> serviceTime, currentPeer -> lastReceiveTime) >= currentPeer -> pingInterval && + currentPeer -> mtu - host -> packetSize >= sizeof (ENetProtocolPing)) + { + enet_peer_ping (currentPeer); + enet_protocol_check_outgoing_commands (host, currentPeer, & sentUnreliableCommands); + } + + if (host -> commandCount == 0) + goto nextPeer; + + if (currentPeer -> packetLossEpoch == 0) + currentPeer -> packetLossEpoch = host -> serviceTime; + else + if (ENET_TIME_DIFFERENCE (host -> serviceTime, currentPeer -> packetLossEpoch) >= ENET_PEER_PACKET_LOSS_INTERVAL && + currentPeer -> packetsSent > 0) + { + enet_uint32 packetLoss = currentPeer -> packetsLost * ENET_PEER_PACKET_LOSS_SCALE / currentPeer -> packetsSent; + +#ifdef ENET_DEBUG + printf ("peer %u: %f%%+-%f%% packet loss, %u+-%u ms round trip time, %f%% throttle, %u outgoing, %u/%u incoming\n", currentPeer -> incomingPeerID, currentPeer -> packetLoss / (float) ENET_PEER_PACKET_LOSS_SCALE, currentPeer -> packetLossVariance / (float) ENET_PEER_PACKET_LOSS_SCALE, currentPeer -> roundTripTime, currentPeer -> roundTripTimeVariance, currentPeer -> packetThrottle / (float) ENET_PEER_PACKET_THROTTLE_SCALE, enet_list_size (& currentPeer -> outgoingCommands) + enet_list_size (& currentPeer -> outgoingSendReliableCommands), currentPeer -> channels != NULL ? enet_list_size (& currentPeer -> channels -> incomingReliableCommands) : 0, currentPeer -> channels != NULL ? enet_list_size (& currentPeer -> channels -> incomingUnreliableCommands) : 0); +#endif + + currentPeer -> packetLossVariance = (currentPeer -> packetLossVariance * 3 + ENET_DIFFERENCE (packetLoss, currentPeer -> packetLoss)) / 4; + currentPeer -> packetLoss = (currentPeer -> packetLoss * 7 + packetLoss) / 8; + + currentPeer -> packetLossEpoch = host -> serviceTime; + currentPeer -> packetsSent = 0; + currentPeer -> packetsLost = 0; + } + + host -> buffers -> data = headerData; + if (host -> headerFlags & ENET_PROTOCOL_HEADER_FLAG_SENT_TIME) + { + header -> sentTime = ENET_HOST_TO_NET_16 (host -> serviceTime & 0xFFFF); + + host -> buffers -> dataLength = sizeof (ENetProtocolHeader); + } + else + host -> buffers -> dataLength = (size_t) & ((ENetProtocolHeader *) 0) -> sentTime; + + shouldCompress = 0; + if (host -> compressor.context != NULL && host -> compressor.compress != NULL) + { + size_t originalSize = host -> packetSize - sizeof(ENetProtocolHeader), + compressedSize = host -> compressor.compress (host -> compressor.context, + & host -> buffers [1], host -> bufferCount - 1, + originalSize, + host -> packetData [1], + originalSize); + if (compressedSize > 0 && compressedSize < originalSize) + { + host -> headerFlags |= ENET_PROTOCOL_HEADER_FLAG_COMPRESSED; + shouldCompress = compressedSize; +#ifdef ENET_DEBUG_COMPRESS + printf ("peer %u: compressed %u -> %u (%u%%)\n", currentPeer -> incomingPeerID, originalSize, compressedSize, (compressedSize * 100) / originalSize); +#endif + } + } + + if (currentPeer -> outgoingPeerID < ENET_PROTOCOL_MAXIMUM_PEER_ID) + host -> headerFlags |= currentPeer -> outgoingSessionID << ENET_PROTOCOL_HEADER_SESSION_SHIFT; + header -> peerID = ENET_HOST_TO_NET_16 (currentPeer -> outgoingPeerID | host -> headerFlags); + if (host -> checksum != NULL) + { + enet_uint32 * checksum = (enet_uint32 *) & headerData [host -> buffers -> dataLength]; + enet_uint32 newChecksum = currentPeer -> outgoingPeerID < ENET_PROTOCOL_MAXIMUM_PEER_ID ? currentPeer -> connectID : 0; + /* Checksum may be unaligned, use memcpy to avoid undefined behaviour. */ + memcpy(checksum, & newChecksum, sizeof (enet_uint32)); + host -> buffers -> dataLength += sizeof (enet_uint32); + newChecksum = host -> checksum (host -> buffers, host -> bufferCount); + memcpy(checksum, & newChecksum, sizeof (enet_uint32)); + } + + if (shouldCompress > 0) + { + host -> buffers [1].data = host -> packetData [1]; + host -> buffers [1].dataLength = shouldCompress; + host -> bufferCount = 2; + } + + currentPeer -> lastSendTime = host -> serviceTime; + + sentLength = enet_socket_send (host -> socket, & currentPeer -> address, host -> buffers, host -> bufferCount); + + enet_protocol_remove_sent_unreliable_commands (currentPeer, & sentUnreliableCommands); + + if (sentLength < 0) + return -1; + + host -> totalSentData += sentLength; + host -> totalSentPackets ++; + + nextPeer: + if (currentPeer -> flags & ENET_PEER_FLAG_CONTINUE_SENDING) + continueSending = sendPass + 1; + } + + return 0; +} + +/** Sends any queued packets on the host specified to its designated peers. + + @param host host to flush + @remarks this function need only be used in circumstances where one wishes to send queued packets earlier than in a call to enet_host_service(). + @ingroup host +*/ +void +enet_host_flush (ENetHost * host) +{ + host -> serviceTime = enet_time_get (); + + enet_protocol_send_outgoing_commands (host, NULL, 0); +} + +/** Checks for any queued events on the host and dispatches one if available. + + @param host host to check for events + @param event an event structure where event details will be placed if available + @retval > 0 if an event was dispatched + @retval 0 if no events are available + @retval < 0 on failure + @ingroup host +*/ +int +enet_host_check_events (ENetHost * host, ENetEvent * event) +{ + if (event == NULL) return -1; + + event -> type = ENET_EVENT_TYPE_NONE; + event -> peer = NULL; + event -> packet = NULL; + + return enet_protocol_dispatch_incoming_commands (host, event); +} + +/** Waits for events on the host specified and shuttles packets between + the host and its peers. + + @param host host to service + @param event an event structure where event details will be placed if one occurs + if event == NULL then no events will be delivered + @param timeout number of milliseconds that ENet should wait for events + @retval > 0 if an event occurred within the specified time limit + @retval 0 if no event occurred + @retval < 0 on failure + @remarks enet_host_service should be called fairly regularly for adequate performance + @ingroup host +*/ +int +enet_host_service (ENetHost * host, ENetEvent * event, enet_uint32 timeout) +{ + enet_uint32 waitCondition; + + if (event != NULL) + { + event -> type = ENET_EVENT_TYPE_NONE; + event -> peer = NULL; + event -> packet = NULL; + + switch (enet_protocol_dispatch_incoming_commands (host, event)) + { + case 1: + return 1; + + case -1: +#ifdef ENET_DEBUG + perror ("Error dispatching incoming packets"); +#endif + + return -1; + + default: + break; + } + } + + host -> serviceTime = enet_time_get (); + + timeout += host -> serviceTime; + + do + { + if (ENET_TIME_DIFFERENCE (host -> serviceTime, host -> bandwidthThrottleEpoch) >= ENET_HOST_BANDWIDTH_THROTTLE_INTERVAL) + enet_host_bandwidth_throttle (host); + + switch (enet_protocol_send_outgoing_commands (host, event, 1)) + { + case 1: + return 1; + + case -1: +#ifdef ENET_DEBUG + perror ("Error sending outgoing packets"); +#endif + + return -1; + + default: + break; + } + + switch (enet_protocol_receive_incoming_commands (host, event)) + { + case 1: + return 1; + + case -1: +#ifdef ENET_DEBUG + perror ("Error receiving incoming packets"); +#endif + + return -1; + + default: + break; + } + + switch (enet_protocol_send_outgoing_commands (host, event, 1)) + { + case 1: + return 1; + + case -1: +#ifdef ENET_DEBUG + perror ("Error sending outgoing packets"); +#endif + + return -1; + + default: + break; + } + + if (event != NULL) + { + switch (enet_protocol_dispatch_incoming_commands (host, event)) + { + case 1: + return 1; + + case -1: +#ifdef ENET_DEBUG + perror ("Error dispatching incoming packets"); +#endif + + return -1; + + default: + break; + } + } + + if (ENET_TIME_GREATER_EQUAL (host -> serviceTime, timeout)) + return 0; + + do + { + host -> serviceTime = enet_time_get (); + + if (ENET_TIME_GREATER_EQUAL (host -> serviceTime, timeout)) + return 0; + + waitCondition = ENET_SOCKET_WAIT_RECEIVE | ENET_SOCKET_WAIT_INTERRUPT; + + if (enet_socket_wait (host -> socket, & waitCondition, ENET_TIME_DIFFERENCE (timeout, host -> serviceTime)) != 0) + return -1; + } + while (waitCondition & ENET_SOCKET_WAIT_INTERRUPT); + + host -> serviceTime = enet_time_get (); + } while (waitCondition & ENET_SOCKET_WAIT_RECEIVE); + + return 0; +} + diff --git a/thirdparty/enet/unix.c b/thirdparty/enet/unix.c new file mode 100644 index 0000000..6669216 --- /dev/null +++ b/thirdparty/enet/unix.c @@ -0,0 +1,624 @@ +/** + @file unix.c + @brief ENet Unix system specific functions +*/ +#ifndef _WIN32 + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define ENET_BUILDING_LIB 1 +#include "enet/enet.h" + +#ifdef __APPLE__ +#ifdef HAS_POLL +#undef HAS_POLL +#endif +#ifndef HAS_FCNTL +#define HAS_FCNTL 1 +#endif +#ifndef HAS_INET_PTON +#define HAS_INET_PTON 1 +#endif +#ifndef HAS_INET_NTOP +#define HAS_INET_NTOP 1 +#endif +#ifndef HAS_MSGHDR_FLAGS +#define HAS_MSGHDR_FLAGS 1 +#endif +#ifndef HAS_SOCKLEN_T +#define HAS_SOCKLEN_T 1 +#endif +#ifndef HAS_GETADDRINFO +#define HAS_GETADDRINFO 1 +#endif +#ifndef HAS_GETNAMEINFO +#define HAS_GETNAMEINFO 1 +#endif +#endif + +#ifdef HAS_FCNTL +#include +#endif + +#ifdef HAS_POLL +#include +#endif + +#if !defined(HAS_SOCKLEN_T) && !defined(__socklen_t_defined) +typedef int socklen_t; +#endif + +#ifndef MSG_NOSIGNAL +#define MSG_NOSIGNAL 0 +#endif + +static enet_uint32 timeBase = 0; + +int +enet_initialize (void) +{ + return 0; +} + +void +enet_deinitialize (void) +{ +} + +enet_uint32 +enet_host_random_seed (void) +{ + return (enet_uint32) time (NULL); +} + +enet_uint32 +enet_time_get (void) +{ + struct timeval timeVal; + + gettimeofday (& timeVal, NULL); + + return timeVal.tv_sec * 1000 + timeVal.tv_usec / 1000 - timeBase; +} + +void +enet_time_set (enet_uint32 newTimeBase) +{ + struct timeval timeVal; + + gettimeofday (& timeVal, NULL); + + timeBase = timeVal.tv_sec * 1000 + timeVal.tv_usec / 1000 - newTimeBase; +} + +int +enet_address_set_host_ip (ENetAddress * address, const char * name) +{ +#ifdef HAS_INET_PTON + if (! inet_pton (AF_INET, name, & address -> host)) +#else + if (! inet_aton (name, (struct in_addr *) & address -> host)) +#endif + return -1; + + return 0; +} + +int +enet_address_set_host (ENetAddress * address, const char * name) +{ +#ifdef HAS_GETADDRINFO + struct addrinfo hints, * resultList = NULL, * result = NULL; + + memset (& hints, 0, sizeof (hints)); + hints.ai_family = AF_INET; + + if (getaddrinfo (name, NULL, NULL, & resultList) != 0) + return -1; + + for (result = resultList; result != NULL; result = result -> ai_next) + { + if (result -> ai_family == AF_INET && result -> ai_addr != NULL && result -> ai_addrlen >= sizeof (struct sockaddr_in)) + { + struct sockaddr_in * sin = (struct sockaddr_in *) result -> ai_addr; + + address -> host = sin -> sin_addr.s_addr; + + freeaddrinfo (resultList); + + return 0; + } + } + + if (resultList != NULL) + freeaddrinfo (resultList); +#else + struct hostent * hostEntry = NULL; +#ifdef HAS_GETHOSTBYNAME_R + struct hostent hostData; + char buffer [2048]; + int errnum; + +#if defined(linux) || defined(__linux) || defined(__linux__) || defined(__FreeBSD__) || defined(__FreeBSD_kernel__) || defined(__DragonFly__) || defined(__GNU__) + gethostbyname_r (name, & hostData, buffer, sizeof (buffer), & hostEntry, & errnum); +#else + hostEntry = gethostbyname_r (name, & hostData, buffer, sizeof (buffer), & errnum); +#endif +#else + hostEntry = gethostbyname (name); +#endif + + if (hostEntry != NULL && hostEntry -> h_addrtype == AF_INET) + { + address -> host = * (enet_uint32 *) hostEntry -> h_addr_list [0]; + + return 0; + } +#endif + + return enet_address_set_host_ip (address, name); +} + +int +enet_address_get_host_ip (const ENetAddress * address, char * name, size_t nameLength) +{ +#ifdef HAS_INET_NTOP + if (inet_ntop (AF_INET, & address -> host, name, nameLength) == NULL) +#else + char * addr = inet_ntoa (* (struct in_addr *) & address -> host); + if (addr != NULL) + { + size_t addrLen = strlen(addr); + if (addrLen >= nameLength) + return -1; + memcpy (name, addr, addrLen + 1); + } + else +#endif + return -1; + return 0; +} + +int +enet_address_get_host (const ENetAddress * address, char * name, size_t nameLength) +{ +#ifdef HAS_GETNAMEINFO + struct sockaddr_in sin; + int err; + + memset (& sin, 0, sizeof (struct sockaddr_in)); + + sin.sin_family = AF_INET; + sin.sin_port = ENET_HOST_TO_NET_16 (address -> port); + sin.sin_addr.s_addr = address -> host; + + err = getnameinfo ((struct sockaddr *) & sin, sizeof (sin), name, nameLength, NULL, 0, NI_NAMEREQD); + if (! err) + { + if (name != NULL && nameLength > 0 && ! memchr (name, '\0', nameLength)) + return -1; + return 0; + } + if (err != EAI_NONAME) + return -1; +#else + struct in_addr in; + struct hostent * hostEntry = NULL; +#ifdef HAS_GETHOSTBYADDR_R + struct hostent hostData; + char buffer [2048]; + int errnum; + + in.s_addr = address -> host; + +#if defined(linux) || defined(__linux) || defined(__linux__) || defined(__FreeBSD__) || defined(__FreeBSD_kernel__) || defined(__DragonFly__) || defined(__GNU__) + gethostbyaddr_r ((char *) & in, sizeof (struct in_addr), AF_INET, & hostData, buffer, sizeof (buffer), & hostEntry, & errnum); +#else + hostEntry = gethostbyaddr_r ((char *) & in, sizeof (struct in_addr), AF_INET, & hostData, buffer, sizeof (buffer), & errnum); +#endif +#else + in.s_addr = address -> host; + + hostEntry = gethostbyaddr ((char *) & in, sizeof (struct in_addr), AF_INET); +#endif + + if (hostEntry != NULL) + { + size_t hostLen = strlen (hostEntry -> h_name); + if (hostLen >= nameLength) + return -1; + memcpy (name, hostEntry -> h_name, hostLen + 1); + return 0; + } +#endif + + return enet_address_get_host_ip (address, name, nameLength); +} + +int +enet_socket_bind (ENetSocket socket, const ENetAddress * address) +{ + struct sockaddr_in sin; + + memset (& sin, 0, sizeof (struct sockaddr_in)); + + sin.sin_family = AF_INET; + + if (address != NULL) + { + sin.sin_port = ENET_HOST_TO_NET_16 (address -> port); + sin.sin_addr.s_addr = address -> host; + } + else + { + sin.sin_port = 0; + sin.sin_addr.s_addr = INADDR_ANY; + } + + return bind (socket, + (struct sockaddr *) & sin, + sizeof (struct sockaddr_in)); +} + +int +enet_socket_get_address (ENetSocket socket, ENetAddress * address) +{ + struct sockaddr_in sin; + socklen_t sinLength = sizeof (struct sockaddr_in); + + if (getsockname (socket, (struct sockaddr *) & sin, & sinLength) == -1) + return -1; + + address -> host = (enet_uint32) sin.sin_addr.s_addr; + address -> port = ENET_NET_TO_HOST_16 (sin.sin_port); + + return 0; +} + +int +enet_socket_listen (ENetSocket socket, int backlog) +{ + return listen (socket, backlog < 0 ? SOMAXCONN : backlog); +} + +ENetSocket +enet_socket_create (ENetSocketType type) +{ + return socket (PF_INET, type == ENET_SOCKET_TYPE_DATAGRAM ? SOCK_DGRAM : SOCK_STREAM, 0); +} + +int +enet_socket_set_option (ENetSocket socket, ENetSocketOption option, int value) +{ + int result = -1; + switch (option) + { + case ENET_SOCKOPT_NONBLOCK: +#ifdef HAS_FCNTL + result = fcntl (socket, F_SETFL, (value ? O_NONBLOCK : 0) | (fcntl (socket, F_GETFL) & ~O_NONBLOCK)); +#else + result = ioctl (socket, FIONBIO, & value); +#endif + break; + + case ENET_SOCKOPT_BROADCAST: + result = setsockopt (socket, SOL_SOCKET, SO_BROADCAST, (char *) & value, sizeof (int)); + break; + + case ENET_SOCKOPT_REUSEADDR: + result = setsockopt (socket, SOL_SOCKET, SO_REUSEADDR, (char *) & value, sizeof (int)); + break; + + case ENET_SOCKOPT_RCVBUF: + result = setsockopt (socket, SOL_SOCKET, SO_RCVBUF, (char *) & value, sizeof (int)); + break; + + case ENET_SOCKOPT_SNDBUF: + result = setsockopt (socket, SOL_SOCKET, SO_SNDBUF, (char *) & value, sizeof (int)); + break; + + case ENET_SOCKOPT_RCVTIMEO: + { + struct timeval timeVal; + timeVal.tv_sec = value / 1000; + timeVal.tv_usec = (value % 1000) * 1000; + result = setsockopt (socket, SOL_SOCKET, SO_RCVTIMEO, (char *) & timeVal, sizeof (struct timeval)); + break; + } + + case ENET_SOCKOPT_SNDTIMEO: + { + struct timeval timeVal; + timeVal.tv_sec = value / 1000; + timeVal.tv_usec = (value % 1000) * 1000; + result = setsockopt (socket, SOL_SOCKET, SO_SNDTIMEO, (char *) & timeVal, sizeof (struct timeval)); + break; + } + + case ENET_SOCKOPT_NODELAY: + result = setsockopt (socket, IPPROTO_TCP, TCP_NODELAY, (char *) & value, sizeof (int)); + break; + + case ENET_SOCKOPT_TTL: + result = setsockopt (socket, IPPROTO_IP, IP_TTL, (char *) & value, sizeof (int)); + break; + + default: + break; + } + return result == -1 ? -1 : 0; +} + +int +enet_socket_get_option (ENetSocket socket, ENetSocketOption option, int * value) +{ + int result = -1; + socklen_t len; + switch (option) + { + case ENET_SOCKOPT_ERROR: + len = sizeof (int); + result = getsockopt (socket, SOL_SOCKET, SO_ERROR, value, & len); + break; + + case ENET_SOCKOPT_TTL: + len = sizeof (int); + result = getsockopt (socket, IPPROTO_IP, IP_TTL, (char *) value, & len); + break; + + default: + break; + } + return result == -1 ? -1 : 0; +} + +int +enet_socket_connect (ENetSocket socket, const ENetAddress * address) +{ + struct sockaddr_in sin; + int result; + + memset (& sin, 0, sizeof (struct sockaddr_in)); + + sin.sin_family = AF_INET; + sin.sin_port = ENET_HOST_TO_NET_16 (address -> port); + sin.sin_addr.s_addr = address -> host; + + result = connect (socket, (struct sockaddr *) & sin, sizeof (struct sockaddr_in)); + if (result == -1 && errno == EINPROGRESS) + return 0; + + return result; +} + +ENetSocket +enet_socket_accept (ENetSocket socket, ENetAddress * address) +{ + int result; + struct sockaddr_in sin; + socklen_t sinLength = sizeof (struct sockaddr_in); + + result = accept (socket, + address != NULL ? (struct sockaddr *) & sin : NULL, + address != NULL ? & sinLength : NULL); + + if (result == -1) + return ENET_SOCKET_NULL; + + if (address != NULL) + { + address -> host = (enet_uint32) sin.sin_addr.s_addr; + address -> port = ENET_NET_TO_HOST_16 (sin.sin_port); + } + + return result; +} + +int +enet_socket_shutdown (ENetSocket socket, ENetSocketShutdown how) +{ + return shutdown (socket, (int) how); +} + +void +enet_socket_destroy (ENetSocket socket) +{ + if (socket != -1) + close (socket); +} + +int +enet_socket_send (ENetSocket socket, + const ENetAddress * address, + const ENetBuffer * buffers, + size_t bufferCount) +{ + struct msghdr msgHdr; + struct sockaddr_in sin; + int sentLength; + + memset (& msgHdr, 0, sizeof (struct msghdr)); + + if (address != NULL) + { + memset (& sin, 0, sizeof (struct sockaddr_in)); + + sin.sin_family = AF_INET; + sin.sin_port = ENET_HOST_TO_NET_16 (address -> port); + sin.sin_addr.s_addr = address -> host; + + msgHdr.msg_name = & sin; + msgHdr.msg_namelen = sizeof (struct sockaddr_in); + } + + msgHdr.msg_iov = (struct iovec *) buffers; + msgHdr.msg_iovlen = bufferCount; + + sentLength = sendmsg (socket, & msgHdr, MSG_NOSIGNAL); + + if (sentLength == -1) + { + if (errno == EWOULDBLOCK) + return 0; + + return -1; + } + + return sentLength; +} + +int +enet_socket_receive (ENetSocket socket, + ENetAddress * address, + ENetBuffer * buffers, + size_t bufferCount) +{ + struct msghdr msgHdr; + struct sockaddr_in sin; + int recvLength; + + memset (& msgHdr, 0, sizeof (struct msghdr)); + + if (address != NULL) + { + msgHdr.msg_name = & sin; + msgHdr.msg_namelen = sizeof (struct sockaddr_in); + } + + msgHdr.msg_iov = (struct iovec *) buffers; + msgHdr.msg_iovlen = bufferCount; + + recvLength = recvmsg (socket, & msgHdr, MSG_NOSIGNAL); + + if (recvLength == -1) + { + if (errno == EWOULDBLOCK) + return 0; + + return -1; + } + +#ifdef HAS_MSGHDR_FLAGS + if (msgHdr.msg_flags & MSG_TRUNC) + return -2; +#endif + + if (address != NULL) + { + address -> host = (enet_uint32) sin.sin_addr.s_addr; + address -> port = ENET_NET_TO_HOST_16 (sin.sin_port); + } + + return recvLength; +} + +int +enet_socketset_select (ENetSocket maxSocket, ENetSocketSet * readSet, ENetSocketSet * writeSet, enet_uint32 timeout) +{ + struct timeval timeVal; + + timeVal.tv_sec = timeout / 1000; + timeVal.tv_usec = (timeout % 1000) * 1000; + + return select (maxSocket + 1, readSet, writeSet, NULL, & timeVal); +} + +int +enet_socket_wait (ENetSocket socket, enet_uint32 * condition, enet_uint32 timeout) +{ +#ifdef HAS_POLL + struct pollfd pollSocket; + int pollCount; + + pollSocket.fd = socket; + pollSocket.events = 0; + + if (* condition & ENET_SOCKET_WAIT_SEND) + pollSocket.events |= POLLOUT; + + if (* condition & ENET_SOCKET_WAIT_RECEIVE) + pollSocket.events |= POLLIN; + + pollCount = poll (& pollSocket, 1, timeout); + + if (pollCount < 0) + { + if (errno == EINTR && * condition & ENET_SOCKET_WAIT_INTERRUPT) + { + * condition = ENET_SOCKET_WAIT_INTERRUPT; + + return 0; + } + + return -1; + } + + * condition = ENET_SOCKET_WAIT_NONE; + + if (pollCount == 0) + return 0; + + if (pollSocket.revents & POLLOUT) + * condition |= ENET_SOCKET_WAIT_SEND; + + if (pollSocket.revents & POLLIN) + * condition |= ENET_SOCKET_WAIT_RECEIVE; + + return 0; +#else + fd_set readSet, writeSet; + struct timeval timeVal; + int selectCount; + + timeVal.tv_sec = timeout / 1000; + timeVal.tv_usec = (timeout % 1000) * 1000; + + FD_ZERO (& readSet); + FD_ZERO (& writeSet); + + if (* condition & ENET_SOCKET_WAIT_SEND) + FD_SET (socket, & writeSet); + + if (* condition & ENET_SOCKET_WAIT_RECEIVE) + FD_SET (socket, & readSet); + + selectCount = select (socket + 1, & readSet, & writeSet, NULL, & timeVal); + + if (selectCount < 0) + { + if (errno == EINTR && * condition & ENET_SOCKET_WAIT_INTERRUPT) + { + * condition = ENET_SOCKET_WAIT_INTERRUPT; + + return 0; + } + + return -1; + } + + * condition = ENET_SOCKET_WAIT_NONE; + + if (selectCount == 0) + return 0; + + if (FD_ISSET (socket, & writeSet)) + * condition |= ENET_SOCKET_WAIT_SEND; + + if (FD_ISSET (socket, & readSet)) + * condition |= ENET_SOCKET_WAIT_RECEIVE; + + return 0; +#endif +} + +#endif + diff --git a/thirdparty/enet/win32.c b/thirdparty/enet/win32.c new file mode 100644 index 0000000..f395c09 --- /dev/null +++ b/thirdparty/enet/win32.c @@ -0,0 +1,454 @@ +/** + @file win32.c + @brief ENet Win32 system specific functions +*/ +#ifdef _WIN32 + +#define ENET_BUILDING_LIB 1 +#include "enet/enet.h" +#include +#include +#include + +static enet_uint32 timeBase = 0; + +int +enet_initialize (void) +{ + WORD versionRequested = MAKEWORD (1, 1); + WSADATA wsaData; + + if (WSAStartup (versionRequested, & wsaData)) + return -1; + + if (LOBYTE (wsaData.wVersion) != 1|| + HIBYTE (wsaData.wVersion) != 1) + { + WSACleanup (); + + return -1; + } + + timeBeginPeriod (1); + + return 0; +} + +void +enet_deinitialize (void) +{ + timeEndPeriod (1); + + WSACleanup (); +} + +enet_uint32 +enet_host_random_seed (void) +{ + return (enet_uint32) timeGetTime (); +} + +enet_uint32 +enet_time_get (void) +{ + return (enet_uint32) timeGetTime () - timeBase; +} + +void +enet_time_set (enet_uint32 newTimeBase) +{ + timeBase = (enet_uint32) timeGetTime () - newTimeBase; +} + +int +enet_address_set_host_ip (ENetAddress * address, const char * name) +{ + enet_uint8 vals [4] = { 0, 0, 0, 0 }; + int i; + + for (i = 0; i < 4; ++ i) + { + const char * next = name + 1; + if (* name != '0') + { + long val = strtol (name, (char **) & next, 10); + if (val < 0 || val > 255 || next == name || next - name > 3) + return -1; + vals [i] = (enet_uint8) val; + } + + if (* next != (i < 3 ? '.' : '\0')) + return -1; + name = next + 1; + } + + memcpy (& address -> host, vals, sizeof (enet_uint32)); + return 0; +} + +int +enet_address_set_host (ENetAddress * address, const char * name) +{ + struct hostent * hostEntry; + + hostEntry = gethostbyname (name); + if (hostEntry == NULL || + hostEntry -> h_addrtype != AF_INET) + return enet_address_set_host_ip (address, name); + + address -> host = * (enet_uint32 *) hostEntry -> h_addr_list [0]; + + return 0; +} + +int +enet_address_get_host_ip (const ENetAddress * address, char * name, size_t nameLength) +{ + char * addr = inet_ntoa (* (struct in_addr *) & address -> host); + if (addr == NULL) + return -1; + else + { + size_t addrLen = strlen(addr); + if (addrLen >= nameLength) + return -1; + memcpy (name, addr, addrLen + 1); + } + return 0; +} + +int +enet_address_get_host (const ENetAddress * address, char * name, size_t nameLength) +{ + struct in_addr in; + struct hostent * hostEntry; + + in.s_addr = address -> host; + + hostEntry = gethostbyaddr ((char *) & in, sizeof (struct in_addr), AF_INET); + if (hostEntry == NULL) + return enet_address_get_host_ip (address, name, nameLength); + else + { + size_t hostLen = strlen (hostEntry -> h_name); + if (hostLen >= nameLength) + return -1; + memcpy (name, hostEntry -> h_name, hostLen + 1); + } + + return 0; +} + +int +enet_socket_bind (ENetSocket socket, const ENetAddress * address) +{ + struct sockaddr_in sin; + + memset (& sin, 0, sizeof (struct sockaddr_in)); + + sin.sin_family = AF_INET; + + if (address != NULL) + { + sin.sin_port = ENET_HOST_TO_NET_16 (address -> port); + sin.sin_addr.s_addr = address -> host; + } + else + { + sin.sin_port = 0; + sin.sin_addr.s_addr = INADDR_ANY; + } + + return bind (socket, + (struct sockaddr *) & sin, + sizeof (struct sockaddr_in)) == SOCKET_ERROR ? -1 : 0; +} + +int +enet_socket_get_address (ENetSocket socket, ENetAddress * address) +{ + struct sockaddr_in sin; + int sinLength = sizeof (struct sockaddr_in); + + if (getsockname (socket, (struct sockaddr *) & sin, & sinLength) == -1) + return -1; + + address -> host = (enet_uint32) sin.sin_addr.s_addr; + address -> port = ENET_NET_TO_HOST_16 (sin.sin_port); + + return 0; +} + +int +enet_socket_listen (ENetSocket socket, int backlog) +{ + return listen (socket, backlog < 0 ? SOMAXCONN : backlog) == SOCKET_ERROR ? -1 : 0; +} + +ENetSocket +enet_socket_create (ENetSocketType type) +{ + return socket (PF_INET, type == ENET_SOCKET_TYPE_DATAGRAM ? SOCK_DGRAM : SOCK_STREAM, 0); +} + +int +enet_socket_set_option (ENetSocket socket, ENetSocketOption option, int value) +{ + int result = SOCKET_ERROR; + switch (option) + { + case ENET_SOCKOPT_NONBLOCK: + { + u_long nonBlocking = (u_long) value; + result = ioctlsocket (socket, FIONBIO, & nonBlocking); + break; + } + + case ENET_SOCKOPT_BROADCAST: + result = setsockopt (socket, SOL_SOCKET, SO_BROADCAST, (char *) & value, sizeof (int)); + break; + + case ENET_SOCKOPT_REUSEADDR: + result = setsockopt (socket, SOL_SOCKET, SO_REUSEADDR, (char *) & value, sizeof (int)); + break; + + case ENET_SOCKOPT_RCVBUF: + result = setsockopt (socket, SOL_SOCKET, SO_RCVBUF, (char *) & value, sizeof (int)); + break; + + case ENET_SOCKOPT_SNDBUF: + result = setsockopt (socket, SOL_SOCKET, SO_SNDBUF, (char *) & value, sizeof (int)); + break; + + case ENET_SOCKOPT_RCVTIMEO: + result = setsockopt (socket, SOL_SOCKET, SO_RCVTIMEO, (char *) & value, sizeof (int)); + break; + + case ENET_SOCKOPT_SNDTIMEO: + result = setsockopt (socket, SOL_SOCKET, SO_SNDTIMEO, (char *) & value, sizeof (int)); + break; + + case ENET_SOCKOPT_NODELAY: + result = setsockopt (socket, IPPROTO_TCP, TCP_NODELAY, (char *) & value, sizeof (int)); + break; + + case ENET_SOCKOPT_TTL: + result = setsockopt (socket, IPPROTO_IP, IP_TTL, (char *) & value, sizeof (int)); + break; + + default: + break; + } + return result == SOCKET_ERROR ? -1 : 0; +} + +int +enet_socket_get_option (ENetSocket socket, ENetSocketOption option, int * value) +{ + int result = SOCKET_ERROR, len; + switch (option) + { + case ENET_SOCKOPT_ERROR: + len = sizeof(int); + result = getsockopt (socket, SOL_SOCKET, SO_ERROR, (char *) value, & len); + break; + + case ENET_SOCKOPT_TTL: + len = sizeof(int); + result = getsockopt (socket, IPPROTO_IP, IP_TTL, (char *) value, & len); + break; + + default: + break; + } + return result == SOCKET_ERROR ? -1 : 0; +} + +int +enet_socket_connect (ENetSocket socket, const ENetAddress * address) +{ + struct sockaddr_in sin; + int result; + + memset (& sin, 0, sizeof (struct sockaddr_in)); + + sin.sin_family = AF_INET; + sin.sin_port = ENET_HOST_TO_NET_16 (address -> port); + sin.sin_addr.s_addr = address -> host; + + result = connect (socket, (struct sockaddr *) & sin, sizeof (struct sockaddr_in)); + if (result == SOCKET_ERROR && WSAGetLastError () != WSAEWOULDBLOCK) + return -1; + + return 0; +} + +ENetSocket +enet_socket_accept (ENetSocket socket, ENetAddress * address) +{ + SOCKET result; + struct sockaddr_in sin; + int sinLength = sizeof (struct sockaddr_in); + + result = accept (socket, + address != NULL ? (struct sockaddr *) & sin : NULL, + address != NULL ? & sinLength : NULL); + + if (result == INVALID_SOCKET) + return ENET_SOCKET_NULL; + + if (address != NULL) + { + address -> host = (enet_uint32) sin.sin_addr.s_addr; + address -> port = ENET_NET_TO_HOST_16 (sin.sin_port); + } + + return result; +} + +int +enet_socket_shutdown (ENetSocket socket, ENetSocketShutdown how) +{ + return shutdown (socket, (int) how) == SOCKET_ERROR ? -1 : 0; +} + +void +enet_socket_destroy (ENetSocket socket) +{ + if (socket != INVALID_SOCKET) + closesocket (socket); +} + +int +enet_socket_send (ENetSocket socket, + const ENetAddress * address, + const ENetBuffer * buffers, + size_t bufferCount) +{ + struct sockaddr_in sin; + DWORD sentLength = 0; + + if (address != NULL) + { + memset (& sin, 0, sizeof (struct sockaddr_in)); + + sin.sin_family = AF_INET; + sin.sin_port = ENET_HOST_TO_NET_16 (address -> port); + sin.sin_addr.s_addr = address -> host; + } + + if (WSASendTo (socket, + (LPWSABUF) buffers, + (DWORD) bufferCount, + & sentLength, + 0, + address != NULL ? (struct sockaddr *) & sin : NULL, + address != NULL ? sizeof (struct sockaddr_in) : 0, + NULL, + NULL) == SOCKET_ERROR) + { + if (WSAGetLastError () == WSAEWOULDBLOCK) + return 0; + + return -1; + } + + return (int) sentLength; +} + +int +enet_socket_receive (ENetSocket socket, + ENetAddress * address, + ENetBuffer * buffers, + size_t bufferCount) +{ + INT sinLength = sizeof (struct sockaddr_in); + DWORD flags = 0, + recvLength = 0; + struct sockaddr_in sin; + + if (WSARecvFrom (socket, + (LPWSABUF) buffers, + (DWORD) bufferCount, + & recvLength, + & flags, + address != NULL ? (struct sockaddr *) & sin : NULL, + address != NULL ? & sinLength : NULL, + NULL, + NULL) == SOCKET_ERROR) + { + switch (WSAGetLastError ()) + { + case WSAEWOULDBLOCK: + case WSAECONNRESET: + return 0; + case WSAEMSGSIZE: + return -2; + } + + return -1; + } + + if (flags & MSG_PARTIAL) + return -2; + + if (address != NULL) + { + address -> host = (enet_uint32) sin.sin_addr.s_addr; + address -> port = ENET_NET_TO_HOST_16 (sin.sin_port); + } + + return (int) recvLength; +} + +int +enet_socketset_select (ENetSocket maxSocket, ENetSocketSet * readSet, ENetSocketSet * writeSet, enet_uint32 timeout) +{ + struct timeval timeVal; + + timeVal.tv_sec = timeout / 1000; + timeVal.tv_usec = (timeout % 1000) * 1000; + + return select (maxSocket + 1, readSet, writeSet, NULL, & timeVal); +} + +int +enet_socket_wait (ENetSocket socket, enet_uint32 * condition, enet_uint32 timeout) +{ + fd_set readSet, writeSet; + struct timeval timeVal; + int selectCount; + + timeVal.tv_sec = timeout / 1000; + timeVal.tv_usec = (timeout % 1000) * 1000; + + FD_ZERO (& readSet); + FD_ZERO (& writeSet); + + if (* condition & ENET_SOCKET_WAIT_SEND) + FD_SET (socket, & writeSet); + + if (* condition & ENET_SOCKET_WAIT_RECEIVE) + FD_SET (socket, & readSet); + + selectCount = select (socket + 1, & readSet, & writeSet, NULL, & timeVal); + + if (selectCount < 0) + return -1; + + * condition = ENET_SOCKET_WAIT_NONE; + + if (selectCount == 0) + return 0; + + if (FD_ISSET (socket, & writeSet)) + * condition |= ENET_SOCKET_WAIT_SEND; + + if (FD_ISSET (socket, & readSet)) + * condition |= ENET_SOCKET_WAIT_RECEIVE; + + return 0; +} + +#endif + diff --git a/vcpkg-configuration.json b/vcpkg-configuration.json new file mode 100644 index 0000000..abf55f7 --- /dev/null +++ b/vcpkg-configuration.json @@ -0,0 +1,7 @@ +{ + "default-registry": { + "kind": "git", + "baseline": "9e593bb18ea69cc5095e012465dcd675a822ed0d", + "repository": "https://github.com/microsoft/vcpkg" + } +} \ No newline at end of file diff --git a/vcpkg.json b/vcpkg.json new file mode 100644 index 0000000..340ae53 --- /dev/null +++ b/vcpkg.json @@ -0,0 +1,7 @@ +{ + "name": "disasterserver", + "version": "0.0.1", + "dependencies": [ + "boost-bind" + ] +} \ No newline at end of file From 04f8025fbe345a261970658beb0a494a0fa7eb64 Mon Sep 17 00:00:00 2001 From: FakerNull0 Date: Tue, 8 Sep 2026 09:55:41 +0300 Subject: [PATCH 22/61] init --- .envrc | 1 + .gitignore | 7 + .gitmodules | 6 + CMakeLists.txt | 69 + CMakePresets.json | 111 + CppProperties.json | 21 + LICENSE.md | 7 + README.md | 7 + build_android.sh | 30 + disasterserver/CMakeLists.txt | 135 + disasterserver/Client.cpp | 187 + disasterserver/Client.hpp | 175 + disasterserver/Core/Api.hpp | 11 + disasterserver/Core/Colors.hpp | 18 + disasterserver/Core/Exceptions.hpp | 24 + disasterserver/Core/Log.cpp | 193 + disasterserver/Core/Log.hpp | 126 + disasterserver/Core/Packet.cpp | 108 + disasterserver/Core/Packet.hpp | 385 + disasterserver/Core/Singleton.hpp | 22 + disasterserver/Core/Time.cpp | 48 + disasterserver/Core/Time.hpp | 14 + disasterserver/GameStateController.cpp | 212 + disasterserver/GameStateController.hpp | 64 + disasterserver/Main.cpp | 32 + disasterserver/Server.cpp | 232 + disasterserver/Server.hpp | 62 + disasterserver/States/CharSelect.cpp | 259 + disasterserver/States/CharSelect.hpp | 46 + disasterserver/States/LobbyState.cpp | 485 + disasterserver/States/LobbyState.hpp | 51 + disasterserver/States/Vote.cpp | 64 + disasterserver/States/Vote.hpp | 52 + disasterserver_c/Android.c | 15 + disasterserver_c/Android.h | 20 + disasterserver_c/Api.h | 10 + disasterserver_c/Auth.c | 102 + disasterserver_c/Auth.h | 19 + disasterserver_c/CMakeLists.txt | 174 + disasterserver_c/CMath.c | 21 + disasterserver_c/CMath.h | 17 + disasterserver_c/Colors.h | 16 + disasterserver_c/Config.c | 446 + disasterserver_c/Config.h | 65 + disasterserver_c/DyList.c | 79 + disasterserver_c/DyList.h | 17 + disasterserver_c/Lib.c | 272 + disasterserver_c/Lib.h | 59 + disasterserver_c/Log.c | 155 + disasterserver_c/Log.h | 65 + disasterserver_c/Main.c | 10 + disasterserver_c/Maps.c | 97 + disasterserver_c/Maps.h | 32 + disasterserver_c/Packet.c | 480 + disasterserver_c/Packet.h | 220 + disasterserver_c/Palette.c | 203 + disasterserver_c/Palette.h | 9 + disasterserver_c/Player.c | 42 + disasterserver_c/Player.h | 83 + disasterserver_c/Server.c | 966 + disasterserver_c/Server.h | 216 + disasterserver_c/States.h | 75 + disasterserver_c/UTF8.c | 76 + disasterserver_c/UTF8.h | 12 + disasterserver_c/Vote.c | 58 + disasterserver_c/Vote.h | 35 + disasterserver_c/Zone.c | 1392 ++ disasterserver_c/Zone.h | 14 + disasterserver_c/cJSON.c | 3119 +++ disasterserver_c/cJSON.h | 300 + disasterserver_c/entities/Act9Wall.c | 89 + disasterserver_c/entities/Act9Wall.h | 17 + disasterserver_c/entities/BlackRing.c | 35 + disasterserver_c/entities/BlackRing.h | 16 + disasterserver_c/entities/CreamRing.c | 34 + disasterserver_c/entities/CreamRing.h | 17 + disasterserver_c/entities/DTBall.c | 29 + disasterserver_c/entities/DTBall.h | 16 + disasterserver_c/entities/DTStalactits.c | 113 + disasterserver_c/entities/DTStalactits.h | 23 + disasterserver_c/entities/Dummy.c | 24 + disasterserver_c/entities/Dummy.h | 17 + disasterserver_c/entities/EggmanTracker.c | 28 + disasterserver_c/entities/EggmanTracker.h | 16 + disasterserver_c/entities/ExellerClone.c | 23 + disasterserver_c/entities/ExellerClone.h | 17 + disasterserver_c/entities/HDDoor.c | 42 + disasterserver_c/entities/HDDoor.h | 18 + disasterserver_c/entities/HillThunder.c | 30 + disasterserver_c/entities/HillThunder.h | 16 + disasterserver_c/entities/KAFSpeedBox.c | 55 + disasterserver_c/entities/KAFSpeedBox.h | 20 + disasterserver_c/entities/LCChain.c | 55 + disasterserver_c/entities/LCChain.h | 22 + disasterserver_c/entities/LCEye.c | 51 + disasterserver_c/entities/LCEye.h | 25 + disasterserver_c/entities/MJAss.c | 22 + disasterserver_c/entities/MJAss.h | 16 + disasterserver_c/entities/MJJudger.c | 42 + disasterserver_c/entities/MJJudger.h | 21 + disasterserver_c/entities/MJLava.c | 92 + disasterserver_c/entities/MJLava.h | 27 + disasterserver_c/entities/NAPIce.c | 40 + disasterserver_c/entities/NAPIce.h | 20 + disasterserver_c/entities/NAPSnowball.c | 104 + disasterserver_c/entities/NAPSnowball.h | 31 + disasterserver_c/entities/NotPerfect.c | 58 + disasterserver_c/entities/NotPerfect.h | 22 + disasterserver_c/entities/PFLift.c | 89 + disasterserver_c/entities/PFLift.h | 24 + disasterserver_c/entities/RMZShard.c | 16 + disasterserver_c/entities/RMZShard.h | 15 + disasterserver_c/entities/RMZSlug.c | 156 + disasterserver_c/entities/RMZSlug.h | 45 + disasterserver_c/entities/Ring.c | 54 + disasterserver_c/entities/Ring.h | 17 + disasterserver_c/entities/SpkieController.c | 24 + disasterserver_c/entities/SpkieController.h | 16 + disasterserver_c/entities/TCAcid.c | 25 + disasterserver_c/entities/TCAcid.h | 17 + disasterserver_c/entities/TailsDoll.c | 251 + disasterserver_c/entities/TailsDoll.h | 25 + disasterserver_c/entities/TailsProjectile.c | 65 + disasterserver_c/entities/TailsProjectile.h | 23 + disasterserver_c/entities/VVLava.c | 93 + disasterserver_c/entities/VVLava.h | 28 + disasterserver_c/entities/VVVase.h | 14 + disasterserver_c/entities/WDLatern.c | 42 + disasterserver_c/entities/WDLatern.h | 19 + disasterserver_c/entities/YouCantRun.c | 49 + disasterserver_c/entities/YouCantRun.h | 22 + disasterserver_c/io/Dir.h | 12 + disasterserver_c/io/Packet.c | 440 + disasterserver_c/io/Packet.h | 209 + disasterserver_c/io/Socket.h | 35 + disasterserver_c/io/TcpListener.c | 90 + disasterserver_c/io/TcpListener.h | 51 + disasterserver_c/io/Threads.h | 54 + disasterserver_c/io/Time.c | 49 + disasterserver_c/io/Time.h | 15 + disasterserver_c/io/UdpListener.c | 30 + disasterserver_c/io/UdpListener.h | 34 + disasterserver_c/maps/Act9.c | 14 + disasterserver_c/maps/Act9.h | 7 + disasterserver_c/maps/DarkTower.c | 58 + disasterserver_c/maps/DarkTower.h | 8 + disasterserver_c/maps/DotDotDot.c | 12 + disasterserver_c/maps/DotDotDot.h | 7 + disasterserver_c/maps/FartZone.c | 45 + disasterserver_c/maps/FartZone.h | 8 + disasterserver_c/maps/HauntingDream.c | 34 + disasterserver_c/maps/HauntingDream.h | 8 + disasterserver_c/maps/HideAndSeek.c | 10 + disasterserver_c/maps/HideAndSeek2.h | 7 + disasterserver_c/maps/Hill.c | 14 + disasterserver_c/maps/Hill.h | 7 + disasterserver_c/maps/KindAndFair.c | 39 + disasterserver_c/maps/KindAndFair.h | 8 + disasterserver_c/maps/LimpCity.c | 65 + disasterserver_c/maps/LimpCity.h | 8 + disasterserver_c/maps/MajinForest.c | 9 + disasterserver_c/maps/MajinForest.h | 7 + disasterserver_c/maps/Marijuna.c | 16 + disasterserver_c/maps/Marijuna.h | 7 + disasterserver_c/maps/NastyParadise.c | 72 + disasterserver_c/maps/NastyParadise.h | 8 + disasterserver_c/maps/NotPerfect.c | 11 + disasterserver_c/maps/NotPerfect.h | 7 + disasterserver_c/maps/PricelessFreedom.c | 48 + disasterserver_c/maps/PricelessFreedom.h | 8 + disasterserver_c/maps/RavineMist.c | 213 + disasterserver_c/maps/RavineMist.h | 10 + disasterserver_c/maps/TortureCave.c | 11 + disasterserver_c/maps/TortureCave.h | 7 + disasterserver_c/maps/VolcanoValley.c | 61 + disasterserver_c/maps/VolcanoValley.h | 8 + disasterserver_c/maps/WoodDream.c | 10 + disasterserver_c/maps/WoodDream.h | 7 + disasterserver_c/maps/YouCantRun.c | 14 + disasterserver_c/maps/YouCantRun.h | 7 + disasterserver_c/states/CharSelect.c | 296 + disasterserver_c/states/Game.c | 1809 ++ disasterserver_c/states/Lobby.c | 694 + disasterserver_c/states/Mapvote.c | 261 + disasterserver_c/states/Results.c | 243 + disasterserver_c/ui/Button.c | 40 + disasterserver_c/ui/Components.h | 138 + disasterserver_c/ui/Image.c | 12 + disasterserver_c/ui/Label.c | 185 + disasterserver_c/ui/Main.c | 594 + disasterserver_c/ui/Main.h | 15 + disasterserver_c/ui/MapList.c | 77 + disasterserver_c/ui/MapListPreset.c | 71 + disasterserver_c/ui/PingPreset.c | 113 + disasterserver_c/ui/PlayerList.c | 261 + disasterserver_c/ui/Presets.c | 16 + disasterserver_c/ui/Presets.h | 19 + disasterserver_c/ui/Resources.c | 31 + disasterserver_c/ui/Resources.h | 17 + disasterserver_c/ui/Spritesheet.h | 17954 ++++++++++++++++++ disasterserver_c/ui/TButton.c | 52 + resources/Spritesheet.png | Bin 0 -> 215407 bytes resources/icon.ico | Bin 0 -> 204862 bytes resources/icon.rc | 1 + resources/isiskdjdnd.png | Bin 0 -> 804 bytes shell.nix | 5 + thirdparty/cjson/CMakeLists.txt | 8 + thirdparty/cjson/cJSON.c | 3191 ++++ thirdparty/cjson/cJSON.h | 308 + thirdparty/cjson/cJSON_Utils.c | 1481 ++ thirdparty/cjson/cJSON_Utils.h | 88 + thirdparty/enet/.github/workflows/cmake.yml | 21 + thirdparty/enet/CMakeLists.txt | 103 + thirdparty/enet/ChangeLog | 209 + thirdparty/enet/Doxyfile | 2303 +++ thirdparty/enet/DoxygenLayout.xml | 191 + thirdparty/enet/LICENSE | 7 + thirdparty/enet/Makefile.am | 22 + thirdparty/enet/README | 15 + thirdparty/enet/callbacks.c | 53 + thirdparty/enet/compress.c | 654 + thirdparty/enet/configure.ac | 28 + thirdparty/enet/docs/FAQ.dox | 24 + thirdparty/enet/docs/design.dox | 126 + thirdparty/enet/docs/install.dox | 63 + thirdparty/enet/docs/license.dox | 26 + thirdparty/enet/docs/mainpage.dox | 59 + thirdparty/enet/docs/tutorial.dox | 366 + thirdparty/enet/enet.dsp | 168 + thirdparty/enet/enet_dll.cbp | 86 + thirdparty/enet/host.c | 503 + thirdparty/enet/include/enet/callbacks.h | 27 + thirdparty/enet/include/enet/enet.h | 616 + thirdparty/enet/include/enet/list.h | 43 + thirdparty/enet/include/enet/protocol.h | 198 + thirdparty/enet/include/enet/time.h | 18 + thirdparty/enet/include/enet/types.h | 13 + thirdparty/enet/include/enet/unix.h | 48 + thirdparty/enet/include/enet/utility.h | 13 + thirdparty/enet/include/enet/win32.h | 59 + thirdparty/enet/libenet.pc.in | 10 + thirdparty/enet/list.c | 75 + thirdparty/enet/m4/.keep | 0 thirdparty/enet/packet.c | 158 + thirdparty/enet/peer.c | 1027 + thirdparty/enet/premake4.lua | 59 + thirdparty/enet/protocol.c | 1919 ++ thirdparty/enet/unix.c | 624 + thirdparty/enet/win32.c | 454 + vcpkg-configuration.json | 7 + vcpkg.json | 7 + 251 files changed, 55028 insertions(+) create mode 100644 .envrc create mode 100644 .gitignore create mode 100644 .gitmodules create mode 100644 CMakeLists.txt create mode 100644 CMakePresets.json create mode 100644 CppProperties.json create mode 100644 LICENSE.md create mode 100644 README.md create mode 100644 build_android.sh create mode 100644 disasterserver/CMakeLists.txt create mode 100644 disasterserver/Client.cpp create mode 100644 disasterserver/Client.hpp create mode 100644 disasterserver/Core/Api.hpp create mode 100644 disasterserver/Core/Colors.hpp create mode 100644 disasterserver/Core/Exceptions.hpp create mode 100644 disasterserver/Core/Log.cpp create mode 100644 disasterserver/Core/Log.hpp create mode 100644 disasterserver/Core/Packet.cpp create mode 100644 disasterserver/Core/Packet.hpp create mode 100644 disasterserver/Core/Singleton.hpp create mode 100644 disasterserver/Core/Time.cpp create mode 100644 disasterserver/Core/Time.hpp create mode 100644 disasterserver/GameStateController.cpp create mode 100644 disasterserver/GameStateController.hpp create mode 100644 disasterserver/Main.cpp create mode 100644 disasterserver/Server.cpp create mode 100644 disasterserver/Server.hpp create mode 100644 disasterserver/States/CharSelect.cpp create mode 100644 disasterserver/States/CharSelect.hpp create mode 100644 disasterserver/States/LobbyState.cpp create mode 100644 disasterserver/States/LobbyState.hpp create mode 100644 disasterserver/States/Vote.cpp create mode 100644 disasterserver/States/Vote.hpp create mode 100644 disasterserver_c/Android.c create mode 100644 disasterserver_c/Android.h create mode 100644 disasterserver_c/Api.h create mode 100644 disasterserver_c/Auth.c create mode 100644 disasterserver_c/Auth.h create mode 100644 disasterserver_c/CMakeLists.txt create mode 100644 disasterserver_c/CMath.c create mode 100644 disasterserver_c/CMath.h create mode 100644 disasterserver_c/Colors.h create mode 100644 disasterserver_c/Config.c create mode 100644 disasterserver_c/Config.h create mode 100644 disasterserver_c/DyList.c create mode 100644 disasterserver_c/DyList.h create mode 100644 disasterserver_c/Lib.c create mode 100644 disasterserver_c/Lib.h create mode 100644 disasterserver_c/Log.c create mode 100644 disasterserver_c/Log.h create mode 100644 disasterserver_c/Main.c create mode 100644 disasterserver_c/Maps.c create mode 100644 disasterserver_c/Maps.h create mode 100644 disasterserver_c/Packet.c create mode 100644 disasterserver_c/Packet.h create mode 100644 disasterserver_c/Palette.c create mode 100644 disasterserver_c/Palette.h create mode 100644 disasterserver_c/Player.c create mode 100644 disasterserver_c/Player.h create mode 100644 disasterserver_c/Server.c create mode 100644 disasterserver_c/Server.h create mode 100644 disasterserver_c/States.h create mode 100644 disasterserver_c/UTF8.c create mode 100644 disasterserver_c/UTF8.h create mode 100644 disasterserver_c/Vote.c create mode 100644 disasterserver_c/Vote.h create mode 100644 disasterserver_c/Zone.c create mode 100644 disasterserver_c/Zone.h create mode 100644 disasterserver_c/cJSON.c create mode 100644 disasterserver_c/cJSON.h create mode 100644 disasterserver_c/entities/Act9Wall.c create mode 100644 disasterserver_c/entities/Act9Wall.h create mode 100644 disasterserver_c/entities/BlackRing.c create mode 100644 disasterserver_c/entities/BlackRing.h create mode 100644 disasterserver_c/entities/CreamRing.c create mode 100644 disasterserver_c/entities/CreamRing.h create mode 100644 disasterserver_c/entities/DTBall.c create mode 100644 disasterserver_c/entities/DTBall.h create mode 100644 disasterserver_c/entities/DTStalactits.c create mode 100644 disasterserver_c/entities/DTStalactits.h create mode 100644 disasterserver_c/entities/Dummy.c create mode 100644 disasterserver_c/entities/Dummy.h create mode 100644 disasterserver_c/entities/EggmanTracker.c create mode 100644 disasterserver_c/entities/EggmanTracker.h create mode 100644 disasterserver_c/entities/ExellerClone.c create mode 100644 disasterserver_c/entities/ExellerClone.h create mode 100644 disasterserver_c/entities/HDDoor.c create mode 100644 disasterserver_c/entities/HDDoor.h create mode 100644 disasterserver_c/entities/HillThunder.c create mode 100644 disasterserver_c/entities/HillThunder.h create mode 100644 disasterserver_c/entities/KAFSpeedBox.c create mode 100644 disasterserver_c/entities/KAFSpeedBox.h create mode 100644 disasterserver_c/entities/LCChain.c create mode 100644 disasterserver_c/entities/LCChain.h create mode 100644 disasterserver_c/entities/LCEye.c create mode 100644 disasterserver_c/entities/LCEye.h create mode 100644 disasterserver_c/entities/MJAss.c create mode 100644 disasterserver_c/entities/MJAss.h create mode 100644 disasterserver_c/entities/MJJudger.c create mode 100644 disasterserver_c/entities/MJJudger.h create mode 100644 disasterserver_c/entities/MJLava.c create mode 100644 disasterserver_c/entities/MJLava.h create mode 100644 disasterserver_c/entities/NAPIce.c create mode 100644 disasterserver_c/entities/NAPIce.h create mode 100644 disasterserver_c/entities/NAPSnowball.c create mode 100644 disasterserver_c/entities/NAPSnowball.h create mode 100644 disasterserver_c/entities/NotPerfect.c create mode 100644 disasterserver_c/entities/NotPerfect.h create mode 100644 disasterserver_c/entities/PFLift.c create mode 100644 disasterserver_c/entities/PFLift.h create mode 100644 disasterserver_c/entities/RMZShard.c create mode 100644 disasterserver_c/entities/RMZShard.h create mode 100644 disasterserver_c/entities/RMZSlug.c create mode 100644 disasterserver_c/entities/RMZSlug.h create mode 100644 disasterserver_c/entities/Ring.c create mode 100644 disasterserver_c/entities/Ring.h create mode 100644 disasterserver_c/entities/SpkieController.c create mode 100644 disasterserver_c/entities/SpkieController.h create mode 100644 disasterserver_c/entities/TCAcid.c create mode 100644 disasterserver_c/entities/TCAcid.h create mode 100644 disasterserver_c/entities/TailsDoll.c create mode 100644 disasterserver_c/entities/TailsDoll.h create mode 100644 disasterserver_c/entities/TailsProjectile.c create mode 100644 disasterserver_c/entities/TailsProjectile.h create mode 100644 disasterserver_c/entities/VVLava.c create mode 100644 disasterserver_c/entities/VVLava.h create mode 100644 disasterserver_c/entities/VVVase.h create mode 100644 disasterserver_c/entities/WDLatern.c create mode 100644 disasterserver_c/entities/WDLatern.h create mode 100644 disasterserver_c/entities/YouCantRun.c create mode 100644 disasterserver_c/entities/YouCantRun.h create mode 100644 disasterserver_c/io/Dir.h create mode 100644 disasterserver_c/io/Packet.c create mode 100644 disasterserver_c/io/Packet.h create mode 100644 disasterserver_c/io/Socket.h create mode 100644 disasterserver_c/io/TcpListener.c create mode 100644 disasterserver_c/io/TcpListener.h create mode 100644 disasterserver_c/io/Threads.h create mode 100644 disasterserver_c/io/Time.c create mode 100644 disasterserver_c/io/Time.h create mode 100644 disasterserver_c/io/UdpListener.c create mode 100644 disasterserver_c/io/UdpListener.h create mode 100644 disasterserver_c/maps/Act9.c create mode 100644 disasterserver_c/maps/Act9.h create mode 100644 disasterserver_c/maps/DarkTower.c create mode 100644 disasterserver_c/maps/DarkTower.h create mode 100644 disasterserver_c/maps/DotDotDot.c create mode 100644 disasterserver_c/maps/DotDotDot.h create mode 100644 disasterserver_c/maps/FartZone.c create mode 100644 disasterserver_c/maps/FartZone.h create mode 100644 disasterserver_c/maps/HauntingDream.c create mode 100644 disasterserver_c/maps/HauntingDream.h create mode 100644 disasterserver_c/maps/HideAndSeek.c create mode 100644 disasterserver_c/maps/HideAndSeek2.h create mode 100644 disasterserver_c/maps/Hill.c create mode 100644 disasterserver_c/maps/Hill.h create mode 100644 disasterserver_c/maps/KindAndFair.c create mode 100644 disasterserver_c/maps/KindAndFair.h create mode 100644 disasterserver_c/maps/LimpCity.c create mode 100644 disasterserver_c/maps/LimpCity.h create mode 100644 disasterserver_c/maps/MajinForest.c create mode 100644 disasterserver_c/maps/MajinForest.h create mode 100644 disasterserver_c/maps/Marijuna.c create mode 100644 disasterserver_c/maps/Marijuna.h create mode 100644 disasterserver_c/maps/NastyParadise.c create mode 100644 disasterserver_c/maps/NastyParadise.h create mode 100644 disasterserver_c/maps/NotPerfect.c create mode 100644 disasterserver_c/maps/NotPerfect.h create mode 100644 disasterserver_c/maps/PricelessFreedom.c create mode 100644 disasterserver_c/maps/PricelessFreedom.h create mode 100644 disasterserver_c/maps/RavineMist.c create mode 100644 disasterserver_c/maps/RavineMist.h create mode 100644 disasterserver_c/maps/TortureCave.c create mode 100644 disasterserver_c/maps/TortureCave.h create mode 100644 disasterserver_c/maps/VolcanoValley.c create mode 100644 disasterserver_c/maps/VolcanoValley.h create mode 100644 disasterserver_c/maps/WoodDream.c create mode 100644 disasterserver_c/maps/WoodDream.h create mode 100644 disasterserver_c/maps/YouCantRun.c create mode 100644 disasterserver_c/maps/YouCantRun.h create mode 100644 disasterserver_c/states/CharSelect.c create mode 100644 disasterserver_c/states/Game.c create mode 100644 disasterserver_c/states/Lobby.c create mode 100644 disasterserver_c/states/Mapvote.c create mode 100644 disasterserver_c/states/Results.c create mode 100644 disasterserver_c/ui/Button.c create mode 100644 disasterserver_c/ui/Components.h create mode 100644 disasterserver_c/ui/Image.c create mode 100644 disasterserver_c/ui/Label.c create mode 100644 disasterserver_c/ui/Main.c create mode 100644 disasterserver_c/ui/Main.h create mode 100644 disasterserver_c/ui/MapList.c create mode 100644 disasterserver_c/ui/MapListPreset.c create mode 100644 disasterserver_c/ui/PingPreset.c create mode 100644 disasterserver_c/ui/PlayerList.c create mode 100644 disasterserver_c/ui/Presets.c create mode 100644 disasterserver_c/ui/Presets.h create mode 100644 disasterserver_c/ui/Resources.c create mode 100644 disasterserver_c/ui/Resources.h create mode 100644 disasterserver_c/ui/Spritesheet.h create mode 100644 disasterserver_c/ui/TButton.c create mode 100644 resources/Spritesheet.png create mode 100644 resources/icon.ico create mode 100644 resources/icon.rc create mode 100644 resources/isiskdjdnd.png create mode 100644 shell.nix create mode 100644 thirdparty/cjson/CMakeLists.txt create mode 100644 thirdparty/cjson/cJSON.c create mode 100644 thirdparty/cjson/cJSON.h create mode 100644 thirdparty/cjson/cJSON_Utils.c create mode 100644 thirdparty/cjson/cJSON_Utils.h create mode 100644 thirdparty/enet/.github/workflows/cmake.yml create mode 100644 thirdparty/enet/CMakeLists.txt create mode 100644 thirdparty/enet/ChangeLog create mode 100644 thirdparty/enet/Doxyfile create mode 100644 thirdparty/enet/DoxygenLayout.xml create mode 100644 thirdparty/enet/LICENSE create mode 100644 thirdparty/enet/Makefile.am create mode 100644 thirdparty/enet/README create mode 100644 thirdparty/enet/callbacks.c create mode 100644 thirdparty/enet/compress.c create mode 100644 thirdparty/enet/configure.ac create mode 100644 thirdparty/enet/docs/FAQ.dox create mode 100644 thirdparty/enet/docs/design.dox create mode 100644 thirdparty/enet/docs/install.dox create mode 100644 thirdparty/enet/docs/license.dox create mode 100644 thirdparty/enet/docs/mainpage.dox create mode 100644 thirdparty/enet/docs/tutorial.dox create mode 100644 thirdparty/enet/enet.dsp create mode 100644 thirdparty/enet/enet_dll.cbp create mode 100644 thirdparty/enet/host.c create mode 100644 thirdparty/enet/include/enet/callbacks.h create mode 100644 thirdparty/enet/include/enet/enet.h create mode 100644 thirdparty/enet/include/enet/list.h create mode 100644 thirdparty/enet/include/enet/protocol.h create mode 100644 thirdparty/enet/include/enet/time.h create mode 100644 thirdparty/enet/include/enet/types.h create mode 100644 thirdparty/enet/include/enet/unix.h create mode 100644 thirdparty/enet/include/enet/utility.h create mode 100644 thirdparty/enet/include/enet/win32.h create mode 100644 thirdparty/enet/libenet.pc.in create mode 100644 thirdparty/enet/list.c create mode 100644 thirdparty/enet/m4/.keep create mode 100644 thirdparty/enet/packet.c create mode 100644 thirdparty/enet/peer.c create mode 100644 thirdparty/enet/premake4.lua create mode 100644 thirdparty/enet/protocol.c create mode 100644 thirdparty/enet/unix.c create mode 100644 thirdparty/enet/win32.c create mode 100644 vcpkg-configuration.json create mode 100644 vcpkg.json diff --git a/.envrc b/.envrc new file mode 100644 index 0000000..1d953f4 --- /dev/null +++ b/.envrc @@ -0,0 +1 @@ +use nix diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..0a52278 --- /dev/null +++ b/.gitignore @@ -0,0 +1,7 @@ +.vs/ +.vscode/ +.direnv/ +.idea/* +build/ +build_android/ +/.cache/clangd/index diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 0000000..2a011a2 --- /dev/null +++ b/.gitmodules @@ -0,0 +1,6 @@ +[submodule "thirdparty/SDL"] + path = thirdparty/SDL + url = https://github.com/MilesGlitch/SDL.git +[submodule "thirdparty/SDL_image"] + path = thirdparty/SDL_image + url = https://github.com/MilesGlitch/SDL_image.git diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000..a0e0a40 --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,69 @@ +cmake_minimum_required(VERSION 3.30) +project(DisasterServer CXX C) + +include(TestBigEndian) +TEST_BIG_ENDIAN(IS_BIG_ENDIAN) + +set(CMAKE_CXX_STANDARD 23) +set(CXX_STANDARD_REQUIRED ON) +set(CMAKE_CXX_EXTENSIONS ON) + +option(DYLIB "Builds dynamic library" OFF) +option(BUILD_UI "Builds UI using SDL" OFF) + +if(IS_BIG_ENDIAN) + add_compile_definitions(SYS_BIG_ENDIAN) +endif() + +if(DYLIB) + add_compile_definitions(SYS_DYLIB) +endif() + +if(BUILD_UI) + add_compile_definitions(SYS_USE_SDL2) +endif() + +if(ANDROID) + add_compile_definitions(SYS_ANDROID) +endif() + +if (BUILD_UI) + set(BUILD_SHARED_LIBS OFF) + set(SDL_STATIC ON) + set(SDL_SHARED OFF) + set(SDL_DISABLE_INSTALL ON) + set(SDLIMAGE_VENDORED ON) + set(SDLIMAGE_DEPS_SHARED OFF) + set(SDLIMAGE_INSTALL OFF) + set(SDLIMAGE_BACKEND_STB OFF) + set(SDLIMAGE_BACKEND_WIC OFF) + set(SDLIMAGE_BACKEND_IMAGEIO OFF) + set(SDLIMAGE_ANI OFF) + set(SDLIMAGE_PNG ON) + set(SDLIMAGE_PNG_LIBPNG OFF) + set(SDLIMAGE_AVIF OFF) + set(SDLIMAGE_BMP OFF) + set(SDLIMAGE_GIF OFF) + set(SDLIMAGE_JPG OFF) + set(SDLIMAGE_JXL OFF) + set(SDLIMAGE_LBM OFF) + set(SDLIMAGE_PCX OFF) + set(SDLIMAGE_PNM OFF) + set(SDLIMAGE_QOI OFF) + set(SDLIMAGE_SVG OFF) + set(SDLIMAGE_TGA OFF) + set(SDLIMAGE_TIF OFF) + set(SDLIMAGE_WEBP OFF) + set(SDLIMAGE_XCF OFF) + set(SDLIMAGE_XPM OFF) + set(SDLIMAGE_XV OFF) + + add_subdirectory(thirdparty/SDL) + add_subdirectory(thirdparty/SDL_image) +endif () + +add_subdirectory(thirdparty/enet) +add_subdirectory(thirdparty/cjson) + +add_subdirectory(disasterserver_c/) +add_subdirectory(disasterserver) \ No newline at end of file diff --git a/CMakePresets.json b/CMakePresets.json new file mode 100644 index 0000000..26872e5 --- /dev/null +++ b/CMakePresets.json @@ -0,0 +1,111 @@ +{ + "version": 3, + "configurePresets": [ + { + "name": "base", + "hidden": true, + "generator": "Ninja", + "toolchainFile": "$env{VCPKG_ROOT}/scripts/buildsystems/vcpkg.cmake", + "cacheVariables": { + "VCPKG_TARGET_TRIPLET": "x64-windows-static" + }, + "vendor": { + "microsoft.com/VisualStudioRemoteSettings/CMake/2.0": { + "sourceRootDir": "$ms{localSourceDir}\\..", + "remoteSourceRootDir": "$env{HOME}/.vs/wsl", + "copySourcesOptions": { + "method": "rsync", + "exclusionList": [ + ".vs", + ".git", + "out", + "dist", + "attic", + "build" + ] + } + } + } + }, + { + "inherits": "base", + "name": "windows-release", + "displayName": "Windows (Release)", + "binaryDir": "${sourceDir}/build/windows-release", + "installDir": "${sourceDir}/build/windows-release/install", + "cacheVariables": { + "CMAKE_BUILD_TYPE": "Release", + "CMAKE_C_COMPILER": "cl.exe", + "CMAKE_CXX_COMPILER": "cl.exe", + "CMAKE_MSVC_RUNTIME_LIBRARY": "MultiThreaded$<$:Debug>DLL" + }, + "vendor": { + "microsoft.com/VisualStudioSettings/CMake/1.0": { + "hostOS": [ + "Windows" + ] + } + } + }, + { + "inherits": "base", + "name": "windows-debug", + "displayName": "Windows (Debug)", + "binaryDir": "${sourceDir}/build/windows-debug", + "installDir": "${sourceDir}/build/windows-debug/install", + "cacheVariables": { + "CMAKE_BUILD_TYPE": "Debug", + "CMAKE_C_COMPILER": "cl.exe", + "CMAKE_CXX_COMPILER": "cl.exe", + "CMAKE_MSVC_RUNTIME_LIBRARY": "MultiThreaded$<$:Debug>DLL" + }, + "vendor": { + "microsoft.com/VisualStudioSettings/CMake/1.0": { + "hostOS": [ + "Windows" + ] + } + } + }, + { + "inherits": "base", + "name": "windows-clang-release", + "displayName": "Windows Clang (Release)", + "binaryDir": "${sourceDir}/build/windows-clang-release", + "installDir": "${sourceDir}/build/windows-clang-release/install", + "cacheVariables": { + "CMAKE_BUILD_TYPE": "Release", + "CMAKE_C_COMPILER": "clang.exe", + "CMAKE_CXX_COMPILER": "clang++.exe", + "CMAKE_MSVC_RUNTIME_LIBRARY": "MultiThreaded$<$:Debug>DLL" + }, + "vendor": { + "microsoft.com/VisualStudioSettings/CMake/1.0": { + "hostOS": [ + "Windows" + ] + } + } + }, + { + "inherits": "base", + "name": "windows-clang-debug", + "displayName": "Windows Clang (Debug)", + "binaryDir": "${sourceDir}/build/windows-clang-debug", + "installDir": "${sourceDir}/build/windows-clang-debug/install", + "cacheVariables": { + "CMAKE_BUILD_TYPE": "Debug", + "CMAKE_C_COMPILER": "clang.exe", + "CMAKE_CXX_COMPILER": "clang++.exe", + "CMAKE_MSVC_RUNTIME_LIBRARY": "MultiThreaded$<$:Debug>DLL" + }, + "vendor": { + "microsoft.com/VisualStudioSettings/CMake/1.0": { + "hostOS": [ + "Windows" + ] + } + } + } + ] +} \ No newline at end of file diff --git a/CppProperties.json b/CppProperties.json new file mode 100644 index 0000000..f598ba5 --- /dev/null +++ b/CppProperties.json @@ -0,0 +1,21 @@ +{ + "configurations": [ + { + "inheritEnvironments": [ + "msvc_x64" + ], + "name": "x64-Debug", + "includePath": [ + "${env.INCLUDE}", + "${workspaceRoot}\\**" + ], + "defines": [ + "WIN32", + "_DEBUG", + "UNICODE", + "_UNICODE" + ], + "intelliSenseMode": "windows-msvc-x64" + } + ] +} \ No newline at end of file diff --git a/LICENSE.md b/LICENSE.md new file mode 100644 index 0000000..5d3c2c9 --- /dev/null +++ b/LICENSE.md @@ -0,0 +1,7 @@ +Copyright 2024 Team Exe Empire + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/README.md b/README.md new file mode 100644 index 0000000..4c66027 --- /dev/null +++ b/README.md @@ -0,0 +1,7 @@ +# DisasterServer + +## Building source +```bash +git clone --recursive https://github.com/AX88M2/DisasterServer.git +cmake -S . -B build && cmake --build build +``` \ No newline at end of file diff --git a/build_android.sh b/build_android.sh new file mode 100644 index 0000000..0862a50 --- /dev/null +++ b/build_android.sh @@ -0,0 +1,30 @@ +# SDK +SDK="$LOCALAPPDATA/Android/Sdk" +NDK_VERSION="25.2.9519653" +CMAKE_VERSION="3.22.1" + +# Android +PLATFORM="android-19" +declare -a ABI=("armeabi-v7a" "arm64-v8a" "x86_64") + +if [ "$(expr substr $(uname -s) 1 5)" == "Linux" ]; then + OS_TYPE="linux-x86_64" + FILE_EXT="" +elif [ "$(expr substr $(uname -s) 1 10)" == "MINGW64_NT" ]; then + OS_TYPE="windows-x86_64" + FILE_EXT=".exe" +fi + +NDK="${SDK}/ndk/${NDK_VERSION}" +CMAKE="${SDK}/cmake/${CMAKE_VERSION}/bin/cmake${FILE_EXT}" +MAKE="${NDK}/prebuilt/${OS_TYPE}/bin/make${FILE_EXT}" +TOOLCHAIN="${NDK}/build/cmake/android.toolchain.cmake" + +echo "$CMAKE" + +for i in "${ABI[@]}" +do + echo "[] Building for $i..." + "${CMAKE}" -DCMAKE_TOOLCHAIN_FILE="${TOOLCHAIN}" -DANDROID_NDK="${NDK}" -DANDROID_ABI="$i" -DANDROID_PLATFORM="${PLATFORM}" -DCMAKE_MAKE_PROGRAM="${MAKE}" -G "Unix Makefiles" -B"build_android/$i" -H. + (cd "build_android/$i" && "${MAKE}" -j $(nproc)) +done \ No newline at end of file diff --git a/disasterserver/CMakeLists.txt b/disasterserver/CMakeLists.txt new file mode 100644 index 0000000..70ecefe --- /dev/null +++ b/disasterserver/CMakeLists.txt @@ -0,0 +1,135 @@ +set(COMPILER_OPTIONS + $<$: + /utf-8 + /MP + /W4 + /wd4100 # unreferenced formal parameter + /wd4457 # declaration of 'var' hides function parameter + /wd4458 # declaration of 'var' hides class member + /wd4459 # declaration of 'var' hides global declaration + /wd4101 # 'var': unreferenced local variable + /wd4388 # 'token' : signed/unsigned mismatch + /wd4018 # '>': signed/unsigned mismatch + > + $<$>: + -Wall + -Wextra + -Wpedantic + -finput-charset=UTF-8 + -fexec-charset=UTF-8 + > + $<$: + -Wall + -Wextra + -Wpedantic + -finput-charset=UTF-8 + -fexec-charset=UTF-8 + > +) + +file(GLOB_RECURSE SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/*.cpp) +# file(GLOB_RECURSE SOURCES CONFIGURE_DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/*.cpp) + + +if(ANDROID) + add_library(DisasterServerCXX SHARED "Android.cpp" ${SOURCES}) + + set(THREADS_PREFER_PTHREAD_FLAG ON) + find_package(Threads REQUIRED) + target_include_directories(DisasterServerCXX PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}) + target_compile_options(DisasterServer PRIVATE ${COMPILER_OPTIONS}) + target_link_libraries(DisasterServerCXX PRIVATE cJSON log enet m Threads::Threads) +else() + if(DYLIB) # Build .dll or .so + add_library(DisasterServerCXX SHARED ${SOURCES}) + + if (WIN32) + target_link_libraries(DisasterServerCXX PRIVATE cJSON enet ws2_32 winmm dbghelp) + else() # UNIX + set(THREADS_PREFER_PTHREAD_FLAG ON) + find_package(Threads REQUIRED) + target_link_libraries(DisasterServerCXX PRIVATE cJSON enet m Threads::Threads) + endif() + + target_compile_options(DisasterServer PRIVATE ${COMPILER_OPTIONS}) + target_include_directories(DisasterServerCXX PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}) + + else() # Build executable + if(BUILD_UI) + # set(UI_SOURCES + # "ui/Resources.c" + # "ui/Main.c" + # "ui/Image.c" + # "ui/Label.c" + # "ui/Button.c" + # "ui/TButton.c" + # "ui/MapList.c" + # "ui/Presets.c" + # "ui/MapListPreset.c" + # "ui/PingPreset.c" + # "ui/PlayerList.c" + # ) + + # if (WIN32) + # add_executable(DisasterServer + # ${SOURCES} + # ${UI_SOURCES} + # ) + + # target_link_libraries(DisasterServer PRIVATE + # ws2_32 + # enet + # winmm + # dbghelp + # SDL3-static + # SDL3_image::SDL3_image + # ) + + # target_include_directories(DisasterServer PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}) + + # target_sources(DisasterServer PRIVATE "${CMAKE_SOURCE_DIR}/resources/icon.rc") + + # else() # UNIX + # add_executable(DisasterServer + # ${SOURCES} + # ${UI_SOURCES} + # ) + + # set(THREADS_PREFER_PTHREAD_FLAG ON) + # find_package(Threads REQUIRED) + # target_link_libraries(DisasterServer PRIVATE enet m Threads::Threads + # SDL3::SDL3-static + # SDL3_image::SDL3_image + # ) + # endif() + + # target_include_directories(DisasterServer PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}) + + else() + add_executable(DisasterServerCXX + ${SOURCES} + Main.cpp + ) + + if (WIN32) + target_link_libraries(DisasterServerCXX PRIVATE cJSON enet ws2_32 winmm dbghelp) + else() # UNIX + set(THREADS_PREFER_PTHREAD_FLAG ON) + find_package(Threads REQUIRED) + target_link_libraries(DisasterServerCXX PRIVATE cJSON enet m Threads::Threads) + endif() + + target_compile_options(DisasterServer PRIVATE ${COMPILER_OPTIONS}) + target_include_directories(DisasterServerCXX PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}) + + endif() + endif() +endif() + + +if(MSVC) + add_definitions(-D_CRT_SECURE_NO_WARNINGS) +endif() + +unset(DYLIB CACHE) +unset(BUILD_UI CACHE) \ No newline at end of file diff --git a/disasterserver/Client.cpp b/disasterserver/Client.cpp new file mode 100644 index 0000000..ce8fd90 --- /dev/null +++ b/disasterserver/Client.cpp @@ -0,0 +1,187 @@ +#include "Client.hpp" + +#include + +#include "Server.hpp" +#include "Core/Log.hpp" +#include "Core/Packet.hpp" + +using namespace DisasterServer; + +Client::Client(Server *server, ENetPeer *peer, clientId incomingPeerID, std::string ip) : + id(incomingPeerID), + ip(std::move(ip)), + peer(peer), + server(server) {} + +Client::~Client() = default; + +bool Client::identity(Packet &packet) { + RAssert(id > 0); + + if (packet.getPacketType() != PacketType::IDENTITY) { + this->disconnect(DisconnectReason::OTHER, "type != IDENTITY?"); + return false; + } + + bool isBanned = false; + uint64_t timeout = 0; + + uint16_t build_version = packet.read(); + int32_t server_index = packet.read(); + std::string nickname = packet.readString(); + std::string udid = packet.readString(); + uint8_t lobby_icon = packet.read(); + int8_t pet = packet.read(); + + should_timeout = true; + mod_tool = false; + is_mobile = false; + this->nickname = nickname; + this->udid = udid; + this->lobby_icon = lobby_icon; + this->pet = pet; + + this->in_game = (server->getGameStateController().getCurrentState() == States::LOBBY); + this->exe_chance = 1 + rand() % 4; + + if (this->server->getClients().size() >= MAX_PLAYERS) { + this->disconnect(DisconnectReason::LOBBYFULL); + return false; + } + + if (build_version != BUILD_VERSION) { + this->disconnect(DisconnectReason::VERMISMATCH); + return false; + } + + if (nickname.length() >= 30) { + this->disconnect(DisconnectReason::OTHER, "Your nickname is too long! (30 characters max)"); + return false; + } + + if (udid.empty()) { + this->disconnect(DisconnectReason::OTHER, "whoops you have to put the CD in you conputer"); + return false; + } + + if (!identity_process(ip, isBanned, timeout, server_index == -1)) { + return false; + } + + Info("{} (id {}) joined.", nickname, id); + Info(" IP: {}", ip); + Info(" UID: {}", udid); + Info(" Modified: {}", BoolStringify(mod_tool)); + Info(" Mobile: {}", BoolStringify(is_mobile)); + + this->verified = true; + + return true; +} + +bool Client::identity_process(const std::string &addr, bool is_banned, uint64_t timeout, bool do_timeout) { + if (is_banned) { + Info("{} banned by host (id {}, ip {})", nickname, id, addr); + this->disconnect(DisconnectReason::BANNEDBYHOST); + return false; + } + + if (this->server->getClients().size() >= MAX_PLAYERS) { + this->disconnect(DisconnectReason::LOBBYFULL); + return false; + } + + if (do_timeout && timeout != 0) { + time_t tm = time(nullptr); + time_t val = timeout - tm; + if (val > 0) { + Info("{} is rate-limited (id {}, ip {})", nickname, id, addr); + this->disconnect(DisconnectReason::RATELIMITED); + return false; + } + } + + if (!this->server->getGameStateController().playerJoined(*this)) { + should_timeout = false; + this->disconnect(DisconnectReason::OTHER, "Report this to dev: 415 baza otvette, mi tonem"); + return false; + } + + Packet packet(PacketType::SERVER_IDENTITY_RESPONSE); + packet.write(server->getGameStateController().getCurrentState() == States::LOBBY); + packet.write(id); + packet.send(*this, true); + + // If in queue, do following + if (!in_game) { + + // For icons + for (auto &client : this->server->getClients()) { + if (client->getId() == id) { + continue; + } + + Packet pack(PacketType::SERVER_WAITING_PLAYER_INFO); + pack.write(server->getGameStateController().getCurrentState() == States::GAME && client->in_game); + pack.write(client->getId()); + pack.writeString(nickname); + + if (server->getGameStateController().getCurrentState() == States::GAME && client->in_game) { + + pack.write( 0 /* v->server->game.exe == peer->id */ ); + pack.write( 0 /* v->server->game.exe == peer->id ? peer->exe_char : peer->surv_char */); + + } else { + pack.write(lobby_icon); + } + + pack.send(*this, true); + } + + // For other players in queue + Packet pack(PacketType::SERVER_WAITING_PLAYER_INFO); + pack.write(0); + pack.write(id); + pack.writeString(nickname); + pack.write(lobby_icon); + this->server->broadcast_ex(pack, true, id); + + this->server->send_message(*this, "|build from &{} @{}~", __DATE__, __TIME__); + this->server->send_message(*this, "|type .help for command list~"); + } + + return true; +} + +bool Client::message_received(Packet &packet) { + if (id == 0) { + return false; + } + + return this->server->getGameStateController().handle(*this, packet); +} + +void Client::disconnect(DisconnectReason reason, const std::string &message) { + if (disconnecting) { + return; + } + + if (reason == DisconnectReason::OTHER && !message.empty()) { + Packet packet(PacketType::SERVER_PLAYER_FORCE_DISCONNECT); + packet.write(static_cast(reason)); + packet.writeString(message); + packet.send(*this, true); + enet_peer_disconnect_later(peer, static_cast(reason)); + } else { + enet_peer_disconnect(peer, static_cast(reason)); + } + + if (message.empty()) { + Info("Disconnected id {} {}: No text.", id, getDisconnectReasonName(reason)); + } else { + Info("Disconnected id {} {}: {}.", id, getDisconnectReasonName(reason), message); + } + + disconnecting = true; +} diff --git a/disasterserver/Client.hpp b/disasterserver/Client.hpp new file mode 100644 index 0000000..12576eb --- /dev/null +++ b/disasterserver/Client.hpp @@ -0,0 +1,175 @@ +#ifndef DISASTERSERVER_PEER_HPP +#define DISASTERSERVER_PEER_HPP + +#include "Core/Packet.hpp" + +namespace DisasterServer +{ + class Server; + + enum class SurvCharacters { + NONE = -1, + + TAILS, + KNUX, + EGGMAN, + AMY, + CREAM, + SALLY, + COUNT + }; + + enum class ExesCharacters { + NONE = -1, + + ORIGINAL, + CHAOS, + EXETIOR, + EXELLER, + COUNT + }; + + constexpr std::array EXE_NAMES = { + "Classic Exe", + "Chaos", + "Exetior", + "Exeller" + }; + + constexpr std::array SURV_NAMES = { + "Tails", + "Knuckles", + "Eggman", + "Amy", + "Cream", + "Sally" + }; + + enum class DisconnectReason + { + FAILEDTOCONNECT, + KICKEDBYHOST, + BANNEDBYHOST, + VERMISMATCH, + SERVERTIMEOUT, + PACKETSNOTRECV, + GAMESTARTED, + AFKTIMEOUT, + LOBBYFULL, + RATELIMITED, + SHUTDOWN, + IPINUSE, + + DONTREPORT = 254, + OTHER = 255 + }; + + inline std::string getDisconnectReasonName(DisconnectReason reason) { + switch (reason) { + case DisconnectReason::FAILEDTOCONNECT: return "FAILED TO CONNECT"; + case DisconnectReason::KICKEDBYHOST: return "KICKED BY HOST"; + case DisconnectReason::BANNEDBYHOST: return "BANNED BY HOST"; + case DisconnectReason::VERMISMATCH: return "VER MISMATCH"; + case DisconnectReason::SERVERTIMEOUT: return "SERVER TIMEOUT"; + case DisconnectReason::PACKETSNOTRECV: return "PACKET SNOT RECV"; + case DisconnectReason::GAMESTARTED: return "GAME STARTED"; + case DisconnectReason::AFKTIMEOUT: return "AFK TIMEOUT"; + case DisconnectReason::LOBBYFULL: return "LOBBY FULL"; + case DisconnectReason::RATELIMITED: return "RATE LIMITED"; + case DisconnectReason::SHUTDOWN: return "SHUTDOWN"; + case DisconnectReason::IPINUSE: return "IP IN USE"; + case DisconnectReason::DONTREPORT: return "DONT REPORT"; + case DisconnectReason::OTHER: return "OTHER"; + default: return ""; + } + } + + using clientId = uint16_t; + + class Client { + clientId id; + std::string ip; + ENetPeer *peer; + + /* General info */ + //Player plr; + std::string nickname = ""; + std::string udid; + uint8_t lobby_icon = 0; + int8_t pet = -1; + + bool verified = false; + bool in_game = false; + bool op = false; + bool ready = false; + bool mod_tool = false; + bool is_mobile = false; + bool can_vote = false; + bool voted = false; + bool disconnecting = false; + + struct AuthPeer { + uint32_t type = 0; + uint8_t one = 0; + uint8_t two = 0; + } auth = {}; + + /* Character */ + SurvCharacters survChar = SurvCharacters::NONE; + ExesCharacters exeChar = ExesCharacters::NONE; + + bool should_timeout = false; + + /* State info */ + uint8_t exe_chance = 0; + double timeout = 0; + double vote_cooldown = 0; + + Server *server = nullptr; + public: + Client(Server *server, ENetPeer *peer, clientId incomingPeerID, std::string ip); + ~Client(); + + clientId getId() const { return id; } + std::string getIp() const { return ip; } + ENetPeer * getPeer() { return peer; } + std::string getNickname() { return nickname; } + std::string getUdid() { return udid; } + uint8_t getLobbyIcon() { return lobby_icon; } + int8_t getPet() { return pet; } + AuthPeer &getAuthPeer() { return auth; } + void setExeChance(uint8_t chance) { exe_chance = chance; } + uint8_t getExeChance() { return exe_chance; } + + SurvCharacters getSurvCharacter() const { return survChar; } + void setSurvCharacter(SurvCharacters character) { survChar = character; } + ExesCharacters getExeCharacter() const { return exeChar; } + void setExeCharacter(ExesCharacters character) { exeChar = character; } + + void setTimeout(double value) { timeout = value; } + double getTimeout() const { return timeout; } + bool isShouldTimeout() { return should_timeout; } + bool isDisconnecting() { return disconnecting; } + void setVoteCooldown(double value) { vote_cooldown = value; } + double getVoteCooldown() { return vote_cooldown; } + void setInGame(bool flag) { in_game = flag; } + bool isInGame() { return in_game; } + void setCanVote(bool flag) { can_vote = flag; } + bool isCanVote() { return can_vote; } + + bool isVerified() { return verified; } + bool isOpped() { return op; } + bool isModified() { return mod_tool; } + void setReady(bool flag) { ready = flag; } + bool isReady() { return ready; } + void setVoted(bool flag) { voted = flag; } + bool isVoted() { return voted; } + + bool identity(Packet &packet); + bool identity_process(const std::string & addr, bool is_banned, uint64_t timeout, bool do_timeout); + bool message_received(Packet &packet); + void disconnect(DisconnectReason reason, const std::string& message = ""); + }; +} + +#endif //DISASTERSERVER_PEER_HPP diff --git a/disasterserver/Core/Api.hpp b/disasterserver/Core/Api.hpp new file mode 100644 index 0000000..ceb9d9e --- /dev/null +++ b/disasterserver/Core/Api.hpp @@ -0,0 +1,11 @@ +#ifndef API_HPP +#define API_HPP + +#ifdef _WIN32 + #define SERVER_API __declspec(dllexport) +#else + #define SERVER_API +#endif + + +#endif //API_HPP diff --git a/disasterserver/Core/Colors.hpp b/disasterserver/Core/Colors.hpp new file mode 100644 index 0000000..b303543 --- /dev/null +++ b/disasterserver/Core/Colors.hpp @@ -0,0 +1,18 @@ +#ifndef DISASTERSERVER_COLORS_HPP +#define DISASTERSERVER_COLORS_HPP + +#include + +constexpr std::string_view CLRCODE_RED = "\\"; +constexpr std::string_view CLRCODE_GRN = "@"; +constexpr std::string_view CLRCODE_PUR = "&"; +constexpr std::string_view CLRCODE_BLU = "/"; +constexpr std::string_view CLRCODE_GRA = "|"; +constexpr std::string_view CLRCODE_YLW = "`"; +constexpr std::string_view CLRCODE_ORG = "\xE2\x84\x96"; +constexpr std::string_view CLRCODE_RST = "~"; + +#define CLRLIST { CLRCODE_RED, CLRCODE_GRN, CLRCODE_PUR, CLRCODE_BLU, CLRCODE_GRA, CLRCODE_YLW, CLRCODE_ORG, CLRCODE_RST } +#define CLRLIST_LEN 8 + +#endif //DISASTERSERVER_COLORS_HPP diff --git a/disasterserver/Core/Exceptions.hpp b/disasterserver/Core/Exceptions.hpp new file mode 100644 index 0000000..dc5b4bb --- /dev/null +++ b/disasterserver/Core/Exceptions.hpp @@ -0,0 +1,24 @@ +#ifndef DISASTERSERVER_EXCEPTIONS_HPP +#define DISASTERSERVER_EXCEPTIONS_HPP + +namespace DisasterServer +{ + class PacketError : public std::exception { + public: + explicit PacketError(std::string message) : message(std::move(message)) {} + + const char* what() const noexcept override { + return message.c_str(); + } + + template + static PacketError format(std::format_string fmt, Args&&... args) { + return PacketError(std::format(fmt, std::forward(args)...)); + } + + private: + std::string message; + }; +} + +#endif //DISASTERSERVER_EXCEPTIONS_HPP diff --git a/disasterserver/Core/Log.cpp b/disasterserver/Core/Log.cpp new file mode 100644 index 0000000..2741f44 --- /dev/null +++ b/disasterserver/Core/Log.cpp @@ -0,0 +1,193 @@ +/*#include +#include +#include +#include +#include +#include +#ifdef SYS_ANDROID + #include +#endif + +FILE* logFile = NULL; +loghook_t hook = NULL; + +void log_interr(int signum) +{ + (void)signum; + Err("Signal INTERRUPT: Exiting..."); + if (logFile) + fclose(logFile); + + logFile = NULL; + disaster_shutdown(); +} + +void log_segv(int signum) +{ + (void)signum; + + Err("Signal SEGFAULT: Exiting..."); + if (logFile) + fclose(logFile); + + logFile = NULL; + disaster_shutdown(); +} + +void log_term(int signum) +{ + (void)signum; + + Err("Signal SIGTERM: Exiting..."); + if (logFile) + fclose(logFile); + + logFile = NULL; + disaster_shutdown(); +} + +void log_abrt(int signum) +{ + (void)signum; + Err("Signal SIGABORT: Exiting..."); + if (logFile) + fclose(logFile); + + logFile = NULL; + disaster_shutdown(); +} + +void log_uninit(void) +{ + if (logFile) + fclose(logFile); + + logFile = NULL; +} + +#ifdef SYS_ANDROID + void log_android(const char* type, const char* message) + { + __android_log_print(ANDROID_LOG_ERROR, "DisasterServer", "%s", message); + } +#endif + +bool log_init(void) +{ + if (g_config.log_file) // dont do shit if we dont wanna log to file + { + // Create dir for logging + (void)mkdir("logs", 0777); + + time_t t = time(NULL); + struct tm* p = localtime(&t); + + char fname[64]; + strftime(fname, 64, "logs/%m%d%Y %H%M%S.log", p); + + logFile = fopen(fname, "w"); + RAssert(logFile); + } + + // write to file when done + signal(SIGINT, log_interr); + signal(SIGTERM, log_term); + signal(SIGABRT, log_abrt); + signal(SIGSEGV, log_segv); +#if defined(__unix) || defined(__unix__) + signal(SIGPIPE, SIG_IGN); +#endif + atexit(log_uninit); + + return true; +} + +void log_hook(loghook_t func) +{ + hook = func; +} + +void log_fmt(const char* fmt, const char* type, const char* file, int line, ...) +{ + const char* thd_name = (const char*)ThreadVarGet(g_threadName); + char filename[24]; + snprintf(filename, 24, "%s:%d", file, line); + + time_t t = time(NULL); + struct tm* p = localtime(&t); + + va_list list; + if (logFile) + { + char strtime[32]; + strftime(strtime, 32, "%m/%d/%Y %H:%M:%S", p); + fprintf(logFile, "[%s %s %s %s] ", strtime, type, thd_name != NULL ? thd_name : "unknown", filename); + + va_start(list, line); + vfprintf(logFile, fmt, list); + va_end(list); + + fputs("\n", logFile); + fflush(logFile); + } + + if (hook) + { + char fmt_log[512]; + va_start(list, line); + vsnprintf(fmt_log, 512, fmt, list); + va_end(list); + + char log[1024]; + snprintf(log, 1024, "[%s]: %s", filename, fmt_log); + + hook(type, log); + return; + } + + printf("[%s %s %s] ", type, thd_name != NULL ? thd_name : "unknown", filename); + + va_start(list, line); + vprintf(fmt, list); + va_end(list); + + puts(""); +}*/ + +#include "Log.hpp" + +#include +#include + +using namespace DisasterServer; + +void Logger::write(const LogLevel level, std::string_view message, std::source_location &location) { + using namespace std::chrono; + + std::stringstream ss; + + const time_t now = std::time(nullptr); + + std::tm local{}; +#ifdef _WIN32 + localtime_s(&local, &now); +#else + localtime_r(&now, &local); +#endif + + ss << std::put_time(&local, "%d.%m.%Y %T"); + ss << " "; + switch (level) { + case LogLevel::Debug: ss << TerminalColors::cyan; ss << "[Debug]"; ss << TerminalColors::reset; break; + case LogLevel::Info: ss << TerminalColors::green; ss << "[Info]"; ss << TerminalColors::reset; break; + case LogLevel::Warning: ss << TerminalColors::yellow; ss << "[Warn]"; ss << TerminalColors::reset; break; + case LogLevel::Error: ss << TerminalColors::light_red; ss << "[Error]"; ss << TerminalColors::reset; break; + } + ss << " "; + ss << TerminalColors::light_gray; ss << "["<< std::this_thread::get_id() << "]"; + ss << " "; + ss << std::format("({}:{})", location.file_name(), location.line()); ss << TerminalColors::reset; + ss << " "; + ss << message; + std::cout << ss.str() << std::endl; +} diff --git a/disasterserver/Core/Log.hpp b/disasterserver/Core/Log.hpp new file mode 100644 index 0000000..02df25b --- /dev/null +++ b/disasterserver/Core/Log.hpp @@ -0,0 +1,126 @@ +#ifndef LOG_HPP +#define LOG_HPP + +#include +#include +#include + +#ifdef true //SYS_USE_SDL2 + #define DEBUG_TYPE "DBG " + #define INFO_TYPE "INF " + #define WARN_TYPE "WRN " + #define ERROR_TYPE "ERR " + + #define LOG_GRN CLRCODE_GRN + #define LOG_GRA CLRCODE_GRA + #define LOG_RED CLRCODE_RED + #define LOG_BLU CLRCODE_BLU + #define LOG_YLW CLRCODE_YLW + #define LOG_PUR CLRCODE_PUR + #define LOG_RST CLRCODE_RST +#else + #define DEBUG_TYPE "\x1B[36mDBG\x1B[0m" + #define INFO_TYPE "\x1B[32mINF\x1B[0m" + #define WARN_TYPE "\x1B[33mWRN\x1B[0m" + #define ERROR_TYPE "\x1B[31mERR\x1B[0m" + + #define LOG_GRN + #define LOG_GRA + #define LOG_RED + #define LOG_BLU + #define LOG_YLW + #define LOG_PUR + #define LOG_RST +#endif + +namespace DisasterServer +{ + namespace TerminalColors { + constexpr std::string_view reset = "\x1b[0m"; + constexpr std::string_view bright = "\x1b[1m"; + constexpr std::string_view dim = "\x1b[2m"; + constexpr std::string_view underscore = "\x1b[4m"; + constexpr std::string_view blink = "\x1b[5m"; + constexpr std::string_view reverse = "\x1b[7m"; + constexpr std::string_view hidden = "\x1b[8m"; + + constexpr std::string_view black = "\x1b[30m"; + constexpr std::string_view red = "\x1b[31m"; + constexpr std::string_view green = "\x1b[32m"; + constexpr std::string_view yellow = "\x1b[33m"; + constexpr std::string_view blue = "\x1b[34m"; + constexpr std::string_view magenta = "\x1b[35m"; + constexpr std::string_view cyan = "\x1b[36m"; + constexpr std::string_view white = "\x1b[37m"; + constexpr std::string_view standard = "\x1b[39m"; + constexpr std::string_view light_gray = "\x1b[90m"; + constexpr std::string_view light_red = "\x1b[91m"; + constexpr std::string_view light_green = "\x1b[92m"; + constexpr std::string_view light_yellow = "\x1b[93m"; + constexpr std::string_view light_blue = "\x1b[94m"; + constexpr std::string_view light_magenta = "\x1b[95m"; + constexpr std::string_view light_cyan = "\x1b[96m"; + constexpr std::string_view light_white = "\x1b[97m"; + + + constexpr std::string_view bg_black = "\x1b[40m"; + constexpr std::string_view bg_red = "\x1b[41m"; + constexpr std::string_view bg_green = "\x1b[42m"; + constexpr std::string_view bg_yellow = "\x1b[43m"; + constexpr std::string_view bg_blue = "\x1b[44m"; + constexpr std::string_view bg_magenta = "\x1b[45m"; + constexpr std::string_view bg_cyan = "\x1b[46m"; + constexpr std::string_view bg_white = "\x1b[47m"; + } + + enum class LogLevel { + Debug, Info, Warning, Error + }; + + class Logger { + static void write(LogLevel level, std::string_view message, std::source_location &location); + + template + static void log(LogLevel level, std::source_location location, std::format_string fmt, Args&&... args) { + write(level, std::format(fmt, std::forward(args)...), location); + } + + public: + + template + static void debug(std::source_location location, std::format_string fmt, Args&&... args) { +#ifdef _DEBUG + log(LogLevel::Debug, location, fmt, std::forward(args)...); +#endif + } + + template + static void info(std::source_location location, std::format_string fmt, Args&&... args) { + log(LogLevel::Info, location, fmt, std::forward(args)...); + } + + template + static void warning(std::source_location location, std::format_string fmt, Args&&... args) { + log(LogLevel::Warning, location, fmt, std::forward(args)...); + } + + template + static void error(std::source_location location, std::format_string fmt, Args&&... args) { + log(LogLevel::Error, location, fmt, std::forward(args)...); + } + }; + + constexpr std::string_view BoolStringify(bool value) { + return value ? "true" : "false"; + } +} + +#define RAssert(x) if (!(x)) { Err("RAssert({}) failed!", #x); return false; } +#define RAssertEx(x) if (!(x)) { Err("RAssert({}) failed!", #x); } + +#define Info(fmt, ...) DisasterServer::Logger::info(std::source_location::current(), fmt, ##__VA_ARGS__) +#define Warn(fmt, ...) DisasterServer::Logger::warning(std::source_location::current(), fmt, ##__VA_ARGS__) +#define Err(fmt, ...) DisasterServer::Logger::error(std::source_location::current(), fmt, ##__VA_ARGS__) +#define Debug(fmt, ...) DisasterServer::Logger::debug(std::source_location::current(), fmt, ##__VA_ARGS__) + +#endif //LOG_HPP diff --git a/disasterserver/Core/Packet.cpp b/disasterserver/Core/Packet.cpp new file mode 100644 index 0000000..c1b2c8e --- /dev/null +++ b/disasterserver/Core/Packet.cpp @@ -0,0 +1,108 @@ +#include "Packet.hpp" + +#include + +#include "Log.hpp" +#include "Client.hpp" +#include "Server.hpp" +#include "Exceptions.hpp" + +#ifdef __GNUC__ // GCC, clang... + #define BYTESWAP_16(x) __builtin_bswap16((x)) + #define BYTESWAP_32(x) __builtin_bswap32((x)) + #define BYTESWAP_64(x) __builtin_bswap64((x)) +#else + #define BYTESWAP_16(x) _byteswap_ushort((x)) + #define BYTESWAP_32(x) _byteswap_ulong((x)) + #define BYTESWAP_64(x) _byteswap_uint64((x)) +#endif + +using namespace DisasterServer; + +Packet::Packet(ENetPacket *packet) : buffer({}) { + if (!packet) { + throw PacketError::format("Packet is null"); + } + + if (packet->dataLength > buffer.size()) { + enet_packet_destroy(packet); + throw PacketError::format("Packet is too large {} bytes", packet->dataLength); + } + + len = packet->dataLength; + + std::memcpy(buffer.data(), packet->data, len); + enet_packet_destroy(packet); + + if (len < 2) { + throw PacketError::format("Packet is too small"); + } + + read(); + type = static_cast(read()); + + Debug("Packet received PacketType::{}", getPacketTypeName(type)); +} + +Packet::Packet(PacketType type) : buffer({}), type(type) { + write(0); + write(static_cast(type)); + if (type != PacketType::SERVER_HEARTBEAT) { + Debug("Packet created PacketType::{}", getPacketTypeName(type)); + } +} + +Packet::~Packet() = default; + +std::string Packet::readString() { + std::string result; + + while (position < len) { + const char c = static_cast(buffer[position++]); + + if (c == '\0') + return result; + + result += c; + } + + throw PacketError::format("Unterminated string"); +} + +void Packet::writeString(const std::string &value) { + if (position >= buffer.size() || value.size() >= buffer.size() - position) { + throw PacketError::format("String is too long: {} bytes", value.size()); + } + + for (unsigned char c : value) { + write(c); + } + + write(0); +} + +bool Packet::send(Client &client, bool reliable) { + if(client.isDisconnecting()) + return true; + + Debug("PacketType::{} sending to {} (id {})", getPacketTypeName(type), client.getNickname(), client.getId()); + + ENetPacket* pack = enet_packet_create(buffer.data(), len, reliable ? ENET_PACKET_FLAG_RELIABLE : 0); + + if (!pack) { + Err("Failed to create ENet packet"); + return false; + } + + return enet_peer_send(client.getPeer(), reliable ? 0 : 1, pack) == 0; +} + +void Packet::sendBroadcast(Server &server, bool reliable, std::function predicate) { + for (auto &client : server.getClients()) { + if (predicate(*client)) { + if (!send(*client, reliable)) { + Warn("Failed to send {} to client {}", getPacketTypeName(type), client->getId()); + } + } + } +} \ No newline at end of file diff --git a/disasterserver/Core/Packet.hpp b/disasterserver/Core/Packet.hpp new file mode 100644 index 0000000..71dd8b5 --- /dev/null +++ b/disasterserver/Core/Packet.hpp @@ -0,0 +1,385 @@ +#ifndef PACKET_H + +#define PACKET_H + +#include +#include +#include +#include +#include + +#include "Log.hpp" +#include "enet/enet.h" + +enum class PacketType : uint8_t +{ + IDENTITY, + SERVER_IDENTITY_RESPONSE, + + SERVER_PLAYER_JOINED, + SERVER_PLAYER_LEFT, + SERVER_PLAYER_FORCE_DISCONNECT, + + SERVER_WAITING_PLAYER_INFO, + + SERVER_LOBBY_READY_STATE, + SERVER_LOBBY_EXE, + SERVER_LOBBY_COUNTDOWN, + SERVER_LOBBY_EXE_CHANGE, + SERVER_LOBBY_CHARACTER_CHANGE, + SERVER_LOBBY_CHARACTER_RESPONSE, + SERVER_LOBBY_EXECHARACTER_RESPONSE, + SERVER_LOBBY_GAME_START, + SERVER_LOBBY_PLAYER, + SERVER_LOBBY_EXE_CHANCE, + SERVER_LOBBY_CORRECT, + SERVER_LOBBY_CHOOSEVOTEKICK, + SERVER_LOBBY_CHOOSEBAN, + SERVER_LOBBY_CHOOSEKICK, + SERVER_LOBBY_CHOOSEOP, + SERVER_LOBBY_CHANGELOBBY, + SERVER_CHAR_TIME_SYNC, + + SERVER_VOTE_MAPS, + SERVER_VOTE_SET, + SERVER_VOTE_TIME_SYNC, + + SERVER_GAME_PLAYERS_READY, + SERVER_GAME_EXE_WINS, + SERVER_GAME_SURVIVOR_WIN, + SERVER_GAME_SPAWN_RING, + SERVER_GAME_PLAYER_ESCAPED, + SERVER_GAME_BACK_TO_LOBBY, + SERVER_GAME_TIME_SYNC, + SERVER_GAME_TIME_OVER, + SERVER_GAME_PING, + SERVER_PLAYER_DEATH_STATE, + SERVER_GAME_DEATHTIMER_TICK, + SERVER_GAME_DEATHTIMER_END, + + SERVER_REQUEST_INFO, + SERVER_HEARTBEAT, + SERVER_PONG, + + SERVER_FORCE_DAMAGE, + SERVER_GAME_RING_READY, + SERVER_PLAYER_BACKTRACK, + + // Entities + SERVER_TPROJECTILE_STATE, + SERVER_ETRACKER_STATE, + SERVER_ERECTOR_BRING_SPAWN, + SERVER_RMZSLIME_STATE, + SERVER_RMZSLIME_RINGBONUS, + SERVER_RMZSHARD_STATE, + SERVER_LCEYE_STATE, + SERVER_LCCHAIN_STATE, + SERVER_NPCONTROLLER_STATE, + SERVER_KAFMONITOR_STATE, + SERVER_YCRSMOKE_STATE, + SERVER_YCRSMOKE_READY, + SERVER_MOVINGSPIKE_STATE, + SERVER_RING_STATE, + SERVER_RING_COLLECTED, + SERVER_ACT9WALL_STATE, + SERVER_NAPBALL_STATE, + SERVER_NAPICE_STATE, + SERVER_PFLIFT_STATE, + SERVER_BRING_STATE, + SERVER_BRING_COLLECTED, + SERVER_VVLCOLUMN_STATE, + SERVER_VVVASE_STATE, + SERVER_GHZTHUNDER_STATE, + SERVER_TCGOM_STATE, + SERVER_EXELLERCLONE_STATE, + SERVER_DTTAILSDOLL_STATE, + SERVER_DTBALL_STATE, + SERVER_DTASS_STATE, + SERVER_HDDOOR_STATE, + SERVER_WDLATERN_ACTIVATE, + SERVER_FART_STATE, + SERVER_MJLAVA_STATE, + SERVER_MJJUDGER_STATE, + SERVER_MJCRYSTAL_STATE, + + // Entity actions + CLIENT_ETRACKER, + CLIENT_ETRACKER_ACTIVATED, + CLIENT_TPROJECTILE, + CLIENT_TPROJECTILE_HIT, + CLIENT_TPROJECTILE_STARTCHARGE, + CLIENT_ERECTOR_BALLS, + CLIENT_ERECTOR_BRING_SPAWN, + CLIENT_EXELLER_SPAWN_CLONE, + CLIENT_EXELLER_TELEPORT_CLONE, + CLIENT_MERCOIN_BONUS, + + CLIENT_RMZSLIME_HIT, + CLIENT_LCEYE_REQUEST_ACTIVATE, + CLIENT_KAFMONITOR_ACTIVATE, + CLIENT_RING_COLLECTED, + CLIENT_RING_BROKE, + CLIENT_BRING_COLLECTED, + CLIENT_NAPICE_ACTIVATE, + CLIENT_SPRING_USE, + CLIENT_PFLIT_ACTIVATE, + CLIENT_VVVASE_BREAK, + CLIENT_RMZSHARD_COLLECT, + CLIENT_RMZSHARD_LAND, + CLIENT_DTASS_ACTIVATE, + CLIENT_HDDOOR_TOGGLE, + CLIENT_FART_PUSH, + + CLIENT_LOBBY_READY_STATE, + CLIENT_REQUESTED_INFO, + CLIENT_PLAYER_DATA, + CLIENT_PLAYER_HURT, + CLIENT_SOUND_EMIT, + CLIENT_PING, + + CLIENT_REVIVAL_PROGRESS, + CLIENT_PLAYER_HEAL, + CLIENT_PLAYER_HEAL_PART, + SERVER_REVIVAL_PROGRESS, + SERVER_REVIVAL_STATUS, + SERVER_REVIVAL_RINGSUB, + SERVER_REVIVAL_REVIVED, + + CLIENT_REQUEST_CHARACTER, + CLIENT_REQUEST_EXECHARACTER, + CLIENT_VOTE_REQUEST, + + CLIENT_PLAYER_DEATH_STATE, + CLIENT_PLAYER_ESCAPED, + SERVER_PLAYER_ESCAPED, + CLIENT_LOBBY_PLAYERS_REQUEST, + CLIENT_CREAM_SPAWN_RINGS, + CLIENT_SPAWN_EFFECT, + CLIENT_CHAT_MESSAGE, + CLIENT_LOBBY_CHOOSEVOTEKICK, + CLIENT_LOBBY_CHOOSEBAN, + CLIENT_LOBBY_CHOOSEKICK, + CLIENT_LOBBY_CHOOSEOP, + CLIENT_PLAYER_PALETTE, + CLIENT_PET_PALETTE, + + SERVER_RESULTS, + SERVER_RESULTS_DATA, + CLIENT_RESULTS_REQUEST, + CLIENT_STATS_REPORT, + SERVER_PREIDENTITY, + SERVER_FELLA, + + CLIENT_PLAYER_POTATER +}; + +inline std::string getPacketTypeName(PacketType type) { + switch (type) { + case PacketType::IDENTITY: return "IDENTITY"; + case PacketType::SERVER_IDENTITY_RESPONSE: return "SERVER_IDENTITY_RESPONSE"; + case PacketType::SERVER_PLAYER_JOINED: return "SERVER_PLAYER_JOINED"; + case PacketType::SERVER_PLAYER_LEFT: return "SERVER_PLAYER_LEFT"; + case PacketType::SERVER_PLAYER_FORCE_DISCONNECT: return "SERVER_PLAYER_FORCE_DISCONNECT"; + case PacketType::SERVER_WAITING_PLAYER_INFO: return "SERVER_WAITING_PLAYER_INFO"; + case PacketType::SERVER_LOBBY_READY_STATE: return "SERVER_LOBBY_READY_STATE"; + case PacketType::SERVER_LOBBY_EXE: return "SERVER_LOBBY_EXE"; + case PacketType::SERVER_LOBBY_COUNTDOWN: return "SERVER_LOBBY_COUNTDOWN"; + case PacketType::SERVER_LOBBY_EXE_CHANGE: return "SERVER_LOBBY_EXE_CHANGE"; + case PacketType::SERVER_LOBBY_CHARACTER_CHANGE: return "SERVER_LOBBY_CHARACTER_CHANGE"; + case PacketType::SERVER_LOBBY_CHARACTER_RESPONSE: return "SERVER_LOBBY_CHARACTER_RESPONSE"; + case PacketType::SERVER_LOBBY_EXECHARACTER_RESPONSE: return "SERVER_LOBBY_EXECHARACTER_RESPONSE"; + case PacketType::SERVER_LOBBY_GAME_START: return "SERVER_LOBBY_GAME_START"; + case PacketType::SERVER_LOBBY_PLAYER: return "SERVER_LOBBY_PLAYER"; + case PacketType::SERVER_LOBBY_EXE_CHANCE: return "SERVER_LOBBY_EXE_CHANCE"; + case PacketType::SERVER_LOBBY_CORRECT: return "SERVER_LOBBY_CORRECT"; + case PacketType::SERVER_LOBBY_CHOOSEVOTEKICK: return "SERVER_LOBBY_CHOOSEVOTEKICK"; + case PacketType::SERVER_LOBBY_CHOOSEBAN: return "SERVER_LOBBY_CHOOSEBAN"; + case PacketType::SERVER_LOBBY_CHOOSEKICK: return "SERVER_LOBBY_CHOOSEKICK"; + case PacketType::SERVER_LOBBY_CHOOSEOP: return "SERVER_LOBBY_CHOOSEOP"; + case PacketType::SERVER_LOBBY_CHANGELOBBY: return "SERVER_LOBBY_CHANGELOBBY"; + case PacketType::SERVER_CHAR_TIME_SYNC: return "SERVER_CHAR_TIME_SYNC"; + case PacketType::SERVER_VOTE_MAPS: return "SERVER_VOTE_MAPS"; + case PacketType::SERVER_VOTE_SET: return "SERVER_VOTE_SET"; + case PacketType::SERVER_VOTE_TIME_SYNC: return "SERVER_VOTE_TIME_SYNC"; + case PacketType::SERVER_GAME_PLAYERS_READY: return "SERVER_GAME_PLAYERS_READY"; + case PacketType::SERVER_GAME_EXE_WINS: return "SERVER_GAME_EXE_WINS"; + case PacketType::SERVER_GAME_SURVIVOR_WIN: return "SERVER_GAME_SURVIVOR_WIN"; + case PacketType::SERVER_GAME_SPAWN_RING: return "SERVER_GAME_SPAWN_RING"; + case PacketType::SERVER_GAME_PLAYER_ESCAPED: return "SERVER_GAME_PLAYER_ESCAPED"; + case PacketType::SERVER_GAME_BACK_TO_LOBBY: return "SERVER_GAME_BACK_TO_LOBBY"; + case PacketType::SERVER_GAME_TIME_SYNC: return "SERVER_GAME_TIME_SYNC"; + case PacketType::SERVER_GAME_TIME_OVER: return "SERVER_GAME_TIME_OVER"; + case PacketType::SERVER_GAME_PING: return "SERVER_GAME_PING"; + case PacketType::SERVER_PLAYER_DEATH_STATE: return "SERVER_PLAYER_DEATH_STATE"; + case PacketType::SERVER_GAME_DEATHTIMER_TICK: return "SERVER_GAME_DEATHTIMER_TICK"; + case PacketType::SERVER_GAME_DEATHTIMER_END: return "SERVER_GAME_DEATHTIMER_END"; + case PacketType::SERVER_REQUEST_INFO: return "SERVER_REQUEST_INFO"; + case PacketType::SERVER_HEARTBEAT: return "SERVER_HEARTBEAT"; + case PacketType::SERVER_PONG: return "SERVER_PONG"; + case PacketType::SERVER_FORCE_DAMAGE: return "SERVER_FORCE_DAMAGE"; + case PacketType::SERVER_GAME_RING_READY: return "SERVER_GAME_RING_READY"; + case PacketType::SERVER_PLAYER_BACKTRACK: return "SERVER_PLAYER_BACKTRACK"; + case PacketType::SERVER_TPROJECTILE_STATE: return "SERVER_TPROJECTILE_STATE"; + case PacketType::SERVER_ETRACKER_STATE: return "SERVER_ETRACKER_STATE"; + case PacketType::SERVER_ERECTOR_BRING_SPAWN: return "SERVER_ERECTOR_BRING_SPAWN"; + case PacketType::SERVER_RMZSLIME_STATE: return "SERVER_RMZSLIME_STATE"; + case PacketType::SERVER_RMZSLIME_RINGBONUS: return "SERVER_RMZSLIME_RINGBONUS"; + case PacketType::SERVER_RMZSHARD_STATE: return "SERVER_RMZSHARD_STATE"; + case PacketType::SERVER_LCEYE_STATE: return "SERVER_LCEYE_STATE"; + case PacketType::SERVER_LCCHAIN_STATE: return "SERVER_LCCHAIN_STATE"; + case PacketType::SERVER_NPCONTROLLER_STATE: return "SERVER_NPCONTROLLER_STATE"; + case PacketType::SERVER_KAFMONITOR_STATE: return "SERVER_KAFMONITOR_STATE"; + case PacketType::SERVER_YCRSMOKE_STATE: return "SERVER_YCRSMOKE_STATE"; + case PacketType::SERVER_YCRSMOKE_READY: return "SERVER_YCRSMOKE_READY"; + case PacketType::SERVER_MOVINGSPIKE_STATE: return "SERVER_MOVINGSPIKE_STATE"; + case PacketType::SERVER_RING_STATE: return "SERVER_RING_STATE"; + case PacketType::SERVER_RING_COLLECTED: return "SERVER_RING_COLLECTED"; + case PacketType::SERVER_ACT9WALL_STATE: return "SERVER_ACT9WALL_STATE"; + case PacketType::SERVER_NAPBALL_STATE: return "SERVER_NAPBALL_STATE"; + case PacketType::SERVER_NAPICE_STATE: return "SERVER_NAPICE_STATE"; + case PacketType::SERVER_PFLIFT_STATE: return "SERVER_PFLIFT_STATE"; + case PacketType::SERVER_BRING_STATE: return "SERVER_BRING_STATE"; + case PacketType::SERVER_BRING_COLLECTED: return "SERVER_BRING_COLLECTED"; + case PacketType::SERVER_VVLCOLUMN_STATE: return "SERVER_VVLCOLUMN_STATE"; + case PacketType::SERVER_VVVASE_STATE: return "SERVER_VVVASE_STATE"; + case PacketType::SERVER_GHZTHUNDER_STATE: return "SERVER_GHZTHUNDER_STATE"; + case PacketType::SERVER_TCGOM_STATE: return "SERVER_TCGOM_STATE"; + case PacketType::SERVER_EXELLERCLONE_STATE: return "SERVER_EXELLERCLONE_STATE"; + case PacketType::SERVER_DTTAILSDOLL_STATE: return "SERVER_DTTAILSDOLL_STATE"; + case PacketType::SERVER_DTBALL_STATE: return "SERVER_DTBALL_STATE"; + case PacketType::SERVER_DTASS_STATE: return "SERVER_DTASS_STATE"; + case PacketType::SERVER_HDDOOR_STATE: return "SERVER_HDDOOR_STATE"; + case PacketType::SERVER_WDLATERN_ACTIVATE: return "SERVER_WDLATERN_ACTIVATE"; + case PacketType::SERVER_FART_STATE: return "SERVER_FART_STATE"; + case PacketType::SERVER_MJLAVA_STATE: return "SERVER_MJLAVA_STATE"; + case PacketType::SERVER_MJJUDGER_STATE: return "SERVER_MJJUDGER_STATE"; + case PacketType::SERVER_MJCRYSTAL_STATE: return "SERVER_MJCRYSTAL_STATE"; + case PacketType::CLIENT_ETRACKER: return "CLIENT_ETRACKER"; + case PacketType::CLIENT_ETRACKER_ACTIVATED: return "CLIENT_ETRACKER_ACTIVATED"; + case PacketType::CLIENT_TPROJECTILE: return "CLIENT_TPROJECTILE"; + case PacketType::CLIENT_TPROJECTILE_HIT: return "CLIENT_TPROJECTILE_HIT"; + case PacketType::CLIENT_TPROJECTILE_STARTCHARGE: return "CLIENT_TPROJECTILE_STARTCHARGE"; + case PacketType::CLIENT_ERECTOR_BALLS: return "CLIENT_ERECTOR_BALLS"; + case PacketType::CLIENT_ERECTOR_BRING_SPAWN: return "CLIENT_ERECTOR_BRING_SPAWN"; + case PacketType::CLIENT_EXELLER_SPAWN_CLONE: return "CLIENT_EXELLER_SPAWN_CLONE"; + case PacketType::CLIENT_EXELLER_TELEPORT_CLONE: return "CLIENT_EXELLER_TELEPORT_CLONE"; + case PacketType::CLIENT_MERCOIN_BONUS: return "CLIENT_MERCOIN_BONUS"; + case PacketType::CLIENT_RMZSLIME_HIT: return "CLIENT_RMZSLIME_HIT"; + case PacketType::CLIENT_LCEYE_REQUEST_ACTIVATE: return "CLIENT_LCEYE_REQUEST_ACTIVATE"; + case PacketType::CLIENT_KAFMONITOR_ACTIVATE: return "CLIENT_KAFMONITOR_ACTIVATE"; + case PacketType::CLIENT_RING_COLLECTED: return "CLIENT_RING_COLLECTED"; + case PacketType::CLIENT_RING_BROKE: return "CLIENT_RING_BROKE"; + case PacketType::CLIENT_BRING_COLLECTED: return "CLIENT_BRING_COLLECTED"; + case PacketType::CLIENT_NAPICE_ACTIVATE: return "CLIENT_NAPICE_ACTIVATE"; + case PacketType::CLIENT_SPRING_USE: return "CLIENT_SPRING_USE"; + case PacketType::CLIENT_PFLIT_ACTIVATE: return "CLIENT_PFLIT_ACTIVATE"; + case PacketType::CLIENT_VVVASE_BREAK: return "CLIENT_VVVASE_BREAK"; + case PacketType::CLIENT_RMZSHARD_COLLECT: return "CLIENT_RMZSHARD_COLLECT"; + case PacketType::CLIENT_RMZSHARD_LAND: return "CLIENT_RMZSHARD_LAND"; + case PacketType::CLIENT_DTASS_ACTIVATE: return "CLIENT_DTASS_ACTIVATE"; + case PacketType::CLIENT_HDDOOR_TOGGLE: return "CLIENT_HDDOOR_TOGGLE"; + case PacketType::CLIENT_FART_PUSH: return "CLIENT_FART_PUSH"; + case PacketType::CLIENT_LOBBY_READY_STATE: return "CLIENT_LOBBY_READY_STATE"; + case PacketType::CLIENT_REQUESTED_INFO: return "CLIENT_REQUESTED_INFO"; + case PacketType::CLIENT_PLAYER_DATA: return "CLIENT_PLAYER_DATA"; + case PacketType::CLIENT_PLAYER_HURT: return "CLIENT_PLAYER_HURT"; + case PacketType::CLIENT_SOUND_EMIT: return "CLIENT_SOUND_EMIT"; + case PacketType::CLIENT_PING: return "CLIENT_PING"; + case PacketType::CLIENT_REVIVAL_PROGRESS: return "CLIENT_REVIVAL_PROGRESS"; + case PacketType::CLIENT_PLAYER_HEAL: return "CLIENT_PLAYER_HEAL"; + case PacketType::CLIENT_PLAYER_HEAL_PART: return "CLIENT_PLAYER_HEAL_PART"; + case PacketType::SERVER_REVIVAL_PROGRESS: return "SERVER_REVIVAL_PROGRESS"; + case PacketType::SERVER_REVIVAL_STATUS: return "SERVER_REVIVAL_STATUS"; + case PacketType::SERVER_REVIVAL_RINGSUB: return "SERVER_REVIVAL_RINGSUB"; + case PacketType::SERVER_REVIVAL_REVIVED: return "SERVER_REVIVAL_REVIVED"; + case PacketType::CLIENT_REQUEST_CHARACTER: return "CLIENT_REQUEST_CHARACTER"; + case PacketType::CLIENT_REQUEST_EXECHARACTER: return "CLIENT_REQUEST_EXECHARACTER"; + case PacketType::CLIENT_VOTE_REQUEST: return "CLIENT_VOTE_REQUEST"; + case PacketType::CLIENT_PLAYER_DEATH_STATE: return "CLIENT_PLAYER_DEATH_STATE"; + case PacketType::CLIENT_PLAYER_ESCAPED: return "CLIENT_PLAYER_ESCAPED"; + case PacketType::SERVER_PLAYER_ESCAPED: return "SERVER_PLAYER_ESCAPED"; + case PacketType::CLIENT_LOBBY_PLAYERS_REQUEST: return "CLIENT_LOBBY_PLAYERS_REQUEST"; + case PacketType::CLIENT_CREAM_SPAWN_RINGS: return "CLIENT_CREAM_SPAWN_RINGS"; + case PacketType::CLIENT_SPAWN_EFFECT: return "CLIENT_SPAWN_EFFECT"; + case PacketType::CLIENT_CHAT_MESSAGE: return "CLIENT_CHAT_MESSAGE"; + case PacketType::CLIENT_LOBBY_CHOOSEVOTEKICK: return "CLIENT_LOBBY_CHOOSEVOTEKICK"; + case PacketType::CLIENT_LOBBY_CHOOSEBAN: return "CLIENT_LOBBY_CHOOSEBAN"; + case PacketType::CLIENT_LOBBY_CHOOSEKICK: return "CLIENT_LOBBY_CHOOSEKICK"; + case PacketType::CLIENT_LOBBY_CHOOSEOP: return "CLIENT_LOBBY_CHOOSEOP"; + case PacketType::CLIENT_PLAYER_PALETTE: return "CLIENT_PLAYER_PALETTE"; + case PacketType::CLIENT_PET_PALETTE: return "CLIENT_PET_PALETTE"; + case PacketType::SERVER_RESULTS: return "SERVER_RESULTS"; + case PacketType::SERVER_RESULTS_DATA: return "SERVER_RESULTS_DATA"; + case PacketType::CLIENT_RESULTS_REQUEST: return "CLIENT_RESULTS_REQUEST"; + case PacketType::CLIENT_STATS_REPORT: return "CLIENT_STATS_REPORT"; + case PacketType::SERVER_PREIDENTITY: return "SERVER_PREIDENTITY"; + case PacketType::SERVER_FELLA: return "SERVER_FELLA"; + case PacketType::CLIENT_PLAYER_POTATER: return "CLIENT_PLAYER_POTATER"; + default: return ""; + } +} + +static constexpr int PACKET_MAXSIZE = 256; + +#undef min +#undef max + +namespace DisasterServer { + class Server; + class Client; + + class Packet { + std::array buffer{}; + PacketType type; + size_t position = 0; + size_t len = 0; + public: + explicit Packet(ENetPacket *packet); + explicit Packet(PacketType type); + ~Packet(); + + PacketType getPacketType() { + return type; + } + + template + T read() { + static_assert(std::is_trivially_copyable_v, "Packet::read requires trivially copyable type"); + + if (position > len || sizeof(T) > len - position) { + Err("Packet underflow: trying to read {} bytes at position {} from {} byte packet ({})", sizeof(T), position, len, getPacketTypeName(type)); + throw std::runtime_error("Packet underflow"); + } + + T value {}; + std::memcpy(&value, buffer.data() + position, sizeof(T)); + position += sizeof(T); + + return value; + } + + template + void write(T value) { + static_assert(std::is_trivially_copyable_v, "Packet::write requires trivially copyable type"); + + if (position > buffer.size() || sizeof(T) > buffer.size() - position) { + Err("Exceeding the Packet Size Limit. Max Size {}", PACKET_MAXSIZE); + throw std::runtime_error("Packet overflow"); + } + + std::memcpy(buffer.data() + position, &value, sizeof(T)); + position += sizeof(T); + + len = std::max(len, position); + } + + std::string readString(); + void writeString(const std::string &value); + + bool send(Client &client, bool reliable); + void sendBroadcast(Server &server, bool reliable, std::function predicate = [](const Client& _) { return true; }); + }; +} + + +#endif diff --git a/disasterserver/Core/Singleton.hpp b/disasterserver/Core/Singleton.hpp new file mode 100644 index 0000000..edd680c --- /dev/null +++ b/disasterserver/Core/Singleton.hpp @@ -0,0 +1,22 @@ +#ifndef SINGLETON_HPP +#define SINGLETON_HPP + +template +class Singleton +{ +public: + Singleton(const Singleton&) = delete; + Singleton& operator=(const Singleton&) = delete; + + static C& getInstance() + { + static C instance; + return instance; + } + +protected: + Singleton() = default; + ~Singleton() = default; +}; + +#endif //SINGLETON_HPP diff --git a/disasterserver/Core/Time.cpp b/disasterserver/Core/Time.cpp new file mode 100644 index 0000000..4817aaa --- /dev/null +++ b/disasterserver/Core/Time.cpp @@ -0,0 +1,48 @@ +#include "Time.hpp" +#include + +#include "Log.hpp" + +bool init = false; +double freq = 0; + +void time_start(TimeStamp* timer) +{ +#ifdef _WIN32 + LARGE_INTEGER li; + + if (!init) + { + if (!QueryPerformanceFrequency(&li)) + { + Err("Failed to query perfomance frequency!"); + return; + } + + freq = (double)(li.QuadPart) / 1000.0; + init = true; + } + + QueryPerformanceCounter(&li); + *timer = (li.QuadPart / freq); +#else + struct timespec _t; + clock_gettime(CLOCK_MONOTONIC, &_t); + *timer = _t.tv_sec * 1000 + _t.tv_nsec / 1e6; +#endif +} + +double time_end(TimeStamp* timer) +{ +#ifdef _WIN32 + LARGE_INTEGER li; + QueryPerformanceCounter(&li); + return (double)((li.QuadPart) / freq) - (*timer); +#else + struct timespec _t; + clock_gettime(CLOCK_MONOTONIC, &_t); + + double current = _t.tv_sec * 1000 + _t.tv_nsec / 1e6; + return current - (*timer); +#endif +} \ No newline at end of file diff --git a/disasterserver/Core/Time.hpp b/disasterserver/Core/Time.hpp new file mode 100644 index 0000000..c12fe61 --- /dev/null +++ b/disasterserver/Core/Time.hpp @@ -0,0 +1,14 @@ +#ifndef DISASTERSERVER_TIME_HPP +#define DISASTERSERVER_TIME_HPP + +#if defined(_WIN32) + #define WIN32_LEAN_AND_MEAN + #include +#endif + +typedef double TimeStamp; +void time_start (TimeStamp* timer); +double time_end (TimeStamp* timer); + + +#endif //DISASTERSERVER_TIME_HPP diff --git a/disasterserver/GameStateController.cpp b/disasterserver/GameStateController.cpp new file mode 100644 index 0000000..c63d26d --- /dev/null +++ b/disasterserver/GameStateController.cpp @@ -0,0 +1,212 @@ +#include "GameStateController.hpp" +#include "Server.hpp" + +#include "Core/Colors.hpp" + +using namespace DisasterServer; + +GameStateController::GameStateController(Server *server): server(server), lobby(server, this), charSelect(server, this) { +} + +GameStateController::~GameStateController() = default; + +bool GameStateController::playerJoined(Client &peer) { + Packet packet(PacketType::SERVER_LOBBY_EXE_CHANCE); + packet.write(peer.getExeChance()); + packet.send(peer, true); + + Packet playerJoined(PacketType::SERVER_PLAYER_JOINED); + playerJoined.write(peer.getId()); + playerJoined.writeString(peer.getNickname()); + playerJoined.write(peer.getLobbyIcon()); + playerJoined.write(peer.getPet()); + this->server->broadcast_ex(playerJoined, true, peer.getId()); + + switch (state) { + case States::LOBBY: + case States::MAPVOTE: + return lobby.joined(peer); + + case States::CHARSELECT: { + return charSelect.joined(peer); + } + case States::GAME: { + return true; + } + case States::RESULTS: { + break; + } + default: break; + } + + return true; +} + +void GameStateController::playerLeft(Client &peer) { + Packet packet(PacketType::SERVER_PLAYER_LEFT); + packet.write(peer.getId()); + packet.sendBroadcast(*server, true); + + switch (state) + { + case States::LOBBY: + case States::MAPVOTE: + lobby.leaved(peer); + break; + + case States::CHARSELECT: + charSelect.leaved(peer); + break; + + case States::GAME: + //game_state_tick(server); + break; + + case States::RESULTS: + //results_state_tick(server); + break; + } +} + +void GameStateController::tick() { + switch (state) + { + case States::LOBBY: + case States::MAPVOTE: + lobby.tick(); + break; + + case States::CHARSELECT: + charSelect.tick(); + break; + + case States::GAME: + // game_state_tick(server); + break; + + case States::RESULTS: + // results_state_tick(server); + break; + } +} + +bool GameStateController::handle(Client &peer, Packet &packet) { + switch (packet.getPacketType()) { + case PacketType::CLIENT_LOBBY_CHOOSEBAN: { + if (!peer.isOpped()) { + break; + } + + clientId pid = packet.read(); + + for (auto &c : server->getClients()) { + if (c->getId() == pid) { + //TODO: add ban logic + c->disconnect(DisconnectReason::BANNEDBYHOST); + } + } + + break; + } + case PacketType::CLIENT_LOBBY_CHOOSEKICK: { + if (!peer.isOpped()) { + break; + } + + clientId pid = packet.read(); + + for (auto &c : server->getClients()) { + if (c->getId() == pid) { + //TODO: add kick logic + c->disconnect(DisconnectReason::KICKEDBYHOST); + } + } + + break; + } + case PacketType::CLIENT_LOBBY_CHOOSEOP: { + if (!peer.isOpped()) { + break; + } + + clientId pid = packet.read(); + + for (auto &c : server->getClients()) { + if (c->getId() == pid) { + //TODO: add operator logic + server->send_message(peer, "{}you're an operator now", CLRCODE_GRN); + } + } + + break; + } + default: break; + } + switch (state) { + case States::LOBBY: + case States::MAPVOTE: + lobby.handle(peer, packet); + break; + + case States::CHARSELECT: + charSelect.handle(peer, packet); + break; + + case States::GAME: + // game state handle + break; + + case States::RESULTS: + // results state handle + break; + } + + return true; +} + +unsigned long GameStateController::cmd_parse(std::string &string) { + static std::array clr_list = CLRLIST; + + std::string current; + bool started = false; + + for (char ch : string) + { + if (!started && std::isspace(static_cast(ch))) + continue; + + started = true; + + if (std::isspace(static_cast(ch))) + break; + + bool invalid = false; + + for (int j = 0; j < CLRLIST_LEN; ++j) + { + if (ch == clr_list[j][0]) + { + invalid = true; + break; + } + } + + if (!invalid) + current += ch; + } + + unsigned long hash = 0; + + for (unsigned char ch : current) + hash = 31 * hash + ch; + + return hash; +} + +bool GameStateController::cmd_handle(const Client &client, commandHash hash, const std::string &string) { + switch (hash) { + default: return false; break; + } + + return true; +} diff --git a/disasterserver/GameStateController.hpp b/disasterserver/GameStateController.hpp new file mode 100644 index 0000000..e3b26ab --- /dev/null +++ b/disasterserver/GameStateController.hpp @@ -0,0 +1,64 @@ +#ifndef DISASTERSERVER_STATEMACHINE_HPP +#define DISASTERSERVER_STATEMACHINE_HPP + +#include "Core/Packet.hpp" +#include "States/LobbyState.hpp" +#include "States/CharSelect.hpp" + +namespace DisasterServer +{ + class Client; + + enum class States { + LOBBY, + MAPVOTE, + CHARSELECT, + GAME, + RESULTS + }; + +#define CMD_HELP 45680751 +#define CMD_MAP 1478254 +#define CMD_STINK 1426706039 +#define CMD_VK 47971 +#define CMD_VP 47976 +#define CMD_BAN 1467681 +#define CMD_KICK 45773684 +#define CMD_OP 47759 +#define CMD_YES 1489913 +#define CMD_Y 1547 +#define CMD_NO 47727 +#define CMD_N 1536 +#define CMD_INFO 45719004 +#define CMD_LOBBY 1420085352 + + using commandHash = unsigned long; + + class GameStateController { + Server *server = nullptr; + States state = States::LOBBY; + + LobbyState lobby; + CharSelectState charSelect; + public: + explicit GameStateController(Server* server); + ~GameStateController(); + + bool playerJoined(Client& peer); + void playerLeft(Client& peer); + void tick(); + bool handle(Client& peer, Packet& packet); + + commandHash cmd_parse(std::string& string); + bool cmd_handle(const Client& client, commandHash hash, const std::string& string); + + States getCurrentState() const { return state; } + void setState(States state) { this->state = state; } + + + LobbyState& getLobbyState() { return lobby; } + CharSelectState& getCharSelect() { return charSelect; } + }; +} + +#endif //DISASTERSERVER_STATEMACHINE_HPP diff --git a/disasterserver/Main.cpp b/disasterserver/Main.cpp new file mode 100644 index 0000000..ef9ffc2 --- /dev/null +++ b/disasterserver/Main.cpp @@ -0,0 +1,32 @@ +#include "Server.hpp" + +#include "Core/Log.hpp" + +int main(int argc, char *argv[]) { +#ifdef _WIN32 + SetConsoleCP(CP_UTF8); + SetConsoleOutputCP(CP_UTF8); + + HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE); + + DWORD mode = 0; + if (GetConsoleMode(handle, &mode)) { + mode |= ENABLE_VIRTUAL_TERMINAL_PROCESSING; + SetConsoleMode(handle, mode); + } +#endif + + try { + enet_initialize(); + + Info("- DisasterServerCXX v{}", DisasterServer::BUILD_VERSION); + Info("- Build from {} {}", __DATE__, __TIME__); + + DisasterServer::Server server; + server.initialize(); + + enet_deinitialize(); + } catch (std::exception& e) { + Err("Exception: {}", e.what()); + } +} diff --git a/disasterserver/Server.cpp b/disasterserver/Server.cpp new file mode 100644 index 0000000..f0df033 --- /dev/null +++ b/disasterserver/Server.cpp @@ -0,0 +1,232 @@ +#include "Server.hpp" + +#include + +#include "Core/Packet.hpp" +#include "Core/Log.hpp" +#include "Core/Time.hpp" + +#include "GameStateController.hpp" +#include "Core/Colors.hpp" + +using namespace DisasterServer; + + +Server::Server(const uint16_t n) : id(n), stateManager(this) { + ENetAddress addr; + addr.host = ENET_HOST_ANY; + addr.port = BASE_SERVER_PORT + n; + host = enet_host_create(&addr, 50, 2, 0, 0); + + Info("Listening on port {}", addr.port); +} + +Server::~Server() { + enet_host_destroy(host); +}; + +void Server::initialize() { + TimeStamp ticker; + time_start(&ticker); + + double next_tick = time_end(&ticker); + double heartbeat = 0.0; + constexpr double TARGET_FPS = 1000.0 / 60; + + // + + while (!running) { + ENetEvent ev; + if (enet_host_service(host, &ev, 5) > 0) { + switch (ev.type) { + case ENET_EVENT_TYPE_CONNECT: { + char buf[250]; + enet_address_get_host_ip(&ev.peer->address, buf, 250); + + const clientId id = ev.peer->incomingPeerID + 1; + + auto client = std::make_unique(this, ev.peer, id, buf); + Client *rawClient = client.get(); + ev.peer->data = rawClient; + peers.push_back(std::move(client)); + + Debug("Connection peer id {}", rawClient->getId()); + + Packet pack(PacketType::SERVER_PREIDENTITY); + + auto &auth = rawClient->getAuthPeer(); + auth.one = (uint8_t) rand() % 128; + auth.two = (uint8_t) rand() % 255; + + uint32_t type = 0; + + switch (rand() % 3) + { + case 0: + type = 1u << 9; + break; + + case 1: + type = 1u << 31; + break; + + case 2: + type = 1u << 26; + break; + + default: break; + } + + for (int bit = 0; bit < 32; ++bit) + { + if (bit == 9 || bit == 31 || bit == 26) + continue; + + if (rand() % 3 <= 1) + type &= ~(1u << bit); + else + type |= 1u << bit; + } + + auth.type = type; + + pack.write(0); + pack.write(1); + pack.write(auth.one); + pack.write((uint8_t) rand() % 2); + pack.write(auth.two); + + const uint8_t key[6] = { 0x00, 0x00, 0xFF, 0x1F, 0x80, 0x14 }; + + for (int i = 0; i < 3; i++) { + pack.write(key[rand() % sizeof(key)]); + } + + pack.write(auth.type); + pack.send(*rawClient, true); + + break; + } + case ENET_EVENT_TYPE_DISCONNECT: { + Client *client = static_cast(ev.peer->data); + + if (!client) { + break; + } + + Info("{} (id {}) left.", client->getNickname(), client->getId()); + + if (client->isOpped() && client->isShouldTimeout()) { + + } + + if (client->isVerified()) { + stateManager.playerLeft(*client); + } + + ev.peer->data = nullptr; + + auto it = std::find_if( + peers.begin(), + peers.end(), + [client](const auto& p) { + return p.get() == client; + }); + + if (it != peers.end()) { + peers.erase(it); + } + + break; + } + case ENET_EVENT_TYPE_RECEIVE: { + Client *client = static_cast(ev.peer->data); + + if (!client) { + enet_packet_destroy(ev.packet); + break; + } + + if (ev.packet->dataLength < 2) { + enet_packet_destroy(ev.packet); + break; + } + + Packet packet(ev.packet); + + if (packet.getPacketType() == PacketType::IDENTITY) { + if (!client->identity(packet)) { + Debug("Identity failed for id {}", client->getId()); + } + } else { + client->message_received(packet); + } + break; + } + + default: break; + } + } + + double now = time_end(&ticker); + while (next_tick < now) { + next_tick += TARGET_FPS; + + stateManager.tick(); + + // Heartbeat + if (peers.size() > 0) { + Packet pack(PacketType::SERVER_HEARTBEAT); + if (heartbeat >= (TICKSPERSEC * 2)) + { + pack.sendBroadcast(*this, true); + //Debug("Heartbeat done."); + heartbeat = 0; + } + heartbeat += delta; + } + + delta = 1; + } + } +} + +void Server::disconnect_by_id(const clientId client_id, DisconnectReason reason, const std::string &message) { + for (auto &client : peers) { + if (client->getId() == client_id) { + return client->disconnect(reason, message); + } + } +} + +void Server::broadcast_ex(Packet &packet, bool reliable, clientId ignore) { + Debug("PacketType::{} sending broadcast, ignoring client {}", getPacketTypeName(packet.getPacketType()), ignore); + packet.sendBroadcast(*this, reliable, [ignore](const Client& v) { return v.getId() != ignore; }); +} + +size_t Server::getClientsInGameCount() { + return std::ranges::count_if(peers, + [](const auto& cl) { + return cl->isInGame(); + } + ); +} + +void Server::send_message(Client &client, std::string message) { + std::ranges::transform(message, message.begin(), [](const unsigned char c){ return std::tolower(c); }); + Packet packet(PacketType::CLIENT_CHAT_MESSAGE); + packet.write(0); + packet.writeString(message); + packet.send(client, true); +} + +void Server::send_broadcast_message(clientId sender, std::string message) { + Packet packet(PacketType::CLIENT_CHAT_MESSAGE); + packet.write(sender); + packet.writeString(message); + packet.sendBroadcast(*this, true); +} + +GameStateController &Server::getGameStateController() { + return stateManager; +} \ No newline at end of file diff --git a/disasterserver/Server.hpp b/disasterserver/Server.hpp new file mode 100644 index 0000000..998ff38 --- /dev/null +++ b/disasterserver/Server.hpp @@ -0,0 +1,62 @@ +#ifndef DISASTERSERVER_SERVER_HPP +#define DISASTERSERVER_SERVER_HPP + +#include "Client.hpp" +#include "GameStateController.hpp" + +constexpr int TICKSPERSEC = 60; + +namespace DisasterServer +{ + class GameStateController; + + constexpr int MAX_PLAYERS = 7; + constexpr int MAP_COUNT = 20; + constexpr int BUILD_VERSION = 1101; + constexpr int BASE_SERVER_PORT = 8606; + + + + class Server { + uint16_t id = 0; + bool running = false; + + ENetHost *host = nullptr; + + std::vector> peers; + GameStateController stateManager; + double delta = 0; + public: + Server(uint16_t n = 0); + ~Server(); + void initialize(); + + void disconnect_by_id(clientId client_id, DisconnectReason reason, const std::string& message = ""); + + void send_message(Client &client, std::string message); + void send_broadcast_message(clientId sender, std::string message); + + template + void send_message(Client &client, std::format_string fmt, Args&&... args) { + send_message(client, std::format(fmt, std::forward(args)...)); + } + + template + void send_broadcast_message(clientId sender, std::format_string fmt, Args&&... args) { + send_broadcast_message(sender, std::format(fmt, std::forward(args)...)); + } + + void broadcast_ex(Packet &packet, bool reliable, clientId ignore); + + + size_t getClientsInGameCount(); + std::vector> &getClients() { return peers; } + GameStateController &getGameStateController(); + + double getDelta() { + return delta; + } + }; +} + +#endif //DISASTERSERVER_SERVER_HPP diff --git a/disasterserver/States/CharSelect.cpp b/disasterserver/States/CharSelect.cpp new file mode 100644 index 0000000..64c8ee0 --- /dev/null +++ b/disasterserver/States/CharSelect.cpp @@ -0,0 +1,259 @@ +#include "CharSelect.hpp" + +#include + +#include "Server.hpp" +#include "Client.hpp" +#include "GameStateController.hpp" +#include "Core/Colors.hpp" + +using namespace DisasterServer; + +CharSelectState::CharSelectState(Server* server, GameStateController* controller) : server(server), controller(controller) { +} + +bool CharSelectState::chooseExe() { + uint32_t weight = 0; + + for (auto& peer : server->getClients()) { + if (!peer || !peer->isInGame()) + continue; + + peer->setExeCharacter(ExesCharacters::NONE); + peer->setSurvCharacter(SurvCharacters::NONE); + + weight += peer->getExeChance(); + } + + if (weight == 0) + weight++; + + uint32_t rnd = static_cast(std::rand()) % weight; + + for (auto& peer : server->getClients()) { + if (!peer || !peer->isInGame()) + continue; + + if (peer->getExeChance() >= 100) { + exe = peer->getId(); + return true; + } + + if (rnd < peer->getExeChance() && !peer->isModified()) { + Info("{} (id {}, c {}) is exe!", peer->getNickname(), peer->getId(), peer->getExeChance()); + + peer->setExeChance(1 + std::rand() % 1); + + exe = peer->getId(); + return true; + } + + rnd -= peer->getExeChance(); + } + + exe = static_cast(-1); + return false; +} + +bool CharSelectState::checkState() { + bool shouldStart = true; + + for (auto& peer : server->getClients()) { + if (!peer->isInGame()) + continue; + + if (peer->getExeCharacter() == ExesCharacters::NONE && + peer->getSurvCharacter() == SurvCharacters::NONE) { + shouldStart = false; + break; + } + } + + if (shouldStart) { + controller->setState(States::GAME); //Game start + return true; + } + + return true; +} + +bool CharSelectState::init(int8_t selectedMap) { + Debug("Attempting to enter ST_CHARSELECT..."); + + if (!chooseExe()) { + Err("Failed to pick exe for some reason!"); + + controller->setState(States::LOBBY); + return true; + } + + map = selectedMap; + controller->setState(States::CHARSELECT); + + countdownSec = 30; + countdown = TICKSPERSEC; + + avail.fill(true); + + Packet pack(PacketType::SERVER_LOBBY_EXE); + pack.write(exe); + pack.write(map); + pack.sendBroadcast(*server, true); + + Packet timePack(PacketType::SERVER_CHAR_TIME_SYNC); + timePack.write(countdownSec); + timePack.sendBroadcast(*server, true); + + Info("{}Server is now in {}Character Select{}", CLRCODE_YLW, CLRCODE_PUR, CLRCODE_RST); + + return true; +} + +bool CharSelectState::handle(Client& client, Packet& packet) { + switch (packet.getPacketType()) { + case PacketType::CLIENT_REQUEST_EXECHARACTER: { + if (!client.isInGame()) + break; + + if (exe != client.getId()) { + client.disconnect(DisconnectReason::OTHER, "Invalid exe character request"); + return false; + } + + uint8_t id = packet.read(); + id--; + + if (id > static_cast(ExesCharacters::COUNT)) { + client.disconnect(DisconnectReason::OTHER, "Invalid exe character"); + return false; + } + + client.setExeCharacter(static_cast(id)); + + Packet pack(PacketType::SERVER_LOBBY_EXECHARACTER_RESPONSE); + pack.write(id); + RAssert(pack.send(client, true)); + + Packet change(PacketType::SERVER_LOBBY_CHARACTER_CHANGE); + change.write(client.getId()); + change.write(id); + change.sendBroadcast(*server, true); + + Info("{}{}{} (id {}) choses [{}{}{}]!", client.getNickname(), CLRCODE_RST, "", client.getId(), CLRCODE_RED, EXE_NAMES[id], CLRCODE_RST); + return checkState(); + } + + case PacketType::CLIENT_REQUEST_CHARACTER: { + if (!client.isInGame()) { + break; + } + + if (client.getSurvCharacter() != SurvCharacters::NONE) { + break; + } + + if (exe == client.getId()) { + client.disconnect(DisconnectReason::OTHER, "Exe cannot select survivor character"); + return false; + } + + uint8_t id = packet.read(); + id--; + + if (id > static_cast(SurvCharacters::COUNT)) { + client.disconnect(DisconnectReason::OTHER, "Invalid survivor character"); + return false; + } + + const bool available = avail[id]; + + if (available) { + avail[id] = false; + } + + Packet response(PacketType::SERVER_LOBBY_CHARACTER_RESPONSE); + response.write(id + 1); + response.write(available); + + if (!response.send(client, true)) + return false; + + if (available) { + client.setSurvCharacter(static_cast(id)); + + Packet change(PacketType::SERVER_LOBBY_CHARACTER_CHANGE); + change.write(client.getId()); + change.write(id + 1); + change.sendBroadcast(*server, true); + } + + Info("{}{}{} (id {}) choses [{}{}{}]!", client.getNickname(), CLRCODE_RST, "", client.getId(), CLRCODE_GRN, SURV_NAMES[id], CLRCODE_RST); + return checkState(); + } + + case PacketType::CLIENT_CHAT_MESSAGE: { + const clientId pid = packet.read(); + const std::string message = packet.readString(); + + if (message.size() > 40) { + client.disconnect(DisconnectReason::OTHER, "Chat message too long"); + return false; + } + + client.setTimeout(0); + + Info("{}{}{} (id {}): {}", client.getNickname(), CLRCODE_RST, "", client.getId(), message); + break; + } + + default: break; + } + + return true; +} + +void CharSelectState::tick() { + if (countdown <= 0) { + countdown += TICKSPERSEC; + + if (--countdownSec == 0) { + for (auto& peer : server->getClients()) { + if (!peer || !peer->isInGame()) + continue; + + if (peer->getExeCharacter() == ExesCharacters::NONE + && peer->getSurvCharacter() == SurvCharacters::NONE) { + + peer->disconnect(DisconnectReason::AFKTIMEOUT); + } + } + } + + Packet pack(PacketType::SERVER_CHAR_TIME_SYNC); + pack.write(countdownSec); + pack.sendBroadcast(*server, true); + } + + countdown -= server->getDelta(); +} + +bool CharSelectState::joined(Client& client) { + return true; +} + +bool CharSelectState::leaved(Client& client) { + if (client.getSurvCharacter() != SurvCharacters::NONE) { + const auto character = client.getSurvCharacter(); + const size_t index = static_cast(character); + + if (index < avail.size()) { + avail[index] = true; + } + } + + if (this->server->getClientsInGameCount() <= 1 || client.getId() == exe) { + return controller->getLobbyState().init(); + } + + return checkState(); +} \ No newline at end of file diff --git a/disasterserver/States/CharSelect.hpp b/disasterserver/States/CharSelect.hpp new file mode 100644 index 0000000..ad7416a --- /dev/null +++ b/disasterserver/States/CharSelect.hpp @@ -0,0 +1,46 @@ +#ifndef DISASTERSERVER_CHARSELECTSTATE_HPP +#define DISASTERSERVER_CHARSELECTSTATE_HPP + +#include +#include + +#include "Client.hpp" +#include "Core/Packet.hpp" + +namespace DisasterServer { + +class GameStateController; + +class CharSelectState { + Server *server = nullptr; + GameStateController* controller = nullptr; + + double countdown = 0; + uint8_t countdownSec = 30; + + int8_t map = 0; + clientId exe = 0; + + std::array avail{}; + + bool checkState(); + bool chooseExe(); + +public: + CharSelectState(Server* server, GameStateController* controller); + ~CharSelectState() = default; + + bool init(int8_t map); + + bool joined(Client& client); + bool leaved(Client& client); + void tick(); + bool handle(Client& client, Packet& packet); + + clientId getExe() const { return exe; } + int8_t getMap() const { return map; } +}; + +} + +#endif // DISASTERSERVER_CHARSELECTSTATE_HPP \ No newline at end of file diff --git a/disasterserver/States/LobbyState.cpp b/disasterserver/States/LobbyState.cpp new file mode 100644 index 0000000..4b9dc53 --- /dev/null +++ b/disasterserver/States/LobbyState.cpp @@ -0,0 +1,485 @@ +#include "LobbyState.hpp" + +#include + +#include "Server.hpp" +#include "GameStateController.hpp" +#include "Core/Colors.hpp" + +using namespace DisasterServer; + +LobbyState::LobbyState(Server *server, GameStateController *controller) : server(server), controller(controller), vote(server) { +} + +LobbyState::~LobbyState() = default; + +bool LobbyState::init() { + for (auto &peer : server->getClients()) { + peer->setReady(false); + peer->setVoted(false); + peer->setTimeout(0); + + if (!peer->isInGame()) { + peer->setInGame(true); + + Packet pack(PacketType::SERVER_IDENTITY_RESPONSE); + pack.write(1); + pack.write(peer->getId()); + if (!pack.send(*peer, true)) { + peer->disconnect(DisconnectReason::SERVERTIMEOUT); + continue; + } + } else { + /* + if (v->id != server->game.exe) + v->exe_chance += 2 + rand() % 5; + */ + + Packet pack(PacketType::SERVER_LOBBY_EXE_CHANCE); + pack.write(peer->getExeChance()); + pack.send(*peer, true); + } + } + + controller->setState(States::LOBBY); + countdown = TICKSPERSEC; + countdown_sec = NO_COUNTDOWN; + prac_countdown = 0; + + Packet pack(PacketType::SERVER_GAME_BACK_TO_LOBBY); + pack.sendBroadcast(*server, true); + + return true; +} + +bool LobbyState::sendCountdown() { + Packet pack(PacketType::SERVER_LOBBY_COUNTDOWN); + pack.write(this->countdown_sec < NO_COUNTDOWN); + pack.write(countdown_sec); + pack.sendBroadcast(*server, true); + return true; +} + +bool LobbyState::checkCountdown() { + const auto players = &server->getClients(); + + if (players->size() <= 1) { + return true; + } + + const auto ready = std::ranges::count_if( + *players, + [](const auto& peer) { + return peer->isReady(); + } + ); + + Debug("Players isReady {}/{}", ready, players->size()); + + if (ready == players->size() && players->size() > 1) { + countdown = TICKSPERSEC; + countdown_sec = COUNTDOWN; + return sendCountdown(); + } + + if (countdown_sec != NO_COUNTDOWN) { + countdown = TICKSPERSEC; + countdown_sec = NO_COUNTDOWN; + return sendCountdown(); + } + + return true; +} + +void LobbyState::checkVote() { + if (vote.check()) { + switch (vote.getCurrentVoteType()) { + case VoteType::KICK: { + this->server->send_broadcast_message(0, "vote kick @succeeded~ (@{} ~from \\{})", vote.getVoteCount(), vote.getVoteTotal()); + this->server->disconnect_by_id(kick_target, DisconnectReason::KICKEDBYHOST); + break; + } + + case VoteType::PRACTICE: { + this->server->send_broadcast_message(0, "vote practice succeeded~ (@{} ~from \\{}", vote.getVoteCount(), vote.getVoteTotal()); + prac_countdown = 2 * TICKSPERSEC; + break; + } + + default: break; + } + } else { + switch (vote.getCurrentVoteType()) { + case VoteType::KICK: { + this->server->send_broadcast_message(0, "vote kick \\failed~ (@{} ~from \\{})", vote.getVoteCount(), vote.getVoteTotal()); + break; + } + + case VoteType::PRACTICE: { + this->server->send_broadcast_message(0, "vote practice \\failed~ (@{} ~from \\{}", vote.getVoteCount(), vote.getVoteTotal()); + break; + } + + default: break; + } + } + + + vote.setOnGoing(false); +} + +bool LobbyState::joined(Client &peer) { + RAssert(checkCountdown()); + return true; +} + +bool LobbyState::leaved(Client &peer) { + if (!peer.isInGame()) { + return true; + } + + RAssert(checkCountdown()); + return true; +} + +bool LobbyState::tick() { + switch (controller->getCurrentState()) { + case States::LOBBY: { + for (auto &peer : server->getClients()) { + if (peer->getVoteCooldown() > 0) { + peer->setVoteCooldown(peer->getVoteCooldown() - server->getDelta()); + } + + if (!peer->isReady()) { + + //Чтобы не мешалось + /* + peer->setTimeout(peer->getTimeout() + server->getDelta()); + if (std::fmod(peer->getTimeout(), 60) == 0) { + Debug("tick for {}: {}", peer->getNickname(), peer->getTimeout() / 60.0f); + } + */ + + if (peer->getTimeout() >= 25 * TICKSPERSEC) { + peer->disconnect(DisconnectReason::AFKTIMEOUT); + } + } else { + peer->setTimeout(0); + } + } + break; + } + default: break; + } + + if (vote.isOnGoing() && !vote.tick()) { + checkVote(); + } + + if (prac_countdown > 0) { + prac_countdown -= server->getDelta(); + if (prac_countdown <= 0) { + return init(); + } + } + + if (countdown_sec <= COUNTDOWN) { + if (countdown <= 0) { + countdown += TICKSPERSEC; + + if (--countdown_sec == 0) { + return controller->getCharSelect().init(map) || init(); + } + + RAssert(sendCountdown()); + } + + countdown -= server->getDelta(); + } + + return true; +} + +bool LobbyState::handle(Client &client, Packet &packet) { + bool result = true; + + switch (packet.getPacketType()) { + case PacketType::CLIENT_LOBBY_PLAYERS_REQUEST: { + for (auto &c : server->getClients()) { + if (client.getId() == c->getId()) { + continue; + } + + Packet pack(PacketType::SERVER_LOBBY_PLAYER); + pack.write(c->getId()); + pack.write(c->isReady()); + pack.writeString(c->getNickname()); + pack.write(c->getLobbyIcon()); + pack.write(c->getPet()); + if (!pack.send(client, true)) { + result = false; + break; + } + } + + Packet pack(PacketType::SERVER_LOBBY_CORRECT); + pack.send(client, true); + + server->send_message(client, "|build from &{} @{}~", __DATE__, __TIME__); + server->send_message(client, "|type .help for command list~"); + + break; + } + + case PacketType::CLIENT_CHAT_MESSAGE: { + clientId pid = packet.read(); + std::string message = packet.readString(); + + bool ignore = true; + commandHash hash = controller->cmd_parse(message); + + switch (hash) { + default: { + if (!controller->cmd_handle(client, hash, message)) { + ignore = false; + } + break; + } + + case CMD_MAP: { + /*if (!client.isOpped()) { + this->server->send_message(client, "{}you aren't an operator", CLRCODE_RED); + break; + }*/ + + int ind; + if (sscanf(message.c_str(), ".map %d", &ind) <= 0) { + this->server->send_message(client, "{}example:~ .map 1", CLRCODE_RED); + break; + } + + ind--; + if (ind < 0 || ind >= MAP_COUNT+1) { + this->server->send_message(client, "{}map should be between 1 and {}", CLRCODE_RED, MAP_COUNT+1); + break; + } + + controller->getCharSelect().init(ind); + break; + } + + case CMD_HELP: { + this->server->send_message(client, "~-----~ {}command list:{} ~-----~", CLRCODE_GRN, CLRCODE_RST); + this->server->send_message(client, "|- .vk~ - vote kick "); + this->server->send_message(client, "|- .info~ - information about server"); + this->server->send_message(client, "|- .vp~ - vote practice mode (wip)"); + break; + } + + case CMD_INFO: { + this->server->send_message(client, "|build from &{} @{}~", __DATE__, __TIME__); + this->server->send_message(client, "{}hander{} - original binary", CLRCODE_YLW, CLRCODE_RST); + this->server->send_message(client, "{}miles{}glitch{} - rewritten server to c++", CLRCODE_BLU, CLRCODE_PUR, CLRCODE_RST); + this->server->send_message(client, "{}faker{}null{}0{} - help with code", CLRCODE_GRA, CLRCODE_RED, CLRCODE_GRN, CLRCODE_RST); + break; + } + + case CMD_Y: + case CMD_YES: { + if (!vote.isOnGoing()) { + break; + } + + if (!client.isCanVote()) { + this->server->send_message(client, "{}you can't participate in this vote.", CLRCODE_RED); + break; + } + + if (vote.getCurrentVoteType() == VoteType::KICK && kick_target == client.getId()) { + this->server->send_message(client, "{}why are you kicking yourself ???", CLRCODE_RED); + break; + } + + switch (vote.add(client)) { + + case VoteState::SUCCESS: { + this->server->send_broadcast_message(0, "{}~ {}voted~.", client.getNickname(), CLRCODE_GRN); + break; + } + + case VoteState::ALREADY_VOTED: { + this->server->send_message(client, "{}you have already voted.", CLRCODE_RED); + break; + } + + case VoteState::FULL: { + checkVote(); + break; + } + + default: break; + } + + break; + } + + + case CMD_VP: { + if (vote.isOnGoing()) { + if (!client.isCanVote()) { + this->server->send_message(client, "{}you can't participate in this vote.", CLRCODE_RED); + break; + } + + if (pid == kick_target) { + switch (vote.add(client)) { + case VoteState::SUCCESS: { + this->server->send_broadcast_message(0, "{}~ {}voted~.", client.getNickname(), CLRCODE_GRN); + break; + } + case VoteState::ALREADY_VOTED: { + this->server->send_message(client, "{}you have already voted.", CLRCODE_RED); + break; + } + case VoteState::FULL: { checkVote(); break; } + default: break; + } + } else { + this->server->send_message(client, "{}another vote is already in progress.", CLRCODE_RED); + } + break; + } + + if (client.getVoteCooldown() > 0) { + this->server->send_message(client, "you cannot start another vote for {}", static_cast(client.getVoteCooldown() / TICKSPERSEC)); + break; + } + + if (!vote.init(VoteType::PRACTICE, 0)) { + this->server->send_message(client, "{}not enough participants.", CLRCODE_RED); + break; + } + + this->server->send_broadcast_message(0, "{}~ `started practice vote.~", client.getNickname()); + this->server->send_broadcast_message(0, "type @.yes~ or ignore"); + this->server->send_broadcast_message(0, "results will be summarized in @20~ sec"); + + vote.add(client); + client.setVoteCooldown(30 * TICKSPERSEC); + break; + } + + case CMD_VK: { + if (vote.isOnGoing()) { + this->server->send_message(client, "{}another vote is already in progress.", CLRCODE_RED); + break; + } + + if (client.getVoteCooldown() > 0) { + this->server->send_message(client, "you cannot start another vote for {}", static_cast(client.getVoteCooldown() / TICKSPERSEC)); + break; + } + + if (this->server->getClients().size() > 2) { + Packet pack(PacketType::SERVER_LOBBY_CHOOSEVOTEKICK); + pack.send(client, true); + } else { + this->server->send_message(client, "{}not enough participants.", CLRCODE_RED); + } + + break; + } + } + + Info("{} (id {}): {}", client.getNickname(), client.getId(), message); + if (!ignore) { + server->send_broadcast_message(client.getId(), message); + } + + break; + } + case PacketType::CLIENT_LOBBY_READY_STATE: { + uint8_t state = packet.read(); + client.setReady(state); + + Packet pack(PacketType::SERVER_LOBBY_READY_STATE); + pack.write(client.getId()); + pack.write(state); + pack.sendBroadcast(*this->server, true); + + break; + } + + case PacketType::CLIENT_LOBBY_CHOOSEVOTEKICK: { + clientId pid = packet.read(); + + if (vote.isOnGoing()) { + if (!client.isCanVote()) { + this->server->send_message(client, "{}you can't participate in this vote.", CLRCODE_RED); + break; + } + + if (pid == kick_target) { + switch (vote.add(client)) { + case VoteState::SUCCESS: { + this->server->send_broadcast_message(0, "{}~ {}voted~.", client.getNickname(), CLRCODE_GRN); + break; + } + case VoteState::ALREADY_VOTED: { + this->server->send_message(client, "{}you have already voted.", CLRCODE_RED); + break; + } + case VoteState::FULL: { checkVote(); break; } + default: break; + } + } else { + this->server->send_message(client, "{}another vote is already in progress.", CLRCODE_RED); + } + + break; + } else { + bool found = false; + for (auto &c : this->server->getClients()) { + if (c->getId() == pid) { + + if (c->isOpped()) { + this->server->send_message(client, "you're permissionless"); + return true; + } + + kick_target = c->getId(); + found = true; + break; + } + } + + if (found) { + if (client.getVoteCooldown() > 0) { + this->server->send_message(client, "you cannot start another vote for {}", static_cast(client.getVoteCooldown() / TICKSPERSEC)); + break; + } + + if (!vote.init(VoteType::KICK, kick_target)) { + this->server->send_message(client, "{}not enough participants.", CLRCODE_RED); + break; + } + + this->server->send_broadcast_message(0, "{}~ `started kick vote.~", client.getNickname()); + this->server->send_broadcast_message(0, "type @.yes~ or ignore"); + this->server->send_broadcast_message(0, "results will be summarized in @20~ sec"); + + vote.add(client); + client.setVoteCooldown(30 * TICKSPERSEC); + } else { + this->server->send_broadcast_message(0, "{}specified player not found.", CLRCODE_RED); + } + } + + break; + } + + default: break; + } + + return result; +} \ No newline at end of file diff --git a/disasterserver/States/LobbyState.hpp b/disasterserver/States/LobbyState.hpp new file mode 100644 index 0000000..ba9b88c --- /dev/null +++ b/disasterserver/States/LobbyState.hpp @@ -0,0 +1,51 @@ +#ifndef DISASTERSERVER_LOBBY_HPP +#define DISASTERSERVER_LOBBY_HPP + +#include +#include "Vote.hpp" + +constexpr int COUNTDOWN = 5; +constexpr int NO_COUNTDOWN = 5 + 1; + +namespace DisasterServer +{ + class GameStateController; + + class LobbyState { + Server *server = nullptr; + GameStateController *controller = nullptr; + + double countdown = 0; + double prac_countdown = 0; + uint8_t countdown_sec = 0; + Vote vote; + clientId kick_target = 0; + + /* Map Vote */ + uint8_t maps[3] = {}; + uint8_t votes[3] = {}; + + /* Character Select */ + int8_t map = 0; + clientId exe = 0; + std::unordered_map avail; + public: + explicit LobbyState(Server *server, GameStateController *controller); + ~LobbyState(); + + bool init(); + + bool sendCountdown(); + bool checkCountdown(); + void checkVote(); + + bool joined(Client &peer); + bool leaved(Client &peer); + bool tick(); + bool handle(Client &client, Packet &packet); + }; + + +} + +#endif //DISASTERSERVER_LOBBY_HPP diff --git a/disasterserver/States/Vote.cpp b/disasterserver/States/Vote.cpp new file mode 100644 index 0000000..70582f4 --- /dev/null +++ b/disasterserver/States/Vote.cpp @@ -0,0 +1,64 @@ +#include "Vote.hpp" + +#include + +#include "Client.hpp" +#include "Server.hpp" + +using namespace DisasterServer; + +Vote::Vote(Server *server) : server(server) {} + +Vote::~Vote() = default; + +bool Vote::init(VoteType type, clientId id) { + ongoing = false; + votes.clear(); + auto &players = server->getClients(); + this->type = type; + + for (auto &c: server->getClients()) { + c->setCanVote(c->getId() != id); + } + this->votedTotal = std::ranges::count_if(players, [](const auto& peer) { return peer->isCanVote(); }); + + if (votedTotal <= 1) { + return false; + } + + this->ongoing = true; + this->countdown = 20 * TICKSPERSEC; + return true; +} + +VoteState Vote::add(Client & voter) { + if (this->votes.contains(voter.getId())) { + return VoteState::ALREADY_VOTED; + } + + votes.insert(voter.getId()); + + if (votes.size() >= votedTotal) { + return VoteState::FULL; + } + + return VoteState::SUCCESS; +} + +bool Vote::tick() { + if (!ongoing) { + return false; + } + + countdown -= server->getDelta(); + + if (countdown <= 0) { + return false; + } + + return true; +} + +bool Vote::check() { + return votes.size() * 4 > votedTotal; +} \ No newline at end of file diff --git a/disasterserver/States/Vote.hpp b/disasterserver/States/Vote.hpp new file mode 100644 index 0000000..a4af456 --- /dev/null +++ b/disasterserver/States/Vote.hpp @@ -0,0 +1,52 @@ +#ifndef DISASTERSERVER_VOTE_HPP +#define DISASTERSERVER_VOTE_HPP + +#include + +#include "Client.hpp" + +namespace DisasterServer { + class Server; + + enum class VoteType + { + KICK, + PRACTICE + }; + + enum class VoteState + { + SUCCESS = 1, + NOT_ONGOING = 2, + NOT_ALLOWED = 3, + ALREADY_VOTED = 0, + FULL = -1, + }; + + class Vote { + Server *server = nullptr; + + VoteType type = VoteType::KICK; + bool ongoing = false; + + std::unordered_set votes; + size_t votedTotal; + double countdown = 0; + public: + Vote(Server *server); + ~Vote(); + + bool init(VoteType type, clientId id); + VoteState add(Client &voter); + bool tick(); + bool check(); + + void setOnGoing(bool flag) { ongoing = flag; } + bool isOnGoing() { return ongoing; } + VoteType getCurrentVoteType() { return type; } + size_t getVoteTotal() { return votedTotal; } + size_t getVoteCount() { return votes.size(); } + }; +} + +#endif //DISASTERSERVER_VOTE_HPP diff --git a/disasterserver_c/Android.c b/disasterserver_c/Android.c new file mode 100644 index 0000000..e323d68 --- /dev/null +++ b/disasterserver_c/Android.c @@ -0,0 +1,15 @@ +#include +#include +#include +#include + +JNIEXPORT jboolean JNICALL Java_com_teamexeempire_disaster2d_Disaster_disaster_1start +(JNIEnv* env, jclass class) +{ + if (!disaster_init()) + return false; + + Thread th; + ThreadSpawn(th, disaster_run, NULL); + return true; +} \ No newline at end of file diff --git a/disasterserver_c/Android.h b/disasterserver_c/Android.h new file mode 100644 index 0000000..d318f06 --- /dev/null +++ b/disasterserver_c/Android.h @@ -0,0 +1,20 @@ +#include +#ifndef _Included_com_teamexeempire_disaster2d_Disaster +#define _Included_com_teamexeempire_disaster2d_Disaster +#ifdef __cplusplus +extern "C" { +#endif +#undef com_teamexeempire_disaster2d_Disaster_MIN_PRIORITY +#define com_teamexeempire_disaster2d_Disaster_MIN_PRIORITY 1L +#undef com_teamexeempire_disaster2d_Disaster_NORM_PRIORITY +#define com_teamexeempire_disaster2d_Disaster_NORM_PRIORITY 5L +#undef com_teamexeempire_disaster2d_Disaster_MAX_PRIORITY +#define com_teamexeempire_disaster2d_Disaster_MAX_PRIORITY 10L + +JNIEXPORT jboolean JNICALL Java_com_teamexeempire_disaster2d_Disaster_disaster_1start +(JNIEnv*, jclass); + +#ifdef __cplusplus +} +#endif +#endif diff --git a/disasterserver_c/Api.h b/disasterserver_c/Api.h new file mode 100644 index 0000000..ac7b45f --- /dev/null +++ b/disasterserver_c/Api.h @@ -0,0 +1,10 @@ +#ifndef API_H +#define API_H + +#ifdef _WIN32 + #define SERVER_API __declspec(dllexport) +#else + #define SERVER_API +#endif + +#endif \ No newline at end of file diff --git a/disasterserver_c/Auth.c b/disasterserver_c/Auth.c new file mode 100644 index 0000000..fd5dca6 --- /dev/null +++ b/disasterserver_c/Auth.c @@ -0,0 +1,102 @@ +#include +#include +#include +#include + +bool auth_create_ticket(PeerData* peer, Packet* packet) +{ + peer->auth.one = (uint8_t) rand() % 128; + peer->auth.two = (uint8_t) rand() % 255; + + uint32_t type = 0; + + switch (rand() % 3) + { + case 0: + type = 1u << 9; + break; + + case 1: + type = 1u << 31; + break; + + case 2: + type = 1u << 26; + break; + + default: break; + } + + for (int bit = 0; bit < 32; ++bit) + { + if (bit == 9 || bit == 31 || bit == 26) + continue; + + if (rand() % 3 <= 1) + type &= ~(1u << bit); + else + type |= 1u << bit; + } + + + peer->auth.type = type; + // Red herrings? Nah, we have Red Rope(TM) + // All values here are complete bogus btw + PacketWrite(packet, packet_write16, 0); + PacketWrite(packet, packet_write16, 1); + PacketWrite(packet, packet_write8, peer->auth.one); + PacketWrite(packet, packet_write8, (uint8_t) rand() % 2); + PacketWrite(packet, packet_write8, peer->auth.two); + for (int i = 0; i < 3; i++) + { + const char key[] = { 0x00, 0x00, 0xFF, 0x1F, 0x80, 0x14 }; + PacketWrite(packet, packet_write8, key[rand() % sizeof(key)]); + } + PacketWrite(packet, packet_write32, peer->auth.type); + return true; +} + +bool auth_verify_ticket(PeerData* v, Packet* packet) +{ + PacketRead(checkcum, packet, packet_read64, uint64_t); + PacketRead(checkcum2, packet, packet_read64, uint64_t); + + Debug("checkcum : %x", checkcum); + Debug("checkcum2 : %x", checkcum2); + + uint64_t check = checkcum - v->auth.type; + uint64_t checka = checkcum2 - v->auth.type; + + Debug("check : %x", check); + Debug("checka : %x", checka); + + if ((v->auth.type >> 9) & 1) + { + if (check != 0x2f09cdda) + v->mod_tool = 1; + + if (checka != 0xf1006056) + v->mod_tool = 1; + } + else if ((v->auth.type & 0x80000000) != 0) + { + if (check != 0x947) + v->mod_tool = 1; + + if (checka != 0xb43) + v->mod_tool = 1; + } + else if ((v->auth.type >> 26) & 1) + { + if (check != 0xdcd) + v->mod_tool = 1; + + if (checka != 0xc15) + v->mod_tool = 1; + } + else + { + v->mod_tool = 1; + } + return true; +} diff --git a/disasterserver_c/Auth.h b/disasterserver_c/Auth.h new file mode 100644 index 0000000..b887bd7 --- /dev/null +++ b/disasterserver_c/Auth.h @@ -0,0 +1,19 @@ +#ifndef AUTH_H +#define AUTH_H +#include +#include + +// Override this struct in your auth provider +typedef struct +{ + uint32_t type; + uint8_t one; + uint8_t two; +} auth_peer_data; + +typedef struct PeerData PeerData; + +bool auth_create_ticket(PeerData* peer, Packet* packet); +bool auth_verify_ticket(PeerData* peer, Packet* packet); + +#endif diff --git a/disasterserver_c/CMakeLists.txt b/disasterserver_c/CMakeLists.txt new file mode 100644 index 0000000..333bb70 --- /dev/null +++ b/disasterserver_c/CMakeLists.txt @@ -0,0 +1,174 @@ +set(SOURCES + "Auth.c" + "Config.c" + "cJSON.c" + "UTF8.c" + "CMath.c" + "DyList.c" + "Log.c" + "Lib.c" + "Vote.c" + "Maps.c" + "Packet.c" + "Player.c" + "Palette.c" + "Zone.c" + + "Server.c" + "states/Lobby.c" + "states/Mapvote.c" + "states/CharSelect.c" + "states/Game.c" + "states/Results.c" + "io/Time.c" + + "entities/Ring.c" + "entities/CreamRing.c" + "entities/TailsProjectile.c" + "entities/EggmanTracker.c" + "entities/BlackRing.c" + "entities/ExellerClone.c" + "entities/RMZSlug.c" + "entities/RMZShard.c" + "entities/Act9Wall.c" + "entities/NotPerfect.c" + "entities/PFLift.c" + "entities/HDDoor.c" + "entities/SpkieController.c" + "entities/LCEye.c" + "entities/LCChain.c" + "entities/NAPSnowball.c" + "entities/NAPIce.c" + "entities/HillThunder.c" + "entities/VVLava.c" + "entities/YouCantRun.c" + "entities/TCAcid.c" + "entities/KAFSpeedBox.c" + "entities/TailsDoll.c" + "entities/DTBall.c" + "entities/DTStalactits.c" + "entities/Dummy.c" + "entities/WDLatern.c" + "entities/MJLava.c" + "entities/MJAss.c" + "entities/MJJudger.c" + + "maps/RavineMist.c" + "maps/Act9.c" + "maps/NotPerfect.c" + "maps/PricelessFreedom.c" + "maps/HauntingDream.c" + "maps/DotDotDot.c" + "maps/LimpCity.c" + "maps/NastyParadise.c" + "maps/Hill.c" + "maps/VolcanoValley.c" + "maps/YouCantRun.c" + "maps/TortureCave.c" + "maps/KindAndFair.c" + "maps/DarkTower.c" + "maps/FartZone.c" + "maps/MajinForest.c" + "maps/HideAndSeek.c" + "maps/WoodDream.c" + "maps/Marijuna.c" +) + +if(ANDROID) + add_library(DisasterServer SHARED "Android.c" ${SOURCES}) + + set(THREADS_PREFER_PTHREAD_FLAG ON) + find_package(Threads REQUIRED) + target_include_directories(DisasterServer PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}) + target_link_libraries(DisasterServer PRIVATE log enet m Threads::Threads) +else() + if(DYLIB) # Build .dll or .so + add_library(DisasterServer SHARED ${SOURCES}) + + if (WIN32) + target_link_libraries(DisasterServer PRIVATE enet ws2_32 winmm dbghelp) + else() # UNIX + set(THREADS_PREFER_PTHREAD_FLAG ON) + find_package(Threads REQUIRED) + target_link_libraries(DisasterServer PRIVATE enet m Threads::Threads) + endif() + + target_include_directories(DisasterServer PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}) + + else() # Build executable + if(BUILD_UI) + set(UI_SOURCES + "ui/Resources.c" + "ui/Main.c" + "ui/Image.c" + "ui/Label.c" + "ui/Button.c" + "ui/TButton.c" + "ui/MapList.c" + "ui/Presets.c" + "ui/MapListPreset.c" + "ui/PingPreset.c" + "ui/PlayerList.c" + ) + + if (WIN32) + add_executable(DisasterServer + ${SOURCES} + ${UI_SOURCES} + ) + + target_link_libraries(DisasterServer PRIVATE + ws2_32 + enet + winmm + dbghelp + SDL3-static + SDL3_image::SDL3_image + ) + + target_include_directories(DisasterServer PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}) + + target_sources(DisasterServer PRIVATE "${CMAKE_SOURCE_DIR}/resources/icon.rc") + + else() # UNIX + add_executable(DisasterServer + ${SOURCES} + ${UI_SOURCES} + ) + + set(THREADS_PREFER_PTHREAD_FLAG ON) + find_package(Threads REQUIRED) + target_link_libraries(DisasterServer PRIVATE enet m Threads::Threads + SDL3::SDL3-static + SDL3_image::SDL3_image + ) + endif() + + target_include_directories(DisasterServer PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}) + + else() + add_executable(DisasterServer + ${SOURCES} + Main.c + ) + + if (WIN32) + target_link_libraries(DisasterServer PRIVATE enet ws2_32 winmm dbghelp) + else() # UNIX + set(THREADS_PREFER_PTHREAD_FLAG ON) + find_package(Threads REQUIRED) + target_link_libraries(DisasterServer PRIVATE enet m Threads::Threads) + endif() + + target_include_directories(DisasterServer PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}) + + endif() + endif() +endif() + +if(MSVC) + add_definitions(-D_CRT_SECURE_NO_WARNINGS) +endif() + +unset(DYLIB CACHE) +unset(BUILD_UI CACHE) diff --git a/disasterserver_c/CMath.c b/disasterserver_c/CMath.c new file mode 100644 index 0000000..0a90e39 --- /dev/null +++ b/disasterserver_c/CMath.c @@ -0,0 +1,21 @@ +#include + +float lerp(float a, float b, float f) +{ + return a * (1.0f - f) + (b * f); +} + +float sign(float x) +{ + return ((x) > 0) ? 1.f : (((x) < 0) ? -1.f : 0.f); +} + +float vector2_dist(Vector2* a, Vector2* b) +{ + return sqrtf(powf(b->x - a->x, 2) + powf(b->y - a->y, 2)); +} + +Vector2 vector2_dir(Vector2* a, Vector2* b) +{ + return (Vector2) { sign(a->x - b->x), sign(a->y - b->y) }; +} diff --git a/disasterserver_c/CMath.h b/disasterserver_c/CMath.h new file mode 100644 index 0000000..8e50030 --- /dev/null +++ b/disasterserver_c/CMath.h @@ -0,0 +1,17 @@ +#ifndef CMATH_H +#define CMATH_H +#include + +typedef struct +{ + float x; + float y; +} Vector2; + +float lerp(float a, float b, float f); +float sign(float x); + +float vector2_dist(Vector2* a, Vector2* b); +Vector2 vector2_dir(Vector2* a, Vector2* b); + +#endif diff --git a/disasterserver_c/Colors.h b/disasterserver_c/Colors.h new file mode 100644 index 0000000..b6fea8e --- /dev/null +++ b/disasterserver_c/Colors.h @@ -0,0 +1,16 @@ +#ifndef COLORS_H +#define COLORS_H + +#define CLRCODE_RED "\\" +#define CLRCODE_GRN "@" +#define CLRCODE_PUR "&" +#define CLRCODE_BLU "/" +#define CLRCODE_GRA "|" +#define CLRCODE_YLW "`" +#define CLRCODE_ORG "\xE2\x84\x96" +#define CLRCODE_RST "~" + +#define CLRLIST { CLRCODE_RED, CLRCODE_GRN, CLRCODE_PUR, CLRCODE_BLU, CLRCODE_GRA, CLRCODE_YLW, CLRCODE_ORG, CLRCODE_RST } +#define CLRLIST_LEN 8 + +#endif \ No newline at end of file diff --git a/disasterserver_c/Config.c b/disasterserver_c/Config.c new file mode 100644 index 0000000..605f60d --- /dev/null +++ b/disasterserver_c/Config.c @@ -0,0 +1,446 @@ +#include +#include +#include +#include +#include +#include +#include +#include + +#ifdef SYS_ANDROID + #include +#endif + +#ifdef SYS_USE_SDL2 +#include +#endif + +SERVER_API Config g_config = +{ + .port = 8606, + .server_count = 1, + +#ifdef SYS_ANDROID + .ping_limit = UINT16_MAX, +#else + .ping_limit = 250, +#endif + + .log_debug = false, + .log_file = false, + .map_list = { true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true }, + .motd = "", + .anticheat = true, + .pride = true, + .chatfix = true, +}; + +cJSON* g_bans = NULL; +cJSON* g_timeouts = NULL; +cJSON* g_ops = NULL; +Mutex g_banMut; +Mutex g_timeoutMut; +Mutex g_opMut; + +bool write_default(const char* filename, const char* default_str) +{ + FILE* file = fopen(filename, "r"); + if (!file) + { + file = fopen(filename, "w"); + + if (!file) + { + Warn("Failed to open %s for writing.", filename); + return false; + } + + fwrite(default_str, 1, strlen(default_str), file); + fclose(file); + } + + return true; +} + +bool collection_save(const char* file, cJSON* value) +{ + char* buffer = cJSON_Print(value); + FILE* f = fopen(file, "w"); + if (!f) + { + Warn("Failed to open %s for writing.", file); + return false; + } + + fwrite(buffer, 1, strlen(buffer), f); + fclose(f); + free(buffer); + + return true; +} + +bool collection_init(cJSON** output, const char* file, const char* default_value) +{ + RAssert(write_default(file, default_value)); + + FILE* f = fopen(file, "r"); + if (!f) + { + Warn("what de fuck"); + return false; + } + + fseek(f, 0, SEEK_END); + size_t len = ftell(f); + char* buffer = malloc(len); + if (!buffer) + { + Warn("Failed to allocate buffer for a list!"); + return false; + } + + fseek(f, 0, SEEK_SET); + fread(buffer, 1, len, f); + fclose(f); + + *output = cJSON_ParseWithLength(buffer, len); + if (!(*output)) + { + Err("Failed to parse %s: %s", file, cJSON_GetErrorPtr()); + *output = cJSON_CreateObject(); + return false; + } + else + Debug("%s loaded.", file); + + free(buffer); + return true; +} + +bool config_init(void) +{ + MutexCreate(g_config.map_list_lock); + + // Try to open config + FILE* file = fopen(CONFIG_FILE, "r"); + if (!file) + { + RAssert(config_save()); + + // Reopen + file = fopen(CONFIG_FILE, "r"); + if (!file) + { + Warn("Failed to save default config file properly!"); + goto init_balls; + } + } + + char buffer[1024] = { 0 }; + size_t len = fread(buffer, 1, 1024, file); + fclose(file); + + cJSON* json = cJSON_ParseWithLength(buffer, len); + if (!json) + { + Err("Failed to parse %s: %s", CONFIG_FILE, cJSON_GetErrorPtr()); + return false; + } + else + Debug("%s loaded.", CONFIG_FILE); + + g_config.port = (int32_t)cJSON_GetNumberValue(cJSON_GetObjectItemCaseSensitive(json, "port")); + g_config.server_count = (int32_t)cJSON_GetNumberValue(cJSON_GetObjectItemCaseSensitive(json, "server_count")); + g_config.ping_limit = (int32_t)cJSON_GetNumberValue(cJSON_GetObjectItemCaseSensitive(json, "ping_limit")); + g_config.log_file = cJSON_IsTrue(cJSON_GetObjectItemCaseSensitive(json, "log_file")); + g_config.log_debug = cJSON_IsTrue(cJSON_GetObjectItemCaseSensitive(json, "log_debug")); + g_config.anticheat = cJSON_IsTrue(cJSON_GetObjectItemCaseSensitive(json, "anticheat")); + g_config.pride = cJSON_IsTrue(cJSON_GetObjectItemCaseSensitive(json, "pride")); + + snprintf(g_config.motd, 256, "%s", cJSON_GetStringValue(cJSON_GetObjectItemCaseSensitive(json, "motd"))); + cJSON_Delete(json); + +init_balls: + MutexCreate(g_timeoutMut); + MutexCreate(g_banMut); + MutexCreate(g_opMut); + + RAssert(collection_init(&g_timeouts, TIMEOUTS_FILE, "{}")); + RAssert(collection_init(&g_bans, BANS_FILE, "{}")); + RAssert(collection_init(&g_ops, OPERATORS_FILE, "{ \"127.0.0.1\": \"Host (127.0.0.1)\" }")); + + if (!g_config.anticheat) + { + Info(LOG_YLW "Anticheat is disabled, client modifications are allowed."); + } + + return true; +} + +SERVER_API bool config_save(void) +{ + cJSON* json = cJSON_CreateObject(); + RAssert(json); + + cJSON_AddItemToObject(json, "port", cJSON_CreateNumber(g_config.port)); + cJSON_AddItemToObject(json, "server_count", cJSON_CreateNumber(g_config.server_count)); + cJSON_AddItemToObject(json, "ping_limit", cJSON_CreateNumber(g_config.ping_limit)); + cJSON_AddItemToObject(json, "log_file", cJSON_CreateBool(g_config.log_file)); + cJSON_AddItemToObject(json, "log_debug", cJSON_CreateBool(g_config.log_debug)); + cJSON_AddItemToObject(json, "anticheat", cJSON_CreateBool(g_config.anticheat)); + cJSON_AddItemToObject(json, "pride", cJSON_CreateBool(g_config.pride)); + cJSON_AddItemToObject(json, "motd", cJSON_CreateString(g_config.motd)); + + RAssert(collection_save(CONFIG_FILE, json)); + cJSON_Delete(json); + return true; +} + +bool ban_add(const char* nickname, const char* udid, const char* ip) +{ + bool res = true; + + MutexLock(g_banMut); + { + bool changed = false; + if (!cJSON_HasObjectItem(g_bans, ip)) + { + cJSON* js = cJSON_CreateString(nickname); + cJSON_AddItemToObject(g_bans, ip, js); + changed = true; + } + + if (!cJSON_HasObjectItem(g_bans, udid)) + { + cJSON* js = cJSON_CreateString(nickname); + cJSON_AddItemToObject(g_bans, udid, js); + changed = true; + } + + if (changed) + res = collection_save(BANS_FILE, g_bans); + + } + MutexUnlock(g_banMut); + + return res; +} + +bool ban_revoke(const char* udid, const char* ip) +{ + bool res = false; + + MutexLock(g_banMut); + { + bool changed = false; + + if (cJSON_HasObjectItem(g_bans, ip)) + { + cJSON_DeleteItemFromObject(g_bans, ip); + changed = true; + } + + if (cJSON_HasObjectItem(g_bans, udid)) + { + cJSON_DeleteItemFromObject(g_bans, udid); + changed = true; + } + + if(changed) + res = collection_save(BANS_FILE, g_bans); + } + MutexUnlock(g_banMut); + + return res; +} + +bool ban_check(const char* udid, const char* ip, bool* result) +{ + *result = false; + + MutexLock(g_banMut); + { + if (cJSON_HasObjectItem(g_bans, udid) || cJSON_HasObjectItem(g_bans, ip)) + *result = true; + } + MutexUnlock(g_banMut); + + return true; +} + +bool timeout_set(const char* nickname, const char* ip, const char* udid, uint64_t timestamp) +{ + bool res = true; + + MutexLock(g_timeoutMut); + { + bool changed = false; + + cJSON* obj = cJSON_GetObjectItem(g_timeouts, ip); + if (!obj) + { + cJSON* root = cJSON_CreateArray(); + + // store nickname + cJSON* js = cJSON_CreateString(nickname); + cJSON_AddItemToArray(root, js); + + // store timestamp + js = cJSON_CreateNumber((double)timestamp); + cJSON_AddItemToArray(root, js); + + cJSON_AddItemToObject(g_timeouts, ip, root); + changed = true; + } + else + { + cJSON* item = cJSON_GetArrayItem(obj, 1); + if (item) + { + cJSON_SetNumberValue(item, timestamp); + changed = true; + } + else + Warn("Missing timestamp in array"); + } + + obj = cJSON_GetObjectItem(g_timeouts, udid); + if (!obj) + { + cJSON* root = cJSON_CreateArray(); + + // store nickname + cJSON* js = cJSON_CreateString(nickname); + cJSON_AddItemToArray(root, js); + + // store timestamp + js = cJSON_CreateNumber((double)timestamp); + cJSON_AddItemToArray(root, js); + + cJSON_AddItemToObject(g_timeouts, udid, root); + changed = true; + } + else + { + cJSON* item = cJSON_GetArrayItem(obj, 1); + if (item) + { + cJSON_SetNumberValue(item, timestamp); + changed = true; + } + else + Warn("Missing timestamp in array"); + } + + if (changed) + res = collection_save(TIMEOUTS_FILE, g_timeouts); + } + MutexUnlock(g_timeoutMut); + + return res; +} + +bool timeout_revoke(const char* udid, const char* ip) +{ + bool res = false; + + MutexLock(g_timeoutMut); + { + bool changed = false; + + if (cJSON_HasObjectItem(g_timeouts, ip)) + { + cJSON_DeleteItemFromObject(g_timeouts, ip); + changed = true; + } + + if (cJSON_HasObjectItem(g_timeouts, udid)) + { + cJSON_DeleteItemFromObject(g_timeouts, udid); + changed = true; + } + + if (changed) + res = collection_save(TIMEOUTS_FILE, g_timeouts); + } + MutexUnlock(g_timeoutMut); + + return res; +} + +bool timeout_check(const char* udid, const char* ip, uint64_t* result) +{ + *result = 0; + + MutexLock(g_opMut); + { + cJSON* obj = cJSON_GetObjectItem(g_timeouts, ip); + + if(!obj) + obj = cJSON_GetObjectItem(g_timeouts, udid); + + if (obj) + { + cJSON* timeout = cJSON_GetArrayItem(obj, 1); + + if (timeout) + *result = (uint64_t)cJSON_GetNumberValue(timeout); + else + Warn("Missing timestamp in array"); + } + } + MutexUnlock(g_opMut); + + return true; +} + +bool op_add(const char* nickname, const char* ip) +{ + bool res = true; + + MutexLock(g_opMut); + { + if (!cJSON_HasObjectItem(g_ops, ip)) + { + cJSON* js = cJSON_CreateString(nickname); + cJSON_AddItemToObject(g_ops, ip, js); + + res = collection_save(OPERATORS_FILE, g_ops); + } + } + MutexUnlock(g_opMut); + + return res; +} + +bool op_revoke(const char* ip) +{ + bool res = false; + + MutexLock(g_opMut); + { + if (cJSON_HasObjectItem(g_ops, ip)) + { + cJSON_DeleteItemFromObject(g_ops, ip); + + res = collection_save(OPERATORS_FILE, g_ops); + } + } + MutexUnlock(g_opMut); + + return res; +} + +bool op_check(const char* ip, bool* result) +{ + *result = false; + + MutexLock(g_opMut); + { + if (cJSON_HasObjectItem(g_ops, ip)) + *result = true; + } + MutexUnlock(g_opMut); + + return true; +} diff --git a/disasterserver_c/Config.h b/disasterserver_c/Config.h new file mode 100644 index 0000000..bf1ad0e --- /dev/null +++ b/disasterserver_c/Config.h @@ -0,0 +1,65 @@ +#ifndef CONFIG_H +#define CONFIG_H + +#include +#include +#include +#include +#include +#include + +#ifndef SYS_ANDROID + #define CONFIG_FILE "Config.json" + #define BANS_FILE "Bans.json" + #define OPERATORS_FILE "Operators.json" + #define TIMEOUTS_FILE "Timeouts.json" +#else + #define ANDROID_DIR "/data/data/com.teamexeempire.disaster2d/files/" + #define CONFIG_FILE ANDROID_DIR "Config.json" + #define BANS_FILE ANDROID_DIR "Bans.json" + #define OPERATORS_FILE ANDROID_DIR "Operators.json" + #define TIMEOUTS_FILE ANDROID_DIR "Timeouts.json" +#endif + +typedef struct +{ + int32_t port; + int32_t server_count; + int32_t ping_limit; + bool log_debug; + bool log_file; + bool anticheat; + bool pride; + bool map_list[20]; + Mutex map_list_lock; + bool chatfix; + + char motd[256]; +} Config; + +SERVER_API extern Config g_config; +SERVER_API extern cJSON* g_bans; +SERVER_API extern cJSON* g_timeouts; +SERVER_API extern cJSON* g_ops; +SERVER_API extern Mutex g_banMut; +SERVER_API extern Mutex g_timeoutMut; +SERVER_API extern Mutex g_opMut; + +SERVER_API bool config_init(void); +SERVER_API bool config_save(void); + +SERVER_API bool ban_add(const char* nickname, const char* udid, const char* ip); +SERVER_API bool ban_revoke(const char* udid, const char* ip); +SERVER_API bool ban_check(const char* udid, const char* ip, bool* result); + +SERVER_API bool timeout_set(const char* nickname, const char* udid, const char* ip, uint64_t timestamp); +SERVER_API bool timeout_revoke(const char* udid, const char* ip); +SERVER_API bool timeout_check(const char* udid, const char* ip, uint64_t* result); + +SERVER_API bool op_add(const char* nickname, const char* ip); +SERVER_API bool op_revoke(const char* ip); +SERVER_API bool op_check(const char* ip, bool* result); + +bool collection_save(const char* file, cJSON* value); + +#endif \ No newline at end of file diff --git a/disasterserver_c/DyList.c b/disasterserver_c/DyList.c new file mode 100644 index 0000000..416d1b6 --- /dev/null +++ b/disasterserver_c/DyList.c @@ -0,0 +1,79 @@ +#include +#include + +bool dylist_create(DyList* list, size_t max_capacity) +{ + if (!list) + return false; + + memset(list, 0, sizeof(DyList)); + list->capacity = max_capacity; + list->noitems = 0; + list->ptr = (void**)malloc(list->capacity * sizeof(void*)); + + if (!list->ptr) + return false; + + memset(list->ptr, 0, list->capacity * sizeof(void*)); + Debug("%p DyList allocated (size %d)", list->ptr, list->capacity * sizeof(void*)); + return true; +} + +bool dylist_push(DyList* list, void* item) +{ + if (!list) + return false; + + if (!item) + return false; + + bool found = false; + for (size_t i = 0; i < list->capacity; i++) + { + if (!list->ptr[i]) + { + Debug("%p DyList added item %p (index %d)", list->ptr, item, i); + list->ptr[i] = item; + found = true; + break; + } + } + + if (!found) + { + Warn("%p DyList reached limit (%d items)!", list->ptr, list->capacity); + return false; + } + + list->noitems++; + return true; +} + +bool dylist_remove(DyList* list, void* item) +{ + if (!item) + return false; + + for (size_t i = 0; i < list->capacity; i++) + { + if (list->ptr[i] == item) + { + Debug("%p DyList removed item %p (index %d)", list->ptr, item, i); + list->ptr[i] = NULL; + list->noitems--; + return true; + } + } + + return false; +} + +void dylist_free(DyList* list) +{ + if (!list) + return; + + Debug("%p DyList freed.", list->ptr); + free(list->ptr); + memset(list, 0, sizeof(DyList)); +} diff --git a/disasterserver_c/DyList.h b/disasterserver_c/DyList.h new file mode 100644 index 0000000..22337d6 --- /dev/null +++ b/disasterserver_c/DyList.h @@ -0,0 +1,17 @@ +#ifndef LINKEDLIST_H +#define LINKEDLIST_H +#include + +typedef struct +{ + void** ptr; + size_t noitems; + size_t capacity; +} DyList; + +bool dylist_create(DyList* list, size_t max_capacity); +bool dylist_push(DyList* list, void* item); +bool dylist_remove(DyList* list, void* item); +void dylist_free(DyList* list); + +#endif \ No newline at end of file diff --git a/disasterserver_c/Lib.c b/disasterserver_c/Lib.c new file mode 100644 index 0000000..1960765 --- /dev/null +++ b/disasterserver_c/Lib.c @@ -0,0 +1,272 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include + +ThreadVar g_threadName; +DyList servers; +bool running = 0; + +bool allocate_server(uint16_t base_port, uint16_t n) +{ + const Server templ = { + .state = ST_LOBBY, + .last_map = -1, + .id = n, + .running = true, + .delta = 1, + .game = { + .exe = -1 + }, + .lobby = { + .vote = { + .ongoing = 0, + }, + .prac_countdown = 0 + } + }; + + Server* server = malloc(sizeof(Server)); + RAssert(server); + memcpy(server, &templ, sizeof(Server)); + + for (int i = 0; i < MAP_COUNT; i++) + server->map_pickrates[i] = 255; + + // Init lobby + MutexCreate(server->state_lock); + RAssert(dylist_create(&server->peers, 7)); + + ENetAddress addr; + addr.host = ENET_HOST_ANY; + addr.port = base_port + n; + server->host = enet_host_create(&addr, 50, 2, 0, 0); + + Info("Listening on port %d.", base_port + n); + RAssert(server->host != NULL); + RAssert(lobby_init(server)); + RAssert(dylist_push(&servers, server)); + + return true; +} + +bool disaster_init(void) +{ + if (running) + return true; + + RAssert(enet_initialize() == 0); + + // Init global variables + ThreadVarCreate(g_threadName); + ThreadVarSet(g_threadName, "Main Thr"); + +#ifdef SYS_ANDROID + log_hook(log_android); +#endif + + Info("--------------------------------"); + Info(LOG_RED "Better" LOG_BLU "Server " LOG_RST "v" STRINGIFY(BUILD_VERSION)); + Info("Build from " LOG_PUR __DATE__ " " LOG_GRN __TIME__); + Info("(c) 2024 Team Exe Empire"); + Info("--------------------------------"); + Info(""); + + RAssert(config_init()); + RAssert(log_init()); + + RAssert(dylist_create(&servers, g_config.server_count)); + for (int32_t i = 0; i < g_config.server_count; i++) + RAssert(allocate_server((uint16_t)g_config.port, i)); + + return true; +} + +int disaster_run(void) +{ + if (running) + return 1; + + running = true; + Debug("Entering main loop..."); + + for(int32_t i = 0; i < g_config.server_count; i++) + { + Server* server = servers.ptr[i]; + if(!server) + continue; + + Thread th; + ThreadSpawn(th, server_worker, server); + } + + // dont ask too many questions + while (running) + { + ThreadSleep(100); + } + + return 0; +} + +void disaster_shutdown(void) +{ + if(!running) + return; + + running = false; + exit(0); +} + +Server* disaster_get(int i) +{ + if (i < 0 || (size_t)i >= servers.capacity) + return NULL; + + return (Server*)servers.ptr[i]; +} + +int disaster_count(void) +{ + return (int)servers.capacity; +} + +bool disaster_server_lock(Server* server) +{ + RAssert(server); + MutexLock(server->state_lock); + return true; +} + +bool disaster_server_unlock(Server* server) +{ + RAssert(server); + MutexUnlock(server->state_lock); + return true; +} + +uint8_t disaster_server_state(Server* server) +{ + RAssert(server); + return (uint8_t)server->state; +} + +bool disaster_server_ban(Server* server, uint16_t id) +{ + for (size_t i = 0; i < server->peers.capacity; i++) + { + PeerData* v = (PeerData*)server->peers.ptr[i]; + if (!v) + continue; + + if (v->id == id) + { + server_disconnect(server, v->peer, DR_BANNEDBYHOST, NULL); + return ban_add(v->nickname.value, v->udid.value, v->ip.value); + } + } + + return false; +} + +bool disaster_server_op(Server* server, uint16_t id) +{ + for (size_t i = 0; i < server->peers.capacity; i++) + { + PeerData* v = (PeerData*)server->peers.ptr[i]; + if (!v) + continue; + + if (v->id == id) + { + v->op = true; + + server_send_msg(server, v->peer, CLRCODE_GRN "you're an operator now"); + return op_add(v->nickname.value, v->ip.value); + } + } + + return false; +} + +bool disaster_server_timeout(Server* server, uint16_t id, double timeout) +{ + for (size_t i = 0; i < server->peers.capacity; i++) + { + PeerData* v = (PeerData*)server->peers.ptr[i]; + if (!v) + continue; + + if (v->id == id) + { + server_disconnect(server, v->peer, DR_KICKEDBYHOST, NULL); + return timeout_set(v->nickname.value, v->udid.value, v->ip.value, time(NULL) + (uint64_t)(round(timeout))); + } + } + + return false; +} + +bool disaster_server_peer(Server* server, int index, PeerInfo* info) +{ + info->character = -1; + if (index < 0 || index >= server->peers.capacity) + return false; + else + { + PeerData* v = (PeerData*)server->peers.ptr[index]; + if (!v) + return false; + else + { + info->peer = v; + info->is_exe = (server->game.exe == v->id); + info->ip_addr = v->ip; + + if (v->in_game && server->state >= ST_GAME) + { + if (info->is_exe) + info->character = v->exe_char; + else + info->character = v->surv_char; + } + } + } + + return true; +} + +bool disaster_server_peer_disconnect(Server* server, uint16_t id, DisconnectReason reason, const char* text) +{ + return server_disconnect_id(server, (int)id, reason, text); +} + +int disaster_server_peer_count(Server* server) +{ + return server_total(server); +} + +int disaster_server_peer_ingame(Server* server) +{ + return server_ingame(server); +} + +int8_t disaster_game_map(Server* server) +{ + return server->game.map; +} + +double disaster_game_time(Server* server) +{ + return server->game.time; +} + +uint16_t disaster_game_time_sec(Server* server) +{ + return server->game.time_sec; +} \ No newline at end of file diff --git a/disasterserver_c/Lib.h b/disasterserver_c/Lib.h new file mode 100644 index 0000000..87d5428 --- /dev/null +++ b/disasterserver_c/Lib.h @@ -0,0 +1,59 @@ +#ifndef LIB_H +#define LIB_H +#include +#include +#include +#include +#include + +typedef enum +{ + DR_FAILEDTOCONNECT, + DR_KICKEDBYHOST, + DR_BANNEDBYHOST, + DR_VERMISMATCH, + DR_SERVERTIMEOUT, + DR_PACKETSNOTRECV, + DR_GAMESTARTED, + DR_AFKTIMEOUT, + DR_LOBBYFULL, + DR_RATELIMITED, + DR_SHUTDOWN, + DR_IPINUSE, + + DR_DONTREPORT = 254, + DR_OTHER = 255 +} DisconnectReason; + +struct Server; +struct PeerData; +typedef struct +{ + struct PeerData* peer; + String ip_addr; + bool is_exe; + int8_t character; +} PeerInfo; + +SERVER_API bool disaster_init (void); +SERVER_API int disaster_run (void); +SERVER_API void disaster_shutdown(void); + +// API functions +SERVER_API struct Server* disaster_get (int); +SERVER_API int disaster_count (void); +SERVER_API bool disaster_server_lock (struct Server* server); +SERVER_API bool disaster_server_unlock (struct Server* server); +SERVER_API uint8_t disaster_server_state (struct Server* server); +SERVER_API bool disaster_server_ban (struct Server* server, uint16_t); +SERVER_API bool disaster_server_op (struct Server* server, uint16_t); +SERVER_API bool disaster_server_timeout (struct Server* server, uint16_t, double); +SERVER_API bool disaster_server_peer (struct Server*, int, PeerInfo*); +SERVER_API bool disaster_server_peer_disconnect (struct Server*, uint16_t, DisconnectReason, const char*); +SERVER_API int disaster_server_peer_count (struct Server*); +SERVER_API int disaster_server_peer_ingame (struct Server*); +SERVER_API int8_t disaster_game_map (struct Server*); +SERVER_API double disaster_game_time (struct Server*); +SERVER_API uint16_t disaster_game_time_sec (struct Server*); + +#endif \ No newline at end of file diff --git a/disasterserver_c/Log.c b/disasterserver_c/Log.c new file mode 100644 index 0000000..f1ecab7 --- /dev/null +++ b/disasterserver_c/Log.c @@ -0,0 +1,155 @@ +#include +#include +#include +#include +#include +#include +#ifdef SYS_ANDROID + #include +#endif + +FILE* logFile = NULL; +loghook_t hook = NULL; + +void log_interr(int signum) +{ + (void)signum; + Err("Signal INTERRUPT: Exiting..."); + if (logFile) + fclose(logFile); + + logFile = NULL; + disaster_shutdown(); +} + +void log_segv(int signum) +{ + (void)signum; + + Err("Signal SEGFAULT: Exiting..."); + if (logFile) + fclose(logFile); + + logFile = NULL; + disaster_shutdown(); +} + +void log_term(int signum) +{ + (void)signum; + + Err("Signal SIGTERM: Exiting..."); + if (logFile) + fclose(logFile); + + logFile = NULL; + disaster_shutdown(); +} + +void log_abrt(int signum) +{ + (void)signum; + Err("Signal SIGABORT: Exiting..."); + if (logFile) + fclose(logFile); + + logFile = NULL; + disaster_shutdown(); +} + +void log_uninit(void) +{ + if (logFile) + fclose(logFile); + + logFile = NULL; +} + +#ifdef SYS_ANDROID + void log_android(const char* type, const char* message) + { + __android_log_print(ANDROID_LOG_ERROR, "DisasterServer", "%s", message); + } +#endif + +bool log_init(void) +{ + if (g_config.log_file) // dont do shit if we dont wanna log to file + { + // Create dir for logging + (void)mkdir("logs", 0777); + + time_t t = time(NULL); + struct tm* p = localtime(&t); + + char fname[64]; + strftime(fname, 64, "logs/%m%d%Y %H%M%S.log", p); + + logFile = fopen(fname, "w"); + RAssert(logFile); + } + + // write to file when done + signal(SIGINT, log_interr); + signal(SIGTERM, log_term); + signal(SIGABRT, log_abrt); + signal(SIGSEGV, log_segv); +#if defined(__unix) || defined(__unix__) + signal(SIGPIPE, SIG_IGN); +#endif + atexit(log_uninit); + + return true; +} + +void log_hook(loghook_t func) +{ + hook = func; +} + +void log_fmt(const char* fmt, const char* type, const char* file, int line, ...) +{ + const char* thd_name = (const char*)ThreadVarGet(g_threadName); + char filename[24]; + snprintf(filename, 24, "%s:%d", file, line); + + time_t t = time(NULL); + struct tm* p = localtime(&t); + + va_list list; + if (logFile) + { + char strtime[32]; + strftime(strtime, 32, "%m/%d/%Y %H:%M:%S", p); + fprintf(logFile, "[%s %s %s %s] ", strtime, type, thd_name != NULL ? thd_name : "unknown", filename); + + va_start(list, line); + vfprintf(logFile, fmt, list); + va_end(list); + + fputs("\n", logFile); + fflush(logFile); + } + + if (hook) + { + char fmt_log[512]; + va_start(list, line); + vsnprintf(fmt_log, 512, fmt, list); + va_end(list); + + char log[1024]; + snprintf(log, 1024, "[%s]: %s", filename, fmt_log); + + hook(type, log); + return; + } + + printf("[%s %s %s] ", type, thd_name != NULL ? thd_name : "unknown", filename); + + va_start(list, line); + vprintf(fmt, list); + va_end(list); + + puts(""); +} diff --git a/disasterserver_c/Log.h b/disasterserver_c/Log.h new file mode 100644 index 0000000..1fdc352 --- /dev/null +++ b/disasterserver_c/Log.h @@ -0,0 +1,65 @@ +#ifndef LOG_H +#define LOG_H + +#include +#include +#include +#include +#include +#include +#include +#include + +#if defined(__unix) || defined(__unix__) + #define __FILENAME__ (strrchr(__FILE__, '/') ? strrchr(__FILE__, '/') + 1 : __FILE__) +#else + #define __FILENAME__ (strrchr(__FILE__, '\\') ? strrchr(__FILE__, '\\') + 1 : __FILE__) +#endif + +#ifdef SYS_USE_SDL2 + #define DEBUG_TYPE "DBG " + #define INFO_TYPE "INF " + #define WARN_TYPE "WRN " + #define ERROR_TYPE "ERR " + + #define LOG_GRN CLRCODE_GRN + #define LOG_GRA CLRCODE_GRA + #define LOG_RED CLRCODE_RED + #define LOG_BLU CLRCODE_BLU + #define LOG_YLW CLRCODE_YLW + #define LOG_PUR CLRCODE_PUR + #define LOG_RST CLRCODE_RST +#else + #define DEBUG_TYPE "\x1B[36mDBG \x1B[0m" + #define INFO_TYPE "\x1B[32mINF \x1B[0m" + #define WARN_TYPE "\x1B[33mWRN \x1B[0m" + #define ERROR_TYPE "\x1B[31mERR \x1B[0m" + + #define LOG_GRN + #define LOG_GRA + #define LOG_RED + #define LOG_BLU + #define LOG_YLW + #define LOG_PUR + #define LOG_RST +#endif + +#define Log(type, fmt, ...) log_fmt(fmt, type, __FILENAME__, __LINE__, ##__VA_ARGS__) +#define Debug(fmt, ...) if(g_config.log_debug) log_fmt(fmt, DEBUG_TYPE, __FILENAME__, __LINE__, ##__VA_ARGS__) +#define Info(fmt, ...) log_fmt(fmt, INFO_TYPE, __FILENAME__, __LINE__, ##__VA_ARGS__) +#define Warn(fmt, ...) log_fmt(fmt, WARN_TYPE, __FILENAME__, __LINE__, ##__VA_ARGS__) +#define Err(fmt, ...) log_fmt(fmt, ERROR_TYPE, __FILENAME__, __LINE__, ##__VA_ARGS__) +#define RAssert(x) if (!(x)) { Err("RAssert(" #x ") failed!"); return false; } +#define BoolStringify(bool) (bool ? "true" : "false") + +typedef void (*loghook_t)(const char* type, const char* message); + +bool log_init (void); +SERVER_API void log_hook (loghook_t func); +SERVER_API void log_fmt (const char* fmt, const char* type, const char* file, int line, ...); + +#ifdef SYS_ANDROID +void log_android(const char* type, const char* message); +#endif + +#endif diff --git a/disasterserver_c/Main.c b/disasterserver_c/Main.c new file mode 100644 index 0000000..d62293b --- /dev/null +++ b/disasterserver_c/Main.c @@ -0,0 +1,10 @@ +#include +#include + +int main(void) +{ + if (!disaster_init()) + return 1; + + return disaster_run(); +} \ No newline at end of file diff --git a/disasterserver_c/Maps.c b/disasterserver_c/Maps.c new file mode 100644 index 0000000..94c69d6 --- /dev/null +++ b/disasterserver_c/Maps.c @@ -0,0 +1,97 @@ +#include "Colors.h" +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +Map g_mapList[MAP_COUNT+1] = +{ + { CLRCODE_GRN "Hide and Seek 2", { hs2_init, map_tick, map_tcpmsg, map_left }, 1, 22 }, //0 + { CLRCODE_ORG "Ravine Mist", { rmz_init, rmz_tick, rmz_tcpmsg, rmz_left }, 1, 27 }, //1 + { CLRCODE_GRN "...", { dot_init, map_tick, map_tcpmsg, map_left }, 1, 25 }, //2 + { CLRCODE_ORG "Desert Town", { map_init, map_tick, map_tcpmsg, map_left }, 1, 25 }, //3 + { CLRCODE_ORG "You Can't Run", { ycr_init, map_tick, map_tcpmsg, map_left }, 1, 27 }, //4 + { CLRCODE_RED "Limp City", { lc_init, map_tick, lc_tcpmsg, map_left }, 1, 23 }, //5 + { CLRCODE_RED "Not Perfect", { np_init, map_tick, map_tcpmsg, map_left }, 1, 59 }, //6 + { CLRCODE_ORG "Kind and Fair", { kaf_init, map_tick, kaf_tcpmsg, map_left }, 1, 31 }, //7 + { CLRCODE_PUR "Act 9", { act9_init,map_tick, map_tcpmsg, map_left }, 1, 38 }, //8 + { CLRCODE_RED "Nasty Paradise", { nap_init, map_tick, nap_tcpmsg, map_left }, 1, 26 }, //9 + { CLRCODE_PUR "Priceless Freedom", { pf_init, map_tick, pf_tcpmsg, map_left }, 1, 38 }, //10 + { CLRCODE_ORG "Volcano Valley", { vv_init, map_tick, vv_tcpmsg, map_left }, 1, 27 }, //11 + { CLRCODE_ORG "Hill", { hill_init,map_tick, map_tcpmsg, map_left }, 1, 26 }, //12 + { CLRCODE_PUR "Majin Forest", { maj_init, map_tick, map_tcpmsg, map_left }, 1, 20 }, //13 + { CLRCODE_ORG "Hide and Seek", { map_init, map_tick, map_tcpmsg, map_left }, 1, 21 }, //14 + { CLRCODE_RED "Torture Cave", { tc_init, map_tick, map_tcpmsg, map_left }, 1, 27 }, //15 + { CLRCODE_GRN "Dark Tower", { dt_init, map_tick, dt_tcpmsg, map_left }, 1, 31 }, //16 + { CLRCODE_GRN "Haunting Dream", { hd_init, map_tick, hd_tcpmsg, map_left }, 1, 31 }, //17 + { CLRCODE_RED "Mystic Wood", { wd_init, map_tick, map_tcpmsg, map_left }, 1, 26 }, //18 + { CLRCODE_GRN "Echidna Ruins", { mj_init, map_tick, map_tcpmsg, map_left }, 1, 28+5 }, //19 + { CLRCODE_BLU "Fart Zone", { ft_init, map_tick, ft_tcpmsg, map_left }, 1, 15 }, //20 +}; + +bool map_init(Server* server) +{ + RAssert(map_time(server, 3 * TICKSPERSEC, 20)); + RAssert(map_ring(server, 5)); + + return true; +} + +bool map_tick(Server* server) +{ + if (server->game.time_sec <= TICKSPERSEC && server->game.bring_state < BS_DEACTIVATED) + game_bigring(server, BS_DEACTIVATED); + + if (server->game.time_sec <= TICKSPERSEC - 10 && server->game.bring_state < BS_ACTIVATED) + game_bigring(server, BS_ACTIVATED); + + return true; +} + +bool map_tcpmsg(PeerData* v, Packet* packet) +{ + return true; +} + +bool map_left(PeerData* v) +{ + return true; +} + +bool map_time(Server* server, double seconds, float mul) +{ + server->game.time_sec = (uint16_t)(seconds + (((server_ingame(server) - 1) * mul))); + return true; +} + +bool map_ring(Server* server, int ringcoff) +{ + server->game.ring_coff = ringcoff; + if (server_ingame(server) > 3) + server->game.ring_coff--; + + if (server->game.ring_coff < 1) + server->game.ring_coff = 1; + + return true; +} \ No newline at end of file diff --git a/disasterserver_c/Maps.h b/disasterserver_c/Maps.h new file mode 100644 index 0000000..6428649 --- /dev/null +++ b/disasterserver_c/Maps.h @@ -0,0 +1,32 @@ +#ifndef MAPS_H +#define MAPS_H +#include + +typedef struct +{ + const char* name; + + struct + { + bool (*init)(Server*); + bool (*tick)(Server*); + bool (*tcp_msg)(PeerData*, Packet*); + bool (*left)(PeerData*); + } cb; + + uint8_t spawn_red_rings; + uint8_t ring_count; +} Map; + +#define MAP_COUNT 20 +extern Map g_mapList[MAP_COUNT+1]; + +bool map_init (Server* server); +bool map_tick (Server* server); +bool map_tcpmsg (PeerData* v, Packet* packet); +bool map_left (PeerData* v); + +bool map_time (Server* server, double seconds, float mul); +bool map_ring (Server* server, int ringcoff); + +#endif diff --git a/disasterserver_c/Packet.c b/disasterserver_c/Packet.c new file mode 100644 index 0000000..c5851c0 --- /dev/null +++ b/disasterserver_c/Packet.c @@ -0,0 +1,480 @@ +#include +#include +#include +#include +#include + +#ifdef __GNUC__ // GCC, clang... + #define BYTESWAP_16(x) __builtin_bswap16((x)) + #define BYTESWAP_32(x) __builtin_bswap32((x)) + #define BYTESWAP_64(x) __builtin_bswap64((x)) +#else + #define BYTESWAP_16(x) _byteswap_ushort((x)) + #define BYTESWAP_32(x) _byteswap_ulong((x)) + #define BYTESWAP_64(x) _byteswap_uint64((x)) +#endif + +String string_new(const char* value) +{ + size_t len = strlen(value) + 1; + String str = { .value = {0}, .len = (uint16_t)len}; + memcpy(str.value, value, len); + + return str; +} + +size_t string_length(String* str) +{ + size_t len = 0; + + for (size_t i = 0; i < str->len; i++) + { + if (str->value[i] == '\0') + break; + + len += (str->value[i] & 0xc0) != 0x80; + } + + return len; +} + +String string_lower(String str) +{ + for (int i = 0; i < str.len; i++) + str.value[i] = (char)tolower(str.value[i]); + + return str; +} + +inline const char * getPacketTypeName(PacketType type) { + switch (type) { + case IDENTITY: return "IDENTITY"; + case SERVER_IDENTITY_RESPONSE: return "SERVER_IDENTITY_RESPONSE"; + case SERVER_PLAYER_JOINED: return "SERVER_PLAYER_JOINED"; + case SERVER_PLAYER_LEFT: return "SERVER_PLAYER_LEFT"; + case SERVER_PLAYER_FORCE_DISCONNECT: return "SERVER_PLAYER_FORCE_DISCONNECT"; + case SERVER_WAITING_PLAYER_INFO: return "SERVER_WAITING_PLAYER_INFO"; + case SERVER_LOBBY_READY_STATE: return "SERVER_LOBBY_READY_STATE"; + case SERVER_LOBBY_EXE: return "SERVER_LOBBY_EXE"; + case SERVER_LOBBY_COUNTDOWN: return "SERVER_LOBBY_COUNTDOWN"; + case SERVER_LOBBY_EXE_CHANGE: return "SERVER_LOBBY_EXE_CHANGE"; + case SERVER_LOBBY_CHARACTER_CHANGE: return "SERVER_LOBBY_CHARACTER_CHANGE"; + case SERVER_LOBBY_CHARACTER_RESPONSE: return "SERVER_LOBBY_CHARACTER_RESPONSE"; + case SERVER_LOBBY_EXECHARACTER_RESPONSE: return "SERVER_LOBBY_EXECHARACTER_RESPONSE"; + case SERVER_LOBBY_GAME_START: return "SERVER_LOBBY_GAME_START"; + case SERVER_LOBBY_PLAYER: return "SERVER_LOBBY_PLAYER"; + case SERVER_LOBBY_EXE_CHANCE: return "SERVER_LOBBY_EXE_CHANCE"; + case SERVER_LOBBY_CORRECT: return "SERVER_LOBBY_CORRECT"; + case SERVER_LOBBY_CHOOSEVOTEKICK: return "SERVER_LOBBY_CHOOSEVOTEKICK"; + case SERVER_LOBBY_CHOOSEBAN: return "SERVER_LOBBY_CHOOSEBAN"; + case SERVER_LOBBY_CHOOSEKICK: return "SERVER_LOBBY_CHOOSEKICK"; + case SERVER_LOBBY_CHOOSEOP: return "SERVER_LOBBY_CHOOSEOP"; + case SERVER_LOBBY_CHANGELOBBY: return "SERVER_LOBBY_CHANGELOBBY"; + case SERVER_CHAR_TIME_SYNC: return "SERVER_CHAR_TIME_SYNC"; + case SERVER_VOTE_MAPS: return "SERVER_VOTE_MAPS"; + case SERVER_VOTE_SET: return "SERVER_VOTE_SET"; + case SERVER_VOTE_TIME_SYNC: return "SERVER_VOTE_TIME_SYNC"; + case SERVER_GAME_PLAYERS_READY: return "SERVER_GAME_PLAYERS_READY"; + case SERVER_GAME_EXE_WINS: return "SERVER_GAME_EXE_WINS"; + case SERVER_GAME_SURVIVOR_WIN: return "SERVER_GAME_SURVIVOR_WIN"; + case SERVER_GAME_SPAWN_RING: return "SERVER_GAME_SPAWN_RING"; + case SERVER_GAME_PLAYER_ESCAPED: return "SERVER_GAME_PLAYER_ESCAPED"; + case SERVER_GAME_BACK_TO_LOBBY: return "SERVER_GAME_BACK_TO_LOBBY"; + case SERVER_GAME_TIME_SYNC: return "SERVER_GAME_TIME_SYNC"; + case SERVER_GAME_TIME_OVER: return "SERVER_GAME_TIME_OVER"; + case SERVER_GAME_PING: return "SERVER_GAME_PING"; + case SERVER_PLAYER_DEATH_STATE: return "SERVER_PLAYER_DEATH_STATE"; + case SERVER_GAME_DEATHTIMER_TICK: return "SERVER_GAME_DEATHTIMER_TICK"; + case SERVER_GAME_DEATHTIMER_END: return "SERVER_GAME_DEATHTIMER_END"; + case SERVER_REQUEST_INFO: return "SERVER_REQUEST_INFO"; + case SERVER_HEARTBEAT: return "SERVER_HEARTBEAT"; + case SERVER_PONG: return "SERVER_PONG"; + case SERVER_FORCE_DAMAGE: return "SERVER_FORCE_DAMAGE"; + case SERVER_GAME_RING_READY: return "SERVER_GAME_RING_READY"; + case SERVER_PLAYER_BACKTRACK: return "SERVER_PLAYER_BACKTRACK"; + case SERVER_TPROJECTILE_STATE: return "SERVER_TPROJECTILE_STATE"; + case SERVER_ETRACKER_STATE: return "SERVER_ETRACKER_STATE"; + case SERVER_ERECTOR_BRING_SPAWN: return "SERVER_ERECTOR_BRING_SPAWN"; + case SERVER_RMZSLIME_STATE: return "SERVER_RMZSLIME_STATE"; + case SERVER_RMZSLIME_RINGBONUS: return "SERVER_RMZSLIME_RINGBONUS"; + case SERVER_RMZSHARD_STATE: return "SERVER_RMZSHARD_STATE"; + case SERVER_LCEYE_STATE: return "SERVER_LCEYE_STATE"; + case SERVER_LCCHAIN_STATE: return "SERVER_LCCHAIN_STATE"; + case SERVER_NPCONTROLLER_STATE: return "SERVER_NPCONTROLLER_STATE"; + case SERVER_KAFMONITOR_STATE: return "SERVER_KAFMONITOR_STATE"; + case SERVER_YCRSMOKE_STATE: return "SERVER_YCRSMOKE_STATE"; + case SERVER_YCRSMOKE_READY: return "SERVER_YCRSMOKE_READY"; + case SERVER_MOVINGSPIKE_STATE: return "SERVER_MOVINGSPIKE_STATE"; + case SERVER_RING_STATE: return "SERVER_RING_STATE"; + case SERVER_RING_COLLECTED: return "SERVER_RING_COLLECTED"; + case SERVER_ACT9WALL_STATE: return "SERVER_ACT9WALL_STATE"; + case SERVER_NAPBALL_STATE: return "SERVER_NAPBALL_STATE"; + case SERVER_NAPICE_STATE: return "SERVER_NAPICE_STATE"; + case SERVER_PFLIFT_STATE: return "SERVER_PFLIFT_STATE"; + case SERVER_BRING_STATE: return "SERVER_BRING_STATE"; + case SERVER_BRING_COLLECTED: return "SERVER_BRING_COLLECTED"; + case SERVER_VVLCOLUMN_STATE: return "SERVER_VVLCOLUMN_STATE"; + case SERVER_VVVASE_STATE: return "SERVER_VVVASE_STATE"; + case SERVER_GHZTHUNDER_STATE: return "SERVER_GHZTHUNDER_STATE"; + case SERVER_TCGOM_STATE: return "SERVER_TCGOM_STATE"; + case SERVER_EXELLERCLONE_STATE: return "SERVER_EXELLERCLONE_STATE"; + case SERVER_DTTAILSDOLL_STATE: return "SERVER_DTTAILSDOLL_STATE"; + case SERVER_DTBALL_STATE: return "SERVER_DTBALL_STATE"; + case SERVER_DTASS_STATE: return "SERVER_DTASS_STATE"; + case SERVER_HDDOOR_STATE: return "SERVER_HDDOOR_STATE"; + case SERVER_WDLATERN_ACTIVATE: return "SERVER_WDLATERN_ACTIVATE"; + case SERVER_FART_STATE: return "SERVER_FART_STATE"; + case SERVER_MJLAVA_STATE: return "SERVER_MJLAVA_STATE"; + case SERVER_MJJUDGER_STATE: return "SERVER_MJJUDGER_STATE"; + case SERVER_MJCRYSTAL_STATE: return "SERVER_MJCRYSTAL_STATE"; + case CLIENT_ETRACKER: return "CLIENT_ETRACKER"; + case CLIENT_ETRACKER_ACTIVATED: return "CLIENT_ETRACKER_ACTIVATED"; + case CLIENT_TPROJECTILE: return "CLIENT_TPROJECTILE"; + case CLIENT_TPROJECTILE_HIT: return "CLIENT_TPROJECTILE_HIT"; + case CLIENT_TPROJECTILE_STARTCHARGE: return "CLIENT_TPROJECTILE_STARTCHARGE"; + case CLIENT_ERECTOR_BALLS: return "CLIENT_ERECTOR_BALLS"; + case CLIENT_ERECTOR_BRING_SPAWN: return "CLIENT_ERECTOR_BRING_SPAWN"; + case CLIENT_EXELLER_SPAWN_CLONE: return "CLIENT_EXELLER_SPAWN_CLONE"; + case CLIENT_EXELLER_TELEPORT_CLONE: return "CLIENT_EXELLER_TELEPORT_CLONE"; + case CLIENT_MERCOIN_BONUS: return "CLIENT_MERCOIN_BONUS"; + case CLIENT_RMZSLIME_HIT: return "CLIENT_RMZSLIME_HIT"; + case CLIENT_LCEYE_REQUEST_ACTIVATE: return "CLIENT_LCEYE_REQUEST_ACTIVATE"; + case CLIENT_KAFMONITOR_ACTIVATE: return "CLIENT_KAFMONITOR_ACTIVATE"; + case CLIENT_RING_COLLECTED: return "CLIENT_RING_COLLECTED"; + case CLIENT_RING_BROKE: return "CLIENT_RING_BROKE"; + case CLIENT_BRING_COLLECTED: return "CLIENT_BRING_COLLECTED"; + case CLIENT_NAPICE_ACTIVATE: return "CLIENT_NAPICE_ACTIVATE"; + case CLIENT_SPRING_USE: return "CLIENT_SPRING_USE"; + case CLIENT_PFLIT_ACTIVATE: return "CLIENT_PFLIT_ACTIVATE"; + case CLIENT_VVVASE_BREAK: return "CLIENT_VVVASE_BREAK"; + case CLIENT_RMZSHARD_COLLECT: return "CLIENT_RMZSHARD_COLLECT"; + case CLIENT_RMZSHARD_LAND: return "CLIENT_RMZSHARD_LAND"; + case CLIENT_DTASS_ACTIVATE: return "CLIENT_DTASS_ACTIVATE"; + case CLIENT_HDDOOR_TOGGLE: return "CLIENT_HDDOOR_TOGGLE"; + case CLIENT_FART_PUSH: return "CLIENT_FART_PUSH"; + case CLIENT_LOBBY_READY_STATE: return "CLIENT_LOBBY_READY_STATE"; + case CLIENT_REQUESTED_INFO: return "CLIENT_REQUESTED_INFO"; + case CLIENT_PLAYER_DATA: return "CLIENT_PLAYER_DATA"; + case CLIENT_PLAYER_HURT: return "CLIENT_PLAYER_HURT"; + case CLIENT_SOUND_EMIT: return "CLIENT_SOUND_EMIT"; + case CLIENT_PING: return "CLIENT_PING"; + case CLIENT_REVIVAL_PROGRESS: return "CLIENT_REVIVAL_PROGRESS"; + case CLIENT_PLAYER_HEAL: return "CLIENT_PLAYER_HEAL"; + case CLIENT_PLAYER_HEAL_PART: return "CLIENT_PLAYER_HEAL_PART"; + case SERVER_REVIVAL_PROGRESS: return "SERVER_REVIVAL_PROGRESS"; + case SERVER_REVIVAL_STATUS: return "SERVER_REVIVAL_STATUS"; + case SERVER_REVIVAL_RINGSUB: return "SERVER_REVIVAL_RINGSUB"; + case SERVER_REVIVAL_REVIVED: return "SERVER_REVIVAL_REVIVED"; + case CLIENT_REQUEST_CHARACTER: return "CLIENT_REQUEST_CHARACTER"; + case CLIENT_REQUEST_EXECHARACTER: return "CLIENT_REQUEST_EXECHARACTER"; + case CLIENT_VOTE_REQUEST: return "CLIENT_VOTE_REQUEST"; + case CLIENT_PLAYER_DEATH_STATE: return "CLIENT_PLAYER_DEATH_STATE"; + case CLIENT_PLAYER_ESCAPED: return "CLIENT_PLAYER_ESCAPED"; + case SERVER_PLAYER_ESCAPED: return "SERVER_PLAYER_ESCAPED"; + case CLIENT_LOBBY_PLAYERS_REQUEST: return "CLIENT_LOBBY_PLAYERS_REQUEST"; + case CLIENT_CREAM_SPAWN_RINGS: return "CLIENT_CREAM_SPAWN_RINGS"; + case CLIENT_SPAWN_EFFECT: return "CLIENT_SPAWN_EFFECT"; + case CLIENT_CHAT_MESSAGE: return "CLIENT_CHAT_MESSAGE"; + case CLIENT_LOBBY_CHOOSEVOTEKICK: return "CLIENT_LOBBY_CHOOSEVOTEKICK"; + case CLIENT_LOBBY_CHOOSEBAN: return "CLIENT_LOBBY_CHOOSEBAN"; + case CLIENT_LOBBY_CHOOSEKICK: return "CLIENT_LOBBY_CHOOSEKICK"; + case CLIENT_LOBBY_CHOOSEOP: return "CLIENT_LOBBY_CHOOSEOP"; + case CLIENT_PLAYER_PALETTE: return "CLIENT_PLAYER_PALETTE"; + case CLIENT_PET_PALETTE: return "CLIENT_PET_PALETTE"; + case SERVER_RESULTS: return "SERVER_RESULTS"; + case SERVER_RESULTS_DATA: return "SERVER_RESULTS_DATA"; + case CLIENT_RESULTS_REQUEST: return "CLIENT_RESULTS_REQUEST"; + case CLIENT_STATS_REPORT: return "CLIENT_STATS_REPORT"; + case SERVER_PREIDENTITY: return "SERVER_PREIDENTITY"; + case SERVER_FELLA: return "SERVER_FELLA"; + case CLIENT_PLAYER_POTATER: return "CLIENT_PLAYER_POTATER"; + default: return ""; + } +} + +bool packet_new(Packet* packet, PacketType type) +{ + RAssert(packet); + packet->len = 0; + packet->pos = 0; + + PacketWrite(packet, packet_write8, 0); + PacketWrite(packet, packet_write8, (uint8_t)type); + + Debug("Created packet %s", getPacketTypeName(type)); + + return true; +} + +Packet packet_from(ENetPacket* packet) +{ + Packet pack = (Packet) { .pos = 0, .len = (uint8_t)packet->dataLength }; + memcpy(pack.buff, packet->data, (uint8_t)packet->dataLength); + enet_packet_destroy(packet); + return pack; +} + +bool packet_send(ENetPeer* peer, Packet* packet, bool reliable) +{ + PeerData* data = (PeerData*)peer->data; + if(data && data->disconnecting) + return true; + + if (packet->buff[1] != SERVER_HEARTBEAT) { + Debug("Sending packet %s", getPacketTypeName(packet->buff[1])); + } + + packet->pos = 0; + ENetPacket* pack = enet_packet_create(packet, packet->len, reliable ? ENET_PACKET_FLAG_RELIABLE : 0); + return enet_peer_send(peer, reliable ? 0 : 1, pack) == 0; +} + +bool packet_send_id(struct Server* server, uint16_t id, Packet* packet, bool reliable) +{ + packet->pos = 0; + ENetPacket* pack = enet_packet_create(packet, packet->len, reliable ? ENET_PACKET_FLAG_RELIABLE : 0); + + for(int32_t i = 0; i < server->peers.capacity; i++) + { + PeerData* data = (PeerData*)server->peers.ptr[i]; + if(!data) + continue; + + if(data->id != id) + continue; + + return enet_peer_send(data->peer, reliable ? 0 : 1, pack) == 0; + } + + return false; +} + +bool packet_seek(Packet* packet, int wh) +{ + RAssert(wh >= 0); + RAssert(wh < PACKET_MAXSIZE); + RAssert(wh < packet->len); + + packet->pos = wh; + return true; +} + +bool packet_read8(Packet* packet, uint8_t* out) +{ + RAssert(packet->pos < packet->len); + *out = packet->buff[packet->pos++]; + + return true; +} + +bool packet_read16(Packet* packet, uint16_t* out) +{ + RAssert(packet->pos < packet->len); + *out = *((int16_t*)&packet->buff[packet->pos]); + +#ifdef SYS_BIG_ENDIAN + *out = BYTESWAP_16(*out); +#endif + + packet->pos += 2; + + return true; +} + +bool packet_read32(Packet* packet, uint32_t* out) +{ + RAssert(packet->pos < packet->len); + *out = *((int32_t*)&packet->buff[packet->pos]); + +#ifdef SYS_BIG_ENDIAN + *out = BYTESWAP_32(*out); +#endif + + packet->pos += 4; + + return true; +} + +bool packet_read64(Packet* packet, uint64_t* out) +{ + RAssert(packet->pos < packet->len); + *out = *((int64_t*)&packet->buff[packet->pos]); + +#ifdef SYS_BIG_ENDIAN + *out = BYTESWAP_64(*out); +#endif + + packet->pos += 8; + + return true; +} + +bool packet_readfloat(Packet* packet, float* out) +{ + RAssert(packet->pos < packet->len); + *out = *((float*)&packet->buff[packet->pos]); + +#ifdef SYS_BIG_ENDIAN + *out = BYTESWAP_32(*out); +#endif + + packet->pos += 4; + + return true; +} + +bool packet_readdouble(Packet* packet, double* out) +{ + RAssert(packet->pos < packet->len); + *out = *((float*)&packet->buff[packet->pos]); + +#ifdef SYS_BIG_ENDIAN + * out = BYTESWAP_32(*out); +#endif + + packet->pos += 8; + + return true; +} + +bool packet_readstr(Packet* packet, String* out) +{ + out->len = 0; + + while (1) + { + RAssert(packet->pos < packet->len); + RAssert(out->len < 128); + + char ch = packet->buff[packet->pos]; + out->value[out->len] = ch; + + packet->pos++; + out->len++; + + if (ch == '\0') + break; + } + + return true; +} + +bool packet_write8(Packet* packet, uint8_t value) +{ + RAssert(packet->pos + 1 < PACKET_MAXSIZE); + + if (packet->pos + 1 >= packet->len) + packet->len++; + + packet->buff[packet->pos++] = value; + return true; +} + +bool packet_write16(Packet* packet, uint16_t value) +{ + RAssert(packet->pos + 2 < PACKET_MAXSIZE); + + if (packet->pos + 2 >= packet->len) + packet->len += 2; + +#ifdef SYS_BIG_ENDIAN + value = BYTESWAP_16(value); +#endif + + uint8_t* ptr = (uint8_t*)&value; + packet->buff[packet->pos++] = ptr[0]; + packet->buff[packet->pos++] = ptr[1]; + return true; +} + +bool packet_write32(Packet* packet, uint32_t value) +{ + RAssert(packet->pos + 4 < PACKET_MAXSIZE); + + if (packet->pos + 4 >= packet->len) + packet->len += 4; + +#ifdef SYS_BIG_ENDIAN + value = BYTESWAP_32(value); +#endif + + uint8_t* ptr = (uint8_t*)&value; + packet->buff[packet->pos++] = ptr[0]; + packet->buff[packet->pos++] = ptr[1]; + packet->buff[packet->pos++] = ptr[2]; + packet->buff[packet->pos++] = ptr[3]; + return true; +} + +bool packet_write64(Packet* packet, uint64_t value) +{ + RAssert(packet->pos + 8 < PACKET_MAXSIZE); + + if (packet->pos + 8 >= packet->len) + packet->len += 8; + +#ifdef SYS_BIG_ENDIAN + value = BYTESWAP_64(value); +#endif + + uint8_t* ptr = (uint8_t*)&value; + packet->buff[packet->pos++] = ptr[0]; + packet->buff[packet->pos++] = ptr[1]; + packet->buff[packet->pos++] = ptr[2]; + packet->buff[packet->pos++] = ptr[3]; + packet->buff[packet->pos++] = ptr[4]; + packet->buff[packet->pos++] = ptr[5]; + packet->buff[packet->pos++] = ptr[6]; + packet->buff[packet->pos++] = ptr[7]; + return true; +} + +bool packet_writefloat(Packet* packet, float value) +{ + RAssert(packet->pos + 4 < PACKET_MAXSIZE); + + if (packet->pos + 4 >= packet->len) + packet->len += 4; + +#ifdef SYS_BIG_ENDIAN + value = BYTESWAP_32(value); +#endif + + uint8_t* ptr = (uint8_t*)&value; + packet->buff[packet->pos++] = ptr[0]; + packet->buff[packet->pos++] = ptr[1]; + packet->buff[packet->pos++] = ptr[2]; + packet->buff[packet->pos++] = ptr[3]; + return true; +} + +bool packet_writedouble(Packet* packet, double value) +{ + RAssert(packet->pos + 8 < PACKET_MAXSIZE); + + if (packet->pos + 8 >= packet->len) + packet->len += 8; + +#ifdef SYS_BIG_ENDIAN + value = BYTESWAP_64(value); +#endif + + uint8_t* ptr = (uint8_t*)&value; + packet->buff[packet->pos++] = ptr[0]; + packet->buff[packet->pos++] = ptr[1]; + packet->buff[packet->pos++] = ptr[2]; + packet->buff[packet->pos++] = ptr[3]; + packet->buff[packet->pos++] = ptr[4]; + packet->buff[packet->pos++] = ptr[5]; + packet->buff[packet->pos++] = ptr[6]; + packet->buff[packet->pos++] = ptr[7]; + return true; +} + +bool packet_writestr(Packet* packet, String value) +{ + for (uint8_t i = 0; i < value.len; i++) + RAssert(packet_write8(packet, value.value[i])); + + return true; +} diff --git a/disasterserver_c/Packet.h b/disasterserver_c/Packet.h new file mode 100644 index 0000000..b31b161 --- /dev/null +++ b/disasterserver_c/Packet.h @@ -0,0 +1,220 @@ +#ifndef PACKET_H +#define PACKET_H +#include +#include +#include + +typedef enum +{ + IDENTITY, + SERVER_IDENTITY_RESPONSE, + + SERVER_PLAYER_JOINED, + SERVER_PLAYER_LEFT, + SERVER_PLAYER_FORCE_DISCONNECT, + + SERVER_WAITING_PLAYER_INFO, + + SERVER_LOBBY_READY_STATE, + SERVER_LOBBY_EXE, + SERVER_LOBBY_COUNTDOWN, + SERVER_LOBBY_EXE_CHANGE, + SERVER_LOBBY_CHARACTER_CHANGE, + SERVER_LOBBY_CHARACTER_RESPONSE, + SERVER_LOBBY_EXECHARACTER_RESPONSE, + SERVER_LOBBY_GAME_START, + SERVER_LOBBY_PLAYER, + SERVER_LOBBY_EXE_CHANCE, + SERVER_LOBBY_CORRECT, + SERVER_LOBBY_CHOOSEVOTEKICK, + SERVER_LOBBY_CHOOSEBAN, + SERVER_LOBBY_CHOOSEKICK, + SERVER_LOBBY_CHOOSEOP, + SERVER_LOBBY_CHANGELOBBY, + SERVER_CHAR_TIME_SYNC, + + SERVER_VOTE_MAPS, + SERVER_VOTE_SET, + SERVER_VOTE_TIME_SYNC, + + SERVER_GAME_PLAYERS_READY, + SERVER_GAME_EXE_WINS, + SERVER_GAME_SURVIVOR_WIN, + SERVER_GAME_SPAWN_RING, + SERVER_GAME_PLAYER_ESCAPED, + SERVER_GAME_BACK_TO_LOBBY, + SERVER_GAME_TIME_SYNC, + SERVER_GAME_TIME_OVER, + SERVER_GAME_PING, + SERVER_PLAYER_DEATH_STATE, + SERVER_GAME_DEATHTIMER_TICK, + SERVER_GAME_DEATHTIMER_END, + + SERVER_REQUEST_INFO, + SERVER_HEARTBEAT, + SERVER_PONG, + + SERVER_FORCE_DAMAGE, + SERVER_GAME_RING_READY, + SERVER_PLAYER_BACKTRACK, + + // Entities + SERVER_TPROJECTILE_STATE, + SERVER_ETRACKER_STATE, + SERVER_ERECTOR_BRING_SPAWN, + SERVER_RMZSLIME_STATE, + SERVER_RMZSLIME_RINGBONUS, + SERVER_RMZSHARD_STATE, + SERVER_LCEYE_STATE, + SERVER_LCCHAIN_STATE, + SERVER_NPCONTROLLER_STATE, + SERVER_KAFMONITOR_STATE, + SERVER_YCRSMOKE_STATE, + SERVER_YCRSMOKE_READY, + SERVER_MOVINGSPIKE_STATE, + SERVER_RING_STATE, + SERVER_RING_COLLECTED, + SERVER_ACT9WALL_STATE, + SERVER_NAPBALL_STATE, + SERVER_NAPICE_STATE, + SERVER_PFLIFT_STATE, + SERVER_BRING_STATE, + SERVER_BRING_COLLECTED, + SERVER_VVLCOLUMN_STATE, + SERVER_VVVASE_STATE, + SERVER_GHZTHUNDER_STATE, + SERVER_TCGOM_STATE, + SERVER_EXELLERCLONE_STATE, + SERVER_DTTAILSDOLL_STATE, + SERVER_DTBALL_STATE, + SERVER_DTASS_STATE, + SERVER_HDDOOR_STATE, + SERVER_WDLATERN_ACTIVATE, + SERVER_FART_STATE, + SERVER_MJLAVA_STATE, + SERVER_MJJUDGER_STATE, + SERVER_MJCRYSTAL_STATE, + + // Entity actions + CLIENT_ETRACKER, + CLIENT_ETRACKER_ACTIVATED, + CLIENT_TPROJECTILE, + CLIENT_TPROJECTILE_HIT, + CLIENT_TPROJECTILE_STARTCHARGE, + CLIENT_ERECTOR_BALLS, + CLIENT_ERECTOR_BRING_SPAWN, + CLIENT_EXELLER_SPAWN_CLONE, + CLIENT_EXELLER_TELEPORT_CLONE, + CLIENT_MERCOIN_BONUS, + + CLIENT_RMZSLIME_HIT, + CLIENT_LCEYE_REQUEST_ACTIVATE, + CLIENT_KAFMONITOR_ACTIVATE, + CLIENT_RING_COLLECTED, + CLIENT_RING_BROKE, + CLIENT_BRING_COLLECTED, + CLIENT_NAPICE_ACTIVATE, + CLIENT_SPRING_USE, + CLIENT_PFLIT_ACTIVATE, + CLIENT_VVVASE_BREAK, + CLIENT_RMZSHARD_COLLECT, + CLIENT_RMZSHARD_LAND, + CLIENT_DTASS_ACTIVATE, + CLIENT_HDDOOR_TOGGLE, + CLIENT_FART_PUSH, + + CLIENT_LOBBY_READY_STATE, + CLIENT_REQUESTED_INFO, + CLIENT_PLAYER_DATA, + CLIENT_PLAYER_HURT, + CLIENT_SOUND_EMIT, + CLIENT_PING, + + CLIENT_REVIVAL_PROGRESS, + CLIENT_PLAYER_HEAL, + CLIENT_PLAYER_HEAL_PART, + SERVER_REVIVAL_PROGRESS, + SERVER_REVIVAL_STATUS, + SERVER_REVIVAL_RINGSUB, + SERVER_REVIVAL_REVIVED, + + CLIENT_REQUEST_CHARACTER, + CLIENT_REQUEST_EXECHARACTER, + CLIENT_VOTE_REQUEST, + + CLIENT_PLAYER_DEATH_STATE, + CLIENT_PLAYER_ESCAPED, + SERVER_PLAYER_ESCAPED, + CLIENT_LOBBY_PLAYERS_REQUEST, + CLIENT_CREAM_SPAWN_RINGS, + CLIENT_SPAWN_EFFECT, + CLIENT_CHAT_MESSAGE, + CLIENT_LOBBY_CHOOSEVOTEKICK, + CLIENT_LOBBY_CHOOSEBAN, + CLIENT_LOBBY_CHOOSEKICK, + CLIENT_LOBBY_CHOOSEOP, + CLIENT_PLAYER_PALETTE, + CLIENT_PET_PALETTE, + + SERVER_RESULTS, + SERVER_RESULTS_DATA, + CLIENT_RESULTS_REQUEST, + CLIENT_STATS_REPORT, + SERVER_PREIDENTITY, + SERVER_FELLA, + + CLIENT_PLAYER_POTATER +} PacketType; + +typedef struct +{ + #define PACKET_MAXSIZE 256 + + uint8_t buff[PACKET_MAXSIZE]; + uint8_t pos; + uint8_t len; +} Packet; + +/* UTF-8 supporting string */ +typedef struct +{ + char value[250]; + uint16_t len; +} String; + +String string_new(const char* value); +size_t string_length(String* str); +String string_lower(String str); +#define __Str(x) string_new(x) + +bool packet_new(Packet* packet, PacketType type); +Packet packet_from(ENetPacket* packet); + +struct Server; +bool packet_send(ENetPeer* peer, Packet* packet, bool reliable); +bool packet_send_id(struct Server* server, uint16_t id, Packet* packet, bool reliable); +bool packet_seek(Packet* packet, int wh); + +bool packet_read8(Packet* packet, uint8_t* out); +bool packet_read16(Packet* packet, uint16_t* out); +bool packet_read32(Packet* packet, uint32_t* out); +bool packet_read64(Packet* packet, uint64_t* out); +bool packet_readfloat(Packet* packet, float* out); +bool packet_readdouble(Packet* packet, double* out); +bool packet_readstr(Packet* packet, String* out); + +bool packet_write8(Packet* packet, uint8_t value); +bool packet_write16(Packet* packet, uint16_t value); +bool packet_write32(Packet* packet, uint32_t value); +bool packet_write64(Packet* packet, uint64_t value); +bool packet_writefloat(Packet* packet, float value); +bool packet_writedouble(Packet* packet, double value); +bool packet_writestr(Packet* packet, String value); + +#define PacketCreate(packet, type) RAssert(packet_new(packet, type)) +#define PacketRead(outname, packet, func, type)\ +type outname;\ +RAssert(func(packet, (void*)&outname)) +#define PacketWrite(packet, func, val) RAssert(func(packet, val)) + +#endif diff --git a/disasterserver_c/Palette.c b/disasterserver_c/Palette.c new file mode 100644 index 0000000..b7d12df --- /dev/null +++ b/disasterserver_c/Palette.c @@ -0,0 +1,203 @@ +#include +#include +#define PALETTE_END (0xDEADB00B) +#define PALETTE_EPSILON (10) + +uint32_t palettes_from[][20] = { + { 0xe0a000, 0xe08000, 0xa06040, 0xc0c0e0, 0xa0a0c0, 0x606080, 0x202020, PALETTE_END }, + { 0xe0a000, 0xe08000, 0xa06040, 0xe0e0e0, 0xc0c0e0, 0xa0a0c0, 0x606080, 0x800000, PALETTE_END }, + { 0x2d273b, 0x181421, 0xb3b3b3, 0x828282, 0x424242, PALETTE_END }, + { 0x2d273b, 0x181421, 0xd6d6d6, 0xb3b3b3, 0x828282, 0x424242, PALETTE_END }, + { 0xf84468, 0xd00020, 0x680020, 0xf8f8f8, 0xd0d4f8, 0xb0b0d0, 0x686888, 0xf80000, 0x880000, 0x202020, PALETTE_END }, + { 0xf84468, 0xd00020, 0x680020, 0xf8f8f8, 0xd0d4f8, 0xb0b0d0, 0x686888, 0x880000, PALETTE_END }, + { 0x771515, 0x470013, 0x1f000b, 0xd6d6d6, 0xb3b3b3, 0x828282, 0x424242, 0xd58f6e, 0x944b3d, 0xd6d6d6, PALETTE_END }, + { 0x771515, 0x470013, 0x1f000b, 0xd6d6d6, 0xb3b3b3, 0x828282, 0x424242, 0xd58f6e, 0x944b3d, PALETTE_END }, + { 0x800000, 0xe0a000, 0xe0e0e0, 0xc0c0e0, 0xa0a0c0, 0x606080, 0x202020, PALETTE_END }, + { 0xe00000, 0x800000, 0xe0a000, 0xe0e0e0, 0xc0c0e0, 0xa0a0c0, 0x606080, 0xe0a080, 0xa06040, PALETTE_END }, + { 0x470013, 0x1f000b, 0x976e2b, 0x64372b, 0xd6d6d6, 0xb3b3b3, 0x828282, 0x424242, 0x363636, 0x636363, 0x470000, 0x383838, 0x616161, PALETTE_END }, + { 0x470013, 0x1f000b, 0x976e2b, 0x64372b, 0xd6d6d6, 0xb3b3b3, 0x828282, 0x424242, PALETTE_END }, + { 0xf19dbb, 0xe65b8c, 0xa93559, 0xbb7655, 0xfcb037, 0xdc7605, 0xff7575, 0xe0e0e0, 0xc0c0e0, 0xa0a0c0, 0x606080, 0x202020, PALETTE_END }, + { 0xf19dbb, 0xe65b8c, 0xa93559, 0xbb7655, 0x800000, 0xe0e0e0, 0xc0c0e0, 0xa0a0c0, 0x606080, PALETTE_END }, + { 0x884440, 0x582c28, 0x301818, 0xd6d6d6, 0xb3b3b3, 0x828282, 0x424242, 0x9e4127, 0xd58f6e, PALETTE_END }, + { 0x884440, 0x582c28, 0x301818, 0x431a20, 0x260a0f, 0x632d33, 0xd6d6d6, 0xb3b3b3, 0x828282, 0x424242, PALETTE_END }, + { 0xeecba8, 0xe39c79, 0xc16b53, 0xfc8c04, 0xd5560b, 0xe00000, 0x800000, 0xe4e0e4, 0xc0c0e0, 0xa0a0c0, 0x606080, 0x202020, PALETTE_END }, + { 0xeecba8, 0xe39c79, 0xc16b53, 0xfc8c04, 0xd5560b, 0xa3330e, 0xe00000, 0x800000, 0xf3bb10, 0xc46a09, 0xe4e0e4, 0xc0c0e0, 0xa0a0c0, 0x606080, PALETTE_END }, + { 0x793379, 0x4b214b, 0x341634, 0x771515, 0x470013, 0x1f000b, 0x431a20, 0x260a0f, 0xe4e0e4, 0xb3b3b3, 0x828282, 0x424242, PALETTE_END }, + { 0x793379, 0x4b214b, 0x341634, 0x771515, 0x470013, 0x1f000b, 0x431a20, 0x260a0f, 0xb3b3b3, 0x828282, 0x424242, 0x000000, PALETTE_END }, + { 0xdf7f22, 0xaf631b, 0x7f4712, 0xf1be5f, 0xc3994c, 0x8b6c34, 0x6060e0, 0x3600ff, 0x2d008f, 0xc22313, 0xa21a0b, 0x721307, PALETTE_END }, + { 0xdf7f22, 0xaf631b, 0x7f4712, 0xf1be5f, 0xc3994c, 0x8b6c34, 0x6060e0, 0x3600ff, 0x2d008f, 0xc22313, 0xa21a0b, 0x721307, PALETTE_END }, + { 0x68232a, 0x421216, 0x260006, 0xe49c79, 0xbb6d4e, 0x66281d, 0x474784, 0x202886, 0x1b1342, 0x740000, 0x400000, 0x1c0000, 0x470000, 0x910000, 0x963423, PALETTE_END }, + { 0x68232a, 0x421216, 0x260006, 0xe49c79, 0xbb6d4e, 0x66281d, 0x474784, 0x202886, 0x1b1342, 0x740000, 0x400000, 0x1c0000, 0x000000, 0x470000, 0x910000, 0x963423, PALETTE_END }, + { 0x6b69ff, 0x2145d6, 0x21208c, 0xfffbff, 0xd6d7ff, 0xb5b2d6, 0x6b698c, 0x800000, 0xe00000, PALETTE_END }, + { 0x6b69ff, 0x2145d6, 0x21208c, 0xffb28c, 0xb56942, 0xfffbff, 0xd6d7ff, 0xb5b2d6, 0x6b698c, 0xff0000, 0x940000, 0x800000, 0xe00000, PALETTE_END }, + { 0x2c3974, 0x253060, 0x171f3c, 0x001b2e, 0x000e18, 0x058cf9, 0x2f608e, 0x463e8e, 0x0094ff, PALETTE_END }, + { 0x2c3974, 0x253060, 0x171f3c, 0x001b2e, 0x000e18, 0x058cf9, 0x2f608e, 0x463e8e, 0xfffbff, 0xd6d7ff, 0xa0a0c0, 0x606080, 0xb5b2d6, 0x6b698c, 0x606080, 0x0094ff, PALETTE_END }, + { 0x003f99, 0x01316a, 0x011535, 0xf2c4b5, 0x99766c, PALETTE_END }, + { 0x011535, 0x6b698c, 0x300909, 0x940001, 0xff0000, 0x01316a, 0x99766c, 0xcc0005, 0xff0001, 0xb8b8d8, 0x003f99, 0xf2c4b5, 0xd8d8f8, 0xfcfcfc, 0x222222, 0xff3338, 0x940000, 0x604239, PALETTE_END }, + { 0x177aff, 0x0f47c0, 0x102676, 0xf2a572, 0xb2622d, PALETTE_END }, + { 0x177aff, 0x0f47c0, 0x102676, 0xf2a572, 0xb2622d, 0xc40000, PALETTE_END } +}; +#define PALETTE_FROM_SIZE (32) + +uint32_t palettes_to[][20] = { + { 0xe09600, 0xbf6900, 0x8f0e00, 0xa5a5a5, 0x848484, 0x424242, 0x000000, PALETTE_END }, + { 0xf89c00, 0xfa6000, 0xb80c00, 0xfcfcfc, 0xd8d8fc, 0xb4b4d8, 0x6c6c90, 0x800020, PALETTE_END }, + { 0x282848, 0x101430, 0xc0c0e0, 0xa0a0c0, 0x606080, PALETTE_END }, + { 0x482928, 0x301013, 0xddd0d0, 0xc1abaa, 0x83766d, 0x53524a, PALETTE_END }, + { 0xf02c28, 0x982020, 0x570000, 0xe0e0e0, 0xa5a5a5, 0x848484, 0x424242, 0x982020, 0x570000, 0x000000, PALETTE_END }, + { 0xfc0000, 0xac0000, 0x570000, 0xfcfcfc, 0xd8d8fc, 0xb4b4d8, 0x6c6c90, 0x800020, PALETTE_END }, + { 0x900005, 0x59000f, 0x210009, 0xddd0d0, 0xc1abaa, 0x83766d, 0x53524a, 0xfcb490, 0xb46c48, 0xddd0d0, PALETTE_END }, + { 0x9f002d, 0x68002c, 0x300019, 0xf8f8f8, 0xd0d4f8, 0xb0b0d0, 0x686888, 0xfcb490, 0xb46c48, PALETTE_END }, + { 0x570000, 0xffda00, 0xe0e0e0, 0xa5a5a5, 0x848484, 0x424242, 0x000000, PALETTE_END }, + { 0xb42448, 0x800020, 0xf89c00, 0xfcfcfc, 0xd8d8fc, 0xb4b4d8, 0x6c6c90, 0xf29a6e, 0xba5726, PALETTE_END }, + { 0x6e1717, 0x420f0f, 0xb19a27, 0x92791e, 0xddd0d0, 0xc1abaa, 0x83766d, 0x53524a, 0x6b5f5f, 0xafa3a3, 0x800000, 0x6b5f5f, 0xafa3a3, PALETTE_END }, + { 0x610000, 0x380000, 0xb39502, 0x8c6e00, 0xf8f8f8, 0xd0d4f8, 0xb0b0d0, 0x686888, PALETTE_END }, + { 0xe1a1cc, 0xd45a99, 0x802e42, 0xaa6644, 0xe08e00, 0xa06040, 0xe74200, 0xe0e0e0, 0xa5a5a5, 0x848484, 0x424242, 0x000000, PALETTE_END }, + { 0xff9cbe, 0xff3b65, 0xa61738, 0xba5726, 0x800020, 0xfcfcfc, 0xd8d8fc, 0xb4b4d8, 0x6c6c90, PALETTE_END }, + { 0xc97f7b, 0x8c4b48, 0x4d2626, 0xe0e0e0, 0xc0c0e0, 0xa0a0c0, 0x606080, 0x7f6948, 0xdab273, PALETTE_END }, + { 0xb35658, 0x882a3b, 0x4c101b, 0x97091c, 0x5b070a, 0xbf364a, 0xddd0d0, 0xc1abaa, 0x83766d, 0x53524a, PALETTE_END }, + { 0xf8e0b8, 0xe8c080, 0x987840, 0xf89000, 0xe05800, 0xf85800, 0x980000, 0xe4e0e4, 0xa5a5a5, 0x848484, 0x424242, 0x000000, PALETTE_END }, + { 0xfacb9c, 0xf69566, 0xdd5b37, 0xf89c00, 0xfa6000, 0xb80c00, 0xe70000, 0x800020, 0xf89c00, 0xdd5b37, 0xfcfcfc, 0xd8d8fc, 0xb4b4d8, 0x6c6c90, PALETTE_END }, + { 0x61315e, 0x3f2040, 0x291329, 0x960d19, 0x690000, 0x400000, 0x6e4435, 0x4d2d25, 0xddd0d0, 0xc1abaa, 0x83766d, 0x53524a, PALETTE_END }, + { 0xbb1a81, 0x7d1055, 0x520e40, 0xb91107, 0x97091c, 0x5b070a, 0x97091c, 0x5b070a, 0xc0c0e0, 0xa0a0c0, 0x606080, 0x212121, PALETTE_END }, + { 0xc56b36, 0x985329, 0x71371c, 0xe0c080, 0xb09256, 0x695128, 0x60a0e0, 0x2060e0, 0x2040a0, 0xc43612, 0xa02000, 0x800000, PALETTE_END }, + { 0xa3632b, 0x884c18, 0x69370c, 0xe9c094, 0xc48f76, 0x875741, 0x177aff, 0x2040c0, 0x202080, 0xe00020, 0xa00000, 0x620000, PALETTE_END }, + { 0x955f4a, 0x6e4435, 0x4d2d25, 0xdab273, 0xa1845c, 0x5e4d36, 0x6b69ff, 0x2145d6, 0x21208c, 0xa62005, 0x690000, 0x400000, 0x400000, 0xa1845c, 0xa1845c, PALETTE_END }, + { 0xc56b36, 0x985329, 0x71371c, 0xe0c080, 0xba9954, 0x755f2f, 0x4080c0, 0x2060a0, 0x204060, 0xc22313, 0xa21a0b, 0x721307, 0x202020, 0xa03219, 0x9a4827, 0xa76939, PALETTE_END }, + { 0x6c6cd8, 0x4848b4, 0x242490, 0xe4e0e4, 0xb3b3b3, 0x828282, 0x424242, 0x5a0000, 0xb30000, PALETTE_END }, + { 0x256ba9, 0x205a7a, 0x13374d, 0xe3b890, 0xa5826b, 0xddd0d0, 0xc1abaa, 0x83766d, 0x53524a, 0xd1322e, 0x731c1a, 0x5a0000, 0xb30000, PALETTE_END }, + { 0x2c6d74, 0x255a60, 0x173a3c, 0x002e20, 0x001811, 0x05f9b7, 0x137373, 0x132d46, 0x05f9b7, PALETTE_END }, + { 0x742c40, 0x602536, 0x3c1723, 0x2e0000, 0x170000, 0xff0000, 0x940000, 0x2e0000, 0xddd0d0, 0xc1abaa, 0x83766d, 0x53524a, 0xc1abaa, 0x83766d, 0x53524a, 0xff0000, PALETTE_END }, + { 0x0e38a3, 0x110b9f, 0x000f55, 0xe0a080, 0xa06040, PALETTE_END }, + { 0x3d0065, 0x3d0065, 0x3d0065, 0x3d0065, 0x0c0031, 0x0c0031, 0x0c0031, 0x0c0031, 0x0c0031, 0x0c0031, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x7300bf, 0x3d0065, 0x3d0065, PALETTE_END }, + { 0x6b69ff, 0x2145d6, 0x21208c, 0xffb28c, 0xb56942, PALETTE_END }, + { 0x353867, 0x292d50, 0x1c1f37, 0xc1bdb8, 0x898781, 0x800000, PALETTE_END } +}; +#define PALETTE_TO_SIZE (32) + +uint32_t palettes_custom[][5] = { + { 0x800000, 0xe00000, PALETTE_END }, + { 0x800000, 0xe00000, PALETTE_END }, + { 0x880000, 0xf80000, PALETTE_END }, + { 0x840000, 0xe70000, PALETTE_END }, + { 0xe0a000, PALETTE_END }, + { 0x64372b, 0x976e2b, PALETTE_END }, + { 0x800000, 0xe00000, 0xff7575, PALETTE_END }, + { 0x260a0f, 0x431a20, 0x632d33, PALETTE_END }, + { 0x800000, 0xe00000, PALETTE_END }, + { 0x260a0f, 0x431a20, PALETTE_END }, + { 0x2d008f, 0x3600ff, 0x6060e0, 0x25518a, PALETTE_END }, + { 0x1b1342, 0x202886, 0x474784, PALETTE_END }, + { 0x940000, 0xff0000, PALETTE_END }, + { 0x940000, 0xff0000, PALETTE_END }, + { 0x940001, 0xff0001, PALETTE_END }, + { 0x177aff, 0x0f47c0, 0x102676, PALETTE_END } +}; +#define PALETTE_CUSTOM_SIZE (16) + +bool palette_within_epsilon(uint8_t a, uint8_t b) +{ + return a >= b - PALETTE_EPSILON && a <= b + PALETTE_EPSILON; +} + +bool palette_player_validate(PeerData* v, Packet* packet) +{ + PacketRead(from, packet, packet_read8, uint8_t); + PacketRead(id, packet, packet_read16, uint16_t); + PacketRead(name, packet, packet_readstr, String); + PacketRead(size, packet, packet_read8, uint8_t); + + // default + if(size <= 0) + return false; + + // Check for custom & correct id + bool is_custom = strncmp(name.value, "custom", 6) == 0; + RAssert(v->id == id); + RAssert((size / 4) <= 19); + + uint32_t final[20][3] = {0}; + uint8_t final_len = 0; + + for(uint8_t i = 0; i < size / 4; i++) + { + PacketRead(r, packet, packet_read8, uint8_t); + PacketRead(g, packet, packet_read8, uint8_t); + PacketRead(b, packet, packet_read8, uint8_t); + PacketRead(a, packet, packet_read8, uint8_t); + + final[final_len][0] = r; + final[final_len][1] = g; + final[final_len++][2] = b; + } + + if(from) + { + for(int i = 0; i < (is_custom ? PALETTE_CUSTOM_SIZE : PALETTE_FROM_SIZE); i++) + { + uint8_t match = 0; + uint8_t length = 0; + + while(1) + { + uint32_t rgb = is_custom ? palettes_custom[i][length] : palettes_from[i][length]; + uint8_t r = (rgb >> 16) & 0xFF; + uint8_t g = (rgb >> 8) & 0xFF; + uint8_t b = rgb & 0xFF; + + if(palette_within_epsilon(final[length][0], r), palette_within_epsilon(final[length][1], g), palette_within_epsilon(final[length][2], b)) + ++match; + + if(++length >= final_len) + break; + + if(is_custom) + { + if(palettes_custom[i][length] == PALETTE_END) + break; + } + else + { + if(palettes_from[i][length] == PALETTE_END) + break; + } + } + + if(match != 0 && match == length) + return true; + } + } + else + { + if(is_custom) + return true; + + for(int i = 0; i < PALETTE_TO_SIZE; i++) + { + uint8_t match = 0; + uint8_t length = 0; + + while(1) + { + uint32_t rgb = palettes_to[i][length]; + uint8_t r = (rgb >> 16) & 0xFF; + uint8_t g = (rgb >> 8) & 0xFF; + uint8_t b = rgb & 0xFF; + + if(palette_within_epsilon(final[length][0], r), palette_within_epsilon(final[length][1], g), palette_within_epsilon(final[length][2], b)) + ++match; + + if(++length >= final_len) + break; + + if(palettes_to[i][length] == PALETTE_END) + break; + } + + if(match != 0 && match == length) + return true; + } + } + + return false; +} \ No newline at end of file diff --git a/disasterserver_c/Palette.h b/disasterserver_c/Palette.h new file mode 100644 index 0000000..997cd4e --- /dev/null +++ b/disasterserver_c/Palette.h @@ -0,0 +1,9 @@ +#ifndef PALETTE_H +#define PALETTE_H +#include +#include +#include + +bool palette_player_validate(PeerData* v, Packet* packet); + +#endif \ No newline at end of file diff --git a/disasterserver_c/Player.c b/disasterserver_c/Player.c new file mode 100644 index 0000000..30c1e4a --- /dev/null +++ b/disasterserver_c/Player.c @@ -0,0 +1,42 @@ +#include +#include +#include + +bool player_add_error(Server* server, PeerData* v, uint16_t by) +{ + v->plr.errors += by; + + Debug("%d error is now %d", v->id, v->plr.errors); + if (v->plr.errors >= 30000) + { + server_disconnect(server, v->peer, DR_OTHER, "Fun fact: dial-up internet connection was relevant 20 years ago!"); + return false; + } + + return true; +} + +void player_check_zone(Server* server, PeerData* v) +{ + if (!g_config.anticheat) + return; + + if (!server->game.started) + return; + + if (v->plr.pos.x == 0 && v->plr.pos.y == 0) + return; + + const Zone* zones = g_mapZone[server->game.map]; + const size_t zonesSize = g_mapZoneSize[server->game.map]; + for (size_t i = 0; i < zonesSize; i++) + { + const Zone zone = zones[i]; + if (v->plr.pos.x >= zone.x && v->plr.pos.y >= zone.y && v->plr.pos.x <= zone.x + zone.w && v->plr.pos.y <= zone.y + zone.h) + { + Debug("%d is inside invalid area %d", v->id, i); + if (!player_add_error(server, v, server->game.map == 6 ? 30 : 1000)) + return; + } + } +} diff --git a/disasterserver_c/Player.h b/disasterserver_c/Player.h new file mode 100644 index 0000000..5ceba72 --- /dev/null +++ b/disasterserver_c/Player.h @@ -0,0 +1,83 @@ +#ifndef PLAYER_H +#define PLAYER_H +#include +#include +#include +#include + +typedef enum +{ + PLAYER_NONE = 0, + PLAYER_ESCAPED = 0x1 << 0, + PLAYER_DEAD = 0x1 << 1, + PLAYER_DEMONIZED = 0x1 << 2, + PLAYER_REVIVED = 0x1 << 3, + PLAYER_CANTREVIVE = 0x1 << 4, + PLAYER_LEFT = 0x1 << 5, + PLAYER_KILLER = 0x1 << 6 +} PlayerFlags; + +typedef struct +{ + uint8_t ready; + uint16_t seq; + uint16_t errors; /* Used as tracker for errors like lag/etc */ + uint8_t ex_teleport; + double timeout; + + uint8_t mod_tool; + uint32_t mod_tool_timer; + uint32_t chunk; + TimeStamp last_packet; + + /* Attack */ + bool is_attacking; + double attack_timer; + TimeStamp last_attack; + + uint16_t ping_last; + double ping_total; + double ping_timer; + uint16_t rings; + TimeStamp last_rings; + uint16_t heal_rings; + + uint8_t state; + PlayerFlags flags; + uint8_t death_timer_sec; + double death_timer; + double revival; + int32_t revival_init[5]; + + uintptr_t data[4]; /* Can be used as pointer/data field */ + Vector2 start_pos; + Vector2 pos; + + struct + { + double survive_time; + double danger_time; + double camp_time; + + double braindead_time; + bool brain_damage; + + uint16_t stun_time; + uint16_t stuns; + uint16_t hp_restored; + uint16_t rings; + uint16_t damage; + uint16_t damage_taken; + uint16_t kills; + } stats; +} Player; + +#define SET_FLAG(x, flag) x |= (flag) +#define DEL_FLAG(x, flag) x = x & ~(flag) + +struct Server; +struct PeerData; +bool player_add_error (struct Server* server, struct PeerData* v, uint16_t by); +void player_check_zone(struct Server* server, struct PeerData* v); + +#endif \ No newline at end of file diff --git a/disasterserver_c/Server.c b/disasterserver_c/Server.c new file mode 100644 index 0000000..d6f3691 --- /dev/null +++ b/disasterserver_c/Server.c @@ -0,0 +1,966 @@ +#include "Lib.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#ifdef SYS_USE_SDL2 +#include +#endif + +cJSON *ip_addr_list = NULL; +Mutex ip_addr_mut; + +bool peer_identity_process(PeerData *v, const char *addr, bool is_banned, uint64_t timeout, bool do_timeout) +{ + MutexLock(ip_addr_mut); + { + if (!v->op && (cJSON_HasObjectItem(ip_addr_list, addr) || cJSON_HasObjectItem(ip_addr_list, v->udid.value))) + { + server_disconnect(v->server, v->peer, DR_IPINUSE, NULL); + MutexUnlock(ip_addr_mut); + return false; + } + } + MutexUnlock(ip_addr_mut); + + if (is_banned) + { + Info("%s banned by host (id %d, ip %s)", v->nickname.value, v->id, addr); + RAssert(server_disconnect(v->server, v->peer, DR_BANNEDBYHOST, NULL)); + return false; + } + + if (v->server->peers.noitems >= 7) + { + v->should_timeout = false; + server_disconnect(v->server, v->peer, DR_LOBBYFULL, NULL); + return false; + } + + if (do_timeout && timeout != 0) + { + time_t tm = time(NULL); + time_t val = timeout - tm; + if (val > 0) + { + Info("%s is rate-limited (id %d, ip %s)", v->nickname.value, v->id, addr); + RAssert(server_disconnect(v->server, v->peer, DR_RATELIMITED, NULL)); + return false; + } + else + AssertOrDisconnect(v->server, timeout_revoke(v->udid.value, addr)); + } + + if (!dylist_push(&v->server->peers, v)) + { + v->should_timeout = false; + server_disconnect(v->server, v->peer, DR_OTHER, "Report this to dev: code BALLS"); + return false; + } + + if (!server_state_joined(v)) + { + v->should_timeout = false; + server_disconnect(v->server, v->peer, DR_OTHER, "Report this to dev: code WHAR"); + return false; + } + + // If all checks out send new packet + Packet pack; + PacketCreate(&pack, SERVER_IDENTITY_RESPONSE); + PacketWrite(&pack, packet_write8, v->server->state == ST_LOBBY); + PacketWrite(&pack, packet_write16, v->id); + RAssert(packet_send(v->peer, &pack, true)); + + // If in queue, do following + if (!v->in_game) + { + // For icons + for (size_t i = 0; i < v->server->peers.capacity; i++) + { + PeerData *peer = (PeerData *)v->server->peers.ptr[i]; + if (!peer) + continue; + + if (peer->id == v->id) + continue; + + PacketCreate(&pack, SERVER_WAITING_PLAYER_INFO); + PacketWrite(&pack, packet_write8, v->server->state == ST_GAME && peer->in_game); + PacketWrite(&pack, packet_write16, peer->id); + PacketWrite(&pack, packet_writestr, peer->nickname); + + if (v->server->state == ST_GAME && peer->in_game) + { + PacketWrite(&pack, packet_write8, v->server->game.exe == peer->id); + PacketWrite(&pack, packet_write8, v->server->game.exe == peer->id ? peer->exe_char : peer->surv_char); + } + else + { + PacketWrite(&pack, packet_write8, peer->lobby_icon); + } + + RAssert(packet_send(v->peer, &pack, true)); + } + + // For other players in queue + PacketCreate(&pack, SERVER_WAITING_PLAYER_INFO); + PacketWrite(&pack, packet_write8, 0); + PacketWrite(&pack, packet_write16, v->id); + PacketWrite(&pack, packet_writestr, v->nickname); + PacketWrite(&pack, packet_write8, v->lobby_icon); + RAssert(server_broadcast_ex(v->server, &pack, true, v->id)); + + char msg[100]; + snprintf(msg, 100, "server " CLRCODE_RED "%d" CLRCODE_RST " of " CLRCODE_BLU "%d" CLRCODE_RST, v->server->id + 1, g_config.server_count); + + server_send_msg(v->server, v->peer, "-----------------------"); + server_send_msg(v->server, v->peer, CLRCODE_RED "better/server~ v" STRINGIFY(BUILD_VERSION)); + server_send_msg(v->server, v->peer, "build from " CLRCODE_PUR __DATE__ " " CLRCODE_GRN __TIME__ CLRCODE_RST); + server_send_msg(v->server, v->peer, msg); + server_send_msg(v->server, v->peer, "-----------------------"); + + if(g_config.motd[0] != '\0') + server_send_msg(v->server, v->peer, g_config.motd); + if (v->op) + server_send_msg(v->server, v->peer, CLRCODE_GRN "you're an operator on this server" CLRCODE_RST); + + if (v->server->state >= ST_GAME) + { + snprintf(msg, 100, "map: " CLRCODE_GRN "%s" CLRCODE_RST, g_mapList[v->server->game.map].name); + server_send_msg(v->server, v->peer, msg); + } + } + + MutexLock(ip_addr_mut); + cJSON_AddItemToObject(ip_addr_list, addr, cJSON_CreateTrue()); + cJSON_AddItemToObject(ip_addr_list, v->udid.value, cJSON_CreateTrue()); + MutexUnlock(ip_addr_mut); + return true; +} + +bool peer_identity(PeerData *v, Packet *packet) +{ + RAssert(v->id > 0); + srand((unsigned int)time(NULL)); + + bool is_banned; + uint64_t timeout; + + // Read header + PacketRead(passtrough, packet, packet_read8, uint8_t); + PacketRead(type, packet, packet_read8, uint8_t); + + PacketRead(build_version, packet, packet_read16, uint16_t); + PacketRead(server_index, packet, packet_read32, int32_t); + PacketRead(nickname, packet, packet_readstr, String); + PacketRead(udid, packet, packet_readstr, String); + PacketRead(lobby_icon, packet, packet_read8, uint8_t); + PacketRead(pet, packet, packet_read8, int8_t); + + RAssert(ban_check(udid.value, v->ip.value, &is_banned)); + RAssert(timeout_check(udid.value, v->ip.value, &timeout)); + RAssert(op_check(v->ip.value, &v->op)); + + v->should_timeout = true; + v->disconnecting = false; + v->mod_tool = false; + v->is_mobile = false; + v->nickname = nickname; + v->udid = udid; + v->lobby_icon = lobby_icon; + v->pet = pet; + + if (g_config.anticheat) + { + AssertOrDisconnect(v->server, auth_verify_ticket(v, packet)); + } + + bool res = true; + MutexLock(v->server->state_lock); + { + v->in_game = (v->server->state == ST_LOBBY); + v->exe_chance = 1 + rand() % 4; + + if (v->server->peers.noitems >= 7) + { + for (int i = 0; i < disaster_count(); i++) + { + Server *server = disaster_get(i); + if (!server) + continue; + + if (server->peers.noitems >= 7) + continue; + + Packet pack; + PacketCreate(&pack, SERVER_LOBBY_CHANGELOBBY); + PacketWrite(&pack, packet_write32, g_config.port + server->id); + packet_send(v->peer, &pack, true); + + Debug("Redirecting %d to another free server: %d", v->id, server->id); + res = false; + goto quit; + } + + server_disconnect(v->server, v->peer, DR_LOBBYFULL, NULL); + res = false; + goto quit; + } + + if (type != IDENTITY) + { + server_disconnect(v->server, v->peer, DR_OTHER, "type != IDENTITY?"); + res = false; + goto quit; + } + + if (passtrough) + { + server_disconnect(v->server, v->peer, DR_OTHER, "passtrough?"); + res = false; + goto quit; + } + + if (build_version != BUILD_VERSION) + { + server_disconnect(v->server, v->peer, DR_VERMISMATCH, NULL); + res = false; + goto quit; + } + + if (string_length(&nickname) >= 30) + { + server_disconnect(v->server, v->peer, DR_OTHER, "Your nickname is too long! (30 characters max)"); + res = false; + goto quit; + } + + if (udid.len <= 0) + { + server_disconnect(v->server, v->peer, DR_OTHER, "whoops you have to put the CD in you conputer"); + res = false; + goto quit; + } + + res = peer_identity_process(v, v->ip.value, is_banned, timeout, server_index == -1); + if (!res) + goto quit; + + Info("%s (id %d) " LOG_YLW "joined.", nickname.value, v->id); + Info(" IP: %s", v->ip.value); + Info(" UID: %s", udid.value); + Info(" Modified: %s", BoolStringify(v->mod_tool)); + Info(" Mobile: %s", BoolStringify(v->is_mobile)); + v->verified = true; + } + +quit: + MutexUnlock(v->server->state_lock); + return res; +} + +bool peer_msg(PeerData *v, Packet *packet) +{ + if (v->id == 0) + return false; + + bool res; + MutexLock(v->server->state_lock); + { + res = server_state_handle(v, packet); + } + MutexUnlock(v->server->state_lock); + + return res; +} + +bool server_worker(Server *server) +{ + srand((unsigned int)time(NULL)); + + char thread_name[128]; + snprintf(thread_name, 128, "Worker Thr %d", server->id); + ThreadVarSet(g_threadName, thread_name); + + if (!ip_addr_list) + { + ip_addr_list = cJSON_CreateObject(); + RAssert(ip_addr_list); + MutexCreate(ip_addr_mut); + } + + TimeStamp ticker; + time_start(&ticker); + + double next_tick = time_end(&ticker); + double heartbeat = 0.0; + const double TARGET_FPS = 1000.0 / 60; + + Packet pack; + PacketCreate(&pack, SERVER_HEARTBEAT); + + while (server->running) + { + ENetEvent ev; + if (enet_host_service(server->host, &ev, 5) > 0) + { + switch (ev.type) + { + case ENET_EVENT_TYPE_CONNECT: + { + Debug("ENET_EVENT_TYPE_CONNECT..."); + ev.peer->data = (PeerData *)malloc(sizeof(PeerData)); + if (!ev.peer->data) + return false; + + memset(ev.peer->data, 0, sizeof(PeerData)); + + PeerData *v = ev.peer->data; + v->server = server; + v->peer = ev.peer; + v->id = ev.peer->incomingPeerID + 1; + enet_address_get_host_ip(&ev.peer->address, v->ip.value, 250); + + Packet packet; + PacketCreate(&packet, SERVER_PREIDENTITY); + RAssert(auth_create_ticket(v, &packet)); + RAssert(packet_send(ev.peer, &packet, true)); + break; + } + + case ENET_EVENT_TYPE_DISCONNECT: + { + Debug("ENET_EVENT_TYPE_DISCONNECT..."); + PeerData *v = (PeerData *)ev.peer->data; + if (!v) + break; + + if (!v->op && v->should_timeout) + { + uint64_t result; + if (timeout_check(v->udid.value, v->ip.value, &result) && result == 0) + timeout_set(v->nickname.value, v->udid.value, v->ip.value, time(NULL) + 5); + } + + if (v->verified) + { + MutexLock(ip_addr_mut); + { + cJSON_DeleteItemFromObject(ip_addr_list, v->udid.value); + cJSON_DeleteItemFromObject(ip_addr_list, v->ip.value); + } + MutexUnlock(ip_addr_mut); + + MutexLock(v->server->state_lock); + { + // Step 3: Cleanup (Only if joined before) + if (dylist_remove(&v->server->peers, v)) + server_state_left(v); + } + MutexUnlock(v->server->state_lock); + } + + Info("%s (id %d) " LOG_YLW "left.", v->nickname.value, v->id); + free(v); + break; + } + + case ENET_EVENT_TYPE_RECEIVE: + { + PeerData *v = (PeerData *)ev.peer->data; + Packet packet = packet_from(ev.packet); + + switch (packet.buff[1]) + { + case IDENTITY: + { + if (!peer_identity(v, &packet)) + { + Debug("Identity failed for id %d", v->id); + } + break; + } + default: + { + if (!peer_msg(v, &packet)) + break; + } + } + + break; + } + default: break; + } + } + + double now = time_end(&ticker); + while (next_tick < now) + { + next_tick += TARGET_FPS; + MutexLock(server->state_lock); + { + switch (server->state) + { + case ST_LOBBY: + case ST_CHARSELECT: + case ST_MAPVOTE: + lobby_state_tick(server); + break; + + case ST_GAME: + game_state_tick(server); + break; + + case ST_RESULTS: + results_state_tick(server); + break; + } + + // Heartbeat + if (server->peers.noitems > 0) + { + server_broadcast(server, &pack, true); + if (heartbeat >= (TICKSPERSEC * 2)) + { + Debug("Heartbeat done."); + heartbeat = 0; + } + heartbeat += server->delta; + } + } + MutexUnlock(server->state_lock); + server->delta = 1; + } + } + + enet_host_destroy(server->host); + return true; +} + +bool server_disconnect(Server* server, ENetPeer* peer, DisconnectReason reason, const char* text) +{ + if (server) + { + PeerData* data = (PeerData*)peer->data; + if(data->disconnecting) + return true; + + if(reason == DR_OTHER && text != NULL) + { + Packet pack; + PacketCreate(&pack, SERVER_PLAYER_FORCE_DISCONNECT); + PacketWrite(&pack, packet_write8, reason); + PacketWrite(&pack, packet_writestr, __Str(text)); + packet_send(peer, &pack, true); + enet_peer_disconnect_later(peer, reason); + } + else + enet_peer_disconnect(peer, reason); + + if(!text) + { + Info("Disconnected id %d %d: No text.", data->id, reason); + } + else + { + Info("Disconnected id %d %d: %s.", data->id, reason, text); + } + + data->disconnecting = true; + } + else + return false; + + return true; +} + +bool server_disconnect_id(Server *server, uint16_t id, DisconnectReason reason, const char *text) +{ + if (server) + { + bool found = false; + for (size_t i = 0; i < server->peers.capacity; i++) + { + PeerData *data = server->peers.ptr[i]; + if (!data) + continue; + + if (data->id == id) + return server_disconnect(server, data->peer, reason, text); + } + } + else + return false; + + return true; +} + +int server_total(Server *server) +{ + int count = 0; + for (size_t i = 0; i < server->peers.capacity; i++) + { + PeerData *peer = (PeerData *)server->peers.ptr[i]; + if (!peer) + continue; + + count++; + } + + return count; +} + +int server_ingame(Server *server) +{ + int count = 0; + for (size_t i = 0; i < server->peers.capacity; i++) + { + PeerData *peer = (PeerData *)server->peers.ptr[i]; + if (!peer) + continue; + + if (peer->in_game) + count++; + } + + return count; +} + +PeerData *server_find_peer(Server *server, uint16_t id) +{ + for (size_t i = 0; i < server->peers.capacity; i++) + { + PeerData *v = (PeerData *)server->peers.ptr[i]; + if (!v) + continue; + + if (v->id == id) + return v; + } + + return NULL; +} + +bool server_broadcast(Server *server, Packet *packet, bool reliable) +{ + for (size_t i = 0; i < server->peers.capacity; i++) + { + PeerData *v = (PeerData *)server->peers.ptr[i]; + if (!v) + continue; + + if (!packet_send(v->peer, packet, reliable)) + server_disconnect(server, v->peer, DR_SERVERTIMEOUT, NULL); + } + + return true; +} + +bool server_broadcast_ex(Server *server, Packet *packet, bool reliable, uint16_t ignore) +{ + for (size_t i = 0; i < server->peers.capacity; i++) + { + PeerData *v = (PeerData *)server->peers.ptr[i]; + if (!v) + continue; + + if (v->id == ignore) + continue; + + if (!packet_send(v->peer, packet, reliable)) + server_disconnect(server, v->peer, DR_SERVERTIMEOUT, NULL); + } + + return true; +} + +bool server_state_joined(PeerData *v) +{ +#ifdef SYS_USE_SDL2 + ui_update_playerlist(v->server); +#endif + + Packet pack; + PacketCreate(&pack, SERVER_LOBBY_EXE_CHANCE); + PacketWrite(&pack, packet_write8, v->exe_chance); + RAssert(packet_send(v->peer, &pack, true)); + + PacketCreate(&pack, SERVER_PLAYER_JOINED); + PacketWrite(&pack, packet_write16, v->id); + PacketWrite(&pack, packet_writestr, v->nickname); + PacketWrite(&pack, packet_write8, v->lobby_icon); + PacketWrite(&pack, packet_write8, v->pet); + server_broadcast_ex(v->server, &pack, true, v->id); + + switch (v->server->state) + { + case ST_LOBBY: + case ST_CHARSELECT: + case ST_MAPVOTE: + return lobby_state_join(v); + + case ST_GAME: + return game_state_join(v); + + case ST_RESULTS: + break; + } + + return true; +} + +bool server_state_handle(PeerData *v, Packet *packet) +{ + switch (v->server->state) + { + case ST_LOBBY: + case ST_CHARSELECT: + case ST_MAPVOTE: + return lobby_state_handle(v, packet); + + case ST_GAME: + return game_state_handletcp(v, packet); + + case ST_RESULTS: + return results_state_handle(v, packet); + } + + return true; +} + +bool server_state_left(PeerData *v) +{ +#ifdef SYS_USE_SDL2 + ui_update_playerlist(v->server); +#endif + + Packet pack; + PacketCreate(&pack, SERVER_PLAYER_LEFT); + PacketWrite(&pack, packet_write16, v->id); + server_broadcast(v->server, &pack, true); + + switch (v->server->state) + { + case ST_LOBBY: + case ST_CHARSELECT: + case ST_MAPVOTE: + return lobby_state_left(v); + + case ST_GAME: + return game_state_left(v); + + case ST_RESULTS: + break; + } + + return true; +} + +unsigned long server_cmd_parse(String *string) +{ + static const char *clr_list[] = CLRLIST; + + String current = {.len = 0}; + bool found_digit = false; + + for (int i = 0; i < string->len; i++) + { + if (!found_digit && isspace(string->value[i])) + continue; + else + found_digit = true; + + if (isspace(string->value[i])) + break; + + bool invalid = false; + for (int j = 0; j < CLRLIST_LEN; j++) + { + if (string->value[i] == clr_list[j][0]) + { + invalid = true; + break; + } + } + + if (invalid) + continue; + + current.value[current.len++] = string->value[i]; + } + current.value[current.len++] = '\0'; + + unsigned int hash = 0; + for (int i = 0; current.value[i] != '\0'; i++) + hash = 31 * hash + current.value[i]; + + return hash; +} + +bool server_cmd_handle(Server *server, unsigned long hash, PeerData *v, String *msg) +{ + Packet pack; + switch (hash) + { + default: + return false; + + case CMD_BAN: + { + if (!v->op) + { + RAssert(server_send_msg(v->server, v->peer, CLRCODE_RED "you aren't an operator.")); + break; + } + + int ingame = server_total(v->server); + if (ingame <= 1) + { + RAssert(server_send_msg(v->server, v->peer, CLRCODE_RED "dude are you gonna ban yourself?")); + break; + } + + PacketCreate(&pack, SERVER_LOBBY_CHOOSEBAN); + RAssert(packet_send(v->peer, &pack, true)); + break; + } + + case CMD_KICK: + { + if (!v->op) + { + RAssert(server_send_msg(v->server, v->peer, CLRCODE_RED "you aren't an operator.")); + break; + } + + if (server_total(v->server) <= 1) + { + RAssert(server_send_msg(v->server, v->peer, CLRCODE_RED "dude are you gonna kick yourself?")); + break; + } + + PacketCreate(&pack, SERVER_LOBBY_CHOOSEKICK); + RAssert(packet_send(v->peer, &pack, true)); + break; + } + + case CMD_OP: + { + if (!v->op) + { + RAssert(server_send_msg(v->server, v->peer, CLRCODE_RED "you aren't an operator.")); + break; + } + + if (server_total(v->server) <= 1) + { + RAssert(server_send_msg(v->server, v->peer, CLRCODE_RED "you're already an operator tho??")); + break; + } + + PacketCreate(&pack, SERVER_LOBBY_CHOOSEOP); + RAssert(packet_send(v->peer, &pack, true)); + break; + } + + case CMD_LOBBY: + { + int ind; + if (sscanf(msg->value, ".lobby %d", &ind) <= 0) + { + RAssert(server_send_msg(v->server, v->peer, CLRCODE_RED "example:~ .lobby 1")); + break; + } + + if (ind < 1 || ind > disaster_count()) + { + char msg[128]; + snprintf(msg, 128, CLRCODE_RED "lobby should be between 1 and %d", disaster_count()); + RAssert(server_send_msg(v->server, v->peer, msg)); + break; + } + + PacketCreate(&pack, SERVER_LOBBY_CHANGELOBBY); + PacketWrite(&pack, packet_write32, g_config.port + ind - 1); + RAssert(packet_send(v->peer, &pack, true)); + break; + } + + /* Help message */ + case CMD_HELP: + { + char lobby_msg[128]; + snprintf(lobby_msg, 128, CLRCODE_GRA ".lobby" CLRCODE_RST " choose lobby (1-%d)", disaster_count()); + + RAssert(server_send_msg(v->server, v->peer, CLRCODE_GRA ".info" CLRCODE_RST " server info")); + RAssert(server_send_msg(v->server, v->peer, lobby_msg)); + RAssert(server_send_msg(v->server, v->peer, CLRCODE_GRA ".vk" CLRCODE_RST " vote kick")); + RAssert(server_send_msg(v->server, v->peer, CLRCODE_GRA ".vp" CLRCODE_RST " vote practice mode")); + + if (v->op) + { + snprintf(lobby_msg, 128, CLRCODE_GRA CLRCODE_GRA ".map" CLRCODE_RST " choose map (1-%d)", MAP_COUNT + 1); + RAssert(server_send_msg(v->server, v->peer, lobby_msg)); + + RAssert(server_send_msg(v->server, v->peer, CLRCODE_GRA ".kick" CLRCODE_RST " kick someone ig")); + RAssert(server_send_msg(v->server, v->peer, CLRCODE_GRA ".ban" CLRCODE_RST " ban someone ig")); + RAssert(server_send_msg(v->server, v->peer, CLRCODE_GRA ".op" CLRCODE_RST " op someone ig")); + } + + break; + } + + /* Information about the lobby */ + case CMD_INFO: + { + char msg[100]; + snprintf(msg, 100, "server " CLRCODE_RED "%d" CLRCODE_RST " of " CLRCODE_BLU "%d" CLRCODE_RST, v->server->id + 1, g_config.server_count); + + server_send_msg(v->server, v->peer, "-----------------------"); + server_send_msg(v->server, v->peer, CLRCODE_RED "better" CLRCODE_BLU "server" CLRCODE_RST " v" STRINGIFY(BUILD_VERSION)); + server_send_msg(v->server, v->peer, "build from " CLRCODE_PUR __DATE__ " " CLRCODE_GRN __TIME__ CLRCODE_RST); + server_send_msg(v->server, v->peer, msg); + server_send_msg(v->server, v->peer, "-----------------------"); + server_send_msg(v->server, v->peer, CLRCODE_GRA "type .help for command list" CLRCODE_RST); + if(g_config.motd[0] != '\0') + server_send_msg(v->server, v->peer, g_config.motd); + break; + } + + /* Does he know? */ + case CMD_STINK: + { + char buff[36]; + if (sscanf(msg->value, ".stink %35s", buff) <= 0) + { + RAssert(server_send_msg(v->server, v->peer, CLRCODE_RED "example:~ .stink baller")); + break; + } + + char format[100]; + snprintf(format, 100, "\\%s~, you /sti@nk~", buff); + + RAssert(server_broadcast_msg(v->server, 0, format)); + break; + } + } + + return true; +} + +bool server_msg_handle(Server *server, PacketType type, PeerData *v, Packet *packet) +{ + switch (type) + { + default: + break; + + case CLIENT_LOBBY_CHOOSEBAN: + { + if (!v->op) + break; + + PacketRead(pid, packet, packet_read16, uint16_t); + + for (size_t i = 0; i < v->server->peers.capacity; i++) + { + PeerData *peer = (PeerData *)v->server->peers.ptr[i]; + if (!peer) + continue; + + if (peer->id == pid) + { + RAssert(ban_add(peer->nickname.value, peer->udid.value, peer->ip.value)); + server_disconnect(v->server, peer->peer, DR_BANNEDBYHOST, NULL); + break; + } + } + break; + } + + case CLIENT_LOBBY_CHOOSEKICK: + { + if (!v->op) + break; + + PacketRead(pid, packet, packet_read16, uint16_t); + + for (size_t i = 0; i < v->server->peers.capacity; i++) + { + PeerData *peer = (PeerData *)v->server->peers.ptr[i]; + if (!peer) + continue; + + if (peer->id == pid) + { + RAssert(timeout_set(peer->nickname.value, peer->udid.value, peer->ip.value, time(NULL) + 60)); + server_disconnect(v->server, peer->peer, DR_KICKEDBYHOST, NULL); + break; + } + } + break; + } + + case CLIENT_LOBBY_CHOOSEOP: + { + if (!v->op) + break; + + PacketRead(pid, packet, packet_read16, uint16_t); + + for (size_t i = 0; i < v->server->peers.capacity; i++) + { + PeerData *peer = (PeerData *)v->server->peers.ptr[i]; + if (!peer) + continue; + + if (peer->id == pid) + { + peer->op = true; + + RAssert(op_add(peer->nickname.value, peer->ip.value)); + server_send_msg(v->server, peer->peer, CLRCODE_GRN "you're an operator now"); + break; + } + } + break; + } + } + + return true; +} + +bool server_send_msg(Server *server, ENetPeer *peer, const char *message) +{ + Packet pack; + PacketCreate(&pack, CLIENT_CHAT_MESSAGE); + PacketWrite(&pack, packet_write16, 0); + PacketWrite(&pack, packet_writestr, string_lower(__Str(message))); + + RAssert(packet_send(peer, &pack, true)); + return true; +} + +bool server_broadcast_msg(Server* server, uint16_t sender, const char* message) +{ + Packet pack; + PacketCreate(&pack, CLIENT_CHAT_MESSAGE); + PacketWrite(&pack, packet_write16, sender); + PacketWrite(&pack, packet_writestr, string_lower(__Str(message))); + + server_broadcast(server, &pack, true); + return true; +} \ No newline at end of file diff --git a/disasterserver_c/Server.h b/disasterserver_c/Server.h new file mode 100644 index 0000000..a2a64d5 --- /dev/null +++ b/disasterserver_c/Server.h @@ -0,0 +1,216 @@ +#ifndef SERVER_H +#define SERVER_H + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define TICKSPERSEC 60 +#define BUILD_VERSION 1101 + +#define STR_HELPER(x) #x +#define STRINGIFY(x) STR_HELPER(x) + +struct Server; +struct auth_peer_data; +typedef struct PeerData +{ + uint16_t id; + String ip; + ENetPeer *peer; + + /* General info */ + Player plr; + String nickname; + String udid; + uint8_t lobby_icon; + int8_t pet; + + bool verified; + bool in_game; + bool op; + bool ready; + bool mod_tool; + bool is_mobile; + bool can_vote; + bool voted; + bool disconnecting; + + auth_peer_data auth; + + /* Character */ + enum + { + CH_NONE = -1, + + CH_TAILS, + CH_KNUX, + CH_EGGMAN, + CH_AMY, + CH_CREAM, + CH_SALLY + } surv_char; + + enum + { + EX_NONE = -1, + + EX_ORIGINAL, + EX_CHAOS, + EX_EXETIOR, + EX_EXELLER + } exe_char; + + bool should_timeout; + + /* State info */ + uint8_t exe_chance; + double timeout; + double vote_cooldown; + + struct Server *server; +} PeerData; + +typedef struct +{ + /* Lobby */ + double countdown; + double prac_countdown; + uint8_t countdown_sec; + Vote vote; + PeerData kick_target; + + /* Map Vote */ + uint8_t maps[3]; + uint8_t votes[3]; + + /* Character Select */ + int8_t map; + uint16_t exe; + bool avail[CH_SALLY + 1]; +} Lobby; + +typedef enum +{ + BS_NONE, + BS_DEACTIVATED, + BS_ACTIVATED, +} BigRingState; + +typedef enum +{ + ED_EXEWIN, + ED_SURVWIN, + ED_TIMEOVER +} Ending; + +typedef struct +{ + int exe; + int8_t map; + bool started; + bool sudden_death; + + double start_timeout; + double time; + double elapsed; + uint16_t time_sec; + double end; + Ending ending; + + BigRingState bring_state; + uint8_t bring_loc; + + /* Entities */ + uint16_t entid; + DyList entities; + + /* Rings */ + bool rings[256]; + uint8_t ring_coff; + + /* Lists */ + DyList left; + +#define PLAYER_COOLCOUNT 6 + double cooldowns[PLAYER_COOLCOUNT]; + TimeStamp tails_last_proj; +} Game; + +// List of cooldown indicies +#define TAILS_RECHARGE 0 +#define CREAM_RING_SPAWN 1 +#define EXETIOR_BRING_SPAWN 2 +#define EXELLER_CLONE_SPAWN 3 +#define EGGTRACK_RECHARGE 4 +#define ETAILS_RECHARGE 5 + +typedef struct Results +{ + double countdown; +} Results; + +typedef struct Server +{ + uint16_t id; + bool running; + + enum + { + ST_LOBBY, + ST_MAPVOTE, + ST_CHARSELECT, + ST_GAME, + ST_RESULTS + } state; + Mutex state_lock; + + /* States */ + Lobby lobby; + Game game; + Results results; + + int8_t last_map; + int16_t map_pickrates[30]; + + double delta; + DyList peers; + ENetHost *host; +} Server; + +bool server_state_joined (PeerData* v); +bool server_state_left (PeerData* v); +bool server_state_handle (PeerData* v, Packet* packet); +bool server_msg_handle (Server* server, PacketType type, PeerData* v, Packet* packet); +bool server_cmd_handle (Server* server, unsigned long hash, PeerData* v, String* msg); +unsigned long server_cmd_parse (String* string); + +bool server_worker (Server* server); +bool server_broadcast (Server* server, Packet* packet, bool reliable); +bool server_broadcast_ex (Server* server, Packet* packet, bool reliable, uint16_t ignore); +bool server_send_msg (Server* server, ENetPeer* peer, const char* message); +bool server_broadcast_msg(Server* server, uint16_t sender, const char* message); + +int server_total (Server* server); +int server_ingame (Server* server); +PeerData* server_find_peer (Server* server, uint16_t id); +bool server_disconnect (Server* server, ENetPeer* peer, DisconnectReason reason, const char* text); +bool server_disconnect_id(Server* server, uint16_t id, DisconnectReason reason, const char* text); + +int server_total(Server *server); +int server_ingame(Server *server); +PeerData *server_find_peer(Server *server, uint16_t id); +bool server_disconnect(Server *server, ENetPeer *peer, DisconnectReason reason, const char *text); +bool server_disconnect_id(Server *server, uint16_t id, DisconnectReason reason, const char *text); + +#endif diff --git a/disasterserver_c/States.h b/disasterserver_c/States.h new file mode 100644 index 0000000..5e5e5a3 --- /dev/null +++ b/disasterserver_c/States.h @@ -0,0 +1,75 @@ +#ifndef LOBBY_H +#define LOBBY_H +#include +#include +#include +#include + +#define AssertOrDisconnect(server, x) if(!(x)) { server_disconnect(server, v->peer, DR_OTHER, "AssertOrDisconnect(" #x ") failed!"); return false; } +#define ENTITY_BODY \ +char tag[16];\ +uint16_t id;\ +Vector2 pos;\ +bool (*init)(Server*, struct Entity*);\ +bool (*tick)(Server*, struct Entity*);\ +bool (*uninit)(Server*, struct Entity*); + +struct Entity; +typedef struct Entity +{ + ENTITY_BODY +} Entity; +#define MakeEntity(tag, x, y) tag, 0, (Vector2){ x, y }, + +#define CMD_HELP 45680751 +#define CMD_MAP 1478254 +#define CMD_STINK 1426706039 +#define CMD_VK 47971 +#define CMD_VP 47976 +#define CMD_BAN 1467681 +#define CMD_KICK 45773684 +#define CMD_OP 47759 +#define CMD_YES 1489913 +#define CMD_Y 1547 +#define CMD_NO 47727 +#define CMD_N 1536 +#define CMD_INFO 45719004 +#define CMD_LOBBY 1420085352 + +bool lobby_init (Server* server); +bool lobby_state_join (PeerData* v); +bool lobby_state_left (PeerData* v); +bool lobby_state_handle (PeerData* v, Packet* packet); +bool lobby_state_tick (Server* server); + + +bool mapvote_init (Server* server); +bool mapvote_state_join (PeerData * v); +bool mapvote_state_left (PeerData * v); +bool mapvote_state_handle (PeerData* v, Packet* packet); +bool mapvote_state_tick (Server* server); + +bool charselect_init (int8_t map, Server* server); +bool charselect_state_join (PeerData* v); +bool charselect_state_left (PeerData* v); +bool charselect_state_handle (PeerData* v, Packet * packet); +bool charselect_state_tick (Server* server); + +bool game_end (Server* server, Ending ending, bool achiv); +bool game_init (int exe, int8_t map, Server* server); +bool game_uninit (Server* server, bool show_results); +bool game_spawn (Server* server, Entity* entity, size_t size, Entity** out); +bool game_despawn (Server* server, Entity** out, uint16_t id); +int game_find (Server* server, Entity** out, char* tag, size_t count); + +bool game_bigring (Server* server, BigRingState state); +bool game_state_join (PeerData* v); +bool game_state_left (PeerData* v); +bool game_state_handletcp (PeerData* v, Packet* packet); +bool game_state_tick (Server* server); + +bool results_init (Server* server); +bool results_state_tick (Server* server); +bool results_state_handle (PeerData* v, Packet* packet); + +#endif diff --git a/disasterserver_c/UTF8.c b/disasterserver_c/UTF8.c new file mode 100644 index 0000000..15dd9e7 --- /dev/null +++ b/disasterserver_c/UTF8.c @@ -0,0 +1,76 @@ +#include + +utf8_char utf8_tolower(utf8_char c) +{ + if(c >= 0x0410 && c <= 0x042F) + return c + 0x20; + else if(c <= 0x7F) + return tolower((int)c); + else + return c; +} + +utf8_char utf8_get(const char* str, int index) +{ + utf8_char result = 0; + int byte_index = 0; + int char_index = 0; + + while (str[byte_index] != '\0' && char_index <= index) { + const uint8_t c = str[byte_index]; + if (c <= 0x7F) + { + if (char_index == index) + result = c; + + byte_index += 1; + } + else if (c >= 0xC0 && c <= 0xDF) + { + if (char_index == index) + result = ((str[byte_index] & 0x1F) << 6) | (str[byte_index + 1] & 0x3F); + + byte_index += 2; + } + else if (c >= 0xE0 && c <= 0xEF) + { + if (char_index == index) + result = ((str[byte_index] & 0x0F) << 12) | ((str[byte_index + 1] & 0x3F) << 6) | (str[byte_index + 2] & 0x3F); + + byte_index += 3; + } + else if (c >= 0xF0 && c <= 0xF7) + { + if (char_index == index) + result = ((str[byte_index] & 0x07) << 18) | ((str[byte_index + 1] & 0x3F) << 12) | ((str[byte_index + 2] & 0x3F) << 6) | (str[byte_index + 3] & 0x3F); + + byte_index += 4; + } + + char_index++; + } + + return result; +} + +size_t utf8_strlen(const char* str) +{ + size_t len = 0; + while (*str != '\0') + { + const uint8_t c = (uint8_t)*str; + + if (c < 128) + str += 1; + else if (c < 224) + str += 2; + else if (c < 240) + str += 3; + else + str += 4; + + len++; + } + + return len; +} \ No newline at end of file diff --git a/disasterserver_c/UTF8.h b/disasterserver_c/UTF8.h new file mode 100644 index 0000000..87831a6 --- /dev/null +++ b/disasterserver_c/UTF8.h @@ -0,0 +1,12 @@ +#ifndef UTF8_H +#define UTF8_H +#include +#include +#include +typedef int utf8_char; + +utf8_char utf8_tolower(utf8_char c); +utf8_char utf8_get(const char* str, int index); +size_t utf8_strlen(const char* str); + +#endif \ No newline at end of file diff --git a/disasterserver_c/Vote.c b/disasterserver_c/Vote.c new file mode 100644 index 0000000..0fff53f --- /dev/null +++ b/disasterserver_c/Vote.c @@ -0,0 +1,58 @@ +#include +#include + +bool vote_init(Server* server, Vote* vote, VoteType type, uint16_t id) +{ + vote->votecnt = 0; + vote->votetotal = 0; + vote->type = type; + + for (size_t i = 0; i < server->peers.capacity; i++) + { + PeerData* peer = (PeerData*)server->peers.ptr[i]; + if (!peer) + continue; + + peer->can_vote = (peer->id != id); + + if(peer->can_vote) + vote->votetotal++; + } + + if (vote->votetotal <= 1) + return false; + + vote->ongoing = true; + vote->countdown = 20 * TICKSPERSEC; + memset(vote->votes, 0, 6 * sizeof(uint8_t)); + return true; +} + +VoteState vote_add(Vote* vote, uint16_t id) +{ + for (int i = 0; i < vote->votecnt; i++) + { + if (vote->votes[i] == id) + return VOTE_ALREADYVOTED; + } + + vote->votes[vote->votecnt++] = id; + if (vote->votecnt >= vote->votetotal) + return VOTE_FULL; + + return VOTE_SUCCESS; +} + +bool vote_tick(Server* server, Vote* vote) +{ + vote->countdown -= server->delta; + if (vote->countdown <= 0) + return false; + + return true; +} + +bool vote_check(Vote* vote) +{ + return vote->votecnt * 2 > (vote->votetotal / 2.0); +} diff --git a/disasterserver_c/Vote.h b/disasterserver_c/Vote.h new file mode 100644 index 0000000..8930b30 --- /dev/null +++ b/disasterserver_c/Vote.h @@ -0,0 +1,35 @@ +#ifndef VOTE_H +#define VOTE_H +#include +#include + +typedef enum +{ + VOTE_KICK, + VOTE_PRACTICE +} VoteType; + +typedef enum +{ + VOTE_SUCCESS = 1, + VOTE_ALREADYVOTED = 0, + VOTE_FULL = -1 +} VoteState; + +typedef struct +{ + VoteType type; + bool ongoing; + uint16_t votes[7]; + uint8_t votecnt; + uint8_t votetotal; + double countdown; +} Vote; + +struct Server; +bool vote_init(struct Server* server, Vote* vote, VoteType type, uint16_t id); +VoteState vote_add(Vote* vote, uint16_t id); +bool vote_tick(struct Server* server, Vote* vote); +bool vote_check( Vote* vote); + +#endif \ No newline at end of file diff --git a/disasterserver_c/Zone.c b/disasterserver_c/Zone.c new file mode 100644 index 0000000..9689564 --- /dev/null +++ b/disasterserver_c/Zone.c @@ -0,0 +1,1392 @@ +#ifndef ZONES_H +#define ZONES_H + +#include +#define ARRAY_SIZE(x) (sizeof(x) / sizeof(Zone)) +#define BLOCK_SIZE (128) +Zone room_act9[] = +{ + { 384, 768, BLOCK_SIZE * 1.953125, BLOCK_SIZE * 1 }, + { 0, 832, BLOCK_SIZE * 3, BLOCK_SIZE * 0.5 }, + { 0, 512, BLOCK_SIZE * 1, BLOCK_SIZE * 1 }, + { 256, 512, BLOCK_SIZE * 7, BLOCK_SIZE * 1 }, + { 0, 896, BLOCK_SIZE * 8, BLOCK_SIZE * 2.75 }, + { 1024, 960, BLOCK_SIZE * 3.125, BLOCK_SIZE * 2.25 }, + { 2112, 896, BLOCK_SIZE * 7.5, BLOCK_SIZE * 2.75 }, + { 2176, 576, BLOCK_SIZE * 2, BLOCK_SIZE * 1 }, + { 1920, 512, BLOCK_SIZE * 1, BLOCK_SIZE * 1 }, + { 1792, 448, BLOCK_SIZE * 1, BLOCK_SIZE * 2 }, + { 1663, 384, BLOCK_SIZE * 1.0078125, BLOCK_SIZE * 1 }, + { 1408, 512, BLOCK_SIZE * 3, BLOCK_SIZE * 1.5 }, + { 2624, 256, BLOCK_SIZE * 2.5, BLOCK_SIZE * 1 }, + { 2176, 320, BLOCK_SIZE * 3.5, BLOCK_SIZE * 1 }, + { 2688, 576, BLOCK_SIZE * 3, BLOCK_SIZE * 2.5 }, + { 2567, 768, BLOCK_SIZE * 0.9453125, BLOCK_SIZE * 1 }, + { 256, 0, BLOCK_SIZE * 1, BLOCK_SIZE * 2 }, + { 384, 0, BLOCK_SIZE * 2, BLOCK_SIZE * 3 }, + { 640, 0, BLOCK_SIZE * 2, BLOCK_SIZE * 2.5 }, + { 896, 0, BLOCK_SIZE * 4, BLOCK_SIZE * 2 }, + { 832, 448, BLOCK_SIZE * 1.5, BLOCK_SIZE * 0.5 }, + { 1152, 736, BLOCK_SIZE * 1.5, BLOCK_SIZE * 0.5 }, + { 1728, 896, BLOCK_SIZE * 1, BLOCK_SIZE * 0.5 }, + { 1792, 832, BLOCK_SIZE * 1, BLOCK_SIZE * 0.5 }, + { 2112, 832, BLOCK_SIZE * 1.5, BLOCK_SIZE * 0.5 }, + { 1920, 992, BLOCK_SIZE * 1.5, BLOCK_SIZE * 2 }, + { 2624, 384, BLOCK_SIZE * 0.5, BLOCK_SIZE * 0.5 }, + { 2688, 192, BLOCK_SIZE * 1, BLOCK_SIZE * 0.5 }, + { 2304, 256, BLOCK_SIZE * 1, BLOCK_SIZE * 0.5 }, + { 1248, 896, BLOCK_SIZE * 1, BLOCK_SIZE * 0.5 }, + { 1600, 960, BLOCK_SIZE * 2, BLOCK_SIZE * 1 }, + { 1504, 1184, BLOCK_SIZE * 3.25, BLOCK_SIZE * 0.5 }, + { 1424, 960, BLOCK_SIZE * 0.625, BLOCK_SIZE * 2.25 }, +}; + +Zone room_angelisland[] = +{ + { 0, 336, BLOCK_SIZE * 2.0625, BLOCK_SIZE * 0.8125 }, + { 264, 272, BLOCK_SIZE * 0.9375, BLOCK_SIZE * 1.3125 }, + { 512, 336, BLOCK_SIZE * 1, BLOCK_SIZE * 2.5000002 }, + { 640, 304, BLOCK_SIZE * 1.0625, BLOCK_SIZE * 3.25 }, + { 448, 432, BLOCK_SIZE * 0.5, BLOCK_SIZE * 1.4375 }, + { 384, 496, BLOCK_SIZE * 0.5, BLOCK_SIZE * 0.8125 }, + { 776, 304, BLOCK_SIZE * 0.875, BLOCK_SIZE * 2.75 }, + { 1024, 336, BLOCK_SIZE * 1, BLOCK_SIZE * 3 }, + { 1296, 304, BLOCK_SIZE * 2.8750002, BLOCK_SIZE * 2.125 }, + { 1664, 304, BLOCK_SIZE * 1, BLOCK_SIZE * 1.8125 }, + { 1792, 304, BLOCK_SIZE * 1, BLOCK_SIZE * 1.125 }, + { 1920, 392, BLOCK_SIZE * 1, BLOCK_SIZE * 1 }, + { 2048, 392, BLOCK_SIZE * 5.25, BLOCK_SIZE * 1.4375 }, + { 2168, 336, BLOCK_SIZE * 4.5625, BLOCK_SIZE * 0.4375 }, + { 2432, 304, BLOCK_SIZE * 2.5, BLOCK_SIZE * 0.25 }, + { 2944, 464, BLOCK_SIZE * 1, BLOCK_SIZE * 8.375 }, + { 2720, 392, BLOCK_SIZE * 0.25, BLOCK_SIZE * 1.25 }, + { 0, 832, BLOCK_SIZE * 0.5, BLOCK_SIZE * 5.5 }, + { 0, 440, BLOCK_SIZE * 1.5, BLOCK_SIZE * 3.0625 }, + { 192, 656, BLOCK_SIZE * 0.5, BLOCK_SIZE * 1.375 }, + { 256, 720, BLOCK_SIZE * 0.625, BLOCK_SIZE * 0.875 }, + { 336, 720, BLOCK_SIZE * 0.375, BLOCK_SIZE * 0.8125 }, + { 576, 784, BLOCK_SIZE * 1.4375, BLOCK_SIZE * 3.125 }, + { 512, 848, BLOCK_SIZE * 0.5, BLOCK_SIZE * 1.75 }, + { 1136, 976, BLOCK_SIZE * 4.625, BLOCK_SIZE * 1.5 }, + { 448, 1264, BLOCK_SIZE * 1.5, BLOCK_SIZE * 0.5 }, + { 272, 1296, BLOCK_SIZE * 0.375, BLOCK_SIZE * 1.875 }, + { 576, 1328, BLOCK_SIZE * 1.5, BLOCK_SIZE * 1.625 }, + { 640, 1264, BLOCK_SIZE * 0.5, BLOCK_SIZE * 0.5 }, + { 704, 1296, BLOCK_SIZE * 0.5, BLOCK_SIZE * 0.25 }, + { 768, 1360, BLOCK_SIZE * 2, BLOCK_SIZE * 1.375 }, + { 1024, 1424, BLOCK_SIZE * 0.5, BLOCK_SIZE * 0.875 }, + { 1216, 1360, BLOCK_SIZE * 0.5, BLOCK_SIZE * 1.375 }, + { 1280, 1328, BLOCK_SIZE * 1.6875, BLOCK_SIZE * 1.6249999 }, + { 1496, 1360, BLOCK_SIZE * 5.8125, BLOCK_SIZE * 1.3749999 }, + { 2624, 1392, BLOCK_SIZE * 0.5, BLOCK_SIZE * 1.1249999 }, + { 2688, 1360, BLOCK_SIZE * 0.5, BLOCK_SIZE * 0.6249999 }, + { 2752, 1328, BLOCK_SIZE * 0.5, BLOCK_SIZE * 0.7499999 }, + { 2816, 1296, BLOCK_SIZE * 1, BLOCK_SIZE * 0.8749999 }, + { 1472, 784, BLOCK_SIZE * 2, BLOCK_SIZE * 0.625 }, + { 2048, 720, BLOCK_SIZE * 2, BLOCK_SIZE * 0.4375 }, + { 2176, 776, BLOCK_SIZE * 1, BLOCK_SIZE * 3.1250002 }, + { 2304, 1040, BLOCK_SIZE * 3, BLOCK_SIZE * 1.3125002 }, + { 2880, 560, BLOCK_SIZE * 0.5, BLOCK_SIZE * 2.9375002 }, + { 2816, 624, BLOCK_SIZE * 0.5, BLOCK_SIZE * 1.4375002 }, + { 2560, 720, BLOCK_SIZE * 2, BLOCK_SIZE * 0.50000024 }, + { 1920, 272, BLOCK_SIZE * 0.9375, BLOCK_SIZE * 0.9375 }, + { 64, 1360, BLOCK_SIZE * 1.625, BLOCK_SIZE * 1.375 }, + { 760, 992, BLOCK_SIZE * 2.9375, BLOCK_SIZE * 1.5625 }, + { 888, 424, BLOCK_SIZE * 1.0625, BLOCK_SIZE * 1.6875 }, + { 1152, 427.82892, BLOCK_SIZE * 1.125, BLOCK_SIZE * 2.2904212 }, + { 1296, 576, BLOCK_SIZE * 0.375, BLOCK_SIZE * 0.875 }, + { 768, 1192, BLOCK_SIZE * 1.9999999, BLOCK_SIZE * 0.25 }, + { 1136, 1168, BLOCK_SIZE * 1.7499999, BLOCK_SIZE * 0.1875 }, + { 1152, 1192, BLOCK_SIZE * 1.5624999, BLOCK_SIZE * 0.1875 }, + { 1152, 1216, BLOCK_SIZE * 0.49999985, BLOCK_SIZE * 0.375 }, + { 1088, 1192, BLOCK_SIZE * 0.49999985, BLOCK_SIZE * 0.1875 }, + { 1024, 1192, BLOCK_SIZE * 0.49999985, BLOCK_SIZE * 0.0625 }, + { 1216, 1216, BLOCK_SIZE * 0.24999985, BLOCK_SIZE * 0.125 }, + { 832, 1224, BLOCK_SIZE * 0.99999994, BLOCK_SIZE * 0.3125 }, + { 768, 1224, BLOCK_SIZE * 0.49999994, BLOCK_SIZE * 0.0625 }, + { 800, 1232, BLOCK_SIZE * 0.24999994, BLOCK_SIZE * 0.125 }, + { 832, 1264, BLOCK_SIZE * 0.49999994, BLOCK_SIZE * 0.125 }, + { 960, 1224, BLOCK_SIZE * 0.24999994, BLOCK_SIZE * 0.0625 }, + { 576, 1184, BLOCK_SIZE * 1.4999999, BLOCK_SIZE * 0.125 }, + { 576, 1200, BLOCK_SIZE * 0.9999999, BLOCK_SIZE * 0.0625 }, + { 3072, 0, BLOCK_SIZE * 0.1875, BLOCK_SIZE * 3.625 }, + { -24, 0, BLOCK_SIZE * 0.1875, BLOCK_SIZE * 3.625 }, + { 1496, 1168, BLOCK_SIZE * 1.8124998, BLOCK_SIZE * 0.25 }, + { 1512, 1200, BLOCK_SIZE * 1.5624998, BLOCK_SIZE * 0.125 }, + { 1536, 1216, BLOCK_SIZE * 1.1249998, BLOCK_SIZE * 0.125 }, + { 1419, 1168, BLOCK_SIZE * 0.6015622, BLOCK_SIZE * 0.125 }, + { 2304, 1208, BLOCK_SIZE * 2.6249998, BLOCK_SIZE * 0.1875 }, + { 2256, 1176, BLOCK_SIZE * 0.37499976, BLOCK_SIZE * 0.1875 }, + { 2560, 784, BLOCK_SIZE * 2, BLOCK_SIZE * 0.12500024 }, + { 2048, 776, BLOCK_SIZE * 1, BLOCK_SIZE * 0.12500024 }, + { 1496, 864, BLOCK_SIZE * 1.625, BLOCK_SIZE * 0.12500024 }, + { 760, 896, BLOCK_SIZE * 1.6875, BLOCK_SIZE * 0.75 }, + { 760, 840, BLOCK_SIZE * 0.875, BLOCK_SIZE * 0.4375 }, + { 976, 944, BLOCK_SIZE * 0.75, BLOCK_SIZE * 0.375 }, + { 200, 304, BLOCK_SIZE * 0.5, BLOCK_SIZE * 0.25 }, + { 888, 336, BLOCK_SIZE * 1.0625, BLOCK_SIZE * 0.6875 }, + { 1152, 336, BLOCK_SIZE * 1.125, BLOCK_SIZE * 0.7109375 }, + { 2744, 697, BLOCK_SIZE * 0.5625, BLOCK_SIZE * 0.17968774 }, +}; + +Zone room_dartower[] = +{ + { 0, 0, BLOCK_SIZE * 5.625, BLOCK_SIZE * 2.8125 }, + { 0, 360, BLOCK_SIZE * 1.25, BLOCK_SIZE * 5 }, + { 160, 560, BLOCK_SIZE * 3.1250002, BLOCK_SIZE * 1.25 }, + { 720, 560, BLOCK_SIZE * 3.7500002, BLOCK_SIZE * 3.4375 }, + { 560, 800, BLOCK_SIZE * 1.2500002, BLOCK_SIZE * 1.25 }, + { 320.00003, 880, BLOCK_SIZE * 1.8750001, BLOCK_SIZE * 0.625 }, + { 640, 960, BLOCK_SIZE * 0.6250001, BLOCK_SIZE * 0.3125 }, + { 320, 1040, BLOCK_SIZE * 0.6250001, BLOCK_SIZE * 5.3125 }, + { 160, 1120, BLOCK_SIZE * 1.2500001, BLOCK_SIZE * 4.6875 }, + { 400.00003, 1200, BLOCK_SIZE * 5, BLOCK_SIZE * 4.0625 }, + { 480, 1120, BLOCK_SIZE * 0.6250001, BLOCK_SIZE * 0.625 }, + { 1200, 800, BLOCK_SIZE * 1.2500001, BLOCK_SIZE * 4.6875 }, + { 1322, 432, BLOCK_SIZE * 2.796875, BLOCK_SIZE * 2.875 }, + { 1680, 560, BLOCK_SIZE * 5.625, BLOCK_SIZE * 1.8750001 }, + { 2240, 480, BLOCK_SIZE * 8.75, BLOCK_SIZE * 1.8750001 }, + { 2608, 352, BLOCK_SIZE * 3.375, BLOCK_SIZE * 1.0000001 }, + { 2880, 320, BLOCK_SIZE * 1.25, BLOCK_SIZE * 0.25000012 }, + { 1040, 1520, BLOCK_SIZE * 3.75, BLOCK_SIZE * 1.5625 }, + { 0, 1840, BLOCK_SIZE * 5, BLOCK_SIZE * 1.25 }, + { 800, 1840, BLOCK_SIZE * 2.5000002, BLOCK_SIZE * 1.25 }, + { 640, 1920, BLOCK_SIZE * 1.2500002, BLOCK_SIZE * 0.625 }, + { 1120, 1920, BLOCK_SIZE * 1.2500002, BLOCK_SIZE * 0.625 }, + { 1280, 1840, BLOCK_SIZE * 5, BLOCK_SIZE * 1.2500001 }, + { 1760, 1760, BLOCK_SIZE * 1.25, BLOCK_SIZE * 0.6328125 }, + { 2080, 1680, BLOCK_SIZE * 2.5, BLOCK_SIZE * 2.5 }, + { 2400, 1600, BLOCK_SIZE * 2.4921875, BLOCK_SIZE * 3.125 }, + { 2719, 1840, BLOCK_SIZE * 6.2578125, BLOCK_SIZE * 1.25 }, + { 3680, 1840, BLOCK_SIZE * 6.25, BLOCK_SIZE * 1.25 }, + { 3920, 1760, BLOCK_SIZE * 4.375, BLOCK_SIZE * 0.625 }, + { 4161, 1680, BLOCK_SIZE * 1.8671875, BLOCK_SIZE * 0.625 }, + { 4400, 1360, BLOCK_SIZE * 0.625, BLOCK_SIZE * 3.125 }, + { 4000, 1280, BLOCK_SIZE * 3.75, BLOCK_SIZE * 0.625 }, + { 4160, 1200, BLOCK_SIZE * 2.5, BLOCK_SIZE * 0.625 }, + { 4320, 720, BLOCK_SIZE * 1.25, BLOCK_SIZE * 3.75 }, + { 4080, 560, BLOCK_SIZE * 3.125, BLOCK_SIZE * 1.25 }, + { 3040, 1200, BLOCK_SIZE * 1.8671875, BLOCK_SIZE * 0.625 }, + { 3600, 1360, BLOCK_SIZE * 1.875, BLOCK_SIZE * 0.625 }, + { 3200, 1440, BLOCK_SIZE * 6.2500005, BLOCK_SIZE * 0.625 }, + { 2960, 1360, BLOCK_SIZE * 5, BLOCK_SIZE * 0.625 }, + { 1520, 1072, BLOCK_SIZE * 11.875, BLOCK_SIZE * 2.5625 }, + { 1520, 992, BLOCK_SIZE * 1.8750002, BLOCK_SIZE * 0.62500006 }, + { 2400, 960, BLOCK_SIZE * 1.8750002, BLOCK_SIZE * 0.87500006 }, + { 2880, 960, BLOCK_SIZE * 1.2500002, BLOCK_SIZE * 0.87500006 }, + { 2640, 1040, BLOCK_SIZE * 1.8750002, BLOCK_SIZE * 0.25000006 }, + { 3360, 368, BLOCK_SIZE * 1.9375002, BLOCK_SIZE * 4.625 }, + { 3600, 800, BLOCK_SIZE * 1.8750002, BLOCK_SIZE * 1.875 }, + { 3840, 880, BLOCK_SIZE * 2.5000002, BLOCK_SIZE * 1.25 }, + { 3608, 400, BLOCK_SIZE * 1.1875002, BLOCK_SIZE * 3.125 }, + { 3760, 400, BLOCK_SIZE * 0.6250003, BLOCK_SIZE * 1.25 }, + { 3840, 400, BLOCK_SIZE * 1.8750002, BLOCK_SIZE * 0.625 }, + { 4240, 480, BLOCK_SIZE * 1.8750002, BLOCK_SIZE * 0.625 }, + { 3040, 400, BLOCK_SIZE * 2.5000002, BLOCK_SIZE * 0.625 }, + { 3200, 240, BLOCK_SIZE * 1.2500004, BLOCK_SIZE * 1.25 }, + { 4400, 240, BLOCK_SIZE * 0.63281274, BLOCK_SIZE * 1.875 }, + { 3760, 0, BLOCK_SIZE * 5.6328125, BLOCK_SIZE * 1.875 }, + { 2632, 0, BLOCK_SIZE * 8.8203125, BLOCK_SIZE * 0.625 }, + { 2312, 0, BLOCK_SIZE * 2.5625002, BLOCK_SIZE * 1.25 }, + { 672, 0, BLOCK_SIZE * 12.875, BLOCK_SIZE * 1.875 }, + { -40, 992, BLOCK_SIZE * 0.3125, BLOCK_SIZE * 6.8125 }, + { 160, 960, BLOCK_SIZE * 0.125, BLOCK_SIZE * 0.3125 }, + { 3040, 1280, BLOCK_SIZE * 3.125, BLOCK_SIZE * 0.625 }, + { 2719, 1760, BLOCK_SIZE * 2.4375, BLOCK_SIZE * 0.625 }, + { 2719, 1680, BLOCK_SIZE * 1.2500001, BLOCK_SIZE * 0.625 }, +}; + +Zone room_deserttown[] = +{ + { 0, 0, BLOCK_SIZE * 3.5, BLOCK_SIZE * 5.5625 }, + { 384, 712, BLOCK_SIZE * 0.5, BLOCK_SIZE * 1.9375 }, + { 128, 912, BLOCK_SIZE * 2, BLOCK_SIZE * 0.375 }, + { 0, 1072, BLOCK_SIZE * 3.5, BLOCK_SIZE * 2.25 }, + { 544, 1072, BLOCK_SIZE * 3.25, BLOCK_SIZE * 2.25 }, + { 1056, 1232, BLOCK_SIZE * 7.25, BLOCK_SIZE * 1 }, + { 1056, 1024, BLOCK_SIZE * 2.75, BLOCK_SIZE * 0.75 }, + { 1568, 1024, BLOCK_SIZE * 3.25, BLOCK_SIZE * 0.75 }, + { 1344, 960, BLOCK_SIZE * 0.5, BLOCK_SIZE * 0.5 }, + { 1504, 896, BLOCK_SIZE * 1.25, BLOCK_SIZE * 0.375 }, + { 1760, 784, BLOCK_SIZE * 0.5, BLOCK_SIZE * 1.0078125 }, + { 1184, 720, BLOCK_SIZE * 0.25, BLOCK_SIZE * 1.5 }, + { 1216, 880, BLOCK_SIZE * 0.25, BLOCK_SIZE * 0.25 }, + { 1248, 880, BLOCK_SIZE * 0.25, BLOCK_SIZE * 0.25 }, + { 1184, 144, BLOCK_SIZE * 0.5, BLOCK_SIZE * 4.5 }, + { 1248, 144, BLOCK_SIZE * 4.5, BLOCK_SIZE * 0.5 }, + { 1760, 208, BLOCK_SIZE * 0.5, BLOCK_SIZE * 0.625 }, + { 1472, 208, BLOCK_SIZE * 0.5, BLOCK_SIZE * 0.5 }, + { 1248, 416, BLOCK_SIZE * 1, BLOCK_SIZE * 0.375 }, + { 1344, 736, BLOCK_SIZE * 5, BLOCK_SIZE * 0.375 }, + { 1344, 784, BLOCK_SIZE * 1, BLOCK_SIZE * 0.125 }, + { 1312, 800, BLOCK_SIZE * 1, BLOCK_SIZE * 0.125 }, + { 1312, 816, BLOCK_SIZE * 0.75, BLOCK_SIZE * 0.125 }, + { 1792, 416, BLOCK_SIZE * 0.25, BLOCK_SIZE * 2.5 }, + { 1472, 416, BLOCK_SIZE * 2.5, BLOCK_SIZE * 0.375 }, + { 1472, 608, BLOCK_SIZE * 1.25, BLOCK_SIZE * 0.25 }, + { 1472, 464, BLOCK_SIZE * 0.25, BLOCK_SIZE * 1.125 }, + { 2144, 1024, BLOCK_SIZE * 2.2500002, BLOCK_SIZE * 2.625 }, + { 2816, 1024, BLOCK_SIZE * 2.25, BLOCK_SIZE * 1.3750001 }, + { 3168, 1024, BLOCK_SIZE * 1, BLOCK_SIZE * 2.625 }, + { 2656, 1312, BLOCK_SIZE * 1.5, BLOCK_SIZE * 0.375 }, + { 2976, 1312, BLOCK_SIZE * 1.5, BLOCK_SIZE * 0.375 }, + { 2432, 1232, BLOCK_SIZE * 0.5, BLOCK_SIZE * 1 }, + { 2432, 1024, BLOCK_SIZE * 1.5, BLOCK_SIZE * 0.375 }, + { 2144, 800, BLOCK_SIZE * 2.5, BLOCK_SIZE * 0.375 }, + { 2368, 848, BLOCK_SIZE * 0.5, BLOCK_SIZE * 0.5 }, + { 2432, 848, BLOCK_SIZE * 0.75, BLOCK_SIZE * 0.5 }, + { 2528, 864, BLOCK_SIZE * 0.25, BLOCK_SIZE * 0.375 }, + { 2560, 880, BLOCK_SIZE * 0.25, BLOCK_SIZE * 0.25 }, + { 2592, 896, BLOCK_SIZE * 0.25, BLOCK_SIZE * 0.125 }, + { 2624, 896, BLOCK_SIZE * 0.25, BLOCK_SIZE * 0.125 }, + { 2816, 448, BLOCK_SIZE * 0.5, BLOCK_SIZE * 4.5 }, + { 2624, 448, BLOCK_SIZE * 1.5, BLOCK_SIZE * 0.375 }, + { 2432, 512, BLOCK_SIZE * 0.75, BLOCK_SIZE * 1 }, + { 2528, 592, BLOCK_SIZE * 1.25, BLOCK_SIZE * 0.375 }, + { 2368, 256, BLOCK_SIZE * 0.5, BLOCK_SIZE * 3 }, + { 2432, 256, BLOCK_SIZE * 3.5, BLOCK_SIZE * 0.5 }, + { 2784, 672, BLOCK_SIZE * 0.25, BLOCK_SIZE * 0.875 }, + { 2752, 704, BLOCK_SIZE * 0.25, BLOCK_SIZE * 0.625 }, + { 2720, 720, BLOCK_SIZE * 0.25, BLOCK_SIZE * 0.5 }, + { 2688, 736, BLOCK_SIZE * 0.25, BLOCK_SIZE * 0.375 }, + { 2656, 752, BLOCK_SIZE * 0.25, BLOCK_SIZE * 0.25 }, + { 2592, 768, BLOCK_SIZE * 0.5, BLOCK_SIZE * 0.125 }, + { 2720, 944, BLOCK_SIZE * 0.75, BLOCK_SIZE * 0.25 }, + { 2624, 1056, BLOCK_SIZE * 0.25, BLOCK_SIZE * 0.125 }, + { 2656, 1056, BLOCK_SIZE * 0.25, BLOCK_SIZE * 0.125 }, + { 3040, 688, BLOCK_SIZE * 2, BLOCK_SIZE * 0.375 }, + { 2880, 528, BLOCK_SIZE * 1, BLOCK_SIZE * 0.5 }, + { 2856, -136, BLOCK_SIZE * 0.1875, BLOCK_SIZE * 3.0625 }, + { 2368, -128, BLOCK_SIZE * 0.1875, BLOCK_SIZE * 3 }, + { 1800, -128, BLOCK_SIZE * 0.1875, BLOCK_SIZE * 2.125 }, + { 1184, -136, BLOCK_SIZE * 0.1875, BLOCK_SIZE * 2.1875 }, + { 2624, 880, BLOCK_SIZE * 0.25, BLOCK_SIZE * 0.25 }, + { 2592, 752, BLOCK_SIZE * 0.25, BLOCK_SIZE * 0.25 }, + { 2784, 1104, BLOCK_SIZE * 0.25, BLOCK_SIZE * 0.75 }, + { 2624, 1168, BLOCK_SIZE * 0.25, BLOCK_SIZE * 0.25 }, + { 2656, 1190, BLOCK_SIZE * 1, BLOCK_SIZE * 0.078125 }, + { 1760, 656, BLOCK_SIZE * 0.25, BLOCK_SIZE * 0.25 }, + { 1472, 352, BLOCK_SIZE * 0.25, BLOCK_SIZE * 0.5 }, + { -32, -8, BLOCK_SIZE * 0.25, BLOCK_SIZE * 10.6875 }, + { 3296, -5, BLOCK_SIZE * 0.25, BLOCK_SIZE * 10.6640625 }, +}; + +Zone room_dotdotdot[] = +{ + { -24, -83, BLOCK_SIZE * 38.3125, BLOCK_SIZE * 0.6484375 }, + { -48, 0, BLOCK_SIZE * 0.375, BLOCK_SIZE * 10.828125 }, + { 4544, 0, BLOCK_SIZE * 0.375, BLOCK_SIZE * 14.75 }, + { 0, 608, BLOCK_SIZE * 5.3125, BLOCK_SIZE * 10 }, + { 680, 928, BLOCK_SIZE * 10.0625, BLOCK_SIZE * 7.5 }, + { 1968, 1440, BLOCK_SIZE * 9.25, BLOCK_SIZE * 3.5 }, + { 3264, 1552, BLOCK_SIZE * 0.5, BLOCK_SIZE * 1.75 }, + { 3152, 1776, BLOCK_SIZE * 10.25, BLOCK_SIZE * 0.9375 }, + { 3808, 1696, BLOCK_SIZE * 0.75, BLOCK_SIZE * 0.875 }, + { 4128, 1696, BLOCK_SIZE * 0.75, BLOCK_SIZE * 0.875 }, + { 4448, 1696, BLOCK_SIZE * 0.75, BLOCK_SIZE * 1.5625 }, + { 3968, 1616, BLOCK_SIZE * 0.75, BLOCK_SIZE * 0.625 }, + { 4288, 1616, BLOCK_SIZE * 0.75, BLOCK_SIZE * 0.625 }, + { 3808, 1504, BLOCK_SIZE * 5, BLOCK_SIZE * 0.875 }, + { 3680, 1376, BLOCK_SIZE * 1, BLOCK_SIZE * 1.875 }, + { 3104, 1184, BLOCK_SIZE * 3.5, BLOCK_SIZE * 0.75 }, + { 2976, 992, BLOCK_SIZE * 4.5, BLOCK_SIZE * 0.75 }, + { 3552, 992, BLOCK_SIZE * 2, BLOCK_SIZE * 2.25 }, + { 3808, 992, BLOCK_SIZE * 5.75, BLOCK_SIZE * 1.5 }, + { 2912, 992, BLOCK_SIZE * 0.5, BLOCK_SIZE * 0.5 }, + { 2848, 928, BLOCK_SIZE * 0.5, BLOCK_SIZE * 0.75 }, + { 2240, 928, BLOCK_SIZE * 4.75, BLOCK_SIZE * 0.5 }, + { 1176, 480, BLOCK_SIZE * 5.5625, BLOCK_SIZE * 1 }, + { 1040, 608, BLOCK_SIZE * 4.625, BLOCK_SIZE * 0.375 }, + { 1472, 768, BLOCK_SIZE * 2.25, BLOCK_SIZE * 0.5 }, + { 1632, 560, BLOCK_SIZE * 1.5, BLOCK_SIZE * 1.625 }, + { 1760, 768, BLOCK_SIZE * 0.25, BLOCK_SIZE * 0.25 }, + { 1824, 560, BLOCK_SIZE * 5.25, BLOCK_SIZE * 1.125 }, + { 1824, 704, BLOCK_SIZE * 0.25, BLOCK_SIZE * 0.25 }, + { 2384, 320, BLOCK_SIZE * 0.875, BLOCK_SIZE * 1.875 }, + { 1520, 368, BLOCK_SIZE * 1.375, BLOCK_SIZE * 0.875 }, + { 960, 0, BLOCK_SIZE * 4.5, BLOCK_SIZE * 2 }, + { 1536, 0, BLOCK_SIZE * 3.75, BLOCK_SIZE * 1.25 }, + { 2496, 320, BLOCK_SIZE * 2.5000002, BLOCK_SIZE * 2 }, + { 2496, 576, BLOCK_SIZE * 0.25, BLOCK_SIZE * 0.5 }, + { 2528, 576, BLOCK_SIZE * 0.25, BLOCK_SIZE * 0.25 }, + { 2976, 144, BLOCK_SIZE * 1, BLOCK_SIZE * 1.3750001 }, + { 2816, 480, BLOCK_SIZE * 1, BLOCK_SIZE * 0.75 }, + { 2816, 320, BLOCK_SIZE * 5.875, BLOCK_SIZE * 1.25 }, + { 3520, 144, BLOCK_SIZE * 1.125, BLOCK_SIZE * 1.375 }, + { 3840, 320, BLOCK_SIZE * 1.75, BLOCK_SIZE * 1.25 }, + { 3568, 320, BLOCK_SIZE * 2.125, BLOCK_SIZE * 1.25 }, + { 4064, 384, BLOCK_SIZE * 1.75, BLOCK_SIZE * 0.75 }, + { 4288, 320, BLOCK_SIZE * 1, BLOCK_SIZE * 1.25 }, + { 4256, 608, BLOCK_SIZE * 1.5, BLOCK_SIZE * 1 }, + { 3968, 608, BLOCK_SIZE * 1.5, BLOCK_SIZE * 1 }, + { 4160, 672, BLOCK_SIZE * 0.75, BLOCK_SIZE * 0.5 }, + { 3840, 864, BLOCK_SIZE * 5.5, BLOCK_SIZE * 1 }, + { 3680, 672, BLOCK_SIZE * 1.25, BLOCK_SIZE * 2.5 }, + { 3072, 864, BLOCK_SIZE * 4.75, BLOCK_SIZE * 1 }, + { 3456, 672, BLOCK_SIZE * 1.75, BLOCK_SIZE * 0.5 }, + { 2928, 672, BLOCK_SIZE * 2.875, BLOCK_SIZE * 0.5 }, + { 3616, 736, BLOCK_SIZE * 0.5, BLOCK_SIZE * 0.5 }, + { 2880, 736, BLOCK_SIZE * 1.5, BLOCK_SIZE * 1.9999998 }, + { 2640, 736, BLOCK_SIZE * 1.875, BLOCK_SIZE * 1.5 }, + { 2480, 800, BLOCK_SIZE * 1.25, BLOCK_SIZE * 1 }, + { 3264, 144, BLOCK_SIZE * 0.75, BLOCK_SIZE * 0.25 }, + { 1888, 486, BLOCK_SIZE * 0.375, BLOCK_SIZE * 0.578125 }, + { 2176, 896, BLOCK_SIZE * 1.6874999, BLOCK_SIZE * 0.25 }, + { 960, 640, BLOCK_SIZE * 0.625, BLOCK_SIZE * 0.5 }, + { 1056, 656, BLOCK_SIZE * 0.75, BLOCK_SIZE * 1.125 }, + { 992, 704, BLOCK_SIZE * 0.5, BLOCK_SIZE * 0.25 }, + { 1024, 736, BLOCK_SIZE * 0.25, BLOCK_SIZE * 0.25 }, + { 1040, 656, BLOCK_SIZE * 0.125, BLOCK_SIZE * 0.375 }, + { 1856, 704, BLOCK_SIZE * 3.75, BLOCK_SIZE * 0.5 }, + { 1824, 736, BLOCK_SIZE * 0.25, BLOCK_SIZE * 0.25 }, + { 2336, 704, BLOCK_SIZE * 0.25, BLOCK_SIZE * 0.25 }, + { 2272, 992, BLOCK_SIZE * 4.5, BLOCK_SIZE * 0.25 }, + { 2304, 1024, BLOCK_SIZE * 4.75, BLOCK_SIZE * 0.25 }, + { 2328, 1056, BLOCK_SIZE * 5.0625, BLOCK_SIZE * 0.25 }, + { 2368, 1088, BLOCK_SIZE * 1.5, BLOCK_SIZE * 0.25 }, + { 2400, 1120, BLOCK_SIZE * 1.25, BLOCK_SIZE * 0.25 }, + { 2432, 1152, BLOCK_SIZE * 1, BLOCK_SIZE * 0.25 }, + { 2464, 1184, BLOCK_SIZE * 0.75, BLOCK_SIZE * 0.25 }, + { 2496, 1216, BLOCK_SIZE * 0.5, BLOCK_SIZE * 0.25 }, + { 3232, 1280, BLOCK_SIZE * 1.75, BLOCK_SIZE * 0.25 }, + { 3264, 1312, BLOCK_SIZE * 1.5, BLOCK_SIZE * 0.25 }, + { 3296, 1344, BLOCK_SIZE * 1.25, BLOCK_SIZE * 0.25 }, + { 3328, 1376, BLOCK_SIZE * 1, BLOCK_SIZE * 0.25 }, + { 680, 776, BLOCK_SIZE * 1.25, BLOCK_SIZE * 1.1875 }, + { 1968, 1224, BLOCK_SIZE * 2.1875, BLOCK_SIZE * 1.6875 }, + { 3152, 1552, BLOCK_SIZE * 0.875, BLOCK_SIZE * 1.75 }, + { 3328, 1672, BLOCK_SIZE * 0.875, BLOCK_SIZE * 0.8125 }, + { 1424, 424, BLOCK_SIZE * 0.7499999, BLOCK_SIZE * 0.4375 }, + { 1696, 424, BLOCK_SIZE * 0.81249994, BLOCK_SIZE * 0.4375 }, + { 2912, 216, BLOCK_SIZE * 0.5, BLOCK_SIZE * 0.8125001 }, + { 3664, 232, BLOCK_SIZE * 0.625, BLOCK_SIZE * 0.6875 }, + { 2392, 896, BLOCK_SIZE * 0.6875, BLOCK_SIZE * 0.25 }, + { 2432, 856, BLOCK_SIZE * 0.375, BLOCK_SIZE * 0.3125 }, +}; + +Zone room_fartzone[] = +{ + { -40, 0, BLOCK_SIZE * 0.3125, BLOCK_SIZE * 21.375 }, + { 2944, 0, BLOCK_SIZE * 0.3125, BLOCK_SIZE * 21.375 }, +}; + +Zone room_greenhill[] = +{ + { -4, 676, BLOCK_SIZE * 2.90625, BLOCK_SIZE * 1.34375 }, + { 368, 704, BLOCK_SIZE * 1, BLOCK_SIZE * 1.125 }, + { 496, 644, BLOCK_SIZE * 2.1875, BLOCK_SIZE * 1.59375 }, + { 776, 580, BLOCK_SIZE * 0.4375, BLOCK_SIZE * 2.09375 }, + { 832, 532, BLOCK_SIZE * 3.53125, BLOCK_SIZE * 2.46875 }, + { 1280, 456, BLOCK_SIZE * 2, BLOCK_SIZE * 3.0625 }, + { 1536, 580, BLOCK_SIZE * 0.53125, BLOCK_SIZE * 2.09375 }, + { 1604, 704, BLOCK_SIZE * 0.96875, BLOCK_SIZE * 1.125 }, + { 1728, 644, BLOCK_SIZE * 1.03125, BLOCK_SIZE * 1.5625 }, + { 2000, 712, BLOCK_SIZE * 0.5625, BLOCK_SIZE * 1.03125 }, + { 2216, 644, BLOCK_SIZE * 1.34375, BLOCK_SIZE * 1.5625 }, + { 2512, 708, BLOCK_SIZE * 0.65625, BLOCK_SIZE * 0.40625 }, + { 2732, 644, BLOCK_SIZE * 1.4062501, BLOCK_SIZE * 1.5625 }, + { 2912, 612, BLOCK_SIZE * 0.5000001, BLOCK_SIZE * 1.8125 }, + { 2976, 580, BLOCK_SIZE * 0.7500001, BLOCK_SIZE * 2.0625 }, + { 3072, 436, BLOCK_SIZE * 2.0625, BLOCK_SIZE * 3.1875 }, + { 3544, 447, BLOCK_SIZE * 0.5625001, BLOCK_SIZE * 0.2265625 }, + { 3544, 476, BLOCK_SIZE * 0.3125, BLOCK_SIZE * 2.875 }, + { 3766, 648, BLOCK_SIZE * 1.203125, BLOCK_SIZE * 1.53125 }, + { 4052, 708, BLOCK_SIZE * 2.2812498, BLOCK_SIZE * 1.0625 }, + { 4876, 644, BLOCK_SIZE * 0.90625, BLOCK_SIZE * 1.5625 }, + { 4992, 612, BLOCK_SIZE * 0.5, BLOCK_SIZE * 1.8125 }, + { 5056, 580, BLOCK_SIZE * 1, BLOCK_SIZE * 2.0625 }, + { 5184, 528, BLOCK_SIZE * 0.3125, BLOCK_SIZE * 2.46875 }, + { 5632, 584, BLOCK_SIZE * 0.53125, BLOCK_SIZE * 2.03125 }, + { 5832, 648, BLOCK_SIZE * 0.875, BLOCK_SIZE * 1.53125 }, + { 6348, 712, BLOCK_SIZE * 3.15625, BLOCK_SIZE * 1.03125 }, + { 6752, 676, BLOCK_SIZE * 0.75, BLOCK_SIZE * 1.3125 }, + { 6848, 648, BLOCK_SIZE * 0.84375, BLOCK_SIZE * 1.53125 }, + { 7632, 710, BLOCK_SIZE * 1.15625, BLOCK_SIZE * 1.046875 }, + { 7776, 676, BLOCK_SIZE * 0.74999994, BLOCK_SIZE * 1.3125 }, + { 7872, 644, BLOCK_SIZE * 0.5, BLOCK_SIZE * 1.5625 }, + { 7936, 580, BLOCK_SIZE * 0.5, BLOCK_SIZE * 2.0625 }, + { 5384, 497, BLOCK_SIZE * 0.3046875, BLOCK_SIZE * 0.3046875 }, + { 6973, 245, BLOCK_SIZE * 0.3046875, BLOCK_SIZE * 0.2734375 }, + { 2220, 614, BLOCK_SIZE * 0.3046875, BLOCK_SIZE * 0.2734375 }, + { 3336, 390, BLOCK_SIZE * 0.40625, BLOCK_SIZE * 0.765625 }, + { 7090, 648, BLOCK_SIZE * 0.953125, BLOCK_SIZE * 1.5390625 }, + { 7346, 648, BLOCK_SIZE * 0.98437494, BLOCK_SIZE * 1.5390625 }, + { 8144, 536, BLOCK_SIZE * 0.375, BLOCK_SIZE * 2.40625 }, + { 8000, 536, BLOCK_SIZE * 0.09375, BLOCK_SIZE * 2.40625 }, + { 6144, 712, BLOCK_SIZE * 0.5625, BLOCK_SIZE * 1.03125 }, + { 6068, 648, BLOCK_SIZE * 0.59375, BLOCK_SIZE * 1.53125 }, + { 3584, 648, BLOCK_SIZE * 0.375, BLOCK_SIZE * 1.53125 }, + { 4476, 708, BLOCK_SIZE * 1.0312498, BLOCK_SIZE * 1.0625 }, + { 4608, 696, BLOCK_SIZE * 0.12499976, BLOCK_SIZE * 0.1875 }, + { 5568, 536, BLOCK_SIZE * 0.5, BLOCK_SIZE * 2.40625 }, + { 7402, 276, BLOCK_SIZE * 0.171875, BLOCK_SIZE * 0.4296875 }, + { 7040, 328, BLOCK_SIZE * 1.5, BLOCK_SIZE * 0.125 }, + { 6656, 276, BLOCK_SIZE * 3.03125, BLOCK_SIZE * 0.40625 }, + { 6144, 276, BLOCK_SIZE * 0.3125, BLOCK_SIZE * 0.5 }, + { 6080, 340, BLOCK_SIZE * 0.28125, BLOCK_SIZE * 0.25 }, + { 6016, 372, BLOCK_SIZE * 0.28125, BLOCK_SIZE * 0.25 }, + { 8192, -572, BLOCK_SIZE * 0.28125, BLOCK_SIZE * 12.46875 }, + { -36, -472, BLOCK_SIZE * 0.28125, BLOCK_SIZE * 11.6875 }, + { 6080, 324, BLOCK_SIZE * 0.5, BLOCK_SIZE * 0.125 }, + { 6016, 356, BLOCK_SIZE * 0.5, BLOCK_SIZE * 0.125 }, + { 7384, 0, BLOCK_SIZE * 0.8125, BLOCK_SIZE * 1.125 }, + { 0.4621582, -20, BLOCK_SIZE * 64, BLOCK_SIZE * 0.15625 }, + { 3336, 488, BLOCK_SIZE * 1.625, BLOCK_SIZE * 2.78125 }, + { 3632, 660, BLOCK_SIZE * 1.046875, BLOCK_SIZE * 1.4375 }, + { 4344, 716, BLOCK_SIZE * 1.0312498, BLOCK_SIZE * 1 }, +}; + +Zone room_haundream[] = +{ + { 1916, 1120, BLOCK_SIZE * 0.59375, BLOCK_SIZE * 0.21875 }, + { 3208, 1340, BLOCK_SIZE * 0.4375, BLOCK_SIZE * 0.53125 }, + { 3809, 105, BLOCK_SIZE * 0.234375, BLOCK_SIZE * 0.4375 }, + { 65, 1560, BLOCK_SIZE * 0.234375, BLOCK_SIZE * 0.4375 }, + { 4096, 0, BLOCK_SIZE * 0.5, BLOCK_SIZE * 6.1875 }, + { -72, -56, BLOCK_SIZE * 0.5625, BLOCK_SIZE * 7 }, + { 0, -56, BLOCK_SIZE * 32.5, BLOCK_SIZE * 0.4375 }, +}; + +Zone room_hideandseek2[] = +{ + { 0, 0, BLOCK_SIZE * 2.5000002, BLOCK_SIZE * 6.5 }, + { 320.99994, 3.0596588E-05, BLOCK_SIZE * 9, BLOCK_SIZE * 1.5 }, + { 1472, 0, BLOCK_SIZE * 13.0078125, BLOCK_SIZE * 3.5 }, + { 3136, 0, BLOCK_SIZE * 11.5078125, BLOCK_SIZE * 1.5 }, + { 896.00104, 704, BLOCK_SIZE * 8.5, BLOCK_SIZE * 3.0000002 }, + { 192.00003, 960.0663, BLOCK_SIZE * 5.0078125, BLOCK_SIZE * 2 }, + { 768, 832, BLOCK_SIZE * 1, BLOCK_SIZE * 2 }, + { 959.99994, 1216, BLOCK_SIZE * 4.0078125, BLOCK_SIZE * 2 }, + { 0, 1344, BLOCK_SIZE * 2.5, BLOCK_SIZE * 2.5 }, + { 320, 1408, BLOCK_SIZE * 1, BLOCK_SIZE * 2 }, + { 448.8846, 1472, BLOCK_SIZE * 22.999996, BLOCK_SIZE * 1.5 }, + { 3008, 1088, BLOCK_SIZE * 3, BLOCK_SIZE * 3 }, + { 3392, 1344, BLOCK_SIZE * 3.4921875, BLOCK_SIZE * 2.5 }, + { 2688, 1344.8607, BLOCK_SIZE * 2.5, BLOCK_SIZE * 1 }, + { 3839.9995, 1344, BLOCK_SIZE * 6.0078125, BLOCK_SIZE * 2.5 }, + { 2368, 704, BLOCK_SIZE * 4.0078125, BLOCK_SIZE * 3 }, + { 2944.001, 576.9337, BLOCK_SIZE * 1.5078125, BLOCK_SIZE * 2.9921875 }, + { 2881.1326, 704.99994, BLOCK_SIZE * 0.4921875, BLOCK_SIZE * 1.9921875 }, + { 3776, 832, BLOCK_SIZE * 0.9921875, BLOCK_SIZE * 2 }, + { 3903.9993, 832, BLOCK_SIZE * 5.5078125, BLOCK_SIZE * 2 }, + { 4095.9998, 704, BLOCK_SIZE * 4, BLOCK_SIZE * 1 }, + { 4480, 576, BLOCK_SIZE * 1, BLOCK_SIZE * 1 }, + { 832, 384, BLOCK_SIZE * 3, BLOCK_SIZE * 1.5 }, + { 960, 320.99997, BLOCK_SIZE * 2, BLOCK_SIZE * 0.5 }, + { 760, 448, BLOCK_SIZE * 0.5625, BLOCK_SIZE * 0.5 }, + { 3167, 1024, BLOCK_SIZE * 0.546875, BLOCK_SIZE * 0.5 }, + { 4466, 1280, BLOCK_SIZE * 1.109375, BLOCK_SIZE * 0.5 }, + { 696, 896, BLOCK_SIZE * 0.5625, BLOCK_SIZE * 0.5 }, + { -48, 0, BLOCK_SIZE * 0.375, BLOCK_SIZE * 12.953125 }, + { 4608, 8, BLOCK_SIZE * 0.375, BLOCK_SIZE * 12.953125 }, + { 2624, 1088, BLOCK_SIZE * 2.0078125, BLOCK_SIZE * 1 }, + { 1472, 448, BLOCK_SIZE * 4.0078125, BLOCK_SIZE * 1 }, + { 576, 1216, BLOCK_SIZE * 2.0078125, BLOCK_SIZE * 1 }, + { 2816, 640, BLOCK_SIZE * 1, BLOCK_SIZE * 0.5 }, + { 2888, 608, BLOCK_SIZE * 0.4375, BLOCK_SIZE * 0.25 }, + { 2760, 672, BLOCK_SIZE * 0.4375, BLOCK_SIZE * 0.25 }, + { 2504, 1440, BLOCK_SIZE * 0.4375, BLOCK_SIZE * 0.25 }, + { 2560, 1408, BLOCK_SIZE * 1, BLOCK_SIZE * 0.5 }, + { 2632, 1376, BLOCK_SIZE * 0.4375, BLOCK_SIZE * 0.25 }, + { 3912, 800, BLOCK_SIZE * 0.4375, BLOCK_SIZE * 0.25 }, + { 3968, 768, BLOCK_SIZE * 1, BLOCK_SIZE * 0.5 }, + { 4040, 736, BLOCK_SIZE * 0.4375, BLOCK_SIZE * 0.25 }, + { 4296, 672, BLOCK_SIZE * 0.4375, BLOCK_SIZE * 0.25 }, + { 4352, 640, BLOCK_SIZE * 1, BLOCK_SIZE * 0.5 }, + { 4424, 608, BLOCK_SIZE * 0.4375, BLOCK_SIZE * 0.25 }, +}; + +Zone room_kindandfair[] = +{ + { 384, 4, BLOCK_SIZE * 1, BLOCK_SIZE * 6.46875 }, + { 512, 760, BLOCK_SIZE * 1, BLOCK_SIZE * 0.5625 }, + { 768, 832, BLOCK_SIZE * 1, BLOCK_SIZE * 1.5625 }, + { 480, 952, BLOCK_SIZE * 2.25, BLOCK_SIZE * 0.625 }, + { 0, 1024, BLOCK_SIZE * 2.5, BLOCK_SIZE * 4.03125 }, + { 320, 1088, BLOCK_SIZE * 0.5, BLOCK_SIZE * 3.53125 }, + { 384, 1152, BLOCK_SIZE * 3.0000002, BLOCK_SIZE * 3.03125 }, + { 768, 1280, BLOCK_SIZE * 2.5078125, BLOCK_SIZE * 1 }, + { 1471, 1280, BLOCK_SIZE * 1.0078125, BLOCK_SIZE * 1 }, + { 1600, 1344, BLOCK_SIZE * 0.5, BLOCK_SIZE * 0.5 }, + { 768, 1408, BLOCK_SIZE * 12, BLOCK_SIZE * 1.03125 }, + { 2304, 1344, BLOCK_SIZE * 0.5, BLOCK_SIZE * 1.53125 }, + { 2368, 1408, BLOCK_SIZE * 6.5, BLOCK_SIZE * 1.03125 }, + { 3200, 1264, BLOCK_SIZE * 3, BLOCK_SIZE * 2.15625 }, + { 2304, 1088, BLOCK_SIZE * 2, BLOCK_SIZE * 1.5 }, + { 2559.9375, 1088, BLOCK_SIZE * 1.5, BLOCK_SIZE * 1.5 }, + { 2948, 960, BLOCK_SIZE * 1.96875, BLOCK_SIZE * 1 }, + { 3200, 640, BLOCK_SIZE * 7, BLOCK_SIZE * 3.5 }, + { 4224, 0, BLOCK_SIZE * 1, BLOCK_SIZE * 12.03125 }, + { 896, 960, BLOCK_SIZE * 3.75, BLOCK_SIZE * 0.5625 }, + { 1152, 520, BLOCK_SIZE * 3, BLOCK_SIZE * 2.3125 }, + { 1536, 688, BLOCK_SIZE * 3, BLOCK_SIZE * 1 }, + { 1920, 560, BLOCK_SIZE * 3, BLOCK_SIZE * 2 }, + { 2304, 560, BLOCK_SIZE * 1, BLOCK_SIZE * 1.5625 }, + { 2432, 560, BLOCK_SIZE * 4, BLOCK_SIZE * 1 }, + { 1968, 1152, BLOCK_SIZE * 1.25, BLOCK_SIZE * 1.0625 }, + { 1776, 1216, BLOCK_SIZE * 1.5, BLOCK_SIZE * 0.5625 }, + { 1536, 528, BLOCK_SIZE * 0.24999997, BLOCK_SIZE * 0.0625 }, + { 384, 1088, BLOCK_SIZE * 0.24999997, BLOCK_SIZE * 0.0625 }, + { 2272, 1088, BLOCK_SIZE * 0.25, BLOCK_SIZE * 0.0625 }, + { 2272, 1344, BLOCK_SIZE * 0.25, BLOCK_SIZE * 0.0625 }, + { 3168, 640, BLOCK_SIZE * 0.25, BLOCK_SIZE * 0.0625 }, + { 4196, 0, BLOCK_SIZE * 0.21875, BLOCK_SIZE * 10.046875 }, + { 384, 1096, BLOCK_SIZE * 0.24218747, BLOCK_SIZE * 0.4375 }, + { 2273, 1352, BLOCK_SIZE * 0.24218749, BLOCK_SIZE * 0.4375 }, + { 1536, 536, BLOCK_SIZE * 0.24218749, BLOCK_SIZE * 1.1875 }, + { 3169, 648, BLOCK_SIZE * 0.24218749, BLOCK_SIZE * 2.4374998 }, + { 2273, 1096, BLOCK_SIZE * 0.24218749, BLOCK_SIZE * 1.375 }, + { 2273, 1272, BLOCK_SIZE * 0.2421875, BLOCK_SIZE * 0.0625 }, + { 1248, 1408, BLOCK_SIZE * 0.5078125, BLOCK_SIZE * 0.09375 }, + { -19, 0.9961548, BLOCK_SIZE * 0.1484375, BLOCK_SIZE * 8.1875 }, + { 2688, 496, BLOCK_SIZE * 1, BLOCK_SIZE * 0.5 }, + { 2657, 504, BLOCK_SIZE * 0.23437499, BLOCK_SIZE * 0.4375 }, + { 2656, 496, BLOCK_SIZE * 0.24999997, BLOCK_SIZE * 0.0625 }, + { 3584, 1408, BLOCK_SIZE * 2.4375, BLOCK_SIZE * 1.03125 }, + { 3896, 1280, BLOCK_SIZE * 2.5625, BLOCK_SIZE * 2.03125 }, + { 2961, 1192, BLOCK_SIZE * 1, BLOCK_SIZE * 0.5625 }, + { 2431, 688, BLOCK_SIZE * 0.24218747, BLOCK_SIZE * 0.5 }, + { 768, 1224, BLOCK_SIZE * 1.1015625, BLOCK_SIZE * 0.4375 }, + { 768, 1200, BLOCK_SIZE * 0.7265625, BLOCK_SIZE * 0.1875 }, + { 908, 1264, BLOCK_SIZE * 0.65625, BLOCK_SIZE * 0.125 }, + { 768, 1184, BLOCK_SIZE * 0.5, BLOCK_SIZE * 0.125 }, + { 1783, 628, BLOCK_SIZE * 1.0703125, BLOCK_SIZE * 0.46875 }, + { 1848, 596, BLOCK_SIZE * 0.5703125, BLOCK_SIZE * 0.25 }, + { 1720, 660, BLOCK_SIZE * 0.5, BLOCK_SIZE * 0.21875 }, + { 2587, 1028, BLOCK_SIZE * 1.0703125, BLOCK_SIZE * 0.46875 }, + { 2652, 996, BLOCK_SIZE * 0.5703125, BLOCK_SIZE * 0.25 }, + { 2524, 1060, BLOCK_SIZE * 0.5, BLOCK_SIZE * 0.21875 }, + { 2752, 1060, BLOCK_SIZE * 1.53125, BLOCK_SIZE * 0.21875 }, +}; + +Zone room_limpcity[] = +{ + { 48, 440, BLOCK_SIZE * 1.125, BLOCK_SIZE * 1 }, + { 320, 376, BLOCK_SIZE * 1.125, BLOCK_SIZE * 1.5 }, + { 592, 440, BLOCK_SIZE * 1.125, BLOCK_SIZE * 0.78125 }, + { 736, 376, BLOCK_SIZE * 1.625, BLOCK_SIZE * 1.28125 }, + { 944, 440, BLOCK_SIZE * 0.515625, BLOCK_SIZE * 0.78125 }, + { 1136, 504, BLOCK_SIZE * 1.125, BLOCK_SIZE * 0.5 }, + { 1728, 376, BLOCK_SIZE * 1.53125, BLOCK_SIZE * 1.28125 }, + { 1408, 504, BLOCK_SIZE * 8.5, BLOCK_SIZE * 0.5 }, + { 2568, 528, BLOCK_SIZE * 1.625, BLOCK_SIZE * 0.5 }, + { 2912, 528, BLOCK_SIZE * 1.625, BLOCK_SIZE * 0.5 }, + { 3096, 704, BLOCK_SIZE * 1.625, BLOCK_SIZE * 1 }, + { 3392, 768, BLOCK_SIZE * 1, BLOCK_SIZE * 2 }, + { 3260, 1024, BLOCK_SIZE * 2.03125, BLOCK_SIZE * 2.875 }, + { 2944, 1088, BLOCK_SIZE * 2.46875, BLOCK_SIZE * 2.375 }, + { 1156, 1152, BLOCK_SIZE * 13.96875, BLOCK_SIZE * 1.875 }, + { 1024, 960, BLOCK_SIZE * 1.03125, BLOCK_SIZE * 2.5 }, + { 256, 1280, BLOCK_SIZE * 7.03125, BLOCK_SIZE * 0.875 }, + { 0, 832, BLOCK_SIZE * 2, BLOCK_SIZE * 4.375 }, + { 360, 832, BLOCK_SIZE * 2, BLOCK_SIZE * 2 }, + { 872, 960, BLOCK_SIZE * 0.5, BLOCK_SIZE * 1 }, + { 736, 760, BLOCK_SIZE * 2, BLOCK_SIZE * 0.5 }, + { 1088, 776, BLOCK_SIZE * 2.5, BLOCK_SIZE * 0.5 }, + { 1280, 712, BLOCK_SIZE * 1, BLOCK_SIZE * 0.5 }, + { 1896, 872, BLOCK_SIZE * 4.6875, BLOCK_SIZE * 0.5 }, + { 2024, 936, BLOCK_SIZE * 4.5, BLOCK_SIZE * 1 }, + { 2536, 744, BLOCK_SIZE * 3.625, BLOCK_SIZE * 1 }, + { 2496, 756, BLOCK_SIZE * 0.3125, BLOCK_SIZE * 1.40625 }, + { 1032, 312, BLOCK_SIZE * 4, BLOCK_SIZE * 0.5 }, + { 592, 540, BLOCK_SIZE * 4.2499995, BLOCK_SIZE * 0.21875 }, + { 616, 960, BLOCK_SIZE * 2, BLOCK_SIZE * 1 }, + { -19, 0, BLOCK_SIZE * 0.1484375, BLOCK_SIZE * 6.6249995 }, + { 3520, -76, BLOCK_SIZE * 0.1484375, BLOCK_SIZE * 6.6249995 }, + { 616, 900, BLOCK_SIZE * 1.03125, BLOCK_SIZE * 0.46875 }, + { 1156, 1080, BLOCK_SIZE * 3.71875, BLOCK_SIZE * 0.5625 }, + { 1156, 1008, BLOCK_SIZE * 1.4375, BLOCK_SIZE * 0.5625 }, + { 1340, 1056, BLOCK_SIZE * 1.4375, BLOCK_SIZE * 0.1875 }, + { 1632, 1128, BLOCK_SIZE * 1.4375, BLOCK_SIZE * 0.1875 }, + { 2236, 820, BLOCK_SIZE * 2.03125, BLOCK_SIZE * 0.40625 }, + { 1604, 440, BLOCK_SIZE * 0.96875, BLOCK_SIZE * 0.49999997 }, + { 1924, 440, BLOCK_SIZE * 1.90625, BLOCK_SIZE * 0.49999997 }, + { 1540, 472, BLOCK_SIZE * 0.5, BLOCK_SIZE * 0.24999997 }, + { 1664, 408, BLOCK_SIZE * 0.5, BLOCK_SIZE * 0.24999997 }, + { 1924, 404, BLOCK_SIZE * 0.8125, BLOCK_SIZE * 0.28124997 }, + { 2168, 468, BLOCK_SIZE * 0.8125, BLOCK_SIZE * 0.28124997 }, + { 1010, 504, BLOCK_SIZE * 0.984375, BLOCK_SIZE * 0.28124997 }, + { 1010, 480, BLOCK_SIZE * 0.609375, BLOCK_SIZE * 0.18749997 }, + { 1010, 468, BLOCK_SIZE * 0.421875, BLOCK_SIZE * 0.09374997 }, + { 1088, 496, BLOCK_SIZE * 0.265625, BLOCK_SIZE * 0.06249997 }, + { 1010, 460, BLOCK_SIZE * 0.296875, BLOCK_SIZE * 0.06249997 }, + { 464, 440, BLOCK_SIZE * 1, BLOCK_SIZE * 0.99999994 }, + { 192, 440, BLOCK_SIZE * 1, BLOCK_SIZE * 0.99999994 }, + { 248, 412, BLOCK_SIZE * 0.5625, BLOCK_SIZE * 0.21874994 }, + { 464, 412, BLOCK_SIZE * 0.5625, BLOCK_SIZE * 0.21874994 }, +}; + +Zone room_majongforest[] = +{ + { 0, 224, BLOCK_SIZE * 6.1875, BLOCK_SIZE * 1 }, + { 928, 288, BLOCK_SIZE * 2.25, BLOCK_SIZE * 1.5 }, + { 1216, 352.78885, BLOCK_SIZE * 1.25, BLOCK_SIZE * 1 }, + { 1728, 334, BLOCK_SIZE * 1.5, BLOCK_SIZE * 0.765625 }, + { 1984, 270, BLOCK_SIZE * 2.5, BLOCK_SIZE * 0.78124994 }, + { 2464, 224, BLOCK_SIZE * 1.5, BLOCK_SIZE * 1 }, + { 2912, 224, BLOCK_SIZE * 5.75, BLOCK_SIZE * 1 }, + { 2912, 736, BLOCK_SIZE * 5.8125, BLOCK_SIZE * 1.5 }, + { 2656, 672, BLOCK_SIZE * 1.5, BLOCK_SIZE * 2.53125 }, + { 0, 736, BLOCK_SIZE * 5.765625, BLOCK_SIZE * 1.5 }, + { 738, 736, BLOCK_SIZE * 2.484375, BLOCK_SIZE * 1.5 }, + { 2048, 846, BLOCK_SIZE * 1.5, BLOCK_SIZE * 0.7421875 }, +}; + +Zone room_marijuna[] = +{ + { 0, 512, BLOCK_SIZE * 2, BLOCK_SIZE * 2 }, + { -72, 1088, BLOCK_SIZE * 4.5625, BLOCK_SIZE * 2.5 }, + { 768, 1088, BLOCK_SIZE * 4.0625, BLOCK_SIZE * 2.5 }, + { 1536, 992, BLOCK_SIZE * 2, BLOCK_SIZE * 2.25 }, + { 1792, 1024, BLOCK_SIZE * 2, BLOCK_SIZE * 2 }, + { 2048, 992, BLOCK_SIZE * 2, BLOCK_SIZE * 2.25 }, + { 2304, 864, BLOCK_SIZE * 4, BLOCK_SIZE * 3.25 }, + { 2816, 992, BLOCK_SIZE * 4, BLOCK_SIZE * 2.25 }, + { 3840, 992, BLOCK_SIZE * 2, BLOCK_SIZE * 7.75 }, + { 2944, 1552, BLOCK_SIZE * 2, BLOCK_SIZE * 3.375 }, + { 3200, 1472, BLOCK_SIZE * 5, BLOCK_SIZE * 4 }, + { 2432, 1792, BLOCK_SIZE * 4, BLOCK_SIZE * 1.5 }, + { 1472, 1808, BLOCK_SIZE * 7.5, BLOCK_SIZE * 1.375 }, + { 1216, 1728, BLOCK_SIZE * 2, BLOCK_SIZE * 2 }, + { 832, 1680, BLOCK_SIZE * 2, BLOCK_SIZE * 2.375 }, + { 1088, 1752, BLOCK_SIZE * 1, BLOCK_SIZE * 1.8125 }, + { 448, 512, BLOCK_SIZE * 2.6875, BLOCK_SIZE * 2 }, + { 792, 528, BLOCK_SIZE * 2.8125, BLOCK_SIZE * 1.875 }, + { 1216, 384, BLOCK_SIZE * 1.5, BLOCK_SIZE * 2.5 }, + { 1408, 448, BLOCK_SIZE * 2.125, BLOCK_SIZE * 2 }, + { 1680, 504, BLOCK_SIZE * 1.875, BLOCK_SIZE * 1.5625 }, + { 1920, 496, BLOCK_SIZE * 2, BLOCK_SIZE * 1.625 }, + { 2688, 512, BLOCK_SIZE * 9.750001, BLOCK_SIZE * 0.5 }, + { 2688, 576, BLOCK_SIZE * 9.75, BLOCK_SIZE * 0.5 }, + { 3072.3462, 640, BLOCK_SIZE * 6.7471585, BLOCK_SIZE * 0.5 }, + { 2889.2666, 448, BLOCK_SIZE * 8.177588, BLOCK_SIZE * 0.5 }, + { 2951.6545, 384, BLOCK_SIZE * 7.690182, BLOCK_SIZE * 0.5 }, + { 3092.608, 304, BLOCK_SIZE * 6.5887766, BLOCK_SIZE * 0.625 }, + { 1280, 1104, BLOCK_SIZE * 2, BLOCK_SIZE * 2.375 }, + { -64, 1696, BLOCK_SIZE * 7.0000005, BLOCK_SIZE * 2.25 }, + { 1264, 328, BLOCK_SIZE * 1.125, BLOCK_SIZE * 0.4375 }, + { 1304, 296, BLOCK_SIZE * 0.8125, BLOCK_SIZE * 0.25 }, + { -64, 1680, BLOCK_SIZE * 4, BLOCK_SIZE * 2.4375 }, + { -72, 0, BLOCK_SIZE * 0.5625, BLOCK_SIZE * 16.75 }, + { 4096, 0, BLOCK_SIZE * 0.5625, BLOCK_SIZE * 16.75 }, + { -72, -80, BLOCK_SIZE * 33.125, BLOCK_SIZE * 0.625 }, + { 1032, 472, BLOCK_SIZE * 1.4375, BLOCK_SIZE * 0.4375 }, + { 1144, 432, BLOCK_SIZE * 0.5625, BLOCK_SIZE * 0.3125 }, + { 920, 488, BLOCK_SIZE * 0.875, BLOCK_SIZE * 0.3125 }, + { 3688, 1312, BLOCK_SIZE * 1.1875, BLOCK_SIZE * 1.25 }, + { 3528, 1432, BLOCK_SIZE * 1.25, BLOCK_SIZE * 0.4375 }, + { 3600, 1360, BLOCK_SIZE * 0.6875, BLOCK_SIZE * 0.5625 }, + { 3732, 1280, BLOCK_SIZE * 0.84375, BLOCK_SIZE * 0.25 }, + { 1152, 528, BLOCK_SIZE * 0.5, BLOCK_SIZE * 1.375 }, +}; + +Zone room_nastyparadise[] = +{ + { 128, 328, BLOCK_SIZE * 2, BLOCK_SIZE * 1.5 }, + { 384, 392, BLOCK_SIZE * 1, BLOCK_SIZE * 1 }, + { 0, 624, BLOCK_SIZE * 2, BLOCK_SIZE * 4.5625 }, + { 256, 816, BLOCK_SIZE * 3, BLOCK_SIZE * 3.0625 }, + { 896, 880, BLOCK_SIZE * 5.0625, BLOCK_SIZE * 2.5625 }, + { 1544, 944, BLOCK_SIZE * 4.96875, BLOCK_SIZE * 2.09375 }, + { 2176, 880, BLOCK_SIZE * 0.99999994, BLOCK_SIZE * 2.59375 }, + { 2304, 955, BLOCK_SIZE * 1.4999999, BLOCK_SIZE * 2.0078125 }, + { 2496, 880, BLOCK_SIZE * 0.99999994, BLOCK_SIZE * 2.59375 }, + { 2624, 955, BLOCK_SIZE * 1.4999999, BLOCK_SIZE * 2.0078125 }, + { 2816, 880, BLOCK_SIZE * 2.9375, BLOCK_SIZE * 2.59375 }, + { 3192, 816, BLOCK_SIZE * 2.0625, BLOCK_SIZE * 3.125 }, + { 3456, 756, BLOCK_SIZE * 1, BLOCK_SIZE * 3.59375 }, + { 3584, 816, BLOCK_SIZE * 3.9687498, BLOCK_SIZE * 3.125 }, + { 2304, 504, BLOCK_SIZE * 0.99999994, BLOCK_SIZE * 1.5000001 }, + { 2176, 568, BLOCK_SIZE * 0.99999994, BLOCK_SIZE * 1 }, + { 2432, 568, BLOCK_SIZE * 0.99999994, BLOCK_SIZE * 1 }, + { 1920, 584, BLOCK_SIZE * 0.99999994, BLOCK_SIZE * 1.5 }, + { 1408, 648, BLOCK_SIZE * 4, BLOCK_SIZE * 1 }, + { 1280, 584, BLOCK_SIZE * 1, BLOCK_SIZE * 1.5 }, + { 1280, 0, BLOCK_SIZE * 2, BLOCK_SIZE * 2.5625 }, + { 2176, 200, BLOCK_SIZE * 0.99999994, BLOCK_SIZE * 1.5000001 }, + { 2432, 200, BLOCK_SIZE * 2, BLOCK_SIZE * 1.5000001 }, + { 2688, 275, BLOCK_SIZE * 2, BLOCK_SIZE * 0.9140627 }, + { 2944, 200, BLOCK_SIZE * 1, BLOCK_SIZE * 1.5000001 }, + { 3072, 264, BLOCK_SIZE * 1, BLOCK_SIZE * 1.5000001 }, + { 3440, 328, BLOCK_SIZE * 2.125, BLOCK_SIZE * 1.0000001 }, + { 3856, 0, BLOCK_SIZE * 2.15625, BLOCK_SIZE * 5.0625 }, + { 3712, 624, BLOCK_SIZE * 2, BLOCK_SIZE * 0.68750006 }, + { 512, 488, BLOCK_SIZE * 3, BLOCK_SIZE * 0.75 }, + { 2048, 336, BLOCK_SIZE * 1, BLOCK_SIZE * 0.4375 }, + { 1920, 360, BLOCK_SIZE * 1, BLOCK_SIZE * 0.25 }, + { 2560, 616, BLOCK_SIZE * 0.99999994, BLOCK_SIZE * 0.625 }, + { 2688, 648, BLOCK_SIZE * 0.99999994, BLOCK_SIZE * 0.375 }, + { 2816, 664, BLOCK_SIZE * 0.99999994, BLOCK_SIZE * 0.25 }, + { 3200, 328, BLOCK_SIZE * 1.875, BLOCK_SIZE * 1.0000001 }, + { 2688, 252, BLOCK_SIZE * 2, BLOCK_SIZE * 0.1875 }, + { 2304, 932, BLOCK_SIZE * 1.5, BLOCK_SIZE * 0.1875 }, + { 2624, 932, BLOCK_SIZE * 1.5, BLOCK_SIZE * 0.1875 }, + { -128, -24, BLOCK_SIZE * 33.96875, BLOCK_SIZE * 0.1875 }, + { 640, 880, BLOCK_SIZE * 2, BLOCK_SIZE * 2.5625 }, +}; + +Zone room_notperfect[] = +{ + { 0, 2376, BLOCK_SIZE * 1.875, BLOCK_SIZE * 2.8125 }, + { 240, 2424, BLOCK_SIZE * 15, BLOCK_SIZE * 2.4375 }, + { 2160, 2328, BLOCK_SIZE * 0.75, BLOCK_SIZE * 3.1875 }, + { 2256, 2352, BLOCK_SIZE * 0.5625, BLOCK_SIZE * 3 }, + { 2328, 2376, BLOCK_SIZE * 0.5625, BLOCK_SIZE * 2.8125 }, + { 2400, 2424, BLOCK_SIZE * 24.375, BLOCK_SIZE * 2.4375 }, + { 2016, 2280, BLOCK_SIZE * 0.75, BLOCK_SIZE * 0.5625 }, + { 2112, 2304, BLOCK_SIZE * 0.5625, BLOCK_SIZE * 0.375 }, + { 1824, 2352, BLOCK_SIZE * 0.5625, BLOCK_SIZE * 0.5625 }, + { 1656, 2280, BLOCK_SIZE * 0.5625, BLOCK_SIZE * 0.5625 }, + { 1512, 2208, BLOCK_SIZE * 0.5625, BLOCK_SIZE * 0.5625 }, + { 1368, 2280, BLOCK_SIZE * 0.5625, BLOCK_SIZE * 0.5625 }, + { 1152, 2280, BLOCK_SIZE * 0.5625, BLOCK_SIZE * 0.5625 }, + { 1008, 2352, BLOCK_SIZE * 0.5625, BLOCK_SIZE * 0.5625 }, + { 1272, 2376, BLOCK_SIZE * 0.375, BLOCK_SIZE * 0.375 }, + { 768, 2328, BLOCK_SIZE * 0.75, BLOCK_SIZE * 0.1875 }, + { 600, 2304, BLOCK_SIZE * 0.5625, BLOCK_SIZE * 0.1875 }, + { 504, 2280, BLOCK_SIZE * 0.1875, BLOCK_SIZE * 0.1875 }, + { 312, 2328, BLOCK_SIZE * 0.5625, BLOCK_SIZE * 0.1875 }, + { 336, 2064, BLOCK_SIZE * 0.9375, BLOCK_SIZE * 0.75 }, + { 576, 2136, BLOCK_SIZE * 3, BLOCK_SIZE * 0.1875 }, + { 672, 2112, BLOCK_SIZE * 2.25, BLOCK_SIZE * 0.1875 }, + { 744, 2088, BLOCK_SIZE * 1.6875, BLOCK_SIZE * 0.1875 }, + { 816, 2064, BLOCK_SIZE * 1.125, BLOCK_SIZE * 0.1875 }, + { 888, 2040, BLOCK_SIZE * 0.5625, BLOCK_SIZE * 0.1875 }, + { 960, 2136, BLOCK_SIZE * 2.8125, BLOCK_SIZE * 0.1875 }, + { 1080, 2112, BLOCK_SIZE * 0.37500003, BLOCK_SIZE * 0.1875 }, + { 1320, 1992, BLOCK_SIZE * 0.9375, BLOCK_SIZE * 1.3125 }, + { 1440, 1992, BLOCK_SIZE * 0.9375, BLOCK_SIZE * 0.37500003 }, + { 504, 1992, BLOCK_SIZE * 1.3125, BLOCK_SIZE * 0.1875 }, + { 624, 1848, BLOCK_SIZE * 3.375, BLOCK_SIZE * 0.1875 }, + { 744, 1824, BLOCK_SIZE * 0.75, BLOCK_SIZE * 0.1875 }, + { 936, 1752, BLOCK_SIZE * 0.9375, BLOCK_SIZE * 0.75 }, + { 1152, 1680, BLOCK_SIZE * 1.3125, BLOCK_SIZE * 0.375 }, + { 1320, 1704, BLOCK_SIZE * 0.75000006, BLOCK_SIZE * 0.1875 }, + { 1320, 1848, BLOCK_SIZE * 4.125, BLOCK_SIZE * 0.1875 }, + { 1080, 1992, BLOCK_SIZE * 1.125, BLOCK_SIZE * 0.1875 }, + { 1128, 1920, BLOCK_SIZE * 0.75, BLOCK_SIZE * 0.5625 }, + { 1704, 1992, BLOCK_SIZE * 0.5625, BLOCK_SIZE * 0.5625 }, + { 1824, 2088, BLOCK_SIZE * 0.375, BLOCK_SIZE * 0.375 }, + { 1920, 1992, BLOCK_SIZE * 0.5625, BLOCK_SIZE * 0.5625 }, + { 2064, 2064, BLOCK_SIZE * 0.5625, BLOCK_SIZE * 0.5625 }, + { 1656, 2136, BLOCK_SIZE * 3.75, BLOCK_SIZE * 0.1875 }, + { 1488, 1776, BLOCK_SIZE * 0.75, BLOCK_SIZE * 0.5625 }, + { 1656, 1704, BLOCK_SIZE * 0.9375, BLOCK_SIZE * 0.5625 }, + { 1848, 1776, BLOCK_SIZE * 1.125, BLOCK_SIZE * 0.75 }, + { 2544, 1368, BLOCK_SIZE * 3.375, BLOCK_SIZE * 8.25 }, + { 2232, 1368, BLOCK_SIZE * 2.4375, BLOCK_SIZE * 5.8125 }, + { 2208, 1368, BLOCK_SIZE * 0.1875, BLOCK_SIZE * 3.375 }, + { 2232, 2112, BLOCK_SIZE * 0.375, BLOCK_SIZE * 0.375 }, + { 2520, 2112, BLOCK_SIZE * 0.1875, BLOCK_SIZE * 1.6875 }, + { 0, 1368, BLOCK_SIZE * 3.75, BLOCK_SIZE * 3.375 }, + { 336, 1800, BLOCK_SIZE * 1.125, BLOCK_SIZE * 0.5625 }, + { 0, 1800, BLOCK_SIZE * 1.125, BLOCK_SIZE * 2.625 }, + { 0, 2136, BLOCK_SIZE * 0.5625, BLOCK_SIZE * 1.875 }, + { 0, 1104, BLOCK_SIZE * 43.125, BLOCK_SIZE * 2.0625 }, + { 3768, 2016, BLOCK_SIZE * 0.75, BLOCK_SIZE * 0.5625 }, + { 3696, 2088, BLOCK_SIZE * 2.25, BLOCK_SIZE * 0.5625 }, + { 3576, 2136, BLOCK_SIZE * 0.9375, BLOCK_SIZE * 0.1875 }, + { 3984, 2136, BLOCK_SIZE * 7.1249995, BLOCK_SIZE * 0.1875 }, + { 4176, 2016, BLOCK_SIZE * 1.5, BLOCK_SIZE * 0.1875 }, + { 4320, 2040, BLOCK_SIZE * 0.375, BLOCK_SIZE * 0.75 }, + { 4464, 1368, BLOCK_SIZE * 0.75, BLOCK_SIZE * 5.4375 }, + { 4560, 1968, BLOCK_SIZE * 0.75, BLOCK_SIZE * 0.375 }, + { 4680, 2088, BLOCK_SIZE * 0.75, BLOCK_SIZE * 0.375 }, + { 4776, 2016, BLOCK_SIZE * 0.9375, BLOCK_SIZE * 0.9375 }, + { 4344, 2160, BLOCK_SIZE * 0.9375, BLOCK_SIZE * 1.3125 }, + { 4056, 2304, BLOCK_SIZE * 1.5, BLOCK_SIZE * 0.9375 }, + { 3624, 2376, BLOCK_SIZE * 2.0625, BLOCK_SIZE * 0.375 }, + { 3336, 2280, BLOCK_SIZE * 0.9375, BLOCK_SIZE * 0.375 }, + { 3168, 2280, BLOCK_SIZE * 0.5625, BLOCK_SIZE * 0.375 }, + { 3120, 2328, BLOCK_SIZE * 0.9375, BLOCK_SIZE * 0.1875 }, + { 3192, 2136, BLOCK_SIZE * 1.125, BLOCK_SIZE * 0.1875 }, + { 3432, 2136, BLOCK_SIZE * 0.1875, BLOCK_SIZE * 1.125 }, + { 2976, 2088, BLOCK_SIZE * 0.375, BLOCK_SIZE * 1.6875 }, + { 2976, 2400, BLOCK_SIZE * 0.375, BLOCK_SIZE * 0.1875 }, + { 2976, 1368, BLOCK_SIZE * 2.0625, BLOCK_SIZE * 5.625 }, + { 3240, 1368, BLOCK_SIZE * 2.4375, BLOCK_SIZE * 3.0000002 }, + { 3552, 1368, BLOCK_SIZE * 0.5625, BLOCK_SIZE * 2.4375002 }, + { 3624, 1368, BLOCK_SIZE * 0.5625, BLOCK_SIZE * 1.8750002 }, + { 3240, 1752, BLOCK_SIZE * 0.375, BLOCK_SIZE * 1.5000001 }, + { 3192, 2088, BLOCK_SIZE * 0.375, BLOCK_SIZE * 0.37500012 }, + { 4584, 2352, BLOCK_SIZE * 1.875, BLOCK_SIZE * 0.5625 }, + { 4656, 2280, BLOCK_SIZE * 1.3125, BLOCK_SIZE * 0.5625 }, + { 4944, 2352, BLOCK_SIZE * 1.6875, BLOCK_SIZE * 0.5625 }, + { 5088, 1368, BLOCK_SIZE * 3.375, BLOCK_SIZE * 6.1875 }, + { 4776, 1368, BLOCK_SIZE * 2.4375, BLOCK_SIZE * 1.4999999 }, + { 4872, 1560, BLOCK_SIZE * 1.6875, BLOCK_SIZE * 1.5624999 }, + { 4872, 1760, BLOCK_SIZE * 1.6875, BLOCK_SIZE * 0.8749998 }, + { 4848, 1656, BLOCK_SIZE * 0.1875, BLOCK_SIZE * 0.75 }, + { 5016, 1872, BLOCK_SIZE * 0.5625, BLOCK_SIZE * 0.9375 }, + { 5352, 2160, BLOCK_SIZE * 1.3125, BLOCK_SIZE * 0.1875 }, + { 5400, 2184, BLOCK_SIZE * 0.9375, BLOCK_SIZE * 1.875 }, + { 456, 912, BLOCK_SIZE * 0.9375, BLOCK_SIZE * 1.125 }, + { 192, 984, BLOCK_SIZE * 0.9375, BLOCK_SIZE * 0.5625 }, + { 744, 912, BLOCK_SIZE * 1.6875, BLOCK_SIZE * 0.375 }, + { 1032, 984, BLOCK_SIZE * 0.5625, BLOCK_SIZE * 0.5625 }, + { 672, 696, BLOCK_SIZE * 0.9375, BLOCK_SIZE * 0.5625 }, + { 576, 768, BLOCK_SIZE * 5.625, BLOCK_SIZE * 0.1875 }, + { 336, 768, BLOCK_SIZE * 0.9375, BLOCK_SIZE * 0.1875 }, + { 336, 600, BLOCK_SIZE * 0.1875, BLOCK_SIZE * 1.3125 }, + { 456, 648, BLOCK_SIZE * 0.9375, BLOCK_SIZE * 0.1875 }, + { 624, 480, BLOCK_SIZE * 3.1875, BLOCK_SIZE * 0.1875 }, + { 936, 624, BLOCK_SIZE * 2.0625, BLOCK_SIZE * 0.1875 }, + { 864, 408, BLOCK_SIZE * 0.75, BLOCK_SIZE * 0.5625 }, + { 1104, 552, BLOCK_SIZE * 0.75, BLOCK_SIZE * 0.5625 }, + { 1272, 408, BLOCK_SIZE * 1.125, BLOCK_SIZE * 0.5625 }, + { 1272, 480, BLOCK_SIZE * 4.6875, BLOCK_SIZE * 0.1875 }, + { 1272, 504, BLOCK_SIZE * 0.75, BLOCK_SIZE * 0.1875 }, + { 1272, 528, BLOCK_SIZE * 0.375, BLOCK_SIZE * 0.1875 }, + { 1464, 696, BLOCK_SIZE * 1.125, BLOCK_SIZE * 0.75 }, + { 1608, 768, BLOCK_SIZE * 0.5625, BLOCK_SIZE * 0.1875 }, + { 1896, 744, BLOCK_SIZE * 1.3125, BLOCK_SIZE * 0.75 }, + { 1776, 816, BLOCK_SIZE * 0.9375, BLOCK_SIZE * 0.1875 }, + { 2064, 792, BLOCK_SIZE * 1.5, BLOCK_SIZE * 0.375 }, + { 1680, 888, BLOCK_SIZE * 0.75, BLOCK_SIZE * 0.75 }, + { 1776, 936, BLOCK_SIZE * 0.5625, BLOCK_SIZE * 0.375 }, + { 1608, 960, BLOCK_SIZE * 0.5625, BLOCK_SIZE * 0.1875 }, + { 1920, 1008, BLOCK_SIZE * 2.25, BLOCK_SIZE * 0.375 }, + { 2016, 960, BLOCK_SIZE * 1.5, BLOCK_SIZE * 0.375 }, + { 2112, 936, BLOCK_SIZE * 0.75, BLOCK_SIZE * 0.1875 }, + { 2328, 1008, BLOCK_SIZE * 0.75, BLOCK_SIZE * 0.375 }, + { 1512, 1032, BLOCK_SIZE * 0.375, BLOCK_SIZE * 0.1875 }, + { 2520, 1008, BLOCK_SIZE * 0.1875, BLOCK_SIZE * 0.375 }, + { 2544, 0, BLOCK_SIZE * 3.375, BLOCK_SIZE * 8.25 }, + { 1656, 408, BLOCK_SIZE * 1.125, BLOCK_SIZE * 0.5625 }, + { 1656, 336, BLOCK_SIZE * 0.5625, BLOCK_SIZE * 0.5625 }, + { 1536, 336, BLOCK_SIZE * 0.9375, BLOCK_SIZE * 0.1875 }, + { 0, 0, BLOCK_SIZE * 3.9374998, BLOCK_SIZE * 3.7500002 }, + { 0, 480, BLOCK_SIZE * 1.3124998, BLOCK_SIZE * 3.0000002 }, + { 168, 480, BLOCK_SIZE * 1.3124998, BLOCK_SIZE * 0.93750024 }, + { 336, 480, BLOCK_SIZE * 0.18749976, BLOCK_SIZE * 0.93750024 }, + { 360, 480, BLOCK_SIZE * 0.18749976, BLOCK_SIZE * 0.93750024 }, + { 384, 480, BLOCK_SIZE * 0.18749976, BLOCK_SIZE * 0.75000024 }, + { 408, 480, BLOCK_SIZE * 0.18749976, BLOCK_SIZE * 0.56250024 }, + { 432, 480, BLOCK_SIZE * 0.18749976, BLOCK_SIZE * 0.37500024 }, + { 456, 480, BLOCK_SIZE * 0.18749976, BLOCK_SIZE * 0.18750024 }, + { 0, 864, BLOCK_SIZE * 1.3124998, BLOCK_SIZE * 2.3841858E-07 }, + { 0, 864, BLOCK_SIZE * 1.1249998, BLOCK_SIZE * 0.37500024 }, + { 0, 912, BLOCK_SIZE * 0.56249976, BLOCK_SIZE * 1.1250002 }, + { 504, 0, BLOCK_SIZE * 0.18749976, BLOCK_SIZE * 1.3125002 }, + { 2256, 0, BLOCK_SIZE * 2.2499998, BLOCK_SIZE * 6.1875 }, + { 2208, 0, BLOCK_SIZE * 0.37499976, BLOCK_SIZE * 2.625 }, + { 2256, 792, BLOCK_SIZE * 0.18749976, BLOCK_SIZE * 0.37500003 }, + { 2400, 792, BLOCK_SIZE * 0.56249976, BLOCK_SIZE * 0.5625 }, + { 2448, 864, BLOCK_SIZE * 0.18749976, BLOCK_SIZE * 0.375 }, + { 2976, 0, BLOCK_SIZE * 5.0625, BLOCK_SIZE * 3.9375 }, + { 2976, 504, BLOCK_SIZE * 2.8125002, BLOCK_SIZE * 0.1875 }, + { 2976, 648, BLOCK_SIZE * 0.9375003, BLOCK_SIZE * 0.375 }, + { 2976, 696, BLOCK_SIZE * 0.7500003, BLOCK_SIZE * 0.5625 }, + { 2976, 768, BLOCK_SIZE * 0.5625003, BLOCK_SIZE * 0.5625 }, + { 2976, 840, BLOCK_SIZE * 0.3750003, BLOCK_SIZE * 0.5625 }, + { 3072, 1032, BLOCK_SIZE * 1.6875002, BLOCK_SIZE * 0.1875 }, + { 3240, 744, BLOCK_SIZE * 0.9375003, BLOCK_SIZE * 0.375 }, + { 3480, 744, BLOCK_SIZE * 4.3125005, BLOCK_SIZE * 0.375 }, + { 3696, 984, BLOCK_SIZE * 0.9375005, BLOCK_SIZE * 0.5625 }, + { 3984, 912, BLOCK_SIZE * 1.5000005, BLOCK_SIZE * 0.375 }, + { 4248, 984, BLOCK_SIZE * 0.37500048, BLOCK_SIZE * 0.5625 }, + { 3384, 912, BLOCK_SIZE * 0.7500005, BLOCK_SIZE * 0.1875 }, + { 3456, 960, BLOCK_SIZE * 0.7500005, BLOCK_SIZE * 0.1875 }, + { 3456, 936, BLOCK_SIZE * 0.18750048, BLOCK_SIZE * 0.1875 }, + { 3600, 720, BLOCK_SIZE * 1.6875005, BLOCK_SIZE * 0.1875 }, + { 4008, 624, BLOCK_SIZE * 0.7500005, BLOCK_SIZE * 0.1875 }, + { 4008, 648, BLOCK_SIZE * 0.37500048, BLOCK_SIZE * 0.1875 }, + { 3960, 672, BLOCK_SIZE * 0.5625005, BLOCK_SIZE * 0.5625 }, + { 4296, 672, BLOCK_SIZE * 0.5625005, BLOCK_SIZE * 0.9375 }, + { 4224, 624, BLOCK_SIZE * 0.7500005, BLOCK_SIZE * 0.1875 }, + { 4272, 648, BLOCK_SIZE * 0.37500048, BLOCK_SIZE * 0.1875 }, + { 4032, 768, BLOCK_SIZE * 2.0625005, BLOCK_SIZE * 0.1875 }, + { 4368, 816, BLOCK_SIZE * 1.1250004, BLOCK_SIZE * 0.1875 }, + { 4368, 744, BLOCK_SIZE * 0.37500036, BLOCK_SIZE * 0.5625 }, + { 4440, 600, BLOCK_SIZE * 0.93750036, BLOCK_SIZE * 0.1875 }, + { 4680, 624, BLOCK_SIZE * 1.5000004, BLOCK_SIZE * 0.1875 }, + { 4968, 768, BLOCK_SIZE * 1.5000004, BLOCK_SIZE * 0.1875 }, + { 4848, 648, BLOCK_SIZE * 0.37500036, BLOCK_SIZE * 0.1875 }, + { 4872, 672, BLOCK_SIZE * 0.37500036, BLOCK_SIZE * 0.1875 }, + { 4896, 696, BLOCK_SIZE * 0.37500036, BLOCK_SIZE * 0.1875 }, + { 4920, 720, BLOCK_SIZE * 0.37500036, BLOCK_SIZE * 0.1875 }, + { 4944, 744, BLOCK_SIZE * 0.37500036, BLOCK_SIZE * 0.1875 }, + { 4800, 888, BLOCK_SIZE * 1.5000004, BLOCK_SIZE * 0.375 }, + { 4584, 888, BLOCK_SIZE * 0.75000036, BLOCK_SIZE * 0.5625 }, + { 4560, 912, BLOCK_SIZE * 0.18750036, BLOCK_SIZE * 1.125 }, + { 4536, 936, BLOCK_SIZE * 0.18750036, BLOCK_SIZE * 0.9375 }, + { 4512, 960, BLOCK_SIZE * 0.18750036, BLOCK_SIZE * 0.75 }, + { 4488, 984, BLOCK_SIZE * 0.18750036, BLOCK_SIZE * 0.5625 }, + { 4464, 1008, BLOCK_SIZE * 0.18750036, BLOCK_SIZE * 0.375 }, + { 4440, 1032, BLOCK_SIZE * 0.18750036, BLOCK_SIZE * 0.1875 }, + { 5040, 1032, BLOCK_SIZE * 0.18750036, BLOCK_SIZE * 0.1875 }, + { 5136, 960, BLOCK_SIZE * 0.93750036, BLOCK_SIZE * 0.1875 }, + { 5208, 984, BLOCK_SIZE * 0.75000036, BLOCK_SIZE * 0.5625 }, + { 4800, 0, BLOCK_SIZE * 5.6250005, BLOCK_SIZE * 2.0625 }, + { 4872, 264, BLOCK_SIZE * 5.0625005, BLOCK_SIZE * 0.5625 }, + { 5040, 336, BLOCK_SIZE * 3.7500005, BLOCK_SIZE * 1.6875 }, + { 5184, 552, BLOCK_SIZE * 2.6250005, BLOCK_SIZE * 0.1875 }, + { 5304, 576, BLOCK_SIZE * 1.6875005, BLOCK_SIZE * 0.75 }, + { 5376, 672, BLOCK_SIZE * 1.1250005, BLOCK_SIZE * 2.0625 }, + { 5448, 936, BLOCK_SIZE * 0.56250054, BLOCK_SIZE * 0.9375 }, + { 5160, 552, BLOCK_SIZE * 0.18750048, BLOCK_SIZE * 1.8750001 }, + { 5040, 552, BLOCK_SIZE * 0.18750048, BLOCK_SIZE * 0.93750006 }, + { 4872, 336, BLOCK_SIZE * 0.18750048, BLOCK_SIZE * 1.3125 }, + { 2976, 528, BLOCK_SIZE * 1.1250002, BLOCK_SIZE * 0.75 }, + { 3240, 528, BLOCK_SIZE * 0.75000024, BLOCK_SIZE * 0.9375 }, + { 2976, 624, BLOCK_SIZE * 0.9375002, BLOCK_SIZE * 0.1875 }, + { 0, 1056, BLOCK_SIZE * 9.5625, BLOCK_SIZE * 0.375 }, + { 1512, 1056, BLOCK_SIZE * 31.335938, BLOCK_SIZE * 0.375 }, + { 4848, 1560, BLOCK_SIZE * 0.1875, BLOCK_SIZE * 0.75 }, + { 4248, 2376, BLOCK_SIZE * 0.1875, BLOCK_SIZE * 0.375 }, + { 4368, 2136, BLOCK_SIZE * 0.1875, BLOCK_SIZE * -0.375 }, +}; + +Zone room_pricelessfreedom[] = +{ + { 0, 600, BLOCK_SIZE * 3.140625, BLOCK_SIZE * 1.875 }, + { 536, 600, BLOCK_SIZE * 1.0625, BLOCK_SIZE * 4.6875 }, + { 402, 1080, BLOCK_SIZE * 1.046875, BLOCK_SIZE * 0.9375 }, + { 335, 1140, BLOCK_SIZE * 0.5234375, BLOCK_SIZE * 0.46875 }, + { 0, 1200, BLOCK_SIZE * 1.03125, BLOCK_SIZE * 1 }, + { 399, 1320, BLOCK_SIZE * 3.1640625, BLOCK_SIZE * 0.9375 }, + { 0, 1368, BLOCK_SIZE * 3.140625, BLOCK_SIZE * 3.375 }, + { 672, 600, BLOCK_SIZE * 7.3125, BLOCK_SIZE * 1.875 }, + { 1608, 420, BLOCK_SIZE * 3.1406248, BLOCK_SIZE * 2.34375 }, + { 2144, 420, BLOCK_SIZE * 1.0390625, BLOCK_SIZE * 3.3125 }, + { 2011, 840, BLOCK_SIZE * 2.078125, BLOCK_SIZE * 2.875 }, + { 1340, 1080, BLOCK_SIZE * 1.125, BLOCK_SIZE * 3.28125 }, + { 938, 1080, BLOCK_SIZE * 2.09375, BLOCK_SIZE * 2.8203125 }, + { 1484, 1208, BLOCK_SIZE * 0.96875, BLOCK_SIZE * 2.28125 }, + { 1608, 1208, BLOCK_SIZE * 6.28125, BLOCK_SIZE * 1.8125 }, + { 2412, 1136, BLOCK_SIZE * 1.046875, BLOCK_SIZE * 2.84375 }, + { 2544, 720, BLOCK_SIZE * 1, BLOCK_SIZE * 3.2812502 }, + { 2948, 720, BLOCK_SIZE * 6.96875, BLOCK_SIZE * 1.8750002 }, + { 2948, 1430, BLOCK_SIZE * 2.09375, BLOCK_SIZE * 0.546875 }, + { 2546, 1440, BLOCK_SIZE * 3.140625, BLOCK_SIZE * 0.46875 }, + { 2816, 1350, BLOCK_SIZE * 1.03125, BLOCK_SIZE * 0.703125 }, + { 400, 1680, BLOCK_SIZE * 21.101562, BLOCK_SIZE * 0.9375 }, + { 1340, 1600, BLOCK_SIZE * 1.046875, BLOCK_SIZE * 0.62500006 }, + { 1876, 1590, BLOCK_SIZE * 1.046875, BLOCK_SIZE * 0.70312506 }, + { 2278, 1590, BLOCK_SIZE * 1.046875, BLOCK_SIZE * 0.70312506 }, + { 3417, 1530, BLOCK_SIZE * 1.5781254, BLOCK_SIZE * 0.87500006 }, + { 2392, 540.00006, BLOCK_SIZE * 0.671875, BLOCK_SIZE * 5.21875 }, + { 2576, 640, BLOCK_SIZE * 0.8125, BLOCK_SIZE * 0.62500024 }, + { 2881, 280, BLOCK_SIZE * 1.046875, BLOCK_SIZE * 0.625 }, + { 2816, 360, BLOCK_SIZE * 6.7890625, BLOCK_SIZE * 0.9375 }, + { 2613, 451, BLOCK_SIZE * 1.5859375, BLOCK_SIZE * 0.22656274 }, + { 3350, 270, BLOCK_SIZE * 1.046875, BLOCK_SIZE * 0.703125 }, + { 3216, 630, BLOCK_SIZE * 1.046875, BLOCK_SIZE * 0.703125 }, + { 3618, 630, BLOCK_SIZE * 1.046875, BLOCK_SIZE * 0.703125 }, + { 4020, -1, BLOCK_SIZE * 2.078125, BLOCK_SIZE * 14.0703125 }, + { 3618, 1140, BLOCK_SIZE * 3.140625, BLOCK_SIZE * 5.15625 }, + { -16, 0, BLOCK_SIZE * 0.125, BLOCK_SIZE * 14.0625 }, + { 3912, 712, BLOCK_SIZE * 0.84375, BLOCK_SIZE * 3.3437502 }, + { 2672, 720, BLOCK_SIZE * 1.109375, BLOCK_SIZE * 1.8750002 }, + { 3840, 712, BLOCK_SIZE * 0.125, BLOCK_SIZE * 1.9375001 }, + { -37, -32, BLOCK_SIZE * 33.765625, BLOCK_SIZE * 0.25781298 }, + { 0, 1320, BLOCK_SIZE * 3.140625, BLOCK_SIZE * 0.375 }, + { 128, 1272, BLOCK_SIZE * 1.265625, BLOCK_SIZE * 0.375 }, + { 3101, 1680, BLOCK_SIZE * 4.039063, BLOCK_SIZE * 0.9375 }, + { 3181, 1640, BLOCK_SIZE * 3.414063, BLOCK_SIZE * 0.3125 }, + { 3272, 1600, BLOCK_SIZE * 1.132813, BLOCK_SIZE * 0.3125 }, + { 3320, 1576, BLOCK_SIZE * 0.757813, BLOCK_SIZE * 0.1875 }, + { 2720, 1400, BLOCK_SIZE * 0.75, BLOCK_SIZE * 0.3125 }, + { 2768, 1376, BLOCK_SIZE * 0.375, BLOCK_SIZE * 0.1875 }, + { 2672, 1416, BLOCK_SIZE * 0.375, BLOCK_SIZE * 0.1875 }, + { 2277, 540, BLOCK_SIZE * 0.8984375, BLOCK_SIZE * 5.21875 }, + { 2478, 608, BLOCK_SIZE * 0.515625, BLOCK_SIZE * 4.125 }, + { 2277, 516, BLOCK_SIZE * 0.757813, BLOCK_SIZE * 0.1875 }, + { 2277, 492, BLOCK_SIZE * 0.5312505, BLOCK_SIZE * 0.1875 }, + { 2277, 468, BLOCK_SIZE * 0.34375048, BLOCK_SIZE * 0.1875 }, + { 2478, 584, BLOCK_SIZE * 0.32812548, BLOCK_SIZE * 0.1875 }, + { 2478, 560, BLOCK_SIZE * 0.14062548, BLOCK_SIZE * 0.1875 }, + { 2544, 640, BLOCK_SIZE * 0.25000048, BLOCK_SIZE * 0.625 }, + { 3176, 680, BLOCK_SIZE * 0.31250048, BLOCK_SIZE * 0.3125 }, + { 3144, 696, BLOCK_SIZE * 0.25000048, BLOCK_SIZE * 0.1875 }, + { 3350, 680, BLOCK_SIZE * 0.31250048, BLOCK_SIZE * 0.3125 }, + { 3390, 696, BLOCK_SIZE * 0.25781298, BLOCK_SIZE * 0.1875 }, + { 3544, 696, BLOCK_SIZE * 0.37500048, BLOCK_SIZE * 0.1875 }, + { 3592, 673, BLOCK_SIZE * 0.25000048, BLOCK_SIZE * 0.3671875 }, + { 3752, 681, BLOCK_SIZE * 0.31250048, BLOCK_SIZE * 0.3046875 }, + { 3792, 704, BLOCK_SIZE * 0.31250048, BLOCK_SIZE * 0.125 }, + { 1484.0004, 1080, BLOCK_SIZE * 4.117188, BLOCK_SIZE * 1 }, + { 1760, 954, BLOCK_SIZE * 1.9687504, BLOCK_SIZE * 0.984375 }, + { 1600, 1026, BLOCK_SIZE * 1.2500004, BLOCK_SIZE * 0.421875 }, + { 1865, 907, BLOCK_SIZE * 1.1406254, BLOCK_SIZE * 0.3671875 }, + { 1344, 544, BLOCK_SIZE * 2.078125, BLOCK_SIZE * 0.4375 }, + { 1464, 488, BLOCK_SIZE * 1.140625, BLOCK_SIZE * 0.4375 }, +}; + +Zone room_ravinemist[] = +{ + { -16, 0, BLOCK_SIZE * 0.125, BLOCK_SIZE * 15.398438 }, + { 3128, 0, BLOCK_SIZE * 0.125, BLOCK_SIZE * 19.773438 }, + { 0, 0, BLOCK_SIZE * 6.375, BLOCK_SIZE * 2.25 }, + { 816, 288, BLOCK_SIZE * 1.0625, BLOCK_SIZE * 1.40625 }, + { 0, 288, BLOCK_SIZE * 6.375, BLOCK_SIZE * 1 }, + { 952, 340, BLOCK_SIZE * 1.0625, BLOCK_SIZE * 1.40625 }, + { 1088, 392, BLOCK_SIZE * 2.125, BLOCK_SIZE * 1 }, + { 812, 416, BLOCK_SIZE * 0.03125, BLOCK_SIZE * 0.40625 }, + { 0, 416, BLOCK_SIZE * 2.125, BLOCK_SIZE * 2.03125 }, + { 272, 600, BLOCK_SIZE * 1.0625, BLOCK_SIZE * 0.59375 }, + { 1088, 0, BLOCK_SIZE * 2.125, BLOCK_SIZE * 1.625 }, + { 1360, 0, BLOCK_SIZE * 7.4375005, BLOCK_SIZE * 1.21875 }, + { 2312, 0, BLOCK_SIZE * 2.1250005, BLOCK_SIZE * 1.625 }, + { 2448, 208, BLOCK_SIZE * 1.0625005, BLOCK_SIZE * 0.40625 }, + { 2720, 288, BLOCK_SIZE * 3.1875005, BLOCK_SIZE * 1 }, + { 2584, 340, BLOCK_SIZE * 1.0625005, BLOCK_SIZE * 1 }, + { 1768, 392, BLOCK_SIZE * 6.3750005, BLOCK_SIZE * 0.59375 }, + { 1496, 444, BLOCK_SIZE * 2.1250005, BLOCK_SIZE * 1 }, + { 1768, 520, BLOCK_SIZE * 1.0625005, BLOCK_SIZE * 0.40625 }, + { 1496, 572, BLOCK_SIZE * 1.0625005, BLOCK_SIZE * 0.8125 }, + { 1360, 600, BLOCK_SIZE * 1.0625005, BLOCK_SIZE * 0.59375 }, + { 1088, 652, BLOCK_SIZE * 1.0625005, BLOCK_SIZE * 0.59375 }, + { 816, 652, BLOCK_SIZE * 2.1250005, BLOCK_SIZE * 3.03125 }, + { 680, 704, BLOCK_SIZE * 1.0625005, BLOCK_SIZE * 2.6250002 }, + { 544, 756, BLOCK_SIZE * 1.0625005, BLOCK_SIZE * 2.2187502 }, + { 272, 808, BLOCK_SIZE * 2.1250005, BLOCK_SIZE * 1.8125002 }, + { 1088, 860, BLOCK_SIZE * 6.3750005, BLOCK_SIZE * 1.40625 }, + { 1496, 808, BLOCK_SIZE * 3.1875007, BLOCK_SIZE * 0.40625003 }, + { 1904, 860, BLOCK_SIZE * 1.0625007, BLOCK_SIZE * 5.46875 }, + { 0, 1120, BLOCK_SIZE * 1.0625007, BLOCK_SIZE * 0.99999994 }, + { 136, 1172, BLOCK_SIZE * 2.1250007, BLOCK_SIZE * 0.59374994 }, + { 1360, 1276, BLOCK_SIZE * 2.1250007, BLOCK_SIZE * 1.40625 }, + { 1224, 1224, BLOCK_SIZE * 1.0625007, BLOCK_SIZE * 1.40625 }, + { 680.0001, 1224, BLOCK_SIZE * 4.250001, BLOCK_SIZE * 1 }, + { 544, 1276, BLOCK_SIZE * 2.125001, BLOCK_SIZE * 1 }, + { 272, 1328, BLOCK_SIZE * 3.187501, BLOCK_SIZE * 1 }, + { 136, 1640, BLOCK_SIZE * 3.187501, BLOCK_SIZE * 1.40625 }, + { 544, 1692, BLOCK_SIZE * 2.125001, BLOCK_SIZE * 1 }, + { 0, 1952, BLOCK_SIZE * 3.187501, BLOCK_SIZE * 1.40625 }, + { 272, 2264, BLOCK_SIZE * 2.125001, BLOCK_SIZE * 1.8125001 }, + { 0, 2132, BLOCK_SIZE * 2.125001, BLOCK_SIZE * 2.4375 }, + { 544, 1952, BLOCK_SIZE * 2.125001, BLOCK_SIZE * 1 }, + { 680, 2004, BLOCK_SIZE * 3.187501, BLOCK_SIZE * 1 }, + { 1088, 1952, BLOCK_SIZE * 3.187501, BLOCK_SIZE * 1.40625 }, + { 1360, 1744, BLOCK_SIZE * 2.125001, BLOCK_SIZE * 1.6250001 }, + { 1088, 1692, BLOCK_SIZE * 2.125001, BLOCK_SIZE * 1 }, + { 1224, 1820, BLOCK_SIZE * 1.062501, BLOCK_SIZE * 0.40625 }, + { 1632, 1796, BLOCK_SIZE * 2.125001, BLOCK_SIZE * 1.8125001 }, + { 1496, 1952, BLOCK_SIZE * 1.062501, BLOCK_SIZE * 1.4062501 }, + { 680, 2264, BLOCK_SIZE * 7.4375014, BLOCK_SIZE * 1.8125001 }, + { 1768, 2368, BLOCK_SIZE * 2.1250014, BLOCK_SIZE * 0.9843751 }, + { 2040, 2316, BLOCK_SIZE * 3.1875014, BLOCK_SIZE * 1.3906251 }, + { 2448, 2264, BLOCK_SIZE * 4.2500014, BLOCK_SIZE * 1.796875 }, + { 2992.0005, 416, BLOCK_SIZE * 1.0625005, BLOCK_SIZE * 7.437499 }, + { 2720, 600, BLOCK_SIZE * 2.1250005, BLOCK_SIZE * 0.9999991 }, + { 2312, 520, BLOCK_SIZE * 1.0625005, BLOCK_SIZE * 3.249999 }, + { 2448, 808, BLOCK_SIZE * 1.0625005, BLOCK_SIZE * 1.406249 }, + { 2584, 860, BLOCK_SIZE * 1.0625005, BLOCK_SIZE * 1.406249 }, + { 2720, 912, BLOCK_SIZE * 1.0625005, BLOCK_SIZE * 1.406249 }, + { 2040, 1172, BLOCK_SIZE * 3.1875005, BLOCK_SIZE * 1.406249 }, + { 2448, 1224, BLOCK_SIZE * 3.1875005, BLOCK_SIZE * 0.999999 }, + { 1992, 1352.0669, BLOCK_SIZE * 1.4375005, BLOCK_SIZE * 4.468749 }, + { 2040, 1924, BLOCK_SIZE * 1.0625005, BLOCK_SIZE * 1.624999 }, + { 2176, 1952, BLOCK_SIZE * 1.0625005, BLOCK_SIZE * 1.406249 }, + { 2448, 1952, BLOCK_SIZE * 4.2500005, BLOCK_SIZE * 1.406249 }, + { 2312, 1760, BLOCK_SIZE * 3.1875005, BLOCK_SIZE * 0.71874905 }, + { 2448, 1536, BLOCK_SIZE * 1.0625005, BLOCK_SIZE * 0.99999905 }, + { 2584, 1484, BLOCK_SIZE * 2.1250005, BLOCK_SIZE * 0.99999905 }, + { 2856, 1432.0018, BLOCK_SIZE * 1.0625005, BLOCK_SIZE * 4.062499 }, + { 1768, 468, BLOCK_SIZE * 5.3125005, BLOCK_SIZE * 0.40625 }, + { 792, -16, BLOCK_SIZE * 18.374998, BLOCK_SIZE * 0.125 }, + { 2992, 2264, BLOCK_SIZE * 0.125, BLOCK_SIZE * 0.125 }, +}; + +Zone room_torturecave[] = +{ + { 960, -504, BLOCK_SIZE * 1, BLOCK_SIZE * 3.9375 }, + { 1280, -504, BLOCK_SIZE * 1, BLOCK_SIZE * 3.9375 }, + { 960, -520, BLOCK_SIZE * 3.5, BLOCK_SIZE * 0.125 }, + { 1632, 736, BLOCK_SIZE * 0.25, BLOCK_SIZE * 0.25 }, + { 928, 736, BLOCK_SIZE * 0.25, BLOCK_SIZE * 0.25 }, + { 3520, -504, BLOCK_SIZE * 1, BLOCK_SIZE * 3.9375 }, + { 3776, -504, BLOCK_SIZE * 1, BLOCK_SIZE * 3.9375 }, + { 3520, -520, BLOCK_SIZE * 3, BLOCK_SIZE * 0.125 }, + { 4080, 800, BLOCK_SIZE * 0.25, BLOCK_SIZE * 0.25 }, + { 4000, 832, BLOCK_SIZE * 0.25, BLOCK_SIZE * 0.25 }, + { 3760, 1112, BLOCK_SIZE * 0.25, BLOCK_SIZE * 0.3125 }, + { 3808, 864, BLOCK_SIZE * 0.125, BLOCK_SIZE * 0.125 }, + { 4608, 954, BLOCK_SIZE * 1, BLOCK_SIZE * 0.25 }, +}; + +Zone room_volcanovalley[] = +{ + { 128, 784, BLOCK_SIZE * 1, BLOCK_SIZE * 0.15625 }, + { 384, 784, BLOCK_SIZE * 1, BLOCK_SIZE * 1.375 }, + { 512, 848, BLOCK_SIZE * 1, BLOCK_SIZE * 0.875 }, + { 640, 784, BLOCK_SIZE * 1, BLOCK_SIZE * 1.375 }, + { 256, 1088, BLOCK_SIZE * 8, BLOCK_SIZE * 1 }, + { 832, 992, BLOCK_SIZE * 3.5, BLOCK_SIZE * 0.75 }, + { 1152, 1344, BLOCK_SIZE * 2.5, BLOCK_SIZE * 2.5 }, + { 1599.9998, 1408, BLOCK_SIZE * 0.4921875, BLOCK_SIZE * 2 }, + { 1668, 1536, BLOCK_SIZE * 2.46875, BLOCK_SIZE * 1 }, + { 2240, 1536, BLOCK_SIZE * 1, BLOCK_SIZE * 0.25 }, + { 2624, 1536, BLOCK_SIZE * 1.5, BLOCK_SIZE * 1 }, + { 2944, 1536, BLOCK_SIZE * 1.53125, BLOCK_SIZE * 1 }, + { 3265, 1408, BLOCK_SIZE * 1.4921875, BLOCK_SIZE * 2 }, + { 3584, 1408, BLOCK_SIZE * 2, BLOCK_SIZE * 2 }, + { 3840, 1344, BLOCK_SIZE * 1.5, BLOCK_SIZE * 2.5 }, + { 4032, 1088, BLOCK_SIZE * 1, BLOCK_SIZE * 4.5 }, + { 4288, 1088, BLOCK_SIZE * 1, BLOCK_SIZE * 0.5 }, + { 4608, 960, BLOCK_SIZE * 2, BLOCK_SIZE * 5.5 }, + { 4224, 768, BLOCK_SIZE * 1.5, BLOCK_SIZE * 1 }, + { 4032, 704, BLOCK_SIZE * 1.5, BLOCK_SIZE * 1.5 }, + { 3904, 640, BLOCK_SIZE * 1.5, BLOCK_SIZE * 2 }, + { 3776, 576, BLOCK_SIZE * 1, BLOCK_SIZE * 2.5 }, + { 3712, 832, BLOCK_SIZE * 1, BLOCK_SIZE * 2 }, + { 3456, 896, BLOCK_SIZE * 1.5, BLOCK_SIZE * 1 }, + { 3648, 896, BLOCK_SIZE * 0.5, BLOCK_SIZE * 1.5 }, + { 2880, 1024, BLOCK_SIZE * 1, BLOCK_SIZE * 2 }, + { 3080, 1088, BLOCK_SIZE * 2.0625, BLOCK_SIZE * 1.5 }, + { 3008, 1088, BLOCK_SIZE * 0.5625, BLOCK_SIZE * 1.5 }, + { 2432, 960, BLOCK_SIZE * 2, BLOCK_SIZE * 3 }, + { 1920, 960, BLOCK_SIZE * 1.5, BLOCK_SIZE * 3 }, + { 2112, 1088, BLOCK_SIZE * 2.5, BLOCK_SIZE * 2 }, + { 1472, 1104, BLOCK_SIZE * 3.5, BLOCK_SIZE * 0.875 }, + { 3776, 0, BLOCK_SIZE * 9.5, BLOCK_SIZE * 2.5 }, + { 4864, 320, BLOCK_SIZE * 1, BLOCK_SIZE * 10.5 }, + { 0, 1280, BLOCK_SIZE * 0.75, BLOCK_SIZE * 0.9375 }, + { 308, 1408, BLOCK_SIZE * 1.59375, BLOCK_SIZE * 2 }, + { 640, 1376, BLOCK_SIZE * 1, BLOCK_SIZE * 0.5 }, + { 896, 1376, BLOCK_SIZE * 1, BLOCK_SIZE * 0.5 }, + { 224, 1344, BLOCK_SIZE * 0.25, BLOCK_SIZE * 0.25 }, + { 992, 912, BLOCK_SIZE * 0.75, BLOCK_SIZE * 0.625 }, + { 768, 912, BLOCK_SIZE * 0.75, BLOCK_SIZE * 0.375 }, + { 832, 960, BLOCK_SIZE * 1.25, BLOCK_SIZE * 0.25 }, + { 1984, 1555, BLOCK_SIZE * 5, BLOCK_SIZE * 0.8515625 }, + { 3456, 1425, BLOCK_SIZE * 1, BLOCK_SIZE * 1.8671875 }, + { 512, 1426, BLOCK_SIZE * 5, BLOCK_SIZE * 1.859375 }, + { 4288, 1088, BLOCK_SIZE * 1, BLOCK_SIZE * 4.5 }, + { 2112, 994, BLOCK_SIZE * 2.5, BLOCK_SIZE * 0.734375 }, + { -40, 0, BLOCK_SIZE * 0.3125, BLOCK_SIZE * 13 }, + { 4992, 0, BLOCK_SIZE * 0.3125, BLOCK_SIZE * 13 }, + { 3344, 1168, BLOCK_SIZE * 1.5, BLOCK_SIZE * 0.875 }, + { 4160, 1176, BLOCK_SIZE * 1, BLOCK_SIZE * 1.3125 }, + { 512, 795, BLOCK_SIZE * 1, BLOCK_SIZE * 1.2890625 }, + { 1472, 1423, BLOCK_SIZE * 0.9921875, BLOCK_SIZE * 1.96875 }, + { 2816, 1551, BLOCK_SIZE * 1, BLOCK_SIZE * 1.9453125 }, + { 4160, 1107.7958, BLOCK_SIZE * 1, BLOCK_SIZE * 4.345703 }, + { 0, 804, BLOCK_SIZE * 2, BLOCK_SIZE * 1.21875 }, + { 3137, 1472, BLOCK_SIZE * 1.015625, BLOCK_SIZE * 1.5 }, + { 1672, 1480, BLOCK_SIZE * 1.03125, BLOCK_SIZE * 0.43750003 }, + { 1672, 1452, BLOCK_SIZE * 0.625, BLOCK_SIZE * 0.21875004 }, + { 3193, 1444, BLOCK_SIZE * 0.5625, BLOCK_SIZE * 0.21875004 }, + { 1804, 1508, BLOCK_SIZE * 0.453125, BLOCK_SIZE * 0.21875004 }, + { 4416, 1088, BLOCK_SIZE * 1.4999999, BLOCK_SIZE * 4.5 }, + { 0, 1400, BLOCK_SIZE * 2.40625, BLOCK_SIZE * 2.0625 }, +}; + +Zone room_weedzone[] = +{ + { 0, 512, BLOCK_SIZE * 2, BLOCK_SIZE * 2.5 }, + { 0, 832, BLOCK_SIZE * 4.5, BLOCK_SIZE * 2 }, + { 576, 896, BLOCK_SIZE * 5, BLOCK_SIZE * 1.5 }, + { 512, 512, BLOCK_SIZE * 1, BLOCK_SIZE * 1 }, + { 640, 576, BLOCK_SIZE * 3, BLOCK_SIZE * 1 }, + { 896, 704, BLOCK_SIZE * 1, BLOCK_SIZE * 0.5 }, + { 848, 192, BLOCK_SIZE * 2.375, BLOCK_SIZE * 0.5 }, + { 976, 256, BLOCK_SIZE * 1.375, BLOCK_SIZE * 2 }, + { 1120, 512, BLOCK_SIZE * 0.375, BLOCK_SIZE * 2.5 }, + { 1152, 384, BLOCK_SIZE * 0.5, BLOCK_SIZE * 1.25 }, + { 1216, 384, BLOCK_SIZE * 2, BLOCK_SIZE * 0.125 }, + { 1344, 400, BLOCK_SIZE * 1, BLOCK_SIZE * 0.375 }, + { 1408, 448, BLOCK_SIZE * 0.75, BLOCK_SIZE * 0.625 }, + { 1504, 480, BLOCK_SIZE * 0.375, BLOCK_SIZE * 0.375 }, + { 1536, 512, BLOCK_SIZE * 3, BLOCK_SIZE * 0.5 }, + { 1600, 576, BLOCK_SIZE * 2.5, BLOCK_SIZE * 0.5 }, + { 1792, 640, BLOCK_SIZE * 1, BLOCK_SIZE * 0.5 }, + { 2080, 512, BLOCK_SIZE * 8.75, BLOCK_SIZE * 0.5 }, + { 2304, 576, BLOCK_SIZE * 2.5, BLOCK_SIZE * 0.5 }, + { 2304, 640, BLOCK_SIZE * 1, BLOCK_SIZE * 0.5 }, + { 2432, 448, BLOCK_SIZE * 11.5, BLOCK_SIZE * 0.5 }, + { 3776, 512, BLOCK_SIZE * 1, BLOCK_SIZE * 0.5 }, + { 3680, 256, BLOCK_SIZE * 1.75, BLOCK_SIZE * 1.5 }, + { 3136, 384, BLOCK_SIZE * 2.25, BLOCK_SIZE * 0.5 }, + { 2688, 384, BLOCK_SIZE * 2, BLOCK_SIZE * 0.5 }, + { 2688, 192, BLOCK_SIZE * 1.75, BLOCK_SIZE * 0.5 }, + { 2688, 256, BLOCK_SIZE * 1, BLOCK_SIZE * 1 }, + { 1664, 0, BLOCK_SIZE * 6, BLOCK_SIZE * 1 }, + { 1792, 128, BLOCK_SIZE * 5, BLOCK_SIZE * 1 }, + { 1792, 256, BLOCK_SIZE * 1, BLOCK_SIZE * 0.5 }, + { 2304, 256, BLOCK_SIZE * 1, BLOCK_SIZE * 0.5 }, + { 1728, 896, BLOCK_SIZE * 6.4999995, BLOCK_SIZE * 1.5 }, + { 2560, 896, BLOCK_SIZE * 4, BLOCK_SIZE * 1.5 }, + { 3072, 976, BLOCK_SIZE * 1.5, BLOCK_SIZE * 0.875 }, + { 3264, 960, BLOCK_SIZE * 0.5, BLOCK_SIZE * 0.125 }, + { 3584, 960, BLOCK_SIZE * 0.5, BLOCK_SIZE * 0.125 }, + { 3648, 960, BLOCK_SIZE * 2.5, BLOCK_SIZE * 1 }, + { 3840, 704, BLOCK_SIZE * 1, BLOCK_SIZE * 2 }, + { 3776, 896, BLOCK_SIZE * 0.5, BLOCK_SIZE * 0.5 }, + { 2944, 704, BLOCK_SIZE * 1, BLOCK_SIZE * 1.5 }, + { 2816, 768, BLOCK_SIZE * 1, BLOCK_SIZE * 1 }, + { 4480, 832, BLOCK_SIZE * 1, BLOCK_SIZE * 2 }, + { 4576, 816, BLOCK_SIZE * 0.25, BLOCK_SIZE * 0.625 }, + { 4856, 672, BLOCK_SIZE * 1.0625, BLOCK_SIZE * 3.2499998 }, + { 4416, 544, BLOCK_SIZE * 1, BLOCK_SIZE * 0.5 }, + { 4480, 608, BLOCK_SIZE * 1, BLOCK_SIZE * 0.5 }, + { 4160, 512, BLOCK_SIZE * 1, BLOCK_SIZE * 0.125 }, + { 4352, 544, BLOCK_SIZE * 0.5, BLOCK_SIZE * 0.125 }, + { 4416, 256, BLOCK_SIZE * 2, BLOCK_SIZE * 1 }, + { 4672, 256, BLOCK_SIZE * 1, BLOCK_SIZE * 0.5 }, + { 4480, 192, BLOCK_SIZE * 0.5, BLOCK_SIZE * 0.5 }, + { 640, 528, BLOCK_SIZE * 0.5, BLOCK_SIZE * 0.375 }, + { 704, 544, BLOCK_SIZE * 0.375, BLOCK_SIZE * 0.25 }, + { 576, 848, BLOCK_SIZE * 0.5, BLOCK_SIZE * 0.375 }, + { 640, 864, BLOCK_SIZE * 0.375, BLOCK_SIZE * 0.25 }, + { 2048, 848, BLOCK_SIZE * 0.5, BLOCK_SIZE * 0.375 }, + { 2112, 864, BLOCK_SIZE * 0.375, BLOCK_SIZE * 0.25 }, + { 1920, 832, BLOCK_SIZE * 1, BLOCK_SIZE * 0.5 }, + { 3072, 896, BLOCK_SIZE * 0.5, BLOCK_SIZE * 0.625 }, + { 3136, 928, BLOCK_SIZE * 0.5, BLOCK_SIZE * 0.375 }, + { 3712, 928, BLOCK_SIZE * 0.5, BLOCK_SIZE * 0.25 }, + { 3200, 960, BLOCK_SIZE * 0.5, BLOCK_SIZE * 0.125 }, + { 4544, 208, BLOCK_SIZE * 0.5, BLOCK_SIZE * 0.375 }, + { 4608, 224, BLOCK_SIZE * 0.375, BLOCK_SIZE * 0.25 }, + { 2368, 464, BLOCK_SIZE * 0.5, BLOCK_SIZE * 0.375 }, + { 2320, 480, BLOCK_SIZE * 0.375, BLOCK_SIZE * 0.25 }, + { -20, 0, BLOCK_SIZE * 0.15625, BLOCK_SIZE * 8.53125 }, + { 4992, 0, BLOCK_SIZE * 0.15625, BLOCK_SIZE * 8.53125 }, + { -20, -20, BLOCK_SIZE * 39.3125, BLOCK_SIZE * 0.15625048 }, + { 4608, 816, BLOCK_SIZE * 2.09375, BLOCK_SIZE * 2.125 }, + { 4744, 744, BLOCK_SIZE * 0.3125, BLOCK_SIZE * 0.5625 }, + { 4784, 708, BLOCK_SIZE * 0.71875, BLOCK_SIZE * 0.84375 }, + { 4668, 776, BLOCK_SIZE * 0.59375, BLOCK_SIZE * 0.3125 }, + { 3424, 384, BLOCK_SIZE * 1.75, BLOCK_SIZE * 0.5 }, + { 3604, 296, BLOCK_SIZE * 0.34375, BLOCK_SIZE * 0.6875 }, + { 3516, 340, BLOCK_SIZE * 0.6875, BLOCK_SIZE * 0.34375 }, + { 3648, 276, BLOCK_SIZE * 0.25, BLOCK_SIZE * 1.34375 }, +}; + +Zone room_youcantrun[] = +{ + { 2816, 0, BLOCK_SIZE * 6, BLOCK_SIZE * 4.1875 }, + { 2560, -4, BLOCK_SIZE * 1.25, BLOCK_SIZE * 6.03125 }, + { 2688, 768, BLOCK_SIZE * 0.25, BLOCK_SIZE * 0.625 }, + { 2816, 672, BLOCK_SIZE * 1, BLOCK_SIZE * 1 }, + { 2912, 896, BLOCK_SIZE * 0.75, BLOCK_SIZE * 0.5 }, + { 3008, 864, BLOCK_SIZE * 4.53125, BLOCK_SIZE * 3.0625 }, + { 3072, 536, BLOCK_SIZE * 4.03125, BLOCK_SIZE * 2.5625 }, + { 2752, 928, BLOCK_SIZE * 1.25, BLOCK_SIZE * 0.25 }, + { 2560, 960, BLOCK_SIZE * 0.5, BLOCK_SIZE * 3.3125 }, + { 2624, 1256, BLOCK_SIZE * 7.5000005, BLOCK_SIZE * 1 }, + { 3328, 1384, BLOCK_SIZE * 2, BLOCK_SIZE * 7.1875 }, + { 3072, 1888, BLOCK_SIZE * 2, BLOCK_SIZE * 3.25 }, + { 2304, 2048, BLOCK_SIZE * 6, BLOCK_SIZE * 2 }, + { 2112, 1984, BLOCK_SIZE * 1.5, BLOCK_SIZE * 2.5 }, + { 1920, 1952, BLOCK_SIZE * 1.5, BLOCK_SIZE * 2.75 }, + { 1688, 1984, BLOCK_SIZE * 0.8125, BLOCK_SIZE * 2.5 }, + { 1280, 1984, BLOCK_SIZE * 3.1875, BLOCK_SIZE * 2.5 }, + { 1024, 2016, BLOCK_SIZE * 2, BLOCK_SIZE * 2.25 }, + { 1024, 1984, BLOCK_SIZE * 0.5, BLOCK_SIZE * 0.25 }, + { 1088, 1952, BLOCK_SIZE * 0.5, BLOCK_SIZE * 0.5 }, + { 1216, 1920, BLOCK_SIZE * 0.5, BLOCK_SIZE * 0.75 }, + { 896, 2048, BLOCK_SIZE * 1, BLOCK_SIZE * 2 }, + { 768, 2208, BLOCK_SIZE * 1, BLOCK_SIZE * 0.75 }, + { 640, 2112, BLOCK_SIZE * 0.5, BLOCK_SIZE * 1.5 }, + { 704, 2144, BLOCK_SIZE * 0.5, BLOCK_SIZE * 1.25 }, + { 576, 2080, BLOCK_SIZE * 0.5, BLOCK_SIZE * 1.75 }, + { 512, 2048, BLOCK_SIZE * 0.5, BLOCK_SIZE * 2 }, + { 256, 1632, BLOCK_SIZE * 2, BLOCK_SIZE * 5.25 }, + { 0, 768, BLOCK_SIZE * 2, BLOCK_SIZE * 12.000001 }, + { 256, 1216, BLOCK_SIZE * 4, BLOCK_SIZE * 1.3750001 }, + { 768, 1440, BLOCK_SIZE * 1, BLOCK_SIZE * 1 }, + { 640, 1632, BLOCK_SIZE * 1, BLOCK_SIZE * 3 }, + { 768, 1632, BLOCK_SIZE * 0.5, BLOCK_SIZE * 2.125 }, + { 960, 1664, BLOCK_SIZE * 0.5, BLOCK_SIZE * 1.875 }, + { 832, 1712, BLOCK_SIZE * 1, BLOCK_SIZE * 1.5 }, + { 1024, 1440, BLOCK_SIZE * 2, BLOCK_SIZE * 3.375 }, + { 1120, 1408, BLOCK_SIZE * 1.25, BLOCK_SIZE * 0.25 }, + { 1280, 1376, BLOCK_SIZE * 1, BLOCK_SIZE * 1.5 }, + { 1216, 1376, BLOCK_SIZE * 0.5, BLOCK_SIZE * 0.25 }, + { 1728, 1408, BLOCK_SIZE * 0.5, BLOCK_SIZE * 3.25 }, + { 1536, 1568, BLOCK_SIZE * 0.5, BLOCK_SIZE * 2 }, + { 1792, 1536, BLOCK_SIZE * 0.5, BLOCK_SIZE * 2.25 }, + { 1856, 1568, BLOCK_SIZE * 0.5, BLOCK_SIZE * 2 }, + { 1920, 1600, BLOCK_SIZE * 0.5, BLOCK_SIZE * 1.7500001 }, + { 1984, 1632, BLOCK_SIZE * 2.5, BLOCK_SIZE * 1.5 }, + { 1408, 1696, BLOCK_SIZE * 1, BLOCK_SIZE * 1.125 }, + { 2304, 1696, BLOCK_SIZE * 0.75, BLOCK_SIZE * 1 }, + { 2400, 1664, BLOCK_SIZE * 0.75, BLOCK_SIZE * 1.25 }, + { 2496, 1632, BLOCK_SIZE * 0.5, BLOCK_SIZE * 1.5 }, + { 2560, 1536, BLOCK_SIZE * 2, BLOCK_SIZE * 2.25 }, + { 2176, 1280, BLOCK_SIZE * 1, BLOCK_SIZE * 2.25 }, + { 2304, 1440, BLOCK_SIZE * 1, BLOCK_SIZE * 1 }, + { 896, 1184, BLOCK_SIZE * 5, BLOCK_SIZE * 0.75 }, + { 384, 672, BLOCK_SIZE * 1.75, BLOCK_SIZE * 3.625 }, + { 608, 640, BLOCK_SIZE * 0.75, BLOCK_SIZE * 3.875 }, + { 704, 608, BLOCK_SIZE * 0.5, BLOCK_SIZE * 4.125 }, + { 768, 608, BLOCK_SIZE * 4, BLOCK_SIZE * 2.125 }, + { 768, 1008, BLOCK_SIZE * 2.5, BLOCK_SIZE * 0.375 }, + { 960, 960, BLOCK_SIZE * 1, BLOCK_SIZE * 0.375 }, + { 768, 928, BLOCK_SIZE * 0.5, BLOCK_SIZE * 0.625 }, + { 1216, 960, BLOCK_SIZE * 1, BLOCK_SIZE * 1.75 }, + { 1344, 960, BLOCK_SIZE * 3.5, BLOCK_SIZE * 1.3750001 }, + { 1792, 960, BLOCK_SIZE * 2, BLOCK_SIZE * 0.75 }, + { 1408, 512, BLOCK_SIZE * 3, BLOCK_SIZE * 2.2500002 }, + { 1408, 800, BLOCK_SIZE * 1, BLOCK_SIZE * 0.625 }, + { 1792, 2207, BLOCK_SIZE * 1, BLOCK_SIZE * 0.765625 }, + { 1600, 1792, BLOCK_SIZE * 1, BLOCK_SIZE * 0.25 }, + { 1408, 1840, BLOCK_SIZE * 1, BLOCK_SIZE * 0.5 }, + { 1344, 1136, BLOCK_SIZE * 1.5, BLOCK_SIZE * 0.37500018 }, + { -20, 0, BLOCK_SIZE * 0.15625, BLOCK_SIZE * 6.46875 }, + { 1536, 1376, BLOCK_SIZE * 0.5, BLOCK_SIZE * 1.5 }, + { 1024, 4.5776367E-05, BLOCK_SIZE * 2, BLOCK_SIZE * 4.03125 }, + { 768, 0, BLOCK_SIZE * 2, BLOCK_SIZE * 2.8750002 }, + { 512, 6.1035156E-05, BLOCK_SIZE * 2, BLOCK_SIZE * 4 }, + { 256, 3.0517578E-05, BLOCK_SIZE * 2, BLOCK_SIZE * 4.21875 }, + { 0, 4.0000305, BLOCK_SIZE * 2, BLOCK_SIZE * 4.75 }, + { 1276, -20, BLOCK_SIZE * 10.125, BLOCK_SIZE * 0.15625024 }, + { 896, 1280, BLOCK_SIZE * 1, BLOCK_SIZE * 0.1875 }, + { 2624, 960, BLOCK_SIZE * 3, BLOCK_SIZE * 2.3125 }, + { 1600, 1408, BLOCK_SIZE * 1, BLOCK_SIZE * 2.9999998 }, + { 832, 1664, BLOCK_SIZE * 1, BLOCK_SIZE * 0.39062476 }, + { 832, 960, BLOCK_SIZE * 1, BLOCK_SIZE * 0.39062476 }, +}; + +Zone* g_mapZone[21] = +{ + room_hideandseek2, + room_ravinemist, + room_dotdotdot, + room_deserttown, + room_youcantrun, + room_limpcity, + room_notperfect, + room_kindandfair, + room_act9, + room_nastyparadise, + room_pricelessfreedom, + room_volcanovalley, + room_greenhill, + room_majongforest, + room_angelisland, + room_torturecave, + room_dartower, + room_haundream, + room_weedzone, + room_marijuna, + room_fartzone +}; + +size_t g_mapZoneSize[21] = +{ + ARRAY_SIZE(room_hideandseek2), + ARRAY_SIZE(room_ravinemist), + ARRAY_SIZE(room_dotdotdot), + ARRAY_SIZE(room_deserttown), + ARRAY_SIZE(room_youcantrun), + ARRAY_SIZE(room_limpcity), + ARRAY_SIZE(room_notperfect), + ARRAY_SIZE(room_kindandfair), + ARRAY_SIZE(room_act9), + ARRAY_SIZE(room_nastyparadise), + ARRAY_SIZE(room_pricelessfreedom), + ARRAY_SIZE(room_volcanovalley), + ARRAY_SIZE(room_greenhill), + ARRAY_SIZE(room_majongforest), + ARRAY_SIZE(room_angelisland), + ARRAY_SIZE(room_torturecave), + ARRAY_SIZE(room_dartower), + ARRAY_SIZE(room_haundream), + ARRAY_SIZE(room_weedzone), + ARRAY_SIZE(room_marijuna), + ARRAY_SIZE(room_fartzone) +}; +#endif diff --git a/disasterserver_c/Zone.h b/disasterserver_c/Zone.h new file mode 100644 index 0000000..7f93334 --- /dev/null +++ b/disasterserver_c/Zone.h @@ -0,0 +1,14 @@ +#ifndef ZONE_H +#define ZONE_H +#include +#include + +typedef struct +{ + double x, y, w, h; +} Zone; + +extern Zone* g_mapZone[21]; +extern size_t g_mapZoneSize[21]; + +#endif \ No newline at end of file diff --git a/disasterserver_c/cJSON.c b/disasterserver_c/cJSON.c new file mode 100644 index 0000000..a994921 --- /dev/null +++ b/disasterserver_c/cJSON.c @@ -0,0 +1,3119 @@ +/* + Copyright (c) 2009-2017 Dave Gamble and cJSON contributors + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + THE SOFTWARE. +*/ + +/* cJSON */ +/* JSON parser in C. */ + +/* disable warnings about old C89 functions in MSVC */ +#if !defined(_CRT_SECURE_NO_DEPRECATE) && defined(_MSC_VER) +#define _CRT_SECURE_NO_DEPRECATE +#endif + +#ifdef __GNUC__ +#pragma GCC visibility push(default) +#endif +#if defined(_MSC_VER) +#pragma warning (push) +/* disable warning about single line comments in system headers */ +#pragma warning (disable : 4001) +#endif + +#include +#include +#include +#include +#include +#include +#include + +#ifdef ENABLE_LOCALES +#include +#endif + +#if defined(_MSC_VER) +#pragma warning (pop) +#endif +#ifdef __GNUC__ +#pragma GCC visibility pop +#endif + +#include "cJSON.h" + +/* define our own boolean type */ +#ifdef true +#undef true +#endif +#define true ((cJSON_bool)1) + +#ifdef false +#undef false +#endif +#define false ((cJSON_bool)0) + +/* define isnan and isinf for ANSI C, if in C99 or above, isnan and isinf has been defined in math.h */ +#ifndef isinf +#define isinf(d) (isnan((d - d)) && !isnan(d)) +#endif +#ifndef isnan +#define isnan(d) (d != d) +#endif + +#ifndef NAN +#ifdef _WIN32 +#define NAN sqrt(-1.0) +#else +#define NAN 0.0/0.0 +#endif +#endif + +typedef struct { + const unsigned char* json; + size_t position; +} error; +static error global_error = { NULL, 0 }; + +CJSON_PUBLIC(const char*) cJSON_GetErrorPtr(void) +{ + return (const char*)(global_error.json + global_error.position); +} + +CJSON_PUBLIC(char*) cJSON_GetStringValue(const cJSON* const item) +{ + if (!cJSON_IsString(item)) + { + return NULL; + } + + return item->valuestring; +} + +CJSON_PUBLIC(double) cJSON_GetNumberValue(const cJSON* const item) +{ + if (!cJSON_IsNumber(item)) + { + return (double)NAN; + } + + return item->valuedouble; +} + +/* This is a safeguard to prevent copy-pasters from using incompatible C and header files */ +#if (CJSON_VERSION_MAJOR != 1) || (CJSON_VERSION_MINOR != 7) || (CJSON_VERSION_PATCH != 16) +#error cJSON.h and cJSON.c have different versions. Make sure that both have the same. +#endif + +CJSON_PUBLIC(const char*) cJSON_Version(void) +{ + static char version[15]; + sprintf(version, "%i.%i.%i", CJSON_VERSION_MAJOR, CJSON_VERSION_MINOR, CJSON_VERSION_PATCH); + + return version; +} + +/* Case insensitive string comparison, doesn't consider two NULL pointers equal though */ +static int case_insensitive_strcmp(const unsigned char* string1, const unsigned char* string2) +{ + if ((string1 == NULL) || (string2 == NULL)) + { + return 1; + } + + if (string1 == string2) + { + return 0; + } + + for (; tolower(*string1) == tolower(*string2); (void)string1++, string2++) + { + if (*string1 == '\0') + { + return 0; + } + } + + return tolower(*string1) - tolower(*string2); +} + +typedef struct internal_hooks +{ + void* (CJSON_CDECL* allocate)(size_t size); + void (CJSON_CDECL* deallocate)(void* pointer); + void* (CJSON_CDECL* reallocate)(void* pointer, size_t size); +} internal_hooks; + +#if defined(_MSC_VER) +/* work around MSVC error C2322: '...' address of dllimport '...' is not static */ +static void* CJSON_CDECL internal_malloc(size_t size) +{ + return malloc(size); +} +static void CJSON_CDECL internal_free(void* pointer) +{ + free(pointer); +} +static void* CJSON_CDECL internal_realloc(void* pointer, size_t size) +{ + return realloc(pointer, size); +} +#else +#define internal_malloc malloc +#define internal_free free +#define internal_realloc realloc +#endif + +/* strlen of character literals resolved at compile time */ +#define static_strlen(string_literal) (sizeof(string_literal) - sizeof("")) + +static internal_hooks global_hooks = { internal_malloc, internal_free, internal_realloc }; + +static unsigned char* cJSON_strdup(const unsigned char* string, const internal_hooks* const hooks) +{ + size_t length = 0; + unsigned char* copy = NULL; + + if (string == NULL) + { + return NULL; + } + + length = strlen((const char*)string) + sizeof(""); + copy = (unsigned char*)hooks->allocate(length); + if (copy == NULL) + { + return NULL; + } + memcpy(copy, string, length); + + return copy; +} + +CJSON_PUBLIC(void) cJSON_InitHooks(cJSON_Hooks* hooks) +{ + if (hooks == NULL) + { + /* Reset hooks */ + global_hooks.allocate = malloc; + global_hooks.deallocate = free; + global_hooks.reallocate = realloc; + return; + } + + global_hooks.allocate = malloc; + if (hooks->malloc_fn != NULL) + { + global_hooks.allocate = hooks->malloc_fn; + } + + global_hooks.deallocate = free; + if (hooks->free_fn != NULL) + { + global_hooks.deallocate = hooks->free_fn; + } + + /* use realloc only if both free and malloc are used */ + global_hooks.reallocate = NULL; + if ((global_hooks.allocate == malloc) && (global_hooks.deallocate == free)) + { + global_hooks.reallocate = realloc; + } +} + +/* Internal constructor. */ +static cJSON* cJSON_New_Item(const internal_hooks* const hooks) +{ + cJSON* node = (cJSON*)hooks->allocate(sizeof(cJSON)); + if (node) + { + memset(node, '\0', sizeof(cJSON)); + } + + return node; +} + +/* Delete a cJSON structure. */ +CJSON_PUBLIC(void) cJSON_Delete(cJSON* item) +{ + cJSON* next = NULL; + while (item != NULL) + { + next = item->next; + if (!(item->type & cJSON_IsReference) && (item->child != NULL)) + { + cJSON_Delete(item->child); + } + if (!(item->type & cJSON_IsReference) && (item->valuestring != NULL)) + { + global_hooks.deallocate(item->valuestring); + } + if (!(item->type & cJSON_StringIsConst) && (item->string != NULL)) + { + global_hooks.deallocate(item->string); + } + global_hooks.deallocate(item); + item = next; + } +} + +/* get the decimal point character of the current locale */ +static unsigned char get_decimal_point(void) +{ +#ifdef ENABLE_LOCALES + struct lconv* lconv = localeconv(); + return (unsigned char)lconv->decimal_point[0]; +#else + return '.'; +#endif +} + +typedef struct +{ + const unsigned char* content; + size_t length; + size_t offset; + size_t depth; /* How deeply nested (in arrays/objects) is the input at the current offset. */ + internal_hooks hooks; +} parse_buffer; + +/* check if the given size is left to read in a given parse buffer (starting with 1) */ +#define can_read(buffer, size) ((buffer != NULL) && (((buffer)->offset + size) <= (buffer)->length)) +/* check if the buffer can be accessed at the given index (starting with 0) */ +#define can_access_at_index(buffer, index) ((buffer != NULL) && (((buffer)->offset + index) < (buffer)->length)) +#define cannot_access_at_index(buffer, index) (!can_access_at_index(buffer, index)) +/* get a pointer to the buffer at the position */ +#define buffer_at_offset(buffer) ((buffer)->content + (buffer)->offset) + +/* Parse the input text to generate a number, and populate the result into item. */ +static cJSON_bool parse_number(cJSON* const item, parse_buffer* const input_buffer) +{ + double number = 0; + unsigned char* after_end = NULL; + unsigned char number_c_string[64]; + unsigned char decimal_point = get_decimal_point(); + size_t i = 0; + + if ((input_buffer == NULL) || (input_buffer->content == NULL)) + { + return false; + } + + /* copy the number into a temporary buffer and replace '.' with the decimal point + * of the current locale (for strtod) + * This also takes care of '\0' not necessarily being available for marking the end of the input */ + for (i = 0; (i < (sizeof(number_c_string) - 1)) && can_access_at_index(input_buffer, i); i++) + { + switch (buffer_at_offset(input_buffer)[i]) + { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case '+': + case '-': + case 'e': + case 'E': + number_c_string[i] = buffer_at_offset(input_buffer)[i]; + break; + + case '.': + number_c_string[i] = decimal_point; + break; + + default: + goto loop_end; + } + } +loop_end: + number_c_string[i] = '\0'; + + number = strtod((const char*)number_c_string, (char**)&after_end); + if (number_c_string == after_end) + { + return false; /* parse_error */ + } + + item->valuedouble = number; + + /* use saturation in case of overflow */ + if (number >= INT_MAX) + { + item->valueint = INT_MAX; + } + else if (number <= (double)INT_MIN) + { + item->valueint = INT_MIN; + } + else + { + item->valueint = (int)number; + } + + item->type = cJSON_Number; + + input_buffer->offset += (size_t)(after_end - number_c_string); + return true; +} + +/* don't ask me, but the original cJSON_SetNumberValue returns an integer or double */ +CJSON_PUBLIC(double) cJSON_SetNumberHelper(cJSON* object, double number) +{ + if (number >= INT_MAX) + { + object->valueint = INT_MAX; + } + else if (number <= (double)INT_MIN) + { + object->valueint = INT_MIN; + } + else + { + object->valueint = (int)number; + } + + return object->valuedouble = number; +} + +CJSON_PUBLIC(char*) cJSON_SetValuestring(cJSON* object, const char* valuestring) +{ + char* copy = NULL; + /* if object's type is not cJSON_String or is cJSON_IsReference, it should not set valuestring */ + if (!(object->type & cJSON_String) || (object->type & cJSON_IsReference)) + { + return NULL; + } + if (strlen(valuestring) <= strlen(object->valuestring)) + { + strcpy(object->valuestring, valuestring); + return object->valuestring; + } + copy = (char*)cJSON_strdup((const unsigned char*)valuestring, &global_hooks); + if (copy == NULL) + { + return NULL; + } + if (object->valuestring != NULL) + { + cJSON_free(object->valuestring); + } + object->valuestring = copy; + + return copy; +} + +typedef struct +{ + unsigned char* buffer; + size_t length; + size_t offset; + size_t depth; /* current nesting depth (for formatted printing) */ + cJSON_bool noalloc; + cJSON_bool format; /* is this print a formatted print */ + internal_hooks hooks; +} printbuffer; + +/* realloc printbuffer if necessary to have at least "needed" bytes more */ +static unsigned char* ensure(printbuffer* const p, size_t needed) +{ + unsigned char* newbuffer = NULL; + size_t newsize = 0; + + if ((p == NULL) || (p->buffer == NULL)) + { + return NULL; + } + + if ((p->length > 0) && (p->offset >= p->length)) + { + /* make sure that offset is valid */ + return NULL; + } + + if (needed > INT_MAX) + { + /* sizes bigger than INT_MAX are currently not supported */ + return NULL; + } + + needed += p->offset + 1; + if (needed <= p->length) + { + return p->buffer + p->offset; + } + + if (p->noalloc) { + return NULL; + } + + /* calculate new buffer size */ + if (needed > (INT_MAX / 2)) + { + /* overflow of int, use INT_MAX if possible */ + if (needed <= INT_MAX) + { + newsize = INT_MAX; + } + else + { + return NULL; + } + } + else + { + newsize = needed * 2; + } + + if (p->hooks.reallocate != NULL) + { + /* reallocate with realloc if available */ + newbuffer = (unsigned char*)p->hooks.reallocate(p->buffer, newsize); + if (newbuffer == NULL) + { + p->hooks.deallocate(p->buffer); + p->length = 0; + p->buffer = NULL; + + return NULL; + } + } + else + { + /* otherwise reallocate manually */ + newbuffer = (unsigned char*)p->hooks.allocate(newsize); + if (!newbuffer) + { + p->hooks.deallocate(p->buffer); + p->length = 0; + p->buffer = NULL; + + return NULL; + } + + memcpy(newbuffer, p->buffer, p->offset + 1); + p->hooks.deallocate(p->buffer); + } + p->length = newsize; + p->buffer = newbuffer; + + return newbuffer + p->offset; +} + +/* calculate the new length of the string in a printbuffer and update the offset */ +static void update_offset(printbuffer* const buffer) +{ + const unsigned char* buffer_pointer = NULL; + if ((buffer == NULL) || (buffer->buffer == NULL)) + { + return; + } + buffer_pointer = buffer->buffer + buffer->offset; + + buffer->offset += strlen((const char*)buffer_pointer); +} + +/* securely comparison of floating-point variables */ +static cJSON_bool compare_double(double a, double b) +{ + double maxVal = fabs(a) > fabs(b) ? fabs(a) : fabs(b); + return (fabs(a - b) <= maxVal * DBL_EPSILON); +} + +/* Render the number nicely from the given item into a string. */ +static cJSON_bool print_number(const cJSON* const item, printbuffer* const output_buffer) +{ + unsigned char* output_pointer = NULL; + double d = item->valuedouble; + int length = 0; + size_t i = 0; + unsigned char number_buffer[26] = { 0 }; /* temporary buffer to print the number into */ + unsigned char decimal_point = get_decimal_point(); + double test = 0.0; + + if (output_buffer == NULL) + { + return false; + } + + /* This checks for NaN and Infinity */ + if (isnan(d) || isinf(d)) + { + length = sprintf((char*)number_buffer, "null"); + } + else if (d == (double)item->valueint) + { + length = sprintf((char*)number_buffer, "%d", item->valueint); + } + else + { + /* Try 15 decimal places of precision to avoid nonsignificant nonzero digits */ + length = sprintf((char*)number_buffer, "%1.15g", d); + + /* Check whether the original double can be recovered */ + if ((sscanf((char*)number_buffer, "%lg", &test) != 1) || !compare_double((double)test, d)) + { + /* If not, print with 17 decimal places of precision */ + length = sprintf((char*)number_buffer, "%1.17g", d); + } + } + + /* sprintf failed or buffer overrun occurred */ + if ((length < 0) || (length > (int)(sizeof(number_buffer) - 1))) + { + return false; + } + + /* reserve appropriate space in the output */ + output_pointer = ensure(output_buffer, (size_t)length + sizeof("")); + if (output_pointer == NULL) + { + return false; + } + + /* copy the printed number to the output and replace locale + * dependent decimal point with '.' */ + for (i = 0; i < ((size_t)length); i++) + { + if (number_buffer[i] == decimal_point) + { + output_pointer[i] = '.'; + continue; + } + + output_pointer[i] = number_buffer[i]; + } + output_pointer[i] = '\0'; + + output_buffer->offset += (size_t)length; + + return true; +} + +/* parse 4 digit hexadecimal number */ +static unsigned parse_hex4(const unsigned char* const input) +{ + unsigned int h = 0; + size_t i = 0; + + for (i = 0; i < 4; i++) + { + /* parse digit */ + if ((input[i] >= '0') && (input[i] <= '9')) + { + h += (unsigned int)input[i] - '0'; + } + else if ((input[i] >= 'A') && (input[i] <= 'F')) + { + h += (unsigned int)10 + input[i] - 'A'; + } + else if ((input[i] >= 'a') && (input[i] <= 'f')) + { + h += (unsigned int)10 + input[i] - 'a'; + } + else /* invalid */ + { + return 0; + } + + if (i < 3) + { + /* shift left to make place for the next nibble */ + h = h << 4; + } + } + + return h; +} + +/* converts a UTF-16 literal to UTF-8 + * A literal can be one or two sequences of the form \uXXXX */ +static unsigned char utf16_literal_to_utf8(const unsigned char* const input_pointer, const unsigned char* const input_end, unsigned char** output_pointer) +{ + long unsigned int codepoint = 0; + unsigned int first_code = 0; + const unsigned char* first_sequence = input_pointer; + unsigned char utf8_length = 0; + unsigned char utf8_position = 0; + unsigned char sequence_length = 0; + unsigned char first_byte_mark = 0; + + if ((input_end - first_sequence) < 6) + { + /* input ends unexpectedly */ + goto fail; + } + + /* get the first utf16 sequence */ + first_code = parse_hex4(first_sequence + 2); + + /* check that the code is valid */ + if (((first_code >= 0xDC00) && (first_code <= 0xDFFF))) + { + goto fail; + } + + /* UTF16 surrogate pair */ + if ((first_code >= 0xD800) && (first_code <= 0xDBFF)) + { + const unsigned char* second_sequence = first_sequence + 6; + unsigned int second_code = 0; + sequence_length = 12; /* \uXXXX\uXXXX */ + + if ((input_end - second_sequence) < 6) + { + /* input ends unexpectedly */ + goto fail; + } + + if ((second_sequence[0] != '\\') || (second_sequence[1] != 'u')) + { + /* missing second half of the surrogate pair */ + goto fail; + } + + /* get the second utf16 sequence */ + second_code = parse_hex4(second_sequence + 2); + /* check that the code is valid */ + if ((second_code < 0xDC00) || (second_code > 0xDFFF)) + { + /* invalid second half of the surrogate pair */ + goto fail; + } + + + /* calculate the unicode codepoint from the surrogate pair */ + codepoint = 0x10000 + (((first_code & 0x3FF) << 10) | (second_code & 0x3FF)); + } + else + { + sequence_length = 6; /* \uXXXX */ + codepoint = first_code; + } + + /* encode as UTF-8 + * takes at maximum 4 bytes to encode: + * 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx */ + if (codepoint < 0x80) + { + /* normal ascii, encoding 0xxxxxxx */ + utf8_length = 1; + } + else if (codepoint < 0x800) + { + /* two bytes, encoding 110xxxxx 10xxxxxx */ + utf8_length = 2; + first_byte_mark = 0xC0; /* 11000000 */ + } + else if (codepoint < 0x10000) + { + /* three bytes, encoding 1110xxxx 10xxxxxx 10xxxxxx */ + utf8_length = 3; + first_byte_mark = 0xE0; /* 11100000 */ + } + else if (codepoint <= 0x10FFFF) + { + /* four bytes, encoding 1110xxxx 10xxxxxx 10xxxxxx 10xxxxxx */ + utf8_length = 4; + first_byte_mark = 0xF0; /* 11110000 */ + } + else + { + /* invalid unicode codepoint */ + goto fail; + } + + /* encode as utf8 */ + for (utf8_position = (unsigned char)(utf8_length - 1); utf8_position > 0; utf8_position--) + { + /* 10xxxxxx */ + (*output_pointer)[utf8_position] = (unsigned char)((codepoint | 0x80) & 0xBF); + codepoint >>= 6; + } + /* encode first byte */ + if (utf8_length > 1) + { + (*output_pointer)[0] = (unsigned char)((codepoint | first_byte_mark) & 0xFF); + } + else + { + (*output_pointer)[0] = (unsigned char)(codepoint & 0x7F); + } + + *output_pointer += utf8_length; + + return sequence_length; + +fail: + return 0; +} + +/* Parse the input text into an unescaped cinput, and populate item. */ +static cJSON_bool parse_string(cJSON* const item, parse_buffer* const input_buffer) +{ + const unsigned char* input_pointer = buffer_at_offset(input_buffer) + 1; + const unsigned char* input_end = buffer_at_offset(input_buffer) + 1; + unsigned char* output_pointer = NULL; + unsigned char* output = NULL; + + /* not a string */ + if (buffer_at_offset(input_buffer)[0] != '\"') + { + goto fail; + } + + { + /* calculate approximate size of the output (overestimate) */ + size_t allocation_length = 0; + size_t skipped_bytes = 0; + while (((size_t)(input_end - input_buffer->content) < input_buffer->length) && (*input_end != '\"')) + { + /* is escape sequence */ + if (input_end[0] == '\\') + { + if ((size_t)(input_end + 1 - input_buffer->content) >= input_buffer->length) + { + /* prevent buffer overflow when last input character is a backslash */ + goto fail; + } + skipped_bytes++; + input_end++; + } + input_end++; + } + if (((size_t)(input_end - input_buffer->content) >= input_buffer->length) || (*input_end != '\"')) + { + goto fail; /* string ended unexpectedly */ + } + + /* This is at most how much we need for the output */ + allocation_length = (size_t)(input_end - buffer_at_offset(input_buffer)) - skipped_bytes; + output = (unsigned char*)input_buffer->hooks.allocate(allocation_length + sizeof("")); + if (output == NULL) + { + goto fail; /* allocation failure */ + } + } + + output_pointer = output; + /* loop through the string literal */ + while (input_pointer < input_end) + { + if (*input_pointer != '\\') + { + *output_pointer++ = *input_pointer++; + } + /* escape sequence */ + else + { + unsigned char sequence_length = 2; + if ((input_end - input_pointer) < 1) + { + goto fail; + } + + switch (input_pointer[1]) + { + case 'b': + *output_pointer++ = '\b'; + break; + case 'f': + *output_pointer++ = '\f'; + break; + case 'n': + *output_pointer++ = '\n'; + break; + case 'r': + *output_pointer++ = '\r'; + break; + case 't': + *output_pointer++ = '\t'; + break; + case '\"': + case '\\': + case '/': + *output_pointer++ = input_pointer[1]; + break; + + /* UTF-16 literal */ + case 'u': + sequence_length = utf16_literal_to_utf8(input_pointer, input_end, &output_pointer); + if (sequence_length == 0) + { + /* failed to convert UTF16-literal to UTF-8 */ + goto fail; + } + break; + + default: + goto fail; + } + input_pointer += sequence_length; + } + } + + /* zero terminate the output */ + *output_pointer = '\0'; + + item->type = cJSON_String; + item->valuestring = (char*)output; + + input_buffer->offset = (size_t)(input_end - input_buffer->content); + input_buffer->offset++; + + return true; + +fail: + if (output != NULL) + { + input_buffer->hooks.deallocate(output); + } + + if (input_pointer != NULL) + { + input_buffer->offset = (size_t)(input_pointer - input_buffer->content); + } + + return false; +} + +/* Render the cstring provided to an escaped version that can be printed. */ +static cJSON_bool print_string_ptr(const unsigned char* const input, printbuffer* const output_buffer) +{ + const unsigned char* input_pointer = NULL; + unsigned char* output = NULL; + unsigned char* output_pointer = NULL; + size_t output_length = 0; + /* numbers of additional characters needed for escaping */ + size_t escape_characters = 0; + + if (output_buffer == NULL) + { + return false; + } + + /* empty string */ + if (input == NULL) + { + output = ensure(output_buffer, sizeof("\"\"")); + if (output == NULL) + { + return false; + } + strcpy((char*)output, "\"\""); + + return true; + } + + /* set "flag" to 1 if something needs to be escaped */ + for (input_pointer = input; *input_pointer; input_pointer++) + { + switch (*input_pointer) + { + case '\"': + case '\\': + case '\b': + case '\f': + case '\n': + case '\r': + case '\t': + /* one character escape sequence */ + escape_characters++; + break; + default: + if (*input_pointer < 32) + { + /* UTF-16 escape sequence uXXXX */ + escape_characters += 5; + } + break; + } + } + output_length = (size_t)(input_pointer - input) + escape_characters; + + output = ensure(output_buffer, output_length + sizeof("\"\"")); + if (output == NULL) + { + return false; + } + + /* no characters have to be escaped */ + if (escape_characters == 0) + { + output[0] = '\"'; + memcpy(output + 1, input, output_length); + output[output_length + 1] = '\"'; + output[output_length + 2] = '\0'; + + return true; + } + + output[0] = '\"'; + output_pointer = output + 1; + /* copy the string */ + for (input_pointer = input; *input_pointer != '\0'; (void)input_pointer++, output_pointer++) + { + if ((*input_pointer > 31) && (*input_pointer != '\"') && (*input_pointer != '\\')) + { + /* normal character, copy */ + *output_pointer = *input_pointer; + } + else + { + /* character needs to be escaped */ + *output_pointer++ = '\\'; + switch (*input_pointer) + { + case '\\': + *output_pointer = '\\'; + break; + case '\"': + *output_pointer = '\"'; + break; + case '\b': + *output_pointer = 'b'; + break; + case '\f': + *output_pointer = 'f'; + break; + case '\n': + *output_pointer = 'n'; + break; + case '\r': + *output_pointer = 'r'; + break; + case '\t': + *output_pointer = 't'; + break; + default: + /* escape and print as unicode codepoint */ + sprintf((char*)output_pointer, "u%04x", *input_pointer); + output_pointer += 4; + break; + } + } + } + output[output_length + 1] = '\"'; + output[output_length + 2] = '\0'; + + return true; +} + +/* Invoke print_string_ptr (which is useful) on an item. */ +static cJSON_bool print_string(const cJSON* const item, printbuffer* const p) +{ + return print_string_ptr((unsigned char*)item->valuestring, p); +} + +/* Predeclare these prototypes. */ +static cJSON_bool parse_value(cJSON* const item, parse_buffer* const input_buffer); +static cJSON_bool print_value(const cJSON* const item, printbuffer* const output_buffer); +static cJSON_bool parse_array(cJSON* const item, parse_buffer* const input_buffer); +static cJSON_bool print_array(const cJSON* const item, printbuffer* const output_buffer); +static cJSON_bool parse_object(cJSON* const item, parse_buffer* const input_buffer); +static cJSON_bool print_object(const cJSON* const item, printbuffer* const output_buffer); + +/* Utility to jump whitespace and cr/lf */ +static parse_buffer* buffer_skip_whitespace(parse_buffer* const buffer) +{ + if ((buffer == NULL) || (buffer->content == NULL)) + { + return NULL; + } + + if (cannot_access_at_index(buffer, 0)) + { + return buffer; + } + + while (can_access_at_index(buffer, 0) && (buffer_at_offset(buffer)[0] <= 32)) + { + buffer->offset++; + } + + if (buffer->offset == buffer->length) + { + buffer->offset--; + } + + return buffer; +} + +/* skip the UTF-8 BOM (byte order mark) if it is at the beginning of a buffer */ +static parse_buffer* skip_utf8_bom(parse_buffer* const buffer) +{ + if ((buffer == NULL) || (buffer->content == NULL) || (buffer->offset != 0)) + { + return NULL; + } + + if (can_access_at_index(buffer, 4) && (strncmp((const char*)buffer_at_offset(buffer), "\xEF\xBB\xBF", 3) == 0)) + { + buffer->offset += 3; + } + + return buffer; +} + +CJSON_PUBLIC(cJSON*) cJSON_ParseWithOpts(const char* value, const char** return_parse_end, cJSON_bool require_null_terminated) +{ + size_t buffer_length; + + if (NULL == value) + { + return NULL; + } + + /* Adding null character size due to require_null_terminated. */ + buffer_length = strlen(value) + sizeof(""); + + return cJSON_ParseWithLengthOpts(value, buffer_length, return_parse_end, require_null_terminated); +} + +/* Parse an object - create a new root, and populate. */ +CJSON_PUBLIC(cJSON*) cJSON_ParseWithLengthOpts(const char* value, size_t buffer_length, const char** return_parse_end, cJSON_bool require_null_terminated) +{ + parse_buffer buffer = { 0, 0, 0, 0, { 0, 0, 0 } }; + cJSON* item = NULL; + + /* reset error position */ + global_error.json = NULL; + global_error.position = 0; + + if (value == NULL || 0 == buffer_length) + { + goto fail; + } + + buffer.content = (const unsigned char*)value; + buffer.length = buffer_length; + buffer.offset = 0; + buffer.hooks = global_hooks; + + item = cJSON_New_Item(&global_hooks); + if (item == NULL) /* memory fail */ + { + goto fail; + } + + if (!parse_value(item, buffer_skip_whitespace(skip_utf8_bom(&buffer)))) + { + /* parse failure. ep is set. */ + goto fail; + } + + /* if we require null-terminated JSON without appended garbage, skip and then check for a null terminator */ + if (require_null_terminated) + { + buffer_skip_whitespace(&buffer); + if ((buffer.offset >= buffer.length) || buffer_at_offset(&buffer)[0] != '\0') + { + goto fail; + } + } + if (return_parse_end) + { + *return_parse_end = (const char*)buffer_at_offset(&buffer); + } + + return item; + +fail: + if (item != NULL) + { + cJSON_Delete(item); + } + + if (value != NULL) + { + error local_error; + local_error.json = (const unsigned char*)value; + local_error.position = 0; + + if (buffer.offset < buffer.length) + { + local_error.position = buffer.offset; + } + else if (buffer.length > 0) + { + local_error.position = buffer.length - 1; + } + + if (return_parse_end != NULL) + { + *return_parse_end = (const char*)local_error.json + local_error.position; + } + + global_error = local_error; + } + + return NULL; +} + +/* Default options for cJSON_Parse */ +CJSON_PUBLIC(cJSON*) cJSON_Parse(const char* value) +{ + return cJSON_ParseWithOpts(value, 0, 0); +} + +CJSON_PUBLIC(cJSON*) cJSON_ParseWithLength(const char* value, size_t buffer_length) +{ + return cJSON_ParseWithLengthOpts(value, buffer_length, 0, 0); +} + +#define cjson_min(a, b) (((a) < (b)) ? (a) : (b)) + +static unsigned char* print(const cJSON* const item, cJSON_bool format, const internal_hooks* const hooks) +{ + static const size_t default_buffer_size = 256; + printbuffer buffer[1]; + unsigned char* printed = NULL; + + memset(buffer, 0, sizeof(buffer)); + + /* create buffer */ + buffer->buffer = (unsigned char*)hooks->allocate(default_buffer_size); + buffer->length = default_buffer_size; + buffer->format = format; + buffer->hooks = *hooks; + if (buffer->buffer == NULL) + { + goto fail; + } + + /* print the value */ + if (!print_value(item, buffer)) + { + goto fail; + } + update_offset(buffer); + + /* check if reallocate is available */ + if (hooks->reallocate != NULL) + { + printed = (unsigned char*)hooks->reallocate(buffer->buffer, buffer->offset + 1); + if (printed == NULL) { + goto fail; + } + buffer->buffer = NULL; + } + else /* otherwise copy the JSON over to a new buffer */ + { + printed = (unsigned char*)hooks->allocate(buffer->offset + 1); + if (printed == NULL) + { + goto fail; + } + memcpy(printed, buffer->buffer, cjson_min(buffer->length, buffer->offset + 1)); + printed[buffer->offset] = '\0'; /* just to be sure */ + + /* free the buffer */ + hooks->deallocate(buffer->buffer); + } + + return printed; + +fail: + if (buffer->buffer != NULL) + { + hooks->deallocate(buffer->buffer); + } + + if (printed != NULL) + { + hooks->deallocate(printed); + } + + return NULL; +} + +/* Render a cJSON item/entity/structure to text. */ +CJSON_PUBLIC(char*) cJSON_Print(const cJSON* item) +{ + return (char*)print(item, true, &global_hooks); +} + +CJSON_PUBLIC(char*) cJSON_PrintUnformatted(const cJSON* item) +{ + return (char*)print(item, false, &global_hooks); +} + +CJSON_PUBLIC(char*) cJSON_PrintBuffered(const cJSON* item, int prebuffer, cJSON_bool fmt) +{ + printbuffer p = { 0, 0, 0, 0, 0, 0, { 0, 0, 0 } }; + + if (prebuffer < 0) + { + return NULL; + } + + p.buffer = (unsigned char*)global_hooks.allocate((size_t)prebuffer); + if (!p.buffer) + { + return NULL; + } + + p.length = (size_t)prebuffer; + p.offset = 0; + p.noalloc = false; + p.format = fmt; + p.hooks = global_hooks; + + if (!print_value(item, &p)) + { + global_hooks.deallocate(p.buffer); + return NULL; + } + + return (char*)p.buffer; +} + +CJSON_PUBLIC(cJSON_bool) cJSON_PrintPreallocated(cJSON* item, char* buffer, const int length, const cJSON_bool format) +{ + printbuffer p = { 0, 0, 0, 0, 0, 0, { 0, 0, 0 } }; + + if ((length < 0) || (buffer == NULL)) + { + return false; + } + + p.buffer = (unsigned char*)buffer; + p.length = (size_t)length; + p.offset = 0; + p.noalloc = true; + p.format = format; + p.hooks = global_hooks; + + return print_value(item, &p); +} + +/* Parser core - when encountering text, process appropriately. */ +static cJSON_bool parse_value(cJSON* const item, parse_buffer* const input_buffer) +{ + if ((input_buffer == NULL) || (input_buffer->content == NULL)) + { + return false; /* no input */ + } + + /* parse the different types of values */ + /* null */ + if (can_read(input_buffer, 4) && (strncmp((const char*)buffer_at_offset(input_buffer), "null", 4) == 0)) + { + item->type = cJSON_NULL; + input_buffer->offset += 4; + return true; + } + /* false */ + if (can_read(input_buffer, 5) && (strncmp((const char*)buffer_at_offset(input_buffer), "false", 5) == 0)) + { + item->type = cJSON_False; + input_buffer->offset += 5; + return true; + } + /* true */ + if (can_read(input_buffer, 4) && (strncmp((const char*)buffer_at_offset(input_buffer), "true", 4) == 0)) + { + item->type = cJSON_True; + item->valueint = 1; + input_buffer->offset += 4; + return true; + } + /* string */ + if (can_access_at_index(input_buffer, 0) && (buffer_at_offset(input_buffer)[0] == '\"')) + { + return parse_string(item, input_buffer); + } + /* number */ + if (can_access_at_index(input_buffer, 0) && ((buffer_at_offset(input_buffer)[0] == '-') || ((buffer_at_offset(input_buffer)[0] >= '0') && (buffer_at_offset(input_buffer)[0] <= '9')))) + { + return parse_number(item, input_buffer); + } + /* array */ + if (can_access_at_index(input_buffer, 0) && (buffer_at_offset(input_buffer)[0] == '[')) + { + return parse_array(item, input_buffer); + } + /* object */ + if (can_access_at_index(input_buffer, 0) && (buffer_at_offset(input_buffer)[0] == '{')) + { + return parse_object(item, input_buffer); + } + + return false; +} + +/* Render a value to text. */ +static cJSON_bool print_value(const cJSON* const item, printbuffer* const output_buffer) +{ + unsigned char* output = NULL; + + if ((item == NULL) || (output_buffer == NULL)) + { + return false; + } + + switch ((item->type) & 0xFF) + { + case cJSON_NULL: + output = ensure(output_buffer, 5); + if (output == NULL) + { + return false; + } + strcpy((char*)output, "null"); + return true; + + case cJSON_False: + output = ensure(output_buffer, 6); + if (output == NULL) + { + return false; + } + strcpy((char*)output, "false"); + return true; + + case cJSON_True: + output = ensure(output_buffer, 5); + if (output == NULL) + { + return false; + } + strcpy((char*)output, "true"); + return true; + + case cJSON_Number: + return print_number(item, output_buffer); + + case cJSON_Raw: + { + size_t raw_length = 0; + if (item->valuestring == NULL) + { + return false; + } + + raw_length = strlen(item->valuestring) + sizeof(""); + output = ensure(output_buffer, raw_length); + if (output == NULL) + { + return false; + } + memcpy(output, item->valuestring, raw_length); + return true; + } + + case cJSON_String: + return print_string(item, output_buffer); + + case cJSON_Array: + return print_array(item, output_buffer); + + case cJSON_Object: + return print_object(item, output_buffer); + + default: + return false; + } +} + +/* Build an array from input text. */ +static cJSON_bool parse_array(cJSON* const item, parse_buffer* const input_buffer) +{ + cJSON* head = NULL; /* head of the linked list */ + cJSON* current_item = NULL; + + if (input_buffer->depth >= CJSON_NESTING_LIMIT) + { + return false; /* to deeply nested */ + } + input_buffer->depth++; + + if (buffer_at_offset(input_buffer)[0] != '[') + { + /* not an array */ + goto fail; + } + + input_buffer->offset++; + buffer_skip_whitespace(input_buffer); + if (can_access_at_index(input_buffer, 0) && (buffer_at_offset(input_buffer)[0] == ']')) + { + /* empty array */ + goto success; + } + + /* check if we skipped to the end of the buffer */ + if (cannot_access_at_index(input_buffer, 0)) + { + input_buffer->offset--; + goto fail; + } + + /* step back to character in front of the first element */ + input_buffer->offset--; + /* loop through the comma separated array elements */ + do + { + /* allocate next item */ + cJSON* new_item = cJSON_New_Item(&(input_buffer->hooks)); + if (new_item == NULL) + { + goto fail; /* allocation failure */ + } + + /* attach next item to list */ + if (head == NULL) + { + /* start the linked list */ + current_item = head = new_item; + } + else + { + /* add to the end and advance */ + current_item->next = new_item; + new_item->prev = current_item; + current_item = new_item; + } + + /* parse next value */ + input_buffer->offset++; + buffer_skip_whitespace(input_buffer); + if (!parse_value(current_item, input_buffer)) + { + goto fail; /* failed to parse value */ + } + buffer_skip_whitespace(input_buffer); + } while (can_access_at_index(input_buffer, 0) && (buffer_at_offset(input_buffer)[0] == ',')); + + if (cannot_access_at_index(input_buffer, 0) || buffer_at_offset(input_buffer)[0] != ']') + { + goto fail; /* expected end of array */ + } + +success: + input_buffer->depth--; + + if (head != NULL) { + head->prev = current_item; + } + + item->type = cJSON_Array; + item->child = head; + + input_buffer->offset++; + + return true; + +fail: + if (head != NULL) + { + cJSON_Delete(head); + } + + return false; +} + +/* Render an array to text */ +static cJSON_bool print_array(const cJSON* const item, printbuffer* const output_buffer) +{ + unsigned char* output_pointer = NULL; + size_t length = 0; + cJSON* current_element = item->child; + + if (output_buffer == NULL) + { + return false; + } + + /* Compose the output array. */ + /* opening square bracket */ + output_pointer = ensure(output_buffer, 1); + if (output_pointer == NULL) + { + return false; + } + + *output_pointer = '['; + output_buffer->offset++; + output_buffer->depth++; + + while (current_element != NULL) + { + if (!print_value(current_element, output_buffer)) + { + return false; + } + update_offset(output_buffer); + if (current_element->next) + { + length = (size_t)(output_buffer->format ? 2 : 1); + output_pointer = ensure(output_buffer, length + 1); + if (output_pointer == NULL) + { + return false; + } + *output_pointer++ = ','; + if (output_buffer->format) + { + *output_pointer++ = ' '; + } + *output_pointer = '\0'; + output_buffer->offset += length; + } + current_element = current_element->next; + } + + output_pointer = ensure(output_buffer, 2); + if (output_pointer == NULL) + { + return false; + } + *output_pointer++ = ']'; + *output_pointer = '\0'; + output_buffer->depth--; + + return true; +} + +/* Build an object from the text. */ +static cJSON_bool parse_object(cJSON* const item, parse_buffer* const input_buffer) +{ + cJSON* head = NULL; /* linked list head */ + cJSON* current_item = NULL; + + if (input_buffer->depth >= CJSON_NESTING_LIMIT) + { + return false; /* to deeply nested */ + } + input_buffer->depth++; + + if (cannot_access_at_index(input_buffer, 0) || (buffer_at_offset(input_buffer)[0] != '{')) + { + goto fail; /* not an object */ + } + + input_buffer->offset++; + buffer_skip_whitespace(input_buffer); + if (can_access_at_index(input_buffer, 0) && (buffer_at_offset(input_buffer)[0] == '}')) + { + goto success; /* empty object */ + } + + /* check if we skipped to the end of the buffer */ + if (cannot_access_at_index(input_buffer, 0)) + { + input_buffer->offset--; + goto fail; + } + + /* step back to character in front of the first element */ + input_buffer->offset--; + /* loop through the comma separated array elements */ + do + { + /* allocate next item */ + cJSON* new_item = cJSON_New_Item(&(input_buffer->hooks)); + if (new_item == NULL) + { + goto fail; /* allocation failure */ + } + + /* attach next item to list */ + if (head == NULL) + { + /* start the linked list */ + current_item = head = new_item; + } + else + { + /* add to the end and advance */ + current_item->next = new_item; + new_item->prev = current_item; + current_item = new_item; + } + + /* parse the name of the child */ + input_buffer->offset++; + buffer_skip_whitespace(input_buffer); + if (!parse_string(current_item, input_buffer)) + { + goto fail; /* failed to parse name */ + } + buffer_skip_whitespace(input_buffer); + + /* swap valuestring and string, because we parsed the name */ + current_item->string = current_item->valuestring; + current_item->valuestring = NULL; + + if (cannot_access_at_index(input_buffer, 0) || (buffer_at_offset(input_buffer)[0] != ':')) + { + goto fail; /* invalid object */ + } + + /* parse the value */ + input_buffer->offset++; + buffer_skip_whitespace(input_buffer); + if (!parse_value(current_item, input_buffer)) + { + goto fail; /* failed to parse value */ + } + buffer_skip_whitespace(input_buffer); + } while (can_access_at_index(input_buffer, 0) && (buffer_at_offset(input_buffer)[0] == ',')); + + if (cannot_access_at_index(input_buffer, 0) || (buffer_at_offset(input_buffer)[0] != '}')) + { + goto fail; /* expected end of object */ + } + +success: + input_buffer->depth--; + + if (head != NULL) { + head->prev = current_item; + } + + item->type = cJSON_Object; + item->child = head; + + input_buffer->offset++; + return true; + +fail: + if (head != NULL) + { + cJSON_Delete(head); + } + + return false; +} + +/* Render an object to text. */ +static cJSON_bool print_object(const cJSON* const item, printbuffer* const output_buffer) +{ + unsigned char* output_pointer = NULL; + size_t length = 0; + cJSON* current_item = item->child; + + if (output_buffer == NULL) + { + return false; + } + + /* Compose the output: */ + length = (size_t)(output_buffer->format ? 2 : 1); /* fmt: {\n */ + output_pointer = ensure(output_buffer, length + 1); + if (output_pointer == NULL) + { + return false; + } + + *output_pointer++ = '{'; + output_buffer->depth++; + if (output_buffer->format) + { + *output_pointer++ = '\n'; + } + output_buffer->offset += length; + + while (current_item) + { + if (output_buffer->format) + { + size_t i; + output_pointer = ensure(output_buffer, output_buffer->depth); + if (output_pointer == NULL) + { + return false; + } + for (i = 0; i < output_buffer->depth; i++) + { + *output_pointer++ = '\t'; + } + output_buffer->offset += output_buffer->depth; + } + + /* print key */ + if (!print_string_ptr((unsigned char*)current_item->string, output_buffer)) + { + return false; + } + update_offset(output_buffer); + + length = (size_t)(output_buffer->format ? 2 : 1); + output_pointer = ensure(output_buffer, length); + if (output_pointer == NULL) + { + return false; + } + *output_pointer++ = ':'; + if (output_buffer->format) + { + *output_pointer++ = '\t'; + } + output_buffer->offset += length; + + /* print value */ + if (!print_value(current_item, output_buffer)) + { + return false; + } + update_offset(output_buffer); + + /* print comma if not last */ + length = ((size_t)(output_buffer->format ? 1 : 0) + (size_t)(current_item->next ? 1 : 0)); + output_pointer = ensure(output_buffer, length + 1); + if (output_pointer == NULL) + { + return false; + } + if (current_item->next) + { + *output_pointer++ = ','; + } + + if (output_buffer->format) + { + *output_pointer++ = '\n'; + } + *output_pointer = '\0'; + output_buffer->offset += length; + + current_item = current_item->next; + } + + output_pointer = ensure(output_buffer, output_buffer->format ? (output_buffer->depth + 1) : 2); + if (output_pointer == NULL) + { + return false; + } + if (output_buffer->format) + { + size_t i; + for (i = 0; i < (output_buffer->depth - 1); i++) + { + *output_pointer++ = '\t'; + } + } + *output_pointer++ = '}'; + *output_pointer = '\0'; + output_buffer->depth--; + + return true; +} + +/* Get Array size/item / object item. */ +CJSON_PUBLIC(int) cJSON_GetArraySize(const cJSON* array) +{ + cJSON* child = NULL; + size_t size = 0; + + if (array == NULL) + { + return 0; + } + + child = array->child; + + while (child != NULL) + { + size++; + child = child->next; + } + + /* FIXME: Can overflow here. Cannot be fixed without breaking the API */ + + return (int)size; +} + +static cJSON* get_array_item(const cJSON* array, size_t index) +{ + cJSON* current_child = NULL; + + if (array == NULL) + { + return NULL; + } + + current_child = array->child; + while ((current_child != NULL) && (index > 0)) + { + index--; + current_child = current_child->next; + } + + return current_child; +} + +CJSON_PUBLIC(cJSON*) cJSON_GetArrayItem(const cJSON* array, int index) +{ + if (index < 0) + { + return NULL; + } + + return get_array_item(array, (size_t)index); +} + +static cJSON* get_object_item(const cJSON* const object, const char* const name, const cJSON_bool case_sensitive) +{ + cJSON* current_element = NULL; + + if ((object == NULL) || (name == NULL)) + { + return NULL; + } + + current_element = object->child; + if (case_sensitive) + { + while ((current_element != NULL) && (current_element->string != NULL) && (strcmp(name, current_element->string) != 0)) + { + current_element = current_element->next; + } + } + else + { + while ((current_element != NULL) && (case_insensitive_strcmp((const unsigned char*)name, (const unsigned char*)(current_element->string)) != 0)) + { + current_element = current_element->next; + } + } + + if ((current_element == NULL) || (current_element->string == NULL)) { + return NULL; + } + + return current_element; +} + +CJSON_PUBLIC(cJSON*) cJSON_GetObjectItem(const cJSON* const object, const char* const string) +{ + return get_object_item(object, string, false); +} + +CJSON_PUBLIC(cJSON*) cJSON_GetObjectItemCaseSensitive(const cJSON* const object, const char* const string) +{ + return get_object_item(object, string, true); +} + +CJSON_PUBLIC(cJSON_bool) cJSON_HasObjectItem(const cJSON* object, const char* string) +{ + return cJSON_GetObjectItem(object, string) ? 1 : 0; +} + +/* Utility for array list handling. */ +static void suffix_object(cJSON* prev, cJSON* item) +{ + prev->next = item; + item->prev = prev; +} + +/* Utility for handling references. */ +static cJSON* create_reference(const cJSON* item, const internal_hooks* const hooks) +{ + cJSON* reference = NULL; + if (item == NULL) + { + return NULL; + } + + reference = cJSON_New_Item(hooks); + if (reference == NULL) + { + return NULL; + } + + memcpy(reference, item, sizeof(cJSON)); + reference->string = NULL; + reference->type |= cJSON_IsReference; + reference->next = reference->prev = NULL; + return reference; +} + +static cJSON_bool add_item_to_array(cJSON* array, cJSON* item) +{ + cJSON* child = NULL; + + if ((item == NULL) || (array == NULL) || (array == item)) + { + return false; + } + + child = array->child; + /* + * To find the last item in array quickly, we use prev in array + */ + if (child == NULL) + { + /* list is empty, start new one */ + array->child = item; + item->prev = item; + item->next = NULL; + } + else + { + /* append to the end */ + if (child->prev) + { + suffix_object(child->prev, item); + array->child->prev = item; + } + } + + return true; +} + +/* Add item to array/object. */ +CJSON_PUBLIC(cJSON_bool) cJSON_AddItemToArray(cJSON* array, cJSON* item) +{ + return add_item_to_array(array, item); +} + +#if defined(__clang__) || (defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 5)))) +#pragma GCC diagnostic push +#endif +#ifdef __GNUC__ +#pragma GCC diagnostic ignored "-Wcast-qual" +#endif +/* helper function to cast away const */ +static void* cast_away_const(const void* string) +{ + return (void*)string; +} +#if defined(__clang__) || (defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 5)))) +#pragma GCC diagnostic pop +#endif + + +static cJSON_bool add_item_to_object(cJSON* const object, const char* const string, cJSON* const item, const internal_hooks* const hooks, const cJSON_bool constant_key) +{ + char* new_key = NULL; + int new_type = cJSON_Invalid; + + if ((object == NULL) || (string == NULL) || (item == NULL) || (object == item)) + { + return false; + } + + if (constant_key) + { + new_key = (char*)cast_away_const(string); + new_type = item->type | cJSON_StringIsConst; + } + else + { + new_key = (char*)cJSON_strdup((const unsigned char*)string, hooks); + if (new_key == NULL) + { + return false; + } + + new_type = item->type & ~cJSON_StringIsConst; + } + + if (!(item->type & cJSON_StringIsConst) && (item->string != NULL)) + { + hooks->deallocate(item->string); + } + + item->string = new_key; + item->type = new_type; + + return add_item_to_array(object, item); +} + +CJSON_PUBLIC(cJSON_bool) cJSON_AddItemToObject(cJSON* object, const char* string, cJSON* item) +{ + return add_item_to_object(object, string, item, &global_hooks, false); +} + +/* Add an item to an object with constant string as key */ +CJSON_PUBLIC(cJSON_bool) cJSON_AddItemToObjectCS(cJSON* object, const char* string, cJSON* item) +{ + return add_item_to_object(object, string, item, &global_hooks, true); +} + +CJSON_PUBLIC(cJSON_bool) cJSON_AddItemReferenceToArray(cJSON* array, cJSON* item) +{ + if (array == NULL) + { + return false; + } + + return add_item_to_array(array, create_reference(item, &global_hooks)); +} + +CJSON_PUBLIC(cJSON_bool) cJSON_AddItemReferenceToObject(cJSON* object, const char* string, cJSON* item) +{ + if ((object == NULL) || (string == NULL)) + { + return false; + } + + return add_item_to_object(object, string, create_reference(item, &global_hooks), &global_hooks, false); +} + +CJSON_PUBLIC(cJSON*) cJSON_AddNullToObject(cJSON* const object, const char* const name) +{ + cJSON* null = cJSON_CreateNull(); + if (add_item_to_object(object, name, null, &global_hooks, false)) + { + return null; + } + + cJSON_Delete(null); + return NULL; +} + +CJSON_PUBLIC(cJSON*) cJSON_AddTrueToObject(cJSON* const object, const char* const name) +{ + cJSON* true_item = cJSON_CreateTrue(); + if (add_item_to_object(object, name, true_item, &global_hooks, false)) + { + return true_item; + } + + cJSON_Delete(true_item); + return NULL; +} + +CJSON_PUBLIC(cJSON*) cJSON_AddFalseToObject(cJSON* const object, const char* const name) +{ + cJSON* false_item = cJSON_CreateFalse(); + if (add_item_to_object(object, name, false_item, &global_hooks, false)) + { + return false_item; + } + + cJSON_Delete(false_item); + return NULL; +} + +CJSON_PUBLIC(cJSON*) cJSON_AddBoolToObject(cJSON* const object, const char* const name, const cJSON_bool boolean) +{ + cJSON* bool_item = cJSON_CreateBool(boolean); + if (add_item_to_object(object, name, bool_item, &global_hooks, false)) + { + return bool_item; + } + + cJSON_Delete(bool_item); + return NULL; +} + +CJSON_PUBLIC(cJSON*) cJSON_AddNumberToObject(cJSON* const object, const char* const name, const double number) +{ + cJSON* number_item = cJSON_CreateNumber(number); + if (add_item_to_object(object, name, number_item, &global_hooks, false)) + { + return number_item; + } + + cJSON_Delete(number_item); + return NULL; +} + +CJSON_PUBLIC(cJSON*) cJSON_AddStringToObject(cJSON* const object, const char* const name, const char* const string) +{ + cJSON* string_item = cJSON_CreateString(string); + if (add_item_to_object(object, name, string_item, &global_hooks, false)) + { + return string_item; + } + + cJSON_Delete(string_item); + return NULL; +} + +CJSON_PUBLIC(cJSON*) cJSON_AddRawToObject(cJSON* const object, const char* const name, const char* const raw) +{ + cJSON* raw_item = cJSON_CreateRaw(raw); + if (add_item_to_object(object, name, raw_item, &global_hooks, false)) + { + return raw_item; + } + + cJSON_Delete(raw_item); + return NULL; +} + +CJSON_PUBLIC(cJSON*) cJSON_AddObjectToObject(cJSON* const object, const char* const name) +{ + cJSON* object_item = cJSON_CreateObject(); + if (add_item_to_object(object, name, object_item, &global_hooks, false)) + { + return object_item; + } + + cJSON_Delete(object_item); + return NULL; +} + +CJSON_PUBLIC(cJSON*) cJSON_AddArrayToObject(cJSON* const object, const char* const name) +{ + cJSON* array = cJSON_CreateArray(); + if (add_item_to_object(object, name, array, &global_hooks, false)) + { + return array; + } + + cJSON_Delete(array); + return NULL; +} + +CJSON_PUBLIC(cJSON*) cJSON_DetachItemViaPointer(cJSON* parent, cJSON* const item) +{ + if ((parent == NULL) || (item == NULL)) + { + return NULL; + } + + if (item != parent->child) + { + /* not the first element */ + item->prev->next = item->next; + } + if (item->next != NULL) + { + /* not the last element */ + item->next->prev = item->prev; + } + + if (item == parent->child) + { + /* first element */ + parent->child = item->next; + } + else if (item->next == NULL) + { + /* last element */ + parent->child->prev = item->prev; + } + + /* make sure the detached item doesn't point anywhere anymore */ + item->prev = NULL; + item->next = NULL; + + return item; +} + +CJSON_PUBLIC(cJSON*) cJSON_DetachItemFromArray(cJSON* array, int which) +{ + if (which < 0) + { + return NULL; + } + + return cJSON_DetachItemViaPointer(array, get_array_item(array, (size_t)which)); +} + +CJSON_PUBLIC(void) cJSON_DeleteItemFromArray(cJSON* array, int which) +{ + cJSON_Delete(cJSON_DetachItemFromArray(array, which)); +} + +CJSON_PUBLIC(cJSON*) cJSON_DetachItemFromObject(cJSON* object, const char* string) +{ + cJSON* to_detach = cJSON_GetObjectItem(object, string); + + return cJSON_DetachItemViaPointer(object, to_detach); +} + +CJSON_PUBLIC(cJSON*) cJSON_DetachItemFromObjectCaseSensitive(cJSON* object, const char* string) +{ + cJSON* to_detach = cJSON_GetObjectItemCaseSensitive(object, string); + + return cJSON_DetachItemViaPointer(object, to_detach); +} + +CJSON_PUBLIC(void) cJSON_DeleteItemFromObject(cJSON* object, const char* string) +{ + cJSON_Delete(cJSON_DetachItemFromObject(object, string)); +} + +CJSON_PUBLIC(void) cJSON_DeleteItemFromObjectCaseSensitive(cJSON* object, const char* string) +{ + cJSON_Delete(cJSON_DetachItemFromObjectCaseSensitive(object, string)); +} + +/* Replace array/object items with new ones. */ +CJSON_PUBLIC(cJSON_bool) cJSON_InsertItemInArray(cJSON* array, int which, cJSON* newitem) +{ + cJSON* after_inserted = NULL; + + if (which < 0) + { + return false; + } + + after_inserted = get_array_item(array, (size_t)which); + if (after_inserted == NULL) + { + return add_item_to_array(array, newitem); + } + + newitem->next = after_inserted; + newitem->prev = after_inserted->prev; + after_inserted->prev = newitem; + if (after_inserted == array->child) + { + array->child = newitem; + } + else + { + newitem->prev->next = newitem; + } + return true; +} + +CJSON_PUBLIC(cJSON_bool) cJSON_ReplaceItemViaPointer(cJSON* const parent, cJSON* const item, cJSON* replacement) +{ + if ((parent == NULL) || (parent->child == NULL) || (replacement == NULL) || (item == NULL)) + { + return false; + } + + if (replacement == item) + { + return true; + } + + replacement->next = item->next; + replacement->prev = item->prev; + + if (replacement->next != NULL) + { + replacement->next->prev = replacement; + } + if (parent->child == item) + { + if (parent->child->prev == parent->child) + { + replacement->prev = replacement; + } + parent->child = replacement; + } + else + { /* + * To find the last item in array quickly, we use prev in array. + * We can't modify the last item's next pointer where this item was the parent's child + */ + if (replacement->prev != NULL) + { + replacement->prev->next = replacement; + } + if (replacement->next == NULL) + { + parent->child->prev = replacement; + } + } + + item->next = NULL; + item->prev = NULL; + cJSON_Delete(item); + + return true; +} + +CJSON_PUBLIC(cJSON_bool) cJSON_ReplaceItemInArray(cJSON* array, int which, cJSON* newitem) +{ + if (which < 0) + { + return false; + } + + return cJSON_ReplaceItemViaPointer(array, get_array_item(array, (size_t)which), newitem); +} + +static cJSON_bool replace_item_in_object(cJSON* object, const char* string, cJSON* replacement, cJSON_bool case_sensitive) +{ + if ((replacement == NULL) || (string == NULL)) + { + return false; + } + + /* replace the name in the replacement */ + if (!(replacement->type & cJSON_StringIsConst) && (replacement->string != NULL)) + { + cJSON_free(replacement->string); + } + replacement->string = (char*)cJSON_strdup((const unsigned char*)string, &global_hooks); + if (replacement->string == NULL) + { + return false; + } + + replacement->type &= ~cJSON_StringIsConst; + + return cJSON_ReplaceItemViaPointer(object, get_object_item(object, string, case_sensitive), replacement); +} + +CJSON_PUBLIC(cJSON_bool) cJSON_ReplaceItemInObject(cJSON* object, const char* string, cJSON* newitem) +{ + return replace_item_in_object(object, string, newitem, false); +} + +CJSON_PUBLIC(cJSON_bool) cJSON_ReplaceItemInObjectCaseSensitive(cJSON* object, const char* string, cJSON* newitem) +{ + return replace_item_in_object(object, string, newitem, true); +} + +/* Create basic types: */ +CJSON_PUBLIC(cJSON*) cJSON_CreateNull(void) +{ + cJSON* item = cJSON_New_Item(&global_hooks); + if (item) + { + item->type = cJSON_NULL; + } + + return item; +} + +CJSON_PUBLIC(cJSON*) cJSON_CreateTrue(void) +{ + cJSON* item = cJSON_New_Item(&global_hooks); + if (item) + { + item->type = cJSON_True; + } + + return item; +} + +CJSON_PUBLIC(cJSON*) cJSON_CreateFalse(void) +{ + cJSON* item = cJSON_New_Item(&global_hooks); + if (item) + { + item->type = cJSON_False; + } + + return item; +} + +CJSON_PUBLIC(cJSON*) cJSON_CreateBool(cJSON_bool boolean) +{ + cJSON* item = cJSON_New_Item(&global_hooks); + if (item) + { + item->type = boolean ? cJSON_True : cJSON_False; + } + + return item; +} + +CJSON_PUBLIC(cJSON*) cJSON_CreateNumber(double num) +{ + cJSON* item = cJSON_New_Item(&global_hooks); + if (item) + { + item->type = cJSON_Number; + item->valuedouble = num; + + /* use saturation in case of overflow */ + if (num >= INT_MAX) + { + item->valueint = INT_MAX; + } + else if (num <= (double)INT_MIN) + { + item->valueint = INT_MIN; + } + else + { + item->valueint = (int)num; + } + } + + return item; +} + +CJSON_PUBLIC(cJSON*) cJSON_CreateString(const char* string) +{ + cJSON* item = cJSON_New_Item(&global_hooks); + if (item) + { + item->type = cJSON_String; + item->valuestring = (char*)cJSON_strdup((const unsigned char*)string, &global_hooks); + if (!item->valuestring) + { + cJSON_Delete(item); + return NULL; + } + } + + return item; +} + +CJSON_PUBLIC(cJSON*) cJSON_CreateStringReference(const char* string) +{ + cJSON* item = cJSON_New_Item(&global_hooks); + if (item != NULL) + { + item->type = cJSON_String | cJSON_IsReference; + item->valuestring = (char*)cast_away_const(string); + } + + return item; +} + +CJSON_PUBLIC(cJSON*) cJSON_CreateObjectReference(const cJSON* child) +{ + cJSON* item = cJSON_New_Item(&global_hooks); + if (item != NULL) { + item->type = cJSON_Object | cJSON_IsReference; + item->child = (cJSON*)cast_away_const(child); + } + + return item; +} + +CJSON_PUBLIC(cJSON*) cJSON_CreateArrayReference(const cJSON* child) { + cJSON* item = cJSON_New_Item(&global_hooks); + if (item != NULL) { + item->type = cJSON_Array | cJSON_IsReference; + item->child = (cJSON*)cast_away_const(child); + } + + return item; +} + +CJSON_PUBLIC(cJSON*) cJSON_CreateRaw(const char* raw) +{ + cJSON* item = cJSON_New_Item(&global_hooks); + if (item) + { + item->type = cJSON_Raw; + item->valuestring = (char*)cJSON_strdup((const unsigned char*)raw, &global_hooks); + if (!item->valuestring) + { + cJSON_Delete(item); + return NULL; + } + } + + return item; +} + +CJSON_PUBLIC(cJSON*) cJSON_CreateArray(void) +{ + cJSON* item = cJSON_New_Item(&global_hooks); + if (item) + { + item->type = cJSON_Array; + } + + return item; +} + +CJSON_PUBLIC(cJSON*) cJSON_CreateObject(void) +{ + cJSON* item = cJSON_New_Item(&global_hooks); + if (item) + { + item->type = cJSON_Object; + } + + return item; +} + +/* Create Arrays: */ +CJSON_PUBLIC(cJSON*) cJSON_CreateIntArray(const int* numbers, int count) +{ + size_t i = 0; + cJSON* n = NULL; + cJSON* p = NULL; + cJSON* a = NULL; + + if ((count < 0) || (numbers == NULL)) + { + return NULL; + } + + a = cJSON_CreateArray(); + + for (i = 0; a && (i < (size_t)count); i++) + { + n = cJSON_CreateNumber(numbers[i]); + if (!n) + { + cJSON_Delete(a); + return NULL; + } + if (!i) + { + a->child = n; + } + else + { + suffix_object(p, n); + } + p = n; + } + + if (a && a->child) { + a->child->prev = n; + } + + return a; +} + +CJSON_PUBLIC(cJSON*) cJSON_CreateFloatArray(const float* numbers, int count) +{ + size_t i = 0; + cJSON* n = NULL; + cJSON* p = NULL; + cJSON* a = NULL; + + if ((count < 0) || (numbers == NULL)) + { + return NULL; + } + + a = cJSON_CreateArray(); + + for (i = 0; a && (i < (size_t)count); i++) + { + n = cJSON_CreateNumber((double)numbers[i]); + if (!n) + { + cJSON_Delete(a); + return NULL; + } + if (!i) + { + a->child = n; + } + else + { + suffix_object(p, n); + } + p = n; + } + + if (a && a->child) { + a->child->prev = n; + } + + return a; +} + +CJSON_PUBLIC(cJSON*) cJSON_CreateDoubleArray(const double* numbers, int count) +{ + size_t i = 0; + cJSON* n = NULL; + cJSON* p = NULL; + cJSON* a = NULL; + + if ((count < 0) || (numbers == NULL)) + { + return NULL; + } + + a = cJSON_CreateArray(); + + for (i = 0; a && (i < (size_t)count); i++) + { + n = cJSON_CreateNumber(numbers[i]); + if (!n) + { + cJSON_Delete(a); + return NULL; + } + if (!i) + { + a->child = n; + } + else + { + suffix_object(p, n); + } + p = n; + } + + if (a && a->child) { + a->child->prev = n; + } + + return a; +} + +CJSON_PUBLIC(cJSON*) cJSON_CreateStringArray(const char* const* strings, int count) +{ + size_t i = 0; + cJSON* n = NULL; + cJSON* p = NULL; + cJSON* a = NULL; + + if ((count < 0) || (strings == NULL)) + { + return NULL; + } + + a = cJSON_CreateArray(); + + for (i = 0; a && (i < (size_t)count); i++) + { + n = cJSON_CreateString(strings[i]); + if (!n) + { + cJSON_Delete(a); + return NULL; + } + if (!i) + { + a->child = n; + } + else + { + suffix_object(p, n); + } + p = n; + } + + if (a && a->child) { + a->child->prev = n; + } + + return a; +} + +/* Duplication */ +CJSON_PUBLIC(cJSON*) cJSON_Duplicate(const cJSON* item, cJSON_bool recurse) +{ + cJSON* newitem = NULL; + cJSON* child = NULL; + cJSON* next = NULL; + cJSON* newchild = NULL; + + /* Bail on bad ptr */ + if (!item) + { + goto fail; + } + /* Create new item */ + newitem = cJSON_New_Item(&global_hooks); + if (!newitem) + { + goto fail; + } + /* Copy over all vars */ + newitem->type = item->type & (~cJSON_IsReference); + newitem->valueint = item->valueint; + newitem->valuedouble = item->valuedouble; + if (item->valuestring) + { + newitem->valuestring = (char*)cJSON_strdup((unsigned char*)item->valuestring, &global_hooks); + if (!newitem->valuestring) + { + goto fail; + } + } + if (item->string) + { + newitem->string = (item->type & cJSON_StringIsConst) ? item->string : (char*)cJSON_strdup((unsigned char*)item->string, &global_hooks); + if (!newitem->string) + { + goto fail; + } + } + /* If non-recursive, then we're done! */ + if (!recurse) + { + return newitem; + } + /* Walk the ->next chain for the child. */ + child = item->child; + while (child != NULL) + { + newchild = cJSON_Duplicate(child, true); /* Duplicate (with recurse) each item in the ->next chain */ + if (!newchild) + { + goto fail; + } + if (next != NULL) + { + /* If newitem->child already set, then crosswire ->prev and ->next and move on */ + next->next = newchild; + newchild->prev = next; + next = newchild; + } + else + { + /* Set newitem->child and move to it */ + newitem->child = newchild; + next = newchild; + } + child = child->next; + } + if (newitem && newitem->child) + { + newitem->child->prev = newchild; + } + + return newitem; + +fail: + if (newitem != NULL) + { + cJSON_Delete(newitem); + } + + return NULL; +} + +static void skip_oneline_comment(char** input) +{ + *input += static_strlen("//"); + + for (; (*input)[0] != '\0'; ++(*input)) + { + if ((*input)[0] == '\n') { + *input += static_strlen("\n"); + return; + } + } +} + +static void skip_multiline_comment(char** input) +{ + *input += static_strlen("/*"); + + for (; (*input)[0] != '\0'; ++(*input)) + { + if (((*input)[0] == '*') && ((*input)[1] == '/')) + { + *input += static_strlen("*/"); + return; + } + } +} + +static void minify_string(char** input, char** output) { + (*output)[0] = (*input)[0]; + *input += static_strlen("\""); + *output += static_strlen("\""); + + + for (; (*input)[0] != '\0'; (void)++(*input), ++(*output)) { + (*output)[0] = (*input)[0]; + + if ((*input)[0] == '\"') { + (*output)[0] = '\"'; + *input += static_strlen("\""); + *output += static_strlen("\""); + return; + } + else if (((*input)[0] == '\\') && ((*input)[1] == '\"')) { + (*output)[1] = (*input)[1]; + *input += static_strlen("\""); + *output += static_strlen("\""); + } + } +} + +CJSON_PUBLIC(void) cJSON_Minify(char* json) +{ + char* into = json; + + if (json == NULL) + { + return; + } + + while (json[0] != '\0') + { + switch (json[0]) + { + case ' ': + case '\t': + case '\r': + case '\n': + json++; + break; + + case '/': + if (json[1] == '/') + { + skip_oneline_comment(&json); + } + else if (json[1] == '*') + { + skip_multiline_comment(&json); + } + else { + json++; + } + break; + + case '\"': + minify_string(&json, (char**)&into); + break; + + default: + into[0] = json[0]; + json++; + into++; + } + } + + /* and null-terminate. */ + *into = '\0'; +} + +CJSON_PUBLIC(cJSON_bool) cJSON_IsInvalid(const cJSON* const item) +{ + if (item == NULL) + { + return false; + } + + return (item->type & 0xFF) == cJSON_Invalid; +} + +CJSON_PUBLIC(cJSON_bool) cJSON_IsFalse(const cJSON* const item) +{ + if (item == NULL) + { + return false; + } + + return (item->type & 0xFF) == cJSON_False; +} + +CJSON_PUBLIC(cJSON_bool) cJSON_IsTrue(const cJSON* const item) +{ + if (item == NULL) + { + return false; + } + + return (item->type & 0xff) == cJSON_True; +} + + +CJSON_PUBLIC(cJSON_bool) cJSON_IsBool(const cJSON* const item) +{ + if (item == NULL) + { + return false; + } + + return (item->type & (cJSON_True | cJSON_False)) != 0; +} +CJSON_PUBLIC(cJSON_bool) cJSON_IsNull(const cJSON* const item) +{ + if (item == NULL) + { + return false; + } + + return (item->type & 0xFF) == cJSON_NULL; +} + +CJSON_PUBLIC(cJSON_bool) cJSON_IsNumber(const cJSON* const item) +{ + if (item == NULL) + { + return false; + } + + return (item->type & 0xFF) == cJSON_Number; +} + +CJSON_PUBLIC(cJSON_bool) cJSON_IsString(const cJSON* const item) +{ + if (item == NULL) + { + return false; + } + + return (item->type & 0xFF) == cJSON_String; +} + +CJSON_PUBLIC(cJSON_bool) cJSON_IsArray(const cJSON* const item) +{ + if (item == NULL) + { + return false; + } + + return (item->type & 0xFF) == cJSON_Array; +} + +CJSON_PUBLIC(cJSON_bool) cJSON_IsObject(const cJSON* const item) +{ + if (item == NULL) + { + return false; + } + + return (item->type & 0xFF) == cJSON_Object; +} + +CJSON_PUBLIC(cJSON_bool) cJSON_IsRaw(const cJSON* const item) +{ + if (item == NULL) + { + return false; + } + + return (item->type & 0xFF) == cJSON_Raw; +} + +CJSON_PUBLIC(cJSON_bool) cJSON_Compare(const cJSON* const a, const cJSON* const b, const cJSON_bool case_sensitive) +{ + if ((a == NULL) || (b == NULL) || ((a->type & 0xFF) != (b->type & 0xFF))) + { + return false; + } + + /* check if type is valid */ + switch (a->type & 0xFF) + { + case cJSON_False: + case cJSON_True: + case cJSON_NULL: + case cJSON_Number: + case cJSON_String: + case cJSON_Raw: + case cJSON_Array: + case cJSON_Object: + break; + + default: + return false; + } + + /* identical objects are equal */ + if (a == b) + { + return true; + } + + switch (a->type & 0xFF) + { + /* in these cases and equal type is enough */ + case cJSON_False: + case cJSON_True: + case cJSON_NULL: + return true; + + case cJSON_Number: + if (compare_double(a->valuedouble, b->valuedouble)) + { + return true; + } + return false; + + case cJSON_String: + case cJSON_Raw: + if ((a->valuestring == NULL) || (b->valuestring == NULL)) + { + return false; + } + if (strcmp(a->valuestring, b->valuestring) == 0) + { + return true; + } + + return false; + + case cJSON_Array: + { + cJSON* a_element = a->child; + cJSON* b_element = b->child; + + for (; (a_element != NULL) && (b_element != NULL);) + { + if (!cJSON_Compare(a_element, b_element, case_sensitive)) + { + return false; + } + + a_element = a_element->next; + b_element = b_element->next; + } + + /* one of the arrays is longer than the other */ + if (a_element != b_element) { + return false; + } + + return true; + } + + case cJSON_Object: + { + cJSON* a_element = NULL; + cJSON* b_element = NULL; + cJSON_ArrayForEach(a_element, a) + { + /* TODO This has O(n^2) runtime, which is horrible! */ + b_element = get_object_item(b, a_element->string, case_sensitive); + if (b_element == NULL) + { + return false; + } + + if (!cJSON_Compare(a_element, b_element, case_sensitive)) + { + return false; + } + } + + /* doing this twice, once on a and b to prevent true comparison if a subset of b + * TODO: Do this the proper way, this is just a fix for now */ + cJSON_ArrayForEach(b_element, b) + { + a_element = get_object_item(a, b_element->string, case_sensitive); + if (a_element == NULL) + { + return false; + } + + if (!cJSON_Compare(b_element, a_element, case_sensitive)) + { + return false; + } + } + + return true; + } + + default: + return false; + } +} + +CJSON_PUBLIC(void*) cJSON_malloc(size_t size) +{ + return global_hooks.allocate(size); +} + +CJSON_PUBLIC(void) cJSON_free(void* object) +{ + global_hooks.deallocate(object); +} diff --git a/disasterserver_c/cJSON.h b/disasterserver_c/cJSON.h new file mode 100644 index 0000000..8392abf --- /dev/null +++ b/disasterserver_c/cJSON.h @@ -0,0 +1,300 @@ +/* + Copyright (c) 2009-2017 Dave Gamble and cJSON contributors + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + THE SOFTWARE. +*/ + +#ifndef cJSON__h +#define cJSON__h + +#ifdef __cplusplus +extern "C" +{ +#endif + +#if !defined(__WINDOWS__) && (defined(WIN32) || defined(WIN64) || defined(_MSC_VER) || defined(_WIN32)) +#define __WINDOWS__ +#endif + +#ifdef __WINDOWS__ + + /* When compiling for windows, we specify a specific calling convention to avoid issues where we are being called from a project with a different default calling convention. For windows you have 3 define options: + + CJSON_HIDE_SYMBOLS - Define this in the case where you don't want to ever dllexport symbols + CJSON_EXPORT_SYMBOLS - Define this on library build when you want to dllexport symbols (default) + CJSON_IMPORT_SYMBOLS - Define this if you want to dllimport symbol + + For *nix builds that support visibility attribute, you can define similar behavior by + + setting default visibility to hidden by adding + -fvisibility=hidden (for gcc) + or + -xldscope=hidden (for sun cc) + to CFLAGS + + then using the CJSON_API_VISIBILITY flag to "export" the same symbols the way CJSON_EXPORT_SYMBOLS does + + */ + +#define CJSON_CDECL __cdecl +#define CJSON_STDCALL __stdcall + + /* export symbols by default, this is necessary for copy pasting the C and header file */ +#if !defined(CJSON_HIDE_SYMBOLS) && !defined(CJSON_IMPORT_SYMBOLS) && !defined(CJSON_EXPORT_SYMBOLS) +#define CJSON_EXPORT_SYMBOLS +#endif + +#if defined(CJSON_HIDE_SYMBOLS) +#define CJSON_PUBLIC(type) type CJSON_STDCALL +#elif defined(CJSON_EXPORT_SYMBOLS) +#define CJSON_PUBLIC(type) __declspec(dllexport) type CJSON_STDCALL +#elif defined(CJSON_IMPORT_SYMBOLS) +#define CJSON_PUBLIC(type) __declspec(dllimport) type CJSON_STDCALL +#endif +#else /* !__WINDOWS__ */ +#define CJSON_CDECL +#define CJSON_STDCALL + +#if (defined(__GNUC__) || defined(__SUNPRO_CC) || defined (__SUNPRO_C)) && defined(CJSON_API_VISIBILITY) +#define CJSON_PUBLIC(type) __attribute__((visibility("default"))) type +#else +#define CJSON_PUBLIC(type) type +#endif +#endif + + /* project version */ +#define CJSON_VERSION_MAJOR 1 +#define CJSON_VERSION_MINOR 7 +#define CJSON_VERSION_PATCH 16 + +#include + +/* cJSON Types: */ +#define cJSON_Invalid (0) +#define cJSON_False (1 << 0) +#define cJSON_True (1 << 1) +#define cJSON_NULL (1 << 2) +#define cJSON_Number (1 << 3) +#define cJSON_String (1 << 4) +#define cJSON_Array (1 << 5) +#define cJSON_Object (1 << 6) +#define cJSON_Raw (1 << 7) /* raw json */ + +#define cJSON_IsReference 256 +#define cJSON_StringIsConst 512 + +/* The cJSON structure: */ + typedef struct cJSON + { + /* next/prev allow you to walk array/object chains. Alternatively, use GetArraySize/GetArrayItem/GetObjectItem */ + struct cJSON* next; + struct cJSON* prev; + /* An array or object item will have a child pointer pointing to a chain of the items in the array/object. */ + struct cJSON* child; + + /* The type of the item, as above. */ + int type; + + /* The item's string, if type==cJSON_String and type == cJSON_Raw */ + char* valuestring; + /* writing to valueint is DEPRECATED, use cJSON_SetNumberValue instead */ + int valueint; + /* The item's number, if type==cJSON_Number */ + double valuedouble; + + /* The item's name string, if this item is the child of, or is in the list of subitems of an object. */ + char* string; + } cJSON; + + typedef struct cJSON_Hooks + { + /* malloc/free are CDECL on Windows regardless of the default calling convention of the compiler, so ensure the hooks allow passing those functions directly. */ + void* (CJSON_CDECL* malloc_fn)(size_t sz); + void (CJSON_CDECL* free_fn)(void* ptr); + } cJSON_Hooks; + + typedef int cJSON_bool; + + /* Limits how deeply nested arrays/objects can be before cJSON rejects to parse them. + * This is to prevent stack overflows. */ +#ifndef CJSON_NESTING_LIMIT +#define CJSON_NESTING_LIMIT 1000 +#endif + + /* returns the version of cJSON as a string */ + CJSON_PUBLIC(const char*) cJSON_Version(void); + + /* Supply malloc, realloc and free functions to cJSON */ + CJSON_PUBLIC(void) cJSON_InitHooks(cJSON_Hooks* hooks); + + /* Memory Management: the caller is always responsible to free the results from all variants of cJSON_Parse (with cJSON_Delete) and cJSON_Print (with stdlib free, cJSON_Hooks.free_fn, or cJSON_free as appropriate). The exception is cJSON_PrintPreallocated, where the caller has full responsibility of the buffer. */ + /* Supply a block of JSON, and this returns a cJSON object you can interrogate. */ + CJSON_PUBLIC(cJSON*) cJSON_Parse(const char* value); + CJSON_PUBLIC(cJSON*) cJSON_ParseWithLength(const char* value, size_t buffer_length); + /* ParseWithOpts allows you to require (and check) that the JSON is null terminated, and to retrieve the pointer to the final byte parsed. */ + /* If you supply a ptr in return_parse_end and parsing fails, then return_parse_end will contain a pointer to the error so will match cJSON_GetErrorPtr(). */ + CJSON_PUBLIC(cJSON*) cJSON_ParseWithOpts(const char* value, const char** return_parse_end, cJSON_bool require_null_terminated); + CJSON_PUBLIC(cJSON*) cJSON_ParseWithLengthOpts(const char* value, size_t buffer_length, const char** return_parse_end, cJSON_bool require_null_terminated); + + /* Render a cJSON entity to text for transfer/storage. */ + CJSON_PUBLIC(char*) cJSON_Print(const cJSON* item); + /* Render a cJSON entity to text for transfer/storage without any formatting. */ + CJSON_PUBLIC(char*) cJSON_PrintUnformatted(const cJSON* item); + /* Render a cJSON entity to text using a buffered strategy. prebuffer is a guess at the final size. guessing well reduces reallocation. fmt=0 gives unformatted, =1 gives formatted */ + CJSON_PUBLIC(char*) cJSON_PrintBuffered(const cJSON* item, int prebuffer, cJSON_bool fmt); + /* Render a cJSON entity to text using a buffer already allocated in memory with given length. Returns 1 on success and 0 on failure. */ + /* NOTE: cJSON is not always 100% accurate in estimating how much memory it will use, so to be safe allocate 5 bytes more than you actually need */ + CJSON_PUBLIC(cJSON_bool) cJSON_PrintPreallocated(cJSON* item, char* buffer, const int length, const cJSON_bool format); + /* Delete a cJSON entity and all subentities. */ + CJSON_PUBLIC(void) cJSON_Delete(cJSON* item); + + /* Returns the number of items in an array (or object). */ + CJSON_PUBLIC(int) cJSON_GetArraySize(const cJSON* array); + /* Retrieve item number "index" from array "array". Returns NULL if unsuccessful. */ + CJSON_PUBLIC(cJSON*) cJSON_GetArrayItem(const cJSON* array, int index); + /* Get item "string" from object. Case insensitive. */ + CJSON_PUBLIC(cJSON*) cJSON_GetObjectItem(const cJSON* const object, const char* const string); + CJSON_PUBLIC(cJSON*) cJSON_GetObjectItemCaseSensitive(const cJSON* const object, const char* const string); + CJSON_PUBLIC(cJSON_bool) cJSON_HasObjectItem(const cJSON* object, const char* string); + /* For analysing failed parses. This returns a pointer to the parse error. You'll probably need to look a few chars back to make sense of it. Defined when cJSON_Parse() returns 0. 0 when cJSON_Parse() succeeds. */ + CJSON_PUBLIC(const char*) cJSON_GetErrorPtr(void); + + /* Check item type and return its value */ + CJSON_PUBLIC(char*) cJSON_GetStringValue(const cJSON* const item); + CJSON_PUBLIC(double) cJSON_GetNumberValue(const cJSON* const item); + + /* These functions check the type of an item */ + CJSON_PUBLIC(cJSON_bool) cJSON_IsInvalid(const cJSON* const item); + CJSON_PUBLIC(cJSON_bool) cJSON_IsFalse(const cJSON* const item); + CJSON_PUBLIC(cJSON_bool) cJSON_IsTrue(const cJSON* const item); + CJSON_PUBLIC(cJSON_bool) cJSON_IsBool(const cJSON* const item); + CJSON_PUBLIC(cJSON_bool) cJSON_IsNull(const cJSON* const item); + CJSON_PUBLIC(cJSON_bool) cJSON_IsNumber(const cJSON* const item); + CJSON_PUBLIC(cJSON_bool) cJSON_IsString(const cJSON* const item); + CJSON_PUBLIC(cJSON_bool) cJSON_IsArray(const cJSON* const item); + CJSON_PUBLIC(cJSON_bool) cJSON_IsObject(const cJSON* const item); + CJSON_PUBLIC(cJSON_bool) cJSON_IsRaw(const cJSON* const item); + + /* These calls create a cJSON item of the appropriate type. */ + CJSON_PUBLIC(cJSON*) cJSON_CreateNull(void); + CJSON_PUBLIC(cJSON*) cJSON_CreateTrue(void); + CJSON_PUBLIC(cJSON*) cJSON_CreateFalse(void); + CJSON_PUBLIC(cJSON*) cJSON_CreateBool(cJSON_bool boolean); + CJSON_PUBLIC(cJSON*) cJSON_CreateNumber(double num); + CJSON_PUBLIC(cJSON*) cJSON_CreateString(const char* string); + /* raw json */ + CJSON_PUBLIC(cJSON*) cJSON_CreateRaw(const char* raw); + CJSON_PUBLIC(cJSON*) cJSON_CreateArray(void); + CJSON_PUBLIC(cJSON*) cJSON_CreateObject(void); + + /* Create a string where valuestring references a string so + * it will not be freed by cJSON_Delete */ + CJSON_PUBLIC(cJSON*) cJSON_CreateStringReference(const char* string); + /* Create an object/array that only references it's elements so + * they will not be freed by cJSON_Delete */ + CJSON_PUBLIC(cJSON*) cJSON_CreateObjectReference(const cJSON* child); + CJSON_PUBLIC(cJSON*) cJSON_CreateArrayReference(const cJSON* child); + + /* These utilities create an Array of count items. + * The parameter count cannot be greater than the number of elements in the number array, otherwise array access will be out of bounds.*/ + CJSON_PUBLIC(cJSON*) cJSON_CreateIntArray(const int* numbers, int count); + CJSON_PUBLIC(cJSON*) cJSON_CreateFloatArray(const float* numbers, int count); + CJSON_PUBLIC(cJSON*) cJSON_CreateDoubleArray(const double* numbers, int count); + CJSON_PUBLIC(cJSON*) cJSON_CreateStringArray(const char* const* strings, int count); + + /* Append item to the specified array/object. */ + CJSON_PUBLIC(cJSON_bool) cJSON_AddItemToArray(cJSON* array, cJSON* item); + CJSON_PUBLIC(cJSON_bool) cJSON_AddItemToObject(cJSON* object, const char* string, cJSON* item); + /* Use this when string is definitely const (i.e. a literal, or as good as), and will definitely survive the cJSON object. + * WARNING: When this function was used, make sure to always check that (item->type & cJSON_StringIsConst) is zero before + * writing to `item->string` */ + CJSON_PUBLIC(cJSON_bool) cJSON_AddItemToObjectCS(cJSON* object, const char* string, cJSON* item); + /* Append reference to item to the specified array/object. Use this when you want to add an existing cJSON to a new cJSON, but don't want to corrupt your existing cJSON. */ + CJSON_PUBLIC(cJSON_bool) cJSON_AddItemReferenceToArray(cJSON* array, cJSON* item); + CJSON_PUBLIC(cJSON_bool) cJSON_AddItemReferenceToObject(cJSON* object, const char* string, cJSON* item); + + /* Remove/Detach items from Arrays/Objects. */ + CJSON_PUBLIC(cJSON*) cJSON_DetachItemViaPointer(cJSON* parent, cJSON* const item); + CJSON_PUBLIC(cJSON*) cJSON_DetachItemFromArray(cJSON* array, int which); + CJSON_PUBLIC(void) cJSON_DeleteItemFromArray(cJSON* array, int which); + CJSON_PUBLIC(cJSON*) cJSON_DetachItemFromObject(cJSON* object, const char* string); + CJSON_PUBLIC(cJSON*) cJSON_DetachItemFromObjectCaseSensitive(cJSON* object, const char* string); + CJSON_PUBLIC(void) cJSON_DeleteItemFromObject(cJSON* object, const char* string); + CJSON_PUBLIC(void) cJSON_DeleteItemFromObjectCaseSensitive(cJSON* object, const char* string); + + /* Update array items. */ + CJSON_PUBLIC(cJSON_bool) cJSON_InsertItemInArray(cJSON* array, int which, cJSON* newitem); /* Shifts pre-existing items to the right. */ + CJSON_PUBLIC(cJSON_bool) cJSON_ReplaceItemViaPointer(cJSON* const parent, cJSON* const item, cJSON* replacement); + CJSON_PUBLIC(cJSON_bool) cJSON_ReplaceItemInArray(cJSON* array, int which, cJSON* newitem); + CJSON_PUBLIC(cJSON_bool) cJSON_ReplaceItemInObject(cJSON* object, const char* string, cJSON* newitem); + CJSON_PUBLIC(cJSON_bool) cJSON_ReplaceItemInObjectCaseSensitive(cJSON* object, const char* string, cJSON* newitem); + + /* Duplicate a cJSON item */ + CJSON_PUBLIC(cJSON*) cJSON_Duplicate(const cJSON* item, cJSON_bool recurse); + /* Duplicate will create a new, identical cJSON item to the one you pass, in new memory that will + * need to be released. With recurse!=0, it will duplicate any children connected to the item. + * The item->next and ->prev pointers are always zero on return from Duplicate. */ + /* Recursively compare two cJSON items for equality. If either a or b is NULL or invalid, they will be considered unequal. + * case_sensitive determines if object keys are treated case sensitive (1) or case insensitive (0) */ + CJSON_PUBLIC(cJSON_bool) cJSON_Compare(const cJSON* const a, const cJSON* const b, const cJSON_bool case_sensitive); + + /* Minify a strings, remove blank characters(such as ' ', '\t', '\r', '\n') from strings. + * The input pointer json cannot point to a read-only address area, such as a string constant, + * but should point to a readable and writable address area. */ + CJSON_PUBLIC(void) cJSON_Minify(char* json); + + /* Helper functions for creating and adding items to an object at the same time. + * They return the added item or NULL on failure. */ + CJSON_PUBLIC(cJSON*) cJSON_AddNullToObject(cJSON* const object, const char* const name); + CJSON_PUBLIC(cJSON*) cJSON_AddTrueToObject(cJSON* const object, const char* const name); + CJSON_PUBLIC(cJSON*) cJSON_AddFalseToObject(cJSON* const object, const char* const name); + CJSON_PUBLIC(cJSON*) cJSON_AddBoolToObject(cJSON* const object, const char* const name, const cJSON_bool boolean); + CJSON_PUBLIC(cJSON*) cJSON_AddNumberToObject(cJSON* const object, const char* const name, const double number); + CJSON_PUBLIC(cJSON*) cJSON_AddStringToObject(cJSON* const object, const char* const name, const char* const string); + CJSON_PUBLIC(cJSON*) cJSON_AddRawToObject(cJSON* const object, const char* const name, const char* const raw); + CJSON_PUBLIC(cJSON*) cJSON_AddObjectToObject(cJSON* const object, const char* const name); + CJSON_PUBLIC(cJSON*) cJSON_AddArrayToObject(cJSON* const object, const char* const name); + + /* When assigning an integer value, it needs to be propagated to valuedouble too. */ +#define cJSON_SetIntValue(object, number) ((object) ? (object)->valueint = (object)->valuedouble = (number) : (number)) +/* helper for the cJSON_SetNumberValue macro */ + CJSON_PUBLIC(double) cJSON_SetNumberHelper(cJSON* object, double number); +#define cJSON_SetNumberValue(object, number) ((object != NULL) ? cJSON_SetNumberHelper(object, (double)number) : (number)) + /* Change the valuestring of a cJSON_String object, only takes effect when type of object is cJSON_String */ + CJSON_PUBLIC(char*) cJSON_SetValuestring(cJSON* object, const char* valuestring); + + /* If the object is not a boolean type this does nothing and returns cJSON_Invalid else it returns the new type*/ +#define cJSON_SetBoolValue(object, boolValue) ( \ + (object != NULL && ((object)->type & (cJSON_False|cJSON_True))) ? \ + (object)->type=((object)->type &(~(cJSON_False|cJSON_True)))|((boolValue)?cJSON_True:cJSON_False) : \ + cJSON_Invalid\ +) + +/* Macro for iterating over an array or object */ +#define cJSON_ArrayForEach(element, array) for(element = (array != NULL) ? (array)->child : NULL; element != NULL; element = element->next) + +/* malloc/free objects using the malloc/free functions that have been set with cJSON_InitHooks */ + CJSON_PUBLIC(void*) cJSON_malloc(size_t size); + CJSON_PUBLIC(void) cJSON_free(void* object); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/disasterserver_c/entities/Act9Wall.c b/disasterserver_c/entities/Act9Wall.c new file mode 100644 index 0000000..c4d4c07 --- /dev/null +++ b/disasterserver_c/entities/Act9Wall.c @@ -0,0 +1,89 @@ +#include "Server.h" +#include + +#define ACT9_ROOM_WIDTH (3072) + +bool act9wall_init(Server* server, Entity* entity) +{ + Act9Wall* wall = (Act9Wall*)entity; + wall->start_time = (server->game.time_sec * TICKSPERSEC + server->game.time); + return true; +} + +bool act9wall_tick(Server* server, Entity* entity) +{ + Act9Wall* wall = (Act9Wall*)entity; + + double time = (server->game.time_sec * TICKSPERSEC + server->game.time); + double off = (double)(wall->start_time - time) / (double)wall->start_time; + + double x = wall->pos.x * off; + double y = wall->pos.y * off; + double wx; + double hy; + + Packet pack; + PacketCreate(&pack, SERVER_ACT9WALL_STATE); + PacketWrite(&pack, packet_write8, wall->wid); + PacketWrite(&pack, packet_write16, (uint16_t)x); + PacketWrite(&pack, packet_write16, (uint16_t)y); + server_broadcast(server, &pack, false); + + switch(wall->wid) + { + case 0: + { + x = -2240; + y = y - 768; + wx = x + (64 * 117); + hy = y + (64 * 12); + break; + } + + case 1: + { + x = x - 2240; + wx = x + (64 * 34); + hy = y + (64 * 19.5); + break; + } + + case 2: + { + x = (ACT9_ROOM_WIDTH - x) + 64; + wx = x + (64 * 34); + hy = y + (64 * 19.5); + break; + } + + default: + { + Err("Invalid wall id!"); + return false; + } + } + + for(size_t i = 0; i < server->peers.capacity; i++) + { + PeerData* data = (PeerData*)server->peers.ptr[i]; + if(!data) + continue; + + if(!data->in_game) + continue; + + if(data->plr.pos.x == 0 && data->plr.pos.y == 0) + continue; + + if(data->plr.flags & PLAYER_DEAD) + continue; + + if(data->plr.pos.x >= x && data->plr.pos.y >= y && data->plr.pos.x <= wx && data->plr.pos.y <= hy) + { + server_disconnect(server, data->peer, DR_OTHER, "Inside the wall for too long!"); + continue; + } + } + + return true; +} \ No newline at end of file diff --git a/disasterserver_c/entities/Act9Wall.h b/disasterserver_c/entities/Act9Wall.h new file mode 100644 index 0000000..ae94e5c --- /dev/null +++ b/disasterserver_c/entities/Act9Wall.h @@ -0,0 +1,17 @@ +#ifndef ACT9WALL_H +#define ACT9WALL_H +#include "../States.h" + +bool act9wall_init(Server* server, Entity* entity); +bool act9wall_tick(Server* server, Entity* entity); + +typedef struct +{ + ENTITY_BODY + + uint8_t wid; + double start_time; +} Act9Wall; +#define MakeAct9Wall(wid, x, y) ((Act9Wall) { MakeEntity("act9wall", x, y) act9wall_init, act9wall_tick, NULL, wid, 0 }) + +#endif \ No newline at end of file diff --git a/disasterserver_c/entities/BlackRing.c b/disasterserver_c/entities/BlackRing.c new file mode 100644 index 0000000..d73540d --- /dev/null +++ b/disasterserver_c/entities/BlackRing.c @@ -0,0 +1,35 @@ +#include + +bool bring_init(Server* server, Entity* entity) +{ + if (entity->pos.x == MAP_BRING || entity->pos.y == MAP_BRING) + { + Packet pack; + PacketCreate(&pack, SERVER_BRING_STATE) + PacketWrite(&pack, packet_write8, 0); + PacketWrite(&pack, packet_write16, entity->id); + server_broadcast(server, &pack, true); + + return true; + } + + Packet pack; + PacketCreate(&pack, SERVER_ERECTOR_BRING_SPAWN); + PacketWrite(&pack, packet_write16, entity->id); + PacketWrite(&pack, packet_write16, (uint16_t)entity->pos.x); + PacketWrite(&pack, packet_write16, (uint16_t)entity->pos.y); + server_broadcast(server, &pack, true); + + return true; +} + +bool bring_uninit(Server* server, Entity* entity) +{ + Packet pack; + PacketCreate(&pack, SERVER_BRING_STATE) + PacketWrite(&pack, packet_write8, 1); + PacketWrite(&pack, packet_write16, entity->id); + server_broadcast(server, &pack, true); + + return true; +} diff --git a/disasterserver_c/entities/BlackRing.h b/disasterserver_c/entities/BlackRing.h new file mode 100644 index 0000000..a7cb6c0 --- /dev/null +++ b/disasterserver_c/entities/BlackRing.h @@ -0,0 +1,16 @@ +#ifndef BRING_H +#define BRING_H +#include "../States.h" +#include + +bool bring_init(Server* server, Entity* entity); +bool bring_uninit(Server* server, Entity* entity); + +typedef struct +{ + ENTITY_BODY +} BRing; +#define MakeBlackRing(x, y) ((BRing) { MakeEntity("bring", x, y) bring_init, NULL, bring_uninit}) +#define MAP_BRING INT16_MAX + +#endif \ No newline at end of file diff --git a/disasterserver_c/entities/CreamRing.c b/disasterserver_c/entities/CreamRing.c new file mode 100644 index 0000000..358d426 --- /dev/null +++ b/disasterserver_c/entities/CreamRing.c @@ -0,0 +1,34 @@ +#include +#include +#include + +bool cring_init(Server* server, Entity* entity) +{ + CreamRing* ring = (CreamRing*)entity; + + Packet pack; + PacketCreate(&pack, SERVER_RING_STATE); + PacketWrite(&pack, packet_write8, 2); + PacketWrite(&pack, packet_write16, (uint16_t)ring->pos.x); + PacketWrite(&pack, packet_write16, (uint16_t)ring->pos.y); + PacketWrite(&pack, packet_write8, ring->rid); + PacketWrite(&pack, packet_write16, ring->id); + PacketWrite(&pack, packet_write8, ring->red); + server_broadcast(server, &pack, true); + + return true; +} + +bool cring_uninit(Server* server, Entity* entity) +{ + CreamRing* ring = (CreamRing*)entity; + + Packet pack; + PacketCreate(&pack, SERVER_RING_STATE); + PacketWrite(&pack, packet_write8, 1); + PacketWrite(&pack, packet_write8, ring->rid); + PacketWrite(&pack, packet_write16, ring->id); + server_broadcast(server, &pack, true); + + return true; +} \ No newline at end of file diff --git a/disasterserver_c/entities/CreamRing.h b/disasterserver_c/entities/CreamRing.h new file mode 100644 index 0000000..9871bed --- /dev/null +++ b/disasterserver_c/entities/CreamRing.h @@ -0,0 +1,17 @@ +#ifndef CREAM_RING +#define CREAM_RING +#include "../States.h" + +bool cring_init(Server* server, Entity* entity); +bool cring_uninit(Server* server, Entity* entity); + +typedef struct +{ + ENTITY_BODY + + uint8_t rid; + uint8_t red; +} CreamRing; +#define MakeCreamRing(x, y, red) ((CreamRing) { MakeEntity("cring", x, y) cring_init, NULL, cring_uninit, 255, red }) + +#endif \ No newline at end of file diff --git a/disasterserver_c/entities/DTBall.c b/disasterserver_c/entities/DTBall.c new file mode 100644 index 0000000..77cc0f3 --- /dev/null +++ b/disasterserver_c/entities/DTBall.c @@ -0,0 +1,29 @@ +#include "Server.h" +#include + +bool dtball_tick(Server* server, Entity* entity) +{ + DTBall* ball = (DTBall*)entity; + + if (ball->side) + { + ball->state += 0.015 * server->delta; + + if (ball->state >= 1) + ball->side = 0; + } + else + { + ball->state -= 0.015 * server->delta; + + if (ball->state <= -1) + ball->side = 1; + } + + Packet pack; + PacketCreate(&pack, SERVER_DTBALL_STATE); + PacketWrite(&pack, packet_writefloat, (float)ball->state); + server_broadcast(server, &pack, false); + + return true; +} diff --git a/disasterserver_c/entities/DTBall.h b/disasterserver_c/entities/DTBall.h new file mode 100644 index 0000000..a675a0f --- /dev/null +++ b/disasterserver_c/entities/DTBall.h @@ -0,0 +1,16 @@ +#ifndef DTBALL_H +#define DTBALL_H +#include "../States.h" + +bool dtball_tick(Server* server, Entity* entity); + +typedef struct +{ + ENTITY_BODY + + double state; + uint8_t side; +} DTBall; +#define MakeDTBall() ((DTBall) { MakeEntity("dtball", 0, 0) NULL, dtball_tick, NULL, 0, 0 }) + +#endif \ No newline at end of file diff --git a/disasterserver_c/entities/DTStalactits.c b/disasterserver_c/entities/DTStalactits.c new file mode 100644 index 0000000..5c55745 --- /dev/null +++ b/disasterserver_c/entities/DTStalactits.c @@ -0,0 +1,113 @@ +#include "Server.h" +#include + +bool dtst_init(Server* server, Entity* entity) +{ + DTStalactits* titi = (DTStalactits*)entity; + + Packet pack; + PacketCreate(&pack, SERVER_DTASS_STATE); + PacketWrite(&pack, packet_write8, 0); + PacketWrite(&pack, packet_write8, titi->sid); + PacketWrite(&pack, packet_write16, (uint16_t)titi->pos.x); + PacketWrite(&pack, packet_write16, (uint16_t)titi->pos.y); + server_broadcast(server, &pack, true); + + return true; +} + +bool dtst_tick(Server* server, Entity* entity) +{ + DTStalactits* titi = (DTStalactits*)entity; + if (titi->state) + { + titi->vel += 0.164f * (float)server->delta; + titi->pos.y += titi->vel * (float)server->delta; + + Packet pack; + PacketCreate(&pack, SERVER_DTASS_STATE); + PacketWrite(&pack, packet_write8, titi->sid); + PacketWrite(&pack, packet_write16, (uint16_t)titi->pos.x); + PacketWrite(&pack, packet_write16, (uint16_t)titi->pos.y); + server_broadcast(server, &pack, false); + } + else + { + if (!titi->show) + { + if (titi->timer > TICKSPERSEC) + titi->timer -= server->delta; + + if (titi->timer <= TICKSPERSEC) + { + Packet pack; + PacketCreate(&pack, SERVER_DTASS_STATE); + PacketWrite(&pack, packet_write8, 0); + PacketWrite(&pack, packet_write8, titi->sid); + PacketWrite(&pack, packet_write16, (uint16_t)titi->pos.x); + PacketWrite(&pack, packet_write16, (uint16_t)titi->pos.y); + server_broadcast(server, &pack, true); + + titi->show = true; + } + } + else + { + if (titi->timer > 0) + titi->timer -= server->delta; + } + + if (titi->timer <= 0) + { + for (size_t i = 0; i < server->peers.capacity; i++) + { + PeerData* data = (PeerData*)server->peers.ptr[i]; + if (!data) + continue; + + if(!data->in_game) + continue; + + if (data->plr.flags & PLAYER_DEAD) + continue; + + float dist = data->plr.pos.y - titi->pos.y; + if (dist > 0 && dist <= 336 && data->plr.pos.x >= titi->pos.x && data->plr.pos.x <= titi->pos.x + 80) + { + titi->vel = 0; + + Packet pack; + PacketCreate(&pack, SERVER_DTASS_STATE); + PacketWrite(&pack, packet_write8, 2); + PacketWrite(&pack, packet_write8, titi->sid); + server_broadcast(server, &pack, true); + + titi->state = true; + break; + } + } + } + } + + return true; +} + +bool dtst_activate(Server* server, DTStalactits* tits) +{ + if(!tits->state) + return true; + + tits->show = false; + tits->state = false; + tits->timer = (25.0 + rand() % 5 ) * TICKSPERSEC; + tits->pos.y = tits->sy; + tits->vel = 0; + + Packet pack; + PacketCreate(&pack, SERVER_DTASS_STATE); + PacketWrite(&pack, packet_write8, 1); + PacketWrite(&pack, packet_write8, tits->sid); + server_broadcast(server, &pack, true); + + return true; +} diff --git a/disasterserver_c/entities/DTStalactits.h b/disasterserver_c/entities/DTStalactits.h new file mode 100644 index 0000000..f06f55e --- /dev/null +++ b/disasterserver_c/entities/DTStalactits.h @@ -0,0 +1,23 @@ +#ifndef DTSTALACTITS_H +#define DTSTALACTITS_H +#include "../States.h" + +bool dtst_init(Server* server, Entity* entity); +bool dtst_tick(Server* server, Entity* entity); + +typedef struct +{ + ENTITY_BODY + + uint8_t sid; + bool state; + bool show; + uint16_t sx, sy; + double timer; + float vel; +} DTStalactits; +#define MakeDTStalactiti(id, x, y) ((DTStalactits) { MakeEntity("dttits", x, y) dtst_init, dtst_tick, NULL, id, 0, 1, x, y, 0, 0 }) + +bool dtst_activate(Server* server, DTStalactits* tits); + +#endif \ No newline at end of file diff --git a/disasterserver_c/entities/Dummy.c b/disasterserver_c/entities/Dummy.c new file mode 100644 index 0000000..4a77814 --- /dev/null +++ b/disasterserver_c/entities/Dummy.c @@ -0,0 +1,24 @@ +#include +#include + +bool dummy_tick(Server* server, Entity* entity) +{ + Dummy* dum = (Dummy*)entity; + + dum->pos.x += dum->vel * (float)server->delta; + dum->pos.x = (float)fmin(fmax(dum->pos.x, 1282), 2944); + dum->vel -= (fmin(fabs(dum->vel), 0.046875 * 4.) * sign(dum->vel)) * (float)server->delta; + + Packet pack; + PacketCreate(&pack, SERVER_FART_STATE); + PacketWrite(&pack, packet_write16, (float)dum->pos.x); + PacketWrite(&pack, packet_write16, (float)dum->pos.y); + server_broadcast(server, &pack, false); + + return true; +} + +void dummy_activate(Dummy* dummy, int8_t dir) +{ + dummy->vel = dir; +} diff --git a/disasterserver_c/entities/Dummy.h b/disasterserver_c/entities/Dummy.h new file mode 100644 index 0000000..13e3ea8 --- /dev/null +++ b/disasterserver_c/entities/Dummy.h @@ -0,0 +1,17 @@ +#ifndef DUMMY_H +#define DUMMY_H +#include "../States.h" + +bool dummy_tick(Server* server, Entity* entity); + +typedef struct +{ + ENTITY_BODY + + double vel; +} Dummy; +#define MakeDummy() ((Dummy) { MakeEntity("dummy", 1616, 2608) NULL, dummy_tick, NULL, 0 }) + +void dummy_activate(Dummy* dummy, int8_t dir); + +#endif \ No newline at end of file diff --git a/disasterserver_c/entities/EggmanTracker.c b/disasterserver_c/entities/EggmanTracker.c new file mode 100644 index 0000000..7bab70c --- /dev/null +++ b/disasterserver_c/entities/EggmanTracker.c @@ -0,0 +1,28 @@ +#include + +bool eggtrack_init(Server* server, Entity* entity) +{ + EggTracker* egg = (EggTracker*)entity; + + Packet pack; + PacketCreate(&pack, SERVER_ETRACKER_STATE); + PacketWrite(&pack, packet_write8, 0); + PacketWrite(&pack, packet_write16, egg->id); + PacketWrite(&pack, packet_write16, (uint16_t)egg->pos.x); + PacketWrite(&pack, packet_write16, (uint16_t)egg->pos.y); + server_broadcast(server, &pack, true); + return true; +} + +bool eggtrack_uninit(Server* server, Entity* entity) +{ + EggTracker* egg = (EggTracker*)entity; + + Packet pack; + PacketCreate(&pack, SERVER_ETRACKER_STATE); + PacketWrite(&pack, packet_write8, 1); + PacketWrite(&pack, packet_write16, egg->id); + PacketWrite(&pack, packet_write16, egg->activ_id); + server_broadcast(server, &pack, true); + return true; +} diff --git a/disasterserver_c/entities/EggmanTracker.h b/disasterserver_c/entities/EggmanTracker.h new file mode 100644 index 0000000..7aea466 --- /dev/null +++ b/disasterserver_c/entities/EggmanTracker.h @@ -0,0 +1,16 @@ +#ifndef EGGTRACK +#define EGGTRACK +#include "../States.h" + +bool eggtrack_init(Server* server, Entity* entity); +bool eggtrack_uninit(Server* server, Entity* entity); + +typedef struct +{ + ENTITY_BODY + + uint16_t activ_id; +} EggTracker; +#define MakeEggTrack(x, y) ((EggTracker) { MakeEntity("eggtrack", x, y) eggtrack_init, NULL, eggtrack_uninit, 0, }) + +#endif \ No newline at end of file diff --git a/disasterserver_c/entities/ExellerClone.c b/disasterserver_c/entities/ExellerClone.c new file mode 100644 index 0000000..ab8e8f0 --- /dev/null +++ b/disasterserver_c/entities/ExellerClone.c @@ -0,0 +1,23 @@ +#include + +bool exclone_init(Server* server, Entity* entity) +{ + ExellerClone* clone = (ExellerClone*)entity; + + Packet pack; + PacketCreate(&pack, SERVER_EXELLERCLONE_STATE); + PacketWrite(&pack, packet_write8, 0); + PacketWrite(&pack, packet_write16, clone->id); + PacketWrite(&pack, packet_write16, clone->owner); + PacketWrite(&pack, packet_write16, (uint16_t)clone->pos.x); + PacketWrite(&pack, packet_write16, (uint16_t)clone->pos.y); + PacketWrite(&pack, packet_write8, clone->dir); + server_broadcast(server, &pack, true); + + return true; +} + +bool exclone_uninit(Server* server, Entity* entity) +{ + return true; +} diff --git a/disasterserver_c/entities/ExellerClone.h b/disasterserver_c/entities/ExellerClone.h new file mode 100644 index 0000000..905f7d0 --- /dev/null +++ b/disasterserver_c/entities/ExellerClone.h @@ -0,0 +1,17 @@ +#ifndef EXELCLONE_H +#define EXELCLONE_H +#include "../States.h" + +bool exclone_init(Server* server, Entity* entity); +bool exclone_uninit(Server* server, Entity* entity); + +typedef struct +{ + ENTITY_BODY + + int8_t dir; + uint16_t owner; +} ExellerClone; +#define MakeExellerClone(x, y, dir, owner) ((ExellerClone) { MakeEntity("exclone", x, y) exclone_init, NULL, exclone_uninit, dir, owner }) + +#endif \ No newline at end of file diff --git a/disasterserver_c/entities/HDDoor.c b/disasterserver_c/entities/HDDoor.c new file mode 100644 index 0000000..1225fa8 --- /dev/null +++ b/disasterserver_c/entities/HDDoor.c @@ -0,0 +1,42 @@ +#include + +bool hddoor_tick(Server* server, Entity* entity) +{ + HDDoor* door = (HDDoor*)entity; + if (door->timer > 0) + { + door->timer -= server->delta; + if (door->timer <= 0) + { + Packet pack; + PacketCreate(&pack, SERVER_HDDOOR_STATE); + PacketWrite(&pack, packet_write8, 1); + PacketWrite(&pack, packet_write8, 1); + server_broadcast(server, &pack, true); + } + } + + return true; +} + +bool hddoor_toggle(Server* server, HDDoor* door) +{ + if (door->timer > 0) + return false; + + door->state = !door->state; + door->timer = 10.0 * TICKSPERSEC; + + Packet pack; + PacketCreate(&pack, SERVER_HDDOOR_STATE); + PacketWrite(&pack, packet_write8, 0); + PacketWrite(&pack, packet_write8, door->state); + server_broadcast(server, &pack, true); + + PacketCreate(&pack, SERVER_HDDOOR_STATE); + PacketWrite(&pack, packet_write8, 1); + PacketWrite(&pack, packet_write8, 0); + server_broadcast(server, &pack, true); + + return true; +} \ No newline at end of file diff --git a/disasterserver_c/entities/HDDoor.h b/disasterserver_c/entities/HDDoor.h new file mode 100644 index 0000000..de104a4 --- /dev/null +++ b/disasterserver_c/entities/HDDoor.h @@ -0,0 +1,18 @@ +#ifndef HDDOOR_H +#define HDDOOR_H +#include "../States.h" + +bool hddoor_tick(Server* server, Entity* entity); + +typedef struct +{ + ENTITY_BODY + + uint8_t state; + double timer; +} HDDoor; + +#define MakeHDDoor() ((HDDoor) { MakeEntity("hddoor", 0, 0) NULL, hddoor_tick, NULL, 0, 0 }) +bool hddoor_toggle(Server* server, HDDoor* door); + +#endif \ No newline at end of file diff --git a/disasterserver_c/entities/HillThunder.c b/disasterserver_c/entities/HillThunder.c new file mode 100644 index 0000000..6dd92ba --- /dev/null +++ b/disasterserver_c/entities/HillThunder.c @@ -0,0 +1,30 @@ +#include +#include + +bool thunder_tick(Server* server, Entity* entity) +{ + Thunder* th = (Thunder*)entity; + + if (th->timer <= 2 * TICKSPERSEC && !th->flag) + { + Packet pack; + PacketCreate(&pack, SERVER_GHZTHUNDER_STATE); + PacketWrite(&pack, packet_write8, 0); + server_broadcast(server, &pack, true); + th->flag = true; + } + else if (th->timer <= 0) + { + Packet pack; + PacketCreate(&pack, SERVER_GHZTHUNDER_STATE); + PacketWrite(&pack, packet_write8, 1); + server_broadcast(server, &pack, true); + + th->timer = (15 + (rand() % 5)) * TICKSPERSEC; + th->flag = false; + return true; + } + + th->timer -= server->delta; + return true; +} diff --git a/disasterserver_c/entities/HillThunder.h b/disasterserver_c/entities/HillThunder.h new file mode 100644 index 0000000..4dd6ebc --- /dev/null +++ b/disasterserver_c/entities/HillThunder.h @@ -0,0 +1,16 @@ +#ifndef GHZTHUNDER_H +#define GHZTHUNDER_H +#include "../States.h" + +bool thunder_tick(Server* server, Entity* entity); + +typedef struct +{ + ENTITY_BODY + + double timer; + bool flag; +} Thunder; +#define MakeThunder() ((Thunder) { MakeEntity("thunder", 0, 0) NULL, thunder_tick, NULL, (15 + (rand() % 5)) * TICKSPERSEC, 0 }) + +#endif \ No newline at end of file diff --git a/disasterserver_c/entities/KAFSpeedBox.c b/disasterserver_c/entities/KAFSpeedBox.c new file mode 100644 index 0000000..06d7275 --- /dev/null +++ b/disasterserver_c/entities/KAFSpeedBox.c @@ -0,0 +1,55 @@ +#include + +bool kafbox_init(Server* server, Entity* entity) +{ + KafBox* box = (KafBox*)entity; + + Packet pack; + PacketCreate(&pack, SERVER_KAFMONITOR_STATE); + PacketWrite(&pack, packet_write8, 0); + PacketWrite(&pack, packet_write8, box->nid); + server_broadcast(server, &pack, true); + + return true; +} + +bool kafbox_tick(Server* server, Entity* entity) +{ + KafBox* box = (KafBox*)entity; + + if (!box->activated) + return true; + + if (box->timer > 0) + { + box->timer -= server->delta; + return true; + } + + Packet pack; + PacketCreate(&pack, SERVER_KAFMONITOR_STATE); + PacketWrite(&pack, packet_write8, 1); + PacketWrite(&pack, packet_write8, box->nid); + server_broadcast(server, &pack, true); + + box->activated = false; + return true; +} + +bool kafbox_activate(Server* server, KafBox* box, uint16_t pid, uint8_t is_proj) +{ + if (box->activated) + return true; + + Packet pack; + PacketCreate(&pack, SERVER_KAFMONITOR_STATE); + PacketWrite(&pack, packet_write8, 2); + PacketWrite(&pack, packet_write8, box->nid); + PacketWrite(&pack, packet_write16, is_proj ? 0 : pid); + server_broadcast(server, &pack, true); + + box->activated = true; + box->timer = (25.0 + rand() % 5) * TICKSPERSEC; + + return true; +} diff --git a/disasterserver_c/entities/KAFSpeedBox.h b/disasterserver_c/entities/KAFSpeedBox.h new file mode 100644 index 0000000..bf45b2a --- /dev/null +++ b/disasterserver_c/entities/KAFSpeedBox.h @@ -0,0 +1,20 @@ +#ifndef KAFSPEEDBOX_H +#define KAFSPEEDBOX_H +#include "../States.h" + +bool kafbox_init(Server* server, Entity* entity); +bool kafbox_tick(Server* server, Entity* entity); + +typedef struct +{ + ENTITY_BODY + + uint8_t nid; + double timer; + bool activated; +} KafBox; +#define MakeKafBox(nid) ((KafBox) { MakeEntity("kafbox", 0, 0) kafbox_init, kafbox_tick, NULL, nid, 0, 0, }) + +bool kafbox_activate(Server* server, KafBox* box, uint16_t pid, uint8_t is_proj); + +#endif \ No newline at end of file diff --git a/disasterserver_c/entities/LCChain.c b/disasterserver_c/entities/LCChain.c new file mode 100644 index 0000000..1ee3cf3 --- /dev/null +++ b/disasterserver_c/entities/LCChain.c @@ -0,0 +1,55 @@ +#include + +bool lcchain_tick(Server* server, Entity* entity) +{ + LCChain* chain = (LCChain*)entity; + + switch (chain->state) + { + case LCC_NONE: + if (chain->timer >= 8 * TICKSPERSEC) + { + Packet pack; + PacketCreate(&pack, SERVER_LCCHAIN_STATE); + PacketWrite(&pack, packet_write8, 0); + server_broadcast(server, &pack, true); + + chain->timer = 0; + chain->state = LCC_PREPARE; + } + break; + + case LCC_PREPARE: + { + if (chain->timer >= 2 * TICKSPERSEC) + { + Packet pack; + PacketCreate(&pack, SERVER_LCCHAIN_STATE); + PacketWrite(&pack, packet_write8, 1); + server_broadcast(server, &pack, true); + + chain->timer = 0; + chain->state = LCC_ACTIVATE; + } + break; + } + + case LCC_ACTIVATE: + { + if (chain->timer >= 2 * TICKSPERSEC) + { + Packet pack; + PacketCreate(&pack, SERVER_LCCHAIN_STATE); + PacketWrite(&pack, packet_write8, 2); + server_broadcast(server, &pack, true); + + chain->timer = 0; + chain->state = LCC_NONE; + } + break; + } + } + + chain->timer += server->delta; + return true; +} diff --git a/disasterserver_c/entities/LCChain.h b/disasterserver_c/entities/LCChain.h new file mode 100644 index 0000000..94902fe --- /dev/null +++ b/disasterserver_c/entities/LCChain.h @@ -0,0 +1,22 @@ +#ifndef LCCHAIN_H +#define LCCHAIN_H +#include "../States.h" + +bool lcchain_tick(Server* server, Entity* entity); + +typedef struct +{ + ENTITY_BODY + + double timer; + enum + { + LCC_NONE, + LCC_PREPARE, + LCC_ACTIVATE + } state; +} LCChain; + +#define MakeLCChain() ((LCChain) { MakeEntity("lcchain", 0, 0) NULL, lcchain_tick, NULL, 0, LCC_NONE }) + +#endif \ No newline at end of file diff --git a/disasterserver_c/entities/LCEye.c b/disasterserver_c/entities/LCEye.c new file mode 100644 index 0000000..7859bbe --- /dev/null +++ b/disasterserver_c/entities/LCEye.c @@ -0,0 +1,51 @@ +#include + +bool lceye_tick(Server* server, Entity* entity) +{ + LCEye* eye = (LCEye*)entity; + + if (eye->cooldown > 0) + { + eye->cooldown -= server->delta; + return true; + } + + if (eye->timer >= TICKSPERSEC) + { + if (eye->used && eye->charge > 0) + { + eye->charge -= 20; + if (eye->charge < 20) + { + eye->cooldown = 2.0 * TICKSPERSEC; + eye->used = eye->timer = 0; + } + + RAssert(lceye_update(server, eye)); + } + else if (!eye->used && eye->charge < 100) + { + eye->charge += 10; + RAssert(lceye_update(server, eye)); + } + + eye->timer = 0; + } + + eye->timer += server->delta; + return true; +} + +bool lceye_update(Server* server, LCEye* eye) +{ + Packet pack; + PacketCreate(&pack, SERVER_LCEYE_STATE); + PacketWrite(&pack, packet_write8, (uint8_t)eye->eye_id); + PacketWrite(&pack, packet_write8, eye->used); + PacketWrite(&pack, packet_write16, eye->use_id); + PacketWrite(&pack, packet_write8, (uint8_t)eye->target); + PacketWrite(&pack, packet_write8, eye->charge); + server_broadcast(server, &pack, true); + + return true; +} diff --git a/disasterserver_c/entities/LCEye.h b/disasterserver_c/entities/LCEye.h new file mode 100644 index 0000000..4f533f8 --- /dev/null +++ b/disasterserver_c/entities/LCEye.h @@ -0,0 +1,25 @@ +#ifndef LCEYE_H +#define LCEYE_H +#include "../States.h" + +bool lceye_tick(Server* server, Entity* entity); + +typedef struct +{ + ENTITY_BODY + + uint8_t eye_id; + uint16_t use_id; + bool used; + uint8_t charge; + uint16_t target; + + double cooldown; + double timer; + +} LCEye; + +#define MakeLCEye(id) ((LCEye) { MakeEntity("lceye", 0, 0) NULL, lceye_tick, NULL, id, 0, 0, 100, 0, 0, 0 }) +bool lceye_update(Server* server, LCEye* eye); + +#endif \ No newline at end of file diff --git a/disasterserver_c/entities/MJAss.c b/disasterserver_c/entities/MJAss.c new file mode 100644 index 0000000..e7a0415 --- /dev/null +++ b/disasterserver_c/entities/MJAss.c @@ -0,0 +1,22 @@ +#include + +bool mass_tick(Server* server, Entity* entity) +{ + MAss* ass = (MAss*)entity; + + if (ass->timer >= ass->next_time) + { + ass->state = !ass->state; + ass->timer = 0; + + Packet pack; + PacketCreate(&pack, SERVER_MJCRYSTAL_STATE); + PacketWrite(&pack, packet_write8, ass->state); + server_broadcast(server, &pack, true); + + ass->next_time = (10 + rand() % 5) * TICKSPERSEC; + } + + ass->timer += server->delta; + return true; +} \ No newline at end of file diff --git a/disasterserver_c/entities/MJAss.h b/disasterserver_c/entities/MJAss.h new file mode 100644 index 0000000..a17c6e6 --- /dev/null +++ b/disasterserver_c/entities/MJAss.h @@ -0,0 +1,16 @@ +#ifndef MJASS_H +#define MJASS_H +#include "../States.h" + +bool mass_tick(Server* server, Entity* entity); + +typedef struct +{ + ENTITY_BODY + + double next_time; + double timer; + bool state; +} MAss; +#define MakeMAss() ((MAss) { MakeEntity("mass", 0, 0) NULL, mass_tick, NULL, 10 * TICKSPERSEC, 0.0, false }) +#endif \ No newline at end of file diff --git a/disasterserver_c/entities/MJJudger.c b/disasterserver_c/entities/MJJudger.c new file mode 100644 index 0000000..8bcf18f --- /dev/null +++ b/disasterserver_c/entities/MJJudger.c @@ -0,0 +1,42 @@ +#include + +bool mjew_tick(Server* server, Entity* entity) +{ + MJew* ass = (MJew*)entity; + if (ass->timer >= ass->next_time) + { + switch (ass->state) + { + case MJJ_WAIT: + { + ass->state = MJJ_PREPARE; + ass->next_time = 2 * TICKSPERSEC; + break; + } + + case MJJ_PREPARE: + { + ass->state = MJJ_FIRE; + ass->next_time = (7 + rand() % 2) * TICKSPERSEC; + break; + } + + case MJJ_FIRE: + { + ass->state = MJJ_WAIT; + ass->next_time = (10 + rand() % 5) * TICKSPERSEC; + break; + } + } + + Packet pack; + PacketCreate(&pack, SERVER_MJJUDGER_STATE); + PacketWrite(&pack, packet_write8, ass->state); + server_broadcast(server, &pack, true); + + ass->timer = 0; + } + + ass->timer += server->delta; + return true; +} \ No newline at end of file diff --git a/disasterserver_c/entities/MJJudger.h b/disasterserver_c/entities/MJJudger.h new file mode 100644 index 0000000..3b42382 --- /dev/null +++ b/disasterserver_c/entities/MJJudger.h @@ -0,0 +1,21 @@ +#ifndef MJJUDGER_H +#define MJJUDGER_H +#include "../States.h" + +bool mjew_tick(Server* server, Entity* entity); + +typedef struct +{ + ENTITY_BODY + + double next_time; + double timer; + enum + { + MJJ_WAIT, + MJJ_PREPARE, + MJJ_FIRE + } state; +} MJew; +#define MakeMJew() ((MJew) { MakeEntity("mjud", 0, 0) NULL, mjew_tick, NULL, (10 + rand() % 5) * TICKSPERSEC, 0.0, MJJ_WAIT }) +#endif \ No newline at end of file diff --git a/disasterserver_c/entities/MJLava.c b/disasterserver_c/entities/MJLava.c new file mode 100644 index 0000000..68e78f8 --- /dev/null +++ b/disasterserver_c/entities/MJLava.c @@ -0,0 +1,92 @@ +#include +#include + +bool mlava_tick(Server* server, Entity* entity) +{ + MLava* lv = (MLava*)entity; + switch (lv->state) + { + case MLV_IDLE: // Move using sin + { + lv->pos.y = lv->start + sinf((float)lv->timer / 25.0f) * 6; + + lv->timer -= server->delta; + if (lv->timer <= 0) + lv->state = MLV_MOVEDOWN; + + break; + } + + case MLV_MOVEDOWN: // Move down a bit + { + if (lv->pos.y < lv->start + 20) + { + lv->pos.y += 0.15f * (float)server->delta; + } + else + lv->state = MLV_RAISE; + + break; + } + + case MLV_RAISE: // accelerate + { + if (lv->pos.y > lv->start - lv->dist) + { + lv->pos.y -= lv->vel; + + if (lv->vel < 5) + lv->vel += 0.08f * (float)server->delta; + else + lv->vel = 5; + } + else + { + lv->state = MLV_MOVE; + lv->timer = (4.0 + rand() % 3) * TICKSPERSEC; + lv->vel = 0; + } + + break; + } + + case MLV_MOVE: // move on spot + { + lv->pos.y = (lv->start - lv->dist) + sinf((float)lv->timer / 25.0f) * 6; + + lv->timer -= server->delta; + if (lv->timer <= 0) + lv->state = MLV_LOWER; + break; + } + + case MLV_LOWER: // go down + { + if (lv->start > lv->pos.y) + { + lv->pos.y += lv->vel * (float)server->delta; + + if (lv->vel < 5) + lv->vel += 0.08f * (float)server->delta; + else + lv->vel = 5; + } + else + { + lv->state = MLV_IDLE; + lv->timer = (5.0 + rand() % 4) * TICKSPERSEC; + lv->vel = 0; + } + + break; + } + } + + Packet pack; + PacketCreate(&pack, SERVER_MJLAVA_STATE); + PacketWrite(&pack, packet_write8, lv->state); + PacketWrite(&pack, packet_writefloat, lv->pos.y); + server_broadcast(server, &pack, false); + + return true; +} diff --git a/disasterserver_c/entities/MJLava.h b/disasterserver_c/entities/MJLava.h new file mode 100644 index 0000000..438c2e4 --- /dev/null +++ b/disasterserver_c/entities/MJLava.h @@ -0,0 +1,27 @@ +#ifndef MJLAVA_H +#define MJLAVA_H +#include "../States.h" + +bool mlava_tick(Server* server, Entity* entity); + +typedef struct +{ + ENTITY_BODY + + enum + { + MLV_IDLE, + MLV_MOVEDOWN, + MLV_RAISE, + MLV_MOVE, + MLV_LOWER + } state; + double timer; + float start; + float dist; + float vel; + +} MLava; +#define MakeMLava(start, dist) ((MLava) { MakeEntity("mlava", 0, start) NULL, mlava_tick, NULL, MLV_IDLE, 5 * TICKSPERSEC, start, dist, 0 }) + +#endif \ No newline at end of file diff --git a/disasterserver_c/entities/NAPIce.c b/disasterserver_c/entities/NAPIce.c new file mode 100644 index 0000000..3099d92 --- /dev/null +++ b/disasterserver_c/entities/NAPIce.c @@ -0,0 +1,40 @@ +#include + +bool ice_tick(Server* server, Entity* entity) +{ + Ice* ice = (Ice*)entity; + if (!ice->activated) + return true; + + ice->timer -= server->delta; + if (ice->timer <= 0) + { + ice->timer = 15.0 * TICKSPERSEC; + ice->activated = false; + + Packet pack; + PacketCreate(&pack, SERVER_NAPICE_STATE); + PacketWrite(&pack, packet_write8, 1); + PacketWrite(&pack, packet_write8, ice->iid); + server_broadcast(server, &pack, true); + } + + return true; +} + +bool ice_activate(Server* server, Ice* ice) +{ + if (ice->activated) + return true; + + ice->timer = 15.0 * TICKSPERSEC; + ice->activated = true; + + Packet pack; + PacketCreate(&pack, SERVER_NAPICE_STATE); + PacketWrite(&pack, packet_write8, 0); + PacketWrite(&pack, packet_write8, ice->iid); + server_broadcast(server, &pack, true); + + return true; +} diff --git a/disasterserver_c/entities/NAPIce.h b/disasterserver_c/entities/NAPIce.h new file mode 100644 index 0000000..dba2f8f --- /dev/null +++ b/disasterserver_c/entities/NAPIce.h @@ -0,0 +1,20 @@ +#ifndef NAPICE_H +#define NAPICE_H +#include "../States.h" + +bool ice_tick(Server* server, Entity* entity); + +typedef struct +{ + ENTITY_BODY + + uint8_t iid; + bool activated; + double timer; + +} Ice; +#define MakeIce(id) ((Ice) { MakeEntity("ice", 0, 0) NULL, ice_tick, NULL, id, 0, 0 }) + +bool ice_activate(Server* server, Ice* ice); + +#endif \ No newline at end of file diff --git a/disasterserver_c/entities/NAPSnowball.c b/disasterserver_c/entities/NAPSnowball.c new file mode 100644 index 0000000..9a247ae --- /dev/null +++ b/disasterserver_c/entities/NAPSnowball.c @@ -0,0 +1,104 @@ +#include + +#define NUM_FRAMES 32 +#define ROLL_START 16 + +bool snowball_init(Server* server, Entity* entity) +{ + (void)server; + + Snowball* sb = (Snowball*)entity; + + for (int i = 0; i < 20; i++) + { + sb->p_move[i] = 0.05f; + sb->p_anim[i] = 0.35f; + } + + return true; +} + +bool snowball_tick(Server* server, Entity* entity) +{ + Snowball* sb = (Snowball*)entity; + + if (sb->timer < 20 * TICKSPERSEC) + sb->timer += server->delta; + else + { + RAssert(snowball_activate(server, sb)); + sb->timer = 0; + } + + if (sb->active) + { + if (sb->vel > 1) + { + sb->frame += sb->p_anim[sb->state] * server->delta; + sb->stage_prog += sb->p_move[sb->state] * server->delta; + + if (sb->frame >= NUM_FRAMES) + sb->frame = ROLL_START; + } + else + { + sb->vel += 0.016 * server->delta; + sb->frame += sb->vel * 0.45 * server->delta; + sb->stage_prog += sb->vel * 0.05 * server->delta; + } + + if (sb->stage_prog > 1) + { + sb->stage_prog = 0; + sb->state++; + + if (sb->state >= sb->p_count - 1) + { + sb->state = 0; + sb->stage_prog = 0; + sb->active = false; + sb->frame = 0; + + Packet pack; + PacketCreate(&pack, SERVER_NAPBALL_STATE); + PacketWrite(&pack, packet_write8, 2); + PacketWrite(&pack, packet_write8, sb->sid); + server_broadcast(server, &pack, true); + + return true; + } + } + + Packet pack; + PacketCreate(&pack, SERVER_NAPBALL_STATE); + PacketWrite(&pack, packet_write8, 1); + PacketWrite(&pack, packet_write8, sb->sid); + PacketWrite(&pack, packet_write8, sb->state); + PacketWrite(&pack, packet_write8, (uint8_t)sb->frame); + PacketWrite(&pack, packet_writedouble, sb->stage_prog); + server_broadcast(server, &pack, false); + } + + return true; +} + +bool snowball_activate(Server* server, Snowball* sb) +{ + if (sb->active) + return true; + + sb->vel = 0; + sb->state = 0; + sb->stage_prog = 0; + sb->frame = 0; + sb->active = true; + + Packet pack; + PacketCreate(&pack, SERVER_NAPBALL_STATE); + PacketWrite(&pack, packet_write8, 0); + PacketWrite(&pack, packet_write8, sb->sid); + PacketWrite(&pack, packet_write8, sb->dir); + server_broadcast(server, &pack, true); + + return true; +} diff --git a/disasterserver_c/entities/NAPSnowball.h b/disasterserver_c/entities/NAPSnowball.h new file mode 100644 index 0000000..77d181e --- /dev/null +++ b/disasterserver_c/entities/NAPSnowball.h @@ -0,0 +1,31 @@ +#ifndef NAPSNOWBALL_H +#define NAPSNOWBALL_H +#include "../States.h" + +bool snowball_init(Server* server, Entity* entity); +bool snowball_tick(Server* server, Entity* entity); + +typedef struct +{ + ENTITY_BODY + + uint8_t sid; + bool active; + uint8_t state; + double stage_prog; + int8_t dir; + double frame; + double start; + double vel; + uint8_t p_count; + double timer; + + float p_move[20]; + float p_anim[20]; + +} Snowball; +#define MakeSnowball(id, p_count, dir) ((Snowball) { MakeEntity("snowball", 0, 0) snowball_init, snowball_tick, NULL, id, 0, 0, 0, dir, 0, 0, 0, p_count, 0 }) + +bool snowball_activate(Server* server, Snowball* sb); + +#endif \ No newline at end of file diff --git a/disasterserver_c/entities/NotPerfect.c b/disasterserver_c/entities/NotPerfect.c new file mode 100644 index 0000000..d69a1c1 --- /dev/null +++ b/disasterserver_c/entities/NotPerfect.c @@ -0,0 +1,58 @@ +#include +#include + +bool npctrl_tick(Server* server, Entity* entity) +{ + NPController* ctrl = (NPController*)entity; + if (server->game.time_sec <= TICKSPERSEC && !ctrl->balls) + { + ctrl->timer = 5 * TICKSPERSEC; + ctrl->state = NPC_PREPARE; + ctrl->balls = true; + } + + switch (ctrl->state) + { + case NPC_NONE: + { + const int intr1 = server->game.time_sec < TICKSPERSEC ? 2 : 15; + if (ctrl->timer >= intr1 * TICKSPERSEC) + { + Packet pack; + + PacketCreate(&pack, SERVER_NPCONTROLLER_STATE); + PacketWrite(&pack, packet_write8, 0); + PacketWrite(&pack, packet_write8, 0); + PacketWrite(&pack, packet_write8, 0); + server_broadcast(server, &pack, true); + + ctrl->state = NPC_PREPARE; + ctrl->timer = 0; + } + break; + } + + case NPC_PREPARE: + { + const int intr2 = server->game.time_sec < TICKSPERSEC ? 3 : 5; + if (ctrl->timer >= intr2 * TICKSPERSEC) + { + ctrl->stage++; + + Packet pack; + PacketCreate(&pack, SERVER_NPCONTROLLER_STATE); + PacketWrite(&pack, packet_write8, 1); + PacketWrite(&pack, packet_write8, ctrl->stage % 4); + PacketWrite(&pack, packet_write8, (uint8_t)fmax(ctrl->stage - 1, 0) % 4); + server_broadcast(server, &pack, true); + + ctrl->state = NPC_NONE; + ctrl->timer = 0; + } + break; + } + } + + ctrl->timer += server->delta; + return true; +} \ No newline at end of file diff --git a/disasterserver_c/entities/NotPerfect.h b/disasterserver_c/entities/NotPerfect.h new file mode 100644 index 0000000..4107e04 --- /dev/null +++ b/disasterserver_c/entities/NotPerfect.h @@ -0,0 +1,22 @@ +#ifndef NPCONTROLLER_H +#define NPCONTROLLER_H +#include "../States.h" + +bool npctrl_tick(Server* server, Entity* entity); + +typedef struct +{ + ENTITY_BODY + + enum + { + NPC_NONE, + NPC_PREPARE + } state; + uint8_t stage; + double timer; + bool balls; +} NPController; +#define MakeNPCtrl() ((NPController) { MakeEntity("npctrl", 0, 0) NULL, npctrl_tick, NULL, NPC_NONE, 0, 0, 0 }) + +#endif \ No newline at end of file diff --git a/disasterserver_c/entities/PFLift.c b/disasterserver_c/entities/PFLift.c new file mode 100644 index 0000000..be76c26 --- /dev/null +++ b/disasterserver_c/entities/PFLift.c @@ -0,0 +1,89 @@ +#include + +bool pflift_init(Server* server, Entity* entity) +{ + (void)server; + + PFLift* lift = (PFLift*)entity; + lift->pos.y = lift->start; + + return true; +} + +bool pflift_tick(Server* server, Entity* entity) +{ + Packet pack; + PFLift* lift = (PFLift*)entity; + + if (!lift->activated) + { + if (lift->timer > 0) + { + lift->timer -= server->delta; + if (lift->timer <= 0) + { + // teleport back + PacketCreate(&pack, SERVER_PFLIFT_STATE); + PacketWrite(&pack, packet_write8, 3); + PacketWrite(&pack, packet_write8, lift->lid); + PacketWrite(&pack, packet_write16, (uint16_t)lift->start); + server_broadcast(server, &pack, true); + } + } + return true; + } + + if (lift->pos.y > lift->end) + { + if (lift->speed < 7.f) + lift->speed += 0.052f * (float)server->delta; + + lift->pos.y -= lift->speed * (float)server->delta; + } + else + { + PacketCreate(&pack, SERVER_PFLIFT_STATE); + PacketWrite(&pack, packet_write8, 2); + PacketWrite(&pack, packet_write8, lift->lid); + PacketWrite(&pack, packet_write16, lift->activator); + PacketWrite(&pack, packet_write16, (uint16_t)lift->pos.y); + server_broadcast(server, &pack, true); + + lift->timer = (uint16_t)(1.5f * TICKSPERSEC); + lift->activated = false; + lift->activator = 0; + } + + PacketCreate(&pack, SERVER_PFLIFT_STATE); + PacketWrite(&pack, packet_write8, 1); + PacketWrite(&pack, packet_write8, lift->lid); + PacketWrite(&pack, packet_write16, lift->activator); + PacketWrite(&pack, packet_write16, (uint16_t)lift->pos.y); + server_broadcast(server, &pack, false); + + return true; +} + +bool pflift_activate(Server* server, PFLift* lift, uint16_t id) +{ + if (lift->activated) + return true; + + if (lift->timer > 0) + return true; + + lift->activator = id; + lift->timer = 0; + lift->speed = 0; + lift->pos.y = lift->start; + lift->activated = true; + + Packet pack; + PacketCreate(&pack, SERVER_PFLIFT_STATE); + PacketWrite(&pack, packet_write8, 0); + PacketWrite(&pack, packet_write8, lift->lid); + PacketWrite(&pack, packet_write16, lift->activator); + server_broadcast(server, &pack, true); + + return true; +} diff --git a/disasterserver_c/entities/PFLift.h b/disasterserver_c/entities/PFLift.h new file mode 100644 index 0000000..fd409b2 --- /dev/null +++ b/disasterserver_c/entities/PFLift.h @@ -0,0 +1,24 @@ +#ifndef PFLIFT_H +#define PFLIFT_H +#include "../States.h" + +typedef struct +{ + ENTITY_BODY + + uint8_t lid; + double timer; + float start; + float end; + float speed; + uint16_t activator; + bool activated; + +} PFLift; +#define MakePFLift(id, start, end) ((PFLift) { MakeEntity("pflift", 0, 0) pflift_init, pflift_tick, NULL, id, 0, start, end, 0, 0, 0 }) + +bool pflift_init(Server* server, Entity* entity); +bool pflift_tick(Server* server, Entity* entity); +bool pflift_activate(Server* server, PFLift* lift, uint16_t id); + +#endif \ No newline at end of file diff --git a/disasterserver_c/entities/RMZShard.c b/disasterserver_c/entities/RMZShard.c new file mode 100644 index 0000000..a6b87d5 --- /dev/null +++ b/disasterserver_c/entities/RMZShard.c @@ -0,0 +1,16 @@ +#include + +bool shard_init(Server* server, Entity* entity) +{ + Shard* shard = (Shard*)entity; + + Packet pack; + PacketCreate(&pack, SERVER_RMZSHARD_STATE); + PacketWrite(&pack, packet_write8, shard->spawned); + PacketWrite(&pack, packet_write16, shard->id); + PacketWrite(&pack, packet_write16, (uint16_t)shard->pos.x); + PacketWrite(&pack, packet_write16, (uint16_t)shard->pos.y); + server_broadcast(server, &pack, true); + + return true; +} \ No newline at end of file diff --git a/disasterserver_c/entities/RMZShard.h b/disasterserver_c/entities/RMZShard.h new file mode 100644 index 0000000..c786c59 --- /dev/null +++ b/disasterserver_c/entities/RMZShard.h @@ -0,0 +1,15 @@ +#ifndef RMZSHARD_H +#define RMZSHARD_H +#include "../States.h" + +bool shard_init(Server* server, Entity* entity); + +typedef struct +{ + ENTITY_BODY + + uint8_t spawned; +} Shard; +#define MakeShard(x, y, spawned) ((Shard) { MakeEntity("shard", x, y) shard_init, NULL, NULL, spawned }) + +#endif \ No newline at end of file diff --git a/disasterserver_c/entities/RMZSlug.c b/disasterserver_c/entities/RMZSlug.c new file mode 100644 index 0000000..aa422b1 --- /dev/null +++ b/disasterserver_c/entities/RMZSlug.c @@ -0,0 +1,156 @@ +#include +#include + +void slug_face(Slug* slug, uint8_t side) +{ + if (side) + { + switch (slug->ring) + { + case SLUG_NORING: + slug->state = SLUG_NONERIGHT; + break; + + case SLUG_RING: + slug->state = SLUG_RINGRIGHT; + break; + + case SLUG_REDRING: + slug->state = SLUG_REDRINGRIGHT; + break; + } + } + else + { + switch (slug->ring) + { + case SLUG_NORING: + slug->state = SLUG_NONELEFT; + break; + + case SLUG_RING: + slug->state = SLUG_RINGLEFT; + break; + + case SLUG_REDRING: + slug->state = SLUG_REDRINGLEFT; + break; + } + } +} + +bool slug_init(Server* server, Entity* entity) +{ + Slug* slug = (Slug*)entity; + + int num = rand() % 100; + if (num < 50) + slug->ring = SLUG_NORING; + else if (num >= 40 && num < 90) + slug->ring = SLUG_RING; + else + slug->ring = SLUG_REDRING; + + slug->sX = slug->pos.x; + slug->sY = slug->pos.y; + + // make it face random dir + slug_face(slug, rand() % 2); + + Packet pack; + PacketCreate(&pack, SERVER_RMZSLIME_STATE); + PacketWrite(&pack, packet_write8, 0); + PacketWrite(&pack, packet_write16, slug->id); + PacketWrite(&pack, packet_write16, (uint16_t)slug->pos.x); + PacketWrite(&pack, packet_write16, (uint16_t)slug->pos.y); + PacketWrite(&pack, packet_write8, (uint8_t)slug->state); + server_broadcast(server, &pack, true); + + return true; +} + +bool slug_tick(Server* server, Entity* entity) +{ + Slug* slug = (Slug*)entity; + + switch (slug->state) + { + case SLUG_NONELEFT: + case SLUG_RINGLEFT: + case SLUG_REDRINGLEFT: + slug->pos.x -= (float)server->delta; + if (slug->pos.x <= slug->sX - 100) + slug_face(slug, 1); + break; + + case SLUG_NONERIGHT: + case SLUG_RINGRIGHT: + case SLUG_REDRINGRIGHT: + slug->pos.x += (float)server->delta; + if (slug->pos.x >= slug->sX + 100) + slug_face(slug, 0); + break; + } + + Packet pack; + PacketCreate(&pack, SERVER_RMZSLIME_STATE); + PacketWrite(&pack, packet_write8, 1); + PacketWrite(&pack, packet_write16, slug->id); + PacketWrite(&pack, packet_write16, (uint16_t)slug->pos.x); + PacketWrite(&pack, packet_write16, (uint16_t)slug->pos.y); + PacketWrite(&pack, packet_write8, (uint8_t)slug->state); + server_broadcast(server, &pack, false); + + return true; +} + +bool slug_uninit(Server* server, Entity* entity) +{ + Packet pack; + PacketCreate(&pack, SERVER_RMZSLIME_STATE); + PacketWrite(&pack, packet_write8, 2); + PacketWrite(&pack, packet_write16, entity->id); + server_broadcast(server, &pack, true); + + // find slug spawner and free it + SlugSpawner* spawners[11]; + + int found = game_find(server, (Entity**)spawners, "slugspawn", 11); + for (int i = 0; i < found; i++) + { + if (spawners[i]->slug == entity->id) + { + Debug("removed slug from %d", spawners[i]->id); + spawners[i]->slug = 0; + break; + } + } + + return true; +} + +bool slugspawn_tick(Server* server, Entity* entity) +{ + SlugSpawner* spawn = (SlugSpawner*)entity; + if (spawn->slug > 0) + return true; + + if (spawn->offset > 0) + { + spawn->offset -= server->delta; + return true; + } + + spawn->timer += server->delta; + if (spawn->timer >= 15 * TICKSPERSEC) + { + Slug* slug; + RAssert(game_spawn(server, (Entity*)&(MakeSlug(spawn->pos.x, spawn->pos.y)), sizeof(Slug), (Entity**)&slug)); + + spawn->timer = 0; + spawn->slug = slug->id; + spawn->offset = (double)((rand() % 2) * TICKSPERSEC); + } + + return true; +} diff --git a/disasterserver_c/entities/RMZSlug.h b/disasterserver_c/entities/RMZSlug.h new file mode 100644 index 0000000..b970a72 --- /dev/null +++ b/disasterserver_c/entities/RMZSlug.h @@ -0,0 +1,45 @@ +#ifndef RMZSLIME_H +#define RMZSLIME_H +#include "../States.h" + +bool slug_init(Server* server, Entity* entity); +bool slug_tick(Server* server, Entity* entity); +bool slug_uninit(Server* server, Entity* entity); + +typedef struct +{ + ENTITY_BODY + + float sX, sY; + enum + { + SLUG_NONERIGHT, + SLUG_NONELEFT, + SLUG_RINGRIGHT, + SLUG_RINGLEFT, + SLUG_REDRINGRIGHT, + SLUG_REDRINGLEFT + } state; + + enum + { + SLUG_NORING, + SLUG_RING, + SLUG_REDRING + } ring; +} Slug; +#define MakeSlug(x, y) ((Slug) { MakeEntity("slug", x, y) slug_init, slug_tick, slug_uninit, 0.f, 0.f, 0, 0 }) + +bool slugspawn_tick(Server* server, Entity* entity); + +typedef struct +{ + ENTITY_BODY + + double offset; + double timer; + uint16_t slug; +} SlugSpawner; +#define MakeSlugSpawn(x, y) ((SlugSpawner) { MakeEntity("slugspawn", x, y) NULL, slugspawn_tick, NULL, (rand() % 10) * TICKSPERSEC, 0, 0 }) + +#endif \ No newline at end of file diff --git a/disasterserver_c/entities/Ring.c b/disasterserver_c/entities/Ring.c new file mode 100644 index 0000000..aeae352 --- /dev/null +++ b/disasterserver_c/entities/Ring.c @@ -0,0 +1,54 @@ +#include +#include +#include + +bool ring_init(Server* server, Entity* entity) +{ + Ring* ring = (Ring*)entity; + + int cnt = 0; + for (int i = 0; i < g_mapList[server->game.map].ring_count; i++) + { + if (server->game.rings[i]) + cnt++; + } + + if (cnt >= g_mapList[server->game.map].ring_count) + return false; + + int rnd; +gen: + rnd = rand() % g_mapList[server->game.map].ring_count; + + if (server->game.rings[rnd]) + goto gen; + + server->game.rings[rnd] = true; + ring->rid = (uint8_t)rnd; + ring->red = g_mapList[server->game.map].spawn_red_rings && (rand() % 100 <= 10); + + Packet pack; + PacketCreate(&pack, SERVER_RING_STATE); + PacketWrite(&pack, packet_write8, 0); + PacketWrite(&pack, packet_write8, ring->rid); + PacketWrite(&pack, packet_write16, ring->id); + PacketWrite(&pack, packet_write8, ring->red); + server_broadcast(server, &pack, true); + + return true; +} + +bool ring_uninit(Server* server, Entity* entity) +{ + Ring* ring = (Ring*)entity; + server->game.rings[ring->rid] = 0; + + Packet pack; + PacketCreate(&pack, SERVER_RING_STATE); + PacketWrite(&pack, packet_write8, 1); + PacketWrite(&pack, packet_write8, ring->rid); + PacketWrite(&pack, packet_write16, ring->id); + server_broadcast(server, &pack, true); + + return true; +} \ No newline at end of file diff --git a/disasterserver_c/entities/Ring.h b/disasterserver_c/entities/Ring.h new file mode 100644 index 0000000..65c107b --- /dev/null +++ b/disasterserver_c/entities/Ring.h @@ -0,0 +1,17 @@ +#ifndef RING_H +#define RING_H +#include "../States.h" + +bool ring_init(Server* server, Entity* entity); +bool ring_uninit(Server* server, Entity* entity); + +typedef struct +{ + ENTITY_BODY + + uint8_t rid; + uint8_t red; +} Ring; +#define MakeRing() ((Ring) { MakeEntity("ring", 0, 0) ring_init, NULL, ring_uninit, 0, 0 }) + +#endif \ No newline at end of file diff --git a/disasterserver_c/entities/SpkieController.c b/disasterserver_c/entities/SpkieController.c new file mode 100644 index 0000000..7d59b50 --- /dev/null +++ b/disasterserver_c/entities/SpkieController.c @@ -0,0 +1,24 @@ +#include + +bool spike_tick(Server* server, Entity* entity) +{ + SpikeController* ctrl = (SpikeController*)entity; + ctrl->timer -= server->delta; + if (ctrl->timer > 0) + return true; + + if (++ctrl->frame > 5) + ctrl->frame = 0; + + if (ctrl->frame == 0 || ctrl->frame == 2) + ctrl->timer = 2 * TICKSPERSEC; + else + ctrl->timer = 0.25; + + Packet pack; + PacketCreate(&pack, SERVER_MOVINGSPIKE_STATE); + PacketWrite(&pack, packet_write8, ctrl->frame); + server_broadcast(server, &pack, true); + + return true; +} diff --git a/disasterserver_c/entities/SpkieController.h b/disasterserver_c/entities/SpkieController.h new file mode 100644 index 0000000..5a96726 --- /dev/null +++ b/disasterserver_c/entities/SpkieController.h @@ -0,0 +1,16 @@ +#ifndef SPIKES_H +#define SPIKES_H +#include "../States.h" + +bool spike_tick(Server* server, Entity* entity); + +typedef struct +{ + ENTITY_BODY + + uint8_t frame; + double timer; +} SpikeController; +#define MakeSpike() ((SpikeController) { MakeEntity("spikectrl", 0, 0) NULL, spike_tick, NULL, 0, 2 * TICKSPERSEC }) + +#endif \ No newline at end of file diff --git a/disasterserver_c/entities/TCAcid.c b/disasterserver_c/entities/TCAcid.c new file mode 100644 index 0000000..6bc46bd --- /dev/null +++ b/disasterserver_c/entities/TCAcid.c @@ -0,0 +1,25 @@ +#include +#include + +bool acid_tick(Server* server, Entity* entity) +{ + Acid* ac = (Acid*)entity; + + if (ac->timer >= (4 * TICKSPERSEC)) + { + ac->timer = 0; + ac->activated = !ac->activated; + + if (ac->activated) + ac->acid_id = rand() % 7; + + Packet pack; + PacketCreate(&pack, SERVER_TCGOM_STATE); + PacketWrite(&pack, packet_write8, ac->acid_id); + PacketWrite(&pack, packet_write8, ac->activated); + server_broadcast(server, &pack, true); + } + + ac->timer += server->delta; + return true; +} diff --git a/disasterserver_c/entities/TCAcid.h b/disasterserver_c/entities/TCAcid.h new file mode 100644 index 0000000..5cf2dd7 --- /dev/null +++ b/disasterserver_c/entities/TCAcid.h @@ -0,0 +1,17 @@ +#ifndef TCACID_H +#define TCACID_H +#include "../States.h" + +bool acid_tick(Server* server, Entity* entity); + +typedef struct +{ + ENTITY_BODY + + uint8_t acid_id; + uint8_t activated; + double timer; +} Acid; +#define MakeAcid() ((Acid) { MakeEntity("acid", 0, 0) NULL, acid_tick, NULL, 0, 0, 0.0 }) + +#endif \ No newline at end of file diff --git a/disasterserver_c/entities/TailsDoll.c b/disasterserver_c/entities/TailsDoll.c new file mode 100644 index 0000000..24b390f --- /dev/null +++ b/disasterserver_c/entities/TailsDoll.c @@ -0,0 +1,251 @@ +#include "Server.h" +#include +#include + +Vector2 spots[11] = +{ + { 177, 944 }, + { 1953, 544 }, + { 3279, 224 }, + { 4101, 544 }, + { 4060, 1264 }, + { 3805, 1824 }, + { 2562, 1584 }, + { 515, 1824 }, + { 2115, 1056 }, + { 984, 1184 }, + { 1498, 1504 } +}; + +void tdoll_find_spot(Server* server, TailsDoll* doll) +{ + Vector2 new_spots[11]; + int new_count = 0; + + for (int i = 0; i < 11; i++) + { + bool can_use = true; + for (size_t j = 0; j < server->peers.capacity; j++) + { + PeerData* data = (PeerData*)server->peers.ptr[j]; + if (!data) + continue; + + if(!data->in_game) + continue; + + if (vector2_dist(&spots[i], &data->plr.pos) < 480.f) + { + can_use = false; + break; + } + } + + if(can_use) + new_spots[new_count++] = spots[i]; + } + + if (new_count > 0) + { + int ball = rand() % new_count; + Vector2 spot = new_spots[ball]; + doll->pos.x = spot.x; + doll->pos.y = spot.y; + + Debug("Tails doll found spot %d at %f %f", ball, doll->pos.x, doll->pos.y); + } + else + { + Vector2 spot = spots[rand() % 11]; + doll->pos.x = spot.x; + doll->pos.y = spot.y; + + Debug("Tails doll didn't find a spot, using %f %f", doll->pos.x, doll->pos.y); + } +} + +bool tdoll_is_vaild_target(Server* server, TailsDoll* doll) +{ + if (doll->target == -1) + return false; + + for (size_t i = 0; i < server->peers.capacity; i++) + { + PeerData* data = (PeerData*)server->peers.ptr[i]; + if (!data) + continue; + + if(!data->in_game) + continue; + + if (data->id == server->game.exe) + continue; + + if (data->plr.flags & PLAYER_DEAD) + continue; + + if (data->plr.flags & PLAYER_DEMONIZED) + continue; + + if (data->plr.flags & PLAYER_ESCAPED) + continue; + + if (data->id == doll->target) + return true; + } + + return false; +} + +bool tdoll_find_target(Server* server, TailsDoll* doll) +{ + Vector2 pos = { doll->pos.x, doll->pos.y }; + + // scan for people + for (size_t i = 0; i < server->peers.capacity; i++) + { + PeerData* data = (PeerData*)server->peers.ptr[i]; + if (!data) + continue; + + if(!data->in_game) + continue; + + if (data->id == server->game.exe) + continue; + + if (data->plr.flags & PLAYER_DEAD) + continue; + + if (data->plr.flags & PLAYER_DEMONIZED) + continue; + + if (data->plr.flags & PLAYER_ESCAPED) + continue; + + if (vector2_dist(&data->plr.pos, &pos) < 130) + { + doll->target = data->id; + return true; + } + } + + return false; +} + +bool tdoll_init(Server* server, Entity* entity) +{ + TailsDoll* doll = (TailsDoll*)entity; + tdoll_find_spot(server, doll); + + Packet pack; + PacketCreate(&pack, SERVER_DTTAILSDOLL_STATE); + PacketWrite(&pack, packet_write8, 0); + PacketWrite(&pack, packet_write16, (uint16_t)doll->pos.x); + PacketWrite(&pack, packet_write16, (uint16_t)doll->pos.y); + PacketWrite(&pack, packet_write8, (uint8_t)doll->state); + server_broadcast(server, &pack, true); + + return true; +} + +bool tdoll_tick(Server* server, Entity* entity) +{ + TailsDoll* doll = (TailsDoll*)entity; + switch (doll->state) + { + case TDST_NONE: + { + if (tdoll_find_target(server, doll)) + { + doll->timer = (1 + (rand() % 2) * 0.5) * TICKSPERSEC; + doll->state = TDST_READY; + + Packet pack; + PacketCreate(&pack, SERVER_DTTAILSDOLL_STATE); + PacketWrite(&pack, packet_write8, 2); + packet_send_id(server, doll->target, &pack, true); + } + break; + } + + case TDST_READY: + { + doll->timer -= server->delta; + if (doll->timer <= 0) + { + // Send that we are following now + Packet pack; + PacketCreate(&pack, SERVER_DTTAILSDOLL_STATE); + PacketWrite(&pack, packet_write8, 3); + packet_send_id(server, doll->target, &pack, true); + + doll->state = TDST_FOLLOW; + } + break; + } + + case TDST_FOLLOW: + { + // keep searching + tdoll_find_target(server, doll); + + if (!tdoll_is_vaild_target(server, doll)) + { + doll->state = TDST_RELOC; + break; + } + + PeerData* data = server_find_peer(server, doll->target); + if (!data || !data->in_game) + { + doll->state = TDST_RELOC; + break; + } + + if (abs((int)(data->plr.pos.x - doll->pos.x)) >= 4) + { + doll->velx += sign((int)data->plr.pos.x - doll->pos.x) * 0.512 * server->delta; + doll->velx = fmin(fmax(doll->velx, -5), 5); + } + + if (abs((int)(data->plr.pos.y - doll->pos.y)) >= 5) + { + doll->vely += sign((int)data->plr.pos.y - doll->pos.y) * 0.480 * server->delta; + doll->vely = fmin(fmax(doll->vely, -5), 5); + } + + doll->pos.x += doll->velx * (float)server->delta; + doll->pos.y += doll->vely * (float)server->delta; + + if (vector2_dist(&doll->pos, &data->plr.pos) < 12) + { + Packet pack; + PacketCreate(&pack, SERVER_DTTAILSDOLL_STATE); + PacketWrite(&pack, packet_write8, 1); + packet_send_id(server, doll->target, &pack, true); + + doll->state = TDST_RELOC; + break; + } + + break; + } + + case TDST_RELOC: + { + tdoll_find_spot(server, doll); + doll->state = TDST_NONE; + break; + } + } + + Packet pack; + PacketCreate(&pack, SERVER_DTTAILSDOLL_STATE); + PacketWrite(&pack, packet_write16, (uint16_t)doll->pos.x); + PacketWrite(&pack, packet_write16, (uint16_t)doll->pos.y); + PacketWrite(&pack, packet_write8, doll->state); + server_broadcast(server, &pack, false); + + return true; +} diff --git a/disasterserver_c/entities/TailsDoll.h b/disasterserver_c/entities/TailsDoll.h new file mode 100644 index 0000000..3af25ce --- /dev/null +++ b/disasterserver_c/entities/TailsDoll.h @@ -0,0 +1,25 @@ +#ifndef TPROJECTILE_H +#define TPROJECTILE_H +#include "../States.h" + +bool tdoll_init(Server* server, Entity* entity); +bool tdoll_tick(Server* server, Entity* entity); + +typedef struct +{ + ENTITY_BODY + + enum + { + TDST_NONE, + TDST_READY, + TDST_FOLLOW, + TDST_RELOC + } state; + uint32_t target; + double timer; + double velx, vely; +} TailsDoll; +#define MakeTailsDoll() ((TailsDoll) { MakeEntity("tdoll", 0, 0) tdoll_init, tdoll_tick, NULL, TDST_NONE, -1, 0, 0.0, 0.0 }) + +#endif \ No newline at end of file diff --git a/disasterserver_c/entities/TailsProjectile.c b/disasterserver_c/entities/TailsProjectile.c new file mode 100644 index 0000000..424e9c8 --- /dev/null +++ b/disasterserver_c/entities/TailsProjectile.c @@ -0,0 +1,65 @@ +#include + +bool tproj_init(Server* server, Entity* entity) +{ + TProjectile* tproj = (TProjectile*)entity; + + Packet pack; + PacketCreate(&pack, SERVER_TPROJECTILE_STATE); + PacketWrite(&pack, packet_write8, 0); + PacketWrite(&pack, packet_write16, (uint16_t)tproj->pos.x); + PacketWrite(&pack, packet_write16, (uint16_t)tproj->pos.y); + PacketWrite(&pack, packet_write16, tproj->owner); + PacketWrite(&pack, packet_write8, tproj->dir); + PacketWrite(&pack, packet_write8, tproj->damage); + PacketWrite(&pack, packet_write8, tproj->exe); + PacketWrite(&pack, packet_write8, tproj->charge); + server_broadcast(server, &pack, true); + + return true; +} + +bool tproj_tick(Server* server, Entity* entity) +{ + TProjectile* tproj = (TProjectile*)entity; + + if (tproj->timer <= 0) + return false; + + if (server->game.map != 13) + { + if (tproj->pos.x <= 0) + return false; + } + else + { + if (tproj->pos.x < 0) + tproj->pos.x = 3648; + else if (tproj->pos.x > 3648) + tproj->pos.x = 0; + } + + Packet pack; + PacketCreate(&pack, SERVER_TPROJECTILE_STATE); + PacketWrite(&pack, packet_write8, 1); + PacketWrite(&pack, packet_write16, (uint16_t)tproj->pos.x); + PacketWrite(&pack, packet_write16, (uint16_t)tproj->pos.y); + server_broadcast(server, &pack, false); + + tproj->pos.x += (float)(tproj->dir * 14 * server->delta); + tproj->timer -= server->delta; + + return true; +} + +bool tproj_uninit(Server* server, Entity* entity) +{ + (void)entity; + + Packet pack; + PacketCreate(&pack, SERVER_TPROJECTILE_STATE); + PacketWrite(&pack, packet_write8, 2); + server_broadcast(server, &pack, true); + + return true; +} \ No newline at end of file diff --git a/disasterserver_c/entities/TailsProjectile.h b/disasterserver_c/entities/TailsProjectile.h new file mode 100644 index 0000000..8cdefd0 --- /dev/null +++ b/disasterserver_c/entities/TailsProjectile.h @@ -0,0 +1,23 @@ +#ifndef TPROJECTILE_H +#define TPROJECTILE_H +#include "../States.h" + +bool tproj_init(Server* server, Entity* entity); +bool tproj_tick(Server* server, Entity* entity); +bool tproj_uninit(Server* server, Entity* entity); + +typedef struct +{ + ENTITY_BODY + + uint16_t owner; + int8_t dir; + uint8_t exe; + uint8_t charge; + uint8_t damage; + + double timer; +} TProjectile; +#define MakeTailsProj(x, y, owner, dir, exe, charge, damage) ((TProjectile) { MakeEntity("tproj", x, y) tproj_init, tproj_tick, tproj_uninit, owner, dir, exe, charge, damage, 5 * TICKSPERSEC }) + +#endif \ No newline at end of file diff --git a/disasterserver_c/entities/VVLava.c b/disasterserver_c/entities/VVLava.c new file mode 100644 index 0000000..1e97d56 --- /dev/null +++ b/disasterserver_c/entities/VVLava.c @@ -0,0 +1,93 @@ +#include +#include + +bool lava_tick(Server* server, Entity* entity) +{ + Lava* lv = (Lava*)entity; + switch (lv->state) + { + case LV_IDLE: // Move using sin + { + lv->pos.y = lv->start + sinf((float)lv->timer / 25.0f) * 6; + + lv->timer -= server->delta; + if (lv->timer <= 0) + lv->state = LV_MOVEDOWN; + + break; + } + + case LV_MOVEDOWN: // Move down a bit + { + if (lv->pos.y < lv->start + 20) + { + lv->pos.y += 0.15f * (float)server->delta; + } + else + lv->state = LV_RAISE; + + break; + } + + case LV_RAISE: // accelerate + { + if (lv->pos.y > lv->start - lv->dist) + { + lv->pos.y -= lv->vel; + + if (lv->vel < 5) + lv->vel += 0.08f * (float)server->delta; + else + lv->vel = 5; + } + else + { + lv->state = LV_MOVE; + lv->timer = (4.0 + rand() % 3) * TICKSPERSEC; + lv->vel = 0; + } + + break; + } + + case LV_MOVE: // move on spot + { + lv->pos.y = (lv->start - lv->dist) + sinf((float)lv->timer / 25.0f) * 6; + + lv->timer -= server->delta; + if (lv->timer <= 0) + lv->state = LV_LOWER; + break; + } + + case LV_LOWER: // go down + { + if (lv->start > lv->pos.y) + { + lv->pos.y += lv->vel * (float)server->delta; + + if (lv->vel < 5) + lv->vel += 0.08f * (float)server->delta; + else + lv->vel = 5; + } + else + { + lv->state = LV_IDLE; + lv->timer = (20.0 + rand() % 5) * TICKSPERSEC; + lv->vel = 0; + } + + break; + } + } + + Packet pack; + PacketCreate(&pack, SERVER_VVLCOLUMN_STATE); + PacketWrite(&pack, packet_write8, lv->lid); + PacketWrite(&pack, packet_write8, lv->state); + PacketWrite(&pack, packet_writefloat, lv->pos.y); + server_broadcast(server, &pack, false); + + return true; +} diff --git a/disasterserver_c/entities/VVLava.h b/disasterserver_c/entities/VVLava.h new file mode 100644 index 0000000..b2d8262 --- /dev/null +++ b/disasterserver_c/entities/VVLava.h @@ -0,0 +1,28 @@ +#ifndef VVLAVA_H +#define VVLAVA_H +#include "../States.h" + +bool lava_tick(Server* server, Entity* entity); + +typedef struct +{ + ENTITY_BODY + + uint8_t lid; + enum + { + LV_IDLE, + LV_MOVEDOWN, + LV_RAISE, + LV_MOVE, + LV_LOWER + } state; + double timer; + float start; + float dist; + float vel; + +} Lava; +#define MakeLava(id, start, dist) ((Lava) { MakeEntity("lava", 0, start) NULL, lava_tick, NULL, id, LV_IDLE, (20 + rand() % 5) * TICKSPERSEC, start, dist, 0 }) + +#endif \ No newline at end of file diff --git a/disasterserver_c/entities/VVVase.h b/disasterserver_c/entities/VVVase.h new file mode 100644 index 0000000..9593b14 --- /dev/null +++ b/disasterserver_c/entities/VVVase.h @@ -0,0 +1,14 @@ +#ifndef VVVASE_H +#define VVVASE_H +#include "../States.h" + +typedef struct +{ + ENTITY_BODY + + uint8_t vid; + uint8_t type; +} Vase; +#define MakeVase(id) ((Vase) { MakeEntity("vase", 0, 0) NULL, NULL, NULL, id, (rand() % 4) }) + +#endif \ No newline at end of file diff --git a/disasterserver_c/entities/WDLatern.c b/disasterserver_c/entities/WDLatern.c new file mode 100644 index 0000000..5729183 --- /dev/null +++ b/disasterserver_c/entities/WDLatern.c @@ -0,0 +1,42 @@ +#include + +bool latern_tick(Server* server, Entity* entity) +{ + Latern* lat = (Latern*)entity; + + lat->timer += server->delta; + if (!lat->side) + { + if (lat->timer >= lat->time * TICKSPERSEC) + { + lat->lid = rand() % 7; + + Packet pack; + PacketCreate(&pack, SERVER_WDLATERN_ACTIVATE); + PacketWrite(&pack, packet_write8, true); + PacketWrite(&pack, packet_write8, lat->lid); + server_broadcast(server, &pack, true); + + lat->side = true; + lat->timer = 0; + lat->time = (20 + rand() % 2); + } + } + else + { + if (lat->timer >= lat->time * TICKSPERSEC) + { + Packet pack; + PacketCreate(&pack, SERVER_WDLATERN_ACTIVATE); + PacketWrite(&pack, packet_write8, false); + PacketWrite(&pack, packet_write8, lat->lid); + server_broadcast(server, &pack, true); + + lat->side = false; + lat->timer = 0; + lat->time = (7 + rand() % 2); + } + } + + return true; +} \ No newline at end of file diff --git a/disasterserver_c/entities/WDLatern.h b/disasterserver_c/entities/WDLatern.h new file mode 100644 index 0000000..d374caf --- /dev/null +++ b/disasterserver_c/entities/WDLatern.h @@ -0,0 +1,19 @@ +#ifndef WDLATERN_H +#define WDLATERN_H +#include +#include "../States.h" + +bool latern_tick(Server* server, Entity* entity); + +typedef struct +{ + ENTITY_BODY + + bool side; + double timer; + uint8_t lid; + uint16_t time; +} Latern; +#define MakeLatern() ((Latern) { MakeEntity("latrn", 0, 0) NULL, latern_tick, NULL, false, 0.0, 0, (7 + rand() % 2) }) + +#endif \ No newline at end of file diff --git a/disasterserver_c/entities/YouCantRun.c b/disasterserver_c/entities/YouCantRun.c new file mode 100644 index 0000000..813937e --- /dev/null +++ b/disasterserver_c/entities/YouCantRun.c @@ -0,0 +1,49 @@ +#include +#include + +bool ycrctrl_tick(Server* server, Entity* entity) +{ + YCRController* ctrl = (YCRController*)entity; + + switch (ctrl->state) + { + case YCC_NONE: + { + if (ctrl->timer >= TICKSPERSEC) + { + Packet pack; + PacketCreate(&pack, SERVER_YCRSMOKE_READY); + PacketWrite(&pack, packet_write8, ctrl->smoke_id); + server_broadcast(server, &pack, true); + + ctrl->state = YCC_SOME; + } + break; + } + + case YCC_SOME: + { + if (ctrl->timer >= 6 * TICKSPERSEC) + { + ctrl->state = YCC_NONE; + ctrl->timer = 0; + ctrl->activated = !ctrl->activated; + + if (ctrl->activated) + ctrl->smoke_id = rand() % 7; + else + ctrl->smoke_id = 0; + + Packet pack; + PacketCreate(&pack, SERVER_YCRSMOKE_STATE); + PacketWrite(&pack, packet_write8, ctrl->activated); + PacketWrite(&pack, packet_write8, ctrl->smoke_id); + server_broadcast(server, &pack, true); + } + break; + } + } + + ctrl->timer += server->delta; + return true; +} \ No newline at end of file diff --git a/disasterserver_c/entities/YouCantRun.h b/disasterserver_c/entities/YouCantRun.h new file mode 100644 index 0000000..b073708 --- /dev/null +++ b/disasterserver_c/entities/YouCantRun.h @@ -0,0 +1,22 @@ +#ifndef YCRCONTROLLER_H +#define YCRCONTROLLER_H +#include "../States.h" + +bool ycrctrl_tick(Server* server, Entity* entity); + +typedef struct +{ + ENTITY_BODY + + enum + { + YCC_NONE, + YCC_SOME + } state; + double timer; + uint8_t smoke_id; + uint8_t activated; +} YCRController; +#define MakeYCRCtrl() ((YCRController) { MakeEntity("ycrctrl", 0, 0) NULL, ycrctrl_tick, NULL, YCC_NONE, 0, 0, 0 }) + +#endif \ No newline at end of file diff --git a/disasterserver_c/io/Dir.h b/disasterserver_c/io/Dir.h new file mode 100644 index 0000000..159a686 --- /dev/null +++ b/disasterserver_c/io/Dir.h @@ -0,0 +1,12 @@ +#ifndef DIR_H +#define DIR_H +#if defined(_WIN32) +#define WIN32_LEARN_AND_MEAN +#include +#define mkdir(dir, mode) _mkdir(dir) +#elif defined(__unix) || defined(__unix__) +#include +#include +#include +#endif +#endif \ No newline at end of file diff --git a/disasterserver_c/io/Packet.c b/disasterserver_c/io/Packet.c new file mode 100644 index 0000000..aa9e414 --- /dev/null +++ b/disasterserver_c/io/Packet.c @@ -0,0 +1,440 @@ +#include +#include +#include +#include +#include + +#ifdef __GNUC__ // GCC, clang... + #define BYTESWAP_16(x) __builtin_bswap16((x)) + #define BYTESWAP_32(x) __builtin_bswap32((x)) + #define BYTESWAP_64(x) __builtin_bswap64((x)) +#else + #define BYTESWAP_16(x) _byteswap_ushort((x)) + #define BYTESWAP_32(x) _byteswap_ulong((x)) + #define BYTESWAP_64(x) _byteswap_uint64((x)) +#endif + +String string_new(const char* value) +{ + size_t len = strlen(value) + 1; + String str = { .len = len }; + memcpy(str.value, value, len); + + return str; +} + +size_t string_length(String* str) +{ + size_t len = 0; + + for (size_t i = 0; i < str->len; i++) + { + if (str->value[i] == '\0') + break; + + len += (str->value[i] & 0xc0) != 0x80; + } + + return len; +} + +String string_lower(String str) +{ + for (int i = 0; i < str.len; i++) + str.value[i] = (char)tolower(str.value[i]); + + return str; +} + +bool packet_new(Packet* packet, PacketType type) +{ + RAssert(packet); + packet->len = 0; + packet->pos = 0; + + PacketWrite(packet, packet_write8, 0); + PacketWrite(packet, packet_write8, (uint8_t)type); + + return true; +} + +bool packet_tcprecv(int sockfd, Packet* packet) +{ + if (sockfd == 0) + return false; + + packet->len = 0; + packet->pos = 0; + + struct pollfd fds[1]; + fds[0].fd = sockfd; + fds[0].events = POLLIN; + + int poll_res = Poll(fds, 1, -1); + if (poll_res < 0) + { + char err[256]; + + SOCKERR(err); + Warn("poll() failed for fd %d: %s", sockfd, err); + return false; + } + + // make sure we got POLLIN + if (!(fds[0].revents & POLLIN)) + { + Debug("%d no POLLIN, exiting", sockfd); + return false; + } + + int length = recv(sockfd, (char*)&packet->len, 1, 0); + if (length <= 0) + { + char err[256]; + + SOCKERR(err); + Warn("recv() failed for fd %d: %s", sockfd, err); + return false; + } + + uint8_t recieved = 0; + while (recieved < packet->len) + { + poll_res = Poll(fds, 1, -1); + if (poll_res < 0) + { + char err[256]; + + SOCKERR(err); + Warn("poll() failed for fd %d: %s", sockfd, err); + return false; + } + + // make sure we got POLLIN + if (!(fds[0].revents & POLLIN)) + { + Debug("%d no POLLIN, exiting", sockfd); + return false; + } + + uint8_t buff; + int length = recv(sockfd, (char*)&buff, 1, 0); + if (length <= 0) + { + char err[256]; + + SOCKERR(err); + Warn("recv() failed for fd %d: %s", sockfd, err); + return false; + } + + packet->buff[recieved++] = buff; + } + + return true; +} + +bool packet_udprecv(int sockfd, Packet* packet, IpAddr* addr) +{ + packet->len = 0; + packet->pos = 0; + + struct pollfd fds[1]; + fds[0].fd = sockfd; + fds[0].events = POLLIN; + + int poll_res = Poll(fds, 1, -1); + if (poll_res < 0) + { + char err[256]; + + SOCKERR(err); + Warn("poll() failed for fd %d: %s", sockfd, err); + return false; + } + + int addrlen = sizeof(struct sockaddr_storage); + int length = recvfrom(sockfd, packet->buff, PACKET_MAXSIZE, 0, (struct sockaddr*)&addr->storage, &addrlen); + if (length <= 0) + { + char err[256]; + + SOCKERR(err); + Warn("recvfrom() failed for fd %d: %s", sockfd, err); + return false; + } + + packet->len = length; + return true; +} + +bool packet_sendtcp(Server* server, int sockfd, Packet* packet) +{ + packet->pos = 0; + PacketWrite(packet, packet_write8, packet->len - 1); + + int length = send(sockfd, packet->buff, packet->len, MSG_NOSIGNAL); + if (length <= 0) + { + char err[256]; + + SOCKERR(err); + Warn("send() failed for fd %d: %s", sockfd, err); + server_disconnect(server, sockfd, DR_DONTREPORT, NULL); + return false; + } + + return true; +} + +bool packet_sendudp(int sockfd, IpAddr* to, Packet* packet) +{ + packet->pos = 0; + + int length; + if (to->storage.ss_family == AF_INET) + length = sendto(sockfd, packet->buff, packet->len, 0, (struct sockaddr*)&to->storage, sizeof(to->v4)); + else + return false; + + if (length <= 0) + { + char err[256]; + + SOCKERR(err); + Warn("sendto() failed for fd %d: %s", sockfd, err); + return false; + } + + return true; +} + +bool packet_seek(Packet* packet, int wh) +{ + RAssert(wh >= 0); + RAssert(wh < PACKET_MAXSIZE); + RAssert(wh < packet->len); + + packet->pos = wh; + return true; +} + +bool packet_read8(Packet* packet, uint8_t* out) +{ + RAssert(packet->pos < packet->len); + *out = packet->buff[packet->pos++]; + + return true; +} + +bool packet_read16(Packet* packet, uint16_t* out) +{ + RAssert(packet->pos < packet->len); + *out = *((int16_t*)&packet->buff[packet->pos]); + +#ifdef SYS_BIG_ENDIAN + *out = BYTESWAP_16(*out); +#endif + + packet->pos += 2; + + return true; +} + +bool packet_read32(Packet* packet, uint32_t* out) +{ + RAssert(packet->pos < packet->len); + *out = *((int32_t*)&packet->buff[packet->pos]); + +#ifdef SYS_BIG_ENDIAN + *out = BYTESWAP_32(*out); +#endif + + packet->pos += 4; + + return true; +} + +bool packet_read64(Packet* packet, uint64_t* out) +{ + RAssert(packet->pos < packet->len); + *out = *((int64_t*)&packet->buff[packet->pos]); + +#ifdef SYS_BIG_ENDIAN + *out = BYTESWAP_64(*out); +#endif + + packet->pos += 8; + + return true; +} + +bool packet_readfloat(Packet* packet, float* out) +{ + RAssert(packet->pos < packet->len); + *out = *((float*)&packet->buff[packet->pos]); + +#ifdef SYS_BIG_ENDIAN + *out = BYTESWAP_32(*out); +#endif + + packet->pos += 4; + + return true; +} + +bool packet_readdouble(Packet* packet, double* out) +{ + RAssert(packet->pos < packet->len); + *out = *((float*)&packet->buff[packet->pos]); + +#ifdef SYS_BIG_ENDIAN + * out = BYTESWAP_32(*out); +#endif + + packet->pos += 8; + + return true; +} + +bool packet_readstr(Packet* packet, String* out) +{ + out->len = 0; + + while (1) + { + RAssert(packet->pos < packet->len); + RAssert(out->len < 128); + + char ch = packet->buff[packet->pos]; + out->value[out->len] = ch; + + packet->pos++; + out->len++; + + if (ch == '\0') + break; + } + + return true; +} + +bool packet_write8(Packet* packet, uint8_t value) +{ + RAssert(packet->pos + 1 < PACKET_MAXSIZE); + + if (packet->pos + 1 >= packet->len) + packet->len++; + + packet->buff[packet->pos++] = value; + return true; +} + +bool packet_write16(Packet* packet, uint16_t value) +{ + RAssert(packet->pos + 2 < PACKET_MAXSIZE); + + if (packet->pos + 2 >= packet->len) + packet->len += 2; + +#ifdef SYS_BIG_ENDIAN + value = BYTESWAP_16(value); +#endif + + uint8_t* ptr = (uint8_t*)&value; + packet->buff[packet->pos++] = ptr[0]; + packet->buff[packet->pos++] = ptr[1]; + return true; +} + +bool packet_write32(Packet* packet, uint32_t value) +{ + RAssert(packet->pos + 4 < PACKET_MAXSIZE); + + if (packet->pos + 4 >= packet->len) + packet->len += 4; + +#ifdef SYS_BIG_ENDIAN + value = BYTESWAP_32(value); +#endif + + uint8_t* ptr = (uint8_t*)&value; + packet->buff[packet->pos++] = ptr[0]; + packet->buff[packet->pos++] = ptr[1]; + packet->buff[packet->pos++] = ptr[2]; + packet->buff[packet->pos++] = ptr[3]; + return true; +} + +bool packet_write64(Packet* packet, uint64_t value) +{ + RAssert(packet->pos + 8 < PACKET_MAXSIZE); + + if (packet->pos + 8 >= packet->len) + packet->len += 8; + +#ifdef SYS_BIG_ENDIAN + value = BYTESWAP_64(value); +#endif + + uint8_t* ptr = (uint8_t*)&value; + packet->buff[packet->pos++] = ptr[0]; + packet->buff[packet->pos++] = ptr[1]; + packet->buff[packet->pos++] = ptr[2]; + packet->buff[packet->pos++] = ptr[3]; + packet->buff[packet->pos++] = ptr[4]; + packet->buff[packet->pos++] = ptr[5]; + packet->buff[packet->pos++] = ptr[6]; + packet->buff[packet->pos++] = ptr[7]; + return true; +} + +bool packet_writefloat(Packet* packet, float value) +{ + RAssert(packet->pos + 4 < PACKET_MAXSIZE); + + if (packet->pos + 4 >= packet->len) + packet->len += 4; + +#ifdef SYS_BIG_ENDIAN + value = BYTESWAP_32(value); +#endif + + uint8_t* ptr = (uint8_t*)&value; + packet->buff[packet->pos++] = ptr[0]; + packet->buff[packet->pos++] = ptr[1]; + packet->buff[packet->pos++] = ptr[2]; + packet->buff[packet->pos++] = ptr[3]; + return true; +} + +bool packet_writedouble(Packet* packet, double value) +{ + RAssert(packet->pos + 8 < PACKET_MAXSIZE); + + if (packet->pos + 8 >= packet->len) + packet->len += 8; + +#ifdef SYS_BIG_ENDIAN + value = BYTESWAP_64(value); +#endif + + uint8_t* ptr = (uint8_t*)&value; + packet->buff[packet->pos++] = ptr[0]; + packet->buff[packet->pos++] = ptr[1]; + packet->buff[packet->pos++] = ptr[2]; + packet->buff[packet->pos++] = ptr[3]; + packet->buff[packet->pos++] = ptr[4]; + packet->buff[packet->pos++] = ptr[5]; + packet->buff[packet->pos++] = ptr[6]; + packet->buff[packet->pos++] = ptr[7]; + return true; +} + +bool packet_writestr(Packet* packet, String value) +{ + for (uint8_t i = 0; i < value.len; i++) + RAssert(packet_write8(packet, value.value[i])); + + return true; +} diff --git a/disasterserver_c/io/Packet.h b/disasterserver_c/io/Packet.h new file mode 100644 index 0000000..da4e252 --- /dev/null +++ b/disasterserver_c/io/Packet.h @@ -0,0 +1,209 @@ +#ifndef PACKET_H +#define PACKET_H +#include "Log.h" +#include "TcpListener.h" +#include "UdpListener.h" +#include + +typedef enum +{ + IDENTITY, + SERVER_IDENTITY_RESPONSE, + + SERVER_PLAYER_JOINED, + SERVER_PLAYER_LEFT, + SERVER_PLAYER_FORCE_DISCONNECT, + + SERVER_WAITING_PLAYER_INFO, + + SERVER_LOBBY_READY_STATE, + SERVER_LOBBY_EXE, + SERVER_LOBBY_COUNTDOWN, + SERVER_LOBBY_EXE_CHANGE, + SERVER_LOBBY_CHARACTER_CHANGE, + SERVER_LOBBY_CHARACTER_RESPONSE, + SERVER_LOBBY_EXECHARACTER_RESPONSE, + SERVER_LOBBY_GAME_START, + SERVER_LOBBY_PLAYER, + SERVER_LOBBY_EXE_CHANCE, + SERVER_LOBBY_CORRECT, + SERVER_LOBBY_CHOOSEVOTEKICK, + SERVER_LOBBY_CHOOSEBAN, + SERVER_LOBBY_CHOOSEKICK, + SERVER_LOBBY_CHOOSEOP, + SERVER_CHAR_TIME_SYNC, + + SERVER_VOTE_MAPS, + SERVER_VOTE_SET, + SERVER_VOTE_TIME_SYNC, + + SERVER_GAME_PLAYERS_READY, + SERVER_GAME_EXE_WINS, + SERVER_GAME_SURVIVOR_WIN, + SERVER_GAME_SPAWN_RING, + SERVER_GAME_PLAYER_ESCAPED, + SERVER_GAME_BACK_TO_LOBBY, + SERVER_GAME_TIME_SYNC, + SERVER_GAME_TIME_OVER, + SERVER_GAME_PING, + SERVER_PLAYER_DEATH_STATE, + SERVER_GAME_DEATHTIMER_TICK, + SERVER_GAME_DEATHTIMER_END, + + SERVER_REQUEST_INFO, + SERVER_HEARTBEAT, + SERVER_PONG, + + SERVER_FORCE_DAMAGE, + SERVER_GAME_RING_READY, + SERVER_PLAYER_BACKTRACK, + + // Entities + SERVER_TPROJECTILE_STATE, + SERVER_ETRACKER_STATE, + SERVER_ERECTOR_BRING_SPAWN, + SERVER_RMZSLIME_STATE, + SERVER_RMZSLIME_RINGBONUS, + SERVER_RMZSHARD_STATE, + SERVER_LCEYE_STATE, + SERVER_LCCHAIN_STATE, + SERVER_NPCONTROLLER_STATE, + SERVER_KAFMONITOR_STATE, + SERVER_YCRSMOKE_STATE, + SERVER_YCRSMOKE_READY, + SERVER_MOVINGSPIKE_STATE, + SERVER_RING_STATE, + SERVER_RING_COLLECTED, + SERVER_ACT9WALL_STATE, + SERVER_NAPBALL_STATE, + SERVER_NAPICE_STATE, + SERVER_PFLIFT_STATE, + SERVER_BRING_STATE, + SERVER_BRING_COLLECTED, + SERVER_VVLCOLUMN_STATE, + SERVER_VVVASE_STATE, + SERVER_GHZTHUNDER_STATE, + SERVER_TCGOM_STATE, + SERVER_EXELLERCLONE_STATE, + SERVER_DTTAILSDOLL_STATE, + SERVER_DTBALL_STATE, + SERVER_DTASS_STATE, + SERVER_HDDOOR_STATE, + SERVER_FART_STATE, + + // Entity actions + CLIENT_ETRACKER, + CLIENT_ETRACKER_ACTIVATED, + CLIENT_TPROJECTILE, + CLIENT_TPROJECTILE_HIT, + CLIENT_TPROJECTILE_STARTCHARGE, + CLIENT_ERECTOR_BALLS, + CLIENT_ERECTOR_BRING_SPAWN, + CLIENT_EXELLER_SPAWN_CLONE, + CLIENT_EXELLER_TELEPORT_CLONE, + CLIENT_MERCOIN_BONUS, + + CLIENT_RMZSLIME_HIT, + CLIENT_LCEYE_REQUEST_ACTIVATE, + CLIENT_KAFMONITOR_ACTIVATE, + CLIENT_RING_COLLECTED, + CLIENT_BRING_COLLECTED, + CLIENT_NAPICE_ACTIVATE, + CLIENT_SPRING_USE, + CLIENT_PFLIT_ACTIVATE, + CLIENT_VVVASE_BREAK, + CLIENT_RMZSHARD_COLLECT, + CLIENT_RMZSHARD_LAND, + CLIENT_DTASS_ACTIVATE, + CLIENT_HDDOOR_TOGGLE, + CLIENT_FART_PUSH, + + CLIENT_LOBBY_READY_STATE, + CLIENT_REQUESTED_INFO, + CLIENT_PLAYER_DATA, + CLIENT_PLAYER_HURT, + CLIENT_SOUND_EMIT, + CLIENT_PING, + + CLIENT_REVIVAL_PROGRESS, + CLIENT_PLAYER_HEAL, + CLIENT_PLAYER_HEAL_PART, + SERVER_REVIVAL_PROGRESS, + SERVER_REVIVAL_STATUS, + SERVER_REVIVAL_RINGSUB, + SERVER_REVIVAL_REVIVED, + + CLIENT_REQUEST_CHARACTER, + CLIENT_REQUEST_EXECHARACTER, + CLIENT_VOTE_REQUEST, + + CLIENT_PLAYER_DEATH_STATE, + CLIENT_PLAYER_ESCAPED, + SERVER_PLAYER_ESCAPED, + CLIENT_LOBBY_PLAYERS_REQUEST, + CLIENT_CREAM_SPAWN_RINGS, + CLIENT_SPAWN_EFFECT, + CLIENT_CHAT_MESSAGE, + CLIENT_LOBBY_CHOOSEVOTEKICK, + CLIENT_LOBBY_CHOOSEBAN, + CLIENT_LOBBY_CHOOSEKICK, + CLIENT_LOBBY_CHOOSEOP, + CLIENT_PLAYER_PALLETE, + CLIENT_PET_PALLETE, + + CLIENT_PLAYER_POTATER +} PacketType; + +typedef struct +{ + #define PACKET_MAXSIZE 256 + + uint8_t buff[PACKET_MAXSIZE]; + uint8_t pos; + uint8_t len; +} Packet; + +/* UTF-8 supporting string */ +typedef struct +{ + char value[129]; + uint16_t len; +} String; + +String string_new(const char* value); +size_t string_length(String* str); +String string_lower(String str); +#define __Str(x) string_new(x) + +bool packet_new(Packet* packet, PacketType type); +bool packet_tcprecv(int sockfd, Packet* packet); +bool packet_udprecv(int sockfd, Packet* packet, IpAddr* addr); + +struct Server; +bool packet_sendtcp(struct Server* server, int sockfd, Packet* packet); +bool packet_sendudp(int sockfd, IpAddr* to, Packet* packet); +bool packet_seek(Packet* packet, int wh); + +bool packet_read8(Packet* packet, uint8_t* out); +bool packet_read16(Packet* packet, uint16_t* out); +bool packet_read32(Packet* packet, uint32_t* out); +bool packet_read64(Packet* packet, uint64_t* out); +bool packet_readfloat(Packet* packet, float* out); +bool packet_readdouble(Packet* packet, double* out); +bool packet_readstr(Packet* packet, String* out); + +bool packet_write8(Packet* packet, uint8_t value); +bool packet_write16(Packet* packet, uint16_t value); +bool packet_write32(Packet* packet, uint32_t value); +bool packet_write64(Packet* packet, uint64_t value); +bool packet_writefloat(Packet* packet, float value); +bool packet_writedouble(Packet* packet, double value); +bool packet_writestr(Packet* packet, String value); + +#define PacketCreate(packet, type) RAssert(packet_new(packet, type)) +#define PacketRead(outname, packet, func, type)\ +type outname;\ +RAssert(func(packet, &outname)) +#define PacketWrite(packet, func, val) RAssert(func(packet, val)) + +#endif diff --git a/disasterserver_c/io/Socket.h b/disasterserver_c/io/Socket.h new file mode 100644 index 0000000..97bb415 --- /dev/null +++ b/disasterserver_c/io/Socket.h @@ -0,0 +1,35 @@ +#ifndef SOCKET_H +#define SOCKET_H + +#if defined(__unix) || defined(__unix__) + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + + #define SockError(signature) strncpy(signature, strerror(errno), 256) + #define Poll poll +#else + #define WIN32_LEAN_AND_MEAN + #include + #include + #include + #include + #include + #include + + #define close closesocket + #define SockError(signature) FormatMessageA(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS | FORMAT_MESSAGE_MAX_WIDTH_MASK , 0, WSAGetLastError(), 0, signature, 256, 0); + #define Poll WSAPoll + #define MSG_NOSIGNAL 0 + + typedef int socklen_t; +#endif + +#endif \ No newline at end of file diff --git a/disasterserver_c/io/TcpListener.c b/disasterserver_c/io/TcpListener.c new file mode 100644 index 0000000..0c7699f --- /dev/null +++ b/disasterserver_c/io/TcpListener.c @@ -0,0 +1,90 @@ +#include + +bool tcp_open(TcpListener* tcp, uint16_t port) +{ + RAssert(tcp); + +#ifdef WIN32 + WSADATA wsaData; + RAssert(WSAStartup(MAKEWORD(2, 2), &wsaData) == 0); +#endif + + tcp->fd = (int)socket(AF_INET, SOCK_STREAM, 0); + RAssert(tcp->fd >= 0); + + const int opt = 1; + RAssert(setsockopt(tcp->fd, IPPROTO_TCP, TCP_NODELAY, (const char*)&opt, sizeof(opt)) >= 0); + RAssert(setsockopt(tcp->fd, SOL_SOCKET, SO_REUSEADDR, (const char*)&opt, sizeof(opt)) >= 0); + + // Init listener + memset(&tcp->addr, 0, sizeof(tcp->addr)); + tcp->addr.sin_family = AF_INET; + tcp->addr.sin_addr.s_addr = INADDR_ANY; + tcp->addr.sin_port = htons(port); + + RAssert(bind(tcp->fd, (struct sockaddr*)&tcp->addr, sizeof(tcp->addr)) >= 0); + Info("%d SOCK_STREAM (port %d) bind succeeded.", tcp->fd, ntohs(tcp->addr.sin_port)); + return true; +} + +bool tcp_listen(TcpListener* tcp) +{ + RAssert(tcp); + RAssert(listen(tcp->fd, 3) >= 0); + Info("%d SOCK_STREAM (port %d) listening for incoming connections.", tcp->fd, ntohs(tcp->addr.sin_port)); + + return true; +} + +bool tcp_next(TcpListener* tcp, int* id, struct sockaddr_in* addr) +{ + RAssert(tcp); + + size_t addr_len = sizeof(struct sockaddr_in); + *id = accept(tcp->fd, (struct sockaddr*)addr, &addr_len); + + if (*id < 0) + { + char err[256]; + SOCKERR(err); + Err("%d SOCK_STREAM: accept failed for fd %d: %s", tcp->fd, *id, err); + + return false; + } + +#ifdef WIN32 + static const u_long mode = 1; // 1 to enable non-blocking socket + + if (ioctlsocket(*id, FIONBIO, &mode) != NOERROR) + { + char err[256]; + SOCKERR(err); + Err("%d SOCK_STREAM: fnctl failed for fd %d: %s", tcp->fd, *id, err); + + close(*id); + return false; + } +#elif defined(__unix) || defined(__unix__) + if (fcntl(*id, F_SETFL, fcntl(*id, F_GETFL, 0) | O_NONBLOCK) == -1) + { + char err[256]; + SOCKERR(err); + Err("%d SOCK_STREAM: fnctl failed for fd %d: %s", tcp->fd, *id, err); + + close(*id); + return false; + } +#endif + + Info("%d SOCK_STREAM: connected (id %d, ip %s)", tcp->fd, *id, inet_ntoa(addr->sin_addr)); + return true; +} + +bool tcp_kill(TcpListener* tcp, int id) +{ + close(id); + RAssert(tcp); + + Info("%d SOCK_STREAM: disconnected (id %d)", tcp->fd, id); + return true; +} \ No newline at end of file diff --git a/disasterserver_c/io/TcpListener.h b/disasterserver_c/io/TcpListener.h new file mode 100644 index 0000000..68132cb --- /dev/null +++ b/disasterserver_c/io/TcpListener.h @@ -0,0 +1,51 @@ +#ifndef TCPLISTENER_H +#define TCPLISTENER_H + +#include "../Log.h" + +#include +#include +#include +#include + +#if defined(__unix) || defined(__unix__) + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + + #define SOCKERR(signature) strncpy(signature, strerror(errno), 256) + #define Poll poll +#else + #define WIN32_LEAN_AND_MEAN + #include + #include + #include + #include + #include + #include + + #define close closesocket + #define SOCKERR(signature) FormatMessageA(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS | FORMAT_MESSAGE_MAX_WIDTH_MASK , 0, WSAGetLastError(), 0, signature, 256, 0); + #define Poll WSAPoll + #define MSG_NOSIGNAL 0 +#endif + +typedef struct +{ + struct sockaddr_in addr; + int fd; +} TcpListener; + +bool tcp_open (TcpListener* tcp, uint16_t port); +bool tcp_listen (TcpListener* tcp); +bool tcp_next (TcpListener* tcp, int* fd, struct sockaddr_in* addr); +bool tcp_kill (TcpListener* tcp, int fd); + +#endif diff --git a/disasterserver_c/io/Threads.h b/disasterserver_c/io/Threads.h new file mode 100644 index 0000000..d36faf3 --- /dev/null +++ b/disasterserver_c/io/Threads.h @@ -0,0 +1,54 @@ +#ifndef THREADS_H +#define THREADS_H + +#if defined(__unix) || defined(__unix__) + #include + #include + #include + #include + + typedef pthread_t Thread; + typedef pthread_key_t ThreadVar; + typedef void* (*pthread_cbfunc_t) (void*); + + #define ThreadVarCreate(var) pthread_key_create(&var, NULL) + #define ThreadVarSet(var, value) pthread_setspecific(var, value) + #define ThreadVarGet(var) pthread_getspecific(var) + #define ThreadVarFree(var) pthread_key_delete(var) + + #define ThreadSpawn(thr, cb, arg) { pthread_create(&thr, NULL, (pthread_cbfunc_t)(cb), (arg)); pthread_detach(thr); } + #define ThreadJoin(thr) pthread_join(thr, NULL) + #define ThreadSleep(ms) { struct timespec ts;\ + ts.tv_sec = ms / 1000;\ + ts.tv_nsec = (ms % 1000) * 1000000;\ + nanosleep(&ts, NULL); } + + typedef pthread_mutex_t Mutex; + #define MutexCreate(mut) RAssert(pthread_mutex_init(&mut, NULL) == 0) + #define MutexLock(mut) RAssert(pthread_mutex_lock(&mut) == 0) + #define MutexUnlock(mut) RAssert(pthread_mutex_unlock(&mut) == 0) +#else + #define WIN32_LEAN_AND_MEAN + #include + + typedef HANDLE Thread; + typedef DWORD ThreadVar; + + #define ThreadVarCreate(var) RAssert((var = TlsAlloc()) != TLS_OUT_OF_INDEXES) + #define ThreadVarGet(var) TlsGetValue(var) + #define ThreadVarSet(var, value) TlsSetValue(var, value) + #define ThreadVarFree(var) TlsFree(var) + + #define ThreadSpawn(thr, cb, arg) (thr = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)(cb), (arg), 0, NULL)) + #define ThreadJoin(thr) WaitForSingleObject(thr, INFINITE) + #define ThreadSleep(ms) Sleep(ms) + + typedef HANDLE Mutex; + #define MutexCreate(mut) (mut = CreateMutex(NULL, FALSE, NULL)) + #define MutexLock(mut) RAssert(WaitForSingleObject(mut, INFINITE) == WAIT_OBJECT_0) + #define MutexUnlock(mut) RAssert(ReleaseMutex(mut)) +#endif + +extern ThreadVar g_threadName; + +#endif diff --git a/disasterserver_c/io/Time.c b/disasterserver_c/io/Time.c new file mode 100644 index 0000000..bdc1df2 --- /dev/null +++ b/disasterserver_c/io/Time.c @@ -0,0 +1,49 @@ +#include +#include +#include +#include +#include + +bool init = false; +double freq = 0; + +void time_start(TimeStamp* timer) +{ +#ifdef _WIN32 + LARGE_INTEGER li; + + if (!init) + { + if (!QueryPerformanceFrequency(&li)) + { + Err("Failed to query perfomance frequency!"); + return; + } + + freq = (double)(li.QuadPart) / 1000.0; + init = true; + } + + QueryPerformanceCounter(&li); + *timer = (li.QuadPart / freq); +#else + struct timespec _t; + clock_gettime(CLOCK_MONOTONIC, &_t); + *timer = _t.tv_sec * 1000 + _t.tv_nsec / 1e6; +#endif +} + +double time_end(TimeStamp* timer) +{ +#ifdef _WIN32 + LARGE_INTEGER li; + QueryPerformanceCounter(&li); + return (double)((li.QuadPart) / freq) - (*timer); +#else + struct timespec _t; + clock_gettime(CLOCK_MONOTONIC, &_t); + + double current = _t.tv_sec * 1000 + _t.tv_nsec / 1e6; + return current - (*timer); +#endif +} diff --git a/disasterserver_c/io/Time.h b/disasterserver_c/io/Time.h new file mode 100644 index 0000000..a48b347 --- /dev/null +++ b/disasterserver_c/io/Time.h @@ -0,0 +1,15 @@ +#ifndef TIME_H +#define TIME_H +#include +#include + +#if defined(_WIN32) + #define WIN32_LEAN_AND_MEAN + #include +#endif + +typedef double TimeStamp; +void time_start (TimeStamp* timer); +double time_end (TimeStamp* timer); + +#endif \ No newline at end of file diff --git a/disasterserver_c/io/UdpListener.c b/disasterserver_c/io/UdpListener.c new file mode 100644 index 0000000..b2a68a5 --- /dev/null +++ b/disasterserver_c/io/UdpListener.c @@ -0,0 +1,30 @@ +#include "io/UdpListener.h" +#include "io/TcpListener.h" + +#define SIO_UDP_CONNRESET _WSAIOW(IOC_VENDOR, 12) + +bool udp_open(UdpListener* udp, uint16_t port) +{ + RAssert(udp); + + udp->fd = (int)socket(AF_INET, SOCK_DGRAM, 0); + RAssert(udp->fd >= 0); + + // Init listener + memset(&udp->addr, 0, sizeof(udp->addr)); + udp->addr.sin_family = AF_INET; + udp->addr.sin_addr.s_addr = INADDR_ANY; + udp->addr.sin_port = htons(port); + + RAssert(bind(udp->fd, (struct sockaddr*)&udp->addr, sizeof(udp->addr)) >= 0); + Info("%d SOCK_DGRAM (port %d) bind succeeded.", udp->fd, ntohs(udp->addr.sin_port)); + +#ifdef WIN32 + BOOL beh = FALSE; + DWORD returned = 0; + RAssert(WSAIoctl(udp->fd, SIO_UDP_CONNRESET, &beh, sizeof(beh), NULL, 0, &returned, NULL, NULL) == 0); + Info("%d SOCK_DGRAM (port %d) applied SIO_UDP_CONNRESET hack.", udp->fd, ntohs(udp->addr.sin_port)); +#endif + + return true; +} \ No newline at end of file diff --git a/disasterserver_c/io/UdpListener.h b/disasterserver_c/io/UdpListener.h new file mode 100644 index 0000000..e406740 --- /dev/null +++ b/disasterserver_c/io/UdpListener.h @@ -0,0 +1,34 @@ +#ifndef UDPLISTENER_H +#define UDPLISTENER_H + +#include "../Log.h" + +#if defined(__unix) || defined(__unix__) + #include + #include + #include + #include + #include +#else + #define WIN32_LEAN_AND_MEAN + #include + #include + #define close closesocket +#endif + +typedef union +{ + struct sockaddr addr; + struct sockaddr_in v4; + struct sockaddr_storage storage; +} IpAddr; + +typedef struct +{ + struct sockaddr_in addr; + int fd; +} UdpListener; + +bool udp_open (UdpListener* udp, uint16_t port); + +#endif diff --git a/disasterserver_c/maps/Act9.c b/disasterserver_c/maps/Act9.c new file mode 100644 index 0000000..34d9177 --- /dev/null +++ b/disasterserver_c/maps/Act9.c @@ -0,0 +1,14 @@ +#include +#include +#include + +bool act9_init(Server* server) +{ + RAssert(map_time(server, 2.17 * TICKSPERSEC, 10)); // 130 + RAssert(map_ring(server, 3)); + + RAssert(game_spawn(server, (Entity*)&(MakeAct9Wall(0, 0, 1025)), sizeof(Act9Wall), NULL)); + RAssert(game_spawn(server, (Entity*)&(MakeAct9Wall(1, 1663, 0)), sizeof(Act9Wall), NULL)); + RAssert(game_spawn(server, (Entity*)&(MakeAct9Wall(2, 1663, 0)), sizeof(Act9Wall), NULL)); + return true; +} \ No newline at end of file diff --git a/disasterserver_c/maps/Act9.h b/disasterserver_c/maps/Act9.h new file mode 100644 index 0000000..12e98cc --- /dev/null +++ b/disasterserver_c/maps/Act9.h @@ -0,0 +1,7 @@ +#ifndef ACT9_H +#define ACT9_H +#include "../Maps.h" + +bool act9_init(Server* server); + +#endif \ No newline at end of file diff --git a/disasterserver_c/maps/DarkTower.c b/disasterserver_c/maps/DarkTower.c new file mode 100644 index 0000000..3a1399d --- /dev/null +++ b/disasterserver_c/maps/DarkTower.c @@ -0,0 +1,58 @@ +#include +#include +#include +#include + +bool dt_init(Server* server) +{ + RAssert(map_time(server, 3.42 * TICKSPERSEC, 20)); //205 + RAssert(map_ring(server, 5)); + + RAssert(game_spawn(server, (Entity*)&(MakeDTBall()), sizeof(DTBall), NULL)); + RAssert(game_spawn(server, (Entity*)&(MakeTailsDoll()), sizeof(TailsDoll), NULL)); + + RAssert(game_spawn(server, (Entity*)&(MakeDTStalactiti(0, 1744, 224)), sizeof(DTStalactits), NULL)); + RAssert(game_spawn(server, (Entity*)&(MakeDTStalactiti(1, 1840, 224)), sizeof(DTStalactits), NULL)); + RAssert(game_spawn(server, (Entity*)&(MakeDTStalactiti(2, 1936, 224)), sizeof(DTStalactits), NULL)); + RAssert(game_spawn(server, (Entity*)&(MakeDTStalactiti(3, 2032, 224)), sizeof(DTStalactits), NULL)); + RAssert(game_spawn(server, (Entity*)&(MakeDTStalactiti(4, 2128, 224)), sizeof(DTStalactits), NULL)); + + RAssert(game_spawn(server, (Entity*)&(MakeDTStalactiti(5, 1824, 784)), sizeof(DTStalactits), NULL)); + RAssert(game_spawn(server, (Entity*)&(MakeDTStalactiti(6, 1920, 784)), sizeof(DTStalactits), NULL)); + RAssert(game_spawn(server, (Entity*)&(MakeDTStalactiti(7, 2016, 784)), sizeof(DTStalactits), NULL)); + RAssert(game_spawn(server, (Entity*)&(MakeDTStalactiti(8, 2112, 784)), sizeof(DTStalactits), NULL)); + RAssert(game_spawn(server, (Entity*)&(MakeDTStalactiti(9, 2208, 784)), sizeof(DTStalactits), NULL)); + + RAssert(game_spawn(server, (Entity*)&(MakeDTStalactiti(10, 2464, 1384)), sizeof(DTStalactits), NULL)); + RAssert(game_spawn(server, (Entity*)&(MakeDTStalactiti(11, 2592, 1384)), sizeof(DTStalactits), NULL)); + + RAssert(game_spawn(server, (Entity*)&(MakeDTStalactiti(12, 3032, 64)), sizeof(DTStalactits), NULL)); + RAssert(game_spawn(server, (Entity*)&(MakeDTStalactiti(13, 3088, 64)), sizeof(DTStalactits), NULL)); + + return true; +} + +bool dt_tcpmsg(PeerData* v, Packet* packet) +{ + PacketRead(passtrough, packet, packet_read8, uint8_t); + PacketRead(type, packet, packet_read8, uint8_t); + + switch (type) + { + case CLIENT_DTASS_ACTIVATE: + { + PacketRead(sid, packet, packet_read8, uint8_t); + AssertOrDisconnect(v->server, v->in_game); + AssertOrDisconnect(v->server, sid < 14); + + DTStalactits* ents[14]; + if (!game_find(v->server, (Entity**)ents, "dttits", 14)) + break; + + RAssert(dtst_activate(v->server, ents[sid])); + break; + } + } + + return true; +} diff --git a/disasterserver_c/maps/DarkTower.h b/disasterserver_c/maps/DarkTower.h new file mode 100644 index 0000000..eaec307 --- /dev/null +++ b/disasterserver_c/maps/DarkTower.h @@ -0,0 +1,8 @@ +#ifndef DARKTOWER_H +#define DARKTOWER_H +#include "../Maps.h" + +bool dt_init(Server* server); +bool dt_tcpmsg(PeerData* v, Packet* packet); + +#endif \ No newline at end of file diff --git a/disasterserver_c/maps/DotDotDot.c b/disasterserver_c/maps/DotDotDot.c new file mode 100644 index 0000000..6f10112 --- /dev/null +++ b/disasterserver_c/maps/DotDotDot.c @@ -0,0 +1,12 @@ +#include +#include +#include + +bool dot_init(Server* server) +{ + RAssert(map_time(server, 3.42 * TICKSPERSEC, 20)); //205 + RAssert(map_ring(server, 5)); + RAssert(game_spawn(server, (Entity*)&(MakeSpike()), sizeof(SpikeController), NULL)); + + return true; +} diff --git a/disasterserver_c/maps/DotDotDot.h b/disasterserver_c/maps/DotDotDot.h new file mode 100644 index 0000000..6c21e57 --- /dev/null +++ b/disasterserver_c/maps/DotDotDot.h @@ -0,0 +1,7 @@ +#ifndef THREEDOTS_H +#define THREEDOTS_H +#include "../Maps.h" + +bool dot_init(Server* server); + +#endif \ No newline at end of file diff --git a/disasterserver_c/maps/FartZone.c b/disasterserver_c/maps/FartZone.c new file mode 100644 index 0000000..aa5298b --- /dev/null +++ b/disasterserver_c/maps/FartZone.c @@ -0,0 +1,45 @@ +#include +#include +#include +#include +#include +#include + +bool ft_init(Server* server) +{ + RAssert(map_time(server, 4.27 * TICKSPERSEC, 20)); + RAssert(map_ring(server, 1)); + + for (uint8_t i = 0; i < 3; i++) + RAssert(game_spawn(server, (Entity*)&(MakeBlackRing(MAP_BRING, MAP_BRING)), sizeof(BRing), NULL)); + + RAssert(game_spawn(server, (Entity*)&(MakeDummy()), sizeof(Dummy), NULL)); + RAssert(game_spawn(server, (Entity*)&(MakeSpike()), sizeof(SpikeController), NULL)); + RAssert(game_spawn(server, (Entity*)&(MakeDTBall()), sizeof(DTBall), NULL)); + + return true; +} + +bool ft_tcpmsg(PeerData* v, Packet* packet) +{ + PacketRead(passtrough, packet, packet_read8, uint8_t); + PacketRead(type, packet, packet_read8, uint8_t); + + switch (type) + { + case CLIENT_FART_PUSH: + { + AssertOrDisconnect(v->server, v->in_game); + PacketRead(spd, packet, packet_read8, int8_t); + + Dummy* dum; + if (!game_find(v->server, (Entity**)&dum, "dummy", 1)) + break; + + dummy_activate(dum, spd); + break; + } + } + + return true; +} diff --git a/disasterserver_c/maps/FartZone.h b/disasterserver_c/maps/FartZone.h new file mode 100644 index 0000000..55cd3c8 --- /dev/null +++ b/disasterserver_c/maps/FartZone.h @@ -0,0 +1,8 @@ +#ifndef FARTZONE_H +#define FARTZONE_H +#include "../Maps.h" + +bool ft_init(Server* server); +bool ft_tcpmsg(PeerData* v, Packet* packet); + +#endif \ No newline at end of file diff --git a/disasterserver_c/maps/HauntingDream.c b/disasterserver_c/maps/HauntingDream.c new file mode 100644 index 0000000..360ab7a --- /dev/null +++ b/disasterserver_c/maps/HauntingDream.c @@ -0,0 +1,34 @@ +#include +#include +#include + +bool hd_init(Server* server) +{ + RAssert(map_time(server, 3.42 * TICKSPERSEC, 20)); //205 + RAssert(map_ring(server, 5)); + RAssert(game_spawn(server, (Entity*)&(MakeHDDoor()), sizeof(HDDoor), NULL)); + + return true; +} + +bool hd_tcpmsg(PeerData* v, Packet* packet) +{ + PacketRead(passtrough, packet, packet_read8, uint8_t); + PacketRead(type, packet, packet_read8, uint8_t); + + switch (type) + { + case CLIENT_HDDOOR_TOGGLE: + { + AssertOrDisconnect(v->server, v->in_game); + HDDoor* door; + if (!game_find(v->server, (Entity**)&door, "hddoor", 1)) + break; + + hddoor_toggle(v->server, door); + break; + } + } + + return true; +} diff --git a/disasterserver_c/maps/HauntingDream.h b/disasterserver_c/maps/HauntingDream.h new file mode 100644 index 0000000..bfc2237 --- /dev/null +++ b/disasterserver_c/maps/HauntingDream.h @@ -0,0 +1,8 @@ +#ifndef HAUNTDREAM_H +#define HAUNTDREAM_H +#include "../Maps.h" + +bool hd_init(Server* server); +bool hd_tcpmsg(PeerData* v, Packet* packet); + +#endif \ No newline at end of file diff --git a/disasterserver_c/maps/HideAndSeek.c b/disasterserver_c/maps/HideAndSeek.c new file mode 100644 index 0000000..b22cc71 --- /dev/null +++ b/disasterserver_c/maps/HideAndSeek.c @@ -0,0 +1,10 @@ +#include +#include + +bool hs2_init(Server* server) +{ + RAssert(map_time(server, 3.42 * TICKSPERSEC, 20)); //205 + RAssert(map_ring(server, 5)); + + return true; +} \ No newline at end of file diff --git a/disasterserver_c/maps/HideAndSeek2.h b/disasterserver_c/maps/HideAndSeek2.h new file mode 100644 index 0000000..433cdda --- /dev/null +++ b/disasterserver_c/maps/HideAndSeek2.h @@ -0,0 +1,7 @@ +#ifndef HIDEANDSEEK2_H +#define HIDEANDSEEK2_H +#include "../Maps.h" + +bool hs2_init(Server* server); + +#endif \ No newline at end of file diff --git a/disasterserver_c/maps/Hill.c b/disasterserver_c/maps/Hill.c new file mode 100644 index 0000000..cb908b5 --- /dev/null +++ b/disasterserver_c/maps/Hill.c @@ -0,0 +1,14 @@ +#include +#include +#include +#include + +bool hill_init(Server* server) +{ + RAssert(map_time(server, 3 * TICKSPERSEC, 20)); + RAssert(map_ring(server, 5)); + + RAssert(game_spawn(server, (Entity*)&(MakeThunder()), sizeof(Thunder), NULL)); + + return true; +} \ No newline at end of file diff --git a/disasterserver_c/maps/Hill.h b/disasterserver_c/maps/Hill.h new file mode 100644 index 0000000..5713ebc --- /dev/null +++ b/disasterserver_c/maps/Hill.h @@ -0,0 +1,7 @@ +#ifndef HILL_H +#define HILL_H +#include "../Maps.h" + +bool hill_init(Server* server); + +#endif \ No newline at end of file diff --git a/disasterserver_c/maps/KindAndFair.c b/disasterserver_c/maps/KindAndFair.c new file mode 100644 index 0000000..89409df --- /dev/null +++ b/disasterserver_c/maps/KindAndFair.c @@ -0,0 +1,39 @@ +#include +#include +#include + +bool kaf_init(Server* server) +{ + RAssert(map_time(server, 3 * TICKSPERSEC, 20)); //180 + RAssert(map_ring(server, 5)); + + for (uint8_t i = 0; i < 11; i++) + RAssert(game_spawn(server, (Entity*)&(MakeKafBox(i)), sizeof(KafBox), NULL)); + + return true; +} + +bool kaf_tcpmsg(PeerData* v, Packet* packet) +{ + PacketRead(passtrough, packet, packet_read8, uint8_t); + PacketRead(type, packet, packet_read8, uint8_t); + + switch (type) + { + case CLIENT_KAFMONITOR_ACTIVATE: + { + AssertOrDisconnect(v->server, v->in_game); + PacketRead(nid, packet, packet_read8, uint8_t); + PacketRead(proj, packet, packet_read8, uint8_t); + + KafBox* box[11]; + if (!game_find(v->server, (Entity**)box, "kafbox", 11)) + break; + + RAssert(kafbox_activate(v->server, box[nid], v->id, proj)); + break; + } + } + + return true; +} diff --git a/disasterserver_c/maps/KindAndFair.h b/disasterserver_c/maps/KindAndFair.h new file mode 100644 index 0000000..d4f8264 --- /dev/null +++ b/disasterserver_c/maps/KindAndFair.h @@ -0,0 +1,8 @@ +#ifndef KINDANDFAIR_H +#define KINDANDFAIR_H +#include "../Maps.h" + +bool kaf_init (Server* server); +bool kaf_tcpmsg (PeerData* v, Packet* packet); + +#endif \ No newline at end of file diff --git a/disasterserver_c/maps/LimpCity.c b/disasterserver_c/maps/LimpCity.c new file mode 100644 index 0000000..a8bf105 --- /dev/null +++ b/disasterserver_c/maps/LimpCity.c @@ -0,0 +1,65 @@ +#include +#include +#include + +bool lc_init(Server* server) +{ + RAssert(map_time(server, 2.585 * TICKSPERSEC, 20)); //155 + RAssert(map_ring(server, 5)); + + RAssert(game_spawn(server, (Entity*)&(MakeLCEye(0)), sizeof(LCEye), NULL)); + RAssert(game_spawn(server, (Entity*)&(MakeLCEye(1)), sizeof(LCEye), NULL)); + RAssert(game_spawn(server, (Entity*)&(MakeLCChain()), sizeof(LCChain), NULL)); + + return true; +} + +bool lc_tcpmsg(PeerData* v, Packet* packet) +{ + PacketRead(passtrough, packet, packet_read8, uint8_t); + PacketRead(type, packet, packet_read8, uint8_t); + + switch (type) + { + case CLIENT_LCEYE_REQUEST_ACTIVATE: + { + PacketRead(val, packet, packet_read8, uint8_t); + PacketRead(nid, packet, packet_read8, uint8_t); + PacketRead(target, packet, packet_read8, uint8_t); + AssertOrDisconnect(v->server, nid < 2); + AssertOrDisconnect(v->server, v->in_game); + + LCEye* eyes[2]; + if (!game_find(v->server, (Entity**)eyes, "lceye", 2)) + break; + + LCEye* eye = eyes[nid]; + if (val) + { + if (eye->used) + break; + + if (eye->charge < 20) + break; + + eye->use_id = v->id; + eye->target = target; + eye->used = true; + eye->timer = 0; + + RAssert(lceye_update(v->server, eye)); + } + else + { + eye->used = false; + eye->timer = 0; + + RAssert(lceye_update(v->server, eye)); + } + + break; + } + } + + return true; +} diff --git a/disasterserver_c/maps/LimpCity.h b/disasterserver_c/maps/LimpCity.h new file mode 100644 index 0000000..d59e916 --- /dev/null +++ b/disasterserver_c/maps/LimpCity.h @@ -0,0 +1,8 @@ +#ifndef LIMPCITY_H +#define LIMPCITY_H +#include "../Maps.h" + +bool lc_init(Server* server); +bool lc_tcpmsg(PeerData* v, Packet* packet); + +#endif \ No newline at end of file diff --git a/disasterserver_c/maps/MajinForest.c b/disasterserver_c/maps/MajinForest.c new file mode 100644 index 0000000..6cccb06 --- /dev/null +++ b/disasterserver_c/maps/MajinForest.c @@ -0,0 +1,9 @@ +#include +#include + +bool maj_init(Server* server) +{ + RAssert(map_time(server, 2.585 * TICKSPERSEC, 10)); //155 + RAssert(map_ring(server, 3)); + return true; +} diff --git a/disasterserver_c/maps/MajinForest.h b/disasterserver_c/maps/MajinForest.h new file mode 100644 index 0000000..3ad6690 --- /dev/null +++ b/disasterserver_c/maps/MajinForest.h @@ -0,0 +1,7 @@ +#ifndef MAJINFOREST_H +#define MAJINFOREST_H +#include "../Maps.h" + +bool maj_init(Server* server); + +#endif \ No newline at end of file diff --git a/disasterserver_c/maps/Marijuna.c b/disasterserver_c/maps/Marijuna.c new file mode 100644 index 0000000..793d311 --- /dev/null +++ b/disasterserver_c/maps/Marijuna.c @@ -0,0 +1,16 @@ +#include +#include +#include +#include + +bool mj_init(Server* server) +{ + RAssert(map_time(server, 3.42 * TICKSPERSEC, 20)); //205 + RAssert(map_ring(server, 5)); + + RAssert(game_spawn(server, (Entity*)&MakeMLava(1624, 512), sizeof(MLava), NULL)); + RAssert(game_spawn(server, (Entity*)&MakeMAss(), sizeof(MAss), NULL)); + RAssert(game_spawn(server, (Entity*)&MakeMJew(), sizeof(MJew), NULL)); + + return true; +} \ No newline at end of file diff --git a/disasterserver_c/maps/Marijuna.h b/disasterserver_c/maps/Marijuna.h new file mode 100644 index 0000000..1bbb86a --- /dev/null +++ b/disasterserver_c/maps/Marijuna.h @@ -0,0 +1,7 @@ +#ifndef MARIJUNA_H +#define MARIJUNA_H +#include "../Maps.h" + +bool mj_init(Server* server); + +#endif \ No newline at end of file diff --git a/disasterserver_c/maps/NastyParadise.c b/disasterserver_c/maps/NastyParadise.c new file mode 100644 index 0000000..a353ec2 --- /dev/null +++ b/disasterserver_c/maps/NastyParadise.c @@ -0,0 +1,72 @@ +#include +#include +#include + +bool nap_init(Server* server) +{ + Snowball* sb; + + RAssert(map_time(server, 2.585 * TICKSPERSEC, 20)); //155 + RAssert(map_ring(server, 5)); + + for (uint8_t i = 0; i < 10; i++) + { + RAssert(game_spawn(server, (Entity*)&(MakeIce(i)), sizeof(Ice), NULL)); + } + + RAssert(game_spawn(server, (Entity*)&(MakeSnowball(0, 10, 1)), sizeof(Snowball), (Entity**)&sb)); + for (int i = 0; i < 4; i++) + { + sb->p_move[5 + i] = 0.05f + 0.05f * (i / 4.0f); + sb->p_anim[5 + i] = 0.35f + 0.25f * (i / 4.0f); + } + + RAssert(game_spawn(server, (Entity*)&(MakeSnowball(1, 8, -1)), sizeof(Snowball), (Entity**)&sb)); + for (int i = 0; i < 5; i++) + { + sb->p_move[2 + i] = 0.05f + 0.05f * (i / 5.0f); + sb->p_anim[2 + i] = 0.35f + 0.25f * (i / 5.0f); + } + + RAssert(game_spawn(server, (Entity*)&(MakeSnowball(2, 11, 1)), sizeof(Snowball), (Entity**)&sb)); + for (int i = 0; i < 5; i++) + { + sb->p_move[5 + i] = 0.05f + 0.05f * (i / 5.0f); + sb->p_anim[5 + i] = 0.35f + 0.25f * (i / 5.0f); + } + + RAssert(game_spawn(server, (Entity*)&(MakeSnowball(3, 9, 1)), sizeof(Snowball), (Entity**)&sb)); + for (int i = 0; i < 2; i++) + { + sb->p_move[6 + i] = 0.05f + 0.05f * (i / 2.0f); + sb->p_anim[6 + i] = 0.35f + 0.25f * (i / 2.0f); + } + + RAssert(game_spawn(server, (Entity*)&(MakeSnowball(4, 5, -1)), sizeof(Snowball), (Entity**)&sb)); + return true; +} + +bool nap_tcpmsg(PeerData* v, Packet* packet) +{ + PacketRead(passtrough, packet, packet_read8, uint8_t); + PacketRead(type, packet, packet_read8, uint8_t); + + switch (type) + { + case CLIENT_NAPICE_ACTIVATE: + { + AssertOrDisconnect(v->server, v->in_game); + PacketRead(iid, packet, packet_read8, uint8_t); + AssertOrDisconnect(v->server, iid < 10); + + Ice* ices[10]; + if (!game_find(v->server, (Entity**)ices, "ice", 10)) + break; + + RAssert(ice_activate(v->server, ices[iid])); + break; + } + } + + return true; +} diff --git a/disasterserver_c/maps/NastyParadise.h b/disasterserver_c/maps/NastyParadise.h new file mode 100644 index 0000000..eaf94ca --- /dev/null +++ b/disasterserver_c/maps/NastyParadise.h @@ -0,0 +1,8 @@ +#ifndef NASTYPUSSY_H +#define NASTYPUSSY_H +#include "../Maps.h" + +bool nap_init(Server* server); +bool nap_tcpmsg(PeerData* v, Packet* packet); + +#endif \ No newline at end of file diff --git a/disasterserver_c/maps/NotPerfect.c b/disasterserver_c/maps/NotPerfect.c new file mode 100644 index 0000000..fa510a4 --- /dev/null +++ b/disasterserver_c/maps/NotPerfect.c @@ -0,0 +1,11 @@ +#include +#include + +bool np_init(Server* server) +{ + RAssert(map_time(server, 2.585 * TICKSPERSEC, 20)); //155 + RAssert(map_ring(server, 3)); + + RAssert(game_spawn(server, (Entity*)&(MakeNPCtrl()), sizeof(NPController), NULL)); + return true; +} \ No newline at end of file diff --git a/disasterserver_c/maps/NotPerfect.h b/disasterserver_c/maps/NotPerfect.h new file mode 100644 index 0000000..4424835 --- /dev/null +++ b/disasterserver_c/maps/NotPerfect.h @@ -0,0 +1,7 @@ +#ifndef NOTPERFECT_H +#define NOTPERFECT_H +#include "../Maps.h" + +bool np_init(Server* server); + +#endif \ No newline at end of file diff --git a/disasterserver_c/maps/PricelessFreedom.c b/disasterserver_c/maps/PricelessFreedom.c new file mode 100644 index 0000000..f2890cb --- /dev/null +++ b/disasterserver_c/maps/PricelessFreedom.c @@ -0,0 +1,48 @@ +#include +#include +#include +#include + +bool pf_init(Server* server) +{ + RAssert(map_ring(server, 5)); + RAssert(map_time(server, 2.585 * TICKSPERSEC, 10)); //155 + + for (int i = 0; i < 29; i++) + RAssert(game_spawn(server, (Entity*)&(MakeBlackRing(MAP_BRING, MAP_BRING)), sizeof(BRing), NULL)); + + RAssert(game_spawn(server, (Entity*)&(MakePFLift(0, 1669, 1016)), sizeof(PFLift), NULL)); + RAssert(game_spawn(server, (Entity*)&(MakePFLift(1, 1069, 704)), sizeof(PFLift), NULL)); + RAssert(game_spawn(server, (Entity*)&(MakePFLift(2, 829, 400)), sizeof(PFLift), NULL)); + RAssert(game_spawn(server, (Entity*)&(MakePFLift(3, 1070, 544)), sizeof(PFLift), NULL)); + return true; +} + +bool pf_tcpmsg(PeerData* v, Packet* packet) +{ + PacketRead(passtrough, packet, packet_read8, uint8_t); + PacketRead(type, packet, packet_read8, uint8_t); + + switch (type) + { + case CLIENT_PFLIT_ACTIVATE: + { + AssertOrDisconnect(v->server, v->in_game); + PacketRead(lid, packet, packet_read8, uint8_t); + + PFLift* ents[4]; + int found = game_find(v->server, (Entity**)ents, "pflift", 4); + for (int i = 0; i < found; i++) + { + if (ents[i]->lid == lid) + { + pflift_activate(v->server, ents[i], v->id); + break; + } + } + break; + } + } + + return true; +} diff --git a/disasterserver_c/maps/PricelessFreedom.h b/disasterserver_c/maps/PricelessFreedom.h new file mode 100644 index 0000000..0ea4b7b --- /dev/null +++ b/disasterserver_c/maps/PricelessFreedom.h @@ -0,0 +1,8 @@ +#ifndef PRICELESSFREEDOM_H +#define PRICELESSFREEDOM_H +#include "../Maps.h" + +bool pf_init(Server* server); +bool pf_tcpmsg(PeerData* v, Packet* packet); + +#endif \ No newline at end of file diff --git a/disasterserver_c/maps/RavineMist.c b/disasterserver_c/maps/RavineMist.c new file mode 100644 index 0000000..d227cdd --- /dev/null +++ b/disasterserver_c/maps/RavineMist.c @@ -0,0 +1,213 @@ +#include +#include +#include +#include +#include + +void shuffle(Shard* array, size_t n) +{ + if (n > 1) + { + for (size_t i = 0; i < n - 1; i++) + { + size_t j = i + rand() / (RAND_MAX / (n - i) + 1); + Shard t = array[j]; + array[j] = array[i]; + array[i] = t; + } + } +} + +bool rmz_checkstate(Server* server) +{ + uint8_t total = 7 - game_find(server, NULL, "shard", 7); + + Packet pack; + PacketCreate(&pack, SERVER_RMZSHARD_STATE); + PacketWrite(&pack, packet_write8, 3); + PacketWrite(&pack, packet_write8, total); + server_broadcast(server, &pack, true); + + if (server->game.time_sec <= TICKSPERSEC - 10) + { + uint8_t total = 7 - game_find(server, NULL, "shard", 7); + game_bigring(server, total >= 6 ? BS_ACTIVATED : BS_DEACTIVATED); + } + + return true; +} + +bool rmz_spawnshards(Server* server, Player* player) +{ + for (uintptr_t i = 0; i < player->data[0]; i++) + { + Debug("shard spawned at %f %f", player->pos.x, player->pos.y); + RAssert(game_spawn(server, (Entity*)&(MakeShard((player->pos.x + (-8 + rand() % 17)), player->pos.y, 1)), sizeof(Shard), NULL)); + } + + player->data[0] = 0; + return true; +} + +bool rmz_init(Server* server) +{ + RAssert(map_time(server, 3 * TICKSPERSEC, 20)); + RAssert(map_ring(server, 5)); + + // slugs + RAssert(game_spawn(server, (Entity*)&(MakeSlugSpawn(1901, 392)), sizeof(SlugSpawner), NULL)); + RAssert(game_spawn(server, (Entity*)&(MakeSlugSpawn(2193, 392)), sizeof(SlugSpawner), NULL)); + RAssert(game_spawn(server, (Entity*)&(MakeSlugSpawn(2468, 392)), sizeof(SlugSpawner), NULL)); + RAssert(game_spawn(server, (Entity*)&(MakeSlugSpawn(1188, 860)), sizeof(SlugSpawner), NULL)); + RAssert(game_spawn(server, (Entity*)&(MakeSlugSpawn(2577, 1952)), sizeof(SlugSpawner), NULL)); + RAssert(game_spawn(server, (Entity*)&(MakeSlugSpawn(2564, 2264)), sizeof(SlugSpawner), NULL)); + RAssert(game_spawn(server, (Entity*)&(MakeSlugSpawn(2782, 2264)), sizeof(SlugSpawner), NULL)); + RAssert(game_spawn(server, (Entity*)&(MakeSlugSpawn(1441, 2264)), sizeof(SlugSpawner), NULL)); + RAssert(game_spawn(server, (Entity*)&(MakeSlugSpawn(884, 2264)), sizeof(SlugSpawner), NULL)); + RAssert(game_spawn(server, (Entity*)&(MakeSlugSpawn(988, 2004)), sizeof(SlugSpawner), NULL)); + RAssert(game_spawn(server, (Entity*)&(MakeSlugSpawn(915, 2004)), sizeof(SlugSpawner), NULL)); + + // shards + Shard shards[12] = + { + MakeShard(862, 248, 0), + MakeShard(3078, 248, 0), + MakeShard(292, 558, 0), + MakeShard(2918, 558, 0), + MakeShard(1100, 820, 0), + MakeShard(980, 1188, 0), + MakeShard(1870, 1252, 0), + MakeShard(2180, 1508, 0), + MakeShard(2920, 2216, 0), + MakeShard(282, 2228, 0), + MakeShard(1318, 1916, 0), + MakeShard(3010, 1766, 0), + }; + shuffle(shards, 12); + + for (int i = 0; i < 7; i++) + RAssert(game_spawn(server, (Entity*)&shards[i], sizeof(Shard), NULL)); + + return true; +} + +bool rmz_tick(Server* server) +{ + if (server->game.time >= TICKSPERSEC) + { + if (server->game.time_sec <= TICKSPERSEC && server->game.bring_state < BS_DEACTIVATED) + game_bigring(server, BS_DEACTIVATED); + + if (server->game.time_sec <= TICKSPERSEC - 10 && server->game.bring_state < BS_ACTIVATED) + { + if((7 - game_find(server, NULL, "shard", 7) >= 6)) + game_bigring(server, BS_ACTIVATED); + } + } + + return true; +} + +bool rmz_tcpmsg(PeerData* v, Packet* packet) +{ + PacketRead(passtrough, packet, packet_read8, uint8_t); + PacketRead(type, packet, packet_read8, uint8_t); + + switch (type) + { + case CLIENT_RMZSLIME_HIT: + { + AssertOrDisconnect(v->server, v->in_game); + if (v->server->game.end > 0) + break; + + PacketRead(eid, packet, packet_read16, uint16_t); + PacketRead(proj, packet, packet_read8, uint8_t); + + Slug* ent; + if (!game_despawn(v->server, (Entity**)&ent, eid)) + break; + + if (proj) + { + free(ent); + break; + } + + if (ent->ring != SLUG_NORING) + { + if (ent->ring == SLUG_RING) + { + time_start(&v->plr.last_rings); + v->plr.rings++; + v->plr.stats.rings++; + } + + Packet pack; + PacketCreate(&pack, SERVER_RMZSLIME_RINGBONUS); + PacketWrite(&pack, packet_write8, (ent->ring - 1)); + PacketWrite(&pack, packet_write8, v->plr.rings > 0); + RAssert(packet_send(v->peer, &pack, true)); + } + + free(ent); + break; + } + + case CLIENT_RMZSHARD_COLLECT: + { + AssertOrDisconnect(v->server, v->in_game); + if (v->server->game.end > 0) + break; + + PacketRead(eid, packet, packet_read16, uint16_t); + + Shard* ent; + if (!game_despawn(v->server, (Entity**)&ent, eid)) + break; + + // incr shard count + v->plr.data[0]++; + + Packet pack; + PacketCreate(&pack, SERVER_RMZSHARD_STATE); + PacketWrite(&pack, packet_write8, 2); + PacketWrite(&pack, packet_write16, ent->id); + PacketWrite(&pack, packet_write16, v->id); + server_broadcast(v->server, &pack, true); + free(ent); + + RAssert(rmz_checkstate(v->server)); + break; + } + + case CLIENT_PLAYER_DEATH_STATE: + { + if (v->server->game.end > 0) + break; + + AssertOrDisconnect(v->server, v->id != v->server->game.exe); + AssertOrDisconnect(v->server, v->in_game); + + PacketRead(dead, packet, packet_read8, uint8_t); + PacketRead(rtimes, packet, packet_read8, uint8_t); + + if (dead) + RAssert(rmz_spawnshards(v->server, &v->plr)); + + RAssert(rmz_checkstate(v->server)); + break; + } + } + return true; +} + +bool rmz_left(PeerData* v) +{ + if(!v->server->game.started) + return true; + + RAssert(rmz_spawnshards(v->server, &v->plr)); + RAssert(rmz_checkstate(v->server)); + return true; +} diff --git a/disasterserver_c/maps/RavineMist.h b/disasterserver_c/maps/RavineMist.h new file mode 100644 index 0000000..c6ac375 --- /dev/null +++ b/disasterserver_c/maps/RavineMist.h @@ -0,0 +1,10 @@ +#ifndef RAVINEMIST_H +#define RAVINEMIST_H +#include "../Maps.h" + +bool rmz_init(Server* server); +bool rmz_tick(Server* server); +bool rmz_tcpmsg(PeerData* v, Packet* packet); +bool rmz_left(PeerData* v); + +#endif \ No newline at end of file diff --git a/disasterserver_c/maps/TortureCave.c b/disasterserver_c/maps/TortureCave.c new file mode 100644 index 0000000..5557865 --- /dev/null +++ b/disasterserver_c/maps/TortureCave.c @@ -0,0 +1,11 @@ +#include +#include + +bool tc_init(Server* server) +{ + RAssert(map_time(server, 2.585 * TICKSPERSEC, 20)); //155 + RAssert(map_ring(server, 5)); + + RAssert(game_spawn(server, (Entity*)&(MakeAcid()), sizeof(Acid), NULL)); + return true; +} diff --git a/disasterserver_c/maps/TortureCave.h b/disasterserver_c/maps/TortureCave.h new file mode 100644 index 0000000..7bf1ed5 --- /dev/null +++ b/disasterserver_c/maps/TortureCave.h @@ -0,0 +1,7 @@ +#ifndef TORTURECAVE_H +#define TORTURECAVE_H +#include "../Maps.h" + +bool tc_init(Server* server); + +#endif \ No newline at end of file diff --git a/disasterserver_c/maps/VolcanoValley.c b/disasterserver_c/maps/VolcanoValley.c new file mode 100644 index 0000000..490b484 --- /dev/null +++ b/disasterserver_c/maps/VolcanoValley.c @@ -0,0 +1,61 @@ +#include +#include +#include +#include + +bool vv_init(Server* server) +{ + RAssert(map_time(server, 3 * TICKSPERSEC, 20)); //180 + RAssert(map_ring(server, 5)); + + for (uint8_t i = 0; i < 14; i++) + RAssert(game_spawn(server, (Entity*)&(MakeVase(i)), sizeof(Vase), NULL)); + + RAssert(game_spawn(server, (Entity*)&(MakeLava(0, 736, 130)), sizeof(Lava), NULL)); + RAssert(game_spawn(server, (Entity*)&(MakeLava(1, 1388, 130)), sizeof(Lava), NULL)); + RAssert(game_spawn(server, (Entity*)&(MakeLava(2, 1524, 130)), sizeof(Lava), NULL)); + RAssert(game_spawn(server, (Entity*)&(MakeLava(3, 1084, 130)), sizeof(Lava), NULL)); + + return true; +} + +bool vv_tcpmsg(PeerData* v, Packet* packet) +{ + PacketRead(passtrough, packet, packet_read8, uint8_t); + PacketRead(type, packet, packet_read8, uint8_t); + + switch (type) + { + case CLIENT_VVVASE_BREAK: + { + AssertOrDisconnect(v->server, v->in_game); + PacketRead(vid, packet, packet_read8, uint8_t); + + Vase* ents[14]; + int found = game_find(v->server, (Entity**)ents, "vase", 14); + for (int i = 0; i < found; i++) + { + if (ents[i]->vid == vid) + { + v->plr.rings += (ents[i]->type + 1); + v->plr.stats.rings += (ents[i]->type + 1); + time_start(&v->plr.last_rings); + + Packet pack; + PacketCreate(&pack, SERVER_VVVASE_STATE); + PacketWrite(&pack, packet_write8, ents[i]->vid); + PacketWrite(&pack, packet_write8, ents[i]->type); + PacketWrite(&pack, packet_write16, v->id); + PacketWrite(&pack, packet_write8, v->plr.rings > 0); + server_broadcast(v->server, &pack, true); + + RAssert(game_despawn(v->server, NULL, ents[i]->id)); + break; + } + } + break; + } + } + + return true; +} diff --git a/disasterserver_c/maps/VolcanoValley.h b/disasterserver_c/maps/VolcanoValley.h new file mode 100644 index 0000000..def7e65 --- /dev/null +++ b/disasterserver_c/maps/VolcanoValley.h @@ -0,0 +1,8 @@ +#ifndef VOLCANOVALLEY_H +#define VOLCANOVALLEY_H +#include "../Maps.h" + +bool vv_init(Server* server); +bool vv_tcpmsg(PeerData* v, Packet* packet); + +#endif \ No newline at end of file diff --git a/disasterserver_c/maps/WoodDream.c b/disasterserver_c/maps/WoodDream.c new file mode 100644 index 0000000..0e93081 --- /dev/null +++ b/disasterserver_c/maps/WoodDream.c @@ -0,0 +1,10 @@ +#include +#include + +bool wd_init(Server* server) +{ + RAssert(map_time(server, 2.585 * TICKSPERSEC, 20)); //155 + RAssert(map_ring(server, 5)); + RAssert(game_spawn(server, (Entity*)&(MakeLatern()), sizeof(Latern), NULL)); + return true; +} diff --git a/disasterserver_c/maps/WoodDream.h b/disasterserver_c/maps/WoodDream.h new file mode 100644 index 0000000..a325393 --- /dev/null +++ b/disasterserver_c/maps/WoodDream.h @@ -0,0 +1,7 @@ +#ifndef WOODDREAM_H +#define WOODDREAM_H +#include "../Maps.h" + +bool wd_init(Server* server); + +#endif \ No newline at end of file diff --git a/disasterserver_c/maps/YouCantRun.c b/disasterserver_c/maps/YouCantRun.c new file mode 100644 index 0000000..61f6edf --- /dev/null +++ b/disasterserver_c/maps/YouCantRun.c @@ -0,0 +1,14 @@ +#include +#include +#include + +bool ycr_init(Server* server) +{ + RAssert(map_time(server, 3 * TICKSPERSEC, 20)); //180 + RAssert(map_ring(server, 5)); + + RAssert(game_spawn(server, (Entity*)&(MakeSpike()), sizeof(SpikeController), NULL)); + RAssert(game_spawn(server, (Entity*)&(MakeYCRCtrl()), sizeof(YCRController), NULL)); + + return true; +} \ No newline at end of file diff --git a/disasterserver_c/maps/YouCantRun.h b/disasterserver_c/maps/YouCantRun.h new file mode 100644 index 0000000..ed49532 --- /dev/null +++ b/disasterserver_c/maps/YouCantRun.h @@ -0,0 +1,7 @@ +#ifndef YOUCANTRUN_H +#define YOUCANTRUN_H +#include "../Maps.h" + +bool ycr_init(Server* server); + +#endif \ No newline at end of file diff --git a/disasterserver_c/states/CharSelect.c b/disasterserver_c/states/CharSelect.c new file mode 100644 index 0000000..09ef7e8 --- /dev/null +++ b/disasterserver_c/states/CharSelect.c @@ -0,0 +1,296 @@ +#include +#include +#include +#include + +bool charselect_check_state(Server *server) +{ + RAssert(server); + + bool should = true; + for (size_t i = 0; i < server->peers.capacity; i++) + { + PeerData *peer = (PeerData *)server->peers.ptr[i]; + if (!peer) + continue; + + if (!peer->in_game) + continue; + + if (peer->exe_char == CH_NONE && peer->surv_char == EX_NONE) + should = false; + } + + if (should) + return game_init(server->lobby.exe, server->lobby.map, server); + + return true; +} + +bool charselect_choose_exe(Server *server, uint16_t *id) +{ + RAssert(server); + + uint32_t weight = 0; + + for (size_t i = 0; i < server->peers.capacity; i++) + { + PeerData *peer = (PeerData *)server->peers.ptr[i]; + if (!peer) + continue; + + if (!peer->in_game) + continue; + + // Reset all characters + peer->exe_char = EX_NONE; + peer->surv_char = CH_NONE; + + weight += peer->exe_chance; + } + + if (weight == 0) + weight++; + + uint32_t rnd = rand() % weight; + for (size_t i = 0; i < server->peers.capacity; i++) + { + PeerData *peer = (PeerData *)server->peers.ptr[i]; + if (!peer) + continue; + + if (!peer->in_game) + continue; + + if (peer->exe_chance >= 100) + { + *id = peer->id; + return true; + } + + if (rnd < peer->exe_chance && !peer->mod_tool) + { + Info("%s (id %d, c %d) is exe!", peer->nickname.value, peer->id, peer->exe_chance); + + peer->exe_chance = 1 + rand() % 1; + *id = peer->id; + + return true; + } + + rnd -= peer->exe_chance; + } + + *id = -1; + return false; +} + +bool charselect_state_handle(PeerData *v, Packet *packet) +{ + // Read header + PacketRead(passtrough, packet, packet_read8, uint8_t); + PacketRead(type, packet, packet_read8, uint8_t); + + bool res = true; + Packet pack; + switch (type) + { + case CLIENT_REQUEST_EXECHARACTER: + { + if (!v->in_game) + break; + + // Sanity check + AssertOrDisconnect(v->server, v->server->lobby.exe == v->id); + PacketRead(id, packet, packet_read8, uint8_t); + + id--; // id - 1 + v->exe_char = id; + + AssertOrDisconnect(v->server, id >= 0); + AssertOrDisconnect(v->server, id <= EX_EXELLER); + + PacketCreate(&pack, SERVER_LOBBY_EXECHARACTER_RESPONSE); + PacketWrite(&pack, packet_write8, id); + RAssert(packet_send(v->peer, &pack, true)); + + PacketCreate(&pack, SERVER_LOBBY_CHARACTER_CHANGE); + PacketWrite(&pack, packet_write16, v->id); + PacketWrite(&pack, packet_write8, id); + server_broadcast(v->server, &pack, true); + + const char *exes[] = { + "Classic Exe", + "Chaos", + "Exetior", + "Exeller"}; + + Info("%s " LOG_RST "(id %d) choses [" LOG_RED "%s" LOG_RST "]!", v->nickname.value, v->id, exes[id]); + return charselect_check_state(v->server) || lobby_init(v->server); + } + + case CLIENT_REQUEST_CHARACTER: + { + if (!v->in_game) + break; + + if (v->surv_char != CH_NONE) + break; + + // Sanity check + AssertOrDisconnect(v->server, v->server->lobby.exe != v->id); + PacketRead(id, packet, packet_read8, uint8_t); + id--; // id - 1 + + AssertOrDisconnect(v->server, id >= 0); + AssertOrDisconnect(v->server, id <= CH_SALLY); + + uint8_t avail = v->server->lobby.avail[id]; + if (avail) + v->server->lobby.avail[id] = 0; + + PacketCreate(&pack, SERVER_LOBBY_CHARACTER_RESPONSE); + PacketWrite(&pack, packet_write8, id + 1); + PacketWrite(&pack, packet_write8, avail); + RAssert(packet_send(v->peer, &pack, true)); + + if (avail) + { + v->surv_char = id; + + PacketCreate(&pack, SERVER_LOBBY_CHARACTER_CHANGE); + PacketWrite(&pack, packet_write16, v->id); + PacketWrite(&pack, packet_write8, id + 1); + server_broadcast(v->server, &pack, true); + } + + const char *survs[] = { + "Tails", + "Knuckles", + "Eggman", + "Amy", + "Cream", + "Sally"}; + + Info("%s " LOG_RST "(id %d) choses [" LOG_GRN "%s" LOG_RST "]!", v->nickname.value, v->id, survs[id]); + return charselect_check_state(v->server) || lobby_init(v->server); + } + + case CLIENT_CHAT_MESSAGE: + { + PacketRead(pid, packet, packet_read16, uint16_t); + PacketRead(msg, packet, packet_readstr, String); + AssertOrDisconnect(v->server, string_length(&msg) <= 40); + + v->timeout = 0; + + Info("%s " LOG_RST "(id %d): %s", v->nickname.value, v->id, msg.value); + if (!server_cmd_handle(v->server, server_cmd_parse(&msg), v, &msg) && g_config.chatfix) + server_broadcast_msg(v->server, v->id, msg.value); + + break; + } + + default: + RAssert(server_msg_handle(v->server, type, v, packet)); + break; + } + + return res; +} + +bool charselect_state_tick(Server *server) +{ + if (server->lobby.countdown <= 0) + { + server->lobby.countdown += TICKSPERSEC; + + if (--server->lobby.countdown_sec == 0) + { + for (size_t i = 0; i < server->peers.capacity; i++) + { + PeerData *peer = (PeerData *)server->peers.ptr[i]; + if (!peer) + continue; + + if (!peer->in_game) + continue; + + if (peer->exe_char == EX_NONE && peer->surv_char == CH_NONE) + server_disconnect(server, peer->peer, DR_AFKTIMEOUT, NULL); + } + } + + Packet pack; + PacketCreate(&pack, SERVER_CHAR_TIME_SYNC); + PacketWrite(&pack, packet_write8, server->lobby.countdown_sec); + server_broadcast(server, &pack, true); + } + + server->lobby.countdown -= server->delta; + return true; +} + +bool charselect_init(int8_t map, Server *server) +{ + Debug("Attepting to enter ST_CHARSELECT..."); + RAssert(server); + RAssert(charselect_choose_exe(server, &server->lobby.exe)); + + if (server->lobby.exe == -1) + { + Err("Failed to pick exe for some reason!"); + return lobby_init(server); + } + + server->state = ST_CHARSELECT; + server->lobby.countdown_sec = 30; + server->lobby.countdown = TICKSPERSEC; + memset(server->lobby.avail, 1, sizeof(uint8_t) * (CH_SALLY + 1)); + + Packet pack; + PacketCreate(&pack, SERVER_LOBBY_EXE); + PacketWrite(&pack, packet_write16, server->lobby.exe); + PacketWrite(&pack, packet_write16, map); + server_broadcast(server, &pack, true); + + PacketCreate(&pack, SERVER_CHAR_TIME_SYNC); + PacketWrite(&pack, packet_write8, server->lobby.countdown_sec); + server_broadcast(server, &pack, true); + + Info(LOG_YLW "Server is now in " LOG_PUR "Character Select"); + server->lobby.map = map; + + for (size_t i = 0; i < server->peers.capacity; i++) + { + PeerData *data = (PeerData *)server->peers.ptr[i]; + + if (!data) + continue; + + if (data->in_game) + continue; + + char msg[256]; + snprintf(msg, 100, "map: %s" CLRCODE_RST, g_mapList[map].name); + server_send_msg(server, data->peer, msg); + } + + return true; +} + +bool charselect_state_join(PeerData *v) +{ + return true; +} + +bool charselect_state_left(PeerData *v) +{ + if (v->surv_char != CH_NONE) + v->server->lobby.avail[v->surv_char] = true; + + if (server_ingame(v->server) <= 1 || v->id == v->server->lobby.exe) + return lobby_init(v->server); + + return charselect_check_state(v->server) || lobby_init(v->server); +} diff --git a/disasterserver_c/states/Game.c b/disasterserver_c/states/Game.c new file mode 100644 index 0000000..a624bf1 --- /dev/null +++ b/disasterserver_c/states/Game.c @@ -0,0 +1,1809 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +bool game_end(Server* server, Ending ending, bool achiv) +{ + if (server->game.end > 0) + return true; + + Packet packet; + switch (ending) + { + case ED_EXEWIN: + { + PacketCreate(&packet, SERVER_GAME_EXE_WINS); + PacketWrite(&packet, packet_write8, achiv); + Info("Ending is ED_EXEWIN"); + break; + } + + case ED_SURVWIN: + { + PacketCreate(&packet, SERVER_GAME_SURVIVOR_WIN); + PacketWrite(&packet, packet_write8, achiv); + Info("Ending is ED_SURVWIN"); + break; + } + + case ED_TIMEOVER: + { + PacketCreate(&packet, SERVER_GAME_TIME_OVER); + PacketWrite(&packet, packet_write8, achiv); + Info("Ending is ED_TIMEOVER"); + break; + } + } + + server_broadcast(server, &packet, true); + server->game.end = 5 * TICKSPERSEC; + server->game.ending = ending; + return true; +} + +bool game_state_check(Server* server) +{ + if (server->game.end > 0) + return true; + + uint8_t escaped = 0; + uint8_t dead = 0; + uint8_t exes = 0; + + int total = 0; + { + for (size_t i = 0; i < server->peers.capacity; i++) + { + PeerData* v = (PeerData*)server->peers.ptr[i]; + if (!v) + continue; + + if(!v->in_game) + continue; + + if (v->plr.flags & PLAYER_ESCAPED) + escaped++; + + if (v->plr.flags & PLAYER_DEAD || v->plr.flags & PLAYER_DEMONIZED) + dead++; + + if (v->id == server->game.exe) + exes++; + } + + total = server_ingame(server); + total -= (exes + dead + escaped); + } + + if (total <= 0) + { + if (escaped > 0) + { + RAssert(game_end(server, ED_SURVWIN, true)); + } + else + { + RAssert(game_end(server, ED_EXEWIN, true)); + } + } + + return true; +} + +bool game_init(int exe, int8_t map, Server* server) +{ + Debug("Attepting to enter ST_GAME..."); + //RAssert(server_ingame(server) > 1); + + server->state = ST_GAME; + server->game = (Game) + { + .map = map, + .exe = exe, + .bring_state = BS_NONE, + .bring_loc = (uint8_t)rand(), + .sudden_death = false, + .started = false, + .end = 0.0, + .entid = 0, + .time = TICKSPERSEC, + .elapsed = 0.0, + .start_timeout = 15.0 * TICKSPERSEC + }; + + // Setup cooldowns + time_start(&server->game.tails_last_proj); + memset(server->game.rings, 0, sizeof(server->game.rings)); + memset(server->game.cooldowns, 0, sizeof(server->game.cooldowns)); + + if (!dylist_create(&server->game.entities, 3000)) + return false; + Debug("Entity list created."); + + if (!dylist_create(&server->game.left, 7)) + return false; + Debug("Left players list created."); + + for (size_t i = 0; i < server->peers.capacity; i++) + { + PeerData* v = (PeerData*)server->peers.ptr[i]; + if (!v) + continue; + + if (!v->in_game) + continue; + + memset(&v->plr, 0, sizeof(Player)); + + if (v->id == server->game.exe) + SET_FLAG(v->plr.flags, PLAYER_KILLER); + + v->plr.ready = false; + v->plr.mod_tool = v->mod_tool; + + for (int i = 0; i < 5; i++) + v->plr.revival_init[i] = -1; + } + + Packet pack; + PacketCreate(&pack, SERVER_LOBBY_GAME_START); + server_broadcast(server, &pack, true); + + for (size_t i = 0; i < server->peers.capacity; i++) + { + PeerData* v = (PeerData*)server->peers.ptr[i]; + if (!v) + continue; + + if (v->in_game) + continue; + + for (size_t j = 0; j < server->peers.capacity; j++) + { + PeerData* er = (PeerData*)server->peers.ptr[j]; + if (!er) + continue; + + if (er->id == v->id) + continue; + + PacketCreate(&pack, SERVER_WAITING_PLAYER_INFO); + PacketWrite(&pack, packet_write8, er->in_game); + PacketWrite(&pack, packet_write16, er->id); + PacketWrite(&pack, packet_writestr, er->nickname); + + if (er->in_game) + { + PacketWrite(&pack, packet_write8, server->game.exe == er->id); + PacketWrite(&pack, packet_write8, server->game.exe == er->id ? er->exe_char : er->surv_char); + } + else + { + PacketWrite(&pack, packet_write8, er->lobby_icon); + } + + RAssert(packet_send(v->peer, &pack, true)); + } + } + + Info(LOG_YLW "Server is now in " LOG_PUR "Game"); + return true; +} + +bool game_uninit(Server* server, bool show_results) +{ + if (show_results) + return results_init(server); + else + { + for (size_t i = 0; i < server->game.entities.capacity; i++) + { + Entity* entity = (Entity*)server->game.entities.ptr[i]; + if (!entity) + continue; + + free(entity); + } + dylist_free(&server->game.entities); + + // Clean up after game + for (size_t i = 0; i < server->game.left.capacity; i++) + { + PeerData* data = (PeerData*)server->game.left.ptr[i]; + if (!data) + continue; + + free(data); + } + dylist_free(&server->game.left); + + return lobby_init(server); + } +} + +bool game_spawn(Server* server, Entity* entity, size_t len, Entity** out) +{ + entity->id = ++server->game.entid; + Debug("Allocated entity \"%s\" (id %d, size %d)", entity->tag, entity->id, len); + + Entity* ent = (Entity*)malloc(len); + if(!ent) + return false; + + memcpy(ent, entity, len); + if (ent->init && !ent->init(server, ent)) + { + free(ent); + return false; + } + + dylist_push(&server->game.entities, ent); + if (out) + *out = ent; + return true; +} + +bool game_despawn(Server* server, Entity** out, uint16_t id) +{ + bool res = true; + Entity* tar = NULL; + + for (size_t i = 0; i < server->game.entities.capacity; i++) + { + Entity* entity = (Entity*)server->game.entities.ptr[i]; + if (!entity) + continue; + + if (entity->id == id) + { + if (entity->uninit && !entity->uninit(server, entity)) + Warn("uninit failed for entity %d", entity->id); + + Debug("Deallocated entity \"%s\" (id %d)", entity->tag, entity->id); + tar = entity; + break; + } + } + + res = dylist_remove(&server->game.entities, tar); + if (res && !out) + free(tar); + else if (out) + *out = tar; + else + Warn("Failed to find entity %d", id); + + return res; +} + +int game_find(Server* server, Entity** out, char* tag, size_t count) +{ + int i = 0; + + for (size_t it = 0; it < server->game.entities.capacity; it++) + { + Entity* entity = (Entity*)server->game.entities.ptr[it]; + if (!entity) + continue; + + Debug("Search %s (id %d) vs %s", entity->tag, entity->id, tag); + if (strcmp(entity->tag, tag) == 0) + { + if (!out) + i++; + else + out[i++] = entity; + + if ((size_t)i >= count) + break; + } + } + + Debug("Search for \"%s\" found %d entities", tag, i); + return i; +} + +bool game_bigring(Server* server, BigRingState state) +{ + RAssert(server); + + if (server->game.bring_state == state) + return true; + + Packet packet; + switch (state) + { + case BS_NONE: + break; + + case BS_DEACTIVATED: + { + Info("Big ring is deactivated!"); + + PacketCreate(&packet, SERVER_GAME_SPAWN_RING); + PacketWrite(&packet, packet_write8, 0); + PacketWrite(&packet, packet_write8, server->game.bring_loc); + server_broadcast(server, &packet, true); + break; + } + + case BS_ACTIVATED: + { + Info("Big ring is activated!"); + + PacketCreate(&packet, SERVER_GAME_SPAWN_RING); + PacketWrite(&packet, packet_write8, 1); + PacketWrite(&packet, packet_write8, server->game.bring_loc); + server_broadcast(server, &packet, true); + break; + } + } + + server->game.bring_state = state; + return true; +} + +bool game_checkstart(Server* server) +{ + if (server->game.started) + return true; + + uint8_t cnt = 0; + for (size_t i = 0; i < server->peers.capacity; i++) + { + PeerData* v = (PeerData*)server->peers.ptr[i]; + if (!v) + continue; + + if(!v->in_game) + continue; + + if (v->plr.ready) + cnt++; + } + + if (cnt >= server_ingame(server)) + { + Packet pack; + PacketCreate(&pack, SERVER_GAME_PLAYERS_READY); + server_broadcast(server, &pack, true); + + srand((unsigned int)time(NULL)); + RAssert(g_mapList[server->game.map].cb.init(server)); + Info(LOG_YLW "Game started! " LOG_RST "(Time %ds)", server->game.time_sec); + + server->game.started = true; + } + + return true; +} + +bool game_demonize(Server* server, PeerData* data) +{ + Packet pack; + PacketCreate(&pack, SERVER_GAME_DEATHTIMER_END); + + int players = 0; + int demonized = 0; + + for (size_t i = 0; i < server->peers.capacity; i++) + { + PeerData* v = (PeerData*)server->peers.ptr[i]; + if (!v) + continue; + + if(!v->in_game) + continue; + + if (v->id == server->game.exe) + continue; + + if (v->plr.flags & PLAYER_DEMONIZED) + demonized++; + + players++; + } + + if (players / 2 > demonized) + { + DEL_FLAG(data->plr.flags, PLAYER_DEAD); + SET_FLAG(data->plr.flags, PLAYER_DEMONIZED); + + data->plr.stats.rings = 0; + + // reset cooldown + switch (data->surv_char) + { + case CH_TAILS: + { + server->game.cooldowns[TAILS_RECHARGE] = 0; + server->game.cooldowns[ETAILS_RECHARGE] = 0; + break; + } + + case CH_EGGMAN: + { + server->game.cooldowns[EGGTRACK_RECHARGE] = 0; + break; + } + + case CH_CREAM: + { + server->game.cooldowns[CREAM_RING_SPAWN] = 0; + break; + } + } + + Info("%s " LOG_RST "(id %d)" LOG_RED " was demonized!", data->nickname.value, data->id); + PacketWrite(&pack, packet_write8, 1); + } + else + { + SET_FLAG(data->plr.flags, PLAYER_CANTREVIVE); + + Info("%s " LOG_RST "(id %d)" LOG_RED " died!", data->nickname.value, data->id); + PacketWrite(&pack, packet_write8, 0); + } + + RAssert(packet_send(data->peer, &pack, true)); + return true; +} + +bool game_state_join(PeerData* v) +{ + (void)v; // dont fucking remember why this exists ~~ + return true; +} + +bool game_state_left(PeerData* v) +{ + if (v->server->game.end > 0) + return true; + + if (!v->in_game) + return true; + + RAssert(g_mapList[v->server->game.map].cb.left(v)); + + if(server_ingame(v->server) <= 1) + return game_uninit(v->server, false); + + if (!v->server->game.started) + { + if (v->id == v->server->game.exe) + return game_uninit(v->server, false); + + return game_checkstart(v->server); + } + + PeerData* data = (PeerData*)malloc(sizeof(PeerData)); + RAssert(data); + memcpy(data, v, sizeof(PeerData)); + + // Add player to the list + SET_FLAG(data->plr.flags, PLAYER_LEFT); + dylist_push(&v->server->game.left, data); + + if (v->id == v->server->game.exe) + return game_end(v->server, ED_SURVWIN, v->server->game.elapsed >= TICKSPERSEC * TICKSPERSEC); + + RAssert(game_state_check(v->server)); + return true; +} + +bool game_state_handletcp(PeerData* v, Packet* packet) +{ + // Read header + PacketRead(passtrough, packet, packet_read8, uint8_t); + PacketRead(type, packet, packet_read8, uint8_t); + + switch (type) + { + default: + RAssert(server_msg_handle(v->server, type, v, packet)); + break; + + case CLIENT_PLAYER_POTATER: + case CLIENT_SOUND_EMIT: + case CLIENT_SPAWN_EFFECT: + case CLIENT_PET_PALETTE: + case CLIENT_SPRING_USE: + case CLIENT_MERCOIN_BONUS: + case CLIENT_RING_BROKE: + { + AssertOrDisconnect(v->server, v->in_game); + server_broadcast_ex(v->server, packet, true, v->id); + break; + } + + case CLIENT_PLAYER_PALETTE: + { + AssertOrDisconnect(v->server, v->in_game); + AssertOrDisconnect(v->server, !g_config.anticheat || palette_player_validate(v, packet)); + server_broadcast_ex(v->server, packet, true, v->id); + break; + } + + case CLIENT_PLAYER_HEAL_PART: + { + AssertOrDisconnect(v->server, v->in_game); + PacketRead(x, packet, packet_read16, uint16_t); + PacketRead(y, packet, packet_read16, uint16_t); + PacketRead(rings, packet, packet_read16, uint16_t); + v->plr.heal_rings = v->plr.rings; + + if (rings < 10) + { + server_disconnect(v->server, v->peer, DR_OTHER, "pusy"); + return true; + } + + if (rings >= 140 && v->server->game.map != 20) + { + server_disconnect(v->server, v->peer, DR_OTHER, "dicus"); + return true; + } + + server_broadcast_ex(v->server, packet, true, v->id); + break; + } + + case CLIENT_PLAYER_HEAL: + { + AssertOrDisconnect(v->server, v->in_game); + PacketRead(id, packet, packet_read16, uint16_t); + PacketRead(rings, packet, packet_read16, uint16_t); + + if (rings < 10) + { + server_disconnect(v->server, v->peer, DR_OTHER, "pusy"); + return true; + } + + if (rings >= 140 && v->server->game.map != 20) + { + server_disconnect(v->server, v->peer, DR_OTHER, "dicus"); + return true; + } + + if (v->plr.mod_tool) + { + Packet pack; + PacketCreate(&pack, SERVER_RING_COLLECTED); + PacketWrite(&pack, packet_write8, 0); + PacketWrite(&pack, packet_write16, 0); + PacketWrite(&pack, packet_write8, true); + PacketWrite(&pack, packet_write8, false); + RAssert(packet_send(v->peer, &pack, true)); + break; + } + + v->plr.heal_rings = 0; + v->plr.stats.hp_restored++; + + server_broadcast_ex(v->server, packet, true, v->id); + break; + } + + case CLIENT_STATS_REPORT: + { + AssertOrDisconnect(v->server, v->in_game); + PacketRead(type, packet, packet_read8, uint8_t); + + switch (type) + { + case 0: + { + v->plr.stats.hp_restored++; + break; + } + + case 1: + { + PacketRead(recv, packet, packet_read16, uint16_t); + PacketRead(dmgr, packet, packet_read16, uint16_t); + PacketRead(sec, packet, packet_read8, uint8_t); + + PeerData* rec = server_find_peer(v->server, recv); + PeerData* damager = server_find_peer(v->server, dmgr); + if (!rec || !damager) + break; + + rec->plr.stats.stun_time += sec; + damager->plr.stats.stuns++; + break; + } + + case 2: + { + PacketRead(id, packet, packet_read16, uint16_t); + PacketRead(dmg, packet, packet_read16, uint16_t); + PacketRead(hp, packet, packet_read16, uint16_t); + + PeerData* data = server_find_peer(v->server, id); + if (!data) + break; + + if (hp <= 0) + data->plr.stats.kills++; + + data->plr.stats.damage += dmg / 20; + break; + } + + case 3: + { + PacketRead(dmg, packet, packet_read8, uint8_t); + v->plr.stats.damage_taken += dmg / 20; + break; + } + } + break; + } + + case CLIENT_PLAYER_HURT: + { + AssertOrDisconnect(v->server, v->in_game); + server_broadcast_ex(v->server, packet, true, v->id); + break; + } + + case CLIENT_TPROJECTILE_STARTCHARGE: + { + AssertOrDisconnect(v->server, v->in_game); + time_start(&v->server->game.tails_last_proj); + break; + } + + case CLIENT_TPROJECTILE: + { + AssertOrDisconnect(v->server, v->in_game); + AssertOrDisconnect(v->server, v->id != v->server->game.exe); + AssertOrDisconnect(v->server, v->surv_char == CH_TAILS); + AssertOrDisconnect(v->server, game_find(v->server, NULL, "tproj", 10) <= 2); + + int cooldown_id = v->plr.flags & PLAYER_DEMONIZED ? ETAILS_RECHARGE : TAILS_RECHARGE; + if(v->server->game.cooldowns[cooldown_id] > 0) + { + char msg[256]; + snprintf(msg, 256, "is_exe: %d, cool_id: %s, remaining_cooldown: %f", v->plr.flags & PLAYER_DEMONIZED, cooldown_id == TAILS_RECHARGE ? "TAILS_RECHARGE" : "ETAILS_RECHARGE", v->server->game.cooldowns[cooldown_id]); + RAssert(server_disconnect(v->server, v->peer, DR_OTHER, msg)); + return false; + } + + PacketRead(x, packet, packet_read16, uint16_t); + PacketRead(y, packet, packet_read16, uint16_t); + PacketRead(dir, packet, packet_read8, int8_t); + PacketRead(dmg, packet, packet_read8, uint8_t); + PacketRead(exe, packet, packet_read8, uint8_t); + PacketRead(chg, packet, packet_read8, uint8_t); + AssertOrDisconnect(v->server, dir >= -1 && dir <= 1); + + if (v->mod_tool) + { + if (dir > 0) + dir = -1; + else if (dir < 0) + dir = 1; + } + + bool check_balls = true; + if (v->plr.flags & PLAYER_DEMONIZED) + { + AssertOrDisconnect(v->server, dmg <= 60); + + if (dmg >= 60) + { + double last = time_end(&v->server->game.tails_last_proj); + check_balls = last > 1500 && last < 12000; + AssertOrDisconnect(v->server, check_balls); + } + } + else + { + AssertOrDisconnect(v->server, dmg <= 6); + + if (dmg >= 6) + { + double last = time_end(&v->server->game.tails_last_proj); + check_balls = last > 1500 && last < 12000; + AssertOrDisconnect(v->server, check_balls); + } + } + + if (!check_balls) + break; + + RAssert(game_spawn(v->server, (Entity*)&(MakeTailsProj(x, y, v->id, dir, v->plr.flags & PLAYER_DEMONIZED, chg, dmg)), sizeof(TProjectile), NULL)); + v->server->game.cooldowns[cooldown_id] = 10 * TICKSPERSEC; + break; + } + + case CLIENT_TPROJECTILE_HIT: + { + AssertOrDisconnect(v->server, v->in_game); + + Entity* ents; + if (game_find(v->server, &ents, "tproj", 1)) + game_despawn(v->server, NULL, ents->id); + + break; + } + + case CLIENT_RING_COLLECTED: + { + AssertOrDisconnect(v->server, v->in_game); + PacketRead(id, packet, packet_read8, uint8_t); + PacketRead(eid, packet, packet_read16, uint16_t); + + Ring* ent = NULL; + bool res = game_despawn(v->server, (Entity**)&ent, eid); + if (res) + { + PeerData* data = server_find_peer(v->server, v->id); + RAssert(data); + + if (!ent->red) + { + time_start(&data->plr.last_rings); + data->plr.rings++; + data->plr.stats.rings++; + } + + Packet pack; + PacketCreate(&pack, SERVER_RING_COLLECTED); + PacketWrite(&pack, packet_write8, id); + PacketWrite(&pack, packet_write16, eid); + PacketWrite(&pack, packet_write8, ent->red); + PacketWrite(&pack, packet_write8, data->plr.rings > 0); + + free(ent); + RAssert(packet_send(v->peer, &pack, true)); + } + break; + } + + case CLIENT_CREAM_SPAWN_RINGS: + { + AssertOrDisconnect(v->server, v->in_game); + AssertOrDisconnect(v->server, v->id != v->server->game.exe); + AssertOrDisconnect(v->server, v->surv_char == CH_CREAM); + AssertOrDisconnect(v->server, v->server->game.cooldowns[CREAM_RING_SPAWN] <= 0); + + if (v->mod_tool) + { + Packet pack; + PacketCreate(&pack, SERVER_RING_COLLECTED); + PacketWrite(&pack, packet_write8, 0); + PacketWrite(&pack, packet_write16, 0); + PacketWrite(&pack, packet_write8, true); + PacketWrite(&pack, packet_write8, false); + RAssert(packet_send(v->peer, &pack, true)); + break; + } + + PacketRead(x, packet, packet_read16, uint16_t); + PacketRead(y, packet, packet_read16, uint16_t); + PacketRead(red_ring, packet, packet_read8, uint8_t); + + Vector2 pos = { (float)x, (float)y }; + AssertOrDisconnect(v->server, vector2_dist(&pos, &v->plr.pos) <= 40); + + static double PI = 0.0; + if(PI == 0.0) + PI = acos(-1); + + if (red_ring) + { + CreamRing* rings[128]; + int cnt = game_find(v->server, (Entity**)rings, "cring", 128); + + for(int i = 0; i < cnt; i++) + { + CreamRing* ring = rings[i]; + if(!ring->red) + continue; + + AssertOrDisconnect(v->server, vector2_dist(&ring->pos, &pos) >= 150); + } + + uint16_t posX[2] = { 25, -27 }; + uint16_t posY[2] = { 0, 0 }; + for (int i = 0; i < 2; i++) + { + uint16_t rX = x + posX[i]; + uint16_t rY = y + posY[i]; + + RAssert(game_spawn(v->server, (Entity*)&(MakeCreamRing(rX, rY, red_ring)), sizeof(CreamRing), NULL)); + } + } + else + { + uint16_t posX[3] = { 26, 0, -27 }; + uint16_t posY[3] = { 0, -26, 0 }; + for (int i = 0; i < 3; i++) + { + uint16_t rX = x + posX[i]; + uint16_t rY = y + posY[i]; + + RAssert(game_spawn(v->server, (Entity*)&(MakeCreamRing(rX, rY, red_ring)), sizeof(CreamRing), NULL)); + } + } + + v->server->game.cooldowns[CREAM_RING_SPAWN] = 25 * TICKSPERSEC; + break; + } + + case CLIENT_ETRACKER: + { + AssertOrDisconnect(v->server, v->in_game); + AssertOrDisconnect(v->server, v->id != v->server->game.exe); + AssertOrDisconnect(v->server, v->surv_char == CH_EGGMAN); + AssertOrDisconnect(v->server, v->server->game.cooldowns[EGGTRACK_RECHARGE] <= 0); + + PacketRead(x, packet, packet_read16, uint16_t); + PacketRead(y, packet, packet_read16, uint16_t); + + game_spawn(v->server, (Entity*)&(MakeEggTrack(x, y)), sizeof(EggTracker), NULL); + v->server->game.cooldowns[EGGTRACK_RECHARGE] = 10 * TICKSPERSEC; + break; + } + + case CLIENT_ETRACKER_ACTIVATED: + { + AssertOrDisconnect(v->server, v->in_game); + PacketRead(eid, packet, packet_read16, uint16_t); + + Entity* ents[50]; + int found = game_find(v->server, ents, "eggtrack", 50); + + for (int i = 0; i < found; i++) + { + EggTracker* entity = (EggTracker*)ents[i]; + + if (entity->id == eid) + { + entity->activ_id = v->id; + game_despawn(v->server, NULL, eid); + break; + } + } + + break; + } + + case CLIENT_ERECTOR_BRING_SPAWN: + { + AssertOrDisconnect(v->server, v->in_game); + AssertOrDisconnect(v->server, v->id == v->server->game.exe); + AssertOrDisconnect(v->server, v->exe_char == EX_EXETIOR); + AssertOrDisconnect(v->server, v->server->game.cooldowns[EXETIOR_BRING_SPAWN] <= 0); + + PacketRead(x, packet, packet_read16, uint16_t); + PacketRead(y, packet, packet_read16, uint16_t); + + if (v->mod_tool) + { + RAssert(game_spawn(v->server, (Entity*)&(MakeCreamRing(x, y, false)), sizeof(CreamRing), NULL)); + break; + } + + BRing* rings[128]; + int cnt = game_find(v->server, (Entity**)rings, "bring", 128); + + Vector2 pos = { x, y }; + for(int i = 0; i < cnt; i++) + { + BRing* ring = rings[i]; + AssertOrDisconnect(v->server, vector2_dist(&ring->pos, &pos) >= 100); + } + + game_spawn(v->server, (Entity*)(&(MakeBlackRing(x, y))), sizeof(BRing), NULL); + v->server->game.cooldowns[EXETIOR_BRING_SPAWN] = 10 * TICKSPERSEC; + break; + } + + case CLIENT_BRING_COLLECTED: + { + AssertOrDisconnect(v->server, v->in_game); + AssertOrDisconnect(v->server, v->id != v->server->game.exe); + PacketRead(eid, packet, packet_read16, uint16_t); + + if (game_despawn(v->server, NULL, eid)) + { + Packet pack; + PacketCreate(&pack, SERVER_BRING_COLLECTED); + packet_send(v->peer, &pack, true); + } + break; + } + + case CLIENT_ERECTOR_BALLS: + { + AssertOrDisconnect(v->server, v->in_game); + AssertOrDisconnect(v->server, v->id == v->server->game.exe); + + PacketRead(x, packet, packet_readfloat, float); + PacketRead(y, packet, packet_readfloat, float); + + if(!v->mod_tool) + { + Packet pack; + PacketCreate(&pack, CLIENT_ERECTOR_BALLS); + PacketWrite(&pack, packet_writefloat, x); + PacketWrite(&pack, packet_writefloat, y); + server_broadcast(v->server, &pack, true); + } + else + { + for(int i = -3; i < 3; i++) + { + RAssert(game_spawn(v->server, (Entity*)&(MakeCreamRing(x + i * 8, y, false)), sizeof(CreamRing), NULL)); + } + } + + break; + } + + case CLIENT_EXELLER_SPAWN_CLONE: + { + AssertOrDisconnect(v->server, v->in_game); + AssertOrDisconnect(v->server, v->id == v->server->game.exe); + AssertOrDisconnect(v->server, v->exe_char == EX_EXELLER); + AssertOrDisconnect(v->server, game_find(v->server, NULL, "exclone", 3) < 2); + + PacketRead(x, packet, packet_read16, uint16_t); + PacketRead(y, packet, packet_read16, uint16_t); + PacketRead(dir, packet, packet_read8, int8_t); + game_spawn(v->server, (Entity*)&(MakeExellerClone(x, y, dir, v->id)), sizeof(ExellerClone), NULL); + break; + } + + case CLIENT_EXELLER_TELEPORT_CLONE: + { + AssertOrDisconnect(v->server, v->in_game); + AssertOrDisconnect(v->server, v->id == v->server->game.exe); + AssertOrDisconnect(v->server, v->exe_char == EX_EXELLER); + + PacketRead(eid, packet, packet_read16, uint16_t); + + ExellerClone* clone; + if (game_despawn(v->server, (Entity**)&clone, eid)) + { + if (v->mod_tool) + { + Packet pack; + PacketCreate(&pack, SERVER_EXELLERCLONE_STATE); + PacketWrite(&pack, packet_write8, 0); + PacketWrite(&pack, packet_write16, clone->id); + PacketWrite(&pack, packet_write16, clone->owner); + PacketWrite(&pack, packet_write16, (uint16_t)v->plr.pos.x); + PacketWrite(&pack, packet_write16, (uint16_t)v->plr.pos.y); + PacketWrite(&pack, packet_write8, clone->dir); + RAssert(packet_send(v->peer, &pack, true)); + free(clone); + break; + } + + Packet pack; + PacketCreate(&pack, SERVER_EXELLERCLONE_STATE); + PacketWrite(&pack, packet_write8, 1); + PacketWrite(&pack, packet_write16, clone->id); + server_broadcast(v->server, &pack, true); + + free(clone); + v->plr.ex_teleport = 60; + } + break; + } + + case CLIENT_PLAYER_ESCAPED: + { + AssertOrDisconnect(v->server, v->in_game); + AssertOrDisconnect(v->server, v->id != v->server->game.exe); + + if (v->mod_tool) + { + RAssert(server_disconnect(v->server, v->peer, DR_SERVERTIMEOUT, NULL)); + break; + } + + if (v->plr.flags & PLAYER_DEAD || v->plr.flags & PLAYER_DEMONIZED) + break; + + if (v->plr.flags & PLAYER_ESCAPED) + break; + + SET_FLAG(v->plr.flags, PLAYER_ESCAPED); + + Packet pack; + PacketCreate(&pack, SERVER_PLAYER_ESCAPED); + RAssert(packet_send(v->peer, &pack, true)); + + PacketCreate(&pack, SERVER_GAME_PLAYER_ESCAPED); + PacketWrite(&pack, packet_write16, v->id); + server_broadcast(v->server, &pack, true); + + RAssert(game_state_check(v->server)); + break; + } + + case CLIENT_PLAYER_DEATH_STATE: + { + if (v->server->game.end > 0) + break; + + AssertOrDisconnect(v->server, v->in_game); + AssertOrDisconnect(v->server, v->id != v->server->game.exe); + AssertOrDisconnect(v->server, !(v->plr.flags & PLAYER_DEMONIZED)); + + PacketRead(dead, packet, packet_read8, uint8_t); + PacketRead(rtimes, packet, packet_read8, uint8_t); + + Packet pack; + PacketCreate(&pack, SERVER_PLAYER_DEATH_STATE); + PacketWrite(&pack, packet_write16, v->id); + PacketWrite(&pack, packet_write8, dead); + PacketWrite(&pack, packet_write8, rtimes); + server_broadcast(v->server, &pack, true); + + PacketCreate(&pack, SERVER_REVIVAL_STATUS); + PacketWrite(&pack, packet_write8, false) + PacketWrite(&pack, packet_write16, v->id); + server_broadcast(v->server, &pack, true); + + if (dead) + { + if (v->plr.flags & PLAYER_DEAD || v->plr.flags & PLAYER_ESCAPED) + break; + + SET_FLAG(v->plr.flags, PLAYER_DEAD); + if (v->plr.flags & PLAYER_REVIVED || v->server->game.time_sec < TICKSPERSEC * 2) + { + RAssert(game_demonize(v->server, v)); + } + else + { + PeerData* exe = server_find_peer(v->server, v->server->game.exe); + v->plr.death_timer_sec = 30; + + PacketCreate(&pack, SERVER_GAME_DEATHTIMER_TICK); + PacketWrite(&pack, packet_write8, exe && vector2_dist(&v->plr.pos, &exe->plr.pos) <= 240); + PacketWrite(&pack, packet_write16, v->id); + PacketWrite(&pack, packet_write8, v->plr.death_timer_sec); + server_broadcast(v->server, &pack, true); + } + } + else + { + AssertOrDisconnect(v->server, v->plr.death_timer_sec > 0); + DEL_FLAG(v->plr.flags, PLAYER_DEAD); + } + + RAssert(game_state_check(v->server)); + break; + } + + case CLIENT_REVIVAL_PROGRESS: + { + if (v->server->game.end > 0) + break; + + PacketRead(pid, packet, packet_read16, uint16_t); + PacketRead(rings, packet, packet_read8, uint8_t); + + PeerData* to_revive = server_find_peer(v->server, pid); + AssertOrDisconnect(v->server, to_revive); + + if (!to_revive || !(to_revive->plr.flags & PLAYER_DEAD)) + break; + + Packet pack; + if (to_revive->plr.flags & PLAYER_CANTREVIVE) + { + to_revive->plr.death_timer_sec = 0; + to_revive->plr.death_timer = 0; + + PacketCreate(&pack, SERVER_REVIVAL_STATUS); + PacketWrite(&pack, packet_write8, 0); + PacketWrite(&pack, packet_write16, to_revive->id); + server_broadcast(v->server, &pack, true); + break; + } + + if (to_revive->plr.revival <= 0) + { + PacketCreate(&pack, SERVER_REVIVAL_STATUS); + PacketWrite(&pack, packet_write8, 1); + PacketWrite(&pack, packet_write16, to_revive->id); + server_broadcast(v->server, &pack, true); + } + + to_revive->plr.revival += 0.015 + (0.004 * rings); + if (to_revive->plr.revival < 1) + { + PacketCreate(&pack, SERVER_REVIVAL_PROGRESS); + PacketWrite(&pack, packet_write16, to_revive->id); + PacketWrite(&pack, packet_writedouble, to_revive->plr.revival); + server_broadcast(v->server, &pack, false); + + // add itself to the list + { + bool has = false; + int ind = 0; + + for (int i = 0; i < 5; i++) + { + if (to_revive->plr.revival_init[i] == -1) + { + ind = i; + break; + } + + if (to_revive->plr.revival_init[i] == v->id) + has = true; + } + + if (!has) + to_revive->plr.revival_init[ind] = v->id; + } + } + else + { + to_revive->plr.stats.rings = 0; + + SET_FLAG(to_revive->plr.flags, PLAYER_REVIVED); + DEL_FLAG(to_revive->plr.flags, PLAYER_DEAD); + + PacketCreate(&pack, SERVER_REVIVAL_STATUS); + PacketWrite(&pack, packet_write8, 0); + PacketWrite(&pack, packet_write16, to_revive->id); + server_broadcast(v->server, &pack, true); + + PacketCreate(&pack, SERVER_REVIVAL_REVIVED); + packet_send(to_revive->peer, &pack, true); + + for (int i = 0; i < 5; i++) + { + if (to_revive->plr.revival_init[i] == -1) + break; + + PeerData* data = server_find_peer(v->server, to_revive->plr.revival_init[i]); + if(!data) + continue; + + PacketCreate(&pack, SERVER_REVIVAL_RINGSUB); + packet_send(data->peer, &pack, true); + + Debug("Removed rings from %d", to_revive->plr.revival_init[i]); + } + + // Print player's name + Info("%s " LOG_RST "(id %d)" LOG_GRN " was revived!", to_revive->nickname.value, to_revive->id); + } + break; + } + + case CLIENT_CHAT_MESSAGE: + { + if (v->in_game) + break; + + v->timeout = 0; + + PacketRead(pid, packet, packet_read16, uint16_t); + PacketRead(msg, packet, packet_readstr, String); + AssertOrDisconnect(v->server, string_length(&msg) <= 40); + + Info("%s " LOG_RST "(id %d): %s", v->nickname.value, v->id, msg.value); + if (!server_cmd_handle(v->server, server_cmd_parse(&msg), v, &msg) && g_config.chatfix) + server_broadcast_msg(v->server, v->id, msg.value); + + break; + } + + case CLIENT_PING: + { + if (!v->server->game.started) + break; + + if (v->plr.mod_tool) + { + if (v->server->game.time_sec <= TICKSPERSEC * 2 + 5) + break; + } + + Packet pack; + PacketCreate(&pack, SERVER_PONG); + PacketWrite(&pack, packet_write16, v->peer->roundTripTime); + packet_send(v->peer, &pack, false); + v->plr.ping_last = v->peer->roundTripTime; + + PacketCreate(&pack, SERVER_GAME_PING); + PacketWrite(&pack, packet_write16, v->id); + PacketWrite(&pack, packet_write16, v->peer->roundTripTime); + server_broadcast_ex(v->server, &pack, false, v->id); + break; + } + + case CLIENT_PLAYER_DATA: + { + if (!v->server->game.started) + break; + + PacketRead(x, packet, packet_read16, uint16_t); + PacketRead(y, packet, packet_read16, uint16_t); + PacketRead(_xspd, packet, packet_read16, uint16_t); + PacketRead(_yspd, packet, packet_read16, uint16_t); + + PacketRead(state, packet, packet_read8, uint8_t); + PacketRead(_angle, packet, packet_read16, int16_t); + PacketRead(_index, packet, packet_read8, uint8_t); + PacketRead(_xscale, packet, packet_read8, int8_t); + + Vector2 new_pos = { x, y }; + #define PLAYER_ATTACKING 1 << 4 + + int duration = 2000; + if(v->server->game.exe != v->id) + { + PacketRead(hp, packet, packet_read8, int8_t); + PacketRead(revival, packet, packet_read8, uint8_t); + PacketRead(rings, packet, packet_read16, int16_t); + PacketRead(flags, packet, packet_read8, uint8_t); + + if(!(v->plr.flags & PLAYER_DEAD) && !(v->plr.flags & PLAYER_DEMONIZED)) + { + if (v->server->game.exe != v->id) + { + v->plr.rings = rings; + if (revival < 2) + { + if (rings < 0 || (v->server->game.map != 20 && rings >= 120)) + { + server_disconnect(v->server, v->peer, DR_OTHER, "gomunkulus"); + return true; + } + + if (hp > 100) + { + server_disconnect(v->server, v->peer, DR_OTHER, "garic forn — Сьогодні о 04:31"); + return true; + } + } + } + } + + v->plr.is_attacking = flags & PLAYER_ATTACKING; + switch(v->surv_char) + { + case CH_EGGMAN: + { + duration = 3000; + break; + } + } + } + else + { + PacketRead(flags, packet, packet_read8, uint8_t); + v->plr.is_attacking = flags & PLAYER_ATTACKING; + } + + if(v->server->game.end <= 0 && v->plr.is_attacking) + { + if(v->plr.attack_timer <= 0) + { + time_start(&v->plr.last_attack); + v->plr.attack_timer = 1; + } + else + { + double elapsed = time_end(&v->plr.last_attack); + v->plr.attack_timer += elapsed; + if(v->plr.attack_timer >= duration) + { + server_disconnect(v->server, v->peer, DR_KICKEDBYHOST, "nuh-uh!"); + return true; + } + time_start(&v->plr.last_attack); + } + } + else + v->plr.attack_timer = 0; + + // ping limit disabled + if(g_config.ping_limit == UINT16_MAX) + { + // Calc distance before setting new posx + float dist = vector2_dist(&v->plr.pos, &new_pos); + if (v->server->game.started && !v->plr.mod_tool && v->plr.pos.x != 0 && v->plr.pos.y != 0) + { + if (v->plr.ex_teleport == 0) + { + if (dist > 700) + { + switch (v->server->game.map) + { + case 15: + case 13: + case 8: + case 6: + break; + + default: + server_disconnect(v->server, v->peer, DR_OTHER, "blud used a portal gun lmfao"); + return true; + } + } + + if (dist > 60) + { + if (!player_add_error(v->server, v, 500)) + return true; + } + } + else + v->plr.ex_teleport--; + } + } + + v->plr.pos = new_pos; + v->plr.timeout = 0; + + if (v->plr.mod_tool) + { + if (v->plr.mod_tool_timer < 61) + v->plr.mod_tool_timer++; + else + { + float dist = vector2_dist(&v->plr.pos, &v->plr.start_pos); + if (dist > 240) + { + Packet pack; + PacketCreate(&pack, SERVER_PLAYER_BACKTRACK); + PacketWrite(&pack, packet_writefloat, v->plr.start_pos.x); + PacketWrite(&pack, packet_writefloat, v->plr.start_pos.y); + packet_send(v->peer, &pack, true); + } + else if (dist >= 300) + { + // purpl men + server_disconnect(v->server, v->peer, DR_OTHER, + "@@@@@@@......@@@\n" + "@@@@@@@......@@@\n" + "@@@@@@@.......@@\n" + "@@@@@@@@@@@@....\n" + "@@@@@@@@@@......\n" + "....@@..........\n" + "................\n" + "@@@@@@@@@@@@....\n" + "@@@@@@@@@@@@....\n" + "@@@@@@@@@@@@@...\n" + "@@@@@@@@@@@@@...\n" + "@@@@@@@@@@@....." + ); + } + break; + } + + if (v->plr.mod_tool_timer == 60) + { + v->plr.start_pos = v->plr.pos; + + Packet pack; + PacketCreate(&pack, SERVER_FELLA); + PacketWrite(&pack, packet_write16, v->id); + PacketWrite(&pack, packet_writefloat, v->plr.start_pos.x); + PacketWrite(&pack, packet_writefloat, v->plr.start_pos.y); + server_broadcast(v->server, &pack, true); + break; + } + } + + if(v->plr.state != state || time_end(&v->plr.last_packet) >= 15 * 2.9) + { + v->plr.state = state; + time_start(&v->plr.last_packet); + + Packet pack; + PacketCreate(&pack, CLIENT_PLAYER_DATA); + PacketWrite(&pack, packet_write16, v->id); + + RAssert(packet_seek(packet, 2)); + while (packet->pos < packet->len) + { + PacketRead(i, packet, packet_read8, uint8_t); + PacketWrite(&pack, packet_write8, i); + } + + server_broadcast_ex(v->server, &pack, false, v->id); + } + break; + } + } + + if (!v->server->game.started) + { + if(!v->plr.ready) + { + time_start(&v->plr.last_packet); + v->plr.ready = true; + } + + RAssert(game_checkstart(v->server)); + return true; + } + + RAssert(packet_seek(packet, 0)); + RAssert(g_mapList[v->server->game.map].cb.tcp_msg(v, packet)); + return true; +} + +bool game_entity_tick(Server* server) +{ + int32_t entits[100]; + int entit = 0; + + for(int i = 0; i < 100; i++) + entits[i] = -1; + + for (size_t i = 0; i < server->game.entities.capacity; i++) + { + Entity* ent = (Entity*)server->game.entities.ptr[i]; + if (!ent) + continue; + + if (ent->tick && !ent->tick(server, ent)) + entits[entit++] = ent->id; + } + + for (int i = 0; i < 100; i++) + { + if (entits[i] == -1) + break; + + game_despawn(server, NULL, (uint16_t)entits[i]); + } + + return true; +} + +bool game_player_tick(Server* server) +{ + // Update player cooldown + for (int i = 0; i < PLAYER_COOLCOUNT; i++) + { + if (server->game.cooldowns[i] > 0) + server->game.cooldowns[i] -= server->delta; + else + server->game.cooldowns[i] = 0; + } + + PeerData* exe = server_find_peer(server, server->game.exe); + if(!exe) + return true; + + bool exe_camp = false; + int survivors = 0, demonized = 0; + + for(size_t i = 0; i < server->peers.capacity; i++) + { + PeerData* data = (PeerData*)server->peers.ptr[i]; + if (!data) + continue; + + if(!data->in_game) + continue; + + player_check_zone(server, data); + + // ping check + if (server->delta < 2.5) + { + data->plr.ping_timer += server->delta; + data->plr.ping_total += data->plr.ping_last * server->delta; + + if (data->plr.ping_timer >= 20 * TICKSPERSEC) + { + double avg_ping = data->plr.ping_total / data->plr.ping_timer; + if (avg_ping >= g_config.ping_limit) + { + char msg[130]; + snprintf(msg, 130, "Bad connection, try picking closest region for better experience!\nYour average ping for last 20s: %dms", (int)avg_ping); + server_disconnect(server, data->peer, DR_OTHER, msg); + continue; + } + + data->plr.ping_total = 0; + data->plr.ping_timer = 0; + } + } + + if((data->plr.flags & PLAYER_DEAD) && !(data->plr.flags & PLAYER_CANTREVIVE) && vector2_dist(&exe->plr.pos, &data->plr.pos) < 300) + exe_camp = true; + + if (exe->id != data->id && !(data->plr.flags & PLAYER_DEAD) && !(data->plr.flags & PLAYER_DEMONIZED)) + { + // calc danger time + if (!(data->plr.flags & PLAYER_ESCAPED)) + { + bool in_danger = exe && vector2_dist(&data->plr.pos, &exe->plr.pos) < 300; + if (in_danger) + data->plr.stats.danger_time += server->delta; + + if(server->game.map != 8 && server->game.map != 6) + { + // calc balls + uint32_t chunk = ((uint32_t)data->plr.pos.x / 480) + ((uint32_t)data->plr.pos.y / 270); + if (data->plr.chunk != chunk) + { + data->plr.stats.braindead_time = 0; + data->plr.chunk = chunk; + } + else + { + data->plr.stats.braindead_time += server->delta * (in_danger ? 0.5 : 1); + if (data->plr.stats.braindead_time >= 25 * TICKSPERSEC) + data->plr.stats.brain_damage = true; + } + } + } + + data->plr.stats.survive_time += server->delta; + } + + // subpussy revival time + if(data->plr.flags & PLAYER_DEAD && !(data->plr.flags & PLAYER_CANTREVIVE)) + { + if(data->plr.revival > 0) + { + data->plr.revival -= 0.0025 * server->delta; + + Packet pack; + if(data->plr.revival <= 0) + { + for(int i = 0; i < 5; i++) + data->plr.revival_init[i] = -1; + + PacketCreate(&pack, SERVER_REVIVAL_STATUS); + PacketWrite(&pack, packet_write8, 0); + PacketWrite(&pack, packet_write16, data->id); + server_broadcast(server, &pack, true); + } + else + { + PacketCreate(&pack, SERVER_REVIVAL_PROGRESS); + PacketWrite(&pack, packet_write16, data->id); + PacketWrite(&pack, packet_writedouble, data->plr.revival); + server_broadcast(server, &pack, false); + } + } + } + + if (!(data->plr.flags & PLAYER_ESCAPED)) + { + data->plr.timeout += server->delta; + if (data->plr.timeout >= 4.f * TICKSPERSEC) + server_disconnect(server, data->peer, DR_AFKTIMEOUT, NULL); + continue; + } + + if (data->id == server->game.exe) + continue; + + if (data->plr.flags & PLAYER_DEMONIZED) + demonized++; + else if (!(data->plr.flags & PLAYER_DEAD)) + survivors++; + } + + if(server->game.map != 8 && exe_camp) + exe->plr.stats.camp_time += server->delta; + + // Start demonization + if (!server->game.sudden_death && server->game.time_sec <= TICKSPERSEC * 2) + { + server->game.sudden_death = true; + + PeerData* sort[6]; + int len = 0; + memset(sort, 0, sizeof(Player*) * 6); + + for (size_t i = 0; i < server->peers.capacity; i++) + { + PeerData* data = (PeerData*)server->peers.ptr[i]; + if (!data) + continue; + + if(!data->in_game) + continue; + + if (!(data->plr.flags & PLAYER_DEAD)) + continue; + + sort[len++] = data; + } + + for (int i = 0; i < len; ++i) + { + for (int j = i + 1; j < len; ++j) + { + double totalA = sort[i]->plr.death_timer_sec + (sort[i]->plr.death_timer / 60.0); + double totalB = sort[j]->plr.death_timer_sec + (sort[j]->plr.death_timer / 60.0); + + if (totalA > totalB) + { + PeerData* a = sort[i]; + sort[i] = sort[j]; + sort[j] = a; + } + } + } + + Debug("Demonization order:"); + for (int i = 0; i < len; i++) + { + Debug("%d: %f", sort[i]->id, sort[i]->plr.death_timer_sec + (sort[i]->plr.death_timer / 60.0)); + game_demonize(server, sort[i]); + } + } + + for (size_t i = 0; i < server->peers.capacity; i++) + { + PeerData* data = (PeerData*)server->peers.ptr[i]; + if (!data) + continue; + + if(!data->in_game) + continue; + + if (data->plr.flags & PLAYER_CANTREVIVE) + continue; + + if (data->plr.flags & PLAYER_DEAD && data->plr.death_timer_sec > 0) + { + Packet packet; + bool exe_near = false; + bool demonized_near = false; + + // check if exe is nearby + for (size_t j = 0; j < server->peers.capacity; j++) + { + PeerData* check = (PeerData*)server->peers.ptr[j]; + if (!check) + continue; + + if(!check->in_game) + continue; + + if (check->id != server->game.exe && !(check->plr.flags & PLAYER_DEMONIZED)) + continue; + + if (vector2_dist(&data->plr.pos, &check->plr.pos) <= 240) + { + if (check->plr.flags & PLAYER_DEMONIZED) + demonized_near = true; + else + { + demonized_near = false; + exe_near = true; + break; + } + } + } + + if (server->game.time_sec < TICKSPERSEC * 2) + { + game_demonize(server, data); + continue; + } + + if (data->plr.death_timer >= TICKSPERSEC) + { + if (!exe_near) + { + if (--data->plr.death_timer_sec <= 0) + { + game_demonize(server, data); + continue; + } + } + + PacketCreate(&packet, SERVER_GAME_DEATHTIMER_TICK); + PacketWrite(&packet, packet_write8, exe_near); + PacketWrite(&packet, packet_write16, data->id); + PacketWrite(&packet, packet_write8, data->plr.death_timer_sec); + server_broadcast(server, &packet, true); + + data->plr.death_timer = 0; + } + + data->plr.death_timer += (demonized_near ? 0.5f : 1.0f) * server->delta; + } + } + + return true; +} + +bool game_state_tick(Server* server) +{ + // We wait 15 seconds, before kicking out everyone + if (!server->game.started) + { + server->game.start_timeout -= server->delta; + if (server->game.start_timeout <= 0) + { + Warn("Waiting for players took too long, kicking out inactive players!"); + + for (size_t j = 0; j < server->peers.capacity; j++) + { + PeerData* data = (PeerData*)server->peers.ptr[j]; + if (!data) + continue; + + if(!data->in_game) + continue; + + if (!data->plr.ready) + { + server_disconnect(server, data->peer, DR_PACKETSNOTRECV, NULL); + break; + } + } + + } + return true; + } + + if (server->game.end > 0) + { + server->game.end -= server->delta; + if (server->game.end <= 0) + RAssert(game_uninit(server, true)); + + return true; + } + + server->game.elapsed += server->delta; + if (server->game.time <= TICKSPERSEC) + { + server->game.time_sec--; + server->game.time += TICKSPERSEC; + + if (server->game.time_sec % server->game.ring_coff == 0) + { + if (!game_spawn(server, (Entity*)&(MakeRing()), sizeof(Ring), NULL)) + Debug("Not enough space for rings"); + } + + Packet packet; + PacketCreate(&packet, SERVER_GAME_TIME_SYNC); + PacketWrite(&packet, packet_write16, (uint16_t)server->game.time_sec * TICKSPERSEC); + server_broadcast(server, &packet, true); + + if (server->game.time_sec <= 0) + RAssert(game_end(server, ED_TIMEOVER, true)); + } + + RAssert(game_player_tick(server)); + RAssert(game_entity_tick(server)); + RAssert(g_mapList[server->game.map].cb.tick(server)); + + server->game.time -= server->delta; + return true; +} diff --git a/disasterserver_c/states/Lobby.c b/disasterserver_c/states/Lobby.c new file mode 100644 index 0000000..688a403 --- /dev/null +++ b/disasterserver_c/states/Lobby.c @@ -0,0 +1,694 @@ +#include +#include +#include +#include +#include +#include +#include +#include + +#define NO_COUNTDOWN (5 + 1) +#define COUNTDOWN (5) + +bool lobby_send_countdown(Server* server) +{ + Packet pack; + + PacketCreate(&pack, SERVER_LOBBY_COUNTDOWN); + PacketWrite(&pack, packet_write8, server->lobby.countdown_sec < NO_COUNTDOWN); + PacketWrite(&pack, packet_write8, server->lobby.countdown_sec); + + server_broadcast(server, &pack, true); + return true; +} + +void lobby_check_vote(Server* server) +{ + if (vote_check(&server->lobby.vote)) + { + switch (server->lobby.vote.type) + { + case VOTE_KICK: + { + char buffer[256]; + snprintf(buffer, 256, "vote kick " CLRCODE_GRN "succeeded~ (" CLRCODE_GRN "%d" " ~from " CLRCODE_RED "%d~)", server->lobby.vote.votecnt, server->lobby.vote.votetotal); + server_broadcast_msg(server, 0, buffer); + + timeout_set(server->lobby.kick_target.nickname.value, server->lobby.kick_target.udid.value, server->lobby.kick_target.ip.value, time(NULL) + 60); + server_disconnect_id(server, server->lobby.kick_target.id, DR_KICKEDBYHOST, NULL); + break; + } + + case VOTE_PRACTICE: + { + char buffer[256]; + snprintf(buffer, 256, "vote practice " CLRCODE_GRN "succeeded~ (" CLRCODE_GRN "%d" " ~from " CLRCODE_RED "%d~)", server->lobby.vote.votecnt, server->lobby.vote.votetotal); + server_broadcast_msg(server, 0, buffer); + + server->lobby.prac_countdown = 2 * TICKSPERSEC; + break; + } + } + } + else + { + switch (server->lobby.vote.type) + { + case VOTE_KICK: + { + char buffer[256]; + snprintf(buffer, 256, "vote kick " CLRCODE_RED "failed~ (" CLRCODE_GRN "%d" " ~from " CLRCODE_RED "%d~)", server->lobby.vote.votecnt, server->lobby.vote.votetotal); + server_broadcast_msg(server, 0, buffer); + break; + } + + case VOTE_PRACTICE: + { + char buffer[256]; + snprintf(buffer, 256, "vote practice " CLRCODE_RED "failed~ (" CLRCODE_GRN "%d" " ~from " CLRCODE_RED "%d~)", server->lobby.vote.votecnt, server->lobby.vote.votetotal); + server_broadcast_msg(server, 0, buffer); + break; + } + } + } + + server->lobby.vote.ongoing = 0; +} + +bool lobby_check_countdown(Server* server) +{ + if (!server) // stop warnings + return false; + + uint8_t count = 0; + for (size_t i = 0; i < server->peers.capacity; i++) + { + PeerData* peer = (PeerData*)server->peers.ptr[i]; + if (!peer) + continue; + + if (peer->ready) + count++; + } + + if (count == server->peers.noitems && server->peers.noitems > 1) + { + server->lobby.countdown = TICKSPERSEC; + server->lobby.countdown_sec = COUNTDOWN; + RAssert(lobby_send_countdown(server)); + } + else if (server->lobby.countdown_sec != NO_COUNTDOWN) + { + server->lobby.countdown = TICKSPERSEC; + server->lobby.countdown_sec = NO_COUNTDOWN; + RAssert(lobby_send_countdown(server)); + } + + return true; +} + +bool lobby_state_handle(PeerData* v, Packet* packet) +{ + // sub-state machine + switch (v->server->state) + { + case ST_LOBBY: + case ST_GAME: + case ST_RESULTS: + break; + case ST_MAPVOTE: + return mapvote_state_handle(v, packet); + case ST_CHARSELECT: + return charselect_state_handle(v, packet); + } + + // Read header + PacketRead(passtrough, packet, packet_read8, uint8_t); + PacketRead(type, packet, packet_read8, uint8_t); + + bool res = true; + Packet pack; + switch (type) + { + default: + RAssert(server_msg_handle(v->server, type, v, packet)); + break; + + case CLIENT_LOBBY_PLAYERS_REQUEST: + { + for (size_t i = 0; i < v->server->peers.capacity; i++) + { + PeerData* peer = (PeerData*)v->server->peers.ptr[i]; + if (!peer) + continue; + + if (peer->id == v->id) + continue; + + packet_new(&pack, SERVER_LOBBY_PLAYER); + packet_write16(&pack, peer->id); + packet_write8(&pack, peer->ready); /* ready */ + packet_writestr(&pack, peer->nickname); + packet_write8(&pack, peer->lobby_icon); + packet_write8(&pack, peer->pet); + + if (!packet_send(v->peer, &pack, true)) + { + res = false; + break; + } + } + + PacketCreate(&pack, SERVER_LOBBY_CORRECT); + RAssert(packet_send(v->peer, &pack, true)); + + char msg[100]; + snprintf(msg, 100, "server " CLRCODE_RED "%d" CLRCODE_RST " of " CLRCODE_BLU "%d" CLRCODE_RST, v->server->id+1, g_config.server_count); + + server_send_msg(v->server, v->peer, "-----------------------"); + server_send_msg(v->server, v->peer, CLRCODE_RED "better/server~ v" STRINGIFY(BUILD_VERSION)); + server_send_msg(v->server, v->peer, "build from " CLRCODE_PUR __DATE__ " " CLRCODE_GRN __TIME__ CLRCODE_RST); + server_send_msg(v->server, v->peer, msg); + server_send_msg(v->server, v->peer, "-----------------------"); + server_send_msg(v->server, v->peer, CLRCODE_GRA "type .help for command list~"); + + if(g_config.motd[0] != '\0') + server_send_msg(v->server, v->peer, g_config.motd); + if (v->mod_tool) + server_send_msg(v->server, v->peer, CLRCODE_RED "your mod is disallowed on this server" CLRCODE_RST); + if (v->op) + server_send_msg(v->server, v->peer, CLRCODE_GRN "you're an operator on this server" CLRCODE_RST); + break; + } + + case CLIENT_CHAT_MESSAGE: + { + PacketRead(pid, packet, packet_read16, uint16_t); + PacketRead(msg, packet, packet_readstr, String); + AssertOrDisconnect(v->server, string_length(&msg) <= 80); + v->timeout = 0; + + // cheats + if(strstr(msg.value, "i want big burgr")) + { + if(v->op) + { + v->exe_chance = 101; + + Packet pack; + PacketCreate(&pack, SERVER_LOBBY_EXE_CHANCE); + PacketWrite(&pack, packet_write8, v->exe_chance); + RAssert(packet_send(v->peer, &pack, true)); + } + + RAssert(server_send_msg(v->server, v->peer, CLRCODE_GRA "you were sent to " CLRCODE_RED "brazil" CLRCODE_RST)); + return true; + } + + bool ignore = true; + unsigned long hash = server_cmd_parse(&msg); + + switch (hash) + { + default: + { + if(!server_cmd_handle(v->server, hash, v, &msg)) + ignore = false; + break; + } + + /* Force a map */ + case CMD_MAP: + { + if (!v->op) + { + RAssert(server_send_msg(v->server, v->peer, CLRCODE_RED "you aren't an operator")); + break; + } + + int ind; + if (sscanf(msg.value, ".map %d", &ind) <= 0) + { + RAssert(server_send_msg(v->server, v->peer, CLRCODE_RED "example:~ .map 1")); + break; + } + + ind--; + if (ind < 0 || ind >= MAP_COUNT+1) + { + char msg[128]; + snprintf(msg, 128, CLRCODE_RED "map should be between 1 and %d", MAP_COUNT + 1); + RAssert(server_send_msg(v->server, v->peer, msg)); + break; + } + + return charselect_init(ind, v->server) || lobby_init(v->server); + } + + /* YES on votes */ + case CMD_YES: + case CMD_Y: + { + if (!v->server->lobby.vote.ongoing) + break; + + if (!v->can_vote) + { + server_send_msg(v->server, v->peer, CLRCODE_RED "you can't participate in this vote."); + break; + } + + if (v->server->lobby.vote.type == VOTE_KICK && v->server->lobby.kick_target.id == v->id) + { + server_send_msg(v->server, v->peer, CLRCODE_RED "why are you kicking yourself ???"); + break; + } + + switch (vote_add(&v->server->lobby.vote, v->id)) + { + case 1: + { + char buffer[512]; + snprintf(buffer, 512, "%s~ " CLRCODE_GRN "voted~.", v->nickname.value); + server_broadcast_msg(v->server, 0, buffer); + break; + } + + case 0: + { + server_send_msg(v->server, v->peer, CLRCODE_RED "you have already voted."); + break; + } + + case -1: + { + lobby_check_vote(v->server); + break; + } + } + break; + } + + /* Practice vote */ + case CMD_VP: + { + if (v->server->lobby.vote.ongoing) + { + if (!v->can_vote) + { + server_send_msg(v->server, v->peer, CLRCODE_RED "you can't participate in this vote."); + break; + } + + if (pid == v->server->lobby.kick_target.id) + { + switch (vote_add(&v->server->lobby.vote, v->id)) + { + case VOTE_SUCCESS: + { + char buffer[512]; + snprintf(buffer, 512, "%s~ " CLRCODE_GRN "voted~.", v->nickname.value); + server_broadcast_msg(v->server, 0, buffer); + break; + } + + case VOTE_ALREADYVOTED: + { + server_send_msg(v->server, v->peer, CLRCODE_RED "you have already voted."); + break; + } + + case VOTE_FULL: + { + lobby_check_vote(v->server); + break; + } + } + } + else + server_send_msg(v->server, v->peer, CLRCODE_RED "another vote is already in progress."); + + break; + } + + if (v->vote_cooldown > 0) + { + char buffer[128]; + snprintf(buffer, 128, CLRCODE_RED "you cannot start another vote for %d s", (int)(v->vote_cooldown / TICKSPERSEC)); + server_send_msg(v->server, v->peer, buffer); + break; + } + + if (!vote_init(v->server, &v->server->lobby.vote, VOTE_PRACTICE, 0)) + { + server_send_msg(v->server, v->peer, CLRCODE_RED "not enough participants."); + break; + } + + char buffer[356]; + snprintf(buffer, 356, "%s~ " CLRCODE_YLW "started practice vote." CLRCODE_RST, v->nickname.value); + + server_broadcast_msg(v->server, 0, "-----------------------"); + server_broadcast_msg(v->server, 0, buffer); + server_broadcast_msg(v->server, 0, "type " CLRCODE_GRN ".yes~ or ignore"); + server_broadcast_msg(v->server, 0, "results will be summarized in " CLRCODE_GRA "20~ sec"); + server_broadcast_msg(v->server, 0, "-----------------------"); + + vote_add(&v->server->lobby.vote, v->id); + v->vote_cooldown = 30 * TICKSPERSEC; + break; + } + + case CMD_VK: + { + if (v->server->lobby.vote.ongoing) + { + server_send_msg(v->server, v->peer, CLRCODE_RED "another vote is already in progress."); + break; + } + + if (v->vote_cooldown > 0) + { + char buffer[128]; + snprintf(buffer, 128, CLRCODE_RED "you cannot start another vote for %ds", (int)(v->vote_cooldown / TICKSPERSEC)); + server_send_msg(v->server, v->peer, buffer); + break; + } + + // we check if number of players in game is at least two + int ingame = server_ingame(v->server); + if (ingame > 2) + { + PacketCreate(&pack, SERVER_LOBBY_CHOOSEVOTEKICK); + RAssert(packet_send(v->peer, &pack, true)); + } + else + server_send_msg(v->server, v->peer, CLRCODE_RED "not enough participants."); + break; + } + } + + Info("%s " LOG_RST "(id %d): %s", v->nickname.value, v->id, msg.value); + if (!ignore && g_config.chatfix) + server_broadcast_msg(v->server, v->id, msg.value); + + break; + } + + case CLIENT_LOBBY_READY_STATE: + { + PacketRead(state, packet, packet_read8, uint8_t); + v->ready = state; + + PacketCreate(&pack, SERVER_LOBBY_READY_STATE); + PacketWrite(&pack, packet_write16, v->id); + PacketWrite(&pack, packet_write8, state); + server_broadcast(v->server, &pack, true); + + RAssert(lobby_check_countdown(v->server)); + break; + } + + case CLIENT_LOBBY_CHOOSEVOTEKICK: + { + PacketRead(pid, packet, packet_read16, uint16_t); + + if (v->server->lobby.vote.ongoing) + { + if (!v->can_vote) + { + server_send_msg(v->server, v->peer, CLRCODE_RED "you can't participate in this vote."); + break; + } + + if (pid == v->server->lobby.kick_target.id) + { + switch (vote_add(&v->server->lobby.vote, v->id)) + { + case VOTE_SUCCESS: + { + char buffer[512]; + snprintf(buffer, 512, "%s~ " CLRCODE_GRN "voted~.", v->nickname.value); + server_broadcast_msg(v->server, 0, buffer); + break; + } + + case VOTE_ALREADYVOTED: + { + server_send_msg(v->server, v->peer, CLRCODE_RED "you have already voted."); + break; + } + + case VOTE_FULL: + { + lobby_check_vote(v->server); + break; + } + } + } + else + server_send_msg(v->server, v->peer, CLRCODE_RED "another vote is already in progress."); + + break; + } + else + { + bool found = false; + for (size_t i = 0; i < v->server->peers.capacity; i++) + { + PeerData* peer = (PeerData*)v->server->peers.ptr[i]; + if (!peer) + continue; + + if (peer->id == pid) + { + if (peer->op) + { + char buffer[128]; + snprintf(buffer, 128, CLRCODE_RED "you're permissionless"); + server_send_msg(v->server, v->peer, buffer); + return true; + } + + memcpy(&v->server->lobby.kick_target, peer, sizeof(PeerData)); + found = true; + break; + } + } + + if (found) + { + if (v->vote_cooldown > 0) + { + char buffer[128]; + snprintf(buffer, 128, CLRCODE_RED "you cannot start another vote for %ds", (int)(v->vote_cooldown / TICKSPERSEC)); + server_send_msg(v->server, v->peer, buffer); + break; + } + + if(!vote_init(v->server, &v->server->lobby.vote, VOTE_KICK, pid)) + { + server_send_msg(v->server, v->peer, CLRCODE_RED "not enough participants."); + break; + } + + char buffer[555]; + snprintf(buffer, 555, "%s~ " CLRCODE_RED "started kick vote for " CLRCODE_RST "%s" CLRCODE_RST, v->nickname.value, v->server->lobby.kick_target.nickname.value); + + server_broadcast_msg(v->server, 0, "-----------------------"); + server_broadcast_msg(v->server, 0, buffer); + server_broadcast_msg(v->server, 0, "type " CLRCODE_GRN ".yes~ or ignore"); + server_broadcast_msg(v->server, 0,"results will be summarized in " CLRCODE_GRA "20~ sec"); + server_broadcast_msg(v->server, 0, "-----------------------"); + + vote_add(&v->server->lobby.vote, v->id); + v->vote_cooldown = 30 * TICKSPERSEC; + } + else + server_broadcast_msg(v->server, 0, CLRCODE_RED "specified player not found."); + } + + break; + } + + + } + + return res; +} + +bool lobby_state_tick(Server* server) +{ + uint8_t should = 0; + + // sub-state machine + switch (server->state) + { + case ST_LOBBY: + { + for (size_t i = 0; i < server->peers.capacity; i++) + { + PeerData* peer = (PeerData*)server->peers.ptr[i]; + if (!peer) + continue; + + if (peer->vote_cooldown > 0) + peer->vote_cooldown -= server->delta; + + if (!peer->ready) + { + //peer->timeout += server->delta; + //if ((int)peer->timeout % 60 == 0) + // Debug("tick for %s: %f", peer->nickname.value, peer->timeout/60.0f); + + if (peer->timeout >= 25 * TICKSPERSEC) + server_disconnect(server, peer->peer, DR_AFKTIMEOUT, NULL); + } + else + peer->timeout = 0; + } + break; + } + case ST_MAPVOTE: + return mapvote_state_tick(server); + + case ST_CHARSELECT: + return charselect_state_tick(server); + + case ST_GAME: + case ST_RESULTS: + break; + } + + // Small delay before entering practice level + if (server->lobby.prac_countdown > 0) + { + server->lobby.prac_countdown -= server->delta; + if (server->lobby.prac_countdown <= 0) + return charselect_init(20, server) || lobby_init(server); + } + + // If vote is going on, call tick function + if (server->lobby.vote.ongoing && !vote_tick(server, &server->lobby.vote)) + lobby_check_vote(server); + + // Do countdown every second + if (server->lobby.countdown_sec <= COUNTDOWN) + { + if (server->lobby.countdown <= 0) + { + server->lobby.countdown += TICKSPERSEC; + + if (--server->lobby.countdown_sec == 0) + return mapvote_init(server) || lobby_init(server); + + RAssert(lobby_send_countdown(server)); + } + + server->lobby.countdown -= server->delta; + } + + return true; +} + +bool lobby_init(Server* server) +{ + srand((unsigned int)time(NULL)); + + Debug("Attepting to enter ST_LOBBY..."); + RAssert(server); + + for (size_t i = 0; i < server->peers.capacity; i++) + { + PeerData* v = (PeerData*)server->peers.ptr[i]; + if (!v) + continue; + + v->ready = false; + v->voted = false; + v->timeout = false; + + if (!v->in_game) + { + v->in_game = true; + + Packet pack; + PacketCreate(&pack, SERVER_IDENTITY_RESPONSE); + PacketWrite(&pack, packet_write8, 1); + PacketWrite(&pack, packet_write16, v->id); + + if (!packet_send(v->peer, &pack, true)) + { + server_disconnect_id(server, v->id, DR_SERVERTIMEOUT, NULL); + continue; + } + } + else + { + if (v->id != server->game.exe) + v->exe_chance += 2 + rand() % 5; + + Packet pack; + PacketCreate(&pack, SERVER_LOBBY_EXE_CHANCE); + PacketWrite(&pack, packet_write8, v->exe_chance); + packet_send(v->peer, &pack, true); + } + } + + server->state = ST_LOBBY; + server->lobby.countdown = TICKSPERSEC; + server->lobby.countdown_sec = NO_COUNTDOWN; + server->lobby.prac_countdown = 0; + memset(&server->lobby.vote, 0, sizeof(Vote)); + + Packet pack; + PacketCreate(&pack, SERVER_GAME_BACK_TO_LOBBY); + server_broadcast(server, &pack, true); + + Info(LOG_YLW "Server is now in " LOG_PUR "Lobby"); + return true; +} + +bool lobby_state_join(PeerData* v) +{ + if (!v->in_game) + return true; + + v->timeout = 0; + switch (v->server->state) + { + case ST_LOBBY: + break; + case ST_GAME: + case ST_RESULTS: + break; + case ST_MAPVOTE: + return mapvote_state_join(v); + case ST_CHARSELECT: + return charselect_state_join(v); + } + + RAssert(lobby_check_countdown(v->server)); + return true; +} + +bool lobby_state_left(PeerData* v) +{ + if (!v->in_game) + return true; + + switch (v->server->state) + { + case ST_LOBBY: + case ST_GAME: + case ST_RESULTS: + break; + case ST_MAPVOTE: + return mapvote_state_left(v); + case ST_CHARSELECT: + return charselect_state_left(v); + } + + RAssert(lobby_check_countdown(v->server)); + return true; +} diff --git a/disasterserver_c/states/Mapvote.c b/disasterserver_c/states/Mapvote.c new file mode 100644 index 0000000..d4c3306 --- /dev/null +++ b/disasterserver_c/states/Mapvote.c @@ -0,0 +1,261 @@ +#include "Server.h" +#include +#include +#include +#include +#include + +bool mapvote_check_state(Server* server) +{ + RAssert(server); + + uint8_t count = 0; + for (size_t i = 0; i < server->peers.capacity; i++) + { + PeerData* peer = (PeerData*)server->peers.ptr[i]; + if (!peer) + continue; + + if (peer->in_game && peer->voted) + count++; + } + + if (count >= server_ingame(server)) + { + if (server->lobby.countdown_sec > 3) + { + server->lobby.countdown = 0; + server->lobby.countdown_sec = 4; + } + } + + return true; +} + +bool mapvote_state_handle(PeerData* v, Packet* packet) +{ + // Read header + PacketRead(passtrough, packet, packet_read8, uint8_t); + PacketRead(type, packet, packet_read8, uint8_t); + + Packet pack; + bool res = true; + + switch (type) + { + case CLIENT_VOTE_REQUEST: + { + if(!v->in_game) + break; + + PacketRead(map, packet, packet_read8, uint8_t); + AssertOrDisconnect(v->server, !v->voted); + AssertOrDisconnect(v->server, map >= 0); + AssertOrDisconnect(v->server, map < 3); + + v->server->lobby.votes[map]++; + v->voted = true; + + PacketCreate(&pack, SERVER_VOTE_SET); + for (int i = 0; i < 3; i++) + PacketWrite(&pack, packet_write8, v->server->lobby.votes[i]); + + Info("%s " LOG_RST "(id %d) voted for [" LOG_BLU "%s" LOG_RST "]!", v->nickname.value, v->id, g_mapList[v->server->lobby.maps[map]].name); + server_broadcast(v->server, &pack, true); + mapvote_check_state(v->server); + break; + } + + case CLIENT_CHAT_MESSAGE: + { + PacketRead(pid, packet, packet_read16, uint16_t); + PacketRead(msg, packet, packet_readstr, String); + AssertOrDisconnect(v->server, string_length(&msg) <= 40); + + v->timeout = 0; + Info("%s " LOG_RST "(id %d): %s", v->nickname.value, v->id, msg.value); + if (!server_cmd_handle(v->server, server_cmd_parse(&msg), v, &msg)) + server_broadcast_ex(v->server, packet, true, v->id); + + break; + } + + default: + RAssert(server_msg_handle(v->server, type, v, packet)); + break; + } + + return res; +} + +bool mapvote_state_tick(Server* server) +{ + bool res = true; + + if (server->lobby.countdown <= 0) + { + server->lobby.countdown += TICKSPERSEC; + + if (--server->lobby.countdown_sec == 0) + { + //choose the map + int8_t indeces[3] = { -1, -1, -1 }; + int count = 0; + + int largest = 0; + for (int i = 0; i < 3; i++) + { + uint8_t values = server->lobby.votes[i]; + if (values > largest) + { + largest = values; + count = 0; + } + + if (values == largest) + { + indeces[count] = server->lobby.maps[i]; + count++; + } + } + + // Find winner + int8_t won = indeces[rand() % count]; + server->last_map = won; + + // Decrease pickrate + if ((server->map_pickrates[won] -= 255) < 0) + server->map_pickrates[won] = 0; + + // Decrease pickrate for other maps + for (int8_t i = 0; i < 3; i++) + { + if ((server->map_pickrates[server->lobby.maps[i]] -= 25) < 0) + server->map_pickrates[server->lobby.maps[i]] = 0; + } + + Debug("Pickrates:"); + // Increase other map's pickrate + for (int8_t i = 0; i < MAP_COUNT; i++) + { + Debug(" %d: %d", i, server->map_pickrates[i]); + if (i == won) + continue; + + server->map_pickrates[i] += 25; + if (server->map_pickrates[i] >= 255) + server->map_pickrates[i] = 255; + } + + Info(LOG_YLW "Map is [" LOG_BLU "%s" LOG_RST "]", g_mapList[won].name); + + return charselect_init(won, server) || lobby_init(server); + } + + Packet pack; + PacketCreate(&pack, SERVER_VOTE_TIME_SYNC); + PacketWrite(&pack, packet_write8, server->lobby.countdown_sec); + server_broadcast(server, &pack, true); + } + + server->lobby.countdown -= server->delta; + + return res; +} + +bool mapvote_init(Server* server) +{ + Debug("Attepting to enter ST_MAPVOTE..."); + RAssert(server); + + // randomize + time_t seed = time(NULL); + Debug("Mapvote seed: %d", seed); + srand((unsigned int)seed); + + RAssert(server); + server->state = ST_MAPVOTE; + server->lobby.countdown_sec = 30; + server->lobby.countdown = TICKSPERSEC; + memset(server->lobby.votes, 0, sizeof(server->lobby.votes)); + + MutexLock(g_config.map_list_lock); + { + // first we check if map count is less than 3 + int8_t allowed[MAP_COUNT] = { 0 }; + int8_t allowed_count = 0; + + for (int8_t i = 0; i < MAP_COUNT; i++) + { + if (g_config.map_list[i]) + allowed[allowed_count++] = i; + } + + // skip right away if we only have 3 maps + if (allowed_count <= 3) + { + for (int8_t i = 0; i < allowed_count; i++) + { + for(int j = i; j < 3; j++) + server->lobby.maps[j] = allowed[i]; + } + goto skip_rand; + } + + int8_t map; + for (int i = 0; i < 3; i++) + { + gen: + map = allowed[rand() % allowed_count]; + + if (map == server->last_map) + goto gen; + + int num = rand() % 255; + if (num >= server->map_pickrates[map]) + { + Debug("%d vs %d lost", num, server->map_pickrates[map]); + goto gen; + } + + for (int j = 0; j < i; j++) + { + if (server->lobby.maps[j] == map) + goto gen; + } + + server->lobby.maps[i] = map; + } + + } +skip_rand: + MutexUnlock(g_config.map_list_lock); + + Packet pack; + PacketCreate(&pack, SERVER_VOTE_MAPS); + for (int i = 0; i < 3; i++) + PacketWrite(&pack, packet_write8, server->lobby.maps[i]); + server_broadcast(server, &pack, true); + + PacketCreate(&pack, SERVER_VOTE_TIME_SYNC); + PacketWrite(&pack, packet_write8, server->lobby.countdown_sec); + server_broadcast(server, &pack, true); + + Info(LOG_YLW "Server is now in " LOG_PUR "Map Vote"); + Info("Maps: " LOG_RED "[%s] " LOG_BLU "[%s] " LOG_YLW "[%s]", g_mapList[server->lobby.maps[0]].name, g_mapList[server->lobby.maps[1]].name, g_mapList[server->lobby.maps[2]].name); + return true; +} + +bool mapvote_state_join(PeerData* v) +{ + return true; +} + +bool mapvote_state_left(PeerData* v) +{ + if(server_ingame(v->server) <= 1) + return lobby_init(v->server); + + RAssert(mapvote_check_state(v->server)); + return true; +} \ No newline at end of file diff --git a/disasterserver_c/states/Results.c b/disasterserver_c/states/Results.c new file mode 100644 index 0000000..cb24f35 --- /dev/null +++ b/disasterserver_c/states/Results.c @@ -0,0 +1,243 @@ +#include +#include +#include +#include +#include + +#define PLRSTATE_ESCAPED 4 +#define PLRSTATE_ALIVE 3 +#define PLRSTATE_DEAD 2 +#define PLRSTATE_DEMONIZED 1 +#define PLRSTATE_EXE 0 + +const char* SHAMES_1[] = +{ + CLRCODE_RED "(my skill issue makes me allergic to moving)", + CLRCODE_RED "(i'm afraid to leave my camp spot)", + CLRCODE_RED "(how am i not bored of camping)", + CLRCODE_RED "(i'm too bad to move around the map)", + CLRCODE_RED "(i just like being a brick)" +}; +#define SHAMES1_CNT 5 + +const char* SHAMES_2[] = +{ + CLRCODE_RED "(i can't win without camping bodies)", + CLRCODE_RED "(i'm afraid revived players will make me lose)", + CLRCODE_RED "(i camp bodies cuz im bad)" +}; +#define SHAMES2_CNT 3 + +int compare(const PeerData** plr1, const PeerData** plr2) +{ + const PeerData* a = *plr1; + const PeerData* b = *plr2; + + if (a->plr.flags & PLAYER_KILLER || b->plr.flags & PLAYER_KILLER) + return ((b->plr.flags & PLAYER_KILLER) > 0) - ((a->plr.flags & PLAYER_KILLER) > 0); + + if (a->plr.flags & PLAYER_LEFT || b->plr.flags & PLAYER_LEFT) + return ((a->plr.flags & PLAYER_LEFT) > 0) - ((b->plr.flags & PLAYER_LEFT) > 0); + + if (a->plr.flags & PLAYER_DEMONIZED || b->plr.flags & PLAYER_DEMONIZED) + return ((a->plr.flags & PLAYER_DEMONIZED) > 0) - ((b->plr.flags & PLAYER_DEMONIZED) > 0); + + if (a->plr.flags & PLAYER_DEAD || b->plr.flags & PLAYER_DEAD) + return ((a->plr.flags & PLAYER_DEAD) > 0) - ((b->plr.flags & PLAYER_DEAD) > 0); + + return 0; +} + +int compare2(const PeerData** plr1, const PeerData** plr2) +{ + const PeerData* a = *plr1; + const PeerData* b = *plr2; + + if (a->plr.flags & PLAYER_KILLER || b->plr.flags & PLAYER_KILLER) + return ((b->plr.flags & PLAYER_KILLER) > 0) - ((a->plr.flags & PLAYER_KILLER) > 0); + + if (a->plr.flags & PLAYER_LEFT || b->plr.flags & PLAYER_LEFT) + return 0; + + if (a->plr.flags & PLAYER_DEMONIZED || b->plr.flags & PLAYER_DEMONIZED) + return 0; + + if ((a->plr.flags & PLAYER_DEAD) > 0 == (b->plr.flags & PLAYER_DEAD) > 0) + return (int)(b->plr.stats.danger_time - a->plr.stats.danger_time); + + return 0; +} + +bool results_send(Server* server, PeerData* v, PeerData* data, bool has_quit) +{ + uint8_t type = PLRSTATE_ALIVE; + + if (data->plr.flags & PLAYER_ESCAPED) + type = PLRSTATE_ESCAPED; + if (data->plr.flags & PLAYER_DEMONIZED) + type = PLRSTATE_DEMONIZED; + else if (data->plr.flags & PLAYER_DEAD) + type = PLRSTATE_DEAD; + else if (server->game.exe == data->id) + type = PLRSTATE_EXE; + + Packet pack; + PacketCreate(&pack, SERVER_RESULTS_DATA); + + String nickname; + const char* postfix = ""; + + if (g_config.pride) + { + if (data->plr.stats.brain_damage && (data->plr.flags & PLAYER_ESCAPED)) + postfix = SHAMES_1[rand() % SHAMES1_CNT]; + + if (data->plr.stats.camp_time >= 30 * TICKSPERSEC) + postfix = SHAMES_2[rand() % SHAMES2_CNT]; + } + + nickname.len = snprintf(nickname.value, 129, "%s %s", data->nickname.value, postfix) + 1; + + PacketWrite(&pack, packet_writestr, nickname); + PacketWrite(&pack, packet_write8, data->exe_char != EX_NONE ? data->exe_char : data->surv_char); + PacketWrite(&pack, packet_write8, server->game.ending); + PacketWrite(&pack, packet_write16, server->game.time_sec) + PacketWrite(&pack, packet_write8, has_quit); + PacketWrite(&pack, packet_write8, type); + + PacketWrite(&pack, packet_write16, data->plr.stats.rings); + PacketWrite(&pack, packet_write16, data->plr.stats.kills); + PacketWrite(&pack, packet_write16, data->plr.stats.damage); + PacketWrite(&pack, packet_write16, data->plr.stats.damage_taken); + PacketWrite(&pack, packet_write16, data->plr.stats.stun_time); + PacketWrite(&pack, packet_write16, data->plr.stats.stuns); + PacketWrite(&pack, packet_write16, data->plr.stats.hp_restored); + PacketWrite(&pack, packet_writedouble, data->plr.stats.survive_time); + PacketWrite(&pack, packet_writedouble, data->plr.stats.danger_time); + + return packet_send(v->peer, &pack, true); +} + +bool results_init(Server* server) +{ + Debug("Attepting to enter ST_RESULTS..."); + server->state = ST_RESULTS; + server->results.countdown = 15 * TICKSPERSEC; + + Packet pack; + PacketCreate(&pack, SERVER_RESULTS); + PacketWrite(&pack, packet_write8, server->game.map); + server_broadcast(server, &pack, true); + + Info("Server is now in " LOG_PUR "Results"); + return true; +} + +bool results_uninit(Server* server) +{ + for (size_t i = 0; i < server->game.entities.capacity; i++) + { + Entity* entity = (Entity*)server->game.entities.ptr[i]; + if (!entity) + continue; + + free(entity); + } + dylist_free(&server->game.entities); + + // Clean up after game + for (size_t i = 0; i < server->game.left.capacity; i++) + { + PeerData* player = (PeerData*)server->game.left.ptr[i]; + if (!player) + continue; + + free(player); + } + dylist_free(&server->game.left); + + return lobby_init(server); +} + +bool results_state_tick(Server* server) +{ + server->results.countdown -= server->delta; + + if (server->results.countdown <= 0) + return results_uninit(server); + + return true; +} + +bool results_state_handle(PeerData* v, Packet* packet) +{ + PacketRead(_passtrough, packet, packet_read8, uint8_t); + PacketRead(type, packet, packet_read8, uint8_t); + + switch (type) + { + case CLIENT_RESULTS_REQUEST: + { + PeerData* sort[7]; + int len = 0; + memset(sort, 0, sizeof(PeerData*) * 7); + + for (size_t i = 0; i < v->server->peers.capacity; i++) + { + PeerData* data = (PeerData*)v->server->peers.ptr[i]; + if (!data) + continue; + + if(!data->in_game) + continue; + + sort[len++] = data; + } + + for (size_t i = 0; i < v->server->game.left.capacity; i++) + { + PeerData* data = (PeerData*)v->server->game.left.ptr[i]; + if (!data) + continue; + + if(!data->in_game) + continue; + + sort[len++] = data; + } + + qsort(sort, len, sizeof(PeerData*), (int (*)(const void *, const void *))compare); + qsort(sort, len, sizeof(PeerData*), (int (*)(const void *, const void *))compare2); + + for (size_t i = 0; i < len; i++) + { + PeerData* data = (PeerData*)sort[i]; + if (!data) + continue; + + RAssert(results_send(v->server, v, data, data->plr.flags & PLAYER_LEFT)); + } + break; + } + + case CLIENT_CHAT_MESSAGE: + { + if (v->in_game) + break; + + PacketRead(pid, packet, packet_read16, uint16_t); + PacketRead(msg, packet, packet_readstr, String); + AssertOrDisconnect(v->server, string_length(&msg) <= 40); + + v->timeout = 0; + + Info("[%s] (id %d): %s", v->nickname.value, v->id, msg.value); + if (!server_cmd_handle(v->server, server_cmd_parse(&msg), v, &msg) && g_config.chatfix) + server_broadcast_msg(v->server, v->id, msg.value); + + break; + } + } + + return true; +} \ No newline at end of file diff --git a/disasterserver_c/ui/Button.c b/disasterserver_c/ui/Button.c new file mode 100644 index 0000000..eb3df94 --- /dev/null +++ b/disasterserver_c/ui/Button.c @@ -0,0 +1,40 @@ +#include + +bool button_update(SDL_Renderer* renderer, struct _Component* component) +{ + Button* button = (Button*)component; + SDL_FRect src = { button->x, button->y, button->w, button->h }; + SDL_FRect dst = { button->d_x * INTERFACE_SCALE, button->d_y * INTERFACE_SCALE, button->d_w * INTERFACE_SCALE, button->d_h * INTERFACE_SCALE }; + + float mouse_x, mouse_y; + float scale_x, scale_y; + Uint32 flags = SDL_GetMouseState(&mouse_x, &mouse_y); + SDL_GetRenderScale(renderer, &scale_x, &scale_y); + + mouse_x /= scale_x; + mouse_y /= scale_y; + + if(mouse_x >= dst.x && mouse_y >= dst.y && mouse_x < dst.x + dst.w && mouse_y < dst.y + dst.h) + { + src.x += src.w; + + if(flags & SDL_BUTTON_MASK(1)) + { + if(!button->clicked && button->cb) + { + button->clicked = true; + + if (!button->cb(component)) + return false; + } + dst.y += 2; + } + else + button->clicked = false; + } + else + button->clicked = false; + + SDL_RenderTexture(renderer, g_textureSheet, &src, &dst); + return true; +} diff --git a/disasterserver_c/ui/Components.h b/disasterserver_c/ui/Components.h new file mode 100644 index 0000000..8787686 --- /dev/null +++ b/disasterserver_c/ui/Components.h @@ -0,0 +1,138 @@ +#ifndef COMPONENTS_H +#define COMPONENTS_H +#include +#include +#include +#include + +#define COMPONENT_BODY float x, y, w, h; UpdateCallback update +#define COLOR_WHITE (SDL_Color) { 255, 255, 255, 255 } +#define COLOR_RED (SDL_Color) { 194, 0, 55, 255 } +#define COLOR_GRN (SDL_Color) { 15, 255, 57, 255 } +#define COLOR_PUR (SDL_Color) { 184, 36, 255, 255 } +#define COLOR_BLU (SDL_Color) { 93, 103, 255, 255 } +#define COLOR_GRA (SDL_Color) { 100, 100, 100, 255 } +#define COLOR_YLW (SDL_Color) { 255, 219, 0, 255 } +#define COLOR_ORG (SDL_Color) { 234, 96, 20, 255 } +#define INTERFACE_SCALE 2 + +extern int g_mouseWheel; + +struct _Component; +typedef bool (*UpdateCallback)(SDL_Renderer*, struct _Component*); +typedef struct _Component +{ + COMPONENT_BODY; +} Component; + +typedef struct +{ + COMPONENT_BODY; + const char* text; + int scale; +} Label; +#define LabelCreate(x, y, text, scale) (Label) { x, y, 0, 0, label_update, text, scale } +bool label_update(SDL_Renderer* renderer, struct _Component* component); + +typedef struct +{ + COMPONENT_BODY; + float d_x, d_y, d_w, d_h; +} Image; +#define ImageCreate(x, y, w, h, s_x, s_y, s_w, s_h) (Image) { s_x, s_y, s_w, s_h, image_update, x, y, w, h } +bool image_update(SDL_Renderer* renderer, struct _Component* component); + +typedef bool (*ButtonCallback)(struct _Component* component); +typedef struct +{ + COMPONENT_BODY; + float d_x, d_y, d_w, d_h; + ButtonCallback cb; + bool clicked; +} Button; +#define ButtonCreate(x, y, w, h, cb, s_x, s_y, s_w, s_h) (Button) { s_x, s_y, s_w, s_h, button_update, x, y, w, h, cb, false } +bool button_update(SDL_Renderer* renderer, struct _Component* component); + +typedef struct +{ + COMPONENT_BODY; + float d_x, d_y, d_w, d_h; + ButtonCallback cb; + bool clicked, reverse; + bool* value; +} ToggleButton; +#define TButtonCreate(x, y, w, h, cb, pointer, reverse, s_x, s_y, s_w, s_h) (ToggleButton) { s_x, s_y, s_w, s_h, tbutton_update, x, y, w, h, cb, false, reverse, pointer } +bool tbutton_update(SDL_Renderer* renderer, struct _Component* component); + +typedef struct +{ + COMPONENT_BODY; + float d_x, d_y, d_w, d_h; + ButtonCallback cb; + bool clicked; + PeerData peer; +} PlayerButton; + +typedef struct +{ + COMPONENT_BODY; + bool clicked; + ButtonCallback cb; + float scroll, target_scroll; +} MapList; +#define MapListCreate(x, y, w, h, cb) (MapList) { x, y, w, h, maplist_update, false, cb, 0, 0 } +bool maplist_update(SDL_Renderer* renderer, struct _Component* component); + +typedef struct +{ + COMPONENT_BODY; + bool clicked; + int preset; + Label label; +} MapListPreset; +#define MapListPresetCreate(x, y, w, h) (MapListPreset) { x, y, w, h, mappreset_update, false, 0 } +bool mappreset_update(SDL_Renderer* renderer, struct _Component* component); + +typedef struct +{ + COMPONENT_BODY; + bool clicked; + int preset; + Label label; +} PingLimit; +#define PingLimitCreate(x, y, w, h) (PingLimit) { x, y, w, h, ping_update, false, 0 } +bool ping_update(SDL_Renderer* renderer, struct _Component* component); + +typedef struct +{ + COMPONENT_BODY; + bool clicked; + PeerData peers[7]; +} PlayerList; + +#define PlayerListCreate(x, y) (PlayerList) { x, y, 144, 176, playerlist_update, false, {0} } +bool playerlist_update(SDL_Renderer* renderer, struct _Component* component); + +typedef struct +{ + COMPONENT_BODY; + float d_x, d_y, d_w, d_h; + ButtonCallback cb; + bool clicked; + + const char* collection; + cJSON* root; + const char* key; +} DeleteButton; + +typedef struct +{ + COMPONENT_BODY; + bool clicked; + int page; +} PlayerListConfig; +#define PlayerListConfigCreate(x, y, update) (PlayerListConfig) { x, y, 144, 176, update, false, 0 } +bool playerlist_bans_update(SDL_Renderer* renderer, struct _Component* component); +bool playerlist_op_update(SDL_Renderer* renderer, struct _Component* component); + +#endif diff --git a/disasterserver_c/ui/Image.c b/disasterserver_c/ui/Image.c new file mode 100644 index 0000000..56338cb --- /dev/null +++ b/disasterserver_c/ui/Image.c @@ -0,0 +1,12 @@ +#include + +bool image_update(SDL_Renderer* renderer, struct _Component* component) +{ + Image* image = (Image*)component; + + SDL_FRect src = { image->x, image->y, image->w, image->h }; + SDL_FRect dst = { image->d_x * INTERFACE_SCALE, image->d_y * INTERFACE_SCALE, image->d_w * INTERFACE_SCALE, image->d_h * INTERFACE_SCALE }; + SDL_RenderTexture(renderer, g_textureSheet, &src, &dst); + + return true; +} diff --git a/disasterserver_c/ui/Label.c b/disasterserver_c/ui/Label.c new file mode 100644 index 0000000..b3209b3 --- /dev/null +++ b/disasterserver_c/ui/Label.c @@ -0,0 +1,185 @@ +#include +#include + +bool label_update(SDL_Renderer* renderer, struct _Component* component) +{ + Label* label = (Label*)component; + float x = label->x; + float y = label->y; + SDL_Color clr = COLOR_WHITE; + + for (int i = 0; i < utf8_strlen(label->text); i++) + { + utf8_char c = utf8_tolower(utf8_get(label->text, i)); + + int ind; + switch (c) + { + case '\n': + x = label->x; + y += 8; + continue; + + case ' ': + x += 5; + continue; + + case ' ': + x += 10; + continue; + + case '-': + case '_': + ind = 26; + break; + + case ',': + ind = 27; + break; + + case '1': + ind = 28; + break; + + case '2': + ind = 29; + break; + + case '3': + ind = 30; + break; + + case '4': + ind = 31; + break; + + case '5': + ind = 32; + break; + + case '6': + ind = 33; + break; + + case '7': + ind = 34; + break; + + case '8': + ind = 35; + break; + + case '9': + ind = 36; + break; + + case '0': + ind = 37; + break; + + case '!': + case '.': + ind = 38; + break; + + case '\'': + ind = 39; + break; + + case ':': + ind = 40; + break; + + case '(': + case '[': + case '<': + ind = 41; + break; + + case ')': + case ']': + case '>': + ind = 42; + break; + + case '%': + ind = 43; + break; + + case '+': + ind = 77; + break; + + case '\\': + clr = COLOR_RED; + continue; + + case '@': + clr = COLOR_GRN; + continue; + + case '&': + clr = COLOR_PUR; + continue; + + case '/': + clr = COLOR_BLU; + continue; + + case '|': + clr = COLOR_GRA; + continue; + + case '`': + clr = COLOR_YLW; + continue; + + case '~': + clr = COLOR_WHITE; + continue; + + case 0x2116: + clr = COLOR_ORG; + continue; + + default: + if(c >= 'a' && c <= 'z') + ind = c - 97; + else if(c >= 0x0430 && c <= 0x044F) + ind = c - 0x0430 + 45; + else + ind = 44; + break; + } + + SDL_SetTextureColorMod(g_textureSheet, clr.r, clr.g, clr.b); + SDL_FRect src = { 480 + ind * 8, 432, 8, 6 }; + SDL_FRect dst = { x * label->scale, y * label->scale, 8 * label->scale, 6 * label->scale }; + SDL_RenderTexture(renderer, g_textureSheet, &src, &dst); + x += 6; + + switch (c) + { + case 'w': + case 'm': + case 'x': + case 'n': + case 0x043C: + case 0x0434: + case 0x0438: + case 0x0439: + case 0x044E: + case 0x044C: + case 0x043B: + case 0x0448: + case 0x0449: + case 0x0446: + case 0x0436: + x += 2; + break; + } + } + + SDL_SetTextureColorMod(g_textureSheet, 255, 255, 255); + return true; +} diff --git a/disasterserver_c/ui/Main.c b/disasterserver_c/ui/Main.c new file mode 100644 index 0000000..61c30e4 --- /dev/null +++ b/disasterserver_c/ui/Main.c @@ -0,0 +1,594 @@ +#include "Config.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +int lobby = 0; +enum +{ + UST_MAIN, + UST_OPTIONS, + UST_PLAYERS, + UST_INFO +} state; +char text_buffer[40][256]; +char info_text[1024]; +int text_index = 0; +int text_length = 0; +int g_mouseWheel = 0; +int g_pmouseWheel = 0; + +void init_info(); +bool main_menu(Component* component); +bool options_menu(Component* component); +bool players_menu(Component* component); +bool info_menu(Component* component); + +bool back_to_lobby(Component* component); +bool practice_mode(Component* component); +bool force_exe_win(Component* component); +bool force_surv_win(Component* component); + +bool map_list_changed(Component* component); +bool map_list_reset(Component* component); + +Component* main_components[] = +{ + (Component*)&(ImageCreate(0, 0, 480, 270, 0, 272, 480, 270)), + (Component*)&(ImageCreate(16, 48, 276, 176, 128, 0, 272, 176)), + (Component*)&(ImageCreate(199, 10, 64, 16, 1829, 0, 64, 16)), + + (Component*)&(ButtonCreate(59, 249, 32, 8, main_menu, 480, 400, 32, 8)), + (Component*)&(ButtonCreate(150, 249, 54, 8, options_menu, 480, 408, 54, 8)), + (Component*)&(ButtonCreate(268, 249, 53, 8, players_menu, 480, 416, 53, 8)), + (Component*)&(ButtonCreate(386, 249, 29, 8, info_menu, 480, 424, 29, 8)), + + (Component*)&(ButtonCreate(320, 106, 128, 20, back_to_lobby, 400, 0, 128, 20)), + (Component*)&(ButtonCreate(320, 136, 128, 20, practice_mode, 400 + 256, 0, 128, 20)), + (Component*)&(ButtonCreate(320, 166, 128, 20, force_exe_win, 400 + 512, 0, 128, 20)), + (Component*)&(ButtonCreate(320, 196, 128, 20, force_surv_win, 400 + 512 + 256, 0, 128, 20)), +}; + +Component* options_components[] = +{ + (Component*)&(MapListCreate(0, 38, 288, 195, map_list_changed)), + (Component*)&(ImageCreate(0, 0, 480, 270, 2256, 0, 480, 270)), + (Component*)&(ImageCreate(184, 10, 103, 16, 1925, 0, 103, 16)), + + (Component*)&(ButtonCreate(59, 249, 32, 8, main_menu, 480, 400, 32, 8)), + (Component*)&(ButtonCreate(150, 249, 54, 8, options_menu, 480, 408, 54, 8)), + (Component*)&(ButtonCreate(268, 249, 53, 8, players_menu, 480, 416, 53, 8)), + (Component*)&(ButtonCreate(386, 249, 29, 8, info_menu, 480, 424, 29, 8)), + + (Component*)&(MapListPresetCreate(320, 48, 128, 40)), + (Component*)&(ButtonCreate(320, 96, 128, 20, map_list_reset, 3540, 0, 128, 20)), + (Component*)&(PingLimitCreate(320, 125, 128, 40)), + (Component*)&(TButtonCreate(320, 172, 128, 20, (ButtonCallback)config_save, &g_config.anticheat, true, 3120, 0, 128, 20)), + (Component*)&(TButtonCreate(320, 200, 128, 20, (ButtonCallback)config_save, &g_config.pride, false, 2736, 0, 128, 20)), +}; + +Component* players_components[] = +{ + (Component*)&(ImageCreate(0, 0, 480, 270, 0, 272, 480, 270)), + (Component*)&(ImageCreate(179, 10, 112, 16, 2032, 0, 112, 16)), + + (Component*)&(PlayerListCreate(16, 48)), + (Component*)&(PlayerListConfigCreate(168, 48, playerlist_op_update)), + (Component*)&(PlayerListConfigCreate(320, 48, playerlist_bans_update)), + + (Component*)&(ButtonCreate(59, 249, 32, 8, main_menu, 480, 400, 32, 8)), + (Component*)&(ButtonCreate(150, 249, 54, 8, options_menu, 480, 408, 54, 8)), + (Component*)&(ButtonCreate(268, 249, 53, 8, players_menu, 480, 416, 53, 8)), + (Component*)&(ButtonCreate(386, 249, 29, 8, info_menu, 480, 424, 29, 8)), +}; + +Component* info_components[] = +{ + (Component*)&(ImageCreate(0, 0, 480, 270, 0, 272, 480, 270)), + (Component*)&(ImageCreate(208, 10, 55, 16, 2172, 0, 55, 16)), + (Component*)&(LabelCreate(4, 38 + 4, info_text, 2)), + + (Component*)&(ButtonCreate(59, 249, 32, 8, main_menu, 480, 400, 32, 8)), + (Component*)&(ButtonCreate(150, 249, 54, 8, options_menu, 480, 408, 54, 8)), + (Component*)&(ButtonCreate(268, 249, 53, 8, players_menu, 480, 416, 53, 8)), + (Component*)&(ButtonCreate(386, 249, 29, 8, info_menu, 480, 424, 29, 8)), +}; + +void log_msg(const char* type, const char* message) +{ + char msg[512]; + + if (strcmp(type, DEBUG_TYPE) == 0) + snprintf(msg, 512, "|%s~", message); + else if (strcmp(type, WARN_TYPE) == 0) + snprintf(msg, 512, "`%s~", message); + else if (strcmp(type, ERROR_TYPE) == 0) + snprintf(msg, 512, "\\%s~", message); + else + snprintf(msg, 512, "~%s", message); + + if (text_length > 39) + { + for (int i = 1; i < 40; i++) + strncpy(text_buffer[i - 1], text_buffer[i], 255); + } + + strncpy(text_buffer[text_index], msg, 255); + + if (text_index < 39) + text_index++; + + if (text_length < 40) + text_length++; +} + +int server_loop(void) +{ + if (!disaster_init()) + return 1; + + return disaster_run(); +} + +int console_loop(void) +{ + SDL_Quit(); + +#ifdef WIN32 + AllocConsole(); + (void)freopen("CONOUT$", "w", stdout); +#endif + + return server_loop(); +} + +int main(int argc, char** argv) +{ + if (argc > 1) + { + for (int i = 1; i < argc; i++) + { + if (strcmp(argv[i], "--nogui") == 0) + return console_loop(); + } + } + + if (!SDL_Init(SDL_INIT_VIDEO)) + { + char msg[1024]; + snprintf(msg, 1024, "%s\n\nPress OK to fallback to console mode.", SDL_GetError()); + + SDL_ShowSimpleMessageBox(SDL_MESSAGEBOX_ERROR, "Error (Report to dev)", msg, NULL); + return console_loop(); + } + + SDL_Window* window = SDL_CreateWindow("DisasterServer v" STRINGIFY(BUILD_VERSION) " (Modified)", 480 * INTERFACE_SCALE, 270 * INTERFACE_SCALE, 0); + if (window == NULL) + { + char msg[1024]; + snprintf(msg, 1024, "%s\n\nPress OK to fallback to console mode.", SDL_GetError()); + + SDL_ShowSimpleMessageBox(SDL_MESSAGEBOX_ERROR, "Error (Report to dev)", msg, NULL); + return console_loop(); + } + + SDL_Renderer *renderer = SDL_CreateRenderer(window, NULL); + + if (renderer == NULL) + { + char msg[1024]; + snprintf(msg, 1024, "%s\n\nPress OK to fallback to console mode.", SDL_GetError()); + + SDL_ShowSimpleMessageBox(SDL_MESSAGEBOX_ERROR, "Error (Report to dev)", msg, NULL); + return console_loop(); + } + + SDL_SetDefaultTextureScaleMode(renderer, SDL_SCALEMODE_NEAREST); + + if (!resources_load(renderer)) + return console_loop(); + + init_info(); + log_hook(log_msg); + SDL_SetRenderLogicalPresentation(renderer, 480 * INTERFACE_SCALE, 270 * INTERFACE_SCALE, SDL_LOGICAL_PRESENTATION_INTEGER_SCALE); + SDL_SetRenderVSync(renderer, true); + + Label label; + Thread thr; + ThreadSpawn(thr, server_loop, NULL); + + bool running = true; + float bg = 0; + + while (running) + { + SDL_Event ev; + while (SDL_PollEvent(&ev)) + { + switch (ev.type) + { + case SDL_EVENT_QUIT: + running = false; + break; + + case SDL_EVENT_MOUSE_WHEEL: + g_mouseWheel = ev.wheel.y; + break; + } + } + + SDL_RenderClear(renderer); + { + SDL_FRect src = { 480 + ((int)bg / 3 % 28) * 96, 446, 96, 96 }; + for(int i = 0; i < 6 * INTERFACE_SCALE; i++) + { + for(int j = 0; j < 3 * INTERFACE_SCALE; j++) + { + SDL_FRect dst = { -((int)bg / 2 % 96) + i * 96, j * 96, 96, 96 }; + SDL_RenderTexture(renderer, g_textureSheet, &src, &dst); + } + } + + switch (state) + { + case UST_MAIN: + { + for (int i = 0; i < sizeof(main_components) / sizeof(Component*); i++) + main_components[i]->update(renderer, main_components[i]); + + for (int i = 0; i < text_length; i++) + { + label = LabelCreate(23 * 2, 55 * 2 + i * 8, text_buffer[i], 1); + label.update(renderer, (Component*)&label); + } + + break; + } + + case UST_OPTIONS: + { + for (int i = 0; i < sizeof(options_components) / sizeof(Component*); i++) + options_components[i]->update(renderer, options_components[i]); + + break; + } + + case UST_PLAYERS: + { + for (int i = 0; i < sizeof(players_components) / sizeof(Component*); i++) + players_components[i]->update(renderer, players_components[i]); + + break; + } + + case UST_INFO: + { + for (int i = 0; i < sizeof(info_components) / sizeof(Component*); i++) + info_components[i]->update(renderer, info_components[i]); + + break; + } + } + + g_mouseWheel = 0; + bg += 0.64; + } + SDL_RenderPresent(renderer); + SDL_Delay(32); + } + + return 0; +} + +void init_info() +{ + char compiler[128]; + + #ifdef __clang__ + snprintf(compiler, 128, "clang %d.%d.%d\n", __clang_major__, __clang_minor__, __clang_patchlevel__); + #elif defined(__GNUC__) + snprintf(compiler, 128, "gcc %d.%d.%d\n", __GNUC__, __GNUC_MINOR__, __GNUC_PATCHLEVEL__); + #elif defined(_MSC_VER) + snprintf(compiler, 128, "msvc %d", _MSC_VER); + #else + snprintf(compiler, 128, "unknown"); + #endif + + + snprintf(info_text, 1024, INFO_TEXT, compiler, SDL_MAJOR_VERSION, SDL_MINOR_VERSION, SDL_MICRO_VERSION, SDL_IMAGE_MAJOR_VERSION, SDL_IMAGE_MINOR_VERSION, SDL_IMAGE_MICRO_VERSION); +} + +bool main_menu(Component* component) +{ + state = UST_MAIN; + return true; +} + +bool options_menu(Component* component) +{ + state = UST_OPTIONS; + return true; +} + +bool players_menu(Component* component) +{ + state = UST_PLAYERS; + return true; +} + +bool info_menu(Component* component) +{ + state = UST_INFO; + return true; +} + +bool back_to_lobby(Component* component) +{ + Server* server = disaster_get(lobby); + + if(!server) + { + SDL_ShowSimpleMessageBox(SDL_MESSAGEBOX_ERROR, "Error (Report to dev)", "Server is not running (Check logs in Info tab)!", NULL); + return false; + } + + MutexLock(server->state_lock); + { + if(server->state != ST_LOBBY && !lobby_init(server)) + SDL_ShowSimpleMessageBox(SDL_MESSAGEBOX_ERROR, "Error (Report to dev)", "Failed to return to lobby: lobby_init() returned FALSE", NULL); + } + MutexUnlock(server->state_lock); + return true; +} + +bool practice_mode(Component* component) +{ + Server* server = disaster_get(lobby); + + if(!server) + { + SDL_ShowSimpleMessageBox(SDL_MESSAGEBOX_ERROR, "Error (Report to dev)", "Server is not running (Check logs in Info tab)!", NULL); + return false; + } + + MutexLock(server->state_lock); + { + if(server->state == ST_LOBBY && server_ingame(server) > 1) + { + if(!charselect_init(20, server)) + { + SDL_ShowSimpleMessageBox(SDL_MESSAGEBOX_ERROR, "Error (Report to dev)", "Failed to set practice mode: charselect_init() returned FALSE", NULL); + } + } + } + MutexUnlock(server->state_lock); + + return true; +} + +bool force_exe_win(Component* component) +{ + Server* server = disaster_get(lobby); + + if(!server) + { + SDL_ShowSimpleMessageBox(SDL_MESSAGEBOX_ERROR, "Error (Report to dev)", "Server is not running (Check logs in Info tab)!", NULL); + return false; + } + + MutexLock(server->state_lock); + { + if(server->state == ST_GAME) + { + if(!game_end(server, ED_EXEWIN, false)) + { + SDL_ShowSimpleMessageBox(SDL_MESSAGEBOX_ERROR, "Error (Report to dev)", "Failed to set exe win: game_end() returned FALSE", NULL); + } + } + } + MutexUnlock(server->state_lock); + + return true; +} + +bool force_surv_win(Component* component) +{ + Server* server = disaster_get(lobby); + + if(!server) + { + SDL_ShowSimpleMessageBox(SDL_MESSAGEBOX_ERROR, "Error (Report to dev)", "Server is not running (Check logs in Info tab)!", NULL); + return false; + } + + MutexLock(server->state_lock); + { + if(server->state == ST_GAME) + { + if(!game_end(server, ED_SURVWIN, false)) + { + SDL_ShowSimpleMessageBox(SDL_MESSAGEBOX_ERROR, "Error (Report to dev)", "Failed to set surv win: game_end() returned FALSE", NULL); + } + } + } + MutexUnlock(server->state_lock); + + return true; +} + +bool map_list_changed(Component* component) +{ + MapListPreset* preset_list = (MapListPreset*)options_components[7]; + preset_list->preset = PRESET_CUSTOM; + + for (int i = 0; i < PRESET_COUNT; i++) + { + if (memcmp(g_config.map_list, g_defaultPresets[i].values, sizeof(g_config.map_list)) == 0) + { + preset_list->preset = i; + break; + } + } + + return true; +} + +bool map_list_reset(Component* component) +{ + MapListPreset* preset_list = (MapListPreset*)options_components[7]; + preset_list->preset = PRESET_CUSTOM; + + MutexLock(g_config.map_list_lock); + memset(g_config.map_list, 0, sizeof(g_config.map_list)); + MutexUnlock(g_config.map_list_lock); + return true; +} + +void ui_update_playerlist(Server* server) +{ + if(!server) // just in case + return; + + if(server->id != 0) // we only update 0 server + return; + + PlayerList* list = (PlayerList*)players_components[2]; + for(size_t i = 0; i < server->peers.capacity; i++) + { + PeerData* player = (PeerData*)server->peers.ptr[i]; + if(!player) + { + memset(&list->peers[i], 0, sizeof(list->peers[i])); + continue; + } + + memcpy(&list->peers[i], server->peers.ptr[i], sizeof(list->peers[i])); + } +} + +bool ui_update_delete(Component* component) +{ + DeleteButton* delete = (DeleteButton*)component; + if (cJSON_HasObjectItem(delete->root, delete->key)) + { + cJSON_DeleteItemFromObject(delete->root, delete->key); + + if (!collection_save(delete->collection, delete->root)) + SDL_ShowSimpleMessageBox(SDL_MESSAGEBOX_ERROR, "Error (Report to dev)", "Failed to save collection!", NULL); + } + return false; +} + +bool ui_button_op(struct _Component* component) +{ + PlayerButton* button = (PlayerButton*)component; + Server* server = disaster_get(lobby); + + bool res = true; + MutexLock(server->state_lock); + { + for(size_t i = 0; i < server->peers.capacity; i++) + { + PeerData* peer = (PeerData*)server->peers.ptr[i]; + if(!peer) + continue; + + if(peer->id != button->peer.id) + continue; + + if(strcmp(peer->nickname.value, button->peer.nickname.value) != 0) + continue; + + if(strcmp(peer->udid.value, button->peer.udid.value) != 0) + continue; + + if (peer->op) + break; + + peer->op = true; + + server_send_msg(server, peer->peer, CLRCODE_GRN "you're an operator now"); + res = op_add(peer->nickname.value, peer->ip.value); + } + } + MutexUnlock(server->state_lock); + + RAssert(res); + return false; +} + +bool ui_button_kick(struct _Component* component) +{ + PlayerButton* button = (PlayerButton*)component; + Server* server = disaster_get(lobby); + + bool res = true; + MutexLock(server->state_lock); + { + for(size_t i = 0; i < server->peers.capacity; i++) + { + PeerData* peer = (PeerData*)server->peers.ptr[i]; + if(!peer) + continue; + + if(peer->id != button->peer.id) + continue; + + if(strcmp(peer->nickname.value, button->peer.nickname.value) != 0) + continue; + + if(strcmp(peer->udid.value, button->peer.udid.value) != 0) + continue; + + server_disconnect(server, peer->peer, DR_KICKEDBYHOST, NULL); + res = timeout_set(peer->nickname.value, peer->udid.value, peer->ip.value, time(NULL) + 5); + } + } + MutexUnlock(server->state_lock); + + RAssert(res); + return false; +} + +bool ui_button_ban(struct _Component* component) +{ + PlayerButton* button = (PlayerButton*)component; + Server* server = disaster_get(lobby); + + bool res = true; + MutexLock(server->state_lock); + { + for(size_t i = 0; i < server->peers.capacity; i++) + { + PeerData* peer = (PeerData*)server->peers.ptr[i]; + if(!peer) + continue; + + if(peer->id != button->peer.id) + continue; + + if(strcmp(peer->nickname.value, button->peer.nickname.value) != 0) + continue; + + if(strcmp(peer->udid.value, button->peer.udid.value) != 0) + continue; + + server_disconnect(server, peer->peer, DR_BANNEDBYHOST, NULL); + res = ban_add(peer->nickname.value, peer->udid.value, peer->ip.value); + } + } + MutexUnlock(server->state_lock); + + RAssert(res); + return false; +} \ No newline at end of file diff --git a/disasterserver_c/ui/Main.h b/disasterserver_c/ui/Main.h new file mode 100644 index 0000000..7d37926 --- /dev/null +++ b/disasterserver_c/ui/Main.h @@ -0,0 +1,15 @@ +#ifndef MAIN_H +#define MAIN_H +#include +#include +#include + +void ui_update_playerlist(Server* server); + +bool ui_update_delete(struct _Component* component); + +bool ui_button_op(struct _Component* component); +bool ui_button_kick(struct _Component* component); +bool ui_button_ban(struct _Component* component); + +#endif \ No newline at end of file diff --git a/disasterserver_c/ui/MapList.c b/disasterserver_c/ui/MapList.c new file mode 100644 index 0000000..534862b --- /dev/null +++ b/disasterserver_c/ui/MapList.c @@ -0,0 +1,77 @@ +#include +#include +#include +#include +#include + +const int low_bound = -(MAP_COUNT/4 * 124 - 124/2 - 194); + +bool maplist_update(SDL_Renderer* renderer, struct _Component* component) +{ + MapList* list = (MapList*)component; + SDL_Rect bounds = { list->x * INTERFACE_SCALE, list->y * INTERFACE_SCALE, list->w * INTERFACE_SCALE, list->h * INTERFACE_SCALE }; + + float mouse_x, mouse_y; + float scale_x, scale_y; + Uint32 flags = SDL_GetMouseState(&mouse_x, &mouse_y); + SDL_GetRenderScale(renderer, &scale_x, &scale_y); + + mouse_x /= scale_x; + mouse_y /= scale_y; + + bool mouse_down = false; + if(flags & SDL_BUTTON_MASK(1)) + { + if(!list->clicked) + { + mouse_down = true; + list->clicked = true; + } + } + else + list->clicked = false; + + bool in_bounds = mouse_x >= bounds.x && mouse_y >= bounds.y && mouse_x < bounds.x + bounds.w && mouse_y < bounds.y + bounds.h; + if(in_bounds) + { + list->target_scroll += g_mouseWheel * 45; + if(list->target_scroll >= 0) + list->target_scroll = 0; + + if(list->target_scroll < low_bound) + list->target_scroll = low_bound; + } + + list->scroll = lerp(list->scroll, list->target_scroll, 0.30); + + MutexLock(g_config.map_list_lock); + for(int i = 0; i < MAP_COUNT; i++) + { + SDL_FRect src = { 0, 272, 123, 104 }; + SDL_FRect dst = { 8 + i % 4 * 143, 90 + i / 4 * 124 + list->scroll, 123, 104 }; + + src.x = 480 + i * src.w; + + if(in_bounds && mouse_x >= dst.x && mouse_y >= dst.y && mouse_x < dst.x + dst.w && mouse_y < dst.y + dst.h) + { + dst.y -= 2; + + if (mouse_down) + { + g_config.map_list[i] = !g_config.map_list[i]; + list->cb(component); + } + + if(flags & SDL_BUTTON_MASK(1)) + dst.y += 2; + } + + const Uint8 color = g_config.map_list[i] ? 255 : 96; + SDL_SetTextureColorMod(g_textureSheet, color, color, color); + SDL_RenderTexture(renderer, g_textureSheet, &src, &dst); + } + MutexUnlock(g_config.map_list_lock); + + SDL_SetTextureColorMod(g_textureSheet, 255, 255, 255); + return true; +} diff --git a/disasterserver_c/ui/MapListPreset.c b/disasterserver_c/ui/MapListPreset.c new file mode 100644 index 0000000..b4ed18e --- /dev/null +++ b/disasterserver_c/ui/MapListPreset.c @@ -0,0 +1,71 @@ +#include +#include + +bool mappreset_update(SDL_Renderer* renderer, struct _Component* component) +{ + MapListPreset* list = (MapListPreset*)component; + SDL_FRect src = { 4016, 0, 128, 40 }; + SDL_FRect dst = { list->x * INTERFACE_SCALE, list->y * INTERFACE_SCALE, list->w * INTERFACE_SCALE, list->h * INTERFACE_SCALE }; + + float mouse_x, mouse_y; + float scale_x, scale_y; + Uint32 flags = SDL_GetMouseState(&mouse_x, &mouse_y); + SDL_GetRenderScale(renderer, &scale_x, &scale_y); + + bool mouse_down = false; + if (flags & SDL_BUTTON_MASK(1)) + { + if (!list->clicked) + { + mouse_down = true; + list->clicked = true; + } + } + else + list->clicked = false; + + mouse_x /= scale_x; + mouse_y /= scale_y; + + if (mouse_x >= dst.x && mouse_y >= dst.y && mouse_x < dst.x + dst.w && mouse_y < dst.y + dst.h) + { + src.x += src.w; + + SDL_FRect arrow_src = { 1680, 0, 116, 32 }; + SDL_FRect arrow_dst = { dst.x, dst.y, 116 * INTERFACE_SCALE, 32 * INTERFACE_SCALE }; + + if (mouse_down) + { + arrow_dst.y += 2; + + MutexLock(g_config.map_list_lock); + { + if (mouse_x < dst.x + dst.w / 2) + { + if (--list->preset < 0) + list->preset = PRESET_COUNT - 2; + } + else + { + if (++list->preset >= PRESET_COUNT - 1) + list->preset = 0; + } + + memcpy(g_config.map_list, g_defaultPresets[list->preset].values, sizeof(g_config.map_list)); + } + MutexUnlock(g_config.map_list_lock); + } + + SDL_RenderTexture(renderer, g_textureSheet, &src, &dst); + SDL_RenderTexture(renderer, g_textureSheet, &arrow_src, &arrow_dst); + } + else + SDL_RenderTexture(renderer, g_textureSheet, &src, &dst); + + list->label.scale = INTERFACE_SCALE; + list->label.x = dst.x / INTERFACE_SCALE + 8; + list->label.y = dst.y / INTERFACE_SCALE + 25; + list->label.text = g_defaultPresets[list->preset].name; + label_update(renderer, (Component*)&list->label); + return true; +} \ No newline at end of file diff --git a/disasterserver_c/ui/PingPreset.c b/disasterserver_c/ui/PingPreset.c new file mode 100644 index 0000000..53aa53c --- /dev/null +++ b/disasterserver_c/ui/PingPreset.c @@ -0,0 +1,113 @@ +#include "Colors.h" +#include +#include + +bool ping_update(SDL_Renderer* renderer, struct _Component* component) +{ + PingLimit* list = (PingLimit*)component; + SDL_FRect src = { 4272, 0, 128, 40 }; + SDL_FRect dst = { list->x * INTERFACE_SCALE, list->y * INTERFACE_SCALE, list->w * INTERFACE_SCALE, list->h * INTERFACE_SCALE }; + + float mouse_x, mouse_y; + float scale_x, scale_y; + Uint32 flags = SDL_GetMouseState(&mouse_x, &mouse_y); + SDL_GetRenderScale(renderer, &scale_x, &scale_y); + + bool mouse_down = false; + if (flags & SDL_BUTTON_MASK(1)) + { + if (!list->clicked) + { + mouse_down = true; + list->clicked = true; + } + } + else + list->clicked = false; + + mouse_x /= scale_x; + mouse_y /= scale_y; + + if (mouse_x >= dst.x && mouse_y >= dst.y && mouse_x < dst.x + dst.w && mouse_y < dst.y + dst.h) + { + src.x += src.w; + + SDL_FRect arrow_src = { 1680, 0, 116, 32 }; + SDL_FRect arrow_dst = { dst.x, dst.y, 116 * INTERFACE_SCALE, 32 * INTERFACE_SCALE }; + + const char* text; + + if (mouse_down) + { + arrow_dst.y += 2; + + if (mouse_x < dst.x + dst.w / 2) + { + if (--list->preset < 0) + list->preset = PING_PRESET_COUNT - 1; + } + else + { + if (++list->preset >= PING_PRESET_COUNT) + list->preset = 0; + } + + g_config.ping_limit = g_defaultPingPresets[list->preset]; + config_save(); + } + + SDL_RenderTexture(renderer, g_textureSheet, &src, &dst); + SDL_RenderTexture(renderer, g_textureSheet, &arrow_src, &arrow_dst); + } + else + SDL_RenderTexture(renderer, g_textureSheet, &src, &dst); + + char* name; + switch (g_config.ping_limit) + { + case 80: + name = CLRCODE_RED "very strict"; + list->preset = 0; + break; + + case 120: + name = CLRCODE_YLW "strict"; + list->preset = 1; + break; + + case 180: + name = "forgiving"; + list->preset = 2; + break; + + case 250: + name = CLRCODE_GRN "defualt"; + list->preset = 3; + break; + + case UINT16_MAX: + name = CLRCODE_PUR "unlimited"; + list->preset = 4; + break; + + default: + name = "custom"; + list->preset = 0; + break; + } + + list->label.scale = INTERFACE_SCALE; + list->label.x = dst.x / INTERFACE_SCALE + 8; + list->label.y = dst.y / INTERFACE_SCALE + 25; + + char value[128]; + + if(list->preset == 4) + snprintf(value, 128, "%s", name); + else + snprintf(value, 128, "%s - " CLRCODE_RST "%d", name, g_config.ping_limit); + + list->label.text = value; + label_update(renderer, (Component*)&list->label); + return true; +} \ No newline at end of file diff --git a/disasterserver_c/ui/PlayerList.c b/disasterserver_c/ui/PlayerList.c new file mode 100644 index 0000000..6d88aa2 --- /dev/null +++ b/disasterserver_c/ui/PlayerList.c @@ -0,0 +1,261 @@ +#include "Config.h" +#include "cJSON.h" +#include "io/Threads.h" +#include +#include +#include +#include +#include + +bool playerlist_update(SDL_Renderer* renderer, struct _Component* component) +{ + PlayerList* list = (PlayerList*)component; + SDL_FRect src = { 4528, 0, 144, 176 }; + SDL_FRect dst = { list->x * INTERFACE_SCALE, list->y * INTERFACE_SCALE, list->w * INTERFACE_SCALE, list->h * INTERFACE_SCALE }; + + SDL_Point mouse; + float scale_x, scale_y; + float mo_x = 0; + float mo_y = 0; + + Uint32 flags = SDL_GetMouseState(&mo_x, &mo_y); + mouse.x = mo_x; + mouse.y = mo_y; + + SDL_GetRenderScale(renderer, &scale_x, &scale_y); + + mouse.x /= scale_x; + mouse.y /= scale_y; + + if (!(flags & SDL_BUTTON_MASK(1))) + list->clicked = false; + + SDL_RenderTexture(renderer, g_textureSheet, &src, &dst); + + SDL_FRect title_src = { 4672, 0, 80, 8 }; + SDL_FRect title_dst = { (list->x + 32) * INTERFACE_SCALE, (list->y + 6) * INTERFACE_SCALE, 80 * INTERFACE_SCALE, 8 * INTERFACE_SCALE }; + SDL_RenderTexture(renderer, g_textureSheet, &title_src, &title_dst); + + Label label = LabelCreate(list->x + 8, list->y + 8, "", INTERFACE_SCALE); + PlayerButton op = (PlayerButton){ 4672, 16, 15, 8, button_update, list->x + 20 * 2, list->y - 2 + 8, 15, 8, ui_button_op, 0, { 0 } }; + PlayerButton kick = (PlayerButton){ 4672, 24, 29, 8, button_update, list->x + 31 * 2, list->y - 2 + 8, 29, 8, ui_button_kick, 0, { 0 } }; + PlayerButton ban = (PlayerButton){ 4672, 32, 24, 8, button_update, list->x + 49 * 2, list->y - 2 + 8, 24, 8, ui_button_ban, 0, { 0 } }; + + for(int i = 0; i < 7; i++) + { + if(list->peers[i].nickname.len == 0) + continue; + + label.y += 8 * INTERFACE_SCALE; + op.d_y += 8 * INTERFACE_SCALE; + kick.d_y += 8 * INTERFACE_SCALE; + ban.d_y += 8 * INTERFACE_SCALE; + + SDL_Rect check = (SDL_Rect){ (label.x - 2) * INTERFACE_SCALE, (label.y - 4) * INTERFACE_SCALE, 132 * INTERFACE_SCALE, 12 * INTERFACE_SCALE }; + char text[128]; + + if(!list->clicked && SDL_PointInRect(&mouse, &check)) + { + SDL_SetRenderDrawColor(renderer, 73, 0, 0, 255); + SDL_FRect fcheck = { check.x, check.y, check.w, check.h }; + SDL_RenderFillRect(renderer, &fcheck); + + snprintf(text, 128, "%s", "..."); + op.peer = list->peers[i]; + kick.peer = list->peers[i]; + ban.peer = list->peers[i]; + + if (!op.update(renderer, (Component*)&op) || !kick.update(renderer, (Component*)&kick) || !ban.update(renderer, (Component*)&ban)) + { + list->clicked = true; + break; + } + } + else + snprintf(text, 128, "%s", list->peers[i].nickname.value); + + SDL_SetRenderDrawColor(renderer, 255, 255, 255, 255); + label.text = text; + label.update(renderer, (Component*)&label); + } + + return true; +} + +bool playerlist_bans_update(SDL_Renderer* renderer, struct _Component* component) +{ + PlayerListConfig* list = (PlayerListConfig*)component; + SDL_FRect src = { 4528, 0, 144, 176 }; + SDL_FRect dst = { list->x * INTERFACE_SCALE, list->y * INTERFACE_SCALE, list->w * INTERFACE_SCALE, list->h * INTERFACE_SCALE }; + + SDL_FPoint mouse; + float scale_x, scale_y; + + float mo_x = 0; + float mo_y = 0; + Uint32 flags = SDL_GetMouseState(&mo_x, &mo_y); + mouse.x = mo_x; + mouse.y = mo_y; + SDL_GetRenderScale(renderer, &scale_x, &scale_y); + + mouse.x /= scale_x; + mouse.y /= scale_y; + + if (!(flags & SDL_BUTTON_MASK(1))) + list->clicked = false; + + SDL_RenderTexture(renderer, g_textureSheet, &src, &dst); + + SDL_FRect title_src = { 4763, 0, 58, 8 }; + SDL_FRect title_dst = { (list->x + 42) * INTERFACE_SCALE, (list->y + 6) * INTERFACE_SCALE, 58 * INTERFACE_SCALE, 8 * INTERFACE_SCALE }; + SDL_RenderTexture(renderer, g_textureSheet, &title_src, &title_dst); + + Label label = LabelCreate(list->x + 8, list->y + 8, "", INTERFACE_SCALE); + DeleteButton delete = (DeleteButton){ 4672, 40, 43, 8, button_update, list->x + 20 * 2, list->y - 2 + 8, 43, 8, ui_update_delete, false, BANS_FILE, g_bans, NULL }; + + MutexLock(g_banMut); + { + if (SDL_PointInRectFloat(&mouse, &dst)) + { + list->page -= g_mouseWheel; + list->page = SDL_clamp(list->page, 0, SDL_max((int)ceil(cJSON_GetArraySize(g_bans) / 9.0) - 1, 0)); + } + + size_t i = 0; + for(cJSON* ban = g_bans->child; ban; ban = ban->next) + { + if (!ban) + continue; + + if (i < list->page * 9) + { + i++; + continue; + } + else if (i >= list->page * 9 + 9) + break; + + label.y += 8 * INTERFACE_SCALE; + delete.d_y += 8 * INTERFACE_SCALE; + + SDL_FRect check = (SDL_FRect){ (label.x - 2) * INTERFACE_SCALE, (label.y - 4) * INTERFACE_SCALE, 132 * INTERFACE_SCALE, 12 * INTERFACE_SCALE }; + + if(!list->clicked && SDL_PointInRectFloat(&mouse, &check)) + { + SDL_SetRenderDrawColor(renderer, 73, 0, 0, 255); + SDL_RenderFillRect(renderer, &check); + SDL_SetRenderDrawColor(renderer, 255, 255, 255, 255); + + label.text = "..."; + label.update(renderer, (Component*)&label); + + delete.key = ban->string; + if (!delete.update(renderer, (Component*)&delete)) + { + list->clicked = true; + break; + } + } + else + { + char text[128]; + snprintf(text, 128, "%s" CLRCODE_RST " (%s)", cJSON_GetStringValue(ban), strstr(ban->string, "-") != NULL ? "udid" : "ip"); + SDL_SetRenderDrawColor(renderer, 255, 255, 255, 255); + + label.text = text; + label.update(renderer, (Component*)&label); + } + + i++; + } + } + MutexUnlock(g_banMut); + + return true; +} + +bool playerlist_op_update(SDL_Renderer* renderer, struct _Component* component) +{ + PlayerListConfig* list = (PlayerListConfig*)component; + SDL_FRect src = { 4528, 0, 144, 176 }; + SDL_FRect dst = { list->x * INTERFACE_SCALE, list->y * INTERFACE_SCALE, list->w * INTERFACE_SCALE, list->h * INTERFACE_SCALE }; + + SDL_FPoint mouse; + float scale_x, scale_y; + Uint32 flags = SDL_GetMouseState(&mouse.x, &mouse.y); + + SDL_GetRenderScale(renderer, &scale_x, &scale_y); + + mouse.x /= scale_x; + mouse.y /= scale_y; + + if (!(flags & SDL_BUTTON_MASK(1))) + list->clicked = false; + + SDL_RenderTexture(renderer, g_textureSheet, &src, &dst); + + SDL_FRect title_src = { 4672, 8, 96, 8 }; // Operator list + SDL_FRect title_dst = { (list->x + 24) * INTERFACE_SCALE, (list->y + 6) * INTERFACE_SCALE, 96 * INTERFACE_SCALE, 8 * INTERFACE_SCALE }; + SDL_RenderTexture(renderer, g_textureSheet, &title_src, &title_dst); + + Label label = LabelCreate(list->x + 8, list->y + 8, "", INTERFACE_SCALE); + DeleteButton delete = (DeleteButton){ 4672, 40, 43, 8, button_update, list->x + 20 * 2, list->y - 2 + 8, 43, 8, ui_update_delete, false, OPERATORS_FILE, g_ops, NULL }; + + MutexLock(g_opMut); + { + if (SDL_PointInRectFloat(&mouse, &dst)) + { + list->page -= g_mouseWheel; + list->page = SDL_clamp(list->page, 0, SDL_max((int)ceil(cJSON_GetArraySize(g_ops) / 9.0) - 1, 0)); + } + + size_t i = 0; + for (cJSON* op = g_ops->child; op; op = op->next) + { + if (!op) + continue; + + if (i < list->page * 9) + { + i++; + continue; + } + else if (i >= list->page * 9 + 9) + break; + + label.y += 8 * INTERFACE_SCALE; + delete.d_y += 8 * INTERFACE_SCALE; + + SDL_FRect check = { (label.x - 2) * INTERFACE_SCALE, (label.y - 4) * INTERFACE_SCALE, 132 * INTERFACE_SCALE, 12 * INTERFACE_SCALE }; + char text[128]; + + if(!list->clicked && SDL_PointInRectFloat(&mouse, &check)) + { + SDL_SetRenderDrawColor(renderer, 73, 0, 0, 255); + SDL_RenderFillRect(renderer, &check); + SDL_SetRenderDrawColor(renderer, 255, 255, 255, 255); + + label.text = "..."; + label.update(renderer, (Component*)&label); + + delete.key = op->string; + if (!delete.update(renderer, (Component*)&delete)) + { + list->clicked = true; + break; + } + } + else + { + SDL_SetRenderDrawColor(renderer, 255, 255, 255, 255); + label.text = cJSON_GetStringValue(op); + label.update(renderer, (Component*)&label); + } + + i++; + } + } + MutexUnlock(g_opMut); + + return true; +} \ No newline at end of file diff --git a/disasterserver_c/ui/Presets.c b/disasterserver_c/ui/Presets.c new file mode 100644 index 0000000..4763568 --- /dev/null +++ b/disasterserver_c/ui/Presets.c @@ -0,0 +1,16 @@ +#include + +Preset g_defaultPresets[] = +{ + { "default", { true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true } }, + { "classic", { false, false, true, false, true, false, true, true, true, false, false, false, true, false, true, false, false, false, false, false } }, + { "easy", { true, false, true, false, false, false, false, false, false, false, false, false, false, false, false, false, true, true, false, true } }, + { "medium", { false, true, false, true, true, false, false, true, false, false, false, true, true, false, true, false, false, false, false, false } }, + { "hard", { false, false, false, false, false, true, true, false, false, true, false, false, false, false, false, true, false, false, true, false } }, + { "madness", { false, false, false, false, false, false, false, false, true, false, true, false, false, true, false, false, false, false, false, false } }, + { "nightmare universe", { false, true, false, true, false, false, false, false, false, true, true, false, false, false, false, false, false, false, false, false } }, + { "spirits of hell", { true, false, false, false, false, true, false, false, false, false, false, true, false, true, false, false, false, false, false, false } }, + { "custom", { 0 } }, +}; + +int g_defaultPingPresets[] = { 80, 120, 180, 250, UINT16_MAX }; \ No newline at end of file diff --git a/disasterserver_c/ui/Presets.h b/disasterserver_c/ui/Presets.h new file mode 100644 index 0000000..1a87eb1 --- /dev/null +++ b/disasterserver_c/ui/Presets.h @@ -0,0 +1,19 @@ +#ifndef PRESETS_H +#define PRESETS_H +#include +#include + +typedef struct +{ + const char* name; + const bool values[MAP_COUNT]; +} Preset; + +extern Preset g_defaultPresets[]; +#define PRESET_COUNT 9 +#define PRESET_CUSTOM 8 + +extern int g_defaultPingPresets[]; +#define PING_PRESET_COUNT 5 + +#endif \ No newline at end of file diff --git a/disasterserver_c/ui/Resources.c b/disasterserver_c/ui/Resources.c new file mode 100644 index 0000000..30a6e07 --- /dev/null +++ b/disasterserver_c/ui/Resources.c @@ -0,0 +1,31 @@ +#include +#include +#include + +// Resources +#include + +SDL_Texture* g_textureSheet = NULL; +SDL_Texture* texture_load(SDL_Renderer* renderer, const void* data, unsigned int length) +{ + SDL_IOStream* rw = SDL_IOFromConstMem(data, (int)length); + SDL_Surface* img = IMG_Load_IO(rw, 0); + if (!img) + return NULL; + + SDL_Texture* texture = SDL_CreateTextureFromSurface(renderer, img); + SDL_DestroySurface(img); + + return texture; +} + +bool resources_load(SDL_Renderer* renderer) +{ + if (!(g_textureSheet = texture_load(renderer, Spritesheet_png, Spritesheet_png_len))) + { + SDL_ShowSimpleMessageBox(SDL_MESSAGEBOX_ERROR, "SDL ERROR", SDL_GetError(), NULL); + SDL_ShowSimpleMessageBox(SDL_MESSAGEBOX_ERROR, "Error (Report to dev)", "Failed to load " "g_textureSheet" "!\nPress OK to fallback to console mode.", NULL); + return 0; + } + return true; +} diff --git a/disasterserver_c/ui/Resources.h b/disasterserver_c/ui/Resources.h new file mode 100644 index 0000000..d82dd23 --- /dev/null +++ b/disasterserver_c/ui/Resources.h @@ -0,0 +1,17 @@ +#ifndef RESOURCES_H +#define RESOURCES_H +#include +#include +#include + +#define INFO_TEXT CLRCODE_PUR "disasterserverui " CLRCODE_BLU __DATE__ " " CLRCODE_GRN __TIME__ CLRCODE_RST "\n"\ +CLRCODE_RST "(c) 2024 team exe empire\n\n\n"\ +"game version: v" CLRCODE_PUR STRINGIFY(BUILD_VERSION) "\n"\ +CLRCODE_RST "compiler: " CLRCODE_PUR "%s\n"\ +CLRCODE_RST "sdl2 version: " CLRCODE_PUR "%d.%d.%d\n"\ +CLRCODE_RST "sdl2_image version: " CLRCODE_PUR "%d.%d.%d\n"\ + +extern SDL_Texture* g_textureSheet; +bool resources_load(SDL_Renderer* renderer); + +#endif diff --git a/disasterserver_c/ui/Spritesheet.h b/disasterserver_c/ui/Spritesheet.h new file mode 100644 index 0000000..4996080 --- /dev/null +++ b/disasterserver_c/ui/Spritesheet.h @@ -0,0 +1,17954 @@ +unsigned char Spritesheet_png[] = { + 0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00, 0x0d, + 0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x12, 0xd5, 0x00, 0x00, 0x02, 0x1e, + 0x08, 0x06, 0x00, 0x00, 0x00, 0xda, 0x6a, 0x37, 0xd7, 0x00, 0x00, 0x00, + 0x01, 0x73, 0x52, 0x47, 0x42, 0x00, 0xae, 0xce, 0x1c, 0xe9, 0x00, 0x00, + 0x20, 0x00, 0x49, 0x44, 0x41, 0x54, 0x78, 0x9c, 0xec, 0xdd, 0xbf, 0x8f, + 0xde, 0xe6, 0xbd, 0x20, 0xfa, 0x2f, 0x6d, 0x15, 0x0e, 0xa0, 0x62, 0x4e, + 0xc6, 0x06, 0xb6, 0x31, 0x70, 0x16, 0xeb, 0xc4, 0x19, 0x40, 0xa9, 0xa2, + 0x42, 0x85, 0x07, 0x1e, 0x18, 0x2e, 0x36, 0xe9, 0x16, 0x83, 0x53, 0xa8, + 0x11, 0x36, 0xc2, 0x36, 0xba, 0x45, 0x6e, 0xe1, 0x62, 0xff, 0x86, 0x5b, + 0x6c, 0x71, 0xb7, 0x38, 0x6a, 0x4e, 0x14, 0x47, 0x45, 0x54, 0x04, 0x03, + 0x9c, 0x6a, 0xb3, 0x85, 0x61, 0xc8, 0x90, 0x0b, 0x17, 0x3e, 0x55, 0x84, + 0x9d, 0xf8, 0x5e, 0x03, 0xe7, 0x02, 0xee, 0xae, 0xcf, 0xc4, 0x2e, 0x04, + 0xc4, 0x8d, 0xc1, 0x2d, 0x2c, 0x4a, 0x1c, 0x0e, 0x5f, 0xfe, 0xfe, 0xf9, + 0xf2, 0xf3, 0x01, 0x08, 0xbf, 0x43, 0x3e, 0x24, 0x1f, 0xf2, 0xcb, 0xe7, + 0xe1, 0x2b, 0xf2, 0xf1, 0xf7, 0x4d, 0x82, 0x4d, 0x3b, 0x38, 0x38, 0x48, + 0xe7, 0xae, 0x03, 0xb0, 0x4e, 0xdf, 0x7e, 0xfb, 0xed, 0xdc, 0x55, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xc6, 0x93, 0xcc, 0x5d, 0x01, 0xb6, 0xe1, 0xe2, + 0xe2, 0x22, 0x8d, 0x88, 0x38, 0x3c, 0x3c, 0x4c, 0xb2, 0xcf, 0x99, 0xc3, + 0xc3, 0xc3, 0x24, 0x5f, 0xa6, 0x6c, 0x59, 0x95, 0xb3, 0xb3, 0xb3, 0xf4, + 0xe4, 0xe4, 0xa4, 0x72, 0xdb, 0x65, 0xdb, 0xcf, 0xca, 0x57, 0x95, 0x79, + 0xfc, 0xf8, 0x71, 0x9c, 0x9e, 0x9e, 0xee, 0xac, 0x43, 0xfe, 0xb8, 0xea, + 0xea, 0x39, 0x87, 0xec, 0xdc, 0xe4, 0x55, 0x1d, 0x53, 0x59, 0x0c, 0xaa, + 0x14, 0x8f, 0xbb, 0x6e, 0xfd, 0xb2, 0x18, 0xed, 0x9a, 0x5f, 0x16, 0x9f, + 0xbc, 0xbe, 0xc7, 0xd6, 0x27, 0xb6, 0x65, 0xfb, 0x6e, 0xba, 0xdd, 0x5d, + 0xf5, 0xa9, 0x53, 0x77, 0xae, 0x87, 0xba, 0x06, 0xdb, 0xb4, 0xa7, 0xaa, + 0x73, 0x53, 0xb6, 0x7e, 0xfe, 0xdc, 0xb4, 0x3d, 0xfe, 0xb2, 0xfd, 0x77, + 0x5d, 0x77, 0x57, 0x9d, 0xcb, 0x34, 0x8d, 0xe7, 0xd8, 0xea, 0xda, 0x47, + 0xdf, 0xeb, 0xbb, 0x6f, 0x3c, 0xf2, 0xda, 0xb6, 0xcd, 0x99, 0x18, 0x3f, + 0x01, 0x00, 0x00, 0x00, 0x00, 0xe3, 0x59, 0xd2, 0xb3, 0xc0, 0x08, 0xcf, + 0x03, 0x81, 0xfd, 0xb5, 0xb4, 0xfe, 0x76, 0x69, 0xf6, 0xbd, 0xff, 0x5f, + 0x5a, 0xfc, 0xf7, 0xfd, 0x7c, 0x03, 0x00, 0x05, 0x07, 0x07, 0x07, 0x73, + 0x57, 0x81, 0x15, 0xfb, 0xf6, 0xdb, 0x6f, 0x93, 0x34, 0x4d, 0xaf, 0x7c, + 0x87, 0x4c, 0x92, 0x24, 0x89, 0x88, 0xc8, 0x2f, 0xdb, 0x35, 0xaf, 0xac, + 0x4c, 0x66, 0xd7, 0xb6, 0xdb, 0x6e, 0xb7, 0xac, 0x6e, 0x65, 0xba, 0xd4, + 0x65, 0xd7, 0xb2, 0xba, 0x7a, 0xd4, 0xd5, 0xa5, 0xaa, 0x6e, 0xbb, 0xb6, + 0xd1, 0x37, 0x16, 0x75, 0xfb, 0x9d, 0xe2, 0x9c, 0x5c, 0xdb, 0xb5, 0x80, + 0xed, 0xf8, 0xf9, 0xcf, 0x7f, 0x5e, 0xb9, 0xfc, 0xc6, 0x8d, 0x1b, 0xf1, + 0xf4, 0xe9, 0xd3, 0x4b, 0x7f, 0x47, 0xc4, 0x8b, 0x79, 0xd9, 0xdf, 0xd9, + 0xbc, 0xfc, 0xdf, 0x5d, 0xdd, 0xba, 0x79, 0x1c, 0x9f, 0x7d, 0xfe, 0xa4, + 0x74, 0x7e, 0x44, 0x5c, 0x59, 0x96, 0xcd, 0x6f, 0x2a, 0xbf, 0xfe, 0xd2, + 0xb7, 0xd9, 0x74, 0x9d, 0x36, 0x65, 0xe7, 0xde, 0x7f, 0x59, 0xd9, 0x3e, + 0xeb, 0x97, 0x9d, 0xfb, 0xe2, 0xfc, 0xfc, 0xb2, 0x5d, 0xd7, 0x56, 0xd5, + 0x76, 0xfb, 0xae, 0xdf, 0x77, 0xbb, 0x7d, 0x15, 0xdb, 0x66, 0xb1, 0xfd, + 0x16, 0xdb, 0x78, 0xfe, 0xef, 0x32, 0x7f, 0xfe, 0xf3, 0x9f, 0x23, 0x22, + 0xe2, 0xde, 0xbd, 0x7b, 0xa5, 0xcb, 0xf3, 0xc7, 0xfb, 0xde, 0xbb, 0xef, + 0xc7, 0xc7, 0x9f, 0x7c, 0x14, 0xef, 0xbd, 0xfb, 0x7e, 0x44, 0xc4, 0xa5, + 0xcf, 0x99, 0x6c, 0x5e, 0xd9, 0xb2, 0x36, 0x65, 0x76, 0xe9, 0xb3, 0x6e, + 0x9b, 0xf5, 0xcb, 0xca, 0x7d, 0xfc, 0xc9, 0x47, 0x2f, 0x96, 0x77, 0xd9, + 0xf7, 0x98, 0xfb, 0xaf, 0x2b, 0xbf, 0xeb, 0xda, 0xbb, 0x7f, 0xff, 0x7e, + 0x44, 0x44, 0x7c, 0xf2, 0xa3, 0x5f, 0x94, 0x2e, 0x7f, 0xe3, 0xfa, 0x5f, + 0x5f, 0x7c, 0x3e, 0x7a, 0xfb, 0xd5, 0x38, 0xff, 0xe2, 0xfb, 0x38, 0x7a, + 0xfb, 0xd5, 0x88, 0x88, 0x4b, 0x9f, 0x33, 0xd9, 0xbc, 0xb2, 0x65, 0x6d, + 0xca, 0xec, 0xd2, 0x67, 0xdd, 0x36, 0xeb, 0x97, 0x95, 0x3b, 0xff, 0xe2, + 0xfb, 0x17, 0xcb, 0xbb, 0xec, 0x7b, 0xcc, 0xfd, 0xd7, 0x95, 0xff, 0xfa, + 0xd9, 0x8f, 0x4b, 0xf7, 0xf3, 0xee, 0xdf, 0xfe, 0x25, 0x22, 0xb4, 0xff, + 0x26, 0xe5, 0xb4, 0x7f, 0xed, 0x3f, 0xa3, 0xfd, 0x6b, 0xff, 0x5d, 0x68, + 0xff, 0xda, 0xbf, 0xf6, 0xaf, 0xfd, 0x6b, 0xff, 0xda, 0xbf, 0xf6, 0xaf, + 0xfd, 0x0f, 0xb5, 0x7f, 0xed, 0x7f, 0xd8, 0xf5, 0xb7, 0xd6, 0xfe, 0x61, + 0x6c, 0x67, 0x67, 0x67, 0xb5, 0x83, 0x27, 0x9b, 0x94, 0xd9, 0xe5, 0xe4, + 0xe4, 0x24, 0x1e, 0x3f, 0x7e, 0xdc, 0x75, 0xf5, 0xda, 0x6d, 0xaf, 0xd5, + 0xae, 0xa4, 0x50, 0x17, 0x17, 0x17, 0x69, 0x55, 0xb2, 0xaa, 0xbc, 0xba, + 0x44, 0x44, 0xc5, 0xed, 0x34, 0x4d, 0xb2, 0xd5, 0x37, 0x01, 0xd4, 0x10, + 0xc7, 0xd6, 0x25, 0xb6, 0xf9, 0x64, 0x41, 0x65, 0x49, 0x82, 0xb2, 0xe5, + 0x17, 0x17, 0x17, 0x69, 0xdb, 0x24, 0x42, 0x6d, 0xcf, 0xf5, 0x58, 0x9a, + 0xb6, 0xa7, 0xb2, 0xa4, 0x67, 0x4d, 0x13, 0x6a, 0xed, 0xda, 0x5e, 0x9f, + 0x7a, 0x77, 0x39, 0x7f, 0x63, 0xc6, 0x73, 0x6e, 0x7d, 0xfb, 0xae, 0xae, + 0xf1, 0x18, 0xa2, 0x6d, 0x02, 0x00, 0xfb, 0xcb, 0xf3, 0xc7, 0xfa, 0x72, + 0x9e, 0x3f, 0x7a, 0xfe, 0x98, 0xd9, 0xb7, 0xe7, 0x8f, 0xaf, 0xfd, 0xfa, + 0x57, 0xe5, 0x15, 0xf9, 0xe5, 0x37, 0x2f, 0x3f, 0xff, 0x43, 0x44, 0xfc, + 0xf1, 0xf9, 0x7f, 0xa3, 0xf0, 0x39, 0x0a, 0xf3, 0xca, 0x96, 0xb5, 0x29, + 0xb3, 0x4b, 0x9f, 0x75, 0xdb, 0xac, 0x5f, 0x56, 0xee, 0x8f, 0xb9, 0xe5, + 0x5d, 0xf6, 0x3d, 0xe6, 0xfe, 0xeb, 0xca, 0xff, 0xe9, 0xef, 0x4a, 0x77, + 0xf3, 0xdd, 0xef, 0xfe, 0x47, 0x44, 0xe8, 0xff, 0x9b, 0x94, 0xd3, 0xff, + 0xeb, 0xff, 0x33, 0xfa, 0xff, 0xd0, 0xff, 0x77, 0xb1, 0xd0, 0xfe, 0x7f, + 0x69, 0xdc, 0x8f, 0xea, 0xcb, 0xb9, 0x1f, 0xb9, 0x1f, 0x65, 0xf6, 0xed, + 0x7e, 0x34, 0x65, 0xfb, 0xdf, 0x55, 0x6e, 0xcc, 0xeb, 0x9b, 0x6a, 0x6b, + 0x6b, 0xff, 0xd9, 0xe7, 0xcc, 0xda, 0xc6, 0xfb, 0xb8, 0xdf, 0xd6, 0x97, + 0x73, 0xbf, 0x5d, 0x4e, 0x7b, 0x73, 0xbf, 0x5d, 0xef, 0xfd, 0x56, 0xfb, + 0xd7, 0xfe, 0xb5, 0xff, 0x65, 0xb5, 0x7f, 0xf9, 0x4b, 0x86, 0xdd, 0xe6, + 0x96, 0xf2, 0x57, 0xec, 0x4a, 0x8e, 0x94, 0xa6, 0x69, 0xda, 0x26, 0x61, + 0xd4, 0x9a, 0x55, 0x25, 0x88, 0x1a, 0x4b, 0x3e, 0x31, 0x55, 0x76, 0xae, + 0x97, 0x14, 0x8b, 0x3e, 0xe7, 0x64, 0x13, 0x17, 0x0d, 0xbb, 0x1d, 0x1c, + 0x1c, 0xa4, 0x3f, 0xff, 0xf9, 0xcf, 0xe3, 0xbf, 0xfc, 0xe7, 0xf2, 0x2f, + 0xa6, 0x4b, 0x71, 0xe7, 0xee, 0xed, 0x78, 0xf8, 0xe0, 0x51, 0xdc, 0xb9, + 0x7b, 0x3b, 0x22, 0x22, 0x1e, 0x3e, 0x78, 0xf4, 0x62, 0x7e, 0x26, 0xbf, + 0xbc, 0xa9, 0xb5, 0x6c, 0x93, 0x76, 0x8a, 0xe7, 0xb8, 0x18, 0x87, 0x6c, + 0x79, 0x36, 0x3f, 0x53, 0x5c, 0xde, 0x75, 0xfd, 0xa1, 0xeb, 0xb5, 0x34, + 0xff, 0xf4, 0xe1, 0xfd, 0xf8, 0xf3, 0x9f, 0xff, 0x1c, 0xdf, 0x7e, 0xfb, + 0x6d, 0xdc, 0xbb, 0x77, 0xcf, 0x03, 0xd7, 0x8d, 0xc9, 0xc7, 0xfc, 0x93, + 0x1f, 0xfd, 0x62, 0xb1, 0x0f, 0x5c, 0x19, 0x47, 0x3e, 0xe6, 0xda, 0xff, + 0xf6, 0x68, 0xff, 0xdb, 0xa6, 0xfd, 0x6f, 0x9b, 0xf6, 0xbf, 0x6d, 0xda, + 0xff, 0xb6, 0x69, 0xff, 0xdb, 0xa6, 0xfd, 0x6f, 0x9b, 0xf6, 0xbf, 0x6d, + 0xb9, 0x98, 0x7b, 0x87, 0xc4, 0xe8, 0xb2, 0x44, 0x2a, 0xcf, 0xff, 0x1b, + 0x17, 0x17, 0x17, 0x97, 0x96, 0x67, 0xf3, 0xca, 0x12, 0xf1, 0x1c, 0x1e, + 0x1e, 0x66, 0x1f, 0x4b, 0xaf, 0xd5, 0x7c, 0x12, 0x9f, 0x88, 0x48, 0xcb, + 0xb6, 0x9d, 0xad, 0x5f, 0xb6, 0xed, 0x6c, 0xbf, 0xf1, 0xc3, 0xaf, 0xa6, + 0x5e, 0x29, 0x13, 0xf1, 0x22, 0xd9, 0x4e, 0x69, 0x1d, 0x72, 0x09, 0x64, + 0x2a, 0xeb, 0x39, 0xb5, 0x1d, 0x89, 0x6d, 0x5e, 0x1c, 0xdb, 0xd9, 0xd9, + 0x59, 0xe4, 0xce, 0xdb, 0x95, 0xf5, 0x32, 0xb9, 0xe3, 0x2a, 0xb5, 0x6b, + 0x3b, 0xd9, 0xbe, 0xaa, 0x62, 0x1d, 0x85, 0x5f, 0xaa, 0x6d, 0x50, 0x36, + 0x19, 0xf2, 0xd8, 0x22, 0xda, 0xc5, 0x36, 0xdb, 0x6e, 0xb1, 0x8e, 0x65, + 0xf2, 0x65, 0x77, 0x25, 0x11, 0xea, 0x7b, 0xae, 0xdb, 0xb6, 0x95, 0x26, + 0xda, 0xb4, 0xa7, 0xec, 0x43, 0xd6, 0xbe, 0x1b, 0x24, 0xd4, 0xba, 0xb4, + 0xad, 0x8a, 0x6d, 0x37, 0x51, 0xd5, 0x57, 0x94, 0x2a, 0x9e, 0xbf, 0x7c, + 0x42, 0xad, 0xba, 0x6d, 0x34, 0x89, 0xe7, 0xd8, 0xea, 0xfa, 0xaf, 0xe2, + 0xf9, 0x8c, 0x68, 0x77, 0x7d, 0xf7, 0x8d, 0x47, 0x61, 0x9b, 0xad, 0xda, + 0xe6, 0x4c, 0xfc, 0x52, 0x36, 0x00, 0xcc, 0xc0, 0xf3, 0xc7, 0xed, 0xf1, + 0xfc, 0x71, 0xdb, 0xf2, 0x31, 0x7f, 0xed, 0xd7, 0xbf, 0x5a, 0x6c, 0x82, + 0x0d, 0xc6, 0x91, 0x8f, 0xb9, 0xfe, 0x7f, 0x7b, 0xf4, 0xff, 0xdb, 0xa6, + 0xff, 0xdf, 0xb6, 0x5c, 0xcc, 0x97, 0xf0, 0x0c, 0x30, 0x2f, 0x75, 0x3f, + 0xda, 0x1e, 0xf7, 0xa3, 0x6d, 0xdb, 0xf7, 0xf1, 0x50, 0xb9, 0x63, 0x5a, + 0x5a, 0x7f, 0xbb, 0x34, 0xe9, 0x3e, 0xb6, 0xff, 0x05, 0x8f, 0xf7, 0x71, + 0xbf, 0xdd, 0x20, 0xf7, 0xdb, 0x6d, 0xdb, 0xf7, 0xfb, 0x2d, 0xd5, 0xb4, + 0xff, 0x6d, 0xcb, 0x62, 0x7e, 0x70, 0x70, 0x10, 0xf2, 0x97, 0x4c, 0x97, + 0x6b, 0x64, 0xdf, 0xf2, 0x57, 0x7c, 0xf3, 0xcd, 0xcb, 0xc4, 0xfb, 0xc5, + 0xc4, 0x4e, 0x65, 0x89, 0x9e, 0xea, 0xca, 0x94, 0x25, 0x7f, 0x2a, 0x5b, + 0x3e, 0xc4, 0x76, 0xcb, 0xf4, 0xad, 0x4b, 0xd5, 0x7e, 0xba, 0xd4, 0xa7, + 0x6a, 0xfd, 0x3e, 0x7f, 0xef, 0x2a, 0xd3, 0xa5, 0xde, 0x43, 0x9f, 0x93, + 0x6b, 0xbb, 0x0a, 0xb3, 0x3d, 0x1f, 0xfc, 0xd7, 0xdf, 0x94, 0xce, 0x3f, + 0x3a, 0x3a, 0x8a, 0xf3, 0xf3, 0xf3, 0x17, 0x9f, 0x23, 0x22, 0xce, 0xcf, + 0xcf, 0x5f, 0x7c, 0x9e, 0xc2, 0x3f, 0x7d, 0x78, 0xff, 0xd2, 0x7f, 0x8b, + 0xf3, 0x77, 0xfd, 0xdd, 0x66, 0xdb, 0x4b, 0xdf, 0x26, 0xed, 0x94, 0x9d, + 0xe3, 0xfc, 0xbc, 0xb1, 0x97, 0x0f, 0x59, 0xaf, 0x31, 0xe5, 0xdb, 0x72, + 0xbe, 0x9d, 0x67, 0x9f, 0x8b, 0xfe, 0xdb, 0xff, 0xf5, 0xdf, 0x4b, 0xe7, + 0x1f, 0x1f, 0x5f, 0xce, 0x8c, 0x5a, 0x5c, 0xbf, 0xb8, 0xcd, 0x62, 0xff, + 0x51, 0xb6, 0xef, 0xbe, 0x65, 0xea, 0xd6, 0x1d, 0x7b, 0xfd, 0xb2, 0x73, + 0x98, 0x2f, 0x5f, 0xd6, 0x8f, 0x4e, 0xb9, 0xff, 0x2e, 0xe5, 0x9f, 0x3c, + 0x79, 0x12, 0xb7, 0x6e, 0x1e, 0xc7, 0xfd, 0xb8, 0x7c, 0x9d, 0xfe, 0xe6, + 0xe0, 0xa7, 0x97, 0xfe, 0xfe, 0xea, 0xd9, 0xf7, 0x97, 0xfe, 0x7e, 0xf3, + 0xfa, 0xab, 0x97, 0xe6, 0xbd, 0x79, 0xfd, 0xd5, 0xd2, 0xf2, 0xf9, 0x72, + 0x7d, 0xcb, 0xd4, 0xad, 0x3b, 0xf6, 0xfa, 0xc5, 0x73, 0x50, 0x2c, 0xff, + 0xd5, 0xb3, 0xef, 0x67, 0xdd, 0x7f, 0x97, 0xf2, 0xff, 0xfd, 0xdb, 0xff, + 0xe7, 0x87, 0x2c, 0xe0, 0x7f, 0xbb, 0x5c, 0x4e, 0xfb, 0xaf, 0x2e, 0x57, + 0x56, 0x5e, 0xfb, 0xbf, 0x5a, 0x5e, 0xfb, 0xd7, 0xfe, 0xb5, 0x7f, 0xed, + 0x7f, 0x88, 0x32, 0x75, 0xeb, 0x8e, 0xbd, 0xbe, 0xf6, 0xff, 0x92, 0xf6, + 0x7f, 0xb5, 0xbc, 0xf6, 0x7f, 0xb5, 0xbc, 0xf6, 0xaf, 0xfd, 0x6b, 0xff, + 0xda, 0xff, 0x10, 0x65, 0xea, 0xd6, 0x1d, 0x7b, 0xfd, 0x2d, 0xb5, 0x7f, + 0x18, 0xc3, 0xd9, 0xd9, 0x59, 0x6d, 0xe2, 0x92, 0xb3, 0xb3, 0xb3, 0xce, + 0xdb, 0x3f, 0x39, 0x39, 0x89, 0xc7, 0x8f, 0x1f, 0x77, 0x5e, 0xbf, 0xe9, + 0x3e, 0xd6, 0xa4, 0x24, 0x79, 0x54, 0xf6, 0xf7, 0x8b, 0x17, 0xcc, 0xa7, + 0xa7, 0xa7, 0x71, 0x76, 0x76, 0x96, 0x66, 0x09, 0x91, 0x1a, 0x6c, 0xb6, + 0xb4, 0xcc, 0xe9, 0xe9, 0x69, 0xb6, 0xbf, 0xb4, 0x50, 0x26, 0xfb, 0x5c, + 0x17, 0xff, 0xd2, 0xe4, 0x3b, 0xbb, 0x0c, 0x7d, 0x6c, 0x6d, 0x62, 0x7b, + 0x7a, 0x7a, 0x9a, 0x14, 0x13, 0x31, 0x3d, 0x4f, 0x6a, 0x74, 0x69, 0xff, + 0xcf, 0xcb, 0xe6, 0xeb, 0x59, 0x3c, 0x37, 0x75, 0xda, 0x9e, 0xeb, 0xc1, + 0x74, 0x69, 0x4f, 0xf9, 0x24, 0x5a, 0x4d, 0x13, 0x6a, 0xc5, 0x0f, 0xf5, + 0xdf, 0x15, 0xef, 0xbe, 0xc7, 0xd6, 0xe8, 0xfc, 0x4d, 0x18, 0xcf, 0xd9, + 0x0c, 0xd4, 0x77, 0x35, 0x3a, 0xd6, 0x91, 0xfa, 0x1d, 0x00, 0x60, 0x4f, + 0x79, 0xfe, 0x58, 0x5d, 0xae, 0xac, 0xbc, 0xe7, 0x8f, 0x57, 0xcb, 0x7b, + 0xfe, 0xb8, 0xce, 0xe7, 0x8f, 0xaf, 0x9d, 0xfc, 0xfd, 0xa5, 0xbf, 0xbf, + 0xfb, 0xcb, 0x77, 0x97, 0x97, 0xff, 0xec, 0xb5, 0x4b, 0xf3, 0x5e, 0xfb, + 0xd9, 0x6b, 0xa5, 0xe5, 0xf3, 0xe5, 0xfa, 0x96, 0xa9, 0x5b, 0x77, 0xec, + 0xf5, 0x8b, 0xe7, 0xa0, 0x58, 0xfe, 0xbb, 0xbf, 0x7c, 0x37, 0xeb, 0xfe, + 0x3b, 0x95, 0x7f, 0xfc, 0xff, 0x45, 0xfc, 0xf2, 0x9b, 0x88, 0xdf, 0x5d, + 0x2e, 0xa7, 0xff, 0xaf, 0x2e, 0x57, 0x56, 0x5e, 0xff, 0x7f, 0xb5, 0xbc, + 0xfe, 0x5f, 0xff, 0xaf, 0xff, 0x5f, 0x5f, 0xff, 0xbf, 0x34, 0xee, 0x47, + 0xd5, 0xe5, 0xca, 0xca, 0xbb, 0x1f, 0x5d, 0x2d, 0xef, 0x7e, 0xb4, 0xfc, + 0xfb, 0x51, 0x99, 0x31, 0xda, 0x7f, 0x9b, 0x72, 0x43, 0x95, 0xdf, 0x75, + 0x7d, 0x53, 0x6d, 0x2d, 0xed, 0xbf, 0x68, 0xad, 0xe3, 0x7d, 0xdc, 0x6f, + 0xab, 0xcb, 0x95, 0x95, 0x77, 0xbf, 0xbd, 0x5a, 0xde, 0xfd, 0x76, 0xf9, + 0xf7, 0x5b, 0xe3, 0x8f, 0xb5, 0x7f, 0xed, 0xbf, 0xf9, 0x71, 0xe4, 0xed, + 0x6b, 0xfb, 0x97, 0xbf, 0x64, 0xb8, 0x6d, 0xb6, 0xd9, 0x5f, 0x71, 0xde, + 0x5a, 0xf3, 0x57, 0x34, 0x51, 0x4c, 0xec, 0x34, 0x94, 0xba, 0xed, 0xf6, + 0x4d, 0x68, 0xd5, 0xa5, 0x1e, 0x4b, 0xdf, 0xcf, 0x58, 0xb1, 0xa8, 0xda, + 0xcf, 0x98, 0xe7, 0x84, 0x3d, 0x71, 0x70, 0x70, 0x90, 0x1e, 0x1f, 0x1f, + 0xa7, 0xbf, 0xff, 0xed, 0x1f, 0xd2, 0xd7, 0x5f, 0x7f, 0x3d, 0x1b, 0x2c, + 0x6c, 0x32, 0x99, 0x4c, 0x57, 0xa6, 0xd7, 0x5f, 0x7f, 0x3d, 0xfd, 0xfd, + 0x6f, 0xff, 0x90, 0x1e, 0x1f, 0x1f, 0xa7, 0x07, 0x07, 0x07, 0x69, 0x44, + 0xa4, 0xf7, 0xee, 0xdd, 0x4b, 0x23, 0x22, 0x3d, 0x3e, 0x3e, 0x9e, 0xbd, + 0x7e, 0xa6, 0xf1, 0xe3, 0x9f, 0x8f, 0x79, 0x44, 0xa4, 0x9f, 0xfc, 0xe8, + 0x17, 0x69, 0x44, 0xa4, 0xbf, 0x39, 0xf8, 0xe9, 0xec, 0xf5, 0x33, 0x8d, + 0x3b, 0xfd, 0xa7, 0x6b, 0xff, 0xe1, 0x52, 0xcc, 0xf3, 0xd7, 0x82, 0xf6, + 0xbf, 0xff, 0x93, 0xf6, 0xbf, 0xed, 0x49, 0xfb, 0xdf, 0xf6, 0xa4, 0xfd, + 0x6f, 0x7b, 0xd2, 0xfe, 0xb7, 0x3d, 0x69, 0xff, 0xdb, 0x9e, 0xb4, 0xff, + 0x6d, 0x4f, 0xda, 0xff, 0xb6, 0xa7, 0x92, 0xf6, 0x0f, 0xa3, 0xca, 0x27, + 0x5a, 0xc9, 0x3e, 0x5f, 0x5c, 0x5c, 0xa4, 0xc5, 0x29, 0x9e, 0x5f, 0x8f, + 0x3b, 0xe6, 0x97, 0x5e, 0xab, 0x59, 0x72, 0x96, 0xe7, 0x7f, 0xa6, 0x11, + 0xb1, 0x6b, 0xbb, 0x3b, 0xb7, 0x5d, 0x58, 0xff, 0x45, 0x99, 0x6c, 0xdb, + 0xf9, 0xbf, 0xcb, 0xea, 0xd1, 0xa4, 0x9e, 0x53, 0x2a, 0xd6, 0xbb, 0xae, + 0x5e, 0xb9, 0x63, 0x7b, 0xf1, 0x77, 0x9b, 0xf5, 0x73, 0x31, 0xa8, 0x3c, + 0x3f, 0x55, 0xe7, 0xbc, 0x69, 0xd9, 0xa1, 0x8e, 0xad, 0x6f, 0x6c, 0x8b, + 0xeb, 0x97, 0x24, 0x13, 0xca, 0x6b, 0x75, 0x6e, 0xaa, 0x8e, 0xa7, 0x78, + 0xae, 0xdb, 0xae, 0x5f, 0xa7, 0x6d, 0x7b, 0x2a, 0x3b, 0xd6, 0x62, 0xf9, + 0xdc, 0xb9, 0xbd, 0xb2, 0x6e, 0xdf, 0xfa, 0x0f, 0x75, 0xad, 0x0e, 0x15, + 0xcf, 0xb1, 0xd5, 0xb5, 0x8f, 0xbe, 0xd7, 0x77, 0x9f, 0x78, 0xf4, 0x6d, + 0x9b, 0x33, 0x99, 0xfd, 0x3b, 0x99, 0xc9, 0x64, 0x32, 0x99, 0x4c, 0x5b, + 0x9c, 0x3c, 0x7f, 0xdc, 0xce, 0xe4, 0xf9, 0xe3, 0xb6, 0xa7, 0xb2, 0xf7, + 0x0f, 0xaf, 0xfd, 0xfa, 0x57, 0x3f, 0xfc, 0xf7, 0xe4, 0xef, 0x67, 0xaf, + 0x9f, 0x69, 0xe4, 0xe9, 0xdf, 0xfd, 0xbb, 0x4b, 0x31, 0x8f, 0xd0, 0xff, + 0x6f, 0x69, 0xd2, 0xff, 0x6f, 0x7b, 0xd2, 0xff, 0x6f, 0x7c, 0xba, 0xda, + 0xff, 0x2f, 0x4d, 0xfa, 0xfb, 0xdf, 0xfe, 0x21, 0x8d, 0x70, 0x3f, 0xda, + 0xc2, 0x94, 0xc5, 0x38, 0x8b, 0x79, 0x44, 0xa4, 0xff, 0xeb, 0x8d, 0x7f, + 0x9f, 0x46, 0xb8, 0x1f, 0x6d, 0x61, 0xca, 0x62, 0x9c, 0xc5, 0x3c, 0x62, + 0xbf, 0xbe, 0x8f, 0x96, 0x7c, 0xdf, 0xa2, 0xda, 0x5e, 0x7d, 0x1f, 0x5d, + 0xc1, 0x78, 0x9f, 0xbd, 0x6a, 0x6f, 0xa6, 0xea, 0xc9, 0xbf, 0xff, 0xb6, + 0x3d, 0x19, 0x7f, 0xbc, 0xed, 0x49, 0xfb, 0xdf, 0xf6, 0x54, 0x6c, 0xff, + 0xf2, 0x97, 0x98, 0xda, 0x4c, 0xc5, 0xfc, 0x15, 0x79, 0x11, 0x11, 0x55, + 0x7f, 0x97, 0x29, 0x5b, 0xa7, 0xa8, 0x6c, 0x79, 0xdb, 0xed, 0xd6, 0xed, + 0xa3, 0x6a, 0x5f, 0x4d, 0x96, 0x37, 0xd9, 0x57, 0xd3, 0x3a, 0x34, 0xad, + 0x5b, 0xd3, 0xe3, 0x6d, 0xb2, 0xbc, 0xaa, 0x4e, 0x53, 0x9f, 0x93, 0x57, + 0xba, 0x9c, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0xbf, 0x4c, 0xf9, + 0xeb, 0x3e, 0x2c, 0x4f, 0xf1, 0x57, 0xa3, 0x60, 0x4c, 0x85, 0xa4, 0x29, + 0x4d, 0x5e, 0xe6, 0xb6, 0x7a, 0xe1, 0x7b, 0x72, 0x72, 0x12, 0x8f, 0x1f, + 0x3f, 0x6e, 0x55, 0xa7, 0xa6, 0x4e, 0x4f, 0x4f, 0xaf, 0xec, 0x6b, 0x0d, + 0xda, 0xd6, 0xf3, 0xf0, 0xf0, 0x30, 0x79, 0xbe, 0x4e, 0xeb, 0x97, 0xed, + 0x67, 0x67, 0x67, 0xe9, 0xc9, 0xc9, 0x49, 0x1c, 0x1e, 0x1e, 0x26, 0x11, + 0x31, 0xfa, 0xaf, 0x40, 0x0d, 0x75, 0x6c, 0x7d, 0x63, 0x7b, 0x7a, 0x7a, + 0x9a, 0x14, 0xaf, 0xbb, 0x8a, 0x44, 0x4c, 0x49, 0x6e, 0xea, 0x6c, 0x8a, + 0x73, 0x3d, 0x40, 0x7b, 0xba, 0x52, 0xaf, 0xe2, 0xb9, 0x2e, 0x2b, 0x33, + 0x85, 0xaa, 0xf3, 0x37, 0x47, 0x3c, 0xc7, 0x34, 0x47, 0xdf, 0x35, 0x65, + 0xbf, 0x03, 0x00, 0x00, 0x00, 0x00, 0xd0, 0xc5, 0x67, 0x9f, 0x3f, 0x99, + 0xbb, 0x0a, 0x4c, 0x2c, 0x1f, 0xf3, 0xaf, 0x9f, 0xfd, 0x78, 0xc6, 0x9a, + 0x30, 0x07, 0x31, 0x07, 0x18, 0x97, 0xf1, 0x87, 0xdb, 0x66, 0xfc, 0xe1, + 0xb6, 0x69, 0xff, 0xdb, 0xa6, 0xfd, 0x33, 0x97, 0x24, 0x49, 0x46, 0x19, + 0xaf, 0xd7, 0x64, 0xbb, 0x49, 0xce, 0x58, 0x75, 0x18, 0x73, 0xfb, 0x43, + 0x9b, 0xa2, 0x9e, 0x5d, 0xcf, 0x89, 0xa4, 0x5a, 0x00, 0x74, 0x76, 0xeb, + 0xe6, 0x71, 0xaf, 0xf5, 0xd3, 0x34, 0x2d, 0x9d, 0xea, 0xca, 0x34, 0x5d, + 0x5e, 0x9c, 0xb7, 0x6b, 0x1b, 0x75, 0xf5, 0xd9, 0xb5, 0xcd, 0xaa, 0x6d, + 0xed, 0xaa, 0x43, 0x93, 0x7d, 0x36, 0x3d, 0x3f, 0x6d, 0x96, 0x37, 0xa9, + 0x4b, 0x13, 0xf9, 0x98, 0xbf, 0x71, 0xfd, 0xaf, 0x9d, 0xb7, 0x53, 0xac, + 0x8f, 0xf8, 0xaf, 0x23, 0xfe, 0xf9, 0x98, 0x77, 0x69, 0xff, 0x7d, 0x8f, + 0x69, 0x57, 0x99, 0xa6, 0xcb, 0xeb, 0x62, 0xdc, 0x35, 0xf6, 0x4d, 0xea, + 0x5d, 0x75, 0x2e, 0xea, 0xe6, 0x8f, 0x79, 0x9d, 0xb4, 0xd1, 0xb7, 0xfd, + 0x8b, 0x7f, 0x79, 0x3d, 0xeb, 0xe6, 0x2f, 0x25, 0xfe, 0x7d, 0xdb, 0x7f, + 0x9f, 0x3a, 0xb7, 0x39, 0x9e, 0x21, 0xcf, 0x47, 0xd3, 0xeb, 0xa5, 0xee, + 0xef, 0xbe, 0xd7, 0x45, 0xd3, 0xed, 0xef, 0xda, 0x46, 0xdf, 0xd8, 0x47, + 0x0c, 0x77, 0xff, 0x17, 0xff, 0x66, 0xe7, 0xa6, 0x6e, 0xd9, 0xd4, 0xf1, + 0x1f, 0xaa, 0xfd, 0xe7, 0xad, 0xe9, 0x5a, 0xe8, 0x5a, 0xdf, 0xa6, 0xc7, + 0xd3, 0xb7, 0xbe, 0x5d, 0x8e, 0xa7, 0x8d, 0x21, 0xbf, 0xff, 0x67, 0xc4, + 0x7f, 0x3d, 0xf1, 0x1f, 0xa3, 0xfd, 0xb3, 0x1e, 0x63, 0xb4, 0x7f, 0xd6, + 0x43, 0xcc, 0x99, 0x42, 0x2e, 0x89, 0x4d, 0x44, 0xc4, 0xa5, 0xcf, 0x79, + 0x87, 0x87, 0x87, 0xad, 0xb7, 0x9d, 0x25, 0xec, 0x3a, 0x3d, 0x3d, 0x4d, + 0xe2, 0x65, 0x62, 0x96, 0x41, 0x5f, 0xd6, 0x16, 0x13, 0xed, 0x9c, 0x9d, + 0x9d, 0x45, 0x44, 0xa4, 0x15, 0x09, 0x77, 0x16, 0xe9, 0xe2, 0xe2, 0xa2, + 0x2a, 0x49, 0x50, 0xe3, 0xf5, 0x8b, 0x53, 0x21, 0xbe, 0x8d, 0xb7, 0xdf, + 0x25, 0xde, 0x75, 0x75, 0x6b, 0xbb, 0x5e, 0x9f, 0xd8, 0x5e, 0x5c, 0x5c, + 0xa4, 0x2d, 0x13, 0x31, 0x35, 0xd6, 0xf7, 0x5c, 0x5f, 0x5c, 0x5c, 0x74, + 0xda, 0xef, 0x14, 0xed, 0xa9, 0xc9, 0xf6, 0x76, 0x1d, 0x7f, 0xd3, 0x73, + 0xdb, 0xe5, 0xfc, 0x8d, 0x19, 0xcf, 0xb9, 0x0c, 0xd5, 0x77, 0xf5, 0x89, + 0x47, 0xdf, 0x7e, 0x07, 0x00, 0xd8, 0x4f, 0x53, 0x3d, 0x7f, 0x1c, 0xea, + 0x79, 0xed, 0xae, 0x75, 0x76, 0x6d, 0xa3, 0xea, 0xb9, 0xed, 0xae, 0xf2, + 0x4d, 0xb7, 0xd7, 0xe5, 0x98, 0xba, 0xd6, 0x75, 0x48, 0x73, 0x3c, 0x7f, + 0x14, 0xff, 0xe5, 0xc4, 0xff, 0x52, 0xcc, 0x7f, 0xf9, 0xcd, 0x24, 0xfb, + 0x14, 0xff, 0xe5, 0xc4, 0x3f, 0x1f, 0xf3, 0x29, 0xfa, 0xff, 0x2e, 0xb1, + 0xad, 0x5b, 0x36, 0xd5, 0x76, 0xeb, 0xe6, 0xb7, 0xbd, 0x3e, 0xda, 0x5c, + 0x23, 0x63, 0x99, 0xba, 0xff, 0x17, 0xff, 0x65, 0xc5, 0x7f, 0xea, 0xfe, + 0x5f, 0xfc, 0x97, 0x15, 0xff, 0xa9, 0xee, 0xf9, 0x5d, 0x8c, 0x7d, 0x3f, + 0xaa, 0x3b, 0xdf, 0x7d, 0xe2, 0x39, 0xd4, 0xba, 0x6d, 0xeb, 0xdc, 0xf4, + 0x38, 0xdb, 0xee, 0x6b, 0x2a, 0x53, 0xde, 0x8f, 0xc4, 0x7f, 0x79, 0xf1, + 0x9f, 0xe3, 0xff, 0x87, 0x28, 0x5b, 0x56, 0xf7, 0x77, 0xd7, 0x73, 0x63, + 0x8c, 0x57, 0x73, 0x53, 0xfd, 0xff, 0x10, 0x65, 0xcb, 0xea, 0xfe, 0xee, + 0x1a, 0xff, 0x25, 0x8f, 0xf7, 0x71, 0x6d, 0x6e, 0x8f, 0xf1, 0x87, 0xdb, + 0x66, 0xfc, 0xf1, 0xb6, 0x69, 0xff, 0xdb, 0x26, 0xe6, 0x0c, 0x2d, 0x6d, + 0xf0, 0xa5, 0xb8, 0x2e, 0xc1, 0x52, 0x9a, 0x53, 0xb6, 0xcd, 0x5d, 0xfb, + 0x68, 0xbb, 0xdd, 0x26, 0x9a, 0xd6, 0x25, 0x2d, 0x68, 0xba, 0xfd, 0x3e, + 0xea, 0xf6, 0xd3, 0x34, 0xd1, 0x58, 0x97, 0xfd, 0x8e, 0x7d, 0x4e, 0x24, + 0xd5, 0x02, 0xa0, 0xb7, 0xf3, 0xf3, 0xf3, 0xde, 0xdb, 0xc8, 0xdf, 0x27, + 0xf3, 0x0f, 0x05, 0xcb, 0x34, 0x5d, 0x3e, 0xb4, 0xa1, 0xf7, 0xd7, 0x66, + 0x7b, 0x65, 0xe7, 0xa7, 0xcd, 0xf2, 0x31, 0x7d, 0xf5, 0xec, 0xfb, 0xde, + 0xdb, 0x10, 0xff, 0xea, 0xf9, 0x4b, 0x8e, 0xff, 0x10, 0xed, 0xbf, 0xae, + 0xce, 0x73, 0x5f, 0x13, 0x63, 0x5f, 0x6b, 0x55, 0xf5, 0xef, 0xba, 0xef, + 0xa9, 0xae, 0x83, 0x21, 0xda, 0xbf, 0xf8, 0xaf, 0x37, 0xfe, 0x43, 0xb4, + 0xff, 0xbc, 0xbe, 0xc7, 0x3b, 0xf5, 0x7d, 0x61, 0x6c, 0xe9, 0xc4, 0x03, + 0x05, 0xda, 0x1a, 0xa2, 0xfd, 0xe7, 0x89, 0xff, 0x65, 0x4b, 0x8f, 0xff, + 0xd0, 0xed, 0x3f, 0x6f, 0x6d, 0xd7, 0x42, 0xd7, 0x3e, 0xb9, 0x6f, 0x7d, + 0xe7, 0xbc, 0x3e, 0x86, 0x6e, 0xff, 0x79, 0xe2, 0xdf, 0x6f, 0xbb, 0x53, + 0x18, 0xb3, 0xfd, 0xb3, 0x7c, 0x63, 0xb6, 0x7f, 0x60, 0x5b, 0xb2, 0x24, + 0x3d, 0xcf, 0x0d, 0x7e, 0x63, 0x3b, 0x39, 0x39, 0x19, 0x7a, 0x93, 0x57, + 0x9c, 0x9e, 0x9e, 0xee, 0xdc, 0x67, 0xe1, 0xf8, 0xf6, 0x41, 0x3e, 0x99, + 0xd2, 0x15, 0x87, 0x87, 0x87, 0x49, 0xd9, 0xf4, 0x7c, 0x71, 0xb6, 0xde, + 0x52, 0x7f, 0x29, 0xeb, 0xca, 0xb1, 0xf5, 0x89, 0xed, 0xe1, 0xe1, 0x61, + 0x32, 0x66, 0x22, 0xa6, 0x39, 0xce, 0xf5, 0x04, 0xed, 0xa9, 0x55, 0x7d, + 0x2b, 0x8e, 0xbf, 0xd1, 0xba, 0xc5, 0xb8, 0x54, 0x9d, 0xbf, 0xb1, 0xe3, + 0x39, 0x87, 0xa1, 0xfb, 0xae, 0x3e, 0xf1, 0xa8, 0x51, 0xd9, 0xef, 0x00, + 0x00, 0xfb, 0x6b, 0xce, 0xf7, 0x0f, 0x6d, 0x9e, 0xd7, 0xd6, 0xad, 0xd3, + 0x66, 0xff, 0x7d, 0x74, 0x3d, 0xa6, 0xa5, 0x9a, 0xf3, 0xfd, 0x83, 0xf8, + 0xcf, 0xef, 0xbb, 0xbf, 0x7c, 0x37, 0xda, 0xb6, 0xc5, 0x7f, 0xf9, 0xc6, + 0xea, 0xff, 0x97, 0x32, 0x96, 0xa8, 0xeb, 0xfb, 0xff, 0x31, 0xc7, 0x14, + 0x2d, 0xe9, 0x1a, 0x19, 0xab, 0xff, 0x17, 0xff, 0x76, 0xdb, 0x9c, 0xcb, + 0x58, 0xfd, 0xbf, 0xf8, 0xb7, 0xdb, 0xe6, 0xd6, 0xbd, 0xf7, 0xee, 0xfb, + 0x11, 0x31, 0xfd, 0x78, 0x88, 0xbe, 0x63, 0x43, 0xda, 0x5c, 0x0b, 0x63, + 0x8f, 0x33, 0x5f, 0xcb, 0xd8, 0xbd, 0x2c, 0xc6, 0x59, 0xcc, 0x23, 0x22, + 0x8e, 0xde, 0x7e, 0x35, 0x22, 0xa6, 0x1f, 0x0f, 0x21, 0xfe, 0xd3, 0xcb, + 0x62, 0x9c, 0xc5, 0x3c, 0xaf, 0x69, 0xfb, 0x1f, 0x32, 0x2e, 0x2c, 0x47, + 0xd3, 0xf6, 0x2f, 0xfe, 0xc3, 0x30, 0xfe, 0x70, 0xdb, 0x8c, 0x3f, 0xdc, + 0x36, 0xed, 0x7f, 0xdb, 0xb4, 0x7f, 0xa0, 0x8d, 0x5d, 0x89, 0x99, 0xba, + 0x24, 0x6c, 0xda, 0x37, 0x53, 0x9d, 0x83, 0x35, 0x9d, 0xeb, 0x26, 0x75, + 0x95, 0x54, 0x0b, 0x80, 0xce, 0xf2, 0x2f, 0x14, 0xc6, 0x56, 0x77, 0x4f, + 0xab, 0x5b, 0x9e, 0x7f, 0x10, 0xb9, 0xab, 0x6c, 0x92, 0x24, 0x57, 0x96, + 0x95, 0xcd, 0x6b, 0xb2, 0xbf, 0xb6, 0xd6, 0xf2, 0xfd, 0xa2, 0xec, 0x25, + 0xd2, 0x14, 0xc4, 0x7f, 0x19, 0xf2, 0x31, 0xef, 0xdb, 0xfe, 0xfb, 0xc6, + 0xb4, 0xcb, 0xf2, 0xba, 0x18, 0x97, 0x2d, 0xeb, 0xb2, 0xdf, 0x5d, 0xd7, + 0x4d, 0x95, 0x26, 0x2f, 0x4b, 0x86, 0x38, 0x27, 0x5d, 0xea, 0x96, 0x19, + 0xb2, 0xfd, 0x8b, 0xff, 0x65, 0x6b, 0x88, 0xff, 0x90, 0xed, 0xbf, 0x49, + 0x9d, 0xa6, 0xb8, 0x46, 0xda, 0x9c, 0x8f, 0xaa, 0xf2, 0x75, 0xf1, 0xeb, + 0x7b, 0xee, 0x77, 0x6d, 0xb3, 0xea, 0xef, 0x26, 0xf5, 0x6a, 0x63, 0x8c, + 0xfb, 0xbf, 0xf8, 0x77, 0x37, 0x75, 0xfc, 0xc7, 0x68, 0xff, 0x79, 0x6b, + 0xba, 0x16, 0xea, 0xd6, 0xc9, 0x2f, 0x5b, 0xcb, 0xf1, 0xd4, 0x19, 0xfb, + 0xfb, 0xff, 0xda, 0xce, 0xd7, 0xd6, 0xe2, 0x3f, 0x76, 0xfb, 0x67, 0xd9, + 0xe6, 0xfa, 0xf7, 0x3f, 0xcb, 0x20, 0xe6, 0x8c, 0xed, 0xe4, 0xe4, 0x24, + 0x0a, 0x89, 0x57, 0x9a, 0xdc, 0xc0, 0x1a, 0xdd, 0xe4, 0xf2, 0x49, 0x61, + 0x2e, 0x2e, 0x2e, 0xd2, 0x8b, 0x8b, 0x8b, 0xb8, 0xb8, 0xb8, 0x68, 0x5b, + 0xc5, 0x46, 0x8a, 0x49, 0x76, 0xce, 0xce, 0xce, 0xe2, 0xc3, 0x0f, 0x3f, + 0xcc, 0x92, 0xd4, 0xac, 0x6d, 0x64, 0x6c, 0xdf, 0xfa, 0xa6, 0x3b, 0xa6, + 0x88, 0x6e, 0x49, 0x9e, 0x86, 0x7c, 0x60, 0xda, 0xfa, 0xd8, 0xfa, 0xc4, + 0x76, 0x82, 0x44, 0x4c, 0x7d, 0xcf, 0x75, 0xe3, 0x3a, 0x4c, 0xd9, 0x9e, + 0x5a, 0xd8, 0x75, 0xfc, 0x8d, 0x8e, 0xab, 0x98, 0x54, 0xea, 0xf9, 0x31, + 0xee, 0x3c, 0x7f, 0xfb, 0x98, 0x58, 0x6b, 0xe0, 0xbe, 0xab, 0x4f, 0x3c, + 0x56, 0x79, 0xfe, 0x00, 0x80, 0x71, 0x4c, 0xfd, 0xfc, 0xb1, 0xef, 0xf3, + 0xd8, 0x88, 0x61, 0xde, 0xf1, 0x66, 0x65, 0xda, 0x8c, 0x55, 0xe9, 0xf3, + 0x0c, 0xba, 0xe9, 0x33, 0xee, 0x29, 0xcc, 0xf9, 0xfc, 0x51, 0xfc, 0xe7, + 0x8f, 0xff, 0xa5, 0x98, 0xff, 0xc3, 0x24, 0xbb, 0x7c, 0x41, 0xfc, 0xe7, + 0x8f, 0x7f, 0x3e, 0xe6, 0x4b, 0x1a, 0x7f, 0xba, 0xb4, 0xed, 0x66, 0xa6, + 0x1e, 0x53, 0x34, 0xf6, 0xf1, 0x2c, 0x75, 0xfc, 0xe9, 0xd2, 0xb6, 0x9b, + 0xd9, 0xb7, 0xf8, 0xcf, 0xd5, 0xff, 0x8b, 0x7f, 0xf5, 0xf2, 0xc9, 0xee, + 0x03, 0x13, 0xdf, 0xf3, 0xbb, 0x38, 0x3a, 0x3a, 0x1a, 0x7d, 0x1f, 0x4d, + 0xee, 0xe5, 0x63, 0x8c, 0x49, 0xe9, 0xa3, 0xed, 0x35, 0x32, 0xd9, 0x77, + 0x8a, 0x0e, 0xaa, 0x62, 0xfc, 0xe6, 0xf5, 0xf1, 0xef, 0x4b, 0xe2, 0x3f, + 0xaf, 0xb2, 0x18, 0xf7, 0xf9, 0x3e, 0x3a, 0x76, 0x5c, 0xba, 0xf6, 0xcf, + 0xc6, 0x78, 0x35, 0xd7, 0xe7, 0xfb, 0xe8, 0x52, 0xe3, 0xbf, 0xe4, 0xf1, + 0x3e, 0xae, 0xcd, 0xed, 0x31, 0xfe, 0x70, 0xdb, 0x8c, 0x3f, 0xde, 0x36, + 0xed, 0x7f, 0xdb, 0xc4, 0x9c, 0xa9, 0xa5, 0xcf, 0x45, 0x44, 0x24, 0xcf, + 0xa5, 0x3b, 0x1e, 0xac, 0x55, 0x2d, 0xcb, 0xaf, 0x5f, 0xdc, 0x6e, 0xb6, + 0xac, 0xae, 0x1e, 0xc5, 0x3a, 0x95, 0xd5, 0x6d, 0xd7, 0x3a, 0x49, 0x4e, + 0xd9, 0xdf, 0x4d, 0x14, 0xeb, 0x5c, 0xac, 0x47, 0x7e, 0x79, 0xb1, 0x6c, + 0xf1, 0x3c, 0x34, 0xad, 0x57, 0x59, 0x3d, 0x9b, 0xd4, 0x3d, 0xd9, 0x61, + 0xd7, 0xb2, 0xba, 0x75, 0x76, 0x6d, 0x3b, 0x9b, 0xd7, 0x2b, 0xa9, 0x56, + 0xd5, 0x45, 0xc3, 0xf8, 0x86, 0x3a, 0xff, 0x37, 0x6e, 0xdc, 0x88, 0x88, + 0x69, 0x1e, 0x02, 0x03, 0xeb, 0x95, 0xf5, 0x11, 0x59, 0x9f, 0x31, 0xb4, + 0x26, 0x49, 0x8f, 0xea, 0x24, 0x53, 0x0f, 0xf0, 0x98, 0x50, 0xdd, 0xf9, + 0x69, 0xb3, 0x7c, 0x89, 0xc4, 0xbf, 0xda, 0xbe, 0xc7, 0x7f, 0x2c, 0x63, + 0x5d, 0x13, 0x55, 0xdb, 0xcd, 0x7e, 0x59, 0x6c, 0x89, 0xe7, 0x7c, 0xc9, + 0x75, 0x1b, 0x83, 0xf8, 0x5f, 0xb6, 0xc4, 0xba, 0x8d, 0x5d, 0xa7, 0x21, + 0x63, 0x55, 0x2c, 0xbf, 0xeb, 0xba, 0x5a, 0xda, 0x75, 0xb1, 0xa4, 0x78, + 0x17, 0x89, 0xff, 0xf8, 0x96, 0x1c, 0xff, 0xbc, 0x35, 0x5d, 0x0b, 0x75, + 0xeb, 0x34, 0xd9, 0xde, 0x98, 0xdf, 0x59, 0x97, 0xd8, 0xd7, 0xd7, 0x11, + 0xff, 0xe1, 0xac, 0x2d, 0xfe, 0xf9, 0xfa, 0x16, 0xeb, 0xde, 0x74, 0x59, + 0x9b, 0x6d, 0xee, 0x5a, 0x5e, 0xb7, 0xee, 0xae, 0xf3, 0xd9, 0x66, 0x79, + 0xd3, 0x7d, 0x75, 0x59, 0xde, 0xa4, 0x2e, 0x6d, 0x4d, 0xf1, 0x6b, 0x60, + 0xe2, 0xbf, 0xdc, 0xf8, 0x0f, 0xf9, 0x6b, 0x60, 0xe9, 0x5a, 0x3a, 0xa4, + 0x3d, 0xb5, 0xe4, 0xf3, 0x9f, 0x4f, 0xd2, 0x13, 0x23, 0x24, 0x54, 0x39, + 0x39, 0x39, 0x89, 0xc7, 0x8f, 0x1f, 0xc7, 0xe1, 0xe1, 0x61, 0x72, 0x78, + 0x78, 0x38, 0xf4, 0xe6, 0x2f, 0x39, 0x3d, 0x3d, 0xbd, 0x74, 0x53, 0x3f, + 0x39, 0x39, 0x89, 0x0f, 0x3e, 0xf8, 0x20, 0x22, 0x7e, 0x48, 0x52, 0xb3, + 0x34, 0xc5, 0x44, 0x3a, 0x75, 0x2e, 0x2e, 0x2e, 0xd2, 0x96, 0xeb, 0x24, + 0x3b, 0xa6, 0xd1, 0x0d, 0x7d, 0x6c, 0x7d, 0x63, 0x3b, 0x41, 0x22, 0xa6, + 0x49, 0xce, 0xf5, 0x94, 0xed, 0xa9, 0x83, 0xce, 0xc7, 0x9f, 0x8f, 0xc9, + 0xf3, 0x44, 0x52, 0xd9, 0xf6, 0x4a, 0xed, 0x5b, 0x62, 0xad, 0x91, 0xfa, + 0xae, 0xd2, 0x78, 0x4c, 0xd0, 0xef, 0x00, 0x00, 0x74, 0xb6, 0xc6, 0x31, + 0x26, 0x7d, 0x9e, 0x05, 0xf5, 0x7d, 0xe6, 0xb5, 0x6f, 0xc4, 0x7f, 0xb8, + 0x6d, 0xaf, 0x91, 0xf8, 0x0f, 0xb7, 0x6d, 0xf6, 0x83, 0x6b, 0x60, 0xdb, + 0xc4, 0x7f, 0xdb, 0xc4, 0x7f, 0x3d, 0xfa, 0xc6, 0x2a, 0xbf, 0x5e, 0xdb, + 0xef, 0x40, 0xae, 0x93, 0xf9, 0x89, 0xff, 0x32, 0x8d, 0x7d, 0x6e, 0x9c, + 0xfb, 0x65, 0x13, 0xff, 0xf5, 0xdb, 0x75, 0x8e, 0x87, 0x1a, 0x77, 0xd6, + 0x66, 0xff, 0x55, 0xe3, 0xc1, 0x9a, 0x2e, 0x5b, 0xd2, 0xb5, 0x32, 0xc5, + 0xf8, 0xc3, 0xbe, 0xc4, 0x7f, 0x3c, 0x43, 0x8e, 0x3f, 0xec, 0xa2, 0xee, + 0xfc, 0x34, 0x39, 0xb7, 0x65, 0x65, 0x9b, 0x6e, 0x7f, 0x57, 0x5d, 0x9a, + 0xd4, 0xb3, 0x6a, 0x9d, 0x26, 0xd7, 0x42, 0x55, 0xfd, 0xa6, 0xba, 0x46, + 0xe6, 0x6e, 0xff, 0xe2, 0x3f, 0x6f, 0xfc, 0xcb, 0xda, 0xbf, 0xfc, 0x25, + 0x34, 0x55, 0xcc, 0x5f, 0x91, 0xee, 0xb8, 0x70, 0x77, 0xcd, 0x6f, 0xba, + 0xbc, 0xc9, 0xba, 0x5d, 0xf7, 0x5d, 0x57, 0x6e, 0xcc, 0xba, 0x4f, 0xb1, + 0xbd, 0xb5, 0xeb, 0x9c, 0x54, 0xcb, 0x89, 0x5c, 0x86, 0x21, 0xe2, 0xf0, + 0xf4, 0xe9, 0xd3, 0x88, 0x98, 0xff, 0x0b, 0x0b, 0xb0, 0x6c, 0x59, 0x1f, + 0x91, 0xf5, 0x19, 0x43, 0xcb, 0x3f, 0xa0, 0xdf, 0xf5, 0x8f, 0x85, 0x3a, + 0x4b, 0x7c, 0x18, 0x30, 0x94, 0xba, 0xf3, 0x53, 0xb6, 0x7c, 0x4d, 0x03, + 0x7f, 0xc4, 0xbf, 0xda, 0x3e, 0xc6, 0xbf, 0x2e, 0x4e, 0x7d, 0x97, 0x67, + 0x65, 0xc6, 0xb8, 0x26, 0x86, 0xde, 0x6e, 0x16, 0xab, 0xa5, 0xc7, 0x6c, + 0x48, 0xe2, 0xff, 0xd2, 0x16, 0xe3, 0x3f, 0x84, 0xad, 0xdf, 0x17, 0xb6, + 0x4e, 0xfc, 0xc9, 0x2c, 0xe1, 0x5a, 0xd8, 0xd5, 0x7f, 0x77, 0x7d, 0x41, + 0x52, 0xc5, 0xf5, 0x7c, 0x99, 0xf8, 0xcf, 0x63, 0x88, 0x97, 0x5a, 0x73, + 0x1c, 0x4b, 0x55, 0x4c, 0xe6, 0xdc, 0x57, 0x97, 0x7f, 0xeb, 0x4d, 0xe5, + 0xe3, 0x4f, 0x3e, 0xba, 0x32, 0x6f, 0x88, 0x5f, 0x66, 0x15, 0xff, 0x97, + 0x96, 0x1c, 0xff, 0xf3, 0x2f, 0xfa, 0x0d, 0x6e, 0xf1, 0xfe, 0x68, 0x19, + 0x96, 0x1a, 0x87, 0x93, 0x93, 0x93, 0x38, 0x3c, 0x3c, 0xcc, 0xdf, 0x44, + 0x07, 0xfb, 0x07, 0x71, 0x96, 0xb0, 0xeb, 0x79, 0xc2, 0x98, 0xe2, 0xf1, + 0x8f, 0x72, 0x3e, 0x8a, 0xc9, 0x5f, 0xce, 0xce, 0xce, 0xe2, 0xc3, 0x0f, + 0x3f, 0xcc, 0x27, 0xea, 0x59, 0x8c, 0x62, 0x22, 0x9d, 0x2a, 0x85, 0x73, + 0xb9, 0x78, 0x63, 0x1c, 0x5b, 0xdf, 0xd8, 0xae, 0x3d, 0x11, 0xd3, 0x1c, + 0xed, 0x69, 0x2a, 0xc5, 0xd8, 0x3f, 0x4f, 0x24, 0x55, 0x79, 0x4c, 0x6b, + 0x8f, 0x67, 0xd1, 0x54, 0x7d, 0xd7, 0x3e, 0xf7, 0x3b, 0x00, 0xc0, 0xfa, + 0xf5, 0x79, 0x5e, 0xdb, 0xf4, 0x1d, 0xef, 0x94, 0xff, 0x34, 0xaf, 0x7b, + 0xbe, 0x54, 0x57, 0x76, 0x6b, 0xc4, 0x7f, 0xdb, 0xc4, 0x7f, 0x9b, 0xd6, + 0x78, 0xec, 0x63, 0x8e, 0x29, 0xda, 0xda, 0x35, 0xb2, 0xc6, 0xe3, 0x12, + 0xff, 0xe1, 0xac, 0xf1, 0xb8, 0xc4, 0x9f, 0x88, 0x76, 0xb1, 0x6a, 0xfa, + 0x1d, 0xa6, 0x49, 0xd9, 0xbe, 0x5c, 0x4b, 0xc3, 0x10, 0xff, 0x65, 0x1a, + 0x32, 0x2e, 0xac, 0x8f, 0xf8, 0x0f, 0x63, 0x89, 0x49, 0x35, 0xb2, 0x78, + 0xb5, 0x89, 0x65, 0x9f, 0xf1, 0x9e, 0x5b, 0xb9, 0x3e, 0xc6, 0x1a, 0x7f, + 0x38, 0x34, 0xf1, 0x1f, 0x47, 0xd9, 0xf8, 0xc3, 0x39, 0xdb, 0xff, 0x10, + 0xe7, 0x7d, 0xea, 0xd8, 0x55, 0x5d, 0x9b, 0x4b, 0xb7, 0xb4, 0xf6, 0x2f, + 0xfe, 0xd3, 0xca, 0xb7, 0x7f, 0xf9, 0x4b, 0x68, 0xaa, 0x2a, 0x7f, 0x45, + 0x52, 0xf3, 0x80, 0xac, 0xc9, 0xf2, 0xcc, 0x10, 0xdb, 0x2e, 0xdb, 0xd6, + 0x90, 0xdb, 0x6f, 0xab, 0xac, 0x2e, 0x65, 0x65, 0x8a, 0xe7, 0xa1, 0xcd, + 0x71, 0xec, 0x83, 0x4e, 0x49, 0xb5, 0x96, 0x3a, 0x10, 0x7f, 0xab, 0xc4, + 0x03, 0xa0, 0xde, 0x9c, 0xff, 0x23, 0xe2, 0x9c, 0xd6, 0xf8, 0xcb, 0x7a, + 0x63, 0x10, 0xff, 0x65, 0xc7, 0xbf, 0xae, 0x7e, 0x4b, 0xaf, 0x7f, 0x5e, + 0xd7, 0x73, 0x3e, 0xc5, 0x31, 0x2e, 0xf5, 0x7a, 0x10, 0xff, 0xed, 0xc6, + 0x7f, 0xa8, 0x3a, 0x75, 0x59, 0xbf, 0xed, 0xbe, 0x8b, 0xe5, 0xdb, 0x26, + 0x4b, 0x68, 0x7b, 0x9c, 0xf9, 0xed, 0x74, 0xbd, 0x6f, 0x2d, 0x29, 0xd6, + 0x65, 0xc4, 0x7f, 0xb7, 0x2d, 0xc4, 0x3f, 0x6f, 0x4d, 0xd7, 0xc2, 0xae, + 0x75, 0xe6, 0xe8, 0x63, 0xcb, 0xf6, 0xb5, 0xc4, 0xbe, 0xbe, 0x8e, 0xf8, + 0x77, 0xb3, 0x2f, 0xf1, 0x8f, 0xb8, 0x5c, 0xef, 0x21, 0x8f, 0xab, 0x6e, + 0x9b, 0xbb, 0xca, 0xd7, 0xcd, 0x6b, 0x6b, 0x6d, 0xf1, 0xc8, 0x7b, 0xef, + 0xdd, 0xf7, 0x47, 0xdf, 0x87, 0xf8, 0x2f, 0xd7, 0xd1, 0xdb, 0xdd, 0x07, + 0x30, 0x78, 0x5f, 0xb1, 0x2c, 0x4b, 0x8b, 0x47, 0x96, 0x30, 0xe5, 0xb9, + 0xc1, 0xeb, 0x76, 0x72, 0x72, 0x72, 0x25, 0x51, 0xcc, 0xd8, 0x8a, 0xc9, + 0x5f, 0x4e, 0x4e, 0x4e, 0xe2, 0x83, 0x0f, 0x3e, 0x98, 0xb4, 0x0e, 0x6d, + 0x14, 0x12, 0x9a, 0x95, 0x3a, 0x3b, 0x3b, 0x4b, 0x0b, 0xc9, 0xcf, 0xd2, + 0x18, 0x30, 0xf9, 0xd9, 0x58, 0x86, 0x3e, 0xb6, 0x36, 0xb1, 0xbd, 0xb8, + 0xb8, 0x48, 0x2f, 0x2e, 0x2e, 0xd2, 0xc2, 0x35, 0x5e, 0x99, 0x88, 0xa9, + 0x58, 0x76, 0x69, 0xe6, 0x68, 0x4f, 0x53, 0xca, 0x1f, 0x5b, 0x31, 0x91, + 0xd4, 0x3e, 0xc6, 0xb3, 0x68, 0xca, 0xbe, 0x6b, 0x9f, 0xfb, 0x1d, 0x00, + 0x60, 0xdb, 0xe6, 0x78, 0x27, 0x3c, 0xd4, 0x73, 0xed, 0xa1, 0xb6, 0xbd, + 0x65, 0xe2, 0xbf, 0x6d, 0xe2, 0x4f, 0x1b, 0x7d, 0xdf, 0xff, 0x8f, 0x19, + 0x17, 0xb1, 0x1f, 0x9f, 0xf8, 0x6f, 0x9b, 0xf8, 0xaf, 0xcf, 0x12, 0xff, + 0x27, 0xdf, 0x25, 0xc4, 0x6a, 0x09, 0x75, 0x18, 0x4a, 0x55, 0x8c, 0xbf, + 0x7a, 0xd6, 0xef, 0x87, 0xa7, 0xc6, 0xb0, 0x84, 0x73, 0xbf, 0x84, 0x3a, + 0x0c, 0x65, 0xa8, 0x18, 0xf7, 0x39, 0x27, 0xf9, 0x75, 0xf2, 0xf7, 0x86, + 0x7d, 0x1a, 0x0b, 0xb6, 0xef, 0xc4, 0x7f, 0x7f, 0x35, 0xf9, 0xbe, 0xd6, + 0xe4, 0xdf, 0xd7, 0x6d, 0xb5, 0x1d, 0x3f, 0x37, 0xd6, 0x38, 0xb7, 0x31, + 0x4c, 0x31, 0xfe, 0x70, 0x28, 0xe2, 0x3f, 0xbc, 0x3e, 0xe3, 0x0f, 0x87, + 0xd2, 0x64, 0xfc, 0x68, 0x59, 0x99, 0xa6, 0xd7, 0xc3, 0x50, 0xf7, 0x84, + 0x5d, 0xf5, 0xa8, 0xaa, 0xcb, 0xae, 0xf5, 0x97, 0x72, 0x8d, 0x2c, 0xa1, + 0xfd, 0x8b, 0x7f, 0xec, 0x9c, 0x37, 0xb6, 0x25, 0xb4, 0x7f, 0xc8, 0x4b, + 0x73, 0xe6, 0xae, 0xcb, 0x5c, 0x9c, 0x83, 0x0e, 0x49, 0xb5, 0xb6, 0x7c, + 0xb2, 0x96, 0x6c, 0x88, 0xb8, 0x2c, 0x31, 0xd3, 0x33, 0xb0, 0x1c, 0x65, + 0x7d, 0x44, 0x59, 0xd6, 0xe0, 0xae, 0xda, 0xfc, 0x42, 0x46, 0x97, 0xf5, + 0x87, 0xd6, 0x65, 0x7f, 0x7d, 0x7e, 0xe5, 0xae, 0xeb, 0xf2, 0xaa, 0x7d, + 0x76, 0x91, 0x8f, 0x79, 0x59, 0xd6, 0xf0, 0xae, 0xc4, 0x7f, 0x1d, 0xf1, + 0xcf, 0xc7, 0xbc, 0x6f, 0xfb, 0xaf, 0x7b, 0x78, 0xb0, 0xeb, 0xa5, 0x41, + 0xd9, 0xf2, 0x32, 0x5d, 0x63, 0x54, 0xb7, 0x8d, 0x26, 0xb1, 0x18, 0xf2, + 0x9c, 0xb7, 0xdd, 0x77, 0xdd, 0xf2, 0x3e, 0x75, 0x1b, 0xb2, 0xfd, 0x8b, + 0x7f, 0x7b, 0x73, 0xc7, 0x7f, 0xc8, 0xf6, 0xdf, 0x44, 0x9b, 0xfb, 0xc2, + 0x14, 0xb1, 0xaa, 0x2a, 0xdf, 0xe4, 0x7a, 0x6c, 0xb2, 0xaf, 0x26, 0x0f, + 0x2a, 0xb3, 0x32, 0x4d, 0xae, 0xd7, 0xa6, 0xdb, 0x6c, 0x62, 0xac, 0xfb, + 0xff, 0x2e, 0xe2, 0x5f, 0x5d, 0x66, 0xea, 0xf8, 0x4f, 0xdd, 0xfe, 0xf3, + 0x96, 0x76, 0x2d, 0x94, 0xad, 0x93, 0xff, 0xbb, 0x6f, 0x5f, 0xdd, 0x77, + 0x40, 0xfb, 0x18, 0xf7, 0xa1, 0xa9, 0xdb, 0x7f, 0x9e, 0xf8, 0x5f, 0x5d, + 0x3e, 0x75, 0xfc, 0xcb, 0x62, 0x3e, 0xf4, 0x20, 0xd2, 0xba, 0x7a, 0x77, + 0x3d, 0xae, 0xba, 0xf5, 0x96, 0x32, 0xf0, 0x28, 0x5f, 0xbf, 0xba, 0x97, + 0xb3, 0x5d, 0x5f, 0xde, 0x76, 0x55, 0xd6, 0xe7, 0x0f, 0x3d, 0x88, 0x54, + 0xfc, 0x97, 0x1b, 0xff, 0xae, 0x7d, 0x7e, 0x3a, 0xf5, 0x03, 0x1a, 0x1a, + 0x59, 0x52, 0x5c, 0x0a, 0x09, 0x53, 0x22, 0x06, 0x4c, 0x98, 0x92, 0x25, + 0xb4, 0x79, 0x9e, 0x28, 0x26, 0x3b, 0xe6, 0x49, 0x1a, 0x7a, 0x49, 0x72, + 0x9d, 0xf8, 0xf0, 0xc3, 0x0f, 0xa7, 0xd8, 0x75, 0x27, 0x55, 0x09, 0x6e, + 0x2e, 0x2e, 0x2e, 0x8a, 0x89, 0x6d, 0x56, 0x65, 0xe8, 0x63, 0x6b, 0x1a, + 0xdb, 0xc3, 0xc3, 0xc3, 0xe4, 0xf1, 0xe3, 0xc7, 0x71, 0x72, 0x72, 0x12, + 0xc5, 0x64, 0x4c, 0x65, 0x89, 0x98, 0x1e, 0x3f, 0x7e, 0x1c, 0xa7, 0xa7, + 0xa7, 0x11, 0x23, 0x24, 0x97, 0x1b, 0xc2, 0x9c, 0xed, 0x69, 0x2a, 0xc5, + 0xa4, 0x52, 0x67, 0x67, 0x67, 0x11, 0xcf, 0x8f, 0x75, 0xdf, 0xe2, 0xb9, + 0xcb, 0x94, 0x7d, 0xd7, 0x3e, 0xf7, 0x3b, 0x00, 0xc0, 0x30, 0x96, 0xfc, + 0xfe, 0xa1, 0x8f, 0xa1, 0x9f, 0x43, 0xb5, 0x7d, 0x67, 0xd5, 0xf6, 0x19, + 0xf6, 0x58, 0xef, 0xba, 0xcb, 0xac, 0xe5, 0xfd, 0x43, 0x1f, 0xe2, 0xbf, + 0xdb, 0xa5, 0x98, 0xff, 0x71, 0x92, 0x5d, 0xbe, 0x20, 0xfe, 0xed, 0xb6, + 0x3d, 0x8a, 0x5c, 0xcc, 0xa7, 0xec, 0xff, 0xfb, 0xbc, 0xdb, 0xaf, 0x5b, + 0xd6, 0x76, 0x5f, 0x4d, 0xcb, 0x34, 0xd5, 0xe5, 0x3d, 0x65, 0x9b, 0x6b, + 0x64, 0x48, 0x73, 0xf5, 0xff, 0xe2, 0x7f, 0x75, 0xde, 0x1c, 0xf1, 0x9f, + 0xab, 0xff, 0x17, 0xff, 0xab, 0xf3, 0xe6, 0x88, 0xff, 0xd4, 0xf7, 0xfc, + 0xa5, 0x6a, 0x72, 0x2d, 0x75, 0x19, 0x93, 0xd2, 0x77, 0x4c, 0x6d, 0xd7, + 0x76, 0xd0, 0xb5, 0x2e, 0x43, 0xed, 0x6b, 0x6d, 0xc4, 0x7f, 0x79, 0xf1, + 0x6f, 0xfb, 0x7d, 0x74, 0xc8, 0xb8, 0xb4, 0xd9, 0x57, 0x1b, 0x53, 0x3f, + 0x63, 0x59, 0xb3, 0xb6, 0xdf, 0x47, 0xd7, 0x10, 0xff, 0xa9, 0x9f, 0xb1, + 0x74, 0xb1, 0xc4, 0x24, 0x96, 0x73, 0xaa, 0x8b, 0xf5, 0x9a, 0xef, 0x8d, + 0x53, 0x8c, 0x3f, 0x5c, 0xbb, 0x7d, 0x8e, 0xff, 0x14, 0xe3, 0x8f, 0xc7, + 0xd4, 0xe4, 0x9c, 0xaf, 0x39, 0x3e, 0x63, 0x5b, 0x7b, 0xfb, 0x17, 0xff, + 0x7e, 0xca, 0xda, 0xbf, 0xfc, 0x25, 0xd4, 0xe9, 0x73, 0x8d, 0xa4, 0x3d, + 0x1a, 0x62, 0xdd, 0xba, 0x7d, 0xb6, 0x3d, 0xc4, 0xfe, 0xfb, 0x48, 0x76, + 0xfc, 0xa3, 0x64, 0xec, 0x63, 0x5a, 0xaa, 0xd6, 0x49, 0xb5, 0xd8, 0x3f, + 0x37, 0x6e, 0xdc, 0x98, 0xbb, 0x0a, 0xc0, 0x8a, 0xe4, 0xfb, 0x8c, 0xcf, + 0x3e, 0x7f, 0x12, 0x11, 0xc3, 0x7f, 0xa9, 0x6d, 0xfa, 0x00, 0xb1, 0x49, + 0x32, 0x96, 0x21, 0x0d, 0xbd, 0xbf, 0xae, 0xdb, 0x1b, 0x7b, 0x79, 0x99, + 0x2c, 0xc6, 0x59, 0xcc, 0x23, 0x22, 0xbe, 0x7e, 0xf6, 0xe3, 0x88, 0x88, + 0x78, 0xf3, 0xfa, 0xb0, 0xd9, 0x83, 0xc5, 0x7f, 0x79, 0xf1, 0xcf, 0x62, + 0x9c, 0xc5, 0x3c, 0x62, 0xbc, 0xf6, 0xdf, 0xc7, 0x58, 0xd7, 0xc4, 0xd4, + 0xd7, 0xda, 0x10, 0xfb, 0x1e, 0xb2, 0x6e, 0x53, 0xb6, 0xff, 0x3e, 0xc4, + 0xbf, 0xf9, 0xf2, 0x36, 0xa6, 0x6c, 0xff, 0x7d, 0xcf, 0xf5, 0x9c, 0xb1, + 0x1a, 0xc3, 0x12, 0x12, 0x3d, 0x2c, 0xe1, 0xfe, 0x2f, 0xfe, 0xf3, 0x99, + 0xeb, 0xfe, 0xbf, 0x2f, 0xd7, 0x42, 0xb6, 0xbf, 0xa5, 0xd4, 0xa7, 0xad, + 0xb9, 0xee, 0xff, 0xe2, 0xbf, 0x0c, 0x65, 0xed, 0x7f, 0xc8, 0x01, 0x57, + 0x55, 0x89, 0xc1, 0xa6, 0xb2, 0x94, 0x97, 0x99, 0x6d, 0x92, 0xc9, 0x66, + 0xcb, 0xe7, 0xb8, 0x7e, 0x86, 0x1c, 0x70, 0x25, 0xfe, 0x2f, 0xad, 0x25, + 0xfe, 0x30, 0x92, 0xc1, 0x1b, 0xe0, 0xc9, 0xc9, 0xc9, 0x95, 0x04, 0x31, + 0x53, 0x29, 0x26, 0xe7, 0x39, 0x39, 0x39, 0x89, 0x0f, 0x3e, 0xf8, 0x60, + 0x96, 0xba, 0x34, 0x55, 0x4c, 0x5e, 0x73, 0x71, 0x71, 0x11, 0x17, 0x17, + 0x17, 0xe9, 0xe3, 0xc7, 0x8f, 0x8b, 0xcb, 0xd2, 0x58, 0x59, 0x32, 0xa5, + 0x21, 0x8f, 0xad, 0x4d, 0x6c, 0x4f, 0x4f, 0x4f, 0x93, 0xc3, 0xc3, 0xc3, + 0xc8, 0x27, 0x63, 0xca, 0xa6, 0x88, 0x88, 0x7f, 0xfe, 0xe7, 0x7f, 0x4e, + 0xb3, 0x32, 0xcf, 0x13, 0x30, 0xe5, 0xeb, 0x31, 0x89, 0xe7, 0xf5, 0xb9, + 0x54, 0xb7, 0x62, 0x3d, 0x23, 0xe6, 0x6d, 0x4f, 0x75, 0x9e, 0xd7, 0xff, + 0xca, 0x31, 0x74, 0xd9, 0x56, 0xfe, 0x18, 0x4f, 0x4e, 0x4e, 0x2e, 0x2d, + 0x5b, 0x43, 0x3c, 0xfb, 0x9a, 0xba, 0xef, 0xda, 0xe7, 0x7e, 0x07, 0x00, + 0xe8, 0x6f, 0x0d, 0xef, 0x1f, 0xf6, 0xc9, 0x9c, 0xc7, 0xbc, 0xd6, 0xf7, + 0x0f, 0xfb, 0x64, 0xce, 0x63, 0x2e, 0x7b, 0xff, 0x10, 0x7f, 0xfa, 0xbb, + 0x88, 0x88, 0x78, 0xed, 0x67, 0xaf, 0x8d, 0xb6, 0x5f, 0xf1, 0x7f, 0x69, + 0xce, 0x63, 0x7e, 0x11, 0xe3, 0xe7, 0x31, 0x8f, 0x58, 0xe6, 0xf8, 0xb3, + 0x26, 0xda, 0x5e, 0x53, 0x63, 0xbc, 0xff, 0x9f, 0x6b, 0xec, 0x61, 0x57, + 0x6b, 0x19, 0x7f, 0xd6, 0x84, 0xf8, 0xb7, 0x37, 0x57, 0xff, 0x3f, 0x06, + 0xf1, 0x6f, 0xaf, 0xac, 0xff, 0x5f, 0x9a, 0x6c, 0x3c, 0xc4, 0xd4, 0xf7, + 0xa3, 0xa1, 0xc7, 0x9f, 0x4f, 0xb5, 0xfe, 0x9a, 0x65, 0x31, 0x2e, 0x4b, + 0xf2, 0x38, 0xf5, 0xfd, 0x48, 0xfc, 0xa7, 0x97, 0xc5, 0x38, 0x3f, 0x06, + 0x66, 0xa8, 0xef, 0xa3, 0x6d, 0xce, 0x6b, 0xb1, 0xec, 0x50, 0x31, 0x29, + 0xfb, 0xbe, 0x45, 0xb5, 0xa1, 0xbe, 0x8f, 0x2e, 0x21, 0xfe, 0xa5, 0xdf, + 0xb7, 0x16, 0x66, 0xc9, 0x09, 0xdf, 0xea, 0xc6, 0x7b, 0x66, 0xba, 0x24, + 0x34, 0xad, 0xda, 0x5f, 0xd7, 0xf5, 0xd7, 0x68, 0xc9, 0x09, 0xdf, 0xc4, + 0x7f, 0x7c, 0x73, 0xb5, 0xff, 0xb5, 0x9f, 0xd3, 0xa6, 0xd7, 0xe6, 0xd2, + 0xcd, 0xd5, 0xfe, 0xc5, 0x7f, 0x19, 0xe4, 0x2f, 0xa1, 0xad, 0xbe, 0xd7, + 0x4c, 0x59, 0x22, 0xa9, 0x24, 0xa7, 0xed, 0xba, 0x53, 0x1a, 0x63, 0xff, + 0x4d, 0x8f, 0x7d, 0x0b, 0xae, 0xb5, 0x5d, 0x21, 0x49, 0x92, 0x64, 0xab, + 0x19, 0xc8, 0x96, 0x6c, 0x88, 0x8b, 0x79, 0x4d, 0x99, 0x5e, 0x81, 0xe9, + 0x95, 0xf5, 0x11, 0xb7, 0x6e, 0x1e, 0xc7, 0xfd, 0xb8, 0xdf, 0x79, 0x9b, + 0x6d, 0x5f, 0xd0, 0x95, 0x95, 0xaf, 0xda, 0x46, 0xd7, 0x07, 0x8e, 0x6d, + 0xb6, 0xd9, 0x67, 0x5b, 0x7d, 0xf7, 0xd5, 0xa4, 0x2e, 0x43, 0x7f, 0xd7, + 0xc9, 0xc7, 0xfc, 0x8d, 0xeb, 0x7f, 0x8d, 0xf8, 0x5b, 0xf7, 0x6d, 0x89, + 0xff, 0xfa, 0xe2, 0x9f, 0x8f, 0x79, 0x97, 0xf6, 0xdf, 0x37, 0xe6, 0x7d, + 0xaf, 0x89, 0xba, 0x32, 0x5d, 0xe3, 0xd1, 0xe5, 0x3c, 0xb7, 0xa9, 0xc3, + 0xd8, 0xd7, 0x49, 0x53, 0x7d, 0xdb, 0xbf, 0xf8, 0x77, 0xab, 0xc3, 0x52, + 0xe2, 0xdf, 0xb7, 0xfd, 0x37, 0xad, 0x53, 0xdf, 0x7e, 0x7d, 0xaa, 0x3e, + 0xbc, 0xcb, 0xf5, 0xd9, 0x75, 0x9f, 0x6d, 0x8e, 0xb3, 0x6b, 0xbb, 0xa8, + 0x33, 0xd4, 0xfd, 0x5f, 0xfc, 0xdb, 0xef, 0x73, 0x09, 0xf1, 0x1f, 0xaa, + 0xfd, 0xe7, 0xad, 0xe9, 0x5a, 0x18, 0x62, 0x7b, 0x63, 0x5e, 0x4f, 0x63, + 0x3f, 0xdb, 0x1c, 0xf2, 0xfb, 0x7f, 0x46, 0xfc, 0x77, 0x2f, 0x5b, 0x5a, + 0xfc, 0xf3, 0x31, 0x7f, 0xef, 0xdd, 0xf7, 0x23, 0xe2, 0x87, 0x01, 0x58, + 0x4f, 0x9e, 0xf4, 0x1f, 0x7c, 0x95, 0xaf, 0x7b, 0xd5, 0xa3, 0xe6, 0x21, + 0xfb, 0xd4, 0x7d, 0xd2, 0xf4, 0xfc, 0x75, 0x51, 0x16, 0xe3, 0xa3, 0xb7, + 0x5f, 0x8d, 0xf8, 0xfa, 0xf9, 0x00, 0xac, 0x6f, 0xfb, 0xef, 0x43, 0xfc, + 0xfb, 0x19, 0x33, 0xfe, 0x7d, 0x63, 0xec, 0xfd, 0xd1, 0x32, 0x2d, 0xe9, + 0x65, 0x68, 0x21, 0x69, 0x4a, 0x69, 0xbd, 0x72, 0x65, 0xae, 0x5c, 0x4b, + 0x2d, 0x97, 0x25, 0xc5, 0xf9, 0x87, 0x87, 0x87, 0xd9, 0xfc, 0x46, 0xdb, + 0x7e, 0x5e, 0xbe, 0xcd, 0xfe, 0xd3, 0xc2, 0xbc, 0x62, 0xb1, 0xa5, 0x49, + 0x0e, 0x0f, 0x0f, 0xb3, 0xe4, 0x35, 0xc5, 0x24, 0x36, 0x97, 0xce, 0x63, + 0x44, 0xb3, 0x73, 0xd4, 0x46, 0xd5, 0xf9, 0x6c, 0x52, 0xb6, 0x66, 0xdf, + 0xbd, 0x8f, 0xad, 0xb0, 0xac, 0x69, 0x6c, 0x93, 0xd3, 0xd3, 0xd3, 0xe2, + 0x36, 0x8a, 0xfb, 0x2e, 0x6e, 0xef, 0x4a, 0x5b, 0xe8, 0x7b, 0xae, 0x2b, + 0xd6, 0x2f, 0x3b, 0x1f, 0x4d, 0xd6, 0x6f, 0xd5, 0x9e, 0x9a, 0xd6, 0xa9, + 0x4d, 0xd9, 0x92, 0xfd, 0xed, 0x3c, 0x86, 0xa6, 0xe7, 0x2f, 0x97, 0x54, + 0x2a, 0x5f, 0xa7, 0xfc, 0xf9, 0x19, 0x24, 0x9e, 0x63, 0xab, 0x3b, 0xde, + 0xbe, 0xd7, 0x77, 0xc3, 0x78, 0x34, 0xd5, 0xaa, 0x6d, 0x02, 0x00, 0xdb, + 0x31, 0xd4, 0xfb, 0x87, 0x3a, 0x63, 0x3c, 0xaf, 0x1d, 0xf3, 0x3d, 0x51, + 0xdd, 0xf6, 0x96, 0xfe, 0x8c, 0xb9, 0xca, 0x18, 0xef, 0x1f, 0xea, 0x88, + 0x7f, 0xf3, 0x6d, 0x8f, 0xed, 0x52, 0xcc, 0x7f, 0xf9, 0x4d, 0xc4, 0xef, + 0xc6, 0xdf, 0xa7, 0xf8, 0x37, 0xdf, 0xf6, 0xe8, 0x72, 0x31, 0x1f, 0xbb, + 0xff, 0xef, 0x73, 0x9e, 0xfa, 0x9e, 0xc3, 0x29, 0xc6, 0x35, 0x2d, 0x65, + 0x4c, 0x51, 0x1b, 0x53, 0xf6, 0xff, 0xe2, 0xdf, 0x7e, 0x3f, 0x63, 0x9b, + 0xb2, 0xff, 0x17, 0xff, 0xf6, 0xfb, 0x19, 0xdd, 0x44, 0xf7, 0xfc, 0x2e, + 0xc6, 0x4e, 0x40, 0xd3, 0x35, 0x26, 0x6d, 0xd7, 0x1b, 0xf2, 0xfb, 0x40, + 0xdf, 0xb1, 0x76, 0x43, 0xb6, 0xb9, 0x31, 0x5c, 0x4d, 0xf2, 0xf8, 0xaf, + 0xa3, 0xed, 0x4b, 0xfc, 0x97, 0x17, 0xff, 0x7c, 0xcc, 0xdb, 0x7e, 0x1f, + 0xed, 0x1b, 0x97, 0xae, 0xf3, 0xdb, 0x98, 0xea, 0x19, 0xcb, 0x3e, 0x68, + 0xfb, 0x7d, 0x74, 0x0d, 0xf1, 0x9f, 0xea, 0x19, 0x4b, 0x17, 0x43, 0x8f, + 0x3f, 0x1c, 0xda, 0xd0, 0xfd, 0x51, 0x9b, 0xeb, 0x65, 0x8c, 0xf1, 0x73, + 0x73, 0x9a, 0x62, 0xfc, 0xe1, 0xd0, 0xc4, 0x7f, 0x38, 0x65, 0x31, 0x5e, + 0x42, 0xfb, 0x6f, 0x73, 0x2e, 0x93, 0x24, 0x59, 0x4c, 0x42, 0xa6, 0xb5, + 0x5d, 0x03, 0x4b, 0x6d, 0xff, 0xe2, 0x3f, 0x8d, 0xaa, 0x18, 0xcb, 0x5f, + 0x42, 0x9d, 0xaa, 0x6b, 0xa4, 0x6e, 0x5c, 0x7a, 0xdd, 0x18, 0xe9, 0xfc, + 0xfa, 0xc5, 0xb2, 0xf9, 0x71, 0xef, 0x69, 0x9a, 0xa6, 0x55, 0xcb, 0xbb, + 0x68, 0x52, 0xf7, 0xaa, 0xfd, 0xd7, 0x6d, 0xb3, 0xac, 0x7e, 0xd9, 0x76, + 0x8c, 0xe7, 0xbf, 0xec, 0x95, 0x2e, 0x2b, 0x35, 0x09, 0x08, 0xd3, 0xe9, + 0x1b, 0x8f, 0xa7, 0x4f, 0x9f, 0x46, 0xc4, 0xfa, 0x7e, 0xe9, 0x07, 0x98, + 0x56, 0xd6, 0x47, 0x64, 0x7d, 0x46, 0x84, 0x5f, 0x31, 0xd8, 0xa2, 0xb2, + 0x5f, 0x0a, 0x63, 0x3b, 0xf2, 0x31, 0xd7, 0xfe, 0xb7, 0x47, 0xfb, 0xdf, + 0x36, 0xed, 0x7f, 0xdb, 0xb4, 0xff, 0x6d, 0xd3, 0xfe, 0xb7, 0x4d, 0xfb, + 0xdf, 0xb6, 0xb1, 0x62, 0x9e, 0xa6, 0xe9, 0xa5, 0xa9, 0x69, 0xd9, 0x21, + 0x97, 0x0d, 0xa9, 0xcf, 0xbe, 0xba, 0x2e, 0x6f, 0x7a, 0xfe, 0xba, 0xc8, + 0x5e, 0x4a, 0x65, 0x03, 0x19, 0x86, 0x26, 0xfe, 0xfd, 0x97, 0x8f, 0x19, + 0xff, 0xaf, 0x9e, 0xfd, 0xf0, 0xab, 0x60, 0x47, 0x6f, 0x77, 0xff, 0x15, + 0x4e, 0xef, 0x8f, 0x96, 0x45, 0x3c, 0x26, 0x57, 0x76, 0xbe, 0x97, 0x1e, + 0x83, 0x7c, 0xfd, 0xd2, 0xdc, 0x94, 0xc4, 0xf2, 0xeb, 0x5e, 0x67, 0xc8, + 0x63, 0x6b, 0x13, 0xdb, 0xe2, 0xf6, 0xf3, 0xfb, 0xce, 0xfe, 0x4e, 0x4a, + 0xca, 0x4d, 0x29, 0xad, 0x99, 0xd6, 0x60, 0xaa, 0xba, 0xaf, 0x21, 0x9e, + 0x7d, 0x4d, 0xdd, 0x77, 0xed, 0x73, 0xbf, 0x03, 0x00, 0x74, 0xe4, 0xfd, + 0xc3, 0xf6, 0x78, 0xff, 0xb0, 0x6d, 0x97, 0x62, 0xfe, 0xa7, 0xbf, 0x9b, + 0xaf, 0x22, 0xcc, 0x23, 0x17, 0x73, 0xfd, 0xff, 0xf6, 0xe8, 0xff, 0xb7, + 0x4d, 0xff, 0xbf, 0x71, 0x0b, 0x8e, 0xf9, 0xad, 0x9b, 0xc7, 0x73, 0x57, + 0x81, 0x89, 0xe5, 0x63, 0xfe, 0xc6, 0xf5, 0xbf, 0xce, 0x58, 0x13, 0xe6, + 0x90, 0x8f, 0xf9, 0x3e, 0x7e, 0x1f, 0xdd, 0xc7, 0x63, 0x1a, 0xcb, 0x3e, + 0x7e, 0x1f, 0xdd, 0xc7, 0x63, 0x5a, 0x92, 0x26, 0x89, 0x92, 0xb2, 0xa9, + 0xca, 0x50, 0xe3, 0xe7, 0x96, 0x6a, 0xec, 0xf1, 0x87, 0x73, 0x11, 0xff, + 0x66, 0x86, 0x18, 0x7f, 0x38, 0x94, 0xb2, 0x98, 0x14, 0xcf, 0xe5, 0xae, + 0x73, 0xdb, 0x24, 0x8e, 0x6d, 0x14, 0x63, 0xd9, 0xb4, 0x1e, 0x4d, 0xf7, + 0xbf, 0x94, 0x6b, 0x64, 0x49, 0xed, 0x5f, 0xfc, 0xa7, 0x57, 0xd6, 0xfe, + 0xe5, 0x2f, 0xa1, 0xa9, 0x62, 0xfe, 0x8a, 0x5d, 0x63, 0x9f, 0xd7, 0x30, + 0x26, 0x7a, 0xe9, 0x75, 0x5f, 0x4a, 0x3d, 0xa6, 0x76, 0xad, 0xeb, 0x8a, + 0x32, 0x94, 0x2d, 0xc3, 0x56, 0x2f, 0x5c, 0x60, 0x79, 0x8e, 0x8f, 0x5f, + 0xbe, 0x5c, 0x28, 0x66, 0x05, 0x3d, 0x3a, 0x3a, 0xba, 0x34, 0xaf, 0xf8, + 0x25, 0x38, 0x5b, 0x96, 0x2f, 0xd7, 0xb7, 0x4c, 0xdd, 0xba, 0x63, 0xaf, + 0x5f, 0x96, 0x19, 0x35, 0x5f, 0xfe, 0xfc, 0xfc, 0x7c, 0xd6, 0xfd, 0x77, + 0x29, 0x5f, 0xe5, 0x37, 0x07, 0x3f, 0x7d, 0xf1, 0x39, 0xfb, 0x07, 0x50, + 0xe6, 0xcd, 0xeb, 0xaf, 0x5e, 0x9a, 0xf7, 0xe6, 0xf5, 0xcb, 0x0f, 0x46, + 0xb2, 0x65, 0xf9, 0x72, 0x7d, 0xcb, 0xd4, 0xad, 0x3b, 0xf6, 0xfa, 0xc5, + 0x73, 0x50, 0x2c, 0xff, 0xd5, 0xb3, 0xef, 0x67, 0xdd, 0x7f, 0x97, 0xf2, + 0x55, 0xb4, 0x7f, 0xed, 0x3f, 0xa3, 0xfd, 0x6b, 0xff, 0x79, 0xda, 0xff, + 0xd5, 0xf2, 0xda, 0x7f, 0x5c, 0x29, 0xaf, 0xfd, 0x6b, 0xff, 0xda, 0xbf, + 0xf6, 0x3f, 0x44, 0x99, 0xba, 0x75, 0xc7, 0x5e, 0x7f, 0x0b, 0xed, 0xff, + 0xe3, 0x4f, 0x3e, 0xaa, 0x5c, 0x3e, 0x84, 0x31, 0x1f, 0x73, 0xee, 0xfa, + 0xe5, 0xa0, 0x31, 0xf6, 0xd9, 0x75, 0x5f, 0x63, 0x2f, 0xef, 0xe3, 0xfc, + 0x8b, 0xab, 0xd7, 0xcc, 0xd0, 0xc4, 0x7f, 0xb9, 0xf1, 0xef, 0xc2, 0xfb, + 0xa3, 0x65, 0x58, 0xf8, 0xfb, 0xa3, 0x26, 0x75, 0xab, 0x2a, 0xd3, 0x65, + 0x59, 0xd2, 0xa0, 0xcc, 0xae, 0x65, 0xc5, 0x79, 0x7d, 0xd7, 0x5f, 0xa2, + 0x36, 0x75, 0x1c, 0xfa, 0x18, 0xc7, 0xde, 0x77, 0xdf, 0xed, 0x77, 0xdd, + 0xf7, 0x10, 0x71, 0xef, 0x7b, 0xae, 0xc7, 0x58, 0xbf, 0x38, 0x7f, 0x88, + 0x04, 0x65, 0x6d, 0xca, 0x8e, 0xb1, 0x7e, 0xdf, 0x3e, 0x69, 0x29, 0xea, + 0x8e, 0x6d, 0x8c, 0xbe, 0x6f, 0xaa, 0xb6, 0x0f, 0x00, 0x6c, 0x88, 0xf7, + 0x0f, 0xde, 0x3f, 0x64, 0xbc, 0x7f, 0xd8, 0xc6, 0xfb, 0x87, 0xbc, 0xd7, + 0x4e, 0xfe, 0xfe, 0xc5, 0xe7, 0xef, 0xfe, 0xf2, 0xdd, 0xe5, 0x65, 0x3f, + 0x7b, 0xed, 0xd2, 0xbc, 0xd7, 0x7e, 0xf6, 0xda, 0xa5, 0xe5, 0xd9, 0xb2, + 0x7c, 0xb9, 0xbe, 0x65, 0xea, 0xd6, 0x1d, 0x7b, 0xfd, 0xe2, 0x39, 0x28, + 0x96, 0xff, 0xee, 0x2f, 0xdf, 0xcd, 0xba, 0xff, 0x2e, 0xe5, 0xab, 0xe8, + 0xff, 0xf5, 0xff, 0x19, 0xfd, 0xbf, 0xfe, 0xff, 0xd2, 0x32, 0xfd, 0xff, + 0x95, 0xf2, 0xfb, 0xd6, 0xff, 0x2f, 0x41, 0x3e, 0x01, 0x8d, 0xfb, 0xd1, + 0x36, 0xee, 0x47, 0x57, 0x93, 0x3c, 0xfe, 0x6b, 0x44, 0xb8, 0x1f, 0x55, + 0x95, 0x2b, 0x2b, 0xbf, 0xd6, 0xfb, 0x51, 0x3e, 0xe6, 0x79, 0x43, 0xb7, + 0xff, 0x36, 0xe5, 0x86, 0x2a, 0x4f, 0x77, 0x6b, 0x68, 0xff, 0x45, 0x6d, + 0xbe, 0x6f, 0x2d, 0xc1, 0x14, 0xe3, 0x0f, 0xd7, 0x6e, 0xd9, 0xc3, 0x7c, + 0xfa, 0x99, 0x62, 0xfc, 0xe1, 0xda, 0xed, 0x73, 0xfc, 0xf7, 0xa5, 0xfd, + 0x4f, 0x39, 0x0e, 0x75, 0x9f, 0xec, 0x4b, 0xfb, 0x17, 0x7f, 0x58, 0xae, + 0xfc, 0x78, 0xf5, 0x17, 0xe3, 0xa6, 0x8f, 0x7f, 0x72, 0xa5, 0x5c, 0xf2, + 0xe9, 0x97, 0x57, 0x96, 0xa5, 0xef, 0xbc, 0x95, 0x66, 0x7f, 0x67, 0xcb, + 0x8b, 0x63, 0xaf, 0xbb, 0x24, 0xc9, 0x6a, 0xb3, 0xac, 0xc9, 0x58, 0xef, + 0x2e, 0xfb, 0x6a, 0x3a, 0x86, 0x7c, 0xe1, 0x63, 0xcd, 0x61, 0x18, 0x07, + 0x07, 0x07, 0xe9, 0xbd, 0x7b, 0xf7, 0xd2, 0xdf, 0xff, 0xf6, 0x0f, 0xe9, + 0xf1, 0xf1, 0x71, 0xdd, 0xaf, 0x12, 0x9b, 0x4c, 0xa6, 0x0d, 0x4f, 0xc7, + 0xc7, 0xc7, 0xe9, 0xef, 0x7f, 0xfb, 0x87, 0xf4, 0xde, 0xbd, 0x7b, 0xe9, + 0xc1, 0xc1, 0x41, 0x1a, 0x11, 0xe9, 0xbd, 0x7b, 0xf7, 0x66, 0xaf, 0x97, + 0x69, 0xda, 0x29, 0x1f, 0xf3, 0x4f, 0x7e, 0xf4, 0x8b, 0xd9, 0xeb, 0x63, + 0x9a, 0x76, 0xca, 0xc7, 0x5c, 0xfb, 0xdf, 0xde, 0xa4, 0xfd, 0x6f, 0x7b, + 0xd2, 0xfe, 0xb7, 0x3d, 0x69, 0xff, 0xdb, 0x9e, 0xb4, 0xff, 0x6d, 0x4f, + 0xda, 0xff, 0xb6, 0xa7, 0x7c, 0xcc, 0x7f, 0xff, 0xdb, 0x3f, 0xa4, 0x11, + 0xe1, 0xf9, 0xe1, 0x06, 0xa6, 0x2c, 0xc6, 0x5f, 0x7d, 0xf9, 0xff, 0xbf, + 0x98, 0xf7, 0xbf, 0xde, 0xf8, 0xf7, 0x69, 0x44, 0xa4, 0xbf, 0x39, 0xf8, + 0xe9, 0xec, 0xf5, 0x33, 0x8d, 0x3b, 0x65, 0x31, 0x4e, 0xdf, 0x79, 0x2b, + 0x9b, 0x07, 0x00, 0xb0, 0x35, 0xb3, 0x7f, 0x27, 0x33, 0x99, 0x4c, 0x26, + 0x93, 0x69, 0x8b, 0x93, 0xf7, 0x0f, 0xdb, 0x9b, 0xbc, 0x7f, 0xd8, 0xf6, + 0x94, 0x8f, 0xf9, 0x6b, 0xbf, 0xfe, 0xd5, 0xec, 0xf5, 0x31, 0x4d, 0x3b, + 0xe5, 0x63, 0xae, 0xff, 0xdf, 0xde, 0xa4, 0xff, 0xdf, 0xf6, 0xa4, 0xff, + 0xdf, 0xf6, 0x94, 0x8b, 0xf9, 0xd2, 0xb8, 0x1f, 0x6d, 0x70, 0x72, 0x3f, + 0xda, 0xf6, 0xb4, 0xef, 0xe3, 0x21, 0x73, 0xc7, 0x44, 0xb5, 0xbd, 0x6c, + 0xff, 0xb9, 0x63, 0x5a, 0x1a, 0xe3, 0x0f, 0x37, 0x34, 0x19, 0x7f, 0xb8, + 0xed, 0xa9, 0x64, 0xfc, 0xa1, 0xf6, 0xbf, 0xa1, 0x49, 0xfb, 0xdf, 0xf6, + 0x54, 0x6c, 0xff, 0xf2, 0x97, 0x98, 0xda, 0x4c, 0xc5, 0xfc, 0x15, 0x55, + 0x22, 0x22, 0x2a, 0x0b, 0xbc, 0xf3, 0xd6, 0xce, 0x29, 0x22, 0xa2, 0x6e, + 0x39, 0xfb, 0xe9, 0xda, 0xdc, 0x15, 0x00, 0x60, 0xdd, 0xee, 0xdd, 0xbb, + 0x77, 0x65, 0xde, 0xad, 0x9b, 0x2f, 0x7f, 0xa5, 0xe1, 0xbd, 0x77, 0xdf, + 0x8f, 0x8f, 0x3f, 0xf9, 0x28, 0xde, 0x7b, 0xf7, 0xfd, 0x88, 0x88, 0x4b, + 0x9f, 0x33, 0xd9, 0xbc, 0xb2, 0x65, 0x6d, 0xca, 0xec, 0xd2, 0x67, 0xdd, + 0x36, 0xeb, 0x97, 0x95, 0xcb, 0x67, 0xd3, 0xee, 0xb2, 0xef, 0x31, 0xf7, + 0x5f, 0x57, 0x3e, 0xff, 0x2b, 0x2c, 0xbb, 0x7c, 0xf2, 0xa3, 0x5f, 0x5c, + 0x99, 0xf7, 0xc6, 0xf5, 0xbf, 0xbe, 0xf8, 0x7c, 0xf4, 0xf6, 0xab, 0x71, + 0xfe, 0xc5, 0xf7, 0x71, 0xf4, 0xf6, 0x0f, 0xbf, 0x82, 0x90, 0xff, 0x9c, + 0xc9, 0xe6, 0x95, 0x2d, 0x6b, 0x53, 0x66, 0x97, 0x3e, 0xeb, 0xb6, 0x59, + 0xbf, 0xac, 0x5c, 0x3e, 0x9b, 0x76, 0x97, 0x7d, 0x8f, 0xb9, 0xff, 0xba, + 0xf2, 0x3f, 0xfc, 0x0a, 0x4b, 0x35, 0xed, 0xbf, 0xba, 0x9c, 0xf6, 0xaf, + 0xfd, 0x67, 0xb4, 0x7f, 0xed, 0xbf, 0x0b, 0xed, 0x5f, 0xfb, 0xd7, 0xfe, + 0xb5, 0x7f, 0xed, 0x5f, 0xfb, 0x5f, 0x52, 0xfb, 0xef, 0x7a, 0x3d, 0xb3, + 0x1f, 0x8e, 0xde, 0x7e, 0x35, 0xe2, 0xeb, 0xb9, 0x6b, 0x01, 0x00, 0x00, + 0x00, 0xc0, 0x3e, 0xf3, 0xfe, 0xa1, 0xba, 0x9c, 0xf7, 0x0f, 0xde, 0x3f, + 0x64, 0xf6, 0xed, 0xfd, 0x43, 0x44, 0xc4, 0x6b, 0xbf, 0xfe, 0xd5, 0xd5, + 0x99, 0xbf, 0xfc, 0xe6, 0xe5, 0xe7, 0x7f, 0x88, 0x88, 0x3f, 0x3e, 0xff, + 0x6f, 0x14, 0x3e, 0x47, 0x61, 0x5e, 0xd9, 0xb2, 0x36, 0x65, 0x76, 0xe9, + 0xb3, 0x6e, 0x9b, 0xf5, 0xcb, 0xca, 0xfd, 0x31, 0xb7, 0xbc, 0xcb, 0xbe, + 0xc7, 0xdc, 0x7f, 0x5d, 0xf9, 0x3f, 0xfd, 0x5d, 0x6d, 0xd5, 0xf4, 0xff, + 0xd5, 0xe5, 0xf4, 0xff, 0xfa, 0xff, 0x8c, 0xfe, 0x3f, 0xf4, 0xff, 0x5d, + 0x2c, 0xb8, 0xff, 0x5f, 0x1a, 0xf7, 0xa3, 0xea, 0x72, 0xee, 0x47, 0xee, + 0x47, 0x99, 0x7d, 0xbc, 0x1f, 0x4d, 0xd5, 0xfe, 0x77, 0x95, 0x1b, 0xfb, + 0xfa, 0xa6, 0xda, 0x9a, 0xda, 0x7f, 0xf6, 0x39, 0xd3, 0xe4, 0xfa, 0x5e, + 0x12, 0xe3, 0x0f, 0xb7, 0xcd, 0xf8, 0xc3, 0x6d, 0xd3, 0xfe, 0xb7, 0x4d, + 0xfb, 0x07, 0xfa, 0x4a, 0x92, 0x24, 0xc9, 0x92, 0x69, 0xb5, 0x5d, 0x9e, + 0x7c, 0xfa, 0x65, 0x52, 0x95, 0x2c, 0xab, 0x6e, 0x39, 0xfb, 0x43, 0x52, + 0x2d, 0x00, 0x3a, 0xbb, 0x7f, 0xff, 0x7e, 0xf9, 0xfc, 0x28, 0x9f, 0xcf, + 0x7e, 0x79, 0xf7, 0x6f, 0xff, 0x52, 0xbe, 0xe0, 0x6f, 0xb9, 0xcf, 0x5f, + 0x17, 0xfe, 0x5b, 0xfc, 0x5c, 0x55, 0xae, 0x4b, 0x99, 0x31, 0xd6, 0x6d, + 0xb3, 0x7e, 0x55, 0xb9, 0x3e, 0x0f, 0x00, 0xc6, 0xda, 0x7f, 0xe5, 0x76, + 0xff, 0xb5, 0x72, 0x57, 0xda, 0xff, 0xb6, 0x69, 0xff, 0x2d, 0xcb, 0x69, + 0xff, 0xec, 0x11, 0xed, 0xbf, 0x65, 0x39, 0xed, 0x9f, 0x3d, 0xa2, 0xfd, + 0xb7, 0x2c, 0xb7, 0x67, 0xed, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x60, 0x2c, + 0xde, 0x3f, 0x6c, 0x9b, 0xf7, 0x0f, 0x2d, 0xcb, 0xed, 0xd9, 0xfb, 0x87, + 0xef, 0x7e, 0xf7, 0x3f, 0xca, 0x17, 0xfc, 0xae, 0x72, 0x35, 0xf6, 0x84, + 0xfe, 0x7f, 0xdb, 0xf4, 0xff, 0x2d, 0xcb, 0xe9, 0xff, 0x61, 0x34, 0xee, + 0x47, 0xdb, 0xe6, 0x7e, 0xd4, 0xb2, 0xdc, 0x9e, 0xdd, 0x8f, 0xb4, 0xff, + 0x6d, 0x5b, 0x65, 0xfb, 0xbf, 0xc4, 0x78, 0x3f, 0x00, 0x00, 0x80, 0x26, + 0x24, 0xd5, 0x22, 0x9e, 0x3e, 0x7d, 0x1a, 0xff, 0xf8, 0x8f, 0xff, 0x18, + 0xff, 0xf4, 0xa1, 0x87, 0x3e, 0x40, 0xb5, 0x3b, 0x77, 0x6f, 0xe7, 0xfb, + 0x8a, 0x64, 0xce, 0xba, 0x00, 0x00, 0x00, 0x00, 0x93, 0x78, 0xf1, 0xeb, + 0x1b, 0xe7, 0xe7, 0xe7, 0x73, 0xd6, 0x83, 0x09, 0xe5, 0x7f, 0xd9, 0x32, + 0xf3, 0xd5, 0xb3, 0xef, 0x4b, 0x4a, 0xb2, 0x8f, 0xf2, 0xbf, 0x6c, 0x09, + 0x00, 0x00, 0x00, 0x30, 0x32, 0xe3, 0x8f, 0x00, 0x00, 0x80, 0xb9, 0xf8, + 0xf7, 0x08, 0xc0, 0x36, 0xe9, 0xff, 0x67, 0x62, 0xfc, 0xe1, 0x76, 0x18, + 0x7f, 0xb8, 0x6d, 0x65, 0xe3, 0x0f, 0xb5, 0xff, 0xed, 0xd0, 0xfe, 0xb7, + 0x2d, 0xdf, 0xfe, 0xe5, 0x2f, 0xa1, 0x8d, 0x42, 0xfe, 0x8a, 0xc6, 0xd2, + 0x34, 0x4d, 0xde, 0x13, 0xb0, 0xe6, 0x00, 0x00, 0x20, 0x00, 0x49, 0x44, + 0x41, 0x54, 0xeb, 0x4b, 0xed, 0x58, 0xf7, 0x9d, 0xb7, 0x3a, 0xaf, 0xcb, + 0xba, 0xbc, 0x32, 0x77, 0x05, 0x98, 0xdf, 0x8d, 0x1b, 0x37, 0xe2, 0xe1, + 0x83, 0x47, 0x73, 0x57, 0x03, 0x58, 0x81, 0x87, 0x0f, 0x1e, 0xc5, 0x8d, + 0x1b, 0x37, 0xe6, 0xae, 0x06, 0x00, 0x00, 0x00, 0x00, 0x23, 0xc8, 0x06, + 0x2e, 0xbc, 0xf7, 0xee, 0xfb, 0x33, 0xd7, 0x84, 0x39, 0x64, 0x03, 0x17, + 0x8e, 0xde, 0x7e, 0x75, 0xe6, 0x9a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xb0, 0x26, 0xc6, 0x1f, 0x6e, 0x9b, 0xf1, 0x87, 0xdb, + 0xa6, 0xfd, 0x6f, 0x5b, 0x59, 0xfb, 0x97, 0xbf, 0x84, 0x36, 0x86, 0xc8, + 0x5f, 0x91, 0x24, 0x49, 0xe7, 0xe4, 0xb9, 0xc9, 0xa7, 0x5f, 0x4a, 0xbc, + 0xbb, 0xc7, 0xae, 0xcd, 0x5d, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, + 0xdb, 0xd2, 0x34, 0x4d, 0xab, 0x96, 0x57, 0x25, 0xd2, 0x4a, 0xdf, 0x79, + 0xab, 0x7a, 0x5d, 0x89, 0xb4, 0x36, 0xe3, 0x95, 0xb9, 0x2b, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xc0, 0x72, 0x7d, 0xfc, 0xc9, 0x47, 0x73, 0x57, 0x81, + 0x89, 0x1c, 0x1d, 0x1d, 0x5d, 0x99, 0x77, 0xfe, 0xc5, 0xf7, 0x33, 0xd4, + 0x84, 0x39, 0xbc, 0x79, 0xdd, 0x2f, 0xc4, 0x01, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xc3, 0x31, 0xfe, 0x70, 0x3b, 0x8c, 0x3f, 0xdc, + 0xb6, 0xb2, 0xf1, 0x87, 0xda, 0xff, 0x76, 0x68, 0xff, 0xdb, 0x66, 0xfc, + 0x31, 0x43, 0xda, 0x95, 0x28, 0xab, 0x2a, 0x81, 0xd6, 0x8b, 0x32, 0x3b, + 0x12, 0x65, 0x49, 0xa0, 0xb5, 0x6d, 0xd7, 0xe6, 0xae, 0x00, 0xcb, 0x70, + 0xe7, 0xee, 0xed, 0xf8, 0xa7, 0x0f, 0xef, 0xcf, 0x5d, 0x0d, 0x60, 0xe1, + 0xee, 0xdc, 0xbd, 0x1d, 0x9f, 0x7d, 0xfe, 0x64, 0xee, 0x6a, 0x00, 0x00, + 0x00, 0x00, 0x13, 0x7a, 0xef, 0xdd, 0xf7, 0x23, 0xe2, 0x87, 0x17, 0x9e, + 0x4f, 0x9e, 0x78, 0x2e, 0xb0, 0x05, 0xf9, 0x81, 0x0c, 0x47, 0x6f, 0xbf, + 0x1a, 0xf1, 0xf5, 0xf3, 0x17, 0x9e, 0xdf, 0xce, 0x58, 0x29, 0x26, 0x63, + 0x20, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x04, + 0xe3, 0x0f, 0xb7, 0xc7, 0xf8, 0xc3, 0x6d, 0xcb, 0x8f, 0x3f, 0xd4, 0xfe, + 0xb7, 0x47, 0xfb, 0xdf, 0xb6, 0xe2, 0xf8, 0x63, 0xf9, 0x4b, 0x68, 0x2a, + 0x9f, 0xbf, 0x22, 0x4d, 0xd3, 0x34, 0x9b, 0x9f, 0x24, 0x49, 0x92, 0xfd, + 0x9d, 0xa6, 0x69, 0x5a, 0x4c, 0xac, 0x95, 0x2d, 0xcb, 0xe6, 0xe7, 0xd7, + 0xcd, 0x6f, 0xa3, 0x6a, 0xbb, 0x11, 0x11, 0x71, 0xfc, 0x93, 0x97, 0xe5, + 0x3f, 0xfd, 0x32, 0x49, 0xdf, 0x79, 0x2b, 0xdd, 0xf5, 0x77, 0x7e, 0x7e, + 0x44, 0x44, 0xd3, 0x65, 0x65, 0xdb, 0x2d, 0x39, 0x15, 0x8c, 0xe0, 0x95, + 0xb9, 0x2b, 0xc0, 0xfc, 0x6e, 0xdd, 0x3c, 0x9e, 0xbb, 0x0a, 0xc0, 0x8a, + 0xe8, 0x33, 0x00, 0x00, 0x00, 0x60, 0x9b, 0xce, 0xcf, 0xcf, 0xe7, 0xae, + 0x02, 0x23, 0xab, 0x8a, 0xf1, 0x57, 0xcf, 0x24, 0x5a, 0xda, 0x77, 0x62, + 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8c, 0xc1, 0xf8, + 0xc3, 0xfd, 0x67, 0xfc, 0xe1, 0xb6, 0x55, 0xc5, 0x58, 0xfb, 0xdf, 0x7f, + 0xda, 0xff, 0xb6, 0x95, 0xc5, 0x58, 0x2e, 0x02, 0xda, 0xea, 0x7b, 0xcd, + 0x94, 0x25, 0xd4, 0xaa, 0x9a, 0x3f, 0x84, 0xb2, 0x84, 0x5a, 0x55, 0xf3, + 0x99, 0xc7, 0xb5, 0xb9, 0x2b, 0xc0, 0xfc, 0xb2, 0xac, 0x7d, 0x00, 0x75, + 0x1e, 0x3e, 0x78, 0xa4, 0xcf, 0x00, 0x00, 0x00, 0x80, 0x8d, 0xc9, 0xff, + 0x6a, 0x10, 0xdb, 0x53, 0xfc, 0xd5, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x68, 0xc2, 0xf8, 0xc3, 0x6d, 0x33, 0xfe, 0x70, + 0xdb, 0xb4, 0xff, 0x6d, 0xd3, 0xfe, 0xb7, 0x4d, 0x2e, 0x02, 0xda, 0xd8, + 0x95, 0xbf, 0x22, 0x9f, 0x10, 0x2b, 0x49, 0x92, 0x24, 0xfb, 0x6f, 0xd9, + 0xfc, 0xbc, 0x62, 0x99, 0xba, 0xed, 0xe6, 0x93, 0x60, 0xe5, 0x3f, 0x27, + 0x9f, 0x7e, 0x99, 0x64, 0xff, 0x2d, 0x9b, 0x7f, 0x69, 0x9f, 0x85, 0x32, + 0x57, 0xf6, 0x59, 0xb3, 0x3e, 0xe3, 0x79, 0x65, 0xee, 0x0a, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xb0, 0x7c, 0x47, 0x47, 0x47, 0x73, 0x57, 0x81, 0x91, + 0x65, 0x31, 0x7e, 0xef, 0xdd, 0xf7, 0xaf, 0x2c, 0x7b, 0xf3, 0xfa, 0xab, + 0x53, 0x57, 0x87, 0x89, 0x65, 0x31, 0x3e, 0x7a, 0x5b, 0xac, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xe1, 0x18, 0x7f, 0xb8, 0xff, + 0x8c, 0x3f, 0xdc, 0xb6, 0xaa, 0xf1, 0x87, 0xda, 0xff, 0xfe, 0xd3, 0xfe, + 0xb7, 0xcd, 0xf8, 0x63, 0x96, 0x28, 0xc9, 0x99, 0x6c, 0x9f, 0x9f, 0x7e, + 0x99, 0x64, 0xd3, 0x54, 0xfb, 0xa4, 0x9e, 0xa4, 0x5a, 0xc4, 0xad, 0x9b, + 0xc7, 0x71, 0xe7, 0xee, 0xed, 0xb9, 0xab, 0x01, 0xac, 0xc0, 0x9d, 0xbb, + 0xb7, 0xe3, 0xd6, 0xcd, 0xe3, 0xb9, 0xab, 0x01, 0x00, 0x00, 0x00, 0x4c, + 0xa8, 0xec, 0x05, 0x27, 0xfb, 0xe9, 0xfc, 0xfc, 0xfc, 0xca, 0x3c, 0x2f, + 0x38, 0xb7, 0xe3, 0xab, 0x67, 0x7e, 0x15, 0x0c, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x18, 0x8e, 0xf1, 0x87, 0xdb, 0x61, 0xfc, 0xe1, + 0xb6, 0x95, 0x8d, 0x3f, 0xd4, 0xfe, 0xb7, 0x43, 0xfb, 0xdf, 0xb6, 0xb2, + 0xf6, 0x2f, 0x7f, 0x09, 0x6d, 0x8c, 0x91, 0xbf, 0x22, 0xcd, 0x19, 0x74, + 0xc3, 0x55, 0xfb, 0x7c, 0xe7, 0xad, 0x34, 0x9b, 0xa6, 0xda, 0x27, 0xf5, + 0x24, 0xd5, 0x22, 0x3e, 0xfb, 0xfc, 0xc9, 0xdc, 0x55, 0x00, 0x56, 0x44, + 0x9f, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xe4, 0xc9, 0x45, 0x40, 0x5b, 0x65, 0xd7, + 0x4c, 0x92, 0x24, 0x49, 0xf6, 0x79, 0xc8, 0xe4, 0x58, 0x55, 0xdb, 0x4d, + 0x3e, 0xfd, 0xf2, 0xe5, 0xb2, 0x01, 0x93, 0x63, 0x8d, 0xb5, 0x5d, 0xea, + 0x49, 0xaa, 0xc5, 0x8b, 0xac, 0x7d, 0x65, 0x59, 0x40, 0x01, 0x32, 0x59, + 0x1f, 0x31, 0x74, 0xa6, 0x4f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0xdd, 0xe4, 0x2f, + 0xa1, 0xa9, 0xb6, 0xf9, 0x2b, 0x8a, 0x49, 0xb0, 0xca, 0x92, 0x6d, 0x0d, + 0x99, 0x80, 0x2b, 0xe2, 0x6a, 0x12, 0xac, 0xb2, 0xa4, 0x58, 0x12, 0x65, + 0x2d, 0x97, 0xa4, 0x5a, 0x44, 0x44, 0xc4, 0xc3, 0x07, 0x8f, 0xe6, 0xae, + 0x02, 0xb0, 0x02, 0xfa, 0x0a, 0x00, 0x00, 0x00, 0xd8, 0x2e, 0x2f, 0xb5, + 0xb6, 0xed, 0xab, 0x67, 0xdf, 0xcf, 0x5d, 0x05, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x56, 0xc8, 0xf8, 0xc3, 0x6d, 0x33, 0xfe, + 0x70, 0xdb, 0xb4, 0xff, 0x6d, 0xd3, 0xfe, 0xb7, 0x4b, 0x4e, 0x02, 0x9a, + 0x1a, 0xe2, 0x5a, 0x49, 0x92, 0x24, 0x69, 0x33, 0x7f, 0x08, 0xc9, 0xa7, + 0x5f, 0x96, 0xef, 0x73, 0xc7, 0x7c, 0xe6, 0x21, 0xa9, 0x16, 0x11, 0x11, + 0x71, 0xe7, 0xee, 0xed, 0xb9, 0xab, 0x00, 0xac, 0x80, 0xbe, 0x02, 0x00, + 0x00, 0x00, 0xb6, 0xe7, 0xe3, 0x4f, 0x3e, 0x9a, 0xbb, 0x0a, 0x4c, 0x2c, + 0x1f, 0xf3, 0xf3, 0x2f, 0xbc, 0xcc, 0xde, 0x1a, 0x31, 0x07, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x86, 0x60, 0xfc, 0xe1, 0xf6, 0x18, + 0x7f, 0xb8, 0x6d, 0xf9, 0x98, 0x6b, 0xff, 0xdb, 0xa3, 0xfd, 0x6f, 0x5b, + 0x31, 0xe6, 0x72, 0x12, 0xd0, 0xd4, 0xae, 0x6b, 0x25, 0x4d, 0xd3, 0x34, + 0xfb, 0x9c, 0x25, 0xc7, 0x2a, 0x4b, 0x92, 0x95, 0x95, 0x2b, 0x2e, 0xcb, + 0xfe, 0xce, 0x6f, 0x27, 0x8e, 0x7f, 0x12, 0xe9, 0x3b, 0x6f, 0xa5, 0x71, + 0xfc, 0x93, 0x78, 0x31, 0xc5, 0x0f, 0x89, 0xb0, 0xca, 0x92, 0x61, 0xa5, + 0xef, 0xbc, 0x95, 0x96, 0x2d, 0xcf, 0xcf, 0xbf, 0xb4, 0xcf, 0xdc, 0xdf, + 0xd9, 0x3a, 0xd9, 0xbc, 0xe2, 0xdf, 0x4c, 0x43, 0x52, 0x2d, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x76, 0xfa, 0xec, 0xf3, 0x27, 0x11, 0x11, 0x71, 0x74, + 0x74, 0x34, 0x73, 0x4d, 0x18, 0x5b, 0x16, 0xe3, 0x2c, 0xe6, 0x11, 0x11, + 0x5f, 0x3f, 0xfb, 0x71, 0x44, 0x44, 0xbc, 0x79, 0xfd, 0xd5, 0x59, 0xea, + 0xc4, 0x74, 0xb2, 0x18, 0x67, 0x31, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xe8, 0xc3, 0xf8, 0xc3, 0xed, 0x30, 0xfe, 0x70, 0xdb, + 0xca, 0xc6, 0x1f, 0x6a, 0xff, 0xdb, 0xa1, 0xfd, 0x6f, 0x9b, 0xf1, 0xc7, + 0x8c, 0x25, 0x9f, 0x24, 0x2b, 0x4b, 0x8c, 0x75, 0x29, 0x41, 0x56, 0xce, + 0xae, 0xf9, 0x95, 0xdb, 0x2f, 0x49, 0x92, 0x95, 0xfd, 0xf7, 0xca, 0xf6, + 0x77, 0xcc, 0x67, 0xf9, 0xae, 0xcd, 0x5d, 0x01, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x96, 0xeb, 0xd6, 0xcd, 0xe3, 0xb8, 0x1f, 0xf7, 0xe7, 0xae, 0x06, + 0x13, 0xca, 0xc7, 0xfc, 0x8d, 0xeb, 0x7f, 0x8d, 0xf8, 0xdb, 0xcc, 0x15, + 0x62, 0x52, 0x62, 0x0e, 0x00, 0x6c, 0xd5, 0x2f, 0xe7, 0xae, 0x00, 0x00, + 0x6c, 0xd0, 0x9f, 0xe6, 0xae, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x2a, + 0xe3, 0x0f, 0xb7, 0xc7, 0xf8, 0xc3, 0x6d, 0xcb, 0xc7, 0x5c, 0xfb, 0xdf, + 0x1e, 0xed, 0x7f, 0xdb, 0xc4, 0x9c, 0xa9, 0x25, 0x49, 0x92, 0x54, 0x25, + 0xd3, 0x4a, 0xd3, 0x34, 0xcd, 0x27, 0xe6, 0x6a, 0xbd, 0xfd, 0x4f, 0xbf, + 0x4c, 0xaa, 0x92, 0x69, 0xa5, 0xef, 0xbc, 0x95, 0xe6, 0x13, 0x73, 0xb1, + 0x4c, 0xaf, 0xcc, 0x5d, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x96, 0x2b, + 0xff, 0xab, 0x41, 0x6c, 0x43, 0xd9, 0x2f, 0x45, 0xb1, 0x1d, 0x62, 0x0e, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0xc1, 0xf8, 0xc3, + 0xed, 0x31, 0xfe, 0x70, 0xdb, 0xf2, 0x31, 0xd7, 0xfe, 0xb7, 0x47, 0xfb, + 0xdf, 0x36, 0x31, 0x67, 0x68, 0xf9, 0x84, 0x59, 0x5d, 0x93, 0x63, 0x55, + 0x26, 0xdd, 0xca, 0x25, 0xcc, 0xea, 0x9a, 0x1c, 0xab, 0x2a, 0xe9, 0x16, + 0xcb, 0x70, 0x6d, 0xee, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb0, 0x0e, + 0xc7, 0xc7, 0xc7, 0x2f, 0x3e, 0x9f, 0x9f, 0x9f, 0x5f, 0x5a, 0x76, 0x74, + 0x74, 0x74, 0x69, 0xde, 0xd1, 0xd1, 0xd1, 0xa5, 0xe5, 0xd9, 0xb2, 0x7c, + 0xb9, 0xbe, 0x65, 0xea, 0xd6, 0x1d, 0x7b, 0xfd, 0xe2, 0x39, 0x28, 0x96, + 0x3f, 0x3f, 0x3f, 0x9f, 0x75, 0xff, 0x5d, 0xca, 0x57, 0xf9, 0xcd, 0xc1, + 0x4f, 0x5f, 0x7c, 0xfe, 0xea, 0xd9, 0xf7, 0x97, 0x96, 0xbd, 0x79, 0xfd, + 0xd5, 0x4b, 0xf3, 0xde, 0xbc, 0xfe, 0xea, 0xa5, 0xe5, 0xd9, 0xb2, 0x7c, + 0xb9, 0xbe, 0x65, 0xea, 0xd6, 0x1d, 0x7b, 0xfd, 0xe2, 0x39, 0x28, 0x96, + 0xff, 0xea, 0xd9, 0xf7, 0xb3, 0xee, 0xbf, 0x4b, 0x79, 0x00, 0x80, 0x2d, + 0xfb, 0x8f, 0x73, 0x57, 0x00, 0x00, 0x36, 0xe8, 0x4f, 0x73, 0x57, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x98, 0x8c, 0xf1, 0x87, 0xc6, 0x1f, 0x66, 0x8c, + 0x3f, 0xdc, 0xde, 0xf8, 0x43, 0xed, 0x5f, 0xfb, 0xcf, 0x68, 0xff, 0xdb, + 0x6b, 0xff, 0xd0, 0x55, 0x92, 0x24, 0x49, 0x96, 0x14, 0x2b, 0x4d, 0xd3, + 0xb4, 0x98, 0x58, 0xab, 0x2a, 0x61, 0x56, 0xa3, 0xed, 0x7f, 0xfa, 0x65, + 0x92, 0x25, 0xc5, 0x4a, 0xdf, 0x79, 0x2b, 0x2d, 0x26, 0xd6, 0x92, 0x30, + 0x6b, 0x3f, 0x74, 0xca, 0x96, 0xc6, 0xfe, 0x38, 0x38, 0x38, 0x48, 0xff, + 0xef, 0xff, 0xf6, 0x8f, 0x71, 0xe7, 0xee, 0xed, 0x78, 0xe3, 0x8d, 0x37, + 0xe2, 0xdf, 0xfe, 0xed, 0xdf, 0xe6, 0xae, 0x12, 0xb0, 0x50, 0xaf, 0xbf, + 0xfe, 0x7a, 0x7c, 0xfd, 0xf5, 0xd7, 0xf1, 0xf0, 0xc1, 0xa3, 0xf8, 0x3f, + 0x3f, 0xf8, 0x3f, 0xe2, 0xdb, 0x6f, 0xbf, 0x75, 0x0f, 0x01, 0x00, 0x00, + 0x80, 0xfd, 0x97, 0xde, 0xbb, 0x77, 0x2f, 0xee, 0xdf, 0xbf, 0x3f, 0x77, + 0x3d, 0x98, 0x50, 0x3e, 0xe6, 0x9f, 0xfc, 0xe8, 0x17, 0xf1, 0xee, 0xdf, + 0xfe, 0x65, 0xe6, 0x1a, 0x31, 0xa5, 0x5c, 0xcc, 0x3d, 0xff, 0x03, 0x00, + 0x36, 0xe5, 0x97, 0x11, 0x06, 0x42, 0x01, 0xc0, 0xc4, 0xfe, 0xe4, 0xf9, + 0x03, 0x00, 0x00, 0x00, 0x00, 0xec, 0x33, 0xe3, 0x0f, 0x37, 0xc8, 0xf8, + 0xc3, 0x6d, 0xcb, 0xc7, 0x5c, 0xfb, 0xdf, 0x1e, 0xed, 0x7f, 0xdb, 0xb2, + 0x98, 0x1f, 0x1c, 0x1c, 0x84, 0xfc, 0x25, 0x34, 0x55, 0xcc, 0x5f, 0xf1, + 0xcd, 0x37, 0xdf, 0xbc, 0x58, 0x96, 0x4f, 0xaa, 0x55, 0xf6, 0x77, 0x51, + 0xa3, 0xf2, 0xc7, 0x3f, 0x79, 0x59, 0x3e, 0x97, 0x54, 0xab, 0xec, 0xef, + 0x2b, 0xdb, 0x6f, 0x50, 0xbe, 0x98, 0x98, 0x8b, 0xf9, 0x5d, 0x9b, 0xbb, + 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2c, 0xdb, 0xbd, 0x7b, 0xf7, 0xae, + 0xcc, 0xbb, 0x75, 0xf3, 0xe5, 0xaf, 0x46, 0xbd, 0xf7, 0xee, 0xfb, 0xf1, + 0xf1, 0x27, 0x1f, 0xc5, 0x7b, 0xef, 0xbe, 0x1f, 0x11, 0x71, 0xe9, 0x73, + 0x26, 0x9b, 0x57, 0xb6, 0xac, 0x4d, 0x99, 0x5d, 0xfa, 0xac, 0xdb, 0x66, + 0xfd, 0xb2, 0x72, 0x1f, 0x7f, 0xf2, 0xd1, 0x8b, 0xe5, 0x5d, 0xf6, 0x3d, + 0xe6, 0xfe, 0xeb, 0xca, 0x7f, 0xf6, 0xf9, 0x93, 0xda, 0xba, 0x7d, 0xf2, + 0xa3, 0x5f, 0x5c, 0x99, 0xf7, 0xc6, 0xf5, 0xbf, 0xbe, 0xf8, 0x7c, 0xf4, + 0xf6, 0xab, 0x71, 0xfe, 0xc5, 0xf7, 0x71, 0xf4, 0xf6, 0x0f, 0xbf, 0x3a, + 0x94, 0xff, 0x9c, 0xc9, 0xe6, 0x95, 0x2d, 0x6b, 0x53, 0x66, 0x97, 0x3e, + 0xeb, 0xb6, 0x59, 0xbf, 0xac, 0xdc, 0xf9, 0x17, 0x2f, 0x7f, 0x81, 0xa9, + 0xcb, 0xbe, 0xc7, 0xdc, 0x7f, 0x5d, 0xf9, 0xaf, 0x9f, 0xfd, 0xb8, 0x53, + 0x7d, 0x01, 0x00, 0xf6, 0x91, 0xa4, 0x1e, 0xc0, 0x54, 0xb2, 0x24, 0x7e, + 0xff, 0x31, 0x22, 0xfe, 0x67, 0xe8, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xd8, 0x6f, 0xc6, 0x1f, 0x56, 0x97, 0x33, 0xfe, 0xd0, 0xf8, 0xc3, 0xcc, + 0x3e, 0x8e, 0x3f, 0xd4, 0xfe, 0xab, 0xcb, 0x69, 0xff, 0xda, 0x7f, 0x66, + 0x1f, 0xdb, 0x3f, 0xf4, 0x55, 0x95, 0x40, 0x2b, 0xa2, 0x3e, 0xc9, 0x56, + 0x5d, 0x99, 0xaa, 0x04, 0x5a, 0x11, 0xf5, 0x49, 0xb6, 0x9a, 0x96, 0x61, + 0x5e, 0x92, 0x6a, 0x01, 0x00, 0x00, 0x00, 0x00, 0xb0, 0xd3, 0xae, 0x5f, + 0x89, 0xba, 0x1f, 0x7e, 0x3d, 0x6a, 0x0b, 0x76, 0xfe, 0x4a, 0xd4, 0xdf, + 0x72, 0x9f, 0xbf, 0x2e, 0xfc, 0xb7, 0xf8, 0xb9, 0xaa, 0x5c, 0x97, 0x32, + 0x63, 0xac, 0xdb, 0x66, 0xfd, 0xaa, 0x72, 0x5d, 0xf7, 0x3d, 0xe6, 0xfe, + 0x2b, 0xb7, 0xfb, 0xaf, 0xf5, 0xf5, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xe8, 0xc0, 0xf8, 0xc3, 0x6d, 0x33, 0xfe, 0xb0, 0x65, + 0xb9, 0x3d, 0x1b, 0x7f, 0xa8, 0xfd, 0x6f, 0x9b, 0xf6, 0xdf, 0xb2, 0xdc, + 0x9e, 0xb5, 0x7f, 0x18, 0x5a, 0x92, 0x24, 0xa3, 0xfe, 0x58, 0x59, 0xf2, + 0xe9, 0x97, 0x7e, 0x0c, 0x6d, 0x4f, 0x49, 0xaa, 0x05, 0x00, 0x00, 0x00, + 0x00, 0xc0, 0x2e, 0x5e, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x6d, 0x19, 0x7f, 0x08, 0x00, 0xdb, 0x93, 0xce, 0x5d, + 0x01, 0xb6, 0x21, 0x4d, 0xd3, 0x17, 0xd7, 0x5a, 0x92, 0x24, 0x49, 0xf1, + 0xef, 0xd2, 0x65, 0x4f, 0xfe, 0xdf, 0x4b, 0xdb, 0xc8, 0x96, 0xa5, 0x25, + 0xd7, 0x6d, 0x1a, 0x91, 0xe6, 0xd7, 0x2d, 0x96, 0x49, 0x8f, 0x7f, 0x72, + 0x75, 0x9d, 0x77, 0xde, 0x4a, 0xb3, 0x04, 0x5d, 0xe9, 0x3b, 0x6f, 0x95, + 0xb6, 0x85, 0xe4, 0xd3, 0x2f, 0x93, 0xfc, 0xb2, 0x62, 0x42, 0xaf, 0xa6, + 0xeb, 0xb5, 0x59, 0xbe, 0xe5, 0xa4, 0x61, 0xaf, 0xcc, 0x5d, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x4c, 0x3e, 0x61, 0xd6, 0xd2, 0x55, 0x25, + 0xbe, 0x62, 0x7a, 0xd7, 0xe6, 0xae, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xb0, 0x6d, 0x49, 0x92, 0x24, 0x55, 0xc9, 0xb4, 0x92, 0x24, 0x49, 0xba, + 0x6e, 0xb7, 0xec, 0xef, 0xfc, 0xbe, 0x76, 0x6d, 0x3b, 0x3f, 0x3f, 0x9f, + 0x3c, 0x2b, 0xf9, 0xf4, 0xcb, 0xa4, 0x2a, 0x99, 0x56, 0xf2, 0xe9, 0x97, + 0xdd, 0xea, 0x5a, 0x58, 0x2f, 0xfb, 0xbb, 0xb8, 0xef, 0x21, 0xf7, 0xb9, + 0x6f, 0x24, 0xd5, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x16, 0xad, 0x49, + 0x12, 0xac, 0x21, 0xd7, 0x2b, 0xae, 0x1b, 0xc7, 0x3f, 0x69, 0xbe, 0x5e, + 0x83, 0x24, 0x58, 0x43, 0xae, 0xd7, 0x77, 0xdd, 0x7d, 0xf2, 0xca, 0xdc, + 0x15, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xbe, 0xae, 0xcd, 0x5d, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x2a, 0x49, 0x92, 0x24, 0x53, + 0xae, 0x57, 0x5c, 0x37, 0x7d, 0xe7, 0xad, 0xb4, 0xf1, 0x7a, 0x9f, 0x7e, + 0xd9, 0xad, 0xae, 0x1d, 0xd7, 0xeb, 0xbb, 0xee, 0x3e, 0x91, 0x54, 0x0b, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x98, 0x55, 0x9a, 0xa6, 0x95, 0x49, 0xab, + 0xf2, 0xcb, 0x8b, 0x89, 0xb2, 0xba, 0x2e, 0x6b, 0x55, 0xa7, 0xe3, 0x9f, + 0xbc, 0x9c, 0x5f, 0x93, 0x60, 0x2b, 0xbf, 0xbc, 0x98, 0xec, 0xaa, 0xeb, + 0xb2, 0xda, 0xba, 0xf6, 0x58, 0x77, 0x9f, 0xbc, 0x32, 0x77, 0x05, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x32, 0x6d, 0x93, 0x5f, 0xcd, 0x69, 0xcb, + 0x09, 0xac, 0x96, 0xe8, 0xda, 0xdc, 0x15, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xb6, 0x27, 0x9f, 0x3c, 0x2b, 0x4d, 0xd3, 0xb4, 0x38, 0xaf, 0x2a, + 0xb9, 0x56, 0xd7, 0x65, 0x75, 0x65, 0xba, 0x26, 0xf4, 0xaa, 0x4a, 0xae, + 0xd5, 0x75, 0x59, 0x5d, 0x19, 0x09, 0xbd, 0xae, 0x7a, 0x65, 0xee, 0x0a, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x5f, 0x92, 0x6a, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xb3, 0x49, 0xd3, 0x34, 0x8d, 0x88, 0x48, 0x92, + 0x24, 0x99, 0xbb, 0x2e, 0xac, 0x9b, 0xa4, 0x5a, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xac, 0x9e, 0xa4, 0x5a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, + 0x2c, 0xd2, 0x34, 0x4d, 0x23, 0x22, 0x92, 0x24, 0x49, 0xe6, 0xae, 0x0b, + 0xeb, 0x27, 0xa9, 0x16, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xab, 0x27, + 0xa9, 0x16, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0xb9, 0x34, 0x4d, 0xd3, + 0x88, 0x88, 0x24, 0x49, 0x92, 0xb9, 0xeb, 0xc2, 0x7e, 0x90, 0x54, 0x0b, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xd5, 0xbb, 0x36, 0x77, 0x05, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0xed, 0x49, 0x92, 0x24, 0x99, 0xbb, 0x0e, + 0xec, 0x97, 0x57, 0xe6, 0xae, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xf4, 0x25, 0xa9, 0x16, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xab, 0x27, + 0xa9, 0x16, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xab, 0x27, 0xa9, 0x16, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xab, 0x27, 0xa9, 0x16, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xab, 0x27, 0xa9, 0x16, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xab, 0x27, 0xa9, 0x16, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xab, 0x27, 0xa9, 0x16, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xab, 0x27, + 0xa9, 0x16, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xab, 0x27, 0xa9, 0x16, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xab, 0x27, 0xa9, 0x16, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xab, 0x27, 0xa9, 0x16, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xab, 0x27, 0xa9, 0x16, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xab, 0x27, 0xa9, 0x16, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xab, 0x27, + 0xa9, 0x16, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xab, 0x27, 0xa9, 0x16, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xab, 0x27, 0xa9, 0x16, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xab, 0x27, 0xa9, 0x16, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xab, 0x27, 0xa9, 0x16, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xab, 0x27, 0xa9, 0x16, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xab, 0x27, + 0xa9, 0x16, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xab, 0x27, 0xa9, 0x16, + 0x11, 0x11, 0xf1, 0xf0, 0xc1, 0xa3, 0xb9, 0xab, 0x00, 0xac, 0x80, 0xbe, + 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x28, 0x23, 0x27, 0x01, 0x4d, 0xb9, 0x56, 0x18, + 0x93, 0xa4, 0x5a, 0x44, 0x44, 0xc4, 0x9d, 0xbb, 0xb7, 0xe7, 0xae, 0x02, + 0xb0, 0x02, 0xfa, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x8c, 0x9c, 0x04, 0x34, + 0xe5, 0x5a, 0x61, 0x4c, 0x92, 0x6a, 0x11, 0x9f, 0x7d, 0xfe, 0x24, 0x22, + 0x22, 0x8e, 0x8e, 0x8e, 0x66, 0xae, 0x09, 0xb0, 0x64, 0x59, 0x1f, 0x91, + 0xf5, 0x19, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0xf2, 0x97, 0xd0, 0x9c, 0xfc, + 0x15, 0x8c, 0x4d, 0x52, 0x2d, 0xe2, 0xd6, 0xcd, 0xe3, 0xb9, 0xab, 0x00, + 0xac, 0x88, 0x3e, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc8, 0x93, 0x8b, 0x80, 0xb6, + 0x5c, 0x33, 0x8c, 0xe5, 0xda, 0xdc, 0x15, 0x60, 0x7e, 0xb2, 0xf6, 0x01, + 0x4d, 0x3d, 0x7c, 0xf0, 0x48, 0x9f, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5c, 0x22, + 0x17, 0x01, 0x6d, 0xc8, 0x5f, 0xc1, 0x98, 0x5e, 0x99, 0xbb, 0x02, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xd0, 0x97, 0xa4, 0x5a, 0xc4, 0xad, 0x9b, + 0xc7, 0x71, 0xe7, 0xee, 0xed, 0xb9, 0xab, 0x01, 0xac, 0xc0, 0x9d, 0xbb, + 0xb7, 0xe3, 0xd6, 0xcd, 0xe3, 0xb9, 0xab, 0x01, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2c, + 0x88, 0xfc, 0x25, 0xb4, 0x21, 0x7f, 0x05, 0x63, 0x92, 0x54, 0x8b, 0xf8, + 0xec, 0xf3, 0x27, 0x73, 0x57, 0x01, 0x58, 0x11, 0x7d, 0x06, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x90, 0x27, 0x17, 0x01, 0x6d, 0xb9, 0x66, 0x18, 0x8b, 0xa4, 0x5a, + 0x44, 0x44, 0xc4, 0xc3, 0x07, 0x8f, 0xe6, 0xae, 0x02, 0xb0, 0x02, 0xfa, + 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xa0, 0x8c, 0x9c, 0x04, 0x34, 0xe5, 0x5a, 0x61, + 0x4c, 0x92, 0x6a, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb0, 0x7a, 0x92, + 0x6a, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb0, 0x7a, 0x92, 0x6a, 0x11, + 0x4f, 0x9f, 0x3e, 0x8d, 0x3b, 0x77, 0x6f, 0xcf, 0x5d, 0x0d, 0x60, 0x05, + 0xee, 0xdc, 0xbd, 0x1d, 0x4f, 0x9f, 0x3e, 0x9d, 0xbb, 0x1a, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xc0, 0x82, 0xc8, 0x5f, 0x42, 0x1b, 0xf2, 0x57, 0x30, 0x26, 0x49, + 0xb5, 0x88, 0x1b, 0x37, 0x6e, 0xc4, 0xc3, 0x07, 0x8f, 0xe6, 0xae, 0x06, + 0xb0, 0x02, 0x0f, 0x1f, 0x3c, 0x8a, 0x1b, 0x37, 0x6e, 0xcc, 0x5d, 0x0d, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x60, 0x41, 0xe4, 0x2f, 0xa1, 0x0d, 0xf9, 0x2b, 0x18, + 0x93, 0xa4, 0x5a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xac, 0x9e, 0xa4, + 0x5a, 0xc4, 0xad, 0x9b, 0xc7, 0x71, 0xe7, 0xee, 0xed, 0xb9, 0xab, 0x01, + 0xac, 0xc0, 0x9d, 0xbb, 0xb7, 0xe3, 0xd6, 0xcd, 0xe3, 0xb9, 0xab, 0x01, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x2c, 0x88, 0xfc, 0x25, 0xb4, 0x21, 0x7f, 0x05, 0x63, + 0x92, 0x54, 0x8b, 0xf8, 0xec, 0xf3, 0x27, 0x73, 0x57, 0x01, 0x58, 0x11, + 0x7d, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x90, 0x27, 0x17, 0x01, 0x6d, 0xb9, 0x66, + 0x18, 0x8b, 0xa4, 0x5a, 0x44, 0x44, 0xc4, 0xc3, 0x07, 0x8f, 0xe6, 0xae, + 0x02, 0xb0, 0x02, 0xfa, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x8c, 0x9c, 0x04, + 0x34, 0xe5, 0x5a, 0x61, 0x4c, 0x92, 0x6a, 0x01, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xb0, 0x7a, 0x92, 0x6a, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb0, + 0x7a, 0x92, 0x6a, 0x11, 0x4f, 0x9f, 0x3e, 0x8d, 0x3b, 0x77, 0x6f, 0xcf, + 0x5d, 0x0d, 0x60, 0x05, 0xee, 0xdc, 0xbd, 0x1d, 0x4f, 0x9f, 0x3e, 0x9d, + 0xbb, 0x1a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x82, 0xc8, 0x5f, 0x42, 0x1b, 0xf2, + 0x57, 0x30, 0x26, 0x49, 0xb5, 0x88, 0xff, 0xf2, 0x9f, 0xef, 0x45, 0x44, + 0xc4, 0xf9, 0xf9, 0xf9, 0xcc, 0x35, 0x01, 0x96, 0x2c, 0xeb, 0x23, 0xb2, + 0x3e, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x42, 0xfe, 0x12, 0x9a, 0x93, 0xbf, + 0x82, 0xb1, 0x49, 0xaa, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xea, + 0x49, 0xaa, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xea, 0x49, 0xaa, + 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xea, 0x49, 0xaa, 0x05, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xc0, 0xea, 0x49, 0xaa, 0x05, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xc0, 0xea, 0x49, 0xaa, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xc0, 0xea, 0x49, 0xaa, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xea, + 0x49, 0xaa, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xea, 0x49, 0xaa, + 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xea, 0x49, 0xaa, 0x05, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xc0, 0xea, 0x49, 0xaa, 0x05, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xc0, 0xea, 0x49, 0xaa, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xc0, 0xea, 0x49, 0xaa, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xea, + 0x49, 0xaa, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xea, 0x49, 0xaa, + 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xea, 0x49, 0xaa, 0x05, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xc0, 0xea, 0x49, 0xaa, 0x05, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xc0, 0xea, 0x49, 0xaa, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xc0, 0xea, 0x49, 0xaa, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xea, + 0x49, 0xaa, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xea, 0x49, 0xaa, + 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xea, 0x49, 0xaa, 0x05, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xc0, 0xea, 0x49, 0xaa, 0x05, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xc0, 0xea, 0x49, 0xaa, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xc0, 0xea, 0x49, 0xaa, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xea, + 0x49, 0xaa, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xea, 0x49, 0xaa, + 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xea, 0x49, 0xaa, 0x05, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xc0, 0xea, 0x49, 0xaa, 0x05, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xc0, 0xea, 0x49, 0xaa, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xc0, 0xea, 0x49, 0xaa, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xea, + 0x49, 0xaa, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xea, 0x49, 0xaa, + 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xea, 0x49, 0xaa, 0x05, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xc0, 0xea, 0x49, 0xaa, 0x05, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xc0, 0xea, 0x49, 0xaa, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xc0, 0xea, 0x49, 0xaa, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xea, + 0x49, 0xaa, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xea, 0x49, 0xaa, + 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xea, 0x49, 0xaa, 0x05, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xc0, 0xea, 0x49, 0xaa, 0x05, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xc0, 0xea, 0x49, 0xaa, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xc0, 0xea, 0x49, 0xaa, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xea, + 0x49, 0xaa, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xea, 0x49, 0xaa, + 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xea, 0x49, 0xaa, 0x45, 0x44, + 0x44, 0x3c, 0x7c, 0xf0, 0x68, 0xee, 0x2a, 0x00, 0x2b, 0xa0, 0xaf, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xca, 0xc8, 0x49, 0x40, 0x53, 0xae, 0x15, 0xc6, 0x24, + 0xa9, 0x16, 0x11, 0x11, 0x71, 0xe7, 0xee, 0xed, 0xb9, 0xab, 0x00, 0xac, + 0x80, 0xbe, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x28, 0x23, 0x27, 0x01, 0x4d, 0xb9, + 0x56, 0x18, 0x93, 0xa4, 0x5a, 0xc4, 0x67, 0x9f, 0x3f, 0x89, 0x88, 0x88, + 0xa3, 0xa3, 0xa3, 0x99, 0x6b, 0x02, 0x2c, 0x59, 0xd6, 0x47, 0x64, 0x7d, + 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x40, 0x84, 0xfc, 0x25, 0x34, 0x27, 0x7f, 0x05, + 0x63, 0x93, 0x54, 0x8b, 0xb8, 0x75, 0xf3, 0x78, 0xee, 0x2a, 0x00, 0x2b, + 0xa2, 0xcf, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf2, 0xe4, 0x22, 0xa0, 0x2d, 0xd7, + 0x0c, 0x63, 0xb9, 0x36, 0x77, 0x05, 0x98, 0x9f, 0xac, 0x7d, 0x40, 0x53, + 0x0f, 0x1f, 0x3c, 0xd2, 0x67, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x97, 0xc8, 0x45, + 0x40, 0x1b, 0xf2, 0x57, 0x30, 0xa6, 0x57, 0xe6, 0xae, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xf4, 0x25, 0xa9, 0x16, 0x71, 0xeb, 0xe6, 0x71, + 0xdc, 0xb9, 0x7b, 0x7b, 0xee, 0x6a, 0x00, 0x2b, 0x70, 0xe7, 0xee, 0xed, + 0xb8, 0x75, 0xf3, 0x78, 0xee, 0x6a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0x22, + 0x7f, 0x09, 0x6d, 0xc8, 0x5f, 0xc1, 0x98, 0x24, 0xd5, 0x22, 0x3e, 0xfb, + 0xfc, 0xc9, 0xdc, 0x55, 0x00, 0x56, 0x44, 0x9f, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xe4, 0xc9, 0x45, 0x40, 0x5b, 0xae, 0x19, 0xc6, 0x22, 0xa9, 0x16, 0x11, + 0x11, 0xf1, 0xf0, 0xc1, 0xa3, 0xb9, 0xab, 0x00, 0xac, 0x80, 0xbe, 0x02, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x28, 0x23, 0x27, 0x01, 0x4d, 0xb9, 0x56, 0x18, 0x93, + 0xa4, 0x5a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xac, 0x9e, 0xa4, 0x5a, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xac, 0x9e, 0xa4, 0x5a, 0xc4, 0xd3, + 0xa7, 0x4f, 0xe3, 0xce, 0xdd, 0xdb, 0x73, 0x57, 0x03, 0x58, 0x81, 0x3b, + 0x77, 0x6f, 0xc7, 0xd3, 0xa7, 0x4f, 0xe7, 0xae, 0x06, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xb0, 0x20, 0xf2, 0x97, 0xd0, 0x86, 0xfc, 0x15, 0x8c, 0x49, 0x52, 0x2d, + 0xe2, 0xc6, 0x8d, 0x1b, 0xf1, 0xf0, 0xc1, 0xa3, 0xb9, 0xab, 0x01, 0xac, + 0xc0, 0xc3, 0x07, 0x8f, 0xe2, 0xc6, 0x8d, 0x1b, 0x73, 0x57, 0x03, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x58, 0x10, 0xf9, 0x4b, 0x68, 0x43, 0xfe, 0x0a, 0xc6, 0x24, + 0xa9, 0x16, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xab, 0x27, 0xa9, 0x16, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xab, 0x27, 0xa9, 0x16, 0xf1, 0xf4, + 0xe9, 0xd3, 0xb9, 0xab, 0x00, 0xac, 0x88, 0x3e, 0x03, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0x37, 0x7b, 0xf7, 0x1b, + 0x24, 0xc9, 0x79, 0xdf, 0x87, 0xfd, 0x7b, 0xf4, 0xd2, 0x9a, 0x33, 0x0f, + 0xd2, 0x6c, 0xb2, 0x2c, 0xed, 0x91, 0x90, 0xb3, 0x17, 0x1d, 0x04, 0x1c, + 0x0d, 0x96, 0x74, 0x10, 0x99, 0x22, 0x50, 0x12, 0x0d, 0xa0, 0x4a, 0x0a, + 0x01, 0x29, 0x65, 0x09, 0x90, 0x94, 0xa2, 0xa2, 0x38, 0x08, 0xed, 0x37, + 0x31, 0x29, 0xca, 0xb1, 0xac, 0x77, 0x76, 0x02, 0x45, 0xf6, 0x8b, 0x54, + 0x92, 0x72, 0x0c, 0x51, 0xf2, 0x0b, 0x4b, 0x30, 0xcb, 0xb1, 0xc4, 0x8a, + 0x2c, 0x80, 0x71, 0x45, 0x04, 0x68, 0x95, 0x0a, 0x84, 0x25, 0x16, 0xc0, + 0x32, 0x61, 0x9e, 0x54, 0x80, 0xb0, 0x47, 0x01, 0xe5, 0xdd, 0x18, 0x00, + 0x6f, 0x4b, 0xb8, 0xaa, 0x1d, 0x09, 0x27, 0xdd, 0xc8, 0xde, 0xe4, 0xf2, + 0x62, 0xa6, 0x67, 0x7b, 0x7b, 0x7b, 0x7a, 0x7a, 0x66, 0x67, 0xff, 0xcc, + 0xdd, 0xe7, 0x53, 0x05, 0x5c, 0xf7, 0xf3, 0x3c, 0xfd, 0xf4, 0xd3, 0xff, + 0x9e, 0xfe, 0x33, 0xdd, 0xbf, 0x05, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x4c, + 0x2c, 0x02, 0xa6, 0x65, 0x9f, 0xe1, 0xb0, 0x08, 0xaa, 0x05, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xc0, 0xc2, 0x13, 0x54, 0x8b, 0xdc, 0x7d, 0xf7, 0xdd, + 0x49, 0x92, 0xf5, 0xf5, 0xf5, 0x63, 0x6e, 0x09, 0x70, 0x92, 0x15, 0x7d, + 0x44, 0xd1, 0x67, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0xe2, 0x97, 0xd0, 0x9e, + 0xf8, 0x15, 0x1c, 0x36, 0x41, 0xb5, 0x18, 0xb9, 0x70, 0xe1, 0xc2, 0x71, + 0x37, 0x01, 0x38, 0xc1, 0xf4, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x13, 0xb1, + 0x09, 0x98, 0xc4, 0x3e, 0xc2, 0x61, 0x13, 0x54, 0x8b, 0xbc, 0xf2, 0xca, + 0x2b, 0xc7, 0xdd, 0x04, 0x60, 0x81, 0xe8, 0x33, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, + 0x32, 0xb1, 0x08, 0x98, 0x96, 0x7d, 0x86, 0xc3, 0x22, 0xa8, 0x16, 0x23, + 0xeb, 0xeb, 0xeb, 0xc7, 0xdd, 0x04, 0xe0, 0x04, 0xd3, 0x47, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x4d, 0xc4, 0x26, 0x60, 0x12, 0xfb, 0x08, 0x87, 0x4d, 0x50, + 0x2d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x16, 0x9e, 0xa0, 0x5a, 0xe4, + 0xee, 0xbb, 0xef, 0x4e, 0x92, 0x5c, 0xb8, 0x70, 0xe1, 0x98, 0x5b, 0x02, + 0x9c, 0x64, 0x45, 0x1f, 0x51, 0xf4, 0x19, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x89, + 0xf8, 0x25, 0xb4, 0x27, 0x7e, 0x05, 0x87, 0x4d, 0x50, 0x2d, 0xf2, 0xca, + 0x2b, 0xaf, 0x24, 0x49, 0xd6, 0xd7, 0xd7, 0x8f, 0xb9, 0x25, 0xc0, 0x49, + 0x56, 0xf4, 0x11, 0x45, 0x9f, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x90, 0x88, 0x5f, + 0x42, 0x7b, 0xe2, 0x57, 0x70, 0xd8, 0x04, 0xd5, 0x02, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x60, 0xe1, 0x09, 0xaa, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xc0, 0xc2, 0x13, 0x54, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x85, + 0x27, 0xa8, 0x16, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0x6f, 0xe9, + 0xb8, 0x1b, 0xc0, 0xc9, 0xb2, 0xb2, 0xb2, 0xb2, 0x2f, 0xed, 0xc2, 0x85, + 0x0b, 0x59, 0x5f, 0x5f, 0x1f, 0x0d, 0x27, 0xc9, 0xfa, 0xfa, 0xfa, 0x68, + 0x18, 0x58, 0x5c, 0xe5, 0x63, 0xb9, 0x7c, 0x9c, 0x17, 0xc3, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xd3, 0x10, 0xbf, 0xe4, 0xd6, 0x23, 0x7e, 0x05, 0x27, 0x89, + 0xa0, 0x5a, 0x8c, 0xfc, 0x6f, 0xff, 0xf3, 0x13, 0xc7, 0xdd, 0x84, 0xb1, + 0xfe, 0xea, 0x27, 0x3e, 0x9e, 0x7f, 0xfa, 0xe4, 0xe7, 0xf2, 0x57, 0x3f, + 0xf1, 0xf1, 0x24, 0xc9, 0x3f, 0x7d, 0xf2, 0x73, 0xa3, 0xf4, 0x42, 0x39, + 0xbf, 0xad, 0x45, 0xa9, 0x93, 0xe9, 0x54, 0xd7, 0x71, 0x75, 0x3b, 0x14, + 0xf9, 0x45, 0x7a, 0xa1, 0x9a, 0x3f, 0xeb, 0xf4, 0xf3, 0x6e, 0x17, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xc0, 0x22, 0x10, 0xbf, 0xe4, 0xf0, 0x63, 0x8d, 0x88, 0x5f, + 0x01, 0xcd, 0x4e, 0x1d, 0x77, 0x03, 0x38, 0x5e, 0xdd, 0x6e, 0xf7, 0xc6, + 0x07, 0x3f, 0xf8, 0xc1, 0xc6, 0x32, 0x77, 0xdf, 0x7d, 0x77, 0x5e, 0x79, + 0xe5, 0x95, 0x3d, 0xe3, 0x49, 0x46, 0x69, 0xc5, 0x78, 0x91, 0x56, 0x1e, + 0x9f, 0xd5, 0x47, 0x3e, 0xf4, 0xbd, 0xf9, 0xca, 0x4b, 0xbf, 0x53, 0x9b, + 0x9e, 0x64, 0x5f, 0x5e, 0x91, 0x5e, 0xce, 0x2b, 0xa7, 0x55, 0x95, 0xa7, + 0x3f, 0xe9, 0x75, 0x96, 0xd7, 0xc5, 0xbc, 0xca, 0x1e, 0xf7, 0xfc, 0x8b, + 0xb2, 0xf3, 0x9a, 0xbe, 0x6e, 0xdd, 0x57, 0xd3, 0xcb, 0x79, 0xe3, 0xf6, + 0xad, 0xa6, 0x7a, 0x0f, 0x3a, 0xfd, 0x41, 0xeb, 0x3d, 0xa8, 0xea, 0xb1, + 0x59, 0x3d, 0x7e, 0xab, 0xc7, 0x78, 0x79, 0xbc, 0xce, 0xcb, 0x2f, 0xbf, + 0x9c, 0x5e, 0xaf, 0xe7, 0x1c, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x30, 0x85, 0x87, 0x92, 0x1b, 0x49, 0xf2, 0xb1, 0x24, 0x5f, 0x4c, + 0xf2, 0xac, 0x77, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb8, + 0x09, 0x88, 0x5f, 0x32, 0xff, 0x3a, 0xc5, 0xaf, 0x80, 0xd9, 0xd9, 0xa1, + 0x6e, 0x71, 0xdd, 0x6e, 0xf7, 0xc6, 0x71, 0xb7, 0x01, 0x58, 0x4c, 0x2e, + 0x4a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa6, 0x23, 0xa8, + 0x16, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x37, 0x23, 0xf1, 0x4b, + 0x38, 0x08, 0xf1, 0x2b, 0x98, 0xb7, 0xa5, 0xe3, 0x6e, 0x00, 0xc7, 0x4b, + 0xa7, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xcc, 0x4a, 0xfc, 0x12, 0xe0, 0x24, + 0x79, 0xd7, 0x71, 0x37, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, + 0x4a, 0x50, 0x2d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x16, 0x9e, 0xa0, + 0x5a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2c, 0x3c, 0x41, 0xb5, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x58, 0x78, 0x82, 0x6a, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xb0, 0xf0, 0x04, 0xd5, 0x02, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x60, 0xe1, 0x09, 0xaa, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, + 0xc2, 0x13, 0x54, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x85, 0x27, + 0xa8, 0x16, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0x4f, 0x50, 0x2d, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x16, 0x9e, 0xa0, 0x5a, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x2c, 0x3c, 0x41, 0xb5, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x58, 0x78, 0x82, 0x6a, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xb0, 0xf0, 0x04, 0xd5, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0xe1, + 0x09, 0xaa, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xc2, 0x13, 0x54, + 0x0b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x85, 0x27, 0xa8, 0x16, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0x4f, 0x50, 0x2d, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x16, 0x9e, 0xa0, 0x5a, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x2c, 0x3c, 0x41, 0xb5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x58, + 0x78, 0x82, 0x6a, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb0, 0xf0, 0x04, + 0xd5, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0xe1, 0x09, 0xaa, 0x05, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xc2, 0x13, 0x54, 0x0b, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x80, 0x85, 0x27, 0xa8, 0x16, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0b, 0x4f, 0x50, 0x2d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x16, 0x9e, 0xa0, 0x5a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2c, 0x3c, + 0x41, 0xb5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x58, 0x78, 0x82, 0x6a, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb0, 0xf0, 0x04, 0xd5, 0x02, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x60, 0xe1, 0x09, 0xaa, 0x05, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xc0, 0xc2, 0x13, 0x54, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x85, 0x27, 0xa8, 0x16, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, + 0x4f, 0x50, 0x2d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x16, 0x9e, 0xa0, + 0x5a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2c, 0x3c, 0x41, 0xb5, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x58, 0x78, 0x82, 0x6a, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xb0, 0xf0, 0x04, 0xd5, 0x02, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x60, 0xe1, 0x09, 0xaa, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, + 0xc2, 0x13, 0x54, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x85, 0x27, + 0xa8, 0x16, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0x4f, 0x50, 0x2d, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x16, 0x9e, 0xa0, 0x5a, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x2c, 0x3c, 0x41, 0xb5, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x58, 0x78, 0x82, 0x6a, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xb0, 0xf0, 0x04, 0xd5, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0xe1, + 0x09, 0xaa, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xc2, 0x13, 0x54, + 0x0b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x85, 0x27, 0xa8, 0x16, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0x4f, 0x50, 0x2d, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x16, 0x9e, 0xa0, 0x5a, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x2c, 0x3c, 0x41, 0xb5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x58, + 0x78, 0x82, 0x6a, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb0, 0xf0, 0x04, + 0xd5, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0xe1, 0x09, 0xaa, 0x05, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xc2, 0x3b, 0x75, 0xdc, 0x0d, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xe3, 0xf4, 0x50, 0x72, + 0xe3, 0xb8, 0xdb, 0x00, 0x00, 0xb7, 0x9a, 0x67, 0xbd, 0xc3, 0x0a, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x82, 0xa5, 0xe3, 0x6e, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0xa7, 0x8f, 0x1d, + 0x77, 0x03, 0x00, 0xe0, 0x16, 0xf4, 0xec, 0x71, 0x37, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xb8, 0x29, 0x09, 0xaa, 0x05, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x2d, 0xed, 0x8b, 0xc7, 0xdd, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x2e, 0xde, + 0x75, 0xdc, 0x0d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x83, 0x3a, + 0x75, 0xdc, 0x0d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, + 0x63, 0x76, 0xe3, 0xb8, 0x1b, 0x00, 0x00, 0xb7, 0x20, 0xef, 0xb0, 0x02, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x73, 0xf7, 0xae, 0xe3, 0x6e, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x94, 0xa0, 0x5a, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x2c, 0x3c, 0x41, 0xb5, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x58, 0x78, 0x82, 0x6a, 0x01, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xb0, 0xf0, 0x04, 0xd5, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, + 0xe1, 0x09, 0xaa, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xc2, 0x13, + 0x54, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x85, 0x27, 0xa8, 0x16, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0x4f, 0x50, 0x2d, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x16, 0x9e, 0xa0, 0x5a, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x2c, 0x3c, 0x41, 0xb5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x58, 0x78, 0x82, 0x6a, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb0, 0xf0, + 0x04, 0xd5, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0xe1, 0x09, 0xaa, + 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xc2, 0x13, 0x54, 0x0b, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x85, 0x27, 0xa8, 0x16, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x0b, 0x4f, 0x50, 0x2d, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4c, 0xdb, + 0xed, 0x5f, 0x00, 0x00, 0x20, 0x00, 0x49, 0x44, 0x41, 0x54, 0x00, 0x00, + 0x00, 0x16, 0x9e, 0xa0, 0x5a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2c, + 0x3c, 0x41, 0xb5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x58, 0x78, 0x82, + 0x6a, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb0, 0xf0, 0x04, 0xd5, 0x02, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0xe1, 0x09, 0xaa, 0x05, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xc0, 0xc2, 0x13, 0x54, 0x0b, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x80, 0x85, 0x27, 0xa8, 0x16, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x0b, 0x4f, 0x50, 0x2d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x16, 0x9e, + 0xa0, 0x5a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2c, 0x3c, 0x41, 0xb5, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x58, 0x78, 0x82, 0x6a, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xb0, 0xf0, 0x04, 0xd5, 0x02, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x60, 0xe1, 0x09, 0xaa, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xc0, 0xc2, 0x13, 0x54, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x85, + 0x27, 0xa8, 0x16, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0x4f, 0x50, + 0x2d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x80, 0x4e, 0x25, + 0xb9, 0x71, 0xdc, 0x8d, 0x00, 0x80, 0x5b, 0xd0, 0xa9, 0x24, 0xe9, 0x76, + 0xbb, 0x47, 0x7a, 0x1e, 0xee, 0xf5, 0x7a, 0xa7, 0xca, 0xe3, 0x87, 0x31, + 0xff, 0xa3, 0x98, 0xc7, 0x34, 0xf3, 0x6f, 0x6a, 0x43, 0xaf, 0xd7, 0x3b, + 0x35, 0x6d, 0xfb, 0xca, 0xf5, 0x37, 0xd5, 0x3b, 0x4d, 0x9d, 0x07, 0xd1, + 0x5d, 0x39, 0xda, 0xf5, 0x7b, 0x10, 0xbd, 0xab, 0xa5, 0x75, 0x77, 0xc4, + 0xed, 0x2e, 0xcf, 0x1b, 0x4e, 0xb2, 0x45, 0x38, 0xa6, 0x8f, 0xf3, 0x58, + 0x1e, 0xd7, 0x8e, 0x45, 0xb0, 0xb2, 0xb2, 0x72, 0x68, 0xeb, 0xea, 0xea, + 0xd5, 0xab, 0x7b, 0xd6, 0xc5, 0x61, 0xce, 0x6b, 0x9a, 0xb6, 0x1c, 0xe5, + 0x32, 0x2f, 0xba, 0xba, 0x6b, 0x8a, 0x59, 0xae, 0x53, 0xa6, 0x71, 0x5c, + 0xd7, 0x6c, 0x47, 0x79, 0x9d, 0x74, 0x5c, 0x0e, 0xab, 0x6f, 0x3c, 0x29, + 0xfd, 0xef, 0x3c, 0x2c, 0x52, 0x1f, 0x7e, 0x12, 0xae, 0x5b, 0x0f, 0xa3, + 0x0d, 0xd5, 0xf9, 0x9c, 0x84, 0xe5, 0xe4, 0x64, 0x18, 0x77, 0xfe, 0xbe, + 0x7a, 0xf5, 0xea, 0xa9, 0x69, 0xcf, 0xed, 0x6d, 0xaf, 0x0b, 0x8e, 0xe2, + 0xbc, 0x7e, 0xd2, 0xfa, 0xcd, 0x9b, 0xa9, 0x4f, 0x6f, 0x32, 0xcf, 0x63, + 0xfd, 0x38, 0xaf, 0x71, 0x9b, 0xcc, 0x72, 0x6c, 0xb4, 0xa9, 0xb3, 0x18, + 0x3e, 0x49, 0xcb, 0x3d, 0x8f, 0x65, 0x9d, 0xd7, 0xf1, 0x3e, 0xcf, 0xf5, + 0x52, 0xb4, 0xe9, 0x28, 0xd7, 0xf5, 0x61, 0xde, 0xc3, 0x8d, 0xdb, 0x4e, + 0x27, 0x69, 0xfb, 0x2d, 0xa2, 0x79, 0xf5, 0xd5, 0xbd, 0xab, 0xbd, 0x53, + 0x75, 0x75, 0xb9, 0x36, 0x1a, 0xef, 0xa0, 0xeb, 0xfe, 0xb0, 0xce, 0xb9, + 0x8b, 0x76, 0x2e, 0x3f, 0xe9, 0xfb, 0xd8, 0x51, 0x9f, 0xef, 0x8e, 0xe2, + 0x59, 0xda, 0x71, 0x3f, 0xaf, 0x5b, 0x84, 0x3e, 0xfb, 0xa8, 0x7f, 0x3f, + 0x9c, 0xb7, 0xe3, 0xfc, 0x3d, 0xf4, 0x66, 0x78, 0xbe, 0xd6, 0xd4, 0x77, + 0x8e, 0x3b, 0x5f, 0x1e, 0xd4, 0x49, 0xef, 0xbb, 0x4f, 0x72, 0x5f, 0x7d, + 0x92, 0xee, 0x4b, 0x0e, 0xcb, 0x49, 0xbd, 0x0f, 0x2b, 0x3b, 0x69, 0x7d, + 0xfb, 0x22, 0xf5, 0xe3, 0x6d, 0xde, 0xf1, 0x98, 0xa6, 0xae, 0x59, 0xea, + 0x58, 0x84, 0xbe, 0xfb, 0xa4, 0xee, 0xfb, 0xd3, 0x38, 0xa9, 0xc7, 0xf2, + 0x49, 0x3b, 0x7e, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6e, 0x25, + 0x37, 0xfc, 0xe7, 0x3f, 0xff, 0xf9, 0xcf, 0x7f, 0xfe, 0xf3, 0xdf, 0x91, + 0xff, 0x97, 0x64, 0xf0, 0xc2, 0x5e, 0x21, 0xc9, 0x9e, 0xe1, 0x72, 0x5e, + 0xdb, 0xf4, 0xba, 0xbc, 0x72, 0x7e, 0x4a, 0xea, 0xca, 0xd7, 0xd5, 0x53, + 0x9d, 0x67, 0x9b, 0x36, 0x54, 0xe7, 0xd3, 0x76, 0x39, 0xa6, 0xcd, 0xab, + 0x5b, 0x67, 0xa9, 0x98, 0xb4, 0x9c, 0xe3, 0xf2, 0xc6, 0xcd, 0xbb, 0x69, + 0xd9, 0xc6, 0xad, 0x83, 0xc3, 0xd4, 0x5d, 0x69, 0x58, 0x57, 0x2b, 0xdd, + 0x1b, 0xd5, 0xfc, 0xba, 0xf4, 0x54, 0xd7, 0x63, 0x4d, 0x9d, 0xd5, 0xf4, + 0x49, 0xe3, 0x75, 0xd3, 0x8e, 0x6b, 0xf7, 0xb8, 0x36, 0xb5, 0x69, 0x47, + 0xdb, 0xf4, 0xa3, 0xda, 0x1e, 0x70, 0x50, 0x4d, 0xfb, 0xf1, 0xa4, 0x63, + 0xac, 0x6d, 0xfa, 0xac, 0x79, 0x99, 0x70, 0x2c, 0x4f, 0x6a, 0x6f, 0x5d, + 0x7a, 0x53, 0xda, 0xa4, 0xf1, 0xa3, 0xdc, 0x2e, 0xf3, 0xb0, 0xb2, 0xb2, + 0xb2, 0x67, 0x19, 0xea, 0xc6, 0xcb, 0x69, 0xe3, 0xd2, 0x53, 0xe9, 0xb3, + 0xab, 0x2f, 0x84, 0xb7, 0xad, 0xa7, 0xa9, 0xfe, 0x69, 0xc6, 0x27, 0xb5, + 0xa5, 0x4e, 0x5d, 0x9d, 0xd3, 0xce, 0xff, 0x70, 0xb7, 0xd6, 0xd1, 0xab, + 0xbb, 0xd6, 0xaa, 0xa6, 0x57, 0xf3, 0xab, 0xe3, 0x6d, 0xae, 0xd7, 0xaa, + 0xf5, 0x97, 0xe7, 0x3f, 0xed, 0x35, 0x51, 0xdb, 0x76, 0x35, 0xcd, 0xf7, + 0x66, 0xb5, 0xb7, 0xcf, 0x5a, 0xbb, 0x51, 0x37, 0xbe, 0xbf, 0x8f, 0xac, + 0x4f, 0x2f, 0xe7, 0x8d, 0x9b, 0x47, 0x5d, 0xd9, 0xa3, 0xce, 0x1b, 0xb7, + 0x3c, 0x6d, 0x96, 0xe5, 0xa4, 0x3b, 0xaa, 0xeb, 0xe6, 0x22, 0xbd, 0x6e, + 0x5b, 0x4f, 0x73, 0x4e, 0x3d, 0xc8, 0x7c, 0xea, 0xd4, 0xcd, 0xab, 0x29, + 0xbd, 0x69, 0xde, 0xe5, 0xbc, 0xc3, 0xde, 0x6e, 0xcc, 0x66, 0xd2, 0xf5, + 0xc2, 0xb8, 0xbc, 0xba, 0xed, 0x5c, 0x3e, 0x5f, 0xd7, 0x4d, 0x5b, 0x57, + 0xee, 0x30, 0xb5, 0x39, 0x5e, 0xe6, 0xb1, 0x9f, 0x8f, 0xab, 0xbb, 0xe9, + 0x18, 0x98, 0xe7, 0xf1, 0x77, 0xd0, 0xe5, 0x99, 0xc7, 0x7d, 0xf8, 0xb8, + 0xe5, 0x3c, 0xa8, 0xb6, 0xd7, 0x96, 0x6d, 0xf2, 0x92, 0xe6, 0xeb, 0xe3, + 0x36, 0x75, 0xa5, 0xb4, 0xff, 0xce, 0x3a, 0xff, 0x71, 0xe9, 0x87, 0xb5, + 0xdc, 0xb3, 0xe6, 0xa5, 0x45, 0x3f, 0x30, 0xe9, 0xfe, 0xa6, 0x6e, 0xd9, + 0xe6, 0xb5, 0x3f, 0xa4, 0xe6, 0x7e, 0x62, 0x9a, 0x76, 0x16, 0xf5, 0x1d, + 0xc6, 0x7d, 0x54, 0xd3, 0xb4, 0x87, 0xbd, 0x3c, 0x93, 0xd2, 0xeb, 0xea, + 0x9b, 0x34, 0x3e, 0xaf, 0xed, 0xb7, 0x88, 0xe6, 0x75, 0x4d, 0x58, 0x57, + 0x97, 0x6b, 0xa3, 0x66, 0x6d, 0x9f, 0x23, 0x35, 0x9d, 0xf7, 0x9a, 0xea, + 0x6a, 0xbb, 0xed, 0x9a, 0xb6, 0xd9, 0x61, 0x9d, 0xcb, 0xa7, 0xc9, 0x9b, + 0x94, 0x7e, 0x24, 0x1b, 0xeb, 0x00, 0xda, 0x3e, 0x27, 0x6a, 0x9b, 0x3e, + 0xa9, 0xbf, 0xab, 0xce, 0x7b, 0x1e, 0xcf, 0xcc, 0xea, 0xa6, 0x1d, 0xb7, + 0x8c, 0x93, 0xea, 0x98, 0x36, 0xaf, 0x6e, 0x9d, 0x1d, 0xf6, 0x36, 0x9b, + 0x87, 0x69, 0x7e, 0xef, 0x1c, 0x97, 0x5e, 0xcd, 0x9f, 0x94, 0x9e, 0x6a, + 0x1f, 0x7e, 0x80, 0xdf, 0x2a, 0xab, 0xcb, 0xd2, 0xb6, 0xcd, 0x75, 0xe9, + 0xd3, 0xb6, 0xeb, 0x08, 0x37, 0xd3, 0xa1, 0x99, 0x74, 0x5f, 0x72, 0xd0, + 0xbe, 0x33, 0x35, 0xe7, 0xeb, 0x69, 0xe6, 0x3f, 0x29, 0xbd, 0x29, 0xad, + 0x4d, 0xfb, 0xea, 0xf2, 0x8e, 0x74, 0x03, 0x4c, 0x69, 0x5e, 0xd7, 0xab, + 0xd5, 0xfc, 0xb6, 0xe3, 0xd3, 0xa6, 0x8f, 0x1b, 0x3f, 0xc8, 0x7d, 0x58, + 0x53, 0x1d, 0x4d, 0x6d, 0x6b, 0x9a, 0x76, 0xdc, 0x7a, 0x3a, 0xec, 0xfb, + 0xa9, 0x79, 0x99, 0xf6, 0x77, 0x8a, 0x49, 0xe3, 0x07, 0x4d, 0x9f, 0xe5, + 0x1d, 0x8f, 0xa6, 0x76, 0xcf, 0xf2, 0x8e, 0xc9, 0x34, 0xef, 0xd1, 0x9c, + 0x44, 0xb3, 0xee, 0xc3, 0xe5, 0xf1, 0x71, 0x79, 0x6d, 0xd3, 0x0f, 0xeb, + 0x5e, 0x7b, 0xde, 0xed, 0x9e, 0x34, 0x5e, 0x4d, 0x3f, 0xaa, 0x6d, 0x08, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x5e, 0x4b, 0xc7, 0xdd, 0x00, + 0x00, 0x60, 0xbc, 0x53, 0xa7, 0x4e, 0x65, 0xf0, 0x9e, 0xd5, 0x60, 0x78, + 0x5c, 0xfe, 0x8d, 0x1b, 0x37, 0x72, 0xea, 0xd4, 0xa9, 0x74, 0xbb, 0xdd, + 0x3d, 0x79, 0x93, 0x6c, 0x6f, 0x6f, 0x4f, 0xac, 0xa7, 0x48, 0x9b, 0xd4, + 0xc6, 0xba, 0x69, 0xeb, 0xca, 0x4e, 0x93, 0x3e, 0x29, 0xaf, 0x6d, 0x99, + 0xa6, 0xe5, 0x2c, 0xe7, 0x55, 0xeb, 0x6c, 0x5a, 0xf7, 0xd5, 0x79, 0xb7, + 0x5d, 0x07, 0x87, 0xa9, 0xdc, 0xe6, 0xc2, 0xf6, 0xdb, 0x63, 0x96, 0x7d, + 0xa5, 0xb9, 0x8d, 0x93, 0x96, 0xbf, 0xcd, 0x7e, 0xd1, 0x56, 0x51, 0x57, + 0xb5, 0xed, 0x6d, 0xda, 0x31, 0xeb, 0x76, 0x83, 0x45, 0xd0, 0x74, 0xdc, + 0xce, 0x72, 0xfc, 0xb5, 0xe9, 0xcb, 0xc7, 0xa5, 0xb5, 0x9d, 0xb6, 0x5c, + 0xae, 0x6d, 0xff, 0xb3, 0xfd, 0xf6, 0x76, 0x63, 0xfd, 0x93, 0xfa, 0x9b, + 0x9b, 0xc9, 0xdb, 0x6f, 0xbf, 0x9d, 0x64, 0xff, 0x3a, 0x5b, 0x59, 0x59, + 0x99, 0xb9, 0x9e, 0x69, 0xeb, 0x6f, 0xbb, 0xbe, 0xa7, 0xed, 0x6f, 0xc7, + 0xf5, 0xf3, 0x93, 0xdc, 0x4a, 0xdb, 0x7f, 0x9c, 0xb6, 0xe7, 0xe4, 0xa6, + 0xf5, 0x5b, 0xbe, 0x5e, 0x19, 0x67, 0xda, 0x6b, 0x22, 0xe7, 0xdc, 0x76, + 0x6e, 0xdc, 0xd8, 0xc8, 0xa9, 0x53, 0xe7, 0xf6, 0xa5, 0xef, 0xf6, 0x91, + 0xe7, 0x72, 0xe3, 0xc6, 0xc6, 0xa8, 0x5c, 0x77, 0xa5, 0x37, 0x4a, 0x2b, + 0xf2, 0x27, 0x29, 0xca, 0x14, 0xd3, 0xd4, 0xe5, 0x8d, 0x9b, 0xae, 0x6e, + 0x9a, 0x36, 0xd3, 0x55, 0x95, 0x97, 0x67, 0xdc, 0x3c, 0xda, 0x2c, 0xcb, + 0xa2, 0x98, 0xe6, 0x58, 0x98, 0xfa, 0x7e, 0xaa, 0xe6, 0x3a, 0xbd, 0xcd, + 0x39, 0x75, 0x1e, 0xf3, 0xa9, 0x5b, 0xbe, 0x36, 0x6d, 0x68, 0x7b, 0xdf, + 0xca, 0x62, 0x68, 0xba, 0x5e, 0x18, 0x77, 0x8d, 0xd1, 0xe6, 0x9c, 0x50, + 0xad, 0xf7, 0x38, 0x8d, 0x3b, 0x5e, 0xda, 0x1c, 0x6b, 0x87, 0x7d, 0x0f, + 0x5a, 0x77, 0xce, 0x6e, 0xdb, 0xae, 0x59, 0x9e, 0x07, 0xcc, 0x7a, 0x4c, + 0x37, 0xb5, 0xfd, 0x28, 0x34, 0x5d, 0xdb, 0x4c, 0x73, 0x6f, 0x33, 0x6e, + 0x9f, 0xae, 0xce, 0x67, 0x96, 0xb6, 0x4d, 0x93, 0xd7, 0x76, 0x3e, 0xd3, + 0xde, 0xd3, 0x1d, 0xa4, 0x4d, 0xe5, 0x3a, 0xc7, 0xf5, 0x03, 0x93, 0xee, + 0x29, 0x8e, 0xf3, 0x58, 0x9f, 0xe5, 0xde, 0xea, 0x30, 0xee, 0xa3, 0x0e, + 0xe3, 0x1e, 0xef, 0x20, 0xf5, 0x94, 0xb9, 0x86, 0x9f, 0x2f, 0xf7, 0x47, + 0x47, 0xa3, 0xa9, 0x7f, 0x39, 0xae, 0xe7, 0xe0, 0x75, 0xf5, 0xcd, 0xd2, + 0xb6, 0x79, 0xf5, 0xe3, 0x37, 0xeb, 0xbe, 0xd8, 0xf6, 0x9e, 0xa3, 0xae, + 0x7f, 0x6c, 0xb3, 0x1e, 0xe6, 0xf1, 0xcc, 0x6c, 0x9a, 0x3e, 0x7a, 0xd6, + 0xe7, 0xb7, 0x93, 0x2c, 0xe2, 0x36, 0x1f, 0xfb, 0x6c, 0xb9, 0xc5, 0xef, + 0x97, 0xd3, 0x5c, 0xf7, 0x4d, 0xdb, 0x96, 0xba, 0xbc, 0x49, 0xc6, 0x3d, + 0x5b, 0x6b, 0xb3, 0x2c, 0x93, 0xda, 0x75, 0xb3, 0xab, 0xeb, 0x1f, 0x0f, + 0xda, 0x77, 0x96, 0xcb, 0x4c, 0x9a, 0x6f, 0xb5, 0xdc, 0xbc, 0x7e, 0xdb, + 0x98, 0xf5, 0xfa, 0x7d, 0x11, 0x1d, 0xf4, 0x7a, 0x75, 0x5c, 0x1f, 0x3b, + 0x6e, 0x1b, 0xcd, 0x7a, 0xfe, 0x9e, 0x74, 0x0f, 0x58, 0x67, 0xd2, 0x39, + 0x66, 0x9a, 0x7e, 0x63, 0x51, 0xee, 0xa7, 0x66, 0x31, 0x8f, 0x76, 0xb7, + 0xbd, 0xae, 0x69, 0x73, 0xee, 0x98, 0xc6, 0xf6, 0x76, 0xfd, 0xb1, 0xdc, + 0xf6, 0x1d, 0x93, 0x49, 0xe7, 0xa9, 0x69, 0xfb, 0xfd, 0x93, 0x62, 0xde, + 0xc7, 0xd0, 0xb8, 0xe9, 0x8e, 0xea, 0x5e, 0x7b, 0xda, 0xfd, 0xf3, 0xa0, + 0xf7, 0x09, 0xb7, 0xc2, 0xf9, 0x1b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x60, 0x11, 0x08, 0xaa, 0x05, 0x00, 0x27, 0x44, 0xdd, 0x0b, 0x5c, 0xd5, + 0x17, 0xeb, 0xa6, 0x79, 0xd1, 0xae, 0xfc, 0x82, 0xd7, 0x41, 0x5e, 0xd0, + 0x9b, 0xe7, 0x4b, 0x9b, 0xe3, 0x5e, 0x3a, 0x6b, 0x6a, 0x6b, 0x9b, 0xbc, + 0x64, 0xba, 0x75, 0x33, 0x4e, 0xb9, 0x8e, 0xb6, 0xeb, 0xfe, 0x24, 0xbd, + 0xd0, 0x3a, 0xcf, 0x8f, 0x65, 0xaa, 0x2f, 0x86, 0x57, 0xc7, 0x27, 0xed, + 0x17, 0x7b, 0xb6, 0xdb, 0x84, 0x0f, 0x97, 0xca, 0xe5, 0xa7, 0x6d, 0x47, + 0x75, 0x99, 0x27, 0x95, 0xa7, 0xbd, 0xba, 0xbf, 0x8a, 0xdd, 0xbb, 0xda, + 0x3b, 0x75, 0x90, 0x3c, 0xe6, 0xa7, 0xe9, 0x18, 0x6b, 0xd5, 0xd7, 0xb6, + 0x98, 0xa6, 0xed, 0xf1, 0x74, 0xd8, 0xc7, 0xdd, 0x22, 0x7e, 0x3c, 0x30, + 0x4e, 0xf9, 0xe5, 0xee, 0x72, 0xda, 0x61, 0x9a, 0xf6, 0x23, 0xeb, 0x71, + 0xeb, 0xbb, 0x9a, 0x5e, 0xad, 0x77, 0xd2, 0x7c, 0x0e, 0xe3, 0x63, 0xb6, + 0x5b, 0x45, 0x9b, 0x6b, 0x92, 0x49, 0xeb, 0x68, 0xda, 0x75, 0xd8, 0xe6, + 0x9a, 0x68, 0x5c, 0xfa, 0x71, 0xec, 0xe7, 0x27, 0x59, 0x53, 0xe0, 0xaa, + 0x71, 0xba, 0x2b, 0xbd, 0xc6, 0xf1, 0xaa, 0xa6, 0xfa, 0xcb, 0x01, 0xad, + 0xaa, 0xf5, 0x34, 0x05, 0xbb, 0x2a, 0xd7, 0x59, 0xcd, 0x6f, 0xaa, 0xb3, + 0xda, 0xde, 0x69, 0x97, 0xe5, 0xa4, 0xdb, 0x73, 0xff, 0x31, 0x3c, 0xdf, + 0x1d, 0xf4, 0xba, 0x79, 0x5e, 0x0e, 0xe3, 0xbe, 0xad, 0xa8, 0x77, 0x92, + 0x69, 0xaf, 0xd9, 0xb9, 0x39, 0x94, 0xcf, 0xfd, 0xd3, 0x5c, 0x17, 0x9c, + 0x84, 0xf3, 0xfa, 0x41, 0x8e, 0x97, 0xb6, 0xf7, 0xa0, 0xb3, 0x9e, 0x0f, + 0xe7, 0xd5, 0xae, 0x83, 0x98, 0xf5, 0x98, 0x9e, 0xf6, 0x39, 0xc0, 0x41, + 0xb4, 0x7d, 0x1e, 0x51, 0x68, 0xb3, 0x8f, 0xd6, 0xa5, 0x95, 0xeb, 0x9a, + 0xe6, 0x63, 0xf0, 0x71, 0xd3, 0xb4, 0x59, 0x77, 0x6d, 0xea, 0x9e, 0xb6, + 0x8e, 0xb6, 0x6d, 0x3a, 0x48, 0x80, 0xa6, 0xa6, 0xb6, 0x2e, 0xa2, 0x79, + 0xdd, 0x47, 0x9d, 0x64, 0x75, 0xdb, 0xde, 0xb5, 0x7c, 0x3b, 0xb5, 0xcf, + 0xf1, 0x3d, 0x93, 0x3c, 0x32, 0xb3, 0x1c, 0x6b, 0x75, 0xcf, 0x2b, 0x4b, + 0x79, 0x8d, 0xe3, 0xd3, 0x1e, 0xdf, 0xb3, 0x1e, 0x3f, 0x6d, 0xfb, 0xf1, + 0x5b, 0xe1, 0xf9, 0x78, 0xdd, 0xfa, 0x9e, 0xf6, 0x39, 0x54, 0x5d, 0x7d, + 0x07, 0x3d, 0xd7, 0x1d, 0xf5, 0x6f, 0x65, 0xd3, 0x9c, 0xb3, 0x9b, 0x9e, + 0xd9, 0x9d, 0x74, 0xf3, 0xfa, 0x1d, 0xf4, 0xb0, 0xea, 0xab, 0xcb, 0x6b, + 0x53, 0xe7, 0x3c, 0x03, 0xa7, 0xcc, 0xeb, 0xf7, 0xde, 0x9b, 0x51, 0x9b, + 0x6d, 0x96, 0x1c, 0xdf, 0x6f, 0x1b, 0xb3, 0xfc, 0x8e, 0xb3, 0x08, 0x0e, + 0xe3, 0xba, 0x77, 0x5c, 0x1f, 0x3b, 0xae, 0xff, 0x9f, 0x74, 0x5e, 0x68, + 0xd3, 0x67, 0xcf, 0x63, 0x1b, 0xcc, 0x7a, 0x1f, 0xd6, 0xb6, 0xde, 0x45, + 0xd3, 0x14, 0x60, 0xac, 0xcd, 0x7d, 0xc6, 0xbe, 0xeb, 0x9a, 0x29, 0x7f, + 0x9b, 0x98, 0x94, 0xc6, 0x74, 0x26, 0xed, 0xc3, 0x4d, 0xcf, 0x51, 0x9a, + 0xca, 0x4d, 0x73, 0x3c, 0x1c, 0xc5, 0xf5, 0xd7, 0x38, 0x07, 0xed, 0x67, + 0x16, 0xb9, 0x9f, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb8, 0x99, + 0x08, 0xaa, 0x05, 0x00, 0x27, 0xc4, 0xbc, 0x3f, 0xbe, 0x9a, 0xe5, 0x83, + 0x8d, 0xa6, 0xba, 0xe6, 0xf1, 0x57, 0x45, 0xa7, 0xf9, 0x4b, 0xad, 0x6d, + 0xf3, 0xa6, 0xf9, 0xeb, 0x9e, 0x07, 0x5d, 0xbf, 0xbd, 0xde, 0xf8, 0xc0, + 0x40, 0x27, 0xe1, 0x65, 0xb8, 0xea, 0xfa, 0x28, 0x6b, 0x0a, 0x90, 0x72, + 0x18, 0x81, 0x4e, 0x66, 0xf9, 0xeb, 0xa4, 0xd3, 0xec, 0x67, 0x93, 0xf6, + 0xa9, 0x32, 0x01, 0x9d, 0x66, 0x57, 0xfe, 0x6b, 0xdc, 0x75, 0x7f, 0x81, + 0x7b, 0x96, 0x3c, 0xe6, 0x63, 0xdc, 0x5f, 0xf2, 0x4d, 0x66, 0xef, 0x6b, + 0xc7, 0xf5, 0x1f, 0x65, 0xd5, 0xe3, 0xa9, 0x77, 0xb5, 0x77, 0xaa, 0xe9, + 0xc3, 0xc4, 0x49, 0x8a, 0xb6, 0x1e, 0xf6, 0x79, 0xe8, 0xa4, 0x58, 0x59, + 0x59, 0xa9, 0xfd, 0xcb, 0xc6, 0xb3, 0x7c, 0x08, 0x78, 0x10, 0xb3, 0xac, + 0xef, 0xa2, 0xed, 0x4d, 0xae, 0x5e, 0xbd, 0xda, 0x78, 0x9e, 0x9c, 0xe6, + 0x1c, 0x35, 0xa9, 0x3d, 0xb7, 0x82, 0x6e, 0xb7, 0xdd, 0xb1, 0xd5, 0xe6, + 0x3c, 0x7a, 0x94, 0xd7, 0x29, 0xdd, 0x6e, 0xb7, 0x76, 0x3f, 0xbf, 0x95, + 0x3f, 0x62, 0x99, 0x25, 0xb0, 0x56, 0x55, 0xd3, 0xf5, 0x4c, 0x5d, 0x50, + 0xac, 0xb6, 0x79, 0x37, 0x6e, 0x6c, 0xe4, 0xc6, 0x8d, 0x8d, 0x7d, 0xe5, + 0x66, 0xad, 0xb3, 0x8d, 0x45, 0xbe, 0x36, 0xdb, 0x77, 0xff, 0xd1, 0xf2, + 0x3a, 0x67, 0x5e, 0xfd, 0xd8, 0x51, 0xf5, 0x97, 0x4d, 0x7d, 0xc6, 0x2c, + 0xf5, 0xb7, 0xbd, 0xce, 0x38, 0x6c, 0x2b, 0x2b, 0x2b, 0xb7, 0xde, 0xc9, + 0xa4, 0x41, 0xd3, 0x79, 0x3b, 0x39, 0xf8, 0x35, 0x47, 0xb5, 0xfe, 0xf2, + 0xb6, 0x3f, 0x09, 0xe7, 0xf5, 0xa6, 0xe3, 0x65, 0xdc, 0xfd, 0xf3, 0xb8, + 0xbc, 0x3a, 0xdd, 0x95, 0x31, 0xe7, 0xc3, 0x09, 0xfd, 0xc6, 0xac, 0xc7, + 0xdf, 0x41, 0xae, 0xb5, 0xda, 0x3a, 0xc8, 0xfd, 0xc6, 0xbc, 0xcd, 0xe3, + 0xde, 0xe6, 0xa0, 0xf3, 0x29, 0x54, 0xfb, 0x96, 0x69, 0xee, 0xd5, 0xa6, + 0xdd, 0xaf, 0x66, 0x5d, 0xee, 0x59, 0x9f, 0xbb, 0xcd, 0x6a, 0x96, 0xe7, + 0x3c, 0x07, 0x99, 0xcf, 0x41, 0x3f, 0x54, 0x6d, 0x7b, 0x7e, 0x38, 0x8a, + 0xe7, 0xa7, 0x93, 0x96, 0xa7, 0x4d, 0xfd, 0xe3, 0x96, 0xa7, 0xcd, 0xbe, + 0x3a, 0x8f, 0x7b, 0xd6, 0x5b, 0xc1, 0x41, 0xb6, 0xf5, 0xb8, 0x67, 0x28, + 0x45, 0xfa, 0x22, 0x5f, 0x2b, 0x1f, 0x85, 0x36, 0xfd, 0x4b, 0x5d, 0x7a, + 0xf9, 0x59, 0xe5, 0x41, 0xe6, 0xdb, 0xb6, 0xec, 0x41, 0xe6, 0xd1, 0xb6, + 0x1f, 0xbf, 0x99, 0x9f, 0x8f, 0xfb, 0xad, 0xac, 0x79, 0xda, 0xa6, 0x76, + 0x15, 0xfb, 0xcf, 0xa2, 0xf4, 0xdb, 0xbd, 0x5e, 0xef, 0x54, 0xdb, 0xe7, + 0x5f, 0x75, 0x66, 0xb9, 0xee, 0x9b, 0xf5, 0x9a, 0x7a, 0x1e, 0xd7, 0x4c, + 0xb3, 0xfe, 0x4e, 0x77, 0x12, 0x7e, 0x7f, 0x3c, 0x4e, 0x07, 0xd9, 0x66, + 0x4d, 0xcf, 0x70, 0x8e, 0xe2, 0xb7, 0x8d, 0xa3, 0xba, 0x6f, 0x39, 0x6a, + 0xd3, 0x9e, 0x87, 0xdb, 0xe4, 0x4d, 0xaa, 0x77, 0x16, 0x47, 0xf1, 0xbb, + 0xc2, 0xac, 0xfd, 0x46, 0x9b, 0xfd, 0x7a, 0xd1, 0x7e, 0x17, 0x69, 0x6a, + 0xf7, 0xa4, 0xdf, 0x0c, 0xa6, 0xbd, 0x37, 0x9e, 0xa7, 0xb6, 0xbf, 0x53, + 0xde, 0x8a, 0x66, 0xe9, 0x9b, 0x0e, 0x63, 0xbf, 0x9d, 0xb5, 0xcf, 0x19, + 0x57, 0xcf, 0x3c, 0x9f, 0x9d, 0xd5, 0xb5, 0xed, 0x38, 0xf7, 0x67, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf6, 0x13, 0x54, 0x0b, 0x00, 0x4e, + 0xb0, 0xed, 0xed, 0xed, 0xd1, 0x70, 0x5d, 0xe0, 0xa8, 0xb6, 0x1f, 0x59, + 0x4d, 0x0a, 0x38, 0x35, 0xe9, 0xe5, 0xb6, 0xa6, 0x69, 0xdb, 0x7c, 0xb8, + 0x36, 0xe9, 0x85, 0xb1, 0xa6, 0xb6, 0x4e, 0xb3, 0x1c, 0x93, 0x8c, 0x7b, + 0xa9, 0xad, 0xfa, 0xc2, 0xfa, 0x2c, 0xf3, 0x38, 0xe8, 0x07, 0x7c, 0x87, + 0xad, 0xf6, 0x05, 0xd6, 0xd2, 0x47, 0xbe, 0xd5, 0x0f, 0x7c, 0x8b, 0x0f, + 0x8d, 0x92, 0xd2, 0xbe, 0x37, 0xc5, 0x5f, 0x6c, 0xde, 0xb7, 0xdd, 0x66, + 0xfc, 0x70, 0x78, 0x5c, 0x3b, 0xbc, 0x84, 0xc8, 0xad, 0x60, 0xaa, 0x3e, + 0xbe, 0xc5, 0x71, 0x31, 0xed, 0x71, 0x79, 0x50, 0x4d, 0x1f, 0x04, 0x55, + 0x5f, 0x9e, 0x9f, 0xd4, 0x87, 0xde, 0x0c, 0xc1, 0xd9, 0xae, 0x5e, 0xbd, + 0x7a, 0x6a, 0x65, 0x65, 0xe5, 0x46, 0xd3, 0x5f, 0x36, 0x6e, 0xbb, 0xce, + 0xaa, 0x79, 0x55, 0x75, 0xf5, 0xd4, 0xcd, 0x67, 0x9c, 0x71, 0x1f, 0xde, + 0xcd, 0xfb, 0x83, 0xbc, 0xb6, 0xcb, 0xb4, 0x28, 0x1f, 0x02, 0xce, 0x4b, + 0xf5, 0x9a, 0x64, 0xd2, 0xf5, 0x60, 0x51, 0x76, 0x92, 0x49, 0xd7, 0x37, + 0xe3, 0xae, 0x89, 0xda, 0xcc, 0xbf, 0x50, 0x7c, 0x0c, 0x39, 0xee, 0x2f, + 0xc5, 0x37, 0x05, 0x28, 0xbd, 0x99, 0x75, 0x57, 0x7a, 0xfb, 0xd2, 0xca, + 0x01, 0xad, 0x8a, 0xf1, 0x79, 0xcf, 0x23, 0x49, 0xca, 0xc1, 0xbc, 0x4e, + 0x9d, 0x3a, 0x37, 0xb6, 0xdc, 0x41, 0xeb, 0xac, 0x5b, 0x9e, 0x69, 0xe6, + 0xb5, 0xc8, 0xe6, 0x75, 0xdd, 0xdc, 0xe6, 0x38, 0x9e, 0x78, 0xdf, 0x36, + 0xa7, 0xf9, 0x34, 0xd5, 0x55, 0xd7, 0x86, 0x36, 0xeb, 0xe0, 0xa4, 0x78, + 0xfb, 0xed, 0xb7, 0x8f, 0xbb, 0x09, 0xc7, 0xae, 0xed, 0x47, 0xf6, 0x6d, + 0xef, 0x9f, 0xdb, 0x9e, 0xa7, 0xc7, 0x7d, 0x60, 0x76, 0x5c, 0x9a, 0xf6, + 0xd1, 0xba, 0x65, 0x9f, 0xe6, 0x1e, 0xb4, 0xf8, 0x38, 0x7b, 0x5c, 0x5f, + 0x30, 0x29, 0xb0, 0xc5, 0x34, 0xc7, 0x5f, 0x1b, 0x6d, 0x3e, 0x3e, 0x2c, + 0x6f, 0x8f, 0x59, 0xef, 0xc3, 0x8f, 0xfa, 0x7e, 0x63, 0x9a, 0x6b, 0xc4, + 0xf2, 0xb1, 0x5f, 0x0e, 0x36, 0x31, 0x69, 0x9f, 0xae, 0x2e, 0x53, 0x5d, + 0x5e, 0x9b, 0x69, 0xe6, 0xf1, 0xf1, 0x67, 0x61, 0x96, 0x6b, 0xe3, 0x36, + 0xcb, 0xd1, 0x94, 0x57, 0x77, 0x5f, 0x32, 0xe9, 0xbc, 0x72, 0x14, 0xc7, + 0x78, 0x79, 0x1b, 0x56, 0x83, 0x3f, 0xb5, 0x69, 0x67, 0x75, 0x1b, 0x1e, + 0xc6, 0x7d, 0x54, 0xdb, 0xf5, 0x35, 0x69, 0x79, 0xda, 0xb4, 0x61, 0xd2, + 0x3e, 0xd9, 0x76, 0xdb, 0x8f, 0xbb, 0x67, 0x9d, 0x14, 0x8c, 0xf1, 0x56, + 0x37, 0xe9, 0x7a, 0x68, 0xcf, 0x7d, 0x56, 0x8b, 0x74, 0xc6, 0x9b, 0xd4, + 0xbf, 0xcc, 0xeb, 0xbc, 0x57, 0x36, 0xed, 0xb6, 0xa9, 0x96, 0x9f, 0xa6, + 0x2f, 0x68, 0x6a, 0x77, 0x31, 0xed, 0xad, 0xf8, 0x7c, 0x7c, 0xdc, 0xb9, + 0xbc, 0x9c, 0x96, 0xb4, 0x7b, 0x8e, 0xda, 0x74, 0x2e, 0x9d, 0xf5, 0x99, + 0xd9, 0xa4, 0x36, 0xd4, 0xb5, 0x65, 0x52, 0xfe, 0x34, 0xe7, 0xec, 0x9b, + 0xd1, 0x41, 0x8f, 0x9b, 0x71, 0xf5, 0x95, 0xc7, 0xa7, 0xd1, 0xe6, 0xb7, + 0xca, 0x49, 0xbf, 0x37, 0x4e, 0x0a, 0x34, 0x53, 0x0d, 0x32, 0x33, 0xcd, + 0xbc, 0x17, 0x5d, 0xd3, 0x76, 0x3e, 0x8e, 0xc0, 0x42, 0xf3, 0xfa, 0x6d, + 0xe3, 0xa8, 0xef, 0x91, 0x4e, 0x82, 0xa6, 0x67, 0x09, 0xe5, 0xf1, 0x3a, + 0xf3, 0xb8, 0xc7, 0x6b, 0x5b, 0xdf, 0x34, 0x7d, 0xcb, 0xbc, 0xce, 0xdf, + 0xd3, 0xdc, 0x5b, 0x1c, 0xf7, 0x33, 0x93, 0x59, 0x35, 0xb5, 0x7b, 0xdc, + 0x6f, 0x06, 0xc9, 0xf4, 0xf7, 0xc6, 0xe3, 0x7e, 0xb3, 0xa8, 0x1e, 0xbb, + 0x45, 0x9b, 0x9a, 0xfa, 0xec, 0xba, 0xe1, 0x6a, 0x99, 0x59, 0xef, 0x8d, + 0x4f, 0xfa, 0xfb, 0x23, 0x93, 0xd4, 0xed, 0xc3, 0xb3, 0x3c, 0x1b, 0x3c, + 0xc8, 0x75, 0x5c, 0xd2, 0x7c, 0x2c, 0x1f, 0xf4, 0x1c, 0xd1, 0xd4, 0x3f, + 0xcd, 0xda, 0xcf, 0xdc, 0x6a, 0xd7, 0xe9, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x27, 0x9d, 0xa0, 0x5a, 0x00, 0x70, 0xcc, 0xaa, 0x2f, 0xdf, + 0x8d, 0xcb, 0x9b, 0x94, 0x5e, 0xfd, 0x4b, 0x9e, 0xf3, 0x9e, 0x77, 0x9b, + 0xb6, 0x8d, 0x7b, 0x91, 0x7b, 0x96, 0x0f, 0xec, 0xda, 0xe6, 0xb5, 0xfd, + 0xf8, 0x7c, 0x5c, 0xf9, 0xe2, 0x05, 0xcb, 0x69, 0xdb, 0x30, 0x4d, 0x99, + 0xc3, 0xd6, 0x76, 0x3b, 0xd6, 0x6e, 0xb3, 0x95, 0xdd, 0xe5, 0x2f, 0xbf, + 0xcc, 0xdd, 0x76, 0x9d, 0xb4, 0xdd, 0x67, 0x27, 0xd5, 0x55, 0xcc, 0xfb, + 0x20, 0xc7, 0xc0, 0x2c, 0x6d, 0xa0, 0xd9, 0x3c, 0x8e, 0x51, 0xa6, 0x37, + 0xee, 0x58, 0x1d, 0x97, 0xd7, 0x34, 0xdd, 0x34, 0xd3, 0x8c, 0xfb, 0x60, + 0xa5, 0x8d, 0x49, 0xfd, 0x4b, 0x39, 0xad, 0x2e, 0xef, 0x20, 0xfd, 0xc1, + 0x22, 0x29, 0x02, 0x6b, 0x55, 0x97, 0xa5, 0x1c, 0x70, 0xab, 0x9a, 0x57, + 0xfe, 0xb0, 0x79, 0x5c, 0x5e, 0x55, 0x5d, 0xd9, 0xe4, 0x60, 0xe7, 0xfd, + 0xea, 0x07, 0xd4, 0x75, 0xcb, 0x51, 0xa7, 0x69, 0x9e, 0x4d, 0xcb, 0x74, + 0x33, 0x6e, 0xff, 0x49, 0xa6, 0x3d, 0x86, 0xf7, 0x1c, 0x37, 0x63, 0xae, + 0x03, 0xab, 0xe3, 0x4d, 0x41, 0xad, 0xc6, 0x5d, 0x13, 0x4d, 0xdb, 0xef, + 0x14, 0x81, 0xb5, 0xa6, 0x99, 0xf7, 0xcd, 0xa8, 0x1a, 0x24, 0xab, 0x3a, + 0x5e, 0x04, 0xa2, 0xaa, 0xa6, 0x8d, 0x2b, 0xdf, 0x66, 0x1e, 0x45, 0x90, + 0x96, 0xee, 0x4a, 0xf7, 0x46, 0xd3, 0xf4, 0xe5, 0xbc, 0x49, 0xed, 0x6c, + 0x5b, 0x67, 0xdd, 0xf2, 0x8c, 0xab, 0x73, 0x11, 0xcd, 0xe3, 0x9e, 0xad, + 0xd5, 0xfd, 0x54, 0x43, 0x20, 0x9d, 0x59, 0xeb, 0x9d, 0x75, 0x3e, 0x49, + 0x75, 0xfb, 0x1f, 0x6c, 0x1d, 0x9c, 0x94, 0x7e, 0xfc, 0xa4, 0xb4, 0xe3, + 0x24, 0x9b, 0xf6, 0xdc, 0x3d, 0xae, 0x6c, 0x9b, 0xfc, 0xa3, 0x0e, 0x04, + 0x30, 0xcd, 0xf1, 0x32, 0xcd, 0xb5, 0x48, 0xed, 0xf9, 0x70, 0x18, 0x58, + 0x6b, 0xdc, 0x71, 0x35, 0xa9, 0x8e, 0x59, 0x8e, 0xbf, 0x83, 0x2e, 0xcf, + 0xa4, 0x7b, 0x8e, 0x83, 0x3c, 0x3b, 0x99, 0x97, 0x71, 0xd7, 0xa8, 0xd5, + 0x6b, 0xd3, 0xb6, 0xdb, 0xaf, 0xcd, 0x75, 0x73, 0xdb, 0xbc, 0x79, 0x4f, + 0xd3, 0x54, 0xee, 0xa0, 0xcb, 0x3d, 0x4b, 0x5e, 0x9b, 0xfb, 0x92, 0x72, + 0xfa, 0xb8, 0xeb, 0xfa, 0x79, 0xa9, 0xbb, 0x87, 0x2a, 0xf7, 0x29, 0xd3, + 0xdc, 0x6b, 0x34, 0x4d, 0x53, 0x2d, 0x3f, 0xed, 0x79, 0xb7, 0xed, 0x7d, + 0xdc, 0xa4, 0xe5, 0x99, 0xc7, 0xb5, 0xc8, 0xa4, 0xf4, 0x72, 0x3b, 0x26, + 0xdd, 0x0f, 0xde, 0xaa, 0x8e, 0x6a, 0x3b, 0xb0, 0xdf, 0xb4, 0xcf, 0x8d, + 0x0e, 0xe3, 0xbc, 0x37, 0xed, 0xb5, 0x4e, 0xf9, 0x5c, 0xde, 0xf4, 0x8c, + 0xec, 0xa8, 0xfa, 0xf1, 0x45, 0x30, 0xaf, 0x63, 0x6c, 0x96, 0x73, 0xd0, + 0xbc, 0xef, 0xb9, 0xc6, 0x5d, 0xe7, 0xce, 0xf3, 0x3a, 0xa2, 0x9a, 0xb7, + 0xa8, 0xdb, 0x3d, 0x19, 0x73, 0x8c, 0xd6, 0x3c, 0xa7, 0xaa, 0x7b, 0xfe, + 0xd5, 0xf6, 0x5a, 0x6e, 0xd6, 0xfa, 0xa6, 0x59, 0xaf, 0x6d, 0x9e, 0xad, + 0x4d, 0x6a, 0x5b, 0x35, 0x08, 0xd7, 0xcd, 0xae, 0x6d, 0xff, 0x3c, 0xaf, + 0xfb, 0xa0, 0x69, 0xda, 0x30, 0xae, 0xdf, 0x9e, 0xe5, 0xb7, 0x8d, 0x83, + 0xb4, 0xef, 0x24, 0x99, 0x75, 0xbd, 0x1f, 0xf4, 0x77, 0x80, 0x69, 0xee, + 0xd9, 0x0e, 0xbb, 0xcf, 0xae, 0x6b, 0xf7, 0xac, 0xe7, 0xef, 0xa6, 0xe9, + 0x0e, 0xfb, 0x7e, 0x6a, 0x9e, 0xf6, 0x1c, 0x03, 0x63, 0x7e, 0xa7, 0x68, + 0xfa, 0xcd, 0xa0, 0x2e, 0x7d, 0x5c, 0xfd, 0x4d, 0x69, 0xc5, 0xfc, 0xdb, + 0xae, 0xb3, 0x6a, 0xd9, 0xba, 0xe5, 0x68, 0x3a, 0x77, 0xb4, 0x3d, 0xaf, + 0x54, 0xf3, 0x16, 0x41, 0xd3, 0x3a, 0x9c, 0xc7, 0x7d, 0x73, 0x53, 0x7a, + 0xdb, 0xbe, 0x61, 0x9a, 0xbe, 0x74, 0x5e, 0xfd, 0x53, 0x9b, 0xb6, 0xb4, + 0x69, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x47, 0xeb, 0x54, + 0x12, 0x7f, 0x1e, 0x09, 0x00, 0x8e, 0xde, 0xe0, 0x83, 0x8a, 0x6e, 0xf7, + 0x48, 0xcf, 0xc3, 0xe5, 0x60, 0x06, 0x87, 0x35, 0xef, 0x6a, 0xc0, 0x84, + 0xe3, 0x5c, 0xc6, 0x79, 0xcf, 0x7f, 0x9a, 0xba, 0x8f, 0x2a, 0x70, 0x44, + 0x77, 0x65, 0xf6, 0xe5, 0x2b, 0x3e, 0xf2, 0x9d, 0x94, 0x36, 0x2f, 0xe5, + 0x8f, 0x87, 0x0f, 0x6b, 0x1e, 0x93, 0xe6, 0x4b, 0x7b, 0x75, 0xdb, 0xa8, + 0xfc, 0x31, 0xd8, 0x2c, 0x79, 0x4c, 0x76, 0x94, 0xc7, 0xc6, 0x2c, 0xea, + 0xb6, 0xe5, 0xb8, 0x6d, 0x3e, 0x6e, 0x59, 0xe6, 0xd5, 0xcf, 0x2c, 0xea, + 0x7e, 0xb5, 0xb2, 0xb2, 0xb2, 0x6f, 0xd9, 0xcb, 0x1f, 0xc5, 0xd7, 0x4d, + 0x53, 0x7c, 0xd8, 0x3c, 0x2e, 0xaf, 0xcd, 0x3c, 0x0e, 0xaa, 0x2e, 0xa8, + 0xd6, 0x2c, 0x65, 0x0e, 0xab, 0x3d, 0x8b, 0xee, 0xa8, 0xae, 0x97, 0x26, + 0x04, 0xd5, 0x3a, 0xf8, 0x71, 0x39, 0xac, 0xbf, 0xae, 0xae, 0x5b, 0x29, + 0xa8, 0xd6, 0xbc, 0xaf, 0xcf, 0x8a, 0xf4, 0x49, 0xf3, 0x68, 0x3a, 0x17, + 0x1f, 0xa4, 0x3d, 0x87, 0x55, 0xe7, 0xa2, 0x38, 0xea, 0x73, 0x73, 0x9b, + 0x6d, 0x7d, 0x54, 0xf3, 0x39, 0x8c, 0xed, 0x3f, 0x6e, 0xfe, 0x47, 0xe1, + 0x30, 0xcf, 0x4b, 0x8b, 0xe8, 0xb0, 0xaf, 0x21, 0xca, 0xf5, 0x37, 0xd5, + 0x7b, 0x54, 0xe7, 0xf4, 0xe3, 0xb8, 0x07, 0x6d, 0x7b, 0x6f, 0x74, 0xd4, + 0xc7, 0xdf, 0x51, 0x9a, 0xe7, 0xb1, 0x3e, 0xcb, 0x75, 0xf4, 0xa2, 0x9a, + 0x74, 0xfc, 0x1c, 0xd7, 0x72, 0x37, 0xdd, 0x97, 0x4c, 0x53, 0xc7, 0xbc, + 0xda, 0x93, 0xec, 0x5f, 0x07, 0x8b, 0xb2, 0x4f, 0x8c, 0x5b, 0x0f, 0x75, + 0xcb, 0x73, 0x94, 0xcb, 0x32, 0x6e, 0x7e, 0x37, 0xdb, 0xfd, 0xd7, 0x2c, + 0x8e, 0xaa, 0x3f, 0x5e, 0xb4, 0x6b, 0xe5, 0xa3, 0x70, 0x52, 0xcf, 0x85, + 0x93, 0x9e, 0x75, 0x1f, 0xd7, 0xb3, 0xf0, 0x3a, 0x8b, 0xb0, 0x5f, 0x1d, + 0xc7, 0x39, 0xed, 0xb0, 0xe7, 0x7d, 0x94, 0xcf, 0xc9, 0xda, 0xcc, 0xff, + 0xa4, 0x1a, 0xf7, 0x0c, 0x69, 0xde, 0xbf, 0xed, 0x1d, 0xc6, 0xb3, 0xb7, + 0x79, 0xfc, 0x1e, 0x59, 0xd7, 0xb6, 0x36, 0xed, 0xbd, 0x19, 0x9e, 0xb3, + 0x1d, 0x47, 0xdf, 0xd8, 0xf6, 0x59, 0xc8, 0x61, 0xff, 0xb6, 0xd1, 0xb6, + 0x7d, 0x27, 0xc9, 0x49, 0xbf, 0xbe, 0x3e, 0xa8, 0xe3, 0xee, 0xb3, 0xdb, + 0x3a, 0x69, 0x7d, 0x7b, 0xdb, 0x7e, 0x6f, 0x5c, 0xbf, 0x76, 0x58, 0xfd, + 0xf3, 0xb8, 0x36, 0x94, 0xc7, 0xdb, 0xf4, 0xb3, 0xe3, 0xca, 0xcc, 0xda, + 0xee, 0x45, 0xe8, 0xbb, 0x4f, 0xea, 0xbe, 0x3f, 0x8d, 0xa3, 0xb8, 0xce, + 0x9b, 0xc5, 0x49, 0x3b, 0x7e, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x6e, 0x15, 0x82, 0x6a, 0x01, 0xc0, 0xf1, 0xf0, 0xc2, 0x14, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xcc, 0xd1, 0xbb, 0x8e, 0xbb, 0x01, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x70, 0x50, 0x82, 0x6a, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xb0, 0xf0, 0x04, 0xd5, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0xe1, + 0x9d, 0x4a, 0x72, 0xe3, 0xb8, 0x1b, 0x01, 0x00, 0xb7, 0x9a, 0x6e, 0xb7, + 0x7b, 0xdc, 0x4d, 0xe0, 0xa8, 0x2c, 0x1d, 0x77, 0x03, 0x00, 0x98, 0xd5, + 0x92, 0x4e, 0xfc, 0x96, 0xb1, 0xb3, 0xb3, 0x73, 0xdc, 0x4d, 0xe0, 0xa8, + 0x38, 0xac, 0xe1, 0xa6, 0xe3, 0x7c, 0x7d, 0xeb, 0xd8, 0x89, 0xf3, 0xf5, + 0xad, 0xc2, 0x71, 0x0d, 0x37, 0x1f, 0x7d, 0x38, 0xdc, 0x7c, 0x9c, 0xaf, + 0x6f, 0x1d, 0x9e, 0x9b, 0xdd, 0x42, 0x1c, 0xd6, 0xb7, 0x0c, 0x7d, 0xf8, + 0xad, 0x43, 0x1f, 0x7e, 0x6b, 0x58, 0x5a, 0x72, 0x4c, 0xdf, 0x2a, 0xae, + 0x5e, 0xbd, 0x7a, 0xea, 0xb8, 0xdb, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xb0, 0x48, 0xfc, 0xa2, 0x0e, 0x00, 0xc7, 0xa4, 0xff, 0xc3, 0xf7, + 0x35, 0x17, 0x78, 0x68, 0x3b, 0x79, 0x76, 0x79, 0xef, 0x78, 0xb2, 0x9b, + 0x56, 0x8c, 0x17, 0x69, 0xe5, 0xf1, 0x59, 0xfd, 0x68, 0x92, 0x7f, 0x3e, + 0x26, 0x3d, 0x35, 0x79, 0x3f, 0x5a, 0x2d, 0x38, 0x41, 0x31, 0xfd, 0x8f, + 0xd6, 0xa4, 0x35, 0xa5, 0x37, 0xb5, 0xa1, 0xc8, 0xab, 0x4b, 0x9f, 0x56, + 0x75, 0x3d, 0x56, 0xd7, 0x75, 0x75, 0x7b, 0x94, 0xc7, 0x6b, 0x74, 0x3e, + 0xff, 0x42, 0x92, 0xe4, 0x0b, 0x2b, 0xfd, 0xc6, 0x72, 0xdd, 0x0f, 0x76, + 0xd2, 0x7b, 0xb9, 0xbf, 0x67, 0x3c, 0xc9, 0x28, 0xad, 0x18, 0x2f, 0xd2, + 0xca, 0xe3, 0xb3, 0xfa, 0xc0, 0xfd, 0xdd, 0xbc, 0xfa, 0x7c, 0xaf, 0x36, + 0x3d, 0xc9, 0xbe, 0xbc, 0x22, 0xbd, 0xad, 0x62, 0xfa, 0xf2, 0x74, 0xe5, + 0x3a, 0xc7, 0xa5, 0x37, 0xb5, 0xa1, 0xa9, 0xdd, 0xd3, 0xaa, 0xae, 0xc7, + 0xea, 0xba, 0xae, 0x6e, 0x8f, 0xf2, 0x78, 0x9d, 0x1f, 0xb8, 0x3a, 0x98, + 0xae, 0xff, 0x5f, 0x38, 0xae, 0xf7, 0xd5, 0x79, 0xb3, 0x1d, 0xd7, 0xff, + 0xb7, 0xe3, 0xfa, 0x56, 0x3b, 0xae, 0x9f, 0x7a, 0xef, 0x9f, 0x34, 0x96, + 0x7b, 0xef, 0x07, 0xcf, 0xe4, 0xed, 0x97, 0xaf, 0xed, 0x19, 0x4f, 0x32, + 0x4a, 0x2b, 0xc6, 0x8b, 0xb4, 0xf2, 0xf8, 0xac, 0x2e, 0x7c, 0xf4, 0x5b, + 0xb2, 0xfe, 0xdb, 0x7f, 0x54, 0x9b, 0x9e, 0x64, 0x5f, 0x5e, 0x91, 0xde, + 0x56, 0x31, 0x7d, 0x79, 0xba, 0x72, 0x9d, 0xe3, 0xd2, 0x9b, 0xda, 0xd0, + 0xd4, 0xee, 0x69, 0x55, 0xd7, 0x63, 0x75, 0x5d, 0x57, 0xb7, 0x47, 0x79, + 0xbc, 0xce, 0xa3, 0x6f, 0xbf, 0x27, 0x49, 0xf2, 0x85, 0xfe, 0xb9, 0xc6, + 0x72, 0xdd, 0x33, 0xdb, 0xe9, 0x5d, 0x5b, 0xde, 0x33, 0x9e, 0x64, 0x94, + 0x56, 0x8c, 0x17, 0x69, 0xe5, 0xf1, 0x59, 0x7d, 0xe0, 0xae, 0xe4, 0xd5, + 0xcb, 0xf5, 0xe9, 0xc9, 0xfe, 0xbc, 0x22, 0xbd, 0xad, 0x62, 0xfa, 0xf2, + 0x74, 0xe5, 0x3a, 0xc7, 0xa5, 0x37, 0xb5, 0xa1, 0xc8, 0xab, 0x4b, 0x9f, + 0x56, 0x75, 0x3d, 0x56, 0xd7, 0x75, 0x75, 0x7b, 0x94, 0xc7, 0xeb, 0xfc, + 0x40, 0x67, 0x23, 0x49, 0xf2, 0x85, 0x6b, 0x27, 0x70, 0x5b, 0xaf, 0x9e, + 0xce, 0xab, 0x5b, 0xd7, 0x6b, 0xd3, 0x93, 0xec, 0xcb, 0x2b, 0xd2, 0xdb, + 0x2a, 0xa6, 0x2f, 0x4f, 0x57, 0xae, 0x73, 0x5c, 0x7a, 0x53, 0x1b, 0x9a, + 0xda, 0x3d, 0xad, 0xb9, 0x6f, 0xeb, 0x33, 0xc3, 0x6d, 0xed, 0x7c, 0xbd, + 0xaf, 0xce, 0x9b, 0xf5, 0x7c, 0xfd, 0xdd, 0x7f, 0xf2, 0x54, 0x63, 0xb9, + 0xef, 0x3c, 0xf3, 0xde, 0xfc, 0xde, 0xb5, 0xb7, 0xf7, 0x8c, 0x27, 0x19, + 0xa5, 0x15, 0xe3, 0x45, 0x5a, 0x79, 0x7c, 0x56, 0x0f, 0x7e, 0xcb, 0x85, + 0x3c, 0xf7, 0x47, 0xeb, 0xb5, 0xe9, 0x49, 0xf6, 0xe5, 0x15, 0xe9, 0x6d, + 0x15, 0xd3, 0x97, 0xa7, 0x2b, 0xd7, 0x39, 0x2e, 0xbd, 0xa9, 0x0d, 0x4d, + 0xed, 0x9e, 0x56, 0x75, 0x3d, 0x56, 0xd7, 0x75, 0x75, 0x7b, 0x94, 0xc7, + 0xeb, 0xfc, 0x9b, 0xf7, 0x3c, 0x9a, 0xe4, 0x84, 0xf6, 0xe1, 0xce, 0xd7, + 0x87, 0xd2, 0x87, 0x3b, 0xae, 0xf7, 0xa6, 0x35, 0xa5, 0x37, 0xb5, 0xa1, + 0xa9, 0xdd, 0xd3, 0x3a, 0xac, 0xe3, 0xda, 0x3d, 0xd7, 0xde, 0xb4, 0xa6, + 0xf4, 0xa6, 0x36, 0x34, 0xb5, 0x7b, 0x5a, 0x87, 0x76, 0xcf, 0xe5, 0xda, + 0x6c, 0x5f, 0x9d, 0x37, 0xeb, 0xb5, 0xd9, 0xc5, 0x6b, 0x5f, 0x68, 0x2c, + 0x77, 0xcf, 0x99, 0x6e, 0xbe, 0x76, 0xad, 0xb7, 0x67, 0x3c, 0xc9, 0x28, + 0xad, 0x18, 0x2f, 0xd2, 0xca, 0xe3, 0xb3, 0x7a, 0xb8, 0xfb, 0x81, 0x3c, + 0xd3, 0x7b, 0xb5, 0x36, 0x3d, 0xc9, 0xbe, 0xbc, 0x22, 0xbd, 0xad, 0x62, + 0xfa, 0xf2, 0x74, 0xe5, 0x3a, 0xc7, 0xa5, 0x37, 0xb5, 0xa1, 0xa9, 0xdd, + 0xd3, 0xaa, 0xae, 0xc7, 0xea, 0xba, 0xae, 0x6e, 0x8f, 0xf2, 0x78, 0x9d, + 0x4b, 0x67, 0x7e, 0x20, 0x89, 0x3e, 0xbc, 0x9a, 0xd6, 0x94, 0xde, 0xd4, + 0x86, 0xa6, 0x76, 0x4f, 0xcb, 0x73, 0x33, 0xd7, 0xe1, 0x07, 0x7d, 0x6e, + 0xe6, 0x77, 0xae, 0x9a, 0x3a, 0x6f, 0xd2, 0xdf, 0xb9, 0xfe, 0xc3, 0x5f, + 0xf9, 0xcf, 0x9a, 0xe7, 0xfb, 0xfd, 0xdb, 0xc9, 0x6f, 0x2e, 0xef, 0x1d, + 0x4f, 0x76, 0xd3, 0xbe, 0xbf, 0xd4, 0xa6, 0xdf, 0x5c, 0xde, 0x3b, 0x3e, + 0xab, 0x1f, 0x4b, 0xf2, 0x6b, 0x63, 0xd2, 0x53, 0x93, 0xf7, 0x63, 0xd5, + 0x82, 0x13, 0x14, 0xd3, 0xff, 0x58, 0x4d, 0x5a, 0x53, 0x7a, 0x53, 0x1b, + 0x8a, 0xbc, 0xba, 0xf4, 0x69, 0x55, 0xd7, 0x63, 0x75, 0x5d, 0x57, 0xb7, + 0xc7, 0x6f, 0x36, 0x6f, 0xeb, 0x77, 0xff, 0x8b, 0x7f, 0x9d, 0x44, 0x1f, + 0x5e, 0x4d, 0x6b, 0x4a, 0x6f, 0x6a, 0x43, 0x91, 0x77, 0x12, 0xfb, 0xf0, + 0xbf, 0x72, 0xe6, 0x0d, 0xc7, 0x74, 0x35, 0xad, 0x29, 0xbd, 0xa9, 0x0d, + 0x45, 0xde, 0x09, 0x3e, 0xa6, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x68, 0xef, 0x54, 0x92, 0x1b, 0xc7, 0xdd, 0x08, 0x00, 0xb8, 0xd5, 0x74, + 0xbb, 0xdd, 0x41, 0x50, 0xad, 0x27, 0xe7, 0xf0, 0x22, 0xda, 0x21, 0xba, + 0x9e, 0x17, 0x72, 0x3a, 0xf7, 0xe5, 0x7a, 0x06, 0x2f, 0xd7, 0x9e, 0xce, + 0x7d, 0xa3, 0xf4, 0x42, 0x39, 0x7f, 0x1e, 0xaa, 0xf5, 0x55, 0xe7, 0x59, + 0xe4, 0x17, 0xe9, 0x27, 0xd6, 0x27, 0x96, 0x07, 0x41, 0xb5, 0x96, 0x06, + 0x1f, 0x8c, 0xdd, 0xf7, 0x93, 0xab, 0xc7, 0xdd, 0xa2, 0x66, 0x7f, 0x63, + 0x23, 0xf9, 0xc5, 0x73, 0x83, 0x7f, 0x93, 0xc1, 0x70, 0x91, 0x5e, 0x28, + 0xe7, 0xcf, 0x43, 0xb5, 0xbe, 0xea, 0x3c, 0x8b, 0xfc, 0x5f, 0x6c, 0x7e, + 0xd1, 0xf7, 0xb8, 0xbd, 0xf0, 0xf3, 0x5b, 0x7b, 0x83, 0x6a, 0x39, 0xae, + 0xf7, 0xb9, 0xa9, 0x8e, 0xeb, 0x52, 0x50, 0x2d, 0xc7, 0x75, 0x8d, 0x9b, + 0xec, 0xb8, 0x5e, 0xca, 0x52, 0x9e, 0x7a, 0xef, 0x9f, 0xe4, 0xa3, 0x9f, + 0x7c, 0xff, 0x71, 0x37, 0xa9, 0xd9, 0x27, 0x5f, 0x4b, 0x7e, 0xe1, 0x8e, + 0xc1, 0xbf, 0xc9, 0x60, 0xb8, 0x48, 0x2f, 0x94, 0xf3, 0xe7, 0xa1, 0x5a, + 0x5f, 0x75, 0x9e, 0x45, 0x7e, 0x91, 0x7e, 0x42, 0xfd, 0xf6, 0x2f, 0xbc, + 0x95, 0x47, 0xdf, 0x7e, 0x4f, 0x76, 0x76, 0x76, 0xf2, 0x85, 0xfe, 0xb9, + 0xdc, 0xf7, 0xa1, 0x93, 0xdd, 0x87, 0xe7, 0x77, 0x36, 0x92, 0xef, 0x3d, + 0x37, 0xf8, 0x37, 0x19, 0x0c, 0x17, 0xe9, 0x85, 0x72, 0xfe, 0x3c, 0x54, + 0xeb, 0xab, 0xce, 0xb3, 0xc8, 0xff, 0xde, 0x13, 0x7e, 0x5c, 0xbf, 0xb4, + 0x3c, 0xf8, 0x38, 0x70, 0x69, 0x10, 0x90, 0xe5, 0xbe, 0xf3, 0xcd, 0x1f, + 0x83, 0x1f, 0xbb, 0x97, 0x5f, 0x4d, 0x3e, 0xf8, 0x81, 0xc1, 0xbf, 0xc9, + 0x60, 0xb8, 0x48, 0x2f, 0x94, 0xf3, 0xe7, 0xa1, 0x5a, 0x5f, 0x75, 0x9e, + 0x45, 0xfe, 0x07, 0xa7, 0xfb, 0xb8, 0xfc, 0xa8, 0xbd, 0xf0, 0x7a, 0x67, + 0x4f, 0x50, 0x2d, 0xe7, 0xeb, 0x1a, 0x37, 0xe1, 0xf9, 0xfa, 0xbb, 0xff, + 0xe4, 0xa9, 0xfc, 0xf7, 0xef, 0xff, 0xe8, 0x71, 0x37, 0xa9, 0xd1, 0x7f, + 0xfe, 0x5a, 0xf2, 0x2f, 0xef, 0x18, 0xfc, 0x9b, 0x0c, 0x86, 0x8b, 0xf4, + 0x42, 0x39, 0x7f, 0x1e, 0xaa, 0xf5, 0x55, 0xe7, 0x59, 0xe4, 0xff, 0xcb, + 0x93, 0x7d, 0xba, 0xce, 0x3f, 0x78, 0xeb, 0xb7, 0xf3, 0x6f, 0xde, 0xf3, + 0x68, 0x76, 0xb2, 0x33, 0xe8, 0xc3, 0x9d, 0xaf, 0xf7, 0xbb, 0x99, 0xce, + 0xd7, 0x67, 0x36, 0x1c, 0xd7, 0x0d, 0x6e, 0xb6, 0xe3, 0x3a, 0x89, 0x7b, + 0xae, 0x71, 0x6e, 0xb6, 0x7b, 0xae, 0xec, 0xb8, 0x36, 0x1b, 0xe7, 0x26, + 0xbb, 0x36, 0x4b, 0x06, 0x41, 0xb5, 0xfe, 0xce, 0xed, 0x27, 0xfb, 0x39, + 0xdf, 0x83, 0xaf, 0x25, 0xcf, 0xdd, 0x31, 0xf8, 0x37, 0x19, 0x0c, 0x17, + 0xe9, 0x85, 0x72, 0xfe, 0x3c, 0x54, 0xeb, 0xab, 0xce, 0xb3, 0xc8, 0x7f, + 0xee, 0x64, 0x1f, 0xd6, 0xf9, 0x7b, 0x6f, 0xbe, 0x90, 0x4b, 0x67, 0x7e, + 0xc0, 0x73, 0xb3, 0x26, 0x37, 0x5b, 0x1f, 0xee, 0xb9, 0xd9, 0x78, 0x37, + 0xd3, 0x75, 0xf8, 0xf0, 0xb9, 0x99, 0xdf, 0xb9, 0xea, 0xdd, 0x6c, 0xbf, + 0x73, 0x2d, 0x65, 0x69, 0x10, 0x80, 0xe7, 0x97, 0x4e, 0xf6, 0xb6, 0xee, + 0xe5, 0x85, 0x74, 0x73, 0x5f, 0x7a, 0xc3, 0xf5, 0xdc, 0x1d, 0xae, 0xdf, + 0x5e, 0x69, 0x5b, 0x94, 0xf3, 0xe7, 0xa1, 0x5a, 0x5f, 0x75, 0x9e, 0x45, + 0x7e, 0xf7, 0xa4, 0x6f, 0xeb, 0xbf, 0xbe, 0x9c, 0x77, 0xff, 0x8b, 0x7f, + 0xad, 0x0f, 0x6f, 0x72, 0x13, 0xf5, 0xe1, 0xa3, 0xa0, 0x5a, 0x8e, 0xe9, + 0x7d, 0x6e, 0xb6, 0x63, 0xfa, 0xea, 0xd5, 0xab, 0xa7, 0x8e, 0xbb, 0x29, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8b, 0x44, 0x50, 0x2d, 0x00, + 0x38, 0x06, 0xe5, 0xa0, 0x5a, 0xfd, 0xb3, 0xf5, 0x2f, 0xfe, 0x75, 0xee, + 0xea, 0xa4, 0x7f, 0xb9, 0x3f, 0x1a, 0x4e, 0x92, 0xfe, 0xe5, 0xfe, 0x68, + 0x98, 0xa3, 0x53, 0x5e, 0xef, 0xe5, 0x6d, 0x52, 0x0c, 0x57, 0x75, 0xae, + 0x9c, 0xab, 0x0d, 0xaa, 0xf5, 0xe8, 0x4f, 0x6d, 0xd6, 0x96, 0x5f, 0xbd, + 0xbd, 0x9b, 0xad, 0x37, 0x7b, 0xa3, 0xe1, 0x24, 0xd9, 0x7a, 0xb3, 0x37, + 0x1a, 0xe6, 0xe8, 0x94, 0xd7, 0x7b, 0x79, 0x9b, 0x14, 0xc3, 0x55, 0x4f, + 0xfd, 0xc3, 0xb5, 0xda, 0xa0, 0x5a, 0x8e, 0xeb, 0x93, 0x6f, 0xe6, 0xe3, + 0xba, 0x12, 0x54, 0xcb, 0x71, 0x7d, 0xf2, 0x1d, 0xe4, 0xb8, 0x2e, 0x7f, + 0x1c, 0xf8, 0xc8, 0xdf, 0xdc, 0xac, 0x2d, 0xff, 0x6d, 0xb7, 0x9f, 0xc9, + 0x1b, 0x6f, 0x5e, 0x1b, 0x0d, 0x27, 0xc9, 0x1b, 0x6f, 0x5e, 0x1b, 0x0d, + 0x73, 0x74, 0xca, 0xeb, 0xbd, 0xbc, 0x4d, 0x8a, 0xe1, 0xaa, 0xa7, 0xff, + 0xf7, 0xb5, 0xda, 0x8f, 0x03, 0x1f, 0xfd, 0x4a, 0x7d, 0xfd, 0xab, 0x67, + 0x92, 0xad, 0x6b, 0xbb, 0xc3, 0xc9, 0x60, 0x7c, 0xd5, 0xa6, 0x3e, 0x72, + 0xe5, 0xf5, 0x5e, 0xde, 0x26, 0x5b, 0xf5, 0x9b, 0x3a, 0x4f, 0x7d, 0xa4, + 0x3e, 0xa8, 0xd6, 0xa3, 0xaf, 0xd4, 0x7f, 0x60, 0xb2, 0xda, 0xed, 0x64, + 0xab, 0xd7, 0x1f, 0x0d, 0x27, 0xc9, 0x56, 0xaf, 0x3f, 0x1a, 0xe6, 0xe8, + 0x94, 0xd7, 0x7b, 0x79, 0x9b, 0x14, 0xc3, 0x55, 0x4f, 0xdd, 0xbd, 0x5c, + 0x1b, 0x54, 0xeb, 0xd1, 0x4f, 0x6e, 0xd6, 0x96, 0x5f, 0x5d, 0x5d, 0xcd, + 0xd6, 0xd6, 0xd6, 0x68, 0x38, 0x49, 0xb6, 0xb6, 0xb6, 0x46, 0xc3, 0x1c, + 0x9d, 0xf2, 0x7a, 0x2f, 0x6f, 0x93, 0x62, 0xb8, 0xea, 0xa9, 0x5f, 0x58, + 0xab, 0x0d, 0xaa, 0xf5, 0xf1, 0xcd, 0x47, 0x6a, 0xcb, 0xff, 0xc5, 0x33, + 0xdf, 0x96, 0x7f, 0x77, 0xed, 0x8d, 0xd1, 0x70, 0x92, 0xfc, 0xbb, 0x6b, + 0x6f, 0x8c, 0x86, 0x39, 0x3a, 0xe5, 0xf5, 0x5e, 0xde, 0x26, 0xc5, 0x70, + 0xd5, 0xe7, 0xd6, 0x9e, 0xae, 0x0d, 0xaa, 0xe5, 0x7c, 0x7d, 0xf2, 0xcd, + 0x7c, 0xbe, 0xae, 0x04, 0xd5, 0x72, 0x5c, 0x9f, 0x7c, 0x07, 0x39, 0xae, + 0x93, 0xb8, 0xe7, 0x5a, 0x20, 0x07, 0xba, 0xe7, 0x2a, 0x05, 0xd5, 0x1a, + 0x7b, 0x6d, 0xb6, 0xd6, 0xcd, 0xd6, 0x66, 0x6f, 0x34, 0x9c, 0x24, 0x5b, + 0x9b, 0xbd, 0xd1, 0x30, 0x47, 0xa7, 0xbc, 0xde, 0xcb, 0xdb, 0xa4, 0x18, + 0xae, 0x2a, 0x5f, 0x9b, 0x25, 0xbb, 0x41, 0xb5, 0x1e, 0xdd, 0x7c, 0xb4, + 0xb6, 0xfc, 0xd9, 0x33, 0xab, 0xb9, 0x72, 0x6d, 0x6b, 0x34, 0x9c, 0x24, + 0x57, 0xae, 0x6d, 0x8d, 0x86, 0x39, 0x3a, 0xe5, 0xf5, 0x5e, 0xde, 0x26, + 0xc5, 0x70, 0xd5, 0x53, 0x6b, 0x4f, 0xd5, 0x06, 0xd5, 0xd2, 0x87, 0x9f, + 0x7c, 0x9e, 0x9b, 0xdd, 0x3a, 0x0e, 0xfa, 0xdc, 0xcc, 0xef, 0x5c, 0x8b, + 0xe3, 0x20, 0xbf, 0x73, 0x95, 0x83, 0x6a, 0xfd, 0xc9, 0xfb, 0xff, 0x9f, + 0xda, 0xf2, 0xdf, 0x74, 0xd7, 0x5f, 0xc8, 0x9f, 0x5d, 0xfe, 0xd3, 0xd1, + 0x70, 0x92, 0xfc, 0xd9, 0xe5, 0x3f, 0x1d, 0x0d, 0x73, 0x74, 0xca, 0xeb, + 0xbd, 0xbc, 0x4d, 0x8a, 0xe1, 0xaa, 0xf7, 0xbc, 0xf5, 0x9f, 0xd4, 0x06, + 0xd5, 0xd2, 0x87, 0x9f, 0x7c, 0xb3, 0xf6, 0xe1, 0xe5, 0xa0, 0x5a, 0xe3, + 0x8e, 0xe9, 0xef, 0xf9, 0x8e, 0xef, 0xc8, 0x97, 0xff, 0xe0, 0x0f, 0x46, + 0xc3, 0x49, 0xf2, 0xe5, 0x3f, 0xf8, 0x83, 0xd1, 0x30, 0x47, 0xa7, 0xbc, + 0xde, 0xcb, 0xdb, 0xa4, 0x18, 0xae, 0x2a, 0x1f, 0xd3, 0x82, 0x6a, 0x01, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4c, 0x67, 0xe9, 0xb8, 0x1b, 0x00, + 0x00, 0x24, 0x17, 0x56, 0x2f, 0x24, 0x49, 0xba, 0x2b, 0xcb, 0xe9, 0x5d, + 0x1b, 0x7e, 0xdc, 0xdf, 0x4f, 0x3a, 0x6b, 0x49, 0x96, 0x4e, 0xa7, 0x7f, + 0xed, 0x7a, 0xb6, 0xaf, 0xf5, 0x92, 0x6e, 0x92, 0xcd, 0xc1, 0x8b, 0xb0, + 0xbd, 0xde, 0x76, 0x56, 0x57, 0x77, 0xff, 0x2a, 0x66, 0xbf, 0xdf, 0x4b, + 0x6f, 0x6b, 0x23, 0x9d, 0x4e, 0x27, 0xfd, 0x7e, 0x3f, 0xfd, 0x9d, 0xe1, + 0xcb, 0xb3, 0x4b, 0x9d, 0xf4, 0x77, 0xfa, 0xe9, 0x2c, 0x0d, 0x5f, 0xaa, + 0x1d, 0x0e, 0x17, 0xf9, 0x6d, 0x55, 0xeb, 0x29, 0xea, 0x2a, 0xf2, 0x46, + 0xe5, 0xc6, 0xcc, 0x7f, 0x9a, 0x3a, 0xeb, 0xe6, 0xd1, 0xa6, 0x7d, 0x75, + 0xd3, 0x77, 0x3a, 0xa5, 0xba, 0x86, 0xed, 0x2a, 0xb7, 0xa9, 0x5c, 0xb6, + 0x6e, 0x7e, 0xf7, 0x7e, 0xe4, 0xde, 0x5c, 0xe9, 0x5c, 0xc9, 0xe6, 0xf3, + 0x9b, 0xe9, 0x74, 0x3a, 0xe9, 0x14, 0xcb, 0xf8, 0x95, 0x5e, 0x3a, 0x75, + 0xed, 0xed, 0x36, 0x7f, 0xe4, 0x75, 0xe5, 0xae, 0x8b, 0x45, 0xc3, 0x76, + 0xd3, 0x92, 0x64, 0x65, 0x30, 0xbc, 0x71, 0xad, 0x78, 0xe9, 0x79, 0x90, + 0xde, 0xdf, 0x49, 0x3a, 0xd5, 0x2b, 0xb6, 0x4e, 0xc3, 0x8b, 0xe9, 0xfd, + 0x7e, 0xfa, 0x3b, 0xc3, 0x62, 0x2d, 0xa6, 0xeb, 0x5f, 0xeb, 0xef, 0x2f, + 0x57, 0xce, 0x1f, 0x57, 0x57, 0x4d, 0x7d, 0xfd, 0xa2, 0xed, 0x4b, 0xfb, + 0xcb, 0x14, 0x79, 0x93, 0xd4, 0x4d, 0x3b, 0xb6, 0x6d, 0xa5, 0x3a, 0x9b, + 0xa6, 0xab, 0x6d, 0xd7, 0x38, 0xc3, 0xf5, 0x9e, 0x24, 0xf9, 0xae, 0x41, + 0x3d, 0xe5, 0xed, 0x53, 0xae, 0xef, 0xdc, 0xeb, 0x97, 0x1a, 0xab, 0xfa, + 0x1b, 0xd7, 0xfa, 0xe9, 0xa7, 0x9f, 0xf2, 0x67, 0x07, 0xe7, 0x5e, 0x4a, + 0x36, 0x92, 0x2c, 0xef, 0x24, 0xdb, 0x2f, 0x25, 0x17, 0x32, 0x98, 0xc7, + 0xfa, 0x4b, 0x83, 0x0f, 0xd2, 0xce, 0x25, 0xa3, 0xf2, 0xc5, 0xd1, 0xbd, + 0x91, 0xe4, 0xec, 0x4e, 0xd2, 0x5d, 0xea, 0x64, 0x3d, 0x83, 0x79, 0x5f, + 0xc8, 0xde, 0xe1, 0xad, 0x9d, 0x7e, 0xba, 0x4b, 0x49, 0x6f, 0x27, 0x59, + 0x5d, 0x1a, 0x8c, 0x6f, 0x2f, 0x25, 0x2f, 0x5e, 0x4b, 0x1e, 0xe9, 0xec, + 0x2e, 0x7b, 0x27, 0x9d, 0x3d, 0x6d, 0x3a, 0x5b, 0xd9, 0xbf, 0x7a, 0x3b, + 0x49, 0x77, 0x29, 0x79, 0x7a, 0xa7, 0x9b, 0xb3, 0x3b, 0xbd, 0xac, 0x76, + 0x92, 0x4b, 0x3b, 0xdd, 0xf4, 0xfb, 0x7b, 0x3f, 0x98, 0xeb, 0x74, 0x2a, + 0x69, 0xc3, 0x97, 0x7b, 0x2f, 0x9c, 0xbf, 0x90, 0x8d, 0x37, 0x37, 0xd2, + 0x3d, 0xd3, 0xcd, 0xd6, 0xe6, 0xd6, 0xa8, 0x5c, 0xf5, 0xdf, 0x72, 0x1d, + 0xd5, 0xba, 0xea, 0xca, 0x34, 0x19, 0x95, 0x39, 0xb3, 0xdb, 0xff, 0x9c, + 0xbb, 0xfd, 0x5c, 0xae, 0xf7, 0xaf, 0xa7, 0x77, 0xad, 0x97, 0xfe, 0xd5, + 0x7e, 0xed, 0xfc, 0xba, 0x9d, 0x6e, 0xfa, 0xcf, 0x0f, 0x3e, 0x0e, 0xeb, + 0x16, 0x75, 0x6c, 0x25, 0x75, 0x7b, 0x5d, 0x7f, 0xb5, 0xf9, 0xb8, 0x7e, + 0x7a, 0xa7, 0x26, 0xb1, 0xfc, 0x91, 0xe1, 0xb8, 0xe1, 0x43, 0xd0, 0xa9, + 0xec, 0xff, 0x9d, 0x33, 0x83, 0xf1, 0xce, 0x52, 0x67, 0x94, 0x77, 0xba, + 0x73, 0x7a, 0x37, 0xbd, 0xd3, 0xa9, 0x9d, 0x6e, 0x16, 0x5f, 0xfa, 0xad, + 0x2f, 0xb5, 0x0e, 0x42, 0x52, 0x0d, 0x60, 0x32, 0xef, 0xf2, 0xc5, 0x34, + 0x9d, 0xa5, 0xa4, 0xbb, 0xb2, 0x9a, 0x14, 0xdd, 0xc5, 0xca, 0x70, 0xfa, + 0x7e, 0x69, 0xb8, 0x54, 0xfe, 0x91, 0x09, 0xfd, 0xc4, 0xcb, 0xdf, 0xf7, + 0x7d, 0x79, 0xfd, 0xb5, 0xd7, 0xf2, 0xd0, 0x43, 0x0f, 0x25, 0x49, 0xce, + 0xdf, 0x71, 0x47, 0x6e, 0x24, 0xb9, 0x7d, 0x98, 0x5f, 0x44, 0xac, 0xbe, + 0x3d, 0xc9, 0x13, 0x4f, 0x3c, 0xd1, 0xaa, 0x9d, 0xe7, 0xef, 0xb8, 0x23, + 0x77, 0x9c, 0x3f, 0x9f, 0xd7, 0x5e, 0x7f, 0x3d, 0x0f, 0x3d, 0xf4, 0x50, + 0x9e, 0x7d, 0xf6, 0xd9, 0x3c, 0xf1, 0xc4, 0x13, 0x79, 0xe8, 0xfc, 0xf9, + 0xdc, 0xf1, 0xf0, 0xc3, 0x79, 0xe2, 0x89, 0x27, 0xf2, 0xf3, 0x4f, 0x3c, + 0x91, 0xf3, 0x77, 0xdc, 0xd1, 0xaa, 0xbe, 0x69, 0xbc, 0xfe, 0xda, 0x6b, + 0xf9, 0xf6, 0x6f, 0xff, 0xf6, 0x89, 0xe5, 0x3e, 0xf6, 0xb1, 0x8f, 0xe5, + 0x6f, 0xde, 0x75, 0xd7, 0x81, 0xe7, 0x77, 0x3e, 0xc9, 0xeb, 0x0d, 0xe3, + 0xd5, 0xb2, 0x19, 0xe6, 0x9f, 0x4f, 0x72, 0x47, 0xcd, 0xfa, 0x2c, 0xd6, + 0x57, 0xe1, 0xf6, 0xec, 0xdd, 0x06, 0x19, 0x8e, 0xdf, 0x9e, 0xfd, 0xde, + 0xfc, 0x5b, 0x7f, 0xab, 0xb1, 0xad, 0x4f, 0xef, 0x6c, 0x26, 0x49, 0xfe, + 0xd9, 0xaf, 0xfc, 0xb3, 0xfc, 0xc4, 0x7f, 0xf5, 0x13, 0x83, 0xc4, 0xe1, + 0xe1, 0xfb, 0xeb, 0xbf, 0xf6, 0xeb, 0xf9, 0x91, 0x1f, 0xfb, 0x91, 0xdd, + 0xc2, 0x07, 0x38, 0xac, 0x27, 0x1d, 0x79, 0x75, 0x67, 0xcf, 0xa6, 0x1e, + 0xa9, 0xdf, 0xa2, 0xce, 0x6a, 0xdd, 0x6d, 0xa7, 0x29, 0xca, 0xff, 0xf4, + 0xcf, 0xfc, 0x74, 0x7e, 0xf9, 0x1f, 0xff, 0x72, 0x7a, 0xbd, 0xc3, 0xed, + 0xcf, 0x26, 0xaa, 0xce, 0x7e, 0x4c, 0x73, 0x1e, 0x59, 0x5a, 0x6b, 0xac, + 0xe6, 0xe9, 0xe1, 0xd2, 0xaf, 0xad, 0x2d, 0xe7, 0xec, 0xe6, 0x7a, 0x92, + 0xe4, 0xca, 0x5d, 0x0f, 0x0e, 0xaa, 0xfc, 0xca, 0x0b, 0x79, 0xba, 0x57, + 0xac, 0x9d, 0x4e, 0x2e, 0xac, 0x9e, 0x4d, 0xf7, 0xf2, 0xa5, 0x2c, 0xa7, + 0x93, 0xeb, 0xf7, 0x0f, 0xca, 0x6c, 0x75, 0xfa, 0xc9, 0xe6, 0x76, 0xd6, + 0x3f, 0xfe, 0x70, 0x1e, 0x29, 0xfa, 0xd2, 0xad, 0x8d, 0x9c, 0x7b, 0x79, + 0x3d, 0x5f, 0x4b, 0x92, 0x87, 0x1e, 0x4e, 0x92, 0x6c, 0xfc, 0x1f, 0xbf, + 0x9a, 0xcd, 0x8b, 0x17, 0x93, 0x2b, 0x5b, 0xc9, 0x7b, 0x5f, 0xcd, 0xc5, + 0x9d, 0xfb, 0x72, 0xf6, 0xd2, 0xa5, 0x74, 0xae, 0x6d, 0xa7, 0xff, 0xc3, + 0x83, 0x60, 0x21, 0x57, 0xd6, 0xd7, 0x73, 0xe9, 0xcc, 0xa5, 0xa4, 0x7f, + 0x5f, 0x72, 0x6e, 0x2d, 0xb9, 0x74, 0x29, 0x17, 0xfb, 0xcb, 0x39, 0xf7, + 0xbb, 0x5f, 0x1b, 0xd4, 0xfb, 0x43, 0x83, 0x72, 0x1b, 0x9b, 0x9b, 0xb9, + 0xf4, 0xbb, 0xaf, 0x0e, 0x96, 0xef, 0x87, 0x1e, 0xce, 0xc6, 0xe6, 0xe6, + 0xbe, 0x32, 0x57, 0xb6, 0x36, 0xd3, 0xfb, 0xca, 0x0b, 0x59, 0x4f, 0x37, + 0xbf, 0xfe, 0xf4, 0xff, 0x9a, 0xa7, 0x9f, 0xf8, 0x91, 0xfc, 0xea, 0xf3, + 0xbb, 0xeb, 0xe2, 0x42, 0x77, 0x73, 0x34, 0x7c, 0xef, 0x87, 0x92, 0x47, + 0x3e, 0xfd, 0x1b, 0x79, 0xfa, 0x89, 0x1f, 0xcc, 0x93, 0xbf, 0x55, 0x5f, + 0xe6, 0xa7, 0x7f, 0x32, 0x79, 0xe1, 0xc5, 0xe4, 0xc9, 0x4f, 0xff, 0x46, + 0xf2, 0xd5, 0x17, 0x77, 0x57, 0xe0, 0x9b, 0x57, 0xb2, 0xc7, 0x1b, 0x1b, + 0xc9, 0xd6, 0x56, 0xf2, 0xc3, 0xa5, 0x00, 0x28, 0x2f, 0xbe, 0x90, 0xfc, + 0x56, 0xfd, 0x87, 0x98, 0x93, 0x75, 0x4a, 0xdb, 0x76, 0xb8, 0x7e, 0x7b, + 0xa5, 0xe1, 0x92, 0x47, 0x6a, 0x8f, 0x98, 0x5d, 0x4f, 0xd7, 0x25, 0x96, + 0x03, 0x36, 0x8d, 0x1b, 0x5e, 0x30, 0xf7, 0x26, 0x19, 0xde, 0x71, 0x64, + 0x2b, 0x83, 0x6b, 0xd9, 0x17, 0xc7, 0x94, 0x7d, 0x64, 0x98, 0x5f, 0x2e, + 0x5f, 0xbb, 0x9e, 0x6a, 0xca, 0x6e, 0x26, 0xd9, 0x6e, 0xa8, 0xfb, 0xe1, + 0xec, 0xed, 0xaf, 0x7a, 0x49, 0x9e, 0x69, 0x68, 0xf3, 0xb9, 0x24, 0xbd, + 0xad, 0xad, 0xd1, 0x75, 0xea, 0x8b, 0x49, 0xed, 0x76, 0xb8, 0x37, 0xc9, + 0xd9, 0x31, 0xf5, 0x14, 0x4e, 0xef, 0x7c, 0x7e, 0xdf, 0xde, 0xf0, 0x46, + 0x6f, 0xf0, 0xd7, 0x25, 0x8a, 0xe1, 0x24, 0x39, 0x9d, 0xe4, 0xed, 0x4a, + 0xdf, 0xd1, 0xc9, 0x6e, 0x7f, 0x57, 0xec, 0x65, 0xe3, 0xfa, 0xc9, 0xd3, + 0x63, 0xe6, 0x7f, 0xbd, 0x26, 0xad, 0xda, 0x9e, 0xa2, 0xce, 0xa6, 0xbd, + 0xb6, 0x3c, 0xff, 0x49, 0xea, 0xda, 0x77, 0x52, 0x97, 0xe5, 0x54, 0x76, + 0xb7, 0x41, 0x79, 0x9b, 0x9c, 0xaa, 0x94, 0x4d, 0x92, 0xeb, 0x4b, 0x3f, + 0xdc, 0x50, 0x6b, 0xd2, 0xfd, 0xaf, 0x1f, 0xcc, 0xaf, 0xfe, 0x93, 0x17, + 0xd3, 0xcf, 0xc5, 0x74, 0x3e, 0x9e, 0x7c, 0x62, 0x78, 0x3f, 0xfe, 0xdc, + 0x3f, 0xba, 0x94, 0xfe, 0xc7, 0xcf, 0x25, 0xc3, 0x6b, 0xde, 0x8b, 0x2f, + 0xaf, 0xe7, 0x99, 0x0f, 0x5e, 0xc8, 0xc5, 0x97, 0xd7, 0xc7, 0x3e, 0x2b, + 0x49, 0x06, 0xd7, 0xce, 0xa3, 0xfb, 0xc7, 0xe1, 0xf0, 0xb8, 0xb4, 0xc2, + 0xe9, 0xa5, 0xd3, 0xb9, 0xbe, 0x73, 0x7d, 0xcf, 0x70, 0x39, 0xad, 0x9a, + 0x9e, 0x64, 0x5f, 0x99, 0xba, 0xe9, 0x96, 0x97, 0x97, 0xd3, 0x7f, 0xa7, + 0x9f, 0xce, 0x6d, 0xc3, 0x7b, 0xea, 0xe1, 0xf0, 0xb8, 0xb4, 0x24, 0xfb, + 0xf2, 0x9b, 0xa6, 0x2b, 0xda, 0x31, 0xa9, 0x7d, 0x6d, 0xda, 0x5c, 0xae, + 0xab, 0xea, 0x4a, 0x65, 0x1d, 0x6e, 0x57, 0xd6, 0x61, 0x91, 0x7e, 0xf6, + 0xa5, 0x2b, 0xb5, 0xd3, 0x17, 0xde, 0xb3, 0xf3, 0xf9, 0x3d, 0xe3, 0xb7, + 0x9d, 0x39, 0x95, 0x2b, 0xbd, 0x1b, 0x79, 0x77, 0x31, 0x9f, 0xe1, 0x3e, + 0xf5, 0xee, 0xd2, 0xf0, 0x38, 0xff, 0xf1, 0x99, 0x53, 0xf9, 0xc6, 0xb5, + 0xfd, 0x7f, 0x6b, 0xe6, 0x7d, 0x67, 0x4e, 0xe5, 0x9d, 0x9a, 0xf4, 0x3a, + 0xdf, 0xdf, 0xaa, 0xd4, 0xe1, 0xf8, 0xe8, 0xcf, 0xfe, 0xb9, 0xfc, 0xf6, + 0xff, 0xf8, 0xff, 0x1e, 0x63, 0x0b, 0xf6, 0xfb, 0xee, 0x24, 0xe9, 0x25, + 0x77, 0xfd, 0xd4, 0xbb, 0x72, 0xf9, 0x1f, 0xfe, 0x7f, 0x83, 0xc4, 0xde, + 0x30, 0xbd, 0xe2, 0xf3, 0x13, 0x8e, 0xeb, 0x53, 0x3b, 0x3b, 0xa9, 0xee, + 0x0d, 0xe5, 0x20, 0x3e, 0xe3, 0x86, 0x8f, 0xdb, 0xd9, 0x64, 0x5f, 0xbb, + 0x4f, 0x62, 0x9d, 0xf3, 0x98, 0x47, 0x75, 0xbd, 0x8f, 0xdb, 0x0e, 0xab, + 0x4b, 0xcd, 0x37, 0xd8, 0xdb, 0xf7, 0x3f, 0xbc, 0x2f, 0xad, 0x7b, 0xc7, + 0x85, 0xac, 0xbe, 0xf1, 0x2b, 0xe9, 0xf5, 0x92, 0x4b, 0x57, 0xfb, 0xe9, + 0xf5, 0xfa, 0xb9, 0xb2, 0x94, 0xdc, 0x77, 0xd7, 0x7d, 0xa3, 0x32, 0x17, + 0x2f, 0x5e, 0xcc, 0xa5, 0x4b, 0xcd, 0xcf, 0xe4, 0xca, 0xae, 0xbf, 0xf9, + 0xb5, 0x9c, 0xfe, 0xbe, 0x24, 0xeb, 0xf7, 0xec, 0xeb, 0x07, 0x6f, 0x16, + 0xd7, 0x0f, 0xb8, 0x38, 0xfd, 0xba, 0x3e, 0xfc, 0xf6, 0xdd, 0x7d, 0xe3, + 0xc2, 0x03, 0x83, 0xa7, 0x94, 0x97, 0x5e, 0xdb, 0xd8, 0x77, 0x83, 0xdd, + 0xbf, 0xd6, 0xcb, 0xb9, 0xdf, 0x6d, 0xde, 0x1e, 0xbd, 0x9d, 0xd2, 0x15, + 0xe6, 0xd2, 0x6a, 0x3a, 0x59, 0xce, 0x7a, 0xef, 0xb9, 0xac, 0xae, 0x5c, + 0x4c, 0xff, 0x5a, 0x3f, 0x1b, 0xd7, 0xd6, 0xd3, 0x59, 0xea, 0xa6, 0xb7, + 0xf3, 0x62, 0xd2, 0xbf, 0x77, 0xd8, 0xa6, 0x7e, 0xfa, 0x3b, 0x97, 0xd2, + 0xed, 0x3c, 0x90, 0x5e, 0xff, 0x4b, 0xa3, 0x7f, 0x3b, 0x4b, 0x17, 0xd3, + 0xdf, 0xd9, 0xce, 0xea, 0x99, 0x73, 0xe9, 0xf5, 0x7b, 0xe9, 0xef, 0x6c, + 0x67, 0x6d, 0xf5, 0x9e, 0x6c, 0x6e, 0x3d, 0x97, 0xf2, 0x4d, 0xe1, 0xea, + 0x99, 0x07, 0xd2, 0xeb, 0xf7, 0xd3, 0xdf, 0x59, 0xcf, 0xea, 0x99, 0xfb, + 0xd2, 0xdb, 0xd9, 0x4e, 0xbf, 0x5f, 0xbe, 0x72, 0x5d, 0xcb, 0xea, 0x99, + 0x0f, 0xa4, 0xbf, 0xb3, 0x9d, 0x5e, 0xff, 0x4a, 0xd6, 0x6e, 0xbf, 0x2f, + 0xbd, 0xab, 0x1b, 0xe9, 0xf5, 0xeb, 0xaf, 0x6e, 0xbb, 0x9d, 0x7b, 0xd3, + 0x59, 0x5a, 0x4e, 0xbf, 0x3b, 0xfc, 0xed, 0x66, 0xa9, 0x93, 0xec, 0xf4, + 0x87, 0xff, 0x16, 0xcb, 0x36, 0xbc, 0x26, 0xda, 0x49, 0x8a, 0x2b, 0xa3, + 0xde, 0x9b, 0xeb, 0x75, 0xb5, 0x0d, 0xeb, 0x1c, 0x5c, 0xd5, 0x76, 0x96, + 0x96, 0xb3, 0x75, 0xed, 0x99, 0x7d, 0x6d, 0x1a, 0x37, 0x5c, 0x6d, 0x6b, + 0xb7, 0x73, 0xef, 0xa8, 0x9e, 0xfe, 0xce, 0x76, 0x3a, 0x4b, 0xcb, 0x35, + 0xcb, 0x5b, 0xb6, 0x56, 0x5a, 0x7f, 0x83, 0x6d, 0x57, 0xbd, 0xbd, 0xef, + 0xec, 0x3c, 0x90, 0x7e, 0x7a, 0xe9, 0xef, 0x6c, 0xa4, 0xb3, 0x74, 0x2e, + 0xab, 0x2b, 0x67, 0xb3, 0xb9, 0xf5, 0x4c, 0xba, 0x4b, 0xf5, 0x81, 0x2e, + 0x0b, 0xdf, 0xf9, 0x3d, 0x3b, 0x59, 0x7b, 0xac, 0x3c, 0xa7, 0xb5, 0x3c, + 0xbf, 0xb9, 0x99, 0x47, 0xd6, 0xd6, 0xb2, 0x99, 0xcd, 0x14, 0xdb, 0xe8, + 0x9e, 0xc1, 0x5c, 0x2b, 0xad, 0x1a, 0x94, 0xbd, 0x7f, 0x58, 0xf6, 0xb3, + 0x8f, 0xef, 0xe6, 0x3d, 0xf6, 0xf8, 0x20, 0xed, 0xf9, 0xc7, 0xf7, 0x4c, + 0x92, 0xfb, 0x1f, 0x4b, 0x9e, 0x7f, 0x7e, 0x30, 0xfc, 0xf8, 0x63, 0x6b, + 0xc9, 0xe6, 0x66, 0x9e, 0x4f, 0xb2, 0xb6, 0xb6, 0x5b, 0x66, 0x73, 0x33, + 0xb9, 0x7f, 0x98, 0xf0, 0xfc, 0xe6, 0x66, 0xd6, 0x06, 0xc5, 0x86, 0x65, + 0xd6, 0xb2, 0xb9, 0xb9, 0x99, 0xfb, 0xd7, 0x06, 0xf7, 0x37, 0x75, 0xd3, + 0x3c, 0xfe, 0xd9, 0x52, 0xce, 0xe6, 0x60, 0x9e, 0x45, 0xfd, 0x9b, 0x9b, + 0x83, 0xf9, 0x3f, 0x56, 0x5a, 0xe6, 0x22, 0xbd, 0xda, 0x86, 0xa2, 0x9d, + 0xa3, 0xb6, 0x96, 0xda, 0x53, 0x2e, 0x73, 0xff, 0xfd, 0x83, 0x79, 0x97, + 0xdb, 0xfa, 0xfc, 0x67, 0x93, 0xc7, 0x1e, 0xdf, 0xdb, 0xb6, 0x72, 0xbb, + 0x1e, 0x7f, 0x6c, 0x6d, 0x4f, 0x5d, 0x85, 0xb5, 0xec, 0x2e, 0xc3, 0xa0, + 0x4c, 0x2f, 0x49, 0x2f, 0x6b, 0x6b, 0xc9, 0x7f, 0x34, 0xac, 0xf7, 0xa7, + 0x1e, 0xef, 0xe6, 0xf9, 0xcd, 0xde, 0x9e, 0xf5, 0xf2, 0xd9, 0xcf, 0x26, + 0xcb, 0x5f, 0x6e, 0xee, 0xc3, 0x5f, 0x58, 0x19, 0xfc, 0xde, 0x96, 0x24, + 0xbd, 0xde, 0xf0, 0xbe, 0xad, 0xb4, 0x49, 0xbb, 0x19, 0x3e, 0x77, 0xad, + 0x09, 0xc6, 0x52, 0x3c, 0xc3, 0xef, 0x74, 0x3a, 0xe9, 0x5d, 0xdd, 0x1a, + 0x1c, 0x2d, 0x3b, 0xfd, 0xfa, 0xe7, 0xd3, 0xe5, 0x6b, 0xf5, 0xa5, 0xdd, + 0x79, 0x9e, 0x04, 0x9d, 0xce, 0xfe, 0x27, 0x74, 0xc5, 0xef, 0x0f, 0x95, + 0xd4, 0x51, 0xf9, 0xa2, 0xfd, 0x93, 0x7e, 0xf3, 0x38, 0xb0, 0xa5, 0xa4, + 0x5f, 0x0d, 0x46, 0x3e, 0xe3, 0x73, 0xb3, 0x0b, 0xdd, 0xe5, 0x74, 0x3a, + 0x83, 0x7b, 0xfc, 0xa7, 0x87, 0x55, 0x5e, 0xbc, 0x9a, 0xac, 0xaf, 0x24, + 0xe7, 0xfa, 0xc9, 0xc6, 0x9b, 0xc9, 0xcf, 0xed, 0xf4, 0xf3, 0xa9, 0x4e, + 0xb2, 0xfc, 0x66, 0xb2, 0x3d, 0xea, 0x03, 0x3b, 0x59, 0x5e, 0x1a, 0x8c, + 0x3f, 0xbc, 0x94, 0x3c, 0x53, 0xf7, 0x1b, 0x4a, 0x92, 0xb3, 0x9d, 0xa4, + 0x57, 0xb9, 0x23, 0xed, 0x0e, 0x77, 0xbf, 0xe2, 0xf7, 0xaa, 0xde, 0x70, + 0xda, 0xcf, 0x2c, 0x25, 0x9f, 0xda, 0xd9, 0xfd, 0xb7, 0x5c, 0xef, 0x67, + 0x96, 0x92, 0xbf, 0xb6, 0x73, 0x3d, 0xa7, 0x87, 0x75, 0xad, 0x26, 0xb9, + 0xef, 0x4c, 0x27, 0x8f, 0x2c, 0x75, 0xf2, 0xd7, 0x77, 0xfa, 0x83, 0x37, + 0xe3, 0x4a, 0x6d, 0x18, 0xfd, 0x56, 0x7c, 0xad, 0x9f, 0x73, 0x4b, 0xd7, + 0xb3, 0xb1, 0x73, 0x3a, 0xd7, 0x87, 0x77, 0xc0, 0xa7, 0x33, 0x1c, 0xee, + 0xef, 0x2e, 0x4b, 0x92, 0x9c, 0x5e, 0xea, 0xe7, 0xfa, 0x4e, 0xa7, 0xf1, + 0x06, 0xf8, 0xbe, 0xa5, 0xe4, 0xd2, 0xd2, 0xe9, 0x0c, 0xee, 0xa6, 0x77, + 0x97, 0xab, 0xb3, 0x34, 0x38, 0x3f, 0x5c, 0xcf, 0x6e, 0x1b, 0x93, 0xe4, + 0x7a, 0xff, 0xfa, 0xa0, 0xde, 0xa5, 0xce, 0x9e, 0xf4, 0xf2, 0x3d, 0x67, + 0xf1, 0x56, 0x5f, 0xf5, 0xf7, 0xec, 0x24, 0x39, 0x77, 0x3e, 0xd9, 0xd8, + 0x19, 0x96, 0x29, 0x1e, 0xa8, 0xef, 0x94, 0x86, 0x8b, 0x65, 0x4d, 0xf2, + 0xe2, 0x66, 0xf3, 0x55, 0xdf, 0xc5, 0x3f, 0xfc, 0x8b, 0xa3, 0xe1, 0xdf, + 0x3f, 0xf5, 0x17, 0xf2, 0x97, 0x6e, 0xfc, 0x69, 0xf2, 0x87, 0xbb, 0xe3, + 0x1f, 0xf8, 0xc3, 0xdd, 0xe0, 0x4d, 0x83, 0x9f, 0xc1, 0xdb, 0x00, 0x00, + 0x20, 0x00, 0x49, 0x44, 0x41, 0x54, 0xbf, 0xff, 0xf6, 0x30, 0xbf, 0x5a, + 0x7e, 0x8a, 0xf1, 0xff, 0x66, 0xe5, 0xab, 0xf9, 0xc6, 0x1f, 0xbf, 0x93, + 0x3b, 0xef, 0xbc, 0x33, 0x5f, 0xff, 0xfa, 0xd7, 0xf7, 0xb4, 0xe5, 0x7d, + 0xdf, 0x7c, 0xdb, 0xbe, 0xf6, 0xdd, 0xf5, 0xa1, 0x0f, 0xe7, 0xf2, 0x4b, + 0x5f, 0x4d, 0x92, 0xdc, 0x76, 0xf6, 0x7d, 0xf9, 0xfa, 0xd7, 0xbf, 0x9e, + 0x07, 0x1f, 0x7c, 0x30, 0x6f, 0xbd, 0xf5, 0x56, 0xde, 0xb9, 0xf2, 0x8d, + 0x24, 0xc9, 0x37, 0xfe, 0xf8, 0x9d, 0x7d, 0xd3, 0x15, 0xf5, 0x1f, 0x66, + 0x9d, 0xdf, 0x78, 0xe7, 0x9d, 0xdc, 0xf9, 0x1d, 0x77, 0xee, 0x99, 0x66, + 0x94, 0x37, 0x1c, 0x2e, 0xea, 0x2f, 0xa7, 0x97, 0xeb, 0x7a, 0xf0, 0xc1, + 0x07, 0xf3, 0xdc, 0x73, 0xcf, 0xed, 0x69, 0xe7, 0x6d, 0x67, 0xdf, 0x97, + 0xaf, 0xff, 0xc1, 0xd7, 0xf3, 0xbe, 0xdb, 0x06, 0xd3, 0xbf, 0xb3, 0xbe, + 0xb7, 0xfe, 0xdb, 0x7a, 0xb7, 0xe5, 0x9d, 0x1b, 0x7b, 0xdb, 0xf7, 0x8d, + 0x3f, 0x7e, 0x27, 0x5f, 0xf8, 0x96, 0xf7, 0xed, 0x6b, 0x73, 0xd9, 0xd7, + 0x56, 0x06, 0x1d, 0xc2, 0xf2, 0xca, 0xd9, 0x6c, 0x5f, 0xbd, 0x92, 0xad, + 0x5e, 0x3f, 0xfd, 0xde, 0xa0, 0x1f, 0x7e, 0xf0, 0x23, 0x17, 0xf3, 0xcc, + 0xe5, 0xf5, 0xc1, 0x1f, 0x3a, 0x58, 0x19, 0xec, 0x73, 0xf7, 0x7d, 0xe8, + 0x62, 0xee, 0x3b, 0x7b, 0x3a, 0x5f, 0xbb, 0xf4, 0x6a, 0x9e, 0x7b, 0xb3, + 0x97, 0xcd, 0xad, 0x5e, 0xd6, 0x56, 0xbb, 0xa3, 0x7f, 0xf7, 0xd5, 0xd5, + 0xdf, 0xad, 0xeb, 0xd5, 0xcb, 0xeb, 0xfb, 0xca, 0x25, 0xc9, 0xf6, 0xd5, + 0xc1, 0xfe, 0x38, 0x4b, 0x5d, 0x8f, 0xfc, 0x77, 0x3f, 0x9e, 0xee, 0x57, + 0x5f, 0xc8, 0x3d, 0x17, 0x3f, 0x90, 0x24, 0x79, 0xea, 0xf3, 0x1b, 0x39, + 0xb7, 0x76, 0x3d, 0x4f, 0xbe, 0xb4, 0x99, 0x4f, 0x7c, 0x68, 0x6d, 0xf4, + 0x6f, 0x92, 0xdc, 0x73, 0xf1, 0x03, 0xf9, 0xd4, 0x3f, 0x7e, 0x26, 0x0f, + 0xac, 0x5c, 0xc8, 0x97, 0xae, 0xae, 0xe7, 0x81, 0x95, 0x0b, 0xf9, 0xe9, + 0x9f, 0xfd, 0xf1, 0xfc, 0xe0, 0x27, 0xff, 0x6e, 0x92, 0xec, 0x29, 0xf7, + 0xb5, 0xf5, 0x57, 0xb3, 0x71, 0xf9, 0x74, 0xce, 0xdd, 0x75, 0x3d, 0x8f, + 0x7c, 0xfc, 0xaf, 0xe5, 0xe9, 0xcf, 0xfd, 0x72, 0x9e, 0xfc, 0xf2, 0x66, + 0x3e, 0xf1, 0x3d, 0x6b, 0xa3, 0x75, 0xf7, 0xe4, 0x97, 0x37, 0xf3, 0xc0, + 0xca, 0x85, 0x9c, 0xbb, 0xeb, 0x7a, 0x36, 0x2e, 0x9f, 0xde, 0x5b, 0xd7, + 0xb0, 0xdc, 0x3d, 0x17, 0xea, 0xeb, 0x2a, 0xd2, 0xc7, 0xd5, 0x75, 0xee, + 0xae, 0xeb, 0x79, 0xf2, 0xcb, 0x9b, 0x83, 0xba, 0xee, 0x1e, 0xd4, 0xf5, + 0xf4, 0x70, 0xfe, 0xeb, 0x97, 0x4f, 0xe7, 0xdc, 0x47, 0xf6, 0xd7, 0xd5, + 0x1b, 0x13, 0x24, 0x2d, 0x49, 0x96, 0xfe, 0xf8, 0x5b, 0xf7, 0xa5, 0x7d, + 0xe5, 0xa5, 0x3f, 0xca, 0x52, 0xbe, 0x75, 0x34, 0x9c, 0x24, 0x4b, 0xf9, + 0xd6, 0xd1, 0xf0, 0x3c, 0x9c, 0xff, 0xa6, 0xc1, 0x7b, 0x4f, 0xff, 0xe9, + 0x1d, 0xbb, 0x01, 0xcf, 0x7f, 0xf4, 0xbf, 0x7c, 0x34, 0x2f, 0xfe, 0xab, + 0xdf, 0x4b, 0x92, 0xdc, 0xfb, 0x97, 0xbf, 0x33, 0xff, 0xfc, 0xff, 0x7c, + 0x2a, 0x49, 0xf2, 0x6f, 0x5f, 0x1b, 0x04, 0xe2, 0xfe, 0xa3, 0x7f, 0xbf, + 0x91, 0xb7, 0x6f, 0x9c, 0x9c, 0x73, 0xfc, 0x3c, 0xbd, 0xf7, 0x54, 0x27, + 0x17, 0xff, 0xd2, 0x47, 0x73, 0xe9, 0xf7, 0x7f, 0x3b, 0xdf, 0xf2, 0xe7, + 0x77, 0xdf, 0xed, 0xba, 0x2b, 0xef, 0xcb, 0xd5, 0x97, 0x07, 0xcb, 0xfe, + 0x9e, 0x3f, 0x5b, 0xca, 0xb7, 0xdd, 0xf6, 0x3d, 0xb9, 0xfa, 0xf2, 0x20, + 0xbd, 0xea, 0xf2, 0x37, 0x3d, 0x7f, 0x84, 0x2d, 0x06, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xb8, 0xf9, 0x08, 0xaa, 0x05, 0x00, 0x27, 0xc8, 0x95, + 0xe1, 0x0b, 0x84, 0xa7, 0x87, 0xc1, 0x9b, 0x32, 0xfc, 0x38, 0x71, 0xfb, + 0x5a, 0x6f, 0xf4, 0x61, 0xe9, 0xe9, 0xee, 0x6a, 0xd2, 0x49, 0x96, 0x57, + 0x57, 0x33, 0x7a, 0x21, 0xb7, 0xb7, 0x91, 0x5e, 0xef, 0xca, 0x20, 0xe8, + 0x53, 0xf1, 0xa2, 0x6d, 0xe9, 0xbd, 0xb3, 0x72, 0xc0, 0xa9, 0xf2, 0xbf, + 0xd3, 0xa8, 0x7e, 0x6c, 0x5a, 0xd4, 0x5b, 0xad, 0x6b, 0x9a, 0x97, 0xda, + 0xcb, 0xed, 0x29, 0xea, 0xae, 0xb6, 0x75, 0x5a, 0xe3, 0x82, 0x6b, 0x25, + 0xc3, 0x97, 0xf5, 0x6b, 0x82, 0x3b, 0x75, 0x3a, 0x9d, 0xf4, 0xae, 0x8d, + 0x7f, 0x89, 0xbd, 0x08, 0x1a, 0x51, 0xbc, 0xd4, 0xdf, 0xed, 0x76, 0xb3, + 0xb5, 0xb5, 0x55, 0x1b, 0xac, 0x6c, 0x72, 0x03, 0xa7, 0x0b, 0x5c, 0x53, + 0xbc, 0x68, 0x5d, 0x1b, 0x10, 0xaa, 0xb2, 0xae, 0xfb, 0x63, 0x5e, 0x4a, + 0x6f, 0xac, 0xff, 0x4c, 0xfd, 0x3a, 0xa9, 0xb6, 0xa1, 0x56, 0x31, 0xff, + 0x22, 0x28, 0x4f, 0x5d, 0x5d, 0xfd, 0xdd, 0x8f, 0x8f, 0xf7, 0x4d, 0x3e, + 0x29, 0xd8, 0x55, 0xbf, 0xdf, 0xb8, 0xbe, 0xaa, 0x75, 0x8e, 0xea, 0x2b, + 0x3e, 0x4c, 0x68, 0x0a, 0x08, 0xd6, 0x64, 0x0e, 0xc1, 0x85, 0x46, 0x55, + 0xa5, 0x93, 0x73, 0xa5, 0x20, 0x56, 0x9d, 0x74, 0xb2, 0x3c, 0x7c, 0x81, + 0x7d, 0x5c, 0xf9, 0xa4, 0x9f, 0xe5, 0xe1, 0x4b, 0xf0, 0x45, 0xf9, 0x6e, + 0x65, 0xdf, 0x3a, 0xdd, 0x49, 0x96, 0xaf, 0x25, 0xdb, 0xc3, 0x65, 0xeb, + 0x56, 0x97, 0x71, 0x27, 0x59, 0x4e, 0x72, 0xef, 0x99, 0xa4, 0x3b, 0x0c, + 0xba, 0xb5, 0xba, 0x34, 0x08, 0xa8, 0xb5, 0x67, 0x7e, 0x4b, 0xbb, 0x81, + 0xb6, 0xca, 0xf5, 0xf4, 0xfb, 0xfd, 0xfc, 0x78, 0xfa, 0x79, 0x6e, 0xd8, + 0xd2, 0xee, 0xca, 0xb9, 0xf4, 0xae, 0xb6, 0x0b, 0x86, 0xb1, 0x27, 0xc8, + 0xdc, 0xf0, 0xe3, 0x90, 0xea, 0xbf, 0x65, 0xe3, 0x02, 0x6a, 0x8d, 0xad, + 0xbf, 0x55, 0x99, 0x4e, 0xae, 0xf7, 0xf7, 0x7e, 0x10, 0xd8, 0xa6, 0x2d, + 0xd3, 0xce, 0xe7, 0xa4, 0x69, 0x0a, 0xa8, 0x55, 0x38, 0xdd, 0x39, 0x5d, + 0x5b, 0xbe, 0x78, 0x31, 0x3d, 0xc9, 0xe8, 0xc3, 0xf8, 0xc2, 0xb8, 0x0f, + 0xe4, 0xeb, 0x8c, 0xeb, 0x17, 0xab, 0x7d, 0xe4, 0xea, 0xea, 0x6a, 0x63, + 0x3f, 0x7a, 0x90, 0xf2, 0xe5, 0xe1, 0x6e, 0x25, 0x70, 0xd6, 0xbe, 0xf6, + 0x0e, 0xfb, 0xfe, 0xce, 0x99, 0xe6, 0xc0, 0x69, 0x85, 0x3b, 0xce, 0x0f, + 0xbe, 0x46, 0x29, 0x02, 0x5c, 0x3d, 0xfb, 0xec, 0xb3, 0xa3, 0x00, 0x5b, + 0x55, 0xe3, 0xd2, 0xeb, 0x3c, 0xfb, 0xec, 0xb3, 0xf9, 0xc9, 0x4f, 0x7f, + 0x3a, 0x0f, 0x3d, 0xf4, 0x50, 0x5e, 0x7f, 0xed, 0xb5, 0x3c, 0xfc, 0xd0, + 0x43, 0x7b, 0xe6, 0xf1, 0xda, 0xeb, 0xaf, 0x1f, 0x4a, 0x50, 0xad, 0x79, + 0x6a, 0x0a, 0x90, 0x55, 0x28, 0xe7, 0x7f, 0x6c, 0x42, 0xf9, 0xd7, 0x2b, + 0xc3, 0xc7, 0xb5, 0xf4, 0x7f, 0xfb, 0xa5, 0x41, 0x60, 0xad, 0xce, 0xbb, + 0x77, 0xf7, 0xc7, 0x4f, 0x7d, 0xf5, 0xe8, 0xe6, 0xdf, 0xa9, 0x19, 0x2e, + 0x7a, 0xa6, 0xba, 0xbd, 0x76, 0xda, 0x33, 0xd8, 0x2c, 0x57, 0x5b, 0x9d, + 0x4e, 0xe7, 0xf8, 0x03, 0x6a, 0x1d, 0x82, 0xcd, 0xcd, 0xed, 0x9c, 0x4d, + 0xf2, 0x62, 0x56, 0xd3, 0x7d, 0x73, 0x10, 0xa0, 0xaa, 0x57, 0x59, 0xcb, + 0xeb, 0x97, 0xaf, 0xe4, 0xe1, 0x74, 0xf2, 0x4c, 0xba, 0x59, 0xdb, 0x1c, + 0x9c, 0x17, 0xcf, 0x2d, 0x6d, 0xe7, 0x4b, 0x1f, 0xbe, 0x27, 0xb9, 0x7c, + 0x29, 0x4f, 0x7f, 0xd7, 0xe0, 0x63, 0xe6, 0xac, 0x9e, 0xcb, 0x03, 0x2f, + 0xaf, 0x67, 0xe3, 0xc2, 0x85, 0x64, 0x58, 0x6e, 0xf3, 0xe2, 0x20, 0x14, + 0xd1, 0x03, 0xf7, 0x7e, 0x2d, 0x5f, 0x7a, 0xbd, 0x93, 0x4b, 0x4b, 0x2f, + 0xe4, 0xca, 0x5d, 0x5b, 0xd9, 0xba, 0x6d, 0x35, 0xe9, 0x0d, 0x42, 0x0d, + 0x75, 0x3b, 0x5b, 0x49, 0x3a, 0xc9, 0x1d, 0xaf, 0x26, 0x3b, 0x6b, 0x49, + 0x92, 0x4b, 0xbf, 0xfb, 0x6a, 0xce, 0x25, 0x59, 0xbf, 0xeb, 0x5c, 0x72, + 0xf9, 0x52, 0xb2, 0xd4, 0xc9, 0x85, 0x57, 0xd6, 0x73, 0x69, 0xb8, 0xb5, + 0x9f, 0xfe, 0xbf, 0x06, 0xd3, 0x9e, 0x4b, 0xb2, 0x7e, 0xf7, 0x85, 0xe4, + 0xf5, 0xc1, 0x47, 0xdb, 0x17, 0x5e, 0x59, 0xcf, 0x8b, 0xa5, 0xf6, 0x97, + 0x03, 0x6a, 0x55, 0xdd, 0x37, 0x6c, 0x76, 0x39, 0xa0, 0x56, 0xd5, 0x0b, + 0x2f, 0x0e, 0xca, 0x3d, 0x39, 0xb6, 0x44, 0xc9, 0xea, 0x6a, 0xf2, 0xf9, + 0xa7, 0xf7, 0x06, 0xd6, 0xe2, 0xc8, 0x9c, 0x4d, 0x72, 0x29, 0x93, 0x03, + 0x4f, 0xcd, 0x52, 0xbe, 0x5c, 0xb6, 0x4d, 0x7f, 0xd3, 0xcb, 0x20, 0xf0, + 0xd6, 0xf2, 0x84, 0x72, 0xcb, 0x49, 0x66, 0x0d, 0xbb, 0x76, 0x54, 0xa6, + 0x09, 0x5a, 0x58, 0xbe, 0x92, 0x9a, 0x74, 0x15, 0x35, 0x29, 0x18, 0xd5, + 0x61, 0xb8, 0x99, 0x96, 0xe5, 0x57, 0xff, 0xc9, 0x8b, 0xc3, 0x79, 0x5f, + 0x4a, 0xff, 0x73, 0x17, 0xf3, 0x8b, 0xc3, 0xb3, 0x64, 0x37, 0x49, 0xff, + 0x73, 0x49, 0x37, 0x83, 0x3e, 0x71, 0x3d, 0x49, 0xff, 0x2b, 0xfd, 0xf4, + 0x3f, 0x34, 0xfe, 0x7a, 0xb3, 0x1a, 0x30, 0xab, 0x1c, 0x50, 0xab, 0x7c, + 0xef, 0x59, 0x17, 0x50, 0xab, 0x29, 0x18, 0x55, 0x35, 0xbd, 0x3c, 0x5d, + 0x93, 0xfe, 0x3b, 0xfd, 0x5c, 0xdf, 0xb9, 0x9e, 0xeb, 0xdb, 0xa5, 0x69, + 0xdf, 0xc9, 0xe8, 0xdf, 0xa2, 0xde, 0x94, 0xbe, 0x9f, 0xdd, 0xde, 0xde, + 0xce, 0xe9, 0xa5, 0xd3, 0xd9, 0xde, 0xde, 0xde, 0xd3, 0xc6, 0x6a, 0xfa, + 0xb8, 0x76, 0xd7, 0x2d, 0x57, 0x9b, 0xc0, 0x5b, 0xe3, 0xa6, 0x29, 0xaf, + 0xd7, 0xe5, 0x0b, 0x0f, 0xe7, 0xfa, 0x1b, 0xcf, 0x8d, 0x0d, 0x54, 0xc6, + 0xae, 0x95, 0x8f, 0x9c, 0xca, 0x07, 0x1e, 0x7a, 0xd7, 0x71, 0x37, 0x63, + 0xac, 0x8f, 0xfe, 0xec, 0x9f, 0x6b, 0xcc, 0xbf, 0x7c, 0xc8, 0xf3, 0x9f, + 0x47, 0xa0, 0xa9, 0x36, 0x75, 0x4c, 0x33, 0x9f, 0xb6, 0xe7, 0xdc, 0x71, + 0xd3, 0x55, 0xe7, 0x73, 0x76, 0xca, 0xf9, 0xdf, 0x93, 0xe4, 0x6b, 0x13, + 0xe6, 0x53, 0x9d, 0xd7, 0x95, 0xb4, 0x3f, 0xf7, 0x1f, 0x66, 0x60, 0xaf, + 0xd3, 0x95, 0x13, 0x52, 0xe7, 0x8d, 0x5f, 0xc9, 0xe6, 0x85, 0xa4, 0xfb, + 0x62, 0x06, 0x81, 0x54, 0x3e, 0x32, 0x08, 0x50, 0x5f, 0x58, 0xbb, 0xe3, + 0xde, 0x5c, 0xba, 0x34, 0x2e, 0x50, 0xd0, 0xb0, 0x8e, 0xdb, 0xf6, 0x56, + 0xfa, 0xc2, 0xe5, 0xad, 0x3c, 0xb2, 0xb2, 0x9a, 0xde, 0x7b, 0x3b, 0x63, + 0xcb, 0x8c, 0xb3, 0x28, 0xc1, 0xb7, 0xca, 0xeb, 0x71, 0x96, 0x00, 0x5b, + 0x9d, 0xd2, 0x39, 0xa0, 0x2e, 0xc0, 0xd6, 0xfa, 0x6b, 0xe3, 0xaf, 0xd4, + 0xda, 0x3e, 0x4f, 0x19, 0x95, 0xcf, 0x72, 0xba, 0xdd, 0xd5, 0x6c, 0x5d, + 0xbd, 0x92, 0xe4, 0x74, 0x3a, 0x67, 0x4e, 0x27, 0xd7, 0x92, 0xce, 0x99, + 0xe5, 0xac, 0x76, 0x1f, 0xce, 0xd6, 0xd6, 0x33, 0xc3, 0x00, 0x56, 0xdd, + 0x74, 0x96, 0x1e, 0x48, 0xb7, 0x7b, 0x3a, 0xdd, 0x3c, 0x9c, 0xcd, 0xad, + 0x67, 0xd2, 0x59, 0xba, 0x98, 0x6e, 0xa7, 0x9b, 0x5e, 0x7f, 0x50, 0x3e, + 0xfd, 0x5e, 0x3a, 0x4b, 0xcb, 0xd9, 0xdc, 0xaa, 0x3b, 0x02, 0x4e, 0xa7, + 0xdb, 0x39, 0x9d, 0xad, 0x6b, 0x83, 0xb1, 0xee, 0xd2, 0x72, 0xf6, 0x86, + 0x6b, 0xed, 0xa5, 0xd3, 0xed, 0xa6, 0x7f, 0x75, 0x3b, 0xdd, 0xce, 0xd9, + 0x6c, 0xbe, 0x39, 0x2e, 0xfc, 0xeb, 0xb0, 0xdd, 0x4b, 0xc5, 0x15, 0x6d, + 0xa7, 0xf4, 0xbc, 0xbe, 0x33, 0x78, 0xfe, 0x5c, 0x3c, 0x97, 0xdd, 0xc9, + 0xe8, 0x19, 0xeb, 0x28, 0xaf, 0xd6, 0xe9, 0x74, 0xf7, 0x04, 0xdd, 0x29, + 0xdf, 0xed, 0x77, 0xd2, 0x59, 0x3a, 0x9b, 0x64, 0x3d, 0x9d, 0xee, 0x6a, + 0xfa, 0x57, 0xb7, 0x87, 0x6d, 0x5d, 0x2d, 0xb5, 0xf5, 0x85, 0x24, 0xbd, + 0xac, 0xdd, 0xfe, 0xe3, 0xe9, 0x5d, 0xdd, 0x48, 0x67, 0x69, 0x39, 0x9d, + 0x61, 0x60, 0xd1, 0x41, 0xf9, 0xba, 0xe5, 0xad, 0x2e, 0xfb, 0xd9, 0xe4, + 0x6a, 0x7f, 0x4f, 0x80, 0x99, 0xaa, 0xd5, 0x95, 0x73, 0xd9, 0xdc, 0xda, + 0x18, 0xfe, 0xdb, 0xd4, 0xcb, 0xec, 0x2a, 0x07, 0xd4, 0x2a, 0x3c, 0xff, + 0xd9, 0xe4, 0xfe, 0xc7, 0x4b, 0x65, 0x86, 0xc1, 0xb3, 0x0a, 0x45, 0x10, + 0xad, 0xcd, 0x61, 0xee, 0xf3, 0x9b, 0x9b, 0x59, 0xcb, 0x6e, 0x10, 0xa9, + 0x24, 0xd9, 0x1c, 0x96, 0x7f, 0xec, 0xf1, 0xb5, 0x22, 0x65, 0x98, 0x3e, + 0x08, 0x42, 0xf5, 0xfc, 0xf3, 0xc9, 0xe3, 0x8f, 0x6f, 0xe6, 0xb1, 0xc7, + 0x93, 0xb5, 0xe1, 0x3c, 0x1e, 0x4f, 0xf2, 0x58, 0x06, 0x81, 0xa6, 0xca, + 0xf3, 0x5b, 0xcb, 0x5a, 0xb2, 0x56, 0xcc, 0x6d, 0xf0, 0xbf, 0x22, 0xb7, + 0x08, 0x2a, 0x55, 0x9e, 0xe6, 0xfe, 0xfb, 0x93, 0xfb, 0x93, 0x6c, 0xae, + 0xed, 0x96, 0x29, 0xea, 0x59, 0x5b, 0x1b, 0x04, 0xd9, 0x2a, 0x82, 0x80, + 0x3d, 0x5e, 0xb4, 0x6f, 0x6d, 0x33, 0xf9, 0xec, 0x60, 0x7d, 0x6c, 0xa6, + 0x14, 0x60, 0xeb, 0xfe, 0x24, 0xc3, 0xb6, 0x16, 0xc1, 0xb9, 0x4a, 0x4d, + 0xcb, 0xfd, 0xf7, 0x0f, 0xd3, 0xb2, 0x39, 0x0a, 0xea, 0x95, 0xb5, 0xc1, + 0x72, 0x15, 0xc1, 0xb4, 0x46, 0xf9, 0xf7, 0x97, 0xd6, 0xcf, 0x70, 0x1e, + 0x6b, 0x49, 0x1e, 0xff, 0xec, 0x60, 0x36, 0xf7, 0x0f, 0x03, 0x77, 0x15, + 0x65, 0xcb, 0x41, 0xb7, 0x8a, 0x75, 0xf0, 0xd8, 0xe3, 0xd5, 0x79, 0x0d, + 0xa6, 0xb8, 0xff, 0xfe, 0xe4, 0xf7, 0xbe, 0x9c, 0x46, 0xc5, 0xb3, 0xe4, + 0x83, 0x04, 0xb9, 0xea, 0xf7, 0xfb, 0xa3, 0x80, 0x5a, 0xd9, 0xf3, 0x9b, + 0x42, 0x29, 0xc0, 0x56, 0x29, 0xd8, 0xd6, 0x49, 0x0a, 0xa8, 0x95, 0x0c, + 0x7f, 0x6f, 0xdc, 0xc9, 0xa0, 0xfd, 0xa3, 0xb4, 0xee, 0xd8, 0xf6, 0x0e, + 0xc6, 0xfb, 0x87, 0xbe, 0x1c, 0xf3, 0xae, 0xff, 0x62, 0x67, 0xf0, 0x1c, + 0xe0, 0xe9, 0xec, 0x06, 0xb8, 0xba, 0xb4, 0x33, 0xb8, 0x3f, 0xdc, 0x1e, + 0xf6, 0x21, 0x9f, 0x1a, 0xf6, 0x63, 0xc5, 0xf8, 0x67, 0xd2, 0xc9, 0xa7, + 0x4a, 0xe3, 0x65, 0xf7, 0x2c, 0x0d, 0xee, 0xff, 0xb7, 0x97, 0x92, 0x7b, + 0x96, 0x4e, 0xe7, 0x93, 0x3b, 0xd7, 0x47, 0xfd, 0xe8, 0xdf, 0xc9, 0xe0, + 0xda, 0xe3, 0x93, 0x49, 0x7e, 0x21, 0xc9, 0xdf, 0xfb, 0x9f, 0x56, 0xf3, + 0xa9, 0xff, 0x61, 0xd0, 0x9b, 0x7d, 0xa6, 0xf4, 0x1b, 0xd8, 0x2f, 0x0f, + 0xff, 0x7d, 0x66, 0x27, 0xf9, 0xcc, 0xf7, 0x26, 0x9f, 0xfa, 0x9d, 0x41, + 0x90, 0xad, 0x22, 0x28, 0x55, 0x77, 0x29, 0x39, 0xbb, 0x94, 0x6c, 0x54, + 0xf6, 0xad, 0x71, 0x36, 0x76, 0x4a, 0x77, 0xbe, 0x0d, 0x51, 0xa3, 0xaf, + 0xef, 0xec, 0xff, 0xfd, 0xbd, 0xea, 0x52, 0xfa, 0x19, 0xdc, 0x49, 0x9f, + 0x4e, 0x67, 0xe9, 0x7a, 0xfa, 0xc3, 0xba, 0xcb, 0xe7, 0x84, 0xd5, 0x9d, + 0xeb, 0xd9, 0x58, 0xda, 0x6d, 0x6f, 0x96, 0x96, 0x93, 0xfe, 0xf5, 0xf1, + 0x37, 0xea, 0xe5, 0x73, 0xcd, 0x50, 0xb1, 0x9f, 0x6d, 0x14, 0xbf, 0xc1, + 0x36, 0x34, 0xab, 0xd5, 0x6f, 0xd7, 0x49, 0xbe, 0xfa, 0xee, 0xeb, 0xf9, + 0xf0, 0x7f, 0x38, 0x3d, 0xfc, 0xf7, 0xf0, 0xc7, 0xef, 0xfa, 0xd0, 0x87, + 0x73, 0xdb, 0x30, 0x78, 0x55, 0x39, 0x48, 0xd5, 0x6d, 0x67, 0xdf, 0x97, + 0x77, 0xae, 0x7c, 0x23, 0x77, 0x7d, 0xe8, 0xc3, 0x79, 0xee, 0x4b, 0xcf, + 0xe5, 0xce, 0xef, 0xb8, 0x33, 0x49, 0xf2, 0xd6, 0x5b, 0x6f, 0x25, 0xd9, + 0x0d, 0x7e, 0x75, 0xe7, 0x9d, 0x77, 0xee, 0x0b, 0x88, 0x95, 0x64, 0x54, + 0x47, 0xd9, 0x9d, 0x77, 0xde, 0x79, 0xa8, 0x75, 0xe6, 0xa5, 0xaf, 0xe6, + 0xfd, 0xef, 0x7f, 0x7f, 0x2e, 0x0f, 0x83, 0x6a, 0xbd, 0xef, 0x9b, 0x6f, + 0x1b, 0x05, 0xcd, 0x7a, 0xf0, 0xc1, 0x07, 0x73, 0xf9, 0xa5, 0xaf, 0xe6, + 0x9d, 0x2b, 0xdf, 0xd8, 0x93, 0x7e, 0xe7, 0x9d, 0x77, 0x8e, 0xea, 0x7a, + 0xdf, 0x37, 0xdf, 0x96, 0xcb, 0x2f, 0x7d, 0x75, 0x54, 0x67, 0x31, 0xaf, + 0xa2, 0x4d, 0x49, 0x46, 0xe9, 0x45, 0x9b, 0xca, 0x01, 0xc1, 0xca, 0xf3, + 0xba, 0xed, 0xad, 0xb7, 0xf2, 0x85, 0xad, 0xfd, 0x81, 0xc0, 0xca, 0x8a, + 0xa0, 0x55, 0xe3, 0x6c, 0x55, 0x83, 0xf2, 0x25, 0xf9, 0xe5, 0x17, 0x37, + 0xb2, 0x7d, 0x75, 0xff, 0x6f, 0x02, 0xb3, 0xd4, 0xd5, 0xd4, 0xae, 0xf5, + 0xd7, 0x37, 0xb2, 0xbc, 0x52, 0x9f, 0x5f, 0xd4, 0xf5, 0xb5, 0xcf, 0x3f, + 0x93, 0x07, 0x6f, 0xdf, 0xbd, 0x96, 0xfa, 0xd2, 0xd5, 0xf5, 0x9c, 0xab, + 0x46, 0x96, 0x4c, 0xb2, 0xb1, 0x79, 0x3a, 0xf7, 0x5c, 0xdc, 0x97, 0xbc, + 0x57, 0xe5, 0xf0, 0xf8, 0xd2, 0xd5, 0xf5, 0x9c, 0x4b, 0x4d, 0x5d, 0xc3, + 0xa0, 0x57, 0x85, 0x22, 0x20, 0x56, 0x59, 0x35, 0x68, 0x56, 0xb5, 0xae, + 0xb5, 0xef, 0xba, 0x77, 0x4f, 0xb0, 0xad, 0x7d, 0x75, 0xf5, 0xf7, 0xd7, + 0x35, 0x98, 0xc7, 0xf5, 0xfa, 0xba, 0x2e, 0xed, 0xce, 0xeb, 0xa4, 0x29, + 0x02, 0x6a, 0xdd, 0xbe, 0x7a, 0x3e, 0x6f, 0x6e, 0xbd, 0x9e, 0x17, 0xff, + 0xd5, 0xef, 0xe5, 0xde, 0xbf, 0xfc, 0x9d, 0x49, 0x32, 0x0a, 0xae, 0x75, + 0x2b, 0xf9, 0xb7, 0xaf, 0xbd, 0x91, 0x3f, 0xfe, 0xb3, 0xb7, 0x46, 0xe3, + 0xdf, 0xf2, 0xe7, 0xcf, 0xe5, 0x8f, 0xfe, 0xfd, 0xc6, 0x68, 0xb8, 0xac, + 0x9c, 0x5e, 0x0c, 0xe7, 0x9b, 0x8e, 0xa6, 0x9d, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x37, 0x2b, 0x41, 0xb5, 0x00, 0xe0, 0x04, 0xb8, 0x5e, + 0x7a, 0x4b, 0xee, 0xf4, 0x52, 0x92, 0x7e, 0xd2, 0x5f, 0x1a, 0x06, 0x54, + 0xba, 0x76, 0x7d, 0xf4, 0x3e, 0xdf, 0xb9, 0xf3, 0x17, 0x86, 0x67, 0xef, + 0x4e, 0x4e, 0x27, 0xb9, 0x72, 0xad, 0x97, 0xfe, 0xb5, 0x7e, 0xae, 0xa7, + 0x9b, 0xfe, 0xd2, 0xf5, 0x74, 0x76, 0x7a, 0xd9, 0x7a, 0x73, 0x6b, 0xf8, + 0x32, 0xf7, 0xde, 0x8f, 0x45, 0x93, 0xf1, 0x2f, 0xce, 0xb6, 0x09, 0x08, + 0x35, 0x2e, 0xc8, 0xd5, 0xb8, 0xe9, 0x8a, 0x80, 0x5b, 0xe3, 0x02, 0x59, + 0x75, 0xcf, 0x74, 0xd3, 0xbb, 0xd6, 0x4b, 0x67, 0xa9, 0xb3, 0xe7, 0xe5, + 0xfb, 0xfe, 0x4e, 0x3f, 0xdd, 0x33, 0xdd, 0xc1, 0x3a, 0x28, 0xfe, 0x52, + 0x70, 0x43, 0xfb, 0x8a, 0xbc, 0x22, 0x30, 0x56, 0x31, 0x9c, 0xfe, 0xfe, + 0x00, 0x33, 0xfd, 0xfe, 0xb0, 0xee, 0x64, 0xf4, 0x62, 0xe2, 0xe8, 0xaf, + 0x62, 0x57, 0xea, 0x1f, 0xd5, 0x9b, 0x4e, 0xba, 0xdd, 0x6e, 0x7a, 0xbd, + 0x5e, 0x7a, 0xbd, 0x5e, 0x3a, 0x9d, 0x4e, 0xb6, 0xb6, 0xb6, 0xf6, 0x2c, + 0x7b, 0x31, 0xbf, 0x79, 0xa8, 0xfb, 0xa0, 0x74, 0x5f, 0x50, 0xa8, 0x16, + 0xc1, 0xb4, 0xf6, 0x4d, 0x33, 0x21, 0x38, 0xd5, 0x81, 0x3e, 0x62, 0xad, + 0x04, 0xd7, 0xaa, 0x2d, 0x32, 0xa6, 0xfe, 0x89, 0x01, 0xaf, 0xaa, 0x1f, + 0x00, 0xb4, 0x08, 0xb2, 0xd5, 0x7a, 0x59, 0x66, 0x0c, 0x9e, 0x35, 0x8f, + 0x8f, 0x7e, 0xab, 0xcb, 0x7d, 0x76, 0x27, 0xb9, 0x32, 0x4c, 0x5b, 0xde, + 0xc9, 0x9e, 0x00, 0x58, 0xdb, 0x4b, 0x29, 0xfe, 0xae, 0x7b, 0x96, 0x77, + 0x06, 0xe3, 0xd7, 0xfb, 0x83, 0x0f, 0x03, 0x8a, 0x4f, 0xa5, 0x3b, 0xa3, + 0x5e, 0x62, 0xd8, 0xae, 0x51, 0x70, 0xac, 0x8c, 0x5e, 0x08, 0xae, 0x06, + 0xd4, 0x7a, 0xf1, 0x5a, 0x72, 0xee, 0x4c, 0x46, 0x01, 0xb7, 0x8a, 0x32, + 0x45, 0x5d, 0x4f, 0x67, 0xf8, 0x31, 0x7a, 0xbf, 0xb7, 0x2f, 0xb8, 0xd4, + 0x61, 0x05, 0x9b, 0x6a, 0x33, 0x9f, 0xe3, 0x6a, 0xcb, 0x49, 0x55, 0xed, + 0xe7, 0x46, 0xe9, 0x35, 0x81, 0xec, 0xaa, 0x79, 0x7b, 0x3e, 0x50, 0x4a, + 0xe9, 0x83, 0x9b, 0x4e, 0x65, 0xbc, 0x61, 0x3e, 0xfb, 0xa6, 0xcd, 0xa0, + 0xff, 0x1c, 0x7d, 0x2c, 0x5f, 0x19, 0xde, 0x37, 0xdd, 0xb5, 0x7e, 0x72, + 0xa6, 0x74, 0xdc, 0x9e, 0xd9, 0x9b, 0xbe, 0xaf, 0x7c, 0xaf, 0x37, 0xf8, + 0xae, 0xa5, 0xdb, 0x4d, 0xbf, 0xd7, 0x4b, 0x8a, 0x8f, 0x06, 0x4b, 0xc3, + 0x45, 0x1b, 0x46, 0x6d, 0xe9, 0xf5, 0x46, 0x1f, 0x17, 0x56, 0x75, 0xce, + 0x74, 0xd3, 0xbf, 0xd6, 0x1b, 0x05, 0xd7, 0x6a, 0xe3, 0xf5, 0xd7, 0x5e, + 0xcb, 0xb3, 0xc3, 0xe1, 0xa6, 0xc0, 0x59, 0x6d, 0x83, 0x60, 0xbd, 0xfe, + 0xda, 0x6b, 0x39, 0x7f, 0xc7, 0x1d, 0xf9, 0xf9, 0x27, 0x9e, 0x18, 0xd4, + 0xfd, 0xec, 0xb3, 0x39, 0x7f, 0xc7, 0x1d, 0xb9, 0xe3, 0xfc, 0xf9, 0xfc, + 0xe4, 0xa7, 0x3f, 0x3d, 0x9a, 0xcf, 0xb3, 0xcf, 0x3e, 0x3b, 0xa1, 0xa6, + 0x83, 0xf9, 0xd8, 0xc7, 0x3e, 0xb6, 0x2f, 0xed, 0x8b, 0x5f, 0xfc, 0x62, + 0xe3, 0x34, 0xe7, 0x1b, 0x73, 0xc7, 0x4f, 0xf3, 0xb1, 0x9c, 0xcf, 0xf9, + 0x9c, 0xcf, 0x17, 0x33, 0xa8, 0xff, 0xf5, 0xb4, 0x0b, 0xca, 0x75, 0x1c, + 0xb6, 0xfe, 0xc1, 0x4f, 0xe4, 0x6f, 0xff, 0xcc, 0xaf, 0x67, 0xeb, 0x7f, + 0xf9, 0x91, 0x24, 0xc9, 0xaf, 0xff, 0xda, 0xee, 0xf0, 0x61, 0x6a, 0x3a, + 0xe2, 0xa6, 0xfb, 0x64, 0x79, 0xb2, 0xba, 0xfa, 0x9a, 0xce, 0x72, 0x7f, + 0xff, 0xe7, 0xfe, 0xfe, 0x9c, 0x5b, 0x70, 0x82, 0x7c, 0xe4, 0xc1, 0xdc, + 0x5b, 0x0c, 0xf7, 0xae, 0xe4, 0xc5, 0x6c, 0xef, 0x2b, 0x72, 0xfd, 0xfe, + 0x07, 0xf3, 0x40, 0x31, 0xb2, 0xb5, 0x91, 0x64, 0x39, 0xd9, 0xee, 0x27, + 0xcb, 0x9d, 0xe4, 0x77, 0x5f, 0x4c, 0x8a, 0xc0, 0x5a, 0x0f, 0x3d, 0x9c, + 0x0f, 0xf4, 0x86, 0x9f, 0x31, 0xbf, 0x79, 0x25, 0x9b, 0xdb, 0x83, 0xb5, + 0x7a, 0x7a, 0x75, 0x2b, 0xc9, 0x5a, 0xd2, 0xd9, 0x4a, 0xba, 0xab, 0xa3, + 0x73, 0x7c, 0xfa, 0xfd, 0xe4, 0x6c, 0x37, 0x79, 0xbb, 0x66, 0xed, 0xff, + 0xd0, 0x23, 0x19, 0x7d, 0xa2, 0xf3, 0xe6, 0x7a, 0xf2, 0x3d, 0xe7, 0x92, + 0x2f, 0x5f, 0xc9, 0x67, 0x7e, 0x66, 0x33, 0x49, 0xb2, 0x7a, 0x6f, 0xb1, + 0x15, 0x2f, 0x25, 0xf9, 0xa5, 0xd1, 0x35, 0xea, 0x27, 0x92, 0x3c, 0xfd, + 0xc4, 0x0f, 0xa6, 0x77, 0xe9, 0x47, 0xf2, 0x4b, 0x7f, 0x37, 0x59, 0xfd, + 0x70, 0x79, 0x6b, 0xff, 0xc6, 0x68, 0xe8, 0xe9, 0x27, 0x7e, 0x30, 0x4f, + 0xfe, 0xdc, 0xa7, 0x92, 0xff, 0xf6, 0xc1, 0xe4, 0xf6, 0x61, 0x78, 0x85, + 0xef, 0x7d, 0x70, 0x18, 0x8a, 0x26, 0xc9, 0xef, 0x3c, 0x97, 0xf5, 0x0c, + 0x03, 0x6a, 0x7d, 0xf5, 0xc5, 0xe4, 0xcd, 0xd2, 0x87, 0x52, 0x6f, 0x6c, + 0x24, 0xdf, 0xb6, 0xf7, 0xc3, 0x8f, 0x45, 0xb7, 0xba, 0xd2, 0xc9, 0xf2, + 0x4a, 0x37, 0xeb, 0x97, 0xc7, 0x7f, 0x86, 0xbe, 0x08, 0xda, 0x06, 0xcb, + 0x98, 0xa5, 0x7c, 0xdb, 0xb2, 0xdb, 0xa5, 0x7f, 0x27, 0x05, 0xd6, 0x9a, + 0xa7, 0x72, 0xd0, 0xa8, 0xe2, 0x88, 0xaa, 0xeb, 0x57, 0xeb, 0xf2, 0xfa, + 0x0d, 0xf9, 0xd5, 0x60, 0x54, 0xc5, 0xe7, 0x6f, 0xa7, 0x27, 0x8c, 0x17, + 0x75, 0xf4, 0x2b, 0xe3, 0xe3, 0xda, 0xda, 0x34, 0xff, 0x6a, 0x7b, 0xc7, + 0x95, 0xfd, 0xff, 0xd9, 0x7b, 0xfb, 0x20, 0x39, 0xce, 0xfb, 0xbe, 0xf3, + 0x43, 0xbb, 0x6d, 0x3e, 0x63, 0x0d, 0xa8, 0x9e, 0xca, 0xaa, 0x6e, 0x06, + 0x2f, 0xca, 0x8c, 0xb2, 0x10, 0x30, 0x3c, 0x31, 0xe2, 0xc2, 0x64, 0x85, + 0xbb, 0x47, 0xc5, 0x8b, 0x15, 0xad, 0x02, 0x10, 0x2a, 0x65, 0x81, 0x92, + 0xcb, 0x04, 0xf9, 0xc7, 0x9a, 0xa4, 0xae, 0xa2, 0x10, 0x64, 0x7c, 0x26, + 0x75, 0xae, 0x44, 0x64, 0x04, 0x9b, 0x52, 0xa5, 0x72, 0x36, 0x93, 0x98, + 0x24, 0xa2, 0xab, 0x88, 0x04, 0xf7, 0xca, 0x12, 0xe8, 0x8a, 0x4c, 0xf0, + 0x12, 0x51, 0x00, 0x4e, 0xa2, 0x16, 0xab, 0x13, 0x83, 0x65, 0x15, 0x68, + 0x2c, 0x15, 0xd2, 0x1c, 0x40, 0xd8, 0xd3, 0xb4, 0x84, 0x97, 0x19, 0x87, + 0x9b, 0x4c, 0x0b, 0x98, 0x64, 0x1e, 0xca, 0x6d, 0xf1, 0xfe, 0x78, 0x9e, + 0xa7, 0xfb, 0xe9, 0x9e, 0xee, 0xd9, 0xd9, 0xc5, 0x0b, 0x21, 0xab, 0xbf, + 0xa8, 0x45, 0x77, 0x3f, 0xcf, 0xef, 0xf9, 0x3d, 0x2f, 0x3d, 0xfd, 0x74, + 0xf7, 0xd3, 0xfd, 0x7c, 0x3a, 0xe9, 0xef, 0x67, 0xbd, 0x2e, 0xcb, 0xa9, + 0xb6, 0xb9, 0x4e, 0xf3, 0xc4, 0x02, 0x42, 0x9f, 0xd5, 0xdc, 0xd1, 0x1a, + 0xbe, 0x75, 0x61, 0x21, 0x3f, 0x5d, 0x67, 0x6c, 0x61, 0x21, 0x36, 0xbe, + 0x20, 0x1c, 0xc1, 0xd8, 0xd6, 0x29, 0x1a, 0xc7, 0x8e, 0x2a, 0x9b, 0x0c, + 0xd8, 0xd3, 0xb0, 0x10, 0xad, 0x64, 0xbc, 0x0d, 0x96, 0x32, 0xdb, 0xa5, + 0x92, 0x3a, 0x12, 0xe4, 0x05, 0x49, 0xa9, 0x54, 0x0a, 0x61, 0x2d, 0x76, + 0x9a, 0x2c, 0x1b, 0xb3, 0x3e, 0x08, 0x74, 0x65, 0xdb, 0x18, 0xa5, 0x81, + 0xbe, 0xd2, 0x20, 0x5a, 0x46, 0x06, 0x34, 0x23, 0x10, 0xb1, 0x32, 0xac, + 0x04, 0xb2, 0x95, 0xcc, 0x5f, 0x14, 0x45, 0x1f, 0x50, 0x2b, 0x09, 0x2f, + 0xbb, 0xd2, 0x5a, 0x5b, 0xbc, 0xe6, 0x8a, 0xe7, 0xb9, 0x12, 0xfd, 0x97, + 0xff, 0xf6, 0x0e, 0x27, 0xfe, 0xf8, 0xa7, 0xef, 0x76, 0x31, 0x32, 0xf5, + 0xff, 0x7e, 0xfe, 0xaf, 0x2f, 0x9b, 0xef, 0xe5, 0x00, 0x4e, 0x97, 0x02, + 0xf0, 0x74, 0xa9, 0x81, 0x5a, 0xab, 0x2d, 0x53, 0x5a, 0xba, 0x2d, 0x96, + 0xdf, 0x41, 0x76, 0xb6, 0xd2, 0x50, 0x37, 0x36, 0x48, 0x2b, 0xeb, 0x9c, + 0x3d, 0x4c, 0xb9, 0x2f, 0x27, 0x50, 0x2b, 0xd7, 0xcf, 0xb3, 0xd4, 0x79, + 0xa2, 0xbd, 0xa4, 0x40, 0x59, 0x00, 0xfe, 0x92, 0x0d, 0xb5, 0x52, 0xe7, + 0x05, 0x5f, 0x1e, 0xc1, 0xb7, 0x2e, 0xc9, 0x15, 0xdc, 0xe9, 0x00, 0xc2, + 0x19, 0x43, 0x76, 0xa3, 0x7b, 0x35, 0xe1, 0x54, 0x90, 0xc1, 0x4a, 0xc7, + 0xf1, 0xf4, 0xb8, 0x92, 0xb5, 0xed, 0x8a, 0x0a, 0xbe, 0xcc, 0x82, 0xb6, + 0x19, 0x70, 0x7d, 0xcf, 0x7a, 0x66, 0x81, 0x1a, 0x83, 0xb5, 0x3e, 0xec, + 0x20, 0x11, 0x0a, 0xae, 0x65, 0x3e, 0x92, 0x91, 0xf6, 0x4c, 0x23, 0x00, + 0x5f, 0xfa, 0xb8, 0x22, 0x09, 0x82, 0xaf, 0xc4, 0xd6, 0xa3, 0xf2, 0x55, + 0x62, 0x65, 0x75, 0x85, 0x3a, 0xc2, 0xbd, 0x33, 0xfb, 0xa9, 0xae, 0xbf, + 0x07, 0xef, 0xcc, 0x3e, 0xdc, 0x40, 0xdd, 0x87, 0xfa, 0x72, 0x9e, 0x72, + 0x71, 0xc7, 0x0a, 0xeb, 0x3e, 0x58, 0xb2, 0xdb, 0xa1, 0x5c, 0xac, 0xd1, + 0xee, 0x7a, 0x43, 0xd9, 0xcf, 0xcc, 0xc0, 0xe4, 0x64, 0x95, 0xb9, 0x2a, + 0x30, 0xe3, 0x45, 0xa0, 0x29, 0x1d, 0x37, 0x3d, 0x1d, 0xc1, 0x9d, 0x20, + 0x82, 0x61, 0x19, 0x70, 0x96, 0x82, 0x43, 0x55, 0xf1, 0x3c, 0x8f, 0xaa, + 0x06, 0x6e, 0x45, 0xf0, 0x29, 0x6d, 0xa3, 0xa1, 0x12, 0xd5, 0x2a, 0xcc, + 0xe1, 0x31, 0x3d, 0x1d, 0x85, 0x79, 0x78, 0xcc, 0x79, 0x1e, 0x7b, 0xaa, + 0xd5, 0x10, 0x96, 0x65, 0xa0, 0x51, 0x06, 0xdd, 0x35, 0x03, 0xb0, 0x07, + 0xa6, 0xf7, 0x2c, 0x5f, 0x27, 0x05, 0xb1, 0xea, 0x57, 0xe8, 0x6b, 0x8f, + 0x06, 0x80, 0x55, 0xad, 0xb0, 0x19, 0x62, 0xd0, 0x2b, 0x80, 0xe9, 0x69, + 0x53, 0xff, 0xa8, 0xac, 0xd3, 0xd3, 0x91, 0xe7, 0xe9, 0x3d, 0x0a, 0x0e, + 0x86, 0xa7, 0xe0, 0x5c, 0x7b, 0x66, 0xbc, 0x70, 0xdd, 0xc3, 0x0b, 0xe1, + 0x64, 0x1e, 0x5e, 0x08, 0xec, 0x0a, 0xcb, 0xe2, 0x79, 0x21, 0x9c, 0x6c, + 0xda, 0x0e, 0xc7, 0x53, 0x6d, 0xa9, 0xd3, 0x9b, 0x7d, 0x61, 0xc2, 0xf7, + 0xc4, 0xda, 0x49, 0xc1, 0xcc, 0x3c, 0x5d, 0xe7, 0x61, 0x70, 0x17, 0x52, + 0x4a, 0x7c, 0x3f, 0xfd, 0xbe, 0xd9, 0xf7, 0xdb, 0xb8, 0x6e, 0x39, 0xf6, + 0xec, 0xcf, 0xac, 0x9b, 0x6d, 0x5f, 0x7f, 0x4c, 0x48, 0x3a, 0xa2, 0x0f, + 0xac, 0x95, 0xcc, 0xe7, 0x6a, 0x94, 0x94, 0x56, 0x99, 0xfb, 0x9e, 0x2f, + 0x86, 0x6b, 0x17, 0x9f, 0x4f, 0xd6, 0x47, 0x77, 0x12, 0x65, 0x59, 0x6e, + 0xfc, 0x7e, 0xb5, 0x7a, 0x48, 0xb8, 0xdc, 0x17, 0xc8, 0xbe, 0xb1, 0xfd, + 0xa7, 0x80, 0xdd, 0x7a, 0x7d, 0x8b, 0x03, 0xc7, 0x03, 0x15, 0xb6, 0xcf, + 0x51, 0x80, 0x2b, 0x13, 0xff, 0xd4, 0x17, 0x2b, 0xec, 0xfe, 0x9c, 0xba, + 0xa2, 0xd8, 0xe1, 0x68, 0x10, 0x96, 0x50, 0xf7, 0x13, 0xbb, 0x03, 0xd8, + 0xeb, 0x14, 0x68, 0xe8, 0xf6, 0xaa, 0x3b, 0xd0, 0x08, 0x22, 0xbf, 0x8f, + 0xfc, 0x41, 0x9b, 0x31, 0x5d, 0xf7, 0xdd, 0x81, 0x8a, 0x07, 0x05, 0xf5, + 0x32, 0x30, 0x2d, 0x80, 0x31, 0x47, 0x87, 0xe9, 0xbc, 0x01, 0x1a, 0x8e, + 0x20, 0xd6, 0x1b, 0x26, 0x9f, 0xa3, 0x4a, 0xfd, 0x3c, 0x4c, 0xc4, 0x1f, + 0x43, 0xda, 0x1f, 0x25, 0x59, 0x8d, 0xd4, 0x47, 0x6c, 0x74, 0x16, 0x29, + 0xcf, 0x6e, 0x0b, 0x14, 0x68, 0xd3, 0x01, 0xa2, 0x0f, 0xc3, 0xf4, 0x64, + 0x4f, 0x5f, 0x53, 0xf6, 0x42, 0xd0, 0x56, 0xdf, 0x73, 0xf1, 0x04, 0x58, + 0xab, 0xef, 0xb8, 0x08, 0x8f, 0x23, 0xa2, 0xf3, 0x52, 0x20, 0xd5, 0xf1, + 0x75, 0x95, 0x6a, 0x76, 0x76, 0x16, 0x50, 0x40, 0x29, 0xa3, 0x73, 0xe7, + 0x2f, 0xb0, 0x16, 0x0d, 0xaa, 0x02, 0x36, 0x7d, 0x30, 0x82, 0x6d, 0x01, + 0x7d, 0x60, 0xab, 0x73, 0xe7, 0x2f, 0x30, 0x35, 0x35, 0xc5, 0xec, 0xec, + 0x6c, 0x0c, 0x58, 0x65, 0x03, 0xa8, 0x4c, 0xda, 0xcb, 0xe1, 0x73, 0x4d, + 0x65, 0x2d, 0x67, 0xcf, 0x9e, 0x65, 0x4d, 0x65, 0x6d, 0xac, 0x3e, 0x6b, + 0x2a, 0x6b, 0xd9, 0xa4, 0x4f, 0xeb, 0x27, 0x5e, 0x3d, 0xc6, 0x9a, 0xca, + 0x5a, 0xd6, 0xad, 0x5b, 0xa7, 0xd2, 0x68, 0x90, 0xd8, 0x05, 0x0d, 0xe0, + 0x32, 0x7e, 0xec, 0xb0, 0x75, 0xeb, 0xd6, 0x85, 0xc0, 0x2f, 0x03, 0xd6, + 0x32, 0xe5, 0x34, 0xe0, 0xad, 0x13, 0xaf, 0x1e, 0x0b, 0xeb, 0x84, 0x86, + 0x6b, 0x99, 0x32, 0xf0, 0xde, 0x78, 0x9d, 0x96, 0x53, 0xd9, 0x15, 0x78, + 0x6d, 0x49, 0xd9, 0x15, 0xb4, 0x96, 0xfc, 0xb0, 0x4f, 0x31, 0xc0, 0x2c, + 0xdf, 0x7a, 0x26, 0xee, 0xb5, 0x7d, 0x76, 0x4c, 0x8e, 0xf3, 0xe6, 0x89, + 0xc6, 0xc0, 0x7e, 0xc7, 0xf6, 0x05, 0xe9, 0xf0, 0xad, 0x61, 0x7d, 0x01, + 0x7d, 0xbe, 0xec, 0x91, 0xaa, 0xad, 0x23, 0x75, 0xf6, 0xbd, 0xda, 0xe0, + 0xc5, 0xbd, 0x8f, 0x71, 0xe0, 0xd9, 0x67, 0x42, 0x10, 0x55, 0x96, 0xbc, + 0xd7, 0xe6, 0xb9, 0xe7, 0xd6, 0x2a, 0xfb, 0x5e, 0xf6, 0xe2, 0x20, 0x2c, + 0xa9, 0x7d, 0xbd, 0xdc, 0x60, 0x4b, 0x7d, 0x3e, 0xf4, 0x8d, 0x3e, 0x56, + 0xb7, 0xd4, 0xaf, 0x67, 0xdf, 0xcb, 0x5e, 0xa6, 0xaf, 0x24, 0xe8, 0x2a, + 0xe6, 0x4b, 0xc2, 0xed, 0xf7, 0x3f, 0xca, 0x3d, 0xb7, 0x56, 0x33, 0x7d, + 0x21, 0x88, 0xfb, 0x6a, 0xbc, 0xc9, 0x1d, 0x9f, 0xa8, 0x71, 0x7c, 0xe1, + 0xcd, 0xd0, 0x97, 0xf8, 0x88, 0x6a, 0x83, 0xdb, 0xef, 0x7f, 0x94, 0x6a, + 0xb5, 0x1a, 0xde, 0x3f, 0xa6, 0xa9, 0xe2, 0xd4, 0x68, 0x05, 0xcd, 0x81, + 0xeb, 0x66, 0x1b, 0x88, 0x85, 0x65, 0xf9, 0xcb, 0xb2, 0x5b, 0xce, 0x87, + 0x01, 0x6a, 0x99, 0xf5, 0xf9, 0xef, 0xc4, 0xe3, 0x17, 0xfe, 0xe2, 0x6a, + 0xff, 0xdc, 0xc2, 0xc5, 0xe9, 0xf4, 0x85, 0x97, 0xb9, 0xee, 0xda, 0x75, + 0x9c, 0x7f, 0xfb, 0x2c, 0xd7, 0x5d, 0xbb, 0x2e, 0x84, 0x65, 0xd9, 0xa0, + 0x2d, 0x5b, 0x31, 0xa0, 0x56, 0xae, 0x5c, 0xb9, 0x72, 0xe5, 0xca, 0x95, + 0x2b, 0x57, 0xae, 0x5c, 0xb9, 0x72, 0xe5, 0xca, 0x95, 0x2b, 0x57, 0xae, + 0x5c, 0xb9, 0x72, 0xe5, 0xca, 0x95, 0x2b, 0x57, 0xae, 0x5c, 0xb9, 0x72, + 0xe5, 0xba, 0x68, 0xe5, 0x50, 0xad, 0x5c, 0xb9, 0x72, 0xe5, 0xca, 0x95, + 0xeb, 0x2a, 0x90, 0x0d, 0xe8, 0x91, 0x0e, 0x84, 0x2f, 0x5a, 0x9b, 0x97, + 0xca, 0xa5, 0xa4, 0xfe, 0xa1, 0xb1, 0x18, 0x50, 0x0b, 0xa0, 0x52, 0x74, + 0xe9, 0xa0, 0xbe, 0xc8, 0x2e, 0x03, 0x89, 0xb4, 0xbe, 0x10, 0x9a, 0x06, + 0xa1, 0xb2, 0x21, 0x55, 0xa9, 0xe5, 0xb0, 0xbf, 0xa8, 0x6c, 0x4d, 0x36, + 0x1d, 0x06, 0xba, 0x95, 0xcc, 0xc3, 0x86, 0x69, 0xd9, 0x70, 0xaf, 0x64, + 0xfe, 0x31, 0xa0, 0x4b, 0x4a, 0x3e, 0xc9, 0x32, 0xd8, 0x80, 0x30, 0xdb, + 0x8f, 0xfd, 0x62, 0x7e, 0x96, 0xec, 0x38, 0x03, 0xe1, 0xb2, 0xcb, 0x98, + 0x95, 0x97, 0xef, 0x27, 0x21, 0x3e, 0x32, 0x06, 0x2e, 0xbb, 0x94, 0x2f, + 0xf5, 0xcb, 0xae, 0x8c, 0xbd, 0x20, 0x9f, 0xf5, 0xc2, 0xbc, 0x79, 0x19, + 0x5b, 0x14, 0x15, 0x02, 0x29, 0x09, 0x79, 0xea, 0x4b, 0x27, 0x65, 0x1c, + 0x22, 0x25, 0xe5, 0x60, 0x18, 0x97, 0xb5, 0xff, 0x64, 0x90, 0x88, 0x4b, + 0x2b, 0x77, 0x00, 0x24, 0xec, 0xb3, 0xfc, 0xc6, 0xd2, 0x25, 0xea, 0xbb, + 0x9c, 0x56, 0x03, 0xb3, 0x4a, 0x2b, 0x0f, 0x80, 0x48, 0xdb, 0x6f, 0x43, + 0x4c, 0x3c, 0x58, 0x69, 0x99, 0x05, 0x82, 0x4a, 0x20, 0x43, 0x68, 0x56, + 0xaa, 0x8d, 0x63, 0xdb, 0xc7, 0x55, 0x0a, 0x40, 0x3a, 0x0a, 0x76, 0xd5, + 0x71, 0xd4, 0x36, 0x8e, 0xaa, 0x57, 0x09, 0x62, 0x57, 0xf4, 0x11, 0x80, + 0x4b, 0x4d, 0x75, 0x6f, 0x38, 0x2e, 0x13, 0x42, 0xd2, 0x91, 0x50, 0x26, + 0x02, 0x75, 0x81, 0x9a, 0x88, 0x26, 0x64, 0x8b, 0x72, 0x4a, 0xb9, 0xc6, + 0x8b, 0x92, 0x23, 0x23, 0x63, 0x6c, 0x5d, 0x6a, 0x50, 0x1e, 0xa9, 0xd1, + 0x5e, 0x6a, 0x22, 0xfa, 0x26, 0x7a, 0x45, 0x92, 0x68, 0xd0, 0x5c, 0xd1, + 0x3e, 0xc6, 0xb2, 0xed, 0xb3, 0x6c, 0xa4, 0x6c, 0x23, 0xc4, 0x60, 0x5c, + 0x8c, 0x94, 0x7e, 0xaa, 0x8d, 0x24, 0x7d, 0x32, 0xd8, 0x72, 0xfe, 0xb2, + 0xec, 0xec, 0x7c, 0xae, 0x86, 0x69, 0x3b, 0x21, 0x00, 0xf0, 0x12, 0x4e, + 0x8e, 0x49, 0x03, 0x0f, 0xda, 0x13, 0x9d, 0x92, 0x71, 0xc9, 0x34, 0xa9, + 0x76, 0x09, 0x08, 0x41, 0x72, 0xbd, 0xaf, 0x0c, 0xd6, 0xa4, 0x7a, 0xd9, + 0x95, 0xf1, 0xf3, 0x61, 0x4a, 0x1a, 0xe1, 0xba, 0x91, 0x9d, 0x39, 0xb7, + 0xd8, 0x69, 0x32, 0x26, 0x05, 0x9a, 0xf0, 0x10, 0xc6, 0xa5, 0xd7, 0xfd, + 0xa5, 0xd5, 0x01, 0x53, 0x0c, 0x4c, 0xcb, 0x40, 0xb0, 0x1e, 0x78, 0xf0, + 0x41, 0x9e, 0x7c, 0xe2, 0x89, 0x10, 0xa4, 0x65, 0xc3, 0xb6, 0x9e, 0x78, + 0xe0, 0x01, 0x76, 0x68, 0x38, 0x96, 0xd1, 0xe8, 0xc6, 0x8d, 0x21, 0x4c, + 0xcb, 0xf6, 0xf9, 0x40, 0xc2, 0xee, 0xc9, 0x27, 0x9e, 0xe0, 0x81, 0x07, + 0x1f, 0x54, 0x40, 0xad, 0x44, 0xdc, 0x40, 0x3d, 0xf1, 0x44, 0x58, 0x3e, + 0x3b, 0xcf, 0x4b, 0x25, 0x1b, 0xa6, 0xb5, 0x98, 0xd8, 0xde, 0x46, 0x1c, + 0x8e, 0x65, 0xaf, 0x1b, 0xbb, 0xa7, 0x58, 0x64, 0x94, 0xc5, 0x30, 0xce, + 0x00, 0xb5, 0x46, 0x13, 0xdb, 0x17, 0x03, 0xd9, 0x7a, 0xe2, 0x81, 0x07, + 0x38, 0xb4, 0xb8, 0xd8, 0x07, 0x23, 0x33, 0x6d, 0x32, 0xec, 0x91, 0xf4, + 0x67, 0xff, 0xfe, 0xcf, 0xf8, 0xe4, 0x6f, 0x46, 0x10, 0xad, 0x4f, 0xfe, + 0xe6, 0x27, 0x79, 0xf1, 0x3f, 0xbe, 0xc8, 0xed, 0xff, 0xf0, 0xf6, 0x8b, + 0x28, 0x1d, 0x99, 0x65, 0xb8, 0x92, 0xd3, 0x9c, 0xc4, 0x80, 0xfc, 0xb2, + 0xa0, 0x28, 0x46, 0x3b, 0x6e, 0xdb, 0xca, 0xc1, 0x97, 0x8e, 0x84, 0x40, + 0xae, 0x9f, 0x0d, 0x0c, 0x61, 0xb6, 0xc6, 0x69, 0xc3, 0x2d, 0x53, 0x51, + 0xc0, 0x2b, 0x6a, 0x02, 0xd2, 0xb8, 0x0e, 0x9b, 0x7f, 0xe5, 0x4d, 0x76, + 0xe0, 0xd3, 0x9b, 0x8c, 0x6c, 0x0a, 0x73, 0xca, 0xa6, 0x37, 0x39, 0xc5, + 0x56, 0x09, 0xac, 0x2f, 0x73, 0x64, 0x49, 0xb2, 0xe3, 0xbb, 0x07, 0xe1, + 0xd7, 0xef, 0x50, 0x46, 0x87, 0x66, 0x43, 0xfb, 0x9d, 0x1f, 0x19, 0xe7, + 0x40, 0xb3, 0xcd, 0xc1, 0x63, 0x65, 0x76, 0x9e, 0x90, 0x1c, 0xfd, 0x44, + 0x99, 0x2d, 0xec, 0x40, 0xfc, 0xc9, 0xfe, 0x28, 0xdf, 0x07, 0xee, 0xe7, + 0xe8, 0xc8, 0x41, 0xda, 0x12, 0x10, 0x05, 0x76, 0x9e, 0x69, 0xc2, 0x6f, + 0xec, 0x54, 0x71, 0xff, 0xf7, 0x81, 0xc8, 0xee, 0x37, 0x76, 0x02, 0x2d, + 0xca, 0xe3, 0x2e, 0xfe, 0x82, 0x9f, 0xb8, 0x2e, 0xb9, 0x2f, 0x56, 0xb7, + 0x7d, 0x2f, 0x55, 0xd9, 0xf9, 0xa0, 0x4f, 0xfb, 0x58, 0xb4, 0x97, 0x0a, + 0x45, 0x80, 0xbb, 0x63, 0x36, 0x00, 0x3c, 0x3b, 0x0b, 0x8f, 0xde, 0xd5, + 0x3f, 0x91, 0x75, 0xd0, 0x7d, 0x80, 0x53, 0x80, 0x96, 0x81, 0x87, 0xe9, + 0x89, 0x1e, 0x37, 0x8f, 0xc3, 0x47, 0xa6, 0xe2, 0x36, 0xb9, 0x72, 0x5d, + 0x85, 0x4a, 0xc2, 0xa1, 0x86, 0x51, 0x12, 0x46, 0x05, 0x6a, 0x9a, 0x5e, + 0x61, 0xc0, 0x76, 0x81, 0xec, 0xa9, 0x7c, 0x97, 0xaa, 0xdf, 0xff, 0xb9, + 0xad, 0xcb, 0x9d, 0x63, 0xdc, 0xa3, 0xe1, 0xa9, 0x5b, 0xb7, 0x96, 0x29, + 0x14, 0x23, 0x7c, 0xdb, 0xf1, 0x63, 0x92, 0xda, 0xd8, 0x04, 0x00, 0x8d, + 0xf9, 0xaf, 0x46, 0xb0, 0x2e, 0x03, 0xc7, 0x2e, 0x0a, 0x16, 0x8e, 0xcc, + 0xc6, 0xee, 0x61, 0x4a, 0xa5, 0x12, 0xad, 0x6e, 0x34, 0xc9, 0x53, 0x14, + 0x45, 0x1f, 0x20, 0x6b, 0xa8, 0x3a, 0xac, 0x11, 0x70, 0x21, 0xda, 0xde, + 0x75, 0xe7, 0x2e, 0xf6, 0x3f, 0xb7, 0x3f, 0xdd, 0x0e, 0xe0, 0xc2, 0x60, + 0x1b, 0x79, 0x41, 0x22, 0x2f, 0xc8, 0x70, 0xdd, 0x40, 0xab, 0x92, 0xf9, + 0xf4, 0xf9, 0xd5, 0xbe, 0x8d, 0x9d, 0x9d, 0x5f, 0x9f, 0xdd, 0x10, 0xf5, + 0xc9, 0xca, 0xcf, 0x56, 0xa5, 0x52, 0xc3, 0x7f, 0x2b, 0x7e, 0x8d, 0x5d, + 0x70, 0x0a, 0x88, 0x8d, 0x3b, 0xe8, 0x34, 0x9e, 0x57, 0xfe, 0xde, 0x05, + 0x88, 0x56, 0x52, 0x17, 0xba, 0xef, 0x5c, 0x54, 0xfa, 0xcb, 0x59, 0x83, + 0x70, 0xf8, 0xe4, 0x32, 0xe6, 0x71, 0xb1, 0xba, 0x9a, 0xcb, 0x76, 0x29, + 0xb4, 0x12, 0x90, 0xd4, 0xa5, 0x86, 0x4e, 0xd9, 0xfe, 0x92, 0x30, 0xac, + 0x95, 0x96, 0xeb, 0x6a, 0x07, 0x62, 0x15, 0x32, 0x7e, 0x48, 0xb3, 0xdf, + 0xf5, 0x99, 0xfa, 0x88, 0x4b, 0x09, 0x58, 0x78, 0x41, 0x46, 0x70, 0x59, + 0xc0, 0x3b, 0xa5, 0x26, 0xb7, 0x0f, 0xdb, 0x7f, 0x01, 0x8c, 0x6d, 0x2e, + 0xe3, 0x8f, 0x83, 0xfb, 0xdd, 0x06, 0x7e, 0xa5, 0xbe, 0x7c, 0x02, 0x4b, + 0x59, 0xf9, 0x18, 0xe0, 0xe1, 0xa5, 0x52, 0x5a, 0x3e, 0xab, 0xcd, 0x23, + 0xd9, 0xae, 0xbd, 0x15, 0xba, 0x11, 0x4e, 0x01, 0x69, 0x9d, 0xf7, 0xea, + 0x1b, 0x6b, 0x34, 0x4e, 0x5d, 0xba, 0x09, 0xdd, 0x92, 0x0e, 0xb2, 0x6b, + 0x43, 0xd1, 0x17, 0xfa, 0x6d, 0x02, 0x1f, 0x37, 0x39, 0x9e, 0xe7, 0x94, + 0xf1, 0xda, 0x0d, 0x60, 0x2b, 0x32, 0x68, 0x22, 0x8a, 0x35, 0x3d, 0xbe, + 0xdd, 0xa2, 0x5c, 0xbc, 0x9e, 0x76, 0x37, 0xe9, 0xa3, 0x83, 0x70, 0x4a, + 0x89, 0xf5, 0x2a, 0x0a, 0x19, 0xa4, 0x40, 0x0b, 0xc2, 0x2d, 0x23, 0x97, + 0x3a, 0xf8, 0xd2, 0xa7, 0xbe, 0x7e, 0x8a, 0xd6, 0x52, 0x83, 0xe5, 0xa4, + 0x40, 0x5a, 0x1a, 0x98, 0xe2, 0xe8, 0xeb, 0x16, 0x07, 0xd0, 0xed, 0x26, + 0x28, 0xa8, 0x71, 0x5b, 0x87, 0x58, 0x3b, 0xc6, 0xeb, 0xd2, 0x81, 0x20, + 0x1d, 0x39, 0x6b, 0x97, 0xbb, 0x34, 0xe2, 0xd2, 0x6a, 0x2b, 0x78, 0x58, + 0xc9, 0x75, 0x69, 0x2d, 0x75, 0xf0, 0x65, 0x9b, 0x72, 0xb1, 0x8e, 0x0c, + 0x54, 0xb8, 0x77, 0x66, 0x1f, 0x40, 0x0c, 0x06, 0x66, 0xfb, 0xc8, 0x92, + 0x70, 0x5d, 0xc4, 0x52, 0x27, 0xf3, 0x9a, 0xcb, 0x97, 0x12, 0x57, 0x23, + 0x72, 0x15, 0x00, 0x6c, 0xb8, 0xf1, 0x55, 0xcd, 0xc5, 0xa2, 0x5a, 0xf5, + 0x98, 0x06, 0xaa, 0xd3, 0xd5, 0x10, 0x34, 0x05, 0xe0, 0xcd, 0xc1, 0x9e, + 0x39, 0xb5, 0x3e, 0x3d, 0xa9, 0x97, 0x7b, 0x54, 0xba, 0xb9, 0x39, 0x05, + 0x9c, 0xf2, 0x3c, 0x42, 0x90, 0x56, 0x66, 0x3e, 0xc6, 0xa7, 0xb5, 0x88, + 0xd2, 0x54, 0x01, 0x8f, 0x3d, 0x1a, 0x98, 0x35, 0x09, 0xcc, 0x68, 0x5f, + 0x7b, 0xa6, 0x61, 0xce, 0x83, 0xe9, 0x2a, 0xb0, 0x87, 0x10, 0x38, 0xf5, + 0x8f, 0xa6, 0x23, 0xdf, 0x66, 0xb4, 0xda, 0x94, 0xcf, 0x03, 0x66, 0xe6, + 0x60, 0x31, 0xd8, 0xcd, 0x6d, 0xb7, 0x3d, 0xa5, 0xe0, 0x58, 0x54, 0x79, + 0xe9, 0xee, 0xa7, 0xf8, 0xca, 0x57, 0x6e, 0x57, 0x40, 0x2d, 0x60, 0xcf, + 0x74, 0x95, 0x39, 0xdd, 0x00, 0x93, 0x93, 0x30, 0x07, 0x4c, 0xeb, 0x36, + 0x49, 0x03, 0x5e, 0xcd, 0x79, 0x5e, 0x98, 0x07, 0xc0, 0xdc, 0x8c, 0x2a, + 0xfa, 0xf4, 0x1e, 0x55, 0x97, 0xc9, 0x49, 0xd5, 0x26, 0x9e, 0x31, 0xd0, + 0x75, 0xf0, 0xbc, 0x38, 0x50, 0x6b, 0x66, 0x8f, 0xaa, 0xe3, 0x1c, 0x9e, + 0xae, 0x53, 0xd4, 0x46, 0x9e, 0x07, 0x33, 0x78, 0x4c, 0xa2, 0x0a, 0xe3, + 0x45, 0xc9, 0x54, 0x1e, 0x00, 0x33, 0xaa, 0x41, 0x4c, 0x5b, 0xac, 0x44, + 0x59, 0x40, 0xad, 0x64, 0x7c, 0x72, 0x5c, 0xdb, 0x7e, 0xde, 0x94, 0x7c, + 0x76, 0x13, 0x7e, 0x7c, 0x27, 0x65, 0x1c, 0x7c, 0x18, 0xb8, 0xd4, 0x95, + 0x54, 0xd6, 0x47, 0x39, 0x54, 0xff, 0xa0, 0x01, 0x47, 0x98, 0xf1, 0x74, + 0x53, 0x17, 0xf3, 0x91, 0xa1, 0xe1, 0x46, 0xd2, 0xb2, 0x9e, 0x6d, 0x65, + 0x97, 0xe9, 0xd2, 0x3f, 0xc9, 0xb8, 0x4f, 0xd7, 0x63, 0x8c, 0x08, 0x5c, + 0x05, 0xb0, 0x3b, 0x28, 0x80, 0xe8, 0x85, 0xf0, 0xac, 0x2d, 0x68, 0xa0, + 0x55, 0x00, 0x15, 0x01, 0xbb, 0xf5, 0x0d, 0xe7, 0xee, 0xc7, 0x5a, 0x54, + 0x04, 0x7c, 0x4e, 0xaa, 0xf8, 0x92, 0x03, 0x9f, 0xa5, 0x10, 0x82, 0x9f, + 0x1a, 0x41, 0x04, 0xd3, 0x52, 0x70, 0xad, 0xe8, 0x2e, 0xb4, 0xa2, 0xf3, + 0x84, 0x08, 0x98, 0xf5, 0x94, 0x03, 0x8f, 0xa0, 0x80, 0x5a, 0x4f, 0xfd, + 0x41, 0x99, 0xdd, 0xff, 0xbc, 0x1d, 0x8b, 0x07, 0xa8, 0x39, 0xd0, 0xd7, + 0xa3, 0x5b, 0xb0, 0x29, 0x50, 0x8f, 0x02, 0x45, 0x00, 0x7e, 0xa2, 0xc9, + 0x0c, 0xe8, 0x0a, 0xa0, 0xe0, 0x48, 0x7a, 0xc1, 0x30, 0xd7, 0x1c, 0xd1, + 0xdd, 0x75, 0xc7, 0x81, 0x42, 0xd0, 0x01, 0xa7, 0x44, 0x4f, 0x46, 0xe7, + 0xe5, 0x9e, 0xbe, 0x93, 0x2e, 0x05, 0xd0, 0x09, 0x44, 0xac, 0x2c, 0x05, + 0x47, 0xe2, 0x3b, 0x25, 0x90, 0x3d, 0xc6, 0x44, 0x8f, 0x05, 0x0a, 0xcb, + 0x3e, 0x93, 0x17, 0x42, 0x50, 0x40, 0xd2, 0x43, 0x7f, 0xd8, 0x24, 0xf1, + 0x6c, 0x67, 0x35, 0x40, 0xad, 0x9b, 0xff, 0xaa, 0x70, 0x45, 0x97, 0x9b, + 0x36, 0x6d, 0x0a, 0xf3, 0xbe, 0xd0, 0x3a, 0x17, 0xc2, 0xa2, 0xce, 0x9d, + 0xbf, 0x10, 0x82, 0xa7, 0xd6, 0x54, 0xd6, 0xc6, 0xa0, 0x58, 0x67, 0xcf, + 0x9e, 0x65, 0xdd, 0xba, 0x75, 0x21, 0x80, 0x6a, 0xed, 0x75, 0x6b, 0x38, + 0xa1, 0x81, 0x52, 0x6b, 0x2a, 0x6b, 0xe1, 0xfc, 0xc9, 0x70, 0xdd, 0xc4, + 0x1b, 0x10, 0xd6, 0xe5, 0xf0, 0x69, 0xc0, 0x59, 0x26, 0x3c, 0x4c, 0x83, + 0x02, 0x63, 0x19, 0x3f, 0x17, 0x5a, 0xe7, 0x98, 0xd5, 0x70, 0x2c, 0xa3, + 0xcd, 0x37, 0xdd, 0x1c, 0xc6, 0x27, 0x65, 0x40, 0x5c, 0x36, 0x70, 0xcc, + 0x06, 0x6d, 0x25, 0xed, 0x42, 0xe0, 0x96, 0x2e, 0xcf, 0x37, 0xda, 0xcb, + 0xdc, 0xb8, 0x27, 0xd4, 0xf6, 0xd3, 0x9f, 0x3d, 0x36, 0x16, 0x9b, 0x94, + 0x5d, 0x15, 0x5e, 0x19, 0x71, 0xe9, 0x2c, 0xb5, 0xa8, 0x96, 0xa3, 0x6b, + 0x02, 0x37, 0x25, 0x4d, 0xd6, 0x73, 0xcc, 0xe5, 0x7c, 0xa5, 0x69, 0x90, + 0xaf, 0x8e, 0x2b, 0xd8, 0x32, 0x06, 0xd5, 0x1b, 0xc7, 0xe1, 0x85, 0x66, + 0x08, 0xab, 0xb2, 0xba, 0xdb, 0x98, 0x8e, 0x2c, 0x35, 0x34, 0x6c, 0xcb, + 0x38, 0x57, 0x8b, 0xe7, 0x5f, 0x68, 0x52, 0xab, 0xc6, 0xd3, 0x84, 0xbe, + 0x88, 0x87, 0xdb, 0xbe, 0xd2, 0x74, 0xe0, 0xb9, 0x67, 0xfa, 0x6c, 0xfb, + 0xca, 0x95, 0xd0, 0x40, 0x5f, 0x89, 0xfc, 0xef, 0xb9, 0xb5, 0x4a, 0xdb, + 0x6f, 0x52, 0xfe, 0xc8, 0x5d, 0xf0, 0xf2, 0x17, 0x29, 0x95, 0x2b, 0xf1, + 0x8f, 0x5f, 0x24, 0xd4, 0x0a, 0x9a, 0x31, 0xd8, 0x55, 0x12, 0x7c, 0x65, + 0xe0, 0x5a, 0x76, 0x9c, 0x09, 0xcf, 0x4a, 0x63, 0xc7, 0x0f, 0xd2, 0x0f, + 0x4e, 0x9d, 0xe6, 0x03, 0x1b, 0x37, 0x70, 0xa6, 0x1d, 0x3d, 0xe5, 0x9b, + 0xff, 0x8e, 0x42, 0x76, 0xda, 0x80, 0xad, 0xa4, 0x86, 0x01, 0x81, 0x0d, + 0x0b, 0x08, 0x5b, 0x29, 0x48, 0x2c, 0xcd, 0x7e, 0x58, 0xbb, 0xac, 0x3c, + 0x5a, 0x41, 0x93, 0xb7, 0xde, 0x91, 0xbc, 0xef, 0xda, 0x75, 0xbc, 0xf7, + 0x97, 0xe3, 0xed, 0x96, 0xdc, 0xb6, 0x21, 0x5a, 0x39, 0x50, 0x2b, 0x57, + 0xae, 0x5c, 0xb9, 0x72, 0xe5, 0xca, 0x95, 0x2b, 0x57, 0xae, 0x5c, 0xb9, + 0x72, 0xe5, 0xca, 0x95, 0x2b, 0x57, 0xae, 0x5c, 0xb9, 0x72, 0xe5, 0xca, + 0x95, 0x2b, 0x57, 0xae, 0x5c, 0xb9, 0x2e, 0xad, 0xae, 0xa2, 0xd7, 0xce, + 0x72, 0xe5, 0xca, 0x95, 0x2b, 0x57, 0xae, 0x9f, 0x5f, 0xc9, 0x6e, 0x07, + 0x51, 0x2c, 0xc5, 0xbf, 0x32, 0xab, 0xc1, 0x3d, 0x12, 0x52, 0x81, 0x5a, + 0x2b, 0x91, 0x0d, 0x88, 0x4a, 0x02, 0xb5, 0x4c, 0x5c, 0x32, 0xdc, 0xb6, + 0x37, 0x36, 0x6e, 0xd1, 0x8d, 0x5e, 0x6a, 0x4f, 0x84, 0x83, 0x7e, 0xb9, + 0xd1, 0x7a, 0x49, 0x57, 0x38, 0x0a, 0x5c, 0x95, 0x4c, 0x67, 0x6f, 0x9b, + 0x74, 0x83, 0x94, 0x06, 0xe3, 0x4a, 0x5b, 0xcf, 0x7a, 0xc9, 0x38, 0xf9, + 0xd2, 0x65, 0xfa, 0x0b, 0xf9, 0xfd, 0xf5, 0x52, 0x4e, 0xa1, 0x32, 0x52, + 0xe9, 0x07, 0x6b, 0x59, 0x2f, 0xc4, 0xc7, 0xbe, 0xb4, 0x3d, 0xb0, 0x26, + 0x44, 0x9f, 0x3c, 0x1e, 0x12, 0x8c, 0x63, 0x26, 0x09, 0xd8, 0x2f, 0xcf, + 0x1b, 0x90, 0x56, 0x96, 0x7d, 0xe6, 0x8b, 0xf6, 0xcb, 0x81, 0xb4, 0x12, + 0xe5, 0x32, 0x13, 0x5d, 0x6d, 0xb8, 0x56, 0x5a, 0x79, 0xd2, 0xfc, 0xc8, + 0x00, 0xbe, 0xf2, 0xe9, 0x5d, 0xdc, 0xfd, 0xe5, 0xc4, 0xa4, 0xe0, 0x04, + 0xdc, 0x6b, 0x10, 0x6c, 0x27, 0x4d, 0xc9, 0x32, 0xc5, 0xf2, 0x1d, 0x06, + 0xd8, 0x95, 0xd1, 0xee, 0xa1, 0xad, 0xfd, 0x5b, 0xbc, 0x44, 0xf0, 0x22, + 0x1b, 0x64, 0x25, 0x33, 0x7e, 0x21, 0xd2, 0xfa, 0xca, 0xf4, 0x72, 0xad, + 0x61, 0xc0, 0x59, 0xc2, 0x51, 0x13, 0x24, 0xcd, 0x44, 0x1f, 0x89, 0xa4, + 0xa2, 0x7f, 0x19, 0x65, 0xdd, 0x77, 0xc8, 0xae, 0x4f, 0xcf, 0x11, 0xd4, + 0xac, 0xbc, 0xed, 0xbc, 0xfc, 0x40, 0x85, 0x96, 0x93, 0xc7, 0x4e, 0x57, + 0xf2, 0x58, 0x77, 0x81, 0x03, 0x8e, 0xc0, 0xb7, 0x26, 0x80, 0x49, 0x99, + 0x31, 0x51, 0xa6, 0x98, 0x1e, 0x9c, 0xb4, 0x17, 0xa2, 0xac, 0xc1, 0x59, + 0xe5, 0x58, 0x5c, 0x7c, 0x5b, 0x64, 0xe7, 0x13, 0xf3, 0x9d, 0x98, 0x78, + 0x92, 0x59, 0x06, 0x05, 0xc7, 0xb2, 0x97, 0x2a, 0xcf, 0xfe, 0x30, 0x3b, + 0x3c, 0x9e, 0xcf, 0x70, 0x13, 0xc7, 0x2e, 0x87, 0x92, 0x30, 0xc0, 0xa1, + 0xec, 0x6d, 0x48, 0x9b, 0x81, 0x06, 0xd8, 0x7d, 0xa0, 0x81, 0x58, 0x0d, + 0x80, 0x67, 0x65, 0x69, 0xd8, 0x89, 0x39, 0xcb, 0xc2, 0xb1, 0x74, 0xfe, + 0x61, 0xff, 0xb2, 0x4c, 0x3f, 0x90, 0xb4, 0xef, 0xf3, 0xed, 0x88, 0x18, + 0x68, 0xcb, 0x4c, 0x5a, 0x4a, 0x42, 0xb6, 0xec, 0xed, 0x2c, 0x00, 0xd7, + 0xb0, 0xda, 0xbe, 0x7d, 0x3b, 0x68, 0x10, 0xd6, 0xa1, 0x43, 0x87, 0x38, + 0x78, 0xe8, 0x10, 0x0f, 0x3e, 0xf8, 0x60, 0x0c, 0xa8, 0x05, 0x70, 0x68, + 0x71, 0xb1, 0x0f, 0x96, 0xb5, 0x7d, 0x74, 0x94, 0x07, 0x9f, 0x7c, 0x32, + 0x16, 0x76, 0x6a, 0x51, 0xbd, 0x5c, 0x9e, 0x66, 0xcb, 0xf6, 0xed, 0xc4, + 0xbd, 0x0e, 0xd6, 0x21, 0x53, 0x86, 0xed, 0xdb, 0xd9, 0x3e, 0x3a, 0xda, + 0x07, 0xf5, 0x5a, 0x8d, 0x46, 0x33, 0xc2, 0x6d, 0x88, 0xd6, 0xb6, 0x0c, + 0xdb, 0xc5, 0xc4, 0x32, 0xb9, 0x6e, 0xa7, 0x31, 0x70, 0x2d, 0x7b, 0xb9, + 0x1a, 0x6d, 0xdc, 0xb1, 0x83, 0xc5, 0x53, 0xa7, 0xd8, 0xbe, 0x7d, 0x3b, + 0xa7, 0x16, 0x17, 0x63, 0xfb, 0xe5, 0xe0, 0x13, 0x4f, 0xb0, 0xf3, 0x4b, + 0x5f, 0x1a, 0xca, 0xcf, 0xee, 0x05, 0x05, 0xd6, 0xb2, 0x8f, 0xa1, 0xfb, + 0xd2, 0xe7, 0xba, 0x2c, 0x2b, 0x17, 0x05, 0x9f, 0x5a, 0x0e, 0x64, 0xf5, + 0xb3, 0xa0, 0xb1, 0xf1, 0x09, 0x0e, 0xbe, 0x74, 0xe4, 0xdd, 0x2e, 0xc6, + 0xa5, 0x53, 0x0a, 0x50, 0x8b, 0x5b, 0xa6, 0xd4, 0x04, 0xb5, 0xb9, 0x59, + 0xc0, 0xcd, 0x04, 0x6a, 0x85, 0x7b, 0xee, 0xb9, 0x03, 0xf0, 0xeb, 0x3b, + 0x60, 0x2c, 0xe5, 0xfb, 0xf0, 0x9f, 0xd8, 0x09, 0x4b, 0x2d, 0x76, 0x9c, + 0x68, 0x70, 0x70, 0x3d, 0xc8, 0x4f, 0xec, 0x04, 0x0e, 0x72, 0x9c, 0x83, + 0x4c, 0x18, 0x9b, 0xdf, 0xde, 0xc5, 0xd1, 0xf6, 0x33, 0x4c, 0x4c, 0xfe, + 0x11, 0xb3, 0x87, 0xef, 0xc3, 0x2f, 0x4f, 0xc1, 0x03, 0x0f, 0xc1, 0x7c, + 0x62, 0x02, 0x85, 0x86, 0x6c, 0xed, 0x42, 0xc1, 0xb4, 0xca, 0x37, 0xbb, + 0xb4, 0x8f, 0xf9, 0x94, 0x6f, 0xee, 0x3f, 0x57, 0x29, 0x90, 0x96, 0x4b, + 0xa1, 0x08, 0xb5, 0xad, 0x2e, 0xcd, 0x23, 0x3e, 0xb5, 0xad, 0xcb, 0x9c, + 0xd3, 0x8e, 0x2d, 0xc0, 0xf8, 0x38, 0xcc, 0x1f, 0x85, 0x71, 0x5d, 0xba, + 0xf1, 0x09, 0xb5, 0x3d, 0xac, 0x9e, 0x9d, 0x85, 0x6f, 0x3e, 0x13, 0xa5, + 0x19, 0x1f, 0x87, 0xc3, 0x6f, 0x0e, 0x9f, 0xfe, 0x5d, 0x56, 0x7b, 0x49, + 0xd2, 0x5e, 0x25, 0x74, 0x71, 0xa5, 0x2a, 0x97, 0x5d, 0xda, 0xed, 0xfe, + 0xf3, 0x51, 0x59, 0x4f, 0x2a, 0x4b, 0x8b, 0x4b, 0x6a, 0xfc, 0xa6, 0x32, + 0xf3, 0xaf, 0xb6, 0xc3, 0x74, 0x2d, 0x2b, 0xcd, 0x72, 0x30, 0x8d, 0x64, + 0xfc, 0x20, 0xfb, 0x95, 0xd8, 0x02, 0x7a, 0x0a, 0x7e, 0xf6, 0xf6, 0xb0, + 0x71, 0xab, 0x91, 0x0d, 0x65, 0x5a, 0xae, 0x6f, 0x5d, 0xce, 0x76, 0x58, + 0x5f, 0x49, 0x64, 0x82, 0xd9, 0xb6, 0x21, 0x54, 0xcb, 0x01, 0x0b, 0x93, + 0x30, 0xa9, 0xa4, 0xfd, 0xcf, 0x6b, 0x5d, 0x96, 0xd3, 0x3e, 0xdf, 0x67, + 0x57, 0x79, 0x82, 0xfd, 0xdd, 0xe3, 0xec, 0x0a, 0xd4, 0x0c, 0xd2, 0x92, + 0xd3, 0x62, 0xcb, 0xcd, 0x82, 0xa3, 0xdf, 0xfd, 0xaa, 0xf2, 0x27, 0xa6, + 0x40, 0xaa, 0xbe, 0x3b, 0x06, 0xd1, 0x72, 0x4b, 0x21, 0x30, 0x4b, 0x14, + 0x05, 0x9d, 0x4e, 0x27, 0x8c, 0x2f, 0x58, 0x40, 0xc0, 0xac, 0xf5, 0x4a, + 0xa5, 0xa6, 0xee, 0x17, 0x2c, 0x60, 0x95, 0xb9, 0x5b, 0xb7, 0x01, 0x29, + 0x07, 0x5e, 0x3c, 0x80, 0xfb, 0x3e, 0x75, 0xe7, 0x26, 0xa5, 0xdf, 0x07, + 0x4f, 0x11, 0x6b, 0xc4, 0x40, 0x9b, 0xac, 0xf5, 0xb4, 0xed, 0x72, 0xa5, + 0x8c, 0xdf, 0xf5, 0xfb, 0xe2, 0x07, 0xf9, 0x08, 0xc3, 0x93, 0xf7, 0x46, + 0x29, 0x69, 0xec, 0x30, 0x57, 0x94, 0x91, 0xd2, 0x0f, 0x41, 0x5f, 0xe3, + 0x9f, 0x7a, 0x88, 0xf9, 0xaf, 0x3d, 0x1e, 0xf3, 0x69, 0xda, 0x4b, 0x9e, + 0x3a, 0x18, 0x6b, 0x3b, 0xbb, 0xdd, 0x87, 0xd1, 0x9a, 0xe2, 0x35, 0x43, + 0xd9, 0x5d, 0x4a, 0x0d, 0xcc, 0xf3, 0x22, 0xa1, 0x5c, 0xb9, 0xb2, 0x65, + 0x40, 0x52, 0xef, 0x06, 0x10, 0xaa, 0x42, 0x3f, 0xd4, 0x2a, 0xab, 0x1c, + 0xc9, 0x72, 0xae, 0xb6, 0xdc, 0xc9, 0x74, 0xad, 0x44, 0x58, 0x2b, 0x11, + 0x7f, 0xa9, 0x35, 0xa8, 0x8e, 0xef, 0x86, 0x0a, 0xc0, 0xd4, 0x47, 0x5c, + 0xca, 0xc7, 0x4a, 0x34, 0xfd, 0x0e, 0xf7, 0x7c, 0xfc, 0x73, 0xcc, 0x7f, + 0xed, 0x8b, 0x2b, 0x82, 0x68, 0x25, 0x55, 0x1f, 0x29, 0xd1, 0x76, 0x7a, + 0x97, 0x14, 0xc4, 0x32, 0xa8, 0x3c, 0x59, 0x30, 0x2c, 0x93, 0x66, 0x58, + 0x58, 0xd6, 0xa5, 0x02, 0x7a, 0xad, 0x06, 0xb2, 0x25, 0xac, 0xfe, 0xba, + 0xd9, 0xbc, 0xf4, 0xd7, 0xc5, 0xc2, 0x2d, 0xc1, 0x4a, 0xdc, 0x3a, 0x65, + 0x08, 0x34, 0x04, 0xc1, 0x69, 0x40, 0x20, 0xd4, 0xf8, 0x8f, 0x06, 0xa4, + 0x08, 0xd7, 0x85, 0xee, 0x40, 0x0f, 0x5a, 0x1e, 0x0a, 0xa8, 0xd5, 0x00, + 0x5c, 0x0a, 0x80, 0x1f, 0xbb, 0x2a, 0x19, 0xe2, 0x77, 0x26, 0x0a, 0x88, + 0x40, 0x41, 0xb3, 0x44, 0x80, 0xc6, 0x99, 0x28, 0x38, 0x8c, 0x74, 0x0a, + 0xea, 0xfa, 0x25, 0xe8, 0x21, 0x82, 0x02, 0x72, 0xa5, 0x70, 0x61, 0xa7, + 0x43, 0x38, 0xd2, 0xeb, 0x74, 0xe2, 0xe1, 0xd6, 0xef, 0x37, 0x82, 0x6d, + 0x55, 0xb3, 0x0a, 0xa9, 0xff, 0x4c, 0xbc, 0xa7, 0x97, 0x66, 0x7b, 0x88, + 0xf1, 0x30, 0x07, 0x84, 0x5b, 0x81, 0xee, 0x02, 0x2b, 0x19, 0xad, 0xa8, + 0x56, 0x09, 0xc1, 0x51, 0x9e, 0x07, 0x54, 0x3d, 0xbc, 0x19, 0x98, 0x9b, + 0x06, 0x66, 0x2c, 0x3b, 0x60, 0x6e, 0x52, 0xad, 0x4f, 0xea, 0xe2, 0x19, + 0xa0, 0xd6, 0xa4, 0xa6, 0x69, 0xcd, 0x79, 0x0a, 0x92, 0xe5, 0x79, 0xca, + 0x6f, 0xb5, 0xaa, 0x20, 0x58, 0x10, 0x01, 0xa3, 0xaa, 0x55, 0x05, 0x94, + 0xd2, 0x2e, 0x74, 0x58, 0x04, 0xe4, 0x9a, 0xd4, 0xf9, 0x4e, 0xea, 0x4c, + 0xe6, 0x74, 0xbc, 0x91, 0xf1, 0x13, 0x7e, 0xf6, 0xa1, 0xaa, 0x81, 0x5b, + 0xc0, 0x23, 0x2f, 0xbd, 0x18, 0xda, 0x3d, 0xa2, 0x97, 0x7b, 0xa6, 0x5f, + 0x64, 0xcf, 0x8c, 0xc7, 0xe4, 0xa4, 0xc7, 0x17, 0xbe, 0x70, 0x7b, 0x08, + 0xcb, 0xc2, 0x53, 0x50, 0xab, 0xb9, 0x39, 0x9d, 0xef, 0xa4, 0x2e, 0x97, + 0x2e, 0xa3, 0x87, 0x17, 0x83, 0x56, 0xcd, 0x79, 0x1e, 0x73, 0x33, 0x30, + 0x59, 0x8d, 0xda, 0x64, 0x72, 0x9a, 0x3e, 0x90, 0xd8, 0xe4, 0x24, 0xcc, + 0xcc, 0x78, 0xec, 0x99, 0xae, 0x32, 0x89, 0xa7, 0xda, 0x84, 0x84, 0x4d, + 0x35, 0x82, 0x6c, 0x55, 0xb1, 0xc0, 0x5e, 0xba, 0x6c, 0x7b, 0xf4, 0x52, + 0x35, 0x41, 0x54, 0xf7, 0x99, 0x19, 0x0d, 0x02, 0xc3, 0x03, 0x2f, 0xc2, + 0x69, 0x0d, 0x82, 0x99, 0x5d, 0xac, 0xc2, 0xe7, 0x72, 0x81, 0x1a, 0xc3, + 0x95, 0x9b, 0x6b, 0xf0, 0xda, 0xf2, 0x30, 0x3b, 0xa3, 0xab, 0x09, 0xa8, + 0xb5, 0xac, 0xfa, 0x3e, 0x08, 0x74, 0xf1, 0xb0, 0xab, 0x4b, 0xfd, 0xc1, + 0x8d, 0x61, 0x35, 0x16, 0xc0, 0x82, 0x03, 0x0d, 0x47, 0xe0, 0x3a, 0x32, + 0x04, 0x57, 0x01, 0x14, 0x28, 0x50, 0x70, 0xd4, 0xf5, 0xc4, 0x71, 0x7a, + 0x21, 0x28, 0xea, 0x0b, 0x4e, 0x81, 0x47, 0x44, 0x8f, 0x2f, 0xa0, 0xee, + 0x21, 0xbf, 0xa8, 0xed, 0x9f, 0x02, 0xf6, 0x89, 0x42, 0x08, 0xd2, 0x6a, + 0x01, 0x5f, 0x00, 0xf6, 0xc6, 0x72, 0x54, 0x77, 0x9e, 0x2e, 0xd0, 0x08, + 0x54, 0x3f, 0xea, 0x5a, 0xc0, 0xac, 0x67, 0x74, 0x9a, 0xdd, 0xc0, 0xee, + 0x7f, 0xde, 0x0e, 0x21, 0x5b, 0x8f, 0xa0, 0x81, 0x5b, 0x0e, 0x3c, 0x24, + 0x5c, 0x1e, 0x95, 0x12, 0x1c, 0x58, 0xd0, 0x4b, 0x21, 0x15, 0x18, 0x6c, + 0xde, 0x81, 0x4a, 0x00, 0x4d, 0xa2, 0xe7, 0x9c, 0x65, 0x7a, 0xb4, 0x29, + 0xf4, 0xdf, 0xc4, 0x86, 0x75, 0x4d, 0x43, 0x52, 0xdb, 0x71, 0xf1, 0xcd, + 0x9e, 0x88, 0x9e, 0xe5, 0xf7, 0x64, 0x8f, 0x82, 0x28, 0x50, 0xa0, 0x40, + 0x4f, 0xf6, 0x90, 0x8e, 0x7e, 0x46, 0x2a, 0xa1, 0x20, 0x0a, 0x71, 0x88, + 0x97, 0x28, 0xb0, 0x10, 0x74, 0x14, 0xa8, 0x51, 0x3f, 0xc3, 0x01, 0x75, + 0xbe, 0x01, 0xf4, 0xc7, 0x7b, 0xa2, 0x72, 0x74, 0x02, 0xa8, 0x48, 0x49, + 0x47, 0xa0, 0x80, 0x8e, 0xf6, 0xb3, 0x6a, 0x49, 0x74, 0x9e, 0x7c, 0x17, + 0x7e, 0x37, 0xc3, 0xe8, 0xe4, 0xc9, 0x93, 0x31, 0x10, 0xd5, 0xc9, 0x93, + 0x0a, 0x5e, 0x35, 0x35, 0xa5, 0xc6, 0x60, 0x67, 0x4f, 0x9e, 0x64, 0x2d, + 0xe7, 0x42, 0x98, 0xd5, 0x59, 0x0d, 0xc5, 0x3a, 0xa1, 0xc1, 0x5b, 0x40, + 0x08, 0xb8, 0xe2, 0xfc, 0xc9, 0x18, 0x98, 0xeb, 0x82, 0x65, 0xc3, 0xf9, + 0x93, 0x97, 0xcd, 0xe7, 0xd9, 0xb3, 0x67, 0x63, 0xf5, 0x38, 0x77, 0xfe, + 0x42, 0xe8, 0xff, 0xc4, 0xab, 0xc7, 0xd4, 0xb6, 0x05, 0xc6, 0x02, 0x42, + 0xb0, 0x57, 0x0c, 0xdc, 0xa5, 0x75, 0xee, 0xfc, 0x05, 0xa6, 0xa6, 0xa6, + 0x98, 0x9d, 0x9d, 0x85, 0xf3, 0x27, 0xc3, 0xbc, 0x21, 0x02, 0x68, 0x99, + 0xfc, 0x4c, 0x59, 0x36, 0x55, 0x88, 0x95, 0x6d, 0xed, 0x75, 0x6b, 0xe0, + 0x9a, 0x78, 0x9e, 0xcb, 0xa9, 0xec, 0x0a, 0xda, 0xbe, 0xa4, 0x34, 0x52, + 0x89, 0x85, 0xa5, 0x3d, 0x0e, 0x94, 0x12, 0x5a, 0x4b, 0xe6, 0x39, 0x6b, + 0x7f, 0xbc, 0x79, 0x6f, 0xa2, 0x34, 0xb2, 0x3c, 0x78, 0xa9, 0xed, 0x4b, + 0x4a, 0x4b, 0x3e, 0x5e, 0xdb, 0x0f, 0x01, 0x5b, 0x36, 0xa8, 0xab, 0xec, + 0xba, 0x0a, 0xf4, 0x99, 0xc8, 0x28, 0x0d, 0xe6, 0xd5, 0x3c, 0x51, 0xc0, + 0x7b, 0x6d, 0x9e, 0x7d, 0x2f, 0x7b, 0xdc, 0x73, 0x53, 0xb5, 0x2f, 0x7e, + 0xeb, 0x48, 0x9d, 0xa6, 0x6c, 0x52, 0x13, 0xaa, 0x5c, 0x3b, 0x7f, 0xfb, + 0x5e, 0xf6, 0xbd, 0xfa, 0xa8, 0x2e, 0xb4, 0x5a, 0x6c, 0xa9, 0x5f, 0x4f, + 0xf3, 0x44, 0x93, 0xe6, 0x89, 0x02, 0x5b, 0xea, 0x28, 0x5f, 0x49, 0xc0, + 0x96, 0xe5, 0xcb, 0x68, 0xe7, 0x9d, 0xf7, 0xb2, 0xef, 0xe5, 0x47, 0x63, + 0xf6, 0x69, 0xbe, 0xd2, 0x54, 0x4d, 0x8c, 0x89, 0x2c, 0xe7, 0x8b, 0x8a, + 0x0f, 0x34, 0xd9, 0xfa, 0xa9, 0x1d, 0x34, 0x8f, 0xbd, 0xc9, 0xa0, 0x56, + 0x4e, 0x03, 0x65, 0x0d, 0xbb, 0x9e, 0x15, 0x97, 0x04, 0x70, 0x19, 0xd9, + 0x60, 0x29, 0x80, 0x0f, 0x6c, 0xdc, 0x00, 0xc0, 0xfa, 0xf2, 0x28, 0x67, + 0xda, 0x8b, 0x21, 0x50, 0x0b, 0x14, 0x5c, 0xcb, 0xc0, 0xb6, 0x7e, 0x70, + 0xea, 0x74, 0x66, 0xfe, 0x59, 0x79, 0x25, 0xb5, 0x1a, 0x00, 0x56, 0x5a, + 0x3d, 0x57, 0x63, 0x97, 0x56, 0xee, 0xac, 0xb6, 0xfa, 0xef, 0x7f, 0x2d, + 0x71, 0x7e, 0x51, 0x1d, 0x63, 0xef, 0xf9, 0x45, 0xc1, 0x07, 0x36, 0x6e, + 0xe0, 0x07, 0xa7, 0x48, 0xd5, 0x8f, 0x7f, 0xd2, 0xe4, 0xfc, 0xdb, 0x67, + 0xd9, 0xb0, 0xe6, 0x56, 0xe5, 0x8b, 0x1f, 0x66, 0xd6, 0x3f, 0x57, 0xae, + 0x5c, 0xb9, 0x72, 0xe5, 0xca, 0x95, 0x2b, 0x57, 0xae, 0x5c, 0xb9, 0x72, + 0xe5, 0xca, 0x95, 0x2b, 0x57, 0xae, 0x5c, 0xb9, 0x72, 0xe5, 0xca, 0x95, + 0x2b, 0x57, 0xae, 0x5c, 0xb9, 0x72, 0x2d, 0xaf, 0x9f, 0xa5, 0x57, 0xcf, + 0x72, 0xe5, 0xca, 0x95, 0x2b, 0x57, 0xae, 0xbf, 0x59, 0xda, 0xae, 0x26, + 0x46, 0x88, 0xcd, 0x02, 0x4e, 0xa0, 0x5e, 0x78, 0x4d, 0x01, 0x05, 0x55, + 0xaa, 0xb5, 0x6c, 0xa0, 0x56, 0x41, 0x80, 0x14, 0x99, 0xef, 0xf2, 0xda, + 0xe0, 0x29, 0x03, 0x8a, 0xca, 0x02, 0x4f, 0xa5, 0x85, 0x27, 0xed, 0x6d, + 0x98, 0x4a, 0x08, 0x6a, 0x71, 0x44, 0xdf, 0xcb, 0xdc, 0x32, 0x90, 0xb1, + 0xf7, 0x88, 0xa5, 0x8c, 0x43, 0xbb, 0xcc, 0x76, 0x32, 0xcf, 0xb4, 0x32, + 0xd8, 0x80, 0xab, 0xe4, 0xfa, 0x4a, 0x64, 0x7f, 0xa5, 0xd7, 0x94, 0x2f, + 0xe9, 0x23, 0x59, 0x26, 0xb3, 0xde, 0xf2, 0x3b, 0xb1, 0x30, 0x49, 0x64, + 0x97, 0xac, 0x8b, 0xd8, 0xac, 0xd3, 0x6f, 0xef, 0xc0, 0x0b, 0x6a, 0xd5, + 0xbd, 0x41, 0x83, 0x8e, 0xd6, 0xbb, 0x34, 0x0d, 0x98, 0x2a, 0x01, 0x97, + 0x02, 0x0b, 0xa4, 0x66, 0x03, 0xb4, 0x9c, 0xf8, 0x32, 0xed, 0x0d, 0x55, + 0xfb, 0xe5, 0x6a, 0x64, 0x04, 0x92, 0x4a, 0xfb, 0x72, 0xb7, 0x70, 0x94, + 0x8f, 0xa7, 0xef, 0xdc, 0xc9, 0xf5, 0xbf, 0xfb, 0x30, 0x13, 0x37, 0xa4, + 0x80, 0x1f, 0x2c, 0x19, 0xbb, 0x2d, 0xf5, 0x2d, 0x91, 0x4f, 0x0d, 0xf5, + 0x7a, 0xfa, 0x4e, 0x05, 0x75, 0xb8, 0xfb, 0xcb, 0xfb, 0xa9, 0x15, 0x05, + 0x2d, 0xeb, 0xf7, 0x51, 0x2b, 0x0a, 0xee, 0x7b, 0xee, 0x40, 0x0c, 0x82, + 0x15, 0x96, 0x25, 0x01, 0x16, 0x4b, 0x03, 0x81, 0xd9, 0xb0, 0xad, 0xb4, + 0xba, 0x0f, 0x03, 0xe3, 0xb2, 0x27, 0xe7, 0x86, 0x10, 0xa1, 0x6e, 0xbc, + 0x7d, 0x8c, 0xff, 0x64, 0x9b, 0xc9, 0x00, 0xc8, 0x80, 0x72, 0x19, 0xbf, + 0xe5, 0xf5, 0xfa, 0x05, 0xdf, 0x1b, 0x04, 0x18, 0xae, 0x88, 0x7d, 0x5c, + 0xbf, 0x2a, 0x23, 0x90, 0x55, 0x4a, 0xf9, 0x4a, 0x16, 0xdc, 0x2a, 0xa9, + 0x2c, 0xf8, 0x96, 0x9d, 0xce, 0x4f, 0x49, 0x2f, 0x83, 0x08, 0x2a, 0xe4, + 0x07, 0x0a, 0x56, 0x65, 0x4f, 0x94, 0xf2, 0xad, 0x76, 0x6e, 0x2f, 0x35, + 0x91, 0x02, 0x0e, 0x4a, 0xb8, 0x27, 0x01, 0xa4, 0xda, 0xa1, 0x97, 0x4d, + 0xa7, 0x4c, 0x9a, 0x92, 0x50, 0xac, 0xd4, 0x3a, 0xa4, 0x00, 0xb5, 0x86, + 0xb5, 0x5d, 0x49, 0x3e, 0xc9, 0x89, 0xdf, 0xe9, 0xfe, 0xfd, 0xd8, 0x52, + 0x88, 0x6c, 0xa0, 0x48, 0x9a, 0xaf, 0xd8, 0x71, 0xfd, 0x75, 0xb5, 0x6a, + 0x1f, 0xd7, 0x78, 0x17, 0x07, 0x67, 0x8a, 0xe5, 0x75, 0x09, 0x27, 0x38, + 0x0c, 0xea, 0x27, 0x63, 0xfd, 0xc6, 0x25, 0xd4, 0xd0, 0xd0, 0x2d, 0x03, + 0x5a, 0xbc, 0x4c, 0xf6, 0x61, 0xba, 0x2c, 0xc8, 0x60, 0x86, 0xd2, 0x8e, + 0xeb, 0xf7, 0xdd, 0xa0, 0x0e, 0x90, 0x0d, 0xeb, 0x8b, 0x9c, 0x02, 0x46, + 0x37, 0x6e, 0xe4, 0xc9, 0x27, 0x9e, 0xe0, 0xd0, 0xa1, 0x43, 0x61, 0xba, + 0x8d, 0xa3, 0x66, 0xaa, 0xd5, 0xdf, 0x00, 0x00, 0x20, 0x00, 0x49, 0x44, + 0x41, 0x54, 0xa3, 0x3c, 0x79, 0xea, 0x14, 0x8b, 0xa7, 0x4e, 0x81, 0x05, + 0x6f, 0x5a, 0x3c, 0x75, 0x8a, 0x43, 0x10, 0xb3, 0x35, 0xf6, 0x87, 0x0e, + 0x1d, 0x0a, 0x01, 0x5a, 0x66, 0xfb, 0xc1, 0x14, 0xf8, 0xd5, 0xf6, 0xed, + 0xdb, 0x59, 0x3c, 0x75, 0x8a, 0x1d, 0xa3, 0x59, 0x58, 0xab, 0x7e, 0x6d, + 0x7f, 0xe2, 0x89, 0x68, 0x63, 0x19, 0xa0, 0xd6, 0x53, 0x4f, 0x3d, 0x15, + 0x5b, 0x66, 0xd9, 0xec, 0x26, 0x0e, 0xc7, 0x32, 0xc0, 0xab, 0x24, 0x04, + 0x6b, 0x94, 0x51, 0x16, 0x2d, 0x14, 0x56, 0x12, 0x96, 0x85, 0xe5, 0xc7, + 0x6c, 0x6f, 0xb3, 0xd2, 0x6c, 0x63, 0x94, 0xc3, 0xab, 0x46, 0x69, 0x45, + 0x32, 0xd0, 0xb3, 0xc5, 0x53, 0xea, 0xad, 0xf4, 0xc5, 0x53, 0xa7, 0x18, + 0xdd, 0xb8, 0x91, 0x53, 0x8b, 0x8b, 0xec, 0x78, 0xf0, 0x41, 0x36, 0xae, + 0x57, 0xfb, 0xf5, 0x7d, 0x37, 0x14, 0x61, 0x56, 0x41, 0x11, 0xdc, 0xa2, + 0xea, 0xc3, 0xcb, 0x45, 0xc2, 0xae, 0xb3, 0xfd, 0x2f, 0x3e, 0xc9, 0xee, + 0x47, 0x5f, 0xa4, 0xfd, 0xd8, 0xed, 0x00, 0xbc, 0xf8, 0x1f, 0xa3, 0xf5, + 0x95, 0xc8, 0x00, 0xb5, 0x8c, 0xae, 0xce, 0xa9, 0x4c, 0xfd, 0x4a, 0x83, + 0xa6, 0xb8, 0x6e, 0xd4, 0x87, 0x9a, 0x3a, 0x25, 0xeb, 0x77, 0x35, 0xa9, + 0xac, 0xcf, 0x71, 0x6e, 0xb1, 0x13, 0x4e, 0x86, 0x53, 0xfb, 0xba, 0x40, + 0xd9, 0x15, 0x8c, 0x6f, 0xbe, 0x5e, 0x05, 0xfa, 0x1a, 0x27, 0xb0, 0xb9, + 0x0e, 0x6e, 0x45, 0xf5, 0xc7, 0xed, 0x26, 0xbd, 0xcd, 0x35, 0xb6, 0x96, + 0xf5, 0xe4, 0x87, 0xb6, 0x9a, 0x30, 0xd1, 0xdb, 0x5c, 0x83, 0xb2, 0x9e, + 0xd4, 0xdd, 0x6e, 0x50, 0x28, 0x02, 0xe5, 0x0a, 0x3b, 0x5d, 0x01, 0xdd, + 0x1e, 0xf2, 0x8c, 0x86, 0x49, 0x7d, 0x62, 0x67, 0x58, 0x0e, 0xd9, 0xf6, + 0x10, 0x63, 0x63, 0x94, 0x7b, 0x0b, 0x08, 0x07, 0xb6, 0x34, 0x2a, 0x1c, + 0xdf, 0xd0, 0x44, 0xde, 0x3a, 0x86, 0x3b, 0x3e, 0x85, 0x3c, 0xd3, 0x62, + 0xa2, 0x51, 0x83, 0xc6, 0x5e, 0xc4, 0x47, 0xea, 0xec, 0xd2, 0x79, 0xfa, + 0x41, 0x03, 0xe1, 0x4b, 0xc4, 0x2d, 0x35, 0xa8, 0x8d, 0x29, 0x67, 0xcd, + 0x05, 0xb8, 0xc5, 0x4c, 0x06, 0xd7, 0xc5, 0x38, 0x36, 0xdc, 0x1e, 0x68, + 0x1e, 0x49, 0xb3, 0xb3, 0xce, 0x8b, 0x87, 0xdf, 0x84, 0x8a, 0x3e, 0x67, + 0x7b, 0x4d, 0xa8, 0xd6, 0xe0, 0xd7, 0xa7, 0xe2, 0xe6, 0xc9, 0x73, 0xd5, + 0x19, 0x83, 0x62, 0x10, 0xf0, 0x91, 0x71, 0x78, 0xe3, 0x20, 0x7c, 0xec, + 0x5e, 0x15, 0xf4, 0xfb, 0x7a, 0xf9, 0xa1, 0x12, 0xbc, 0x31, 0x3c, 0x3a, + 0xc9, 0xfd, 0xd0, 0x14, 0xfe, 0x1b, 0xb3, 0x43, 0xdb, 0x83, 0x9a, 0xec, + 0x05, 0xd1, 0xb1, 0x0c, 0xd6, 0xf9, 0xba, 0x5c, 0x86, 0xf6, 0x95, 0x01, + 0x65, 0xad, 0x44, 0x59, 0xd0, 0xac, 0x61, 0x60, 0x5a, 0x46, 0x06, 0xa8, + 0x15, 0xa5, 0xab, 0xf7, 0xd9, 0x64, 0x5d, 0x85, 0xa5, 0x7d, 0xf3, 0x7e, + 0x25, 0xb6, 0x97, 0xd3, 0x77, 0x96, 0xed, 0x02, 0x1d, 0xc6, 0x74, 0xa4, + 0x7d, 0xbe, 0xfe, 0x70, 0xf1, 0x7d, 0x00, 0xbc, 0xbf, 0xb8, 0x81, 0xb7, + 0xfc, 0x95, 0xf5, 0xb3, 0x83, 0x00, 0x4e, 0x17, 0x33, 0xf5, 0x79, 0x55, + 0x40, 0xec, 0x94, 0x3c, 0x7f, 0x9e, 0xeb, 0xf2, 0xbe, 0xa2, 0x9a, 0x84, + 0xf7, 0xe1, 0xe2, 0xfb, 0xf8, 0x73, 0xcd, 0x30, 0xb2, 0xcf, 0xd7, 0xf7, + 0xb8, 0x2e, 0xfb, 0x7c, 0x9f, 0xfd, 0xdd, 0xe3, 0x80, 0x82, 0x69, 0x75, + 0x82, 0x0a, 0x42, 0xb8, 0x3c, 0xde, 0x6d, 0x87, 0x70, 0xc0, 0xb1, 0xf9, + 0x59, 0x16, 0xc6, 0x27, 0x18, 0x7f, 0xfd, 0x78, 0x2c, 0x8f, 0x5e, 0x90, + 0x44, 0x88, 0xc5, 0xa1, 0x59, 0xcb, 0x29, 0xbc, 0xbf, 0x18, 0x02, 0xf6, + 0x22, 0xa5, 0xcf, 0xae, 0x4f, 0xed, 0x62, 0xff, 0xd7, 0xf6, 0x5f, 0x94, + 0xcd, 0x72, 0xda, 0xb1, 0x7d, 0xc7, 0xd0, 0xe9, 0xcd, 0x7d, 0x51, 0x16, + 0x80, 0x78, 0x39, 0x25, 0xeb, 0xbf, 0x70, 0x78, 0xef, 0x20, 0xf3, 0x98, + 0x4c, 0x3b, 0x9b, 0x7d, 0x10, 0x3b, 0x5f, 0x6b, 0xd9, 0xc7, 0xf5, 0x4f, + 0xfd, 0x38, 0xc4, 0x2a, 0xb8, 0x02, 0x90, 0xad, 0xe2, 0x2f, 0x5d, 0x43, + 0xab, 0xf3, 0xd3, 0x70, 0xbb, 0x64, 0xc5, 0xad, 0x6c, 0x8a, 0xf2, 0xca, + 0xf4, 0xcb, 0x57, 0x20, 0x8f, 0x8b, 0xd5, 0xc5, 0x94, 0xed, 0xfd, 0x29, + 0xc7, 0xb5, 0x7d, 0xcf, 0x75, 0xec, 0x12, 0xde, 0x5f, 0xaf, 0x54, 0x97, + 0x13, 0x36, 0x39, 0xac, 0x1f, 0x13, 0x76, 0xa5, 0x40, 0x57, 0x97, 0x33, + 0x9f, 0x0d, 0x69, 0xf7, 0x5c, 0xe6, 0xda, 0xac, 0xea, 0x5a, 0x68, 0x97, + 0x7e, 0xed, 0x97, 0x4d, 0xe8, 0x82, 0xff, 0xb5, 0x2f, 0x0e, 0xb0, 0x1a, + 0x4e, 0x5e, 0xbb, 0x85, 0x70, 0x5c, 0xfc, 0xca, 0x58, 0x36, 0x0e, 0x23, + 0xb8, 0x98, 0xb3, 0x64, 0x5c, 0xf6, 0x39, 0x21, 0x0d, 0x80, 0xb5, 0x5c, + 0xfc, 0xc5, 0xfa, 0x5f, 0x4e, 0x06, 0xb2, 0x35, 0x0c, 0x5c, 0x2b, 0xcc, + 0xd3, 0x00, 0x12, 0x53, 0xce, 0x9b, 0x95, 0x91, 0x1a, 0xe5, 0xea, 0x02, + 0x10, 0xbf, 0x36, 0xdb, 0xa2, 0x3f, 0xc2, 0x51, 0x29, 0x96, 0x49, 0x32, + 0xcd, 0xfd, 0xa5, 0xc1, 0xbf, 0x3c, 0x57, 0xb8, 0xf8, 0xe6, 0x3c, 0xe4, + 0x94, 0x21, 0x28, 0x01, 0x05, 0x70, 0x8e, 0x43, 0xd0, 0xc6, 0xc0, 0xa1, + 0xcc, 0xb5, 0x86, 0xbf, 0xd4, 0x7f, 0x35, 0x29, 0x9c, 0x12, 0x32, 0xd0, + 0xe3, 0xb4, 0x4e, 0x05, 0x19, 0xa8, 0x3c, 0xa3, 0xbb, 0xa8, 0x4a, 0x6c, + 0x5c, 0xb5, 0xb3, 0x0c, 0x78, 0xbd, 0x34, 0x52, 0xa6, 0xb3, 0xd4, 0x86, + 0xa0, 0xa7, 0xd0, 0x2a, 0x41, 0x21, 0x04, 0x6a, 0x49, 0x33, 0x7e, 0xaf, + 0xef, 0x37, 0xa5, 0x53, 0x50, 0x6d, 0x95, 0x36, 0x26, 0x15, 0x94, 0xe2, + 0xc0, 0x2c, 0x08, 0xcb, 0x49, 0x50, 0x42, 0x08, 0x5d, 0xee, 0xa0, 0x44, + 0x47, 0x03, 0x2b, 0x54, 0xfd, 0xa3, 0xfd, 0xde, 0x6a, 0xdb, 0xf5, 0xf5, + 0xa2, 0x55, 0x67, 0x0c, 0x82, 0x05, 0x84, 0xb3, 0x45, 0xfb, 0x34, 0x71, + 0x75, 0x14, 0xd6, 0x26, 0xda, 0x5e, 0x0e, 0x34, 0x6f, 0x1f, 0x2b, 0xae, + 0x28, 0xe1, 0xeb, 0x32, 0x56, 0x8a, 0xea, 0x42, 0x7c, 0x4b, 0xd1, 0x65, + 0x41, 0xc7, 0xdb, 0x7d, 0xb8, 0x19, 0x19, 0xb0, 0xe1, 0x58, 0x4c, 0x7b, + 0x30, 0x03, 0xde, 0x5c, 0x1c, 0xd8, 0xb4, 0x47, 0x6f, 0x18, 0xb0, 0xd5, + 0xcc, 0x8c, 0x82, 0x48, 0xed, 0xd1, 0x10, 0xa9, 0x6a, 0x55, 0xc3, 0xa7, + 0xe6, 0x0c, 0xa8, 0xab, 0x1a, 0xd6, 0xa1, 0x1a, 0xfe, 0xa7, 0x56, 0xaa, + 0xda, 0x8f, 0x81, 0x70, 0xcd, 0xcd, 0xa8, 0x98, 0xb9, 0x19, 0x98, 0xde, + 0x13, 0x19, 0xcf, 0xec, 0xf1, 0x98, 0xdc, 0xa3, 0xb6, 0x66, 0xb4, 0x8d, + 0x29, 0x97, 0x0d, 0xb8, 0x02, 0xe0, 0x29, 0x3d, 0xf6, 0x73, 0x18, 0xf8, + 0x37, 0xa3, 0x7c, 0xe1, 0x4f, 0x17, 0xc3, 0xb2, 0x78, 0x1e, 0xcc, 0xcd, + 0x41, 0x75, 0x5a, 0x95, 0x3d, 0x9e, 0x57, 0x24, 0x03, 0x01, 0x9b, 0xf3, + 0x3c, 0x05, 0x18, 0xf3, 0x88, 0x01, 0xbf, 0x6c, 0xb0, 0x96, 0x49, 0xef, + 0x79, 0x51, 0xd5, 0xe6, 0xe6, 0x60, 0x7a, 0x52, 0xd5, 0x8d, 0xc9, 0xd0, + 0x69, 0x4c, 0x73, 0xc0, 0xa4, 0xa7, 0xda, 0x4b, 0x01, 0xbf, 0xa2, 0xb2, + 0x4d, 0x5a, 0x0d, 0x3e, 0x37, 0x63, 0xa5, 0xf5, 0x74, 0x5e, 0x96, 0x5f, + 0xd3, 0x76, 0x46, 0xa9, 0x7d, 0xb8, 0x75, 0x1d, 0xbe, 0x92, 0x31, 0xec, + 0xe4, 0x78, 0xae, 0x30, 0x50, 0x3c, 0xf3, 0x91, 0x1a, 0x47, 0xc4, 0x20, + 0x54, 0x7f, 0x23, 0x94, 0x35, 0x2e, 0x6f, 0xd7, 0x73, 0x88, 0x7a, 0x0b, + 0x88, 0xc1, 0x92, 0x2e, 0x07, 0x58, 0x2b, 0x6d, 0xdc, 0xcc, 0x7e, 0xce, + 0xb5, 0xd0, 0x05, 0x17, 0x49, 0x2d, 0x10, 0x2c, 0x08, 0xc1, 0x53, 0x63, + 0x12, 0xe6, 0x95, 0xd9, 0xee, 0x40, 0xc1, 0xac, 0xfc, 0x40, 0x01, 0xb6, + 0x7a, 0xa2, 0x17, 0x86, 0x43, 0x81, 0xbd, 0x0e, 0x1c, 0x0f, 0x7a, 0x6c, + 0x09, 0x14, 0x04, 0x0b, 0x80, 0xa0, 0xc7, 0x33, 0x4e, 0x21, 0x84, 0x64, + 0xed, 0x46, 0x41, 0xb3, 0x5c, 0xfd, 0xcc, 0xeb, 0xa9, 0x3f, 0x28, 0xc3, + 0xb7, 0xda, 0xdc, 0xfb, 0xdd, 0x1e, 0x05, 0xe0, 0x0f, 0xe9, 0xf1, 0x59, + 0x0d, 0xd7, 0x7a, 0x4a, 0xc3, 0xb5, 0x8c, 0xaf, 0xa7, 0x1c, 0xd8, 0xed, + 0x80, 0x42, 0xd7, 0xab, 0x70, 0xe1, 0x08, 0xee, 0x0b, 0x24, 0x11, 0x1a, + 0x48, 0x49, 0x0a, 0x98, 0xd7, 0x79, 0xb6, 0x1c, 0x62, 0x30, 0xc6, 0x26, + 0x50, 0x48, 0xe0, 0xa5, 0x0b, 0x40, 0x2f, 0x10, 0x14, 0x1c, 0x49, 0x2f, + 0xe3, 0x19, 0xc3, 0x16, 0x07, 0x8e, 0x6a, 0x3f, 0x15, 0xdd, 0x8e, 0x9d, + 0x00, 0x05, 0xd6, 0xb2, 0xfc, 0x89, 0xa0, 0x17, 0x9e, 0x2b, 0x94, 0xcf, + 0x02, 0x38, 0x1d, 0x44, 0xa0, 0xc1, 0xd5, 0x8e, 0xa0, 0x27, 0x7b, 0x94, + 0xf4, 0xc7, 0x72, 0xc6, 0x1c, 0x05, 0x32, 0x0b, 0x55, 0x54, 0xcf, 0xc6, + 0x5b, 0x8e, 0x60, 0x22, 0x80, 0xa3, 0xd6, 0x6f, 0x42, 0x01, 0xb5, 0xac, + 0x67, 0xad, 0xf6, 0xf1, 0x66, 0x01, 0xb5, 0xa4, 0x94, 0xa9, 0xcf, 0xb9, + 0xf8, 0x98, 0xda, 0xd7, 0xd7, 0x6e, 0xfe, 0x15, 0xf8, 0x2f, 0x2a, 0xe8, + 0xd8, 0x2f, 0xf5, 0xb8, 0xf9, 0xaf, 0xa2, 0xfb, 0xe2, 0xcb, 0xb5, 0x7d, + 0xee, 0xed, 0x5b, 0xe0, 0xfc, 0x2b, 0x80, 0x02, 0x43, 0x19, 0xf8, 0xd4, + 0xec, 0xec, 0x2c, 0x9b, 0x36, 0x6d, 0x62, 0xd3, 0xa6, 0x4d, 0x9c, 0x3c, + 0x79, 0x92, 0x4d, 0x15, 0x42, 0x08, 0x96, 0x91, 0x01, 0x5f, 0x5d, 0x68, + 0x9d, 0x0b, 0x61, 0x5c, 0x10, 0x01, 0xab, 0x0c, 0x78, 0xca, 0xd8, 0x5c, + 0x4e, 0x9f, 0x06, 0x70, 0xb5, 0x69, 0xd3, 0xa6, 0x10, 0x70, 0x65, 0xfc, + 0xda, 0x50, 0xac, 0xb5, 0xd7, 0xad, 0x49, 0x07, 0x89, 0x9d, 0x8f, 0xc2, + 0xd6, 0x5e, 0xb7, 0x86, 0x13, 0xaf, 0x1e, 0x0b, 0xf3, 0x39, 0x79, 0xf2, + 0x64, 0x58, 0xe6, 0xb5, 0xd7, 0xad, 0xe1, 0x42, 0xeb, 0x5c, 0x0c, 0xa8, + 0x65, 0x7c, 0x9a, 0x75, 0x50, 0x60, 0xae, 0x6b, 0xff, 0xde, 0xff, 0x14, + 0xed, 0xdf, 0xff, 0xa0, 0x56, 0xed, 0x3e, 0xbc, 0x09, 0x78, 0x6d, 0x05, + 0xb3, 0x12, 0x42, 0x68, 0x80, 0x56, 0xbc, 0x3f, 0x2a, 0x8d, 0x54, 0xe8, + 0x2c, 0xb5, 0x62, 0xa0, 0x2d, 0xaf, 0xed, 0x53, 0x76, 0xfb, 0x9f, 0xaf, + 0x1a, 0x5f, 0x65, 0xd7, 0xc5, 0x15, 0x82, 0x76, 0xc2, 0xd7, 0xd8, 0x87, + 0xea, 0x43, 0xfb, 0x6a, 0xfb, 0x3e, 0x6d, 0x3f, 0x8a, 0x93, 0x52, 0x22, + 0x5c, 0xd1, 0xe7, 0xcb, 0xb3, 0xc6, 0x4e, 0xef, 0xf8, 0x44, 0x8d, 0xe7, + 0x5f, 0xb0, 0xae, 0x8f, 0xb4, 0xf9, 0x91, 0xa5, 0x06, 0x47, 0xbe, 0x1c, + 0x8d, 0x9f, 0x7b, 0x5d, 0xc9, 0xd4, 0x8d, 0xea, 0xd8, 0xbc, 0xfd, 0xfe, + 0x47, 0x79, 0xea, 0xd3, 0x3b, 0x38, 0xde, 0x78, 0x93, 0x7d, 0x2f, 0x7b, + 0x6c, 0xa9, 0x5f, 0x1f, 0xf3, 0x75, 0xbc, 0x11, 0xff, 0x40, 0xc4, 0x91, + 0xa5, 0x06, 0x77, 0x58, 0x08, 0xab, 0xa9, 0x1b, 0xcb, 0x18, 0xf4, 0xbc, + 0xf1, 0xf5, 0xfc, 0x0b, 0x4d, 0xf6, 0xbd, 0xdc, 0xc8, 0xf4, 0xb5, 0x75, + 0x44, 0x5d, 0x93, 0xad, 0xd6, 0xd7, 0xee, 0x2f, 0x1f, 0x64, 0xec, 0xb4, + 0x6a, 0x97, 0xd2, 0x88, 0x4b, 0x69, 0xfb, 0x04, 0xe5, 0xe7, 0xd4, 0x73, + 0x88, 0x70, 0x2c, 0x45, 0x1f, 0xd3, 0xb7, 0x7e, 0xf0, 0x83, 0xbc, 0x32, + 0x37, 0x4b, 0xc5, 0x4d, 0x8c, 0xeb, 0x5f, 0xa4, 0xb2, 0x20, 0x57, 0xcb, + 0xc1, 0xaf, 0xc6, 0x7f, 0xed, 0xc3, 0xe1, 0xfa, 0xfc, 0x77, 0xbe, 0xc7, + 0xfa, 0x72, 0xfc, 0x79, 0xe7, 0xc2, 0x5f, 0xc4, 0x41, 0x58, 0xcb, 0xe5, + 0x31, 0x0c, 0x00, 0xec, 0x62, 0xe2, 0x56, 0xe2, 0x63, 0x35, 0x76, 0x10, + 0x01, 0xc5, 0x6c, 0x80, 0xd6, 0x8f, 0x7f, 0xa2, 0xda, 0xe1, 0xbd, 0xbf, + 0x5c, 0xe3, 0xfc, 0xdb, 0x67, 0xc3, 0xf8, 0x5b, 0x6f, 0xf8, 0x20, 0x0b, + 0xbc, 0x1d, 0x3b, 0xa6, 0x73, 0xe5, 0xca, 0x95, 0x2b, 0x57, 0xae, 0x5c, + 0xb9, 0x72, 0xe5, 0xca, 0x95, 0x2b, 0x57, 0xae, 0x5c, 0xb9, 0x72, 0xe5, + 0xca, 0x95, 0x2b, 0x57, 0xae, 0x5c, 0xb9, 0x72, 0xe5, 0xca, 0x95, 0x2b, + 0xd7, 0xf0, 0xca, 0xa1, 0x5a, 0xb9, 0x72, 0xe5, 0xca, 0x95, 0x2b, 0xd7, + 0xbb, 0xa5, 0x43, 0x25, 0xf8, 0x54, 0x07, 0x79, 0x42, 0x52, 0xaf, 0xd6, + 0xc1, 0x29, 0xc0, 0x88, 0x8a, 0xea, 0x2c, 0xb5, 0x68, 0xb7, 0xd5, 0x44, + 0x8f, 0x0a, 0x35, 0x32, 0x81, 0x5a, 0x03, 0x94, 0x04, 0x51, 0x99, 0x6d, + 0x03, 0x80, 0x4a, 0x9b, 0x2c, 0x94, 0x06, 0xaf, 0x8a, 0xc1, 0xb0, 0x52, + 0xe2, 0x8d, 0xc4, 0x32, 0xd3, 0x63, 0x97, 0x83, 0x7a, 0xd9, 0x71, 0x7e, + 0xd7, 0x8f, 0xa0, 0x55, 0x29, 0xe5, 0x48, 0xdb, 0x4e, 0x2b, 0x87, 0xdf, + 0xf5, 0x71, 0xf5, 0x04, 0x9e, 0xf0, 0xc5, 0xe1, 0x94, 0xfa, 0x2f, 0x57, + 0xdf, 0xca, 0x48, 0x09, 0x7f, 0x29, 0x3e, 0x09, 0xdf, 0xf6, 0x63, 0x97, + 0x9b, 0x13, 0xba, 0x04, 0x87, 0xa2, 0xe9, 0x96, 0xfe, 0xeb, 0x12, 0x26, + 0xa1, 0x7d, 0xc6, 0x47, 0x6c, 0x0e, 0x0b, 0x1a, 0x03, 0x6b, 0xa9, 0xc9, + 0xa8, 0x22, 0x15, 0xa8, 0x15, 0xcf, 0x58, 0xf6, 0x03, 0xa8, 0x2c, 0xbb, + 0x24, 0x48, 0xcb, 0x06, 0x47, 0x85, 0x71, 0x52, 0x72, 0xdf, 0x73, 0x07, + 0xa8, 0x1f, 0x39, 0xd2, 0x0f, 0xde, 0x4a, 0x81, 0x7d, 0x85, 0xf9, 0x64, + 0x00, 0x78, 0x44, 0x51, 0xf0, 0xd8, 0x9d, 0x3b, 0xb9, 0xef, 0xd9, 0xfd, + 0x3c, 0xfd, 0xdb, 0xbb, 0x00, 0xb8, 0xef, 0xd9, 0xfd, 0xa9, 0x10, 0xac, + 0xbe, 0xbc, 0xac, 0x32, 0x86, 0x75, 0x31, 0xb0, 0xad, 0x61, 0xc0, 0x59, + 0x69, 0xb0, 0x31, 0x69, 0xef, 0xc3, 0xb8, 0x9d, 0x28, 0x8a, 0x30, 0xde, + 0xb4, 0x49, 0x16, 0x7c, 0x2c, 0x35, 0xce, 0x6a, 0x9f, 0xf6, 0x19, 0x1f, + 0x70, 0xd5, 0xfe, 0x35, 0xbf, 0x3b, 0xeb, 0xb8, 0x36, 0x5a, 0x90, 0xd0, + 0x74, 0x5c, 0xc6, 0x06, 0xe0, 0x46, 0xec, 0x5a, 0x76, 0x1c, 0x35, 0x09, + 0xcb, 0xe4, 0xdb, 0x71, 0x14, 0xea, 0xc2, 0x80, 0xb6, 0x3a, 0x8e, 0x82, + 0x0c, 0xb8, 0x0e, 0x24, 0xd1, 0x14, 0x26, 0x0e, 0x14, 0x2c, 0x0b, 0xda, + 0x50, 0xb4, 0x20, 0x5b, 0x56, 0x5e, 0x42, 0x94, 0x39, 0x98, 0x02, 0xac, + 0x92, 0x48, 0x0e, 0x16, 0x05, 0x47, 0x84, 0xc4, 0xed, 0xc6, 0xe3, 0x0c, + 0xe4, 0x6a, 0x39, 0xd0, 0x55, 0x41, 0x14, 0x28, 0xeb, 0xaf, 0x10, 0xb7, + 0x97, 0x9a, 0xe1, 0x3a, 0x00, 0xc5, 0x5a, 0x7c, 0x69, 0xa9, 0xbd, 0xd4, + 0xc4, 0x2d, 0x16, 0xe2, 0x71, 0xc5, 0x1a, 0xed, 0xbe, 0xc9, 0x71, 0xc2, + 0x2a, 0x4b, 0xd4, 0xae, 0x06, 0x7a, 0x97, 0x94, 0x99, 0x14, 0x6e, 0x96, + 0x52, 0xfa, 0xb8, 0x6e, 0x39, 0x04, 0x7d, 0x99, 0xa5, 0xef, 0xb7, 0x71, + 0xdd, 0x72, 0x22, 0x6d, 0x99, 0xf6, 0x09, 0x39, 0xf0, 0xb8, 0x5e, 0xad, + 0x2e, 0x29, 0x40, 0x4b, 0x88, 0xcc, 0xbb, 0xbb, 0xac, 0x7c, 0x2e, 0x35, + 0x58, 0xab, 0x5a, 0x4e, 0xc7, 0x5f, 0x78, 0xed, 0x36, 0xee, 0x88, 0x8b, + 0x3b, 0x24, 0x0c, 0xd1, 0x6b, 0xb7, 0x33, 0x7d, 0x01, 0xf8, 0x81, 0x8c, + 0xf9, 0x4a, 0xb3, 0xf7, 0xad, 0xbe, 0x39, 0x79, 0xee, 0x69, 0xb7, 0xdb, + 0x0a, 0xae, 0x62, 0xc9, 0xd8, 0xb4, 0xcf, 0xb4, 0x49, 0x1e, 0xd7, 0x6f, + 0xbd, 0xde, 0xa5, 0xfe, 0xf7, 0xdf, 0xcb, 0xe9, 0x33, 0xea, 0x80, 0xd8, + 0x38, 0x3a, 0xca, 0xc6, 0x04, 0xe0, 0xea, 0xd4, 0xe2, 0x62, 0x08, 0x6d, + 0xb2, 0xb5, 0xf8, 0xe4, 0x93, 0x9c, 0xda, 0xbe, 0xbd, 0xcf, 0x1e, 0x34, + 0xf4, 0x69, 0xc0, 0xb6, 0x91, 0x01, 0x72, 0x65, 0xc5, 0xa7, 0xe9, 0xd4, + 0xe2, 0x62, 0x58, 0x56, 0xa0, 0xaf, 0x5c, 0xb6, 0x76, 0x6b, 0x5b, 0x83, + 0xb1, 0xda, 0x46, 0x54, 0xd6, 0x45, 0x16, 0x19, 0xd5, 0xdb, 0x36, 0x14, + 0xcb, 0x5e, 0x1e, 0x0e, 0xd3, 0x29, 0x25, 0x81, 0x58, 0xa3, 0x89, 0xf8, + 0xa4, 0x46, 0x13, 0x69, 0x0c, 0x5c, 0xcb, 0xce, 0x63, 0xa5, 0x88, 0xad, + 0xed, 0xdb, 0xb7, 0xf7, 0x81, 0xcc, 0x1e, 0x78, 0xf0, 0x41, 0xb6, 0x8f, + 0x8e, 0xb2, 0x51, 0xc3, 0xcc, 0xbe, 0xfc, 0xa5, 0x2f, 0x01, 0x23, 0xbc, + 0xf5, 0x7a, 0x17, 0x78, 0x0f, 0x00, 0x7e, 0xb7, 0x04, 0x74, 0x68, 0x5b, + 0x7d, 0xdf, 0x8b, 0xff, 0xf1, 0x45, 0x6e, 0xff, 0x87, 0x11, 0x44, 0xeb, + 0xf6, 0x7f, 0x78, 0x3b, 0xdf, 0xfe, 0xe6, 0xb7, 0xf9, 0xe8, 0xc7, 0x3e, + 0x3a, 0x74, 0x79, 0x76, 0x01, 0x36, 0xda, 0xe2, 0x4a, 0x01, 0xb5, 0x6a, + 0x64, 0x43, 0x70, 0x56, 0xaa, 0x24, 0x54, 0x2b, 0xed, 0x7a, 0xee, 0x6a, + 0x05, 0x6b, 0x99, 0xfd, 0xe9, 0x77, 0x4b, 0x20, 0xfc, 0x68, 0x1d, 0x49, + 0xdb, 0xd7, 0x35, 0x33, 0x40, 0x2d, 0x88, 0x01, 0xb5, 0x00, 0x48, 0x00, + 0xb5, 0x54, 0x98, 0x82, 0x16, 0x15, 0xba, 0x0d, 0x30, 0x60, 0xca, 0x91, + 0x3a, 0xb2, 0xe1, 0x33, 0x76, 0x73, 0x85, 0x85, 0xb6, 0x17, 0x2f, 0xc4, + 0x1b, 0xf3, 0xca, 0xa7, 0xeb, 0x42, 0x13, 0x64, 0x63, 0x21, 0x9c, 0xf0, + 0xe6, 0x8e, 0x4f, 0x21, 0x97, 0x5a, 0xf0, 0xfa, 0x42, 0x68, 0x2e, 0xba, + 0x2d, 0xe4, 0x91, 0x37, 0x11, 0xed, 0x85, 0x08, 0x77, 0x55, 0x53, 0x60, + 0x18, 0x9a, 0x47, 0xad, 0xed, 0xcf, 0x01, 0xf0, 0xf8, 0x93, 0xd9, 0xa0, + 0xb7, 0xba, 0xeb, 0xd1, 0xeb, 0xbe, 0x48, 0x65, 0x7d, 0x85, 0xc7, 0x9f, + 0xfc, 0xd5, 0x4c, 0x9b, 0x86, 0x5f, 0x8d, 0x02, 0x9e, 0x9d, 0xe5, 0xb1, + 0xa3, 0x5f, 0xe5, 0xd1, 0x6f, 0xcd, 0x42, 0xbb, 0x05, 0xdf, 0xd2, 0x70, + 0xab, 0xb6, 0xd5, 0x4e, 0x4d, 0x5d, 0xc7, 0xa5, 0x56, 0xfc, 0x47, 0x6d, + 0xc2, 0x8d, 0x3e, 0xff, 0x4c, 0x66, 0xd9, 0x06, 0x69, 0xa5, 0x40, 0x2d, + 0x40, 0xed, 0xcf, 0xf5, 0x05, 0xb5, 0x7f, 0x8b, 0x7a, 0x5f, 0x9b, 0xf3, + 0xf5, 0x55, 0x08, 0xd4, 0xba, 0x5c, 0xaa, 0xdc, 0x72, 0x3f, 0x8d, 0xa5, + 0x26, 0x75, 0x7d, 0xfd, 0x95, 0xb5, 0xde, 0x7a, 0x65, 0x2f, 0x3b, 0xcb, + 0x1d, 0x4a, 0xc5, 0x0a, 0x9d, 0x6e, 0x8b, 0x52, 0x31, 0x3e, 0xe5, 0xd4, + 0x0e, 0x7b, 0x66, 0x51, 0x72, 0xff, 0x2d, 0x1d, 0xc4, 0x06, 0x81, 0x3c, + 0x2d, 0x11, 0x1b, 0xf4, 0x39, 0x56, 0xaf, 0xcb, 0xd3, 0xfa, 0xfa, 0x5a, + 0xaf, 0xef, 0x7d, 0xa5, 0x44, 0x7b, 0x32, 0x9a, 0xb4, 0x56, 0x76, 0xab, + 0xb4, 0x7d, 0x8f, 0xb2, 0x28, 0xd3, 0xd6, 0xd7, 0x91, 0x66, 0xbd, 0x3c, + 0x57, 0xc7, 0x1f, 0x55, 0x48, 0xd7, 0x5a, 0xd1, 0xa5, 0xd9, 0xf5, 0xf5, + 0xba, 0xa0, 0xd9, 0x95, 0x48, 0xd9, 0xa1, 0xea, 0x56, 0xf0, 0xfc, 0x16, + 0xe5, 0x33, 0xf3, 0xec, 0x70, 0xa5, 0x86, 0x87, 0x55, 0x63, 0xe7, 0xeb, + 0xef, 0x75, 0xdf, 0x62, 0xea, 0xbd, 0x75, 0x7e, 0xd4, 0x3d, 0x3d, 0x14, + 0x00, 0x2a, 0x09, 0x7c, 0x5a, 0xae, 0x6f, 0x8e, 0x5d, 0x47, 0x0f, 0xe1, + 0x1f, 0xa0, 0x1f, 0x3b, 0x11, 0x4f, 0x9f, 0x75, 0xa7, 0x63, 0xc7, 0x0f, + 0x93, 0xd7, 0xdf, 0xe4, 0xba, 0xfc, 0xa8, 0x7b, 0x1a, 0x46, 0xd4, 0xfe, + 0xd5, 0xa7, 0xeb, 0xd8, 0xf9, 0x7a, 0xf6, 0x4b, 0x0b, 0x48, 0x6a, 0xb8, + 0x1a, 0x8f, 0x71, 0x7c, 0xb2, 0xc2, 0x91, 0xb9, 0x16, 0xd5, 0xd1, 0x26, + 0x75, 0xd7, 0xa5, 0xf9, 0xaa, 0xea, 0x5b, 0xc5, 0x6d, 0x02, 0xf9, 0xaf, + 0x05, 0xdc, 0x96, 0x9e, 0xef, 0x4a, 0x40, 0x5a, 0xc3, 0x00, 0xb4, 0xb2, + 0xb4, 0xff, 0x6b, 0xfb, 0x63, 0x80, 0xdf, 0x34, 0x70, 0x55, 0x9a, 0x4d, + 0x12, 0x78, 0x95, 0x4c, 0x6b, 0xdb, 0x5f, 0x0c, 0x90, 0xcb, 0x56, 0x5a, + 0x3e, 0x43, 0xa5, 0x4b, 0xb4, 0xcf, 0x72, 0xc0, 0x17, 0xd3, 0xf6, 0xb1, + 0xf3, 0xb5, 0xee, 0xc3, 0xed, 0xe3, 0x7a, 0xfd, 0x8a, 0x4a, 0x91, 0xeb, + 0x6a, 0x56, 0xda, 0x71, 0x9d, 0xbc, 0xe7, 0xb2, 0x55, 0xe1, 0xca, 0x01, + 0xa6, 0x7e, 0xde, 0x75, 0xa9, 0xdb, 0x5a, 0xed, 0xcf, 0xc4, 0x3d, 0x97, + 0xb9, 0x36, 0xf3, 0x7c, 0xd8, 0x1c, 0xd9, 0x9a, 0xbe, 0xa3, 0xf3, 0x16, + 0x8c, 0x35, 0xa1, 0x5a, 0xac, 0xd1, 0x90, 0x1d, 0x7c, 0xe9, 0xd3, 0x5c, + 0x92, 0xd8, 0x23, 0x48, 0xb5, 0xea, 0x38, 0x4d, 0x4f, 0xd1, 0x3c, 0x86, + 0xf9, 0xe8, 0xc2, 0x30, 0x98, 0x96, 0x95, 0x7e, 0xbc, 0x61, 0x58, 0x89, + 0xd2, 0x32, 0xe3, 0xe5, 0xa5, 0xf4, 0x31, 0xfa, 0xa1, 0xfd, 0xaf, 0xb0, + 0xcf, 0xb5, 0x65, 0x3f, 0x5a, 0x18, 0x16, 0xb0, 0x95, 0x06, 0xd7, 0x6a, + 0x2d, 0x35, 0x35, 0x6c, 0x3e, 0x3e, 0x96, 0x72, 0xbc, 0xeb, 0xb3, 0xc3, + 0x85, 0x56, 0x37, 0x7e, 0x1d, 0x2e, 0xa8, 0x50, 0x1e, 0xa9, 0xe0, 0xb5, + 0x07, 0xdf, 0xad, 0xba, 0xc2, 0xa5, 0xdd, 0xad, 0xc7, 0xc1, 0x54, 0x41, + 0x5b, 0xc7, 0x55, 0xf0, 0xce, 0x1c, 0xd4, 0xeb, 0x75, 0xdc, 0x91, 0x1a, + 0xfe, 0x99, 0x46, 0xc2, 0x83, 0x40, 0x38, 0x15, 0x0c, 0x42, 0x4b, 0xad, + 0x5b, 0x72, 0x3a, 0x34, 0x2c, 0x1f, 0xa5, 0x91, 0x32, 0xad, 0xf6, 0x10, + 0x10, 0x60, 0xa7, 0x60, 0x8d, 0xb3, 0x17, 0xd4, 0x32, 0x84, 0x69, 0x01, + 0x1a, 0xa6, 0xe5, 0x8a, 0x42, 0xec, 0xe3, 0x06, 0x43, 0xc9, 0xe9, 0x44, + 0xe5, 0x76, 0x1a, 0x51, 0x99, 0x9c, 0x0e, 0x8d, 0x33, 0x07, 0xc2, 0xb2, + 0x56, 0xca, 0x75, 0x5a, 0xed, 0x06, 0x31, 0xa0, 0x16, 0x40, 0x60, 0xdd, + 0x53, 0x3a, 0x36, 0x0a, 0x32, 0xd9, 0x36, 0x2d, 0x4a, 0xee, 0x38, 0xad, + 0xa5, 0xec, 0xfa, 0xba, 0x23, 0x35, 0x3c, 0x03, 0x8b, 0x06, 0x5c, 0xa7, + 0x44, 0x1b, 0xbd, 0x3f, 0x47, 0xd4, 0xfe, 0x35, 0xf7, 0xc2, 0x76, 0x1f, + 0x6e, 0x3e, 0xdf, 0x61, 0x58, 0x4e, 0x9e, 0x26, 0x44, 0x79, 0x73, 0x66, + 0x3b, 0x8a, 0x8f, 0x4a, 0xaf, 0x80, 0x50, 0xd3, 0x93, 0x2a, 0x64, 0xda, + 0x8b, 0xc3, 0xa1, 0x22, 0xab, 0xbe, 0x1a, 0xa7, 0xab, 0xaa, 0x80, 0x55, + 0xcc, 0x69, 0x58, 0x96, 0x57, 0x65, 0x46, 0xa7, 0xdc, 0xb3, 0xa7, 0xaa, + 0xe0, 0x5b, 0x54, 0xf1, 0xe6, 0xbc, 0xb0, 0x2c, 0x93, 0x55, 0x98, 0x9e, + 0xac, 0x32, 0x3d, 0x13, 0x41, 0xb2, 0x1e, 0x79, 0x49, 0x63, 0x7b, 0xb6, + 0xa9, 0x91, 0xaf, 0xc9, 0x6a, 0x95, 0x47, 0xfe, 0x4f, 0x07, 0x7e, 0x67, + 0x91, 0xaf, 0xfc, 0x96, 0x02, 0x80, 0x19, 0x4d, 0x56, 0xab, 0x54, 0xf7, + 0xc4, 0x6a, 0xa4, 0x80, 0x55, 0x28, 0x70, 0x55, 0x04, 0x06, 0x53, 0x71, + 0xd5, 0xaa, 0x8a, 0xf5, 0x3c, 0x05, 0xc5, 0x02, 0x0d, 0xcf, 0x9a, 0x81, + 0xaa, 0xb6, 0xc3, 0xd3, 0x79, 0x54, 0x75, 0xbb, 0x55, 0xb5, 0xed, 0x0c, + 0xec, 0x99, 0x8e, 0xfc, 0x4f, 0x4f, 0x47, 0x6d, 0x63, 0xb7, 0x99, 0xe7, + 0xc5, 0xf3, 0x36, 0xc0, 0x2e, 0x5b, 0x36, 0xe4, 0xcb, 0xb4, 0x85, 0x51, + 0x6a, 0x1f, 0x6e, 0x8f, 0x9b, 0x5d, 0x64, 0xb7, 0x29, 0xa5, 0xa4, 0xec, + 0x08, 0xda, 0x29, 0x60, 0xa9, 0xf0, 0x99, 0xe6, 0x65, 0x00, 0x48, 0x5d, + 0x72, 0x99, 0xf2, 0x0f, 0x79, 0x1e, 0x31, 0xd7, 0xd8, 0xbe, 0xdf, 0x56, + 0xe3, 0xf2, 0x76, 0xba, 0xb4, 0xf3, 0x41, 0x12, 0x92, 0x94, 0xa2, 0xd5, + 0x7e, 0x8c, 0xc2, 0x28, 0x6d, 0xdc, 0xcc, 0x7e, 0xce, 0xf5, 0x74, 0x55, + 0xf0, 0xb0, 0x55, 0xb6, 0xdd, 0xc7, 0x88, 0xa0, 0xf5, 0x8e, 0x1a, 0x7f, + 0x5c, 0xd0, 0xeb, 0x04, 0xf1, 0xfb, 0xaa, 0x16, 0x0a, 0xb6, 0x75, 0xdc, + 0xe9, 0xb1, 0x05, 0xa8, 0x39, 0xd0, 0xd4, 0x40, 0xad, 0x31, 0x07, 0x16, + 0x02, 0x9d, 0x8e, 0xe8, 0x83, 0x30, 0x8f, 0xfc, 0x41, 0x9b, 0xcf, 0xfd, + 0x53, 0x97, 0xca, 0x77, 0x7b, 0xb4, 0xe8, 0xb1, 0x1b, 0x05, 0xb8, 0x32, + 0x40, 0xad, 0x31, 0x07, 0xee, 0x45, 0xad, 0x3f, 0x2c, 0xd4, 0xf3, 0xd8, + 0x83, 0x40, 0x3d, 0x90, 0x34, 0xac, 0xf6, 0x6c, 0x39, 0x30, 0x06, 0x8c, + 0x09, 0xbd, 0x8f, 0xac, 0x3e, 0xd9, 0x45, 0xe2, 0x27, 0x9e, 0x3f, 0xba, + 0x12, 0x10, 0x05, 0x7a, 0xb2, 0xa7, 0xcf, 0x91, 0x05, 0x10, 0x19, 0x80, + 0x44, 0xad, 0xe3, 0x56, 0xbb, 0xb4, 0xba, 0xfd, 0xbf, 0xd7, 0x92, 0xa3, + 0x21, 0x5b, 0xa8, 0x73, 0xad, 0x02, 0x74, 0x09, 0x44, 0xd0, 0xa3, 0x13, + 0x88, 0xf0, 0x3e, 0xdb, 0x9c, 0x87, 0x95, 0xad, 0x60, 0x21, 0xd0, 0x6d, + 0x6c, 0x7d, 0x0c, 0xc7, 0x5c, 0xab, 0x1c, 0x37, 0x77, 0xd7, 0x8e, 0xb6, + 0x49, 0x7e, 0xbc, 0xca, 0x7e, 0x2e, 0x9b, 0x58, 0x97, 0x6f, 0xf4, 0x3f, + 0xe7, 0xe2, 0x9b, 0x25, 0xf8, 0xcd, 0x0e, 0x6f, 0x9f, 0xf8, 0x1f, 0x61, + 0x90, 0x0d, 0xc0, 0xba, 0x9c, 0xdb, 0x6b, 0xaf, 0x55, 0x40, 0xad, 0xa9, + 0x29, 0x05, 0xfd, 0x99, 0xd5, 0x00, 0xa9, 0xb5, 0x28, 0x08, 0x95, 0x81, + 0x51, 0xd9, 0xd0, 0xa8, 0xcd, 0x37, 0xdd, 0xcc, 0xd9, 0xb3, 0x67, 0x43, + 0x5f, 0x6b, 0x2a, 0x6b, 0x99, 0xba, 0x69, 0x1d, 0x67, 0xcf, 0x9e, 0x8d, + 0xd9, 0x1b, 0x9f, 0x27, 0x5e, 0x3d, 0xc6, 0x9a, 0xca, 0xda, 0xcb, 0xe2, + 0x93, 0xf3, 0x11, 0x78, 0x2b, 0xe9, 0x73, 0x4d, 0x65, 0x2d, 0xeb, 0xd6, + 0xad, 0x03, 0xe0, 0xac, 0x65, 0x63, 0xa0, 0x5b, 0xc6, 0x7e, 0xd3, 0xa6, + 0x4d, 0xa4, 0xc9, 0x80, 0xbd, 0x6c, 0xa0, 0xd6, 0xb9, 0xf3, 0x17, 0xc2, + 0x32, 0x9c, 0xd3, 0x40, 0x2f, 0x53, 0x2e, 0x53, 0x7e, 0x53, 0x86, 0xb7, + 0x4f, 0xfc, 0x0f, 0xf5, 0xb8, 0xf0, 0x9b, 0xd6, 0x33, 0xcd, 0xc4, 0xb3, + 0x0f, 0xf3, 0x21, 0x32, 0x57, 0x88, 0x10, 0x70, 0xb5, 0xf0, 0x46, 0x83, + 0xb1, 0x0f, 0xa9, 0x71, 0xef, 0xd6, 0x99, 0x56, 0xec, 0xd1, 0x7b, 0x4b, + 0xc3, 0x3e, 0x2b, 0xeb, 0x93, 0xc8, 0x3a, 0x28, 0xbb, 0x2e, 0x6d, 0x0d, + 0xec, 0xdc, 0x72, 0x63, 0x9d, 0xe3, 0xaf, 0x35, 0x2e, 0xa9, 0x2f, 0x5b, + 0x49, 0x5f, 0xde, 0x6b, 0xf3, 0x8c, 0x7f, 0x7c, 0x27, 0x70, 0xa0, 0xcf, + 0xd7, 0xd6, 0x91, 0x3a, 0x47, 0x96, 0x54, 0xfa, 0x87, 0x7e, 0x7f, 0x17, + 0x7c, 0x7e, 0x3f, 0x66, 0x84, 0xeb, 0x9e, 0x5b, 0xab, 0x3c, 0xff, 0x42, + 0x93, 0xda, 0xe6, 0x78, 0x1a, 0xe3, 0x2b, 0x09, 0xd5, 0xda, 0x3a, 0x52, + 0xa7, 0x7a, 0xe3, 0x38, 0x70, 0x90, 0x87, 0x7e, 0x7f, 0x17, 0x8f, 0x7f, + 0x7e, 0x3f, 0xb5, 0xcd, 0x96, 0xaf, 0x43, 0x2d, 0xee, 0xf8, 0x44, 0x2d, + 0x06, 0xf1, 0xca, 0xf4, 0xb5, 0x7e, 0x2c, 0xf4, 0x35, 0x75, 0x63, 0x99, + 0xe6, 0x89, 0x42, 0xdc, 0xd7, 0x0b, 0xcd, 0x3e, 0x5f, 0x7b, 0xbf, 0xdb, + 0x64, 0xeb, 0xa7, 0x76, 0x30, 0xbf, 0x70, 0x9c, 0xf1, 0x0d, 0x0a, 0xbe, + 0xea, 0x9f, 0xee, 0x84, 0x80, 0x40, 0x35, 0x96, 0xd2, 0x0d, 0x8f, 0xe9, + 0x97, 0xbf, 0xff, 0x7d, 0x1c, 0xa0, 0xe5, 0xab, 0x31, 0xf6, 0xda, 0xfa, + 0x09, 0x9a, 0xfa, 0xda, 0x6e, 0x6a, 0xf4, 0xde, 0xbe, 0xb6, 0xba, 0x54, + 0x3a, 0x7a, 0xe6, 0x20, 0xef, 0x79, 0xcf, 0x18, 0x3f, 0x38, 0x75, 0x9a, + 0x0f, 0x6c, 0xdc, 0xc0, 0x99, 0x76, 0xff, 0xd3, 0xbd, 0xf1, 0x5f, 0xfb, + 0x30, 0xf3, 0xdf, 0xf9, 0x5e, 0x5f, 0x78, 0xdd, 0x7e, 0x97, 0x20, 0x45, + 0x0d, 0xfd, 0xae, 0x40, 0x7d, 0xa4, 0x16, 0x5b, 0x37, 0x71, 0x26, 0xbc, + 0x3e, 0x52, 0xa3, 0x29, 0x1b, 0xb4, 0x96, 0x9a, 0x48, 0x19, 0xdd, 0xe1, + 0x4e, 0x8d, 0xde, 0xdb, 0x97, 0x2e, 0xe9, 0x3f, 0x19, 0x9e, 0x1c, 0x57, + 0xcf, 0xca, 0x3f, 0x19, 0x6f, 0xb6, 0x45, 0x51, 0xd2, 0x3c, 0x73, 0x94, + 0x8a, 0x3b, 0xd5, 0xe7, 0xc7, 0x00, 0xb4, 0xce, 0xbf, 0x7d, 0x96, 0xeb, + 0xae, 0x5d, 0x17, 0x03, 0x6a, 0x9d, 0xbe, 0xf0, 0x72, 0xe8, 0xf7, 0xfc, + 0xdb, 0x67, 0x79, 0xf9, 0xfb, 0x01, 0xef, 0xe1, 0x6f, 0xc7, 0x8e, 0xe9, + 0x5c, 0xb9, 0x72, 0xe5, 0xca, 0x95, 0x2b, 0x57, 0xae, 0x5c, 0xb9, 0x72, + 0xe5, 0xca, 0x95, 0x2b, 0x57, 0xae, 0x5c, 0xb9, 0x72, 0xe5, 0xca, 0x95, + 0x2b, 0x57, 0xae, 0x5c, 0xb9, 0x72, 0xe5, 0xca, 0x35, 0xbc, 0x72, 0xa8, + 0x56, 0xae, 0x5c, 0xb9, 0x72, 0xe5, 0xca, 0x75, 0x15, 0x48, 0xb8, 0x25, + 0x84, 0x23, 0xf0, 0xf5, 0x4b, 0x82, 0x05, 0xe1, 0x52, 0x2e, 0xa3, 0xc0, + 0x5a, 0x4e, 0x36, 0x50, 0xab, 0xd3, 0x59, 0xe6, 0x8b, 0xe2, 0xc9, 0x97, + 0x69, 0x53, 0x5e, 0xec, 0x4e, 0x42, 0xb7, 0x92, 0xb6, 0x36, 0x48, 0xcb, + 0x6c, 0x27, 0x81, 0x54, 0x99, 0xf9, 0x0b, 0x01, 0x32, 0x1d, 0x54, 0x15, + 0x6e, 0xcb, 0x7e, 0xff, 0x36, 0xe4, 0x6a, 0x50, 0x39, 0x92, 0x75, 0x10, + 0x8e, 0x08, 0x81, 0x5c, 0x49, 0x88, 0x8a, 0x79, 0x01, 0xdf, 0x8e, 0x4b, + 0xab, 0x47, 0x32, 0x1f, 0x80, 0x4e, 0xca, 0x04, 0x93, 0x98, 0x6f, 0xed, + 0x4f, 0x01, 0x7d, 0x06, 0x2b, 0x04, 0x48, 0x75, 0x23, 0xc0, 0x15, 0x00, + 0x81, 0x00, 0x47, 0x42, 0x20, 0x42, 0x98, 0x52, 0x12, 0x9e, 0x95, 0xa6, + 0x54, 0xf0, 0x96, 0x89, 0xd3, 0xb0, 0x1c, 0xd9, 0x8d, 0x40, 0x5c, 0x36, + 0x58, 0xeb, 0x99, 0xaf, 0x7f, 0x83, 0x89, 0x9b, 0x27, 0x78, 0x5a, 0x03, + 0xb1, 0x8e, 0xbe, 0x7e, 0x9c, 0x89, 0x1b, 0xb6, 0xc4, 0xa0, 0x54, 0x00, + 0x6f, 0xfe, 0xab, 0x3f, 0xea, 0xcb, 0xe7, 0xe9, 0x3b, 0x77, 0x72, 0xfd, + 0xef, 0x3e, 0xcc, 0xc4, 0xcd, 0x13, 0x54, 0x80, 0xbb, 0xbf, 0xbc, 0x1f, + 0x11, 0xc0, 0xf5, 0xbf, 0xfb, 0xb0, 0x32, 0x78, 0x76, 0x7f, 0x9f, 0x9f, + 0x58, 0xfe, 0x19, 0xdb, 0x49, 0xa0, 0x97, 0x0d, 0xc1, 0x1a, 0x56, 0x83, + 0xa0, 0x63, 0x49, 0x19, 0x70, 0x97, 0x9d, 0xc6, 0x94, 0xc9, 0x6e, 0xbf, + 0x61, 0xc1, 0x63, 0xb1, 0x72, 0xe8, 0x5f, 0x83, 0x2b, 0xe8, 0x03, 0x6a, + 0xc9, 0x20, 0x0e, 0xc0, 0xea, 0x38, 0xc9, 0xb4, 0xca, 0xc6, 0x75, 0x22, + 0xf0, 0x58, 0x56, 0x3d, 0x24, 0x32, 0x06, 0x93, 0x33, 0xf9, 0x1a, 0x50, + 0x94, 0x41, 0x9c, 0x74, 0x1c, 0xa8, 0x24, 0xdb, 0x46, 0x94, 0xd9, 0xe9, + 0xa8, 0x09, 0x69, 0x0d, 0xd4, 0x24, 0xc5, 0x7d, 0x42, 0xb2, 0x55, 0x0a, + 0xb6, 0x4a, 0x41, 0xb3, 0x58, 0xc0, 0xef, 0xf6, 0x2c, 0x5f, 0x51, 0xba, + 0x78, 0x19, 0xfa, 0x41, 0x15, 0x7e, 0xb7, 0x97, 0xba, 0x6e, 0xe4, 0x6a, + 0xdf, 0x69, 0x4a, 0x0b, 0x4f, 0xe6, 0x99, 0x0c, 0x4f, 0x2b, 0x83, 0x0d, + 0xd9, 0x32, 0x13, 0x56, 0xc2, 0x09, 0xe7, 0x4e, 0x01, 0xd9, 0x4d, 0x9f, + 0x3c, 0xd6, 0x37, 0x01, 0xe5, 0x12, 0xcd, 0xdd, 0xb9, 0x54, 0x93, 0x80, + 0x42, 0x3f, 0x83, 0x7e, 0xdb, 0x29, 0x7d, 0x73, 0x41, 0x0c, 0x0f, 0x0b, + 0x58, 0x8d, 0x0c, 0xec, 0xca, 0xcf, 0x98, 0x10, 0x9a, 0x15, 0x6e, 0x64, + 0xa7, 0x5d, 0xce, 0x36, 0x99, 0x97, 0x6d, 0xef, 0x5a, 0xfd, 0xb9, 0xab, + 0xfb, 0xe5, 0x41, 0x60, 0xc6, 0xb4, 0xf3, 0xca, 0x4a, 0x65, 0xe0, 0x55, + 0x8b, 0x87, 0x0e, 0xb1, 0xfd, 0xd0, 0x21, 0xfe, 0x09, 0xf0, 0x8f, 0xf4, + 0xdf, 0x4b, 0x29, 0x40, 0x2d, 0x1b, 0x72, 0x35, 0xba, 0x71, 0x23, 0x8b, + 0xa7, 0x4e, 0x2d, 0xeb, 0x7b, 0xa5, 0xe5, 0x31, 0x60, 0xad, 0x61, 0x95, + 0xcc, 0x65, 0x54, 0xff, 0x83, 0x08, 0x74, 0x65, 0xb4, 0x68, 0xa5, 0x31, + 0x7f, 0x69, 0xfe, 0x16, 0x89, 0xc3, 0xb8, 0x0e, 0x13, 0xc1, 0xb5, 0x46, + 0x13, 0xb6, 0x24, 0x6c, 0xd3, 0x20, 0x5e, 0xc3, 0x2a, 0x09, 0xd4, 0x02, + 0xd8, 0xb1, 0x7d, 0x7b, 0xd8, 0xee, 0x4f, 0x3e, 0xf1, 0xc4, 0xd0, 0x87, + 0xf5, 0x7d, 0xc7, 0x14, 0x58, 0x0b, 0xa2, 0x63, 0xe8, 0xae, 0xf9, 0xe1, + 0xcb, 0xe2, 0xa2, 0x26, 0x76, 0x5d, 0x69, 0xb9, 0x0e, 0x34, 0xf5, 0xc4, + 0xb4, 0x15, 0x4f, 0xe4, 0x4d, 0x28, 0xed, 0x6a, 0xf3, 0x99, 0x67, 0x9f, + 0xe9, 0xb3, 0xb9, 0x07, 0xd8, 0x77, 0x71, 0x59, 0xbd, 0x2b, 0xf2, 0x4f, + 0x1c, 0xc4, 0x2d, 0x8f, 0xa9, 0x8d, 0x0c, 0xa0, 0x56, 0xfb, 0xc4, 0x71, + 0xca, 0xae, 0x9e, 0xb0, 0x60, 0x03, 0xb5, 0x8c, 0x46, 0x54, 0x58, 0xf3, + 0xb5, 0xa3, 0xb0, 0x54, 0x82, 0x9b, 0xeb, 0xb0, 0xbe, 0x0e, 0xd2, 0x87, + 0xc5, 0x86, 0x9a, 0x64, 0xbd, 0xbe, 0x0e, 0xdd, 0x0e, 0xb2, 0xdd, 0x84, + 0x91, 0x71, 0x9d, 0xae, 0x82, 0x74, 0x04, 0xb4, 0xad, 0x56, 0x1e, 0x19, + 0x03, 0x9a, 0x74, 0xde, 0x38, 0x48, 0x65, 0x44, 0x4f, 0x2c, 0x4a, 0x02, + 0xb5, 0x32, 0x34, 0x7e, 0x4b, 0xb4, 0x3e, 0xff, 0x4a, 0xb4, 0x9e, 0x9c, + 0xa0, 0x94, 0x65, 0x67, 0xeb, 0xd1, 0x89, 0xbb, 0xe0, 0xe8, 0x57, 0xe1, + 0xbb, 0x47, 0xc1, 0xd3, 0xed, 0xd1, 0xf4, 0xa0, 0x56, 0x8d, 0x8c, 0x96, + 0x2c, 0xec, 0xc2, 0xcd, 0xe3, 0x50, 0xad, 0xc1, 0x91, 0x23, 0x03, 0xcb, + 0x98, 0x26, 0xf7, 0xc6, 0x1d, 0xf8, 0xaf, 0xbd, 0x1b, 0x47, 0xca, 0xdf, + 0x60, 0x89, 0xda, 0xf2, 0xeb, 0x26, 0xc8, 0x89, 0x2f, 0x87, 0xb9, 0x07, + 0x59, 0x7d, 0xb9, 0xc4, 0x70, 0x64, 0x8b, 0x58, 0x92, 0x12, 0x85, 0x4b, + 0x30, 0x82, 0x3d, 0x08, 0xfe, 0xb4, 0x1c, 0x18, 0xea, 0x6a, 0xd3, 0xcf, + 0x53, 0x5d, 0xb2, 0x60, 0x5e, 0xb6, 0xea, 0x37, 0x36, 0x11, 0xce, 0x18, + 0xcd, 0x57, 0x17, 0xf0, 0xbb, 0x1d, 0x5c, 0x16, 0x80, 0x1a, 0xcd, 0x57, + 0x17, 0x18, 0xbb, 0x4d, 0xe5, 0x70, 0xe4, 0xa5, 0x09, 0x76, 0x6c, 0x5b, + 0xa0, 0x17, 0x44, 0x10, 0xa7, 0x5e, 0xd0, 0x4b, 0x85, 0x69, 0x19, 0x40, + 0x89, 0xbc, 0x20, 0x11, 0x6b, 0x44, 0xb8, 0x0c, 0xe3, 0x13, 0x80, 0x2b, + 0x03, 0xbd, 0x82, 0x38, 0x00, 0xcb, 0x06, 0x5d, 0xf5, 0xe5, 0xe1, 0x24, + 0xe0, 0xd2, 0x29, 0xb6, 0xb6, 0x8d, 0x82, 0x4f, 0x6b, 0xbf, 0x21, 0x58, + 0x3a, 0xca, 0xc7, 0x3e, 0x7e, 0xd3, 0x7c, 0x65, 0x95, 0x2b, 0x09, 0xea, + 0xb2, 0xe3, 0xec, 0x7c, 0xd2, 0x14, 0x83, 0x16, 0xf7, 0x54, 0xfb, 0xf4, + 0x02, 0xa8, 0xbc, 0x4f, 0xc4, 0x81, 0x5f, 0x29, 0xc0, 0x17, 0xd3, 0xae, + 0x26, 0x7e, 0x25, 0x10, 0x98, 0xab, 0x45, 0xf6, 0x2f, 0xe7, 0x97, 0x6e, + 0xb9, 0x86, 0x75, 0xdb, 0x7f, 0x21, 0x16, 0xff, 0xff, 0x9d, 0x79, 0x87, + 0xbf, 0xb3, 0xfe, 0x9a, 0x58, 0x98, 0xf7, 0xf9, 0xbf, 0x1e, 0xca, 0xf7, + 0x2f, 0xa5, 0xe4, 0xb1, 0x5a, 0xa5, 0x95, 0x2d, 0x4d, 0x67, 0x0f, 0xfd, + 0x94, 0xbf, 0x7a, 0xe5, 0x9d, 0xa1, 0xfd, 0x5e, 0xde, 0x3b, 0x4b, 0xa5, + 0x0a, 0x2b, 0x83, 0x3c, 0x5d, 0x69, 0xf8, 0x96, 0xb9, 0xba, 0x1a, 0x94, + 0x67, 0x5a, 0x1d, 0x5a, 0x29, 0x61, 0xab, 0xf1, 0xbd, 0x5a, 0xa5, 0xf9, + 0xae, 0x24, 0xd6, 0x97, 0xcb, 0xf7, 0x52, 0x95, 0x2f, 0x0d, 0x52, 0x58, + 0x71, 0xa1, 0xe3, 0xc7, 0x27, 0x0a, 0xd7, 0x46, 0x22, 0xbb, 0xfa, 0xe6, + 0x29, 0x9a, 0x8b, 0x47, 0x57, 0x04, 0xc1, 0x3a, 0xba, 0xe8, 0x33, 0xf1, + 0x02, 0x48, 0x0e, 0xe2, 0xd6, 0x77, 0xf4, 0xc5, 0x8f, 0xdd, 0x38, 0xc5, + 0xc2, 0x6b, 0x2b, 0x07, 0xba, 0xae, 0x46, 0xe2, 0x39, 0x05, 0x3e, 0xdc, + 0x7f, 0xab, 0x2e, 0xff, 0x19, 0xd8, 0x39, 0xbe, 0x33, 0xd3, 0x7e, 0xa5, + 0xe3, 0x14, 0x76, 0x9b, 0xae, 0x06, 0xb0, 0x65, 0xc3, 0xb5, 0xb6, 0x8c, + 0xd5, 0x39, 0xbe, 0x90, 0x84, 0x31, 0xe9, 0x7c, 0x52, 0xe0, 0x5a, 0x97, + 0x5e, 0xa6, 0xa7, 0xc9, 0x9a, 0x5c, 0xef, 0xe2, 0x0a, 0xf3, 0x6b, 0xb4, + 0x7f, 0x0f, 0x75, 0xfd, 0xa7, 0x95, 0xf8, 0xad, 0x34, 0x68, 0x50, 0xa6, + 0x4c, 0x3b, 0x50, 0xbf, 0x33, 0x57, 0x8f, 0x2b, 0x76, 0x12, 0x1f, 0xd4, + 0x50, 0x98, 0xa2, 0x89, 0x70, 0xab, 0xb7, 0xe4, 0x23, 0x10, 0x08, 0x47, + 0xe2, 0xcb, 0x9e, 0x82, 0x66, 0xc9, 0x1e, 0x82, 0x02, 0x52, 0x5f, 0xb1, + 0xb8, 0x4e, 0x01, 0x19, 0x14, 0x90, 0x0e, 0x91, 0xcd, 0x10, 0x35, 0x75, + 0x45, 0x05, 0x5f, 0xee, 0x82, 0x60, 0x21, 0x3a, 0xff, 0x06, 0x25, 0x7a, + 0xfa, 0x59, 0x11, 0x89, 0xb2, 0xae, 0x5e, 0x55, 0x14, 0x7a, 0xa9, 0x42, + 0xc7, 0x57, 0x1f, 0xf8, 0xc8, 0x92, 0xf4, 0x7d, 0x5d, 0xae, 0x95, 0xc1, + 0x35, 0x67, 0x66, 0x60, 0x1a, 0xd8, 0x33, 0x07, 0xd5, 0x49, 0x0f, 0x6f, + 0x0e, 0xaa, 0x93, 0x71, 0x58, 0x93, 0x01, 0x3b, 0xcd, 0xcc, 0x78, 0x61, + 0xd8, 0xf4, 0x34, 0x54, 0xb5, 0x91, 0xb7, 0xc7, 0x63, 0x0f, 0x55, 0xa6, + 0xa7, 0x3d, 0xaa, 0x93, 0x51, 0x1a, 0x0f, 0x8f, 0x49, 0xdb, 0x8f, 0x95, + 0xef, 0x9c, 0xa7, 0xe0, 0x51, 0x1e, 0x2a, 0x7f, 0x03, 0xed, 0x9a, 0xac, + 0xc2, 0x0c, 0x76, 0x1a, 0x2f, 0x5c, 0xce, 0xcc, 0x54, 0xd9, 0x33, 0xe3, + 0xf1, 0x92, 0x69, 0x86, 0x47, 0x6e, 0xe7, 0xa5, 0xdf, 0x02, 0x46, 0x13, + 0x58, 0x78, 0x3d, 0x28, 0x75, 0x2b, 0x87, 0x61, 0x74, 0x1b, 0xb7, 0xc9, + 0xa7, 0x98, 0x36, 0xf5, 0xdd, 0xa3, 0x00, 0x5e, 0x73, 0x9e, 0x17, 0xab, + 0xa3, 0xd9, 0x36, 0xf9, 0x4d, 0x4e, 0x46, 0x00, 0x2b, 0xdb, 0x76, 0x7a, + 0x12, 0x66, 0xe6, 0xb4, 0x2f, 0xbd, 0xf4, 0xa6, 0x61, 0xcf, 0x8c, 0x2a, + 0xbb, 0xa9, 0xa3, 0xb1, 0x9f, 0xf4, 0x14, 0x58, 0xcb, 0xc3, 0x8b, 0x03, + 0xb2, 0xaa, 0x6a, 0xc3, 0x86, 0x90, 0xcd, 0xcd, 0x29, 0xf8, 0xd6, 0xe4, + 0xb4, 0x82, 0x94, 0xa9, 0x36, 0x8e, 0x97, 0x1b, 0xe2, 0x60, 0x2d, 0x1b, + 0x7a, 0xb6, 0x9c, 0x56, 0x0b, 0x70, 0x02, 0xfd, 0x3c, 0x4d, 0xe8, 0x71, + 0x5d, 0xfb, 0xd9, 0x61, 0xf8, 0x11, 0x96, 0x9f, 0xa1, 0x6b, 0xc3, 0x15, + 0x00, 0xb5, 0x20, 0x01, 0xac, 0x4d, 0xa6, 0x4d, 0x01, 0x8c, 0x0d, 0xa5, + 0x34, 0xca, 0xb2, 0xb5, 0x6d, 0xc0, 0x39, 0xab, 0xd5, 0xa3, 0x52, 0xe2, + 0x3b, 0x82, 0x85, 0x70, 0xec, 0x40, 0x40, 0x51, 0x41, 0xac, 0x16, 0x50, + 0x1f, 0x95, 0x81, 0x68, 0xfc, 0xd1, 0xf4, 0x54, 0x6d, 0x2b, 0xcc, 0x80, + 0xb5, 0x5a, 0x80, 0x1f, 0xf4, 0x80, 0x82, 0x02, 0x47, 0x69, 0x9b, 0x31, + 0x47, 0x5d, 0x57, 0xb4, 0x75, 0xfc, 0xee, 0xc7, 0x7a, 0x21, 0x99, 0x79, + 0x8b, 0x53, 0xe0, 0x78, 0xd0, 0xe3, 0xde, 0x40, 0xf9, 0x59, 0x08, 0x60, + 0xb7, 0xce, 0xa7, 0x10, 0x28, 0x78, 0x16, 0x10, 0x03, 0x6a, 0x85, 0xcf, + 0xc1, 0x1c, 0x58, 0x90, 0xea, 0xc3, 0x22, 0xd2, 0x02, 0x6b, 0xb5, 0x03, + 0x10, 0x56, 0x5b, 0x17, 0x28, 0xd0, 0xa2, 0x47, 0x01, 0x35, 0xfe, 0x1b, + 0x81, 0xb5, 0xa0, 0x17, 0x98, 0x06, 0x55, 0x05, 0x32, 0x60, 0xac, 0x74, + 0xd9, 0x38, 0x69, 0xf5, 0x64, 0xaa, 0xe4, 0x08, 0x3a, 0x52, 0xed, 0xeb, + 0x9e, 0xce, 0xdf, 0x80, 0xb6, 0x0a, 0x22, 0x82, 0x6d, 0xe1, 0x94, 0x74, + 0xbe, 0x05, 0x7a, 0xf4, 0x28, 0x58, 0x57, 0xdc, 0x36, 0x60, 0x4e, 0x3a, + 0x82, 0x92, 0xf6, 0x91, 0xf6, 0xbc, 0x29, 0x7c, 0x16, 0x2e, 0x04, 0x13, + 0xc0, 0xe0, 0x91, 0xc4, 0xb8, 0x36, 0xbc, 0xf3, 0x13, 0x4e, 0x5f, 0xf3, + 0xcb, 0x57, 0x6c, 0x09, 0xb0, 0x69, 0xd3, 0xa6, 0x08, 0x7c, 0x75, 0xdd, + 0x9a, 0x18, 0x70, 0x6a, 0xed, 0x75, 0x6b, 0x42, 0xe8, 0xd4, 0xc9, 0x93, + 0x27, 0x59, 0x53, 0x59, 0xcb, 0xec, 0x6c, 0xff, 0x35, 0x9b, 0x0d, 0x9d, + 0x32, 0xb2, 0x81, 0x58, 0x97, 0xcb, 0xe7, 0xda, 0xeb, 0xd6, 0x00, 0x70, + 0xee, 0xfc, 0x05, 0x36, 0x6d, 0xda, 0xc4, 0x85, 0xd6, 0xb9, 0xd0, 0xfe, + 0x42, 0xeb, 0x1c, 0xb3, 0x27, 0x23, 0xe8, 0x96, 0xed, 0x6b, 0xed, 0x75, + 0x6b, 0x42, 0xf8, 0xd5, 0x85, 0xd6, 0x39, 0xd6, 0x54, 0xd6, 0x86, 0x7e, + 0x8d, 0x8c, 0x4f, 0x63, 0x6f, 0x96, 0x76, 0x59, 0x4d, 0x9a, 0xd9, 0xd9, + 0xd9, 0x98, 0xff, 0x4d, 0x9b, 0x36, 0xf1, 0x8d, 0xf6, 0x05, 0x96, 0x93, + 0x2b, 0x04, 0x6d, 0x29, 0x43, 0x80, 0x95, 0xad, 0xb1, 0x0f, 0xd5, 0x69, + 0x9d, 0x89, 0x5f, 0xed, 0x2f, 0xbc, 0xa1, 0xae, 0x0b, 0x3b, 0x4b, 0xad, + 0x3e, 0x7b, 0xa3, 0x2b, 0xed, 0xeb, 0x99, 0xf9, 0x26, 0x0b, 0x6f, 0x34, + 0xf8, 0xf3, 0x8f, 0xef, 0xec, 0x03, 0x57, 0xd9, 0xda, 0x3a, 0x52, 0xcf, + 0x8c, 0x4b, 0xd3, 0x65, 0xf3, 0x25, 0xe2, 0x23, 0x5d, 0x5b, 0xd7, 0x8f, + 0x01, 0x9d, 0xbe, 0xf0, 0x41, 0xef, 0x20, 0xd4, 0x47, 0x6a, 0x0a, 0xac, + 0x35, 0xb6, 0x05, 0x77, 0x43, 0x09, 0x5e, 0x1d, 0xee, 0xae, 0xac, 0x79, + 0x26, 0xbb, 0x37, 0x18, 0xab, 0x4f, 0x85, 0xeb, 0x0b, 0x8d, 0xd9, 0x58, + 0x78, 0x72, 0x3b, 0x69, 0x63, 0xc7, 0x1d, 0x58, 0xd8, 0xab, 0x20, 0x56, + 0xef, 0x19, 0x4b, 0xcd, 0xc7, 0x80, 0xb4, 0xc6, 0x7f, 0xed, 0xc3, 0x21, + 0x6c, 0xeb, 0x07, 0xa7, 0x4e, 0x0f, 0x55, 0x7e, 0x88, 0x03, 0xac, 0x92, + 0xf0, 0x2b, 0xb3, 0x6d, 0x80, 0x5a, 0x76, 0x7d, 0x85, 0xa8, 0x20, 0x65, + 0x8b, 0xd9, 0xc5, 0x67, 0xc2, 0xf5, 0x96, 0xfe, 0x79, 0xd9, 0x80, 0xb1, + 0x34, 0xd0, 0x56, 0x56, 0x9e, 0xcb, 0xd9, 0x36, 0x65, 0x83, 0x96, 0x7f, + 0x14, 0x21, 0xd5, 0xfd, 0x4a, 0xcb, 0x9f, 0xa5, 0x23, 0x55, 0xde, 0x53, + 0xa3, 0xf7, 0xf2, 0xfa, 0x5f, 0x46, 0xe5, 0xbb, 0xee, 0xda, 0x75, 0x31, + 0x3f, 0x3f, 0xfe, 0x49, 0x33, 0x0c, 0x33, 0xeb, 0xff, 0x9d, 0x1f, 0xf6, + 0xe5, 0x97, 0x2b, 0x57, 0xae, 0x5c, 0xb9, 0x72, 0xe5, 0xca, 0x95, 0x2b, + 0x57, 0xae, 0x5c, 0xb9, 0x72, 0xe5, 0xca, 0x95, 0x2b, 0x57, 0xae, 0x5c, + 0xb9, 0x72, 0xe5, 0xca, 0x95, 0x2b, 0x57, 0xae, 0x5c, 0xb9, 0x86, 0x57, + 0x0e, 0xd5, 0xca, 0x95, 0x2b, 0x57, 0xae, 0x5c, 0xb9, 0xde, 0x65, 0x89, + 0xcd, 0x11, 0x0e, 0xc7, 0x75, 0xd5, 0x64, 0xc5, 0x76, 0xd0, 0x03, 0x29, + 0x28, 0x97, 0x53, 0x26, 0x8d, 0x64, 0x01, 0xb5, 0x12, 0x67, 0x75, 0x7b, + 0x72, 0xd1, 0x20, 0x60, 0x95, 0x1d, 0x66, 0x03, 0xb6, 0xd2, 0xc0, 0x54, + 0xc9, 0x34, 0xb6, 0xcf, 0xe4, 0xfa, 0x6a, 0x24, 0x12, 0x93, 0xac, 0xb3, + 0xea, 0x90, 0x8c, 0x1b, 0x54, 0x5e, 0xbf, 0xeb, 0xa7, 0xfa, 0x1a, 0xb6, + 0xbe, 0x00, 0xa5, 0x91, 0x12, 0x6d, 0x33, 0xb1, 0x26, 0x06, 0x84, 0xea, + 0x6f, 0x47, 0xb1, 0x39, 0xbb, 0xfe, 0xe5, 0xf5, 0xae, 0x7a, 0xc1, 0xdb, + 0x7a, 0x19, 0xd2, 0xfe, 0x12, 0xb2, 0x01, 0x6b, 0x59, 0xa8, 0x97, 0x68, + 0xad, 0x98, 0x98, 0x88, 0xda, 0x1d, 0xfe, 0x25, 0x78, 0x91, 0xf8, 0xe2, + 0xb2, 0x79, 0xaf, 0x7b, 0x62, 0xe3, 0x16, 0x70, 0x05, 0xd7, 0xff, 0xee, + 0xc3, 0x3c, 0x8d, 0xde, 0x16, 0xa6, 0x6e, 0x6a, 0x12, 0xed, 0xe3, 0x47, + 0x8e, 0xd0, 0xf0, 0x5a, 0xaa, 0xcc, 0xbe, 0x54, 0x84, 0xa8, 0x84, 0x9e, + 0x3f, 0xa6, 0x5e, 0xfc, 0x9b, 0xd8, 0xb8, 0x45, 0x41, 0xb9, 0x12, 0x92, + 0x01, 0x74, 0x82, 0x08, 0x5e, 0x54, 0xa0, 0x10, 0x83, 0x40, 0xad, 0x46, + 0xa6, 0x3e, 0x11, 0xa4, 0x2c, 0x02, 0x5f, 0xd9, 0x30, 0xac, 0xd4, 0xb4, + 0x09, 0x40, 0x55, 0x5f, 0xfb, 0x84, 0x86, 0x0a, 0x9e, 0x65, 0xe2, 0x93, + 0x60, 0xad, 0xf2, 0xfa, 0x01, 0x93, 0xa4, 0x37, 0x0b, 0xfc, 0x57, 0xe0, + 0xa0, 0x84, 0x9a, 0x23, 0x19, 0x17, 0x82, 0x26, 0x11, 0x4c, 0x2b, 0x74, + 0x93, 0x01, 0xc4, 0x32, 0x36, 0x22, 0x03, 0xe0, 0x25, 0x91, 0x6a, 0x42, + 0x82, 0x86, 0xa5, 0x18, 0xf8, 0x16, 0x80, 0x40, 0x4d, 0x48, 0x91, 0x52, + 0xff, 0x66, 0x8b, 0x82, 0xfd, 0x5d, 0x18, 0x2f, 0x42, 0x2b, 0x20, 0xda, + 0xc7, 0x61, 0x3c, 0xb4, 0x03, 0x19, 0xfb, 0x6d, 0x17, 0x02, 0x49, 0x13, + 0x68, 0xeb, 0xaf, 0xa5, 0xf6, 0xd5, 0xcf, 0x01, 0xbf, 0x6b, 0x4d, 0x36, + 0x2b, 0xf6, 0xdb, 0x84, 0xfe, 0x13, 0xeb, 0x46, 0xed, 0x8c, 0x9f, 0x70, + 0x56, 0x9e, 0x69, 0x3e, 0x62, 0x71, 0x29, 0x65, 0x88, 0xe2, 0xfb, 0x5f, + 0xbe, 0x4e, 0x0b, 0x03, 0xf5, 0x95, 0xf8, 0xa4, 0xc4, 0xe6, 0xec, 0x49, + 0x6b, 0xe5, 0xf5, 0x2e, 0x78, 0xd9, 0x13, 0xcc, 0x2e, 0x06, 0xa4, 0x35, + 0x0c, 0x3c, 0xab, 0x2f, 0x8d, 0xdd, 0xd7, 0x2d, 0x93, 0x77, 0xb2, 0x5f, + 0xb9, 0x58, 0xc9, 0xae, 0xa4, 0x3d, 0x00, 0xe1, 0x60, 0x8e, 0x33, 0xfb, + 0x98, 0xb3, 0xd7, 0xed, 0xb4, 0xf6, 0x31, 0x99, 0xb4, 0x4f, 0xcb, 0x4b, + 0x76, 0x65, 0x68, 0xd7, 0x26, 0x7d, 0x3d, 0x59, 0x16, 0xe3, 0xcb, 0x5f, + 0x6a, 0x23, 0xf4, 0xf9, 0x77, 0xd0, 0x71, 0xbd, 0x61, 0x7d, 0x91, 0x3f, + 0x7e, 0xe2, 0x49, 0x00, 0xae, 0xb1, 0xe6, 0xc7, 0xbf, 0xa3, 0xe7, 0x9e, + 0x9b, 0x30, 0x33, 0x45, 0xf7, 0x77, 0x75, 0xf8, 0x43, 0xd7, 0x3c, 0x99, + 0x69, 0x9b, 0x15, 0x96, 0x15, 0xbe, 0x11, 0x48, 0xe2, 0xb7, 0x36, 0x02, + 0xdf, 0x7f, 0x27, 0x6e, 0xb7, 0xfd, 0x81, 0x07, 0x62, 0x60, 0xad, 0xc5, + 0x53, 0xa7, 0x62, 0x20, 0x2f, 0x5b, 0x06, 0x9e, 0xd5, 0x0f, 0xce, 0x5a, + 0x8c, 0x2d, 0x6d, 0xc0, 0xd6, 0x36, 0xcb, 0x7e, 0x54, 0xc7, 0x1d, 0xd6, + 0xdb, 0xbb, 0xd9, 0x66, 0xf9, 0x5a, 0x64, 0x9b, 0xb5, 0xbd, 0x2d, 0x91, + 0x66, 0x51, 0xc7, 0x98, 0xed, 0x08, 0xbe, 0xb5, 0xa8, 0x97, 0x11, 0x50, + 0x2b, 0xbd, 0xf4, 0xcb, 0x6b, 0x74, 0xe3, 0x46, 0x55, 0xf7, 0xed, 0xdb, + 0x63, 0xe1, 0xd7, 0xac, 0xcf, 0xee, 0x34, 0xca, 0x45, 0x42, 0x92, 0x54, + 0xfb, 0xb1, 0xdb, 0xb9, 0xef, 0xf7, 0xbf, 0x4d, 0xfb, 0xf3, 0x1f, 0x05, + 0xe0, 0xdb, 0xdf, 0x8c, 0xd6, 0x87, 0x55, 0xb2, 0x87, 0xb0, 0xa7, 0x57, + 0x5d, 0x0e, 0xd9, 0x20, 0x2d, 0xff, 0x12, 0x81, 0xb5, 0x40, 0x01, 0xc2, + 0x00, 0x05, 0x81, 0xf5, 0xfd, 0xbe, 0x39, 0x7b, 0x07, 0xb4, 0xcd, 0xca, + 0xa6, 0xdc, 0x5e, 0x7e, 0x95, 0x07, 0x9c, 0x1f, 0xca, 0xae, 0xe0, 0x80, + 0x5f, 0xa5, 0xee, 0x37, 0x29, 0x4f, 0xaa, 0x49, 0x21, 0x85, 0xb9, 0x68, + 0x52, 0x48, 0xaf, 0x5c, 0xa3, 0x3d, 0x37, 0x4b, 0x03, 0x17, 0xda, 0x4d, + 0xca, 0x93, 0x3b, 0xd4, 0xa5, 0xf8, 0x61, 0x0b, 0x00, 0xb5, 0x4d, 0x1d, + 0xf5, 0xcd, 0xc3, 0x07, 0x43, 0xbb, 0xfa, 0x67, 0xee, 0x47, 0xb6, 0x5b, + 0x88, 0x43, 0xc7, 0x95, 0x4d, 0xbb, 0xc1, 0xf8, 0x6f, 0xec, 0x62, 0xfe, + 0x4b, 0x7b, 0xf1, 0xcb, 0x82, 0x4e, 0xbb, 0x40, 0x73, 0x6b, 0x4b, 0xfd, + 0x10, 0xbe, 0x7e, 0x80, 0x4e, 0xbb, 0x45, 0x65, 0xd1, 0xe7, 0xe8, 0x03, + 0x82, 0x89, 0xa5, 0x09, 0xfc, 0xa6, 0xcf, 0x91, 0xc5, 0x32, 0xf5, 0xc5, + 0x06, 0x63, 0x77, 0xea, 0x89, 0x1d, 0xcf, 0x69, 0x90, 0x99, 0xbd, 0x7d, + 0xe7, 0x56, 0x00, 0x1e, 0x7a, 0x40, 0x05, 0x8d, 0x7d, 0x22, 0xea, 0xc3, + 0x26, 0x5e, 0x50, 0x7b, 0xe2, 0xf1, 0xa8, 0x0b, 0xe2, 0xb1, 0x7f, 0xaa, + 0x96, 0xb5, 0x5f, 0x8f, 0xec, 0x76, 0x7c, 0xcb, 0xe7, 0xd1, 0x7f, 0x91, + 0xd1, 0x40, 0x13, 0x77, 0xc1, 0xbf, 0xbc, 0x5f, 0xc1, 0xb2, 0x40, 0x41, + 0xb5, 0xbe, 0x74, 0x90, 0x3f, 0x3c, 0xfe, 0x3c, 0x9f, 0x75, 0x04, 0x1c, + 0xba, 0x78, 0x10, 0x96, 0x01, 0x6a, 0xb9, 0x37, 0xee, 0x60, 0xd7, 0x9d, + 0xf7, 0xf2, 0x6f, 0x7f, 0xef, 0x8e, 0x81, 0x76, 0x83, 0x54, 0x4e, 0xb9, + 0x4e, 0x0d, 0xe3, 0x14, 0xb1, 0x78, 0xd5, 0xe5, 0x2c, 0x97, 0x5d, 0xda, + 0xed, 0xec, 0x5f, 0x77, 0x56, 0xfc, 0xf8, 0x4d, 0x65, 0x5a, 0x67, 0x24, + 0xde, 0x80, 0xb4, 0x2b, 0x51, 0xb5, 0xec, 0x2e, 0xeb, 0xab, 0xb6, 0xc1, + 0x65, 0x4c, 0x5f, 0xba, 0x03, 0xa9, 0xeb, 0xcd, 0xd3, 0x1a, 0xe6, 0x0c, + 0x54, 0x5c, 0x97, 0xca, 0xfa, 0x3a, 0xd2, 0x8f, 0x4f, 0xc2, 0xaa, 0x55, + 0xed, 0xb0, 0x36, 0x42, 0x40, 0xe9, 0xa6, 0x12, 0xdc, 0xe6, 0x82, 0x99, + 0xd8, 0xa6, 0xd7, 0xe5, 0xa4, 0xfe, 0x4d, 0xf9, 0x3e, 0xf2, 0x74, 0xe4, + 0x67, 0xfc, 0x66, 0x0d, 0x90, 0xf3, 0x25, 0xb5, 0x0d, 0x25, 0x90, 0xa8, + 0x25, 0x20, 0x7d, 0x49, 0xfb, 0x74, 0xb4, 0x4f, 0x76, 0x6c, 0x76, 0x91, + 0x52, 0x50, 0xd7, 0xe7, 0xe2, 0x4e, 0x17, 0x6a, 0x1a, 0x08, 0xd7, 0xeb, + 0x36, 0x69, 0x76, 0x23, 0xc0, 0x46, 0xb9, 0x9c, 0x7d, 0x6d, 0xf6, 0xfe, + 0xe2, 0x06, 0xde, 0x4a, 0x69, 0x22, 0xd3, 0x5f, 0xd9, 0xbf, 0x92, 0x24, + 0xd0, 0x69, 0x10, 0xe0, 0xe9, 0x72, 0xf4, 0xdd, 0xcb, 0xe5, 0x3f, 0x68, + 0x9a, 0x6e, 0x32, 0xfe, 0x6f, 0x6a, 0x5d, 0xde, 0x5f, 0xdc, 0x90, 0x99, + 0x67, 0xb9, 0x08, 0xf7, 0x7e, 0x5a, 0xf5, 0xdd, 0x42, 0xb8, 0xb0, 0x5d, + 0xf7, 0x55, 0xdb, 0x6b, 0x08, 0x47, 0x02, 0x75, 0xbe, 0xa8, 0x7f, 0xab, + 0xe2, 0x06, 0x09, 0xfe, 0x38, 0x47, 0x9e, 0x95, 0x6c, 0xbd, 0x4d, 0xdd, + 0xbf, 0xda, 0x40, 0x2d, 0x1b, 0x9e, 0x95, 0x84, 0x3d, 0xa5, 0x01, 0xb5, + 0xd2, 0x20, 0x5a, 0x61, 0x39, 0xac, 0xa5, 0xd1, 0xae, 0x4f, 0xec, 0x64, + 0xff, 0x0b, 0x07, 0xe2, 0xf0, 0x2b, 0x0d, 0xca, 0x1a, 0xc6, 0x26, 0x84, + 0x6b, 0x59, 0xeb, 0x76, 0x3e, 0x26, 0xcc, 0x1d, 0xbd, 0x0b, 0x7f, 0xf1, + 0xab, 0xfd, 0x20, 0x6b, 0xab, 0x5c, 0xc2, 0x81, 0x9d, 0x1f, 0xd7, 0x79, + 0x25, 0x20, 0x5a, 0x36, 0xc4, 0x2b, 0x06, 0xf4, 0xb2, 0xca, 0x63, 0x97, + 0xc5, 0xef, 0x48, 0x3a, 0x7e, 0x87, 0x92, 0x5b, 0xa1, 0xd5, 0x56, 0xc7, + 0x7e, 0x69, 0x4d, 0xa9, 0x0f, 0xdc, 0x15, 0x6b, 0xa3, 0x44, 0xbb, 0x9a, + 0xf5, 0x41, 0xe7, 0xeb, 0xf7, 0x17, 0x37, 0xf0, 0xd3, 0xab, 0xec, 0x02, + 0xc3, 0xc6, 0x54, 0x5d, 0x03, 0xfc, 0x28, 0x01, 0xcc, 0xfa, 0x25, 0xe0, + 0x47, 0xd6, 0xb6, 0xf8, 0x27, 0xbf, 0xc0, 0xf2, 0x68, 0xab, 0xc8, 0x5f, + 0x32, 0x8f, 0xd5, 0xea, 0x1a, 0xe0, 0xbf, 0xfc, 0xb7, 0x77, 0x90, 0x7f, + 0xfc, 0xd3, 0x81, 0x76, 0xce, 0x2d, 0xd7, 0xac, 0x28, 0xbf, 0x8b, 0x29, + 0xdb, 0xa0, 0xe3, 0x7a, 0xc3, 0xfa, 0x22, 0x6d, 0xcf, 0xc7, 0x8c, 0x2c, + 0xd9, 0xb0, 0xa7, 0xe5, 0xa6, 0x0a, 0x5f, 0x49, 0xa0, 0xd6, 0xa0, 0xfc, + 0x2a, 0xd6, 0x9f, 0x1d, 0x96, 0x04, 0x6b, 0xa5, 0xa6, 0x75, 0xa0, 0x22, + 0x60, 0x6f, 0x57, 0x30, 0x7e, 0x99, 0xf0, 0x88, 0xc9, 0xbc, 0xed, 0xb2, + 0x56, 0x80, 0xe3, 0x2c, 0x0f, 0xd6, 0x1a, 0xb6, 0xad, 0x37, 0x0c, 0xba, + 0xe7, 0xaa, 0xba, 0x29, 0x68, 0x74, 0x68, 0xdc, 0x20, 0x18, 0x2f, 0xde, + 0xc3, 0x7c, 0x77, 0x2f, 0x25, 0x04, 0xf3, 0x7f, 0x02, 0x75, 0x19, 0x8d, + 0x75, 0x34, 0x17, 0x57, 0x82, 0x86, 0x88, 0x54, 0x2f, 0x0b, 0x1a, 0x19, + 0x03, 0x51, 0x57, 0x0a, 0xa8, 0xc5, 0x8d, 0x47, 0x91, 0x37, 0x56, 0x01, + 0xd8, 0xf5, 0x7b, 0x1e, 0x0b, 0x9f, 0x29, 0xd3, 0xc0, 0xe7, 0xc0, 0xe9, + 0x03, 0x00, 0x94, 0x5f, 0x96, 0x4c, 0xdc, 0xb9, 0x2b, 0x04, 0x6f, 0xc9, + 0x3b, 0x77, 0xf5, 0x8d, 0x53, 0xaf, 0x04, 0x34, 0x93, 0x06, 0x35, 0x4c, + 0xaa, 0xba, 0x71, 0x1c, 0xef, 0x54, 0x44, 0x8d, 0x36, 0x00, 0x91, 0xf2, + 0x86, 0x6c, 0xa0, 0x56, 0x2c, 0x0f, 0x7d, 0x2e, 0x2d, 0x57, 0xb3, 0xc7, + 0x52, 0x2a, 0xc5, 0x32, 0x36, 0x13, 0x41, 0x06, 0x1d, 0x64, 0xd7, 0x00, + 0xef, 0xf5, 0x35, 0x5d, 0xd0, 0x8e, 0x6d, 0x2b, 0x90, 0x7a, 0x01, 0x05, + 0x17, 0x38, 0x48, 0x04, 0x83, 0x52, 0xf2, 0x65, 0x8b, 0xea, 0xfa, 0x29, + 0xfc, 0xa5, 0x06, 0xbe, 0xf4, 0x11, 0x61, 0x06, 0x55, 0xbd, 0x3c, 0x80, + 0x0c, 0xb6, 0x22, 0x9c, 0x52, 0x98, 0xa7, 0x59, 0xb7, 0x55, 0xaf, 0x6e, + 0xa5, 0xd5, 0x6e, 0xe0, 0xcb, 0x36, 0xf5, 0x6a, 0x9d, 0x56, 0xdb, 0x86, + 0xef, 0x4f, 0x80, 0x63, 0xb5, 0x81, 0x53, 0xd7, 0x79, 0xf7, 0xc0, 0x29, + 0x84, 0x4b, 0x75, 0x6e, 0x2c, 0xe8, 0x72, 0xeb, 0xa1, 0x73, 0x09, 0xd2, + 0x29, 0x0c, 0x71, 0x1f, 0x6e, 0x21, 0x0a, 0x9d, 0x06, 0x04, 0xe0, 0x4b, + 0x1f, 0x57, 0x9f, 0x47, 0x0b, 0xae, 0x8b, 0xaf, 0xcf, 0xaf, 0x76, 0x59, + 0x5d, 0xbf, 0x92, 0xe6, 0x2c, 0x54, 0x7a, 0x7d, 0xab, 0xd8, 0x6d, 0x58, + 0x1a, 0x71, 0x13, 0xf5, 0xcd, 0xf6, 0x61, 0xaf, 0x57, 0x8a, 0xd9, 0xd7, + 0xe1, 0x1b, 0xd6, 0x17, 0xe9, 0x5c, 0x75, 0x23, 0x02, 0xb9, 0x56, 0xab, + 0x81, 0x7d, 0x78, 0x11, 0xfc, 0xb2, 0x58, 0xd5, 0x00, 0x90, 0x0d, 0x77, + 0x72, 0x1d, 0x91, 0x7a, 0x2e, 0x48, 0x95, 0x7d, 0x3c, 0xbd, 0xdb, 0x6f, + 0x38, 0xad, 0xf4, 0x19, 0xa8, 0xb9, 0x9e, 0xf6, 0xfd, 0xf4, 0xf1, 0xfa, + 0x15, 0x82, 0xb9, 0xfa, 0x34, 0xe0, 0xd4, 0x20, 0x8a, 0x2e, 0xb2, 0x3b, + 0x78, 0x47, 0x0d, 0xba, 0x0e, 0x17, 0x9b, 0xd5, 0x33, 0xdb, 0x31, 0x49, + 0x08, 0xd5, 0xaa, 0x04, 0xe0, 0x22, 0x69, 0x38, 0x82, 0xb1, 0x40, 0xe2, + 0x0b, 0x41, 0xcf, 0x91, 0x14, 0x02, 0x81, 0x4b, 0x04, 0xae, 0xaa, 0x40, + 0x08, 0xce, 0xda, 0xe1, 0x40, 0x93, 0x02, 0x9d, 0x00, 0xea, 0x8e, 0xba, + 0xe7, 0x5b, 0xd0, 0x30, 0x2d, 0x05, 0xbe, 0x52, 0x90, 0xac, 0x31, 0xfd, + 0x91, 0x80, 0x9e, 0xd4, 0xd7, 0x28, 0x01, 0xb4, 0xe8, 0xb1, 0x45, 0x9f, + 0x6f, 0x3a, 0x81, 0xba, 0x5e, 0x6a, 0x05, 0x40, 0x51, 0x5d, 0x93, 0x8c, + 0xe9, 0x3c, 0x16, 0x9c, 0xf4, 0x75, 0xd5, 0x4f, 0xcb, 0xd8, 0x6f, 0xc8, + 0x45, 0x20, 0x05, 0xa0, 0x9f, 0x19, 0xb8, 0xf4, 0x14, 0xce, 0x46, 0x3f, + 0xc7, 0x2c, 0x08, 0xd5, 0xe7, 0x4d, 0x04, 0x06, 0x4a, 0xa5, 0x60, 0x5a, + 0x90, 0x04, 0x6a, 0xa9, 0x4e, 0x3f, 0xdc, 0xad, 0xfa, 0x99, 0x9d, 0x01, + 0x5b, 0xf5, 0xa4, 0xa4, 0x87, 0x54, 0xbd, 0x7d, 0x20, 0xe9, 0x39, 0x82, + 0x2d, 0x0e, 0x34, 0x75, 0x5d, 0x42, 0x84, 0x8e, 0x05, 0xd4, 0x72, 0x65, + 0x0f, 0x12, 0x1f, 0x47, 0x49, 0xfe, 0x6e, 0x3a, 0x40, 0x89, 0x38, 0x84, + 0xba, 0xa4, 0xc3, 0x2b, 0x81, 0x5a, 0x42, 0x1c, 0xa8, 0x55, 0x82, 0x81, + 0xcf, 0xaf, 0xaf, 0xdd, 0xfc, 0x2b, 0xf0, 0x97, 0x99, 0xd1, 0x97, 0x45, + 0xbf, 0x28, 0xb7, 0x70, 0xf2, 0xa4, 0x1a, 0x3b, 0xdd, 0x54, 0x81, 0xcd, + 0x37, 0xdd, 0xcc, 0xd9, 0xb3, 0x67, 0xc3, 0x6d, 0x50, 0x70, 0x2b, 0x03, + 0x97, 0x32, 0x10, 0x29, 0xb3, 0x0d, 0xb0, 0x6e, 0xdd, 0xba, 0x10, 0x76, + 0x65, 0x83, 0xad, 0x8c, 0xed, 0xe5, 0xf4, 0x69, 0xa7, 0x35, 0x70, 0xac, + 0x4d, 0x15, 0x62, 0x70, 0xad, 0x4d, 0x9b, 0x36, 0x85, 0xfe, 0xa6, 0x6e, + 0x4a, 0xf7, 0xbb, 0x96, 0x73, 0x6c, 0xbe, 0xe9, 0x66, 0x80, 0x58, 0x59, + 0x8d, 0xcf, 0x24, 0x74, 0x6b, 0x6a, 0x6a, 0x2a, 0xb4, 0x9b, 0xba, 0x69, + 0x1d, 0x27, 0x5e, 0x3d, 0x16, 0x03, 0x7b, 0x9d, 0x3c, 0x79, 0x92, 0x6b, + 0xff, 0x5e, 0xf6, 0x67, 0x4a, 0xca, 0x45, 0x38, 0xf0, 0x46, 0x83, 0xb2, + 0xdb, 0x7f, 0xfd, 0x56, 0x2d, 0xf7, 0x87, 0x2d, 0xbc, 0xd1, 0xa0, 0x32, + 0x39, 0x1e, 0x6e, 0x7b, 0x6d, 0x3f, 0x66, 0xb7, 0xb0, 0x42, 0x5f, 0x63, + 0x1f, 0x8a, 0xa0, 0x54, 0xc3, 0xfa, 0xf2, 0xda, 0x3e, 0xa5, 0x91, 0xf8, + 0xf5, 0x8f, 0x6d, 0xd7, 0x3a, 0xdd, 0x62, 0xdf, 0xcb, 0x1e, 0xf7, 0xdc, + 0x5a, 0x0d, 0xc3, 0xb6, 0xd4, 0xaf, 0xa7, 0x79, 0x42, 0x3d, 0x6f, 0x6e, + 0xca, 0xe8, 0xb9, 0xf3, 0xbe, 0x97, 0x3d, 0xb6, 0xd4, 0xaf, 0x8f, 0xf9, + 0x52, 0x70, 0xab, 0x65, 0x7c, 0x79, 0x2d, 0xbc, 0xd7, 0xe6, 0x23, 0x5f, + 0x42, 0xb0, 0xef, 0xe5, 0xc6, 0x8a, 0x7c, 0xd5, 0xaa, 0x9d, 0xb8, 0x2f, + 0xbf, 0x41, 0x4d, 0xa3, 0x08, 0x93, 0x79, 0x26, 0x7d, 0xfd, 0xe1, 0x03, + 0xbb, 0xf8, 0xec, 0x93, 0xfb, 0x29, 0xdf, 0x50, 0x63, 0xc7, 0x58, 0x4d, + 0xb7, 0x41, 0x0d, 0x8a, 0xe9, 0x00, 0xb0, 0x5b, 0x3f, 0xf8, 0x41, 0x5e, + 0x39, 0xf7, 0x5a, 0x6a, 0xdc, 0xec, 0xa2, 0x7a, 0xce, 0xf0, 0xd0, 0xc7, + 0xbf, 0xda, 0x17, 0x67, 0x03, 0xb6, 0x92, 0xdb, 0x7b, 0xbf, 0xa5, 0x3e, + 0xac, 0x26, 0x65, 0x8b, 0xda, 0xfa, 0x89, 0x18, 0xb8, 0x6a, 0xac, 0x3e, + 0x45, 0xcb, 0x7a, 0xbe, 0xff, 0x81, 0x8d, 0xea, 0xbe, 0x7f, 0x7d, 0x79, + 0x94, 0x33, 0xed, 0x45, 0xe6, 0xbf, 0xf3, 0x3d, 0xc6, 0x7f, 0xed, 0xc3, + 0x40, 0x04, 0xd7, 0x5a, 0x5f, 0x1e, 0x8d, 0x41, 0xb5, 0x92, 0x79, 0x67, + 0xe9, 0xc0, 0xc2, 0x5e, 0x9a, 0x67, 0x8e, 0x86, 0x80, 0x2c, 0xbb, 0x2e, + 0x26, 0xce, 0x56, 0x65, 0xa4, 0x46, 0x53, 0xc3, 0xd8, 0x8c, 0xfd, 0x4a, + 0xf3, 0xcc, 0x2a, 0x47, 0x6b, 0xa9, 0x89, 0x94, 0xad, 0x58, 0x5b, 0xa6, + 0x95, 0xc1, 0x2e, 0xeb, 0xec, 0xe2, 0x33, 0xa1, 0xfd, 0x53, 0xff, 0xcf, + 0x67, 0x42, 0x9b, 0x0d, 0x6b, 0x6e, 0xe5, 0x03, 0x1b, 0x37, 0x84, 0x6d, + 0x62, 0xaf, 0xff, 0x9d, 0x0f, 0x5e, 0xcb, 0x02, 0x6f, 0xaf, 0xba, 0xac, + 0xb9, 0x72, 0xe5, 0xca, 0x95, 0x2b, 0x57, 0xae, 0x5c, 0xb9, 0x72, 0xe5, + 0xca, 0x95, 0x2b, 0x57, 0xae, 0x5c, 0xb9, 0x72, 0xe5, 0xca, 0x95, 0x2b, + 0x57, 0xae, 0x5c, 0xb9, 0x72, 0xe5, 0xca, 0xf5, 0xf3, 0xae, 0x77, 0xfb, + 0x95, 0xb3, 0x5c, 0xb9, 0x72, 0xe5, 0xca, 0x95, 0xeb, 0xe7, 0x57, 0xdb, + 0xad, 0x49, 0x0b, 0xfa, 0x85, 0x69, 0xdf, 0xf7, 0xfb, 0xce, 0xce, 0xb2, + 0x2b, 0xe3, 0x93, 0x11, 0xa4, 0x18, 0x6a, 0x02, 0x4d, 0x12, 0x76, 0x05, + 0xd1, 0x04, 0xa4, 0x34, 0x98, 0xd4, 0x20, 0x3b, 0x3b, 0x2c, 0xcd, 0xd6, + 0xbc, 0xd0, 0x6b, 0xd6, 0x05, 0x2b, 0xff, 0xf2, 0x71, 0xf8, 0x95, 0xdd, + 0x40, 0xe2, 0x16, 0x5d, 0x64, 0x57, 0x0e, 0xac, 0x83, 0xdd, 0x06, 0x49, + 0x48, 0x56, 0x5a, 0x1d, 0xec, 0xaf, 0x31, 0x2f, 0x67, 0x6b, 0x87, 0x0d, + 0x2c, 0x73, 0xa2, 0x1d, 0x85, 0x10, 0xd1, 0xfb, 0xeb, 0xdb, 0x3b, 0xf0, + 0x82, 0x5a, 0x75, 0x6f, 0xb0, 0x7c, 0x99, 0x7a, 0x5a, 0x80, 0x17, 0x03, + 0x9c, 0x2a, 0x39, 0x25, 0x35, 0x51, 0xd5, 0x86, 0x69, 0xad, 0xf0, 0x6a, + 0x2d, 0x06, 0x9f, 0x31, 0xfb, 0xc0, 0x02, 0x43, 0x01, 0x48, 0x07, 0xbe, + 0xf2, 0xdb, 0xbb, 0xb8, 0xef, 0x59, 0x35, 0x49, 0xeb, 0x8e, 0x9b, 0x27, + 0xb4, 0x1d, 0x7a, 0xd2, 0x8f, 0xda, 0x3c, 0xfa, 0xba, 0x7a, 0x99, 0x79, + 0xe2, 0x86, 0x2d, 0x1c, 0x3d, 0x76, 0x94, 0x37, 0xff, 0xd5, 0x1f, 0x71, + 0xdf, 0x73, 0x6a, 0xa2, 0xd7, 0x7d, 0x5f, 0xda, 0xcf, 0xd3, 0xc4, 0x27, + 0x09, 0x4a, 0x07, 0x48, 0x00, 0xab, 0x0c, 0x50, 0xab, 0xe4, 0x94, 0x96, + 0x07, 0x83, 0xa5, 0xc1, 0xa3, 0x6c, 0x98, 0x95, 0x5d, 0x1f, 0x27, 0x3d, + 0x8d, 0xec, 0xca, 0xb0, 0xf5, 0x4c, 0xbe, 0x49, 0x8d, 0x8d, 0x56, 0x58, + 0x58, 0x6c, 0x29, 0x1f, 0x16, 0x38, 0xcb, 0xa4, 0xef, 0x04, 0x1d, 0x4a, + 0x94, 0x62, 0xf1, 0xa6, 0x2e, 0xf6, 0x84, 0x62, 0x23, 0xf7, 0x06, 0x01, + 0x47, 0xf4, 0x86, 0x75, 0x5c, 0x77, 0x1c, 0x35, 0xd1, 0xb8, 0xec, 0xf8, + 0x98, 0xd7, 0x48, 0x5b, 0x29, 0xfb, 0x53, 0x0e, 0x98, 0xf5, 0x30, 0x2c, + 0x90, 0x49, 0x06, 0x7a, 0x0e, 0x8b, 0xa3, 0x41, 0x5d, 0x09, 0x70, 0x97, + 0xb1, 0x69, 0x38, 0x65, 0xc6, 0xf4, 0x54, 0x95, 0xf1, 0x22, 0xcc, 0x77, + 0xc1, 0x0f, 0xbf, 0xb4, 0xad, 0x26, 0x7f, 0x6d, 0x95, 0x82, 0x9e, 0x03, + 0x8d, 0xa2, 0xa4, 0xdc, 0x2d, 0xc7, 0xe1, 0x59, 0x29, 0x72, 0x8b, 0x65, + 0xfc, 0x94, 0xe9, 0x2f, 0x6e, 0xca, 0x24, 0x2b, 0x51, 0x2c, 0x20, 0xbb, + 0xbd, 0xfe, 0x70, 0x51, 0xc0, 0x4f, 0x84, 0x4b, 0xd9, 0xa6, 0x3c, 0x52, + 0xc3, 0xef, 0xf6, 0x90, 0xb2, 0x8d, 0x10, 0xe5, 0x81, 0x60, 0xad, 0x78, + 0x3e, 0xfd, 0x93, 0x7a, 0xec, 0x89, 0xdc, 0x00, 0xee, 0x48, 0x0d, 0xd9, + 0xed, 0x68, 0xfb, 0x52, 0xb8, 0x1e, 0xe5, 0xef, 0xe3, 0xba, 0x65, 0xa4, + 0x94, 0xf1, 0xe3, 0xfa, 0xeb, 0x3a, 0xfd, 0x0d, 0xe9, 0xfb, 0xe6, 0xa2, + 0x21, 0x5a, 0x57, 0xf0, 0x0e, 0x2d, 0x0b, 0x3c, 0x97, 0x05, 0xa6, 0xcb, + 0x82, 0x70, 0x0d, 0x03, 0xf9, 0xb3, 0x6d, 0xb2, 0xd6, 0x57, 0x9a, 0xf6, + 0x62, 0xf2, 0x08, 0x61, 0x79, 0x45, 0x01, 0x8e, 0x88, 0x41, 0xb6, 0x20, + 0x7e, 0x5c, 0xbf, 0xef, 0x86, 0x68, 0x66, 0xd1, 0x6a, 0x61, 0x45, 0x1f, + 0xb6, 0x6f, 0x00, 0x00, 0x20, 0x00, 0x49, 0x44, 0x41, 0x54, 0x58, 0x17, + 0x0b, 0xd3, 0x32, 0x61, 0x1f, 0xd4, 0x61, 0x8f, 0x03, 0x0f, 0xe9, 0xf0, + 0x0f, 0x5e, 0xd3, 0x6f, 0xbb, 0xe3, 0xc1, 0xbe, 0x2a, 0x2f, 0xab, 0x08, + 0x69, 0x15, 0x81, 0xb4, 0x0e, 0xeb, 0xb5, 0x6d, 0x7a, 0x7d, 0x14, 0xd8, + 0xc6, 0xb6, 0x58, 0xba, 0x45, 0x16, 0xc3, 0xb8, 0xc3, 0xc0, 0x53, 0x1c, + 0xd6, 0xfe, 0xd0, 0x6b, 0x87, 0x43, 0x70, 0x97, 0x0d, 0xef, 0x32, 0x40, + 0x2d, 0xf3, 0x37, 0x1a, 0x86, 0x93, 0xf0, 0x0f, 0xd9, 0x53, 0x40, 0x86, + 0xd3, 0x20, 0xa8, 0xd8, 0xfb, 0x6e, 0x28, 0xc2, 0xac, 0x6a, 0x60, 0xb7, + 0xd8, 0x3f, 0xa1, 0xf4, 0xdb, 0xdf, 0xfc, 0x36, 0x1f, 0xfd, 0x58, 0x04, + 0xd1, 0xfa, 0xe8, 0xc7, 0x3e, 0xda, 0x17, 0x96, 0xa5, 0x2c, 0xc0, 0xd4, + 0x72, 0x80, 0x91, 0x8b, 0x91, 0x9b, 0xd1, 0x87, 0xac, 0x16, 0xac, 0xe5, + 0x13, 0xc1, 0xb4, 0x42, 0x5f, 0xae, 0x8b, 0xaf, 0xa1, 0x5a, 0x82, 0xa8, + 0x8e, 0x3e, 0x30, 0x06, 0x2c, 0xac, 0x3c, 0x9b, 0x2b, 0x22, 0xb7, 0xd8, + 0x09, 0x27, 0xd0, 0xa9, 0x7d, 0x1d, 0x4d, 0x50, 0x53, 0x30, 0xac, 0x16, + 0xb5, 0x13, 0x6a, 0xd2, 0x74, 0x4f, 0x03, 0xb6, 0x42, 0xa0, 0x96, 0xb6, + 0x11, 0x7e, 0x8b, 0xc2, 0x6b, 0xba, 0x86, 0x1a, 0xa6, 0xd5, 0x6a, 0xb7, + 0x90, 0xaf, 0x2d, 0xc4, 0xed, 0x9e, 0x3c, 0x40, 0xed, 0xb5, 0xe3, 0xf0, + 0xa9, 0x2d, 0x70, 0xd3, 0x56, 0xe8, 0x4e, 0xb0, 0xef, 0xae, 0xdd, 0xec, + 0xf8, 0xf7, 0x4f, 0xc3, 0x91, 0xc7, 0x99, 0xaf, 0xb5, 0x18, 0x0f, 0xa6, + 0xa8, 0x1d, 0x52, 0x93, 0x2b, 0x4a, 0x9f, 0xbe, 0x1f, 0xce, 0xb4, 0xa9, + 0x2c, 0x34, 0x39, 0xe8, 0xee, 0xc5, 0xf7, 0x44, 0xe8, 0xcb, 0x3d, 0xdd, + 0xa4, 0xf6, 0xb2, 0x9e, 0xe8, 0xaf, 0x81, 0x5a, 0xcd, 0xd3, 0x4d, 0xe6, + 0x71, 0x79, 0x68, 0x7d, 0x85, 0xbd, 0xff, 0xec, 0x57, 0xd9, 0x77, 0xb8, + 0xaa, 0xe2, 0x1f, 0x83, 0xba, 0xeb, 0x85, 0xf5, 0x1a, 0xbf, 0x45, 0xfd, + 0x01, 0x71, 0xbb, 0xdf, 0xeb, 0xb7, 0x6b, 0x1c, 0xce, 0x68, 0xb8, 0xdf, + 0xdb, 0x0b, 0xff, 0xf9, 0x1b, 0x0a, 0xa0, 0x55, 0xab, 0xc2, 0x4d, 0x2d, + 0x3e, 0xbb, 0xe5, 0x0e, 0x15, 0xb6, 0x7d, 0x47, 0x3f, 0x58, 0xab, 0x56, + 0x05, 0xd2, 0x27, 0xf3, 0xa4, 0xc9, 0x80, 0xb2, 0xfc, 0xd7, 0x0e, 0xf2, + 0x6f, 0x35, 0x5c, 0x2b, 0x0d, 0x9e, 0xb5, 0x1c, 0x50, 0xcb, 0x96, 0x7d, + 0x2c, 0x27, 0xcf, 0xd7, 0xe5, 0x11, 0x41, 0x7b, 0x69, 0xf8, 0xfb, 0x14, + 0x03, 0xcb, 0x1a, 0x04, 0xd4, 0x02, 0x32, 0xe3, 0xe7, 0x5f, 0x8d, 0xae, + 0x5d, 0x86, 0x01, 0x62, 0x2d, 0x67, 0x33, 0x0c, 0x9c, 0xcb, 0x15, 0xfa, + 0x3a, 0xc6, 0x82, 0xfe, 0xf4, 0xad, 0x3b, 0xd6, 0x91, 0xed, 0xee, 0x00, + 0xff, 0x20, 0x62, 0x64, 0x47, 0xdc, 0x91, 0x7f, 0x10, 0xe1, 0x9a, 0xab, + 0x7d, 0x5d, 0x0f, 0x57, 0x03, 0xb5, 0xcc, 0xc4, 0x35, 0xbd, 0x1e, 0x82, + 0x0c, 0x46, 0x5c, 0x42, 0xd4, 0x46, 0x91, 0x88, 0xe6, 0xe5, 0x5a, 0x80, + 0x5e, 0x1d, 0x26, 0x5c, 0x01, 0xd1, 0xbc, 0x29, 0xa4, 0x14, 0x08, 0x21, + 0x91, 0x52, 0xed, 0xb3, 0x52, 0x51, 0x22, 0x65, 0x8f, 0x5e, 0x20, 0x29, + 0x14, 0x6b, 0x40, 0x3f, 0x78, 0xd5, 0x3e, 0x5f, 0x7f, 0xb8, 0xf8, 0xbe, + 0xcc, 0x36, 0x49, 0x42, 0x00, 0x87, 0x8d, 0x1f, 0x04, 0xa6, 0xba, 0x9c, + 0x1a, 0x54, 0x5e, 0x01, 0x74, 0x4a, 0x25, 0xae, 0xbb, 0xee, 0x3a, 0x3a, + 0xe7, 0xcf, 0x53, 0xea, 0x74, 0xfa, 0xe2, 0x7f, 0x96, 0xea, 0xb2, 0xdc, + 0x7e, 0x31, 0xfa, 0x70, 0xf1, 0x7d, 0xfc, 0xb9, 0xbe, 0x1e, 0xb2, 0x8f, + 0xf1, 0xbd, 0x7e, 0x8b, 0x5d, 0x23, 0x15, 0x44, 0xe0, 0xb3, 0x4f, 0x4a, + 0xee, 0x11, 0x02, 0x84, 0xa0, 0x42, 0xff, 0x39, 0x78, 0xd6, 0xf5, 0xd9, + 0xb1, 0xad, 0xc1, 0xec, 0xd8, 0x04, 0x53, 0x0b, 0xd1, 0xd9, 0x2a, 0x09, + 0x1d, 0xb1, 0xc3, 0xc4, 0x1a, 0x11, 0x82, 0xa8, 0xfc, 0x01, 0x93, 0xd1, + 0x43, 0x68, 0x95, 0xd3, 0x0f, 0x9f, 0x02, 0x38, 0xf0, 0xf5, 0x03, 0xe9, + 0xe9, 0xac, 0xfb, 0xcb, 0x41, 0x36, 0x69, 0xb0, 0x2b, 0x7b, 0xdb, 0x2d, + 0x0a, 0xfc, 0xae, 0x44, 0x7a, 0xfd, 0x13, 0x22, 0x93, 0xe5, 0x02, 0x62, + 0xf0, 0xae, 0xb4, 0xf2, 0x24, 0xd7, 0xb3, 0x7c, 0xb6, 0x7c, 0x9f, 0x8a, + 0x5b, 0xa1, 0xe5, 0xfb, 0xb8, 0x45, 0xd5, 0x5f, 0x34, 0x9b, 0x2d, 0xea, + 0xf5, 0x74, 0xb8, 0x8a, 0x5b, 0x74, 0xf1, 0xbb, 0x7e, 0x6a, 0x9b, 0x47, + 0x36, 0xd1, 0xfe, 0x1d, 0x74, 0x5c, 0xe7, 0xfa, 0xd9, 0x97, 0x7d, 0x5c, + 0xdb, 0xf7, 0x5c, 0xa0, 0xce, 0x24, 0x15, 0x6b, 0x99, 0x8c, 0x5b, 0x8d, + 0x8c, 0x9f, 0xcb, 0x0d, 0xdf, 0x6a, 0xad, 0x36, 0x0f, 0x47, 0x01, 0x20, + 0x16, 0xba, 0x97, 0xb8, 0x40, 0xcb, 0xc8, 0x94, 0xd5, 0xb4, 0xf7, 0x16, + 0x86, 0x03, 0x80, 0x2d, 0x27, 0x7b, 0xbf, 0xc5, 0xee, 0xb9, 0xd2, 0xc6, + 0x52, 0xbe, 0xa6, 0xfb, 0xbf, 0x4f, 0xed, 0x64, 0xec, 0x75, 0x68, 0xfa, + 0xfb, 0x28, 0x53, 0xc0, 0x6b, 0xb7, 0x14, 0x10, 0xe3, 0x22, 0xc7, 0x49, + 0x26, 0x3e, 0xa4, 0xfa, 0x71, 0xf7, 0x4e, 0x17, 0x71, 0xe2, 0x72, 0xe2, + 0x8d, 0xb3, 0x25, 0x37, 0xc7, 0xc1, 0x5d, 0xf2, 0x5f, 0x56, 0xa9, 0xbf, + 0x36, 0x41, 0xdd, 0x66, 0xcc, 0xdd, 0xa9, 0xe3, 0xee, 0xdc, 0x95, 0xe9, + 0xe7, 0x52, 0x40, 0xb6, 0x0c, 0x5c, 0xcb, 0x00, 0xb5, 0x7a, 0x32, 0x82, + 0x69, 0x81, 0x02, 0x99, 0x34, 0x4f, 0x2d, 0x0f, 0xd4, 0x4a, 0x93, 0x7d, + 0x6d, 0xb6, 0xa5, 0x98, 0x7e, 0x2e, 0x10, 0x4e, 0x09, 0x51, 0x2c, 0x41, + 0xd7, 0x85, 0xc0, 0x8b, 0x22, 0x9c, 0x32, 0x04, 0x25, 0xa0, 0xa6, 0xae, + 0x67, 0x83, 0x0e, 0x11, 0x04, 0xca, 0x8b, 0xf9, 0x70, 0x45, 0x05, 0xe9, + 0xfb, 0x1a, 0x40, 0x55, 0xa6, 0xe4, 0xba, 0xb4, 0xbb, 0x15, 0xf5, 0x8c, + 0x25, 0xa8, 0x01, 0x0d, 0x84, 0x53, 0x52, 0x3e, 0x82, 0x12, 0x42, 0xe8, + 0x75, 0xad, 0x36, 0x6d, 0x70, 0xa0, 0xb7, 0xe4, 0x2b, 0x48, 0x95, 0x28, + 0xd3, 0xf3, 0xd5, 0x7a, 0x9f, 0x74, 0xba, 0x10, 0x76, 0xe5, 0x14, 0x10, + 0x81, 0x82, 0x66, 0x99, 0x0f, 0x1b, 0xb8, 0x7a, 0x2c, 0xd0, 0x97, 0xfa, + 0xbe, 0xdb, 0x51, 0x1f, 0x51, 0x48, 0xdd, 0x3b, 0x4e, 0xc7, 0x5a, 0x5a, + 0x1f, 0x54, 0x09, 0x24, 0x38, 0x1d, 0x5c, 0x31, 0x86, 0x2f, 0x7d, 0x70, + 0x3a, 0x51, 0x99, 0xac, 0x75, 0x57, 0xd4, 0x28, 0xb8, 0x2e, 0x9e, 0x97, + 0x7d, 0xe7, 0xed, 0x3a, 0x15, 0xfc, 0xa0, 0x45, 0x04, 0x19, 0xf3, 0xf4, + 0x5f, 0x55, 0x2d, 0x9d, 0x0e, 0x1d, 0x5d, 0xf7, 0xf2, 0x8d, 0xbb, 0xf0, + 0x97, 0xd4, 0xfe, 0x76, 0xdd, 0x3a, 0xbe, 0xdf, 0x40, 0xb8, 0x35, 0x84, + 0x47, 0xd8, 0xae, 0x61, 0x5b, 0x5a, 0xda, 0x52, 0x74, 0xc3, 0x7b, 0x7f, + 0xbb, 0x0f, 0xf7, 0xe6, 0x60, 0x66, 0x32, 0x5a, 0x37, 0xcb, 0xe9, 0x49, + 0x98, 0xf3, 0x60, 0xb2, 0x0a, 0x33, 0x1e, 0x78, 0x1e, 0x54, 0xab, 0x96, + 0xdd, 0x34, 0x78, 0xa6, 0x8c, 0x1e, 0x78, 0x55, 0x8f, 0x6a, 0x35, 0xf2, + 0x31, 0x39, 0x5d, 0xc5, 0xc3, 0x63, 0xce, 0x53, 0xdb, 0xd5, 0x2a, 0xcc, + 0xcc, 0xc0, 0xb4, 0x4e, 0x67, 0xdb, 0x32, 0x49, 0xec, 0xa7, 0x33, 0x5d, + 0x05, 0xcf, 0x64, 0x06, 0xcc, 0x79, 0x1e, 0x93, 0xd5, 0x2a, 0x7b, 0xf0, + 0x78, 0x49, 0xc0, 0xcb, 0xbf, 0x55, 0xe5, 0xd6, 0x3f, 0xf5, 0x80, 0x6d, + 0x7a, 0x00, 0x2a, 0x79, 0x73, 0xac, 0xc7, 0xc1, 0x46, 0xb7, 0xf1, 0x95, + 0xaf, 0xdc, 0xce, 0x9e, 0xe9, 0x2a, 0xe5, 0x11, 0x87, 0x91, 0x91, 0x45, + 0x1e, 0xf9, 0xfc, 0x8b, 0x7c, 0xe5, 0xff, 0xba, 0x9d, 0x2a, 0x55, 0x3c, + 0x60, 0x66, 0xc6, 0x0b, 0x53, 0x4d, 0x4f, 0xc3, 0xdd, 0x77, 0xbf, 0xc8, + 0x6d, 0xb7, 0xdd, 0xce, 0xf4, 0x34, 0x54, 0x51, 0x95, 0xbf, 0xfb, 0x37, + 0xe0, 0x2b, 0x7a, 0x5f, 0x4c, 0x4f, 0x56, 0xa3, 0xc2, 0x56, 0x61, 0x6e, + 0x2e, 0x4c, 0xce, 0x9c, 0x6e, 0x23, 0xcf, 0x83, 0x49, 0x53, 0xfe, 0xaa, + 0x17, 0xf9, 0xaa, 0x46, 0x79, 0x79, 0xd1, 0x2a, 0xd3, 0xd3, 0xd1, 0xba, + 0x87, 0xa7, 0x6c, 0xa7, 0x95, 0x8d, 0xf1, 0x3f, 0xbd, 0xc7, 0xec, 0x83, + 0x2a, 0x9e, 0xa7, 0x6c, 0xe6, 0x3c, 0x0f, 0xab, 0x99, 0x42, 0x65, 0x8e, + 0x9b, 0x39, 0x85, 0x7e, 0xe3, 0x15, 0xca, 0x37, 0x30, 0x29, 0xd3, 0x97, + 0xd9, 0xeb, 0x5a, 0x06, 0x4e, 0x24, 0xd1, 0xd7, 0xa7, 0xc3, 0x8e, 0x6d, + 0x09, 0x11, 0x3d, 0x4f, 0xba, 0x94, 0x5a, 0xee, 0xb9, 0xa1, 0x29, 0xa3, + 0xf9, 0x68, 0x8a, 0x0e, 0xf6, 0x0d, 0xec, 0x37, 0xbc, 0x37, 0x57, 0xfd, + 0x4d, 0x78, 0x7d, 0xaf, 0xd3, 0x99, 0xfa, 0xae, 0x44, 0xf6, 0x73, 0xcd, + 0x58, 0xf8, 0x10, 0x40, 0x2d, 0x5b, 0xf6, 0xb8, 0x99, 0xfd, 0x9c, 0x6b, + 0x97, 0x03, 0xb3, 0xc0, 0xfd, 0x3a, 0x6e, 0x56, 0xf7, 0x6e, 0xf7, 0x07, + 0xd0, 0x74, 0x04, 0xad, 0x00, 0x2a, 0x08, 0x9a, 0x48, 0x6a, 0x8e, 0x7a, + 0xbe, 0x51, 0x41, 0xd2, 0x0a, 0xa0, 0xa6, 0xeb, 0xd7, 0x42, 0xb5, 0xc5, + 0x1d, 0xba, 0xbb, 0x38, 0x2a, 0xe1, 0xfe, 0x22, 0x1c, 0x0d, 0x60, 0x0a, + 0xc1, 0x94, 0x90, 0x34, 0x03, 0x75, 0x7f, 0x38, 0x51, 0x2c, 0xd0, 0x92, + 0x3d, 0x1a, 0xba, 0x0d, 0xa7, 0x24, 0x34, 0x9c, 0x1e, 0x35, 0x51, 0xa0, + 0xa6, 0x81, 0x54, 0x77, 0x14, 0xa1, 0x85, 0xa0, 0xa6, 0xa1, 0x57, 0x15, + 0x07, 0xa6, 0x04, 0xcc, 0x76, 0xd5, 0xfa, 0x84, 0x2e, 0x6b, 0x13, 0xa8, + 0x3b, 0x22, 0x7c, 0xd6, 0x27, 0x1c, 0x89, 0x8f, 0xa0, 0x4e, 0x34, 0x7e, + 0x29, 0x1c, 0xf0, 0x03, 0x0d, 0x72, 0xb4, 0x9e, 0x27, 0xf6, 0x64, 0x8f, + 0x05, 0x47, 0x3d, 0x1f, 0x9c, 0x08, 0xe0, 0x68, 0x90, 0xbe, 0x5f, 0x62, + 0xbb, 0xcb, 0x01, 0x02, 0xa9, 0x7f, 0x7e, 0x11, 0x6c, 0xab, 0x23, 0xa1, + 0xa4, 0x61, 0x5b, 0xc7, 0x85, 0x01, 0x74, 0xe9, 0xb1, 0x0f, 0x07, 0x3a, + 0x52, 0x3d, 0x1b, 0xeb, 0xa1, 0x81, 0x5a, 0x41, 0x07, 0x21, 0x4a, 0xd1, + 0xf3, 0xc9, 0xae, 0x54, 0x63, 0xae, 0xd6, 0xf3, 0x8b, 0x8e, 0x03, 0xa2, + 0xeb, 0x83, 0x3e, 0xdf, 0x9a, 0x3d, 0xd6, 0xb1, 0x6c, 0x0a, 0x1a, 0x5c, + 0xb6, 0x90, 0xf8, 0xd8, 0x8f, 0xfd, 0x9c, 0x8b, 0x8f, 0x45, 0xfb, 0xfa, + 0xf4, 0x35, 0xbf, 0x7c, 0xc5, 0x97, 0x37, 0x5d, 0xb7, 0x26, 0xcc, 0xdf, + 0x80, 0xa2, 0x4e, 0x9e, 0x3c, 0x19, 0x86, 0xad, 0xbd, 0x6e, 0x0d, 0x17, + 0x5a, 0xe7, 0x58, 0xab, 0xed, 0x6c, 0x80, 0xd5, 0x85, 0xd6, 0x39, 0xce, + 0x62, 0x41, 0xac, 0xce, 0x9f, 0x0c, 0xd3, 0x00, 0x9c, 0x3b, 0x7f, 0x81, + 0xcd, 0xda, 0xcf, 0xe5, 0xf0, 0xd9, 0xe7, 0x17, 0x05, 0xbe, 0x5a, 0x53, + 0x59, 0x1b, 0x03, 0x68, 0x19, 0x7f, 0x27, 0x2c, 0x30, 0x96, 0x49, 0x67, + 0xfc, 0x9a, 0xba, 0x67, 0xf9, 0x34, 0x7e, 0x37, 0x55, 0x60, 0x76, 0x76, + 0x96, 0xb5, 0xd7, 0xad, 0x61, 0x4d, 0x65, 0x2d, 0x27, 0x5e, 0x3d, 0x16, + 0xd6, 0x21, 0xe9, 0x13, 0x50, 0xfb, 0xf7, 0x3f, 0xa8, 0x55, 0xbb, 0x0f, + 0x4f, 0x03, 0x57, 0x65, 0xc9, 0x40, 0xaf, 0xc6, 0x3e, 0x54, 0xa7, 0x75, + 0xa6, 0x15, 0x76, 0xaf, 0x59, 0x5d, 0xd5, 0xec, 0x1b, 0x0b, 0x20, 0xa1, + 0x2c, 0x04, 0x8d, 0xc5, 0x26, 0x52, 0x4a, 0xaa, 0xb7, 0xd4, 0xf1, 0xbd, + 0x16, 0x42, 0x08, 0x3a, 0x4b, 0x2d, 0xfe, 0xf1, 0xff, 0xf6, 0x8f, 0x01, + 0x28, 0x8c, 0x14, 0x70, 0xdd, 0x32, 0xad, 0xc5, 0xf4, 0x8f, 0x2d, 0x01, + 0x54, 0xc7, 0xc6, 0x42, 0x5b, 0x80, 0xd9, 0xaf, 0x1f, 0xa5, 0x32, 0x52, + 0x42, 0x6c, 0x70, 0x29, 0x0b, 0x97, 0x85, 0x37, 0xd2, 0xaf, 0x5b, 0x77, + 0x7f, 0xf9, 0x20, 0x5b, 0x47, 0x22, 0x80, 0xd7, 0x81, 0xe7, 0x9e, 0x01, + 0x51, 0x8a, 0x81, 0xaa, 0x54, 0x25, 0xfa, 0x9f, 0x59, 0xa7, 0xfa, 0x5a, + 0x3f, 0x46, 0xf5, 0xc6, 0x71, 0x78, 0x6e, 0x56, 0xf9, 0x92, 0x85, 0xb8, + 0xaf, 0x21, 0x95, 0xf4, 0x65, 0xa4, 0x7c, 0xa5, 0x03, 0x4f, 0x9f, 0xf7, + 0xa1, 0xf4, 0x46, 0x83, 0xfa, 0xd6, 0x78, 0x7e, 0x8d, 0xc5, 0x05, 0x4c, + 0x0d, 0xc3, 0xfd, 0xfb, 0xb1, 0x7e, 0x1f, 0x36, 0xd0, 0xc9, 0xd6, 0xe3, + 0x5f, 0xbf, 0x8b, 0xe7, 0xff, 0xdd, 0xf0, 0xd7, 0xfd, 0x8f, 0x7f, 0x3d, + 0xf2, 0x61, 0x43, 0xa3, 0x84, 0xa8, 0xf0, 0xf8, 0xd7, 0xef, 0x42, 0x88, + 0x0a, 0x42, 0xa4, 0xc3, 0x5f, 0x0d, 0x50, 0xcb, 0xac, 0xcf, 0x7f, 0x47, + 0xad, 0x1b, 0xf8, 0xd6, 0xc2, 0x5f, 0x34, 0x99, 0xf8, 0x78, 0xff, 0x87, + 0xdb, 0x92, 0xba, 0xeb, 0xc1, 0xa9, 0xb0, 0x2e, 0x76, 0x9d, 0xf6, 0x7e, + 0xeb, 0x61, 0xa4, 0x6c, 0x21, 0x44, 0x25, 0x06, 0xfc, 0x12, 0xa2, 0x12, + 0xc2, 0xbe, 0x4c, 0x3b, 0x4c, 0xdc, 0x74, 0x07, 0x47, 0x5f, 0x7d, 0x5e, + 0xd7, 0xe9, 0x2e, 0x80, 0x15, 0xb5, 0xc3, 0x5d, 0x0f, 0x4e, 0xf5, 0xe5, + 0x6f, 0xfc, 0xd8, 0xf5, 0xb7, 0xdb, 0x3d, 0xd9, 0xfe, 0xc6, 0xfe, 0xa1, + 0x8f, 0x7f, 0x35, 0x5c, 0xb7, 0x21, 0x5a, 0x3f, 0xfe, 0x49, 0x93, 0x85, + 0xbf, 0x68, 0x72, 0xfe, 0xed, 0xb3, 0x6c, 0x58, 0x73, 0x6b, 0x94, 0xd0, + 0x3a, 0xa6, 0x73, 0xe5, 0xca, 0x95, 0x2b, 0x57, 0xae, 0x5c, 0xb9, 0x72, + 0xe5, 0xca, 0x95, 0x2b, 0x57, 0xae, 0x5c, 0xb9, 0x72, 0xe5, 0xca, 0x95, + 0x2b, 0x57, 0xae, 0x5c, 0xb9, 0x72, 0xe5, 0xca, 0x95, 0x2b, 0xd7, 0xf0, + 0xca, 0xa1, 0x5a, 0xb9, 0x72, 0xe5, 0xca, 0x95, 0x2b, 0xd7, 0xbb, 0x2c, + 0x79, 0x42, 0xc2, 0x4d, 0xd1, 0x4b, 0xd5, 0xa0, 0x00, 0x2f, 0x3d, 0x5f, + 0xbd, 0x5c, 0xd5, 0xf3, 0xd5, 0x97, 0xc0, 0x15, 0x6c, 0x25, 0xfe, 0x72, + 0x74, 0xc7, 0xef, 0x50, 0x08, 0xa0, 0x23, 0x7d, 0xfc, 0xa5, 0x4e, 0x1f, + 0x9c, 0x21, 0xf9, 0x22, 0x75, 0xda, 0x8b, 0xd5, 0x17, 0x13, 0x66, 0xc2, + 0x0d, 0x44, 0xcb, 0x5e, 0x5f, 0x4e, 0x21, 0x84, 0xca, 0xb2, 0x4d, 0x9b, + 0xa4, 0xba, 0x92, 0x3a, 0xd8, 0x71, 0x7d, 0xe9, 0x74, 0xf9, 0xd2, 0xe2, + 0x07, 0xf9, 0x2c, 0x50, 0xa0, 0xd3, 0xed, 0x7f, 0x01, 0x31, 0xad, 0x5c, + 0x02, 0x81, 0x3c, 0x21, 0x33, 0x21, 0x19, 0xed, 0x33, 0x3e, 0x52, 0xf4, + 0xe7, 0x55, 0x11, 0xa5, 0xf0, 0xed, 0x53, 0x81, 0x05, 0xc5, 0x72, 0x58, + 0x7e, 0xa6, 0xf1, 0x00, 0x85, 0x13, 0x6f, 0x75, 0x1b, 0xdb, 0x60, 0xad, + 0xfb, 0x9e, 0xdd, 0x0f, 0x12, 0xea, 0xd5, 0x12, 0x0f, 0x6d, 0xdd, 0xda, + 0x97, 0xf6, 0xee, 0x2f, 0xef, 0xe7, 0xcd, 0x7f, 0xf5, 0x47, 0xe1, 0xf6, + 0xc4, 0xc6, 0x2d, 0x6a, 0x12, 0xbc, 0xd6, 0xd3, 0x9f, 0xd9, 0xc5, 0xf5, + 0xbf, 0xfb, 0x30, 0x8f, 0xa1, 0xa0, 0x5c, 0x2d, 0x5f, 0xf2, 0x95, 0xcf, + 0xec, 0xe2, 0xee, 0x2f, 0xef, 0x8f, 0xe5, 0x6f, 0x03, 0xb5, 0xcc, 0x04, + 0x3d, 0x23, 0xbb, 0x3c, 0x2a, 0x41, 0x04, 0x7f, 0x32, 0xea, 0x04, 0xd1, + 0x8b, 0xfc, 0x05, 0x3d, 0x59, 0x09, 0xbb, 0x7d, 0x12, 0xb2, 0xa1, 0x38, + 0x15, 0x4a, 0xf1, 0xa6, 0xd3, 0x13, 0xf9, 0x17, 0x16, 0x5b, 0xa9, 0xed, + 0x83, 0x10, 0x88, 0x80, 0x18, 0x88, 0xab, 0x22, 0x84, 0x7a, 0xe1, 0xbf, + 0x28, 0x68, 0xf9, 0x2d, 0x2a, 0x1a, 0x7c, 0xd6, 0x09, 0x3a, 0xb4, 0xcf, + 0xa4, 0xa1, 0x46, 0x74, 0x55, 0x4e, 0x28, 0x9f, 0x63, 0x8e, 0xcf, 0x42, + 0xe0, 0x32, 0xe6, 0xf8, 0xf8, 0x41, 0x3f, 0xec, 0xc4, 0x9e, 0xd8, 0x0c, + 0x66, 0xe2, 0x55, 0x8a, 0x3f, 0xe2, 0x93, 0xca, 0xfd, 0xc4, 0x4b, 0xf0, + 0x32, 0x11, 0x97, 0xcc, 0x47, 0x88, 0x32, 0x0b, 0xb2, 0x9d, 0xfa, 0x92, + 0x73, 0xc7, 0xb1, 0xfa, 0x14, 0x9d, 0x6e, 0xbe, 0x0b, 0xa2, 0x2b, 0x52, + 0x61, 0x59, 0x49, 0xf9, 0xdd, 0xb6, 0x82, 0x26, 0x0c, 0xa5, 0x8c, 0x17, + 0x94, 0x9d, 0x7e, 0x18, 0x5b, 0x52, 0xc3, 0x02, 0xb5, 0xb2, 0x64, 0x03, + 0xb5, 0x56, 0x9c, 0x76, 0x99, 0xe3, 0xfa, 0xdd, 0x06, 0x69, 0x0d, 0x03, + 0x01, 0x04, 0xc2, 0xaf, 0x9d, 0x2f, 0xa7, 0x2c, 0x70, 0x55, 0x12, 0x3c, + 0x35, 0x0c, 0x74, 0xcb, 0x5f, 0xf2, 0x33, 0xe3, 0xd2, 0xb4, 0x52, 0x7b, + 0xd0, 0x13, 0x54, 0x56, 0x68, 0xef, 0x2f, 0xf9, 0xb8, 0x23, 0x6e, 0x5f, + 0x5e, 0x83, 0x8e, 0xeb, 0xd3, 0x67, 0xd4, 0xec, 0xe6, 0x8d, 0xc0, 0xf7, + 0xdf, 0xb9, 0xb2, 0x30, 0xad, 0xa4, 0xed, 0x43, 0xba, 0x1c, 0x59, 0xb6, + 0xdb, 0x1f, 0x48, 0xad, 0x42, 0xaa, 0x16, 0xf5, 0xbf, 0x6d, 0x6c, 0x8b, + 0xc1, 0xb4, 0x54, 0x1c, 0x7a, 0x9b, 0x70, 0x7b, 0x91, 0xc3, 0x8c, 0x42, + 0x02, 0x90, 0x15, 0xd9, 0x26, 0x97, 0x87, 0xf5, 0xd6, 0xa8, 0x06, 0x6f, + 0x25, 0xed, 0x49, 0xd8, 0x1b, 0x8d, 0xa6, 0x84, 0xad, 0x56, 0x8b, 0x4f, + 0x3e, 0xc9, 0xe8, 0x13, 0x4f, 0xc4, 0xc2, 0xd4, 0xfe, 0x1c, 0x49, 0xb5, + 0x6f, 0x5b, 0x13, 0xd9, 0xef, 0x9a, 0x57, 0x60, 0x2d, 0x23, 0x51, 0x14, + 0xdc, 0x75, 0x24, 0x25, 0x51, 0x8a, 0x76, 0x02, 0xfb, 0x32, 0xe2, 0x24, + 0x51, 0xdf, 0x9e, 0xf6, 0xeb, 0xcd, 0xfe, 0x25, 0x2e, 0xaf, 0x24, 0x3c, + 0x2b, 0xed, 0xbc, 0x70, 0x31, 0xf2, 0xed, 0xd9, 0x9a, 0xc4, 0x2f, 0x55, + 0x9a, 0x64, 0xc3, 0xc4, 0xde, 0x2d, 0xb5, 0x07, 0x80, 0x09, 0xda, 0x7e, + 0x74, 0x86, 0x6d, 0x9c, 0x68, 0x51, 0x03, 0x0e, 0xe2, 0x52, 0xf5, 0xd4, + 0x44, 0x0b, 0x2f, 0xb1, 0x17, 0x16, 0x5e, 0x6b, 0x52, 0x31, 0x36, 0x1a, + 0xc0, 0x75, 0xbd, 0xd7, 0xe4, 0x60, 0x9f, 0xdd, 0x9b, 0xd4, 0x80, 0x46, + 0xa3, 0x07, 0x9b, 0x7d, 0x68, 0xb7, 0x68, 0xe0, 0xd2, 0xf8, 0xcd, 0x87, + 0x79, 0xe8, 0x40, 0x85, 0xc7, 0x4f, 0x55, 0x98, 0xf7, 0x0f, 0xd2, 0xbc, + 0xa1, 0x83, 0x74, 0x05, 0x2c, 0xed, 0x05, 0x24, 0x62, 0xc4, 0xc7, 0x47, + 0xa8, 0x03, 0xe0, 0x0d, 0xe5, 0x6b, 0xfe, 0xe5, 0xe3, 0xca, 0xd7, 0x8d, + 0x13, 0xd0, 0x50, 0x79, 0xd6, 0x5f, 0x3b, 0xca, 0xbc, 0xce, 0x33, 0x04, + 0x65, 0xa5, 0x68, 0xfe, 0x15, 0x78, 0xec, 0x9f, 0xb2, 0xac, 0xdd, 0x8e, + 0xad, 0xb0, 0x2f, 0x0b, 0xaa, 0x05, 0xf0, 0x77, 0xff, 0x41, 0x04, 0xd6, + 0x3a, 0x36, 0x1f, 0x86, 0xfd, 0xe1, 0x7f, 0xfe, 0x06, 0x9f, 0x4d, 0x82, + 0xb5, 0xaa, 0xb5, 0x74, 0x1f, 0x29, 0x72, 0x6f, 0xba, 0x03, 0x5f, 0x4f, + 0x60, 0x31, 0x1a, 0x04, 0xcf, 0xca, 0x02, 0x6e, 0x19, 0xb5, 0x7d, 0x09, + 0xeb, 0xd3, 0xcf, 0x73, 0xed, 0xb6, 0xba, 0x8e, 0x58, 0x09, 0x50, 0x4b, + 0xa5, 0xbb, 0x74, 0xbf, 0xe6, 0x61, 0x80, 0x58, 0xc3, 0xd8, 0x2c, 0xa7, + 0x83, 0x7f, 0xf2, 0xc5, 0xa1, 0x6d, 0xbf, 0xda, 0x2e, 0xc1, 0x61, 0xd3, + 0x53, 0xa5, 0xf5, 0x58, 0xd1, 0xf5, 0xd7, 0xe3, 0x73, 0x25, 0x98, 0x6b, + 0xf7, 0x85, 0xf7, 0xaf, 0xab, 0x6b, 0xe9, 0xf2, 0x8b, 0x75, 0x9a, 0x61, + 0xef, 0x90, 0x5c, 0x2a, 0x95, 0xf5, 0xd4, 0x2f, 0x77, 0xf1, 0x20, 0xc7, + 0x97, 0xe9, 0xf4, 0xcd, 0x51, 0x76, 0xd4, 0xaf, 0x30, 0x41, 0x83, 0x08, + 0x12, 0x10, 0xd7, 0x8f, 0xba, 0xa7, 0x49, 0xfe, 0x0a, 0x92, 0xd7, 0xd2, + 0x69, 0xb2, 0xfb, 0xb2, 0xa4, 0xed, 0xe5, 0xc6, 0x6f, 0xa4, 0xf9, 0x37, + 0xe5, 0xe9, 0xf0, 0x8b, 0x00, 0x94, 0xf8, 0x6b, 0x00, 0x7e, 0x00, 0xfc, + 0xed, 0xeb, 0xae, 0x63, 0xed, 0xda, 0xb5, 0x6a, 0xbb, 0xd3, 0xe1, 0x03, + 0x3a, 0x4d, 0x4b, 0xdb, 0x56, 0xf8, 0xeb, 0xab, 0xb2, 0x2e, 0x49, 0x0d, + 0xb3, 0x5f, 0x7e, 0xd4, 0x3d, 0x9d, 0x75, 0xba, 0x0e, 0xfb, 0xf7, 0xfd, + 0xd6, 0x98, 0x42, 0xc5, 0xba, 0x2e, 0xdf, 0xeb, 0xfb, 0x3c, 0xb6, 0x3e, + 0x0e, 0xfa, 0x7d, 0x54, 0xc7, 0xef, 0xd8, 0xbe, 0x93, 0xd9, 0x97, 0xa3, + 0xfe, 0x44, 0x4d, 0x6e, 0xd7, 0xd7, 0xa1, 0x06, 0xa8, 0x25, 0xa2, 0xbe, + 0x5d, 0x06, 0x16, 0x38, 0xcb, 0x0a, 0x37, 0xc0, 0x2d, 0x5b, 0x66, 0x3b, + 0x2b, 0x7c, 0x50, 0x9c, 0x70, 0x22, 0x48, 0xaf, 0xdd, 0x36, 0x59, 0xeb, + 0xf6, 0xb6, 0x5b, 0xec, 0x4f, 0x67, 0x6f, 0x0b, 0xa0, 0x50, 0x54, 0xc7, + 0x67, 0xcf, 0x1a, 0xe3, 0xc8, 0x1a, 0xbf, 0x49, 0xde, 0xe3, 0x08, 0x6d, + 0xbb, 0xe3, 0xb7, 0xef, 0xe2, 0xe0, 0xb3, 0x5f, 0xa5, 0xd9, 0x94, 0x54, + 0x5c, 0x17, 0xe1, 0xb8, 0xd4, 0x6b, 0x02, 0x29, 0x7d, 0xd5, 0x36, 0xa7, + 0x2b, 0x09, 0x3f, 0x51, 0xbb, 0xd9, 0xed, 0x68, 0xee, 0xcf, 0x4c, 0x7b, + 0x0f, 0x3a, 0x5f, 0xff, 0xa8, 0x7b, 0x9a, 0xf5, 0xd9, 0xd1, 0xef, 0x8a, + 0xbe, 0x66, 0xad, 0x8b, 0x93, 0xd7, 0xf0, 0x43, 0xde, 0x19, 0x9c, 0xe0, + 0x8f, 0x7f, 0x9a, 0x1a, 0xfc, 0xb7, 0x8a, 0xd7, 0x70, 0xa1, 0x9b, 0x48, + 0xfb, 0xca, 0x3b, 0xea, 0xcf, 0x52, 0xa5, 0xf4, 0x0b, 0xb4, 0x3a, 0x91, + 0x8f, 0x7e, 0x7c, 0xb8, 0x2e, 0x4b, 0xe9, 0x17, 0xf8, 0xa1, 0x65, 0x97, + 0xe6, 0x2b, 0x55, 0xda, 0x26, 0xb5, 0x3c, 0x09, 0xad, 0xf9, 0xc3, 0x9f, + 0x72, 0x27, 0x64, 0x8e, 0x16, 0x7c, 0x57, 0x2f, 0x83, 0xe2, 0x35, 0xfc, + 0xd7, 0x14, 0x5f, 0x7f, 0x35, 0xe0, 0xb8, 0x36, 0xf7, 0x5c, 0x49, 0xd0, + 0x93, 0xd9, 0xbe, 0x18, 0x20, 0xd6, 0xe5, 0x86, 0x69, 0xad, 0x54, 0xc9, + 0x31, 0xb2, 0x4a, 0xa0, 0x20, 0x10, 0xab, 0x43, 0x19, 0x5d, 0x5c, 0xde, + 0x69, 0xed, 0x7d, 0xb1, 0xed, 0xd5, 0x02, 0xde, 0x19, 0x74, 0xcf, 0xe5, + 0xf9, 0x70, 0x33, 0x34, 0xbf, 0x76, 0x80, 0xf1, 0x5b, 0xd5, 0xf5, 0x80, + 0xef, 0x08, 0xe4, 0xe6, 0x87, 0x29, 0xcc, 0x7f, 0x81, 0xe6, 0x47, 0x04, + 0xad, 0x85, 0x31, 0xc4, 0xab, 0xf3, 0x17, 0x59, 0x12, 0x70, 0xeb, 0x3b, + 0x58, 0x68, 0x1c, 0x64, 0xec, 0xbb, 0xd0, 0x5c, 0x23, 0x19, 0xbb, 0x71, + 0x8a, 0xc6, 0x89, 0xa3, 0x7d, 0x76, 0x76, 0x7f, 0x78, 0x31, 0xe3, 0x3c, + 0x7d, 0xba, 0x69, 0x56, 0xf5, 0xa1, 0x56, 0x3f, 0xb7, 0xab, 0xfe, 0x14, + 0x9f, 0xfc, 0xfa, 0x27, 0xd9, 0xb5, 0x71, 0xd7, 0x8a, 0x3f, 0x4c, 0x61, + 0xb4, 0x12, 0xa0, 0x16, 0x44, 0x30, 0x2d, 0x23, 0xef, 0x94, 0x6a, 0x5b, + 0x03, 0xd4, 0xea, 0x0d, 0xe1, 0x6e, 0xcb, 0x58, 0x9d, 0xe3, 0x0b, 0xfd, + 0xbf, 0xd2, 0xb6, 0x97, 0x7d, 0x07, 0xdb, 0x4a, 0x81, 0xf5, 0x87, 0x60, + 0x7b, 0x47, 0x9f, 0xa7, 0x83, 0x92, 0x1e, 0xff, 0xad, 0xa1, 0x00, 0xbd, + 0xd7, 0x2f, 0x53, 0x12, 0x41, 0xc9, 0x75, 0x91, 0x81, 0x4a, 0xdf, 0x31, + 0xcf, 0x55, 0x82, 0xac, 0x7b, 0x11, 0x81, 0x70, 0xfa, 0x27, 0xf8, 0x17, + 0x46, 0x5c, 0x5c, 0xed, 0xa3, 0xe0, 0xba, 0xb8, 0xb2, 0x86, 0x2f, 0x7b, + 0xc0, 0x84, 0x65, 0xe5, 0xe9, 0xa5, 0x2a, 0x93, 0x01, 0x68, 0x19, 0x98, + 0x84, 0x94, 0x02, 0x5f, 0x46, 0x57, 0x5e, 0xea, 0xba, 0x47, 0x20, 0x04, + 0x31, 0x08, 0x75, 0x4c, 0x41, 0x29, 0x82, 0x6b, 0x0d, 0x50, 0xc1, 0xad, + 0xe0, 0x4a, 0x1f, 0x3f, 0xe8, 0x84, 0xeb, 0x00, 0x3d, 0xdf, 0xc7, 0x15, + 0x35, 0x7c, 0x99, 0xd1, 0x63, 0x38, 0x1a, 0xac, 0x25, 0x2b, 0xe0, 0x34, + 0x74, 0xdb, 0x7a, 0x56, 0x5d, 0x14, 0xb4, 0xcc, 0x15, 0x65, 0xfc, 0xa5, + 0x06, 0xae, 0x06, 0x4e, 0xf8, 0x4b, 0x8d, 0x08, 0xac, 0x45, 0x2d, 0x6a, + 0xd7, 0xb0, 0xfd, 0xaa, 0x6a, 0x7f, 0x0e, 0xe8, 0xc3, 0xab, 0xd5, 0x58, + 0x36, 0x00, 0x54, 0x27, 0x15, 0x1c, 0x6a, 0x12, 0xb5, 0x0c, 0x61, 0x5a, + 0x09, 0x3b, 0x88, 0xa0, 0x54, 0xd3, 0xd3, 0x51, 0x7c, 0xb5, 0xaa, 0x81, + 0x5b, 0x7b, 0xa0, 0xba, 0xc7, 0x32, 0xf6, 0x22, 0xb0, 0x56, 0x98, 0x57, + 0x55, 0xc1, 0xa8, 0xa6, 0x27, 0xd5, 0xdd, 0xc2, 0x8c, 0xa7, 0x32, 0x9a, + 0xb4, 0x6c, 0x1e, 0x79, 0x05, 0x6e, 0x9b, 0xf3, 0xd8, 0x33, 0x0d, 0xbc, + 0x08, 0xb7, 0xde, 0xae, 0x33, 0x5a, 0xfc, 0x1d, 0x18, 0xdd, 0x06, 0xb7, + 0x3f, 0x15, 0x2f, 0xd4, 0xbf, 0x39, 0xac, 0xc2, 0x39, 0x8c, 0xe7, 0xc1, + 0xdd, 0x8f, 0x3c, 0xc5, 0xe2, 0xe1, 0xdf, 0x61, 0x94, 0x51, 0x0e, 0x7f, + 0xe3, 0x76, 0x46, 0x46, 0xa0, 0x8b, 0x07, 0x4b, 0x89, 0xba, 0x78, 0x70, + 0xf7, 0xed, 0xb7, 0xab, 0x8a, 0xeb, 0x7b, 0x97, 0xb9, 0x49, 0xb8, 0x15, + 0xf0, 0x3c, 0x8f, 0xb9, 0xb9, 0x2a, 0x7b, 0x0c, 0x25, 0x0c, 0x55, 0xe6, + 0xc9, 0x2a, 0xcc, 0x99, 0xba, 0xcc, 0x80, 0x37, 0xad, 0xc0, 0x57, 0x7b, + 0xf6, 0x78, 0x50, 0x8d, 0xea, 0x6a, 0xc0, 0x60, 0x00, 0x7b, 0x74, 0x9b, + 0xed, 0x99, 0xae, 0xc2, 0xa4, 0xc7, 0xcc, 0x8c, 0x5a, 0x37, 0x90, 0xac, + 0x39, 0xcf, 0x83, 0x19, 0x98, 0xab, 0x6a, 0x1b, 0x9d, 0x1e, 0x53, 0x8e, + 0x19, 0x60, 0x5a, 0x83, 0xc9, 0xd0, 0xc0, 0x2e, 0xbc, 0xa1, 0xc7, 0xcd, + 0x2e, 0x46, 0x52, 0xca, 0x38, 0x44, 0x6b, 0x50, 0xbf, 0x16, 0x48, 0x75, + 0x6c, 0x0d, 0xe1, 0x37, 0xf9, 0xdc, 0x31, 0x0c, 0xcf, 0x80, 0x4f, 0x0d, + 0xad, 0x41, 0x63, 0xf0, 0x36, 0x44, 0x2b, 0x71, 0xad, 0xef, 0x77, 0xad, + 0x8f, 0x07, 0x49, 0x5f, 0x95, 0xcd, 0x11, 0x31, 0x80, 0x96, 0x60, 0x30, + 0xc4, 0xd7, 0x56, 0x12, 0xbc, 0xd5, 0x57, 0x27, 0xbd, 0x39, 0x2c, 0x50, + 0x6b, 0xd0, 0xfe, 0x94, 0x27, 0x24, 0xf5, 0xaa, 0x80, 0xa2, 0xa4, 0x1e, + 0x08, 0x16, 0xa4, 0xe4, 0x21, 0x7d, 0x3d, 0xbf, 0x20, 0x25, 0x3b, 0x1d, + 0xc1, 0x42, 0x20, 0x19, 0x73, 0x44, 0xac, 0x7d, 0x16, 0x24, 0xec, 0x14, + 0x82, 0xf9, 0xc0, 0xa7, 0x1e, 0x40, 0x43, 0x40, 0xdd, 0x0c, 0x86, 0x42, + 0x78, 0x93, 0x32, 0x85, 0x60, 0x4c, 0xa8, 0xd1, 0xd1, 0x9a, 0x2e, 0x6f, + 0xaf, 0xdb, 0xa3, 0x0a, 0xb8, 0x01, 0x21, 0x2c, 0x66, 0x3c, 0x20, 0x7e, + 0x9f, 0x2f, 0xa1, 0x8e, 0xfa, 0x40, 0x53, 0x88, 0x98, 0x09, 0x08, 0xcb, + 0x69, 0xf6, 0x41, 0x18, 0xd7, 0x95, 0x48, 0x01, 0x32, 0x10, 0x8c, 0x07, + 0x30, 0x6f, 0xf6, 0x97, 0x80, 0x31, 0x09, 0xf3, 0xd0, 0xf7, 0xdc, 0xa4, + 0x20, 0x0a, 0xea, 0xdc, 0x18, 0xc0, 0x82, 0x23, 0x29, 0xe8, 0x34, 0xbd, + 0x3e, 0xb8, 0x96, 0xd9, 0x97, 0x84, 0x40, 0xb5, 0x82, 0x06, 0x84, 0xd9, + 0x3f, 0xc3, 0x5e, 0x78, 0x07, 0x2c, 0x63, 0x3e, 0x3a, 0x0e, 0x14, 0x74, + 0x58, 0x21, 0x90, 0xf4, 0x02, 0x28, 0x88, 0x52, 0xf8, 0xec, 0x50, 0x81, + 0x1c, 0x55, 0x19, 0xc3, 0x7b, 0x3b, 0x7d, 0x3c, 0x60, 0x01, 0x2c, 0x27, + 0x50, 0x80, 0x31, 0x5b, 0x3d, 0xeb, 0xda, 0xb2, 0xc4, 0xe0, 0xe7, 0x5c, + 0x6f, 0x9f, 0xf8, 0x1f, 0x6c, 0x78, 0xe7, 0x27, 0x9c, 0xbe, 0xe6, 0x97, + 0xaf, 0xe8, 0xf2, 0xd5, 0xb7, 0xfe, 0x67, 0xd6, 0x5e, 0xfb, 0x0a, 0x9c, + 0x3f, 0x19, 0x82, 0xa2, 0xd6, 0x5e, 0xb7, 0x86, 0xcd, 0x37, 0xdd, 0x0c, + 0x28, 0xd8, 0xd4, 0xba, 0x75, 0xeb, 0x42, 0x90, 0x94, 0xd1, 0xba, 0x75, + 0xeb, 0x38, 0xd1, 0x3a, 0x17, 0xc2, 0xaf, 0x4c, 0xdc, 0x9a, 0x8a, 0x1a, + 0x2b, 0x31, 0x80, 0x29, 0x03, 0xb6, 0xba, 0x1c, 0x3e, 0x01, 0xa6, 0xa6, + 0xa6, 0xc2, 0xf4, 0x06, 0x8c, 0x65, 0x83, 0xb4, 0x4c, 0x3a, 0x1b, 0xca, + 0x65, 0xc3, 0xbc, 0xc2, 0x78, 0x22, 0xa8, 0x97, 0x5d, 0x56, 0x23, 0x03, + 0xcf, 0x02, 0xc2, 0x76, 0x32, 0xfe, 0xcf, 0x9d, 0xbf, 0x10, 0xc2, 0xb7, + 0x8c, 0xcf, 0xb7, 0x4f, 0x5c, 0xc8, 0x7c, 0xec, 0xd8, 0xee, 0x02, 0xc5, + 0x7e, 0x28, 0x96, 0x2f, 0x25, 0xe5, 0x4b, 0x70, 0x0d, 0x2c, 0x1c, 0x11, + 0x7e, 0xec, 0x49, 0xb8, 0x82, 0xcf, 0x3d, 0xf0, 0x39, 0x7c, 0x5f, 0xd2, + 0xb9, 0xa1, 0x05, 0x52, 0x50, 0xdb, 0x5c, 0x89, 0x7f, 0x20, 0x2c, 0x80, + 0x5a, 0xb5, 0x36, 0xf0, 0x23, 0x40, 0xb2, 0x2b, 0x29, 0x55, 0x2b, 0xf4, + 0x96, 0x3a, 0xd4, 0x37, 0xd6, 0x34, 0x6c, 0x51, 0x52, 0x19, 0x51, 0xd7, + 0x77, 0x95, 0x0d, 0xe9, 0x20, 0x27, 0xbb, 0x92, 0x3b, 0xef, 0xbc, 0x97, + 0xc7, 0xff, 0x45, 0x3a, 0xcc, 0xdc, 0x56, 0xa6, 0x2f, 0x4b, 0x97, 0xd2, + 0xd7, 0x30, 0xba, 0xc3, 0x85, 0xe7, 0x97, 0xfa, 0xfb, 0xf4, 0xf9, 0x85, + 0xe3, 0x94, 0xba, 0xe9, 0xfb, 0xec, 0xe5, 0xef, 0x7f, 0x3f, 0xfc, 0x0d, + 0x24, 0x41, 0x52, 0x31, 0xdf, 0xff, 0x6b, 0xbd, 0x2f, 0xcc, 0x28, 0x0b, + 0xc6, 0x95, 0x16, 0x67, 0xb6, 0x0d, 0x54, 0xea, 0x07, 0xa7, 0x4e, 0xf3, + 0x81, 0x8d, 0x1b, 0x38, 0xd3, 0x8e, 0x06, 0x7c, 0xe7, 0xbf, 0xf3, 0x3d, + 0x20, 0x0e, 0xd8, 0xca, 0x2a, 0xcb, 0xf3, 0xff, 0xae, 0xc1, 0xc3, 0x7f, + 0x70, 0x2f, 0xad, 0xa5, 0x66, 0x98, 0xcf, 0xf3, 0xff, 0xae, 0x91, 0x9a, + 0x67, 0x72, 0xbb, 0xb5, 0x14, 0x6d, 0x27, 0x35, 0x71, 0xd3, 0x1d, 0xcb, + 0xe6, 0x6d, 0x97, 0xc1, 0x86, 0x78, 0x19, 0xf0, 0x96, 0xd9, 0x36, 0xfe, + 0x93, 0x6d, 0x24, 0x65, 0x8b, 0xda, 0xfa, 0x89, 0x81, 0x30, 0x2f, 0x23, + 0x03, 0xd4, 0x02, 0xd5, 0x66, 0x3f, 0xfe, 0x89, 0x4a, 0x63, 0xc3, 0xb4, + 0x7e, 0xfc, 0x93, 0x26, 0x27, 0xbe, 0xff, 0x43, 0xde, 0xc3, 0xdf, 0x4e, + 0x2d, 0x7b, 0xae, 0x5c, 0xb9, 0x72, 0xe5, 0xca, 0x95, 0x2b, 0x57, 0xae, + 0x5c, 0xb9, 0x72, 0xe5, 0xca, 0x95, 0x2b, 0x57, 0xae, 0x5c, 0xb9, 0x72, + 0xe5, 0xca, 0x95, 0x2b, 0x57, 0xae, 0x5c, 0xb9, 0x72, 0xe5, 0x5a, 0x5e, + 0x39, 0x54, 0x2b, 0x57, 0xae, 0x5c, 0xb9, 0x72, 0xe5, 0x7a, 0xb7, 0x74, + 0xa8, 0x04, 0x9f, 0xea, 0x20, 0x36, 0x8b, 0x08, 0xa8, 0x95, 0x04, 0xee, + 0xe8, 0x49, 0x89, 0x9d, 0x6e, 0x87, 0x12, 0x25, 0x10, 0x0a, 0xa4, 0x65, + 0x14, 0x03, 0x6a, 0x05, 0xef, 0x2e, 0xbe, 0xc0, 0xbc, 0xb8, 0xed, 0x77, + 0xfd, 0xa1, 0x01, 0x2f, 0xb1, 0xf4, 0x97, 0xe3, 0xab, 0xd1, 0xb6, 0xff, + 0x40, 0xae, 0xfa, 0xa5, 0xf9, 0x52, 0xb1, 0xa4, 0xbe, 0x60, 0x3f, 0x84, + 0xc4, 0x66, 0x5d, 0xf7, 0x43, 0xd1, 0x14, 0x47, 0xff, 0x75, 0x09, 0x93, + 0x50, 0x5e, 0xef, 0x62, 0xbe, 0xb5, 0x1a, 0x42, 0x5c, 0xa4, 0x54, 0x00, + 0x21, 0x03, 0xfc, 0x09, 0xec, 0x97, 0xe1, 0x41, 0x84, 0x33, 0x8d, 0xad, + 0x29, 0xc7, 0x52, 0x82, 0x93, 0x78, 0xfb, 0x7c, 0xc0, 0x67, 0x61, 0x5b, + 0x52, 0x83, 0xad, 0x2c, 0xf0, 0x8c, 0x9a, 0x28, 0x27, 0x69, 0x78, 0xea, + 0x45, 0xbf, 0x7f, 0xf0, 0xa5, 0xbd, 0x7c, 0xe3, 0x33, 0xf7, 0xc7, 0xd2, + 0x85, 0xe0, 0xad, 0xcd, 0x95, 0xd0, 0xce, 0xa4, 0xbd, 0xef, 0xb9, 0x03, + 0x3c, 0x0d, 0xdc, 0xf7, 0xa5, 0xfd, 0x0a, 0xb6, 0xe5, 0x8a, 0x10, 0xa8, + 0x55, 0x11, 0x82, 0xe7, 0x8f, 0xa9, 0xd7, 0xb7, 0xb7, 0xd4, 0xb7, 0x20, + 0x1c, 0x78, 0xfa, 0xce, 0x9d, 0xdc, 0xf7, 0xdc, 0xe0, 0x17, 0x4c, 0x0d, + 0x48, 0x49, 0x22, 0xe9, 0x05, 0x71, 0xf0, 0x52, 0x21, 0xeb, 0xcb, 0xe7, + 0x16, 0x10, 0x2b, 0xd9, 0x0e, 0x32, 0x79, 0xa5, 0xab, 0xa1, 0x60, 0x49, + 0x98, 0x57, 0xd8, 0x3e, 0xbe, 0x04, 0xa1, 0x27, 0x5d, 0x74, 0xa5, 0x02, + 0x6a, 0x25, 0xda, 0xd5, 0x86, 0x3d, 0x95, 0xd7, 0xab, 0x17, 0xd6, 0xfd, + 0xd7, 0xad, 0x7d, 0x63, 0x1d, 0xd7, 0xbc, 0x6a, 0x8a, 0xe4, 0x6b, 0xe8, + 0x54, 0xff, 0xb4, 0xf1, 0x64, 0x48, 0x27, 0x39, 0xe1, 0x42, 0xe7, 0xdf, + 0x71, 0xe2, 0x53, 0xd3, 0x6c, 0xbb, 0x8e, 0x03, 0xa5, 0x40, 0xbd, 0x20, + 0x1f, 0xc6, 0x05, 0xb6, 0x0f, 0x90, 0x41, 0x5b, 0x97, 0x25, 0x0e, 0xc0, + 0x1a, 0x4f, 0x81, 0x61, 0xcd, 0x0f, 0x31, 0x29, 0xc6, 0x4f, 0x99, 0x10, + 0x37, 0x94, 0x4d, 0x56, 0xba, 0x8c, 0x3c, 0xdb, 0x4b, 0xd9, 0x5f, 0x27, + 0x36, 0x5a, 0x2d, 0x6c, 0xcb, 0xb7, 0x7c, 0x67, 0x01, 0xb7, 0x7c, 0x5f, + 0xf9, 0x16, 0x9b, 0xf5, 0x24, 0xbf, 0x8c, 0xe3, 0x9a, 0xf6, 0xca, 0xfa, + 0x95, 0x70, 0xd2, 0xcb, 0x65, 0xbe, 0x1b, 0x4b, 0xfb, 0xb2, 0x7d, 0x4f, + 0x7f, 0xf5, 0x3c, 0x39, 0x49, 0x24, 0x0d, 0xb8, 0xd5, 0x38, 0x71, 0xe9, + 0xa6, 0xf3, 0xfa, 0x29, 0x2f, 0x7c, 0xbf, 0x9b, 0xf6, 0x59, 0x69, 0xca, + 0xd5, 0xfe, 0xe3, 0xfa, 0xad, 0xd7, 0xbb, 0xd4, 0xff, 0xfe, 0x7b, 0xd9, + 0xb0, 0xbe, 0x08, 0x9e, 0xcf, 0x29, 0x56, 0x07, 0xce, 0xba, 0x14, 0x30, + 0x2d, 0x5b, 0xa7, 0xac, 0xf5, 0x24, 0x60, 0x6b, 0x74, 0xe3, 0x46, 0x16, + 0x4f, 0x9d, 0x8a, 0x6d, 0x67, 0xe9, 0x70, 0xb8, 0x3c, 0x3c, 0x14, 0xc8, + 0x2a, 0x02, 0x62, 0xad, 0x0c, 0x79, 0x95, 0x06, 0xd2, 0x5a, 0xce, 0xde, + 0x5e, 0xcf, 0xae, 0xc1, 0xea, 0xb4, 0x61, 0xbd, 0xea, 0x00, 0xdf, 0x7a, + 0xbd, 0x0b, 0xbc, 0x07, 0x00, 0xbf, 0x5b, 0x02, 0x3a, 0x94, 0x8b, 0x80, + 0x0f, 0x65, 0x07, 0x78, 0xec, 0xa3, 0xdc, 0xfb, 0xfb, 0xdf, 0xc6, 0xfb, + 0xdc, 0x47, 0x01, 0xf8, 0x4f, 0x47, 0xff, 0x13, 0xde, 0xe7, 0xfe, 0x97, + 0xa1, 0xf2, 0x18, 0xe6, 0x08, 0xb2, 0xe7, 0x93, 0xd9, 0x5a, 0x0d, 0x50, + 0x2b, 0x09, 0xce, 0xda, 0x05, 0xec, 0x4f, 0xb5, 0x5c, 0x81, 0xcf, 0x94, + 0xb0, 0xa9, 0x6d, 0x3b, 0x98, 0x3d, 0x6c, 0x81, 0x48, 0x58, 0x35, 0xff, + 0xf3, 0x8a, 0xa8, 0xac, 0xcf, 0x75, 0x7e, 0xb7, 0x04, 0xc2, 0x8f, 0xd6, + 0x91, 0x94, 0x5d, 0x11, 0x9b, 0xe5, 0xdc, 0x9b, 0x9c, 0x22, 0x44, 0x8d, + 0xb6, 0x9b, 0xc9, 0xb9, 0xc0, 0x4a, 0xdb, 0x76, 0xb0, 0x03, 0xd4, 0x64, + 0xc1, 0xf6, 0x02, 0x8c, 0xd4, 0xe0, 0xd5, 0x94, 0x09, 0xd1, 0xbf, 0xb1, + 0x53, 0x4d, 0xfe, 0x7b, 0xbd, 0x03, 0x4b, 0x8d, 0xf0, 0xf7, 0xd0, 0xf8, + 0x6e, 0x43, 0xd1, 0xc7, 0xc6, 0x27, 0x10, 0xe5, 0x32, 0x58, 0xf7, 0x01, + 0x62, 0x03, 0x70, 0x5a, 0xb5, 0xe6, 0xd3, 0x8f, 0xaa, 0xdc, 0x6b, 0x5b, + 0x5d, 0x5c, 0x17, 0xd4, 0xd4, 0x38, 0x0b, 0xf0, 0xf6, 0xcf, 0x7e, 0x95, + 0xe6, 0xb7, 0x7e, 0x95, 0x3f, 0xfb, 0x97, 0x50, 0xfb, 0x75, 0x7b, 0x4f, + 0xfd, 0x79, 0xac, 0x18, 0x7b, 0xff, 0xd9, 0xaf, 0xb2, 0xef, 0xf7, 0xfa, + 0x27, 0x8b, 0x34, 0xfc, 0x6a, 0xb8, 0xfe, 0xc9, 0xdf, 0x4b, 0xab, 0x68, + 0x42, 0x7f, 0xf7, 0x1f, 0xf4, 0x05, 0x7d, 0xd6, 0x84, 0xfd, 0xf1, 0xc3, + 0x60, 0x20, 0xad, 0x47, 0x8e, 0xc0, 0x4d, 0xa5, 0xf4, 0x36, 0xb9, 0xcc, + 0x2a, 0xeb, 0x6b, 0x3d, 0xbf, 0x5b, 0x82, 0xa2, 0xde, 0xd7, 0xe6, 0x7c, + 0x5d, 0x2e, 0x23, 0x96, 0x24, 0x32, 0xf0, 0x11, 0x8e, 0x06, 0xba, 0xac, + 0x60, 0x5d, 0x06, 0x3e, 0x42, 0xa8, 0xeb, 0x01, 0x29, 0xdb, 0x08, 0x51, + 0x0e, 0x97, 0xc9, 0x30, 0xe0, 0xa2, 0xd6, 0xdd, 0x62, 0xb9, 0xef, 0x3a, + 0xca, 0x0e, 0x5b, 0x6e, 0x5d, 0x16, 0x3b, 0xf8, 0xdd, 0x36, 0x6e, 0xb1, + 0xac, 0xdb, 0xa3, 0x4d, 0x19, 0xd8, 0xe2, 0x8e, 0x6b, 0x67, 0xfa, 0x7a, + 0xc6, 0xba, 0xaf, 0x3c, 0xee, 0xcf, 0xc3, 0xfa, 0x1d, 0x6a, 0xc3, 0x5c, + 0x1f, 0xda, 0xd7, 0x67, 0x67, 0x0e, 0x52, 0x2f, 0x8e, 0x87, 0x9b, 0x85, + 0x11, 0x0d, 0xe6, 0x59, 0x8a, 0x7c, 0x34, 0xba, 0x96, 0x0f, 0x55, 0x29, + 0x74, 0xe3, 0x84, 0x3e, 0x2a, 0xc5, 0x68, 0x82, 0x92, 0xeb, 0xea, 0xf2, + 0xe9, 0xeb, 0xad, 0x56, 0xb7, 0x81, 0x74, 0xc7, 0xa2, 0xe4, 0x7a, 0xfe, + 0xb6, 0xb4, 0x26, 0xa7, 0x0b, 0x7f, 0x81, 0x4a, 0xb1, 0x4e, 0xd9, 0xd4, + 0xcd, 0x3a, 0x5f, 0x7f, 0xaf, 0xfb, 0x16, 0x53, 0xef, 0xad, 0xf3, 0xfe, + 0xe2, 0x06, 0xde, 0xf2, 0xa3, 0x6b, 0xec, 0x95, 0xf4, 0x4f, 0x97, 0xba, + 0x3f, 0x1b, 0x06, 0x1a, 0x35, 0x48, 0x02, 0x05, 0xd3, 0xea, 0xf0, 0x8b, + 0x21, 0x5c, 0xab, 0x00, 0x1c, 0xfc, 0xe1, 0x0f, 0xd9, 0xa1, 0x97, 0x37, + 0xf1, 0x8b, 0x71, 0x28, 0x8b, 0x86, 0x6f, 0x5d, 0x8d, 0x75, 0xb1, 0x7d, + 0x0c, 0x5b, 0xb6, 0xf7, 0x17, 0x37, 0x00, 0x6a, 0xff, 0xea, 0xd3, 0x75, + 0xec, 0x7c, 0x3d, 0xd6, 0x68, 0xd2, 0x6a, 0x4b, 0xfc, 0x45, 0x75, 0x6d, + 0x3f, 0xbf, 0x6d, 0x8a, 0x83, 0x87, 0xa1, 0x3a, 0xda, 0x82, 0x8f, 0x97, + 0xd8, 0xf7, 0x65, 0xd5, 0xfb, 0x36, 0x4e, 0x54, 0xd8, 0xf9, 0xa9, 0x06, + 0x53, 0x17, 0x24, 0x47, 0x0f, 0x77, 0x98, 0xfd, 0x54, 0x7c, 0x62, 0x5d, + 0xf2, 0x7e, 0x20, 0x06, 0xce, 0x72, 0xd2, 0xa1, 0xbf, 0x69, 0x90, 0xe7, + 0x95, 0x4a, 0x08, 0x81, 0xdf, 0x95, 0x21, 0x10, 0xeb, 0x4a, 0x68, 0xe7, + 0x27, 0x76, 0xf0, 0xd5, 0x3f, 0xf9, 0x6a, 0xac, 0x0c, 0x49, 0x90, 0x8c, + 0x94, 0x32, 0x1d, 0x44, 0x20, 0x04, 0xb3, 0x7f, 0xf2, 0x55, 0xe4, 0x05, + 0x41, 0x65, 0x03, 0xf8, 0x52, 0x20, 0x34, 0x38, 0xbc, 0xf3, 0x96, 0xc0, + 0xd7, 0xf7, 0x9d, 0x15, 0xe2, 0x30, 0xb3, 0xb4, 0x36, 0x4c, 0xc2, 0xb5, + 0x62, 0xe7, 0x6b, 0xdd, 0x87, 0xdb, 0xc7, 0xf5, 0x4f, 0xaf, 0x26, 0x62, + 0xe7, 0xcf, 0xb9, 0xb6, 0x76, 0xdf, 0xe1, 0x24, 0xf0, 0x5f, 0x81, 0xbf, + 0x05, 0xbc, 0x57, 0x87, 0xff, 0x78, 0xc8, 0xf4, 0x69, 0xc7, 0xb5, 0x7d, + 0xcf, 0xa5, 0xe0, 0x3c, 0x97, 0x06, 0xec, 0x74, 0x35, 0xcb, 0xd4, 0xad, + 0xe6, 0xc0, 0x7c, 0x00, 0x5b, 0x8a, 0x28, 0xd8, 0x83, 0x54, 0x58, 0xa1, + 0x2b, 0x91, 0x77, 0x32, 0xec, 0x52, 0xb7, 0x77, 0xea, 0x3d, 0x97, 0xb9, + 0x36, 0xab, 0xba, 0xcc, 0xff, 0x55, 0x47, 0x01, 0xb5, 0x74, 0x7f, 0x2a, + 0x9f, 0xdb, 0x4f, 0xe3, 0xf7, 0x8f, 0xc2, 0x47, 0x04, 0xb5, 0x79, 0x89, + 0xd8, 0xda, 0x84, 0xf1, 0x32, 0x07, 0x3f, 0xe7, 0x21, 0xdd, 0x59, 0x00, + 0xea, 0x55, 0x41, 0xc3, 0x8b, 0xfa, 0xa7, 0xba, 0xaf, 0x40, 0x06, 0xe2, + 0xd6, 0xa3, 0x2c, 0xbc, 0x21, 0x19, 0xfb, 0x90, 0xea, 0x4f, 0x17, 0xde, + 0x88, 0xf7, 0x61, 0x63, 0x9f, 0x76, 0x39, 0xf8, 0x86, 0x04, 0x66, 0x11, + 0xc5, 0xa3, 0x2c, 0x88, 0xc8, 0xd6, 0xd8, 0x8f, 0xdd, 0x24, 0x58, 0x78, + 0x43, 0x52, 0xf7, 0xa7, 0xfa, 0xfa, 0xc0, 0x4c, 0xc8, 0xd6, 0x4d, 0xb3, + 0x2a, 0xaf, 0x2f, 0xe9, 0x6b, 0xb7, 0xcf, 0x94, 0x19, 0x93, 0xd1, 0xf5, + 0xd0, 0x82, 0x38, 0x18, 0xc2, 0x72, 0x01, 0x1a, 0xaf, 0x1b, 0x90, 0xf8, + 0x6e, 0xfe, 0xec, 0x7f, 0xff, 0x33, 0x3e, 0xf9, 0x7f, 0x7c, 0x12, 0x80, + 0x5d, 0x1b, 0x77, 0x45, 0x69, 0x9e, 0x55, 0xa0, 0xd3, 0xb1, 0xdf, 0xbe, + 0x27, 0x73, 0xbc, 0x7c, 0xb9, 0xf1, 0xed, 0x24, 0x40, 0xcb, 0xc8, 0x06, + 0x67, 0x15, 0x12, 0x55, 0x2a, 0x88, 0x6c, 0xb0, 0x96, 0xd4, 0xe3, 0xb4, + 0x47, 0x8f, 0x1d, 0x8f, 0x85, 0x0b, 0xa7, 0x80, 0x0c, 0x7a, 0xa9, 0x63, + 0x29, 0xc7, 0xbb, 0x3e, 0x3b, 0x5c, 0xa8, 0x14, 0xcb, 0xf8, 0xa9, 0x7d, + 0xb8, 0x0f, 0x81, 0x39, 0x1f, 0xd7, 0x80, 0x68, 0x9c, 0x4e, 0xb8, 0x2e, + 0xed, 0x33, 0xfd, 0xe0, 0xb3, 0x98, 0x92, 0xe7, 0x61, 0xa7, 0x03, 0x41, + 0x34, 0xf6, 0x5c, 0x1a, 0x29, 0xd3, 0x38, 0x73, 0x54, 0xdd, 0x67, 0x59, + 0xf6, 0x5b, 0x9d, 0xad, 0x1c, 0x09, 0x6c, 0x52, 0x76, 0x21, 0xb1, 0x9c, + 0x50, 0x20, 0x2a, 0x88, 0x01, 0x7e, 0x5c, 0x7d, 0xde, 0xd2, 0xdf, 0x6c, + 0x88, 0x29, 0x84, 0xe5, 0x04, 0x84, 0x10, 0x09, 0x10, 0xf8, 0x03, 0x76, + 0x93, 0xeb, 0x6c, 0xb1, 0x3d, 0xa0, 0x46, 0x10, 0xca, 0x14, 0xdc, 0x0a, + 0xde, 0x99, 0xd9, 0xec, 0x84, 0x2b, 0xd2, 0x7e, 0x08, 0x76, 0x25, 0xc0, + 0x5a, 0x4a, 0xbe, 0x6c, 0xab, 0x36, 0x5b, 0x92, 0xb4, 0x97, 0x9a, 0x88, + 0x91, 0x1a, 0x72, 0xa9, 0x19, 0x8d, 0xc5, 0x3a, 0xba, 0x27, 0x8a, 0xc1, + 0xbf, 0xb6, 0x50, 0xd1, 0xd7, 0xe1, 0xc7, 0xbb, 0x7e, 0x78, 0xdf, 0x60, + 0xf7, 0xe1, 0x9d, 0xaa, 0x8f, 0x37, 0xa7, 0x40, 0x5a, 0x78, 0x0a, 0x12, + 0x55, 0xad, 0xc2, 0x64, 0xb5, 0xca, 0x1c, 0x1e, 0x9e, 0xa7, 0xe0, 0x51, + 0x36, 0x50, 0x6b, 0x0e, 0x14, 0xe0, 0xca, 0xd2, 0x9e, 0x39, 0xb5, 0xac, + 0xa2, 0x7c, 0xa8, 0x40, 0xf0, 0x66, 0xd4, 0xea, 0xf4, 0x64, 0x95, 0x19, + 0x3c, 0xbc, 0x39, 0xcb, 0xb6, 0xaa, 0xa1, 0x54, 0x9e, 0xf2, 0x3f, 0x33, + 0xa7, 0xc2, 0xa6, 0x27, 0xa3, 0x9a, 0xdf, 0xfd, 0xa7, 0x6a, 0xe4, 0xeb, + 0x25, 0x01, 0x5f, 0xf0, 0xe0, 0xd6, 0xdb, 0xad, 0x4c, 0x7f, 0x67, 0x11, + 0x48, 0x00, 0xb5, 0xac, 0xf0, 0xdb, 0xf4, 0xfe, 0x7c, 0xe4, 0x91, 0xc3, + 0x8c, 0x6e, 0xfb, 0x37, 0x1c, 0x3e, 0xac, 0x12, 0x6f, 0x5b, 0x1c, 0xe5, + 0xf0, 0xe8, 0x22, 0x77, 0xdf, 0x32, 0xca, 0xdd, 0x7f, 0xaa, 0x46, 0xb3, + 0x5e, 0xfe, 0x2d, 0xb8, 0xf5, 0x4f, 0x95, 0xfd, 0x4b, 0x2e, 0x7c, 0x45, + 0x97, 0xe0, 0x11, 0x7d, 0x89, 0xf9, 0x88, 0x0b, 0x4c, 0x7a, 0x3c, 0xf2, + 0x1b, 0x30, 0xfa, 0x3b, 0xf1, 0xec, 0x3c, 0x0f, 0x66, 0xf6, 0xc0, 0xcc, + 0x74, 0x95, 0x99, 0x39, 0x0f, 0xa6, 0x3d, 0xa6, 0xf7, 0xa8, 0x3a, 0xd8, + 0x10, 0x31, 0x4f, 0x37, 0x62, 0xb8, 0x8d, 0xc7, 0xdc, 0x9c, 0xda, 0x36, + 0x40, 0xad, 0x2a, 0x55, 0xa8, 0xea, 0xf4, 0x9e, 0x86, 0x93, 0x11, 0x07, + 0x9b, 0x4d, 0xef, 0xb1, 0x33, 0x37, 0x36, 0x55, 0x36, 0xac, 0x57, 0x07, + 0x6e, 0xe6, 0xb8, 0xd9, 0x45, 0x6a, 0x35, 0xcf, 0x03, 0x85, 0xa3, 0xc7, + 0xbb, 0x97, 0x79, 0xfe, 0x68, 0x7b, 0x0e, 0x9f, 0x09, 0x0a, 0xa1, 0xc2, + 0x53, 0xae, 0xeb, 0x87, 0x52, 0x56, 0x9e, 0x36, 0x38, 0x37, 0x23, 0xa9, + 0xb9, 0x16, 0xee, 0xbb, 0x7f, 0x70, 0x96, 0xff, 0x40, 0xd1, 0xe5, 0x7e, + 0x6e, 0x0a, 0xe9, 0xe3, 0x66, 0xf6, 0x73, 0xae, 0xdd, 0x01, 0x80, 0x02, + 0x55, 0x49, 0x01, 0x02, 0xf5, 0x4c, 0xf3, 0x7e, 0x14, 0x58, 0x0b, 0xe0, + 0x51, 0xab, 0x9c, 0x65, 0x14, 0xe0, 0x69, 0xaf, 0x94, 0xdc, 0x2f, 0x5c, + 0x1e, 0x16, 0x3e, 0x77, 0x00, 0xcf, 0x00, 0xad, 0x00, 0x7c, 0xfb, 0xde, + 0xc7, 0x01, 0x21, 0x25, 0x63, 0xc0, 0xbc, 0x10, 0x54, 0x64, 0x47, 0x9d, + 0x0d, 0xac, 0xe7, 0x14, 0x63, 0x02, 0x44, 0xd1, 0x05, 0x07, 0x2a, 0xbe, + 0x4f, 0xb3, 0x28, 0x68, 0x2d, 0x49, 0x4a, 0xae, 0x4b, 0x59, 0x4a, 0x16, + 0x34, 0xc4, 0x50, 0x3a, 0x22, 0x2c, 0xa7, 0x91, 0x79, 0x2e, 0x4c, 0x51, + 0x68, 0x10, 0x95, 0x02, 0x6a, 0x8d, 0xeb, 0xdf, 0xc1, 0xbc, 0x23, 0x58, + 0x28, 0x12, 0x7e, 0xc8, 0xc7, 0x56, 0x8f, 0xe8, 0x39, 0x4a, 0xd6, 0xf9, + 0xb1, 0xe0, 0x48, 0xea, 0x52, 0x8d, 0xd8, 0x15, 0x02, 0xe8, 0x04, 0xa8, + 0xdf, 0x98, 0x06, 0x6c, 0x09, 0x47, 0x9d, 0x17, 0x65, 0xa0, 0x3e, 0x7a, + 0x20, 0x88, 0x3f, 0xca, 0xad, 0x48, 0x75, 0xfd, 0x35, 0x56, 0x16, 0x1c, + 0x6d, 0x47, 0xc0, 0xae, 0x1e, 0x3d, 0x0a, 0x14, 0xd4, 0x3d, 0xd4, 0x80, + 0x9f, 0xbb, 0x94, 0x92, 0x29, 0x21, 0x38, 0x4a, 0x3f, 0x50, 0xcb, 0x40, + 0xb6, 0x3a, 0xba, 0x9d, 0x7b, 0xa4, 0x3f, 0xbf, 0xe6, 0x9b, 0x25, 0xf8, + 0xcd, 0x0e, 0xd7, 0x6e, 0xfe, 0x15, 0xf8, 0xcb, 0xec, 0xbc, 0x2e, 0xa7, + 0x6c, 0xb0, 0x95, 0x01, 0x50, 0xd9, 0x10, 0xa9, 0x13, 0x1a, 0x34, 0x75, + 0xee, 0xfc, 0x05, 0x36, 0xe9, 0x4b, 0x87, 0x24, 0x10, 0x0b, 0x14, 0xfc, + 0x6a, 0xdd, 0xba, 0x75, 0x9c, 0x3d, 0x7b, 0x36, 0x84, 0x4b, 0xd9, 0xba, + 0xdc, 0x3e, 0x93, 0x3a, 0x77, 0xfe, 0x02, 0x53, 0x53, 0x53, 0xac, 0xd1, + 0x10, 0x2e, 0x03, 0xd4, 0x5a, 0x53, 0x59, 0xcb, 0xd4, 0x4d, 0xeb, 0x42, + 0x08, 0x97, 0xed, 0xd7, 0xd8, 0xcc, 0xce, 0xce, 0xf6, 0xb5, 0xcd, 0x85, + 0x96, 0x02, 0x6f, 0xd9, 0x40, 0xad, 0x35, 0x95, 0xb5, 0x21, 0x50, 0x6b, + 0x6a, 0x6a, 0x2a, 0xf4, 0x79, 0xed, 0xe6, 0x5f, 0x51, 0x89, 0xbe, 0x69, + 0x3d, 0xd3, 0xb4, 0xfa, 0x70, 0x21, 0xa0, 0x34, 0x52, 0x09, 0xe1, 0xfe, + 0x42, 0x08, 0x5c, 0x21, 0xc2, 0x21, 0xbc, 0xce, 0x52, 0xfa, 0x9d, 0x41, + 0xdb, 0xf7, 0xa9, 0x96, 0xe3, 0x4f, 0x0c, 0xc6, 0x3e, 0x54, 0xa7, 0xb1, + 0x68, 0x3d, 0x6f, 0x2d, 0x0a, 0x3e, 0xf7, 0xc0, 0x43, 0x08, 0xa7, 0x84, + 0x0c, 0x3a, 0x34, 0xce, 0xb4, 0x70, 0xdd, 0x92, 0x3a, 0x46, 0x75, 0x7f, + 0xa3, 0xc6, 0x15, 0xd5, 0x35, 0x86, 0x01, 0x66, 0xc9, 0x6e, 0x2b, 0x04, + 0x67, 0x85, 0xbe, 0x0c, 0x78, 0xab, 0x28, 0xe8, 0x2d, 0x75, 0x12, 0xe0, + 0x2d, 0x37, 0x7c, 0xe7, 0xa1, 0x75, 0x5a, 0x95, 0x77, 0xdf, 0xcb, 0x1e, + 0x4f, 0x7d, 0x5a, 0x5d, 0x8b, 0x37, 0xbd, 0x12, 0xb5, 0x6a, 0x87, 0x23, + 0x67, 0x94, 0xf5, 0xed, 0xf7, 0x3f, 0xca, 0xd6, 0xf5, 0x63, 0xa4, 0xe9, + 0xc8, 0x99, 0x05, 0xee, 0xa0, 0x12, 0xf3, 0x05, 0xf4, 0xf9, 0xf2, 0x5e, + 0x9b, 0xbf, 0x28, 0x5f, 0xc7, 0x1b, 0x6f, 0xb2, 0x75, 0xfd, 0x58, 0xe4, + 0x6b, 0x99, 0xf3, 0x99, 0xed, 0xeb, 0xa1, 0xc9, 0x71, 0xbe, 0xf8, 0x42, + 0x04, 0x1c, 0x16, 0x25, 0xa8, 0x39, 0x25, 0xca, 0x45, 0xd5, 0x57, 0xa9, + 0xb1, 0x94, 0x6e, 0x78, 0x4c, 0xdf, 0xfa, 0xc1, 0x0f, 0xf2, 0xda, 0x7f, + 0xfb, 0xcb, 0x4c, 0x28, 0x56, 0xe8, 0x27, 0x05, 0x0c, 0x25, 0x44, 0x85, + 0xca, 0x48, 0x8d, 0xd6, 0x52, 0x33, 0x13, 0xac, 0x65, 0x00, 0x5a, 0x52, + 0xb6, 0x62, 0xf1, 0x52, 0xb6, 0xe0, 0x3d, 0x63, 0x7c, 0x60, 0xa3, 0xba, + 0xef, 0x5f, 0x5f, 0x1e, 0xe5, 0x4c, 0x7b, 0x91, 0xf9, 0xef, 0x7c, 0x8f, + 0xf1, 0x5f, 0xfb, 0x30, 0xf3, 0xdf, 0xf9, 0x1e, 0xf3, 0xdf, 0xf9, 0x5e, + 0x08, 0xdb, 0xfa, 0xc1, 0xa9, 0xd3, 0x7d, 0xe5, 0x91, 0xb2, 0x15, 0x83, + 0x59, 0xd9, 0x61, 0xc9, 0x32, 0x00, 0xd4, 0xd6, 0x4f, 0xd0, 0xb4, 0xee, + 0x1d, 0x2a, 0x23, 0x35, 0x9a, 0x67, 0x5a, 0x7d, 0xf5, 0x32, 0xeb, 0x69, + 0x70, 0x31, 0x3b, 0x1f, 0x23, 0x93, 0x9f, 0x69, 0x23, 0x03, 0xde, 0x32, + 0xc0, 0xac, 0xac, 0x76, 0x01, 0x62, 0xe5, 0x19, 0x04, 0x35, 0xb3, 0x75, + 0xfa, 0xc2, 0xcb, 0x5c, 0x77, 0xed, 0x3a, 0xce, 0xbf, 0x7d, 0x96, 0xeb, + 0xae, 0x5d, 0x17, 0x03, 0x6c, 0xdd, 0xfa, 0xab, 0x1f, 0x64, 0x81, 0xb7, + 0x63, 0xc7, 0x74, 0xae, 0x5c, 0xb9, 0x72, 0xe5, 0xca, 0x95, 0x2b, 0x57, + 0xae, 0x5c, 0xb9, 0x72, 0xe5, 0xca, 0x95, 0x2b, 0x57, 0xae, 0x5c, 0xb9, + 0x72, 0xe5, 0xca, 0x95, 0x2b, 0x57, 0xae, 0x5c, 0xb9, 0x72, 0xe5, 0x1a, + 0x5e, 0x39, 0x54, 0x2b, 0x57, 0xae, 0x5c, 0xb9, 0x72, 0xe5, 0xba, 0x0a, + 0x24, 0xbb, 0xbd, 0xf0, 0x25, 0xdb, 0x9e, 0x9e, 0x6d, 0x11, 0x4e, 0xea, + 0xd4, 0xef, 0xd3, 0x75, 0xba, 0x1d, 0xf5, 0xc6, 0xb2, 0x96, 0x0d, 0xd4, + 0xaa, 0x57, 0x4b, 0x34, 0x17, 0x87, 0x9f, 0x61, 0x38, 0x08, 0x2e, 0xb5, + 0x1a, 0xf0, 0x54, 0xf2, 0x0b, 0xca, 0xe1, 0x8b, 0xca, 0x03, 0x24, 0x83, + 0xe8, 0xbb, 0xd2, 0xc9, 0xfc, 0x86, 0xfd, 0x22, 0x73, 0x96, 0x92, 0x75, + 0x30, 0xdb, 0x69, 0xf5, 0x1a, 0xa6, 0xbe, 0x9d, 0xee, 0x70, 0x50, 0x00, + 0xbf, 0xeb, 0x23, 0x96, 0xc1, 0x60, 0x88, 0xc4, 0x64, 0x59, 0x19, 0xa0, + 0x00, 0x59, 0x36, 0x4c, 0x0b, 0xa9, 0x5e, 0xb0, 0x37, 0x61, 0xe6, 0xcb, + 0xd2, 0x76, 0x39, 0xb3, 0x5e, 0xc4, 0xb7, 0x7d, 0x20, 0xc0, 0x91, 0x94, + 0x28, 0x21, 0xf5, 0x8b, 0xee, 0xa2, 0xab, 0xd2, 0xb4, 0x84, 0x08, 0x81, + 0x59, 0xf7, 0x3d, 0x77, 0x80, 0x92, 0x53, 0x0a, 0xa1, 0x58, 0xb5, 0xa2, + 0x40, 0x04, 0x50, 0x1f, 0xfd, 0xff, 0xd9, 0x7b, 0xff, 0x20, 0x37, 0x8e, + 0xf3, 0xce, 0xfb, 0xa3, 0x78, 0x2c, 0x37, 0x12, 0xd0, 0x1e, 0xc4, 0xab, + 0x0b, 0x20, 0x51, 0xf5, 0x02, 0xc9, 0x32, 0x24, 0x68, 0xd3, 0x11, 0x68, + 0xea, 0xca, 0xbb, 0x96, 0xdf, 0x2c, 0x37, 0xb2, 0x43, 0xae, 0xa2, 0x2b, + 0x89, 0x8a, 0xde, 0x2a, 0x51, 0xf1, 0x7b, 0xb4, 0x28, 0xd7, 0xc5, 0x91, + 0x1c, 0xc7, 0x96, 0x5c, 0xae, 0x9c, 0xe5, 0x1c, 0xaf, 0x64, 0x9f, 0xcb, + 0x67, 0xca, 0x8e, 0x63, 0xc9, 0x72, 0x4a, 0x3f, 0xcc, 0xd4, 0x59, 0x54, + 0xbd, 0xaf, 0x4f, 0xb4, 0xae, 0x6c, 0xed, 0x32, 0xb1, 0x6e, 0xc9, 0x44, + 0xba, 0x5d, 0x5d, 0x24, 0x2d, 0x94, 0x90, 0x26, 0x48, 0xef, 0xc6, 0xc0, + 0x1b, 0x2d, 0x09, 0x5c, 0xb4, 0x0e, 0xc6, 0x26, 0xae, 0xd0, 0x51, 0xc6, + 0xd1, 0xfb, 0x47, 0x77, 0xcf, 0xf4, 0x0c, 0x06, 0x58, 0x2c, 0x49, 0xfd, + 0xb8, 0xcb, 0x7c, 0x59, 0xcb, 0xe9, 0xe9, 0xe9, 0x7e, 0xba, 0xa7, 0x07, + 0x33, 0xd3, 0xd3, 0x33, 0xcf, 0xa7, 0x0b, 0xd4, 0x4e, 0x36, 0x03, 0xa0, + 0xd6, 0x83, 0x37, 0xed, 0x62, 0xf3, 0x27, 0xee, 0x04, 0x60, 0xef, 0xb5, + 0xd7, 0xf0, 0x99, 0x47, 0x0f, 0x51, 0x70, 0x05, 0x4d, 0xe3, 0x21, 0xa4, + 0xeb, 0x52, 0xd3, 0xc7, 0xef, 0xc4, 0x97, 0xf6, 0xab, 0xfa, 0x49, 0x0d, + 0xe8, 0x02, 0x1e, 0xfc, 0x50, 0xe8, 0x24, 0x66, 0xca, 0x93, 0x3e, 0xb4, + 0xfd, 0xe4, 0x36, 0xce, 0x39, 0xb9, 0x60, 0x7f, 0x5c, 0xf3, 0x9b, 0x32, + 0xd0, 0x2c, 0xfb, 0xe3, 0x59, 0x2b, 0x2c, 0x92, 0x1c, 0x0d, 0xa4, 0xfe, + 0x2f, 0xc1, 0x09, 0xce, 0x94, 0x51, 0x70, 0x05, 0xf5, 0x8e, 0x44, 0x78, + 0x92, 0x92, 0x09, 0x3b, 0x04, 0x5f, 0xb9, 0x9b, 0x74, 0x95, 0xd1, 0x02, + 0xf3, 0x4b, 0x12, 0x86, 0x00, 0xd9, 0xd5, 0xa5, 0xa4, 0xec, 0x58, 0xc7, + 0x31, 0xc1, 0xe1, 0xc4, 0xd3, 0xb3, 0x57, 0x27, 0x39, 0x53, 0xbb, 0x42, + 0x60, 0x5a, 0x46, 0xea, 0x74, 0x03, 0xf8, 0x69, 0x81, 0x6c, 0xe8, 0x96, + 0x88, 0x41, 0xb6, 0xfa, 0xc9, 0xeb, 0x48, 0x6a, 0x03, 0xbe, 0xd0, 0xb7, + 0xc1, 0x0c, 0xc3, 0xc8, 0x4e, 0x5f, 0xbe, 0xa2, 0x4c, 0xf5, 0x85, 0x2a, + 0x00, 0x95, 0x2b, 0x2a, 0x03, 0xc3, 0x95, 0xe2, 0x18, 0x6d, 0x7d, 0x0c, + 0xa5, 0x3e, 0xf7, 0x92, 0xc0, 0x12, 0xd2, 0x1f, 0x0c, 0xd4, 0xca, 0x88, + 0x4c, 0x82, 0x13, 0x64, 0x08, 0xac, 0x28, 0x15, 0xcb, 0xb4, 0x3b, 0xd1, + 0x72, 0xa4, 0xf4, 0x90, 0x48, 0xca, 0x9b, 0xca, 0x01, 0x50, 0xaa, 0x58, + 0x2c, 0x0e, 0x89, 0xd4, 0x4b, 0x96, 0x10, 0x62, 0x4d, 0x4f, 0x5d, 0x49, + 0xd7, 0xce, 0xf8, 0xf5, 0x6c, 0x60, 0x59, 0x09, 0x8a, 0xc3, 0xb2, 0x06, + 0xa5, 0x31, 0x70, 0xad, 0xae, 0xec, 0x52, 0xcc, 0xe7, 0xf1, 0xfc, 0xf0, + 0xdc, 0xf3, 0x74, 0x3d, 0x5c, 0x47, 0x44, 0xc2, 0x00, 0x8d, 0x96, 0x06, + 0x7a, 0x8c, 0xb8, 0x91, 0xf4, 0x49, 0x61, 0xa3, 0x46, 0xab, 0xf5, 0xaa, + 0xa4, 0x37, 0xe1, 0x46, 0xab, 0x45, 0x31, 0x1f, 0x75, 0xe8, 0x8f, 0xcb, + 0xde, 0x0f, 0xb3, 0x0f, 0x83, 0x64, 0xc0, 0x4e, 0xbf, 0x0d, 0x7c, 0x1d, + 0x22, 0x80, 0x2d, 0x1b, 0x84, 0xb5, 0x16, 0xc0, 0xd6, 0x6a, 0xf9, 0x07, + 0x95, 0x3f, 0x48, 0xa3, 0x1b, 0x36, 0x30, 0xba, 0x61, 0x03, 0x33, 0x33, + 0x33, 0x03, 0xd3, 0xed, 0x20, 0x04, 0x6b, 0x45, 0xf2, 0x13, 0x82, 0xad, + 0x4c, 0x38, 0xbe, 0xb4, 0xd3, 0xc6, 0x95, 0xb4, 0x3d, 0x0e, 0xd5, 0x1a, + 0xb5, 0x96, 0x06, 0xba, 0x15, 0x2f, 0xf7, 0x5c, 0x35, 0x33, 0x33, 0xc3, + 0x86, 0xd1, 0x51, 0x46, 0x37, 0x6c, 0x50, 0x00, 0xb2, 0xdf, 0xfd, 0x5d, + 0x46, 0x3f, 0xfa, 0xd1, 0x81, 0x80, 0xb1, 0xb8, 0x5a, 0xbe, 0x82, 0x68, + 0xbd, 0x77, 0x3c, 0x84, 0x68, 0xbd, 0x77, 0xfc, 0xbd, 0x3d, 0x71, 0x49, + 0x3a, 0x17, 0x28, 0xd6, 0xf9, 0xe6, 0x9d, 0xf2, 0x61, 0x5a, 0x5f, 0x6f, + 0x5c, 0x07, 0x0e, 0xfa, 0x6a, 0xe9, 0xf9, 0x61, 0x9c, 0x37, 0xc4, 0xfd, + 0x60, 0x35, 0x8d, 0x69, 0x78, 0x92, 0x01, 0x6b, 0xd9, 0x77, 0x43, 0x0f, + 0xf8, 0x21, 0x82, 0x5f, 0x7c, 0x43, 0x63, 0xb6, 0x7a, 0x35, 0x85, 0x47, + 0x77, 0x22, 0x74, 0xca, 0xc8, 0x1c, 0x55, 0x8e, 0x4b, 0x53, 0x3b, 0x94, + 0xe3, 0xcc, 0xf4, 0xe1, 0x39, 0xa6, 0xf0, 0x60, 0xc7, 0x54, 0xe8, 0xec, + 0xf2, 0x5d, 0xe5, 0xb0, 0x2d, 0xae, 0xdb, 0xcd, 0xae, 0xf5, 0x2a, 0xea, + 0xd0, 0xe3, 0xd3, 0xec, 0x42, 0xc2, 0x75, 0xbb, 0x54, 0xc4, 0xe3, 0xa1, + 0x53, 0xf7, 0xee, 0x9b, 0x76, 0x71, 0xf0, 0xd1, 0x69, 0xa6, 0xbf, 0x07, + 0xbb, 0x8f, 0xc3, 0x6c, 0xa9, 0xce, 0x78, 0x6b, 0x0a, 0x1e, 0x7d, 0x48, + 0x25, 0xb8, 0x69, 0x37, 0xf2, 0xea, 0xad, 0xc8, 0x91, 0xfb, 0x68, 0x2d, + 0xd7, 0xa8, 0x5c, 0x9f, 0xf4, 0x4b, 0xf8, 0xb5, 0x20, 0xf4, 0xf0, 0xe1, + 0x22, 0xb7, 0xfd, 0x07, 0x8f, 0xfa, 0xf7, 0xe2, 0xfd, 0x91, 0x5f, 0x8b, + 0xac, 0x3d, 0x7c, 0xb8, 0x38, 0x7c, 0x43, 0x9c, 0xab, 0x3e, 0xb6, 0x1f, + 0xd8, 0x1f, 0xae, 0x7f, 0xe5, 0x4e, 0xd8, 0x5e, 0x87, 0x23, 0xb3, 0x03, + 0xe1, 0x5a, 0xde, 0x2a, 0x8e, 0x24, 0x3d, 0xe9, 0x5f, 0x98, 0x5e, 0x3d, + 0xd1, 0x00, 0x49, 0xdd, 0x77, 0x93, 0x56, 0x1f, 0x6e, 0x2d, 0x61, 0xbb, + 0xdf, 0x61, 0xc2, 0x49, 0x71, 0xe7, 0x1b, 0x4e, 0xea, 0x6b, 0xd9, 0x71, + 0xab, 0x85, 0xe3, 0xcb, 0x88, 0xdc, 0x5c, 0x34, 0xec, 0x0d, 0x78, 0xce, + 0xc9, 0x12, 0x01, 0x6b, 0x65, 0x4c, 0x7f, 0xc6, 0xb2, 0x91, 0x19, 0xc9, + 0x45, 0x9c, 0xdd, 0x02, 0xd9, 0x7d, 0x12, 0x21, 0x42, 0xb0, 0x96, 0x31, + 0xe1, 0xe6, 0x23, 0x61, 0x03, 0xd6, 0x0a, 0xb2, 0x8c, 0x44, 0xc3, 0x36, + 0x58, 0x6b, 0x18, 0xd9, 0x40, 0xa9, 0xb5, 0xa2, 0x8a, 0x2e, 0x24, 0xda, + 0xe8, 0x42, 0xd8, 0x12, 0x40, 0x97, 0x9f, 0x92, 0xd1, 0x50, 0x2d, 0x80, + 0x6d, 0xbc, 0x89, 0x75, 0xff, 0x5f, 0x93, 0x6d, 0x56, 0x1c, 0x3a, 0xdd, + 0x85, 0x2e, 0xff, 0x42, 0xda, 0x3a, 0x9f, 0xe3, 0xd2, 0x4f, 0xb5, 0xa7, + 0x25, 0x50, 0x67, 0x7c, 0xc7, 0x24, 0x27, 0x96, 0xea, 0x9c, 0x58, 0x6a, + 0xe2, 0x52, 0x03, 0xca, 0x88, 0x2f, 0xcf, 0x51, 0x43, 0x5d, 0xdb, 0x5d, + 0x66, 0x99, 0xfd, 0x16, 0x4c, 0xde, 0x58, 0x60, 0x32, 0x06, 0xd4, 0x8a, + 0xd4, 0x51, 0xf4, 0x5e, 0x7b, 0x6d, 0x18, 0x94, 0x70, 0x40, 0x14, 0x6f, + 0x46, 0x36, 0x1e, 0xe9, 0x49, 0xb7, 0x9a, 0xfa, 0xf5, 0xd5, 0xdd, 0xac, + 0xc0, 0xeb, 0x80, 0x6b, 0x3d, 0x2b, 0xb6, 0x9a, 0x20, 0xdf, 0x0c, 0x38, + 0x39, 0xda, 0x2f, 0xd5, 0xa8, 0x6c, 0x18, 0xdc, 0xa7, 0x1d, 0x46, 0x99, + 0xac, 0x3a, 0x77, 0x0f, 0x7d, 0x7b, 0x3a, 0x08, 0x03, 0x74, 0x3b, 0x6d, + 0x84, 0x10, 0x91, 0x38, 0x48, 0xbe, 0x36, 0xd8, 0xcf, 0x57, 0xf2, 0xac, + 0x1e, 0xd1, 0x11, 0xd0, 0x7c, 0x31, 0x8c, 0x4f, 0xaa, 0x6b, 0x12, 0x94, + 0xcc, 0x28, 0xa9, 0xcd, 0x53, 0xbd, 0x71, 0xf5, 0x4e, 0x2b, 0xfc, 0x76, + 0x14, 0x58, 0x0b, 0x14, 0x58, 0xeb, 0x47, 0xbd, 0xc9, 0xff, 0xd9, 0x4a, + 0x81, 0xec, 0x57, 0xd7, 0xa4, 0x03, 0x9e, 0x00, 0x3a, 0x44, 0x40, 0x1f, + 0x75, 0xc2, 0xeb, 0xe4, 0xff, 0xee, 0x67, 0xc8, 0xf4, 0xd3, 0x35, 0xa6, + 0x26, 0xca, 0x6c, 0xdd, 0x52, 0x61, 0x01, 0xf0, 0x44, 0x97, 0x5a, 0x43, + 0x22, 0xb6, 0xab, 0x16, 0xa8, 0x35, 0x24, 0x53, 0x9f, 0x2b, 0x46, 0x40, + 0x5a, 0xb6, 0x6a, 0xee, 0x6c, 0x04, 0x8e, 0x35, 0x8c, 0xe2, 0xc0, 0xad, + 0x60, 0xcc, 0xc6, 0x81, 0xb1, 0x2b, 0x04, 0xf3, 0x2f, 0xcc, 0x06, 0xb0, + 0x2e, 0xa3, 0xf8, 0xf8, 0x52, 0xcd, 0x9d, 0xa5, 0x7d, 0x7f, 0x8b, 0x9c, + 0xc8, 0xb3, 0xff, 0xfa, 0x47, 0x78, 0xec, 0x8a, 0xbd, 0x00, 0xdc, 0x50, + 0x7a, 0x88, 0x47, 0x16, 0xf7, 0x06, 0xe9, 0x2a, 0xcf, 0x4d, 0x29, 0xb0, + 0x96, 0x96, 0x7d, 0x2f, 0x38, 0xf4, 0xed, 0x43, 0xec, 0xde, 0xb0, 0x9b, + 0x83, 0x8b, 0x07, 0x99, 0xfd, 0xc6, 0xc3, 0x4c, 0x7e, 0xe8, 0x16, 0x00, + 0xca, 0x37, 0xa9, 0xb1, 0xd3, 0x73, 0x1d, 0x1f, 0x9f, 0x9c, 0x98, 0xe4, + 0xb1, 0x6f, 0xf5, 0xef, 0x37, 0x1b, 0x40, 0x16, 0x52, 0x01, 0xb1, 0x44, + 0x9f, 0x89, 0x0c, 0xc6, 0xc7, 0x2a, 0xcc, 0xcd, 0x57, 0x91, 0x7e, 0x97, + 0xc9, 0xf7, 0x8d, 0x03, 0x30, 0xfb, 0x54, 0x14, 0xd9, 0x31, 0x28, 0xff, + 0x20, 0x89, 0x6c, 0x0e, 0x3a, 0x2e, 0x21, 0x8a, 0x5a, 0xdd, 0xbb, 0xe1, + 0x04, 0xd0, 0x40, 0x7a, 0x9b, 0x29, 0xae, 0xdf, 0x45, 0x63, 0xf9, 0xe1, + 0xbe, 0x36, 0x9a, 0xad, 0x3a, 0x9e, 0x6c, 0xe1, 0x8a, 0x3c, 0xb9, 0x91, + 0x3c, 0xad, 0x46, 0x0e, 0xac, 0x11, 0xbc, 0xae, 0xe7, 0x51, 0x5e, 0xbf, + 0x8b, 0x5a, 0xe3, 0x08, 0x9e, 0xdf, 0xc4, 0x75, 0xd4, 0xfd, 0xdf, 0x06, + 0x6a, 0x35, 0x5b, 0x0d, 0x3c, 0x59, 0xc7, 0x15, 0x25, 0x9a, 0xad, 0x1a, + 0x9e, 0xac, 0x03, 0x1a, 0x90, 0xe0, 0x4b, 0xa2, 0xa8, 0x6c, 0x75, 0xec, + 0x84, 0x9e, 0xe8, 0xc2, 0x8c, 0xc9, 0x0b, 0x27, 0x3a, 0x3e, 0x2f, 0xad, + 0x31, 0xfe, 0xbe, 0x00, 0x4e, 0x47, 0x44, 0xea, 0x64, 0xab, 0xeb, 0xb5, + 0xa9, 0x14, 0x6f, 0xa6, 0xda, 0x78, 0x44, 0xd5, 0xc9, 0x6f, 0xea, 0xba, + 0xd6, 0x82, 0xba, 0x66, 0xdc, 0x02, 0x8d, 0x46, 0xb5, 0x6f, 0xdb, 0x78, + 0xd2, 0x0b, 0x20, 0x60, 0x6a, 0x5f, 0xca, 0xc4, 0x91, 0xdb, 0xae, 0xc8, + 0x2b, 0xe8, 0x97, 0xa3, 0x81, 0x03, 0xb1, 0x89, 0x0d, 0xa4, 0xdf, 0xa6, + 0x90, 0x2f, 0xd1, 0x6a, 0x28, 0x20, 0x86, 0x70, 0x86, 0x73, 0xe0, 0x6f, + 0x1c, 0x8d, 0x2e, 0x0f, 0x34, 0x82, 0x2d, 0x80, 0x02, 0x5c, 0x1d, 0x38, + 0xaa, 0x60, 0x4e, 0x06, 0xec, 0x64, 0xcb, 0x86, 0x3d, 0xed, 0xdb, 0xa3, + 0xd2, 0x1e, 0x6d, 0x00, 0xfb, 0x4c, 0x02, 0xbd, 0x68, 0x34, 0x14, 0x6c, + 0xab, 0xa8, 0xb6, 0x1b, 0xf0, 0x96, 0x09, 0x1f, 0x6d, 0xa8, 0xb2, 0x40, + 0xd9, 0x78, 0x32, 0xf8, 0x69, 0x84, 0x23, 0x53, 0x77, 0x3d, 0x33, 0xd4, + 0x2e, 0x05, 0x7a, 0xd2, 0x1c, 0xda, 0xa5, 0xc3, 0x30, 0xba, 0x23, 0x88, + 0x3f, 0x3c, 0xaa, 0x6c, 0x1e, 0x5e, 0x5a, 0x82, 0xdb, 0x55, 0xdc, 0x8e, + 0x25, 0xd4, 0x80, 0x1b, 0x70, 0xf5, 0xe3, 0x0a, 0x74, 0x75, 0x55, 0xec, + 0x94, 0xde, 0xb6, 0x0d, 0x58, 0x1a, 0xe5, 0xf0, 0x77, 0xd5, 0xfa, 0xe8, + 0x92, 0xb2, 0x73, 0xd7, 0x75, 0xb0, 0xec, 0xa1, 0x80, 0x5a, 0x5a, 0x07, + 0x80, 0x3d, 0xc0, 0xc4, 0x9e, 0xb0, 0xed, 0x0c, 0x98, 0xec, 0xe8, 0x81, + 0xd0, 0xa6, 0x01, 0x6c, 0x05, 0xed, 0xa8, 0x41, 0x66, 0x06, 0x6c, 0x16, + 0x40, 0xb5, 0x80, 0x7d, 0x07, 0xc2, 0xf4, 0x46, 0xe1, 0x31, 0x69, 0xf0, + 0xf7, 0xaf, 0xf2, 0x1d, 0x48, 0x08, 0x81, 0x7c, 0xa1, 0xd6, 0x03, 0x78, + 0x1d, 0x24, 0xe9, 0x0f, 0x80, 0x1c, 0x46, 0x12, 0x9a, 0xf3, 0x34, 0xf6, + 0xee, 0xef, 0x5c, 0x01, 0x55, 0x49, 0xe3, 0xf1, 0x43, 0xc0, 0xb4, 0x54, + 0x91, 0xb1, 0x6b, 0x86, 0x70, 0xf5, 0x23, 0x72, 0xf8, 0xfe, 0x57, 0x76, + 0x0c, 0xfc, 0x4f, 0x44, 0xf2, 0x0d, 0xb3, 0xaf, 0xaf, 0x05, 0x74, 0xcb, + 0x96, 0x79, 0x37, 0x21, 0x1c, 0xa0, 0x23, 0xb9, 0xcf, 0x81, 0x82, 0x0f, + 0x4d, 0x07, 0x2a, 0x3e, 0x54, 0x1d, 0xdd, 0x07, 0xf2, 0xe1, 0x36, 0x21, + 0xb8, 0x4f, 0x4a, 0x3c, 0x47, 0x30, 0xe7, 0x4b, 0xaa, 0x4e, 0xf2, 0xf1, + 0x93, 0x0e, 0xcc, 0x03, 0xc2, 0x97, 0xd4, 0xfd, 0xf0, 0x9e, 0x62, 0x4f, + 0x02, 0x52, 0x5b, 0x69, 0x92, 0x13, 0x39, 0xe2, 0x57, 0xcd, 0x2a, 0x28, + 0x38, 0x19, 0xa8, 0x63, 0x12, 0x07, 0xf9, 0xda, 0x6d, 0x6a, 0xc5, 0xcf, + 0x3b, 0x20, 0xcc, 0x24, 0x3f, 0xbe, 0x64, 0x0c, 0x55, 0x07, 0xe8, 0xe2, + 0x3a, 0x19, 0x3c, 0x5f, 0xa1, 0x16, 0xbb, 0xba, 0x1e, 0xfd, 0xe8, 0xd0, + 0x5d, 0x1f, 0x16, 0x1c, 0x01, 0xbe, 0xc4, 0x4c, 0x13, 0x64, 0x0f, 0x81, + 0x98, 0x7b, 0xc2, 0x38, 0x92, 0x9a, 0x23, 0xe8, 0x22, 0xc9, 0x20, 0xe8, + 0xfa, 0x92, 0x8c, 0x80, 0xa6, 0xde, 0x5e, 0x8b, 0x8f, 0x79, 0x48, 0x14, + 0xd4, 0xd0, 0xc9, 0xa9, 0xfb, 0x51, 0xb5, 0x1c, 0x67, 0xa5, 0x00, 0x00, + 0x20, 0x00, 0x49, 0x44, 0x41, 0x54, 0xec, 0x37, 0x98, 0x31, 0xfb, 0x0c, + 0xd4, 0x3a, 0x12, 0xf4, 0x7b, 0xc5, 0x8c, 0x9e, 0x7c, 0x27, 0xe3, 0xc3, + 0x5c, 0xcf, 0x24, 0x5e, 0x72, 0xd5, 0xf7, 0x54, 0x2f, 0x5e, 0x74, 0x31, + 0x97, 0xbf, 0xf2, 0xf2, 0x6b, 0xbe, 0x7c, 0xee, 0xa5, 0x77, 0x70, 0xe9, + 0x5b, 0xd4, 0x45, 0xd9, 0x00, 0xa6, 0x0c, 0x34, 0xea, 0xcc, 0x4f, 0xce, + 0x86, 0xd0, 0xa9, 0xb3, 0xa7, 0x82, 0x78, 0x1b, 0x36, 0x65, 0xc3, 0xb1, + 0x0c, 0x54, 0xca, 0xb6, 0x01, 0x44, 0x40, 0x54, 0xaf, 0xb6, 0xcd, 0x53, + 0xa7, 0x4e, 0xc1, 0x4f, 0x14, 0x1c, 0xec, 0x74, 0x0c, 0xa8, 0x05, 0x04, + 0x90, 0x2e, 0x63, 0xcf, 0xd8, 0x31, 0x36, 0xce, 0x36, 0xcf, 0xb0, 0x71, + 0xe3, 0x46, 0x4e, 0x9d, 0x3a, 0x15, 0x40, 0xbd, 0x0c, 0xbc, 0xcb, 0xa4, + 0x37, 0x65, 0x5e, 0x4a, 0xb8, 0xbe, 0x16, 0xd9, 0x97, 0x8e, 0x62, 0xde, + 0xa5, 0x15, 0x23, 0x81, 0x36, 0x5a, 0x1e, 0x79, 0xd7, 0x65, 0xf3, 0xa6, + 0x32, 0x27, 0x62, 0x93, 0xef, 0x6c, 0xde, 0x54, 0x66, 0xe1, 0x85, 0x1a, + 0xb9, 0x91, 0x02, 0xf5, 0x95, 0x26, 0x72, 0xb9, 0x09, 0xeb, 0x5d, 0x58, + 0x6a, 0xf1, 0xc5, 0xaf, 0x7c, 0x91, 0xf9, 0x93, 0x55, 0x66, 0x5f, 0x98, + 0x27, 0x37, 0xa2, 0xee, 0x23, 0x6d, 0x3d, 0xb9, 0x8d, 0xab, 0xc7, 0x13, + 0x9b, 0x1d, 0x49, 0xf3, 0x78, 0x1d, 0xcf, 0x6b, 0x33, 0x7e, 0xd5, 0x56, + 0x32, 0x23, 0x0a, 0xda, 0x6f, 0xc0, 0x59, 0x99, 0x91, 0x1c, 0xed, 0x46, + 0x13, 0x91, 0x15, 0x88, 0xac, 0x08, 0xc0, 0xfe, 0x00, 0x99, 0x11, 0x28, + 0x78, 0x92, 0xb6, 0xd7, 0x0b, 0xbe, 0xba, 0xe5, 0xaa, 0x22, 0x0f, 0x3f, + 0xdd, 0x00, 0x60, 0xa1, 0x76, 0x82, 0x23, 0xcb, 0x0d, 0x4a, 0x49, 0x9d, + 0x0d, 0xad, 0xad, 0xe5, 0xcd, 0xd4, 0x1b, 0x4d, 0x76, 0xdd, 0xb4, 0x97, + 0x87, 0x9f, 0xfe, 0x4c, 0x90, 0xaf, 0x78, 0xc5, 0x18, 0xb7, 0x5c, 0xa5, + 0xf2, 0xd5, 0xdd, 0x0a, 0xed, 0xf9, 0x47, 0x86, 0xb6, 0x65, 0x2b, 0x6e, + 0xcb, 0xe8, 0xc8, 0x72, 0x35, 0x62, 0x6b, 0xd7, 0x4d, 0x7b, 0xb9, 0xe7, + 0xf3, 0xe1, 0x3b, 0x84, 0x7e, 0xb6, 0xee, 0x3c, 0xb2, 0xc0, 0xd4, 0xfb, + 0xc3, 0x67, 0x94, 0xda, 0x91, 0x2a, 0xe5, 0xed, 0x15, 0x78, 0xb4, 0x3f, + 0x88, 0xd6, 0x86, 0x3e, 0x0d, 0x02, 0x3a, 0x49, 0xd9, 0x0c, 0xc0, 0x54, + 0x06, 0x20, 0x65, 0xc2, 0xfd, 0xa0, 0x5c, 0xc3, 0x40, 0xa2, 0x6c, 0x8d, + 0xfd, 0xea, 0xaf, 0x04, 0xcb, 0xf9, 0x3f, 0xff, 0x2b, 0xd6, 0xe7, 0xa3, + 0x6f, 0xff, 0xaa, 0xdf, 0xaf, 0x07, 0x75, 0xb1, 0xcb, 0x35, 0xe1, 0x38, + 0x38, 0xcb, 0xde, 0xd6, 0xb4, 0xfa, 0xb1, 0x42, 0x14, 0x28, 0xe4, 0x0b, + 0x34, 0x57, 0x0a, 0x91, 0x34, 0x46, 0xab, 0x01, 0xb5, 0xe2, 0xe9, 0x93, + 0xea, 0xa3, 0xec, 0xd7, 0xd7, 0xd4, 0x06, 0xf1, 0x74, 0xa3, 0x6f, 0x9f, + 0xe2, 0xc7, 0x2f, 0xd7, 0x79, 0xdb, 0xc5, 0x0a, 0x64, 0x6b, 0x87, 0x01, + 0xde, 0x76, 0x71, 0x89, 0x17, 0xcf, 0x3e, 0xcd, 0xaf, 0x6e, 0xbd, 0x09, + 0x80, 0x9f, 0xf0, 0xdf, 0x87, 0x2a, 0x27, 0x55, 0xaa, 0x54, 0xa9, 0x52, + 0xa5, 0x4a, 0x95, 0x2a, 0x55, 0xaa, 0x54, 0xa9, 0x52, 0xa5, 0x4a, 0x95, + 0x2a, 0x55, 0xaa, 0x54, 0xa9, 0x52, 0xa5, 0x4a, 0x95, 0x2a, 0x55, 0xaa, + 0x54, 0xa9, 0x52, 0x25, 0x2b, 0x85, 0x6a, 0xa5, 0x4a, 0x95, 0x2a, 0x55, + 0xaa, 0x54, 0xaf, 0x97, 0x76, 0x86, 0x4e, 0x8a, 0x5d, 0xe9, 0x05, 0xc0, + 0xac, 0xe0, 0x63, 0x6a, 0x00, 0x47, 0xd0, 0xd2, 0x33, 0x78, 0x2a, 0x85, + 0xf0, 0x22, 0x09, 0x78, 0x2b, 0x6d, 0xa4, 0xd7, 0xa0, 0x3d, 0xa4, 0x93, + 0x71, 0x3f, 0xd8, 0x54, 0x38, 0x9b, 0xba, 0xec, 0x89, 0x1f, 0x06, 0xb0, + 0x65, 0xa7, 0x3b, 0x17, 0x28, 0x97, 0x6d, 0xc7, 0xd4, 0x23, 0x5e, 0xa7, + 0xb5, 0xe4, 0xed, 0x57, 0x8f, 0x7e, 0xf5, 0x1c, 0x98, 0xd6, 0x81, 0x5c, + 0x36, 0x47, 0x6b, 0x08, 0xac, 0x4e, 0x04, 0x76, 0xb3, 0xb3, 0x0d, 0xdf, + 0x56, 0x41, 0x77, 0x8b, 0xfd, 0xc1, 0xb3, 0x9a, 0x99, 0x38, 0xc8, 0x93, + 0x15, 0x78, 0x1d, 0xa9, 0x3f, 0x9a, 0x57, 0x70, 0x2d, 0xd7, 0x11, 0x18, + 0xef, 0x54, 0x99, 0x30, 0x43, 0xb2, 0x51, 0xd7, 0xef, 0x22, 0x10, 0xe1, + 0x4c, 0xd7, 0xe6, 0x03, 0xfd, 0xac, 0xfe, 0x6a, 0xdb, 0x47, 0x83, 0xb5, + 0xd4, 0x52, 0xfa, 0x0a, 0x4e, 0xd5, 0x96, 0x5d, 0x9e, 0xf8, 0xd0, 0x6d, + 0x6c, 0xfe, 0xc4, 0x9d, 0x8c, 0x6f, 0xd9, 0x0a, 0xc0, 0x37, 0x3f, 0xbc, + 0x9b, 0xdf, 0x7c, 0xe0, 0x61, 0x04, 0x02, 0x37, 0x9f, 0xa3, 0xe9, 0x35, + 0xf1, 0x5a, 0xe1, 0x6f, 0xf4, 0xc1, 0x0f, 0xed, 0x66, 0xf3, 0x27, 0xee, + 0x64, 0xef, 0xb5, 0xd7, 0x50, 0x6b, 0x45, 0x67, 0x89, 0xfd, 0xe6, 0x47, + 0x94, 0xb3, 0x97, 0x81, 0x64, 0xb9, 0xbe, 0x60, 0x7c, 0xc3, 0x56, 0xca, + 0x9b, 0x0a, 0x94, 0x8b, 0x0a, 0xcc, 0x35, 0x77, 0x6c, 0x01, 0x50, 0xa0, + 0xad, 0x6b, 0xee, 0xbf, 0x8f, 0x27, 0x3e, 0x72, 0x5b, 0x00, 0xd2, 0xca, + 0x39, 0x39, 0x32, 0x4e, 0x26, 0x80, 0xac, 0xa9, 0xb6, 0x34, 0x01, 0xfd, + 0x91, 0xbe, 0xdd, 0x16, 0x66, 0x66, 0x5a, 0x47, 0x6d, 0x8f, 0xb7, 0x51, + 0xc4, 0xe9, 0x59, 0x83, 0xa8, 0x0a, 0xae, 0xa0, 0x29, 0x25, 0x78, 0x12, + 0x5c, 0xa1, 0xdb, 0xdd, 0x0b, 0xda, 0x0f, 0xa0, 0xe9, 0x49, 0x2a, 0x9b, + 0x0a, 0xcc, 0x9e, 0x3c, 0x81, 0xd7, 0xc9, 0x04, 0x6d, 0x26, 0x1c, 0xc0, + 0x53, 0xc7, 0xa8, 0xbc, 0x49, 0x7d, 0x84, 0x39, 0x36, 0x5a, 0x82, 0xe3, + 0xea, 0x03, 0x4a, 0x77, 0x8b, 0x00, 0xe3, 0x8f, 0x65, 0x9d, 0xd7, 0x2d, + 0xa9, 0x3e, 0x90, 0xc7, 0x81, 0x9a, 0x54, 0x80, 0xae, 0xb5, 0xba, 0xa2, + 0x18, 0xe0, 0x16, 0x28, 0xc7, 0x04, 0x80, 0xaa, 0x0f, 0x63, 0xb1, 0x74, + 0x52, 0x55, 0x51, 0x97, 0x05, 0x63, 0x59, 0x05, 0x9e, 0xf2, 0x3a, 0xad, + 0x20, 0x9f, 0xad, 0xf9, 0x0e, 0x94, 0x1c, 0x05, 0x5e, 0x6b, 0x23, 0x95, + 0x83, 0xc0, 0x10, 0xf0, 0xad, 0x7e, 0x40, 0xad, 0xd0, 0x99, 0xe2, 0x42, + 0xba, 0xee, 0x0f, 0xd6, 0x20, 0xa0, 0xd6, 0xa0, 0x3c, 0x36, 0x58, 0x2b, + 0xf4, 0x85, 0xb0, 0x5d, 0xfc, 0xa3, 0x52, 0x8e, 0x1b, 0xda, 0x25, 0x62, + 0x67, 0x1b, 0xbe, 0xa3, 0x82, 0xd1, 0xf3, 0x5a, 0x49, 0x64, 0x45, 0xd8, + 0x86, 0x11, 0xb0, 0x59, 0xf2, 0xb5, 0x4d, 0x38, 0x22, 0xe2, 0x38, 0xd4, + 0x2f, 0xec, 0x66, 0x5d, 0x32, 0x22, 0x43, 0xdb, 0x6b, 0x93, 0xd3, 0xf7, + 0x03, 0xdb, 0xa9, 0xa4, 0x2b, 0xed, 0x59, 0xd3, 0x55, 0x38, 0x37, 0x92, + 0x8b, 0xcc, 0xe2, 0x2c, 0x84, 0xc0, 0x5b, 0xf1, 0x70, 0xf5, 0x87, 0xec, + 0xf1, 0x30, 0x28, 0x20, 0x16, 0xfa, 0x7e, 0x52, 0x58, 0x5f, 0x08, 0xc0, + 0x62, 0x9e, 0x75, 0x7d, 0x74, 0x1d, 0x41, 0xcb, 0xf3, 0x10, 0x59, 0x11, + 0x81, 0x6b, 0xd9, 0xf2, 0x7c, 0x89, 0xec, 0x48, 0x75, 0x9e, 0xc5, 0xc2, + 0x71, 0xc9, 0x8e, 0xc4, 0xcb, 0x86, 0x90, 0x3c, 0x2f, 0x1b, 0x8d, 0x4f, + 0x4a, 0xdf, 0x42, 0xd9, 0xb3, 0xd3, 0xc4, 0xd3, 0x9b, 0xb2, 0xec, 0xf2, + 0x93, 0x64, 0xf6, 0x21, 0x5e, 0x37, 0xfb, 0xbc, 0xbe, 0x64, 0x4b, 0xb4, + 0x22, 0x8b, 0xc0, 0xfd, 0x3b, 0x77, 0x02, 0x51, 0xe8, 0xd3, 0x06, 0xf5, + 0xed, 0x3e, 0xa3, 0x3b, 0xa3, 0x65, 0x24, 0xc5, 0x0f, 0x1b, 0x17, 0x97, + 0xe6, 0x6e, 0x71, 0x3f, 0x70, 0xd1, 0xcc, 0x0c, 0x8b, 0xc0, 0xa8, 0xae, + 0xcb, 0x86, 0x99, 0x19, 0x5e, 0xd1, 0xe1, 0xd5, 0x40, 0x5a, 0x46, 0x4b, + 0x8b, 0x8b, 0xdc, 0xae, 0xf7, 0x23, 0x0e, 0xb0, 0x8a, 0x03, 0xb5, 0x88, + 0xad, 0x9b, 0x3c, 0x87, 0x63, 0xeb, 0x49, 0x69, 0xed, 0xed, 0xa6, 0x1c, + 0x93, 0x6f, 0x87, 0x95, 0x06, 0xa2, 0x60, 0xad, 0x25, 0xce, 0x1d, 0xac, + 0xb5, 0x34, 0x33, 0xc3, 0x86, 0x8f, 0x7e, 0x34, 0x58, 0x5f, 0x04, 0x5e, + 0x59, 0x5a, 0xea, 0x81, 0x6a, 0x5d, 0xb2, 0x25, 0x0b, 0xb3, 0xaa, 0x65, + 0xdd, 0x6c, 0x78, 0x0d, 0xcf, 0xeb, 0x73, 0xf8, 0xe6, 0x23, 0x0a, 0xac, + 0x65, 0xeb, 0xe6, 0xa7, 0x56, 0x2f, 0xbf, 0x4c, 0xd4, 0xfd, 0x76, 0x58, + 0x0d, 0xba, 0x4f, 0xf4, 0x75, 0xc8, 0xd5, 0xaa, 0xfa, 0xba, 0x97, 0x61, + 0x39, 0xf7, 0x9a, 0xa5, 0x04, 0x76, 0xf9, 0x70, 0x28, 0xc1, 0xc6, 0x20, + 0xd0, 0x45, 0x4f, 0x1d, 0x84, 0x60, 0xfa, 0xf3, 0x9f, 0xa3, 0xa6, 0xaf, + 0x4f, 0x1e, 0xaa, 0xad, 0x5a, 0x7e, 0xd8, 0x66, 0xbf, 0x78, 0x8e, 0xfd, + 0xc0, 0x57, 0x5b, 0x6e, 0xb6, 0x1d, 0x5c, 0xa3, 0xd5, 0xb1, 0xb6, 0x1c, + 0xf5, 0x12, 0x80, 0x5a, 0xdd, 0x89, 0x29, 0x95, 0xe2, 0xf0, 0x34, 0xe0, + 0xf6, 0x05, 0x6a, 0x05, 0x7a, 0xfc, 0x10, 0x20, 0x42, 0xa0, 0x96, 0x25, + 0x71, 0xd3, 0x2e, 0x20, 0xc3, 0x6e, 0x3c, 0xe5, 0xca, 0x7c, 0xd3, 0x5e, + 0x60, 0x9a, 0xd9, 0xfc, 0x34, 0x56, 0xc9, 0xcc, 0x1d, 0xbf, 0x87, 0x29, + 0x6f, 0x17, 0xd3, 0xed, 0xf0, 0xd7, 0x53, 0xff, 0x9e, 0x47, 0xe9, 0xfd, + 0xfd, 0x7f, 0x19, 0xa5, 0xf7, 0xbb, 0x7d, 0xd3, 0x28, 0xe0, 0xd6, 0xeb, + 0x80, 0x62, 0xf8, 0xd8, 0xfe, 0xd5, 0xd3, 0xbc, 0x8a, 0xb2, 0xcf, 0x65, + 0xfb, 0x7e, 0x2d, 0x1c, 0x17, 0xe9, 0x7b, 0x08, 0x47, 0xb5, 0xc9, 0xd0, + 0x61, 0xdd, 0x77, 0x10, 0x42, 0x81, 0x62, 0xec, 0xfe, 0x44, 0x52, 0x1c, + 0xd0, 0x37, 0x6c, 0xfa, 0x67, 0xc3, 0x86, 0xc3, 0x7d, 0x1a, 0x3e, 0x9f, + 0xbd, 0x04, 0xab, 0xff, 0xe6, 0x26, 0x38, 0xc2, 0xbb, 0x39, 0x84, 0xec, + 0x86, 0xeb, 0xf1, 0x7b, 0x6f, 0x96, 0x08, 0xfc, 0x37, 0xc9, 0x46, 0x66, + 0x24, 0x06, 0xe7, 0xca, 0x42, 0xd0, 0xaf, 0x32, 0x79, 0x2d, 0xc7, 0x59, + 0x1b, 0xa8, 0x65, 0xc7, 0x35, 0x3b, 0xea, 0x77, 0x2f, 0x46, 0x8c, 0x03, + 0x91, 0xe5, 0x10, 0xd5, 0x07, 0xac, 0x65, 0xdf, 0xaf, 0x7f, 0x25, 0x7b, + 0x49, 0x64, 0x5b, 0xff, 0xde, 0xdd, 0xff, 0x7a, 0x32, 0x40, 0x2d, 0x03, + 0xcd, 0x1a, 0x1b, 0x0b, 0x9f, 0x06, 0xe6, 0xe7, 0xe7, 0x83, 0x34, 0xff, + 0x82, 0x8b, 0x81, 0x97, 0x5f, 0xf3, 0xfa, 0xad, 0x45, 0xe7, 0x7a, 0x5c, + 0x7e, 0x25, 0x7b, 0x09, 0xcf, 0xeb, 0x8e, 0x90, 0x7d, 0x8e, 0xcb, 0x8f, + 0x8f, 0xf3, 0x69, 0x57, 0x9d, 0xaf, 0x63, 0x63, 0x65, 0x64, 0x56, 0x50, + 0xfd, 0x5e, 0x99, 0xca, 0xfb, 0xe1, 0xbe, 0x3b, 0x6a, 0xec, 0xba, 0x51, + 0xfd, 0xae, 0xe4, 0xd9, 0x1c, 0x62, 0x9d, 0x75, 0x3d, 0x10, 0x2e, 0x52, + 0x7a, 0x91, 0x65, 0xb0, 0x4d, 0xdf, 0xcf, 0xcc, 0xb3, 0xa0, 0x59, 0x1a, + 0x98, 0x96, 0x0d, 0xd4, 0x32, 0x7d, 0xf6, 0xa4, 0x7e, 0x7c, 0xdc, 0x61, + 0xdc, 0x40, 0xab, 0xba, 0x1a, 0xe8, 0x9b, 0xc9, 0xe6, 0x98, 0xab, 0xd6, + 0x28, 0x5f, 0x9e, 0xa7, 0xde, 0x6c, 0x31, 0x5e, 0x29, 0xd3, 0xed, 0xb4, + 0xa9, 0x2e, 0xb6, 0x28, 0x15, 0xf2, 0x08, 0xa0, 0x90, 0x87, 0xda, 0x59, + 0x11, 0xa4, 0xef, 0x76, 0xda, 0xc1, 0x32, 0x1e, 0x67, 0x6c, 0xdb, 0xdb, + 0x4d, 0x9a, 0x5b, 0x3e, 0xb8, 0x9b, 0x87, 0xff, 0xd3, 0xc1, 0xc4, 0x7c, + 0x76, 0xfa, 0xa4, 0xed, 0xb6, 0xad, 0xda, 0x62, 0x9d, 0xca, 0x96, 0x32, + 0xf2, 0xcd, 0xe0, 0xfe, 0x63, 0x78, 0x24, 0x33, 0x97, 0xb8, 0x34, 0x9b, + 0x0d, 0x2a, 0x1b, 0xf2, 0x89, 0x60, 0x84, 0x28, 0x6c, 0x24, 0x6c, 0xd7, + 0x24, 0xd9, 0xc7, 0x37, 0x7e, 0x5e, 0xa7, 0x7a, 0xfd, 0xf5, 0x8b, 0xc0, + 0x0f, 0xad, 0xf5, 0xb7, 0xeb, 0xe5, 0x8f, 0xf5, 0xf2, 0x34, 0xc3, 0xcb, + 0x3e, 0xaf, 0xe3, 0xcf, 0x5c, 0xc3, 0x6a, 0x58, 0x78, 0xd5, 0xab, 0x21, + 0x03, 0x75, 0x88, 0x97, 0x5f, 0xb0, 0x96, 0xab, 0xd5, 0x4d, 0x0a, 0x3d, + 0x1c, 0xdc, 0x81, 0x47, 0x3a, 0x20, 0x47, 0xa0, 0x04, 0x94, 0x91, 0xfa, + 0x59, 0x42, 0x30, 0xd6, 0xe7, 0xaa, 0x59, 0x18, 0x50, 0xc6, 0xa0, 0x72, + 0xfb, 0xd5, 0x7b, 0x35, 0x9d, 0x6b, 0x3e, 0x88, 0x3d, 0x73, 0xd9, 0x63, + 0x29, 0x85, 0x1a, 0xb9, 0x8f, 0xe4, 0x99, 0xbf, 0xbf, 0xc6, 0xc3, 0x7e, + 0x9d, 0xf2, 0x16, 0xd7, 0x70, 0x77, 0x22, 0x12, 0xd9, 0xde, 0x70, 0xed, + 0x98, 0x1a, 0xc7, 0x28, 0x6f, 0x89, 0xf6, 0x75, 0x0d, 0x30, 0xab, 0xbe, + 0x28, 0xd9, 0x75, 0xa3, 0x4b, 0xf5, 0x05, 0x49, 0x7d, 0x51, 0x32, 0x76, + 0x85, 0xa0, 0xbe, 0x28, 0x29, 0x6d, 0x10, 0x8c, 0x5d, 0x21, 0x38, 0xf8, + 0xad, 0x5e, 0x60, 0x95, 0x7d, 0xd5, 0x76, 0x27, 0xe6, 0x68, 0x3d, 0xb9, + 0x15, 0x79, 0x56, 0x22, 0xd6, 0x89, 0x70, 0xc2, 0x86, 0xb3, 0x92, 0x39, + 0x7f, 0x8e, 0xf1, 0xf6, 0x38, 0xa5, 0x1b, 0x05, 0xe5, 0xfb, 0x0f, 0x05, + 0x40, 0x2d, 0x80, 0xc7, 0xea, 0x7b, 0x11, 0x0e, 0x3c, 0xfc, 0x65, 0xdd, + 0x0f, 0x5c, 0x7f, 0x88, 0xf2, 0x16, 0x81, 0x94, 0x0a, 0xd8, 0xb5, 0xff, + 0xfa, 0x47, 0x78, 0x64, 0x71, 0x2f, 0xe5, 0xce, 0x5d, 0xd4, 0x98, 0xa3, + 0x2a, 0xa6, 0xd9, 0xbd, 0x61, 0x37, 0x6c, 0x80, 0xd9, 0x6f, 0x3c, 0x4c, + 0xeb, 0x2a, 0xc1, 0x54, 0x61, 0x2a, 0x52, 0x2f, 0x79, 0x36, 0x76, 0x4d, + 0x5d, 0x27, 0x90, 0x67, 0x25, 0x5d, 0x09, 0x19, 0xd1, 0x1b, 0x37, 0x08, + 0xa8, 0x05, 0x20, 0x1c, 0x05, 0xd3, 0x0a, 0xe0, 0x5a, 0x09, 0x2a, 0x6f, + 0x19, 0x63, 0xf6, 0xa9, 0xd9, 0x60, 0xdd, 0xc0, 0xb4, 0xa4, 0x05, 0xfa, + 0x12, 0x59, 0xd3, 0x5f, 0x0e, 0xed, 0xd8, 0x7d, 0xb3, 0xad, 0x59, 0xeb, + 0xd8, 0x38, 0x79, 0xf0, 0x5b, 0xe0, 0xe4, 0x91, 0x7e, 0x1b, 0xd9, 0x29, + 0x10, 0xc5, 0x33, 0x83, 0x1a, 0x7b, 0x6b, 0x00, 0x45, 0xa4, 0xdf, 0xd6, + 0xc4, 0xb9, 0x64, 0x79, 0xb2, 0x45, 0xb9, 0xb8, 0x1d, 0x5a, 0x2a, 0x2c, + 0x56, 0x0a, 0x0a, 0x3e, 0xe2, 0xdb, 0x69, 0x9a, 0xaa, 0x08, 0xa7, 0x8d, + 0x3a, 0xb3, 0x8c, 0x76, 0x03, 0x07, 0xc1, 0xcf, 0x51, 0x58, 0x5f, 0xd6, + 0x36, 0xea, 0x94, 0x8b, 0x53, 0x3a, 0x2c, 0x34, 0x50, 0x2b, 0x59, 0x6a, + 0xe2, 0x0e, 0xd5, 0xa3, 0x91, 0xbe, 0xc0, 0x15, 0x7a, 0x4c, 0x56, 0x6d, + 0xc5, 0x15, 0x6a, 0x3c, 0xd9, 0x33, 0x13, 0x3c, 0x24, 0xaa, 0x09, 0x3d, + 0x68, 0x18, 0x80, 0x02, 0x9e, 0x6c, 0xe9, 0xb1, 0xb9, 0x02, 0xa5, 0xf5, + 0x65, 0xea, 0xcb, 0x6a, 0x7c, 0x38, 0x0c, 0x37, 0x71, 0xbd, 0x3c, 0xae, + 0x28, 0xe1, 0xc9, 0x61, 0x46, 0x1d, 0x0e, 0xf6, 0x46, 0xd9, 0xfb, 0x3e, + 0xe0, 0xac, 0x6e, 0xaf, 0x78, 0xba, 0xfd, 0x7a, 0xfb, 0xef, 0x5b, 0xb3, + 0x2e, 0x06, 0xeb, 0x35, 0xe8, 0x1a, 0x5e, 0x44, 0x1d, 0xd5, 0xa3, 0xfb, + 0x8a, 0x01, 0x24, 0x6a, 0xa2, 0xa8, 0x60, 0x5b, 0x06, 0x84, 0x05, 0x70, + 0xb4, 0x4f, 0xfe, 0x89, 0xa2, 0x82, 0x62, 0x19, 0x40, 0x96, 0x2d, 0x03, + 0xd0, 0xb2, 0x21, 0x5a, 0x13, 0x56, 0xbe, 0x78, 0xdc, 0x05, 0xd3, 0xef, + 0x2d, 0xc1, 0x1f, 0xfe, 0x1e, 0x3b, 0xee, 0x85, 0xc3, 0xb7, 0x27, 0x27, + 0x39, 0x3c, 0xaa, 0xc1, 0x5a, 0xc0, 0xc4, 0x04, 0xfc, 0x96, 0x17, 0xdf, + 0xa6, 0x46, 0xbe, 0x0e, 0x8f, 0x2e, 0x05, 0xe9, 0x6c, 0x1d, 0x38, 0x6a, + 0x2d, 0x8f, 0x02, 0x13, 0x0a, 0xac, 0xd5, 0x38, 0x0a, 0xc5, 0x09, 0x05, + 0xc3, 0x0a, 0x40, 0x62, 0xba, 0x8c, 0x62, 0xb1, 0xc8, 0x81, 0x03, 0x0d, + 0x26, 0x80, 0xe2, 0x9e, 0x22, 0xd0, 0xa0, 0x48, 0x11, 0x8a, 0x0a, 0xae, + 0x75, 0xe0, 0x40, 0x83, 0x7d, 0x7b, 0x4c, 0x09, 0x45, 0xf6, 0xed, 0x21, + 0x02, 0xd9, 0x6a, 0xf4, 0xd9, 0xdd, 0x7e, 0xe3, 0x66, 0xe7, 0xab, 0x73, + 0x85, 0x41, 0xf5, 0x83, 0x4d, 0x99, 0x78, 0x21, 0x04, 0x9e, 0x17, 0x9d, + 0xb0, 0x28, 0xa9, 0x5c, 0xa1, 0x9f, 0x21, 0x84, 0xaf, 0xa0, 0x4e, 0x7a, + 0x63, 0x34, 0x71, 0xbf, 0x77, 0x1d, 0x43, 0x02, 0xb5, 0x92, 0x64, 0x80, + 0xd2, 0xe1, 0x3e, 0x88, 0x00, 0xd6, 0x07, 0x80, 0xaf, 0xa6, 0xcb, 0xe9, + 0x5b, 0xf6, 0xab, 0x28, 0x7b, 0xdc, 0xcc, 0x7e, 0xcf, 0x15, 0x91, 0x05, + 0x78, 0xaa, 0x08, 0x75, 0xbd, 0xbc, 0x5b, 0xef, 0xcb, 0xad, 0xd6, 0x35, + 0xaf, 0xea, 0xc0, 0xad, 0x7e, 0x08, 0x71, 0xaa, 0x39, 0x82, 0x8a, 0x2f, + 0xf1, 0x7c, 0x85, 0xef, 0x95, 0x0e, 0x8c, 0xf9, 0x0a, 0x8a, 0x65, 0xda, + 0x5f, 0x3a, 0x02, 0x61, 0xbd, 0x27, 0x00, 0x03, 0xb4, 0xca, 0x20, 0xb2, + 0x19, 0x2a, 0x52, 0x52, 0x75, 0xf4, 0xb4, 0x46, 0xe6, 0x9d, 0x80, 0x13, + 0x1e, 0x83, 0x9e, 0xf7, 0xdf, 0xbe, 0x24, 0xe3, 0x84, 0x93, 0xd6, 0x08, + 0xa9, 0xc0, 0x88, 0x9e, 0x99, 0xec, 0xc9, 0x3a, 0x8e, 0xf3, 0x41, 0x48, + 0x01, 0xb5, 0xd4, 0xf3, 0x4a, 0x86, 0x02, 0x5d, 0x3c, 0x47, 0xd2, 0x95, + 0x82, 0x92, 0x03, 0x2d, 0x47, 0xd2, 0xf5, 0x05, 0xe3, 0x0e, 0x54, 0x51, + 0x61, 0x73, 0xad, 0x97, 0x3e, 0x8c, 0x3b, 0x30, 0x67, 0x80, 0x5a, 0x3a, + 0x5e, 0x20, 0x98, 0x23, 0xac, 0x5b, 0x50, 0x43, 0x1f, 0x32, 0xda, 0x5e, + 0x3b, 0x72, 0xdf, 0x51, 0xf5, 0xeb, 0x3a, 0x82, 0x0c, 0xfa, 0x67, 0x29, + 0x24, 0x2e, 0xe1, 0x73, 0xa6, 0x7d, 0x74, 0x9a, 0x7a, 0x62, 0x20, 0x21, + 0x84, 0x7a, 0xc7, 0x87, 0x7a, 0xd7, 0x97, 0xd3, 0x75, 0x32, 0xe1, 0xb2, + 0x10, 0x54, 0xed, 0xe3, 0xab, 0xdf, 0x73, 0xf1, 0x81, 0x0b, 0x77, 0x5e, + 0x9f, 0xab, 0xb6, 0x5d, 0xf2, 0x7d, 0xd6, 0x15, 0x14, 0x44, 0xca, 0x40, + 0xaa, 0x0c, 0x4c, 0x6a, 0xdd, 0xe9, 0xd3, 0x9c, 0xfa, 0xc1, 0x29, 0x00, + 0x36, 0xfe, 0xf2, 0xc6, 0x9e, 0xed, 0x27, 0x9f, 0x7b, 0x36, 0x02, 0xac, + 0x82, 0x64, 0xf0, 0x95, 0x81, 0x51, 0xbd, 0x9a, 0x36, 0x01, 0x4e, 0xfd, + 0xe0, 0x94, 0x02, 0x62, 0xfd, 0x40, 0x01, 0xb1, 0x4e, 0x9d, 0x3a, 0xc5, + 0xe4, 0xe4, 0x24, 0xeb, 0x2c, 0xb8, 0x16, 0xcf, 0x3d, 0x1b, 0x01, 0x63, + 0x19, 0x00, 0x97, 0x29, 0xe7, 0xcc, 0x4f, 0xce, 0x32, 0xb9, 0xed, 0xb2, + 0xa0, 0xbc, 0xd9, 0x23, 0xb3, 0x41, 0x5d, 0x81, 0x88, 0xcd, 0x53, 0xa7, + 0x4e, 0x71, 0x29, 0x2a, 0x8f, 0x0d, 0xe8, 0xc2, 0xfd, 0x05, 0x95, 0xf9, + 0x03, 0x6d, 0xf8, 0x2f, 0x2a, 0x18, 0xbf, 0x86, 0x57, 0x8f, 0x87, 0xfd, + 0x88, 0xbc, 0x2b, 0x12, 0xb9, 0x83, 0xd3, 0x47, 0xe7, 0x29, 0xe6, 0xdd, + 0x9e, 0xb8, 0xbc, 0xb9, 0x86, 0xe6, 0x05, 0x34, 0x24, 0xe5, 0x91, 0x12, + 0x6e, 0x65, 0x2b, 0xd3, 0x4f, 0xab, 0x8e, 0xa0, 0x01, 0x6a, 0x99, 0xb0, + 0xc4, 0x53, 0xef, 0x15, 0x63, 0xe3, 0xd4, 0x73, 0x4f, 0x2f, 0x50, 0xd9, + 0x54, 0x0a, 0xde, 0xe1, 0xc9, 0x8e, 0x24, 0x33, 0x42, 0x10, 0x06, 0x90, + 0x9d, 0xb0, 0xaf, 0x22, 0xb2, 0x82, 0x66, 0xa7, 0xad, 0xc1, 0x7e, 0x1e, + 0xb2, 0x23, 0x99, 0xbc, 0x76, 0x17, 0xcd, 0x17, 0xc3, 0x34, 0x0b, 0xb5, + 0x13, 0x1a, 0x4c, 0x95, 0x63, 0x6b, 0xb9, 0xc0, 0xc3, 0x4f, 0x37, 0xb8, + 0xf7, 0x0b, 0x9f, 0xe6, 0x37, 0x6e, 0xfb, 0x4c, 0xef, 0x0e, 0x42, 0x24, + 0x7e, 0xd7, 0x4d, 0x7b, 0x7b, 0xb6, 0xdb, 0xb6, 0x80, 0x81, 0xb6, 0x6c, + 0xc5, 0x6d, 0x2d, 0xd4, 0x4e, 0x00, 0xb0, 0x7d, 0x7d, 0x25, 0xb4, 0xf5, + 0xb9, 0x3b, 0x12, 0xf3, 0x66, 0x00, 0xf4, 0xfb, 0x63, 0x1c, 0xc1, 0xae, + 0x9b, 0xf6, 0x22, 0x56, 0x24, 0xad, 0x56, 0x1d, 0x69, 0xde, 0xe7, 0xae, + 0x2f, 0x31, 0x7b, 0xa4, 0x8a, 0x79, 0x3b, 0x11, 0x1c, 0xdf, 0x35, 0x9e, + 0xd3, 0x06, 0x16, 0x65, 0x80, 0x55, 0x5b, 0xdf, 0x39, 0x1e, 0x00, 0xa0, + 0xe2, 0x60, 0x2b, 0x5b, 0xab, 0xc1, 0xa4, 0x3e, 0x79, 0xfb, 0x04, 0x5f, + 0xbc, 0xf7, 0x28, 0xcb, 0xad, 0xb0, 0xa3, 0x33, 0xff, 0xe7, 0x7f, 0x05, + 0x84, 0x60, 0xad, 0xd5, 0xea, 0x94, 0x54, 0x3f, 0x03, 0xfd, 0xb2, 0xb7, + 0x99, 0x3a, 0x8f, 0x6f, 0xbb, 0x81, 0x85, 0xe3, 0x73, 0x6b, 0x82, 0x7d, + 0xc5, 0x6d, 0xd9, 0xfb, 0x9c, 0x54, 0x1f, 0x08, 0xf7, 0xfd, 0x5c, 0xca, + 0x31, 0x32, 0x10, 0xad, 0x38, 0x58, 0xcb, 0xde, 0x0e, 0x50, 0xfd, 0xfe, + 0x5f, 0xf0, 0xb6, 0x8b, 0x4b, 0x8c, 0x6c, 0xd1, 0x1b, 0xac, 0x73, 0x3a, + 0x55, 0xaa, 0x54, 0xa9, 0x52, 0xa5, 0x4a, 0x95, 0x2a, 0x55, 0xaa, 0x54, + 0xa9, 0x52, 0xa5, 0x4a, 0x95, 0x2a, 0x55, 0xaa, 0x54, 0xa9, 0x52, 0xa5, + 0x4a, 0x95, 0x2a, 0x55, 0xaa, 0x54, 0xa9, 0x52, 0x0d, 0xaf, 0x14, 0xaa, + 0x95, 0x2a, 0x55, 0xaa, 0x54, 0xa9, 0x52, 0xbd, 0x41, 0x14, 0x81, 0x69, + 0x01, 0x5e, 0xa7, 0x0b, 0x9d, 0xba, 0x0e, 0xb7, 0x40, 0x3b, 0x45, 0x1b, + 0xc0, 0x96, 0xb7, 0xd2, 0x06, 0xed, 0x20, 0x5d, 0x18, 0x29, 0x84, 0x1f, + 0x8a, 0xaf, 0xa2, 0x41, 0xf0, 0x1b, 0x1b, 0xf0, 0x12, 0x84, 0x07, 0x40, + 0x9d, 0xe2, 0x76, 0xce, 0x07, 0xa8, 0xd3, 0xcf, 0xce, 0x30, 0x90, 0xae, + 0x60, 0x9f, 0x74, 0x7d, 0xed, 0x7d, 0xe8, 0x67, 0xb3, 0x5f, 0x5a, 0x1b, + 0x7a, 0x63, 0xd4, 0xee, 0xac, 0xfe, 0x01, 0xe2, 0xd0, 0xfb, 0xae, 0x3f, + 0x80, 0xb6, 0x3f, 0xb7, 0x77, 0xb3, 0x6e, 0x6f, 0x3b, 0xeb, 0x74, 0xf6, + 0x87, 0xa3, 0x38, 0x32, 0x84, 0x3c, 0xf9, 0x02, 0x03, 0xfa, 0x91, 0xbe, + 0xd9, 0xa6, 0x01, 0x51, 0x52, 0x06, 0xce, 0xc1, 0xaa, 0xa4, 0x70, 0xf6, + 0x68, 0x21, 0x5c, 0x44, 0x47, 0xb0, 0xf9, 0x13, 0x77, 0x06, 0x79, 0xbf, + 0xf9, 0xe1, 0xdd, 0x7c, 0xe6, 0xd1, 0x43, 0x9c, 0xa8, 0x9d, 0x60, 0xef, + 0xb5, 0xd7, 0x70, 0xc7, 0xf6, 0xed, 0x6c, 0xfe, 0xce, 0x9d, 0x9c, 0xf8, + 0xd2, 0x7e, 0x05, 0xda, 0xd2, 0xce, 0xf0, 0x37, 0x5c, 0x39, 0x6e, 0xd5, + 0x4f, 0x06, 0x90, 0xae, 0xb0, 0xca, 0x0a, 0xd2, 0xf4, 0xe0, 0x47, 0x14, + 0x80, 0x2b, 0x92, 0x5e, 0xeb, 0x9a, 0xfb, 0xef, 0x23, 0xe7, 0xe4, 0x82, + 0x65, 0xd0, 0x7e, 0xe6, 0x43, 0x76, 0x6d, 0x43, 0x45, 0x5a, 0xb3, 0x48, + 0xc7, 0xda, 0xc7, 0x76, 0xca, 0xb5, 0xdb, 0xa8, 0x94, 0x15, 0x2c, 0x78, + 0xcd, 0x88, 0x6d, 0x00, 0x37, 0x9f, 0xa3, 0xbe, 0xd4, 0xa4, 0x64, 0xe0, + 0x5a, 0x42, 0x28, 0xa0, 0x94, 0xdf, 0x26, 0x47, 0x2e, 0xb0, 0x57, 0x6b, + 0xb5, 0x29, 0xb8, 0x05, 0xf5, 0xdb, 0xf0, 0x15, 0x44, 0xab, 0xd6, 0x68, + 0x06, 0x1f, 0xd8, 0x57, 0x97, 0x9a, 0x41, 0xf9, 0x95, 0x9e, 0xbd, 0x8b, + 0x4a, 0xa0, 0x1c, 0xab, 0x40, 0xcd, 0x48, 0xdd, 0x4e, 0x70, 0xa4, 0x6a, + 0x3b, 0x90, 0x0b, 0x20, 0x4c, 0x6b, 0x3f, 0x7f, 0x5a, 0x52, 0x92, 0xd7, + 0x1f, 0xcb, 0xd7, 0x24, 0x94, 0x63, 0xce, 0xca, 0x83, 0xd4, 0xd4, 0xc7, + 0x6f, 0x4c, 0xc3, 0x86, 0xe6, 0x3b, 0x6b, 0x2e, 0x7e, 0xa0, 0x84, 0x76, + 0xec, 0xa6, 0x0f, 0x88, 0x6b, 0x90, 0x72, 0xfa, 0xd8, 0xb7, 0x51, 0x36, + 0xf2, 0xd9, 0x1c, 0xad, 0xd6, 0xb9, 0xe0, 0x69, 0x06, 0x2b, 0x13, 0x01, + 0x2d, 0x65, 0x90, 0xd9, 0x1c, 0xad, 0x95, 0xb5, 0x97, 0x63, 0xc3, 0xb4, + 0x84, 0xe8, 0x05, 0xf6, 0xd9, 0xeb, 0x41, 0x1e, 0x73, 0xcd, 0x49, 0x80, + 0x68, 0xe5, 0xdc, 0x1c, 0x5d, 0xd9, 0x45, 0x08, 0x11, 0x80, 0xb2, 0xba, + 0xb2, 0x1b, 0xc4, 0x43, 0x2f, 0x40, 0xab, 0xbd, 0xd2, 0x56, 0x69, 0x74, + 0xd8, 0xfe, 0x08, 0xdd, 0xfc, 0x41, 0x08, 0xd0, 0x8a, 0x87, 0xdd, 0x11, + 0x37, 0x02, 0xd7, 0x32, 0xe1, 0xf8, 0xb9, 0x67, 0x03, 0xad, 0x5a, 0x09, + 0xbf, 0x69, 0x1b, 0xe4, 0x95, 0x14, 0x4e, 0x6a, 0xbb, 0x78, 0x5d, 0xe3, + 0xb6, 0x92, 0xd2, 0xf7, 0x4b, 0xd7, 0xaf, 0x9c, 0x7e, 0xf5, 0x6a, 0x0d, + 0x79, 0xef, 0xb4, 0xb5, 0x01, 0x58, 0x5c, 0x5c, 0x5c, 0x73, 0xbe, 0xb8, + 0x76, 0xee, 0x0c, 0xe9, 0x59, 0xc3, 0x42, 0xb0, 0x22, 0x1a, 0x55, 0xb8, + 0xa9, 0x8b, 0x74, 0xde, 0xc5, 0xd1, 0x51, 0x46, 0x81, 0x0d, 0xa3, 0xa3, + 0x8c, 0x6e, 0xd8, 0xc0, 0xcc, 0xcc, 0x0c, 0x4b, 0x43, 0xd4, 0x73, 0x54, + 0x23, 0xac, 0x0c, 0xc0, 0xea, 0x76, 0x76, 0x70, 0x2f, 0x87, 0x83, 0xed, + 0x71, 0xb0, 0x55, 0x14, 0x90, 0x35, 0xca, 0x0e, 0x0b, 0xa3, 0x75, 0xd8, + 0x4a, 0x6b, 0xe7, 0xb1, 0x41, 0x5c, 0xa6, 0xcc, 0x51, 0x9d, 0xcf, 0xe4, + 0x31, 0x70, 0x2d, 0xbb, 0x8c, 0xf3, 0x81, 0x6a, 0x19, 0x74, 0xd6, 0xcc, + 0xcc, 0x0c, 0xf7, 0x00, 0x77, 0x00, 0x1f, 0x99, 0x99, 0xe1, 0x49, 0xdd, + 0x3e, 0xab, 0xc9, 0x40, 0xa2, 0xe4, 0xbf, 0x7b, 0x2f, 0x37, 0x3b, 0xff, + 0x8d, 0xc6, 0xa7, 0xde, 0x0b, 0xc0, 0xf3, 0x7f, 0xf9, 0x3c, 0x8d, 0x4f, + 0xbd, 0x7b, 0x60, 0x5e, 0x17, 0x78, 0x04, 0xc1, 0xd6, 0xd8, 0x39, 0xe2, + 0xd2, 0xeb, 0x36, 0x6c, 0x6f, 0x83, 0xd5, 0xc1, 0x59, 0xfd, 0x24, 0xfa, + 0x84, 0xcd, 0xba, 0x04, 0x3e, 0x8b, 0x60, 0x3a, 0x72, 0xe7, 0x5e, 0xbd, + 0x4c, 0x73, 0x2f, 0x19, 0x77, 0x5d, 0x4e, 0x74, 0x3c, 0x26, 0xa5, 0x04, + 0x29, 0x29, 0x01, 0xb3, 0x0e, 0x54, 0xb2, 0x2e, 0xb5, 0x8e, 0x17, 0x00, + 0xb5, 0x5a, 0x3a, 0xbd, 0x01, 0x6d, 0xfd, 0xaf, 0xa0, 0xed, 0x13, 0x0a, + 0x30, 0x4a, 0x4b, 0xf5, 0xbb, 0xbb, 0x9b, 0x4a, 0x94, 0x3f, 0x7e, 0x1b, + 0x0d, 0x29, 0xe1, 0x85, 0x39, 0xf8, 0xd0, 0x14, 0x53, 0xa3, 0x65, 0x95, + 0xe6, 0xf8, 0xbc, 0x72, 0xb8, 0xdc, 0x56, 0x42, 0xac, 0xd7, 0x50, 0x9b, + 0x65, 0x7d, 0xdf, 0xd8, 0x56, 0x66, 0xd7, 0x7a, 0x9d, 0x6e, 0x45, 0xb9, + 0x17, 0x8b, 0xf7, 0x94, 0xa0, 0x54, 0x01, 0x32, 0x50, 0x9f, 0x83, 0xf7, + 0x94, 0x29, 0xeb, 0xbe, 0xfc, 0xe4, 0xb3, 0x25, 0xe6, 0x2a, 0x0b, 0x70, + 0xd5, 0x38, 0x5c, 0x5e, 0x46, 0x08, 0xc1, 0xcd, 0xc7, 0xf2, 0xc0, 0x1c, + 0xa2, 0xec, 0x62, 0x3b, 0x60, 0x2b, 0x38, 0x56, 0x5c, 0x51, 0x27, 0x24, + 0x3b, 0x8d, 0x88, 0x77, 0xa5, 0xfe, 0xfa, 0x09, 0x38, 0x72, 0x84, 0x1e, + 0x1d, 0x99, 0x85, 0xc7, 0x17, 0x56, 0x69, 0xa1, 0xd7, 0x5f, 0x5f, 0xfc, + 0xeb, 0x27, 0xf8, 0xa4, 0x59, 0x89, 0xef, 0x87, 0xec, 0xc2, 0xa7, 0xee, + 0x1b, 0xca, 0x8e, 0x81, 0x65, 0x49, 0x5f, 0xb5, 0x95, 0x1d, 0xce, 0xe7, + 0x5d, 0x5a, 0xad, 0xde, 0x78, 0x1b, 0x9e, 0x15, 0x87, 0x64, 0xf5, 0x8b, + 0x03, 0x05, 0xd9, 0x72, 0xb3, 0x79, 0xdc, 0xac, 0xa4, 0xd1, 0x8a, 0x02, + 0xae, 0x06, 0x85, 0xe3, 0xe9, 0x8d, 0x56, 0xcb, 0x67, 0x87, 0xed, 0x25, + 0x28, 0xd8, 0xd6, 0xa0, 0xfe, 0x98, 0xd4, 0x90, 0xce, 0x1e, 0xa0, 0x96, + 0x91, 0x71, 0xf0, 0x4d, 0x82, 0x72, 0x19, 0xb9, 0x39, 0x75, 0x81, 0x8b, + 0xdb, 0x70, 0xa2, 0x57, 0x9c, 0xc2, 0x48, 0x29, 0xb2, 0xde, 0x8d, 0xc1, + 0x1c, 0x44, 0x64, 0x7b, 0x14, 0xae, 0x25, 0x46, 0x00, 0x4f, 0x3b, 0x3f, + 0xfb, 0xc3, 0x39, 0x88, 0xad, 0xb5, 0x77, 0x6d, 0x6a, 0x7b, 0xae, 0x4f, + 0xb5, 0xe7, 0x9b, 0x3f, 0x49, 0x4d, 0x0d, 0xd4, 0x5a, 0xc7, 0x9b, 0xd8, + 0xf8, 0x4b, 0x3f, 0x0b, 0x40, 0xf7, 0xef, 0x8e, 0x73, 0xe6, 0x6f, 0xfe, + 0x81, 0x4b, 0x7f, 0xe9, 0x2d, 0x5c, 0xf1, 0x4b, 0xca, 0xf1, 0xf2, 0xcc, + 0xdf, 0xfc, 0x03, 0x00, 0x1d, 0x2e, 0x26, 0xcb, 0xcb, 0x6f, 0xc8, 0x7d, + 0x31, 0xba, 0x90, 0x36, 0x3f, 0xed, 0xba, 0x7c, 0xce, 0xf3, 0xb8, 0xcd, + 0x75, 0xb9, 0xcf, 0xf3, 0xb8, 0x23, 0x9b, 0xa7, 0xf2, 0x7e, 0x75, 0x85, + 0xfc, 0xec, 0x57, 0xf6, 0x72, 0xd7, 0xc7, 0x1e, 0x02, 0x60, 0xf2, 0xc6, + 0x28, 0xb8, 0x62, 0x10, 0x50, 0x4b, 0xfa, 0xd0, 0x7c, 0x51, 0xe2, 0xe9, + 0xeb, 0x40, 0x65, 0x83, 0x3e, 0xaf, 0x1b, 0x8f, 0xf4, 0x00, 0xb3, 0x92, + 0x80, 0x5a, 0xf6, 0xd2, 0xc8, 0x40, 0xaf, 0xec, 0x70, 0xb7, 0xd3, 0xa6, + 0x54, 0x50, 0xb6, 0x4b, 0x85, 0x7c, 0x04, 0x5e, 0x05, 0x50, 0x6f, 0xb6, + 0xf0, 0xda, 0x5e, 0x90, 0xc7, 0x86, 0x5c, 0xf5, 0x83, 0x68, 0xc5, 0xb7, + 0x9b, 0x34, 0x06, 0xa8, 0x35, 0x6c, 0xbe, 0x7e, 0x65, 0x95, 0x4a, 0x65, + 0x5a, 0x4d, 0xe0, 0xcd, 0xc0, 0x3a, 0xa1, 0x98, 0xd5, 0xfa, 0xd7, 0xe2, + 0x3a, 0x2e, 0xd5, 0xc5, 0x56, 0x00, 0xd6, 0x0a, 0xdb, 0xba, 0xf7, 0x59, + 0x3e, 0x18, 0xd7, 0x60, 0x6d, 0x70, 0xcf, 0x54, 0xaf, 0xbf, 0x7e, 0x18, + 0x5b, 0xff, 0x11, 0x21, 0x58, 0x6b, 0x2d, 0x40, 0xad, 0x0b, 0xa1, 0x7e, + 0x40, 0xa9, 0x12, 0x70, 0x70, 0x00, 0x8c, 0xea, 0x42, 0x29, 0xa9, 0x6c, + 0xdd, 0xab, 0xa4, 0x00, 0x2c, 0x30, 0x18, 0xac, 0xd5, 0x22, 0x7c, 0x36, + 0x18, 0x43, 0xc3, 0x1c, 0x56, 0x54, 0xcf, 0x7d, 0xdc, 0x85, 0x9a, 0x27, + 0x10, 0xb1, 0x7d, 0x28, 0x58, 0x7f, 0x46, 0x6d, 0x07, 0x4a, 0x8e, 0x02, + 0xf8, 0x34, 0x07, 0x94, 0x37, 0xa8, 0xde, 0xc3, 0xea, 0x42, 0x03, 0xcc, + 0x6a, 0xc7, 0x3c, 0xca, 0x5b, 0x5c, 0xca, 0x5f, 0x28, 0x52, 0xfb, 0x4e, + 0x2b, 0x12, 0x6f, 0xfa, 0xba, 0xfd, 0xc2, 0xe6, 0x3a, 0x53, 0x5f, 0xb4, + 0xfa, 0xcc, 0x1a, 0x9a, 0x65, 0x64, 0x5f, 0x89, 0xe7, 0x5f, 0x48, 0x18, + 0x5f, 0xb0, 0x12, 0xd4, 0x8e, 0xc9, 0x60, 0xbd, 0xbe, 0xa8, 0xc2, 0x39, + 0x0d, 0xb3, 0x92, 0x67, 0x25, 0x12, 0x05, 0xac, 0xaa, 0x1f, 0x9d, 0x66, + 0x7c, 0xc7, 0x14, 0xc5, 0xeb, 0x95, 0x53, 0x3c, 0xdf, 0xd2, 0xf6, 0xff, + 0x4d, 0x03, 0x80, 0xb1, 0x3f, 0x2e, 0x06, 0x40, 0x2d, 0x80, 0xdd, 0x37, + 0x46, 0xfb, 0xec, 0x77, 0xcd, 0xdc, 0xac, 0xca, 0xe3, 0x2e, 0x2a, 0xef, + 0x11, 0x4c, 0xfd, 0x9b, 0x16, 0xed, 0x3f, 0x56, 0xa0, 0x84, 0xcd, 0xcd, + 0x29, 0x36, 0x03, 0xed, 0x97, 0xa2, 0x75, 0x8d, 0xc3, 0xaf, 0xec, 0x1e, + 0x59, 0x57, 0x27, 0x35, 0x63, 0xd7, 0x53, 0xef, 0xbf, 0x99, 0xe9, 0xef, + 0x3d, 0x12, 0x49, 0x6f, 0x20, 0x5a, 0x26, 0x1c, 0x97, 0xe7, 0xe9, 0x49, + 0x03, 0xdc, 0x42, 0x50, 0x5e, 0xb5, 0x3a, 0x1b, 0x49, 0x53, 0xa9, 0x28, + 0x14, 0x70, 0xb5, 0x3a, 0x1b, 0x80, 0xb5, 0x64, 0xc7, 0x0b, 0xc0, 0x5a, + 0xab, 0x4a, 0x03, 0xb5, 0xf0, 0x5b, 0x08, 0x31, 0xa6, 0xfa, 0x73, 0x9d, + 0xa4, 0x27, 0xe4, 0x22, 0xd0, 0x40, 0x38, 0x5b, 0x15, 0x58, 0xab, 0x8f, + 0x5c, 0x91, 0xa7, 0xbd, 0xd2, 0xc2, 0x93, 0x2d, 0x5c, 0x91, 0x27, 0x37, + 0xe2, 0xd2, 0x6a, 0xe4, 0xc0, 0x9a, 0x14, 0xc3, 0x15, 0x05, 0x3c, 0xe9, + 0x81, 0x9f, 0xc3, 0xcd, 0xba, 0x2a, 0xec, 0x54, 0x80, 0x1a, 0xf8, 0xbb, + 0xc1, 0x99, 0xa5, 0xeb, 0xb5, 0x15, 0xa4, 0x4a, 0x94, 0x82, 0x70, 0x08, + 0x76, 0xed, 0x37, 0x3e, 0x68, 0x26, 0xb8, 0x50, 0x4b, 0x4f, 0x2a, 0x90, + 0x16, 0x28, 0x20, 0x97, 0x81, 0x69, 0xa9, 0x31, 0xc1, 0xb5, 0xf6, 0x7a, + 0x9a, 0xb8, 0xa2, 0xa2, 0xc0, 0x5a, 0x34, 0x69, 0xaf, 0x98, 0x3a, 0x85, + 0x61, 0xd7, 0x29, 0x90, 0x1b, 0xc9, 0xd1, 0x68, 0x54, 0xfb, 0x5a, 0x71, + 0x45, 0x5e, 0xdb, 0xe8, 0x23, 0xa7, 0x4d, 0xd7, 0xf3, 0x14, 0x90, 0xac, + 0x58, 0x46, 0xb6, 0x0c, 0xdc, 0xb6, 0x8c, 0xd4, 0xe3, 0xa2, 0xc2, 0x29, + 0x04, 0xed, 0x2a, 0x44, 0x4e, 0x1f, 0x8f, 0x3a, 0x30, 0xd5, 0xdf, 0xae, + 0x56, 0xb1, 0x08, 0x34, 0x14, 0xa4, 0xa9, 0x91, 0xb0, 0xfd, 0x68, 0x52, + 0xe4, 0x04, 0xec, 0x01, 0x26, 0x8a, 0x45, 0x9d, 0xa6, 0x41, 0xa3, 0x61, + 0xd9, 0xd3, 0x32, 0xb0, 0x29, 0x13, 0x6f, 0x6c, 0x35, 0x80, 0x7d, 0x07, + 0x74, 0x7c, 0xf0, 0x5f, 0x18, 0x77, 0xd7, 0x8e, 0x58, 0x79, 0x3b, 0xc0, + 0x1a, 0xfa, 0x5a, 0xbb, 0x7e, 0x2f, 0x81, 0x84, 0x15, 0xd3, 0xe1, 0x51, + 0xd8, 0xbf, 0x1f, 0x9e, 0xbc, 0x2e, 0x1a, 0x37, 0x0a, 0x1c, 0x1e, 0x5d, + 0x62, 0x69, 0x09, 0xfa, 0x30, 0xb9, 0x82, 0xfd, 0x0c, 0xf6, 0xbd, 0x41, + 0xd0, 0x1e, 0x8d, 0xa3, 0xa8, 0xc6, 0xd2, 0x3b, 0x69, 0x40, 0x59, 0x47, + 0x1b, 0x0d, 0xf6, 0xed, 0x29, 0xea, 0xb6, 0x6b, 0xe8, 0x6c, 0x0d, 0x8a, + 0x45, 0x95, 0x72, 0x62, 0x22, 0xcc, 0xd3, 0x30, 0xc0, 0x2d, 0xb4, 0xdd, + 0x22, 0x14, 0x29, 0x06, 0x90, 0xad, 0x03, 0xc0, 0xbb, 0x56, 0xdd, 0xc3, + 0x0b, 0xa3, 0x61, 0xe0, 0x5a, 0x41, 0x1a, 0x0d, 0x74, 0x8a, 0xf7, 0xbd, + 0xfb, 0xca, 0xc0, 0xe7, 0x13, 0xca, 0x92, 0x66, 0x4c, 0xd8, 0x75, 0xd5, + 0xb8, 0xd9, 0xb0, 0x90, 0xaf, 0xa1, 0x80, 0x5a, 0xf6, 0x96, 0x55, 0xde, + 0x6d, 0x5a, 0x29, 0x84, 0x83, 0xda, 0x3f, 0x9f, 0x60, 0x5f, 0x93, 0x80, + 0xb5, 0xaf, 0xb5, 0x84, 0x2f, 0x91, 0xe6, 0xbd, 0x86, 0x01, 0x6a, 0xf9, + 0x92, 0x5b, 0x81, 0x82, 0x1f, 0xc2, 0xb4, 0xee, 0x1d, 0x83, 0xdb, 0x43, + 0x3a, 0x15, 0x05, 0x1f, 0x76, 0x01, 0x87, 0xf4, 0x7a, 0x2d, 0xf6, 0xfe, + 0x6b, 0x5e, 0xd0, 0x33, 0xc9, 0x8b, 0x3d, 0xb6, 0x6f, 0x26, 0x14, 0x11, + 0x59, 0x57, 0x8d, 0x0e, 0xe8, 0x77, 0xe8, 0xc2, 0x6a, 0x35, 0x21, 0x44, + 0xa4, 0x7e, 0xe3, 0x3e, 0x2c, 0x64, 0x85, 0x82, 0xed, 0x38, 0xd1, 0x9e, + 0x94, 0x14, 0xea, 0xda, 0xad, 0xf0, 0x3e, 0xd1, 0xfe, 0x82, 0xd4, 0x26, + 0xe3, 0x63, 0xa4, 0x4d, 0xa1, 0x52, 0x64, 0x9c, 0x0c, 0x75, 0xd9, 0x25, + 0x23, 0x72, 0xe0, 0x77, 0x99, 0xf3, 0x4d, 0xce, 0x28, 0x8b, 0x6d, 0xce, + 0x57, 0xfd, 0xc1, 0x05, 0xd4, 0xbe, 0x09, 0x47, 0x30, 0x8e, 0x64, 0xce, + 0xbc, 0xa3, 0xb5, 0x26, 0x49, 0x52, 0xb0, 0x2c, 0x0d, 0x69, 0x94, 0x90, + 0x73, 0xa0, 0xed, 0x43, 0x21, 0xab, 0xdf, 0xbb, 0xfa, 0xd0, 0xf5, 0x55, + 0x3b, 0x08, 0xbd, 0x2f, 0xc2, 0x8f, 0x1d, 0x0f, 0xb3, 0x0f, 0xbe, 0x7a, + 0x5f, 0x9b, 0x23, 0x04, 0x6b, 0xb5, 0x21, 0xf8, 0xbd, 0xb6, 0x81, 0x39, + 0x56, 0xd7, 0xe5, 0xaf, 0xbc, 0xcc, 0x8b, 0x17, 0x5d, 0xfc, 0x9a, 0x2f, + 0x7f, 0xfa, 0x93, 0xb3, 0x5c, 0x4a, 0x08, 0xb6, 0x32, 0x00, 0xab, 0x93, + 0x06, 0x3e, 0xf5, 0x0a, 0x6c, 0xdc, 0xb8, 0x31, 0xd8, 0x0e, 0x0a, 0x3e, + 0x75, 0x5a, 0xaf, 0x6f, 0xd4, 0x9d, 0x63, 0x03, 0x95, 0xb2, 0x81, 0x58, + 0x67, 0x9b, 0x67, 0xd8, 0xb4, 0xed, 0x4a, 0x4e, 0x3e, 0xf7, 0xec, 0x05, + 0xb7, 0x09, 0x70, 0xfa, 0xf4, 0x69, 0x4e, 0xdb, 0xc0, 0x2c, 0x2d, 0x03, + 0xc0, 0xda, 0xb8, 0x71, 0x63, 0xb0, 0x7d, 0xd3, 0xb6, 0x2b, 0x7b, 0x40, + 0x58, 0x97, 0xbe, 0x75, 0x5d, 0x90, 0x6f, 0xe3, 0xc6, 0x8d, 0x01, 0xa0, + 0xeb, 0xb4, 0x86, 0x74, 0x9d, 0x6d, 0x9e, 0x81, 0x57, 0x60, 0x72, 0x72, + 0x92, 0xd3, 0x1a, 0x06, 0xb6, 0x71, 0xe3, 0xc6, 0x60, 0x7f, 0x2e, 0x7d, + 0xeb, 0xba, 0xa0, 0xbe, 0x06, 0xf4, 0xa5, 0xec, 0xfd, 0xc2, 0x10, 0x47, + 0x1c, 0xa6, 0x26, 0xc6, 0x38, 0x71, 0xb2, 0x96, 0x08, 0xd4, 0x02, 0x02, + 0x78, 0x96, 0x51, 0x31, 0xef, 0xe2, 0x01, 0xad, 0x96, 0x47, 0x61, 0x7d, + 0x01, 0x21, 0x72, 0xe4, 0x36, 0xb9, 0xb8, 0x97, 0xe7, 0xf0, 0x5e, 0x54, + 0x7d, 0x37, 0xf7, 0x72, 0xd5, 0x5b, 0x6d, 0xaf, 0x78, 0x78, 0x2f, 0xb6, + 0x83, 0x6d, 0xee, 0xe5, 0x39, 0x72, 0x23, 0x30, 0xb6, 0x29, 0x7c, 0xbb, + 0x5e, 0x3d, 0xa9, 0xc7, 0xfc, 0xac, 0x77, 0xb5, 0x5d, 0xeb, 0xfd, 0x66, + 0x5f, 0x99, 0xf7, 0xb1, 0x59, 0x41, 0xf3, 0xc5, 0x26, 0xf7, 0x7c, 0xfe, + 0x10, 0xa5, 0x62, 0x72, 0xd2, 0xef, 0xde, 0x77, 0x77, 0x5f, 0x33, 0x47, + 0x96, 0xab, 0x6c, 0x5f, 0x5f, 0xa1, 0x54, 0x54, 0x75, 0x6f, 0xbc, 0x30, + 0xcf, 0x63, 0x33, 0x4d, 0x4a, 0x45, 0xa8, 0x37, 0x72, 0xe4, 0xe2, 0x33, + 0x5c, 0x0d, 0xd0, 0x91, 0xe5, 0x2a, 0xa5, 0x5a, 0x9b, 0x5b, 0xae, 0x2a, + 0x26, 0xda, 0x32, 0x65, 0x04, 0xd2, 0xe7, 0xf1, 0x6f, 0xde, 0xf1, 0x39, + 0xc6, 0x46, 0xca, 0x64, 0x00, 0x41, 0x06, 0x1c, 0xc1, 0xec, 0x4a, 0x8d, + 0xfc, 0xb1, 0x36, 0xb7, 0x6c, 0x2b, 0x71, 0xe2, 0x98, 0xee, 0x93, 0xe6, + 0xcb, 0x01, 0x50, 0xab, 0x7e, 0xac, 0x4e, 0x69, 0x4b, 0x09, 0x96, 0x87, + 0xaf, 0xdf, 0xb0, 0x4a, 0x02, 0x45, 0xd9, 0xa0, 0xad, 0x61, 0x74, 0xff, + 0x57, 0x3e, 0x08, 0xc0, 0xbb, 0x7e, 0xe9, 0x65, 0xfe, 0xfe, 0x7f, 0x6e, + 0x66, 0xb9, 0xb5, 0xc4, 0xfc, 0x9f, 0xff, 0x15, 0x63, 0xbf, 0xfa, 0x2b, + 0x14, 0x2f, 0xf9, 0x11, 0x8f, 0xfe, 0xe7, 0xbf, 0x0a, 0x60, 0x5b, 0x3f, + 0x5c, 0x7c, 0xb1, 0xaf, 0x9d, 0x24, 0x98, 0x97, 0x59, 0x37, 0x00, 0xad, + 0x7e, 0xdb, 0xcf, 0x57, 0x5b, 0xdf, 0x39, 0xce, 0xc2, 0xf1, 0xde, 0x2b, + 0xe7, 0x85, 0xb2, 0x6f, 0x40, 0x5a, 0xf1, 0xa5, 0x91, 0x81, 0x6a, 0xc5, + 0xe3, 0x53, 0xa5, 0x4a, 0x95, 0x2a, 0x55, 0xaa, 0x54, 0xa9, 0x52, 0xa5, + 0x4a, 0x95, 0x2a, 0x55, 0xaa, 0x54, 0xa9, 0x52, 0xa5, 0x4a, 0x95, 0x2a, + 0x55, 0xaa, 0x54, 0xa9, 0x52, 0xa5, 0x4a, 0x95, 0x2a, 0xd5, 0xb9, 0x29, + 0x85, 0x6a, 0xa5, 0x4a, 0x95, 0x2a, 0x55, 0xaa, 0x54, 0x6f, 0x00, 0x35, + 0x96, 0xaa, 0xab, 0x43, 0x99, 0xb4, 0x23, 0xb4, 0x17, 0x73, 0x88, 0x16, + 0x8e, 0xa0, 0xb9, 0xb2, 0xfa, 0x07, 0x5c, 0x22, 0xe1, 0x03, 0x6c, 0x21, + 0x44, 0xf0, 0xc5, 0x76, 0xbf, 0x8f, 0xb3, 0x87, 0x81, 0x5a, 0x99, 0x74, + 0x49, 0xe1, 0xb5, 0xa4, 0x4f, 0x72, 0x4c, 0x1d, 0x06, 0xec, 0xd5, 0xcf, + 0x6e, 0xcf, 0x36, 0xbd, 0xbf, 0x81, 0xa3, 0xeb, 0x10, 0x69, 0x01, 0x72, + 0xd9, 0x1c, 0x2d, 0x5a, 0x7d, 0xd3, 0x9a, 0xf4, 0x43, 0x7f, 0xdc, 0x1e, + 0x80, 0xb5, 0x62, 0xf2, 0x43, 0xb0, 0x14, 0xbe, 0x40, 0x48, 0x2c, 0x18, + 0x0f, 0x20, 0xdc, 0xe0, 0x53, 0xef, 0xa6, 0x76, 0x78, 0xc2, 0x51, 0x69, + 0xf1, 0x45, 0x0f, 0x58, 0x0b, 0x42, 0x07, 0xd5, 0xe0, 0x63, 0x70, 0x19, + 0xfd, 0x10, 0xf5, 0x9b, 0x1f, 0x56, 0x00, 0xac, 0xbb, 0x81, 0xf1, 0x0d, + 0x5b, 0x91, 0x0e, 0xdc, 0xda, 0x38, 0x08, 0xf7, 0x1f, 0x64, 0x6e, 0x71, + 0x81, 0x13, 0x9f, 0x50, 0x70, 0x2d, 0x80, 0xc7, 0x9e, 0x9d, 0x63, 0x7c, + 0x8b, 0x72, 0x11, 0x7c, 0xf0, 0x43, 0xbb, 0xf9, 0xad, 0x07, 0x0e, 0xe2, + 0xfa, 0x82, 0x5b, 0xef, 0x3f, 0x48, 0x93, 0x36, 0x19, 0xcb, 0x31, 0xeb, + 0xc4, 0x97, 0xf6, 0xd3, 0xf4, 0x64, 0x04, 0xb0, 0x55, 0xef, 0x48, 0x72, + 0x4e, 0x0e, 0xe1, 0x43, 0xce, 0xc9, 0x45, 0x00, 0x5a, 0xf6, 0xac, 0xcd, + 0x76, 0x5d, 0xfb, 0x39, 0xd8, 0x06, 0x4e, 0xb8, 0xb1, 0x36, 0x6f, 0x02, + 0x05, 0xe3, 0x04, 0xd6, 0x91, 0x94, 0x37, 0x15, 0xf0, 0x5a, 0x6d, 0xaa, + 0x4b, 0x4d, 0x4a, 0x59, 0x41, 0xbd, 0x23, 0x43, 0xf0, 0x98, 0x03, 0x39, + 0xa2, 0x70, 0x80, 0x72, 0x5e, 0xad, 0xd7, 0x5a, 0xea, 0xe3, 0xd6, 0xea, + 0x52, 0x13, 0x91, 0xd5, 0x9f, 0xe9, 0x77, 0x64, 0x14, 0xfa, 0xb5, 0x9a, + 0x6c, 0x07, 0x0b, 0x47, 0x7d, 0xf0, 0xbe, 0x56, 0xb5, 0x57, 0xe9, 0xad, + 0xd7, 0x7d, 0x41, 0x04, 0xb9, 0xa0, 0xcb, 0xf0, 0x24, 0x48, 0x5f, 0xfd, + 0x66, 0xfb, 0xc1, 0xb2, 0x2a, 0x83, 0x3e, 0x48, 0x4e, 0x50, 0xfc, 0xda, + 0xb3, 0x9a, 0xe4, 0x10, 0x30, 0xba, 0x7e, 0x6a, 0x9b, 0xdf, 0xaf, 0xb6, + 0x11, 0x2f, 0x7b, 0xad, 0x75, 0x89, 0xd4, 0xcb, 0x72, 0x2a, 0xeb, 0x1a, + 0xd0, 0x54, 0xa7, 0xdb, 0xb3, 0x6d, 0xcd, 0x72, 0xa2, 0xd7, 0x4b, 0x1b, + 0x60, 0x18, 0xbf, 0xb6, 0x25, 0x85, 0x21, 0x84, 0x69, 0x75, 0x65, 0x37, + 0x02, 0xd3, 0xca, 0x88, 0x0c, 0x22, 0x2b, 0x68, 0xaf, 0xb4, 0xc9, 0x8d, + 0x98, 0x0f, 0xd2, 0xc3, 0xb0, 0xec, 0xc8, 0x20, 0x4d, 0x3c, 0x0c, 0x0a, + 0x92, 0x05, 0x0a, 0xa2, 0xd5, 0x2f, 0x6c, 0xd6, 0xa5, 0x94, 0x48, 0x29, + 0x71, 0x47, 0x5c, 0xea, 0x8d, 0x70, 0x56, 0xdc, 0x48, 0x1b, 0x0e, 0x71, + 0x4d, 0x1e, 0x0a, 0x8e, 0x25, 0x43, 0x38, 0xd6, 0xaa, 0x00, 0xc7, 0x58, + 0xfa, 0x61, 0xcb, 0x59, 0x6b, 0xfa, 0xd5, 0xf4, 0xdb, 0x7a, 0xf9, 0xf5, + 0xa5, 0x25, 0x16, 0x47, 0xcf, 0x0d, 0xf7, 0x64, 0x60, 0x5a, 0x06, 0xec, + 0xb4, 0xb4, 0xb8, 0xc8, 0xce, 0x9d, 0x3b, 0x59, 0x5c, 0x5a, 0x1a, 0x0a, + 0x82, 0x15, 0xd7, 0xe2, 0xe8, 0x28, 0xf7, 0x2c, 0x2d, 0xc1, 0xd2, 0x12, + 0x8d, 0xdf, 0xfd, 0x5d, 0x76, 0xee, 0xdc, 0xc9, 0xcc, 0xcc, 0x0c, 0x1b, + 0x46, 0x47, 0xd9, 0x30, 0x3a, 0xba, 0xaa, 0xdd, 0xc3, 0x1a, 0x65, 0x65, + 0x20, 0x56, 0xf7, 0xc6, 0xbc, 0x0a, 0x6d, 0xd8, 0x55, 0x1c, 0x98, 0x75, + 0x98, 0xa8, 0x13, 0xe1, 0x28, 0x71, 0x98, 0xd6, 0xa8, 0xc6, 0x75, 0x85, + 0xf1, 0x4b, 0xd6, 0xff, 0x3b, 0xf4, 0xf6, 0x25, 0x1d, 0x13, 0x77, 0x49, + 0x1c, 0xb5, 0xe2, 0x56, 0xc7, 0x60, 0x85, 0x5a, 0x5a, 0x5c, 0x64, 0xd1, + 0xe4, 0x9f, 0x99, 0xe1, 0xeb, 0xd6, 0xb6, 0xc5, 0xa5, 0xa5, 0xa1, 0xa0, + 0x5a, 0x46, 0x8f, 0xfd, 0xc5, 0x7f, 0xe3, 0x86, 0xff, 0xf3, 0xbd, 0xc1, + 0xfa, 0xbb, 0xff, 0xe5, 0xbb, 0x79, 0xfe, 0x2f, 0x9f, 0xe7, 0xdd, 0xff, + 0x72, 0x30, 0x58, 0x2b, 0x0e, 0xb9, 0xea, 0x77, 0xc5, 0xcd, 0x5f, 0xa0, + 0x51, 0x99, 0x82, 0x0f, 0x4d, 0x6d, 0xab, 0x61, 0xdd, 0x6f, 0x8a, 0x96, + 0xfd, 0xbb, 0x90, 0x14, 0x7c, 0xa8, 0xaf, 0xa1, 0x4c, 0xe1, 0xc0, 0xd6, + 0xac, 0xcb, 0x2e, 0xcf, 0x63, 0x57, 0x6c, 0xdb, 0xb8, 0x0f, 0x78, 0x1e, + 0x8f, 0xb8, 0x0a, 0xac, 0x05, 0x17, 0x6e, 0x7f, 0x2e, 0x94, 0x86, 0x74, + 0xf1, 0x86, 0x56, 0x9d, 0xd2, 0xb5, 0x63, 0xca, 0x7d, 0xda, 0xc9, 0xd1, + 0x58, 0xae, 0xc1, 0xb2, 0xee, 0x6b, 0x19, 0xa0, 0xd6, 0x72, 0x4d, 0x01, + 0xb5, 0xce, 0xb6, 0x7b, 0x81, 0x5a, 0x00, 0x71, 0xa0, 0x96, 0x0f, 0x94, + 0x34, 0x60, 0xb4, 0xae, 0x1d, 0x30, 0x4a, 0xe3, 0x74, 0xbb, 0xd3, 0x60, + 0xf9, 0x8a, 0x88, 0x0d, 0xca, 0x91, 0x28, 0xf7, 0x62, 0xe8, 0xa4, 0x21, + 0xb3, 0x05, 0xe0, 0x41, 0x00, 0x3e, 0xf3, 0xf9, 0xe4, 0xdf, 0x5a, 0xd9, + 0x6d, 0x20, 0xc4, 0xf7, 0x75, 0x9a, 0x77, 0x24, 0xa6, 0x11, 0x02, 0x2a, + 0xf9, 0x06, 0xd5, 0x24, 0xa0, 0xd6, 0x72, 0x5d, 0xfd, 0x5d, 0x20, 0xb9, + 0xdb, 0x6e, 0x0e, 0xc2, 0xde, 0x73, 0x8f, 0x0c, 0x48, 0xb9, 0x06, 0xfd, + 0xed, 0x2c, 0x7c, 0x7b, 0x9a, 0x4f, 0x26, 0xd5, 0xdf, 0x68, 0x65, 0xf8, + 0x7b, 0xb7, 0x81, 0x65, 0x09, 0x47, 0xfd, 0x32, 0xec, 0x70, 0xab, 0xa5, + 0xc3, 0x8e, 0xe8, 0x81, 0x63, 0x25, 0x01, 0xb3, 0x06, 0xc5, 0x01, 0x01, + 0xd4, 0xca, 0xeb, 0xd0, 0x03, 0xb8, 0xb2, 0xc3, 0x0a, 0xa2, 0xe5, 0xf5, + 0x4d, 0x6f, 0x34, 0xc8, 0x46, 0x3c, 0x6c, 0x2f, 0x41, 0xf5, 0x9b, 0xa2, + 0x88, 0xae, 0x3e, 0xf2, 0x45, 0x08, 0xfd, 0x4c, 0x40, 0x00, 0x0a, 0xd9, + 0x0d, 0x01, 0x5c, 0x71, 0x79, 0xed, 0xc0, 0x46, 0x1c, 0xa4, 0xd5, 0x93, + 0xce, 0x82, 0x73, 0x99, 0xe7, 0x87, 0x00, 0xae, 0xa5, 0xe1, 0xb7, 0x51, + 0x95, 0xf4, 0xa6, 0xe6, 0xab, 0x02, 0x78, 0x3a, 0x1f, 0xbd, 0x9a, 0xe0, + 0x29, 0xa3, 0x75, 0xbc, 0x89, 0xb3, 0xfc, 0x14, 0x20, 0x00, 0x69, 0x19, + 0x80, 0x56, 0x7c, 0xfd, 0x2c, 0x3f, 0x65, 0x9d, 0x86, 0x70, 0xad, 0x55, + 0xaf, 0xc5, 0xbe, 0xbc, 0x1a, 0xfa, 0x9c, 0xe7, 0x21, 0xbf, 0x2c, 0x78, + 0x88, 0x69, 0x04, 0xf0, 0x39, 0x26, 0xad, 0xad, 0x1e, 0xbb, 0x2c, 0x98, + 0xd6, 0xa1, 0x6f, 0x95, 0xd9, 0xfd, 0xc1, 0x66, 0x04, 0x68, 0x6e, 0x80, + 0x5a, 0xc6, 0xb1, 0xb9, 0xf5, 0x92, 0xa4, 0xe9, 0x79, 0xb8, 0x59, 0x97, + 0x4a, 0x21, 0x8f, 0xd7, 0xb6, 0xdd, 0xdc, 0x43, 0xf5, 0x80, 0xa2, 0x06, + 0x40, 0xb4, 0xba, 0x9d, 0x76, 0x0f, 0x30, 0xcb, 0xc8, 0xd5, 0x20, 0x3a, + 0xa9, 0x9f, 0xd9, 0xa4, 0x07, 0xe5, 0xcb, 0xd5, 0x19, 0x1b, 0x80, 0x86, + 0x75, 0x59, 0xc6, 0x66, 0x12, 0xa0, 0x2b, 0x29, 0x6e, 0x98, 0x34, 0xf1, + 0xb4, 0xab, 0xc9, 0x93, 0xc0, 0x9b, 0x41, 0xfc, 0x23, 0x88, 0x00, 0xa2, + 0x27, 0x70, 0x31, 0xc8, 0x6f, 0xf0, 0xda, 0x82, 0x7c, 0x94, 0x61, 0xd6, + 0x3b, 0x16, 0xe5, 0x44, 0x61, 0x5a, 0xb5, 0x5a, 0x9d, 0x35, 0xf8, 0xaa, + 0xa6, 0x7a, 0x1d, 0x35, 0x0e, 0x3d, 0xa3, 0x63, 0x3f, 0x06, 0xde, 0x86, + 0x82, 0x6f, 0xfc, 0xf5, 0x6b, 0x58, 0x97, 0xa4, 0x91, 0xd0, 0x02, 0x20, + 0x1d, 0x28, 0xf9, 0x0a, 0x52, 0xf5, 0x5a, 0xff, 0xae, 0x9a, 0x84, 0x20, + 0xad, 0xad, 0x44, 0xeb, 0x68, 0x87, 0x3d, 0x60, 0xb7, 0x80, 0x96, 0x86, + 0x49, 0x18, 0x34, 0x4e, 0x1d, 0x75, 0xd7, 0x9b, 0xd5, 0x97, 0xa9, 0x38, + 0xcc, 0x3d, 0x0e, 0xcd, 0x2a, 0xa1, 0xf6, 0xf7, 0x73, 0xf2, 0xd5, 0xdf, + 0xd7, 0xb5, 0xba, 0x0e, 0x0f, 0xeb, 0xfa, 0x6b, 0x83, 0xb2, 0x06, 0x49, + 0x81, 0xae, 0x7a, 0x41, 0x5a, 0x83, 0x54, 0x3d, 0x29, 0x83, 0xb4, 0x71, + 0x60, 0xd6, 0xaa, 0xf5, 0xfa, 0x6a, 0x8b, 0xca, 0x55, 0xbd, 0xf1, 0xa5, + 0x89, 0x29, 0x8a, 0x37, 0xd5, 0x99, 0xff, 0xd7, 0x0d, 0xc6, 0xfe, 0xa4, + 0x4c, 0xfb, 0x4f, 0xca, 0x6c, 0xbe, 0xbb, 0x4b, 0xed, 0xe3, 0xea, 0xda, + 0x5d, 0x7b, 0x74, 0x33, 0x63, 0xf9, 0xcd, 0xcc, 0xb7, 0x14, 0x94, 0xaa, + 0x76, 0x32, 0x5a, 0xd7, 0xc9, 0x2f, 0xb7, 0x98, 0xfd, 0x78, 0x9e, 0xca, + 0x26, 0x7d, 0x8d, 0xff, 0xe3, 0x62, 0xb0, 0xed, 0xd3, 0xff, 0xf6, 0xd3, + 0x00, 0xdc, 0xf5, 0x07, 0x9f, 0x8b, 0xe4, 0x89, 0x83, 0xb0, 0xda, 0x9d, + 0x28, 0x64, 0xcb, 0x56, 0x1c, 0xa8, 0x05, 0x51, 0x28, 0x57, 0x1c, 0xd0, + 0x65, 0x00, 0x59, 0x10, 0xc2, 0xb5, 0x80, 0x00, 0x96, 0x65, 0xc0, 0x59, + 0x71, 0xc8, 0x56, 0xdb, 0xd7, 0xc7, 0xac, 0xcf, 0x6f, 0x35, 0x49, 0x15, + 0x0a, 0x54, 0xf5, 0x15, 0x44, 0x26, 0x02, 0xce, 0x1b, 0x7a, 0x59, 0x54, + 0x75, 0x70, 0x06, 0xdf, 0xa3, 0x72, 0x23, 0xf9, 0x00, 0xbc, 0xd5, 0x8d, + 0xd8, 0x2b, 0xa2, 0xae, 0x56, 0xe0, 0x0a, 0x57, 0x43, 0xae, 0xb4, 0x7c, + 0x09, 0xd4, 0x82, 0x31, 0xdb, 0xdc, 0x48, 0x0e, 0x4f, 0x16, 0x22, 0x61, + 0xcf, 0x9f, 0xee, 0x53, 0x5e, 0x81, 0xf6, 0x4a, 0xd3, 0x9a, 0x40, 0xc1, + 0xdc, 0xcf, 0x04, 0x9e, 0x0c, 0x7b, 0x52, 0x36, 0x70, 0x4b, 0x38, 0x49, + 0x60, 0xed, 0x5e, 0xdc, 0x5e, 0x1c, 0x80, 0xe5, 0x8a, 0x3c, 0x5e, 0x47, + 0xc5, 0xbb, 0x4e, 0x01, 0xcf, 0x6f, 0x92, 0x1b, 0x29, 0x04, 0xe9, 0xda, + 0x2b, 0x6d, 0x1d, 0xdf, 0x1f, 0xac, 0xb5, 0x9a, 0x32, 0x6e, 0x01, 0x57, + 0x7a, 0x78, 0x2d, 0xeb, 0x39, 0xd4, 0x9a, 0x68, 0x40, 0x00, 0x5d, 0x0b, + 0xc6, 0xaf, 0x8e, 0xc7, 0x80, 0xe7, 0x32, 0xad, 0x22, 0x30, 0xd1, 0x50, + 0x50, 0xa6, 0x3d, 0x13, 0x0a, 0x0a, 0x65, 0x83, 0xb0, 0x00, 0x26, 0x8a, + 0x10, 0x8b, 0x62, 0xa2, 0x41, 0x00, 0xc2, 0x02, 0x05, 0x7a, 0x2a, 0x16, + 0x35, 0xf0, 0xc9, 0xda, 0x66, 0x20, 0x53, 0x13, 0x56, 0x5a, 0x88, 0x96, + 0xa1, 0xe0, 0x51, 0x70, 0xd7, 0x75, 0x0c, 0x96, 0x01, 0x6d, 0x1d, 0x8e, + 0xad, 0xc7, 0xb5, 0xda, 0x76, 0xad, 0xa5, 0xa5, 0x80, 0x7f, 0x8f, 0x19, + 0xd1, 0x8a, 0x03, 0xb5, 0xb0, 0xc7, 0xc9, 0xcc, 0xa0, 0x57, 0x82, 0xfd, + 0xa5, 0x3f, 0x54, 0xcb, 0xcf, 0x3e, 0x1e, 0xb6, 0xc3, 0x81, 0x86, 0x8a, + 0xdb, 0xb3, 0x0f, 0x38, 0x00, 0xfb, 0xcc, 0x39, 0x33, 0x01, 0x13, 0x18, + 0xc8, 0x58, 0x23, 0x52, 0xa7, 0xa3, 0x45, 0xd8, 0xd3, 0x80, 0x62, 0xb1, + 0x18, 0xd9, 0x6e, 0x87, 0x0f, 0xec, 0x83, 0x03, 0x07, 0x8a, 0xec, 0x3b, + 0xd0, 0x60, 0xcf, 0x1e, 0x38, 0x70, 0x60, 0xf0, 0x7e, 0x5e, 0x48, 0x9d, + 0x13, 0x30, 0x6a, 0x88, 0x77, 0x95, 0x46, 0xc1, 0x7b, 0x4d, 0x47, 0xa8, + 0xf7, 0x26, 0x8e, 0xe8, 0xc9, 0x2f, 0xd7, 0x17, 0x10, 0xcb, 0x7d, 0xee, + 0x72, 0x76, 0xfe, 0x20, 0x6e, 0x10, 0x9c, 0x7e, 0xf5, 0x1b, 0x8c, 0xeb, + 0x9a, 0x31, 0x04, 0x0d, 0x28, 0x34, 0xef, 0x41, 0x06, 0xf4, 0x95, 0x5f, + 0x6f, 0xc5, 0x01, 0x4e, 0xa0, 0xfa, 0x2e, 0x63, 0x44, 0xc1, 0x79, 0xb7, + 0xcf, 0x43, 0xc5, 0x87, 0xaa, 0xa3, 0x96, 0x2d, 0x42, 0xa0, 0xd6, 0x2e, + 0x20, 0x8e, 0x43, 0x17, 0x92, 0x60, 0x32, 0x1b, 0x20, 0x72, 0x6c, 0x84, + 0x13, 0xda, 0x32, 0xda, 0x3d, 0x22, 0xa8, 0xfb, 0x30, 0xe9, 0xc0, 0x43, + 0x09, 0xf5, 0x93, 0x52, 0x52, 0xd3, 0xcf, 0x28, 0x39, 0x8d, 0x26, 0x6d, + 0xa3, 0x81, 0x53, 0x10, 0xbc, 0x3b, 0x93, 0xbe, 0x50, 0x40, 0x53, 0x63, + 0xdb, 0x11, 0x60, 0xde, 0x51, 0xf8, 0xd1, 0xf6, 0xcf, 0xe8, 0xff, 0xcd, + 0xe4, 0x26, 0x66, 0x69, 0x95, 0x1e, 0x5d, 0xf3, 0x25, 0x73, 0xa8, 0xbb, + 0xd0, 0x09, 0x60, 0xf3, 0x88, 0x64, 0x76, 0x05, 0x5c, 0xf3, 0x1e, 0xd7, + 0x94, 0x21, 0xd4, 0xf0, 0x87, 0x7a, 0x47, 0xa4, 0xf2, 0xb6, 0x75, 0x99, + 0x4d, 0xf3, 0x0e, 0xd3, 0x11, 0x64, 0x1c, 0x09, 0x64, 0x22, 0x93, 0x41, + 0x05, 0x25, 0x6a, 0xf0, 0x1a, 0x00, 0x59, 0xf5, 0xee, 0xb8, 0x7f, 0x0f, + 0x61, 0x78, 0x5d, 0xfe, 0xca, 0xcb, 0xaf, 0xf9, 0x72, 0x54, 0xc3, 0xad, + 0x26, 0xb7, 0x5d, 0xa6, 0x2a, 0x71, 0xd9, 0x65, 0x01, 0x34, 0xea, 0x6c, + 0xf3, 0x0c, 0x97, 0xbe, 0x75, 0x1d, 0xa7, 0x4e, 0x9d, 0x82, 0x8b, 0x88, + 0xc0, 0xb0, 0x6c, 0x90, 0x95, 0x0d, 0xbc, 0x82, 0x10, 0x94, 0x75, 0xea, + 0xd4, 0x29, 0x36, 0x41, 0x04, 0xac, 0x75, 0xa1, 0x6c, 0x1a, 0x58, 0x96, + 0x91, 0x49, 0x7f, 0xea, 0x07, 0xa7, 0xe0, 0x95, 0x70, 0xdd, 0x40, 0xb9, + 0xce, 0xcc, 0xce, 0x06, 0x71, 0x26, 0xfd, 0x99, 0x9f, 0x9c, 0x65, 0xe3, + 0xc6, 0x8d, 0x9c, 0x6d, 0x9e, 0xe1, 0xb2, 0xcb, 0x2e, 0x0b, 0xec, 0x9b, + 0x74, 0x06, 0xbc, 0x65, 0xea, 0xce, 0x2b, 0xe1, 0xf6, 0xa0, 0x9e, 0x16, + 0xa0, 0xcb, 0xae, 0xc7, 0x20, 0x6d, 0xbd, 0xa2, 0xcc, 0x89, 0x93, 0x51, + 0x80, 0xa8, 0xf9, 0x5d, 0xda, 0x6a, 0x79, 0x1e, 0xc5, 0x7c, 0xb4, 0xaf, + 0x2e, 0xad, 0x77, 0xcb, 0x39, 0xdd, 0x8f, 0xcf, 0xbc, 0x24, 0xf0, 0x7c, + 0xd8, 0xfd, 0x41, 0xf5, 0x06, 0xe1, 0xe0, 0xa3, 0x87, 0x82, 0x34, 0x93, + 0x57, 0x8c, 0xe1, 0x15, 0x25, 0x6d, 0xaf, 0x49, 0x7d, 0xa5, 0xa5, 0x81, + 0x59, 0x39, 0x64, 0xa7, 0xcd, 0xf8, 0x55, 0x5b, 0x2d, 0x88, 0x56, 0x0e, + 0xfb, 0x9c, 0x0a, 0x27, 0xc7, 0x51, 0x69, 0x73, 0xc5, 0x02, 0xdd, 0x95, + 0x36, 0x85, 0x6c, 0x8e, 0xb6, 0xd7, 0x8c, 0x7c, 0xeb, 0x70, 0x64, 0xb9, + 0x4a, 0xc9, 0xa2, 0x70, 0x2e, 0xd4, 0x4e, 0x20, 0x37, 0x6d, 0xe6, 0xf6, + 0x07, 0xa6, 0xf9, 0xee, 0x7d, 0x63, 0x1c, 0x7a, 0x54, 0x5d, 0x35, 0xbc, + 0xf5, 0x82, 0xdd, 0x37, 0xed, 0x82, 0xe3, 0x47, 0x22, 0x79, 0x73, 0xd7, + 0xee, 0x06, 0x0d, 0x56, 0x37, 0xb6, 0x8e, 0x2c, 0x57, 0xd9, 0xca, 0x14, + 0x0b, 0xb5, 0x13, 0x94, 0xae, 0x9d, 0xe4, 0xce, 0x6f, 0x1c, 0x64, 0xff, + 0x07, 0x27, 0x99, 0x7e, 0xf4, 0x20, 0x00, 0xe5, 0xa2, 0xa4, 0x70, 0xfd, + 0x6d, 0x70, 0x72, 0x5a, 0xb7, 0x9f, 0xe0, 0xe6, 0x3f, 0x78, 0x84, 0xb9, + 0x63, 0x55, 0x58, 0x52, 0x7d, 0xe7, 0xf9, 0x95, 0x1a, 0xa5, 0x62, 0x3e, + 0xb0, 0x59, 0x6f, 0xe4, 0x98, 0xfc, 0xf8, 0x5e, 0xee, 0xfc, 0xf4, 0x9d, + 0xec, 0xff, 0xd0, 0x54, 0x60, 0x6b, 0xea, 0x93, 0xbb, 0x91, 0x7e, 0x86, + 0xe6, 0xb7, 0xc3, 0x2b, 0xa5, 0x28, 0xdf, 0x40, 0xcb, 0x6b, 0x93, 0x6f, + 0x2a, 0x5a, 0x61, 0xab, 0x15, 0x8e, 0xe3, 0x97, 0xae, 0x2c, 0x23, 0xb2, + 0x82, 0xd8, 0xd0, 0xcb, 0xab, 0xa6, 0x41, 0x40, 0x2d, 0x21, 0x54, 0x2d, + 0x6e, 0x78, 0xff, 0x5e, 0xea, 0xcd, 0x1a, 0xcd, 0x56, 0x93, 0x3f, 0x9d, + 0xf9, 0x33, 0x00, 0x7e, 0x7d, 0xe7, 0x07, 0xf8, 0xd3, 0x99, 0x3f, 0xa3, + 0x9b, 0x7d, 0x89, 0xb1, 0x5f, 0xbd, 0x81, 0xe2, 0x25, 0x3f, 0x02, 0xe0, + 0xe7, 0x7f, 0xee, 0x04, 0x3f, 0xff, 0x4b, 0xf0, 0xf7, 0xff, 0x73, 0x73, + 0x60, 0xa7, 0xfa, 0xfd, 0x7a, 0x60, 0xcf, 0xb6, 0x55, 0xc8, 0x8f, 0xd3, + 0x6c, 0x35, 0x69, 0xae, 0xa8, 0xed, 0x06, 0x6a, 0x65, 0xd7, 0xc9, 0x84, + 0xe3, 0xf5, 0x34, 0xb6, 0x00, 0xe6, 0xaa, 0xb3, 0x14, 0xf2, 0x85, 0x44, + 0x5b, 0x6b, 0xdd, 0xe7, 0x0b, 0xa1, 0x1f, 0xbf, 0x5c, 0xe7, 0x6d, 0x17, + 0x97, 0x02, 0x78, 0x56, 0x3f, 0xbd, 0x78, 0xf6, 0x69, 0xde, 0xfa, 0x96, + 0xcb, 0x18, 0xe1, 0x2d, 0xaf, 0x6a, 0x7d, 0x52, 0xa5, 0x4a, 0x95, 0x2a, + 0x55, 0xaa, 0x54, 0xa9, 0x52, 0xa5, 0x4a, 0x95, 0x2a, 0x55, 0xaa, 0x54, + 0xa9, 0x52, 0xa5, 0x4a, 0x95, 0x2a, 0x55, 0xaa, 0x54, 0xa9, 0x52, 0xa5, + 0x4a, 0x95, 0xea, 0x7f, 0x77, 0xbd, 0xc1, 0xdc, 0x1d, 0x53, 0xa5, 0x4a, + 0x95, 0x2a, 0x55, 0xaa, 0x7f, 0x46, 0x9a, 0xc9, 0xd1, 0xbd, 0xf1, 0x09, + 0x32, 0x94, 0x86, 0x82, 0x50, 0x0d, 0x52, 0x61, 0x7d, 0x01, 0x2f, 0xd1, + 0x19, 0x65, 0x38, 0x05, 0x90, 0x29, 0x6b, 0x79, 0x2e, 0xb3, 0x1f, 0x9f, + 0xcf, 0xac, 0xc9, 0xb6, 0x13, 0x6a, 0xbc, 0x3e, 0xe7, 0x6a, 0x6f, 0xd8, + 0xba, 0xac, 0x96, 0xb6, 0xbd, 0x46, 0x38, 0x50, 0x97, 0x39, 0x32, 0x33, + 0xd7, 0x04, 0xeb, 0xde, 0x31, 0x09, 0xff, 0x6f, 0x1d, 0xbe, 0x98, 0x0b, + 0x21, 0x57, 0x7a, 0x8a, 0x6c, 0xd9, 0x41, 0x3b, 0x9e, 0x8b, 0x00, 0xd8, + 0x24, 0x7d, 0x3d, 0x3b, 0xb2, 0xfd, 0x81, 0x7e, 0xac, 0x29, 0x72, 0x4e, + 0x4e, 0x39, 0x05, 0xf8, 0x22, 0xf8, 0x70, 0x54, 0x76, 0x42, 0x38, 0x95, + 0x72, 0x68, 0x57, 0x0e, 0xea, 0x42, 0xcf, 0x6e, 0x6d, 0xc3, 0xaa, 0xc6, + 0xaf, 0x1c, 0x57, 0x1e, 0xb1, 0xae, 0x80, 0x47, 0x0f, 0x05, 0x8e, 0x87, + 0x95, 0x51, 0x05, 0xa1, 0x6a, 0x4a, 0xc9, 0x0d, 0x57, 0x8e, 0x07, 0x2e, + 0x3e, 0x05, 0xe0, 0xb1, 0x4f, 0xdc, 0x49, 0x41, 0x08, 0xee, 0xbe, 0x49, + 0x7d, 0x14, 0xbb, 0x50, 0x5b, 0x60, 0x7c, 0xc3, 0xd6, 0x00, 0x9c, 0xb5, + 0xb5, 0xbc, 0x95, 0x6f, 0x7e, 0x78, 0x37, 0x00, 0xb7, 0xde, 0x7f, 0x30, + 0x88, 0x37, 0x50, 0x2e, 0xe1, 0x40, 0xb9, 0x58, 0xa0, 0xd6, 0x6a, 0x6b, + 0xc0, 0x88, 0x3d, 0x1b, 0x74, 0x08, 0x00, 0x8a, 0x3b, 0x0c, 0x84, 0x6d, + 0x60, 0xf6, 0x53, 0xd2, 0xf6, 0xdb, 0xe4, 0xc8, 0x05, 0x1f, 0xb8, 0x2b, + 0x50, 0x56, 0xef, 0xb1, 0xa8, 0x9d, 0x6c, 0x2a, 0x87, 0x4a, 0x0d, 0xd4, + 0x02, 0x5d, 0x87, 0x46, 0xf8, 0xa1, 0xa4, 0x44, 0x52, 0x29, 0x96, 0xa8, + 0x35, 0x9a, 0x61, 0xbc, 0xf9, 0x0d, 0x5a, 0x1f, 0xe5, 0x8a, 0xac, 0xa0, + 0xed, 0xb5, 0xa3, 0xe7, 0xeb, 0xef, 0xd4, 0xf1, 0xbe, 0x9a, 0x09, 0x0f, + 0x90, 0x75, 0x5e, 0xe3, 0x43, 0xcd, 0x97, 0xe1, 0x4c, 0xe8, 0xbd, 0xd5, + 0x8b, 0x48, 0x5a, 0xf3, 0xa6, 0x9b, 0x43, 0x03, 0x0a, 0x8a, 0x35, 0x96, + 0xed, 0x9f, 0x2f, 0x6a, 0x43, 0xef, 0xb7, 0xd5, 0x86, 0x71, 0xd8, 0x82, + 0x71, 0x81, 0xf5, 0xf4, 0xec, 0xd5, 0x6d, 0x94, 0x93, 0x41, 0x52, 0xfa, + 0x7e, 0xb2, 0x21, 0x0d, 0xfd, 0x74, 0x5e, 0xe0, 0xab, 0x3e, 0x30, 0xad, + 0x81, 0x75, 0x59, 0x05, 0x7c, 0xd7, 0x2b, 0x81, 0xa7, 0xcb, 0x19, 0x06, + 0xa6, 0x35, 0xe8, 0xbc, 0x86, 0x10, 0xa8, 0x15, 0x07, 0x18, 0xf6, 0x0b, + 0x1b, 0x80, 0x96, 0x1d, 0x8e, 0xc3, 0xb4, 0x72, 0x23, 0x39, 0xda, 0x2b, + 0xed, 0xc8, 0x36, 0x73, 0x9e, 0xd8, 0x61, 0xa0, 0x07, 0xa2, 0xe5, 0x69, + 0xc7, 0xb7, 0xd5, 0xc2, 0x22, 0x2b, 0x22, 0x30, 0x2d, 0x53, 0x47, 0xf3, + 0xb7, 0x56, 0x0d, 0x9b, 0x27, 0xc9, 0x61, 0xe8, 0x42, 0xa6, 0x5f, 0x6b, + 0x7d, 0x22, 0x8a, 0x9d, 0xd7, 0x2f, 0x1d, 0xeb, 0x50, 0xfe, 0x7f, 0xfe, + 0x0e, 0xf6, 0xe7, 0xf8, 0x3a, 0x21, 0xc4, 0xea, 0x8e, 0xb5, 0x5b, 0x0e, + 0x34, 0x33, 0x33, 0xc3, 0xa8, 0x05, 0xbb, 0x5a, 0x0b, 0xe4, 0x29, 0x49, + 0x77, 0x8c, 0x8e, 0xb2, 0x61, 0x69, 0x89, 0xc5, 0x3f, 0xfa, 0x23, 0xbe, + 0xfa, 0x47, 0x7f, 0xb4, 0xa6, 0xbc, 0x36, 0x04, 0x6b, 0x07, 0xa3, 0x11, + 0xc8, 0x16, 0xf4, 0xc2, 0xae, 0x46, 0x21, 0x82, 0xdd, 0x1a, 0x8d, 0x6d, + 0x5f, 0x8a, 0xe4, 0x5d, 0x0a, 0xd6, 0xed, 0xf8, 0xc3, 0xc1, 0x72, 0xa9, + 0x07, 0xa4, 0x65, 0xdb, 0x31, 0xf6, 0xcf, 0x0d, 0x5f, 0xa6, 0x00, 0x5a, + 0x1b, 0x00, 0x1b, 0x29, 0xb6, 0x34, 0x33, 0xc3, 0x0c, 0x30, 0x05, 0x70, + 0xdb, 0x22, 0x2f, 0xdd, 0xf7, 0xb3, 0xc0, 0xcf, 0x01, 0xe0, 0x75, 0x72, + 0xf0, 0xd4, 0x02, 0xe4, 0x4a, 0x01, 0x1c, 0xea, 0xe6, 0xa7, 0xe0, 0x89, + 0xb9, 0xe7, 0x23, 0x76, 0x6f, 0x78, 0x6a, 0xb8, 0xf2, 0x4d, 0xcf, 0x4c, + 0x90, 0xe4, 0x48, 0xab, 0xd4, 0xd2, 0xd7, 0xeb, 0xf3, 0x85, 0x51, 0x3d, + 0x81, 0x60, 0x6b, 0x12, 0xf4, 0x03, 0x38, 0xe1, 0x0b, 0x36, 0x6b, 0xc8, + 0xcd, 0x13, 0x08, 0x36, 0xaf, 0x7a, 0x47, 0xb2, 0xe4, 0x08, 0x76, 0x79, + 0x1e, 0xc6, 0xcd, 0x76, 0x57, 0x51, 0x2d, 0x0f, 0x35, 0x54, 0xd8, 0x6b, + 0x41, 0xc9, 0xf3, 0xa8, 0x39, 0xe1, 0xbe, 0xc0, 0x1b, 0x07, 0xae, 0x15, + 0xb4, 0xfb, 0x53, 0x75, 0xbc, 0xcc, 0x56, 0x10, 0x2a, 0xc6, 0xeb, 0xe4, + 0xe0, 0x98, 0x3a, 0xd6, 0xad, 0xcb, 0x61, 0xec, 0xca, 0x31, 0x5a, 0xcb, + 0x0d, 0x28, 0x56, 0x94, 0xc3, 0x5a, 0x0c, 0xa8, 0xd5, 0x7c, 0xa1, 0x4a, + 0xc1, 0x91, 0x50, 0xef, 0x22, 0xd6, 0x6b, 0x97, 0xf1, 0x04, 0xa0, 0x56, + 0xf3, 0xb9, 0x23, 0x14, 0x8a, 0xae, 0x06, 0x6a, 0xe9, 0x74, 0x16, 0x50, + 0x0b, 0xc0, 0x6b, 0xd5, 0xc1, 0xd1, 0x90, 0x20, 0xed, 0x28, 0x6e, 0x03, + 0xb5, 0xda, 0x97, 0x8f, 0x03, 0xbd, 0x8e, 0xdc, 0x63, 0xef, 0x81, 0x9c, + 0x03, 0x38, 0x30, 0x7d, 0x34, 0x79, 0x7f, 0xa7, 0x26, 0xc2, 0xf0, 0xec, + 0x33, 0xfd, 0xdb, 0x85, 0xe5, 0x3a, 0x1c, 0x99, 0x85, 0xe7, 0xce, 0x1d, + 0x80, 0x69, 0xe4, 0x6e, 0xbb, 0x19, 0xef, 0xb9, 0x47, 0x22, 0x20, 0x2d, + 0x13, 0xb7, 0x76, 0x5b, 0x37, 0xe0, 0x69, 0x87, 0x95, 0x7b, 0x7f, 0x30, + 0xcb, 0xed, 0xab, 0x65, 0x30, 0xfb, 0x61, 0xeb, 0xd8, 0x09, 0x75, 0xac, + 0xb3, 0xfa, 0x58, 0x9b, 0xfb, 0xf5, 0xdd, 0x85, 0x00, 0xa2, 0x25, 0xb5, + 0x93, 0x54, 0x24, 0x6c, 0x80, 0x58, 0x3e, 0x11, 0x38, 0x96, 0x0d, 0xcf, + 0x1a, 0x14, 0x97, 0x04, 0xb2, 0x5a, 0x2d, 0xec, 0x66, 0x25, 0xe3, 0xdb, + 0x77, 0xb3, 0xf9, 0xa5, 0x23, 0x4c, 0x3f, 0x59, 0x4b, 0x4c, 0x63, 0xb4, + 0x16, 0xdb, 0xf6, 0xd2, 0xd4, 0x8d, 0x4e, 0x0b, 0xbc, 0x36, 0xc2, 0x8d, + 0xc1, 0x09, 0x64, 0x37, 0xbc, 0x57, 0x4a, 0x0d, 0x90, 0xcd, 0xba, 0x1a, + 0x91, 0xa3, 0x9d, 0x90, 0xed, 0x7b, 0xb0, 0x94, 0x11, 0x28, 0x16, 0x68, + 0xd8, 0x56, 0x60, 0x4f, 0x43, 0xb1, 0xe2, 0x60, 0x2d, 0xed, 0x3c, 0xda, + 0xf5, 0x21, 0x13, 0x03, 0x6b, 0x01, 0x64, 0x6c, 0xd0, 0x65, 0x02, 0x58, + 0x4b, 0xca, 0x66, 0xe8, 0xe4, 0xea, 0x79, 0x90, 0xa5, 0xe7, 0x7e, 0xfd, + 0x57, 0x9d, 0x97, 0xf8, 0xc2, 0xdf, 0x95, 0xf9, 0x94, 0x36, 0xbd, 0x16, + 0x48, 0x94, 0x9d, 0x56, 0x0e, 0x91, 0x37, 0xbe, 0x7d, 0xb5, 0xf5, 0x61, + 0x14, 0x3e, 0x09, 0x84, 0x6a, 0xf2, 0x26, 0xd0, 0x40, 0xad, 0x61, 0x75, + 0x96, 0x9f, 0x72, 0x96, 0x37, 0x51, 0xe0, 0xa7, 0x6f, 0xa8, 0x7d, 0xe9, + 0x57, 0xde, 0x6a, 0x76, 0xd6, 0x01, 0xbf, 0xbe, 0x08, 0x5f, 0xfe, 0xd9, + 0x97, 0xcc, 0xed, 0x3a, 0x72, 0xbf, 0x16, 0x5f, 0x9e, 0x43, 0x32, 0x89, + 0x3b, 0x5a, 0xc6, 0x5b, 0xaa, 0xb1, 0xeb, 0x46, 0x97, 0x43, 0xdf, 0xf2, + 0x28, 0x6f, 0x9b, 0xb1, 0x31, 0xc6, 0x00, 0x00, 0x20, 0x00, 0x49, 0x44, + 0x41, 0x54, 0x6a, 0x53, 0xde, 0x12, 0xf6, 0xf1, 0x67, 0xbf, 0xd5, 0x66, + 0xf7, 0x07, 0xd5, 0xb5, 0xdd, 0x80, 0xb4, 0x8c, 0xcc, 0xf3, 0xa6, 0x70, + 0xa0, 0xe9, 0x79, 0x14, 0x5c, 0x97, 0xa6, 0xe7, 0x51, 0x5d, 0x84, 0x72, + 0x29, 0xdf, 0x33, 0x2e, 0x31, 0xcc, 0x38, 0x45, 0x3f, 0x88, 0x56, 0x5c, + 0xd5, 0xc5, 0x16, 0x95, 0x0d, 0x79, 0xea, 0xcd, 0x16, 0xe5, 0x4b, 0xf2, + 0x08, 0x17, 0x3c, 0x2f, 0x43, 0x61, 0xbd, 0x40, 0xca, 0x0c, 0xde, 0xd9, + 0x26, 0xe3, 0x95, 0x32, 0xb5, 0x5a, 0x9d, 0x72, 0x39, 0x8a, 0xa8, 0xb1, + 0xf7, 0x43, 0x4a, 0xaf, 0x67, 0xbf, 0xfa, 0xc9, 0x86, 0x8a, 0xd9, 0x4a, + 0x02, 0x6c, 0xd9, 0x71, 0x5e, 0x07, 0xda, 0xed, 0x16, 0xa5, 0x42, 0x9e, + 0x42, 0x51, 0x3d, 0xa7, 0x80, 0x6a, 0xb7, 0x56, 0xd7, 0x23, 0x93, 0x05, + 0xe9, 0x75, 0x13, 0x81, 0x5a, 0xf6, 0x32, 0x78, 0x36, 0xd2, 0xed, 0x5e, + 0xaf, 0x5b, 0xe7, 0xbf, 0xb9, 0x5f, 0xeb, 0x6b, 0x78, 0xfc, 0xbc, 0x4e, + 0xf5, 0xfa, 0x6b, 0x0e, 0x78, 0x3b, 0xb0, 0x11, 0x35, 0xb2, 0xf0, 0xe3, + 0xd8, 0xf6, 0x77, 0x01, 0x3f, 0x02, 0x4e, 0xaf, 0x62, 0x27, 0x7e, 0x5e, + 0xdb, 0xcf, 0x5c, 0xab, 0x29, 0x8e, 0xa3, 0xb1, 0xd7, 0x9b, 0x40, 0xc1, + 0x41, 0x43, 0x19, 0x92, 0xa1, 0x78, 0x6b, 0x95, 0xf9, 0x49, 0xf7, 0x83, + 0x78, 0x25, 0x81, 0xb3, 0x4c, 0x7c, 0x33, 0x16, 0x6f, 0x4b, 0x3a, 0x84, + 0x70, 0x07, 0x2b, 0x4d, 0x59, 0xc0, 0x2c, 0x20, 0x86, 0x79, 0x96, 0xd5, + 0x36, 0x4a, 0x40, 0x0d, 0x28, 0xf7, 0xa9, 0xd7, 0xf9, 0x68, 0x50, 0x7b, + 0x0f, 0xd2, 0x3c, 0x70, 0x2d, 0xf4, 0x3e, 0x73, 0x59, 0x63, 0x29, 0x95, + 0x06, 0x54, 0x8b, 0xbd, 0x79, 0xc5, 0x33, 0x12, 0xb6, 0x40, 0xfd, 0x81, + 0x16, 0x62, 0xc2, 0xc5, 0x9d, 0x91, 0x54, 0x80, 0xea, 0xa8, 0x8a, 0x63, + 0x22, 0x7a, 0xbd, 0xab, 0x3f, 0xd0, 0xa2, 0xfc, 0xd1, 0x3c, 0x95, 0x25, + 0x90, 0x5b, 0x56, 0xaf, 0x9b, 0x88, 0x2d, 0x01, 0x2a, 0x4b, 0xc0, 0x16, + 0xa8, 0x7e, 0xb5, 0x45, 0x65, 0xbd, 0xcb, 0x20, 0x54, 0x51, 0xed, 0x85, + 0x36, 0x93, 0x7f, 0x52, 0x0e, 0xd6, 0x1f, 0x5b, 0xbf, 0x39, 0x24, 0xa3, + 0x55, 0x16, 0xa8, 0x1e, 0x93, 0x88, 0xf5, 0xca, 0xfa, 0xfc, 0x8c, 0xc7, + 0xd8, 0xce, 0xb0, 0xbe, 0x73, 0x1f, 0xcf, 0x23, 0xb0, 0x60, 0x5b, 0xd5, + 0xad, 0xc1, 0xb6, 0x5f, 0x6b, 0xfd, 0x5a, 0xa4, 0x9c, 0xb1, 0xfc, 0x24, + 0x49, 0xb2, 0x21, 0x5b, 0x71, 0x48, 0xd6, 0x30, 0xb2, 0x41, 0x5a, 0xc3, + 0xa4, 0x19, 0xbf, 0x72, 0x92, 0xd9, 0x23, 0x0a, 0x8c, 0x30, 0xb5, 0x73, + 0x8a, 0xe9, 0x99, 0x69, 0x72, 0x8e, 0xda, 0x1e, 0xc0, 0xb5, 0xa0, 0xa7, + 0x6f, 0xb6, 0xd0, 0xf1, 0xd8, 0xff, 0x12, 0x90, 0x83, 0x22, 0x45, 0x84, + 0x3f, 0x06, 0x54, 0x11, 0x40, 0xab, 0x63, 0x9e, 0x7f, 0x8a, 0x84, 0xc4, + 0xa4, 0xc6, 0x9a, 0xf7, 0x25, 0x22, 0xa7, 0x0d, 0x7e, 0x11, 0x18, 0x07, + 0xc7, 0x3a, 0x23, 0x9c, 0x36, 0x19, 0xb7, 0x40, 0x63, 0x79, 0x96, 0x00, + 0x0b, 0xe8, 0x57, 0xc1, 0xc9, 0xc7, 0x0c, 0xf4, 0xbb, 0xbf, 0x97, 0x51, + 0x67, 0x98, 0x92, 0x3d, 0x66, 0x1b, 0xe4, 0xd4, 0xf7, 0x60, 0x29, 0x2d, + 0x88, 0x0f, 0x22, 0x0a, 0xf4, 0x4a, 0xac, 0xf3, 0xe0, 0x3e, 0x85, 0xe7, + 0xc7, 0x51, 0x7a, 0xfd, 0xb5, 0xdd, 0xd9, 0xce, 0x11, 0x5f, 0x01, 0x22, + 0x72, 0x23, 0x39, 0x1a, 0x8d, 0xe9, 0x20, 0x3e, 0xe7, 0x4f, 0x71, 0x88, + 0x4f, 0xea, 0x32, 0x2b, 0xc3, 0xd9, 0x0c, 0x60, 0x33, 0x6d, 0xe2, 0x6d, + 0x33, 0xb9, 0x08, 0x9f, 0xcd, 0xe8, 0x3e, 0x39, 0xb1, 0x6b, 0x78, 0x51, + 0x01, 0xb3, 0xf6, 0x4d, 0xc0, 0xbe, 0x03, 0x6a, 0xbb, 0xc5, 0xb8, 0x00, + 0xe0, 0x68, 0x43, 0xc3, 0xb2, 0x62, 0xf1, 0x71, 0x05, 0x7c, 0xa8, 0x62, + 0x98, 0x27, 0x6e, 0x6b, 0xa0, 0xec, 0xc1, 0xab, 0x41, 0x40, 0xac, 0x1d, + 0x3a, 0xed, 0xb0, 0xe9, 0x2d, 0xad, 0xac, 0x80, 0xe7, 0x29, 0x40, 0x56, + 0x94, 0xbd, 0xbf, 0xc4, 0x8e, 0xa5, 0x51, 0x0e, 0x8f, 0x6a, 0xa8, 0xfc, + 0x52, 0x14, 0x3c, 0xdf, 0xb7, 0xbe, 0x31, 0xd0, 0xd7, 0x5d, 0x02, 0x3e, + 0xdb, 0x50, 0xe1, 0x3d, 0x13, 0xaa, 0x1d, 0x8e, 0x1e, 0xb0, 0xda, 0x06, + 0xd8, 0xb7, 0x47, 0x2d, 0x8b, 0x14, 0xa1, 0xd8, 0x88, 0xb4, 0xd3, 0x3e, + 0x8a, 0x34, 0x8a, 0x0d, 0xd4, 0x3f, 0x82, 0x0d, 0x45, 0x1d, 0xd4, 0xb1, + 0xec, 0xd3, 0xc4, 0xae, 0x7d, 0x7b, 0xa0, 0x38, 0x01, 0x8d, 0xa3, 0xf0, + 0xae, 0x22, 0x03, 0xc7, 0xcd, 0xde, 0x48, 0xb2, 0xc7, 0x7f, 0x93, 0x60, + 0x54, 0xd2, 0xd7, 0x13, 0xa5, 0x24, 0x00, 0xb9, 0x8a, 0xf9, 0x3c, 0x0d, + 0xc0, 0x5d, 0x6e, 0x26, 0x8f, 0x23, 0xdb, 0xe7, 0xa9, 0x33, 0xe8, 0x39, + 0xa6, 0x77, 0x4b, 0xbc, 0xdf, 0xad, 0xc6, 0xdb, 0xcd, 0xb8, 0xc2, 0xe0, + 0xf3, 0x5f, 0x08, 0x31, 0xb0, 0x2b, 0x63, 0x4f, 0xd8, 0x71, 0x41, 0x14, + 0x1b, 0x37, 0x8b, 0xbc, 0xe7, 0x42, 0x81, 0xf5, 0xe7, 0xac, 0xb1, 0x3e, + 0x53, 0xad, 0x3c, 0xea, 0x8a, 0xf2, 0xa0, 0x23, 0xb8, 0xd5, 0x97, 0x01, + 0x04, 0xab, 0xea, 0xc0, 0xbd, 0xef, 0x83, 0xcf, 0x1d, 0x51, 0x93, 0x00, + 0x18, 0x4c, 0x8c, 0xf0, 0xa3, 0x20, 0x2d, 0x33, 0x11, 0x8d, 0x74, 0xa2, + 0xbb, 0x5a, 0xd1, 0x80, 0x54, 0x7c, 0xf5, 0xde, 0xac, 0xb0, 0xd2, 0x86, + 0x7c, 0x6f, 0x3f, 0x31, 0xde, 0x0e, 0x5d, 0x7d, 0x1c, 0x9a, 0x8e, 0x82, + 0x69, 0xe1, 0x08, 0xa4, 0x23, 0x54, 0xd8, 0x4c, 0xe4, 0xe4, 0x48, 0xe6, + 0x63, 0xc7, 0x2b, 0x7c, 0xc7, 0x1a, 0x9d, 0xe8, 0x67, 0xac, 0x92, 0x63, + 0xbe, 0xaa, 0xdf, 0xc7, 0x38, 0x92, 0xae, 0x1e, 0xdb, 0x18, 0x77, 0xa0, + 0x8a, 0xa4, 0xdb, 0xe7, 0xf8, 0x98, 0xbb, 0xdc, 0x5c, 0x0b, 0xd0, 0xb0, + 0xc5, 0xa0, 0x2c, 0xdd, 0x7f, 0x13, 0x7a, 0x8c, 0x2f, 0xe3, 0xab, 0xfe, + 0x6b, 0xdd, 0x82, 0x6d, 0x99, 0x6b, 0x70, 0xd7, 0x17, 0xe4, 0x4c, 0x5c, + 0xd6, 0x6a, 0x3b, 0x33, 0xb1, 0x8b, 0xd5, 0x0e, 0x00, 0x39, 0x47, 0xd0, + 0xd5, 0x69, 0x32, 0x7a, 0x3f, 0xba, 0x0e, 0xe4, 0x50, 0xef, 0x01, 0x55, + 0x1b, 0x45, 0xdf, 0x73, 0xf1, 0x67, 0x39, 0xbc, 0xff, 0xeb, 0x09, 0xb2, + 0x6c, 0xe0, 0xc5, 0x8b, 0x2e, 0xe6, 0xf2, 0x57, 0x5e, 0x7e, 0x4d, 0x97, + 0x97, 0xbe, 0xe5, 0x19, 0x40, 0x41, 0xa5, 0x4e, 0x36, 0xcf, 0xb0, 0xae, + 0x70, 0xa9, 0x82, 0x5d, 0x41, 0x00, 0x9b, 0x32, 0xe0, 0xa9, 0x53, 0x3f, + 0xe8, 0x85, 0x4d, 0x19, 0x18, 0x96, 0x0d, 0x9a, 0x32, 0xf9, 0xd6, 0x15, + 0x2e, 0x65, 0xe3, 0xc6, 0x8d, 0x9c, 0x3e, 0x7d, 0xfa, 0x55, 0xb1, 0x69, + 0xf2, 0x98, 0xf4, 0xa0, 0x81, 0x5d, 0xeb, 0x54, 0x1e, 0x03, 0xf2, 0x3a, + 0xdb, 0x3c, 0x13, 0xb1, 0x19, 0xb7, 0x6f, 0xc0, 0x5c, 0x27, 0x9f, 0x7b, + 0x36, 0x00, 0x77, 0x81, 0x82, 0x71, 0x6d, 0x2c, 0x84, 0x50, 0xaf, 0x33, + 0x3f, 0x39, 0xcb, 0xe4, 0xe4, 0x64, 0x04, 0xe6, 0x65, 0x6c, 0x19, 0xb0, + 0xd6, 0xc6, 0x8d, 0x1b, 0xf5, 0xbe, 0xfe, 0x02, 0x1e, 0x73, 0xb8, 0x7f, + 0x66, 0xbd, 0xd3, 0xb4, 0xae, 0xe1, 0x27, 0x4e, 0xd6, 0x68, 0xb4, 0x3c, + 0x72, 0x23, 0xe1, 0x75, 0xca, 0x5c, 0x02, 0x0b, 0x23, 0x2e, 0xed, 0xbc, + 0x8b, 0x94, 0x04, 0x40, 0x2d, 0x37, 0x2b, 0x68, 0xae, 0x10, 0xd1, 0xae, + 0xeb, 0x77, 0x33, 0x7b, 0x52, 0x01, 0x9f, 0x9a, 0x2f, 0xaa, 0xbe, 0x85, + 0xec, 0x48, 0x72, 0xc5, 0x02, 0xbb, 0xae, 0x9d, 0x52, 0xbf, 0xd1, 0xac, + 0x20, 0x33, 0x92, 0xa3, 0x76, 0x78, 0x16, 0x21, 0x04, 0x25, 0x37, 0x4f, + 0xae, 0x58, 0xa0, 0xad, 0xdf, 0xc5, 0x77, 0x57, 0xc2, 0xb1, 0x13, 0xf3, + 0x5e, 0xd8, 0x7e, 0xef, 0x99, 0x2b, 0x9a, 0x49, 0xb4, 0x08, 0xe0, 0x5b, + 0xed, 0x4e, 0x13, 0xb1, 0xbe, 0x80, 0xb7, 0x54, 0x27, 0x33, 0x92, 0xa3, + 0x71, 0x34, 0x04, 0x78, 0x19, 0xd5, 0x0b, 0x9b, 0x11, 0xc0, 0xbd, 0x1f, + 0x9e, 0xa2, 0xf1, 0xc2, 0x3c, 0xbb, 0x6e, 0xda, 0x4b, 0x69, 0x27, 0x81, + 0xfd, 0xf2, 0x15, 0x63, 0x54, 0x3d, 0xb8, 0xfb, 0x9e, 0x29, 0x1d, 0xd9, + 0x86, 0xc6, 0x3c, 0x0b, 0xb5, 0x13, 0x08, 0x21, 0x10, 0x64, 0xb8, 0xfb, + 0x9e, 0x7b, 0xa9, 0xbd, 0x30, 0x87, 0xbb, 0x65, 0x0a, 0xaf, 0xe3, 0xb1, + 0xff, 0x43, 0x2a, 0xed, 0xd4, 0x4d, 0xbb, 0x69, 0x34, 0x0e, 0xd1, 0x68, + 0xc0, 0xe6, 0xbc, 0xa0, 0x28, 0xc6, 0xa8, 0xf9, 0x39, 0xee, 0xbe, 0x67, + 0x3b, 0xb3, 0xcf, 0x56, 0x83, 0x21, 0xcd, 0x13, 0xc7, 0x54, 0xff, 0x51, + 0x90, 0x09, 0x6c, 0x16, 0xb6, 0xab, 0xfe, 0xa9, 0x6d, 0xab, 0x74, 0xa3, + 0x08, 0xeb, 0x00, 0x88, 0x4d, 0x53, 0xec, 0xba, 0x31, 0xbc, 0x66, 0x34, + 0x1a, 0x02, 0xa8, 0xc1, 0x96, 0x0a, 0x08, 0xc1, 0xdc, 0xb3, 0x35, 0xc6, + 0xaf, 0x2c, 0x33, 0xfd, 0x0d, 0xb5, 0xdf, 0xdb, 0x45, 0xde, 0x1a, 0x4b, + 0xe9, 0x04, 0xe7, 0xf4, 0x76, 0xb6, 0xf7, 0xb4, 0xcb, 0x85, 0x94, 0x10, + 0x05, 0x0a, 0x23, 0x25, 0xc6, 0x2b, 0xea, 0x99, 0x65, 0x2e, 0x06, 0xe1, + 0x05, 0x02, 0xb8, 0x16, 0xc0, 0xec, 0x13, 0x7f, 0xc4, 0x2d, 0x7b, 0x6e, + 0x8e, 0x6c, 0xef, 0x76, 0xfe, 0x1c, 0xb8, 0x2c, 0x58, 0x2f, 0xad, 0x1f, + 0x67, 0xbc, 0x32, 0x19, 0xb1, 0xb5, 0x70, 0x7c, 0x2e, 0x92, 0xa7, 0xb4, + 0x7e, 0x9c, 0xfa, 0x72, 0x34, 0x2e, 0x5e, 0xaf, 0xad, 0xef, 0x54, 0x20, + 0xae, 0xf3, 0xb5, 0x75, 0xa1, 0x74, 0xc9, 0xba, 0x32, 0x6f, 0xbb, 0xb8, + 0xc4, 0x2f, 0x6e, 0xb8, 0x9c, 0x1f, 0x2e, 0xaa, 0xd9, 0x56, 0x4c, 0xd8, + 0x8e, 0xb7, 0xb7, 0x03, 0xbc, 0xed, 0x62, 0xbb, 0xbf, 0x75, 0xa6, 0xe7, + 0x9c, 0x4e, 0x95, 0x2a, 0x55, 0xaa, 0x54, 0xa9, 0x52, 0xa5, 0x4a, 0x95, + 0x2a, 0x55, 0xaa, 0x54, 0xa9, 0x52, 0xa5, 0x4a, 0x95, 0x2a, 0x55, 0xaa, + 0x54, 0xa9, 0x52, 0xa5, 0x4a, 0x95, 0x2a, 0x55, 0xaa, 0x54, 0xc3, 0xeb, + 0x0d, 0xe2, 0xe6, 0x98, 0x2a, 0x55, 0xaa, 0x54, 0xa9, 0x52, 0xfd, 0x33, + 0xd4, 0xce, 0x36, 0x19, 0x3d, 0x6b, 0xfa, 0xf9, 0x48, 0x08, 0x41, 0x53, + 0x3b, 0xfe, 0xbb, 0xae, 0x1b, 0x2c, 0x1b, 0xcb, 0x8d, 0xf3, 0xb6, 0x7b, + 0x2e, 0x69, 0x87, 0x85, 0x59, 0x05, 0x1f, 0xb2, 0x5f, 0x20, 0x25, 0x81, + 0xb8, 0x56, 0xab, 0x4b, 0x52, 0xda, 0x24, 0xc0, 0x59, 0x2e, 0x9b, 0xa3, + 0x45, 0x8b, 0xf2, 0x26, 0xf5, 0xb1, 0xa3, 0xc8, 0x0a, 0x5a, 0xad, 0x5e, + 0x08, 0x8f, 0x10, 0x6a, 0xf6, 0xe3, 0x0c, 0xe3, 0xb0, 0x13, 0xf8, 0xb6, + 0x8a, 0x77, 0xb7, 0x08, 0xf8, 0x9a, 0x86, 0x27, 0x20, 0x83, 0x19, 0xeb, + 0xe9, 0xe8, 0x8c, 0xbe, 0x72, 0x3c, 0x17, 0xbe, 0xfa, 0x50, 0x5e, 0x20, + 0xfa, 0x7c, 0x2c, 0x1f, 0xba, 0x27, 0xdb, 0x00, 0x1d, 0x13, 0x2f, 0xb2, + 0x22, 0x80, 0x53, 0xb5, 0xfd, 0x36, 0x19, 0x32, 0xe4, 0x84, 0x99, 0xc5, + 0x58, 0x9b, 0xf4, 0x45, 0x08, 0xbe, 0x32, 0x33, 0xc5, 0x7a, 0x92, 0x26, + 0x20, 0x5c, 0x41, 0x75, 0xa9, 0xc9, 0x37, 0x3f, 0xac, 0x60, 0x58, 0xe3, + 0x5b, 0xb6, 0x82, 0x84, 0xf2, 0xa6, 0x02, 0x77, 0x6c, 0xdf, 0xce, 0xf8, + 0x86, 0xad, 0x94, 0x37, 0x15, 0xb8, 0xf5, 0xfe, 0x83, 0x14, 0x5c, 0xc1, + 0x63, 0x9f, 0xb8, 0x33, 0xf8, 0x88, 0xfb, 0xc4, 0x97, 0xf6, 0xf7, 0xcc, + 0xd0, 0x7d, 0xeb, 0xa3, 0x87, 0x90, 0x0f, 0x1c, 0x64, 0xa1, 0xb6, 0xc0, + 0x63, 0x9f, 0xb8, 0x93, 0xbd, 0xd7, 0x5e, 0xa3, 0xa0, 0x55, 0x7d, 0x7e, + 0x5b, 0x66, 0x9f, 0xda, 0x7e, 0x9b, 0x9c, 0x63, 0x40, 0x45, 0x41, 0xe3, + 0x46, 0x8f, 0x89, 0xde, 0x6e, 0xc3, 0xc2, 0x0a, 0xae, 0x88, 0xb8, 0x04, + 0x95, 0xb2, 0x82, 0xa6, 0x27, 0x11, 0x3e, 0x34, 0xa5, 0x0c, 0x3e, 0x8c, + 0xaf, 0x2e, 0x35, 0x69, 0xfb, 0x6d, 0x0a, 0xe4, 0x28, 0xb9, 0x82, 0x7a, + 0x47, 0xc5, 0x45, 0xca, 0x8b, 0x39, 0xf3, 0x1b, 0xa7, 0x41, 0x53, 0x6e, + 0xa0, 0xaf, 0x95, 0xd4, 0xf1, 0x35, 0x93, 0xda, 0xc6, 0xce, 0xeb, 0x1c, + 0x02, 0x83, 0x19, 0xe8, 0xf7, 0x6b, 0x6f, 0x07, 0xed, 0x66, 0xa5, 0xf0, + 0x25, 0x49, 0x39, 0x3c, 0xfd, 0x21, 0xbc, 0x27, 0x09, 0x60, 0x6c, 0x71, + 0x25, 0xc1, 0x14, 0x6c, 0xb5, 0xa4, 0x4a, 0xe3, 0xd2, 0xa2, 0xa5, 0x01, + 0x6e, 0x79, 0x01, 0xf5, 0x4e, 0x4f, 0xd2, 0x81, 0x5a, 0x0d, 0x78, 0x95, + 0xcf, 0xab, 0xf3, 0xa5, 0xd5, 0xaa, 0x0d, 0x4c, 0x97, 0xa4, 0xc2, 0x88, + 0xfa, 0x50, 0x5a, 0x58, 0x4e, 0xdc, 0x83, 0xec, 0x78, 0x9d, 0x56, 0xe0, + 0xc8, 0xd5, 0x4f, 0x49, 0x00, 0x8c, 0x82, 0xf6, 0xf8, 0xee, 0x76, 0x42, + 0x87, 0xc4, 0xc6, 0x4a, 0x72, 0x39, 0xc1, 0x79, 0xfd, 0x1d, 0xb5, 0x6e, + 0x9f, 0xd7, 0xe6, 0xba, 0xe1, 0x66, 0x8d, 0x13, 0x9d, 0x72, 0xe6, 0xc8, + 0x88, 0x0c, 0x6d, 0xaf, 0x4d, 0x4e, 0x83, 0x23, 0xba, 0xb2, 0x1b, 0x09, + 0x67, 0x44, 0x26, 0x12, 0x16, 0x59, 0x41, 0x7b, 0xa5, 0x4d, 0x6e, 0x44, + 0xff, 0xbe, 0x3b, 0x32, 0x08, 0xaf, 0x26, 0xd9, 0x91, 0xb8, 0x23, 0xaa, + 0x7c, 0x6f, 0xc5, 0x5b, 0x35, 0x2c, 0xa5, 0x8c, 0x84, 0x6d, 0x27, 0x77, + 0x13, 0xae, 0x6c, 0xab, 0x24, 0xc6, 0xf7, 0x53, 0x73, 0x29, 0x79, 0x46, + 0xdd, 0x46, 0xab, 0x45, 0x31, 0x1f, 0x77, 0x56, 0x3c, 0xb7, 0x78, 0xbb, + 0x0e, 0x79, 0xb7, 0x17, 0x1c, 0xe0, 0xf9, 0x52, 0x39, 0xbf, 0x58, 0x20, + 0x33, 0x91, 0x15, 0xb8, 0xd6, 0xb5, 0xdd, 0xd8, 0x89, 0xc7, 0x2b, 0xc9, + 0x9e, 0xf3, 0xfa, 0x92, 0x2d, 0x59, 0xb8, 0x2f, 0x0a, 0xbd, 0xba, 0x23, + 0xea, 0x29, 0xb7, 0x26, 0xcd, 0xcc, 0xcc, 0x04, 0xe1, 0x9d, 0x3b, 0x77, + 0xf6, 0xc4, 0x9d, 0xab, 0x7e, 0x1b, 0xb8, 0x03, 0x05, 0xe8, 0xda, 0x30, + 0x3a, 0x3a, 0xb4, 0x4d, 0xe3, 0x33, 0xa8, 0xc0, 0x57, 0x51, 0xe7, 0xbe, + 0xb8, 0xab, 0x5f, 0x1c, 0xb0, 0x95, 0x94, 0xa6, 0x5f, 0x9c, 0xad, 0x78, + 0xeb, 0x19, 0xe8, 0x96, 0xf1, 0x1d, 0x5c, 0xea, 0x93, 0x6e, 0x35, 0x2d, + 0x2d, 0x2e, 0xb2, 0xb8, 0xb4, 0xc4, 0xd2, 0xcc, 0x8c, 0x82, 0x69, 0xc5, + 0xda, 0xe0, 0xeb, 0x26, 0xdd, 0xcc, 0x0c, 0x14, 0x5d, 0xb8, 0x6f, 0x83, + 0x3a, 0xbe, 0xb3, 0xaf, 0x00, 0xe0, 0x66, 0xdb, 0xf0, 0xbe, 0xa8, 0x63, + 0xa0, 0xfc, 0xf4, 0x7b, 0xb9, 0xe1, 0x0b, 0xcf, 0xd3, 0xb8, 0xe3, 0xdd, + 0x00, 0x3c, 0xff, 0x97, 0xcf, 0x23, 0x3f, 0xf5, 0xee, 0x81, 0xf5, 0x28, + 0x5b, 0xe1, 0x41, 0x78, 0x8b, 0x7c, 0x0c, 0x44, 0xf5, 0x6a, 0xc9, 0x00, + 0xb5, 0x06, 0x39, 0x86, 0xf7, 0xd3, 0x94, 0x3e, 0x97, 0x0c, 0x4c, 0xcb, + 0xc8, 0xac, 0xcf, 0x4a, 0xd4, 0x5d, 0xcf, 0x87, 0x87, 0xcf, 0xb1, 0x7e, + 0x46, 0xaf, 0x6a, 0x7b, 0xbc, 0xaf, 0x84, 0x9b, 0x25, 0x00, 0x17, 0xb8, + 0xd9, 0x36, 0x6c, 0x51, 0x33, 0xa1, 0xd7, 0x7c, 0xe8, 0x7e, 0x7b, 0x9a, + 0xd2, 0x8d, 0x37, 0x2b, 0xa0, 0xd6, 0x8c, 0xe5, 0x00, 0x32, 0x5a, 0xe6, + 0xc4, 0xb7, 0x0e, 0xd1, 0x10, 0x02, 0xf9, 0x4c, 0x8d, 0xf2, 0x75, 0xaa, + 0x0f, 0xc5, 0xe3, 0x96, 0xb3, 0xce, 0x75, 0x0a, 0x36, 0x5a, 0x7b, 0xfc, + 0x20, 0x35, 0x5c, 0xca, 0xcb, 0x4d, 0x2a, 0x37, 0xa9, 0x19, 0xd0, 0x79, + 0xf4, 0xa1, 0x30, 0x5d, 0x69, 0x1c, 0x1e, 0x7d, 0x08, 0xef, 0x9d, 0x82, + 0xea, 0xf1, 0x39, 0xda, 0xbf, 0x5f, 0x02, 0x04, 0xf2, 0x1b, 0xf7, 0x05, + 0xfd, 0x97, 0xd9, 0xdf, 0x2f, 0x31, 0xd5, 0x02, 0xd1, 0x08, 0xef, 0x45, + 0x77, 0xff, 0xbe, 0xce, 0xfe, 0xfe, 0xf0, 0xd7, 0xb4, 0x7d, 0xbb, 0xc7, + 0x27, 0xff, 0x5d, 0x68, 0xfa, 0x8b, 0xff, 0x5e, 0x2d, 0x37, 0x5b, 0x0e, + 0xfb, 0xdb, 0x67, 0x94, 0x53, 0xd4, 0x67, 0x3e, 0x1f, 0x6b, 0x8b, 0xe5, + 0x3a, 0x7c, 0xf1, 0xc2, 0xcd, 0xb4, 0x9e, 0x04, 0xcf, 0x32, 0x71, 0x6b, + 0x85, 0x6b, 0x79, 0xcf, 0x3d, 0x06, 0x0f, 0xdd, 0x05, 0xc0, 0xed, 0x0f, + 0xdc, 0x07, 0xeb, 0x07, 0x38, 0xea, 0xf6, 0xdb, 0x8f, 0x2d, 0x9b, 0x71, + 0xb3, 0x21, 0x5c, 0x20, 0x7a, 0xbf, 0x76, 0x23, 0xcb, 0x20, 0xec, 0x98, + 0xe7, 0x88, 0xf0, 0xde, 0x93, 0x14, 0xb6, 0xe3, 0x0c, 0xc8, 0x4a, 0x64, + 0x7b, 0xe3, 0x86, 0x0d, 0x7b, 0x1d, 0x81, 0xf7, 0xd2, 0x11, 0xe6, 0x9e, + 0x69, 0xf7, 0x4d, 0x73, 0x2e, 0xb6, 0xe3, 0x4b, 0x5b, 0xd2, 0x06, 0x6b, + 0xd9, 0x40, 0xad, 0x04, 0xd9, 0x40, 0xad, 0x88, 0x2c, 0x28, 0x96, 0x48, + 0xb2, 0x61, 0xd6, 0x4d, 0xdf, 0xcc, 0x17, 0x41, 0x5c, 0xc6, 0xe9, 0xb5, + 0x81, 0xd7, 0xa6, 0x1b, 0x3f, 0xf7, 0xed, 0xbe, 0xb8, 0x94, 0x08, 0x72, + 0xca, 0x9e, 0x67, 0x5d, 0xc9, 0x62, 0xf7, 0xeb, 0x5f, 0xc9, 0x5e, 0xc2, + 0x9f, 0x26, 0x30, 0x2a, 0xe3, 0x58, 0x95, 0x41, 0xbd, 0x99, 0xf8, 0xde, + 0xae, 0xf6, 0x54, 0x9b, 0x94, 0x3e, 0xc9, 0x7e, 0x3c, 0xbe, 0x1f, 0xb8, + 0x2a, 0x9e, 0x67, 0x1d, 0x6f, 0xe2, 0xac, 0x86, 0x6a, 0x9d, 0xe5, 0xa7, + 0xac, 0xe3, 0x4d, 0x9c, 0xf9, 0x9b, 0x7f, 0x88, 0xa4, 0x33, 0xeb, 0x67, + 0x2d, 0xf8, 0xd6, 0x3a, 0xde, 0x84, 0x8c, 0xc1, 0xb8, 0x5e, 0xef, 0x7d, + 0x49, 0xe8, 0x71, 0x0d, 0x7d, 0x5c, 0xfe, 0x74, 0x83, 0x3a, 0xbe, 0xcf, + 0xab, 0xdb, 0x75, 0xe4, 0x7e, 0x5d, 0x99, 0xc8, 0x51, 0x5f, 0x6e, 0xb2, + 0x79, 0xb4, 0x4c, 0xdd, 0x81, 0xda, 0xb1, 0x1a, 0x2e, 0x35, 0xa0, 0xc2, + 0xec, 0xb7, 0x42, 0xe7, 0xcc, 0xa9, 0x0f, 0x96, 0x02, 0xf0, 0x54, 0x12, + 0x80, 0xaa, 0xf5, 0x92, 0xa4, 0xdb, 0x81, 0x82, 0xee, 0x5f, 0x1a, 0xb0, + 0x96, 0x3c, 0x2b, 0x94, 0xf3, 0x72, 0x0c, 0x92, 0x6b, 0xf7, 0x49, 0x33, + 0xd9, 0x5c, 0x00, 0xd1, 0x32, 0xe1, 0x48, 0xdc, 0xa6, 0xbd, 0xb0, 0x7c, + 0x28, 0x88, 0xb7, 0x35, 0x5e, 0x51, 0xe9, 0xc6, 0x2b, 0x65, 0x9a, 0xcb, + 0x12, 0x3a, 0xf0, 0xe9, 0xdf, 0xbf, 0x85, 0xfb, 0xee, 0xbf, 0x0f, 0xef, + 0xac, 0x07, 0x14, 0x98, 0xab, 0xd6, 0xc8, 0x05, 0xe3, 0x1d, 0xd1, 0xfa, + 0x27, 0x85, 0xe3, 0xfb, 0x17, 0x8f, 0xb7, 0xc3, 0x6b, 0x01, 0x6c, 0x05, + 0x10, 0xac, 0xa6, 0xf5, 0x1c, 0xe8, 0xe4, 0x90, 0x7e, 0x1b, 0x32, 0x2e, + 0x74, 0x3d, 0x2a, 0x5b, 0xca, 0x3d, 0xf9, 0x6c, 0x70, 0xaf, 0xdd, 0x86, + 0x46, 0x9e, 0xef, 0xa9, 0xe7, 0xb2, 0xa5, 0x7a, 0x78, 0xbf, 0xd6, 0xea, + 0x77, 0x5e, 0x03, 0x64, 0xdf, 0x7c, 0x11, 0xd9, 0xdc, 0x45, 0xc9, 0x1b, + 0x87, 0xd0, 0xf9, 0xe4, 0x4d, 0xd2, 0xff, 0x91, 0xfb, 0x99, 0x73, 0xce, + 0xfb, 0x46, 0xaa, 0x0b, 0x0c, 0xae, 0xcf, 0x8f, 0x80, 0xb7, 0xb7, 0xff, + 0x89, 0x53, 0x56, 0xdc, 0xdb, 0x62, 0x69, 0xde, 0x4e, 0x08, 0xd5, 0x4a, + 0xaa, 0xcb, 0xcb, 0xaf, 0xf4, 0x9e, 0xd7, 0x49, 0xcf, 0x5c, 0xfd, 0x14, + 0x47, 0xc1, 0xc4, 0xd7, 0x73, 0x0e, 0x4c, 0xba, 0xf0, 0x88, 0x27, 0xa9, + 0x02, 0x95, 0xa1, 0xac, 0x0e, 0x5f, 0xde, 0x6a, 0xdb, 0x06, 0x21, 0x70, + 0x3c, 0x12, 0x9e, 0x0f, 0xcc, 0x98, 0x16, 0x50, 0x07, 0x90, 0x06, 0xca, + 0xdb, 0x9f, 0xa4, 0xd1, 0x42, 0x41, 0x2c, 0x0a, 0x0e, 0x78, 0x59, 0x60, + 0x45, 0xc1, 0x12, 0x86, 0xa9, 0xf3, 0x5a, 0xb5, 0x5a, 0x7b, 0xc7, 0xb5, + 0x19, 0x38, 0x01, 0xec, 0x12, 0xf0, 0x8f, 0xd0, 0xfb, 0xcc, 0x65, 0xf5, + 0xcd, 0x40, 0x01, 0xb4, 0xea, 0xcf, 0xb4, 0x10, 0x80, 0xbb, 0x1c, 0xee, + 0x6f, 0xfd, 0x01, 0x75, 0xad, 0xa9, 0xd8, 0x0f, 0x97, 0x47, 0xbd, 0x60, + 0x59, 0x59, 0x1f, 0xb6, 0x64, 0x15, 0xa8, 0x69, 0x18, 0x96, 0xf8, 0xb6, + 0xb6, 0xb1, 0xec, 0x51, 0x3b, 0xaa, 0x82, 0x95, 0xf5, 0x2e, 0x2c, 0x69, + 0x30, 0xd7, 0xb2, 0x47, 0x55, 0xc7, 0xb3, 0x14, 0x3d, 0x1a, 0xb5, 0xaf, + 0xb6, 0x12, 0x81, 0x5b, 0x71, 0x79, 0x5f, 0x6e, 0x21, 0x34, 0x9c, 0x69, + 0x6e, 0x42, 0x39, 0xc4, 0x8f, 0x1f, 0x55, 0x00, 0xa3, 0xb9, 0xb1, 0x3c, + 0xb7, 0x3d, 0xe9, 0x71, 0xdf, 0xd5, 0xba, 0xdf, 0xb9, 0x5e, 0x50, 0xff, + 0x72, 0x8b, 0xd2, 0xc7, 0x55, 0xbf, 0xcc, 0x84, 0xc7, 0xbf, 0xdc, 0x0a, + 0xf2, 0x1a, 0x8d, 0xe5, 0x27, 0xa9, 0x3a, 0x73, 0xc8, 0xe5, 0xd5, 0xee, + 0xda, 0xc3, 0xc1, 0xb4, 0x86, 0x81, 0x67, 0x0d, 0xa3, 0xd9, 0x23, 0x87, + 0x02, 0x78, 0xd6, 0x23, 0xdf, 0x99, 0xa3, 0xef, 0x53, 0x6e, 0xac, 0x6f, + 0xb6, 0x35, 0xeb, 0x32, 0xab, 0x4f, 0x6b, 0x05, 0xf4, 0xf9, 0x1a, 0x15, + 0xa7, 0x42, 0x1d, 0x28, 0xae, 0x9f, 0xa2, 0xb1, 0x3c, 0x47, 0x3f, 0xa0, + 0x96, 0xf4, 0xdb, 0x88, 0x60, 0x0c, 0xb6, 0x77, 0x3b, 0x40, 0xb3, 0x55, + 0xc3, 0x93, 0x2d, 0x5c, 0x51, 0x22, 0xe3, 0x16, 0xc0, 0xcb, 0x11, 0x9c, + 0xf1, 0xbe, 0xc4, 0x93, 0x1e, 0xae, 0xc8, 0x03, 0x05, 0xba, 0x5e, 0x9b, + 0x4a, 0xf1, 0x66, 0xaa, 0x4b, 0xf7, 0x44, 0x6c, 0xd4, 0x97, 0x6b, 0x78, + 0x7e, 0x13, 0xd7, 0x29, 0x50, 0x5f, 0xae, 0x6a, 0x88, 0x95, 0xad, 0x22, + 0xf0, 0x69, 0xe0, 0xb7, 0x68, 0xaf, 0x18, 0x38, 0xa7, 0xb9, 0x27, 0x13, + 0x2c, 0x83, 0xdf, 0x8b, 0x00, 0x29, 0xed, 0xf7, 0x0d, 0xc9, 0x4d, 0x15, + 0x97, 0xeb, 0xb8, 0x01, 0x10, 0xda, 0xf3, 0x3d, 0x5c, 0xfd, 0xbc, 0xe2, + 0x8a, 0x92, 0x06, 0x73, 0x35, 0xa9, 0xb7, 0xc2, 0xba, 0xe6, 0x46, 0x0a, + 0x34, 0x1a, 0xd1, 0x27, 0x7c, 0x03, 0xd4, 0x02, 0x68, 0xaf, 0xb4, 0xa9, + 0x14, 0xf7, 0x52, 0x5d, 0xfa, 0x1c, 0x47, 0xfc, 0x23, 0x6c, 0xb7, 0x20, + 0x7e, 0x06, 0x28, 0xa6, 0xda, 0xaf, 0xde, 0xf7, 0xc7, 0xee, 0xc9, 0x26, + 0x85, 0x7c, 0x19, 0xbc, 0x1c, 0x52, 0x97, 0x6b, 0x34, 0xbb, 0x41, 0x1d, + 0x5f, 0x53, 0x83, 0xc8, 0x35, 0xbc, 0x01, 0x13, 0x13, 0x0a, 0xfa, 0xb4, + 0x67, 0x42, 0x45, 0x1d, 0x6d, 0x24, 0x97, 0x61, 0xe2, 0x27, 0x8a, 0x3a, + 0x6b, 0x83, 0x00, 0xb4, 0x65, 0x00, 0x52, 0x07, 0x8e, 0x86, 0xe9, 0x8d, + 0xbd, 0x70, 0xbd, 0xc8, 0xd1, 0x86, 0x82, 0x48, 0xed, 0xdb, 0xa3, 0xd2, + 0x3e, 0xb9, 0x29, 0x56, 0xc8, 0x90, 0x70, 0xac, 0x00, 0xac, 0x65, 0x74, + 0xb8, 0x4f, 0xba, 0xdb, 0xbf, 0x1b, 0x24, 0xb8, 0xfa, 0xea, 0x7b, 0x83, + 0xe8, 0xeb, 0xae, 0x8b, 0x43, 0xb5, 0x88, 0x00, 0xb5, 0x96, 0x46, 0xfb, + 0x00, 0xb5, 0x6e, 0xff, 0x2e, 0xf0, 0x1b, 0x61, 0x99, 0x09, 0xe5, 0xde, + 0x75, 0x9d, 0x15, 0xd6, 0xcb, 0xab, 0x1f, 0x87, 0x09, 0xd3, 0x70, 0xfa, + 0xfc, 0x68, 0x34, 0x1a, 0x41, 0xfb, 0x15, 0x29, 0xb2, 0x6f, 0x5f, 0x83, + 0x3d, 0xc5, 0x06, 0x07, 0x1a, 0xb0, 0x67, 0x1f, 0x70, 0x00, 0x8e, 0xee, + 0xd1, 0xdb, 0x0f, 0x34, 0x38, 0xb0, 0x07, 0xf6, 0xe8, 0xf5, 0xc6, 0xd1, + 0xb0, 0x8c, 0xc6, 0x51, 0xd5, 0xd6, 0x7f, 0xdf, 0x60, 0xf0, 0xb8, 0xd9, + 0x39, 0x40, 0xfd, 0xe2, 0x3a, 0xd7, 0x09, 0x7a, 0x06, 0xd9, 0xb3, 0x27, + 0x49, 0x89, 0x6c, 0x3b, 0xd7, 0x6b, 0xa2, 0x06, 0x33, 0x25, 0x2a, 0x20, + 0x20, 0xc5, 0xa3, 0xd5, 0x3d, 0xdc, 0xf3, 0xce, 0x17, 0x7c, 0x35, 0x80, + 0xaa, 0x75, 0xa1, 0x15, 0x1b, 0x37, 0x8b, 0xbf, 0xe7, 0x9a, 0x8b, 0xbd, + 0xfb, 0x13, 0x8e, 0x60, 0x5e, 0x86, 0x13, 0xca, 0xdc, 0x6a, 0x01, 0xcb, + 0x0a, 0xbe, 0x82, 0x5a, 0xdd, 0xfe, 0x14, 0x20, 0xa0, 0x22, 0x55, 0xdf, + 0xa5, 0x69, 0x5e, 0x7b, 0x6a, 0x5b, 0xf1, 0x3d, 0x13, 0x8e, 0x7e, 0xf6, + 0xf2, 0x25, 0xf3, 0xd6, 0x46, 0xaf, 0x03, 0x25, 0x27, 0x43, 0x46, 0x08, + 0xe8, 0x48, 0x26, 0xb3, 0x82, 0x87, 0x62, 0xef, 0xb2, 0x84, 0x2f, 0x91, + 0x8e, 0x7d, 0xfd, 0x15, 0x91, 0x43, 0x23, 0x9d, 0xf0, 0x19, 0xc4, 0x33, + 0xef, 0x58, 0x63, 0x80, 0x2f, 0x55, 0x07, 0x14, 0x7c, 0x4b, 0xbf, 0x7b, + 0x9d, 0xaf, 0x4a, 0x5c, 0xba, 0xea, 0xfd, 0x2d, 0x82, 0x2e, 0x0a, 0xa8, + 0x35, 0x67, 0x60, 0x60, 0xab, 0x8d, 0x63, 0x6a, 0xfb, 0x39, 0x07, 0xda, + 0x56, 0x1e, 0x03, 0xd4, 0x92, 0x52, 0xb5, 0x83, 0x79, 0x72, 0x0d, 0xea, + 0xec, 0x13, 0x4e, 0xc6, 0xe4, 0x87, 0xd0, 0x2f, 0x17, 0xa9, 0xea, 0x1f, + 0xd8, 0x8a, 0x41, 0xc5, 0xac, 0xfd, 0xb1, 0xe1, 0x5a, 0x6d, 0x2b, 0x3e, + 0xfe, 0x9e, 0x8b, 0x0f, 0xb4, 0x71, 0xf5, 0xb1, 0xbe, 0xfc, 0x95, 0x97, + 0x5f, 0xd3, 0xe5, 0xb6, 0x4b, 0xbe, 0x0f, 0xac, 0x8b, 0x80, 0xa6, 0x40, + 0x81, 0xa2, 0x2e, 0xbb, 0xec, 0xb2, 0x00, 0x32, 0x75, 0x29, 0x67, 0x14, + 0x98, 0xea, 0x97, 0xc3, 0x34, 0x06, 0x76, 0x75, 0x29, 0x21, 0x5c, 0xea, + 0x6c, 0xf3, 0x4c, 0x04, 0x90, 0x65, 0x80, 0x54, 0x06, 0x84, 0x75, 0xa1, + 0x6d, 0x9e, 0x3a, 0x75, 0xaa, 0x07, 0x72, 0x05, 0x70, 0xe6, 0xec, 0xd9, + 0x00, 0xbc, 0x65, 0xd2, 0x19, 0x9b, 0x46, 0x06, 0xa8, 0xb5, 0xae, 0x70, + 0x69, 0x90, 0xd7, 0xa4, 0xed, 0x81, 0x7a, 0x9d, 0x3d, 0xcb, 0xa5, 0xeb, + 0xd6, 0x05, 0x79, 0x0d, 0x14, 0xcc, 0x84, 0x01, 0x36, 0x6d, 0xbb, 0x92, + 0x75, 0xba, 0x1e, 0xa6, 0xbe, 0x2e, 0xe3, 0xf0, 0x01, 0xe0, 0xbf, 0xa8, + 0x7c, 0x49, 0xef, 0x3e, 0x6c, 0xb5, 0x3c, 0x8f, 0xbc, 0xeb, 0xd2, 0x5c, + 0xe9, 0xbd, 0x5e, 0x7a, 0x16, 0xe8, 0x2a, 0x9f, 0x15, 0x34, 0x80, 0x43, + 0xdf, 0x9b, 0xa6, 0xb2, 0xa1, 0x42, 0xab, 0xdd, 0x20, 0x23, 0x0a, 0x34, + 0x3b, 0xaa, 0xaf, 0x64, 0x80, 0x59, 0xe6, 0x9d, 0xbf, 0xec, 0x34, 0x29, + 0xe4, 0x4b, 0xb4, 0xbd, 0x70, 0x7b, 0xb8, 0x4d, 0x8f, 0x13, 0x64, 0x73, + 0x40, 0x37, 0x02, 0xd4, 0x0a, 0xd2, 0xba, 0x02, 0x44, 0x2e, 0x80, 0x6e, + 0x01, 0xc8, 0x65, 0x65, 0xa3, 0xbb, 0xd2, 0x26, 0x43, 0xaf, 0x4a, 0xa2, + 0x48, 0xab, 0xdd, 0x60, 0xa1, 0x79, 0x82, 0xaa, 0x2c, 0x50, 0xa9, 0x3d, + 0x44, 0xe9, 0xfa, 0x3b, 0x11, 0x4e, 0x17, 0xe9, 0x67, 0xa8, 0xc6, 0x07, + 0xaa, 0x44, 0x8e, 0xee, 0x15, 0xdb, 0x11, 0x35, 0xf5, 0x8e, 0xb3, 0x70, + 0xfd, 0x6d, 0x2a, 0x7a, 0xa4, 0x00, 0xb2, 0x8b, 0x2b, 0x0a, 0x9c, 0x38, + 0x36, 0x4d, 0xe1, 0xfa, 0xdb, 0xe8, 0xd2, 0x65, 0x76, 0xa5, 0xc6, 0xa7, + 0x3f, 0xf3, 0x69, 0xda, 0x2d, 0x49, 0x5b, 0x3f, 0x89, 0x09, 0xa0, 0xfa, + 0xc2, 0x1c, 0xdb, 0x27, 0xfa, 0x3f, 0x81, 0x0a, 0xfd, 0xee, 0xfb, 0xc4, + 0xb1, 0x1a, 0xa5, 0x1b, 0x6f, 0x61, 0xfa, 0xd1, 0x87, 0xc3, 0xb2, 0xb2, + 0x19, 0x4a, 0x37, 0xde, 0xc2, 0x5c, 0xa3, 0x46, 0x21, 0x5f, 0xa2, 0xab, + 0xe9, 0xac, 0x63, 0x1f, 0xdf, 0xcb, 0x3d, 0x0f, 0xdc, 0xc7, 0x78, 0x47, + 0x52, 0x7f, 0xb6, 0x16, 0x40, 0x9f, 0x2b, 0xdb, 0xc6, 0xc8, 0x95, 0x72, + 0xf0, 0x9d, 0x85, 0xe8, 0x58, 0x8a, 0x3e, 0xa7, 0x2b, 0xbc, 0x65, 0x4d, + 0xd0, 0x28, 0x1b, 0x92, 0x55, 0x6f, 0xd6, 0x68, 0xb6, 0x9a, 0x14, 0xf2, + 0x05, 0x9a, 0xad, 0x26, 0xcd, 0x95, 0xf0, 0xdd, 0x6f, 0x61, 0x44, 0xfd, + 0x86, 0xcc, 0xfb, 0x75, 0x93, 0xd6, 0xc4, 0xcd, 0x3d, 0xf7, 0x18, 0xfb, + 0x1f, 0x99, 0xe3, 0x7b, 0xdf, 0x7c, 0x34, 0x02, 0xd5, 0x02, 0x05, 0xd9, + 0xfa, 0xf5, 0x9d, 0x1f, 0x88, 0xc4, 0xbd, 0x3d, 0x7b, 0x9a, 0x67, 0xab, + 0xff, 0x14, 0xe6, 0xd7, 0x10, 0x2c, 0x63, 0xcb, 0xd4, 0xcd, 0x56, 0x69, + 0xfd, 0x38, 0xcd, 0x95, 0xba, 0x9a, 0x84, 0xc1, 0x8a, 0x33, 0xf5, 0x8d, + 0xdb, 0x02, 0x82, 0xf4, 0x71, 0x5b, 0x66, 0xbf, 0xe3, 0xf6, 0x86, 0x95, + 0x10, 0x05, 0x6e, 0x78, 0xff, 0x5e, 0xea, 0xcd, 0x1a, 0xa5, 0x42, 0x99, + 0xc7, 0xbe, 0xf7, 0x50, 0xc4, 0x8e, 0x29, 0xef, 0xc7, 0x2f, 0xd7, 0xf9, + 0xa1, 0x35, 0xfb, 0x8f, 0x0d, 0xcf, 0xaa, 0x7e, 0xff, 0x2f, 0xf8, 0xc9, + 0x3f, 0x9c, 0x86, 0xc5, 0xab, 0x06, 0x96, 0x15, 0x3f, 0xa7, 0x53, 0xa5, + 0x4a, 0x95, 0x2a, 0x55, 0xaa, 0x54, 0xa9, 0x52, 0xa5, 0x4a, 0x95, 0x2a, + 0x55, 0xaa, 0x54, 0xa9, 0x52, 0xa5, 0x4a, 0x95, 0x2a, 0x55, 0xaa, 0x54, + 0xa9, 0x52, 0xa5, 0x4a, 0x95, 0x2a, 0xd5, 0xf0, 0x72, 0x76, 0xbe, 0xde, + 0x35, 0x48, 0x95, 0x2a, 0x55, 0xaa, 0x54, 0xa9, 0xfe, 0x19, 0x6a, 0xfe, + 0x02, 0xd9, 0x31, 0x1f, 0xcb, 0x16, 0xd6, 0x17, 0xf0, 0x3c, 0x2f, 0x00, + 0x3d, 0x25, 0x01, 0x9f, 0x92, 0xf2, 0x5e, 0x88, 0x8f, 0xd6, 0x93, 0x3e, + 0x0a, 0x1f, 0x1a, 0xac, 0x35, 0x64, 0xf9, 0xc2, 0x11, 0xd6, 0x2c, 0xef, + 0xfd, 0xeb, 0x30, 0x08, 0xfa, 0x12, 0xaf, 0xd3, 0x5a, 0xd2, 0xb6, 0xf5, + 0x87, 0x9a, 0xe6, 0x43, 0xbc, 0xa4, 0xfa, 0x0d, 0x2b, 0x61, 0x7d, 0xf0, + 0x0c, 0x1a, 0xb2, 0x85, 0x50, 0xce, 0xe6, 0x96, 0x27, 0x72, 0x10, 0xbf, + 0x9a, 0x2d, 0x9d, 0x1e, 0x11, 0x05, 0x6e, 0xe5, 0x64, 0x86, 0xb6, 0xec, + 0x22, 0xc8, 0x21, 0x1c, 0x49, 0x5b, 0x76, 0xc9, 0x89, 0xd8, 0xa7, 0xa5, + 0xc6, 0x59, 0xdd, 0x15, 0x3c, 0x78, 0xd3, 0x2e, 0x6e, 0xfd, 0xc6, 0x41, + 0x00, 0xb5, 0xd4, 0x61, 0xf3, 0x51, 0xf9, 0x67, 0x1e, 0x3d, 0x14, 0xc0, + 0xb5, 0x6e, 0x6d, 0x1d, 0xa2, 0xe9, 0x49, 0xc6, 0xaf, 0x1c, 0x47, 0xf8, + 0xf0, 0x5b, 0x0f, 0x1c, 0xd4, 0xed, 0xa0, 0x40, 0x5a, 0x05, 0x34, 0xe0, + 0xca, 0x53, 0x1f, 0xd5, 0x1b, 0x18, 0x57, 0x4d, 0x7f, 0x48, 0x1b, 0x07, + 0x56, 0x05, 0xd5, 0x19, 0x12, 0xa8, 0x25, 0xb2, 0x82, 0xa6, 0xd7, 0x24, + 0xe7, 0xe4, 0x82, 0x76, 0x2a, 0x08, 0x55, 0x1e, 0x6e, 0x98, 0xb6, 0xe9, + 0x49, 0x9a, 0x28, 0x7b, 0xc2, 0x2a, 0x57, 0x64, 0x05, 0x05, 0x2f, 0xa7, + 0xea, 0x74, 0xb2, 0xa9, 0x9c, 0x15, 0xf5, 0x47, 0xf1, 0x11, 0x8f, 0x6f, + 0x29, 0x95, 0x5d, 0x42, 0xa7, 0xc1, 0x28, 0xcc, 0x6c, 0xb0, 0xda, 0x48, + 0x4a, 0x42, 0xd0, 0xf2, 0x21, 0xef, 0x08, 0x5a, 0x52, 0xe2, 0x75, 0x24, + 0x6e, 0x56, 0x04, 0x1f, 0x20, 0xbb, 0x96, 0x93, 0x47, 0x57, 0x17, 0xde, + 0x92, 0x12, 0x1c, 0x05, 0xce, 0x32, 0xbb, 0xe3, 0xf9, 0xe0, 0x3a, 0x7a, + 0x1f, 0x10, 0x6a, 0xbf, 0xf5, 0xec, 0xd6, 0x76, 0xba, 0x2e, 0x21, 0xec, + 0x2a, 0xbe, 0xb4, 0x5a, 0x3a, 0x80, 0x50, 0x09, 0x27, 0xb4, 0x33, 0x96, + 0x85, 0xf9, 0x3e, 0x60, 0xad, 0x7e, 0x80, 0xae, 0x41, 0xb2, 0x3f, 0x70, + 0x5e, 0x93, 0x1c, 0x41, 0x5b, 0x3b, 0xb9, 0x18, 0x1b, 0x76, 0xd9, 0xe7, + 0x52, 0x17, 0x20, 0x00, 0x69, 0x99, 0x25, 0x40, 0x57, 0x97, 0xe3, 0x75, + 0xba, 0x3d, 0xdb, 0xd6, 0xa2, 0xf8, 0x35, 0x28, 0xe7, 0xe6, 0xe8, 0x4a, + 0x65, 0xd3, 0x0e, 0x67, 0x44, 0x26, 0x31, 0x9c, 0x04, 0xd1, 0x92, 0x1d, + 0x19, 0x99, 0x21, 0x1d, 0xa2, 0xbf, 0x3f, 0x77, 0xc4, 0xc5, 0xd3, 0x1f, + 0xb7, 0xbb, 0x23, 0x2e, 0x42, 0x88, 0x00, 0x9a, 0x65, 0xb6, 0xd9, 0x61, + 0x93, 0x2e, 0xc9, 0x99, 0x3d, 0xe9, 0x1a, 0x3a, 0x28, 0x9c, 0x94, 0xdf, + 0x5b, 0xf1, 0xf0, 0x7c, 0x89, 0xeb, 0x08, 0xbc, 0x01, 0xd7, 0xeb, 0xb8, + 0xfa, 0xa5, 0xed, 0x17, 0x1f, 0xaf, 0x73, 0xbf, 0xb4, 0xbd, 0xce, 0xfa, + 0x6b, 0x2b, 0xa7, 0x9f, 0x5e, 0x01, 0x76, 0x2c, 0x29, 0x37, 0x38, 0x03, + 0x82, 0x32, 0x3e, 0x73, 0xf1, 0x38, 0xdb, 0x55, 0x2e, 0x31, 0x7e, 0x69, + 0x09, 0xf3, 0x0d, 0xf5, 0x0e, 0x7a, 0x41, 0x54, 0x71, 0x1b, 0x49, 0xdb, + 0xec, 0xb2, 0x01, 0x46, 0x97, 0x96, 0x18, 0x5d, 0x5a, 0x52, 0xf5, 0x04, + 0x4e, 0x01, 0x1b, 0x07, 0xd8, 0x19, 0xa6, 0xac, 0x41, 0x79, 0x8c, 0x92, + 0x20, 0x58, 0xf6, 0xfe, 0x2e, 0xd1, 0x0b, 0xc8, 0xda, 0xc1, 0x28, 0xb7, + 0xfb, 0x27, 0x87, 0x2e, 0xef, 0xe3, 0x5f, 0xfb, 0x5a, 0x4f, 0x9c, 0x0d, + 0x0e, 0x5b, 0x5a, 0x5c, 0x64, 0xe9, 0xab, 0x5f, 0xe5, 0x22, 0xd4, 0x71, + 0x02, 0xf8, 0x12, 0x70, 0xff, 0xce, 0x9d, 0x6c, 0x18, 0x1d, 0x65, 0x74, + 0xc3, 0x06, 0x5d, 0xae, 0xd9, 0xf8, 0x07, 0x43, 0x95, 0xfb, 0xc4, 0xdc, + 0xf3, 0x5c, 0x33, 0x1e, 0x42, 0xb4, 0xae, 0x19, 0x7f, 0x37, 0xff, 0x75, + 0xe1, 0xfb, 0xbc, 0xe3, 0x5d, 0xef, 0xe8, 0x9b, 0xc7, 0x76, 0x9b, 0x90, + 0x24, 0xbb, 0xbf, 0xe5, 0x57, 0x41, 0x9c, 0xab, 0x7b, 0xc7, 0x50, 0x55, + 0x0c, 0xd4, 0xe8, 0xe3, 0xc8, 0x65, 0x40, 0x55, 0xc2, 0x76, 0xa4, 0x1d, + 0x52, 0xe3, 0x40, 0xbe, 0x18, 0xae, 0x5f, 0xd3, 0x0a, 0xcf, 0xbd, 0x27, + 0xf2, 0x32, 0x80, 0x6b, 0x8d, 0x37, 0x60, 0xfa, 0x75, 0xc2, 0xb6, 0xc7, + 0xdb, 0x69, 0x55, 0x87, 0xb6, 0xb8, 0x84, 0x4b, 0xe3, 0x7d, 0x93, 0xe4, + 0x96, 0x6a, 0x50, 0x5d, 0x20, 0xb7, 0xe2, 0x21, 0x3f, 0xba, 0x17, 0x84, + 0xab, 0x80, 0x5a, 0x63, 0x63, 0x70, 0xff, 0x34, 0x35, 0x5c, 0x44, 0xa3, + 0x41, 0xe9, 0x85, 0x05, 0x95, 0x4f, 0xc3, 0xb4, 0x9a, 0xad, 0x06, 0xde, + 0x33, 0x73, 0xd4, 0xb4, 0x73, 0x79, 0x0d, 0x17, 0xf7, 0xc5, 0x3a, 0xa5, + 0xa7, 0xb5, 0xd3, 0x86, 0x06, 0x6c, 0x55, 0x1f, 0x7d, 0x48, 0xa5, 0x71, + 0x5a, 0xd4, 0xae, 0x13, 0x6c, 0x9f, 0x2f, 0x53, 0xd0, 0xce, 0xf7, 0xe2, + 0x43, 0xca, 0x79, 0xa6, 0x3c, 0x5f, 0xe7, 0xd0, 0xe5, 0xf7, 0xe0, 0x69, + 0xa6, 0x96, 0x10, 0x82, 0xdf, 0xfc, 0x54, 0x51, 0xad, 0x7c, 0x0a, 0xca, + 0x6e, 0x23, 0xa8, 0xf6, 0xd4, 0x84, 0x02, 0xbf, 0xde, 0xf3, 0xbb, 0x97, + 0x72, 0xcf, 0xe3, 0x3a, 0xcd, 0xc7, 0xa0, 0x92, 0x0f, 0xd3, 0x4c, 0xbe, + 0x47, 0xfd, 0x55, 0x6d, 0xa7, 0xd2, 0x23, 0xbd, 0xb3, 0xc6, 0x9f, 0xaf, + 0xce, 0xfc, 0xed, 0x1c, 0x9b, 0x77, 0xdd, 0xd7, 0x03, 0xd0, 0x1a, 0x1a, + 0xa8, 0xf5, 0xd0, 0x5d, 0xf0, 0xfe, 0xc9, 0x70, 0xfd, 0x7b, 0xb3, 0xb0, + 0xa9, 0x0c, 0x8d, 0x3a, 0xcc, 0x4c, 0xc3, 0x47, 0x6e, 0x0b, 0xb7, 0x99, + 0x7e, 0xd8, 0x85, 0xd8, 0x8f, 0x35, 0xf4, 0xe1, 0x6d, 0xc5, 0x41, 0xb2, + 0xe7, 0xa3, 0xb9, 0x67, 0xce, 0xb1, 0xbf, 0x74, 0x0e, 0x5a, 0xf0, 0xf4, + 0x53, 0x68, 0x3f, 0x5f, 0xe2, 0x65, 0xf5, 0x7b, 0xec, 0x77, 0x67, 0x0c, + 0xf2, 0x0f, 0x61, 0x63, 0xd5, 0x3a, 0xf4, 0xb3, 0xb1, 0x4a, 0x7e, 0x80, + 0x66, 0xa7, 0x06, 0x09, 0xc0, 0x30, 0x5b, 0x83, 0xe0, 0x58, 0xe7, 0xfb, + 0x04, 0x1c, 0x79, 0x5c, 0xb0, 0xc2, 0x83, 0xca, 0xea, 0xe7, 0x0a, 0xdd, + 0xaf, 0x9e, 0x42, 0xff, 0xc5, 0xbb, 0xe6, 0x67, 0xf9, 0x29, 0xdd, 0x18, + 0x2c, 0x0b, 0x20, 0xc3, 0x9b, 0x06, 0x57, 0xba, 0x8f, 0x5e, 0xcb, 0x7d, + 0x59, 0x2d, 0xcf, 0xf9, 0x1c, 0x97, 0xd6, 0xb5, 0x39, 0x0a, 0xcf, 0x4e, + 0x53, 0xbf, 0x7e, 0x9c, 0xfd, 0xf9, 0x12, 0x77, 0x7d, 0xac, 0x4e, 0x79, + 0x4b, 0x8b, 0xf2, 0x96, 0x5c, 0x04, 0x2e, 0x65, 0xc2, 0xc1, 0xd2, 0x76, + 0x38, 0xee, 0x40, 0x46, 0x3b, 0x20, 0xe6, 0x2f, 0x11, 0x78, 0x6d, 0x8d, + 0xb4, 0x59, 0x27, 0xa9, 0xd5, 0x24, 0xe5, 0xb2, 0x6d, 0x47, 0xb5, 0x94, + 0x0d, 0x9e, 0x4a, 0x0a, 0x07, 0x71, 0xcb, 0x87, 0x7a, 0xd2, 0x98, 0x3a, + 0x54, 0xab, 0x2d, 0xf2, 0xb9, 0x0c, 0xb9, 0x11, 0x17, 0x34, 0xa0, 0xe5, + 0x73, 0x9f, 0x7f, 0x18, 0xd7, 0x05, 0x77, 0x5d, 0x81, 0xfa, 0x4b, 0xf5, + 0x9e, 0x3c, 0x83, 0xf6, 0x29, 0x1e, 0x5e, 0x4b, 0xbe, 0x24, 0xd9, 0xd0, + 0xad, 0x5d, 0x9f, 0xbc, 0x8d, 0x43, 0x5f, 0xbc, 0x8f, 0xd6, 0x4b, 0x61, + 0x9c, 0xeb, 0xa8, 0x6b, 0x98, 0x2b, 0xc0, 0xeb, 0xf6, 0xc2, 0xb8, 0xba, + 0x9d, 0x36, 0x42, 0x08, 0x1a, 0x2b, 0x50, 0x1c, 0x89, 0x3a, 0xb9, 0x2b, + 0xfb, 0x12, 0x37, 0xeb, 0xf6, 0x82, 0xf5, 0x86, 0x90, 0x6c, 0xff, 0xd3, + 0xda, 0x33, 0x69, 0xf9, 0xd9, 0x8b, 0x38, 0xdb, 0x79, 0x65, 0xf5, 0x84, + 0xff, 0xcc, 0xea, 0x02, 0xc3, 0xd5, 0xa7, 0x09, 0xbc, 0x53, 0x87, 0xdf, + 0xae, 0x97, 0x79, 0xe0, 0x87, 0x56, 0x9a, 0x77, 0x01, 0x7f, 0xdd, 0x79, + 0x05, 0x49, 0xaf, 0xad, 0x9f, 0x19, 0xfc, 0xb3, 0x5b, 0xb3, 0x0a, 0x40, + 0x59, 0xc0, 0x41, 0xa9, 0xea, 0x61, 0x2e, 0x3a, 0xfd, 0xe0, 0x80, 0xaf, + 0x97, 0xbc, 0xd8, 0x12, 0x14, 0xec, 0x20, 0xa3, 0x21, 0x5a, 0xe6, 0x6c, + 0xaf, 0x01, 0xe3, 0x02, 0x66, 0x07, 0x8c, 0x99, 0x4e, 0xb9, 0x30, 0xed, + 0x81, 0x14, 0x24, 0xf6, 0xef, 0x8d, 0x9b, 0xf0, 0x85, 0x84, 0x6b, 0x0d, + 0xb2, 0x5d, 0xc0, 0x1e, 0x37, 0x83, 0x56, 0x47, 0xd5, 0x6d, 0xb5, 0xbb, + 0x53, 0xad, 0x25, 0xa3, 0x70, 0xac, 0x65, 0xd5, 0x3a, 0x49, 0x71, 0xc3, + 0xc4, 0xf7, 0x4b, 0x5b, 0xb3, 0xe2, 0xc7, 0x8b, 0x61, 0xfc, 0x42, 0x23, + 0xda, 0x19, 0xd9, 0xaa, 0xb7, 0x2d, 0x34, 0x3c, 0xb6, 0x16, 0x5d, 0x6c, + 0x5c, 0x4c, 0x12, 0xc4, 0x6a, 0xf6, 0xaa, 0xed, 0xe0, 0x77, 0x11, 0xef, + 0xab, 0x31, 0x37, 0x16, 0xf6, 0x4d, 0xe4, 0x9f, 0x94, 0x19, 0x7f, 0x54, + 0x39, 0x9b, 0x77, 0x4f, 0xce, 0x51, 0xbd, 0xda, 0x05, 0x01, 0xd5, 0x67, + 0x15, 0xd8, 0xcb, 0xfc, 0x30, 0xe7, 0x5b, 0xb3, 0x8c, 0xe5, 0x27, 0x7b, + 0xec, 0x8a, 0xf5, 0x3a, 0x81, 0x1f, 0x96, 0x2b, 0x9c, 0x4c, 0xdf, 0x7a, + 0xc4, 0xb5, 0x1a, 0x38, 0xc6, 0x00, 0xb2, 0x8c, 0x72, 0x8e, 0x37, 0x70, + 0xfb, 0x85, 0x94, 0xeb, 0x8f, 0x81, 0x53, 0x45, 0x7a, 0x1e, 0xe1, 0xd9, + 0xd0, 0x88, 0xa5, 0x6a, 0x20, 0x9c, 0xad, 0x0a, 0xda, 0x18, 0xa8, 0x48, + 0x14, 0xc0, 0x95, 0xa1, 0x90, 0x2f, 0xe3, 0x35, 0x54, 0xdf, 0xb1, 0xeb, + 0x35, 0xc1, 0x69, 0xa3, 0xce, 0x20, 0xc0, 0xaf, 0xe1, 0x8a, 0x31, 0x3c, + 0xd9, 0x42, 0xfd, 0x3a, 0x2b, 0xd4, 0x97, 0x7b, 0x21, 0xfa, 0xa5, 0xf5, + 0x15, 0xaa, 0x7a, 0xbc, 0xda, 0x0e, 0x2b, 0x7d, 0x33, 0x71, 0x1f, 0xa4, + 0x54, 0xa3, 0xd1, 0x08, 0x89, 0xf4, 0x05, 0xae, 0x13, 0x4e, 0x82, 0x80, + 0x23, 0x71, 0xf5, 0xa4, 0x1b, 0x5e, 0x00, 0x44, 0x19, 0x46, 0xe1, 0xd5, + 0xca, 0x75, 0xf2, 0x78, 0xbe, 0xea, 0x13, 0x94, 0xf2, 0x65, 0xaa, 0x8d, + 0x7a, 0x34, 0xec, 0x88, 0x00, 0xf0, 0xa5, 0x90, 0xde, 0xc9, 0x93, 0x03, + 0xd4, 0x97, 0xab, 0x54, 0xa8, 0x50, 0xa5, 0x1a, 0x00, 0xb7, 0xb6, 0x3b, + 0xdb, 0x83, 0x70, 0x69, 0x7d, 0x39, 0xb6, 0xbf, 0x51, 0xb9, 0xa2, 0x40, + 0xd7, 0xf3, 0xc0, 0x69, 0xe3, 0x8a, 0x0a, 0xde, 0xb0, 0x90, 0x81, 0x62, + 0x18, 0xb4, 0x81, 0x58, 0x00, 0xc5, 0xa2, 0x8a, 0x9b, 0x28, 0xaa, 0x74, + 0xb1, 0xcd, 0x14, 0x75, 0xde, 0x89, 0x7d, 0x0d, 0x40, 0x81, 0x9d, 0x26, + 0x74, 0x9e, 0x62, 0x31, 0x8a, 0x57, 0x0b, 0xd2, 0x16, 0x8b, 0x1c, 0xd0, + 0x60, 0x2d, 0x80, 0xab, 0x4f, 0x5a, 0x60, 0xad, 0x61, 0x81, 0x5a, 0x46, + 0x71, 0xb0, 0x56, 0xd2, 0xb6, 0xc3, 0xbf, 0x11, 0x44, 0x3d, 0x29, 0xe0, + 0x6a, 0x7d, 0x88, 0x1f, 0x7f, 0x1c, 0x96, 0x8f, 0xc2, 0x1f, 0x6a, 0xe6, + 0xd6, 0xfe, 0xfd, 0x70, 0xe7, 0x9d, 0x2a, 0x7c, 0x78, 0x14, 0x60, 0x89, + 0xa5, 0xa5, 0x10, 0xbc, 0xb5, 0xc3, 0xf0, 0xb8, 0x76, 0x84, 0xf6, 0xd6, + 0xaa, 0xbb, 0xf4, 0xf8, 0xc0, 0xd5, 0x07, 0x14, 0x1c, 0xab, 0x01, 0x4c, + 0x50, 0xa4, 0x58, 0x6c, 0xe8, 0x30, 0x1c, 0x40, 0x01, 0xb5, 0x1a, 0x0d, + 0x7d, 0x3c, 0x34, 0xc9, 0x6c, 0x1f, 0xc0, 0x51, 0xd8, 0x57, 0xb4, 0xda, + 0x72, 0x02, 0x0e, 0xec, 0x53, 0xed, 0x7c, 0xe0, 0x28, 0xfc, 0xab, 0xe2, + 0x2a, 0x15, 0x70, 0x92, 0x30, 0x26, 0x6b, 0x53, 0x7c, 0xbc, 0xf9, 0x82, + 0x68, 0xad, 0x63, 0x69, 0x9e, 0xd7, 0x3f, 0x8f, 0x23, 0xf4, 0xe4, 0x27, + 0x5a, 0xbe, 0x65, 0x5f, 0xe8, 0x09, 0x6e, 0x06, 0xd8, 0x4e, 0x7a, 0xff, + 0xe8, 0xba, 0xea, 0x7e, 0xd1, 0x0f, 0x6e, 0x6b, 0x24, 0x2d, 0x60, 0xd5, + 0xa0, 0x34, 0xaf, 0x8b, 0x2c, 0xd0, 0x98, 0x74, 0xe0, 0x41, 0x47, 0x70, + 0x9f, 0x94, 0xdc, 0xfc, 0x6f, 0x5d, 0xee, 0xf9, 0x0f, 0x1e, 0x4d, 0x1d, + 0x07, 0x70, 0x9f, 0x03, 0x35, 0xfd, 0x9c, 0x25, 0x3a, 0x52, 0xbd, 0x6f, + 0x5c, 0xa5, 0xef, 0x6f, 0xc3, 0xb5, 0x90, 0x90, 0x77, 0x05, 0xac, 0x48, + 0x6e, 0xf7, 0x24, 0x79, 0x47, 0x30, 0x6b, 0xbd, 0x9f, 0x0b, 0xda, 0x38, + 0xeb, 0x0e, 0x06, 0x68, 0xfb, 0xea, 0x9d, 0x9b, 0x90, 0xe1, 0x3b, 0x4f, + 0xe9, 0x24, 0x80, 0xb5, 0x0c, 0x38, 0x31, 0xab, 0x8e, 0xbd, 0x94, 0xe0, + 0x91, 0xa1, 0xeb, 0xab, 0x77, 0x6f, 0x39, 0x1b, 0xa8, 0x25, 0xa3, 0x5c, + 0x35, 0x69, 0xff, 0x1a, 0x4c, 0x1b, 0xf9, 0x6a, 0x7f, 0xec, 0xbb, 0xb7, + 0x0d, 0xd4, 0x52, 0x13, 0x30, 0x45, 0x41, 0x5d, 0x66, 0xbb, 0x7d, 0x6f, + 0x30, 0xef, 0x8a, 0x3c, 0x7b, 0x1c, 0x2b, 0xd6, 0x96, 0x05, 0x3f, 0x84, + 0x73, 0xd9, 0xea, 0x22, 0xc9, 0xf8, 0x82, 0xae, 0xf4, 0x56, 0xed, 0x1c, + 0xff, 0x32, 0x92, 0x1f, 0x20, 0x5e, 0xb3, 0xa5, 0x2d, 0x03, 0x87, 0x3a, + 0xf3, 0x13, 0x05, 0xa4, 0x3a, 0xf9, 0xdc, 0xb3, 0x41, 0xbc, 0x81, 0x4a, + 0xd9, 0xe0, 0x2a, 0x20, 0x0a, 0x9f, 0xb2, 0xa0, 0x55, 0x26, 0x9d, 0x81, + 0x52, 0x19, 0x50, 0xd5, 0x85, 0xb6, 0x09, 0x44, 0x80, 0x5a, 0x06, 0x90, + 0x15, 0xb7, 0x6b, 0xe0, 0x5c, 0x9b, 0xb6, 0x5d, 0x09, 0xba, 0x0e, 0x06, + 0x7c, 0x65, 0x00, 0x59, 0x97, 0xbe, 0x35, 0xcc, 0x63, 0x96, 0x06, 0xba, + 0x15, 0xd4, 0xe3, 0x22, 0x82, 0x7d, 0x30, 0xf9, 0x0d, 0x88, 0x6b, 0x5d, + 0x0c, 0xec, 0x35, 0x8c, 0x8a, 0xf9, 0x68, 0x9f, 0xcf, 0x4c, 0x62, 0x53, + 0x18, 0x71, 0xad, 0xbe, 0x86, 0x92, 0x9b, 0x15, 0xb4, 0x57, 0x50, 0xbf, + 0x6b, 0x91, 0xe1, 0xee, 0xcf, 0xdc, 0xcd, 0xa1, 0xef, 0x0d, 0x1e, 0xc3, + 0x33, 0xbf, 0x5b, 0xd9, 0x91, 0x34, 0x5b, 0xf5, 0x10, 0x4c, 0x1a, 0x7f, + 0xcf, 0x2e, 0x14, 0x50, 0x2b, 0x33, 0x92, 0x23, 0x33, 0x02, 0xdd, 0x15, + 0x19, 0x8c, 0xef, 0x0b, 0xa7, 0x8b, 0x94, 0x19, 0x90, 0x6d, 0x05, 0xd7, + 0xf2, 0x41, 0xe4, 0x0b, 0xd0, 0x6a, 0x43, 0x3e, 0x07, 0x1a, 0xa9, 0xb5, + 0x7d, 0x7d, 0x85, 0xd2, 0xce, 0x5d, 0x7c, 0xf1, 0xfd, 0x82, 0x43, 0x4f, + 0x1d, 0x09, 0x26, 0x3d, 0x69, 0x39, 0x5b, 0x11, 0xa2, 0x4d, 0xe9, 0xfa, + 0x3b, 0x07, 0x37, 0x86, 0x6c, 0x23, 0x35, 0x1c, 0x6b, 0xff, 0x43, 0xf7, + 0xd2, 0x6e, 0x49, 0x55, 0xf6, 0x4a, 0x13, 0xa1, 0x27, 0x53, 0x6a, 0x15, + 0xc6, 0x28, 0x39, 0x5d, 0x32, 0x6e, 0x8e, 0xbb, 0xbf, 0x70, 0x37, 0x00, + 0x99, 0x11, 0xa1, 0xea, 0xdb, 0x69, 0x23, 0x45, 0x8e, 0xed, 0x13, 0x15, + 0x32, 0x6e, 0x8e, 0xf6, 0xe8, 0x24, 0x1c, 0xab, 0x31, 0x39, 0x52, 0xa6, + 0x74, 0xd3, 0x6e, 0xfe, 0xf3, 0x4d, 0x92, 0xe9, 0xe3, 0x1a, 0x10, 0x86, + 0x82, 0x76, 0x95, 0x37, 0x54, 0x90, 0xd7, 0xdb, 0xf7, 0x52, 0xd5, 0x06, + 0x34, 0x5a, 0x34, 0x5b, 0x75, 0x5c, 0x51, 0x40, 0x08, 0x55, 0x8f, 0x02, + 0x50, 0x7f, 0xd6, 0xbc, 0x30, 0x80, 0xb9, 0x67, 0x6b, 0x8c, 0x5f, 0x59, + 0xee, 0x0b, 0x92, 0x34, 0x6a, 0xae, 0xd4, 0x03, 0xa8, 0x53, 0x3f, 0x60, + 0x54, 0x69, 0xbd, 0x82, 0xea, 0x8d, 0x57, 0xd4, 0x73, 0x89, 0x0d, 0xa2, + 0x5a, 0x38, 0x3e, 0x47, 0x61, 0xa4, 0x14, 0x80, 0xb4, 0x6c, 0x2d, 0x1c, + 0x57, 0xb0, 0xae, 0xad, 0xef, 0x1c, 0xef, 0x89, 0x13, 0xa2, 0xc0, 0xb5, + 0xb7, 0x7e, 0x82, 0xeb, 0xaf, 0x8a, 0x4e, 0x4e, 0x73, 0xfa, 0x7f, 0xbc, + 0xc4, 0xc3, 0x07, 0x1e, 0xe1, 0x96, 0x3d, 0x37, 0xf3, 0xf0, 0x81, 0xf0, + 0xbd, 0xc1, 0x95, 0x95, 0x9f, 0xe1, 0xc9, 0xff, 0x9e, 0x6c, 0xdf, 0x86, + 0x60, 0x49, 0xd9, 0xa4, 0xbe, 0xdc, 0x0c, 0xea, 0x6c, 0x96, 0x01, 0xfc, + 0x4b, 0x7f, 0xc7, 0xb3, 0x70, 0x7c, 0x2e, 0xa8, 0x57, 0x21, 0x5f, 0x60, + 0xe1, 0xf8, 0x5c, 0x0f, 0x50, 0xcb, 0xd8, 0x12, 0xa2, 0x10, 0x40, 0xc3, + 0x92, 0x60, 0x5d, 0x71, 0x09, 0x51, 0x60, 0xeb, 0x3b, 0xc7, 0x13, 0xe1, + 0x5d, 0xa6, 0xbd, 0x20, 0xda, 0x5e, 0x9d, 0x1f, 0xb7, 0x79, 0xdb, 0xc5, + 0x25, 0x5e, 0x3c, 0xfb, 0x34, 0x6f, 0x7d, 0xcb, 0x65, 0x00, 0xbc, 0xed, + 0xe2, 0x12, 0x3f, 0x7e, 0xb9, 0x1e, 0x84, 0x6d, 0x99, 0xf8, 0x9f, 0xfc, + 0xc3, 0xe9, 0x20, 0xfd, 0x08, 0x6f, 0xe9, 0x5b, 0xa7, 0x54, 0xa9, 0x52, + 0xa5, 0x4a, 0x95, 0x2a, 0x55, 0xaa, 0x54, 0xa9, 0x52, 0xa5, 0x4a, 0x95, + 0x2a, 0x55, 0xaa, 0x54, 0xa9, 0x52, 0xa5, 0x4a, 0x95, 0x2a, 0x55, 0xaa, + 0x54, 0xa9, 0x52, 0xa5, 0x4a, 0xb5, 0xba, 0x5e, 0x27, 0x97, 0xc7, 0x54, + 0xa9, 0x52, 0xa5, 0x4a, 0x95, 0x2a, 0xd5, 0x85, 0x90, 0x01, 0x9d, 0x34, + 0x97, 0xed, 0x19, 0x0f, 0x93, 0x81, 0x56, 0xf6, 0x07, 0xdc, 0xf1, 0xf0, + 0xaa, 0x80, 0xa9, 0x21, 0x21, 0x42, 0x6b, 0xd5, 0x6a, 0xf0, 0xad, 0x41, + 0xf5, 0x5a, 0x6b, 0x39, 0x49, 0xe1, 0x61, 0xd3, 0xe6, 0xb2, 0x39, 0x5a, + 0x84, 0xb0, 0x1d, 0x91, 0x15, 0xbd, 0x1e, 0xce, 0xac, 0xed, 0x23, 0x76, + 0xf3, 0xa1, 0xa3, 0xd0, 0x68, 0x2c, 0xcf, 0x97, 0xda, 0xa9, 0x57, 0x7d, + 0x30, 0x1e, 0xcc, 0x34, 0x8c, 0xfa, 0xb0, 0x5b, 0xe7, 0xea, 0xb1, 0x21, + 0x3b, 0xea, 0xe3, 0x52, 0x11, 0x80, 0xb5, 0xb4, 0x55, 0xe1, 0x82, 0xec, + 0xea, 0x72, 0x04, 0x39, 0x5f, 0x7b, 0x15, 0x3a, 0x92, 0xdf, 0x7a, 0xe0, + 0x60, 0xe8, 0x40, 0xec, 0x29, 0xef, 0x3d, 0x03, 0xc6, 0x82, 0x10, 0x46, + 0x21, 0x7c, 0x28, 0xb9, 0x82, 0xda, 0xc9, 0xa6, 0xf2, 0x92, 0x6d, 0xb5, + 0xb9, 0xf5, 0xfe, 0x83, 0x0a, 0x46, 0xa5, 0x3f, 0xcf, 0x2e, 0x6f, 0x2a, + 0x50, 0x5d, 0xd2, 0x1f, 0x0e, 0x6a, 0xb0, 0x55, 0xd3, 0x10, 0x9e, 0x34, + 0xac, 0x0b, 0x88, 0x96, 0xa9, 0x1a, 0x4b, 0x17, 0xa2, 0xbe, 0x3a, 0x97, + 0x48, 0xda, 0x7e, 0x37, 0x02, 0xca, 0x1a, 0xa4, 0x00, 0xbc, 0xa5, 0x67, + 0x6a, 0x6e, 0x4a, 0xa9, 0x40, 0x5e, 0xfa, 0x4b, 0xf6, 0x02, 0xd0, 0x74, + 0x05, 0x99, 0x4e, 0x2f, 0x48, 0xac, 0x20, 0x04, 0x4d, 0x57, 0x50, 0x5d, + 0x6a, 0xd2, 0xa6, 0x4d, 0xc1, 0x2d, 0x20, 0x3a, 0x50, 0x32, 0xb3, 0x3d, + 0xe7, 0x73, 0x78, 0xad, 0x36, 0x6e, 0x3e, 0x17, 0x82, 0xc0, 0x62, 0x6d, + 0x33, 0x0c, 0xb0, 0xc3, 0x38, 0x50, 0x09, 0x5f, 0x04, 0x1f, 0xc1, 0xbb, + 0xd9, 0xe8, 0x8c, 0xbe, 0x49, 0xaa, 0xfb, 0x82, 0x32, 0x32, 0x02, 0x4a, + 0x33, 0xee, 0xa0, 0xc6, 0xe9, 0xa0, 0xee, 0x5b, 0xed, 0xe3, 0x87, 0xe9, + 0x5a, 0x6b, 0x70, 0x46, 0x6e, 0x49, 0x89, 0xf0, 0x51, 0x75, 0xb2, 0x01, + 0x5e, 0x09, 0xc0, 0xaa, 0x78, 0xdc, 0x30, 0x50, 0xab, 0x73, 0x01, 0x5f, + 0xdd, 0xf1, 0xc9, 0x3b, 0x00, 0xa8, 0x37, 0xea, 0xcc, 0xcd, 0x2c, 0x5c, + 0xb0, 0xba, 0xf4, 0xd3, 0xf9, 0xc2, 0xb4, 0x8c, 0x92, 0x60, 0x5a, 0x06, + 0x9a, 0x95, 0x11, 0x19, 0x32, 0x16, 0xd0, 0xce, 0x40, 0xb3, 0x80, 0xc8, + 0x07, 0xcf, 0xed, 0x95, 0x76, 0x5f, 0xa0, 0x96, 0xc8, 0x8a, 0x08, 0x34, + 0x0b, 0x48, 0x0c, 0x27, 0xc1, 0xb4, 0x4c, 0x38, 0x28, 0xb3, 0xcf, 0xf5, + 0x70, 0x58, 0xa0, 0x56, 0xbf, 0xb0, 0x3b, 0xe2, 0x52, 0x6f, 0xd4, 0x69, + 0xf5, 0x71, 0x25, 0xea, 0x07, 0xdc, 0xb2, 0x3f, 0xac, 0xb7, 0xdb, 0x24, + 0xa9, 0x0d, 0xe2, 0x75, 0x6e, 0x79, 0x1e, 0x22, 0x2b, 0x22, 0x76, 0x8d, + 0x9d, 0xa4, 0xeb, 0x71, 0xd2, 0xbd, 0xac, 0x27, 0x6e, 0x95, 0x8f, 0xd0, + 0x47, 0xad, 0xa5, 0x01, 0x45, 0xfd, 0x23, 0xf0, 0x66, 0x7a, 0x41, 0x57, + 0x49, 0x79, 0x0d, 0x7c, 0xca, 0x86, 0x68, 0xd9, 0xd0, 0x29, 0x1b, 0x6c, + 0x35, 0x08, 0xdc, 0x45, 0x2c, 0x5d, 0xbf, 0x75, 0x33, 0xcf, 0xba, 0x6d, + 0x3b, 0x0e, 0xe2, 0x3a, 0x5f, 0xc5, 0xeb, 0xd4, 0xcf, 0xae, 0x49, 0x37, + 0x8a, 0xf2, 0x43, 0xbc, 0x17, 0x05, 0x00, 0xbb, 0x50, 0x1a, 0xdd, 0xb0, + 0x01, 0x3e, 0xfa, 0x51, 0xae, 0xfe, 0xea, 0x57, 0x83, 0xb8, 0xaf, 0x43, + 0x04, 0xa8, 0x75, 0x2e, 0xba, 0xe1, 0x29, 0x05, 0xd6, 0x32, 0x12, 0x42, + 0x70, 0xcd, 0x91, 0x10, 0xe4, 0x94, 0x74, 0xdd, 0xfd, 0x1a, 0x70, 0x97, + 0x0e, 0xc7, 0x7f, 0x75, 0x71, 0x00, 0xd4, 0x5a, 0xc1, 0x59, 0x2d, 0x5f, + 0x5d, 0xf1, 0x5d, 0x2b, 0x9f, 0xb0, 0xfe, 0x92, 0x24, 0xe8, 0x4d, 0x3b, + 0x6c, 0x8f, 0x65, 0x0e, 0xa0, 0x01, 0xbb, 0x8a, 0x1a, 0xa8, 0x75, 0x75, + 0x89, 0x87, 0xbe, 0x5b, 0x63, 0xef, 0x6f, 0x94, 0xb9, 0xe6, 0xc9, 0x3a, + 0x4f, 0xe4, 0x25, 0x87, 0x1a, 0x61, 0xfa, 0x05, 0x1f, 0xb6, 0xbe, 0x0e, + 0x23, 0x4d, 0x8f, 0xe8, 0xe3, 0x70, 0xb3, 0x03, 0x7b, 0x51, 0x8e, 0x6e, + 0x07, 0x51, 0x6e, 0xd0, 0xab, 0x23, 0x7a, 0x94, 0xaa, 0x67, 0x25, 0x53, + 0x4e, 0x86, 0xd9, 0xac, 0x84, 0x23, 0x73, 0x14, 0x4a, 0x05, 0x05, 0xd4, + 0x6a, 0x86, 0xf7, 0x88, 0xea, 0x0b, 0x27, 0x28, 0x01, 0x87, 0x10, 0x94, + 0x97, 0x94, 0x23, 0x4b, 0xf9, 0x78, 0x8d, 0x79, 0xa2, 0x4e, 0x48, 0xf3, + 0x4f, 0x2f, 0x50, 0x02, 0x6a, 0x57, 0x8c, 0x43, 0x4d, 0xa5, 0x33, 0xd0, + 0xad, 0xa9, 0x9d, 0x92, 0xe9, 0x9a, 0xe0, 0x88, 0x3b, 0x4d, 0xfe, 0x3a, + 0x89, 0xbc, 0xdc, 0x05, 0x1e, 0x02, 0xc0, 0x2d, 0x78, 0x78, 0xe4, 0x61, + 0x8b, 0xfa, 0xad, 0xbd, 0x63, 0xf3, 0x35, 0x3d, 0xf5, 0x34, 0x97, 0xc1, + 0xed, 0xdb, 0xd5, 0x32, 0x00, 0x6a, 0x25, 0x68, 0xf6, 0x19, 0xd8, 0xff, + 0xef, 0xe1, 0x1e, 0x13, 0xd1, 0xa8, 0xc3, 0x73, 0xe7, 0x0f, 0x71, 0x72, + 0xdf, 0x73, 0x33, 0xde, 0x33, 0x31, 0x60, 0x56, 0x9f, 0xe3, 0x9e, 0x98, + 0xd6, 0xe8, 0x6f, 0x95, 0xc3, 0xc9, 0x83, 0x16, 0xd4, 0xe5, 0x56, 0xe9, + 0x29, 0xc0, 0xd6, 0xf7, 0xb4, 0x03, 0xcf, 0xfa, 0x12, 0x7c, 0x67, 0x1a, + 0xae, 0x9d, 0x52, 0xeb, 0x59, 0x01, 0x27, 0x6b, 0xe7, 0xbf, 0x1f, 0x7d, + 0x80, 0x5a, 0x95, 0x6d, 0x82, 0xea, 0x73, 0xc9, 0x67, 0x88, 0xdd, 0x97, + 0x75, 0xb3, 0x12, 0xaf, 0xf3, 0xea, 0xa3, 0x3a, 0xa6, 0xae, 0xdd, 0xc5, + 0xf4, 0x77, 0x0e, 0x5d, 0x18, 0x63, 0xeb, 0x55, 0x1b, 0x1a, 0x67, 0xb0, + 0x08, 0x70, 0x61, 0x79, 0x9a, 0xad, 0xee, 0x58, 0xdf, 0xac, 0x0b, 0xde, + 0x7c, 0x90, 0xbf, 0xaf, 0xe2, 0x36, 0x5c, 0xdd, 0xe7, 0xf1, 0xda, 0xc9, + 0x36, 0xb4, 0x63, 0x6d, 0xf0, 0x5c, 0xb5, 0x3c, 0x4d, 0x39, 0x1b, 0xe6, + 0xf7, 0x12, 0xa8, 0x5b, 0xcd, 0x4e, 0x4d, 0xd9, 0xf0, 0x17, 0x06, 0xd7, + 0xe5, 0x02, 0x29, 0x0e, 0x64, 0x91, 0xb1, 0x65, 0x52, 0x9a, 0xa4, 0xfc, + 0x12, 0x68, 0xf3, 0x26, 0xd6, 0xf1, 0x26, 0xdc, 0x8b, 0xd5, 0x36, 0xef, + 0x65, 0x70, 0x78, 0xb9, 0x6f, 0x3e, 0x5b, 0x36, 0x48, 0xeb, 0xea, 0xab, + 0xaf, 0xe6, 0xc9, 0x27, 0x9f, 0xec, 0xbb, 0xde, 0x0f, 0xb0, 0x75, 0x21, + 0xf7, 0x65, 0x2d, 0x7a, 0xb5, 0xdd, 0xbc, 0x33, 0x62, 0x3b, 0x95, 0x67, + 0xa7, 0xa9, 0xbe, 0x4f, 0x01, 0xb5, 0xee, 0x6c, 0xd5, 0xd9, 0xff, 0x95, + 0x9b, 0xb9, 0xeb, 0x63, 0x8f, 0x30, 0x79, 0x63, 0x2e, 0x70, 0x56, 0x17, + 0xc2, 0x45, 0x4a, 0xaf, 0x07, 0x22, 0x25, 0x7d, 0x75, 0x6e, 0x7b, 0xbe, + 0x87, 0xe7, 0x41, 0x69, 0xa4, 0x88, 0xf4, 0x25, 0x6d, 0xcf, 0xc3, 0x75, + 0x54, 0xda, 0xcc, 0x25, 0x6e, 0xcf, 0xd8, 0x84, 0x81, 0x47, 0x75, 0x3b, + 0x6d, 0x32, 0xd9, 0x1c, 0x5d, 0x0d, 0x03, 0x36, 0xe1, 0x38, 0x5c, 0xca, + 0xc8, 0x94, 0x6f, 0xea, 0xd2, 0x96, 0x75, 0x5c, 0xdf, 0x72, 0x9e, 0x8b, + 0xd1, 0xd4, 0x72, 0x42, 0x50, 0xa9, 0x54, 0xa8, 0x2f, 0xb5, 0x82, 0x3c, + 0xf6, 0x7e, 0xd8, 0x71, 0xb7, 0x7d, 0x78, 0x2f, 0x0f, 0xfd, 0xa7, 0xc7, + 0x7a, 0xf6, 0x73, 0xb5, 0x7c, 0x49, 0xed, 0x63, 0x87, 0xcd, 0xb6, 0x23, + 0xdf, 0x38, 0x48, 0x6e, 0x24, 0x47, 0x6e, 0x24, 0x47, 0xad, 0x56, 0x27, + 0xbf, 0xce, 0x55, 0x8e, 0xe8, 0xda, 0x11, 0xdc, 0xcd, 0xb9, 0xcc, 0x55, + 0x6b, 0x54, 0x36, 0xe4, 0x23, 0x60, 0xb1, 0x5a, 0xa3, 0x6d, 0xd5, 0x45, + 0x46, 0xc6, 0xa0, 0x84, 0x10, 0x94, 0x0a, 0x50, 0xaf, 0xbf, 0xf6, 0x40, + 0x80, 0x75, 0xd9, 0x8b, 0x56, 0x4d, 0x73, 0x21, 0x61, 0x57, 0x83, 0xf4, + 0x46, 0xaa, 0x0b, 0xac, 0x5e, 0x9f, 0xb3, 0x9d, 0x57, 0x38, 0xae, 0xc3, + 0xef, 0x04, 0x7e, 0x44, 0x14, 0xa8, 0x85, 0x8e, 0x7b, 0xad, 0x54, 0x12, + 0xe0, 0x09, 0x98, 0x14, 0x30, 0xeb, 0xc1, 0x66, 0xa0, 0x2b, 0x40, 0x74, + 0xd4, 0x35, 0x68, 0x1e, 0x18, 0x63, 0x38, 0xd0, 0x54, 0x81, 0x75, 0x34, + 0x39, 0xfb, 0x6a, 0x57, 0x19, 0x50, 0xe7, 0x4d, 0x46, 0xaa, 0xba, 0xca, + 0x8e, 0x72, 0xbb, 0x35, 0x68, 0x1c, 0x75, 0xbd, 0x15, 0x54, 0x91, 0x98, + 0x3b, 0xa7, 0xa9, 0xf7, 0xb8, 0x00, 0xcf, 0x82, 0x41, 0xd8, 0xaa, 0xa2, + 0x00, 0xbf, 0xf1, 0x7d, 0xbc, 0x90, 0x90, 0xad, 0x24, 0xdb, 0xe6, 0x8f, + 0xac, 0x06, 0x54, 0xe8, 0xba, 0xfd, 0xdc, 0x05, 0x28, 0x6f, 0x2d, 0xb2, + 0xef, 0x61, 0x99, 0x0b, 0xf0, 0x4c, 0xd2, 0x0f, 0x60, 0x35, 0x85, 0x06, + 0x6a, 0x69, 0x8d, 0x7f, 0xbe, 0xc5, 0xdc, 0xef, 0x2b, 0x48, 0xca, 0xd6, + 0x8a, 0xba, 0xfe, 0xcd, 0x39, 0x73, 0x54, 0x8e, 0x43, 0x69, 0x7d, 0x81, + 0x1b, 0x2e, 0xe9, 0x72, 0xd7, 0x31, 0x05, 0xb2, 0xa8, 0xfe, 0x86, 0x0b, + 0xc7, 0xa4, 0x5a, 0xb6, 0x7a, 0xaf, 0x7d, 0x9f, 0x7d, 0xd2, 0xe3, 0x11, + 0x6d, 0x5b, 0x5a, 0x08, 0x0e, 0xcf, 0x53, 0x2d, 0x9f, 0xd4, 0x8f, 0x33, + 0x71, 0x76, 0xfc, 0x5a, 0xc0, 0x58, 0x6d, 0xdf, 0x8d, 0x80, 0xb5, 0x72, + 0x8e, 0x17, 0xcd, 0xdf, 0xa9, 0x43, 0xb6, 0x14, 0x5d, 0x87, 0x68, 0xdc, + 0x90, 0x3a, 0xc2, 0xd7, 0x40, 0x16, 0x29, 0xae, 0x2f, 0x27, 0x8e, 0xad, + 0x1b, 0x49, 0xbf, 0x8d, 0x70, 0xcc, 0xbd, 0xb4, 0x61, 0x6d, 0x69, 0x00, + 0x45, 0x3c, 0x59, 0xc7, 0xf5, 0x5c, 0x5c, 0x51, 0xc2, 0x93, 0x75, 0x0a, + 0xf9, 0x29, 0x65, 0xcf, 0x1a, 0x73, 0xf2, 0x64, 0x0b, 0x57, 0xe4, 0xf1, + 0x3a, 0x56, 0x38, 0xd2, 0xe4, 0x05, 0xda, 0x2b, 0x4d, 0x5c, 0xa7, 0x80, + 0xe7, 0x37, 0x69, 0xaf, 0xe4, 0x95, 0xbd, 0xce, 0x1d, 0xb1, 0xda, 0xdc, + 0xa5, 0xca, 0xf4, 0x3d, 0x5c, 0x27, 0x0f, 0x8e, 0x50, 0xf7, 0x3e, 0x74, + 0x1f, 0x02, 0x19, 0x4c, 0xb8, 0x21, 0x51, 0xeb, 0x2e, 0x6a, 0x2c, 0x58, + 0xfa, 0x49, 0x3d, 0xab, 0xa6, 0xb5, 0x8c, 0xb7, 0x61, 0x01, 0xcf, 0x6f, + 0x29, 0xb0, 0x16, 0x05, 0xda, 0x2b, 0x6d, 0xbd, 0x8f, 0x58, 0xe1, 0x3a, + 0xa5, 0xe2, 0x94, 0xea, 0xbb, 0x74, 0x5c, 0xa2, 0x50, 0x2d, 0x05, 0xd9, + 0x32, 0xfb, 0x5b, 0x95, 0xd3, 0x54, 0x1c, 0x85, 0xfd, 0xae, 0xfa, 0x21, + 0x5c, 0x0b, 0x63, 0xdb, 0x29, 0xe0, 0x51, 0x27, 0x49, 0x9e, 0xf4, 0x28, + 0xe4, 0xd5, 0x71, 0xf2, 0xa4, 0x87, 0x2b, 0x0a, 0xb1, 0xf6, 0x4b, 0x56, + 0x83, 0x10, 0xa6, 0x65, 0x60, 0x4d, 0xc1, 0xb6, 0x86, 0x02, 0x65, 0x41, + 0x14, 0xb8, 0x55, 0x04, 0x1a, 0x45, 0x05, 0x81, 0x32, 0xeb, 0x06, 0xba, + 0xd5, 0xb0, 0xd2, 0xd9, 0x9a, 0xd0, 0xc6, 0x8f, 0x1a, 0x9a, 0x16, 0x0a, + 0xc0, 0x75, 0xd7, 0x26, 0x5d, 0x89, 0xb5, 0x02, 0xb5, 0x8c, 0xfa, 0x81, + 0xb5, 0xac, 0xb8, 0x7b, 0x2d, 0xdb, 0xd7, 0xa1, 0x80, 0x5a, 0x00, 0xeb, + 0x27, 0xe0, 0xf7, 0xf6, 0xab, 0xf0, 0x1f, 0xea, 0xed, 0x36, 0x48, 0xcb, + 0xd6, 0xbd, 0x12, 0xfe, 0xef, 0x1d, 0xb0, 0xeb, 0x6a, 0xcb, 0xd6, 0x75, + 0xd1, 0x34, 0xb7, 0x0f, 0xa8, 0xe6, 0x93, 0x56, 0xda, 0x3d, 0x7b, 0xd4, + 0xf2, 0x2e, 0x17, 0x9e, 0x06, 0xae, 0xf2, 0x60, 0xdf, 0xe3, 0x8d, 0x80, + 0x42, 0xd6, 0x68, 0xa8, 0xf6, 0x3a, 0x5a, 0x6c, 0x04, 0xa7, 0x53, 0xc3, + 0x64, 0x6e, 0x28, 0xe8, 0x96, 0xad, 0x06, 0xbd, 0xc7, 0xee, 0xd5, 0x92, + 0x94, 0x12, 0xae, 0x28, 0xc3, 0x0b, 0xc9, 0x70, 0xb8, 0x61, 0xf2, 0xf7, + 0xbc, 0xef, 0x5b, 0x2b, 0x68, 0xca, 0x97, 0xc1, 0xbb, 0xb8, 0xc4, 0xf7, + 0x95, 0x71, 0x88, 0x91, 0x4a, 0x09, 0x80, 0xe7, 0xb5, 0xac, 0x3e, 0xb3, + 0xe9, 0xe3, 0x82, 0x10, 0x99, 0xbe, 0x13, 0x1f, 0x79, 0x5e, 0x2b, 0x48, + 0xdf, 0x4f, 0xa6, 0x9f, 0x9c, 0x34, 0xb9, 0xc5, 0xeb, 0x2d, 0xe9, 0x2b, + 0xd8, 0x57, 0x50, 0x1f, 0x07, 0x6e, 0xd5, 0xc0, 0xaa, 0xea, 0x7f, 0xf4, + 0x82, 0x3e, 0xc7, 0x67, 0xa4, 0x24, 0x0f, 0xb4, 0x04, 0xe4, 0x1c, 0x11, + 0xc0, 0x9e, 0x22, 0x10, 0xab, 0x18, 0xe4, 0x2a, 0x2e, 0x1b, 0xae, 0x55, + 0x76, 0x5d, 0x9a, 0xfa, 0xdd, 0x58, 0x4d, 0x8f, 0xe7, 0xe7, 0xa5, 0xa4, + 0xa9, 0xc7, 0xf2, 0x0b, 0x52, 0xd2, 0x34, 0xf0, 0x63, 0x5f, 0x81, 0x4b, + 0xcd, 0x73, 0x0a, 0x10, 0x1c, 0xe3, 0xca, 0x95, 0x82, 0xf9, 0x6a, 0xd8, + 0x96, 0x89, 0x60, 0x2d, 0xad, 0x8a, 0x03, 0x35, 0x0b, 0x9c, 0x98, 0x71, + 0x0c, 0x36, 0x4b, 0xbf, 0xa7, 0x88, 0xe5, 0x11, 0x08, 0xa4, 0x23, 0x7b, + 0xa0, 0x61, 0x12, 0xa9, 0x26, 0x55, 0xb2, 0x65, 0xbd, 0x67, 0x1c, 0x47, + 0x32, 0xa7, 0xb7, 0xe7, 0x1c, 0x55, 0x77, 0xf5, 0x9a, 0x53, 0x3d, 0x85, + 0x77, 0xe9, 0x92, 0xd1, 0xe0, 0xa0, 0x88, 0x6d, 0x1f, 0xc6, 0x7c, 0xd5, + 0xff, 0x03, 0xc8, 0x8b, 0x10, 0xaa, 0x35, 0x0e, 0x54, 0x75, 0x3b, 0x10, + 0x83, 0x7a, 0x0d, 0xd2, 0x7f, 0xbd, 0xe8, 0xad, 0x5c, 0xfe, 0xca, 0xcb, + 0xaf, 0xd9, 0xd2, 0x00, 0xb4, 0x26, 0xb7, 0x5d, 0xc6, 0xe9, 0xd3, 0xa7, + 0x01, 0xd8, 0x58, 0x20, 0x00, 0x56, 0x19, 0x18, 0x15, 0xc0, 0xa6, 0x6d, + 0x57, 0xf6, 0x00, 0xac, 0x8c, 0x2e, 0x7d, 0xeb, 0xba, 0x00, 0x4c, 0x75, + 0xe6, 0x27, 0xaa, 0x2f, 0x3f, 0x39, 0x39, 0xc9, 0xe9, 0xd3, 0xa7, 0x39, + 0x75, 0xea, 0x14, 0x93, 0x93, 0x93, 0xcc, 0xce, 0xce, 0xbe, 0x2a, 0x36, + 0x0d, 0x64, 0xeb, 0xcc, 0xd9, 0xb3, 0x5c, 0xca, 0x99, 0x1e, 0x9b, 0x10, + 0x82, 0xb8, 0xcc, 0x3e, 0x9e, 0x6d, 0x9e, 0x09, 0x60, 0x58, 0x66, 0xff, + 0x67, 0x67, 0x67, 0x99, 0x9c, 0x9c, 0x64, 0x9d, 0xb6, 0x7f, 0xe9, 0x5b, + 0xd7, 0xb1, 0x69, 0xdb, 0x95, 0x01, 0x44, 0x6b, 0xd3, 0xb6, 0x2b, 0x03, + 0x70, 0x96, 0xc9, 0x6b, 0x40, 0x5c, 0xf6, 0x3e, 0x99, 0x36, 0x25, 0x01, + 0xc8, 0xbe, 0x9a, 0x5a, 0x9e, 0x17, 0x80, 0xb5, 0x12, 0xa5, 0x7f, 0xf3, + 0x7b, 0xaf, 0xdd, 0xcd, 0xa1, 0xef, 0xa8, 0x11, 0xf7, 0xea, 0x62, 0x95, + 0xc2, 0x48, 0xf2, 0xf8, 0x87, 0x51, 0xf0, 0x6e, 0xcf, 0x11, 0xe0, 0x67, + 0xc2, 0x77, 0x72, 0x22, 0x9a, 0xaf, 0xdd, 0x92, 0xe4, 0xf2, 0xfa, 0x5c, + 0x91, 0x6d, 0x10, 0x39, 0xa4, 0x9f, 0x09, 0xd2, 0x2a, 0x10, 0x5d, 0x97, + 0x4c, 0x47, 0x8d, 0xfd, 0xb7, 0x8e, 0x37, 0x29, 0x5d, 0x55, 0x00, 0x47, + 0x30, 0xbf, 0x52, 0x63, 0x52, 0xe4, 0x38, 0x34, 0xa3, 0xea, 0x55, 0x6b, + 0x36, 0x28, 0x64, 0x85, 0x1a, 0x47, 0xb6, 0x86, 0x17, 0x03, 0x7b, 0x56, + 0x19, 0xc8, 0x76, 0xb0, 0x5e, 0xba, 0xf1, 0x96, 0x10, 0xa8, 0xe5, 0x67, + 0x10, 0x23, 0x05, 0xd0, 0xef, 0x7c, 0x85, 0xfe, 0x06, 0x43, 0x6d, 0xd7, + 0xb6, 0x56, 0xa2, 0xfb, 0x32, 0x7f, 0xb4, 0x46, 0xe5, 0x3d, 0x5b, 0x83, + 0x22, 0x66, 0x57, 0x6a, 0x6c, 0xf7, 0xe1, 0xc8, 0xb2, 0x4a, 0xd7, 0x3a, + 0xde, 0xa4, 0xf0, 0x9e, 0x02, 0xe3, 0x57, 0xaa, 0xfe, 0x59, 0xd8, 0x80, + 0xca, 0x12, 0x00, 0x00, 0x20, 0x00, 0x49, 0x44, 0x41, 0x54, 0xa5, 0x5c, + 0xa1, 0xb6, 0x58, 0x45, 0xfa, 0xca, 0x9e, 0x34, 0xcf, 0x07, 0x4e, 0xf4, + 0x38, 0x34, 0x81, 0xf1, 0x2b, 0xcb, 0xcc, 0x3d, 0x5b, 0x03, 0x09, 0x53, + 0x3b, 0xc7, 0xa8, 0x1f, 0x6b, 0x31, 0xbe, 0xbd, 0xb4, 0xea, 0xf9, 0x5d, + 0x18, 0x29, 0x05, 0x70, 0x2d, 0x03, 0x8b, 0x32, 0x30, 0x2a, 0x50, 0x50, + 0x28, 0x23, 0x03, 0x87, 0x2a, 0xe4, 0x0b, 0xcc, 0x3d, 0xf7, 0x98, 0x2a, + 0x7b, 0x45, 0xd9, 0x30, 0xe0, 0x2a, 0x15, 0x57, 0x0f, 0x40, 0x5b, 0x06, + 0x7e, 0x65, 0x64, 0xca, 0x11, 0xa2, 0xc0, 0xb7, 0x9f, 0x7e, 0x9e, 0xdb, + 0x6f, 0xd8, 0xc1, 0xe9, 0xff, 0xf1, 0x52, 0x24, 0xcd, 0xc3, 0x07, 0x1e, + 0xe1, 0xb2, 0x5f, 0xb8, 0x24, 0x12, 0xf7, 0xaf, 0xff, 0xd5, 0x25, 0xdc, + 0xfb, 0x58, 0xb4, 0x13, 0x66, 0xdb, 0xb2, 0x97, 0x76, 0xf9, 0xf1, 0x7a, + 0x99, 0x7d, 0x36, 0xf5, 0x32, 0x71, 0x40, 0xa2, 0x2d, 0x5b, 0x26, 0x6d, + 0xd2, 0x36, 0x1b, 0xa6, 0x55, 0x2a, 0x28, 0x6c, 0x9b, 0x0d, 0xf2, 0x0a, + 0x61, 0x5c, 0xbd, 0xf5, 0x02, 0x02, 0xa0, 0x96, 0x01, 0x65, 0xd9, 0xe0, + 0xac, 0x24, 0xc5, 0x41, 0x5b, 0xa9, 0x52, 0xa5, 0x4a, 0x95, 0x2a, 0x55, + 0xaa, 0x54, 0xa9, 0x52, 0xa5, 0x4a, 0x95, 0x2a, 0x55, 0xaa, 0x54, 0xa9, + 0x52, 0xa5, 0x4a, 0x95, 0x2a, 0x55, 0xaa, 0x54, 0xa9, 0x52, 0xa5, 0x4a, + 0x95, 0xea, 0xfc, 0xe4, 0x9c, 0xeb, 0x37, 0x85, 0xa9, 0x52, 0xa5, 0x4a, + 0x95, 0x2a, 0x55, 0xaa, 0x73, 0xd7, 0xbc, 0x5e, 0x76, 0x99, 0x23, 0xd3, + 0xe3, 0x3c, 0x31, 0x58, 0xd2, 0x0f, 0x1d, 0x35, 0xe2, 0x12, 0x42, 0xe0, + 0x79, 0xde, 0x39, 0x81, 0xa8, 0xce, 0x07, 0x60, 0x65, 0x3b, 0x46, 0x9e, + 0xab, 0xe2, 0xe5, 0xaf, 0xd5, 0x96, 0x94, 0x52, 0x7f, 0xd0, 0x3d, 0xdc, + 0x3e, 0x24, 0xa5, 0x5d, 0x2d, 0xbf, 0xe7, 0x79, 0xb8, 0xae, 0x4b, 0x6b, + 0xb9, 0x35, 0x10, 0x4d, 0xaa, 0x8e, 0xeb, 0x78, 0x34, 0xf2, 0x77, 0xea, + 0xf0, 0x45, 0x0d, 0x82, 0x4a, 0x80, 0xb6, 0x04, 0x40, 0x2d, 0xf3, 0xbf, + 0x75, 0x8c, 0x15, 0x64, 0x4a, 0x85, 0x7a, 0xdc, 0x9c, 0x85, 0x15, 0x1d, + 0x2c, 0x15, 0x58, 0x2a, 0xe3, 0x64, 0x42, 0x20, 0x8f, 0x86, 0x6b, 0x49, + 0xe9, 0x81, 0x23, 0x79, 0xf0, 0x43, 0xb7, 0xb0, 0xf9, 0x13, 0x77, 0x32, + 0xbe, 0x65, 0xab, 0x82, 0x4c, 0xe9, 0xf6, 0x9e, 0x3b, 0xb6, 0xc0, 0x89, + 0x2f, 0xed, 0xe7, 0xd6, 0xfb, 0x0f, 0xf2, 0xe0, 0x47, 0x76, 0x03, 0x70, + 0xeb, 0xa3, 0x87, 0x98, 0x7b, 0x56, 0x7d, 0x7c, 0x38, 0x7e, 0xe5, 0x38, + 0x5e, 0xab, 0xcd, 0x83, 0x37, 0xed, 0xe2, 0xd6, 0xfb, 0x0f, 0x52, 0xa3, + 0xcd, 0x42, 0x4d, 0x39, 0xb5, 0x6f, 0x2d, 0x6f, 0x45, 0x08, 0xe5, 0x48, + 0x67, 0x7f, 0x6a, 0xb8, 0xf9, 0x13, 0x77, 0xc2, 0x03, 0x07, 0x69, 0xca, + 0x76, 0x08, 0xc3, 0x32, 0x0e, 0x80, 0x06, 0x80, 0x03, 0xe4, 0x44, 0x86, + 0xb6, 0x4e, 0xd3, 0x03, 0xe0, 0x8a, 0xfd, 0x36, 0x85, 0x43, 0x10, 0x67, + 0xc0, 0x62, 0x4d, 0x0d, 0x08, 0xb3, 0xd3, 0xbb, 0x59, 0x37, 0x04, 0x8f, + 0x39, 0xaa, 0xa0, 0x26, 0x6a, 0xbb, 0xc8, 0x2a, 0xe8, 0x96, 0x69, 0xa3, + 0xa6, 0xa9, 0x8f, 0x86, 0x84, 0x09, 0x0b, 0xa8, 0x65, 0xf2, 0xc7, 0x3f, + 0x94, 0xe7, 0x77, 0xea, 0x70, 0x34, 0xfa, 0xe1, 0xaf, 0x39, 0xaf, 0xcb, + 0x42, 0xe0, 0xf9, 0x21, 0xac, 0x0a, 0x42, 0xa0, 0x96, 0xf9, 0x48, 0xdf, + 0xeb, 0x48, 0x5c, 0xeb, 0xf7, 0xa0, 0xd6, 0x8b, 0x60, 0x41, 0x9e, 0x4a, + 0xba, 0xde, 0x64, 0xd5, 0x87, 0xc2, 0x6e, 0x36, 0x6f, 0xa5, 0x6f, 0x05, + 0x3f, 0x09, 0x3b, 0x7e, 0x35, 0xb9, 0xd9, 0x3c, 0x79, 0x5a, 0xb4, 0xa4, + 0x69, 0x7f, 0xf5, 0xe3, 0xe9, 0x67, 0xc3, 0xeb, 0xb4, 0xac, 0x6d, 0x19, + 0x54, 0x4d, 0xc2, 0x8f, 0x8f, 0xa5, 0xd3, 0xeb, 0x9a, 0x99, 0xcf, 0xab, + 0x8f, 0x4a, 0x5b, 0xad, 0xfe, 0x4e, 0x31, 0xae, 0xeb, 0xb2, 0x7d, 0x62, + 0x3b, 0x47, 0x8e, 0x1e, 0x61, 0xea, 0xda, 0x29, 0x6a, 0x27, 0x6b, 0x94, + 0x8a, 0xe6, 0x83, 0xd3, 0x12, 0xe5, 0xf5, 0xe1, 0xf5, 0xb1, 0xf6, 0x5c, + 0x3d, 0xa1, 0x2e, 0xa1, 0xa4, 0x76, 0x00, 0x8c, 0x5f, 0x1f, 0x07, 0xb5, + 0x8b, 0xf9, 0x58, 0xb8, 0xab, 0xe1, 0x6b, 0xad, 0x95, 0x64, 0x47, 0x32, + 0x18, 0x7c, 0x5e, 0x0b, 0x21, 0x02, 0x70, 0x96, 0x0d, 0xd0, 0x32, 0xe1, + 0xd5, 0x66, 0x0b, 0x86, 0x64, 0xd8, 0x96, 0x71, 0xa0, 0x09, 0xf6, 0xc5, + 0x82, 0x63, 0xad, 0x35, 0xbc, 0x9a, 0x06, 0x81, 0x17, 0xd7, 0x14, 0x8e, + 0xcf, 0x32, 0x6d, 0x29, 0x0e, 0xd4, 0x32, 0xb2, 0xd3, 0x0f, 0x13, 0xb6, + 0xcb, 0x1a, 0x64, 0x77, 0x50, 0xde, 0x41, 0xf1, 0x49, 0xe7, 0x35, 0xb7, + 0x2d, 0xc2, 0xfe, 0x68, 0xdc, 0x30, 0x20, 0xa9, 0xb8, 0x0c, 0xdc, 0xca, + 0xfc, 0x41, 0x14, 0xb0, 0x15, 0xb7, 0x1d, 0x07, 0x56, 0xc5, 0xe3, 0xed, + 0xe5, 0xd7, 0x13, 0xd2, 0xd8, 0xcb, 0x51, 0x7a, 0xc1, 0x5d, 0x49, 0xf6, + 0xe2, 0x75, 0xb5, 0xf3, 0x25, 0xd5, 0x47, 0xfd, 0x8d, 0xb2, 0xa4, 0x73, + 0xc7, 0xed, 0xc4, 0xcb, 0x89, 0xc3, 0xbd, 0x2e, 0xa4, 0x46, 0x37, 0x6c, + 0x08, 0xda, 0xe1, 0xeb, 0xc0, 0x2b, 0x3b, 0x77, 0x0e, 0x06, 0x6a, 0xdd, + 0xb6, 0x08, 0x7f, 0xf1, 0x2f, 0xa2, 0x71, 0x4f, 0xd5, 0x21, 0x17, 0x5e, + 0x7b, 0xe4, 0xa7, 0xde, 0xcd, 0x0d, 0x5f, 0x78, 0x9e, 0x27, 0xee, 0x78, + 0xb7, 0xba, 0xfa, 0xfd, 0xf5, 0xf7, 0x91, 0x77, 0xbc, 0x63, 0xd5, 0xba, + 0x0c, 0x3a, 0xeb, 0xef, 0xf0, 0xe1, 0x9e, 0xd8, 0xfd, 0x24, 0xb8, 0x4f, + 0x9d, 0xa3, 0xdd, 0x9f, 0x1f, 0x02, 0x5b, 0xd2, 0xf2, 0xe1, 0x17, 0x1d, + 0x39, 0x64, 0x4f, 0x29, 0xd4, 0xae, 0xa2, 0x0e, 0x68, 0xa0, 0x16, 0x10, + 0x80, 0xb5, 0x38, 0x5e, 0x63, 0x57, 0x91, 0x08, 0x58, 0x6b, 0xad, 0xca, + 0x3b, 0xaa, 0x6e, 0x71, 0x40, 0x99, 0x89, 0x8f, 0x87, 0xcf, 0x49, 0x4f, + 0xd5, 0xe1, 0x92, 0x58, 0x9f, 0xfb, 0xd8, 0x09, 0x75, 0xac, 0xaf, 0x30, + 0x8e, 0x2e, 0x0b, 0x70, 0x65, 0x99, 0x71, 0x4f, 0x3b, 0xca, 0xb4, 0x1a, + 0xd4, 0xb2, 0xc0, 0xf1, 0x18, 0xbc, 0xe7, 0xba, 0x5d, 0xec, 0x32, 0xe1, + 0x95, 0x2a, 0xe2, 0x3d, 0x25, 0x78, 0x26, 0x01, 0x51, 0x70, 0xd3, 0x5e, + 0xca, 0x26, 0xfc, 0x62, 0x2d, 0x70, 0x72, 0x9b, 0x1a, 0x83, 0xee, 0x88, + 0x07, 0x23, 0x66, 0x63, 0x8b, 0x8c, 0x13, 0x82, 0x86, 0x36, 0x03, 0xf5, + 0x93, 0xd3, 0xcc, 0x2f, 0xbf, 0x83, 0xed, 0x5f, 0x81, 0x4c, 0xe8, 0xd7, + 0x02, 0xff, 0x18, 0xa6, 0xfb, 0xe4, 0xc9, 0x69, 0x6e, 0x93, 0xb7, 0xc2, + 0xff, 0xcf, 0xde, 0xfb, 0x87, 0xc9, 0x51, 0xdc, 0xf7, 0xba, 0xaf, 0x4d, + 0x1b, 0x6a, 0xe2, 0x59, 0xe8, 0x89, 0x57, 0xf6, 0x8c, 0x7e, 0x24, 0x33, + 0xce, 0xca, 0xd2, 0xc8, 0x10, 0x33, 0x7b, 0xe0, 0x01, 0x6d, 0xc0, 0x47, + 0x5a, 0xe3, 0x27, 0xd2, 0x62, 0x9f, 0x07, 0x8b, 0xc8, 0x4f, 0x10, 0x76, + 0x1e, 0x0c, 0x38, 0x37, 0xb6, 0x64, 0x1f, 0xc7, 0x92, 0xef, 0xbd, 0x09, + 0xe8, 0x1c, 0xfb, 0x80, 0x93, 0xe7, 0x9e, 0x88, 0x3c, 0x4e, 0xae, 0x30, + 0x3e, 0x31, 0xc2, 0x3c, 0xc7, 0x91, 0x94, 0x27, 0x04, 0x99, 0x7b, 0x63, + 0x0b, 0x9d, 0x6b, 0x65, 0xa5, 0x13, 0x9c, 0x5d, 0xfc, 0xe0, 0xec, 0xe2, + 0x00, 0x1a, 0x09, 0xed, 0xf1, 0x4c, 0xa2, 0x45, 0x33, 0x0e, 0x6b, 0x4f, + 0xc3, 0x8e, 0x33, 0x05, 0x6e, 0x2e, 0xf7, 0x8f, 0xaa, 0xea, 0xae, 0xee, + 0xe9, 0xd9, 0x9d, 0x15, 0x02, 0x3b, 0xe7, 0xf6, 0x67, 0x9f, 0xd9, 0xae, + 0xae, 0xae, 0xfa, 0x76, 0xfd, 0xe8, 0xae, 0xae, 0xae, 0xee, 0x7a, 0xfb, + 0x8b, 0xc0, 0x95, 0xe1, 0x64, 0x9d, 0xe9, 0x33, 0xba, 0xad, 0x6a, 0xaa, + 0x09, 0x41, 0xef, 0x9b, 0x83, 0x5b, 0xd7, 0xdf, 0xc3, 0x03, 0x7f, 0xad, + 0x6b, 0xfe, 0xe3, 0x3d, 0x40, 0x92, 0x5f, 0xed, 0xbf, 0x1f, 0x11, 0x87, + 0x64, 0x2d, 0xff, 0xa5, 0x91, 0x1e, 0x21, 0xbb, 0xc3, 0x06, 0xda, 0xa7, + 0xd0, 0x73, 0xf7, 0x8b, 0x1e, 0xd7, 0x2a, 0x03, 0xd6, 0x7a, 0x4a, 0xf7, + 0x23, 0xfe, 0xfa, 0x30, 0x5c, 0x56, 0x86, 0x62, 0x09, 0x8e, 0x8d, 0xf7, + 0x4e, 0xdc, 0x53, 0x27, 0xba, 0xeb, 0xfa, 0x93, 0x35, 0xb8, 0xcb, 0x2a, + 0xc8, 0x1e, 0xf7, 0x52, 0x40, 0x5f, 0x40, 0x2d, 0xe0, 0x0d, 0x01, 0x6a, + 0x01, 0xe7, 0x0f, 0xa8, 0xa5, 0x65, 0x43, 0x17, 0x44, 0xd6, 0x8d, 0x82, + 0xb5, 0xce, 0xa7, 0xdc, 0x5c, 0xd4, 0xed, 0xc5, 0x20, 0x68, 0xd9, 0x98, + 0x3b, 0x01, 0xaa, 0xe0, 0x6a, 0x10, 0x5d, 0x12, 0x5c, 0x0b, 0x48, 0xbc, + 0x5e, 0xff, 0xfa, 0x69, 0xf8, 0xdf, 0x16, 0x9e, 0xcb, 0xb7, 0x24, 0x99, + 0x5a, 0x5e, 0xac, 0x85, 0x4d, 0x82, 0x51, 0xd9, 0xd0, 0xaa, 0x4e, 0x0c, + 0xa8, 0x65, 0xe4, 0x73, 0x61, 0x4f, 0xb0, 0x16, 0xc0, 0x3c, 0xaf, 0x90, + 0x5d, 0xf6, 0x8b, 0x74, 0x9e, 0x0f, 0x27, 0x9f, 0x99, 0x49, 0x98, 0xbd, + 0xd6, 0xb3, 0xcb, 0x7e, 0x91, 0xf9, 0xe7, 0x7f, 0x4c, 0xbc, 0x18, 0xe2, + 0x79, 0x79, 0xf9, 0x02, 0x87, 0xcc, 0x5b, 0x2e, 0xe4, 0xed, 0x03, 0xbf, + 0x40, 0xe3, 0xf9, 0xb9, 0xbe, 0xf3, 0xd2, 0xcb, 0xde, 0xeb, 0x79, 0x46, + 0xfc, 0xfa, 0x69, 0x18, 0x8f, 0x5d, 0xae, 0xcd, 0xf5, 0xfa, 0xf0, 0x11, + 0x0f, 0x17, 0x89, 0xf8, 0xce, 0x38, 0x3b, 0x18, 0x05, 0x60, 0xd7, 0x17, + 0x1a, 0x08, 0xe0, 0xd0, 0x43, 0x65, 0xd0, 0xc7, 0xd1, 0xb6, 0x8f, 0x56, + 0x23, 0xa0, 0x29, 0x73, 0x4e, 0xbb, 0x59, 0xc1, 0xe4, 0x53, 0x75, 0xd6, + 0x5f, 0x56, 0xa4, 0x19, 0x6b, 0xca, 0x3d, 0xdf, 0xa3, 0x40, 0x9e, 0xce, + 0xf3, 0x1e, 0x42, 0xf7, 0xab, 0xe3, 0xb0, 0x2c, 0x1b, 0x1e, 0x05, 0x70, + 0xeb, 0x47, 0xb7, 0xf1, 0xc0, 0xd7, 0x0f, 0x44, 0xc2, 0xc4, 0x41, 0x5e, + 0xb6, 0xdf, 0xe8, 0xfa, 0xf5, 0x8c, 0x4f, 0x4e, 0x52, 0x1a, 0xca, 0xeb, + 0x74, 0x75, 0x90, 0x64, 0xc8, 0x64, 0x73, 0xea, 0x3e, 0xd5, 0x71, 0x19, + 0x9f, 0x9c, 0xa4, 0xb0, 0xaa, 0xa4, 0xef, 0x1b, 0x35, 0x90, 0xd6, 0x8f, + 0xda, 0x11, 0xc2, 0x65, 0xdf, 0xd7, 0x1f, 0x4e, 0xdc, 0x9f, 0x1d, 0xa6, + 0x1f, 0xbf, 0xa4, 0xed, 0x71, 0x48, 0x57, 0x4b, 0xca, 0xc8, 0x69, 0x0e, + 0xe0, 0xb5, 0x3c, 0x46, 0xd7, 0xaf, 0x47, 0x4a, 0x2f, 0x02, 0x19, 0x73, + 0x05, 0xd4, 0x6a, 0x55, 0x5c, 0xca, 0xb8, 0x83, 0x51, 0x50, 0x6e, 0xb3, + 0x01, 0xb5, 0xb9, 0x26, 0x77, 0x7d, 0xf6, 0x93, 0x1c, 0xbe, 0x75, 0x22, + 0xf1, 0x7a, 0x7d, 0xbe, 0xcf, 0x6b, 0xa3, 0x1f, 0x2d, 0x02, 0xa9, 0x7a, + 0x5b, 0x1f, 0xa0, 0xab, 0xf3, 0xa5, 0xc5, 0xd2, 0x02, 0x70, 0xe1, 0xa2, + 0x21, 0xce, 0x9f, 0xfa, 0x29, 0x1b, 0x03, 0xf9, 0x7a, 0x1a, 0xf8, 0x6d, + 0x20, 0xde, 0xbb, 0x78, 0x01, 0x78, 0x27, 0x0a, 0xb6, 0x95, 0x34, 0x45, + 0x34, 0xf1, 0xbc, 0x4e, 0xb8, 0xe7, 0xea, 0x47, 0x52, 0xc3, 0x6d, 0xc6, + 0x3d, 0x3d, 0x16, 0x35, 0x27, 0x98, 0x44, 0x06, 0x50, 0x87, 0x31, 0xa2, + 0x08, 0x9b, 0x85, 0xd4, 0xb8, 0x0a, 0xf8, 0xee, 0x92, 0x93, 0xd0, 0x97, + 0x0a, 0xae, 0x02, 0xd1, 0xdb, 0xea, 0x58, 0xfd, 0x8b, 0xc8, 0x96, 0xac, + 0x8b, 0x90, 0x1e, 0x3b, 0x05, 0x8c, 0x5b, 0x1b, 0x3c, 0x54, 0x7e, 0xcd, + 0xc4, 0xe9, 0xfd, 0x73, 0x70, 0xb3, 0x0b, 0xa3, 0x59, 0xd8, 0xdf, 0x46, + 0x8f, 0x1e, 0xaa, 0x08, 0x01, 0xe8, 0x0a, 0x95, 0xef, 0xf3, 0x01, 0xd4, + 0x0a, 0xf2, 0x62, 0xd9, 0x36, 0xcb, 0xfd, 0xc0, 0x88, 0x01, 0x41, 0x00, + 0xfb, 0xe6, 0x04, 0x9f, 0xce, 0x92, 0x7c, 0xcf, 0x65, 0x8d, 0x91, 0x9e, + 0xab, 0xce, 0x37, 0x40, 0x2b, 0x49, 0x76, 0x3f, 0x69, 0xcf, 0x7f, 0xde, + 0xc3, 0xae, 0xff, 0x75, 0x57, 0xf7, 0xb6, 0x27, 0x55, 0x2f, 0xdf, 0xc0, + 0xb4, 0x00, 0xc6, 0xff, 0x40, 0xc0, 0x4a, 0x05, 0xd4, 0x1a, 0x5e, 0xa5, + 0x6b, 0xeb, 0x88, 0x07, 0x9b, 0x5c, 0x4a, 0xdf, 0xf4, 0xa8, 0x7d, 0x20, + 0x6c, 0x53, 0x27, 0xdb, 0xe3, 0x54, 0xc4, 0x7a, 0x64, 0xdb, 0x43, 0x64, + 0x5d, 0x3d, 0x36, 0xd9, 0xbb, 0x7f, 0x96, 0xb4, 0xcd, 0xf6, 0x5b, 0x0a, + 0x4c, 0xcb, 0x96, 0x89, 0xd7, 0x05, 0xd4, 0x82, 0x64, 0xa0, 0x96, 0x71, + 0xdb, 0xdb, 0x12, 0xfa, 0x66, 0xa3, 0xa7, 0xa1, 0xab, 0x53, 0x02, 0x48, + 0xcf, 0x43, 0x1d, 0x3d, 0xc9, 0x79, 0x15, 0x4e, 0x0e, 0xe9, 0xc7, 0x21, + 0xba, 0x45, 0x6c, 0xc0, 0x56, 0xc6, 0x2d, 0x50, 0xaf, 0xab, 0xf2, 0xef, + 0x78, 0x2d, 0x6d, 0x6f, 0x3a, 0xd8, 0xae, 0x20, 0x5a, 0x4d, 0xa0, 0x60, + 0xb9, 0x15, 0x74, 0xca, 0x28, 0x37, 0x18, 0xda, 0xb0, 0xdd, 0xd1, 0x23, + 0x6c, 0x0f, 0x10, 0xd6, 0xbd, 0x01, 0x5c, 0x4b, 0x5f, 0xe8, 0x6f, 0x45, + 0x68, 0x88, 0x0a, 0x80, 0x2f, 0x34, 0xac, 0x53, 0x8d, 0x07, 0x2b, 0xe8, + 0x56, 0x92, 0xe2, 0xa3, 0xe7, 0xe8, 0xb4, 0xa1, 0x80, 0x5a, 0xbe, 0x6a, + 0x55, 0x73, 0xf9, 0x02, 0xf5, 0x99, 0x49, 0xed, 0xce, 0x05, 0xee, 0xd6, + 0x5c, 0x0b, 0x4f, 0xd6, 0x50, 0x67, 0xdb, 0x27, 0x51, 0x68, 0x6f, 0x82, + 0xbc, 0xb9, 0x22, 0x8f, 0xe7, 0xab, 0x3d, 0x4f, 0xfb, 0x61, 0x99, 0xd8, + 0x0a, 0xf2, 0xab, 0xf3, 0x23, 0xf2, 0x65, 0xa4, 0x35, 0x86, 0xeb, 0x0a, + 0x97, 0x8e, 0xd7, 0x00, 0x3f, 0x87, 0x9b, 0x75, 0xf1, 0x64, 0x98, 0x93, + 0xd1, 0xd3, 0x70, 0x78, 0x59, 0xcc, 0xa0, 0x6e, 0xc3, 0x8b, 0x44, 0x31, + 0x68, 0x1b, 0x8a, 0x6a, 0x79, 0x5c, 0xaf, 0xd7, 0xeb, 0x70, 0xbc, 0xae, + 0x96, 0x46, 0x0f, 0x16, 0x15, 0x50, 0xeb, 0x38, 0x21, 0x58, 0xab, 0x5e, + 0xd7, 0x70, 0x2d, 0x08, 0xe1, 0x50, 0xc6, 0x8d, 0x82, 0x69, 0x6d, 0x28, + 0x16, 0x15, 0x2c, 0x8a, 0x7a, 0x60, 0xef, 0xba, 0x23, 0x70, 0xf4, 0x33, + 0x89, 0x59, 0xee, 0x2d, 0xc3, 0x6f, 0xd8, 0x64, 0x2d, 0x63, 0x60, 0xad, + 0x23, 0x9a, 0x70, 0x35, 0x33, 0xa3, 0x60, 0x57, 0x33, 0x43, 0xe1, 0x38, + 0xd8, 0x57, 0x76, 0xa9, 0x11, 0xae, 0x23, 0x16, 0x38, 0xfe, 0x33, 0x3a, + 0x0d, 0xdf, 0xdc, 0xa5, 0xc2, 0x6d, 0x9a, 0x19, 0xe2, 0xc8, 0xd0, 0x4c, + 0x30, 0x7e, 0xf6, 0x08, 0xb0, 0x63, 0xd7, 0x0e, 0xbe, 0x72, 0x69, 0xb8, + 0xa3, 0x70, 0x5c, 0x6d, 0x08, 0x66, 0x66, 0x38, 0x62, 0x0d, 0x9c, 0x6d, + 0x5a, 0x64, 0xe0, 0xf1, 0x23, 0x9e, 0x4a, 0xf3, 0xf1, 0xab, 0xeb, 0x9a, + 0x88, 0x55, 0x67, 0xc3, 0x06, 0x38, 0xfe, 0x60, 0x08, 0x20, 0xa3, 0x18, + 0x96, 0x7b, 0x71, 0x83, 0x5a, 0x26, 0x41, 0xcb, 0x8a, 0x1b, 0x94, 0xff, + 0xaf, 0x16, 0xe9, 0x6b, 0xdc, 0x6c, 0x31, 0xd9, 0x40, 0x55, 0x1b, 0x12, + 0x65, 0xe4, 0xba, 0x2e, 0x5e, 0xec, 0xd9, 0xe2, 0x6b, 0x79, 0xd6, 0xb8, + 0x60, 0xbc, 0x04, 0x4a, 0x70, 0x71, 0x30, 0x4f, 0xdd, 0x06, 0x60, 0x39, + 0x42, 0x81, 0xb6, 0x12, 0x60, 0x5a, 0x76, 0xcb, 0x20, 0x10, 0x78, 0x01, + 0x44, 0x4b, 0x20, 0x51, 0xcf, 0x79, 0xa4, 0x2f, 0x69, 0x36, 0x7b, 0x3f, + 0x63, 0x08, 0xee, 0xc9, 0x17, 0x1b, 0xcf, 0x4e, 0x82, 0x7b, 0x2d, 0x12, + 0xe7, 0x35, 0x29, 0xa1, 0x1f, 0x1e, 0x7f, 0x7e, 0x2d, 0xcd, 0xfe, 0x83, + 0x32, 0x42, 0x41, 0x9e, 0xf4, 0xb2, 0xe2, 0xc3, 0x76, 0x21, 0xb8, 0x1d, + 0x05, 0x96, 0x9a, 0x76, 0x60, 0xa7, 0x03, 0xf7, 0x9a, 0xf8, 0xf1, 0xeb, + 0xb5, 0xaf, 0x60, 0xa0, 0xf8, 0x30, 0x99, 0x70, 0x2d, 0x77, 0x91, 0x7a, + 0x2c, 0x50, 0x81, 0x0a, 0x47, 0x51, 0xfb, 0xda, 0xa7, 0x2b, 0x71, 0xda, + 0x3c, 0x43, 0xf1, 0x25, 0x0d, 0x6b, 0xac, 0xa3, 0x13, 0xb4, 0xd3, 0x96, + 0x31, 0x9d, 0xc6, 0xc9, 0x69, 0xd9, 0x05, 0xd1, 0xb2, 0xdd, 0xf6, 0xb6, + 0x69, 0x44, 0x98, 0x67, 0x01, 0x10, 0x7e, 0x50, 0x05, 0x60, 0x18, 0xa8, + 0xfa, 0x3d, 0xc6, 0x0b, 0x1c, 0x91, 0x08, 0xa5, 0x36, 0x87, 0xbe, 0x5d, + 0xbd, 0x13, 0xbe, 0x7e, 0x3e, 0xe7, 0x40, 0x19, 0xc1, 0x84, 0x8c, 0x9e, + 0x23, 0x19, 0xeb, 0x39, 0x5c, 0x3c, 0xed, 0x93, 0x8e, 0xba, 0xa2, 0xb4, + 0x1c, 0xa8, 0x4a, 0x19, 0x7c, 0x30, 0x64, 0xc2, 0xe4, 0x19, 0x5d, 0x6f, + 0xbe, 0x3e, 0xf6, 0xfc, 0x56, 0xe2, 0x73, 0x2e, 0x8f, 0x09, 0xb2, 0xac, + 0x66, 0xd5, 0xab, 0x6a, 0x7c, 0xe2, 0x8d, 0x5a, 0x2e, 0xbf, 0x78, 0x00, + 0x20, 0x00, 0x47, 0x19, 0x19, 0xff, 0x53, 0xcf, 0x9e, 0x82, 0x57, 0xd5, + 0xba, 0x09, 0x63, 0xc0, 0x57, 0x06, 0x48, 0x65, 0xe0, 0x52, 0x6b, 0xd6, + 0xac, 0x61, 0xc5, 0x8a, 0x15, 0x9c, 0x1d, 0x1f, 0x0f, 0x00, 0x56, 0xf3, + 0x8d, 0xb3, 0x41, 0xdc, 0xd7, 0xcb, 0xe6, 0x40, 0x61, 0x79, 0x60, 0xf3, + 0xec, 0x8b, 0xf3, 0x60, 0xe5, 0x65, 0xed, 0x15, 0x57, 0x06, 0xb0, 0x2c, + 0x1b, 0xb4, 0x65, 0xfc, 0x0d, 0x14, 0xeb, 0xa4, 0x65, 0xd3, 0xe4, 0x7f, + 0xa0, 0xb0, 0x9c, 0xf1, 0x63, 0xe3, 0x5d, 0x69, 0x35, 0xd0, 0x2e, 0x93, + 0xee, 0x53, 0xa7, 0x4e, 0xb1, 0xa6, 0x10, 0xe6, 0x61, 0x39, 0x21, 0xcc, + 0xcb, 0x63, 0x02, 0x37, 0xfe, 0x4c, 0x53, 0xb7, 0xe1, 0xb9, 0x41, 0x05, + 0x17, 0x35, 0xb2, 0x1f, 0xc1, 0x37, 0xe6, 0xbc, 0xf0, 0x18, 0xd5, 0xe7, + 0xfb, 0x42, 0x1f, 0x8b, 0x6a, 0xcc, 0x59, 0x7d, 0x36, 0x0d, 0x97, 0xca, + 0xe5, 0x05, 0x9d, 0x39, 0x09, 0x4e, 0x87, 0x72, 0x69, 0x84, 0x5c, 0xb6, + 0xc0, 0xc4, 0xe3, 0xe3, 0xa8, 0xb3, 0xc2, 0x05, 0x91, 0x0b, 0xc0, 0x55, + 0xa0, 0x80, 0x52, 0xc2, 0xe9, 0xd0, 0x6a, 0xaa, 0xb8, 0x99, 0xc1, 0x02, + 0x2d, 0x0b, 0x40, 0x6b, 0xc2, 0xaa, 0xf0, 0x1e, 0x5e, 0xdb, 0x43, 0x08, + 0xc8, 0x0c, 0x0a, 0xb8, 0x66, 0x8c, 0x3b, 0x86, 0x46, 0x03, 0x20, 0x57, + 0xb9, 0x50, 0xa4, 0xda, 0xa8, 0xd3, 0x68, 0x4b, 0xec, 0xb3, 0x30, 0x00, + 0x65, 0x19, 0xe0, 0x9e, 0x81, 0x7a, 0x09, 0xf5, 0x4e, 0x42, 0x66, 0x50, + 0xa8, 0x3e, 0xa5, 0x1f, 0xa6, 0x27, 0x28, 0x4b, 0x0d, 0x58, 0x8a, 0xa6, + 0x57, 0x6d, 0xcb, 0x0c, 0x8a, 0x00, 0x86, 0xb5, 0xfd, 0xe3, 0xb7, 0x31, + 0xf1, 0x94, 0xea, 0x7b, 0x15, 0x3e, 0xb4, 0x9d, 0x3b, 0x3e, 0x64, 0xda, + 0x22, 0x03, 0x34, 0x97, 0xba, 0xcc, 0x1a, 0x4c, 0x7c, 0x7b, 0x9c, 0x9b, + 0x3f, 0x76, 0x33, 0x05, 0x99, 0xa7, 0x56, 0x6b, 0x06, 0x69, 0x1c, 0x29, + 0x96, 0x19, 0x7f, 0x32, 0x7c, 0x1e, 0x51, 0xad, 0x37, 0x19, 0x5b, 0xbf, + 0x11, 0xdc, 0x30, 0x2f, 0xde, 0x9c, 0xb2, 0x37, 0x71, 0xac, 0xaa, 0xda, + 0xd1, 0x58, 0x1b, 0xee, 0x31, 0xc1, 0x46, 0x36, 0x22, 0x65, 0x83, 0xda, + 0x6c, 0x83, 0xd2, 0xca, 0x11, 0x1a, 0x73, 0x35, 0x4a, 0x2b, 0x47, 0x82, + 0xe7, 0xe2, 0x06, 0xf8, 0x14, 0xc0, 0xa7, 0x9a, 0x8d, 0x00, 0x04, 0x65, + 0xfc, 0x42, 0x88, 0x55, 0xb4, 0xce, 0x0d, 0x5c, 0xaa, 0x90, 0x2f, 0x04, + 0x20, 0x2a, 0x1b, 0x42, 0x65, 0x83, 0xab, 0xf6, 0x3e, 0x7c, 0x24, 0xd8, + 0x26, 0x44, 0x81, 0x1d, 0x37, 0xaa, 0x0e, 0xd7, 0x73, 0x3f, 0x7c, 0x3e, + 0x00, 0x6b, 0x3d, 0xf7, 0xc3, 0xe7, 0xf9, 0x47, 0xef, 0xa2, 0x20, 0xbe, + 0x1d, 0xde, 0xb6, 0x95, 0x94, 0x26, 0x1b, 0xa4, 0xb5, 0x50, 0xba, 0x4c, + 0xfc, 0x24, 0x5b, 0x42, 0x14, 0x28, 0x0c, 0x96, 0xa8, 0xcd, 0x86, 0xf9, + 0x4e, 0x02, 0x8f, 0x99, 0x32, 0x9b, 0x98, 0x1e, 0x0f, 0xfc, 0x4c, 0x99, + 0x19, 0x3b, 0x06, 0xf8, 0x65, 0xca, 0xb0, 0x30, 0x58, 0x22, 0x7b, 0x49, + 0x0e, 0x5e, 0x48, 0x06, 0x65, 0x5d, 0x7c, 0xd1, 0x8a, 0xc0, 0x6d, 0x40, + 0x5b, 0x71, 0xb7, 0x51, 0xe2, 0x39, 0x9d, 0x2a, 0x55, 0xaa, 0x54, 0xa9, + 0x52, 0xa5, 0x4a, 0x95, 0x2a, 0x55, 0xaa, 0x54, 0xa9, 0x52, 0xa5, 0x4a, + 0x95, 0x2a, 0x55, 0xaa, 0x54, 0xa9, 0x52, 0xa5, 0x4a, 0x95, 0x2a, 0x55, + 0xaa, 0x54, 0xa9, 0xfa, 0x92, 0x93, 0xf4, 0xb1, 0xcd, 0x54, 0xa9, 0x52, + 0xa5, 0x4a, 0x95, 0x2a, 0xd5, 0x1b, 0xa0, 0xad, 0xe7, 0xcf, 0x54, 0x61, + 0x65, 0x01, 0xcf, 0x5b, 0x78, 0x42, 0x74, 0x2f, 0x68, 0xd6, 0x62, 0x2f, + 0xa7, 0xbf, 0x5e, 0x5f, 0x40, 0xee, 0x05, 0x06, 0x3b, 0x1f, 0x70, 0xad, + 0x85, 0xe0, 0x60, 0xb6, 0xbd, 0x7e, 0xc3, 0xb6, 0xda, 0xf1, 0x49, 0x3c, + 0x0b, 0xdb, 0x05, 0x54, 0xfd, 0xfe, 0xb6, 0x72, 0xae, 0xdb, 0x60, 0x4f, + 0x5e, 0xef, 0x35, 0x49, 0x39, 0x06, 0x8d, 0xb2, 0x57, 0x82, 0xb2, 0x52, + 0x2f, 0x80, 0xca, 0x38, 0x54, 0x42, 0x80, 0x6c, 0xab, 0x89, 0x3a, 0xd2, + 0xd1, 0xa0, 0x19, 0x5f, 0x7f, 0x19, 0x99, 0x28, 0x28, 0x4c, 0x08, 0x17, + 0xf3, 0x59, 0xf9, 0x13, 0x7f, 0xbc, 0x87, 0x89, 0xa7, 0xa6, 0xb8, 0xf1, + 0xca, 0x11, 0x90, 0x70, 0xff, 0x27, 0xb6, 0x29, 0xa0, 0xd6, 0xd7, 0x0e, + 0x80, 0x80, 0xdd, 0x07, 0x0f, 0xd1, 0xf0, 0x24, 0x05, 0x57, 0x30, 0x72, + 0xe5, 0x08, 0xf7, 0xdf, 0xb4, 0x05, 0x3c, 0xc9, 0xc3, 0xa7, 0x55, 0x9c, + 0xfb, 0x3f, 0xb1, 0x8d, 0x8f, 0x7c, 0xf5, 0x00, 0x37, 0x5e, 0x39, 0x42, + 0xad, 0xad, 0xbe, 0xcc, 0x7a, 0xff, 0xc7, 0xb6, 0x29, 0x58, 0xd7, 0x95, + 0xe1, 0x4b, 0x7d, 0x23, 0x57, 0x8e, 0x20, 0x7c, 0x14, 0x2c, 0xcb, 0x82, + 0x0b, 0xc9, 0xb6, 0x54, 0xe9, 0x73, 0x40, 0xf8, 0x2a, 0x95, 0x05, 0x35, + 0x0b, 0x01, 0xa4, 0x44, 0x66, 0x55, 0x1e, 0xe2, 0x5f, 0x76, 0x8e, 0x2b, + 0xb0, 0xe9, 0x49, 0xca, 0xc5, 0x02, 0xd5, 0x7a, 0x03, 0x37, 0x9f, 0xa3, + 0x71, 0xb2, 0x11, 0x7d, 0x51, 0x5f, 0x42, 0x79, 0xad, 0xda, 0x6e, 0xc0, + 0x5b, 0x71, 0x88, 0x5a, 0x3c, 0x7d, 0x81, 0xff, 0x02, 0x13, 0xf4, 0xd6, + 0x6d, 0x70, 0xe1, 0x98, 0x3e, 0xff, 0xac, 0xf3, 0x3a, 0xe7, 0x43, 0xcd, + 0x97, 0xb8, 0x91, 0xfa, 0x53, 0xea, 0xe8, 0x35, 0x0f, 0xc1, 0xfa, 0x48, + 0x02, 0x04, 0x5e, 0xbb, 0x49, 0x2e, 0x80, 0x9e, 0x58, 0xc0, 0x2d, 0xa9, + 0x26, 0x65, 0xc9, 0x76, 0x6c, 0xba, 0xaa, 0x06, 0x6e, 0x19, 0xd8, 0x94, + 0x17, 0xdb, 0x6e, 0xfc, 0xcc, 0xd2, 0x43, 0x40, 0xbb, 0x19, 0x81, 0x19, + 0x08, 0xdf, 0x1c, 0x16, 0x75, 0xbc, 0xf8, 0x57, 0xb3, 0x03, 0x65, 0xf0, + 0xda, 0xc9, 0x13, 0x42, 0x12, 0xdb, 0x96, 0x05, 0x5e, 0xb2, 0x36, 0x9a, + 0x7e, 0x7a, 0x9a, 0xca, 0xa5, 0x15, 0x36, 0x6e, 0xd8, 0xc8, 0xc4, 0x63, + 0x13, 0xe4, 0x96, 0x29, 0x40, 0x55, 0xeb, 0xf9, 0x16, 0xee, 0x4a, 0x1d, + 0xe6, 0xc9, 0x69, 0xa4, 0xd7, 0x6d, 0x2b, 0x9e, 0x4f, 0x61, 0xd1, 0xcb, + 0xec, 0xf6, 0xc5, 0xce, 0xbb, 0x5d, 0x3e, 0x85, 0xc1, 0x02, 0x2d, 0x3d, + 0x21, 0xcc, 0x6b, 0xf7, 0xf9, 0xad, 0xee, 0xad, 0xa8, 0xb9, 0x6a, 0x44, + 0xcf, 0x6b, 0x03, 0xcf, 0xea, 0xc8, 0x4e, 0xc4, 0x6d, 0x40, 0x59, 0xad, + 0xb9, 0x56, 0xa2, 0xdb, 0x00, 0xdd, 0x92, 0x14, 0x2f, 0x53, 0x6f, 0xce, + 0x0b, 0x20, 0x59, 0x4b, 0x75, 0xdb, 0x6d, 0x5d, 0x2f, 0xf7, 0x52, 0xb4, + 0x90, 0x8d, 0x78, 0xbd, 0x8b, 0xec, 0xe2, 0x93, 0xa0, 0xe2, 0xf6, 0x6c, + 0x7f, 0x88, 0x4e, 0xa4, 0x8a, 0xf8, 0xe9, 0x7d, 0x99, 0x32, 0x8c, 0x9c, + 0xb3, 0x3a, 0x4e, 0xaf, 0x49, 0x5b, 0x8b, 0x95, 0x83, 0x7d, 0x5e, 0x97, + 0xdf, 0x7b, 0x49, 0xe0, 0x9f, 0x34, 0x87, 0xed, 0x97, 0x63, 0xeb, 0xbd, + 0xe6, 0xb9, 0xcd, 0x24, 0xb8, 0x87, 0xe8, 0x9a, 0xa7, 0x97, 0x18, 0x36, + 0x09, 0x54, 0x15, 0x87, 0x66, 0xbd, 0x1a, 0x0b, 0x1f, 0xdf, 0x8f, 0x0d, + 0xb4, 0x4a, 0x4a, 0x47, 0x92, 0x92, 0xc0, 0x61, 0x76, 0x7a, 0x42, 0xf7, + 0x4c, 0xcf, 0x7c, 0xc7, 0xe3, 0xdb, 0xeb, 0x7b, 0xf7, 0xee, 0x65, 0x66, + 0x66, 0xb1, 0x98, 0x4a, 0x9b, 0xc7, 0xc6, 0x16, 0x0f, 0xa4, 0xf5, 0x15, + 0xe0, 0x59, 0xe0, 0xd3, 0x9b, 0x37, 0x2f, 0x1a, 0xb6, 0xfc, 0xde, 0x4b, + 0xd4, 0x0c, 0x7c, 0x60, 0xdd, 0xda, 0xee, 0xed, 0xdf, 0x9a, 0xf8, 0x7b, + 0xae, 0x1f, 0xf9, 0x37, 0xbc, 0xcf, 0x5c, 0x07, 0x86, 0xdf, 0xcd, 0xdf, + 0x4c, 0x3d, 0xc3, 0xfb, 0x86, 0x17, 0x06, 0x6b, 0x2d, 0x04, 0xb9, 0x8a, + 0x03, 0xb5, 0xa0, 0xfb, 0x3a, 0x63, 0x1f, 0x91, 0x9e, 0x1f, 0x4e, 0xdc, + 0xb5, 0xfd, 0x8c, 0xf2, 0xb1, 0x6d, 0xf1, 0xb0, 0x66, 0xdd, 0xc4, 0x59, + 0x4a, 0xcf, 0xea, 0xb0, 0x43, 0x08, 0x90, 0x3a, 0x1a, 0xbb, 0x06, 0x1c, + 0xad, 0x41, 0x3e, 0x0c, 0x07, 0x30, 0xbc, 0x84, 0x09, 0xed, 0x76, 0xba, + 0x6d, 0xf7, 0xb9, 0xc0, 0xb3, 0x6e, 0xb6, 0xe2, 0xef, 0x37, 0x6e, 0x1f, + 0x3e, 0x02, 0x6c, 0xd3, 0xab, 0xeb, 0xd6, 0xa2, 0xc8, 0x0f, 0xc0, 0xba, + 0xbc, 0xf5, 0x55, 0x7a, 0x60, 0xec, 0xeb, 0xfb, 0x60, 0xf3, 0xa8, 0x4e, + 0x4c, 0x01, 0x71, 0x9f, 0x9a, 0xf2, 0xb7, 0xe5, 0x53, 0x1b, 0xe1, 0xda, + 0x61, 0x0e, 0xcd, 0x4c, 0xb1, 0x05, 0x09, 0x37, 0xe8, 0xd2, 0xd8, 0x3a, + 0x02, 0xdf, 0x3c, 0x8c, 0x38, 0x59, 0x85, 0xf7, 0xdf, 0xc6, 0x36, 0x3d, + 0x1f, 0xe2, 0xc0, 0xc1, 0x87, 0xd9, 0x86, 0x07, 0x37, 0xdd, 0xa6, 0x3c, + 0x0e, 0xee, 0x0b, 0xf6, 0x71, 0xeb, 0xc7, 0xb6, 0xf3, 0xc0, 0xd7, 0xf6, + 0x73, 0x78, 0x12, 0xf6, 0x6c, 0x75, 0xd9, 0xf5, 0x94, 0xc7, 0x9e, 0xcb, + 0xcc, 0xb5, 0x24, 0xfc, 0xa2, 0xfb, 0xae, 0xa7, 0x3c, 0xaa, 0xf5, 0x22, + 0x87, 0x44, 0x93, 0x3d, 0x9b, 0x05, 0xbb, 0x67, 0x3c, 0xee, 0x1a, 0x72, + 0xc9, 0x65, 0xa3, 0xe1, 0xde, 0x79, 0x5c, 0xb0, 0xef, 0x21, 0x11, 0x02, + 0xb5, 0xd6, 0xee, 0x51, 0x10, 0x2a, 0xa3, 0x3c, 0xe0, 0xdd, 0x03, 0xb2, + 0xc3, 0x03, 0x7f, 0xda, 0x80, 0x0f, 0x96, 0x54, 0xfe, 0xe3, 0xf0, 0xac, + 0x7f, 0x1a, 0x87, 0xaf, 0x0e, 0xf3, 0x86, 0xeb, 0x43, 0x5b, 0xb8, 0x3f, + 0x56, 0xd7, 0xb7, 0xcb, 0x84, 0xfb, 0x99, 0x0f, 0x8e, 0x41, 0xbd, 0x06, + 0x33, 0x55, 0x78, 0xf4, 0x30, 0x6c, 0x5e, 0xbc, 0x2d, 0x58, 0x97, 0xcf, + 0x40, 0x53, 0x9f, 0xd7, 0xd6, 0xf5, 0x1a, 0xe8, 0x09, 0xd4, 0xaa, 0x5c, + 0x21, 0xfa, 0x06, 0x6a, 0x25, 0x69, 0xe4, 0xea, 0x1c, 0x13, 0x8f, 0xb7, + 0x82, 0x7e, 0x46, 0x1c, 0x82, 0xba, 0x14, 0xf8, 0x69, 0x2f, 0xdb, 0xaf, + 0x55, 0x36, 0x50, 0xcb, 0xf6, 0x93, 0xf1, 0x89, 0xb9, 0x6e, 0x8e, 0xa9, + 0xfa, 0xe1, 0x6e, 0x03, 0xb3, 0x09, 0x7e, 0x00, 0x2b, 0xa3, 0x75, 0x22, + 0x2c, 0xd2, 0x4e, 0x60, 0xd9, 0xcd, 0x85, 0x44, 0x81, 0x2c, 0xdd, 0xd2, + 0x7e, 0x19, 0x07, 0x3a, 0x3e, 0x64, 0x06, 0x7b, 0xa4, 0xc1, 0xa4, 0x23, + 0xaf, 0xca, 0xd3, 0xbe, 0x5e, 0x8f, 0x5e, 0x52, 0x4e, 0x0e, 0xff, 0x06, + 0xc9, 0x86, 0x51, 0xc5, 0x8f, 0xa4, 0x01, 0x2e, 0x60, 0x9e, 0x57, 0x70, + 0xb9, 0x00, 0xef, 0x65, 0x70, 0x2f, 0x84, 0x7f, 0xe6, 0x65, 0xde, 0xce, + 0x85, 0x3d, 0xc1, 0x5a, 0x3f, 0x5d, 0xb6, 0x8c, 0xcb, 0x87, 0x86, 0x78, + 0xeb, 0x5b, 0xdf, 0xca, 0xd1, 0xa3, 0x47, 0x03, 0xff, 0x6a, 0x35, 0x0a, + 0xac, 0x8d, 0xaf, 0xbf, 0xe7, 0x3d, 0xef, 0xe1, 0x27, 0x3f, 0xf9, 0x09, + 0x33, 0x33, 0x33, 0xbc, 0xc5, 0x82, 0x71, 0x19, 0xfd, 0xc2, 0xc5, 0x59, + 0xd6, 0xfe, 0xf2, 0x3b, 0x78, 0xe2, 0xd9, 0x59, 0x2e, 0xba, 0xf0, 0xcd, + 0xbc, 0xf0, 0x92, 0xe4, 0x95, 0x8b, 0x2e, 0x62, 0xe0, 0xa2, 0xb7, 0xf0, + 0x2f, 0x2f, 0xb6, 0x17, 0xcd, 0x0b, 0x8b, 0xf8, 0xbf, 0x5e, 0x1a, 0xbd, + 0xa4, 0xcc, 0x03, 0xfa, 0x18, 0xb2, 0xaf, 0xd7, 0x63, 0x9b, 0xa6, 0x99, + 0x38, 0x02, 0x95, 0x0d, 0x39, 0x32, 0x62, 0x9a, 0x89, 0x23, 0x1d, 0xf8, + 0x8f, 0x30, 0xba, 0x35, 0xc7, 0xa1, 0x87, 0x5c, 0xb6, 0x7d, 0xb4, 0x1b, + 0xf0, 0x2b, 0x1c, 0xd5, 0x27, 0xf4, 0xda, 0xea, 0x9e, 0xab, 0x5c, 0x52, + 0xc7, 0x53, 0x6d, 0xae, 0x4e, 0x69, 0xb0, 0x08, 0x40, 0xce, 0x75, 0x83, + 0x49, 0x8a, 0x10, 0x42, 0xb3, 0x3a, 0xed, 0x16, 0x99, 0x6c, 0x2e, 0x02, + 0x8d, 0x32, 0x7e, 0x40, 0x04, 0xa8, 0x15, 0x07, 0x51, 0x09, 0xe1, 0x2a, + 0xc8, 0xb5, 0xde, 0x66, 0xfc, 0x4a, 0xcb, 0x4a, 0x48, 0xe9, 0x51, 0x1a, + 0xca, 0x23, 0xa5, 0x47, 0x53, 0x4a, 0x3a, 0xed, 0x16, 0x9e, 0xa3, 0xae, + 0x55, 0x63, 0xd7, 0x56, 0x38, 0xfc, 0xd8, 0x34, 0x95, 0x62, 0xc5, 0xca, + 0x83, 0x9a, 0xd4, 0x6a, 0xdb, 0xb1, 0xf7, 0x33, 0x3e, 0x39, 0x89, 0xad, + 0x91, 0x4a, 0xb9, 0xe7, 0xfe, 0x17, 0x4b, 0x9f, 0xed, 0xc7, 0xca, 0x31, + 0x84, 0x6e, 0x0b, 0x04, 0x19, 0x3d, 0x11, 0x15, 0xf0, 0x3b, 0xb8, 0x39, + 0x97, 0x5a, 0xbd, 0x46, 0xa9, 0x58, 0x0a, 0xec, 0x4e, 0x4f, 0x4f, 0xd3, + 0x92, 0x92, 0xca, 0x65, 0xe5, 0x48, 0xb9, 0xd5, 0xe7, 0xa0, 0xd1, 0x50, + 0xe5, 0xbd, 0xfe, 0xb2, 0x22, 0x9e, 0x1b, 0x5e, 0x97, 0xd7, 0xad, 0x05, + 0x4e, 0x2a, 0xf7, 0xcf, 0xfa, 0xbc, 0x4e, 0xd5, 0x9f, 0x4e, 0xe9, 0xa5, + 0xb9, 0x6b, 0x7a, 0x01, 0xf8, 0x11, 0xb0, 0x46, 0xbb, 0xdf, 0x06, 0xfc, + 0x43, 0x42, 0x3c, 0xfb, 0xbc, 0xb6, 0xef, 0xb9, 0x96, 0xa2, 0x26, 0x1a, + 0x2c, 0xa0, 0xaf, 0xd5, 0x05, 0x40, 0xf5, 0xbe, 0x04, 0x65, 0x24, 0x55, + 0x04, 0x53, 0x7d, 0xb4, 0x58, 0x05, 0x47, 0x01, 0xcd, 0x7f, 0x44, 0x98, + 0x9f, 0xf3, 0xa9, 0x92, 0x03, 0x93, 0x5e, 0x14, 0x6e, 0x2b, 0x05, 0x4c, + 0x7a, 0x50, 0x49, 0xe8, 0x67, 0x34, 0xe6, 0x3c, 0x24, 0x82, 0xc3, 0x59, + 0xc9, 0xb0, 0x84, 0x13, 0xd6, 0x36, 0xd7, 0x09, 0xdb, 0xe9, 0x12, 0x30, + 0xa1, 0xcb, 0xb0, 0x04, 0xd4, 0x80, 0x49, 0x04, 0xeb, 0x91, 0xe7, 0x1d, + 0xa4, 0x15, 0x49, 0x5f, 0xcc, 0x76, 0xd0, 0x5a, 0xfa, 0x90, 0x49, 0xe8, + 0xcb, 0x47, 0xee, 0xb9, 0xac, 0xbe, 0xd9, 0xce, 0x0f, 0x14, 0xb9, 0xe7, + 0x9b, 0x75, 0x2a, 0x2b, 0x5d, 0xa6, 0x67, 0x3d, 0x2a, 0x2b, 0xc3, 0x6d, + 0x66, 0xbd, 0xb2, 0xd2, 0x65, 0xec, 0x5a, 0xe5, 0x7f, 0xcf, 0xc1, 0x3a, + 0xe5, 0x95, 0x2e, 0xd5, 0x59, 0x8f, 0x3b, 0xb7, 0x16, 0x01, 0x38, 0xfc, + 0x84, 0xb2, 0x3b, 0x55, 0x57, 0x7e, 0xf6, 0xfa, 0x70, 0xd1, 0x8d, 0xf8, + 0x8f, 0x5d, 0xe9, 0x72, 0xf7, 0x43, 0x75, 0x86, 0x8b, 0xca, 0x9e, 0x59, + 0x1a, 0x4d, 0xd5, 0xbd, 0xc0, 0x7f, 0xaa, 0xee, 0x51, 0xb8, 0x34, 0xdc, + 0x66, 0x03, 0xb5, 0x8c, 0x0a, 0x1f, 0x6a, 0x51, 0x79, 0x52, 0xb9, 0xc7, + 0x3f, 0xac, 0x61, 0x46, 0xbf, 0x97, 0x27, 0x44, 0x8d, 0x29, 0xed, 0x3b, + 0x58, 0x07, 0x87, 0x60, 0xb2, 0x7d, 0x1c, 0xac, 0x65, 0xa0, 0x58, 0x8d, + 0xef, 0x1c, 0xa3, 0x47, 0xef, 0xa7, 0x4b, 0xe7, 0x0a, 0xcf, 0xea, 0xc7, + 0xee, 0x6d, 0x5b, 0x6f, 0x64, 0xdf, 0x43, 0x0f, 0xf7, 0x17, 0x21, 0x36, + 0x4e, 0x68, 0xf7, 0xcd, 0xc6, 0xdc, 0x75, 0x89, 0x51, 0x5c, 0x61, 0xe3, + 0xde, 0x92, 0x25, 0xfd, 0x16, 0xae, 0x53, 0x48, 0x06, 0x52, 0x39, 0x39, + 0x5c, 0xa7, 0xa0, 0x80, 0x4f, 0x80, 0x2b, 0x4a, 0x1a, 0x98, 0x65, 0xec, + 0x29, 0x70, 0x96, 0x27, 0x9b, 0x0a, 0x2e, 0xd5, 0x9e, 0xc2, 0x93, 0x06, + 0xac, 0x65, 0x97, 0x70, 0x23, 0x80, 0x49, 0xb8, 0xa2, 0x44, 0x6b, 0xae, + 0x05, 0xfe, 0x1d, 0x3d, 0x52, 0xb4, 0x07, 0xd7, 0x51, 0xf7, 0x5a, 0x9e, + 0x19, 0xc9, 0x77, 0x04, 0x9e, 0xfe, 0xf8, 0x89, 0xd4, 0x63, 0xa9, 0xe6, + 0x83, 0x0c, 0xd2, 0x5f, 0x1c, 0x00, 0x9f, 0xac, 0x06, 0x9e, 0xdf, 0x54, + 0x60, 0x2d, 0x26, 0x68, 0x05, 0xc4, 0xcf, 0x06, 0x2d, 0x0d, 0x4d, 0x76, + 0x45, 0x29, 0x80, 0x6e, 0x19, 0x78, 0x68, 0x1c, 0x16, 0xe6, 0xf9, 0x1e, + 0xae, 0xe3, 0x5a, 0xe5, 0x17, 0xdd, 0x6e, 0xe7, 0x1d, 0x00, 0xe9, 0x85, + 0x40, 0x2d, 0xe9, 0x81, 0x50, 0x10, 0x2d, 0x57, 0xb8, 0xe0, 0xb4, 0xc8, + 0xb8, 0x05, 0xbc, 0x66, 0xb4, 0x36, 0xc6, 0xdc, 0x75, 0xec, 0x4b, 0x68, + 0xc3, 0x6d, 0x58, 0x56, 0xbd, 0x0e, 0x0f, 0xd6, 0x51, 0x20, 0xac, 0xcf, + 0x5b, 0x1b, 0x62, 0x8a, 0x84, 0xb3, 0x0c, 0xd4, 0x6d, 0x47, 0x51, 0xfd, + 0x1e, 0x3c, 0xae, 0xbc, 0x8a, 0x45, 0xf8, 0xbc, 0x0e, 0x6b, 0x98, 0x51, + 0x41, 0xd4, 0xf8, 0x40, 0xdb, 0x26, 0xfa, 0x93, 0x1d, 0xcf, 0x02, 0x6b, + 0x1d, 0xd9, 0x01, 0x7b, 0xf6, 0xc0, 0x0d, 0x37, 0xc0, 0x23, 0x8f, 0xc0, + 0xd0, 0x2e, 0x98, 0x99, 0x99, 0x61, 0x07, 0x70, 0x64, 0x48, 0x8f, 0x89, + 0xcd, 0xc0, 0xa6, 0xa1, 0x70, 0x14, 0x6d, 0xc7, 0x97, 0xe0, 0xc8, 0xd0, + 0x0c, 0xbf, 0xb3, 0x67, 0x86, 0x1b, 0x6e, 0x20, 0x00, 0x64, 0xbd, 0xfd, + 0xe9, 0x4d, 0xcc, 0x5c, 0xba, 0x97, 0x43, 0x9b, 0xe0, 0xc8, 0x91, 0xbd, + 0x5d, 0x49, 0x18, 0x62, 0x88, 0x23, 0x33, 0x33, 0x0c, 0x0d, 0x85, 0xfb, + 0xdc, 0x71, 0x44, 0xa5, 0xa1, 0x17, 0x58, 0xeb, 0x23, 0xa6, 0x6a, 0x36, + 0xc1, 0x9d, 0x47, 0xe0, 0xba, 0xe3, 0x1a, 0xa8, 0x75, 0x1c, 0x36, 0xdc, + 0x02, 0xdc, 0x52, 0xe7, 0x38, 0x70, 0xcb, 0x83, 0xf0, 0xa0, 0x0e, 0x7a, + 0xcb, 0x2d, 0xba, 0xbc, 0x36, 0x44, 0x6d, 0x7d, 0x5e, 0x07, 0x78, 0x10, + 0x82, 0x0a, 0x58, 0x6c, 0xdc, 0x6c, 0x31, 0x49, 0x29, 0xe1, 0xf2, 0x32, + 0xf2, 0x49, 0x75, 0x8c, 0xc5, 0xc7, 0x80, 0x9b, 0xc7, 0x27, 0x7b, 0xc6, + 0x3d, 0xef, 0xb2, 0x4f, 0x4b, 0x0d, 0x8a, 0xa9, 0xb7, 0xbd, 0xe8, 0x07, + 0x74, 0x92, 0xce, 0x5d, 0x03, 0x8e, 0xd2, 0x52, 0x8f, 0xaf, 0x54, 0x99, + 0xa8, 0x3e, 0x73, 0x5e, 0x01, 0x94, 0x7c, 0x89, 0x10, 0x39, 0x7a, 0xe1, + 0xf4, 0x20, 0x7c, 0x6e, 0xd1, 0x75, 0x1f, 0x6e, 0xa9, 0xb2, 0x7b, 0x27, + 0xd3, 0x77, 0xdd, 0x13, 0x1d, 0x53, 0x3f, 0x87, 0x36, 0x65, 0xa9, 0x70, + 0x32, 0x7b, 0xdc, 0x2c, 0xfe, 0xfc, 0x5a, 0x06, 0xed, 0x9d, 0x24, 0xd7, + 0x96, 0x34, 0x1c, 0x58, 0x2f, 0x35, 0x0c, 0x4b, 0x97, 0xcf, 0x76, 0x47, + 0x70, 0xaf, 0x94, 0xdc, 0x2f, 0x04, 0x55, 0x47, 0x52, 0x76, 0x04, 0xf7, + 0xb6, 0x65, 0x70, 0xbf, 0x1f, 0x49, 0x8f, 0x81, 0x5c, 0x39, 0x0a, 0x9e, + 0x95, 0x84, 0x69, 0xf6, 0x50, 0xa0, 0x42, 0x81, 0x60, 0x54, 0x8f, 0xff, + 0xef, 0x98, 0x93, 0x94, 0xb2, 0x2e, 0x35, 0x1b, 0x32, 0x99, 0x75, 0xd5, + 0xf8, 0xbe, 0x2f, 0xc9, 0x21, 0x68, 0xe9, 0xb0, 0x39, 0x47, 0xd0, 0xf2, + 0xc3, 0x36, 0x5b, 0xfa, 0x12, 0x17, 0x89, 0x27, 0x44, 0x98, 0x76, 0xad, + 0xf5, 0x3a, 0x2d, 0xd2, 0x89, 0x82, 0xab, 0x16, 0xfa, 0x80, 0xc8, 0x94, + 0x93, 0xdc, 0xef, 0x01, 0xc0, 0x97, 0x48, 0xc7, 0x3c, 0xe1, 0x13, 0x8c, + 0x20, 0x99, 0x40, 0x90, 0x54, 0x1d, 0xc1, 0x3e, 0xfd, 0x70, 0xd4, 0x4f, + 0x4a, 0x49, 0x2e, 0x0b, 0x1d, 0xfb, 0x59, 0x9d, 0x65, 0x33, 0x90, 0x03, + 0x2d, 0x50, 0x75, 0x90, 0x55, 0xa8, 0x95, 0x09, 0x62, 0x32, 0xe3, 0xc1, + 0x52, 0x86, 0xc7, 0xb1, 0xf5, 0x9c, 0x8b, 0x0f, 0x87, 0x41, 0xdf, 0x85, + 0xe4, 0x59, 0x44, 0xd7, 0x72, 0xe8, 0x3d, 0x3f, 0x61, 0xe6, 0xfb, 0x6f, + 0xed, 0xb9, 0x7e, 0xae, 0x4b, 0x1b, 0x10, 0x75, 0xf6, 0xc5, 0x79, 0xd6, + 0xac, 0x59, 0xc3, 0x7c, 0xe3, 0x6c, 0xe0, 0xbf, 0xc6, 0xea, 0x52, 0x19, + 0xe0, 0x15, 0xc0, 0x8a, 0x15, 0x0a, 0x42, 0x63, 0x00, 0x57, 0x06, 0x52, + 0x15, 0x87, 0x56, 0x41, 0x08, 0xa8, 0x5a, 0xb1, 0x62, 0xc5, 0xeb, 0x67, + 0xf3, 0x5d, 0x6b, 0xba, 0x6c, 0x06, 0xdb, 0xd6, 0xac, 0x89, 0x00, 0xb1, + 0x80, 0xc8, 0xba, 0xb1, 0x69, 0xec, 0x1a, 0x7f, 0x63, 0x77, 0xbe, 0x71, + 0x96, 0xb3, 0x2f, 0xce, 0x07, 0xfb, 0x8c, 0x83, 0xd5, 0x4d, 0xfa, 0x4f, + 0x9d, 0x52, 0x77, 0x31, 0x06, 0xe0, 0x15, 0xe8, 0xc3, 0xc0, 0x76, 0xe5, + 0xec, 0xa7, 0x0d, 0x17, 0x1a, 0x0a, 0xda, 0xf4, 0x3c, 0xf2, 0xae, 0xee, + 0x67, 0xc4, 0x8e, 0xbb, 0x5c, 0xb1, 0x40, 0x41, 0x14, 0x58, 0x7f, 0x6d, + 0x85, 0x43, 0xdf, 0x3e, 0x1c, 0x3c, 0xd3, 0x37, 0x50, 0xb7, 0x5c, 0x5e, + 0xd0, 0xaa, 0x37, 0x10, 0xd9, 0x1c, 0xa5, 0x55, 0x65, 0x72, 0x83, 0x90, + 0xa1, 0x40, 0xfe, 0x43, 0x37, 0x73, 0xf8, 0x1b, 0x87, 0xa3, 0x40, 0x2d, + 0xd9, 0x02, 0x91, 0x53, 0x71, 0x74, 0xf7, 0xa6, 0x55, 0x6f, 0x81, 0xf5, + 0xf1, 0x22, 0xe1, 0x74, 0x98, 0xfe, 0xde, 0x34, 0xee, 0x90, 0x1e, 0x80, + 0xcf, 0x12, 0xb8, 0x4f, 0xcc, 0xd4, 0x90, 0x9e, 0xa4, 0x34, 0xe8, 0xd2, + 0x99, 0xcb, 0x91, 0x13, 0x50, 0x6d, 0xd4, 0xc3, 0xb4, 0x0a, 0x68, 0x91, + 0xd1, 0x90, 0x2f, 0x34, 0x28, 0x4b, 0x83, 0xb5, 0xda, 0x2d, 0xfd, 0x6c, + 0x51, 0x8d, 0x6d, 0xc8, 0xa6, 0x44, 0x38, 0x99, 0x00, 0xb0, 0xd5, 0x6a, + 0x82, 0x9c, 0x6b, 0x24, 0x8e, 0xa7, 0x1a, 0x68, 0x58, 0xc6, 0x51, 0xe9, + 0x15, 0xba, 0x9d, 0x1b, 0x7f, 0x62, 0x5a, 0x97, 0x61, 0x08, 0x0c, 0xcb, + 0xe5, 0x05, 0x9e, 0xf5, 0x38, 0x7b, 0xe4, 0xca, 0x0a, 0x0f, 0x1f, 0xdc, + 0xcf, 0xba, 0x4b, 0x87, 0xd9, 0xff, 0xb5, 0xfd, 0x94, 0xd6, 0x86, 0x7d, + 0x66, 0xe9, 0x67, 0x98, 0x98, 0xad, 0x52, 0x18, 0xcc, 0xd1, 0xf1, 0x24, + 0x62, 0xb0, 0x40, 0x6e, 0x50, 0xe5, 0x41, 0x22, 0x19, 0xb9, 0xb2, 0x4c, + 0xab, 0xa1, 0x1a, 0x92, 0xea, 0x6c, 0x2d, 0xf2, 0x61, 0xaa, 0x60, 0x2c, + 0xc5, 0x3a, 0xa7, 0x43, 0x00, 0x55, 0xd8, 0x67, 0x6f, 0x58, 0x44, 0x79, + 0x1b, 0x48, 0xd5, 0x98, 0xab, 0x45, 0xc2, 0x99, 0xb8, 0x40, 0x00, 0xb1, + 0x2a, 0x0c, 0x96, 0x02, 0x88, 0x54, 0xdc, 0x56, 0x3c, 0x8e, 0xed, 0xb6, + 0xb5, 0xf7, 0xe1, 0x23, 0xec, 0xb8, 0x71, 0x13, 0x2b, 0xde, 0xb1, 0x8c, + 0xe7, 0x7e, 0xa8, 0xc6, 0x2d, 0x1f, 0x3f, 0xf9, 0xe3, 0x00, 0x52, 0x15, + 0xb7, 0x65, 0xc3, 0xb0, 0x8c, 0xbf, 0xad, 0xc2, 0x60, 0x58, 0x06, 0xf1, + 0xf4, 0x2c, 0xc5, 0x56, 0x63, 0xae, 0x16, 0xac, 0xdb, 0x36, 0x23, 0xf9, + 0xb5, 0xca, 0x6b, 0xea, 0xe9, 0x89, 0x08, 0x3c, 0xcb, 0xb6, 0x6b, 0xca, + 0xca, 0x56, 0xf6, 0x92, 0x1c, 0x6f, 0xcf, 0x67, 0x98, 0x7d, 0x5a, 0x5d, + 0xbf, 0x56, 0xbe, 0xb5, 0xc2, 0x3b, 0x57, 0xaf, 0xe2, 0x07, 0xa7, 0xcf, + 0x00, 0x24, 0xba, 0xcf, 0xcc, 0x7f, 0x87, 0x55, 0x03, 0xd7, 0x68, 0x0b, + 0x1a, 0x98, 0x67, 0x9d, 0xd3, 0xa9, 0x52, 0xa5, 0x4a, 0x95, 0x2a, 0x55, + 0xaa, 0x54, 0xa9, 0x52, 0xa5, 0x4a, 0x95, 0x2a, 0x55, 0xaa, 0x54, 0xa9, + 0x52, 0xa5, 0x4a, 0x95, 0x2a, 0x55, 0xaa, 0x54, 0xa9, 0x52, 0xa5, 0x4a, + 0x95, 0xaa, 0x7f, 0x39, 0x8f, 0xc2, 0x1b, 0xf7, 0xc9, 0xed, 0x54, 0xa9, + 0x52, 0xa5, 0x4a, 0x95, 0x2a, 0x15, 0x00, 0x2e, 0xbc, 0xca, 0x43, 0x90, + 0xd9, 0xba, 0xf0, 0xd7, 0x04, 0xcd, 0x8b, 0xca, 0x0b, 0x86, 0x91, 0x92, + 0xc6, 0x6c, 0x7f, 0xd3, 0xa4, 0x6c, 0x28, 0x49, 0x1c, 0x20, 0x22, 0x7d, + 0x19, 0xbc, 0x54, 0x9e, 0x04, 0x37, 0x59, 0xcc, 0xe6, 0xf9, 0x90, 0x9d, + 0x3e, 0xfb, 0x25, 0xed, 0x7e, 0xca, 0x20, 0xbe, 0x1e, 0x07, 0x73, 0xc5, + 0xf3, 0x1b, 0xbc, 0xbc, 0xde, 0x47, 0xd8, 0x82, 0x5b, 0xa0, 0x39, 0x1b, + 0x03, 0x19, 0xc5, 0xd3, 0x60, 0xa5, 0x33, 0xc3, 0x08, 0x3c, 0x14, 0x6e, + 0x3b, 0x71, 0xdc, 0x63, 0x5d, 0xf0, 0x45, 0x67, 0x6d, 0x3b, 0xd8, 0x87, + 0x0c, 0xa1, 0x51, 0xf6, 0x0b, 0xd8, 0xd6, 0x66, 0xe3, 0x34, 0x30, 0x0c, + 0x35, 0xb1, 0x3f, 0x56, 0x26, 0x2e, 0x88, 0x55, 0x10, 0xcc, 0xdb, 0x35, + 0x1f, 0xab, 0xf7, 0x45, 0x00, 0x90, 0x32, 0xba, 0xff, 0x13, 0x0a, 0x2f, + 0xb1, 0xee, 0xb3, 0xbb, 0xb8, 0xf1, 0xca, 0x11, 0x1a, 0x5e, 0xb8, 0x93, + 0x75, 0x9f, 0xdd, 0x05, 0xf7, 0x1d, 0xa0, 0xe0, 0x0a, 0xe5, 0x4f, 0x38, + 0x25, 0xe9, 0xf6, 0x83, 0x87, 0x28, 0xb8, 0x82, 0xdb, 0x36, 0x8f, 0xf2, + 0xf0, 0x13, 0x13, 0x9c, 0xf8, 0xe3, 0x3d, 0x94, 0xb2, 0x82, 0x9a, 0xf5, + 0x52, 0xf9, 0x3d, 0xc7, 0x8e, 0xb1, 0x13, 0xb8, 0xff, 0xa6, 0x2d, 0xdc, + 0x7e, 0xdf, 0x01, 0x6e, 0x3f, 0x78, 0x48, 0xc1, 0xb8, 0x74, 0x7c, 0x08, + 0x27, 0x1c, 0xa0, 0x5f, 0x8a, 0xef, 0x92, 0x03, 0xa2, 0x2c, 0x22, 0x79, + 0x49, 0x62, 0x2c, 0xc4, 0x25, 0x1d, 0xa8, 0x6a, 0x90, 0x96, 0xa7, 0x27, + 0x1a, 0x89, 0xac, 0x08, 0x20, 0x62, 0x01, 0x50, 0xcb, 0x92, 0x79, 0x29, + 0x5e, 0xb6, 0x25, 0x2d, 0xbf, 0xa5, 0xc0, 0x5f, 0xd6, 0x0b, 0xf3, 0x3a, + 0xc1, 0x01, 0xc8, 0xac, 0x2b, 0xbd, 0x5f, 0x2e, 0x71, 0xe2, 0xb8, 0x95, + 0x38, 0xeb, 0xbc, 0x6e, 0x39, 0xc1, 0xae, 0xd5, 0x3a, 0x6a, 0x5a, 0x9d, + 0x74, 0xba, 0x27, 0xa1, 0x7b, 0x6d, 0x19, 0x9d, 0xbc, 0x01, 0x6a, 0x42, + 0x96, 0x03, 0x20, 0x91, 0x0e, 0xd4, 0xcc, 0x57, 0xb9, 0xbb, 0xf2, 0x2d, + 0x98, 0x6c, 0x1b, 0x3b, 0xbd, 0x8f, 0xd3, 0xa4, 0x6d, 0x1d, 0xbd, 0x6f, + 0xf5, 0xe2, 0xbe, 0x24, 0xe7, 0x84, 0x53, 0x3e, 0xdc, 0x6c, 0xa9, 0x27, + 0x44, 0x6b, 0x31, 0xa9, 0x49, 0xea, 0xdd, 0x13, 0xd8, 0x93, 0x64, 0xc0, + 0x5a, 0x23, 0xd7, 0x46, 0xdb, 0xc3, 0xe9, 0x27, 0xa7, 0xa9, 0x5c, 0x5e, + 0xe9, 0x11, 0x6b, 0x69, 0x32, 0x79, 0xb7, 0xcb, 0xa0, 0x61, 0x4d, 0x1e, + 0x93, 0x72, 0xe1, 0xf3, 0x1b, 0x16, 0x3b, 0xaf, 0x75, 0x18, 0xeb, 0x45, + 0x6f, 0x03, 0xce, 0x5a, 0xc8, 0xdd, 0x0b, 0xa8, 0x95, 0x24, 0x03, 0xc8, + 0x3a, 0x17, 0xb7, 0x69, 0xd3, 0x26, 0xbf, 0xf3, 0x06, 0x4e, 0x52, 0xd2, + 0x32, 0xed, 0xb3, 0x0d, 0x25, 0x30, 0xda, 0x78, 0xdd, 0xc6, 0xbe, 0xe2, + 0xda, 0x32, 0x79, 0x48, 0x82, 0x6f, 0x25, 0x69, 0xfd, 0x35, 0xeb, 0x7b, + 0x6e, 0x4b, 0xd4, 0x6c, 0xb5, 0xeb, 0xbc, 0xae, 0xfe, 0xed, 0x0b, 0x94, + 0x59, 0xbd, 0x34, 0x3b, 0x31, 0xf5, 0x03, 0xda, 0x3a, 0x97, 0xf8, 0x4b, + 0x09, 0x9f, 0x04, 0xe6, 0x5a, 0x28, 0x7c, 0x1c, 0x9e, 0xd5, 0x2b, 0xfc, + 0x42, 0x69, 0xb3, 0xe1, 0x5e, 0x43, 0x74, 0xc3, 0xb8, 0x86, 0xac, 0x09, + 0x87, 0xe7, 0x4b, 0x43, 0x9f, 0xfa, 0x14, 0xa7, 0x67, 0x66, 0x78, 0xd7, + 0xa3, 0x8f, 0x2e, 0x3e, 0x6f, 0xf2, 0xde, 0xd5, 0x54, 0xff, 0xf6, 0x85, + 0x60, 0xf5, 0xc4, 0x49, 0x58, 0x77, 0x6d, 0xf4, 0xbc, 0xbe, 0x71, 0x52, + 0xf0, 0x37, 0x53, 0xcf, 0x44, 0xfc, 0xae, 0x3f, 0x16, 0xba, 0xe3, 0x40, + 0xab, 0xf3, 0x25, 0x1b, 0x8c, 0x15, 0x87, 0x64, 0x2d, 0xe6, 0x7f, 0xa7, + 0xbe, 0x66, 0xdd, 0x7d, 0x1e, 0xd2, 0xb6, 0xd3, 0x87, 0xdb, 0x67, 0xe1, + 0xfe, 0x95, 0xb0, 0x4f, 0x4a, 0x6e, 0xfb, 0x40, 0x08, 0xb7, 0xf8, 0xd6, + 0xd3, 0xaa, 0x9d, 0xbf, 0x7d, 0x36, 0x1a, 0x3e, 0x09, 0x1a, 0xd6, 0x4b, + 0x13, 0x3a, 0xad, 0x23, 0xaf, 0x31, 0xad, 0x37, 0x6b, 0x3b, 0xfb, 0x9d, + 0xa8, 0xfb, 0x7e, 0x1f, 0x35, 0x31, 0xfd, 0xda, 0x12, 0x27, 0x4e, 0x86, + 0xe1, 0x4f, 0x34, 0x3b, 0xac, 0xbb, 0xcc, 0x9a, 0xe4, 0x6d, 0x80, 0x5a, + 0xc2, 0x85, 0x6f, 0x1c, 0x42, 0x66, 0x73, 0xb0, 0x75, 0x0c, 0xd1, 0xf6, + 0xe0, 0x1b, 0xe3, 0x80, 0x0b, 0x37, 0x6c, 0x41, 0x6c, 0x5c, 0xc7, 0xc8, + 0xaa, 0x3c, 0xe3, 0x0f, 0x1d, 0x82, 0xa7, 0xa6, 0xe1, 0xfd, 0xb7, 0x85, + 0x36, 0x0e, 0xee, 0x53, 0xe1, 0x6e, 0xb2, 0xfc, 0xb4, 0xc4, 0xc7, 0xd4, + 0x4c, 0x87, 0x6d, 0x78, 0xe1, 0xd4, 0xca, 0x39, 0x62, 0x60, 0x2d, 0xd8, + 0x3d, 0xe3, 0xb1, 0xd3, 0x03, 0xeb, 0x10, 0xa3, 0xd3, 0x80, 0xdd, 0x78, + 0xec, 0xbd, 0x5c, 0x85, 0xdb, 0xf1, 0x64, 0xd8, 0x8f, 0x02, 0x14, 0x4c, + 0xeb, 0xe4, 0x2e, 0xf5, 0xc3, 0xc0, 0x8d, 0x14, 0x14, 0x0c, 0x6f, 0x0b, + 0xb8, 0x87, 0x60, 0x00, 0xa8, 0x8f, 0x41, 0xf6, 0x5e, 0xf8, 0xb8, 0x0c, + 0xc0, 0x5a, 0xeb, 0xff, 0x9f, 0x61, 0x26, 0x4f, 0xee, 0x82, 0xe6, 0x1b, + 0x8c, 0xc7, 0xf9, 0xf1, 0x54, 0xb2, 0xbf, 0x99, 0xa4, 0xd4, 0x4e, 0xe8, + 0xf8, 0x0d, 0xe9, 0x63, 0xcf, 0x06, 0x87, 0x19, 0xed, 0xbb, 0x13, 0xde, + 0x3f, 0x0a, 0xbf, 0x3a, 0x0a, 0x97, 0xad, 0xe3, 0x44, 0x33, 0x84, 0x65, + 0xda, 0xd7, 0x6b, 0x21, 0x04, 0xd2, 0x0f, 0xfb, 0x73, 0xb6, 0x7b, 0xfa, + 0x7b, 0x32, 0xd1, 0xbf, 0x5f, 0x9d, 0x0f, 0xe8, 0xd5, 0xcf, 0xc2, 0x36, + 0xe8, 0xc9, 0xa5, 0x31, 0x3f, 0xd9, 0x27, 0x04, 0x4c, 0x74, 0x41, 0x4e, + 0x73, 0xd1, 0x75, 0x63, 0xcf, 0xac, 0x67, 0x5d, 0xe4, 0x02, 0x13, 0x8c, + 0x41, 0x81, 0xb5, 0x4c, 0x1a, 0xec, 0x3e, 0x78, 0x57, 0x7f, 0x3c, 0x76, + 0xbd, 0x1e, 0x7f, 0xa1, 0x0a, 0xab, 0x97, 0x06, 0xe0, 0x09, 0xd2, 0xb5, + 0xc8, 0xfa, 0x52, 0xed, 0x25, 0xa9, 0xc3, 0x2b, 0x6c, 0x7f, 0xf9, 0x15, + 0xee, 0xbd, 0xf0, 0x42, 0xbc, 0x97, 0xe1, 0x4f, 0x80, 0xff, 0x9d, 0x57, + 0x58, 0x75, 0xe1, 0x05, 0xcc, 0xbd, 0x1c, 0xdd, 0x2f, 0xc0, 0xe0, 0xe0, + 0x20, 0x6f, 0x7d, 0xeb, 0x5b, 0x39, 0x71, 0xf4, 0x28, 0xcb, 0x96, 0x2d, + 0xe3, 0xf9, 0x04, 0x40, 0x56, 0x5c, 0xcb, 0x96, 0x2d, 0xe3, 0xc4, 0xd1, + 0xa3, 0xac, 0xbb, 0xee, 0x3a, 0x06, 0x07, 0x07, 0xf9, 0xe1, 0xf3, 0xcf, + 0x77, 0xe5, 0xe5, 0x17, 0x80, 0x46, 0xf3, 0x05, 0x06, 0x2e, 0x7a, 0x0b, + 0x97, 0x5c, 0x24, 0x28, 0xbc, 0xe7, 0x72, 0x1a, 0xdf, 0x7f, 0x92, 0x7f, + 0xfc, 0xb1, 0xc7, 0x85, 0x7d, 0xe6, 0x25, 0x49, 0xf1, 0xf0, 0x4b, 0xc7, + 0xb6, 0x76, 0xdb, 0x32, 0x36, 0xfe, 0xdb, 0x6a, 0x5d, 0xbf, 0x5a, 0xf1, + 0xeb, 0xf5, 0xc8, 0xa6, 0x1c, 0x13, 0x47, 0x5a, 0x14, 0x2e, 0x57, 0xb1, + 0x46, 0xb7, 0xe6, 0x18, 0x7f, 0xa8, 0xc5, 0x96, 0xad, 0x93, 0x18, 0xd8, + 0x44, 0xfc, 0x9c, 0xae, 0x9f, 0xf1, 0x28, 0xae, 0x72, 0xf1, 0xda, 0x12, + 0xaf, 0x25, 0x71, 0xad, 0x7e, 0xb9, 0xb0, 0xee, 0xd7, 0xe4, 0xbc, 0x20, + 0xe7, 0x8a, 0x9e, 0x10, 0x2d, 0xdb, 0x0d, 0xc9, 0x30, 0xaa, 0xb8, 0x3f, + 0xc0, 0xf8, 0xe4, 0x24, 0xe5, 0x42, 0x89, 0x5c, 0xde, 0xa3, 0xf6, 0x7c, + 0x0d, 0x91, 0x2d, 0x51, 0x5a, 0x29, 0x19, 0x9f, 0xae, 0x52, 0x58, 0x55, + 0x52, 0x36, 0x1b, 0x2d, 0x44, 0x2e, 0xc3, 0xf8, 0xb1, 0x6a, 0x17, 0x0c, + 0x1a, 0xc0, 0xcd, 0xea, 0x36, 0xcd, 0x82, 0x77, 0x4d, 0x3d, 0x51, 0x23, + 0xe7, 0xba, 0x14, 0xb2, 0x79, 0x5a, 0x1a, 0xbc, 0x5e, 0x5a, 0x5d, 0x08, + 0xc2, 0xf4, 0x03, 0xd1, 0x8a, 0x6f, 0xb7, 0xed, 0x8b, 0xe6, 0x21, 0x70, + 0xa0, 0x90, 0x2d, 0x45, 0x61, 0xdf, 0x7e, 0x06, 0x9c, 0x0e, 0xb5, 0x46, + 0x93, 0x52, 0x31, 0xac, 0x9b, 0xe2, 0x2a, 0x97, 0xb2, 0x2e, 0x9f, 0x6a, + 0xb5, 0x46, 0x71, 0x95, 0xb2, 0xd5, 0x68, 0xd4, 0x29, 0x97, 0xf2, 0x34, + 0xce, 0x78, 0xb4, 0x3c, 0xa8, 0xfe, 0xa7, 0x7d, 0x94, 0xa1, 0xeb, 0x7a, + 0x6d, 0x9f, 0xd7, 0x7e, 0xf6, 0xfc, 0x3e, 0xc6, 0x7a, 0x5b, 0x1f, 0xf6, + 0x06, 0x62, 0x61, 0xce, 0x81, 0xfb, 0x79, 0xde, 0xd2, 0x12, 0xd7, 0xeb, + 0x95, 0x16, 0x58, 0x7a, 0xd9, 0x4c, 0x01, 0xc3, 0xed, 0x57, 0xf9, 0x01, + 0x0a, 0xa0, 0x05, 0xf0, 0x4e, 0x2b, 0xec, 0x8f, 0x80, 0x5f, 0x05, 0xa6, + 0x74, 0x9c, 0x0b, 0xe9, 0x3e, 0xaf, 0xcf, 0xe5, 0x9e, 0xcb, 0x03, 0xb6, + 0x64, 0xf5, 0x18, 0x86, 0x0f, 0xeb, 0x01, 0xfb, 0x8e, 0xb7, 0x24, 0xa0, + 0x1a, 0x6b, 0x9c, 0x16, 0x42, 0xf9, 0xc8, 0x45, 0xae, 0xfd, 0x6b, 0xae, + 0x82, 0x53, 0xdf, 0x5d, 0x52, 0x12, 0xc3, 0xfd, 0x0a, 0x18, 0x73, 0xe0, + 0xb0, 0x17, 0xb6, 0x6d, 0x66, 0x99, 0x13, 0x50, 0x6b, 0x2b, 0x2c, 0xbe, + 0xd1, 0x34, 0x28, 0x4c, 0xfe, 0x9c, 0x82, 0x84, 0x6d, 0x41, 0xe1, 0x70, + 0xc6, 0x04, 0x34, 0x1d, 0x68, 0x79, 0x61, 0x3b, 0x55, 0x43, 0x50, 0x42, + 0x52, 0xd3, 0x68, 0xfd, 0x5e, 0x77, 0xc0, 0x8b, 0x63, 0x8c, 0x5e, 0x9b, + 0x24, 0x80, 0x50, 0xe3, 0x4c, 0xb4, 0xa1, 0x64, 0x00, 0x19, 0xf1, 0x7b, + 0xae, 0xd8, 0x58, 0x8a, 0x01, 0x69, 0x55, 0x56, 0xba, 0x8c, 0xea, 0xfe, + 0xee, 0xf8, 0x93, 0x21, 0x60, 0xcb, 0x00, 0xb5, 0x32, 0x3e, 0x89, 0x30, + 0xac, 0xb1, 0x2b, 0x5d, 0x0e, 0x3f, 0xe1, 0x05, 0x7e, 0x63, 0x57, 0x46, + 0x27, 0xbd, 0xc7, 0xfd, 0xe3, 0x71, 0x21, 0x04, 0x73, 0x19, 0xdd, 0xf1, + 0xc0, 0xb7, 0xb8, 0x71, 0xf4, 0xd7, 0x82, 0xf5, 0xbd, 0x7f, 0xba, 0x97, + 0x1d, 0x9f, 0xde, 0xd1, 0x95, 0xe7, 0xc6, 0x37, 0x72, 0x54, 0xa8, 0x73, + 0xdb, 0xb3, 0x3f, 0x80, 0x77, 0xa9, 0xa3, 0xfe, 0xf0, 0xa3, 0xaa, 0xa4, + 0xb7, 0x7f, 0xb2, 0x40, 0xe1, 0xeb, 0x1d, 0x1a, 0x07, 0xeb, 0xdc, 0x76, + 0x53, 0x91, 0x3b, 0x1f, 0xaa, 0x23, 0x9e, 0x94, 0xb8, 0xa8, 0x63, 0xb6, + 0xf2, 0x4d, 0x0f, 0xef, 0xf2, 0x0a, 0x55, 0x27, 0x3c, 0x0f, 0x72, 0x4b, + 0x18, 0x03, 0xcb, 0x39, 0x2a, 0xcd, 0xe7, 0x05, 0xae, 0x65, 0xc6, 0xfe, + 0xb2, 0x25, 0x68, 0xd7, 0xd8, 0xf7, 0xb5, 0x3d, 0x00, 0xdc, 0xf6, 0xb1, + 0x5d, 0x81, 0xbb, 0x2f, 0xc5, 0xfa, 0x66, 0x87, 0xbd, 0x13, 0xb0, 0xba, + 0x1b, 0xac, 0xe5, 0x49, 0x8f, 0xf2, 0xca, 0x32, 0x4d, 0x29, 0x7a, 0x36, + 0x66, 0xae, 0x53, 0xc0, 0xf3, 0xe3, 0x47, 0x6b, 0x06, 0x9c, 0x0a, 0xf8, + 0xd3, 0x78, 0xbe, 0xa4, 0x90, 0x1f, 0xc3, 0x95, 0x1e, 0x9e, 0xdf, 0xc0, + 0x75, 0xec, 0xc9, 0xf5, 0x1a, 0x70, 0x26, 0xf2, 0x1a, 0xb6, 0xa5, 0xdd, + 0x7e, 0x77, 0x1f, 0x34, 0x97, 0x2f, 0xe0, 0xcd, 0x7a, 0x78, 0xb2, 0x86, + 0xe7, 0xab, 0xf1, 0xf2, 0x3b, 0xb6, 0x86, 0xfd, 0x49, 0x01, 0xec, 0x7e, + 0x28, 0x3a, 0xbe, 0x29, 0xf4, 0x78, 0xb6, 0xf4, 0xc1, 0x75, 0xd4, 0xb5, + 0xd8, 0x70, 0xfe, 0xa5, 0x1f, 0x8e, 0x05, 0x9b, 0x6d, 0xbd, 0xe4, 0x8a, + 0xf8, 0x73, 0xa1, 0x2a, 0x90, 0x57, 0x40, 0x2d, 0x0d, 0xcd, 0x52, 0xe9, + 0x2b, 0xe1, 0xc9, 0x86, 0xe5, 0xae, 0xe1, 0x8a, 0x92, 0x82, 0x6b, 0xb5, + 0xab, 0xa8, 0x16, 0x23, 0x66, 0xdb, 0xb2, 0x61, 0x97, 0x49, 0x24, 0xef, + 0x83, 0x05, 0x3c, 0xd9, 0xc4, 0x93, 0xd3, 0xe1, 0x03, 0x05, 0x0d, 0xd4, + 0x42, 0x7a, 0xb8, 0x6e, 0x9e, 0x8c, 0x9b, 0x83, 0x36, 0x01, 0xc0, 0xcc, + 0x68, 0x7c, 0xb5, 0xae, 0x5f, 0x63, 0xdd, 0x6a, 0xc3, 0x8b, 0xc5, 0x28, + 0x58, 0x0b, 0xb0, 0xe8, 0x58, 0x8b, 0x68, 0x91, 0x78, 0x77, 0xde, 0xa0, + 0x7e, 0x11, 0xd9, 0x20, 0xac, 0x24, 0x58, 0x48, 0x7c, 0x60, 0x68, 0xd3, + 0x10, 0x0c, 0x6d, 0x0a, 0x37, 0xec, 0xfd, 0x40, 0x04, 0xa0, 0x95, 0x64, + 0x77, 0xd3, 0x5e, 0xd8, 0xa4, 0xeb, 0x78, 0xc7, 0x0d, 0x04, 0x03, 0x61, + 0x47, 0x86, 0xd4, 0x28, 0xd7, 0xa6, 0x4d, 0xdf, 0xe4, 0xc8, 0x91, 0xcf, + 0x30, 0xc3, 0x0c, 0x7b, 0xf4, 0x29, 0xb3, 0x6b, 0x97, 0x02, 0x64, 0x7d, + 0x65, 0x17, 0x1c, 0x99, 0x51, 0x28, 0x7a, 0x35, 0x02, 0xa6, 0x40, 0x5a, + 0x17, 0xef, 0xda, 0x01, 0x47, 0xf6, 0x06, 0x10, 0x2d, 0x00, 0x33, 0x44, + 0xb6, 0x43, 0xef, 0x7b, 0x93, 0xd0, 0xe9, 0xd8, 0xd4, 0x1b, 0xa8, 0x15, + 0xd7, 0x75, 0x12, 0x36, 0x6c, 0x80, 0x3b, 0x1f, 0x27, 0x04, 0x66, 0x3d, + 0x48, 0x57, 0x59, 0x3e, 0xf8, 0x60, 0x08, 0xd6, 0xaa, 0xd7, 0x43, 0x30, + 0xd9, 0x83, 0x9f, 0x57, 0x20, 0xae, 0x0d, 0x1b, 0xe0, 0xc7, 0x0f, 0xd2, + 0xd7, 0xb8, 0xd9, 0x62, 0x12, 0x42, 0xc0, 0xc9, 0x5a, 0xd8, 0xbf, 0x7e, + 0x9d, 0x3e, 0xe2, 0xb3, 0x64, 0xf9, 0x12, 0x37, 0xeb, 0xe2, 0xc5, 0xd3, + 0xd3, 0xe3, 0x59, 0x64, 0xec, 0xe9, 0xa2, 0xee, 0x27, 0x2b, 0x5f, 0x4f, + 0xd3, 0x52, 0xf2, 0xf9, 0x52, 0xcf, 0xf8, 0x46, 0x26, 0xac, 0xfd, 0x0c, + 0xd2, 0x75, 0xdd, 0xc8, 0x47, 0x93, 0x26, 0x9b, 0x8d, 0xae, 0xde, 0xff, + 0x52, 0x01, 0x59, 0x80, 0x4e, 0x4b, 0x9f, 0x71, 0x62, 0xfd, 0x70, 0xfb, + 0x39, 0x97, 0xfd, 0xec, 0x53, 0x38, 0x82, 0x16, 0x0a, 0x4e, 0x55, 0x17, + 0x02, 0xd7, 0x97, 0x78, 0xa8, 0xe5, 0x0e, 0x0d, 0xa3, 0xda, 0x6d, 0xd2, + 0xe9, 0x4b, 0x1a, 0xa2, 0xfb, 0xde, 0x50, 0x8d, 0xcd, 0xc8, 0x00, 0x64, + 0xe5, 0x25, 0xdc, 0xeb, 0x08, 0x5f, 0x83, 0x84, 0x11, 0x91, 0xe7, 0x66, + 0x65, 0x5f, 0xd2, 0x40, 0x90, 0xf1, 0x15, 0xd8, 0x70, 0x14, 0xc1, 0x84, + 0x79, 0xa6, 0xdb, 0x96, 0xb4, 0xf4, 0x07, 0x3e, 0x84, 0x50, 0xe9, 0x8c, + 0x8c, 0x25, 0xf8, 0x20, 0x11, 0xb8, 0x48, 0xaa, 0x8e, 0x2e, 0x1f, 0x5f, + 0xa5, 0x67, 0xba, 0x2d, 0x03, 0x98, 0xd6, 0x96, 0x8f, 0x6e, 0xe3, 0xf0, + 0xc1, 0x07, 0x22, 0xe9, 0xca, 0x10, 0x3e, 0xf7, 0xc9, 0x08, 0x65, 0xab, + 0xa5, 0x7f, 0x5d, 0x69, 0x87, 0x10, 0x7e, 0xa5, 0xd3, 0x3e, 0x81, 0x01, + 0x7d, 0xa9, 0x38, 0xe6, 0x63, 0x48, 0xd2, 0x57, 0xcf, 0x05, 0x93, 0x6a, + 0xc9, 0x00, 0xb5, 0x3a, 0xb2, 0x43, 0x2e, 0xab, 0xf6, 0x5f, 0xf1, 0xa1, + 0xaa, 0xf3, 0x55, 0xf6, 0x05, 0x93, 0x60, 0xf5, 0x21, 0x05, 0x13, 0x40, + 0x06, 0x49, 0x67, 0x81, 0x3b, 0xf2, 0xf8, 0x73, 0x2e, 0xfe, 0x12, 0xdc, + 0x0f, 0x2f, 0xfc, 0xae, 0x82, 0x02, 0x4b, 0x85, 0x7d, 0xf5, 0x37, 0x7f, + 0xff, 0x82, 0x05, 0xc3, 0xf7, 0xab, 0x93, 0xdf, 0x7b, 0x82, 0x81, 0xc2, + 0xf2, 0xd8, 0x7e, 0x88, 0xc0, 0xab, 0x8c, 0x6c, 0xf7, 0x73, 0xcf, 0x3d, + 0x17, 0x81, 0x4d, 0x9d, 0xfc, 0xde, 0x13, 0x01, 0x74, 0x6a, 0x39, 0x67, + 0x83, 0x75, 0xdb, 0xee, 0xb8, 0x86, 0x4e, 0xbd, 0x51, 0x36, 0x8d, 0xbd, + 0x78, 0x7e, 0x0d, 0x3c, 0x8c, 0x17, 0x4f, 0x75, 0xd9, 0x34, 0x1a, 0x1f, + 0x1f, 0xef, 0xb2, 0x39, 0x50, 0x58, 0xce, 0x7c, 0xe3, 0x6c, 0x50, 0x5e, + 0xcb, 0x2f, 0x1e, 0x88, 0xd8, 0x37, 0xe1, 0xed, 0x32, 0x75, 0x19, 0x81, + 0xbf, 0x0c, 0xed, 0xda, 0x6d, 0xb8, 0xd0, 0xe7, 0x80, 0x59, 0xd6, 0x67, + 0x9b, 0xea, 0x3c, 0xb2, 0xda, 0xb0, 0xa6, 0xe7, 0x91, 0xc7, 0x8d, 0x3c, + 0xc7, 0xdc, 0xfe, 0xb9, 0x9d, 0xb4, 0xea, 0x8d, 0x00, 0xa8, 0x55, 0x59, + 0x5d, 0xa1, 0xd9, 0xaa, 0x03, 0x39, 0x5a, 0x8e, 0x3a, 0x36, 0x0d, 0x50, + 0x4b, 0xfa, 0x50, 0x7d, 0xaa, 0x4a, 0x61, 0x70, 0x94, 0x96, 0xaf, 0xc6, + 0x54, 0xc6, 0xde, 0x5f, 0x61, 0xfa, 0x8c, 0x17, 0x00, 0xa7, 0x10, 0xfa, + 0x63, 0x44, 0xd6, 0xd8, 0xb4, 0xc8, 0x66, 0xd0, 0x77, 0x15, 0x48, 0x3f, + 0x83, 0xf4, 0x33, 0x88, 0xc1, 0x02, 0xde, 0x8c, 0xea, 0xb3, 0x06, 0x70, + 0x2d, 0x13, 0xde, 0x15, 0x34, 0x7c, 0x49, 0x09, 0xd8, 0x78, 0xe5, 0x46, + 0x0e, 0x3d, 0x76, 0x8c, 0x72, 0xa1, 0x88, 0x37, 0xdf, 0xa4, 0xa1, 0xdf, + 0x5f, 0x68, 0x35, 0x4d, 0x7b, 0x90, 0x09, 0xf2, 0x5f, 0xc8, 0x97, 0x68, + 0xe9, 0x31, 0x68, 0xd3, 0x56, 0x98, 0xf6, 0x22, 0x83, 0x02, 0x63, 0x15, + 0xd6, 0x16, 0x68, 0xcc, 0x74, 0x70, 0x45, 0x01, 0xcf, 0x02, 0x44, 0x29, + 0x7b, 0x1d, 0x3a, 0x7e, 0x06, 0x91, 0xcd, 0xe8, 0xb1, 0xe4, 0x0e, 0xd5, + 0x27, 0xa7, 0xa8, 0x5c, 0x3d, 0x1c, 0xe6, 0x2f, 0x96, 0x37, 0x50, 0xaf, + 0x6b, 0xdc, 0x78, 0xd3, 0xcd, 0xaa, 0x4e, 0x9e, 0x4e, 0x1e, 0x23, 0x6f, + 0xf9, 0x0a, 0xc8, 0x2c, 0xe7, 0x1a, 0x30, 0x58, 0x40, 0xc8, 0x0e, 0xb9, + 0x95, 0x39, 0xbc, 0x39, 0x8f, 0x5c, 0x41, 0xd0, 0x6a, 0x29, 0xc0, 0x56, + 0xed, 0x29, 0xdd, 0xc7, 0xb3, 0xdb, 0x70, 0x7d, 0x4e, 0x57, 0xb8, 0x28, + 0xb0, 0x17, 0xc2, 0xad, 0x2c, 0x00, 0xd5, 0x5c, 0x2d, 0xf0, 0xaf, 0xcd, + 0x2e, 0x0c, 0x9c, 0x0a, 0xe1, 0x5c, 0x6a, 0xbd, 0x90, 0x2f, 0x24, 0xc2, + 0xa4, 0xec, 0xb0, 0x71, 0xf8, 0x95, 0x09, 0x27, 0x44, 0x81, 0x3d, 0xfb, + 0xbf, 0xc6, 0xae, 0x9b, 0x3f, 0x16, 0xc0, 0xb4, 0x6c, 0x7b, 0x71, 0x5b, + 0xb6, 0xcd, 0xf8, 0x76, 0x95, 0xf6, 0x09, 0x4a, 0x2b, 0x47, 0x82, 0x74, + 0x01, 0x91, 0xb4, 0x2d, 0xc5, 0x96, 0xf1, 0x33, 0xf9, 0x1c, 0xbe, 0x34, + 0xb4, 0xdb, 0x68, 0x36, 0x02, 0x50, 0x56, 0x21, 0x5f, 0x88, 0x40, 0xc8, + 0x4c, 0xbe, 0xec, 0x65, 0x12, 0x58, 0x6b, 0xea, 0xe9, 0x89, 0x48, 0xd9, + 0x18, 0x70, 0xd6, 0xc5, 0x17, 0xad, 0x60, 0xfa, 0x99, 0x1a, 0x2f, 0xbe, + 0xf4, 0x1c, 0xab, 0x06, 0xae, 0x61, 0xfa, 0x99, 0xbf, 0xe5, 0xc5, 0x97, + 0x42, 0x38, 0xde, 0x0b, 0x2f, 0xd7, 0x18, 0xe4, 0xa2, 0xae, 0x73, 0x3a, + 0x55, 0xaa, 0x54, 0xa9, 0x52, 0xa5, 0x4a, 0x95, 0x2a, 0x55, 0xaa, 0x54, + 0xa9, 0x52, 0xa5, 0x4a, 0x95, 0x2a, 0x55, 0xaa, 0x54, 0xa9, 0x52, 0xa5, + 0x4a, 0x95, 0x2a, 0x55, 0xaa, 0x54, 0xa9, 0x52, 0xf5, 0xaf, 0xd7, 0x69, + 0xfa, 0x67, 0xaa, 0x54, 0xa9, 0x52, 0xa5, 0x4a, 0x95, 0xea, 0x8d, 0x54, + 0x61, 0x65, 0x21, 0xf2, 0xd2, 0xf5, 0x6b, 0xd5, 0x52, 0x5e, 0xce, 0x0e, + 0xe0, 0x57, 0xaf, 0xe3, 0xcb, 0xf0, 0x0b, 0x7d, 0xb5, 0xd9, 0x4e, 0x43, + 0xc4, 0x6f, 0x29, 0x79, 0x58, 0x24, 0x6c, 0xc3, 0x5b, 0x78, 0xca, 0xd9, + 0x62, 0xe9, 0xeb, 0x92, 0x00, 0xf4, 0xe4, 0xb2, 0xc8, 0xe4, 0x70, 0x3f, + 0x1e, 0x48, 0x92, 0x13, 0x82, 0x96, 0x54, 0xd0, 0x2b, 0x21, 0x89, 0x4c, + 0xc6, 0x09, 0x26, 0x48, 0x3b, 0x12, 0x51, 0x12, 0xb0, 0x12, 0x32, 0x7a, + 0x16, 0x4f, 0xa7, 0x2d, 0xd5, 0x2c, 0xad, 0xb6, 0x09, 0x14, 0x05, 0x6b, + 0xad, 0xfb, 0xec, 0x2e, 0x46, 0x56, 0x0f, 0x2b, 0xc0, 0x93, 0x23, 0x71, + 0xa5, 0x60, 0xf7, 0xc1, 0x43, 0xd4, 0xbe, 0x7a, 0x00, 0x1c, 0x70, 0xf3, + 0x39, 0x1a, 0x5e, 0x83, 0xfb, 0x3f, 0xb1, 0x4d, 0x81, 0xb2, 0x36, 0x86, + 0xf0, 0x9b, 0xdd, 0x07, 0x0f, 0x29, 0x18, 0x17, 0x50, 0xce, 0xe7, 0x60, + 0xa6, 0xc1, 0x9f, 0x7f, 0x7c, 0x5b, 0xb0, 0x2d, 0x28, 0x17, 0x07, 0xd0, + 0x2f, 0xac, 0xae, 0xfb, 0xec, 0x2e, 0xe4, 0xd7, 0x1e, 0xd0, 0xe5, 0x85, + 0x9e, 0xea, 0xa7, 0x5e, 0x0a, 0xc5, 0x17, 0x01, 0xdc, 0x4a, 0xb8, 0x20, + 0x4a, 0x24, 0xe7, 0x65, 0xb1, 0x62, 0xd5, 0x00, 0xad, 0xca, 0x50, 0x41, + 0x41, 0xb5, 0x04, 0xe0, 0xc9, 0x00, 0x10, 0x36, 0x3d, 0xd3, 0x08, 0xc3, + 0xc5, 0xe2, 0x35, 0xbc, 0x06, 0x39, 0x27, 0x0a, 0x01, 0x30, 0x9f, 0x8d, + 0xee, 0x09, 0xd4, 0x3a, 0x07, 0xb9, 0x59, 0x81, 0xd7, 0x96, 0x14, 0x80, + 0x9a, 0x28, 0x42, 0x64, 0x82, 0x13, 0xc1, 0x31, 0xa0, 0xbe, 0x95, 0x2b, + 0xf1, 0xa4, 0xd0, 0xee, 0x85, 0x94, 0xfc, 0x25, 0xef, 0x7e, 0x24, 0x51, + 0xf0, 0xaf, 0x1c, 0x82, 0x96, 0x23, 0x29, 0x09, 0x41, 0x2d, 0x00, 0x74, + 0x45, 0x81, 0x5a, 0x4b, 0x05, 0x6c, 0xb9, 0xd9, 0xd2, 0xa2, 0xf1, 0xb6, + 0x7f, 0x62, 0x3b, 0x13, 0x8f, 0x4d, 0x30, 0x72, 0xed, 0x08, 0xd5, 0x93, + 0x55, 0x5a, 0xcf, 0xab, 0x17, 0xab, 0x73, 0xcb, 0x72, 0x6c, 0xff, 0x94, + 0xda, 0xb6, 0xfd, 0x53, 0xdb, 0xb9, 0xe7, 0xae, 0x7b, 0x62, 0x69, 0x59, + 0x1c, 0x82, 0xb5, 0x98, 0x0a, 0x83, 0x05, 0x75, 0x6e, 0x61, 0xa6, 0xda, + 0x9f, 0x1f, 0xbb, 0x90, 0x0c, 0xcb, 0x6a, 0xcd, 0xb5, 0x02, 0xa0, 0x96, + 0x6c, 0xcb, 0x20, 0x4c, 0xdc, 0x6d, 0x60, 0x58, 0xde, 0x9c, 0xb7, 0x24, + 0xf7, 0x62, 0x92, 0x52, 0x52, 0xcc, 0x77, 0x03, 0x32, 0x3c, 0x5f, 0xe2, + 0x3a, 0x6a, 0x12, 0x8a, 0x91, 0xeb, 0x08, 0xea, 0xcd, 0x26, 0xc5, 0x7c, + 0x3e, 0xd8, 0x6e, 0xc2, 0x9a, 0xed, 0xec, 0x68, 0xe6, 0x63, 0x00, 0x00, + 0x20, 0x00, 0x49, 0x44, 0x41, 0x54, 0xb6, 0x1b, 0xa0, 0xde, 0xd4, 0x13, + 0x15, 0x07, 0xdd, 0x48, 0xf8, 0xb8, 0xbb, 0xa9, 0xaf, 0x55, 0x01, 0x6c, + 0xcb, 0xf3, 0x70, 0xf5, 0x17, 0xaf, 0x17, 0x72, 0xdb, 0x13, 0x8d, 0x8c, + 0x3b, 0xef, 0xba, 0x89, 0xe9, 0x33, 0x5f, 0x8f, 0xef, 0xe7, 0x3a, 0x10, + 0x2f, 0xcf, 0x7e, 0x14, 0x07, 0x45, 0xfd, 0xb4, 0xaf, 0x58, 0x6f, 0xbc, + 0x0c, 0xc0, 0x2a, 0x9e, 0xde, 0x7e, 0x01, 0x5d, 0x76, 0x58, 0xdb, 0x96, + 0xed, 0x67, 0xec, 0x26, 0xcd, 0x3f, 0xc4, 0xda, 0x1e, 0x47, 0x67, 0x99, + 0xf5, 0x4d, 0x9b, 0x36, 0x71, 0xe4, 0x48, 0xaf, 0x98, 0x31, 0x3b, 0xa7, + 0x4f, 0xf7, 0x15, 0x0e, 0x60, 0xf5, 0xd0, 0x10, 0xa7, 0x37, 0x6f, 0x5e, + 0x30, 0x4e, 0xbf, 0x53, 0xf6, 0xe5, 0xce, 0x77, 0x73, 0xfd, 0x3d, 0xcf, + 0x30, 0xfe, 0xef, 0xdf, 0x0d, 0x40, 0xe7, 0x1f, 0x42, 0xf7, 0x88, 0x03, + 0x53, 0xba, 0xdd, 0x1e, 0x4e, 0xb8, 0x46, 0x4c, 0xf9, 0xa1, 0xbf, 0x0d, + 0x9b, 0xea, 0x05, 0x9e, 0x3a, 0xe1, 0xc3, 0x3a, 0xa7, 0xdb, 0x7d, 0xa7, + 0x9f, 0x0c, 0xc8, 0xf2, 0x12, 0x26, 0x6e, 0x9d, 0x6f, 0x99, 0xeb, 0xcf, + 0xed, 0xb3, 0x0a, 0xd7, 0x94, 0x7f, 0x3a, 0x9c, 0x8c, 0x7b, 0xa8, 0x0e, + 0x87, 0x7f, 0x06, 0xa3, 0x4a, 0x79, 0x07, 0x9a, 0x7e, 0xe8, 0x7e, 0xad, + 0x32, 0x18, 0x2a, 0x66, 0x1b, 0x20, 0x1a, 0x70, 0x65, 0x59, 0x4d, 0x56, + 0x41, 0x20, 0x9f, 0x18, 0x87, 0x6b, 0x2a, 0x6c, 0x71, 0xca, 0x88, 0x8d, + 0xeb, 0x90, 0xf5, 0x13, 0x8c, 0xd7, 0x4f, 0x40, 0xde, 0x45, 0x0c, 0x8e, + 0xc1, 0x1c, 0x50, 0xd3, 0x93, 0x34, 0xae, 0x2e, 0xb3, 0xad, 0xa4, 0x27, + 0xa1, 0x9d, 0xa9, 0x52, 0x10, 0x1d, 0xb8, 0xae, 0x42, 0x6b, 0xd5, 0x08, + 0x22, 0x5f, 0x20, 0xf3, 0xc4, 0xc3, 0x70, 0x5d, 0x05, 0x4f, 0x23, 0xb3, + 0xb6, 0xfb, 0x70, 0xef, 0x1c, 0xd4, 0xbe, 0xed, 0x05, 0x5d, 0xb4, 0x4f, + 0xc6, 0xd2, 0x96, 0xcb, 0xc2, 0x4e, 0xe0, 0x9e, 0x06, 0x9c, 0x68, 0xa8, + 0x36, 0xaa, 0x23, 0xe0, 0x4e, 0x34, 0x2c, 0xcc, 0xe4, 0xdf, 0x80, 0xb5, + 0x22, 0xda, 0x0e, 0xd4, 0x54, 0x1f, 0xd2, 0x91, 0xc8, 0x6f, 0x8f, 0x03, + 0x65, 0xb8, 0x6c, 0x5a, 0x41, 0xa8, 0x3e, 0xb4, 0x85, 0xc9, 0x6f, 0xbc, + 0x4f, 0x87, 0x3b, 0xbc, 0xa4, 0x32, 0xcb, 0x5f, 0x7d, 0x1b, 0xcd, 0xc7, + 0xf7, 0x2d, 0x3d, 0xec, 0xfe, 0xbb, 0xc3, 0x0d, 0x63, 0xd7, 0x73, 0x3b, + 0x70, 0xff, 0xff, 0xfd, 0xad, 0xee, 0x48, 0xd9, 0x1e, 0xd7, 0x36, 0x03, + 0xd6, 0xaa, 0xe9, 0xbe, 0xb9, 0x81, 0x69, 0x7d, 0x7b, 0x3c, 0x19, 0xb6, + 0x15, 0x93, 0xe9, 0xd3, 0xd9, 0xfd, 0xe9, 0x5e, 0xee, 0xd7, 0xaa, 0x78, + 0x9f, 0xc2, 0x6b, 0x37, 0x71, 0xfb, 0x04, 0x55, 0xfd, 0xab, 0x96, 0xec, + 0x80, 0xe8, 0xee, 0xb9, 0x06, 0xf7, 0x2d, 0xbe, 0x44, 0x38, 0x1a, 0xda, + 0xd3, 0x4f, 0x07, 0x3f, 0x88, 0x97, 0xec, 0xee, 0x3b, 0x3e, 0xfd, 0xf7, + 0x96, 0x5f, 0x0b, 0x0c, 0xaa, 0x97, 0xdc, 0x0b, 0x81, 0x97, 0x15, 0x18, + 0xe5, 0x97, 0xd6, 0xac, 0xc2, 0x7b, 0xea, 0x7f, 0xf0, 0x45, 0xa0, 0x3c, + 0x98, 0x61, 0xd6, 0x10, 0xb5, 0x88, 0xa6, 0xf3, 0x85, 0x6a, 0x95, 0x15, + 0x2b, 0x56, 0xb0, 0xee, 0xba, 0xeb, 0x38, 0x71, 0xf4, 0x28, 0xcb, 0x81, + 0x9f, 0xf6, 0x80, 0x6b, 0x2d, 0x5b, 0xb6, 0x8c, 0x57, 0x9e, 0x7f, 0x9e, + 0x57, 0x9e, 0x7f, 0x9e, 0xf7, 0x5c, 0x77, 0x1d, 0x00, 0x3f, 0xac, 0x56, + 0x13, 0xf3, 0x32, 0xfb, 0x62, 0x9b, 0xf9, 0x8b, 0x7e, 0xca, 0x0b, 0x2f, + 0xbd, 0xc4, 0xfc, 0x45, 0x3f, 0xe5, 0x99, 0xa3, 0x47, 0x83, 0x6d, 0xbf, + 0x78, 0x9e, 0xf2, 0x1b, 0xcf, 0xcb, 0x6b, 0x09, 0xd3, 0x8f, 0xc6, 0x2b, + 0x15, 0xca, 0x73, 0x13, 0x54, 0x3f, 0x38, 0xca, 0xde, 0x4f, 0x14, 0xd8, + 0xf5, 0xbf, 0xec, 0x67, 0x74, 0x6b, 0x4e, 0xc1, 0xa0, 0xf2, 0x1a, 0x9a, + 0x38, 0x17, 0xb6, 0x11, 0xd2, 0x27, 0x02, 0xd4, 0x2a, 0xae, 0x72, 0x99, + 0x7c, 0xaa, 0x4e, 0x65, 0x75, 0x3e, 0xb8, 0xb7, 0x17, 0x48, 0x4a, 0x83, + 0x45, 0x1d, 0xde, 0x23, 0x37, 0x18, 0x82, 0x4e, 0x0c, 0x64, 0x6a, 0xdb, + 0xd6, 0x31, 0x0e, 0x3c, 0x74, 0x38, 0x11, 0x4c, 0x15, 0x87, 0x51, 0x99, + 0xf5, 0xea, 0x53, 0x35, 0xdc, 0x65, 0x19, 0xca, 0xa5, 0x12, 0x39, 0x57, + 0x30, 0x31, 0x5d, 0x65, 0xec, 0xda, 0x0a, 0xd3, 0xd3, 0x0d, 0x58, 0xe9, + 0x32, 0x76, 0x6d, 0x85, 0x6a, 0x5d, 0xdb, 0xcb, 0x65, 0x90, 0xad, 0x0e, + 0xa3, 0x1b, 0x7b, 0xc3, 0xe2, 0x84, 0x23, 0x91, 0xbe, 0x40, 0x38, 0x92, + 0xc6, 0x9c, 0xa4, 0x50, 0x2a, 0x21, 0x5b, 0x2d, 0x44, 0x2e, 0xc7, 0x68, + 0x45, 0x4d, 0xd2, 0xf3, 0xda, 0x32, 0x08, 0x17, 0xcf, 0x43, 0x3f, 0x90, + 0xad, 0xdb, 0x3e, 0x7a, 0x23, 0xfb, 0x0f, 0xee, 0xef, 0xda, 0xb7, 0x37, + 0xdf, 0xc0, 0x1d, 0x50, 0xfb, 0x70, 0xdd, 0x10, 0x66, 0x58, 0xab, 0xd7, + 0x22, 0x60, 0xad, 0x6a, 0xb5, 0x86, 0x9b, 0x73, 0x71, 0x73, 0x2e, 0x99, + 0x6c, 0x8e, 0x89, 0xc9, 0x09, 0x2a, 0xab, 0xcb, 0xfa, 0xde, 0xa8, 0x11, + 0x4e, 0x74, 0x7f, 0xb2, 0x67, 0x36, 0x01, 0x98, 0x6f, 0xbf, 0x0a, 0x28, + 0x98, 0xd3, 0x8f, 0xb4, 0xfb, 0x5c, 0xf5, 0xb6, 0xec, 0x9b, 0x38, 0x7b, + 0x0e, 0x36, 0xe2, 0xd3, 0x9d, 0x7f, 0x9e, 0xd2, 0x52, 0xc8, 0xbd, 0x99, + 0x7f, 0x6c, 0xfd, 0xbf, 0xaf, 0x29, 0x2d, 0xe7, 0x9a, 0x9e, 0x01, 0xe0, + 0xbf, 0x03, 0x97, 0xa2, 0x00, 0x5a, 0x00, 0x97, 0x00, 0xf6, 0x34, 0xd6, + 0x1f, 0x01, 0xbf, 0xdc, 0x7e, 0x95, 0x29, 0xa0, 0x70, 0x1e, 0x18, 0x40, + 0x6b, 0xae, 0x82, 0xef, 0xc6, 0x00, 0x57, 0x71, 0x84, 0x74, 0x52, 0xfb, + 0x62, 0x46, 0xf7, 0x5e, 0x1d, 0x80, 0x37, 0xcd, 0x2b, 0xf7, 0x48, 0x16, + 0x1a, 0x02, 0x7e, 0xf2, 0x2b, 0x61, 0xa9, 0xda, 0xdb, 0x8d, 0xfa, 0x05, + 0x6a, 0x25, 0xc5, 0x95, 0x4e, 0xf7, 0xf5, 0x2b, 0xb8, 0x5b, 0x75, 0x0c, + 0x80, 0x4a, 0xf1, 0xf1, 0x01, 0x2a, 0x28, 0x4c, 0x8e, 0x69, 0x91, 0x1a, + 0x26, 0xb4, 0x63, 0xa6, 0x97, 0x77, 0x4b, 0x41, 0xc5, 0x04, 0x93, 0x3d, + 0xc0, 0x5a, 0xaf, 0x17, 0x4c, 0xcb, 0x96, 0x3d, 0x7e, 0x55, 0xeb, 0xa3, + 0x85, 0x1f, 0x7f, 0xd2, 0x0b, 0x40, 0x5a, 0x66, 0x1d, 0x42, 0x90, 0x16, + 0xc0, 0xb1, 0xc9, 0xb0, 0xbf, 0x60, 0x03, 0xb3, 0x6c, 0x10, 0x56, 0x12, + 0x1c, 0x6b, 0xa1, 0xb0, 0x42, 0x83, 0x29, 0x0e, 0x1d, 0x53, 0xa5, 0x72, + 0xc7, 0x03, 0xaa, 0x3f, 0xfa, 0xc5, 0x5b, 0xaf, 0x07, 0xe0, 0xc6, 0xd1, + 0x5f, 0x63, 0xb8, 0xe8, 0x06, 0x65, 0x16, 0x07, 0x6a, 0x1d, 0xb6, 0xe0, + 0x57, 0x87, 0x2f, 0xaf, 0x70, 0xf8, 0x5d, 0xef, 0x84, 0x18, 0x10, 0xeb, + 0xf0, 0xef, 0x0b, 0x40, 0x50, 0xd9, 0x20, 0x99, 0x7e, 0xc2, 0x63, 0xa4, + 0xe8, 0x32, 0x51, 0x57, 0x20, 0x2d, 0xf7, 0xc9, 0x69, 0xbc, 0xf3, 0x00, + 0x91, 0x3f, 0x2f, 0x40, 0x2d, 0x5b, 0xed, 0x1a, 0xb7, 0x7d, 0xec, 0x4e, + 0xf6, 0x7d, 0x4d, 0xf5, 0xd9, 0x97, 0x04, 0xd4, 0x5a, 0x82, 0x5c, 0x11, + 0x82, 0x1f, 0x95, 0xb6, 0xe8, 0x65, 0x38, 0xa6, 0x4c, 0xd7, 0x38, 0x39, + 0x40, 0x15, 0xfc, 0x6d, 0x40, 0x19, 0x57, 0x78, 0x08, 0x87, 0x00, 0xa8, + 0xe5, 0x8a, 0x3c, 0x5e, 0x3b, 0x1e, 0x9e, 0x00, 0x98, 0xb2, 0x90, 0x3c, + 0x59, 0x03, 0xff, 0x0e, 0xbd, 0xb6, 0x8b, 0xea, 0x53, 0x7b, 0x38, 0x74, + 0x72, 0x37, 0x00, 0x77, 0x6d, 0xfd, 0xab, 0xae, 0xf0, 0x12, 0x89, 0x94, + 0x02, 0x1c, 0xb5, 0x74, 0xc3, 0xef, 0x39, 0x80, 0x23, 0x71, 0x35, 0xc8, + 0xd7, 0x93, 0x6a, 0xbd, 0xd7, 0x99, 0x20, 0x65, 0x0d, 0x21, 0xba, 0xe1, + 0x44, 0x75, 0x6f, 0x14, 0x37, 0x7b, 0x20, 0x9a, 0x3e, 0xcb, 0xed, 0x8a, + 0x12, 0xae, 0x93, 0xa7, 0xde, 0x36, 0xad, 0x5e, 0x05, 0x85, 0x65, 0x36, + 0x77, 0x93, 0x5f, 0x5e, 0x38, 0xc3, 0x96, 0x02, 0x70, 0x59, 0x00, 0x02, + 0xfd, 0x73, 0x90, 0x1f, 0x09, 0xb6, 0x77, 0xbc, 0x38, 0xdc, 0x77, 0x71, + 0x80, 0x6d, 0x17, 0x50, 0xeb, 0x3c, 0x28, 0x00, 0x75, 0x9d, 0xa4, 0x7f, + 0x40, 0x57, 0x2f, 0xca, 0xfa, 0x91, 0x19, 0x38, 0xb2, 0x17, 0x03, 0xb7, + 0x5a, 0x9c, 0xc6, 0x6e, 0xc7, 0x8d, 0xef, 0x62, 0x86, 0xbd, 0x9b, 0x60, + 0xef, 0xde, 0x0f, 0x00, 0xf0, 0xc8, 0x23, 0x70, 0x83, 0x86, 0x7e, 0x6d, + 0x9a, 0x19, 0x62, 0x66, 0x08, 0x66, 0xf4, 0x28, 0xda, 0x10, 0x30, 0x33, + 0x03, 0x33, 0x02, 0x7e, 0x2b, 0xff, 0x4e, 0x5e, 0xdc, 0xb3, 0x97, 0x11, + 0x60, 0xcb, 0x91, 0x99, 0x30, 0xce, 0x5e, 0xe8, 0x1a, 0xb5, 0x5b, 0x42, + 0xfa, 0xae, 0xfb, 0x0c, 0x1c, 0x7d, 0x15, 0xd8, 0x1c, 0xfa, 0x15, 0x8b, + 0x70, 0xcd, 0x5f, 0xc0, 0x35, 0x9b, 0xe0, 0xba, 0x07, 0x15, 0x48, 0xcb, + 0xe8, 0xc1, 0x07, 0xe1, 0xf3, 0xb7, 0x14, 0x01, 0xa8, 0x53, 0x57, 0x65, + 0x6c, 0xb6, 0x17, 0xfb, 0xdf, 0xef, 0x62, 0x72, 0xaf, 0xa8, 0xd0, 0xec, + 0xe3, 0x43, 0x0f, 0x36, 0x34, 0x4a, 0x4a, 0x09, 0x97, 0x97, 0x11, 0x27, + 0x6b, 0xaf, 0xdb, 0x73, 0xc7, 0xae, 0x8f, 0x0e, 0x19, 0x30, 0x93, 0x2f, + 0xbb, 0xc1, 0x58, 0x4e, 0xef, 0x78, 0xd1, 0x70, 0x02, 0xd9, 0xee, 0x86, + 0x62, 0xdb, 0x79, 0x5b, 0x30, 0xbe, 0x09, 0xff, 0xd5, 0x03, 0x5d, 0xf9, + 0x16, 0x42, 0xa8, 0x0f, 0x99, 0x2c, 0xe1, 0x39, 0xb0, 0x4c, 0x02, 0x96, + 0x9f, 0x8b, 0x0c, 0x04, 0xca, 0x11, 0x08, 0x5f, 0x7f, 0xa0, 0xc7, 0x87, + 0x8e, 0xaf, 0xee, 0x31, 0x5c, 0x47, 0xa5, 0xb5, 0x02, 0x0c, 0xfb, 0x70, + 0xaf, 0x03, 0x7b, 0xaf, 0x85, 0x2f, 0x1e, 0xd3, 0x50, 0x4f, 0x5f, 0xd2, + 0x40, 0x01, 0xb9, 0x84, 0x10, 0x54, 0xf4, 0xd8, 0xfd, 0xa4, 0x2e, 0x57, + 0x17, 0x19, 0xbd, 0xe7, 0x77, 0x84, 0xfa, 0x08, 0x0c, 0xea, 0x43, 0x30, + 0x20, 0x18, 0xd7, 0x71, 0x26, 0x90, 0xe4, 0x10, 0xdc, 0x9a, 0x77, 0xb9, + 0xd7, 0xf3, 0x14, 0x1c, 0x0b, 0xfd, 0x8c, 0xd6, 0x11, 0x14, 0x7c, 0xa9, + 0x7b, 0x4d, 0x52, 0x7d, 0x2c, 0xc7, 0xae, 0x4b, 0x61, 0xec, 0x99, 0xfd, + 0xea, 0x67, 0x95, 0xbe, 0xa4, 0x2c, 0x60, 0xd2, 0x87, 0x9d, 0xbf, 0xbb, + 0x93, 0x46, 0x53, 0x3f, 0x47, 0xf4, 0xd5, 0x07, 0x91, 0x84, 0x03, 0x8d, + 0x76, 0xd8, 0x03, 0xab, 0xf8, 0xea, 0x23, 0x01, 0x52, 0xaa, 0xfb, 0x31, + 0x08, 0x1f, 0xbf, 0xe6, 0x10, 0xb4, 0x82, 0x7b, 0x4a, 0x34, 0xb4, 0x2b, + 0xdc, 0x67, 0x07, 0x65, 0x4f, 0x79, 0xe9, 0xb4, 0xfa, 0xe6, 0x69, 0x70, + 0x68, 0x2f, 0x87, 0xc0, 0x3e, 0x92, 0xa4, 0xaf, 0xd2, 0x5b, 0x45, 0x43, + 0xb8, 0x7c, 0x98, 0x46, 0x52, 0xf0, 0x05, 0x2d, 0x0d, 0x45, 0x2a, 0x98, + 0x67, 0x23, 0x0e, 0x51, 0x58, 0xfd, 0x22, 0xa0, 0x37, 0x5b, 0xcf, 0x22, + 0x18, 0x7a, 0xcf, 0x4f, 0x78, 0xf6, 0xfb, 0x6f, 0xe5, 0x5d, 0x48, 0x9e, + 0x45, 0xa8, 0xe5, 0x3f, 0xaf, 0x0e, 0xd6, 0xdf, 0xf1, 0xf6, 0xd3, 0x54, + 0x5f, 0x9c, 0xa7, 0x2c, 0xd7, 0x85, 0xdb, 0xcf, 0x75, 0xf9, 0xcf, 0xab, + 0x81, 0xd3, 0x0c, 0x14, 0x96, 0xb3, 0xa6, 0x00, 0x2b, 0x56, 0xac, 0xe0, + 0xb9, 0xe7, 0x9e, 0x63, 0xf4, 0x0a, 0xb5, 0x3c, 0xa5, 0xa1, 0x55, 0x10, + 0x85, 0x48, 0x19, 0xf0, 0x95, 0x0d, 0x9e, 0x3a, 0xfb, 0xe2, 0x3c, 0xcb, + 0x39, 0x1b, 0xc0, 0xa7, 0x80, 0x08, 0xb0, 0xeb, 0xf5, 0xb0, 0x69, 0xd2, + 0x6c, 0x20, 0x60, 0x71, 0x9b, 0xb6, 0xdd, 0x20, 0xce, 0x9a, 0x35, 0xcc, + 0x37, 0xce, 0x06, 0x4b, 0x13, 0x66, 0xcd, 0x9a, 0x35, 0x81, 0xad, 0x35, + 0x6b, 0xd6, 0x00, 0x70, 0xea, 0xd4, 0x29, 0x96, 0x5f, 0x3c, 0x90, 0x98, + 0x0e, 0xdb, 0xb6, 0x59, 0x9a, 0xed, 0xf3, 0x8d, 0xb3, 0xe0, 0xbe, 0xa3, + 0xaf, 0x3a, 0x9f, 0x7c, 0xb2, 0x4a, 0xde, 0x75, 0xd5, 0xb3, 0x36, 0x29, + 0x29, 0x58, 0x1f, 0x05, 0x2a, 0xae, 0xec, 0x1e, 0xc7, 0xcc, 0x0c, 0xe6, + 0x90, 0x6d, 0xdd, 0x7f, 0xb0, 0xda, 0xb3, 0x96, 0x39, 0x17, 0x7c, 0x10, + 0xd9, 0x1c, 0xd0, 0x51, 0xf7, 0xfa, 0x22, 0xc3, 0xbe, 0xaf, 0xdf, 0xcb, + 0xd8, 0xe6, 0x2d, 0x3c, 0xf0, 0x67, 0x5f, 0xa6, 0xbc, 0x7a, 0x23, 0xee, + 0xca, 0x84, 0x71, 0x43, 0x27, 0x84, 0x68, 0x41, 0x47, 0x81, 0xb4, 0x9c, + 0x0e, 0xc8, 0x16, 0x88, 0x1c, 0x72, 0xae, 0x81, 0x18, 0xd4, 0xd0, 0x27, + 0x4f, 0x06, 0xeb, 0x72, 0xae, 0x41, 0xf9, 0xf2, 0x11, 0x84, 0xd3, 0xa1, + 0xe6, 0x35, 0x28, 0x91, 0xdc, 0x3f, 0xae, 0x94, 0xcb, 0x54, 0x4f, 0x4f, + 0x91, 0xcb, 0xe7, 0xe8, 0xcc, 0x49, 0x7d, 0xee, 0x47, 0x9f, 0xff, 0x0b, + 0x47, 0xed, 0x37, 0x97, 0x17, 0x74, 0xe6, 0xd4, 0x19, 0xd8, 0x98, 0xe9, + 0x20, 0xdc, 0x0c, 0x9e, 0xd7, 0x01, 0xc7, 0x02, 0x8e, 0x3b, 0xf6, 0x5d, + 0x99, 0xca, 0x6b, 0x66, 0x30, 0xc7, 0xf6, 0x8f, 0xdf, 0xc6, 0xc4, 0x53, + 0x51, 0xe0, 0x69, 0x34, 0x2c, 0x34, 0x9a, 0x2d, 0x4a, 0xf9, 0x02, 0x8d, + 0x39, 0xc9, 0xc8, 0xfb, 0x47, 0xa9, 0xd5, 0x34, 0x6c, 0x51, 0x9b, 0x17, + 0xb3, 0x3a, 0xbc, 0x93, 0x01, 0xc7, 0xa5, 0x31, 0xa3, 0xd6, 0xbd, 0xb9, + 0x16, 0xee, 0xa0, 0x8b, 0x37, 0xe7, 0x21, 0x9b, 0x2d, 0xc8, 0x15, 0x68, + 0x21, 0xe8, 0x7d, 0x87, 0xd8, 0x0d, 0x8d, 0x32, 0x10, 0xa8, 0x5e, 0x61, + 0x93, 0xc0, 0x53, 0xf6, 0x36, 0x29, 0x1b, 0xd4, 0x66, 0x1b, 0x34, 0xe6, + 0xa2, 0x00, 0xae, 0xa4, 0x7d, 0x26, 0x81, 0xb6, 0x6c, 0x5b, 0x7b, 0xf6, + 0x7f, 0x0d, 0x21, 0x0a, 0x11, 0x30, 0x55, 0x52, 0xf8, 0xb8, 0xcc, 0x36, + 0x7b, 0x7b, 0x6d, 0x76, 0x62, 0x51, 0x5b, 0x71, 0x9b, 0x36, 0x44, 0x2c, + 0x09, 0x8a, 0x05, 0x0a, 0x82, 0x55, 0x18, 0x2c, 0x75, 0xd9, 0xad, 0xcd, + 0x26, 0xe7, 0x2b, 0x5e, 0x56, 0x36, 0x58, 0xcb, 0x86, 0x98, 0x49, 0xd9, + 0x80, 0xb7, 0x56, 0x78, 0xe1, 0xe5, 0x1a, 0x17, 0x5f, 0xb4, 0x22, 0x48, + 0xd3, 0xc5, 0x17, 0xad, 0xe0, 0x85, 0x97, 0x6b, 0x5c, 0x72, 0x61, 0x29, + 0x02, 0xd5, 0x52, 0x6e, 0x1b, 0x5d, 0x9e, 0x2a, 0x55, 0xaa, 0x54, 0xa9, + 0x52, 0xa5, 0x4a, 0x95, 0x2a, 0x55, 0xaa, 0x54, 0xa9, 0x52, 0xa5, 0x4a, + 0x95, 0x2a, 0x55, 0xaa, 0x54, 0xa9, 0x52, 0xa5, 0x4a, 0x95, 0x2a, 0x55, + 0xaa, 0x54, 0xa9, 0x96, 0xaa, 0x37, 0xff, 0xac, 0x13, 0x90, 0x2a, 0x55, + 0xaa, 0x54, 0xa9, 0x52, 0xfd, 0xff, 0x56, 0x5b, 0xa1, 0x63, 0x4d, 0x31, + 0x4b, 0x02, 0x33, 0xc5, 0x41, 0x51, 0xf1, 0xb0, 0x66, 0xd9, 0x98, 0x5d, + 0x7c, 0x6a, 0x94, 0x6d, 0x5f, 0xfa, 0x32, 0x7c, 0x41, 0xdd, 0xbc, 0xe0, + 0xbb, 0xc8, 0xbe, 0xfa, 0xb1, 0x1d, 0x5f, 0x2e, 0x16, 0x67, 0xb1, 0x17, + 0xe2, 0x97, 0x02, 0xab, 0x5a, 0x28, 0x6c, 0x52, 0x7e, 0x17, 0x0b, 0x2b, + 0x7d, 0x19, 0x84, 0x2d, 0xb8, 0xdd, 0x5f, 0xd3, 0x5c, 0x28, 0x0d, 0x1d, + 0x26, 0x60, 0x6b, 0xe8, 0xbf, 0x6e, 0x83, 0x0b, 0x9f, 0x54, 0x2f, 0xdc, + 0x45, 0xdf, 0x99, 0xd7, 0x2f, 0xa2, 0x9b, 0x97, 0xf2, 0x85, 0x0e, 0x60, + 0x02, 0x79, 0xa8, 0x17, 0xa7, 0xed, 0xf7, 0xbe, 0x1d, 0xe5, 0x61, 0x9b, + 0x11, 0x25, 0x01, 0x45, 0xc8, 0x0c, 0x0a, 0x4e, 0xcc, 0x64, 0xc0, 0x51, + 0x40, 0x2a, 0x91, 0xd5, 0xb6, 0x45, 0xd4, 0xc6, 0xed, 0x07, 0x0f, 0x31, + 0xb2, 0x7a, 0x18, 0x80, 0x52, 0x56, 0xe0, 0xfa, 0x82, 0xfb, 0x3f, 0xb1, + 0x8d, 0x87, 0x9f, 0x98, 0x00, 0x47, 0x52, 0xca, 0x0a, 0xaa, 0x27, 0x1b, + 0x20, 0xe0, 0xf6, 0xfb, 0x0e, 0x50, 0x6d, 0xaa, 0x97, 0x47, 0x6f, 0xbf, + 0x4f, 0x4d, 0xe8, 0x69, 0x78, 0xc9, 0x65, 0xb8, 0xee, 0xb3, 0xbb, 0x82, + 0x70, 0x1f, 0xf9, 0xea, 0x01, 0x84, 0x0f, 0x95, 0xa1, 0x02, 0xb7, 0xdf, + 0x77, 0x80, 0x75, 0xe5, 0x75, 0xba, 0x8c, 0xcc, 0x17, 0x70, 0xa5, 0x06, + 0x89, 0xa9, 0x34, 0x4a, 0xe9, 0xa9, 0xf4, 0xf6, 0xcc, 0x8b, 0x55, 0x6a, + 0x6d, 0x19, 0x2f, 0xc8, 0x88, 0xbc, 0x66, 0x4b, 0xa5, 0x51, 0x42, 0x79, + 0x6d, 0x41, 0x4d, 0x82, 0xd3, 0xe5, 0xd1, 0x4b, 0x5d, 0x40, 0x2d, 0xc2, + 0xaf, 0xd2, 0xaa, 0x97, 0x69, 0x7b, 0x44, 0xfc, 0x64, 0x4d, 0xd5, 0xaf, + 0x51, 0xec, 0xbc, 0x46, 0x14, 0x55, 0x9a, 0x74, 0x91, 0x79, 0x6d, 0x89, + 0x9b, 0xd5, 0x93, 0x02, 0x1c, 0x02, 0xb8, 0x82, 0xd4, 0x5f, 0xa3, 0x6e, + 0x21, 0xa3, 0xc0, 0x05, 0x5f, 0x22, 0xb5, 0x0d, 0x37, 0x9b, 0x4f, 0xfc, + 0xb5, 0x44, 0x31, 0x88, 0x93, 0xb4, 0x5d, 0xf9, 0x97, 0xba, 0x7e, 0x2a, + 0x7d, 0x6a, 0x32, 0x94, 0x34, 0x2f, 0xf0, 0xf7, 0x08, 0x1b, 0x8f, 0x97, + 0x68, 0x6b, 0x89, 0xda, 0xb8, 0x61, 0x63, 0x00, 0xd4, 0x9a, 0x78, 0x6c, + 0x82, 0xf2, 0xda, 0x32, 0x23, 0xd7, 0x8e, 0x30, 0x72, 0xed, 0x08, 0xe5, + 0xb5, 0x2a, 0x5d, 0x23, 0xd7, 0x2a, 0x38, 0xc9, 0xce, 0xdd, 0x3b, 0x17, + 0xc8, 0x5b, 0xe8, 0xee, 0xa5, 0x5e, 0x71, 0x97, 0xa2, 0x85, 0xce, 0x6b, + 0x5b, 0xbd, 0x8e, 0xb3, 0x9c, 0xf5, 0x32, 0xba, 0x1d, 0xc6, 0x76, 0xdb, + 0x80, 0xac, 0xa5, 0xba, 0x17, 0x93, 0x10, 0x0a, 0x84, 0xd5, 0xf4, 0x3c, + 0x3c, 0x5f, 0x06, 0xbf, 0x24, 0x40, 0x96, 0x59, 0xb7, 0x97, 0x76, 0x18, + 0x03, 0xc6, 0x32, 0x71, 0xbd, 0x58, 0xbb, 0x6a, 0xf6, 0x63, 0xdb, 0xb0, + 0xdd, 0xc1, 0x24, 0x25, 0x08, 0xc0, 0x59, 0xfd, 0xba, 0xed, 0x89, 0x47, + 0xf1, 0xfd, 0x1a, 0x98, 0x96, 0xd9, 0x47, 0x3f, 0x4a, 0x2c, 0xcf, 0xd8, + 0x79, 0x5d, 0x7e, 0xef, 0x25, 0xb0, 0x3d, 0x19, 0xce, 0x34, 0x03, 0xfc, + 0xa0, 0xaf, 0x3d, 0xbd, 0xf1, 0xb2, 0x21, 0x58, 0x33, 0x96, 0xdf, 0x26, + 0xed, 0xbf, 0xd8, 0xbc, 0xbc, 0x5e, 0xf0, 0xad, 0x21, 0x92, 0xe1, 0x5a, + 0x0b, 0xd9, 0x30, 0x69, 0x38, 0x62, 0xb9, 0xfb, 0x85, 0x7b, 0x19, 0x3d, + 0xfa, 0xe8, 0xa3, 0x4b, 0xfa, 0xcd, 0x2c, 0xb2, 0x1d, 0x80, 0xed, 0xa7, + 0x55, 0xfd, 0x6a, 0xad, 0x5b, 0x0b, 0x3c, 0x16, 0x3d, 0xaf, 0xff, 0x66, + 0xea, 0x99, 0xc8, 0xfa, 0xfb, 0x86, 0xdf, 0x4d, 0xe7, 0x1f, 0xa2, 0x7e, + 0x3f, 0x6f, 0xba, 0xdb, 0x49, 0x86, 0x70, 0x9d, 0xab, 0x2d, 0xa3, 0xc3, + 0x8e, 0x82, 0x6b, 0x99, 0x5f, 0x12, 0x50, 0x2b, 0x09, 0x16, 0xb6, 0x90, + 0x46, 0x1c, 0xf5, 0x7b, 0xad, 0xda, 0xef, 0xa8, 0x5f, 0xdc, 0x1d, 0x4c, + 0x07, 0x7e, 0xac, 0xa6, 0xea, 0x57, 0x6b, 0x5d, 0x3e, 0x03, 0x4f, 0x9d, + 0x48, 0x36, 0xb6, 0xb2, 0x1c, 0xf4, 0xb4, 0xc4, 0x40, 0x0e, 0xb1, 0xaa, + 0xac, 0x67, 0x01, 0x86, 0x12, 0xc5, 0x75, 0x0a, 0xa8, 0x65, 0xcb, 0x00, + 0xb5, 0x2c, 0xb5, 0x56, 0x29, 0x3f, 0xa9, 0x27, 0xe4, 0x99, 0x75, 0x80, + 0xc9, 0x49, 0x68, 0x7a, 0x6a, 0x79, 0xec, 0x58, 0xf4, 0x67, 0xeb, 0xd8, + 0x31, 0x68, 0xce, 0x85, 0xdb, 0x86, 0x1f, 0x85, 0xc3, 0x8f, 0x26, 0x27, + 0x3d, 0xd4, 0xf6, 0x6e, 0xaf, 0x92, 0xce, 0x44, 0x5e, 0xb7, 0xa3, 0xdf, + 0x38, 0x04, 0x62, 0xe7, 0x82, 0x7d, 0xaa, 0x5e, 0xea, 0x17, 0xa8, 0xd5, + 0x15, 0xf6, 0x64, 0x55, 0xfd, 0x00, 0xde, 0x3f, 0x9a, 0x0c, 0xd4, 0xea, + 0x57, 0x57, 0xeb, 0xfc, 0xc4, 0x61, 0x5a, 0x4f, 0x9d, 0x50, 0xf5, 0xab, + 0x15, 0xe9, 0x87, 0xeb, 0xe3, 0xc2, 0xee, 0xdb, 0xd9, 0xee, 0xca, 0x15, + 0x61, 0xbf, 0xdc, 0xcd, 0x2e, 0x6d, 0xe2, 0x6e, 0x1c, 0xa2, 0xd5, 0xab, + 0xcf, 0x61, 0x87, 0x1b, 0xb9, 0xba, 0xbb, 0xff, 0x99, 0xe4, 0xa7, 0xd2, + 0x29, 0xfa, 0x76, 0x1b, 0x1b, 0xea, 0x3e, 0x23, 0xdc, 0x2e, 0xdb, 0x9e, + 0x9a, 0xb9, 0x69, 0xfd, 0xa4, 0x2f, 0x13, 0x27, 0xda, 0xf6, 0x4a, 0xc7, + 0x62, 0x92, 0x52, 0x2a, 0xb0, 0x56, 0xd7, 0x86, 0x8e, 0x09, 0x60, 0x41, + 0x8b, 0x5c, 0x84, 0x99, 0xec, 0xe6, 0x27, 0x1f, 0x87, 0x76, 0x3d, 0xc5, + 0xfd, 0xe2, 0xd7, 0xeb, 0xd1, 0x4b, 0xca, 0xfc, 0x7a, 0x0f, 0x96, 0xa2, + 0x99, 0xa0, 0x9a, 0xe4, 0x6f, 0xb6, 0x25, 0x01, 0x9e, 0xce, 0x27, 0x60, + 0x6b, 0x9e, 0x0b, 0x30, 0xb5, 0xff, 0xab, 0x97, 0xfd, 0x0a, 0x2b, 0x07, + 0xb3, 0xcc, 0xce, 0xbd, 0xcc, 0x3c, 0xaf, 0xf4, 0xdc, 0xdf, 0x89, 0xa3, + 0x47, 0x39, 0x61, 0x41, 0xaf, 0x8c, 0xca, 0xe5, 0x72, 0xf0, 0xb3, 0xe3, + 0x0a, 0x60, 0xea, 0xe8, 0x51, 0xa6, 0x8e, 0x1e, 0xed, 0x2b, 0x2f, 0x2f, + 0xbc, 0xf4, 0x12, 0x7f, 0x72, 0x0e, 0x79, 0xe9, 0x47, 0xfd, 0x94, 0x5d, + 0x3f, 0xf5, 0x02, 0xf0, 0xeb, 0xa7, 0x55, 0xfd, 0x1a, 0xc5, 0xaf, 0xd7, + 0xe2, 0x0f, 0xc7, 0x99, 0xfe, 0x9e, 0x6a, 0x5f, 0x0f, 0x1f, 0x3d, 0xcc, + 0x9e, 0xff, 0x72, 0x33, 0xe3, 0x0f, 0xb5, 0x38, 0x74, 0x69, 0x19, 0x31, + 0x37, 0x8e, 0xb0, 0x80, 0x5a, 0x5e, 0xdb, 0xc3, 0x6b, 0xc9, 0x00, 0xa8, + 0x25, 0x1c, 0x05, 0xd7, 0x2a, 0x14, 0x8a, 0x4c, 0x9f, 0x6e, 0x22, 0xe7, + 0x35, 0xec, 0x16, 0x81, 0xf4, 0x3d, 0x1a, 0xed, 0x66, 0x00, 0xe2, 0x8d, + 0xeb, 0xc0, 0x43, 0x0a, 0x48, 0x28, 0x84, 0x1b, 0x01, 0x68, 0x2d, 0xa4, + 0x86, 0x6e, 0x03, 0xbc, 0xe7, 0x3b, 0xb4, 0x3c, 0xc9, 0xe8, 0xfa, 0xf5, + 0x8c, 0x1f, 0xab, 0xc6, 0xe0, 0x22, 0x42, 0x41, 0xad, 0x5a, 0xe1, 0xb9, + 0x24, 0xb2, 0xbd, 0xef, 0x67, 0x85, 0xa3, 0xf2, 0x53, 0x7d, 0xaa, 0xa6, + 0xee, 0x31, 0x97, 0xa9, 0xf3, 0x77, 0x7c, 0x72, 0x9a, 0xf1, 0xc9, 0x69, + 0x3a, 0x52, 0xc7, 0x77, 0x64, 0x24, 0x4e, 0xc4, 0x86, 0x05, 0xd9, 0x8a, + 0xe7, 0xe5, 0xde, 0xaf, 0xee, 0x63, 0x7a, 0xba, 0x41, 0x6d, 0x56, 0xa5, + 0xb1, 0x36, 0xe3, 0x51, 0xa9, 0xb8, 0xac, 0xbf, 0x32, 0x0a, 0xd6, 0xf0, + 0xbc, 0x0c, 0x39, 0x21, 0x22, 0x40, 0x2d, 0x29, 0xa1, 0x52, 0xa9, 0x04, + 0x7e, 0xad, 0xb9, 0x16, 0xa5, 0x52, 0x99, 0xe6, 0xf3, 0x1e, 0xb5, 0xd3, + 0x2d, 0x98, 0x87, 0xe9, 0xd3, 0x4d, 0x1a, 0x67, 0x74, 0x7a, 0x62, 0xd7, + 0xeb, 0x85, 0xce, 0xeb, 0x54, 0x3f, 0x7f, 0x7a, 0x5a, 0x2f, 0xdf, 0xc6, + 0xe2, 0xf7, 0x48, 0xf1, 0xf3, 0x3a, 0xe9, 0x9e, 0xcb, 0xee, 0x7e, 0xad, + 0xb9, 0xca, 0x2c, 0x07, 0x34, 0x92, 0x31, 0x8e, 0x15, 0x0b, 0x15, 0x1c, + 0x81, 0xd6, 0x61, 0xfe, 0x6a, 0x42, 0xf0, 0xeb, 0x1d, 0x82, 0x76, 0x39, + 0x63, 0x85, 0x5d, 0x73, 0x55, 0x77, 0xe0, 0x57, 0x07, 0xa2, 0xfe, 0x85, + 0xd8, 0xb6, 0xc5, 0x24, 0xf5, 0xd8, 0x9c, 0x39, 0x8b, 0x2b, 0xb1, 0xfe, + 0xef, 0x42, 0x6d, 0xa6, 0xb0, 0x30, 0x94, 0x26, 0x99, 0xd2, 0x5c, 0x1f, + 0x13, 0xe2, 0x27, 0x01, 0xb5, 0xe2, 0x2a, 0x01, 0xa3, 0xb1, 0x34, 0x14, + 0x7a, 0xb8, 0x17, 0x92, 0x47, 0xc8, 0xc0, 0xdf, 0x82, 0x2e, 0xc7, 0x38, + 0xc0, 0x28, 0x7e, 0xcf, 0x95, 0x30, 0x96, 0x22, 0x06, 0xd4, 0xcf, 0x28, + 0xe3, 0x87, 0x3f, 0x80, 0x9d, 0x5f, 0x7e, 0xb8, 0xcf, 0x14, 0x45, 0x25, + 0xb2, 0x99, 0x00, 0xa0, 0x65, 0xfb, 0xc5, 0x75, 0xe3, 0xe8, 0xaf, 0x71, + 0xe3, 0xe8, 0xaf, 0x25, 0xda, 0xd8, 0xfb, 0xa7, 0x7b, 0x17, 0xdd, 0x4f, + 0xeb, 0xd2, 0x8d, 0xb8, 0x9b, 0x1b, 0xb8, 0x9b, 0x1b, 0xb4, 0x7c, 0x37, + 0xf2, 0x1b, 0x9f, 0x0b, 0x8f, 0xf3, 0xd2, 0xa5, 0xdd, 0x20, 0xad, 0xf2, + 0xf7, 0xce, 0x0d, 0x16, 0xd3, 0x17, 0x50, 0xab, 0x5d, 0x5b, 0xf8, 0x67, + 0x94, 0x2d, 0xa9, 0x1f, 0x04, 0x40, 0xad, 0x3b, 0x7f, 0xef, 0xce, 0xa5, + 0x27, 0x2a, 0xd6, 0x37, 0x1b, 0x73, 0xd7, 0x31, 0x9a, 0xd0, 0x86, 0x7b, + 0xb2, 0x49, 0x2e, 0x18, 0x8b, 0xd9, 0x02, 0x4e, 0x0d, 0x98, 0x8a, 0x85, + 0x69, 0xe0, 0x8a, 0xf8, 0x91, 0xa8, 0xcb, 0xd2, 0xa9, 0xe2, 0xf9, 0x0d, + 0x5a, 0x73, 0x2d, 0x5c, 0xa7, 0x80, 0xe7, 0x37, 0xc8, 0x0d, 0x76, 0x1f, + 0xb5, 0x9e, 0xef, 0xe1, 0x6a, 0xf8, 0x81, 0x72, 0xe7, 0x51, 0x67, 0xc8, + 0x7a, 0x14, 0x80, 0xaa, 0x40, 0xab, 0xd9, 0xc2, 0x8d, 0x80, 0xad, 0x32, + 0x54, 0x2e, 0x2b, 0xb3, 0x65, 0xed, 0x5d, 0xdc, 0xb5, 0xf5, 0xaf, 0xd8, + 0xfd, 0x50, 0xb5, 0xcb, 0xae, 0x19, 0xcb, 0x06, 0x34, 0xd8, 0x4b, 0x46, + 0xee, 0x29, 0x22, 0xeb, 0x3d, 0xfa, 0xb8, 0xc9, 0x98, 0xbb, 0x32, 0x02, + 0x03, 0xc4, 0xdc, 0x06, 0xfe, 0x5e, 0x5a, 0xcd, 0x86, 0x4e, 0x5f, 0x21, + 0x70, 0x7b, 0xb2, 0x46, 0x2e, 0x5f, 0xd0, 0xfe, 0x55, 0xc0, 0xdc, 0x40, + 0x4e, 0x07, 0x76, 0x3c, 0xbf, 0xa9, 0xf3, 0xdb, 0x4b, 0x05, 0x5a, 0x73, + 0x8d, 0x58, 0xde, 0xff, 0xdc, 0x72, 0x17, 0x75, 0x3d, 0xa9, 0x3e, 0x85, + 0x27, 0x3d, 0x5c, 0xe1, 0x06, 0x60, 0x96, 0xd1, 0xd3, 0xaa, 0x7e, 0x83, + 0x94, 0x2f, 0x30, 0x6e, 0x16, 0x57, 0xd1, 0x5a, 0x16, 0x63, 0xeb, 0x49, + 0xe1, 0x40, 0x03, 0xb5, 0x8a, 0x70, 0xdd, 0x57, 0x60, 0xe8, 0x88, 0xfa, + 0x5d, 0x77, 0x72, 0x81, 0x9d, 0x2c, 0x36, 0xe0, 0x65, 0x6f, 0x3f, 0x42, + 0x6f, 0x4a, 0xfc, 0x62, 0xd2, 0x76, 0x1e, 0x79, 0x44, 0xfd, 0x00, 0x86, + 0x86, 0x86, 0x18, 0x1a, 0x1a, 0xe2, 0xc8, 0x10, 0xc0, 0x0c, 0x43, 0xd6, + 0xa8, 0xd9, 0x23, 0x8f, 0xc0, 0x6f, 0x49, 0xe0, 0xe8, 0x0f, 0xe0, 0x28, + 0x4c, 0x5c, 0x1a, 0x8d, 0x7f, 0x9d, 0x54, 0x3f, 0xbe, 0xa4, 0x6d, 0x2f, + 0x05, 0xf8, 0x05, 0x1c, 0xfd, 0x12, 0xf0, 0x27, 0x61, 0xbc, 0x62, 0xb1, + 0xc8, 0x47, 0xfe, 0x02, 0xee, 0xbe, 0x1a, 0xae, 0xd3, 0xe9, 0x2b, 0xea, + 0xbf, 0x7a, 0x1d, 0x36, 0x6c, 0x80, 0xe3, 0xf5, 0x3a, 0xc7, 0x35, 0x09, + 0xad, 0x58, 0x04, 0x8e, 0xab, 0x78, 0x01, 0xbc, 0xac, 0x8f, 0x71, 0x33, + 0x00, 0xd1, 0x0b, 0x8c, 0x0d, 0x7d, 0x03, 0xb5, 0xba, 0xfc, 0x34, 0x50, + 0xcb, 0xc0, 0xa4, 0x7a, 0xc5, 0x7b, 0xad, 0xd0, 0xad, 0xe2, 0x60, 0x7e, + 0x61, 0x5b, 0x5d, 0x63, 0x56, 0x0b, 0xdf, 0xe9, 0x78, 0x5e, 0x73, 0xc1, + 0xed, 0x5d, 0xd6, 0x62, 0x79, 0x13, 0xae, 0x88, 0x8c, 0x9d, 0xbf, 0x61, + 0x8a, 0xf5, 0xc3, 0xed, 0xe7, 0x5c, 0x65, 0x5f, 0x7d, 0x24, 0x46, 0xf8, + 0xe1, 0x33, 0xa4, 0x8c, 0x3d, 0xd6, 0xa0, 0xdb, 0xba, 0x69, 0x14, 0x1e, + 0xb1, 0xe0, 0xc3, 0xbe, 0x63, 0xd0, 0x12, 0xd0, 0x92, 0x0a, 0xf7, 0xe2, + 0xfa, 0x92, 0x12, 0x92, 0x8a, 0x2f, 0xa9, 0x3a, 0x92, 0xba, 0x0e, 0x67, + 0x43, 0x6d, 0x8c, 0x2a, 0xbe, 0x02, 0x6d, 0xd9, 0xaa, 0xb6, 0x25, 0x13, + 0x42, 0x50, 0xca, 0xba, 0xb8, 0xc0, 0xe8, 0x40, 0x86, 0x8c, 0xa3, 0x46, + 0x14, 0x2a, 0x8e, 0x02, 0x7a, 0x15, 0x74, 0x5d, 0x75, 0x7c, 0x19, 0x74, + 0x9a, 0x2a, 0x0e, 0x8c, 0x16, 0x54, 0xda, 0x85, 0x49, 0xab, 0x23, 0x82, + 0xf6, 0x4c, 0x08, 0xd8, 0xfe, 0xd9, 0x3b, 0x58, 0x77, 0xd3, 0x36, 0x2a, + 0x95, 0x0a, 0xde, 0x5c, 0x83, 0x8c, 0x03, 0x63, 0x37, 0xdd, 0xca, 0xf6, + 0xcf, 0xdd, 0xc1, 0x6d, 0x9f, 0xdb, 0x09, 0xc0, 0xba, 0x2c, 0x8c, 0x08, + 0xf5, 0xab, 0xf9, 0x0a, 0x88, 0x6a, 0xda, 0x7d, 0xfb, 0xb0, 0xe9, 0xe8, + 0x0f, 0x09, 0xb9, 0x84, 0x47, 0x4a, 0x06, 0xc1, 0xba, 0xf8, 0xf5, 0x40, + 0xaf, 0x96, 0x7d, 0xc9, 0x88, 0x5e, 0xb5, 0xcf, 0xa2, 0x16, 0x90, 0x71, + 0x24, 0x23, 0x79, 0xb5, 0x74, 0xe9, 0x20, 0xe9, 0x04, 0x10, 0x2e, 0x50, + 0xd7, 0x99, 0x8e, 0x23, 0xc9, 0x01, 0x39, 0x00, 0x89, 0xba, 0x77, 0xb5, + 0xd2, 0x93, 0x71, 0x04, 0x25, 0x08, 0xca, 0x5e, 0xa5, 0x31, 0xfa, 0x9c, + 0x8b, 0x0f, 0x83, 0xa7, 0xeb, 0x7a, 0xe8, 0x3d, 0x3f, 0xe1, 0xcd, 0xdf, + 0xbf, 0x80, 0x77, 0xbc, 0x3d, 0xb9, 0x4d, 0x7f, 0x45, 0x4c, 0x71, 0xc9, + 0x3f, 0xaf, 0xe2, 0x02, 0x39, 0x9c, 0xb8, 0x7d, 0xa9, 0x7a, 0xc7, 0xdb, + 0x4f, 0x73, 0xf6, 0xc5, 0x79, 0x4e, 0x9d, 0x3a, 0xc5, 0xa9, 0x53, 0xa7, + 0x38, 0xf9, 0xbd, 0x27, 0x00, 0x82, 0xa5, 0x81, 0x5c, 0x19, 0x60, 0x14, + 0xc0, 0xda, 0x2b, 0xae, 0x0c, 0x40, 0x52, 0x67, 0x5f, 0x54, 0x24, 0xdb, + 0x81, 0xc2, 0xf2, 0x08, 0x88, 0xca, 0xe8, 0xd4, 0xa9, 0x53, 0x01, 0x84, + 0xea, 0xf5, 0xb0, 0x09, 0x04, 0x40, 0x2d, 0x03, 0xce, 0x1a, 0x28, 0x2c, + 0x0f, 0x7e, 0xc6, 0x96, 0xb1, 0x7b, 0xf6, 0xc5, 0x79, 0x56, 0xac, 0x58, + 0x11, 0xe4, 0xd9, 0x06, 0x74, 0x99, 0xfc, 0x9b, 0x7d, 0x1a, 0x9b, 0x36, + 0x94, 0xeb, 0xd4, 0xa9, 0x53, 0xac, 0xbd, 0xe2, 0xca, 0xc0, 0x96, 0xf1, + 0x5f, 0xb3, 0x66, 0x0d, 0x03, 0x85, 0xe5, 0x41, 0x3a, 0xcd, 0x7e, 0x3d, + 0x26, 0xe0, 0xc3, 0x61, 0x79, 0xdb, 0x6d, 0xf8, 0xe4, 0x93, 0xd5, 0x08, + 0x40, 0x4b, 0x64, 0x05, 0xa3, 0x57, 0x57, 0x68, 0xcc, 0xb5, 0xba, 0xfa, + 0xf3, 0x76, 0xb8, 0xce, 0x5c, 0x0b, 0x91, 0x15, 0x8c, 0x9f, 0x9c, 0x64, + 0xdb, 0x46, 0xf5, 0xa9, 0x8a, 0x96, 0x75, 0xcc, 0x05, 0xe7, 0x85, 0x9f, + 0x41, 0xb6, 0xa1, 0x7a, 0x72, 0x42, 0x3d, 0xb7, 0x8b, 0xd9, 0xb4, 0x41, + 0x53, 0xc2, 0xe9, 0x68, 0x58, 0x5c, 0x46, 0x41, 0xb4, 0x22, 0x01, 0x73, + 0x08, 0xa7, 0x43, 0xf9, 0xf2, 0x11, 0x86, 0xaf, 0x28, 0x53, 0x2e, 0xe6, + 0x91, 0x73, 0x0d, 0xdc, 0xac, 0x8b, 0x9c, 0x6b, 0x50, 0xb9, 0xc2, 0xf4, + 0xaf, 0x33, 0x14, 0xb2, 0x05, 0x8e, 0xcd, 0x4c, 0x52, 0x2e, 0x14, 0x01, + 0x68, 0xb4, 0xa3, 0xed, 0x48, 0x2e, 0x5b, 0xc0, 0x6d, 0x8b, 0xe0, 0xb9, + 0x7f, 0x43, 0x7a, 0x41, 0x9f, 0x4d, 0xbd, 0x0f, 0xa0, 0x40, 0x5e, 0x06, + 0xa8, 0x25, 0xfd, 0x0c, 0xc2, 0xcd, 0x20, 0x64, 0x2c, 0xad, 0x58, 0x79, + 0xf4, 0x43, 0x77, 0x47, 0x4a, 0xf6, 0x7d, 0xfd, 0xde, 0x30, 0xac, 0x39, + 0xa9, 0xb3, 0x99, 0xe8, 0xf0, 0xbb, 0x0f, 0x07, 0x1e, 0x3a, 0x40, 0x6e, + 0x10, 0x0e, 0xfd, 0xd7, 0x03, 0x61, 0xd8, 0xb9, 0x0e, 0xcc, 0x75, 0x28, + 0x64, 0x0b, 0x14, 0xb2, 0x61, 0xdf, 0x76, 0xe4, 0x9a, 0x75, 0x54, 0xae, + 0x59, 0x17, 0xd4, 0x83, 0x3b, 0xe8, 0x52, 0x28, 0x17, 0x68, 0x54, 0xad, + 0xfe, 0xa4, 0xdd, 0x86, 0x5b, 0xe7, 0x74, 0x5c, 0x06, 0x20, 0x15, 0x87, + 0x52, 0xd9, 0xdb, 0xed, 0x65, 0xd2, 0x36, 0xdb, 0xce, 0x42, 0x61, 0x16, + 0xf2, 0xb7, 0xf7, 0x93, 0x64, 0xab, 0x97, 0x1d, 0xb3, 0x4d, 0x88, 0x42, + 0x04, 0x00, 0xb6, 0x50, 0xda, 0xe3, 0xb0, 0xab, 0x78, 0x1e, 0x8c, 0xad, + 0xa4, 0xf8, 0x0a, 0x8c, 0xd5, 0x0d, 0xea, 0x8a, 0xcb, 0xb6, 0x1b, 0x87, + 0x73, 0xd5, 0x66, 0x27, 0x12, 0x61, 0x66, 0x67, 0xe6, 0xbf, 0xc3, 0x8b, + 0x2f, 0x3d, 0x97, 0xf8, 0x3b, 0x33, 0xff, 0x9d, 0x48, 0x38, 0xa3, 0xf8, + 0x39, 0x9d, 0x2a, 0x55, 0xaa, 0x54, 0xa9, 0x52, 0xa5, 0x4a, 0x95, 0x2a, + 0x55, 0xaa, 0x54, 0xa9, 0x52, 0xa5, 0x4a, 0x95, 0x2a, 0x55, 0xaa, 0x54, + 0xa9, 0x52, 0xa5, 0x4a, 0x95, 0x2a, 0x55, 0xaa, 0x54, 0xa9, 0xfa, 0x57, + 0x0a, 0xd5, 0x4a, 0x95, 0x2a, 0x55, 0xaa, 0x54, 0xa9, 0x7e, 0x56, 0x7a, + 0x28, 0x74, 0x76, 0x01, 0xaf, 0x12, 0xc0, 0x4f, 0x71, 0x7f, 0x1b, 0x60, + 0x55, 0x58, 0xd9, 0x3f, 0xf4, 0x29, 0xc9, 0x46, 0x3f, 0x61, 0xfb, 0xb1, + 0xbd, 0x98, 0x4d, 0x5b, 0xe6, 0xab, 0xc4, 0xf6, 0xbe, 0x96, 0xb2, 0xbf, + 0x7e, 0xd3, 0xb4, 0x94, 0xfc, 0xf6, 0x0a, 0xd7, 0xf0, 0x16, 0x87, 0x96, + 0x75, 0xc9, 0xaa, 0xdf, 0x13, 0xc7, 0xc3, 0x09, 0xb2, 0xe1, 0x0b, 0xe2, + 0x21, 0xe9, 0x2a, 0x83, 0x08, 0x7e, 0x61, 0x40, 0x09, 0x6e, 0x74, 0x7a, + 0x5c, 0xe2, 0x8b, 0xf4, 0x59, 0xc8, 0x14, 0x05, 0x72, 0x28, 0xc7, 0x89, + 0x93, 0x19, 0x46, 0xbe, 0x20, 0x70, 0x6f, 0xca, 0xa9, 0x37, 0xb0, 0xb3, + 0x76, 0xc0, 0xd8, 0x97, 0xb7, 0xf5, 0x8b, 0xad, 0x0d, 0x4f, 0x72, 0xff, + 0x27, 0xb6, 0xb1, 0xee, 0xb3, 0xbb, 0xb8, 0xed, 0x83, 0xd7, 0x23, 0xa4, + 0xa0, 0x6a, 0x26, 0xd6, 0xeb, 0x62, 0x28, 0xbb, 0x39, 0xee, 0x39, 0x76, + 0x8c, 0x82, 0x4e, 0xcf, 0xc4, 0xe9, 0x29, 0x05, 0xe0, 0xf2, 0x24, 0xfb, + 0xfe, 0xfa, 0x5b, 0x4c, 0x55, 0xa7, 0xb8, 0xfd, 0xbe, 0x03, 0x01, 0xa8, + 0xab, 0xbc, 0x56, 0x4f, 0x00, 0x72, 0x24, 0xd5, 0x93, 0x0d, 0xee, 0xff, + 0xc4, 0x36, 0x4e, 0x54, 0x4f, 0x80, 0x2f, 0xf8, 0xab, 0x8f, 0xdf, 0x8a, + 0xd0, 0x7f, 0x00, 0x38, 0xfa, 0x8b, 0xb0, 0xc2, 0x45, 0xf4, 0x91, 0x17, + 0xd9, 0x5e, 0xfc, 0x18, 0x69, 0x78, 0x92, 0x82, 0x2b, 0x28, 0xaf, 0x2d, + 0x04, 0x40, 0x30, 0x80, 0x72, 0x3e, 0x87, 0x88, 0x4f, 0xee, 0x33, 0xa5, + 0x63, 0x4d, 0x52, 0x5e, 0x14, 0xa6, 0x65, 0x83, 0xcf, 0x88, 0xd6, 0xaf, + 0x5d, 0xef, 0x9e, 0x04, 0x29, 0x9b, 0x76, 0x51, 0x82, 0x50, 0x60, 0xad, + 0x86, 0x1f, 0x42, 0x15, 0x82, 0x75, 0x5f, 0x85, 0xf3, 0xda, 0x4d, 0x3c, + 0x1f, 0x1a, 0x3e, 0x48, 0x47, 0xe0, 0xb5, 0x9b, 0xc1, 0x77, 0x66, 0xbd, + 0x76, 0xb3, 0xe7, 0x6f, 0xe1, 0xed, 0x35, 0x3c, 0x3d, 0x61, 0x2e, 0xee, + 0x0e, 0xd3, 0x56, 0x66, 0xb2, 0x4d, 0x24, 0x4c, 0xd2, 0x2f, 0xc8, 0x5f, + 0x82, 0x9f, 0xad, 0xa4, 0x6d, 0x77, 0xec, 0xbe, 0x03, 0xd7, 0x75, 0xb9, + 0x63, 0xf7, 0x1d, 0x40, 0x08, 0xcd, 0x32, 0x4b, 0x5b, 0x13, 0x8f, 0x4d, + 0x44, 0xdc, 0xb7, 0xfd, 0xee, 0xcd, 0xc1, 0xcf, 0x6b, 0x37, 0xb9, 0xed, + 0x77, 0x6f, 0xb6, 0xf6, 0xb5, 0xf0, 0x64, 0x95, 0xa4, 0x32, 0x69, 0xcc, + 0x35, 0x90, 0xed, 0x16, 0xb2, 0xdd, 0x8a, 0x94, 0xe1, 0x82, 0xea, 0x71, + 0x5e, 0xff, 0x6b, 0x93, 0x6c, 0xcb, 0xe0, 0x5c, 0x6a, 0x7a, 0x5e, 0xb0, + 0x6e, 0xbb, 0xe3, 0x61, 0xed, 0x30, 0x22, 0x2b, 0x16, 0x0d, 0x6f, 0xc2, + 0xc8, 0xb6, 0x82, 0x6e, 0xd9, 0xe1, 0xce, 0x65, 0xc2, 0x53, 0x70, 0xbd, + 0x90, 0x16, 0x24, 0xd1, 0xb2, 0xef, 0xf9, 0xe1, 0x3e, 0xed, 0xf0, 0xe7, + 0x2a, 0xbb, 0x7e, 0xab, 0x7f, 0xfb, 0x42, 0x64, 0xdb, 0xb9, 0x00, 0xa1, + 0x7e, 0x56, 0x4a, 0x4a, 0xe7, 0x91, 0xd8, 0x32, 0x0e, 0xc5, 0xda, 0x64, + 0xf9, 0xdb, 0xdb, 0x14, 0x88, 0x6b, 0x88, 0x4d, 0xda, 0xd7, 0x86, 0x6b, + 0xf5, 0x53, 0x1e, 0x0b, 0xc1, 0xb7, 0x00, 0x36, 0x6d, 0xda, 0xd4, 0xf5, + 0x5b, 0x8a, 0x36, 0x6f, 0xde, 0xcc, 0xa7, 0x3e, 0xfd, 0x69, 0x3e, 0xf5, + 0xe9, 0x4f, 0xb3, 0x79, 0xf3, 0x66, 0xee, 0xe9, 0x33, 0x9e, 0x5d, 0xbf, + 0x27, 0x12, 0x26, 0x65, 0x5e, 0x7f, 0x0c, 0xbe, 0xb5, 0x11, 0x3a, 0xff, + 0xf0, 0x0c, 0x9d, 0x7f, 0x78, 0x86, 0xbf, 0x99, 0x7a, 0x86, 0xeb, 0x8f, + 0x85, 0x20, 0xa8, 0x61, 0x47, 0xfd, 0x92, 0x64, 0xfb, 0xdf, 0xd3, 0xc3, + 0x6d, 0x6b, 0x9d, 0x93, 0xec, 0xb6, 0xc1, 0x56, 0x7b, 0xf4, 0xcf, 0x75, + 0xe0, 0x2c, 0xea, 0xe7, 0x3a, 0x51, 0xff, 0x3b, 0x7d, 0xf5, 0x8b, 0x6b, + 0x0f, 0x51, 0xff, 0x13, 0x3d, 0xdc, 0xb6, 0x7a, 0x85, 0x4f, 0xb2, 0x1f, + 0x0f, 0x73, 0x16, 0xc8, 0x3b, 0xea, 0x67, 0xbb, 0xff, 0x48, 0xbb, 0x01, + 0x76, 0xfa, 0xb0, 0x3d, 0x66, 0x2b, 0xef, 0xc0, 0x5d, 0x28, 0xff, 0xbc, + 0x03, 0xcf, 0x00, 0x7f, 0xa3, 0xdd, 0x7f, 0x0f, 0x7c, 0xcb, 0x0f, 0x6d, + 0x19, 0xdd, 0xe6, 0xc3, 0xcd, 0xda, 0xce, 0xcd, 0x96, 0xfb, 0x36, 0x3b, + 0x6d, 0x56, 0xfd, 0x9e, 0x68, 0x86, 0x13, 0x60, 0x1a, 0x4f, 0x4f, 0xc0, + 0xac, 0x82, 0x89, 0xb2, 0x52, 0x4f, 0xd4, 0x9e, 0xad, 0xaa, 0xdf, 0xca, + 0x22, 0x08, 0x90, 0x67, 0xaa, 0xc8, 0xc7, 0xd5, 0x75, 0x49, 0x14, 0xf5, + 0xe4, 0xe1, 0xda, 0x84, 0xfa, 0x41, 0x00, 0xd4, 0x6a, 0x3c, 0xf1, 0x30, + 0xae, 0xdf, 0xa2, 0x20, 0x3a, 0x01, 0x40, 0x2b, 0x77, 0x66, 0x82, 0xdc, + 0x99, 0x09, 0xb5, 0xee, 0x08, 0x70, 0x76, 0x22, 0xc4, 0xdf, 0x71, 0xf8, + 0x38, 0x34, 0x62, 0x97, 0x9e, 0xf1, 0xc7, 0xd5, 0xcf, 0x15, 0x75, 0xf0, + 0x47, 0x11, 0xe2, 0x04, 0xe3, 0x8f, 0x43, 0xc3, 0x02, 0x78, 0x1d, 0xbe, + 0x4c, 0x87, 0x71, 0x24, 0xd3, 0x89, 0x38, 0x1a, 0x80, 0x7b, 0x93, 0xbd, + 0x4b, 0x05, 0xc8, 0x17, 0xe0, 0xe8, 0x61, 0xa8, 0xd7, 0x7a, 0x87, 0x7b, + 0xbd, 0x74, 0xd7, 0x7e, 0xb5, 0x7c, 0x54, 0x81, 0x68, 0x6e, 0x77, 0xa2, + 0xbf, 0x2e, 0xc5, 0xfa, 0x5c, 0x81, 0x4a, 0x05, 0x78, 0xff, 0xa8, 0x95, + 0x8f, 0xa8, 0xec, 0xfa, 0x8d, 0xf7, 0xc3, 0xc3, 0x89, 0x52, 0xdd, 0xee, + 0xea, 0x93, 0x06, 0x36, 0x0c, 0x5e, 0xfb, 0xf5, 0x9f, 0xc0, 0x3a, 0xf1, + 0x78, 0x74, 0xa2, 0xd8, 0xc8, 0xd5, 0x39, 0xdc, 0x65, 0x1b, 0x19, 0xb9, + 0x3a, 0x17, 0x00, 0xb1, 0xcc, 0x4f, 0xfa, 0xb2, 0x6f, 0xf7, 0xc4, 0xe3, + 0xad, 0x60, 0xdd, 0xf8, 0x05, 0x65, 0x30, 0x17, 0x03, 0x50, 0xf6, 0xb8, + 0x1e, 0x1b, 0x1b, 0x46, 0xbd, 0x00, 0xcc, 0x49, 0x92, 0x52, 0x22, 0x3d, + 0x2b, 0x6f, 0xb2, 0x13, 0xbd, 0xee, 0xcb, 0x18, 0xc8, 0xcb, 0x17, 0x3d, + 0xd3, 0xa1, 0xf6, 0x1d, 0xd6, 0x51, 0xe5, 0x0a, 0x11, 0x99, 0x70, 0x6b, + 0xd7, 0xef, 0xf8, 0x0b, 0x09, 0xd0, 0x83, 0x78, 0xda, 0x7a, 0xb8, 0x5f, + 0x6f, 0x9d, 0x79, 0xf9, 0x15, 0x56, 0x5d, 0x78, 0x01, 0x70, 0x21, 0x00, + 0xff, 0x74, 0xea, 0x0c, 0xd5, 0x39, 0x75, 0x9c, 0x0e, 0x70, 0xc1, 0x92, + 0xd2, 0xb4, 0x1c, 0xf8, 0x61, 0xb5, 0xca, 0x0f, 0xab, 0x55, 0x5e, 0xa8, + 0x56, 0x59, 0xbe, 0x68, 0x8c, 0xa8, 0xde, 0xbd, 0x6c, 0x90, 0x8b, 0x5e, + 0x7a, 0x89, 0x5f, 0xd5, 0xeb, 0x5f, 0x04, 0x86, 0x07, 0xb3, 0xac, 0xbc, + 0x38, 0xbb, 0x50, 0xb4, 0x25, 0x6b, 0x29, 0xe5, 0xdb, 0x4f, 0xbd, 0xd8, + 0xf5, 0x6b, 0xb7, 0xe7, 0x13, 0x47, 0x5a, 0x94, 0xae, 0x10, 0xb8, 0x4c, + 0x20, 0xff, 0xa3, 0xe4, 0xd0, 0x43, 0x65, 0x26, 0x74, 0x7b, 0xbd, 0xed, + 0x64, 0xf7, 0x31, 0x51, 0x6b, 0x48, 0xdc, 0x9c, 0xa0, 0x71, 0x46, 0xd2, + 0x69, 0x83, 0x7c, 0x4b, 0xb8, 0xad, 0xa0, 0x27, 0x5e, 0xda, 0xf7, 0xce, + 0xb9, 0xdc, 0xe2, 0x30, 0x5e, 0xe1, 0xc8, 0x08, 0xa4, 0x4a, 0x4a, 0x2f, + 0x58, 0x4a, 0xe9, 0x31, 0x3e, 0xa9, 0x40, 0x02, 0xe3, 0x93, 0x93, 0x54, + 0x56, 0xe7, 0x91, 0xbe, 0x6a, 0x8a, 0x85, 0xd3, 0xa1, 0xd1, 0x54, 0x17, + 0x82, 0xd1, 0x8d, 0x65, 0x1d, 0x66, 0x3a, 0x62, 0xa3, 0xa5, 0xef, 0x27, + 0x27, 0x13, 0xe0, 0x05, 0x41, 0x9e, 0x66, 0x15, 0xb8, 0xb9, 0x5c, 0x76, + 0xc9, 0xb9, 0x50, 0xc8, 0xbb, 0x94, 0x37, 0x44, 0xe1, 0x8a, 0x87, 0xbf, + 0x3d, 0x89, 0xc8, 0x0a, 0x0c, 0xab, 0x56, 0xf6, 0x84, 0x7c, 0x84, 0x79, + 0x72, 0xb3, 0x82, 0x46, 0xb3, 0x49, 0xa7, 0xdd, 0x82, 0x5c, 0x86, 0xd2, + 0x4a, 0x97, 0xc3, 0x8f, 0x4d, 0xe3, 0xcd, 0xab, 0x63, 0xf7, 0xf0, 0x63, + 0xd3, 0x41, 0x78, 0xe9, 0x2b, 0x48, 0x4d, 0xa5, 0x12, 0x05, 0xc6, 0xc4, + 0x27, 0xc8, 0x37, 0x9f, 0xf7, 0xf0, 0x5a, 0x1e, 0x64, 0x74, 0x42, 0xde, + 0x22, 0x18, 0x5d, 0x5f, 0x21, 0x67, 0x41, 0x74, 0xed, 0xfa, 0xed, 0xe7, + 0xbc, 0x4e, 0xf5, 0xf3, 0xa3, 0x4b, 0x51, 0x40, 0xad, 0x1f, 0x01, 0xef, + 0x8c, 0xfd, 0x46, 0x88, 0x23, 0x73, 0xa2, 0xf5, 0x1b, 0xbf, 0xe7, 0x82, + 0x38, 0x72, 0x66, 0xa0, 0x27, 0xe8, 0xa9, 0x63, 0x01, 0xa6, 0x04, 0x10, + 0x9c, 0x2d, 0xda, 0x3f, 0xe9, 0x28, 0x7a, 0xd3, 0x3c, 0x34, 0x74, 0xb3, + 0xf7, 0xa3, 0x77, 0x0f, 0x04, 0xa7, 0xfd, 0x5f, 0x7c, 0x37, 0x79, 0x1f, + 0x6f, 0x9a, 0x87, 0x53, 0xdf, 0x9d, 0x67, 0xcd, 0x55, 0x03, 0xac, 0xb9, + 0x4a, 0xa5, 0xad, 0xc0, 0x00, 0x25, 0x60, 0xb9, 0x80, 0xc9, 0x1e, 0x80, + 0x8d, 0xeb, 0x1d, 0x58, 0xa7, 0x6f, 0x84, 0xc6, 0xad, 0xfe, 0x5c, 0x61, + 0x48, 0xa5, 0x6f, 0x3d, 0xd0, 0xd0, 0xec, 0x03, 0x93, 0x6e, 0x81, 0xb2, + 0x27, 0xb5, 0xcd, 0x48, 0xbe, 0x63, 0xe7, 0x94, 0xb4, 0x96, 0x93, 0x28, + 0x00, 0xd7, 0x62, 0x2a, 0xa1, 0xc6, 0x04, 0xbf, 0x18, 0x4b, 0x72, 0x23, + 0xe6, 0x5e, 0x6c, 0xa4, 0xb9, 0x6b, 0x44, 0x24, 0x0b, 0x1d, 0x01, 0xad, + 0xb6, 0xca, 0x43, 0xd9, 0x4a, 0x4b, 0xe4, 0x9e, 0x2b, 0x36, 0x96, 0x12, + 0x81, 0x69, 0x39, 0xea, 0x17, 0xd7, 0x3d, 0x9f, 0xbc, 0x71, 0xc1, 0xb4, + 0x2c, 0x0a, 0xcf, 0x72, 0xac, 0xdf, 0x12, 0x74, 0xc7, 0xef, 0xef, 0x65, + 0xc7, 0xa7, 0x77, 0x2c, 0x18, 0xc6, 0xc0, 0xad, 0xee, 0xde, 0xfc, 0x30, + 0x77, 0x6f, 0x4e, 0x86, 0x7f, 0x6d, 0xd9, 0x58, 0xa0, 0x68, 0x8d, 0xdd, + 0x7b, 0x97, 0x77, 0xc3, 0xb5, 0x7a, 0xd9, 0xee, 0xf5, 0x5b, 0x50, 0x71, + 0x68, 0xd6, 0x22, 0xe1, 0xb6, 0x7f, 0xf4, 0xe6, 0xae, 0xf0, 0x77, 0xff, + 0xe1, 0xb9, 0xc1, 0xb5, 0xec, 0xfa, 0x3d, 0xec, 0xf5, 0x80, 0x18, 0x03, + 0xad, 0x39, 0x0f, 0xfc, 0xde, 0x10, 0x57, 0x57, 0x14, 0xf0, 0xa4, 0x7d, + 0xac, 0x84, 0x40, 0x2d, 0xf4, 0xb8, 0x7d, 0x6e, 0x30, 0x87, 0xe7, 0x6b, + 0x78, 0xf1, 0x5c, 0xfc, 0xa8, 0x2d, 0xe3, 0x3a, 0x2e, 0x9e, 0xef, 0x01, + 0x05, 0x5c, 0x27, 0x8f, 0xe7, 0x37, 0x09, 0x51, 0x70, 0xea, 0x1a, 0x56, + 0xf7, 0x46, 0xf1, 0x64, 0x0d, 0x9c, 0x2f, 0xb2, 0x65, 0x2d, 0x1a, 0xa4, + 0xf5, 0x6e, 0x0e, 0x9d, 0xdc, 0xcd, 0xee, 0x87, 0x7e, 0x03, 0xd8, 0xad, + 0xed, 0xed, 0x26, 0x97, 0x2f, 0xe8, 0xb4, 0x85, 0xc0, 0x2c, 0xb3, 0x94, + 0xe6, 0x73, 0x05, 0xbe, 0x1a, 0xf3, 0xf6, 0xa4, 0x0a, 0xe3, 0x9e, 0xd3, + 0x2d, 0xc5, 0x6e, 0x4c, 0x8b, 0x56, 0xf7, 0xc6, 0x90, 0xb2, 0x86, 0x00, + 0x72, 0xf9, 0x42, 0xe0, 0x6e, 0x35, 0x1b, 0x2a, 0xdd, 0x81, 0x4c, 0x4b, + 0xa7, 0xf2, 0x15, 0xe6, 0xb7, 0xb7, 0x72, 0x83, 0x05, 0xcb, 0x46, 0x14, + 0xa8, 0x05, 0x77, 0xe3, 0x8a, 0x3c, 0xad, 0xb9, 0x16, 0x50, 0xc0, 0x15, + 0x79, 0x55, 0x1f, 0xd6, 0x33, 0x13, 0xbb, 0x7e, 0x23, 0x6d, 0x78, 0x31, + 0xba, 0x9f, 0x62, 0xcc, 0x5d, 0xb7, 0x96, 0xf5, 0xd8, 0xfa, 0x06, 0x2b, + 0x7c, 0x9d, 0x28, 0x70, 0xeb, 0x96, 0xa2, 0x82, 0x40, 0x15, 0x8b, 0xea, + 0xa7, 0x39, 0x50, 0xe7, 0xae, 0x25, 0x02, 0xab, 0xe2, 0xba, 0x4e, 0x2a, + 0x50, 0x95, 0x81, 0x69, 0x1d, 0xbd, 0x01, 0xbe, 0xb2, 0x2b, 0x1c, 0x25, + 0x9b, 0x99, 0x99, 0x51, 0x70, 0xf9, 0x19, 0x35, 0x62, 0x36, 0x33, 0x03, + 0x37, 0xdc, 0x00, 0xfc, 0x59, 0x68, 0x63, 0x88, 0x21, 0xbe, 0xb2, 0x6b, + 0x88, 0x1b, 0x6e, 0xd0, 0xdb, 0x8c, 0xed, 0xdf, 0x21, 0x84, 0x7d, 0xf5, + 0x0b, 0xfc, 0xb2, 0xc3, 0x1e, 0x01, 0x36, 0x41, 0xbd, 0x5e, 0xe7, 0xee, + 0xab, 0xe1, 0xce, 0xc7, 0x95, 0xf7, 0x2d, 0xb7, 0x40, 0x5d, 0xff, 0x15, + 0x81, 0xe2, 0x83, 0x70, 0xfc, 0xb8, 0xda, 0xf6, 0xe0, 0x83, 0x6a, 0xb9, + 0x61, 0x03, 0x40, 0x5d, 0x01, 0xb6, 0xb4, 0x16, 0x1a, 0x37, 0x5b, 0x68, + 0xfc, 0x55, 0x08, 0x81, 0xb8, 0xba, 0xbf, 0xf6, 0x2e, 0x49, 0xc1, 0xf8, + 0xef, 0x6b, 0x84, 0x66, 0xc5, 0x25, 0x44, 0x48, 0xb9, 0x8c, 0x3c, 0x13, + 0x5c, 0xd2, 0x7e, 0x12, 0xc2, 0x0a, 0x41, 0xa6, 0x8f, 0xeb, 0xf0, 0xd8, + 0x07, 0xb7, 0x33, 0xf6, 0xc1, 0xed, 0x89, 0xfb, 0x13, 0x42, 0x30, 0xfa, + 0x67, 0xf7, 0x07, 0x60, 0xad, 0xd0, 0x3f, 0xf9, 0x83, 0x13, 0x49, 0xeb, + 0xaf, 0x45, 0x91, 0xfa, 0xb5, 0x9e, 0x83, 0xb8, 0x79, 0x11, 0x40, 0x73, + 0x0c, 0xfc, 0xb8, 0xe3, 0xcb, 0xe0, 0x9e, 0x42, 0xe8, 0x67, 0x7c, 0x20, + 0xe9, 0x38, 0x92, 0xbb, 0x84, 0x20, 0x78, 0xda, 0xa3, 0x6f, 0xf7, 0xed, + 0xfb, 0x8f, 0xb2, 0x23, 0x28, 0x0a, 0x28, 0xea, 0x5b, 0x2d, 0xf3, 0x21, + 0xa1, 0x02, 0x2d, 0x0a, 0xb4, 0xa8, 0x62, 0xc6, 0x6a, 0xa2, 0x79, 0xbb, + 0x7b, 0x20, 0x13, 0xa4, 0x61, 0x5c, 0xdf, 0x93, 0xb8, 0x0e, 0x54, 0xa5, + 0xa4, 0x2a, 0x25, 0x2d, 0xfd, 0x43, 0xa7, 0x0f, 0x9d, 0xd6, 0x89, 0x33, + 0x76, 0x59, 0x76, 0xe7, 0xbb, 0xf9, 0x7c, 0x13, 0xb7, 0x50, 0x60, 0xf8, + 0xd2, 0x72, 0xd7, 0xb6, 0x46, 0xb3, 0x81, 0x04, 0x5c, 0x1f, 0x3c, 0x0b, + 0xa8, 0x58, 0x70, 0xc3, 0x6b, 0x58, 0x4e, 0xa8, 0xa7, 0x9d, 0x01, 0x38, + 0x4b, 0x84, 0xe0, 0x6e, 0x50, 0xa0, 0xad, 0x13, 0x8e, 0x8c, 0x82, 0xb5, + 0x24, 0x64, 0x50, 0x7d, 0xae, 0x29, 0x13, 0x36, 0x96, 0xb6, 0xbc, 0x0f, + 0x48, 0x95, 0xe7, 0xf8, 0xc7, 0x45, 0xb0, 0x60, 0x64, 0x2d, 0x9d, 0xdf, + 0x96, 0xde, 0xa3, 0x79, 0x06, 0x9a, 0x71, 0x04, 0x1d, 0x5f, 0xd2, 0xf0, + 0x65, 0x24, 0xfd, 0x40, 0xa4, 0x7e, 0xf9, 0xcb, 0xd0, 0xf9, 0xe6, 0xef, + 0x5f, 0xc0, 0xb3, 0x08, 0x2e, 0xf9, 0xe7, 0x55, 0x3c, 0x8b, 0xe0, 0x5d, + 0xc8, 0x60, 0x59, 0x15, 0x27, 0x28, 0xcb, 0x75, 0x5d, 0xfe, 0xaf, 0x65, + 0x09, 0x0a, 0x08, 0x35, 0x3a, 0x3a, 0x1a, 0x80, 0xa1, 0x8c, 0xe6, 0x1b, + 0x67, 0x23, 0x70, 0x2a, 0x03, 0x8c, 0x7a, 0xee, 0xb9, 0xe7, 0x58, 0x7b, + 0xc5, 0x95, 0x41, 0x5c, 0x13, 0x16, 0x08, 0x40, 0x53, 0x67, 0x5f, 0x9c, + 0x67, 0xed, 0x15, 0x57, 0x32, 0x3a, 0x3a, 0x1a, 0x00, 0xa6, 0x5e, 0x0f, + 0x9b, 0xa7, 0x4e, 0x9d, 0x0a, 0x00, 0x5d, 0x26, 0xae, 0x01, 0x84, 0xcd, + 0x37, 0xce, 0x46, 0xf2, 0x66, 0xc2, 0x40, 0x08, 0xf6, 0x9a, 0x6f, 0x9c, + 0x0d, 0x6c, 0x1a, 0xc8, 0xd7, 0x7c, 0xe3, 0x6c, 0xf0, 0x3b, 0xfb, 0xe2, + 0x3c, 0x6b, 0xd6, 0xac, 0x89, 0xc0, 0xbe, 0x9e, 0x7b, 0xee, 0xb9, 0xc0, + 0x5e, 0xbc, 0xbc, 0xec, 0x74, 0x24, 0xd5, 0xaf, 0x7d, 0x8e, 0xaf, 0xbf, + 0xb4, 0x4c, 0xad, 0x1e, 0xbd, 0xe3, 0x9a, 0x7a, 0xb2, 0x4a, 0x7d, 0xb6, + 0x19, 0xf4, 0x99, 0x65, 0x5b, 0x76, 0xf5, 0xcd, 0xa5, 0x9f, 0x21, 0x33, + 0x98, 0x8b, 0xb0, 0xaf, 0x0a, 0x06, 0x00, 0x2e, 0x3b, 0xe0, 0xa8, 0x9f, + 0x70, 0x3a, 0x94, 0x8a, 0x25, 0xc6, 0x36, 0x6c, 0x61, 0xdb, 0x4d, 0xdb, + 0xc9, 0x89, 0x0c, 0xb7, 0xfe, 0xf6, 0x27, 0xd9, 0xb8, 0x3e, 0x7a, 0x97, + 0x21, 0x9c, 0x0e, 0x99, 0xc1, 0x1c, 0x19, 0x37, 0xa7, 0x3f, 0x12, 0x96, + 0x8b, 0xec, 0xcb, 0x56, 0xab, 0x29, 0x81, 0x0c, 0x85, 0x7c, 0xf7, 0x87, + 0x9e, 0xa4, 0x0f, 0xb9, 0xbc, 0xa0, 0xd5, 0x90, 0x98, 0x0f, 0x09, 0xd8, + 0xe9, 0x9a, 0x9e, 0x9e, 0xa2, 0xd5, 0x6e, 0x50, 0xd3, 0xe3, 0x91, 0xea, + 0xfc, 0xe9, 0x58, 0xe3, 0xc2, 0xf1, 0x0f, 0x04, 0x64, 0x10, 0x0e, 0xe4, + 0x1c, 0x81, 0x14, 0x3a, 0x1d, 0xbe, 0x87, 0xf4, 0x33, 0xe4, 0xf2, 0x82, + 0xcc, 0x60, 0xc2, 0x87, 0xba, 0x74, 0xd7, 0x35, 0x67, 0x9a, 0xec, 0xb9, + 0x0e, 0x23, 0x97, 0x55, 0x18, 0x5e, 0x5d, 0x89, 0x7c, 0x2a, 0xad, 0x5a, + 0xab, 0x53, 0xb9, 0x7c, 0x3d, 0xf7, 0xfc, 0xc1, 0x3d, 0xac, 0x5f, 0xbf, + 0x9e, 0x9c, 0x0b, 0x39, 0xc7, 0x25, 0x97, 0x2f, 0x90, 0x19, 0xd4, 0xe7, + 0xbc, 0xf4, 0x40, 0x74, 0xc0, 0xf7, 0x74, 0x6a, 0x20, 0xef, 0xe7, 0x41, + 0x8f, 0xeb, 0xba, 0x08, 0xca, 0xe5, 0x12, 0x05, 0xfb, 0x5d, 0x05, 0x53, + 0xbf, 0x56, 0x9d, 0x4b, 0x37, 0x17, 0xf9, 0xd9, 0x7e, 0xc6, 0x6d, 0x2f, + 0xe3, 0x7e, 0xb6, 0x3f, 0x97, 0x16, 0x12, 0xc3, 0xc7, 0xe3, 0x25, 0xe9, + 0xbc, 0xdb, 0xb2, 0x40, 0x5c, 0x9e, 0x08, 0xdb, 0x47, 0xdb, 0x9d, 0x18, + 0xd7, 0x06, 0x66, 0x99, 0x72, 0xe9, 0x01, 0x08, 0xb3, 0xe3, 0x2c, 0x06, + 0x0b, 0x8b, 0x83, 0xb8, 0xe2, 0x7e, 0x03, 0x6f, 0x71, 0x79, 0xef, 0xe5, + 0xff, 0x8e, 0xa1, 0xb7, 0x8d, 0x31, 0xf4, 0xb6, 0x31, 0x96, 0x0d, 0x94, + 0x59, 0x35, 0x70, 0x4d, 0xe4, 0x77, 0xf1, 0x45, 0x2b, 0x58, 0x35, 0x70, + 0x0d, 0xff, 0x76, 0xf8, 0xa6, 0xc0, 0xcf, 0x76, 0x07, 0xb2, 0xea, 0x37, + 0x55, 0xaa, 0x54, 0xa9, 0x52, 0xa5, 0x4a, 0x95, 0x2a, 0x55, 0xaa, 0x54, + 0xa9, 0x52, 0xa5, 0x4a, 0x95, 0x2a, 0x55, 0xaa, 0x54, 0xa9, 0x52, 0xa5, + 0x4a, 0x95, 0x2a, 0x55, 0xaa, 0x54, 0xa9, 0x52, 0xf5, 0xaf, 0x25, 0xbe, + 0x42, 0x9c, 0x2a, 0x55, 0xaa, 0x54, 0xa9, 0x52, 0xa5, 0x3a, 0x6f, 0xd2, + 0x5f, 0x82, 0x95, 0x27, 0xfb, 0x03, 0x3d, 0x2d, 0xa4, 0xc6, 0xec, 0x39, + 0x40, 0x9f, 0xce, 0x71, 0x5f, 0xaf, 0xb7, 0x5e, 0x6b, 0x3a, 0xfa, 0x8d, + 0x6f, 0x26, 0x98, 0xf7, 0x13, 0xbe, 0xe0, 0x16, 0x68, 0xce, 0xf6, 0xf7, + 0x85, 0xe9, 0xa0, 0x3e, 0xb7, 0x02, 0xbf, 0xad, 0x9c, 0xeb, 0x36, 0xa8, + 0x37, 0x28, 0x9b, 0xb3, 0x1e, 0x62, 0x25, 0x84, 0x30, 0x2d, 0xa5, 0x0e, + 0xea, 0x2b, 0xca, 0x9e, 0x99, 0x1c, 0x27, 0x65, 0xe2, 0xdb, 0xdd, 0x91, + 0xb9, 0xe8, 0x00, 0x59, 0x89, 0x58, 0x26, 0x20, 0x0b, 0x8d, 0xef, 0xc0, + 0xc8, 0x17, 0x04, 0xfb, 0x57, 0x3d, 0xcc, 0xcd, 0x67, 0x6e, 0x54, 0x10, + 0xaa, 0x4c, 0x97, 0x09, 0x15, 0x57, 0x43, 0x67, 0xa4, 0x03, 0x7f, 0xfe, + 0xf1, 0x6d, 0xdc, 0x7e, 0xf0, 0x10, 0xf7, 0x03, 0x3b, 0x37, 0x6e, 0x84, + 0x8d, 0x70, 0xfb, 0x7d, 0x07, 0x68, 0xd0, 0x22, 0xe3, 0x64, 0x14, 0x0c, + 0x0b, 0x18, 0x59, 0x3d, 0x1c, 0x81, 0x6f, 0xa9, 0x72, 0x09, 0xd3, 0x68, + 0xdc, 0xb5, 0xb6, 0xc4, 0x4c, 0x95, 0x70, 0x7d, 0x11, 0xc0, 0xbb, 0x00, + 0x44, 0x56, 0xd9, 0x36, 0xef, 0x8e, 0x0a, 0xe1, 0x46, 0x21, 0x59, 0xcb, + 0x58, 0x30, 0x2f, 0xfd, 0x00, 0xb5, 0x4c, 0x5a, 0xdc, 0x7c, 0x8e, 0xaa, + 0x79, 0x21, 0x58, 0x97, 0x65, 0xb5, 0xd9, 0x5a, 0x74, 0x36, 0x93, 0x81, + 0xf2, 0xf4, 0x84, 0x69, 0x59, 0x6a, 0xce, 0xaa, 0x97, 0x59, 0xd7, 0x6d, + 0x70, 0xe1, 0x98, 0x7e, 0x5b, 0xd6, 0x3a, 0xaf, 0xab, 0x3e, 0x08, 0x91, + 0x07, 0x9a, 0xd4, 0x74, 0xdd, 0x8e, 0x66, 0x5d, 0x1a, 0x8e, 0x44, 0x06, + 0xf0, 0xaa, 0x26, 0x1e, 0x02, 0x37, 0x9b, 0x47, 0xb6, 0x9b, 0x94, 0x05, + 0x54, 0xc9, 0xe3, 0xb5, 0x9b, 0xb8, 0x8e, 0x44, 0xf8, 0x12, 0x10, 0x94, + 0x84, 0x88, 0x4c, 0x04, 0x75, 0xb3, 0xf9, 0x9e, 0x10, 0x28, 0x37, 0x5b, + 0x4a, 0x04, 0x5d, 0xb9, 0xd9, 0x52, 0xcc, 0xad, 0xc1, 0x5a, 0xbe, 0x60, + 0xd4, 0x15, 0x1c, 0xf2, 0x92, 0xe3, 0xf4, 0x82, 0x66, 0xd9, 0x61, 0x24, + 0xdd, 0x6d, 0x90, 0xd9, 0x9f, 0x89, 0x6f, 0x83, 0xb4, 0x0c, 0x30, 0xcb, + 0x2c, 0x93, 0xa0, 0x5a, 0xc6, 0x2f, 0x29, 0xec, 0xce, 0xdd, 0x3b, 0x23, + 0xd0, 0xad, 0x7e, 0x14, 0x2f, 0xb3, 0xc2, 0x60, 0x21, 0x98, 0x64, 0x61, + 0xde, 0x71, 0xee, 0x55, 0xa6, 0x91, 0xf3, 0xfa, 0x93, 0xca, 0x69, 0x9f, + 0xd7, 0x0c, 0xf5, 0x07, 0x36, 0xfc, 0x59, 0x2b, 0x7e, 0x0e, 0x2d, 0x76, + 0x4e, 0xf5, 0xda, 0xde, 0xcf, 0xb9, 0x18, 0x0f, 0x63, 0x03, 0xaf, 0xa4, + 0x94, 0xe7, 0x34, 0xe1, 0x47, 0x08, 0xd1, 0x3d, 0x71, 0x28, 0x1b, 0xae, + 0x47, 0xe0, 0x5e, 0xe7, 0x38, 0xe1, 0x2a, 0xe9, 0xbc, 0x2e, 0xbf, 0xf7, + 0x12, 0x00, 0xce, 0xcc, 0xb6, 0x83, 0x70, 0x66, 0x9a, 0xdc, 0xbf, 0x06, + 0x25, 0xa5, 0x75, 0xa6, 0x87, 0xdb, 0x0e, 0x3b, 0x43, 0x08, 0xc2, 0x32, + 0x7e, 0x47, 0xb4, 0x6b, 0x26, 0xe6, 0xdf, 0x4f, 0x59, 0x98, 0x30, 0xaf, + 0x47, 0xd9, 0x6d, 0xde, 0xbc, 0x19, 0x80, 0xff, 0xf3, 0xd3, 0x9f, 0x06, + 0x60, 0xb5, 0xde, 0xc7, 0xea, 0x99, 0x19, 0x4e, 0x0f, 0x25, 0xe3, 0xbc, + 0x4c, 0x7d, 0x96, 0xdf, 0x7b, 0x09, 0x8c, 0xeb, 0x7a, 0xd7, 0x5f, 0xf3, + 0x6e, 0x86, 0x55, 0x8d, 0xdc, 0xf9, 0x6e, 0xae, 0xbf, 0xe7, 0x19, 0xc6, + 0xff, 0xfd, 0xbb, 0x01, 0x05, 0xd7, 0x9a, 0xd0, 0xee, 0x61, 0x07, 0xa6, + 0x74, 0xfb, 0x9e, 0x04, 0xd6, 0xda, 0xe9, 0x87, 0x00, 0xad, 0x13, 0x7e, + 0x08, 0xca, 0xba, 0xd3, 0x8f, 0x82, 0xb2, 0x8c, 0x6c, 0x7f, 0xdb, 0x6d, + 0xc7, 0xfd, 0x9f, 0x51, 0xaf, 0x37, 0xba, 0xc8, 0xd4, 0xe7, 0xba, 0xb5, + 0xc0, 0xd3, 0xda, 0x9d, 0x57, 0x9d, 0xa4, 0xa6, 0x27, 0x99, 0x76, 0x5c, + 0xe4, 0x63, 0xd3, 0x94, 0xb6, 0x8e, 0x80, 0xf4, 0x10, 0xdf, 0x38, 0x1c, + 0x46, 0x7e, 0x7f, 0x9e, 0xa9, 0xbf, 0x3e, 0x4c, 0xbd, 0x58, 0xa2, 0xfc, + 0x9d, 0x03, 0x54, 0xbe, 0xb0, 0x57, 0xf9, 0x1f, 0xdc, 0x0f, 0x8f, 0xeb, + 0x2b, 0xf3, 0x4d, 0x0a, 0xdd, 0x35, 0x7d, 0x70, 0x1f, 0x8d, 0x4b, 0xb7, + 0xd0, 0x7c, 0xe8, 0x10, 0x1b, 0x7f, 0xef, 0x6e, 0x46, 0x2e, 0xad, 0x30, + 0x7e, 0xf3, 0xf5, 0xc1, 0x15, 0x52, 0x7c, 0x7c, 0x14, 0xf9, 0xd5, 0x7b, + 0x60, 0xb7, 0x0a, 0x9f, 0xff, 0x02, 0xe4, 0x81, 0x6d, 0xd7, 0xaa, 0xeb, + 0x49, 0x2e, 0x0b, 0x53, 0x8f, 0x7a, 0xec, 0x04, 0x3e, 0x72, 0x32, 0x84, + 0x18, 0xb9, 0x5f, 0x80, 0x0a, 0xb0, 0xfd, 0x77, 0x55, 0xb8, 0xea, 0x93, + 0x1e, 0x9d, 0x2f, 0x00, 0x4f, 0x6a, 0xc3, 0xdf, 0x1e, 0x27, 0x80, 0x63, + 0x19, 0xc0, 0x54, 0x5e, 0x02, 0xf7, 0xc0, 0x4c, 0x59, 0xed, 0xc4, 0xe8, + 0xd2, 0x29, 0x35, 0x87, 0xbc, 0xd6, 0x80, 0x21, 0x33, 0x59, 0xf0, 0x5e, + 0x10, 0x8b, 0x43, 0x63, 0x16, 0x52, 0xfe, 0xea, 0xdb, 0x68, 0x3e, 0xbe, + 0xaf, 0xbf, 0xc0, 0x77, 0xed, 0x87, 0xfd, 0x77, 0xc3, 0xda, 0xee, 0xc9, + 0x8a, 0x06, 0xb6, 0x15, 0xc8, 0x00, 0x71, 0x66, 0xaa, 0x56, 0x7a, 0x09, + 0xfd, 0x22, 0xf9, 0x50, 0xf5, 0x09, 0xba, 0x7e, 0x9b, 0x56, 0x7b, 0x0e, + 0x34, 0x9b, 0x4d, 0x44, 0x36, 0x1f, 0xc0, 0x99, 0x80, 0x88, 0xfb, 0xf5, + 0x90, 0xd7, 0x6e, 0xe2, 0x66, 0x7b, 0x97, 0xad, 0x7d, 0x2f, 0x62, 0x60, + 0x58, 0x23, 0x57, 0x1f, 0x63, 0xea, 0x7b, 0x9d, 0xae, 0x7b, 0x94, 0x78, + 0xd8, 0x85, 0xdc, 0xf6, 0x12, 0xf4, 0x7d, 0x0f, 0xc0, 0xac, 0x2a, 0x5f, + 0x39, 0x9b, 0x9c, 0x9e, 0x29, 0x6f, 0x52, 0x27, 0x1c, 0x84, 0x5b, 0xec, + 0xb6, 0x11, 0x73, 0x07, 0x69, 0x9c, 0x3d, 0xdc, 0x6d, 0x43, 0xdb, 0xe9, + 0x92, 0x15, 0x36, 0xe9, 0x4a, 0x6d, 0xa7, 0x01, 0xab, 0xec, 0x0c, 0x58, + 0x6b, 0xfa, 0x7b, 0xaa, 0x9f, 0xde, 0xd4, 0x20, 0x22, 0xfb, 0x7a, 0x3d, + 0x7a, 0x89, 0x3a, 0x16, 0xfe, 0xa9, 0x7d, 0xa6, 0xeb, 0x36, 0x48, 0xf5, + 0xa8, 0xa3, 0x32, 0x93, 0x81, 0x49, 0xd8, 0xb6, 0x50, 0x1a, 0xcf, 0x45, + 0x03, 0x5c, 0x60, 0x81, 0xb5, 0x20, 0x7b, 0xf1, 0x85, 0x0c, 0xcc, 0xbd, + 0xcc, 0x3c, 0xaf, 0x44, 0xa0, 0x5a, 0xbd, 0xd2, 0xda, 0xcf, 0xf6, 0x7e, + 0xf3, 0xf2, 0xc2, 0x4b, 0x92, 0x97, 0x2e, 0xba, 0x88, 0xe6, 0x4b, 0x2f, + 0x71, 0xdd, 0x65, 0xbf, 0xc2, 0x8f, 0x1b, 0x3f, 0xe4, 0x7f, 0xcc, 0xff, + 0x14, 0x20, 0x96, 0x92, 0xd7, 0xae, 0x73, 0xc9, 0x4b, 0xbc, 0x5e, 0xfe, + 0xa9, 0x7d, 0x06, 0x50, 0xf5, 0xfb, 0x80, 0x3e, 0xa6, 0xec, 0xeb, 0x75, + 0x65, 0x43, 0x8e, 0xe9, 0xe3, 0x1d, 0xca, 0xd7, 0x40, 0xa1, 0x50, 0x65, + 0xfc, 0xa1, 0x16, 0x87, 0xbe, 0x06, 0x5b, 0x3e, 0x56, 0xe2, 0x81, 0xaf, + 0x95, 0xb9, 0xf5, 0x63, 0x51, 0x9c, 0x4e, 0x65, 0x75, 0x1e, 0xaf, 0xed, + 0x01, 0x42, 0x81, 0x9c, 0x7e, 0xaa, 0xee, 0x53, 0xf3, 0x59, 0xc9, 0xf4, + 0xe9, 0x26, 0xa5, 0xc1, 0x62, 0x24, 0xbc, 0x2b, 0xa0, 0x5c, 0x49, 0x68, + 0xaf, 0x4c, 0x1a, 0x2d, 0x98, 0x96, 0x70, 0x64, 0xe2, 0x31, 0x53, 0x58, + 0x55, 0xa2, 0xe5, 0x49, 0x46, 0x2a, 0x65, 0x3a, 0xed, 0x16, 0x85, 0x41, + 0x41, 0xa7, 0xdd, 0x21, 0x93, 0xcd, 0xe1, 0xcd, 0x41, 0xce, 0x75, 0x19, + 0x9f, 0x9c, 0x66, 0x74, 0x7d, 0x85, 0xd1, 0xf5, 0x15, 0x6a, 0xb3, 0x92, + 0x8e, 0x04, 0x91, 0xcb, 0x91, 0xb3, 0xf9, 0x74, 0x06, 0x1e, 0xab, 0xfb, + 0xbf, 0x9e, 0x07, 0x8d, 0xa6, 0x47, 0x69, 0xa5, 0xa0, 0x5a, 0x97, 0x14, + 0xf4, 0xa4, 0x4e, 0x29, 0x3d, 0x6a, 0xc7, 0xef, 0x89, 0x00, 0xad, 0x0a, + 0x85, 0x30, 0x0f, 0xae, 0xab, 0xe2, 0x2e, 0x24, 0xaf, 0x2d, 0x99, 0x7a, + 0xa2, 0x46, 0xb9, 0xec, 0x22, 0xfd, 0x0c, 0x95, 0xa2, 0x02, 0x6a, 0x15, + 0xb2, 0x79, 0x2a, 0x15, 0x75, 0xef, 0x33, 0x76, 0x6d, 0x85, 0xea, 0xc9, + 0xd0, 0x90, 0x37, 0xdf, 0x20, 0x7a, 0xd1, 0xe9, 0x56, 0xb9, 0x5c, 0xa2, + 0xd1, 0x6c, 0x21, 0xcd, 0xbc, 0x66, 0x7d, 0x00, 0xb4, 0x3c, 0x0f, 0xec, + 0xeb, 0xb5, 0x9e, 0x0c, 0x6a, 0x9f, 0xd7, 0x6f, 0xb5, 0xec, 0xbc, 0x2d, + 0xfb, 0xa6, 0x85, 0x33, 0xf0, 0x06, 0xea, 0xe7, 0x25, 0x2d, 0xed, 0x9f, + 0xbe, 0xfa, 0x33, 0x4d, 0xcb, 0xbf, 0x03, 0x0c, 0x72, 0xe3, 0x9d, 0x96, + 0x7b, 0x0d, 0x70, 0x0a, 0xf8, 0x01, 0x61, 0x59, 0x25, 0x9d, 0xd7, 0x49, + 0xf7, 0x5c, 0x71, 0x35, 0x80, 0x8b, 0x81, 0xab, 0xae, 0x1a, 0xe8, 0xde, + 0xe8, 0xc0, 0x25, 0x03, 0xf0, 0xc3, 0x79, 0xcb, 0x4f, 0xc3, 0x1d, 0xca, + 0xc0, 0xab, 0xc0, 0xab, 0x03, 0x0a, 0x8e, 0x85, 0x76, 0xdb, 0xe3, 0x55, + 0x06, 0x56, 0xf5, 0x9b, 0x57, 0x25, 0xef, 0xfb, 0xd5, 0x01, 0x58, 0xbb, + 0x4e, 0xed, 0xf7, 0x94, 0x06, 0x6f, 0x5d, 0x7c, 0x15, 0xbc, 0xed, 0x19, + 0xf8, 0x3b, 0x19, 0x82, 0xb0, 0xd6, 0xeb, 0x56, 0xc0, 0xec, 0x6b, 0xe6, + 0xdf, 0x0c, 0xf0, 0xdf, 0xbf, 0x3b, 0xcf, 0x7a, 0x17, 0x46, 0x5d, 0x75, + 0xdb, 0x31, 0x96, 0x85, 0xda, 0x8c, 0xea, 0xfb, 0x4d, 0x02, 0xeb, 0xb3, + 0x80, 0x54, 0xb0, 0xab, 0x1a, 0xa6, 0x6d, 0x94, 0x01, 0x54, 0x0b, 0x42, + 0xe8, 0xd6, 0x68, 0x12, 0x6b, 0x54, 0xef, 0x73, 0x3d, 0x92, 0x49, 0x04, + 0x55, 0x9d, 0xe7, 0x9e, 0x72, 0x60, 0xda, 0x87, 0x52, 0x5b, 0xef, 0xbf, + 0x47, 0xb0, 0x73, 0x1d, 0x69, 0x96, 0x4e, 0x08, 0x79, 0x48, 0xbc, 0xe7, + 0x32, 0x7d, 0xb3, 0xba, 0xc7, 0xd8, 0x47, 0x8b, 0x1c, 0x7e, 0xcc, 0x0b, + 0x26, 0xeb, 0x8f, 0x5d, 0xa9, 0xb6, 0x1d, 0x7e, 0x22, 0x6c, 0x5b, 0xee, + 0x78, 0xe0, 0x5b, 0x4c, 0xdf, 0x77, 0x73, 0x97, 0xff, 0x96, 0x8d, 0xe1, + 0x38, 0xcc, 0xa1, 0x63, 0x8d, 0x9e, 0x7e, 0x38, 0xb0, 0xe5, 0x5a, 0xcb, + 0xff, 0xb1, 0x30, 0x67, 0x41, 0xf8, 0xc7, 0xd4, 0x62, 0x6a, 0x46, 0xd9, + 0x1f, 0x2e, 0xba, 0x4c, 0xd5, 0x3d, 0x1a, 0x7f, 0x90, 0x0c, 0xd4, 0x4a, + 0x82, 0x5a, 0xdd, 0xfc, 0xc9, 0xde, 0xf0, 0x29, 0xf9, 0xd5, 0x2a, 0xc3, + 0x1f, 0x2f, 0x33, 0xf9, 0x44, 0xc2, 0x46, 0x0b, 0xb0, 0xb5, 0x20, 0x2c, + 0xcb, 0x8c, 0xcd, 0x99, 0xb1, 0x3d, 0x7b, 0xac, 0xce, 0x1a, 0xef, 0xeb, + 0x0b, 0xa6, 0x15, 0xd3, 0xbd, 0xf7, 0xdd, 0xdd, 0x73, 0x9b, 0x81, 0x6b, + 0x2d, 0xa6, 0x66, 0xbd, 0x7b, 0x2c, 0x65, 0xcc, 0x55, 0x30, 0xe2, 0x46, + 0x6c, 0xac, 0xcd, 0x35, 0xf7, 0x1e, 0x4e, 0x0b, 0xa8, 0x81, 0xdf, 0x42, + 0x21, 0x94, 0x42, 0x79, 0xd2, 0xc3, 0x15, 0x2e, 0xaa, 0x7b, 0xbf, 0x4d, + 0xfb, 0x0a, 0xf0, 0xab, 0xc0, 0x34, 0xae, 0x33, 0xa6, 0x81, 0x4f, 0xe0, + 0x3a, 0xa6, 0x7e, 0x4d, 0xdd, 0xde, 0x0a, 0x54, 0xf1, 0x7c, 0x4f, 0xc1, + 0xa5, 0x98, 0xc0, 0xf3, 0x9b, 0xda, 0x7d, 0x48, 0x87, 0x29, 0x03, 0x2d, + 0xee, 0xda, 0x5a, 0x66, 0xf7, 0x43, 0x77, 0xe0, 0x66, 0x0f, 0x30, 0xd5, + 0x1c, 0xe7, 0xd0, 0x49, 0xb3, 0xed, 0x2e, 0x60, 0x37, 0x5b, 0xd6, 0xde, + 0x45, 0xa5, 0x32, 0xcc, 0xee, 0x83, 0x77, 0x61, 0xc0, 0x55, 0x9e, 0xd5, + 0xf7, 0xf6, 0x82, 0x7e, 0xb1, 0x01, 0xcb, 0x84, 0xfd, 0xd6, 0x2e, 0x00, + 0x4a, 0xa0, 0x02, 0xf1, 0x33, 0xcc, 0x00, 0xb0, 0x54, 0xff, 0xfa, 0x8f, + 0x22, 0xdb, 0x49, 0xa7, 0xfe, 0x0e, 0x00, 0x00, 0x20, 0x00, 0x49, 0x44, + 0x41, 0x54, 0xa4, 0x7f, 0x17, 0xc2, 0xb9, 0x9d, 0x56, 0x53, 0xc5, 0x11, + 0xa2, 0x64, 0x4a, 0x43, 0xb7, 0x13, 0xa6, 0xaf, 0xe3, 0xa1, 0x46, 0x38, + 0x37, 0x5a, 0xf9, 0xed, 0xa5, 0x86, 0x06, 0x91, 0x41, 0x14, 0xa8, 0x05, + 0xa0, 0xea, 0x3c, 0x37, 0x58, 0xa0, 0x36, 0x3b, 0x0d, 0x34, 0xf0, 0xa4, + 0x01, 0x6b, 0x1d, 0xa6, 0xd1, 0x56, 0x2d, 0xcc, 0x98, 0xbb, 0x8e, 0x7d, + 0x49, 0x6d, 0xb8, 0xd5, 0xff, 0x28, 0x5a, 0xcb, 0x22, 0x70, 0x3c, 0xe6, + 0x97, 0x24, 0xdb, 0xbf, 0x6e, 0x87, 0x2f, 0xc2, 0x83, 0xc7, 0x63, 0x81, + 0x37, 0x91, 0x0c, 0x9d, 0x3a, 0x62, 0x6d, 0x5f, 0x48, 0xbd, 0xe2, 0x2f, + 0xa0, 0x23, 0x3b, 0x60, 0xcf, 0x9e, 0xa8, 0xdf, 0x57, 0x76, 0x0d, 0x29, + 0x94, 0x96, 0x06, 0x69, 0x19, 0xcd, 0xcc, 0xc0, 0xde, 0xcf, 0xc0, 0x97, + 0xbe, 0x09, 0x9f, 0xf9, 0x00, 0xec, 0xf8, 0x12, 0x6c, 0xf9, 0x25, 0xd8, + 0x75, 0x04, 0x86, 0x76, 0x81, 0x09, 0xbd, 0xc9, 0x8c, 0x5b, 0xdd, 0x30, + 0x13, 0x40, 0xba, 0xae, 0x93, 0x0a, 0xb4, 0xb5, 0x30, 0xd6, 0x2f, 0x21, + 0x2f, 0x16, 0x58, 0xeb, 0x4e, 0xe0, 0xee, 0xab, 0xe1, 0x3b, 0xbf, 0x59, + 0x54, 0x14, 0xb2, 0x3a, 0x14, 0x35, 0x2d, 0xab, 0x5e, 0xac, 0xc3, 0xe7, + 0xe1, 0x96, 0x3a, 0x50, 0x84, 0xcf, 0xdf, 0x52, 0xe4, 0x78, 0x5d, 0xc3, + 0xb4, 0xb4, 0x5f, 0xbf, 0xe3, 0x66, 0x22, 0xeb, 0x46, 0x80, 0x6b, 0x46, + 0x72, 0x6d, 0x09, 0x1e, 0x9f, 0xee, 0xf2, 0x3f, 0x17, 0xf5, 0x1a, 0xe7, + 0x7d, 0xad, 0xc0, 0x2d, 0xe1, 0x08, 0xea, 0xed, 0x45, 0x3a, 0xc6, 0x3e, + 0x5d, 0x6f, 0x54, 0x25, 0xed, 0x56, 0x00, 0x8d, 0xb9, 0xee, 0xab, 0xa7, + 0x19, 0xcb, 0x16, 0xae, 0x20, 0x9f, 0xcd, 0x33, 0x35, 0xfd, 0x70, 0xe0, + 0x2f, 0x5c, 0x81, 0x9b, 0x75, 0xf1, 0xe6, 0xbc, 0x20, 0xdc, 0xf8, 0x6f, + 0xdd, 0xde, 0x2b, 0xb5, 0xc4, 0xef, 0x50, 0x93, 0x00, 0x5b, 0x76, 0x99, + 0xb8, 0x6e, 0x1e, 0xcf, 0x5b, 0xfc, 0xb9, 0x66, 0xd2, 0xb8, 0x99, 0xfd, + 0x9c, 0x6b, 0x5a, 0x37, 0xdb, 0xd2, 0xfc, 0x13, 0x20, 0x1d, 0xd1, 0x05, + 0xfb, 0x04, 0x05, 0xc2, 0xda, 0xed, 0xab, 0xce, 0x51, 0x0e, 0xf5, 0xec, + 0x33, 0x23, 0x14, 0xf4, 0xa9, 0x21, 0xc1, 0x75, 0x04, 0x9e, 0x94, 0xd4, + 0x10, 0xe4, 0x74, 0xd2, 0x32, 0xbe, 0xd0, 0x1f, 0xdf, 0x29, 0xe8, 0xbb, + 0x89, 0x06, 0x0d, 0x72, 0x91, 0xfc, 0x56, 0x6d, 0xd0, 0xb7, 0x23, 0x78, + 0xc0, 0xf3, 0x70, 0xb5, 0x5f, 0x0e, 0xf5, 0x1c, 0x52, 0xf8, 0x04, 0x60, + 0xa9, 0x8c, 0x23, 0x70, 0x81, 0xda, 0x22, 0xc7, 0x48, 0x46, 0xdb, 0x10, + 0x08, 0x36, 0xbe, 0x7f, 0x8c, 0x63, 0xc7, 0x8e, 0x29, 0x7f, 0x3a, 0x34, + 0x9a, 0x0d, 0xaa, 0x4f, 0x57, 0x71, 0x05, 0xd4, 0x64, 0x06, 0x49, 0x07, + 0xf4, 0x73, 0x5c, 0xaf, 0x1d, 0x05, 0xf0, 0xac, 0x73, 0x04, 0x2d, 0x14, + 0x38, 0xab, 0xe6, 0xe8, 0x3c, 0x4b, 0x19, 0xdc, 0xef, 0x64, 0x08, 0xb7, + 0xb7, 0x90, 0xe0, 0xa8, 0x74, 0xe3, 0xa8, 0xf0, 0x2d, 0x29, 0x23, 0x8f, + 0x85, 0x0b, 0x40, 0xd3, 0x81, 0x66, 0x3b, 0xbc, 0x21, 0x54, 0xcf, 0x54, + 0x40, 0x12, 0xc2, 0xc5, 0xa4, 0x8f, 0xaa, 0x07, 0x11, 0x42, 0xb4, 0x5a, + 0xc8, 0x20, 0x5f, 0x46, 0x75, 0x47, 0xe0, 0x22, 0x13, 0x9f, 0x73, 0xf1, + 0x61, 0xb5, 0x78, 0xe9, 0xe4, 0xbf, 0xf0, 0x2c, 0x17, 0xf7, 0x04, 0x60, + 0xf5, 0x02, 0x6a, 0x0d, 0xbd, 0xe7, 0x27, 0x3c, 0xfb, 0xfd, 0xb7, 0x9e, + 0x13, 0x58, 0xab, 0xfa, 0xe2, 0x3c, 0xcb, 0x39, 0xcb, 0xc9, 0x18, 0xc0, + 0x2a, 0x70, 0xa3, 0xfc, 0x6d, 0x20, 0xd5, 0x7c, 0x43, 0x85, 0x5f, 0xb3, + 0x66, 0x4d, 0x00, 0x9e, 0x02, 0xe0, 0xc5, 0x53, 0x91, 0x70, 0x27, 0xbf, + 0xf7, 0x44, 0x10, 0x37, 0x02, 0xc8, 0x3a, 0x8f, 0x36, 0x23, 0x69, 0xb5, + 0xf6, 0x63, 0xec, 0x18, 0x68, 0x97, 0x09, 0x03, 0x30, 0x3e, 0x3e, 0x1e, + 0x84, 0x39, 0x75, 0xea, 0x14, 0x03, 0xcf, 0x3d, 0x17, 0xc4, 0x33, 0xcb, + 0x81, 0xc2, 0xf2, 0x00, 0xd8, 0x65, 0xef, 0xc7, 0xf6, 0x37, 0x6e, 0x93, + 0x4e, 0xdb, 0xe6, 0x72, 0xce, 0xf2, 0x52, 0x73, 0x20, 0xac, 0x5f, 0xcd, + 0xdc, 0xb6, 0xdb, 0xf0, 0xc9, 0xa7, 0xab, 0xe4, 0x35, 0xdc, 0xba, 0xe9, + 0x79, 0x08, 0x29, 0x70, 0xad, 0x36, 0x65, 0xfd, 0xe5, 0xdd, 0xd0, 0xad, + 0xb1, 0x8f, 0x2a, 0x43, 0xad, 0xa6, 0x64, 0xcb, 0xb5, 0x1b, 0x03, 0xff, + 0xc8, 0x18, 0xa6, 0xaf, 0xc6, 0x40, 0x5c, 0x51, 0x20, 0xe3, 0x40, 0xc7, + 0x87, 0xdc, 0x20, 0x34, 0x9a, 0x6a, 0xac, 0xf3, 0xf0, 0xb1, 0x71, 0x4a, + 0x43, 0xc3, 0x11, 0x60, 0x96, 0x82, 0x65, 0x19, 0xb0, 0x55, 0xa6, 0x0b, + 0xa6, 0x65, 0xd6, 0x85, 0xd3, 0x41, 0xfa, 0x19, 0x1a, 0x73, 0xad, 0xe0, + 0x51, 0xbf, 0xbd, 0xad, 0x33, 0x07, 0x5b, 0xae, 0xdd, 0x48, 0x75, 0x36, + 0x1c, 0x07, 0x2a, 0x08, 0x97, 0x86, 0xec, 0x20, 0x34, 0x50, 0x59, 0x38, + 0x1d, 0x32, 0x7e, 0x06, 0x73, 0x66, 0x19, 0x9b, 0x71, 0x77, 0x20, 0x57, + 0x22, 0x67, 0x3a, 0xb8, 0x4e, 0x26, 0xe8, 0x57, 0x99, 0xf4, 0x02, 0x08, + 0xbf, 0x83, 0x24, 0xa3, 0x96, 0x4e, 0x86, 0xca, 0xa5, 0x15, 0x3a, 0x73, + 0x1d, 0x72, 0x83, 0x19, 0x3a, 0x73, 0x30, 0x35, 0xad, 0x9e, 0x63, 0x57, + 0x67, 0x1b, 0x41, 0x9a, 0xcb, 0xa5, 0x22, 0x07, 0xfe, 0xeb, 0x03, 0xac, + 0x5f, 0xbf, 0x9e, 0xc9, 0xc9, 0x49, 0x46, 0x3f, 0x38, 0x1a, 0xf4, 0xf3, + 0x32, 0x83, 0x19, 0x15, 0x56, 0xdf, 0x16, 0xb8, 0x83, 0x2e, 0x1d, 0x0d, + 0xe5, 0xbf, 0xf7, 0xaf, 0x0f, 0x00, 0x30, 0x7c, 0x59, 0x59, 0xc1, 0xa4, + 0x5b, 0x1e, 0xe5, 0xd5, 0x25, 0x9a, 0xdf, 0x53, 0x71, 0x83, 0xb1, 0x14, + 0x7d, 0x4e, 0x7f, 0xe7, 0xd9, 0x67, 0x11, 0xde, 0xbf, 0xa8, 0x72, 0x72, + 0x73, 0x08, 0xfd, 0x01, 0x04, 0xe1, 0xb5, 0x02, 0x68, 0x95, 0xb0, 0x3e, + 0x8a, 0x60, 0xfb, 0x99, 0xf0, 0x11, 0xb8, 0xd5, 0xd3, 0x8d, 0xae, 0x31, + 0x3c, 0x7b, 0x7b, 0x3c, 0x9e, 0xb1, 0xdd, 0xcb, 0x16, 0x09, 0x20, 0xaf, + 0x7e, 0x6d, 0x01, 0x70, 0xa9, 0xba, 0x07, 0x10, 0x4f, 0x37, 0xba, 0xc2, + 0x00, 0x7c, 0x76, 0xc3, 0xef, 0x03, 0xf0, 0xe5, 0x47, 0x3e, 0x17, 0x8d, + 0x17, 0xdb, 0x87, 0x6d, 0x8b, 0xa7, 0x1b, 0x0a, 0xf8, 0x35, 0x2b, 0x93, + 0xc3, 0x01, 0x62, 0xa5, 0x80, 0xd8, 0x3e, 0x7b, 0x96, 0xc5, 0x4a, 0xa1, + 0x6c, 0xbd, 0x02, 0x3f, 0x38, 0x7d, 0x86, 0x17, 0x5e, 0xae, 0x71, 0xc9, + 0x85, 0xaa, 0x2f, 0xff, 0xc2, 0xcb, 0x35, 0x5e, 0x7c, 0xe9, 0x39, 0x2e, + 0xbe, 0x68, 0x05, 0x00, 0x97, 0x5c, 0x58, 0xe2, 0x9d, 0xab, 0x57, 0xf1, + 0x83, 0xd3, 0x67, 0x38, 0x33, 0xff, 0x1d, 0x2e, 0xbe, 0x68, 0x05, 0xd3, + 0xcf, 0xa8, 0x30, 0x00, 0x27, 0x9f, 0xd5, 0x17, 0x5d, 0xeb, 0x9c, 0x4e, + 0x95, 0x2a, 0x55, 0xaa, 0x54, 0xa9, 0x52, 0xa5, 0x4a, 0x95, 0x2a, 0x55, + 0xaa, 0x54, 0xa9, 0x52, 0xa5, 0x4a, 0x95, 0x2a, 0x55, 0xaa, 0x54, 0xa9, + 0x52, 0xa5, 0x4a, 0x95, 0x2a, 0x55, 0xaa, 0x54, 0xfd, 0xeb, 0x7f, 0xe2, + 0x69, 0x99, 0xa9, 0x52, 0xa5, 0x4a, 0x95, 0x2a, 0xd5, 0xcf, 0xbf, 0x32, + 0x44, 0x41, 0x32, 0x91, 0x2f, 0x23, 0x2f, 0x01, 0x2e, 0x55, 0x58, 0x59, + 0xc0, 0x5b, 0x6c, 0x56, 0x64, 0x4c, 0xe7, 0xba, 0xaf, 0xf3, 0x25, 0xe9, + 0xcb, 0xf3, 0x37, 0x4b, 0xb9, 0xdf, 0xfd, 0x25, 0xb8, 0xfb, 0x51, 0xc3, + 0x5b, 0xda, 0x54, 0xb2, 0x78, 0xbd, 0x02, 0xf0, 0xe5, 0xee, 0x2f, 0xa7, + 0x9a, 0xd7, 0xae, 0x33, 0x40, 0xc3, 0x87, 0x9c, 0x03, 0xf9, 0x6c, 0x86, + 0x5a, 0x62, 0x55, 0x0a, 0x84, 0x94, 0x48, 0xfb, 0x45, 0xf9, 0x02, 0xea, + 0x2d, 0x6b, 0x07, 0x0a, 0xfa, 0x23, 0x95, 0x37, 0x9f, 0xb9, 0x11, 0xef, + 0x60, 0x0b, 0xe6, 0xac, 0x1d, 0x00, 0xe1, 0x94, 0xe5, 0x68, 0xde, 0x6f, + 0xbf, 0x4f, 0xbd, 0x84, 0x79, 0xfb, 0xc1, 0x43, 0x14, 0x80, 0xbb, 0x6e, + 0xda, 0xc2, 0xc4, 0xe9, 0x29, 0x4e, 0xfc, 0xf1, 0x1e, 0x6e, 0x3f, 0x78, + 0x28, 0x08, 0x57, 0x70, 0x05, 0xbb, 0x0f, 0x1e, 0xe2, 0x2e, 0x34, 0x7c, + 0x0b, 0xd8, 0x7d, 0xf0, 0x10, 0xc3, 0xe5, 0x61, 0x84, 0x0f, 0x9e, 0x23, + 0x39, 0x51, 0x3d, 0xc1, 0x70, 0x79, 0x98, 0xea, 0xc9, 0x86, 0x7a, 0xf9, + 0x3b, 0x0b, 0x25, 0xeb, 0x15, 0xcb, 0xfb, 0x6f, 0xda, 0x16, 0xec, 0x2b, + 0xc8, 0x95, 0x01, 0xe2, 0x38, 0x40, 0xb6, 0xdf, 0xbc, 0xf4, 0x90, 0x06, + 0x29, 0x44, 0x80, 0x5a, 0x71, 0x99, 0x97, 0xe8, 0x7b, 0x00, 0x7d, 0x16, + 0x84, 0x05, 0x25, 0xc1, 0xce, 0x12, 0xea, 0xd5, 0xae, 0x7f, 0x29, 0x9b, + 0x0a, 0x0a, 0x86, 0x9e, 0x58, 0x28, 0x65, 0x30, 0xd9, 0x20, 0x09, 0x8c, + 0x35, 0xd9, 0x96, 0x80, 0xf2, 0xf3, 0x7c, 0x11, 0xbc, 0xa4, 0x3b, 0xd9, + 0x06, 0x37, 0x1b, 0xc6, 0xe9, 0x05, 0x7f, 0x82, 0x10, 0x62, 0x65, 0x80, + 0x58, 0x66, 0x69, 0xdc, 0x26, 0x4c, 0xcd, 0x09, 0xa7, 0xb1, 0x4f, 0xe8, + 0x89, 0xe5, 0xbd, 0x6c, 0x25, 0xc9, 0xb6, 0xdb, 0x0f, 0x20, 0xe9, 0x8b, + 0x77, 0x7d, 0x11, 0x80, 0xca, 0xe5, 0x15, 0xa6, 0x9f, 0x9c, 0xc6, 0x1d, + 0x0c, 0x27, 0x0b, 0x4e, 0x3f, 0x3d, 0xcd, 0xf6, 0x4f, 0x6c, 0xe7, 0xde, + 0xfb, 0xee, 0x0d, 0xfc, 0x2a, 0x97, 0x56, 0x98, 0x7e, 0x3a, 0x9c, 0x78, + 0x23, 0xf5, 0x17, 0x78, 0x27, 0x8f, 0x5b, 0xb0, 0x86, 0x20, 0x2d, 0x79, + 0xe4, 0x02, 0x53, 0xc5, 0x54, 0x5e, 0x9a, 0x41, 0xd8, 0x85, 0xca, 0xaf, + 0x97, 0xfa, 0x3d, 0xaf, 0x7f, 0x9e, 0xb5, 0xd4, 0x89, 0x46, 0xe7, 0x32, + 0x31, 0xa9, 0xdf, 0x49, 0x4e, 0x52, 0x4a, 0x46, 0xaf, 0x1c, 0x61, 0xfc, + 0x89, 0xa5, 0xc1, 0xd1, 0x92, 0xec, 0xd8, 0xc7, 0xdf, 0x6b, 0x9d, 0x4c, + 0x05, 0x24, 0xd7, 0xeb, 0xbd, 0xab, 0x23, 0xab, 0x6f, 0x34, 0x50, 0x2b, + 0x09, 0x0b, 0xb5, 0x58, 0x1a, 0x0c, 0xbc, 0x6a, 0x29, 0x69, 0x5d, 0x08, + 0xbe, 0xd5, 0xcf, 0x3e, 0xcf, 0x65, 0x1f, 0xe7, 0x43, 0x8f, 0x3e, 0xfa, + 0xa8, 0x72, 0x0c, 0x0d, 0x31, 0xb4, 0x7a, 0x35, 0xaf, 0x02, 0x6f, 0x7a, + 0xf4, 0x51, 0x7e, 0x07, 0xd8, 0xb9, 0x50, 0xc4, 0x58, 0xbd, 0x02, 0x70, + 0x6d, 0xb4, 0xfe, 0xff, 0x66, 0xea, 0x19, 0xae, 0x3f, 0x16, 0xae, 0xbf, + 0x6f, 0xf8, 0xdd, 0x4c, 0x3c, 0xfb, 0x03, 0xc4, 0xbb, 0xde, 0xf9, 0x1a, + 0x53, 0x7d, 0x6e, 0xb2, 0x61, 0x5c, 0x36, 0x68, 0xeb, 0xee, 0x1e, 0xee, + 0x5e, 0x71, 0xe3, 0xf1, 0x7b, 0x41, 0xbb, 0xfa, 0xd9, 0x5f, 0x2f, 0x9b, + 0xc3, 0x3d, 0xdc, 0xf7, 0xf4, 0x70, 0xdb, 0xba, 0xd7, 0xf2, 0x7f, 0x9f, + 0xe5, 0xbe, 0xbe, 0x47, 0xf8, 0x7d, 0x96, 0xff, 0xfe, 0x98, 0x7b, 0x04, + 0xba, 0xea, 0x15, 0x80, 0xcb, 0xd6, 0x05, 0xce, 0xf2, 0xe6, 0x8a, 0xea, + 0x21, 0x3d, 0x74, 0x58, 0xf5, 0x49, 0xbc, 0x16, 0x6c, 0xdd, 0x42, 0xf5, + 0x6b, 0x5f, 0x66, 0x18, 0x97, 0xba, 0x68, 0x52, 0xf9, 0xdc, 0x5d, 0x2a, + 0xf0, 0xc1, 0xfd, 0xa1, 0x0d, 0x0b, 0xa8, 0x55, 0x01, 0xaa, 0x4f, 0x8f, + 0xb3, 0xe5, 0x63, 0x7a, 0x56, 0xc3, 0xd7, 0x42, 0xc8, 0x94, 0xf8, 0xd8, + 0x76, 0x26, 0xbf, 0x7a, 0x0f, 0x55, 0x5c, 0xc6, 0xb4, 0x5f, 0xa6, 0x00, + 0x77, 0x0d, 0x85, 0x40, 0x2d, 0x80, 0x7d, 0x9b, 0x5d, 0x76, 0x3c, 0xe9, + 0x05, 0x30, 0x11, 0x80, 0x4c, 0x0e, 0xf6, 0x5e, 0x1e, 0x5e, 0x33, 0x8d, + 0x7b, 0xf8, 0x49, 0x73, 0xdd, 0x33, 0xd7, 0xce, 0xed, 0x18, 0x60, 0x26, + 0xcd, 0x2d, 0x6a, 0x79, 0xe9, 0x7e, 0xf0, 0xd4, 0xa4, 0x46, 0x86, 0xc6, + 0x55, 0x37, 0xf0, 0xdb, 0x65, 0x78, 0xff, 0xa8, 0x86, 0x5a, 0x19, 0xe4, + 0x42, 0x6f, 0x08, 0x40, 0x3f, 0xea, 0x1b, 0xa8, 0x65, 0x34, 0x53, 0x83, + 0xa1, 0x52, 0xb4, 0x5f, 0xb5, 0x58, 0xfb, 0x3d, 0xa3, 0x27, 0x44, 0xd5, + 0xac, 0x3e, 0xde, 0xfb, 0x47, 0xa1, 0x58, 0x52, 0x30, 0xb1, 0xa2, 0xae, + 0x63, 0xab, 0x5e, 0x03, 0x59, 0xed, 0xba, 0x0d, 0xd1, 0x7a, 0xbd, 0x81, + 0x5a, 0xf6, 0xd2, 0x76, 0x0b, 0x6b, 0x72, 0x63, 0xdc, 0x3d, 0xf5, 0xbd, + 0x4e, 0x97, 0x7f, 0xaf, 0xb0, 0x0b, 0xb9, 0x93, 0xfc, 0x46, 0x5c, 0xd5, + 0x87, 0x17, 0x79, 0x0d, 0xde, 0x69, 0x86, 0x13, 0x7f, 0x26, 0xbc, 0x63, + 0x30, 0xa4, 0x8f, 0x1b, 0x47, 0x42, 0xf3, 0x44, 0xdf, 0xfb, 0x18, 0x76, + 0x15, 0x8e, 0x63, 0xca, 0x9b, 0x84, 0x95, 0x63, 0x61, 0xb8, 0xac, 0x3a, + 0x56, 0xa5, 0x99, 0xa4, 0x3c, 0x7b, 0x38, 0x08, 0x0b, 0x20, 0xf4, 0x64, + 0x23, 0xa9, 0x27, 0x20, 0x45, 0xe2, 0x67, 0x81, 0xd9, 0xa9, 0x58, 0xfe, + 0x89, 0x2a, 0xe1, 0x7a, 0xfd, 0xdf, 0x12, 0x9a, 0x75, 0xe8, 0x0d, 0x76, + 0xea, 0xbe, 0x3b, 0x7a, 0x7d, 0xf4, 0xab, 0xd7, 0xbd, 0x17, 0x80, 0x7f, + 0x38, 0xfa, 0xb7, 0x70, 0xea, 0x4c, 0xe0, 0xff, 0x6b, 0xd7, 0xa9, 0x3a, + 0x99, 0x3a, 0x7a, 0x34, 0x31, 0x5e, 0x2f, 0xe8, 0x54, 0x92, 0xfa, 0xcd, + 0xcb, 0xbf, 0xbc, 0xd8, 0xe6, 0x02, 0xe0, 0x5f, 0x2e, 0x70, 0xe0, 0x1d, + 0x25, 0x9e, 0x3d, 0xf1, 0x8f, 0x5c, 0xf8, 0x4a, 0xc2, 0x6c, 0xe8, 0xf3, + 0xac, 0xd7, 0x92, 0x97, 0xc4, 0x7a, 0xd5, 0xed, 0xfa, 0xc8, 0xd6, 0x31, + 0xbc, 0xf6, 0xc3, 0x8c, 0x7d, 0xec, 0x4e, 0xaa, 0xc7, 0x6b, 0xc8, 0xff, + 0xa3, 0xc5, 0x96, 0xb9, 0x02, 0x0f, 0xfc, 0x51, 0x83, 0xfb, 0xff, 0x4b, + 0x8e, 0xf1, 0x99, 0xd1, 0x30, 0xce, 0x2c, 0x8c, 0x6d, 0x02, 0x2f, 0x23, + 0x38, 0x71, 0x6c, 0x9c, 0x6a, 0xd5, 0x23, 0xb3, 0x4c, 0x1f, 0xa7, 0xd1, + 0xb9, 0x75, 0x88, 0x01, 0x90, 0x7e, 0x09, 0xaf, 0x55, 0xa3, 0x54, 0xec, + 0xdd, 0xe7, 0x37, 0x10, 0x0d, 0x50, 0x50, 0x2d, 0xd7, 0x02, 0xbe, 0x4e, + 0x6b, 0xc0, 0x48, 0x69, 0x50, 0x50, 0x3b, 0xdd, 0xc2, 0x7b, 0xbe, 0x83, + 0xc8, 0x65, 0xc8, 0x64, 0x41, 0xfa, 0x39, 0x32, 0xc0, 0x1d, 0xbf, 0xbb, + 0x2d, 0x08, 0x7f, 0x40, 0xdf, 0xe6, 0x14, 0xfc, 0x0c, 0xdb, 0xb6, 0x76, + 0xc8, 0xb9, 0x39, 0x76, 0x7c, 0xfa, 0x6e, 0x44, 0x56, 0xd0, 0x92, 0x4d, + 0xd4, 0x00, 0x40, 0xa8, 0x46, 0xd3, 0x43, 0x08, 0x05, 0xc0, 0x02, 0x68, + 0x79, 0xd1, 0x66, 0x55, 0x58, 0x69, 0x93, 0xad, 0x16, 0xb2, 0x6d, 0xa7, + 0x35, 0x0a, 0xa7, 0x05, 0x75, 0x2f, 0x2c, 0x7d, 0x11, 0x80, 0xba, 0x86, + 0xaf, 0x2c, 0xd1, 0xf2, 0xa0, 0xb4, 0x52, 0xb7, 0x21, 0x95, 0x32, 0xb5, + 0xd3, 0xb1, 0x82, 0x0a, 0xe2, 0x26, 0x97, 0x8f, 0xd7, 0xf2, 0x02, 0x1a, + 0x86, 0xd7, 0xf2, 0x28, 0x15, 0x55, 0x99, 0xba, 0x39, 0x37, 0xf9, 0x80, + 0x4d, 0xb8, 0x5e, 0xc7, 0xeb, 0x7f, 0xbe, 0xfd, 0x6a, 0xf2, 0xce, 0x80, + 0xb7, 0x01, 0x23, 0xbf, 0xf1, 0x26, 0xfe, 0xf0, 0xaf, 0x54, 0x98, 0xc7, + 0x80, 0x69, 0x08, 0xc0, 0xdf, 0xd3, 0x40, 0xe3, 0x37, 0xde, 0xc4, 0x8b, + 0x7f, 0xf5, 0x2a, 0xc3, 0xc0, 0x8f, 0x88, 0x62, 0x4d, 0xea, 0x3d, 0x2d, + 0x27, 0x6b, 0xa1, 0xb4, 0xf4, 0xab, 0x81, 0xf3, 0x04, 0xc2, 0x3a, 0x1f, + 0x69, 0x81, 0x73, 0x4b, 0xcf, 0xbf, 0x45, 0x43, 0xb3, 0x12, 0xb6, 0x4d, + 0x68, 0xff, 0xa7, 0x01, 0x4c, 0x1a, 0x9d, 0x1e, 0xe7, 0x75, 0x52, 0xdf, + 0xdc, 0x52, 0xfc, 0x8e, 0xff, 0x92, 0x01, 0x14, 0x2d, 0xcb, 0x87, 0x8e, + 0xbe, 0x46, 0xd4, 0x80, 0x5b, 0xf4, 0xc1, 0xf5, 0x17, 0x3a, 0xdc, 0x88, + 0x03, 0x7f, 0xa7, 0xdd, 0xaf, 0x0e, 0xc0, 0x0b, 0xf3, 0x70, 0x09, 0xd0, + 0xb0, 0x8e, 0xdb, 0x7d, 0x9e, 0xe0, 0x96, 0x05, 0xf7, 0x1e, 0x6a, 0xcd, + 0x55, 0x03, 0x0c, 0x7d, 0x77, 0x9e, 0x6f, 0x01, 0xa3, 0xc0, 0x2f, 0xba, + 0x20, 0xe7, 0x15, 0xdc, 0xea, 0xd5, 0x04, 0xde, 0x17, 0x2e, 0x20, 0xe0, + 0x95, 0x5f, 0x1e, 0x80, 0xef, 0xaa, 0xc9, 0xf4, 0x85, 0x2c, 0xb4, 0x74, + 0x9a, 0x33, 0x09, 0xe7, 0xc2, 0x6f, 0x5e, 0x05, 0x0f, 0x7e, 0x37, 0xcc, + 0x93, 0x92, 0x40, 0x20, 0x99, 0x74, 0x54, 0x0f, 0xce, 0xb4, 0x95, 0x35, + 0x04, 0x25, 0x0d, 0xd4, 0x02, 0xb8, 0xcd, 0x81, 0x89, 0x84, 0x66, 0xdd, + 0x60, 0x7c, 0x0a, 0x02, 0xca, 0x3e, 0x54, 0x35, 0xc8, 0x2b, 0xae, 0xeb, + 0x1d, 0xf8, 0xd6, 0x22, 0x97, 0x85, 0xeb, 0x1d, 0xd8, 0x1f, 0x0b, 0xe3, + 0x01, 0xf8, 0x6a, 0xec, 0xea, 0x1d, 0x6f, 0xd1, 0x9e, 0x1d, 0x92, 0xeb, + 0x55, 0x5f, 0xc3, 0x33, 0x3e, 0x01, 0x50, 0xab, 0x97, 0xa6, 0xef, 0xbb, + 0x19, 0xf7, 0x03, 0xfb, 0xf1, 0xbe, 0x79, 0xf3, 0xc2, 0x01, 0xe3, 0x7a, + 0x2d, 0xfd, 0x3c, 0x07, 0xf6, 0xfe, 0xe5, 0xdf, 0xb3, 0xeb, 0x3f, 0xec, + 0x5a, 0x30, 0xd8, 0x9e, 0xff, 0x70, 0x37, 0xbb, 0xfe, 0xd3, 0x9d, 0xc1, + 0x32, 0xa2, 0x76, 0x2d, 0x80, 0x5d, 0x89, 0x8f, 0x97, 0x99, 0x3a, 0x9d, + 0x6c, 0xa3, 0xe5, 0xbb, 0x16, 0x30, 0xcb, 0x0d, 0xe3, 0xf6, 0x52, 0xd2, + 0xb6, 0x73, 0x00, 0x69, 0x2d, 0xa4, 0xed, 0x9f, 0xb8, 0x93, 0x7b, 0xef, + 0xbb, 0x3b, 0x58, 0xf6, 0xad, 0x84, 0xbe, 0xd9, 0x78, 0x50, 0xfd, 0x45, + 0xbd, 0xac, 0xe3, 0xc9, 0x26, 0xe5, 0x62, 0x89, 0xe6, 0x2c, 0x89, 0x40, + 0x2d, 0x40, 0x03, 0xb5, 0x3c, 0x02, 0xa0, 0x96, 0x53, 0xd5, 0xd0, 0x1e, + 0x03, 0xb6, 0x6a, 0xe0, 0xb5, 0x1b, 0xb8, 0x4e, 0x01, 0xcf, 0x6f, 0x50, + 0x1a, 0xac, 0x50, 0x6f, 0x83, 0x01, 0x6a, 0x81, 0x87, 0xeb, 0x54, 0x02, + 0x58, 0x95, 0xeb, 0xe4, 0xb5, 0xdb, 0xdc, 0xff, 0x54, 0x31, 0x20, 0xc8, + 0xbb, 0xb6, 0x0e, 0xb3, 0xfb, 0x1b, 0x5f, 0xa4, 0x34, 0x54, 0xc1, 0xf3, + 0x0f, 0xe0, 0xb5, 0xef, 0x0a, 0xd2, 0x21, 0x10, 0xec, 0x3e, 0x78, 0x3d, + 0xb0, 0x11, 0x73, 0x1d, 0x16, 0x88, 0x00, 0x9c, 0xe5, 0x3a, 0x42, 0x2d, + 0xcd, 0x25, 0xd5, 0x0f, 0x86, 0xa7, 0x15, 0xec, 0xc5, 0x87, 0x66, 0x62, + 0x8f, 0x27, 0xea, 0xa7, 0x00, 0x58, 0xb7, 0x02, 0x9f, 0xd3, 0xbf, 0x38, + 0x58, 0xeb, 0x7e, 0x9a, 0xed, 0xdd, 0x08, 0x51, 0x42, 0xca, 0x1a, 0xb9, + 0xa1, 0x0a, 0xde, 0x6c, 0x09, 0xd9, 0xae, 0x5a, 0xb6, 0x42, 0xb8, 0x96, + 0xeb, 0x6c, 0xb4, 0xf2, 0x5b, 0xb5, 0x96, 0xa1, 0x72, 0xf9, 0x02, 0xf5, + 0x93, 0xa3, 0xdc, 0xb1, 0xb5, 0xc2, 0x17, 0x1f, 0x52, 0x1f, 0xd0, 0xb8, + 0xe3, 0x86, 0x87, 0xf9, 0xe2, 0x23, 0x2a, 0x5c, 0xcb, 0x82, 0x03, 0x29, + 0xa0, 0x56, 0x78, 0x5f, 0x33, 0xbe, 0x48, 0x1b, 0xbe, 0x01, 0x05, 0xd0, + 0xb2, 0x55, 0x4f, 0x88, 0x62, 0xfc, 0x8a, 0xd6, 0x7a, 0xd1, 0xda, 0x5e, + 0xb4, 0xc2, 0x3c, 0xf8, 0xa0, 0x72, 0xdf, 0xb2, 0x41, 0xad, 0xdf, 0xf9, + 0x19, 0xbd, 0x21, 0x09, 0x8c, 0xb5, 0x18, 0x4c, 0xcb, 0xe8, 0x48, 0x8f, + 0xf8, 0xbd, 0x82, 0x5b, 0x40, 0xad, 0xa3, 0x42, 0x81, 0xaf, 0xbe, 0xb2, + 0xcb, 0x1a, 0xb1, 0x1b, 0x82, 0xbd, 0x1f, 0x50, 0xce, 0x1d, 0x5f, 0x52, + 0xcb, 0x2f, 0x7d, 0x53, 0xc5, 0xf9, 0xd2, 0x37, 0xd5, 0xfa, 0xec, 0x71, + 0x98, 0xf9, 0x92, 0xf2, 0xdb, 0xb5, 0x0b, 0x86, 0x12, 0x46, 0xfc, 0x8c, + 0xed, 0x47, 0x1e, 0x81, 0x1d, 0x37, 0xf4, 0x99, 0x17, 0x08, 0xf3, 0x1d, + 0xcb, 0xcf, 0xe7, 0xa9, 0x73, 0xf4, 0x71, 0xf8, 0xf3, 0xdf, 0x84, 0xba, + 0x29, 0xd1, 0x7a, 0x11, 0x8a, 0x6a, 0xbd, 0x88, 0xe5, 0xaf, 0xf5, 0x91, + 0xbf, 0x80, 0xff, 0x0b, 0x16, 0x1c, 0x37, 0x13, 0xe6, 0xf9, 0x4b, 0x1c, + 0x08, 0x6d, 0x3a, 0xa4, 0x33, 0x0d, 0x88, 0x41, 0x9e, 0x96, 0xa2, 0x38, + 0x20, 0x2a, 0xd0, 0xe5, 0x65, 0xc4, 0xc9, 0xda, 0x6b, 0x1b, 0x03, 0xb6, + 0x6f, 0x4e, 0xda, 0xb2, 0xfb, 0x9a, 0xe1, 0x4b, 0x48, 0xb8, 0x27, 0x0f, + 0xa2, 0xcb, 0xde, 0xcf, 0x21, 0xba, 0x9e, 0x93, 0x58, 0xab, 0x9e, 0xbe, + 0x37, 0x96, 0x9e, 0x24, 0xbf, 0x32, 0x1f, 0xac, 0x03, 0x14, 0x0e, 0xdd, + 0x4f, 0x63, 0x4b, 0x2f, 0xa0, 0x56, 0xff, 0xfb, 0x30, 0xea, 0x17, 0xa8, + 0x15, 0x28, 0xa1, 0x1f, 0x6e, 0x9e, 0x87, 0x08, 0x47, 0xdd, 0x27, 0xe4, + 0xf4, 0xbe, 0xec, 0x3b, 0x02, 0x03, 0xce, 0x32, 0xed, 0x22, 0xa8, 0xed, + 0x42, 0x97, 0xa1, 0xc1, 0xd3, 0x98, 0xfb, 0xa6, 0x69, 0xbf, 0x3b, 0xc1, + 0x1d, 0x6d, 0x1f, 0x47, 0xea, 0x7e, 0x4f, 0x4e, 0x3d, 0x8a, 0xb3, 0xea, + 0x25, 0x9f, 0x15, 0x8c, 0xb7, 0xd4, 0x9e, 0x9b, 0xfa, 0xd9, 0x72, 0x43, + 0x48, 0x1a, 0x3e, 0x94, 0x1d, 0x41, 0xd5, 0x97, 0x08, 0x04, 0x39, 0x0d, + 0xaf, 0x02, 0x68, 0xf8, 0x21, 0x5c, 0x4a, 0x68, 0xf0, 0x94, 0xf4, 0x15, + 0xe0, 0x0b, 0xe0, 0xc6, 0x8f, 0xde, 0x46, 0x7e, 0x59, 0x9e, 0xe6, 0xf3, + 0x61, 0x39, 0x6d, 0xdc, 0xb8, 0x31, 0x00, 0x6b, 0x19, 0x8d, 0xdd, 0x74, + 0x2b, 0xa3, 0xd7, 0x8e, 0x72, 0xfb, 0xad, 0x37, 0xd2, 0x90, 0x10, 0xa2, + 0x94, 0xd5, 0xb2, 0x23, 0x25, 0x53, 0x40, 0x4e, 0xa8, 0xe7, 0x79, 0x1d, + 0x19, 0x86, 0x30, 0x39, 0x75, 0x7d, 0x49, 0x4d, 0x3f, 0x03, 0x6e, 0x38, + 0x50, 0xf0, 0x61, 0xca, 0x97, 0x0c, 0x3b, 0x82, 0x0e, 0x92, 0x9c, 0x55, + 0xa7, 0x1d, 0xfd, 0x09, 0x9b, 0x4c, 0x60, 0x43, 0x90, 0x84, 0x6f, 0xb6, + 0x81, 0xf1, 0xf8, 0x32, 0xf2, 0x08, 0xb5, 0xe3, 0x47, 0xc1, 0x5a, 0x0a, + 0xb6, 0xa5, 0x94, 0xf4, 0x9c, 0xcb, 0x4d, 0x7a, 0xf6, 0x95, 0xa0, 0x77, + 0xbc, 0xfd, 0x34, 0xfc, 0xf3, 0xaa, 0x88, 0xdf, 0x9b, 0xbf, 0x7f, 0xee, + 0x78, 0xee, 0x0b, 0xe4, 0x30, 0x67, 0x99, 0x62, 0xf9, 0xc5, 0x03, 0x11, + 0xa0, 0x16, 0x84, 0x60, 0xaa, 0x81, 0xc2, 0x72, 0x80, 0x00, 0x76, 0x65, + 0xfc, 0xe3, 0xe1, 0xfa, 0xd1, 0xf9, 0xb6, 0x69, 0xe2, 0x2e, 0x27, 0xb4, + 0xb3, 0xa6, 0x00, 0xa7, 0x4e, 0x9d, 0x62, 0xcd, 0x9a, 0x35, 0xf0, 0xe2, + 0x29, 0x56, 0xac, 0x58, 0xc1, 0x73, 0xcf, 0x3d, 0xa7, 0xd6, 0xad, 0x7d, + 0x1a, 0x58, 0x96, 0x9d, 0x06, 0xb3, 0x1d, 0x88, 0x80, 0xb4, 0x4c, 0x18, + 0x03, 0x04, 0x33, 0xe9, 0x37, 0x71, 0x40, 0xed, 0xd3, 0xd8, 0x3c, 0xfb, + 0xe2, 0x3c, 0x5c, 0x32, 0x90, 0x5c, 0xaf, 0x49, 0x63, 0xe4, 0xe8, 0xe7, + 0x6a, 0x42, 0x50, 0x5c, 0x19, 0x03, 0x65, 0xfb, 0x30, 0xf9, 0x64, 0x95, + 0xb1, 0xeb, 0x36, 0x76, 0xc5, 0x39, 0xf4, 0xd8, 0xb1, 0x2e, 0xbf, 0x91, + 0x2b, 0x47, 0x23, 0xeb, 0xc2, 0x91, 0x60, 0xce, 0xff, 0xc7, 0x6a, 0x8c, + 0x5e, 0x33, 0x46, 0xad, 0x69, 0xc6, 0x47, 0xa3, 0x10, 0xab, 0xcc, 0x60, + 0x0e, 0x69, 0x01, 0xb6, 0xec, 0x6d, 0x89, 0xc0, 0x2b, 0x3b, 0xfd, 0x7e, + 0x08, 0x9b, 0xab, 0xd6, 0x94, 0xfd, 0x42, 0x56, 0xd0, 0xd0, 0xed, 0xb5, + 0x1d, 0x57, 0xc6, 0xe3, 0x38, 0x1d, 0x32, 0x83, 0x39, 0x5a, 0x4d, 0x49, + 0x2e, 0x2f, 0x22, 0xd0, 0x2c, 0x23, 0xcf, 0xef, 0x80, 0x1f, 0xb6, 0xd9, + 0xc2, 0xef, 0x74, 0xb9, 0x85, 0xdf, 0x61, 0xfa, 0xe9, 0xe9, 0x00, 0xac, + 0xb5, 0x90, 0x1e, 0xfe, 0xc6, 0xc3, 0xec, 0xf9, 0xcf, 0x7b, 0x82, 0xa5, + 0xca, 0x7f, 0x06, 0x31, 0x20, 0x28, 0x5d, 0x9a, 0xa3, 0x35, 0xab, 0x01, + 0x51, 0x6d, 0x49, 0xae, 0x94, 0xe3, 0xde, 0x3f, 0xde, 0xc7, 0xc8, 0xb5, + 0x6a, 0x64, 0x43, 0x7a, 0x12, 0xe9, 0x40, 0x61, 0x99, 0x1b, 0xb6, 0x0c, + 0xb1, 0x7a, 0x35, 0x75, 0x1f, 0x80, 0xb2, 0x56, 0x0a, 0x24, 0x51, 0x70, + 0x55, 0x1c, 0x64, 0x15, 0xe8, 0xd2, 0x82, 0x6a, 0xbb, 0x56, 0x16, 0x60, + 0x56, 0x76, 0x03, 0xaf, 0x56, 0x8a, 0x44, 0x7f, 0xb3, 0x1e, 0x5f, 0x1a, + 0x9b, 0x76, 0x9c, 0x38, 0x00, 0x2b, 0xae, 0xff, 0x8f, 0xbd, 0xf7, 0x8f, + 0x93, 0xa3, 0xaa, 0xf3, 0xbd, 0xdf, 0x40, 0x01, 0xa7, 0xb5, 0x43, 0xaa, + 0xdd, 0x89, 0x74, 0x85, 0x8c, 0x4e, 0xb1, 0x03, 0x4e, 0x8f, 0x61, 0xa1, + 0x47, 0x79, 0x70, 0x66, 0xe1, 0x91, 0x0c, 0xb0, 0x1b, 0x06, 0xdd, 0x97, + 0x06, 0xdd, 0xd7, 0x92, 0xc4, 0xbd, 0x08, 0xb8, 0xf7, 0x4a, 0xa2, 0xab, + 0x26, 0xae, 0x2f, 0x97, 0xb0, 0x3f, 0x1e, 0x40, 0x5f, 0x57, 0x82, 0xbb, + 0xab, 0x09, 0xee, 0xae, 0x04, 0xb9, 0x2b, 0x09, 0xbe, 0x1e, 0x60, 0xf4, + 0xb5, 0xe8, 0x90, 0x2b, 0x30, 0xc9, 0xbd, 0xb0, 0x19, 0x7c, 0xd0, 0xe9, + 0xb0, 0x84, 0xe9, 0x81, 0xb4, 0xe9, 0xc1, 0x0c, 0x54, 0x4b, 0x5a, 0xbb, + 0x20, 0x2d, 0x7d, 0x80, 0x86, 0x3c, 0x7f, 0x9c, 0x53, 0x3f, 0xba, 0xba, + 0x7b, 0xa6, 0x87, 0x00, 0xe2, 0xf3, 0xd4, 0x27, 0xaf, 0x49, 0x55, 0x9d, + 0xdf, 0xe7, 0x54, 0x57, 0xd5, 0x39, 0xa7, 0xce, 0xf7, 0x5d, 0xf3, 0xa5, + 0x25, 0x67, 0x25, 0x78, 0xe0, 0xab, 0x56, 0x61, 0x80, 0xaf, 0xef, 0xfe, + 0x8a, 0x0f, 0xd6, 0x6a, 0x82, 0x7a, 0x85, 0xea, 0x22, 0x49, 0x35, 0xa6, + 0x35, 0xdb, 0x78, 0xfe, 0x9b, 0x60, 0x59, 0xa4, 0x1a, 0xf2, 0x8c, 0x42, + 0xca, 0xa4, 0x99, 0x0a, 0xe2, 0x44, 0xe0, 0x61, 0x8b, 0x4f, 0xb0, 0x7d, + 0xb0, 0xd6, 0x73, 0x2f, 0x15, 0x39, 0xe9, 0xc4, 0x53, 0x7c, 0x68, 0x16, + 0xc0, 0x81, 0xfd, 0x34, 0xb8, 0x77, 0x2f, 0x3a, 0xd7, 0x87, 0x70, 0x4d, + 0xb3, 0xbb, 0xe3, 0x7b, 0x75, 0xac, 0x58, 0xb1, 0x62, 0xc5, 0x8a, 0x15, + 0x2b, 0x56, 0xac, 0x58, 0xb1, 0x62, 0xc5, 0x8a, 0x15, 0x2b, 0x56, 0xac, + 0x58, 0xb1, 0x62, 0xc5, 0x8a, 0x15, 0x2b, 0x56, 0xac, 0x58, 0xb1, 0x62, + 0xc5, 0x6a, 0x56, 0x0c, 0xd5, 0x8a, 0x15, 0x2b, 0x56, 0xac, 0x58, 0xb1, + 0x7e, 0x8b, 0xaa, 0xb1, 0x87, 0x63, 0x22, 0x86, 0x91, 0xaf, 0x45, 0xce, + 0xec, 0xc2, 0xa0, 0x4f, 0x6f, 0x15, 0xb5, 0x5d, 0x18, 0xff, 0x26, 0xa9, + 0x53, 0xb8, 0x96, 0x65, 0x5a, 0x94, 0x66, 0x3b, 0x5f, 0x80, 0x5e, 0x63, + 0x4f, 0xf3, 0xc2, 0xe4, 0xab, 0x8b, 0xf0, 0x97, 0x9e, 0x71, 0x62, 0xe3, + 0x92, 0xea, 0x1a, 0x90, 0xa8, 0x4a, 0x2a, 0x49, 0x41, 0xc5, 0x6d, 0xb1, + 0xd0, 0x52, 0x5b, 0xe3, 0xd8, 0x3d, 0x6a, 0xe1, 0x5d, 0x5e, 0x1b, 0xc0, + 0x8b, 0xd0, 0xe2, 0x73, 0xfb, 0x22, 0x41, 0xf1, 0x3e, 0x49, 0xaa, 0x5c, + 0x03, 0x17, 0x2a, 0x45, 0x89, 0x9c, 0x55, 0xdf, 0xab, 0x0f, 0x78, 0x5a, + 0xd2, 0x5f, 0xd8, 0xde, 0x20, 0x6d, 0xf9, 0xe3, 0xfd, 0x8a, 0xa6, 0xbe, + 0xbe, 0x99, 0xfe, 0x2f, 0x6c, 0x84, 0x3b, 0x46, 0xb9, 0xf2, 0xc3, 0x97, + 0x90, 0x9f, 0x76, 0x90, 0xba, 0xd7, 0xb8, 0xf6, 0xdb, 0x3b, 0xb0, 0xb5, + 0xf1, 0xad, 0x99, 0x4e, 0x21, 0xb4, 0xdf, 0x54, 0x7e, 0x8a, 0x4b, 0xcf, + 0x1e, 0xe2, 0xf6, 0x4f, 0x05, 0x46, 0xc1, 0x57, 0xdd, 0xb1, 0x03, 0xc7, + 0x95, 0xdc, 0xb4, 0x6b, 0x17, 0xf9, 0x6f, 0xed, 0xe0, 0x96, 0x4f, 0xaf, + 0xf6, 0xd3, 0x9d, 0x4b, 0xed, 0xea, 0x32, 0x9f, 0x2c, 0x5d, 0x8f, 0x5c, + 0xc1, 0xf1, 0x17, 0xf1, 0x77, 0x0c, 0x4b, 0xd0, 0xbf, 0x43, 0x91, 0x14, + 0xaa, 0x9d, 0x92, 0xba, 0x7d, 0xeb, 0x8d, 0xfe, 0x4d, 0x50, 0xae, 0xab, + 0x8b, 0x4d, 0x46, 0x63, 0xde, 0x75, 0x2d, 0x7a, 0x74, 0x79, 0x00, 0xd1, + 0xa5, 0xd2, 0xdb, 0x33, 0xeb, 0x42, 0x4f, 0x1a, 0x6d, 0xba, 0x8d, 0x89, + 0x07, 0xc9, 0x08, 0xef, 0xb7, 0x91, 0xfe, 0x09, 0x9a, 0xc9, 0x60, 0x51, + 0xb3, 0x5b, 0x2d, 0xe9, 0xe3, 0xd6, 0x8b, 0x89, 0x3d, 0x88, 0x96, 0xb7, + 0x0d, 0xef, 0x4b, 0x08, 0xe5, 0x4e, 0x43, 0xee, 0xe1, 0xf0, 0x73, 0x29, + 0x48, 0xcb, 0x69, 0xf8, 0x32, 0xb9, 0x94, 0x92, 0x94, 0xfe, 0x9d, 0xb8, + 0x55, 0x90, 0x25, 0xc8, 0xa4, 0xf5, 0x82, 0x5f, 0xbd, 0xef, 0xd4, 0x1b, + 0x8d, 0xfe, 0xc2, 0x40, 0x2d, 0xa0, 0x01, 0xa8, 0x35, 0x7f, 0x99, 0xda, + 0x2f, 0x50, 0x0e, 0xb7, 0x57, 0xd8, 0xad, 0x12, 0xba, 0xf7, 0x88, 0xa4, + 0xba, 0xb6, 0xd2, 0x7a, 0x5b, 0x73, 0xa1, 0x27, 0x9d, 0x51, 0xc6, 0xb9, + 0x65, 0xc0, 0xe8, 0xe4, 0xba, 0x7e, 0x73, 0x74, 0xcd, 0x5f, 0x5d, 0xc3, + 0x0d, 0x5f, 0xbb, 0xe1, 0x35, 0xc5, 0x1d, 0x3c, 0x77, 0x70, 0xfe, 0x40, + 0x21, 0x39, 0x85, 0x66, 0xc3, 0xcc, 0x19, 0xbd, 0xe0, 0xdd, 0xec, 0x32, + 0xfd, 0xaf, 0xc1, 0x2f, 0x44, 0xa5, 0x10, 0x00, 0xb2, 0x38, 0xeb, 0x30, + 0x7c, 0xf6, 0x10, 0x45, 0xfd, 0x0c, 0x73, 0x0f, 0x95, 0x30, 0x97, 0xa4, + 0x71, 0x0f, 0x95, 0xa8, 0xd4, 0x9b, 0xcf, 0x69, 0x14, 0xa0, 0xe5, 0x7d, + 0x49, 0x3b, 0x2c, 0xb7, 0x2e, 0x15, 0x10, 0xe0, 0x68, 0x9e, 0x2d, 0x2d, + 0xae, 0x6b, 0xd6, 0xed, 0x87, 0xcf, 0x1d, 0xdf, 0x32, 0xf8, 0xa9, 0xc0, + 0x53, 0xa1, 0x63, 0xcf, 0x1c, 0xae, 0x1d, 0x3c, 0x6a, 0xa1, 0xfe, 0xbd, + 0xa1, 0xad, 0x67, 0x6c, 0xb7, 0x85, 0x82, 0x0f, 0xcd, 0x6a, 0xa7, 0xc2, + 0x02, 0xf2, 0x8a, 0x86, 0x8f, 0xa6, 0x33, 0x57, 0xf9, 0xc2, 0xee, 0xaf, + 0xa5, 0xce, 0x5b, 0xb6, 0x6c, 0x69, 0xd8, 0x1e, 0xad, 0x0a, 0xfb, 0x95, + 0xb5, 0xf2, 0x4d, 0xc0, 0x86, 0xde, 0x56, 0x35, 0x0a, 0x69, 0xdd, 0xfe, + 0x66, 0x03, 0xc1, 0x07, 0x8b, 0x70, 0x7c, 0x70, 0xfe, 0x2f, 0xd9, 0x05, + 0x3f, 0x5a, 0x01, 0xb5, 0xff, 0x7c, 0x1c, 0x80, 0x3d, 0x22, 0xc1, 0xf0, + 0x7d, 0xf8, 0xcf, 0xc5, 0x81, 0x39, 0x9e, 0x33, 0x61, 0x60, 0x54, 0x27, + 0x40, 0xaa, 0x76, 0x60, 0xac, 0x70, 0xdc, 0x4d, 0xf5, 0xc0, 0xff, 0x80, + 0xde, 0x3f, 0xd5, 0x68, 0x74, 0x0f, 0xef, 0x87, 0x15, 0x75, 0xdf, 0x54, + 0x0f, 0xf6, 0xa7, 0xea, 0xad, 0xc1, 0x5a, 0xe1, 0x30, 0xed, 0xf6, 0xc3, + 0x0a, 0xa7, 0xb3, 0xa1, 0x1e, 0xb4, 0xc1, 0x5c, 0xfb, 0xd0, 0x0c, 0xd7, + 0x5a, 0xa7, 0xdd, 0xb7, 0x1a, 0x8d, 0xfb, 0x0f, 0xd4, 0xd5, 0x33, 0x2b, + 0x0a, 0xd7, 0xba, 0x52, 0xbb, 0x6f, 0x8f, 0xb8, 0xaf, 0xa9, 0x43, 0xd1, + 0x40, 0x9d, 0xd7, 0xa8, 0xd1, 0xd0, 0x63, 0x53, 0x70, 0x8c, 0xea, 0x87, + 0x8f, 0x6a, 0x63, 0x9b, 0x55, 0x06, 0x8c, 0xbb, 0x15, 0xac, 0xe5, 0x03, + 0x90, 0x9f, 0x21, 0xbf, 0x2c, 0xa3, 0x4c, 0x8f, 0xf7, 0xd5, 0xd8, 0x71, + 0x46, 0x16, 0x1e, 0x99, 0x60, 0x35, 0x30, 0x66, 0x80, 0x7d, 0x61, 0x16, + 0xf2, 0x79, 0x32, 0x7b, 0xf7, 0x90, 0xc7, 0xf4, 0x4d, 0x94, 0x6f, 0xfd, + 0x8e, 0x82, 0x6e, 0xad, 0xc6, 0x25, 0x7f, 0x96, 0x7e, 0x6e, 0xe4, 0x72, + 0xe4, 0xf5, 0x93, 0xf6, 0x8a, 0xcb, 0xf2, 0xbc, 0xf7, 0xab, 0x97, 0x00, + 0x3d, 0x8c, 0xe9, 0x38, 0xa6, 0x98, 0x69, 0x98, 0xa1, 0xcb, 0x9e, 0x05, + 0x57, 0x5c, 0x0c, 0x4b, 0xaf, 0x3b, 0x15, 0x10, 0x9c, 0x7a, 0x9f, 0x06, + 0x87, 0x1a, 0xb2, 0x21, 0x8c, 0xfd, 0x51, 0xc1, 0xad, 0x37, 0x0a, 0xe8, + 0x93, 0x20, 0xb6, 0x41, 0x3a, 0x64, 0xd8, 0xe9, 0xf5, 0x29, 0x45, 0x82, + 0x2b, 0x3e, 0x09, 0xb7, 0x7e, 0xc3, 0x85, 0x33, 0x80, 0x8b, 0xf2, 0x70, + 0x9e, 0x05, 0x87, 0xc6, 0xf9, 0xad, 0xe9, 0x6f, 0xb7, 0xc1, 0xdf, 0x5f, + 0x09, 0xdf, 0x1f, 0x85, 0x8f, 0x6a, 0x90, 0x53, 0x3b, 0x40, 0x67, 0x21, + 0xdf, 0xda, 0x1d, 0xe0, 0xf3, 0x1b, 0xe0, 0xde, 0xb1, 0x60, 0x0b, 0xea, + 0xbc, 0x46, 0xc1, 0x5a, 0x57, 0x17, 0x61, 0xdd, 0x9b, 0xfb, 0xbc, 0x8e, + 0xf5, 0x26, 0xa8, 0xc5, 0xf3, 0xfa, 0x8f, 0xf7, 0x03, 0xfa, 0x71, 0x1d, + 0x35, 0x62, 0x8d, 0xca, 0x1b, 0x22, 0xcd, 0xd5, 0x9b, 0x11, 0xa1, 0xb0, + 0x9e, 0x7e, 0x0d, 0xbc, 0xa3, 0x4d, 0xf8, 0x56, 0x7e, 0xc7, 0x2d, 0x59, + 0x02, 0xc0, 0xa3, 0x8f, 0x3e, 0x0a, 0x4b, 0x16, 0xc3, 0x73, 0xcf, 0xe1, + 0xbe, 0xa4, 0x40, 0x5b, 0x8f, 0x3e, 0xfa, 0x28, 0x67, 0x9e, 0x79, 0x66, + 0x53, 0x9e, 0xd1, 0xb2, 0x7b, 0xc7, 0xc7, 0x01, 0x2f, 0x2f, 0x59, 0xc2, + 0xf1, 0x87, 0x0e, 0xf9, 0xe1, 0x5f, 0xd6, 0xe9, 0x87, 0xc3, 0xcf, 0x55, + 0x97, 0x74, 0x97, 0xa2, 0xf8, 0x3d, 0x59, 0x91, 0x3c, 0xbc, 0x6b, 0x37, + 0xa7, 0xa7, 0x94, 0xcf, 0x4c, 0xb9, 0x0d, 0x15, 0xe9, 0x28, 0x34, 0x57, + 0x5d, 0x16, 0x72, 0x5e, 0xfe, 0x78, 0x7f, 0x0b, 0x00, 0x8f, 0x7e, 0x5e, + 0xe7, 0xee, 0x19, 0x43, 0x98, 0x29, 0x6e, 0xba, 0xf2, 0x7a, 0x46, 0x3e, + 0xbf, 0x86, 0x5b, 0xd2, 0x16, 0xeb, 0xbf, 0xb4, 0x8d, 0x34, 0x09, 0xd6, + 0xbb, 0x2b, 0x58, 0x5d, 0x56, 0xf7, 0x10, 0xd9, 0x35, 0x8c, 0x69, 0xee, + 0x61, 0x7c, 0xf7, 0x30, 0x23, 0x17, 0xc3, 0x64, 0xd7, 0x30, 0x89, 0x25, + 0xe3, 0x88, 0x97, 0xd5, 0xb8, 0x51, 0x22, 0x30, 0x8d, 0xa0, 0x6f, 0x29, + 0x0c, 0x30, 0xa9, 0x40, 0xca, 0x64, 0x7c, 0x62, 0x82, 0xe1, 0xc1, 0xe6, + 0x7e, 0xb4, 0x30, 0xe6, 0xee, 0x6f, 0x3a, 0x07, 0x55, 0x5f, 0x3a, 0x2d, + 0xd2, 0x88, 0x54, 0x02, 0x59, 0xa9, 0x01, 0x02, 0x21, 0x4c, 0xac, 0xb3, + 0x46, 0x18, 0x5c, 0xa1, 0x60, 0x39, 0xa3, 0xff, 0xb0, 0x03, 0x2b, 0x7d, + 0x25, 0xc5, 0xd9, 0x6d, 0xd8, 0x1f, 0x58, 0x8d, 0x53, 0xda, 0xc6, 0x55, + 0x57, 0x5b, 0xdc, 0x72, 0xf3, 0x0a, 0x32, 0x17, 0xaf, 0x63, 0xec, 0xfb, + 0x37, 0x34, 0xb4, 0x88, 0x07, 0x82, 0x96, 0x75, 0x05, 0xec, 0xca, 0xe5, + 0x1c, 0xcc, 0x25, 0xa9, 0x46, 0xa0, 0x96, 0x21, 0xb0, 0xec, 0x60, 0xae, + 0xa9, 0x22, 0x5d, 0x84, 0x37, 0x76, 0x6b, 0x03, 0x92, 0x16, 0x49, 0x81, + 0xd4, 0x10, 0x2d, 0x59, 0x17, 0x54, 0x5c, 0x19, 0x81, 0x76, 0xa9, 0xed, + 0xd8, 0x83, 0x39, 0x46, 0xce, 0xcb, 0x32, 0xf6, 0x60, 0x8e, 0xed, 0x37, + 0x6f, 0xe6, 0xfa, 0x1b, 0xb7, 0xe2, 0x1e, 0x76, 0xfc, 0xf1, 0x55, 0x2e, + 0x97, 0x23, 0x9b, 0xcd, 0xea, 0x7c, 0x83, 0xbc, 0x2a, 0x52, 0x32, 0x3e, + 0x31, 0xa1, 0x8c, 0xcd, 0x2b, 0x2e, 0x66, 0x42, 0x81, 0xb5, 0xf6, 0x4c, + 0xec, 0x41, 0x18, 0x56, 0x70, 0x5e, 0xcf, 0x6b, 0x7d, 0x5d, 0xd7, 0x68, + 0x18, 0x72, 0xb2, 0x34, 0x79, 0x0c, 0xbf, 0x0a, 0x81, 0xa4, 0x2c, 0xe0, + 0x0f, 0xfa, 0xc1, 0xba, 0xeb, 0x08, 0xff, 0xd7, 0xda, 0x63, 0x59, 0x71, + 0xfb, 0xab, 0x3e, 0x50, 0xeb, 0x5e, 0x14, 0x3a, 0xe5, 0x09, 0xe0, 0xd8, + 0xa9, 0x23, 0xfc, 0x0a, 0xd5, 0x87, 0xdf, 0x07, 0x2c, 0xd7, 0xdb, 0xf9, + 0x64, 0xd0, 0x5c, 0x06, 0x4f, 0xa7, 0xa7, 0x8e, 0xe5, 0xa9, 0xca, 0xab, + 0x1d, 0xa4, 0xf2, 0xfa, 0xe9, 0x70, 0x1b, 0xf7, 0xdf, 0x46, 0x59, 0x7e, + 0x15, 0xd9, 0x7a, 0xa6, 0xdd, 0xcf, 0x85, 0xdc, 0x5f, 0x8a, 0xc4, 0x69, + 0x79, 0x5d, 0x47, 0xc6, 0x5c, 0xde, 0x2f, 0xd8, 0x01, 0xa6, 0xa7, 0x5a, + 0xd7, 0x58, 0x1a, 0x30, 0xe1, 0xc2, 0x70, 0x12, 0xd0, 0x8f, 0xfa, 0xe9, + 0x45, 0xd0, 0xd7, 0xbf, 0x08, 0xf9, 0x93, 0x97, 0x55, 0xfe, 0xef, 0x3b, + 0x1e, 0x5a, 0xc4, 0xb7, 0x84, 0x02, 0x4b, 0xa9, 0xb4, 0x9b, 0xef, 0x4a, + 0x36, 0x70, 0x60, 0x11, 0x1c, 0xd3, 0x22, 0xeb, 0x9a, 0x80, 0x23, 0x53, + 0x87, 0x71, 0x0d, 0xf8, 0x75, 0x1b, 0xae, 0x86, 0x6d, 0xa8, 0xb4, 0x87, + 0x8f, 0x83, 0xf1, 0x12, 0x7c, 0xf0, 0xdd, 0x21, 0xcf, 0x3a, 0x7e, 0xdf, + 0xaf, 0x26, 0x40, 0x54, 0x1b, 0x9f, 0x35, 0x4f, 0xfc, 0xa4, 0xb1, 0x1c, + 0x45, 0x7d, 0x47, 0x75, 0x0d, 0xc8, 0x96, 0x41, 0x98, 0xc1, 0xf4, 0x94, + 0xad, 0x63, 0x0e, 0x6a, 0xb0, 0xd6, 0xd6, 0x3a, 0xac, 0x6b, 0x01, 0xd6, + 0xf2, 0xef, 0xc3, 0x06, 0x58, 0x06, 0x8c, 0x49, 0x35, 0x0f, 0xe4, 0xcd, + 0x98, 0x28, 0xe8, 0x96, 0x60, 0x4a, 0x48, 0x98, 0xe7, 0x91, 0x30, 0x45, + 0x33, 0x2c, 0x51, 0x18, 0xf0, 0xca, 0x7b, 0x16, 0x71, 0xdc, 0xe3, 0x87, + 0xfd, 0x73, 0x01, 0xb4, 0x1e, 0x73, 0xe9, 0xbe, 0xd9, 0xd8, 0x23, 0x2e, + 0x23, 0x67, 0x07, 0xf7, 0xde, 0xb1, 0x47, 0x54, 0x63, 0x36, 0xb9, 0x3d, + 0xa2, 0x80, 0x3f, 0xab, 0x56, 0x04, 0xf7, 0xb5, 0xd1, 0x5d, 0xc1, 0x5c, + 0xb8, 0xe7, 0x3e, 0xfa, 0x60, 0xc8, 0xed, 0xbc, 0x20, 0xec, 0xd8, 0x3c, + 0xee, 0x93, 0x05, 0x95, 0xef, 0x50, 0xaf, 0x32, 0x4c, 0x9f, 0x2c, 0xb8, + 0xf0, 0xd7, 0x17, 0x80, 0x91, 0xa5, 0xa5, 0x34, 0xc4, 0xca, 0x03, 0x69, + 0x35, 0x00, 0xb5, 0xc2, 0x80, 0x2b, 0x7f, 0x5f, 0xcd, 0xd9, 0x55, 0xb4, + 0xf1, 0xf8, 0xdd, 0xa3, 0x77, 0x73, 0xe9, 0xaa, 0x4b, 0xb5, 0x5f, 0xa5, + 0x75, 0xdc, 0xdf, 0xa2, 0x3c, 0x90, 0x56, 0x3b, 0xa0, 0x56, 0x18, 0x02, + 0xd3, 0xa0, 0x16, 0x7d, 0xb3, 0x61, 0xbf, 0x6f, 0x36, 0xa0, 0x5d, 0x06, + 0x50, 0x70, 0x27, 0x01, 0xf5, 0x14, 0x51, 0xd0, 0x93, 0xd2, 0x6a, 0x5c, + 0xe9, 0x2a, 0xb0, 0x56, 0x3d, 0x0f, 0xf5, 0x30, 0x08, 0x2b, 0x50, 0x4f, + 0x32, 0xcb, 0x4c, 0x35, 0x3c, 0x77, 0x68, 0x11, 0x00, 0xa4, 0x26, 0x70, + 0xeb, 0x25, 0x0d, 0xab, 0xb2, 0x42, 0xfb, 0xa3, 0x0d, 0xe1, 0xb7, 0xdd, + 0xb7, 0x95, 0x19, 0x77, 0x18, 0xb8, 0x86, 0xdc, 0x34, 0x08, 0x63, 0x14, + 0x58, 0xcb, 0xea, 0xbe, 0xbb, 0x08, 0xc0, 0x56, 0x2b, 0x80, 0x11, 0x2a, + 0x25, 0x35, 0xde, 0x10, 0x86, 0x9a, 0x7b, 0x32, 0x0d, 0xa1, 0xb6, 0xa8, + 0x2d, 0x28, 0x90, 0x96, 0x09, 0xb8, 0xf5, 0x20, 0xcc, 0xc2, 0x74, 0x63, + 0x5b, 0x1f, 0x59, 0xbf, 0x0e, 0xe4, 0xb5, 0xc1, 0xb1, 0x8c, 0xfe, 0x5e, + 0x02, 0xb8, 0x96, 0x5b, 0xcf, 0xe8, 0xfa, 0x3a, 0xc0, 0xd5, 0xa1, 0x7a, + 0xdc, 0xec, 0xd7, 0xbd, 0x52, 0xaa, 0x00, 0x82, 0x1b, 0xee, 0xcc, 0x71, + 0xcd, 0xc7, 0x7f, 0x04, 0x2f, 0x4b, 0x1f, 0xa8, 0x05, 0x9b, 0x70, 0x65, + 0x3f, 0x6e, 0xdd, 0x01, 0x2c, 0x5c, 0x59, 0xd2, 0x60, 0x2d, 0xe5, 0x3b, + 0xbc, 0xbf, 0x05, 0x58, 0x4b, 0xdf, 0xc3, 0x7b, 0x08, 0xe0, 0x58, 0x33, + 0x21, 0xef, 0x1e, 0xbd, 0x9d, 0x09, 0xed, 0xf7, 0xb4, 0xf0, 0xdf, 0x1d, + 0x49, 0xb6, 0x27, 0x72, 0x7c, 0x5b, 0x8f, 0x57, 0x42, 0xad, 0x56, 0x40, + 0x2c, 0xcf, 0x6d, 0x65, 0x0b, 0xb7, 0x76, 0x61, 0x3b, 0xd0, 0xca, 0x2d, + 0xb0, 0x32, 0x74, 0x4a, 0x37, 0x6e, 0x84, 0x02, 0x05, 0x0a, 0x05, 0xf0, + 0xa6, 0x9f, 0x96, 0x9d, 0xaf, 0xb6, 0x3f, 0xf8, 0x81, 0xda, 0xde, 0xff, + 0x91, 0x5e, 0xd8, 0x58, 0xf0, 0x61, 0x5c, 0x9e, 0xdf, 0xec, 0x6e, 0x58, + 0xf9, 0x11, 0xd8, 0xd9, 0xab, 0xe2, 0x83, 0x4a, 0xe3, 0x7e, 0x9d, 0xfe, + 0xfd, 0x0b, 0xfd, 0xe9, 0x34, 0x14, 0x14, 0xd8, 0xa9, 0xc0, 0x5c, 0x97, + 0xf7, 0xc0, 0xf9, 0x33, 0x0a, 0xa8, 0x75, 0xdb, 0x6d, 0x0a, 0x78, 0x06, + 0xc0, 0xf9, 0x0a, 0xa6, 0xd5, 0xd3, 0xa3, 0xdc, 0x2f, 0xbf, 0x1c, 0x7a, + 0xfe, 0x0e, 0x66, 0x6e, 0x83, 0xf3, 0x7b, 0xe0, 0xa1, 0x1e, 0xe0, 0x7e, + 0x3a, 0x9a, 0x37, 0xf3, 0xe4, 0xbd, 0xeb, 0x93, 0xa1, 0xf7, 0x2c, 0xb2, + 0xcf, 0xf6, 0xdd, 0xd3, 0x49, 0x13, 0xf7, 0xa7, 0xea, 0x9a, 0x0d, 0xcf, + 0xdb, 0x76, 0xf2, 0xb1, 0x0e, 0x3f, 0x8d, 0x73, 0x07, 0xfd, 0xeb, 0x2d, + 0xec, 0xde, 0x2a, 0xec, 0x9c, 0xe9, 0x99, 0xa6, 0x7e, 0x57, 0x26, 0xe9, + 0x49, 0xa7, 0x99, 0x29, 0x97, 0x3a, 0x7e, 0x57, 0xe9, 0x01, 0xb5, 0x84, + 0x30, 0x15, 0xa4, 0xc9, 0x75, 0xe7, 0xae, 0x83, 0x7e, 0x60, 0x9a, 0x49, + 0xd3, 0xbf, 0x7f, 0x0a, 0x53, 0xe0, 0x56, 0x5d, 0xe5, 0x56, 0x76, 0x11, + 0xa6, 0xc0, 0x59, 0x75, 0x55, 0x43, 0x19, 0x84, 0x10, 0x7e, 0xba, 0xe1, + 0x62, 0xcd, 0x55, 0xce, 0xb0, 0xfb, 0x5c, 0xe0, 0xaf, 0x96, 0x6a, 0xd1, + 0x0f, 0xf7, 0xde, 0x73, 0xf9, 0x40, 0x2d, 0xa0, 0xa2, 0xb8, 0x3b, 0xaa, + 0xf7, 0x21, 0xbc, 0xb7, 0x32, 0x1e, 0x78, 0x3b, 0xf4, 0x1a, 0xcd, 0x50, + 0x6f, 0x2f, 0xd3, 0x86, 0xa0, 0x58, 0x57, 0xe3, 0x8a, 0x8c, 0x80, 0x19, + 0xa9, 0xe2, 0x48, 0xa9, 0x60, 0x5a, 0x29, 0x43, 0x8d, 0xfe, 0x6c, 0x21, + 0xc8, 0x57, 0x55, 0x83, 0x09, 0x03, 0x06, 0xbb, 0xf4, 0xbb, 0x35, 0x57, + 0x62, 0x55, 0x25, 0x15, 0x33, 0x68, 0xe3, 0x4a, 0xd5, 0x25, 0x11, 0xea, + 0x85, 0xe4, 0xeb, 0xaa, 0x50, 0x15, 0xa9, 0x40, 0x52, 0x09, 0x84, 0x02, + 0xae, 0xd6, 0x21, 0x6d, 0x40, 0x51, 0x2a, 0xe0, 0x96, 0x82, 0x20, 0x0a, + 0x6a, 0xba, 0x8f, 0x34, 0xb5, 0x6f, 0x8a, 0xc9, 0xfa, 0x24, 0x03, 0x67, + 0x0d, 0x50, 0x3a, 0x54, 0xa2, 0xb4, 0x4b, 0xcd, 0x0d, 0x4e, 0xee, 0x55, + 0x6e, 0xd4, 0x6b, 0x60, 0x40, 0x6e, 0x6f, 0x8e, 0xdc, 0xde, 0x1c, 0x76, + 0x66, 0x80, 0x62, 0x7e, 0x12, 0x64, 0xe3, 0xbb, 0xd9, 0xb4, 0x90, 0xe4, + 0x3d, 0xa0, 0xb1, 0x94, 0x0c, 0xa4, 0x15, 0xf0, 0xd8, 0xeb, 0xbf, 0x25, + 0x10, 0x08, 0x43, 0x92, 0x31, 0x14, 0x30, 0x0b, 0x14, 0x58, 0x4b, 0x18, + 0x30, 0xe5, 0x81, 0xb9, 0x42, 0x3d, 0xc1, 0x04, 0x82, 0x1a, 0xea, 0x83, + 0x45, 0x45, 0xed, 0x6e, 0xd6, 0x05, 0x56, 0x32, 0xe1, 0xc3, 0x56, 0x85, + 0x01, 0xb6, 0x80, 0x7c, 0x55, 0xa8, 0xdf, 0xa1, 0x14, 0x7e, 0xdf, 0x52, + 0x00, 0xb6, 0x7e, 0xfe, 0x14, 0xf5, 0xbe, 0x30, 0x24, 0x25, 0xe9, 0xbd, + 0x8f, 0x6e, 0x7e, 0xcf, 0xe5, 0xb2, 0x87, 0xe3, 0x39, 0x85, 0xd3, 0x91, + 0x3c, 0x89, 0x68, 0xd8, 0xe6, 0xc5, 0x14, 0x19, 0xd9, 0xaf, 0x8e, 0x9f, + 0xed, 0xe6, 0xb9, 0x77, 0x1e, 0xe4, 0xf4, 0x67, 0xbb, 0x9b, 0xc2, 0xbd, + 0xd6, 0xed, 0x73, 0x1a, 0x1e, 0x75, 0x9c, 0x1c, 0x60, 0xb1, 0x94, 0xbc, + 0xfd, 0x8a, 0x13, 0x71, 0x0e, 0x95, 0xd9, 0x99, 0x7b, 0x02, 0xeb, 0x1d, + 0xf0, 0xfb, 0xef, 0x7a, 0x81, 0x23, 0x3f, 0x71, 0x59, 0x64, 0x2d, 0xe5, + 0x3d, 0x16, 0x9c, 0x72, 0xca, 0x29, 0x70, 0xca, 0x29, 0x4c, 0xff, 0xf4, + 0x11, 0x20, 0x80, 0x50, 0xfd, 0xf2, 0xd9, 0xd3, 0xfc, 0xf2, 0x7a, 0x7a, + 0xe6, 0xf9, 0xc3, 0x1c, 0x27, 0x07, 0x78, 0x45, 0x4c, 0xaa, 0x3a, 0x3c, + 0x2b, 0x38, 0x9d, 0x6e, 0x9e, 0x7c, 0x56, 0x70, 0xf2, 0x3b, 0xf7, 0x1f, + 0x75, 0x9a, 0xc7, 0xc9, 0x01, 0x9e, 0x78, 0x62, 0x92, 0x22, 0x30, 0x22, + 0xfb, 0x79, 0xce, 0x39, 0xc8, 0x22, 0x6b, 0x29, 0x4b, 0x4f, 0x5a, 0xa4, + 0xd2, 0x04, 0x3f, 0xcd, 0x30, 0x1c, 0xcb, 0x83, 0x89, 0x41, 0x00, 0xcf, + 0x3a, 0xf6, 0xd1, 0xe3, 0xfc, 0xb6, 0xce, 0x3f, 0x1f, 0xb4, 0xf9, 0x33, + 0xcf, 0x2b, 0xe8, 0xd8, 0xd2, 0x93, 0x16, 0xd1, 0xf7, 0xfe, 0xb3, 0xe9, + 0x03, 0x9e, 0x7e, 0xfa, 0x69, 0x1f, 0x0e, 0xe6, 0x95, 0x35, 0x23, 0xfb, + 0xc9, 0x33, 0xd5, 0x90, 0xa6, 0xcb, 0x9e, 0x66, 0x08, 0x8f, 0xbe, 0x87, + 0xb7, 0x7a, 0xb7, 0xa6, 0x7e, 0x7f, 0x11, 0x19, 0x90, 0xe9, 0x69, 0x7e, + 0xc7, 0xda, 0x4a, 0x19, 0x3b, 0xc3, 0xf8, 0xae, 0x31, 0x40, 0x60, 0xf7, + 0xd8, 0xd8, 0xa7, 0x59, 0x14, 0x67, 0x1d, 0x8a, 0xf9, 0x22, 0xae, 0xeb, + 0xe2, 0x94, 0x8b, 0x98, 0x33, 0x92, 0x6c, 0x76, 0x98, 0x5c, 0x3e, 0x87, + 0xac, 0x27, 0x10, 0x46, 0xf0, 0x1e, 0xb0, 0x12, 0x5a, 0x86, 0x11, 0x05, + 0x68, 0x45, 0xc3, 0xb6, 0x52, 0xd4, 0xdf, 0xa9, 0x4a, 0xb2, 0x76, 0x46, + 0xfb, 0x05, 0xe0, 0x3f, 0x61, 0x42, 0xf8, 0x16, 0x29, 0xeb, 0x09, 0x98, + 0xad, 0xf8, 0xeb, 0x29, 0xac, 0x2e, 0x41, 0xa5, 0x2e, 0xa1, 0x5c, 0xc3, + 0x29, 0xd4, 0xf4, 0x12, 0x8a, 0x04, 0xae, 0x84, 0x94, 0xa9, 0xe6, 0x5b, + 0x64, 0x9d, 0x06, 0x70, 0x56, 0xa2, 0x2b, 0x41, 0xc5, 0x55, 0x1f, 0x8b, + 0x1a, 0xc8, 0x0e, 0x31, 0x99, 0xdb, 0xa3, 0x20, 0x59, 0x86, 0xf0, 0xd7, + 0xa2, 0x24, 0x92, 0x09, 0x64, 0x5d, 0x52, 0xdc, 0x9f, 0x67, 0xd3, 0xd7, + 0x27, 0xc8, 0x4f, 0xe4, 0xb9, 0xf4, 0xa3, 0x97, 0x32, 0xfc, 0xe1, 0x00, + 0x44, 0x56, 0x29, 0x56, 0xd4, 0xc7, 0xc7, 0x92, 0x16, 0xc5, 0x92, 0xba, + 0xe2, 0xe5, 0x61, 0xc9, 0xba, 0x4f, 0x5f, 0x89, 0x2c, 0x4b, 0xc6, 0xf7, + 0xed, 0x21, 0xb3, 0xdc, 0xc6, 0x99, 0x95, 0x78, 0xa8, 0x3c, 0x09, 0x4d, + 0xf7, 0x70, 0xef, 0x9a, 0xf6, 0xeb, 0xd8, 0xc1, 0x1a, 0x8b, 0x4e, 0xc3, + 0x76, 0x92, 0x96, 0x58, 0x26, 0x1a, 0xc2, 0x45, 0xe3, 0x44, 0x61, 0x54, + 0x5e, 0x9c, 0x56, 0xe1, 0xdb, 0xa5, 0x15, 0x75, 0x8f, 0xc6, 0xff, 0x58, + 0xdf, 0x9f, 0xb2, 0xf4, 0xe4, 0x77, 0x73, 0xf5, 0x47, 0x6e, 0xe4, 0xeb, + 0xbb, 0xbf, 0xd2, 0x32, 0xfd, 0x70, 0x5a, 0xde, 0x71, 0xbb, 0x72, 0x44, + 0xeb, 0xe7, 0x87, 0x09, 0xc1, 0xca, 0xa4, 0x99, 0x6a, 0x48, 0xcb, 0x03, + 0x94, 0x3d, 0xff, 0xe4, 0xd3, 0x3c, 0xff, 0xe2, 0xd3, 0x9c, 0x74, 0xe2, + 0x29, 0x3e, 0x50, 0xcb, 0x53, 0xf7, 0xa2, 0x73, 0x79, 0xee, 0xa5, 0x22, + 0xcf, 0xbf, 0x18, 0x84, 0xf1, 0xb6, 0x5e, 0xb8, 0xe7, 0x5f, 0x7c, 0x1a, + 0x4e, 0x6c, 0x73, 0x4d, 0xc7, 0x8a, 0x15, 0x2b, 0x56, 0xac, 0x58, 0xb1, + 0x62, 0xc5, 0x8a, 0x15, 0x2b, 0x56, 0xac, 0x58, 0xb1, 0x62, 0xc5, 0x8a, + 0x15, 0x2b, 0x56, 0xac, 0x58, 0xb1, 0x62, 0xc5, 0x8a, 0x15, 0x2b, 0x56, + 0xac, 0x8e, 0x14, 0x43, 0xb5, 0x62, 0xc5, 0x8a, 0x15, 0x2b, 0x56, 0xac, + 0xdf, 0x41, 0x85, 0x17, 0xe1, 0x09, 0x43, 0x60, 0x2d, 0xb3, 0x70, 0xdd, + 0xf6, 0x8b, 0xa4, 0xa3, 0xe1, 0xa3, 0xfb, 0xe1, 0x2d, 0xd0, 0x71, 0xd8, + 0x30, 0x94, 0x2a, 0x1a, 0xf6, 0xb5, 0xd6, 0x29, 0x9a, 0xee, 0x5c, 0x75, + 0x58, 0x48, 0xd8, 0xe8, 0xfe, 0x42, 0xc2, 0x39, 0x6e, 0x33, 0xb4, 0xac, + 0x6d, 0x79, 0x3a, 0xab, 0x2d, 0x09, 0x82, 0x85, 0xd2, 0xb2, 0x0e, 0x29, + 0x53, 0xa8, 0xaf, 0x07, 0x57, 0xa1, 0x66, 0x80, 0xbd, 0xcc, 0xa2, 0x58, + 0xd6, 0x0b, 0x22, 0x75, 0x73, 0x7a, 0x30, 0xad, 0xa8, 0x2a, 0x5d, 0x09, + 0xf8, 0x6e, 0x85, 0x54, 0x15, 0x6a, 0x65, 0x89, 0x3c, 0x28, 0xa1, 0x2c, + 0x54, 0x79, 0xa4, 0x5a, 0x84, 0x2e, 0x5b, 0x18, 0xc4, 0x09, 0x03, 0xd5, + 0x1b, 0xd4, 0x5f, 0xa0, 0x05, 0xb8, 0xf6, 0x8e, 0x51, 0xcc, 0x2e, 0x41, + 0xfe, 0x8e, 0x51, 0x6e, 0xb9, 0x6c, 0x95, 0x82, 0x60, 0x01, 0x43, 0x67, + 0x0f, 0xb1, 0xe7, 0x91, 0x3d, 0x00, 0x5c, 0x7a, 0xf6, 0x10, 0x8e, 0x2b, + 0x71, 0x5c, 0x05, 0xd4, 0xba, 0xfd, 0x53, 0xab, 0x19, 0x3a, 0x6d, 0x80, + 0x3d, 0xfb, 0x27, 0x99, 0xfa, 0x7a, 0x60, 0x21, 0x72, 0xcb, 0x65, 0xab, + 0xb9, 0xea, 0x8e, 0x1d, 0xe4, 0x4b, 0x0e, 0x98, 0x82, 0xab, 0xee, 0x18, + 0x6d, 0x0f, 0xd4, 0xaa, 0x2b, 0xeb, 0x82, 0x96, 0x75, 0x99, 0x0d, 0x0c, + 0xb2, 0xfd, 0xdf, 0x69, 0xd4, 0x70, 0x40, 0x82, 0xd9, 0xa7, 0x0d, 0xe3, + 0x0a, 0x4e, 0x50, 0xbf, 0x76, 0x8a, 0xc2, 0xb1, 0x3c, 0x19, 0x20, 0x32, + 0x02, 0xe1, 0xad, 0x27, 0x2e, 0xaa, 0xc5, 0xb5, 0x4d, 0x80, 0xae, 0x0e, + 0x0c, 0x2c, 0x5a, 0x1a, 0x99, 0x75, 0x01, 0xd5, 0x05, 0x7c, 0x21, 0x5c, + 0x4b, 0x94, 0xda, 0x5f, 0x53, 0x0a, 0xac, 0x65, 0xe3, 0xb6, 0x31, 0xbe, + 0x6b, 0xe7, 0x17, 0x76, 0x9f, 0x2b, 0xfe, 0x7c, 0xe9, 0x40, 0x6b, 0xe3, + 0x97, 0x4a, 0xc8, 0x58, 0xbb, 0xd2, 0xc2, 0x70, 0xdb, 0x4a, 0xda, 0x4d, + 0x60, 0xad, 0xb9, 0x14, 0xce, 0xdb, 0x03, 0x6c, 0x85, 0xdd, 0x44, 0x57, + 0xeb, 0x36, 0x72, 0x43, 0xed, 0x6d, 0x26, 0xd3, 0xfe, 0x71, 0x3a, 0x99, + 0x42, 0x56, 0x2b, 0x4d, 0x61, 0xd3, 0xe9, 0x8c, 0xef, 0xee, 0x43, 0xe8, + 0xe6, 0xe1, 0x9d, 0xbd, 0x99, 0xca, 0xe5, 0x02, 0x83, 0xc1, 0xe1, 0xb3, + 0xd5, 0xe2, 0xd9, 0xe2, 0xac, 0x43, 0xd1, 0x29, 0x32, 0x7c, 0xf6, 0x10, + 0xe3, 0xfa, 0x3a, 0x7d, 0x3d, 0xe5, 0xb6, 0xb8, 0xcf, 0x86, 0xdd, 0x3d, + 0x43, 0xc2, 0xe8, 0x7e, 0x58, 0x51, 0x43, 0x42, 0x29, 0x25, 0xee, 0xa1, + 0x12, 0x2c, 0xb3, 0x28, 0x1e, 0xcc, 0x63, 0x77, 0x67, 0x1a, 0xfc, 0xa3, + 0x75, 0xf1, 0x8c, 0x82, 0xc2, 0x86, 0x45, 0x73, 0x95, 0xef, 0xcd, 0x84, + 0x36, 0x1e, 0x20, 0x30, 0x1c, 0x87, 0xd6, 0x70, 0xaa, 0xe8, 0x71, 0x3b, + 0x80, 0x55, 0x2b, 0x3f, 0xef, 0xd8, 0x03, 0x6a, 0xed, 0x6c, 0x03, 0xd4, + 0xea, 0xa5, 0x3d, 0x48, 0xab, 0x1d, 0xa8, 0x2b, 0x1a, 0xdf, 0x73, 0xdf, + 0x19, 0x71, 0x0f, 0xa7, 0x55, 0x68, 0xe1, 0xae, 0xed, 0xf5, 0x3a, 0xae, + 0x93, 0xa7, 0x2d, 0x7d, 0x7d, 0x6d, 0xe3, 0x84, 0xf3, 0x6f, 0x97, 0x6f, + 0xbb, 0x32, 0xfa, 0xee, 0x85, 0x42, 0x7b, 0xa0, 0x97, 0xd1, 0xd9, 0x74, + 0x88, 0xdc, 0xf0, 0x5e, 0x2e, 0xb9, 0xe9, 0x71, 0xc6, 0xff, 0xf2, 0xbd, + 0xea, 0x59, 0xf4, 0xe4, 0x01, 0xd6, 0xad, 0x3b, 0x15, 0x50, 0x20, 0xa8, + 0x76, 0x50, 0x28, 0x68, 0x84, 0x47, 0x85, 0x61, 0x53, 0xed, 0x80, 0x54, + 0xed, 0x20, 0x57, 0xed, 0xc2, 0xbf, 0x9e, 0x3a, 0x1a, 0x7b, 0xcd, 0xb7, + 0x82, 0xb6, 0x1d, 0x6d, 0xfb, 0x58, 0x69, 0x70, 0x4a, 0x8c, 0xf6, 0x66, + 0xa0, 0xe4, 0xe0, 0xce, 0x86, 0x9e, 0x4f, 0xe9, 0x34, 0xec, 0x2b, 0xc2, + 0x9f, 0xac, 0x07, 0x60, 0xc7, 0xbf, 0x6f, 0x81, 0x47, 0x26, 0xc8, 0x3d, + 0x92, 0x83, 0xbd, 0x53, 0xe4, 0xda, 0x3c, 0x24, 0x76, 0x60, 0xc2, 0xde, + 0xa9, 0x26, 0x77, 0x77, 0x76, 0x8c, 0x15, 0xef, 0x87, 0x44, 0x98, 0xab, + 0xfb, 0xf2, 0x88, 0xca, 0xca, 0x52, 0xf9, 0x4e, 0xec, 0xca, 0x33, 0x7a, + 0x4f, 0x33, 0xf4, 0xca, 0xf5, 0x8c, 0xf4, 0xce, 0xb2, 0xd9, 0x65, 0x08, + 0x7c, 0x53, 0x19, 0xef, 0x9e, 0x68, 0x9a, 0xe0, 0x8d, 0x09, 0x84, 0x36, + 0x3e, 0x72, 0x1d, 0x52, 0x6e, 0x06, 0x70, 0xc0, 0xb4, 0x60, 0xa6, 0x06, + 0xf7, 0x28, 0xc3, 0x2d, 0x3e, 0x3c, 0x00, 0x87, 0x3a, 0x87, 0xf3, 0x9a, + 0xcb, 0x03, 0x23, 0x1f, 0x77, 0xdf, 0x51, 0x42, 0xb9, 0x3c, 0xb0, 0xd6, + 0x8d, 0x37, 0x41, 0xaf, 0xad, 0xe0, 0x5a, 0x1f, 0x5d, 0xa5, 0x40, 0x5b, + 0x9e, 0xc2, 0xcf, 0x8e, 0x62, 0xa8, 0x9c, 0xb6, 0x05, 0x77, 0x4c, 0xc2, + 0x3b, 0xb4, 0x71, 0xfe, 0xb5, 0x79, 0xe8, 0xe9, 0x0c, 0x08, 0x1a, 0xee, + 0xd3, 0x2d, 0x08, 0xc0, 0xda, 0x81, 0xdc, 0x0e, 0xfb, 0x78, 0xf3, 0x8d, + 0x3f, 0x5a, 0x8d, 0x71, 0x3a, 0x09, 0x3b, 0xd7, 0xd8, 0xce, 0x6b, 0x49, + 0x91, 0x0e, 0x19, 0x2b, 0xa5, 0x53, 0xc8, 0x36, 0xe3, 0x0b, 0x3f, 0x5e, + 0x38, 0x8d, 0x16, 0xfb, 0xed, 0x24, 0x92, 0x66, 0xc3, 0xbe, 0x8c, 0xf4, + 0x8b, 0x45, 0xd8, 0x68, 0xca, 0x4c, 0x21, 0xdd, 0xf6, 0xe5, 0x78, 0xab, + 0x69, 0x70, 0x70, 0x10, 0xd7, 0x75, 0x39, 0xf0, 0xf3, 0xa7, 0x78, 0xf1, + 0xa5, 0x17, 0x7c, 0xf7, 0x4c, 0x26, 0xc3, 0x6f, 0x7e, 0xfe, 0x14, 0x84, + 0xdc, 0x00, 0x5e, 0xd1, 0x00, 0xac, 0xae, 0xae, 0x2e, 0xca, 0xe5, 0x32, + 0xae, 0x26, 0xcb, 0xfc, 0xc7, 0xfd, 0xbb, 0xe8, 0xc9, 0x9c, 0xce, 0xd3, + 0x4f, 0x3f, 0xdd, 0x71, 0xde, 0x5d, 0x5d, 0x5d, 0xe4, 0xf3, 0x79, 0x96, + 0x86, 0xdc, 0x0e, 0x1d, 0x3a, 0x44, 0x26, 0x93, 0xe1, 0xb9, 0x10, 0x68, + 0xab, 0x9d, 0x16, 0x67, 0x32, 0xd4, 0x80, 0x25, 0xaf, 0x3e, 0x41, 0xa2, + 0xaa, 0xce, 0xe1, 0xaf, 0x5e, 0x32, 0x78, 0xb7, 0xf5, 0x3c, 0xef, 0x39, + 0x4d, 0xd5, 0xeb, 0x97, 0xf9, 0x66, 0xb8, 0xc5, 0xab, 0x27, 0x9a, 0xbc, + 0x33, 0xf1, 0x4e, 0x9e, 0xad, 0x3d, 0xcb, 0xb1, 0x2f, 0xba, 0x9c, 0xf0, + 0xb6, 0x34, 0x27, 0x9d, 0x70, 0x12, 0x65, 0xf7, 0xc9, 0x8e, 0xcb, 0xfe, + 0x46, 0x49, 0x2c, 0x12, 0xe4, 0xef, 0xac, 0xe0, 0x32, 0xc4, 0xa8, 0xe9, + 0x20, 0x7f, 0x9a, 0x62, 0xcb, 0xff, 0xb8, 0x92, 0x8d, 0xff, 0x65, 0x07, + 0x00, 0xc3, 0xe7, 0xab, 0xfb, 0xd6, 0xf8, 0xee, 0x71, 0x75, 0xaf, 0x5c, + 0xa6, 0xe2, 0x8d, 0x9c, 0x01, 0x63, 0x0c, 0xe3, 0x3e, 0x36, 0x8e, 0x30, + 0xc0, 0x71, 0x5d, 0x64, 0xdd, 0x01, 0x4c, 0x65, 0x24, 0x2e, 0x51, 0xe0, + 0xa7, 0x94, 0x49, 0xaa, 0xc5, 0x58, 0x67, 0x3e, 0xa0, 0x56, 0x58, 0xb2, + 0x9e, 0x60, 0xf3, 0xdf, 0x6f, 0x60, 0xe3, 0xdf, 0x6e, 0xf5, 0xef, 0x39, + 0x83, 0x2b, 0x60, 0xe2, 0x41, 0x60, 0x36, 0xc1, 0x86, 0xcf, 0xac, 0x46, + 0x99, 0x96, 0xaf, 0x66, 0xeb, 0xb7, 0x75, 0xb9, 0x57, 0x28, 0xe3, 0xcc, + 0xd5, 0x83, 0x80, 0x71, 0x3d, 0x7b, 0xee, 0xdc, 0xa4, 0xc0, 0x04, 0xa1, + 0x71, 0x95, 0xe3, 0xe4, 0x91, 0x15, 0x65, 0xdc, 0x2a, 0x04, 0x24, 0x84, + 0x32, 0xde, 0x4e, 0x69, 0xd8, 0x8e, 0xa3, 0xef, 0x9b, 0xe6, 0x19, 0x36, + 0x76, 0x77, 0x70, 0x8f, 0x14, 0x49, 0xc1, 0x9a, 0x8f, 0xaf, 0x61, 0xdb, + 0x77, 0xb6, 0x35, 0xb8, 0xe5, 0xa7, 0x5d, 0x84, 0x80, 0x94, 0x69, 0xe2, + 0x94, 0x5c, 0x35, 0x16, 0x92, 0x2a, 0xad, 0x94, 0x19, 0x8c, 0x8d, 0x46, + 0xce, 0x53, 0x90, 0x19, 0xab, 0xdb, 0x66, 0xe3, 0x57, 0xb7, 0x62, 0x1a, + 0x20, 0x0c, 0x93, 0x94, 0x50, 0xd7, 0x79, 0x36, 0x9b, 0xf5, 0xdb, 0x27, + 0x0c, 0x23, 0xb3, 0xad, 0x34, 0x76, 0x8f, 0x4d, 0x71, 0x26, 0xf4, 0x8c, + 0x95, 0x30, 0x34, 0x38, 0xc4, 0xe4, 0x23, 0xf3, 0x8f, 0x0b, 0xcf, 0x40, + 0x81, 0x99, 0x9e, 0x06, 0x5a, 0xcd, 0x7e, 0x2d, 0x07, 0x4e, 0xd3, 0x8f, + 0xdd, 0xbf, 0xb9, 0x5d, 0x41, 0xa5, 0xce, 0x03, 0x1e, 0x24, 0x80, 0x06, + 0x6d, 0x05, 0x98, 0x82, 0x6f, 0x00, 0xfb, 0xfb, 0x61, 0xa8, 0xff, 0x18, + 0x12, 0xe2, 0x18, 0x4e, 0x0e, 0xa5, 0xb3, 0xed, 0xf6, 0x46, 0x20, 0x95, + 0x09, 0x9c, 0x02, 0x9c, 0xa0, 0x8f, 0x7f, 0x03, 0xfc, 0xf6, 0x7f, 0xf9, + 0x6f, 0x1d, 0xb5, 0xc2, 0x36, 0x87, 0x47, 0xa4, 0x93, 0x47, 0x91, 0xb6, + 0xf7, 0xe4, 0x7f, 0xcf, 0x39, 0x8b, 0x98, 0x9e, 0x3a, 0xcc, 0x39, 0xe7, + 0x2c, 0x6a, 0x0e, 0x54, 0x87, 0x93, 0x17, 0xc1, 0xf8, 0x61, 0xb5, 0xb5, + 0x81, 0x87, 0x0f, 0x0b, 0xfa, 0x50, 0x90, 0x29, 0x75, 0x47, 0x6b, 0x84, + 0x23, 0x8f, 0x24, 0xe1, 0x3f, 0x80, 0xc7, 0x5f, 0x81, 0x0f, 0xea, 0xb4, + 0x2f, 0x3f, 0xa7, 0x19, 0xa0, 0x7c, 0x40, 0x67, 0x77, 0xa4, 0x45, 0xb6, + 0x4f, 0x9f, 0xb9, 0x08, 0xa6, 0x0e, 0xf3, 0x9b, 0xf7, 0xa8, 0xed, 0x07, + 0x16, 0x49, 0x7e, 0x19, 0x81, 0x6f, 0x79, 0x57, 0xeb, 0x2b, 0xef, 0x59, + 0x84, 0xf8, 0x49, 0xc8, 0xb3, 0xae, 0xc0, 0x56, 0x89, 0x34, 0x0c, 0x77, + 0x29, 0xa8, 0xb7, 0xa7, 0xcb, 0xcf, 0x39, 0x9e, 0xff, 0xf5, 0x13, 0xd9, + 0xb0, 0x9f, 0x35, 0xa0, 0x58, 0x07, 0x6f, 0x66, 0x2c, 0x57, 0x07, 0xca, + 0x0a, 0xd4, 0x60, 0x23, 0xfd, 0xed, 0x84, 0xc2, 0x45, 0x60, 0x01, 0xdb, + 0xea, 0x0a, 0x2b, 0xe4, 0x69, 0x48, 0x80, 0x9b, 0x84, 0x52, 0x39, 0x80, + 0x03, 0x7b, 0x77, 0x85, 0x12, 0x82, 0xb4, 0x42, 0xa5, 0x93, 0x43, 0x52, + 0xaa, 0x2a, 0x00, 0x43, 0x3b, 0x24, 0xf7, 0x25, 0x06, 0x38, 0x49, 0x10, + 0xa1, 0x72, 0x9f, 0x73, 0xce, 0x22, 0xe4, 0xcf, 0x55, 0x1d, 0xc7, 0xab, + 0xea, 0x5c, 0xbc, 0xe1, 0x0a, 0x03, 0x69, 0x3f, 0x7d, 0x3b, 0xb9, 0x6f, + 0xad, 0x7d, 0x5d, 0x92, 0x15, 0xe1, 0x6d, 0xab, 0x39, 0x30, 0x3d, 0x1f, + 0xd5, 0x08, 0xc6, 0x9a, 0x5b, 0x93, 0xfb, 0x61, 0xf4, 0xa1, 0x3c, 0xb7, + 0x8c, 0xfe, 0x0c, 0xa0, 0xe3, 0x78, 0x6f, 0x55, 0x85, 0xc1, 0x30, 0x9d, + 0xcb, 0xeb, 0x5f, 0x64, 0x30, 0x45, 0x9a, 0x4a, 0xd9, 0xeb, 0x37, 0xf7, + 0x80, 0x91, 0x82, 0x7a, 0x85, 0x30, 0x6e, 0xc9, 0x14, 0x26, 0xae, 0x4f, + 0x3b, 0xc8, 0x85, 0x88, 0x86, 0x83, 0x80, 0x8b, 0x69, 0x04, 0x83, 0x29, + 0xd3, 0xb0, 0xa8, 0x94, 0xbd, 0x3b, 0x86, 0x0b, 0x4c, 0x00, 0x79, 0x4c, + 0x63, 0x05, 0x6e, 0x5d, 0x83, 0xe1, 0x8d, 0xb4, 0xbf, 0xef, 0x95, 0xc3, + 0xbb, 0xcb, 0x08, 0xe3, 0x06, 0x84, 0xb0, 0x31, 0x8d, 0x34, 0xa5, 0x2a, + 0x80, 0xcd, 0x68, 0xe1, 0x06, 0x64, 0xdd, 0x9b, 0x7f, 0xb3, 0x11, 0x46, + 0x0e, 0xb7, 0x6e, 0xa9, 0x74, 0x24, 0x8d, 0x40, 0x2d, 0xd4, 0x16, 0x42, + 0xf3, 0x64, 0x42, 0x40, 0x5d, 0xe0, 0x4a, 0x90, 0x2d, 0xdf, 0x16, 0xe8, + 0xfe, 0x7b, 0x9b, 0xd6, 0xba, 0xee, 0xb2, 0x46, 0x48, 0xf0, 0xb5, 0x77, + 0x04, 0xe3, 0x4a, 0x21, 0x6c, 0x2a, 0xa5, 0x56, 0x63, 0x38, 0x1b, 0x61, + 0x98, 0xc8, 0x7a, 0x2e, 0x52, 0x5f, 0xaf, 0x1e, 0x61, 0x48, 0x9c, 0xa3, + 0x60, 0x62, 0xc6, 0x0d, 0x50, 0xbf, 0x86, 0x1b, 0xee, 0x7c, 0x2f, 0x70, + 0x3b, 0x01, 0xaa, 0xea, 0x7a, 0x4c, 0x31, 0x8e, 0x49, 0x9a, 0x99, 0x6a, + 0x4e, 0x03, 0xb5, 0x3a, 0x1b, 0xeb, 0xf4, 0xa0, 0xce, 0xe4, 0x0c, 0x8d, + 0x40, 0xac, 0xe8, 0x71, 0x54, 0x33, 0xa1, 0xf8, 0xed, 0xfc, 0x7b, 0x50, + 0xd0, 0x27, 0x00, 0xfe, 0x91, 0xf9, 0x81, 0x58, 0x3b, 0x81, 0x1f, 0xfe, + 0x10, 0xb6, 0x7c, 0x28, 0x70, 0xf3, 0x26, 0xb0, 0x8e, 0x5a, 0xbd, 0xf4, + 0x52, 0x80, 0x02, 0xac, 0x0c, 0xa5, 0xe7, 0x41, 0xb7, 0xb6, 0xac, 0x84, + 0xf5, 0xeb, 0xd7, 0xfb, 0x59, 0xf6, 0xb2, 0x93, 0x0f, 0x7d, 0xa8, 0xc0, + 0x74, 0x7d, 0x7d, 0x10, 0xf8, 0x43, 0x5b, 0x58, 0x09, 0x6c, 0xf1, 0x7e, + 0x22, 0x1b, 0xa1, 0xb0, 0xbe, 0x97, 0xde, 0x2d, 0x85, 0xa0, 0xac, 0xe1, + 0xba, 0x84, 0x8f, 0x3b, 0xd0, 0xf9, 0xe7, 0x6b, 0x90, 0xd6, 0xf9, 0x81, + 0xdb, 0x6e, 0xbd, 0xbd, 0xff, 0x61, 0xb8, 0x70, 0xb7, 0xf2, 0x3b, 0x1f, + 0xb8, 0x6d, 0x06, 0xee, 0xff, 0x47, 0xb8, 0xf0, 0x36, 0xe8, 0xb9, 0x1c, + 0xb8, 0x9c, 0xce, 0x56, 0x11, 0x19, 0x42, 0xbf, 0xd7, 0x51, 0x12, 0x1f, + 0xc8, 0x22, 0xab, 0x52, 0x7d, 0xb8, 0x64, 0x5f, 0x11, 0xea, 0xfa, 0x7a, + 0x11, 0xea, 0x43, 0x0b, 0x02, 0x90, 0xbd, 0xb6, 0xdf, 0xaf, 0x15, 0x91, + 0x0f, 0x3a, 0x84, 0xe7, 0x73, 0x65, 0xaf, 0xba, 0xdf, 0x8a, 0x42, 0x11, + 0xce, 0xca, 0x40, 0x55, 0xe2, 0xfe, 0x34, 0x87, 0xec, 0x49, 0x23, 0xf4, + 0xb1, 0x97, 0xb3, 0x97, 0x8e, 0xec, 0xb5, 0x91, 0xfb, 0xe6, 0x00, 0x73, + 0x7b, 0xe1, 0x35, 0x98, 0x5d, 0x18, 0x82, 0x99, 0x76, 0xef, 0x55, 0xeb, + 0xd2, 0x9f, 0x93, 0x88, 0x5e, 0xab, 0xfe, 0xbc, 0xb4, 0x2e, 0x80, 0x69, + 0x5a, 0xb8, 0x2d, 0xde, 0x21, 0x7a, 0x91, 0xbd, 0xfb, 0xa6, 0x3d, 0x35, + 0x49, 0xb1, 0x7f, 0x00, 0x7b, 0x6a, 0x92, 0xdc, 0x43, 0xe3, 0xb8, 0x75, + 0xd8, 0x70, 0xe1, 0x08, 0xdb, 0xff, 0x60, 0x00, 0xf7, 0xda, 0x0d, 0x20, + 0x25, 0xab, 0xce, 0x1e, 0x64, 0xfc, 0x4f, 0xd7, 0x22, 0xd1, 0x20, 0xa8, + 0x79, 0x6b, 0x13, 0x00, 0x9e, 0xa4, 0x90, 0x0a, 0xf8, 0xd4, 0x62, 0x0c, + 0x7e, 0x34, 0x12, 0x22, 0x84, 0x80, 0x14, 0x41, 0x1f, 0x27, 0xe3, 0x81, + 0x9b, 0xea, 0x52, 0xbf, 0xef, 0xc4, 0x7f, 0x91, 0x67, 0xa1, 0xce, 0x7d, + 0xb1, 0x2e, 0x19, 0x48, 0x0b, 0xf2, 0x25, 0xc9, 0x8c, 0x84, 0x1e, 0x3d, + 0x55, 0x90, 0x2b, 0x01, 0x86, 0x68, 0xf8, 0x54, 0x8a, 0xd0, 0x70, 0x28, + 0x59, 0x07, 0xd7, 0x95, 0x1a, 0x20, 0x25, 0x58, 0x97, 0x36, 0xb9, 0x5e, + 0x2a, 0xc0, 0x16, 0x49, 0xc1, 0xb0, 0x21, 0x98, 0xa8, 0x13, 0xcc, 0x85, + 0x49, 0xe9, 0xbf, 0xe3, 0xec, 0x01, 0x66, 0x0c, 0xb0, 0xa5, 0x4a, 0xdf, + 0xfb, 0x85, 0x55, 0xd0, 0xe7, 0xb3, 0xee, 0x41, 0xab, 0x24, 0xe4, 0x73, + 0x94, 0x0c, 0xe0, 0xac, 0x01, 0xc2, 0xf2, 0x80, 0x5a, 0x09, 0x7d, 0x0d, + 0xb8, 0x8f, 0xe5, 0xa9, 0x20, 0xc9, 0x98, 0x90, 0x35, 0x13, 0xe4, 0x5c, + 0xfd, 0xbe, 0xcb, 0x00, 0xbb, 0xae, 0xfa, 0x62, 0x19, 0x43, 0x81, 0xb5, + 0x84, 0x08, 0x03, 0xb5, 0x54, 0xf9, 0xc3, 0x75, 0x2c, 0x02, 0x96, 0x17, + 0xcd, 0xa1, 0x00, 0x00, 0x20, 0x00, 0x49, 0x44, 0x41, 0x54, 0xb2, 0xae, + 0x20, 0x57, 0x29, 0x44, 0x18, 0x89, 0xa3, 0x20, 0x5a, 0x86, 0x6a, 0xc7, + 0x7e, 0xf0, 0x81, 0x5a, 0x12, 0x89, 0x14, 0x8d, 0xbf, 0x85, 0x4c, 0x12, + 0x0d, 0x21, 0xf3, 0xa3, 0x23, 0x00, 0xab, 0xcb, 0x44, 0xb8, 0x92, 0xa2, + 0xbe, 0x2e, 0x07, 0xba, 0x60, 0xb2, 0x2c, 0x49, 0xd5, 0x05, 0x69, 0xd1, + 0xd9, 0x18, 0xf6, 0x74, 0x9d, 0xa0, 0xb7, 0x5d, 0x7a, 0xd2, 0x22, 0x90, + 0xc1, 0xf1, 0xe2, 0x67, 0xbb, 0x5b, 0x86, 0x7b, 0xad, 0x5b, 0x2f, 0xbd, + 0xc5, 0xa1, 0x1a, 0xfe, 0x7c, 0xff, 0x41, 0xce, 0xcd, 0x76, 0xf3, 0x50, + 0xee, 0x20, 0x4e, 0xee, 0xa0, 0x1a, 0x8c, 0xfd, 0xea, 0x09, 0xce, 0xcd, + 0x76, 0x33, 0xb6, 0x7f, 0x9c, 0x73, 0x87, 0xb2, 0x2c, 0xfd, 0x50, 0x2f, + 0xbf, 0xb9, 0xf5, 0x45, 0x3f, 0x8e, 0x17, 0x3f, 0x23, 0xfb, 0xfd, 0x76, + 0x59, 0xec, 0xed, 0x68, 0xb7, 0x86, 0xbc, 0x9f, 0xed, 0x86, 0x67, 0x55, + 0x50, 0xe7, 0xd1, 0x92, 0x4e, 0xa3, 0xbb, 0xa1, 0x2d, 0xe6, 0x4f, 0x53, + 0x6d, 0xbd, 0x7e, 0xf7, 0x62, 0x9d, 0xe6, 0x62, 0xba, 0x71, 0xc6, 0x4a, + 0x1c, 0xcb, 0x71, 0x41, 0x9a, 0xda, 0x3d, 0x5a, 0xa6, 0x20, 0xcd, 0x20, + 0x9f, 0x4c, 0xb8, 0xbc, 0xb2, 0xdf, 0x3f, 0xc7, 0xce, 0x98, 0x2a, 0xa7, + 0x9f, 0xee, 0xb3, 0x8d, 0x65, 0xce, 0xc8, 0x7e, 0xac, 0x11, 0x3d, 0xfa, + 0xfd, 0xd9, 0x34, 0xf3, 0x49, 0x24, 0x45, 0xd3, 0xe0, 0xba, 0x52, 0x95, + 0x98, 0x5d, 0x73, 0x44, 0x92, 0x15, 0x84, 0x29, 0xa0, 0x0a, 0xab, 0xce, + 0x5b, 0xc1, 0xe8, 0x83, 0xbb, 0x5a, 0x06, 0xb3, 0x6d, 0x1b, 0xea, 0x50, + 0x2c, 0x96, 0xf4, 0x1c, 0xb5, 0x07, 0x12, 0x14, 0xe4, 0xf2, 0x39, 0x0d, + 0xc0, 0x4a, 0x90, 0xe8, 0x4a, 0x51, 0x2b, 0x37, 0xce, 0x09, 0x0a, 0xa3, + 0xd6, 0x00, 0xd5, 0x9a, 0x2b, 0x6c, 0x43, 0xd1, 0xea, 0x1a, 0x49, 0xd7, + 0xa2, 0x83, 0x95, 0x32, 0x4d, 0x2a, 0x75, 0x97, 0x94, 0x21, 0x14, 0x58, + 0xd4, 0x48, 0x20, 0x5a, 0x7c, 0xd8, 0xa7, 0x56, 0xae, 0x41, 0x17, 0xc1, + 0x3d, 0x4d, 0xcb, 0x95, 0x35, 0x4c, 0x91, 0x50, 0x6e, 0x91, 0x39, 0x5b, + 0x0f, 0x9e, 0x25, 0xea, 0x15, 0xa4, 0x91, 0x60, 0x32, 0x17, 0x7a, 0xaf, + 0xe9, 0xcf, 0xd9, 0x4a, 0x3c, 0x64, 0x99, 0x6b, 0xa8, 0x46, 0x4f, 0xdb, + 0x69, 0xfa, 0x97, 0xf7, 0x23, 0x16, 0x09, 0xe4, 0x61, 0xe9, 0x43, 0xba, + 0x9c, 0x69, 0x07, 0x3b, 0x6d, 0x93, 0x12, 0x16, 0x15, 0xe9, 0xf8, 0x65, + 0xda, 0x7c, 0xe7, 0x76, 0xfa, 0xbb, 0x53, 0x8c, 0x7f, 0x7f, 0x9c, 0xcc, + 0xd9, 0x43, 0xd8, 0xcb, 0x2c, 0x0d, 0xd7, 0x9a, 0x5f, 0x1e, 0x80, 0x2a, + 0x0a, 0xa2, 0x0a, 0xfb, 0xfb, 0x65, 0x8e, 0x40, 0xab, 0xc2, 0x71, 0xa2, + 0xf0, 0xa9, 0xb6, 0x69, 0x75, 0xab, 0x27, 0x53, 0xd8, 0xff, 0xc1, 0x2d, + 0x37, 0xf3, 0x3f, 0xef, 0xfd, 0x31, 0x9b, 0x1f, 0xdd, 0x89, 0x9c, 0x95, + 0x0d, 0x00, 0x2a, 0x22, 0x61, 0x9b, 0xd2, 0xea, 0x16, 0xc8, 0x89, 0xc6, + 0x1f, 0x6b, 0x13, 0xa8, 0x2b, 0x02, 0xc4, 0x02, 0x78, 0xe6, 0x97, 0xea, + 0x73, 0x48, 0x1f, 0xeb, 0xfb, 0x53, 0x7e, 0x58, 0xfd, 0x77, 0x15, 0x66, + 0xd0, 0x84, 0x16, 0x71, 0x5b, 0xed, 0x37, 0x01, 0xbd, 0x42, 0xf3, 0xd9, + 0xed, 0x80, 0x5b, 0x2d, 0xd3, 0x3a, 0xfd, 0xed, 0x2c, 0x79, 0xca, 0x6c, + 0x00, 0x6a, 0x2d, 0x3e, 0x21, 0x98, 0xa7, 0x5b, 0x7c, 0x82, 0xdd, 0x74, + 0x0c, 0x70, 0xf0, 0xf0, 0x43, 0x7c, 0x70, 0xe0, 0x32, 0x72, 0x8f, 0xff, + 0x6f, 0x7e, 0xd3, 0xf0, 0x69, 0xa7, 0x58, 0xb1, 0x62, 0xc5, 0x8a, 0x15, + 0x2b, 0x56, 0xac, 0x58, 0xb1, 0x62, 0xc5, 0x8a, 0x15, 0x2b, 0x56, 0xac, + 0x58, 0xb1, 0x62, 0xc5, 0x8a, 0x15, 0x2b, 0x56, 0xac, 0x58, 0xb1, 0x62, + 0xc5, 0x8a, 0xb5, 0x50, 0xc5, 0x50, 0xad, 0x58, 0xb1, 0x62, 0xc5, 0x8a, + 0x15, 0xeb, 0x77, 0x50, 0x61, 0x23, 0x6b, 0x59, 0x97, 0x38, 0xb3, 0x73, + 0x1b, 0xc3, 0x47, 0xc3, 0x47, 0xf7, 0xa3, 0xdb, 0xd7, 0x23, 0xec, 0x42, + 0xc1, 0x5a, 0xed, 0xd2, 0xed, 0xa4, 0x2c, 0x9d, 0x84, 0xed, 0xa4, 0xcc, + 0xed, 0xc2, 0x59, 0xa6, 0x45, 0x69, 0xb6, 0xd1, 0x70, 0x64, 0x21, 0xe5, + 0x69, 0x54, 0xd0, 0x2e, 0xde, 0xe2, 0xed, 0x94, 0x54, 0xce, 0xb2, 0x0e, + 0x24, 0x95, 0x7b, 0x31, 0xbc, 0x30, 0x34, 0xd4, 0x63, 0x13, 0x06, 0xfe, + 0x02, 0x5a, 0xe9, 0x80, 0x58, 0x22, 0x11, 0xd3, 0x50, 0x73, 0x25, 0xf2, + 0x20, 0xe0, 0x4a, 0xa8, 0x07, 0x79, 0x84, 0x0d, 0x6f, 0x85, 0x11, 0x18, + 0xf2, 0x88, 0x16, 0xab, 0x4a, 0x2d, 0x94, 0x39, 0x91, 0x53, 0x96, 0x3e, + 0x50, 0xeb, 0xca, 0x0f, 0x5f, 0xd2, 0x04, 0xf3, 0x72, 0xf4, 0x67, 0xe9, + 0x33, 0x7d, 0x16, 0x6e, 0xa9, 0xc2, 0xda, 0x6f, 0xef, 0x20, 0xdb, 0x67, + 0x31, 0x74, 0xda, 0x80, 0xaa, 0x9e, 0x10, 0xdc, 0x72, 0xd9, 0x2a, 0xae, + 0xbd, 0x63, 0x54, 0x2d, 0xc8, 0x35, 0xd1, 0x85, 0x9e, 0xe7, 0x37, 0x51, + 0x6d, 0xae, 0x8b, 0x5b, 0x6e, 0xfe, 0x2d, 0xb5, 0xfb, 0x7d, 0xe5, 0xa7, + 0x1d, 0x32, 0x7d, 0x96, 0x3a, 0x0f, 0xfe, 0x57, 0x99, 0xe7, 0xc9, 0xd3, + 0x33, 0xd2, 0xa8, 0xab, 0xaf, 0xd3, 0x0a, 0x1b, 0x58, 0x06, 0x09, 0xfd, + 0xe5, 0xeb, 0x5a, 0x55, 0xfa, 0x8b, 0x8a, 0x7d, 0xc0, 0x12, 0xaf, 0x11, + 0xc0, 0xf0, 0x06, 0xf6, 0xbc, 0xe7, 0x83, 0x66, 0x75, 0x1a, 0xe7, 0x4d, + 0x95, 0x36, 0x62, 0xe8, 0x44, 0xb2, 0xdc, 0x7c, 0x6d, 0xbd, 0x96, 0xf2, + 0x2b, 0x00, 0x59, 0xba, 0x63, 0xe8, 0xc5, 0x5b, 0x4d, 0x9e, 0x31, 0xbc, + 0xdd, 0x6d, 0x37, 0xb5, 0x5d, 0x2a, 0x99, 0xa2, 0x38, 0xeb, 0x60, 0x77, + 0xdb, 0xb8, 0x15, 0x97, 0x6c, 0x26, 0x73, 0x54, 0x80, 0xad, 0x91, 0xf3, + 0x86, 0xb9, 0xe1, 0xa7, 0x37, 0xa9, 0x85, 0xf5, 0x10, 0x18, 0x44, 0x69, + 0x85, 0x8f, 0xc3, 0x50, 0xab, 0xb9, 0x00, 0x5c, 0x32, 0x02, 0x57, 0xcb, + 0x66, 0xb3, 0x4d, 0xe1, 0x3c, 0xc0, 0x56, 0x18, 0x1e, 0xd6, 0x0e, 0x8e, + 0x55, 0x72, 0xdd, 0xb6, 0xe5, 0x7b, 0xa3, 0x15, 0x06, 0x35, 0x9d, 0x4a, + 0x33, 0xd0, 0x0a, 0x1a, 0x41, 0x4f, 0x61, 0xff, 0x00, 0x92, 0xd5, 0x1a, + 0x36, 0xd5, 0x2e, 0xce, 0x96, 0x16, 0xd8, 0xa8, 0xb9, 0x80, 0x54, 0xbd, + 0xa1, 0x6d, 0x2b, 0x98, 0x56, 0x6b, 0xb0, 0x56, 0x2f, 0x05, 0x0a, 0xbe, + 0x9d, 0xde, 0x4a, 0x56, 0x52, 0xd0, 0xb1, 0x77, 0x86, 0xf2, 0x5f, 0x19, + 0x89, 0x5d, 0xd0, 0xa0, 0xaf, 0xf9, 0xea, 0xb4, 0x52, 0xef, 0x17, 0x42, + 0xfb, 0x2b, 0x99, 0x1b, 0xda, 0xe5, 0x85, 0x59, 0xa9, 0xcb, 0xe6, 0x1d, + 0xef, 0x64, 0xee, 0x76, 0xfc, 0xe7, 0x0e, 0xea, 0xdb, 0x89, 0x1e, 0x98, + 0x7c, 0x9c, 0x4b, 0x42, 0xb6, 0x21, 0x43, 0xfd, 0xa7, 0xb2, 0xe7, 0xc9, + 0x03, 0xdc, 0x7d, 0xfa, 0xa9, 0xaf, 0x31, 0xc5, 0xa3, 0x53, 0x18, 0xae, + 0x75, 0xaa, 0xd1, 0xda, 0xbd, 0x1d, 0x80, 0x2b, 0xea, 0xde, 0x2e, 0xad, + 0x76, 0x61, 0x3a, 0xc9, 0xa3, 0x3f, 0xe4, 0x7e, 0xd3, 0x02, 0xf7, 0xc3, + 0xda, 0x6a, 0xb4, 0xde, 0xbf, 0x60, 0x81, 0xcf, 0xd2, 0xed, 0x06, 0xf3, + 0x7f, 0xbb, 0xdb, 0xd1, 0xcf, 0x04, 0xcf, 0x30, 0x39, 0x6c, 0x78, 0x78, + 0x46, 0x06, 0x0e, 0x55, 0x30, 0x97, 0x0f, 0x07, 0x10, 0x29, 0x0d, 0xd7, + 0xe2, 0x93, 0xc3, 0xfa, 0xc7, 0xd8, 0x0c, 0xce, 0x9a, 0x4b, 0xa3, 0x8f, + 0x08, 0x48, 0x4a, 0xb6, 0x9c, 0x15, 0x82, 0x0e, 0x89, 0x5b, 0xfc, 0xfd, + 0x4d, 0x85, 0x0b, 0xc8, 0xdf, 0x23, 0xc8, 0x27, 0x51, 0xb6, 0xde, 0xdf, + 0x4e, 0x37, 0x27, 0xb2, 0x6d, 0x03, 0xe2, 0xa1, 0x4d, 0xdc, 0x3a, 0x2d, + 0xe0, 0x2c, 0x60, 0x3a, 0x80, 0x5d, 0x51, 0xd0, 0x06, 0xa4, 0x45, 0x07, + 0x2e, 0xca, 0xc3, 0x63, 0x70, 0xd3, 0x63, 0x79, 0xb8, 0xc8, 0x82, 0x87, + 0x32, 0x0a, 0x46, 0xe5, 0xe9, 0x9b, 0x7a, 0xff, 0x13, 0x73, 0x97, 0xd9, + 0xab, 0x7f, 0x14, 0xa4, 0xd5, 0xd0, 0x2e, 0xaf, 0x45, 0xbd, 0x36, 0x14, + 0x8a, 0xea, 0xcf, 0x83, 0x69, 0x85, 0x8d, 0x6a, 0xa7, 0x73, 0x8d, 0x30, + 0xad, 0x76, 0xfa, 0xfc, 0x06, 0xb8, 0x77, 0x6c, 0xde, 0x60, 0x9b, 0xff, + 0xe9, 0x7a, 0xa0, 0x05, 0x00, 0xd8, 0xdd, 0x8a, 0xb0, 0x36, 0xb4, 0x8c, + 0x23, 0x84, 0xd5, 0xe4, 0x96, 0xcf, 0xab, 0x32, 0xde, 0x70, 0x9d, 0x82, + 0xcf, 0x2e, 0xb4, 0x5f, 0xe1, 0x56, 0x4b, 0xa4, 0xcd, 0x9e, 0xa6, 0xb2, + 0xb4, 0xdb, 0x9f, 0xcf, 0xbf, 0xd5, 0x7e, 0x4b, 0xb7, 0x10, 0x50, 0xcb, + 0xf7, 0x4b, 0xb7, 0x07, 0x5a, 0x2d, 0xa4, 0x6c, 0x0d, 0xf1, 0x42, 0x40, + 0xad, 0xb0, 0x9b, 0x6f, 0xf0, 0x6c, 0xb6, 0x28, 0x87, 0x99, 0x6a, 0x4d, + 0xc9, 0x79, 0x8d, 0x0a, 0x8f, 0x3c, 0xda, 0x8d, 0x42, 0x16, 0xd2, 0x6b, + 0x08, 0x87, 0x9d, 0x98, 0x98, 0xe0, 0xc4, 0x13, 0xde, 0xc6, 0x89, 0x27, + 0x08, 0x4e, 0x3c, 0x21, 0xf0, 0x39, 0xf0, 0xf3, 0xa7, 0x78, 0x7b, 0x04, + 0xa8, 0xe5, 0x69, 0xf2, 0xfe, 0xfb, 0x01, 0xf8, 0x75, 0x06, 0x12, 0x87, + 0x8e, 0xa3, 0x96, 0x79, 0x85, 0x77, 0xe4, 0x69, 0x09, 0xb0, 0x8a, 0x96, + 0x3d, 0x9c, 0x7f, 0x3e, 0x9f, 0x67, 0xc9, 0x92, 0x25, 0x10, 0x02, 0x68, + 0x2d, 0x59, 0xb2, 0xa4, 0x09, 0xb4, 0xd5, 0x4e, 0xa6, 0x69, 0x52, 0x28, + 0x14, 0x28, 0xf3, 0x7b, 0x74, 0xd9, 0x5d, 0x9c, 0x72, 0xca, 0x29, 0x3c, + 0xfa, 0xe8, 0xa3, 0xe4, 0x7f, 0xfd, 0x7b, 0x9c, 0xd9, 0xfd, 0x76, 0x00, + 0x9e, 0x0b, 0xe5, 0x0b, 0x01, 0x50, 0x0b, 0xe0, 0x84, 0x17, 0x5f, 0xc0, + 0x3c, 0xe1, 0x04, 0x38, 0xe1, 0x24, 0x9e, 0xad, 0x3d, 0xcb, 0x3b, 0xcd, + 0xd3, 0xe7, 0x04, 0x6b, 0xcd, 0x55, 0x97, 0xd7, 0xe3, 0xbc, 0x00, 0x8c, + 0x2d, 0xcf, 0x22, 0xee, 0x1c, 0xc7, 0x64, 0x0f, 0xd9, 0x07, 0x87, 0x19, + 0xbd, 0xbf, 0x86, 0xf8, 0x8c, 0x60, 0xf8, 0xf3, 0xab, 0x18, 0xff, 0xd2, + 0x28, 0xe3, 0x9f, 0x54, 0xf7, 0x50, 0xcf, 0xf0, 0x5d, 0x94, 0xc7, 0x19, + 0xdf, 0x05, 0x33, 0x65, 0xb8, 0xfa, 0xb2, 0x11, 0x6e, 0x7d, 0x4c, 0xa5, + 0x63, 0x75, 0x0b, 0x8a, 0xa1, 0xdb, 0x8f, 0x10, 0x90, 0x5e, 0xa2, 0x7e, + 0xcb, 0x66, 0xaa, 0xf9, 0x37, 0x2d, 0xc3, 0x63, 0xee, 0x36, 0x80, 0x2d, + 0x4b, 0x83, 0x57, 0x64, 0x1d, 0xd6, 0xfc, 0xc5, 0x7a, 0x52, 0x22, 0x8d, + 0x58, 0xa2, 0x7e, 0xff, 0x76, 0x1d, 0x26, 0x66, 0xc7, 0x60, 0xd9, 0x08, + 0xb7, 0x7e, 0x77, 0x07, 0x57, 0x7c, 0x42, 0x01, 0xb5, 0xa4, 0x54, 0xe1, + 0x2b, 0xae, 0xcb, 0x8e, 0x47, 0x12, 0xe4, 0xef, 0xd9, 0xcc, 0xe6, 0xaf, + 0x6d, 0x44, 0xcc, 0x66, 0x9a, 0xfa, 0xd2, 0x7e, 0xfe, 0xa9, 0x94, 0xcf, + 0x7c, 0x4e, 0x99, 0x20, 0x84, 0x49, 0xca, 0x74, 0xe1, 0x34, 0x75, 0xff, + 0x92, 0x12, 0xdc, 0x43, 0x15, 0xa4, 0x36, 0x2e, 0x14, 0x49, 0xc1, 0xf6, + 0x3b, 0xb7, 0x37, 0xcc, 0x15, 0xc8, 0xaa, 0xc4, 0x3d, 0x54, 0xa1, 0x22, + 0x4b, 0xa4, 0x44, 0xda, 0x4f, 0xb7, 0x21, 0x1f, 0x43, 0x20, 0x96, 0x40, + 0x2e, 0xe7, 0x90, 0xcd, 0x5a, 0x64, 0x7b, 0x4c, 0x72, 0x33, 0xea, 0xc2, + 0x15, 0x89, 0x04, 0xce, 0xa1, 0xe0, 0x5e, 0x18, 0x6e, 0x9f, 0x5c, 0x2e, + 0xd7, 0xb2, 0xdf, 0x1f, 0x56, 0x22, 0x39, 0xa7, 0x37, 0x10, 0x40, 0x20, + 0xfe, 0x16, 0xb8, 0xad, 0x85, 0xff, 0x3e, 0xfd, 0xb7, 0x1c, 0x58, 0x87, + 0x32, 0x4c, 0x4e, 0x03, 0x25, 0xd4, 0xef, 0xfa, 0xd8, 0x7e, 0xf8, 0x72, + 0xff, 0x31, 0x14, 0xef, 0x3a, 0x02, 0x80, 0x33, 0x05, 0xcb, 0xa7, 0x8e, + 0xb0, 0x87, 0x23, 0xfe, 0x5c, 0xc8, 0x4c, 0x24, 0x4d, 0x13, 0xc5, 0x94, + 0xf8, 0xfb, 0x90, 0xdb, 0x56, 0xe0, 0xdf, 0x81, 0x9f, 0xd2, 0xf1, 0x70, + 0xf6, 0xff, 0xd3, 0x3a, 0x15, 0xd5, 0xbe, 0x10, 0x18, 0x83, 0x13, 0x72, + 0x7b, 0xbd, 0x35, 0x3d, 0x75, 0x98, 0xbe, 0xfe, 0x80, 0xd8, 0xf4, 0xb3, + 0x63, 0xd4, 0xd6, 0x83, 0x38, 0x09, 0x68, 0x00, 0x64, 0xb5, 0xba, 0x6a, + 0xfe, 0xe3, 0x98, 0xce, 0xd2, 0x9e, 0xb3, 0x1c, 0x40, 0x5f, 0x3f, 0xdc, + 0xf6, 0x93, 0x97, 0xf9, 0xc0, 0xa2, 0xc6, 0x32, 0x00, 0xbc, 0x4f, 0x80, + 0xf3, 0x72, 0x70, 0xbc, 0x38, 0x9c, 0xac, 0xa1, 0xe6, 0x94, 0x2a, 0x25, + 0x70, 0xab, 0x60, 0x26, 0x5b, 0x97, 0xf3, 0x36, 0x04, 0x36, 0x87, 0x19, + 0x35, 0x80, 0x3a, 0x5c, 0x89, 0xf4, 0x0d, 0xbb, 0x07, 0x05, 0xcc, 0x05, + 0x7b, 0x0f, 0xfb, 0xb8, 0x80, 0x6b, 0x04, 0x46, 0xe1, 0xdb, 0xca, 0xea, + 0xfa, 0xb4, 0x75, 0xa8, 0x0a, 0xd2, 0x07, 0xcf, 0xd9, 0x7e, 0x5c, 0x41, + 0xeb, 0x52, 0x81, 0x6d, 0x42, 0xcb, 0xd9, 0x18, 0x09, 0x3f, 0xf9, 0x09, + 0x7c, 0xf0, 0x1c, 0x98, 0x5e, 0x58, 0xf7, 0xb8, 0xa5, 0x44, 0xd2, 0x33, + 0xa4, 0x9f, 0xbf, 0x83, 0xe0, 0x01, 0xb5, 0xde, 0xe8, 0x19, 0x81, 0xbb, + 0x6f, 0x1e, 0xe7, 0xd2, 0xab, 0x55, 0xbf, 0x7b, 0x21, 0x60, 0xac, 0x81, + 0xd3, 0x00, 0x32, 0xac, 0xff, 0xec, 0x6f, 0x1f, 0xa6, 0x65, 0x7f, 0x54, + 0x52, 0xfc, 0xfe, 0xd1, 0xb7, 0x94, 0x07, 0x88, 0xe9, 0x1c, 0xb0, 0x95, + 0x41, 0x61, 0xf6, 0x26, 0x71, 0x65, 0x82, 0x4c, 0x4f, 0x86, 0x92, 0xdc, + 0x03, 0x58, 0x50, 0xcf, 0x35, 0x85, 0x76, 0xa5, 0xab, 0xc0, 0x5a, 0xee, + 0x58, 0x24, 0x8d, 0x09, 0xe5, 0x5f, 0x17, 0xd8, 0x5d, 0x59, 0x5c, 0x59, + 0xc2, 0xad, 0x3b, 0xd8, 0x5d, 0x59, 0x66, 0xaa, 0x63, 0xa8, 0xbb, 0xbe, + 0x4e, 0xa3, 0x5e, 0x52, 0x70, 0x29, 0xf6, 0x84, 0xf6, 0x07, 0xf1, 0xa0, + 0x5b, 0x90, 0x26, 0x95, 0xb6, 0x70, 0x67, 0x6d, 0xa4, 0x2c, 0x92, 0xea, + 0xcd, 0xaa, 0xfd, 0xea, 0x98, 0x9e, 0x03, 0xb6, 0x51, 0xbf, 0xf6, 0xa2, + 0x9a, 0x37, 0x26, 0x32, 0x2e, 0xa8, 0x8b, 0x60, 0xae, 0xd7, 0x50, 0x98, + 0x04, 0x57, 0x7f, 0x19, 0x23, 0x0c, 0xda, 0xea, 0x44, 0x89, 0x16, 0x6e, + 0xd7, 0xde, 0x71, 0x09, 0x00, 0xd7, 0x5d, 0xf6, 0x23, 0x56, 0xf7, 0x41, + 0x26, 0xdb, 0xcf, 0xb5, 0x77, 0x5c, 0x07, 0xf2, 0xda, 0x50, 0x59, 0xc3, + 0x7d, 0xc9, 0xa2, 0x5f, 0xee, 0xa0, 0xbe, 0x1e, 0xb0, 0xd8, 0xc3, 0xe4, + 0x65, 0x08, 0x00, 0x67, 0x60, 0x0a, 0x1b, 0xb7, 0xba, 0x11, 0x0f, 0x65, + 0xb5, 0xaa, 0xef, 0x7a, 0x46, 0xa7, 0xd7, 0x72, 0xcd, 0x47, 0x32, 0x6c, + 0xdd, 0xb9, 0x03, 0x7b, 0x99, 0x6a, 0x57, 0x57, 0x5a, 0x1a, 0xac, 0x35, + 0x7f, 0x5d, 0x76, 0xeb, 0xd4, 0xbc, 0xbf, 0x19, 0xed, 0xde, 0xa3, 0xb7, + 0x33, 0xb4, 0x57, 0x4f, 0x64, 0xbb, 0x9b, 0x16, 0x60, 0x2e, 0xed, 0xd0, + 0xfb, 0x39, 0x28, 0x74, 0x02, 0x99, 0xfa, 0xd0, 0x87, 0x1a, 0x8f, 0x77, + 0x76, 0x10, 0xa7, 0x03, 0x15, 0xd6, 0xab, 0xf9, 0xa9, 0xcd, 0x9f, 0x53, + 0xc7, 0xf7, 0x47, 0xca, 0xf2, 0x83, 0x1f, 0xa8, 0xcc, 0xd6, 0xaf, 0x57, + 0x1e, 0xbd, 0x7a, 0xb2, 0xeb, 0xc2, 0x0b, 0xb7, 0x70, 0xff, 0x47, 0x7a, + 0x61, 0xfd, 0x4a, 0x05, 0xde, 0xda, 0x09, 0xeb, 0xbd, 0x9f, 0xca, 0x16, + 0xd8, 0xb2, 0xb2, 0xc0, 0xca, 0xf5, 0x7a, 0x6e, 0x6e, 0x0b, 0xcd, 0x10, + 0xb0, 0xf5, 0x2a, 0x1c, 0xeb, 0x23, 0xb0, 0xb0, 0x48, 0xbd, 0x1e, 0xfa, + 0xb3, 0x1e, 0x36, 0x7d, 0x6f, 0x86, 0x4d, 0x22, 0x80, 0x67, 0x5d, 0x7e, + 0x39, 0xcc, 0xcc, 0xe8, 0x72, 0xec, 0x86, 0xfb, 0x05, 0x3c, 0xd4, 0xd3, + 0xc3, 0xdf, 0x31, 0xc3, 0xfd, 0x0f, 0xeb, 0x7a, 0x08, 0x85, 0x57, 0xe3, + 0x36, 0xe0, 0xaa, 0x0e, 0x1a, 0x22, 0x32, 0x0f, 0x6c, 0x1a, 0x82, 0x12, + 0x12, 0xf6, 0xe6, 0xd5, 0xdc, 0xbf, 0x01, 0xa5, 0xb2, 0xa3, 0xe0, 0x25, + 0xc9, 0x10, 0x30, 0xab, 0x2a, 0xe7, 0x7f, 0x57, 0xb2, 0x2f, 0xaf, 0x20, + 0x5b, 0xbd, 0x36, 0x62, 0x6f, 0x1e, 0x71, 0x56, 0x06, 0xd9, 0x67, 0x2b, + 0x37, 0x3d, 0x0f, 0x2c, 0xa5, 0x0c, 0xc2, 0x24, 0x05, 0x3c, 0xdc, 0x7c, + 0x3f, 0x99, 0x57, 0x91, 0x0f, 0x39, 0xf8, 0x0a, 0x8d, 0x7b, 0xe7, 0x7a, + 0xb3, 0x65, 0x9a, 0x26, 0x52, 0x06, 0x63, 0x6a, 0x2b, 0x9d, 0xc1, 0x29, + 0x05, 0xd7, 0x99, 0x10, 0x82, 0x99, 0xaf, 0x6d, 0x22, 0x7b, 0xfe, 0x30, + 0xc3, 0xa9, 0x34, 0x37, 0xfd, 0xeb, 0x66, 0x72, 0x0f, 0x8d, 0x63, 0x2e, + 0xb3, 0x91, 0xe5, 0x0a, 0x37, 0x7d, 0x7f, 0x14, 0xbe, 0xbc, 0x81, 0xcc, + 0x69, 0x36, 0x95, 0xd5, 0xeb, 0x19, 0x97, 0x5b, 0x55, 0xba, 0x22, 0x4d, + 0xbb, 0x67, 0xb1, 0x0f, 0x1f, 0xf3, 0x68, 0xc0, 0x84, 0x00, 0x7e, 0x02, + 0xff, 0xbc, 0xbc, 0x9e, 0x1f, 0x9d, 0x18, 0x4a, 0x0b, 0x26, 0x4b, 0xa1, + 0x77, 0xa2, 0x40, 0x5e, 0x03, 0xbc, 0xa5, 0x6c, 0x2e, 0x69, 0x05, 0x70, + 0xb4, 0xbf, 0x17, 0x4f, 0x4a, 0xe8, 0x91, 0x90, 0x93, 0x01, 0x0f, 0x4b, + 0x41, 0x9f, 0x14, 0x98, 0x4b, 0x7a, 0x0d, 0xdd, 0x90, 0x58, 0x70, 0xe0, + 0x24, 0x05, 0x2e, 0xb0, 0xae, 0xdb, 0x62, 0x62, 0xbf, 0x83, 0x65, 0x0a, + 0x44, 0x59, 0x92, 0x4a, 0x0b, 0x2a, 0x65, 0x75, 0xc7, 0x2e, 0x49, 0xc8, + 0xa4, 0xa1, 0xe2, 0x8d, 0x8f, 0xd0, 0xa0, 0x43, 0x33, 0x45, 0xc9, 0xad, + 0x81, 0x11, 0xbc, 0x3f, 0x9d, 0x41, 0x7d, 0xe8, 0x68, 0x72, 0xef, 0x24, + 0x23, 0x17, 0x8d, 0x50, 0xd2, 0xe3, 0x99, 0xc9, 0xbd, 0x6a, 0xae, 0x6c, + 0xf8, 0xfc, 0x61, 0xb2, 0xcb, 0x61, 0x2c, 0x9f, 0xf7, 0x8b, 0x91, 0x73, + 0x55, 0x8f, 0x2a, 0x61, 0x28, 0xb0, 0x55, 0xa5, 0xac, 0xca, 0x58, 0x24, + 0x18, 0x17, 0x26, 0x22, 0x75, 0x18, 0xe8, 0x02, 0xea, 0x0a, 0xb6, 0x85, + 0x0e, 0x97, 0x42, 0x60, 0x1a, 0xaa, 0x5f, 0x55, 0xd1, 0xb0, 0x54, 0x57, + 0x08, 0x06, 0x92, 0x12, 0x8f, 0x29, 0x69, 0xd6, 0x05, 0x32, 0x09, 0x56, + 0x32, 0x85, 0x53, 0xad, 0x20, 0xeb, 0x35, 0x84, 0xa1, 0x9e, 0x18, 0x1e, + 0x50, 0xcb, 0x83, 0xaf, 0x79, 0xed, 0xeb, 0x94, 0xdd, 0x86, 0x56, 0xab, + 0xb8, 0xaa, 0x30, 0x0e, 0x12, 0xa7, 0x83, 0x9f, 0xc2, 0x93, 0x08, 0x4e, + 0x47, 0x36, 0x6e, 0x9f, 0xed, 0x6e, 0xed, 0xfe, 0x06, 0x6d, 0xb3, 0x1c, + 0xe1, 0xdc, 0xa1, 0x2c, 0x77, 0xfe, 0x38, 0xe7, 0x83, 0xb5, 0xc2, 0xfa, + 0xfd, 0xd3, 0xba, 0x71, 0x0e, 0x95, 0x01, 0x28, 0xb1, 0xa4, 0xe3, 0x74, + 0x0b, 0x62, 0x92, 0x11, 0xd9, 0xef, 0xbb, 0x8d, 0x89, 0xa9, 0x86, 0xe3, + 0xb7, 0xf2, 0x76, 0xe5, 0xb1, 0x6a, 0xe2, 0xa2, 0xff, 0x82, 0x0b, 0x98, + 0x7a, 0xe0, 0x01, 0xbf, 0x2d, 0x0e, 0xbc, 0x7a, 0x9a, 0xef, 0x7f, 0xcf, + 0xcb, 0x6a, 0xf0, 0xf1, 0xea, 0xd3, 0xaf, 0xcc, 0x7f, 0xa2, 0x51, 0xf3, + 0x02, 0x56, 0x57, 0x8a, 0x99, 0xd9, 0x12, 0x99, 0x9e, 0x34, 0xc5, 0x52, + 0x63, 0x7f, 0x2e, 0x37, 0x5d, 0xc4, 0x14, 0x82, 0x8a, 0x2b, 0x49, 0x99, + 0x8d, 0x6b, 0x0e, 0x12, 0x66, 0x23, 0xdc, 0xca, 0x4a, 0x0a, 0xa8, 0x0b, + 0xf2, 0xc5, 0x3c, 0x99, 0xf7, 0xdb, 0x0c, 0x64, 0x87, 0xf4, 0xef, 0x4f, + 0x32, 0x76, 0xef, 0x18, 0x43, 0x2b, 0x32, 0x54, 0xea, 0x40, 0x5d, 0x22, + 0xab, 0x79, 0x2a, 0xb3, 0x7a, 0x5e, 0x64, 0x99, 0x0d, 0x65, 0x89, 0x02, + 0x66, 0x09, 0x64, 0x49, 0x5d, 0xcf, 0xb5, 0xb2, 0xce, 0xcb, 0xf0, 0xde, + 0xcb, 0x27, 0xd4, 0x56, 0x87, 0xf5, 0x64, 0x76, 0x99, 0x58, 0x5d, 0x66, + 0x13, 0x6c, 0x34, 0x6b, 0x65, 0xc8, 0x39, 0x79, 0x2c, 0x43, 0x50, 0x72, + 0x1c, 0x2a, 0xd2, 0x61, 0xe8, 0xfd, 0x59, 0x12, 0x75, 0x05, 0xa7, 0xdb, + 0xb5, 0x6f, 0x82, 0x4a, 0x45, 0x32, 0xb2, 0x62, 0x04, 0x61, 0x42, 0xca, + 0x10, 0x38, 0xa1, 0x77, 0xd0, 0xd2, 0x05, 0xab, 0x4b, 0x20, 0xd2, 0x26, + 0x99, 0xaa, 0xc4, 0x95, 0x2e, 0x09, 0x43, 0xdd, 0xef, 0xbd, 0xdc, 0x85, + 0x21, 0xa8, 0x51, 0x23, 0x65, 0xa7, 0x90, 0x87, 0x25, 0xb2, 0x2e, 0xd9, + 0xf5, 0xe0, 0x2e, 0x36, 0x7c, 0xf6, 0x1a, 0x26, 0x73, 0x7b, 0x90, 0x46, + 0xa2, 0x21, 0xac, 0xbf, 0x66, 0xa1, 0x4b, 0xf5, 0x27, 0x9d, 0x82, 0x83, + 0xd5, 0x6b, 0x51, 0xab, 0x82, 0x77, 0xc5, 0xa6, 0xec, 0x14, 0x15, 0x47, + 0x32, 0xfc, 0xfe, 0x61, 0x8a, 0xe1, 0x0f, 0x7e, 0x88, 0x04, 0x63, 0x3b, + 0xc7, 0xb0, 0x0c, 0xa8, 0x38, 0xaa, 0xdd, 0xc7, 0x27, 0xf6, 0xd0, 0xdf, + 0xad, 0xda, 0xb1, 0x93, 0x1e, 0xa7, 0x07, 0x77, 0xf2, 0xc0, 0x53, 0xd6, + 0x45, 0x6a, 0xbe, 0xca, 0xb9, 0xaf, 0xd8, 0xe0, 0x0f, 0x60, 0x7f, 0x32, + 0x43, 0xf1, 0x3b, 0xa1, 0x3e, 0x66, 0xb7, 0xf0, 0x21, 0x54, 0x51, 0x60, + 0x54, 0x14, 0x62, 0xe5, 0xfb, 0x4d, 0xb8, 0x3c, 0xb8, 0xe5, 0x66, 0x6e, + 0xbd, 0x6d, 0x3b, 0x00, 0x57, 0x5c, 0xbe, 0xc6, 0xf7, 0xdb, 0x78, 0xe6, + 0x4a, 0xae, 0x9f, 0xfd, 0x41, 0x53, 0x7a, 0xd1, 0xb4, 0x7c, 0xbf, 0x83, + 0x9d, 0x3f, 0xc7, 0xbc, 0x38, 0xef, 0x3b, 0xae, 0x1d, 0x22, 0xba, 0x7d, + 0x7a, 0x0b, 0x01, 0x8e, 0x79, 0x6d, 0x12, 0x8d, 0xd3, 0x0e, 0x44, 0x26, + 0x67, 0x25, 0x87, 0xde, 0xed, 0x72, 0x88, 0x50, 0x3f, 0xe5, 0xa9, 0xa2, + 0x0f, 0xd9, 0x0a, 0xc3, 0xb6, 0xa2, 0xca, 0x3d, 0xfe, 0xbf, 0x59, 0x7c, + 0x82, 0x8d, 0x13, 0x43, 0xb5, 0x62, 0xc5, 0x8a, 0x15, 0x2b, 0x56, 0xac, + 0x58, 0xb1, 0x62, 0xc5, 0x8a, 0x15, 0x2b, 0x56, 0xac, 0x58, 0xb1, 0x62, + 0xc5, 0x8a, 0x15, 0x2b, 0x56, 0xac, 0x58, 0xb1, 0x62, 0xc5, 0x8a, 0x15, + 0xeb, 0xa8, 0x14, 0x43, 0xb5, 0x62, 0xc5, 0x8a, 0x15, 0x2b, 0x56, 0xac, + 0xdf, 0x41, 0x09, 0x43, 0x84, 0xbe, 0x6e, 0x29, 0xb0, 0x96, 0x59, 0xb8, + 0x91, 0x2f, 0x2a, 0xb7, 0x32, 0x76, 0xf6, 0x60, 0x44, 0xe1, 0xb8, 0x61, + 0xb7, 0x70, 0x9c, 0x4e, 0xc3, 0x46, 0xf7, 0xdb, 0xe5, 0xdd, 0xaa, 0x0e, + 0xad, 0xea, 0xd4, 0x2a, 0xdd, 0x76, 0x75, 0x58, 0x48, 0xd8, 0x76, 0x75, + 0x68, 0xe5, 0x17, 0x95, 0xd3, 0xe2, 0x2b, 0xd3, 0x6d, 0xd3, 0x9d, 0xb7, + 0xe6, 0xc1, 0x12, 0xfc, 0x1a, 0x60, 0x77, 0x59, 0x14, 0xa9, 0x50, 0xab, + 0x4b, 0xb5, 0x40, 0x54, 0x02, 0x42, 0xea, 0x0f, 0x2b, 0xeb, 0xd5, 0xd7, + 0xf5, 0xd0, 0xfa, 0x78, 0x03, 0x7f, 0x61, 0xb9, 0xa8, 0xea, 0xc5, 0xfe, + 0xde, 0x02, 0xc0, 0xba, 0xd0, 0x5f, 0xaf, 0x0e, 0x2d, 0xf3, 0x97, 0x9e, + 0x81, 0x81, 0xab, 0xdc, 0xea, 0xaa, 0xac, 0x12, 0x5d, 0x57, 0xbd, 0x88, + 0x5c, 0x48, 0x89, 0x03, 0xa0, 0x8d, 0x12, 0xae, 0xfa, 0xce, 0x0e, 0x6e, + 0x01, 0x36, 0xac, 0x58, 0x01, 0xc0, 0x55, 0xdf, 0xda, 0xc1, 0xd0, 0x69, + 0x03, 0x58, 0x66, 0x63, 0xfb, 0x38, 0xae, 0x5a, 0x18, 0x9f, 0x2b, 0x38, + 0x78, 0xc5, 0xcd, 0xf4, 0xa4, 0xb8, 0xea, 0x5b, 0x3b, 0xb8, 0xe5, 0xd3, + 0xab, 0xb9, 0xea, 0x8e, 0x1d, 0x8d, 0x75, 0x6f, 0x01, 0x26, 0x70, 0x66, + 0x8b, 0x58, 0x5d, 0x02, 0x79, 0x30, 0xa8, 0x8b, 0x74, 0xf5, 0xf9, 0x13, + 0xba, 0xba, 0xf5, 0xc6, 0x76, 0x97, 0xf5, 0x00, 0x6c, 0xe5, 0x4a, 0x65, + 0xa8, 0xe4, 0x95, 0xcd, 0x14, 0xc2, 0x5f, 0x4c, 0xee, 0x54, 0x25, 0x96, + 0x19, 0xca, 0xd3, 0x2b, 0x7e, 0xe4, 0x9c, 0x8a, 0xa4, 0x50, 0x40, 0xad, + 0x1e, 0x05, 0xd4, 0x9a, 0x9a, 0x4e, 0xd0, 0xdf, 0x57, 0x53, 0x70, 0xad, + 0xa4, 0x67, 0xec, 0xa1, 0x6b, 0x51, 0xef, 0x00, 0x10, 0xf6, 0x3a, 0x29, + 0x9d, 0x4c, 0x53, 0xfa, 0x5d, 0x01, 0x40, 0x45, 0x46, 0x16, 0x29, 0xd3, + 0xd4, 0xdb, 0xf6, 0x06, 0xd4, 0x96, 0xc8, 0x60, 0x9f, 0x95, 0x62, 0xcf, + 0xc3, 0xad, 0xe1, 0x4f, 0xd9, 0xe5, 0x59, 0x4a, 0xd3, 0x2e, 0xa4, 0xa1, + 0x58, 0x9a, 0xff, 0x2b, 0xf3, 0xad, 0xca, 0x31, 0x97, 0x44, 0xb2, 0xd1, + 0x50, 0x3c, 0xad, 0x8f, 0x3d, 0x77, 0xa1, 0xaf, 0x3f, 0x77, 0x9e, 0x2b, + 0x3b, 0xbd, 0x2c, 0x4d, 0xa2, 0x0e, 0xc5, 0xd2, 0xd1, 0x9d, 0x2b, 0xcf, + 0x10, 0xa8, 0x9d, 0x72, 0xb9, 0x9c, 0x0f, 0x9b, 0x5a, 0x75, 0xf1, 0x08, + 0xc5, 0x10, 0x50, 0x31, 0x9b, 0xc9, 0x50, 0x9c, 0x75, 0x28, 0x1e, 0x2c, + 0x62, 0x77, 0xdb, 0x8c, 0x3f, 0xb2, 0x87, 0x8c, 0x1d, 0x7c, 0xd9, 0xd6, + 0xea, 0xb2, 0x3a, 0x86, 0x6c, 0x65, 0xec, 0x0c, 0xa3, 0xf7, 0x8c, 0x36, + 0x00, 0xab, 0xc2, 0xdb, 0x86, 0x32, 0x7b, 0x46, 0x4c, 0x1e, 0xbc, 0x2f, + 0xb4, 0xef, 0xc9, 0x4b, 0xc7, 0xf3, 0xf3, 0xea, 0x59, 0x9c, 0x75, 0xb0, + 0x97, 0x59, 0xa4, 0x44, 0xe3, 0x79, 0x70, 0x0f, 0x95, 0xa8, 0xc8, 0x0a, + 0x29, 0x91, 0xc2, 0x5c, 0x12, 0xc0, 0x64, 0xf2, 0xc5, 0x7c, 0x43, 0xfb, + 0x84, 0x21, 0x5a, 0x4d, 0x65, 0x7d, 0x9d, 0x0c, 0x86, 0xa2, 0x8a, 0x82, + 0x99, 0x56, 0x12, 0x98, 0x23, 0x46, 0x21, 0x56, 0x1e, 0xfc, 0xc9, 0x03, + 0x55, 0x85, 0xfd, 0x9b, 0xdd, 0x7a, 0x7d, 0x78, 0x95, 0x02, 0x48, 0xad, + 0x64, 0x0b, 0x3b, 0x9b, 0x80, 0x53, 0xe1, 0xf4, 0x3d, 0xa0, 0x14, 0xa1, + 0xfc, 0xbc, 0xe3, 0x95, 0xf4, 0xb2, 0x33, 0x94, 0xbe, 0xe7, 0xe6, 0xe5, + 0xd1, 0x1b, 0xd9, 0x57, 0x69, 0x14, 0xe8, 0xd5, 0xff, 0xbc, 0xfd, 0xb0, + 0x7f, 0x63, 0x5d, 0x9a, 0x11, 0x55, 0xbd, 0x30, 0x6f, 0x9d, 0xbc, 0x7c, + 0x82, 0xbc, 0x1b, 0xe3, 0xef, 0x0c, 0xe5, 0xd3, 0x9c, 0x7e, 0x63, 0x9b, + 0x79, 0xe1, 0x3c, 0xf7, 0x70, 0x7d, 0x76, 0x52, 0xe0, 0x8f, 0x43, 0xf1, + 0xbc, 0x7c, 0xc3, 0xfe, 0x9d, 0xea, 0x92, 0x5d, 0xf0, 0xa3, 0x15, 0x50, + 0xfb, 0xcf, 0xc7, 0xa9, 0x01, 0x7b, 0x44, 0x82, 0xe1, 0xfb, 0x40, 0xea, + 0x7b, 0x4d, 0x3b, 0x28, 0x54, 0xd4, 0x2f, 0x0c, 0x9b, 0xea, 0x04, 0x7a, + 0xd5, 0x2e, 0xfc, 0xa6, 0x7a, 0xe0, 0x76, 0x40, 0xef, 0x9f, 0x1a, 0xd9, + 0x0f, 0x87, 0x09, 0x2b, 0xea, 0xbe, 0xa9, 0xde, 0x7a, 0x3f, 0x1a, 0x67, + 0x21, 0xe1, 0xa7, 0xea, 0x41, 0xd9, 0x37, 0xd4, 0x83, 0x36, 0x98, 0xac, + 0xc3, 0x40, 0x8b, 0xfd, 0x0d, 0xba, 0x4c, 0xd1, 0x76, 0x5c, 0xa7, 0xdd, + 0xb7, 0x1a, 0xcd, 0xfb, 0x12, 0xd8, 0x16, 0x09, 0x7f, 0xa5, 0x0e, 0x13, + 0x75, 0x5f, 0x53, 0x87, 0xe2, 0x6b, 0x9d, 0xf9, 0x3a, 0x23, 0xa3, 0xb6, + 0xa5, 0x12, 0xee, 0xbe, 0x16, 0x46, 0x0d, 0xdf, 0x79, 0xed, 0x30, 0xa9, + 0x6d, 0x17, 0x9b, 0x5c, 0x79, 0xaf, 0x4b, 0xc2, 0x82, 0x2d, 0x67, 0x99, + 0x48, 0xd9, 0x0f, 0xc0, 0xfa, 0xbd, 0x2e, 0x1b, 0x2a, 0x70, 0xeb, 0xd9, + 0x42, 0xdd, 0x5c, 0xbe, 0x9d, 0x86, 0x4f, 0xe9, 0x67, 0x8b, 0x07, 0xd7, + 0xfa, 0x54, 0x09, 0x1e, 0x5e, 0x8f, 0xbc, 0x30, 0x0b, 0x7b, 0x51, 0x40, + 0x2d, 0xb1, 0x1d, 0xcc, 0x04, 0x94, 0x56, 0xa9, 0x30, 0xef, 0xcf, 0x43, + 0xaf, 0x03, 0xf7, 0x65, 0xe0, 0x13, 0x2e, 0xcc, 0x98, 0x50, 0x1e, 0x81, + 0xde, 0x9b, 0xe0, 0x33, 0x26, 0x7c, 0x53, 0x17, 0xe4, 0x33, 0x9d, 0x95, + 0xb7, 0x1d, 0x38, 0xcb, 0x73, 0x7f, 0xcd, 0x70, 0xad, 0x35, 0x9b, 0xb8, + 0xfd, 0xf9, 0x29, 0xd6, 0xde, 0x13, 0x02, 0x6a, 0x4d, 0xe7, 0xa0, 0xaf, + 0x45, 0xdf, 0xe1, 0xe2, 0x11, 0x05, 0xe1, 0x02, 0xf8, 0xe6, 0xd6, 0x46, + 0xbf, 0x77, 0x0c, 0x74, 0x94, 0x9d, 0x9c, 0xb9, 0x09, 0x0a, 0x35, 0x44, + 0x9f, 0x32, 0x6b, 0x72, 0xa7, 0x6b, 0x98, 0x7d, 0x09, 0xb6, 0xfe, 0x6d, + 0x1e, 0xe7, 0x93, 0x1b, 0x49, 0xe9, 0x7e, 0x6a, 0x45, 0x3a, 0x58, 0x9e, + 0x91, 0x53, 0x59, 0xed, 0xaf, 0xb9, 0x37, 0x30, 0xe8, 0x1e, 0xbe, 0x75, + 0x8b, 0xda, 0xae, 0xf8, 0x11, 0xc5, 0x99, 0xe0, 0x79, 0x53, 0x0c, 0x11, + 0x79, 0xbe, 0xf8, 0xa5, 0xb5, 0x1d, 0x95, 0xe9, 0xad, 0x20, 0x61, 0xa6, + 0xc2, 0xfc, 0x01, 0x04, 0x66, 0x07, 0x63, 0x9a, 0x36, 0x69, 0x75, 0xe9, + 0x01, 0x81, 0x6c, 0xdd, 0x9f, 0x69, 0x05, 0xd4, 0x6a, 0x19, 0xee, 0x28, + 0xca, 0xa0, 0xe2, 0x1f, 0x9d, 0xa2, 0x20, 0xa8, 0xb0, 0x96, 0x02, 0xbf, + 0x02, 0x9e, 0xaf, 0xfe, 0x9a, 0x93, 0x92, 0xef, 0xf0, 0xb7, 0x2f, 0xbe, + 0xf4, 0x02, 0x6f, 0x9f, 0x27, 0xdd, 0x41, 0x73, 0x90, 0x17, 0xbb, 0x1e, + 0xe3, 0x60, 0x39, 0x41, 0x57, 0xa6, 0xab, 0x25, 0x54, 0xcb, 0xcb, 0xd7, + 0x2b, 0x83, 0xb7, 0x5d, 0x9c, 0xc9, 0xf0, 0x4c, 0x3e, 0xcf, 0xf1, 0x21, + 0xa0, 0x16, 0xe0, 0x1f, 0x2f, 0xce, 0x64, 0x78, 0xae, 0x45, 0x7a, 0xe1, + 0xba, 0x14, 0x0a, 0x05, 0x3f, 0xce, 0x29, 0x67, 0x9e, 0xc9, 0xa3, 0x8f, + 0x3e, 0xca, 0x99, 0x67, 0x9e, 0xc9, 0xd4, 0xfd, 0xf7, 0xf3, 0x9b, 0xdf, + 0xfc, 0x86, 0x42, 0xa1, 0xc0, 0xf1, 0x34, 0xdb, 0x31, 0x3f, 0x5b, 0x7b, + 0x96, 0x77, 0x1e, 0x79, 0x01, 0x53, 0xc3, 0xe0, 0x78, 0x61, 0x06, 0x61, + 0xbc, 0x63, 0x9e, 0xda, 0xb6, 0xaf, 0xcb, 0xeb, 0xa9, 0xc1, 0x5d, 0x79, + 0x38, 0xdf, 0x22, 0xb7, 0xdb, 0x21, 0x77, 0xff, 0x38, 0x26, 0x20, 0xaa, + 0x36, 0x63, 0xdf, 0x29, 0x31, 0xf2, 0xc9, 0x34, 0x23, 0x1f, 0xbe, 0x55, + 0x05, 0xac, 0xdf, 0xc5, 0xf8, 0xae, 0x71, 0x66, 0x0e, 0xba, 0xf4, 0x74, + 0x9b, 0xa4, 0xfb, 0x86, 0x19, 0xcd, 0x81, 0x58, 0xa4, 0x6a, 0x6a, 0x26, + 0x05, 0xd9, 0x33, 0x32, 0xca, 0x20, 0xdc, 0xb3, 0x4f, 0xaf, 0x2b, 0xd8, + 0x4d, 0x7e, 0x7f, 0x09, 0xbb, 0xc7, 0x6e, 0xca, 0xfb, 0xca, 0x4f, 0x5c, + 0xca, 0xb6, 0xef, 0xde, 0xdd, 0xb6, 0x6c, 0xd9, 0xac, 0x1a, 0x0f, 0x8d, + 0xef, 0xca, 0x33, 0xbc, 0x22, 0x4b, 0x2e, 0xe7, 0x20, 0xeb, 0x20, 0xa5, + 0xcb, 0x8e, 0x09, 0x60, 0xd9, 0x08, 0x95, 0x7d, 0x3b, 0x28, 0x1d, 0xac, + 0x50, 0x32, 0x60, 0xd3, 0x97, 0x6f, 0x80, 0xfa, 0x33, 0x6c, 0xfc, 0x5b, + 0x75, 0x8f, 0x73, 0x1e, 0xde, 0x46, 0xe6, 0xc3, 0x1b, 0xd9, 0xf6, 0x60, + 0xa8, 0x0d, 0x43, 0x7d, 0xed, 0xe1, 0x41, 0x75, 0xaf, 0x1c, 0x9f, 0xc8, + 0x61, 0x59, 0x19, 0x04, 0x50, 0xd3, 0x65, 0xaf, 0x49, 0x70, 0x0f, 0x29, + 0x83, 0x6f, 0x91, 0x12, 0x64, 0xb3, 0xc1, 0x98, 0x38, 0xdc, 0x57, 0x0f, + 0xa7, 0x57, 0x91, 0x25, 0x5d, 0x6e, 0x8b, 0xfc, 0x8c, 0xc4, 0x4c, 0xaa, + 0x31, 0x5d, 0xc5, 0x75, 0x11, 0xc2, 0x04, 0x5c, 0xdc, 0x43, 0x35, 0x2a, + 0xae, 0x4b, 0x71, 0x36, 0x81, 0x30, 0x6a, 0xa4, 0x05, 0x24, 0x92, 0x29, + 0x6a, 0x46, 0x05, 0x1b, 0x9b, 0x62, 0xa1, 0x84, 0x7b, 0xd8, 0xf1, 0x21, + 0x5a, 0xc5, 0x42, 0x89, 0x6c, 0x36, 0x4b, 0x2e, 0x97, 0xf3, 0xe1, 0x64, + 0xae, 0xb6, 0x26, 0xef, 0xe9, 0x36, 0x21, 0x09, 0xb5, 0x6a, 0x85, 0xf4, + 0x12, 0x73, 0x5e, 0x6c, 0xce, 0x56, 0x20, 0x71, 0xfc, 0x31, 0x5c, 0xf1, + 0xf2, 0x11, 0x86, 0x50, 0x86, 0xfa, 0x61, 0x39, 0x28, 0x50, 0xf8, 0xaf, + 0xf4, 0xf1, 0x62, 0xc0, 0x5d, 0x7b, 0x2c, 0xe9, 0xdb, 0x5f, 0x05, 0xe0, + 0x48, 0xff, 0x31, 0x58, 0x77, 0x1d, 0xa1, 0xda, 0x0f, 0x87, 0xa6, 0xe0, + 0x0f, 0x09, 0xc0, 0x4f, 0xed, 0xf0, 0x8d, 0xa7, 0xa0, 0x80, 0x5a, 0xb7, + 0x1e, 0x7f, 0x0c, 0xb5, 0x97, 0x8f, 0xf8, 0xf9, 0x7f, 0x09, 0x05, 0xf6, + 0x58, 0xe8, 0xe8, 0xef, 0xf7, 0x92, 0x6d, 0x68, 0x4e, 0xbf, 0x25, 0xb5, + 0x2a, 0xcf, 0x33, 0xd5, 0x23, 0x1d, 0xc7, 0x8f, 0x9a, 0xa9, 0x3e, 0x47, + 0x00, 0x33, 0x3b, 0x5a, 0xa8, 0x96, 0x6d, 0x40, 0x31, 0x44, 0x2d, 0xeb, + 0x04, 0x76, 0x15, 0x0e, 0x33, 0x3d, 0x75, 0x98, 0xbe, 0x73, 0x16, 0xf1, + 0x9e, 0x0e, 0xf2, 0xf2, 0xe2, 0xf5, 0xd1, 0x1e, 0xac, 0xd5, 0xd7, 0xbf, + 0x88, 0x1f, 0x4f, 0x1d, 0xe6, 0x8f, 0xfa, 0x17, 0xa9, 0x30, 0x00, 0xfd, + 0x8b, 0xb8, 0xfc, 0x1c, 0x98, 0x9e, 0x6a, 0x7e, 0x5a, 0xfc, 0x4c, 0xc2, + 0x2f, 0x8e, 0x87, 0x3f, 0x8a, 0x94, 0xe9, 0xe4, 0x45, 0xc0, 0x71, 0x41, + 0x38, 0x51, 0x87, 0x03, 0x2f, 0xb6, 0x2e, 0xd7, 0xe5, 0x48, 0x38, 0x07, + 0x9c, 0x47, 0x01, 0x24, 0xdb, 0x01, 0xcf, 0x14, 0x39, 0x7c, 0xbd, 0xd8, + 0xa8, 0x7b, 0x84, 0x42, 0x05, 0x79, 0xb3, 0x82, 0xea, 0x4e, 0xee, 0x12, + 0xdc, 0xcf, 0xdd, 0x6a, 0x73, 0x1e, 0x45, 0x1d, 0xbe, 0x84, 0x3a, 0x6f, + 0x43, 0x5d, 0x30, 0x5e, 0x56, 0x69, 0x82, 0x3a, 0x0f, 0x89, 0x3a, 0x78, + 0x8c, 0xac, 0xeb, 0x0d, 0x98, 0x50, 0xb7, 0x83, 0x26, 0xc0, 0x48, 0x4d, + 0xc0, 0xe2, 0x63, 0x0e, 0x73, 0xdc, 0xcf, 0x5b, 0xd7, 0xa7, 0x95, 0x46, + 0xce, 0x36, 0x19, 0x7b, 0xc4, 0x6d, 0x38, 0x16, 0xc9, 0x04, 0xa3, 0xbb, + 0x1c, 0xbf, 0x96, 0xab, 0x56, 0x04, 0xf7, 0xaf, 0xd1, 0x07, 0x83, 0xab, + 0x75, 0xd5, 0x79, 0xca, 0x3d, 0xfd, 0xe1, 0xdb, 0xb9, 0xf5, 0xaf, 0x2e, + 0x50, 0xf1, 0xcf, 0x0b, 0xc2, 0x8e, 0x85, 0xc2, 0x76, 0xe2, 0x0e, 0xb0, + 0xa7, 0xa0, 0xf2, 0x1c, 0xea, 0x35, 0xd9, 0x53, 0x70, 0x11, 0xcb, 0x4c, + 0x36, 0x7d, 0xf2, 0x47, 0x00, 0x98, 0x69, 0x28, 0x1e, 0xac, 0x71, 0xf7, + 0xcd, 0xe3, 0x4c, 0x4c, 0x54, 0xd8, 0xfc, 0xdd, 0xce, 0x01, 0x59, 0x93, + 0xfb, 0x3b, 0x0e, 0xba, 0x20, 0x6d, 0xfa, 0x4c, 0x3f, 0xd7, 0x7f, 0x73, + 0x7e, 0x82, 0xd9, 0xa5, 0x5f, 0x0b, 0x21, 0x9b, 0x6a, 0x09, 0xa0, 0xd2, + 0x00, 0xd6, 0xda, 0xf8, 0xc5, 0x2d, 0x6c, 0xbe, 0x71, 0x7d, 0xcb, 0xb8, + 0xeb, 0x3e, 0xbd, 0x89, 0xad, 0xdf, 0xba, 0xbe, 0xa5, 0x5f, 0x18, 0xac, + 0x45, 0x79, 0xbe, 0xbb, 0xf8, 0x24, 0x01, 0x4e, 0x29, 0x04, 0x9c, 0xa9, + 0x87, 0xef, 0xe6, 0xab, 0x1b, 0x62, 0x24, 0x4c, 0x4b, 0xff, 0x0c, 0x06, + 0x51, 0x3b, 0x8d, 0xfd, 0x9c, 0x4a, 0x39, 0x38, 0x97, 0x8d, 0x73, 0x86, + 0x01, 0x38, 0x2a, 0x95, 0xb6, 0x98, 0x29, 0xa0, 0x00, 0x53, 0xf5, 0x12, + 0x1e, 0x94, 0x0b, 0x14, 0x24, 0x2b, 0x0c, 0x61, 0x88, 0x02, 0x19, 0x3c, + 0x7c, 0x9c, 0x30, 0xb2, 0xc8, 0x30, 0xf8, 0xcb, 0x50, 0xd7, 0x96, 0x69, + 0x08, 0x1f, 0x9e, 0xe5, 0x4a, 0x70, 0x35, 0x20, 0x25, 0x61, 0x80, 0x23, + 0x05, 0xae, 0xe1, 0x2e, 0x70, 0x15, 0xc6, 0x17, 0x81, 0x1b, 0xfd, 0xd2, + 0x5d, 0x77, 0xd9, 0x03, 0xe4, 0x73, 0x0a, 0xec, 0xb2, 0x63, 0x1a, 0x98, + 0x9e, 0xc2, 0x4c, 0xde, 0x8a, 0x94, 0x50, 0x9c, 0x0d, 0x83, 0x83, 0x3c, + 0xf8, 0x57, 0x50, 0x6e, 0xd3, 0x58, 0xa1, 0xeb, 0xeb, 0xf5, 0xea, 0xbc, + 0xf3, 0xb3, 0xc2, 0x4f, 0x1f, 0xc0, 0xad, 0xae, 0x06, 0x46, 0x81, 0xbb, + 0x58, 0xd5, 0x07, 0xe1, 0x1e, 0xa0, 0x29, 0xd2, 0x7e, 0x3e, 0x0a, 0xa8, + 0xb5, 0xb0, 0xa7, 0xde, 0x8c, 0xfe, 0xeb, 0x99, 0x23, 0x4c, 0xd8, 0xcf, + 0x0b, 0x1f, 0x3e, 0x0e, 0x87, 0x0b, 0x1f, 0xbf, 0xe9, 0xda, 0xa9, 0xe7, + 0xdc, 0x1a, 0xc0, 0x59, 0xbd, 0x6c, 0xde, 0x5c, 0xe0, 0xf2, 0xdb, 0x60, + 0xed, 0xf7, 0x02, 0xd7, 0x2d, 0x3a, 0xcc, 0x47, 0xc0, 0x07, 0x6a, 0xb1, + 0x65, 0x27, 0x7d, 0x9f, 0x2b, 0x28, 0x20, 0xe3, 0x6e, 0xe8, 0xdb, 0x5d, + 0x60, 0x7a, 0xe7, 0x16, 0x5a, 0x5d, 0x75, 0x3f, 0xf8, 0x01, 0xf4, 0x6e, + 0x2c, 0xb0, 0xd2, 0x9b, 0xb6, 0xfa, 0x1c, 0x10, 0xce, 0x77, 0xcb, 0x0f, + 0x69, 0x8a, 0xd8, 0x02, 0x14, 0x76, 0xee, 0xf7, 0x66, 0x1a, 0x8e, 0x7b, + 0x7a, 0x14, 0x50, 0xeb, 0xfc, 0x1e, 0x7d, 0x7c, 0x39, 0xf0, 0x3d, 0x15, + 0xee, 0xef, 0x2e, 0xef, 0x81, 0x50, 0xf8, 0xb5, 0xdf, 0x83, 0xdb, 0xff, + 0xac, 0x45, 0xe1, 0x3a, 0x50, 0xa9, 0xec, 0x20, 0xcc, 0x94, 0x82, 0x5c, + 0xcd, 0x38, 0x88, 0xe9, 0x22, 0x52, 0x8f, 0xe3, 0x65, 0x55, 0xc2, 0xf2, + 0x4c, 0xcb, 0xb9, 0xe3, 0xb0, 0x3c, 0x10, 0x94, 0x0f, 0x84, 0xda, 0x97, + 0x57, 0xbf, 0x4c, 0x0f, 0x98, 0x25, 0x04, 0xf4, 0xd9, 0xc1, 0x1c, 0xf0, + 0xc3, 0x39, 0x38, 0x2b, 0xa3, 0x60, 0xd1, 0xcb, 0x33, 0xb0, 0x6f, 0xfe, + 0x77, 0x08, 0x0d, 0xef, 0x01, 0x3d, 0xd0, 0xc9, 0x82, 0x00, 0x54, 0xcd, + 0x23, 0x1b, 0xb3, 0xcb, 0xc6, 0x2d, 0x17, 0x9b, 0x40, 0x63, 0x52, 0xd3, + 0xe8, 0x72, 0x0f, 0x8d, 0x93, 0x03, 0xb2, 0xe7, 0x0e, 0x93, 0x7b, 0x48, + 0xcd, 0x9f, 0x48, 0xa7, 0x84, 0x58, 0x24, 0x90, 0x6e, 0x85, 0xfc, 0x23, + 0x39, 0xf8, 0xfc, 0x95, 0x98, 0x5f, 0xdd, 0xaa, 0x93, 0x9f, 0xbb, 0x2c, + 0x42, 0xe8, 0x77, 0x91, 0x86, 0x80, 0x7a, 0x08, 0xac, 0x84, 0x0c, 0xe0, + 0x65, 0xaf, 0xd3, 0xfc, 0xb8, 0x6d, 0x28, 0xa0, 0x56, 0x0a, 0x41, 0x25, + 0x8c, 0xdf, 0xd4, 0x9d, 0x01, 0xef, 0xdd, 0x65, 0x88, 0xf1, 0xd5, 0x50, + 0x7a, 0xa9, 0xff, 0x4b, 0x01, 0xae, 0xeb, 0x9d, 0x5b, 0x15, 0x77, 0xb2, + 0x1c, 0xc9, 0x4c, 0x47, 0x74, 0x34, 0x54, 0x34, 0xdc, 0xd6, 0x42, 0x08, + 0xb2, 0xae, 0xcb, 0xf8, 0x61, 0x35, 0xce, 0xb1, 0x90, 0x4c, 0x1a, 0x50, + 0x74, 0x83, 0xbe, 0x8b, 0x69, 0x68, 0x48, 0x95, 0xa1, 0x0a, 0x98, 0x31, + 0x04, 0x33, 0x06, 0xa4, 0xdd, 0x0a, 0x20, 0xa8, 0xd5, 0x21, 0x83, 0xf4, + 0x9f, 0x28, 0x03, 0x02, 0x06, 0x35, 0x50, 0xcb, 0x83, 0x69, 0x79, 0x72, + 0x4a, 0x0e, 0x56, 0xda, 0xf2, 0xeb, 0xe4, 0x96, 0x01, 0x12, 0x3e, 0x44, + 0x2d, 0x5f, 0x85, 0x9a, 0xff, 0xe1, 0x18, 0xa9, 0xc0, 0xc2, 0xf5, 0x00, + 0x82, 0x0a, 0x12, 0x1b, 0xc1, 0xa4, 0x0b, 0x03, 0xa6, 0xd0, 0xc7, 0xaa, + 0xff, 0x05, 0xaa, 0x7e, 0x93, 0x5e, 0xd9, 0x0d, 0xb0, 0xea, 0x0a, 0xa8, + 0xe5, 0xcd, 0x63, 0xda, 0xa8, 0x71, 0x8a, 0x08, 0x7d, 0x34, 0x29, 0x7c, + 0xc7, 0x8f, 0xde, 0xfd, 0xc3, 0xed, 0xee, 0xdd, 0xfd, 0xf3, 0x75, 0xa9, + 0xda, 0x5e, 0x10, 0x2a, 0x57, 0xe7, 0x3a, 0xf9, 0x9d, 0xfb, 0xe1, 0xd9, + 0x6e, 0xff, 0xf8, 0x15, 0x31, 0x09, 0x7a, 0x0e, 0xd3, 0xd3, 0xab, 0x67, + 0xbe, 0x02, 0x8f, 0xbe, 0x86, 0xc4, 0xe7, 0x91, 0x07, 0xd4, 0xb2, 0x92, + 0xe0, 0xe8, 0x7e, 0xec, 0xcf, 0xf7, 0x2b, 0xc0, 0xd6, 0xb9, 0x43, 0x59, + 0x1f, 0xac, 0xd5, 0xa9, 0x7a, 0xe5, 0x00, 0x63, 0x62, 0x92, 0x5e, 0xd9, + 0xd9, 0x1c, 0xe2, 0x9b, 0xa1, 0x53, 0x8f, 0xdd, 0xcf, 0x93, 0xaf, 0x9e, + 0xd1, 0xd2, 0xef, 0xe5, 0x57, 0x26, 0x39, 0xf5, 0xf8, 0xe3, 0xf9, 0xd0, + 0x05, 0x17, 0x70, 0xca, 0xc5, 0x9b, 0x01, 0x78, 0xfa, 0xde, 0x7b, 0xe9, + 0xbf, 0x40, 0xf5, 0x7b, 0xa7, 0x1e, 0x78, 0x80, 0x53, 0x8f, 0xdd, 0xcf, + 0xe3, 0x2f, 0xbf, 0xcc, 0x3d, 0xaf, 0xc0, 0x87, 0x8f, 0x3f, 0xde, 0x07, + 0x6b, 0x75, 0x22, 0xab, 0x2b, 0x45, 0x71, 0x66, 0xfe, 0x0f, 0x19, 0xd8, + 0x3d, 0x16, 0xae, 0x86, 0xf1, 0x87, 0x81, 0x57, 0x9e, 0x32, 0x56, 0x0f, + 0xee, 0xe1, 0x12, 0x32, 0x25, 0x49, 0x69, 0x30, 0xf7, 0xb6, 0xef, 0x6f, + 0x53, 0xf3, 0x82, 0x42, 0x62, 0x9d, 0x66, 0xe2, 0x94, 0x2b, 0xb8, 0x65, + 0x97, 0xb4, 0x30, 0x49, 0xf5, 0x04, 0xf3, 0x82, 0xae, 0x2c, 0x92, 0xd6, + 0x30, 0xf2, 0x5a, 0x59, 0x22, 0x8c, 0x5a, 0x03, 0x50, 0x0b, 0x60, 0xe8, + 0x8c, 0xac, 0xba, 0x57, 0x78, 0x1f, 0xe1, 0x49, 0x82, 0xbd, 0x2c, 0x45, + 0x45, 0xa7, 0x29, 0xeb, 0x2e, 0xa9, 0xb4, 0x85, 0xac, 0xab, 0xbe, 0x4e, + 0x6d, 0xb6, 0x46, 0xce, 0xc9, 0x93, 0xb5, 0x32, 0x94, 0x0e, 0x15, 0x11, + 0xa7, 0x09, 0x12, 0xe5, 0x14, 0x66, 0xb7, 0xc5, 0xd8, 0x7d, 0x0a, 0xf0, + 0x64, 0x76, 0x99, 0x98, 0x5d, 0x90, 0x9f, 0x9d, 0x84, 0xbd, 0x92, 0xcc, + 0x59, 0x43, 0x88, 0x7a, 0xe3, 0x15, 0x52, 0x29, 0x35, 0x5f, 0x31, 0xae, + 0xeb, 0x92, 0x42, 0x95, 0xdf, 0xff, 0xd8, 0xda, 0x61, 0xb5, 0x1d, 0xfb, + 0xfe, 0x18, 0x83, 0x2b, 0x46, 0xb8, 0xe9, 0x1b, 0x37, 0xa8, 0x3c, 0x96, + 0xf4, 0x30, 0x74, 0x6e, 0xbf, 0x1f, 0xd6, 0xee, 0xb2, 0x71, 0xa5, 0x8b, + 0x2c, 0x3b, 0xa0, 0xe7, 0x9c, 0x2b, 0x65, 0xb0, 0x7a, 0x44, 0x03, 0xad, + 0x3b, 0x91, 0xa4, 0x25, 0xbd, 0x7b, 0xc5, 0xb9, 0x23, 0x24, 0xea, 0xb0, + 0xfd, 0xde, 0x31, 0x9c, 0x6a, 0x85, 0xfe, 0xee, 0x14, 0x22, 0x69, 0x62, + 0xa6, 0x2d, 0x5c, 0xda, 0x8f, 0x07, 0xc4, 0xa0, 0xa9, 0xd6, 0x5d, 0x74, + 0xab, 0xfb, 0x8e, 0xd5, 0x67, 0xe1, 0x4c, 0x3b, 0x38, 0xd3, 0xfa, 0xdc, + 0x77, 0x0b, 0xac, 0x3e, 0x3d, 0x07, 0xae, 0xdd, 0x9c, 0x69, 0x07, 0xfb, + 0x93, 0xea, 0xbd, 0x48, 0xf1, 0x3b, 0x79, 0x38, 0xa8, 0xe1, 0x59, 0xdd, + 0x22, 0x58, 0x8f, 0xd2, 0x2d, 0x90, 0x13, 0x6e, 0x03, 0x38, 0x0a, 0x02, + 0xd0, 0xd6, 0x83, 0x5b, 0x6e, 0x06, 0xe0, 0x94, 0x93, 0x97, 0xf0, 0xf4, + 0x2f, 0x0f, 0x71, 0xeb, 0x6d, 0xdb, 0x1b, 0xc0, 0x5a, 0x9f, 0x7c, 0xff, + 0x1f, 0xfa, 0xfb, 0xa7, 0x9c, 0xbc, 0x84, 0xcd, 0xbf, 0xde, 0x8d, 0x9c, + 0x70, 0x1b, 0xd2, 0xf2, 0x34, 0x17, 0xbc, 0xcb, 0xab, 0xa3, 0x9c, 0x70, + 0x1b, 0x40, 0x56, 0x8f, 0xff, 0x1f, 0x79, 0xec, 0x8a, 0xba, 0x77, 0xfd, + 0xa2, 0x54, 0xe0, 0xae, 0xe9, 0xff, 0xdb, 0xaf, 0x93, 0xa7, 0xe2, 0x77, + 0xf2, 0x0d, 0x00, 0xb1, 0x56, 0x70, 0x2c, 0x39, 0x2b, 0x11, 0x83, 0x66, + 0xd0, 0x46, 0xf7, 0x15, 0x91, 0xb3, 0x52, 0x1d, 0xf7, 0x59, 0x0d, 0x69, + 0x85, 0xd3, 0x88, 0xc2, 0xc7, 0xc2, 0x5b, 0xaf, 0x1c, 0x6f, 0xff, 0x37, + 0x35, 0x47, 0x16, 0x06, 0x6b, 0x01, 0x4d, 0x70, 0xad, 0xc5, 0x27, 0xd8, + 0x1c, 0x3c, 0xfc, 0x10, 0x9c, 0xd8, 0xb6, 0x09, 0x62, 0xc5, 0x8a, 0x15, + 0x2b, 0x56, 0xac, 0x58, 0xb1, 0x62, 0xc5, 0x8a, 0x15, 0x2b, 0x56, 0xac, + 0x58, 0xb1, 0x62, 0xc5, 0x8a, 0x15, 0x2b, 0x56, 0xac, 0x58, 0xb1, 0x62, + 0xc5, 0x8a, 0x15, 0x2b, 0x56, 0x07, 0x8a, 0xa1, 0x5a, 0xb1, 0x62, 0xc5, + 0x8a, 0x15, 0x2b, 0xd6, 0xef, 0xa0, 0x64, 0x68, 0x61, 0xb6, 0xac, 0xb7, + 0x5e, 0x18, 0xdd, 0x0a, 0x76, 0xd5, 0x6a, 0x3f, 0x0c, 0x87, 0x8a, 0xa6, + 0xd5, 0x69, 0xd8, 0x56, 0xf1, 0x3a, 0x01, 0x6b, 0x79, 0x9a, 0x2b, 0xdd, + 0xb9, 0xea, 0xb0, 0x90, 0xb0, 0xd1, 0x3a, 0x84, 0xf3, 0x6c, 0x95, 0xe6, + 0x7c, 0xe5, 0x9f, 0xab, 0x6d, 0xe6, 0x97, 0xc4, 0x34, 0xd4, 0x02, 0xee, + 0xa2, 0xff, 0x35, 0xd7, 0xc0, 0xdc, 0xd9, 0x5f, 0x78, 0x2e, 0x65, 0xe0, + 0x2a, 0x7d, 0xef, 0x46, 0xd5, 0x23, 0x8b, 0x0b, 0xc3, 0x69, 0x49, 0x05, + 0xcf, 0xaa, 0x74, 0x09, 0x52, 0xb3, 0x3a, 0x17, 0xff, 0xcb, 0xae, 0xa8, + 0x05, 0xfe, 0x86, 0x57, 0x07, 0xed, 0x56, 0x95, 0xfe, 0x62, 0xd5, 0x6b, + 0xef, 0x18, 0xc5, 0xd1, 0x19, 0x5b, 0xa6, 0xa0, 0x28, 0x5d, 0x8a, 0xda, + 0xa0, 0xc1, 0x12, 0x02, 0xb7, 0x54, 0x01, 0x01, 0xae, 0x07, 0x04, 0xd3, + 0x59, 0xe7, 0xa7, 0x1d, 0xa4, 0x01, 0x6b, 0xbf, 0xad, 0x80, 0x5a, 0x22, + 0x09, 0x4e, 0x59, 0xd2, 0x7f, 0x96, 0x32, 0xdc, 0x99, 0xda, 0xbb, 0x8b, + 0x2d, 0x37, 0xdf, 0xc8, 0xfa, 0xab, 0xbf, 0xd8, 0x58, 0x76, 0x17, 0x1f, + 0xf2, 0xe5, 0x01, 0xb5, 0x1a, 0xca, 0xe6, 0xb5, 0x54, 0x08, 0xac, 0x05, + 0xf8, 0x30, 0x2f, 0x33, 0x9d, 0x22, 0x3f, 0xed, 0xa8, 0x85, 0xfc, 0x88, + 0x20, 0x9e, 0xac, 0xe0, 0x94, 0x5d, 0x3f, 0x4f, 0x6b, 0x99, 0x4d, 0xaa, + 0x77, 0x90, 0x4a, 0x79, 0xc6, 0x07, 0x7a, 0x89, 0x24, 0x24, 0x7a, 0x04, + 0x95, 0xde, 0x04, 0xc5, 0x87, 0x60, 0xe8, 0xef, 0x05, 0x20, 0x70, 0xbf, + 0x55, 0x81, 0xa4, 0x4a, 0x5f, 0x84, 0xda, 0xaa, 0x93, 0x73, 0x2d, 0xca, + 0x47, 0x67, 0x36, 0x2e, 0xd3, 0x47, 0x67, 0xf4, 0xe0, 0x56, 0x8b, 0x0d, + 0xdb, 0x4e, 0xc2, 0x1e, 0x6d, 0x98, 0xb0, 0x2a, 0x6e, 0xb3, 0x41, 0x9d, + 0x67, 0x94, 0xdd, 0x10, 0x6e, 0xb7, 0xcb, 0xea, 0x4f, 0xac, 0x66, 0xe6, + 0xe0, 0x0c, 0x00, 0x3d, 0xdd, 0x3d, 0xfe, 0x7e, 0xf1, 0xa7, 0x0e, 0x95, + 0xaa, 0x6c, 0xca, 0x7b, 0xa1, 0x65, 0x69, 0x8c, 0x1b, 0x18, 0x81, 0xc9, + 0xaa, 0xba, 0xfe, 0x44, 0x32, 0xe5, 0xef, 0x87, 0xc3, 0xa5, 0xd3, 0x36, + 0x6e, 0xb5, 0x06, 0xe6, 0xdc, 0x69, 0x5a, 0x4b, 0x2c, 0x05, 0xb3, 0x4a, + 0xa7, 0x29, 0x96, 0x4a, 0x0d, 0xb0, 0x27, 0x4f, 0xd9, 0x33, 0xb2, 0xb8, + 0x4e, 0x89, 0xb4, 0x95, 0x66, 0xe2, 0xb1, 0x5c, 0x8b, 0x54, 0xe6, 0x96, + 0xdd, 0x6d, 0x43, 0x60, 0xbf, 0x40, 0x51, 0x1b, 0xfb, 0x15, 0x9d, 0x22, + 0xc3, 0x67, 0x0f, 0x51, 0x9c, 0x75, 0x70, 0x0f, 0xbb, 0x64, 0x33, 0x59, + 0x1f, 0xb2, 0x98, 0x2f, 0x16, 0x7d, 0xb0, 0x56, 0x2e, 0x9f, 0x67, 0xf8, + 0xec, 0xa1, 0x39, 0xc1, 0x5a, 0x96, 0x86, 0x89, 0xb9, 0xfa, 0xab, 0xec, + 0x73, 0x19, 0x38, 0x85, 0xfd, 0xc3, 0xe1, 0xda, 0x01, 0xb5, 0x1a, 0x8c, + 0xf7, 0xb5, 0x91, 0x92, 0x7b, 0xa8, 0x04, 0xcb, 0x2c, 0x3f, 0xcf, 0x8a, + 0x36, 0x48, 0x29, 0xce, 0x16, 0x31, 0xbb, 0x4c, 0x2a, 0xb2, 0x42, 0xe5, + 0x60, 0x05, 0xbb, 0x3b, 0x83, 0x7b, 0xa8, 0x84, 0x95, 0x4c, 0x31, 0xa1, + 0xef, 0x49, 0x42, 0x34, 0x82, 0xbc, 0xda, 0xe5, 0xf1, 0x46, 0xc8, 0xb3, + 0x6b, 0xf3, 0xe0, 0x4e, 0x17, 0x60, 0xf3, 0x8c, 0x36, 0x61, 0xf1, 0x80, + 0x4d, 0xeb, 0x35, 0x14, 0x0b, 0x68, 0x80, 0x5b, 0x45, 0x61, 0x56, 0xe1, + 0xfd, 0x76, 0xc0, 0xaa, 0x95, 0x21, 0x08, 0x54, 0x14, 0x42, 0xd5, 0xdb, + 0xc6, 0xaf, 0x40, 0x81, 0x95, 0xda, 0xc5, 0xf3, 0x8f, 0x42, 0xb6, 0xc2, + 0xf9, 0x14, 0x28, 0xb0, 0x13, 0xe8, 0x0d, 0xe5, 0x5f, 0x68, 0x01, 0x9e, + 0xf2, 0xdc, 0xc2, 0x7e, 0xd1, 0xb2, 0xcf, 0x57, 0x27, 0xcf, 0xbd, 0x31, + 0x9d, 0xc6, 0x3a, 0x78, 0x6d, 0x18, 0x55, 0x14, 0xf4, 0xd5, 0x4a, 0x5e, + 0x7d, 0x57, 0xb2, 0x92, 0x9d, 0xec, 0x64, 0x67, 0xa8, 0x2d, 0xc2, 0xfe, + 0x9d, 0x4a, 0x6e, 0x78, 0x2f, 0x97, 0xdc, 0xf4, 0x38, 0xeb, 0xfe, 0xf2, + 0xbd, 0x00, 0x5c, 0xfa, 0xe4, 0x01, 0xd6, 0xad, 0x3b, 0x15, 0x50, 0x20, + 0xa8, 0x76, 0x50, 0x28, 0x68, 0x84, 0x4a, 0xbd, 0x11, 0x00, 0xab, 0x58, + 0x81, 0xa2, 0x30, 0xad, 0x85, 0xc8, 0xdc, 0x07, 0x6e, 0x61, 0x12, 0xb6, + 0x5f, 0x0f, 0x7b, 0x23, 0xf7, 0xe7, 0xd9, 0xc6, 0xe7, 0xcd, 0x6b, 0x86, + 0x47, 0xb5, 0xd0, 0x06, 0xe0, 0x26, 0x07, 0xa6, 0x1c, 0x97, 0x84, 0x08, + 0xdc, 0x9a, 0x14, 0x06, 0x6b, 0x85, 0xdd, 0x3e, 0x6e, 0x01, 0x0e, 0xf4, + 0x65, 0x60, 0x7a, 0x0d, 0x94, 0xb6, 0xc2, 0x75, 0xdb, 0xe1, 0xd7, 0x93, + 0x70, 0xef, 0x25, 0x90, 0xbe, 0x46, 0xd1, 0x21, 0x08, 0x01, 0xa8, 0xee, + 0xcb, 0xc0, 0xd9, 0x11, 0x83, 0xa9, 0x6f, 0xd2, 0x11, 0x5c, 0xeb, 0xea, + 0xff, 0x7e, 0x37, 0x3b, 0xee, 0xd8, 0x86, 0xbb, 0x77, 0xac, 0xc9, 0xef, + 0x68, 0xda, 0x64, 0xed, 0x49, 0xfd, 0xf0, 0xc2, 0x14, 0x7c, 0x7f, 0x34, + 0x80, 0x66, 0xdd, 0x3b, 0x06, 0x0f, 0x3b, 0x81, 0xfb, 0xeb, 0x24, 0xb1, + 0x6c, 0x04, 0xd1, 0x15, 0x3c, 0x07, 0xcd, 0x0f, 0x04, 0x0f, 0xf8, 0x4b, + 0x2f, 0x0e, 0x8c, 0x02, 0xf7, 0x3c, 0xa2, 0xb6, 0x52, 0x08, 0x52, 0xcb, + 0x6c, 0x24, 0xd0, 0xf3, 0xf1, 0xc0, 0xf0, 0xe7, 0x86, 0x1b, 0xc3, 0xd0, + 0xd8, 0x40, 0xa3, 0x77, 0xde, 0xd4, 0x70, 0x9c, 0x36, 0x7b, 0x28, 0xb9, + 0x33, 0x47, 0x5f, 0xf0, 0xdf, 0x21, 0xf9, 0x80, 0x50, 0xe1, 0x0d, 0x68, + 0x22, 0x7d, 0x22, 0x59, 0x03, 0x91, 0x68, 0x8e, 0xf8, 0x46, 0x95, 0x87, + 0x85, 0x81, 0x9c, 0xe6, 0x82, 0x69, 0x85, 0xf5, 0xe2, 0x4b, 0x2f, 0xf0, + 0x4f, 0xc0, 0x3f, 0x77, 0x9f, 0xcc, 0x75, 0xf9, 0x5f, 0xf3, 0x57, 0x2f, + 0x49, 0x96, 0xce, 0x11, 0xef, 0xb8, 0x25, 0x4b, 0xe8, 0xed, 0xed, 0x25, + 0xf5, 0xfc, 0x04, 0x63, 0x65, 0x18, 0xe8, 0x82, 0x83, 0xe5, 0x32, 0x27, + 0x67, 0x32, 0x1d, 0x81, 0xb5, 0x00, 0xf2, 0xf9, 0x3c, 0x4b, 0xdb, 0xa4, + 0xbf, 0xb4, 0x85, 0x7f, 0xab, 0xba, 0x78, 0x00, 0xae, 0xe7, 0x8f, 0x33, + 0x78, 0x78, 0xd7, 0x6e, 0x00, 0x9e, 0x7e, 0xfa, 0x69, 0x9e, 0x3f, 0xce, + 0xe0, 0xa9, 0x89, 0x09, 0x8e, 0x6f, 0x91, 0xb6, 0x38, 0x4e, 0x50, 0x7a, + 0xa1, 0xc4, 0x77, 0xef, 0xb9, 0x87, 0xec, 0x19, 0x59, 0x4e, 0xeb, 0x79, + 0x37, 0x8b, 0x38, 0x8e, 0x67, 0x5f, 0x2a, 0x21, 0x5f, 0x91, 0x1c, 0xdb, + 0xa6, 0x4c, 0x73, 0xd5, 0x65, 0xa1, 0xe7, 0x65, 0xde, 0xf4, 0x0d, 0xc9, + 0x86, 0x6d, 0x9b, 0xc8, 0xef, 0x2e, 0x32, 0xba, 0xbc, 0x82, 0x2c, 0x5b, + 0x94, 0x70, 0xc8, 0xe5, 0xbe, 0x08, 0x5c, 0xa1, 0x02, 0x19, 0x1f, 0x63, + 0xd5, 0xc5, 0x3f, 0xe4, 0xa6, 0x6f, 0xec, 0xa0, 0xe4, 0x80, 0x2c, 0x8f, + 0x73, 0xf5, 0x65, 0x23, 0xdc, 0x3c, 0x2d, 0x30, 0x85, 0x44, 0x86, 0x0c, + 0x43, 0xcd, 0xae, 0x50, 0xda, 0x12, 0x86, 0x07, 0x07, 0x91, 0xd2, 0x03, + 0x4b, 0x05, 0xda, 0xf6, 0xdd, 0xbb, 0x11, 0x46, 0x07, 0xfd, 0x4d, 0x21, + 0x15, 0xa4, 0x6a, 0x49, 0x60, 0x3c, 0xba, 0x7a, 0x10, 0xb6, 0x7e, 0x7b, + 0x07, 0x52, 0x2a, 0x98, 0x55, 0xba, 0x0e, 0x6b, 0xae, 0x58, 0xcd, 0xf0, + 0xe0, 0x52, 0x36, 0xff, 0xfd, 0x33, 0x6c, 0xbd, 0x4f, 0x52, 0xdc, 0x5d, + 0x24, 0x7f, 0xcf, 0x66, 0x36, 0x7f, 0x6d, 0x23, 0xdb, 0xef, 0x68, 0x04, + 0x60, 0xc9, 0xba, 0x60, 0xcf, 0x23, 0x0a, 0x0c, 0x92, 0x12, 0xe9, 0x00, + 0xd0, 0x1d, 0x2a, 0xb7, 0x37, 0xee, 0xb2, 0x97, 0xa4, 0x5a, 0xf6, 0x97, + 0xa3, 0xc7, 0x29, 0x61, 0x53, 0x91, 0x45, 0x72, 0x39, 0x07, 0x91, 0x4a, + 0x35, 0xa4, 0x01, 0x6a, 0xdc, 0x6d, 0x2e, 0x49, 0x29, 0xa8, 0xd6, 0x7e, + 0x87, 0x4c, 0xc6, 0xa4, 0x24, 0x13, 0x98, 0x75, 0x89, 0x5b, 0x4f, 0x40, + 0xad, 0x46, 0x36, 0x6b, 0x21, 0xeb, 0x69, 0x3f, 0x8e, 0x7b, 0xd8, 0xc1, + 0x29, 0x81, 0xb9, 0xc8, 0x82, 0xba, 0x02, 0x6a, 0x03, 0x98, 0x29, 0x13, + 0xb7, 0x1a, 0xcc, 0x4f, 0x88, 0x0e, 0x9e, 0xe3, 0xbf, 0x10, 0xc7, 0xf0, + 0x9e, 0x57, 0xd4, 0xfe, 0xd2, 0xb7, 0x1d, 0xc3, 0x61, 0xd4, 0x74, 0x46, + 0x78, 0xba, 0xc0, 0x7b, 0xc2, 0x59, 0xc0, 0x01, 0xe0, 0xd4, 0xdb, 0x5f, + 0xc5, 0x5d, 0x7b, 0x2c, 0x87, 0x27, 0x5f, 0xe5, 0xb4, 0xbb, 0x8e, 0x50, + 0x02, 0x96, 0x0c, 0x1c, 0xcb, 0x7f, 0x4e, 0xbd, 0x8a, 0x03, 0x2c, 0xd7, + 0x7f, 0xfb, 0x50, 0xb0, 0x8e, 0xa5, 0x21, 0xc8, 0x94, 0x01, 0x2c, 0x7d, + 0x15, 0x78, 0xe1, 0x88, 0x9f, 0xff, 0x52, 0xc5, 0xe7, 0xa2, 0xeb, 0x84, + 0x63, 0x58, 0x76, 0x3c, 0x1c, 0xfb, 0x1a, 0x18, 0x59, 0x0b, 0x81, 0x56, + 0x2d, 0x7d, 0x13, 0x20, 0x5c, 0x9d, 0x96, 0xa7, 0x55, 0x59, 0x4e, 0xad, + 0x1e, 0xe1, 0x80, 0xde, 0xff, 0x3d, 0x02, 0xa0, 0x99, 0xe7, 0xf6, 0x54, + 0xf2, 0x18, 0x58, 0x40, 0x7d, 0x3d, 0xe5, 0x80, 0x52, 0x5d, 0x41, 0x02, + 0x3e, 0xa0, 0xdd, 0xa6, 0xa7, 0x0e, 0x37, 0x85, 0xfb, 0x85, 0xde, 0xbe, + 0xab, 0x4d, 0x3a, 0x7e, 0x9c, 0x79, 0x80, 0x5c, 0xad, 0xd2, 0xf6, 0xd2, + 0x0f, 0xa7, 0xfd, 0xae, 0x50, 0xd8, 0x69, 0xd0, 0xa4, 0xa9, 0xc3, 0x4d, + 0xe1, 0x3c, 0x79, 0x00, 0xae, 0xa8, 0x7e, 0xf6, 0x0a, 0xbc, 0xef, 0x08, + 0x60, 0x04, 0xa0, 0x5e, 0x0f, 0x7c, 0xa0, 0xc2, 0x2f, 0xe2, 0xc8, 0x22, + 0x2f, 0xde, 0x22, 0xa4, 0x7c, 0x19, 0x13, 0xb8, 0x34, 0x09, 0xde, 0x5d, + 0xdd, 0xd2, 0x91, 0xc6, 0x15, 0x27, 0x01, 0x1b, 0x0f, 0x15, 0xa4, 0xfc, + 0x33, 0x28, 0xe8, 0x9b, 0x00, 0x46, 0x92, 0x3a, 0x9f, 0xe8, 0xdc, 0x1a, + 0x34, 0x01, 0xb8, 0x3c, 0x77, 0xef, 0xc9, 0xa4, 0xce, 0x83, 0xba, 0x7f, + 0x0c, 0x22, 0x19, 0x07, 0x4a, 0x65, 0x95, 0x96, 0x00, 0xce, 0x39, 0x67, + 0x11, 0x3f, 0xf9, 0xc9, 0xe1, 0x00, 0x46, 0x36, 0x75, 0x98, 0x57, 0x7e, + 0x5f, 0x6d, 0x5f, 0x8b, 0x44, 0x72, 0xee, 0x3e, 0xc2, 0x15, 0x5f, 0x79, + 0x80, 0x5b, 0xff, 0xfa, 0x82, 0x86, 0x67, 0x48, 0xe9, 0x9e, 0x37, 0x16, + 0x64, 0x9a, 0x1d, 0x54, 0xf7, 0xee, 0xdc, 0x44, 0x05, 0xe7, 0xbc, 0xb5, + 0xb8, 0x0f, 0xde, 0xce, 0xe0, 0x60, 0x0a, 0xbe, 0xdb, 0x18, 0x6e, 0xf3, + 0xd7, 0x15, 0x64, 0x71, 0xe3, 0x17, 0x9a, 0x61, 0x5b, 0x03, 0xa7, 0xcd, + 0x0d, 0xd6, 0x5a, 0x77, 0x91, 0xcd, 0xd6, 0xfb, 0x16, 0x36, 0xcf, 0x65, + 0x27, 0xe7, 0x7f, 0xfe, 0xb8, 0xcb, 0xbd, 0xb3, 0x1a, 0x6a, 0xd7, 0x04, + 0x0c, 0x9c, 0x95, 0x22, 0x0c, 0xd6, 0xda, 0xf4, 0xfd, 0xb5, 0xd0, 0x0b, + 0x99, 0x33, 0xf4, 0xb3, 0x42, 0x42, 0xe5, 0x5e, 0xb5, 0xef, 0x01, 0xb5, + 0xd6, 0x7c, 0x5c, 0xcd, 0xdd, 0x6c, 0xbf, 0xb3, 0x71, 0x2c, 0x61, 0x26, + 0xe7, 0x99, 0x30, 0xf3, 0x35, 0x13, 0xc4, 0x11, 0x69, 0xac, 0x74, 0x06, + 0x77, 0x36, 0x4f, 0x13, 0x2a, 0xc9, 0xc8, 0x43, 0x5d, 0x62, 0xa5, 0x47, + 0xc8, 0xcf, 0x78, 0xe3, 0x8e, 0x66, 0xa0, 0x96, 0x69, 0x58, 0xa4, 0xba, + 0x2c, 0xdc, 0x92, 0x8b, 0x69, 0xd8, 0xd8, 0xe9, 0x0c, 0xb9, 0x19, 0xaf, + 0x9f, 0xaf, 0xc2, 0xda, 0xcb, 0xb2, 0xe4, 0x0a, 0xa3, 0xa1, 0x38, 0xe9, + 0x08, 0xc0, 0xd1, 0x21, 0x95, 0xb6, 0x70, 0x67, 0x4b, 0x08, 0x61, 0xfb, + 0xfb, 0x51, 0x79, 0x90, 0x06, 0xd3, 0xd0, 0xcf, 0xb7, 0xba, 0xc0, 0x12, + 0xe0, 0x48, 0xb0, 0x84, 0xc0, 0x91, 0x0a, 0xa6, 0x05, 0xe0, 0xd6, 0xc1, + 0x45, 0xc1, 0xb4, 0x2c, 0xc3, 0xc4, 0x69, 0x79, 0x9a, 0xe6, 0x02, 0x58, + 0x7c, 0x91, 0xd5, 0xcb, 0x6f, 0xe4, 0xda, 0x3b, 0x2e, 0xf0, 0x5d, 0xae, + 0xcb, 0x3e, 0xe0, 0xfb, 0x41, 0x06, 0x21, 0x6c, 0xec, 0x65, 0xd9, 0x10, + 0x58, 0xab, 0xf5, 0x6f, 0x27, 0xa8, 0x6f, 0xf8, 0xaa, 0x36, 0x51, 0x60, + 0xad, 0x51, 0x30, 0x34, 0x99, 0xa9, 0x0e, 0xf0, 0x31, 0x46, 0xa7, 0xbd, + 0x98, 0x83, 0xdc, 0xf0, 0x83, 0xf7, 0xd1, 0x63, 0x5e, 0xa1, 0xda, 0x70, + 0x46, 0x41, 0x66, 0x14, 0x58, 0x6b, 0x8e, 0xa2, 0xc7, 0xfa, 0xff, 0x9f, + 0x5a, 0xbc, 0x1f, 0x11, 0x33, 0x25, 0x30, 0x5c, 0x44, 0xd8, 0x2f, 0xf2, + 0x0c, 0x92, 0x52, 0x42, 0xbd, 0x86, 0x28, 0x2c, 0x14, 0x4f, 0x1a, 0x8a, + 0xbf, 0x37, 0x8f, 0xf8, 0x40, 0x36, 0x00, 0x75, 0x09, 0x4d, 0x76, 0xda, + 0x9b, 0x47, 0x7a, 0xe0, 0x2e, 0x0d, 0xe1, 0x6a, 0x37, 0x47, 0xec, 0x8d, + 0x49, 0x7a, 0xba, 0xd2, 0xcc, 0x94, 0x9b, 0xcb, 0xd2, 0xf0, 0x1e, 0xad, + 0x6d, 0xec, 0x60, 0x4f, 0x56, 0x2b, 0x08, 0x61, 0x52, 0x09, 0xc1, 0x02, + 0x85, 0xf7, 0xc5, 0x98, 0x90, 0x8a, 0x33, 0xba, 0x3f, 0xfc, 0xa7, 0x57, + 0xe2, 0x5e, 0xbb, 0x51, 0xbf, 0xeb, 0xd2, 0x9e, 0x55, 0x89, 0xbc, 0x76, + 0x1d, 0xe2, 0xba, 0xad, 0xc1, 0x4b, 0xaf, 0xf9, 0xae, 0xbb, 0xba, 0x44, + 0x08, 0x53, 0x7f, 0x54, 0x87, 0xf9, 0xc3, 0xbf, 0x06, 0x15, 0xf5, 0xf9, + 0xac, 0x44, 0xe8, 0xcb, 0xe1, 0x6f, 0x83, 0x08, 0x01, 0x96, 0x94, 0x14, + 0x85, 0xf0, 0xc3, 0x34, 0xc0, 0x95, 0x05, 0x54, 0x24, 0x54, 0x50, 0xfe, + 0x42, 0x28, 0x58, 0x17, 0x28, 0xf0, 0x93, 0x9f, 0x94, 0x80, 0x6c, 0x97, + 0x20, 0x17, 0x02, 0x92, 0x8c, 0x57, 0xf5, 0x67, 0x84, 0x74, 0xf8, 0x71, + 0x7d, 0x3e, 0x27, 0x4b, 0xd2, 0x4f, 0xa3, 0x58, 0x57, 0x00, 0x2b, 0xbf, + 0xbc, 0x86, 0x20, 0x91, 0x54, 0xb0, 0x9a, 0x5a, 0x55, 0xea, 0x3b, 0xa5, + 0x24, 0x21, 0x4c, 0x66, 0x50, 0x60, 0xad, 0x19, 0x20, 0x5f, 0x07, 0xfb, + 0x50, 0x89, 0xa9, 0x3b, 0xb7, 0x93, 0x12, 0x50, 0xe9, 0xd6, 0x20, 0x99, + 0xc7, 0x72, 0x90, 0xcf, 0x93, 0xb3, 0x6d, 0xd6, 0x7d, 0x7e, 0x1d, 0x5b, + 0xff, 0xe1, 0x26, 0x9d, 0x46, 0x0d, 0x21, 0x04, 0x19, 0x23, 0x81, 0xeb, + 0x56, 0x98, 0xd2, 0xe7, 0x4e, 0xd6, 0x85, 0x82, 0x5e, 0x85, 0xc7, 0x35, + 0x1a, 0xb8, 0x35, 0x60, 0x2a, 0x78, 0x16, 0x08, 0xbc, 0x11, 0x61, 0x05, + 0x75, 0x47, 0xb6, 0x75, 0x5f, 0x2b, 0xa5, 0xe1, 0x68, 0x0d, 0x1f, 0x06, + 0x10, 0xea, 0x37, 0x98, 0xd7, 0x38, 0x2c, 0x61, 0x24, 0x28, 0x02, 0xb6, + 0x51, 0xc1, 0x21, 0xe5, 0xa1, 0x1f, 0xc9, 0xa6, 0xd5, 0x79, 0xc9, 0x87, + 0x7e, 0x2e, 0xb6, 0x21, 0x82, 0x76, 0x15, 0x2a, 0xbf, 0x4e, 0xc6, 0xe0, + 0xa7, 0x23, 0x79, 0xf5, 0xcc, 0x57, 0x38, 0xfd, 0x51, 0x95, 0xd2, 0x62, + 0x0d, 0xd4, 0x3a, 0xdd, 0xeb, 0x63, 0xca, 0x7e, 0xf2, 0x62, 0x8a, 0x8c, + 0x06, 0x6b, 0x9d, 0x8e, 0x84, 0x47, 0x8f, 0xf3, 0xfd, 0x5f, 0x9f, 0xad, + 0x22, 0xc7, 0x3c, 0x94, 0x3b, 0xe8, 0x83, 0xb5, 0xc2, 0x72, 0xaa, 0x70, + 0xe7, 0x8f, 0x73, 0x7c, 0xfc, 0x8f, 0xb2, 0x9c, 0xb4, 0xd0, 0xf4, 0x65, + 0x3f, 0x5e, 0x2b, 0x8d, 0x84, 0xeb, 0x70, 0x14, 0xdb, 0x82, 0x98, 0xe4, + 0x74, 0xd9, 0xff, 0x9a, 0xe2, 0x1f, 0x78, 0xf5, 0x34, 0xbe, 0x70, 0xd1, + 0x3b, 0x15, 0x20, 0x0b, 0x38, 0xf0, 0xea, 0x69, 0xbe, 0xff, 0x7b, 0x8f, + 0xeb, 0xe7, 0xc0, 0xab, 0x70, 0xe0, 0xbe, 0x5f, 0xc0, 0x7d, 0xff, 0xc2, + 0xe3, 0xaf, 0x28, 0x70, 0x92, 0x07, 0xcf, 0xfa, 0xd2, 0xca, 0x95, 0x4c, + 0x3d, 0xe0, 0xf5, 0x11, 0xf0, 0x81, 0x5a, 0x87, 0x9d, 0x67, 0x78, 0xe6, + 0xf9, 0xc3, 0xb0, 0xb8, 0xdd, 0x0c, 0x92, 0x52, 0x71, 0xc6, 0xc1, 0x0d, + 0x7d, 0xe4, 0xc7, 0x6c, 0xf3, 0xb1, 0x1f, 0x0f, 0xa8, 0x05, 0x50, 0x29, + 0xe9, 0xf9, 0x88, 0x52, 0x70, 0xcd, 0x96, 0x28, 0x21, 0x2c, 0x41, 0x65, + 0xbf, 0x4b, 0xca, 0x12, 0xe4, 0x66, 0x54, 0x9f, 0xc3, 0xad, 0x96, 0xa8, + 0xec, 0x97, 0xa4, 0xac, 0xd0, 0x3c, 0x46, 0x12, 0x4c, 0x4c, 0x36, 0xfd, + 0xf5, 0x26, 0xae, 0xff, 0xfa, 0x56, 0xf2, 0xfb, 0xa6, 0xa0, 0xb7, 0x88, + 0x29, 0xd4, 0x7c, 0xb0, 0x30, 0x12, 0xa1, 0x0f, 0x6c, 0xc1, 0x40, 0x26, + 0x8b, 0x48, 0x0a, 0xb6, 0xdf, 0xb9, 0x8d, 0x35, 0x97, 0xad, 0x21, 0xa7, + 0xdf, 0xab, 0xe6, 0x66, 0x55, 0x99, 0xcc, 0x2e, 0x93, 0x5a, 0xb9, 0x46, + 0x8d, 0x1a, 0x89, 0xae, 0x04, 0xb5, 0x72, 0x00, 0xc2, 0x72, 0xa5, 0x83, + 0xb0, 0x4d, 0x8a, 0xfb, 0x4b, 0xd8, 0x29, 0x93, 0x1d, 0x1a, 0xa8, 0x25, + 0x5d, 0x89, 0x30, 0x05, 0x94, 0xa5, 0x1a, 0x23, 0x19, 0x0a, 0xae, 0x95, + 0x4d, 0x37, 0x02, 0x97, 0x12, 0x5d, 0xaa, 0xff, 0xdc, 0xf0, 0xce, 0xb1, + 0x47, 0xe8, 0xb2, 0x09, 0x2a, 0xa5, 0x8a, 0x1f, 0xa6, 0x56, 0xae, 0x61, + 0x2e, 0xe9, 0x61, 0xd3, 0x17, 0xd6, 0xb1, 0xd9, 0x80, 0x8d, 0x9f, 0x5d, + 0xc7, 0xf5, 0x5f, 0xdf, 0x1a, 0x84, 0x75, 0x25, 0xc5, 0xb2, 0xbe, 0x62, + 0xbb, 0x2c, 0x2a, 0x7a, 0xfe, 0xc9, 0x4e, 0x5b, 0x60, 0x48, 0x6a, 0x1e, + 0xfc, 0xf8, 0x30, 0x6a, 0x7d, 0xc4, 0x1c, 0xf3, 0x23, 0xa9, 0x14, 0xa4, + 0x52, 0x29, 0x4c, 0xd3, 0x44, 0x74, 0x59, 0x0a, 0xd2, 0x35, 0x97, 0x42, + 0x40, 0x2d, 0x08, 0xc0, 0x59, 0x40, 0x03, 0x4c, 0xcb, 0xea, 0xb3, 0x7c, + 0xe0, 0x96, 0xb7, 0x85, 0x00, 0x00, 0xe5, 0x4c, 0x3b, 0x01, 0x50, 0x4b, + 0xc7, 0x6d, 0x95, 0xf3, 0x5c, 0xf7, 0x99, 0xff, 0x79, 0xef, 0x8f, 0x79, + 0xfa, 0x97, 0x6a, 0x5e, 0xf2, 0x8a, 0xcb, 0xd7, 0x70, 0xeb, 0x6d, 0xdb, + 0x7d, 0xbf, 0x8d, 0xef, 0x38, 0x9f, 0xcd, 0x83, 0xbb, 0x1b, 0xca, 0x2c, + 0x00, 0xeb, 0x22, 0xdb, 0xcf, 0xdb, 0x03, 0x84, 0x59, 0x17, 0xd9, 0x38, + 0xf7, 0x15, 0x03, 0xc8, 0x57, 0xc8, 0x4f, 0x0c, 0x06, 0x63, 0x93, 0x9f, + 0x0d, 0x3e, 0xc6, 0xbb, 0x8a, 0xea, 0xbd, 0xa0, 0x18, 0x34, 0xfd, 0x3a, + 0x79, 0xf5, 0xf6, 0xea, 0x66, 0x7f, 0x80, 0xc2, 0xff, 0x72, 0x00, 0x00, + 0x20, 0x00, 0x49, 0x44, 0x41, 0x54, 0x32, 0xd3, 0x54, 0x3f, 0xba, 0x05, + 0xb6, 0xce, 0xbb, 0x01, 0x3a, 0xd6, 0x2d, 0x10, 0xdd, 0xa2, 0x6d, 0x5a, + 0x0d, 0xe5, 0x0a, 0xa5, 0x15, 0x95, 0x33, 0xed, 0xd0, 0xab, 0x17, 0x1e, + 0x78, 0x40, 0xad, 0x28, 0x4c, 0xcb, 0xd3, 0x73, 0x2f, 0x15, 0x39, 0xe9, + 0xc4, 0x53, 0xf8, 0x0d, 0x4f, 0xcd, 0xd1, 0xba, 0xb1, 0x62, 0xc5, 0x8a, + 0x15, 0x2b, 0x56, 0xac, 0x58, 0xb1, 0x62, 0xc5, 0x8a, 0x15, 0x2b, 0x56, + 0xac, 0x58, 0xb1, 0x62, 0xc5, 0x8a, 0x15, 0x2b, 0x56, 0xac, 0x58, 0xb1, + 0x62, 0xc5, 0x8a, 0x15, 0x6b, 0x3e, 0xc5, 0x66, 0x99, 0xb1, 0x62, 0xc5, + 0x8a, 0x15, 0x2b, 0xd6, 0x5b, 0x40, 0xad, 0x60, 0x50, 0x61, 0xb7, 0x30, + 0xb0, 0x29, 0x0a, 0x7b, 0x92, 0x75, 0x89, 0x33, 0xdb, 0xbc, 0x74, 0x2d, + 0x1a, 0x2e, 0xd3, 0x9b, 0xf1, 0xbf, 0xac, 0x5b, 0x9c, 0x29, 0x36, 0x41, + 0xa4, 0x3c, 0x23, 0x98, 0xf0, 0x02, 0xf3, 0x74, 0x3a, 0x4d, 0xa9, 0x54, + 0x6a, 0x08, 0xdb, 0xb3, 0xac, 0x87, 0x52, 0xa9, 0xd4, 0x54, 0x5e, 0x2f, + 0xcf, 0x4e, 0x41, 0x26, 0xb2, 0x1e, 0xac, 0xf0, 0x8d, 0x96, 0xc1, 0xfb, + 0xca, 0xbd, 0x0c, 0x2d, 0xe8, 0x94, 0xd5, 0x00, 0x9a, 0x95, 0x59, 0x9e, + 0x21, 0xaf, 0xbf, 0x38, 0x1d, 0x2e, 0x43, 0x3a, 0x9d, 0x56, 0x30, 0x99, + 0x50, 0xf6, 0xad, 0xea, 0xd0, 0x4e, 0xe1, 0x36, 0x13, 0x42, 0xe0, 0x56, + 0xd5, 0x42, 0x74, 0xcb, 0xb4, 0x28, 0xb5, 0x30, 0xaa, 0x89, 0xaa, 0x67, + 0x59, 0x0f, 0x33, 0xf3, 0xd4, 0x3d, 0x51, 0x05, 0xd3, 0x14, 0x60, 0x24, + 0xb0, 0xa8, 0x21, 0xcc, 0x14, 0xc5, 0x59, 0x87, 0x44, 0x1d, 0x6a, 0xda, + 0xd0, 0x35, 0xa5, 0x17, 0x8d, 0xd6, 0x0c, 0x7c, 0xcb, 0xba, 0xc6, 0xf5, + 0xac, 0x42, 0x03, 0xb3, 0xe6, 0x96, 0xac, 0x83, 0xec, 0x31, 0x49, 0x00, + 0x95, 0x65, 0x26, 0x54, 0x25, 0xcc, 0x4a, 0xe8, 0x33, 0x61, 0xda, 0xa5, + 0xd6, 0x67, 0x92, 0x9a, 0x75, 0x7d, 0x90, 0x95, 0x6a, 0x83, 0xc0, 0xa8, + 0xd5, 0x09, 0x7d, 0x56, 0x3a, 0x5f, 0x77, 0xdb, 0x1a, 0xba, 0x9a, 0x86, + 0xf0, 0xc1, 0x5a, 0x00, 0x52, 0x48, 0x84, 0x14, 0x48, 0x6d, 0x4c, 0x2f, + 0x25, 0x58, 0xcb, 0xd4, 0xa2, 0xd8, 0x4a, 0x79, 0x06, 0x6b, 0x99, 0xcd, + 0x0d, 0x5f, 0xb9, 0xd9, 0x77, 0x03, 0xc0, 0x75, 0x74, 0x7c, 0xf5, 0x85, + 0x6d, 0x53, 0x88, 0x26, 0xa3, 0x05, 0xff, 0x1a, 0x10, 0xf8, 0x86, 0x18, + 0xe1, 0x76, 0xc9, 0x4f, 0x3b, 0x64, 0xfa, 0x2c, 0x72, 0x85, 0xe0, 0x7a, + 0x48, 0x69, 0xf0, 0x4e, 0xab, 0x3c, 0x53, 0x5d, 0x3d, 0x48, 0xb7, 0xa8, + 0xa0, 0x59, 0x4b, 0x80, 0x24, 0x38, 0x1a, 0xa8, 0xb5, 0xbd, 0xfb, 0x6e, + 0xd6, 0x1c, 0xbc, 0x54, 0xf9, 0x25, 0x54, 0x93, 0x53, 0xe5, 0x4d, 0x93, + 0x99, 0x4c, 0x53, 0x8a, 0x18, 0x96, 0x99, 0x49, 0x65, 0xbc, 0x15, 0x86, + 0x42, 0x75, 0x96, 0x96, 0xed, 0x43, 0xa8, 0xc2, 0xfb, 0x0b, 0x0d, 0xd3, + 0x2a, 0x8e, 0x2a, 0x4f, 0xeb, 0xb0, 0xad, 0xdc, 0x53, 0x66, 0xb6, 0xa5, + 0xfb, 0xcc, 0x41, 0x9b, 0xf1, 0x1f, 0x36, 0x02, 0x39, 0x44, 0x97, 0x40, + 0x96, 0xe7, 0xbf, 0x97, 0x78, 0xe5, 0x90, 0x73, 0x1a, 0xa5, 0xb5, 0x96, + 0xd7, 0x96, 0xe9, 0x64, 0xaa, 0x65, 0xbb, 0x96, 0x4a, 0x5e, 0x59, 0xe7, + 0x36, 0x12, 0x74, 0x0e, 0x39, 0x08, 0x21, 0xa8, 0x48, 0xc9, 0xe0, 0xd9, + 0x59, 0x72, 0x11, 0x38, 0x42, 0xf6, 0x8c, 0x2c, 0x25, 0xa7, 0xa4, 0xcc, + 0xd8, 0xf6, 0xe7, 0x19, 0xd4, 0xc7, 0x95, 0x7a, 0xcd, 0x07, 0x60, 0x99, + 0xa6, 0x89, 0xeb, 0xba, 0xfe, 0x7d, 0xcf, 0x2d, 0x07, 0xa6, 0x7e, 0xd9, + 0x6c, 0x96, 0x4c, 0x5f, 0xc6, 0xdf, 0xcf, 0xe9, 0xaf, 0x32, 0xe7, 0xa7, + 0xf3, 0xb8, 0xae, 0x64, 0xf4, 0xbe, 0x71, 0x84, 0x10, 0x5c, 0xf7, 0x37, + 0x1b, 0x98, 0xd8, 0x35, 0x41, 0x2a, 0x99, 0xc0, 0x3d, 0xec, 0x52, 0x9c, + 0x29, 0x92, 0xa7, 0x48, 0x4a, 0xc3, 0xb2, 0xe6, 0x02, 0x6b, 0x79, 0x40, + 0x2d, 0x0f, 0x6c, 0x05, 0xcc, 0x79, 0x2f, 0xef, 0x14, 0x58, 0x35, 0x57, + 0xb8, 0x62, 0xd9, 0x61, 0x24, 0x3d, 0xc2, 0xb8, 0x1c, 0x27, 0x25, 0x52, + 0xa4, 0x44, 0x8a, 0x8a, 0xac, 0x60, 0x76, 0x99, 0xfe, 0xbe, 0x5b, 0x76, + 0x71, 0x45, 0x09, 0x73, 0x89, 0xb6, 0x0e, 0x69, 0x91, 0x6e, 0x27, 0x65, + 0x49, 0x25, 0x53, 0x64, 0x33, 0x99, 0x39, 0xa1, 0x62, 0x9d, 0x2a, 0x8a, + 0x7a, 0x3a, 0x40, 0x91, 0xe5, 0x21, 0xd8, 0xd3, 0x4a, 0x60, 0x27, 0x3b, + 0xdb, 0x62, 0x9f, 0xa2, 0xa0, 0xa9, 0x9d, 0x04, 0x30, 0xab, 0x30, 0x2c, + 0x6a, 0xa5, 0x0e, 0x57, 0x88, 0xc0, 0xb0, 0x54, 0x1a, 0xe8, 0xb8, 0xca, + 0x2f, 0x0a, 0xfa, 0x0a, 0xfb, 0xf5, 0xea, 0x3c, 0xd0, 0xe1, 0x7a, 0x09, + 0x83, 0xa7, 0x94, 0x5b, 0x21, 0x14, 0x67, 0x25, 0x01, 0xb4, 0x2a, 0xc8, + 0xbf, 0x11, 0x8a, 0x85, 0xae, 0x63, 0x58, 0x9d, 0xd4, 0x49, 0xb5, 0x4b, + 0x23, 0x18, 0xab, 0x11, 0xd0, 0xe5, 0xb9, 0x17, 0xd8, 0xc9, 0x4e, 0x56, + 0xea, 0xd6, 0x0e, 0x03, 0xbb, 0xa2, 0xf1, 0x9a, 0xcb, 0xd7, 0x98, 0x57, + 0x90, 0x26, 0x6c, 0x69, 0xd1, 0x96, 0xf3, 0xe9, 0x81, 0xc9, 0xc7, 0xb9, + 0x64, 0x57, 0x70, 0x3c, 0xd4, 0x7f, 0x2a, 0x7b, 0x9e, 0x3c, 0xc0, 0xdd, + 0xa7, 0x9f, 0xba, 0xc0, 0x94, 0x5e, 0x1f, 0x85, 0xe1, 0x5a, 0xa7, 0xb6, + 0xd9, 0x6f, 0x07, 0xe0, 0x8a, 0xba, 0x5f, 0xbf, 0xc0, 0x38, 0x9d, 0x84, + 0xef, 0x0f, 0xb9, 0x87, 0x41, 0x63, 0x03, 0x6d, 0xf6, 0x5b, 0xc1, 0xc8, + 0x00, 0xb6, 0x1a, 0xf3, 0xef, 0x77, 0xa2, 0xed, 0x06, 0x0c, 0x75, 0x18, + 0xf6, 0xea, 0xaa, 0xe4, 0xe6, 0x85, 0x25, 0x7f, 0x54, 0xda, 0xb5, 0x0b, + 0x4a, 0x67, 0xc0, 0xae, 0xc7, 0x5a, 0x78, 0x2e, 0x99, 0x23, 0xe2, 0xb7, + 0xb5, 0x31, 0xf7, 0x9d, 0x63, 0xb0, 0x7c, 0x44, 0xed, 0xf7, 0x65, 0x34, + 0xdd, 0xc1, 0xd3, 0xba, 0xce, 0x0a, 0xf1, 0xcd, 0xf6, 0x5e, 0xe6, 0x59, + 0x23, 0x2d, 0x01, 0x5a, 0xaf, 0x57, 0xf8, 0x06, 0xbd, 0xad, 0x05, 0x58, + 0xeb, 0x0d, 0xd0, 0xb6, 0xff, 0x7a, 0x13, 0xeb, 0xfe, 0xc7, 0x08, 0x5b, + 0xff, 0x4b, 0x50, 0xce, 0x75, 0xff, 0x34, 0xc8, 0x86, 0xd1, 0xeb, 0xfc, + 0xe3, 0x5b, 0x57, 0x5d, 0x8b, 0xb8, 0x61, 0x84, 0xc4, 0x35, 0x41, 0x18, + 0xe7, 0xda, 0x15, 0x4c, 0x64, 0xd5, 0x71, 0xee, 0x4f, 0x46, 0xb9, 0xee, + 0xff, 0xf9, 0x59, 0x43, 0xba, 0xc5, 0x19, 0xf5, 0x1c, 0x5a, 0xfd, 0xf1, + 0x55, 0x7c, 0xec, 0x4f, 0xff, 0xd0, 0x77, 0x7f, 0xab, 0x01, 0xb5, 0x64, + 0x49, 0x22, 0xd2, 0x91, 0xb1, 0xa4, 0x5b, 0x01, 0xd9, 0x08, 0xb0, 0x90, + 0xd3, 0xad, 0xa1, 0x61, 0x1d, 0xa9, 0x8a, 0xc2, 0x73, 0x78, 0x9d, 0x74, + 0x21, 0x41, 0x86, 0x00, 0xca, 0x1e, 0x34, 0x38, 0x0a, 0xd6, 0x92, 0xb5, + 0xc6, 0xc3, 0xe9, 0x1d, 0xaf, 0x0b, 0x74, 0xa9, 0x93, 0x34, 0x3c, 0xbb, + 0xe0, 0x85, 0xe4, 0x77, 0xe1, 0x85, 0x17, 0x72, 0x0f, 0x50, 0x7c, 0xe8, + 0x21, 0xee, 0xb9, 0xf0, 0x42, 0xce, 0xd3, 0xee, 0x93, 0xf7, 0xdf, 0xdf, + 0x32, 0xfc, 0x1f, 0x1c, 0x3a, 0x04, 0x87, 0x0e, 0x31, 0x06, 0xbc, 0x03, + 0x98, 0x2c, 0x57, 0xb9, 0x80, 0x2a, 0x1c, 0x3a, 0xc4, 0x6f, 0xe8, 0x6c, + 0x98, 0x31, 0xb7, 0x39, 0xa4, 0xf2, 0xef, 0xa4, 0x2e, 0x8b, 0x33, 0x19, + 0x5e, 0x2e, 0x2a, 0x43, 0xac, 0x43, 0xf2, 0x05, 0x4e, 0x39, 0xe5, 0x14, + 0xca, 0xc5, 0xa7, 0xe0, 0x95, 0x60, 0xf0, 0x15, 0xee, 0x59, 0xbd, 0xfa, + 0xc2, 0xaf, 0x79, 0x27, 0x27, 0x90, 0x3d, 0x23, 0xcb, 0x9f, 0x5f, 0xf1, + 0xe7, 0x2c, 0xe2, 0xb8, 0x0e, 0x4a, 0x3b, 0xb7, 0x16, 0x72, 0x5e, 0xe6, + 0xd3, 0xc4, 0x0a, 0xd5, 0x47, 0xce, 0x5f, 0x79, 0x3d, 0x9b, 0xff, 0x65, + 0x0d, 0xa3, 0x2e, 0x8c, 0x76, 0x39, 0xac, 0xfe, 0x7c, 0x8a, 0xd1, 0x9e, + 0x2d, 0x64, 0xf7, 0x2a, 0x10, 0x04, 0xf5, 0x2b, 0xc0, 0xf8, 0x10, 0xf6, + 0x79, 0x77, 0xc1, 0xec, 0x18, 0xc5, 0xa2, 0x4a, 0xbd, 0x76, 0xc8, 0x45, + 0x98, 0x26, 0x22, 0x44, 0x14, 0x93, 0x52, 0x8d, 0x89, 0x8b, 0x4e, 0x09, + 0xdb, 0x4a, 0xfb, 0x06, 0xea, 0x61, 0xb0, 0x96, 0xe7, 0x96, 0xdf, 0x2f, + 0xc9, 0x9c, 0x91, 0x9e, 0xb3, 0x8c, 0x43, 0x67, 0x0f, 0x92, 0x7f, 0xac, + 0x88, 0x08, 0x41, 0xb5, 0x00, 0x52, 0xcb, 0x57, 0x53, 0x7c, 0x38, 0xb8, + 0xde, 0x86, 0x07, 0x33, 0x14, 0x67, 0xaf, 0x01, 0x63, 0x29, 0x95, 0xbd, + 0xd7, 0x00, 0xc3, 0xbe, 0xdf, 0xf8, 0x44, 0x9e, 0xe1, 0x41, 0x55, 0x57, + 0x59, 0x17, 0xe4, 0x1f, 0x2b, 0x29, 0x98, 0x56, 0x2a, 0xd5, 0x34, 0x4e, + 0xaf, 0xb8, 0x6e, 0xd3, 0x58, 0x7a, 0xec, 0xbe, 0x9c, 0x1f, 0xbf, 0x9d, + 0xb2, 0x59, 0x13, 0xc8, 0x32, 0x3e, 0x91, 0x23, 0x55, 0x01, 0xb1, 0x24, + 0x15, 0x02, 0x7e, 0x2b, 0x00, 0xa4, 0x94, 0x0a, 0x94, 0x2c, 0x52, 0x89, + 0x96, 0x90, 0x01, 0x19, 0x81, 0x7e, 0x67, 0xb3, 0x59, 0x3f, 0x7e, 0x3e, + 0x5f, 0x84, 0xc3, 0x90, 0xc9, 0xd8, 0xe4, 0xf3, 0x45, 0xcc, 0x94, 0x1e, + 0x63, 0x75, 0xc0, 0x0a, 0x00, 0x38, 0x49, 0x1e, 0x81, 0xe3, 0x15, 0xd8, + 0xe9, 0x85, 0x17, 0x8e, 0x70, 0x24, 0x02, 0x79, 0x5a, 0x0f, 0xec, 0x01, + 0xf4, 0x19, 0xe7, 0x4c, 0xe0, 0x39, 0x20, 0x7d, 0xfb, 0xab, 0xd4, 0x3e, + 0x76, 0x0c, 0xa5, 0xa9, 0x23, 0x3c, 0x07, 0x1c, 0xb8, 0xfd, 0x55, 0xfe, + 0xa0, 0x1f, 0xfe, 0x53, 0xd9, 0x24, 0xfb, 0x40, 0xad, 0x0d, 0xc0, 0x13, + 0xd5, 0x23, 0xfc, 0x2f, 0x1d, 0xff, 0x38, 0xe0, 0x85, 0x48, 0xfe, 0x1e, + 0x44, 0xee, 0xa5, 0x97, 0x8e, 0x50, 0x7d, 0x49, 0xd9, 0xbc, 0x02, 0x24, + 0x53, 0x6f, 0x0c, 0xfc, 0xea, 0xf0, 0x6b, 0x00, 0x52, 0xbd, 0x51, 0x65, + 0x81, 0xc6, 0xf2, 0xfc, 0x09, 0x01, 0x3c, 0x0b, 0x02, 0xa0, 0x96, 0xa7, + 0x7d, 0xc0, 0xdc, 0x28, 0xab, 0xf6, 0xf2, 0x20, 0x4f, 0xab, 0x0c, 0x78, + 0xa6, 0x05, 0x63, 0xc9, 0x03, 0x4f, 0xbd, 0x8b, 0x00, 0xac, 0xd5, 0xec, + 0xaf, 0xb4, 0xf7, 0x44, 0x9b, 0x3f, 0xa3, 0xcc, 0x8f, 0x69, 0x0f, 0xdf, + 0xea, 0x54, 0x7d, 0xa8, 0xee, 0xd6, 0xde, 0x13, 0x6d, 0xce, 0x7a, 0xb1, + 0x08, 0x04, 0x20, 0xa9, 0x76, 0x60, 0xad, 0xa6, 0x34, 0xfa, 0x61, 0x7a, + 0x0a, 0x7e, 0x56, 0x85, 0x53, 0x43, 0x97, 0x8b, 0x04, 0x3e, 0x78, 0x8e, + 0x82, 0x70, 0x7d, 0xf0, 0x1c, 0x80, 0x45, 0x3e, 0xa8, 0x6a, 0x44, 0x48, + 0xc6, 0x25, 0xd4, 0x84, 0x20, 0x21, 0x61, 0xb0, 0x0b, 0x6a, 0x40, 0xbe, + 0xdc, 0xea, 0xda, 0x51, 0x98, 0x2c, 0x6f, 0x86, 0xe4, 0x4a, 0x68, 0xfb, + 0x16, 0xd8, 0x16, 0x50, 0x0c, 0x41, 0x2f, 0x24, 0xb0, 0xad, 0x2c, 0xb0, + 0x91, 0xd8, 0x3a, 0xe5, 0xa2, 0xf6, 0x19, 0xf4, 0xee, 0xdc, 0x5e, 0x5a, + 0x02, 0xa4, 0x7e, 0x78, 0x2d, 0x3e, 0x47, 0xb5, 0xc1, 0xf4, 0x4f, 0x80, + 0x45, 0xf0, 0xe3, 0x29, 0xfc, 0x73, 0x63, 0xcd, 0xd3, 0x1e, 0x63, 0x8f, + 0xb8, 0x8c, 0x9c, 0x6d, 0xfa, 0x30, 0xad, 0xd1, 0x5d, 0x6a, 0x5e, 0x67, + 0xd5, 0x8a, 0x20, 0xe6, 0xe8, 0x83, 0xc1, 0x5c, 0xcf, 0x2a, 0xd6, 0xb2, + 0xea, 0x3c, 0xe5, 0x37, 0x16, 0x72, 0x1f, 0x99, 0xc3, 0x6d, 0x2e, 0xf7, + 0xf4, 0x47, 0xef, 0x02, 0x60, 0xcf, 0x77, 0x14, 0x40, 0x79, 0xa8, 0x57, + 0xdd, 0x97, 0xf6, 0x14, 0x5c, 0x86, 0x7a, 0x4d, 0xae, 0xf9, 0xc6, 0x1e, + 0x1c, 0x6d, 0x10, 0xbd, 0xea, 0x33, 0x16, 0x5b, 0xf7, 0xc2, 0x28, 0x97, + 0x90, 0x76, 0xc6, 0xd9, 0xfc, 0xe5, 0x1f, 0xb1, 0xf1, 0xab, 0x97, 0x40, + 0xd2, 0x86, 0x6a, 0xb1, 0x25, 0x4c, 0xcb, 0x93, 0x69, 0x40, 0xc2, 0xa8, + 0xb0, 0xee, 0xa2, 0x4c, 0x00, 0xcf, 0xd2, 0xf1, 0x7c, 0x85, 0x8f, 0xf5, + 0x3c, 0x17, 0xf3, 0xcc, 0xcd, 0x39, 0xfb, 0x1a, 0xfb, 0x4f, 0x76, 0x52, + 0x52, 0xac, 0xaa, 0x73, 0x15, 0x00, 0xb5, 0x60, 0xdb, 0xbf, 0xa9, 0xfa, + 0x67, 0x35, 0x34, 0x6b, 0x20, 0xab, 0x9e, 0x47, 0xf6, 0x47, 0x25, 0x6b, + 0xfa, 0x6e, 0x61, 0xfd, 0x3f, 0x7c, 0x0c, 0xb1, 0x4c, 0x90, 0x7f, 0x4c, + 0xb2, 0xfa, 0xe3, 0xfa, 0xde, 0x7c, 0x96, 0xda, 0x4c, 0xec, 0x95, 0x3e, + 0x60, 0x0b, 0x20, 0x85, 0xcb, 0xba, 0x2f, 0x6f, 0xe6, 0xfa, 0xaf, 0x5e, + 0x4f, 0x0a, 0x97, 0x0a, 0x26, 0xa9, 0x08, 0xaa, 0x6a, 0x3e, 0xb9, 0xb2, + 0x84, 0x45, 0x06, 0xea, 0x29, 0x14, 0xfe, 0xcd, 0xd3, 0x1e, 0x3d, 0xdf, + 0x3b, 0x83, 0x53, 0x0a, 0x8f, 0x09, 0xc2, 0x73, 0x6c, 0xb7, 0x03, 0x6b, + 0x71, 0xeb, 0x0e, 0x95, 0x72, 0x1a, 0x57, 0x7a, 0x6d, 0x94, 0x41, 0xfd, + 0xe2, 0x82, 0xf4, 0x02, 0xe8, 0x94, 0x85, 0x5b, 0x2f, 0x05, 0x50, 0x2c, + 0x40, 0xfd, 0xea, 0x2d, 0x2a, 0x25, 0x07, 0xa9, 0xd3, 0xa8, 0x94, 0xd2, + 0xfe, 0x7e, 0xa3, 0x02, 0xb7, 0x04, 0x90, 0x10, 0xe0, 0xd4, 0x25, 0x96, + 0x30, 0x71, 0xea, 0xae, 0x9a, 0x17, 0xd7, 0x6d, 0x60, 0x09, 0x93, 0x5a, + 0xdd, 0xc4, 0xad, 0x83, 0x83, 0x8b, 0x25, 0xcc, 0x36, 0xad, 0xa3, 0x01, + 0xc9, 0xd8, 0x7e, 0xca, 0xd7, 0x5d, 0xa6, 0xc0, 0x18, 0xf9, 0xc7, 0x26, + 0x59, 0xbd, 0xfc, 0x46, 0x76, 0xec, 0x53, 0x1f, 0xa3, 0x08, 0x00, 0x5b, + 0x37, 0x22, 0xe5, 0xb5, 0xc8, 0xfa, 0x75, 0xac, 0xca, 0xf6, 0x73, 0x43, + 0xa1, 0x3d, 0x7c, 0xb8, 0xb9, 0xbe, 0xa0, 0xda, 0x71, 0x10, 0xd8, 0x05, + 0x58, 0xf4, 0x24, 0x07, 0x99, 0xa9, 0x4e, 0xd0, 0x78, 0x0e, 0xc0, 0x43, + 0xf4, 0xb9, 0x75, 0x97, 0x14, 0x16, 0x60, 0xe1, 0xca, 0x12, 0xa6, 0x98, + 0xbb, 0xbf, 0xe3, 0xa9, 0x27, 0xf4, 0xb7, 0x3b, 0xe4, 0x3e, 0xa3, 0xdd, + 0x00, 0xce, 0xa7, 0x09, 0xa7, 0xe6, 0xc7, 0x99, 0x09, 0x85, 0xf5, 0xc2, + 0xcc, 0x84, 0xc2, 0xcc, 0xe8, 0x83, 0x1e, 0x2f, 0xb1, 0x88, 0x0a, 0x3b, + 0xa1, 0x77, 0x65, 0xb0, 0x9d, 0x57, 0x3b, 0xf5, 0x5c, 0x99, 0x8e, 0xa3, + 0x27, 0xf5, 0x1a, 0xd4, 0xbb, 0x12, 0x7a, 0x0b, 0xa1, 0xf4, 0x81, 0xff, + 0x26, 0x0b, 0xdc, 0x2f, 0xe0, 0xa1, 0x86, 0x92, 0xc2, 0x7a, 0x2f, 0xee, + 0xca, 0x5e, 0x2e, 0xbc, 0x70, 0x0b, 0xb3, 0xbb, 0x55, 0x92, 0xd3, 0xff, + 0x08, 0xd0, 0xcb, 0x3f, 0x16, 0x0a, 0x7c, 0x6e, 0x4b, 0x73, 0x79, 0x3d, + 0xfd, 0xf3, 0x6e, 0xf8, 0x6f, 0xbb, 0x81, 0x1f, 0xea, 0xf9, 0xc7, 0x90, + 0x5f, 0xe1, 0x73, 0x00, 0x1f, 0xa2, 0x77, 0x0b, 0x14, 0x7a, 0x83, 0xf9, + 0x2f, 0xaf, 0x4c, 0xfe, 0x24, 0x1f, 0x50, 0x28, 0x04, 0x75, 0xba, 0xfc, + 0x36, 0x58, 0xfb, 0x3d, 0xb8, 0x50, 0xc2, 0xf9, 0x97, 0xf7, 0x00, 0x30, + 0xe3, 0x35, 0x24, 0x70, 0xee, 0xf7, 0x66, 0xb8, 0xfd, 0xcf, 0x54, 0x98, + 0x37, 0x42, 0x69, 0xd3, 0xa4, 0xa4, 0xe7, 0xb9, 0x3d, 0x48, 0xac, 0x98, + 0xd5, 0x57, 0x86, 0x06, 0x09, 0xb5, 0xd5, 0xf2, 0x8c, 0x8a, 0xef, 0xba, + 0x01, 0x9c, 0xab, 0xae, 0xee, 0x7d, 0xd2, 0xad, 0xf8, 0xe3, 0x4a, 0xff, + 0xc3, 0x0b, 0xa0, 0xa0, 0x95, 0xd5, 0xd0, 0x98, 0xb4, 0x9d, 0xea, 0x12, + 0xe9, 0x8f, 0x5b, 0x03, 0x50, 0x0a, 0x46, 0xe7, 0xf3, 0xde, 0x8d, 0xd2, + 0x23, 0x31, 0x89, 0x1a, 0x5f, 0x68, 0xa0, 0x61, 0x2a, 0x69, 0x62, 0x7d, + 0x65, 0x3b, 0x52, 0xbf, 0xf3, 0x9c, 0xf8, 0x9b, 0x35, 0x64, 0xcf, 0x1d, + 0x26, 0xf7, 0x15, 0x09, 0x95, 0x1a, 0xfc, 0xf9, 0x26, 0xf8, 0xf2, 0x3a, + 0xa8, 0x4b, 0xd2, 0xdf, 0xde, 0xae, 0xc7, 0xd3, 0x26, 0x1d, 0xf5, 0x90, + 0xfd, 0xf7, 0xa7, 0x91, 0xb0, 0x9d, 0x0e, 0xa6, 0x3a, 0x94, 0x6d, 0x08, + 0x4a, 0x42, 0xc1, 0xa9, 0xfc, 0xac, 0x09, 0xc6, 0x75, 0x96, 0xa1, 0x9e, + 0x75, 0x08, 0xa1, 0xf8, 0xda, 0x91, 0x3e, 0x4e, 0xf3, 0xfb, 0x4d, 0x35, + 0xae, 0xc8, 0x0b, 0x35, 0x10, 0xc8, 0x24, 0x05, 0xf9, 0xaa, 0xf4, 0xcb, + 0x9d, 0x9b, 0x95, 0xfe, 0xdd, 0xd1, 0xbb, 0x03, 0x17, 0xab, 0x2e, 0xdb, + 0xcd, 0x34, 0x7b, 0x92, 0x82, 0x62, 0x68, 0x1c, 0x52, 0x34, 0x14, 0x98, + 0xca, 0x36, 0x04, 0xc5, 0xba, 0x0c, 0xca, 0x25, 0x25, 0x35, 0x60, 0x26, + 0x29, 0x1a, 0xcb, 0x6f, 0x48, 0x6a, 0x55, 0x49, 0x5e, 0x08, 0x1f, 0x39, + 0x59, 0x7c, 0xe8, 0x6e, 0x52, 0x7a, 0x1e, 0x6e, 0xe4, 0xa2, 0x11, 0xc6, + 0xee, 0x1b, 0x23, 0x85, 0x4e, 0xef, 0xb1, 0x3c, 0x5b, 0x23, 0x1f, 0x48, + 0x91, 0x52, 0x92, 0x43, 0x52, 0xab, 0xab, 0x79, 0xd0, 0x5a, 0x1d, 0x8a, + 0x86, 0xd7, 0x77, 0x02, 0x50, 0xfd, 0xa9, 0x22, 0x82, 0xa2, 0x01, 0xa5, + 0x2a, 0x24, 0x34, 0xbc, 0xa7, 0x52, 0x47, 0xfd, 0x8e, 0x0d, 0x15, 0xd6, + 0xae, 0x2b, 0x30, 0x58, 0x09, 0xc9, 0x14, 0x0d, 0x18, 0x4c, 0x1c, 0x20, + 0x2b, 0x12, 0xe4, 0xeb, 0x00, 0xc1, 0x33, 0xbf, 0x58, 0x4f, 0x61, 0x6a, + 0xe0, 0x56, 0xd6, 0x04, 0xb7, 0x24, 0x31, 0xd3, 0xfa, 0xb7, 0xe7, 0x87, + 0x91, 0x0d, 0xe7, 0xa9, 0xd3, 0x9f, 0xc4, 0x93, 0x08, 0x5e, 0x79, 0x62, + 0x92, 0xe3, 0x18, 0xe0, 0x74, 0x24, 0x4f, 0x22, 0x9a, 0xb6, 0x19, 0xd9, + 0xdf, 0xd2, 0xfd, 0xf5, 0xda, 0xa6, 0x0f, 0x1d, 0xe2, 0xe7, 0xfb, 0x03, + 0xa0, 0x96, 0x95, 0x54, 0x20, 0x2d, 0x2b, 0xa9, 0xca, 0x68, 0x25, 0xe1, + 0xdc, 0xa1, 0x2c, 0xce, 0xa1, 0x32, 0x25, 0x96, 0x74, 0x9c, 0x2e, 0x28, + 0x90, 0xd5, 0x98, 0x98, 0x62, 0xe4, 0x75, 0xac, 0x43, 0xaf, 0x1c, 0x80, + 0xa3, 0x88, 0xff, 0xf5, 0xfb, 0x9e, 0xe5, 0xa6, 0xaf, 0x6f, 0x06, 0xe0, + 0xbe, 0x8d, 0x1b, 0xfd, 0x73, 0xe1, 0x41, 0xb2, 0xa2, 0xf2, 0xdc, 0xff, + 0xfb, 0xce, 0x9d, 0x7c, 0xf8, 0xf8, 0xe3, 0x1b, 0xe0, 0x5a, 0x9e, 0xdf, + 0xd2, 0x93, 0x3a, 0x1f, 0x89, 0x0d, 0x9f, 0x3b, 0x48, 0xb1, 0x10, 0xf4, + 0xb5, 0xdc, 0xc8, 0xfd, 0xaf, 0x56, 0x87, 0x52, 0xd9, 0xc5, 0x0e, 0xbd, + 0x54, 0x11, 0x06, 0xec, 0x2a, 0x4c, 0xb0, 0xa2, 0x77, 0x90, 0x8a, 0xa3, + 0xc6, 0x1e, 0x00, 0x95, 0x62, 0x85, 0xc1, 0xb3, 0x86, 0x11, 0x46, 0x8d, + 0x5d, 0xe5, 0x09, 0x3f, 0x7c, 0xc5, 0x91, 0xd8, 0xdd, 0x3d, 0x14, 0x1f, + 0x9b, 0x81, 0x33, 0xe0, 0xca, 0xbf, 0xb8, 0x12, 0xbb, 0x6f, 0x80, 0xec, + 0x59, 0xfd, 0xe4, 0x67, 0x8a, 0x98, 0xcb, 0x40, 0x98, 0x40, 0x55, 0x6f, + 0xcb, 0x35, 0x6c, 0x3b, 0x43, 0x7e, 0x7f, 0x9e, 0xec, 0xd9, 0x19, 0x12, + 0x86, 0xba, 0x32, 0xb2, 0x99, 0x41, 0x72, 0xf9, 0x09, 0x4c, 0x7d, 0x8b, + 0x74, 0x5d, 0x48, 0x2c, 0x0f, 0x60, 0x5a, 0x89, 0xae, 0x04, 0xe3, 0x0f, + 0xed, 0xc1, 0x4e, 0x99, 0x14, 0x2b, 0xae, 0xa2, 0xc9, 0x01, 0x8e, 0xe3, + 0x70, 0xe9, 0xf9, 0x97, 0x52, 0x2b, 0xd7, 0x98, 0x70, 0x73, 0x48, 0x57, + 0x82, 0x01, 0x83, 0x7d, 0x6a, 0xbe, 0x62, 0xf4, 0xc1, 0x5d, 0x48, 0x57, + 0x32, 0xd8, 0x97, 0x6d, 0x80, 0x73, 0x85, 0x21, 0x5d, 0xe1, 0x1b, 0x9b, + 0x07, 0xd4, 0xaa, 0x55, 0xc1, 0xfb, 0x78, 0x40, 0xb6, 0xcf, 0x66, 0xcd, + 0x15, 0xeb, 0x18, 0xfa, 0xc0, 0x00, 0x9b, 0xbf, 0x11, 0x7c, 0xe0, 0xa2, + 0xe2, 0x4a, 0x12, 0x49, 0xb0, 0xbb, 0xd4, 0x5d, 0xad, 0x58, 0x2e, 0x92, + 0xe9, 0x1b, 0x20, 0xd1, 0x63, 0x53, 0x93, 0xde, 0xda, 0x0c, 0x3d, 0x3f, + 0x55, 0x55, 0xfd, 0x4c, 0x51, 0x0f, 0x65, 0x29, 0x21, 0x91, 0xc4, 0x07, + 0x6f, 0x99, 0xc9, 0x1e, 0xe5, 0xd5, 0x95, 0x60, 0xa0, 0xcb, 0x66, 0xac, + 0x90, 0x9f, 0x7b, 0x8e, 0x2d, 0x0c, 0x74, 0xf2, 0x00, 0x5b, 0x1e, 0xf0, + 0xa9, 0x4f, 0x43, 0xa0, 0x42, 0xfb, 0x56, 0x08, 0x24, 0xe5, 0x81, 0xa3, + 0x7c, 0xb0, 0x54, 0x5f, 0xb0, 0x1f, 0x86, 0x47, 0x59, 0x17, 0xa9, 0xba, + 0x79, 0x6e, 0x56, 0x9f, 0xc5, 0xa7, 0xff, 0xf2, 0xbb, 0x7c, 0x64, 0xe5, + 0xc9, 0x00, 0x9c, 0x72, 0xf2, 0x12, 0x9e, 0xfe, 0xe5, 0x21, 0x9e, 0xfe, + 0xe5, 0x21, 0xae, 0xb8, 0x5c, 0x7d, 0xb4, 0xe2, 0x8e, 0xbb, 0x66, 0xf9, + 0x55, 0xf5, 0x14, 0xfe, 0xe0, 0xf7, 0x5f, 0xf2, 0x41, 0x5b, 0x97, 0xf1, + 0x5e, 0xee, 0x38, 0xfe, 0x71, 0xbf, 0xcc, 0x0d, 0x65, 0x21, 0x52, 0x06, + 0x9d, 0xa7, 0xfa, 0xa0, 0x48, 0x00, 0xbc, 0xb2, 0xfa, 0x2c, 0xde, 0xf1, + 0x6f, 0x26, 0x97, 0x7d, 0xec, 0x72, 0x2e, 0xf8, 0xc8, 0xe9, 0xba, 0xe2, + 0x17, 0x71, 0x0d, 0x9f, 0xe6, 0x81, 0x1d, 0x4f, 0xb2, 0xe9, 0x17, 0x5f, + 0x6a, 0x02, 0x62, 0xf9, 0xfb, 0xe1, 0xb4, 0xa2, 0xdb, 0x08, 0xcc, 0xcb, + 0x6b, 0x9f, 0x68, 0x5a, 0xe1, 0x72, 0xf9, 0x6d, 0x14, 0x91, 0xe7, 0x5e, + 0xb0, 0x72, 0x2c, 0x79, 0x2a, 0x00, 0x6b, 0x01, 0x64, 0xdf, 0xfb, 0x7f, + 0x72, 0x60, 0x7f, 0x00, 0x12, 0x5c, 0x7c, 0x42, 0x30, 0x26, 0x72, 0x62, + 0xa8, 0x56, 0xac, 0x58, 0xb1, 0x62, 0xc5, 0x8a, 0x15, 0x2b, 0x56, 0xac, + 0x58, 0xb1, 0x62, 0xc5, 0x8a, 0x15, 0x2b, 0x56, 0xac, 0x58, 0xb1, 0x62, + 0xc5, 0x8a, 0x15, 0x2b, 0x56, 0xac, 0x58, 0xb1, 0x62, 0x1d, 0x95, 0x62, + 0xa8, 0x56, 0xac, 0x58, 0xb1, 0x62, 0xc5, 0x8a, 0xf5, 0x16, 0x90, 0xac, + 0x4b, 0x05, 0x91, 0x0a, 0x2f, 0x4a, 0xae, 0x37, 0xef, 0xa7, 0xd3, 0xe9, + 0x06, 0xd0, 0x0a, 0xa8, 0x85, 0xde, 0xd6, 0x32, 0xcb, 0x07, 0xb3, 0x44, + 0xd3, 0x05, 0x05, 0xd4, 0xca, 0x17, 0xf2, 0xea, 0x8b, 0x98, 0xd5, 0x4a, + 0x03, 0xa8, 0x4b, 0x18, 0x02, 0xbb, 0xc7, 0x26, 0xaf, 0x17, 0x4d, 0x7a, + 0x30, 0x2b, 0x80, 0x52, 0xa9, 0xd4, 0x00, 0xa5, 0x12, 0x86, 0x50, 0xd0, + 0x97, 0x36, 0x80, 0x2f, 0xe8, 0x7c, 0xc1, 0x79, 0x18, 0xc0, 0x25, 0x0c, + 0x41, 0x66, 0x79, 0x86, 0xdc, 0xde, 0x9c, 0x5f, 0x06, 0xd3, 0x34, 0x55, + 0xbe, 0x52, 0x92, 0x4e, 0xa7, 0x91, 0x52, 0xfa, 0x65, 0xa8, 0x94, 0x2b, + 0x2d, 0xcb, 0xe0, 0xc1, 0xbe, 0xc2, 0x60, 0xaf, 0x56, 0x75, 0xf0, 0xda, + 0xc6, 0x2b, 0x83, 0x07, 0xcf, 0xf2, 0xcb, 0x16, 0x5e, 0x44, 0x0f, 0x38, + 0x6e, 0x7b, 0x58, 0x8f, 0xd7, 0x5e, 0xb2, 0x2e, 0xd5, 0x39, 0x98, 0x67, + 0xb1, 0x7e, 0xba, 0xc7, 0xa2, 0x58, 0x76, 0x82, 0xaf, 0x73, 0x97, 0x2b, + 0x20, 0x84, 0xbf, 0x24, 0xda, 0x4e, 0x0a, 0x8a, 0x9e, 0x11, 0x80, 0x07, + 0xd4, 0x6a, 0xd9, 0x80, 0xca, 0x46, 0x1d, 0x5a, 0x2f, 0x86, 0x76, 0x85, + 0x84, 0x2e, 0x13, 0xaa, 0x2e, 0x35, 0x20, 0x91, 0xd4, 0x79, 0x2c, 0x0b, + 0xa5, 0x36, 0xed, 0x2a, 0x68, 0x14, 0x28, 0xb0, 0x16, 0xc1, 0x17, 0x95, + 0x3d, 0x49, 0x5d, 0x80, 0x86, 0x32, 0x48, 0x30, 0x7b, 0x94, 0x01, 0x96, + 0x33, 0xa3, 0xda, 0xc6, 0x34, 0xb4, 0xe1, 0x9e, 0x67, 0x44, 0x1b, 0x29, + 0xb4, 0x33, 0x5b, 0xc4, 0x29, 0x4d, 0x41, 0x3d, 0xd1, 0x00, 0xb6, 0x72, + 0x66, 0x03, 0xc3, 0x24, 0x2b, 0x19, 0x44, 0x0a, 0x1b, 0xe8, 0x4a, 0xfd, + 0x45, 0xe5, 0x68, 0xd3, 0xce, 0x67, 0x17, 0x01, 0x50, 0xd1, 0xbf, 0x83, + 0xa8, 0x21, 0xdf, 0xd4, 0xbe, 0x31, 0xac, 0x74, 0x3f, 0xc2, 0xb4, 0xc1, + 0x72, 0x54, 0x62, 0x06, 0x58, 0xe7, 0x2a, 0xff, 0x35, 0x07, 0x2f, 0xc5, + 0xbd, 0xa3, 0x02, 0x65, 0xd4, 0x7a, 0xf5, 0x37, 0x11, 0xa8, 0x35, 0x97, + 0x5a, 0x81, 0x9f, 0xe6, 0x83, 0x60, 0xb9, 0xd5, 0x62, 0x47, 0x61, 0x5e, + 0x5b, 0x79, 0x16, 0x16, 0xaf, 0x38, 0x9b, 0xf3, 0x21, 0x58, 0x9d, 0xc4, + 0xef, 0x14, 0xf0, 0xe5, 0x56, 0x8b, 0xf3, 0x1b, 0xca, 0x44, 0x54, 0x2a, + 0x05, 0x0b, 0xc5, 0x65, 0xb5, 0x32, 0x47, 0xc8, 0x0e, 0xd2, 0xd2, 0xd0, + 0x3d, 0x3b, 0x9d, 0x26, 0x5f, 0x2c, 0x62, 0x99, 0x16, 0x69, 0x4b, 0x2d, + 0x86, 0x2d, 0x39, 0x2e, 0xb9, 0xc7, 0x72, 0x98, 0xa6, 0x45, 0x8d, 0xe6, + 0x45, 0xe9, 0xa0, 0x8c, 0x80, 0x4a, 0x6e, 0x85, 0x74, 0x8f, 0x8d, 0xeb, + 0x4a, 0xa4, 0x04, 0xa1, 0x21, 0x83, 0x15, 0xfd, 0xa5, 0xe1, 0x30, 0x64, + 0xb0, 0x41, 0x75, 0x89, 0xd9, 0xa5, 0xc2, 0xde, 0xf0, 0xb5, 0x9b, 0x00, + 0xc1, 0x9a, 0x0f, 0x8f, 0x70, 0xe5, 0xa7, 0xaf, 0x60, 0xcd, 0x15, 0x57, + 0xa9, 0x34, 0xaa, 0x15, 0x1f, 0xac, 0xb5, 0x27, 0xb7, 0x87, 0x54, 0x32, + 0x45, 0x45, 0xd7, 0x79, 0xf8, 0xbc, 0x61, 0x72, 0xb9, 0x1c, 0x12, 0xa8, + 0xc9, 0xc6, 0x76, 0xe8, 0x49, 0xa7, 0x71, 0xeb, 0x12, 0x53, 0xdf, 0x0b, + 0x5d, 0x0f, 0x80, 0xa8, 0x41, 0x7a, 0xde, 0x3e, 0xc0, 0x8c, 0xbe, 0xff, + 0x9a, 0x5d, 0x66, 0x43, 0xf8, 0xe8, 0x7e, 0xc9, 0xf5, 0xa0, 0x04, 0xca, + 0x40, 0x68, 0xdb, 0x9d, 0x77, 0x03, 0x82, 0x91, 0x8b, 0x15, 0x18, 0x66, + 0xfb, 0xf7, 0xd5, 0xd7, 0x89, 0x2b, 0xb2, 0x42, 0x4a, 0xa4, 0xa0, 0x4b, + 0xed, 0x57, 0x0e, 0xea, 0x63, 0x82, 0x7b, 0x74, 0xda, 0x34, 0x5b, 0x96, + 0xcf, 0xff, 0xf2, 0xb5, 0x94, 0x7e, 0x5d, 0x8b, 0x33, 0x45, 0x2a, 0xd5, + 0x8a, 0x86, 0x8a, 0x4d, 0x62, 0x75, 0x05, 0x50, 0x03, 0x67, 0xbe, 0xaf, + 0x39, 0x87, 0x14, 0x06, 0x32, 0x79, 0x28, 0xa8, 0x65, 0x04, 0xb0, 0xa6, + 0x30, 0x00, 0x2b, 0xba, 0x0d, 0x10, 0x50, 0x4a, 0x3b, 0x43, 0x61, 0x55, + 0x7c, 0x75, 0xbc, 0x92, 0x95, 0x7e, 0xa8, 0x30, 0x2c, 0xea, 0xf4, 0xfd, + 0xf7, 0x72, 0x71, 0x6f, 0x2f, 0xf7, 0x16, 0x0a, 0x0b, 0xde, 0x7e, 0xb3, + 0x8d, 0xfb, 0xbd, 0xf7, 0xde, 0x0b, 0x9f, 0xfd, 0x6c, 0x43, 0x1d, 0x77, + 0x86, 0x30, 0x5b, 0x1e, 0x90, 0x2a, 0x0c, 0xbe, 0xf2, 0x80, 0x5c, 0xeb, + 0x59, 0xc9, 0x4e, 0x76, 0x6a, 0x10, 0x57, 0x2f, 0x85, 0x0e, 0xea, 0xe4, + 0xb5, 0x81, 0xd7, 0x12, 0x1e, 0x74, 0x6b, 0x67, 0x28, 0xbf, 0x00, 0x06, + 0xd6, 0xeb, 0x83, 0xbb, 0x9a, 0x41, 0x64, 0x81, 0x85, 0x63, 0x21, 0xd4, + 0xaa, 0xd1, 0xf3, 0x13, 0x94, 0xbb, 0xd0, 0xe0, 0x0e, 0x70, 0x06, 0x9d, + 0xe9, 0x92, 0x5d, 0xf0, 0xa3, 0x15, 0xc0, 0x7f, 0x3e, 0x0e, 0xc0, 0xa5, + 0x22, 0xc1, 0xf0, 0x7d, 0xf8, 0x5f, 0x0c, 0x6f, 0x07, 0x85, 0x8a, 0xfa, + 0xbd, 0x5e, 0x00, 0xab, 0x4d, 0xf5, 0xc0, 0xed, 0x80, 0xde, 0x3f, 0x75, + 0x8e, 0xfd, 0xb0, 0xc2, 0x71, 0xbd, 0xe3, 0x56, 0xfb, 0xd1, 0x38, 0x0b, + 0x09, 0x3f, 0x55, 0x0f, 0xc0, 0x5a, 0x1b, 0xea, 0x41, 0x1b, 0x4c, 0xd6, + 0x03, 0x98, 0x56, 0x74, 0x1f, 0x1a, 0x41, 0x5b, 0x00, 0xeb, 0xb4, 0xfb, + 0x56, 0xa3, 0x79, 0x5f, 0x02, 0xdb, 0x3a, 0x9c, 0xcd, 0x5a, 0x53, 0x57, + 0x06, 0x76, 0x73, 0xc9, 0xd5, 0xf8, 0x8d, 0x9b, 0xff, 0xeb, 0xf5, 0xb0, + 0xfd, 0x7a, 0xe5, 0xa8, 0xfb, 0xa4, 0xf4, 0x6a, 0x00, 0xc9, 0x3e, 0x15, + 0xc6, 0xdd, 0x37, 0x1e, 0x8d, 0xde, 0x56, 0x51, 0xc8, 0x94, 0xf9, 0xfe, + 0x4b, 0x71, 0x7f, 0x7a, 0x37, 0xd4, 0x87, 0x11, 0xe2, 0x16, 0xc6, 0x1f, + 0x5e, 0x8a, 0x13, 0xe9, 0xa0, 0x8c, 0x3f, 0xac, 0xc3, 0x7e, 0x54, 0xe2, + 0xb6, 0x33, 0x89, 0xf9, 0x54, 0x29, 0x04, 0xd6, 0x1a, 0x87, 0x87, 0x26, + 0xe1, 0xd7, 0x93, 0xe0, 0x5a, 0x40, 0x0d, 0xde, 0x31, 0x00, 0x3f, 0x1e, + 0x80, 0x73, 0x6f, 0x57, 0x90, 0x2a, 0x4f, 0xbd, 0x36, 0x5c, 0x3c, 0x02, + 0xf5, 0x9b, 0xf0, 0x61, 0x91, 0x9f, 0xa1, 0x2d, 0x58, 0x2b, 0x0a, 0xc8, + 0xba, 0xf9, 0x4b, 0xed, 0x41, 0x01, 0xad, 0xc2, 0x2f, 0x58, 0x6f, 0xeb, + 0x57, 0xdb, 0x17, 0xa6, 0xa0, 0x50, 0x84, 0x87, 0xb7, 0x35, 0xc2, 0xb6, + 0xc2, 0xba, 0x78, 0x04, 0x18, 0x83, 0x87, 0x17, 0x0e, 0xd4, 0x8c, 0x4a, + 0x58, 0x29, 0xa8, 0x4f, 0xa0, 0xda, 0x44, 0x3d, 0xa3, 0x52, 0xe9, 0xc6, + 0xfe, 0xb5, 0x65, 0x2a, 0xe8, 0x84, 0x7b, 0x50, 0x3d, 0x27, 0x3d, 0x88, + 0x56, 0x54, 0x25, 0xc7, 0x61, 0xcb, 0x3f, 0xdd, 0x05, 0x86, 0x60, 0xfd, + 0xba, 0x0f, 0xcd, 0x9f, 0xb7, 0xf0, 0x9e, 0x89, 0xed, 0xe1, 0x9d, 0x42, + 0xb8, 0xf3, 0xfa, 0xcf, 0x95, 0x46, 0x34, 0x7e, 0x18, 0xac, 0xd5, 0x0a, + 0xa8, 0x05, 0x40, 0xef, 0xaa, 0x66, 0xb7, 0xc2, 0x28, 0x43, 0xe6, 0x8a, + 0xb6, 0xe5, 0xf0, 0x71, 0xbf, 0x42, 0x40, 0x55, 0x2a, 0x23, 0xe6, 0xae, + 0x60, 0xdc, 0x45, 0x14, 0x86, 0x29, 0x25, 0xc2, 0xd4, 0xcf, 0x62, 0x59, + 0x6b, 0x1e, 0x43, 0x2e, 0x1b, 0x69, 0x9d, 0xd1, 0xec, 0x18, 0x03, 0xe6, + 0x20, 0xb8, 0x13, 0xad, 0xfd, 0xfd, 0xf2, 0xcc, 0x0f, 0x6e, 0xf2, 0xcc, + 0xd6, 0x5a, 0x85, 0xf5, 0x8e, 0xdb, 0x8d, 0x6c, 0xa7, 0xee, 0xbf, 0x9f, + 0x67, 0x80, 0x4c, 0x26, 0xc3, 0xd3, 0x4f, 0x3f, 0xcd, 0x73, 0x11, 0xa0, + 0x6a, 0x54, 0xfb, 0x81, 0xd3, 0x50, 0x40, 0x2d, 0xf4, 0xf6, 0x01, 0xe0, + 0x82, 0xb6, 0x31, 0x1a, 0xf3, 0x7f, 0x3d, 0xeb, 0xf2, 0x5c, 0x3e, 0xcf, + 0x21, 0xbd, 0xbf, 0x14, 0xb8, 0x5f, 0x83, 0xc0, 0x96, 0x46, 0xe2, 0x78, + 0xe1, 0xcd, 0x13, 0xe0, 0xd9, 0x63, 0xde, 0xc6, 0xb2, 0x9e, 0x65, 0x00, + 0x0c, 0x0e, 0x0e, 0x62, 0x9e, 0x64, 0xe2, 0x3e, 0xaf, 0x7e, 0x7b, 0x4f, + 0x4c, 0xcc, 0x7d, 0x2e, 0x8e, 0xb6, 0x2e, 0xb5, 0xb9, 0x83, 0x33, 0xb2, + 0x2f, 0xc5, 0xf8, 0x9d, 0x77, 0xb3, 0xf9, 0x5f, 0x94, 0x61, 0xde, 0x2d, + 0x69, 0x75, 0x63, 0xbd, 0x0a, 0x07, 0x48, 0xf8, 0x7d, 0xcc, 0x1b, 0xbe, + 0xf2, 0x31, 0xf5, 0x26, 0x44, 0xdf, 0x3e, 0x33, 0x19, 0x75, 0x5d, 0x24, + 0x96, 0x98, 0x10, 0xb2, 0x55, 0x95, 0x2f, 0xe3, 0x8f, 0xd5, 0x53, 0xba, + 0xcf, 0xb9, 0x27, 0x97, 0x67, 0x28, 0xab, 0x81, 0x56, 0x32, 0x98, 0x3b, + 0xd8, 0x93, 0xcb, 0x63, 0x2f, 0xb1, 0x1b, 0xdc, 0xfc, 0x7a, 0x88, 0xc6, + 0x6b, 0xb2, 0x22, 0x4b, 0x70, 0x08, 0x44, 0x2a, 0xe8, 0x83, 0x8e, 0x7f, + 0x77, 0x17, 0x56, 0x57, 0x08, 0x68, 0x5b, 0x17, 0x14, 0xf7, 0x5f, 0xcb, + 0xb6, 0x6f, 0x2b, 0x43, 0x4a, 0x97, 0xc6, 0xf0, 0x5e, 0x98, 0x75, 0x9f, + 0x5a, 0xc3, 0x9a, 0xbf, 0xd8, 0x88, 0xdd, 0x6d, 0x63, 0xa5, 0x4d, 0x9c, + 0x52, 0x90, 0xbf, 0x7b, 0xa8, 0x42, 0xba, 0x3b, 0x85, 0xac, 0x54, 0x18, + 0x3a, 0x4f, 0x19, 0x88, 0x16, 0x35, 0xb4, 0x20, 0x0a, 0xbc, 0x6a, 0xa5, + 0x3d, 0x8f, 0x4c, 0x30, 0x74, 0xf6, 0x20, 0x4e, 0x49, 0x81, 0xb9, 0xac, + 0x2e, 0xa8, 0xe8, 0xe4, 0x2b, 0x2e, 0x14, 0x0f, 0xe6, 0x43, 0x90, 0xb0, + 0x04, 0x54, 0x6a, 0x08, 0x0b, 0x55, 0xb7, 0x44, 0x82, 0xf1, 0x89, 0x09, + 0xbf, 0xad, 0xa2, 0xca, 0x64, 0x6c, 0xae, 0xf8, 0xc4, 0x6a, 0xbe, 0xf8, + 0xd7, 0x37, 0xf8, 0x40, 0x2d, 0x6f, 0xdc, 0x2f, 0x5b, 0xdb, 0x0b, 0x37, + 0xe8, 0x1a, 0x80, 0x97, 0x8f, 0xf0, 0xaf, 0xc0, 0x0e, 0xe0, 0x15, 0x82, + 0x69, 0x15, 0x4f, 0x0e, 0x0a, 0xae, 0x75, 0xb7, 0x3e, 0x7e, 0x01, 0x85, + 0x0a, 0xb1, 0xee, 0x3a, 0xe2, 0x23, 0x43, 0xfa, 0xd7, 0x1e, 0xcb, 0x03, + 0xb7, 0xbf, 0x0a, 0x28, 0xf0, 0x13, 0x28, 0x48, 0xc7, 0x13, 0x91, 0xb4, + 0x5e, 0xd1, 0xf1, 0xff, 0x15, 0xb8, 0xe2, 0xe5, 0x00, 0x26, 0x75, 0xeb, + 0xf1, 0xc7, 0xf0, 0xc4, 0xcb, 0x47, 0xde, 0x2a, 0x53, 0x04, 0xbf, 0x15, + 0x2d, 0x47, 0x01, 0xcb, 0x5a, 0x21, 0x66, 0xd3, 0xa8, 0x36, 0x3b, 0x1a, + 0x09, 0xe0, 0xe4, 0x45, 0x90, 0x03, 0x4e, 0x06, 0x1f, 0x2e, 0x35, 0x3d, + 0x05, 0x01, 0xca, 0xec, 0x70, 0x43, 0x9c, 0x5f, 0xa0, 0xa1, 0x57, 0x21, + 0xa0, 0x56, 0x5f, 0xff, 0x22, 0xfa, 0x28, 0x37, 0xb8, 0x45, 0xe5, 0xa5, + 0xed, 0xed, 0x03, 0xfc, 0x78, 0xea, 0x30, 0xef, 0x22, 0x0c, 0xc9, 0xd2, + 0xfe, 0xfa, 0xe8, 0xac, 0x17, 0x8b, 0xf4, 0xf5, 0x2f, 0xe2, 0xc7, 0x53, + 0x87, 0x41, 0xc7, 0xf1, 0xc2, 0x46, 0xd3, 0x8a, 0x1e, 0x4f, 0x6b, 0x98, + 0xdb, 0xfb, 0x92, 0xf0, 0xb3, 0x17, 0x61, 0x69, 0x1d, 0x38, 0x5e, 0xd5, + 0xd7, 0x0b, 0x1f, 0x2d, 0xef, 0xb8, 0x54, 0xf0, 0x79, 0xca, 0x92, 0x5a, + 0x17, 0x4c, 0x94, 0x21, 0xa3, 0x2f, 0x67, 0x1b, 0x05, 0x64, 0x50, 0xb0, + 0x84, 0xc6, 0xa7, 0x96, 0x00, 0xc6, 0x51, 0x78, 0xbe, 0x5a, 0xa8, 0x3f, + 0x9c, 0x41, 0x92, 0xd7, 0xd0, 0x0f, 0x8d, 0xba, 0xe4, 0x9c, 0x73, 0x94, + 0xdf, 0xc9, 0x53, 0x92, 0x5f, 0x1e, 0xf6, 0x60, 0x5a, 0x41, 0x4a, 0x39, + 0x20, 0xeb, 0x1d, 0xd6, 0xf1, 0x91, 0xe6, 0xfe, 0xb9, 0x01, 0x58, 0xe4, + 0xb5, 0x45, 0xe7, 0x90, 0xb1, 0x85, 0xe8, 0xea, 0xaf, 0x3d, 0x40, 0xe9, + 0x9e, 0xb5, 0x47, 0x9d, 0x8e, 0x19, 0x6a, 0x8b, 0x5b, 0xbf, 0xf0, 0x87, + 0xed, 0x03, 0x02, 0x97, 0xfe, 0xc5, 0x10, 0x5b, 0xae, 0x55, 0xfd, 0xff, + 0xb5, 0xdf, 0x1c, 0x60, 0xf0, 0xbc, 0x14, 0xab, 0xf8, 0x11, 0x00, 0x76, + 0x77, 0x82, 0x4d, 0x9f, 0xef, 0xe7, 0xfa, 0x7f, 0x98, 0x62, 0xcb, 0x37, + 0xee, 0x66, 0xfd, 0x67, 0xdb, 0xf7, 0x95, 0xc7, 0xf3, 0x30, 0xfa, 0x50, + 0x89, 0x5b, 0xbe, 0xf0, 0x00, 0xdc, 0x77, 0x09, 0x9b, 0x3e, 0xdf, 0xcf, + 0xf6, 0x6f, 0x4f, 0x36, 0xb6, 0xb3, 0x9e, 0xfb, 0xf2, 0xd2, 0x5c, 0xa8, + 0x36, 0x7d, 0xa6, 0x9f, 0xed, 0xdf, 0x51, 0x63, 0x16, 0x3b, 0x29, 0x19, + 0xba, 0xda, 0xf2, 0xc1, 0x67, 0x00, 0x93, 0xb9, 0x0a, 0xc5, 0x3b, 0x54, + 0x7e, 0xb9, 0xc7, 0x1c, 0x05, 0xd8, 0x92, 0xb0, 0xf1, 0xce, 0xb5, 0x88, + 0x65, 0x02, 0x39, 0x2b, 0x11, 0xcb, 0x1a, 0x9f, 0x13, 0x6b, 0x32, 0xdb, + 0x99, 0xd8, 0x7b, 0x29, 0xa9, 0x8b, 0x1b, 0x7f, 0x5b, 0xd7, 0x7f, 0xf5, + 0x7a, 0x7f, 0xff, 0xd2, 0x0f, 0x5b, 0x8c, 0xdf, 0xb3, 0x30, 0xa8, 0x96, + 0x29, 0xd2, 0x54, 0xca, 0xcd, 0xf3, 0x9b, 0x61, 0x30, 0x91, 0x29, 0x4c, + 0xc0, 0xc6, 0x95, 0x79, 0x4c, 0x31, 0x82, 0x2b, 0xc7, 0x50, 0x40, 0xad, + 0x4d, 0xca, 0xdf, 0xb0, 0x42, 0x61, 0x6d, 0x7f, 0xee, 0xac, 0x21, 0x1f, + 0x23, 0x0d, 0x02, 0x5c, 0x59, 0xc4, 0x34, 0xd2, 0xb8, 0x75, 0x2f, 0x4f, + 0xaf, 0x9e, 0x41, 0x1c, 0x21, 0xe6, 0x07, 0xfb, 0x7a, 0xbd, 0x66, 0x47, + 0x82, 0x69, 0x68, 0xa0, 0x16, 0x26, 0x2e, 0x7a, 0xeb, 0x81, 0xb4, 0x0c, + 0x93, 0x84, 0x01, 0xb5, 0xba, 0x89, 0xb3, 0x00, 0xa8, 0xcd, 0xb5, 0x77, + 0x9c, 0x8a, 0x30, 0xd2, 0xc8, 0xfa, 0x16, 0x56, 0x2f, 0x87, 0xeb, 0x2e, + 0x7b, 0x80, 0x6b, 0xef, 0x98, 0x04, 0x14, 0x5c, 0x2b, 0x63, 0x8e, 0x91, + 0x77, 0xaf, 0xe3, 0xba, 0xcb, 0xfa, 0xb9, 0xf6, 0x8e, 0x29, 0x84, 0x01, + 0x66, 0x72, 0x04, 0x7b, 0x59, 0x96, 0xe2, 0x6c, 0x0e, 0x7b, 0x59, 0x96, + 0x4a, 0xc9, 0xf1, 0x81, 0x5a, 0x41, 0x7d, 0xc3, 0xf2, 0xfa, 0x6d, 0xf3, + 0x03, 0xb2, 0x4c, 0xc3, 0xf4, 0xdb, 0xd5, 0x14, 0x69, 0x5c, 0xd9, 0x2a, + 0xbd, 0xd6, 0x9a, 0x69, 0xe1, 0xd6, 0x13, 0xf1, 0xef, 0x89, 0x84, 0x9b, + 0x69, 0x11, 0xae, 0x55, 0xfc, 0xbf, 0xbb, 0x5c, 0x6d, 0xd7, 0xb6, 0x29, + 0x4e, 0x2f, 0x1a, 0x32, 0xa5, 0x27, 0x88, 0xe6, 0x84, 0x6b, 0x69, 0xf2, + 0xbc, 0x07, 0xab, 0xef, 0xed, 0x8d, 0xc4, 0x0d, 0xa7, 0xa1, 0xf7, 0xff, + 0x5f, 0xf6, 0xde, 0x3f, 0x4e, 0x8e, 0xaa, 0xce, 0xfb, 0x7d, 0x83, 0x0d, + 0x39, 0xed, 0x76, 0xa0, 0x5a, 0x3b, 0xcf, 0x56, 0x99, 0x89, 0x4e, 0xc3, + 0x44, 0xd2, 0x41, 0x64, 0x3a, 0xa2, 0x32, 0x11, 0x56, 0x12, 0xc4, 0x27, + 0x0c, 0xea, 0xd5, 0x00, 0xae, 0x80, 0xdc, 0xdd, 0x05, 0x5d, 0x5f, 0x6b, + 0xa2, 0xab, 0x06, 0xbc, 0xaf, 0x95, 0xb0, 0xbb, 0xcf, 0x02, 0xbb, 0xaf, + 0x7b, 0x21, 0xab, 0x8b, 0x13, 0xbd, 0xfe, 0x08, 0xeb, 0x5e, 0x96, 0xc0, + 0x8a, 0x04, 0x1f, 0xd1, 0x21, 0xcf, 0x02, 0x09, 0x1a, 0x9c, 0x01, 0xc5, + 0xe9, 0x28, 0x30, 0x3d, 0xc8, 0x40, 0xb5, 0x66, 0xa0, 0xca, 0x27, 0xad, + 0x5d, 0x30, 0xbd, 0xf6, 0x21, 0xb4, 0x72, 0xff, 0x38, 0xa7, 0x7e, 0x76, + 0xf7, 0xcc, 0xe4, 0x07, 0xca, 0xb3, 0x4f, 0x7d, 0x5e, 0x84, 0x3a, 0x75, + 0x7e, 0x7c, 0xcf, 0x8f, 0xa9, 0xae, 0x3a, 0x75, 0xea, 0x9c, 0xf7, 0x19, + 0x18, 0x50, 0xc0, 0xaa, 0xff, 0xf7, 0x7e, 0x60, 0x9d, 0x02, 0x52, 0x75, + 0xd5, 0x4e, 0x05, 0xdd, 0x62, 0x9d, 0x82, 0x59, 0x8d, 0x00, 0x1b, 0x37, + 0xae, 0x23, 0x4e, 0xd4, 0x8a, 0x1f, 0xa7, 0xa7, 0x95, 0xfd, 0x7b, 0x07, + 0x50, 0x09, 0x12, 0x65, 0xf5, 0xcb, 0xd0, 0x91, 0xde, 0x77, 0x26, 0xca, + 0xe9, 0xa7, 0x19, 0xb8, 0x56, 0xd5, 0xf3, 0x5e, 0x01, 0xe8, 0xf2, 0x9e, + 0x01, 0x5c, 0x7b, 0x3a, 0x6c, 0xd6, 0x63, 0x10, 0x47, 0x14, 0xa8, 0x95, + 0x80, 0x64, 0xb9, 0x75, 0x2f, 0x18, 0xc3, 0xe5, 0x51, 0x1b, 0xe1, 0x87, + 0xeb, 0xf1, 0xdc, 0xe8, 0x78, 0xb7, 0xff, 0x5e, 0x18, 0x7c, 0xdf, 0xcb, + 0x80, 0xeb, 0x79, 0x01, 0x8c, 0x8b, 0x76, 0x0b, 0x32, 0x59, 0x84, 0xfe, + 0x26, 0x25, 0xfb, 0xb3, 0x61, 0x18, 0xe1, 0xf8, 0xb9, 0x6c, 0x4a, 0xa4, + 0x06, 0x76, 0x8b, 0x9c, 0x40, 0xec, 0xad, 0x76, 0xff, 0x6e, 0x29, 0x25, + 0xee, 0xc3, 0x15, 0x84, 0x94, 0x18, 0x67, 0x0d, 0x51, 0xf3, 0x3c, 0x8c, + 0xa9, 0x2e, 0xdf, 0x19, 0xda, 0x6a, 0x1c, 0x30, 0xee, 0x1b, 0x42, 0xb4, + 0x3a, 0x5e, 0x72, 0x24, 0x90, 0x6b, 0x41, 0x3b, 0x4b, 0xa3, 0xe9, 0x41, + 0x1b, 0xb2, 0x08, 0xa4, 0x06, 0xc3, 0x54, 0xee, 0xdf, 0x45, 0x79, 0x70, + 0x88, 0xea, 0xf8, 0x38, 0xde, 0x5f, 0x6d, 0xe0, 0xe2, 0x33, 0xd7, 0x32, + 0xe6, 0x3a, 0xac, 0xfa, 0xf2, 0x10, 0x63, 0x7f, 0x7e, 0x45, 0xcc, 0x4c, + 0x6f, 0xf9, 0xdf, 0x57, 0xbb, 0xdc, 0x83, 0x8f, 0x20, 0x50, 0x0b, 0xf4, + 0xb8, 0x5a, 0x53, 0x52, 0x12, 0x82, 0x5a, 0x46, 0xc1, 0xa9, 0x04, 0xea, + 0x35, 0x3f, 0x68, 0x2a, 0x01, 0x15, 0x37, 0x3c, 0x97, 0x12, 0xca, 0x26, + 0xc8, 0xa6, 0xc0, 0x16, 0x89, 0x3e, 0x8a, 0xd0, 0x69, 0x75, 0xba, 0x6a, + 0x53, 0x06, 0x7e, 0xbe, 0x2d, 0x5b, 0x76, 0x7e, 0x67, 0xdc, 0xe5, 0x49, + 0x6c, 0x29, 0xf1, 0xa2, 0x7f, 0x1f, 0x29, 0xb1, 0x81, 0x55, 0x86, 0x20, + 0x8f, 0x80, 0x8c, 0x64, 0xa2, 0xae, 0x21, 0x5b, 0x1a, 0x78, 0xe5, 0xea, + 0xe8, 0xd9, 0x9c, 0x08, 0xc0, 0x60, 0xd9, 0x0c, 0x04, 0x20, 0x1b, 0x47, + 0x06, 0x60, 0xde, 0xca, 0x97, 0xb7, 0x60, 0x16, 0x4b, 0x14, 0x0b, 0x12, + 0xc3, 0x13, 0x54, 0x75, 0x9c, 0x52, 0x0e, 0x2a, 0x1e, 0x40, 0x56, 0x97, + 0x55, 0x92, 0x15, 0x30, 0x29, 0x09, 0x81, 0x6f, 0x10, 0x80, 0xe2, 0xec, + 0x20, 0x0f, 0x82, 0xf4, 0x55, 0x0d, 0xd7, 0x2a, 0x19, 0x30, 0xa1, 0xff, + 0x6c, 0xfe, 0x97, 0xaf, 0x95, 0xed, 0xf0, 0xbc, 0x88, 0xa0, 0x91, 0x01, + 0x49, 0x56, 0x3d, 0x47, 0x04, 0xd0, 0xce, 0x06, 0xf9, 0x88, 0x0c, 0x78, + 0x12, 0xfd, 0xbd, 0x5e, 0xc1, 0xbb, 0xd0, 0x6d, 0x2f, 0x81, 0xd5, 0x05, + 0x68, 0x78, 0xaa, 0xd2, 0x76, 0x5b, 0x92, 0x45, 0xbd, 0x57, 0x2f, 0xe4, + 0xeb, 0xd9, 0xeb, 0x91, 0x20, 0x57, 0x06, 0x6d, 0xf3, 0xfa, 0xdf, 0xc3, + 0xf1, 0x0f, 0x96, 0x14, 0x00, 0x78, 0xa0, 0x12, 0x82, 0x65, 0xa2, 0x3a, + 0x71, 0xf9, 0x32, 0x9c, 0xfd, 0x75, 0xac, 0x25, 0x05, 0x8e, 0x3b, 0x48, + 0xfb, 0x00, 0xc3, 0x72, 0x65, 0xe0, 0xe7, 0x03, 0xb6, 0x0e, 0xa5, 0xac, + 0xd3, 0x62, 0x82, 0xd7, 0xcb, 0x95, 0x47, 0xa4, 0xce, 0x5f, 0xfa, 0xd4, + 0x97, 0x00, 0x78, 0xd7, 0x39, 0x67, 0xb3, 0xf4, 0xdc, 0x73, 0x79, 0xfa, + 0xee, 0xbb, 0x59, 0x19, 0xa9, 0xf3, 0xe4, 0x7d, 0xf7, 0x71, 0xd7, 0x0b, + 0x2f, 0xf0, 0xee, 0x63, 0x42, 0x1a, 0xf8, 0xca, 0xb3, 0x55, 0x5c, 0x20, + 0x48, 0x73, 0xd7, 0x4e, 0xf5, 0xcd, 0x64, 0xb1, 0xf5, 0x1a, 0x70, 0x7b, + 0xbf, 0x03, 0x01, 0x14, 0xfb, 0x2d, 0x3c, 0x2f, 0x32, 0x1e, 0x91, 0x13, + 0x88, 0xa6, 0xc4, 0x10, 0x82, 0x7c, 0xc1, 0x04, 0x6c, 0x44, 0x4e, 0xb0, + 0x72, 0x45, 0x89, 0x6c, 0xcd, 0xc6, 0x88, 0x8c, 0x4d, 0x74, 0x03, 0x6c, + 0xe7, 0x2d, 0x41, 0xc3, 0xd6, 0x23, 0x38, 0xb9, 0x2c, 0x0d, 0x47, 0xb2, + 0xfe, 0xdd, 0x6b, 0xd8, 0x71, 0xd7, 0x6e, 0x86, 0xcf, 0x1d, 0xc6, 0x73, + 0x1d, 0xaa, 0x8f, 0x54, 0xb0, 0x1f, 0x81, 0x52, 0x51, 0xf7, 0x43, 0x72, + 0x50, 0x7a, 0x83, 0xee, 0x83, 0xd5, 0x5b, 0x01, 0xd0, 0x2a, 0x5b, 0xc8, + 0xe2, 0x36, 0x6a, 0xd8, 0x35, 0x9b, 0xfe, 0x62, 0x89, 0xf5, 0xef, 0xbb, + 0x18, 0x50, 0x1b, 0x7b, 0x95, 0x4b, 0x43, 0x34, 0x6a, 0x0d, 0xaa, 0x9e, + 0x03, 0xed, 0xf0, 0xfe, 0xe7, 0xa7, 0x83, 0xf0, 0xbb, 0x8d, 0xb5, 0xc4, + 0x40, 0x34, 0x25, 0x4e, 0x04, 0xe4, 0xef, 0xec, 0xf7, 0x58, 0x7f, 0xe6, + 0x1a, 0x76, 0xec, 0xd9, 0x0d, 0x2b, 0x14, 0x88, 0x6b, 0xfd, 0x99, 0x6b, + 0x18, 0x9f, 0xaa, 0x04, 0x76, 0xf2, 0xa6, 0x02, 0xaf, 0xe6, 0x4d, 0x0b, + 0x67, 0x5a, 0xc3, 0x57, 0xdb, 0x0e, 0xf9, 0x9a, 0x45, 0x6b, 0x00, 0x10, + 0xd9, 0x00, 0x72, 0x85, 0xc8, 0x92, 0xcd, 0x01, 0x22, 0x4f, 0x79, 0x30, + 0xcb, 0xfa, 0xda, 0x16, 0xac, 0xbf, 0x9f, 0xe4, 0xda, 0x7f, 0xdc, 0x1a, + 0xc4, 0x69, 0x35, 0xa1, 0xd8, 0x57, 0xc4, 0x9e, 0x51, 0x1b, 0x20, 0x65, + 0x85, 0x50, 0x40, 0x2d, 0x80, 0x8c, 0x82, 0x6e, 0xf9, 0xf1, 0x02, 0x45, + 0x06, 0xe6, 0x5a, 0x4d, 0xd5, 0xbe, 0x72, 0x9f, 0xc4, 0x6b, 0xd6, 0x30, + 0x07, 0xc2, 0x31, 0x97, 0x56, 0xa3, 0x75, 0x70, 0x9b, 0x12, 0xec, 0x0b, + 0x7f, 0x0b, 0x01, 0x50, 0x2b, 0xe2, 0x0e, 0x8e, 0xfb, 0x22, 0xc7, 0x65, + 0x22, 0x04, 0x6b, 0x45, 0xd3, 0xf9, 0xa0, 0xa9, 0xa9, 0x48, 0x3f, 0x7c, + 0x9f, 0xc4, 0xc1, 0x61, 0x00, 0x83, 0x9f, 0x3c, 0x79, 0x2c, 0xaf, 0xce, + 0x3d, 0x0d, 0x10, 0xc0, 0xb4, 0x6a, 0xfb, 0x5f, 0x0d, 0xc0, 0xd0, 0xdb, + 0x5f, 0xcd, 0xf8, 0x77, 0xe1, 0x57, 0xff, 0x01, 0x4b, 0xff, 0x50, 0xbd, + 0xfb, 0x3c, 0xfd, 0x8b, 0xfd, 0x31, 0x78, 0x95, 0x83, 0x82, 0x59, 0x39, + 0xfb, 0xec, 0x8e, 0x7c, 0x82, 0x32, 0xf8, 0xd0, 0xaa, 0x68, 0x3a, 0x0b, + 0x6e, 0xfd, 0x06, 0x3c, 0xf3, 0x8b, 0x35, 0xbc, 0xe6, 0x0f, 0x5f, 0xc7, + 0xb2, 0x15, 0x06, 0xfb, 0xa6, 0x3c, 0x36, 0x7f, 0xff, 0x2f, 0x63, 0x4d, + 0xe1, 0xd7, 0x31, 0x50, 0x17, 0x5b, 0xb1, 0xf8, 0x91, 0x7a, 0x07, 0x69, + 0x35, 0x58, 0xcc, 0x6f, 0xa7, 0xa0, 0x7d, 0x97, 0x89, 0x18, 0x74, 0x2c, + 0x69, 0xcb, 0x8f, 0xb7, 0xff, 0x75, 0x5e, 0x2c, 0xde, 0x53, 0xff, 0x5f, + 0xf7, 0xfb, 0x5e, 0xaa, 0x54, 0xa9, 0x52, 0xa5, 0x4a, 0x95, 0x2a, 0x55, + 0xaa, 0x54, 0xa9, 0x52, 0xa5, 0x4a, 0x95, 0x2a, 0x55, 0xaa, 0x54, 0xa9, + 0x52, 0xa5, 0x4a, 0x95, 0x2a, 0x55, 0xaa, 0x54, 0xa9, 0x52, 0xa5, 0x3a, + 0x7c, 0xa5, 0x50, 0xad, 0x54, 0xa9, 0x52, 0xa5, 0x4a, 0x95, 0xea, 0x65, + 0x22, 0xaf, 0xe9, 0xc5, 0x20, 0x4f, 0x51, 0xe8, 0x94, 0x0f, 0x80, 0xf2, + 0xa1, 0x51, 0xbe, 0xfc, 0x38, 0xce, 0x4c, 0x08, 0x5d, 0x31, 0x0c, 0x23, + 0x36, 0x79, 0x1c, 0xc0, 0x71, 0x1d, 0x4a, 0x03, 0x25, 0x1c, 0xd7, 0xc1, + 0xab, 0x87, 0xb6, 0xfd, 0x09, 0x79, 0x8e, 0xeb, 0x04, 0x90, 0x2d, 0xcb, + 0xb4, 0x70, 0x5c, 0x27, 0x06, 0xa5, 0x8a, 0xc6, 0xf5, 0xcb, 0x06, 0xc4, + 0xca, 0x17, 0x85, 0x4b, 0xf9, 0x65, 0x3b, 0x18, 0x55, 0xf6, 0x56, 0x28, + 0x0f, 0x96, 0xa9, 0x3e, 0x5a, 0x0d, 0xf2, 0xf5, 0xf3, 0x80, 0x10, 0x3c, + 0x56, 0x1c, 0x28, 0x62, 0xeb, 0x49, 0x8c, 0x51, 0x00, 0x58, 0x32, 0xdf, + 0x24, 0x58, 0x2b, 0x5a, 0x07, 0xd3, 0x34, 0x03, 0xff, 0x28, 0xd4, 0xab, + 0xfa, 0x68, 0x15, 0xd9, 0xd6, 0x8b, 0xc0, 0x23, 0xe5, 0xb7, 0x0c, 0x0b, + 0x77, 0xc6, 0xc5, 0x30, 0xd4, 0xc2, 0x4f, 0xb3, 0xcf, 0x24, 0x9f, 0xcb, + 0x63, 0xd7, 0xec, 0x20, 0x8f, 0xfe, 0xbe, 0x7e, 0x6a, 0x33, 0x35, 0x98, + 0x67, 0xd7, 0x76, 0xbb, 0xee, 0x30, 0xd7, 0xf4, 0x65, 0x3b, 0xb2, 0xab, + 0x76, 0x6c, 0x9e, 0xbf, 0x3f, 0x41, 0x5d, 0x12, 0xd2, 0xb4, 0x22, 0xf3, + 0xca, 0x55, 0x5c, 0x35, 0xc3, 0x5a, 0x36, 0x25, 0xa2, 0x0d, 0x42, 0x7a, + 0x78, 0x02, 0xb2, 0x39, 0x03, 0x66, 0x3c, 0xb2, 0x7d, 0x6a, 0xfb, 0xd6, + 0x56, 0xcd, 0x53, 0x70, 0xad, 0xba, 0x54, 0x93, 0x5f, 0xdb, 0x91, 0xc9, + 0xef, 0x19, 0x19, 0x4e, 0x2f, 0x6e, 0x8b, 0xb0, 0xb7, 0xa8, 0x17, 0xe0, + 0xfa, 0xc0, 0x2d, 0xcf, 0x6d, 0x60, 0x98, 0xf1, 0x05, 0xbe, 0x7e, 0x7a, + 0xda, 0x02, 0xd9, 0x0e, 0xff, 0x16, 0x9e, 0x94, 0x90, 0xd1, 0x93, 0x56, + 0x33, 0x2d, 0x9c, 0x19, 0x1b, 0xab, 0xaf, 0x18, 0x07, 0x6a, 0xe9, 0x73, + 0x2b, 0xa7, 0xa0, 0x5e, 0xc1, 0xe2, 0xda, 0x76, 0xbc, 0xae, 0xbd, 0x64, + 0x19, 0x02, 0xc7, 0x93, 0x78, 0x6e, 0x23, 0x06, 0x05, 0xb3, 0x72, 0x02, + 0x0c, 0x2b, 0x9e, 0xa7, 0x2e, 0x8b, 0xe3, 0xaa, 0x89, 0x9a, 0xc5, 0x65, + 0xe1, 0x42, 0xac, 0xe2, 0x39, 0x02, 0xfb, 0x1e, 0x49, 0xbe, 0xde, 0x02, + 0x0f, 0x1a, 0xb6, 0x44, 0xce, 0x48, 0xd5, 0xfe, 0x47, 0xb0, 0xe7, 0x6c, + 0xe4, 0xd4, 0x75, 0xd2, 0x0d, 0x92, 0x95, 0xea, 0x7f, 0x4d, 0xb5, 0x64, + 0x0b, 0xc7, 0x73, 0x11, 0x39, 0x03, 0xa7, 0xae, 0x96, 0x3f, 0x98, 0x96, + 0x81, 0x69, 0x19, 0x31, 0x30, 0xdf, 0x35, 0x7f, 0x7d, 0x0d, 0x57, 0xff, + 0xdd, 0xd5, 0x00, 0x18, 0x3e, 0xc0, 0xcf, 0xc8, 0x23, 0xbd, 0x86, 0x86, + 0x23, 0xc6, 0x2f, 0xf6, 0x55, 0x83, 0xab, 0x28, 0xf6, 0xab, 0x89, 0xe5, + 0x52, 0x4a, 0x2a, 0x95, 0xf8, 0xce, 0xe8, 0xe5, 0x72, 0x19, 0x3b, 0x39, + 0xf9, 0x17, 0x3a, 0x56, 0x98, 0xfb, 0x10, 0x2d, 0x1f, 0x32, 0xe5, 0xd5, + 0x3d, 0x4c, 0xd3, 0xa0, 0x52, 0xa9, 0x04, 0x30, 0xad, 0xac, 0xc8, 0x07, + 0x6e, 0xd9, 0x0e, 0x21, 0x55, 0x5e, 0x64, 0x31, 0x94, 0x0f, 0xc6, 0x12, + 0x39, 0x11, 0x83, 0x6b, 0x45, 0xe5, 0xf9, 0xf7, 0xd1, 0x9c, 0xe8, 0x0e, + 0xbd, 0xea, 0x02, 0x08, 0x93, 0xc0, 0x9a, 0x35, 0x43, 0x01, 0x54, 0xcb, + 0xab, 0x7b, 0xe4, 0xfb, 0xc2, 0x7b, 0x8c, 0xeb, 0x7a, 0x60, 0xc6, 0x17, + 0x5a, 0x25, 0xf3, 0xf6, 0xf3, 0xf4, 0xf3, 0x00, 0x82, 0x05, 0xfb, 0x5e, + 0xdd, 0xc3, 0xab, 0x7b, 0xec, 0xfa, 0xe1, 0x18, 0x7e, 0x1b, 0x3b, 0xf5, + 0x06, 0x56, 0x21, 0xcf, 0x57, 0xbf, 0xfc, 0x55, 0x3e, 0xf4, 0xe7, 0x1f, + 0xea, 0x6c, 0xc3, 0x1e, 0x8a, 0xae, 0x79, 0x1b, 0x20, 0x5c, 0xfc, 0x92, + 0xf4, 0x9f, 0x4e, 0xa4, 0x49, 0xae, 0x7d, 0xeb, 0xe5, 0x3f, 0xc2, 0xce, + 0x00, 0x2a, 0x35, 0xd0, 0x35, 0x15, 0x21, 0x10, 0x4b, 0x2f, 0x9c, 0xb8, + 0x7b, 0x7a, 0xfa, 0xd0, 0xc2, 0x7b, 0x94, 0x37, 0x5e, 0xc6, 0xe9, 0x00, + 0xb3, 0x35, 0x10, 0x29, 0xef, 0x88, 0x06, 0x5b, 0x4d, 0x13, 0x42, 0xc5, + 0xe6, 0xab, 0xd3, 0xba, 0x08, 0xa0, 0xcb, 0xff, 0xff, 0xce, 0x48, 0x7c, + 0xdf, 0xad, 0x8e, 0xd3, 0x31, 0xf7, 0x3a, 0x06, 0x18, 0x61, 0x9a, 0x75, + 0x89, 0x3c, 0xd6, 0x69, 0x28, 0x57, 0xb2, 0xfc, 0xf3, 0xd5, 0x6b, 0xa1, + 0x92, 0x9b, 0x4e, 0xe6, 0xbc, 0x2d, 0x8f, 0x21, 0x37, 0x9d, 0x0c, 0xc0, + 0xd8, 0xe4, 0x53, 0xc8, 0xbf, 0xec, 0x86, 0x10, 0xf8, 0xdd, 0xeb, 0xa6, + 0x05, 0xb8, 0x7f, 0xd7, 0xda, 0xd6, 0xc3, 0xff, 0x96, 0x05, 0xb8, 0x7f, + 0x6f, 0x8a, 0x5e, 0x24, 0x97, 0xa8, 0x45, 0xda, 0x5c, 0x79, 0x3e, 0x0c, + 0x96, 0x61, 0xaa, 0xaa, 0xc0, 0x5a, 0xef, 0x68, 0xc0, 0xbd, 0x07, 0x07, + 0x92, 0x4c, 0x42, 0xa6, 0xbc, 0x87, 0xef, 0x88, 0x9d, 0x1b, 0x7f, 0xa5, + 0xe0, 0x04, 0x1b, 0x3e, 0x19, 0x82, 0x57, 0x26, 0x76, 0x7b, 0x6c, 0x06, + 0xce, 0xdf, 0x1b, 0x89, 0xf8, 0xe1, 0x2e, 0x7d, 0x85, 0xa4, 0xdf, 0xdf, + 0xac, 0x8a, 0x9f, 0xdf, 0x35, 0x01, 0x77, 0xad, 0x54, 0xc0, 0xac, 0xef, + 0xad, 0x86, 0xba, 0xbe, 0x5f, 0x0e, 0x8c, 0x82, 0x2c, 0x02, 0x11, 0x88, + 0xe2, 0xc7, 0x16, 0x52, 0x9b, 0xdf, 0xa1, 0x5e, 0xb9, 0xb2, 0xfb, 0xf9, + 0xaf, 0x35, 0x5c, 0xe0, 0xce, 0x1d, 0x21, 0x20, 0xec, 0xc1, 0x5e, 0x57, + 0xdc, 0xdc, 0xda, 0xf0, 0x2f, 0x51, 0x60, 0x93, 0xc1, 0x96, 0xf7, 0x6f, + 0x27, 0xd9, 0xab, 0x15, 0xdb, 0xc2, 0x38, 0x62, 0xb1, 0xc0, 0x7b, 0x7f, + 0x08, 0xf6, 0xb2, 0x6d, 0x9b, 0xac, 0x10, 0xdc, 0xf0, 0x0f, 0xea, 0xd9, + 0x51, 0x73, 0x0f, 0x0e, 0x24, 0x00, 0x21, 0x0c, 0x2b, 0xe9, 0x9e, 0x2f, + 0xee, 0xc1, 0xc4, 0xf1, 0x61, 0x5a, 0x42, 0x78, 0x48, 0x60, 0xcc, 0xd3, + 0xd7, 0x64, 0x2f, 0x73, 0xd3, 0x3b, 0x7a, 0x04, 0x28, 0x8d, 0x79, 0xbb, + 0xe7, 0x2d, 0x47, 0xd4, 0x86, 0x9c, 0xe9, 0x0c, 0x9e, 0x88, 0xc2, 0xb0, + 0xba, 0x95, 0x63, 0x66, 0x7e, 0x38, 0xdb, 0x84, 0x37, 0xce, 0xea, 0xf9, + 0x4b, 0xf2, 0x92, 0xea, 0x97, 0xc7, 0xbe, 0x92, 0x25, 0xc7, 0xff, 0x01, + 0x4b, 0x97, 0x2e, 0x05, 0xe0, 0xa9, 0x27, 0x7f, 0xc6, 0xab, 0x0f, 0xfc, + 0xba, 0x67, 0xfc, 0x26, 0x0a, 0x0e, 0x13, 0xd5, 0xab, 0xba, 0xf8, 0x1d, + 0x8c, 0x0e, 0x68, 0xbb, 0xaf, 0x9a, 0x2f, 0x62, 0x17, 0xbd, 0xa6, 0x87, + 0xbb, 0x9b, 0xbc, 0x03, 0x50, 0x1a, 0x52, 0x0b, 0xf6, 0x8c, 0xe3, 0x74, + 0xbf, 0xea, 0x39, 0x8f, 0xbd, 0xe3, 0x3f, 0x60, 0x70, 0xe8, 0x2d, 0x87, + 0x90, 0x7b, 0xaa, 0xc3, 0xd5, 0xb5, 0xff, 0x3c, 0x37, 0xc4, 0xed, 0x3f, + 0xab, 0xbe, 0x0c, 0x3c, 0x0f, 0xec, 0x05, 0xde, 0x01, 0xb4, 0xfe, 0xf8, + 0x28, 0x7e, 0xb4, 0xed, 0xc5, 0x60, 0x01, 0xfc, 0x58, 0x24, 0xee, 0xa9, + 0x11, 0xb7, 0xff, 0x26, 0xf6, 0x2c, 0x70, 0xdc, 0x05, 0x47, 0x31, 0xa9, + 0x81, 0x5a, 0xa7, 0xa2, 0xb0, 0x4c, 0x4f, 0x01, 0x6f, 0xd3, 0xe1, 0x13, + 0xb9, 0xa3, 0xa0, 0xa9, 0x00, 0x5a, 0x7f, 0x72, 0xf9, 0xd1, 0x0c, 0x6d, + 0xfb, 0x2d, 0xa3, 0xa8, 0xc7, 0xe9, 0x22, 0x6d, 0xe7, 0x97, 0x2f, 0xbc, + 0xc8, 0xf7, 0x74, 0xfc, 0xff, 0x1d, 0xf5, 0x76, 0x7d, 0x3c, 0x1e, 0xd5, + 0x06, 0xc7, 0x47, 0xc2, 0x9e, 0x05, 0xbe, 0x75, 0x04, 0xf2, 0x18, 0x5c, + 0x2c, 0x79, 0x70, 0x16, 0x4e, 0x5f, 0x9c, 0x08, 0x58, 0x09, 0x1c, 0x24, + 0x6b, 0xe8, 0xb6, 0x27, 0x0b, 0x0c, 0x46, 0x00, 0x5c, 0xbd, 0x60, 0x4f, + 0x53, 0x11, 0xbb, 0xaf, 0xd5, 0xf1, 0x7c, 0xf7, 0x8a, 0x44, 0xd7, 0x64, + 0xef, 0xa2, 0x22, 0x7b, 0x9f, 0xb4, 0x0f, 0xe9, 0xfe, 0xeb, 0xeb, 0x47, + 0x47, 0xa9, 0xe3, 0x33, 0x11, 0xb6, 0x65, 0x2f, 0xf8, 0x97, 0x1e, 0xe9, + 0x23, 0x6b, 0x28, 0x20, 0xc2, 0x10, 0xb0, 0x23, 0x57, 0x84, 0x1c, 0x58, + 0x75, 0x3b, 0x88, 0x13, 0x3d, 0x96, 0x05, 0x8c, 0xfa, 0x27, 0x6d, 0x62, + 0x5f, 0x82, 0xab, 0x91, 0x31, 0x07, 0x85, 0xc7, 0xd7, 0xe7, 0x0f, 0x85, + 0xd7, 0x75, 0x11, 0x89, 0x03, 0x58, 0x08, 0xec, 0xc5, 0x50, 0x9c, 0x8d, + 0xdb, 0x8f, 0x82, 0xa9, 0x92, 0xe5, 0x5e, 0x41, 0xd8, 0x7e, 0x0b, 0x91, + 0xc8, 0x25, 0x00, 0x9f, 0x89, 0xb1, 0x37, 0xbf, 0xb4, 0x37, 0x7d, 0xfa, + 0x6c, 0x86, 0xcf, 0x4c, 0x22, 0xf3, 0xe7, 0x97, 0xd1, 0x63, 0x2c, 0x2f, + 0xff, 0xbe, 0x6f, 0xc0, 0xee, 0xb9, 0xa1, 0x5a, 0x9b, 0x3f, 0xa9, 0xfe, + 0xf8, 0xee, 0x4c, 0x8b, 0x8f, 0xf6, 0xed, 0x02, 0x1b, 0xac, 0x21, 0x41, + 0x65, 0xbc, 0x41, 0xf5, 0xc1, 0x8d, 0x8c, 0x8e, 0x57, 0x21, 0x57, 0xa2, + 0x7a, 0xd7, 0x15, 0xe0, 0x03, 0xe4, 0x9b, 0x76, 0x00, 0xc6, 0xf2, 0xea, + 0x2e, 0x9b, 0x2e, 0x1c, 0xa2, 0x24, 0x5c, 0xa0, 0x44, 0xf5, 0xae, 0x8d, + 0x5c, 0xfb, 0x57, 0x2b, 0xd9, 0xf6, 0xf9, 0x09, 0x6c, 0x4a, 0x80, 0x8d, + 0x57, 0x77, 0x81, 0x22, 0x5e, 0xdd, 0xe5, 0xaa, 0x8b, 0x86, 0xb8, 0xe5, + 0x2b, 0x13, 0x90, 0x53, 0xcf, 0xdd, 0x0d, 0x43, 0xb0, 0x75, 0x3c, 0xb4, + 0xd9, 0x78, 0xb4, 0xc5, 0x75, 0xb7, 0x8e, 0xb3, 0xe9, 0xc2, 0x21, 0xb6, + 0xdc, 0x3e, 0xce, 0xda, 0x37, 0x13, 0xe4, 0xe1, 0x03, 0xb5, 0x00, 0x6e, + 0xf9, 0xf7, 0x09, 0xb6, 0xee, 0x3d, 0x1b, 0xa1, 0x17, 0xe8, 0xcb, 0x26, + 0xac, 0x2a, 0xe7, 0x59, 0x15, 0x90, 0xd1, 0xb2, 0x4c, 0x54, 0x1a, 0x54, + 0x9e, 0xd0, 0x63, 0x34, 0x33, 0x92, 0xa1, 0x73, 0x0d, 0x2e, 0x59, 0xf1, + 0x55, 0xb6, 0x4d, 0x7d, 0x08, 0xe7, 0x4e, 0x81, 0x2b, 0x5c, 0x6e, 0x8a, + 0xe0, 0x3f, 0x87, 0x56, 0xa8, 0xb8, 0x76, 0x5d, 0xb2, 0xfe, 0x8c, 0x3c, + 0x3b, 0x1e, 0xa8, 0xe2, 0x01, 0xbb, 0xee, 0x5a, 0xd8, 0x33, 0xc9, 0x10, + 0x6b, 0xf0, 0xa4, 0xea, 0x4b, 0x7a, 0xd2, 0xa5, 0xd4, 0x5f, 0xc2, 0x95, + 0x63, 0x9d, 0x74, 0x44, 0x2d, 0x4f, 0x7a, 0x18, 0xc2, 0xc0, 0x93, 0x68, + 0xa0, 0xd6, 0x57, 0x75, 0xc8, 0xb5, 0xc0, 0x66, 0xbc, 0xb6, 0x43, 0xb1, + 0x50, 0xc6, 0x6b, 0x7b, 0x78, 0xd2, 0xa6, 0xd8, 0x3f, 0x4c, 0xad, 0x99, + 0x78, 0xff, 0xf2, 0xe1, 0x52, 0x8c, 0x05, 0x6e, 0x72, 0xeb, 0xf1, 0x22, + 0xf1, 0xf2, 0xa6, 0x85, 0x37, 0x53, 0x44, 0x4a, 0x9b, 0xfc, 0x40, 0x59, + 0xb9, 0x9b, 0x55, 0x8c, 0xdc, 0x30, 0x5e, 0x73, 0x34, 0x38, 0x76, 0x55, + 0xdb, 0x08, 0xae, 0xd7, 0x6c, 0x46, 0xfd, 0x73, 0xa4, 0x81, 0xd3, 0x06, + 0x32, 0x0a, 0xb4, 0x35, 0x77, 0x9b, 0x24, 0x7b, 0xb4, 0xdf, 0x00, 0x36, + 0x62, 0xe4, 0x6e, 0x82, 0xf6, 0x65, 0x5c, 0x7d, 0xab, 0xdf, 0xfe, 0xd7, + 0x23, 0x32, 0x1b, 0x11, 0xa6, 0xc5, 0x35, 0xe7, 0xae, 0x02, 0x24, 0xe5, + 0x15, 0x15, 0xec, 0x99, 0xa2, 0xaa, 0x53, 0xd2, 0xae, 0x06, 0x6a, 0xa9, + 0xba, 0x43, 0xbf, 0x71, 0x19, 0x35, 0xef, 0x26, 0x92, 0x94, 0x1d, 0xbf, + 0xee, 0x5e, 0xb3, 0x7b, 0x8f, 0xd4, 0x6b, 0x7b, 0x14, 0xcd, 0x12, 0xb5, + 0xe6, 0x28, 0x9e, 0xb4, 0x34, 0x58, 0x6b, 0xce, 0x2a, 0x01, 0x71, 0x58, + 0x96, 0xef, 0x3e, 0x0b, 0xb8, 0x9f, 0x4e, 0xb0, 0x56, 0x37, 0xd5, 0x08, + 0xa1, 0x5b, 0xfe, 0xb9, 0x9f, 0xfe, 0x2c, 0xe0, 0x6b, 0xf7, 0x2b, 0xff, + 0x0f, 0xae, 0x08, 0xd3, 0xf8, 0xe0, 0x2c, 0x1f, 0x8c, 0x15, 0x8c, 0x49, + 0x4d, 0x47, 0x40, 0x59, 0xeb, 0xe2, 0x71, 0x93, 0x1a, 0xd0, 0xe3, 0x02, + 0x51, 0x70, 0x95, 0xef, 0x97, 0xa0, 0xe5, 0x77, 0x02, 0xbb, 0x76, 0x02, + 0x11, 0xfb, 0xa0, 0xcb, 0xa3, 0xc3, 0xdf, 0xfb, 0x5e, 0xe5, 0x37, 0x32, + 0x32, 0x02, 0x03, 0xd0, 0x77, 0x56, 0x08, 0xea, 0x8a, 0xe5, 0x97, 0xb4, + 0x3b, 0xc7, 0xa0, 0xd6, 0x40, 0xc4, 0xbf, 0x03, 0xb6, 0xd5, 0x43, 0x3e, + 0x78, 0xcb, 0x2f, 0xdf, 0xfd, 0xf7, 0xc3, 0xe6, 0x19, 0x0d, 0xf3, 0xfa, + 0x1c, 0x4c, 0x7f, 0x22, 0x6c, 0x9b, 0xd3, 0x6f, 0x83, 0xff, 0xbe, 0x30, + 0xb3, 0xf3, 0x4a, 0x4c, 0xdb, 0xea, 0xd5, 0x4f, 0xc3, 0x86, 0x92, 0x8a, + 0xc2, 0x59, 0xa2, 0xdf, 0xf4, 0x94, 0x5b, 0x41, 0xb4, 0xa4, 0x94, 0x01, + 0x50, 0x2b, 0x2a, 0x63, 0xc6, 0x41, 0xb6, 0xd5, 0xbd, 0xde, 0xeb, 0x8b, + 0x3c, 0x23, 0xa2, 0x90, 0x23, 0x40, 0xae, 0x28, 0xc2, 0xde, 0x1e, 0xf7, + 0x2b, 0xff, 0x1b, 0xe2, 0x83, 0x15, 0x8c, 0x36, 0x78, 0x1a, 0xf0, 0x62, + 0x4c, 0xd9, 0xc1, 0x77, 0x2a, 0xe1, 0x6f, 0x28, 0xd3, 0x43, 0x3e, 0xf7, + 0x28, 0xe6, 0x6a, 0x82, 0xd0, 0x60, 0x2d, 0x24, 0xb4, 0x84, 0x04, 0xcf, + 0xc1, 0x30, 0x4c, 0xc4, 0xff, 0xf9, 0x21, 0x2a, 0x7f, 0xb5, 0x09, 0xf4, + 0xe6, 0x13, 0xbb, 0xd6, 0x5f, 0x82, 0xfb, 0x67, 0xeb, 0x91, 0xff, 0x3c, + 0x1a, 0xb1, 0x08, 0xd2, 0xf3, 0x30, 0xfb, 0x4a, 0xb8, 0x33, 0xd5, 0x58, + 0xfb, 0x18, 0x86, 0x89, 0xe7, 0xc5, 0xc7, 0x85, 0x7a, 0x6e, 0xc8, 0x71, + 0x04, 0x94, 0x47, 0x8d, 0x22, 0x65, 0x05, 0x94, 0x80, 0x09, 0xbf, 0xa6, + 0xc1, 0xf7, 0x49, 0x41, 0xd5, 0x93, 0xb1, 0x4d, 0x70, 0x84, 0x80, 0x9a, + 0xab, 0xea, 0x6d, 0x49, 0x89, 0x61, 0x0a, 0x2a, 0xae, 0xee, 0xd5, 0xe8, + 0x6f, 0x9d, 0xc5, 0x8c, 0xc0, 0x6e, 0x77, 0xa6, 0x03, 0x05, 0x32, 0x6c, + 0xa0, 0x32, 0xaa, 0xea, 0xeb, 0xa6, 0xda, 0x94, 0x8c, 0x21, 0x15, 0x3c, + 0x2b, 0xa2, 0x55, 0x86, 0x60, 0xc2, 0x93, 0xac, 0x2a, 0xc0, 0x58, 0x5d, + 0x41, 0xa5, 0x26, 0xea, 0x52, 0x5d, 0x03, 0x42, 0xd0, 0xf2, 0x81, 0xfe, + 0x82, 0xe0, 0xdd, 0xa1, 0xd5, 0x94, 0x64, 0x73, 0x02, 0xda, 0x82, 0x1a, + 0x90, 0xcd, 0x48, 0x05, 0xdc, 0xca, 0x09, 0xec, 0x47, 0x2a, 0xa0, 0xcb, + 0x96, 0x07, 0x4c, 0x03, 0x2a, 0xf5, 0x30, 0x3f, 0x05, 0x7c, 0x53, 0xd7, + 0xf3, 0xca, 0x8c, 0x82, 0x8e, 0xb5, 0x10, 0xd0, 0x86, 0x62, 0x1b, 0xec, + 0x8c, 0x88, 0x5d, 0x7f, 0xa5, 0x8c, 0x02, 0x6a, 0xb5, 0xda, 0xb0, 0xca, + 0x08, 0xe1, 0x5a, 0xad, 0x36, 0xac, 0x2a, 0x08, 0x26, 0xbc, 0x70, 0x43, + 0x80, 0xb2, 0x86, 0x93, 0xdb, 0x75, 0x05, 0x10, 0xf2, 0x44, 0x16, 0x81, + 0x02, 0x71, 0x55, 0x34, 0x70, 0x47, 0xb6, 0x95, 0x4d, 0x7f, 0x94, 0x32, + 0x0a, 0x24, 0x13, 0xc0, 0x44, 0x5d, 0x37, 0x1c, 0xaa, 0x8d, 0xab, 0xd1, + 0x4d, 0x9c, 0x8e, 0xa0, 0x7e, 0x7b, 0xea, 0x6f, 0x38, 0xfa, 0xc7, 0xaf, + 0x38, 0xb2, 0x46, 0x01, 0x67, 0xbf, 0x6a, 0x6c, 0x4b, 0xf7, 0x63, 0x9c, + 0x66, 0x78, 0xb4, 0x72, 0x0a, 0xb6, 0x75, 0xe1, 0x3b, 0xcb, 0x3d, 0x52, + 0x1f, 0x9c, 0x7c, 0xa0, 0xd6, 0xc1, 0xca, 0x87, 0x71, 0x45, 0xa1, 0x5c, + 0x13, 0xc5, 0x49, 0x56, 0xd9, 0x87, 0x66, 0xcf, 0xd7, 0xb7, 0xef, 0xf9, + 0x39, 0x1f, 0x39, 0x17, 0xfe, 0xef, 0x9d, 0x3b, 0x79, 0xf7, 0x31, 0xc7, + 0x04, 0xe0, 0xac, 0xa5, 0xe7, 0x9e, 0xcb, 0x39, 0xc0, 0xd3, 0xfa, 0x7b, + 0x8e, 0x0f, 0xd3, 0x42, 0xfb, 0x4d, 0xde, 0x77, 0x5f, 0x70, 0xfe, 0xcc, + 0x73, 0xb3, 0xbc, 0x86, 0x67, 0xe0, 0xa8, 0xe4, 0xcb, 0x54, 0x5c, 0x9e, + 0xd7, 0xc0, 0x76, 0x3d, 0x0c, 0x43, 0xdd, 0x4b, 0xd4, 0xec, 0x01, 0x82, + 0xef, 0x6b, 0x45, 0xd3, 0xa0, 0xd5, 0x06, 0xbb, 0x16, 0x1f, 0x0f, 0x17, + 0x99, 0x16, 0xd9, 0x42, 0x9e, 0x35, 0x03, 0x43, 0x0a, 0x4c, 0x85, 0x06, + 0x6a, 0x45, 0x48, 0xa2, 0xd2, 0x43, 0x03, 0xce, 0x5b, 0xac, 0xbf, 0x48, + 0x8d, 0xaf, 0x36, 0x66, 0x24, 0x43, 0x6f, 0x2e, 0x03, 0x59, 0x8a, 0xfd, + 0xa6, 0xca, 0x30, 0x02, 0xc2, 0x42, 0x03, 0xb5, 0x7c, 0xb5, 0xea, 0x2d, + 0x8a, 0xfd, 0x25, 0xa4, 0x6c, 0x20, 0x9b, 0x79, 0xf5, 0xad, 0x51, 0x7f, + 0xff, 0x93, 0x86, 0xc4, 0x68, 0x42, 0x3e, 0xb2, 0x81, 0x57, 0xd6, 0xc8, + 0x03, 0x92, 0xa1, 0xfe, 0x32, 0xe3, 0xb5, 0xce, 0xbe, 0x8d, 0x6f, 0xfb, + 0x92, 0xf7, 0x0d, 0xd3, 0xaa, 0xb7, 0x58, 0x7f, 0xa6, 0xda, 0x38, 0xa0, + 0xd5, 0x04, 0x44, 0x96, 0xa1, 0xc1, 0xd5, 0x01, 0xdc, 0x4a, 0x4a, 0x49, + 0xd6, 0xc8, 0xd3, 0xf0, 0x3c, 0x1c, 0x0d, 0xa6, 0xcb, 0x6b, 0xa0, 0x6b, + 0x36, 0xa7, 0xd2, 0xc4, 0xc0, 0x58, 0xc0, 0xd8, 0x83, 0x13, 0xac, 0x3e, + 0x63, 0x25, 0xc6, 0xd5, 0x3f, 0xe2, 0xfc, 0xf7, 0x9d, 0x8f, 0xc8, 0x9b, + 0xac, 0x3e, 0x63, 0x65, 0x10, 0xb7, 0xda, 0x54, 0xf3, 0x4f, 0x84, 0x19, + 0xa6, 0x0b, 0x6c, 0xe9, 0x7c, 0x7d, 0x9b, 0x46, 0xb0, 0x19, 0x9c, 0x08, + 0xe2, 0xc9, 0x06, 0x8c, 0x3e, 0x38, 0x8a, 0x51, 0xe8, 0xc7, 0xab, 0xda, + 0x08, 0xcb, 0x64, 0x6c, 0x66, 0x8c, 0x7c, 0xde, 0xc7, 0x2c, 0xf7, 0xd0, + 0xbe, 0xde, 0x85, 0x81, 0x69, 0x60, 0x00, 0x00, 0x20, 0x00, 0x49, 0x44, + 0x41, 0x54, 0xcf, 0xae, 0x05, 0x4b, 0xdb, 0xe8, 0x80, 0x50, 0x41, 0x27, + 0x2c, 0x2a, 0x12, 0xff, 0xa9, 0x27, 0xf6, 0xc1, 0xf2, 0x65, 0x01, 0x58, + 0xab, 0xb6, 0xff, 0xd5, 0x8c, 0x7f, 0xf7, 0xc7, 0x0c, 0xbd, 0xfd, 0xd4, + 0x58, 0xf4, 0x9f, 0x3c, 0x79, 0x2c, 0x6f, 0x3c, 0xf1, 0xc0, 0x9c, 0x36, + 0x63, 0x10, 0xad, 0x68, 0x9d, 0xf6, 0xc9, 0x00, 0x86, 0xd5, 0xb5, 0x2c, + 0x5a, 0xcf, 0xfc, 0xe2, 0x67, 0x3d, 0xc3, 0x0e, 0xd6, 0x56, 0x47, 0x9a, + 0x79, 0xdc, 0x0b, 0xb5, 0xe5, 0xdc, 0x63, 0x33, 0xa0, 0x51, 0xd6, 0xcf, + 0x1e, 0x50, 0x69, 0x9e, 0x7b, 0xfe, 0x69, 0x96, 0x2d, 0x3e, 0x43, 0x9d, + 0x2f, 0x9a, 0x2b, 0x75, 0xaa, 0x54, 0xa9, 0x52, 0xa5, 0x4a, 0x95, 0x2a, + 0x55, 0xaa, 0x54, 0xa9, 0x52, 0xa5, 0x4a, 0x95, 0x2a, 0x55, 0xaa, 0x54, + 0xa9, 0x52, 0xa5, 0x4a, 0x95, 0x2a, 0x55, 0xaa, 0x54, 0xa9, 0x52, 0xa5, + 0x9a, 0x4f, 0x29, 0x54, 0x2b, 0x55, 0xaa, 0x54, 0xa9, 0x52, 0xa5, 0x7a, + 0x19, 0xc9, 0x07, 0x3a, 0x05, 0xe7, 0x52, 0x62, 0x9a, 0x66, 0x00, 0x98, + 0xea, 0xef, 0xeb, 0xef, 0x00, 0x6b, 0x49, 0x29, 0xb1, 0xfa, 0x2c, 0x3c, + 0xcf, 0x43, 0x08, 0x81, 0x61, 0x18, 0x78, 0x9e, 0x17, 0xc0, 0xa2, 0xfc, + 0x89, 0xd6, 0x76, 0x2d, 0xbe, 0xc3, 0x72, 0xf9, 0xb4, 0x32, 0xd5, 0xa9, + 0x2a, 0xf9, 0x5c, 0x3e, 0xd8, 0x21, 0xb3, 0x18, 0x99, 0x80, 0x58, 0xec, + 0x2f, 0x62, 0xd7, 0xec, 0x05, 0x1f, 0xfd, 0x34, 0xce, 0x8c, 0x83, 0xd5, + 0x67, 0xb1, 0xeb, 0xfe, 0x5d, 0xf3, 0xd6, 0x35, 0x3a, 0x0f, 0x5d, 0x64, + 0x04, 0x8d, 0x7a, 0x23, 0xe6, 0xef, 0xbb, 0xa3, 0x75, 0xf6, 0xa1, 0x5b, + 0x46, 0x4e, 0x2d, 0x4c, 0x29, 0xbd, 0xa1, 0x84, 0x3d, 0x6d, 0x23, 0x08, + 0x27, 0xdc, 0x77, 0x83, 0x7b, 0x45, 0x77, 0xa2, 0xae, 0xcd, 0xd4, 0x82, + 0xf4, 0x7e, 0x9b, 0xf8, 0x40, 0xad, 0x00, 0x8e, 0x15, 0x91, 0x0f, 0xc4, + 0xf1, 0x27, 0x93, 0xfa, 0x40, 0xad, 0x00, 0xf8, 0x25, 0xa5, 0x6a, 0xff, + 0x8c, 0x58, 0xc0, 0x26, 0xd0, 0x0b, 0x9b, 0xb9, 0x1c, 0xb5, 0x23, 0x82, + 0xff, 0x45, 0x4f, 0x64, 0x2c, 0xa2, 0x00, 0xbc, 0xb6, 0xf6, 0x10, 0x20, + 0x73, 0x6a, 0xe2, 0x6a, 0x90, 0xae, 0xcf, 0x80, 0xa6, 0x07, 0x39, 0x01, + 0x85, 0xb0, 0x0c, 0x46, 0x46, 0xe0, 0x21, 0x83, 0xc5, 0x0b, 0x31, 0x70, + 0x54, 0x46, 0x1b, 0x6f, 0x87, 0xf1, 0x65, 0x5b, 0x99, 0x74, 0x3c, 0x49, + 0x0c, 0xc8, 0x80, 0x9a, 0x3c, 0xdf, 0x6b, 0x71, 0xc1, 0xf0, 0xb9, 0x57, + 0x30, 0x7a, 0xf7, 0x0d, 0x8c, 0xdc, 0xa8, 0xb6, 0x59, 0xdf, 0x7e, 0xeb, + 0x76, 0x9c, 0x19, 0x05, 0xd3, 0x02, 0x90, 0x9e, 0x4d, 0xde, 0x9f, 0xb0, + 0xda, 0x8e, 0xc0, 0xb4, 0x88, 0x4f, 0xf6, 0x16, 0xc1, 0xf2, 0x84, 0xce, + 0x7c, 0x2c, 0x43, 0x60, 0x98, 0x79, 0x9c, 0x9a, 0x13, 0x0f, 0xd0, 0x7f, + 0x3f, 0x67, 0xc6, 0x66, 0xe4, 0x0b, 0xd7, 0xb3, 0xf1, 0xe3, 0x1b, 0x01, + 0x18, 0xb9, 0x71, 0x24, 0x70, 0x03, 0x34, 0x0a, 0x59, 0xb8, 0xb9, 0x41, + 0xbe, 0x09, 0xad, 0xba, 0x44, 0xee, 0x93, 0x30, 0xa3, 0x9b, 0x30, 0x02, + 0xfa, 0x3a, 0x1c, 0x99, 0x66, 0x29, 0x7e, 0x9e, 0xcb, 0x23, 0x9b, 0x8d, + 0x05, 0xc1, 0xb5, 0x7a, 0xc5, 0xf1, 0x9a, 0xf3, 0x4f, 0xc8, 0xf4, 0xe3, + 0x1c, 0x4c, 0xdc, 0x23, 0x15, 0x6f, 0xbe, 0x74, 0x97, 0xfd, 0xc5, 0x65, + 0x6c, 0xbf, 0x7d, 0x3b, 0x6b, 0xdf, 0xb5, 0x96, 0x5d, 0xdf, 0x8e, 0xdf, + 0x37, 0xd6, 0x5f, 0xba, 0x86, 0x9b, 0xbe, 0x38, 0x77, 0x3e, 0x87, 0x5a, + 0x8e, 0xb8, 0x8d, 0xc3, 0x83, 0x9b, 0xf9, 0xf7, 0x42, 0x75, 0x9b, 0x51, + 0x8b, 0x61, 0x9c, 0xba, 0x4d, 0x43, 0x1a, 0xc8, 0xa6, 0xa7, 0x16, 0x59, + 0x68, 0x5d, 0xfd, 0x77, 0x57, 0x73, 0xd5, 0x27, 0x37, 0x71, 0xdd, 0x67, + 0xb7, 0xc4, 0x6c, 0xf8, 0x60, 0x2d, 0x61, 0xe4, 0xe3, 0x76, 0xfb, 0x2c, + 0xaa, 0x55, 0x75, 0xdf, 0x2b, 0x95, 0x4a, 0xc1, 0x02, 0x99, 0xea, 0x54, + 0xb8, 0x10, 0x48, 0xdd, 0xdf, 0x7c, 0xa0, 0xa0, 0xa4, 0x15, 0xf9, 0x1d, + 0x47, 0x21, 0x5a, 0x46, 0xc1, 0xc0, 0xae, 0xd9, 0x18, 0x05, 0x03, 0xa3, + 0x60, 0xa8, 0x6b, 0x5a, 0x43, 0xb4, 0xf2, 0x4b, 0xd4, 0x6f, 0xb1, 0xd1, + 0x54, 0x93, 0xcb, 0x8d, 0x82, 0x89, 0x53, 0x77, 0x62, 0xcf, 0x24, 0x00, + 0x17, 0x3d, 0x71, 0xbd, 0x29, 0x71, 0xbb, 0xfc, 0x0e, 0xfd, 0xf8, 0x7e, + 0x1c, 0x00, 0x2f, 0x47, 0xcc, 0x4e, 0xb8, 0x40, 0x2a, 0x61, 0x5b, 0x03, + 0x22, 0xf3, 0x22, 0x0f, 0x05, 0xa8, 0xd6, 0x6c, 0x4c, 0x53, 0xc3, 0x0c, + 0xf5, 0x31, 0xb6, 0xb0, 0x2a, 0x62, 0x3f, 0x99, 0x67, 0x90, 0x87, 0x9e, + 0xf8, 0x6f, 0x14, 0x42, 0xb8, 0x96, 0x51, 0x50, 0x8b, 0x0e, 0x2b, 0x0f, + 0x8f, 0x63, 0xad, 0x1b, 0xe6, 0xea, 0xcf, 0x5c, 0xcd, 0x57, 0xbf, 0x30, + 0xc2, 0x4d, 0x37, 0x6f, 0xc7, 0x7e, 0x30, 0x02, 0xfb, 0xe8, 0xa1, 0x6e, + 0xeb, 0xd9, 0xba, 0xad, 0x73, 0x8b, 0xae, 0xbd, 0x1b, 0xe8, 0xe1, 0x1f, + 0xf5, 0x4b, 0x9e, 0x4f, 0x6b, 0x80, 0x94, 0x8a, 0x3b, 0xc0, 0x70, 0x64, + 0xb1, 0x84, 0xaf, 0xcf, 0xdf, 0x78, 0xe3, 0x9c, 0x65, 0x9d, 0x2f, 0xdc, + 0x2f, 0x47, 0x12, 0x40, 0x15, 0x85, 0x5c, 0x45, 0x35, 0x4d, 0xbc, 0x9e, + 0xf3, 0xd5, 0xa1, 0xb3, 0xde, 0xd3, 0x31, 0x1b, 0xc9, 0x63, 0xd2, 0x2f, + 0xea, 0xde, 0xa9, 0xcf, 0x76, 0x46, 0xfc, 0x06, 0x22, 0x29, 0x92, 0x7f, + 0x83, 0x75, 0x74, 0x96, 0xff, 0x50, 0x20, 0x5b, 0xf7, 0x4d, 0x3c, 0xc6, + 0x79, 0x11, 0x8e, 0xcc, 0xea, 0x95, 0x27, 0x30, 0x36, 0xf9, 0x14, 0xab, + 0x57, 0xfe, 0x7e, 0xc0, 0x5a, 0xd7, 0x66, 0x0e, 0xce, 0xdd, 0x2b, 0xed, + 0xa1, 0xa4, 0x59, 0x48, 0xfc, 0x2d, 0x99, 0x43, 0x77, 0x47, 0xb5, 0x35, + 0x33, 0xbf, 0x7b, 0x21, 0xba, 0x25, 0xc3, 0xbc, 0xf0, 0x1d, 0x63, 0x60, + 0x15, 0xde, 0xf4, 0x44, 0xdc, 0xf3, 0xfa, 0x3b, 0x80, 0x3b, 0xe0, 0x5b, + 0x23, 0xf1, 0xb8, 0x6e, 0x11, 0xef, 0xd1, 0xb9, 0xfb, 0xb8, 0x0b, 0x55, + 0xd6, 0x82, 0x91, 0xc1, 0xf8, 0x42, 0xeb, 0x6d, 0x6b, 0x0c, 0x36, 0xee, + 0xed, 0x42, 0x1a, 0xfa, 0x8a, 0xd9, 0xe9, 0xf6, 0xc1, 0x5a, 0x3e, 0x14, + 0xeb, 0xf3, 0x91, 0xf8, 0xbe, 0xfb, 0x63, 0xc0, 0xed, 0x63, 0x50, 0xf1, + 0xe0, 0xef, 0x05, 0x50, 0x84, 0xd3, 0xbe, 0x0a, 0xf7, 0x7e, 0x10, 0x6c, + 0x07, 0x3e, 0xef, 0xc4, 0x6d, 0xbc, 0x9c, 0xe5, 0xc3, 0xb5, 0x6e, 0xb9, + 0x16, 0xde, 0xb7, 0x5e, 0xb9, 0xa7, 0x2a, 0xaa, 0x1e, 0x0f, 0x3a, 0xbd, + 0xd3, 0x45, 0xb4, 0xe1, 0x5f, 0x86, 0x21, 0x53, 0x86, 0xb6, 0x5a, 0x5c, + 0x25, 0x16, 0x0f, 0x41, 0x5b, 0x3f, 0x63, 0xbf, 0x3e, 0x8c, 0xad, 0x99, + 0x10, 0xa5, 0x25, 0x82, 0xea, 0x7e, 0x19, 0xb8, 0x6d, 0x09, 0x9b, 0xae, + 0xfb, 0x2a, 0xf8, 0x60, 0xdf, 0x35, 0x25, 0xec, 0x9a, 0xe4, 0x86, 0x1b, + 0xbf, 0x03, 0x80, 0xbb, 0x5f, 0x3d, 0x4b, 0x37, 0x6e, 0x78, 0x57, 0xcf, + 0xbc, 0x05, 0x26, 0x92, 0xb9, 0xfb, 0x1b, 0xae, 0x2b, 0x30, 0x4d, 0x19, + 0xb8, 0x81, 0xe0, 0x3c, 0x29, 0x29, 0x0d, 0x3c, 0x4f, 0xc6, 0xc2, 0xa3, + 0xe9, 0xa5, 0x34, 0x3a, 0x41, 0x5b, 0x7d, 0x6a, 0x21, 0x9b, 0xd0, 0xef, + 0x41, 0xb2, 0xe9, 0x85, 0x1d, 0xed, 0xe9, 0x1d, 0xac, 0x36, 0x74, 0xb8, + 0xa9, 0xfb, 0xdb, 0x6e, 0x64, 0x71, 0x98, 0x37, 0x1a, 0xa4, 0x07, 0x40, + 0x3f, 0x7b, 0x69, 0x46, 0xec, 0xcf, 0x8c, 0xb2, 0xca, 0x18, 0x0a, 0xcf, + 0xfd, 0x3e, 0x8d, 0xa7, 0xda, 0x67, 0xc2, 0x1b, 0x9f, 0xdb, 0xc6, 0x3c, + 0xe9, 0x63, 0x36, 0x16, 0x00, 0xdf, 0xf2, 0x4b, 0xdf, 0xed, 0xed, 0x2b, + 0x60, 0x15, 0xcf, 0x63, 0xc3, 0x0f, 0x4f, 0xda, 0x3a, 0xe1, 0xc4, 0xd7, + 0x51, 0xaf, 0x87, 0xab, 0x6a, 0xcf, 0xfc, 0xa3, 0xd5, 0xfc, 0xf8, 0xc7, + 0x3f, 0x46, 0xec, 0xdf, 0xbf, 0x80, 0xf7, 0xc1, 0x83, 0x57, 0x34, 0xff, + 0x03, 0x11, 0xff, 0x65, 0x84, 0x6f, 0x64, 0x87, 0x5a, 0x97, 0x6e, 0xe5, + 0xf5, 0xdb, 0x46, 0x02, 0xb3, 0xfc, 0x86, 0x27, 0xc7, 0x7f, 0xc4, 0xd1, + 0xaf, 0x7c, 0x15, 0xf9, 0xd7, 0xe5, 0xe9, 0x7f, 0x6d, 0x3f, 0x8f, 0xfc, + 0xe0, 0x87, 0x00, 0x3c, 0x39, 0xfe, 0xa3, 0x85, 0x57, 0xa2, 0x47, 0xfe, + 0xc9, 0x32, 0x2e, 0xe4, 0xef, 0x12, 0xd5, 0x8e, 0xdb, 0x1d, 0xd6, 0x9c, + 0x65, 0x71, 0xc5, 0x47, 0x6e, 0xc1, 0x5a, 0x51, 0xc2, 0xec, 0xb3, 0xa8, + 0xdc, 0xbb, 0x0b, 0x83, 0x2c, 0xde, 0x3f, 0x0d, 0xb3, 0xe3, 0x4e, 0xbd, + 0xf8, 0xaf, 0xfd, 0xaf, 0x94, 0xe4, 0xae, 0xb0, 0xde, 0x52, 0xe2, 0x19, + 0xe1, 0xa2, 0x7c, 0xf9, 0x82, 0x2e, 0xc3, 0x31, 0xc4, 0x20, 0xcf, 0x00, + 0xf9, 0xc4, 0xea, 0xe3, 0xb1, 0x4a, 0x95, 0x92, 0x55, 0xa4, 0xbc, 0xdc, + 0xec, 0xfa, 0x8e, 0x28, 0x56, 0x5c, 0x0e, 0xb5, 0x10, 0xa4, 0x58, 0x7d, + 0xc4, 0x26, 0x2f, 0x4c, 0x8c, 0x25, 0x79, 0x84, 0x80, 0x86, 0x07, 0xdb, + 0xc7, 0x61, 0xf8, 0xc3, 0xeb, 0xa9, 0xdc, 0x19, 0x25, 0x04, 0x9d, 0x4f, + 0xb5, 0x3d, 0x4c, 0x71, 0x66, 0x7b, 0xb8, 0x40, 0x3d, 0xe3, 0x97, 0xc1, + 0x40, 0xea, 0xf7, 0x72, 0x8b, 0x31, 0xac, 0xa1, 0x12, 0x95, 0x8a, 0x83, + 0xbd, 0xaf, 0x1a, 0xd8, 0x06, 0x10, 0xf9, 0x7c, 0x1c, 0xce, 0xad, 0x6d, + 0xe4, 0xc5, 0xdc, 0x60, 0x0f, 0xbf, 0x9c, 0x96, 0x55, 0xc2, 0x9e, 0xf1, + 0x82, 0x7c, 0x85, 0x30, 0xf0, 0xdf, 0x6f, 0xa2, 0x75, 0x6d, 0x78, 0x1e, + 0x66, 0x84, 0x5b, 0x60, 0x2c, 0xc9, 0x22, 0xa3, 0xf7, 0x83, 0x1e, 0xba, + 0xe9, 0xe6, 0xed, 0xf4, 0x2f, 0x33, 0xf0, 0x22, 0x71, 0xe5, 0x0b, 0xaa, + 0xdd, 0xe7, 0xfb, 0xed, 0x7c, 0x13, 0x78, 0x01, 0x05, 0xd4, 0x7a, 0xee, + 0xf2, 0xa3, 0xa9, 0x6d, 0x53, 0x70, 0x2c, 0x0b, 0x05, 0xce, 0x9a, 0x00, + 0xce, 0x01, 0x1e, 0x07, 0x7e, 0x0d, 0xf8, 0x4b, 0x88, 0x5b, 0x28, 0x70, + 0xd6, 0xab, 0x81, 0xe6, 0xa4, 0x02, 0x66, 0xf9, 0x40, 0x2d, 0x3f, 0xfd, + 0xf7, 0xf5, 0xf1, 0xa2, 0xe6, 0x8b, 0x7c, 0x19, 0x78, 0x83, 0x0e, 0xbb, + 0x15, 0x78, 0x23, 0xf0, 0x0a, 0x9d, 0x3f, 0xda, 0xf6, 0xbe, 0xf9, 0xab, + 0xda, 0x55, 0xbf, 0x6c, 0xbe, 0xc8, 0x6b, 0x72, 0x47, 0x75, 0xf8, 0x3f, + 0xa3, 0x41, 0x5e, 0xbf, 0x0f, 0x1d, 0x4c, 0x79, 0xde, 0x43, 0x27, 0x4c, + 0xec, 0xa5, 0x80, 0x8b, 0xed, 0xed, 0x06, 0xd4, 0x42, 0xc1, 0x9a, 0xa6, + 0x22, 0xe7, 0x3e, 0xb8, 0x69, 0xef, 0x22, 0xf5, 0x2e, 0x7b, 0xdb, 0x93, + 0xc0, 0xec, 0x2c, 0x14, 0x8a, 0x7c, 0xe0, 0x44, 0x9b, 0xdb, 0x9e, 0x2c, + 0xf0, 0x81, 0x13, 0xeb, 0xdc, 0xf6, 0x64, 0x91, 0x57, 0x3d, 0x6f, 0xb3, + 0x77, 0x51, 0x91, 0x0f, 0x9c, 0xd8, 0xe4, 0xc0, 0xeb, 0x67, 0xd9, 0x7e, + 0xb3, 0xba, 0xdb, 0x9c, 0xbe, 0x58, 0x5d, 0x79, 0x2b, 0x56, 0xc6, 0xc1, + 0x5a, 0x00, 0xbf, 0x5a, 0x54, 0xe4, 0x57, 0xc0, 0xde, 0x27, 0xd5, 0xf9, + 0x20, 0xb3, 0x41, 0x5e, 0x83, 0xcf, 0xbf, 0x91, 0x9f, 0xf3, 0x93, 0x00, + 0xd2, 0xa5, 0x8e, 0x8b, 0x55, 0xf9, 0x26, 0x67, 0x59, 0xb1, 0x72, 0x71, + 0x0c, 0x36, 0xb5, 0x57, 0x3b, 0x07, 0xe7, 0x5e, 0xdb, 0x1e, 0xd6, 0x55, + 0xa7, 0xbf, 0xed, 0xc9, 0x02, 0xa2, 0xa0, 0xfc, 0xb6, 0xd5, 0x1d, 0x44, + 0xc1, 0xc2, 0x8a, 0x2c, 0x9a, 0x76, 0x0a, 0x45, 0xa8, 0x3b, 0xea, 0x88, + 0x1e, 0xaf, 0xd3, 0xff, 0xa4, 0x74, 0x48, 0x8e, 0x9e, 0xa9, 0xde, 0xa0, + 0xc4, 0x46, 0x50, 0x85, 0x10, 0xa8, 0xc5, 0x62, 0x1e, 0x62, 0x96, 0xb7, + 0xbe, 0x75, 0x31, 0xdf, 0x7d, 0x68, 0x96, 0x92, 0x00, 0x5b, 0x0a, 0x6c, + 0x1d, 0x1f, 0x04, 0x2f, 0x2e, 0x56, 0xbf, 0x95, 0x5f, 0xcc, 0xc2, 0x90, + 0x80, 0x3f, 0xec, 0x51, 0x17, 0xff, 0x6f, 0xf4, 0x73, 0xd4, 0xef, 0x6a, + 0x2e, 0xad, 0x5f, 0x63, 0xb1, 0x63, 0xb7, 0x13, 0x3b, 0x07, 0xd8, 0xb1, + 0xc7, 0x09, 0xca, 0x1b, 0x05, 0x69, 0x8d, 0xee, 0x09, 0xe3, 0x76, 0xf3, + 0x4f, 0xfa, 0x5d, 0xf3, 0xf5, 0xef, 0x73, 0xf5, 0xfb, 0xdf, 0xc6, 0xc5, + 0x6b, 0x42, 0xff, 0xed, 0x7e, 0x7e, 0xbb, 0xe3, 0xfe, 0x00, 0x63, 0xd3, + 0xea, 0x7e, 0xb7, 0x7a, 0xc0, 0x60, 0x6c, 0xda, 0x63, 0x68, 0xaa, 0xc5, + 0x2d, 0x7b, 0x56, 0xb3, 0xe9, 0x93, 0x63, 0xb1, 0x78, 0x66, 0x5f, 0x96, + 0x5d, 0xbb, 0x75, 0xbf, 0xae, 0x69, 0x73, 0xdd, 0xad, 0x6e, 0x30, 0xce, + 0x50, 0xcc, 0xe9, 0x71, 0x8a, 0xba, 0x4b, 0xb9, 0xdf, 0xa0, 0x6a, 0xbb, + 0x01, 0xdc, 0x6f, 0x74, 0x4f, 0x95, 0x61, 0xd4, 0xb8, 0x60, 0x91, 0x2a, + 0x76, 0xae, 0x04, 0x75, 0x97, 0xeb, 0x6e, 0x55, 0xe3, 0x10, 0x95, 0x27, + 0x42, 0x9b, 0x40, 0x60, 0xd7, 0xb7, 0x39, 0x3a, 0x5e, 0x0d, 0x6c, 0x02, + 0x6c, 0xb9, 0x3d, 0x3e, 0x7e, 0xb1, 0xf6, 0xcd, 0x45, 0x2e, 0xbf, 0xee, + 0x0e, 0xb6, 0xee, 0x3d, 0x3b, 0xe6, 0x1f, 0x1d, 0x46, 0x9e, 0xa8, 0x34, + 0x3a, 0xc3, 0xb4, 0x6e, 0x99, 0x52, 0xc0, 0x58, 0xeb, 0x7d, 0x12, 0xeb, + 0x2e, 0x41, 0x45, 0x8f, 0x0b, 0x97, 0xa4, 0xa0, 0x36, 0x13, 0xa6, 0xdb, + 0xf1, 0x40, 0x1c, 0x4c, 0x53, 0x5e, 0x51, 0xc4, 0xeb, 0x02, 0x2f, 0x88, + 0x65, 0x93, 0xc9, 0xc7, 0xc0, 0x5a, 0xbe, 0xa2, 0x7e, 0x86, 0x18, 0xd6, + 0x00, 0x2d, 0x34, 0x50, 0xcb, 0xef, 0xcb, 0x7e, 0x35, 0x92, 0x62, 0x33, + 0x0a, 0xac, 0xb5, 0x85, 0x46, 0x3d, 0xbc, 0x1e, 0x6c, 0x37, 0x2c, 0x93, + 0x91, 0x5b, 0x8f, 0xd7, 0xdc, 0x11, 0xc0, 0xa5, 0x7c, 0xe5, 0x4d, 0x8b, + 0x3c, 0x16, 0xf6, 0x0c, 0x1a, 0x94, 0x65, 0xd1, 0x70, 0x43, 0x1b, 0x51, + 0xb7, 0x0f, 0xd2, 0xf2, 0xc1, 0x5a, 0x00, 0xc2, 0xb4, 0x90, 0xae, 0x03, + 0x19, 0x89, 0x87, 0xc4, 0xc8, 0x18, 0x78, 0x28, 0x78, 0x96, 0xcf, 0x91, + 0x30, 0x22, 0x70, 0x2d, 0x2f, 0xe3, 0xcd, 0x39, 0x0b, 0xc3, 0x93, 0x36, + 0x86, 0x50, 0xbf, 0x5d, 0xa7, 0x6d, 0x63, 0xe4, 0x6c, 0xa4, 0xcc, 0x63, + 0x65, 0x8a, 0x6c, 0x9f, 0x82, 0x8b, 0xdf, 0x70, 0x3d, 0xd5, 0x76, 0x85, + 0xca, 0x14, 0xc8, 0xf6, 0x08, 0x95, 0x29, 0xa8, 0x4c, 0x4d, 0x20, 0x32, + 0x57, 0x23, 0x74, 0xba, 0xbc, 0x7e, 0x18, 0xab, 0xf2, 0x96, 0xc3, 0xf3, + 0x19, 0x97, 0xbc, 0x69, 0x51, 0xf3, 0x08, 0x80, 0x5a, 0x7e, 0xbb, 0x28, + 0xc5, 0xeb, 0xde, 0x4d, 0x46, 0xc6, 0xc0, 0x9e, 0x51, 0x7f, 0x57, 0x05, + 0xd4, 0x5a, 0xd8, 0xd8, 0xe9, 0xfd, 0xfa, 0xd8, 0x4f, 0x08, 0xc7, 0xf2, + 0x8f, 0xbd, 0x54, 0x8b, 0xb8, 0xfb, 0x13, 0x7e, 0xfd, 0x11, 0x9b, 0xf7, + 0x03, 0x7f, 0xea, 0x47, 0x48, 0x42, 0xa5, 0xa6, 0xbb, 0xc3, 0xec, 0xa3, + 0xe1, 0x49, 0xf7, 0xe1, 0x2a, 0xb0, 0x95, 0xb4, 0xaf, 0xcb, 0x37, 0x30, + 0x00, 0x2b, 0x76, 0xc2, 0xe7, 0x06, 0x60, 0xdd, 0xe7, 0xd4, 0x37, 0x88, + 0x9d, 0x9f, 0x18, 0x61, 0xe6, 0xfe, 0xb9, 0x41, 0x58, 0x81, 0xdd, 0x79, + 0xca, 0x39, 0xa2, 0xc3, 0x37, 0x0e, 0x28, 0xf7, 0xc6, 0xb9, 0xe0, 0x5a, + 0x7e, 0xfb, 0x44, 0xca, 0x77, 0x6f, 0x34, 0xbf, 0x91, 0x44, 0x3b, 0xcd, + 0x9d, 0xf5, 0xfc, 0xea, 0x06, 0xd0, 0x6a, 0x2b, 0x10, 0x91, 0xdf, 0xcf, + 0x4c, 0xf6, 0xa3, 0xc3, 0xfe, 0x67, 0x04, 0xac, 0x55, 0xd3, 0x9b, 0xe2, + 0xe4, 0xfc, 0xbe, 0x6c, 0xfc, 0x1d, 0x37, 0x06, 0xe4, 0xaa, 0x39, 0xc8, + 0x37, 0x94, 0x90, 0x91, 0xf7, 0x47, 0x32, 0x59, 0xb5, 0x09, 0xc3, 0xb4, + 0x3d, 0x3f, 0x51, 0x48, 0xaa, 0x67, 0xa6, 0xd0, 0xf0, 0x2d, 0x6f, 0xb0, + 0x04, 0x19, 0x81, 0xa1, 0xbf, 0x47, 0x8a, 0xc8, 0x0d, 0x53, 0xbd, 0x2f, + 0x44, 0xea, 0x27, 0x41, 0x8a, 0x05, 0x80, 0xb5, 0x90, 0xf0, 0x9e, 0x0f, + 0x86, 0xef, 0x5b, 0x6d, 0x49, 0xff, 0xcd, 0xbb, 0xa8, 0xfd, 0xd9, 0x7a, + 0x5d, 0xf7, 0x2c, 0xae, 0x67, 0x63, 0xe6, 0x4c, 0xdc, 0xba, 0xda, 0x28, + 0xc8, 0x07, 0x6a, 0x45, 0xbf, 0x7d, 0x46, 0x81, 0x5a, 0x71, 0x08, 0xd9, + 0x4b, 0xf1, 0x36, 0xaa, 0x54, 0x12, 0x0a, 0x5c, 0x85, 0x10, 0x0a, 0xd4, + 0xd4, 0x0e, 0xfb, 0x18, 0x76, 0x5b, 0x06, 0xa0, 0xac, 0xb0, 0x5c, 0xaa, + 0x4d, 0xca, 0x02, 0x2a, 0x88, 0x0e, 0xa8, 0xb6, 0x94, 0x50, 0x45, 0x01, + 0xb5, 0xfc, 0xf6, 0xf0, 0xe1, 0x50, 0x42, 0x44, 0xbf, 0x3c, 0xc6, 0xdf, + 0x10, 0x8b, 0x39, 0x03, 0xbb, 0xa9, 0xee, 0xaf, 0x52, 0xff, 0x55, 0x26, + 0x34, 0xf1, 0x6f, 0xa2, 0xae, 0x62, 0x8e, 0xd5, 0xa1, 0xe4, 0x7f, 0x8f, + 0x89, 0x5c, 0x23, 0x13, 0x9e, 0x0c, 0x00, 0x5c, 0xe0, 0x83, 0xb5, 0xc2, + 0xf0, 0x6c, 0x4e, 0x50, 0xca, 0xc1, 0x58, 0x53, 0xd5, 0xc9, 0xd2, 0xed, + 0x59, 0xf5, 0x40, 0xbd, 0x55, 0x80, 0xc2, 0x7d, 0x11, 0x5c, 0xdf, 0x93, + 0x7a, 0xd3, 0xa2, 0xac, 0x50, 0x90, 0xac, 0xe8, 0x97, 0xaa, 0x96, 0x54, + 0xfe, 0x08, 0x40, 0x83, 0xb4, 0xaa, 0xcd, 0x30, 0x0c, 0x42, 0xc0, 0x16, + 0x00, 0x19, 0x41, 0xa5, 0x2e, 0x29, 0x0a, 0x41, 0xb9, 0x20, 0x10, 0x99, + 0x2c, 0x9e, 0xa7, 0xae, 0xb7, 0x8a, 0x07, 0xe5, 0x02, 0xd8, 0x4d, 0xf5, + 0x1d, 0xb8, 0xaa, 0xdb, 0xcb, 0x89, 0xee, 0xbc, 0x44, 0x08, 0xd7, 0x2a, + 0xe9, 0x6f, 0xd9, 0x76, 0x17, 0x90, 0xdd, 0x91, 0xd2, 0x4b, 0x01, 0xd4, + 0x02, 0x78, 0xf2, 0x89, 0x7d, 0x9c, 0xb8, 0x7c, 0x59, 0x00, 0xd1, 0xb2, + 0x72, 0x71, 0xb0, 0xd6, 0x19, 0xe5, 0x65, 0x38, 0xfb, 0xeb, 0x58, 0x4b, + 0x0a, 0x3c, 0x79, 0x92, 0xea, 0xc0, 0x3f, 0x7b, 0x80, 0x43, 0x06, 0x5a, + 0x45, 0xc1, 0x58, 0x49, 0xf5, 0x02, 0x65, 0xf9, 0xf1, 0x87, 0xe5, 0x4a, + 0xea, 0xa7, 0xaa, 0xdf, 0xe8, 0x6b, 0x39, 0x8a, 0x27, 0x4f, 0x9a, 0xe4, + 0xc4, 0xc7, 0x0f, 0x0f, 0xac, 0xf5, 0xa5, 0x4f, 0x7d, 0x89, 0x93, 0x5f, + 0xb1, 0x92, 0xa7, 0x7e, 0x0b, 0x4f, 0xdd, 0xf3, 0x73, 0xb8, 0xe7, 0x4b, + 0xb1, 0xf0, 0x13, 0x8e, 0x7e, 0x82, 0xa5, 0xe7, 0x9e, 0x1b, 0xc0, 0xb4, + 0xee, 0x7a, 0xe1, 0x85, 0x58, 0xf8, 0x49, 0x27, 0x9d, 0xc4, 0xac, 0xf3, + 0xcc, 0x82, 0xf2, 0x2a, 0x9a, 0xf1, 0x71, 0x82, 0xbc, 0xa1, 0x20, 0x74, + 0x8d, 0xba, 0xdb, 0x71, 0x1f, 0x97, 0xfa, 0xa2, 0x95, 0xed, 0x2c, 0xe3, + 0x9f, 0xdd, 0xc1, 0xd0, 0xbb, 0xd7, 0x60, 0x4f, 0x4f, 0xb0, 0xfe, 0x9c, + 0x4b, 0x70, 0xf7, 0xdb, 0x58, 0xc2, 0xa0, 0x5a, 0x9b, 0xa4, 0x7a, 0xfb, + 0x28, 0xa5, 0x0b, 0x87, 0xd9, 0xfa, 0xf9, 0x6b, 0xb1, 0x06, 0x2c, 0x2e, + 0xbf, 0xe8, 0x72, 0x5a, 0xf5, 0x16, 0x56, 0x4e, 0xd0, 0x90, 0x21, 0x34, + 0xcb, 0x07, 0x6a, 0xf9, 0x1b, 0xbe, 0xf9, 0xca, 0x46, 0xe0, 0x5a, 0xad, + 0x66, 0x03, 0xd7, 0x91, 0xb8, 0xd4, 0x20, 0x23, 0x30, 0x97, 0x98, 0x58, + 0x46, 0x9e, 0xc6, 0x4c, 0x83, 0x6c, 0x26, 0x8b, 0x33, 0xe5, 0xc0, 0x0a, + 0x30, 0x84, 0x05, 0x19, 0x89, 0x58, 0x2c, 0x82, 0xb1, 0xc6, 0xf2, 0xb2, + 0x7e, 0x0d, 0xa6, 0x8a, 0x2b, 0x00, 0x77, 0x89, 0x6c, 0x47, 0x98, 0xca, + 0x13, 0xfc, 0x8e, 0x73, 0xf4, 0xfe, 0xe0, 0xff, 0xc6, 0x5a, 0x91, 0xb1, + 0x0c, 0x1f, 0x8a, 0xd5, 0x6a, 0xc2, 0xda, 0x73, 0x57, 0xe1, 0xec, 0x93, + 0x54, 0xf6, 0x56, 0x29, 0x9f, 0xb9, 0x96, 0xbc, 0x11, 0x8f, 0x0b, 0x20, + 0x0a, 0x02, 0x67, 0xda, 0xc1, 0x58, 0x61, 0x05, 0xb6, 0xf2, 0x86, 0x80, + 0x2c, 0xc8, 0xd9, 0xb0, 0x0d, 0x2a, 0xb5, 0x0a, 0xa6, 0x30, 0x71, 0xf5, + 0x26, 0x77, 0x7e, 0x99, 0x0c, 0x61, 0x60, 0xe5, 0xb2, 0x34, 0x96, 0x18, + 0xd0, 0x04, 0x4f, 0x1e, 0x3e, 0x29, 0xcf, 0x3a, 0xa7, 0xd8, 0x13, 0xfa, + 0x34, 0x57, 0xd8, 0x42, 0x74, 0xc2, 0xf2, 0x65, 0x00, 0x64, 0x73, 0x6f, + 0xe7, 0xfa, 0x91, 0xfb, 0xe9, 0x33, 0x07, 0x18, 0x7a, 0xfb, 0xa9, 0x8c, + 0x7f, 0xf7, 0xc7, 0x00, 0xcc, 0xb8, 0xaa, 0xd3, 0xf1, 0xd4, 0x13, 0xfb, + 0x78, 0xea, 0x09, 0x78, 0xef, 0xba, 0x3f, 0x24, 0x36, 0x74, 0xde, 0x0d, + 0x08, 0xb6, 0x40, 0xbf, 0xc7, 0xac, 0x0a, 0x8f, 0x4d, 0x57, 0xf8, 0x28, + 0x9f, 0xe2, 0xc1, 0x1f, 0xdf, 0xc7, 0xb7, 0x9b, 0x0b, 0xc4, 0x7f, 0x1f, + 0x09, 0x08, 0xd9, 0xc1, 0x2a, 0x91, 0xe7, 0xbe, 0xd9, 0x07, 0x38, 0x6e, + 0xd1, 0x52, 0x8e, 0x3f, 0x56, 0xf5, 0xf7, 0x7d, 0xc0, 0x56, 0xaa, 0x54, + 0xa9, 0x52, 0xa5, 0x4a, 0x95, 0x2a, 0x55, 0xaa, 0x54, 0xa9, 0x52, 0xa5, + 0x4a, 0x95, 0x2a, 0x55, 0xaa, 0x54, 0xa9, 0x52, 0xa5, 0x4a, 0x95, 0x2a, + 0x55, 0xaa, 0x54, 0xa9, 0x52, 0xa5, 0x3a, 0x3c, 0xa5, 0x50, 0xad, 0x54, + 0xa9, 0x52, 0xa5, 0x4a, 0x95, 0xea, 0x65, 0xaa, 0xe8, 0x24, 0x42, 0xd3, + 0x34, 0xa9, 0xcd, 0xd4, 0x02, 0xd8, 0x53, 0x00, 0x8a, 0xd2, 0x71, 0x9c, + 0x99, 0x70, 0x11, 0x44, 0xad, 0x56, 0x53, 0x13, 0xa8, 0x75, 0x58, 0xd1, + 0x2c, 0xd2, 0x68, 0x36, 0x70, 0x5d, 0x37, 0x84, 0x8d, 0x64, 0x04, 0xee, + 0x8c, 0x0b, 0x12, 0xec, 0xba, 0x4d, 0xa3, 0xd9, 0x40, 0x36, 0x25, 0x8d, + 0xa6, 0x86, 0xab, 0xe4, 0xf2, 0x4c, 0x3c, 0x3a, 0x11, 0x3b, 0xfa, 0xe0, + 0x2c, 0xff, 0x98, 0x0c, 0xf7, 0xfd, 0x0e, 0x46, 0xd1, 0x89, 0xde, 0x01, + 0x1c, 0x2b, 0x31, 0x81, 0x52, 0xb6, 0x35, 0x1c, 0x2c, 0x23, 0x82, 0x09, + 0x90, 0xfd, 0x7d, 0xfd, 0xe4, 0x0b, 0x79, 0x2a, 0x7b, 0x2b, 0x54, 0xf6, + 0x56, 0x02, 0x78, 0x58, 0xb4, 0x4d, 0x7c, 0x3b, 0x7e, 0x7a, 0xff, 0xe8, + 0xcb, 0xb7, 0x55, 0x1a, 0x28, 0xd1, 0xa8, 0x37, 0xa8, 0xcd, 0xd4, 0x28, + 0x0f, 0x96, 0xa9, 0x3e, 0x5a, 0xc5, 0xc8, 0x19, 0xb1, 0xc9, 0x96, 0xf9, + 0x5c, 0x1e, 0x17, 0x17, 0x77, 0xc6, 0xc5, 0x30, 0x0c, 0x1c, 0xcf, 0x41, + 0xb6, 0x25, 0xa6, 0x61, 0x92, 0x15, 0x59, 0xaa, 0xd3, 0xd5, 0x0e, 0xf0, + 0xcc, 0xa1, 0x2a, 0x39, 0xf9, 0x3d, 0x5c, 0xf4, 0x1b, 0x89, 0x13, 0x59, + 0x12, 0x17, 0x5d, 0x1e, 0x27, 0x32, 0xe0, 0xe5, 0x44, 0x38, 0x7b, 0xbd, + 0xe9, 0xa9, 0x45, 0xea, 0x7e, 0x5d, 0xda, 0x80, 0x27, 0xc9, 0xf6, 0x09, + 0x5a, 0x35, 0x2f, 0x96, 0x2e, 0x50, 0x3b, 0x31, 0x09, 0x33, 0xd3, 0x59, + 0x2f, 0xab, 0x20, 0x30, 0x0a, 0x79, 0x3c, 0xb7, 0xd1, 0x11, 0x16, 0xa4, + 0x69, 0x87, 0x80, 0x2d, 0x43, 0x08, 0x46, 0x9b, 0x77, 0x30, 0x72, 0xe3, + 0x08, 0xdb, 0x6f, 0xdd, 0xce, 0xd8, 0x9e, 0xce, 0x85, 0x56, 0x02, 0x81, + 0x27, 0x25, 0x08, 0x09, 0x19, 0xbd, 0x48, 0x21, 0xe3, 0x4f, 0xd2, 0x8d, + 0xdb, 0x16, 0xfe, 0x12, 0x06, 0x19, 0xa6, 0x45, 0x80, 0x61, 0xaa, 0x32, + 0x59, 0x42, 0xe0, 0xf8, 0x0d, 0x66, 0x58, 0x38, 0x33, 0xe1, 0x84, 0xc3, + 0x8d, 0x1f, 0xbd, 0x92, 0x91, 0x2f, 0x28, 0x40, 0xc6, 0x75, 0x9f, 0xbe, + 0x1a, 0x4b, 0xe4, 0x91, 0x0e, 0x88, 0x25, 0x12, 0x31, 0x05, 0x2d, 0x4f, + 0x22, 0xf7, 0xa9, 0x76, 0xf2, 0xea, 0xf1, 0x6b, 0x26, 0x6c, 0xaf, 0xf8, + 0x35, 0x7a, 0x30, 0x92, 0xcd, 0x06, 0x42, 0x83, 0xb4, 0x00, 0x44, 0x2e, + 0x3f, 0x4f, 0x8a, 0x50, 0x46, 0xce, 0x07, 0x6a, 0x84, 0x93, 0x7d, 0xbd, + 0xa6, 0x8d, 0x91, 0x2b, 0x76, 0x4f, 0xb0, 0x40, 0x2d, 0xc4, 0xc6, 0x7c, + 0x71, 0x24, 0x9d, 0x0b, 0xb1, 0xe6, 0xb3, 0xb9, 0xea, 0x2c, 0x15, 0xbe, + 0xfd, 0xf6, 0xed, 0x5d, 0xd3, 0x49, 0x9c, 0x00, 0xb6, 0xd5, 0xbf, 0xac, + 0x9f, 0x1d, 0x37, 0xef, 0x9e, 0xb3, 0x2c, 0xdd, 0xca, 0xa0, 0xec, 0x99, + 0x5d, 0xfd, 0xe7, 0x93, 0xd7, 0x74, 0x83, 0xb4, 0xdd, 0xe0, 0x51, 0x51, + 0x5d, 0x76, 0xe9, 0x65, 0x20, 0x60, 0xf7, 0x3d, 0xbb, 0x63, 0x93, 0xcd, + 0xa5, 0xfe, 0xed, 0x49, 0x09, 0x9e, 0x86, 0xbb, 0x6d, 0xd2, 0x40, 0x2d, + 0xff, 0x9e, 0x65, 0x08, 0x81, 0xed, 0xc3, 0xa4, 0x0a, 0xbd, 0xaf, 0x87, + 0x52, 0xa9, 0x44, 0xb5, 0x5a, 0x45, 0x64, 0x55, 0xba, 0xd2, 0x8a, 0x52, + 0x0c, 0xac, 0x95, 0x44, 0x14, 0xb4, 0x50, 0x00, 0x29, 0x5f, 0x46, 0xc1, + 0x08, 0xee, 0xd5, 0x51, 0xc9, 0xb6, 0xba, 0x1f, 0xe6, 0x97, 0xa8, 0xf3, + 0x4b, 0xde, 0x77, 0xbe, 0x72, 0x64, 0xe0, 0x8a, 0xff, 0xab, 0x3b, 0x60, + 0x6a, 0x21, 0xf7, 0xbb, 0x64, 0x9c, 0x28, 0xf0, 0xca, 0x07, 0x83, 0x75, + 0x53, 0x56, 0xe4, 0x83, 0x9a, 0x98, 0x89, 0x49, 0xfd, 0xae, 0x86, 0x47, + 0x26, 0xed, 0x76, 0xcb, 0xd3, 0xbf, 0x8f, 0x7a, 0xb3, 0x0a, 0x26, 0xe6, + 0x43, 0xc5, 0x14, 0x5c, 0x4b, 0xe2, 0xd4, 0x1b, 0x94, 0x4f, 0x53, 0xbb, + 0xfe, 0x5e, 0xf3, 0x77, 0x57, 0xb1, 0xfd, 0xd6, 0x1d, 0x9d, 0x40, 0xbe, + 0x2e, 0xea, 0x06, 0x99, 0xfa, 0x0d, 0x6a, 0xa1, 0x7d, 0xd2, 0x7f, 0x21, + 0xee, 0x4e, 0x90, 0x56, 0x5c, 0x23, 0x4c, 0xeb, 0xb5, 0x79, 0xd3, 0x9c, + 0xbb, 0x1c, 0xce, 0x3d, 0x17, 0x3e, 0xfe, 0xf1, 0x78, 0x1c, 0x9f, 0x9b, + 0x15, 0xf5, 0x5f, 0xa8, 0xdf, 0x42, 0xca, 0x3c, 0x97, 0xba, 0x81, 0xc4, + 0xe6, 0xaa, 0xd3, 0xe1, 0xac, 0x5b, 0xec, 0x96, 0x76, 0xae, 0x35, 0x86, + 0x3b, 0x89, 0xad, 0x15, 0x3c, 0xe4, 0xfc, 0xcf, 0xdb, 0x0d, 0xdf, 0x59, + 0x03, 0x4c, 0x3c, 0x06, 0x40, 0x56, 0x64, 0x59, 0x7b, 0xcf, 0x21, 0x18, + 0x7a, 0x19, 0x68, 0xb3, 0x7e, 0x9e, 0xfa, 0x40, 0xac, 0xcd, 0xed, 0xee, + 0xee, 0xc3, 0xd1, 0xa6, 0x76, 0x08, 0xca, 0x5a, 0x88, 0xfb, 0xe5, 0xa0, + 0x0e, 0xa0, 0x56, 0x54, 0xef, 0xd9, 0x18, 0x3b, 0xf5, 0xe6, 0xda, 0xf9, + 0x7d, 0x81, 0xba, 0xec, 0x42, 0x78, 0xcd, 0x55, 0xab, 0x41, 0x08, 0x4e, + 0xb8, 0x47, 0xf7, 0x95, 0x12, 0xfd, 0xad, 0xf2, 0x20, 0x14, 0xdf, 0x00, + 0x37, 0x95, 0xf4, 0x4a, 0x92, 0x0f, 0xbb, 0x49, 0x33, 0xca, 0xd6, 0x45, + 0x70, 0xd3, 0xad, 0x1e, 0x94, 0x8d, 0x39, 0xc1, 0x58, 0x97, 0x5d, 0x04, + 0x37, 0x7d, 0x66, 0x54, 0xc5, 0xbb, 0x7d, 0x25, 0x14, 0x50, 0xff, 0xde, + 0xdc, 0x3b, 0x8d, 0x71, 0xda, 0xf9, 0x78, 0x0f, 0xdf, 0xd1, 0x3b, 0xc2, + 0x61, 0xc6, 0x3f, 0x64, 0x5d, 0xb2, 0x19, 0xb5, 0x98, 0xfe, 0xe0, 0xe5, + 0xed, 0x9c, 0x04, 0xd4, 0x82, 0x3b, 0x43, 0x64, 0x91, 0x91, 0xbf, 0xe7, + 0x1d, 0x77, 0x87, 0x24, 0x8d, 0xe0, 0x8a, 0xc8, 0x65, 0x03, 0xf7, 0xda, + 0xdd, 0x0e, 0xd2, 0x7f, 0x06, 0x8d, 0x97, 0x43, 0xa3, 0x91, 0xbe, 0xe2, + 0xc8, 0xd6, 0x6f, 0x07, 0xee, 0x2b, 0x36, 0x7c, 0xa8, 0x23, 0x7f, 0x41, + 0xd8, 0x27, 0x71, 0xbb, 0xff, 0x49, 0x03, 0x98, 0x56, 0xaf, 0xf3, 0x50, + 0xb2, 0x6b, 0x78, 0x78, 0x1e, 0x5f, 0x78, 0xea, 0x3f, 0x51, 0xc3, 0xc5, + 0xc8, 0xca, 0x3d, 0x57, 0x9f, 0x56, 0x98, 0x22, 0x06, 0xd6, 0x0a, 0x94, + 0x4b, 0xb8, 0xbb, 0x81, 0x74, 0x22, 0x90, 0x50, 0x8c, 0x7c, 0x0c, 0x8c, + 0xb5, 0x20, 0x1b, 0xf3, 0xa5, 0x3f, 0x0c, 0x89, 0xc4, 0xf1, 0x60, 0xd3, + 0x01, 0x2c, 0x5d, 0xba, 0x94, 0x7a, 0xbd, 0xce, 0x9e, 0xef, 0x8d, 0xb1, + 0xe8, 0x58, 0xc1, 0x5b, 0x4e, 0x5f, 0x45, 0xa1, 0x50, 0xe0, 0xd9, 0xfd, + 0xfb, 0xa3, 0xdc, 0x8a, 0x23, 0xae, 0x5f, 0x01, 0x8b, 0x8f, 0x59, 0xc4, + 0xec, 0x0b, 0xcf, 0x07, 0x7e, 0x79, 0xc0, 0x3b, 0x66, 0x11, 0x22, 0xe2, + 0x37, 0x9f, 0x16, 0x0a, 0xe0, 0x52, 0xc7, 0xdf, 0xf0, 0xa6, 0xff, 0xfa, + 0x4e, 0x1e, 0x9e, 0x78, 0x98, 0xba, 0xfd, 0x33, 0x7e, 0xb6, 0xef, 0x7f, + 0x72, 0x34, 0x70, 0x96, 0xf6, 0x63, 0xff, 0xfe, 0x83, 0xa9, 0xc2, 0x02, + 0xf3, 0x5c, 0xb8, 0x86, 0xd7, 0x55, 0x19, 0xdd, 0x59, 0x62, 0xe8, 0x1d, + 0x92, 0xea, 0xbd, 0x55, 0x1c, 0xdd, 0x3f, 0x5e, 0xfb, 0xc9, 0xf5, 0x50, + 0x03, 0x67, 0xbf, 0xff, 0x3b, 0x8f, 0xbf, 0x3f, 0x54, 0x2a, 0x16, 0xeb, + 0xdf, 0xdd, 0xa2, 0xb5, 0xdf, 0x43, 0x18, 0x86, 0xc6, 0x43, 0xc7, 0x73, + 0xf7, 0xe1, 0x4f, 0x8d, 0xe8, 0xfb, 0xb9, 0x30, 0x58, 0x5d, 0xf6, 0x41, + 0xc9, 0xe1, 0x6f, 0x44, 0x68, 0x68, 0xd5, 0xda, 0x4b, 0xcf, 0x67, 0xd7, + 0xcd, 0x77, 0x30, 0xb6, 0xa7, 0xc2, 0xea, 0x33, 0xd5, 0xbd, 0x42, 0xe4, + 0xb3, 0xc8, 0x46, 0x2b, 0x66, 0xfb, 0xe2, 0x21, 0xf8, 0xd0, 0x47, 0x77, + 0x50, 0x5c, 0x9e, 0x67, 0x75, 0xdf, 0x15, 0x6c, 0xfc, 0xf4, 0x15, 0x58, + 0x4b, 0x36, 0x00, 0x26, 0xde, 0xfe, 0x06, 0xc5, 0xe5, 0x79, 0x3c, 0xa0, + 0x5a, 0x55, 0x8b, 0x2d, 0x7d, 0x68, 0x16, 0x10, 0xc0, 0xb5, 0x1a, 0xd2, + 0x63, 0xed, 0x50, 0x99, 0x4a, 0xc5, 0x41, 0x08, 0x02, 0x50, 0x95, 0xff, + 0xbb, 0xf6, 0xdf, 0xbb, 0x8b, 0xcb, 0x8b, 0x21, 0x74, 0x2b, 0xf1, 0xbc, + 0x91, 0x91, 0xf7, 0xff, 0xd2, 0x29, 0x45, 0xec, 0x19, 0x0f, 0xc7, 0xa9, + 0x62, 0x59, 0xa5, 0xd8, 0x38, 0x81, 0xbf, 0xe8, 0x3b, 0x2f, 0xcc, 0xa0, + 0x6e, 0x8e, 0xeb, 0x42, 0x5e, 0x43, 0xb1, 0x9b, 0x20, 0x5b, 0xad, 0x48, + 0xdb, 0x28, 0x8d, 0x55, 0xaa, 0x1d, 0x7e, 0x95, 0x27, 0x5c, 0xf2, 0x42, + 0x60, 0xe4, 0x0d, 0x05, 0x24, 0x40, 0xad, 0xb1, 0x9f, 0xef, 0x6f, 0xef, + 0xdf, 0x41, 0x1f, 0x07, 0xd8, 0xf6, 0x5b, 0x16, 0x01, 0xaf, 0xd1, 0xff, + 0x92, 0x5a, 0xa4, 0x8f, 0x79, 0xfd, 0x0f, 0xe0, 0x8f, 0xfe, 0xdb, 0x2b, + 0xf8, 0xde, 0xdf, 0xfc, 0x26, 0x88, 0xff, 0x7f, 0xe8, 0xf3, 0x7c, 0xc4, + 0x46, 0x0d, 0x78, 0xa7, 0x76, 0x3b, 0x3a, 0x8f, 0xc7, 0x13, 0xf9, 0x03, + 0x9c, 0x00, 0xfc, 0xfb, 0x3c, 0xe5, 0xed, 0xa5, 0x5f, 0x26, 0x80, 0x55, + 0xaf, 0xee, 0x02, 0xb5, 0xfa, 0x5d, 0x29, 0x59, 0x16, 0xe8, 0x5d, 0x9e, + 0x55, 0xcd, 0x17, 0x79, 0xca, 0x8f, 0xa3, 0x8f, 0xc7, 0xa3, 0xa0, 0x5a, + 0xbf, 0xd4, 0xe7, 0x8f, 0x1e, 0xa9, 0x82, 0x15, 0x8a, 0xec, 0x4d, 0x78, + 0xf9, 0x60, 0x2b, 0x16, 0x15, 0x3a, 0xa2, 0x0f, 0x3e, 0x6f, 0x2b, 0x68, + 0x55, 0x41, 0x43, 0xab, 0x9e, 0x87, 0xdb, 0x1e, 0x52, 0xe7, 0x5f, 0x7b, + 0xe8, 0x05, 0x04, 0x0e, 0x67, 0x5d, 0xaa, 0x70, 0x53, 0x07, 0x80, 0x6d, + 0x5f, 0x18, 0xe1, 0xda, 0xcf, 0x54, 0x39, 0xa1, 0xb4, 0x95, 0xbd, 0x8b, + 0x8a, 0x31, 0xdb, 0x31, 0xe8, 0x95, 0x6d, 0x33, 0xb8, 0x58, 0x01, 0xae, + 0x6e, 0x7b, 0xb2, 0xc0, 0xde, 0x59, 0xf8, 0xc0, 0xca, 0xba, 0x76, 0xff, + 0x84, 0x57, 0x2d, 0x8e, 0x02, 0xb5, 0x14, 0x98, 0x0b, 0x14, 0x54, 0xea, + 0xb6, 0x27, 0x0b, 0x7c, 0xe0, 0x8f, 0x8a, 0x4c, 0xd5, 0x81, 0xc9, 0x9f, + 0xf0, 0x81, 0xb7, 0x2e, 0x06, 0x66, 0x99, 0x9a, 0x2c, 0xb2, 0x77, 0x11, + 0x31, 0x0d, 0x2e, 0x06, 0xea, 0xb0, 0x62, 0xa5, 0x7f, 0xbf, 0x5a, 0x0c, + 0x93, 0xb3, 0x40, 0x91, 0x0f, 0x9c, 0xa8, 0x00, 0x8e, 0x8f, 0x3f, 0xa4, + 0xa8, 0x5c, 0x15, 0xd4, 0xb5, 0x18, 0x7d, 0x73, 0x1d, 0x42, 0x52, 0xd1, + 0xed, 0x00, 0x70, 0x94, 0x06, 0x78, 0x55, 0x0a, 0x45, 0x6c, 0x22, 0x70, + 0x87, 0x1c, 0x94, 0x73, 0x2a, 0x2f, 0x75, 0x3d, 0xdb, 0x98, 0x6f, 0x3d, + 0x06, 0x1e, 0x9a, 0x85, 0xc2, 0xeb, 0xb1, 0x0b, 0xb3, 0xd8, 0x4f, 0x02, + 0x85, 0x02, 0x0e, 0x20, 0xf4, 0xb3, 0xda, 0x81, 0xf0, 0x47, 0xa5, 0xdd, + 0x3b, 0x92, 0x7e, 0xbd, 0xd4, 0x3a, 0x08, 0x04, 0xdd, 0x11, 0x7a, 0x3f, + 0x30, 0x22, 0x76, 0xae, 0x7e, 0xff, 0xdb, 0x3a, 0xc2, 0x37, 0xdc, 0xf8, + 0x7d, 0xb6, 0x7e, 0xbc, 0xd3, 0xbf, 0x9b, 0x46, 0xf7, 0x54, 0xa9, 0xd4, + 0x3c, 0xb6, 0x7c, 0x76, 0x35, 0x76, 0x53, 0xb0, 0xf2, 0xcf, 0x60, 0xec, + 0x2f, 0x55, 0x27, 0xae, 0xdc, 0x6f, 0x50, 0xa9, 0x79, 0x5c, 0x75, 0xd1, + 0x10, 0x50, 0x64, 0x6b, 0x30, 0x7c, 0x52, 0xe5, 0x96, 0xaf, 0xa8, 0x1e, + 0x64, 0x45, 0x8f, 0xbd, 0xae, 0x3f, 0x33, 0xcf, 0xae, 0x6a, 0xdc, 0x66, + 0xb9, 0xdf, 0x08, 0xe0, 0x59, 0xbe, 0x9c, 0x7a, 0x03, 0x1e, 0x75, 0xd9, + 0xf0, 0xe1, 0x35, 0xda, 0xc7, 0xb7, 0xdb, 0x69, 0x33, 0xaa, 0x5d, 0x3f, + 0xd4, 0xc0, 0x95, 0x0b, 0xbd, 0x00, 0xa8, 0x55, 0x6e, 0x7e, 0x95, 0x4a, + 0x4e, 0xf5, 0x47, 0x45, 0x46, 0x81, 0x4d, 0xb6, 0x7d, 0xd9, 0xa1, 0x7c, + 0x4a, 0x78, 0xb7, 0x2d, 0x9f, 0x22, 0x18, 0xbf, 0x47, 0xd9, 0x5b, 0x35, + 0x98, 0x67, 0x62, 0x6f, 0xd8, 0xdf, 0xaa, 0xf6, 0x43, 0xf9, 0x14, 0x83, + 0xca, 0xdd, 0x1e, 0x76, 0xdd, 0xbf, 0x53, 0xc7, 0x55, 0x2c, 0x1c, 0xec, + 0x53, 0x5b, 0x41, 0xb4, 0x00, 0xaa, 0xb5, 0xdd, 0x90, 0x01, 0x23, 0x63, + 0x05, 0x96, 0x43, 0xa0, 0xd6, 0xb0, 0x3e, 0x1a, 0x78, 0x52, 0x01, 0xb5, + 0x36, 0xbd, 0xab, 0x04, 0x19, 0xd8, 0xf2, 0xcd, 0x6b, 0x55, 0x58, 0xc6, + 0x22, 0x5f, 0xb0, 0xf0, 0x5c, 0x0f, 0x43, 0x14, 0x29, 0x9a, 0x25, 0x2a, + 0xb5, 0x31, 0x8c, 0xdc, 0x7a, 0x8c, 0x8c, 0x09, 0xb9, 0xf5, 0x3a, 0x9e, + 0x89, 0x07, 0x14, 0xfb, 0xca, 0x54, 0xa6, 0x77, 0x50, 0x1e, 0xd0, 0xfe, + 0xb9, 0x61, 0xa4, 0x1c, 0x23, 0x6f, 0x5a, 0x78, 0x33, 0x2e, 0x42, 0x14, + 0x03, 0xb7, 0x0f, 0xd1, 0xf2, 0x81, 0x5a, 0x49, 0x38, 0x17, 0x6d, 0x81, + 0x25, 0xc0, 0x91, 0x60, 0x09, 0x05, 0xd4, 0xf2, 0xaf, 0x3b, 0xaf, 0x0d, + 0x1e, 0x0a, 0xf6, 0x62, 0x65, 0x54, 0xd8, 0xc1, 0xb5, 0x52, 0x03, 0x68, + 0x51, 0x32, 0x46, 0xd9, 0x31, 0xa5, 0xda, 0xc3, 0x7f, 0x1e, 0x97, 0x06, + 0x2e, 0xd7, 0x90, 0xab, 0x22, 0xc5, 0xbe, 0x32, 0xf6, 0x4c, 0x05, 0x7b, + 0xa6, 0x12, 0x00, 0xc0, 0x2a, 0x53, 0xd7, 0x01, 0x50, 0x5e, 0x71, 0x15, + 0xc5, 0xbe, 0x32, 0xd5, 0xe9, 0x1d, 0x18, 0xb9, 0xe1, 0x20, 0x5c, 0xd5, + 0xdb, 0x07, 0x6b, 0x39, 0x91, 0xfa, 0x6a, 0x08, 0x59, 0xe2, 0x88, 0xdf, + 0x6e, 0xb5, 0x09, 0xfd, 0xf7, 0x30, 0xf1, 0x16, 0xd0, 0xc9, 0xed, 0xef, + 0xe1, 0x86, 0x10, 0x94, 0x55, 0x9b, 0x27, 0x5e, 0xd4, 0xcf, 0x4f, 0xf3, + 0xa7, 0x67, 0xc1, 0xfd, 0x35, 0xf5, 0x0f, 0xe0, 0x6b, 0x35, 0x98, 0x3e, + 0x6c, 0xf2, 0x53, 0xa8, 0xe9, 0x69, 0x35, 0x8e, 0xb4, 0x0e, 0x18, 0x58, + 0x47, 0x7c, 0x50, 0xe9, 0x30, 0x34, 0x35, 0x00, 0x23, 0x03, 0x30, 0x32, + 0x12, 0x02, 0xbb, 0xfb, 0xce, 0x02, 0x66, 0x0e, 0xcf, 0xee, 0xc8, 0x00, + 0xac, 0xd3, 0x83, 0x5c, 0x23, 0x87, 0x33, 0xd8, 0x76, 0x38, 0xea, 0x06, + 0xce, 0xf2, 0xfd, 0x7b, 0xc5, 0x47, 0x6f, 0xda, 0x92, 0xb8, 0xe7, 0x27, + 0xa1, 0xb6, 0x51, 0x1b, 0xd1, 0xb1, 0xdf, 0x5e, 0x0a, 0x36, 0x8c, 0xa9, + 0x39, 0xc8, 0xfe, 0x38, 0x30, 0x51, 0x4c, 0xdb, 0xbd, 0xcb, 0x1a, 0xe4, + 0x2f, 0x3a, 0xbe, 0x23, 0x4a, 0x29, 0x31, 0x6a, 0x5d, 0xc6, 0x80, 0xce, + 0x59, 0x8d, 0xdb, 0x70, 0x10, 0xf9, 0x3c, 0xc6, 0x9e, 0x70, 0x1c, 0x41, + 0xca, 0xe8, 0x0f, 0x3e, 0x0e, 0xd6, 0x42, 0xb4, 0x82, 0x7a, 0x1a, 0x05, + 0x83, 0x6c, 0x26, 0x4f, 0x75, 0xc6, 0x85, 0x76, 0x8b, 0x55, 0x7f, 0xbf, + 0x89, 0xec, 0x5f, 0x6f, 0xc3, 0x99, 0xa9, 0x20, 0x85, 0xa1, 0x92, 0x16, + 0xf2, 0x08, 0xe1, 0x75, 0x42, 0xb2, 0xf4, 0xcb, 0x66, 0x37, 0x78, 0xd6, + 0x4b, 0x09, 0xd4, 0x92, 0x19, 0xa8, 0xb5, 0x05, 0x79, 0x01, 0x45, 0x4b, + 0x30, 0x61, 0x7b, 0xb1, 0xf7, 0xde, 0x55, 0x05, 0x05, 0xb4, 0x92, 0x28, + 0x4f, 0x7f, 0xe8, 0xa4, 0x28, 0x25, 0x95, 0x00, 0xfa, 0x12, 0x1f, 0xa3, + 0x08, 0xcb, 0x0d, 0x65, 0x13, 0x2a, 0x6e, 0xdc, 0xaf, 0xa8, 0xad, 0xdb, + 0x08, 0x1c, 0x21, 0xc8, 0xb7, 0x05, 0x25, 0xa1, 0xfa, 0x25, 0xab, 0x11, + 0x8c, 0x21, 0xd1, 0xff, 0x01, 0xb0, 0xba, 0x5f, 0x30, 0xe1, 0xc6, 0x61, + 0xa2, 0x76, 0x06, 0x8a, 0x6d, 0x75, 0x04, 0x28, 0x65, 0x3a, 0xc1, 0x5a, + 0xa5, 0x9c, 0x02, 0x5b, 0xb5, 0xf4, 0x77, 0x85, 0x89, 0xa6, 0x2a, 0xa5, + 0x95, 0x01, 0x5b, 0x53, 0xbe, 0xd4, 0xf5, 0x95, 0x05, 0x5a, 0xc8, 0x76, + 0x2b, 0x76, 0x3d, 0xad, 0xcc, 0x80, 0x93, 0x11, 0x34, 0x22, 0xd7, 0xd7, + 0x4a, 0x80, 0x4c, 0x98, 0xbf, 0x20, 0x4f, 0x39, 0x07, 0x95, 0x66, 0x83, + 0x72, 0x2e, 0x4f, 0xa5, 0x19, 0x3e, 0x6f, 0x5b, 0x12, 0x8a, 0x66, 0x1e, + 0xd7, 0x6b, 0xc4, 0xae, 0xd1, 0x6a, 0x53, 0xbd, 0xc1, 0xda, 0x19, 0x55, + 0x9e, 0xb2, 0x1e, 0xca, 0x29, 0xe6, 0x14, 0x60, 0xcb, 0x6f, 0x49, 0x2b, + 0xa3, 0x40, 0x5b, 0x41, 0x0b, 0xeb, 0x00, 0x1f, 0xa6, 0xe5, 0xb7, 0x6f, + 0xd5, 0xa3, 0x03, 0xbe, 0x3c, 0x97, 0x9e, 0x39, 0x79, 0x92, 0xd7, 0x3c, + 0x16, 0x87, 0x43, 0x55, 0xc5, 0x24, 0x25, 0x0d, 0x93, 0xfa, 0xed, 0xa9, + 0xbf, 0x39, 0x6c, 0xa8, 0x56, 0x2f, 0x00, 0xd5, 0x19, 0xab, 0xcb, 0x38, + 0xfb, 0x55, 0x1f, 0xd8, 0x89, 0x8c, 0x15, 0x59, 0x91, 0x71, 0xa4, 0x27, + 0x9f, 0xd8, 0x87, 0xb5, 0xa4, 0xc0, 0xb3, 0x07, 0x38, 0x6c, 0xf5, 0x02, + 0x6a, 0x8d, 0x8a, 0x49, 0x4e, 0x3a, 0x36, 0x04, 0x6b, 0x25, 0xe1, 0x5b, + 0xa3, 0x62, 0x92, 0xb7, 0x9c, 0x14, 0x7f, 0x77, 0xca, 0x66, 0x7a, 0x83, + 0xb8, 0xba, 0xb5, 0xe9, 0xc1, 0xea, 0xb1, 0xdf, 0x4c, 0x72, 0xc2, 0xd1, + 0xc7, 0xf0, 0xa5, 0x4f, 0xf9, 0xa0, 0xad, 0xe5, 0x9c, 0xfc, 0x0a, 0xe5, + 0xef, 0x6b, 0xd6, 0x79, 0x86, 0x67, 0x9e, 0x9b, 0x85, 0xe3, 0x17, 0x48, + 0xf3, 0x8d, 0xc8, 0x76, 0x3d, 0xcc, 0x82, 0x41, 0xbe, 0x60, 0x76, 0x6c, + 0x66, 0x24, 0xb2, 0x02, 0x39, 0xa3, 0x36, 0x9a, 0x98, 0x68, 0x4f, 0x32, + 0x71, 0xe7, 0x24, 0xc2, 0x10, 0x6c, 0xbf, 0xfb, 0x16, 0x36, 0x5c, 0xb8, + 0x1a, 0x90, 0x94, 0x96, 0xaf, 0x02, 0x60, 0xdb, 0xed, 0x5b, 0x11, 0x86, + 0x60, 0xf8, 0x94, 0x22, 0x4e, 0x64, 0x73, 0x8a, 0xbc, 0xbe, 0x3e, 0x3d, + 0xd7, 0xa6, 0x81, 0x49, 0x91, 0x22, 0x14, 0xc2, 0x7b, 0x70, 0xb6, 0xa0, + 0xbe, 0x7d, 0x47, 0xc1, 0x5a, 0xbb, 0xee, 0x51, 0xe9, 0xd7, 0x9e, 0x33, + 0x8c, 0xbb, 0xdf, 0xc5, 0xdd, 0xef, 0x82, 0xc8, 0x43, 0x5b, 0x2a, 0xe0, + 0x70, 0xae, 0x18, 0xce, 0x25, 0x98, 0x95, 0x8c, 0x3e, 0x38, 0x4a, 0x7f, + 0xa1, 0x3f, 0x56, 0xf6, 0xac, 0xc8, 0x06, 0x10, 0x2d, 0x1f, 0x84, 0xd5, + 0x4d, 0x02, 0x83, 0x16, 0x1e, 0x79, 0x4b, 0xd0, 0xd0, 0xc4, 0x54, 0xe9, + 0x39, 0x64, 0xf5, 0x77, 0xd5, 0x86, 0xe7, 0x60, 0xf6, 0x59, 0xe4, 0x2d, + 0x11, 0x40, 0xb0, 0xf2, 0x96, 0x40, 0x36, 0xa0, 0xe1, 0x48, 0xac, 0x65, + 0x82, 0xb1, 0x1f, 0x8e, 0x23, 0x32, 0x61, 0x1e, 0x7e, 0x5c, 0xa9, 0xe7, + 0x1b, 0xe4, 0xf5, 0x78, 0x67, 0xde, 0x12, 0xc8, 0xfd, 0x7a, 0xa3, 0xbd, + 0x36, 0x0a, 0x08, 0xd6, 0x52, 0x73, 0x44, 0x5c, 0x17, 0x6c, 0xcf, 0x26, + 0x4b, 0x11, 0x90, 0x64, 0x33, 0xea, 0x3c, 0x56, 0x56, 0x91, 0x05, 0x29, + 0x11, 0xa2, 0xd7, 0x56, 0x67, 0x4a, 0xd6, 0x39, 0x45, 0x05, 0x1f, 0x4b, + 0x4a, 0x83, 0x9c, 0x9c, 0x7b, 0x6c, 0x58, 0x26, 0x3a, 0xc3, 0x7c, 0xbf, + 0x65, 0x02, 0x6b, 0x85, 0x15, 0x87, 0x6b, 0xf9, 0x7e, 0x53, 0x4e, 0xd7, + 0x30, 0x65, 0xb8, 0x33, 0xcb, 0xa1, 0xb7, 0x9f, 0x1a, 0x1c, 0xc7, 0xbf, + 0xfb, 0x63, 0xfa, 0xcc, 0x78, 0x47, 0xeb, 0x5f, 0xbe, 0xf5, 0x3d, 0x38, + 0x43, 0xc4, 0x21, 0x53, 0xbe, 0x3d, 0xed, 0x17, 0x80, 0xbe, 0x96, 0x89, + 0xb0, 0x9c, 0x09, 0x28, 0x55, 0x34, 0xce, 0x77, 0xf7, 0xec, 0xe6, 0x31, + 0xab, 0xd2, 0xbb, 0x2e, 0x7e, 0x1e, 0x3d, 0x6c, 0x75, 0xc4, 0xe9, 0x75, + 0x9e, 0xd0, 0x42, 0x60, 0x65, 0x4b, 0x7e, 0xd6, 0x09, 0xbf, 0x7f, 0x16, + 0x9b, 0xe3, 0x16, 0x2d, 0x55, 0xee, 0x14, 0xa6, 0x95, 0x2a, 0x55, 0xaa, + 0x54, 0xa9, 0x52, 0xa5, 0x4a, 0x95, 0x2a, 0x55, 0xaa, 0x54, 0xa9, 0x52, + 0xa5, 0x4a, 0x95, 0x2a, 0x55, 0xaa, 0x54, 0xa9, 0x52, 0xa5, 0x4a, 0x95, + 0x2a, 0x55, 0xaa, 0x54, 0x47, 0x54, 0x2f, 0xa3, 0x65, 0x8c, 0xa9, 0x52, + 0xa5, 0x4a, 0x95, 0x2a, 0x55, 0xaa, 0xa4, 0x44, 0x46, 0xe0, 0x79, 0x1e, + 0x5e, 0xd3, 0xa3, 0xbf, 0xaf, 0x3f, 0x80, 0x6a, 0x45, 0x41, 0x53, 0xb2, + 0x2d, 0xb1, 0xfa, 0x2c, 0x3c, 0x2f, 0xbe, 0xb8, 0xc5, 0x07, 0x43, 0xf9, + 0x10, 0xac, 0x24, 0x58, 0xca, 0xec, 0x33, 0x69, 0xd4, 0x43, 0x88, 0x96, + 0xd3, 0x74, 0x02, 0x20, 0x89, 0xd3, 0x74, 0xba, 0x1e, 0x93, 0xea, 0x16, + 0x2e, 0x72, 0x02, 0xab, 0xcf, 0xa2, 0x3a, 0x5d, 0xed, 0x9a, 0xa6, 0x97, + 0xaa, 0x8f, 0x56, 0x83, 0xf2, 0xf9, 0x65, 0x8f, 0x02, 0x8d, 0xa2, 0xb0, + 0x2c, 0xd7, 0x75, 0x71, 0x5d, 0x37, 0x80, 0x60, 0xc9, 0xb6, 0xd4, 0x93, + 0xb5, 0x15, 0x6e, 0xc9, 0x07, 0x62, 0x45, 0xe1, 0x58, 0x46, 0xce, 0x08, + 0x77, 0x6d, 0x8e, 0xd8, 0xb5, 0xa7, 0xed, 0xc0, 0xdf, 0x9e, 0x56, 0x6d, + 0x65, 0x18, 0x2a, 0xae, 0x9f, 0x67, 0xa3, 0x19, 0x5f, 0xc4, 0xed, 0xe9, + 0x9d, 0x90, 0x5d, 0x57, 0xed, 0x16, 0xed, 0xdb, 0x13, 0x42, 0x74, 0x59, + 0x62, 0x74, 0x70, 0x92, 0x32, 0x5c, 0xca, 0x2b, 0x89, 0x60, 0x72, 0x44, + 0x38, 0xe9, 0x39, 0xea, 0x27, 0xa4, 0x42, 0x6c, 0xc9, 0xb6, 0x44, 0x9a, + 0x06, 0x46, 0xdd, 0x83, 0xa6, 0x54, 0x70, 0x2d, 0xd3, 0x20, 0xb6, 0x45, + 0xb4, 0xeb, 0x41, 0x5b, 0xef, 0xc0, 0xdc, 0xaf, 0x26, 0xeb, 0x39, 0x4b, + 0x04, 0xd8, 0x61, 0xa9, 0xb3, 0xcb, 0xf5, 0x24, 0x3e, 0x47, 0xe7, 0x64, + 0x19, 0x88, 0xf1, 0x30, 0xbc, 0xf1, 0x66, 0x83, 0x06, 0xb0, 0xea, 0x89, + 0x06, 0x8e, 0x9e, 0x78, 0xee, 0x0c, 0x19, 0xb0, 0x3f, 0x02, 0xf4, 0x59, + 0x22, 0xf4, 0xb9, 0xce, 0xd7, 0x12, 0xb0, 0xdb, 0x65, 0xe3, 0xee, 0x2b, + 0x3b, 0xea, 0x1b, 0x05, 0x5e, 0xb1, 0xc6, 0x54, 0xfb, 0x3d, 0xb7, 0x89, + 0xa7, 0x5f, 0x12, 0xfe, 0xbd, 0x5a, 0xfb, 0x25, 0xd6, 0x8c, 0xa4, 0x31, + 0x64, 0x90, 0xaf, 0x78, 0x34, 0xca, 0x06, 0xec, 0x57, 0xc5, 0x5d, 0x8b, + 0x02, 0x6b, 0x01, 0x4c, 0xb4, 0x1b, 0xd0, 0x94, 0xb0, 0xbc, 0xa5, 0x16, + 0xa9, 0x9c, 0xa9, 0x97, 0xc0, 0xee, 0x71, 0xd9, 0xf8, 0x51, 0x5d, 0x8e, + 0x3e, 0x7f, 0xb7, 0x6a, 0x89, 0xb5, 0x8f, 0x60, 0x02, 0xa4, 0xf4, 0xf4, + 0x6f, 0x4c, 0xf8, 0x3b, 0x86, 0x87, 0x45, 0x6c, 0xf4, 0xfb, 0xc0, 0x32, + 0xc2, 0x55, 0x3d, 0x3d, 0x24, 0x84, 0x89, 0x94, 0x6e, 0x70, 0xf4, 0xe5, + 0xba, 0xd5, 0x10, 0xd6, 0xe4, 0x56, 0x31, 0xcd, 0x12, 0x34, 0x55, 0xb8, + 0x91, 0x33, 0xf1, 0x9a, 0xdd, 0x29, 0x0b, 0xbd, 0xfd, 0xc3, 0x36, 0x34, + 0x72, 0xc5, 0x8e, 0xc9, 0xce, 0xbe, 0x5f, 0x32, 0x2c, 0x79, 0x9e, 0x4c, + 0x37, 0x5f, 0x5e, 0x00, 0x86, 0x69, 0x60, 0x99, 0x16, 0x86, 0x51, 0x0e, + 0x00, 0x4f, 0xa5, 0x15, 0x6a, 0xd1, 0x74, 0x4b, 0xaa, 0xb8, 0x6e, 0x2d, + 0x2c, 0x77, 0x34, 0x4f, 0x7b, 0x1a, 0x36, 0xfc, 0xc5, 0x06, 0x86, 0xcf, + 0x51, 0x8b, 0xd5, 0x26, 0xf6, 0x4e, 0x70, 0xf1, 0x9f, 0x5d, 0x0c, 0xc0, + 0xaa, 0xc1, 0x55, 0x4c, 0xec, 0x0d, 0x21, 0x27, 0x52, 0x4a, 0xf2, 0x7d, + 0x60, 0x4f, 0x75, 0x2f, 0xaf, 0x61, 0x1a, 0x94, 0x57, 0xa8, 0x32, 0x04, + 0xf7, 0x38, 0xd3, 0xa4, 0xe1, 0x35, 0x20, 0xa7, 0xe1, 0x4a, 0xae, 0x17, + 0x6b, 0x5f, 0xdf, 0x6d, 0xe4, 0x4c, 0x8a, 0x83, 0x56, 0x07, 0x04, 0xca, + 0x22, 0x5c, 0xb8, 0xee, 0xba, 0x73, 0xc3, 0x96, 0x76, 0xef, 0xd9, 0x8d, + 0x5d, 0xb3, 0x31, 0x4d, 0x93, 0x96, 0x6c, 0x29, 0x38, 0x56, 0x5b, 0x2a, + 0x58, 0x45, 0x62, 0x37, 0xe4, 0x2d, 0x9f, 0xdd, 0xc2, 0xa6, 0x8f, 0x6d, + 0x60, 0xcb, 0xe7, 0xb7, 0x92, 0x37, 0x2c, 0x5a, 0xb2, 0x11, 0xc0, 0xb4, + 0x1a, 0xf5, 0x46, 0x30, 0x41, 0xdb, 0xd7, 0xc4, 0xde, 0x09, 0x56, 0x0d, + 0xae, 0xa2, 0x5a, 0xd5, 0x8b, 0x24, 0xf5, 0x8a, 0x76, 0xbf, 0xbd, 0xc7, + 0xc6, 0xc7, 0xba, 0xc2, 0xb8, 0xaa, 0x53, 0x55, 0x0d, 0x90, 0x52, 0xf7, + 0xf8, 0x46, 0xb3, 0xa1, 0xef, 0x65, 0x82, 0xab, 0x3e, 0xbd, 0x21, 0x88, + 0x77, 0xdd, 0xff, 0xb3, 0x25, 0x96, 0x6e, 0xd7, 0x83, 0x63, 0x38, 0x8e, + 0x0d, 0x1c, 0xda, 0xee, 0xf6, 0xbd, 0xd2, 0xf8, 0x20, 0x2d, 0x3f, 0xbc, + 0x57, 0x3c, 0x3b, 0xb2, 0x58, 0xc9, 0x28, 0x84, 0x4b, 0xd7, 0xaf, 0xfa, + 0xf4, 0x26, 0x00, 0xde, 0xf5, 0x9e, 0x77, 0x75, 0xb5, 0x3b, 0x5f, 0xfe, + 0x7e, 0x5b, 0x44, 0x55, 0x79, 0xb8, 0x82, 0xb5, 0xce, 0xe2, 0x43, 0x1f, + 0xdd, 0xc8, 0x0d, 0x7f, 0x77, 0x2d, 0x5b, 0xab, 0x5b, 0xbb, 0xa6, 0x8d, + 0x4a, 0x01, 0xae, 0xc2, 0xe3, 0xe1, 0xca, 0xb7, 0x31, 0x97, 0xbd, 0xd0, + 0xff, 0x5c, 0x3e, 0xfe, 0xf1, 0xbb, 0x83, 0xb3, 0xc3, 0x85, 0x69, 0xf9, + 0xfe, 0x37, 0xf6, 0x80, 0x6c, 0x45, 0x75, 0x30, 0xf5, 0x5e, 0x48, 0x9d, + 0xba, 0xd9, 0x5e, 0xa8, 0x0e, 0x26, 0xfe, 0x91, 0xf8, 0x1b, 0xc9, 0x4d, + 0x27, 0x73, 0xde, 0x96, 0xc7, 0x90, 0x9b, 0x4e, 0x06, 0xe0, 0xbe, 0x89, + 0xc7, 0x90, 0x7f, 0x79, 0xf2, 0x11, 0xb0, 0x9c, 0xea, 0x7f, 0x35, 0x19, + 0x6f, 0x58, 0x8b, 0x17, 0x59, 0x08, 0x74, 0xa8, 0xf2, 0x66, 0x46, 0x59, + 0x73, 0x1a, 0x64, 0x23, 0xeb, 0x3c, 0xcd, 0x42, 0x1c, 0x38, 0x32, 0xbe, + 0xbb, 0x4a, 0x71, 0x3e, 0x26, 0xa4, 0x30, 0xe9, 0xb6, 0xb8, 0xfd, 0x48, + 0xc9, 0x7b, 0xf8, 0x8e, 0x85, 0x81, 0xb2, 0x7e, 0xf2, 0x1d, 0xae, 0x07, + 0xae, 0x04, 0xd8, 0x1d, 0x81, 0xd6, 0xc8, 0x16, 0xd4, 0x5d, 0xb8, 0xfe, + 0x77, 0x00, 0xda, 0x5a, 0xa0, 0xae, 0xbd, 0x35, 0xdb, 0x23, 0xa4, 0x04, + 0xff, 0x3c, 0x77, 0xda, 0xcd, 0x91, 0xb6, 0xfe, 0xce, 0x17, 0x54, 0x3d, + 0x9d, 0x08, 0x70, 0xea, 0x82, 0xf7, 0x9c, 0x7f, 0xb8, 0xc5, 0x7b, 0xc9, + 0x15, 0x05, 0x6a, 0x85, 0x7e, 0x22, 0xb6, 0x10, 0x55, 0x98, 0x09, 0x78, + 0xa5, 0x29, 0x90, 0x51, 0xa0, 0x55, 0x8e, 0x4e, 0x25, 0xa0, 0x58, 0x22, + 0x02, 0xc4, 0x0a, 0x5a, 0xc8, 0xc8, 0x87, 0x97, 0x6b, 0x2f, 0x1b, 0xf3, + 0xa6, 0x3f, 0x34, 0xb0, 0x56, 0x1c, 0x3b, 0xda, 0x79, 0xbe, 0x10, 0x25, + 0xe3, 0xde, 0x7b, 0xef, 0xbd, 0xbc, 0xe3, 0x1d, 0xef, 0x60, 0xcf, 0xf7, + 0xc6, 0x78, 0xcb, 0xe9, 0xab, 0x98, 0xbc, 0xf7, 0xde, 0x58, 0x7e, 0x2f, + 0x05, 0x58, 0xeb, 0xd7, 0xc0, 0x32, 0x60, 0xe0, 0x94, 0xd7, 0x31, 0xf5, + 0xb8, 0x43, 0xf3, 0xc0, 0x01, 0x66, 0x5f, 0x78, 0x9e, 0x3c, 0x70, 0xda, + 0x29, 0xaf, 0x63, 0xf7, 0xc4, 0x4f, 0xbb, 0xc2, 0x85, 0x92, 0x4a, 0xd6, + 0x25, 0xd9, 0x2e, 0x51, 0x49, 0xe0, 0xad, 0xff, 0xf5, 0xdc, 0xe0, 0x7c, + 0xa0, 0x7c, 0x2a, 0xd3, 0xd3, 0xd3, 0x9c, 0xf6, 0xb6, 0x73, 0x00, 0x38, + 0x6d, 0xd5, 0x69, 0x3c, 0xf4, 0x3f, 0xee, 0xee, 0x92, 0x72, 0x7e, 0x1d, + 0x89, 0xbf, 0x0b, 0xc0, 0xae, 0xa1, 0x32, 0x5f, 0x7d, 0x9f, 0x05, 0x14, + 0xe1, 0x42, 0x68, 0x08, 0x41, 0x65, 0xa7, 0x82, 0x13, 0x6e, 0xf9, 0x93, + 0xed, 0x0c, 0xff, 0x99, 0xba, 0x99, 0x16, 0x97, 0xe9, 0x77, 0x90, 0x3d, + 0x3b, 0xf0, 0x3c, 0xf5, 0x1b, 0xfe, 0xc2, 0x97, 0xab, 0x64, 0x97, 0x18, + 0xf0, 0x02, 0x6c, 0xf8, 0xf4, 0xe5, 0x38, 0xc0, 0xf8, 0x38, 0x0c, 0xad, + 0x11, 0x8c, 0xef, 0x81, 0xa1, 0x33, 0xa1, 0x94, 0x11, 0xdc, 0xb4, 0x5b, + 0x72, 0xd9, 0x1a, 0x55, 0xb2, 0xed, 0x7b, 0x60, 0x8d, 0x66, 0x9d, 0x14, + 0xdb, 0x7a, 0x71, 0x26, 0x21, 0xb4, 0x66, 0xd7, 0x1e, 0xb8, 0xfc, 0xd2, + 0xf3, 0xb9, 0xfc, 0xd2, 0xf3, 0xd9, 0xb6, 0x47, 0xf9, 0xdd, 0xf0, 0x61, + 0xc1, 0x36, 0xc5, 0x07, 0x66, 0xed, 0x1a, 0xd8, 0xb5, 0x1b, 0xf2, 0x06, + 0xac, 0xbd, 0x74, 0x0d, 0xdb, 0x3e, 0x72, 0x1d, 0xc5, 0x33, 0x46, 0x19, + 0x3e, 0xa7, 0x0c, 0x8c, 0xe1, 0xec, 0xaf, 0x02, 0x06, 0x42, 0x18, 0xd8, + 0x76, 0x95, 0xe1, 0x0f, 0xaf, 0x67, 0xf3, 0x35, 0x55, 0x8a, 0xfd, 0x97, + 0x23, 0x06, 0x54, 0x19, 0x2e, 0x5f, 0x03, 0xdb, 0x76, 0xc3, 0xb6, 0x4b, + 0xcf, 0xc7, 0x11, 0x22, 0xa0, 0x4e, 0x6c, 0xd6, 0xfe, 0x97, 0xfb, 0x2c, + 0x96, 0x88, 0xb6, 0xed, 0x06, 0x6a, 0xdb, 0x3a, 0xfc, 0x3b, 0x20, 0x5b, + 0x8d, 0x46, 0x70, 0x14, 0x11, 0x90, 0x57, 0x56, 0x80, 0xbb, 0xaf, 0x41, + 0xc3, 0xf3, 0x58, 0x7d, 0x66, 0x99, 0x5d, 0xe3, 0xe3, 0x58, 0xcb, 0xc2, + 0x7b, 0xbe, 0x82, 0xef, 0x64, 0xa9, 0x56, 0x6d, 0xca, 0xe5, 0x10, 0x3c, + 0xb8, 0x76, 0x68, 0x48, 0xd9, 0x93, 0x1e, 0xd5, 0xaa, 0x4d, 0x43, 0x4a, + 0xca, 0xcb, 0xcd, 0x08, 0x00, 0x0c, 0xe4, 0x31, 0x9d, 0xe5, 0x7d, 0x29, + 0xf4, 0xbd, 0xbf, 0xf9, 0x4d, 0x00, 0xd6, 0xf2, 0x8f, 0x2f, 0x17, 0xbd, + 0xa6, 0x07, 0xc8, 0x6a, 0xb6, 0x0b, 0xf4, 0xea, 0x77, 0xa1, 0x64, 0x79, + 0x5e, 0xd7, 0x7c, 0x31, 0x00, 0x67, 0x81, 0x82, 0x68, 0xfd, 0x12, 0x58, + 0x0d, 0x01, 0x68, 0xeb, 0x88, 0x01, 0xb5, 0x0e, 0x51, 0x0a, 0x5a, 0xa5, + 0x60, 0x56, 0x83, 0xcf, 0xdb, 0xfa, 0xbc, 0xce, 0xd7, 0xce, 0x15, 0xac, + 0xef, 0x71, 0x47, 0x7e, 0xaa, 0xba, 0x81, 0x95, 0x67, 0xee, 0x88, 0xf9, + 0xed, 0x9d, 0x0d, 0xdd, 0xaf, 0x8a, 0xac, 0x43, 0xff, 0xc0, 0x89, 0x75, + 0x6e, 0xa3, 0xc8, 0x6d, 0x3e, 0x80, 0xab, 0x50, 0xe4, 0x57, 0xc0, 0x6b, + 0x9f, 0x0f, 0xdf, 0x5f, 0x6f, 0x7b, 0x68, 0x16, 0x0a, 0xc5, 0x00, 0xfc, + 0x75, 0x9b, 0x06, 0x61, 0xb1, 0xa8, 0x08, 0xff, 0x13, 0xa8, 0x17, 0x00, + 0x9b, 0xc1, 0xe7, 0x81, 0x95, 0x3e, 0x38, 0x0b, 0xd0, 0x4c, 0xc4, 0xa9, + 0xc9, 0x28, 0x98, 0x4b, 0xc1, 0xb7, 0x56, 0x44, 0xca, 0x76, 0xd2, 0x79, + 0x6f, 0xa4, 0xf2, 0x50, 0xa4, 0x80, 0xbe, 0x0a, 0x45, 0xa8, 0xdb, 0x90, + 0x58, 0x37, 0x5f, 0xae, 0x43, 0x25, 0xc2, 0x20, 0x2b, 0x03, 0xd4, 0xfd, + 0x34, 0x00, 0x45, 0x2a, 0x1a, 0xa2, 0xe5, 0xdb, 0x9d, 0x7a, 0xd8, 0xc6, + 0x1f, 0xec, 0x5a, 0x71, 0xda, 0x1a, 0xca, 0xc0, 0x8b, 0x8b, 0xe1, 0xa8, + 0x3a, 0xdc, 0xfa, 0x88, 0xbe, 0x91, 0xe9, 0x9b, 0xce, 0x8a, 0xd3, 0x7a, + 0x83, 0xd4, 0x5f, 0xb5, 0x18, 0xde, 0xf9, 0x5f, 0x16, 0xf3, 0xec, 0x8f, + 0x7a, 0x46, 0x99, 0x53, 0x07, 0x8f, 0x6a, 0x52, 0x8a, 0x02, 0xb5, 0xae, + 0xf9, 0xfa, 0xf7, 0xb9, 0xfa, 0xfd, 0x6f, 0xe3, 0x9a, 0xaf, 0x7f, 0x9f, + 0xea, 0x17, 0x2f, 0x08, 0xfc, 0x17, 0x0a, 0xd4, 0x82, 0x10, 0x60, 0xe5, + 0x1f, 0x87, 0xce, 0x29, 0x31, 0x76, 0x7d, 0x7c, 0x6c, 0xae, 0xf2, 0x84, + 0xcb, 0xe8, 0xc3, 0xe1, 0x75, 0xd0, 0xb9, 0x8d, 0x40, 0xa7, 0xbd, 0xa4, + 0x3b, 0xaa, 0xf3, 0x81, 0xb1, 0x27, 0x54, 0x1e, 0xbe, 0xdd, 0xb9, 0x6c, + 0x46, 0x6d, 0xdd, 0x32, 0x38, 0xc1, 0x09, 0xef, 0x39, 0x41, 0xfb, 0x9e, + 0xcd, 0x90, 0x54, 0x7d, 0xbf, 0xea, 0x94, 0xb2, 0xb7, 0xba, 0xdf, 0x60, + 0x62, 0xa7, 0x4b, 0xe9, 0x4a, 0xf5, 0x6c, 0xf4, 0x81, 0x5a, 0x7e, 0x3f, + 0xac, 0x34, 0xa8, 0xee, 0xfb, 0x15, 0x0d, 0xd7, 0xaa, 0x3e, 0x22, 0x29, + 0xad, 0x31, 0xb0, 0x6f, 0xee, 0xfd, 0xce, 0x61, 0xd7, 0x25, 0x4c, 0xd9, + 0xf4, 0xbe, 0x1a, 0x42, 0x89, 0x4c, 0x9e, 0x7c, 0xc1, 0xc0, 0x71, 0x6d, + 0x05, 0x68, 0x6a, 0x37, 0xa8, 0x35, 0xb7, 0x63, 0x88, 0x35, 0x78, 0x72, + 0x77, 0x10, 0xcf, 0x93, 0xa3, 0x18, 0xe2, 0xe2, 0xe0, 0x7c, 0x78, 0x40, + 0x8d, 0x71, 0x8d, 0x4e, 0x5f, 0x0b, 0x5c, 0x8b, 0x02, 0xec, 0xae, 0xa4, + 0x51, 0xef, 0x3e, 0x56, 0xe7, 0xb5, 0x5d, 0x05, 0x87, 0x32, 0x3e, 0x1a, + 0xf8, 0x35, 0x5c, 0x87, 0xfe, 0x9c, 0x7a, 0x26, 0x19, 0x19, 0x3d, 0x26, + 0x8b, 0x45, 0x23, 0x32, 0xde, 0xe7, 0xbb, 0xa3, 0x10, 0x2a, 0xaf, 0x39, + 0x8a, 0x07, 0xf4, 0x1b, 0x97, 0x05, 0xe1, 0x96, 0x00, 0xa7, 0x2d, 0x83, + 0xa3, 0x91, 0x31, 0x14, 0x48, 0x0b, 0x05, 0xd9, 0x6a, 0xb5, 0x0d, 0xbc, + 0x36, 0x38, 0x78, 0x58, 0xc2, 0xe8, 0x81, 0x65, 0x76, 0x80, 0xf0, 0x85, + 0xd0, 0xca, 0x14, 0x81, 0x16, 0x36, 0xd1, 0xf1, 0x3d, 0x0d, 0xc4, 0x14, + 0x45, 0xa4, 0xb4, 0x63, 0x65, 0xf5, 0x55, 0xec, 0x2b, 0x53, 0x99, 0x1a, + 0xed, 0xf0, 0x6f, 0xb8, 0x0e, 0xa6, 0xae, 0x2f, 0x01, 0x24, 0x4c, 0x01, + 0xb3, 0x8c, 0xdc, 0x7a, 0xbc, 0x88, 0x3d, 0x1f, 0xa0, 0xe5, 0xc3, 0xc8, + 0xfc, 0xf3, 0xc3, 0x51, 0xbf, 0x3e, 0xde, 0x4f, 0x27, 0x1c, 0xab, 0x5f, + 0xff, 0xab, 0x11, 0x2a, 0x1a, 0x56, 0x4b, 0x84, 0xf5, 0xeb, 0xff, 0xf9, + 0x30, 0xad, 0x9a, 0x3e, 0x1e, 0x49, 0xa0, 0x96, 0xaf, 0x8d, 0xeb, 0x60, + 0x7a, 0xa7, 0xfa, 0xc7, 0xc0, 0x11, 0x61, 0x6a, 0x05, 0x5a, 0x37, 0x30, + 0xc0, 0xc0, 0xba, 0x75, 0xec, 0xfc, 0xc4, 0x08, 0x33, 0xf7, 0x73, 0xd8, + 0xc6, 0xd7, 0xed, 0x8c, 0xb8, 0x0f, 0xcf, 0xd4, 0x21, 0x4b, 0x0e, 0x58, + 0xea, 0xbd, 0x3f, 0xa3, 0xdf, 0xb3, 0xdb, 0x2d, 0xf5, 0x2e, 0xf7, 0x68, + 0xe4, 0xaa, 0xef, 0x01, 0xb3, 0x8a, 0x01, 0xb4, 0xba, 0x9c, 0x43, 0x17, + 0xd0, 0x56, 0xc2, 0xaf, 0x5b, 0x38, 0x80, 0x31, 0xe3, 0xa8, 0x3e, 0x66, + 0xbf, 0xa5, 0x66, 0x42, 0x0d, 0x96, 0x54, 0x99, 0x12, 0xb0, 0x2f, 0xd9, + 0x6f, 0x21, 0x0c, 0x75, 0x9f, 0xf4, 0x3c, 0xf5, 0xbd, 0x4f, 0x02, 0x86, + 0xde, 0x74, 0xc1, 0x98, 0x76, 0x22, 0x33, 0xa9, 0xf4, 0x5b, 0x9e, 0x00, + 0xee, 0x19, 0xc3, 0x00, 0xe4, 0x39, 0x79, 0xdc, 0xc1, 0x62, 0x00, 0x6a, + 0x01, 0x30, 0x1f, 0x9c, 0x44, 0x22, 0x31, 0x82, 0x4d, 0x59, 0x44, 0x98, + 0x3c, 0x3c, 0x20, 0x69, 0x60, 0x7e, 0xe5, 0x0e, 0xdc, 0x4b, 0x87, 0x19, + 0xbd, 0xf8, 0x43, 0x48, 0x29, 0x31, 0xcd, 0x7e, 0x3c, 0x4f, 0xdd, 0xaf, + 0x65, 0xe4, 0x7b, 0x64, 0x74, 0xec, 0x5b, 0x7a, 0x3e, 0xd0, 0xf7, 0xd0, + 0xc6, 0xed, 0x0f, 0x55, 0xfd, 0x6d, 0xf5, 0xbb, 0x34, 0x81, 0xea, 0x7e, + 0x49, 0x36, 0x27, 0x30, 0x25, 0xe4, 0x0d, 0xc9, 0x44, 0x5d, 0x01, 0xb5, + 0x7c, 0xb0, 0x56, 0x94, 0x96, 0xec, 0x49, 0x41, 0x1e, 0x68, 0xe8, 0xed, + 0x77, 0x86, 0x0c, 0x05, 0x84, 0x4a, 0xaa, 0xe2, 0xc6, 0xbf, 0x7f, 0x82, + 0x82, 0x69, 0x45, 0xb1, 0xc7, 0x86, 0xff, 0xa9, 0x51, 0x7f, 0xc3, 0xc9, + 0x67, 0x0c, 0x9c, 0xc8, 0xb5, 0xd5, 0xa8, 0x07, 0xd9, 0xaa, 0xf4, 0x6d, + 0x05, 0xaa, 0x89, 0xfe, 0xdd, 0xab, 0x12, 0xf2, 0x7a, 0x33, 0x9f, 0x62, + 0x46, 0xe0, 0x0a, 0x98, 0x70, 0x25, 0x79, 0x04, 0x3e, 0x02, 0xb9, 0x98, + 0x11, 0x54, 0x9b, 0x12, 0x47, 0x28, 0x28, 0x98, 0x61, 0x08, 0xc6, 0xeb, + 0x12, 0x32, 0x50, 0x6c, 0x67, 0xb1, 0x33, 0xad, 0xd8, 0x75, 0x67, 0x67, + 0xa0, 0xd5, 0x56, 0xd0, 0x1b, 0xff, 0xdb, 0xa6, 0xf2, 0x53, 0x6e, 0x43, + 0x8f, 0x6f, 0xd8, 0x1a, 0xa8, 0xb5, 0xe1, 0xc6, 0xaf, 0xf2, 0xa1, 0xcb, + 0xce, 0x57, 0xd7, 0x96, 0xb6, 0x93, 0xad, 0x37, 0xd4, 0x79, 0x46, 0x20, + 0x32, 0x60, 0x47, 0xfe, 0xe6, 0x65, 0x43, 0x01, 0xb1, 0xaa, 0x91, 0x31, + 0x97, 0x92, 0x6e, 0x1f, 0x24, 0x38, 0x22, 0xfc, 0xfc, 0x0b, 0x1a, 0x48, + 0x96, 0x03, 0x9a, 0xaa, 0xec, 0x55, 0xdd, 0xbe, 0x45, 0xa4, 0x4a, 0x33, + 0x8f, 0x9e, 0x39, 0x79, 0x92, 0x63, 0x33, 0x47, 0x71, 0x2c, 0x47, 0xf1, + 0xcc, 0xc9, 0x93, 0xb8, 0xbf, 0x26, 0x00, 0x44, 0xbd, 0xe6, 0xb8, 0xc5, + 0xc1, 0x45, 0x3c, 0xeb, 0x3c, 0xc3, 0xf1, 0x2c, 0x9b, 0xd7, 0x5e, 0x2f, + 0xd5, 0x4f, 0xad, 0x82, 0x54, 0x00, 0xaa, 0xe3, 0x8f, 0xa5, 0x2b, 0x5c, + 0x2b, 0x0a, 0xd1, 0x8a, 0xc2, 0xb5, 0x9e, 0x7c, 0xa2, 0x3b, 0xb4, 0x75, + 0xa2, 0x38, 0x19, 0x3b, 0xef, 0x06, 0xb6, 0xea, 0xa5, 0x28, 0x30, 0xeb, + 0xc9, 0x93, 0x26, 0x79, 0xfc, 0x67, 0xf0, 0x83, 0xe5, 0x83, 0x00, 0xbc, + 0xe7, 0xc0, 0x5e, 0x26, 0x8a, 0x93, 0x98, 0xc0, 0x04, 0x93, 0x98, 0xaf, + 0x54, 0xc0, 0xdf, 0x24, 0x50, 0x0b, 0xe0, 0xd8, 0xcc, 0x51, 0xbc, 0xf6, + 0xb8, 0x78, 0x59, 0xcc, 0x57, 0xd2, 0xb3, 0x4d, 0x0f, 0x56, 0x27, 0xbf, + 0x62, 0x25, 0x4f, 0xfd, 0xb6, 0xbb, 0x7f, 0xfd, 0xd4, 0x2a, 0xcf, 0xca, + 0x17, 0x59, 0x71, 0xe2, 0x9b, 0x59, 0xfc, 0xf4, 0xd3, 0x7c, 0xc7, 0xed, + 0xf2, 0xde, 0xd0, 0x4b, 0x89, 0x7b, 0xb5, 0x10, 0xf1, 0xf1, 0x53, 0x1f, + 0x84, 0x38, 0xf6, 0x43, 0x75, 0x7f, 0x94, 0x9e, 0xa4, 0xd4, 0x57, 0xa4, + 0xa2, 0xbf, 0xe5, 0xf9, 0xfe, 0xbe, 0x8a, 0x19, 0x03, 0x72, 0x06, 0x63, + 0x3f, 0x74, 0xa8, 0xce, 0xd8, 0x94, 0xfa, 0x3a, 0x7b, 0x8a, 0xa5, 0x37, + 0x9b, 0xd8, 0xae, 0x1d, 0x80, 0xb5, 0x00, 0x5a, 0xf5, 0x56, 0x57, 0xb0, + 0xd6, 0x1d, 0x77, 0xde, 0xc1, 0x1d, 0x77, 0x7e, 0x07, 0x7b, 0x5f, 0x8d, + 0x6c, 0x0e, 0xac, 0x8c, 0xc0, 0x6b, 0x4b, 0xa0, 0x81, 0xc8, 0x17, 0x91, + 0x0d, 0x41, 0x2b, 0x72, 0x03, 0xa9, 0xd5, 0x6b, 0x80, 0x02, 0xb4, 0x26, + 0x15, 0x05, 0x6a, 0x25, 0x01, 0x5b, 0x8d, 0xa6, 0x47, 0x36, 0xa7, 0xe0, + 0x5c, 0x7e, 0x58, 0xde, 0xc8, 0x43, 0x1b, 0x1a, 0xcd, 0xf0, 0x99, 0xe0, + 0x03, 0xb5, 0x5a, 0x1a, 0xc8, 0x97, 0xd5, 0x3f, 0x42, 0x1f, 0xc4, 0x15, + 0x95, 0x1f, 0xd7, 0x14, 0x26, 0x5e, 0xdb, 0xa3, 0xe5, 0x41, 0xb6, 0x0f, + 0xe4, 0xfe, 0x48, 0x5c, 0x89, 0x7a, 0x06, 0xe9, 0xfb, 0x5b, 0x4b, 0xc6, + 0xa1, 0xec, 0x08, 0x30, 0x0c, 0x13, 0x07, 0x07, 0xc7, 0x75, 0x30, 0x72, + 0x46, 0x70, 0xff, 0x98, 0x4f, 0xce, 0x3d, 0x36, 0x72, 0x46, 0x22, 0xfa, + 0x44, 0x70, 0xec, 0x90, 0x0f, 0x87, 0x4a, 0xc0, 0xa5, 0xec, 0xf1, 0x2a, + 0xa2, 0x4f, 0xe0, 0x44, 0x09, 0x59, 0xc9, 0xb0, 0x7d, 0x76, 0x77, 0x5b, + 0xc0, 0x53, 0x4f, 0xec, 0xe3, 0x84, 0xe5, 0xcb, 0x98, 0x71, 0x3b, 0xbf, + 0xd2, 0xf9, 0x60, 0xad, 0x9e, 0x65, 0x89, 0x9c, 0x5b, 0xe7, 0x14, 0x83, + 0x32, 0x04, 0xa0, 0xaa, 0x28, 0x04, 0x2b, 0x71, 0xf4, 0x81, 0x5a, 0xef, + 0x6a, 0xbc, 0x93, 0x0b, 0x37, 0xab, 0xf1, 0xfa, 0xdb, 0xff, 0xed, 0x0e, + 0xbe, 0xbd, 0xef, 0x5b, 0xaa, 0xbc, 0x09, 0x50, 0x57, 0x4f, 0x5b, 0xc9, + 0xb0, 0x6e, 0x4a, 0xda, 0xd2, 0x7e, 0xce, 0x94, 0xd3, 0x1d, 0xd6, 0x15, + 0x09, 0x3b, 0xde, 0x29, 0x72, 0xc2, 0xf2, 0x65, 0x3c, 0xa5, 0xef, 0x69, + 0xdd, 0xdc, 0xfb, 0x66, 0x1f, 0x60, 0xd9, 0xe2, 0x33, 0x54, 0xdd, 0xf9, + 0x59, 0xf7, 0x32, 0xa4, 0x4a, 0x95, 0x2a, 0x55, 0xaa, 0x54, 0xa9, 0x52, + 0xa5, 0x4a, 0x95, 0x2a, 0x55, 0xaa, 0x54, 0xa9, 0x52, 0xa5, 0x4a, 0x95, + 0x2a, 0x55, 0xaa, 0x54, 0xa9, 0x52, 0xa5, 0x4a, 0x95, 0x2a, 0x55, 0xaa, + 0x05, 0x29, 0x85, 0x6a, 0xa5, 0x4a, 0x95, 0x2a, 0x55, 0xaa, 0x54, 0x2f, + 0x23, 0x89, 0x60, 0xb2, 0xb5, 0x92, 0x6c, 0xcb, 0x60, 0x12, 0x5d, 0x6d, + 0xa6, 0x86, 0x69, 0x9a, 0xb8, 0xae, 0x1b, 0x1c, 0xfd, 0x34, 0xce, 0x4c, + 0xe7, 0xa2, 0x0a, 0x29, 0x65, 0x0c, 0xf6, 0x24, 0x72, 0x0a, 0x46, 0xe5, + 0xdb, 0x77, 0x67, 0xe2, 0x8b, 0x80, 0xfc, 0x1d, 0x9f, 0x65, 0x53, 0x22, + 0x72, 0xe2, 0x90, 0x8e, 0xab, 0x4f, 0x5f, 0xcd, 0xe8, 0xce, 0x51, 0xec, + 0xdc, 0xc1, 0xed, 0x9e, 0x18, 0x05, 0x66, 0xf9, 0x75, 0x8b, 0x62, 0x3b, + 0x0c, 0x73, 0x00, 0x00, 0x20, 0x00, 0x49, 0x44, 0x41, 0x54, 0x81, 0xaa, + 0x22, 0x50, 0x1a, 0xd3, 0x34, 0xf1, 0x3c, 0xb5, 0x4b, 0x73, 0xf5, 0xd1, + 0x2a, 0xa6, 0x69, 0xc6, 0xda, 0x26, 0x00, 0x8e, 0xe9, 0x49, 0x8c, 0x51, + 0x77, 0x14, 0x2a, 0x16, 0x9c, 0xa3, 0xc3, 0x75, 0xb3, 0xab, 0x5d, 0x40, + 0xdd, 0x58, 0xdc, 0x7c, 0x2e, 0x8f, 0x4b, 0xa2, 0xbd, 0xba, 0xd8, 0xf5, + 0x9a, 0x9e, 0x06, 0x1c, 0xcc, 0x59, 0x5b, 0xdf, 0x42, 0xcf, 0x76, 0x20, + 0x11, 0x43, 0x12, 0x4e, 0x28, 0x57, 0x59, 0xc6, 0x97, 0x69, 0x7b, 0x05, + 0x11, 0xc4, 0x96, 0xa6, 0xa1, 0x7a, 0x78, 0xf9, 0x2c, 0x62, 0x7f, 0x4b, + 0x4d, 0xb4, 0x4f, 0x2c, 0x8e, 0xcf, 0x7a, 0x80, 0x27, 0x69, 0x19, 0x6a, + 0x7f, 0x65, 0x00, 0xfc, 0x1d, 0xbf, 0x1d, 0x3d, 0xd9, 0xbf, 0xe9, 0x41, + 0xce, 0x00, 0x07, 0xe4, 0x50, 0x38, 0xf1, 0x34, 0xab, 0x27, 0x85, 0x4e, + 0x18, 0xa8, 0x7c, 0x72, 0x22, 0x02, 0xd4, 0xd2, 0xda, 0x2f, 0x15, 0xd0, + 0x2a, 0x6a, 0x73, 0x45, 0xe7, 0xe4, 0xd5, 0x40, 0x7e, 0xdc, 0xe8, 0x84, + 0xd3, 0x68, 0x7a, 0xdf, 0xfe, 0x12, 0x01, 0x4d, 0x89, 0x53, 0x56, 0x10, + 0xaf, 0x86, 0x21, 0xc0, 0x96, 0x41, 0xf9, 0x77, 0xe5, 0x5b, 0x0a, 0x10, + 0x96, 0x53, 0xf1, 0x62, 0x79, 0xfb, 0x65, 0xf2, 0xcb, 0x61, 0xe9, 0x76, + 0x7c, 0x42, 0x5d, 0x5b, 0x0e, 0x12, 0xf4, 0x22, 0x0a, 0x0c, 0x15, 0x96, + 0x98, 0xb6, 0xaa, 0x57, 0x4d, 0x85, 0xf9, 0xcd, 0x27, 0x1f, 0xa4, 0x25, + 0xa5, 0x02, 0x37, 0x89, 0x5c, 0x1e, 0xd7, 0x8d, 0xc3, 0xe6, 0x8c, 0x9c, + 0x89, 0x6c, 0x36, 0x30, 0xcd, 0x12, 0xb2, 0xd9, 0xe8, 0x09, 0xce, 0x5a, + 0xa8, 0xe6, 0x02, 0x63, 0x25, 0xc3, 0xe6, 0x83, 0x68, 0x75, 0x03, 0x74, + 0x25, 0x25, 0xdb, 0x12, 0xc3, 0x30, 0x70, 0x5d, 0x97, 0xd2, 0x8a, 0x52, + 0x70, 0x5f, 0x02, 0x35, 0xd9, 0xb8, 0x31, 0x07, 0xfc, 0xc0, 0xa9, 0x3b, + 0x31, 0x70, 0x16, 0x28, 0x98, 0xd6, 0xd6, 0x2f, 0x6e, 0x65, 0xd5, 0xe0, + 0x2a, 0xc6, 0xc7, 0xc7, 0x19, 0x1a, 0x1a, 0x62, 0xc7, 0x5d, 0x3b, 0xb0, + 0x0a, 0x56, 0x0c, 0xa8, 0xd5, 0xad, 0x1c, 0x7e, 0xde, 0x7e, 0x39, 0x4c, + 0xd3, 0x0c, 0x76, 0xfd, 0xf5, 0xcb, 0xd1, 0xad, 0x7d, 0x95, 0x9f, 0x45, + 0xc3, 0x6b, 0x04, 0x8b, 0xe2, 0x0f, 0x45, 0xe5, 0xd3, 0x86, 0xf0, 0xea, + 0x71, 0xfb, 0x01, 0x50, 0xab, 0x2d, 0x91, 0x7a, 0x57, 0x76, 0x7b, 0xba, + 0x8a, 0x53, 0x6f, 0x20, 0x84, 0xa0, 0x21, 0xe3, 0xed, 0x93, 0x2f, 0xe4, + 0x63, 0x8b, 0x47, 0x64, 0x53, 0xe2, 0xe1, 0x75, 0xb4, 0x53, 0xbc, 0xfc, + 0x5e, 0x0c, 0xaa, 0x25, 0xa5, 0xa4, 0x58, 0x8c, 0x2c, 0xcc, 0x2b, 0x28, + 0xb7, 0x25, 0xb4, 0xdf, 0x31, 0x02, 0xab, 0x60, 0xb1, 0xf1, 0xd3, 0x9b, + 0x19, 0x3e, 0x73, 0x35, 0xc3, 0x67, 0xae, 0x65, 0xfb, 0xdd, 0x3b, 0x70, + 0x1c, 0xff, 0x39, 0xa2, 0x0a, 0x60, 0x59, 0x16, 0x3f, 0xfa, 0xc1, 0xf7, + 0xd9, 0xf8, 0xa9, 0x2b, 0x18, 0xf9, 0xc7, 0x1b, 0xb8, 0xe2, 0x33, 0x9b, + 0x3b, 0xf2, 0x96, 0x52, 0xc6, 0xb8, 0x7d, 0xce, 0xb4, 0x4d, 0xcd, 0xed, + 0x6c, 0xe3, 0x5e, 0x20, 0xad, 0xf1, 0x07, 0xc6, 0x83, 0x45, 0x40, 0x95, + 0x87, 0x2b, 0xb1, 0x38, 0x42, 0x08, 0xa4, 0x06, 0x87, 0x09, 0x21, 0x62, + 0x30, 0x2d, 0xff, 0x99, 0x66, 0x64, 0xba, 0xff, 0x0e, 0x3d, 0xfd, 0xec, + 0x94, 0x52, 0x32, 0xba, 0x73, 0x34, 0xb6, 0xd0, 0x28, 0xe9, 0x1e, 0xdd, + 0x39, 0x8a, 0x94, 0x92, 0xb3, 0x87, 0xcf, 0x03, 0x60, 0xb8, 0xab, 0xc5, + 0x4e, 0x1d, 0x2c, 0x04, 0xaa, 0x57, 0x5a, 0x1f, 0x10, 0x75, 0x30, 0xf6, + 0x5e, 0xd4, 0x6b, 0xeb, 0x8f, 0x3a, 0xea, 0xe0, 0xfd, 0xba, 0xf9, 0xfb, + 0x8b, 0xef, 0x7a, 0x95, 0x61, 0x20, 0x71, 0xf4, 0xb5, 0x2e, 0x91, 0x26, + 0x09, 0xd3, 0x9a, 0xcb, 0x9e, 0x0f, 0xe8, 0x9a, 0xab, 0x6d, 0x92, 0x71, + 0x93, 0x79, 0x44, 0xd3, 0x0c, 0x24, 0xdc, 0xbd, 0x00, 0x60, 0x87, 0xb2, + 0x66, 0xf1, 0xbe, 0x89, 0xc7, 0x38, 0x2f, 0x5c, 0xdf, 0xcb, 0xd9, 0xab, + 0x4e, 0x66, 0x6c, 0xf2, 0x29, 0x56, 0xaf, 0x3c, 0xa1, 0x77, 0xa2, 0x97, + 0xa9, 0xae, 0xcd, 0xf4, 0x3e, 0x4f, 0x86, 0x1d, 0xaa, 0xb6, 0x64, 0x0e, + 0xce, 0xfd, 0x72, 0xd2, 0x5c, 0xd0, 0xac, 0x23, 0x05, 0xd4, 0xe2, 0xe7, + 0xbb, 0xd8, 0x71, 0xf3, 0x4a, 0xc8, 0x49, 0x46, 0x06, 0xc3, 0xbe, 0x91, + 0x10, 0xf7, 0x05, 0xee, 0xcd, 0xd3, 0x67, 0x53, 0xbd, 0x47, 0x50, 0x5d, + 0x6e, 0x40, 0xbf, 0x07, 0xf7, 0x94, 0xe0, 0xc1, 0x2e, 0x0b, 0xc6, 0xcf, + 0xf0, 0xb8, 0xa9, 0x82, 0x5a, 0x61, 0xf7, 0xf9, 0x1e, 0xf9, 0x7d, 0x0c, + 0xa8, 0x2c, 0x20, 0xde, 0x19, 0x1e, 0xba, 0x03, 0x14, 0xd3, 0x7c, 0x40, + 0xad, 0x91, 0x9f, 0xee, 0x62, 0xa3, 0x6c, 0x71, 0xe5, 0xee, 0xdd, 0x9d, + 0x81, 0x22, 0x0b, 0x7d, 0x45, 0x78, 0xef, 0x2a, 0xf0, 0x21, 0xaa, 0x0f, + 0x1f, 0x1a, 0x14, 0xe9, 0x48, 0x69, 0xc3, 0xe9, 0xc3, 0x8c, 0x17, 0xd4, + 0x42, 0x2e, 0xff, 0xb1, 0x28, 0x1d, 0x98, 0xf8, 0xf6, 0x56, 0x36, 0x9d, + 0xa1, 0x16, 0xee, 0xe7, 0x8b, 0xba, 0xef, 0x60, 0x37, 0xd8, 0xf2, 0xc0, + 0x76, 0x56, 0x5f, 0x78, 0x95, 0x8a, 0x6f, 0x82, 0x74, 0x61, 0xec, 0xf6, + 0xeb, 0xb0, 0x6b, 0x0a, 0xbe, 0x6a, 0x45, 0xfa, 0xd8, 0x3f, 0xfa, 0xc9, + 0x7d, 0x44, 0x65, 0xd7, 0xe0, 0x82, 0xf7, 0x9c, 0xfd, 0x12, 0xd7, 0xe8, + 0x08, 0x49, 0x57, 0x23, 0x09, 0xd4, 0x0a, 0x82, 0x8d, 0x3c, 0xb8, 0x21, + 0x94, 0x4b, 0x76, 0x83, 0xb9, 0xe5, 0x22, 0x71, 0x3b, 0x4d, 0x87, 0x6f, + 0x40, 0x39, 0xa3, 0x7b, 0xfa, 0x68, 0x5e, 0xbd, 0xd2, 0x6b, 0x30, 0x57, + 0x37, 0x38, 0xd8, 0xef, 0x42, 0x8b, 0x4a, 0x25, 0xea, 0xf5, 0x3a, 0x85, + 0x42, 0x81, 0xb3, 0xab, 0x55, 0x5e, 0xbc, 0xf7, 0x5e, 0x9e, 0x07, 0x5e, + 0xbc, 0xf7, 0x5e, 0x4a, 0x40, 0x12, 0x29, 0x7d, 0xa4, 0xc1, 0x5a, 0x39, + 0xa0, 0x01, 0x3c, 0xe7, 0xcd, 0xb2, 0xe2, 0x24, 0x8b, 0xa9, 0xc7, 0x1d, + 0x72, 0xc7, 0x1e, 0xcb, 0xc0, 0x49, 0x16, 0xcf, 0x79, 0xb3, 0x5d, 0x59, + 0x65, 0x47, 0x42, 0xb5, 0x9f, 0xd7, 0xe8, 0x7f, 0x6d, 0x3f, 0xa5, 0x57, + 0xfd, 0x12, 0x7e, 0xf5, 0x4b, 0x4a, 0xaf, 0x82, 0xff, 0xa8, 0xfd, 0x0f, + 0x5e, 0x78, 0xd5, 0x5b, 0x5f, 0xa2, 0x1c, 0x0f, 0x4e, 0x37, 0x18, 0x16, + 0x1b, 0x23, 0x90, 0x89, 0x6b, 0xfa, 0x8b, 0x94, 0xd7, 0xa9, 0xd7, 0xbd, + 0x91, 0xaf, 0x5f, 0xc6, 0xc6, 0xf7, 0xdf, 0x04, 0x80, 0xf7, 0x4f, 0xaa, + 0x97, 0x57, 0xaa, 0x38, 0x38, 0x7b, 0x55, 0xbf, 0xf3, 0x86, 0x7f, 0xdf, + 0x04, 0xac, 0x0a, 0xd2, 0x5a, 0xc0, 0xfa, 0x21, 0x40, 0x4a, 0x2e, 0x5b, + 0x13, 0x5e, 0x67, 0x3e, 0x50, 0x0b, 0xe0, 0xe2, 0x33, 0x89, 0x2d, 0x5e, + 0x6c, 0xc9, 0x16, 0x59, 0x91, 0x0d, 0x60, 0x22, 0x97, 0x9f, 0x19, 0x86, + 0xf9, 0x6e, 0x29, 0x25, 0x97, 0x0c, 0x11, 0x8c, 0x1f, 0xf8, 0xd0, 0xab, + 0x0d, 0xe7, 0xe6, 0xe1, 0x4b, 0x57, 0xb1, 0xed, 0x23, 0xd7, 0x71, 0xf9, + 0xf6, 0x1b, 0x00, 0xd8, 0x7a, 0x4f, 0x83, 0x3b, 0xbe, 0x9c, 0xe7, 0x8a, + 0x8b, 0x15, 0xd0, 0x62, 0xeb, 0x9f, 0x5c, 0xc1, 0xc4, 0xcf, 0x6f, 0xe8, + 0xa8, 0xb7, 0xb2, 0x21, 0x28, 0x12, 0x87, 0x68, 0x75, 0x03, 0x6a, 0x01, + 0xac, 0x3d, 0x07, 0x36, 0x5f, 0x56, 0x65, 0xf5, 0x9b, 0xcb, 0xdd, 0x23, + 0x68, 0x19, 0x4b, 0xf2, 0x6c, 0xba, 0x7a, 0x33, 0x5b, 0xff, 0x66, 0xab, + 0x2e, 0xbb, 0x87, 0x6c, 0x43, 0x2b, 0xb6, 0xb0, 0xdf, 0xc3, 0xca, 0x99, + 0x38, 0xfb, 0x6c, 0xac, 0x9c, 0x09, 0x4b, 0xb2, 0xc8, 0xc8, 0x42, 0x54, + 0x29, 0xe3, 0xbf, 0x71, 0x3f, 0x6d, 0xff, 0x32, 0x03, 0xf6, 0x79, 0xba, + 0x2f, 0x2e, 0xf0, 0xda, 0x79, 0x8c, 0x4c, 0x43, 0x2d, 0x90, 0x97, 0xf3, + 0xff, 0x5e, 0x0e, 0x15, 0xb2, 0x13, 0xd5, 0x0f, 0x34, 0x50, 0xeb, 0x07, + 0x7f, 0xf3, 0x9b, 0x23, 0x62, 0xef, 0x48, 0xe9, 0xf7, 0x05, 0xcf, 0xea, + 0xa5, 0x64, 0x79, 0x1e, 0x05, 0xde, 0xd3, 0x25, 0xde, 0xe1, 0x8d, 0x5e, + 0xf4, 0xd6, 0xe0, 0xf3, 0x36, 0x2b, 0x56, 0x2e, 0x66, 0x6a, 0x72, 0xee, + 0x85, 0xe0, 0x3f, 0xd7, 0xc7, 0x28, 0x78, 0x6a, 0x50, 0x43, 0xae, 0xa6, + 0x80, 0xbd, 0x0f, 0xcd, 0xb2, 0xf6, 0x98, 0x78, 0x39, 0xcd, 0xa2, 0xe0, + 0xf2, 0x8f, 0x6e, 0xe4, 0xda, 0xcf, 0x28, 0xd0, 0xf4, 0xe4, 0x9e, 0xf5, + 0x5c, 0xfc, 0x96, 0x38, 0x68, 0xda, 0xb7, 0xfd, 0x4e, 0x6d, 0x67, 0xe9, + 0x43, 0xb3, 0xac, 0x05, 0x6e, 0x2b, 0x14, 0x3a, 0xe2, 0x01, 0xfc, 0x6a, + 0x91, 0x02, 0x6c, 0xb1, 0x48, 0xc1, 0xb7, 0xa6, 0x26, 0x67, 0x3b, 0xcb, + 0xff, 0x7c, 0x3c, 0xcd, 0x0a, 0x6d, 0x3b, 0xa9, 0x10, 0xac, 0xa5, 0xe1, + 0x5b, 0x51, 0x52, 0x56, 0xdd, 0xa6, 0x5c, 0xef, 0xd2, 0x26, 0x75, 0x9b, + 0xc1, 0xc5, 0x9d, 0xde, 0xa1, 0x0d, 0x38, 0x6a, 0x16, 0x6e, 0xfd, 0x5b, + 0xe5, 0xfe, 0xc0, 0x16, 0x05, 0xc9, 0x02, 0x05, 0x23, 0x7b, 0xfc, 0xa1, + 0x59, 0x4e, 0x7a, 0xeb, 0x62, 0xfe, 0xf6, 0xdf, 0x66, 0x89, 0xa2, 0x6d, + 0xa6, 0x1e, 0xae, 0x01, 0xfd, 0x7c, 0xe0, 0x14, 0xb8, 0xf5, 0x91, 0xa8, + 0x5d, 0x15, 0x67, 0xf0, 0xf9, 0xfe, 0x78, 0x9d, 0x74, 0x9d, 0x6f, 0x9b, + 0x05, 0x36, 0x2a, 0xbf, 0x4f, 0xfe, 0x68, 0xee, 0x8e, 0xff, 0x8e, 0xdd, + 0x0e, 0xeb, 0xd7, 0x84, 0xe3, 0x17, 0x3b, 0xf6, 0xa8, 0xfb, 0xf9, 0xfa, + 0x33, 0x43, 0xbf, 0xd1, 0x3d, 0xe1, 0x3d, 0x7e, 0xb8, 0x87, 0xff, 0xc5, + 0xda, 0xc6, 0xf6, 0xdd, 0x11, 0x3f, 0x2e, 0xe0, 0xe2, 0x35, 0x16, 0xd5, + 0x2f, 0x5e, 0x10, 0xf8, 0xdf, 0xf0, 0xad, 0x09, 0xe0, 0xbc, 0x20, 0x8e, + 0xef, 0x3f, 0x36, 0xad, 0xee, 0x5b, 0xab, 0x07, 0x8c, 0xe0, 0x7c, 0xf5, + 0x80, 0xc1, 0xae, 0x99, 0xde, 0x77, 0x26, 0x1f, 0x64, 0x15, 0x05, 0x6a, + 0x75, 0xd3, 0xa6, 0xbf, 0xff, 0x0e, 0xbb, 0x6f, 0x3c, 0x8f, 0x1d, 0x0f, + 0xb8, 0x71, 0xea, 0x45, 0x0f, 0x9b, 0x95, 0x9c, 0x80, 0x1e, 0x36, 0xff, + 0xf5, 0xeb, 0x3f, 0xe2, 0x83, 0xef, 0x7f, 0x53, 0x4f, 0x20, 0xd7, 0xca, + 0xd7, 0x9f, 0xc0, 0xf7, 0xbf, 0xf7, 0x7d, 0x00, 0xce, 0xfe, 0xa3, 0xb7, + 0x51, 0xd5, 0xe3, 0x92, 0xab, 0xfa, 0x0d, 0xcc, 0x3e, 0xc1, 0xe8, 0x03, + 0x2e, 0x97, 0x6c, 0x2f, 0x71, 0xcb, 0xc5, 0xba, 0xd7, 0x32, 0xa8, 0xca, + 0xb3, 0xe1, 0x63, 0x71, 0xd0, 0x41, 0x79, 0x50, 0x21, 0x50, 0xaa, 0x8f, + 0x48, 0xec, 0x27, 0x24, 0xc5, 0x4b, 0xbb, 0x83, 0xb5, 0xec, 0xba, 0xe4, + 0x86, 0x2d, 0x23, 0x5c, 0xb1, 0x69, 0xe3, 0xbc, 0x50, 0xad, 0xbc, 0x61, + 0x04, 0x33, 0x12, 0x3c, 0xe9, 0x62, 0xe6, 0x4a, 0xc1, 0xf3, 0x34, 0x0a, + 0xd4, 0xf2, 0x55, 0xf3, 0xd6, 0xd2, 0x6f, 0xec, 0x02, 0xae, 0x65, 0x74, + 0x7a, 0x33, 0x0a, 0xa6, 0x05, 0xeb, 0x57, 0xc0, 0x8e, 0x29, 0xf0, 0xda, + 0x0e, 0xc5, 0x42, 0x19, 0x6f, 0xc6, 0xc5, 0x6b, 0x3b, 0x34, 0xea, 0xea, + 0x6f, 0x57, 0xec, 0x2b, 0x51, 0x99, 0xba, 0x8e, 0x7e, 0xe3, 0xa3, 0x78, + 0x6d, 0x37, 0x00, 0x68, 0x45, 0xdd, 0x79, 0xd3, 0xc2, 0x9e, 0xa9, 0x04, + 0x6e, 0x6f, 0xc6, 0x45, 0x4a, 0x9b, 0xfc, 0x80, 0xb2, 0x07, 0x60, 0xe4, + 0x86, 0x31, 0x32, 0xa6, 0x06, 0x74, 0x8d, 0x92, 0x37, 0x43, 0x00, 0x97, + 0xd3, 0x96, 0xd0, 0x16, 0x6a, 0x2c, 0xb9, 0x2d, 0xc8, 0x0a, 0x89, 0xa7, + 0x01, 0x66, 0x0e, 0x1e, 0x56, 0x46, 0x43, 0x7a, 0xda, 0x06, 0x4e, 0xd7, + 0x7e, 0xaf, 0x05, 0x24, 0xdf, 0xef, 0x5a, 0x08, 0xd3, 0x82, 0x69, 0x70, + 0xda, 0x2e, 0x96, 0x2e, 0x6b, 0x69, 0x60, 0x7d, 0xd7, 0xb2, 0x36, 0x5c, + 0x15, 0x5e, 0x99, 0xba, 0xae, 0xc3, 0xba, 0x1f, 0xdf, 0xaf, 0x6f, 0xb1, + 0xaf, 0xac, 0xe3, 0xee, 0x08, 0x81, 0x59, 0x99, 0x72, 0x60, 0x2f, 0x6c, + 0xf3, 0x2f, 0xc4, 0xec, 0x78, 0xd2, 0x0d, 0x40, 0x7c, 0x9e, 0x74, 0x31, + 0x84, 0x89, 0x21, 0x86, 0x17, 0x04, 0x71, 0xa8, 0xe9, 0x63, 0x7f, 0xc4, + 0xaf, 0xbf, 0x4b, 0x78, 0x34, 0xac, 0xa6, 0xff, 0xf5, 0x27, 0xe2, 0x46, + 0x75, 0x6f, 0x86, 0x23, 0x42, 0xba, 0x1a, 0x19, 0x00, 0x76, 0xaa, 0x71, + 0xad, 0x81, 0x01, 0x98, 0xd6, 0x83, 0x47, 0xd3, 0x11, 0x50, 0x15, 0xd3, + 0xe1, 0x98, 0xd2, 0x4e, 0x60, 0xe3, 0xe7, 0x60, 0xe4, 0x13, 0x2a, 0xff, + 0x8d, 0x5d, 0x6c, 0x4e, 0x4f, 0x87, 0xf1, 0x40, 0xc5, 0xdd, 0xd8, 0xa5, + 0xac, 0xd3, 0x03, 0xd0, 0x77, 0x16, 0x6a, 0x13, 0x90, 0x85, 0x96, 0x77, + 0x5a, 0x95, 0xd5, 0x2f, 0x5e, 0x2f, 0x88, 0xd6, 0xf4, 0xb4, 0xaa, 0xcf, + 0xc8, 0x34, 0xac, 0x1b, 0x80, 0x9d, 0xd3, 0xdd, 0xcb, 0xd0, 0xcd, 0xee, + 0xc6, 0xc4, 0x20, 0xdf, 0xbf, 0x4e, 0x33, 0xef, 0x2c, 0x22, 0x31, 0xed, + 0x60, 0x9c, 0x56, 0xc2, 0xf5, 0x3c, 0x90, 0x0a, 0xa8, 0x25, 0x9b, 0x12, + 0xf1, 0x86, 0xa2, 0xfa, 0xa6, 0x99, 0x01, 0x33, 0x67, 0xe0, 0xed, 0x3d, + 0xb8, 0xcd, 0x77, 0x7c, 0xc9, 0x76, 0x27, 0x38, 0xab, 0x97, 0xbb, 0x5b, + 0x3a, 0xa1, 0xe1, 0x5a, 0x00, 0xb2, 0xcf, 0x00, 0x91, 0xc5, 0x34, 0x0c, + 0x55, 0xde, 0x36, 0x88, 0x9a, 0x83, 0xec, 0x07, 0x61, 0x18, 0xf4, 0x9b, + 0x26, 0xde, 0x83, 0x7a, 0x6c, 0x3a, 0xa3, 0xfb, 0x9d, 0x99, 0xe4, 0x1b, + 0x9d, 0xee, 0xb0, 0xea, 0x6f, 0x89, 0xe2, 0x9e, 0x09, 0xb5, 0x29, 0x4b, + 0x1b, 0xdc, 0x33, 0x56, 0x61, 0x2e, 0x33, 0x91, 0xf7, 0x4f, 0x20, 0xfe, + 0x62, 0x3d, 0xb5, 0x19, 0x17, 0x61, 0x9a, 0x0c, 0xf5, 0x17, 0x19, 0x9f, + 0xb1, 0x91, 0x9e, 0x47, 0xff, 0x8a, 0x32, 0xb5, 0xe9, 0x2a, 0xfd, 0x03, + 0x25, 0xe4, 0x3f, 0x6c, 0xc5, 0xbd, 0x68, 0xad, 0xde, 0x10, 0x47, 0x99, + 0xf6, 0x81, 0x5a, 0x10, 0xba, 0x7b, 0x8d, 0xa9, 0xff, 0x2e, 0x81, 0x5a, + 0x00, 0xf9, 0x25, 0xc0, 0x7e, 0xa9, 0xde, 0x79, 0xf5, 0x77, 0x37, 0x5b, + 0x08, 0x6c, 0x7d, 0x8f, 0x58, 0x55, 0x80, 0xb1, 0xba, 0xae, 0x4a, 0xa4, + 0x68, 0x0d, 0x14, 0xcc, 0xa9, 0xdf, 0x10, 0x78, 0x9e, 0x64, 0xdc, 0x53, + 0xdf, 0x63, 0x41, 0x52, 0x84, 0x00, 0xf2, 0xe4, 0x3f, 0x1e, 0x8b, 0x28, + 0x10, 0x94, 0xe7, 0xc5, 0xdb, 0xbd, 0xea, 0x49, 0xca, 0xa6, 0xc9, 0x18, + 0xe0, 0x66, 0x60, 0xa4, 0x20, 0xb8, 0x64, 0xda, 0xa5, 0x28, 0xc0, 0x30, + 0x04, 0x35, 0x0f, 0xaa, 0x4d, 0x49, 0x31, 0x07, 0x46, 0x4e, 0x41, 0xa8, + 0x7c, 0xa4, 0x99, 0xdd, 0x96, 0xe4, 0xdb, 0x02, 0x23, 0xa3, 0xde, 0xd9, + 0x1d, 0x24, 0x8d, 0x3a, 0x0a, 0xd8, 0xd5, 0xf4, 0xcb, 0x2e, 0x83, 0xf7, + 0xf7, 0x6a, 0x53, 0x06, 0xe5, 0xb1, 0x85, 0x20, 0xef, 0x41, 0x29, 0x03, + 0xd5, 0xb6, 0x0f, 0x52, 0xce, 0x52, 0xca, 0x28, 0x70, 0x96, 0xff, 0x77, + 0xb0, 0x10, 0x0a, 0xba, 0xa5, 0xcb, 0x6b, 0xe8, 0x4d, 0x53, 0xbc, 0x66, + 0x8b, 0x6a, 0xbb, 0x85, 0x94, 0x92, 0x72, 0x41, 0xe0, 0x35, 0x5b, 0x54, + 0x1e, 0xa9, 0xb0, 0xfe, 0xa2, 0xcb, 0xd9, 0x71, 0xeb, 0x36, 0x8a, 0x40, + 0x23, 0x03, 0x93, 0x6d, 0xf5, 0x9d, 0xb6, 0x98, 0x89, 0x3e, 0x1d, 0xd4, + 0x77, 0x2a, 0xcf, 0x6b, 0x50, 0x24, 0x4f, 0xb5, 0x0d, 0xe8, 0x6b, 0xb3, + 0xaa, 0xeb, 0x56, 0x44, 0x62, 0xcb, 0xb0, 0x0d, 0xfd, 0xef, 0x34, 0x4e, + 0x1b, 0x24, 0x82, 0xb2, 0x00, 0xcb, 0x53, 0x30, 0xad, 0x85, 0x7e, 0xb1, + 0x3f, 0x36, 0x73, 0x54, 0xcc, 0xfd, 0xda, 0xe3, 0x14, 0x64, 0xaa, 0x28, + 0x4e, 0xe2, 0x99, 0xc7, 0x67, 0x39, 0x5e, 0x87, 0x3d, 0xf3, 0x9c, 0x72, + 0x3f, 0x79, 0xd2, 0x24, 0x85, 0xc6, 0x62, 0xea, 0xf9, 0x59, 0x9e, 0x3d, + 0x30, 0x3f, 0x2c, 0x6a, 0xa2, 0x38, 0xc9, 0x6b, 0x8f, 0x53, 0x79, 0x1c, + 0x2f, 0x8e, 0xe2, 0xd9, 0x03, 0x2f, 0xf2, 0xec, 0x01, 0xe5, 0x1f, 0x4d, + 0x6b, 0x2d, 0x29, 0xf0, 0x40, 0x65, 0x1f, 0x56, 0x2e, 0x04, 0x6a, 0x39, + 0x4d, 0x05, 0xda, 0x3a, 0x71, 0xf9, 0xb2, 0x9e, 0x60, 0xad, 0x64, 0x5e, + 0xbe, 0xe6, 0x2b, 0xd7, 0xb0, 0x5c, 0xc9, 0xa8, 0x98, 0xe4, 0xa4, 0xd7, + 0xc1, 0xbf, 0xfd, 0xa4, 0xcd, 0xe0, 0xf1, 0xe1, 0x0d, 0x30, 0xeb, 0x40, + 0x4b, 0x77, 0x41, 0x5f, 0x7b, 0xdc, 0x51, 0xfc, 0xe0, 0xf1, 0x17, 0xbb, + 0x02, 0xb5, 0xa2, 0x32, 0x5f, 0xa9, 0xc1, 0x6a, 0xf4, 0x6e, 0x53, 0xe8, + 0x0e, 0x13, 0xf3, 0xc3, 0x80, 0xa0, 0x4d, 0x4f, 0x38, 0xfa, 0x09, 0x00, + 0x56, 0x9e, 0x7d, 0x36, 0x93, 0xf7, 0x85, 0xe3, 0x8f, 0x4f, 0xfd, 0x76, + 0x39, 0x13, 0xc5, 0x49, 0x2e, 0xf8, 0xd9, 0x31, 0x3c, 0x36, 0xa1, 0xde, + 0xe1, 0xa6, 0x1a, 0x3f, 0x54, 0x81, 0x47, 0x75, 0x7d, 0x41, 0x08, 0x64, + 0x18, 0x79, 0xbc, 0x66, 0xf8, 0x15, 0xdc, 0x07, 0x43, 0x65, 0x85, 0xa0, + 0xe1, 0x35, 0x02, 0x48, 0x95, 0x53, 0xf7, 0x28, 0x9a, 0x06, 0xb2, 0x25, + 0x19, 0xbe, 0x70, 0x3d, 0xb2, 0x9d, 0xc5, 0xbe, 0xf9, 0x06, 0x86, 0xcf, + 0x59, 0xcf, 0x6a, 0x6f, 0x9c, 0xb1, 0x1f, 0x3a, 0x48, 0x3d, 0x96, 0xe7, + 0xcc, 0x4c, 0x62, 0xf5, 0xad, 0xe4, 0x92, 0xf7, 0x0d, 0xb3, 0xed, 0xd6, + 0x6d, 0x6c, 0xb8, 0x74, 0x13, 0x5b, 0x3e, 0x7b, 0x1d, 0x79, 0x23, 0x8f, + 0x58, 0xd2, 0x8f, 0x55, 0xc8, 0xaa, 0xfb, 0x67, 0xbf, 0x02, 0x0b, 0x59, + 0x2b, 0x2c, 0xb5, 0x11, 0x58, 0xbd, 0x45, 0xde, 0xcc, 0x43, 0x21, 0x04, + 0x6b, 0x89, 0x8c, 0xa0, 0x45, 0x8b, 0xa1, 0xa1, 0x21, 0xb6, 0x7e, 0x61, + 0x2b, 0x42, 0x18, 0x14, 0x97, 0xf5, 0xb3, 0xeb, 0x87, 0xe3, 0xe4, 0x0b, + 0xd0, 0xaa, 0x87, 0xf3, 0x22, 0xd0, 0xb0, 0xf0, 0xbc, 0x25, 0x18, 0x3e, + 0x7d, 0x18, 0xbb, 0x66, 0x53, 0x75, 0xab, 0x78, 0xfe, 0xd8, 0x44, 0x56, + 0xd7, 0x2f, 0x23, 0x69, 0x35, 0x95, 0xbb, 0x25, 0x25, 0x62, 0xb1, 0xa0, + 0xd5, 0x0c, 0xd3, 0x42, 0x08, 0xc1, 0x12, 0x8b, 0xd5, 0x5d, 0xa1, 0xe1, + 0x35, 0xb0, 0x0a, 0x16, 0xa2, 0x19, 0xef, 0xc7, 0x8b, 0xc5, 0x02, 0xb1, + 0x18, 0xfc, 0x4f, 0xbc, 0x59, 0x0d, 0xd3, 0xcb, 0x5b, 0x42, 0xd9, 0x90, + 0xf1, 0xb8, 0xad, 0xce, 0x19, 0x07, 0xb1, 0x79, 0x39, 0xfe, 0x5c, 0x20, + 0x91, 0x13, 0xac, 0x5e, 0xb1, 0x9a, 0xb1, 0xa9, 0x31, 0x65, 0xb7, 0x0f, + 0x1a, 0xb2, 0x85, 0xac, 0xeb, 0xba, 0x64, 0x0c, 0xd4, 0x2d, 0xb2, 0xa5, + 0xd3, 0xcf, 0xfd, 0x7e, 0x21, 0x23, 0xef, 0x33, 0x3e, 0x50, 0x4b, 0x26, + 0xde, 0x71, 0x7c, 0xe0, 0x16, 0xbe, 0xbf, 0x86, 0x6f, 0x05, 0xf1, 0x23, + 0x1b, 0xaf, 0x11, 0x01, 0x73, 0x25, 0xed, 0xc4, 0x6c, 0xbd, 0xa2, 0x7b, + 0x79, 0x7c, 0x90, 0xd6, 0xd0, 0xdb, 0x4f, 0x0d, 0x60, 0x5b, 0x4f, 0x45, + 0x7e, 0xcf, 0xc9, 0xf2, 0xca, 0x19, 0xd9, 0x01, 0x06, 0x0b, 0xc2, 0xfc, + 0x72, 0xf9, 0x7e, 0xd1, 0xf4, 0x33, 0x12, 0x56, 0xc0, 0xbe, 0x29, 0x15, + 0xe7, 0xdb, 0xcd, 0x6f, 0x85, 0x36, 0xc6, 0xbd, 0x98, 0xad, 0x68, 0xda, + 0xe4, 0x31, 0x5a, 0xe7, 0x64, 0xde, 0xd1, 0x63, 0xb4, 0xec, 0x81, 0x0d, + 0x1f, 0x60, 0xb6, 0x4f, 0x76, 0xb7, 0xf5, 0x0a, 0x02, 0x70, 0xd6, 0x71, + 0x8b, 0x96, 0x52, 0x79, 0xcc, 0xe6, 0xb9, 0xe7, 0x9f, 0x66, 0xd9, 0xe2, + 0x33, 0xa8, 0x3c, 0xf6, 0x3d, 0x9e, 0x7b, 0xfe, 0xe9, 0xa0, 0x7c, 0xcf, + 0x1e, 0xb0, 0x61, 0x51, 0xf7, 0x36, 0x4d, 0x95, 0x2a, 0x55, 0xaa, 0x54, + 0xa9, 0x52, 0xa5, 0x4a, 0x95, 0x2a, 0x55, 0xaa, 0x54, 0xa9, 0x52, 0xa5, + 0x4a, 0x95, 0x2a, 0x55, 0xaa, 0x54, 0xa9, 0x52, 0xa5, 0x4a, 0x95, 0x2a, + 0x55, 0xaa, 0x54, 0x0b, 0xd3, 0xcb, 0x74, 0x29, 0x63, 0xaa, 0x54, 0xa9, + 0x52, 0xa5, 0x4a, 0xf5, 0xbf, 0xa7, 0x92, 0x50, 0xa5, 0xa4, 0x7c, 0x68, + 0x4c, 0x14, 0x5c, 0x23, 0xdb, 0x12, 0xab, 0xcf, 0x52, 0xbb, 0x29, 0xf7, + 0xb0, 0x25, 0x9b, 0x12, 0x9a, 0x21, 0xb4, 0xcb, 0xc8, 0x19, 0x98, 0x7d, + 0x26, 0x8d, 0x7a, 0xb8, 0x30, 0x32, 0x9f, 0xcb, 0xd3, 0x68, 0x36, 0x28, + 0x9f, 0x56, 0xa6, 0x3a, 0x55, 0x0d, 0x26, 0xf3, 0xf9, 0xe9, 0xfd, 0xf3, + 0xe4, 0xd1, 0xd7, 0xea, 0xd3, 0x57, 0x63, 0xd7, 0x6c, 0x4a, 0x2b, 0x4a, + 0x2a, 0xfd, 0x3c, 0x0b, 0x85, 0xa2, 0x70, 0xab, 0xa8, 0x3b, 0x0a, 0xfe, + 0x0a, 0xca, 0x1e, 0x89, 0x53, 0x9b, 0xa9, 0xc5, 0xec, 0xf8, 0xe7, 0xb5, + 0x99, 0x5a, 0x10, 0x47, 0xb6, 0x25, 0xa6, 0x61, 0x06, 0x61, 0xbe, 0x0d, + 0x3f, 0x2c, 0x0a, 0x2f, 0x8b, 0x02, 0xbb, 0x64, 0x53, 0xd2, 0xdf, 0xd7, + 0x1f, 0x40, 0xbd, 0xfc, 0x38, 0x8d, 0x66, 0x27, 0x00, 0x20, 0x0a, 0x3c, + 0xf3, 0xcf, 0x17, 0xa2, 0x10, 0x40, 0xe3, 0x4f, 0xeb, 0x8e, 0xa8, 0xdd, + 0xb9, 0x23, 0x73, 0x30, 0x25, 0x52, 0x44, 0x7d, 0x12, 0x79, 0xb9, 0x5e, + 0xb0, 0x55, 0xb3, 0x2c, 0x6a, 0xd0, 0x94, 0x27, 0xf5, 0xe2, 0xf3, 0x88, + 0xc1, 0x5c, 0x67, 0x5a, 0x7f, 0xc2, 0x68, 0xb6, 0x29, 0x61, 0xb9, 0xa1, + 0x21, 0x53, 0x3a, 0x8e, 0xdf, 0x36, 0x4f, 0x44, 0xf2, 0x8d, 0x02, 0xab, + 0x20, 0xee, 0x06, 0x28, 0x1a, 0x9d, 0x60, 0x2b, 0xad, 0x6c, 0x4e, 0x4d, + 0x50, 0xf5, 0x8f, 0xca, 0xcf, 0x00, 0x64, 0x70, 0x1e, 0xa8, 0x5b, 0x7a, + 0xd4, 0x6e, 0xcf, 0xd9, 0xfd, 0x3a, 0x7e, 0xf4, 0x1a, 0x6c, 0xca, 0x78, + 0xfc, 0x9c, 0x50, 0xf1, 0x9b, 0x91, 0xba, 0xe7, 0x04, 0xf8, 0xbf, 0x13, + 0xff, 0xcf, 0x6e, 0x18, 0xca, 0x2f, 0x13, 0x09, 0x03, 0xb5, 0xea, 0xd2, + 0x9f, 0xf0, 0xb8, 0xdc, 0x80, 0xaa, 0x0b, 0xcd, 0xb9, 0xaf, 0xe9, 0xa4, + 0x84, 0x30, 0x03, 0xb0, 0x96, 0xd7, 0x74, 0x21, 0x02, 0x74, 0x12, 0x7a, + 0x62, 0x7d, 0x00, 0xd2, 0x3a, 0x4c, 0x98, 0x96, 0x0f, 0xc0, 0x5a, 0x08, + 0x08, 0x2b, 0x99, 0xa6, 0x97, 0x7a, 0x85, 0x1d, 0x4c, 0x1e, 0x87, 0xaa, + 0x56, 0xbb, 0x73, 0x82, 0xf1, 0x91, 0x28, 0x87, 0x91, 0x33, 0xe7, 0x04, + 0x97, 0x39, 0xf5, 0x2e, 0xd0, 0x12, 0xe8, 0xd8, 0xc9, 0x3e, 0xa9, 0x62, + 0xbf, 0x5e, 0x32, 0x21, 0xe7, 0xbf, 0x46, 0xae, 0xb9, 0xee, 0x1a, 0x6e, + 0xfa, 0xe7, 0xed, 0x08, 0x01, 0xd5, 0x47, 0xab, 0x7c, 0x63, 0xfb, 0xbf, + 0x46, 0xde, 0xca, 0x04, 0x1b, 0x3f, 0x75, 0x25, 0xd9, 0x4c, 0x68, 0x37, + 0x5a, 0xa6, 0x55, 0x83, 0xe1, 0xa2, 0xff, 0x28, 0x68, 0x2b, 0x7a, 0x2f, + 0x12, 0x39, 0x81, 0x5d, 0x75, 0x40, 0xa8, 0x85, 0xfb, 0x4e, 0xbd, 0x3b, + 0xc0, 0x64, 0xed, 0x99, 0xab, 0x83, 0xbb, 0x81, 0x11, 0x81, 0x53, 0x94, + 0x4a, 0xe1, 0x42, 0x7b, 0xc7, 0x75, 0x28, 0x97, 0xca, 0x38, 0xae, 0x83, + 0x1b, 0x01, 0x86, 0x99, 0x05, 0xb3, 0x8b, 0x45, 0x55, 0x77, 0xa3, 0x60, + 0x74, 0xc0, 0xae, 0x6a, 0xae, 0x4b, 0xbf, 0xd9, 0x99, 0xc6, 0x07, 0x70, + 0x45, 0x9f, 0x17, 0x0b, 0x71, 0x83, 0x06, 0x8e, 0x69, 0x7a, 0x44, 0x34, + 0xbf, 0x28, 0x50, 0x2b, 0x9a, 0x6e, 0x2e, 0x5b, 0xf3, 0x3d, 0xaf, 0x92, + 0x4a, 0x02, 0x9e, 0xe6, 0x53, 0x12, 0xa2, 0x95, 0x74, 0x77, 0x83, 0x3f, + 0x41, 0x7c, 0x91, 0xdc, 0x4e, 0x60, 0x74, 0x74, 0x14, 0x38, 0xea, 0x88, + 0xc1, 0xb4, 0x00, 0x6e, 0xbc, 0x11, 0x7e, 0xfa, 0xf1, 0x10, 0x42, 0xb5, + 0x8e, 0x01, 0xa6, 0x99, 0x0e, 0xca, 0xd3, 0x0b, 0x72, 0xe5, 0x97, 0x29, + 0x59, 0x87, 0xf9, 0xea, 0x14, 0xb5, 0x93, 0xcc, 0x2b, 0x99, 0x2e, 0xea, + 0xee, 0x06, 0xd3, 0xea, 0x26, 0x7f, 0x0d, 0xe0, 0x7c, 0x76, 0xd6, 0x01, + 0x4f, 0xb3, 0x30, 0x9d, 0xb7, 0x1b, 0xbe, 0xb3, 0x06, 0x98, 0x78, 0x2c, + 0xf0, 0x5b, 0x7b, 0xf7, 0xfc, 0xf7, 0xa8, 0xdf, 0x85, 0x8a, 0x42, 0x60, + 0xff, 0x8e, 0x17, 0xd2, 0xfd, 0x67, 0x56, 0x14, 0x9a, 0x65, 0xbc, 0x61, + 0x6d, 0xcc, 0xef, 0x48, 0x01, 0xb5, 0xb8, 0x73, 0x14, 0x80, 0x6d, 0xe7, + 0x1a, 0x5c, 0x7e, 0xb7, 0x47, 0xd6, 0x82, 0x91, 0x41, 0x03, 0x29, 0xd5, + 0x22, 0xaa, 0x8d, 0x7b, 0x3d, 0x36, 0x35, 0xe0, 0xa6, 0x53, 0x84, 0x5a, + 0x05, 0x78, 0xb3, 0x01, 0x1f, 0xae, 0xc0, 0x29, 0xc0, 0x57, 0xf4, 0x7d, + 0xf4, 0xc3, 0xfa, 0x7e, 0x2c, 0x4c, 0xa8, 0x78, 0x0a, 0x94, 0xf5, 0x31, + 0x9d, 0x87, 0x0f, 0xcd, 0x8a, 0x9e, 0x7f, 0xcc, 0x98, 0x3f, 0x1e, 0x06, + 0x3c, 0x30, 0x77, 0xf1, 0x8d, 0xd3, 0xce, 0x57, 0x90, 0xad, 0x9f, 0xeb, + 0xb6, 0xb8, 0x73, 0x94, 0x8d, 0x77, 0x8f, 0xf6, 0x4e, 0xb0, 0x7b, 0x17, + 0x7c, 0xb3, 0x37, 0x14, 0xf2, 0xf7, 0x29, 0xb1, 0xa4, 0x85, 0xbf, 0x40, + 0x51, 0x84, 0x6c, 0x86, 0x00, 0xa8, 0x15, 0xb8, 0x75, 0x9b, 0xf8, 0xcc, + 0x5c, 0xff, 0xb8, 0xe3, 0xce, 0x5b, 0x00, 0x58, 0x7d, 0x46, 0x88, 0x62, + 0xbc, 0x62, 0xc3, 0x87, 0x5e, 0xb2, 0xf2, 0xfe, 0xae, 0x24, 0xbd, 0x46, + 0x07, 0xd4, 0x2a, 0x16, 0xee, 0xc3, 0x8b, 0xe9, 0x02, 0xc6, 0x6a, 0xeb, + 0x67, 0xa9, 0x6c, 0x29, 0xa0, 0x5a, 0x42, 0xfe, 0x93, 0x56, 0xd9, 0x98, + 0x03, 0xce, 0x35, 0x57, 0x7a, 0xd9, 0x0a, 0x6c, 0x1c, 0xac, 0xa2, 0x6f, + 0x41, 0xf3, 0x2f, 0x39, 0xeb, 0x2e, 0xc3, 0x30, 0x58, 0xba, 0x74, 0xa9, + 0x3a, 0x59, 0xba, 0x94, 0x9f, 0xde, 0x7b, 0x2f, 0xa0, 0x5e, 0x95, 0x5e, + 0xff, 0x8e, 0x77, 0x70, 0xfc, 0xd3, 0x4f, 0xf3, 0x6c, 0xb5, 0xda, 0x91, + 0x17, 0x74, 0xbc, 0xbd, 0x1d, 0x92, 0x7c, 0x66, 0xd1, 0x4f, 0xf7, 0xfd, + 0x8a, 0xdc, 0x2f, 0x9a, 0x38, 0xff, 0xa1, 0xc1, 0x2a, 0x8f, 0x43, 0xf3, + 0xc0, 0x01, 0x9a, 0xc0, 0x71, 0x87, 0x61, 0xbf, 0xcb, 0x5b, 0x26, 0x02, + 0xf8, 0x45, 0xb5, 0xca, 0x2f, 0xaa, 0x55, 0x5e, 0x21, 0x5e, 0x19, 0x0f, + 0xfc, 0xd5, 0x34, 0xbf, 0xd9, 0xbf, 0xff, 0x30, 0x72, 0x3c, 0x32, 0x7f, + 0x97, 0x2b, 0x5c, 0x1b, 0xf9, 0x0f, 0x60, 0xa0, 0x16, 0x1c, 0x5e, 0x99, + 0x40, 0xa4, 0x7e, 0xe3, 0xeb, 0x97, 0x05, 0xee, 0x0b, 0xde, 0xef, 0x72, + 0xcd, 0x8e, 0x21, 0x60, 0xe8, 0x50, 0x8a, 0x7b, 0x58, 0xb2, 0x81, 0xa2, + 0x94, 0x1d, 0xfd, 0xce, 0x0d, 0xe7, 0xe6, 0xd9, 0x10, 0x81, 0x66, 0x4d, + 0x6c, 0x57, 0xbf, 0xc1, 0x3b, 0xb6, 0xaf, 0xd7, 0x3e, 0xeb, 0x39, 0x12, + 0x2a, 0xce, 0x01, 0xc0, 0x90, 0xd2, 0x63, 0xe2, 0x91, 0x2a, 0xab, 0x4e, + 0x29, 0x01, 0xb0, 0xe5, 0xe3, 0xd7, 0x62, 0x2c, 0xc9, 0xc7, 0xd8, 0x2f, + 0xd9, 0x5c, 0x1e, 0x91, 0x97, 0xe4, 0x81, 0xb1, 0x4a, 0x95, 0xd5, 0xe5, + 0x12, 0x45, 0xf2, 0x0c, 0x7f, 0xf8, 0x72, 0x6e, 0xb9, 0x7e, 0x2b, 0x56, + 0x9f, 0xa0, 0xe1, 0x49, 0x68, 0x94, 0xb1, 0x6b, 0xd9, 0x80, 0x57, 0xad, + 0x64, 0x21, 0x65, 0x0b, 0x67, 0x9f, 0x47, 0xb1, 0x28, 0x71, 0xf7, 0x4b, + 0x40, 0xaa, 0xdb, 0x70, 0x06, 0xe4, 0x2c, 0x88, 0x23, 0x8a, 0xa0, 0x4b, + 0xf5, 0x52, 0xe8, 0x29, 0xe0, 0xd5, 0x10, 0x2c, 0xa4, 0x7f, 0x56, 0x1f, + 0x4f, 0xd0, 0xee, 0xb7, 0x03, 0xdf, 0x7d, 0x09, 0xf3, 0xff, 0xc7, 0x59, + 0x58, 0xad, 0xdd, 0x6b, 0x51, 0xd0, 0x82, 0x57, 0x02, 0xbb, 0x80, 0x7f, + 0x5f, 0xac, 0x00, 0x58, 0x51, 0xad, 0x80, 0x18, 0x8f, 0xca, 0x97, 0xab, + 0xc1, 0xec, 0x56, 0x9f, 0xba, 0xde, 0x9d, 0x99, 0x2a, 0xdb, 0x7f, 0xb0, + 0x89, 0x13, 0x4a, 0x5b, 0x39, 0x7d, 0x71, 0xe2, 0x3a, 0x5c, 0xb9, 0x98, + 0xb3, 0x1f, 0x0a, 0x21, 0x56, 0xdf, 0xa9, 0xdb, 0x9c, 0x57, 0x28, 0x32, + 0xf8, 0xbc, 0xcd, 0xde, 0x45, 0x45, 0x5e, 0xf5, 0xbc, 0xcd, 0xcf, 0x51, + 0x20, 0xad, 0x7f, 0x9f, 0x9c, 0xe5, 0x9d, 0x2b, 0xe7, 0x5e, 0xb8, 0x2e, + 0xde, 0x04, 0x67, 0x9d, 0xa5, 0xdc, 0x7f, 0xfa, 0xa7, 0xbe, 0xdd, 0x9a, + 0x3e, 0xf6, 0x07, 0xf1, 0xbe, 0xf6, 0xb5, 0x59, 0x6a, 0x59, 0x90, 0x3f, + 0xea, 0x6d, 0x6b, 0x70, 0x31, 0xec, 0x9d, 0x83, 0x39, 0xf6, 0xe2, 0x62, + 0x05, 0xd2, 0xba, 0xad, 0x03, 0x86, 0xd5, 0xcf, 0x6d, 0x7f, 0x0b, 0x17, + 0x69, 0x9f, 0xbf, 0xfd, 0x37, 0x15, 0xe1, 0x6f, 0xff, 0xf8, 0x14, 0xf8, + 0x1a, 0xf0, 0xa7, 0xd1, 0xb2, 0xa8, 0xe3, 0x6d, 0x9b, 0x88, 0x9d, 0xfb, + 0xba, 0xed, 0x91, 0x5a, 0xec, 0xfc, 0x6f, 0xff, 0xf8, 0x14, 0xed, 0xf0, + 0xed, 0xd4, 0xe0, 0xda, 0x23, 0x40, 0xbf, 0xe9, 0xa1, 0x6b, 0xbe, 0xae, + 0xe0, 0x51, 0x57, 0xbf, 0xff, 0x6d, 0x0b, 0x4e, 0x73, 0xc5, 0x7b, 0x56, + 0x05, 0x00, 0xae, 0x85, 0x68, 0xf5, 0x95, 0xaa, 0xf3, 0x37, 0x76, 0x7d, + 0xf7, 0x71, 0xa4, 0xf9, 0xc2, 0x7d, 0x0d, 0x2d, 0x57, 0xf7, 0xf6, 0x6d, + 0x0f, 0x7a, 0x5c, 0xdb, 0x94, 0xdc, 0x01, 0x9c, 0x0f, 0x6c, 0x5e, 0x00, + 0xb0, 0x3f, 0xaa, 0x0f, 0xbe, 0xff, 0x4d, 0x1d, 0x7e, 0xf7, 0x7d, 0xef, + 0xfb, 0x9c, 0xfd, 0x47, 0x61, 0x1b, 0xbc, 0xed, 0xcf, 0xdf, 0x86, 0x48, + 0x10, 0xdb, 0xcc, 0x3e, 0x81, 0xf5, 0xe9, 0x3c, 0x9b, 0x2d, 0xc1, 0xc4, + 0x8d, 0x0a, 0xb2, 0x05, 0x30, 0xa6, 0xfb, 0xb6, 0x97, 0x95, 0xbf, 0xc1, + 0x4d, 0x95, 0x0b, 0x82, 0x71, 0xd7, 0xe1, 0xfc, 0xf5, 0x54, 0xf8, 0x10, + 0x17, 0x5f, 0x68, 0xb0, 0xfd, 0x76, 0x0f, 0xfb, 0x89, 0xde, 0xf7, 0xe8, + 0x2b, 0x36, 0x6d, 0xe4, 0x86, 0x2d, 0x23, 0x8c, 0x7e, 0x64, 0xee, 0xbe, + 0x70, 0x75, 0xe6, 0xa6, 0xc0, 0x6d, 0x88, 0x35, 0xe4, 0x0b, 0x26, 0x6e, + 0x2d, 0x8f, 0x21, 0xd4, 0x6f, 0x31, 0x09, 0xd6, 0xda, 0xf4, 0xae, 0x22, + 0x5b, 0xbe, 0xbd, 0x16, 0x18, 0x43, 0x01, 0xb5, 0x34, 0x58, 0xab, 0x0d, + 0x57, 0xbd, 0xf7, 0x0e, 0xb6, 0xee, 0xbc, 0x9a, 0x46, 0xdd, 0xc1, 0x6b, + 0x3b, 0x18, 0xa2, 0x48, 0xbe, 0x60, 0x51, 0x6b, 0x5a, 0x01, 0x64, 0xaa, + 0xe6, 0x7d, 0x21, 0x00, 0x6b, 0x81, 0x15, 0x00, 0xb2, 0x6a, 0x53, 0x11, + 0x70, 0x54, 0xc6, 0xa4, 0xe1, 0x3a, 0x48, 0x69, 0x23, 0x44, 0x31, 0x70, + 0x1b, 0xb9, 0x61, 0x6d, 0xc3, 0x2f, 0xf3, 0x37, 0xa8, 0x4c, 0x5d, 0x10, + 0x80, 0xb6, 0xd0, 0x70, 0x16, 0x4f, 0x1f, 0x9d, 0xb6, 0x44, 0x73, 0x18, + 0x70, 0xa4, 0xc0, 0x69, 0xcb, 0xc4, 0xb8, 0x58, 0xb7, 0xbf, 0x73, 0xa7, + 0x5f, 0x65, 0xea, 0x3a, 0x44, 0xc6, 0xc4, 0xca, 0x0c, 0xe1, 0xb4, 0x5d, + 0xa0, 0x11, 0x94, 0x29, 0xea, 0x16, 0xa2, 0x48, 0xde, 0xb4, 0x70, 0xa7, + 0xc7, 0x83, 0xf2, 0xc1, 0x05, 0x81, 0x1d, 0xaf, 0x39, 0x4a, 0xbf, 0x71, + 0x99, 0xae, 0x3b, 0xe4, 0x51, 0x40, 0x30, 0xbf, 0x3d, 0x14, 0x58, 0xcb, + 0xa1, 0xe1, 0x3a, 0x78, 0xd2, 0xc6, 0xc8, 0xad, 0xc7, 0x6b, 0xee, 0x08, + 0x8e, 0x2a, 0xad, 0x87, 0x91, 0x31, 0x82, 0x76, 0x35, 0x84, 0xa9, 0x20, + 0x5b, 0x0b, 0x50, 0x3f, 0x71, 0x68, 0x56, 0xf2, 0xdc, 0x57, 0xd2, 0xaf, + 0x3f, 0x12, 0xb7, 0x5f, 0xfb, 0xdd, 0xef, 0xbb, 0x6b, 0x3a, 0xbe, 0x3f, + 0xe8, 0x93, 0xd0, 0x3b, 0xfa, 0x42, 0xf7, 0xbd, 0x0b, 0x80, 0x55, 0x6d, + 0xd4, 0x03, 0x6e, 0xd3, 0x3b, 0x51, 0x84, 0xac, 0x4f, 0xcc, 0x93, 0xe0, + 0x73, 0x30, 0xfd, 0x09, 0x9d, 0x6e, 0x1d, 0x30, 0xd2, 0xc3, 0xee, 0xe7, + 0x42, 0x5b, 0x1b, 0xd7, 0xc1, 0xc8, 0x4e, 0xf8, 0xe6, 0x59, 0x70, 0x85, + 0x1f, 0x61, 0x64, 0x27, 0x03, 0x07, 0x43, 0xd5, 0x47, 0x95, 0x6f, 0xe3, + 0x4e, 0x0d, 0xfe, 0x9a, 0xee, 0x0d, 0xd4, 0x0a, 0xb2, 0xd0, 0x20, 0xad, + 0x91, 0xe9, 0xf8, 0x79, 0x87, 0x22, 0xe5, 0x58, 0x97, 0x38, 0x07, 0xf8, + 0xe0, 0x00, 0xfc, 0xf7, 0xda, 0xfc, 0xc5, 0x93, 0x7b, 0xab, 0x88, 0x36, + 0xe0, 0x83, 0xb4, 0x22, 0x12, 0xd3, 0x0e, 0x6e, 0xff, 0xe1, 0x81, 0x51, + 0x7b, 0x81, 0xb3, 0x0e, 0x3a, 0x5d, 0x26, 0x0b, 0x6d, 0x70, 0x35, 0x94, + 0x24, 0xf8, 0xc6, 0x59, 0x73, 0x10, 0x38, 0x0a, 0xc0, 0x99, 0x51, 0x80, + 0xac, 0x40, 0x6d, 0xd9, 0x65, 0x26, 0x95, 0x88, 0x6d, 0xce, 0x23, 0xa5, + 0x87, 0x04, 0x8c, 0xfb, 0xc7, 0xf0, 0x51, 0x1a, 0xf2, 0x8b, 0x3b, 0x30, + 0x74, 0xb8, 0x82, 0x1f, 0x49, 0xd4, 0x17, 0xb0, 0x5d, 0xf0, 0xee, 0xb5, + 0xf0, 0xd9, 0x9b, 0x10, 0x22, 0x0b, 0x4d, 0x49, 0xff, 0xee, 0x2a, 0x1e, + 0xa2, 0xa3, 0x91, 0x5e, 0x0a, 0x68, 0x56, 0x74, 0xa3, 0x89, 0x83, 0x55, + 0x65, 0x7f, 0xf8, 0x66, 0x9b, 0xd5, 0x6d, 0x17, 0xfd, 0x9e, 0xd7, 0xf0, + 0xc2, 0x37, 0xbb, 0xe4, 0xf7, 0x4d, 0x1b, 0x81, 0xd4, 0x30, 0xad, 0x12, + 0x12, 0x5b, 0xc7, 0xb4, 0x23, 0x95, 0xb6, 0x64, 0x04, 0xfc, 0xe4, 0x85, + 0xdf, 0x4d, 0x8b, 0x91, 0x77, 0x04, 0xa9, 0xdf, 0xa5, 0x8c, 0x4c, 0xdc, + 0x76, 0xa9, 0x2d, 0x30, 0xf0, 0x68, 0xa0, 0xbe, 0x27, 0x7a, 0x08, 0xa4, + 0x84, 0x52, 0x4e, 0x90, 0x37, 0x24, 0x13, 0x75, 0x68, 0x20, 0x69, 0xb4, + 0x3b, 0xdf, 0xcf, 0x25, 0x30, 0x51, 0x0f, 0xed, 0x95, 0x0d, 0x0d, 0xe4, + 0xd2, 0x11, 0x8a, 0xa8, 0x72, 0x05, 0x5f, 0x57, 0x32, 0x40, 0xbb, 0xa5, + 0xea, 0xd0, 0x06, 0x32, 0x02, 0x91, 0x81, 0x3c, 0x60, 0xb7, 0x41, 0xfa, + 0x75, 0x6f, 0x36, 0x28, 0xea, 0xbf, 0xeb, 0xf0, 0xfb, 0x2e, 0x61, 0xf4, + 0xce, 0x5b, 0xa8, 0xfa, 0x60, 0x28, 0xd7, 0xa1, 0x52, 0xa9, 0x68, 0x7b, + 0x82, 0x62, 0x2e, 0xcb, 0x25, 0x1f, 0xde, 0xc0, 0xe8, 0x17, 0x6f, 0x40, + 0x90, 0x45, 0xb6, 0x5b, 0x08, 0xa1, 0xe0, 0xc9, 0x76, 0x06, 0xca, 0x46, + 0x9e, 0x4a, 0x5d, 0x81, 0xe2, 0xfc, 0x32, 0xab, 0xd6, 0x96, 0x41, 0x99, + 0x2b, 0x1a, 0x22, 0x86, 0x88, 0x97, 0xbd, 0xe2, 0x86, 0x35, 0x2e, 0x02, + 0xd5, 0x05, 0xbc, 0x73, 0x3d, 0x2b, 0x5f, 0xe4, 0x78, 0xa1, 0x3e, 0x1e, + 0x1c, 0xe3, 0xa8, 0x8f, 0x2f, 0x05, 0xe0, 0xf1, 0xe7, 0x1e, 0xe7, 0xd8, + 0xd7, 0xc1, 0xc4, 0x01, 0x0d, 0x83, 0xfa, 0x8f, 0xc5, 0x4c, 0x58, 0x93, + 0x70, 0x00, 0x9e, 0xfd, 0x83, 0x59, 0x38, 0xa0, 0xd2, 0x47, 0x41, 0x56, + 0x49, 0x99, 0xaf, 0x84, 0xd7, 0x66, 0xe2, 0x1f, 0x2c, 0x8e, 0x3f, 0x56, + 0x81, 0xa3, 0x8e, 0x3f, 0x36, 0x84, 0x49, 0xbd, 0x11, 0xf5, 0x7d, 0xca, + 0x4a, 0x90, 0xc3, 0x7d, 0xc0, 0x96, 0x53, 0xd9, 0xc7, 0x85, 0xef, 0x9c, + 0x1b, 0x16, 0x9d, 0x94, 0x5f, 0x2e, 0xf3, 0x95, 0x71, 0xc8, 0xd5, 0xcf, + 0x9f, 0x7b, 0x91, 0xe3, 0x8f, 0xd5, 0x27, 0x3f, 0x83, 0x7f, 0xfa, 0xfb, + 0x6f, 0xe2, 0x7e, 0xfb, 0xdb, 0xec, 0xbc, 0xe5, 0x9b, 0xbc, 0xe5, 0x92, + 0xf7, 0xf2, 0x83, 0xe5, 0x83, 0xd8, 0xc0, 0x0f, 0x72, 0x83, 0x6c, 0x3c, + 0x5a, 0xc1, 0x80, 0xe6, 0x03, 0x6a, 0x81, 0xca, 0xe3, 0xd8, 0x8c, 0x6a, + 0xcf, 0x68, 0x9b, 0x06, 0xf5, 0x16, 0x47, 0xf1, 0xac, 0x7c, 0x91, 0x13, + 0x8e, 0x7e, 0x82, 0x6f, 0xbc, 0xee, 0x85, 0x78, 0x62, 0xdd, 0x96, 0x8b, + 0xa6, 0xe1, 0x82, 0x63, 0x8e, 0x61, 0xe5, 0x39, 0xaf, 0x65, 0xe9, 0xb9, + 0x1f, 0x01, 0xe0, 0xe9, 0xbb, 0xef, 0x66, 0xe5, 0xd9, 0x0a, 0xe0, 0x3f, + 0x79, 0xdf, 0x7d, 0x9c, 0x70, 0xf4, 0x13, 0x3c, 0x36, 0x0d, 0x77, 0xf1, + 0x02, 0xef, 0x3e, 0xe6, 0x18, 0xee, 0x7a, 0xe1, 0x05, 0x16, 0x5b, 0xaf, + 0x51, 0x06, 0xdc, 0xb9, 0x01, 0xc5, 0x49, 0xb5, 0x12, 0xf7, 0x07, 0xaf, + 0x29, 0x31, 0x72, 0x02, 0x23, 0xd2, 0x5f, 0xb5, 0x84, 0x85, 0x93, 0xf1, + 0xb8, 0xe2, 0x63, 0x57, 0x70, 0xc7, 0xad, 0x77, 0xb0, 0xfa, 0x94, 0x3c, + 0x76, 0xd3, 0x61, 0x55, 0xc1, 0x52, 0xfd, 0x21, 0x0d, 0xd4, 0x42, 0xc2, + 0xc5, 0xe7, 0x5c, 0xcc, 0xd6, 0xeb, 0xaf, 0x63, 0x4d, 0xb9, 0x44, 0xd5, + 0x76, 0x58, 0x5b, 0x1e, 0x0a, 0x21, 0x57, 0x5d, 0x14, 0x1d, 0xeb, 0x13, + 0x4d, 0xbd, 0xa9, 0x99, 0xc8, 0xe2, 0xd5, 0x1d, 0xae, 0xf8, 0xf4, 0x15, + 0x6c, 0xf8, 0xcc, 0x66, 0xf2, 0x05, 0xc8, 0x17, 0xa0, 0x51, 0x57, 0x47, + 0x00, 0x7b, 0x9f, 0xfa, 0x46, 0xdc, 0xa8, 0x43, 0x9e, 0x22, 0xa3, 0xbb, + 0x47, 0x83, 0xdd, 0xc4, 0x0c, 0xa1, 0x41, 0xa7, 0x3a, 0x5f, 0x1f, 0x94, + 0x45, 0x5b, 0xc3, 0xc3, 0xf4, 0x26, 0x5a, 0xbe, 0xdb, 0x2a, 0x18, 0xc1, + 0x98, 0x8d, 0xd7, 0x90, 0xb4, 0x24, 0x14, 0xfb, 0x8a, 0x48, 0x29, 0xc9, + 0xe6, 0xf2, 0xe1, 0x7d, 0x4f, 0xea, 0xdf, 0xa0, 0xff, 0x3c, 0x68, 0x0b, + 0x64, 0x06, 0xb2, 0x39, 0x05, 0xe5, 0x12, 0x19, 0x01, 0x39, 0xfd, 0xdd, + 0x56, 0x32, 0xe7, 0xac, 0xdc, 0xe4, 0xb3, 0x13, 0x60, 0x6c, 0x6a, 0x8c, + 0xa2, 0x51, 0xc4, 0x6b, 0x7b, 0xe1, 0x78, 0x2b, 0xb0, 0xf6, 0xb4, 0xb5, + 0xec, 0xda, 0x3b, 0xa1, 0xa7, 0x83, 0x64, 0xf1, 0xe4, 0xc2, 0xbf, 0x51, + 0xf5, 0x02, 0x69, 0x75, 0xc0, 0xa2, 0xb4, 0xbb, 0x1b, 0x30, 0x2b, 0x19, + 0x27, 0x69, 0x23, 0x09, 0xaa, 0x3a, 0x61, 0xf9, 0x32, 0x00, 0xfa, 0xcc, + 0x01, 0x66, 0xdc, 0x69, 0xc6, 0xbf, 0xfb, 0x63, 0x86, 0xde, 0x7e, 0x2a, + 0x10, 0xc2, 0xb5, 0xfa, 0xcc, 0x81, 0x18, 0x54, 0xab, 0x9b, 0xad, 0xe8, + 0x71, 0x3e, 0x30, 0xd8, 0x9b, 0x5e, 0x31, 0x44, 0x71, 0xf9, 0x32, 0x4e, + 0x3f, 0xf5, 0x6c, 0x96, 0xad, 0x30, 0x78, 0xfd, 0xaa, 0xff, 0x02, 0xc0, + 0xb2, 0x15, 0xff, 0xc2, 0x43, 0xdf, 0xfd, 0x31, 0xdf, 0xdd, 0xb3, 0x9b, + 0xc7, 0xfa, 0x2a, 0x1d, 0x75, 0x48, 0xe6, 0xd1, 0x2b, 0x7c, 0xae, 0x3a, + 0x77, 0xb3, 0xd5, 0xad, 0x8c, 0x51, 0xff, 0x67, 0x0f, 0xd8, 0x1c, 0xb7, + 0x68, 0x69, 0x70, 0x7e, 0xdc, 0xa2, 0xa5, 0x3c, 0x7b, 0xc0, 0xe6, 0xf8, + 0x63, 0x8b, 0x31, 0xa8, 0xd6, 0x73, 0xcf, 0x3f, 0xdd, 0x75, 0x7c, 0x23, + 0x55, 0xaa, 0x54, 0xa9, 0x52, 0xa5, 0x4a, 0x95, 0x2a, 0x55, 0xaa, 0x54, + 0xa9, 0x52, 0xa5, 0x4a, 0x95, 0x2a, 0x55, 0xaa, 0x54, 0xa9, 0x52, 0xa5, + 0x4a, 0x95, 0x2a, 0x55, 0xaa, 0x54, 0xa9, 0x52, 0x2d, 0x5c, 0x29, 0x54, + 0x2b, 0x55, 0xaa, 0x54, 0xa9, 0x52, 0xa5, 0x7a, 0x19, 0x28, 0x0a, 0x70, + 0x5a, 0x48, 0x9c, 0x28, 0x3c, 0x4a, 0x64, 0x04, 0xce, 0x4c, 0x77, 0x10, + 0x8c, 0x91, 0x33, 0x90, 0x52, 0x76, 0x80, 0xa4, 0xa4, 0x94, 0xb8, 0x91, + 0x9d, 0xc8, 0x1b, 0xf5, 0x06, 0xf9, 0x42, 0x9e, 0x7c, 0x2e, 0x8f, 0x3b, + 0xe3, 0x52, 0x5a, 0x51, 0x62, 0xfc, 0x81, 0xf1, 0x20, 0x2e, 0x80, 0xd0, + 0xb0, 0x18, 0x1f, 0x1e, 0xe3, 0xc3, 0xb3, 0x1a, 0x34, 0xc8, 0xe7, 0xf2, + 0xd8, 0xb5, 0x10, 0x6e, 0x63, 0x18, 0xc6, 0x21, 0x4d, 0xd0, 0x16, 0x42, + 0x04, 0x90, 0xab, 0x5e, 0x65, 0xf7, 0xdd, 0x22, 0x23, 0x82, 0x89, 0xe0, + 0x3e, 0x28, 0x0c, 0xd4, 0x04, 0x44, 0x23, 0x67, 0x04, 0xe0, 0xb1, 0xc0, + 0x5f, 0xc7, 0xeb, 0xc8, 0x53, 0xdb, 0x01, 0x05, 0xd8, 0x72, 0x5d, 0x37, + 0xb0, 0xeb, 0xa7, 0xcd, 0xe7, 0xf2, 0xb8, 0xc4, 0x17, 0x8e, 0xcc, 0x67, + 0xb7, 0x67, 0x1d, 0x21, 0xc2, 0xd3, 0x0a, 0x27, 0x88, 0x4b, 0x3d, 0x49, + 0x3f, 0x09, 0xd4, 0xf2, 0x63, 0x21, 0xe3, 0x93, 0xa5, 0xa3, 0xd3, 0xa7, + 0x01, 0x84, 0x27, 0x91, 0x65, 0x23, 0x00, 0x6a, 0x05, 0xb3, 0xa9, 0xa3, + 0x7e, 0xfe, 0xa2, 0x80, 0xb6, 0xa4, 0x55, 0xd0, 0xd6, 0xeb, 0x92, 0x6c, + 0xbf, 0xa1, 0x76, 0xed, 0x7c, 0xc2, 0x83, 0x9c, 0x01, 0x33, 0x1e, 0xbc, + 0x59, 0xa7, 0x87, 0xb8, 0xad, 0x8a, 0xda, 0xc9, 0x3b, 0xfb, 0x66, 0x03, + 0x7e, 0xe8, 0xa9, 0xc5, 0x05, 0xfd, 0x06, 0xad, 0x9a, 0x07, 0x6f, 0x36, + 0x15, 0x50, 0xab, 0x2e, 0x15, 0x5c, 0x2b, 0xe1, 0xd7, 0xd2, 0x7e, 0xad, + 0xba, 0x84, 0x82, 0x20, 0x5b, 0x97, 0x0a, 0x64, 0xd5, 0x27, 0xc8, 0xce, + 0x48, 0x5a, 0x65, 0xa3, 0x7b, 0xfa, 0xfd, 0x52, 0xa5, 0x8b, 0xa6, 0xef, + 0x57, 0xee, 0xe8, 0x92, 0xfb, 0x96, 0xb6, 0xd9, 0xaa, 0x47, 0x1a, 0xb1, + 0x20, 0x94, 0xbd, 0xba, 0x54, 0xb6, 0xfc, 0x85, 0x65, 0x6b, 0x0c, 0xd8, + 0xed, 0x29, 0x20, 0xd9, 0x0a, 0x03, 0xa6, 0xbc, 0xd0, 0x2f, 0x1a, 0xbe, + 0x46, 0x83, 0xc6, 0x5c, 0xe0, 0x4c, 0xa1, 0xea, 0xec, 0xd7, 0x69, 0x1e, + 0xc9, 0xc4, 0x62, 0x23, 0xd3, 0x2c, 0x85, 0x10, 0x2d, 0x42, 0xa0, 0x96, + 0x91, 0x53, 0xab, 0xd8, 0xe6, 0x82, 0x3d, 0x01, 0x41, 0x3c, 0xa5, 0x4e, + 0xd8, 0x40, 0x18, 0xaf, 0xb8, 0x20, 0xbf, 0xa4, 0x7f, 0xaf, 0x38, 0xdd, + 0xe2, 0x97, 0x06, 0xd5, 0xa2, 0x37, 0x43, 0xaf, 0x96, 0x6e, 0x78, 0x21, + 0xb8, 0xc9, 0xd4, 0xf0, 0x24, 0xcf, 0xf3, 0xc8, 0x1b, 0xf9, 0x60, 0x25, + 0x94, 0xac, 0x67, 0x63, 0x36, 0x24, 0x3d, 0x00, 0x56, 0xf3, 0xe4, 0x1d, + 0xf3, 0x33, 0x0d, 0x2c, 0xd3, 0x0a, 0xca, 0x01, 0x71, 0xe8, 0xa0, 0xaf, + 0xbc, 0x91, 0x27, 0x6f, 0xe4, 0x69, 0x78, 0x0d, 0x0c, 0xc2, 0x76, 0x8c, + 0xb7, 0xa9, 0xef, 0x77, 0xf0, 0xf7, 0xaf, 0x46, 0xb3, 0x81, 0x57, 0xf7, + 0x68, 0xb5, 0x75, 0x3b, 0xb4, 0x05, 0xf9, 0x82, 0x5a, 0x34, 0xe9, 0xc3, + 0x0b, 0xb3, 0xfa, 0x27, 0xb7, 0xfd, 0xd6, 0xed, 0x5c, 0x76, 0xe9, 0x7a, + 0xb6, 0xdf, 0xbe, 0x83, 0xd2, 0x1b, 0x4a, 0x48, 0xe0, 0xba, 0xbf, 0x53, + 0x8b, 0xfe, 0xae, 0xf9, 0xeb, 0xab, 0x00, 0xb5, 0xa3, 0x71, 0x36, 0x03, + 0x2d, 0xd9, 0x62, 0xed, 0x19, 0x0a, 0xec, 0x52, 0x2a, 0x95, 0x62, 0x79, + 0x96, 0x4a, 0x25, 0xaa, 0xd5, 0x2a, 0x22, 0x2b, 0x18, 0xbd, 0x67, 0x14, + 0xab, 0x90, 0x58, 0x18, 0x2a, 0xc1, 0xad, 0xab, 0xeb, 0x2b, 0x09, 0x5d, + 0x74, 0x5c, 0x87, 0x5d, 0x7b, 0x42, 0x40, 0x8c, 0xd7, 0xf4, 0x82, 0x7b, + 0x5a, 0xb5, 0xaa, 0x16, 0x75, 0x58, 0x96, 0x6a, 0x6f, 0xd7, 0xeb, 0x7e, + 0xad, 0xbb, 0x75, 0x17, 0x91, 0xf1, 0xdb, 0x4a, 0x20, 0x84, 0xc4, 0xf3, + 0x61, 0x85, 0x5d, 0xee, 0x89, 0xbe, 0x5f, 0x12, 0xb8, 0x95, 0x04, 0x34, + 0x42, 0x1c, 0xe4, 0x98, 0xf4, 0x8f, 0xc2, 0xb2, 0xfc, 0x78, 0x3e, 0x48, + 0x2b, 0x9a, 0x26, 0xba, 0x50, 0x28, 0x69, 0x2b, 0xba, 0xeb, 0x73, 0x67, + 0x41, 0xe7, 0xfe, 0xdb, 0x47, 0xc1, 0x51, 0x68, 0xf7, 0x0b, 0xc0, 0xcf, + 0x7a, 0xc4, 0x8f, 0x42, 0xa6, 0x06, 0x18, 0x60, 0x27, 0xd3, 0xac, 0xd3, + 0x6e, 0x1f, 0x27, 0x35, 0x0d, 0x6c, 0x4c, 0x9c, 0x27, 0xf3, 0xda, 0xc8, + 0x00, 0xc3, 0xc3, 0xc3, 0xdc, 0x7d, 0xb7, 0x3a, 0x3f, 0x5c, 0x98, 0x56, + 0xd4, 0x6f, 0x63, 0xa2, 0x4e, 0xeb, 0x58, 0xc7, 0x08, 0x3b, 0x83, 0x72, + 0x27, 0xd7, 0xfb, 0xad, 0x03, 0x1d, 0x1a, 0x96, 0xd3, 0x2f, 0xe3, 0x7c, + 0x75, 0x8a, 0x6a, 0x27, 0xd3, 0xb1, 0xf6, 0x49, 0xa6, 0xeb, 0x06, 0xc5, + 0x4a, 0xc2, 0xbb, 0xa6, 0x89, 0x83, 0xb4, 0xa2, 0xb6, 0xa2, 0x1a, 0xe8, + 0x92, 0x76, 0xa1, 0x92, 0x9b, 0x4e, 0xe6, 0xbc, 0x2d, 0x8f, 0x21, 0x37, + 0x9d, 0x0c, 0xc0, 0x7d, 0x13, 0xa1, 0xfb, 0xf7, 0xa5, 0xa2, 0xee, 0xb7, + 0x14, 0x73, 0x06, 0xc5, 0x1c, 0xec, 0xd2, 0xd0, 0xbb, 0xff, 0x4c, 0x90, + 0xad, 0x0d, 0x97, 0x5e, 0xac, 0x1c, 0x6d, 0x88, 0xf6, 0x7e, 0x7a, 0x49, + 0xb6, 0x09, 0xfb, 0x39, 0x91, 0xd8, 0xad, 0x17, 0xc0, 0xfd, 0x76, 0xef, + 0x05, 0x5d, 0xbd, 0x74, 0x44, 0x20, 0x5a, 0xbe, 0xfe, 0x49, 0x2f, 0xa1, + 0xbd, 0x33, 0x0e, 0xa0, 0xda, 0x04, 0x6c, 0x69, 0x80, 0xbd, 0xdb, 0x8b, + 0xf9, 0x75, 0xe8, 0x2b, 0x66, 0x08, 0xd2, 0x8a, 0xfa, 0x7d, 0x2c, 0x72, + 0x1e, 0x05, 0x66, 0x45, 0xfd, 0x92, 0xea, 0x15, 0x2f, 0xe9, 0xd7, 0x45, + 0xde, 0x5f, 0x94, 0x80, 0xcd, 0x70, 0xcf, 0xae, 0x4e, 0xa8, 0x6a, 0x52, + 0x37, 0x6f, 0x83, 0x87, 0xbb, 0x43, 0x1d, 0xff, 0x33, 0xe8, 0xe2, 0x8b, + 0x2e, 0xa1, 0xb6, 0x2f, 0xac, 0xdf, 0xe6, 0x7f, 0xb8, 0x12, 0x63, 0xc0, + 0xea, 0xda, 0x7f, 0xe8, 0xb5, 0x70, 0x75, 0x21, 0xfe, 0x22, 0x17, 0x3e, + 0xeb, 0xa2, 0xcf, 0x2e, 0xe9, 0x02, 0x39, 0x19, 0x8f, 0xab, 0xdd, 0xd1, + 0xf0, 0xc0, 0x66, 0x4e, 0xc0, 0x94, 0x8b, 0x6c, 0x7a, 0x88, 0x42, 0xe2, + 0xd9, 0x27, 0x23, 0xef, 0xa1, 0x32, 0x8b, 0x74, 0x25, 0xc2, 0x0c, 0xe3, + 0x48, 0xaf, 0x01, 0x52, 0xf7, 0x3b, 0xa5, 0x44, 0x22, 0x11, 0x39, 0x03, + 0x41, 0x08, 0xc6, 0xba, 0xef, 0xeb, 0xeb, 0x39, 0x7b, 0x78, 0x87, 0x8e, + 0x22, 0x35, 0x10, 0x38, 0xde, 0x57, 0x1d, 0xfa, 0x96, 0xc1, 0xd8, 0x1b, + 0xb5, 0x0d, 0x41, 0x00, 0xe7, 0xf2, 0x6d, 0x6c, 0xfe, 0xc2, 0xf5, 0x5c, + 0xbb, 0x76, 0xb4, 0x67, 0xfa, 0x6b, 0xae, 0xfc, 0x28, 0x57, 0x5e, 0x75, + 0x5d, 0x50, 0x8e, 0x83, 0x55, 0x32, 0x85, 0x7f, 0xbe, 0xd0, 0x05, 0xde, + 0xb3, 0x4b, 0x96, 0xb0, 0x48, 0xf7, 0x89, 0xfc, 0x7e, 0x55, 0x6b, 0xc9, + 0x12, 0x4e, 0x88, 0x40, 0xa5, 0x96, 0x2e, 0x5d, 0xca, 0xb3, 0xd5, 0x6a, + 0x60, 0xf7, 0x48, 0xdf, 0x8d, 0x5f, 0x09, 0xfc, 0x3a, 0x72, 0xfe, 0xa6, + 0x13, 0x54, 0xdf, 0xef, 0x99, 0x5f, 0x34, 0xbb, 0xc6, 0x3f, 0x14, 0xf5, + 0x02, 0x6b, 0xbd, 0x54, 0x4f, 0x96, 0xc3, 0xfd, 0xbb, 0x00, 0x88, 0x7f, + 0xd8, 0x85, 0x64, 0x2d, 0xd6, 0x8a, 0x12, 0xce, 0x54, 0x95, 0x8b, 0x2f, + 0xcd, 0xb3, 0xfd, 0xe6, 0x06, 0xa5, 0x37, 0xb8, 0x5c, 0x75, 0x65, 0xb8, + 0xd0, 0x76, 0xe3, 0xfb, 0x6f, 0x8a, 0x01, 0xb6, 0x3a, 0xca, 0x92, 0xe8, + 0x4b, 0x7a, 0x4d, 0x8f, 0x1d, 0xe3, 0x82, 0xcb, 0xce, 0x99, 0xbf, 0x34, + 0x2d, 0xd9, 0x22, 0xdb, 0x05, 0x06, 0x17, 0x95, 0xff, 0x26, 0xe3, 0x2f, + 0x06, 0xff, 0x7d, 0x68, 0xed, 0x45, 0x37, 0x50, 0xbd, 0x7f, 0x2b, 0x56, + 0xa1, 0x33, 0xcc, 0xb2, 0x4a, 0x08, 0x61, 0x60, 0xe9, 0xd7, 0xa3, 0xbc, + 0x01, 0x42, 0x18, 0x48, 0xe9, 0x61, 0x88, 0x06, 0xad, 0x26, 0x88, 0x4c, + 0x16, 0x09, 0x94, 0x97, 0x9b, 0xb4, 0x9a, 0x0d, 0x2a, 0x4f, 0xb8, 0xd8, + 0x9f, 0xbe, 0x01, 0xd3, 0x02, 0xbb, 0x56, 0x54, 0x0b, 0x6e, 0x97, 0x80, + 0x10, 0x12, 0x77, 0xbf, 0x5a, 0xdc, 0xd9, 0xbf, 0xcc, 0x52, 0xf7, 0x0d, + 0x21, 0x28, 0x8a, 0x2c, 0x52, 0x1a, 0xb4, 0x9a, 0x2e, 0xd9, 0x25, 0x2d, + 0xc4, 0x0b, 0x28, 0x10, 0xf0, 0x31, 0xa8, 0x0e, 0xf5, 0x3c, 0x3a, 0x92, + 0xeb, 0x07, 0x8f, 0x84, 0x2d, 0x2b, 0x7f, 0xf4, 0x11, 0xb0, 0xf2, 0xf2, + 0xcd, 0x2f, 0xa9, 0x47, 0x51, 0xe0, 0xac, 0x67, 0x23, 0x7e, 0xc7, 0x27, + 0xe2, 0xbc, 0x1d, 0xf8, 0x69, 0xa2, 0x9c, 0xbf, 0xe4, 0xc5, 0x43, 0xce, + 0xf3, 0xff, 0x67, 0xef, 0xed, 0xc3, 0xe4, 0x28, 0xee, 0x7b, 0xdf, 0x8f, + 0xec, 0x11, 0xd4, 0x38, 0xb3, 0xa6, 0x87, 0xac, 0x9c, 0x19, 0x58, 0x91, + 0x69, 0xb2, 0xc2, 0x1a, 0x19, 0xc5, 0x1a, 0x19, 0xdb, 0xec, 0x5a, 0xc4, + 0xd2, 0x12, 0x88, 0xb4, 0xb6, 0x73, 0x6d, 0x11, 0x6c, 0x23, 0xa3, 0x73, + 0x05, 0xc2, 0x79, 0xb1, 0x04, 0xb1, 0xaf, 0x70, 0x72, 0x1d, 0x89, 0x1c, + 0x12, 0xa4, 0xe3, 0x9b, 0x83, 0x75, 0x9c, 0x0b, 0x92, 0xe3, 0xe7, 0xc1, + 0x02, 0x25, 0x18, 0x89, 0x18, 0xa3, 0xf8, 0x04, 0x7b, 0x25, 0x1b, 0xb3, + 0x2b, 0x5b, 0xca, 0x2e, 0x60, 0xa3, 0x11, 0x01, 0x34, 0x12, 0xbb, 0xa6, + 0x27, 0xd6, 0x9a, 0x99, 0xa0, 0x89, 0xa7, 0x61, 0x27, 0x77, 0x0a, 0x33, + 0x09, 0xf7, 0x8f, 0xaa, 0xea, 0x97, 0x79, 0xd9, 0x5d, 0xf1, 0xe2, 0xb7, + 0xf4, 0x57, 0xcf, 0xaa, 0xab, 0xeb, 0xbd, 0xbb, 0xa7, 0xbb, 0xab, 0xaa, + 0xeb, 0xf7, 0xa9, 0x85, 0x8b, 0xba, 0x38, 0x7e, 0x4c, 0x19, 0x83, 0xef, + 0xd2, 0x7e, 0xeb, 0x81, 0xad, 0xd7, 0x00, 0x7f, 0x59, 0xc2, 0x99, 0x9f, + 0x66, 0x18, 0xf8, 0x02, 0xd0, 0xfb, 0xc8, 0x14, 0x13, 0xef, 0xee, 0x62, + 0x21, 0x6a, 0xd8, 0xe7, 0xf8, 0xb1, 0x29, 0x98, 0x82, 0xe1, 0xc3, 0x82, + 0x81, 0x65, 0xad, 0x4f, 0xb1, 0xed, 0x9f, 0xdf, 0x12, 0xd8, 0xfb, 0x18, + 0xcf, 0x14, 0x36, 0xb0, 0xe8, 0x92, 0x7d, 0x2c, 0x79, 0xb1, 0x15, 0xdc, + 0x1d, 0xf4, 0xd9, 0xa2, 0xc1, 0x0b, 0x47, 0xcf, 0x54, 0xdb, 0xcb, 0x17, + 0x75, 0xcd, 0x0a, 0xa8, 0x05, 0x0a, 0x92, 0x75, 0xb0, 0xc5, 0x37, 0xc3, + 0xba, 0x75, 0xb0, 0x7b, 0xb7, 0xda, 0x3b, 0x78, 0xd0, 0x8f, 0xdb, 0xac, + 0xe3, 0xc7, 0xa6, 0x08, 0x76, 0xf5, 0x96, 0xbc, 0x08, 0x73, 0xa6, 0x1c, + 0x5e, 0x6e, 0x2a, 0xda, 0xec, 0xef, 0xbd, 0x19, 0x3c, 0x3c, 0xcd, 0x6e, + 0xe0, 0xe6, 0x4c, 0x88, 0x62, 0xb3, 0xb7, 0xe8, 0xef, 0xdc, 0xfc, 0xf7, + 0x53, 0x2a, 0x4e, 0x50, 0xbb, 0x51, 0x70, 0xac, 0x9b, 0x03, 0x7e, 0xeb, + 0x5a, 0xeb, 0xe5, 0xe7, 0xf1, 0x04, 0x1f, 0x5d, 0x9c, 0xf1, 0xd3, 0x92, + 0x61, 0xa6, 0x4f, 0xd0, 0xab, 0x57, 0xa4, 0xd9, 0x37, 0x52, 0xf2, 0xa2, + 0xad, 0xbe, 0x44, 0xbd, 0xdb, 0x86, 0x0e, 0xf9, 0xe3, 0x45, 0x83, 0x97, + 0xf8, 0x63, 0x1d, 0x41, 0x7f, 0x03, 0x11, 0x5a, 0xb3, 0x22, 0xcd, 0x9e, + 0x91, 0x92, 0xe7, 0x36, 0x32, 0x7e, 0xb3, 0xf5, 0x07, 0x18, 0x9d, 0x50, + 0xef, 0xf8, 0xfe, 0x5e, 0x8b, 0xd1, 0x09, 0x17, 0x79, 0xab, 0xa4, 0xff, + 0xd3, 0x29, 0xfa, 0x3f, 0x9d, 0x62, 0x45, 0xd9, 0xf6, 0x80, 0xa0, 0xff, + 0x34, 0xfa, 0x18, 0xfb, 0x6a, 0x57, 0x03, 0xb0, 0xfd, 0xf2, 0xc2, 0xb4, + 0xc7, 0x78, 0xf5, 0x9a, 0xf7, 0xb0, 0xfe, 0x62, 0x7f, 0xcc, 0xca, 0x80, + 0xb4, 0xd2, 0x17, 0xd9, 0xe4, 0x0e, 0x16, 0xc8, 0x9f, 0x26, 0x58, 0xab, + 0x59, 0x41, 0xa0, 0xd6, 0x43, 0xdf, 0xfd, 0x27, 0xde, 0xf3, 0xfb, 0xfe, + 0xbe, 0x81, 0x67, 0x95, 0x27, 0x25, 0xe5, 0x1b, 0x4a, 0xa4, 0xdf, 0x69, + 0xb1, 0x74, 0x7e, 0x9d, 0x2d, 0x16, 0xc8, 0xb2, 0x84, 0x32, 0xa1, 0x76, + 0x9f, 0xd1, 0x50, 0xf5, 0xd3, 0x14, 0x9e, 0x90, 0xe4, 0x16, 0xea, 0xb0, + 0x87, 0xdb, 0xb7, 0x04, 0x36, 0xdf, 0xb4, 0x83, 0x6d, 0xb7, 0x6c, 0xe4, + 0xc6, 0x4d, 0x1b, 0x19, 0x38, 0xcd, 0x7a, 0x57, 0x75, 0x1f, 0x36, 0x9d, + 0xca, 0x52, 0xaf, 0xb8, 0x2d, 0xa8, 0xd5, 0xed, 0x5f, 0x2f, 0xb0, 0xe9, + 0xfd, 0x59, 0xb6, 0x7f, 0xbd, 0xa8, 0x7d, 0xb6, 0x02, 0x30, 0x3c, 0xb9, + 0x87, 0x7d, 0x13, 0x43, 0x58, 0x62, 0x90, 0x64, 0x77, 0x5a, 0x81, 0x9e, + 0x1a, 0x92, 0x6a, 0x13, 0x24, 0xdf, 0x4a, 0x28, 0x28, 0xa5, 0x15, 0x4b, + 0xe1, 0xea, 0xbb, 0x58, 0xb9, 0xc3, 0x4a, 0xa6, 0xd2, 0xb8, 0x93, 0xea, + 0x2d, 0xed, 0x36, 0xca, 0x08, 0x61, 0xe3, 0xd6, 0x4c, 0xbf, 0xed, 0xab, + 0x6d, 0xeb, 0x6e, 0x99, 0x53, 0xd6, 0x40, 0xfd, 0x76, 0xa5, 0xa0, 0x14, + 0x68, 0xc5, 0x58, 0x31, 0x3c, 0x58, 0xbe, 0xdb, 0xb0, 0x5a, 0x33, 0x98, + 0x41, 0x75, 0x5d, 0xd7, 0x72, 0xa0, 0x7e, 0x52, 0x56, 0x43, 0x75, 0xad, + 0x96, 0x4b, 0x08, 0x61, 0x23, 0x6b, 0xb7, 0x04, 0xea, 0xfa, 0x7b, 0xa1, + 0x7c, 0xac, 0x58, 0x8a, 0xa2, 0xfb, 0x05, 0xf2, 0xc7, 0xf7, 0x91, 0x5b, + 0xa8, 0xe3, 0x95, 0x81, 0xc4, 0x6a, 0x5c, 0x39, 0xea, 0xe5, 0xa7, 0x40, + 0x5a, 0x9f, 0xa0, 0xe8, 0x7e, 0x01, 0x2b, 0xb1, 0xda, 0x83, 0x89, 0x59, + 0xd6, 0xb5, 0x2d, 0xe7, 0xd5, 0xee, 0xc9, 0x86, 0xbe, 0x01, 0xb5, 0xd3, + 0xc1, 0xa6, 0xfd, 0xe2, 0x34, 0x71, 0x33, 0x4d, 0xf1, 0xa6, 0x8b, 0x0b, + 0xd0, 0x7b, 0x00, 0xd6, 0x2d, 0x57, 0xee, 0x2d, 0x93, 0x3e, 0x30, 0xea, + 0x83, 0x1f, 0x84, 0x8d, 0x1b, 0x37, 0xf2, 0xdb, 0xbf, 0xbd, 0xa3, 0x3d, + 0x44, 0x2a, 0x30, 0xb0, 0xb4, 0x63, 0x02, 0x56, 0x06, 0x20, 0x5a, 0x13, + 0x33, 0x01, 0xb5, 0xf0, 0xe3, 0x4f, 0x1c, 0x00, 0x0e, 0x40, 0x6f, 0xaf, + 0x9f, 0x97, 0x01, 0x58, 0xad, 0x6c, 0xce, 0xeb, 0x80, 0x86, 0x55, 0x1d, + 0x84, 0x89, 0x0f, 0xea, 0xb1, 0xa8, 0x8d, 0x2b, 0xe1, 0x93, 0x3b, 0x98, + 0x3c, 0x48, 0x68, 0xa0, 0xca, 0x00, 0xb0, 0x36, 0x06, 0x06, 0xbb, 0x76, + 0xf4, 0xaa, 0xf1, 0xba, 0x60, 0x9e, 0x33, 0x01, 0xb5, 0x4c, 0x9c, 0x89, + 0x00, 0x7c, 0xab, 0x5d, 0x5d, 0x4d, 0xbc, 0x60, 0x7e, 0x13, 0x13, 0x7a, + 0xac, 0xaf, 0x17, 0x56, 0x1a, 0xf7, 0x2c, 0x66, 0x11, 0x79, 0xf0, 0xaa, + 0x27, 0x1d, 0xc8, 0xa4, 0xa1, 0x51, 0x47, 0xba, 0x1a, 0xf2, 0xf1, 0x0a, + 0x60, 0xc8, 0xaf, 0x97, 0x44, 0x31, 0xf0, 0x5b, 0x6e, 0xc8, 0xd0, 0x02, + 0x1a, 0xde, 0x17, 0x3a, 0x7d, 0x2c, 0x1e, 0x58, 0x2b, 0xd6, 0xae, 0x27, + 0xe4, 0xef, 0xab, 0x6e, 0x69, 0x3b, 0x4c, 0x93, 0xf2, 0x0f, 0xf6, 0xf7, + 0x4d, 0xd4, 0xd4, 0x03, 0x0a, 0xbe, 0x25, 0xa5, 0x4b, 0x66, 0x44, 0xe0, + 0x56, 0x1c, 0xdd, 0xe6, 0x2e, 0x7b, 0xfd, 0x84, 0xe0, 0xf6, 0xb5, 0xd4, + 0xab, 0xc9, 0x2f, 0x13, 0x83, 0x62, 0x03, 0xe2, 0x08, 0x68, 0x40, 0xdd, + 0x27, 0x8b, 0xa9, 0x6d, 0x03, 0xb2, 0xfa, 0x9c, 0x3a, 0x81, 0xeb, 0x6e, + 0x3e, 0x27, 0xea, 0x1a, 0x78, 0xfe, 0xc2, 0xdb, 0xd7, 0x69, 0x08, 0x5f, + 0x0f, 0x50, 0x10, 0xae, 0x82, 0xce, 0x83, 0x0a, 0x0c, 0xc4, 0x60, 0xb4, + 0xa1, 0xc6, 0x24, 0xae, 0xab, 0x48, 0x64, 0x4c, 0x81, 0xa3, 0x14, 0xac, + 0x4a, 0x90, 0xd3, 0x6b, 0xe7, 0x38, 0xfa, 0xfa, 0x15, 0x1a, 0x12, 0x51, + 0x01, 0x3b, 0x26, 0xbc, 0x3a, 0x05, 0x3f, 0xcb, 0x06, 0xbb, 0x64, 0xb6, + 0xfe, 0xad, 0xe7, 0xcb, 0xbe, 0xbf, 0x01, 0x6a, 0x99, 0x74, 0x39, 0x0b, + 0xf2, 0x35, 0x30, 0x4b, 0xff, 0x88, 0x98, 0xe9, 0xff, 0xd5, 0x71, 0x1a, + 0xba, 0xaf, 0xa4, 0x81, 0x58, 0x52, 0x4a, 0x1c, 0x7d, 0x0c, 0xa9, 0x43, + 0xfb, 0x58, 0xff, 0x47, 0x37, 0x52, 0xaa, 0x94, 0x28, 0x3c, 0xa9, 0xda, + 0x0c, 0xb9, 0x5c, 0x8e, 0xc1, 0x55, 0x83, 0xe4, 0x16, 0xe7, 0x18, 0x7a, + 0x70, 0x88, 0xa1, 0xcf, 0x7f, 0x0e, 0x04, 0x38, 0xf8, 0x80, 0x9c, 0x52, + 0x0c, 0xb2, 0x28, 0xc8, 0x97, 0x88, 0xa9, 0x7b, 0x4d, 0x04, 0xee, 0x49, + 0x81, 0x06, 0x37, 0xbb, 0x0a, 0x98, 0xe5, 0x34, 0x2d, 0xf6, 0x52, 0x08, + 0x9c, 0x4d, 0xf5, 0x4b, 0xae, 0x42, 0xa3, 0x33, 0x44, 0xdd, 0xe8, 0x2c, + 0x31, 0x87, 0xb3, 0xb9, 0x80, 0x73, 0xcf, 0x3d, 0x97, 0xe3, 0xa5, 0xef, + 0xf1, 0xec, 0x0b, 0xaa, 0x2d, 0x3e, 0xcf, 0x03, 0x49, 0xa9, 0xb6, 0xfd, + 0x0f, 0x50, 0xfe, 0x4b, 0xde, 0xfc, 0x56, 0x8e, 0xbe, 0x70, 0xc2, 0xdb, + 0x06, 0xd5, 0x0c, 0xb0, 0xea, 0x54, 0xde, 0x59, 0x42, 0xc1, 0xa7, 0xe2, + 0x31, 0x3f, 0x7e, 0xe9, 0x54, 0x85, 0x52, 0x4d, 0x81, 0xb4, 0x0c, 0x4c, + 0xcb, 0x68, 0x59, 0x6e, 0x3e, 0x87, 0x47, 0xf3, 0xfc, 0x86, 0x06, 0xf6, + 0x18, 0x30, 0xd7, 0x4c, 0x3a, 0xef, 0xcd, 0xad, 0x75, 0x09, 0xa6, 0x4d, + 0xa5, 0xe1, 0xec, 0x9b, 0x6f, 0xe6, 0x5d, 0xe3, 0x47, 0xbd, 0x70, 0xe7, + 0xe8, 0x51, 0xfe, 0x5e, 0x6f, 0x59, 0x3a, 0x33, 0x4c, 0xab, 0xdd, 0xf1, + 0x4d, 0x17, 0xf6, 0xe8, 0xe2, 0x06, 0x7f, 0xfe, 0x96, 0x95, 0x1c, 0x7b, + 0xe8, 0x21, 0x80, 0x10, 0x60, 0xeb, 0xc5, 0x5e, 0xf8, 0x2a, 0x2f, 0xa9, + 0x97, 0xcf, 0xed, 0x07, 0x38, 0x53, 0x3f, 0xbf, 0x0d, 0x3c, 0xeb, 0x4f, + 0x57, 0xfa, 0xe9, 0x00, 0x1e, 0x78, 0x49, 0xa5, 0x3d, 0x71, 0xe2, 0x04, + 0xe7, 0xbc, 0xb9, 0x0b, 0xe6, 0xcc, 0xae, 0xd7, 0x2b, 0x12, 0x16, 0xd4, + 0xea, 0xc4, 0x85, 0xc0, 0x12, 0x82, 0x54, 0xca, 0x6f, 0x1f, 0xdb, 0x19, + 0x3b, 0xf4, 0xde, 0x2f, 0xc5, 0xd4, 0x37, 0xf9, 0x7a, 0xa5, 0x8e, 0x53, + 0x71, 0x70, 0x46, 0x1c, 0x92, 0xfa, 0xd6, 0x4e, 0x63, 0x51, 0x95, 0x25, + 0xea, 0x95, 0x3a, 0xd9, 0xc5, 0x4b, 0x29, 0x3c, 0x71, 0x84, 0xf5, 0x7f, + 0xb4, 0x81, 0xd2, 0xc4, 0x30, 0x69, 0x99, 0xa6, 0x54, 0x53, 0xcf, 0x61, + 0x29, 0xa5, 0xf7, 0x9d, 0xbe, 0x5a, 0xc1, 0x03, 0x72, 0xd7, 0x6b, 0x90, + 0xb4, 0x04, 0x58, 0x0a, 0xb9, 0x5d, 0x95, 0x2e, 0xf1, 0x84, 0xca, 0xf9, + 0x73, 0xb7, 0xed, 0xc4, 0x4e, 0xa5, 0x29, 0x1c, 0x3f, 0x42, 0xba, 0x57, + 0xd5, 0xaf, 0x34, 0x51, 0x52, 0xdf, 0x9f, 0xb5, 0x92, 0xdd, 0x02, 0x29, + 0x80, 0x38, 0x64, 0x53, 0xea, 0x5b, 0x6a, 0x55, 0x56, 0x41, 0x0a, 0x04, + 0x42, 0x41, 0xc3, 0xaa, 0x82, 0xba, 0x9e, 0x70, 0x11, 0xd7, 0x37, 0xbb, + 0xd9, 0x22, 0x21, 0x9d, 0x4c, 0x53, 0xaa, 0xaa, 0x7a, 0x8a, 0x24, 0x70, + 0x0a, 0x68, 0x88, 0xd0, 0x97, 0x09, 0xd3, 0xc6, 0x0b, 0xbd, 0x1e, 0x2c, + 0x10, 0x71, 0x01, 0x75, 0xfd, 0x0d, 0xb3, 0xe9, 0xdd, 0xd1, 0x02, 0xce, + 0xd2, 0xaf, 0x97, 0x90, 0x7f, 0x4c, 0x20, 0x84, 0x02, 0x7f, 0xa5, 0x7b, + 0x6d, 0x5c, 0x0d, 0x81, 0x54, 0x71, 0x5c, 0xa4, 0x94, 0x0c, 0x1f, 0x3d, + 0x42, 0xb6, 0x27, 0xad, 0x20, 0x61, 0x12, 0x05, 0xdd, 0x8a, 0x4d, 0xdf, + 0xd6, 0x6c, 0x06, 0x5d, 0x05, 0xc1, 0x4e, 0xcd, 0x61, 0xc6, 0xfd, 0xf2, + 0xbc, 0x7b, 0xd5, 0xb1, 0x9e, 0xb9, 0x0e, 0xe6, 0x0b, 0x38, 0x29, 0xbd, + 0x70, 0x39, 0x29, 0x11, 0x7d, 0x96, 0xf2, 0x9b, 0x2f, 0x42, 0xe3, 0x77, + 0x9d, 0x40, 0x5c, 0x46, 0x06, 0xa8, 0x65, 0xdc, 0x63, 0x9a, 0xca, 0x6d, + 0xe0, 0x5b, 0xf9, 0xa7, 0x1c, 0x55, 0xde, 0xa4, 0xce, 0xdb, 0x94, 0x3d, + 0x5f, 0xf0, 0xb1, 0xd8, 0xc7, 0xc8, 0x2d, 0xcc, 0xb2, 0xf1, 0x8e, 0x8d, + 0xde, 0x71, 0x98, 0x32, 0x8d, 0x1b, 0xc0, 0x5e, 0x30, 0x9f, 0xf3, 0x52, + 0xed, 0xbf, 0x00, 0x9e, 0xf3, 0x6b, 0xbf, 0x8e, 0xbd, 0x60, 0x3e, 0x4f, + 0xd5, 0xf2, 0x6d, 0x01, 0x57, 0x5e, 0xbe, 0xba, 0x0e, 0xc6, 0xbd, 0xde, + 0x5e, 0xcf, 0xae, 0x43, 0x3b, 0x43, 0xc7, 0xd8, 0x0e, 0x9c, 0xd5, 0x0c, + 0xfd, 0x32, 0xe7, 0x29, 0x04, 0xec, 0xea, 0xd3, 0x63, 0xe1, 0x63, 0x2e, + 0x27, 0xa7, 0x3a, 0xaf, 0x70, 0x12, 0x04, 0x6a, 0x4d, 0x17, 0x2f, 0x52, + 0xa4, 0x48, 0x91, 0x22, 0x45, 0x8a, 0x14, 0x29, 0x52, 0xa4, 0x48, 0x91, + 0x22, 0x45, 0x8a, 0x14, 0x29, 0x52, 0xa4, 0x48, 0x91, 0x22, 0x45, 0x8a, + 0x14, 0x29, 0x52, 0xa4, 0x48, 0x91, 0x22, 0xcd, 0x5e, 0x11, 0x54, 0x2b, + 0x52, 0xa4, 0x48, 0x91, 0x22, 0x45, 0xfa, 0x39, 0xd0, 0x6c, 0xa0, 0x4c, + 0xc1, 0x38, 0xcd, 0xee, 0x74, 0x4f, 0xba, 0x05, 0x9a, 0x22, 0x62, 0x0a, + 0x50, 0x25, 0x62, 0xc2, 0x83, 0x70, 0x05, 0xd3, 0xa4, 0x7a, 0x52, 0x94, + 0x2a, 0xbe, 0x31, 0xb8, 0x01, 0x6b, 0x01, 0x94, 0x27, 0xcb, 0xf4, 0x2d, + 0xeb, 0x63, 0xe4, 0xdb, 0xfe, 0x2a, 0xf1, 0x66, 0xd2, 0x75, 0xe1, 0xb8, + 0x9a, 0x8e, 0xeb, 0x14, 0x1d, 0xac, 0x6e, 0x8b, 0x64, 0x22, 0x3c, 0x11, + 0xb7, 0x54, 0x2e, 0xd1, 0x7f, 0x71, 0x3f, 0xc3, 0x07, 0x4f, 0x0f, 0x46, + 0x20, 0x0d, 0x14, 0x25, 0xe6, 0x03, 0xae, 0xda, 0xd5, 0xdd, 0x1c, 0x9b, + 0x89, 0x13, 0x3c, 0xd6, 0xe9, 0xdc, 0x66, 0x3f, 0xb4, 0xda, 0xa9, 0xde, + 0xf7, 0x8c, 0xd4, 0x03, 0xfb, 0xc1, 0xb4, 0xd5, 0x5a, 0x2b, 0x14, 0xa0, + 0x5d, 0xbe, 0x22, 0x26, 0x66, 0x86, 0x3e, 0x74, 0x76, 0xa8, 0xbc, 0xcc, + 0xfc, 0x4d, 0x39, 0x8d, 0x91, 0xb1, 0xb7, 0xe2, 0xb0, 0x9e, 0x06, 0x9e, + 0x13, 0xc8, 0xbc, 0xab, 0xe0, 0x59, 0x46, 0x8e, 0x84, 0x94, 0xe5, 0xfb, + 0xa5, 0x2c, 0x48, 0x03, 0x25, 0xd4, 0x76, 0x5c, 0xd7, 0xbf, 0x2f, 0x45, + 0x7d, 0x5c, 0xc3, 0xa9, 0x16, 0x68, 0x80, 0x54, 0x0c, 0x18, 0x97, 0x7e, + 0x9a, 0x71, 0xa9, 0x2c, 0x86, 0x9c, 0x50, 0x07, 0xff, 0x72, 0x00, 0x00, + 0x20, 0x00, 0x49, 0x44, 0x41, 0x54, 0xa0, 0x9f, 0x0b, 0x3d, 0xca, 0x6d, + 0xd2, 0xd7, 0x0d, 0x68, 0xea, 0x9d, 0x29, 0xe2, 0x8e, 0xab, 0x60, 0x5b, + 0x41, 0xf8, 0x94, 0xf6, 0x63, 0x9e, 0x00, 0xc7, 0x55, 0x10, 0x2c, 0x53, + 0xa6, 0x09, 0x3f, 0x8d, 0xf4, 0x74, 0x0b, 0xbf, 0xce, 0xae, 0xc6, 0x4c, + 0x05, 0xf3, 0x4f, 0x08, 0x55, 0xd7, 0x86, 0x32, 0x14, 0x63, 0xbc, 0xac, + 0x00, 0x5a, 0x69, 0xd4, 0x6c, 0xf4, 0x14, 0x90, 0xb5, 0x94, 0x7b, 0x85, + 0xde, 0x2e, 0xb4, 0x20, 0x2d, 0xfc, 0x3a, 0x15, 0x82, 0xe5, 0x4b, 0x95, + 0xff, 0x2c, 0x80, 0x5a, 0xea, 0x3a, 0x29, 0x8b, 0x64, 0x2b, 0x61, 0x26, + 0xd8, 0x4b, 0x0f, 0x9c, 0x55, 0x2e, 0x17, 0x74, 0x58, 0x0a, 0xb7, 0x56, + 0x26, 0x95, 0xca, 0x92, 0xd2, 0xf7, 0x92, 0x6c, 0xf3, 0x7b, 0x33, 0x9a, + 0x09, 0xbc, 0xe5, 0xd6, 0xa6, 0x37, 0x6c, 0xb2, 0x12, 0x76, 0xc7, 0x38, + 0x26, 0x6c, 0xba, 0x38, 0x46, 0x69, 0xb2, 0x58, 0x96, 0x82, 0xd7, 0xa5, + 0x52, 0xa9, 0x96, 0x67, 0x98, 0xeb, 0xba, 0xa4, 0x7b, 0xd2, 0x8c, 0x3e, + 0x3c, 0x8a, 0xdd, 0x63, 0x53, 0x75, 0xab, 0x2d, 0x79, 0xb6, 0x33, 0x26, + 0xaf, 0x37, 0x3a, 0xaf, 0xac, 0xdb, 0xae, 0x4e, 0x42, 0x08, 0xaf, 0x1e, + 0xed, 0x54, 0x2a, 0x97, 0xc8, 0x2d, 0xc9, 0x91, 0x3f, 0xaa, 0x40, 0x51, + 0xb2, 0x09, 0x98, 0x64, 0xce, 0x3f, 0x84, 0x41, 0x18, 0x41, 0xc8, 0x94, + 0x6c, 0x32, 0xb4, 0x69, 0xa7, 0xa4, 0x48, 0x92, 0xec, 0x49, 0xe2, 0x4c, + 0x6a, 0x8f, 0x98, 0x3f, 0x21, 0x3a, 0x2e, 0xe2, 0xd4, 0x03, 0x2b, 0x06, + 0xaf, 0xb9, 0x72, 0x35, 0x77, 0xde, 0xbd, 0x0f, 0x1a, 0x12, 0xa7, 0xe8, + 0x20, 0xab, 0x2e, 0x9b, 0xae, 0xdf, 0xa0, 0xca, 0x9d, 0x92, 0xa0, 0xcf, + 0x41, 0xbd, 0xa1, 0xea, 0x71, 0xe4, 0xe8, 0x11, 0x00, 0xec, 0x05, 0x76, + 0xcb, 0xf3, 0xd0, 0x84, 0x59, 0x01, 0xa0, 0x96, 0xac, 0x49, 0xdc, 0x4a, + 0x19, 0xab, 0x3b, 0xa5, 0x8f, 0x41, 0x62, 0x59, 0xe1, 0x74, 0x05, 0xc7, + 0x69, 0x81, 0x70, 0x99, 0xc3, 0xcf, 0xe5, 0xc2, 0xab, 0x7c, 0x1b, 0x60, + 0x99, 0x39, 0x1f, 0x2a, 0xae, 0xd4, 0xf0, 0xb1, 0xf0, 0x79, 0x68, 0xb7, + 0xaa, 0xb2, 0x97, 0x4f, 0x4c, 0xc1, 0xaf, 0x9a, 0x81, 0x5b, 0xc6, 0xbf, + 0x53, 0xfc, 0xe6, 0xf0, 0xe0, 0xef, 0x26, 0x04, 0xd1, 0xd2, 0x6e, 0x53, + 0x87, 0x66, 0x43, 0xa1, 0x99, 0xca, 0x99, 0xad, 0x9a, 0x21, 0x53, 0x13, + 0xc0, 0xaf, 0x4f, 0x13, 0xdf, 0x40, 0x9c, 0x0e, 0x80, 0x87, 0x98, 0x5a, + 0xa9, 0xb1, 0x4e, 0xc6, 0xed, 0xc3, 0xa0, 0x7c, 0xeb, 0x39, 0x13, 0x36, + 0xc1, 0x04, 0xbd, 0xfa, 0xdf, 0x37, 0x79, 0x6d, 0x61, 0x5a, 0xcd, 0xf5, + 0x34, 0x25, 0xf7, 0x06, 0x8e, 0x70, 0x63, 0x07, 0xc0, 0x96, 0x01, 0x83, + 0x99, 0x34, 0x41, 0x10, 0xd8, 0x74, 0xc7, 0x14, 0x84, 0x63, 0xe1, 0x9d, + 0x17, 0x05, 0xf2, 0x3a, 0xc0, 0x01, 0x26, 0x50, 0xb0, 0xad, 0x76, 0x10, + 0x2d, 0x03, 0x26, 0xeb, 0x0d, 0x94, 0xd9, 0xeb, 0x95, 0xd1, 0x0e, 0xdb, + 0xe5, 0xd7, 0x3f, 0x08, 0x35, 0x33, 0x9a, 0x1e, 0x7d, 0xe1, 0xeb, 0xa1, + 0x23, 0x4f, 0xf1, 0x3e, 0xbf, 0x39, 0xc4, 0xa5, 0x4b, 0xdf, 0xc6, 0x43, + 0x47, 0x9e, 0xe2, 0xd2, 0xa5, 0x3f, 0x1b, 0xb0, 0x96, 0x01, 0x6a, 0x65, + 0x2d, 0x0b, 0x91, 0x80, 0x7d, 0x13, 0x65, 0x0f, 0xa6, 0xd5, 0x0c, 0xd9, + 0xfa, 0x45, 0x56, 0xe1, 0x09, 0x6d, 0x9c, 0xde, 0x98, 0x19, 0xa8, 0xe5, + 0xc3, 0xb4, 0x94, 0xda, 0x01, 0x61, 0x7e, 0x26, 0xfa, 0xab, 0x0d, 0xb0, + 0x6a, 0xd0, 0xdf, 0x1f, 0x19, 0x81, 0x49, 0x07, 0xcd, 0x11, 0x62, 0x64, + 0x04, 0xca, 0x8b, 0x61, 0xe8, 0x89, 0x70, 0x32, 0x11, 0x07, 0x12, 0xed, + 0xb3, 0x4c, 0x5d, 0xbc, 0x1e, 0x9e, 0x00, 0x2e, 0x86, 0xb2, 0x87, 0x97, + 0x68, 0xa3, 0x76, 0x40, 0xad, 0x57, 0x1a, 0x6f, 0xd7, 0x16, 0xb8, 0x2c, + 0x60, 0x26, 0xff, 0xe0, 0x30, 0x24, 0x04, 0x1c, 0x2f, 0xc0, 0xb8, 0x03, + 0x1f, 0xd0, 0xc7, 0x18, 0x7c, 0x07, 0x34, 0x01, 0xb5, 0xac, 0x8b, 0xae, + 0xc0, 0xfd, 0xfe, 0xfd, 0xb3, 0xac, 0xd4, 0xeb, 0x2f, 0x79, 0x2a, 0x8e, + 0xd0, 0xaf, 0x41, 0x19, 0xb0, 0xad, 0xad, 0x3a, 0x55, 0x92, 0x76, 0xd2, + 0x73, 0x7b, 0xf1, 0xcb, 0x20, 0x52, 0x6a, 0x6b, 0x94, 0x99, 0x6f, 0xfa, + 0x40, 0x16, 0x5f, 0xfe, 0x42, 0xd8, 0xe0, 0xbe, 0x78, 0x52, 0xb5, 0x59, + 0xb6, 0x7e, 0xfe, 0xa6, 0x16, 0x80, 0x4e, 0xb3, 0xa1, 0x6c, 0xb3, 0x3f, + 0x40, 0xae, 0x37, 0xc5, 0xc0, 0x8a, 0xe9, 0xd1, 0x04, 0x76, 0xc6, 0x66, + 0xd7, 0x5d, 0xbb, 0xc8, 0x4f, 0x94, 0xc3, 0x86, 0xb7, 0x35, 0x03, 0xc5, + 0x0a, 0x03, 0xb9, 0x3c, 0x53, 0xdf, 0x8a, 0xf4, 0xc0, 0x5a, 0x52, 0x4a, + 0xb2, 0xa9, 0x2a, 0xeb, 0xaf, 0x59, 0x8f, 0x53, 0xcc, 0x75, 0x2c, 0x0b, + 0xa0, 0x3a, 0x52, 0xa7, 0xa0, 0x1f, 0xa1, 0xb2, 0xe6, 0x2a, 0xa3, 0x3b, + 0xe0, 0xa1, 0xaf, 0xac, 0x6e, 0x89, 0x2b, 0xa5, 0x04, 0x29, 0x11, 0xda, + 0xb8, 0xad, 0xef, 0x1f, 0xad, 0xe6, 0x08, 0x1e, 0x9c, 0x0b, 0x60, 0xcb, + 0x17, 0x6e, 0x9d, 0x36, 0xfd, 0x2d, 0x9f, 0xfe, 0xc4, 0xb4, 0x75, 0x3b, + 0x1d, 0x89, 0x26, 0xb7, 0x64, 0x76, 0xcf, 0x88, 0xae, 0x53, 0xa7, 0x78, + 0xf1, 0xd4, 0x29, 0xfe, 0x35, 0xe8, 0x17, 0x70, 0x3f, 0xf3, 0xed, 0x6f, + 0x33, 0x35, 0x6f, 0x1e, 0x73, 0xdb, 0xe4, 0x1f, 0x2c, 0xf7, 0xb5, 0x30, + 0x8b, 0x3e, 0xf5, 0xd2, 0x8b, 0x9c, 0x7a, 0xe9, 0x45, 0xfe, 0xfd, 0x19, + 0x65, 0xc4, 0xfa, 0x5c, 0x53, 0x19, 0xaf, 0x56, 0xed, 0xea, 0x2a, 0x00, + 0x29, 0xff, 0xbf, 0x70, 0xb8, 0x0c, 0x22, 0xbe, 0x5e, 0x9b, 0x32, 0xbd, + 0xb2, 0x38, 0xbd, 0xe3, 0xb1, 0x18, 0x05, 0xb2, 0x0c, 0x5e, 0xff, 0x31, + 0xf2, 0x23, 0x05, 0x2c, 0x8e, 0x00, 0x4b, 0x43, 0x71, 0x76, 0x68, 0xa0, + 0x96, 0xe9, 0xb7, 0x03, 0xd4, 0x6b, 0x75, 0xe2, 0xba, 0xaf, 0x56, 0x8a, + 0x29, 0xf0, 0x95, 0xd3, 0xf0, 0x8d, 0xaa, 0xdb, 0x01, 0xb5, 0x9c, 0x86, + 0x54, 0x86, 0xd9, 0x31, 0xb0, 0x1b, 0x41, 0xff, 0x3a, 0x76, 0xac, 0x7d, + 0xeb, 0xc2, 0xc1, 0x87, 0x6a, 0x81, 0xdf, 0x4e, 0x6d, 0xee, 0x0f, 0x35, + 0xc7, 0xeb, 0xa4, 0xd9, 0xc6, 0x6b, 0x4e, 0x33, 0xb0, 0x02, 0xdc, 0x27, + 0xa1, 0x5e, 0xab, 0x12, 0x4f, 0x24, 0xbd, 0x2d, 0x80, 0x25, 0xaa, 0x14, + 0x9e, 0xa8, 0x62, 0xcd, 0x4b, 0x62, 0xae, 0x40, 0xb5, 0xe2, 0xf7, 0xbf, + 0x64, 0x43, 0x1d, 0x5b, 0x2a, 0x0d, 0xf9, 0xf1, 0x32, 0xb9, 0x05, 0x29, + 0xd2, 0x89, 0x14, 0xa2, 0x4b, 0x42, 0x77, 0x3f, 0x96, 0x54, 0x86, 0xde, + 0x52, 0x4a, 0x84, 0x25, 0xc8, 0xe6, 0xd4, 0xfd, 0x9d, 0xcb, 0x80, 0xb9, + 0x9a, 0xc3, 0x4f, 0x82, 0x25, 0x04, 0x56, 0x26, 0x89, 0x74, 0xa1, 0xec, + 0x0c, 0x23, 0xa4, 0x05, 0x2f, 0x49, 0x44, 0xf2, 0xf5, 0x83, 0xb7, 0xbd, + 0x5e, 0x92, 0xd5, 0xff, 0xf4, 0xdc, 0xe2, 0xa7, 0x04, 0xbc, 0x2a, 0x05, + 0xca, 0xec, 0x64, 0x12, 0xff, 0x7a, 0xd6, 0xe5, 0x3b, 0xc0, 0x85, 0xda, + 0xfd, 0xab, 0x01, 0xff, 0x7f, 0x0b, 0xb8, 0x7f, 0xb5, 0xfa, 0x9f, 0x18, + 0xf3, 0xcf, 0x46, 0xe2, 0xf4, 0x0d, 0xcf, 0x01, 0xce, 0x7e, 0x09, 0x9e, + 0x7b, 0x64, 0x8a, 0xb7, 0xbc, 0xdb, 0x7f, 0xd2, 0xda, 0xc0, 0xc5, 0x5d, + 0xa0, 0xed, 0xf7, 0x3b, 0xea, 0xcf, 0x1f, 0xdd, 0xc4, 0x9a, 0x77, 0x6d, + 0x07, 0x14, 0x00, 0xac, 0xdd, 0x28, 0xdd, 0xc0, 0xe5, 0xa9, 0x26, 0x9f, + 0x7b, 0xd8, 0x73, 0x1f, 0x98, 0x1e, 0xc2, 0x0f, 0x81, 0xcb, 0x17, 0xc1, + 0xb9, 0x8f, 0xf8, 0x85, 0xd9, 0x6b, 0xc1, 0xb9, 0x1b, 0xfa, 0x08, 0x8f, + 0x4b, 0x7c, 0xeb, 0xd8, 0x14, 0xe7, 0xcd, 0xea, 0xa8, 0xc2, 0x3a, 0x78, + 0x10, 0x96, 0x2f, 0x57, 0x6e, 0x03, 0xd4, 0x5a, 0x77, 0x10, 0x0e, 0x7c, + 0x00, 0xc4, 0x03, 0x4d, 0x91, 0x8f, 0x4d, 0xf1, 0xd6, 0x77, 0x9b, 0x83, + 0xef, 0xe2, 0xc4, 0x23, 0x53, 0x1c, 0x9d, 0x02, 0xce, 0x04, 0xce, 0xb4, + 0x59, 0xf2, 0xa2, 0xe3, 0xc1, 0xc4, 0x5a, 0xb4, 0x3b, 0xa3, 0x40, 0x58, + 0xeb, 0x8a, 0xb0, 0x2e, 0xa3, 0xe1, 0x5a, 0xb0, 0x77, 0x9d, 0x0e, 0xbb, + 0x19, 0x9f, 0x62, 0x63, 0xfc, 0x9a, 0x55, 0xc4, 0x07, 0x6e, 0xed, 0x0e, + 0xf8, 0xaf, 0xcb, 0xf8, 0x7e, 0x37, 0xab, 0xbf, 0x7b, 0x9f, 0x40, 0x51, + 0x72, 0x8a, 0x3a, 0xe1, 0xd6, 0xd3, 0x45, 0x1a, 0xff, 0x7c, 0x69, 0xf0, + 0x22, 0x9b, 0xa1, 0x5b, 0x1d, 0x58, 0x2e, 0x18, 0x25, 0x4f, 0xff, 0x83, + 0x16, 0xfd, 0x9f, 0x4e, 0xcd, 0x1a, 0xa8, 0x65, 0xd4, 0xb7, 0x20, 0xc9, + 0xd8, 0x78, 0x95, 0xc1, 0x8b, 0xd4, 0xd3, 0xbb, 0x74, 0xb0, 0x40, 0xff, + 0xc1, 0x02, 0xa3, 0xcb, 0xb3, 0xe4, 0xbf, 0x3f, 0xfd, 0xf8, 0xdb, 0x74, + 0x7a, 0xe8, 0xbb, 0xff, 0x14, 0x82, 0x6a, 0x5d, 0xfa, 0x5b, 0xef, 0x81, + 0x85, 0xca, 0x2d, 0xa4, 0x24, 0x77, 0x9b, 0x2e, 0xef, 0x7f, 0x56, 0x49, + 0xff, 0x49, 0x12, 0xee, 0x6e, 0x3f, 0xe6, 0xb6, 0x71, 0xef, 0xa5, 0x20, + 0x61, 0xe9, 0x92, 0x24, 0x83, 0xc9, 0x5b, 0x19, 0xaa, 0x7e, 0x7a, 0x56, + 0xe5, 0x6f, 0xbb, 0x65, 0xe3, 0x2b, 0xae, 0x7b, 0xb2, 0x3b, 0x45, 0x59, + 0x8e, 0x02, 0xea, 0xf9, 0x6f, 0x89, 0x15, 0x5e, 0x98, 0x2b, 0x47, 0xc8, + 0x58, 0xa3, 0xdc, 0x7f, 0x58, 0x85, 0x5b, 0x62, 0x50, 0x6f, 0x53, 0x1e, + 0xf0, 0xa9, 0x59, 0xc5, 0x5a, 0x1e, 0x3a, 0xc2, 0xfb, 0x67, 0x07, 0xf5, + 0x97, 0xba, 0x3e, 0x19, 0xeb, 0x5a, 0x8a, 0xee, 0x60, 0x53, 0xa8, 0x8d, + 0x5b, 0x2b, 0x60, 0x59, 0x29, 0x5c, 0x19, 0x00, 0x6b, 0x69, 0x59, 0xfa, + 0x5d, 0xe7, 0x02, 0x2e, 0x92, 0xb8, 0x6b, 0x11, 0x07, 0xec, 0xee, 0x01, + 0xdc, 0xde, 0xd9, 0xbd, 0xb5, 0x73, 0xa9, 0xcd, 0xa1, 0xfd, 0x24, 0xeb, + 0x55, 0xc9, 0x3d, 0x39, 0x20, 0x17, 0x70, 0x9b, 0xf0, 0x34, 0x90, 0x0f, + 0xa4, 0x08, 0xa7, 0x07, 0x48, 0xa6, 0x6e, 0x69, 0xda, 0x4f, 0xeb, 0x74, + 0x39, 0x40, 0x62, 0xf7, 0x64, 0x55, 0xba, 0x06, 0x24, 0xbb, 0x4d, 0xfa, + 0xa6, 0x7a, 0xe8, 0xf1, 0xc3, 0x64, 0xc7, 0x37, 0x4f, 0x58, 0x13, 0x5f, + 0x37, 0x0e, 0x5a, 0xa8, 0xe6, 0x07, 0x0e, 0xac, 0x64, 0xe5, 0xca, 0x03, + 0xd3, 0xa6, 0x3f, 0x80, 0x86, 0x3a, 0x4d, 0xac, 0x04, 0x0e, 0xb0, 0xb2, + 0x17, 0x0c, 0xde, 0x5d, 0xf9, 0xe9, 0x78, 0x17, 0xea, 0xec, 0x7b, 0x0f, + 0xf0, 0xb5, 0xaf, 0xf5, 0xb2, 0xb1, 0xf7, 0x00, 0x5f, 0xbc, 0xb1, 0x17, + 0x0e, 0x4e, 0x30, 0xd1, 0x3c, 0x44, 0x14, 0xd8, 0x9f, 0x0d, 0x98, 0x6a, + 0x26, 0x99, 0xfc, 0x9b, 0x01, 0x56, 0xed, 0xa4, 0xc6, 0xcf, 0x60, 0xc7, + 0xc4, 0x04, 0xec, 0xd8, 0x41, 0x6f, 0x2f, 0xf4, 0x2c, 0x87, 0x89, 0x83, + 0x7e, 0xbd, 0x4c, 0xfa, 0x60, 0xbd, 0x57, 0x4e, 0x74, 0x1a, 0xe9, 0x7a, + 0xe5, 0x75, 0xdd, 0x31, 0x8b, 0xba, 0x06, 0xeb, 0xf4, 0x9d, 0xd3, 0x2c, + 0xab, 0x05, 0x5c, 0xd5, 0xec, 0xf7, 0xf3, 0x22, 0xdd, 0x17, 0x08, 0xf6, + 0xd7, 0xda, 0xf7, 0x3f, 0x74, 0xa8, 0x01, 0xe8, 0x79, 0x6a, 0xd7, 0x53, + 0x11, 0x21, 0xe0, 0x91, 0x1f, 0x3f, 0x00, 0xc2, 0xf6, 0xd2, 0xc5, 0x11, + 0x22, 0xee, 0x7d, 0x03, 0x72, 0x5d, 0x35, 0xd0, 0xf0, 0x6a, 0x40, 0x5a, + 0xb3, 0x49, 0x6b, 0xfa, 0x1e, 0xcd, 0xf1, 0x84, 0x10, 0x2d, 0xe3, 0x6a, + 0xcd, 0x2a, 0xea, 0xf0, 0x8c, 0x3e, 0x27, 0x45, 0x84, 0x02, 0x6b, 0x49, + 0xbf, 0x6f, 0xb4, 0x34, 0x21, 0x39, 0x52, 0x31, 0x79, 0x42, 0x5a, 0x4a, + 0xd4, 0x27, 0x6b, 0xe1, 0x1d, 0x7b, 0xf0, 0x8d, 0x27, 0x1b, 0xba, 0x9d, + 0x16, 0x0b, 0xf7, 0x00, 0xfd, 0xeb, 0x12, 0x38, 0xff, 0xc0, 0x40, 0x42, + 0x30, 0x5a, 0x93, 0x0c, 0x02, 0x7b, 0x74, 0x90, 0x65, 0x09, 0x72, 0x80, + 0xeb, 0x4a, 0xc6, 0x5c, 0x5d, 0x92, 0x5e, 0xbc, 0xc8, 0xb4, 0x02, 0x0b, + 0x0d, 0x7f, 0x3c, 0x24, 0x04, 0x7f, 0x91, 0x90, 0x4d, 0x68, 0xe0, 0x56, + 0x4d, 0xe2, 0x78, 0xe7, 0x47, 0x7f, 0xa3, 0x0d, 0x7c, 0xbf, 0x15, 0xa0, + 0xe0, 0x5d, 0x01, 0xf0, 0x9a, 0x6c, 0xd4, 0xf5, 0x00, 0x5e, 0x1c, 0x11, + 0xab, 0xab, 0xbe, 0x64, 0x10, 0xac, 0xd5, 0x00, 0x9b, 0x38, 0x6e, 0x45, + 0x2d, 0x48, 0x63, 0xf7, 0xd8, 0xa1, 0xef, 0xd3, 0x55, 0xb7, 0xca, 0xd0, + 0xc8, 0x10, 0x85, 0x7f, 0xd8, 0x87, 0x83, 0xfa, 0x18, 0x6c, 0x35, 0x14, + 0x54, 0x47, 0xc6, 0xe2, 0xc8, 0x86, 0x02, 0x63, 0x99, 0xdf, 0x95, 0xd0, + 0xfd, 0xd5, 0x42, 0x43, 0x9f, 0x2d, 0xed, 0x1f, 0xe8, 0xb1, 0x79, 0x67, + 0xcf, 0xc4, 0xf3, 0x42, 0x62, 0xe0, 0xcc, 0x02, 0xa8, 0x65, 0x34, 0x55, + 0x7a, 0x96, 0xe3, 0xa5, 0x67, 0x79, 0xf6, 0x85, 0xa9, 0x00, 0x4c, 0x4b, + 0xc9, 0x40, 0xb7, 0xca, 0xb1, 0x13, 0xd4, 0x1b, 0xe0, 0xc8, 0x13, 0x9c, + 0xf7, 0xe6, 0x39, 0xfc, 0x98, 0xa7, 0xdb, 0x42, 0xab, 0x66, 0xab, 0x66, + 0xf8, 0x54, 0x7a, 0x5e, 0x37, 0xe9, 0xc4, 0xc9, 0x96, 0x78, 0x69, 0x3d, + 0x5e, 0xba, 0xac, 0x5f, 0xbd, 0x0f, 0x6b, 0x6f, 0x3a, 0x49, 0xbd, 0xa1, + 0xe0, 0x58, 0xa0, 0x00, 0x59, 0x06, 0x94, 0x15, 0x04, 0x66, 0xcd, 0x54, + 0xb7, 0xb3, 0xce, 0x50, 0x75, 0x78, 0xd7, 0x89, 0xa3, 0x3c, 0xba, 0x60, + 0x09, 0xa0, 0x40, 0x5a, 0x1f, 0xf9, 0x15, 0x15, 0xfe, 0xae, 0xb7, 0xbe, + 0xf2, 0x63, 0x9b, 0x49, 0xbb, 0x9f, 0xfb, 0x26, 0x9b, 0x3f, 0xf7, 0xd7, + 0x6a, 0xe7, 0xc6, 0x1b, 0x3d, 0x7f, 0x03, 0xc9, 0x6a, 0x96, 0xf1, 0xff, + 0xab, 0x03, 0x07, 0xf8, 0xc0, 0xdc, 0xb9, 0x21, 0xb8, 0x56, 0xa7, 0x34, + 0xed, 0x24, 0x12, 0x16, 0xf5, 0x4a, 0x95, 0xb1, 0xef, 0xe7, 0x49, 0x75, + 0x5b, 0xc4, 0x45, 0x6b, 0xcf, 0x29, 0xff, 0x64, 0x01, 0x3b, 0x15, 0x18, + 0xd3, 0xab, 0xd4, 0xa1, 0x5b, 0xf5, 0x99, 0x36, 0x7c, 0x68, 0x03, 0xae, + 0x3b, 0xc6, 0xe8, 0xf7, 0x4a, 0x88, 0x2e, 0x81, 0x53, 0x75, 0x3d, 0x40, + 0xbe, 0x7b, 0xb2, 0x44, 0xda, 0x4a, 0xe3, 0xc6, 0xfc, 0x6f, 0xe9, 0x6e, + 0xbe, 0x4c, 0xfa, 0x9d, 0x36, 0x71, 0x91, 0xa4, 0x2a, 0x4b, 0x64, 0x7b, + 0x15, 0xf8, 0x2a, 0xde, 0x1d, 0xa7, 0x5e, 0x83, 0x78, 0xc2, 0xcc, 0x7d, + 0xd1, 0x00, 0x2c, 0xad, 0x78, 0x42, 0x01, 0xb7, 0x0a, 0xc7, 0x8f, 0x90, + 0xb4, 0x92, 0x1e, 0x4c, 0xcb, 0xc4, 0xb0, 0x7b, 0x6d, 0xea, 0x1a, 0xba, + 0xe6, 0x14, 0x0b, 0x0c, 0x5e, 0x3c, 0x18, 0x02, 0x81, 0xb9, 0x53, 0xe5, + 0x40, 0x3e, 0x3e, 0x4c, 0xab, 0x2e, 0x95, 0xdb, 0x6c, 0xe3, 0x96, 0xa0, + 0x7a, 0xaa, 0xaa, 0xc6, 0x2b, 0xbb, 0x44, 0x4b, 0xbf, 0xb3, 0xde, 0xa8, + 0x2a, 0x28, 0x78, 0xd3, 0x02, 0x08, 0xfe, 0xb8, 0x6b, 0x9b, 0xb9, 0x2c, + 0x81, 0x38, 0xf5, 0x4a, 0xdd, 0xab, 0x87, 0x88, 0x09, 0xa4, 0x79, 0x4f, + 0x34, 0x82, 0x8b, 0x29, 0x08, 0xe4, 0x94, 0xc4, 0xb6, 0xd2, 0x14, 0x2a, + 0x2e, 0x02, 0x81, 0x8c, 0x49, 0xec, 0x8c, 0x8d, 0xe8, 0x12, 0x94, 0x1e, + 0x18, 0xf5, 0xf2, 0xae, 0x36, 0xaa, 0xfa, 0xb9, 0x3e, 0xfd, 0xb7, 0x93, + 0x66, 0xb8, 0x53, 0x3b, 0x88, 0x16, 0x28, 0x90, 0xd6, 0xd6, 0xf1, 0x8f, + 0xf3, 0x11, 0x3e, 0xcd, 0xb8, 0xfb, 0x34, 0x0b, 0x16, 0x5c, 0xc0, 0xff, + 0xf1, 0xe4, 0xbf, 0xf3, 0xbf, 0xe7, 0x0b, 0x3f, 0x8f, 0x26, 0x80, 0x95, + 0x81, 0x6d, 0x75, 0xd2, 0x33, 0xe3, 0x27, 0x39, 0x7f, 0xc1, 0x7c, 0x26, + 0xcb, 0x7e, 0x8b, 0x66, 0xec, 0x3b, 0x8f, 0x03, 0x61, 0xc0, 0x56, 0xa8, + 0xbe, 0x63, 0x81, 0xf9, 0x17, 0x1a, 0xa8, 0x25, 0xc7, 0x5c, 0xee, 0x97, + 0xbb, 0x18, 0xcd, 0xdb, 0xac, 0xbf, 0x64, 0x03, 0xf7, 0x38, 0xfa, 0x9b, + 0x48, 0x00, 0xea, 0xf5, 0xb6, 0x52, 0x0e, 0xde, 0xe8, 0x27, 0x7d, 0xf6, + 0x5f, 0xff, 0x85, 0xf9, 0x0b, 0x2d, 0x9e, 0x3e, 0xa2, 0x46, 0x4d, 0x1f, + 0xd1, 0xe5, 0x7a, 0x71, 0x81, 0xc7, 0x18, 0x6b, 0xad, 0xc0, 0x7c, 0xfd, + 0x2e, 0xd2, 0xf0, 0x2b, 0x4e, 0x4a, 0x46, 0xdd, 0x61, 0xaf, 0xdc, 0x66, + 0x88, 0x57, 0x33, 0x94, 0xab, 0xdd, 0xbe, 0xe8, 0x11, 0xcc, 0xfb, 0x17, + 0x8b, 0xdc, 0xdb, 0x7e, 0x8b, 0x67, 0x1e, 0x55, 0xcf, 0xb5, 0xe7, 0xff, + 0xc3, 0xe1, 0xac, 0xae, 0x70, 0x1f, 0xe1, 0xf9, 0x9f, 0x38, 0x9c, 0x75, + 0x86, 0xcd, 0xf9, 0x0b, 0xe6, 0xf3, 0xcc, 0xb8, 0x8a, 0x17, 0x74, 0x1f, + 0x6f, 0x83, 0xe8, 0x8e, 0x14, 0x29, 0x52, 0xa4, 0x48, 0x91, 0x22, 0x45, + 0x8a, 0x14, 0x29, 0x52, 0xa4, 0x48, 0x91, 0x22, 0x45, 0x8a, 0x14, 0x29, + 0x52, 0xa4, 0x48, 0x91, 0x22, 0x45, 0x8a, 0x14, 0x29, 0x52, 0xa4, 0x48, + 0xb3, 0x57, 0x04, 0xd5, 0x8a, 0x14, 0x29, 0x52, 0xa4, 0x48, 0x91, 0x7e, + 0x09, 0x54, 0x9a, 0x6c, 0x9d, 0x9c, 0x6e, 0x26, 0xe7, 0x76, 0x02, 0x76, + 0x95, 0x27, 0x5b, 0x81, 0x0b, 0x55, 0x0d, 0xd9, 0x4a, 0x76, 0x27, 0x29, + 0x4f, 0x96, 0x59, 0xf1, 0xdb, 0x2b, 0x42, 0x60, 0x2d, 0x21, 0x04, 0x76, + 0xc6, 0xa6, 0x70, 0xbc, 0x10, 0x02, 0x6a, 0x19, 0xe8, 0x94, 0xac, 0x49, + 0xd2, 0xa9, 0x74, 0x4b, 0xbe, 0xed, 0x24, 0x1b, 0x3e, 0x35, 0x6a, 0x3a, + 0x60, 0x58, 0xa7, 0xe3, 0xea, 0xe4, 0x37, 0x5d, 0xfa, 0xe6, 0x73, 0xd2, + 0x29, 0xbc, 0xd9, 0x9d, 0x4c, 0x24, 0x29, 0xd3, 0x19, 0x50, 0x31, 0xd3, + 0xb9, 0x0e, 0x4a, 0xcd, 0xd7, 0x0c, 0x1b, 0xd0, 0x87, 0xf2, 0x0a, 0x9c, + 0x13, 0x63, 0xec, 0xdb, 0x9c, 0xa6, 0x9d, 0xb9, 0xa9, 0xe8, 0xb1, 0xd4, + 0xe4, 0x4c, 0x57, 0x22, 0x73, 0x01, 0x98, 0x96, 0xad, 0x61, 0x58, 0x65, + 0x17, 0x6a, 0x66, 0x36, 0xb8, 0xa5, 0xd7, 0x53, 0xc6, 0x9f, 0x30, 0xdf, + 0x13, 0x80, 0x5b, 0xe5, 0x2c, 0x18, 0x97, 0x6a, 0x05, 0x64, 0x47, 0x4f, + 0x42, 0x37, 0x16, 0x43, 0x52, 0x02, 0x49, 0x88, 0x99, 0x3c, 0x7d, 0x98, + 0x55, 0xbc, 0x26, 0x95, 0xf5, 0x50, 0xa0, 0x85, 0x19, 0x5f, 0x60, 0x51, + 0x1f, 0x77, 0xe1, 0x9d, 0x29, 0x05, 0xa3, 0xaa, 0x49, 0xe2, 0xf3, 0x04, + 0x75, 0x20, 0x5e, 0x91, 0xa8, 0x04, 0x40, 0x8f, 0x20, 0x5e, 0x93, 0xca, + 0x7f, 0x16, 0xe9, 0x01, 0x68, 0x4a, 0x4f, 0x4d, 0xc2, 0x64, 0x20, 0x1c, + 0xa8, 0x17, 0x5c, 0x35, 0x31, 0x7f, 0x85, 0x50, 0x70, 0x30, 0xd7, 0xf5, + 0x92, 0xa8, 0x4b, 0xaa, 0x77, 0xcc, 0x79, 0x38, 0xee, 0x42, 0xda, 0x52, + 0x86, 0x1f, 0x0b, 0x2d, 0x2f, 0x4f, 0x56, 0xa8, 0x73, 0xa2, 0xce, 0xe9, + 0xec, 0xc0, 0x5a, 0x3e, 0x4c, 0xcb, 0x57, 0x4a, 0xaf, 0x90, 0xeb, 0x19, + 0x4d, 0x68, 0xa0, 0x56, 0x50, 0x22, 0x91, 0x9c, 0x16, 0xac, 0xa5, 0xf2, + 0x4e, 0x75, 0x04, 0x6c, 0x75, 0x82, 0x62, 0x59, 0x09, 0x7b, 0xda, 0x38, + 0x9d, 0xd2, 0xcc, 0x04, 0xd8, 0x02, 0x1f, 0x74, 0x57, 0x75, 0xab, 0xa4, + 0x52, 0xca, 0x40, 0xb5, 0x5e, 0xeb, 0x0c, 0xc8, 0xb2, 0x12, 0x36, 0x72, + 0x96, 0x46, 0x6d, 0xa7, 0x5b, 0x97, 0x60, 0x3d, 0x42, 0x00, 0x26, 0x21, + 0x5a, 0xa6, 0x17, 0xbb, 0xb5, 0x32, 0x56, 0xa2, 0xd9, 0xa0, 0x56, 0x29, + 0x04, 0xea, 0x4a, 0xb5, 0x8f, 0x63, 0xe4, 0x4c, 0x3a, 0x38, 0x45, 0x07, + 0x3b, 0xd3, 0xd9, 0x50, 0xce, 0x80, 0xb5, 0x46, 0x1e, 0x1c, 0xc3, 0xd6, + 0xcf, 0xc9, 0xd5, 0x1f, 0x5a, 0x4d, 0x61, 0xc2, 0x61, 0xe8, 0xc1, 0x21, + 0x00, 0xd6, 0xaf, 0x5d, 0xd3, 0xb6, 0x1e, 0xe6, 0x9c, 0x6e, 0xff, 0xfc, + 0x76, 0xcf, 0x7f, 0xd3, 0xa7, 0x36, 0x79, 0xe1, 0x6b, 0xae, 0x5a, 0x83, + 0xdd, 0x63, 0xb3, 0xeb, 0xbe, 0x3d, 0xc4, 0x41, 0x4f, 0xc8, 0xf6, 0xe1, + 0x52, 0xd5, 0x00, 0x40, 0xb1, 0x5c, 0x2e, 0xb3, 0xfa, 0x43, 0xab, 0x03, + 0x50, 0xc5, 0xf0, 0x39, 0x29, 0x14, 0x0a, 0xe4, 0xbf, 0x3f, 0x46, 0xee, + 0xa2, 0x1c, 0x85, 0x85, 0x36, 0x85, 0x42, 0x9e, 0xc2, 0xc2, 0xf0, 0x71, + 0xd9, 0xf3, 0xfd, 0xfd, 0x81, 0xe5, 0x0a, 0xfa, 0xb1, 0xf3, 0x8e, 0xf6, + 0x70, 0x17, 0x91, 0x50, 0x46, 0x3d, 0xa7, 0x03, 0xae, 0x0a, 0xaa, 0x39, + 0x5d, 0x10, 0x42, 0xe0, 0x01, 0x11, 0x9b, 0x80, 0x5a, 0x5e, 0x78, 0x10, + 0x94, 0xd6, 0xa1, 0xfc, 0x10, 0xb0, 0x6b, 0x06, 0x78, 0x1a, 0x28, 0xdb, + 0xb2, 0x8d, 0x1a, 0xce, 0x64, 0xa6, 0x82, 0x3f, 0x83, 0x9a, 0xaf, 0xdd, + 0x1b, 0x88, 0x63, 0xd4, 0xdb, 0x61, 0xab, 0xe0, 0x55, 0xcd, 0x79, 0x4f, + 0x78, 0x10, 0xaa, 0xde, 0xc0, 0xbe, 0xf1, 0x1b, 0x1a, 0x1a, 0x62, 0x4e, + 0x80, 0x86, 0xf5, 0x6a, 0x61, 0x5a, 0x2f, 0xbf, 0x0c, 0xb7, 0xdf, 0x0e, + 0x4f, 0xdf, 0xd0, 0x7a, 0x8c, 0x3e, 0xf4, 0xea, 0x40, 0x08, 0x59, 0x15, + 0x84, 0x82, 0xf5, 0x7a, 0x98, 0xb0, 0x60, 0x7d, 0xa7, 0x3f, 0x26, 0x93, + 0xc7, 0x44, 0xd3, 0xbe, 0x01, 0x77, 0x19, 0xb5, 0x3b, 0x97, 0x13, 0x2d, + 0xff, 0xb7, 0x96, 0x11, 0x74, 0xc3, 0x84, 0x07, 0xd4, 0x32, 0x61, 0xc1, + 0xb4, 0x8b, 0x99, 0x9d, 0xde, 0x37, 0x02, 0xdf, 0x58, 0x01, 0x1c, 0x79, + 0x2a, 0xe4, 0xf7, 0xb3, 0x92, 0x9d, 0xb0, 0xb0, 0x2c, 0x1f, 0xa6, 0xb5, + 0xba, 0x37, 0xc5, 0xbe, 0x89, 0x32, 0xab, 0x7b, 0x53, 0xe4, 0x27, 0x5d, + 0x72, 0x3d, 0x16, 0x76, 0x4d, 0x41, 0xb6, 0x7e, 0x91, 0xe5, 0x3f, 0xbf, + 0x7d, 0xe3, 0x88, 0xb4, 0x9d, 0xa6, 0x7a, 0x4a, 0x86, 0xde, 0x91, 0xb2, + 0x01, 0xe9, 0xf9, 0x69, 0xea, 0xd5, 0xaa, 0x07, 0x98, 0xf5, 0x52, 0x6a, + 0x60, 0x8f, 0xcb, 0x2b, 0x37, 0x54, 0x3f, 0x6d, 0x69, 0x90, 0xd6, 0xad, + 0x81, 0x67, 0x4b, 0x8b, 0x49, 0x7a, 0x63, 0x00, 0x21, 0xbe, 0xc4, 0xf0, + 0xc3, 0xe7, 0x50, 0x6a, 0x6a, 0x36, 0x0f, 0x3f, 0xac, 0xb6, 0xd6, 0x87, + 0x24, 0xae, 0x3e, 0x92, 0xd4, 0xc5, 0xeb, 0x29, 0xb3, 0x0d, 0x80, 0xf2, + 0xc3, 0xbb, 0xe0, 0xe3, 0x65, 0xb8, 0x23, 0x05, 0x8b, 0xcb, 0x58, 0x96, + 0x8d, 0x4b, 0x9b, 0xf7, 0xed, 0xf5, 0xcc, 0x0e, 0x98, 0xd5, 0x29, 0x9e, + 0x06, 0x69, 0x7d, 0x49, 0xf8, 0x86, 0x53, 0xd7, 0xc9, 0xa6, 0xb6, 0x8f, + 0x10, 0xb0, 0x38, 0x0b, 0x0f, 0x0c, 0x29, 0x58, 0xd8, 0x1f, 0x6d, 0xe8, + 0x58, 0x8c, 0x01, 0x6a, 0x59, 0x17, 0x5d, 0xc1, 0xfa, 0x6b, 0x36, 0xb0, + 0x7d, 0xc3, 0xf4, 0xc0, 0xa8, 0xd7, 0x4b, 0x3b, 0x1f, 0x1e, 0xea, 0x18, + 0xb6, 0xfd, 0xf0, 0x1e, 0xe5, 0x68, 0x5a, 0xfc, 0x7d, 0xf4, 0xbe, 0x6d, + 0x1d, 0xd3, 0xec, 0xd9, 0x7b, 0x0f, 0x00, 0xc3, 0xdf, 0x1b, 0x53, 0xc0, + 0xc9, 0xee, 0x2c, 0x6e, 0xd1, 0x81, 0x44, 0x18, 0x98, 0x13, 0x04, 0x69, + 0x05, 0x25, 0x12, 0x76, 0x28, 0xbe, 0x89, 0x0b, 0x0a, 0x9a, 0x75, 0xf5, + 0xff, 0x79, 0x35, 0x5f, 0xff, 0x60, 0x86, 0xe4, 0xaa, 0x34, 0xd5, 0xfd, + 0x25, 0x92, 0xab, 0xd4, 0x0f, 0xe6, 0x3d, 0x7f, 0x30, 0xc6, 0x2d, 0x7f, + 0x71, 0x8b, 0x57, 0x46, 0x4b, 0x7f, 0xa2, 0x4c, 0x28, 0x4f, 0x4f, 0x93, + 0xea, 0xf8, 0xe5, 0x64, 0xc0, 0x2f, 0xb5, 0x02, 0xa7, 0xe8, 0x70, 0xd3, + 0x7f, 0xbf, 0xa9, 0x63, 0x59, 0x5f, 0xfe, 0xdb, 0x2f, 0x7b, 0xe9, 0x83, + 0x57, 0x6e, 0xf3, 0x3f, 0x7f, 0x09, 0xb9, 0x77, 0x27, 0xe2, 0xaa, 0x0d, + 0x0c, 0xe8, 0xbc, 0x71, 0x03, 0x06, 0x49, 0x2e, 0xd8, 0xdf, 0x5a, 0xcd, + 0x9d, 0x7b, 0xf3, 0x5c, 0x7b, 0x55, 0x4e, 0xa5, 0x9d, 0x0c, 0x5f, 0x83, + 0xec, 0xce, 0xa7, 0xb8, 0xff, 0x36, 0xb8, 0xe2, 0x06, 0x54, 0x78, 0x53, + 0xfa, 0xcd, 0x9f, 0xba, 0x95, 0xc2, 0x5d, 0xdb, 0xc9, 0x5e, 0xb3, 0x09, + 0xcb, 0x1d, 0xf3, 0xf2, 0x78, 0xa5, 0x4f, 0xb8, 0xa0, 0xb1, 0xb4, 0xec, + 0xe0, 0xff, 0x4a, 0xd5, 0x75, 0xea, 0x54, 0x47, 0xa8, 0xdf, 0x6b, 0xf5, + 0x44, 0x7e, 0x13, 0x90, 0x4a, 0xc4, 0x39, 0xf7, 0x2d, 0x16, 0x6f, 0xb6, + 0x14, 0x6c, 0xe6, 0x05, 0x77, 0x8a, 0x1f, 0x3d, 0xe7, 0xf2, 0x13, 0xdd, + 0xf6, 0x7e, 0x2d, 0x8e, 0xa5, 0x9d, 0x5e, 0xeb, 0x63, 0x09, 0x6a, 0xba, + 0xeb, 0x32, 0x93, 0x36, 0xec, 0xfc, 0x18, 0xa0, 0x0c, 0x9b, 0xb7, 0xb9, + 0x25, 0x36, 0x7f, 0x6a, 0x90, 0xe1, 0xbd, 0x16, 0xeb, 0xd7, 0xda, 0x94, + 0x80, 0x9b, 0x1c, 0xf5, 0x0e, 0xf8, 0xb2, 0x6d, 0xb3, 0xf1, 0xc3, 0x77, + 0xb2, 0xe5, 0x2b, 0xd7, 0x92, 0x01, 0xca, 0x01, 0xe3, 0xe4, 0xb4, 0xee, + 0x0b, 0x3a, 0x52, 0x7a, 0x46, 0xf6, 0x25, 0xa0, 0x54, 0x73, 0x7d, 0xea, + 0x35, 0x90, 0xd5, 0x61, 0x8e, 0x86, 0xee, 0x06, 0xc1, 0x5a, 0x75, 0xc2, + 0x60, 0xad, 0xe0, 0x9b, 0x67, 0xf8, 0x10, 0xac, 0xbf, 0xc4, 0xdf, 0x37, + 0x61, 0xb6, 0xbe, 0x77, 0x4b, 0x42, 0x60, 0x03, 0xc3, 0x23, 0xb0, 0x7e, + 0x85, 0x0a, 0x37, 0xee, 0x60, 0xfc, 0xe1, 0x11, 0x05, 0xc6, 0x32, 0x5b, + 0x9a, 0xe2, 0x99, 0xb8, 0xc1, 0x78, 0xa0, 0xdc, 0x4e, 0x11, 0x46, 0xef, + 0xdb, 0x09, 0x80, 0x6c, 0x24, 0x41, 0xbf, 0x4b, 0xeb, 0xb5, 0x2a, 0x05, + 0xa7, 0x4c, 0x52, 0x03, 0xa1, 0xd5, 0x38, 0x84, 0xf2, 0x6f, 0x96, 0xdb, + 0x00, 0x1a, 0x71, 0x72, 0x0b, 0x52, 0x14, 0x4f, 0xba, 0x88, 0x98, 0x85, + 0x95, 0xe9, 0xc7, 0x2d, 0x2a, 0x83, 0xf6, 0x64, 0xb7, 0x02, 0x03, 0x4b, + 0x29, 0xa8, 0xea, 0x8b, 0xe7, 0xba, 0x0a, 0xf0, 0x3b, 0x5a, 0x94, 0x64, + 0x33, 0x16, 0xf1, 0x86, 0x3a, 0xa7, 0xd5, 0x04, 0x48, 0xd9, 0x8f, 0x3c, + 0x75, 0x0c, 0xd1, 0x05, 0x72, 0xfa, 0xee, 0x2f, 0x30, 0x7b, 0x20, 0xea, + 0x6c, 0xf4, 0x5a, 0xe6, 0xf5, 0x5f, 0x4d, 0x4f, 0xe2, 0x83, 0xb5, 0x9e, + 0x79, 0x3d, 0x0b, 0xd2, 0xb7, 0xde, 0xc2, 0x45, 0x5d, 0x1c, 0x3f, 0x36, + 0xc5, 0x16, 0xe0, 0xe2, 0x45, 0x5d, 0xd8, 0x06, 0x74, 0xf5, 0xe7, 0xea, + 0x3d, 0x35, 0x0c, 0x3c, 0x3b, 0x05, 0x13, 0xef, 0xee, 0xa2, 0xf7, 0x7d, + 0x53, 0xf0, 0x3f, 0x76, 0xb2, 0xe7, 0x51, 0xd5, 0x57, 0x5e, 0xf3, 0xae, + 0xed, 0xc8, 0xa9, 0x10, 0x15, 0xa1, 0xa3, 0x8e, 0x8d, 0xbb, 0x2c, 0x79, + 0xb1, 0xcc, 0xc2, 0x45, 0x5d, 0x70, 0x6c, 0x8a, 0x73, 0x1f, 0x99, 0x1e, + 0x60, 0xf7, 0x8d, 0x8a, 0xc3, 0xdd, 0xef, 0x86, 0xe3, 0xc7, 0x3c, 0x86, + 0x51, 0x48, 0xdf, 0x3a, 0x46, 0x0b, 0x6c, 0x6b, 0xe5, 0xa6, 0xdd, 0x1c, + 0x3c, 0x78, 0x90, 0xdd, 0x07, 0x77, 0x43, 0xb1, 0xa8, 0x7d, 0x33, 0x00, + 0xdc, 0xfc, 0x91, 0x2e, 0x58, 0x35, 0x05, 0x37, 0xc3, 0xf2, 0x4d, 0xbb, + 0x29, 0x66, 0x8a, 0x1c, 0xbf, 0xff, 0x66, 0x8e, 0x1f, 0xd3, 0xc7, 0x7b, + 0x6c, 0xca, 0x3b, 0x17, 0x0b, 0xdf, 0xdd, 0xc5, 0xcb, 0xc7, 0xe0, 0xe8, + 0x99, 0x81, 0xcc, 0x75, 0xbd, 0x01, 0xee, 0x9d, 0x82, 0x8f, 0x76, 0xa1, + 0x21, 0x59, 0xa0, 0x08, 0x57, 0xaa, 0x1c, 0xd6, 0x99, 0x7d, 0x14, 0x14, + 0x2b, 0xb8, 0x6f, 0xfc, 0x76, 0xd3, 0xc6, 0xdf, 0x38, 0x74, 0x3e, 0xcd, + 0x61, 0xeb, 0x32, 0xbe, 0x5f, 0xd1, 0xc4, 0xcb, 0x30, 0xd3, 0x27, 0xe8, + 0xec, 0xaa, 0xaf, 0xc2, 0xc8, 0x7b, 0xa6, 0x8d, 0xf3, 0x4a, 0x94, 0xfc, + 0xd0, 0x6b, 0x93, 0xef, 0x90, 0x06, 0x5e, 0x6d, 0xfa, 0x33, 0xf5, 0x4b, + 0xd8, 0x76, 0x43, 0x81, 0xaf, 0xfe, 0xe5, 0x63, 0xe4, 0x51, 0x50, 0xad, + 0x4d, 0xdf, 0xca, 0xce, 0x1a, 0xac, 0x05, 0x90, 0xcb, 0xa6, 0xd8, 0x76, + 0xf7, 0x98, 0x02, 0xd4, 0xd6, 0x24, 0xf9, 0xef, 0x3b, 0x6c, 0x5e, 0xdb, + 0x47, 0xbe, 0x50, 0xf6, 0xca, 0x3a, 0x1d, 0x05, 0x81, 0x5a, 0x46, 0xd7, + 0x26, 0x6c, 0xb8, 0x08, 0x92, 0x7f, 0x02, 0x3b, 0x3f, 0xec, 0xe7, 0x99, + 0x3b, 0x04, 0xf9, 0x07, 0x74, 0x7b, 0x7e, 0xb9, 0xba, 0xc1, 0xfa, 0x2e, + 0x0b, 0x83, 0x4f, 0x8f, 0x1c, 0xad, 0x72, 0x84, 0xeb, 0xc8, 0x3f, 0xa1, + 0xee, 0x99, 0xfc, 0x71, 0xc9, 0x9a, 0x2b, 0x2d, 0xf6, 0x3c, 0xfc, 0x7a, + 0x40, 0x9b, 0xf5, 0x3b, 0xb0, 0x5c, 0x20, 0x9d, 0xca, 0x52, 0xaf, 0x40, + 0xbc, 0xdb, 0xa2, 0x54, 0x2e, 0x78, 0x10, 0x2d, 0x23, 0x57, 0x0e, 0xe9, + 0x6d, 0x38, 0x87, 0x6a, 0xc5, 0x1f, 0x57, 0xb4, 0x62, 0x69, 0xdc, 0x86, + 0xbf, 0xef, 0xd6, 0xf6, 0x61, 0x59, 0x33, 0x81, 0x59, 0xd3, 0x54, 0xcb, + 0x7e, 0x1a, 0x49, 0x1a, 0x4b, 0xd8, 0x14, 0xdd, 0x01, 0xfc, 0xe7, 0x46, + 0x6b, 0xab, 0xca, 0x12, 0x6a, 0x2c, 0xc9, 0x12, 0x0a, 0xd2, 0x2e, 0x62, + 0x02, 0x57, 0xc7, 0xb7, 0x84, 0x80, 0x86, 0x9f, 0xa6, 0x5c, 0x19, 0x26, + 0xd5, 0x3d, 0x80, 0x5b, 0x9b, 0xfd, 0xef, 0xe4, 0xa7, 0xa3, 0xc0, 0xc9, + 0x9c, 0x01, 0xa6, 0xd3, 0x12, 0x7f, 0x06, 0xf5, 0xbe, 0x7f, 0xba, 0xd0, + 0x03, 0xb0, 0xa3, 0x7d, 0x48, 0x06, 0xff, 0x69, 0xb5, 0x51, 0xc7, 0xcd, + 0x00, 0x5f, 0xd5, 0xee, 0x83, 0x40, 0x86, 0x03, 0xac, 0x5b, 0xa7, 0xe2, + 0x5f, 0xbc, 0x5b, 0x6d, 0x27, 0x00, 0x96, 0x4f, 0xc0, 0x44, 0x6f, 0x0b, + 0xc4, 0xeb, 0xf5, 0xd4, 0x01, 0x0c, 0xea, 0x6b, 0x66, 0x50, 0xd7, 0x0e, + 0x60, 0x65, 0x6f, 0x2f, 0xbd, 0x2b, 0x57, 0x72, 0xe0, 0x93, 0x3b, 0x98, + 0x3c, 0xf8, 0x7a, 0xd7, 0x2e, 0xac, 0xd9, 0xd4, 0xf1, 0x35, 0xd7, 0x2c, + 0xc6, 0x58, 0x7f, 0xd6, 0x6a, 0xf7, 0xab, 0xf6, 0xfc, 0x02, 0xdf, 0xe6, + 0xd4, 0x3e, 0x81, 0x57, 0x5a, 0xf0, 0xf9, 0xe0, 0xf7, 0x64, 0xa4, 0x01, + 0x2e, 0xc5, 0xf0, 0xef, 0xab, 0x98, 0x0c, 0x74, 0x27, 0x24, 0xae, 0xeb, + 0x62, 0x59, 0x36, 0x50, 0x45, 0x4a, 0xe9, 0xf5, 0xe5, 0x5b, 0xbf, 0x11, + 0xbe, 0xf6, 0xbd, 0xae, 0x4e, 0x79, 0x4a, 0x29, 0x67, 0x9c, 0x31, 0x96, + 0x41, 0x52, 0xd4, 0xa0, 0x2a, 0x80, 0x7a, 0xcd, 0x25, 0x6e, 0xbe, 0x5d, + 0x6a, 0xd8, 0x53, 0xbd, 0x06, 0x71, 0x09, 0xf5, 0x98, 0x44, 0x36, 0xc2, + 0xb0, 0x27, 0x1b, 0x70, 0x68, 0x6d, 0x93, 0xa9, 0x73, 0x23, 0x71, 0x25, + 0x08, 0x9d, 0xce, 0x0a, 0x9c, 0x6b, 0x01, 0xc8, 0x1a, 0xd8, 0x96, 0x82, + 0x51, 0xf5, 0x37, 0x60, 0x8f, 0x86, 0xe7, 0x24, 0x63, 0x82, 0x7c, 0x45, + 0x62, 0xc7, 0xa0, 0x24, 0xc1, 0x4a, 0xa8, 0xbc, 0xcc, 0x75, 0x48, 0x36, + 0x50, 0xdf, 0x30, 0x03, 0x0b, 0x21, 0x65, 0x63, 0x82, 0x72, 0x4d, 0x2a, + 0x7f, 0x5d, 0x9b, 0xb8, 0x54, 0xe3, 0x87, 0x42, 0xba, 0x0a, 0xf4, 0xa5, + 0x3f, 0x81, 0x3a, 0x3a, 0x46, 0x36, 0x01, 0x79, 0x0f, 0xa8, 0xa5, 0xfb, + 0xdc, 0x31, 0x7d, 0x26, 0x1a, 0x75, 0x0f, 0x8c, 0xe3, 0x00, 0xa2, 0x51, + 0xf7, 0xeb, 0x1e, 0x53, 0x7e, 0xab, 0xaf, 0x52, 0xdf, 0x7b, 0xb2, 0xd9, + 0x2c, 0xd9, 0x6c, 0x96, 0xe1, 0x11, 0x7f, 0x31, 0xaa, 0xc2, 0x93, 0x05, + 0xc8, 0x66, 0x21, 0x3f, 0xea, 0x1d, 0xb0, 0x8c, 0xa9, 0xbe, 0x2d, 0xf8, + 0xe7, 0x41, 0x36, 0x20, 0xd7, 0x0d, 0x4e, 0x59, 0x71, 0xfa, 0x25, 0xaa, + 0xdf, 0x69, 0xda, 0xaa, 0x8e, 0x06, 0x6d, 0x59, 0x0d, 0x89, 0xab, 0xcb, + 0x15, 0x40, 0x3a, 0x56, 0xc5, 0x21, 0xe9, 0x2d, 0xe2, 0x32, 0x1b, 0x2d, + 0x3e, 0x77, 0x05, 0x3f, 0xe2, 0x47, 0xfc, 0x98, 0xa7, 0x99, 0x97, 0x6e, + 0x05, 0x49, 0x9d, 0xcd, 0x05, 0xfc, 0x98, 0xa7, 0x39, 0x23, 0x36, 0x87, + 0x33, 0x7e, 0x0a, 0x33, 0x0d, 0x7f, 0x63, 0xc1, 0x7c, 0x0e, 0xe7, 0x4f, + 0x7a, 0xee, 0x1f, 0x8c, 0x9f, 0xe4, 0x70, 0xfe, 0x24, 0x57, 0x5e, 0xde, + 0x0d, 0xe0, 0xd5, 0xe3, 0x27, 0x8d, 0x97, 0x39, 0x23, 0x36, 0x87, 0x78, + 0xcc, 0xdf, 0x82, 0x02, 0x65, 0xfd, 0xa4, 0xf1, 0x72, 0xc7, 0xfc, 0xcf, + 0x12, 0x73, 0x38, 0x2b, 0x70, 0xab, 0xbf, 0xeb, 0xad, 0x73, 0xd8, 0xc8, + 0xe3, 0xec, 0xf8, 0x4f, 0x05, 0xfc, 0x79, 0x74, 0xc1, 0x12, 0x36, 0xbe, + 0xe1, 0x71, 0x1e, 0x3d, 0xf1, 0xf2, 0xeb, 0x0a, 0xd6, 0xda, 0xf6, 0xb7, + 0x9f, 0x04, 0x60, 0xdd, 0xa5, 0xbf, 0xc3, 0xb9, 0xab, 0x56, 0xf1, 0xa3, + 0xfd, 0xfb, 0x59, 0x14, 0x08, 0x3f, 0xf6, 0xd0, 0x43, 0x3c, 0xf0, 0xd2, + 0x4b, 0x7c, 0x60, 0xae, 0x8f, 0x72, 0x5f, 0x74, 0xe9, 0xa5, 0x9c, 0xbb, + 0x6a, 0x15, 0x80, 0x97, 0xe6, 0x81, 0x03, 0xea, 0x1b, 0xcb, 0xb3, 0x2f, + 0x4c, 0xc1, 0x59, 0x41, 0x14, 0x7c, 0x7b, 0xc5, 0x85, 0xf0, 0xc6, 0x2e, + 0xeb, 0x52, 0x92, 0xee, 0xb6, 0xc8, 0x3f, 0x59, 0x20, 0x77, 0xa1, 0xfa, + 0x66, 0x9d, 0xee, 0xd6, 0x0b, 0xee, 0x34, 0x2d, 0xd0, 0x13, 0xef, 0x8e, + 0x73, 0xcf, 0x3f, 0x0c, 0x31, 0xb0, 0x40, 0x8f, 0x91, 0x54, 0xc3, 0x63, + 0xc6, 0x6e, 0xcc, 0xa5, 0x5e, 0xa9, 0x7b, 0x0b, 0x17, 0xe4, 0xc7, 0x0b, + 0xd4, 0x05, 0x5c, 0x81, 0x4d, 0xb5, 0xa1, 0x81, 0x5a, 0x1a, 0xc0, 0x25, + 0xba, 0x04, 0x75, 0xfd, 0x5d, 0x4f, 0xc1, 0xb1, 0xa4, 0x07, 0xd2, 0x32, + 0x7e, 0xf1, 0x04, 0x64, 0x17, 0x2e, 0x25, 0x99, 0x56, 0xd0, 0xa9, 0x6a, + 0xb9, 0xda, 0xb2, 0x88, 0x5a, 0x5c, 0x08, 0xb2, 0xb9, 0x2c, 0xc3, 0x0f, + 0x0c, 0x93, 0xb6, 0x54, 0x7d, 0xdd, 0x53, 0xae, 0x02, 0x64, 0x05, 0x54, + 0x6f, 0x7a, 0x16, 0xc6, 0x85, 0xf0, 0x40, 0x90, 0xe5, 0x5a, 0x59, 0x7d, + 0xcf, 0x9c, 0x92, 0xd3, 0x2e, 0x20, 0x14, 0x5c, 0xec, 0x47, 0x4a, 0xb5, + 0x2f, 0xba, 0x54, 0x3a, 0x0f, 0x90, 0x65, 0x9e, 0x91, 0x89, 0x0e, 0xef, + 0xc3, 0xc0, 0x62, 0x4e, 0xa2, 0x4b, 0xa5, 0x91, 0x12, 0xb2, 0x76, 0x96, + 0x6a, 0xad, 0x4a, 0x3a, 0x91, 0xa6, 0xea, 0x56, 0xfd, 0x85, 0x11, 0xa6, + 0x24, 0x42, 0x3f, 0xbb, 0xbc, 0x85, 0xe0, 0x66, 0x79, 0x0f, 0xca, 0x31, + 0x17, 0xd1, 0xa7, 0x11, 0xb0, 0xf3, 0x85, 0x07, 0xc3, 0x32, 0xc0, 0xa7, + 0xfa, 0x8b, 0xbb, 0x01, 0xd8, 0xb2, 0xe0, 0x0e, 0xc6, 0xc7, 0x9f, 0xf6, + 0xd2, 0x5d, 0x88, 0xc5, 0xbd, 0x13, 0x5f, 0xe4, 0xba, 0x4b, 0x0e, 0x91, + 0x5b, 0x98, 0x65, 0xe3, 0xd8, 0x46, 0x05, 0x8d, 0x0a, 0x80, 0xa3, 0x44, + 0x8f, 0x08, 0x81, 0xa4, 0x0c, 0xc0, 0x8b, 0x92, 0x02, 0x42, 0x01, 0xf4, + 0xa4, 0x7a, 0x99, 0x2c, 0x4f, 0x78, 0x40, 0x2d, 0x50, 0x70, 0x2d, 0x03, + 0xdb, 0x32, 0xd0, 0xa8, 0xe6, 0x3a, 0x03, 0x1e, 0xc8, 0x2b, 0xed, 0xda, + 0xf4, 0xe7, 0x06, 0xb8, 0xff, 0xc1, 0x5d, 0x6a, 0xbe, 0x07, 0x78, 0xd0, + 0x2d, 0x4e, 0x4a, 0x9e, 0x4a, 0xe7, 0x79, 0x5b, 0x29, 0x87, 0x33, 0x7e, + 0x12, 0x47, 0xe7, 0xf7, 0x9d, 0x43, 0xd3, 0x7f, 0xc4, 0x33, 0xe0, 0x2c, + 0x39, 0xe6, 0x2a, 0x50, 0x96, 0x06, 0x78, 0x85, 0x8e, 0x03, 0x28, 0x55, + 0x1c, 0x55, 0x6e, 0xa0, 0x9d, 0x29, 0xa7, 0x39, 0x07, 0x9e, 0x4e, 0x86, + 0x01, 0x5c, 0xcf, 0x8c, 0x9f, 0xf4, 0xc0, 0x59, 0xa0, 0x20, 0x5a, 0x41, + 0xbd, 0xf0, 0xe2, 0x8f, 0x74, 0x3c, 0x38, 0x39, 0x75, 0x98, 0x37, 0x9f, + 0x79, 0x2e, 0xf9, 0xa7, 0x1c, 0x3f, 0xec, 0x4c, 0x22, 0x45, 0x8a, 0x14, + 0x29, 0x52, 0xa4, 0x48, 0x91, 0x22, 0x45, 0x8a, 0x14, 0x29, 0x52, 0xa4, + 0x48, 0x91, 0x22, 0x45, 0x8a, 0x14, 0x29, 0x52, 0xa4, 0x48, 0x91, 0x22, + 0x45, 0x8a, 0x14, 0x29, 0xd2, 0xab, 0x50, 0x04, 0xd5, 0x8a, 0x14, 0x29, + 0x52, 0xa4, 0x48, 0x91, 0x7e, 0x86, 0x8a, 0xd3, 0xff, 0xb3, 0x2b, 0x3c, + 0xb8, 0x52, 0x2d, 0x80, 0x94, 0xf4, 0x2f, 0xeb, 0x67, 0xf4, 0x61, 0x35, + 0x81, 0xb7, 0x5a, 0xa9, 0x52, 0xad, 0x54, 0xc9, 0x2e, 0x54, 0x13, 0xf8, + 0xdc, 0x8a, 0x8b, 0x94, 0x12, 0xa7, 0xe8, 0x90, 0xea, 0x69, 0x05, 0xcc, + 0x9c, 0x0e, 0x50, 0xeb, 0x97, 0x5d, 0x6d, 0xaf, 0xeb, 0x17, 0xd4, 0x24, + 0x39, 0x65, 0x54, 0xaf, 0x26, 0x5a, 0x7a, 0x93, 0x32, 0xf5, 0x9c, 0x3a, + 0x11, 0x13, 0xb8, 0x35, 0x17, 0x2b, 0x61, 0xe9, 0x49, 0xfb, 0x12, 0xbd, + 0xe0, 0x33, 0xc2, 0xf2, 0x81, 0x5b, 0xc1, 0xc9, 0xe7, 0xee, 0x62, 0x05, + 0xcd, 0x0a, 0x4d, 0xd7, 0x33, 0x40, 0x2d, 0x29, 0xa1, 0xa4, 0x57, 0x9a, + 0xce, 0x05, 0xa0, 0x59, 0x25, 0x3d, 0xfd, 0x5b, 0xc3, 0xa1, 0xe2, 0x00, + 0x35, 0x1d, 0xe6, 0xea, 0xf4, 0x31, 0x55, 0x3f, 0x61, 0x09, 0x64, 0xd1, + 0x85, 0x5c, 0x1a, 0x1c, 0x35, 0x51, 0x53, 0x9c, 0xaa, 0xab, 0xf2, 0x82, + 0x79, 0x06, 0x27, 0x98, 0x6a, 0xbf, 0x7a, 0x4d, 0x12, 0x37, 0xb6, 0x49, + 0x41, 0x08, 0xd5, 0x29, 0xa9, 0xca, 0xec, 0x4b, 0x85, 0xe3, 0xa2, 0x20, + 0x5a, 0x2d, 0xe9, 0x83, 0xf0, 0x2c, 0x9d, 0x1e, 0xb7, 0x7d, 0x7a, 0xde, + 0x19, 0x4e, 0x4f, 0x4c, 0xf8, 0x13, 0x3c, 0xcd, 0x24, 0xd5, 0x84, 0x50, + 0xf0, 0xac, 0x15, 0x16, 0x18, 0xe8, 0xd6, 0x29, 0x7c, 0xf8, 0x56, 0xc1, + 0x9c, 0x0b, 0xd7, 0x37, 0x00, 0x31, 0x40, 0x2d, 0x5d, 0x8e, 0x37, 0x0d, + 0xfd, 0x0b, 0xad, 0x26, 0x96, 0xd3, 0xdf, 0xd7, 0xca, 0xd0, 0x42, 0x68, + 0x20, 0x5d, 0x2a, 0x31, 0xfb, 0x15, 0xa2, 0xc1, 0x87, 0x69, 0x75, 0x02, + 0x6a, 0x81, 0x0f, 0xc7, 0x32, 0x10, 0x2a, 0xb3, 0x35, 0xee, 0x60, 0x1c, + 0x3f, 0xdf, 0xf6, 0xc0, 0x2a, 0x7b, 0x89, 0x45, 0xe1, 0x78, 0xeb, 0xa4, + 0x5f, 0x67, 0xd2, 0x01, 0x0d, 0x64, 0x28, 0x69, 0x23, 0x36, 0xb3, 0xcd, + 0x3f, 0x99, 0x57, 0x01, 0x93, 0x81, 0xb8, 0xe0, 0x4d, 0xfe, 0x05, 0x3c, + 0xa0, 0xd6, 0xbe, 0x07, 0xf6, 0x85, 0x33, 0x7e, 0x40, 0x6d, 0xb6, 0x7d, + 0x76, 0x5b, 0x28, 0xbc, 0x54, 0x29, 0xa9, 0x55, 0x80, 0x45, 0x6b, 0x5d, + 0xbc, 0xf2, 0x3a, 0xf8, 0xe7, 0x9f, 0xcc, 0xab, 0xdf, 0x73, 0x43, 0x86, + 0xea, 0xe0, 0xd7, 0xc5, 0xa5, 0x70, 0xdc, 0x6d, 0x0b, 0x54, 0x5a, 0xa3, + 0x8d, 0x1e, 0xf6, 0x8c, 0x0c, 0x4f, 0x7b, 0x5f, 0x5b, 0xdd, 0x16, 0xb9, + 0xee, 0x1c, 0x6e, 0x45, 0xff, 0x76, 0x4c, 0x5e, 0x06, 0xb8, 0x87, 0x6f, + 0x86, 0x57, 0x72, 0x4b, 0x78, 0x46, 0x37, 0xdf, 0x83, 0xdc, 0x3b, 0x73, + 0x0c, 0x5e, 0x36, 0x48, 0xda, 0x52, 0x13, 0x78, 0x93, 0xdd, 0xfe, 0x6f, + 0xc2, 0xad, 0x85, 0x27, 0xa3, 0xdb, 0x19, 0xdb, 0x83, 0xc4, 0x04, 0xe5, + 0x9c, 0x54, 0xbf, 0x87, 0xa5, 0x0b, 0xb3, 0xa4, 0xe6, 0xa7, 0xb0, 0x7b, + 0x52, 0xdc, 0x73, 0x9f, 0x7f, 0x6e, 0x93, 0xdd, 0x49, 0xb2, 0x76, 0x96, + 0x3d, 0xf7, 0x29, 0x60, 0xc8, 0xa7, 0x37, 0xb5, 0x20, 0x5e, 0x5a, 0x34, + 0x76, 0x78, 0x8c, 0xb1, 0xc3, 0x63, 0x9e, 0x3b, 0x14, 0x16, 0x58, 0xc1, + 0x77, 0xcf, 0xde, 0x3d, 0xd3, 0xe6, 0x63, 0x0c, 0x76, 0xbc, 0x73, 0xa3, + 0x65, 0xae, 0x65, 0xb1, 0xdc, 0xfe, 0xb7, 0xdc, 0xc9, 0xbf, 0x39, 0xdf, + 0x66, 0x77, 0xbb, 0x78, 0xd3, 0x1a, 0x0d, 0x35, 0x2b, 0x46, 0xdb, 0xfb, + 0x9a, 0x9d, 0x0b, 0x00, 0x35, 0x6f, 0xfa, 0x40, 0x00, 0x1e, 0x35, 0x01, + 0x9c, 0x0f, 0x64, 0xf1, 0x61, 0x4d, 0x9d, 0x6c, 0xf8, 0x56, 0x6a, 0x08, + 0xd5, 0x84, 0xc6, 0x3b, 0x19, 0x10, 0x55, 0x50, 0x07, 0x02, 0xe0, 0xa7, + 0x95, 0x4d, 0xe1, 0x83, 0x83, 0xca, 0xb0, 0xf4, 0xb5, 0x80, 0x69, 0x05, + 0xfd, 0xfe, 0x5a, 0xd7, 0x24, 0x08, 0xc9, 0x52, 0x75, 0x31, 0x75, 0xf0, + 0xff, 0x4c, 0x1d, 0xcd, 0x79, 0x30, 0x32, 0xc7, 0x33, 0x9b, 0x63, 0x32, + 0x6e, 0xf0, 0xcf, 0xd5, 0x4a, 0x0d, 0x2a, 0x33, 0x00, 0xaf, 0xde, 0xc0, + 0x9f, 0x8a, 0xa7, 0xea, 0xb6, 0x92, 0x95, 0x1e, 0xe8, 0x2b, 0x08, 0xd2, + 0x0a, 0x02, 0xc8, 0xc2, 0x80, 0xad, 0xf0, 0xb1, 0x04, 0x8f, 0x07, 0xf0, + 0xae, 0x6b, 0x48, 0x97, 0x84, 0xaf, 0xbf, 0xdc, 0xf4, 0x36, 0xde, 0xb7, + 0xfd, 0x31, 0xe4, 0xa6, 0x77, 0x00, 0xf0, 0xd0, 0x91, 0xa7, 0x90, 0x9b, + 0xde, 0xd6, 0x9a, 0xee, 0xa7, 0x24, 0xa1, 0x47, 0x71, 0x56, 0xf7, 0xaa, + 0xb6, 0x98, 0xeb, 0xc2, 0x40, 0xb7, 0x72, 0xe7, 0x7a, 0xd4, 0xf3, 0xc1, + 0x4e, 0x58, 0x38, 0xf2, 0xf5, 0x30, 0x7c, 0xfe, 0x29, 0xca, 0x6a, 0x7d, + 0x3f, 0x96, 0xaa, 0xda, 0xd0, 0xcf, 0x80, 0xf4, 0x3c, 0x7f, 0x6d, 0x48, + 0x62, 0x85, 0x9f, 0x8f, 0x6e, 0x23, 0x10, 0xeb, 0x92, 0x36, 0xf7, 0xf5, + 0xe2, 0x45, 0xad, 0x7e, 0xaf, 0x56, 0x4d, 0x40, 0xad, 0x16, 0xf5, 0xd8, + 0xe0, 0x2a, 0x83, 0x6a, 0xeb, 0x33, 0x90, 0x03, 0x36, 0x7c, 0xca, 0xaf, + 0xf7, 0x91, 0x11, 0x97, 0x2d, 0xc0, 0x15, 0x47, 0xd5, 0x7e, 0xea, 0xe2, + 0xf5, 0x94, 0x17, 0x6f, 0xf3, 0xdd, 0x0f, 0x6b, 0x80, 0xe1, 0xc7, 0xd5, + 0xf5, 0x75, 0xdd, 0x12, 0xa9, 0x8b, 0x37, 0x51, 0x7e, 0x67, 0x1b, 0xb0, + 0x61, 0x3b, 0x60, 0xd6, 0xf5, 0x6d, 0xea, 0xd4, 0xce, 0xaf, 0x09, 0xa8, + 0xd5, 0x1c, 0xc6, 0x83, 0xc3, 0x90, 0xb1, 0xa1, 0xe8, 0xf8, 0xc7, 0xf5, + 0x37, 0x3b, 0x15, 0x58, 0xeb, 0x81, 0x30, 0x34, 0xc9, 0xba, 0xe8, 0x63, + 0xb8, 0xdf, 0x57, 0xf0, 0x29, 0xf7, 0xfb, 0xf7, 0xb3, 0x5d, 0x03, 0xb6, + 0x5e, 0x37, 0xb5, 0xbb, 0xae, 0xfa, 0xb9, 0xbe, 0xe1, 0xe2, 0x41, 0xc6, + 0xba, 0xf5, 0x6f, 0xc1, 0x10, 0x55, 0xea, 0x70, 0xe4, 0xeb, 0x3b, 0xd9, + 0xb4, 0x4c, 0xbd, 0xf3, 0x93, 0xfa, 0xf7, 0x55, 0xad, 0x49, 0xb6, 0x1f, + 0xde, 0x43, 0xff, 0x95, 0x9b, 0x55, 0xbc, 0x04, 0x50, 0x53, 0x90, 0xad, + 0x74, 0x4a, 0xc5, 0xd9, 0xfc, 0x19, 0x05, 0x12, 0xdb, 0x8c, 0xda, 0x3a, + 0x45, 0xbf, 0xc8, 0xab, 0x3f, 0xf1, 0x7b, 0x6d, 0xab, 0x27, 0x84, 0x40, + 0x56, 0x54, 0x7e, 0x6e, 0xa5, 0x80, 0xe8, 0x16, 0x04, 0x5f, 0x47, 0x56, + 0x77, 0x16, 0x50, 0xbf, 0xe9, 0xaf, 0x7f, 0x30, 0xc3, 0xfb, 0xbf, 0x56, + 0x84, 0xaf, 0xe9, 0x8c, 0xf5, 0xf6, 0xeb, 0x1f, 0xcc, 0xd0, 0xdc, 0xfa, + 0xf1, 0x81, 0x5e, 0x20, 0xba, 0xa1, 0xdd, 0x2b, 0xae, 0xdf, 0x52, 0xef, + 0x11, 0xa1, 0xeb, 0x2f, 0xcb, 0x92, 0xaa, 0x6e, 0xd5, 0x4e, 0x57, 0x96, + 0x79, 0x83, 0x2f, 0xb5, 0xfa, 0x3c, 0xe8, 0xd5, 0xe6, 0x7f, 0x5e, 0x83, + 0xdc, 0xbb, 0xb3, 0xed, 0x31, 0x1a, 0xd9, 0xdf, 0x5a, 0xcd, 0xbe, 0x91, + 0xce, 0x00, 0x81, 0xec, 0xce, 0xa7, 0x18, 0x7e, 0xb0, 0x73, 0xfa, 0xcd, + 0x9f, 0xba, 0x95, 0xc2, 0xa1, 0x56, 0x10, 0xda, 0xe6, 0x9d, 0x5f, 0xe7, + 0xa6, 0x0d, 0xef, 0x6f, 0xfb, 0xbe, 0xfe, 0x66, 0x9b, 0xc7, 0xfa, 0x6c, + 0xf5, 0x5a, 0xc0, 0xa8, 0x3a, 0xa1, 0x5b, 0x9a, 0xf3, 0x7d, 0x35, 0x26, + 0xd2, 0x2f, 0xd4, 0xea, 0xbc, 0x50, 0xab, 0x93, 0x3d, 0x5f, 0xed, 0x3b, + 0xcf, 0xb4, 0x01, 0x6c, 0xb7, 0x29, 0xf3, 0x74, 0xf5, 0xd3, 0x38, 0x96, + 0xd9, 0xaa, 0xed, 0x75, 0xd5, 0xcf, 0xf5, 0xc2, 0x41, 0xc8, 0x2e, 0x87, + 0x6d, 0xe5, 0x92, 0x07, 0xc0, 0x1a, 0xb8, 0xaa, 0x1f, 0x28, 0x71, 0x53, + 0x00, 0x94, 0x71, 0x75, 0xa9, 0xcc, 0x97, 0xbf, 0x72, 0x2d, 0x1b, 0x3f, + 0x7c, 0x27, 0x83, 0xd7, 0x5c, 0x0b, 0x40, 0xff, 0x87, 0x04, 0xa3, 0xf7, + 0xd5, 0xe9, 0xbf, 0x52, 0x3d, 0x10, 0x46, 0x0f, 0x01, 0x65, 0xc9, 0xbe, + 0x4a, 0x89, 0xd2, 0xc9, 0x12, 0xfd, 0x7d, 0xfd, 0x80, 0xa4, 0x6f, 0xad, + 0x60, 0xec, 0x6e, 0x18, 0xcb, 0x48, 0x56, 0x5c, 0x02, 0x23, 0x87, 0x00, + 0x24, 0x4c, 0x0a, 0xae, 0xbb, 0x75, 0x1b, 0x03, 0x57, 0xad, 0xc1, 0xee, + 0x5d, 0x04, 0x3d, 0x75, 0x98, 0x84, 0x81, 0xab, 0xea, 0x0c, 0xef, 0x8d, + 0x33, 0xb0, 0x56, 0x95, 0x3d, 0x7c, 0xd7, 0x10, 0x14, 0x07, 0xd9, 0x75, + 0xcb, 0x16, 0x06, 0xd6, 0xae, 0x67, 0xfd, 0x4d, 0x36, 0xc3, 0x87, 0x80, + 0x22, 0x0c, 0xac, 0x85, 0x5d, 0x9b, 0x0b, 0xd8, 0x19, 0x9b, 0xd1, 0x43, + 0xc3, 0xc8, 0x89, 0x01, 0x46, 0x0f, 0x69, 0xa3, 0x6a, 0x06, 0x90, 0x13, + 0x12, 0xd1, 0x2b, 0x90, 0x13, 0x92, 0xc1, 0x8f, 0x0b, 0x86, 0x47, 0x60, + 0xf8, 0xae, 0x61, 0xe4, 0x44, 0x3f, 0xa5, 0xc9, 0x23, 0x38, 0x8e, 0x9c, + 0x36, 0x1e, 0xc0, 0xfa, 0x15, 0x03, 0x38, 0x04, 0x01, 0xde, 0x00, 0xea, + 0x3d, 0x9b, 0xb4, 0xc0, 0x9e, 0xef, 0x23, 0xa6, 0x92, 0x96, 0x68, 0x01, + 0x6a, 0xc9, 0x86, 0x36, 0x76, 0x95, 0x90, 0xee, 0x11, 0x94, 0x26, 0x01, + 0x5c, 0xec, 0x5c, 0x3f, 0xd5, 0xa2, 0xce, 0xd4, 0x92, 0x88, 0x84, 0x85, + 0x1d, 0x93, 0xd4, 0x03, 0x86, 0xeb, 0x4e, 0x05, 0x6c, 0x24, 0xfd, 0x19, + 0x81, 0x94, 0xae, 0xfe, 0x1a, 0x25, 0x49, 0x0a, 0xe8, 0xbf, 0x50, 0x30, + 0xb4, 0x3f, 0x89, 0xa0, 0x84, 0x34, 0xbf, 0xac, 0x36, 0xef, 0x6b, 0x73, + 0xfd, 0xdf, 0xf4, 0xc7, 0x6f, 0xe0, 0x2d, 0x67, 0x87, 0x1b, 0xc0, 0x3f, + 0x98, 0x7c, 0x99, 0xdf, 0xe8, 0x09, 0xfb, 0x15, 0xff, 0xfb, 0x7f, 0xb4, + 0xe4, 0x11, 0xe9, 0xb5, 0xd5, 0xbf, 0x24, 0xe6, 0xf0, 0x64, 0xed, 0x65, + 0x0f, 0xae, 0x05, 0x78, 0xbd, 0xe5, 0x13, 0x7a, 0xfb, 0xa3, 0x19, 0xf2, + 0x68, 0x7b, 0x5f, 0xeb, 0xb6, 0x79, 0xb6, 0x1b, 0x0a, 0x15, 0x78, 0xee, + 0x71, 0x0d, 0x94, 0x9a, 0x0b, 0xa2, 0xdb, 0xe6, 0x4d, 0x8f, 0x38, 0x38, + 0xc0, 0xae, 0xbb, 0x7c, 0xe0, 0x95, 0xf9, 0xc5, 0xdc, 0xfb, 0x83, 0x6e, + 0xb8, 0xad, 0x87, 0x63, 0xab, 0x1c, 0xb6, 0x02, 0x7b, 0xee, 0xbb, 0x87, + 0x7f, 0xed, 0xb6, 0x59, 0xb7, 0x08, 0x7e, 0x18, 0xc0, 0x3a, 0x0c, 0x5c, + 0xde, 0x3a, 0x9e, 0x19, 0xd4, 0x71, 0xe0, 0xfc, 0x29, 0x05, 0xeb, 0x02, + 0x58, 0x1f, 0x08, 0x1b, 0x6e, 0x8a, 0xfb, 0xad, 0x63, 0x70, 0xb9, 0x01, + 0x5d, 0x35, 0x85, 0x5d, 0xbe, 0x48, 0x01, 0xb7, 0x5a, 0x95, 0xa1, 0xbf, + 0x0b, 0xcc, 0x5d, 0x7e, 0xf3, 0x47, 0x94, 0xb1, 0xfb, 0xcd, 0xab, 0xa6, + 0xf8, 0xe8, 0x76, 0xb8, 0xf7, 0x09, 0xd8, 0xbd, 0xbb, 0x43, 0xdd, 0x0c, + 0x34, 0xeb, 0x07, 0xdd, 0x9e, 0x41, 0xed, 0x92, 0x17, 0x5b, 0xc7, 0x71, + 0x3e, 0x6a, 0xec, 0xe7, 0xbd, 0x7c, 0x32, 0xfe, 0xfe, 0xba, 0xa2, 0x1f, + 0xb1, 0x79, 0xdf, 0x03, 0x66, 0x41, 0x08, 0xc4, 0xe5, 0xed, 0xeb, 0xed, + 0xee, 0x4c, 0x18, 0xa2, 0x15, 0x4a, 0xdf, 0x94, 0x3f, 0xb4, 0xef, 0x73, + 0x05, 0xde, 0xe1, 0x6b, 0x3e, 0xf5, 0x10, 0xf2, 0xe8, 0xd5, 0x58, 0xab, + 0xbe, 0xcc, 0x9d, 0x7f, 0x76, 0x29, 0x02, 0x18, 0xbc, 0xc4, 0x1f, 0x5f, + 0x1e, 0x3a, 0xe4, 0x3f, 0xcb, 0x3b, 0xf9, 0xaf, 0x59, 0xa1, 0xfc, 0xf7, + 0x8c, 0x68, 0xbf, 0x91, 0xf7, 0x78, 0x7e, 0x21, 0xff, 0x40, 0xdc, 0xa0, + 0xff, 0xe8, 0x84, 0x6a, 0xed, 0xf4, 0xf7, 0x5a, 0xde, 0x7e, 0x7f, 0xaf, + 0x45, 0xee, 0x4e, 0x55, 0xcf, 0xe1, 0xdf, 0x2f, 0x91, 0xcf, 0x48, 0x06, + 0x3e, 0x90, 0xe2, 0x0b, 0xdf, 0x7b, 0x1f, 0xc3, 0x0f, 0x94, 0x11, 0xc7, + 0x55, 0x1e, 0x9b, 0xfe, 0x31, 0xcb, 0xf6, 0xdf, 0x9d, 0x1e, 0x98, 0x54, + 0x58, 0x2b, 0xe8, 0xbb, 0x3b, 0x19, 0x46, 0xfd, 0x5e, 0x98, 0x62, 0xeb, + 0x93, 0x65, 0xea, 0xf0, 0x8a, 0x80, 0x5a, 0x9d, 0x34, 0x70, 0xc3, 0x97, + 0x19, 0xbe, 0xed, 0xea, 0x10, 0x50, 0x0b, 0x20, 0x7f, 0xfb, 0xcc, 0x8b, + 0x03, 0x00, 0xe4, 0xef, 0x70, 0xe1, 0x62, 0x41, 0x76, 0xb1, 0xe0, 0x63, + 0xbd, 0x5f, 0xe2, 0x98, 0xc6, 0x1b, 0xcd, 0x4a, 0x6d, 0xda, 0x66, 0xc3, + 0x6d, 0x2e, 0xbf, 0x2b, 0xcb, 0x88, 0x4a, 0x52, 0xbb, 0x47, 0x70, 0x8b, + 0xca, 0xe0, 0x3d, 0xdb, 0xfd, 0x09, 0xed, 0x37, 0x04, 0x0c, 0x62, 0x75, + 0xea, 0x8f, 0x00, 0x6e, 0xa3, 0x84, 0xdd, 0x9d, 0xc3, 0x9d, 0x2c, 0xe3, + 0x36, 0x4a, 0x64, 0x12, 0x39, 0x5c, 0x0d, 0x5f, 0xb0, 0x12, 0xab, 0x71, + 0x6b, 0xfb, 0x70, 0x1b, 0x65, 0xac, 0x98, 0xee, 0x37, 0x07, 0xdc, 0x41, + 0x25, 0x53, 0x69, 0x95, 0x87, 0x74, 0xc8, 0xf5, 0xae, 0x26, 0x7f, 0x3c, + 0xdb, 0x14, 0x43, 0x02, 0x37, 0x35, 0x95, 0x2d, 0xa1, 0xa1, 0x41, 0x5a, + 0x0d, 0xa1, 0xc7, 0xf9, 0xd5, 0x7b, 0xcc, 0x45, 0x62, 0xc5, 0x04, 0x4e, + 0x79, 0x0c, 0xcb, 0xb2, 0x49, 0x8a, 0x14, 0x85, 0xc9, 0xe9, 0xc7, 0xcd, + 0x7e, 0xbe, 0x34, 0x43, 0xcb, 0xae, 0x01, 0x20, 0xda, 0x5e, 0xd7, 0xb6, + 0xf7, 0x7a, 0x1b, 0x65, 0xf0, 0x9f, 0x14, 0x99, 0x80, 0x7f, 0xb1, 0x69, + 0x3f, 0x18, 0x2f, 0xa8, 0x9b, 0x77, 0xeb, 0xf0, 0x0c, 0x7c, 0x51, 0x47, + 0xf8, 0xe0, 0x07, 0x7b, 0x61, 0xe3, 0x4a, 0x0e, 0xec, 0xd8, 0xf1, 0xba, + 0xc2, 0xa3, 0x0e, 0xb4, 0xd9, 0x3f, 0xdd, 0xf2, 0xfa, 0x7b, 0xa0, 0x67, + 0x39, 0x70, 0xf0, 0xb5, 0xa8, 0x51, 0x67, 0xf5, 0xf6, 0xc2, 0x8e, 0xc0, + 0xf0, 0x5c, 0x73, 0xdd, 0x67, 0xad, 0x59, 0x8c, 0x9b, 0xfd, 0xd2, 0x28, + 0x26, 0x42, 0xa0, 0x5f, 0x57, 0x2a, 0x88, 0x6c, 0xeb, 0x37, 0x03, 0xe9, + 0x6d, 0xcd, 0xb7, 0x3e, 0x62, 0x16, 0x34, 0x5c, 0x40, 0x78, 0x50, 0x27, + 0x08, 0xf7, 0x9d, 0xdc, 0x9a, 0x0b, 0x02, 0x5c, 0xe9, 0x78, 0xd9, 0x18, + 0x00, 0xf7, 0xab, 0x51, 0xcb, 0xa2, 0x22, 0xb3, 0x04, 0x72, 0x05, 0x21, + 0xe0, 0x40, 0xdb, 0xeb, 0x1a, 0xfc, 0x1e, 0x92, 0x69, 0x40, 0x51, 0x03, + 0x5d, 0xe2, 0x06, 0x12, 0xa3, 0x93, 0x96, 0x1b, 0x0a, 0x54, 0x23, 0x09, + 0x82, 0x05, 0xcd, 0x37, 0x39, 0xdd, 0x4d, 0x6b, 0x1a, 0x2b, 0xb3, 0x04, + 0x50, 0x03, 0xd7, 0x03, 0x54, 0x29, 0x7f, 0x37, 0x00, 0xd4, 0x12, 0x0d, + 0x0d, 0x2e, 0xd6, 0xe5, 0x15, 0xf4, 0xf7, 0xba, 0xaa, 0xac, 0xaa, 0xf3, + 0x97, 0x00, 0xa7, 0x11, 0x47, 0xc6, 0x14, 0x6c, 0x8a, 0x1a, 0x88, 0x84, + 0xea, 0xef, 0xd4, 0x63, 0x92, 0x78, 0x43, 0x50, 0xd7, 0xcf, 0xea, 0x9c, + 0x80, 0x62, 0x4d, 0x52, 0x25, 0xf0, 0x9d, 0x46, 0x2a, 0x28, 0x57, 0xa1, + 0xa6, 0x81, 0x5e, 0x42, 0xa5, 0x15, 0x31, 0x05, 0x72, 0x14, 0xf8, 0x9f, + 0x0a, 0x83, 0xfd, 0x63, 0xd1, 0xc0, 0x83, 0x69, 0xf9, 0xaa, 0x87, 0xfc, + 0x56, 0x5f, 0xb5, 0xde, 0xfb, 0x5e, 0x5e, 0x2a, 0x97, 0x28, 0x14, 0x54, + 0x5b, 0x61, 0xe0, 0xb2, 0x01, 0xb6, 0xdf, 0xba, 0x9d, 0xdc, 0x92, 0x1c, + 0xb9, 0x25, 0x39, 0xf2, 0x47, 0xf3, 0x6c, 0xfa, 0xcc, 0x56, 0x00, 0x76, + 0x7e, 0x76, 0xab, 0x0f, 0xd2, 0xd2, 0xe5, 0x24, 0xa9, 0x93, 0x12, 0x71, + 0xf2, 0x15, 0x20, 0x56, 0x47, 0x10, 0x47, 0x02, 0x85, 0x46, 0x9d, 0x9c, + 0x88, 0x53, 0x30, 0xdd, 0x31, 0x03, 0x75, 0x0b, 0x82, 0xbe, 0x1a, 0x82, + 0x6c, 0xa3, 0x4e, 0x41, 0x87, 0xdd, 0xd2, 0x80, 0xf7, 0xd3, 0xfe, 0xfb, + 0xa5, 0xa5, 0xfd, 0x7e, 0xf4, 0xa3, 0xe9, 0x5b, 0xf1, 0x3f, 0x46, 0x01, + 0x77, 0xce, 0xe6, 0x02, 0xa6, 0x4a, 0xcf, 0xf2, 0x52, 0xba, 0xd6, 0x36, + 0xde, 0xdc, 0x52, 0xa2, 0x63, 0xd8, 0x6c, 0x54, 0x3a, 0x55, 0xf1, 0x20, + 0x5a, 0x46, 0x87, 0xf3, 0x27, 0x49, 0x27, 0x20, 0x9d, 0x50, 0xe1, 0xe9, + 0x79, 0xdd, 0x5e, 0xd8, 0x19, 0xb1, 0x39, 0x6d, 0xb7, 0xcd, 0xee, 0x4e, + 0x6a, 0x86, 0x66, 0x6d, 0x7c, 0xc3, 0xe3, 0xec, 0x58, 0xa2, 0x80, 0x5a, + 0xc0, 0x2b, 0x02, 0x6a, 0x19, 0xd0, 0xd7, 0xe9, 0x68, 0xf7, 0x73, 0xdf, + 0x64, 0x33, 0xab, 0xf8, 0xab, 0x03, 0x07, 0xf8, 0xc0, 0xdc, 0xb9, 0x1e, + 0x38, 0xeb, 0xdc, 0x55, 0xab, 0xb8, 0x0c, 0xf8, 0xd1, 0xfe, 0xfd, 0x00, + 0x1e, 0x4c, 0x0b, 0xed, 0x77, 0xec, 0xa1, 0x87, 0xbc, 0xfd, 0x73, 0xde, + 0xdc, 0x45, 0x57, 0xfa, 0x1c, 0xbe, 0x51, 0x9e, 0xf2, 0xae, 0x6b, 0x48, + 0x81, 0x7b, 0xdd, 0x00, 0xa6, 0xdc, 0x36, 0x00, 0xa9, 0xdc, 0x85, 0x59, + 0xca, 0xe5, 0x12, 0xc4, 0xc2, 0x48, 0xea, 0x7a, 0x25, 0x0c, 0x69, 0x8b, + 0xc7, 0x20, 0x9d, 0xb4, 0x70, 0xaa, 0x2e, 0x42, 0xd6, 0x89, 0x77, 0xc7, + 0x11, 0x31, 0x41, 0x9d, 0x3a, 0x55, 0x47, 0xc1, 0xaf, 0x72, 0x0b, 0xb2, + 0x58, 0xbd, 0x59, 0x44, 0x37, 0xa4, 0x49, 0x87, 0xf2, 0x94, 0x53, 0x92, + 0x64, 0xda, 0x00, 0xfb, 0x82, 0x70, 0x2d, 0x7f, 0x6b, 0xc0, 0x5b, 0x72, + 0x4a, 0xdd, 0xcf, 0xce, 0xa4, 0x43, 0xba, 0x3b, 0x8d, 0xe8, 0x16, 0x5e, + 0x58, 0x5d, 0x4a, 0xa8, 0x06, 0x9e, 0xa7, 0x02, 0xac, 0x79, 0x96, 0xfe, + 0x3e, 0xe8, 0xc7, 0x0b, 0x2e, 0xea, 0x45, 0x43, 0x6a, 0x20, 0x96, 0x85, + 0x5b, 0x6a, 0x6d, 0x2b, 0x8b, 0x84, 0xa0, 0x5e, 0xab, 0x23, 0x12, 0x16, + 0xf1, 0xa2, 0xa4, 0x5e, 0x53, 0xf3, 0x26, 0xac, 0xb4, 0x6a, 0x53, 0x4a, + 0xe9, 0x62, 0xcd, 0x13, 0xb8, 0xa7, 0x9a, 0xbe, 0x41, 0xc6, 0x14, 0xa8, + 0x4b, 0x4a, 0x81, 0x35, 0x4f, 0xb5, 0x67, 0xcb, 0xb5, 0x82, 0xff, 0xdc, + 0x35, 0xe7, 0xdb, 0x7c, 0x3f, 0x9e, 0x92, 0x64, 0x17, 0xe7, 0x14, 0x80, + 0x4b, 0x42, 0x92, 0x24, 0x32, 0x25, 0xa9, 0xc7, 0xc0, 0x2d, 0x3b, 0xd0, + 0xad, 0xce, 0x41, 0xff, 0xc5, 0x03, 0x94, 0xf4, 0x58, 0x7c, 0x32, 0x91, + 0xa6, 0xea, 0x06, 0xc6, 0x03, 0x9b, 0x9e, 0xe1, 0xc1, 0x6b, 0x6f, 0xe0, + 0x51, 0x2d, 0xc7, 0xd7, 0x23, 0xf8, 0xe7, 0x27, 0xff, 0x0c, 0xf4, 0xab, + 0x7e, 0x7c, 0xfc, 0x69, 0x16, 0xbc, 0x7c, 0x35, 0x5c, 0xf0, 0x28, 0x00, + 0x5b, 0x5e, 0x56, 0xbf, 0xff, 0xfb, 0xe3, 0xeb, 0x18, 0xcd, 0xdb, 0x5e, + 0x9a, 0x66, 0x80, 0x54, 0x10, 0x1c, 0xe5, 0x81, 0xae, 0xda, 0xac, 0xa9, + 0xd5, 0xf7, 0xde, 0xb7, 0x7b, 0xee, 0xb1, 0xef, 0x3c, 0x4e, 0x4f, 0x2a, + 0xfc, 0x25, 0x35, 0xff, 0x94, 0xc3, 0xfa, 0x4b, 0x36, 0xb0, 0xeb, 0xd0, + 0xce, 0x50, 0x59, 0x72, 0x52, 0xaa, 0x71, 0xf9, 0x80, 0x0c, 0x28, 0xcc, + 0x83, 0x6f, 0x01, 0xbc, 0x11, 0x6c, 0x0d, 0xf2, 0x3a, 0x2f, 0xd5, 0xcb, + 0xbb, 0x03, 0xe5, 0x3d, 0xa2, 0x81, 0x5e, 0x3f, 0x2c, 0x4f, 0xe0, 0x8c, + 0x9f, 0xe4, 0xb1, 0xff, 0x18, 0x83, 0xb1, 0xc0, 0xb9, 0xd1, 0x40, 0x2d, + 0xef, 0xf8, 0x4e, 0x4a, 0x0f, 0x3a, 0x06, 0xe0, 0x7e, 0xf1, 0xdd, 0x88, + 0xcf, 0x3d, 0x42, 0xf1, 0xe8, 0x08, 0x99, 0x25, 0x3e, 0xd9, 0xbe, 0x05, + 0x2a, 0x16, 0xd8, 0x37, 0xdb, 0xe0, 0xf9, 0x31, 0x40, 0x2d, 0xb3, 0x6d, + 0x96, 0xf1, 0x9f, 0xdf, 0xb5, 0xac, 0xc5, 0xff, 0x38, 0x07, 0xdb, 0xdf, + 0xd3, 0x91, 0x22, 0x45, 0x8a, 0x14, 0x29, 0x52, 0xa4, 0x48, 0x91, 0x22, + 0x45, 0x8a, 0x14, 0x29, 0x52, 0xa4, 0x48, 0x91, 0x22, 0x45, 0x8a, 0x14, + 0x29, 0x52, 0xa4, 0x48, 0x91, 0x22, 0x45, 0x8a, 0x14, 0x69, 0x56, 0x8a, + 0xa0, 0x5a, 0x91, 0x22, 0x45, 0x8a, 0x14, 0x29, 0xd2, 0xcf, 0x50, 0x75, + 0x46, 0x99, 0xc3, 0xab, 0x07, 0x51, 0xa5, 0xbb, 0xd3, 0xb8, 0xee, 0xec, + 0x8c, 0x63, 0x8c, 0x52, 0x3d, 0x29, 0x0f, 0x82, 0x93, 0xee, 0x4e, 0x52, + 0x9a, 0x2c, 0xe1, 0x14, 0x1d, 0xa4, 0x94, 0x94, 0xca, 0x25, 0xd2, 0xa9, + 0xb4, 0x07, 0xd6, 0x32, 0x90, 0x97, 0xf2, 0x64, 0x19, 0x4b, 0xaf, 0x4c, + 0x9a, 0xd4, 0x30, 0xa0, 0x6a, 0xad, 0xaa, 0xe0, 0x4b, 0x9d, 0x56, 0xdb, + 0xfc, 0x25, 0x50, 0xb5, 0xc9, 0xa8, 0x74, 0x26, 0xd5, 0x19, 0x6d, 0x9d, + 0x98, 0xfc, 0x09, 0x07, 0xfe, 0x78, 0x0e, 0x32, 0x30, 0x8f, 0x58, 0x24, + 0xd4, 0x4a, 0xcb, 0x56, 0x42, 0x20, 0xb5, 0x51, 0xab, 0x25, 0x34, 0x44, + 0xc2, 0x4c, 0x0c, 0x6f, 0xf8, 0x00, 0x8d, 0x66, 0xc3, 0x16, 0xb7, 0x26, + 0x11, 0xd5, 0xf0, 0xda, 0xd8, 0x2d, 0x2a, 0xbb, 0x6a, 0x36, 0x78, 0x70, + 0x02, 0xe3, 0xa4, 0x4b, 0xdc, 0x42, 0xc1, 0xa9, 0x42, 0x12, 0xde, 0x2a, + 0xcd, 0x5e, 0x89, 0x45, 0x03, 0xe2, 0xf2, 0x27, 0xca, 0xca, 0xc9, 0x36, + 0x79, 0x06, 0x54, 0x47, 0x71, 0x0a, 0xe2, 0x00, 0x93, 0x52, 0x95, 0x15, + 0xf0, 0x67, 0x52, 0xaa, 0x59, 0xee, 0xa5, 0xc0, 0x2a, 0xb2, 0xc6, 0x51, + 0x0a, 0xc4, 0x03, 0xea, 0xc5, 0xd6, 0xdf, 0x75, 0xbd, 0xe8, 0x42, 0xb7, + 0x20, 0x5e, 0x92, 0x04, 0xa7, 0xef, 0xd6, 0x09, 0xe7, 0xd9, 0x51, 0xc7, + 0x7d, 0xb8, 0x58, 0xc8, 0xaf, 0x27, 0x70, 0x4c, 0x4d, 0x50, 0xa4, 0x90, + 0x74, 0xf9, 0x80, 0xba, 0xae, 0x4d, 0x46, 0x63, 0xe6, 0xbe, 0x76, 0x6b, + 0x75, 0xac, 0x44, 0x60, 0xc2, 0x71, 0x03, 0xca, 0x15, 0x87, 0x54, 0x2a, + 0x8b, 0xd4, 0xbf, 0x29, 0x71, 0x9a, 0x50, 0x2d, 0x50, 0x60, 0x2d, 0x23, + 0xb7, 0x56, 0xd6, 0xfb, 0xf1, 0x0e, 0x71, 0xed, 0xd0, 0xb6, 0xd9, 0xdd, + 0x2e, 0x6e, 0xb3, 0xdb, 0xee, 0xb1, 0xa9, 0xba, 0xed, 0xef, 0x01, 0x3b, + 0x63, 0xe3, 0xba, 0x6e, 0x4b, 0xb8, 0x9d, 0xb1, 0x71, 0x8a, 0x6d, 0x20, + 0x5d, 0xa7, 0xe1, 0x9f, 0xd4, 0x40, 0x95, 0xe6, 0xbc, 0x3b, 0xf9, 0xa7, + 0x7b, 0xd2, 0x94, 0x26, 0x5b, 0x7f, 0x94, 0xb3, 0xf1, 0x9f, 0x8d, 0xb1, + 0xc9, 0x74, 0xf7, 0xb5, 0x53, 0x54, 0xf9, 0x24, 0x13, 0x71, 0x0f, 0x3a, + 0xa8, 0x8c, 0x62, 0xd4, 0x8f, 0x3f, 0x05, 0x24, 0x45, 0x92, 0x23, 0x4f, + 0x1e, 0xc1, 0xd2, 0xab, 0x24, 0x9b, 0x2b, 0x36, 0x7c, 0x68, 0x98, 0x64, + 0x22, 0xc9, 0x50, 0xa5, 0xc4, 0xc0, 0x8a, 0x01, 0xd2, 0x81, 0x55, 0x9f, + 0xdb, 0x9d, 0x2b, 0x25, 0x19, 0x5a, 0x85, 0xd9, 0x4e, 0xa7, 0x48, 0xa7, + 0xd2, 0xb8, 0x55, 0xd7, 0x9b, 0x90, 0x6d, 0x8c, 0x72, 0xec, 0x1e, 0x9b, + 0x81, 0x15, 0x7d, 0x54, 0x5d, 0x49, 0xe6, 0x50, 0xab, 0x01, 0xa1, 0xdb, + 0x50, 0x06, 0x7f, 0x6e, 0x20, 0x3f, 0x2b, 0x26, 0x28, 0x96, 0xcb, 0x64, + 0x52, 0x29, 0x2f, 0xdc, 0xc4, 0x35, 0xe1, 0x41, 0x37, 0xf8, 0x10, 0x2c, + 0xab, 0xdb, 0x0a, 0xc5, 0x6f, 0xe7, 0x36, 0x2a, 0x96, 0xcb, 0xaf, 0x4b, + 0x7c, 0xe3, 0x36, 0xc7, 0x10, 0x3e, 0x73, 0x4d, 0x67, 0x52, 0x1f, 0x87, + 0x88, 0x09, 0xca, 0x06, 0xe4, 0xd5, 0xe6, 0xbe, 0x66, 0xc3, 0x38, 0x7c, + 0x72, 0x2e, 0x37, 0x8c, 0x8f, 0xb7, 0x9c, 0xc3, 0x76, 0xba, 0x6d, 0xc1, + 0x82, 0x16, 0x70, 0x54, 0x10, 0x1a, 0x45, 0x60, 0x1b, 0x8c, 0x63, 0xc2, + 0x37, 0x6a, 0x38, 0xd4, 0x01, 0x0e, 0x78, 0xc0, 0xa8, 0xeb, 0x6f, 0xbb, + 0x8d, 0xde, 0xfd, 0xfb, 0xf9, 0x5f, 0x73, 0x6e, 0xe0, 0x8b, 0xc0, 0xaa, + 0xeb, 0xaf, 0xa7, 0x77, 0x81, 0x6f, 0xdc, 0x76, 0x83, 0x86, 0xe7, 0x5c, + 0x7f, 0x1b, 0x6d, 0xfd, 0x6e, 0xbb, 0xfe, 0x7a, 0x6e, 0xb8, 0xfd, 0x76, + 0x40, 0x6d, 0xaf, 0xbf, 0x0d, 0x26, 0xc6, 0xc7, 0x99, 0xb8, 0xfd, 0x76, + 0x56, 0x06, 0xcc, 0x00, 0x4d, 0xb9, 0xc1, 0xba, 0x06, 0xeb, 0x36, 0x5d, + 0xfd, 0x67, 0x3a, 0x26, 0x03, 0xdc, 0x0a, 0x4e, 0x97, 0x57, 0x79, 0x4e, + 0xb4, 0xa4, 0x9b, 0x08, 0xc5, 0x99, 0x60, 0xa3, 0xae, 0xa3, 0x81, 0x66, + 0xf5, 0x12, 0x9e, 0x74, 0x7f, 0x80, 0x09, 0x56, 0xd2, 0x4b, 0xf1, 0x36, + 0x65, 0x2a, 0xb8, 0xf2, 0x86, 0x95, 0x5e, 0xbe, 0x2b, 0x03, 0x60, 0xaf, + 0x50, 0xaa, 0x0d, 0xe3, 0xad, 0x06, 0x82, 0x87, 0x1c, 0x98, 0xeb, 0x5f, + 0xff, 0x6f, 0x8c, 0x3e, 0xc6, 0x15, 0x87, 0xfc, 0xe0, 0x4b, 0x97, 0xbe, + 0x8d, 0x87, 0x8e, 0x3c, 0xc5, 0xa5, 0x4b, 0x7f, 0xfa, 0x60, 0x2d, 0x5b, + 0x08, 0x44, 0xc0, 0x80, 0x60, 0xdf, 0x44, 0x00, 0x9c, 0x55, 0x51, 0xa0, + 0xad, 0xfc, 0xa4, 0x8b, 0xdd, 0x06, 0xbe, 0xf7, 0x8b, 0xa6, 0x7c, 0x7b, + 0x0a, 0x41, 0x58, 0x9d, 0x80, 0x79, 0x4d, 0xfb, 0x59, 0x84, 0xba, 0xae, + 0xcd, 0x06, 0x82, 0x4f, 0x1c, 0x83, 0x39, 0xaf, 0x21, 0x10, 0xf6, 0x2f, + 0xd6, 0xb7, 0x78, 0x4d, 0x87, 0x30, 0x8c, 0xa7, 0x61, 0xc7, 0x92, 0xf0, + 0xb5, 0xda, 0xb5, 0xc2, 0x62, 0xe3, 0x51, 0xbf, 0xed, 0x53, 0x7e, 0x78, + 0x17, 0xfc, 0x68, 0x5d, 0x63, 0xa1, 0x00, 0x00, 0x20, 0x00, 0x49, 0x44, + 0x41, 0x54, 0xe5, 0x20, 0x5c, 0x7e, 0x84, 0xf5, 0xbb, 0x36, 0xb0, 0x0b, + 0x28, 0xdf, 0x11, 0x06, 0x6b, 0x79, 0x40, 0xad, 0x20, 0x40, 0xcb, 0xb8, + 0x83, 0xc0, 0xac, 0xeb, 0x99, 0x5d, 0xbc, 0x7b, 0xb6, 0x4e, 0x53, 0xeb, + 0x26, 0x65, 0xf4, 0x39, 0x7d, 0xa2, 0xa0, 0xc0, 0x5a, 0x1d, 0xdf, 0x5b, + 0xc0, 0x0f, 0x87, 0xe1, 0xbc, 0x81, 0xd9, 0xe7, 0xfd, 0x4a, 0xf5, 0xc4, + 0xb1, 0x56, 0xb0, 0xd6, 0x27, 0x1c, 0xd8, 0x10, 0x30, 0x64, 0x8b, 0x2b, + 0x60, 0x2d, 0xa0, 0x2d, 0x2f, 0x01, 0x24, 0xf1, 0xf9, 0x69, 0x6f, 0xa4, + 0x34, 0x39, 0x2f, 0x0e, 0x87, 0x95, 0x5b, 0x98, 0x57, 0x89, 0xbe, 0xff, + 0xc6, 0xbe, 0xd7, 0xa1, 0x11, 0x0c, 0x6c, 0xd9, 0x6c, 0x8c, 0xee, 0x85, + 0x6e, 0xf7, 0x1b, 0x83, 0xa9, 0xa0, 0x1f, 0x50, 0x0b, 0xfb, 0x1b, 0xb7, + 0xac, 0x38, 0xd0, 0xf4, 0xbb, 0xf8, 0x04, 0xb0, 0xe5, 0xd9, 0x67, 0x39, + 0xe7, 0x9c, 0x73, 0x54, 0xdd, 0x56, 0xa5, 0x41, 0xdf, 0xfe, 0xb2, 0xa2, + 0xd2, 0x7b, 0x70, 0xd4, 0x5a, 0xfb, 0x72, 0x8d, 0x0c, 0x50, 0xcb, 0x77, + 0x87, 0x8d, 0xe1, 0xda, 0x95, 0xd5, 0xdc, 0x1a, 0x57, 0x40, 0x2d, 0x1f, + 0x1e, 0x21, 0xf7, 0xee, 0x64, 0xd3, 0x67, 0x72, 0x2a, 0xcf, 0xab, 0x36, + 0xb0, 0xed, 0x37, 0xaf, 0x6b, 0x01, 0x6a, 0xdd, 0xb9, 0x37, 0x0f, 0x9f, + 0xc9, 0x72, 0xed, 0x55, 0x39, 0xf2, 0xbf, 0xb9, 0xa7, 0x05, 0xa8, 0x75, + 0xff, 0x6d, 0xc0, 0x07, 0x9f, 0xe2, 0x8a, 0x1b, 0x60, 0x74, 0xe0, 0x6d, + 0x2d, 0x40, 0xad, 0xc2, 0x5d, 0xdb, 0x59, 0x7d, 0x91, 0x6f, 0xb4, 0xa4, + 0x2a, 0xdb, 0xfa, 0xbe, 0xfe, 0x9d, 0x71, 0x60, 0x2e, 0xd3, 0xaa, 0xb9, + 0xef, 0x24, 0xa7, 0x09, 0x7b, 0x25, 0x0a, 0xa6, 0x6d, 0xf7, 0x94, 0x0a, + 0x02, 0xaf, 0x5e, 0x29, 0x90, 0xea, 0x8d, 0x73, 0x15, 0x4d, 0xe5, 0xcd, + 0x56, 0x17, 0x2f, 0xcd, 0xfd, 0x31, 0x73, 0x5f, 0x7a, 0xb1, 0x25, 0xbf, + 0x5f, 0x94, 0x63, 0x69, 0xce, 0xbf, 0x5d, 0x7e, 0xbf, 0x33, 0xde, 0x06, + 0xc0, 0xa3, 0xdf, 0xd7, 0x03, 0xcb, 0x04, 0x37, 0x4e, 0x3a, 0x88, 0xcf, + 0x0e, 0x03, 0x82, 0xc2, 0xda, 0x34, 0x7b, 0xee, 0x76, 0xc8, 0x5e, 0x28, + 0x59, 0xbd, 0x2a, 0xc7, 0x9e, 0x5b, 0xcd, 0xfd, 0x5a, 0xe7, 0xce, 0x95, + 0xea, 0x3e, 0x29, 0x97, 0xd4, 0x36, 0xd5, 0xc8, 0x22, 0xa5, 0xc4, 0x72, + 0x61, 0xe8, 0xc1, 0x38, 0x57, 0x7c, 0x08, 0x76, 0xde, 0xe1, 0xf7, 0x0f, + 0x0c, 0x1c, 0x78, 0xb5, 0xb4, 0x01, 0xc1, 0xb5, 0x2b, 0x04, 0x77, 0xde, + 0x25, 0xb9, 0xf6, 0x1a, 0xc1, 0xb6, 0xcf, 0xaa, 0x30, 0x7b, 0x99, 0xea, + 0x1f, 0x38, 0x13, 0xc7, 0xd8, 0x7c, 0xa5, 0xcd, 0x9e, 0xb1, 0x3a, 0x29, + 0x6d, 0xb4, 0x9c, 0x92, 0xfe, 0xfd, 0xe5, 0x14, 0x1d, 0x2f, 0xee, 0xf0, + 0xdd, 0xb0, 0x7e, 0x2d, 0xec, 0x42, 0x43, 0x81, 0x32, 0x36, 0x03, 0x6b, + 0x61, 0x78, 0x44, 0xea, 0xf6, 0xbf, 0x6e, 0xcf, 0x4f, 0x48, 0xc8, 0x68, + 0x38, 0x70, 0xaf, 0x60, 0xe8, 0x0e, 0x0d, 0xcc, 0xba, 0x0b, 0x4a, 0x93, + 0x47, 0xb0, 0x97, 0xf7, 0xe3, 0x38, 0xc3, 0xc8, 0x09, 0xc9, 0x86, 0x8f, + 0x0b, 0x76, 0x8d, 0xd0, 0x12, 0x0f, 0x60, 0xd7, 0x88, 0xca, 0x4b, 0xc4, + 0xaa, 0xc8, 0x46, 0x9c, 0xad, 0x9f, 0xd9, 0xc0, 0xd6, 0x5b, 0x95, 0x91, + 0x62, 0xbd, 0xe6, 0xf7, 0xbe, 0x45, 0xac, 0xae, 0xf7, 0x03, 0xd7, 0xa5, + 0xa6, 0xc2, 0x0c, 0x1c, 0xa0, 0x5a, 0x56, 0x75, 0x4b, 0xd9, 0x83, 0x94, + 0x26, 0x24, 0x22, 0x25, 0xb0, 0x84, 0xf2, 0xcb, 0x76, 0x4b, 0xdc, 0x98, + 0x45, 0xb2, 0xe6, 0x52, 0x6d, 0xa8, 0xe7, 0x58, 0x2e, 0xa3, 0x00, 0xa0, + 0xae, 0x2b, 0x3d, 0xe8, 0x59, 0xf0, 0xfd, 0xbd, 0xe2, 0x03, 0x39, 0x86, + 0xee, 0x83, 0xf4, 0xfc, 0x92, 0x3a, 0xea, 0x36, 0xef, 0xeb, 0xe0, 0x7d, + 0xfd, 0xc3, 0x26, 0x60, 0xd6, 0x5c, 0xe0, 0x87, 0x81, 0xfd, 0x5f, 0xfd, + 0xbf, 0xdf, 0xc0, 0x1b, 0x98, 0x59, 0xb3, 0x89, 0x13, 0x69, 0x76, 0x7a, + 0x12, 0x78, 0x2f, 0x0a, 0xa6, 0xf5, 0x6f, 0xda, 0xef, 0x47, 0xc0, 0xb9, + 0xc0, 0xbf, 0x4c, 0x93, 0xae, 0xed, 0x7d, 0xad, 0xfb, 0x5c, 0x85, 0x4a, + 0xd8, 0xfb, 0xec, 0x97, 0x60, 0x09, 0x0a, 0x96, 0x65, 0x5f, 0xa3, 0x3d, + 0xff, 0xb2, 0x04, 0xa4, 0xe1, 0xcf, 0x81, 0xbb, 0x60, 0x57, 0xc5, 0x61, + 0xcd, 0x5a, 0x28, 0x3b, 0x70, 0xdd, 0x7d, 0xf7, 0x30, 0x00, 0xac, 0xbf, + 0xa6, 0xce, 0xd6, 0xdb, 0xca, 0xf4, 0x37, 0x13, 0xaf, 0x9a, 0xf4, 0xf5, + 0x5b, 0xe3, 0x98, 0x17, 0xeb, 0x42, 0xe0, 0x78, 0x97, 0x2a, 0xb3, 0x2a, + 0xd5, 0x7d, 0xea, 0x00, 0x03, 0x77, 0xfb, 0xf1, 0xc3, 0xad, 0x9d, 0xa9, + 0xe9, 0x33, 0xd7, 0xfa, 0x21, 0x70, 0xf0, 0xe0, 0x41, 0xe4, 0x63, 0xeb, + 0x18, 0x35, 0x49, 0x32, 0x19, 0x8e, 0x77, 0xc1, 0xca, 0x29, 0xb8, 0x99, + 0x2e, 0xee, 0x9d, 0x9a, 0xe2, 0xa3, 0x8b, 0x61, 0xe1, 0xa6, 0xf0, 0xb1, + 0xbf, 0xe5, 0xed, 0xc0, 0x31, 0x05, 0xfc, 0x5a, 0xb8, 0xa8, 0x8b, 0xa3, + 0x3f, 0x98, 0xbe, 0xac, 0x85, 0x1a, 0xf4, 0xc5, 0xcd, 0x0a, 0xb0, 0x75, + 0xef, 0xcd, 0x81, 0xc0, 0x75, 0x99, 0xa6, 0xd8, 0x4d, 0xfb, 0xbb, 0x81, + 0x75, 0xed, 0x72, 0x35, 0xf1, 0x8a, 0x81, 0x78, 0xed, 0xd2, 0x66, 0x54, + 0x9c, 0xdd, 0xc0, 0xcd, 0xa8, 0x76, 0x55, 0xbb, 0x3e, 0x97, 0x6e, 0x9b, + 0x39, 0x25, 0x49, 0xa9, 0xac, 0x46, 0x44, 0xdd, 0xfd, 0x57, 0x03, 0xaf, + 0xfe, 0x7d, 0xb2, 0xe1, 0xb6, 0x7f, 0x62, 0xe7, 0x0d, 0xef, 0x79, 0x95, + 0xb9, 0x28, 0x6d, 0xbf, 0xbc, 0xc0, 0xe0, 0x45, 0x36, 0xf9, 0xa2, 0xab, + 0x0e, 0xfd, 0x9d, 0xca, 0x5f, 0xa4, 0x04, 0x1c, 0x97, 0x6c, 0xbe, 0xaa, + 0x8f, 0x6d, 0xbf, 0x3b, 0x36, 0x5d, 0x16, 0x00, 0x64, 0xef, 0x96, 0x8c, + 0x8d, 0x57, 0x39, 0x52, 0x56, 0xe3, 0x58, 0x83, 0x17, 0xd9, 0x0c, 0x7d, + 0xdf, 0x21, 0x9f, 0x10, 0x0c, 0x16, 0xca, 0x6c, 0x5e, 0xdb, 0xc7, 0xd0, + 0xdf, 0x8c, 0x90, 0x4f, 0x08, 0x95, 0xe7, 0xde, 0x99, 0xf3, 0x6c, 0xa7, + 0x35, 0x17, 0xd9, 0xb8, 0xfb, 0xaf, 0x66, 0xcf, 0x0c, 0x90, 0xae, 0x1d, + 0x57, 0xde, 0xcf, 0x75, 0xb7, 0xbf, 0x8f, 0xb1, 0x07, 0x5d, 0x05, 0x07, + 0x5b, 0xae, 0x0c, 0xf8, 0x73, 0x8b, 0x75, 0xfb, 0x71, 0x52, 0xc2, 0x62, + 0xc1, 0x3d, 0x13, 0xd7, 0x91, 0x5b, 0x78, 0x1a, 0x2d, 0x89, 0x36, 0x6d, + 0xb3, 0x81, 0x36, 0x6d, 0x33, 0x4b, 0xa4, 0x48, 0x76, 0x5b, 0x94, 0x8b, + 0x49, 0xbc, 0x46, 0xad, 0x17, 0x96, 0x06, 0x56, 0x60, 0x09, 0x0b, 0x57, + 0xba, 0xda, 0x6f, 0x50, 0x83, 0xb6, 0x02, 0xf1, 0x62, 0x69, 0xaa, 0x95, + 0x12, 0x6e, 0xa3, 0x84, 0x15, 0x4b, 0x93, 0xec, 0x4e, 0x53, 0xac, 0xa5, + 0xb1, 0xc4, 0x52, 0xdc, 0xda, 0x3e, 0xac, 0xc4, 0x6a, 0xac, 0x98, 0x85, + 0xdb, 0x28, 0x03, 0x69, 0xac, 0x58, 0x4a, 0xbb, 0x83, 0x2a, 0x51, 0x2d, + 0x97, 0x70, 0xa5, 0x83, 0x25, 0xec, 0x16, 0xa0, 0xd6, 0x2d, 0x57, 0x2e, + 0xe5, 0xa6, 0xfb, 0x8e, 0x00, 0xb7, 0x04, 0x7c, 0x87, 0x15, 0x48, 0x2b, + 0x06, 0x52, 0x6f, 0xdd, 0x86, 0xc4, 0xd2, 0xef, 0x38, 0x57, 0x0a, 0x0d, + 0x77, 0x06, 0xd7, 0x75, 0x02, 0x7d, 0x8d, 0x9f, 0x77, 0xcd, 0xe2, 0xce, + 0x0b, 0x80, 0x82, 0x06, 0xc6, 0xdb, 0x00, 0xd3, 0xf4, 0x33, 0xdc, 0x28, + 0x83, 0x0f, 0xca, 0x2a, 0xb6, 0xf1, 0x9b, 0x4e, 0xcb, 0xf5, 0xb6, 0xd8, + 0xe4, 0x5f, 0x44, 0xc1, 0xb4, 0x5a, 0x35, 0xc1, 0xc4, 0x81, 0xd3, 0xc3, + 0x46, 0xcd, 0x04, 0xc4, 0xea, 0x05, 0x76, 0x68, 0xf7, 0x74, 0xf1, 0x82, + 0xa5, 0xce, 0x0a, 0xb0, 0xf5, 0x6d, 0xf8, 0xe2, 0xc1, 0xd9, 0x44, 0xf4, + 0xf3, 0x9f, 0x2d, 0xb8, 0x2b, 0x38, 0x8e, 0x17, 0x04, 0x6a, 0xbd, 0xaa, + 0xbc, 0x67, 0x31, 0x6e, 0xf6, 0xf3, 0x24, 0xf5, 0x1d, 0x4d, 0xe0, 0xba, + 0xe5, 0xb6, 0x0b, 0x53, 0xb4, 0x55, 0x43, 0x8d, 0xe1, 0xcb, 0x86, 0x44, + 0xd6, 0x5c, 0x1f, 0x52, 0x25, 0x81, 0x84, 0x6a, 0x8b, 0xcb, 0x86, 0x8b, + 0x08, 0xf6, 0xab, 0x35, 0xbc, 0x4a, 0x08, 0x0b, 0x29, 0x5d, 0x84, 0x70, + 0x15, 0x58, 0x4b, 0xe7, 0x67, 0x64, 0xda, 0xd0, 0x5e, 0xfc, 0x36, 0xbd, + 0xb3, 0xd9, 0x42, 0xb0, 0x3a, 0xc9, 0xa4, 0xf7, 0xeb, 0x34, 0x3b, 0xb0, + 0x56, 0x4b, 0x9c, 0x36, 0xed, 0x70, 0xf3, 0x9d, 0xab, 0x20, 0x25, 0xb6, + 0x10, 0x64, 0x9a, 0x16, 0x6a, 0x12, 0x31, 0x28, 0x36, 0xa0, 0xde, 0x90, + 0xc8, 0x98, 0x08, 0x3c, 0x27, 0xa4, 0xf7, 0x4d, 0xd3, 0x6d, 0xe0, 0x41, + 0x9d, 0xb2, 0x31, 0x70, 0x1b, 0x55, 0x4a, 0x24, 0x55, 0x97, 0x20, 0xe6, + 0xc3, 0xa0, 0x40, 0x81, 0xaa, 0x82, 0xf0, 0xaa, 0x34, 0x75, 0x0a, 0x31, + 0x70, 0x6b, 0xb0, 0xcb, 0x75, 0xb1, 0x13, 0x82, 0x35, 0x02, 0xb6, 0x35, + 0x92, 0x38, 0x93, 0xfa, 0xc3, 0x68, 0xac, 0x4e, 0xae, 0x3b, 0x8e, 0x53, + 0xf1, 0xd3, 0x1b, 0x19, 0x80, 0x96, 0x88, 0x49, 0x8a, 0x52, 0x60, 0x21, + 0x49, 0x25, 0x2c, 0xca, 0x35, 0x48, 0xc5, 0x24, 0x85, 0x06, 0x04, 0xb1, + 0x98, 0x52, 0xea, 0xb2, 0x1b, 0xaa, 0x5e, 0x06, 0xf0, 0x05, 0x60, 0x37, + 0xea, 0xb8, 0xba, 0xbe, 0x05, 0x0f, 0xfc, 0x15, 0x47, 0x36, 0x8d, 0xa9, + 0x40, 0x1c, 0x01, 0x0c, 0xed, 0xdd, 0x43, 0x3a, 0x9b, 0x25, 0xb7, 0x44, + 0x8d, 0x95, 0x94, 0x34, 0xf0, 0x79, 0xe8, 0x80, 0xff, 0x3e, 0xcb, 0x1f, + 0xcd, 0x7b, 0x7e, 0x4e, 0xe1, 0x88, 0x57, 0xf9, 0xe0, 0x95, 0xa9, 0x37, + 0xe2, 0x94, 0x65, 0x9d, 0x34, 0xa6, 0x4e, 0x75, 0xaf, 0x0e, 0x4e, 0xcd, + 0x87, 0x7b, 0xc9, 0x58, 0x73, 0x3d, 0x94, 0x0a, 0x7a, 0xb1, 0x99, 0x6b, + 0x1b, 0xc2, 0x3b, 0xd6, 0x76, 0xdf, 0xb9, 0x5c, 0x46, 0x99, 0xcb, 0xb9, + 0x00, 0x9c, 0x38, 0x71, 0x82, 0x79, 0x6d, 0x20, 0x52, 0x67, 0x73, 0x81, + 0x07, 0xd5, 0xfa, 0x31, 0x4f, 0x33, 0xdd, 0xd4, 0x86, 0x67, 0x5f, 0x98, + 0x62, 0x5e, 0xda, 0xcf, 0x63, 0xf1, 0xb9, 0x2b, 0x78, 0xe2, 0x47, 0x23, + 0xde, 0xfe, 0x4c, 0xd0, 0x2d, 0x03, 0xd0, 0x2a, 0xd5, 0x60, 0x59, 0x6e, + 0xbe, 0xb7, 0x6f, 0x94, 0x9e, 0xd7, 0x4d, 0xe9, 0x54, 0xa5, 0x63, 0xfa, + 0xd3, 0x55, 0x3b, 0x68, 0x96, 0x01, 0x6a, 0xbd, 0x52, 0x9d, 0x2e, 0x50, + 0xcb, 0x68, 0xdb, 0xdf, 0x7e, 0x92, 0x5f, 0x5b, 0x3a, 0x87, 0x47, 0x69, + 0xf0, 0xe8, 0x73, 0xdf, 0x84, 0xbf, 0xfd, 0x26, 0x00, 0xa7, 0x4e, 0xbc, + 0xcc, 0xbc, 0xb7, 0xce, 0xe1, 0x5d, 0x4f, 0xc4, 0x38, 0x77, 0xd5, 0x2a, + 0x0f, 0xa6, 0xf5, 0xc0, 0x4b, 0x2f, 0x85, 0xd2, 0x77, 0xa5, 0xcf, 0xe1, + 0xc4, 0x89, 0x13, 0x70, 0xd6, 0x39, 0xb8, 0x8c, 0xb6, 0x42, 0x78, 0xf4, + 0x33, 0x3c, 0xff, 0x64, 0x01, 0x2b, 0x30, 0xaf, 0x43, 0x80, 0xfe, 0x2e, + 0xde, 0xfe, 0xf9, 0x21, 0xe2, 0xe1, 0xe7, 0xd7, 0xea, 0x77, 0xae, 0xc0, + 0x75, 0xfd, 0x36, 0xab, 0x1d, 0x17, 0x94, 0xf4, 0x18, 0x48, 0xb5, 0x5c, + 0x25, 0xde, 0x1d, 0xe7, 0xd8, 0x44, 0x09, 0xca, 0x92, 0xd1, 0x93, 0x05, + 0x06, 0x7b, 0xb3, 0x0a, 0xee, 0x5f, 0xab, 0x62, 0x2d, 0xf4, 0x7f, 0x3c, + 0x0a, 0x9c, 0xa5, 0x80, 0x55, 0xf1, 0x84, 0x0f, 0xd2, 0x0a, 0xaa, 0x5a, + 0x92, 0xa1, 0xb8, 0xd9, 0x54, 0x16, 0xb7, 0xe1, 0x22, 0x2b, 0x92, 0x6a, + 0x4c, 0x83, 0xb2, 0x84, 0x82, 0x72, 0xf5, 0x2f, 0xe9, 0xc7, 0x29, 0x97, + 0x28, 0x95, 0x1d, 0x84, 0x10, 0xa8, 0x3b, 0x5f, 0x42, 0x9d, 0x30, 0x50, + 0x4b, 0x1f, 0xb4, 0xac, 0x49, 0x6f, 0x8e, 0x8b, 0x71, 0x03, 0xde, 0x9c, + 0x17, 0x99, 0x40, 0x51, 0xf6, 0x40, 0xcd, 0x75, 0x88, 0x09, 0xe4, 0x94, + 0xeb, 0x0d, 0x6b, 0xb8, 0xa7, 0xa4, 0xbf, 0xa0, 0x97, 0x79, 0xfe, 0xc7, + 0x84, 0xca, 0x4f, 0xe2, 0xc5, 0x4d, 0x75, 0xa7, 0xd4, 0xfb, 0xa4, 0xf9, + 0xf4, 0xc6, 0x54, 0x3c, 0x11, 0x13, 0xec, 0xdb, 0xbb, 0x87, 0xd5, 0x57, + 0xae, 0xe6, 0xfe, 0xfd, 0xf7, 0xd0, 0x7f, 0xc9, 0x80, 0x82, 0xfd, 0x75, + 0xdb, 0xd0, 0x10, 0xc8, 0x2a, 0x8c, 0x7e, 0x7f, 0x18, 0x5b, 0x2f, 0x16, + 0x51, 0xad, 0x95, 0x10, 0xb1, 0x24, 0xb2, 0xa1, 0xbf, 0x93, 0x37, 0x3d, + 0xc3, 0xcd, 0x3d, 0x2d, 0x7a, 0x44, 0x08, 0x3c, 0x25, 0x50, 0x6d, 0xfd, + 0xf5, 0x97, 0x6c, 0xe0, 0x4b, 0xff, 0xb8, 0xc9, 0x03, 0x68, 0x79, 0xba, + 0xe0, 0x51, 0x78, 0xfa, 0x5d, 0x70, 0xc1, 0xa3, 0x6c, 0x9d, 0xf3, 0x76, + 0xb6, 0xbc, 0xfc, 0x38, 0xe9, 0x6e, 0x9b, 0xfe, 0xdc, 0x00, 0x4e, 0x43, + 0x3d, 0xc7, 0xc4, 0xfc, 0x70, 0x9e, 0x10, 0x06, 0x48, 0xc9, 0x31, 0x17, + 0xde, 0x08, 0xcf, 0x8c, 0x9f, 0xe4, 0x7c, 0x0d, 0xb9, 0x6a, 0x56, 0xdf, + 0x7b, 0xdf, 0xce, 0xd8, 0x77, 0x5a, 0xef, 0xb1, 0xdc, 0xc2, 0x2c, 0x42, + 0x8f, 0x27, 0x19, 0xc8, 0x15, 0xf3, 0x05, 0x0e, 0x25, 0xfa, 0x01, 0xd9, + 0x8b, 0x57, 0xb6, 0x01, 0x6b, 0x19, 0x3d, 0x36, 0x36, 0x86, 0x8d, 0x2a, + 0xcf, 0x00, 0xb5, 0x2e, 0x58, 0xfa, 0x16, 0x9e, 0x3e, 0xf2, 0x5c, 0x4b, + 0x39, 0x1e, 0xb0, 0x2b, 0x90, 0x57, 0x5b, 0xcd, 0x17, 0xb8, 0x37, 0xbe, + 0x1d, 0xeb, 0x0f, 0x1f, 0xe1, 0xe8, 0xf1, 0xfd, 0x0a, 0xa8, 0x35, 0xb6, + 0x4e, 0xe5, 0xf1, 0x7f, 0x7d, 0xcd, 0x4b, 0x27, 0xfa, 0x2c, 0x1f, 0xc4, + 0x15, 0x84, 0x98, 0x69, 0x3f, 0xa3, 0xe7, 0x7f, 0xe2, 0x70, 0xd6, 0x19, + 0x36, 0xcf, 0xff, 0xc4, 0xef, 0xaf, 0x99, 0xfd, 0x17, 0x5e, 0x9c, 0x01, + 0x4d, 0x7e, 0x26, 0xed, 0xef, 0xe9, 0x48, 0x91, 0x22, 0x45, 0x8a, 0x14, + 0x29, 0x52, 0xa4, 0x48, 0x91, 0x22, 0x45, 0x8a, 0x14, 0x29, 0x52, 0xa4, + 0x48, 0x91, 0x22, 0x45, 0x8a, 0x14, 0x29, 0x52, 0xa4, 0x48, 0x91, 0x22, + 0x45, 0x8a, 0x34, 0x2b, 0x45, 0x50, 0xad, 0x48, 0x91, 0x22, 0x45, 0x8a, + 0x14, 0xe9, 0x67, 0xa5, 0xfb, 0x80, 0x2b, 0x41, 0x2c, 0x14, 0xc8, 0xc3, + 0xaf, 0x2e, 0x2b, 0x03, 0xc7, 0x3a, 0x1d, 0x05, 0x61, 0x2d, 0xa5, 0x8a, + 0x0f, 0xa7, 0x19, 0x58, 0x3e, 0xc0, 0xf0, 0xc1, 0x61, 0x0f, 0xac, 0x05, + 0xf8, 0x60, 0xad, 0x1e, 0x15, 0x27, 0x08, 0xd4, 0x72, 0x2b, 0x6a, 0xa2, + 0x79, 0x72, 0x1a, 0x38, 0x50, 0x2a, 0x95, 0xa2, 0x7f, 0xb2, 0xcc, 0xbe, + 0x5f, 0xd0, 0x96, 0x47, 0x32, 0x91, 0xa4, 0x4c, 0xb3, 0xe1, 0x4d, 0x7b, + 0x09, 0x63, 0x6c, 0x74, 0x9f, 0xef, 0x77, 0xec, 0xa0, 0xcb, 0xa2, 0x4f, + 0x40, 0xaa, 0xc7, 0xc2, 0xc1, 0xac, 0x02, 0xad, 0x56, 0x29, 0xad, 0x4a, + 0x97, 0xea, 0xa4, 0x04, 0x6d, 0xae, 0x9e, 0xee, 0xd1, 0x93, 0x1e, 0x45, + 0x12, 0x59, 0xd3, 0x06, 0xbd, 0x0d, 0x10, 0x92, 0xf0, 0x5c, 0x56, 0xa1, + 0xf3, 0x39, 0xee, 0x22, 0x16, 0x5a, 0x0a, 0x54, 0xd5, 0x23, 0xc0, 0x95, + 0x08, 0x4b, 0x20, 0x5d, 0xa9, 0x26, 0x7a, 0x26, 0x94, 0x1f, 0x0d, 0xe9, + 0x1b, 0xf2, 0xf4, 0x58, 0x50, 0x73, 0xa1, 0x26, 0x21, 0xa1, 0xdd, 0x2e, + 0x60, 0x16, 0xf6, 0x15, 0x42, 0xcd, 0x20, 0x77, 0x25, 0xa4, 0x2c, 0xe5, + 0x36, 0x70, 0x2e, 0xf0, 0xb7, 0x65, 0xd7, 0x5f, 0x1d, 0xd4, 0xd5, 0xf9, + 0xba, 0x2e, 0xf1, 0x60, 0x9e, 0x96, 0x09, 0x13, 0x50, 0x53, 0x53, 0xcc, + 0xe3, 0xda, 0xed, 0xc1, 0xb5, 0x4c, 0x7a, 0x0b, 0x05, 0xfc, 0x32, 0xe1, + 0x15, 0x49, 0x3c, 0x63, 0x29, 0x88, 0x56, 0x42, 0xfb, 0x81, 0x02, 0x5a, + 0x55, 0x24, 0xf5, 0x8a, 0xf4, 0xe1, 0x56, 0xc6, 0x5d, 0x93, 0x7e, 0x5c, + 0x73, 0x4e, 0x40, 0xfb, 0xe9, 0xb2, 0x16, 0x5a, 0x2a, 0xdc, 0x80, 0xb4, + 0xc0, 0xdf, 0x1e, 0x77, 0xfd, 0xf0, 0x49, 0xa9, 0xdc, 0xae, 0x5f, 0x7e, + 0xbc, 0x22, 0xa9, 0xeb, 0xf2, 0x53, 0x3d, 0x96, 0x77, 0x7d, 0x3d, 0x05, + 0xee, 0x6b, 0xeb, 0xc9, 0x56, 0xd0, 0x55, 0xaa, 0xdb, 0xa6, 0x79, 0x52, + 0xb2, 0xac, 0x55, 0x43, 0x70, 0x2d, 0xd9, 0x01, 0xe2, 0xe6, 0xd6, 0xda, + 0xff, 0x06, 0x3b, 0xf9, 0x1b, 0x59, 0x09, 0xdb, 0x07, 0x2d, 0x74, 0x08, + 0xeb, 0x1c, 0x27, 0xa7, 0xcb, 0x70, 0x43, 0xb0, 0x27, 0x23, 0x03, 0x21, + 0x8a, 0x8b, 0x78, 0x8b, 0x7f, 0xb3, 0xdf, 0xe9, 0xfa, 0x1b, 0xc3, 0x8e, + 0xd9, 0xfa, 0xbb, 0x15, 0xb7, 0x6d, 0xde, 0xc6, 0xbf, 0x2e, 0xc3, 0x86, + 0x05, 0x41, 0xd0, 0x96, 0x31, 0x96, 0x69, 0x67, 0xd8, 0x02, 0x33, 0xdf, + 0xd7, 0x76, 0x4f, 0x9a, 0xdc, 0xe2, 0x2c, 0x23, 0x23, 0x63, 0xb8, 0xae, + 0x32, 0xc0, 0x01, 0x05, 0x2f, 0x2c, 0x4f, 0x96, 0x49, 0xf5, 0xa4, 0xd4, + 0x0a, 0xea, 0x80, 0xab, 0x0d, 0x28, 0x5c, 0x7d, 0x0f, 0xe7, 0x72, 0x39, + 0xca, 0x27, 0xcb, 0xe4, 0x16, 0xe7, 0xa8, 0x56, 0xaa, 0x94, 0x2a, 0xa5, + 0x8e, 0x2b, 0xd4, 0x5f, 0xbb, 0x76, 0x8d, 0xd7, 0x83, 0x2b, 0x57, 0xfc, + 0xdf, 0x9d, 0x53, 0x52, 0xd7, 0xa1, 0x5a, 0x93, 0xa4, 0xe6, 0x09, 0x4a, + 0x65, 0x97, 0xc1, 0xcb, 0x06, 0x19, 0x7a, 0x30, 0x60, 0x74, 0xd8, 0x50, + 0x86, 0x7e, 0xcd, 0x10, 0xc4, 0x66, 0x40, 0x96, 0xdb, 0x90, 0xde, 0x7e, + 0xf3, 0xd6, 0xc4, 0x29, 0xbb, 0x2e, 0x22, 0x21, 0x5a, 0x60, 0x5c, 0x46, + 0xc1, 0x72, 0x9a, 0xdd, 0xcd, 0x92, 0x35, 0x89, 0x9b, 0xf0, 0x57, 0x67, + 0x76, 0x13, 0x61, 0xff, 0x76, 0xf1, 0xcb, 0xf8, 0x93, 0xdc, 0x3b, 0xc5, + 0x0f, 0xd6, 0x7d, 0x3a, 0xf0, 0xa3, 0x88, 0x09, 0x6d, 0x1c, 0xa5, 0x01, + 0x01, 0x6d, 0xee, 0xeb, 0xc2, 0x77, 0x9f, 0x27, 0xbb, 0x01, 0xe6, 0xf7, + 0x24, 0xd8, 0xbf, 0x7f, 0x3f, 0xab, 0xf4, 0x4a, 0xe0, 0xb7, 0xdf, 0x76, + 0x1b, 0xd7, 0xdf, 0x70, 0x43, 0x28, 0x3f, 0x13, 0x1e, 0xc6, 0x3d, 0xf9, + 0x32, 0x50, 0xaa, 0x66, 0xa8, 0x54, 0x70, 0x0b, 0x68, 0x94, 0xd6, 0x44, + 0x08, 0xc8, 0x15, 0x60, 0x65, 0x01, 0x84, 0x80, 0x5a, 0xa7, 0xa3, 0x05, + 0x83, 0x83, 0xac, 0x5a, 0xb5, 0x8a, 0x09, 0x0d, 0x08, 0xf3, 0xcb, 0xf7, + 0xff, 0x01, 0xac, 0xa4, 0x97, 0x03, 0x84, 0xad, 0xf0, 0xda, 0x1d, 0x97, + 0x31, 0xda, 0x9b, 0xdd, 0x31, 0xa9, 0x78, 0xc1, 0xb8, 0x2b, 0x35, 0x6c, + 0xcb, 0x87, 0x70, 0xf9, 0xe5, 0xf6, 0xe2, 0x1b, 0xf9, 0x29, 0xd0, 0x57, + 0x6f, 0x08, 0xa6, 0x65, 0xea, 0x6a, 0xf2, 0xde, 0xc1, 0x04, 0x9f, 0xd4, + 0x61, 0x3b, 0x38, 0xc0, 0x4a, 0x2f, 0x85, 0x01, 0x7a, 0x4d, 0xe8, 0xf4, + 0x13, 0xbc, 0xa1, 0x47, 0xfd, 0x60, 0x0a, 0xdf, 0x7d, 0xde, 0xcb, 0xef, + 0xd8, 0x71, 0x58, 0x04, 0xa4, 0x12, 0x78, 0xef, 0x8c, 0x2b, 0x0e, 0xc1, + 0xfd, 0x97, 0x00, 0xa3, 0x8f, 0x01, 0xea, 0xbe, 0x7d, 0x9f, 0x6f, 0x03, + 0xf4, 0x53, 0x95, 0x23, 0x25, 0xb6, 0x0b, 0x96, 0x05, 0xf9, 0x49, 0xf5, + 0x1b, 0xb5, 0xf5, 0xf3, 0xc2, 0x91, 0x92, 0xfc, 0xa4, 0x4b, 0xae, 0xc7, + 0xe2, 0x34, 0x39, 0xab, 0x3f, 0x97, 0x4a, 0x27, 0xe2, 0x9e, 0x01, 0xa4, + 0x65, 0x25, 0x29, 0x4f, 0x3a, 0x9e, 0x99, 0x5a, 0x52, 0xfb, 0x8b, 0x84, + 0xa0, 0x34, 0xe9, 0xbf, 0x03, 0xe3, 0x09, 0x81, 0xa5, 0xc3, 0x4a, 0xe5, + 0xb2, 0xf7, 0xb6, 0x4d, 0x69, 0x40, 0xc8, 0xb1, 0xe3, 0x7e, 0xfe, 0xc7, + 0xca, 0x75, 0x75, 0xad, 0x2d, 0x41, 0x0b, 0x31, 0xe8, 0x95, 0xe8, 0x2f, + 0xd6, 0xc3, 0x65, 0x03, 0xb0, 0x7f, 0x48, 0x6d, 0xa7, 0xd1, 0xb5, 0x57, + 0xc2, 0x39, 0x9b, 0xfb, 0x81, 0x0c, 0xe7, 0x3f, 0xa8, 0x81, 0x84, 0x4d, + 0x50, 0xd3, 0xdc, 0x12, 0xb0, 0x6f, 0x1a, 0xe0, 0xce, 0xfd, 0x0e, 0x1c, + 0x1a, 0x86, 0xcf, 0xa4, 0xd9, 0xf6, 0xf0, 0x39, 0xb0, 0x18, 0xf5, 0x67, + 0xf2, 0xba, 0x0a, 0xee, 0xdc, 0xeb, 0xc2, 0x25, 0x69, 0xb8, 0xbe, 0xbd, + 0x01, 0x5d, 0x28, 0x5e, 0xce, 0x0a, 0x03, 0xb4, 0x9a, 0x75, 0xcf, 0x56, + 0xf8, 0xd0, 0x6a, 0xd8, 0xbb, 0x07, 0x3e, 0xb0, 0x3a, 0x1c, 0x66, 0x0c, + 0x52, 0x6b, 0x6d, 0x4e, 0xd8, 0xe2, 0x2c, 0x4c, 0x14, 0xe0, 0xc1, 0x61, + 0xb0, 0x03, 0xed, 0x85, 0x5d, 0x5b, 0x70, 0x2f, 0x1b, 0x80, 0x07, 0x6d, + 0x58, 0x7d, 0xc5, 0x34, 0x05, 0xbf, 0x36, 0x4a, 0xe9, 0x36, 0xea, 0xb1, + 0xb2, 0x7f, 0x2e, 0xbc, 0xf7, 0x75, 0x2a, 0xc5, 0xce, 0x87, 0x87, 0x3a, + 0x25, 0x65, 0xfb, 0xe1, 0x7d, 0x6d, 0xfd, 0x47, 0xef, 0xdb, 0xd6, 0x31, + 0xcd, 0x96, 0xcd, 0x37, 0x21, 0xdd, 0x12, 0x42, 0x03, 0x33, 0x3b, 0xb9, + 0x45, 0xb7, 0x81, 0x5f, 0x75, 0x8e, 0x13, 0x74, 0x1b, 0x25, 0x57, 0xa5, + 0xe1, 0x6b, 0x45, 0xd6, 0x03, 0xa5, 0x73, 0xce, 0xe1, 0x31, 0xe0, 0x1d, + 0x4d, 0x75, 0x30, 0xe9, 0xda, 0xa5, 0x6f, 0xf6, 0x0b, 0x02, 0xb5, 0x9a, + 0x35, 0x9b, 0xb2, 0x7e, 0x9e, 0x94, 0xd2, 0xd0, 0xcc, 0xe0, 0xfb, 0x7a, + 0xf8, 0xf9, 0x02, 0xbf, 0x43, 0x96, 0xf3, 0x12, 0xf3, 0x39, 0xf9, 0x73, + 0xfc, 0x1c, 0x7c, 0xb5, 0x28, 0xea, 0x37, 0xce, 0x3d, 0x93, 0xc4, 0x19, + 0x67, 0x00, 0xf0, 0x82, 0x3b, 0x45, 0xe2, 0x8c, 0x33, 0xa8, 0x81, 0x07, + 0xd6, 0xfa, 0x69, 0xea, 0xa7, 0x81, 0xd5, 0x3e, 0x2f, 0xa1, 0x0c, 0xe2, + 0x86, 0x9f, 0xf7, 0xcd, 0x9d, 0x83, 0xef, 0xeb, 0x7b, 0xee, 0x73, 0x10, + 0x87, 0x87, 0xc9, 0x2e, 0x1b, 0xa0, 0x70, 0x78, 0x94, 0x52, 0xa9, 0x84, + 0xc5, 0x28, 0xb0, 0x94, 0xfc, 0xfe, 0x3c, 0x0a, 0x6f, 0x0b, 0x29, 0x46, + 0x38, 0x72, 0x00, 0xd2, 0x4b, 0x72, 0x0c, 0x1d, 0x88, 0xb3, 0xe3, 0x2b, + 0xca, 0xbf, 0xff, 0x43, 0xca, 0xf8, 0xbb, 0xff, 0x4a, 0xa0, 0x01, 0xab, + 0xff, 0x28, 0xcd, 0xbe, 0xbf, 0x29, 0xf1, 0xb9, 0xff, 0xd9, 0xcf, 0xce, + 0x3b, 0x4a, 0xac, 0xbe, 0x5e, 0xf5, 0xcf, 0xfb, 0xae, 0x54, 0x08, 0xb1, + 0xbe, 0xb5, 0xaa, 0x0e, 0xab, 0x3f, 0x9d, 0x66, 0xdf, 0xad, 0x7e, 0x7f, + 0x62, 0xcd, 0x4d, 0x36, 0x34, 0xa0, 0xef, 0x12, 0x95, 0x4f, 0xdf, 0x55, + 0x75, 0xcf, 0xa8, 0x7c, 0x60, 0xed, 0x0a, 0x9c, 0xc3, 0xfe, 0xfb, 0x6a, + 0x40, 0xe7, 0x31, 0x70, 0x89, 0xbf, 0x6f, 0x03, 0x03, 0xd7, 0x0c, 0xe2, + 0x1c, 0x74, 0x90, 0x0d, 0xc9, 0xc0, 0x35, 0x83, 0x0c, 0x5c, 0xa2, 0xfc, + 0x55, 0x2f, 0x4d, 0x42, 0x1f, 0xa4, 0xa5, 0xa4, 0x7f, 0x6d, 0x3f, 0xce, + 0x41, 0x07, 0xe7, 0xe0, 0x28, 0xfd, 0x6b, 0xfb, 0x19, 0xb8, 0x44, 0xf5, + 0x91, 0xfa, 0xfb, 0x74, 0x01, 0x81, 0x78, 0x00, 0x85, 0x6f, 0x17, 0x28, + 0x9d, 0x74, 0x48, 0xdb, 0xaa, 0xaf, 0xb4, 0xf5, 0xd6, 0x9d, 0x08, 0x6d, + 0x74, 0x1d, 0x4f, 0x24, 0xd5, 0xd8, 0x01, 0x20, 0x1b, 0x3e, 0x5c, 0xcb, + 0xec, 0x1b, 0xc8, 0xb7, 0x82, 0x87, 0xf8, 0xd7, 0x25, 0xd9, 0x0d, 0x25, + 0x17, 0x84, 0x90, 0x10, 0xb3, 0x19, 0xc8, 0x56, 0x91, 0x75, 0x89, 0xd0, + 0xef, 0x88, 0x64, 0xcc, 0xdc, 0x84, 0x42, 0x0d, 0x2f, 0x20, 0x10, 0xb4, + 0x1a, 0x90, 0xc6, 0x1b, 0x2e, 0x76, 0x2e, 0x8d, 0xac, 0x94, 0x54, 0xfb, + 0x8b, 0xf0, 0xfb, 0x3a, 0x78, 0x5f, 0xbf, 0xe5, 0xec, 0x39, 0x21, 0x80, + 0x56, 0x27, 0x9d, 0xf7, 0x17, 0x6f, 0x7c, 0x4d, 0xe2, 0xcc, 0xa8, 0x26, + 0xc0, 0xd7, 0x7f, 0x35, 0x5d, 0x88, 0x02, 0x6a, 0xfd, 0x2e, 0xf0, 0x3c, + 0x70, 0x96, 0xfe, 0x33, 0x2d, 0xeb, 0x7e, 0x3a, 0x43, 0xb5, 0xda, 0xdd, + 0xd7, 0xc1, 0x3e, 0xd7, 0x44, 0xb9, 0xf5, 0x21, 0x7e, 0xf6, 0x4b, 0x0a, + 0x70, 0xe5, 0xa3, 0x3f, 0x35, 0x50, 0x4b, 0x6b, 0x00, 0x78, 0xe6, 0x6b, + 0xf0, 0xa6, 0xb7, 0x03, 0xdf, 0x2a, 0xc3, 0xe5, 0x29, 0xf8, 0xf3, 0x38, + 0xfd, 0xcb, 0x02, 0x71, 0x2e, 0xf7, 0x81, 0xcb, 0xc7, 0xc6, 0x5d, 0x06, + 0xc6, 0x25, 0xfb, 0x8e, 0xc2, 0xd9, 0x81, 0x72, 0xcc, 0xcf, 0x2f, 0x27, + 0xc3, 0xf0, 0xac, 0x61, 0x5d, 0x06, 0xa8, 0xfb, 0x72, 0x7b, 0xb7, 0xcd, + 0x92, 0x17, 0x1d, 0x0c, 0x07, 0xf6, 0xf8, 0xb1, 0x29, 0x16, 0x2e, 0xea, + 0x02, 0x34, 0xe8, 0xed, 0xd8, 0x94, 0xe7, 0x3e, 0x0f, 0xb8, 0x7c, 0x51, + 0x17, 0x45, 0x76, 0x23, 0xde, 0xb1, 0x9b, 0x75, 0xc0, 0xf2, 0xdd, 0x19, + 0xb8, 0x19, 0xee, 0x5d, 0x57, 0xd4, 0xb9, 0x66, 0x00, 0xb8, 0x17, 0xd8, + 0xbd, 0x7b, 0x1d, 0x07, 0x8b, 0x70, 0xdd, 0xdb, 0x60, 0xdf, 0x51, 0x78, + 0x4e, 0xdb, 0x1a, 0x07, 0xeb, 0xb9, 0xe4, 0x45, 0xc7, 0xbb, 0x1f, 0x7e, + 0x88, 0x82, 0x81, 0x05, 0x75, 0xef, 0x94, 0xbf, 0xed, 0xef, 0x52, 0x75, + 0x00, 0xb8, 0x77, 0x77, 0x20, 0xd2, 0xcd, 0x6d, 0xdc, 0xc5, 0xa2, 0x22, + 0xd6, 0xdc, 0x9c, 0xf1, 0xc3, 0xd6, 0xa1, 0x20, 0x59, 0xa6, 0x9e, 0xc1, + 0x74, 0xed, 0xf2, 0x0a, 0xc4, 0x99, 0xdf, 0xae, 0xcf, 0x65, 0xda, 0x66, + 0x19, 0x8b, 0xfc, 0xc4, 0x1e, 0x00, 0xec, 0x55, 0x5f, 0x66, 0xec, 0xd0, + 0x1e, 0x6e, 0xfd, 0xca, 0xb5, 0xec, 0xd9, 0xbb, 0x87, 0x7d, 0xe2, 0x1e, + 0xc4, 0x5e, 0x97, 0xc1, 0x4f, 0x7d, 0x0e, 0xd9, 0xb3, 0x95, 0xd5, 0x93, + 0xea, 0xf9, 0x34, 0x74, 0xa8, 0x84, 0xbc, 0xca, 0x52, 0x61, 0x97, 0xa8, + 0x36, 0xce, 0xbe, 0x9e, 0x3a, 0xf9, 0xc6, 0x37, 0x58, 0x7f, 0xcb, 0xf9, + 0x6c, 0x5f, 0xf6, 0x25, 0xaa, 0xff, 0xf0, 0x7b, 0x94, 0xba, 0x3f, 0xc7, + 0x9d, 0x29, 0xf5, 0x6b, 0x11, 0x7b, 0x5d, 0xd6, 0xac, 0xf0, 0xdb, 0x43, + 0x7b, 0x46, 0xf4, 0x58, 0xeb, 0x55, 0x16, 0xd7, 0xae, 0x08, 0xb7, 0x9d, + 0x46, 0x27, 0xd4, 0x6f, 0xaf, 0xbf, 0xd7, 0x52, 0xee, 0xa6, 0xb1, 0x19, + 0x6b, 0x24, 0xce, 0x50, 0xa2, 0x04, 0x07, 0x25, 0xb9, 0xcc, 0xec, 0x69, + 0x49, 0x63, 0xe3, 0x6a, 0x3c, 0x28, 0xdd, 0x9d, 0x54, 0x80, 0xae, 0x36, + 0xca, 0x27, 0xc4, 0x69, 0xe5, 0x19, 0x94, 0x90, 0x92, 0xad, 0xd7, 0x64, + 0x39, 0x32, 0x0e, 0x37, 0xee, 0x9d, 0x1e, 0xa8, 0xc5, 0x72, 0xc1, 0x75, + 0xb7, 0xbf, 0x4f, 0xc1, 0xb4, 0x02, 0xca, 0x2d, 0x16, 0xe4, 0xef, 0x70, + 0x91, 0x7a, 0xec, 0x3f, 0xbf, 0xdf, 0xe5, 0xda, 0x4f, 0xa5, 0xd8, 0xb3, + 0x69, 0x76, 0xe3, 0xe1, 0xa9, 0x4c, 0xeb, 0x58, 0xca, 0x90, 0x7b, 0x8c, + 0x01, 0x16, 0x91, 0x4e, 0xa4, 0x5a, 0xfa, 0xa8, 0xd5, 0x4a, 0xfb, 0xf3, + 0x10, 0xb7, 0x2c, 0xe2, 0x58, 0xd4, 0x5d, 0x57, 0x83, 0xb5, 0xc0, 0x12, + 0x16, 0xd0, 0x0a, 0xd6, 0x72, 0x65, 0x19, 0x2b, 0x66, 0xbe, 0x5d, 0xe8, + 0xb1, 0x36, 0x39, 0x44, 0xc6, 0xba, 0x96, 0xa2, 0x7b, 0x27, 0x96, 0x75, + 0xad, 0x02, 0x6b, 0x01, 0x20, 0x3d, 0xb7, 0x95, 0x58, 0xad, 0xe3, 0x8e, + 0xe2, 0x36, 0xca, 0x58, 0xc2, 0x07, 0x10, 0xac, 0x5e, 0x08, 0xb9, 0xc5, + 0x59, 0x6e, 0xba, 0xef, 0xf7, 0x80, 0xaf, 0x06, 0xc0, 0x5a, 0xbe, 0xcc, + 0xb0, 0xb8, 0x79, 0x47, 0x4a, 0x29, 0x70, 0x03, 0x78, 0x50, 0x11, 0x0b, + 0x8f, 0xfc, 0xba, 0xae, 0x83, 0x65, 0xb5, 0x07, 0x10, 0x49, 0x3d, 0x8e, + 0x1f, 0x54, 0xda, 0xca, 0x51, 0x72, 0xf3, 0xb3, 0x0a, 0x9f, 0xad, 0xda, + 0xe6, 0x93, 0xc8, 0x52, 0xaa, 0x15, 0xe8, 0x04, 0xcf, 0x90, 0x6e, 0x1d, + 0x61, 0xe9, 0x71, 0xd6, 0x46, 0x30, 0x9d, 0x7a, 0x96, 0x0e, 0xb9, 0x3e, + 0x08, 0x3b, 0xf8, 0x0c, 0xaf, 0x06, 0x7e, 0xe3, 0x99, 0xa6, 0x6d, 0xb3, + 0x9b, 0x0e, 0xfe, 0xc5, 0x69, 0xd2, 0x65, 0x8a, 0xbe, 0xdf, 0x4a, 0xed, + 0xff, 0x41, 0xe0, 0xc0, 0xc4, 0xf4, 0x14, 0xa9, 0x66, 0xe4, 0xd6, 0x4a, + 0x3a, 0x43, 0xa5, 0x8c, 0xff, 0xca, 0xc0, 0xfe, 0xe9, 0x2a, 0x98, 0xf7, + 0x7f, 0xfb, 0x3a, 0x3c, 0xf7, 0x49, 0x78, 0x21, 0xb6, 0x83, 0xbf, 0xfb, + 0x6b, 0x58, 0xf9, 0xed, 0xd9, 0xa5, 0x9f, 0x2e, 0xcf, 0x66, 0xf5, 0xf6, + 0xce, 0x1e, 0xa4, 0xd5, 0x6e, 0xbf, 0x5d, 0xbe, 0x6d, 0x9f, 0xe1, 0xc1, + 0x71, 0xb3, 0x46, 0x9b, 0x44, 0x3f, 0x4d, 0xe9, 0xb1, 0x5c, 0x03, 0x92, + 0x52, 0x60, 0x12, 0x89, 0x94, 0x2e, 0x96, 0xa5, 0x81, 0x1c, 0x33, 0xd4, + 0x51, 0xd6, 0x5c, 0x2c, 0x2b, 0x85, 0x94, 0x6e, 0x0b, 0x90, 0xca, 0xea, + 0xce, 0x20, 0x6b, 0x65, 0x24, 0x92, 0x54, 0x22, 0xe3, 0x7d, 0x83, 0x91, + 0x28, 0xf2, 0x92, 0x2a, 0xab, 0x1c, 0x48, 0xe3, 0x3f, 0x2f, 0x45, 0x22, + 0x05, 0x0d, 0xd7, 0xcb, 0xcb, 0xb4, 0x81, 0x5f, 0x2d, 0x40, 0x6b, 0xda, + 0x63, 0x31, 0xe7, 0x01, 0x66, 0x0d, 0xd6, 0x32, 0x6a, 0xd7, 0x0e, 0x0f, + 0x7e, 0xe7, 0x42, 0x86, 0x61, 0x57, 0xa0, 0xf6, 0x8b, 0x1a, 0x62, 0x55, + 0x6f, 0x34, 0x87, 0xab, 0xf1, 0x76, 0xd3, 0x8f, 0x00, 0xb5, 0x2d, 0x34, + 0x04, 0x69, 0x20, 0x4d, 0xd5, 0x5b, 0x5c, 0x48, 0xd6, 0xea, 0x14, 0x62, + 0x71, 0xac, 0x86, 0x0f, 0xd8, 0x92, 0xb1, 0x7a, 0xcb, 0x93, 0xc9, 0xb1, + 0x04, 0x6b, 0x62, 0x30, 0x26, 0xf1, 0x4e, 0xa8, 0xc9, 0xbb, 0x50, 0xa9, + 0x93, 0x8c, 0x81, 0x4b, 0x5c, 0xc3, 0x69, 0xcc, 0xb5, 0x97, 0xc8, 0x86, + 0x82, 0x79, 0x11, 0x93, 0xb8, 0x8d, 0x2a, 0xa2, 0x26, 0x48, 0xc5, 0xfc, + 0xf4, 0x6e, 0x03, 0xef, 0xb7, 0xec, 0x3d, 0xc9, 0x43, 0x40, 0x2d, 0xd5, + 0x37, 0x2a, 0x11, 0x57, 0xef, 0x93, 0x58, 0x9d, 0xac, 0x0e, 0xb7, 0x1a, + 0x75, 0x9c, 0x58, 0x1c, 0x1a, 0xba, 0xff, 0x14, 0x80, 0x82, 0xe5, 0x04, + 0x38, 0x4f, 0x14, 0x18, 0x2a, 0x14, 0x18, 0xbc, 0x6a, 0x8d, 0x77, 0x1c, + 0x06, 0xb2, 0x95, 0x3f, 0x9a, 0x27, 0xb7, 0x24, 0x47, 0xfe, 0x68, 0x1e, + 0xab, 0x14, 0x44, 0x7b, 0xc5, 0xbd, 0xf3, 0x0b, 0xaa, 0x1c, 0x5b, 0x28, + 0xb0, 0x96, 0x81, 0x7a, 0x89, 0xee, 0x38, 0xa2, 0x52, 0x0f, 0x41, 0xbf, + 0xcc, 0x01, 0x18, 0xd8, 0xa3, 0x40, 0x78, 0x99, 0x64, 0x11, 0x8c, 0xe8, + 0xba, 0xb5, 0xfb, 0xce, 0xc5, 0x57, 0x80, 0x0f, 0xc3, 0x99, 0x0b, 0xdf, + 0x04, 0x2e, 0x6d, 0x81, 0x5a, 0xa7, 0x4e, 0xbc, 0x0c, 0x6f, 0x7d, 0xba, + 0xc5, 0xbf, 0x93, 0xe6, 0xbd, 0x75, 0x4e, 0x08, 0x9c, 0x15, 0x04, 0x6a, + 0xcd, 0xa4, 0xc3, 0xa3, 0x79, 0x96, 0xe5, 0x54, 0x7f, 0xa1, 0x94, 0x3f, + 0xc9, 0x0f, 0xc6, 0x4f, 0x2a, 0x77, 0x13, 0x6c, 0x29, 0x3d, 0xaf, 0x9b, + 0x7f, 0xf9, 0xe1, 0xe4, 0xac, 0xf3, 0x6d, 0xa7, 0x47, 0x4f, 0xbc, 0xec, + 0x01, 0xb5, 0x82, 0xee, 0x9f, 0x47, 0xcd, 0x7b, 0xeb, 0x1c, 0xfe, 0xf5, + 0xc8, 0xcb, 0x30, 0x57, 0x81, 0xb7, 0x00, 0x58, 0x0c, 0xbf, 0x86, 0xf6, + 0xd7, 0x9a, 0x2a, 0x3d, 0xcb, 0x39, 0x6f, 0xee, 0x52, 0xd7, 0x13, 0xd4, + 0xf5, 0xd5, 0x0a, 0x3d, 0xc3, 0x21, 0x04, 0xd1, 0x92, 0x40, 0x32, 0x06, + 0xc9, 0x9e, 0xd6, 0xef, 0xc0, 0xf9, 0x27, 0x0b, 0xa4, 0xd3, 0x61, 0xff, + 0x78, 0x22, 0xee, 0xb5, 0xef, 0x5c, 0xe9, 0x52, 0xad, 0x43, 0x52, 0x7f, + 0x9f, 0x4d, 0xa6, 0x92, 0x54, 0xcb, 0x55, 0x96, 0xe6, 0x6c, 0x4a, 0x38, + 0xf4, 0xcb, 0x6c, 0x73, 0x96, 0x21, 0xd5, 0x6b, 0x90, 0x4c, 0x0b, 0x0f, + 0x9e, 0x15, 0x74, 0xb7, 0xdb, 0x77, 0x5c, 0x87, 0x64, 0x22, 0x49, 0x5d, + 0xd6, 0x89, 0xc7, 0xc0, 0x4a, 0x5b, 0xb8, 0x25, 0x97, 0xa4, 0x25, 0x90, + 0x15, 0x49, 0xa9, 0xac, 0x47, 0x51, 0xa4, 0x99, 0x58, 0x21, 0xd4, 0xad, + 0x15, 0x5a, 0xf4, 0x4c, 0x78, 0xdf, 0x24, 0x81, 0x16, 0x98, 0x96, 0xe8, + 0x12, 0x0a, 0x98, 0x85, 0xfa, 0x3e, 0x4e, 0x0c, 0x68, 0x68, 0xd0, 0x96, + 0x04, 0x6b, 0x9e, 0x1f, 0x6e, 0xa5, 0x2d, 0xe5, 0x0e, 0x2c, 0xd6, 0x65, + 0x16, 0x55, 0x90, 0x52, 0x60, 0xcd, 0x13, 0x38, 0x13, 0x65, 0xef, 0xdd, + 0x44, 0xd3, 0x62, 0x42, 0x22, 0x26, 0xc8, 0xe7, 0xf3, 0x5e, 0x19, 0xf1, + 0x58, 0x9c, 0xd2, 0x78, 0x19, 0x1a, 0x75, 0x05, 0x6e, 0xb4, 0xf5, 0xb7, + 0x10, 0x84, 0xfa, 0x7e, 0xdc, 0x34, 0x1a, 0xd7, 0xf2, 0x0c, 0xd7, 0xf7, + 0xf4, 0xb2, 0x0b, 0x2e, 0xe0, 0xe0, 0xd1, 0x7f, 0x51, 0x60, 0x2a, 0x14, + 0xf8, 0xca, 0x00, 0xb5, 0x46, 0xf3, 0xc3, 0x6c, 0x9d, 0xf3, 0x77, 0x7c, + 0x24, 0xb0, 0x24, 0xc8, 0x82, 0x05, 0x17, 0x00, 0x28, 0x98, 0xd6, 0x82, + 0x3b, 0x68, 0x96, 0x07, 0xb9, 0x22, 0x00, 0xa5, 0x0a, 0x00, 0xa3, 0x8c, + 0x9f, 0x08, 0x2e, 0x60, 0x06, 0x4c, 0x96, 0x55, 0x03, 0x25, 0x08, 0xd1, + 0xea, 0x7b, 0xef, 0xdb, 0x3d, 0xff, 0x67, 0xf4, 0x3d, 0x0e, 0xb0, 0xe5, + 0xf6, 0x1b, 0x91, 0x42, 0x81, 0xa9, 0x0c, 0x50, 0xcb, 0x94, 0x7b, 0x0f, + 0xbb, 0xfc, 0xfc, 0x03, 0x75, 0x32, 0x65, 0x1b, 0xff, 0xf3, 0x52, 0xea, + 0xfb, 0xe1, 0x05, 0x4b, 0xdf, 0x12, 0xd8, 0xbe, 0x9d, 0x47, 0xbe, 0xf3, + 0x38, 0xe7, 0xa5, 0x7a, 0x71, 0xc6, 0x4f, 0x7a, 0xf9, 0x04, 0xb7, 0x2d, + 0xc7, 0xa1, 0x41, 0x59, 0xbc, 0xdb, 0x46, 0xae, 0x78, 0x9c, 0x4c, 0xfd, + 0x6f, 0x55, 0x84, 0x47, 0x1c, 0xc4, 0xe7, 0x1e, 0x81, 0xf9, 0x02, 0xd1, + 0x67, 0xf9, 0x60, 0x2e, 0x93, 0xc7, 0x49, 0xc9, 0xe5, 0x89, 0xdf, 0x55, + 0xc7, 0x56, 0x3a, 0x09, 0x6f, 0x84, 0xf3, 0x17, 0xce, 0xe7, 0x99, 0xf1, + 0x93, 0x9c, 0x75, 0x86, 0xcd, 0xf9, 0x0b, 0xe6, 0xf3, 0x4c, 0x60, 0xed, + 0x26, 0xb3, 0x7f, 0xd6, 0x19, 0xe1, 0xfe, 0xc2, 0xf9, 0x0b, 0xe6, 0xf3, + 0x9d, 0x23, 0x7b, 0x99, 0xdf, 0xb5, 0x8c, 0xe7, 0x7f, 0xe2, 0xb0, 0xec, + 0x02, 0x75, 0x7d, 0x82, 0xf7, 0x74, 0xa4, 0x48, 0x91, 0x22, 0x45, 0x8a, + 0x14, 0x29, 0x52, 0xa4, 0x48, 0x91, 0x22, 0x45, 0x8a, 0x14, 0x29, 0x52, + 0xa4, 0x48, 0x91, 0x22, 0x45, 0x8a, 0x14, 0x29, 0x52, 0xa4, 0x48, 0x91, + 0x22, 0x45, 0x9a, 0xbd, 0x7e, 0x41, 0xd1, 0x16, 0x91, 0x22, 0x45, 0x8a, + 0x14, 0x29, 0xd2, 0x2f, 0x81, 0xae, 0x7c, 0xed, 0xb2, 0x4a, 0x76, 0x27, + 0x71, 0x4f, 0x93, 0xa0, 0x60, 0xf7, 0xd8, 0xe4, 0xb5, 0x01, 0x46, 0xda, + 0x4a, 0x52, 0x2a, 0x97, 0x70, 0x8a, 0x0e, 0x4e, 0xd1, 0x41, 0x4a, 0x89, + 0x9d, 0xb1, 0x29, 0x4d, 0x96, 0x48, 0x07, 0x26, 0x50, 0x26, 0x13, 0x49, + 0xaa, 0x95, 0x2a, 0x24, 0x14, 0x50, 0xab, 0x3c, 0x59, 0xf6, 0x26, 0x6a, + 0x57, 0x6b, 0x55, 0x92, 0x89, 0x24, 0x76, 0x8f, 0x32, 0x26, 0x35, 0xfe, + 0x56, 0xb7, 0x45, 0xbf, 0x06, 0x1e, 0x7c, 0xb9, 0x01, 0x57, 0xff, 0xa2, + 0xb5, 0x3e, 0x1a, 0xea, 0xd8, 0x4e, 0x5b, 0x57, 0x02, 0xbf, 0xaf, 0x9c, + 0x8b, 0x96, 0xfb, 0x46, 0x51, 0x56, 0xb7, 0x40, 0x4a, 0x3d, 0xc9, 0x4f, + 0x08, 0xd2, 0xdd, 0x16, 0x25, 0xb7, 0x04, 0xda, 0x80, 0xd5, 0xb6, 0x2d, + 0x1c, 0x47, 0x03, 0xb6, 0x16, 0xf6, 0x51, 0xad, 0x14, 0x41, 0x96, 0x70, + 0x43, 0x50, 0x18, 0x3d, 0x21, 0x33, 0x26, 0x11, 0x09, 0x0b, 0x89, 0x66, + 0x57, 0xb9, 0x12, 0x69, 0x09, 0x52, 0x93, 0x92, 0xb2, 0x37, 0x29, 0x16, + 0xb0, 0x04, 0xd6, 0xa4, 0xc4, 0x4d, 0x58, 0x30, 0xe9, 0x22, 0x26, 0x5d, + 0xe4, 0x42, 0x2b, 0x04, 0x45, 0x48, 0x21, 0xbc, 0x69, 0xff, 0xa9, 0x49, + 0x49, 0xb9, 0x9b, 0x90, 0xac, 0x1a, 0xb8, 0x16, 0xe0, 0x4a, 0x52, 0x31, + 0x41, 0xd9, 0xc0, 0x71, 0x12, 0x0a, 0xba, 0x95, 0x02, 0xca, 0xb5, 0x00, + 0x24, 0x0b, 0xb4, 0x61, 0x83, 0xa0, 0x6e, 0x41, 0x32, 0x60, 0x8c, 0x96, + 0xaa, 0x48, 0xca, 0x19, 0xa1, 0xb6, 0x1a, 0x56, 0x95, 0x6a, 0xd0, 0x82, + 0x2d, 0x8b, 0x9b, 0x89, 0xa5, 0xdd, 0x82, 0xa5, 0x2e, 0x1c, 0x89, 0x41, + 0xbc, 0x22, 0x49, 0x21, 0x70, 0xba, 0x05, 0x76, 0x05, 0xca, 0x09, 0x41, + 0xbd, 0x26, 0x49, 0xba, 0x50, 0xcd, 0x04, 0xc0, 0x5b, 0x41, 0x09, 0x48, + 0x4f, 0x48, 0x4a, 0x29, 0x34, 0x28, 0x4b, 0xe5, 0x9b, 0x94, 0x50, 0xd5, + 0xe5, 0x27, 0x27, 0x24, 0xd5, 0x26, 0xab, 0xf0, 0x74, 0x4c, 0x50, 0xaa, + 0x29, 0x58, 0x97, 0x49, 0x5f, 0x47, 0xcd, 0xbd, 0xad, 0x77, 0x0b, 0xd0, + 0xf3, 0xb5, 0x17, 0x2d, 0xb7, 0x60, 0x44, 0x9f, 0xcb, 0xa6, 0xfb, 0xda, + 0xad, 0xd5, 0xb1, 0x12, 0xad, 0xa0, 0x27, 0x91, 0x88, 0x63, 0x66, 0xb5, + 0x8b, 0x26, 0x20, 0x9d, 0x48, 0x24, 0xdb, 0x82, 0xb5, 0xac, 0x44, 0x6a, + 0x46, 0x80, 0x56, 0x6b, 0x1a, 0x3b, 0xe4, 0x6e, 0x06, 0x67, 0xb5, 0x03, + 0x69, 0x75, 0x02, 0x6c, 0x55, 0xdd, 0xaa, 0x9a, 0x3c, 0xfc, 0x5f, 0x4c, + 0x32, 0x08, 0x82, 0xba, 0x12, 0xf8, 0x84, 0x72, 0x06, 0xef, 0x6b, 0x29, + 0x25, 0xae, 0xeb, 0x59, 0xc7, 0x84, 0x00, 0x4e, 0xa9, 0x1e, 0x65, 0x6c, + 0x16, 0x17, 0x49, 0x92, 0xdd, 0xc1, 0xf3, 0xa7, 0x56, 0x20, 0xce, 0xe7, + 0xf3, 0xca, 0x0e, 0x64, 0x52, 0x9d, 0xf3, 0x4e, 0x40, 0x2d, 0x80, 0xc2, + 0x84, 0x83, 0x7b, 0xca, 0xc5, 0x9a, 0x67, 0x29, 0xd0, 0xa1, 0x56, 0x32, + 0x21, 0x50, 0xf6, 0x24, 0xf5, 0x16, 0x83, 0x99, 0x6a, 0x4d, 0x52, 0x2a, + 0xbb, 0xa1, 0xe7, 0x58, 0x70, 0x82, 0x78, 0x39, 0xf0, 0xee, 0x28, 0xb7, + 0x31, 0xa4, 0x93, 0x4d, 0xf7, 0x54, 0x10, 0x68, 0x35, 0x5d, 0xfc, 0xe0, + 0xa4, 0xf4, 0xe6, 0x09, 0xea, 0x41, 0x99, 0xb0, 0xe6, 0x95, 0xa0, 0xdb, + 0x95, 0x1d, 0x8c, 0xdf, 0x29, 0x5e, 0xa7, 0x72, 0x64, 0x4d, 0x42, 0x43, + 0x22, 0x2c, 0x0b, 0xa9, 0x8f, 0x59, 0x58, 0x16, 0x6e, 0xa5, 0xfd, 0x3d, + 0x15, 0xbc, 0xaf, 0xb3, 0xbf, 0x75, 0x96, 0xe7, 0xbf, 0x7f, 0xff, 0x7e, + 0xf6, 0xef, 0xdf, 0xef, 0xed, 0xdf, 0xd0, 0x04, 0xd5, 0x32, 0x71, 0xda, + 0xa9, 0x19, 0x3a, 0xd5, 0x09, 0xbc, 0x15, 0x0c, 0xef, 0x14, 0x6f, 0xe5, + 0x6d, 0xcd, 0x88, 0xad, 0xd9, 0xcb, 0x40, 0xc1, 0x82, 0x65, 0x1d, 0xd0, + 0x18, 0xab, 0x60, 0x79, 0x3e, 0x5e, 0xcb, 0x8f, 0xd7, 0xa9, 0xae, 0xed, + 0xc2, 0x3b, 0xed, 0x4f, 0x04, 0xdc, 0xbd, 0xf8, 0x60, 0x2c, 0xbf, 0xec, + 0x89, 0x50, 0xbc, 0x5e, 0xc2, 0xe0, 0xaf, 0x5e, 0x0d, 0xc6, 0x0a, 0xd6, + 0x2f, 0x58, 0xd6, 0x09, 0x8d, 0x1f, 0xdb, 0xff, 0xf2, 0x0d, 0x2c, 0x98, + 0x63, 0xe2, 0xa3, 0xd3, 0xf8, 0xe5, 0xe9, 0x29, 0xe8, 0xea, 0xfa, 0x0e, + 0xab, 0x6b, 0xbd, 0xa8, 0xd9, 0x1a, 0x1d, 0x90, 0x7f, 0xfa, 0x0e, 0xae, + 0xf8, 0xab, 0xc7, 0x90, 0x7f, 0xaa, 0xf0, 0x32, 0xdf, 0x18, 0x7d, 0x0c, + 0xb9, 0xe9, 0x67, 0x87, 0x9a, 0x31, 0xb6, 0x17, 0x8e, 0x94, 0x0c, 0x74, + 0xfb, 0x60, 0x00, 0x3b, 0x01, 0xc3, 0x95, 0x32, 0x39, 0xd4, 0xf6, 0x17, + 0x5d, 0xa5, 0x4c, 0x1f, 0x62, 0x2e, 0xb8, 0x27, 0xcb, 0x50, 0x01, 0x44, + 0x8a, 0xfa, 0x84, 0x83, 0x6c, 0xb8, 0x64, 0x53, 0x1a, 0x98, 0x54, 0x09, + 0xa7, 0xa9, 0xbb, 0x75, 0xea, 0xae, 0x7a, 0xd6, 0x79, 0x4f, 0x82, 0xb2, + 0xa1, 0x76, 0xea, 0xeb, 0xfb, 0xa4, 0xf2, 0x5e, 0x94, 0x6a, 0x7d, 0x37, + 0xbf, 0x62, 0x19, 0xa0, 0x16, 0xc0, 0x9f, 0xee, 0x9c, 0x11, 0xaa, 0x25, + 0x1e, 0x1c, 0xe2, 0xeb, 0x17, 0xc1, 0xa2, 0x55, 0x16, 0x5e, 0x5b, 0x40, + 0x3c, 0x13, 0x8a, 0xb3, 0xfd, 0x86, 0x73, 0xd8, 0x1e, 0x1b, 0x84, 0xa2, + 0x03, 0xb7, 0xdc, 0x83, 0x6a, 0x81, 0xa4, 0x5a, 0xf2, 0xba, 0xd3, 0x38, + 0x0e, 0x77, 0x06, 0x6a, 0xa9, 0x78, 0xfa, 0x87, 0x33, 0x1d, 0xc8, 0xd7, + 0x00, 0xb5, 0x00, 0xd6, 0x6f, 0x45, 0xbc, 0xe0, 0x1b, 0xfd, 0x05, 0xdb, + 0xef, 0x6b, 0xfe, 0xb8, 0x0e, 0xf4, 0x91, 0xcd, 0xf8, 0x7d, 0x84, 0x4d, + 0x9f, 0x69, 0x7a, 0x77, 0xed, 0x82, 0xeb, 0xfe, 0xc0, 0x21, 0x5b, 0x4c, + 0xc3, 0x1d, 0x00, 0xab, 0xd9, 0xf4, 0xdd, 0x35, 0xa1, 0x28, 0x97, 0x5e, + 0xbe, 0x8f, 0x87, 0xbe, 0xb5, 0x5a, 0xc5, 0x9b, 0x2e, 0x2f, 0xe8, 0x18, + 0xc7, 0xbc, 0xf3, 0x84, 0x10, 0x5c, 0xf7, 0x07, 0x0e, 0x3c, 0xf0, 0x3e, + 0x40, 0x5f, 0x5f, 0x0d, 0xe4, 0x08, 0xbe, 0xaf, 0x3f, 0xf6, 0xdb, 0x55, + 0xea, 0x15, 0x49, 0x5c, 0x43, 0x59, 0x8d, 0x5b, 0xf4, 0x0d, 0x90, 0xc7, + 0xe1, 0xc8, 0xf7, 0xd4, 0xbb, 0xb8, 0x2c, 0xcb, 0xa4, 0x44, 0x2a, 0xe4, + 0x2e, 0xcb, 0x32, 0x29, 0x2b, 0xc3, 0x40, 0x2e, 0x4d, 0xdf, 0x3b, 0x55, + 0x5d, 0xfe, 0xe9, 0xbb, 0x5f, 0xc6, 0x29, 0xfa, 0xf5, 0x2c, 0x9e, 0xf4, + 0xdb, 0x4f, 0x06, 0xb8, 0xa5, 0x94, 0xf6, 0xdc, 0x06, 0x80, 0xd5, 0xc9, + 0xdd, 0x0c, 0xc6, 0x82, 0x56, 0xb8, 0x55, 0x75, 0x7f, 0xc9, 0x70, 0x4f, + 0xd5, 0x79, 0x08, 0x80, 0xb5, 0x82, 0x0a, 0xe5, 0xdf, 0x92, 0x6b, 0x7b, + 0xb5, 0x2d, 0xeb, 0x43, 0x26, 0xbf, 0x24, 0xb8, 0xb0, 0xed, 0x37, 0xf7, + 0xb0, 0xf9, 0x9f, 0xd7, 0x20, 0xf7, 0x2a, 0xc3, 0x4f, 0x71, 0xd5, 0x06, + 0xb6, 0xfd, 0xe6, 0x75, 0x2a, 0xd2, 0x67, 0xd5, 0xd6, 0xb9, 0x7c, 0x1f, + 0xab, 0xbf, 0xb5, 0x9a, 0x7d, 0x23, 0x2a, 0xce, 0xb5, 0x57, 0xe5, 0xc8, + 0xff, 0xe6, 0x1e, 0xf2, 0x9f, 0x55, 0xfb, 0x85, 0x0d, 0x6f, 0x63, 0x60, + 0xe7, 0x53, 0x0c, 0x3f, 0xa8, 0x92, 0x5d, 0x71, 0x03, 0x8c, 0x0e, 0xbc, + 0x8d, 0xd1, 0xaf, 0xa9, 0xfd, 0x6d, 0x9f, 0xff, 0x34, 0x9b, 0x3f, 0x75, + 0x2b, 0x85, 0x43, 0x0a, 0x9e, 0x90, 0xbd, 0x66, 0x13, 0xdb, 0x36, 0xbc, + 0x1f, 0x80, 0xcd, 0xd7, 0x6c, 0xf2, 0xea, 0x17, 0x7c, 0x5f, 0x0f, 0x9c, + 0x35, 0xbd, 0x91, 0x9e, 0x91, 0xdf, 0xa3, 0x6a, 0x7f, 0x5e, 0x82, 0xc6, + 0xc0, 0xaf, 0x04, 0x1a, 0x15, 0x07, 0x0f, 0x02, 0x18, 0x2c, 0xab, 0x59, + 0xa7, 0x6b, 0x4e, 0xfd, 0x13, 0xe6, 0x30, 0xef, 0x57, 0x12, 0x9c, 0xfa, + 0xf7, 0x1a, 0xf5, 0x97, 0x7e, 0x02, 0xff, 0xaa, 0xfc, 0x4f, 0xfd, 0xbb, + 0xb2, 0xd4, 0x4b, 0xfc, 0x4a, 0x17, 0x2f, 0xfe, 0xfb, 0x54, 0x28, 0xcd, + 0xcf, 0xeb, 0xb1, 0xb4, 0xd3, 0x4c, 0xd7, 0x65, 0xe0, 0xac, 0x2c, 0x77, + 0xea, 0x66, 0x6b, 0xf0, 0x7d, 0x5d, 0x38, 0x3c, 0x0c, 0x80, 0x5b, 0xa9, + 0x32, 0x70, 0xfd, 0x15, 0x14, 0x1e, 0xd4, 0x80, 0x87, 0x46, 0x9d, 0xd2, + 0xf1, 0x82, 0xd7, 0x3d, 0x95, 0x80, 0xbd, 0x64, 0x29, 0xa5, 0xa3, 0x79, + 0x72, 0x4b, 0x60, 0xd7, 0xff, 0x50, 0xf7, 0x46, 0xe9, 0x68, 0x9e, 0xf4, + 0x92, 0x3e, 0xd2, 0x29, 0x41, 0xc6, 0x5e, 0xca, 0xd8, 0xd8, 0x28, 0xf6, + 0x02, 0x9b, 0x1b, 0xff, 0x44, 0x6d, 0xb7, 0xdf, 0x30, 0x4c, 0x5f, 0x5f, + 0x3f, 0xe5, 0x4a, 0x89, 0xd2, 0xc9, 0x12, 0xce, 0xc3, 0x63, 0xd8, 0x17, + 0xf7, 0x41, 0x4c, 0xf7, 0xdf, 0xe7, 0x67, 0x70, 0x4e, 0x16, 0xd9, 0xf6, + 0xfb, 0x45, 0x9c, 0xc3, 0xa3, 0x0c, 0x5c, 0xb5, 0x06, 0xe7, 0x64, 0x11, + 0x7b, 0x7e, 0x06, 0xbb, 0x77, 0x11, 0x00, 0xc3, 0x23, 0x43, 0x0c, 0xac, + 0x18, 0xc4, 0x71, 0xd4, 0xef, 0x7f, 0xcb, 0xb5, 0x43, 0xd8, 0xb6, 0xfa, + 0xbd, 0x1a, 0x3f, 0xe7, 0xf0, 0xa8, 0xca, 0x6f, 0x59, 0x3f, 0xb6, 0x9d, + 0x65, 0xf8, 0xae, 0x21, 0xb6, 0xad, 0xcf, 0x92, 0x62, 0x17, 0x03, 0x6b, + 0xd7, 0xe3, 0x38, 0x05, 0x6c, 0x3b, 0x8b, 0x9d, 0xb1, 0xbd, 0xfc, 0xc8, + 0xd8, 0x0c, 0xdf, 0x35, 0xc4, 0xf0, 0x5d, 0x60, 0xdb, 0x59, 0x2f, 0x8e, + 0xe3, 0x14, 0x28, 0x1d, 0x1e, 0x25, 0xbd, 0xac, 0x3f, 0x7c, 0x8e, 0xb5, + 0xd1, 0xb8, 0x15, 0xab, 0x7b, 0x00, 0x2d, 0xe9, 0xf5, 0x61, 0xf4, 0xa6, + 0x81, 0x77, 0x6c, 0xc9, 0x94, 0xea, 0x0f, 0x1b, 0x68, 0x88, 0x09, 0x17, + 0x09, 0xa8, 0x56, 0x24, 0x56, 0x46, 0x67, 0xdc, 0x70, 0x70, 0x03, 0xdd, + 0x57, 0x03, 0xd0, 0x82, 0xc0, 0x73, 0xba, 0xe9, 0x57, 0x52, 0x6f, 0x40, + 0x5c, 0xe7, 0xb9, 0xb4, 0x07, 0x86, 0x1d, 0xff, 0xaa, 0x2f, 0x5a, 0x88, + 0x47, 0x36, 0x0a, 0xde, 0xd7, 0xcf, 0xfd, 0xf8, 0x65, 0x66, 0xa3, 0x1f, + 0xce, 0x12, 0x76, 0x25, 0xfe, 0xf8, 0x0d, 0xc8, 0xff, 0xf7, 0x3f, 0x67, + 0x15, 0xb7, 0x9d, 0x4c, 0xd7, 0xff, 0xbe, 0x69, 0x63, 0xfd, 0xf2, 0xea, + 0x57, 0xf5, 0x36, 0xd5, 0xb4, 0x35, 0xba, 0x0f, 0xf8, 0xf5, 0xda, 0xcb, + 0xfc, 0xdb, 0x34, 0x79, 0x04, 0xef, 0xeb, 0x60, 0x9f, 0xab, 0x9d, 0xac, + 0x2b, 0x05, 0xdc, 0x2d, 0x71, 0xee, 0xd2, 0x1e, 0x77, 0xf9, 0x61, 0x0e, + 0xf0, 0x8d, 0xa9, 0x2f, 0xb1, 0xe2, 0x9c, 0x4f, 0x71, 0xfc, 0xf1, 0x29, + 0x16, 0xbe, 0x5d, 0xf9, 0x6f, 0xed, 0x06, 0x8e, 0xdb, 0xf4, 0x2f, 0x74, + 0x3c, 0xa0, 0xd6, 0xb1, 0xf1, 0x00, 0x8c, 0x71, 0x81, 0x60, 0xc7, 0x5d, + 0x1b, 0xd8, 0x98, 0xdb, 0xee, 0xf9, 0x9d, 0xfd, 0x78, 0xf8, 0x39, 0x0a, + 0x0a, 0xa2, 0x65, 0x46, 0x56, 0x1c, 0x60, 0x5f, 0xb7, 0xcd, 0x96, 0x8a, + 0xc3, 0x37, 0xb4, 0xdf, 0x3d, 0x6b, 0x61, 0xcd, 0xd7, 0x14, 0x58, 0xeb, + 0x7f, 0xad, 0x54, 0x10, 0xac, 0x1f, 0xcf, 0x55, 0xb0, 0xab, 0x25, 0x53, + 0xf0, 0xe3, 0x2e, 0xf8, 0xd6, 0xb1, 0x29, 0x2e, 0x78, 0x07, 0x2c, 0x5f, + 0x0e, 0xeb, 0xd6, 0xe9, 0x84, 0xbb, 0x01, 0x32, 0xec, 0xde, 0xed, 0x97, + 0x75, 0xf0, 0xa0, 0xda, 0x5e, 0x2d, 0x15, 0x50, 0xab, 0x59, 0xcf, 0x3d, + 0x3e, 0xc5, 0x00, 0x53, 0x1c, 0x9d, 0xdb, 0x1a, 0x16, 0xec, 0xca, 0xdc, + 0xfc, 0xee, 0x2e, 0x38, 0x36, 0xc5, 0x71, 0x14, 0x50, 0xcb, 0xc0, 0xb5, + 0x3e, 0xba, 0x1d, 0x16, 0x2e, 0xea, 0x22, 0xf3, 0xc8, 0x14, 0xeb, 0xbc, + 0xc8, 0x68, 0x82, 0x4d, 0x51, 0x03, 0xb5, 0x68, 0x0f, 0xdc, 0x0a, 0xfa, + 0x1b, 0xf8, 0x56, 0x91, 0x00, 0x70, 0x4b, 0x85, 0x7f, 0xb4, 0x0b, 0xe8, + 0x52, 0xe5, 0xbc, 0x59, 0xbf, 0xab, 0x42, 0x7d, 0xae, 0x40, 0xdb, 0x2c, + 0xd7, 0xbb, 0x86, 0x9d, 0x7b, 0x6f, 0x04, 0xc0, 0xf9, 0xfc, 0x76, 0xb8, + 0xe6, 0x5a, 0xf8, 0xec, 0x36, 0x04, 0x90, 0xfd, 0xcc, 0x66, 0x1c, 0x7b, + 0x3b, 0x94, 0x15, 0x38, 0x0b, 0x80, 0xab, 0x2c, 0xfa, 0x2e, 0x49, 0x32, + 0x06, 0xec, 0xd3, 0x6f, 0xa8, 0x5c, 0x63, 0x98, 0xa1, 0x5b, 0xce, 0x67, + 0xfd, 0xd3, 0x20, 0x2f, 0xb8, 0x8e, 0x6d, 0x87, 0x41, 0x68, 0x98, 0x5a, + 0xdf, 0x65, 0x2a, 0xee, 0x9d, 0xd4, 0x95, 0xfb, 0xc1, 0x2a, 0x3b, 0xfe, + 0xf1, 0x08, 0x1b, 0xf7, 0xaa, 0xf6, 0x7a, 0x61, 0xad, 0x7a, 0xf6, 0xe4, + 0xd6, 0xda, 0x8c, 0x3d, 0x58, 0x65, 0xc3, 0x65, 0xea, 0x4a, 0x1b, 0xf7, + 0xf0, 0xef, 0x97, 0x70, 0x57, 0xd4, 0xe9, 0x5f, 0x91, 0x62, 0xf4, 0xd6, + 0x32, 0xb9, 0x05, 0x29, 0x86, 0x4a, 0xa7, 0xbf, 0xb0, 0x45, 0xdf, 0x82, + 0x24, 0xc3, 0x9a, 0x97, 0xd1, 0x0c, 0xce, 0xca, 0x65, 0xd5, 0x6f, 0x33, + 0xd7, 0x61, 0x2c, 0x63, 0x36, 0xda, 0x7a, 0x8d, 0x7a, 0x56, 0xee, 0xf9, + 0xfe, 0x0c, 0x40, 0x2d, 0x60, 0xc7, 0x55, 0xdf, 0x60, 0xe3, 0x1f, 0x5c, + 0xea, 0x97, 0x7f, 0xbd, 0x05, 0x92, 0x10, 0x50, 0x4b, 0xe8, 0xf1, 0xce, + 0xd9, 0x02, 0xb5, 0x82, 0x0a, 0xb6, 0xcd, 0x06, 0xad, 0x45, 0xa1, 0xb0, + 0xbe, 0x58, 0x1f, 0x63, 0x8d, 0x31, 0xdf, 0x23, 0x56, 0x0d, 0x41, 0x79, + 0x0a, 0xc5, 0x2f, 0x60, 0x89, 0x15, 0xa4, 0x53, 0xe1, 0x36, 0x5d, 0xd1, + 0x55, 0xf0, 0x35, 0x4b, 0x84, 0xc1, 0x5a, 0x6e, 0xa3, 0x04, 0x94, 0xb0, + 0x62, 0x4b, 0xb5, 0x4f, 0x49, 0xc7, 0xbf, 0x93, 0xb0, 0x4a, 0x98, 0xc6, + 0xb3, 0x95, 0x58, 0x8d, 0x5b, 0xd3, 0x30, 0xdd, 0x58, 0x0a, 0x57, 0x3a, + 0x2a, 0xbc, 0xb1, 0x03, 0x80, 0x7d, 0xc7, 0x6f, 0x04, 0x3e, 0x07, 0xa0, + 0xc1, 0x5a, 0x00, 0xb7, 0xe8, 0xed, 0x4d, 0xc0, 0x0a, 0x0d, 0xfa, 0x0a, + 0x97, 0x60, 0xe0, 0x06, 0x0a, 0xdd, 0x30, 0xfb, 0x6b, 0xd9, 0x0c, 0xba, + 0x02, 0x42, 0xc0, 0xac, 0x99, 0xc2, 0x5f, 0x55, 0x39, 0xb5, 0xe9, 0xf3, + 0x69, 0x07, 0xd4, 0x0a, 0x6a, 0xd0, 0x5a, 0xc4, 0xae, 0x59, 0x3e, 0xc3, + 0xdb, 0x29, 0x03, 0x1c, 0x0c, 0xb8, 0x8b, 0x7a, 0x6b, 0xfc, 0x3b, 0xf9, + 0x05, 0xd3, 0x2c, 0xd7, 0xfb, 0x5f, 0xfb, 0x1a, 0x7c, 0x11, 0xf8, 0x43, + 0x3a, 0x43, 0xb2, 0x66, 0xe3, 0x77, 0x3a, 0xe1, 0xa7, 0x93, 0xe6, 0xef, + 0xde, 0x0f, 0xff, 0xed, 0xc9, 0x09, 0xf8, 0x7f, 0xa0, 0x77, 0x02, 0xfe, + 0x70, 0x39, 0x7c, 0xf1, 0xe0, 0xab, 0xcf, 0x37, 0xa8, 0xd9, 0x00, 0xb5, + 0x5e, 0xa9, 0x66, 0x1a, 0x37, 0x7b, 0x35, 0x32, 0x8b, 0x1d, 0xcc, 0x3e, + 0x3e, 0x18, 0x60, 0x93, 0x91, 0x65, 0xa5, 0x70, 0xdd, 0x32, 0xc1, 0x5e, + 0x89, 0xeb, 0xba, 0x6d, 0xc1, 0x52, 0x22, 0x61, 0x21, 0x34, 0x44, 0xc6, + 0x00, 0xb7, 0x54, 0x5a, 0xa5, 0x60, 0x7c, 0x11, 0x03, 0x12, 0x29, 0x44, + 0x43, 0xb6, 0x84, 0x05, 0xef, 0xf3, 0xa0, 0xbf, 0x65, 0x59, 0x6a, 0x5f, + 0x03, 0xb5, 0x5e, 0x4f, 0x88, 0x56, 0x3b, 0xbd, 0xda, 0xf2, 0x82, 0xe3, + 0x66, 0xc1, 0xef, 0x5c, 0x49, 0x04, 0x85, 0x58, 0xfb, 0x1e, 0x65, 0xb5, + 0x21, 0x49, 0xc6, 0x04, 0xf5, 0x86, 0x44, 0xc4, 0x24, 0xf1, 0x86, 0xa0, + 0x1e, 0x53, 0xe7, 0xd7, 0x6d, 0x04, 0xfa, 0x79, 0x0d, 0x81, 0x8c, 0x81, + 0x83, 0x3f, 0xe6, 0xa1, 0xc6, 0xf1, 0xe3, 0xa4, 0x1a, 0xe0, 0xc6, 0xbc, + 0x2f, 0x6f, 0x00, 0x08, 0xe2, 0xe4, 0x01, 0x41, 0x1d, 0x2b, 0xa1, 0x9e, + 0xb3, 0xdb, 0x1b, 0x78, 0xdf, 0x56, 0x8d, 0x0c, 0x67, 0xa7, 0xa4, 0x99, + 0x39, 0x06, 0xe4, 0x65, 0x9e, 0xd5, 0xb2, 0x01, 0x79, 0x53, 0x0b, 0x0d, + 0x62, 0x94, 0x0d, 0xbc, 0x9f, 0x4b, 0x0a, 0x05, 0xae, 0x12, 0x28, 0x98, + 0x96, 0xaf, 0xf0, 0x38, 0x9b, 0xd4, 0xa0, 0x2e, 0x87, 0xa6, 0x67, 0x63, + 0x03, 0xac, 0x58, 0x1c, 0xa9, 0xe3, 0x4b, 0x14, 0xf8, 0x2a, 0x8f, 0xc0, + 0xd2, 0xbf, 0x14, 0xb3, 0x78, 0xd5, 0xf0, 0xb7, 0x87, 0xbc, 0xdf, 0x5d, + 0x6e, 0x49, 0x8e, 0x81, 0x15, 0xaa, 0x3d, 0xb2, 0xe7, 0x89, 0x02, 0x10, + 0xf7, 0xe0, 0xc6, 0xc1, 0xba, 0x48, 0x01, 0x63, 0x35, 0x30, 0xb0, 0xad, + 0x3a, 0x75, 0xe2, 0x15, 0xbc, 0xf3, 0x26, 0x63, 0x78, 0x65, 0x8b, 0x98, + 0xae, 0x40, 0x4c, 0xfd, 0x46, 0x57, 0xd7, 0x04, 0x16, 0x30, 0x12, 0x83, + 0x63, 0xcd, 0xcf, 0xf2, 0xc0, 0x77, 0x2e, 0x3e, 0xec, 0x7b, 0x4f, 0x95, + 0x9e, 0x85, 0xa6, 0x61, 0xa9, 0xc5, 0xe7, 0xae, 0xe0, 0x09, 0x4e, 0x6f, + 0x85, 0x89, 0xb3, 0xb9, 0x80, 0x29, 0x9e, 0x0d, 0xf9, 0xcd, 0x2d, 0x25, + 0xe8, 0x4a, 0x9f, 0xc3, 0x89, 0x13, 0x27, 0x98, 0xf7, 0xd6, 0x5a, 0x87, + 0x94, 0xb0, 0xac, 0x3f, 0xc7, 0xe1, 0x51, 0xf5, 0x8e, 0x5a, 0x96, 0x9b, + 0xef, 0x41, 0xb5, 0xcc, 0xfe, 0xe1, 0xfc, 0xc9, 0x4e, 0x49, 0x4f, 0x5b, + 0x41, 0x88, 0xd6, 0xe9, 0x00, 0xb5, 0x7e, 0x16, 0x00, 0xae, 0xb3, 0xb9, + 0x80, 0xb9, 0xe9, 0x67, 0x79, 0x34, 0xed, 0x9f, 0x3b, 0x73, 0x4e, 0x4f, + 0xfd, 0xca, 0x09, 0x0f, 0x86, 0xd6, 0xc5, 0x39, 0x3a, 0x54, 0xf7, 0x8b, + 0x3f, 0x0c, 0x6c, 0x50, 0xce, 0xe0, 0x33, 0xfc, 0xfe, 0x9d, 0x9b, 0x19, + 0x3d, 0x38, 0x46, 0xff, 0xf2, 0x3e, 0xec, 0x6c, 0x96, 0x23, 0x23, 0x79, + 0x96, 0xae, 0xc8, 0x71, 0xff, 0xdf, 0xdc, 0xc9, 0xd2, 0xe5, 0x7d, 0x1c, + 0x39, 0x38, 0x86, 0xfd, 0xa1, 0x41, 0x96, 0xae, 0xc8, 0x71, 0x64, 0x24, + 0x4f, 0x32, 0x25, 0x38, 0x72, 0x78, 0x8c, 0xa5, 0xcb, 0xfa, 0x38, 0x72, + 0x78, 0x8c, 0x54, 0x6f, 0x8e, 0xc1, 0xb5, 0xd7, 0x72, 0xa4, 0x27, 0x1c, + 0x66, 0x67, 0x33, 0x1c, 0x19, 0xc9, 0x33, 0x70, 0x59, 0x8e, 0xfb, 0xef, + 0xda, 0x47, 0xff, 0xc5, 0x39, 0x44, 0xad, 0xc0, 0xd2, 0x0b, 0x2d, 0xec, + 0x6c, 0x16, 0xa7, 0x50, 0xe0, 0xc6, 0x3b, 0xee, 0x27, 0x9b, 0xcd, 0xc2, + 0xf7, 0x0a, 0xf4, 0x5f, 0x66, 0x33, 0xea, 0x0a, 0x38, 0xae, 0x16, 0xd6, + 0xc8, 0x3f, 0x91, 0xc7, 0xae, 0x80, 0xb5, 0x42, 0x2f, 0xf8, 0xe4, 0x56, + 0xc9, 0xa1, 0xda, 0x94, 0xf1, 0x84, 0x02, 0x70, 0x19, 0x25, 0x2d, 0xf5, + 0x8d, 0xd4, 0x2d, 0x05, 0x9e, 0x0b, 0x4d, 0x8f, 0xaa, 0xfe, 0x25, 0xfd, + 0x38, 0xe5, 0x52, 0xf3, 0x2d, 0x1d, 0xfe, 0x8e, 0x18, 0x78, 0xbe, 0x35, + 0x43, 0x10, 0x45, 0x0d, 0xac, 0x84, 0x85, 0x5b, 0x73, 0xb1, 0x02, 0xdf, + 0x6e, 0x0d, 0x50, 0xab, 0xd9, 0xdd, 0x9c, 0x9f, 0x17, 0xde, 0x34, 0x37, + 0xa6, 0xda, 0xa8, 0x22, 0x2b, 0x2e, 0xe9, 0x94, 0x0d, 0x31, 0x49, 0xee, + 0x9d, 0x59, 0x4a, 0x15, 0xbf, 0x2d, 0x1f, 0x4f, 0x08, 0xe2, 0xa8, 0x05, + 0x94, 0xe4, 0x94, 0x7f, 0x2c, 0xa3, 0xc7, 0x47, 0xfd, 0xe3, 0x4f, 0x08, + 0xaa, 0xb5, 0x36, 0x63, 0x29, 0x81, 0x7b, 0x5a, 0xf4, 0x05, 0xfa, 0x1e, + 0x1a, 0x20, 0x35, 0x9a, 0x1f, 0xe6, 0x7f, 0x4f, 0x5e, 0xc5, 0xdf, 0x73, + 0x2b, 0x00, 0x7f, 0xcf, 0xad, 0x7c, 0x84, 0x4f, 0x33, 0x3e, 0xfe, 0x34, + 0x37, 0xb1, 0x99, 0x0b, 0xb1, 0xd8, 0x3a, 0xfe, 0x71, 0x05, 0xdc, 0xba, + 0xe0, 0x51, 0x9c, 0xc5, 0x25, 0x82, 0xa3, 0x4b, 0x06, 0xcc, 0xb5, 0x6b, + 0x72, 0x67, 0x0b, 0x54, 0xca, 0xbe, 0x26, 0x4b, 0xe9, 0x78, 0x09, 0x4a, + 0x0a, 0x0a, 0x05, 0xd0, 0x93, 0xea, 0xf5, 0x00, 0x5a, 0x7d, 0xef, 0x55, + 0x9d, 0x75, 0x03, 0xd8, 0xea, 0x49, 0xf5, 0xf2, 0xcc, 0xf8, 0x49, 0xce, + 0x5f, 0x30, 0x9f, 0xfc, 0x53, 0x0e, 0xb2, 0x57, 0x3d, 0xef, 0x4d, 0x9e, + 0xf6, 0x65, 0x36, 0xce, 0x98, 0x1b, 0x82, 0x5e, 0x99, 0xb2, 0x9a, 0x25, + 0x27, 0x25, 0xe7, 0x2d, 0x57, 0x5f, 0x18, 0x1f, 0xf9, 0xce, 0xe3, 0x5c, + 0xb0, 0xf4, 0x32, 0x9e, 0x3e, 0xf2, 0x1c, 0x17, 0x2c, 0x7d, 0x0b, 0x8f, + 0x7c, 0xe7, 0x71, 0xde, 0xfd, 0x5e, 0x05, 0xd6, 0x82, 0x26, 0x00, 0x98, + 0x39, 0x4f, 0x27, 0x15, 0x24, 0x2c, 0x9b, 0xc8, 0xe2, 0xf4, 0xe8, 0x6b, + 0x31, 0x5f, 0x9f, 0xdf, 0x93, 0xd2, 0x8b, 0x27, 0x8d, 0xff, 0xc9, 0xa6, + 0x36, 0x86, 0x81, 0x73, 0xcd, 0x17, 0xe4, 0x0f, 0x7f, 0x97, 0xb3, 0xce, + 0xb0, 0x39, 0x39, 0x75, 0x98, 0x37, 0x9f, 0x79, 0x2e, 0xf9, 0xa7, 0x54, + 0x7e, 0x67, 0x9d, 0x61, 0xf3, 0xcc, 0xf8, 0x49, 0x9e, 0xff, 0x89, 0xbf, + 0x9f, 0x7f, 0x4a, 0xc5, 0x7d, 0xfe, 0x27, 0x4e, 0x08, 0xac, 0x95, 0x7f, + 0xea, 0xbb, 0x00, 0x01, 0x7f, 0xfd, 0x4c, 0x0d, 0xdc, 0xd3, 0x91, 0x22, + 0x45, 0x8a, 0x14, 0x29, 0x52, 0xa4, 0x48, 0x91, 0x22, 0x45, 0x8a, 0x14, + 0x29, 0x52, 0xa4, 0x48, 0x91, 0x22, 0x45, 0x8a, 0x14, 0x29, 0x52, 0xa4, + 0x48, 0x91, 0x22, 0x45, 0x8a, 0x14, 0x69, 0xf6, 0xfa, 0x45, 0xc3, 0x5a, + 0x44, 0x8a, 0x14, 0x29, 0x52, 0xa4, 0x48, 0xbf, 0x3c, 0xba, 0x0f, 0xe2, + 0x57, 0xaa, 0x69, 0x68, 0xa9, 0x54, 0xab, 0x91, 0xfc, 0x6c, 0x24, 0xf4, + 0xc4, 0xbc, 0x6a, 0xa5, 0x15, 0xc0, 0x93, 0xe9, 0xc9, 0x4c, 0x9b, 0xd6, + 0x99, 0xf4, 0x27, 0xe7, 0x95, 0xf4, 0x6a, 0xee, 0xc1, 0x49, 0xd7, 0x4e, + 0x51, 0x85, 0x1b, 0xb0, 0x56, 0xb5, 0x52, 0x25, 0xd9, 0x9d, 0x24, 0xd9, + 0xad, 0xc0, 0x5a, 0x65, 0x0d, 0x6c, 0x08, 0xae, 0x80, 0x6c, 0xf2, 0xb5, + 0x7b, 0xfc, 0x49, 0x5f, 0x6e, 0x60, 0xe5, 0xf9, 0x7d, 0xc0, 0x63, 0x17, + 0xc2, 0x3b, 0x9e, 0x24, 0xa4, 0x6c, 0xef, 0xec, 0x0c, 0xa0, 0x7f, 0x56, + 0x4a, 0x26, 0x92, 0x94, 0x9b, 0x90, 0x4f, 0x9d, 0xea, 0xec, 0x50, 0x27, + 0x4e, 0x7f, 0xc8, 0xb2, 0xf2, 0xd8, 0x41, 0x97, 0x45, 0xda, 0x04, 0xcf, + 0xac, 0x0c, 0xef, 0x43, 0x00, 0x80, 0x46, 0x9c, 0xb4, 0x3e, 0x67, 0x06, + 0xa8, 0xe5, 0x95, 0xdd, 0x9d, 0xa1, 0x34, 0xe1, 0x20, 0x12, 0x7a, 0x75, + 0x6d, 0x03, 0xd7, 0x12, 0xca, 0xdc, 0x58, 0xd6, 0x24, 0xe9, 0x22, 0xd4, + 0x63, 0x1a, 0x7c, 0xa5, 0x61, 0x5a, 0xc2, 0x12, 0x88, 0x49, 0x89, 0xac, + 0xb9, 0x48, 0x0d, 0xf8, 0xb1, 0x26, 0xf4, 0xc4, 0x46, 0x73, 0x0c, 0x58, + 0x54, 0x8b, 0x2e, 0x65, 0xd3, 0x22, 0x74, 0x25, 0xa9, 0x86, 0xc0, 0x95, + 0x2e, 0x88, 0x14, 0x56, 0x4d, 0xc2, 0x84, 0x8b, 0xdb, 0x6b, 0x91, 0x4e, + 0x09, 0x5c, 0x01, 0x29, 0xb3, 0x72, 0x73, 0xb7, 0x20, 0x55, 0x01, 0x26, + 0x25, 0xe5, 0x98, 0xc4, 0xad, 0x48, 0x44, 0x05, 0x64, 0xaf, 0x40, 0x1c, + 0x77, 0x91, 0x0b, 0x85, 0x32, 0xc2, 0x2a, 0xab, 0xc9, 0xa2, 0x76, 0xb7, + 0x45, 0xc1, 0x82, 0x54, 0x31, 0x3c, 0xc9, 0x30, 0x55, 0x94, 0x94, 0x63, + 0x0a, 0x08, 0x46, 0x4c, 0x60, 0x49, 0x60, 0x42, 0xe2, 0xf6, 0x5a, 0x88, + 0x49, 0x17, 0x8e, 0x4b, 0xe8, 0x81, 0xaa, 0x2b, 0x89, 0x67, 0x74, 0x99, + 0x28, 0xb8, 0x96, 0xeb, 0x82, 0x38, 0xea, 0x83, 0xbc, 0xe2, 0x80, 0x98, + 0x90, 0xd8, 0x3d, 0x82, 0x23, 0xdd, 0x82, 0x74, 0x0c, 0x4a, 0x15, 0x49, + 0x5a, 0xaf, 0x1e, 0x4b, 0x42, 0xf9, 0xb9, 0xdf, 0x2f, 0x51, 0xbf, 0x28, + 0x0d, 0x48, 0x92, 0x47, 0x5d, 0x1f, 0xa6, 0xd5, 0x23, 0x58, 0x2a, 0x05, + 0x54, 0xe0, 0x48, 0x4d, 0x9d, 0xdf, 0x74, 0x19, 0x05, 0xe3, 0x12, 0x6a, + 0x12, 0xab, 0x98, 0x90, 0x7a, 0x46, 0xbe, 0x4e, 0xf3, 0x05, 0x9b, 0x63, + 0x07, 0x03, 0xd7, 0x2c, 0x70, 0x5f, 0x03, 0x58, 0x89, 0x38, 0xe5, 0x8a, + 0x43, 0xaa, 0xdb, 0xf6, 0x01, 0x5b, 0x0d, 0x74, 0x2b, 0xdc, 0x37, 0x19, + 0x97, 0xb5, 0xaa, 0x07, 0xd3, 0x6a, 0x86, 0x6c, 0x19, 0x4d, 0x07, 0xd4, + 0x32, 0xc0, 0xad, 0x66, 0xf0, 0x96, 0x5b, 0x73, 0x3c, 0xb0, 0x56, 0x33, + 0x28, 0xab, 0x13, 0x3c, 0xab, 0x9d, 0x9f, 0x9f, 0xc6, 0xa2, 0x5c, 0x6e, + 0xad, 0x87, 0x81, 0x48, 0x4d, 0x07, 0x41, 0x9a, 0x6d, 0x9a, 0xe9, 0xf2, + 0x7a, 0xb5, 0xe9, 0x4f, 0xb7, 0x2e, 0x41, 0x03, 0x9d, 0xe9, 0xee, 0x6b, + 0x00, 0xb7, 0xea, 0x92, 0xed, 0x49, 0x51, 0x28, 0xbb, 0xed, 0xa1, 0x05, + 0x6d, 0x0d, 0x84, 0x24, 0x49, 0x91, 0xa6, 0x24, 0xab, 0x2d, 0xab, 0x0b, + 0x77, 0x92, 0x35, 0xcf, 0xc2, 0xad, 0xba, 0x21, 0xa8, 0x56, 0x5f, 0x5f, + 0x8e, 0xfc, 0x51, 0x65, 0xa1, 0xe9, 0x4e, 0xb9, 0x50, 0x31, 0x90, 0x16, + 0x01, 0xb2, 0x8e, 0x9c, 0x2c, 0x79, 0x46, 0xeb, 0xe6, 0x78, 0x0d, 0x98, + 0x6a, 0x36, 0xf0, 0xab, 0x4e, 0x71, 0xa6, 0x83, 0x65, 0xcd, 0x06, 0x74, + 0x15, 0x0c, 0x9b, 0xe9, 0x7a, 0x77, 0xca, 0x6b, 0x56, 0xe5, 0x04, 0xce, + 0xbd, 0x0c, 0x40, 0xc4, 0xa4, 0xeb, 0x86, 0x20, 0x5b, 0x9e, 0x9a, 0xee, + 0xeb, 0xc2, 0x77, 0x9f, 0x27, 0xcb, 0x02, 0x00, 0x16, 0xf4, 0x4e, 0x87, + 0xc2, 0xf2, 0x35, 0x9d, 0xc9, 0x7f, 0x6f, 0x1b, 0x77, 0x18, 0x32, 0x35, + 0x3d, 0x70, 0xeb, 0x8b, 0xb4, 0x37, 0x12, 0x9c, 0x49, 0xfb, 0x27, 0x7c, + 0x0b, 0xbb, 0xfd, 0xfb, 0xf7, 0x87, 0x8e, 0x25, 0x68, 0xa0, 0xd7, 0xc9, + 0x0e, 0xaf, 0x77, 0x9a, 0xb0, 0xe9, 0x34, 0x5d, 0xba, 0x76, 0xe0, 0xad, + 0xe0, 0xb9, 0x30, 0x7e, 0xc1, 0xf3, 0x71, 0x00, 0x34, 0x52, 0x2b, 0x5c, + 0x46, 0x73, 0x7e, 0x0b, 0xe6, 0xc0, 0x27, 0x6f, 0x83, 0x8d, 0xb7, 0xf5, + 0xd2, 0x3b, 0x31, 0x41, 0x73, 0x69, 0x17, 0x00, 0xec, 0x5c, 0x40, 0xe1, + 0xbb, 0xcf, 0x7b, 0x7e, 0xc7, 0x8e, 0xc3, 0xa2, 0x4b, 0xc2, 0x2b, 0x42, + 0x7f, 0x63, 0xf4, 0x31, 0xae, 0x38, 0xe4, 0xef, 0xbf, 0xaf, 0xff, 0x1d, + 0x7c, 0x63, 0xf4, 0x31, 0xc6, 0xfe, 0xe4, 0x3a, 0x44, 0x0c, 0xb6, 0x1c, + 0xcc, 0xb3, 0x75, 0xb9, 0x32, 0xf2, 0xd8, 0x72, 0xf0, 0xf4, 0x8d, 0x5b, + 0xb7, 0x2c, 0xcb, 0xcd, 0x2a, 0x1f, 0x5b, 0xb7, 0xb5, 0xf2, 0x93, 0x2e, + 0x76, 0xc2, 0xe2, 0xff, 0x67, 0xef, 0xfd, 0xc3, 0xe4, 0x28, 0xee, 0x7b, + 0xdd, 0x97, 0x93, 0x31, 0xae, 0xc9, 0xb3, 0xb2, 0x7b, 0xc8, 0xc2, 0xfb, + 0x21, 0xe4, 0x00, 0x00, 0x20, 0x00, 0x49, 0x44, 0x41, 0x54, 0x2a, 0xe9, + 0x86, 0xdd, 0xdc, 0x69, 0x7b, 0xd7, 0x68, 0x64, 0x70, 0x18, 0x5d, 0xb8, + 0x66, 0xd7, 0x92, 0x2d, 0xad, 0xed, 0x44, 0x92, 0xed, 0x3c, 0xb0, 0x58, + 0x4e, 0x10, 0x26, 0x01, 0x04, 0x39, 0x37, 0x92, 0xcc, 0xb1, 0x23, 0xe1, + 0x3c, 0x39, 0x88, 0x63, 0xd9, 0x12, 0xf1, 0xb9, 0x01, 0xc5, 0x24, 0x96, + 0x94, 0xdc, 0x8b, 0x25, 0x48, 0xb0, 0x84, 0x1d, 0x22, 0x99, 0x9b, 0xc4, + 0x92, 0x4e, 0x70, 0x46, 0xb2, 0x25, 0xef, 0x92, 0x40, 0x34, 0x38, 0x10, + 0x8d, 0xf0, 0x6e, 0xd2, 0x63, 0x6b, 0xa1, 0xfb, 0x46, 0x7b, 0x3c, 0x0d, + 0xda, 0x64, 0xca, 0x78, 0xce, 0xe5, 0xfe, 0x51, 0xfd, 0xa3, 0xba, 0x67, + 0x66, 0x77, 0x25, 0x83, 0xed, 0xdc, 0xd3, 0x9f, 0xe7, 0xd9, 0xed, 0xee, + 0xea, 0xaa, 0x6f, 0x55, 0x77, 0x4f, 0xd7, 0xcf, 0xae, 0xb7, 0x46, 0x07, + 0x4c, 0x0e, 0x4e, 0x7a, 0x8c, 0xf4, 0x9a, 0x38, 0x33, 0xca, 0x0d, 0x88, + 0xdc, 0x2a, 0xd3, 0x5e, 0xe4, 0x67, 0x36, 0xe9, 0x71, 0x6e, 0x5f, 0x5e, + 0x46, 0xb6, 0x60, 0xfb, 0x89, 0x64, 0xfc, 0xf3, 0x4d, 0xe3, 0x85, 0x5e, + 0xdb, 0xdc, 0x9a, 0x1d, 0x18, 0x35, 0x2f, 0x2d, 0xb3, 0xe3, 0xd5, 0xda, + 0x81, 0x53, 0x5e, 0x93, 0xc5, 0x57, 0x2e, 0xee, 0xee, 0xff, 0x7c, 0x54, + 0xd7, 0xca, 0xcd, 0x4f, 0xaf, 0x9b, 0xd3, 0xbb, 0xb5, 0xcc, 0xc0, 0x3d, + 0x3e, 0x3b, 0xa4, 0x72, 0xc7, 0xe3, 0x45, 0xf8, 0x10, 0x30, 0x59, 0xfb, + 0xe1, 0xd2, 0x76, 0x3e, 0x9a, 0xd4, 0xae, 0x63, 0xdf, 0xf6, 0xae, 0xde, + 0x4a, 0x45, 0x8b, 0x4d, 0xbf, 0x23, 0xd8, 0xf1, 0xd9, 0xce, 0x79, 0xee, + 0x7b, 0x7f, 0xf1, 0x20, 0xab, 0x57, 0xac, 0xe6, 0x0b, 0xff, 0xa7, 0x3d, + 0xab, 0x9f, 0xf1, 0x13, 0x5b, 0xd8, 0xf1, 0xd9, 0xb9, 0xfd, 0x75, 0xb3, + 0x15, 0xd6, 0xa5, 0x3f, 0xf0, 0xcb, 0x87, 0x22, 0x3f, 0x9b, 0xff, 0x12, + 0xb8, 0x72, 0x31, 0xa7, 0xbc, 0xf8, 0x37, 0x93, 0x2e, 0xaf, 0x7f, 0x28, + 0x05, 0x71, 0xee, 0xf8, 0xdc, 0x9e, 0x8e, 0xa7, 0x0f, 0x3e, 0xaa, 0x26, + 0xe8, 0xcf, 0x05, 0xce, 0xea, 0xb6, 0x9f, 0x06, 0x6a, 0xbd, 0xeb, 0x3f, + 0x8e, 0xf3, 0x57, 0xd7, 0x15, 0x29, 0xac, 0xb2, 0x68, 0x1c, 0x76, 0x29, + 0xac, 0xb2, 0x22, 0xf7, 0x6d, 0x01, 0x54, 0xcb, 0x18, 0xb0, 0x90, 0x1a, + 0x60, 0x4e, 0xb7, 0xa5, 0xdb, 0xc7, 0x9f, 0x3d, 0x2f, 0x98, 0x2d, 0xae, + 0x2f, 0x5e, 0x1f, 0x5e, 0x7f, 0x7c, 0x5f, 0x15, 0x58, 0xeb, 0x0b, 0xc8, + 0x47, 0x77, 0x75, 0xb5, 0x99, 0x06, 0x6b, 0xa5, 0x95, 0x06, 0x6b, 0xa5, + 0x95, 0x06, 0x6b, 0x45, 0xee, 0x1b, 0x3e, 0x88, 0x61, 0x9a, 0x6d, 0xe5, + 0x75, 0xe5, 0xa5, 0x1a, 0x0c, 0xfe, 0xf0, 0xed, 0xca, 0xf3, 0x9d, 0x86, + 0xac, 0x83, 0xa7, 0x5e, 0x43, 0x5c, 0x5f, 0x9b, 0x2e, 0xe6, 0x55, 0x5e, + 0xfa, 0xd7, 0x73, 0x5c, 0x8c, 0x02, 0x6c, 0xcd, 0xbc, 0xf2, 0x4a, 0xe2, + 0x5c, 0x1a, 0xa8, 0x05, 0x3f, 0xb9, 0xd7, 0x72, 0xbe, 0xfa, 0x6f, 0x83, + 0xc1, 0xf3, 0x0d, 0xa4, 0x97, 0xd7, 0x77, 0xef, 0x18, 0x65, 0xef, 0x83, + 0x35, 0x40, 0x32, 0x32, 0x20, 0x80, 0xc5, 0x94, 0xae, 0x5c, 0x4c, 0xed, + 0xd9, 0x53, 0x58, 0x8b, 0x4a, 0x11, 0x20, 0x0a, 0x88, 0x26, 0x30, 0x2b, + 0x90, 0x96, 0x7a, 0x89, 0xd4, 0x56, 0x62, 0x5a, 0x25, 0x30, 0x61, 0xdb, + 0x7f, 0x29, 0x93, 0xef, 0xc9, 0xb3, 0xf9, 0x93, 0x0e, 0x1b, 0xee, 0xb0, + 0x00, 0x8b, 0x03, 0x55, 0x30, 0xb1, 0x70, 0xcf, 0xb8, 0x0a, 0xa8, 0x05, + 0xd0, 0x6a, 0xe2, 0x3c, 0x39, 0x8e, 0x03, 0xd8, 0x4b, 0xd5, 0x64, 0x68, + 0x7b, 0xe9, 0x30, 0xce, 0x99, 0xba, 0xb2, 0xdb, 0x67, 0x43, 0x00, 0x81, + 0x1c, 0xb9, 0x71, 0x05, 0x95, 0x47, 0xd5, 0xef, 0xf8, 0xee, 0xbb, 0x4c, + 0x9c, 0x9c, 0xc9, 0xf8, 0x71, 0x58, 0x3b, 0x04, 0xb7, 0xaf, 0xaf, 0x45, + 0x61, 0x41, 0xc1, 0xb5, 0x42, 0xc0, 0xd6, 0xd0, 0x52, 0x80, 0xe1, 0x18, + 0xa8, 0xb5, 0x5c, 0x5d, 0xf3, 0xbe, 0xbd, 0xab, 0xb9, 0xe9, 0x36, 0x65, + 0x6f, 0xe4, 0xd6, 0xd5, 0x8c, 0x2c, 0x83, 0x4a, 0x50, 0x57, 0x09, 0x21, + 0x5d, 0xd6, 0xd2, 0xe1, 0xc8, 0x4e, 0xac, 0x61, 0xec, 0x7e, 0x07, 0x99, + 0xeb, 0xf0, 0x74, 0x83, 0xa6, 0x88, 0x90, 0x1a, 0x38, 0xcb, 0xeb, 0xfc, + 0x0b, 0xf2, 0xce, 0x08, 0x4a, 0x43, 0x82, 0x26, 0x16, 0xb4, 0x1c, 0x86, + 0x8b, 0x31, 0xd8, 0xc0, 0x99, 0x16, 0xd8, 0xbd, 0x1d, 0xc2, 0x45, 0x6d, + 0xe0, 0x58, 0x0d, 0x24, 0xa2, 0x25, 0x00, 0x81, 0xeb, 0xe5, 0x15, 0x94, + 0x29, 0x55, 0x5e, 0xa7, 0xdf, 0x6b, 0xf1, 0x9f, 0xfe, 0x43, 0xc2, 0xc6, + 0x77, 0x3d, 0xf8, 0xf9, 0x54, 0x77, 0xda, 0xf9, 0x60, 0xb2, 0x2e, 0x1c, + 0xa9, 0x15, 0xeb, 0x06, 0xe0, 0x0d, 0x97, 0xbf, 0xca, 0x1f, 0x3c, 0xf9, + 0x1a, 0x18, 0xfb, 0x77, 0xa4, 0xcb, 0x81, 0xff, 0x8e, 0x82, 0xa3, 0xeb, + 0x8f, 0x60, 0xbe, 0xbd, 0x9b, 0xe9, 0xf7, 0x5a, 0x6f, 0x73, 0x75, 0xd2, + 0xe2, 0x41, 0x83, 0x2d, 0x78, 0xd8, 0x28, 0xb0, 0x55, 0x28, 0x1b, 0xa8, + 0x00, 0xee, 0x54, 0x0d, 0x50, 0xf9, 0xe0, 0xbf, 0x7d, 0x0b, 0x2a, 0x78, + 0x90, 0x2a, 0xff, 0x4f, 0x4d, 0xf8, 0x2c, 0x1e, 0x34, 0x22, 0xb0, 0x96, + 0xe7, 0x48, 0xf6, 0x3f, 0xb6, 0x2f, 0xe1, 0xa7, 0xdc, 0xe1, 0xe7, 0xeb, + 0x68, 0x96, 0x6c, 0xe0, 0x57, 0xdf, 0x3a, 0xcd, 0x76, 0x6c, 0xca, 0xda, + 0xa4, 0xe7, 0x7b, 0xcf, 0x41, 0x7e, 0x0d, 0x9c, 0x0a, 0xe6, 0xf8, 0xff, + 0xfe, 0x9b, 0x61, 0xfb, 0x34, 0xd1, 0xbb, 0xf5, 0x8b, 0x8b, 0x17, 0x50, + 0x0f, 0xd2, 0xf7, 0xf0, 0xc3, 0x01, 0x58, 0xeb, 0x16, 0x80, 0x7a, 0x00, + 0xd9, 0x2a, 0x02, 0xca, 0xfd, 0x96, 0x5b, 0xe0, 0x8b, 0x02, 0x7e, 0xba, + 0xeb, 0xdd, 0x80, 0xab, 0x7e, 0xa0, 0xb6, 0xdf, 0x7b, 0x83, 0xb2, 0x0d, + 0x11, 0x8b, 0x8e, 0x70, 0x2e, 0xf5, 0xa2, 0xc5, 0x0a, 0xac, 0xf5, 0x5d, + 0x02, 0xd0, 0x55, 0xa0, 0xa5, 0x17, 0x9d, 0x0b, 0x19, 0xf1, 0xed, 0x00, + 0xad, 0x7a, 0x90, 0x94, 0xad, 0xa9, 0xbf, 0x4e, 0x7e, 0xb7, 0x6a, 0x7e, + 0x43, 0xc8, 0x16, 0x0a, 0xe0, 0xa5, 0xc7, 0xd7, 0xd6, 0xe6, 0xd2, 0xea, + 0x66, 0x7b, 0xa6, 0x3e, 0xc0, 0xf0, 0x35, 0x37, 0x51, 0xf9, 0xdc, 0x0e, + 0x6c, 0xe0, 0xe8, 0xf1, 0xa3, 0x44, 0xa5, 0xfe, 0x67, 0xef, 0xa5, 0xb4, + 0x42, 0xbd, 0xff, 0xe5, 0xa1, 0x3c, 0xd5, 0xf1, 0xce, 0x6d, 0x82, 0x3d, + 0x0f, 0xed, 0x89, 0xd8, 0x0f, 0xe1, 0x73, 0x9a, 0x0d, 0x7b, 0xb5, 0xf1, + 0xd1, 0x91, 0x08, 0xb0, 0x35, 0x97, 0xf2, 0x6b, 0xd4, 0x03, 0x1c, 0x7a, + 0xbf, 0xea, 0x7f, 0x39, 0x8a, 0x03, 0x2e, 0x0c, 0xdf, 0x65, 0x62, 0x1c, + 0xcd, 0x53, 0x9d, 0xf0, 0x18, 0xbe, 0x4b, 0x01, 0xb7, 0xe6, 0x23, 0x37, + 0xe8, 0xbf, 0x3f, 0xf4, 0xb4, 0xc3, 0xea, 0xab, 0x6d, 0xdc, 0xe9, 0x06, + 0xd5, 0x9a, 0x0a, 0x5b, 0xed, 0x11, 0xac, 0xee, 0x2d, 0x50, 0x9d, 0xf0, + 0xf8, 0xe2, 0x9f, 0xfd, 0x3d, 0x00, 0x1f, 0xfd, 0xc8, 0xdc, 0x30, 0x67, + 0x11, 0xd4, 0x4f, 0x4f, 0x4e, 0xcc, 0x2b, 0x09, 0x09, 0xa0, 0x56, 0xa8, + 0xea, 0x83, 0x01, 0x78, 0x7c, 0xaa, 0xed, 0xd4, 0xf9, 0x29, 0x55, 0x37, + 0x3b, 0xe4, 0x9f, 0x82, 0x41, 0xd5, 0xe6, 0x2a, 0xe7, 0xca, 0x88, 0xd6, + 0x30, 0x43, 0x39, 0xa8, 0x21, 0x29, 0x18, 0x06, 0xde, 0x54, 0x01, 0x95, + 0x8b, 0x14, 0x09, 0xc8, 0x6e, 0x91, 0x7c, 0xe9, 0x62, 0x08, 0x8b, 0xa2, + 0xb1, 0x56, 0xf5, 0x53, 0x03, 0xbe, 0x3c, 0x94, 0x38, 0x36, 0x72, 0x16, + 0x7e, 0x50, 0xb6, 0x17, 0x7a, 0x0b, 0xd4, 0x67, 0x2c, 0xc2, 0x25, 0x1b, + 0x14, 0x80, 0xcb, 0xc3, 0x10, 0x26, 0x60, 0xe1, 0xb7, 0x7c, 0x8c, 0x9c, + 0x11, 0x03, 0xb5, 0x02, 0x19, 0xc2, 0x56, 0xdd, 0xbc, 0x3d, 0xfb, 0xf1, + 0x67, 0x14, 0x04, 0xb8, 0x74, 0x65, 0x89, 0x51, 0xb6, 0x51, 0xbe, 0x52, + 0xfd, 0xfe, 0x14, 0x5c, 0x6b, 0x5b, 0x14, 0x26, 0x04, 0x4d, 0xea, 0x5b, + 0xa1, 0x95, 0x71, 0xb2, 0x35, 0xbf, 0xfe, 0xbd, 0xc4, 0xf5, 0x4e, 0xbb, + 0x18, 0xbd, 0x1a, 0x68, 0x26, 0x18, 0x3f, 0x78, 0x7d, 0xc2, 0x24, 0xfb, + 0x9d, 0xa5, 0xdf, 0x8c, 0x01, 0x5a, 0x28, 0x50, 0xa9, 0xd1, 0x5b, 0xe8, + 0x0a, 0xd3, 0x02, 0xa8, 0x0c, 0x06, 0xcf, 0x37, 0x50, 0xb7, 0x3c, 0xbc, + 0x4e, 0x98, 0xbb, 0xb5, 0xbb, 0xe9, 0xe7, 0xea, 0x5d, 0xce, 0xcf, 0x66, + 0x47, 0x77, 0xff, 0xe3, 0xcd, 0x00, 0x03, 0x5c, 0xf7, 0xc1, 0x49, 0x8e, + 0x04, 0x9d, 0x50, 0xf3, 0xed, 0x37, 0x3b, 0x82, 0xf2, 0x1b, 0x6e, 0x5f, + 0x0f, 0xfd, 0xda, 0xc7, 0x81, 0xff, 0xaa, 0xf6, 0x87, 0xfb, 0x60, 0x6a, + 0x67, 0x32, 0xfe, 0x50, 0x2b, 0x99, 0x1f, 0xec, 0x2b, 0x9d, 0xce, 0x0b, + 0x01, 0x80, 0x75, 0xb2, 0xdb, 0x31, 0x0d, 0xf3, 0xe8, 0x37, 0x3b, 0x5f, + 0x89, 0x08, 0x36, 0xa2, 0xc6, 0x15, 0x67, 0xed, 0xcf, 0x4d, 0x81, 0x49, + 0x54, 0x3f, 0x80, 0x4c, 0x00, 0xb6, 0xa5, 0xec, 0x0c, 0xd0, 0x6a, 0x83, + 0x5d, 0xb5, 0x40, 0xce, 0xc4, 0x0b, 0xbf, 0x24, 0xd2, 0x24, 0x44, 0xca, + 0x66, 0x0a, 0x88, 0x95, 0xfe, 0xa2, 0x4a, 0xa3, 0x17, 0xeb, 0x61, 0x7d, + 0xe9, 0x83, 0x6c, 0x1f, 0x33, 0x0d, 0xf7, 0x7f, 0xd4, 0x90, 0xad, 0xf3, + 0x52, 0xaa, 0x1e, 0xae, 0x8f, 0x73, 0xb9, 0x39, 0xd4, 0x42, 0x22, 0xc1, + 0xb5, 0xa6, 0x17, 0x05, 0x69, 0x10, 0xdc, 0x92, 0x96, 0x1a, 0x43, 0xa4, + 0x25, 0xa2, 0x7b, 0x26, 0x21, 0x00, 0x93, 0xc5, 0x63, 0x61, 0x90, 0xec, + 0xc7, 0xf7, 0x00, 0x5a, 0x0a, 0x2a, 0x25, 0xc8, 0x2b, 0x18, 0x57, 0x04, + 0xf5, 0x4d, 0xb6, 0x5d, 0x46, 0x84, 0xe0, 0x90, 0x74, 0x91, 0x11, 0x90, + 0x4d, 0xd9, 0xcc, 0x07, 0x2d, 0x58, 0xd9, 0x52, 0xc3, 0x77, 0x22, 0xd8, + 0x97, 0xb9, 0xe4, 0x6f, 0x4c, 0xf4, 0x88, 0x44, 0x43, 0xd9, 0x83, 0x00, + 0xea, 0xa5, 0xc2, 0x44, 0x25, 0x7a, 0x10, 0x6f, 0x98, 0x0e, 0x7f, 0x96, + 0x3c, 0x11, 0xc0, 0x08, 0xfc, 0xfb, 0x39, 0x05, 0xba, 0x02, 0xf0, 0x7b, + 0x44, 0xd4, 0x8f, 0x74, 0xe8, 0xc8, 0xa1, 0x44, 0x59, 0x51, 0x7d, 0x26, + 0x58, 0xf0, 0xca, 0x8c, 0xf3, 0x71, 0x41, 0x9e, 0xf0, 0x4e, 0x11, 0x00, + 0x91, 0x93, 0x8d, 0x7a, 0x55, 0x17, 0x6a, 0xca, 0x26, 0x79, 0x01, 0x1e, + 0x6a, 0xac, 0x31, 0x4a, 0x23, 0x79, 0x05, 0xdd, 0xca, 0x15, 0x58, 0xd1, + 0x6a, 0xd2, 0xc8, 0x41, 0x25, 0x1c, 0xcf, 0x05, 0x76, 0x02, 0x1f, 0xa6, + 0x7d, 0x9c, 0x8b, 0x3f, 0x03, 0xe3, 0x23, 0xea, 0x59, 0xbf, 0xf8, 0xf2, + 0x39, 0x16, 0x5a, 0x0a, 0xce, 0xf4, 0x06, 0xb7, 0x87, 0x45, 0x57, 0x5f, + 0x43, 0xa5, 0x52, 0x89, 0x80, 0x4d, 0xf3, 0xd5, 0x39, 0xf7, 0xc5, 0x84, + 0xad, 0x4b, 0x78, 0x1b, 0x58, 0x04, 0x40, 0xad, 0xd9, 0x6d, 0xb9, 0x67, + 0x55, 0x27, 0xd7, 0x5b, 0x07, 0x93, 0x00, 0x2d, 0xab, 0x07, 0xfe, 0x69, + 0xe2, 0x0c, 0x4b, 0xcb, 0xfd, 0xb8, 0x67, 0xa7, 0xb1, 0x16, 0xf6, 0x76, + 0x0c, 0x7f, 0x49, 0xb4, 0x94, 0x86, 0x8a, 0xef, 0xf2, 0xcb, 0x2f, 0xe7, + 0xf9, 0xe7, 0x9f, 0x67, 0x64, 0x64, 0x84, 0xd3, 0x4f, 0x3f, 0xc5, 0x8b, + 0x2f, 0x9f, 0x63, 0x64, 0x64, 0x84, 0x17, 0x5e, 0x78, 0x81, 0xe7, 0x9f, + 0x7f, 0x3e, 0xf2, 0x1b, 0xfa, 0xbb, 0xfc, 0xf2, 0xcb, 0xb9, 0xec, 0xb2, + 0xcb, 0xa8, 0x54, 0x2a, 0x09, 0x37, 0xdd, 0xe6, 0xca, 0x94, 0x7b, 0x78, + 0xbd, 0xa1, 0x5d, 0xdd, 0x4d, 0xb7, 0x71, 0xce, 0x7d, 0x31, 0xba, 0xa7, + 0x23, 0x23, 0x23, 0x54, 0x2a, 0x95, 0xb6, 0xf8, 0x81, 0xc4, 0xb9, 0x91, + 0x11, 0xd5, 0xdf, 0x10, 0xa6, 0x9d, 0x97, 0x75, 0xbf, 0xe7, 0xe0, 0xe5, + 0xd8, 0xf6, 0x02, 0xeb, 0x52, 0x2e, 0xbb, 0xec, 0x32, 0x65, 0xf0, 0x5f, + 0xbf, 0x8b, 0xc1, 0x30, 0xfc, 0x59, 0x7c, 0x6f, 0xf4, 0x3c, 0x7c, 0xf3, + 0xe7, 0x0e, 0x62, 0x1b, 0x36, 0xc3, 0xcb, 0xd5, 0x39, 0xe7, 0x74, 0x95, + 0xfd, 0x87, 0x6b, 0x80, 0x60, 0xdc, 0xa9, 0xe2, 0x4a, 0x17, 0xcb, 0x11, + 0xec, 0x3f, 0x5c, 0xe3, 0x64, 0xbd, 0xca, 0x92, 0x62, 0x19, 0x57, 0xba, + 0x1c, 0x7c, 0xf6, 0x20, 0x76, 0xce, 0xe2, 0xd0, 0x44, 0x05, 0xeb, 0x2f, + 0xab, 0xc8, 0x1e, 0x81, 0xeb, 0x3b, 0xb8, 0x9e, 0x0f, 0x4f, 0x04, 0xfd, + 0x1b, 0x45, 0x93, 0x42, 0xd0, 0x17, 0xb8, 0xe4, 0x5a, 0xb8, 0xe1, 0xd6, + 0x51, 0x0e, 0x3c, 0x74, 0x90, 0x5d, 0x8f, 0x56, 0xd9, 0x70, 0x63, 0x99, + 0x75, 0x43, 0x36, 0x07, 0x9e, 0xaa, 0x61, 0x85, 0x7d, 0x13, 0x33, 0x3e, + 0xae, 0xeb, 0xb2, 0xfa, 0x9a, 0x12, 0xd2, 0x07, 0x72, 0x50, 0x7d, 0x56, + 0xbd, 0x23, 0xfe, 0xa4, 0x03, 0x33, 0x3e, 0x46, 0x9f, 0x4d, 0x61, 0x72, + 0x0c, 0xa7, 0xb7, 0x84, 0x61, 0xaa, 0x7a, 0x4a, 0xc3, 0x6f, 0x60, 0x05, + 0x75, 0x21, 0xb1, 0x50, 0x20, 0xcf, 0x06, 0x7d, 0x0c, 0x39, 0x03, 0x5a, + 0x41, 0x9d, 0x34, 0xec, 0xeb, 0x58, 0x60, 0x20, 0x67, 0x82, 0xf2, 0x22, + 0x1c, 0x2f, 0x0c, 0xca, 0x99, 0x30, 0x4b, 0x93, 0x52, 0x15, 0x11, 0xe1, + 0x16, 0x04, 0x8e, 0xef, 0x61, 0xf4, 0x18, 0x18, 0x39, 0x83, 0x82, 0x51, + 0x88, 0xce, 0x43, 0x90, 0xb7, 0xb7, 0xd4, 0x38, 0x72, 0xb8, 0x4f, 0x4e, + 0x22, 0x16, 0x18, 0xf8, 0x67, 0xfd, 0x84, 0x5f, 0x5d, 0x8d, 0x56, 0xdc, + 0x0e, 0x89, 0xc2, 0xb5, 0x04, 0xab, 0x57, 0xad, 0x86, 0x1c, 0x8c, 0x5e, + 0xbf, 0x16, 0x37, 0x00, 0x81, 0xb9, 0x9e, 0x83, 0x58, 0x40, 0x04, 0xd6, + 0x6a, 0x93, 0x0c, 0xee, 0xa1, 0x9e, 0x87, 0x07, 0xef, 0x74, 0x99, 0x37, + 0x46, 0xe0, 0xa7, 0x08, 0x20, 0xd5, 0x2f, 0xa0, 0xc3, 0xb0, 0xc4, 0x97, + 0xb9, 0x8f, 0xe7, 0x52, 0x27, 0xbe, 0xcc, 0x7d, 0x6c, 0xe1, 0x41, 0xe4, + 0xb8, 0xcf, 0xbe, 0xbe, 0x3d, 0x6d, 0x20, 0xaa, 0x9d, 0x77, 0xec, 0x64, + 0xf3, 0xe1, 0xcd, 0x91, 0xbb, 0x7d, 0x6b, 0x89, 0x91, 0xc9, 0x11, 0xfe, + 0xfa, 0xc4, 0x01, 0xde, 0xf2, 0xf6, 0x18, 0xa8, 0x15, 0x6e, 0x43, 0xa0, + 0x16, 0x28, 0xb8, 0xd6, 0xf8, 0xd7, 0xd5, 0x7e, 0x08, 0xdf, 0x7a, 0xf3, + 0xc5, 0x36, 0x67, 0xa9, 0x26, 0xe2, 0x70, 0x9f, 0x70, 0x10, 0x43, 0x06, + 0xd6, 0x22, 0x0b, 0xf7, 0xb4, 0x8b, 0x0c, 0x00, 0x5b, 0x11, 0xc0, 0x2a, + 0xbc, 0x0d, 0x5a, 0x98, 0xf9, 0x48, 0xb7, 0x21, 0xfa, 0x44, 0x04, 0xd4, + 0x0a, 0x25, 0x26, 0x03, 0x80, 0x66, 0x08, 0xd5, 0x0a, 0xb6, 0x72, 0xdc, + 0x87, 0x5f, 0x21, 0x82, 0x7e, 0x89, 0x3e, 0x11, 0xc5, 0x1b, 0x86, 0x97, + 0xe3, 0x3e, 0x6f, 0xbe, 0x58, 0xf5, 0x1d, 0xbe, 0xe9, 0x8d, 0x97, 0x45, + 0xd7, 0xf6, 0xd2, 0x2b, 0x4e, 0x02, 0x9c, 0xa5, 0x6f, 0x43, 0xf7, 0x10, + 0xb6, 0x15, 0xba, 0xbf, 0xfc, 0xfd, 0x17, 0x22, 0x38, 0x57, 0x2f, 0x6f, + 0x69, 0x7b, 0xa7, 0x33, 0x65, 0xca, 0x94, 0x29, 0x53, 0xa6, 0x4c, 0x99, + 0x32, 0x65, 0xca, 0x94, 0x29, 0x53, 0xa6, 0x4c, 0x99, 0x32, 0x65, 0xca, + 0x94, 0x29, 0x53, 0xa6, 0x4c, 0x99, 0x32, 0x65, 0xca, 0x94, 0x29, 0xd3, + 0xfc, 0x95, 0x41, 0xb5, 0x32, 0x65, 0xca, 0x94, 0x29, 0x53, 0xa6, 0x9f, + 0x00, 0xe9, 0xe0, 0xa9, 0xb4, 0xd2, 0x1f, 0x84, 0x77, 0xfa, 0x00, 0xbb, + 0x74, 0x45, 0x09, 0x3f, 0x05, 0x05, 0xd1, 0xc1, 0x37, 0x46, 0xaf, 0x11, + 0x7d, 0xac, 0x1e, 0xfa, 0xd3, 0xc3, 0x18, 0x86, 0x02, 0xe5, 0x94, 0x06, + 0x4a, 0xd4, 0x26, 0x6b, 0xc9, 0x8f, 0xc8, 0x7b, 0x8d, 0x04, 0x58, 0x0b, + 0x88, 0x60, 0x2e, 0x21, 0x58, 0x4b, 0x25, 0x08, 0x08, 0x80, 0x4e, 0x4d, + 0x0d, 0x7e, 0x20, 0x5b, 0x92, 0x83, 0x39, 0x18, 0x6d, 0xc1, 0x68, 0xe0, + 0xf6, 0xc5, 0x3f, 0xf9, 0x26, 0x1f, 0xfd, 0xf5, 0x77, 0x45, 0x7e, 0x9a, + 0xb2, 0x99, 0x48, 0xbf, 0x61, 0x18, 0x6d, 0xd7, 0xa3, 0x4b, 0xff, 0xd0, + 0xd8, 0xf5, 0x3a, 0x4f, 0x95, 0xea, 0x64, 0xc3, 0x30, 0x8c, 0xc4, 0x3d, + 0x98, 0x8f, 0xcc, 0x3e, 0x93, 0xc6, 0x4c, 0xfb, 0x44, 0xab, 0x6e, 0xf1, + 0x62, 0x1a, 0x9d, 0xdd, 0x03, 0xc9, 0x16, 0xea, 0xab, 0x6e, 0xd4, 0x07, + 0x79, 0xee, 0xb4, 0xda, 0x77, 0xa7, 0x9c, 0x08, 0xac, 0xe5, 0x4e, 0x39, + 0x10, 0xac, 0x4a, 0xec, 0x7a, 0xa7, 0x28, 0xe4, 0x0a, 0x9d, 0xc1, 0x31, + 0x39, 0xed, 0xa3, 0xf1, 0x56, 0x0c, 0xd6, 0x02, 0xb0, 0x7d, 0xb5, 0x3a, + 0xb3, 0x40, 0x20, 0x52, 0x8b, 0xfe, 0xda, 0x7d, 0x0a, 0xa6, 0xd5, 0xc8, + 0x09, 0xc8, 0x89, 0x68, 0xd2, 0xa3, 0x98, 0x91, 0x14, 0x4c, 0x83, 0x02, + 0x26, 0xee, 0x94, 0x1f, 0x4d, 0x0e, 0x28, 0xcd, 0x28, 0xa8, 0x95, 0xa9, + 0xdd, 0x36, 0x53, 0x9f, 0xbc, 0xef, 0x49, 0xec, 0x01, 0x33, 0x48, 0xaf, + 0xaf, 0x6a, 0x98, 0xa7, 0x55, 0x1a, 0xed, 0x5e, 0x83, 0x86, 0x2f, 0xdb, + 0xc3, 0x07, 0x70, 0x2d, 0xcf, 0x97, 0xea, 0x0a, 0x44, 0x00, 0xd4, 0x0a, + 0x64, 0x4c, 0xfa, 0x58, 0x7d, 0x06, 0x8d, 0x69, 0x1f, 0xa6, 0x93, 0x61, + 0x00, 0x84, 0xbe, 0xf0, 0xac, 0x14, 0x88, 0x1e, 0xb0, 0x67, 0x04, 0x0d, + 0x43, 0xd0, 0x98, 0x91, 0x58, 0xc1, 0x79, 0xab, 0x25, 0x40, 0xa8, 0x95, + 0x9d, 0xed, 0xba, 0xc4, 0x9f, 0x91, 0x88, 0x5c, 0x1e, 0xf1, 0x4c, 0x6c, + 0xa0, 0x20, 0xd5, 0x3d, 0x11, 0x9e, 0xc4, 0x0d, 0xbe, 0x52, 0xb7, 0xb4, + 0x0f, 0xfc, 0x2d, 0x4f, 0x7d, 0x98, 0x5e, 0xf2, 0xc1, 0x11, 0x42, 0x7d, + 0x14, 0x2b, 0xe7, 0xff, 0x71, 0xa6, 0x10, 0x66, 0x0c, 0xd4, 0x0a, 0x95, + 0x9a, 0x54, 0x3c, 0x17, 0x50, 0x0b, 0x14, 0x38, 0x6b, 0x3e, 0xea, 0xe4, + 0x2f, 0x04, 0x6b, 0x75, 0x73, 0x2f, 0x5d, 0x6d, 0x22, 0x5b, 0xb3, 0xff, + 0x76, 0x75, 0x0d, 0x2d, 0x1d, 0x6a, 0x73, 0x73, 0x26, 0x1d, 0x46, 0x6f, + 0x56, 0x6f, 0xb9, 0x3e, 0xb9, 0x42, 0x4a, 0x49, 0x6d, 0xa2, 0x1d, 0xa6, + 0x50, 0x30, 0x0a, 0x98, 0x0b, 0xcd, 0xb6, 0x3c, 0xee, 0xd0, 0xe1, 0x43, + 0xd8, 0x03, 0xed, 0xe9, 0x2d, 0x75, 0x81, 0x24, 0xe8, 0xb6, 0xc3, 0x77, + 0xc3, 0xf5, 0x5c, 0x56, 0xaf, 0x59, 0x9d, 0xf0, 0x27, 0xa5, 0xa4, 0x72, + 0xb4, 0x82, 0x35, 0x90, 0x5a, 0x6a, 0x1b, 0xd4, 0xaa, 0xc8, 0x9d, 0x6c, + 0xd7, 0x02, 0xdb, 0x73, 0xdc, 0x1a, 0xa7, 0xee, 0x50, 0x1a, 0x2c, 0x61, + 0xf4, 0x16, 0x31, 0x35, 0x53, 0x79, 0x91, 0x9c, 0xf4, 0x61, 0x4e, 0x9b, + 0x1c, 0xfc, 0x4b, 0x35, 0x81, 0x6f, 0xf4, 0x43, 0xa3, 0x51, 0x5e, 0x56, + 0xd6, 0xfc, 0xe8, 0x93, 0x52, 0x86, 0x87, 0x86, 0xd9, 0xf7, 0xc8, 0x3e, + 0xa4, 0x94, 0xec, 0x7b, 0x44, 0x4d, 0xf6, 0xdd, 0x74, 0xd7, 0xa6, 0xe8, + 0xfc, 0x86, 0x8f, 0xc5, 0xcb, 0xd1, 0x96, 0xaf, 0x2e, 0x53, 0x39, 0x5a, + 0xc1, 0x49, 0x51, 0x8a, 0xb6, 0xfc, 0xce, 0x96, 0x68, 0xdf, 0x7f, 0x68, + 0x2f, 0x46, 0xaf, 0xba, 0x98, 0x10, 0x24, 0xd6, 0x6d, 0x5f, 0x4a, 0x89, + 0x3f, 0xed, 0x9f, 0x97, 0xff, 0xf4, 0xb9, 0xd9, 0x14, 0x96, 0x7b, 0xaf, + 0x97, 0xff, 0x30, 0x4d, 0xfa, 0x35, 0x74, 0x93, 0x08, 0xca, 0x06, 0x39, + 0x4b, 0x59, 0x1c, 0x6a, 0x60, 0xb0, 0xfb, 0x44, 0x6f, 0x5d, 0x87, 0x51, + 0xa0, 0xa7, 0x95, 0x0c, 0xb0, 0x93, 0xc9, 0x36, 0x48, 0xd6, 0x24, 0xf0, + 0x00, 0x2b, 0x39, 0xc2, 0x11, 0x56, 0x06, 0x88, 0xa8, 0xf0, 0xd1, 0xad, + 0x24, 0x09, 0x97, 0x82, 0xd9, 0x21, 0x5b, 0x17, 0xa2, 0x55, 0xab, 0x56, + 0x31, 0x39, 0x91, 0x9c, 0x75, 0x3b, 0x1b, 0xfc, 0x2a, 0xbc, 0x96, 0x49, + 0x26, 0x13, 0x93, 0xeb, 0x74, 0x08, 0x58, 0xa7, 0xb0, 0x69, 0x48, 0x58, + 0xda, 0x4f, 0xa7, 0xeb, 0x4a, 0x43, 0xb4, 0xc2, 0xb8, 0x01, 0x8e, 0x04, + 0xf7, 0xb2, 0x13, 0x7c, 0x6c, 0x20, 0x75, 0xbc, 0x12, 0xf8, 0xab, 0x3b, + 0x15, 0x80, 0x6b, 0x00, 0xf8, 0x60, 0x00, 0xd8, 0x7a, 0x75, 0x62, 0x92, + 0xc1, 0xf3, 0x98, 0x07, 0x74, 0xc3, 0x51, 0xc9, 0x81, 0x15, 0x02, 0xc6, + 0xfe, 0x3e, 0x76, 0x3b, 0x0e, 0x52, 0x03, 0x4f, 0x5d, 0x18, 0x28, 0x4a, + 0x69, 0xfb, 0x3c, 0xec, 0x8c, 0xf4, 0xc6, 0xf9, 0xba, 0x33, 0xa3, 0x7e, + 0xa7, 0xd5, 0x29, 0x3f, 0x71, 0x6c, 0x18, 0x30, 0x6a, 0x68, 0xf9, 0xbf, + 0x56, 0x4e, 0xcf, 0x26, 0x3d, 0xce, 0x6e, 0xf1, 0xcf, 0x27, 0x8d, 0xaf, + 0x65, 0xb8, 0xa4, 0xce, 0x1f, 0xa8, 0x15, 0x95, 0x28, 0x73, 0x4c, 0x78, + 0x7b, 0x4d, 0xf5, 0x44, 0x30, 0x09, 0xea, 0xfd, 0x23, 0xdc, 0x25, 0x25, + 0xf4, 0xcc, 0x9e, 0xef, 0x58, 0xcb, 0x0c, 0x4e, 0x1d, 0xf6, 0x59, 0xbc, + 0x2a, 0xc8, 0x7f, 0x64, 0x0c, 0xf8, 0x72, 0x8e, 0xfa, 0x44, 0x53, 0x86, + 0xe7, 0x79, 0xf9, 0xe6, 0xb5, 0xeb, 0xf0, 0x9e, 0xec, 0x0c, 0x7a, 0x3a, + 0x2f, 0x7d, 0x25, 0x98, 0x64, 0x7e, 0xfd, 0x28, 0x1f, 0x9d, 0xc5, 0xdb, + 0x8e, 0xcf, 0x4a, 0x6a, 0x75, 0x97, 0x52, 0xd1, 0x8a, 0x8e, 0x43, 0x8d, + 0x9f, 0xd8, 0xc2, 0xea, 0x15, 0xab, 0xe7, 0xf4, 0x73, 0xbe, 0xb6, 0xd2, + 0xf1, 0x03, 0xd4, 0xea, 0x6e, 0x57, 0x3f, 0x1d, 0x35, 0x58, 0x20, 0x7f, + 0x65, 0x3c, 0x53, 0x2a, 0x7f, 0xa5, 0x80, 0x67, 0xe3, 0x3a, 0x7d, 0x41, + 0x14, 0xe0, 0x0d, 0x02, 0xbb, 0xdf, 0x22, 0x6c, 0x2e, 0xd8, 0xfd, 0x16, + 0xee, 0x8c, 0x64, 0xa8, 0xc7, 0xc2, 0x39, 0xa3, 0xfc, 0x6e, 0xfa, 0x44, + 0x0c, 0x4f, 0x13, 0x42, 0xe0, 0xd4, 0xd5, 0xfe, 0xda, 0x1b, 0x37, 0xf0, + 0xe1, 0x5f, 0x7e, 0x6f, 0x04, 0xb3, 0x02, 0xce, 0x6b, 0x3f, 0x84, 0x61, + 0x8d, 0x1f, 0xab, 0x31, 0xb2, 0xc2, 0x61, 0xdb, 0xa7, 0xb7, 0x51, 0x05, + 0x35, 0xab, 0xb3, 0x4c, 0x34, 0xbb, 0x73, 0xdb, 0xa7, 0x57, 0x53, 0x39, + 0x5a, 0xa1, 0xfa, 0x8c, 0x9f, 0x04, 0x67, 0xa5, 0x6c, 0xe9, 0xf6, 0x05, + 0x20, 0x3d, 0x89, 0x30, 0x93, 0xe5, 0x68, 0xe1, 0x34, 0x54, 0xa8, 0xcc, + 0x1a, 0x97, 0x53, 0x77, 0xa8, 0x1d, 0x3b, 0xca, 0x12, 0x63, 0x08, 0x69, + 0x0c, 0x21, 0x0c, 0x55, 0x5f, 0xbd, 0xe7, 0x97, 0x0f, 0xb2, 0xed, 0x2f, + 0x54, 0x5d, 0xc4, 0xfa, 0xc4, 0x26, 0x6e, 0xbb, 0xf5, 0x36, 0xf6, 0x3e, + 0xb4, 0x97, 0x7d, 0x87, 0x6b, 0x51, 0x7d, 0x66, 0xec, 0x93, 0xb0, 0xe1, + 0x4f, 0x55, 0x4d, 0xa7, 0x02, 0x2c, 0x31, 0x86, 0xd4, 0xb9, 0xa0, 0x8e, + 0x54, 0xbd, 0xef, 0x2e, 0x6e, 0xd8, 0x7b, 0x5f, 0x74, 0x9e, 0xbe, 0xd5, + 0xdc, 0xb4, 0xa6, 0x14, 0xd9, 0xfa, 0xc0, 0xd1, 0x71, 0xbe, 0x7a, 0x87, + 0xaa, 0xfb, 0x54, 0xfa, 0x56, 0xc3, 0xd4, 0x21, 0x96, 0x18, 0x43, 0x18, + 0x74, 0x87, 0xc0, 0xce, 0xa5, 0xf0, 0x97, 0x32, 0x5b, 0x8d, 0xe2, 0x7c, + 0x50, 0x08, 0x4d, 0x62, 0x00, 0x55, 0x1a, 0x48, 0x35, 0xdb, 0x2b, 0xac, + 0xcd, 0xc3, 0x3e, 0x6f, 0xb5, 0x2e, 0xee, 0x25, 0x9a, 0x4f, 0x77, 0x31, + 0xbc, 0xe9, 0x95, 0xb3, 0xb3, 0xc6, 0x33, 0x5f, 0xfd, 0x38, 0xae, 0x25, + 0xd4, 0x7c, 0x9e, 0x4b, 0x27, 0xf9, 0xc0, 0x6d, 0x77, 0x94, 0x18, 0x3f, + 0x0d, 0x6e, 0x4e, 0x52, 0x5a, 0x04, 0xbb, 0x3e, 0x7f, 0x80, 0xf2, 0xfb, + 0x46, 0xb0, 0x4a, 0x56, 0x62, 0xb2, 0x60, 0xb5, 0x5a, 0x43, 0xd2, 0xc4, + 0xba, 0x62, 0x09, 0xe5, 0x72, 0x5c, 0x03, 0xf7, 0x5c, 0x87, 0x43, 0x0f, + 0xed, 0x65, 0xfb, 0x5f, 0xac, 0x57, 0x3f, 0x7d, 0xd9, 0xe4, 0xfe, 0xdf, + 0x1b, 0x56, 0x93, 0xc7, 0x81, 0xe1, 0x6b, 0x60, 0xf3, 0x6f, 0xef, 0x62, + 0x78, 0xcd, 0x28, 0x66, 0xaf, 0x45, 0x5e, 0x87, 0x8a, 0x3f, 0x39, 0x1e, + 0xf8, 0x19, 0xc2, 0x99, 0xaa, 0x61, 0x2f, 0x2d, 0xe1, 0x3e, 0xe9, 0xb2, + 0xef, 0xbe, 0x7b, 0xf9, 0xc2, 0xa9, 0xbb, 0xb5, 0x94, 0xae, 0x60, 0xed, + 0x32, 0x70, 0x02, 0x9b, 0x0a, 0xa8, 0x75, 0x14, 0xbb, 0xbf, 0x88, 0x3d, + 0xb0, 0x18, 0xa7, 0xee, 0x60, 0x17, 0x6d, 0x2a, 0x28, 0xb0, 0xd6, 0xc8, + 0xcd, 0x71, 0x3e, 0x63, 0x2f, 0xb7, 0x71, 0x8e, 0x39, 0xac, 0x5b, 0xa6, + 0xe0, 0x3e, 0x0e, 0x0a, 0xa6, 0x05, 0x30, 0xb2, 0x4c, 0xf9, 0x59, 0xb7, + 0x0c, 0xb6, 0x1c, 0x0b, 0xdc, 0xeb, 0xaa, 0x7d, 0x62, 0xdb, 0xaa, 0x61, + 0x12, 0x82, 0xb6, 0x9c, 0x13, 0x63, 0xd8, 0x37, 0x5a, 0x78, 0xae, 0x4b, + 0xf9, 0xfa, 0xed, 0xb8, 0xc7, 0x76, 0x29, 0x80, 0x56, 0x34, 0x61, 0x3d, + 0x06, 0x83, 0xc8, 0xa0, 0x0f, 0xc1, 0x30, 0x9a, 0xc8, 0x99, 0x7c, 0x04, + 0x24, 0x13, 0x34, 0xd5, 0xff, 0x96, 0x04, 0x1c, 0x16, 0xf7, 0xc5, 0x13, + 0x52, 0x1b, 0x2d, 0x03, 0x05, 0x39, 0x20, 0x82, 0x15, 0x88, 0x70, 0xb2, + 0x6a, 0x2e, 0x39, 0x99, 0x54, 0xe6, 0x42, 0xa0, 0xd6, 0xfc, 0xf5, 0x6f, + 0x7f, 0xd0, 0x8e, 0xc0, 0xea, 0x05, 0xfe, 0x4d, 0xf7, 0x73, 0x5e, 0x16, + 0x5f, 0x3b, 0xfd, 0xe0, 0xc9, 0x57, 0x59, 0x1f, 0xec, 0xef, 0xfe, 0x31, + 0xa5, 0xe1, 0xc7, 0xa5, 0x97, 0x48, 0x82, 0xb4, 0xe6, 0x87, 0x16, 0x3a, + 0x7f, 0x55, 0xfe, 0xda, 0x63, 0x64, 0x29, 0x9c, 0xb2, 0x05, 0xde, 0x23, + 0x92, 0x0a, 0xb0, 0x0e, 0x55, 0x76, 0x6c, 0xff, 0x8c, 0xd9, 0x06, 0xc7, + 0x32, 0x6d, 0xc1, 0xa8, 0xad, 0xca, 0x42, 0x2f, 0x28, 0x32, 0x3c, 0x47, + 0xe2, 0x39, 0x1e, 0x20, 0x30, 0x6d, 0x95, 0xee, 0xb1, 0xdf, 0x4d, 0xa6, + 0xb8, 0x2a, 0xa0, 0xa1, 0xfd, 0x56, 0x6d, 0x92, 0x68, 0x2e, 0x07, 0x38, + 0xf8, 0x4f, 0xc9, 0x09, 0xfc, 0x37, 0x3d, 0x02, 0xfb, 0x6e, 0x86, 0xca, + 0x04, 0x1c, 0x7c, 0x46, 0xb9, 0x9d, 0xea, 0x23, 0xaa, 0x8f, 0x5f, 0xf2, + 0x03, 0xf8, 0x97, 0x6f, 0x9d, 0x83, 0x6b, 0xb7, 0x72, 0x64, 0xc1, 0xa7, + 0xf8, 0xd2, 0xa6, 0x8b, 0xe0, 0x96, 0x3a, 0x3c, 0x5c, 0xe4, 0x6b, 0x47, + 0x8a, 0x70, 0x3b, 0x7c, 0x61, 0x01, 0x7c, 0xe9, 0x57, 0x80, 0x3a, 0x2c, + 0x5f, 0xfe, 0x30, 0xf5, 0x7a, 0x9d, 0x9f, 0x99, 0xdc, 0x4a, 0x6d, 0x8e, + 0x3a, 0x7d, 0x64, 0x1b, 0xe0, 0x0d, 0xb1, 0xfb, 0x22, 0xe0, 0xf4, 0xa9, + 0xe4, 0xcc, 0xeb, 0xcf, 0xbc, 0x1d, 0x6a, 0x53, 0xea, 0x6f, 0x01, 0x24, + 0x01, 0x59, 0x0f, 0x03, 0xb7, 0x14, 0x93, 0xd4, 0x9a, 0x3a, 0x01, 0xd9, + 0x46, 0xa5, 0x35, 0xe1, 0x3f, 0xd4, 0x56, 0x14, 0x1c, 0xac, 0x58, 0x4c, + 0x38, 0xdf, 0xfe, 0x76, 0xa0, 0xff, 0x1c, 0xff, 0xf0, 0xff, 0xcc, 0x5e, + 0x27, 0x5e, 0x22, 0x6f, 0xa2, 0x66, 0x1c, 0x60, 0xf5, 0xa1, 0x12, 0xbb, + 0x76, 0xbb, 0x8c, 0x00, 0x62, 0xe9, 0x0a, 0x6a, 0x46, 0x95, 0xd5, 0x77, + 0x5a, 0x5d, 0x41, 0x5a, 0x00, 0x63, 0x4f, 0xa9, 0x0c, 0x7e, 0xf8, 0x8e, + 0x7d, 0x94, 0x5b, 0xff, 0xcc, 0x4d, 0xb7, 0x55, 0xa8, 0x7d, 0x70, 0x33, + 0xc3, 0xd7, 0x18, 0x14, 0xd8, 0xce, 0xd8, 0x53, 0x7e, 0x04, 0xc3, 0x0a, + 0x75, 0xdf, 0xf5, 0x5f, 0xe5, 0xae, 0xaf, 0x7c, 0x20, 0x11, 0x5e, 0xd7, + 0xf8, 0x13, 0x0d, 0x86, 0xde, 0x5f, 0xe8, 0x18, 0x36, 0xd4, 0xf0, 0x35, + 0xea, 0x9a, 0x4a, 0xff, 0x45, 0x30, 0x7e, 0x5c, 0xf5, 0x17, 0x6f, 0xfa, + 0x8b, 0xb8, 0x23, 0x68, 0xc7, 0x2f, 0xd7, 0x58, 0x7d, 0xb5, 0x9d, 0x00, + 0x67, 0xd5, 0x6e, 0x16, 0x8c, 0x3c, 0x22, 0xa9, 0x1d, 0x87, 0x6a, 0x5d, + 0xc5, 0x7b, 0xe8, 0x69, 0xf5, 0xc3, 0xb4, 0x34, 0xc0, 0x91, 0x3b, 0xdd, + 0xc0, 0xea, 0x2d, 0x44, 0x30, 0xad, 0x72, 0xd1, 0x88, 0xfc, 0xa7, 0x6d, + 0x86, 0xee, 0xdb, 0x6f, 0x55, 0x71, 0xef, 0x7f, 0xfa, 0xc2, 0xea, 0x46, + 0xd5, 0xcf, 0xcf, 0xbf, 0x8f, 0xfc, 0x87, 0xd5, 0x51, 0x76, 0x30, 0x84, + 0xea, 0x4f, 0x6c, 0xf8, 0x3e, 0xe4, 0x1a, 0xd0, 0x2a, 0xa2, 0x63, 0x94, + 0x7c, 0x79, 0x14, 0x8b, 0x12, 0x22, 0x67, 0x45, 0x60, 0x2d, 0xcb, 0x2c, + 0xd2, 0xf4, 0x7d, 0x7c, 0x09, 0x75, 0x7f, 0x3f, 0xa0, 0xa0, 0x59, 0x96, + 0x59, 0xc2, 0xaf, 0x3b, 0x90, 0x0b, 0x17, 0x1c, 0x49, 0xf6, 0xd5, 0x1b, + 0xc2, 0xc4, 0x97, 0x1e, 0xe0, 0x62, 0xe4, 0xca, 0xc1, 0x7e, 0x52, 0xb6, + 0x59, 0xa2, 0xaa, 0x41, 0x92, 0xef, 0x5e, 0xf3, 0x55, 0xee, 0x7d, 0x4c, + 0xfd, 0x46, 0x0e, 0x9e, 0xbe, 0x1f, 0xd8, 0xcc, 0xe8, 0xa2, 0xfb, 0x39, + 0x78, 0x7a, 0x73, 0xe4, 0x47, 0x22, 0x91, 0x52, 0xf5, 0x0f, 0x4b, 0x29, + 0x30, 0x44, 0xd4, 0xd5, 0x0f, 0x39, 0x89, 0x21, 0x44, 0xc7, 0xbc, 0x30, + 0x0d, 0xbd, 0xd2, 0xa1, 0x58, 0xe1, 0x36, 0xf4, 0xd3, 0x0d, 0x8e, 0x35, + 0x9f, 0x30, 0xdd, 0xe1, 0x5a, 0x32, 0x02, 0x6a, 0x45, 0xe0, 0x2c, 0x88, + 0x80, 0x5a, 0x21, 0x5c, 0x4b, 0x07, 0x6a, 0xf9, 0xbe, 0x8b, 0x11, 0xb6, + 0x33, 0x66, 0x9a, 0x88, 0x9e, 0xb9, 0xb1, 0xab, 0x45, 0xe0, 0x58, 0xb0, + 0x2d, 0x12, 0xc3, 0xb1, 0x8a, 0xda, 0xb6, 0x93, 0x1b, 0x29, 0xf7, 0x4e, + 0x6e, 0x9d, 0xfc, 0x02, 0x0c, 0x4c, 0x0e, 0xa8, 0x0e, 0xa1, 0x07, 0x06, + 0xe0, 0xe3, 0xaa, 0xe7, 0xe9, 0x7c, 0x40, 0x53, 0x47, 0x52, 0xdb, 0xd7, + 0x4a, 0xa1, 0xbd, 0x5f, 0x7b, 0x4b, 0xec, 0xf6, 0xa7, 0x02, 0xfa, 0x96, + 0xc3, 0x91, 0x63, 0xdd, 0xfd, 0xcf, 0xd7, 0xee, 0xeb, 0xa1, 0x1f, 0xd6, + 0xb6, 0xd1, 0x63, 0x20, 0xa5, 0x1f, 0xd5, 0x1d, 0xd3, 0x12, 0x39, 0xa1, + 0xf5, 0x7d, 0x77, 0xaf, 0x0b, 0x8a, 0x1c, 0x48, 0x04, 0x04, 0xa0, 0x92, + 0xd0, 0x5e, 0x37, 0xf0, 0x55, 0x68, 0xb3, 0x13, 0x5c, 0x0b, 0xe2, 0xf1, + 0xc0, 0x6e, 0xe7, 0x75, 0x37, 0x29, 0x25, 0x86, 0x91, 0x1c, 0xb3, 0x08, + 0xdd, 0xd4, 0xbe, 0xdf, 0xe6, 0x3f, 0x3e, 0x68, 0xb7, 0xd9, 0x69, 0x7c, + 0xf7, 0x42, 0xe0, 0x5a, 0xa5, 0x45, 0x2a, 0xff, 0xac, 0x9d, 0x1e, 0x3f, + 0xef, 0xb0, 0xaf, 0x95, 0xa2, 0x74, 0x77, 0x02, 0x9e, 0xe5, 0x84, 0x1a, + 0x1f, 0x96, 0x52, 0x8d, 0x7b, 0xa5, 0x7e, 0x03, 0x32, 0xe5, 0x3f, 0x1a, + 0x53, 0x68, 0xc9, 0xe8, 0xbe, 0xc9, 0x56, 0x3e, 0xba, 0x85, 0x9d, 0x20, + 0x56, 0x12, 0xc9, 0x90, 0x80, 0x43, 0x12, 0x46, 0x72, 0x50, 0x69, 0x89, + 0x44, 0x3b, 0xd5, 0x90, 0xcd, 0x60, 0x4c, 0x14, 0x20, 0xdf, 0x06, 0xd4, + 0x82, 0xce, 0x8b, 0x72, 0x28, 0xa8, 0x57, 0xf7, 0x7a, 0x6c, 0xb7, 0xdf, + 0x73, 0xa8, 0x30, 0xad, 0x66, 0x0f, 0x80, 0x50, 0x63, 0x90, 0xc1, 0xb9, + 0x0d, 0x77, 0x6d, 0x62, 0xd7, 0x7d, 0x3b, 0x54, 0x5b, 0x4b, 0xc0, 0xe8, + 0x9a, 0xb5, 0x54, 0x9f, 0xa9, 0xe2, 0xd6, 0x6a, 0xd4, 0x9e, 0x55, 0xed, + 0xb4, 0xb5, 0x37, 0xaf, 0xc5, 0x79, 0x64, 0x3f, 0xf1, 0x28, 0x57, 0x13, + 0x3f, 0x05, 0x13, 0x6b, 0xd2, 0x0c, 0xc0, 0x61, 0x4d, 0x10, 0xaa, 0x7d, + 0x5e, 0xc8, 0xa9, 0xb4, 0x35, 0x5a, 0x0a, 0x2a, 0xd6, 0x94, 0x4d, 0x36, + 0x00, 0xe3, 0xad, 0x66, 0x74, 0x2d, 0x7a, 0xc9, 0xb8, 0x71, 0xf6, 0xcb, + 0x48, 0x28, 0x84, 0x60, 0x5d, 0x08, 0x50, 0x2b, 0xd4, 0xe5, 0x97, 0x5f, + 0xce, 0xf7, 0xf8, 0x36, 0x6f, 0x70, 0x7b, 0xc0, 0x82, 0xef, 0xf1, 0xed, + 0x79, 0xd9, 0xb2, 0x16, 0xf6, 0x62, 0x2d, 0xec, 0x55, 0xe0, 0xac, 0xe0, + 0x9b, 0x03, 0x57, 0x1b, 0xe3, 0x3e, 0x51, 0x55, 0x60, 0xad, 0x6e, 0xd2, + 0x61, 0x57, 0x97, 0xbe, 0x69, 0x01, 0xe7, 0xdc, 0x17, 0xb9, 0xf4, 0x4d, + 0x0b, 0xa8, 0x54, 0x2a, 0x5c, 0xfa, 0xa6, 0x05, 0x5c, 0x7e, 0xf9, 0xe5, + 0xbc, 0xf0, 0xc2, 0x0b, 0x91, 0xfb, 0x8b, 0x2f, 0x9f, 0x8b, 0xfc, 0x85, + 0x70, 0xaa, 0xd3, 0xee, 0x8b, 0x09, 0x40, 0x56, 0x37, 0x9b, 0xcf, 0x3f, + 0xff, 0x3c, 0x97, 0xbe, 0x69, 0x41, 0xe4, 0x7e, 0xfa, 0xe9, 0xa7, 0x58, + 0x60, 0x5d, 0x1a, 0x01, 0xb5, 0x74, 0xbb, 0x40, 0x04, 0xd4, 0x0a, 0xfd, + 0xea, 0x30, 0xac, 0x73, 0xee, 0x8b, 0x91, 0x9d, 0x10, 0xe8, 0x75, 0xce, + 0x7d, 0x31, 0x82, 0x69, 0x5d, 0x7e, 0xf9, 0xe5, 0xf0, 0xf2, 0xf3, 0x51, + 0x7a, 0xf4, 0xb4, 0xeb, 0xf0, 0xb0, 0x48, 0x73, 0x8c, 0x69, 0xda, 0x86, + 0xcd, 0xda, 0x55, 0xc9, 0x71, 0xd1, 0xb5, 0xab, 0x4a, 0x14, 0x4c, 0xc1, + 0x96, 0x6d, 0x47, 0x81, 0x02, 0xf4, 0x81, 0x2b, 0x1d, 0x2c, 0xd3, 0xc0, + 0x95, 0x0a, 0x9c, 0x65, 0xe5, 0x6c, 0xd5, 0x57, 0x62, 0x82, 0x3b, 0x0d, + 0x9e, 0xe7, 0x50, 0x1a, 0xb0, 0x11, 0x42, 0xef, 0x5f, 0xb5, 0x18, 0xb2, + 0x05, 0x76, 0x31, 0x39, 0xce, 0xbb, 0x76, 0x45, 0x89, 0x5d, 0x8f, 0x56, + 0x19, 0xb2, 0x05, 0xc3, 0x05, 0x70, 0x25, 0xb8, 0x93, 0x0e, 0x36, 0x20, + 0x64, 0xf2, 0x37, 0xef, 0x4f, 0x3a, 0x98, 0x41, 0x3e, 0x61, 0x4b, 0x97, + 0x12, 0x06, 0x95, 0xb3, 0x05, 0xaa, 0xcf, 0x1e, 0x65, 0xf4, 0x1a, 0x1b, + 0xf7, 0x8c, 0xc0, 0xea, 0x97, 0xb8, 0xd3, 0x75, 0x1a, 0x03, 0x65, 0x98, + 0x86, 0xe1, 0x2b, 0xcb, 0xf8, 0xae, 0x87, 0xd5, 0x5b, 0xc0, 0x9d, 0x06, + 0x43, 0xc0, 0xd8, 0xd3, 0xa7, 0xa0, 0xe5, 0x63, 0x9f, 0xb5, 0x21, 0x07, + 0x35, 0xaf, 0x4a, 0x23, 0x68, 0x63, 0x2d, 0x19, 0xb0, 0x83, 0x05, 0x79, + 0x04, 0x62, 0x81, 0x40, 0x2c, 0x00, 0x71, 0x4e, 0x50, 0xb0, 0x2d, 0x6a, + 0x4e, 0x0d, 0x21, 0xc0, 0xee, 0xb5, 0x69, 0xc8, 0x06, 0x08, 0x81, 0xd9, + 0x6b, 0xe2, 0x23, 0x83, 0xc5, 0xd2, 0xc0, 0x58, 0x18, 0x7c, 0x77, 0x13, + 0x76, 0xc9, 0xe5, 0x80, 0x96, 0x40, 0x36, 0xc2, 0xf1, 0xf1, 0x18, 0x46, + 0x18, 0xda, 0x31, 0x4c, 0x0b, 0xd1, 0x52, 0xf7, 0xcd, 0xe8, 0x53, 0xe5, + 0x8a, 0x61, 0x09, 0x1c, 0xa7, 0x46, 0x69, 0xb0, 0xa4, 0xf0, 0x83, 0x39, + 0x28, 0x88, 0x3c, 0x4d, 0x01, 0x43, 0x43, 0x23, 0x58, 0xbd, 0x06, 0x85, + 0x9e, 0x02, 0x63, 0xc7, 0x15, 0x38, 0xbd, 0x10, 0x7c, 0x47, 0xd0, 0x98, + 0x9e, 0xbb, 0x2c, 0x09, 0x41, 0x4f, 0x21, 0x00, 0x4b, 0x8e, 0xfb, 0xd0, + 0x63, 0x31, 0x38, 0xf8, 0x36, 0x98, 0x50, 0xe0, 0x2c, 0x80, 0x2d, 0x83, + 0x0f, 0xb2, 0x7d, 0xe2, 0x0e, 0xb6, 0x0c, 0x3e, 0xc8, 0xc4, 0xc4, 0xb7, + 0x19, 0x1c, 0x7c, 0x1b, 0x13, 0x13, 0xdf, 0x06, 0x40, 0x0c, 0x19, 0x09, + 0xe8, 0x94, 0x9c, 0x92, 0x1c, 0x98, 0xdc, 0xc3, 0x58, 0xd5, 0x86, 0x2b, + 0x15, 0x90, 0x4a, 0xf4, 0x09, 0xdc, 0x27, 0x1c, 0xb0, 0x15, 0x0c, 0xea, + 0x9f, 0x27, 0x14, 0x10, 0x2f, 0xdc, 0xbe, 0x65, 0xb0, 0x9f, 0xc7, 0xbe, + 0xdc, 0x3e, 0x82, 0x18, 0x9e, 0x8f, 0xd4, 0x2f, 0x28, 0xf9, 0x36, 0x1b, + 0x56, 0x6d, 0x60, 0xe3, 0x83, 0x1b, 0x31, 0xa4, 0xc0, 0xf2, 0x2d, 0x86, + 0x73, 0x23, 0x8c, 0x3d, 0x5b, 0x61, 0xc3, 0x1d, 0xdb, 0xd9, 0x7c, 0x38, + 0xae, 0x97, 0x47, 0x60, 0xac, 0x21, 0x03, 0x39, 0xee, 0xf3, 0xdd, 0x9e, + 0x49, 0x7e, 0xde, 0x1c, 0xe0, 0x9d, 0x01, 0xc0, 0xeb, 0x6d, 0x4b, 0x7e, + 0x16, 0x20, 0x3a, 0xd6, 0xc3, 0xd1, 0x2f, 0x60, 0x2a, 0xbe, 0x2e, 0xd1, + 0x27, 0xb0, 0x7d, 0x9b, 0xe1, 0xf2, 0x08, 0x07, 0x9e, 0xd8, 0x03, 0xfd, + 0x22, 0x82, 0x67, 0x85, 0x5b, 0x1e, 0x78, 0x0f, 0xe2, 0xcb, 0xdf, 0x42, + 0x8e, 0xdf, 0x02, 0x43, 0x0f, 0xc7, 0x20, 0x2e, 0x1d, 0x5a, 0x76, 0x46, + 0x72, 0xe6, 0xdb, 0x27, 0x22, 0xa0, 0x16, 0x10, 0xc1, 0xb2, 0x5e, 0xfe, + 0xfe, 0x0b, 0x89, 0x74, 0x9c, 0x39, 0xa7, 0xfc, 0x75, 0x02, 0x6a, 0x85, + 0xc7, 0x2f, 0xbd, 0xe2, 0xd0, 0xbf, 0x60, 0x29, 0xf0, 0x62, 0xdb, 0xfd, + 0xcb, 0x94, 0x29, 0x53, 0xa6, 0x4c, 0x99, 0x32, 0x65, 0xca, 0x94, 0x29, + 0x53, 0xa6, 0x4c, 0x99, 0x32, 0x65, 0xca, 0x94, 0x29, 0x53, 0xa6, 0x4c, + 0x99, 0x32, 0x65, 0xca, 0x94, 0x29, 0x53, 0xa6, 0x4c, 0xf3, 0x57, 0x06, + 0xd5, 0xca, 0x94, 0x29, 0x53, 0xa6, 0x4c, 0x99, 0x7e, 0x5c, 0x5a, 0x03, + 0x4d, 0xc6, 0xc8, 0x6b, 0xd3, 0xb3, 0x84, 0x10, 0x09, 0x60, 0x48, 0xf8, + 0x81, 0x6f, 0xf4, 0x51, 0x78, 0x17, 0xa8, 0x49, 0xc3, 0x6b, 0x87, 0x3e, + 0x01, 0x11, 0x48, 0x44, 0x87, 0x76, 0x85, 0xb6, 0xdc, 0xa9, 0xf8, 0x03, + 0xc7, 0xf0, 0xa3, 0x72, 0xb3, 0x68, 0x62, 0x17, 0x6d, 0x0e, 0x7d, 0xed, + 0x90, 0x4a, 0x4b, 0xe0, 0xd7, 0xea, 0xb3, 0x22, 0xb0, 0x96, 0x3b, 0xdd, + 0xa0, 0x31, 0xdd, 0x88, 0xc0, 0x5a, 0x85, 0xde, 0x42, 0x02, 0x30, 0x65, + 0xf6, 0xb5, 0x03, 0x7d, 0x4c, 0xd3, 0x84, 0xab, 0x47, 0xb1, 0xeb, 0xbb, + 0x91, 0x80, 0x7d, 0xdf, 0xbb, 0xf8, 0x66, 0xe5, 0x9b, 0x7c, 0xe0, 0x97, + 0x3f, 0x80, 0x94, 0x92, 0xbc, 0xc8, 0x93, 0x37, 0xd5, 0x47, 0xbf, 0x51, + 0xda, 0x0d, 0x23, 0x01, 0xa4, 0xd1, 0xe3, 0x48, 0x03, 0xad, 0xba, 0xc1, + 0xb2, 0x74, 0xf8, 0x96, 0xae, 0xbc, 0xa9, 0xec, 0xea, 0xf1, 0xe9, 0x71, + 0xa5, 0x21, 0x5f, 0x85, 0x9e, 0x02, 0xde, 0x1c, 0x53, 0x03, 0xc3, 0xb8, + 0x1c, 0x9a, 0xea, 0xb9, 0xae, 0x19, 0x86, 0xdf, 0x50, 0xe7, 0x16, 0x2f, + 0x37, 0x60, 0xbd, 0x03, 0xf7, 0xa9, 0x7b, 0x16, 0x4e, 0x56, 0x75, 0x53, + 0x1f, 0x3c, 0x46, 0x60, 0x2d, 0x0d, 0xa8, 0x05, 0xc1, 0x24, 0xd7, 0x60, + 0x55, 0xd4, 0x50, 0x72, 0x46, 0x2a, 0x3b, 0x61, 0x9a, 0xb5, 0x5a, 0x9d, + 0xf4, 0x25, 0x6e, 0xf8, 0x81, 0x7b, 0xea, 0x9b, 0x4a, 0xcb, 0x54, 0x90, + 0xab, 0xf4, 0x47, 0xef, 0xbe, 0x54, 0xd7, 0xeb, 0xa6, 0xef, 0x61, 0x9f, + 0x01, 0x2d, 0x28, 0x18, 0x42, 0x85, 0x4b, 0xc9, 0x9f, 0xf6, 0xb1, 0x07, + 0x4c, 0x05, 0xd3, 0x4a, 0xc9, 0x0e, 0x26, 0xed, 0x77, 0x0b, 0xeb, 0xf9, + 0x8d, 0x08, 0xa0, 0xe0, 0x78, 0x32, 0x9e, 0xa8, 0x9b, 0x53, 0xe9, 0xec, + 0x26, 0xdf, 0x97, 0xd8, 0x45, 0x23, 0x0a, 0x27, 0x3a, 0xd4, 0x68, 0xa3, + 0x89, 0xc1, 0xda, 0x04, 0x61, 0x39, 0xa3, 0xc2, 0x39, 0xf5, 0xf3, 0x9b, + 0x30, 0x26, 0x72, 0x2a, 0xce, 0xf0, 0x12, 0x04, 0x22, 0xbe, 0xad, 0xeb, + 0x1d, 0x16, 0x63, 0xc3, 0xd1, 0xc0, 0x66, 0x87, 0xf7, 0xda, 0xe8, 0xc9, + 0xe3, 0xcf, 0x74, 0x98, 0x08, 0x18, 0xac, 0x5a, 0x7b, 0x3e, 0x53, 0xc7, + 0xfd, 0x99, 0xd9, 0x7f, 0x87, 0x73, 0x9d, 0x37, 0x7a, 0xcc, 0x2e, 0x7e, + 0x4c, 0xdc, 0x29, 0x97, 0x82, 0xd1, 0x1d, 0xea, 0x95, 0x88, 0x67, 0x0e, + 0xf8, 0x50, 0x7a, 0xb5, 0xf2, 0x30, 0xff, 0x48, 0xef, 0x43, 0xe7, 0x15, + 0xda, 0xe5, 0x4c, 0x72, 0x35, 0xf8, 0xd9, 0xa0, 0x48, 0x7a, 0x5a, 0xd4, + 0x2a, 0xdd, 0xf1, 0xbb, 0xdc, 0x71, 0xe5, 0x74, 0xbf, 0x11, 0x5d, 0x67, + 0x78, 0x5e, 0xb6, 0x64, 0x04, 0x1e, 0x8c, 0xc2, 0x86, 0x93, 0xc3, 0xfd, + 0x06, 0x18, 0xc4, 0xef, 0x75, 0x30, 0x5b, 0x5a, 0x7f, 0xaf, 0x4b, 0x8b, + 0x4a, 0x38, 0x67, 0x1c, 0x6a, 0x4f, 0xb4, 0xc3, 0xc3, 0x74, 0x95, 0xaf, + 0x2a, 0x53, 0xbe, 0xaa, 0xcc, 0x92, 0xf2, 0x12, 0x6a, 0xcf, 0xd6, 0x22, + 0xc0, 0x96, 0x2e, 0x3d, 0x1d, 0x4b, 0xae, 0x5a, 0x82, 0xd5, 0x67, 0x31, + 0xfa, 0xa1, 0x51, 0x0e, 0x3d, 0x71, 0x08, 0x80, 0x1d, 0xf7, 0xed, 0xe8, + 0x6a, 0x3f, 0x84, 0x91, 0x8d, 0x5e, 0x3f, 0xca, 0xc1, 0x00, 0x8c, 0xb2, + 0xfd, 0xb3, 0xdb, 0xa3, 0xf3, 0xf7, 0xed, 0xb8, 0x8f, 0xda, 0x33, 0x35, + 0xfc, 0x73, 0xea, 0x9e, 0x85, 0xa0, 0x44, 0x19, 0xfc, 0xa2, 0xed, 0x7e, + 0x1b, 0xff, 0xac, 0xaf, 0xc0, 0x88, 0x12, 0x6a, 0x93, 0xed, 0xd7, 0x13, + 0x02, 0x1b, 0x8b, 0xa6, 0x99, 0xc8, 0x5e, 0x4c, 0xb3, 0x33, 0xf4, 0x2d, + 0xf4, 0x9f, 0x3e, 0x3f, 0x97, 0xff, 0xf9, 0xda, 0x0f, 0xc3, 0x74, 0x3a, + 0x3f, 0x5b, 0x1c, 0x22, 0x07, 0x46, 0x6f, 0xa7, 0x34, 0xc9, 0xb6, 0xf7, + 0xba, 0xf4, 0xee, 0x37, 0xc3, 0x86, 0x09, 0xb8, 0xbf, 0xc0, 0xe7, 0xef, + 0xbc, 0x33, 0x11, 0x66, 0x60, 0xd5, 0x2a, 0x56, 0xad, 0x5a, 0xd5, 0x35, + 0x6d, 0x93, 0x1a, 0x04, 0x6a, 0x40, 0x03, 0x6c, 0x0d, 0x00, 0x3b, 0x39, + 0x12, 0x41, 0xa0, 0x06, 0x34, 0x2c, 0xd5, 0x40, 0x00, 0xaf, 0xea, 0x06, + 0xaa, 0x7a, 0x75, 0x96, 0xf8, 0x42, 0x1d, 0x09, 0xd2, 0xf9, 0xaa, 0x96, + 0xbe, 0xc3, 0x87, 0x0f, 0x73, 0xf8, 0xf0, 0x61, 0x2e, 0x3a, 0x7c, 0x58, + 0xc5, 0xf3, 0xb1, 0x8f, 0x01, 0x31, 0xc4, 0x0b, 0x92, 0xf0, 0xab, 0x95, + 0xda, 0xfe, 0x24, 0x31, 0xd0, 0x2a, 0xad, 0x01, 0x6d, 0x9b, 0x06, 0x81, + 0xe9, 0xc7, 0x93, 0x1d, 0xdc, 0x43, 0x30, 0x56, 0x37, 0xbf, 0xd1, 0xf5, + 0x04, 0x2e, 0x93, 0xa9, 0xf3, 0x3a, 0xd0, 0x2b, 0xdc, 0x3f, 0xf2, 0x87, + 0x7f, 0xc8, 0xab, 0x13, 0x93, 0x7c, 0xec, 0xce, 0x38, 0xbe, 0x01, 0x62, + 0xc0, 0x56, 0x02, 0xa8, 0xb5, 0x61, 0x82, 0x12, 0x83, 0x50, 0x51, 0xcf, + 0x7a, 0xf1, 0x22, 0xe0, 0xb8, 0x03, 0x85, 0x38, 0x0f, 0x97, 0x77, 0xbf, + 0x8b, 0x0f, 0x74, 0xb8, 0xee, 0x1f, 0x95, 0x46, 0x7a, 0x4d, 0x9c, 0x19, + 0x1f, 0xbb, 0xc7, 0xc0, 0x30, 0x80, 0x19, 0xa8, 0x4c, 0x27, 0xf3, 0xf1, + 0x92, 0x61, 0x50, 0x9d, 0xf2, 0x29, 0xf7, 0xa9, 0xad, 0x13, 0xe4, 0x9f, + 0x07, 0x27, 0x5f, 0x2f, 0xac, 0xc1, 0xeb, 0xaf, 0xc6, 0x33, 0x15, 0x10, + 0x16, 0x4c, 0x6b, 0x60, 0xa0, 0xd6, 0xdc, 0xe5, 0x77, 0x57, 0xa0, 0xd6, + 0x71, 0x87, 0xc5, 0xcb, 0x6c, 0x78, 0x4e, 0x1d, 0x2e, 0x36, 0xf3, 0xf0, + 0xec, 0xa9, 0xc4, 0xb3, 0xbe, 0x60, 0x3d, 0x54, 0x81, 0x5b, 0x47, 0xa0, + 0x68, 0x2b, 0xb8, 0xd6, 0xfb, 0x47, 0xe2, 0x73, 0x87, 0x0f, 0xc5, 0xfb, + 0xd3, 0x1e, 0xf4, 0x25, 0xe3, 0x3b, 0x75, 0x38, 0x79, 0x4d, 0xf9, 0xf3, + 0xa5, 0xc9, 0xbc, 0x96, 0xfa, 0xd4, 0x1e, 0xf8, 0xf4, 0x3a, 0x18, 0xb0, + 0x15, 0x5c, 0xeb, 0xfa, 0xd1, 0xf8, 0xdc, 0x57, 0xf4, 0xf2, 0x2a, 0x86, + 0x56, 0xd6, 0xea, 0x5d, 0x20, 0xb3, 0x9a, 0xe6, 0xe3, 0x67, 0x3e, 0xfe, + 0xe6, 0x6b, 0x87, 0x67, 0x4f, 0xb1, 0xf8, 0xca, 0xc5, 0x10, 0xd4, 0x4d, + 0xa3, 0xf2, 0x7a, 0x9b, 0xa5, 0x66, 0x30, 0x86, 0xf5, 0x0b, 0x6d, 0x5f, + 0x4a, 0xa9, 0x20, 0xac, 0x0b, 0x00, 0x24, 0xfe, 0x59, 0x6d, 0x62, 0x94, + 0x0f, 0x96, 0x21, 0xd0, 0xab, 0xc8, 0x4e, 0x5d, 0x12, 0x57, 0x2f, 0x24, + 0xe1, 0x4c, 0xb5, 0xfa, 0x19, 0x87, 0xfb, 0x77, 0x7d, 0x01, 0x80, 0xcd, + 0x1b, 0x6e, 0x9f, 0x5f, 0x7a, 0x53, 0x0a, 0x61, 0x58, 0xf7, 0x7e, 0x6a, + 0x17, 0x00, 0x43, 0xcb, 0x93, 0x13, 0xdc, 0x8e, 0x1e, 0x3b, 0x8a, 0xa0, + 0xbd, 0x7c, 0xd3, 0x21, 0x5a, 0xb3, 0xda, 0xf7, 0x1a, 0x08, 0x33, 0xa8, + 0x07, 0xf9, 0x0d, 0x90, 0x50, 0x78, 0x06, 0x76, 0x1d, 0xbb, 0x07, 0x0f, + 0x58, 0xb1, 0x7c, 0x45, 0x22, 0x2e, 0x73, 0x60, 0xb4, 0xdd, 0x86, 0xdf, + 0x88, 0xc1, 0x5a, 0xbf, 0xb8, 0x8f, 0x6d, 0x7f, 0x7d, 0x13, 0xee, 0xe7, + 0x76, 0x50, 0xbd, 0xaa, 0x8c, 0xfb, 0xb9, 0x1d, 0xd0, 0xb7, 0x1a, 0x39, + 0x23, 0x11, 0xbd, 0xea, 0x26, 0xed, 0x18, 0x95, 0x6c, 0x3a, 0xa8, 0xb5, + 0x63, 0xa4, 0x04, 0x29, 0x23, 0x1b, 0x95, 0xb5, 0x1b, 0x19, 0xd9, 0xbf, + 0x53, 0x9d, 0x14, 0x22, 0x69, 0xeb, 0xaa, 0x51, 0xde, 0xfb, 0xb9, 0xbd, + 0xfc, 0xcd, 0x27, 0x6e, 0x6b, 0xbf, 0x98, 0x54, 0x79, 0x3d, 0xf2, 0xe6, + 0x12, 0xbf, 0x34, 0x01, 0xbf, 0x3d, 0xbf, 0xea, 0xec, 0x8f, 0x54, 0xaf, + 0x05, 0x74, 0x2a, 0xd4, 0xf7, 0x80, 0x9f, 0xbe, 0x78, 0x21, 0xff, 0x6f, + 0x00, 0xd2, 0xfa, 0x0f, 0x17, 0x2f, 0xe4, 0xc5, 0x57, 0xce, 0x72, 0xe9, + 0x6b, 0x64, 0x7f, 0x2e, 0xbd, 0x96, 0xd7, 0x32, 0x5f, 0xfd, 0xd2, 0x04, + 0x30, 0x58, 0x62, 0x6f, 0xf0, 0x1e, 0xa6, 0xcb, 0xeb, 0xa3, 0x4f, 0x40, + 0xf9, 0xfd, 0x50, 0x7b, 0xa6, 0x89, 0x5b, 0xf3, 0x19, 0x59, 0x73, 0x03, + 0x00, 0xa5, 0xab, 0x6c, 0x6a, 0xc7, 0xe2, 0x49, 0x69, 0xe5, 0x2b, 0xcb, + 0xb8, 0xcf, 0x9d, 0xc4, 0x34, 0x8d, 0xa8, 0x1d, 0xb0, 0x64, 0x15, 0x1c, + 0xda, 0x0b, 0xab, 0x6f, 0xbd, 0x8d, 0x83, 0xbb, 0x6b, 0x14, 0x87, 0x96, + 0xb0, 0xa4, 0xdc, 0xe4, 0xc0, 0x57, 0x9a, 0x0c, 0xaf, 0xc9, 0x33, 0x76, + 0x1c, 0xbc, 0xe7, 0x5c, 0x46, 0x7f, 0x73, 0x03, 0xde, 0xb4, 0xcb, 0xf0, + 0x8d, 0x82, 0xb1, 0x47, 0x25, 0x79, 0x21, 0xb0, 0xfa, 0x2d, 0x9c, 0x27, + 0x15, 0x50, 0x0b, 0xc0, 0x5e, 0x5a, 0x62, 0x68, 0x19, 0x8c, 0xd7, 0x2d, + 0x6e, 0xfa, 0xc4, 0x26, 0xf6, 0x6f, 0x0b, 0x80, 0x29, 0xd7, 0x5a, 0xac, + 0x58, 0x06, 0x7b, 0x1f, 0x11, 0xac, 0xb8, 0x15, 0xc6, 0x1f, 0xcd, 0xb3, + 0x7f, 0xf2, 0x14, 0x23, 0x2b, 0x56, 0xe3, 0x4c, 0x9e, 0x62, 0xe8, 0xc6, + 0x26, 0xce, 0x36, 0xd5, 0x5e, 0xb4, 0xfb, 0x8b, 0x38, 0x8c, 0x29, 0xc0, + 0xd6, 0xd1, 0x43, 0x8c, 0xdc, 0xbc, 0x82, 0x91, 0xa1, 0x26, 0x95, 0xba, + 0x4d, 0x53, 0x36, 0xa9, 0x3c, 0x96, 0x87, 0x62, 0x0c, 0xd3, 0x02, 0xa8, + 0x3c, 0x42, 0x04, 0xe5, 0x02, 0x18, 0xb9, 0x19, 0xf6, 0x6c, 0x23, 0x3a, + 0x76, 0x9c, 0x1a, 0x5f, 0xd8, 0xbd, 0x82, 0xdb, 0xd7, 0x83, 0x73, 0x06, + 0x4a, 0x36, 0xb8, 0xc7, 0x54, 0x1e, 0x23, 0x7a, 0x00, 0x19, 0x4f, 0x14, + 0x97, 0x2d, 0xe5, 0x26, 0x34, 0x37, 0xf5, 0xd0, 0x9b, 0x0a, 0x6e, 0x90, + 0x2a, 0x5f, 0xb5, 0x96, 0x31, 0xf9, 0x9c, 0xc4, 0x17, 0x01, 0x70, 0x2b, + 0x02, 0x81, 0x07, 0x27, 0x53, 0xe1, 0x0a, 0xad, 0x18, 0xd4, 0x26, 0x5b, + 0x5a, 0x7f, 0x56, 0x58, 0x5e, 0x9f, 0x56, 0x87, 0xfa, 0x7b, 0x7d, 0xfe, + 0x98, 0xcd, 0xd9, 0xf5, 0xd3, 0xbc, 0xf6, 0x36, 0x01, 0x6e, 0x0d, 0xb6, + 0x0f, 0xbd, 0x0e, 0xb6, 0x7f, 0x92, 0x34, 0x86, 0xaa, 0x56, 0xbd, 0x07, + 0x05, 0x20, 0x30, 0x39, 0x3f, 0xa0, 0x56, 0xfa, 0xbd, 0xd6, 0xdb, 0x5c, + 0xdf, 0x1b, 0x84, 0x4b, 0x26, 0x60, 0x44, 0x2b, 0xee, 0x2a, 0x4f, 0x83, + 0xbc, 0x5a, 0xc5, 0xb1, 0xba, 0xa8, 0x6a, 0x23, 0xeb, 0xd6, 0xdb, 0xd4, + 0x9e, 0x72, 0x18, 0xdb, 0xeb, 0x51, 0xf1, 0xe0, 0x12, 0xe0, 0xc3, 0x26, + 0x9c, 0x5c, 0xa6, 0xca, 0x9c, 0x25, 0xc7, 0x25, 0xf2, 0x36, 0x93, 0xc5, + 0xf8, 0x9c, 0x9a, 0xf0, 0x31, 0x6d, 0xc1, 0x92, 0x47, 0x24, 0x14, 0x25, + 0x27, 0x6d, 0x01, 0xb6, 0x60, 0x64, 0x4a, 0x52, 0xf1, 0xe0, 0x67, 0xdf, + 0xfb, 0x0e, 0xbe, 0xf4, 0xd5, 0x73, 0x8c, 0x08, 0x87, 0x42, 0x00, 0xd6, + 0xba, 0xa1, 0x08, 0x07, 0xea, 0x2a, 0xfe, 0x25, 0x45, 0x58, 0xb7, 0x1e, + 0x36, 0x7c, 0x12, 0xb6, 0xf7, 0x38, 0x34, 0xea, 0x0a, 0xe8, 0x75, 0x43, + 0x11, 0x4e, 0xd6, 0x15, 0x50, 0xcb, 0xf7, 0xa0, 0xd4, 0x0b, 0x56, 0x0e, + 0x0e, 0xae, 0xb5, 0xe1, 0x19, 0x87, 0xd1, 0xab, 0x62, 0xd0, 0xd6, 0x07, + 0xeb, 0x5b, 0x79, 0xee, 0x59, 0x58, 0x2f, 0x60, 0x64, 0x79, 0x91, 0x0f, + 0x1f, 0xab, 0xf3, 0xbe, 0xad, 0x45, 0xfe, 0xdc, 0x83, 0x4b, 0x3c, 0x60, + 0x2b, 0xac, 0x5f, 0x04, 0x23, 0xe6, 0x2d, 0x7c, 0xae, 0x0e, 0x7b, 0x8a, + 0xd0, 0xd6, 0x22, 0x2f, 0xc2, 0xbe, 0xdb, 0x6c, 0xf6, 0xec, 0x56, 0xf9, + 0x4b, 0xc5, 0x83, 0x11, 0xd3, 0x06, 0x1c, 0x2a, 0x1e, 0x7c, 0xef, 0x0d, + 0xe9, 0x00, 0x4a, 0xef, 0x7a, 0x73, 0x9c, 0x8e, 0x52, 0xc0, 0x04, 0x7b, + 0x78, 0x2b, 0xdc, 0xb2, 0x95, 0x08, 0xf0, 0x05, 0x28, 0x4a, 0xcd, 0xc3, + 0x5a, 0xc0, 0x7a, 0x6a, 0x3f, 0x3a, 0x57, 0x8c, 0xdd, 0x1f, 0x26, 0x02, + 0x6f, 0x3d, 0xbc, 0x15, 0xfe, 0x4e, 0x40, 0x69, 0x0a, 0x98, 0x42, 0xe5, + 0x01, 0xe9, 0x36, 0x97, 0xd6, 0x97, 0xb2, 0x67, 0x22, 0x09, 0x85, 0x3d, + 0x34, 0x7d, 0x3f, 0x85, 0xf7, 0x03, 0x4f, 0x11, 0x01, 0xb5, 0x42, 0xf8, + 0x95, 0x0e, 0xc1, 0x6a, 0xdb, 0xbf, 0x66, 0x24, 0x0a, 0xa7, 0x6b, 0xfc, + 0x89, 0x46, 0xc2, 0xef, 0x8e, 0xa7, 0xde, 0x45, 0x37, 0x8d, 0x3d, 0xe5, + 0x33, 0x7c, 0x8d, 0xc1, 0xf8, 0x13, 0x8d, 0x8e, 0x61, 0xc3, 0xf3, 0x43, + 0xcb, 0x0a, 0x11, 0x4c, 0x2b, 0xdc, 0x0f, 0xfb, 0x8f, 0x00, 0x86, 0xef, + 0x32, 0x39, 0x74, 0x5f, 0x0c, 0xbf, 0x02, 0x28, 0x3d, 0x22, 0xa9, 0x68, + 0x0f, 0x53, 0x07, 0x64, 0x95, 0x07, 0xd5, 0x0f, 0x3d, 0x84, 0x6c, 0x85, + 0xee, 0x40, 0x14, 0x3e, 0x0d, 0xd4, 0x0a, 0xb5, 0xf6, 0x6a, 0x1b, 0xe7, + 0x7a, 0xd8, 0xf5, 0x91, 0x0b, 0x87, 0x8d, 0xbe, 0xa6, 0x4a, 0xd5, 0xcd, + 0x56, 0x1b, 0x8b, 0x19, 0x99, 0x00, 0x0a, 0xe0, 0xb4, 0x1c, 0x8a, 0x14, + 0x19, 0x6f, 0x8d, 0x43, 0xab, 0x48, 0xa9, 0xaf, 0x84, 0x37, 0x25, 0x89, + 0x73, 0x8e, 0x7a, 0x64, 0xa6, 0x56, 0xdf, 0x8d, 0x21, 0x56, 0x20, 0x72, + 0x16, 0x79, 0x23, 0xee, 0x0f, 0x34, 0xc4, 0x6a, 0x7c, 0xa9, 0xda, 0x57, + 0xbe, 0x74, 0x30, 0x7c, 0x03, 0x43, 0xd8, 0xf8, 0xd2, 0xc1, 0xee, 0x2b, + 0x51, 0xd7, 0x80, 0x1b, 0xca, 0xdf, 0x6a, 0x05, 0xd6, 0x9a, 0x01, 0x5f, + 0x7a, 0x01, 0x64, 0x4b, 0x4f, 0xb0, 0xc5, 0xea, 0x2b, 0x46, 0xa9, 0x4e, + 0x96, 0xf0, 0xe5, 0x0e, 0xda, 0x6b, 0x38, 0x31, 0x50, 0xeb, 0xee, 0x35, + 0x5f, 0x05, 0x60, 0xdf, 0x13, 0xbb, 0xa0, 0x25, 0x02, 0xe0, 0x4f, 0xd0, + 0x67, 0xac, 0xf5, 0x29, 0x4a, 0xd4, 0x71, 0x27, 0xa5, 0x41, 0x57, 0x46, + 0xaf, 0xd5, 0x06, 0xc0, 0x12, 0x86, 0xc0, 0x32, 0xca, 0xb8, 0xbe, 0x82, + 0x52, 0xa7, 0xcf, 0x1b, 0xbd, 0x16, 0x96, 0x51, 0xc2, 0xf5, 0x6b, 0x89, + 0x30, 0xb3, 0xc5, 0x03, 0x12, 0xe9, 0x83, 0xd0, 0xba, 0x56, 0x8d, 0xde, + 0x02, 0x56, 0x4f, 0x19, 0x77, 0xa6, 0xaa, 0x85, 0xcb, 0x27, 0xca, 0x6b, + 0x39, 0xd3, 0x8c, 0x80, 0x5a, 0x40, 0x00, 0xd4, 0x52, 0xef, 0xe5, 0xc8, + 0x04, 0x30, 0xb8, 0x98, 0x3d, 0x1d, 0xf2, 0x70, 0x5d, 0x75, 0x60, 0x79, + 0xb0, 0xad, 0x07, 0x6e, 0x45, 0x3a, 0x83, 0xb1, 0x8a, 0x81, 0xdf, 0x63, + 0x1d, 0xdc, 0xeb, 0x29, 0xb7, 0xd0, 0xfd, 0x96, 0x5b, 0xa0, 0xf7, 0x61, + 0x78, 0xdf, 0xe3, 0x93, 0xfc, 0xf1, 0xe6, 0x01, 0x1e, 0x7f, 0x7c, 0x92, + 0xeb, 0xf8, 0xc9, 0xd3, 0x9f, 0xde, 0x09, 0x4b, 0x3f, 0xae, 0xf6, 0x07, + 0x36, 0xc2, 0xd4, 0xb1, 0x1f, 0x6b, 0x72, 0xce, 0x4f, 0xb3, 0xf4, 0x9b, + 0x85, 0x00, 0xad, 0xb8, 0x85, 0x10, 0xc3, 0xa2, 0x8c, 0x0e, 0xa0, 0xf1, + 0xa8, 0x1f, 0x3e, 0xb5, 0x15, 0xb9, 0x18, 0xd2, 0x2a, 0x72, 0xca, 0x9f, + 0x02, 0x10, 0x29, 0x38, 0x91, 0x02, 0x5a, 0x05, 0x8b, 0x3e, 0x84, 0x0b, + 0x23, 0x84, 0x61, 0x85, 0xc0, 0xf7, 0xfd, 0xb6, 0xfe, 0xff, 0x84, 0x7d, + 0x3d, 0xce, 0x16, 0x18, 0x46, 0x78, 0xac, 0x80, 0xb0, 0xbe, 0xef, 0x47, + 0xc0, 0x2c, 0xe5, 0xd7, 0x8f, 0xe2, 0x48, 0xdb, 0x0a, 0xc3, 0x19, 0x5d, + 0xc0, 0x77, 0x22, 0x97, 0xc7, 0x9f, 0x69, 0x04, 0xe9, 0x89, 0xdf, 0x19, + 0x75, 0x0d, 0x05, 0xa4, 0x6c, 0x22, 0x12, 0x63, 0x17, 0xea, 0x58, 0xca, + 0xa6, 0x4a, 0x5b, 0x30, 0x8e, 0x64, 0xf4, 0x28, 0xb7, 0x82, 0x61, 0xd1, + 0x6c, 0x49, 0xe4, 0x8c, 0xc4, 0xe8, 0x29, 0x20, 0x69, 0xb2, 0xe2, 0x7d, + 0x6b, 0x23, 0x9b, 0x72, 0x46, 0xe2, 0x7a, 0x27, 0x81, 0xa0, 0x7f, 0xbc, + 0x18, 0x5c, 0x47, 0x4e, 0x50, 0x9f, 0xac, 0x33, 0xb4, 0x74, 0x2d, 0xae, + 0xa7, 0x20, 0x2c, 0x76, 0x71, 0x18, 0xa7, 0x1e, 0xee, 0x8f, 0x70, 0xf4, + 0x6b, 0x7b, 0x59, 0xf1, 0xbe, 0xdb, 0x70, 0xea, 0x15, 0x05, 0x02, 0x4d, + 0xf5, 0x9b, 0xe9, 0xe3, 0x5c, 0xe1, 0xd8, 0x49, 0x01, 0xb5, 0x78, 0x8d, + 0x00, 0xdc, 0x1c, 0x94, 0x5a, 0x92, 0x5a, 0x78, 0x5f, 0x5a, 0x92, 0x02, + 0x74, 0xc1, 0x5f, 0x77, 0xe9, 0xec, 0x0a, 0x80, 0x5a, 0xe1, 0x22, 0x4d, + 0x79, 0xed, 0x3f, 0xc0, 0x10, 0x30, 0x0e, 0x8c, 0xb4, 0x60, 0x2c, 0x35, + 0x06, 0x78, 0x5b, 0x6f, 0x81, 0x03, 0x53, 0xaa, 0x4c, 0xcc, 0xe7, 0x24, + 0x4d, 0x09, 0xe4, 0x24, 0xf7, 0xff, 0xee, 0x01, 0x2c, 0xf7, 0x26, 0xa0, + 0xc9, 0xe6, 0xc7, 0x0c, 0x46, 0x67, 0x24, 0xfb, 0xa3, 0xe7, 0x03, 0x25, + 0xa0, 0xda, 0x6a, 0x62, 0x06, 0x69, 0xcd, 0x07, 0xf1, 0xcd, 0xa7, 0x2e, + 0x2b, 0x7a, 0x44, 0x02, 0x02, 0x96, 0xbe, 0x44, 0xaf, 0x05, 0xe9, 0x93, + 0xbb, 0x3e, 0xbf, 0x4b, 0x83, 0xc2, 0xa9, 0x71, 0xe4, 0x2a, 0xd5, 0x04, + 0x34, 0x6c, 0xff, 0x23, 0x7b, 0x82, 0xb6, 0x56, 0x3e, 0xbe, 0x2f, 0xb9, + 0x7c, 0x04, 0xd2, 0x6a, 0xd2, 0x24, 0xdf, 0x92, 0x80, 0xc4, 0x46, 0xe0, + 0xe4, 0x54, 0xba, 0x65, 0x4b, 0xdd, 0x3b, 0x0b, 0x18, 0x09, 0xc6, 0xba, + 0x7d, 0xe0, 0x64, 0x0b, 0x2c, 0x14, 0x50, 0x6b, 0x27, 0xb0, 0x37, 0xa7, + 0xae, 0x75, 0x5b, 0x0b, 0x3e, 0x4c, 0xfb, 0x38, 0x17, 0x1f, 0x01, 0x9f, + 0x31, 0x7a, 0x88, 0x17, 0x13, 0x09, 0x01, 0x4f, 0x6f, 0x7e, 0xab, 0x3a, + 0x7e, 0xa5, 0xf5, 0x2a, 0x17, 0xe7, 0x2e, 0x9a, 0xf7, 0xf6, 0x5f, 0x17, + 0x9e, 0x63, 0x41, 0x10, 0xee, 0xca, 0xab, 0xaf, 0xe1, 0xf4, 0xd3, 0x4f, + 0x81, 0x35, 0x3f, 0x3b, 0xee, 0x59, 0x45, 0x3c, 0xfa, 0xa7, 0x89, 0x33, + 0x09, 0x98, 0x56, 0xb8, 0xbf, 0xb4, 0xdc, 0x1f, 0x41, 0xb7, 0x3a, 0x85, + 0x0f, 0x41, 0x56, 0x40, 0x04, 0xa3, 0xd2, 0x01, 0x5a, 0xbc, 0xac, 0x80, + 0x54, 0x3a, 0xc8, 0x2a, 0x84, 0x53, 0xe9, 0xaa, 0x54, 0xd4, 0x02, 0x0a, + 0xa1, 0xfb, 0xac, 0x36, 0x03, 0x85, 0xf0, 0x2c, 0x5d, 0x0b, 0xac, 0x4b, + 0xa3, 0xf0, 0xa7, 0x03, 0x1b, 0xa1, 0x5b, 0x08, 0xc7, 0x0a, 0xb7, 0x11, + 0xb8, 0x8b, 0x17, 0x23, 0x40, 0x96, 0xee, 0xae, 0xa7, 0x67, 0x81, 0x75, + 0x69, 0x04, 0xd9, 0x0a, 0xed, 0x87, 0xfe, 0xce, 0xb9, 0x2f, 0x82, 0xf1, + 0x73, 0xf8, 0x8c, 0x61, 0x7c, 0x64, 0x18, 0x82, 0xb5, 0x79, 0xf4, 0x3c, + 0x7c, 0xc8, 0x96, 0x38, 0xa7, 0xab, 0x40, 0x99, 0x5d, 0x0f, 0xed, 0x67, + 0xed, 0xaa, 0x32, 0x05, 0x33, 0xfc, 0x26, 0x44, 0xe5, 0xb5, 0x21, 0x48, + 0x6b, 0xc9, 0xa2, 0x32, 0x27, 0x4f, 0x57, 0xb1, 0x0d, 0x01, 0x52, 0x80, + 0x19, 0x2c, 0xc0, 0x56, 0x14, 0x14, 0xb0, 0xa9, 0x4d, 0x2a, 0xb0, 0x56, + 0x6d, 0x52, 0xe5, 0x00, 0x85, 0x60, 0xc0, 0xc8, 0xa9, 0x3b, 0x80, 0xcd, + 0xae, 0x47, 0xf7, 0xb3, 0x76, 0x85, 0x02, 0x76, 0x6d, 0xb8, 0x51, 0x01, + 0xce, 0xdd, 0xe7, 0x04, 0xae, 0x5b, 0x8f, 0xa0, 0xfb, 0x9d, 0xe4, 0x85, + 0xfd, 0x0a, 0x81, 0x1f, 0xab, 0x5f, 0x32, 0xda, 0xaf, 0x80, 0x5a, 0xa1, + 0x04, 0xe0, 0xd7, 0x1b, 0x58, 0x03, 0x79, 0xaa, 0xb5, 0x71, 0xdc, 0xc9, + 0x26, 0xd6, 0x40, 0x1e, 0x8b, 0x02, 0xcd, 0x60, 0xc1, 0x34, 0x6b, 0x51, + 0xf0, 0x1d, 0xc2, 0x74, 0x8d, 0xc6, 0x34, 0x14, 0x82, 0xf6, 0x90, 0xe3, + 0xab, 0xf4, 0xda, 0xd8, 0x51, 0x77, 0xb1, 0x19, 0x7e, 0x8f, 0x93, 0x13, + 0x6d, 0xfd, 0x18, 0xb5, 0x29, 0x07, 0xcb, 0xb4, 0x54, 0x97, 0x32, 0xe0, + 0xbb, 0x5a, 0xbf, 0x47, 0x00, 0xce, 0x8b, 0x80, 0xe2, 0x2d, 0x22, 0x98, + 0x9e, 0x10, 0x02, 0x77, 0x46, 0x82, 0x28, 0xa8, 0x85, 0x0f, 0x7a, 0x2d, + 0x65, 0x5f, 0xe6, 0x41, 0x80, 0x7f, 0x56, 0x62, 0x2e, 0xb4, 0xa8, 0x4d, + 0x38, 0x94, 0x06, 0x55, 0x3b, 0x40, 0x18, 0x06, 0xcc, 0x48, 0x1a, 0x33, + 0x0d, 0x44, 0x2e, 0x5e, 0xfc, 0xcd, 0x36, 0x6c, 0xfc, 0x96, 0x8f, 0x30, + 0x0d, 0x2c, 0x13, 0xfc, 0xba, 0xa7, 0x72, 0x50, 0xbd, 0x2f, 0x25, 0x78, + 0xa7, 0x57, 0xb0, 0x82, 0x75, 0xcb, 0x36, 0x50, 0x5e, 0xa4, 0xfa, 0x96, + 0x65, 0x08, 0x7e, 0xd2, 0xfa, 0xb8, 0x9f, 0xc3, 0xe7, 0x0a, 0x0c, 0xb6, + 0x4f, 0xdc, 0x01, 0xc0, 0xaf, 0x4e, 0xac, 0x51, 0x27, 0x26, 0xe0, 0x4b, + 0x83, 0x8f, 0x91, 0x7f, 0xe3, 0x2d, 0x10, 0x70, 0xaf, 0x22, 0x80, 0x55, + 0x9f, 0x88, 0x07, 0xe8, 0xce, 0xc4, 0xa0, 0x2d, 0xfb, 0xd6, 0x12, 0x7f, + 0xfd, 0x85, 0x03, 0xbc, 0xf9, 0xe2, 0xce, 0xe3, 0x2d, 0x6b, 0x7e, 0xe5, + 0x86, 0x36, 0xb7, 0xf1, 0xaf, 0x7f, 0x0b, 0x80, 0x29, 0x2f, 0x30, 0xf8, + 0x77, 0x30, 0xf5, 0xaf, 0x55, 0x76, 0x3d, 0xaa, 0xfa, 0xac, 0x6e, 0x78, + 0xff, 0x3a, 0xc6, 0xaa, 0x95, 0xe8, 0x1a, 0xb6, 0x7c, 0x7e, 0x33, 0x52, + 0x28, 0x88, 0x96, 0xd0, 0xaf, 0x29, 0x00, 0x7b, 0x01, 0x7c, 0xd7, 0x9b, + 0xe4, 0x9d, 0xfc, 0x02, 0xdf, 0x3e, 0xf9, 0x2f, 0xbc, 0x6d, 0xc9, 0xcf, + 0xf2, 0xed, 0x93, 0xff, 0x02, 0xc0, 0xdf, 0x7e, 0xfd, 0x5b, 0x7c, 0x37, + 0x88, 0x47, 0x4e, 0x49, 0x08, 0x61, 0x5a, 0x01, 0x90, 0x4b, 0x4e, 0x49, + 0x5c, 0x19, 0x97, 0x62, 0x11, 0x48, 0x0b, 0xe0, 0x81, 0xf7, 0x24, 0xdd, + 0x87, 0x1e, 0x4e, 0x5c, 0x47, 0x04, 0x1e, 0x1b, 0xf7, 0x11, 0x43, 0x06, + 0x6f, 0xfa, 0x8e, 0xc1, 0xcb, 0xdf, 0x7f, 0x21, 0x01, 0xd6, 0x0a, 0xef, + 0x4b, 0xb8, 0x8d, 0x61, 0x59, 0x6a, 0x5f, 0xbf, 0x6f, 0x6f, 0x19, 0xec, + 0xa7, 0xfa, 0x8f, 0x4e, 0x14, 0xfe, 0xa5, 0x57, 0x1c, 0x7a, 0x79, 0x63, + 0xdb, 0x3b, 0x9d, 0x29, 0x53, 0xa6, 0x4c, 0x99, 0x32, 0x65, 0xca, 0x94, + 0x29, 0x53, 0xa6, 0x4c, 0x99, 0x32, 0x65, 0xca, 0x94, 0x29, 0x53, 0xa6, + 0x4c, 0x99, 0x32, 0x65, 0xca, 0x94, 0x29, 0x53, 0xa6, 0x4c, 0x99, 0xe6, + 0xaf, 0x0c, 0xaa, 0x95, 0x29, 0x53, 0xa6, 0x4c, 0x99, 0x32, 0xfd, 0xb8, + 0xf4, 0x18, 0x10, 0x7c, 0x9b, 0x96, 0x06, 0xc6, 0x44, 0x30, 0xad, 0x9e, + 0x2e, 0x1f, 0x1b, 0x6b, 0x7e, 0xa4, 0x94, 0x94, 0xae, 0x28, 0xe1, 0x4f, + 0x26, 0x27, 0xe5, 0x87, 0x30, 0x91, 0xf0, 0x83, 0xf4, 0x30, 0x8e, 0x70, + 0x92, 0x87, 0xd5, 0x67, 0x45, 0xe0, 0x28, 0xc3, 0x30, 0xf0, 0x3c, 0x8f, + 0xf1, 0x13, 0x6a, 0x95, 0xe3, 0x04, 0x50, 0xcb, 0x08, 0x56, 0x27, 0x17, + 0x22, 0x01, 0xd6, 0x02, 0x05, 0xd4, 0x6a, 0x68, 0xfb, 0x00, 0xde, 0x94, + 0x97, 0x00, 0x6b, 0x89, 0x9c, 0xe0, 0xfe, 0x7b, 0xf7, 0xb1, 0xf9, 0xee, + 0x9b, 0xe0, 0xea, 0xf5, 0x6c, 0xaa, 0xef, 0x46, 0xfe, 0xfe, 0xdf, 0x40, + 0x4b, 0xb2, 0xf3, 0x0f, 0x0e, 0x70, 0xfb, 0x7f, 0x8c, 0x51, 0x15, 0xf9, + 0xd4, 0xc7, 0x93, 0x21, 0xf4, 0x2a, 0x2f, 0xf2, 0x09, 0x40, 0x96, 0x0e, + 0xc3, 0x0a, 0xaf, 0x21, 0x04, 0x73, 0xe9, 0x7e, 0x42, 0xf8, 0x56, 0xf8, + 0xd1, 0x7d, 0xda, 0x7e, 0x1a, 0xa4, 0x15, 0xd9, 0x49, 0xd9, 0x6a, 0x68, + 0x13, 0x96, 0xc2, 0x8f, 0x28, 0xf5, 0xf4, 0x34, 0x66, 0x1a, 0x31, 0xe8, + 0x2b, 0x84, 0x41, 0x3d, 0x16, 0x07, 0x39, 0x75, 0xcc, 0x67, 0xf1, 0xfa, + 0xf8, 0x98, 0x9c, 0x44, 0xb6, 0x04, 0x05, 0x21, 0x90, 0x48, 0x8c, 0x5e, + 0x1b, 0x77, 0x2a, 0xf8, 0x78, 0xd3, 0x36, 0xb8, 0xfb, 0x3f, 0xef, 0x8c, + 0xbc, 0xee, 0x7f, 0x74, 0x3f, 0xb5, 0xa7, 0x6a, 0x88, 0x39, 0xd8, 0x4b, + 0xf9, 0x16, 0x34, 0xa2, 0x0f, 0x4c, 0xdb, 0xcf, 0x87, 0x90, 0xaa, 0x8e, + 0x60, 0x2c, 0xe9, 0x23, 0x10, 0x89, 0x70, 0x56, 0xf0, 0x7b, 0x69, 0xcc, + 0x74, 0xfe, 0x48, 0x3c, 0x84, 0x70, 0x89, 0x1e, 0xd1, 0x06, 0xd4, 0x8a, + 0xe2, 0xea, 0x02, 0x5e, 0xf2, 0xfd, 0x70, 0x42, 0x42, 0x01, 0xc7, 0x93, + 0x09, 0xb0, 0x94, 0xdd, 0x67, 0x40, 0x4b, 0x26, 0xc3, 0xe6, 0x04, 0xb4, + 0x64, 0x1c, 0xae, 0x47, 0x24, 0x80, 0x64, 0x89, 0x6b, 0x0b, 0x81, 0x44, + 0xe1, 0x44, 0x8c, 0x56, 0x1c, 0x1f, 0x42, 0xa8, 0xf8, 0xb4, 0x49, 0x16, + 0x21, 0xf8, 0xab, 0xe1, 0x07, 0x30, 0xf9, 0xf4, 0xff, 0xd2, 0x00, 0x00, + 0x20, 0x00, 0x49, 0x44, 0x41, 0x54, 0x85, 0xd4, 0x47, 0xb2, 0xbe, 0xaf, + 0x70, 0x43, 0xb3, 0xbd, 0x8b, 0xa7, 0x8e, 0x69, 0x69, 0xd5, 0xde, 0xeb, + 0x70, 0x02, 0xc4, 0xac, 0x8a, 0xc0, 0x5a, 0x17, 0xae, 0xee, 0xa0, 0xac, + 0xf3, 0xf3, 0x03, 0xe0, 0x4c, 0xcd, 0x7f, 0x22, 0x9e, 0xd1, 0x6b, 0xb4, + 0xc1, 0xb5, 0xba, 0xad, 0xb2, 0x9e, 0x17, 0x79, 0xfc, 0x69, 0x9f, 0xa6, + 0x6c, 0x26, 0x80, 0x5a, 0xa1, 0xd2, 0x2b, 0xb4, 0xeb, 0x13, 0x55, 0xe6, + 0xa3, 0xd0, 0x6f, 0xc1, 0x28, 0xcc, 0xb9, 0xf2, 0x7b, 0x5e, 0xe4, 0x91, + 0x52, 0xd2, 0xf0, 0x1b, 0x89, 0xbc, 0x2e, 0x71, 0x1d, 0x5d, 0x26, 0xc0, + 0x75, 0x7b, 0xaf, 0xa5, 0x94, 0x38, 0x75, 0x07, 0xab, 0xb7, 0x33, 0xc8, + 0x2f, 0x54, 0xf5, 0x99, 0x2a, 0xe5, 0xab, 0xca, 0x34, 0xa6, 0x1b, 0x8c, + 0x3d, 0x3d, 0xd6, 0xb6, 0x52, 0x73, 0x5a, 0x27, 0x9f, 0x39, 0xc9, 0x92, + 0xab, 0x96, 0xe0, 0x4e, 0xbb, 0x14, 0x7a, 0x0a, 0x34, 0x66, 0x1a, 0x11, + 0x38, 0xab, 0x9b, 0xac, 0x5e, 0x0b, 0xcf, 0xf3, 0xb0, 0x7a, 0x2d, 0xdc, + 0x69, 0x37, 0xe1, 0xbf, 0xfa, 0x74, 0x15, 0xd9, 0x94, 0xb8, 0xd3, 0x0d, + 0xac, 0xde, 0x42, 0xdb, 0xab, 0xed, 0x9e, 0x71, 0x03, 0xc0, 0x96, 0x60, + 0x64, 0xd9, 0x30, 0xd5, 0xd3, 0xda, 0xe4, 0x3a, 0x6d, 0x82, 0x13, 0xc4, + 0x93, 0x04, 0x93, 0x13, 0x9f, 0x62, 0x40, 0x59, 0xe8, 0x66, 0x9a, 0x26, + 0x9e, 0xe7, 0x25, 0xfc, 0x74, 0x52, 0x9b, 0x7f, 0xcd, 0x2d, 0x9a, 0x9c, + 0xa8, 0x4f, 0x54, 0xec, 0x60, 0x4f, 0x4f, 0x5f, 0xb7, 0x74, 0x45, 0xe7, + 0x0d, 0x23, 0xf6, 0x2f, 0x25, 0xa2, 0xc7, 0x40, 0xce, 0xf8, 0x51, 0xfe, + 0xa0, 0xbf, 0xd7, 0xb5, 0x6f, 0xbc, 0x44, 0x29, 0xf8, 0x48, 0x79, 0x60, + 0xd5, 0x2a, 0x26, 0x03, 0x28, 0xd5, 0xab, 0xa0, 0x00, 0x55, 0x1d, 0x20, + 0x57, 0x3a, 0xe8, 0x09, 0x42, 0xe0, 0x53, 0x12, 0x0c, 0x95, 0x76, 0x8f, + 0xc3, 0x4c, 0x46, 0x50, 0xab, 0x4e, 0x10, 0xab, 0xc1, 0x81, 0x4e, 0xae, + 0x49, 0xad, 0xfc, 0xc3, 0x3f, 0xe4, 0xc8, 0x9d, 0x77, 0xb6, 0xf9, 0x5d, + 0xb5, 0x6a, 0x15, 0x87, 0x83, 0x74, 0x0f, 0x0c, 0x0e, 0x32, 0x39, 0x31, + 0xc1, 0x91, 0x0e, 0x69, 0x0f, 0xd3, 0xb6, 0x91, 0x95, 0x11, 0xfc, 0x6b, + 0x20, 0x75, 0x9e, 0xe0, 0xfc, 0x91, 0x08, 0x79, 0xd5, 0x1e, 0x7e, 0x20, + 0xe5, 0xae, 0xdf, 0x13, 0xfd, 0x5c, 0x3a, 0x0d, 0xba, 0x7f, 0xe8, 0x0c, + 0xe4, 0x42, 0x3b, 0xa7, 0xc7, 0xf9, 0xea, 0xc4, 0x24, 0x17, 0x0d, 0x0e, + 0xb0, 0x32, 0x80, 0x80, 0x1d, 0x81, 0x44, 0xfa, 0x49, 0xd9, 0xa8, 0x7d, + 0xe3, 0xa5, 0x68, 0xff, 0xd4, 0x69, 0x58, 0x9c, 0xb2, 0x7f, 0xe0, 0x1b, + 0xdf, 0xe4, 0xa6, 0xe3, 0x0a, 0xae, 0x15, 0xea, 0xab, 0x63, 0x7f, 0xcf, + 0xf8, 0x27, 0x6f, 0x67, 0xfb, 0x89, 0x2a, 0x5b, 0x96, 0xaa, 0x89, 0x20, + 0xdb, 0x4f, 0x54, 0xb9, 0x10, 0x6d, 0x59, 0x5a, 0xee, 0x6a, 0xc7, 0x16, + 0x6a, 0xb2, 0x6e, 0xb9, 0x2f, 0xae, 0x27, 0x96, 0xfb, 0x0c, 0xca, 0x40, + 0x75, 0x4a, 0xfd, 0x46, 0xed, 0x1e, 0x03, 0xd1, 0x03, 0xe5, 0x1e, 0x23, + 0x82, 0x68, 0x8d, 0x04, 0xc0, 0xb8, 0x10, 0xbe, 0x35, 0x3a, 0x60, 0xce, + 0x0a, 0xd8, 0xd2, 0xe3, 0x0e, 0xd3, 0x33, 0xdf, 0x34, 0x5e, 0xe8, 0xb5, + 0x9d, 0x8f, 0xa4, 0x9e, 0x5b, 0xa5, 0x61, 0x59, 0xa1, 0x66, 0xe4, 0x9c, + 0x90, 0x97, 0x53, 0xa7, 0xb5, 0x7d, 0xaf, 0xd9, 0xf6, 0xac, 0x7f, 0x28, + 0xb9, 0x9e, 0x82, 0x6a, 0x45, 0xe9, 0xf1, 0x21, 0x3d, 0x89, 0x74, 0xa6, + 0x09, 0x5a, 0x39, 0x7b, 0xf4, 0xe8, 0x6b, 0x13, 0xb5, 0x79, 0xed, 0x3a, + 0xbc, 0x27, 0xf7, 0xcc, 0xed, 0x31, 0x15, 0x06, 0x68, 0x0f, 0x77, 0xba, + 0xaa, 0xa0, 0x5a, 0xf3, 0x90, 0xe3, 0xcc, 0xfd, 0x3c, 0xe7, 0xe3, 0xe7, + 0xb5, 0xb6, 0x05, 0xea, 0xf9, 0x46, 0xfb, 0xe9, 0x7a, 0xf8, 0x6b, 0x20, + 0xcf, 0x75, 0x21, 0x27, 0x2e, 0x18, 0x9c, 0x35, 0x1f, 0xc9, 0x60, 0x3a, + 0xe7, 0xd1, 0x63, 0xed, 0xef, 0xae, 0xc4, 0xeb, 0x08, 0xd6, 0x9a, 0x4b, + 0x63, 0x7e, 0x00, 0x79, 0xeb, 0x50, 0x45, 0x0f, 0x63, 0x39, 0x7a, 0x2c, + 0xf9, 0xc3, 0xf4, 0x26, 0x15, 0x50, 0xcd, 0x04, 0x4e, 0xfa, 0xe3, 0xf1, + 0x09, 0xcd, 0xc6, 0x7b, 0xdf, 0xa1, 0xc2, 0x54, 0x7e, 0xfd, 0xa3, 0xca, + 0x61, 0x4a, 0xc5, 0x23, 0xa7, 0x62, 0x3f, 0x3b, 0xde, 0xa1, 0xb6, 0xdd, + 0x6c, 0x8c, 0x8d, 0xbc, 0x5d, 0xed, 0x4c, 0x1e, 0xa4, 0xa2, 0xdb, 0x7a, + 0x46, 0xc5, 0xff, 0xde, 0x0d, 0x31, 0xd8, 0xed, 0xa4, 0x3f, 0x4e, 0x31, + 0x68, 0xeb, 0xea, 0xe5, 0x75, 0xe5, 0xa5, 0x1a, 0xbf, 0x84, 0x9a, 0x64, + 0x35, 0x1f, 0xf0, 0x53, 0xb7, 0xe6, 0x95, 0x1e, 0x56, 0xcc, 0xe1, 0x37, + 0x5d, 0xd3, 0x0f, 0x8f, 0xe7, 0x03, 0xea, 0x09, 0x6d, 0xce, 0x96, 0x4e, + 0x3d, 0xfe, 0xb4, 0x96, 0xbe, 0xfb, 0x17, 0x00, 0x18, 0x7b, 0xf2, 0xc5, + 0x59, 0xc3, 0xff, 0x7b, 0xb8, 0x96, 0x4e, 0xb6, 0xd2, 0xaa, 0xbc, 0x14, + 0xc3, 0x23, 0xf4, 0xf2, 0xba, 0xfa, 0x9c, 0xa4, 0xe1, 0xfb, 0x54, 0x9f, + 0x33, 0xa2, 0xba, 0x9e, 0xeb, 0xba, 0x58, 0x96, 0x05, 0x33, 0x35, 0xa4, + 0x11, 0xc6, 0x2f, 0xa2, 0x76, 0x97, 0x55, 0xb6, 0x83, 0xb8, 0x24, 0x27, + 0x9f, 0x15, 0x98, 0x96, 0x8d, 0xe7, 0xaa, 0xfc, 0x59, 0xd6, 0x1b, 0x8c, + 0xb5, 0x04, 0x9e, 0x53, 0x83, 0xe3, 0x4b, 0xc0, 0x03, 0x79, 0xce, 0x55, + 0xd0, 0xa0, 0x5e, 0x8b, 0xb1, 0x71, 0x09, 0x45, 0x68, 0x22, 0x31, 0x4d, + 0x4b, 0xb5, 0x0f, 0xfa, 0x82, 0xab, 0x6a, 0xc5, 0x29, 0x77, 0xa6, 0x74, + 0x14, 0x8e, 0xc5, 0xd1, 0xe3, 0x0a, 0xa2, 0x7d, 0xf4, 0x09, 0x2b, 0x02, + 0x4e, 0x49, 0xd9, 0xc4, 0xea, 0xb3, 0x19, 0x3f, 0x0a, 0xf6, 0xc0, 0x62, + 0xd6, 0xae, 0x69, 0xb2, 0xff, 0xb8, 0x0d, 0x8f, 0x02, 0x66, 0x13, 0xbb, + 0xbf, 0x08, 0x01, 0x7c, 0x6a, 0xed, 0x9a, 0x26, 0xf7, 0x7e, 0x36, 0xe8, + 0x33, 0xe8, 0xb3, 0xa9, 0x1c, 0x45, 0x01, 0xbc, 0x8e, 0x03, 0xe4, 0xa1, + 0xd5, 0x54, 0xe1, 0xc7, 0xa1, 0x72, 0x34, 0x00, 0x6a, 0xf5, 0xc5, 0xa0, + 0xae, 0x30, 0xac, 0x73, 0x62, 0x0c, 0xe7, 0x04, 0xac, 0xbe, 0xd9, 0x52, + 0x93, 0xbb, 0x67, 0xd4, 0xe4, 0xf2, 0x08, 0x54, 0x2d, 0x82, 0xc9, 0xfd, + 0x2d, 0xe2, 0xc9, 0xa0, 0xc4, 0x40, 0x2d, 0x91, 0x83, 0xa6, 0x76, 0x9d, + 0x63, 0x75, 0xb5, 0x3f, 0x5c, 0x94, 0x08, 0x24, 0xa2, 0xa5, 0x00, 0x91, + 0x4d, 0xad, 0xbc, 0x6e, 0xe6, 0x0c, 0xf2, 0x01, 0x18, 0x33, 0x76, 0xd7, + 0xea, 0xe5, 0xa9, 0x11, 0x2a, 0xbd, 0xbc, 0xd6, 0xdf, 0xeb, 0x7f, 0x6f, + 0xfa, 0x9f, 0x01, 0xae, 0xf5, 0x1b, 0x28, 0xb8, 0x16, 0x40, 0x58, 0xa3, + 0x7e, 0x33, 0xf0, 0xcf, 0xc0, 0x65, 0xc0, 0x77, 0x7a, 0x2e, 0x82, 0x99, + 0x57, 0xbb, 0x86, 0xd7, 0xdf, 0x6b, 0xbd, 0xcd, 0x75, 0xf8, 0x66, 0x05, + 0x8d, 0x5a, 0xb7, 0x5e, 0xbd, 0xab, 0x21, 0x40, 0x4a, 0x3c, 0x0d, 0xb2, + 0x18, 0xe7, 0x22, 0x7b, 0x76, 0x3b, 0xc8, 0x3a, 0x8c, 0x09, 0x05, 0xe0, + 0x5a, 0xb7, 0x5e, 0x85, 0xdb, 0x75, 0xa5, 0x6a, 0x97, 0xef, 0x39, 0xee, + 0x20, 0xf6, 0xaa, 0x12, 0x6e, 0x09, 0xea, 0x3c, 0xbf, 0xa7, 0xc2, 0x2d, + 0x39, 0x1e, 0xdb, 0x19, 0x31, 0x81, 0x7f, 0xfc, 0x07, 0xb6, 0x17, 0x43, + 0x1b, 0x0a, 0xa0, 0xb5, 0x67, 0xb7, 0xc3, 0x0d, 0x45, 0x58, 0x07, 0x84, + 0x35, 0xa6, 0x25, 0xc5, 0x38, 0xfd, 0x87, 0x7e, 0x4f, 0xc5, 0x67, 0xf5, + 0x41, 0x6d, 0x0a, 0x6a, 0xd3, 0x31, 0x08, 0x6c, 0xe4, 0xf7, 0x1d, 0x8c, + 0xab, 0x50, 0xd4, 0x97, 0x67, 0x60, 0xdf, 0x67, 0x94, 0xdf, 0x2b, 0x8e, + 0x6d, 0x65, 0x5d, 0xb0, 0xff, 0xe7, 0xcb, 0x8b, 0x11, 0x59, 0x66, 0xc4, + 0x84, 0x3f, 0x7f, 0x38, 0x79, 0x1d, 0x00, 0xfb, 0x3e, 0x43, 0x90, 0x9e, + 0xe4, 0xbd, 0x08, 0xfd, 0xec, 0xfb, 0x4c, 0xe8, 0xae, 0xec, 0x5c, 0x12, + 0xcc, 0xe9, 0x3f, 0x7d, 0x4a, 0xed, 0xbc, 0xeb, 0xcd, 0x70, 0xc9, 0xb4, + 0x4a, 0x1b, 0x28, 0xa0, 0x56, 0x6d, 0x1a, 0x76, 0x93, 0x64, 0x67, 0x41, + 0xe0, 0x70, 0x4b, 0xfa, 0xb8, 0x4e, 0x94, 0xc8, 0x30, 0x80, 0xee, 0x16, + 0xf9, 0x4d, 0x1d, 0xa7, 0x94, 0x68, 0x73, 0xbd, 0x0e, 0x75, 0xb3, 0x1f, + 0x95, 0xc6, 0x9e, 0xf2, 0x19, 0x5a, 0x56, 0x88, 0x60, 0x5b, 0x43, 0xcb, + 0x3a, 0x93, 0x3c, 0x37, 0x1c, 0xb4, 0x71, 0x7e, 0x17, 0xf2, 0x6b, 0x04, + 0xcd, 0xc7, 0x64, 0x04, 0xce, 0xa8, 0x06, 0x90, 0x7f, 0x1d, 0x8c, 0x55, + 0x9d, 0xf0, 0x22, 0xb0, 0x56, 0xa8, 0xb5, 0x9f, 0xfc, 0x73, 0x00, 0x76, + 0x7c, 0xf2, 0xbd, 0xed, 0xfe, 0xeb, 0x3e, 0xe5, 0x60, 0xa1, 0x81, 0x83, + 0x27, 0x6a, 0x8c, 0x5e, 0x60, 0x1e, 0x79, 0xff, 0x3d, 0x5f, 0xc5, 0x34, + 0x05, 0x9e, 0x27, 0x31, 0x4b, 0x4d, 0xc6, 0x0f, 0xab, 0x77, 0x62, 0xd7, + 0x23, 0x1f, 0x9d, 0x35, 0xdc, 0xdd, 0xf7, 0xec, 0xe4, 0xde, 0x6d, 0x1b, + 0xbb, 0x9e, 0xd7, 0xeb, 0x66, 0x87, 0xfc, 0x53, 0x8c, 0x74, 0x69, 0x75, + 0x35, 0x7c, 0x0f, 0x85, 0xfc, 0xe8, 0xdc, 0x77, 0x2c, 0x72, 0x05, 0x64, + 0xcb, 0xa5, 0x56, 0xdf, 0x4f, 0xa9, 0xb8, 0x9e, 0xbc, 0x61, 0x90, 0xc7, + 0xc0, 0xf0, 0xd7, 0x52, 0xf7, 0x15, 0x1e, 0x25, 0x6f, 0x58, 0xd4, 0xeb, + 0xaa, 0x8d, 0xd0, 0x98, 0x76, 0xa1, 0x55, 0x40, 0x47, 0xa2, 0x28, 0x88, + 0x96, 0x8a, 0x27, 0xde, 0x87, 0xa2, 0x71, 0x1b, 0x75, 0x7f, 0x2f, 0x00, + 0xf7, 0x3e, 0x5e, 0xe3, 0xee, 0xeb, 0x4a, 0xdc, 0xfb, 0xf8, 0x26, 0xca, + 0x03, 0x35, 0xee, 0x7d, 0x6c, 0x4b, 0x10, 0x7a, 0x3b, 0x77, 0xaf, 0x29, + 0x73, 0xef, 0x63, 0x55, 0x46, 0x17, 0xdd, 0xaf, 0xee, 0xcd, 0xe1, 0x7b, + 0x30, 0x72, 0x26, 0x46, 0xb4, 0x80, 0x43, 0x00, 0xd7, 0x6a, 0x09, 0x64, + 0x2e, 0xae, 0x0b, 0x84, 0xc0, 0xad, 0xf9, 0xa8, 0x1d, 0x80, 0x45, 0x04, + 0xd4, 0xea, 0x7e, 0x7e, 0x76, 0xa0, 0x7f, 0x90, 0xba, 0x54, 0x3c, 0xed, + 0x3e, 0x74, 0xa0, 0x16, 0xd0, 0xd6, 0xd6, 0x16, 0x6d, 0x7d, 0xda, 0xc9, + 0x5a, 0xe1, 0x21, 0xff, 0x54, 0xb4, 0xaf, 0xe7, 0xe1, 0x90, 0xcc, 0x21, + 0xea, 0x24, 0xdd, 0xeb, 0xda, 0xf9, 0xe5, 0xda, 0xb9, 0x63, 0x1d, 0xfc, + 0xd4, 0x35, 0x37, 0x48, 0x86, 0x2d, 0x02, 0x0f, 0x3f, 0xac, 0xdc, 0x3e, + 0x7e, 0x1d, 0x0c, 0xac, 0x5c, 0x09, 0xf7, 0xef, 0xe4, 0x71, 0x38, 0x6f, + 0xb0, 0xd6, 0xca, 0x8d, 0x70, 0x64, 0xe7, 0xdc, 0xfe, 0x2e, 0x54, 0x8f, + 0x3f, 0x0e, 0x3c, 0x10, 0x1e, 0x0d, 0xb0, 0xf1, 0x81, 0x49, 0xf8, 0xf8, + 0xdc, 0xe1, 0x36, 0x6e, 0x84, 0x9d, 0x1d, 0xd2, 0xb5, 0x92, 0xce, 0xfd, + 0x68, 0xaf, 0x97, 0x66, 0xef, 0x37, 0x13, 0xda, 0x56, 0xd5, 0xe4, 0x45, + 0xf0, 0x83, 0xf3, 0x67, 0xfc, 0x00, 0xbc, 0x15, 0xd4, 0x7d, 0x35, 0x18, + 0x91, 0x94, 0x3e, 0x42, 0x18, 0xf8, 0x33, 0xbe, 0x56, 0x17, 0x15, 0xf8, + 0xbe, 0x87, 0xe8, 0x31, 0x82, 0xb1, 0x20, 0x05, 0xbb, 0xf2, 0x7d, 0x4f, + 0x01, 0xa4, 0xb4, 0xc5, 0x33, 0xd2, 0xfd, 0xfd, 0xfa, 0x02, 0x39, 0x7a, + 0x5f, 0xbf, 0x1e, 0x2e, 0x0c, 0xe3, 0xcf, 0x84, 0x76, 0xa4, 0x06, 0xe4, + 0x0a, 0x17, 0xf8, 0x30, 0x10, 0x22, 0x4e, 0xb3, 0x1e, 0x6e, 0xae, 0x71, + 0x0a, 0x29, 0x25, 0x12, 0x3d, 0xae, 0x10, 0x1a, 0x96, 0x87, 0x00, 0x9c, + 0xa5, 0xfc, 0x35, 0x13, 0x61, 0x84, 0xc8, 0x2b, 0xb0, 0x96, 0xdf, 0xc0, + 0x0f, 0x01, 0x42, 0x2d, 0x22, 0xf8, 0x96, 0x9c, 0x91, 0x14, 0x0c, 0x03, + 0xd7, 0x77, 0xb1, 0x4c, 0x1b, 0x6f, 0xca, 0x81, 0x9c, 0xc0, 0x34, 0x2d, + 0xe4, 0x8c, 0xec, 0x08, 0xd3, 0x0a, 0xe5, 0x7a, 0x63, 0x89, 0xe3, 0x70, + 0xbf, 0x3e, 0xa9, 0xf2, 0x40, 0xa7, 0x5e, 0x51, 0x6e, 0x46, 0x11, 0x48, + 0xd6, 0xc3, 0xf5, 0x71, 0x2e, 0x82, 0xb6, 0x41, 0x03, 0xb5, 0x0d, 0xef, + 0x71, 0x2d, 0xa7, 0xdd, 0x9f, 0x9c, 0xc0, 0x05, 0x35, 0x2e, 0x97, 0xca, + 0x4f, 0x64, 0x4e, 0x8d, 0xbb, 0xc9, 0x54, 0xbd, 0x5f, 0x8d, 0xe5, 0xc9, + 0x08, 0x3f, 0xa6, 0x83, 0xad, 0x8c, 0x1c, 0x54, 0x51, 0xbf, 0xac, 0x21, + 0x01, 0x63, 0x2d, 0xa8, 0x79, 0x0d, 0xe8, 0xd3, 0xca, 0x5e, 0x01, 0xf9, + 0x96, 0x8c, 0xda, 0x27, 0xcd, 0x96, 0x08, 0x80, 0x5a, 0x4a, 0xf7, 0xaf, + 0x71, 0xa9, 0x9d, 0x5e, 0x42, 0xf3, 0x89, 0x93, 0xc1, 0x79, 0x18, 0x93, + 0x6a, 0x7c, 0xc8, 0x03, 0x90, 0xcd, 0xe8, 0x27, 0xec, 0x41, 0x47, 0x88, + 0x70, 0xd8, 0x06, 0x42, 0x08, 0x05, 0x0f, 0xef, 0x11, 0xd0, 0xa3, 0x8d, + 0xe1, 0x07, 0x61, 0x0c, 0x04, 0x22, 0x17, 0x94, 0xf9, 0x02, 0x35, 0xde, + 0x90, 0x53, 0xf7, 0x25, 0x1c, 0x77, 0x94, 0x39, 0x05, 0x7a, 0xd6, 0x17, + 0x4d, 0x31, 0x68, 0x06, 0xf7, 0x2d, 0x9f, 0x5c, 0x30, 0xa6, 0xd5, 0x50, + 0xed, 0xcb, 0x20, 0x7d, 0xe1, 0x35, 0x3a, 0x28, 0x80, 0x6b, 0xd0, 0xba, + 0x62, 0xa7, 0x54, 0xd0, 0x2c, 0x50, 0xc0, 0xd7, 0x10, 0xb7, 0x7e, 0x37, + 0xb0, 0x31, 0xf8, 0x0b, 0x9f, 0x47, 0xa2, 0xf4, 0xd6, 0xc6, 0xb9, 0xf8, + 0x33, 0xe0, 0x23, 0xf1, 0xe1, 0xd9, 0xe7, 0x5f, 0x65, 0x64, 0xe4, 0x1a, + 0x2a, 0x95, 0x0a, 0x0b, 0x2d, 0xb5, 0x3a, 0xc5, 0xc5, 0xb9, 0xf3, 0xdf, + 0x9e, 0x73, 0x5f, 0xe4, 0xa5, 0x97, 0xe1, 0xf4, 0xd9, 0xa7, 0xf8, 0x81, + 0x35, 0x33, 0xef, 0x70, 0x21, 0x30, 0xeb, 0xad, 0x83, 0xfd, 0x30, 0xa1, + 0x68, 0x3e, 0xee, 0x0c, 0x58, 0x3d, 0x2a, 0x7d, 0xff, 0x34, 0x71, 0x06, + 0x6b, 0x61, 0x2f, 0xd6, 0xc2, 0x5e, 0xbe, 0xf3, 0xdd, 0xa9, 0xb6, 0xf0, + 0x0b, 0xac, 0x4b, 0x23, 0x48, 0x55, 0x1a, 0xb0, 0xa5, 0x43, 0xb0, 0xce, + 0xb9, 0x2f, 0x26, 0x00, 0x59, 0x2f, 0xbe, 0x7c, 0x8e, 0x4b, 0x89, 0xfb, + 0x57, 0x42, 0x77, 0xa0, 0xab, 0x4d, 0x20, 0xb2, 0x19, 0xba, 0x87, 0xfb, + 0x91, 0xbb, 0x66, 0x73, 0x81, 0x75, 0x29, 0x97, 0x5b, 0x24, 0xc2, 0x87, + 0x71, 0x3d, 0xff, 0xfc, 0xf3, 0x09, 0xbf, 0xe9, 0xb4, 0x86, 0x6e, 0xd1, + 0xb5, 0xf0, 0x62, 0x04, 0x07, 0x0b, 0xc3, 0x9d, 0x73, 0x5f, 0x64, 0x81, + 0x75, 0x69, 0x10, 0xee, 0xe7, 0xe2, 0xe7, 0x1b, 0x48, 0xcf, 0xc3, 0xc7, + 0x1d, 0x11, 0x6c, 0x6b, 0xb8, 0xd2, 0x61, 0xc7, 0x57, 0x1c, 0x2c, 0x11, + 0x00, 0x9d, 0x5a, 0x12, 0xd9, 0x23, 0xb0, 0x84, 0x8d, 0x15, 0xd4, 0x21, + 0x96, 0x2c, 0x2a, 0x6b, 0x29, 0x4e, 0x8e, 0x83, 0x96, 0x82, 0xbe, 0xe4, + 0x92, 0xd6, 0xa7, 0x3c, 0xee, 0xa8, 0x77, 0xe4, 0x50, 0x4d, 0xc1, 0xc9, + 0x96, 0xbc, 0x7f, 0x5d, 0x74, 0xae, 0xf2, 0xc8, 0x3e, 0x44, 0x4e, 0x60, + 0xd9, 0xe0, 0x3a, 0x30, 0x3e, 0xed, 0x20, 0x7a, 0x0c, 0x46, 0x28, 0x46, + 0x63, 0xfc, 0xa3, 0xd7, 0xd8, 0x54, 0x9d, 0x06, 0x6b, 0x97, 0xc5, 0xf1, + 0xba, 0x67, 0x04, 0x56, 0xbf, 0xe4, 0xa6, 0x3b, 0x86, 0xd8, 0xf7, 0xe0, + 0x78, 0xdc, 0xcf, 0xd4, 0xf0, 0x70, 0x27, 0x4d, 0x8c, 0xb3, 0x3e, 0x8e, + 0xef, 0x50, 0x7b, 0x16, 0x36, 0x5d, 0x3f, 0xc2, 0x58, 0xcd, 0xc7, 0x00, + 0x9a, 0x67, 0x7d, 0x4e, 0x0d, 0x36, 0xc9, 0xf7, 0xe6, 0x91, 0x7e, 0x13, + 0x7a, 0xf3, 0x34, 0xa7, 0xb5, 0xbe, 0xe3, 0xe9, 0x53, 0x2c, 0xb9, 0x6a, + 0x09, 0xb4, 0x04, 0x7e, 0x4b, 0xe2, 0xbb, 0xb5, 0xe0, 0x4b, 0xda, 0x14, + 0xb0, 0xd1, 0xcc, 0x63, 0x58, 0x02, 0xd9, 0x90, 0xd1, 0x62, 0x0c, 0x89, + 0x71, 0xed, 0x06, 0xf1, 0x17, 0xb8, 0x39, 0x89, 0x51, 0x10, 0xc8, 0x73, + 0x12, 0xb1, 0xc0, 0x80, 0x69, 0x10, 0xad, 0x26, 0x32, 0xc8, 0x33, 0xec, + 0x62, 0x09, 0x51, 0x88, 0xc3, 0xf9, 0xb2, 0x81, 0x94, 0x92, 0xda, 0x54, + 0x0d, 0x81, 0x81, 0xdf, 0xf0, 0x41, 0x82, 0x61, 0x19, 0x54, 0x6b, 0x55, + 0x44, 0xde, 0x80, 0x1e, 0xf0, 0x7b, 0x7c, 0x98, 0x81, 0x82, 0xcc, 0x63, + 0xf6, 0x9a, 0xc8, 0xab, 0x2c, 0xc6, 0x38, 0x10, 0x3d, 0x5f, 0x20, 0xf1, + 0x4e, 0x97, 0x17, 0x95, 0xd8, 0xf8, 0xe0, 0x46, 0x76, 0xde, 0x11, 0x54, + 0x28, 0xfa, 0x05, 0xa7, 0xbe, 0xff, 0x29, 0x40, 0x01, 0xb5, 0x00, 0xb6, + 0x0c, 0x3e, 0xc8, 0xf6, 0x89, 0x3b, 0xa2, 0x63, 0x80, 0x2f, 0x1b, 0x3f, + 0xc5, 0xff, 0xfd, 0xc6, 0x5b, 0x14, 0xb4, 0x2a, 0x00, 0x46, 0xd1, 0x2f, + 0x10, 0xfd, 0x42, 0x41, 0xa5, 0x56, 0x18, 0xf0, 0xac, 0xb2, 0x17, 0xc2, + 0xa7, 0xdc, 0x27, 0x1c, 0x06, 0x2e, 0x2e, 0xf3, 0x96, 0xc1, 0x7e, 0xfa, + 0xcc, 0x78, 0x34, 0x6e, 0xe8, 0x3d, 0xbf, 0xc0, 0x5c, 0xea, 0x33, 0x07, + 0x98, 0xf2, 0x26, 0x79, 0xcb, 0x60, 0x3f, 0x4c, 0xc0, 0x3b, 0xcb, 0x4b, + 0xa0, 0x0a, 0x7b, 0x8e, 0xef, 0x42, 0xf4, 0x09, 0x05, 0xd3, 0x1a, 0x00, + 0xbb, 0xd7, 0xc6, 0x9f, 0xa9, 0x45, 0x71, 0x86, 0xa0, 0xaf, 0x48, 0x8b, + 0xd4, 0xe6, 0x6f, 0xbf, 0xfe, 0x2d, 0xde, 0xf9, 0x9e, 0x5f, 0x48, 0x00, + 0xb5, 0x12, 0xcf, 0x52, 0xbb, 0xa6, 0xd0, 0x0e, 0xfd, 0x02, 0x8e, 0xce, + 0xa3, 0x16, 0xff, 0xc0, 0x7b, 0xa8, 0x2f, 0xdf, 0x4a, 0xf1, 0xaa, 0x78, + 0x61, 0x0a, 0x39, 0xee, 0x23, 0xfa, 0x84, 0xb2, 0x0b, 0x9c, 0xfd, 0x5f, + 0x7c, 0xe8, 0xff, 0x19, 0xce, 0x8c, 0xab, 0x52, 0xad, 0xff, 0x7f, 0xa8, + 0x72, 0x3a, 0x04, 0x67, 0xbd, 0x65, 0xb0, 0x9f, 0x7f, 0x9e, 0x50, 0x61, + 0x43, 0xa0, 0x96, 0x0e, 0xd6, 0xfa, 0xe7, 0x20, 0xef, 0x4b, 0x02, 0xca, + 0x82, 0xfc, 0x41, 0x7b, 0xa7, 0x33, 0x65, 0xca, 0x94, 0x29, 0x53, 0xa6, + 0x4c, 0x99, 0x32, 0x65, 0xca, 0x94, 0x29, 0x53, 0xa6, 0x4c, 0x99, 0x32, + 0x65, 0xca, 0x94, 0x29, 0x53, 0xa6, 0x4c, 0x99, 0x32, 0x65, 0xca, 0x94, + 0x29, 0xd3, 0xfc, 0x95, 0x41, 0xb5, 0x32, 0x65, 0xca, 0x94, 0x29, 0x53, + 0xa6, 0x1f, 0xa3, 0xf2, 0x0c, 0x03, 0xf1, 0x07, 0xb8, 0xa0, 0xe0, 0x3d, + 0xa2, 0x47, 0x7d, 0xa0, 0x9b, 0x06, 0xd6, 0xa4, 0x25, 0x84, 0xc0, 0xe8, + 0x35, 0x62, 0x78, 0x54, 0x30, 0x79, 0xdf, 0xd0, 0x56, 0x71, 0x17, 0x39, + 0xe5, 0x27, 0x0d, 0x1e, 0x71, 0xa7, 0xdc, 0xe8, 0x58, 0xff, 0xe8, 0x3c, + 0xb4, 0x1b, 0xda, 0x69, 0xb6, 0x9a, 0xf8, 0xbe, 0x1f, 0xfb, 0x99, 0x52, + 0x40, 0xa9, 0x70, 0x42, 0x8f, 0xd5, 0x5b, 0xc0, 0x9d, 0x6e, 0x44, 0x90, + 0x16, 0x5d, 0xc3, 0x4b, 0xd7, 0x72, 0xf2, 0x99, 0x83, 0xc8, 0x16, 0xec, + 0xfb, 0xd3, 0x7d, 0xdc, 0xf4, 0x6b, 0x0a, 0xac, 0xb5, 0x01, 0x10, 0xbf, + 0xf5, 0x5e, 0x6c, 0x60, 0xa7, 0x84, 0xcd, 0x9e, 0x4b, 0x27, 0x85, 0xe0, + 0x2a, 0x1d, 0xa2, 0x15, 0x42, 0xaf, 0x42, 0x77, 0xc3, 0x30, 0x12, 0xc7, + 0x3a, 0x28, 0x4c, 0x0f, 0xef, 0xfb, 0x3e, 0x7e, 0x97, 0x89, 0x3a, 0xa1, + 0xff, 0xd0, 0x4e, 0xb8, 0xe2, 0x27, 0x80, 0x89, 0x49, 0xa1, 0xb7, 0x80, + 0x37, 0xed, 0x51, 0x0a, 0x56, 0xc2, 0x64, 0x5a, 0x44, 0xfe, 0xc2, 0x0f, + 0xa9, 0x45, 0x8f, 0x5a, 0x55, 0xdb, 0x23, 0x7e, 0xae, 0x09, 0xed, 0x56, + 0x1f, 0xbe, 0xad, 0x5e, 0x65, 0x73, 0xf0, 0x70, 0x2d, 0xfa, 0x14, 0xd3, + 0xe8, 0x4d, 0x82, 0x0b, 0xfc, 0xb3, 0xfb, 0xd9, 0xff, 0xa8, 0xda, 0x1f, + 0x1b, 0x1f, 0x63, 0xf1, 0x40, 0x9d, 0x75, 0xbf, 0x09, 0xfb, 0x1e, 0x29, + 0xa3, 0x4f, 0x31, 0x0e, 0x7f, 0x23, 0xa1, 0x1a, 0x33, 0x01, 0x50, 0x2a, + 0x05, 0x68, 0x9a, 0x0d, 0xa6, 0x05, 0xe0, 0x4f, 0xfb, 0x31, 0x30, 0x2a, + 0x30, 0x6f, 0xf5, 0x1a, 0x31, 0xa0, 0xab, 0x13, 0x50, 0x6b, 0xda, 0x87, + 0x9e, 0x60, 0x62, 0x72, 0x17, 0x75, 0x8d, 0xcf, 0x97, 0x51, 0x7c, 0xe9, + 0x0f, 0xd4, 0xed, 0x3e, 0x63, 0x56, 0x10, 0x57, 0x1a, 0x6c, 0x25, 0x5b, + 0x0a, 0x8a, 0xd5, 0x06, 0xe0, 0x4a, 0x85, 0xa3, 0x03, 0x34, 0xa9, 0x53, + 0x7c, 0x9d, 0x80, 0x5a, 0x04, 0x40, 0x13, 0x5d, 0xe1, 0x3d, 0x65, 0x8a, + 0xe8, 0xb9, 0xea, 0xd2, 0x9f, 0xbf, 0x3f, 0xd3, 0xec, 0xb8, 0x9f, 0x56, + 0x18, 0x87, 0x0c, 0x7e, 0x7b, 0xfe, 0x8c, 0x07, 0x3d, 0x5d, 0xbd, 0x27, + 0xd3, 0x39, 0x0f, 0x58, 0xd6, 0x6c, 0x7e, 0x8c, 0x1e, 0x33, 0x01, 0x23, + 0xea, 0x06, 0x86, 0x6a, 0xf8, 0x8d, 0xc4, 0xf1, 0x5c, 0xf9, 0x53, 0x22, + 0x8e, 0x5e, 0x23, 0xfa, 0xbd, 0xfa, 0xd3, 0x7e, 0x0c, 0xf9, 0x0b, 0x26, + 0x99, 0xa4, 0x27, 0xa5, 0xe8, 0xef, 0xfc, 0x6c, 0x4a, 0x4f, 0x6a, 0x49, + 0x83, 0xb9, 0x3a, 0x29, 0xcc, 0xdf, 0x0a, 0x46, 0x61, 0xce, 0x78, 0x74, + 0x1b, 0xb3, 0xbd, 0xd7, 0x56, 0xaf, 0x85, 0x53, 0x77, 0xa2, 0xf7, 0x32, + 0xfa, 0x8d, 0x07, 0xd7, 0xec, 0x4e, 0xab, 0x3c, 0xce, 0x9f, 0xf6, 0xb1, + 0xfb, 0xed, 0x08, 0x42, 0x28, 0x08, 0xc0, 0x7a, 0x5a, 0x9e, 0xed, 0x79, + 0x3e, 0x42, 0xa8, 0x55, 0x9c, 0xc3, 0x7b, 0x5c, 0xe8, 0x29, 0x50, 0xa7, + 0x4e, 0xb9, 0x5c, 0x66, 0xef, 0x83, 0x7b, 0xb9, 0xed, 0x8e, 0xdb, 0xd8, + 0xfb, 0xa0, 0x9a, 0xfc, 0x32, 0xb2, 0x7c, 0x84, 0xc6, 0x4c, 0x03, 0x67, + 0xd2, 0x89, 0x00, 0x5a, 0xa6, 0x69, 0xe2, 0x4c, 0x38, 0x08, 0x21, 0x58, + 0x52, 0x5e, 0xa2, 0xd2, 0x10, 0xe6, 0xf9, 0xc1, 0x8a, 0xe9, 0xee, 0x74, + 0x83, 0xd1, 0x0f, 0x8d, 0x70, 0xf0, 0x2f, 0x2b, 0xd1, 0x2a, 0xcc, 0x56, + 0x5f, 0x41, 0xf9, 0x13, 0x30, 0xf6, 0x54, 0x15, 0xe9, 0xfb, 0x6a, 0x45, + 0x64, 0xc0, 0x9f, 0xf6, 0xa2, 0x7d, 0x20, 0x3a, 0xa7, 0xff, 0x76, 0xc2, + 0xfd, 0x8e, 0x6e, 0x61, 0x19, 0xa2, 0xd9, 0xe8, 0x78, 0xcf, 0x35, 0x1b, + 0xe9, 0x30, 0xd2, 0xf7, 0xc1, 0x30, 0x12, 0xe9, 0x4a, 0xc7, 0x19, 0x86, + 0xd1, 0x9f, 0xbe, 0x44, 0x41, 0xb4, 0x12, 0xd7, 0x90, 0xfa, 0xad, 0x48, + 0xe9, 0xc5, 0x93, 0xae, 0x3a, 0xbc, 0xd7, 0xec, 0x52, 0x2b, 0xb5, 0x4f, + 0x1e, 0x3e, 0xcc, 0xc0, 0xaa, 0x55, 0xfc, 0xe6, 0xe1, 0xc3, 0x5c, 0x34, + 0xcb, 0x75, 0xa4, 0xc1, 0x4f, 0xdd, 0xdc, 0x3a, 0x81, 0xa3, 0x42, 0xa5, + 0x27, 0xc8, 0xad, 0x0e, 0xc3, 0x0c, 0x0e, 0x32, 0x1f, 0xbd, 0xba, 0x6a, + 0x55, 0x47, 0xbf, 0x83, 0x03, 0x03, 0x4c, 0x74, 0x00, 0x81, 0x75, 0x4a, + 0xe7, 0x4e, 0x2d, 0x15, 0xed, 0x30, 0xb0, 0xf8, 0xbc, 0x7e, 0x6e, 0x25, + 0x03, 0x29, 0xcc, 0xd6, 0xdc, 0xf1, 0xcc, 0x06, 0xcb, 0xea, 0x04, 0xd4, + 0xea, 0xe4, 0x3f, 0xd4, 0x45, 0x83, 0x03, 0xbc, 0x3a, 0x31, 0xc9, 0xe0, + 0x45, 0xed, 0x60, 0xaf, 0x38, 0x8d, 0x81, 0x76, 0x75, 0xb8, 0x97, 0xcb, + 0x92, 0xcf, 0xff, 0xa6, 0xa3, 0xb0, 0x6f, 0x05, 0xf0, 0x8d, 0x6f, 0x46, + 0x6e, 0x37, 0x1c, 0x95, 0xc8, 0x00, 0x10, 0x35, 0x17, 0x28, 0x6a, 0xcb, + 0xb5, 0x45, 0xb6, 0x3f, 0x59, 0xef, 0x7a, 0x7e, 0xfb, 0x2c, 0x76, 0x42, + 0x60, 0x16, 0x28, 0x88, 0x96, 0x23, 0x25, 0xb6, 0x10, 0x0a, 0xac, 0xd5, + 0x67, 0x44, 0x60, 0xad, 0x6e, 0x1a, 0xe9, 0x35, 0x23, 0xb0, 0xd6, 0x6c, + 0xe9, 0xd0, 0xe3, 0xee, 0x94, 0x8e, 0xd9, 0xd2, 0xa8, 0x2b, 0x1d, 0xc7, + 0x85, 0x86, 0x03, 0x28, 0x5c, 0x31, 0x8c, 0xc8, 0x81, 0xef, 0x89, 0x08, + 0xec, 0xd2, 0x98, 0xac, 0x45, 0xd0, 0xcc, 0xb4, 0xe4, 0x8c, 0x84, 0x62, + 0x50, 0x7e, 0xe9, 0xe5, 0xb9, 0x01, 0x4c, 0x35, 0xdb, 0x9e, 0x2b, 0x00, + 0x57, 0xbe, 0x86, 0x58, 0xad, 0x23, 0xc1, 0x84, 0xe2, 0xa1, 0x21, 0x78, + 0xa2, 0x02, 0xef, 0x1f, 0x51, 0x60, 0xad, 0xb4, 0x66, 0x9a, 0x08, 0xa1, + 0x7e, 0x4b, 0x87, 0x8e, 0xbd, 0x1d, 0x21, 0x60, 0xe4, 0xda, 0xf8, 0x74, + 0xe5, 0x49, 0xb5, 0x2d, 0x9b, 0x75, 0xaa, 0x00, 0x1f, 0x5a, 0x8d, 0x31, + 0x55, 0xc2, 0x7f, 0x7a, 0x5f, 0xc7, 0x68, 0x2f, 0x04, 0xa8, 0x05, 0x1d, + 0x60, 0x5a, 0xa1, 0x3d, 0xa7, 0x8c, 0xf7, 0x57, 0x07, 0xe1, 0x83, 0xa3, + 0xf0, 0x95, 0x83, 0x70, 0xfd, 0xa8, 0x3a, 0x71, 0x7d, 0x70, 0x0c, 0x6c, + 0xfa, 0x1d, 0x95, 0x57, 0xee, 0x7a, 0xd0, 0x69, 0x03, 0x3d, 0x3a, 0x93, + 0x0e, 0xa6, 0xb9, 0x6e, 0x5e, 0x7e, 0xe6, 0x6b, 0x6b, 0xc3, 0x27, 0xe8, + 0xec, 0xa7, 0x25, 0x71, 0xea, 0x6e, 0xc2, 0xcf, 0x96, 0xcf, 0xd3, 0xf9, + 0xb9, 0x06, 0xf9, 0xfa, 0xae, 0xcf, 0x75, 0x6e, 0x73, 0xf0, 0xb5, 0x31, + 0x0c, 0x92, 0xed, 0x98, 0x86, 0x56, 0x92, 0xc4, 0x35, 0xa0, 0x02, 0x95, + 0x23, 0x3e, 0xa5, 0xbe, 0x8d, 0x58, 0x86, 0xcd, 0xdd, 0x7d, 0x60, 0x19, + 0xca, 0xf6, 0xc1, 0xe7, 0xc6, 0x69, 0xac, 0xfc, 0x1b, 0xaa, 0x01, 0x48, + 0xa7, 0xdc, 0x57, 0x4a, 0xec, 0xaf, 0xbe, 0x0d, 0xaa, 0x1f, 0xf9, 0x00, + 0x1b, 0x3e, 0x51, 0xa2, 0xe9, 0x28, 0x8b, 0x79, 0xbb, 0x90, 0xd8, 0x17, + 0xd7, 0xaf, 0x65, 0xc7, 0xbb, 0xef, 0xe1, 0xe4, 0xc7, 0x6c, 0xea, 0x7e, + 0xb2, 0xee, 0x56, 0x34, 0x4a, 0xac, 0x5b, 0x53, 0xa2, 0xfa, 0xee, 0x43, + 0xac, 0xbd, 0x7a, 0x08, 0xc7, 0x53, 0xb6, 0x6d, 0xb3, 0x94, 0xd8, 0xb7, + 0xd6, 0xac, 0x63, 0xcb, 0x71, 0x9b, 0xf1, 0x7a, 0x95, 0xa1, 0xa2, 0x9a, + 0x78, 0x36, 0x5e, 0xaf, 0x52, 0x0a, 0xf6, 0x57, 0xff, 0x06, 0x0c, 0x1b, + 0x63, 0xf0, 0x95, 0xfd, 0x34, 0x9c, 0x06, 0x05, 0x5b, 0x5d, 0x77, 0xc3, + 0x69, 0x90, 0x0f, 0xf6, 0xc7, 0xae, 0xb7, 0xd9, 0xf3, 0x58, 0x8d, 0xba, + 0x5f, 0xa3, 0x68, 0xa8, 0xf6, 0x8f, 0xbe, 0xbf, 0x6e, 0x4d, 0x89, 0x91, + 0xf1, 0x51, 0xdc, 0xc7, 0xf6, 0xe0, 0x78, 0xb5, 0xb6, 0x34, 0xd4, 0xbc, + 0x1a, 0xc3, 0xbf, 0xb9, 0x9d, 0xb1, 0x41, 0x9b, 0x7b, 0x3f, 0x93, 0xbc, + 0x1f, 0x65, 0xb3, 0x44, 0xd5, 0xab, 0x71, 0xf7, 0x5d, 0x45, 0xca, 0x0b, + 0xab, 0xc8, 0xdd, 0xc1, 0x6f, 0xd1, 0xca, 0xe3, 0x3b, 0x4d, 0x0c, 0x3b, + 0xd8, 0xae, 0x5f, 0xc7, 0x78, 0x6b, 0x9c, 0x1d, 0x7f, 0xaa, 0x00, 0x5d, + 0xc5, 0x85, 0x45, 0xea, 0x67, 0xeb, 0x6a, 0x7f, 0x41, 0x09, 0x8e, 0x36, + 0x3a, 0x96, 0xd7, 0xff, 0x6d, 0x7e, 0x45, 0xe4, 0x05, 0xa9, 0x1b, 0xec, + 0xa9, 0x93, 0x74, 0x04, 0xc1, 0x5c, 0xb5, 0xda, 0xf9, 0x00, 0xc0, 0x74, + 0x5d, 0x12, 0xf8, 0xd7, 0x61, 0x5a, 0x97, 0x9c, 0x47, 0x78, 0xf8, 0xc9, + 0xb9, 0x96, 0xf9, 0xaa, 0xe3, 0x73, 0x0d, 0xf3, 0x75, 0x09, 0x05, 0x43, + 0x50, 0xbe, 0x42, 0x50, 0x7d, 0x4e, 0xc5, 0x3e, 0x72, 0xa3, 0x45, 0xe5, + 0x51, 0x97, 0x52, 0xce, 0xa2, 0x1c, 0x54, 0x04, 0x2c, 0x01, 0x95, 0xe7, + 0xc0, 0xba, 0x62, 0x09, 0xb4, 0x24, 0xab, 0xaf, 0x0a, 0x26, 0x7d, 0x23, + 0xb1, 0xaf, 0x14, 0xec, 0xdd, 0x9b, 0x34, 0x6f, 0x5a, 0xe1, 0xef, 0x4b, + 0x5d, 0xf5, 0x86, 0x3b, 0x54, 0x19, 0xe3, 0x06, 0xed, 0x36, 0xab, 0x05, + 0x07, 0xaa, 0x60, 0x5d, 0x55, 0xa6, 0xd9, 0x92, 0xdc, 0xb4, 0x4c, 0xe0, + 0xa2, 0x40, 0x01, 0x9d, 0x40, 0xc5, 0x43, 0xcb, 0x60, 0xbc, 0x9e, 0x6c, + 0x67, 0xb9, 0x53, 0x0e, 0x77, 0xff, 0x8e, 0x8d, 0xd3, 0x92, 0x20, 0xd4, + 0x04, 0x69, 0x09, 0xd8, 0x4b, 0x87, 0x19, 0x5a, 0x01, 0x6b, 0x97, 0xd9, + 0x38, 0x41, 0x7c, 0x21, 0x14, 0x0b, 0x80, 0x16, 0x0c, 0xad, 0x88, 0xf7, + 0x43, 0xdd, 0xfb, 0x59, 0x87, 0xb5, 0xf7, 0x24, 0xd3, 0x0d, 0xc0, 0xd4, + 0x62, 0x2a, 0x47, 0xd5, 0xbb, 0x64, 0x2f, 0x0d, 0xfa, 0xa0, 0x5a, 0x45, + 0x44, 0xcf, 0x51, 0x44, 0x2e, 0x9c, 0xdc, 0xaf, 0x9a, 0xcd, 0x52, 0x06, + 0x90, 0xad, 0x1e, 0x90, 0x33, 0xaa, 0xcd, 0x6d, 0x5d, 0xbd, 0x0e, 0xf7, + 0xe9, 0x3d, 0x41, 0x38, 0xb0, 0xfb, 0x5d, 0xc0, 0x42, 0xfa, 0x04, 0x3f, + 0x24, 0x19, 0x85, 0x2b, 0x08, 0x89, 0xd0, 0x7e, 0x08, 0xcd, 0x60, 0x02, + 0x7e, 0xb3, 0x05, 0xf9, 0x08, 0x42, 0xd2, 0x40, 0xe4, 0xc2, 0x3c, 0xb7, + 0x81, 0xef, 0x43, 0xa1, 0x37, 0xc8, 0x9f, 0x3b, 0x94, 0xd7, 0xe1, 0xf3, + 0x3f, 0xd7, 0x76, 0xe6, 0x87, 0xd3, 0xcf, 0xbc, 0x0e, 0x36, 0x3b, 0xe9, + 0xc3, 0xc1, 0xf6, 0xcf, 0x7f, 0x04, 0x71, 0xfd, 0x28, 0xf5, 0x5c, 0xb0, + 0xfd, 0x19, 0xe0, 0x1f, 0x52, 0xe7, 0x2e, 0x03, 0x5e, 0x98, 0x23, 0x7c, + 0xc7, 0xf7, 0xba, 0x53, 0xdd, 0x3c, 0x50, 0x08, 0xa5, 0x5a, 0xf7, 0x0e, + 0x1b, 0xde, 0x41, 0x02, 0xba, 0x25, 0x76, 0x3b, 0xb0, 0xbe, 0x33, 0x14, + 0x54, 0xc1, 0xb1, 0xe2, 0xe3, 0x34, 0x94, 0x2a, 0xb1, 0x1f, 0xd8, 0x58, + 0xb7, 0x5e, 0x0f, 0x1f, 0xd8, 0xdd, 0xed, 0x00, 0x76, 0x04, 0xdb, 0xda, + 0xfc, 0x7b, 0x71, 0x7c, 0x5b, 0xee, 0x0c, 0xe0, 0x5a, 0x1a, 0x10, 0x4b, + 0x87, 0x60, 0x8d, 0x7c, 0xa6, 0x43, 0x5c, 0xa9, 0xb4, 0xe9, 0xee, 0x49, + 0xd9, 0x80, 0x83, 0x5e, 0x73, 0xdb, 0x83, 0x02, 0x7d, 0x75, 0x94, 0x80, + 0x7f, 0xf9, 0xd6, 0x39, 0x2e, 0x21, 0x06, 0x68, 0xe9, 0xd2, 0x8f, 0x6f, + 0xd9, 0x0a, 0x6c, 0x45, 0x81, 0xb4, 0xc2, 0xfd, 0x87, 0xd3, 0x06, 0x8b, + 0xdd, 0x62, 0x52, 0xda, 0x8a, 0x22, 0xda, 0xb4, 0x85, 0x53, 0x71, 0x0d, + 0x98, 0x74, 0x7e, 0xae, 0x41, 0x19, 0x3e, 0x7c, 0x1a, 0xc6, 0x16, 0xc1, + 0xc9, 0x6d, 0x75, 0x95, 0x9d, 0x5c, 0x63, 0xc0, 0x23, 0x3e, 0x04, 0x6e, + 0x00, 0xc3, 0x03, 0x06, 0x4c, 0xfa, 0x0c, 0x03, 0x63, 0x03, 0x81, 0xfb, + 0xca, 0xb8, 0x5f, 0x61, 0x64, 0x12, 0xc6, 0x8e, 0x28, 0xbf, 0x23, 0x81, + 0x5f, 0x79, 0xa3, 0x81, 0x38, 0xe2, 0x73, 0xf2, 0x88, 0x0f, 0x2b, 0x0d, + 0x46, 0x26, 0x81, 0x49, 0xbf, 0xad, 0x71, 0x28, 0x1e, 0x0d, 0xfa, 0x0f, + 0x6e, 0x34, 0x3a, 0xda, 0x61, 0x80, 0x36, 0x3b, 0xe3, 0xc7, 0xe3, 0x9a, + 0xe1, 0xf8, 0xf1, 0x46, 0x04, 0xd8, 0x2a, 0x0f, 0x25, 0x01, 0x44, 0xfe, + 0x8a, 0x60, 0xf1, 0x86, 0x35, 0x82, 0x83, 0x34, 0xa1, 0x0f, 0x78, 0x3a, + 0x19, 0xbf, 0x0e, 0xcb, 0x82, 0x18, 0xba, 0x15, 0xc2, 0xb4, 0xc2, 0x63, + 0xdd, 0x7f, 0xb9, 0x68, 0x44, 0xee, 0xdb, 0x6f, 0x55, 0x75, 0xb3, 0xd5, + 0xbf, 0xd5, 0x9e, 0xc3, 0x48, 0xd9, 0x19, 0xf8, 0x05, 0x20, 0x7f, 0xe0, + 0xe0, 0x3c, 0x0d, 0xa6, 0x09, 0xae, 0xd7, 0xc4, 0xa9, 0xc7, 0xa5, 0xf7, + 0xfd, 0x3b, 0x92, 0x04, 0x9f, 0x76, 0xe8, 0xbc, 0xe4, 0xee, 0x7b, 0xb6, + 0xb5, 0xf9, 0x71, 0x1f, 0xdc, 0xd1, 0xb1, 0x6e, 0x56, 0x09, 0x1e, 0xbf, + 0x4f, 0xdc, 0x2f, 0x6f, 0x88, 0xb0, 0x3c, 0xec, 0x52, 0x37, 0x07, 0x0a, + 0xbd, 0x26, 0xb5, 0x29, 0x85, 0xed, 0xab, 0xd5, 0x77, 0x07, 0xe1, 0x56, + 0x60, 0x08, 0x0b, 0x43, 0xac, 0x20, 0xac, 0xa1, 0x18, 0x42, 0x8b, 0x33, + 0xd7, 0x80, 0x16, 0x18, 0x62, 0x75, 0x60, 0xa3, 0x40, 0xbd, 0x1e, 0x40, + 0x65, 0x29, 0x07, 0x60, 0x2d, 0x22, 0xa0, 0x16, 0xb8, 0x94, 0x07, 0x6a, + 0x40, 0x29, 0x00, 0x6b, 0x81, 0x21, 0x16, 0xe3, 0xcb, 0xb5, 0x8c, 0x2e, + 0x82, 0xda, 0xb3, 0x55, 0x46, 0x17, 0xa9, 0x6b, 0xe6, 0x07, 0x12, 0x7f, + 0x66, 0x14, 0xc3, 0xa8, 0xe0, 0x4b, 0x48, 0xb3, 0xae, 0xc2, 0x3e, 0x72, + 0x85, 0xd1, 0x79, 0x3d, 0x6a, 0x43, 0x73, 0xe9, 0x02, 0xe3, 0xec, 0x06, + 0xad, 0x4e, 0xa8, 0xbd, 0x06, 0x58, 0x99, 0x25, 0x0f, 0xaf, 0x07, 0x87, + 0x45, 0xda, 0x81, 0x5a, 0x69, 0x1d, 0x9b, 0xe5, 0x5c, 0x9d, 0x24, 0x4c, + 0x8b, 0xd4, 0x7e, 0x78, 0xbe, 0xb8, 0x1c, 0x56, 0x0e, 0x0c, 0xb0, 0x73, + 0xe7, 0x4e, 0xea, 0xc7, 0xda, 0x59, 0x55, 0x1b, 0x01, 0xfd, 0x57, 0xbd, + 0x71, 0x25, 0xec, 0x3c, 0x02, 0x1b, 0x07, 0x60, 0xe7, 0x64, 0xd0, 0x3f, + 0xf4, 0x3a, 0x02, 0xb5, 0x00, 0xae, 0xbb, 0x4e, 0xa5, 0x71, 0x60, 0xe5, + 0x4a, 0x8e, 0x7c, 0x7c, 0x27, 0x1f, 0xdf, 0x99, 0x82, 0xdb, 0xa4, 0x15, + 0x52, 0xb3, 0x82, 0x2e, 0xb9, 0x44, 0x5a, 0x03, 0xe7, 0xf0, 0x3a, 0x5e, + 0x77, 0xcd, 0xd9, 0x6f, 0x26, 0x13, 0x7d, 0xfb, 0xaa, 0x8f, 0x3b, 0x7e, + 0x41, 0x3c, 0xaf, 0x9e, 0x08, 0x2a, 0x0c, 0x13, 0x05, 0x9b, 0x52, 0xe0, + 0x2a, 0xa3, 0xc7, 0x48, 0xc0, 0xb7, 0x14, 0x84, 0x4a, 0xe0, 0x07, 0xfd, + 0x29, 0xe1, 0x82, 0x18, 0xe9, 0x7e, 0xfe, 0x6e, 0x63, 0x0a, 0xd0, 0x79, + 0x4c, 0xa0, 0x3d, 0xbc, 0xa1, 0xc6, 0x56, 0x0d, 0x02, 0xb0, 0x96, 0x81, + 0x94, 0x3e, 0x86, 0x21, 0x90, 0x71, 0x25, 0xb7, 0x0d, 0xae, 0x25, 0x5b, + 0x32, 0x1a, 0x83, 0x4d, 0xd8, 0xd7, 0xdf, 0xa5, 0x56, 0x72, 0xb1, 0x07, + 0xd9, 0x6a, 0x26, 0xc0, 0x5e, 0xbe, 0xef, 0x61, 0x18, 0x31, 0x4c, 0x51, + 0x87, 0x6c, 0xf9, 0xd3, 0x75, 0x8a, 0x03, 0xe5, 0xa8, 0xde, 0xdc, 0xf0, + 0x7d, 0xac, 0x3e, 0x53, 0x6d, 0x7b, 0x2d, 0x5c, 0xcf, 0x25, 0x2f, 0x04, + 0x86, 0x11, 0xe4, 0xf1, 0xc1, 0x58, 0x98, 0x57, 0xf7, 0x18, 0x5a, 0xba, + 0x16, 0xa0, 0x0d, 0xa2, 0xb5, 0xe2, 0x7d, 0xb7, 0x51, 0x28, 0x14, 0x38, + 0xf8, 0x58, 0x0c, 0x72, 0xd2, 0xcf, 0x47, 0xea, 0x50, 0x0f, 0xd7, 0xc7, + 0x43, 0x12, 0x8b, 0x5d, 0xcc, 0x73, 0x21, 0x94, 0x8e, 0xca, 0x11, 0xe5, + 0x3d, 0xa2, 0x15, 0xe6, 0x5e, 0x79, 0xf2, 0x80, 0xa7, 0xc1, 0x7c, 0x7d, + 0xed, 0x9e, 0xee, 0xf5, 0x1a, 0xc8, 0xde, 0x02, 0x5f, 0x0c, 0x80, 0x5a, + 0x0d, 0x59, 0xe0, 0x68, 0x4e, 0xb5, 0xbd, 0x9a, 0xa9, 0x96, 0xed, 0xc6, + 0x47, 0x0a, 0xec, 0xbc, 0xb9, 0xc1, 0xe6, 0x47, 0x2d, 0xee, 0xbf, 0xd1, + 0x65, 0xc7, 0x13, 0xb5, 0xb6, 0x2c, 0xb2, 0x29, 0x9b, 0x14, 0x72, 0x80, + 0x08, 0xc6, 0xa1, 0x84, 0x4a, 0xc1, 0x6c, 0xed, 0xd9, 0x70, 0xcc, 0x47, + 0x1f, 0xfb, 0x81, 0xf8, 0xd9, 0xcb, 0x1c, 0x48, 0x84, 0x06, 0xd4, 0x51, + 0xb6, 0x0c, 0x24, 0xe1, 0x2f, 0x4a, 0x02, 0xb7, 0xdf, 0xa6, 0xe0, 0x95, + 0x46, 0x4e, 0x5d, 0xa3, 0x0b, 0xc1, 0x75, 0x34, 0xa3, 0xb4, 0x81, 0x50, + 0x63, 0xd5, 0xad, 0xa6, 0x72, 0x97, 0x0a, 0x5c, 0x1c, 0x96, 0x7d, 0xa3, + 0xb2, 0xc9, 0x78, 0xae, 0x09, 0x22, 0xcf, 0x38, 0x4d, 0x4a, 0x2d, 0x08, + 0x7b, 0x0d, 0xc3, 0xec, 0x6c, 0x23, 0x50, 0xc8, 0x41, 0x23, 0x48, 0xdf, + 0xe2, 0x1c, 0x9c, 0x0a, 0xf6, 0x3b, 0x8d, 0x73, 0x19, 0x81, 0x5b, 0x08, + 0x92, 0x7a, 0xe1, 0x85, 0x17, 0xb8, 0xf4, 0x4d, 0x0b, 0xf8, 0x01, 0x33, + 0x6d, 0x7e, 0xe7, 0xab, 0x6e, 0x00, 0xa9, 0xb9, 0x74, 0x62, 0x2c, 0xd9, + 0x8f, 0xec, 0xa6, 0x92, 0xf0, 0xd6, 0xc1, 0xfe, 0x59, 0xc3, 0x87, 0xf0, + 0xab, 0x10, 0x48, 0xa5, 0x2b, 0x74, 0xd3, 0xcf, 0x3d, 0xff, 0xfc, 0xf3, + 0xe8, 0x03, 0x3d, 0xd1, 0xb9, 0x97, 0x9f, 0x07, 0x14, 0xc8, 0xaa, 0x9b, + 0x4d, 0xdd, 0x2d, 0x7d, 0x4e, 0x77, 0x8f, 0xfc, 0x05, 0x36, 0x3b, 0xa5, + 0x59, 0x87, 0x7b, 0x75, 0xb2, 0x1f, 0x1d, 0x9f, 0x4b, 0xc5, 0xa7, 0xa5, + 0x53, 0x87, 0x6d, 0x41, 0xfc, 0x5c, 0x13, 0x0a, 0xde, 0xf5, 0x0d, 0xb7, + 0xaa, 0x7e, 0xc2, 0x86, 0x27, 0xd9, 0x7f, 0x18, 0xd6, 0xae, 0x2a, 0xe1, + 0x4c, 0x56, 0x21, 0x67, 0x30, 0x1e, 0x34, 0x4b, 0x1a, 0x32, 0xa8, 0xab, + 0x05, 0x63, 0x6e, 0xde, 0x8c, 0xc0, 0xec, 0x13, 0x78, 0x01, 0xc4, 0x28, + 0x84, 0x68, 0xa5, 0xfd, 0x15, 0xcc, 0x12, 0x1b, 0x6e, 0x54, 0xf6, 0x9b, + 0x7e, 0x89, 0xbd, 0x87, 0x6b, 0x9c, 0x3a, 0x3e, 0x86, 0x57, 0x57, 0x86, + 0xcd, 0xa2, 0x8d, 0x3f, 0xd5, 0xa1, 0x1e, 0xa8, 0xbd, 0xce, 0x23, 0x2b, + 0x57, 0x50, 0xfd, 0xa3, 0x83, 0x58, 0x57, 0xd8, 0x8c, 0x1d, 0x51, 0x30, + 0x7f, 0x2b, 0xf5, 0xe8, 0xdd, 0x86, 0x81, 0x65, 0x49, 0x46, 0x17, 0x95, + 0x38, 0xf8, 0x54, 0x2d, 0x32, 0x10, 0x0e, 0xf3, 0x59, 0x96, 0xe4, 0x50, + 0x4d, 0xc5, 0x63, 0xfb, 0x65, 0xf2, 0xbd, 0x06, 0x86, 0xd1, 0xc4, 0x9d, + 0x6c, 0x62, 0x18, 0xb0, 0xe4, 0xaa, 0x25, 0x51, 0x5f, 0x88, 0x33, 0xed, + 0x50, 0x2e, 0x95, 0xf1, 0xcf, 0xfa, 0x0a, 0x68, 0x97, 0x4b, 0x01, 0x02, + 0x43, 0xd0, 0x61, 0x43, 0x2a, 0xd8, 0x5e, 0x4b, 0xe0, 0x9f, 0xf5, 0x11, + 0x85, 0x18, 0xa6, 0xa5, 0x43, 0xb2, 0x8c, 0x85, 0x06, 0xb2, 0x21, 0x15, + 0x70, 0x55, 0x40, 0x21, 0x78, 0x87, 0x7d, 0xe9, 0x63, 0x07, 0xdf, 0x18, + 0x84, 0xe1, 0xc6, 0x9e, 0xac, 0x30, 0x7c, 0xed, 0x48, 0x94, 0x7f, 0x88, + 0x00, 0x4a, 0x6e, 0x0f, 0x06, 0xed, 0x5d, 0xd3, 0xc2, 0xf1, 0x1c, 0x44, + 0x4b, 0x20, 0xb0, 0x90, 0x2d, 0x75, 0x4d, 0xd5, 0xc9, 0x2a, 0xe5, 0x81, + 0x72, 0xe2, 0xb9, 0x86, 0x32, 0x18, 0xa6, 0xcc, 0x1b, 0x01, 0x22, 0xa0, + 0xd6, 0xba, 0x65, 0x1b, 0xa8, 0x0c, 0x54, 0xe0, 0xd0, 0xff, 0xc6, 0xf6, + 0x8b, 0x14, 0xe8, 0x6a, 0x1b, 0xf7, 0xb6, 0x3d, 0x86, 0x2f, 0x1b, 0x3f, + 0xa5, 0xd2, 0x37, 0x25, 0x15, 0x6c, 0xea, 0x4c, 0x50, 0x9e, 0x85, 0x20, + 0xab, 0x21, 0x03, 0x39, 0xee, 0xe3, 0x0c, 0x05, 0xe9, 0xed, 0x53, 0x37, + 0x7c, 0xe1, 0x77, 0x0c, 0xde, 0xf2, 0xf6, 0xfe, 0x08, 0x08, 0x15, 0x82, + 0xb2, 0xc6, 0xbf, 0xae, 0xc0, 0x5a, 0xe3, 0x5f, 0xff, 0x56, 0xb4, 0x0d, + 0x35, 0xf4, 0x9e, 0x5f, 0xe0, 0xb1, 0x2f, 0x1f, 0x88, 0x20, 0x5c, 0x61, + 0x58, 0x00, 0x77, 0xda, 0x41, 0x0c, 0xc4, 0x3f, 0x8a, 0x9b, 0xec, 0x75, + 0xec, 0x6b, 0xed, 0x83, 0xf1, 0x38, 0x4e, 0x1d, 0xa8, 0xf5, 0xbf, 0xfe, + 0xd4, 0x10, 0xce, 0xc4, 0x19, 0xec, 0xc1, 0x7e, 0xbe, 0xeb, 0x4d, 0xc2, + 0xd7, 0xe3, 0x6b, 0xfa, 0xae, 0xa7, 0x46, 0x13, 0x9d, 0xc0, 0xfe, 0xdb, + 0xff, 0xae, 0xc4, 0xdf, 0xff, 0x8f, 0x71, 0x08, 0xc2, 0xaf, 0x5b, 0xb6, + 0x81, 0x3d, 0xc7, 0x77, 0x41, 0x10, 0x9f, 0x1c, 0x48, 0xd6, 0xef, 0x79, + 0xa7, 0x4d, 0x3d, 0xff, 0xeb, 0xb0, 0x1c, 0x8a, 0x57, 0xad, 0xa0, 0x38, + 0xfe, 0x27, 0xf0, 0xc0, 0x7b, 0x10, 0xf7, 0xff, 0xad, 0x7a, 0x56, 0xbe, + 0xcd, 0xb0, 0x3d, 0x12, 0x41, 0xc0, 0xe4, 0x94, 0x8c, 0x6c, 0x8b, 0x3e, + 0x01, 0xdf, 0x51, 0xe9, 0x38, 0x73, 0xee, 0x04, 0x6f, 0x7a, 0xe3, 0x65, + 0x54, 0xff, 0xd1, 0xe1, 0xe5, 0xef, 0xbf, 0x40, 0xff, 0x82, 0xa5, 0x09, + 0xf7, 0xb4, 0xce, 0x9c, 0x3b, 0x11, 0xf9, 0x81, 0x2e, 0xef, 0x74, 0xa6, + 0x4c, 0x99, 0x32, 0x65, 0xca, 0x94, 0x29, 0x53, 0xa6, 0x4c, 0x99, 0x32, + 0x65, 0xca, 0x94, 0x29, 0x53, 0xa6, 0x4c, 0x99, 0x32, 0x65, 0xca, 0x94, + 0x29, 0x53, 0xa6, 0x4c, 0x99, 0x32, 0x65, 0x9a, 0x97, 0x32, 0xa8, 0x56, + 0xa6, 0x4c, 0x99, 0x32, 0x65, 0xca, 0xf4, 0x13, 0xa0, 0x08, 0xe4, 0xa1, + 0x95, 0xcc, 0x21, 0xa8, 0x69, 0x3e, 0xb2, 0x4c, 0x0b, 0x67, 0xd2, 0xc1, + 0x0b, 0xc0, 0x09, 0x9e, 0xe7, 0x61, 0x9a, 0xf1, 0x87, 0xd9, 0x22, 0x05, + 0x1a, 0x12, 0x39, 0x81, 0xd5, 0x67, 0x25, 0x00, 0x54, 0x9e, 0xe7, 0x25, + 0xd2, 0x12, 0x42, 0x5e, 0x42, 0xa0, 0x56, 0x69, 0xa0, 0x84, 0x33, 0xe5, + 0x30, 0xbc, 0x74, 0x98, 0xb1, 0x13, 0x63, 0x0a, 0xac, 0xe5, 0xc7, 0x30, + 0xad, 0x34, 0x58, 0x6b, 0xf8, 0x5a, 0x35, 0x09, 0x7f, 0xfb, 0x3d, 0x5f, + 0x60, 0xcb, 0xa7, 0x6e, 0x62, 0xfb, 0xa7, 0xf7, 0xb1, 0xfd, 0xd3, 0xfb, + 0xd8, 0xf2, 0xa9, 0x9b, 0x38, 0xf8, 0x8b, 0xbb, 0xf9, 0xe6, 0x15, 0x50, + 0x7b, 0x46, 0x4d, 0x06, 0x0b, 0xe1, 0x57, 0xdd, 0x14, 0xad, 0xce, 0x3b, + 0x87, 0x7b, 0x5e, 0xe4, 0xc9, 0x9b, 0xed, 0x7e, 0xbb, 0xb9, 0x77, 0x53, + 0xa1, 0x27, 0x39, 0xf1, 0x28, 0x9c, 0xe4, 0xe4, 0xa6, 0x3e, 0xf2, 0x2c, + 0xf4, 0x14, 0x68, 0xe6, 0xe6, 0x07, 0xff, 0x09, 0x75, 0xe8, 0xb0, 0x13, + 0x7d, 0x88, 0xd7, 0x90, 0x12, 0x52, 0x13, 0x6e, 0x57, 0xaf, 0x02, 0xd8, + 0x0f, 0xc0, 0xf0, 0xd5, 0xb0, 0xe1, 0x4e, 0x80, 0x57, 0x59, 0xfd, 0xfe, + 0xaf, 0xb2, 0x27, 0x80, 0xe8, 0xac, 0xbb, 0xe3, 0x36, 0x9c, 0xd3, 0xea, + 0xc3, 0xe2, 0xcd, 0xff, 0xf9, 0x20, 0x8d, 0x68, 0x56, 0xb4, 0xfa, 0x40, + 0x13, 0x80, 0x9c, 0xc4, 0xea, 0x35, 0x30, 0x7a, 0xf2, 0xf8, 0x33, 0x4d, + 0x0a, 0x86, 0xc0, 0xf5, 0x7c, 0x4a, 0x8b, 0x2c, 0x7c, 0x5f, 0xa5, 0xd9, + 0xf5, 0x7c, 0x44, 0xaf, 0x88, 0xbe, 0x14, 0xb7, 0x4c, 0x03, 0xd7, 0x4b, + 0x01, 0x20, 0x52, 0x5f, 0x92, 0xfb, 0x72, 0x76, 0xa0, 0x56, 0x68, 0x5f, + 0xc5, 0x27, 0xdb, 0xe2, 0x0b, 0xbf, 0x66, 0x0d, 0xc1, 0x54, 0xae, 0xe7, + 0x23, 0x5b, 0x02, 0xdb, 0x14, 0xd0, 0x92, 0x14, 0x0c, 0x81, 0xe3, 0xa9, + 0x55, 0x9c, 0xc3, 0xb0, 0xce, 0xa4, 0xd7, 0xf1, 0x5d, 0x10, 0x39, 0xa2, + 0xd5, 0xac, 0xdb, 0x94, 0x13, 0x0a, 0x48, 0x14, 0x40, 0xb1, 0xf4, 0xf8, + 0xa2, 0xf8, 0x5b, 0x92, 0x42, 0xaf, 0x81, 0x13, 0x40, 0x49, 0xca, 0x57, + 0xc4, 0xf1, 0x21, 0x44, 0x57, 0xa0, 0x96, 0x61, 0xe4, 0xf1, 0x53, 0x13, + 0xdf, 0x3a, 0xc9, 0xef, 0xa9, 0xcf, 0xe9, 0x27, 0x99, 0x66, 0x6d, 0xbf, + 0x03, 0x50, 0x6b, 0x3e, 0xf0, 0xac, 0x0b, 0x91, 0xb2, 0x1b, 0xbf, 0x83, + 0x0d, 0xbf, 0x11, 0x4d, 0x5c, 0x49, 0xab, 0xd3, 0xa4, 0x91, 0x79, 0xc5, + 0x31, 0xed, 0x27, 0x57, 0xda, 0x0e, 0xd4, 0x6d, 0x02, 0x46, 0xc1, 0x28, + 0x44, 0xe7, 0x9a, 0xb2, 0x89, 0xc1, 0x85, 0xc5, 0xdb, 0x69, 0xd2, 0x8d, + 0x94, 0x92, 0x86, 0xdf, 0xe8, 0x7c, 0xae, 0x0b, 0xac, 0x65, 0x2e, 0x39, + 0x75, 0x07, 0xa3, 0xc7, 0xa0, 0xe1, 0x4b, 0xf2, 0xda, 0x6a, 0xed, 0xd2, + 0x97, 0x6d, 0x2d, 0x2e, 0xe7, 0x8c, 0x83, 0x94, 0x12, 0xbb, 0x68, 0x47, + 0xbf, 0x5c, 0x6f, 0x4a, 0xfd, 0xc6, 0x8d, 0x2e, 0xc0, 0xa9, 0x10, 0xf4, + 0xa7, 0x83, 0xf4, 0x42, 0x9d, 0x3a, 0x7d, 0x2a, 0x82, 0x74, 0x85, 0x93, + 0x89, 0xc2, 0xfc, 0x1c, 0x09, 0x6e, 0x5d, 0x03, 0x28, 0x9e, 0xd3, 0x9f, + 0xab, 0xc4, 0x9b, 0xf6, 0xd1, 0xdf, 0x1f, 0x77, 0xda, 0x0d, 0x20, 0x0b, + 0x92, 0x42, 0x4f, 0x21, 0x06, 0x57, 0x85, 0xa0, 0x2a, 0xbf, 0xfd, 0x77, + 0x11, 0xc1, 0xb5, 0x82, 0x73, 0xfa, 0x7e, 0x5a, 0xb3, 0x9d, 0x9b, 0xcd, + 0xae, 0x1e, 0xa6, 0x5b, 0x5a, 0xf4, 0xe3, 0x4e, 0xe9, 0xe9, 0x14, 0x2e, + 0x9a, 0xac, 0x25, 0x04, 0xfe, 0x8c, 0x54, 0xf7, 0xb7, 0x77, 0x7e, 0xe5, + 0xee, 0x1f, 0xcf, 0xcb, 0x57, 0x77, 0x85, 0x73, 0x79, 0xd3, 0x60, 0x28, + 0x7d, 0x8e, 0x6f, 0x08, 0x84, 0x9a, 0x0d, 0x20, 0x35, 0x9b, 0x06, 0x07, + 0x3a, 0xe1, 0xa4, 0x3a, 0x9f, 0x4b, 0xfb, 0x4c, 0x83, 0xbe, 0xd2, 0xe9, + 0xea, 0xb4, 0x1f, 0xea, 0x08, 0x93, 0x5d, 0x41, 0x61, 0xdd, 0xae, 0xa5, + 0xdb, 0xf5, 0xe9, 0x60, 0xad, 0xd9, 0xe2, 0xd5, 0xd3, 0xb9, 0xea, 0xce, + 0x3b, 0xb9, 0xf3, 0xf3, 0x00, 0x77, 0x76, 0x0c, 0x3b, 0x80, 0x9a, 0x80, + 0xb8, 0x9a, 0xf9, 0x49, 0x7e, 0xea, 0x5d, 0xdc, 0xf0, 0xa9, 0x79, 0x7a, + 0xee, 0xa0, 0xd9, 0x80, 0x5a, 0x73, 0xc9, 0x99, 0x51, 0x2b, 0x8f, 0x3b, + 0x5a, 0x5e, 0xe5, 0x48, 0x89, 0x33, 0xe9, 0x31, 0x3a, 0x60, 0x26, 0xfc, + 0xfa, 0x3e, 0xd8, 0x42, 0x24, 0xfc, 0xbe, 0x56, 0xe9, 0x98, 0xaf, 0x2e, + 0x34, 0x8e, 0x4e, 0xe1, 0x1a, 0xcf, 0x8d, 0x81, 0xb0, 0x90, 0xd3, 0x5a, + 0x3d, 0x29, 0xbc, 0xb6, 0x54, 0x5d, 0x25, 0xba, 0xe2, 0x5e, 0x13, 0xea, + 0x9d, 0x60, 0x04, 0x3f, 0x22, 0x1d, 0x39, 0x05, 0x96, 0x99, 0x84, 0x79, + 0xae, 0x5a, 0x0d, 0x87, 0x0f, 0x75, 0xf4, 0xbe, 0x7a, 0xb9, 0xda, 0xae, + 0x58, 0xd1, 0x7e, 0xae, 0xf2, 0x24, 0x30, 0x23, 0xa1, 0x47, 0xe0, 0xa3, + 0xc2, 0x1b, 0x57, 0xdf, 0xd4, 0x06, 0xd7, 0xba, 0x10, 0xa0, 0x16, 0x28, + 0x18, 0x57, 0xa7, 0xf0, 0xde, 0x93, 0x7b, 0x30, 0x59, 0x87, 0x37, 0x39, + 0xf7, 0x7d, 0xb4, 0x07, 0x6c, 0x6c, 0xbb, 0xdc, 0xe6, 0xee, 0x68, 0x61, + 0xe7, 0xe3, 0x47, 0x4a, 0xf9, 0x43, 0xd8, 0x1a, 0xc7, 0xa9, 0x77, 0x9f, + 0x8c, 0x9f, 0xd6, 0xa6, 0xab, 0x47, 0x19, 0xeb, 0x09, 0xea, 0x3c, 0x0b, + 0x21, 0x4f, 0x01, 0x9a, 0x70, 0xf2, 0xaf, 0x76, 0xb1, 0xe1, 0xda, 0x60, + 0xf2, 0xbd, 0x50, 0xef, 0x56, 0xb3, 0xe5, 0xb3, 0xe3, 0xc4, 0x41, 0x96, + 0x7c, 0x70, 0x83, 0xf2, 0xbf, 0xa0, 0x84, 0x68, 0xb9, 0x8c, 0x3d, 0x76, + 0x2f, 0x65, 0xc3, 0x86, 0x5e, 0x0b, 0x13, 0xc8, 0x6b, 0x30, 0xd2, 0xb2, + 0x05, 0x85, 0x82, 0x82, 0x1b, 0x14, 0x45, 0x72, 0x3f, 0x54, 0x63, 0xc8, + 0xc2, 0x0a, 0x26, 0xe8, 0xb8, 0x0b, 0x0b, 0xc9, 0xfd, 0xf0, 0x5a, 0x4d, + 0x9b, 0x82, 0x91, 0x7c, 0xc7, 0x0d, 0xad, 0x0e, 0x55, 0xe8, 0x29, 0x60, + 0x05, 0x60, 0x5e, 0x99, 0xda, 0x07, 0x28, 0x59, 0x60, 0x2d, 0x2c, 0x61, + 0x84, 0xf0, 0x1f, 0x6d, 0x3f, 0x94, 0xfc, 0x90, 0x4d, 0x61, 0x42, 0x20, + 0x07, 0x55, 0xac, 0xfa, 0xbe, 0x9e, 0x86, 0x30, 0x5e, 0x7d, 0x3f, 0x9d, + 0x8e, 0x74, 0x1a, 0x46, 0x7a, 0xe3, 0x3a, 0xce, 0xc8, 0x95, 0xc9, 0xfb, + 0x61, 0xe6, 0x5c, 0x0a, 0x0b, 0x4b, 0x84, 0x93, 0xf3, 0xc5, 0x32, 0x95, + 0x66, 0xdf, 0xb4, 0x10, 0x7d, 0x0e, 0xf4, 0x19, 0x88, 0xbe, 0x38, 0x8e, + 0x72, 0xbf, 0x9a, 0xa1, 0x25, 0x7a, 0xa0, 0x10, 0x00, 0x18, 0x44, 0x6e, + 0xee, 0xfa, 0x9a, 0x0e, 0x8d, 0x0a, 0x7d, 0x77, 0x2a, 0xe1, 0x3b, 0x9d, + 0x4b, 0x83, 0x39, 0xf5, 0xf3, 0x69, 0x18, 0x55, 0xd8, 0x12, 0xcc, 0xcf, + 0x71, 0x1c, 0xda, 0x90, 0xa9, 0xe3, 0x6e, 0x69, 0x9d, 0x2d, 0x7e, 0x00, + 0x63, 0xe6, 0x14, 0x69, 0xfd, 0x7b, 0xbd, 0x96, 0xf9, 0x3e, 0x97, 0xae, + 0x6a, 0x48, 0x4a, 0x43, 0x82, 0xea, 0x13, 0x3e, 0x58, 0x02, 0x7f, 0xda, + 0xe5, 0xe0, 0xe7, 0x55, 0xbe, 0x60, 0xb5, 0x6c, 0x76, 0xfd, 0xd1, 0x49, + 0x00, 0xcc, 0xbe, 0x10, 0xbc, 0xd8, 0xc4, 0x7d, 0xd6, 0x65, 0xcf, 0xb3, + 0x0a, 0x66, 0x7b, 0xdb, 0x5d, 0x65, 0x9c, 0xa6, 0x8c, 0xda, 0x89, 0xe6, + 0x35, 0xc0, 0x94, 0x64, 0xf8, 0x7a, 0xc1, 0xd8, 0x57, 0x1a, 0x88, 0x62, + 0x01, 0x77, 0x5c, 0xb2, 0xf9, 0x93, 0x63, 0x6c, 0xfa, 0x7d, 0x35, 0x79, + 0x6d, 0xc7, 0x6f, 0x8d, 0x45, 0x93, 0x1b, 0x01, 0xbc, 0xa7, 0x5d, 0x76, + 0x3c, 0x0d, 0xee, 0x19, 0x97, 0xfb, 0x7f, 0x7f, 0x18, 0xf7, 0x4c, 0x32, + 0x5f, 0xb2, 0x5b, 0x25, 0xc6, 0x1f, 0x81, 0xa1, 0x9b, 0x89, 0xb6, 0x3b, + 0xee, 0xac, 0x03, 0x50, 0x6b, 0x59, 0x8c, 0x1f, 0x87, 0xb1, 0xc7, 0x8e, + 0x62, 0xf7, 0x17, 0xa3, 0x30, 0xfb, 0xb7, 0x39, 0x38, 0x67, 0x94, 0x9f, + 0x2f, 0xec, 0x5e, 0x91, 0xd8, 0xdf, 0x7b, 0x1c, 0xc6, 0x1f, 0xcd, 0x83, + 0xd9, 0x04, 0x2f, 0xcf, 0xd0, 0x8d, 0x4d, 0x2a, 0xbf, 0x51, 0x0f, 0xe2, + 0xb2, 0xd9, 0x7f, 0x1c, 0x2a, 0x8f, 0x26, 0xed, 0x01, 0x38, 0x27, 0x14, + 0x9c, 0x24, 0x04, 0x6b, 0xd1, 0x6a, 0xc6, 0x93, 0xc0, 0x5b, 0x0a, 0xa2, + 0x05, 0xaa, 0x9d, 0xed, 0x6b, 0x13, 0x97, 0x43, 0xa0, 0x96, 0x0e, 0x11, + 0xf1, 0x3d, 0x89, 0xf4, 0x9b, 0x98, 0x8b, 0x0a, 0x48, 0x09, 0x27, 0xa7, + 0x60, 0x49, 0xf0, 0xee, 0x4a, 0x09, 0xcd, 0x9c, 0x6a, 0x47, 0xe4, 0xf1, + 0x41, 0x7a, 0x90, 0x13, 0x0a, 0xb0, 0x05, 0x11, 0x50, 0x4b, 0x4a, 0xd5, + 0xc6, 0xa9, 0x1c, 0x75, 0x28, 0x5c, 0x58, 0x73, 0xef, 0xdf, 0x95, 0xfe, + 0xff, 0x08, 0xd7, 0x7a, 0x0e, 0xb8, 0x02, 0x78, 0x47, 0x70, 0xfc, 0xdf, + 0xb5, 0x73, 0x97, 0x01, 0xcc, 0xbc, 0x9a, 0x70, 0x9b, 0xb7, 0x34, 0xb8, + 0xd4, 0x9e, 0xdd, 0x0e, 0x87, 0x88, 0x21, 0x52, 0x3a, 0x78, 0xea, 0x86, + 0xdd, 0x0e, 0x07, 0x74, 0xe8, 0x55, 0x07, 0xb0, 0xd6, 0x9e, 0xdd, 0x31, + 0xb0, 0x2a, 0x84, 0x5d, 0xed, 0xd9, 0xed, 0x44, 0x61, 0xd3, 0xfb, 0xac, + 0xb7, 0xb9, 0x61, 0xb7, 0x93, 0x68, 0x2b, 0xec, 0x49, 0xa5, 0xa7, 0xd3, + 0x7e, 0x5a, 0xe9, 0xb4, 0xad, 0x0b, 0xec, 0xea, 0xfb, 0xeb, 0x02, 0x60, + 0x56, 0x37, 0xe9, 0xd7, 0x1d, 0x6e, 0x6f, 0x00, 0x56, 0xef, 0x56, 0x90, + 0x2d, 0xfd, 0x7c, 0x27, 0xa5, 0x81, 0x5a, 0xdd, 0x55, 0x6c, 0x77, 0xba, + 0x05, 0x05, 0xca, 0x7a, 0x38, 0xd8, 0xd7, 0xf5, 0x70, 0xe0, 0xff, 0x96, + 0x3a, 0x6c, 0xd5, 0xc2, 0x6e, 0x55, 0x5e, 0xcf, 0x75, 0x80, 0x79, 0xcd, + 0x26, 0x71, 0x44, 0xab, 0xdb, 0x3f, 0xe2, 0xb7, 0xbb, 0x05, 0x70, 0x3e, + 0xdd, 0x5d, 0x1c, 0xf1, 0x15, 0x6c, 0xab, 0x9b, 0xcd, 0x47, 0xb5, 0xfe, + 0x81, 0x23, 0x3e, 0x04, 0x7e, 0x47, 0x26, 0x61, 0x6c, 0x52, 0x41, 0xb2, + 0x04, 0x44, 0xee, 0xba, 0x7f, 0x5d, 0x23, 0x93, 0x30, 0xd6, 0xc1, 0x4e, + 0x27, 0x55, 0xc7, 0xb5, 0x92, 0x32, 0xc8, 0xef, 0xc6, 0x9e, 0xf2, 0x19, + 0xbe, 0x26, 0x0e, 0x33, 0x7c, 0x97, 0xc9, 0xfa, 0x6b, 0xbe, 0x4a, 0x7d, + 0xc6, 0xe3, 0x06, 0x80, 0x1f, 0xc4, 0x61, 0x86, 0xef, 0x50, 0xdb, 0xa1, + 0x92, 0xc5, 0x78, 0x30, 0xf9, 0x7f, 0xc3, 0x02, 0xf0, 0x02, 0x5e, 0xc2, + 0x0d, 0x5a, 0x5c, 0x37, 0xa0, 0x60, 0x85, 0x63, 0x0f, 0xdd, 0x0e, 0x40, + 0xc9, 0xed, 0x94, 0xfe, 0x54, 0x9b, 0x49, 0x83, 0x02, 0x58, 0x33, 0x16, + 0x96, 0x09, 0x3b, 0x9e, 0xb9, 0x81, 0xfb, 0x6f, 0xfe, 0x2a, 0x7b, 0x9e, + 0xfd, 0x28, 0x8b, 0xeb, 0xf7, 0xa9, 0xeb, 0x6c, 0x99, 0xd4, 0x66, 0x24, + 0xb4, 0x54, 0xbf, 0x92, 0x6b, 0xdc, 0xaf, 0xe2, 0x98, 0xd9, 0x02, 0xc0, + 0xfe, 0xfa, 0x16, 0x6a, 0xcf, 0xfa, 0xdc, 0xb6, 0x62, 0x5b, 0x04, 0x3c, + 0x96, 0xad, 0xb9, 0xcb, 0x6c, 0xa3, 0x77, 0x08, 0x7f, 0x7a, 0x3c, 0x3a, + 0x16, 0x86, 0x01, 0x33, 0x46, 0x22, 0x9d, 0x46, 0xef, 0x0a, 0xfc, 0x69, + 0x05, 0x4d, 0x68, 0x4c, 0x7b, 0x94, 0xfa, 0x46, 0x23, 0xa0, 0x56, 0xa8, + 0xbc, 0x61, 0x80, 0x0f, 0xbe, 0x74, 0x71, 0xbd, 0x93, 0xf8, 0xd2, 0xc3, + 0x10, 0x36, 0x79, 0xc3, 0x02, 0xbf, 0x00, 0x78, 0xf8, 0xf2, 0x50, 0x60, + 0xc3, 0xa0, 0x5c, 0xbc, 0x89, 0x6a, 0xbd, 0x12, 0xf8, 0x4b, 0xd6, 0xaf, + 0x01, 0x9c, 0xa9, 0x2a, 0xf7, 0xd6, 0x0f, 0x41, 0x6b, 0x53, 0x00, 0xd6, + 0x52, 0x50, 0x9a, 0x83, 0xa7, 0xb7, 0x00, 0xdb, 0x01, 0x18, 0x5d, 0x04, + 0xf7, 0x3e, 0x5e, 0xa3, 0x68, 0x54, 0x54, 0xda, 0x83, 0x8b, 0x0d, 0xfb, + 0x8c, 0x45, 0x4e, 0xbb, 0xfe, 0x1c, 0x48, 0x39, 0x5f, 0x74, 0xe9, 0x85, + 0xea, 0x35, 0x80, 0x76, 0x5d, 0x20, 0x4c, 0xeb, 0x7c, 0x54, 0x3f, 0x8f, + 0x73, 0x75, 0x62, 0x08, 0x57, 0x71, 0x9e, 0x36, 0xf4, 0x70, 0x61, 0x2f, + 0xd4, 0xc7, 0x1f, 0x80, 0x07, 0x3e, 0xae, 0x40, 0x5b, 0x5f, 0xbb, 0x02, + 0xde, 0xf7, 0x1c, 0xac, 0x3c, 0xa6, 0x81, 0xd5, 0x81, 0xc9, 0x23, 0xea, + 0xf8, 0x7d, 0x7d, 0xf0, 0x35, 0x60, 0x72, 0x12, 0xfe, 0xf7, 0xe5, 0x70, + 0xdd, 0xb1, 0x98, 0x65, 0xf5, 0x5a, 0xeb, 0xf1, 0xc7, 0x81, 0xeb, 0x26, + 0x13, 0x20, 0xad, 0xc7, 0x83, 0x38, 0x21, 0x06, 0x6c, 0xed, 0x24, 0x48, + 0x6b, 0x90, 0x88, 0xf7, 0xf5, 0x01, 0x93, 0xb0, 0x32, 0x05, 0xd4, 0x5a, + 0xc9, 0x8f, 0x08, 0xa8, 0x35, 0x87, 0x14, 0x20, 0x2a, 0x99, 0xd7, 0xa8, + 0xe3, 0xee, 0x7d, 0xbf, 0x7e, 0x00, 0x8f, 0x36, 0xcd, 0x38, 0x6f, 0x4c, + 0x82, 0xb5, 0xda, 0xc3, 0x28, 0xe0, 0x95, 0x17, 0xc5, 0xf9, 0xda, 0x48, + 0xe2, 0xcf, 0x84, 0x20, 0x30, 0x33, 0x00, 0x6c, 0x99, 0x81, 0xfd, 0x74, + 0x8b, 0x2a, 0x1e, 0x43, 0x10, 0xb9, 0xf6, 0xf1, 0x04, 0x72, 0x22, 0x06, + 0xc0, 0x87, 0x30, 0xad, 0x9c, 0x88, 0xfc, 0xfa, 0x29, 0x60, 0x36, 0xc4, + 0xf7, 0x41, 0x08, 0xa1, 0x16, 0x93, 0x11, 0x02, 0xd3, 0xb4, 0x95, 0x7b, + 0x4b, 0xd2, 0x94, 0xe0, 0xcf, 0x34, 0xb0, 0x4c, 0x55, 0x97, 0x28, 0x18, + 0x06, 0xb2, 0xd5, 0x54, 0xfd, 0xf5, 0x3d, 0xaa, 0x2f, 0xbb, 0x50, 0xb0, + 0x38, 0xfa, 0xb5, 0x1d, 0x14, 0x17, 0x95, 0xb0, 0x7a, 0x03, 0xa0, 0xf6, + 0x89, 0xfd, 0x6d, 0x71, 0x39, 0xf5, 0x0a, 0x30, 0xd2, 0xf5, 0x4e, 0x94, + 0x16, 0x95, 0xc1, 0x9b, 0x7d, 0xac, 0x2b, 0x82, 0x5f, 0xe9, 0xe3, 0xd7, + 0x42, 0x90, 0x97, 0x92, 0x74, 0x48, 0xd1, 0x52, 0x80, 0xa9, 0xb4, 0x22, + 0xb7, 0xa0, 0x5c, 0x17, 0xb2, 0x93, 0xbf, 0x7c, 0xdb, 0x42, 0x3c, 0xd0, + 0xe4, 0x36, 0xb3, 0xc0, 0xbd, 0x2d, 0xb8, 0xc7, 0x77, 0xd9, 0x66, 0xa8, + 0x76, 0xdd, 0x0a, 0x21, 0x38, 0x20, 0xc0, 0x6b, 0x35, 0x68, 0x86, 0x63, + 0xa2, 0x02, 0xa4, 0xdf, 0xa0, 0x26, 0xb6, 0x70, 0xff, 0xef, 0xaa, 0xbe, + 0x88, 0x2f, 0xfc, 0x5f, 0xa8, 0xc5, 0x9e, 0x52, 0x6a, 0x84, 0xf5, 0x0b, + 0xed, 0x71, 0x47, 0x20, 0xaf, 0x54, 0x83, 0x57, 0x4f, 0x93, 0xe8, 0x51, + 0x24, 0xe2, 0xf4, 0xa2, 0x47, 0xdd, 0xe4, 0x07, 0xa0, 0x2d, 0x89, 0x54, + 0xf7, 0xa6, 0x15, 0xc6, 0xd5, 0x44, 0xa1, 0xbc, 0xf2, 0x34, 0x45, 0x93, + 0x42, 0x0b, 0x64, 0x2e, 0x1f, 0x41, 0xb4, 0x42, 0xc8, 0x56, 0x9e, 0x7c, + 0x04, 0xff, 0xda, 0x40, 0x33, 0xf9, 0x76, 0xc9, 0x26, 0x35, 0xfd, 0xbe, + 0xa2, 0xf2, 0x93, 0xc5, 0x01, 0xb8, 0xac, 0xa1, 0xa5, 0xfb, 0xd4, 0xbc, + 0xf2, 0x7d, 0xa5, 0x05, 0xd6, 0xa5, 0xd1, 0xfe, 0x2b, 0xad, 0x57, 0xb9, + 0x38, 0x77, 0xd1, 0x79, 0x6f, 0xcf, 0x3e, 0xff, 0x2a, 0x6f, 0x78, 0xd3, + 0x8b, 0x2c, 0xb0, 0x2e, 0xe5, 0x07, 0xd6, 0x4c, 0xdb, 0xf9, 0x4b, 0x78, + 0x1b, 0xdf, 0xe3, 0xdb, 0x1d, 0xc3, 0xbf, 0x75, 0xb0, 0x1f, 0x6b, 0x61, + 0x2f, 0x27, 0xc6, 0xaa, 0x09, 0xa0, 0x96, 0x3b, 0x03, 0x4b, 0xcb, 0x49, + 0xaa, 0x52, 0xa7, 0xf0, 0x21, 0x5c, 0x2a, 0x84, 0x54, 0x85, 0xd7, 0x94, + 0xde, 0x8f, 0x60, 0x57, 0xe7, 0xce, 0xc1, 0xab, 0x44, 0x20, 0x2a, 0x3d, + 0xfc, 0xf3, 0xcf, 0x3f, 0x9f, 0x80, 0x62, 0xa5, 0x6d, 0x02, 0xf0, 0xb2, + 0x02, 0x6e, 0x2d, 0xb0, 0x2e, 0x55, 0x80, 0xae, 0x40, 0xa1, 0xbd, 0x17, + 0x5f, 0x3e, 0xa7, 0xfc, 0xbe, 0xfc, 0x7c, 0x64, 0x53, 0x3f, 0xaf, 0xc3, + 0xc7, 0x16, 0x58, 0x97, 0x72, 0x29, 0x71, 0xda, 0x80, 0x44, 0x9c, 0x2f, + 0x9e, 0x3b, 0xc7, 0xa5, 0x0b, 0x16, 0xb4, 0x5d, 0x4f, 0x3a, 0x9d, 0x4a, + 0x3f, 0x37, 0xeb, 0x73, 0xde, 0xf5, 0x50, 0x35, 0x02, 0x69, 0x6d, 0xfb, + 0xbd, 0xdb, 0xf0, 0x6a, 0x35, 0xa0, 0x8c, 0x53, 0x77, 0xa8, 0x4d, 0x3a, + 0x98, 0x3d, 0xc9, 0xdf, 0x77, 0x08, 0xd4, 0x02, 0x30, 0xfb, 0x04, 0x05, + 0x61, 0xd1, 0x08, 0x00, 0xfb, 0xde, 0x8c, 0xc0, 0xec, 0x91, 0x78, 0x33, + 0xc1, 0x0b, 0xe5, 0x29, 0x5b, 0x4d, 0x5f, 0xe2, 0xd5, 0x1d, 0xee, 0xff, + 0xcc, 0x5a, 0x4e, 0x8d, 0x57, 0x31, 0x8b, 0x36, 0x07, 0x8f, 0x39, 0x6c, + 0xb9, 0x79, 0x98, 0xb1, 0x47, 0x0f, 0x00, 0x30, 0xb2, 0xac, 0x48, 0xf5, + 0x89, 0xf6, 0x3c, 0x68, 0xf3, 0xe7, 0x0e, 0x62, 0x05, 0xe6, 0x0e, 0xd6, + 0x1a, 0x8c, 0x96, 0xad, 0x44, 0xee, 0x2c, 0x7a, 0x04, 0x55, 0xdf, 0xc1, + 0xb2, 0x54, 0x9e, 0x50, 0x5e, 0x08, 0x76, 0xd1, 0xa6, 0x7a, 0x58, 0xb5, + 0xaf, 0xac, 0xa2, 0xc1, 0xd8, 0xb8, 0xa0, 0x6c, 0xd8, 0x54, 0x7d, 0x87, + 0x52, 0xce, 0xc3, 0xa9, 0x4b, 0x6a, 0xb5, 0x1a, 0x1b, 0x56, 0x8d, 0xe0, + 0x6b, 0x0b, 0x9e, 0x49, 0x09, 0xee, 0xa4, 0x8b, 0xdd, 0x6b, 0x63, 0x2c, + 0x34, 0xf0, 0xcf, 0x4a, 0xb5, 0x75, 0x25, 0x88, 0x00, 0xa0, 0x35, 0xe3, + 0x22, 0x66, 0x0c, 0x64, 0x31, 0x5c, 0xec, 0xc7, 0x57, 0xef, 0xf6, 0x39, + 0x05, 0xd3, 0x92, 0xe7, 0x02, 0x48, 0x16, 0x21, 0xb0, 0x5c, 0x46, 0x65, + 0x9a, 0x6c, 0x68, 0xf7, 0xb2, 0x15, 0x0f, 0x71, 0x08, 0xa1, 0xf2, 0x84, + 0xe1, 0x6b, 0x47, 0x70, 0x3d, 0x47, 0x7d, 0xbb, 0xb3, 0x20, 0xee, 0x9b, + 0x0d, 0xe1, 0xe4, 0xee, 0xb4, 0x8b, 0x10, 0x50, 0x73, 0x3c, 0xa4, 0xef, + 0x22, 0x0c, 0x8b, 0x06, 0x60, 0x19, 0x16, 0xd5, 0xc9, 0xd9, 0x17, 0x33, + 0xa9, 0x9e, 0xae, 0xb1, 0xe7, 0xf8, 0x2e, 0x76, 0xde, 0xb1, 0x93, 0xca, + 0x40, 0x85, 0x91, 0x49, 0x55, 0x1e, 0x3c, 0x17, 0xe4, 0x26, 0x83, 0xaf, + 0x7e, 0x94, 0x89, 0x8b, 0xbe, 0x08, 0xc0, 0x15, 0x18, 0xdc, 0x63, 0x9c, + 0x53, 0x10, 0xa8, 0xfe, 0x18, 0xa6, 0x95, 0xd8, 0x47, 0xc1, 0xb5, 0x42, + 0xb0, 0x56, 0x04, 0x90, 0xd2, 0xf4, 0x96, 0xc1, 0xfe, 0x08, 0x92, 0xd5, + 0x67, 0x0e, 0x30, 0xf4, 0x1e, 0x05, 0xf0, 0x4a, 0x6f, 0xd3, 0xea, 0x04, + 0xd6, 0xa2, 0x5f, 0x3d, 0xf5, 0x1b, 0xec, 0x9b, 0xd8, 0xe7, 0x24, 0xc7, + 0x31, 0x22, 0xe8, 0x17, 0xf0, 0x76, 0x57, 0x95, 0x83, 0xf6, 0x60, 0x3f, + 0x3f, 0x1f, 0xd8, 0x79, 0xa7, 0x1e, 0xcf, 0xd7, 0x13, 0x41, 0x23, 0xb8, + 0x56, 0xa8, 0x7d, 0xce, 0x9e, 0xe8, 0x9a, 0xf6, 0x4c, 0xed, 0x8a, 0xdc, + 0xc5, 0x90, 0x01, 0xff, 0x87, 0x43, 0x7d, 0xeb, 0x56, 0x8a, 0xc7, 0xb6, + 0xc2, 0x3b, 0x6d, 0x78, 0xe0, 0x3d, 0x00, 0xd4, 0x97, 0x6f, 0xa5, 0xf8, + 0xf0, 0x2d, 0xf0, 0xcc, 0x77, 0x70, 0xa5, 0xc3, 0x58, 0xb5, 0xc2, 0xce, + 0x3b, 0x76, 0xb2, 0xf1, 0x41, 0x55, 0xb3, 0x4b, 0xdf, 0xc7, 0x97, 0x5e, + 0x71, 0xe8, 0x5f, 0xb0, 0x94, 0x97, 0x5e, 0x51, 0xbf, 0xd1, 0x37, 0xbd, + 0xf1, 0x32, 0x5e, 0x7a, 0x45, 0xc1, 0xb5, 0x74, 0x85, 0x80, 0xad, 0x97, + 0xbf, 0xff, 0x42, 0xe4, 0x07, 0xa0, 0x37, 0x80, 0xa4, 0x65, 0xca, 0x94, + 0x29, 0x53, 0xa6, 0x4c, 0x99, 0x32, 0x65, 0xca, 0x94, 0x29, 0x53, 0xa6, + 0x4c, 0x99, 0x32, 0x65, 0xca, 0x94, 0x29, 0x53, 0xa6, 0x4c, 0x99, 0x32, + 0x65, 0xca, 0x94, 0x29, 0x53, 0xa6, 0x0b, 0x53, 0x06, 0xd5, 0xca, 0x94, + 0x29, 0x53, 0xa6, 0x4c, 0x99, 0x7e, 0x02, 0x14, 0x7e, 0x7c, 0xde, 0x6d, + 0xd5, 0x65, 0xfd, 0x03, 0xdd, 0x10, 0x2e, 0x24, 0x67, 0x3a, 0xaf, 0xc4, + 0x1c, 0xda, 0x08, 0xa1, 0x2a, 0xa6, 0x69, 0xc6, 0x80, 0x95, 0x39, 0xe2, + 0x2f, 0x5f, 0x5d, 0xa6, 0xf6, 0x5c, 0xad, 0x0d, 0xa8, 0x25, 0x84, 0xc0, + 0x99, 0x52, 0x20, 0x98, 0x43, 0x47, 0x0e, 0x45, 0xc7, 0x76, 0x9f, 0xfa, + 0xe8, 0xd0, 0xf5, 0xdc, 0x68, 0x55, 0xe4, 0x50, 0x43, 0x43, 0xc3, 0x58, + 0xa6, 0x89, 0xd9, 0x1f, 0x83, 0xb5, 0xf4, 0x74, 0xbc, 0xf7, 0xb4, 0xa0, + 0x8c, 0xa4, 0x2a, 0x04, 0x46, 0x00, 0x8c, 0x09, 0x61, 0x56, 0xae, 0x37, + 0xf7, 0xe4, 0x78, 0x3d, 0x8d, 0x69, 0xf7, 0xb4, 0x1b, 0xa8, 0xfb, 0x56, + 0xe8, 0x29, 0x24, 0xe0, 0x34, 0xdd, 0x3e, 0x7c, 0xd6, 0xfd, 0x9a, 0x98, + 0x58, 0x46, 0x01, 0x7f, 0x5a, 0xbb, 0x87, 0x39, 0x95, 0xc6, 0xce, 0xe1, + 0xe7, 0x98, 0x0d, 0x3a, 0x64, 0x81, 0x13, 0x5c, 0xaf, 0x61, 0x40, 0x21, + 0x0f, 0x8d, 0x26, 0x8d, 0x67, 0x94, 0xfd, 0xfb, 0x3f, 0x57, 0x62, 0xf3, + 0x27, 0x6a, 0x11, 0x4c, 0x0b, 0x60, 0xc9, 0x8a, 0xe4, 0xca, 0x93, 0x87, + 0xee, 0xdb, 0x0d, 0x8d, 0x60, 0x62, 0xcb, 0x22, 0x03, 0x4e, 0x6b, 0x30, + 0xad, 0x50, 0xfa, 0x71, 0xf0, 0xc1, 0xb4, 0x65, 0x1a, 0x0a, 0x70, 0x15, + 0xad, 0x96, 0xac, 0xbe, 0x0e, 0xb7, 0xfa, 0x02, 0xe0, 0x54, 0x00, 0x97, + 0xd2, 0x27, 0xd6, 0x14, 0x84, 0x00, 0x11, 0x00, 0xc0, 0x00, 0x64, 0x0c, + 0xd4, 0x8a, 0x20, 0x5c, 0xe1, 0xaa, 0xaf, 0x29, 0x20, 0x50, 0x14, 0x9f, + 0xa6, 0x70, 0xc2, 0x91, 0x0e, 0xef, 0x8a, 0xe0, 0x58, 0xc1, 0xe4, 0x03, + 0xdb, 0x54, 0x62, 0x2e, 0x42, 0x68, 0x00, 0x00, 0x20, 0x00, 0x49, 0x44, + 0x41, 0x54, 0x06, 0xd3, 0x61, 0xbb, 0x2a, 0xf5, 0xdb, 0xeb, 0x16, 0x5f, + 0x72, 0xc5, 0x70, 0x19, 0x6d, 0x6d, 0x53, 0x04, 0x10, 0xae, 0x46, 0x5b, + 0xb8, 0x0b, 0x89, 0x33, 0x94, 0x21, 0x82, 0xfb, 0x71, 0x1e, 0x35, 0xee, + 0x34, 0x00, 0x2f, 0x61, 0xaf, 0xa7, 0x7d, 0xf2, 0x97, 0x3f, 0xe3, 0x75, + 0x74, 0x9f, 0x35, 0x5d, 0x29, 0xff, 0xdd, 0x60, 0x5d, 0x9d, 0xde, 0x0d, + 0xef, 0x02, 0xc1, 0x5e, 0x42, 0x08, 0x9a, 0xb2, 0xd9, 0x31, 0x8f, 0xeb, + 0x18, 0xb7, 0xe6, 0x27, 0x2f, 0xf2, 0xf3, 0x9a, 0xa0, 0x30, 0x97, 0x1d, + 0x3d, 0x2d, 0xa0, 0xc0, 0x5d, 0x0d, 0x3f, 0x7e, 0xe6, 0x17, 0x0a, 0xd4, + 0x02, 0x30, 0x7a, 0x0d, 0x08, 0x26, 0x8d, 0x36, 0x65, 0x93, 0xe6, 0x54, + 0x30, 0xe9, 0xa1, 0x03, 0x10, 0xd0, 0x5a, 0x68, 0x61, 0xf4, 0x1a, 0x18, + 0x67, 0x83, 0xbc, 0x4a, 0x82, 0xd9, 0x6b, 0x82, 0x00, 0xdf, 0x97, 0xd0, + 0x92, 0x89, 0xd5, 0xea, 0x4d, 0xcb, 0x24, 0x2f, 0xf2, 0x98, 0x96, 0x19, + 0x5d, 0x93, 0x9e, 0xff, 0x4b, 0x29, 0xb1, 0x7a, 0x2d, 0x9c, 0xba, 0x83, + 0xd5, 0x6b, 0x51, 0x1c, 0x2c, 0x22, 0x72, 0x02, 0xb3, 0xdf, 0x54, 0x40, + 0xc0, 0x1c, 0xc8, 0xa6, 0x8c, 0xae, 0xdd, 0x9d, 0x76, 0x3b, 0xdc, 0x17, + 0x75, 0x5c, 0xe8, 0xb1, 0x70, 0xa5, 0x0b, 0x04, 0x79, 0xfe, 0x1c, 0x00, + 0xac, 0x8e, 0xa0, 0xaa, 0x54, 0x18, 0x61, 0x18, 0xc8, 0xe9, 0xee, 0x50, + 0xae, 0xb4, 0x84, 0x88, 0xf3, 0xd5, 0xf9, 0x02, 0xb8, 0xba, 0xa5, 0x6b, + 0x2e, 0x1b, 0x0a, 0x1e, 0x70, 0x7e, 0xcf, 0x7d, 0x60, 0xd5, 0x2a, 0x26, + 0x0f, 0x1f, 0x06, 0x60, 0x10, 0x98, 0xe8, 0xe6, 0x2f, 0xd8, 0xce, 0x17, + 0x86, 0xa5, 0xc3, 0x9f, 0x06, 0x34, 0xb7, 0x50, 0x17, 0x02, 0xd5, 0xea, + 0x1a, 0xd7, 0xe0, 0x20, 0x93, 0x13, 0x71, 0xca, 0x43, 0x70, 0x57, 0x3a, + 0x9e, 0xb9, 0xe0, 0x59, 0x3a, 0xc8, 0x6a, 0x2e, 0xbf, 0xdd, 0xc2, 0x0c, + 0xa4, 0x8e, 0x3b, 0x85, 0xef, 0x64, 0xaf, 0x1b, 0x9c, 0xeb, 0xc8, 0xc0, + 0x00, 0x83, 0x61, 0xb8, 0x81, 0x01, 0x35, 0x3b, 0x72, 0x1e, 0xf6, 0x66, + 0xd3, 0xa6, 0x6b, 0x8b, 0xd1, 0xfe, 0x8e, 0x00, 0xfe, 0x74, 0xe0, 0x1b, + 0xdf, 0xe4, 0x86, 0x77, 0xbf, 0x8b, 0x4d, 0x4b, 0x63, 0xc0, 0x4f, 0x04, + 0x1d, 0x69, 0x35, 0xd8, 0xf1, 0x64, 0x9d, 0x9b, 0x02, 0xb0, 0xc4, 0xbe, + 0x29, 0xb5, 0xdd, 0xb2, 0xb4, 0xcc, 0xf6, 0x13, 0xd5, 0x68, 0x9b, 0x88, + 0xa3, 0x8b, 0x9d, 0xea, 0xa4, 0xc4, 0x30, 0xc0, 0x99, 0xf4, 0x18, 0xe9, + 0x8d, 0xf3, 0x85, 0xca, 0x74, 0x7b, 0x5e, 0x6c, 0x18, 0x50, 0x36, 0x0c, + 0x9c, 0x49, 0x2f, 0x71, 0x5e, 0x87, 0x6f, 0xe9, 0x69, 0xda, 0x74, 0x6d, + 0x91, 0x7c, 0x00, 0xb5, 0xd0, 0x4b, 0xdb, 0x1d, 0x27, 0x3a, 0x4f, 0xc4, + 0xb8, 0x90, 0x6b, 0xbd, 0xd0, 0x70, 0x5b, 0x96, 0x96, 0xd9, 0x3e, 0xd9, + 0xe8, 0x3e, 0x31, 0x5b, 0x9b, 0x7c, 0x19, 0xbd, 0xc1, 0x9e, 0xff, 0xe3, + 0x05, 0x6a, 0x85, 0x7a, 0xa8, 0x02, 0x2b, 0x17, 0xc3, 0x23, 0xfb, 0xc0, + 0xb4, 0xd4, 0xec, 0x18, 0x3d, 0x5d, 0x4e, 0x3d, 0xda, 0x5d, 0xfb, 0x5f, + 0xda, 0xeb, 0x8c, 0x1b, 0x56, 0xa9, 0x6d, 0xe5, 0xdd, 0x3e, 0xfc, 0x27, + 0x35, 0x81, 0x9d, 0xbb, 0x6e, 0x80, 0xa7, 0x0f, 0xb4, 0x01, 0xb5, 0x7e, + 0x18, 0x9d, 0x3a, 0xa4, 0x40, 0x51, 0x97, 0x5c, 0xd2, 0x0e, 0xe5, 0xf2, + 0x9e, 0xdc, 0x03, 0x4f, 0x02, 0x37, 0x2e, 0x81, 0xcf, 0xde, 0x0b, 0x8b, + 0xd4, 0x44, 0x44, 0x4e, 0xab, 0x89, 0x52, 0x61, 0x19, 0xb2, 0x7a, 0x45, + 0x3b, 0x9a, 0xae, 0x54, 0xb4, 0x38, 0xc4, 0xa1, 0x79, 0xf9, 0x71, 0x26, + 0x9d, 0x79, 0xf9, 0x0b, 0x35, 0xd2, 0xc1, 0x8f, 0x5d, 0x1c, 0xa5, 0xf2, + 0xc4, 0xc1, 0xd9, 0x2e, 0xf5, 0x75, 0xd1, 0xee, 0xe7, 0xc6, 0x29, 0x99, + 0xa6, 0x02, 0x55, 0xf9, 0x0e, 0xc3, 0x57, 0xab, 0x09, 0x9a, 0xf5, 0x87, + 0xde, 0x1b, 0xf9, 0xc9, 0x7f, 0xec, 0x6f, 0xa8, 0x3c, 0x55, 0x8b, 0x8e, + 0xef, 0x5e, 0x55, 0x42, 0x22, 0xd9, 0xfb, 0x91, 0x43, 0x51, 0x5d, 0x7a, + 0xd3, 0x37, 0x56, 0xd3, 0xd8, 0xaf, 0xda, 0x3d, 0x02, 0x17, 0x7e, 0x4b, + 0x11, 0xd6, 0x0a, 0x77, 0x57, 0x08, 0x11, 0xbf, 0x07, 0x6f, 0x8e, 0xcb, + 0xa9, 0x91, 0x65, 0x0a, 0x5a, 0xbc, 0xeb, 0x58, 0x7c, 0x5f, 0x6e, 0xbb, + 0x71, 0x98, 0x93, 0x93, 0x01, 0xee, 0x61, 0xda, 0x61, 0x98, 0x51, 0xbc, + 0x07, 0x55, 0x3a, 0xec, 0xbf, 0xf8, 0x1b, 0xbc, 0x27, 0x24, 0x7b, 0x8f, + 0xc6, 0xe9, 0xd8, 0xf6, 0xa1, 0x32, 0x3b, 0xde, 0x7d, 0x4f, 0x74, 0xbc, + 0xe9, 0x1b, 0xa3, 0x90, 0xab, 0xd2, 0x38, 0xec, 0xc2, 0x61, 0x95, 0x96, + 0xea, 0xe3, 0x1e, 0x05, 0xa0, 0x00, 0x94, 0xbf, 0xb1, 0x9a, 0xea, 0xb3, + 0x92, 0xa3, 0x4f, 0x1e, 0x4d, 0xa4, 0x63, 0xc7, 0x6f, 0xdf, 0x1e, 0x1d, + 0x6f, 0xb8, 0x77, 0x1d, 0x95, 0x3f, 0xda, 0x12, 0xa7, 0x61, 0x40, 0xb5, + 0x5d, 0xc6, 0x3f, 0x12, 0xdf, 0x0f, 0xeb, 0x4f, 0xfe, 0x8a, 0xbd, 0xf7, + 0xd5, 0x01, 0x58, 0x5b, 0x06, 0x30, 0xd8, 0xbd, 0x3a, 0x4e, 0xc7, 0xfa, + 0x43, 0xa3, 0x78, 0x8f, 0x9c, 0x42, 0xd2, 0xc4, 0xb8, 0x51, 0x4d, 0x20, + 0x1b, 0xfb, 0xc8, 0xa1, 0x28, 0x1f, 0x28, 0xef, 0x5b, 0xcd, 0xee, 0x47, + 0xe3, 0xeb, 0x2e, 0x73, 0x7e, 0xf5, 0xdf, 0x6e, 0xea, 0x82, 0xe7, 0x9d, + 0x55, 0xe9, 0x69, 0xd6, 0xa0, 0xf2, 0xd1, 0xfc, 0x2c, 0xc7, 0x79, 0xba, + 0x63, 0x09, 0x5e, 0x2b, 0xec, 0xc2, 0xff, 0xac, 0xd7, 0x52, 0x1c, 0x52, + 0xb1, 0x96, 0x82, 0x6d, 0xf9, 0x8a, 0x12, 0x06, 0x30, 0x7e, 0x1a, 0x76, + 0xfd, 0xd1, 0x18, 0x46, 0x00, 0xbe, 0xf3, 0xa6, 0x5c, 0xdc, 0xd3, 0xf1, + 0xbb, 0x40, 0x2e, 0x8f, 0x69, 0x1a, 0xec, 0xbd, 0x4f, 0x95, 0x57, 0x77, + 0xdf, 0x55, 0xc6, 0x05, 0xf2, 0x79, 0xe0, 0x4a, 0x95, 0xd7, 0x2d, 0x59, + 0x05, 0xd0, 0x60, 0x49, 0xb9, 0x8c, 0xd9, 0x82, 0x7b, 0x7e, 0x4b, 0xbd, + 0x6b, 0x96, 0x29, 0x70, 0x26, 0x54, 0xde, 0xee, 0x3e, 0x53, 0xc5, 0x7d, + 0xa6, 0x8a, 0x75, 0x95, 0x2a, 0xef, 0x36, 0xae, 0xaf, 0x30, 0x74, 0xe3, + 0x30, 0x37, 0x2d, 0x13, 0x38, 0x11, 0x44, 0x2a, 0x6e, 0x4b, 0x0f, 0xad, + 0x51, 0x57, 0xb8, 0xe9, 0x0f, 0x15, 0x30, 0x6e, 0xc7, 0xfa, 0x0a, 0xe4, + 0xf2, 0x58, 0x96, 0x11, 0x81, 0xb3, 0x9c, 0x13, 0x15, 0x58, 0x1a, 0x4f, + 0x7c, 0xbf, 0x7d, 0xbd, 0x02, 0x64, 0xad, 0xbd, 0xcb, 0xc2, 0x69, 0x49, + 0x56, 0x0c, 0xa1, 0xdd, 0x21, 0x09, 0x12, 0xee, 0x0e, 0xec, 0xdd, 0xbe, + 0x5e, 0xbd, 0xab, 0x76, 0x7f, 0x31, 0xb2, 0xa7, 0x6c, 0x8e, 0x61, 0x2f, + 0x1d, 0x56, 0xdb, 0xe0, 0x5c, 0x29, 0xa8, 0x34, 0xa5, 0x27, 0xae, 0x0b, + 0xa1, 0x00, 0x5b, 0xf2, 0x1c, 0x88, 0x37, 0xc4, 0xee, 0x66, 0x4f, 0x0c, + 0x12, 0xf1, 0x26, 0xc6, 0x30, 0xcb, 0x23, 0x78, 0xa7, 0x1b, 0x18, 0xbd, + 0x79, 0xe8, 0x11, 0xd1, 0x84, 0x4f, 0x65, 0x53, 0xd5, 0x45, 0x7c, 0x1f, + 0x8c, 0x1e, 0xa1, 0xf5, 0x31, 0x34, 0xd4, 0x04, 0xd2, 0x00, 0x36, 0x50, + 0x9b, 0xf4, 0x11, 0x3d, 0xf3, 0x84, 0xee, 0xce, 0xcb, 0xd7, 0xf9, 0xe9, + 0xf5, 0xb0, 0x39, 0x97, 0x3e, 0x18, 0x6c, 0xc7, 0x7b, 0x2e, 0x8a, 0xdc, + 0x16, 0x68, 0xfb, 0xdd, 0x34, 0xf3, 0x83, 0x57, 0xe7, 0x65, 0x7f, 0xe6, + 0x07, 0xaf, 0xf2, 0x33, 0xf3, 0xb0, 0x37, 0x9b, 0xe6, 0x93, 0x9e, 0x50, + 0x6f, 0x01, 0x5e, 0x02, 0xde, 0x1c, 0xfc, 0xe9, 0x7a, 0x09, 0x2e, 0x28, + 0x2d, 0x17, 0x86, 0x0c, 0x8d, 0xd5, 0x06, 0xc5, 0x0a, 0xb6, 0x73, 0x41, + 0xa8, 0x40, 0x81, 0xb2, 0xd2, 0x35, 0x8e, 0x34, 0x1e, 0x55, 0xb7, 0x73, + 0x08, 0x20, 0x00, 0x7f, 0xa5, 0xc3, 0xed, 0xd1, 0xdc, 0x43, 0xbb, 0x21, + 0xd4, 0xab, 0x9b, 0xda, 0xd2, 0x18, 0xd8, 0x08, 0x61, 0x5c, 0x9d, 0xd2, + 0x7b, 0x21, 0x7a, 0x18, 0xb8, 0x65, 0x2b, 0xb0, 0x35, 0x70, 0xd8, 0xaa, + 0x9d, 0xdc, 0x4a, 0x3b, 0x48, 0xab, 0x9b, 0x3a, 0x84, 0x3f, 0x1f, 0xa0, + 0xd6, 0xc9, 0xba, 0xcf, 0x92, 0xa2, 0x91, 0x38, 0x06, 0x3a, 0xba, 0x01, + 0x2c, 0xd1, 0xa0, 0x56, 0x63, 0x93, 0xb1, 0x7b, 0x08, 0xd8, 0xea, 0xe4, + 0x36, 0x5f, 0xf7, 0xf9, 0xda, 0x59, 0x12, 0xf6, 0xfb, 0x3e, 0xea, 0xc3, + 0x8d, 0x06, 0xc3, 0x93, 0xc0, 0x35, 0xb1, 0x8d, 0xb1, 0xa7, 0x7c, 0xca, + 0xd7, 0xe4, 0x19, 0x7b, 0x2a, 0xe8, 0x6b, 0xbf, 0x26, 0x4f, 0xf5, 0x29, + 0x55, 0x72, 0x0e, 0x2d, 0x2b, 0xb0, 0xfb, 0xf8, 0x07, 0x00, 0xd8, 0x34, + 0xb4, 0x87, 0xda, 0x59, 0x15, 0xa6, 0xb4, 0x50, 0x95, 0xb4, 0xb5, 0xb3, + 0xcd, 0x08, 0xa8, 0x05, 0x31, 0x50, 0x2b, 0xad, 0x66, 0x0b, 0x90, 0x3e, + 0xc3, 0x83, 0x05, 0xc6, 0x26, 0x92, 0x10, 0x02, 0xbb, 0x60, 0xe3, 0x34, + 0xd4, 0xef, 0xa2, 0x1d, 0x4c, 0xa2, 0x29, 0x38, 0xb7, 0xe7, 0xd9, 0x8f, + 0x82, 0x4c, 0x95, 0xec, 0x2d, 0x2f, 0x91, 0x3f, 0xee, 0x7f, 0xd4, 0x63, + 0x64, 0x66, 0xb3, 0x4a, 0xa3, 0x94, 0xd0, 0x0b, 0x76, 0x0f, 0x38, 0xbe, + 0x8a, 0xc3, 0x36, 0x60, 0x3e, 0x98, 0x5b, 0x21, 0xca, 0x48, 0xa9, 0xca, + 0x5d, 0xd9, 0x11, 0xbc, 0x93, 0xcc, 0x95, 0x5d, 0xaf, 0x96, 0x38, 0xf6, + 0xe5, 0x51, 0xd0, 0x9a, 0xc2, 0x96, 0x59, 0xc2, 0xaf, 0x7b, 0x40, 0x93, + 0xa6, 0xef, 0x42, 0xae, 0xd1, 0x06, 0x8b, 0x72, 0xa6, 0x6a, 0x80, 0x8b, + 0x21, 0xca, 0xf8, 0xb2, 0xbd, 0x1d, 0x6d, 0xf7, 0x95, 0xa8, 0xd6, 0x5d, + 0x36, 0x5d, 0x67, 0x73, 0xef, 0xe3, 0x35, 0xc8, 0xed, 0x80, 0x56, 0x95, + 0xbb, 0xaf, 0xfb, 0x7b, 0x75, 0xcc, 0x47, 0x39, 0x78, 0xfa, 0x8b, 0xc0, + 0x16, 0x42, 0x28, 0x8d, 0x94, 0x3e, 0x32, 0xa8, 0xad, 0x48, 0x04, 0x86, + 0x10, 0xf8, 0x51, 0xd2, 0x25, 0x86, 0x10, 0xcc, 0xd6, 0x7b, 0xea, 0x4f, + 0xbb, 0x51, 0xfd, 0x44, 0xdf, 0x8f, 0x2c, 0xf8, 0x12, 0x61, 0x28, 0xfb, + 0xfe, 0x74, 0x03, 0xa3, 0xb7, 0x10, 0x6d, 0xd5, 0x79, 0x10, 0xed, 0x4d, + 0xc9, 0x0e, 0xf1, 0xc4, 0x61, 0xfc, 0xe9, 0x06, 0x86, 0x91, 0x5c, 0x44, + 0x44, 0xce, 0x34, 0x11, 0x3d, 0xdd, 0x16, 0x21, 0x69, 0xe2, 0xfb, 0x7e, + 0x57, 0xf8, 0xff, 0x6c, 0xaa, 0x13, 0x83, 0xb1, 0x8a, 0xc4, 0xb0, 0x2c, + 0xdd, 0x1d, 0xcd, 0xbd, 0x53, 0x78, 0x5d, 0xc5, 0xe5, 0x81, 0xfb, 0x31, + 0x60, 0x39, 0x70, 0x2c, 0xe9, 0xce, 0x31, 0xb8, 0xbf, 0x83, 0xff, 0xf7, + 0x3d, 0xa7, 0xfc, 0x7f, 0x69, 0x39, 0x18, 0xc7, 0xc0, 0x0f, 0xdc, 0x7f, + 0x75, 0xab, 0x82, 0x68, 0xdd, 0x72, 0x0b, 0x4c, 0xde, 0xa2, 0xf6, 0xff, + 0x18, 0x05, 0xab, 0x7a, 0x2d, 0x38, 0x55, 0x8f, 0x07, 0xf1, 0x5c, 0x77, + 0x0c, 0x8c, 0x87, 0xe1, 0xe1, 0x87, 0xe1, 0xba, 0xeb, 0x00, 0x06, 0x22, + 0x12, 0x56, 0x5f, 0x10, 0xbf, 0x7f, 0x4c, 0xf9, 0x0f, 0xd3, 0x76, 0x0c, + 0xf0, 0x8b, 0x60, 0xdc, 0xa2, 0x81, 0xc0, 0x96, 0xab, 0x13, 0x5f, 0xda, + 0x0a, 0xbf, 0x7a, 0x0c, 0x1e, 0x0f, 0x3c, 0xae, 0x04, 0x06, 0x02, 0x4f, + 0x3b, 0x8f, 0xc0, 0xc6, 0x01, 0xd8, 0x99, 0xea, 0xf0, 0xda, 0xb8, 0xf2, + 0xc2, 0xe0, 0x5b, 0xf3, 0x0d, 0xd7, 0x09, 0x16, 0x35, 0x5f, 0xf9, 0x33, + 0x3e, 0xb4, 0x24, 0x22, 0x80, 0xdd, 0x45, 0x63, 0x31, 0x39, 0x91, 0x58, + 0xf4, 0xc7, 0x9f, 0xf1, 0xe7, 0x1e, 0xa7, 0x39, 0x0f, 0x99, 0x66, 0x11, + 0xcf, 0xab, 0x33, 0x5b, 0x8b, 0xa3, 0x7d, 0xfc, 0x22, 0x6e, 0x35, 0x49, + 0x99, 0x5c, 0xac, 0x21, 0xad, 0xa8, 0x4f, 0xbf, 0x25, 0x55, 0xc5, 0xb9, + 0x4b, 0x3e, 0x2c, 0x7a, 0x8c, 0xc4, 0x18, 0x80, 0x10, 0x79, 0xea, 0xf5, + 0x1a, 0xc5, 0xa2, 0xea, 0x7f, 0x91, 0x2d, 0xb5, 0x10, 0xd1, 0xff, 0xc7, + 0xde, 0xdb, 0x87, 0xc9, 0x71, 0xd5, 0x77, 0xbe, 0x1f, 0xb3, 0x0d, 0x9c, + 0x4e, 0x46, 0x50, 0x45, 0x46, 0xa4, 0x4b, 0x96, 0x42, 0x17, 0x19, 0x21, + 0xb5, 0x57, 0x0a, 0xee, 0x41, 0xe6, 0x7a, 0x66, 0x6d, 0x76, 0x34, 0x60, + 0x2e, 0x1a, 0x9c, 0x2c, 0x96, 0xe3, 0x2c, 0x58, 0xe1, 0xb9, 0x13, 0xdb, + 0xd9, 0x05, 0xcb, 0x86, 0x65, 0x4d, 0x5e, 0xf6, 0xe2, 0xec, 0x2a, 0xb1, + 0x79, 0x12, 0x16, 0x2b, 0x24, 0x7e, 0x63, 0x9f, 0x1b, 0x8b, 0xcc, 0x3e, + 0x46, 0x76, 0xb8, 0x8e, 0x05, 0x37, 0x76, 0x46, 0x5e, 0x8c, 0x47, 0x13, + 0xac, 0x3b, 0xa3, 0x1b, 0x29, 0x33, 0x26, 0x26, 0x6a, 0x69, 0x35, 0x71, + 0x35, 0x68, 0xa4, 0xaa, 0xa0, 0x49, 0xba, 0xb0, 0x7a, 0xb7, 0x0f, 0xb8, + 0x37, 0xbe, 0x7f, 0x9c, 0x73, 0xea, 0xad, 0xbb, 0x67, 0x46, 0xb6, 0xc1, + 0x24, 0xa9, 0xaf, 0x9e, 0x51, 0x55, 0x9d, 0xfa, 0x9d, 0xd7, 0xea, 0x3a, + 0xe7, 0xd4, 0xa9, 0x3a, 0x9f, 0xe3, 0x07, 0x1e, 0x20, 0x71, 0x4a, 0x15, + 0x44, 0x9f, 0xa0, 0x11, 0x7a, 0x84, 0x75, 0x1f, 0xb7, 0x3c, 0x4c, 0x51, + 0xa7, 0xa9, 0x7e, 0xa2, 0x86, 0x73, 0x45, 0xb5, 0x2b, 0x50, 0x0b, 0xa0, + 0xbe, 0x50, 0xa7, 0xbe, 0xf0, 0x05, 0xca, 0x03, 0x65, 0x06, 0xab, 0xd7, + 0x72, 0xe0, 0x91, 0xbd, 0xa9, 0xf3, 0xb5, 0x13, 0xf3, 0x6c, 0xb7, 0xca, + 0xdd, 0x13, 0xba, 0x8c, 0xa4, 0x94, 0x14, 0x01, 0xd1, 0x96, 0x48, 0x0d, + 0x13, 0x73, 0x0a, 0xea, 0x5d, 0xa2, 0xdf, 0x86, 0xa1, 0x36, 0xcc, 0x66, + 0xae, 0x9d, 0x28, 0x80, 0x2d, 0x15, 0xec, 0xc9, 0x00, 0xb5, 0xba, 0xbd, + 0x63, 0xb5, 0x0a, 0x10, 0x16, 0xd0, 0x97, 0xa8, 0xc8, 0xac, 0xd4, 0xef, + 0xcd, 0xfa, 0x9c, 0xa8, 0x4c, 0x0f, 0x19, 0xd0, 0x19, 0x02, 0x51, 0x52, + 0xf5, 0x9b, 0x7a, 0xd7, 0x53, 0xa4, 0xf2, 0xcd, 0xfb, 0x98, 0x97, 0x37, + 0x52, 0x5d, 0xd8, 0xc7, 0x4d, 0x8f, 0xf9, 0xd8, 0xfd, 0x0e, 0xfe, 0xa2, + 0x1f, 0x2f, 0x6e, 0x05, 0x14, 0x0b, 0x92, 0x96, 0x86, 0x20, 0x16, 0x45, + 0x51, 0xc5, 0xd9, 0xd6, 0xbf, 0xc5, 0x76, 0xfc, 0xeb, 0x18, 0x02, 0x22, + 0x24, 0x64, 0x82, 0x84, 0x23, 0xdb, 0xb2, 0x2b, 0x51, 0x3a, 0x0b, 0x15, + 0x13, 0x99, 0xdf, 0x80, 0xd4, 0x61, 0xd6, 0x24, 0xf8, 0xe8, 0x45, 0x68, + 0x24, 0x48, 0x51, 0xa4, 0xa5, 0xdb, 0x63, 0xbb, 0x00, 0x0d, 0xa9, 0x40, + 0x7b, 0x35, 0xd9, 0x62, 0xb6, 0x00, 0xa5, 0x02, 0x1c, 0x42, 0x45, 0xe9, + 0xb7, 0x89, 0xca, 0xc1, 0x37, 0x69, 0x68, 0xc3, 0x60, 0x01, 0xe6, 0xda, + 0xdd, 0x01, 0x5a, 0x83, 0x05, 0x85, 0x72, 0x5d, 0xe9, 0xae, 0xbd, 0xf8, + 0xe2, 0x8b, 0x39, 0x73, 0x46, 0x01, 0x5e, 0xce, 0x3e, 0x7f, 0x9e, 0x37, + 0xae, 0x5d, 0xc1, 0x43, 0x0f, 0x6d, 0xda, 0xb4, 0x29, 0xda, 0x7f, 0xad, + 0xdf, 0xc7, 0x6b, 0x4d, 0x78, 0x3f, 0xad, 0xdc, 0x82, 0xf6, 0x49, 0x5e, + 0x57, 0xe8, 0xfe, 0x9c, 0xe0, 0xac, 0xed, 0xc7, 0x3f, 0x17, 0x77, 0x28, + 0x9d, 0x3e, 0x05, 0xd4, 0x72, 0xfa, 0xe0, 0xaf, 0x33, 0x20, 0x9c, 0xe5, + 0xe2, 0x3f, 0x79, 0xf2, 0x64, 0x07, 0x04, 0xeb, 0xe2, 0x8b, 0x2f, 0xe6, + 0xc4, 0xb1, 0xa3, 0x11, 0xbc, 0x0a, 0x60, 0xd3, 0xdb, 0xe2, 0xb4, 0x26, + 0x61, 0x5b, 0xe7, 0xfd, 0xb3, 0x29, 0xff, 0xdd, 0xc2, 0x3c, 0x79, 0xf2, + 0x24, 0xa3, 0xa3, 0xa3, 0x9c, 0x39, 0x73, 0x86, 0xf3, 0xfe, 0xd9, 0x18, + 0xa4, 0x75, 0xfe, 0x7c, 0x14, 0xee, 0x26, 0x47, 0xd9, 0x99, 0x30, 0x93, + 0x61, 0x19, 0x7b, 0xe3, 0x8e, 0x2e, 0x27, 0x53, 0x7e, 0x27, 0x4f, 0x9e, + 0x54, 0x90, 0x2d, 0x0d, 0xd3, 0xe2, 0xc5, 0x34, 0x14, 0x0c, 0x60, 0x1d, + 0x2a, 0xde, 0xcd, 0xdb, 0x2e, 0xe3, 0xcc, 0x99, 0x33, 0x51, 0xbe, 0x56, + 0x92, 0x2f, 0x3d, 0x1e, 0x3a, 0x08, 0x43, 0x6e, 0x3c, 0xe6, 0xf3, 0xd0, + 0xa1, 0x1a, 0x73, 0x27, 0xe6, 0x19, 0xdc, 0xac, 0xc6, 0x37, 0x6a, 0x0b, + 0x1e, 0x95, 0x01, 0x97, 0x86, 0xf4, 0x29, 0x59, 0x0a, 0x76, 0x9f, 0x74, + 0xb3, 0x4b, 0x7a, 0xcc, 0x58, 0xfa, 0xd8, 0xc2, 0x05, 0xe9, 0x47, 0xef, + 0x44, 0xf7, 0x7f, 0x45, 0xf5, 0xe3, 0x86, 0xcb, 0x40, 0xa1, 0x08, 0x6b, + 0x5d, 0x0e, 0x3c, 0x32, 0xc5, 0xce, 0xeb, 0x46, 0xd9, 0xf7, 0xd9, 0xbd, + 0x54, 0x06, 0xca, 0x00, 0x38, 0x5b, 0x5c, 0xaa, 0xb3, 0x01, 0xf3, 0x4d, + 0x1f, 0x0a, 0x0a, 0x90, 0x0a, 0x7a, 0xec, 0x41, 0x08, 0x6e, 0xff, 0xfc, + 0x01, 0x84, 0x00, 0xb7, 0x5c, 0xc1, 0xab, 0xd7, 0x98, 0xac, 0xf9, 0xb8, + 0xe5, 0xee, 0x63, 0x08, 0x5e, 0x5d, 0xc5, 0x39, 0x56, 0x71, 0xf0, 0x13, + 0xcf, 0x10, 0xd1, 0x22, 0x48, 0x52, 0xb2, 0x7b, 0xc7, 0x28, 0x5e, 0xbd, + 0x86, 0xbf, 0xd4, 0x40, 0x4a, 0x89, 0x6d, 0xd9, 0x54, 0x06, 0xaa, 0x0c, + 0x6f, 0x1b, 0x05, 0xa4, 0x02, 0x69, 0x01, 0xe1, 0xb9, 0x10, 0x10, 0x34, + 0xf4, 0xad, 0x9e, 0x5c, 0xf8, 0x49, 0xac, 0x89, 0xdb, 0x10, 0xb1, 0x46, + 0x8d, 0x9d, 0xc4, 0x71, 0xa9, 0xaa, 0x42, 0x24, 0x8e, 0x29, 0x42, 0x6b, + 0xa9, 0x45, 0xb1, 0xaf, 0x88, 0xd5, 0x6f, 0x21, 0x74, 0x97, 0x4c, 0x9e, + 0x57, 0xfe, 0xfd, 0x53, 0x3e, 0x6e, 0xa5, 0xa2, 0xe0, 0x5b, 0x2d, 0xa8, + 0xe9, 0x05, 0xde, 0xa4, 0x94, 0xb4, 0x9a, 0x0d, 0x9c, 0x8d, 0x2e, 0xa2, + 0x2d, 0x90, 0x4d, 0x5f, 0x41, 0x09, 0xdb, 0x2d, 0x42, 0x19, 0xaa, 0xba, + 0x60, 0x05, 0x8d, 0x8c, 0xbe, 0x8b, 0x91, 0xd1, 0x77, 0x01, 0xf0, 0x5b, + 0xec, 0x81, 0x9f, 0x82, 0x2f, 0xfe, 0xde, 0x51, 0xae, 0xfe, 0x9c, 0xc2, + 0x7d, 0x7f, 0xf1, 0xf7, 0x8e, 0xc2, 0xe7, 0x36, 0x51, 0xe6, 0x01, 0x00, + 0x1e, 0x5c, 0x39, 0xc8, 0x58, 0xef, 0x4d, 0x1f, 0x56, 0x06, 0xdf, 0x7c, + 0x21, 0xbe, 0x23, 0xfd, 0xc7, 0xc1, 0x8f, 0x26, 0x8e, 0xae, 0x8a, 0xf6, + 0x3e, 0xfa, 0xc9, 0x9f, 0x4f, 0xd9, 0x7d, 0x94, 0xf4, 0xf1, 0x6a, 0x55, + 0x9b, 0xfb, 0x0e, 0x55, 0x0d, 0xd8, 0xaa, 0x92, 0x04, 0x7a, 0xfd, 0xbb, + 0x4e, 0xe3, 0xf7, 0x76, 0x3a, 0x01, 0x3c, 0xfd, 0xe5, 0xef, 0xf0, 0x20, + 0x37, 0xc7, 0x9d, 0xc5, 0x27, 0xe0, 0x69, 0xbe, 0xc3, 0x83, 0xff, 0xea, + 0x3f, 0xc3, 0xbf, 0x4a, 0xdb, 0x3e, 0xf8, 0x9f, 0xbe, 0xb4, 0xaa, 0x74, + 0xdd, 0xf2, 0x6b, 0xe9, 0xfc, 0x3c, 0xff, 0xbd, 0x33, 0x11, 0x60, 0x2b, + 0xbb, 0x55, 0x7a, 0xeb, 0xaa, 0xc2, 0xcd, 0x95, 0x2b, 0x57, 0xae, 0x5c, + 0xb9, 0x72, 0xe5, 0xca, 0x95, 0x2b, 0x57, 0xae, 0x5c, 0xb9, 0x72, 0xe5, + 0xca, 0x95, 0x2b, 0x57, 0xae, 0x5c, 0xb9, 0x72, 0xe5, 0xca, 0x95, 0x2b, + 0x57, 0xae, 0x5c, 0xdd, 0x95, 0x43, 0xb5, 0x72, 0xe5, 0xca, 0x95, 0x2b, + 0x57, 0xae, 0x57, 0x4b, 0x07, 0x6d, 0x5a, 0xd7, 0xfd, 0x29, 0x45, 0xd4, + 0xa4, 0x28, 0xab, 0x5f, 0xaf, 0x6e, 0x69, 0x3e, 0x06, 0xd6, 0x30, 0x2d, + 0xa3, 0xe4, 0xbe, 0x39, 0xee, 0x70, 0x13, 0x22, 0x82, 0x60, 0x59, 0xfd, + 0x56, 0x04, 0x5e, 0xc9, 0x82, 0xa6, 0x4a, 0xa5, 0xee, 0x93, 0x90, 0x0d, + 0x50, 0x2b, 0x0c, 0x43, 0xbd, 0x8a, 0x66, 0x0c, 0x6d, 0x49, 0xca, 0x1c, + 0xd7, 0x16, 0x94, 0x7d, 0x72, 0x82, 0x45, 0xa9, 0x54, 0x52, 0x1f, 0x1d, + 0xb7, 0x25, 0xb2, 0x0d, 0xf7, 0xdf, 0x7d, 0x80, 0xea, 0x65, 0xc3, 0x0c, + 0x6e, 0x19, 0x63, 0x32, 0xf8, 0x42, 0x1c, 0x46, 0x5b, 0x52, 0xb3, 0x2c, + 0x04, 0x31, 0x4c, 0xcb, 0xc8, 0x29, 0xa5, 0x27, 0x93, 0x64, 0xd5, 0x68, + 0x36, 0x22, 0x00, 0x4e, 0xf6, 0xa3, 0xeb, 0xa2, 0x28, 0x22, 0xfb, 0x64, + 0x0a, 0x42, 0x96, 0x0c, 0xdf, 0xee, 0xb3, 0x23, 0x68, 0x97, 0xdd, 0x67, + 0xd3, 0xa0, 0xb1, 0xac, 0x2d, 0x6d, 0x68, 0xb5, 0xd5, 0xc7, 0xcc, 0x61, + 0x33, 0x8c, 0x80, 0x2f, 0xe5, 0x72, 0x59, 0xf9, 0xb1, 0xe2, 0x6b, 0x20, + 0xdb, 0x12, 0x09, 0xb4, 0x98, 0xa1, 0x78, 0xf0, 0xfd, 0x91, 0x7b, 0xf8, + 0xac, 0x84, 0xff, 0xdb, 0x83, 0xcf, 0xda, 0x31, 0x0c, 0x0b, 0x88, 0x66, + 0xdc, 0x84, 0x12, 0xfb, 0xd2, 0xf8, 0x9a, 0xec, 0xfb, 0xb2, 0xc5, 0xbe, + 0x43, 0x82, 0x68, 0x05, 0x69, 0x57, 0xa7, 0x49, 0xc3, 0xb8, 0xf0, 0x1a, + 0x60, 0xa5, 0xaf, 0x3d, 0xc4, 0x93, 0x0f, 0x3a, 0x26, 0x4d, 0x15, 0xa0, + 0xd1, 0x34, 0xd0, 0x1c, 0x81, 0x57, 0x0f, 0x71, 0x13, 0x13, 0xd4, 0xfc, + 0xa5, 0x2e, 0x1f, 0xa0, 0xea, 0xb9, 0x02, 0x8d, 0x65, 0x00, 0x48, 0x11, + 0x50, 0xab, 0xcb, 0x6c, 0xec, 0x86, 0xce, 0x9b, 0x6d, 0x09, 0x1a, 0xa1, + 0xc4, 0x4e, 0xa4, 0x37, 0x82, 0x71, 0x75, 0x51, 0xe4, 0xaf, 0xdf, 0xc2, + 0xb2, 0x8a, 0xab, 0x07, 0x6b, 0x2d, 0x23, 0xa7, 0x64, 0xe1, 0x2d, 0x76, + 0x8f, 0xcf, 0xea, 0xb7, 0xf1, 0x16, 0x7c, 0x6c, 0x8b, 0x68, 0x92, 0x12, + 0xa8, 0x32, 0x5c, 0xd5, 0x84, 0x8d, 0x9b, 0x3d, 0xc2, 0x7b, 0x8a, 0x44, + 0x05, 0x90, 0xb8, 0xaf, 0x43, 0xd9, 0x3d, 0xce, 0x55, 0xa9, 0x4b, 0xdc, + 0xbd, 0xe0, 0x57, 0x49, 0x77, 0xab, 0xaf, 0xd4, 0x61, 0x67, 0xdc, 0xac, + 0xbe, 0x12, 0xee, 0xa5, 0x4e, 0xc7, 0x24, 0x05, 0x07, 0xbb, 0x27, 0x58, + 0x68, 0xe8, 0x8a, 0xa1, 0x0e, 0x37, 0x6f, 0xc1, 0x63, 0x68, 0xa8, 0xd3, + 0x1d, 0xa0, 0x76, 0xaa, 0xd6, 0xe1, 0xe6, 0x2d, 0x78, 0x8c, 0xed, 0xe8, + 0x04, 0x61, 0x4c, 0x1e, 0x9c, 0xc4, 0x1d, 0x48, 0x4f, 0x0a, 0x95, 0x4d, + 0xc9, 0xe0, 0xb6, 0x41, 0xac, 0x35, 0x56, 0x6a, 0x92, 0x03, 0xc0, 0xfc, + 0x7c, 0x27, 0xe8, 0xc5, 0x0f, 0x7c, 0xc6, 0x76, 0x8c, 0x75, 0x9d, 0xc4, + 0x52, 0xab, 0x75, 0xa6, 0x65, 0xf8, 0xca, 0x61, 0x44, 0x41, 0x50, 0xa9, + 0x54, 0x52, 0xee, 0x53, 0x87, 0xa6, 0xa2, 0x7a, 0x27, 0x19, 0x56, 0x65, + 0xab, 0xb2, 0x9b, 0x3c, 0x37, 0xb7, 0xec, 0x7d, 0x5d, 0x3b, 0xd1, 0x19, + 0x17, 0xe8, 0x09, 0x42, 0x09, 0x95, 0x4a, 0x25, 0xa6, 0x0e, 0x4d, 0x75, + 0xe6, 0x63, 0x29, 0x3d, 0xfd, 0xb0, 0x11, 0x36, 0x14, 0x18, 0xab, 0x54, + 0x62, 0xf2, 0x60, 0x7a, 0x0a, 0xaf, 0x71, 0x4b, 0xd6, 0xe3, 0x73, 0xcf, + 0xcc, 0x21, 0x0a, 0x82, 0xb9, 0x67, 0xe6, 0x98, 0x7b, 0x66, 0x2e, 0x65, + 0xef, 0x2d, 0x74, 0x4f, 0x1b, 0xc0, 0xfe, 0x07, 0xd3, 0x80, 0x16, 0x7f, + 0x31, 0x9d, 0x0e, 0xab, 0xbf, 0x7b, 0x5b, 0x71, 0xa1, 0xea, 0xd5, 0xe6, + 0xf4, 0xb4, 0xef, 0xeb, 0x7d, 0xae, 0x17, 0x24, 0x72, 0xd9, 0xc9, 0xa2, + 0x5d, 0x14, 0x2e, 0x07, 0xd3, 0xca, 0xdc, 0xd7, 0xe7, 0x9e, 0x6d, 0x52, + 0xf9, 0xd2, 0x77, 0xe0, 0x2e, 0x3b, 0x02, 0x6a, 0x81, 0x02, 0x6a, 0xdd, + 0x7a, 0xf7, 0xdd, 0x3d, 0x83, 0xf9, 0xf5, 0xe9, 0x3a, 0x37, 0x8d, 0x94, + 0x53, 0x70, 0xac, 0x2c, 0x3c, 0xeb, 0x7d, 0xa8, 0xef, 0xb0, 0x93, 0xb0, + 0xa9, 0xac, 0xff, 0x97, 0x0a, 0xd4, 0x1a, 0xd8, 0xb8, 0x71, 0x65, 0x23, + 0xe0, 0xe0, 0x8b, 0xab, 0x9b, 0xa0, 0xff, 0x0f, 0x4d, 0x77, 0xdf, 0x7a, + 0xeb, 0xb2, 0xe7, 0x3f, 0xee, 0xda, 0xb0, 0xfb, 0x14, 0xe7, 0xee, 0xfb, + 0x31, 0xe0, 0xc7, 0x01, 0x08, 0x9b, 0x36, 0x3c, 0x3d, 0x07, 0x76, 0x5c, + 0x37, 0xed, 0xbd, 0x6a, 0x1f, 0xfb, 0x75, 0x95, 0xb7, 0x1f, 0xd5, 0x57, + 0xd8, 0xa5, 0xd9, 0x32, 0xbd, 0x00, 0x54, 0x10, 0x83, 0xa2, 0x8c, 0x0c, + 0x64, 0x2a, 0x0b, 0xd4, 0x5a, 0x29, 0x9c, 0x9d, 0xd6, 0xf2, 0xf7, 0x8f, + 0xd7, 0x0c, 0x71, 0xb1, 0x30, 0x5d, 0xb1, 0x24, 0x44, 0xcb, 0xe8, 0xc0, + 0x42, 0xd0, 0x91, 0x26, 0x05, 0x08, 0xab, 0x2f, 0x1b, 0xf6, 0x6a, 0xd3, + 0xd8, 0x2b, 0xaf, 0x2f, 0xd5, 0xdf, 0x9d, 0x87, 0xe7, 0x71, 0xde, 0x77, + 0xbd, 0x82, 0x02, 0x2e, 0xc6, 0x6d, 0x41, 0xa3, 0x5e, 0x8b, 0x26, 0xb0, + 0xa5, 0xee, 0xe0, 0x65, 0x27, 0x8b, 0xeb, 0x4e, 0xca, 0xd3, 0x1e, 0x61, + 0x71, 0x10, 0x84, 0xaa, 0x97, 0xc3, 0xa6, 0x0d, 0xcf, 0xa6, 0xaf, 0xf5, + 0x2b, 0xa6, 0x27, 0x8e, 0xc3, 0x6f, 0xea, 0x1f, 0x8d, 0x01, 0x6a, 0x79, + 0x75, 0x70, 0xcb, 0x80, 0x6a, 0x67, 0xde, 0x31, 0x78, 0x2d, 0x49, 0x10, + 0x6b, 0xc5, 0xaa, 0x03, 0x31, 0xac, 0xe4, 0x8e, 0xff, 0x00, 0x57, 0x7f, + 0x5c, 0x9f, 0xfc, 0xec, 0xa3, 0xaf, 0x78, 0x12, 0x2f, 0x19, 0xbb, 0x6f, + 0xd9, 0xf3, 0xa5, 0xcb, 0x6f, 0x24, 0x78, 0x78, 0x1f, 0xfc, 0xdd, 0x03, + 0x70, 0x70, 0x32, 0x02, 0x6a, 0xa1, 0xdb, 0x94, 0x37, 0xbd, 0x69, 0x30, + 0x6d, 0x5f, 0x8a, 0xf1, 0x0f, 0xee, 0x80, 0xcb, 0xfb, 0x7f, 0x6e, 0x92, + 0xd9, 0xc3, 0xb7, 0x2f, 0x6b, 0x33, 0x7a, 0xd5, 0xce, 0x95, 0xed, 0xca, + 0x0e, 0xef, 0x1f, 0x3b, 0xc0, 0xec, 0x91, 0x3b, 0xbb, 0xda, 0x48, 0x24, + 0x95, 0xb2, 0x1b, 0xd9, 0xdc, 0x6c, 0x01, 0xcf, 0x1e, 0x57, 0xd7, 0x5a, + 0x43, 0x5a, 0xa2, 0xf6, 0xfa, 0x0e, 0x87, 0x7d, 0xc7, 0x0e, 0xd1, 0x4b, + 0xf7, 0x1d, 0xc9, 0x22, 0x33, 0x94, 0xe6, 0x1e, 0xef, 0x5e, 0x56, 0x35, + 0xdd, 0x1e, 0x55, 0x74, 0x1b, 0x77, 0xdb, 0x07, 0x6e, 0x53, 0x27, 0x2e, + 0xab, 0xb0, 0xf7, 0x53, 0x0a, 0x38, 0x35, 0xfa, 0x4d, 0xb5, 0x32, 0xfd, + 0xd4, 0x96, 0x7b, 0x09, 0x9f, 0x86, 0xca, 0xad, 0x4f, 0x01, 0x60, 0x5d, + 0xa9, 0x80, 0x53, 0xb2, 0x0d, 0x5f, 0xf8, 0x8a, 0x0a, 0xe7, 0x86, 0x0f, + 0x94, 0x80, 0x59, 0x6e, 0xfb, 0xba, 0xe9, 0x33, 0x0d, 0xb1, 0xf7, 0x5d, + 0xbf, 0xc1, 0xce, 0x07, 0xd5, 0x8f, 0xe2, 0xc0, 0x87, 0x25, 0xf3, 0xcf, + 0x4a, 0xb8, 0x6f, 0x14, 0x01, 0x54, 0xb6, 0x0a, 0xe6, 0xdf, 0xa5, 0xd2, + 0x3c, 0xab, 0xfb, 0xb9, 0x43, 0xeb, 0x2d, 0x1a, 0xcf, 0xcc, 0x73, 0xc3, + 0x87, 0x76, 0x63, 0x5f, 0x5a, 0x45, 0xa3, 0xb6, 0x18, 0xfb, 0xa6, 0x82, + 0x20, 0x4c, 0x6e, 0xb9, 0x8b, 0xe0, 0x49, 0x89, 0x7b, 0xeb, 0x9f, 0x46, + 0xe9, 0x80, 0x39, 0x68, 0xcb, 0x54, 0x3a, 0x92, 0x69, 0x98, 0xd2, 0xd3, + 0x47, 0xbb, 0xa5, 0x03, 0xa0, 0xb2, 0x51, 0xc0, 0x51, 0x74, 0x3a, 0x54, + 0x18, 0xc3, 0xdb, 0x5c, 0x38, 0x5a, 0x4b, 0x95, 0x89, 0x49, 0xcb, 0xe8, + 0x37, 0x6f, 0xc1, 0xde, 0xfe, 0x14, 0xfe, 0xe1, 0x16, 0xe5, 0x5f, 0x7e, + 0x1c, 0x00, 0xfb, 0x72, 0x89, 0x94, 0x35, 0x0e, 0x7c, 0xad, 0x4e, 0x03, + 0xb8, 0xed, 0xdf, 0x5c, 0x02, 0xed, 0x59, 0x76, 0xff, 0x57, 0x9d, 0x8e, + 0x42, 0x95, 0x19, 0x54, 0xfd, 0x30, 0xf4, 0xb8, 0x0e, 0xa8, 0x44, 0x47, + 0x7b, 0xfd, 0x8d, 0xe6, 0x39, 0x3e, 0xf3, 0x9d, 0x0a, 0xbf, 0x66, 0xa7, + 0xa7, 0x48, 0xaf, 0x04, 0x7a, 0x5a, 0xc9, 0x76, 0xb5, 0x61, 0x65, 0x9f, + 0x5a, 0xcc, 0x71, 0x12, 0x42, 0xd5, 0x65, 0xce, 0x6d, 0xcf, 0xb8, 0xba, + 0xd9, 0xff, 0x53, 0xcd, 0xcb, 0xff, 0x7e, 0x0a, 0x3e, 0xf7, 0x63, 0xe7, + 0x4c, 0x73, 0x9d, 0x6a, 0xaf, 0xed, 0xb6, 0x88, 0xa1, 0x55, 0x00, 0x4d, + 0xc9, 0xa1, 0x3a, 0x89, 0xd9, 0xc5, 0x4a, 0x56, 0xbf, 0x8d, 0x75, 0xc5, + 0x30, 0xb5, 0xc3, 0xea, 0xd7, 0x58, 0x2a, 0x25, 0xc7, 0x30, 0x2c, 0x26, + 0xbf, 0x09, 0x63, 0x5b, 0x80, 0x96, 0x44, 0x14, 0x33, 0xa9, 0x93, 0x92, + 0x03, 0xcf, 0x0a, 0x9c, 0x92, 0xc0, 0x0f, 0x54, 0x5c, 0xf1, 0xbe, 0x64, + 0xf8, 0xba, 0xeb, 0x01, 0x22, 0xd0, 0x16, 0x75, 0xd8, 0x8f, 0x64, 0xd7, + 0x95, 0x3d, 0x72, 0x29, 0x65, 0x04, 0x1f, 0x71, 0x36, 0x38, 0xf8, 0xa7, + 0x7d, 0xc0, 0x82, 0x76, 0xba, 0xe4, 0x1d, 0xc7, 0xc2, 0xf7, 0xd5, 0xfd, + 0xbd, 0xf3, 0x57, 0x1c, 0x0e, 0x3d, 0x08, 0x37, 0xfc, 0x52, 0xf7, 0x30, + 0x6b, 0x7a, 0x7c, 0x64, 0xf8, 0xb2, 0x21, 0x66, 0x8e, 0xce, 0x22, 0xdb, + 0x9d, 0xa0, 0x12, 0xef, 0xf0, 0x14, 0xc3, 0xd7, 0xed, 0xc4, 0xb9, 0xdc, + 0xc1, 0xb2, 0x26, 0x93, 0xa7, 0x52, 0x7d, 0x69, 0x29, 0xc1, 0xea, 0xbb, + 0x16, 0xf7, 0x3d, 0x02, 0xaf, 0x2e, 0x71, 0xcb, 0xea, 0x5a, 0xf8, 0x47, + 0x20, 0x6c, 0xee, 0x47, 0x14, 0x14, 0x08, 0x40, 0x34, 0x5d, 0xc6, 0x7e, + 0x49, 0xb7, 0xa3, 0xed, 0x16, 0xa5, 0x44, 0x18, 0x65, 0xbd, 0x3d, 0xf0, + 0x8c, 0xc4, 0xda, 0x12, 0x22, 0xdb, 0x0d, 0xf5, 0x7c, 0x6d, 0x2e, 0x55, + 0x41, 0xe0, 0x2d, 0x15, 0xa9, 0xd5, 0x66, 0x71, 0xfa, 0x13, 0x79, 0x32, + 0xed, 0xb5, 0xae, 0xc3, 0x93, 0xf7, 0xf5, 0x0f, 0x42, 0x9b, 0x3f, 0xfe, + 0x9a, 0x65, 0xcf, 0x9f, 0xf8, 0xfd, 0xbf, 0xff, 0xc1, 0x44, 0x0c, 0x0c, + 0x35, 0x55, 0x1f, 0x7c, 0xb6, 0xef, 0x22, 0xce, 0x37, 0x5f, 0xb9, 0xfe, + 0x78, 0xe1, 0x65, 0x86, 0xd5, 0x7e, 0x89, 0xe9, 0xf9, 0x2e, 0xb0, 0x89, + 0x78, 0xa2, 0xfe, 0x73, 0xc0, 0x4f, 0x00, 0x83, 0xcd, 0x17, 0xf9, 0xcb, + 0xac, 0xb1, 0xd5, 0x79, 0x5f, 0x27, 0x9f, 0xb9, 0xa2, 0x5f, 0xa7, 0x01, + 0x4a, 0x11, 0x03, 0xaa, 0x20, 0x0d, 0xaf, 0x4a, 0xba, 0x27, 0xed, 0x8d, + 0x26, 0x81, 0xb1, 0x1e, 0xe1, 0x24, 0x81, 0x54, 0xfb, 0xba, 0x80, 0xb1, + 0x0c, 0xcc, 0x6a, 0x2c, 0xb1, 0xdf, 0x35, 0xde, 0x8c, 0x7d, 0x37, 0xc0, + 0x56, 0x32, 0x8d, 0xc9, 0x30, 0x92, 0xfe, 0xb2, 0xee, 0x90, 0x06, 0x8c, + 0xad, 0x04, 0xe3, 0x7a, 0xc9, 0x60, 0xc3, 0x89, 0xc4, 0xfe, 0x78, 0x9d, + 0x18, 0x75, 0x53, 0xa6, 0x24, 0x80, 0x3f, 0x52, 0x81, 0x07, 0x12, 0x05, + 0xdb, 0x32, 0xf6, 0x13, 0xe5, 0xc8, 0x5b, 0xe9, 0x77, 0xf4, 0xf9, 0x3d, + 0x5d, 0xc2, 0xcf, 0x3e, 0x73, 0x25, 0xc7, 0x48, 0x2f, 0x54, 0x6d, 0xba, + 0x8e, 0x97, 0xfd, 0x30, 0x00, 0x79, 0x26, 0x8e, 0xb9, 0x3b, 0xea, 0xaa, + 0xac, 0x07, 0x2c, 0x05, 0xd6, 0xd2, 0x6e, 0x83, 0xbf, 0x51, 0x8e, 0x6c, + 0x0d, 0x44, 0x2b, 0xab, 0x6a, 0xf3, 0x01, 0x66, 0xb9, 0x16, 0x80, 0x29, + 0x6e, 0x61, 0x7e, 0xa1, 0xc5, 0x50, 0xff, 0x9d, 0x4c, 0xad, 0xfd, 0x15, + 0xc4, 0xa9, 0x4f, 0x61, 0x5b, 0x16, 0x95, 0xb5, 0x45, 0xa6, 0xe6, 0x63, + 0x50, 0xd6, 0x50, 0x45, 0x30, 0x5b, 0x93, 0xa9, 0x63, 0x29, 0x6d, 0xc2, + 0xc3, 0xbf, 0xc2, 0xcc, 0xa9, 0x06, 0x83, 0x8e, 0xc0, 0x0f, 0x45, 0x94, + 0x46, 0x33, 0x84, 0x1c, 0x74, 0x81, 0x9b, 0x55, 0xcb, 0x0a, 0x84, 0x55, + 0x6b, 0x7a, 0x88, 0x25, 0x8b, 0x61, 0xee, 0xc5, 0xa9, 0x2b, 0xbf, 0xa6, + 0x7d, 0xf3, 0x05, 0xf8, 0x4b, 0x2a, 0xfd, 0x83, 0x03, 0x45, 0xdc, 0x63, + 0x6a, 0x11, 0x85, 0x79, 0x3d, 0x86, 0x52, 0x6d, 0x42, 0x6d, 0x41, 0xe2, + 0x5d, 0x29, 0x09, 0x43, 0x15, 0x59, 0x2d, 0x6c, 0xa8, 0x27, 0x9b, 0x4c, + 0xdf, 0x6c, 0xae, 0x19, 0x72, 0xd7, 0x39, 0x30, 0xb4, 0x58, 0x29, 0x1b, + 0xc0, 0x18, 0xa1, 0x3c, 0x4e, 0x79, 0xbd, 0x0b, 0xcd, 0x38, 0x6d, 0x56, + 0xbf, 0x7a, 0x7e, 0xb2, 0xc4, 0x10, 0xa1, 0x9c, 0xd5, 0xed, 0x46, 0xe7, + 0x6f, 0x24, 0x94, 0xa6, 0x3f, 0x5f, 0xc1, 0x5a, 0x72, 0xb0, 0x44, 0x89, + 0x50, 0x06, 0x38, 0xa5, 0x4a, 0x2a, 0x3c, 0x65, 0x1b, 0x62, 0x09, 0x8b, + 0xb0, 0x09, 0xa1, 0x0c, 0xd4, 0x7e, 0xea, 0xc7, 0xe2, 0xd0, 0x58, 0x6a, + 0x60, 0x15, 0x14, 0xa4, 0xe5, 0xb6, 0xab, 0x5d, 0xf6, 0x3e, 0xbe, 0x1b, + 0xb8, 0x49, 0x03, 0xb5, 0x6e, 0x07, 0xbe, 0x08, 0xc0, 0xce, 0xcd, 0x77, + 0x32, 0x17, 0x98, 0xf1, 0x3c, 0x81, 0x28, 0xc4, 0x63, 0xc7, 0xa1, 0x0c, + 0xa3, 0x45, 0x12, 0x64, 0x5b, 0x12, 0x76, 0xc0, 0x78, 0xd4, 0xd6, 0x40, + 0xae, 0x14, 0xe8, 0x4a, 0xea, 0x7c, 0xdb, 0x24, 0x7f, 0xc1, 0x31, 0x08, + 0x2b, 0x79, 0x3e, 0xde, 0x42, 0x27, 0x50, 0x2b, 0x09, 0xcf, 0x4a, 0x1e, + 0x5b, 0xfd, 0x76, 0xf4, 0xac, 0x9c, 0x05, 0x6a, 0x01, 0x1d, 0x40, 0xad, + 0x30, 0xf4, 0x53, 0xef, 0x78, 0xb2, 0x40, 0xad, 0x24, 0x64, 0x6b, 0xf4, + 0x14, 0xdc, 0x59, 0x0c, 0x41, 0x8f, 0xdf, 0x25, 0xeb, 0xf0, 0xb2, 0xb6, + 0xaf, 0x67, 0xe2, 0x2b, 0x27, 0xdc, 0x46, 0xc8, 0xee, 0x68, 0x68, 0x96, + 0xd6, 0x9e, 0x09, 0x05, 0xa3, 0x1a, 0x1f, 0x4f, 0x04, 0x30, 0x0e, 0x65, + 0xca, 0x8c, 0x4f, 0xab, 0x50, 0xa2, 0x73, 0xe3, 0x0a, 0xe2, 0x79, 0xcb, + 0x2d, 0xb7, 0xf0, 0x9e, 0xf7, 0xdc, 0x1b, 0xb9, 0xd7, 0xeb, 0xa0, 0x5e, + 0xdf, 0x94, 0xa9, 0x8f, 0x98, 0x7d, 0xf8, 0xc8, 0x48, 0x9d, 0xf1, 0x71, + 0x75, 0x7e, 0x62, 0xa2, 0xcc, 0x07, 0xc6, 0xeb, 0x7c, 0x64, 0x44, 0xa7, + 0x65, 0x1c, 0x48, 0xc4, 0x3b, 0x31, 0x41, 0x14, 0xd7, 0xc4, 0x84, 0x02, + 0x65, 0x85, 0x7b, 0xc0, 0xda, 0xa3, 0xc6, 0xf3, 0x0c, 0x9c, 0x0b, 0x20, + 0x1c, 0x57, 0x10, 0xad, 0x28, 0xc9, 0xe3, 0xb1, 0x5f, 0x80, 0x09, 0x16, + 0xd4, 0x7d, 0xb2, 0x0d, 0xc6, 0xb7, 0x29, 0xb7, 0x94, 0xbd, 0x4e, 0x42, + 0xb9, 0x0e, 0x13, 0x23, 0x0a, 0xac, 0xb5, 0x87, 0x32, 0x75, 0xea, 0x04, + 0xe3, 0x65, 0xca, 0xd4, 0x39, 0x32, 0x1e, 0x57, 0xc3, 0x5f, 0x81, 0xf8, + 0xa7, 0xa3, 0xed, 0xbf, 0x32, 0x11, 0x87, 0xf5, 0x5f, 0xa6, 0x63, 0x30, + 0x96, 0x19, 0x7b, 0x5c, 0xb5, 0x16, 0x94, 0x9f, 0xfb, 0x61, 0xd9, 0x71, + 0xb3, 0xd5, 0x2e, 0x9e, 0xd1, 0x4d, 0xb2, 0xa9, 0x7e, 0x4f, 0xf1, 0xbb, + 0x50, 0x2b, 0x05, 0xac, 0x2a, 0x95, 0xca, 0x89, 0x63, 0x11, 0xb9, 0x29, + 0x20, 0xd6, 0xcb, 0x93, 0xe8, 0xd3, 0xef, 0x1d, 0x74, 0xd2, 0x65, 0x5b, + 0xbd, 0x4b, 0x14, 0x1a, 0xe8, 0x15, 0xe7, 0x49, 0xa6, 0xf6, 0x3b, 0xc2, + 0xe9, 0x92, 0xff, 0xd5, 0x82, 0xc6, 0x64, 0x33, 0xa4, 0xd4, 0x5f, 0x8e, + 0xdf, 0x1d, 0x34, 0x43, 0x84, 0x65, 0x11, 0x04, 0x71, 0x5b, 0x1f, 0x86, + 0x3a, 0x0e, 0x24, 0x7e, 0xe0, 0x21, 0x09, 0xb1, 0x34, 0x84, 0xcc, 0xea, + 0xb7, 0xf0, 0xc3, 0x90, 0xb1, 0xf7, 0xdd, 0xcc, 0xf1, 0x85, 0xc9, 0x9e, + 0x40, 0xad, 0xa4, 0x14, 0x5c, 0x6b, 0x2f, 0x3b, 0xaf, 0xbb, 0x2d, 0x02, + 0x6b, 0x95, 0x35, 0xd4, 0x86, 0x25, 0x3a, 0xc6, 0xcd, 0x92, 0xef, 0xb9, + 0x44, 0x41, 0x41, 0x04, 0x65, 0x5b, 0x95, 0xd3, 0x70, 0x1b, 0x66, 0x0a, + 0xd0, 0xd2, 0x40, 0x2d, 0xa1, 0x81, 0xb9, 0x7e, 0x5b, 0x46, 0xfd, 0x11, + 0x03, 0xd4, 0x4a, 0x42, 0xa6, 0xaa, 0xb2, 0x13, 0xb4, 0x05, 0xdd, 0xc1, + 0x5a, 0xc9, 0x22, 0x9f, 0xd1, 0x75, 0xac, 0x40, 0x30, 0x9b, 0x79, 0xdf, + 0xd2, 0x68, 0x83, 0xad, 0xeb, 0xba, 0xd1, 0x2b, 0x77, 0x71, 0xe3, 0xa5, + 0xfb, 0x61, 0xeb, 0x03, 0x54, 0x01, 0xb9, 0xf5, 0x2e, 0xee, 0x7d, 0x64, + 0x17, 0x9f, 0x6c, 0x4b, 0xec, 0x92, 0x4d, 0x2b, 0x6c, 0x31, 0x88, 0x64, + 0x2e, 0xd3, 0x6b, 0x12, 0xed, 0x96, 0x02, 0x2c, 0x03, 0xb2, 0x9d, 0xae, + 0x1b, 0xe7, 0x35, 0x64, 0xcb, 0x2a, 0xa8, 0x24, 0xc9, 0x82, 0xfe, 0x45, + 0xca, 0x4c, 0xba, 0x75, 0x19, 0xc8, 0x02, 0x54, 0xdb, 0xda, 0x9f, 0xc9, + 0x4a, 0x41, 0xa5, 0xde, 0x2c, 0xf4, 0x33, 0x4b, 0x3c, 0x22, 0xd8, 0x92, + 0x0a, 0xac, 0xa5, 0xb6, 0xf0, 0x59, 0x89, 0xae, 0xbb, 0x25, 0x93, 0x05, + 0x11, 0xd5, 0x9b, 0x93, 0x6d, 0x89, 0xa3, 0x70, 0xec, 0x80, 0x02, 0x6f, + 0xdd, 0xd1, 0x86, 0x4f, 0x13, 0x83, 0x2d, 0xe7, 0x74, 0x39, 0x5c, 0x82, + 0xe4, 0x38, 0x82, 0x7b, 0x81, 0x5b, 0xb4, 0xed, 0x5c, 0x5b, 0x6d, 0xa1, + 0xf3, 0xfd, 0x35, 0x5f, 0xb5, 0x09, 0x7f, 0xe1, 0x4f, 0xe9, 0x63, 0x63, + 0x04, 0x87, 0x32, 0xfa, 0xee, 0x5f, 0xc3, 0x1b, 0x7f, 0xfa, 0x45, 0x5e, + 0x57, 0xb8, 0x88, 0xef, 0xb7, 0x57, 0xb7, 0x3d, 0x77, 0xf2, 0x45, 0xde, + 0xb4, 0x49, 0x01, 0xba, 0xa6, 0xa6, 0xa6, 0xf0, 0x80, 0x77, 0x6e, 0xba, + 0x88, 0x37, 0xae, 0x65, 0x55, 0xfe, 0x41, 0x81, 0xb5, 0x0e, 0xcf, 0x2b, + 0x80, 0x96, 0x9f, 0x69, 0xdf, 0x41, 0xc1, 0xb5, 0xae, 0x18, 0xae, 0xf2, + 0xad, 0x6f, 0x2f, 0xf2, 0xfd, 0xf6, 0x8b, 0xfc, 0xf8, 0xb9, 0x35, 0xfc, + 0x8f, 0xb5, 0xe7, 0x79, 0x5d, 0xe1, 0xa2, 0x08, 0x3a, 0x05, 0x0a, 0x56, + 0x65, 0x8e, 0xd7, 0x38, 0xeb, 0x22, 0x60, 0x58, 0x32, 0x8f, 0xc9, 0x7d, + 0x88, 0x81, 0x57, 0xa0, 0x80, 0x58, 0x6b, 0x9c, 0x75, 0x29, 0xbb, 0x64, + 0x98, 0xa3, 0xa3, 0xa3, 0x9c, 0x38, 0x76, 0x34, 0xe5, 0xdf, 0x00, 0xbb, + 0x4e, 0xfe, 0xf7, 0x93, 0x6c, 0x7a, 0xdb, 0xa6, 0xc8, 0x6e, 0x6a, 0x4a, + 0xf5, 0x23, 0x0c, 0x5c, 0x2b, 0x09, 0xd4, 0x32, 0x20, 0xad, 0x6c, 0x5a, + 0xd6, 0xbd, 0x61, 0x4d, 0x0a, 0xb2, 0xb5, 0x8e, 0xb3, 0x91, 0xcd, 0xba, + 0x37, 0xac, 0x61, 0x8d, 0xb3, 0x2e, 0x4a, 0xeb, 0x9a, 0x33, 0x67, 0x52, + 0xa0, 0x2e, 0x80, 0x90, 0x19, 0xac, 0xaf, 0x26, 0xde, 0x69, 0x26, 0xea, + 0xf0, 0xdb, 0xae, 0x19, 0x63, 0x70, 0x7b, 0x95, 0xb9, 0x43, 0xf3, 0x3c, + 0xfa, 0x87, 0x07, 0x18, 0xbc, 0xbc, 0xc2, 0x90, 0x2b, 0xb8, 0xeb, 0xb7, + 0x3e, 0xcb, 0xdc, 0xa1, 0x79, 0x06, 0xb7, 0x57, 0xf1, 0x6a, 0x35, 0xe6, + 0x8e, 0xd4, 0x18, 0xbc, 0x7c, 0x8c, 0x46, 0x20, 0x23, 0xfb, 0xf4, 0xb9, + 0x0a, 0x8d, 0xa0, 0x42, 0x65, 0x7b, 0x95, 0xda, 0xa1, 0x79, 0xbc, 0xba, + 0x47, 0xe5, 0xca, 0x51, 0x82, 0xa3, 0x53, 0x8c, 0x7e, 0x78, 0x17, 0xc7, + 0x9f, 0x9e, 0x51, 0x63, 0x1d, 0xe7, 0x3c, 0x86, 0xcb, 0x30, 0xfb, 0xd8, + 0x43, 0x54, 0xd6, 0x97, 0xa3, 0x34, 0xcd, 0x3c, 0x61, 0x70, 0x71, 0x4a, + 0xd1, 0x77, 0x2f, 0x61, 0xfc, 0x7d, 0x42, 0xd5, 0xea, 0x1c, 0xbf, 0x1f, + 0x1e, 0x72, 0x19, 0xc6, 0x8d, 0x40, 0x5a, 0x91, 0xff, 0xc4, 0x7b, 0x65, + 0x59, 0x14, 0xaa, 0x1b, 0x2a, 0x81, 0x82, 0x60, 0x6c, 0xb3, 0xcb, 0xbe, + 0x43, 0x33, 0x8c, 0xba, 0x0e, 0xe1, 0x52, 0x48, 0xa5, 0x4f, 0x01, 0xac, + 0xac, 0xd0, 0x47, 0x0e, 0x54, 0x71, 0x2d, 0x47, 0x87, 0x01, 0x52, 0x43, + 0xf7, 0x64, 0xd3, 0x47, 0x24, 0x3a, 0x5f, 0x62, 0x8d, 0x0e, 0xb0, 0xa5, + 0xe0, 0x5a, 0xf2, 0xbc, 0x6e, 0xc7, 0x4c, 0x1d, 0x21, 0x41, 0xd8, 0x3a, + 0x1d, 0x0d, 0xfd, 0x1e, 0x43, 0x43, 0xb7, 0x5a, 0xcd, 0x96, 0xfa, 0x6e, + 0xe7, 0x7c, 0xe2, 0xfb, 0x03, 0xf3, 0xd8, 0xd0, 0x92, 0xec, 0xbc, 0x66, + 0x8c, 0xc9, 0x83, 0x93, 0x14, 0xfb, 0x8b, 0xb4, 0xa2, 0xdf, 0x7d, 0x51, + 0x2d, 0xce, 0x20, 0x54, 0x58, 0xae, 0xe5, 0xd2, 0x90, 0x0d, 0x2c, 0x2c, + 0xc2, 0x24, 0xa0, 0x36, 0x1a, 0x4b, 0x69, 0x46, 0xf7, 0xf4, 0x76, 0xb6, + 0xf3, 0x99, 0x3b, 0x7f, 0xaf, 0xa3, 0xec, 0x56, 0xab, 0xb7, 0x6e, 0xdc, + 0x70, 0x61, 0x1e, 0x56, 0xc7, 0x92, 0x7a, 0xd9, 0x5a, 0x5f, 0x1a, 0x58, + 0xd9, 0xe8, 0x55, 0xd2, 0xba, 0x9f, 0x7c, 0xcb, 0xaa, 0x6d, 0x37, 0xac, + 0xb9, 0x82, 0xb7, 0x6e, 0xdc, 0xc0, 0x73, 0xa7, 0x4e, 0x73, 0xfa, 0xfc, + 0x61, 0xfe, 0xe5, 0xe0, 0x87, 0x78, 0x4e, 0x83, 0x03, 0xbf, 0xfb, 0x7d, + 0x8f, 0x37, 0xbe, 0x2e, 0xfb, 0xbb, 0x3f, 0xdb, 0x71, 0x4f, 0xe7, 0xca, + 0x95, 0x2b, 0x57, 0xae, 0x5c, 0xb9, 0x72, 0xe5, 0xca, 0x95, 0x2b, 0x57, + 0xae, 0x5c, 0xb9, 0x72, 0xe5, 0xca, 0x95, 0x2b, 0x57, 0xae, 0x5c, 0xb9, + 0x72, 0xe5, 0xca, 0x95, 0x2b, 0x57, 0xae, 0xd5, 0x2b, 0x87, 0x6a, 0xe5, + 0xca, 0x95, 0x2b, 0x57, 0xae, 0x5c, 0xaf, 0x96, 0x76, 0x34, 0x28, 0x32, + 0x0c, 0x68, 0x18, 0xd6, 0x52, 0x18, 0x7d, 0x94, 0x6c, 0x64, 0xdc, 0x80, + 0xe8, 0xa3, 0x6e, 0xd0, 0x70, 0x27, 0x6d, 0x67, 0xf5, 0x5b, 0x0a, 0x14, + 0xd5, 0x4c, 0xc3, 0x50, 0x42, 0x0d, 0x4a, 0x32, 0x1f, 0x76, 0x5b, 0x56, + 0x0c, 0xa9, 0x91, 0x6d, 0x89, 0x53, 0x72, 0x22, 0xd0, 0x96, 0x65, 0x59, + 0x11, 0xa8, 0x24, 0x0b, 0xd4, 0x2a, 0x97, 0xcb, 0x11, 0xf8, 0xc6, 0x5b, + 0xf0, 0xa8, 0xd7, 0xeb, 0x00, 0x6c, 0x7f, 0xcf, 0x76, 0x66, 0x0f, 0xcf, + 0xa6, 0x60, 0x5d, 0x96, 0x65, 0xe1, 0xd5, 0x3d, 0xdc, 0xf5, 0x2e, 0xf3, + 0x47, 0xe7, 0x98, 0x47, 0xc1, 0x5d, 0xe6, 0x8f, 0xce, 0x30, 0xf9, 0xb5, + 0x18, 0xa8, 0x95, 0x54, 0xf2, 0xc3, 0xf3, 0x46, 0xb3, 0x13, 0x70, 0x95, + 0x74, 0xeb, 0xa5, 0x24, 0x84, 0xcb, 0xd8, 0x27, 0x01, 0x59, 0x59, 0x37, + 0x63, 0xbf, 0x92, 0xad, 0x28, 0xa8, 0xd5, 0xa4, 0x93, 0x79, 0x4c, 0x95, + 0x71, 0x57, 0x77, 0xa1, 0xae, 0xeb, 0x0e, 0xe0, 0xcb, 0xba, 0x5c, 0xb6, + 0x0a, 0xb8, 0x5f, 0x7f, 0xfc, 0x16, 0x66, 0xf2, 0x12, 0x4a, 0x05, 0xc8, + 0x0a, 0xa5, 0x9a, 0xf9, 0x64, 0xc0, 0x59, 0x49, 0x3b, 0xb3, 0xbf, 0xd6, + 0x86, 0x73, 0x5d, 0xce, 0x6b, 0xf5, 0x82, 0xca, 0x58, 0x7a, 0x92, 0x8c, + 0x57, 0x0f, 0xb1, 0xfb, 0x04, 0x96, 0x99, 0xb4, 0x9a, 0x9c, 0x7c, 0x9c, + 0x0d, 0x6e, 0x35, 0xb3, 0xf1, 0x44, 0xbc, 0x75, 0xfa, 0x93, 0x93, 0x6e, + 0x74, 0x7c, 0x0b, 0x01, 0xb6, 0x55, 0xc2, 0x2d, 0xdb, 0x29, 0x38, 0x96, + 0x01, 0x6a, 0x99, 0xf4, 0xba, 0xeb, 0xad, 0x08, 0xbc, 0x15, 0x86, 0x0a, + 0xf8, 0xe5, 0x2d, 0x04, 0xb8, 0x03, 0x25, 0xbc, 0x85, 0xde, 0x13, 0x11, + 0x9c, 0x92, 0xd5, 0x09, 0xfd, 0xd2, 0xb3, 0xaf, 0xc3, 0x04, 0x28, 0xcc, + 0x0f, 0xc2, 0x68, 0xb2, 0x13, 0x80, 0x5b, 0x8a, 0x41, 0x5f, 0x0a, 0xa8, + 0xa5, 0x41, 0x63, 0xa8, 0x32, 0x32, 0x5a, 0x0e, 0xac, 0x65, 0x59, 0x45, + 0x58, 0x04, 0xee, 0x77, 0xd5, 0xf5, 0x35, 0x73, 0xba, 0x92, 0xf7, 0xf5, + 0xd2, 0x4b, 0x9e, 0xd2, 0xf8, 0x92, 0xd5, 0x0b, 0xbc, 0x15, 0x9f, 0x73, + 0x68, 0x84, 0x8d, 0x68, 0xb5, 0xe0, 0xa4, 0x8a, 0xa2, 0xd8, 0x01, 0x81, + 0x82, 0x74, 0x59, 0x66, 0x41, 0x57, 0x59, 0xf9, 0x8b, 0xf1, 0x4a, 0xc4, + 0x2d, 0xd9, 0xc2, 0x59, 0xbf, 0x3c, 0x20, 0x2f, 0x79, 0x6f, 0x4b, 0x29, + 0x97, 0x0d, 0xbf, 0xd7, 0x24, 0x9d, 0xe5, 0x26, 0xef, 0xf8, 0x81, 0x1f, + 0xdd, 0xef, 0x7e, 0xe0, 0xe3, 0x6e, 0xcc, 0x40, 0xbc, 0x74, 0x9d, 0x2b, + 0xdb, 0x52, 0xaf, 0x64, 0xde, 0x5b, 0xd1, 0x7d, 0xfd, 0x98, 0x3a, 0x4e, + 0xde, 0xd7, 0x6e, 0x79, 0x75, 0x50, 0x96, 0x95, 0xca, 0xef, 0x95, 0xf6, + 0xb7, 0x1a, 0x15, 0x0b, 0x9d, 0xbf, 0x85, 0x1f, 0x65, 0xcd, 0x1c, 0x9e, + 0x42, 0xf4, 0x69, 0x08, 0x65, 0x33, 0x5c, 0x76, 0x3f, 0x08, 0x82, 0x4e, + 0xa0, 0x57, 0xbb, 0x3b, 0x24, 0x52, 0x08, 0x41, 0x60, 0x7e, 0xeb, 0x99, + 0xfb, 0x7a, 0xed, 0xd6, 0x3e, 0xb8, 0x4f, 0x01, 0xaa, 0x06, 0x76, 0xec, + 0x50, 0x60, 0xad, 0x81, 0x01, 0x06, 0x36, 0x6e, 0x64, 0xe1, 0xd4, 0xa9, + 0xae, 0xf0, 0xaa, 0x24, 0x24, 0xcb, 0x00, 0xb4, 0x7a, 0xd9, 0x24, 0xf5, + 0xc1, 0x89, 0x69, 0xee, 0x1c, 0x1f, 0x59, 0xa6, 0x04, 0x5e, 0x19, 0x65, + 0xd3, 0x7c, 0x70, 0x41, 0xa5, 0xe6, 0xe0, 0xc1, 0x83, 0xec, 0xd8, 0xb1, + 0x23, 0x75, 0x6e, 0xc7, 0xc0, 0xc0, 0x3f, 0xde, 0xf3, 0xf7, 0x6d, 0x54, + 0xd7, 0x77, 0x4a, 0x81, 0x03, 0xac, 0xbe, 0x06, 0x5c, 0x99, 0xb9, 0x9f, + 0xef, 0x78, 0x37, 0xbb, 0x78, 0xf5, 0x74, 0x60, 0x21, 0x60, 0xe7, 0x40, + 0x89, 0x03, 0x0b, 0x01, 0xa3, 0xfd, 0x25, 0xa6, 0x96, 0xe2, 0x7a, 0xbe, + 0xba, 0xde, 0xd2, 0xc0, 0x2c, 0x05, 0xd6, 0x52, 0x90, 0x8b, 0x4e, 0xff, + 0xff, 0x60, 0xd5, 0xa5, 0x5f, 0xd3, 0x51, 0xe3, 0xaf, 0x08, 0xd4, 0xd2, + 0xba, 0xd2, 0xc5, 0xea, 0x8b, 0xed, 0xad, 0xbe, 0x06, 0x6c, 0xbd, 0xe4, + 0xe5, 0xa5, 0x6f, 0x39, 0x5d, 0x35, 0x0a, 0x4f, 0x4e, 0x81, 0xe9, 0xa3, + 0x7a, 0x75, 0xf8, 0xe8, 0x6e, 0x05, 0xa8, 0x02, 0xfe, 0xf8, 0x33, 0x75, + 0xdc, 0xab, 0x12, 0x13, 0x72, 0xc4, 0x5f, 0xa5, 0xbc, 0xdb, 0x7d, 0x36, + 0x7c, 0x7c, 0xf8, 0x07, 0x96, 0xbc, 0xe0, 0xc8, 0xbe, 0x95, 0x8d, 0x92, + 0xda, 0xac, 0x61, 0x94, 0x0b, 0x35, 0x05, 0xd4, 0xfa, 0xbb, 0xb9, 0x28, + 0x2f, 0x10, 0x03, 0x34, 0x00, 0x82, 0xc7, 0x0f, 0xc0, 0xc3, 0x69, 0xc0, + 0x23, 0x40, 0x10, 0xec, 0x4b, 0xec, 0xc3, 0xec, 0xe1, 0x1e, 0x69, 0xcb, + 0xd8, 0xad, 0x64, 0x33, 0x9b, 0xb5, 0xd9, 0x7a, 0x09, 0x56, 0x5f, 0xdc, + 0xef, 0x4c, 0xb6, 0xd7, 0x37, 0x6e, 0xdb, 0xce, 0x4c, 0x9f, 0xba, 0x26, + 0xc5, 0xb5, 0x00, 0x36, 0xad, 0x73, 0x0d, 0x6a, 0xd3, 0x0f, 0xb1, 0xfb, + 0x72, 0x85, 0xbf, 0x10, 0x1b, 0x54, 0xbb, 0x21, 0x4f, 0x07, 0xdc, 0x77, + 0x64, 0x92, 0xc1, 0xab, 0x77, 0x2b, 0x77, 0x07, 0xa4, 0x1f, 0x43, 0xb6, + 0x2a, 0x99, 0xf6, 0xa5, 0xb5, 0xd5, 0x05, 0xfd, 0xec, 0x60, 0x34, 0xb5, + 0xe5, 0xde, 0x38, 0x1d, 0x57, 0x76, 0xcf, 0xcb, 0xf5, 0x57, 0xeb, 0xf8, + 0xda, 0x20, 0xdb, 0x9d, 0xd0, 0xd2, 0x03, 0x1f, 0x8e, 0x7f, 0xc7, 0xd5, + 0xad, 0x9d, 0xfd, 0x81, 0x62, 0x4b, 0xc1, 0xb4, 0x8c, 0xec, 0x4b, 0xab, + 0xd1, 0xbe, 0x69, 0xe3, 0x26, 0xb7, 0xdc, 0xb5, 0x62, 0x3a, 0x14, 0xd4, + 0xcb, 0x68, 0x28, 0x91, 0xa6, 0xce, 0x74, 0x54, 0x36, 0x76, 0xef, 0x97, + 0x0c, 0xad, 0xd7, 0x61, 0xd8, 0x02, 0x06, 0x5c, 0x5a, 0xa6, 0x2c, 0x32, + 0x65, 0x52, 0xb6, 0x5a, 0xd8, 0xe5, 0xce, 0xfe, 0xdb, 0xce, 0xf7, 0x94, + 0x4d, 0x2a, 0x91, 0x2f, 0xb8, 0x5d, 0x47, 0xad, 0x67, 0xaf, 0x56, 0xdb, + 0xea, 0x31, 0x3a, 0xda, 0xeb, 0xb7, 0xf7, 0xad, 0xe5, 0xbf, 0x25, 0x9a, + 0xb7, 0x0b, 0xe9, 0x3d, 0x65, 0x01, 0x50, 0x49, 0xbd, 0x1c, 0x50, 0xc7, + 0x4b, 0xe9, 0x65, 0x75, 0x4b, 0xcb, 0x3f, 0xe5, 0xbc, 0x00, 0xfc, 0xb7, + 0x8d, 0xea, 0xfa, 0xfe, 0x85, 0xe6, 0xfc, 0x64, 0xdb, 0x6b, 0x99, 0x00, + 0x6b, 0xcd, 0x9e, 0x48, 0x47, 0x12, 0x6a, 0x78, 0xad, 0xd5, 0xaf, 0xee, + 0xfd, 0xdd, 0xf7, 0x5d, 0xcb, 0x81, 0x7b, 0x8e, 0x03, 0x10, 0x2c, 0xfa, + 0xf8, 0x27, 0x6a, 0x94, 0x4a, 0x0a, 0x12, 0x67, 0xc0, 0x5a, 0x32, 0x03, + 0xd6, 0x9a, 0x7c, 0x96, 0x28, 0x27, 0xfe, 0x33, 0xb3, 0x70, 0x69, 0x15, + 0x47, 0x43, 0xb9, 0xee, 0xfc, 0x93, 0x9b, 0x39, 0x70, 0x7f, 0x17, 0x88, + 0xad, 0x84, 0xfd, 0x4f, 0x2b, 0x3f, 0xd7, 0x56, 0xd3, 0x90, 0x74, 0xaf, + 0x0d, 0x33, 0xb3, 0x92, 0xd1, 0x04, 0x74, 0xcb, 0x3f, 0xed, 0x47, 0x80, + 0xad, 0x7b, 0x67, 0x6e, 0xe3, 0xa1, 0xcf, 0xe9, 0x09, 0xf5, 0x49, 0xd0, + 0xd6, 0xfa, 0xee, 0xe5, 0x54, 0x6b, 0x4b, 0x66, 0x9f, 0x86, 0x21, 0x73, + 0x7f, 0xb7, 0x5b, 0xf8, 0xbe, 0x82, 0x72, 0x19, 0x0d, 0x7f, 0xe2, 0x53, + 0x78, 0x8b, 0x35, 0xfc, 0xd3, 0x3e, 0xfe, 0xc3, 0x3e, 0xf6, 0x06, 0x05, + 0xb2, 0x0d, 0xf4, 0x44, 0x4d, 0x0b, 0x90, 0x2f, 0xc0, 0xd0, 0x35, 0x0a, + 0xf6, 0x32, 0xe8, 0xa8, 0x4c, 0x0c, 0x26, 0x1f, 0xe7, 0xae, 0x01, 0xd8, + 0x85, 0xd7, 0x06, 0xb7, 0xa0, 0x26, 0x84, 0x06, 0x6d, 0x52, 0x30, 0xad, + 0x28, 0xfb, 0xba, 0x0d, 0x1e, 0xdb, 0x01, 0xf3, 0xbe, 0x05, 0x05, 0x8b, + 0xda, 0x09, 0x0f, 0xa7, 0x24, 0x41, 0x0a, 0xbc, 0x25, 0xf0, 0x6b, 0xc7, + 0x15, 0x50, 0xab, 0x2d, 0x69, 0xe9, 0x09, 0xab, 0x51, 0x7b, 0xad, 0x95, + 0xbc, 0xaf, 0x2f, 0x90, 0xa1, 0xbb, 0xa2, 0xbe, 0xb9, 0x02, 0x30, 0x6b, + 0xcb, 0xc7, 0x5f, 0xf3, 0x8a, 0xc7, 0xd9, 0x4d, 0x97, 0x69, 0x80, 0x55, + 0xcd, 0x5e, 0x1e, 0xf0, 0xe5, 0x37, 0x5e, 0x3a, 0xe0, 0xeb, 0x75, 0x80, + 0x09, 0xbd, 0xcd, 0xf2, 0x65, 0xd9, 0xf7, 0xda, 0x8b, 0xe8, 0xb3, 0x2f, + 0x5a, 0x36, 0xbc, 0xe6, 0x0b, 0x2f, 0x72, 0xbe, 0xf9, 0x22, 0x3f, 0x87, + 0x62, 0x1c, 0x7e, 0x57, 0xbb, 0x9f, 0xd4, 0xdb, 0xbf, 0x45, 0x01, 0xb5, + 0xcc, 0xf6, 0x67, 0xa0, 0x03, 0xac, 0x95, 0xbd, 0xaf, 0x93, 0xcf, 0x5c, + 0x49, 0x8d, 0x0e, 0xed, 0x64, 0x6a, 0xf6, 0x00, 0x40, 0x04, 0xb7, 0x9a, + 0xd4, 0xee, 0x24, 0xdc, 0xa5, 0x3e, 0xae, 0xb8, 0x55, 0x6a, 0x9e, 0x02, + 0x31, 0x9a, 0x9e, 0x8a, 0x4c, 0xd8, 0x2e, 0xa7, 0x4e, 0x14, 0x38, 0x51, + 0x38, 0x26, 0x3e, 0xcf, 0xad, 0x82, 0x0e, 0x7f, 0x0c, 0xf0, 0xb6, 0x57, + 0x91, 0xd2, 0x5d, 0x31, 0xfc, 0x31, 0x48, 0xf9, 0x5d, 0x29, 0xec, 0xee, + 0xa8, 0xcf, 0xde, 0xb6, 0xf7, 0xd7, 0x3b, 0x6d, 0x2d, 0xa0, 0xdb, 0xa8, + 0xa5, 0x75, 0x05, 0x84, 0x87, 0x75, 0xad, 0xb6, 0x27, 0x73, 0x72, 0x4f, + 0x39, 0xb5, 0xed, 0x08, 0x76, 0x4f, 0xec, 0x3f, 0xe9, 0x56, 0x07, 0xb8, + 0x42, 0x1d, 0xfe, 0xee, 0x36, 0x40, 0x9f, 0xbf, 0x1f, 0x3a, 0x9f, 0xb9, + 0x12, 0x7d, 0xb3, 0xc1, 0xb2, 0xc5, 0x5c, 0x62, 0x1c, 0x6e, 0x50, 0x2f, + 0x00, 0x30, 0x57, 0x0f, 0xa3, 0x73, 0x83, 0x89, 0x45, 0x01, 0xba, 0xd9, + 0x52, 0x80, 0xb9, 0x85, 0x90, 0xc1, 0x01, 0x8b, 0xc1, 0x81, 0xd8, 0x76, + 0x66, 0x21, 0xb6, 0x1d, 0x5e, 0x85, 0xbb, 0x39, 0x37, 0x3c, 0x60, 0xad, + 0xca, 0xde, 0xb8, 0x3f, 0x70, 0xe0, 0x2f, 0xf8, 0xc2, 0xaf, 0xbe, 0x3b, + 0x86, 0x46, 0x3e, 0x11, 0xc2, 0x65, 0xb1, 0xdd, 0xfc, 0xd1, 0x16, 0x33, + 0x47, 0x95, 0x6d, 0x75, 0xe8, 0x17, 0xc9, 0x4a, 0x6e, 0xfc, 0x34, 0x00, + 0xb3, 0x4b, 0xb7, 0x53, 0x5e, 0xbc, 0x97, 0xe3, 0xb4, 0x30, 0x0d, 0x99, + 0x6d, 0x49, 0xea, 0xe7, 0xa1, 0x11, 0x26, 0xda, 0xa4, 0x59, 0x18, 0x1b, + 0x6a, 0xe0, 0x0d, 0xdc, 0xc1, 0x60, 0xf3, 0x93, 0xcc, 0x9d, 0x2e, 0x52, + 0x19, 0x51, 0xb1, 0x07, 0x4b, 0xaa, 0x0d, 0xab, 0xe9, 0xc1, 0x06, 0xb7, + 0xac, 0xb6, 0xb5, 0x05, 0xa8, 0x0c, 0xc0, 0xe4, 0xe1, 0xb8, 0x55, 0x76, + 0x81, 0xea, 0xa5, 0x36, 0x41, 0x10, 0xb7, 0x33, 0xd5, 0xed, 0x0e, 0xc1, + 0xb9, 0x79, 0x64, 0x7f, 0x11, 0x6f, 0xa1, 0xc5, 0xd4, 0xb1, 0x16, 0xa3, + 0xc0, 0xde, 0x30, 0xa4, 0x32, 0xa4, 0xf2, 0x54, 0x3b, 0xa4, 0x80, 0x29, + 0xf5, 0x3a, 0x0c, 0x6d, 0x69, 0x50, 0xab, 0x27, 0x32, 0x93, 0xe9, 0x9b, + 0x0d, 0xf6, 0x59, 0x4c, 0xe9, 0xdb, 0x5a, 0x86, 0x12, 0x08, 0x11, 0x05, + 0x5f, 0xf5, 0x31, 0xc3, 0x90, 0xe4, 0xaf, 0xd4, 0x12, 0x2e, 0xe1, 0x92, + 0x47, 0x28, 0x6b, 0x58, 0x62, 0x08, 0x51, 0xb0, 0x91, 0xed, 0x06, 0x50, + 0x21, 0xa6, 0x0d, 0x24, 0x23, 0x83, 0x62, 0xbf, 0x45, 0xbd, 0xae, 0xee, + 0x83, 0x56, 0x18, 0x42, 0xdb, 0x06, 0x02, 0x2c, 0xb1, 0x9d, 0x50, 0x1e, + 0xd2, 0x10, 0x2d, 0xe5, 0x6e, 0xf5, 0x59, 0x9d, 0x8b, 0x1f, 0xb4, 0x25, + 0x45, 0xcb, 0xa6, 0xbe, 0xa8, 0xc2, 0xd8, 0xfb, 0x78, 0x8d, 0xdb, 0xae, + 0xae, 0xb0, 0xf7, 0x71, 0xb0, 0xc4, 0x43, 0x7a, 0xe8, 0x5d, 0xb2, 0x73, + 0x00, 0x68, 0x0b, 0xec, 0x7e, 0x87, 0xc6, 0x92, 0x1f, 0xad, 0x73, 0xa1, + 0xfa, 0x1f, 0x6a, 0x2b, 0xa3, 0x67, 0x4f, 0x11, 0x41, 0x15, 0xb2, 0x4a, + 0x82, 0xaf, 0x7a, 0x69, 0x35, 0x36, 0x2b, 0xf9, 0xb1, 0x2c, 0xfb, 0x25, + 0x34, 0x9a, 0xad, 0x0e, 0x88, 0x56, 0x47, 0x3c, 0x89, 0xf3, 0x53, 0x1b, + 0xd5, 0xf5, 0x35, 0x35, 0x5a, 0xaf, 0x3a, 0x3c, 0xd7, 0x3f, 0x02, 0x2d, + 0x33, 0x6e, 0x76, 0x21, 0x40, 0x2d, 0xcb, 0x2a, 0x11, 0x86, 0x41, 0xb4, + 0xcd, 0x4a, 0x01, 0xb4, 0xf4, 0xfd, 0x23, 0x25, 0xb2, 0x2d, 0xb1, 0xfa, + 0xd4, 0x82, 0x3c, 0x52, 0xca, 0x68, 0xcc, 0xf7, 0xe5, 0xca, 0x80, 0xba, + 0xba, 0xa5, 0x5d, 0xb6, 0xa5, 0xae, 0x9b, 0x7a, 0xf9, 0x8d, 0xdf, 0x5d, + 0x5c, 0x28, 0x4c, 0x2c, 0xca, 0x7f, 0x7f, 0x99, 0x70, 0xa9, 0x0e, 0x40, + 0xb0, 0x54, 0xa7, 0x54, 0x52, 0x60, 0x2d, 0x53, 0x47, 0x99, 0x38, 0x92, + 0x8b, 0x1d, 0x59, 0xa5, 0x12, 0x8e, 0xe5, 0xea, 0xf7, 0x95, 0x45, 0xfc, + 0xc0, 0xc3, 0xb6, 0x1d, 0x1c, 0x47, 0xbd, 0xbf, 0x6c, 0x34, 0x87, 0x71, + 0x4a, 0xc3, 0x38, 0x8e, 0x43, 0xa3, 0xb1, 0xfc, 0xfb, 0x0d, 0x80, 0x46, + 0xa3, 0xc1, 0xf6, 0xf7, 0xdc, 0x90, 0x76, 0x5c, 0x9a, 0xea, 0x18, 0x37, + 0x4b, 0xbe, 0xe7, 0x0a, 0x11, 0x08, 0x0d, 0xaf, 0x6a, 0xf4, 0x29, 0xa0, + 0x16, 0x40, 0xb1, 0x20, 0x34, 0x68, 0x4a, 0xf5, 0xe9, 0x85, 0xde, 0x52, + 0x88, 0xc3, 0x91, 0x05, 0xb0, 0x90, 0x84, 0x08, 0xe6, 0x05, 0x38, 0x40, + 0x83, 0xce, 0x77, 0x99, 0xe6, 0x79, 0x49, 0x36, 0x25, 0xa1, 0x3e, 0x97, + 0x7c, 0xa7, 0x67, 0x34, 0x49, 0x03, 0xb0, 0xd9, 0x17, 0xb6, 0xb0, 0xf4, + 0x7b, 0x8d, 0xc6, 0x52, 0x03, 0xbb, 0xdf, 0xc6, 0x79, 0x72, 0x3f, 0xfb, + 0xd8, 0xc5, 0xae, 0x8a, 0xe4, 0xc6, 0x1b, 0x6e, 0x64, 0xf7, 0xf6, 0x4b, + 0x08, 0xda, 0x0a, 0x72, 0xd3, 0x6a, 0x36, 0x90, 0x6d, 0x98, 0x13, 0x30, + 0xd8, 0x4e, 0x83, 0xb5, 0x2a, 0xc0, 0x7c, 0x8f, 0x27, 0x5e, 0x13, 0x7f, + 0x54, 0xcb, 0x6b, 0xc0, 0x67, 0xc7, 0x82, 0x58, 0xe6, 0x3d, 0xbe, 0x06, + 0x6a, 0x99, 0x3c, 0xcb, 0xcc, 0xb8, 0xc6, 0xbd, 0x05, 0xa8, 0x09, 0x68, + 0x49, 0xf0, 0xf4, 0x39, 0x57, 0xb6, 0x38, 0x54, 0x80, 0xed, 0x12, 0x26, + 0x0b, 0xa8, 0xf6, 0x49, 0xc2, 0x81, 0x44, 0x6b, 0x32, 0x08, 0x1c, 0xd7, + 0x51, 0xde, 0x0b, 0xdc, 0xd2, 0x56, 0xc0, 0xac, 0xc1, 0x42, 0x11, 0xbf, + 0x19, 0xb7, 0xe5, 0x63, 0xc8, 0xa8, 0x1f, 0x79, 0x7f, 0x41, 0xf5, 0x41, + 0x67, 0x81, 0xb1, 0x02, 0x4c, 0xea, 0xbc, 0x64, 0xdf, 0x73, 0xf1, 0xde, + 0x06, 0x96, 0xbe, 0xd6, 0x06, 0xf0, 0xf4, 0x72, 0x64, 0xe0, 0x50, 0x53, + 0x1a, 0xf6, 0x74, 0xe9, 0x4f, 0x5f, 0x78, 0x18, 0xfe, 0xb9, 0x25, 0x9c, + 0xbe, 0xee, 0x40, 0x2d, 0xbf, 0x09, 0xd7, 0xbd, 0x57, 0x8d, 0x7d, 0xbd, + 0x89, 0xb7, 0x11, 0x70, 0x92, 0x17, 0x9c, 0x66, 0xf4, 0x9b, 0x33, 0x90, + 0xa9, 0xd1, 0xd1, 0x51, 0xce, 0x68, 0xd0, 0x54, 0x12, 0x6a, 0x65, 0xd2, + 0x77, 0xf6, 0xfc, 0x79, 0x46, 0xb7, 0x8f, 0xa6, 0x40, 0x62, 0x06, 0xa0, + 0x65, 0x6c, 0x0c, 0xa4, 0xca, 0x94, 0x49, 0xaf, 0x30, 0xd7, 0xbd, 0x61, + 0x0d, 0x67, 0xcf, 0x9f, 0x67, 0xdd, 0x9a, 0x35, 0x5c, 0x7c, 0xf1, 0xc5, + 0x9c, 0x21, 0x0d, 0xc0, 0x9a, 0x9a, 0x9a, 0x8a, 0x20, 0x58, 0xc9, 0xb8, + 0x4e, 0x9e, 0x3c, 0xc9, 0xa6, 0x4d, 0x9b, 0x18, 0xdd, 0xa6, 0x00, 0x64, + 0xa3, 0xa3, 0xa3, 0x29, 0x38, 0xd6, 0xe6, 0x6d, 0x97, 0xc1, 0xb1, 0xa3, + 0x9c, 0xf7, 0xcf, 0xb2, 0x79, 0xdb, 0x65, 0x9c, 0x21, 0x86, 0x7a, 0x9d, + 0x3c, 0x79, 0x92, 0x75, 0x9c, 0x4d, 0x85, 0x9b, 0x86, 0x70, 0xfd, 0x2f, + 0x75, 0x5d, 0xdf, 0x0b, 0xfc, 0x3f, 0xaa, 0x6c, 0x92, 0x75, 0xf8, 0xec, + 0xa1, 0x49, 0x66, 0x0f, 0x4d, 0x52, 0xa9, 0x54, 0x08, 0x4e, 0xd7, 0xd8, + 0x37, 0xeb, 0x31, 0xb3, 0xe4, 0x31, 0x3f, 0xeb, 0x71, 0xe3, 0x27, 0xc6, + 0xd8, 0xf7, 0xdb, 0x7b, 0xf1, 0x3c, 0x70, 0x5d, 0x98, 0x7c, 0xa4, 0xc6, + 0xf5, 0x1f, 0xfb, 0x14, 0xfb, 0x7e, 0x7b, 0x2f, 0xce, 0x80, 0xcb, 0xb5, + 0xff, 0x7e, 0x8a, 0xb1, 0xb5, 0x2a, 0xcc, 0xa9, 0xaf, 0x78, 0x1c, 0x78, + 0x36, 0x80, 0x3f, 0x78, 0x88, 0x4f, 0x5d, 0xb3, 0x9d, 0x30, 0xf0, 0x28, + 0xbe, 0xe0, 0x33, 0xd7, 0xe7, 0xe0, 0x7f, 0x76, 0x2f, 0xee, 0xfa, 0x32, + 0xb7, 0x7f, 0xae, 0x86, 0xb3, 0xd9, 0x01, 0xcb, 0x66, 0xea, 0x50, 0x8d, + 0xca, 0x40, 0x19, 0x0a, 0x36, 0x93, 0xb5, 0x79, 0x46, 0xaf, 0x19, 0xc6, + 0xde, 0x0c, 0xd5, 0xba, 0xaa, 0xe7, 0xe7, 0x43, 0x8f, 0xd1, 0x6b, 0x46, + 0xf9, 0xd4, 0x86, 0x31, 0xee, 0xff, 0xbf, 0xf6, 0x71, 0xfd, 0xf6, 0x61, + 0xa6, 0x16, 0x7d, 0x0d, 0xc3, 0xb2, 0x11, 0x42, 0xe0, 0xd5, 0x6b, 0xcc, + 0x4a, 0x28, 0xf5, 0x59, 0xb8, 0x05, 0xc1, 0xd4, 0xa2, 0x8f, 0xb3, 0xb9, + 0x82, 0x55, 0xf7, 0x81, 0x06, 0x14, 0x04, 0x4e, 0xd9, 0x22, 0x38, 0x51, + 0x23, 0x00, 0xfd, 0x5e, 0x58, 0xdd, 0x4f, 0xa3, 0x1b, 0xf5, 0xfb, 0x62, + 0xdf, 0xc7, 0xb1, 0x5d, 0xc6, 0x2e, 0x75, 0xf0, 0x16, 0x3d, 0xe4, 0x52, + 0xc0, 0xdc, 0x82, 0x87, 0x3d, 0x60, 0x53, 0x29, 0xa9, 0x71, 0x70, 0x21, + 0x40, 0xf4, 0x39, 0x6a, 0x5c, 0x46, 0x14, 0x75, 0xdf, 0x54, 0x49, 0x14, + 0x2d, 0x55, 0xd7, 0xad, 0x41, 0x81, 0xb5, 0x8a, 0x20, 0x5a, 0x3a, 0x96, + 0x16, 0x48, 0x64, 0x34, 0x90, 0x26, 0x00, 0x3b, 0xb4, 0xf1, 0xdb, 0x0a, + 0xcc, 0x6e, 0xbe, 0x3b, 0x10, 0x05, 0x1d, 0x0e, 0x6a, 0xf1, 0xa8, 0x7d, + 0x7f, 0xb0, 0x0f, 0x77, 0x63, 0x05, 0x74, 0x5b, 0x25, 0xda, 0xba, 0x17, + 0x2c, 0xe2, 0xef, 0x84, 0xfc, 0xa6, 0xaf, 0xea, 0x5a, 0x51, 0x54, 0x40, + 0x43, 0xa3, 0xe4, 0x58, 0x8a, 0xbe, 0xa7, 0xab, 0xbc, 0x3e, 0x82, 0x36, + 0xbd, 0x75, 0xe3, 0x06, 0xde, 0xf9, 0xf6, 0x77, 0x77, 0xde, 0x50, 0x5a, + 0x7f, 0xf4, 0xc7, 0x13, 0x7c, 0xf0, 0xe7, 0xc7, 0x57, 0x74, 0x5b, 0x8d, + 0x56, 0x1b, 0x56, 0xd2, 0xed, 0xcf, 0xbf, 0xf1, 0x54, 0xd7, 0xb0, 0x4c, + 0xda, 0x93, 0xfa, 0xfa, 0xd3, 0x87, 0x2e, 0x1c, 0xf8, 0xd5, 0x23, 0xac, + 0x6e, 0x6e, 0x49, 0xcd, 0xff, 0xd5, 0xd7, 0x2f, 0x38, 0x9e, 0xd5, 0xea, + 0xf9, 0xef, 0x9d, 0xe1, 0xbb, 0x7f, 0x75, 0x71, 0xca, 0xed, 0xbb, 0xdf, + 0xf7, 0x78, 0xfe, 0x7b, 0x67, 0x78, 0xc3, 0xeb, 0x2f, 0x8e, 0xf6, 0x37, + 0xac, 0xb9, 0x22, 0x3a, 0x9f, 0xbd, 0xa7, 0x73, 0xe5, 0xca, 0x95, 0x2b, + 0x57, 0xae, 0x5c, 0xb9, 0x72, 0xe5, 0xca, 0x95, 0x2b, 0x57, 0xae, 0x5c, + 0xb9, 0x72, 0xe5, 0xca, 0x95, 0x2b, 0x57, 0xae, 0x5c, 0xb9, 0x72, 0xe5, + 0xca, 0x95, 0x2b, 0xd7, 0xea, 0x95, 0x43, 0xb5, 0x72, 0xe5, 0xca, 0x95, + 0x2b, 0x57, 0xae, 0x1f, 0x01, 0x89, 0x92, 0x9b, 0x9a, 0x5c, 0x6a, 0x0b, + 0x2b, 0x5a, 0x2d, 0xdc, 0x5f, 0xca, 0xc0, 0xb2, 0xf4, 0xaa, 0x9b, 0x56, + 0xbf, 0x85, 0xb3, 0x79, 0x18, 0x47, 0x7f, 0x50, 0xee, 0x6e, 0x46, 0x7f, + 0xa0, 0x27, 0x68, 0x34, 0x0c, 0xb4, 0x48, 0x7d, 0x50, 0x17, 0xc1, 0x62, + 0x96, 0xd4, 0xc4, 0xcc, 0x50, 0x0a, 0xec, 0xb6, 0x85, 0x53, 0xd6, 0x93, + 0xae, 0x05, 0xb8, 0x25, 0x17, 0x28, 0xe2, 0xd5, 0x8f, 0x83, 0x80, 0xed, + 0x57, 0xaa, 0xe9, 0x64, 0x8e, 0x99, 0x98, 0x51, 0x10, 0x14, 0xd7, 0xfa, + 0x38, 0x5b, 0x24, 0xe1, 0x52, 0x40, 0xd0, 0x04, 0xf7, 0xd2, 0x51, 0xac, + 0x52, 0x09, 0x5b, 0x4f, 0x38, 0xf5, 0xbc, 0x3a, 0x14, 0x04, 0x01, 0x20, + 0xda, 0x21, 0xb5, 0x13, 0x35, 0x58, 0xf2, 0xa2, 0x74, 0xdc, 0xf0, 0x89, + 0xcf, 0xa6, 0xf3, 0xad, 0xb7, 0xf5, 0xa5, 0x80, 0x56, 0xb3, 0x85, 0x99, + 0xca, 0x1d, 0x36, 0x02, 0xe4, 0xa2, 0xca, 0xa7, 0xdd, 0x67, 0x23, 0xcc, + 0x44, 0xfe, 0x2e, 0x32, 0x76, 0x15, 0x9d, 0xde, 0x52, 0xbf, 0x0a, 0xa5, + 0xae, 0x67, 0xe1, 0x4f, 0x3d, 0x39, 0x89, 0xdb, 0x67, 0xe3, 0xa1, 0x3e, + 0x66, 0xac, 0x6c, 0xdd, 0x4e, 0xb1, 0xaf, 0x08, 0x6d, 0x10, 0xbe, 0x97, + 0x0a, 0xab, 0xb1, 0x30, 0xa7, 0xe0, 0x65, 0x96, 0xc0, 0x1e, 0x18, 0xa4, + 0x5a, 0x1d, 0x52, 0x1f, 0x43, 0xf7, 0xbb, 0x1c, 0xfa, 0x4a, 0x27, 0x14, + 0xac, 0xeb, 0x0a, 0xca, 0x2b, 0x69, 0xad, 0x06, 0x67, 0x99, 0x8f, 0x1b, + 0x9b, 0x80, 0x5b, 0x84, 0x45, 0xa9, 0xdc, 0x2d, 0xa1, 0xf6, 0xb7, 0xda, + 0x50, 0x6b, 0xa8, 0x0f, 0x81, 0xb7, 0xda, 0xf0, 0x6c, 0x03, 0x64, 0x03, + 0x36, 0xd8, 0x70, 0xba, 0x01, 0x15, 0xed, 0x96, 0x4c, 0x8f, 0xee, 0xd9, + 0x39, 0x1a, 0x9a, 0xe5, 0x37, 0x25, 0x96, 0x55, 0x24, 0x0c, 0x5b, 0x34, + 0x9a, 0x12, 0xb7, 0x6c, 0xd1, 0x68, 0x4a, 0xec, 0x3e, 0x41, 0x8b, 0xfc, + 0x19, 0x1f, 0x00, 0x00, 0x20, 0x00, 0x49, 0x44, 0x41, 0x54, 0x37, 0x39, + 0x25, 0xf5, 0x11, 0x68, 0xa3, 0x4b, 0x9e, 0xc2, 0x30, 0x44, 0xe8, 0x7f, + 0xc9, 0x1f, 0xab, 0xdb, 0x6f, 0x21, 0xd1, 0x7e, 0xa4, 0x02, 0x78, 0x85, + 0x61, 0x8b, 0x46, 0x28, 0x71, 0x07, 0x4a, 0x58, 0x56, 0x91, 0xf9, 0x63, + 0x1e, 0xee, 0x40, 0x3c, 0x51, 0x3f, 0x09, 0xb7, 0x02, 0x68, 0x44, 0xd0, + 0x26, 0x41, 0x75, 0x9b, 0x4b, 0x18, 0xb6, 0x22, 0xa0, 0x56, 0x37, 0xb0, + 0x96, 0x99, 0xc0, 0x1c, 0x01, 0xb5, 0x92, 0x93, 0xa6, 0xf5, 0xc4, 0x07, + 0xd1, 0x25, 0x8f, 0xee, 0x7a, 0x8b, 0xc6, 0x52, 0x48, 0x23, 0x01, 0x24, + 0x8b, 0x80, 0x5a, 0x65, 0x4b, 0x6d, 0x75, 0x7c, 0xe6, 0x83, 0x7d, 0x03, + 0xd6, 0x8a, 0xe2, 0x5c, 0x0a, 0xa3, 0x32, 0x2d, 0x75, 0xc4, 0x70, 0x61, + 0x12, 0xa2, 0x84, 0x94, 0xaf, 0x0e, 0xec, 0xa4, 0x25, 0x5b, 0x04, 0x4b, + 0xdd, 0xe3, 0x4e, 0x96, 0x9d, 0x6c, 0xca, 0x68, 0xb5, 0x6c, 0xe8, 0x9c, + 0x30, 0x92, 0x9d, 0x4c, 0x62, 0xec, 0x22, 0xb7, 0x15, 0xee, 0x0f, 0x29, + 0x65, 0x6a, 0x35, 0x6e, 0xe3, 0xef, 0x95, 0x82, 0x48, 0x09, 0x21, 0x68, + 0x84, 0x8d, 0x0e, 0x60, 0x97, 0x4c, 0x7c, 0x6c, 0x2c, 0x33, 0x90, 0x25, + 0x93, 0x96, 0x0b, 0x91, 0xc9, 0x67, 0x23, 0x6c, 0x60, 0x5b, 0xdd, 0x27, + 0xc0, 0x99, 0x7a, 0xd8, 0xb6, 0x6c, 0x5a, 0xb2, 0x85, 0xdd, 0x6f, 0xd3, + 0x58, 0xd2, 0x6e, 0x99, 0x09, 0x70, 0xc6, 0xbd, 0x97, 0x92, 0xf6, 0x49, + 0x5b, 0x67, 0xbd, 0x83, 0xbf, 0xe8, 0x47, 0x5b, 0xe3, 0x06, 0x44, 0xc7, + 0x59, 0x3b, 0x99, 0x98, 0x9c, 0x11, 0x2e, 0x85, 0x58, 0x1a, 0x90, 0x67, + 0x60, 0x6a, 0xbd, 0x8e, 0xb3, 0x6e, 0x49, 0xbf, 0xdd, 0xce, 0x2f, 0xe7, + 0x96, 0x3d, 0x67, 0x64, 0xc2, 0x4d, 0xda, 0x2b, 0xe8, 0x63, 0x90, 0x98, + 0x60, 0xa4, 0xce, 0x87, 0x4d, 0x89, 0x95, 0x98, 0x32, 0x2c, 0x35, 0x20, + 0x4e, 0x36, 0x43, 0x75, 0xae, 0x47, 0xbd, 0x27, 0x84, 0x20, 0x6c, 0xca, + 0x55, 0xd7, 0xe5, 0x77, 0xdf, 0x7d, 0x37, 0x1f, 0xfb, 0xd8, 0xc7, 0x00, + 0xd8, 0x38, 0xb0, 0xfc, 0x8a, 0xc8, 0xe5, 0xb2, 0x02, 0x67, 0xdd, 0x9e, + 0x00, 0x65, 0x7d, 0x70, 0x62, 0x9a, 0x27, 0xf4, 0x7e, 0xd2, 0xfd, 0x81, + 0xe9, 0x3a, 0x37, 0x8d, 0x94, 0x29, 0x97, 0xcb, 0x11, 0x88, 0xab, 0x5c, + 0x56, 0x30, 0xae, 0x1f, 0x34, 0x68, 0xeb, 0xa2, 0x0c, 0x60, 0xeb, 0x9e, + 0xbb, 0xef, 0x5e, 0xd6, 0xfe, 0x1f, 0xcb, 0xf9, 0x8f, 0x2d, 0x6b, 0x15, + 0xeb, 0xb6, 0x6d, 0x25, 0xf6, 0xee, 0xd8, 0x0f, 0x77, 0xc4, 0x93, 0x0e, + 0xf6, 0x4f, 0x3e, 0xc5, 0xb5, 0xef, 0x7d, 0x77, 0x0a, 0xbc, 0x78, 0xdb, + 0xe5, 0xaa, 0x4f, 0x25, 0xdb, 0x3e, 0xf7, 0x1d, 0x0b, 0xd8, 0xa9, 0xc1, + 0x17, 0x07, 0x16, 0x13, 0x36, 0x57, 0x28, 0x9b, 0xbd, 0x87, 0xe3, 0xc9, + 0xf4, 0x59, 0x80, 0x63, 0xb7, 0x70, 0xcc, 0x9c, 0x3e, 0x03, 0xd4, 0xda, + 0xa9, 0xdb, 0x54, 0x03, 0xcc, 0xf2, 0xa4, 0xc4, 0x93, 0x0a, 0xba, 0x25, + 0x13, 0xb6, 0xb7, 0x5d, 0x51, 0x85, 0x44, 0x1b, 0x9a, 0x4c, 0xd3, 0xee, + 0x6d, 0x25, 0x44, 0x41, 0xd5, 0x0f, 0x7b, 0x8f, 0xf4, 0x4e, 0xcf, 0x6a, + 0xd3, 0xd8, 0x2d, 0xaf, 0x9f, 0x9e, 0x9e, 0x7f, 0xc9, 0x65, 0xf4, 0x10, + 0xbd, 0x25, 0x61, 0xe5, 0x49, 0xc2, 0xed, 0x0b, 0xec, 0x9f, 0xbd, 0xd2, + 0x1a, 0xde, 0x05, 0x5f, 0xdd, 0x07, 0xb3, 0x33, 0xea, 0xd8, 0x2d, 0xc3, + 0xcf, 0xbc, 0x1f, 0xfe, 0xf2, 0x4f, 0xa1, 0xfd, 0x2f, 0x56, 0xf4, 0xbe, + 0xee, 0xa7, 0x7e, 0x70, 0x40, 0xad, 0x0b, 0x52, 0x16, 0xa0, 0x35, 0x50, + 0x01, 0xe6, 0xe0, 0x4d, 0x83, 0x3c, 0xf0, 0x9d, 0x39, 0x6e, 0x7a, 0xb2, + 0x17, 0xf2, 0xe1, 0x47, 0x59, 0x21, 0xc5, 0xb5, 0xa6, 0x0d, 0x6a, 0x50, + 0x5c, 0x1b, 0xb7, 0xa9, 0x06, 0xa8, 0x15, 0xed, 0x1f, 0xd1, 0xfb, 0x4e, + 0x7a, 0x7b, 0xc3, 0x7f, 0x50, 0xb0, 0x2c, 0xb1, 0xe4, 0x41, 0xc9, 0xa5, + 0x05, 0xdc, 0x7f, 0xc7, 0x2d, 0x0c, 0xfd, 0xd7, 0xc7, 0x01, 0xf4, 0xb6, + 0xc5, 0x6e, 0x3d, 0x09, 0xcb, 0x5a, 0xdf, 0x82, 0x56, 0x8b, 0xd9, 0xff, + 0xe3, 0x6a, 0x6e, 0x9b, 0x52, 0xcf, 0x43, 0xc3, 0x7a, 0x6b, 0x7f, 0xcc, + 0xc0, 0x6e, 0x75, 0xfd, 0x30, 0xfa, 0x2b, 0x54, 0xbf, 0xba, 0x13, 0x80, + 0xca, 0x57, 0xc7, 0xb8, 0x5e, 0xdf, 0xd3, 0xae, 0xa5, 0x26, 0x82, 0xd6, + 0xde, 0x3b, 0xc9, 0x6d, 0x9f, 0x79, 0x00, 0x80, 0xd1, 0xcf, 0x28, 0xbb, + 0x41, 0x47, 0xf7, 0x9f, 0xca, 0x2a, 0xbe, 0x29, 0x37, 0xa6, 0xe0, 0x58, + 0x57, 0xc2, 0xee, 0xf5, 0x55, 0x2c, 0x37, 0xbe, 0x27, 0x46, 0x4b, 0x69, + 0xe8, 0x99, 0x6c, 0x0f, 0x51, 0xbc, 0x59, 0x44, 0x69, 0x98, 0x94, 0xb3, + 0xa9, 0xf3, 0x95, 0x8d, 0x82, 0xeb, 0xd7, 0xee, 0xc4, 0x4d, 0x34, 0xdd, + 0xa3, 0x47, 0xd3, 0xe8, 0x91, 0xe1, 0xab, 0x6e, 0x54, 0x3b, 0x03, 0x2e, + 0xad, 0x7a, 0x0d, 0xda, 0x30, 0x5f, 0x4e, 0xf7, 0x96, 0x6f, 0xb8, 0xa6, + 0x8c, 0x5d, 0x96, 0x34, 0xea, 0xea, 0xb8, 0x6a, 0xa7, 0x41, 0x44, 0xd6, + 0xbf, 0x19, 0x46, 0xbe, 0xe0, 0x22, 0x5b, 0xf3, 0x50, 0x80, 0x19, 0x12, + 0xe0, 0x11, 0xd9, 0x62, 0x6c, 0xfb, 0x76, 0x00, 0xca, 0x16, 0x70, 0xac, + 0x0b, 0xc4, 0xe8, 0x02, 0x95, 0x05, 0x3e, 0xad, 0xd4, 0xfb, 0x4c, 0xda, + 0xaf, 0xb6, 0xa7, 0xda, 0xab, 0x47, 0x69, 0xfc, 0xf7, 0xaa, 0xa9, 0x92, + 0xe7, 0x57, 0xcb, 0x3a, 0xfe, 0xc7, 0x9a, 0x97, 0x95, 0xe4, 0x2d, 0x38, + 0xf8, 0xe7, 0xd4, 0x73, 0xbd, 0x57, 0xaf, 0x71, 0xc9, 0x65, 0x15, 0xf0, + 0x25, 0x8d, 0x30, 0xa4, 0xd5, 0x86, 0xa2, 0x6e, 0x87, 0x46, 0xaf, 0xd1, + 0x30, 0x90, 0x69, 0xa8, 0x5c, 0x75, 0x09, 0xd5, 0x01, 0x78, 0xe8, 0xf3, + 0x89, 0xb1, 0x96, 0x40, 0x42, 0x3f, 0x4c, 0x3e, 0xa1, 0x9f, 0xa5, 0xcf, + 0xa9, 0xdf, 0x58, 0xb8, 0x14, 0x52, 0xfd, 0xd9, 0x21, 0x05, 0x54, 0x4e, + 0x68, 0xec, 0x06, 0x97, 0xb9, 0x67, 0x05, 0x33, 0x5f, 0x96, 0xec, 0xbc, + 0x59, 0xdd, 0x7b, 0xb7, 0xff, 0xdc, 0xfd, 0x38, 0x97, 0x0e, 0x51, 0xf7, + 0xe6, 0x28, 0x33, 0x88, 0x79, 0x60, 0x7c, 0xf4, 0xcb, 0xaa, 0x04, 0x02, + 0x3d, 0xb6, 0xb3, 0xf3, 0xa3, 0xea, 0x1e, 0x9d, 0x7a, 0x30, 0x9e, 0x2c, + 0xef, 0x6e, 0x74, 0xd9, 0x79, 0xab, 0xcb, 0xcc, 0xac, 0xc3, 0xd4, 0x83, + 0x92, 0xeb, 0x3f, 0xe1, 0x32, 0x3b, 0x0b, 0x33, 0x8f, 0x1c, 0xc0, 0xbd, + 0x7c, 0x88, 0xd9, 0x07, 0x25, 0xac, 0x87, 0x2f, 0x3c, 0x29, 0xa3, 0xb4, + 0x78, 0x8b, 0x1e, 0xfe, 0x69, 0x15, 0xe6, 0xf0, 0x75, 0xc3, 0xcc, 0x3e, + 0x48, 0x04, 0xde, 0x72, 0x1c, 0x8b, 0xeb, 0x3f, 0xa1, 0x27, 0xcb, 0x3e, + 0x02, 0xac, 0x97, 0xb8, 0xeb, 0x5d, 0xdc, 0xf5, 0x2e, 0x33, 0xb3, 0x33, + 0xdc, 0xf0, 0x89, 0x5d, 0x38, 0x28, 0xc0, 0x17, 0x6d, 0x89, 0xd3, 0x06, + 0xbf, 0x00, 0xce, 0x32, 0xed, 0x6b, 0x4b, 0x4f, 0xd6, 0x2e, 0x11, 0xff, + 0x1e, 0x92, 0x40, 0xad, 0xec, 0x73, 0x15, 0x00, 0x2f, 0x40, 0xb5, 0x5f, + 0x9d, 0xab, 0x5c, 0xee, 0x20, 0x8a, 0x02, 0xd9, 0x92, 0xf8, 0xdf, 0x84, + 0x9d, 0xbf, 0xac, 0xca, 0xc1, 0xd1, 0x65, 0x30, 0xf7, 0xcc, 0x4c, 0xef, + 0xc8, 0xff, 0x09, 0xa8, 0xa2, 0xa1, 0x59, 0x4f, 0xf4, 0x38, 0xff, 0xba, + 0x97, 0x10, 0xe6, 0x6b, 0x81, 0x7f, 0x8e, 0x02, 0x05, 0xbc, 0x5e, 0xbb, + 0x9d, 0x47, 0x35, 0x6f, 0x67, 0x7a, 0xf8, 0x69, 0xbe, 0xf0, 0x22, 0x7f, + 0xab, 0x41, 0x5f, 0xbd, 0xf4, 0x13, 0x7d, 0x17, 0xb1, 0x05, 0xf5, 0x5b, + 0x48, 0x5e, 0xb5, 0x9f, 0x48, 0xec, 0xff, 0x6d, 0x66, 0xdb, 0x0d, 0xac, + 0xd5, 0x4b, 0x7e, 0x00, 0xbb, 0x86, 0xaa, 0x4c, 0xd5, 0x6a, 0x70, 0x68, + 0x32, 0xaa, 0x3c, 0x26, 0x01, 0x21, 0x05, 0xa3, 0x42, 0x32, 0x75, 0x68, + 0x12, 0xbf, 0x2c, 0x30, 0x98, 0x4d, 0x37, 0xf0, 0xf0, 0xa4, 0x80, 0x5a, + 0x0d, 0xca, 0x82, 0x7d, 0xcf, 0x80, 0xa9, 0x4d, 0xf6, 0x7f, 0x39, 0x06, + 0x5e, 0xed, 0x03, 0xb8, 0x54, 0xe0, 0x04, 0x92, 0x29, 0x03, 0x73, 0xd3, + 0x93, 0x94, 0x27, 0x75, 0xdc, 0x4e, 0x09, 0x46, 0xa5, 0x40, 0x00, 0x53, + 0xa8, 0xe8, 0x67, 0x0e, 0x4d, 0x32, 0x2a, 0xc0, 0xab, 0xd5, 0x10, 0x65, + 0xc1, 0xe4, 0x11, 0x89, 0x28, 0x09, 0x38, 0x58, 0xc3, 0xa3, 0x86, 0x40, + 0x20, 0x45, 0xf7, 0xda, 0xcb, 0x73, 0x05, 0xee, 0x21, 0xa9, 0x28, 0x46, + 0x5d, 0xf3, 0x1b, 0xa7, 0x5d, 0x20, 0xa2, 0x38, 0x47, 0x85, 0x4e, 0xa3, + 0x0e, 0x77, 0x5f, 0x20, 0x70, 0x0f, 0x4d, 0xe2, 0x85, 0x40, 0x30, 0x1f, + 0xe5, 0x67, 0x17, 0xc0, 0xef, 0x00, 0xbf, 0x9e, 0x09, 0xd8, 0xcc, 0xbd, + 0xcd, 0x80, 0x4c, 0xc3, 0xcc, 0x71, 0x56, 0x59, 0x68, 0x96, 0x75, 0x45, + 0xda, 0x5f, 0xd6, 0x7f, 0x64, 0x7f, 0x18, 0xca, 0x5f, 0x44, 0xd5, 0x51, + 0x87, 0xbb, 0x00, 0xb9, 0xba, 0x68, 0xec, 0xb2, 0xce, 0x71, 0x81, 0xa4, + 0x06, 0xcb, 0x56, 0x64, 0x23, 0xfa, 0x8a, 0x11, 0xac, 0x69, 0xae, 0x1e, + 0xb2, 0x73, 0x7b, 0x82, 0xfa, 0xa7, 0xeb, 0xa2, 0x9d, 0x57, 0x3a, 0x1c, + 0x78, 0x5a, 0xd5, 0x8b, 0x49, 0xc0, 0xd6, 0xd8, 0x95, 0xb1, 0xed, 0xcc, + 0x42, 0xc8, 0x9f, 0xfe, 0xf9, 0x5f, 0xf0, 0xfe, 0x77, 0xbe, 0x23, 0x72, + 0xbb, 0xe1, 0x3f, 0x3f, 0x45, 0xf0, 0xd8, 0x2f, 0x76, 0xd8, 0x4f, 0x3e, + 0x9d, 0x1e, 0x93, 0xef, 0xa6, 0x9b, 0x76, 0xbe, 0x83, 0xe1, 0x01, 0x0b, + 0xf1, 0x70, 0x3c, 0x1e, 0x31, 0x77, 0x47, 0x1d, 0x81, 0x86, 0x70, 0x2d, + 0x84, 0x1d, 0x94, 0xed, 0x99, 0xa3, 0x21, 0xd5, 0xa1, 0xa2, 0xda, 0x5e, + 0x16, 0x43, 0x3c, 0xea, 0xe2, 0x16, 0xaa, 0x97, 0x15, 0x69, 0x3c, 0xad, + 0xfa, 0x89, 0x8d, 0x50, 0xd0, 0x48, 0x0c, 0x93, 0xb8, 0xe5, 0x10, 0xd7, + 0x76, 0xa3, 0x3c, 0x3a, 0xc0, 0xe0, 0x86, 0x16, 0x73, 0x1a, 0xa2, 0xb5, + 0xeb, 0x2a, 0x87, 0x99, 0x53, 0x3e, 0xb6, 0x05, 0x96, 0x45, 0x04, 0xd7, + 0x42, 0x4a, 0x6a, 0xdf, 0x54, 0xbb, 0x95, 0x2d, 0x82, 0xda, 0x37, 0x25, + 0x43, 0x3b, 0x04, 0x0f, 0x1d, 0xf4, 0xd8, 0x79, 0xa9, 0x8b, 0x6c, 0xb7, + 0xf0, 0x05, 0x4c, 0xce, 0xce, 0x90, 0xe4, 0xc9, 0xb8, 0x03, 0x45, 0x5a, + 0x85, 0xdb, 0xb9, 0xed, 0xdc, 0xed, 0xcc, 0xcf, 0xea, 0xc9, 0xfc, 0x4d, + 0xa0, 0x24, 0xb0, 0x2c, 0x9b, 0xd9, 0x6f, 0x36, 0x00, 0x49, 0x75, 0xc0, + 0x61, 0x25, 0x8c, 0x4b, 0x0c, 0x21, 0x90, 0x88, 0x82, 0x43, 0xd8, 0x6e, + 0x90, 0xc4, 0xbe, 0x85, 0xd2, 0x23, 0x94, 0xbe, 0xb6, 0xd5, 0x63, 0xbb, + 0x05, 0x07, 0xf0, 0xe8, 0xf6, 0x6b, 0xb2, 0x44, 0x89, 0x86, 0x7e, 0x3e, + 0xb6, 0x44, 0x49, 0x8d, 0x35, 0x17, 0xd4, 0x38, 0x7a, 0x28, 0x0f, 0xe9, + 0x30, 0x7d, 0x2c, 0xa1, 0xe2, 0x2a, 0x5a, 0x0e, 0x61, 0x10, 0x52, 0xb6, + 0xae, 0xa7, 0x1e, 0x3e, 0x84, 0x25, 0xc6, 0x08, 0xdb, 0x73, 0xb4, 0x42, + 0x1f, 0xda, 0x92, 0x7d, 0x5f, 0xfb, 0x34, 0x65, 0xcb, 0x62, 0xef, 0xe3, + 0x00, 0x0f, 0x10, 0xca, 0x9b, 0xb8, 0xed, 0xea, 0xff, 0x97, 0xbd, 0x8f, + 0xff, 0x0b, 0x24, 0x0f, 0xa0, 0xea, 0x13, 0xa9, 0xc3, 0x8d, 0xc1, 0x06, + 0xa1, 0x34, 0xb0, 0x7e, 0xdd, 0x1f, 0x2f, 0xf4, 0x5e, 0xa0, 0xe1, 0x95, + 0x50, 0xb8, 0xd4, 0x48, 0x43, 0xb4, 0xda, 0x20, 0x9b, 0xad, 0xe8, 0x3d, + 0x12, 0x74, 0x1e, 0x77, 0x0d, 0x27, 0xf4, 0x3b, 0x20, 0x5a, 0x66, 0x91, + 0x91, 0xb4, 0x5d, 0xb8, 0x22, 0x6c, 0xab, 0x9b, 0xea, 0x40, 0x99, 0xf8, + 0xca, 0x95, 0x13, 0x6e, 0xc9, 0xf3, 0x23, 0x23, 0xea, 0x78, 0x7a, 0x1a, + 0xc6, 0xf7, 0xc4, 0xfb, 0xe5, 0x84, 0xef, 0x32, 0x65, 0xa6, 0xeb, 0x75, + 0xca, 0x65, 0xa8, 0x53, 0x8f, 0xec, 0x26, 0x26, 0xd4, 0x76, 0x7c, 0x1c, + 0x2c, 0xab, 0xcc, 0x17, 0xbf, 0xf8, 0x38, 0x7b, 0xc6, 0xcb, 0xd4, 0xb5, + 0xbf, 0x91, 0x72, 0x59, 0xc7, 0xa5, 0xfc, 0x1a, 0xed, 0x19, 0xd7, 0xf1, + 0x97, 0x15, 0x57, 0xb0, 0x3e, 0x01, 0x7b, 0x4c, 0x1c, 0x00, 0xe3, 0x3a, + 0x8d, 0x75, 0x18, 0x19, 0x37, 0x71, 0x95, 0x19, 0x19, 0xa9, 0xf3, 0x95, + 0x71, 0x75, 0xba, 0xbe, 0x07, 0x3e, 0x32, 0xad, 0xd2, 0x5f, 0xaf, 0xab, + 0xb0, 0xc2, 0x3d, 0x70, 0xa9, 0x0e, 0xc7, 0xc4, 0x6f, 0xd2, 0xb2, 0x67, + 0x1c, 0xca, 0x23, 0x30, 0x31, 0x0e, 0xe3, 0xa9, 0x52, 0x00, 0x26, 0x60, + 0x22, 0x4e, 0x1e, 0xe3, 0xe3, 0x74, 0xa8, 0x4e, 0x3d, 0x2a, 0x93, 0x7a, + 0xc2, 0x4e, 0x47, 0x15, 0x95, 0xd9, 0xf8, 0x78, 0x3d, 0x72, 0xfb, 0x48, + 0x94, 0xdf, 0x32, 0x47, 0xa8, 0x63, 0x11, 0x97, 0x99, 0xd1, 0x07, 0xa6, + 0xe3, 0xfd, 0x5b, 0xde, 0x07, 0xf7, 0xea, 0x4e, 0xc8, 0xc2, 0x42, 0xef, + 0xfe, 0xc8, 0x4b, 0x91, 0x65, 0xc5, 0xcf, 0x85, 0x06, 0xa8, 0x25, 0xfa, + 0xac, 0x9e, 0x0b, 0xd9, 0x58, 0x96, 0x15, 0x2d, 0x28, 0x64, 0x16, 0x00, + 0x11, 0x05, 0xd1, 0x75, 0x31, 0x90, 0x0b, 0x49, 0x83, 0x6c, 0x4b, 0x84, + 0x50, 0x0f, 0xd6, 0xc9, 0xc5, 0x8b, 0x56, 0x92, 0x79, 0xaf, 0x60, 0xc6, + 0xa2, 0x2f, 0xf4, 0xbd, 0x45, 0x2a, 0xff, 0x1a, 0xa8, 0x25, 0xfa, 0x2c, + 0x64, 0x33, 0x24, 0x08, 0xea, 0x20, 0x20, 0x08, 0xd2, 0x8b, 0x9a, 0x44, + 0x0b, 0x1e, 0x0d, 0x54, 0xb1, 0x2d, 0x0b, 0xda, 0x45, 0x4c, 0x0f, 0xdc, + 0xb6, 0x54, 0x87, 0x22, 0x3c, 0xd7, 0xa0, 0xe4, 0x98, 0xc5, 0x44, 0x66, + 0x98, 0x3d, 0x5c, 0xa7, 0x3c, 0x50, 0xc6, 0x2d, 0x8f, 0x46, 0x61, 0x1d, + 0xfa, 0xda, 0x17, 0x28, 0x0f, 0x94, 0xa9, 0x2f, 0xd4, 0xa3, 0x6d, 0x16, + 0xa8, 0x75, 0xe8, 0x6b, 0x5f, 0xa0, 0x62, 0x95, 0x57, 0x2e, 0x87, 0x02, + 0xf8, 0x10, 0xc3, 0xb3, 0x40, 0x03, 0x62, 0xf4, 0x82, 0x50, 0xc4, 0x35, + 0xa5, 0x90, 0xa4, 0x60, 0x52, 0xa1, 0xe9, 0xcc, 0x15, 0x44, 0xdc, 0x5e, + 0x24, 0x20, 0x54, 0x00, 0x77, 0xb6, 0x35, 0x0c, 0xaa, 0x00, 0xae, 0x00, + 0x4f, 0xaa, 0x2d, 0x40, 0x2b, 0xf1, 0x5e, 0xc3, 0x2b, 0x08, 0x86, 0xda, + 0x2d, 0x40, 0x12, 0x34, 0x25, 0x26, 0xb7, 0xe1, 0xa2, 0x8f, 0x00, 0xdc, + 0xc7, 0xf6, 0x31, 0xf9, 0xd8, 0x3e, 0x6e, 0x04, 0xe4, 0xc1, 0x39, 0x2c, + 0xe0, 0xfa, 0x25, 0x3f, 0x02, 0x03, 0xa3, 0xfb, 0x7f, 0xd5, 0xc4, 0xb3, + 0x8b, 0x10, 0x50, 0x4d, 0x3c, 0xd7, 0x14, 0xfb, 0xf5, 0xa2, 0x31, 0x4b, + 0xad, 0xd4, 0x71, 0x45, 0x2a, 0x20, 0x96, 0x69, 0x0f, 0x66, 0x24, 0x0c, + 0xf7, 0xe9, 0xe3, 0x82, 0xda, 0x56, 0xda, 0xe0, 0x21, 0x00, 0x81, 0xd7, + 0x96, 0x38, 0x02, 0x7c, 0x09, 0x8e, 0x72, 0xc2, 0x8c, 0x64, 0xcc, 0x16, + 0xa0, 0xd2, 0x86, 0x5a, 0x01, 0xe6, 0x81, 0x4f, 0xb5, 0xe1, 0x16, 0x24, + 0xb4, 0x05, 0x63, 0xc4, 0x76, 0x83, 0x7a, 0x3b, 0x07, 0x3c, 0x80, 0xe4, + 0x16, 0x03, 0xde, 0x2c, 0xa8, 0xae, 0xe5, 0x0d, 0xcd, 0x16, 0xc9, 0x11, + 0x9e, 0x03, 0x12, 0xee, 0x15, 0xf0, 0x49, 0xe0, 0x78, 0x1b, 0x8e, 0x6b, + 0xf7, 0xd5, 0x8e, 0xde, 0x6d, 0xde, 0x76, 0x19, 0x9b, 0x81, 0x13, 0xc7, + 0x8e, 0x46, 0x80, 0xa9, 0x8b, 0x2f, 0xbe, 0x98, 0x33, 0x67, 0xce, 0xc4, + 0x5f, 0x16, 0x66, 0xb6, 0x17, 0xbf, 0xe5, 0x62, 0x4e, 0x1c, 0x3b, 0xca, + 0xd6, 0x6d, 0x97, 0x31, 0x35, 0x35, 0xc5, 0xd6, 0x51, 0x05, 0x95, 0xe2, + 0x79, 0x05, 0xb7, 0x2a, 0x15, 0x36, 0xa5, 0xec, 0x4f, 0xfe, 0xf5, 0x49, + 0x40, 0x3d, 0x6f, 0x8c, 0x8e, 0x6e, 0xe7, 0xc4, 0xb1, 0xa3, 0x09, 0x10, + 0x14, 0x9c, 0x7d, 0x7c, 0x81, 0xcd, 0xdb, 0x2e, 0xa3, 0xef, 0xf5, 0x3f, + 0xc6, 0xd8, 0x5b, 0x55, 0xd8, 0x9b, 0xb7, 0x5d, 0x16, 0xa5, 0xe9, 0xad, + 0x7f, 0x77, 0x96, 0x37, 0x04, 0x76, 0x04, 0xa1, 0x3a, 0x39, 0x75, 0x92, + 0x4d, 0x9b, 0xde, 0x06, 0x05, 0x95, 0xd6, 0xa9, 0x93, 0x53, 0x6c, 0xda, + 0xb4, 0x29, 0xb2, 0x5f, 0xf7, 0x86, 0x35, 0x9c, 0x38, 0x76, 0x94, 0x75, + 0x6f, 0x58, 0x13, 0xe5, 0xf3, 0xec, 0xf3, 0xe7, 0x59, 0xf7, 0x86, 0x35, + 0x11, 0x50, 0xcb, 0x40, 0xaa, 0x78, 0x3e, 0x86, 0x65, 0xad, 0x7b, 0xc3, + 0x9a, 0x08, 0x58, 0xc5, 0xf3, 0x27, 0x97, 0x0d, 0x73, 0x8d, 0xb3, 0x0e, + 0xce, 0x9f, 0xe4, 0xec, 0xf3, 0xe7, 0x59, 0x93, 0x81, 0x74, 0x19, 0x00, + 0x57, 0x32, 0x2e, 0x20, 0x02, 0x67, 0xa1, 0xcb, 0xdb, 0x84, 0x69, 0xc2, + 0x3f, 0x7b, 0xfe, 0x3c, 0xe8, 0xb2, 0x31, 0xe7, 0xcc, 0x35, 0x32, 0x30, + 0x2f, 0x03, 0xd3, 0x4a, 0xc2, 0xd0, 0x4c, 0x39, 0xbe, 0x64, 0x69, 0x58, + 0x9d, 0x77, 0xba, 0xa8, 0xaf, 0x59, 0x0b, 0xf1, 0x5a, 0x11, 0xb9, 0x39, + 0x03, 0xaa, 0x5f, 0x3e, 0x79, 0x4e, 0xf5, 0x37, 0xaa, 0x97, 0x55, 0xd9, + 0xbe, 0x05, 0xec, 0x05, 0x3d, 0x86, 0xa7, 0xdf, 0x11, 0x3b, 0xfd, 0x16, + 0xf4, 0x6f, 0x87, 0x45, 0x0f, 0xa1, 0x21, 0xe7, 0x96, 0x55, 0x62, 0xf4, + 0x9a, 0x61, 0xcc, 0x03, 0xde, 0x50, 0xc9, 0xd5, 0xd0, 0x41, 0x89, 0xd0, + 0xdf, 0x35, 0x8c, 0x55, 0x1c, 0x84, 0xa5, 0xec, 0x4b, 0x7a, 0x91, 0x24, + 0x67, 0xc0, 0xc1, 0x19, 0x70, 0x90, 0x80, 0x5b, 0xf0, 0x99, 0x6d, 0x86, + 0x58, 0x08, 0x6c, 0xcb, 0xc6, 0x0f, 0x55, 0x7d, 0x60, 0x59, 0x0e, 0x61, + 0x19, 0x86, 0xcb, 0xca, 0xae, 0xf5, 0x5a, 0x1d, 0x27, 0x02, 0x67, 0xc0, + 0x41, 0xd4, 0x7d, 0x10, 0x10, 0x2e, 0x09, 0xac, 0x7e, 0xf5, 0x2e, 0x5b, + 0x08, 0xf5, 0xbd, 0x83, 0x28, 0x08, 0x4a, 0xed, 0x16, 0x9e, 0x00, 0xff, + 0x84, 0x8f, 0x5c, 0x92, 0x94, 0x9a, 0x0d, 0xec, 0x4b, 0xe3, 0xfa, 0x34, + 0x09, 0xd4, 0xa2, 0x05, 0x14, 0x41, 0x9e, 0x0f, 0x11, 0x6b, 0x2c, 0x58, + 0x23, 0xa3, 0x41, 0x92, 0xa8, 0x1f, 0xa8, 0x6d, 0xa2, 0x2d, 0x6a, 0x0d, + 0x82, 0x86, 0x4c, 0xb7, 0x21, 0xb2, 0x15, 0xe2, 0xac, 0x77, 0x98, 0x3c, + 0x38, 0x89, 0xbb, 0xb1, 0x82, 0x6c, 0x85, 0x94, 0xd7, 0x58, 0xd4, 0x12, + 0xed, 0x53, 0xe0, 0x05, 0x88, 0xb5, 0xe6, 0xd9, 0xd5, 0xa6, 0xa8, 0x2b, + 0x5c, 0x59, 0xb0, 0xe1, 0x02, 0xde, 0x65, 0xf7, 0x02, 0x57, 0x2d, 0x77, + 0x7e, 0x25, 0x3f, 0x2f, 0x37, 0xac, 0x97, 0x1a, 0xfe, 0x0f, 0x4b, 0xd5, + 0x7f, 0xfe, 0xae, 0x55, 0xc3, 0xb8, 0x56, 0x02, 0x74, 0x65, 0xb5, 0xf3, + 0xc8, 0x67, 0xe0, 0xfb, 0xdf, 0x66, 0x64, 0xba, 0x0c, 0xe5, 0x6f, 0x33, + 0x5d, 0xfe, 0x0c, 0x3b, 0xcd, 0xc9, 0xef, 0x7f, 0x3b, 0xea, 0x87, 0x4e, + 0x4f, 0x3c, 0xc4, 0xc8, 0x38, 0x8c, 0xd7, 0x47, 0x5e, 0x62, 0x2e, 0x72, + 0xe5, 0xca, 0x95, 0x2b, 0x57, 0xae, 0x5c, 0xb9, 0x72, 0xe5, 0xca, 0x95, + 0x2b, 0x57, 0xae, 0x5c, 0xb9, 0x72, 0xe5, 0xca, 0x95, 0x2b, 0x57, 0xae, + 0x5c, 0xb9, 0x72, 0xe5, 0xca, 0x95, 0x2b, 0x17, 0xe4, 0x50, 0xad, 0x5c, + 0xb9, 0x72, 0xe5, 0xca, 0x95, 0xeb, 0x47, 0x42, 0x42, 0x28, 0x38, 0x93, + 0x3b, 0xa0, 0x3e, 0x10, 0x34, 0x9f, 0xd4, 0x85, 0x4d, 0x89, 0xa3, 0x3f, + 0x36, 0x94, 0x7a, 0x02, 0xa3, 0xbd, 0x79, 0x88, 0x86, 0x0c, 0xd5, 0xc7, + 0xd4, 0x80, 0xdf, 0x0c, 0x23, 0xb0, 0x96, 0xfa, 0x68, 0x4f, 0xc6, 0x1f, + 0x24, 0x17, 0x44, 0x7a, 0x62, 0x63, 0xbf, 0x0b, 0x4b, 0x1e, 0x56, 0xbf, + 0x4d, 0x43, 0x86, 0x54, 0x06, 0xaa, 0x51, 0x6f, 0xa0, 0x76, 0x62, 0x1e, + 0xf3, 0xe1, 0xa1, 0x5b, 0x76, 0xe1, 0x05, 0x89, 0xe3, 0x24, 0x27, 0x28, + 0x49, 0x2c, 0xcb, 0xa6, 0xd1, 0xf0, 0xb0, 0xfa, 0x4b, 0xd8, 0x6b, 0x04, + 0x25, 0x9d, 0xb6, 0x6c, 0x8f, 0xc2, 0xf3, 0xea, 0x88, 0xbe, 0x12, 0x43, + 0xdb, 0x86, 0x08, 0x96, 0x2a, 0xd4, 0x8e, 0x1c, 0x60, 0xec, 0x43, 0xb7, + 0x11, 0x04, 0x01, 0xa5, 0x52, 0x02, 0xae, 0x04, 0x04, 0x1a, 0x7e, 0x65, + 0x40, 0x36, 0x61, 0x43, 0x7f, 0x58, 0xbf, 0xbe, 0xa2, 0xa0, 0x5c, 0x40, + 0x29, 0x6c, 0xe0, 0xba, 0x15, 0x8a, 0x7d, 0x45, 0xca, 0xfd, 0x25, 0xea, + 0x4b, 0x01, 0xc7, 0x9f, 0xd5, 0x9f, 0x0a, 0xf7, 0x95, 0xb8, 0x64, 0xeb, + 0x20, 0xb2, 0x0d, 0xe5, 0xfe, 0x52, 0x04, 0x6c, 0x2a, 0xf5, 0x97, 0xf0, + 0xea, 0x1e, 0x43, 0x43, 0xdb, 0x99, 0x9d, 0x3d, 0xc4, 0xf5, 0x1f, 0x4a, + 0x7f, 0x2c, 0x1e, 0x04, 0x01, 0x8e, 0xa3, 0xca, 0xbb, 0x75, 0x5e, 0x7d, + 0x0c, 0x69, 0x5d, 0x3a, 0x4a, 0xb0, 0x14, 0xaa, 0x49, 0xa5, 0x8e, 0x4b, + 0xb0, 0xe8, 0x51, 0x2a, 0x39, 0xb8, 0xae, 0xcb, 0xec, 0xfa, 0x4a, 0x04, + 0xf0, 0x8a, 0xae, 0x9b, 0x06, 0x70, 0xa5, 0xc2, 0x65, 0x05, 0x9d, 0xcb, + 0x4c, 0x33, 0xda, 0xaa, 0x21, 0x5b, 0xeb, 0x05, 0xd8, 0x45, 0xb5, 0x5f, + 0x40, 0x6d, 0x37, 0xd8, 0x0a, 0xbe, 0x65, 0x20, 0x5c, 0xae, 0xb6, 0xad, + 0x64, 0xfc, 0xcc, 0x36, 0x52, 0x40, 0xad, 0x50, 0x43, 0xa3, 0x8a, 0x10, + 0x4d, 0x2c, 0x33, 0x20, 0xad, 0xae, 0x40, 0x2d, 0xa9, 0xa0, 0x51, 0x8d, + 0x50, 0xf6, 0x9c, 0xe9, 0xec, 0xae, 0x2f, 0xe1, 0x2f, 0x75, 0x4e, 0x32, + 0x88, 0x80, 0x5a, 0x19, 0xd9, 0xba, 0x5c, 0x0c, 0x20, 0x2b, 0xa9, 0x68, + 0x85, 0xe9, 0x42, 0xe7, 0x14, 0xec, 0x30, 0x8c, 0x3f, 0x00, 0xcd, 0xfa, + 0x4b, 0xa9, 0x57, 0x2f, 0xb6, 0x2d, 0x96, 0x9d, 0xbc, 0x64, 0xf7, 0x5b, + 0x31, 0xc4, 0x4b, 0xaf, 0x9c, 0xed, 0x0e, 0x94, 0xe2, 0x6d, 0x94, 0x22, + 0xb3, 0xa2, 0xb6, 0xc0, 0xe9, 0x17, 0x09, 0xf0, 0xd7, 0xea, 0x25, 0xc4, + 0x72, 0x93, 0x8e, 0x0c, 0x3c, 0xaa, 0xa4, 0x01, 0x41, 0xcb, 0x23, 0xba, + 0x8c, 0xcd, 0x72, 0x79, 0x0b, 0x9b, 0x01, 0x56, 0x5f, 0xf7, 0x70, 0xba, + 0xb9, 0x97, 0xfa, 0x4b, 0xd4, 0xcd, 0x4c, 0x9b, 0x84, 0x82, 0x66, 0x90, + 0x9a, 0x44, 0x95, 0x04, 0x65, 0x25, 0x57, 0x49, 0xef, 0xa5, 0x0b, 0x9d, + 0x58, 0x62, 0xc2, 0x37, 0x5b, 0xa3, 0x6c, 0x1c, 0x29, 0x28, 0xd6, 0x0a, + 0xab, 0xc1, 0x67, 0x27, 0x74, 0xf7, 0x02, 0x6a, 0xad, 0x94, 0x26, 0xd9, + 0x5a, 0xdd, 0x94, 0xfe, 0x08, 0x5c, 0x98, 0xd9, 0x37, 0x32, 0xa0, 0x2d, + 0xdb, 0xb2, 0xa3, 0xf3, 0xfe, 0xa2, 0x8f, 0x10, 0x22, 0x05, 0xd7, 0x8a, + 0xec, 0xb5, 0x5b, 0x16, 0xbc, 0x95, 0x75, 0xcb, 0xda, 0x1b, 0x70, 0x56, + 0x16, 0xac, 0xd5, 0xed, 0x38, 0xb9, 0x35, 0x32, 0x00, 0x2e, 0x03, 0xc8, + 0x0a, 0x97, 0xc2, 0x14, 0xe8, 0x2a, 0x09, 0xb9, 0x4a, 0x1e, 0x27, 0xed, + 0x93, 0xe7, 0xb2, 0x40, 0xae, 0x5e, 0xe1, 0x18, 0xb7, 0xec, 0xb9, 0x2c, + 0xb4, 0xcb, 0xc8, 0x80, 0xb0, 0x0c, 0x28, 0x2b, 0xbb, 0x9f, 0x94, 0x39, + 0x67, 0xdc, 0x93, 0xfb, 0xa6, 0xed, 0x5d, 0xe9, 0xf7, 0x94, 0xd4, 0xd8, + 0xc6, 0x8d, 0x0c, 0xec, 0xd8, 0x01, 0xc0, 0xc1, 0x7b, 0xee, 0x61, 0xc7, + 0xad, 0xb7, 0xae, 0xda, 0x6f, 0x2f, 0x0d, 0x64, 0xb6, 0x00, 0xef, 0x5b, + 0xe6, 0xdc, 0x2b, 0xad, 0x1d, 0x3a, 0x3f, 0x2b, 0xe9, 0xd4, 0xc2, 0x02, + 0x17, 0x1d, 0x3c, 0x18, 0x1d, 0xbf, 0xb8, 0x63, 0xc7, 0x8a, 0x60, 0xb1, + 0x1f, 0x69, 0x3d, 0xf6, 0xe0, 0xaa, 0xcc, 0xf6, 0x5e, 0xf5, 0x00, 0x0f, + 0x54, 0x5b, 0x70, 0xe0, 0xf1, 0xa8, 0x6e, 0xd8, 0x35, 0xdb, 0x39, 0x51, + 0x36, 0x09, 0xa6, 0x82, 0x34, 0x28, 0x2a, 0xb2, 0xd1, 0x30, 0xad, 0xdd, + 0x1f, 0xbe, 0x5e, 0x39, 0xb4, 0x81, 0x14, 0xda, 0x2e, 0x39, 0xad, 0xd8, + 0xe5, 0x46, 0xcd, 0x3b, 0x2b, 0xb6, 0x61, 0x57, 0x34, 0xb9, 0x2b, 0xb6, + 0xde, 0xb9, 0x19, 0xec, 0x35, 0x9d, 0x75, 0xae, 0xd4, 0xf6, 0x01, 0xb0, + 0xeb, 0x9a, 0xb8, 0x2f, 0xd7, 0x7a, 0x41, 0xd9, 0xdf, 0x48, 0x72, 0x4a, + 0x30, 0xec, 0xda, 0xe0, 0x26, 0x20, 0x55, 0xb2, 0xc3, 0x3e, 0xab, 0xa0, + 0x6d, 0xd2, 0xee, 0xb2, 0x6b, 0x43, 0x22, 0x3d, 0x97, 0xc6, 0xf6, 0x21, + 0xb0, 0xfb, 0xc3, 0x6e, 0x94, 0x1e, 0xda, 0xa6, 0x8f, 0x24, 0x01, 0x87, + 0x5d, 0x1b, 0xd2, 0xe9, 0x49, 0xe6, 0x5f, 0xb6, 0x61, 0xd4, 0xd4, 0xd5, + 0x6e, 0xdc, 0x36, 0xb4, 0xd6, 0x0f, 0x52, 0x7c, 0x2d, 0xcc, 0xcc, 0x1f, + 0xa7, 0xa7, 0x32, 0x75, 0xfc, 0xab, 0x8a, 0xd6, 0x7a, 0xaf, 0xce, 0xd9, + 0xcc, 0x7e, 0x78, 0x52, 0x4d, 0x76, 0xe2, 0x67, 0xde, 0x0f, 0x73, 0xe0, + 0x5e, 0x65, 0xe1, 0x3d, 0x19, 0xe2, 0x5e, 0x65, 0x80, 0x81, 0x31, 0x68, + 0xcb, 0x7f, 0x3a, 0x24, 0x9e, 0x6e, 0xfc, 0xea, 0x28, 0x38, 0xb2, 0x2f, + 0x3e, 0x78, 0x93, 0x9e, 0xc2, 0xf7, 0x77, 0x73, 0x8a, 0xea, 0x74, 0xb9, + 0x03, 0x47, 0x7c, 0x6e, 0x7a, 0xb3, 0x06, 0x6b, 0x15, 0x80, 0x04, 0xac, + 0x82, 0xf7, 0x8c, 0xc1, 0xc3, 0x69, 0x68, 0xd3, 0x8f, 0xb6, 0x54, 0x9b, + 0x2a, 0xdb, 0xad, 0x55, 0xc3, 0x85, 0x00, 0x44, 0xdd, 0x43, 0x96, 0x5d, + 0xc4, 0x82, 0x17, 0xc1, 0x72, 0xfd, 0x05, 0x70, 0x06, 0x92, 0xfb, 0xaa, + 0x5f, 0xeb, 0xd7, 0xc1, 0x29, 0x6b, 0x8f, 0xed, 0xf9, 0x08, 0x5e, 0xd5, + 0x6b, 0xdf, 0x0b, 0x89, 0x00, 0x56, 0x66, 0x6b, 0xdc, 0x24, 0x12, 0x59, + 0xaf, 0xc1, 0x7a, 0x4d, 0xe6, 0x58, 0xf4, 0xa2, 0x7d, 0xe3, 0x1e, 0x9e, + 0x02, 0x6b, 0x23, 0x84, 0xa7, 0x94, 0x89, 0xb5, 0x51, 0x26, 0xf6, 0xcd, + 0x3d, 0xa9, 0xe3, 0x6b, 0xeb, 0xba, 0x2b, 0xb9, 0x9f, 0x88, 0xcf, 0x4b, + 0x40, 0xbd, 0x92, 0xfb, 0x00, 0x2c, 0x78, 0x30, 0xe0, 0xc2, 0x82, 0x47, + 0xab, 0xac, 0xd3, 0x53, 0xaf, 0xc1, 0xfa, 0x4e, 0x20, 0xb2, 0xbf, 0x40, + 0x04, 0xd4, 0xb2, 0xcb, 0x5d, 0xee, 0xcc, 0x76, 0x0d, 0xf9, 0x82, 0x9b, + 0x2e, 0x13, 0x23, 0xd9, 0xa2, 0x1e, 0x6a, 0x98, 0x16, 0xa8, 0xfd, 0xce, + 0x10, 0x96, 0xd5, 0x59, 0xe0, 0xad, 0x26, 0xb8, 0xcc, 0x31, 0x74, 0x07, + 0x43, 0x9d, 0x05, 0xd6, 0x25, 0x8e, 0x9f, 0xcb, 0x1c, 0x77, 0xd3, 0x73, + 0x99, 0x70, 0x57, 0x9b, 0x36, 0x12, 0x61, 0x67, 0xe3, 0xed, 0xe5, 0xe7, + 0xad, 0xc4, 0xe9, 0x4d, 0xa6, 0x2d, 0x9b, 0x97, 0x6c, 0x78, 0xd9, 0xbc, + 0x77, 0xd3, 0x0f, 0x3b, 0x1f, 0xb0, 0xfc, 0x75, 0x59, 0x56, 0x05, 0x89, + 0x53, 0x75, 0xf1, 0xe7, 0x3d, 0x2e, 0xb9, 0x4c, 0xfd, 0x0e, 0x0d, 0x44, + 0x39, 0x5c, 0xa8, 0xb1, 0x7b, 0xaf, 0x9a, 0x92, 0x76, 0xe8, 0x49, 0x10, + 0x1b, 0xa0, 0x72, 0x79, 0x8b, 0xda, 0x09, 0x98, 0x3f, 0x5c, 0x64, 0xf7, + 0x47, 0x07, 0xb9, 0xfd, 0xe3, 0xea, 0x19, 0xdf, 0xf7, 0x7d, 0x1c, 0xcb, + 0x81, 0x82, 0xf2, 0x3b, 0xf6, 0x61, 0x97, 0xf9, 0x27, 0xc0, 0xa9, 0xaa, + 0x67, 0x8f, 0xd0, 0x8f, 0xfb, 0xcd, 0x9f, 0xfa, 0x3f, 0xab, 0x4c, 0x1e, + 0x04, 0xd6, 0x4b, 0x86, 0xaf, 0x11, 0xcc, 0x1c, 0x05, 0x16, 0x25, 0x77, + 0xfe, 0xc9, 0xcd, 0x0a, 0xac, 0xf5, 0xbe, 0xed, 0x0a, 0xac, 0x55, 0x1a, + 0x8c, 0xfc, 0xd4, 0xbd, 0x39, 0xae, 0xff, 0xd5, 0x41, 0x66, 0x1e, 0x81, + 0x03, 0x9f, 0xf7, 0x29, 0x6d, 0x71, 0x22, 0xc8, 0x96, 0xff, 0xcc, 0x3c, + 0x43, 0x1f, 0x1a, 0x66, 0xe6, 0x61, 0x09, 0x65, 0x18, 0xfe, 0x90, 0x50, + 0xc0, 0xad, 0x32, 0xdc, 0xf5, 0xf5, 0xdb, 0xf8, 0xe4, 0xbb, 0xf6, 0x72, + 0xd7, 0xef, 0x0e, 0xb3, 0xff, 0x41, 0x05, 0xe6, 0x2a, 0xf5, 0xc7, 0x7e, + 0xab, 0xd5, 0x41, 0x82, 0x25, 0x9f, 0x56, 0x5b, 0x12, 0x2c, 0xfa, 0xb0, + 0x08, 0xde, 0x91, 0x59, 0xaa, 0xd7, 0xec, 0x8e, 0xa0, 0x5d, 0xc3, 0x1f, + 0x12, 0x6a, 0x02, 0xb9, 0x96, 0xb7, 0xe8, 0x60, 0x37, 0x55, 0xff, 0xc3, + 0x3b, 0x0d, 0xc3, 0x7a, 0xce, 0x9f, 0xe7, 0x81, 0x93, 0x98, 0xff, 0x67, + 0x20, 0x5a, 0x41, 0x21, 0x86, 0x67, 0x1d, 0x98, 0x87, 0xc1, 0x6a, 0x7c, + 0x0f, 0x9a, 0x67, 0xab, 0x00, 0x05, 0x58, 0x9a, 0xf7, 0xc1, 0xe9, 0x4f, + 0xc4, 0x15, 0x48, 0xaa, 0x89, 0x63, 0xf3, 0x7c, 0x35, 0xb6, 0x45, 0x1f, + 0x4b, 0xf9, 0xea, 0xb6, 0xd5, 0x3f, 0x82, 0x7a, 0x1f, 0xaf, 0x1c, 0xc8, + 0xa2, 0x8c, 0xe2, 0x2a, 0xfd, 0xdb, 0x84, 0xdb, 0x04, 0x0a, 0xd0, 0xf5, + 0x35, 0xe0, 0xdc, 0xcb, 0x0c, 0x3f, 0x8b, 0x41, 0xfb, 0xdb, 0xae, 0x56, + 0xf1, 0xb9, 0x8b, 0xe9, 0x0d, 0xf3, 0x4a, 0x6a, 0xd7, 0x35, 0x55, 0xc0, + 0x65, 0xb8, 0xa4, 0xee, 0x69, 0x1f, 0xf0, 0x02, 0x0f, 0x51, 0xab, 0x31, + 0xb6, 0x7d, 0x8c, 0x10, 0x18, 0xd6, 0x7f, 0x00, 0x16, 0xaa, 0x0f, 0x69, + 0xec, 0x01, 0x70, 0x15, 0xac, 0xaa, 0x52, 0x72, 0x09, 0xb5, 0x0d, 0x40, + 0x2d, 0x00, 0x07, 0x0f, 0x5f, 0x9b, 0x3a, 0xda, 0x8f, 0x04, 0x2a, 0x81, + 0xc7, 0xe8, 0x90, 0xf6, 0xdc, 0x25, 0x7c, 0x09, 0x8c, 0xe9, 0x7d, 0xbf, + 0xa8, 0x61, 0x7e, 0x25, 0x37, 0xb2, 0xf3, 0xb5, 0xcd, 0x4e, 0x20, 0x0c, + 0x14, 0x78, 0x73, 0xa7, 0xf1, 0xfb, 0x21, 0xd5, 0xe3, 0x70, 0x12, 0x79, + 0x8a, 0x80, 0x58, 0xda, 0xdd, 0xc4, 0x03, 0x40, 0xe0, 0x21, 0x13, 0x61, + 0xcb, 0x84, 0x6d, 0x57, 0xf4, 0xea, 0xaf, 0x1f, 0x88, 0xe0, 0x56, 0x66, + 0xdb, 0x0b, 0x9e, 0x95, 0x85, 0x66, 0x75, 0xb8, 0x1f, 0x26, 0x95, 0x96, + 0x9e, 0x10, 0xad, 0x2e, 0xaa, 0xff, 0x22, 0x94, 0xaf, 0x56, 0xfb, 0xe5, + 0xee, 0x26, 0x29, 0xb5, 0x32, 0xcf, 0x54, 0xcb, 0x41, 0xb6, 0xcc, 0xb8, + 0x38, 0x28, 0xd8, 0x56, 0x87, 0x12, 0x60, 0x2d, 0x20, 0x02, 0x4f, 0x65, + 0x35, 0x38, 0x60, 0xf1, 0x1b, 0xd7, 0xbf, 0x9b, 0xc1, 0x01, 0x2b, 0x82, + 0x67, 0x19, 0xa0, 0x56, 0xb7, 0xfa, 0x68, 0x58, 0xc3, 0xb9, 0x66, 0x16, + 0x42, 0xc6, 0xae, 0x74, 0x52, 0xa0, 0xad, 0x07, 0x0e, 0xfc, 0x05, 0x37, + 0xed, 0x7c, 0x47, 0xcf, 0x7a, 0xcc, 0xb8, 0x0f, 0x2f, 0xc0, 0xdc, 0x42, + 0xc8, 0x7c, 0x32, 0x7f, 0x3a, 0xbd, 0xf3, 0x47, 0x5b, 0x29, 0xb0, 0x16, + 0x28, 0xb8, 0x16, 0x40, 0xf5, 0xb2, 0x22, 0xfe, 0xa1, 0xeb, 0x71, 0xfa, + 0x2b, 0xf8, 0x4b, 0x35, 0x6a, 0x0b, 0x50, 0x23, 0xbd, 0x40, 0x84, 0x77, + 0x4d, 0x11, 0x14, 0x63, 0x81, 0xfd, 0x8f, 0x4d, 0x45, 0xee, 0xfe, 0xa2, + 0x0b, 0xcd, 0x44, 0x9f, 0xbc, 0x6f, 0x10, 0xab, 0x1f, 0xbc, 0x13, 0x35, + 0x44, 0x01, 0x1e, 0x7a, 0x4c, 0xb5, 0x7f, 0x07, 0x8e, 0xd5, 0xb0, 0xb6, + 0x3d, 0xca, 0xa8, 0xbb, 0x9f, 0xda, 0x89, 0x29, 0xd4, 0xef, 0xdf, 0x43, + 0xb4, 0xa1, 0xb1, 0xe4, 0xe2, 0x86, 0x77, 0x31, 0x7f, 0xa5, 0x80, 0x87, + 0xf5, 0x78, 0xe0, 0xcf, 0x5a, 0x78, 0x7f, 0x10, 0x60, 0xee, 0x9c, 0x46, + 0xa3, 0xc6, 0xd4, 0xd1, 0x1a, 0x99, 0xde, 0x5b, 0x87, 0x92, 0x6d, 0xa2, + 0x51, 0xb0, 0x14, 0x52, 0x2a, 0xc5, 0xa0, 0x56, 0x6b, 0xbd, 0x9b, 0xb1, + 0x10, 0x08, 0x59, 0xc4, 0x2d, 0x25, 0xc6, 0xf4, 0x33, 0xbf, 0x19, 0xbb, + 0x7f, 0x7b, 0xbc, 0x1f, 0x4f, 0x43, 0x4f, 0xa9, 0x62, 0xed, 0x04, 0x5a, + 0x38, 0xa5, 0x32, 0x50, 0xa4, 0x62, 0xdd, 0x06, 0x80, 0x43, 0x85, 0xda, + 0xe2, 0x7e, 0x2c, 0x31, 0x48, 0x28, 0x3d, 0x9c, 0xd2, 0x18, 0x96, 0x3c, + 0x40, 0x28, 0x27, 0x29, 0x5b, 0xd7, 0xb3, 0xef, 0x6b, 0x9f, 0x06, 0x60, + 0x72, 0xe1, 0x26, 0x2c, 0x31, 0x86, 0xab, 0xfb, 0xb8, 0xa2, 0x20, 0xa2, + 0xb1, 0x6d, 0x4b, 0x08, 0xbd, 0x55, 0x71, 0xc9, 0x36, 0x84, 0x2b, 0x34, + 0x6c, 0x49, 0x30, 0x56, 0x07, 0x24, 0x0b, 0x90, 0x61, 0x0b, 0x61, 0x15, + 0x13, 0xf6, 0xbe, 0x02, 0x45, 0x84, 0x6a, 0x9b, 0x05, 0x69, 0x65, 0x01, + 0x5a, 0xe6, 0xd8, 0xd8, 0x47, 0xfe, 0x30, 0xfe, 0xe8, 0x00, 0x65, 0x65, + 0xe1, 0x59, 0xe6, 0xd8, 0xb2, 0xac, 0xd4, 0xb9, 0xd5, 0xb6, 0xd9, 0xe5, + 0xcc, 0x71, 0x3d, 0xb3, 0x2d, 0xeb, 0xfd, 0x71, 0x4d, 0xbb, 0x32, 0xd0, + 0x00, 0xb3, 0x5f, 0xa7, 0x1e, 0xc1, 0xa5, 0x0c, 0x14, 0xab, 0x5e, 0x87, + 0x91, 0x72, 0x0c, 0x86, 0x32, 0x43, 0xda, 0xf5, 0x11, 0x28, 0x97, 0x15, + 0x74, 0x2a, 0x46, 0x4e, 0xc1, 0x74, 0xbd, 0xce, 0x48, 0x36, 0x21, 0x18, + 0xa0, 0x97, 0xb2, 0x35, 0xf6, 0x66, 0x5b, 0xd6, 0x29, 0x37, 0x60, 0x2c, + 0xe3, 0x7d, 0x7c, 0x5c, 0x9d, 0x1b, 0x01, 0xa6, 0xb5, 0xdb, 0x9e, 0x44, + 0x9a, 0x81, 0x08, 0xfa, 0x95, 0x04, 0x78, 0x25, 0xd3, 0x54, 0x9f, 0xd6, + 0xe1, 0x8d, 0xab, 0xb4, 0xee, 0x99, 0x50, 0xe1, 0xee, 0x99, 0x4e, 0x05, + 0xc3, 0x9e, 0x69, 0x05, 0xe0, 0x8a, 0xc3, 0x00, 0x8d, 0xfb, 0x8a, 0x81, + 0x5a, 0x23, 0x3a, 0x6c, 0x1d, 0x97, 0x81, 0x93, 0xa5, 0xca, 0x60, 0xbc, + 0x0c, 0x13, 0xf5, 0x54, 0x7e, 0x3f, 0x30, 0x0d, 0xb7, 0xe8, 0xe7, 0xd5, + 0xc3, 0xb7, 0x97, 0x99, 0x1e, 0xa9, 0x73, 0xfb, 0x11, 0x05, 0xd3, 0x5a, + 0xd0, 0x9d, 0x8f, 0x57, 0xb2, 0x1f, 0x62, 0x24, 0x65, 0xd8, 0xb9, 0x50, + 0x47, 0x17, 0x98, 0x95, 0x01, 0x4d, 0x99, 0xa7, 0x00, 0x29, 0x43, 0x75, + 0xbf, 0xe9, 0x77, 0x12, 0x56, 0x9f, 0x5a, 0x4e, 0xc1, 0xea, 0xb3, 0x22, + 0xb8, 0x55, 0xd8, 0x0c, 0x23, 0xc0, 0x13, 0xa8, 0xbe, 0x69, 0xf6, 0x9d, + 0xa8, 0x39, 0xaf, 0xfc, 0xc5, 0xe1, 0x87, 0xcd, 0x30, 0x1e, 0x43, 0xd2, + 0xef, 0x89, 0xba, 0x29, 0xb9, 0xa0, 0x48, 0xd2, 0x6d, 0xb5, 0xe3, 0xc9, + 0x2b, 0xe6, 0x5f, 0xd3, 0x87, 0x45, 0x41, 0xe5, 0x3f, 0x86, 0x78, 0x59, + 0x14, 0x0b, 0x26, 0xee, 0x06, 0x8d, 0xd0, 0xc7, 0x2d, 0x5f, 0x82, 0xa5, + 0xdf, 0x05, 0x37, 0x9a, 0x01, 0x8d, 0x53, 0x21, 0xb3, 0x87, 0x63, 0x2c, + 0x7d, 0x7d, 0xa1, 0x4e, 0x7d, 0x21, 0xbd, 0x38, 0x50, 0x7d, 0xa1, 0x9e, + 0xda, 0x1e, 0xfa, 0x5a, 0xe7, 0xe2, 0x41, 0x17, 0xa4, 0xb6, 0x7e, 0x06, + 0x28, 0xe8, 0xb2, 0x6d, 0x4a, 0xe8, 0x03, 0x59, 0x10, 0x54, 0xdb, 0x92, + 0x59, 0x80, 0x3e, 0xa1, 0xc6, 0x8f, 0x50, 0xd0, 0x2c, 0x29, 0x12, 0xcf, + 0x76, 0x6d, 0xa9, 0xca, 0xbb, 0xa0, 0xc3, 0x2a, 0xc4, 0xe1, 0xfa, 0x28, + 0x60, 0xa4, 0x27, 0x15, 0x52, 0x71, 0xae, 0x09, 0x92, 0x16, 0x08, 0x18, + 0xd5, 0x45, 0x18, 0xa0, 0x9e, 0x4f, 0xcc, 0x7b, 0x60, 0x80, 0x52, 0x41, + 0x8f, 0x55, 0x6a, 0xb5, 0x0a, 0x6a, 0x2c, 0xb5, 0xa4, 0xc3, 0xf6, 0xda, + 0xca, 0x0f, 0x6d, 0xf0, 0x84, 0xc4, 0x2c, 0x71, 0xe5, 0xa1, 0xec, 0x90, + 0xd0, 0x10, 0xe0, 0x68, 0xd0, 0x55, 0xb8, 0xd4, 0xa2, 0x56, 0x20, 0x6e, + 0x73, 0xc2, 0x16, 0x88, 0x22, 0x1e, 0x0a, 0x90, 0x95, 0xd4, 0xa3, 0x4d, + 0x18, 0xd4, 0x76, 0x3e, 0xf0, 0xa8, 0x00, 0x47, 0xff, 0x96, 0x5c, 0x21, + 0xf0, 0xdb, 0x12, 0x0f, 0x98, 0x69, 0xaa, 0xf0, 0x8d, 0x77, 0xb7, 0x00, + 0x53, 0x6d, 0xf0, 0x13, 0xe9, 0xbe, 0x44, 0xc2, 0x71, 0xa1, 0xe0, 0x62, + 0xc6, 0x2e, 0x39, 0xba, 0x76, 0x0b, 0x70, 0x57, 0x5b, 0x72, 0x53, 0x5b, + 0x2f, 0x26, 0x93, 0x38, 0x3f, 0xa8, 0xc3, 0xae, 0xa0, 0x80, 0x5a, 0x76, + 0x01, 0xee, 0x68, 0xab, 0x1f, 0xd7, 0x2d, 0xa8, 0x7e, 0x64, 0xad, 0xb0, + 0x32, 0x5c, 0xeb, 0xcc, 0x19, 0xd5, 0x5b, 0xdf, 0xbc, 0xed, 0xb2, 0x68, + 0xff, 0xcc, 0x99, 0x33, 0x0a, 0x56, 0xa5, 0x41, 0x4e, 0x9b, 0x36, 0x6d, + 0xe2, 0xe4, 0x49, 0x05, 0x99, 0x3a, 0xef, 0x9f, 0xe5, 0x8c, 0xb6, 0x3f, + 0x71, 0xec, 0x68, 0x04, 0x9e, 0x32, 0x90, 0xac, 0x8b, 0x2f, 0x8e, 0xa1, + 0x58, 0x26, 0xac, 0xd1, 0x51, 0x05, 0x2a, 0x9a, 0x9a, 0x9a, 0x8a, 0x20, + 0x52, 0x9b, 0x1c, 0x62, 0xf8, 0x94, 0x3e, 0xb7, 0x69, 0xd3, 0x26, 0xce, + 0x9c, 0x39, 0xc3, 0x1a, 0x67, 0x1d, 0x67, 0xce, 0x9c, 0x51, 0xd0, 0xa8, + 0xe7, 0x63, 0x40, 0x95, 0x81, 0x5f, 0x8d, 0x8e, 0x8e, 0x46, 0xc0, 0xa9, + 0x13, 0x1a, 0x66, 0x65, 0xa0, 0x56, 0x10, 0x03, 0xb4, 0x4c, 0xbe, 0x8c, + 0x4e, 0x9e, 0x3c, 0xc9, 0x3a, 0x62, 0x3b, 0x93, 0xaf, 0x64, 0x19, 0x4c, + 0x4d, 0x4d, 0x45, 0x36, 0xbd, 0xc2, 0x34, 0x90, 0xac, 0x4d, 0x6f, 0x53, + 0xfe, 0x0d, 0x2c, 0x2b, 0x72, 0x4f, 0xc0, 0xb8, 0x92, 0xe5, 0x60, 0xfc, + 0x27, 0x01, 0x5c, 0x06, 0x90, 0x05, 0x30, 0xba, 0x5d, 0xe5, 0x93, 0xe7, + 0x4f, 0xa6, 0xa0, 0x63, 0x67, 0xce, 0x9c, 0x89, 0xca, 0xfe, 0xbc, 0x7f, + 0x36, 0xce, 0x93, 0x2e, 0x83, 0x93, 0x27, 0x15, 0xcc, 0x8c, 0xff, 0x6d, + 0xf9, 0xf7, 0x36, 0x95, 0x4a, 0x85, 0xda, 0x29, 0xd5, 0x1f, 0x14, 0x80, + 0xeb, 0xc2, 0xcc, 0x12, 0xb8, 0x1b, 0x5a, 0xd4, 0xbe, 0xa9, 0xdd, 0x0b, + 0x70, 0xe0, 0xd9, 0x80, 0x9d, 0x5b, 0x4b, 0x84, 0x7e, 0x0d, 0xaf, 0x1f, + 0xc6, 0x10, 0xd8, 0x80, 0xb5, 0xc1, 0x51, 0x0b, 0x8f, 0x05, 0x3e, 0xa2, + 0x14, 0xbf, 0x7f, 0xf0, 0xfb, 0x2b, 0x4c, 0xd6, 0x03, 0x5a, 0x6d, 0x41, + 0xb1, 0x20, 0x99, 0xef, 0x2b, 0x62, 0xf7, 0xc5, 0xf1, 0xce, 0xcc, 0xd6, + 0xa8, 0x0e, 0xa9, 0x9e, 0xe3, 0x7c, 0xe8, 0xe1, 0x50, 0x45, 0x08, 0x89, + 0xd0, 0xd0, 0x39, 0xeb, 0xf2, 0x51, 0xc2, 0xd0, 0xe7, 0xa1, 0xe9, 0x19, + 0x44, 0x9f, 0x60, 0xf2, 0x84, 0x47, 0x75, 0x64, 0x98, 0x30, 0x54, 0xb0, + 0x2b, 0xdb, 0xb2, 0x55, 0xfd, 0x1f, 0x82, 0xe8, 0x2f, 0x21, 0xfa, 0x43, + 0xfc, 0x05, 0xd5, 0x3f, 0xb7, 0x2c, 0x87, 0x60, 0xc1, 0x43, 0xf4, 0x97, + 0x98, 0x3d, 0xed, 0x63, 0x15, 0xd4, 0x7b, 0x71, 0xb9, 0x24, 0x99, 0x0f, + 0x25, 0x0e, 0xd0, 0xb0, 0xa0, 0x3a, 0xe0, 0x22, 0x9b, 0x99, 0xf7, 0xb8, + 0x52, 0x22, 0x25, 0xec, 0x1a, 0xa9, 0x30, 0xf7, 0x8c, 0xc7, 0x21, 0x2f, + 0x60, 0xa8, 0x1c, 0x82, 0x68, 0xa9, 0xc5, 0xd1, 0x8c, 0x56, 0x60, 0x58, + 0x89, 0xa2, 0xee, 0x33, 0xb5, 0xc2, 0xb4, 0x6d, 0xa2, 0x5e, 0xa4, 0xa8, + 0xdb, 0x91, 0x46, 0x67, 0x3b, 0x22, 0x6c, 0x5d, 0xaf, 0x6a, 0x3f, 0xb6, + 0x05, 0x62, 0x8d, 0x85, 0x3c, 0x1f, 0x82, 0xb0, 0x11, 0xed, 0x16, 0x2d, + 0x9d, 0x1e, 0x01, 0x2b, 0x7e, 0xf1, 0x7b, 0xdd, 0xbf, 0xbe, 0xb6, 0xe7, + 0xb9, 0xca, 0xe0, 0x9b, 0xa9, 0xcd, 0x7d, 0x27, 0x75, 0xfc, 0x5b, 0xbf, + 0xf6, 0x79, 0xde, 0xf9, 0xf6, 0x77, 0xf3, 0x96, 0xcd, 0xe9, 0xbe, 0xe2, + 0xb7, 0x4e, 0x84, 0x91, 0x5b, 0x72, 0x3f, 0x79, 0x9c, 0x75, 0xef, 0x66, + 0x6b, 0xdc, 0x00, 0xde, 0xf9, 0x76, 0x75, 0xfc, 0x47, 0x7f, 0x3c, 0xc1, + 0x07, 0x7f, 0x7e, 0x3c, 0x65, 0x63, 0x60, 0x5b, 0x59, 0xf7, 0x95, 0xfc, + 0x2d, 0x27, 0xe3, 0xaf, 0x9b, 0xdb, 0x9f, 0x7f, 0xe3, 0x29, 0x9e, 0x3b, + 0x75, 0xba, 0xa7, 0xdf, 0x6e, 0xe7, 0x56, 0xeb, 0xd6, 0x4b, 0xc9, 0xfe, + 0x2f, 0xf5, 0x32, 0x23, 0xd3, 0x7a, 0xbf, 0x5c, 0x4f, 0xdb, 0xed, 0xd1, + 0x3b, 0xe3, 0xe4, 0xca, 0x95, 0x2b, 0x57, 0xae, 0x5c, 0xb9, 0x72, 0xe5, + 0xca, 0x95, 0x2b, 0x57, 0xae, 0x5c, 0xb9, 0x72, 0xe5, 0xca, 0x95, 0x2b, + 0x57, 0xae, 0x5c, 0xb9, 0x72, 0xe5, 0xca, 0x95, 0x2b, 0x57, 0xae, 0x97, + 0xa1, 0x1c, 0xaa, 0x95, 0x2b, 0x57, 0xae, 0x5c, 0xb9, 0x72, 0xbd, 0x5a, + 0x3a, 0x68, 0xc3, 0x75, 0x7a, 0x12, 0x77, 0x53, 0x2a, 0x90, 0x55, 0x1b, + 0x48, 0x7c, 0x58, 0x2b, 0xfa, 0x34, 0xf0, 0xc3, 0x4c, 0x1c, 0x2a, 0x40, + 0x43, 0x7f, 0x70, 0xdd, 0x4a, 0xac, 0xe4, 0xec, 0xe9, 0x95, 0xc4, 0x05, + 0x0a, 0x20, 0x12, 0x83, 0x1e, 0x24, 0x8d, 0x66, 0x03, 0xa9, 0x3f, 0xc0, + 0x0b, 0xc3, 0x06, 0xa5, 0xb2, 0x8b, 0x6b, 0x40, 0x5d, 0xed, 0x18, 0x9c, + 0x35, 0xbc, 0x56, 0x7d, 0xc8, 0xda, 0x38, 0xd7, 0x88, 0x20, 0x23, 0xbe, + 0xef, 0x47, 0xe7, 0x3d, 0xcf, 0xd3, 0x61, 0x84, 0x54, 0xab, 0xd5, 0xc8, + 0xbf, 0xfa, 0xe0, 0xbc, 0xcb, 0x84, 0xd7, 0x36, 0x04, 0x7a, 0xc5, 0xf8, + 0xca, 0xb6, 0x31, 0x1a, 0x1a, 0x5c, 0x65, 0x00, 0x56, 0xc5, 0x35, 0x76, + 0xea, 0x38, 0xa9, 0x24, 0x94, 0x66, 0x68, 0xdb, 0x50, 0x64, 0x5b, 0xea, + 0x2f, 0x21, 0xf5, 0xb6, 0xb4, 0x5d, 0x4d, 0xba, 0xf1, 0x4e, 0xd5, 0x68, + 0x35, 0x94, 0x7d, 0xbd, 0x4d, 0x04, 0xed, 0xf2, 0x4e, 0xd5, 0xa2, 0x95, + 0xa6, 0xb3, 0x40, 0x2d, 0x15, 0x96, 0x45, 0xb0, 0x14, 0xd2, 0x3a, 0xdf, + 0x88, 0xca, 0x3b, 0x0c, 0x62, 0x24, 0x56, 0x43, 0x87, 0xd9, 0x38, 0xef, + 0x61, 0xaf, 0x11, 0x8c, 0x5e, 0xb9, 0x9d, 0xc9, 0x87, 0x63, 0xa8, 0x56, + 0x7d, 0xb1, 0xde, 0x11, 0x26, 0x80, 0x30, 0x33, 0x27, 0x0e, 0xc6, 0x13, + 0x62, 0xc2, 0x67, 0x25, 0x8c, 0x24, 0x8c, 0x5c, 0xbb, 0x13, 0xae, 0x05, + 0x70, 0xba, 0xa5, 0xca, 0xb3, 0x52, 0x54, 0xfb, 0xe7, 0x1a, 0xf1, 0x2c, + 0xc7, 0x26, 0x0a, 0xa4, 0x95, 0xd4, 0xa2, 0x54, 0x50, 0x2d, 0x2d, 0x47, + 0xaf, 0xe4, 0x6a, 0x59, 0x02, 0x5f, 0xaf, 0x6e, 0xed, 0xe9, 0x8f, 0x49, + 0xdd, 0x01, 0x87, 0x30, 0x6c, 0xe1, 0x2d, 0x98, 0xd5, 0xc0, 0xe3, 0x2b, + 0xe6, 0x94, 0xd4, 0x07, 0x8d, 0xb6, 0x25, 0xa2, 0x09, 0xc8, 0x51, 0xda, + 0x35, 0xc8, 0x46, 0x26, 0xec, 0x25, 0x12, 0x57, 0x03, 0x70, 0x1a, 0x41, + 0x7a, 0x02, 0x84, 0xb7, 0xe0, 0x13, 0x86, 0x92, 0xea, 0x36, 0x37, 0x02, + 0x64, 0x79, 0x0b, 0x41, 0xd7, 0xf8, 0xb2, 0xa0, 0xaa, 0xc6, 0x52, 0x88, + 0x3b, 0xa0, 0xa1, 0x3e, 0x5d, 0xd2, 0x1a, 0xf9, 0xeb, 0x31, 0x3b, 0x29, + 0x5c, 0x0a, 0x53, 0xf1, 0x80, 0xfa, 0xb8, 0xde, 0x2d, 0x09, 0xb5, 0x0a, + 0xf6, 0xb2, 0xf1, 0xd1, 0x33, 0x3e, 0xda, 0x32, 0x05, 0xe3, 0x32, 0x65, + 0x6a, 0x30, 0x55, 0xe1, 0xb3, 0x7a, 0xe6, 0x03, 0xa4, 0xef, 0x6b, 0xa9, + 0x57, 0x52, 0x17, 0x6a, 0xc2, 0x86, 0xd9, 0x1a, 0x65, 0x8f, 0xa5, 0x5c, + 0x11, 0xc9, 0x46, 0xd8, 0x5c, 0xde, 0xc6, 0x80, 0xb5, 0xba, 0x6d, 0x95, + 0x9c, 0x94, 0xbd, 0xc9, 0xab, 0x99, 0x8c, 0xb1, 0xdc, 0xea, 0xec, 0xdd, + 0x26, 0x8e, 0xf4, 0x02, 0x68, 0x5d, 0x08, 0xa4, 0x28, 0xab, 0x56, 0xb3, + 0x85, 0x5c, 0xd3, 0xe9, 0xdf, 0xc4, 0x67, 0xc2, 0x6e, 0x5d, 0xc0, 0x0a, + 0xbc, 0xab, 0x91, 0x09, 0xbf, 0x25, 0x5b, 0x11, 0xe4, 0xaf, 0x43, 0x3d, + 0xee, 0xeb, 0x95, 0x40, 0x5d, 0xbe, 0x99, 0x30, 0xbf, 0x94, 0x9e, 0xd4, + 0x29, 0x9b, 0x32, 0x2a, 0xf3, 0xe4, 0x04, 0xa0, 0x6e, 0xd0, 0xab, 0x5e, + 0x20, 0xac, 0x5e, 0x6e, 0xde, 0x82, 0xd7, 0x75, 0xbb, 0x9c, 0x92, 0x36, + 0xdd, 0xe0, 0x60, 0x59, 0xb7, 0xe5, 0x60, 0x62, 0xdd, 0xfc, 0xaf, 0x26, + 0xec, 0x95, 0xe2, 0x95, 0x6d, 0xe2, 0x36, 0x2d, 0x01, 0xd0, 0xca, 0xc2, + 0xb4, 0x8c, 0x92, 0x10, 0xad, 0xac, 0xdd, 0x72, 0xbf, 0xe1, 0xe4, 0x7d, + 0x7d, 0xee, 0xd9, 0x26, 0x95, 0x77, 0xbd, 0x11, 0x80, 0x81, 0x1d, 0x3b, + 0xb8, 0xfb, 0xee, 0xbb, 0x39, 0x78, 0xf0, 0x20, 0x07, 0x51, 0xa0, 0xa9, + 0x81, 0x8d, 0x1b, 0xbb, 0x86, 0x91, 0xd4, 0xed, 0x13, 0xd3, 0xdc, 0x39, + 0x3e, 0x42, 0xb9, 0x5c, 0xe6, 0x81, 0xe9, 0x3a, 0x13, 0x13, 0x13, 0x94, + 0x75, 0x7b, 0xf1, 0xc1, 0x89, 0x69, 0xca, 0x65, 0x58, 0x48, 0xd8, 0x3f, + 0x81, 0x9a, 0x00, 0xf3, 0x04, 0xb0, 0x4d, 0xdb, 0x5c, 0xa8, 0x9e, 0xf8, + 0xd8, 0xc7, 0x78, 0x71, 0xc7, 0x8e, 0x55, 0x43, 0xb3, 0x56, 0xd2, 0xc6, + 0x81, 0x01, 0xb8, 0xf5, 0x56, 0x16, 0xee, 0xb9, 0x87, 0x8f, 0x00, 0x9f, + 0x7f, 0x45, 0x42, 0x7d, 0xf5, 0x75, 0xee, 0xd9, 0x26, 0xf0, 0xe3, 0x00, + 0x84, 0x4d, 0x1b, 0x03, 0xd8, 0x89, 0xf4, 0xdb, 0x57, 0x73, 0xd3, 0x2a, + 0xc3, 0x92, 0xed, 0x4e, 0xd8, 0x56, 0x37, 0xd5, 0x9e, 0xd5, 0xfd, 0x89, + 0xf6, 0x2a, 0x40, 0x12, 0xed, 0xf4, 0x61, 0xd6, 0x3e, 0xc8, 0xc6, 0xf7, + 0x8f, 0xdc, 0x1e, 0x80, 0x5e, 0xa0, 0x4b, 0xe3, 0xae, 0xeb, 0xe4, 0xc8, + 0xaf, 0x9e, 0x40, 0x13, 0x36, 0x6d, 0x10, 0x61, 0xbc, 0xff, 0xc3, 0xc2, + 0x78, 0x0c, 0xef, 0xea, 0x79, 0xca, 0x7b, 0xf2, 0xc2, 0xa1, 0x9d, 0x2f, + 0x55, 0xd6, 0xb6, 0x5d, 0x84, 0xc7, 0xf6, 0xbf, 0xf4, 0x00, 0xde, 0xd4, + 0x39, 0x11, 0xfe, 0xa6, 0x37, 0x0f, 0xc2, 0xbe, 0xdb, 0xe1, 0x9a, 0x9d, + 0x69, 0xb0, 0xd6, 0xab, 0xac, 0xb0, 0x69, 0x43, 0x9f, 0xbe, 0xd6, 0xd9, + 0x7e, 0x38, 0xd0, 0x3a, 0x17, 0x52, 0x5c, 0x6b, 0xe9, 0xfd, 0x84, 0x3f, + 0xcf, 0xc3, 0x72, 0x35, 0x22, 0xe0, 0x74, 0xdc, 0xe7, 0x92, 0x3e, 0x08, + 0x47, 0x6d, 0x01, 0xf6, 0xfe, 0xb6, 0x02, 0x1d, 0xa4, 0xa7, 0xbf, 0x43, + 0xfd, 0x8e, 0xab, 0x13, 0xd3, 0xb8, 0xe9, 0xba, 0xbf, 0xf7, 0xbd, 0x0f, + 0x01, 0x0f, 0x25, 0xce, 0x74, 0xee, 0x87, 0xbf, 0x70, 0x80, 0x34, 0xa6, + 0x4f, 0xc9, 0xb8, 0xed, 0xfd, 0xfc, 0xa7, 0xbb, 0x9c, 0x5d, 0xbd, 0x66, + 0x97, 0x89, 0xbb, 0x5b, 0x7c, 0xdd, 0xf6, 0xe7, 0xb9, 0xf0, 0xeb, 0x5d, + 0xcf, 0x6c, 0xa7, 0xba, 0x9b, 0xd1, 0x6b, 0x9a, 0x67, 0xb2, 0x76, 0x2e, + 0xeb, 0x67, 0xbe, 0x64, 0x7b, 0xfd, 0x8d, 0xe6, 0x39, 0x46, 0xdf, 0xd8, + 0x09, 0xf4, 0x32, 0x70, 0xa7, 0xe8, 0x19, 0x3b, 0x73, 0x0e, 0x3a, 0x81, + 0x54, 0xbd, 0x00, 0x5a, 0x82, 0xde, 0xc0, 0xa9, 0xe7, 0xba, 0xa6, 0x3a, + 0xb6, 0xef, 0xe6, 0x4f, 0x24, 0xce, 0x75, 0x3b, 0x4e, 0xa6, 0x2d, 0x99, + 0x66, 0x93, 0x1f, 0x93, 0x5e, 0x13, 0xee, 0x73, 0x09, 0x3f, 0x26, 0xad, + 0xdd, 0xf2, 0xd1, 0x0d, 0x60, 0xf5, 0x72, 0xf2, 0x01, 0x9d, 0xe9, 0xbe, + 0x90, 0x7c, 0x40, 0x9c, 0x77, 0x73, 0xce, 0xf8, 0x59, 0xa3, 0xf7, 0xbf, + 0xd1, 0x3c, 0x67, 0x9a, 0xeb, 0x74, 0x7b, 0xdd, 0x0f, 0x95, 0xcd, 0x0e, + 0xb4, 0x25, 0xb5, 0xa7, 0xe7, 0x68, 0x24, 0xc6, 0x49, 0x6e, 0xfc, 0xcd, + 0x31, 0x02, 0xdd, 0xf7, 0xab, 0x5e, 0x15, 0x5f, 0xf9, 0xca, 0x66, 0x15, + 0xa1, 0x8f, 0xe4, 0xce, 0xdf, 0xdf, 0xc5, 0xd4, 0x82, 0xa4, 0xf6, 0xe4, + 0x71, 0x82, 0x45, 0x9f, 0xea, 0x65, 0x83, 0xd0, 0x0f, 0xc5, 0xb6, 0x54, + 0x10, 0xeb, 0x45, 0x98, 0x7f, 0x56, 0xdd, 0x01, 0xd5, 0x1d, 0x55, 0xee, + 0xbd, 0xe1, 0x06, 0x02, 0x60, 0x50, 0x77, 0xaf, 0xa4, 0x94, 0x0c, 0x6e, + 0x05, 0xb6, 0xaa, 0xe3, 0x3b, 0xff, 0xe4, 0x66, 0xee, 0xfb, 0x8f, 0xca, + 0xde, 0xff, 0xb2, 0x42, 0x0e, 0x39, 0x25, 0xc1, 0xce, 0x9b, 0x2b, 0x6a, + 0x5c, 0xa7, 0x54, 0xa4, 0x84, 0x43, 0x30, 0xef, 0xe1, 0xd5, 0x7d, 0x86, + 0xae, 0x19, 0xe6, 0xae, 0x8f, 0xee, 0x56, 0x9e, 0xcd, 0xfc, 0xde, 0xb6, + 0x64, 0xf8, 0xba, 0x78, 0xff, 0xae, 0xa9, 0xdd, 0xdc, 0x72, 0xb3, 0xba, + 0x63, 0xdc, 0x8d, 0x2e, 0xc1, 0x92, 0xcf, 0xce, 0x5b, 0x5d, 0x66, 0x66, + 0x25, 0xc1, 0x31, 0x0d, 0xd9, 0x3a, 0xe6, 0xe3, 0x9d, 0xf2, 0x70, 0x37, + 0xba, 0xdc, 0xf5, 0x75, 0x05, 0x0b, 0x61, 0x28, 0x5d, 0xe6, 0xfb, 0x9f, + 0x96, 0x5c, 0x5b, 0x85, 0xdd, 0xbf, 0xec, 0xe0, 0xb5, 0xd5, 0x44, 0x6e, + 0xc3, 0x51, 0xf7, 0x64, 0x0b, 0x67, 0xad, 0x9a, 0xc0, 0x3e, 0x73, 0x14, + 0x86, 0x2f, 0x53, 0xcf, 0xbb, 0x06, 0xa8, 0x65, 0x60, 0x5a, 0x83, 0x55, + 0xf0, 0x4f, 0x4b, 0xcc, 0x9c, 0xd9, 0xc9, 0x67, 0x61, 0x6c, 0x2b, 0xf8, + 0x3e, 0xcc, 0x2d, 0x4a, 0x9c, 0x92, 0x60, 0xee, 0x99, 0x74, 0xff, 0xc6, + 0x37, 0xd5, 0xe9, 0x22, 0x8c, 0xbd, 0x2f, 0x76, 0xef, 0xf5, 0xcc, 0x98, + 0xac, 0xc3, 0x93, 0xf7, 0xf5, 0xe8, 0x6f, 0xfe, 0xb3, 0x0e, 0xdb, 0xbf, + 0x5e, 0x7c, 0x91, 0x9f, 0x5e, 0x7f, 0x51, 0xd7, 0x70, 0x00, 0xa6, 0xfe, + 0xd3, 0xff, 0xea, 0x70, 0xdb, 0xf2, 0xf1, 0xd7, 0xf0, 0xe6, 0x37, 0xf5, + 0xf6, 0x93, 0x54, 0xb7, 0x38, 0x57, 0xab, 0x97, 0x92, 0x36, 0x13, 0xe7, + 0x68, 0xe2, 0xf8, 0xbe, 0xdf, 0x7b, 0xf1, 0x25, 0xc5, 0xff, 0x3a, 0x60, + 0xcb, 0xf7, 0xe0, 0xdf, 0xfe, 0xcf, 0xbf, 0xe7, 0xf3, 0x40, 0xdf, 0xeb, + 0x55, 0x5a, 0x3e, 0xfc, 0xbd, 0x17, 0x79, 0xf0, 0xf5, 0x17, 0x71, 0xf1, + 0xeb, 0x2f, 0xe2, 0x7c, 0x8f, 0xec, 0xf5, 0xd9, 0x2b, 0x97, 0xcf, 0x4f, + 0xa0, 0xd2, 0xb5, 0x89, 0x34, 0x5c, 0xfe, 0xbb, 0xc0, 0x7f, 0xb7, 0x5f, + 0xc3, 0xdb, 0x1a, 0x7f, 0xcf, 0x1b, 0x33, 0xee, 0xa0, 0x80, 0x50, 0x8f, + 0xea, 0xfd, 0xe4, 0x7d, 0x9d, 0x7c, 0xe6, 0x82, 0x18, 0x30, 0xe5, 0x07, + 0xc9, 0xe7, 0xd8, 0xc4, 0x64, 0xed, 0x84, 0xbb, 0x55, 0x72, 0x89, 0x9e, + 0x88, 0x35, 0x48, 0x0b, 0x3c, 0x7c, 0xdc, 0x28, 0x8c, 0xd4, 0x13, 0x73, + 0xc9, 0x8d, 0x42, 0x4a, 0x86, 0xe3, 0x34, 0x42, 0x7c, 0xaa, 0x38, 0x28, + 0x20, 0x56, 0x74, 0x2e, 0x01, 0xbc, 0xaa, 0x69, 0x58, 0x16, 0x80, 0x53, + 0x0a, 0x71, 0x00, 0x1f, 0x2f, 0x2a, 0x04, 0x5f, 0xdb, 0x9b, 0xb0, 0x0d, + 0x1c, 0xe2, 0x78, 0xc3, 0x65, 0xb8, 0xa2, 0xfd, 0x43, 0x7c, 0x8d, 0x33, + 0xb6, 0x95, 0x92, 0x4b, 0x2d, 0xf0, 0xf0, 0x6a, 0x35, 0x86, 0x4d, 0xbe, + 0x74, 0x9e, 0x6a, 0x01, 0x38, 0xa5, 0x38, 0xdd, 0x95, 0x12, 0x84, 0xb8, + 0x1c, 0xd7, 0x61, 0x1a, 0xd0, 0x55, 0x12, 0x78, 0x65, 0x5d, 0xd1, 0xe9, + 0xd6, 0x0b, 0x88, 0x65, 0x80, 0x5c, 0xdd, 0xc2, 0xe8, 0xe5, 0xa7, 0x5b, + 0x78, 0xf5, 0xc7, 0x3b, 0x6d, 0x52, 0xcf, 0x5c, 0x89, 0xbe, 0xd9, 0xe4, + 0xd3, 0x21, 0x63, 0x57, 0xaa, 0x3e, 0x59, 0xb1, 0x0d, 0x93, 0x47, 0xd5, + 0xbd, 0x9f, 0x84, 0x6b, 0x19, 0xb7, 0xac, 0xfb, 0x81, 0x43, 0xf1, 0x55, + 0xdd, 0xb9, 0xdd, 0xe9, 0xe9, 0x16, 0xb9, 0xeb, 0xe7, 0x8e, 0x3b, 0x1e, + 0x7a, 0x8a, 0xf9, 0xcf, 0x2b, 0x88, 0x56, 0x16, 0xbc, 0xd5, 0x0d, 0xc8, + 0x65, 0xdc, 0xc6, 0xae, 0x74, 0x22, 0xf7, 0xb9, 0x85, 0x90, 0xc1, 0x01, + 0x8b, 0xfb, 0x7f, 0xf5, 0xdd, 0xdc, 0xf9, 0x4b, 0x15, 0x6e, 0xff, 0xc3, + 0x78, 0xbc, 0x78, 0x70, 0x20, 0x4e, 0xe3, 0xdc, 0x42, 0xd8, 0xe1, 0x3e, + 0x73, 0x34, 0xe4, 0xa9, 0xdf, 0x7a, 0x8a, 0xdf, 0x78, 0x2c, 0x3d, 0xc1, + 0x7d, 0xe6, 0x68, 0xc8, 0xee, 0x9b, 0x55, 0x5c, 0xad, 0xa8, 0x7e, 0x2c, + 0xe2, 0x15, 0xee, 0x23, 0x5c, 0x48, 0x3f, 0x4f, 0x58, 0x96, 0x1a, 0x97, + 0x9f, 0x3b, 0x5d, 0x64, 0xf0, 0xcb, 0x2d, 0x3c, 0x31, 0xc3, 0xee, 0x0f, + 0x5d, 0xcb, 0x7d, 0x0f, 0xcf, 0x20, 0xac, 0x61, 0x44, 0xbb, 0x96, 0x02, + 0x6a, 0x09, 0xcb, 0x46, 0x86, 0x73, 0xd4, 0x75, 0x9b, 0x78, 0xc3, 0xcf, + 0xde, 0xc8, 0x81, 0x43, 0xf3, 0xd0, 0xf6, 0x08, 0x65, 0x03, 0xd1, 0x86, + 0x2f, 0x3c, 0x72, 0x9f, 0xb2, 0xed, 0xf3, 0x00, 0x17, 0xff, 0xfc, 0x3c, + 0xa3, 0x03, 0x36, 0x33, 0x25, 0x38, 0xf0, 0x58, 0xc0, 0xa8, 0xee, 0x75, + 0xd4, 0x9e, 0x0d, 0xd5, 0xfb, 0x87, 0xa5, 0x19, 0x1a, 0xe7, 0x25, 0x22, + 0x84, 0xe2, 0x86, 0xb8, 0x8d, 0x4d, 0xf6, 0xcd, 0xe6, 0x9a, 0x21, 0x63, + 0xba, 0x38, 0x42, 0xd9, 0x39, 0x26, 0x25, 0xdb, 0x3e, 0x41, 0x00, 0x22, + 0x03, 0x78, 0xca, 0xda, 0xf8, 0x32, 0xb9, 0xc8, 0x85, 0xb8, 0x20, 0x10, + 0xee, 0x72, 0x0a, 0xc2, 0x1a, 0xe5, 0xbe, 0x51, 0xea, 0xa1, 0x6a, 0xb7, + 0x5b, 0xa1, 0x1f, 0xa5, 0xb3, 0x1e, 0xaa, 0xbe, 0xb1, 0x25, 0xc6, 0xb0, + 0x84, 0x19, 0xc7, 0x56, 0xd7, 0x5f, 0x14, 0x20, 0x94, 0x12, 0x4b, 0x08, + 0x42, 0xa9, 0x00, 0x3e, 0xa1, 0xbe, 0x66, 0x96, 0x81, 0xef, 0x98, 0x48, + 0xda, 0xf1, 0xd6, 0xc0, 0xad, 0x2c, 0xcb, 0x8e, 0xdc, 0x93, 0xfb, 0x40, + 0x0a, 0x9c, 0x65, 0x64, 0x80, 0x58, 0x66, 0x0b, 0x9d, 0x20, 0xad, 0x24, + 0x38, 0xab, 0xd3, 0x9f, 0x85, 0xa1, 0x3a, 0x88, 0x3e, 0x32, 0xfe, 0x62, + 0x78, 0x56, 0xda, 0xaf, 0xd5, 0xb1, 0x1f, 0x86, 0x41, 0xea, 0x5a, 0xcd, + 0x35, 0xc3, 0x08, 0x2e, 0x9c, 0xac, 0xc3, 0xeb, 0xc4, 0x30, 0xaa, 0x32, + 0x69, 0x90, 0x56, 0xd6, 0xcd, 0xc0, 0xab, 0xa6, 0xa7, 0xe3, 0xb8, 0x47, + 0x46, 0xd4, 0xf1, 0xf8, 0xb8, 0x02, 0x68, 0x8d, 0x8c, 0x28, 0x60, 0x55, + 0xb9, 0x0c, 0x7b, 0x26, 0xd2, 0xe9, 0x47, 0xbb, 0x4f, 0x4c, 0xc0, 0xf8, + 0x78, 0x9d, 0x09, 0x80, 0x09, 0xd8, 0x33, 0x5e, 0x66, 0x62, 0x4f, 0x9d, + 0xe9, 0x91, 0xd8, 0x3f, 0xc6, 0xef, 0x78, 0x0c, 0xd1, 0x02, 0x05, 0xe7, + 0x32, 0xf1, 0xed, 0x99, 0x50, 0x30, 0xaf, 0xe9, 0xe9, 0x18, 0x54, 0x05, + 0x30, 0x31, 0x11, 0x43, 0xbe, 0xca, 0xfa, 0x3f, 0x13, 0xc2, 0x9e, 0x71, + 0x05, 0xc1, 0x52, 0xe9, 0x2d, 0x33, 0x92, 0x78, 0xea, 0x99, 0x40, 0xc1, + 0xb4, 0x52, 0x49, 0x9e, 0x80, 0x3d, 0xd4, 0x19, 0x07, 0x26, 0xc6, 0x75, + 0xda, 0xca, 0xda, 0xc7, 0x74, 0xe4, 0x55, 0x6f, 0xe2, 0xb0, 0xe2, 0x14, + 0x9b, 0xf8, 0xeb, 0x51, 0x99, 0x26, 0xd3, 0x63, 0x5e, 0x4d, 0x8d, 0x53, + 0xd7, 0xf0, 0x85, 0xd8, 0xd2, 0x9a, 0x80, 0x2f, 0xc6, 0x39, 0xa7, 0x5c, + 0x86, 0xf7, 0x4c, 0x03, 0x23, 0xf0, 0x15, 0xe3, 0x3c, 0xad, 0xec, 0x26, + 0xc6, 0xe1, 0x67, 0xb4, 0xd3, 0x8a, 0xe3, 0x66, 0xcb, 0x28, 0x06, 0x65, + 0xad, 0x2c, 0xd9, 0x0c, 0x11, 0xfa, 0x1d, 0x85, 0x59, 0x50, 0xc1, 0x8c, + 0xb1, 0xc9, 0xb6, 0x04, 0xa9, 0xde, 0x61, 0x18, 0x90, 0x96, 0x19, 0x53, + 0xef, 0x06, 0xd2, 0x02, 0x22, 0x20, 0x97, 0xb1, 0x97, 0x52, 0x6a, 0x10, + 0x93, 0x54, 0x63, 0xcb, 0xab, 0x58, 0x78, 0xa3, 0x5b, 0x5e, 0x2e, 0xe4, + 0xbd, 0xc7, 0xaa, 0xf3, 0x2f, 0x41, 0x0a, 0x95, 0x7f, 0xab, 0xcf, 0x42, + 0x88, 0x22, 0x61, 0xe8, 0xe3, 0xd5, 0x55, 0xfd, 0xe4, 0x96, 0xab, 0x48, + 0x19, 0x32, 0x7f, 0x62, 0x0a, 0x77, 0xfd, 0x10, 0x08, 0x70, 0xdd, 0x0a, + 0xe1, 0xb9, 0x06, 0xd7, 0xcf, 0x9d, 0xed, 0x19, 0x6c, 0xf8, 0xd8, 0x7e, + 0xac, 0x9f, 0xed, 0x1c, 0x93, 0x9a, 0xf9, 0xfc, 0x5e, 0x86, 0x3f, 0x7a, + 0x5b, 0xec, 0x30, 0xaa, 0x90, 0x9d, 0xc9, 0x71, 0xb3, 0xe4, 0x7b, 0xae, + 0x28, 0x3f, 0x6d, 0x10, 0x05, 0x49, 0x88, 0x7a, 0x27, 0x6c, 0x16, 0xa6, + 0x31, 0xf5, 0xf2, 0x3c, 0xc4, 0xd0, 0x2d, 0x62, 0xa0, 0x16, 0x6d, 0xb0, + 0xdb, 0xd0, 0x10, 0x12, 0x5b, 0x42, 0xa3, 0x2f, 0x1d, 0x66, 0x52, 0x93, + 0x49, 0x58, 0x96, 0xde, 0xfa, 0x40, 0x34, 0x9a, 0xd5, 0x56, 0x7d, 0x2b, + 0x59, 0x10, 0xf8, 0xa6, 0xb6, 0x4d, 0xf8, 0x71, 0xcc, 0x22, 0x52, 0x99, + 0xb4, 0x38, 0xc0, 0x6c, 0x41, 0x41, 0xac, 0x6a, 0xa8, 0xb4, 0x0b, 0x04, + 0x4e, 0x01, 0x1c, 0xed, 0x7f, 0xae, 0x9d, 0x80, 0x58, 0xb5, 0xe3, 0x9e, + 0xa7, 0x0f, 0xd0, 0x6e, 0x51, 0x23, 0xae, 0x7b, 0x4d, 0xda, 0x82, 0x1e, + 0x69, 0xae, 0x15, 0x84, 0x8e, 0x87, 0x54, 0x5b, 0x60, 0xfc, 0xf8, 0x26, + 0x5c, 0xe0, 0x5e, 0x14, 0x30, 0xab, 0xd8, 0x07, 0x97, 0x34, 0xe1, 0xb8, + 0x10, 0xd8, 0x05, 0xc9, 0x1d, 0x43, 0x70, 0xcb, 0xd3, 0x30, 0x56, 0xd0, + 0xe3, 0x38, 0x6d, 0xb8, 0x25, 0x11, 0xd7, 0x58, 0x01, 0xc6, 0xf4, 0xb1, + 0x71, 0x3f, 0xae, 0x2f, 0x46, 0xa3, 0x2d, 0xb9, 0x49, 0x82, 0x79, 0xf5, + 0xb1, 0x3f, 0x53, 0x4e, 0xc9, 0xf7, 0x5c, 0x7c, 0xd5, 0x86, 0x5f, 0x50, + 0xd7, 0xda, 0x00, 0xa1, 0xce, 0x90, 0x86, 0x48, 0x9d, 0xf0, 0xcf, 0xa6, + 0x20, 0x50, 0xeb, 0xde, 0xb0, 0x26, 0x3a, 0x7f, 0xde, 0x3f, 0xcb, 0x94, + 0xf6, 0x17, 0x01, 0x9d, 0xb4, 0xbb, 0x81, 0x5c, 0x19, 0x20, 0xd7, 0xba, + 0x37, 0xac, 0x89, 0xdc, 0xb2, 0x50, 0x29, 0x50, 0xc0, 0x28, 0x13, 0xbe, + 0x49, 0xcb, 0xd9, 0xe7, 0xcf, 0x47, 0xf6, 0x67, 0x9f, 0x3f, 0x1f, 0x01, + 0xaa, 0x4c, 0x98, 0x06, 0x82, 0x15, 0x81, 0xa7, 0x9e, 0x3f, 0x19, 0x01, + 0xad, 0x92, 0xf0, 0xaf, 0xb3, 0xcf, 0x9f, 0x07, 0xed, 0xf7, 0x7c, 0x22, + 0x3f, 0xc6, 0xd6, 0xc4, 0x61, 0xce, 0x19, 0x50, 0xd7, 0x1a, 0x67, 0x5d, + 0xcf, 0x30, 0x93, 0x65, 0x96, 0xcc, 0x53, 0x12, 0x4a, 0x66, 0xd2, 0xb6, + 0x8e, 0xb8, 0x3c, 0xd6, 0x38, 0xeb, 0x22, 0x30, 0x57, 0x16, 0xa6, 0x65, + 0xec, 0x0d, 0x24, 0xcb, 0x84, 0x69, 0x74, 0xf1, 0xc5, 0x17, 0xa7, 0xc2, + 0x36, 0x10, 0x33, 0x13, 0x56, 0x12, 0x14, 0x06, 0xa8, 0xeb, 0xab, 0xd5, + 0xad, 0x0e, 0x3f, 0x50, 0x0f, 0xb0, 0x9c, 0x2a, 0x96, 0x65, 0xb3, 0xeb, + 0xf2, 0x31, 0xa6, 0x0e, 0x1d, 0x42, 0xce, 0x7a, 0x0a, 0xf6, 0xd7, 0x57, + 0x64, 0x68, 0xeb, 0x10, 0x53, 0xa7, 0x83, 0xe8, 0xf9, 0xe5, 0xbe, 0x67, + 0xeb, 0x54, 0x2f, 0xd3, 0xdf, 0x88, 0x04, 0xea, 0x57, 0x5c, 0x2c, 0x48, + 0xa6, 0x1a, 0xe0, 0x15, 0xc0, 0xac, 0x35, 0xe5, 0xf4, 0x5b, 0xcc, 0x4e, + 0x1f, 0xa2, 0xa1, 0x98, 0x74, 0xb8, 0x56, 0x89, 0x56, 0x5f, 0x0b, 0xa7, + 0x20, 0x98, 0x5c, 0x68, 0x20, 0x0a, 0x92, 0x4a, 0xa5, 0x82, 0xf7, 0x4c, + 0x0d, 0x67, 0xb3, 0x13, 0xf5, 0x5b, 0x6a, 0xc7, 0xe6, 0x70, 0x06, 0x92, + 0x7d, 0x1e, 0xc1, 0xfc, 0xf4, 0x0c, 0xee, 0xa5, 0x55, 0x44, 0x3f, 0x34, + 0x16, 0x3d, 0xec, 0xf5, 0x2e, 0xf5, 0xa5, 0x59, 0x2c, 0xeb, 0x12, 0x82, + 0x85, 0x00, 0x81, 0x60, 0xfe, 0xf0, 0x71, 0xaa, 0x57, 0x5c, 0x82, 0xe8, + 0x8f, 0x17, 0xb2, 0x92, 0x84, 0x54, 0xb6, 0x54, 0x91, 0x32, 0xc0, 0xd9, + 0xec, 0xe0, 0x09, 0x0b, 0xf0, 0x99, 0x5a, 0xf0, 0x71, 0x10, 0x58, 0x23, + 0x97, 0x50, 0x0b, 0x5b, 0x58, 0xf8, 0x20, 0x04, 0xa3, 0x65, 0x9b, 0xd6, + 0x6b, 0x1d, 0xc0, 0xa3, 0x6a, 0x97, 0x91, 0xcf, 0x1c, 0xa7, 0x76, 0x3e, + 0xe0, 0x86, 0xab, 0xaa, 0xd4, 0xea, 0x3e, 0xd2, 0x2c, 0x28, 0x60, 0xd2, + 0x56, 0xb4, 0xb0, 0x85, 0x0d, 0xd8, 0xf8, 0xf8, 0xd0, 0x92, 0xaa, 0x5e, + 0x5c, 0x66, 0xb1, 0x26, 0x51, 0xd0, 0x0b, 0x3a, 0x19, 0xa0, 0x56, 0x31, + 0xd1, 0xb3, 0x15, 0x0a, 0xec, 0xe5, 0xf9, 0x21, 0x8e, 0xb0, 0xd4, 0xa2, + 0x28, 0x4d, 0x10, 0x6b, 0xc0, 0x5a, 0x53, 0xa2, 0x54, 0x0c, 0xa9, 0x79, + 0x2d, 0x8a, 0x7d, 0x45, 0x40, 0xd0, 0xca, 0x80, 0xc1, 0xd4, 0x58, 0x4a, + 0x33, 0x75, 0x4f, 0x2f, 0xa7, 0x24, 0x50, 0x2b, 0x79, 0x9c, 0x85, 0x60, + 0x65, 0xdd, 0xb2, 0xe7, 0xdf, 0xb2, 0xd9, 0xe2, 0x91, 0x2f, 0x3d, 0xca, + 0x3b, 0xdf, 0xfe, 0xee, 0x94, 0x7b, 0x37, 0xa0, 0x96, 0xd1, 0xfb, 0xae, + 0x7f, 0x1b, 0xb5, 0xb9, 0xef, 0xf0, 0xc8, 0x97, 0x1e, 0xe5, 0x83, 0x3f, + 0x3f, 0xde, 0x01, 0xe9, 0xba, 0xee, 0x5f, 0x5f, 0xcb, 0x67, 0xee, 0xfc, + 0x3d, 0xe0, 0xa9, 0x08, 0x0c, 0x36, 0xfb, 0x67, 0xdf, 0x60, 0xdd, 0x4f, + 0xbe, 0x25, 0x8a, 0x2f, 0x9b, 0x1e, 0x93, 0x06, 0x13, 0x76, 0x36, 0x0d, + 0x66, 0xff, 0x91, 0x2f, 0x3d, 0x9a, 0x82, 0x8d, 0x3d, 0xf2, 0xa5, 0x47, + 0x79, 0xee, 0xd4, 0x69, 0x7e, 0xed, 0xf6, 0x7f, 0x97, 0x4a, 0x63, 0x12, + 0x3a, 0xd6, 0x0d, 0x40, 0x66, 0xd2, 0x9f, 0x05, 0x97, 0xad, 0x06, 0x40, + 0xf6, 0xc8, 0x97, 0x1e, 0x55, 0x00, 0xd4, 0x72, 0x1d, 0xf6, 0xd4, 0x61, + 0x8f, 0x36, 0xd8, 0x83, 0x72, 0x1f, 0xa9, 0xc7, 0x01, 0x4e, 0x97, 0xd3, + 0x85, 0xf7, 0xd5, 0xec, 0x1b, 0x89, 0x5c, 0xb9, 0x72, 0xe5, 0xca, 0x95, + 0x2b, 0x57, 0xae, 0x5c, 0xb9, 0x72, 0xe5, 0xca, 0x95, 0x2b, 0x57, 0xae, + 0x5c, 0xb9, 0x72, 0xe5, 0xca, 0x95, 0x2b, 0x57, 0xae, 0x5c, 0xb9, 0x72, + 0xe5, 0xca, 0xb5, 0x1a, 0xe5, 0x50, 0xad, 0x5c, 0xb9, 0x72, 0xe5, 0xca, + 0x95, 0xeb, 0x47, 0x40, 0x6e, 0xf2, 0x43, 0xbc, 0xcc, 0x47, 0xc4, 0x8d, + 0x66, 0x0c, 0xde, 0x92, 0xcd, 0x06, 0x3b, 0xc3, 0x4e, 0xca, 0x00, 0x00, + 0x20, 0x00, 0x49, 0x44, 0x41, 0x54, 0xa2, 0xcf, 0x8e, 0x5b, 0xf0, 0x68, + 0x9e, 0x4a, 0x0b, 0xd9, 0x44, 0xad, 0x74, 0x49, 0xbc, 0x4a, 0x6f, 0x16, + 0xec, 0x50, 0x5a, 0xef, 0x60, 0x5b, 0x76, 0xf4, 0xa1, 0xb9, 0xb3, 0xd6, + 0x4a, 0xcf, 0xc6, 0x05, 0xec, 0xb5, 0x36, 0xac, 0x85, 0xda, 0xd1, 0x39, + 0xac, 0x7e, 0x07, 0xef, 0x94, 0x47, 0xd8, 0x8c, 0x57, 0x36, 0xaf, 0x56, + 0x87, 0xd3, 0x81, 0x26, 0xc0, 0x05, 0x96, 0x65, 0xe3, 0x9d, 0xd6, 0xe0, + 0x97, 0x05, 0x35, 0xe1, 0xa5, 0x68, 0xd9, 0x11, 0x10, 0xc5, 0xb2, 0xd4, + 0x47, 0x80, 0x14, 0x04, 0x52, 0x43, 0xab, 0x96, 0x83, 0x4f, 0x54, 0x36, + 0x57, 0xa0, 0x28, 0x68, 0xb5, 0x5b, 0x54, 0x36, 0x5f, 0xa2, 0xc2, 0xcb, + 0x4c, 0x9d, 0xb1, 0x2f, 0x1b, 0x86, 0x36, 0x4c, 0xcd, 0x4e, 0x51, 0xb4, + 0x05, 0xb5, 0x67, 0xe7, 0xa1, 0x20, 0xb0, 0xd7, 0x3a, 0xc8, 0x36, 0x8c, + 0x5e, 0xa9, 0x3f, 0xf5, 0x14, 0x02, 0xbf, 0x5e, 0x4b, 0xf9, 0x35, 0xe0, + 0xac, 0x70, 0x29, 0xa0, 0x15, 0x36, 0x28, 0x5a, 0x89, 0x8f, 0x4b, 0x97, + 0x02, 0xac, 0xfe, 0x92, 0xb6, 0x0b, 0x11, 0x6b, 0x7a, 0x4f, 0xf0, 0xb9, + 0x20, 0x15, 0x04, 0x34, 0x34, 0xac, 0xc7, 0xb5, 0x15, 0x28, 0xab, 0x20, + 0xe2, 0x65, 0xec, 0x25, 0x70, 0x3a, 0x61, 0x6b, 0x17, 0xe1, 0x74, 0x03, + 0xb6, 0xda, 0x31, 0x54, 0xcb, 0xf8, 0x4f, 0xb8, 0x39, 0xfd, 0x82, 0xb0, + 0x0b, 0x6c, 0xca, 0xb8, 0xd5, 0x4e, 0xf8, 0x0a, 0xf6, 0x91, 0x81, 0x4e, + 0x39, 0x25, 0xeb, 0x82, 0x20, 0x55, 0x40, 0x0c, 0xd4, 0xca, 0xfa, 0x2b, + 0x88, 0xc8, 0x4f, 0x14, 0x5f, 0xa1, 0x13, 0xe0, 0xd5, 0x08, 0xbb, 0x4c, + 0x5a, 0xd0, 0x7e, 0x8d, 0x3f, 0xa4, 0xec, 0xee, 0xaf, 0x47, 0x3a, 0xa1, + 0x33, 0x6f, 0xa0, 0x80, 0x5a, 0xca, 0x5f, 0x06, 0x16, 0x96, 0x28, 0x17, + 0x50, 0xf7, 0x57, 0xcf, 0xf8, 0xda, 0x69, 0xff, 0x51, 0x39, 0x5f, 0xe0, + 0x2c, 0xae, 0x24, 0x40, 0xab, 0xdb, 0x71, 0x56, 0x42, 0x94, 0x56, 0x05, + 0xda, 0xca, 0xca, 0x00, 0xb4, 0xdc, 0x4b, 0x1d, 0xe2, 0x4f, 0xff, 0xe3, + 0x8f, 0x90, 0xcd, 0xc4, 0x8f, 0x68, 0x95, 0x75, 0xbd, 0x9a, 0x38, 0xc4, + 0x70, 0x2d, 0x00, 0xfa, 0xd4, 0x6a, 0xc5, 0x59, 0xf9, 0xbe, 0xcf, 0xe4, + 0xc1, 0xee, 0xb0, 0x83, 0xd1, 0xed, 0xa3, 0x1d, 0x6e, 0x95, 0x4a, 0x85, + 0x2f, 0xfc, 0x61, 0xe7, 0x0a, 0xe8, 0xdb, 0x47, 0xb6, 0x47, 0xd0, 0xbe, + 0xa4, 0xa6, 0x0e, 0x4d, 0x51, 0x3b, 0x51, 0xeb, 0x70, 0xef, 0x16, 0xb6, + 0x6c, 0x4b, 0x1e, 0x7a, 0xb8, 0x13, 0x02, 0x01, 0xb0, 0xf3, 0xba, 0x9d, + 0xb8, 0xa4, 0x3f, 0x72, 0x9e, 0x3a, 0xd4, 0x1d, 0xdf, 0x20, 0xf5, 0xef, + 0xcd, 0x94, 0x8d, 0x99, 0x94, 0x33, 0x73, 0x44, 0x4d, 0x84, 0x67, 0xcb, + 0xf2, 0xf7, 0x7f, 0xd8, 0x0b, 0xf0, 0x92, 0xeb, 0x87, 0x22, 0xab, 0x0b, + 0x4c, 0x0f, 0xd4, 0x75, 0x0d, 0x9b, 0xbd, 0xc1, 0x59, 0x46, 0xd1, 0xbd, + 0xb0, 0x8a, 0x49, 0x51, 0x1b, 0x07, 0x06, 0x38, 0x78, 0xf0, 0x20, 0xc0, + 0x2b, 0x06, 0xab, 0xca, 0x6a, 0x61, 0x65, 0x93, 0xd8, 0xf6, 0xd4, 0x29, + 0x0e, 0xde, 0x73, 0x8f, 0x4a, 0xcf, 0xad, 0xb7, 0x72, 0x6a, 0x61, 0x81, + 0x8b, 0x0e, 0x1e, 0xe4, 0x7d, 0x77, 0xdf, 0xbd, 0x6a, 0xa0, 0xd6, 0x6a, + 0xa0, 0x60, 0xd9, 0xf4, 0xdd, 0x06, 0xec, 0x18, 0x18, 0xb8, 0x60, 0xbf, + 0xff, 0x90, 0x64, 0x7e, 0x47, 0x5f, 0xfc, 0x93, 0xc7, 0xb9, 0xe9, 0x28, + 0xf0, 0xdb, 0x57, 0x47, 0xe7, 0x6e, 0xbb, 0xa2, 0xca, 0xde, 0xc3, 0xdd, + 0x90, 0x37, 0x70, 0xe3, 0xa5, 0x25, 0x04, 0xe0, 0x2f, 0x05, 0x1c, 0x58, + 0x84, 0xdd, 0xdb, 0x4a, 0xd1, 0xb9, 0xfb, 0x8e, 0x05, 0xec, 0x5c, 0x0f, + 0x32, 0xfa, 0x4d, 0xc6, 0x13, 0x82, 0x1d, 0xd7, 0xa1, 0x71, 0x4e, 0xa6, + 0x56, 0x49, 0x97, 0x6d, 0x70, 0x36, 0x38, 0xb4, 0x1a, 0x0d, 0x42, 0x0d, + 0x09, 0x89, 0x7c, 0x9a, 0xfa, 0x3a, 0xd1, 0x9e, 0xfe, 0x53, 0xb0, 0x97, + 0xcd, 0x90, 0x46, 0x7f, 0x97, 0x3a, 0x39, 0x19, 0x4e, 0xb2, 0x81, 0xfe, + 0x11, 0xae, 0x9f, 0x27, 0x0f, 0x75, 0x77, 0xb7, 0x7f, 0x40, 0x23, 0x75, + 0xe1, 0xb1, 0xfd, 0x2f, 0x1f, 0xac, 0xd5, 0x4d, 0x37, 0xde, 0xa9, 0xfe, + 0x8c, 0xbe, 0x3d, 0x05, 0xbf, 0xe1, 0xc1, 0x93, 0x53, 0x70, 0xa4, 0x13, + 0xfa, 0xf8, 0x6a, 0x6a, 0xdf, 0xb1, 0x1e, 0x85, 0x9e, 0x3c, 0x97, 0xb1, + 0x99, 0x7b, 0xfc, 0xbe, 0x0e, 0x5b, 0x8f, 0x8a, 0xde, 0xe6, 0x7a, 0xb5, + 0x54, 0xbd, 0x80, 0x89, 0xdc, 0xa0, 0xea, 0x92, 0x64, 0x2b, 0xdf, 0x0d, + 0x0e, 0x95, 0x3c, 0x9f, 0x85, 0x6c, 0x49, 0xed, 0xb6, 0x1c, 0x50, 0xab, + 0x9b, 0xfb, 0x4a, 0xe7, 0x8d, 0x7b, 0x37, 0xf0, 0x55, 0x37, 0xb7, 0xe5, + 0x94, 0x8c, 0xc3, 0xe4, 0xe5, 0xad, 0x89, 0x7d, 0x93, 0x97, 0x75, 0x2c, + 0x0f, 0xd4, 0x7a, 0x39, 0xf9, 0x48, 0xc6, 0x67, 0xd4, 0xcd, 0xcd, 0x28, + 0x7b, 0x5d, 0x56, 0x93, 0x86, 0xac, 0xfc, 0x67, 0x7d, 0xe6, 0x0f, 0xce, + 0x51, 0xbd, 0x6a, 0x10, 0x6b, 0x7d, 0x11, 0xef, 0xd8, 0x3c, 0xd6, 0x80, + 0xcb, 0x25, 0x03, 0x2e, 0x2d, 0x12, 0x4f, 0x41, 0x1a, 0x24, 0x12, 0x3d, + 0xf3, 0x69, 0x80, 0xae, 0x2f, 0x88, 0x61, 0x38, 0xfa, 0x19, 0xa4, 0xb4, + 0xde, 0xe1, 0xbe, 0x83, 0x3e, 0xd5, 0xab, 0x06, 0xa1, 0x04, 0xfe, 0xc3, + 0x73, 0x38, 0x5b, 0x06, 0x61, 0x11, 0xbc, 0x2d, 0x32, 0x0a, 0x53, 0x14, + 0xd3, 0x7d, 0xcc, 0xc9, 0x2f, 0x4b, 0x06, 0x77, 0x40, 0xb5, 0x5a, 0x61, + 0x7e, 0x7e, 0x1e, 0xff, 0x19, 0xdd, 0x57, 0xb8, 0xb4, 0xca, 0x81, 0xfb, + 0x6b, 0xf8, 0x81, 0x64, 0xe8, 0x9a, 0x61, 0xa4, 0x6c, 0xe0, 0xd5, 0x75, + 0xfd, 0x18, 0xa8, 0xb1, 0x1c, 0x57, 0xa4, 0xe1, 0x18, 0x46, 0x8f, 0x7e, + 0x19, 0x86, 0xaf, 0x83, 0xa1, 0xa1, 0x61, 0x82, 0x25, 0x05, 0xce, 0x02, + 0x38, 0x70, 0x0f, 0x94, 0xb6, 0x38, 0x94, 0xb6, 0x38, 0x10, 0x80, 0x77, + 0xca, 0x63, 0x68, 0x68, 0x98, 0x6b, 0xaf, 0x01, 0xbf, 0x2d, 0xa3, 0x89, + 0xe1, 0x46, 0x32, 0xfa, 0x0f, 0x1e, 0xd5, 0x64, 0xbd, 0xb9, 0x00, 0xae, + 0xbd, 0x46, 0xed, 0x9b, 0xf8, 0x5b, 0xcd, 0x16, 0x3b, 0xab, 0x44, 0xe3, + 0x52, 0x25, 0xbd, 0xdd, 0x59, 0x8d, 0xc3, 0x2a, 0x6f, 0x88, 0xa1, 0x05, + 0x63, 0x1a, 0x26, 0x56, 0x75, 0xa0, 0xea, 0xa8, 0xf2, 0xa8, 0x6e, 0x10, + 0xc8, 0x6e, 0x93, 0x48, 0xb7, 0x74, 0xef, 0x6f, 0xaf, 0x96, 0x4b, 0xf0, + 0x64, 0x0f, 0x08, 0x55, 0x2f, 0x10, 0xdc, 0x55, 0xbf, 0xf9, 0xcf, 0xe8, + 0xee, 0x03, 0xfe, 0xf2, 0xe0, 0xdf, 0xf3, 0x37, 0x47, 0x96, 0x87, 0x55, + 0xbd, 0xfd, 0xe3, 0xaf, 0xe1, 0x1b, 0xbf, 0xff, 0xf7, 0xab, 0x4b, 0x5c, + 0x0f, 0xf5, 0x4a, 0xdb, 0xdb, 0x3f, 0xfe, 0x9a, 0x9e, 0x69, 0xfb, 0x1f, + 0xad, 0x17, 0x99, 0xf9, 0x9d, 0x38, 0xde, 0xb7, 0xe9, 0x6d, 0x96, 0x53, + 0xb4, 0x26, 0x73, 0xec, 0xd8, 0xaf, 0xe1, 0x5b, 0x8d, 0xd8, 0x5f, 0x11, + 0xf8, 0xbb, 0xc4, 0xf9, 0xff, 0xef, 0x7b, 0x2f, 0xf2, 0x66, 0xbd, 0xdf, + 0xfc, 0xde, 0x8b, 0x04, 0xdf, 0x7b, 0x91, 0x33, 0x74, 0x0c, 0x41, 0xf2, + 0x13, 0x7d, 0x17, 0x71, 0xb6, 0xb9, 0x7c, 0xd9, 0xec, 0x22, 0x86, 0x64, + 0x9d, 0x84, 0x08, 0x9e, 0x65, 0xdc, 0x9a, 0x2f, 0xbc, 0xc8, 0xdf, 0xea, + 0xfd, 0x4d, 0xda, 0x86, 0x84, 0xdd, 0x4a, 0x4a, 0x42, 0xb0, 0x1c, 0x0d, + 0xb7, 0x72, 0x4a, 0x2e, 0x5e, 0x6d, 0x92, 0x90, 0x6a, 0x74, 0xec, 0xd7, + 0xe6, 0xa9, 0x54, 0xaa, 0x11, 0xa8, 0xca, 0x28, 0x3e, 0x9e, 0x67, 0xe6, + 0x90, 0x8f, 0x5b, 0xa9, 0x44, 0xe1, 0xa4, 0x60, 0x59, 0x89, 0xf0, 0x01, + 0x8e, 0x03, 0x97, 0x94, 0x14, 0x08, 0xce, 0x41, 0x8d, 0x05, 0x0e, 0xeb, + 0xf0, 0x7d, 0xd4, 0xf4, 0x73, 0xbb, 0xe4, 0x82, 0xb1, 0xaf, 0xc1, 0x25, + 0x15, 0x70, 0x70, 0x15, 0x58, 0x2b, 0x91, 0x7e, 0x08, 0x71, 0x4a, 0xd5, + 0x44, 0x5e, 0xe6, 0x09, 0xa9, 0x6a, 0x28, 0x56, 0x1c, 0x67, 0x36, 0x2d, + 0x06, 0xda, 0x65, 0x35, 0x54, 0x1f, 0x56, 0x41, 0xbb, 0x54, 0x9e, 0x2a, + 0x40, 0x2d, 0x00, 0x85, 0xf7, 0xb2, 0xf4, 0xbe, 0xc7, 0x25, 0x25, 0x97, + 0x7f, 0x5f, 0xaa, 0xf1, 0xbb, 0x41, 0xfa, 0x66, 0x2a, 0x5f, 0x0d, 0xfc, + 0x17, 0x14, 0x20, 0xe5, 0x23, 0xc0, 0x1f, 0x75, 0x07, 0x5e, 0x25, 0xd5, + 0x0d, 0xa6, 0x95, 0x85, 0x66, 0x2d, 0x07, 0xd8, 0x5a, 0x09, 0xc0, 0xb5, + 0x9c, 0x5a, 0x05, 0x68, 0xb5, 0xa1, 0xf8, 0x12, 0xfa, 0xc2, 0xd1, 0x62, + 0x14, 0xcb, 0x49, 0xff, 0xd8, 0x0d, 0x50, 0x2b, 0xe9, 0xd6, 0xcb, 0xb6, + 0x97, 0xfb, 0x60, 0xd9, 0x8a, 0x60, 0x5b, 0xe6, 0x78, 0xae, 0x1e, 0xa6, + 0x6c, 0xba, 0xf9, 0xfd, 0xd4, 0xf6, 0xfd, 0xf8, 0x15, 0x78, 0xff, 0x3b, + 0xdf, 0xc1, 0xe0, 0x6f, 0x94, 0x01, 0x05, 0xd0, 0x9a, 0x79, 0x3a, 0xbe, + 0x76, 0x33, 0x4f, 0x27, 0x9e, 0x07, 0x9b, 0x6a, 0xdb, 0xe8, 0xdf, 0xcf, + 0x60, 0xd5, 0x66, 0x6e, 0x5e, 0x8f, 0xa5, 0xd7, 0x54, 0x7e, 0xa7, 0x8e, + 0xd4, 0xb0, 0x3f, 0x56, 0x61, 0xe8, 0xb1, 0x49, 0xf6, 0x3f, 0x66, 0x63, + 0xf5, 0xd9, 0xc8, 0xa5, 0x19, 0xc2, 0x73, 0x1a, 0xf0, 0xb4, 0x51, 0x2f, + 0x24, 0x70, 0x4a, 0xdf, 0x51, 0x6b, 0xc1, 0x12, 0x36, 0x07, 0x9e, 0x3c, + 0xa0, 0x60, 0x5a, 0xe7, 0xba, 0x0d, 0x6d, 0xba, 0x88, 0xcd, 0xf7, 0xc1, + 0xc1, 0x61, 0xa6, 0x0e, 0x4d, 0x31, 0xb6, 0x01, 0xf8, 0xd9, 0x12, 0xe1, + 0xc3, 0x2a, 0x7f, 0x95, 0xfe, 0x21, 0x3c, 0x54, 0x7f, 0xd9, 0x5e, 0x23, + 0x68, 0x20, 0xe1, 0xf4, 0xca, 0x15, 0xb9, 0x25, 0xd2, 0xe3, 0x73, 0xc1, + 0x92, 0xfa, 0xed, 0xcb, 0x76, 0x8b, 0x52, 0xa1, 0xa2, 0xc6, 0xc0, 0x33, + 0x0a, 0x97, 0x6a, 0x09, 0xbf, 0xea, 0x7c, 0x47, 0x6b, 0xd9, 0xf1, 0x7b, + 0x59, 0xfd, 0x60, 0xad, 0x29, 0x5f, 0x15, 0x47, 0xa9, 0xe3, 0xbc, 0x01, + 0x6a, 0x15, 0x35, 0xe4, 0xc1, 0x0f, 0x6a, 0x58, 0xc2, 0x22, 0x94, 0xea, + 0x49, 0x3e, 0x94, 0x0a, 0xc8, 0x22, 0xdb, 0x32, 0x7a, 0xb2, 0x0f, 0xa3, + 0x46, 0x2d, 0x59, 0x26, 0xfa, 0x7a, 0x58, 0x9d, 0x63, 0xa0, 0x1d, 0x71, + 0xae, 0xc2, 0x66, 0x65, 0x7f, 0xab, 0x5f, 0x84, 0x20, 0x0b, 0xd3, 0xea, + 0x26, 0xf3, 0xe6, 0x67, 0x39, 0xf8, 0x59, 0x52, 0x23, 0xc0, 0x34, 0x31, + 0x3c, 0x6b, 0x44, 0x6f, 0xeb, 0x19, 0x9b, 0x3a, 0x30, 0xb1, 0x47, 0x1d, + 0x97, 0x47, 0x62, 0xa0, 0xd4, 0xc4, 0xb4, 0xf2, 0xbb, 0x47, 0x87, 0x31, + 0x3d, 0xdd, 0x09, 0xa6, 0x02, 0x05, 0x8f, 0x1a, 0x29, 0x2b, 0xa8, 0x15, + 0xc0, 0x9e, 0x84, 0xcd, 0x1e, 0x0d, 0xa1, 0x2a, 0x27, 0xe2, 0x88, 0xfc, + 0xd1, 0x05, 0x74, 0x35, 0xa2, 0xc0, 0x5c, 0x10, 0x87, 0x97, 0x34, 0xa9, + 0x4f, 0x2b, 0x26, 0x97, 0x01, 0x6b, 0x75, 0x93, 0xf2, 0x5f, 0xef, 0xf0, + 0x67, 0xf2, 0x66, 0xe2, 0xdd, 0x33, 0xa2, 0xed, 0xd1, 0x65, 0x52, 0x27, + 0x5d, 0x38, 0x28, 0xd0, 0xd7, 0x2b, 0xa5, 0xb2, 0xbe, 0x12, 0xbd, 0x82, + 0x1c, 0x19, 0x81, 0x91, 0x69, 0x98, 0x1e, 0x41, 0xc1, 0xff, 0xc7, 0xeb, + 0x84, 0xe3, 0xf0, 0x01, 0x7a, 0xf7, 0x63, 0x8c, 0x52, 0x8b, 0x6e, 0x14, + 0x84, 0x02, 0xc7, 0x67, 0x3a, 0x76, 0xb2, 0x19, 0xa6, 0x16, 0xc9, 0xe8, + 0x19, 0x56, 0x9f, 0x15, 0xbf, 0x67, 0x6c, 0x4b, 0xfd, 0x2e, 0x34, 0x04, + 0x21, 0xa2, 0xbe, 0xa2, 0x6c, 0xcb, 0xd4, 0x3e, 0x24, 0x16, 0xe1, 0x48, + 0x1c, 0x63, 0xc6, 0x8f, 0xda, 0x31, 0x3c, 0x4b, 0xea, 0xb4, 0x75, 0x1d, + 0x23, 0xd6, 0x69, 0xef, 0xd8, 0xef, 0x72, 0x9c, 0xf5, 0xff, 0x83, 0xc8, + 0x7f, 0xd8, 0x0c, 0x11, 0x32, 0x4c, 0xa5, 0xd7, 0x0f, 0x3c, 0x9c, 0xf5, + 0x55, 0x4a, 0x25, 0x07, 0x29, 0x25, 0x76, 0x9f, 0x45, 0xe8, 0xfb, 0x94, + 0x1c, 0x07, 0x49, 0x0c, 0xc9, 0xda, 0xbd, 0x59, 0xd5, 0x05, 0xf7, 0x9d, + 0xf0, 0x09, 0x1f, 0x53, 0x63, 0x3f, 0x49, 0xb0, 0x56, 0xf8, 0xd8, 0x7e, + 0x8e, 0x2f, 0xaa, 0x87, 0x9f, 0x0e, 0xb0, 0xd6, 0x72, 0xe9, 0x6b, 0x83, + 0x2c, 0xe8, 0x3f, 0x5d, 0xdf, 0x0d, 0xb5, 0x63, 0x60, 0xb7, 0x6c, 0x4b, + 0xb5, 0xf0, 0x92, 0x50, 0xe5, 0x60, 0x40, 0x59, 0xb2, 0x40, 0xd4, 0x2e, + 0xfa, 0x1a, 0xae, 0xe5, 0x1b, 0x08, 0x57, 0xd2, 0x06, 0x14, 0xc0, 0xb0, + 0x19, 0x52, 0x2d, 0xc0, 0x7c, 0x1b, 0x2a, 0x05, 0xa8, 0xb5, 0xc1, 0x2a, + 0x14, 0xd9, 0x37, 0x04, 0x37, 0x3e, 0xd9, 0x62, 0xb0, 0xa0, 0xc0, 0x57, + 0xbe, 0xf6, 0x7f, 0xaf, 0x80, 0x5b, 0xa4, 0x1a, 0x47, 0xbb, 0x03, 0x05, + 0x96, 0xf2, 0x74, 0x5a, 0xb2, 0xed, 0xc3, 0x50, 0x5b, 0x01, 0x7f, 0x5a, + 0x6d, 0xc5, 0xb0, 0xf1, 0x35, 0x14, 0xcc, 0x6f, 0x0b, 0x3e, 0xf5, 0x69, + 0x87, 0x4f, 0xde, 0xd1, 0x88, 0xe0, 0x56, 0x3a, 0x65, 0xf8, 0x80, 0xad, + 0x17, 0x95, 0x42, 0x42, 0x4b, 0xb4, 0x28, 0xea, 0x96, 0xa8, 0xdb, 0x5b, + 0xbb, 0x6a, 0x41, 0xf7, 0xdb, 0x12, 0x6d, 0x9a, 0x28, 0x08, 0x0c, 0x72, + 0xf8, 0xf6, 0x42, 0x0c, 0xbf, 0x72, 0x0a, 0x45, 0x7c, 0x5d, 0x5f, 0x9b, + 0x38, 0x5b, 0x6d, 0x05, 0xc5, 0x92, 0x52, 0xfb, 0x88, 0x89, 0xe8, 0xb8, + 0x3a, 0xfd, 0x76, 0x41, 0xed, 0xcf, 0x49, 0xc9, 0x6c, 0x9f, 0x60, 0xec, + 0x4a, 0x05, 0xde, 0xba, 0xa4, 0x00, 0xc7, 0xdb, 0x92, 0xa2, 0xce, 0x23, + 0x28, 0xa0, 0x96, 0x5d, 0x80, 0x3b, 0xda, 0xc9, 0x7c, 0x2d, 0xaf, 0x24, + 0xc0, 0x29, 0x0b, 0x91, 0x4a, 0xc2, 0xa3, 0x92, 0x32, 0xd0, 0xab, 0x2c, + 0xd0, 0xc9, 0xc0, 0xa2, 0x4c, 0xb8, 0x49, 0x78, 0x55, 0x12, 0x20, 0x95, + 0x84, 0x5c, 0x25, 0xdd, 0xbb, 0xa5, 0xc9, 0xec, 0x67, 0xd3, 0x62, 0xe2, + 0x3e, 0xef, 0x9f, 0x4d, 0x01, 0xaf, 0x8c, 0x2d, 0xc0, 0xe8, 0xa8, 0x7a, + 0xbf, 0x38, 0x35, 0x35, 0x95, 0x82, 0x59, 0x25, 0xd3, 0x93, 0x04, 0x78, + 0x19, 0x98, 0xd6, 0x4a, 0x61, 0xae, 0x39, 0x73, 0x26, 0x95, 0x9e, 0x2c, + 0xbc, 0xcb, 0x00, 0xaf, 0xcc, 0x39, 0x13, 0x96, 0xd9, 0x9e, 0xf7, 0xcf, + 0x46, 0x65, 0x63, 0xec, 0x47, 0x47, 0x47, 0x23, 0x68, 0x58, 0x32, 0xee, + 0xf3, 0xfe, 0x59, 0xce, 0x24, 0xf2, 0x6f, 0xd2, 0x6b, 0x6c, 0x4c, 0xba, + 0xba, 0x5d, 0xa7, 0xac, 0x64, 0x01, 0xfc, 0x35, 0x2e, 0x0d, 0x3f, 0xa4, + 0x3c, 0xa0, 0xbe, 0x8d, 0xf0, 0x16, 0x3c, 0x64, 0xb3, 0x45, 0x65, 0x83, + 0x43, 0xe5, 0xf2, 0x2a, 0xfe, 0x52, 0xc8, 0xfc, 0xd1, 0x79, 0x5c, 0xdb, + 0x62, 0xff, 0xe1, 0x1a, 0xbb, 0xb7, 0x96, 0x99, 0x11, 0xca, 0x56, 0x86, + 0x12, 0x84, 0x8d, 0xd4, 0xd0, 0x51, 0x77, 0x6d, 0x99, 0xb0, 0x59, 0xa7, + 0x32, 0x50, 0xc1, 0xb2, 0x4a, 0xf8, 0x0b, 0x1e, 0x8d, 0x96, 0x72, 0xaf, + 0x6c, 0x73, 0x11, 0xed, 0x22, 0xf3, 0xc7, 0x66, 0xb0, 0xd6, 0x5a, 0xd4, + 0x6a, 0xf3, 0x54, 0xaf, 0x1c, 0xa5, 0xb6, 0x30, 0x8f, 0xdb, 0x5f, 0xc2, + 0xb2, 0x1c, 0x02, 0xbd, 0xe0, 0x8f, 0x59, 0x50, 0xc7, 0xbd, 0xd4, 0xf4, + 0x1d, 0x2d, 0x2c, 0x4b, 0xdd, 0x77, 0x61, 0xd8, 0xc2, 0x19, 0x70, 0x09, + 0xc3, 0x00, 0x0b, 0x41, 0x18, 0xb6, 0x10, 0xfd, 0x25, 0x4a, 0x03, 0xfa, + 0xbe, 0x0c, 0x3c, 0x4a, 0x25, 0x17, 0x29, 0x4b, 0xc8, 0xa5, 0x90, 0x92, + 0x65, 0xe1, 0xf4, 0xd9, 0x78, 0x1a, 0xb2, 0x05, 0xc4, 0xef, 0x81, 0x07, + 0x6c, 0x64, 0x08, 0x32, 0x08, 0x70, 0xca, 0x0e, 0x7e, 0x3d, 0x33, 0x86, + 0x2d, 0x8a, 0x58, 0x56, 0x0b, 0x54, 0x11, 0x53, 0x29, 0x3b, 0x4c, 0x2e, + 0x78, 0xc8, 0xbe, 0x10, 0xa7, 0xed, 0x53, 0xba, 0x72, 0x0c, 0xa4, 0x50, + 0xdf, 0xf0, 0x14, 0xd4, 0xfd, 0x26, 0xb3, 0xfd, 0xd0, 0xa2, 0x88, 0xc0, + 0x76, 0x69, 0xf4, 0x78, 0x62, 0x34, 0xac, 0x25, 0x63, 0xb0, 0x96, 0x54, + 0xee, 0xb6, 0x65, 0x45, 0xfd, 0x4c, 0x90, 0x0a, 0xc0, 0x25, 0x24, 0xe2, + 0xb5, 0xe0, 0x58, 0x0e, 0x61, 0x3b, 0x7e, 0xdf, 0x51, 0xec, 0xeb, 0x3e, + 0x96, 0x94, 0xd4, 0xb7, 0x4e, 0x84, 0x9c, 0xfd, 0x9b, 0x6f, 0x01, 0xb0, + 0x18, 0x2c, 0xf0, 0xce, 0xb7, 0xbf, 0x3b, 0x3a, 0x4e, 0x6a, 0xdd, 0x4f, + 0xbe, 0x25, 0x75, 0xfc, 0xc8, 0x97, 0x1e, 0x65, 0x7d, 0x69, 0x20, 0x3a, + 0x5e, 0x0c, 0x16, 0xa2, 0xe3, 0x75, 0x3f, 0xf9, 0x96, 0x28, 0x8c, 0xac, + 0x3f, 0x03, 0xbf, 0x3a, 0xfb, 0x37, 0xdf, 0xea, 0x88, 0xc7, 0x84, 0xf1, + 0x85, 0xcf, 0x29, 0xf7, 0x64, 0xf8, 0xdd, 0xfc, 0x3d, 0x77, 0xea, 0x34, + 0xb3, 0x7f, 0xf6, 0x8d, 0xc8, 0xc6, 0x9c, 0x7b, 0xee, 0x94, 0xfa, 0x90, + 0x26, 0x09, 0xd4, 0x32, 0xaa, 0xcd, 0x7d, 0xa7, 0x23, 0x2c, 0x13, 0xef, + 0x9f, 0x7f, 0xe3, 0x29, 0xd6, 0x97, 0x06, 0x22, 0x28, 0xd6, 0xec, 0x9f, + 0x7d, 0x83, 0xf5, 0xa5, 0x81, 0x28, 0x3c, 0x93, 0x0e, 0xb5, 0x4d, 0xa4, + 0xf9, 0xcf, 0xd2, 0xf9, 0x9e, 0xfd, 0x33, 0xf8, 0xfa, 0xd3, 0xe9, 0x77, + 0x08, 0xbd, 0xf2, 0x9d, 0x8c, 0xdf, 0xe8, 0xb9, 0x53, 0xa7, 0x61, 0xa2, + 0xae, 0x0e, 0xf6, 0x10, 0xc3, 0xb4, 0x26, 0xea, 0x24, 0xe8, 0xaa, 0xba, + 0x43, 0x5c, 0x57, 0x1d, 0xc9, 0x91, 0x32, 0xb9, 0x72, 0xe5, 0xca, 0x95, + 0x2b, 0x57, 0xae, 0x5c, 0xb9, 0x72, 0xe5, 0xca, 0x95, 0x2b, 0x57, 0xae, + 0x5c, 0xb9, 0x72, 0xe5, 0xca, 0x95, 0x2b, 0x57, 0xae, 0x5c, 0xb9, 0x72, + 0xe5, 0xca, 0x95, 0xeb, 0xa5, 0x2b, 0x87, 0x6a, 0xe5, 0xca, 0x95, 0x2b, + 0x57, 0xae, 0x5c, 0xaf, 0x96, 0x76, 0x68, 0x58, 0xd6, 0x09, 0x09, 0x9b, + 0x65, 0xd7, 0xc9, 0x23, 0x00, 0x45, 0x21, 0x68, 0x2c, 0x85, 0x11, 0x64, + 0x41, 0x36, 0x1b, 0x48, 0x29, 0xb1, 0x4a, 0x0e, 0xc8, 0x90, 0x22, 0x56, + 0x04, 0xd6, 0x6a, 0x2c, 0x2a, 0x1b, 0x03, 0x87, 0x92, 0xfa, 0x63, 0x5f, + 0xda, 0x89, 0xf0, 0x65, 0xbc, 0x3c, 0xad, 0x7f, 0x2e, 0xc4, 0x59, 0xab, + 0x6d, 0x28, 0x46, 0xf3, 0x4e, 0x1a, 0xbe, 0x8f, 0xe8, 0xb7, 0x09, 0xf5, + 0xc7, 0x90, 0x0d, 0x19, 0xd2, 0x08, 0x43, 0xd0, 0x2b, 0x10, 0x47, 0xca, + 0xf4, 0x24, 0xfc, 0xa5, 0x46, 0x07, 0x2c, 0xa9, 0x15, 0x36, 0x08, 0x43, + 0x1f, 0xdb, 0xb2, 0xa3, 0xd5, 0xcf, 0x69, 0xcb, 0x08, 0x96, 0x60, 0xf5, + 0x97, 0x52, 0xab, 0x19, 0xcb, 0x36, 0x04, 0x41, 0x40, 0x65, 0x73, 0x05, + 0xcb, 0x2e, 0xc5, 0xab, 0xf7, 0xea, 0x0f, 0x1a, 0x4b, 0xe5, 0x68, 0x0a, + 0xab, 0xfa, 0x7c, 0xb9, 0x0d, 0x5e, 0xe0, 0x23, 0x97, 0xc2, 0x68, 0x12, + 0x9b, 0x0c, 0x02, 0xc2, 0x20, 0xc0, 0xdd, 0x9a, 0x98, 0xf9, 0x29, 0x65, + 0xc7, 0xc4, 0x26, 0x7b, 0x8d, 0xc0, 0xf3, 0xea, 0xb4, 0x34, 0xf4, 0xab, + 0x15, 0x36, 0x08, 0x9a, 0x21, 0xee, 0x7a, 0xfd, 0xb1, 0x66, 0x22, 0x2f, + 0xc1, 0xe9, 0x3a, 0xab, 0x91, 0x3c, 0xa1, 0x3f, 0x9b, 0xdc, 0xd1, 0x80, + 0x2f, 0x2b, 0x37, 0x6b, 0xab, 0xca, 0x5d, 0xb0, 0x18, 0x42, 0x39, 0x51, + 0x3e, 0x06, 0x8e, 0x95, 0xfc, 0x68, 0x3f, 0xf9, 0x61, 0x65, 0x5b, 0x4f, + 0x4c, 0x6a, 0x03, 0x89, 0x89, 0x3e, 0x2c, 0x6a, 0x08, 0x92, 0xf6, 0x6f, + 0x0b, 0x7a, 0x02, 0xb5, 0x92, 0xa0, 0xa8, 0x2c, 0xc0, 0x2c, 0x0b, 0xaa, + 0xb2, 0x2d, 0x11, 0x1d, 0x1b, 0xc8, 0x50, 0x65, 0x73, 0x7a, 0x32, 0xcf, + 0xfc, 0x09, 0x8f, 0x46, 0x82, 0x4f, 0x11, 0xf9, 0x49, 0x00, 0xb5, 0x56, + 0x13, 0x9f, 0x6d, 0x29, 0xbb, 0x6e, 0x7e, 0x45, 0x81, 0x08, 0x10, 0xd7, + 0x2d, 0x9d, 0xa9, 0x3c, 0x26, 0xfc, 0x65, 0xd3, 0x1a, 0x86, 0x2d, 0x1a, + 0x09, 0x98, 0x86, 0xdd, 0x6f, 0xd1, 0x58, 0x0a, 0xa3, 0xb2, 0x4a, 0xa5, + 0x75, 0xb5, 0xf1, 0x25, 0xca, 0x34, 0xa8, 0xab, 0x89, 0x8c, 0xd6, 0x56, + 0x01, 0xe6, 0xdb, 0xc9, 0xc4, 0x7d, 0x7d, 0x61, 0xcc, 0xad, 0x6e, 0x93, + 0x8b, 0x83, 0x65, 0x8f, 0x57, 0x52, 0xed, 0x44, 0x0d, 0xd1, 0xa3, 0x5e, + 0xe9, 0x26, 0xdb, 0xea, 0x5c, 0xdd, 0xb4, 0xd7, 0xa4, 0x8f, 0x6e, 0xb6, + 0x06, 0x9e, 0xb7, 0x9c, 0xbf, 0x48, 0x2b, 0x3c, 0x85, 0x64, 0xc3, 0x4f, + 0x4e, 0x58, 0x31, 0x50, 0xc0, 0x97, 0x2a, 0xa7, 0xdf, 0xa1, 0x25, 0xd3, + 0x13, 0xcc, 0x02, 0x5d, 0xb6, 0x26, 0x6c, 0x13, 0xbe, 0x6d, 0xd9, 0xb4, + 0x64, 0x8b, 0x7a, 0xf2, 0xbe, 0x7e, 0x4c, 0xf9, 0x49, 0xde, 0xd7, 0xe5, + 0x72, 0x79, 0xd5, 0xf1, 0xd7, 0xeb, 0xf5, 0x0b, 0xb2, 0x7f, 0x29, 0x7e, + 0xfe, 0x21, 0xdb, 0xbf, 0x94, 0xb0, 0x0d, 0x00, 0xb1, 0x9b, 0x64, 0xb3, + 0x13, 0xa8, 0x13, 0xe8, 0x7a, 0xa1, 0x94, 0x05, 0xf3, 0xf4, 0x09, 0x55, + 0x4f, 0x67, 0xee, 0xeb, 0xb5, 0x5b, 0x15, 0x75, 0xee, 0xf4, 0x62, 0x73, + 0xd5, 0x10, 0xa9, 0xdb, 0x27, 0xa6, 0x01, 0x78, 0x60, 0xba, 0xde, 0x91, + 0xa7, 0x5e, 0xd9, 0xbb, 0x62, 0x7c, 0x4f, 0xca, 0x6f, 0xd6, 0xff, 0xff, + 0xe4, 0x85, 0x0e, 0x3f, 0x0b, 0x1a, 0xa8, 0xb5, 0x11, 0x38, 0x78, 0xcf, + 0x3d, 0x0c, 0xec, 0xd8, 0xc1, 0x47, 0x80, 0xaf, 0x9d, 0x3a, 0xc5, 0xc6, + 0x81, 0x81, 0x0e, 0xfb, 0x57, 0x42, 0x1f, 0x01, 0x3e, 0xff, 0x03, 0x02, + 0x8a, 0xfd, 0x30, 0x75, 0x7a, 0xb1, 0x09, 0xf4, 0xab, 0xeb, 0x3b, 0xa5, + 0xc0, 0x01, 0x56, 0x9f, 0xaa, 0xc7, 0x82, 0x44, 0x9b, 0x7b, 0xd3, 0xac, + 0xe4, 0xde, 0x2a, 0x88, 0x03, 0xf1, 0x0c, 0xf4, 0x9b, 0x8e, 0x02, 0x87, + 0xaf, 0xa6, 0x9b, 0xee, 0x3b, 0x96, 0xae, 0xab, 0xf7, 0x1e, 0x49, 0x1f, + 0x1f, 0x58, 0x84, 0xb1, 0x2d, 0x9d, 0x75, 0xa8, 0xdf, 0x90, 0xaa, 0x6e, + 0x34, 0x80, 0xd4, 0xc8, 0x5d, 0xd7, 0xad, 0x99, 0x09, 0xac, 0x61, 0x5b, + 0x59, 0x59, 0xff, 0xc4, 0xec, 0x85, 0x65, 0x41, 0xa2, 0xbd, 0xc9, 0xf6, + 0x3b, 0xbb, 0xb5, 0x3c, 0xe6, 0x7a, 0x5a, 0x7d, 0x8d, 0xa8, 0x2f, 0xa8, + 0xae, 0x75, 0x91, 0x20, 0x94, 0x5c, 0x30, 0x25, 0xf3, 0x65, 0xeb, 0x29, + 0x00, 0x66, 0x8f, 0xbc, 0x03, 0x80, 0xa1, 0xcb, 0xe3, 0x33, 0xb3, 0x47, + 0xd4, 0xb6, 0x62, 0xd5, 0xa9, 0x85, 0xe5, 0x57, 0x3c, 0xe6, 0xe5, 0x80, + 0x5a, 0xaf, 0x18, 0x70, 0xeb, 0xa7, 0x3a, 0x21, 0x98, 0x3f, 0x2c, 0x05, + 0xa1, 0x84, 0xf5, 0xc5, 0xe8, 0x5e, 0x86, 0x44, 0x7b, 0x1d, 0x04, 0xdc, + 0xb8, 0x6d, 0x27, 0x33, 0x66, 0xb2, 0x51, 0x9f, 0x80, 0xb6, 0x00, 0x19, + 0x52, 0x9b, 0x9e, 0xe4, 0xc6, 0x6d, 0xdb, 0x01, 0x10, 0x25, 0x1b, 0xbb, + 0x69, 0xe1, 0x37, 0x3d, 0xf6, 0x1d, 0x3b, 0xc4, 0xe0, 0xd5, 0xbb, 0x95, + 0x7d, 0x11, 0x68, 0x29, 0xc8, 0xd6, 0xee, 0xcb, 0xc7, 0xb0, 0xf5, 0x64, + 0xac, 0x56, 0x3b, 0x64, 0xef, 0xe1, 0x03, 0x91, 0x9d, 0x70, 0x40, 0x36, + 0x2b, 0x70, 0xbe, 0xc6, 0xdc, 0xe3, 0xf7, 0x71, 0xdb, 0x15, 0xd7, 0x03, + 0x60, 0xbb, 0x36, 0x9c, 0x6b, 0xd1, 0x68, 0x4a, 0xf6, 0x1e, 0x7e, 0x88, + 0xe1, 0xeb, 0x3e, 0xa5, 0xe3, 0x83, 0x70, 0xc9, 0x41, 0xb4, 0x7d, 0x66, + 0x1e, 0xf9, 0x34, 0xb7, 0x8f, 0xdc, 0xa0, 0xdc, 0x37, 0x14, 0xe1, 0x5c, + 0x8b, 0xdb, 0x9f, 0xf8, 0x42, 0xca, 0x56, 0x36, 0x81, 0x26, 0x5d, 0x6d, + 0xa5, 0x84, 0x3b, 0xa7, 0x95, 0xbd, 0x28, 0x81, 0xe9, 0x3a, 0x66, 0x6d, + 0xe5, 0x69, 0xd5, 0x0f, 0x32, 0xb6, 0x51, 0xd8, 0xc1, 0x85, 0xd9, 0x9a, + 0xb0, 0x93, 0x79, 0x6c, 0x68, 0xe0, 0xef, 0xde, 0xc3, 0x0f, 0xa5, 0xcb, + 0x44, 0xcf, 0x4d, 0x53, 0x65, 0xb2, 0x93, 0xe2, 0x06, 0x87, 0xd6, 0x69, + 0x1f, 0xd9, 0x96, 0xdc, 0x77, 0x64, 0x52, 0xd9, 0xea, 0x32, 0x36, 0x76, + 0xe6, 0x9a, 0x58, 0xae, 0x4b, 0xe8, 0xa9, 0xe7, 0xbc, 0x7d, 0xc7, 0x0e, + 0x51, 0x19, 0x19, 0x23, 0x98, 0xde, 0x0b, 0x94, 0x53, 0xed, 0xf5, 0xdb, + 0xfb, 0xd6, 0x02, 0xf0, 0xed, 0xe6, 0xe9, 0x0e, 0xe0, 0x42, 0xaf, 0x3b, + 0x3d, 0x09, 0x70, 0x4a, 0x3e, 0x89, 0xfd, 0xff, 0xec, 0xbd, 0x7f, 0x90, + 0xde, 0xc6, 0x79, 0xe7, 0xf9, 0x71, 0xf6, 0xf5, 0xa5, 0xdf, 0xcd, 0x4b, + 0x07, 0xa8, 0x1d, 0x26, 0x80, 0x38, 0x4c, 0x5e, 0xb8, 0x28, 0x8b, 0x2f, + 0x8f, 0x8a, 0xf4, 0x72, 0x49, 0x6f, 0x66, 0x4e, 0xca, 0x0e, 0x27, 0x52, + 0xca, 0x9a, 0xb2, 0x52, 0x11, 0x6d, 0xe7, 0xce, 0xa2, 0x7d, 0x3b, 0x91, + 0x94, 0xab, 0xb2, 0x45, 0xdb, 0xb5, 0x67, 0x2a, 0xc9, 0x9e, 0xac, 0x64, + 0x12, 0x59, 0xd9, 0xe4, 0x24, 0x25, 0x6b, 0x8b, 0x94, 0xb3, 0x89, 0xa5, + 0xcc, 0x95, 0x23, 0xe9, 0x36, 0xb2, 0xa9, 0x6c, 0xe4, 0x0c, 0x5d, 0xd1, + 0x65, 0x38, 0x8e, 0x74, 0x33, 0xba, 0x50, 0x99, 0x97, 0x5a, 0xb2, 0xf8, + 0x8e, 0x4c, 0x96, 0x01, 0x9b, 0x43, 0x01, 0x0e, 0x67, 0x0f, 0x58, 0xe9, + 0x2d, 0xbf, 0xed, 0xf3, 0x9b, 0xf8, 0xfe, 0xe8, 0x6e, 0x00, 0xef, 0xaf, + 0x99, 0x21, 0x2d, 0xff, 0x4a, 0xf0, 0xad, 0x9a, 0x01, 0xd0, 0x78, 0xfa, + 0xe9, 0x6e, 0xe0, 0x45, 0xa3, 0xd1, 0x8d, 0xfe, 0xa0, 0xd7, 0x36, 0xbf, + 0x7d, 0xb9, 0xd0, 0xa7, 0xcd, 0x68, 0x50, 0xde, 0x5e, 0x65, 0x38, 0x58, + 0x6b, 0x58, 0xad, 0x65, 0xf2, 0xb6, 0x99, 0xb2, 0x7c, 0x27, 0xca, 0x31, + 0x28, 0x3d, 0x93, 0xce, 0xa0, 0xfa, 0x79, 0x33, 0xe7, 0xe5, 0xab, 0xad, + 0x0b, 0x30, 0xa2, 0xce, 0xef, 0xdf, 0x6a, 0xce, 0x4f, 0xfe, 0x7e, 0x1d, + 0xad, 0x86, 0x38, 0xa3, 0x2e, 0x61, 0x33, 0x4c, 0x41, 0x55, 0xb6, 0x65, + 0xa9, 0xbe, 0x89, 0x15, 0x9b, 0xc0, 0x4c, 0xfa, 0xde, 0xa9, 0xd3, 0xcc, + 0xc1, 0x94, 0x97, 0x56, 0x00, 0xda, 0x84, 0x61, 0x42, 0xed, 0xe6, 0x5d, + 0x84, 0x2b, 0x0d, 0xc2, 0x15, 0x05, 0xc2, 0x72, 0x46, 0x5d, 0x1a, 0xcf, + 0x2d, 0x67, 0xa0, 0x2d, 0xc7, 0x22, 0xbc, 0xe4, 0xc3, 0x19, 0x8f, 0x06, + 0x30, 0xb5, 0x9b, 0x2e, 0x70, 0x94, 0x28, 0x0b, 0x18, 0x85, 0xe5, 0xd3, + 0x10, 0x85, 0x7e, 0x06, 0xd4, 0xd2, 0x0a, 0xa3, 0x04, 0xd7, 0xb1, 0x58, + 0x7a, 0x46, 0x4d, 0x8c, 0x0d, 0x4f, 0x35, 0xd8, 0xf3, 0x8e, 0xfd, 0x04, + 0x7e, 0x13, 0x1a, 0x7b, 0xa0, 0xde, 0x4e, 0x01, 0x56, 0x46, 0x51, 0x09, + 0x70, 0xca, 0x2c, 0x3e, 0x0f, 0x38, 0xb0, 0xf8, 0x29, 0x05, 0x13, 0x76, + 0xaf, 0x1f, 0xc3, 0x3f, 0xe7, 0xe3, 0x8c, 0xb8, 0x2c, 0x2d, 0x2d, 0x6a, + 0x7f, 0x4b, 0x70, 0xdb, 0x38, 0x61, 0x09, 0x16, 0x9f, 0x87, 0xf1, 0x1b, + 0xe9, 0x03, 0x6b, 0xbd, 0x6b, 0x0c, 0x1e, 0xfe, 0xbd, 0x65, 0xaa, 0x9e, + 0x82, 0x85, 0x4d, 0xdd, 0xdc, 0xa6, 0xdd, 0x62, 0xd3, 0x92, 0x9d, 0x75, + 0x9e, 0xef, 0x60, 0x30, 0x48, 0x4b, 0x6b, 0xee, 0x94, 0x64, 0x72, 0xe7, + 0x80, 0x38, 0xb9, 0x28, 0x5d, 0xf7, 0x6b, 0xad, 0xfc, 0x75, 0xbd, 0x7b, + 0xf3, 0x59, 0xfd, 0x47, 0x29, 0xd3, 0xf2, 0xdc, 0x80, 0x89, 0x94, 0xaa, + 0x17, 0x8b, 0xf5, 0xdf, 0x0f, 0xb0, 0x19, 0xc6, 0xfe, 0xd9, 0x8c, 0xfe, + 0x2b, 0xf0, 0x2f, 0xf4, 0xfa, 0x7f, 0xcb, 0x85, 0x19, 0x2d, 0x03, 0x37, + 0x03, 0x8b, 0x39, 0x3b, 0xa3, 0x41, 0xd7, 0x75, 0xfe, 0x99, 0xeb, 0x5f, + 0x8e, 0xa9, 0x3e, 0xb9, 0x30, 0xf2, 0x53, 0x10, 0xd6, 0x40, 0x94, 0x8b, + 0x6d, 0x91, 0x00, 0x35, 0x07, 0x9a, 0x64, 0xb0, 0x2b, 0x23, 0xd7, 0xa9, + 0xe3, 0x37, 0x15, 0xc8, 0xca, 0x80, 0xb8, 0xa0, 0x01, 0x58, 0x29, 0xb4, + 0xcb, 0x84, 0x5b, 0xc0, 0x5c, 0xdc, 0xc8, 0x80, 0x5d, 0x91, 0xcf, 0xae, + 0x5a, 0x9d, 0xc5, 0x66, 0x03, 0xdb, 0xb6, 0x54, 0xdc, 0xc8, 0x4f, 0xd3, + 0xa8, 0x39, 0x1e, 0x8b, 0x71, 0xa3, 0xcb, 0x87, 0xc9, 0x2b, 0x00, 0x3a, + 0xef, 0x79, 0x5f, 0xca, 0x16, 0x40, 0x85, 0x9f, 0xcd, 0xf9, 0x36, 0x65, + 0x75, 0x01, 0x0b, 0x48, 0x6a, 0xf4, 0xf8, 0x86, 0xc5, 0x18, 0x6c, 0x5b, + 0xc5, 0x8f, 0xe3, 0x84, 0x5d, 0x35, 0x05, 0xed, 0x32, 0xc7, 0xa6, 0x17, + 0x68, 0x15, 0x7c, 0x1e, 0x18, 0x1d, 0x74, 0xe0, 0x32, 0xf5, 0xc6, 0xe9, + 0xda, 0x1e, 0x12, 0xde, 0xbb, 0x0e, 0xd9, 0x76, 0x2f, 0x50, 0x6b, 0xe0, + 0x33, 0x97, 0x69, 0x9b, 0x05, 0x09, 0x93, 0xbf, 0x50, 0x65, 0xee, 0xf9, + 0xec, 0x99, 0x7d, 0xea, 0x46, 0x55, 0x9a, 0xb9, 0xa5, 0x5c, 0xd8, 0xbe, + 0xec, 0xec, 0xcf, 0x9d, 0x5c, 0x3f, 0x3c, 0x1f, 0x76, 0xec, 0x44, 0x36, + 0x31, 0xfe, 0xc0, 0x7e, 0x77, 0xc3, 0xf0, 0xfc, 0xbe, 0xcd, 0xd8, 0xf7, + 0x86, 0x2f, 0xff, 0x71, 0x96, 0x37, 0x03, 0xd8, 0xda, 0x53, 0xb5, 0xba, + 0xc2, 0xde, 0x35, 0xf9, 0x3f, 0x64, 0xe1, 0x9f, 0x49, 0x18, 0x07, 0x96, + 0xbf, 0xa0, 0x1b, 0x55, 0xef, 0xb0, 0xba, 0x80, 0x5a, 0x00, 0x53, 0xd6, + 0x11, 0x96, 0x39, 0x48, 0xaf, 0xc2, 0xda, 0x31, 0xb5, 0xf2, 0x79, 0xa0, + 0x0d, 0x4b, 0x97, 0x26, 0x89, 0x2f, 0xa8, 0xdf, 0xa6, 0xbb, 0x3d, 0x4b, + 0x33, 0x4a, 0x32, 0x98, 0x96, 0xb8, 0x04, 0xed, 0x0b, 0x92, 0x36, 0x21, + 0xef, 0x7a, 0xcf, 0xed, 0x3c, 0x76, 0xe6, 0x2e, 0xbc, 0x4b, 0x53, 0xc4, + 0x52, 0xa6, 0xbf, 0xa1, 0xf6, 0x25, 0xb0, 0xf6, 0x1e, 0xa5, 0x19, 0x48, + 0xf5, 0x38, 0xa6, 0x8b, 0x24, 0x25, 0xcc, 0xeb, 0x7e, 0x52, 0x83, 0xde, + 0x8f, 0xcf, 0x65, 0xe5, 0x95, 0x0c, 0xee, 0x23, 0xdd, 0xa3, 0xc1, 0x36, + 0x61, 0x2b, 0x42, 0xb6, 0xf2, 0xf0, 0x7c, 0x81, 0xc2, 0xd4, 0x59, 0x88, + 0x92, 0x9d, 0x02, 0xb6, 0xf2, 0x7d, 0x85, 0x02, 0x73, 0xdf, 0xb1, 0x52, + 0xb8, 0x16, 0x08, 0x12, 0xde, 0x58, 0x05, 0xad, 0x79, 0x2c, 0x51, 0x23, + 0x91, 0x11, 0xae, 0x53, 0xc3, 0x92, 0x0e, 0x89, 0x6c, 0x62, 0x89, 0xfd, + 0x0a, 0xf0, 0xa2, 0xd5, 0x0c, 0x1e, 0xc6, 0x12, 0x53, 0xb9, 0x12, 0x0b, + 0xf2, 0xad, 0x98, 0x14, 0x98, 0x20, 0xbf, 0xdb, 0xcf, 0x96, 0x9b, 0x07, + 0x68, 0x5d, 0xae, 0xe4, 0xc0, 0xd6, 0x9b, 0x3a, 0x9f, 0x8c, 0xa8, 0xf3, + 0x6b, 0x5a, 0x3b, 0xf9, 0x3a, 0x3c, 0x46, 0xcd, 0xfb, 0x37, 0x0a, 0x06, + 0xf8, 0x58, 0xe8, 0xb5, 0x59, 0x50, 0x7d, 0x65, 0xd3, 0x13, 0x7a, 0x3b, + 0x50, 0x70, 0xad, 0x89, 0x09, 0xb5, 0x84, 0x6c, 0x9f, 0xd9, 0x36, 0x5c, + 0x81, 0x6a, 0xb5, 0x1b, 0x42, 0x55, 0xad, 0x66, 0x89, 0x1a, 0x78, 0xd6, + 0xf4, 0x04, 0x29, 0x25, 0x2b, 0xd7, 0xe5, 0x96, 0xd9, 0x2f, 0x74, 0xe7, + 0xb3, 0x5a, 0xed, 0x07, 0x6f, 0x19, 0xb0, 0xd6, 0xc4, 0x04, 0x54, 0x17, + 0x80, 0xe9, 0x2a, 0xb3, 0x1a, 0x86, 0x60, 0xf2, 0x3f, 0x51, 0xed, 0xf7, + 0x9f, 0x02, 0xb5, 0x72, 0x7e, 0x53, 0x5b, 0x06, 0xab, 0xaa, 0x97, 0xb3, + 0xb3, 0xc3, 0x41, 0x5e, 0x06, 0x02, 0x06, 0xdd, 0x36, 0xf9, 0x38, 0xb3, + 0xb3, 0x10, 0x2c, 0x04, 0xcc, 0xce, 0xaa, 0x1c, 0x54, 0x73, 0x47, 0x3d, + 0x20, 0x60, 0x66, 0x1a, 0x66, 0x66, 0x21, 0x98, 0x36, 0x69, 0xaa, 0xf2, + 0x58, 0xda, 0xf7, 0x85, 0xbb, 0x36, 0xe8, 0x37, 0x13, 0xa2, 0xfb, 0x23, + 0x27, 0x25, 0xbd, 0xad, 0xc7, 0x22, 0x37, 0x0b, 0x94, 0x82, 0x7c, 0xff, + 0x6d, 0x4f, 0x1f, 0xcf, 0x10, 0x10, 0xd6, 0xa0, 0x70, 0x93, 0x8e, 0x6c, + 0x25, 0x19, 0xc8, 0x1d, 0x10, 0xc2, 0x52, 0x7d, 0xfe, 0xbd, 0x6e, 0x0c, + 0x30, 0x2b, 0xdf, 0xc6, 0xed, 0x6d, 0xef, 0x0e, 0xda, 0x67, 0xca, 0x56, + 0xb1, 0x86, 0x97, 0x3f, 0x97, 0xc7, 0xcb, 0x2a, 0xbf, 0x90, 0x20, 0xb3, + 0xa3, 0x20, 0xa5, 0xd4, 0xf0, 0x3b, 0x49, 0xb8, 0xda, 0x44, 0x94, 0xca, + 0xc8, 0x4e, 0x1b, 0xd9, 0x92, 0xb8, 0x23, 0x0e, 0x12, 0x14, 0x48, 0x4b, + 0xc3, 0xb1, 0x0e, 0x7e, 0xe4, 0x70, 0x06, 0xd7, 0xda, 0x79, 0x98, 0x07, + 0x1e, 0x7c, 0x88, 0xb3, 0xab, 0x11, 0xbb, 0x34, 0x58, 0xcb, 0xba, 0xf5, + 0x20, 0x7c, 0xea, 0x61, 0x00, 0xc6, 0x3f, 0xf0, 0xd1, 0x14, 0xbc, 0x25, + 0x07, 0xf4, 0x9b, 0xe5, 0xc7, 0xb9, 0xe4, 0x80, 0xf6, 0xc4, 0x52, 0x89, + 0x14, 0x9e, 0x55, 0xef, 0x40, 0xb3, 0x24, 0x55, 0xdf, 0x5d, 0x49, 0xe5, + 0x3f, 0x0f, 0xdd, 0x52, 0xc7, 0xcf, 0x1c, 0xa7, 0xec, 0xb9, 0xc2, 0xc0, + 0xba, 0x00, 0x1a, 0x52, 0xf5, 0x8b, 0x36, 0xa4, 0x82, 0x53, 0xdd, 0x49, + 0x06, 0x82, 0x3a, 0xba, 0x04, 0x08, 0x58, 0x96, 0x70, 0xe4, 0x01, 0x97, + 0xfb, 0x7e, 0x23, 0x24, 0xee, 0x69, 0xc8, 0x1e, 0x45, 0xd7, 0x5b, 0x3a, + 0xfc, 0x48, 0x07, 0x0e, 0x69, 0xdf, 0x07, 0x3a, 0x70, 0xcc, 0xc0, 0xbb, + 0x80, 0x50, 0x4a, 0xea, 0x40, 0x64, 0x7e, 0x14, 0xbf, 0x11, 0x52, 0x16, + 0x70, 0xa8, 0x23, 0xba, 0xc0, 0x5a, 0x52, 0x42, 0xac, 0x4d, 0x0e, 0x02, + 0x4f, 0x00, 0x47, 0x4a, 0xf0, 0x18, 0x3a, 0x7f, 0x1d, 0xb5, 0x6d, 0x40, + 0x59, 0x8d, 0x0e, 0x0c, 0x1b, 0xa5, 0xb0, 0xb4, 0x9d, 0x55, 0x52, 0x7d, + 0x9c, 0x77, 0x74, 0xda, 0x2c, 0xa3, 0x21, 0x59, 0xa8, 0x78, 0x73, 0x1d, + 0xf5, 0x24, 0xbf, 0x07, 0xb8, 0x43, 0xdb, 0xd7, 0x4a, 0x30, 0xd7, 0x81, + 0xa9, 0x92, 0x02, 0xbb, 0xc7, 0x1d, 0xb8, 0x5f, 0xc3, 0xc5, 0x00, 0x1e, + 0x5f, 0x52, 0x3e, 0xce, 0x76, 0xe0, 0xa1, 0xfb, 0xd4, 0xb1, 0x51, 0xf7, + 0xd3, 0xec, 0xb7, 0x99, 0x3f, 0x0f, 0x72, 0xc0, 0x38, 0x17, 0x3f, 0xa7, + 0xce, 0xf5, 0x37, 0x56, 0xbe, 0x9e, 0x42, 0x9a, 0x78, 0xed, 0x15, 0xf2, + 0x32, 0xb0, 0xa6, 0x74, 0xff, 0x00, 0x19, 0x9b, 0x54, 0xaf, 0x6d, 0xb0, + 0xbd, 0x51, 0xf8, 0x06, 0xe9, 0x0d, 0xcb, 0x2b, 0xaf, 0x65, 0x10, 0x30, + 0xc8, 0x00, 0x53, 0x17, 0x35, 0xfc, 0xca, 0xec, 0xbb, 0x66, 0x00, 0xc7, + 0x32, 0x0f, 0xb0, 0xca, 0x97, 0x27, 0x1f, 0x2f, 0xef, 0x73, 0xe5, 0xa5, + 0x93, 0x5d, 0xdb, 0x79, 0x68, 0x56, 0x2f, 0x50, 0xcc, 0x80, 0xc3, 0x8c, + 0xdd, 0x55, 0x28, 0x98, 0xd6, 0x2b, 0xaf, 0xbc, 0x02, 0xaf, 0x65, 0x50, + 0xae, 0xab, 0xde, 0xb2, 0xa5, 0x0b, 0xa8, 0x65, 0xd2, 0x4e, 0xcb, 0xac, + 0xcb, 0x97, 0xf7, 0x9f, 0xfa, 0xcc, 0xa5, 0xf5, 0x8d, 0x95, 0xaf, 0xab, + 0x9f, 0xc2, 0xcf, 0xc5, 0xf0, 0x9f, 0x55, 0x39, 0xf2, 0x75, 0xf8, 0xd2, + 0x92, 0x8f, 0x55, 0x52, 0xef, 0x64, 0xb8, 0xa3, 0x16, 0xe1, 0x6a, 0x82, + 0xaf, 0xdf, 0x83, 0xf0, 0xe3, 0x04, 0x5e, 0x6c, 0x50, 0xfb, 0xe9, 0x3a, + 0xec, 0xab, 0xe3, 0x8e, 0x58, 0x2c, 0x1d, 0x3f, 0xc1, 0x93, 0x17, 0x60, + 0xec, 0x16, 0x05, 0xb5, 0x92, 0x40, 0xb4, 0xda, 0xc4, 0x19, 0xad, 0xb1, + 0xb8, 0xd4, 0xc4, 0x2e, 0xab, 0x57, 0x16, 0x2c, 0xcb, 0x21, 0x49, 0x24, + 0x91, 0x1f, 0x21, 0xca, 0x20, 0xe3, 0x08, 0xff, 0x8c, 0xc4, 0xdd, 0xe1, + 0xe2, 0x5d, 0xef, 0x61, 0x59, 0x0a, 0x0e, 0x28, 0x93, 0x10, 0xe2, 0x36, + 0xee, 0x4f, 0x67, 0x40, 0xad, 0xfc, 0x18, 0x33, 0x80, 0x5c, 0x93, 0x88, + 0x91, 0x84, 0xc6, 0x0b, 0xfa, 0xdd, 0x8f, 0x5c, 0x4b, 0x30, 0x3f, 0xb6, + 0x27, 0x65, 0x1b, 0xff, 0x94, 0x6a, 0x2f, 0xc6, 0x41, 0x4c, 0xa2, 0xeb, + 0x98, 0xfa, 0xde, 0x3a, 0x71, 0x27, 0x46, 0x74, 0x14, 0xdc, 0xaa, 0xf1, + 0xdc, 0x12, 0xb5, 0x7a, 0x0d, 0xa1, 0xe3, 0xca, 0xb5, 0x90, 0x76, 0xab, + 0x8d, 0x2f, 0x1c, 0x1a, 0x17, 0x9a, 0xdc, 0xa1, 0x3f, 0xd2, 0x56, 0xab, + 0xba, 0x34, 0x83, 0x90, 0x5a, 0xd5, 0x65, 0xe9, 0x5c, 0x36, 0xb6, 0x93, + 0xac, 0x25, 0xec, 0xaa, 0x94, 0x89, 0x5b, 0x2e, 0xcb, 0xcf, 0xcc, 0x61, + 0x5b, 0x36, 0xfb, 0x77, 0x38, 0x34, 0x4b, 0x65, 0x3c, 0xd7, 0x51, 0x60, + 0x2d, 0x09, 0xa2, 0xac, 0xfd, 0x93, 0xc1, 0x20, 0x45, 0xa7, 0xfb, 0x0e, + 0x27, 0x6c, 0xa1, 0x21, 0x5a, 0xa8, 0xba, 0x5f, 0xc7, 0x10, 0x52, 0x40, + 0x49, 0x2a, 0x90, 0xab, 0x79, 0xb7, 0xa7, 0x04, 0x96, 0xed, 0xd2, 0x3c, + 0xbd, 0x8c, 0x6b, 0xb9, 0xb4, 0x3b, 0x60, 0x03, 0xe8, 0x3e, 0xee, 0xbe, + 0xbe, 0x14, 0x7d, 0x4d, 0xbf, 0xf0, 0xa5, 0x2f, 0x71, 0x27, 0xf4, 0xc1, + 0xaf, 0xf2, 0xdb, 0xc3, 0xc0, 0x58, 0x5f, 0x59, 0x49, 0x52, 0x08, 0x94, + 0x01, 0x42, 0xe5, 0xb7, 0x8d, 0xf2, 0xeb, 0x26, 0x5e, 0x3e, 0x8d, 0x5e, + 0xe5, 0xc1, 0x52, 0x26, 0xbe, 0x49, 0x3b, 0x9f, 0x9f, 0xde, 0x34, 0xf2, + 0x20, 0xb0, 0xbf, 0x7e, 0xfe, 0x04, 0x6f, 0xbd, 0x7a, 0x7b, 0x0a, 0xc2, + 0xca, 0x03, 0xb5, 0x8c, 0xf2, 0xbe, 0x7a, 0xd3, 0x5d, 0x8d, 0xce, 0xd3, + 0x5c, 0xbe, 0x2e, 0x85, 0x86, 0xf5, 0xc2, 0xb1, 0x7a, 0xfd, 0x0c, 0x2a, + 0xeb, 0x6a, 0x74, 0x9e, 0xb7, 0x5e, 0xbd, 0xbd, 0xcf, 0x7e, 0xd0, 0xb1, + 0x1d, 0x54, 0xee, 0xb7, 0x5e, 0xbd, 0x3d, 0x23, 0xac, 0x56, 0xf5, 0x72, + 0x26, 0xc8, 0x0c, 0xa6, 0x75, 0xf8, 0x42, 0x55, 0x03, 0x58, 0x03, 0x5e, + 0x18, 0xff, 0x12, 0x3f, 0xc2, 0x4f, 0x76, 0x5d, 0xd3, 0x85, 0x0a, 0x15, + 0x2a, 0x54, 0xa8, 0x50, 0xa1, 0x42, 0x85, 0x0a, 0x15, 0x2a, 0x54, 0xa8, + 0x50, 0xa1, 0x42, 0x85, 0x0a, 0x15, 0x2a, 0x54, 0xa8, 0x50, 0xa1, 0x42, + 0x85, 0x0a, 0x15, 0x2a, 0x54, 0x68, 0xf3, 0x2a, 0xa0, 0x5a, 0x85, 0x0a, + 0x15, 0x2a, 0x54, 0xa8, 0xd0, 0xf7, 0x58, 0x62, 0xa7, 0xfa, 0x9a, 0x66, + 0x17, 0x3b, 0xa0, 0x24, 0x48, 0xd6, 0xba, 0x81, 0x01, 0x52, 0x4a, 0xea, + 0x7b, 0xc7, 0xb3, 0x78, 0x42, 0xd0, 0x3c, 0xdf, 0x44, 0xca, 0x24, 0x7b, + 0xdf, 0x4e, 0xed, 0x49, 0x21, 0x51, 0x65, 0xcb, 0x46, 0xca, 0x24, 0xf5, + 0x91, 0xbe, 0x48, 0x2b, 0x65, 0x0a, 0x6d, 0x50, 0x60, 0x2d, 0x0b, 0x68, + 0x83, 0x54, 0xdb, 0xa0, 0x5e, 0x5e, 0x34, 0x71, 0x4d, 0x5e, 0xac, 0x11, + 0x9b, 0xf0, 0x52, 0x88, 0xbd, 0xd5, 0xd6, 0x5f, 0x13, 0x36, 0x3e, 0x7a, + 0xbe, 0xe0, 0x09, 0x8c, 0xef, 0xcf, 0x26, 0xd4, 0xcb, 0x8e, 0x24, 0xbe, + 0x14, 0x13, 0x45, 0xea, 0xe5, 0x43, 0x03, 0xd4, 0x52, 0xbe, 0x23, 0xed, + 0xdb, 0x21, 0x59, 0x8b, 0xf0, 0x57, 0x7d, 0x1c, 0xcb, 0x21, 0x8e, 0x74, + 0x9a, 0xb6, 0x7e, 0x0d, 0xb9, 0x24, 0xa1, 0x23, 0x88, 0x02, 0x35, 0x69, + 0x16, 0x24, 0xed, 0x92, 0x86, 0x6d, 0x09, 0x08, 0xa3, 0x10, 0x17, 0xb5, + 0x34, 0xf2, 0x6a, 0x35, 0xfc, 0x55, 0x1f, 0x57, 0x43, 0xb2, 0xcc, 0x61, + 0x4a, 0xa2, 0xb0, 0x6b, 0xca, 0x49, 0xd4, 0x4a, 0x38, 0x70, 0xeb, 0x81, + 0xae, 0xfc, 0xfb, 0xbe, 0x9f, 0x42, 0xc0, 0x92, 0x24, 0x49, 0x8f, 0xe9, + 0x46, 0x12, 0x3b, 0x87, 0x4f, 0x9e, 0x71, 0x46, 0x2d, 0x85, 0xfd, 0x6a, + 0xa1, 0xa0, 0x58, 0x89, 0x04, 0x4b, 0xa8, 0xa5, 0xd4, 0x61, 0x40, 0xfa, + 0xf6, 0x69, 0x49, 0xc0, 0x76, 0xbd, 0x7e, 0x21, 0xce, 0xde, 0x83, 0x36, + 0x76, 0x41, 0x02, 0x55, 0x8b, 0x76, 0x4b, 0x52, 0xee, 0x9d, 0x0d, 0xd9, + 0x0b, 0xe8, 0x5a, 0x47, 0x5d, 0x80, 0x2b, 0x32, 0x50, 0x55, 0x6d, 0xa7, + 0x4b, 0x92, 0x74, 0x4f, 0xce, 0xf1, 0x1c, 0x27, 0x05, 0x55, 0xe5, 0x81, + 0x5a, 0x97, 0xab, 0x14, 0x5a, 0x35, 0x00, 0xc6, 0x75, 0x25, 0x1a, 0x94, + 0x57, 0x3f, 0x8a, 0xb0, 0x72, 0x79, 0x8b, 0xd7, 0x92, 0xf4, 0xb8, 0xf4, + 0x42, 0xb4, 0xc2, 0x68, 0x83, 0x69, 0x59, 0xa9, 0x9f, 0xec, 0x98, 0x3a, + 0xa3, 0x03, 0xa7, 0x75, 0x02, 0xea, 0x77, 0x20, 0x92, 0xee, 0xc9, 0x1b, + 0x1b, 0x29, 0xb3, 0xd1, 0x80, 0x91, 0xdc, 0xd7, 0x73, 0x87, 0x69, 0x7d, + 0x1b, 0x55, 0xa6, 0x61, 0x93, 0x9f, 0xc5, 0x90, 0xe9, 0xf8, 0x66, 0x42, + 0x8a, 0x94, 0xfd, 0x5f, 0x57, 0xef, 0xb5, 0x1b, 0xb6, 0xff, 0xdb, 0x01, + 0x6a, 0x01, 0xb4, 0x65, 0x1b, 0xdb, 0xb2, 0xd3, 0x97, 0xa8, 0xd3, 0x3c, + 0x0d, 0x9b, 0xc8, 0x6d, 0xbe, 0x7a, 0x9e, 0xfb, 0xfa, 0xf9, 0x7a, 0x2a, + 0x8b, 0x32, 0x6d, 0xd9, 0x4e, 0x97, 0x1b, 0x69, 0xa3, 0xeb, 0xda, 0x1d, + 0xcd, 0xde, 0xc0, 0x1f, 0x54, 0xf6, 0xfc, 0x24, 0x9f, 0x20, 0x08, 0x2e, + 0xcb, 0xfe, 0x4a, 0xe2, 0xfc, 0x20, 0xdb, 0x5f, 0x89, 0x6f, 0x7b, 0xa4, + 0x1f, 0x50, 0x64, 0xd4, 0x8c, 0x22, 0xac, 0x8a, 0x20, 0x69, 0x65, 0xf0, + 0x1e, 0xe3, 0x23, 0x69, 0xe5, 0x40, 0x08, 0x15, 0x81, 0x6c, 0xc9, 0x75, + 0xaf, 0xeb, 0xed, 0xa3, 0x95, 0xbe, 0xc9, 0xe9, 0xdf, 0x8e, 0x2e, 0x93, + 0xad, 0xd6, 0xa7, 0xf3, 0xe7, 0xce, 0x71, 0x4e, 0xaf, 0x9f, 0xcb, 0x85, + 0xff, 0x01, 0xb0, 0x03, 0x36, 0x0d, 0x00, 0xbb, 0x5c, 0xfd, 0xaf, 0xc0, + 0xa7, 0xbe, 0x83, 0xfe, 0xbf, 0x5b, 0xda, 0x3e, 0x5a, 0x19, 0xba, 0xcf, + 0xa9, 0x90, 0x4d, 0x20, 0xfe, 0xf7, 0xef, 0xe6, 0xae, 0xdc, 0xbe, 0x5e, + 0x60, 0xe4, 0xe5, 0x4a, 0x76, 0xa0, 0xb1, 0x72, 0x76, 0x13, 0x86, 0x43, + 0xea, 0xd7, 0x9e, 0x6d, 0x91, 0xcd, 0xde, 0xfd, 0x27, 0x61, 0x0f, 0x60, + 0x99, 0x38, 0x9b, 0x00, 0x6a, 0x81, 0x3e, 0x9f, 0xc3, 0xf6, 0x59, 0x82, + 0x61, 0x33, 0xb3, 0x3f, 0xf8, 0x1f, 0x3f, 0xc6, 0xa3, 0x25, 0xe0, 0xa5, + 0x65, 0x45, 0x40, 0x88, 0x42, 0x78, 0xb1, 0xbf, 0xcd, 0x7b, 0xa5, 0x32, + 0x30, 0xad, 0xa9, 0xfd, 0xfd, 0xfb, 0x0c, 0x5c, 0xeb, 0x8d, 0xd0, 0x91, + 0x2f, 0xa9, 0x89, 0x58, 0x87, 0x04, 0xf0, 0xcc, 0x9c, 0x0a, 0x3c, 0x31, + 0x0f, 0x7f, 0xb6, 0x8c, 0xb5, 0x57, 0x4d, 0xd2, 0x4f, 0x5e, 0x7a, 0xe2, + 0x8d, 0x01, 0x6a, 0x7d, 0x07, 0xb5, 0x5e, 0x39, 0x8c, 0x1c, 0x6b, 0x9d, + 0xfb, 0xb5, 0xe3, 0x10, 0x77, 0x24, 0x50, 0x86, 0xad, 0xb9, 0x76, 0xdd, + 0x96, 0x5c, 0x7b, 0xcd, 0x51, 0xf7, 0x93, 0xf6, 0x56, 0xb0, 0xb6, 0x7a, + 0xf0, 0xd2, 0x09, 0xda, 0xad, 0x98, 0xf2, 0x56, 0x7d, 0x9f, 0xc9, 0x91, + 0x9a, 0xda, 0x5b, 0x75, 0x50, 0x29, 0xbb, 0x67, 0x09, 0xbd, 0x2a, 0x2a, + 0xcd, 0xac, 0xbd, 0x8e, 0x06, 0x6a, 0x01, 0x6c, 0x2d, 0x63, 0x6f, 0x2d, + 0xa7, 0x90, 0x0a, 0xd3, 0x84, 0xb3, 0x46, 0xba, 0x7f, 0x57, 0x62, 0x7b, + 0x39, 0xb5, 0xcf, 0xf2, 0x66, 0x7c, 0xd3, 0xe5, 0x3b, 0x6f, 0x2b, 0x7a, + 0x6d, 0x7b, 0x9a, 0x88, 0xc6, 0x36, 0x8d, 0xb3, 0x8e, 0xfd, 0xe5, 0xd8, + 0xe6, 0xcb, 0x98, 0x07, 0x6b, 0x41, 0xee, 0x98, 0xe4, 0xc0, 0x5a, 0xb8, + 0x16, 0xed, 0x4e, 0x1b, 0x5c, 0x0b, 0x2e, 0xf4, 0x40, 0x63, 0xcb, 0xd0, + 0xbe, 0x94, 0x83, 0xa2, 0x79, 0x1e, 0xb2, 0x9d, 0x20, 0x1c, 0x1b, 0x19, + 0x65, 0xe1, 0x8e, 0x33, 0xbc, 0x8d, 0xfc, 0x13, 0x95, 0xed, 0xbc, 0xdc, + 0x73, 0x5d, 0xbf, 0x3a, 0xd4, 0x5a, 0x01, 0x9c, 0x2e, 0x57, 0x83, 0xe2, + 0x6c, 0xe4, 0x67, 0xd8, 0xfe, 0xf5, 0xe2, 0x0d, 0xcb, 0xf7, 0x7a, 0x71, + 0x2e, 0xa7, 0x3c, 0xdf, 0xad, 0x72, 0x0c, 0xdb, 0xb7, 0x99, 0xf3, 0x72, + 0x5d, 0xa5, 0x7f, 0x92, 0x9a, 0x91, 0x53, 0x81, 0x63, 0x2b, 0x36, 0x10, + 0xe2, 0x7f, 0x60, 0x17, 0xe2, 0x23, 0x3e, 0xd6, 0x0e, 0x8f, 0x38, 0x49, + 0xb0, 0x2d, 0x8b, 0x76, 0x08, 0x65, 0x57, 0xdd, 0x1d, 0x96, 0xf4, 0x4c, + 0x62, 0xf3, 0x1c, 0x1a, 0xae, 0xc5, 0xec, 0xba, 0xd1, 0x83, 0x50, 0x5d, + 0x39, 0xcd, 0xe7, 0x96, 0x71, 0x77, 0xd6, 0x08, 0x57, 0x9a, 0x34, 0xb5, + 0xcf, 0xe6, 0x8a, 0x8d, 0x05, 0xb8, 0x3b, 0x6b, 0x29, 0xbc, 0x8b, 0x48, + 0xc2, 0x08, 0xcc, 0x7d, 0xc1, 0xf4, 0x85, 0xa8, 0xc9, 0x9d, 0x51, 0x94, + 0x50, 0xbf, 0xa5, 0x8e, 0x58, 0x53, 0xe1, 0xee, 0xf5, 0x19, 0xe0, 0x3b, + 0x3c, 0xd5, 0xc0, 0x3d, 0x76, 0x07, 0xe1, 0x6f, 0x35, 0x68, 0x9c, 0x72, + 0xa9, 0x5f, 0x1f, 0xe2, 0x5e, 0x5f, 0x4f, 0x41, 0x5b, 0xb2, 0xd3, 0x66, + 0xf1, 0x24, 0x0a, 0x9e, 0x8d, 0x86, 0x72, 0x45, 0x6a, 0x7d, 0xec, 0xb6, + 0x71, 0x64, 0x10, 0x23, 0xaa, 0x36, 0xee, 0xf5, 0x63, 0x84, 0xa7, 0x96, + 0x08, 0x4f, 0x2d, 0xe1, 0xce, 0x7d, 0x90, 0x25, 0xda, 0xe9, 0x0c, 0x69, + 0xf7, 0xfa, 0x31, 0x00, 0x16, 0x9f, 0x6e, 0x67, 0x20, 0xae, 0x48, 0x3d, + 0xe7, 0x04, 0x7e, 0x93, 0x0f, 0xfe, 0x2f, 0x35, 0xe6, 0x4e, 0x97, 0xa9, + 0x8e, 0xed, 0x01, 0x60, 0xea, 0xda, 0x1e, 0xc8, 0xb0, 0x6e, 0xdf, 0x38, + 0x9d, 0x6c, 0x5d, 0x4a, 0xd9, 0x37, 0x29, 0xdc, 0x5c, 0xb1, 0x0e, 0x30, + 0x77, 0x1a, 0xa6, 0xae, 0xed, 0x86, 0x69, 0xf5, 0xde, 0x25, 0xed, 0x9e, + 0xfb, 0x7b, 0x58, 0xf2, 0x70, 0x3b, 0xbe, 0x9a, 0xa0, 0x8e, 0x44, 0x96, + 0xc0, 0xd5, 0xfd, 0x4a, 0xeb, 0xdd, 0xaf, 0x7f, 0xa2, 0xb2, 0x7d, 0xe8, + 0xfd, 0xfa, 0x9f, 0x9a, 0xde, 0xc9, 0xe6, 0xc0, 0x5a, 0x12, 0x38, 0x03, + 0xfc, 0x07, 0xe0, 0x03, 0xb9, 0xf0, 0x4f, 0x01, 0xab, 0xc0, 0xd7, 0xae, + 0x30, 0xfd, 0x83, 0x64, 0xd7, 0xa7, 0x81, 0x68, 0xe5, 0xa1, 0x59, 0x67, + 0x80, 0x2d, 0x7a, 0xfd, 0x39, 0x60, 0x8f, 0xb6, 0x33, 0xa0, 0xbc, 0x45, + 0xf4, 0xf9, 0x1c, 0xa2, 0xed, 0xa3, 0x15, 0x05, 0xa7, 0x82, 0x0c, 0x54, + 0x15, 0xf9, 0x34, 0x01, 0xcb, 0x71, 0x59, 0xd4, 0x76, 0x7e, 0xe4, 0x43, + 0x13, 0xfc, 0xa6, 0xaf, 0x28, 0x3f, 0x8e, 0x02, 0x12, 0xa4, 0x71, 0x40, + 0x2f, 0x9b, 0x84, 0x51, 0x2d, 0xb7, 0xdd, 0xfd, 0xbc, 0xe7, 0x3a, 0x1e, + 0x8b, 0xda, 0x17, 0x84, 0xa0, 0x41, 0x55, 0xca, 0x1b, 0x8c, 0xd7, 0xea, + 0x34, 0xbb, 0x00, 0x59, 0x00, 0x3e, 0xcd, 0x2e, 0x80, 0x97, 0xd7, 0x05, + 0xd0, 0x72, 0x1d, 0x0f, 0x72, 0xf9, 0xe8, 0x95, 0xeb, 0x74, 0xfb, 0x46, + 0xa7, 0x67, 0xe0, 0x5f, 0x61, 0xe4, 0x13, 0xc7, 0x60, 0xdb, 0xf9, 0x72, + 0xc0, 0xae, 0x9a, 0xa7, 0xae, 0xb1, 0x88, 0x14, 0xd2, 0x05, 0xa4, 0x79, + 0x19, 0x0a, 0xc7, 0xda, 0x40, 0xc6, 0xb6, 0x37, 0x4e, 0xfe, 0x92, 0xeb, + 0xf2, 0x35, 0x00, 0xae, 0x05, 0x50, 0xbd, 0x01, 0x82, 0x17, 0x34, 0x98, + 0xe5, 0x77, 0x94, 0xdd, 0xf6, 0x33, 0xeb, 0x3c, 0x73, 0x55, 0xbb, 0xcf, + 0x45, 0x79, 0xe7, 0x14, 0x27, 0x2e, 0xc1, 0x07, 0x3f, 0x78, 0x3b, 0xf6, + 0x0d, 0xe0, 0xb8, 0xf0, 0xe8, 0x1f, 0xce, 0xd1, 0x2e, 0xcd, 0xf5, 0xf7, + 0x79, 0x02, 0xf3, 0x9d, 0x77, 0x01, 0x70, 0xf7, 0x2f, 0x4f, 0x51, 0xfb, + 0x25, 0x38, 0xfa, 0x47, 0x73, 0x40, 0xff, 0x84, 0x6a, 0x80, 0xb9, 0x64, + 0x8a, 0x8f, 0x7e, 0xe8, 0x00, 0xfe, 0x05, 0xb8, 0xf7, 0xfd, 0xb0, 0x78, + 0x32, 0xe4, 0xc4, 0xa7, 0xee, 0x42, 0xb6, 0x54, 0x5d, 0x28, 0x2a, 0xe5, + 0x81, 0xf6, 0x61, 0x04, 0x77, 0xdc, 0x0c, 0xfe, 0x05, 0x65, 0x3f, 0x48, + 0xa2, 0x7e, 0x27, 0x73, 0x09, 0x7c, 0x6e, 0xfe, 0xd3, 0x80, 0x7a, 0x6c, + 0xd8, 0xaf, 0xed, 0x0d, 0xe4, 0x6b, 0xee, 0x64, 0xc2, 0x43, 0xff, 0xc7, + 0xff, 0x0d, 0xc0, 0xb1, 0x3f, 0x53, 0x40, 0xac, 0x03, 0xbf, 0x70, 0x00, + 0x4f, 0x5f, 0x0a, 0x0f, 0x3f, 0x72, 0x0c, 0xd9, 0x78, 0x0c, 0x56, 0x24, + 0xed, 0xf7, 0x08, 0x1a, 0xa7, 0x55, 0xdd, 0x39, 0x57, 0x3f, 0x44, 0xe3, + 0xb4, 0x64, 0xb2, 0x7c, 0x27, 0xb5, 0xea, 0x7e, 0x6a, 0x55, 0xf0, 0xbc, + 0x32, 0x8b, 0x4b, 0x3e, 0xf3, 0xc9, 0xc7, 0x38, 0xf8, 0x58, 0x8d, 0xf0, + 0x53, 0x31, 0x63, 0x57, 0xcf, 0xf3, 0xc0, 0x53, 0x01, 0x93, 0x37, 0xdd, + 0x41, 0x72, 0x29, 0xe1, 0x83, 0x1f, 0xbc, 0x9d, 0xe0, 0x02, 0x38, 0xba, + 0x0d, 0xdb, 0x38, 0xdd, 0xa0, 0x79, 0x69, 0x19, 0x5b, 0x08, 0x62, 0x29, + 0x99, 0x7f, 0xf6, 0x18, 0x78, 0x30, 0xd7, 0x7a, 0x92, 0xb1, 0xd2, 0x01, + 0xfc, 0xa7, 0xc7, 0x39, 0xf8, 0xde, 0x49, 0xc2, 0x08, 0xc2, 0xd5, 0x1a, + 0x56, 0x53, 0x43, 0xac, 0xa4, 0x44, 0x76, 0xc0, 0x7b, 0x5e, 0x32, 0xa9, + 0x9f, 0xc1, 0xe2, 0x35, 0xa8, 0xfd, 0xf4, 0x7e, 0xc6, 0xc7, 0xf6, 0xe3, + 0x8c, 0xa8, 0x7e, 0xba, 0xb9, 0xe3, 0xf3, 0x7d, 0xe7, 0x33, 0x2f, 0xb7, + 0xe2, 0xd0, 0x6c, 0x2d, 0xea, 0xe7, 0x37, 0x3d, 0x06, 0xa1, 0x25, 0x3b, + 0xba, 0xdf, 0xaf, 0x64, 0x23, 0x65, 0x8c, 0xfa, 0xe5, 0x59, 0x5d, 0xcf, + 0x76, 0x89, 0xdc, 0xa8, 0x4f, 0xbe, 0x17, 0xa7, 0xba, 0x49, 0x95, 0x62, + 0x1c, 0x31, 0x4e, 0xd4, 0x6a, 0x62, 0x09, 0xd5, 0xdf, 0x9d, 0xc8, 0x48, + 0x03, 0xb5, 0x5c, 0x12, 0xdd, 0x78, 0x0d, 0x02, 0x05, 0xb5, 0x4c, 0x21, + 0x5b, 0x9d, 0x36, 0x92, 0x36, 0x82, 0x72, 0xba, 0x4c, 0x64, 0x06, 0x88, + 0x11, 0x22, 0xbb, 0x5f, 0x5e, 0xb9, 0xbe, 0x73, 0xb0, 0xac, 0xf5, 0x34, + 0x0c, 0xa4, 0x95, 0x97, 0x5b, 0x19, 0xde, 0x0e, 0xdf, 0x3e, 0x5a, 0x21, + 0x0e, 0x92, 0x94, 0x0f, 0x60, 0x54, 0x65, 0x00, 0x5c, 0x6b, 0x22, 0xb3, + 0x09, 0x16, 0x14, 0x18, 0x2b, 0x08, 0x54, 0x5f, 0x99, 0xf9, 0x5b, 0xc8, + 0x45, 0x5a, 0x58, 0x50, 0x8e, 0xf2, 0x7d, 0x69, 0x79, 0x80, 0x96, 0x81, + 0x6b, 0x19, 0x1f, 0xe9, 0x7e, 0x34, 0x4f, 0x2b, 0x4d, 0x4c, 0xdb, 0xea, + 0xf5, 0x20, 0x50, 0xd0, 0xad, 0x85, 0x40, 0x81, 0xae, 0x16, 0x82, 0x0c, + 0xd2, 0x55, 0x9d, 0xc8, 0xf2, 0x67, 0xd6, 0x67, 0x67, 0x4c, 0x99, 0xb2, + 0xcc, 0xcd, 0x54, 0x21, 0xe8, 0xc9, 0x6f, 0x5e, 0xf9, 0x60, 0x03, 0xd4, + 0x32, 0xb6, 0xd5, 0xde, 0xfd, 0x7a, 0x5b, 0x01, 0xb1, 0x50, 0x50, 0x85, + 0x41, 0x3e, 0x17, 0x72, 0x1b, 0xd3, 0x50, 0xa5, 0xca, 0x02, 0x41, 0x0a, + 0xff, 0xda, 0x38, 0x27, 0x4a, 0x3f, 0xff, 0x27, 0xf0, 0xe7, 0xef, 0xeb, + 0xb7, 0x9c, 0x9d, 0x85, 0x9f, 0xda, 0xa8, 0xdf, 0x2c, 0x5f, 0x37, 0xe7, + 0x3f, 0xea, 0xa3, 0x97, 0x83, 0x60, 0x58, 0x57, 0xa2, 0x61, 0x60, 0xad, + 0xfc, 0xfe, 0xbc, 0x84, 0x10, 0xe9, 0x78, 0x2a, 0xe4, 0x60, 0xc3, 0x7a, + 0x2c, 0xa3, 0xcb, 0x97, 0x01, 0x6b, 0xe5, 0xd7, 0xf3, 0x4b, 0xe8, 0x0e, + 0xd3, 0xdb, 0x03, 0xf3, 0x93, 0xef, 0xa3, 0x2a, 0x89, 0x7e, 0x88, 0xd7, + 0x66, 0x34, 0xe0, 0x12, 0x4c, 0x3f, 0x54, 0x04, 0x50, 0x6a, 0x63, 0x89, + 0x32, 0x49, 0xab, 0x4d, 0xb8, 0x16, 0x71, 0xef, 0x9f, 0x3f, 0x06, 0x28, + 0xb0, 0xd6, 0xd1, 0x95, 0x90, 0x5d, 0xa3, 0x8e, 0x02, 0x6a, 0x69, 0x59, + 0xb7, 0x1e, 0x64, 0x5c, 0xef, 0x07, 0x38, 0xba, 0x12, 0xf2, 0xc4, 0x27, + 0x1e, 0x4a, 0xf7, 0x1f, 0xd5, 0xe0, 0x46, 0xeb, 0xf7, 0x8f, 0x0e, 0xcd, + 0x92, 0xd8, 0x29, 0x90, 0x91, 0x64, 0xac, 0x02, 0x4b, 0x1d, 0xba, 0x3e, + 0x76, 0x52, 0x47, 0xc1, 0xb5, 0xd4, 0x23, 0x89, 0xe8, 0x02, 0x67, 0x2d, + 0xe9, 0x71, 0x1a, 0x21, 0x04, 0xf5, 0x8a, 0x64, 0x69, 0x4d, 0xfb, 0x93, + 0x19, 0x48, 0x0b, 0x32, 0x30, 0x57, 0x16, 0x00, 0xa1, 0xcc, 0xc0, 0x56, + 0x49, 0x47, 0xdd, 0x19, 0xdc, 0x52, 0x99, 0x7b, 0x1f, 0xb0, 0x38, 0x74, + 0xaf, 0xaa, 0x9b, 0xf7, 0x94, 0xe0, 0x70, 0x47, 0xb0, 0x07, 0xc9, 0x72, + 0x47, 0xa1, 0x1a, 0x8f, 0x74, 0x54, 0x3c, 0x0b, 0x1d, 0xbf, 0xa3, 0xd6, + 0x8f, 0x95, 0x54, 0x5e, 0x5d, 0x60, 0x0e, 0x05, 0xd9, 0x9a, 0x2f, 0x81, + 0xa7, 0x21, 0x89, 0x87, 0xf4, 0x47, 0x8d, 0x3e, 0x2d, 0xb2, 0x74, 0x8d, + 0xde, 0x25, 0x25, 0x9f, 0x13, 0x02, 0xd3, 0x63, 0x76, 0xa8, 0xd3, 0x06, + 0xca, 0x3c, 0x56, 0x32, 0xdb, 0x19, 0x28, 0xeb, 0x48, 0x09, 0x0e, 0x77, + 0xe0, 0xd3, 0x42, 0x70, 0xb8, 0xa3, 0x5a, 0x52, 0x0f, 0x95, 0x2c, 0x0e, + 0x57, 0x24, 0x1f, 0xfb, 0x15, 0x87, 0x43, 0xbf, 0x1e, 0x91, 0x68, 0x50, + 0x96, 0x01, 0x71, 0xc5, 0x3a, 0xef, 0x7b, 0x4a, 0xa4, 0x40, 0xaf, 0x65, + 0xe0, 0x0e, 0x9d, 0x5e, 0x53, 0xdb, 0x03, 0xdc, 0xaf, 0xf7, 0xf7, 0xc6, + 0x05, 0x38, 0x72, 0x9f, 0xcb, 0x5d, 0xf7, 0xaa, 0x36, 0xe1, 0x9e, 0x0e, + 0x9c, 0x15, 0xb0, 0x4b, 0xc3, 0xb6, 0x9e, 0x20, 0xf3, 0xbd, 0xde, 0x38, + 0xd7, 0x0f, 0xef, 0xfc, 0xe7, 0x5c, 0x93, 0x28, 0x58, 0x53, 0x2f, 0xa0, + 0xc9, 0xc0, 0x9f, 0x0c, 0xcc, 0x69, 0x8b, 0xab, 0x10, 0xe0, 0x06, 0xec, + 0x64, 0x00, 0x57, 0x06, 0x02, 0x75, 0xd5, 0x5b, 0xb6, 0xa4, 0x80, 0x29, + 0xa0, 0x2b, 0x2c, 0xef, 0x37, 0x1f, 0xcf, 0x6c, 0xe7, 0x81, 0x51, 0x79, + 0xdf, 0x90, 0x01, 0xa4, 0x7a, 0xd3, 0x37, 0xfe, 0x8c, 0x5e, 0x79, 0xe5, + 0x15, 0x26, 0x27, 0xd5, 0x3b, 0x0a, 0x2b, 0x2f, 0x9d, 0x4c, 0xf7, 0x0f, + 0x82, 0x66, 0x5d, 0xc5, 0xab, 0xec, 0xdc, 0xbb, 0x8f, 0x8b, 0x17, 0x2f, + 0x76, 0xf9, 0x9e, 0xdc, 0xbb, 0x8d, 0x8b, 0x17, 0x2f, 0xa6, 0x30, 0xac, + 0x41, 0x3e, 0xf3, 0xc7, 0xc4, 0xe4, 0xd3, 0x94, 0x75, 0x8b, 0x7b, 0x15, + 0xdb, 0xb6, 0x6d, 0x03, 0x14, 0xd0, 0xcb, 0xf8, 0x35, 0xe5, 0xc8, 0xc7, + 0xef, 0xd5, 0x35, 0xae, 0x2a, 0x5b, 0x1e, 0xe6, 0x65, 0xca, 0x6e, 0xf2, + 0x30, 0x9f, 0xdb, 0x37, 0xb9, 0x77, 0x5b, 0x57, 0xd9, 0x01, 0x7e, 0xf8, + 0x5f, 0xfd, 0xf8, 0x90, 0x33, 0xad, 0xea, 0x70, 0xb9, 0xb5, 0x8c, 0x25, + 0x2c, 0x6a, 0xe6, 0xfd, 0x89, 0x24, 0xa4, 0xbe, 0xaf, 0xce, 0xd2, 0x89, + 0x45, 0x6c, 0x20, 0xd1, 0x5f, 0xd7, 0x92, 0x89, 0xc4, 0x4f, 0x54, 0xcb, + 0x26, 0xd4, 0xfd, 0x72, 0xf1, 0x1a, 0x08, 0xda, 0x58, 0x95, 0x2a, 0x82, + 0x36, 0xde, 0xd6, 0x2a, 0x00, 0xb5, 0xeb, 0x55, 0x9b, 0x2c, 0x0e, 0x7c, + 0x6a, 0x37, 0xd6, 0x58, 0x7c, 0xb1, 0x81, 0xd8, 0xa2, 0xc6, 0xdd, 0x2c, + 0xcb, 0xc5, 0x3f, 0x1f, 0x12, 0xaf, 0x85, 0x84, 0x61, 0x88, 0x77, 0xb5, + 0xc7, 0xf8, 0x2d, 0xe3, 0xa8, 0xab, 0x34, 0xa2, 0x2d, 0xdb, 0x08, 0x04, + 0x12, 0x89, 0x7f, 0xca, 0xc7, 0xbb, 0xbe, 0x8e, 0x18, 0x81, 0xc5, 0xe3, + 0x73, 0x4c, 0xde, 0x36, 0x45, 0x92, 0x44, 0x88, 0x8e, 0x6a, 0xdb, 0x8a, + 0x11, 0x2b, 0x1b, 0x4a, 0x68, 0x25, 0x34, 0x9e, 0x6f, 0x52, 0xbf, 0x79, + 0x0c, 0xa9, 0xdf, 0x5d, 0x18, 0xc0, 0x4b, 0x23, 0x59, 0x8d, 0xa8, 0xd5, + 0xd5, 0x73, 0xa1, 0xcc, 0x7d, 0x8c, 0x2b, 0x01, 0x38, 0xe3, 0x33, 0x79, + 0xcb, 0x54, 0x5f, 0x9c, 0xa5, 0x53, 0x99, 0xdd, 0x93, 0x2f, 0x36, 0x19, + 0xaf, 0xba, 0xc4, 0x49, 0x76, 0x0d, 0x39, 0xba, 0x2f, 0x23, 0x09, 0x42, + 0x1a, 0x41, 0xc8, 0xd8, 0xa8, 0x05, 0x5b, 0x6b, 0x20, 0x24, 0x76, 0xc9, + 0x25, 0xee, 0x84, 0xe9, 0x77, 0xee, 0xba, 0x80, 0x5a, 0xe4, 0x02, 0x84, + 0xec, 0x86, 0x6b, 0x69, 0x80, 0x56, 0x19, 0x88, 0x2e, 0xf8, 0x58, 0x15, + 0x81, 0x65, 0x9b, 0xce, 0xd5, 0x32, 0x54, 0xa0, 0xdc, 0xc9, 0xb5, 0xd9, + 0x4a, 0x62, 0x68, 0x5f, 0xca, 0x0d, 0x6f, 0x7b, 0x5b, 0xba, 0xde, 0x0b, + 0xd0, 0x7a, 0xf5, 0x6b, 0x5f, 0xe9, 0xdb, 0x36, 0x00, 0xa9, 0xaf, 0xac, + 0x24, 0xfc, 0xe4, 0x4e, 0x8b, 0x57, 0xbf, 0xf6, 0x95, 0x14, 0xa8, 0x95, + 0x57, 0x2f, 0x6c, 0x2b, 0x2f, 0x13, 0xaf, 0x57, 0xbd, 0x90, 0xa9, 0xde, + 0xed, 0xda, 0x9e, 0x1f, 0x63, 0xe9, 0x8b, 0x2f, 0x03, 0x0a, 0x9a, 0xf5, + 0x33, 0x37, 0xee, 0xe7, 0xcb, 0xe7, 0x2e, 0xf0, 0x33, 0x37, 0xaa, 0x81, + 0x93, 0x3c, 0x50, 0xeb, 0x67, 0x6e, 0xdc, 0x9f, 0x02, 0xae, 0x7e, 0xf7, + 0xe3, 0xff, 0xa1, 0x2b, 0x9d, 0xb7, 0x5f, 0x47, 0x6a, 0xdf, 0x9b, 0x86, + 0xd1, 0x97, 0xcf, 0x5d, 0xe0, 0xe9, 0xff, 0xf4, 0xb9, 0x14, 0xca, 0x95, + 0x07, 0x74, 0xf5, 0xe6, 0x6f, 0x18, 0x74, 0x6c, 0xd4, 0xd9, 0xd1, 0x07, + 0x14, 0xcb, 0x2b, 0x0f, 0x07, 0xeb, 0x3d, 0x46, 0x7d, 0x9a, 0x46, 0x35, + 0x00, 0xa7, 0xcd, 0x5f, 0x35, 0x17, 0x1e, 0xa8, 0xf5, 0xa0, 0xca, 0x0d, + 0x6f, 0xab, 0xd2, 0xe0, 0x1b, 0xeb, 0xfb, 0x2a, 0x54, 0xa8, 0x50, 0xa1, + 0x42, 0x85, 0x0a, 0x15, 0x2a, 0x54, 0xa8, 0x50, 0xa1, 0x42, 0x85, 0x0a, + 0x15, 0x2a, 0x54, 0xa8, 0x50, 0xa1, 0x42, 0x85, 0x0a, 0x15, 0x2a, 0x54, + 0xa8, 0x50, 0xa1, 0x42, 0x43, 0x55, 0x40, 0xb5, 0x0a, 0x15, 0x2a, 0x54, + 0xa8, 0x50, 0xa1, 0xef, 0x95, 0x8e, 0xdb, 0xf0, 0x1e, 0xfd, 0xca, 0x6b, + 0x49, 0x12, 0x46, 0x52, 0x01, 0xb2, 0x86, 0xc0, 0x77, 0xf2, 0x40, 0x2d, + 0x00, 0x3a, 0x92, 0x5a, 0xd5, 0x23, 0x8a, 0x62, 0xc2, 0xb5, 0x28, 0x07, + 0x79, 0xc8, 0x5e, 0xcd, 0x93, 0x51, 0x42, 0x92, 0xc4, 0x58, 0x96, 0xad, + 0xfc, 0x4a, 0x88, 0x65, 0xac, 0x00, 0x24, 0xb9, 0x97, 0xc5, 0x0d, 0x48, + 0xab, 0x57, 0xe6, 0x8b, 0xce, 0x9e, 0xb0, 0x10, 0x23, 0x36, 0x72, 0x2d, + 0x26, 0x69, 0x25, 0x24, 0xad, 0x04, 0xb9, 0x16, 0x23, 0x46, 0xdc, 0x0c, + 0xcb, 0xa3, 0xd3, 0x4f, 0x92, 0x10, 0xc7, 0xf1, 0x32, 0xc0, 0x8d, 0x96, + 0xad, 0x27, 0xf2, 0x48, 0x29, 0x89, 0x93, 0xb8, 0x0f, 0xe7, 0xd3, 0x05, + 0xad, 0xea, 0x48, 0x05, 0x04, 0xeb, 0x40, 0x74, 0x29, 0xc2, 0xd9, 0xea, + 0x20, 0x3b, 0xaa, 0x6c, 0xa2, 0x44, 0x3a, 0xa1, 0x35, 0x0a, 0xc2, 0xb4, + 0xc8, 0xde, 0x4e, 0xf5, 0x32, 0xa4, 0x67, 0x59, 0xb8, 0xae, 0x7a, 0xc1, + 0x30, 0xbc, 0x14, 0x62, 0x59, 0x16, 0xcd, 0x33, 0x0d, 0xc2, 0x4b, 0xe1, + 0x10, 0x84, 0x10, 0x7d, 0x40, 0x2d, 0x00, 0x6f, 0xbb, 0x47, 0x28, 0x42, + 0x9a, 0x2b, 0xcd, 0xb4, 0x5c, 0x97, 0xa5, 0xe3, 0x19, 0xe4, 0x25, 0x39, + 0x2d, 0x61, 0x22, 0xdb, 0x55, 0x1f, 0x75, 0x69, 0x10, 0x2b, 0x98, 0xd6, + 0x9b, 0xcb, 0xa4, 0xe7, 0x4c, 0x9f, 0x13, 0xd7, 0x6f, 0x13, 0x5a, 0x40, + 0x4b, 0x2a, 0xc0, 0x16, 0x60, 0xb5, 0x20, 0x71, 0x14, 0x80, 0x4b, 0x44, + 0x20, 0x2b, 0x74, 0xc1, 0xac, 0xda, 0x25, 0x06, 0x4e, 0x32, 0xdb, 0x8c, + 0xe2, 0x44, 0x76, 0x4f, 0x14, 0xe8, 0xdd, 0xa7, 0x65, 0xf7, 0x80, 0x0a, + 0xe2, 0x16, 0x57, 0x04, 0xd4, 0xb2, 0x2d, 0x41, 0xbc, 0x76, 0x65, 0x30, + 0x2e, 0x60, 0xc3, 0xbc, 0xda, 0x96, 0xc0, 0x5f, 0x4d, 0x00, 0xf5, 0x05, + 0xd7, 0x8d, 0xd2, 0xd9, 0x10, 0xa8, 0xb5, 0x81, 0x92, 0xd3, 0x39, 0x60, + 0x5d, 0xee, 0xba, 0x36, 0xd7, 0xf3, 0xa0, 0x25, 0xd0, 0xb5, 0xbe, 0x9e, + 0xa4, 0x5c, 0x7f, 0x2a, 0x56, 0x7e, 0xbf, 0x10, 0x4e, 0xba, 0x6d, 0xc0, + 0x61, 0x56, 0xc5, 0x22, 0x69, 0x65, 0xe9, 0x98, 0x89, 0x0f, 0xbd, 0x13, + 0x4e, 0xda, 0xb2, 0x8d, 0x94, 0x12, 0xdb, 0x1a, 0x0e, 0x28, 0xea, 0x4e, + 0x57, 0xa6, 0xf1, 0xca, 0xe2, 0x32, 0x26, 0xb0, 0xf5, 0xd4, 0x0d, 0xa9, + 0xbf, 0x8e, 0xec, 0x9a, 0x94, 0xa1, 0xc0, 0x7e, 0x12, 0xd7, 0xc9, 0xc1, + 0x2a, 0x72, 0xfb, 0xbb, 0x00, 0x5b, 0x9d, 0x9e, 0xe5, 0x06, 0x32, 0x20, + 0xad, 0x5e, 0xa0, 0x56, 0x7a, 0x6c, 0x72, 0x79, 0x51, 0xe5, 0xcc, 0x9d, + 0x5f, 0xad, 0xfc, 0x75, 0x2d, 0xa5, 0x24, 0x5e, 0xeb, 0x9f, 0xe4, 0x67, + 0x8f, 0xd8, 0x5d, 0xe1, 0x06, 0xfe, 0xb4, 0x59, 0xfb, 0x2b, 0x89, 0xf3, + 0x83, 0x6e, 0x7f, 0x25, 0xbe, 0x7b, 0xc3, 0xcc, 0xb6, 0x3d, 0x62, 0x23, + 0xa5, 0x24, 0xd2, 0x13, 0xa6, 0xa2, 0xb5, 0x64, 0xe0, 0xa4, 0x27, 0x03, + 0x90, 0xcb, 0xef, 0xcb, 0x5f, 0xd7, 0x97, 0x4e, 0xb7, 0xa8, 0xfd, 0xcc, + 0x8f, 0xf6, 0xc5, 0x5b, 0x4f, 0x0b, 0x0b, 0x0b, 0x54, 0xab, 0xd3, 0xe9, + 0xa4, 0x3e, 0x80, 0x8f, 0xcd, 0x2e, 0xf4, 0xd9, 0xe5, 0xc3, 0xa6, 0xa7, + 0xa7, 0xd7, 0x8d, 0xdf, 0xab, 0xe3, 0x8f, 0x3c, 0x32, 0x30, 0xfc, 0x1c, + 0xc0, 0x23, 0x8f, 0xb0, 0xe3, 0x93, 0x9f, 0xe4, 0xfc, 0xb9, 0x73, 0x6f, + 0x38, 0xfc, 0xea, 0xf7, 0x80, 0xab, 0x77, 0x6c, 0xf0, 0x22, 0xf8, 0x0f, + 0x90, 0x2e, 0x9d, 0x6e, 0x01, 0x3f, 0x02, 0x40, 0xd2, 0xb2, 0xc9, 0xa6, + 0x23, 0x29, 0x90, 0x68, 0xb3, 0x7f, 0x00, 0x00, 0x20, 0x00, 0x49, 0x44, + 0x41, 0x54, 0x7d, 0xfa, 0x4f, 0x3f, 0xcb, 0xa1, 0x93, 0x20, 0x1f, 0x7c, + 0x37, 0xa0, 0xa0, 0x58, 0x9f, 0xfe, 0xd3, 0xcf, 0x72, 0xe8, 0xf6, 0x77, + 0x6f, 0x3a, 0x8d, 0xbb, 0xf7, 0xaa, 0x49, 0xa7, 0x47, 0x5f, 0x8a, 0x38, + 0x30, 0x0a, 0x51, 0xa5, 0x9c, 0xb6, 0xb1, 0x2c, 0xcb, 0x26, 0x5a, 0xf5, + 0xd3, 0x29, 0xb3, 0xb6, 0x0e, 0x17, 0x15, 0x41, 0xb8, 0x9a, 0xd5, 0xef, + 0xe5, 0x8a, 0xc0, 0xd2, 0xfb, 0xc2, 0x28, 0x4a, 0x5b, 0x7b, 0xae, 0xf5, + 0x4f, 0xcb, 0x5e, 0x00, 0xb2, 0xd5, 0x53, 0x67, 0xb0, 0x39, 0x25, 0x2d, + 0x1b, 0x44, 0x92, 0xad, 0x0f, 0x88, 0x79, 0xfb, 0x27, 0x0e, 0xf3, 0x24, + 0xc0, 0xa9, 0x65, 0x1e, 0x7d, 0x71, 0x91, 0x74, 0x16, 0xa4, 0xeb, 0xa8, + 0xbf, 0x7a, 0x1d, 0x1a, 0x0d, 0xc8, 0xdd, 0x57, 0x39, 0x73, 0x79, 0x13, + 0x9e, 0xc3, 0x55, 0xd5, 0xa6, 0xbc, 0xfb, 0xb7, 0xfb, 0xdb, 0xfc, 0x77, + 0xdf, 0xac, 0x96, 0x4b, 0x93, 0xdf, 0x5e, 0xdb, 0xe4, 0xc8, 0x97, 0xe6, + 0x53, 0xf8, 0xd4, 0xa1, 0xe3, 0x73, 0xfd, 0x06, 0xfb, 0x27, 0x61, 0xff, + 0x24, 0xc9, 0x89, 0x79, 0x58, 0xf5, 0x61, 0xaf, 0x0d, 0x2f, 0x6d, 0x0e, + 0x20, 0xfb, 0x5d, 0xd7, 0x57, 0xe7, 0x37, 0x2c, 0x07, 0x1f, 0x79, 0xa8, + 0x2b, 0x38, 0x69, 0xd9, 0x50, 0xd1, 0xe7, 0x3a, 0x77, 0xbf, 0x2e, 0x0b, + 0x91, 0x03, 0x6a, 0x19, 0xe9, 0x09, 0xf0, 0x4e, 0x76, 0x8f, 0x97, 0xed, + 0xec, 0xf8, 0x97, 0xb7, 0xf6, 0x27, 0x2b, 0xb6, 0x67, 0x13, 0xc9, 0xdb, + 0x1d, 0x0d, 0x63, 0x18, 0x34, 0x63, 0x0b, 0x28, 0x6f, 0x57, 0xcf, 0x34, + 0x7d, 0x40, 0x3e, 0x2b, 0xe9, 0x62, 0xc9, 0x99, 0x67, 0xc0, 0x5e, 0x88, + 0x95, 0xca, 0xdb, 0x60, 0xdf, 0x83, 0x6c, 0x87, 0x69, 0x98, 0xed, 0x06, + 0xfc, 0xd6, 0x3e, 0xdb, 0x41, 0x6d, 0xd7, 0x14, 0x1a, 0x86, 0xaa, 0x23, + 0xcb, 0xdb, 0xf5, 0x24, 0xb7, 0x9e, 0x63, 0x32, 0xe8, 0x18, 0x89, 0xed, + 0x0e, 0xbc, 0x48, 0x17, 0x0b, 0xc1, 0x1c, 0x73, 0xe1, 0xd8, 0x5d, 0xe7, + 0x22, 0x3d, 0x47, 0x5b, 0x05, 0xac, 0xa8, 0xd5, 0xfc, 0xfd, 0xfa, 0xe5, + 0xd6, 0x25, 0x26, 0x7f, 0xb4, 0xb6, 0xf9, 0x02, 0x15, 0xfa, 0x81, 0xd2, + 0xcb, 0xad, 0x4b, 0xe6, 0x76, 0xdd, 0x75, 0xbf, 0xae, 0xed, 0x0c, 0x09, + 0x57, 0x9a, 0x88, 0x8f, 0x34, 0xf0, 0xf6, 0xd6, 0xb1, 0x34, 0x18, 0x25, + 0x69, 0xb5, 0x49, 0x5a, 0x31, 0x84, 0xea, 0x77, 0x53, 0x16, 0x0a, 0xa4, + 0x35, 0x76, 0xab, 0x4b, 0xe3, 0xb9, 0x90, 0x5d, 0xfb, 0x3c, 0x08, 0x25, + 0xb1, 0x06, 0x7e, 0x7b, 0xd5, 0x1a, 0x62, 0x0b, 0xd4, 0xae, 0xad, 0xd1, + 0x3c, 0xdd, 0x24, 0x5c, 0x69, 0x52, 0xdb, 0x59, 0xa7, 0x76, 0xad, 0x82, + 0xb6, 0x4c, 0xde, 0x20, 0xf8, 0xdc, 0xb3, 0x6a, 0xf2, 0xa7, 0x8b, 0xab, + 0xa0, 0xdf, 0xc0, 0xbb, 0xde, 0xeb, 0xf2, 0xb9, 0xa7, 0x42, 0xea, 0xb7, + 0x28, 0xc0, 0x8d, 0x7f, 0x41, 0xf5, 0x1f, 0xd4, 0x6a, 0xd9, 0x6f, 0xd1, + 0x75, 0x2c, 0x96, 0x0f, 0x3c, 0x0e, 0x40, 0xfd, 0x7a, 0xb5, 0xed, 0xb8, + 0x6a, 0xe2, 0x6a, 0x14, 0xfa, 0xb0, 0x2a, 0x89, 0x42, 0x3f, 0x0d, 0x9b, + 0xba, 0xc3, 0x63, 0xf9, 0x38, 0x30, 0x2a, 0x90, 0x9d, 0xb6, 0xb2, 0x09, + 0x7d, 0xea, 0xf5, 0x1a, 0xf5, 0x7a, 0x8d, 0x28, 0xf4, 0x59, 0x9e, 0x7a, + 0x34, 0x05, 0x77, 0x19, 0x7f, 0xc1, 0x92, 0x82, 0x0c, 0x3a, 0xd2, 0xeb, + 0xf2, 0xe7, 0xec, 0x53, 0x79, 0x31, 0x20, 0xad, 0x47, 0xff, 0xb0, 0xc9, + 0x7d, 0xcf, 0x24, 0xd4, 0x6f, 0xad, 0x13, 0x9d, 0xf4, 0x71, 0xf6, 0x79, + 0x34, 0x9e, 0x6d, 0xe0, 0x3a, 0x16, 0x77, 0xdc, 0xe1, 0x71, 0xf4, 0xb7, + 0x1a, 0xd4, 0x6f, 0xad, 0xb3, 0xe7, 0x5a, 0x98, 0x3b, 0x0e, 0x8c, 0xa2, + 0x28, 0x4c, 0xa3, 0xd0, 0x78, 0x76, 0x09, 0x6b, 0xc4, 0x62, 0xea, 0xfd, + 0x1e, 0x4b, 0xcf, 0x34, 0x90, 0xe7, 0xeb, 0x84, 0x97, 0x7c, 0xa6, 0xde, + 0xef, 0xd1, 0xf8, 0x02, 0xe0, 0x48, 0x6a, 0xbb, 0x3d, 0x9e, 0xfc, 0x7d, + 0x55, 0x67, 0x87, 0x67, 0x96, 0x99, 0x7a, 0xff, 0x41, 0x1a, 0x27, 0x97, + 0x91, 0xab, 0xbb, 0x80, 0x26, 0x72, 0x02, 0x9a, 0x2f, 0x00, 0x56, 0x1b, + 0x92, 0x32, 0xf3, 0xa1, 0x4f, 0xf3, 0x85, 0x79, 0x6e, 0xb7, 0x72, 0xe7, + 0x57, 0xd7, 0xe1, 0xf9, 0xeb, 0xfa, 0xeb, 0x97, 0xf9, 0x9b, 0xf9, 0x7f, + 0x4e, 0xff, 0x03, 0x6f, 0x79, 0xf7, 0x9b, 0xfa, 0xc2, 0xfd, 0x8b, 0xdf, + 0xa2, 0xf5, 0xda, 0xb7, 0x36, 0xf4, 0xe7, 0x5f, 0xdc, 0xd8, 0xe6, 0x4a, + 0xe5, 0x5f, 0xfc, 0xd6, 0xc0, 0xbc, 0x01, 0x9c, 0x39, 0xbf, 0x71, 0xba, + 0x87, 0xee, 0xfc, 0x21, 0xce, 0x3e, 0xf6, 0x0f, 0x00, 0x9c, 0xd4, 0x61, + 0x61, 0xfc, 0x0f, 0xfc, 0x77, 0x3d, 0x76, 0x5f, 0x05, 0xbe, 0x08, 0xfc, + 0x3a, 0xf0, 0xc3, 0x3a, 0x2c, 0x00, 0xfe, 0x1a, 0xf8, 0x7f, 0xa1, 0xcf, + 0x7e, 0x33, 0xfa, 0x6f, 0x74, 0x43, 0xb4, 0xf2, 0x3a, 0xa3, 0x97, 0xaf, + 0xb7, 0xbe, 0x95, 0xfa, 0x36, 0x61, 0xff, 0x22, 0xb7, 0x34, 0xbd, 0x6b, + 0xf9, 0xeb, 0x3a, 0xff, 0xcc, 0x35, 0xbf, 0xd4, 0xd0, 0x16, 0x6a, 0x79, + 0xf0, 0x36, 0x80, 0x03, 0xb8, 0xe6, 0x9e, 0xa5, 0xa1, 0x54, 0x38, 0xc7, + 0xe0, 0x19, 0x78, 0x62, 0x49, 0xd9, 0xfa, 0xb9, 0x38, 0x46, 0x9e, 0x25, + 0x72, 0xfe, 0x06, 0xa9, 0x91, 0xb3, 0x85, 0xf9, 0x67, 0x8e, 0xf5, 0x85, + 0x0f, 0xb4, 0x05, 0xb0, 0x50, 0x40, 0x2e, 0xc0, 0x4f, 0xf2, 0xfb, 0x1b, + 0x03, 0xe2, 0x0c, 0x0a, 0xd3, 0x80, 0x87, 0xdb, 0xc0, 0xd5, 0x10, 0x2f, + 0x03, 0xdc, 0x8a, 0xe3, 0x06, 0xae, 0xd3, 0x50, 0xe5, 0x1b, 0x10, 0xaf, + 0x37, 0x7f, 0xcf, 0xec, 0xa5, 0x8b, 0xe2, 0x63, 0x60, 0x57, 0x16, 0xeb, + 0xf3, 0xe8, 0xba, 0x20, 0x5a, 0x66, 0xfd, 0x06, 0x52, 0x70, 0xd6, 0xc0, + 0x38, 0x1b, 0x84, 0x07, 0x80, 0xf5, 0x79, 0xed, 0xaf, 0xaa, 0xc2, 0xba, + 0x9e, 0xb9, 0xf2, 0x7d, 0x29, 0xd7, 0x1e, 0x66, 0xfc, 0xda, 0xcc, 0x47, + 0xe3, 0xe4, 0x22, 0x8f, 0x3e, 0xaa, 0x00, 0x46, 0x07, 0x6e, 0xbb, 0x9d, + 0xb1, 0x7d, 0x7b, 0xb0, 0x1d, 0x35, 0xc1, 0xfd, 0xd8, 0xb3, 0x73, 0x8c, + 0xbd, 0x5f, 0x81, 0x01, 0x1b, 0x67, 0x9a, 0xd4, 0x77, 0x67, 0xf5, 0x6c, + 0x18, 0x42, 0x7d, 0x77, 0x0d, 0xab, 0xaa, 0xe0, 0x22, 0x61, 0xe4, 0x23, + 0x3a, 0x4d, 0xc6, 0xf6, 0xd6, 0x58, 0x7a, 0x49, 0x2d, 0x1f, 0x7e, 0xe4, + 0x18, 0x63, 0x7b, 0x6b, 0x84, 0xab, 0xb0, 0xf4, 0x52, 0x93, 0xdb, 0x7f, + 0xf3, 0x2f, 0xb2, 0xf8, 0xab, 0xaa, 0xee, 0xde, 0xbf, 0x43, 0xed, 0x03, + 0x52, 0x7b, 0xb3, 0x7d, 0xfb, 0x6f, 0xfe, 0x05, 0xde, 0x76, 0x58, 0x5c, + 0xca, 0x6c, 0x8d, 0x96, 0x5e, 0x6a, 0xf2, 0xf0, 0x23, 0xc7, 0xc8, 0x2b, + 0xef, 0x5f, 0x74, 0x8e, 0xa5, 0x69, 0x8c, 0xed, 0x55, 0xf9, 0x3e, 0xf6, + 0x67, 0xc7, 0xb8, 0xfb, 0x97, 0xa7, 0xd2, 0xbc, 0x7b, 0xef, 0x54, 0x40, + 0x30, 0x3f, 0xf0, 0xb9, 0xf3, 0x3d, 0xea, 0x77, 0xe0, 0x37, 0x7d, 0x26, + 0xcb, 0xaa, 0xac, 0xc7, 0x9e, 0x9d, 0x63, 0x6c, 0xdf, 0x1e, 0xc2, 0x08, + 0x96, 0x4e, 0x2e, 0x73, 0xf0, 0xd6, 0x4f, 0xe3, 0xd8, 0xd0, 0xb8, 0x25, + 0xe2, 0xc4, 0xd2, 0x3c, 0x77, 0xff, 0xbb, 0x8f, 0xd1, 0x38, 0xa9, 0x20, + 0xb4, 0x8f, 0x3e, 0xfa, 0x24, 0xf5, 0x7d, 0xe3, 0x84, 0x51, 0x90, 0x1e, + 0xd7, 0xa9, 0x5b, 0x6f, 0xc7, 0xb2, 0x12, 0x1a, 0xa7, 0xd4, 0x15, 0xe8, + 0x51, 0xc3, 0x2a, 0x35, 0xd8, 0xb3, 0xaf, 0xce, 0xf2, 0xc9, 0x06, 0x4f, + 0x3c, 0x35, 0xaf, 0x73, 0x2b, 0x99, 0xdc, 0x3f, 0x89, 0x3d, 0xa2, 0x00, + 0x61, 0x73, 0x27, 0x62, 0x6a, 0xb5, 0xf1, 0xec, 0xb2, 0x03, 0x9a, 0xcd, + 0x45, 0x16, 0x97, 0xe6, 0x98, 0xba, 0x65, 0x92, 0x64, 0x0d, 0x3c, 0xaf, + 0x06, 0xab, 0x8d, 0xec, 0xfc, 0xea, 0xb6, 0xd9, 0x72, 0x2b, 0x61, 0x6a, + 0xc0, 0x30, 0x87, 0x69, 0x17, 0xcb, 0x5c, 0x1f, 0x9e, 0x33, 0xe2, 0x11, + 0xe4, 0x00, 0xaa, 0xa2, 0x54, 0xd6, 0x36, 0xed, 0x81, 0xdb, 0xbd, 0x61, + 0xa2, 0x54, 0xee, 0x6a, 0x73, 0x1b, 0xdf, 0x6a, 0x5b, 0xa4, 0xfd, 0x7c, + 0x5d, 0xfd, 0x7d, 0x1d, 0x1b, 0x7b, 0xc4, 0x41, 0x76, 0x62, 0x12, 0x19, + 0x01, 0x11, 0x96, 0x70, 0x10, 0x25, 0x9b, 0xb2, 0x65, 0x91, 0x44, 0x21, + 0x89, 0x3c, 0x91, 0x65, 0xd2, 0xf8, 0xa4, 0xac, 0xe0, 0x08, 0x12, 0x2c, + 0x51, 0x56, 0xcb, 0x5c, 0xba, 0x49, 0x57, 0xdf, 0x64, 0xbb, 0x67, 0x39, + 0x58, 0xb2, 0xa5, 0xe1, 0xb9, 0x39, 0xd9, 0x95, 0x1a, 0x71, 0xab, 0xb9, + 0x41, 0x3c, 0xd9, 0xf7, 0xa1, 0x8a, 0xcb, 0x8d, 0x67, 0xb0, 0x43, 0xae, + 0xa8, 0x11, 0xae, 0x75, 0xc3, 0x81, 0xd7, 0xd3, 0x72, 0x2b, 0x49, 0x6d, + 0xf3, 0x75, 0x78, 0x30, 0xc0, 0x76, 0x21, 0xb7, 0x6e, 0xf6, 0xe7, 0xba, + 0xc0, 0x60, 0x1a, 0x66, 0xa6, 0xc1, 0x74, 0x91, 0x2d, 0xcc, 0x54, 0x09, + 0xaa, 0x81, 0xaa, 0x2b, 0xaa, 0xb0, 0x30, 0x03, 0xd3, 0x33, 0x10, 0xcc, + 0xe6, 0xa2, 0x4c, 0x54, 0x01, 0x98, 0x98, 0x86, 0xd9, 0x85, 0x80, 0x6a, + 0x55, 0xc5, 0x4f, 0x81, 0x58, 0x55, 0x05, 0xaf, 0xaa, 0x02, 0x13, 0xda, + 0x16, 0xba, 0x6d, 0x01, 0x26, 0x26, 0x74, 0xbe, 0x02, 0x98, 0x0d, 0xba, + 0xa1, 0x5d, 0x81, 0xce, 0x63, 0x75, 0x5a, 0x71, 0x0d, 0x66, 0xf2, 0x79, + 0x46, 0x81, 0xad, 0x66, 0xa6, 0xab, 0x50, 0x0d, 0x98, 0x9d, 0x51, 0x70, + 0xae, 0xd9, 0xc0, 0xe4, 0x2f, 0x4b, 0x03, 0x60, 0xf9, 0x77, 0xe0, 0xcf, + 0x57, 0x54, 0x3a, 0x06, 0xe0, 0x35, 0x1b, 0xa8, 0xf4, 0x0d, 0x60, 0x2b, + 0x08, 0xb2, 0xe3, 0x63, 0xa0, 0x59, 0x33, 0xd3, 0x0a, 0xe8, 0x65, 0x8e, + 0x57, 0x0a, 0xdb, 0xca, 0x69, 0x76, 0x16, 0xa6, 0xa7, 0x83, 0x0c, 0xa6, + 0xb5, 0x90, 0xf9, 0x99, 0x01, 0x02, 0xbd, 0x15, 0x00, 0xef, 0x7b, 0x9f, + 0x42, 0x06, 0x4d, 0xff, 0xc9, 0x11, 0x96, 0x7f, 0x07, 0xf6, 0xfc, 0x81, + 0xb2, 0x99, 0x05, 0x66, 0xa8, 0x12, 0xe8, 0x02, 0x04, 0x0b, 0xf0, 0x53, + 0xfa, 0x58, 0x6c, 0xd4, 0x6f, 0xb6, 0x2e, 0x80, 0x8a, 0xf5, 0x3f, 0xcc, + 0xb1, 0x19, 0xe5, 0xfb, 0x6b, 0x8d, 0x9f, 0xde, 0xfe, 0xdd, 0x41, 0xfd, + 0xbd, 0x7d, 0x61, 0x25, 0xa1, 0x7e, 0xf7, 0x5d, 0x63, 0x0a, 0x03, 0xf2, + 0xae, 0x6d, 0xf3, 0xf1, 0xba, 0x96, 0x39, 0xb8, 0xd6, 0x50, 0xe5, 0x8e, + 0xc3, 0xb7, 0x5b, 0x7e, 0x03, 0xd4, 0x72, 0x1d, 0x0f, 0xd9, 0x92, 0x20, + 0xca, 0x7a, 0xbc, 0x57, 0xf0, 0xb1, 0x9f, 0xbf, 0x93, 0x8f, 0xff, 0xf9, + 0x63, 0x1c, 0xfc, 0xc8, 0x61, 0x9e, 0xf8, 0xc4, 0x43, 0x1c, 0xe5, 0x20, + 0x0f, 0x3c, 0xf8, 0x10, 0xf7, 0xde, 0x73, 0x98, 0x07, 0x1e, 0x7c, 0x08, + 0xeb, 0x56, 0x05, 0xcd, 0x3a, 0xba, 0x92, 0x8d, 0x6d, 0xe6, 0xc3, 0x01, + 0x16, 0x3f, 0xf5, 0x30, 0x06, 0x25, 0x93, 0xef, 0x37, 0xeb, 0x1a, 0xbf, + 0xa6, 0x1f, 0xa8, 0x05, 0x0a, 0x9c, 0x25, 0x3a, 0xdd, 0x90, 0x2c, 0x50, + 0x5c, 0x18, 0x2a, 0x22, 0x1d, 0x03, 0x5a, 0x5a, 0x53, 0xb8, 0xc4, 0x04, + 0xd1, 0x65, 0xdb, 0x15, 0xaf, 0x03, 0x5e, 0x49, 0x10, 0x22, 0x89, 0xc8, + 0x40, 0x55, 0xf5, 0x12, 0x34, 0x74, 0xdd, 0xfa, 0xf8, 0xbf, 0x4f, 0xb0, + 0x2b, 0x6a, 0x5c, 0xf2, 0x8e, 0x0e, 0xf8, 0x25, 0xf5, 0xb7, 0xa7, 0x03, + 0x8e, 0x06, 0x55, 0xe5, 0xdb, 0x3e, 0xf9, 0x75, 0xaf, 0xa3, 0xe0, 0x5a, + 0xa0, 0x96, 0x16, 0xca, 0x6f, 0xbe, 0x44, 0x87, 0x00, 0xbb, 0x04, 0x71, + 0x47, 0xa6, 0x20, 0x9c, 0x3c, 0xae, 0xf3, 0x88, 0x84, 0x7b, 0x72, 0xe3, + 0x60, 0x26, 0x8f, 0xa6, 0xde, 0x3f, 0xa4, 0xc7, 0xbd, 0xee, 0xea, 0x48, + 0x9d, 0xb6, 0x48, 0xd7, 0x0f, 0xfd, 0xfa, 0xe0, 0x31, 0xbe, 0x3d, 0x25, + 0x58, 0xee, 0xe8, 0x3f, 0xc0, 0x2e, 0x09, 0x62, 0x21, 0x59, 0x92, 0x26, + 0x2f, 0xaa, 0xdd, 0x79, 0xac, 0x23, 0x39, 0x86, 0x82, 0xf1, 0x98, 0x70, + 0x03, 0xcd, 0x02, 0xc9, 0xa3, 0xf7, 0xfb, 0x69, 0xf8, 0x1d, 0x25, 0x38, + 0x8c, 0x6a, 0x73, 0xef, 0xc9, 0xc1, 0xbf, 0xec, 0x52, 0xae, 0xb9, 0x98, + 0x1b, 0xe7, 0xe2, 0x2f, 0x6d, 0xf8, 0xc5, 0xec, 0x5c, 0x6f, 0x71, 0xaf, + 0x82, 0xd7, 0x5e, 0x51, 0x90, 0xa8, 0xd7, 0x14, 0xa0, 0xe9, 0x9a, 0x9e, + 0xfe, 0x9c, 0x3c, 0xc0, 0xca, 0xd8, 0x5f, 0xf5, 0x96, 0x2d, 0x29, 0x80, + 0x0a, 0xba, 0x01, 0x5b, 0x66, 0x1d, 0x48, 0xfd, 0x5e, 0x73, 0xcd, 0x35, + 0x5d, 0xf1, 0x7a, 0x7d, 0x1b, 0x00, 0x97, 0xf1, 0xd7, 0x9b, 0xbe, 0x81, + 0x54, 0xe5, 0xf3, 0x99, 0xb7, 0x5d, 0x79, 0xe9, 0x64, 0x9a, 0xbf, 0x3c, + 0x48, 0x6b, 0x90, 0xcf, 0x5e, 0xdb, 0x57, 0x5f, 0x7b, 0x3d, 0x83, 0x6e, + 0xad, 0xe3, 0xd3, 0xe4, 0xdd, 0xe4, 0xd5, 0xe4, 0xc7, 0xec, 0x9f, 0xcf, + 0x41, 0xb3, 0x8c, 0x3f, 0xa3, 0xfc, 0x31, 0xcd, 0x97, 0xdf, 0xf8, 0x37, + 0x3e, 0x7b, 0x8f, 0xe9, 0xfc, 0xfc, 0x7c, 0xdf, 0x31, 0x9d, 0x9f, 0x9f, + 0x4f, 0xf7, 0xf7, 0xe6, 0x99, 0xbf, 0xcc, 0x8d, 0x69, 0xe6, 0xea, 0x70, + 0xff, 0xb4, 0x4f, 0x7d, 0xbf, 0x02, 0x16, 0x85, 0x6b, 0x09, 0xb2, 0x25, + 0x89, 0x4e, 0x36, 0x70, 0x2b, 0xe5, 0xb4, 0x96, 0x5f, 0x3a, 0x7e, 0x02, + 0x6b, 0x6b, 0x15, 0x61, 0x95, 0x19, 0xbb, 0x65, 0x3f, 0x73, 0xc7, 0x55, + 0xbb, 0x48, 0xd0, 0xa6, 0x71, 0xb2, 0x41, 0x7d, 0x5f, 0x1d, 0x7b, 0xd4, + 0xa6, 0x71, 0x72, 0x9e, 0xfa, 0x8d, 0x93, 0x80, 0x50, 0xe3, 0xe0, 0x15, + 0x81, 0x7f, 0xca, 0xc7, 0x15, 0x16, 0xa1, 0xe9, 0x47, 0x5c, 0x58, 0x44, + 0x54, 0x04, 0xb6, 0x65, 0x33, 0x7e, 0xcb, 0x38, 0x8d, 0x53, 0x4d, 0xec, + 0x35, 0x1b, 0x2a, 0x11, 0x62, 0xc4, 0x01, 0x19, 0xd1, 0x5e, 0x6b, 0x83, + 0xb4, 0x10, 0x25, 0x49, 0xf3, 0x4c, 0x03, 0xab, 0x24, 0xf0, 0x3c, 0x0f, + 0xff, 0x54, 0x93, 0x3d, 0x7b, 0xc7, 0xa1, 0xa2, 0xc7, 0x8d, 0x75, 0x7e, + 0xad, 0xaa, 0x43, 0x12, 0x49, 0x1c, 0xd7, 0x21, 0x3c, 0xe3, 0xe3, 0xee, + 0xf6, 0xd2, 0xf1, 0x6d, 0xf3, 0xc1, 0xa6, 0xe6, 0x19, 0x9f, 0xda, 0x6e, + 0x0f, 0xff, 0x8c, 0x4f, 0x6d, 0xb7, 0xb6, 0xdb, 0xb1, 0x4b, 0x95, 0x7b, + 0xf5, 0x2c, 0xde, 0x88, 0x0d, 0x16, 0xf8, 0x41, 0x93, 0xc5, 0x17, 0x42, + 0x6e, 0xbf, 0x75, 0x8a, 0x04, 0x41, 0xb9, 0x24, 0x49, 0x28, 0x73, 0xe0, + 0xe6, 0x31, 0x12, 0xd4, 0x3d, 0x25, 0x4e, 0x04, 0xbe, 0xcc, 0xea, 0x53, + 0x23, 0x4f, 0xf7, 0x0f, 0x45, 0x51, 0x84, 0xbf, 0x9a, 0xa4, 0xe3, 0x93, + 0xbb, 0xae, 0x57, 0xcf, 0x2e, 0x22, 0x6a, 0xc2, 0x68, 0x1d, 0x51, 0x1a, + 0xf2, 0x74, 0x66, 0xea, 0x42, 0x0d, 0xd7, 0x2a, 0x97, 0x20, 0x94, 0x31, + 0xd6, 0x56, 0x01, 0x08, 0xca, 0xba, 0xee, 0xad, 0x5d, 0x5d, 0x23, 0x89, + 0xf3, 0xe9, 0x8b, 0xae, 0x31, 0x71, 0xd5, 0x97, 0xd2, 0xea, 0xbb, 0xa6, + 0xf3, 0xf0, 0xa7, 0x8d, 0xe0, 0x56, 0xa0, 0xc0, 0x58, 0x46, 0xc3, 0x00, + 0x5a, 0xbd, 0xdb, 0x1b, 0x81, 0xa3, 0x7a, 0xd3, 0x30, 0xdb, 0x5f, 0x3e, + 0x77, 0x81, 0xb7, 0x5f, 0x07, 0xcd, 0xe5, 0xbf, 0x4b, 0xfd, 0x1a, 0x90, + 0xd6, 0xff, 0xf4, 0xee, 0x69, 0xfe, 0xcf, 0xcf, 0xce, 0xf2, 0xd6, 0xab, + 0xb7, 0x33, 0xea, 0xec, 0x48, 0x81, 0x5a, 0x79, 0xcd, 0x1e, 0xfb, 0x6d, + 0x9a, 0xcb, 0x7f, 0x97, 0x82, 0xc0, 0xbe, 0xb2, 0x92, 0xf4, 0xa5, 0x91, + 0x2f, 0xe3, 0x97, 0xcf, 0x5d, 0xe0, 0xad, 0x57, 0x6f, 0xe7, 0xd7, 0x7f, + 0xf7, 0x03, 0x34, 0x97, 0xff, 0x8e, 0xda, 0x9e, 0x1f, 0xa3, 0xb9, 0xfc, + 0x77, 0x7d, 0x70, 0xae, 0x5e, 0x28, 0xd6, 0x20, 0x38, 0xd7, 0x7a, 0xe5, + 0x36, 0xf1, 0xf2, 0xfb, 0xf3, 0xf9, 0xe8, 0x8a, 0x37, 0xa3, 0xff, 0x82, + 0x2a, 0x4c, 0x04, 0x40, 0xa0, 0xc0, 0x5a, 0xd5, 0x20, 0x83, 0xc2, 0x4e, + 0x07, 0xa4, 0x1b, 0xb9, 0x6b, 0xba, 0x50, 0xa1, 0x42, 0x85, 0x0a, 0x15, + 0x2a, 0x54, 0xa8, 0x50, 0xa1, 0x42, 0x85, 0x0a, 0x15, 0x2a, 0x54, 0xa8, + 0x50, 0xa1, 0x42, 0x85, 0x0a, 0x15, 0x2a, 0x54, 0xa8, 0x50, 0xa1, 0x42, + 0x85, 0x0a, 0x6d, 0x5e, 0x05, 0x54, 0xab, 0x50, 0xa1, 0x42, 0x85, 0x0a, + 0x15, 0xfa, 0x1e, 0x4b, 0xae, 0x48, 0x62, 0x91, 0xbd, 0xe4, 0x95, 0x07, + 0xee, 0x98, 0x6d, 0xdb, 0x72, 0xfa, 0x5e, 0xd2, 0x96, 0xe9, 0xcb, 0xdc, + 0xe0, 0x8e, 0x38, 0x84, 0x6b, 0x1a, 0xa4, 0x53, 0x52, 0x2f, 0xf7, 0x95, + 0x2d, 0x0b, 0x21, 0xca, 0x6a, 0x62, 0x96, 0x99, 0x2c, 0xd2, 0x92, 0xb4, + 0x93, 0x98, 0x78, 0x2d, 0xc6, 0x1d, 0xd5, 0x6f, 0x6c, 0xe6, 0xbe, 0xda, + 0xac, 0x13, 0x46, 0x94, 0x44, 0xfa, 0xe2, 0x61, 0xfe, 0x45, 0x69, 0xe1, + 0xb8, 0x24, 0x51, 0x88, 0x30, 0x90, 0x94, 0xb5, 0x50, 0x7d, 0xcb, 0x77, + 0xc4, 0x86, 0x8e, 0x40, 0xae, 0x85, 0x58, 0x23, 0xae, 0x06, 0x68, 0x49, + 0xfd, 0x32, 0x5f, 0x16, 0xdf, 0xde, 0x6a, 0xe3, 0xfb, 0x21, 0xea, 0x1b, + 0x9a, 0x22, 0xdd, 0x53, 0xb6, 0x6c, 0x9c, 0xed, 0x55, 0xca, 0xa8, 0x17, + 0x81, 0x8d, 0x7c, 0x3f, 0x00, 0x14, 0x58, 0xcb, 0x13, 0xfa, 0x6b, 0xa9, + 0x1d, 0x68, 0xcb, 0x98, 0x78, 0x45, 0x43, 0x53, 0x2a, 0x2a, 0x2f, 0xd6, + 0x56, 0x75, 0xbc, 0x6c, 0x91, 0xbd, 0x4c, 0xe6, 0x79, 0x35, 0x9a, 0xe7, + 0xb2, 0x49, 0x24, 0x89, 0x9e, 0x30, 0x6b, 0x5e, 0x44, 0x4f, 0x92, 0x04, + 0xc7, 0x71, 0x06, 0x80, 0x78, 0x64, 0x9a, 0x5f, 0xaf, 0xe5, 0xe1, 0xaf, + 0x36, 0x61, 0x93, 0x2f, 0xbe, 0xcb, 0x15, 0x39, 0x14, 0xde, 0x15, 0xad, + 0x26, 0x6a, 0xf6, 0x11, 0xc0, 0x9b, 0xcb, 0x88, 0xd5, 0x04, 0xaf, 0x04, + 0xcd, 0xad, 0x36, 0xa2, 0x19, 0x22, 0x11, 0xb8, 0xfa, 0xcb, 0xa6, 0xd8, + 0x65, 0xdc, 0x04, 0xe2, 0x66, 0x88, 0xac, 0xb9, 0x10, 0x49, 0xac, 0xf3, + 0x92, 0x44, 0xa8, 0x73, 0x2c, 0x2b, 0xe0, 0x21, 0x88, 0x57, 0xb3, 0x7c, + 0xb5, 0xf5, 0xb1, 0xdb, 0x0c, 0x5c, 0xcb, 0x75, 0xac, 0x2e, 0x60, 0xd6, + 0x7a, 0xe0, 0x29, 0xdb, 0x12, 0xc4, 0x89, 0xc4, 0x5f, 0x4d, 0xa8, 0xef, + 0x76, 0x89, 0xcd, 0x57, 0x5c, 0x73, 0x13, 0x0d, 0x92, 0xb5, 0xf5, 0xa6, + 0xe9, 0x75, 0xa7, 0x17, 0x27, 0x9b, 0x07, 0x6a, 0xb9, 0xce, 0x80, 0xd9, + 0x57, 0x43, 0xd2, 0xb4, 0x2d, 0x81, 0x1f, 0x45, 0xd8, 0x25, 0x07, 0x6b, + 0x44, 0x90, 0xac, 0xe5, 0x26, 0x38, 0xbc, 0x01, 0xe9, 0xf5, 0x2a, 0x5a, + 0x4d, 0x50, 0xaf, 0xdf, 0xf7, 0xab, 0xf7, 0x77, 0x60, 0xae, 0xeb, 0xde, + 0xeb, 0x7b, 0x63, 0xe5, 0x27, 0xa0, 0x64, 0xc0, 0xac, 0xa1, 0xd6, 0x43, + 0xf6, 0x27, 0x6b, 0x49, 0x6e, 0xb2, 0xd4, 0xf0, 0xdf, 0xb2, 0x10, 0xa2, + 0x0f, 0x34, 0x35, 0x48, 0xbd, 0x36, 0x9b, 0x89, 0x33, 0x48, 0xf9, 0xc9, + 0x6c, 0xf9, 0xba, 0xc6, 0xb6, 0x6c, 0x05, 0xdf, 0x13, 0x82, 0x30, 0x0a, + 0x53, 0xb0, 0x96, 0x5c, 0x6f, 0xb2, 0xca, 0xb7, 0xa9, 0x61, 0x79, 0x81, + 0x8d, 0xaf, 0xeb, 0x30, 0xf7, 0x22, 0x75, 0xfe, 0xab, 0xf7, 0x06, 0x9c, + 0x62, 0xc2, 0xcc, 0xb6, 0x59, 0x6e, 0x64, 0x9f, 0xb7, 0xdd, 0x6c, 0x9c, + 0x1f, 0x74, 0xfb, 0x2b, 0xf1, 0x0d, 0xd9, 0xa4, 0x2a, 0xf3, 0xc2, 0xba, + 0xd9, 0x6f, 0x6c, 0xcd, 0xfe, 0xfc, 0xfd, 0xce, 0xf8, 0xcd, 0xdb, 0x44, + 0xab, 0x92, 0x61, 0xd7, 0xf5, 0x85, 0xd5, 0x16, 0xa3, 0x03, 0xf7, 0x6c, + 0xac, 0xf5, 0xe0, 0x58, 0xfd, 0xb6, 0xd5, 0x81, 0xf1, 0xcf, 0x7e, 0x53, + 0xad, 0x9f, 0x3f, 0x77, 0x6e, 0x28, 0x50, 0xeb, 0xfc, 0xf1, 0xe3, 0xe9, + 0xfa, 0x71, 0xbd, 0xfe, 0x46, 0x43, 0xb5, 0xfe, 0x00, 0xf8, 0xc7, 0x80, + 0xd4, 0xba, 0xb0, 0xda, 0x02, 0x46, 0x06, 0xee, 0x8b, 0x5a, 0xd9, 0xfa, + 0xa1, 0x25, 0xc9, 0x43, 0x7b, 0x41, 0xfc, 0xe9, 0x67, 0xb3, 0xb0, 0x93, + 0xdd, 0x13, 0x80, 0x61, 0x00, 0x30, 0x27, 0xa7, 0xa3, 0x2f, 0x65, 0x75, + 0xf3, 0xb1, 0x55, 0xf0, 0xf6, 0x8e, 0x21, 0xde, 0x0c, 0xc9, 0x85, 0x08, + 0xd6, 0x00, 0xe1, 0xd0, 0x3e, 0xef, 0x23, 0x3b, 0x09, 0x35, 0x47, 0xd7, + 0xa7, 0x6b, 0xdd, 0x3e, 0xda, 0x49, 0x3b, 0x05, 0x90, 0xa6, 0xbf, 0xe2, + 0x28, 0x21, 0xee, 0xfc, 0xd3, 0xb2, 0x97, 0x39, 0xc0, 0xe7, 0x66, 0xef, + 0x08, 0xf9, 0xf3, 0xd9, 0xb7, 0x2f, 0x91, 0xf0, 0xbb, 0x1f, 0xe5, 0x00, + 0x70, 0x6c, 0xa5, 0xc1, 0x93, 0xa7, 0x96, 0x87, 0x1b, 0x87, 0x11, 0xfc, + 0xd9, 0x3a, 0xfb, 0x2f, 0x43, 0xef, 0xfc, 0xf9, 0x43, 0xe4, 0xeb, 0x9a, + 0x9a, 0x15, 0x74, 0xed, 0xbf, 0xff, 0xdf, 0xc1, 0xbb, 0x7f, 0xf5, 0xf2, + 0xfd, 0x3e, 0xf8, 0x5f, 0xfe, 0x82, 0x7b, 0x60, 0x30, 0x80, 0x2a, 0xaf, + 0x55, 0x1f, 0x4e, 0xcc, 0x7f, 0xff, 0x82, 0xb4, 0xe8, 0x06, 0x83, 0x0d, + 0x95, 0x29, 0x87, 0x56, 0x94, 0x48, 0x18, 0x1d, 0x0c, 0x8f, 0x8a, 0xa2, + 0x08, 0xc7, 0x91, 0xc8, 0x50, 0x22, 0x2c, 0x91, 0x41, 0x9c, 0x2e, 0xe9, + 0xfb, 0x43, 0x14, 0xab, 0x89, 0xf9, 0x23, 0x22, 0xdd, 0x06, 0x68, 0x5f, + 0x02, 0xb6, 0xc6, 0x94, 0xb1, 0x69, 0x5f, 0xd2, 0xbf, 0xc9, 0x0b, 0x51, + 0x0a, 0xd6, 0x92, 0x17, 0xd4, 0xf5, 0x2d, 0x43, 0xa0, 0x0c, 0xa6, 0x89, + 0x67, 0x9a, 0x06, 0xed, 0x0b, 0xa1, 0x9a, 0x4c, 0x6a, 0xdb, 0x7a, 0x3b, + 0xce, 0xf6, 0x6f, 0xa9, 0x21, 0x2a, 0x1a, 0xe0, 0xab, 0x68, 0x1c, 0xc4, + 0x7e, 0x8c, 0x5d, 0x11, 0xb0, 0x35, 0x2b, 0x87, 0x8c, 0x40, 0x96, 0x5c, + 0xac, 0x91, 0x30, 0xdd, 0x1e, 0x64, 0x1b, 0xfb, 0xca, 0x77, 0xb2, 0xb6, + 0x79, 0xdb, 0x5e, 0xdf, 0x00, 0xed, 0x8e, 0x44, 0x5c, 0xa2, 0xdf, 0xaf, + 0x9f, 0x74, 0xe5, 0xd9, 0x94, 0x31, 0xf6, 0xe3, 0x14, 0xa4, 0x95, 0x96, + 0x59, 0xef, 0xcf, 0x83, 0xb4, 0x06, 0xcc, 0x3b, 0x4b, 0x8f, 0x5f, 0xfb, + 0x52, 0x9c, 0xc2, 0xb4, 0xda, 0x97, 0x4c, 0xb9, 0xe3, 0x14, 0xa4, 0x25, + 0x01, 0x0c, 0x68, 0xe1, 0x92, 0x24, 0x8a, 0x22, 0xb2, 0x99, 0x45, 0xdd, + 0xfa, 0x6a, 0xeb, 0xc2, 0xc0, 0xf0, 0x42, 0x3f, 0x98, 0xfa, 0x6a, 0xeb, + 0xc2, 0xb0, 0xdb, 0x75, 0x57, 0xfd, 0xee, 0xee, 0xac, 0x11, 0x27, 0x49, + 0x0a, 0xc9, 0xb2, 0x2d, 0xab, 0x6f, 0x7b, 0xec, 0x66, 0x1b, 0xa4, 0xc4, + 0xde, 0x6e, 0x13, 0x9e, 0x0b, 0xd3, 0x7d, 0xfc, 0x52, 0x8d, 0xf0, 0x8f, + 0xd5, 0xef, 0xba, 0xdc, 0x75, 0x3f, 0x97, 0x34, 0x4f, 0x2f, 0x03, 0x82, + 0xe6, 0xe9, 0x5c, 0xba, 0x1a, 0xf2, 0x3d, 0xf9, 0xde, 0x71, 0x62, 0xc0, + 0xbd, 0x16, 0xc2, 0x86, 0x02, 0xeb, 0x44, 0x51, 0x82, 0xe3, 0x58, 0x34, + 0x4e, 0x77, 0x03, 0x6f, 0xec, 0xdd, 0x35, 0xe2, 0x33, 0x4d, 0x40, 0x12, + 0x46, 0x11, 0x61, 0x94, 0x10, 0x9e, 0x6a, 0xe0, 0x5e, 0x5f, 0x27, 0x8c, + 0x94, 0xad, 0xe3, 0xc2, 0x9e, 0x5b, 0x74, 0x84, 0x51, 0x95, 0x7e, 0x74, + 0xd2, 0x4f, 0x21, 0xd0, 0xc6, 0x0e, 0x48, 0x81, 0x5a, 0x2a, 0x3c, 0xe9, + 0xda, 0x97, 0xfa, 0xdb, 0xa7, 0xb6, 0xf7, 0x5c, 0x2b, 0x39, 0x66, 0x76, + 0xaf, 0x2a, 0xfb, 0x3b, 0xff, 0x37, 0x15, 0x7f, 0x79, 0xd5, 0x53, 0xc0, + 0x2c, 0xe0, 0x8e, 0x3b, 0x54, 0x9f, 0x4b, 0x78, 0x4a, 0x41, 0xb5, 0x96, + 0x8f, 0x43, 0x6d, 0x42, 0xd5, 0x91, 0x0d, 0x09, 0x9c, 0x57, 0xed, 0x9f, + 0x3b, 0xdf, 0xef, 0xf1, 0xd8, 0x67, 0x7c, 0xc2, 0x33, 0xcb, 0xd4, 0x6f, + 0xa9, 0xe3, 0x96, 0x5c, 0x6c, 0x29, 0xa9, 0xdd, 0xe4, 0xe1, 0x76, 0x7c, + 0xe6, 0x17, 0x7c, 0xd0, 0xf7, 0x77, 0x77, 0x67, 0x8d, 0x30, 0x54, 0xe0, + 0xb3, 0xda, 0xcd, 0x6a, 0xe2, 0xaa, 0xdb, 0x11, 0x30, 0x21, 0xb1, 0x24, + 0x2c, 0xbd, 0xd8, 0x86, 0x8e, 0xc4, 0xda, 0x51, 0xcb, 0xa0, 0xe9, 0x03, + 0xf4, 0xd5, 0xd6, 0x05, 0x86, 0xb0, 0x0b, 0x87, 0xca, 0xff, 0xec, 0xb7, + 0x2e, 0x33, 0x46, 0xbf, 0xae, 0xec, 0x29, 0x77, 0x63, 0xbd, 0x91, 0x79, + 0xdb, 0x4d, 0x06, 0xae, 0xea, 0xd5, 0xff, 0x87, 0x82, 0x6e, 0xbd, 0x0c, + 0xfc, 0x33, 0xe0, 0x5b, 0xc0, 0xdf, 0x03, 0xdf, 0xbc, 0xc2, 0x34, 0xc7, + 0x72, 0xeb, 0xbd, 0xc8, 0xe1, 0x2f, 0x03, 0xff, 0x1a, 0x05, 0xf1, 0xea, + 0xd5, 0xee, 0x9e, 0x78, 0xeb, 0x5d, 0xd7, 0x17, 0x56, 0x5b, 0x1c, 0x7c, + 0x4f, 0x06, 0xbe, 0x0f, 0x51, 0x4d, 0x30, 0xd7, 0x51, 0x4b, 0x80, 0x38, + 0xf6, 0xd9, 0x55, 0xf3, 0x80, 0x03, 0x84, 0xb7, 0xc1, 0x64, 0xe4, 0xa7, + 0x30, 0xaa, 0xfc, 0x34, 0xe5, 0x30, 0xf2, 0xa9, 0x39, 0x5e, 0xdf, 0xb4, + 0x65, 0x13, 0x9e, 0x57, 0xbe, 0x77, 0xa7, 0x69, 0xd2, 0xd3, 0xdb, 0xfe, + 0x89, 0x39, 0xa6, 0xf6, 0x4f, 0xd1, 0x04, 0x5c, 0xb2, 0x70, 0xf7, 0xc4, + 0x1c, 0xd6, 0xfe, 0x29, 0x12, 0xa0, 0xe7, 0x33, 0x08, 0x69, 0x3e, 0x36, + 0x82, 0x5a, 0x85, 0x91, 0x0f, 0x78, 0xdd, 0xf9, 0xd6, 0x1e, 0x2c, 0x0e, + 0xd0, 0x1c, 0xf3, 0x39, 0xe8, 0x78, 0xda, 0x0e, 0xfc, 0x66, 0x93, 0xf1, + 0xfd, 0x53, 0xca, 0x26, 0x82, 0x9a, 0x03, 0xcd, 0xc8, 0xe7, 0xb3, 0x4e, + 0x83, 0xbb, 0x6e, 0xe8, 0x86, 0x64, 0x59, 0xb9, 0xed, 0x41, 0xeb, 0x5d, + 0x61, 0xf9, 0x7c, 0x0e, 0x02, 0x6a, 0x6d, 0x00, 0xda, 0xea, 0x4d, 0xd3, + 0xf8, 0x5d, 0xf7, 0x99, 0x2b, 0x48, 0x08, 0x34, 0xec, 0xc9, 0xa8, 0xc1, + 0x22, 0x00, 0x71, 0x2b, 0xe4, 0xd8, 0x33, 0x19, 0x5c, 0x0b, 0x80, 0x4e, + 0x82, 0xeb, 0xa8, 0xf6, 0xd7, 0xd2, 0xc9, 0xac, 0x4d, 0xfe, 0xf1, 0xdf, + 0x3e, 0x8a, 0xbd, 0x55, 0x9d, 0x4f, 0xaf, 0xaa, 0x96, 0x4b, 0x2f, 0x29, + 0x10, 0x95, 0x01, 0x62, 0x0d, 0xec, 0xd2, 0xcd, 0xf5, 0x15, 0x1a, 0xbb, + 0x41, 0x12, 0xdf, 0x0c, 0x91, 0x6f, 0x76, 0x39, 0xf6, 0x67, 0x0a, 0x9a, + 0x75, 0xe0, 0x17, 0x0e, 0x74, 0xad, 0x03, 0x90, 0x8b, 0x9f, 0xb7, 0x3f, + 0xf0, 0xce, 0xa9, 0x34, 0xdc, 0xcd, 0xfd, 0xe6, 0xfc, 0x40, 0x9d, 0xcf, + 0xc3, 0xbf, 0xf2, 0x71, 0xbc, 0xab, 0xf7, 0xe8, 0xfd, 0xfd, 0x65, 0xcb, + 0xaf, 0xd3, 0x49, 0xfa, 0xd6, 0xa3, 0x10, 0x96, 0x96, 0xe6, 0xa9, 0xef, + 0x1b, 0x4f, 0x81, 0x5a, 0x00, 0x53, 0xb7, 0xde, 0x9e, 0x02, 0xb5, 0x00, + 0xda, 0x12, 0x3e, 0xf7, 0xb4, 0x3a, 0x9e, 0x53, 0xb7, 0x4c, 0x32, 0x77, + 0x3c, 0xb3, 0xb5, 0x2a, 0x59, 0x1b, 0xce, 0xef, 0x84, 0x78, 0x25, 0x9b, + 0xf9, 0x13, 0xf3, 0xc8, 0x4e, 0xcc, 0xe4, 0xfe, 0x77, 0xe9, 0xbc, 0x65, + 0x35, 0xb0, 0xcc, 0xf5, 0xff, 0x3d, 0xf9, 0x4c, 0x03, 0x4b, 0xc4, 0xc8, + 0x16, 0x78, 0xc1, 0xf0, 0x3e, 0xd2, 0xb0, 0x15, 0x21, 0xb0, 0x91, 0x84, + 0xaa, 0x4f, 0x7b, 0x48, 0xbf, 0xb5, 0x28, 0x19, 0x18, 0x6d, 0xb9, 0x0b, + 0x9e, 0x05, 0xf4, 0x6d, 0xf7, 0x86, 0x99, 0xf5, 0xcc, 0x77, 0x39, 0xb7, + 0xad, 0xdb, 0xfb, 0x9d, 0xee, 0x25, 0xa5, 0x98, 0x78, 0x2d, 0xd2, 0x40, + 0x2d, 0x70, 0x2a, 0x35, 0xa2, 0x56, 0x93, 0x5a, 0x55, 0x81, 0xcf, 0xba, + 0x80, 0x5a, 0x98, 0xfe, 0x54, 0x01, 0x02, 0x12, 0xd9, 0x46, 0x88, 0xb2, + 0x5a, 0xa2, 0x96, 0xa0, 0x20, 0x5b, 0xc8, 0xc1, 0xcf, 0xaa, 0xbd, 0xb0, + 0xab, 0x3c, 0xd8, 0xca, 0x00, 0xb5, 0x8c, 0x8d, 0x1a, 0xc3, 0x18, 0xfc, + 0xbb, 0xec, 0x8e, 0x27, 0x2e, 0x3b, 0x5e, 0x92, 0x44, 0x08, 0xcb, 0x41, + 0x1a, 0x90, 0x96, 0x54, 0xf6, 0xa1, 0x5c, 0x1f, 0xa8, 0x65, 0x09, 0x8f, + 0x44, 0xfa, 0x84, 0xad, 0x68, 0xdd, 0x3a, 0x1c, 0x54, 0x2b, 0x3d, 0xd0, + 0x4b, 0xb3, 0xbe, 0x91, 0xaa, 0x13, 0x1a, 0x52, 0x35, 0x0b, 0xd3, 0x33, + 0x01, 0x13, 0x55, 0x58, 0x98, 0x85, 0x89, 0x99, 0xcc, 0xc6, 0xc0, 0xa7, + 0x00, 0x16, 0x66, 0x03, 0x66, 0xa7, 0xab, 0x2c, 0xe8, 0xce, 0xb6, 0x20, + 0x50, 0xa0, 0xaa, 0x05, 0xd4, 0xd2, 0x28, 0xbf, 0x9e, 0xd7, 0x44, 0xb5, + 0xdb, 0x9f, 0x81, 0x70, 0xcd, 0xea, 0xf5, 0x60, 0x01, 0x66, 0xf5, 0xf3, + 0x46, 0xd0, 0x53, 0x02, 0xb3, 0x3f, 0x8d, 0xa3, 0xd7, 0xbb, 0xf2, 0x17, + 0x28, 0x90, 0xd6, 0x9e, 0x5f, 0x53, 0x80, 0xad, 0xb7, 0x1c, 0x3e, 0x04, + 0x77, 0x1d, 0x19, 0x98, 0x76, 0x9a, 0xc7, 0x6a, 0xae, 0x9c, 0x41, 0xf7, + 0x71, 0x9b, 0x9d, 0xcd, 0xd6, 0xa7, 0x67, 0x60, 0x76, 0xa6, 0xbb, 0x3c, + 0xbd, 0xc0, 0x2f, 0xa3, 0x60, 0x46, 0x1d, 0x47, 0x50, 0x60, 0xae, 0x1d, + 0x0f, 0xa9, 0x3c, 0xf0, 0x05, 0xe0, 0x1d, 0x2a, 0x49, 0x03, 0xea, 0x5a, + 0x98, 0x08, 0x54, 0x59, 0x26, 0x54, 0x79, 0x36, 0xec, 0x37, 0xeb, 0xed, + 0x2c, 0xcf, 0xf7, 0xdb, 0x0f, 0x00, 0x6b, 0x41, 0xd6, 0x17, 0x7b, 0x39, + 0x90, 0xa9, 0x5e, 0x90, 0x56, 0x1e, 0x96, 0xd5, 0x0b, 0xdc, 0x1a, 0x04, + 0xd7, 0x4a, 0xf3, 0x93, 0xcf, 0x63, 0x4f, 0xdf, 0x7f, 0xef, 0x47, 0x49, + 0x36, 0xa5, 0x5e, 0x9f, 0xbd, 0x7a, 0x83, 0xca, 0x6f, 0xc6, 0x34, 0xa1, + 0x89, 0x94, 0x12, 0x67, 0xb4, 0x86, 0x2b, 0x5c, 0xca, 0x25, 0x8b, 0x76, + 0x47, 0x72, 0xf0, 0x23, 0x87, 0x01, 0x38, 0xf8, 0x91, 0xc3, 0xec, 0x1a, + 0x75, 0xb8, 0xf7, 0x1e, 0xb5, 0x7d, 0xef, 0x3d, 0x87, 0x39, 0xba, 0x12, + 0x92, 0x3c, 0xfb, 0x04, 0xd6, 0xad, 0x07, 0xb9, 0x7b, 0xa7, 0xcb, 0x03, + 0x0f, 0x2a, 0x20, 0xb9, 0x09, 0x03, 0x78, 0xe2, 0x13, 0x0f, 0xf1, 0xf0, + 0x1f, 0x7f, 0xae, 0x2f, 0x5d, 0x23, 0xb9, 0x22, 0xc1, 0x52, 0x75, 0x5b, + 0x5a, 0x47, 0x48, 0xa9, 0xea, 0xeb, 0x8a, 0xe8, 0x03, 0x6a, 0x81, 0x86, + 0x65, 0xe5, 0xce, 0x87, 0x10, 0x02, 0x89, 0x48, 0x6f, 0xc8, 0x06, 0xb0, + 0x95, 0xaa, 0x04, 0xf5, 0x92, 0xc0, 0xef, 0x48, 0xd0, 0xcf, 0x78, 0x49, + 0xcf, 0xbd, 0xc2, 0x2a, 0x41, 0xb3, 0xd3, 0xa6, 0xd6, 0x51, 0x48, 0xa0, + 0x43, 0x00, 0x1d, 0x78, 0x28, 0xb7, 0x0e, 0xf0, 0x71, 0xe0, 0x63, 0xa8, + 0x76, 0x4d, 0x02, 0x1c, 0xe8, 0xc0, 0x64, 0x49, 0xa5, 0x31, 0x4f, 0xd6, + 0xde, 0x49, 0x74, 0x9c, 0x23, 0x25, 0xc9, 0x21, 0x04, 0x7b, 0x80, 0x65, + 0x29, 0x71, 0x2b, 0x02, 0x57, 0x2a, 0x30, 0xd5, 0x21, 0x09, 0x9f, 0x16, + 0x30, 0x87, 0x64, 0x0e, 0xc1, 0x21, 0xc0, 0xa5, 0xcd, 0x78, 0xa9, 0xcc, + 0x9c, 0x01, 0x7e, 0xf5, 0xe4, 0x31, 0xc9, 0x1d, 0xa7, 0x7a, 0x07, 0xee, + 0x16, 0x82, 0xbb, 0xa4, 0x4c, 0xe1, 0x60, 0x6d, 0xda, 0xdc, 0xa1, 0x01, + 0x5a, 0x06, 0xa8, 0x65, 0xb4, 0xab, 0xa4, 0xda, 0x81, 0xa6, 0x4c, 0x53, + 0xc0, 0x94, 0x01, 0x81, 0x69, 0xbb, 0x23, 0x42, 0xc3, 0xbb, 0x72, 0x2a, + 0x6b, 0xb8, 0xd6, 0x2e, 0x7d, 0x6c, 0x0e, 0xeb, 0x38, 0xf7, 0x77, 0xf4, + 0xb1, 0x21, 0xdb, 0x7e, 0xe7, 0x3a, 0xe3, 0x5c, 0xdf, 0x58, 0xf9, 0x3a, + 0x38, 0x5b, 0xd8, 0xb6, 0x6d, 0x1b, 0x00, 0xdb, 0xb6, 0x6d, 0xe3, 0xe2, + 0xc5, 0x8b, 0x29, 0xf0, 0xe9, 0xaa, 0xb7, 0x6c, 0x49, 0xa1, 0x54, 0x3b, + 0xf7, 0xaa, 0x87, 0xcd, 0x8b, 0x17, 0x2f, 0x02, 0x0a, 0xe6, 0x94, 0x07, + 0x5d, 0xbd, 0x1e, 0xbe, 0x9a, 0xc6, 0xdb, 0xb9, 0x77, 0x1f, 0x17, 0x2f, + 0x5e, 0xe4, 0x9a, 0x6b, 0xae, 0x61, 0xdb, 0xb6, 0x6d, 0xac, 0xbc, 0x74, + 0x52, 0x81, 0xb0, 0xb4, 0x4f, 0xb3, 0x7e, 0xcd, 0x35, 0xd7, 0x30, 0xb9, + 0x77, 0x5b, 0xe6, 0x53, 0x37, 0x3f, 0x5e, 0xd1, 0x60, 0x2a, 0x93, 0xf6, + 0xab, 0xaf, 0xbd, 0x9e, 0xc2, 0xa3, 0xb6, 0xb8, 0x57, 0xa5, 0x71, 0x4c, + 0xfa, 0xbd, 0x80, 0xaa, 0x6d, 0xdb, 0xb6, 0x71, 0x51, 0xaf, 0xbf, 0xd1, + 0x3e, 0xcd, 0xfe, 0x6b, 0xdc, 0xfe, 0x75, 0x53, 0x2e, 0x63, 0xff, 0xdd, + 0x3e, 0xa6, 0xdf, 0x58, 0xd9, 0x32, 0xf4, 0x65, 0xd0, 0xa8, 0x05, 0x63, + 0xfb, 0xc7, 0xd2, 0x3e, 0xb7, 0xc6, 0x49, 0xf5, 0x4b, 0x36, 0xad, 0x42, + 0x4f, 0x83, 0xb4, 0x64, 0xd2, 0xa6, 0x79, 0xba, 0x81, 0x70, 0x6c, 0x04, + 0x6d, 0xec, 0x32, 0x84, 0xe7, 0x7d, 0x1a, 0x27, 0x1b, 0xb8, 0x23, 0x2e, + 0xcd, 0xd5, 0x80, 0xf2, 0xe9, 0x26, 0xf5, 0x1b, 0x15, 0x90, 0x15, 0x24, + 0xcd, 0xe7, 0x9b, 0xc4, 0x6f, 0x96, 0xb8, 0xba, 0x83, 0xd4, 0x1b, 0x71, + 0xd2, 0xf1, 0x5e, 0xff, 0x9c, 0x4f, 0xe4, 0x26, 0xd4, 0x47, 0xc6, 0xa8, + 0xed, 0xf4, 0xf0, 0x46, 0x6a, 0xc4, 0x9d, 0x18, 0xbb, 0x64, 0x43, 0xc5, + 0xc6, 0xa7, 0x49, 0x79, 0x04, 0xfc, 0xf3, 0x09, 0x56, 0x29, 0x6b, 0xeb, + 0x04, 0xe7, 0x02, 0xce, 0xae, 0x2c, 0x53, 0x2e, 0x95, 0xf1, 0x76, 0xd4, + 0x60, 0x87, 0xf2, 0x97, 0xac, 0x46, 0xb4, 0x5b, 0x59, 0x7b, 0xb0, 0xf1, + 0xdc, 0x12, 0x62, 0x8b, 0x60, 0xf2, 0xa6, 0x29, 0xdc, 0x8a, 0x4b, 0xdc, + 0x49, 0xf0, 0x46, 0x6c, 0x64, 0x94, 0x20, 0x50, 0x1f, 0x94, 0xb2, 0x6f, + 0xb0, 0x69, 0xaf, 0x49, 0x6c, 0xcb, 0x42, 0x58, 0xbb, 0xf0, 0xcf, 0x9c, + 0xc5, 0xb5, 0x76, 0x21, 0x46, 0xb2, 0x71, 0x49, 0x7f, 0x25, 0xc1, 0xd6, + 0xf0, 0x42, 0xa3, 0x3d, 0x8e, 0x4d, 0x9c, 0xa8, 0x77, 0x50, 0x62, 0x19, + 0xab, 0x31, 0xe4, 0x92, 0x60, 0xee, 0x94, 0xcf, 0x9e, 0xaa, 0x9d, 0xb6, + 0x71, 0xc7, 0x2c, 0x8b, 0x66, 0x47, 0xe0, 0x27, 0x21, 0x75, 0xd7, 0x62, + 0xee, 0x64, 0x03, 0xaf, 0x04, 0xf1, 0x79, 0x9f, 0x5a, 0x55, 0x10, 0x94, + 0x6c, 0xa2, 0x4b, 0x11, 0x6d, 0x29, 0xa9, 0x5d, 0x5d, 0xd3, 0x00, 0xbf, + 0x5c, 0xdb, 0x57, 0x03, 0xb5, 0x40, 0xd5, 0xa1, 0x49, 0x28, 0xd3, 0x3a, + 0x25, 0xf0, 0x9b, 0xe9, 0xfb, 0x2d, 0x56, 0xc9, 0x22, 0x41, 0x8d, 0x69, + 0x0f, 0x1b, 0xfb, 0x78, 0xe1, 0x4b, 0x5f, 0xe2, 0x4e, 0x32, 0x80, 0xd3, + 0x20, 0x80, 0xd6, 0x30, 0x58, 0x54, 0x1e, 0x4e, 0xd5, 0x0b, 0xd0, 0xba, + 0xea, 0xc7, 0x7f, 0xb2, 0xcb, 0xd6, 0x40, 0xbb, 0x4c, 0xf8, 0xa0, 0x74, + 0x06, 0xf9, 0x01, 0x78, 0xeb, 0xd5, 0xdb, 0x07, 0xfa, 0xcd, 0x83, 0xc0, + 0xbe, 0x7c, 0xee, 0x02, 0xa3, 0xce, 0x8e, 0x3e, 0xa0, 0x16, 0x64, 0x30, + 0xae, 0x57, 0xbf, 0xf6, 0x15, 0xfe, 0xe6, 0xe5, 0xbf, 0xe2, 0xed, 0xd7, + 0xfd, 0x2c, 0xb5, 0x3d, 0x3f, 0xc6, 0xd2, 0x17, 0x33, 0x9f, 0x79, 0x40, + 0xd6, 0x5b, 0xaf, 0xde, 0xce, 0x97, 0xcf, 0x5d, 0x48, 0xe3, 0x3d, 0xfe, + 0xfb, 0xcf, 0x75, 0xa5, 0xb5, 0x5e, 0x7e, 0x7b, 0xcb, 0x35, 0xea, 0xec, + 0xd0, 0x71, 0xaf, 0xeb, 0x8b, 0x3b, 0x08, 0xb6, 0x95, 0x8f, 0xbb, 0x1a, + 0x9d, 0x57, 0xc4, 0xd6, 0x6a, 0xce, 0xc0, 0x0c, 0x20, 0x1b, 0xa0, 0xd6, + 0x0c, 0xca, 0x46, 0x87, 0xbd, 0x70, 0xfb, 0x97, 0xf8, 0x11, 0xba, 0x8f, + 0x7d, 0xa1, 0x42, 0x85, 0x0a, 0x15, 0x2a, 0x54, 0xa8, 0x50, 0xa1, 0x42, + 0x85, 0x0a, 0x15, 0x2a, 0x54, 0xa8, 0x50, 0xa1, 0x42, 0x85, 0x0a, 0x15, + 0x2a, 0x54, 0xa8, 0x50, 0xa1, 0x42, 0x85, 0x0a, 0x15, 0xda, 0xbc, 0x0a, + 0xa8, 0x56, 0xa1, 0x42, 0x85, 0x0a, 0x15, 0x2a, 0xf4, 0x7d, 0x20, 0x7b, + 0xc4, 0xa2, 0xb9, 0xd2, 0xc4, 0xaa, 0x64, 0x93, 0x4f, 0xcc, 0x24, 0x15, + 0xcb, 0x72, 0xa1, 0x24, 0x49, 0x12, 0xb0, 0xac, 0xdc, 0x24, 0xf1, 0x0e, + 0x24, 0xad, 0x38, 0x7d, 0x51, 0x4f, 0xb6, 0xd4, 0x24, 0x63, 0xe1, 0xb8, + 0x94, 0x85, 0xa5, 0x5e, 0x72, 0x2e, 0x69, 0x80, 0x94, 0xb9, 0xe3, 0x57, + 0x2c, 0x92, 0x8a, 0x20, 0x5e, 0x0d, 0x09, 0x57, 0x43, 0xca, 0x96, 0xdd, + 0x07, 0x81, 0x88, 0xd7, 0x42, 0x9d, 0x27, 0xb7, 0x0f, 0x2c, 0x03, 0x60, + 0x39, 0x2e, 0xe1, 0x5a, 0x88, 0x34, 0x2f, 0x99, 0x97, 0x80, 0x55, 0x3d, + 0x51, 0x55, 0x58, 0xea, 0x6b, 0x9d, 0x61, 0x8c, 0xed, 0x9a, 0xd7, 0x2f, + 0x25, 0xc8, 0x36, 0x88, 0x32, 0x71, 0x18, 0x62, 0x09, 0x01, 0xa3, 0x35, + 0x9a, 0xa7, 0x16, 0xa1, 0x04, 0x5e, 0x75, 0x17, 0x96, 0x65, 0x21, 0x5f, + 0x4f, 0x70, 0x3d, 0x3d, 0xc1, 0x48, 0xa7, 0x3b, 0x36, 0xe2, 0xb2, 0x74, + 0x72, 0x09, 0xa4, 0xa4, 0xfd, 0x7a, 0x6e, 0xd2, 0xff, 0x9b, 0xb3, 0x7c, + 0xf9, 0x17, 0xd4, 0xc4, 0x0f, 0xcb, 0x76, 0x52, 0xc0, 0x56, 0xee, 0x20, + 0xe2, 0xb9, 0x1e, 0xf3, 0xcf, 0x1d, 0xc3, 0x72, 0x1c, 0x68, 0xa9, 0xe9, + 0x2f, 0xe6, 0x0b, 0xa5, 0x66, 0xb2, 0x55, 0x78, 0x29, 0xd4, 0x20, 0xb0, + 0xdc, 0x71, 0xb8, 0x14, 0x43, 0x47, 0xbd, 0xf0, 0x9d, 0xac, 0x86, 0xc8, + 0xd6, 0xfa, 0x30, 0xa3, 0xcd, 0x4a, 0xac, 0x49, 0x18, 0x91, 0x78, 0x6b, + 0x6d, 0x70, 0x2c, 0xa4, 0x6c, 0xe3, 0x5d, 0x82, 0x50, 0x82, 0xd5, 0x91, + 0xb4, 0xd1, 0x93, 0xba, 0x9e, 0x8f, 0x88, 0xcd, 0x04, 0x99, 0x46, 0x98, + 0x4e, 0xc6, 0x11, 0x12, 0xdc, 0x51, 0x8b, 0x72, 0x22, 0x89, 0x4b, 0xb9, + 0x97, 0xef, 0xf5, 0xbc, 0x1e, 0x80, 0xb8, 0x25, 0x71, 0x1d, 0x0b, 0x29, + 0xfb, 0xcf, 0x9f, 0x81, 0x5b, 0x75, 0x01, 0xb5, 0xb4, 0x92, 0xb5, 0x04, + 0x6f, 0x87, 0x83, 0x6d, 0x39, 0xe9, 0xc4, 0x5d, 0x5b, 0xc3, 0x2b, 0x6c, + 0x4b, 0x60, 0x8f, 0x08, 0x92, 0xa4, 0xdd, 0x17, 0x07, 0xb2, 0x49, 0x3c, + 0x97, 0x9b, 0xde, 0xb0, 0xb8, 0x06, 0x6e, 0x35, 0x28, 0x9e, 0x89, 0x3b, + 0x28, 0x9e, 0xa7, 0x21, 0x69, 0x76, 0x45, 0x20, 0x7b, 0xe2, 0x9a, 0x38, + 0x57, 0x9a, 0x9e, 0xb7, 0xc3, 0x19, 0x78, 0x4c, 0xd7, 0x93, 0x81, 0x68, + 0x0d, 0x0a, 0xdf, 0x3c, 0x58, 0xcb, 0xc4, 0xb9, 0xcc, 0xdf, 0xa0, 0xfe, + 0x32, 0x76, 0x5e, 0xf9, 0x09, 0x1c, 0xfd, 0xfe, 0xb3, 0x89, 0x0e, 0xe6, + 0x25, 0xe7, 0xf5, 0x94, 0xb7, 0xe9, 0x02, 0x15, 0xe5, 0xe0, 0x54, 0x66, + 0x7b, 0x98, 0x06, 0xd5, 0x31, 0x40, 0x57, 0xda, 0x69, 0x9e, 0xd7, 0x03, + 0x6a, 0x95, 0x18, 0x00, 0xc7, 0xdb, 0x58, 0x65, 0x51, 0x4e, 0x81, 0x60, + 0x7d, 0x20, 0xad, 0xcb, 0x00, 0x78, 0x29, 0x50, 0x87, 0x9a, 0x00, 0x19, + 0x04, 0x01, 0x8e, 0xe3, 0xa4, 0xcb, 0x7c, 0xd8, 0x95, 0xd8, 0x2b, 0x68, + 0xc4, 0x77, 0x36, 0x8d, 0xef, 0x37, 0xfb, 0xcb, 0xf5, 0xdd, 0xbb, 0x0f, + 0xc0, 0x71, 0x9c, 0xf4, 0xd8, 0xad, 0xa7, 0xcb, 0x99, 0xc4, 0x04, 0xf0, + 0x85, 0x0f, 0x7f, 0x98, 0x1d, 0x1f, 0xfa, 0xd0, 0x86, 0x76, 0xcd, 0x85, + 0x67, 0x99, 0x98, 0x98, 0x00, 0xaa, 0x2c, 0x2c, 0x2c, 0x50, 0xad, 0x4e, + 0xb3, 0xb0, 0xb0, 0x90, 0x0b, 0x9b, 0x25, 0x08, 0x54, 0x18, 0x40, 0xb5, + 0x3a, 0x9d, 0xe6, 0x1d, 0x60, 0x61, 0x61, 0xb6, 0x2f, 0xfe, 0x23, 0x9f, + 0xfb, 0x24, 0x00, 0xc7, 0x1f, 0x79, 0x84, 0xcd, 0x60, 0xb2, 0xde, 0x74, + 0xfc, 0x38, 0xe7, 0x80, 0x47, 0x8e, 0x1f, 0x67, 0xc7, 0x2d, 0xb7, 0x70, + 0xf5, 0x8e, 0x37, 0x0e, 0x85, 0xf5, 0x46, 0x83, 0xba, 0xbe, 0x9f, 0x25, + 0x7f, 0xff, 0x7d, 0x5d, 0x13, 0x90, 0x86, 0xda, 0x75, 0xd6, 0x07, 0x6b, + 0x0d, 0xd7, 0x77, 0x0a, 0xd7, 0xf0, 0x8f, 0x53, 0xa6, 0xb9, 0xf3, 0x46, + 0x23, 0x16, 0x8f, 0x9d, 0x5a, 0x52, 0x2b, 0x22, 0xfd, 0xa7, 0x13, 0xd4, + 0x29, 0xc5, 0x09, 0x9c, 0x79, 0x63, 0x80, 0x5a, 0x00, 0x9f, 0xbe, 0x2f, + 0xc0, 0xdb, 0x9f, 0xb5, 0x03, 0x2c, 0xeb, 0x6f, 0xfb, 0x8d, 0x7e, 0xf5, + 0x5d, 0x9b, 0xf6, 0x67, 0x60, 0x5a, 0xf7, 0x9c, 0x38, 0xb1, 0xa1, 0x2d, + 0xf0, 0x7d, 0x0d, 0xd4, 0x32, 0x30, 0xad, 0x43, 0xeb, 0xc1, 0xb4, 0x8c, + 0x2e, 0xb3, 0x1c, 0xe9, 0x79, 0x1e, 0xa0, 0xc7, 0x5e, 0x1a, 0x7c, 0xec, + 0x9a, 0x0b, 0x4f, 0xf6, 0x85, 0x1d, 0x7d, 0x71, 0x0e, 0x5e, 0xec, 0x0e, + 0x5b, 0xfe, 0xfc, 0xd1, 0x81, 0xf1, 0x1f, 0x7e, 0xe1, 0xd8, 0xc0, 0xf0, + 0xe1, 0xf6, 0xfd, 0xe9, 0x2d, 0x3e, 0xfd, 0xc0, 0xa6, 0x6d, 0x01, 0x96, + 0x9f, 0xea, 0xaf, 0xb5, 0x86, 0xd9, 0x0e, 0xf2, 0x3d, 0xd4, 0xef, 0x65, + 0xe4, 0x79, 0x5d, 0xfb, 0xa7, 0x1f, 0xef, 0x0b, 0x1b, 0x74, 0x9c, 0x87, + 0x9f, 0x93, 0xb9, 0x3e, 0x78, 0x49, 0xa1, 0x7f, 0xba, 0xf2, 0xc6, 0x3c, + 0xc2, 0x95, 0x26, 0xd6, 0x88, 0x8b, 0x68, 0xf9, 0xc4, 0x2d, 0x48, 0xce, + 0xfb, 0xb0, 0x43, 0x3d, 0xeb, 0x27, 0xe7, 0x15, 0xb8, 0x84, 0x1d, 0x1e, + 0x4b, 0xcf, 0x41, 0x9c, 0x24, 0x78, 0xfb, 0x3c, 0xdc, 0xab, 0x6d, 0xfc, + 0xa7, 0x1a, 0x58, 0x0f, 0x4c, 0x91, 0xdc, 0xab, 0xea, 0x1b, 0x6b, 0x47, + 0x0d, 0xcb, 0xb2, 0xb1, 0x6b, 0x96, 0x82, 0x40, 0xdd, 0x58, 0x23, 0x6c, + 0x26, 0x24, 0x6b, 0x0a, 0x0a, 0xe5, 0xee, 0x54, 0x20, 0xaa, 0x70, 0x45, + 0xf5, 0x41, 0xcc, 0x3f, 0xb5, 0x48, 0xb4, 0x1a, 0xf2, 0xd1, 0x7f, 0xbb, + 0x87, 0xf9, 0x8e, 0x4b, 0xe3, 0xb9, 0x65, 0x9a, 0x2b, 0x36, 0x90, 0x10, + 0x9e, 0x59, 0xc6, 0xdd, 0xad, 0x40, 0x29, 0x8e, 0x7e, 0xd6, 0x0c, 0xcf, + 0xb4, 0xa9, 0xdd, 0x5c, 0xa7, 0x71, 0xbc, 0x41, 0x78, 0x66, 0x91, 0xfa, + 0x4d, 0x93, 0x29, 0x84, 0x2b, 0x59, 0x4b, 0x68, 0x34, 0x1a, 0x44, 0xa1, + 0x45, 0x18, 0x25, 0xd4, 0x6f, 0xad, 0xa7, 0x00, 0xac, 0xc6, 0x29, 0x97, + 0xfa, 0xf5, 0x1a, 0x54, 0x7b, 0xaa, 0xc1, 0x9e, 0x77, 0xa8, 0x89, 0x84, + 0x61, 0x94, 0x50, 0xaf, 0xd7, 0x69, 0x34, 0x1a, 0x19, 0xa0, 0x4b, 0xef, + 0x0f, 0xa3, 0x84, 0xe8, 0xa4, 0x2a, 0xfb, 0xdc, 0x49, 0x98, 0xba, 0xc3, + 0x63, 0xf9, 0x34, 0x44, 0xa1, 0xaf, 0x80, 0x59, 0x06, 0x12, 0x36, 0x0a, + 0x8d, 0x67, 0xd5, 0x04, 0xda, 0xc7, 0x1f, 0xf7, 0x69, 0x77, 0x24, 0xf6, + 0xee, 0x1a, 0xfe, 0x52, 0x13, 0xb7, 0xee, 0xd1, 0xd0, 0xb4, 0xa6, 0xa9, + 0xdd, 0xf0, 0xc0, 0x71, 0x65, 0xf7, 0xd8, 0x67, 0x94, 0x5f, 0x77, 0xf7, + 0x1e, 0xc2, 0x86, 0x8f, 0x5b, 0xeb, 0xc6, 0x5d, 0x35, 0x4e, 0x76, 0xdf, + 0x2f, 0xa5, 0x94, 0x0a, 0xae, 0xd5, 0x08, 0x99, 0x7c, 0xaf, 0x4b, 0x5b, + 0xc6, 0xe9, 0xb3, 0xdb, 0xfc, 0xd3, 0xc7, 0xb0, 0x76, 0xd4, 0xae, 0xec, + 0xe4, 0x17, 0x4a, 0xb5, 0x7b, 0x63, 0x93, 0xcd, 0xab, 0xf5, 0xad, 0x75, + 0xa7, 0x69, 0xfe, 0xd7, 0x9e, 0x65, 0xef, 0xbe, 0x5b, 0xdf, 0xfd, 0xa6, + 0x81, 0xd0, 0xb0, 0xf5, 0xe2, 0xf5, 0xea, 0x6c, 0x13, 0x76, 0xe9, 0x9f, + 0x85, 0x82, 0x58, 0xf9, 0x1a, 0xac, 0xa5, 0xe0, 0x53, 0x4d, 0x14, 0x8c, + 0xca, 0x75, 0xc0, 0xc5, 0x63, 0xb1, 0xd9, 0xa4, 0xe6, 0x78, 0x34, 0x23, + 0x3f, 0x03, 0x5e, 0x01, 0x7e, 0x9c, 0x10, 0x3b, 0x6a, 0x72, 0xb8, 0x4b, + 0x06, 0xb0, 0xf2, 0xe3, 0x84, 0x9a, 0xd3, 0x0d, 0xdf, 0x02, 0x40, 0xc3, + 0xab, 0xe2, 0x38, 0x83, 0x03, 0xb9, 0x8e, 0x47, 0xec, 0xb8, 0x24, 0x80, + 0x1b, 0xa1, 0x40, 0xf9, 0x11, 0xd4, 0x1c, 0x9f, 0x45, 0xc7, 0x65, 0x3c, + 0x17, 0xdf, 0x40, 0x93, 0x16, 0x4f, 0xcc, 0x61, 0xd5, 0x6a, 0xec, 0xd2, + 0x79, 0x32, 0xfb, 0x0c, 0xb8, 0x2a, 0x4d, 0x0f, 0x88, 0xe3, 0x04, 0xd7, + 0xd1, 0x08, 0x9c, 0x9c, 0xad, 0x1f, 0x35, 0x69, 0xda, 0x6a, 0x3d, 0xef, + 0xdf, 0x6f, 0x36, 0x01, 0x1f, 0x17, 0x8f, 0x10, 0x5f, 0x03, 0xc0, 0x3c, + 0xde, 0xfd, 0x54, 0x63, 0x5d, 0x78, 0x57, 0x17, 0x50, 0x6b, 0xd0, 0x7e, + 0xba, 0x21, 0x5b, 0xf4, 0x6e, 0x0f, 0x00, 0x6a, 0x25, 0x2f, 0x0c, 0xd8, + 0xbe, 0xa1, 0xdf, 0xcf, 0x46, 0x0a, 0xa3, 0x80, 0xc6, 0xc9, 0xc5, 0x74, + 0xdb, 0x5f, 0x4b, 0xf0, 0x46, 0x5c, 0xea, 0xfb, 0xd4, 0xdd, 0xfe, 0x89, + 0xa7, 0x54, 0xbb, 0xa1, 0x2c, 0x04, 0x61, 0x14, 0xb1, 0xb4, 0x34, 0x4f, + 0x8e, 0xb3, 0xcb, 0xe4, 0xfe, 0x0c, 0x5c, 0xf5, 0xd8, 0x1f, 0x1f, 0xa5, + 0x5c, 0x51, 0x7d, 0x03, 0x8d, 0x33, 0xaa, 0xae, 0x8e, 0x2f, 0xf9, 0x80, + 0xfa, 0x41, 0xe5, 0xe1, 0x59, 0xc7, 0x3e, 0xdf, 0xdf, 0xd6, 0xac, 0xef, + 0xd6, 0x76, 0x4b, 0xf3, 0x88, 0x2d, 0xae, 0xb2, 0x7f, 0x73, 0x77, 0x1d, + 0x67, 0x80, 0x5a, 0xf5, 0xdd, 0xb5, 0x74, 0x3d, 0x4b, 0x87, 0x14, 0xf0, + 0x65, 0xf2, 0x63, 0xc2, 0xfc, 0xc0, 0x4f, 0xf3, 0x64, 0xd2, 0x39, 0x70, + 0xdb, 0xc1, 0xd4, 0xf6, 0xe1, 0x3f, 0x7a, 0x14, 0x00, 0xcf, 0xa9, 0x66, + 0x30, 0xad, 0x4e, 0x42, 0xdc, 0x0a, 0x01, 0x75, 0x3f, 0xa9, 0xd7, 0x1d, + 0x1e, 0x7d, 0x54, 0xb5, 0x99, 0x1c, 0x17, 0x02, 0xcd, 0x11, 0x6d, 0x9c, + 0x5c, 0xa4, 0xbe, 0x6f, 0x1c, 0xd7, 0xa9, 0xf2, 0xc4, 0xc2, 0xe3, 0xcc, + 0x3d, 0xfb, 0x24, 0xed, 0x21, 0x0f, 0x4c, 0x06, 0xa8, 0xb5, 0xa7, 0x5e, + 0xa3, 0xdd, 0x81, 0xf9, 0x13, 0xf3, 0x80, 0xc4, 0xef, 0xc4, 0x78, 0x25, + 0x1b, 0xd9, 0xc9, 0xda, 0xd6, 0x73, 0xcf, 0x2d, 0xa6, 0xcf, 0xb8, 0xf3, + 0x27, 0xfa, 0x81, 0x2b, 0xf5, 0x9a, 0x83, 0xf9, 0x7a, 0x84, 0x3c, 0xb5, + 0xfe, 0x73, 0x88, 0x10, 0x80, 0x74, 0x91, 0x9d, 0xc1, 0x00, 0xc5, 0x20, + 0x9a, 0xc7, 0xb2, 0x3c, 0x64, 0x92, 0x20, 0x3b, 0xeb, 0xfd, 0x9a, 0x37, + 0xab, 0x0d, 0x7c, 0xf4, 0x02, 0x75, 0x44, 0xd6, 0xc7, 0xd4, 0x0c, 0x1e, + 0x5d, 0x27, 0xa2, 0x06, 0xc9, 0x50, 0x46, 0x6a, 0xa0, 0x96, 0x44, 0x2d, + 0x81, 0x14, 0xae, 0x35, 0x48, 0x79, 0xa0, 0x16, 0x0c, 0xee, 0x0f, 0x37, + 0x36, 0x06, 0x98, 0x30, 0x48, 0x57, 0x12, 0x4f, 0x02, 0x54, 0xf4, 0x67, + 0x4e, 0x2c, 0xcb, 0x84, 0xa4, 0x40, 0xad, 0xcd, 0x28, 0x91, 0xfe, 0xc6, + 0x46, 0x5a, 0x41, 0x6e, 0x7d, 0x61, 0x88, 0xcd, 0xcc, 0x34, 0xcc, 0xce, + 0x56, 0x95, 0x8d, 0xee, 0x0f, 0x9b, 0x99, 0x55, 0xfb, 0xa6, 0x67, 0x80, + 0x19, 0x65, 0x93, 0x8f, 0x3f, 0x31, 0x53, 0xa5, 0x9a, 0xf3, 0xbe, 0x40, + 0xc0, 0x04, 0x55, 0x66, 0x75, 0xfc, 0x6a, 0x15, 0x26, 0xcc, 0xce, 0xaa, + 0xca, 0xc8, 0x6c, 0xb5, 0x9a, 0xf2, 0x08, 0x00, 0xaa, 0x13, 0x55, 0x02, + 0x4d, 0xb4, 0x9a, 0x98, 0x50, 0x00, 0xab, 0x89, 0xaa, 0x02, 0x5f, 0x05, + 0x81, 0x62, 0x17, 0x2c, 0xe8, 0xbc, 0x18, 0x98, 0x56, 0x40, 0x96, 0xae, + 0x01, 0x69, 0x51, 0x85, 0xe9, 0x1c, 0xb1, 0x6b, 0x7a, 0x42, 0xc1, 0xb5, + 0x7a, 0x35, 0xad, 0x33, 0x74, 0xd3, 0x8e, 0x23, 0xcc, 0x4e, 0x67, 0x79, + 0x35, 0xbe, 0x54, 0xf9, 0x75, 0xf9, 0xaa, 0xf4, 0x51, 0xc8, 0x0c, 0xc0, + 0x2b, 0xaf, 0x41, 0xe9, 0xa4, 0xf6, 0x3a, 0xba, 0xc9, 0x4f, 0x1e, 0xbe, + 0x35, 0x93, 0x8b, 0xb7, 0xfc, 0x3b, 0xc0, 0x4d, 0x6f, 0x65, 0xe2, 0x0b, + 0x5f, 0x4e, 0xfd, 0x19, 0x38, 0x98, 0xc9, 0xcb, 0xcb, 0xab, 0xc3, 0xd3, + 0x01, 0x32, 0x38, 0x61, 0xfa, 0xf1, 0x9f, 0x1c, 0x48, 0x6b, 0x40, 0xbf, + 0xba, 0xec, 0x81, 0x2c, 0x99, 0xb0, 0xbc, 0xf2, 0x1f, 0x57, 0x58, 0x2f, + 0x7e, 0x2f, 0xb4, 0x6b, 0x90, 0xa4, 0x94, 0x88, 0x8a, 0xa5, 0xec, 0x3a, + 0x06, 0xcc, 0xa5, 0x3f, 0x64, 0xd4, 0x91, 0xb9, 0xb1, 0x58, 0x0d, 0xdc, + 0x6b, 0x25, 0xca, 0x7e, 0x23, 0x6d, 0x04, 0xd3, 0x5a, 0x2f, 0x3f, 0x97, + 0x5b, 0xfe, 0xf4, 0x03, 0x20, 0xe6, 0x03, 0x41, 0x35, 0x9d, 0xff, 0x36, + 0xfe, 0xaa, 0x8f, 0x37, 0xea, 0x31, 0xfe, 0x81, 0x8f, 0xb2, 0xf8, 0xa9, + 0x87, 0x19, 0xff, 0xc0, 0x47, 0x01, 0x38, 0xba, 0x12, 0x72, 0xf7, 0x4e, + 0x97, 0xa3, 0x2b, 0x1a, 0xd3, 0xa9, 0xe1, 0x59, 0x47, 0x57, 0x42, 0xee, + 0xbd, 0xe7, 0x30, 0x0f, 0x3c, 0xf8, 0x50, 0x0a, 0xde, 0x32, 0xe1, 0x9b, + 0x2e, 0x43, 0x4b, 0xa6, 0xf9, 0x31, 0xdb, 0xa2, 0x22, 0xd2, 0x70, 0x00, + 0xa7, 0x42, 0x37, 0x30, 0xab, 0x25, 0xb1, 0x05, 0x84, 0x1d, 0x10, 0xfa, + 0x19, 0x20, 0xc9, 0x7f, 0xc8, 0xa9, 0x83, 0xba, 0x49, 0x74, 0xc0, 0xef, + 0x48, 0x7a, 0x7b, 0xf3, 0x1b, 0x26, 0x8e, 0x5e, 0xfa, 0xc0, 0x11, 0x14, + 0x2c, 0xea, 0x08, 0x70, 0x0f, 0x60, 0x97, 0xd4, 0xdd, 0xa8, 0xa1, 0x21, + 0x52, 0x75, 0x6d, 0x07, 0x70, 0xac, 0x04, 0xe6, 0x6e, 0x5d, 0x47, 0xa5, + 0x31, 0x5e, 0x12, 0x98, 0x56, 0xc0, 0x5d, 0xa8, 0x5e, 0x40, 0x5f, 0x8f, + 0x2f, 0x2d, 0xeb, 0xb2, 0x2c, 0x77, 0x54, 0xb6, 0x0e, 0xf5, 0x20, 0xa8, + 0x42, 0x60, 0xae, 0xa3, 0x00, 0x5a, 0x3e, 0x70, 0xa4, 0x94, 0x41, 0xae, + 0x3c, 0x14, 0x64, 0x4b, 0x74, 0x24, 0x0f, 0x09, 0x8b, 0xc3, 0x24, 0x1c, + 0xee, 0x48, 0x6a, 0x3a, 0x6f, 0x56, 0x09, 0x1e, 0xcc, 0x81, 0xae, 0x96, + 0x3b, 0x2a, 0xef, 0xb1, 0x8e, 0x7f, 0x56, 0x2f, 0xcd, 0xd9, 0x99, 0xeb, + 0x90, 0xe6, 0xd3, 0x94, 0xf9, 0xae, 0x4e, 0xf6, 0xb9, 0x2a, 0x63, 0xdf, + 0xd6, 0x1f, 0xb7, 0xf2, 0x4b, 0xb2, 0x6b, 0x8c, 0xec, 0xbe, 0x92, 0x6a, + 0x07, 0x1b, 0xb8, 0xd6, 0x66, 0xfa, 0xb7, 0x5f, 0x0f, 0x5f, 0x65, 0x45, + 0x83, 0x9c, 0x0c, 0xa8, 0xc9, 0xc0, 0xa7, 0x20, 0x03, 0x36, 0x6d, 0xd1, + 0xe0, 0x27, 0x03, 0x8f, 0x9a, 0x9c, 0x9c, 0x04, 0x0d, 0x77, 0x32, 0xda, + 0xb9, 0x77, 0x1f, 0x3b, 0xa1, 0x0b, 0x4e, 0x65, 0xf6, 0xf7, 0xfa, 0x34, + 0xbe, 0x2e, 0xe6, 0xf2, 0xb1, 0xc5, 0xbd, 0x8a, 0x6d, 0xdb, 0xb6, 0xa5, + 0xd0, 0x28, 0x03, 0xbd, 0x9a, 0xdc, 0xab, 0x00, 0x55, 0xc6, 0xd7, 0x8a, + 0x06, 0x4d, 0x19, 0xf8, 0x55, 0x1e, 0x66, 0xd5, 0x9b, 0xd7, 0x37, 0xda, + 0xe7, 0x16, 0xf7, 0x2a, 0x5e, 0x79, 0xe5, 0x95, 0xae, 0xf2, 0x1b, 0x08, + 0xd6, 0xe4, 0xe4, 0x64, 0x5a, 0xf6, 0xef, 0xd5, 0x31, 0x5d, 0x4f, 0x8d, + 0xa6, 0x8f, 0xd0, 0xa0, 0x7b, 0x1b, 0x05, 0x64, 0x73, 0x5a, 0x02, 0xfb, + 0x66, 0x8f, 0x78, 0x0d, 0xec, 0x11, 0x68, 0xae, 0x06, 0x4c, 0xde, 0x36, + 0x4e, 0xf3, 0x54, 0x93, 0xf2, 0x88, 0xcb, 0xfe, 0xea, 0x2e, 0x96, 0x4e, + 0xcc, 0x53, 0xdf, 0x57, 0x07, 0x61, 0x13, 0x9f, 0x6f, 0xe0, 0x5c, 0xed, + 0xd1, 0x3c, 0xdf, 0xc0, 0x5d, 0xb5, 0x08, 0x65, 0x82, 0xbb, 0xc5, 0x02, + 0x29, 0xb1, 0x62, 0xb0, 0xf7, 0x2b, 0x5f, 0x62, 0x04, 0xe4, 0xaa, 0x64, + 0xfc, 0x96, 0x29, 0xd5, 0xb7, 0x52, 0xb1, 0xf1, 0x65, 0xc4, 0xdc, 0xb3, + 0xc7, 0xa8, 0xef, 0xab, 0x13, 0x8f, 0x40, 0x12, 0x44, 0xb4, 0x07, 0x40, + 0x54, 0xcb, 0xa5, 0x32, 0xf5, 0x7d, 0x75, 0xc4, 0x88, 0x1e, 0xc3, 0xef, + 0xc4, 0x90, 0x40, 0xf3, 0x8c, 0x8f, 0x0c, 0x23, 0x6a, 0xd7, 0xd6, 0x52, + 0x60, 0xed, 0xd8, 0xad, 0x93, 0x24, 0x41, 0x88, 0x7f, 0x5e, 0x03, 0x43, + 0x5b, 0x12, 0xb9, 0x16, 0x22, 0x46, 0x5c, 0x5c, 0xc7, 0x25, 0x8e, 0xb2, + 0x3a, 0x2c, 0x5c, 0x4b, 0xb0, 0x1d, 0xc1, 0x9e, 0xeb, 0xc7, 0x89, 0x3b, + 0x09, 0xd1, 0x8a, 0x8f, 0xeb, 0xb8, 0x94, 0x2b, 0x2e, 0xc3, 0x00, 0xa5, + 0xa2, 0x04, 0x71, 0x2b, 0xce, 0xc6, 0x92, 0x7b, 0xc7, 0xdf, 0x73, 0x75, + 0xdb, 0xae, 0x11, 0x0d, 0x7d, 0xee, 0x08, 0x05, 0xc5, 0xd2, 0xd5, 0x64, + 0x95, 0x98, 0xa5, 0x28, 0x41, 0x94, 0x04, 0xcd, 0xd3, 0xcb, 0x44, 0x6b, + 0x11, 0x9e, 0x6e, 0x87, 0xfa, 0x32, 0xc2, 0xb2, 0x2c, 0x3c, 0xfd, 0xb0, + 0x23, 0x2c, 0x1b, 0x19, 0x49, 0x10, 0x8b, 0xb0, 0x55, 0x3d, 0x1b, 0x25, + 0x2d, 0x75, 0xef, 0x4d, 0xcc, 0x87, 0xed, 0x2e, 0x63, 0x3c, 0x2a, 0x0f, + 0x75, 0xea, 0x05, 0x44, 0xad, 0x46, 0xe7, 0x53, 0xa8, 0xd5, 0x57, 0x56, + 0x12, 0x7e, 0x72, 0xa7, 0x95, 0xee, 0x7f, 0xfb, 0x75, 0x3f, 0xdb, 0x05, + 0xa6, 0xea, 0xd5, 0xdb, 0xaf, 0xfb, 0x59, 0xfe, 0xe6, 0xe5, 0xbf, 0xea, + 0x4b, 0x67, 0x10, 0x84, 0x2a, 0xaf, 0xab, 0x7e, 0xfc, 0x27, 0x53, 0x7f, + 0x4b, 0x5f, 0x7c, 0x39, 0x0d, 0xff, 0xeb, 0xe7, 0x4f, 0x74, 0x01, 0xb4, + 0xf2, 0xe0, 0xad, 0x61, 0x79, 0x00, 0x05, 0xdf, 0x7a, 0xfb, 0x75, 0x0a, + 0xb4, 0x95, 0x07, 0x74, 0xe5, 0x61, 0x5f, 0x7f, 0xf3, 0xf2, 0x5f, 0xf5, + 0xf9, 0xfb, 0xf2, 0xb9, 0x0b, 0x5d, 0xe5, 0x1e, 0x94, 0xdf, 0x41, 0x69, + 0x0e, 0xcb, 0xc7, 0x30, 0xa8, 0x58, 0x9f, 0xa6, 0xab, 0x30, 0x1b, 0xc0, + 0x42, 0x55, 0x6d, 0x57, 0x03, 0xd5, 0x10, 0x9d, 0x08, 0xba, 0x60, 0x5a, + 0x54, 0x03, 0xf5, 0x77, 0xd5, 0x55, 0x1b, 0xfb, 0x2c, 0x54, 0xa8, 0x50, + 0xa1, 0x42, 0x85, 0x0a, 0x15, 0x2a, 0x54, 0xa8, 0x50, 0xa1, 0x42, 0x85, + 0x0a, 0x15, 0x2a, 0x54, 0xa8, 0x50, 0xa1, 0x42, 0x85, 0x0a, 0x15, 0x2a, + 0x54, 0xa8, 0x50, 0xa1, 0x42, 0x43, 0x55, 0x40, 0xb5, 0x0a, 0x15, 0x2a, + 0x54, 0xa8, 0x50, 0xa1, 0xef, 0x95, 0x6e, 0xd1, 0x10, 0xac, 0x9d, 0x82, + 0x38, 0x48, 0x70, 0x46, 0x5c, 0xa2, 0xb5, 0xb0, 0xef, 0xab, 0xc8, 0x42, + 0x94, 0x51, 0x93, 0xb9, 0x24, 0xe4, 0x5e, 0x4e, 0x6e, 0x9b, 0x17, 0x66, + 0xc9, 0x5e, 0x66, 0xb6, 0x1c, 0x57, 0x81, 0xad, 0x2a, 0x6a, 0x22, 0x47, + 0x3a, 0x91, 0xc2, 0xbc, 0x48, 0x5b, 0x92, 0x58, 0x15, 0x01, 0xa3, 0x2e, + 0xe1, 0xf9, 0x26, 0x24, 0x43, 0x50, 0x0e, 0x42, 0xe3, 0x04, 0xcc, 0x8b, + 0xf1, 0x39, 0x19, 0xd0, 0x4c, 0xa2, 0xa1, 0x37, 0x96, 0x65, 0xa7, 0xeb, + 0x58, 0x20, 0x34, 0x44, 0x28, 0xf1, 0x13, 0x05, 0xd0, 0x42, 0x20, 0x3b, + 0x12, 0xd9, 0x51, 0x2f, 0x67, 0xc6, 0x49, 0x06, 0xe4, 0xf2, 0x1c, 0x0f, + 0x61, 0x59, 0xfd, 0x2f, 0xc9, 0x9b, 0x2f, 0xc7, 0x97, 0x04, 0xf5, 0x7d, + 0x63, 0x2c, 0x3e, 0x37, 0x87, 0x9f, 0xc4, 0x94, 0x2d, 0xdb, 0x1c, 0x94, + 0x2c, 0xab, 0x25, 0x05, 0xd4, 0x2a, 0x57, 0xca, 0x90, 0x87, 0x4c, 0x75, + 0x04, 0xb1, 0x8c, 0x49, 0x2e, 0x45, 0x78, 0x3b, 0x6b, 0xf8, 0x2b, 0x4d, + 0xfd, 0x35, 0xf6, 0x38, 0x3d, 0x26, 0x89, 0x10, 0x88, 0x11, 0x57, 0x1d, + 0xdb, 0x2e, 0x20, 0x8f, 0x24, 0xd1, 0x2f, 0xb4, 0xcb, 0xb5, 0xcb, 0x03, + 0x0e, 0x88, 0x9d, 0x3a, 0x6f, 0xb7, 0xc4, 0xf0, 0x8c, 0x3e, 0x2c, 0xd7, + 0xaa, 0x30, 0x67, 0xd4, 0x22, 0x04, 0x9a, 0x2b, 0xa1, 0xfe, 0xba, 0x7d, + 0x26, 0xcb, 0xd2, 0x20, 0xb4, 0x8e, 0x4c, 0x01, 0x4e, 0x40, 0x0a, 0xb7, + 0xca, 0x2b, 0x49, 0x24, 0xed, 0xde, 0x56, 0x9c, 0x30, 0xfb, 0x12, 0x84, + 0x10, 0x03, 0xe3, 0xc1, 0xc6, 0xd0, 0xa8, 0x7c, 0xbc, 0xe6, 0x4a, 0x48, + 0x6d, 0xa7, 0x4b, 0x63, 0x45, 0xbf, 0x82, 0xde, 0x51, 0x89, 0x58, 0x66, + 0xf2, 0x8e, 0x99, 0x8c, 0x30, 0x04, 0xa8, 0x65, 0x64, 0x5b, 0xa2, 0x3f, + 0xdd, 0x8e, 0x5c, 0xb7, 0x8c, 0x1b, 0xe5, 0xb5, 0x37, 0xcd, 0x6f, 0xf7, + 0x98, 0x6e, 0x26, 0xbd, 0xde, 0x78, 0xce, 0xa8, 0xfe, 0x22, 0xec, 0xb5, + 0x02, 0xcc, 0xdc, 0xb1, 0xdc, 0x75, 0xdd, 0x37, 0x03, 0xa0, 0x47, 0xc3, + 0x80, 0x5b, 0x97, 0x6b, 0x53, 0xbb, 0x7e, 0xf0, 0x24, 0x64, 0xf3, 0x22, + 0x71, 0xaf, 0x44, 0xa9, 0x07, 0x2c, 0x56, 0x81, 0xf1, 0x1b, 0xfb, 0xd1, + 0x04, 0x1e, 0x9e, 0x9e, 0x5c, 0xd7, 0x2f, 0x63, 0xef, 0xe1, 0x75, 0x85, + 0x3f, 0xf9, 0xd4, 0x60, 0xa8, 0x42, 0x1e, 0x80, 0x64, 0x74, 0x62, 0x61, + 0xf0, 0x84, 0xbb, 0xfd, 0x13, 0xfb, 0xfb, 0x20, 0x77, 0x00, 0xc7, 0x9e, + 0x1e, 0x0c, 0xa5, 0x18, 0xe4, 0x7b, 0x98, 0xfd, 0xd4, 0x3b, 0xa7, 0x06, + 0x58, 0x42, 0xf0, 0xf9, 0x80, 0x68, 0x1d, 0x70, 0x9e, 0xd8, 0xad, 0xeb, + 0xd2, 0x5b, 0x62, 0x78, 0x56, 0xad, 0xe6, 0xaf, 0x6b, 0x27, 0x07, 0x5b, + 0x1b, 0x94, 0x9f, 0x7c, 0x58, 0xef, 0xfe, 0xcb, 0xb5, 0xff, 0x6e, 0xa4, + 0xf1, 0xbd, 0xb4, 0x7f, 0xa3, 0x7c, 0x1b, 0x30, 0x57, 0x1e, 0xd0, 0x05, + 0xdd, 0xb0, 0x34, 0x51, 0x11, 0x24, 0x6b, 0x09, 0xd6, 0x48, 0xf6, 0xa2, + 0xb4, 0xa3, 0xbf, 0xfa, 0x9c, 0xbf, 0xae, 0xb7, 0x5e, 0xab, 0x02, 0xb7, + 0x8f, 0x56, 0x38, 0xe6, 0x27, 0xbc, 0xe9, 0x4d, 0x8f, 0x74, 0xa5, 0xf9, + 0x2d, 0x3d, 0x67, 0xfc, 0x4d, 0x6f, 0xca, 0xc2, 0xe6, 0xce, 0x9d, 0x03, + 0xe0, 0xeb, 0x7c, 0x93, 0x5f, 0xbc, 0xf7, 0x60, 0xba, 0x34, 0x61, 0x8f, + 0x3e, 0xf7, 0x5c, 0x5f, 0xd8, 0x8f, 0xe9, 0x2f, 0x96, 0x03, 0x3c, 0xfa, + 0xdc, 0x73, 0x7d, 0xf1, 0x3f, 0xf4, 0xe1, 0x0f, 0x73, 0xfc, 0xf8, 0x71, + 0x3e, 0xf4, 0xc9, 0x4f, 0xf6, 0x1d, 0x93, 0x61, 0x7a, 0xc7, 0x06, 0xfb, + 0xcf, 0xeb, 0x7c, 0x5e, 0x8e, 0xce, 0x6d, 0xc2, 0xef, 0xf7, 0x9b, 0xce, + 0x9f, 0x3b, 0xd7, 0x07, 0x02, 0xdb, 0x3e, 0xaa, 0xce, 0xeb, 0xd6, 0x6b, + 0x2b, 0x30, 0xaf, 0x4e, 0xa2, 0x55, 0x51, 0x75, 0xb8, 0x53, 0x81, 0x3b, + 0xab, 0x0e, 0x8f, 0x9d, 0x8a, 0xb8, 0xf3, 0x7a, 0x87, 0x27, 0xf6, 0x3f, + 0xc4, 0xd4, 0xd3, 0xef, 0x03, 0xe0, 0xd8, 0x2a, 0x1c, 0x79, 0xe2, 0x4f, + 0x38, 0x74, 0xf0, 0x7d, 0x6f, 0x40, 0xce, 0x2e, 0x1f, 0xa8, 0x95, 0xfe, + 0x82, 0x37, 0x09, 0x12, 0xfc, 0xc7, 0x68, 0x7f, 0xb9, 0x40, 0xad, 0xf4, + 0xba, 0xae, 0x64, 0x10, 0x0f, 0x75, 0xae, 0xcb, 0x38, 0x96, 0x00, 0x03, + 0x5a, 0x8a, 0x25, 0xac, 0xf9, 0x70, 0x6d, 0x0d, 0x7a, 0x26, 0xcd, 0x71, + 0x66, 0x19, 0x06, 0xcf, 0x93, 0xb8, 0x02, 0xf5, 0xff, 0x76, 0xc2, 0xd5, + 0x6c, 0x12, 0xa3, 0x3b, 0xea, 0xf2, 0x2f, 0xf7, 0x6c, 0x02, 0xa8, 0xf5, + 0xbb, 0x77, 0xc3, 0x2d, 0xea, 0xbe, 0x76, 0x0f, 0xc0, 0xf1, 0x1c, 0x18, + 0x60, 0x69, 0x09, 0xc6, 0xc6, 0xd4, 0xba, 0x28, 0x77, 0xc7, 0xfb, 0xcc, + 0x63, 0xdf, 0x9f, 0x40, 0xad, 0xff, 0xf2, 0x17, 0x00, 0x1c, 0x92, 0x6d, + 0x38, 0xbe, 0x01, 0x1c, 0x4c, 0xb6, 0xe1, 0xe9, 0x27, 0xfb, 0xca, 0xe1, + 0x58, 0xa6, 0xad, 0x9a, 0x85, 0xa7, 0xf7, 0x6b, 0xc7, 0xe1, 0xe0, 0xee, + 0x98, 0xf6, 0x9a, 0xa4, 0x3c, 0xa2, 0xc2, 0xcc, 0xba, 0x18, 0x9b, 0xa4, + 0x81, 0xcf, 0xb2, 0x06, 0xd0, 0x44, 0x32, 0xc2, 0xd1, 0x13, 0x9a, 0xcc, + 0x7a, 0x24, 0x23, 0x1c, 0xab, 0xca, 0x64, 0xdd, 0x45, 0x74, 0x0e, 0xb0, + 0xf4, 0xac, 0xc4, 0x6f, 0x25, 0x78, 0x7a, 0x92, 0x94, 0xbf, 0xe6, 0xe3, + 0x8d, 0x78, 0xf8, 0x6b, 0xca, 0x47, 0x6d, 0xc4, 0x23, 0x7c, 0xf1, 0x28, + 0x1f, 0xfb, 0xe5, 0x03, 0x84, 0x27, 0xe6, 0x34, 0x10, 0x01, 0xec, 0x8a, + 0x9b, 0xae, 0xbb, 0x96, 0x4b, 0x98, 0x64, 0xeb, 0x47, 0x57, 0x24, 0x1f, + 0xff, 0x8f, 0x53, 0xc8, 0x85, 0xcf, 0xd1, 0x0e, 0xbb, 0x7f, 0xe9, 0x65, + 0x57, 0xa4, 0x61, 0x65, 0x57, 0xf0, 0xf1, 0xa7, 0xca, 0x1c, 0x78, 0xc2, + 0x63, 0xee, 0xf3, 0x3e, 0xc1, 0xeb, 0x6a, 0xb2, 0x57, 0x75, 0x4b, 0x8d, + 0xe0, 0xf5, 0x66, 0xd7, 0x12, 0x40, 0x3e, 0x05, 0xc9, 0xee, 0xbb, 0xa9, + 0x59, 0x16, 0xcd, 0x24, 0xa1, 0xa6, 0x9f, 0x11, 0x87, 0xad, 0x4f, 0x9e, + 0x3f, 0x8c, 0x65, 0xb9, 0x24, 0x49, 0xa8, 0x00, 0xcf, 0x40, 0x98, 0x84, + 0xb8, 0x03, 0xd6, 0x8f, 0xae, 0x48, 0x3e, 0x3a, 0x61, 0x20, 0xab, 0x60, + 0x7b, 0x82, 0xd8, 0xd7, 0xcf, 0x08, 0xdb, 0x05, 0xf2, 0x42, 0xf7, 0xfa, + 0x7d, 0x22, 0x6b, 0x6f, 0x39, 0x56, 0x95, 0x28, 0x09, 0xba, 0xd6, 0xd3, + 0x63, 0xbd, 0x50, 0x23, 0xd9, 0x91, 0xb5, 0xdb, 0xbc, 0x8a, 0x85, 0x6f, + 0x9e, 0x21, 0x2b, 0x02, 0x27, 0x7a, 0x2c, 0x3b, 0xbf, 0xfa, 0xe7, 0x72, + 0x5d, 0x65, 0x2b, 0x00, 0x3f, 0x51, 0xd9, 0x4e, 0xfc, 0x46, 0xb0, 0x18, + 0x0a, 0x7d, 0x5f, 0xe8, 0x27, 0x2a, 0x6a, 0xb2, 0xdb, 0x75, 0x95, 0xad, + 0xfc, 0xad, 0x6e, 0x73, 0xe5, 0xef, 0xd7, 0x8d, 0x66, 0x82, 0xb5, 0xa3, + 0x86, 0x5d, 0xb1, 0x58, 0x0e, 0x12, 0xbc, 0x6a, 0x15, 0xdb, 0xaa, 0x13, + 0x27, 0x09, 0xb6, 0x65, 0xa5, 0x70, 0x2d, 0x20, 0x0d, 0xf3, 0xda, 0xff, + 0x5e, 0x57, 0x00, 0x00, 0x20, 0x00, 0x49, 0x44, 0x41, 0x54, 0xf5, 0xb5, + 0x6e, 0xed, 0xf0, 0x48, 0xee, 0x9d, 0xc3, 0xda, 0xe1, 0xe1, 0x3a, 0x16, + 0x76, 0xc5, 0xe6, 0xec, 0x79, 0x1f, 0x9a, 0x0a, 0xb0, 0x15, 0x9e, 0x8e, + 0x48, 0x92, 0x18, 0xaf, 0x5a, 0xc3, 0x1a, 0x71, 0x73, 0x70, 0x2d, 0x75, + 0x6d, 0x45, 0xab, 0x21, 0xd6, 0x88, 0xcd, 0xc3, 0xbf, 0xaf, 0xe0, 0x27, + 0xe1, 0x4a, 0x93, 0xfd, 0x37, 0x4d, 0x12, 0xad, 0xc6, 0xd4, 0x6f, 0x9a, + 0xc4, 0x75, 0xd5, 0x75, 0xd2, 0x38, 0xb9, 0x4c, 0x7d, 0xdf, 0x1e, 0x22, + 0x0d, 0xa1, 0x02, 0xa8, 0xdf, 0x34, 0x99, 0xe6, 0x2b, 0x8a, 0x14, 0x84, + 0x0b, 0x40, 0xee, 0xde, 0x83, 0xe3, 0x58, 0x2c, 0x3d, 0xb3, 0x44, 0xf3, + 0x8c, 0x83, 0x43, 0x83, 0xfd, 0x37, 0x09, 0xa2, 0x48, 0xe2, 0x38, 0x16, + 0xb5, 0xf7, 0xde, 0x4e, 0xb3, 0xd9, 0xa0, 0x56, 0xab, 0x63, 0x5d, 0xeb, + 0xd2, 0x78, 0x4e, 0xdd, 0xc3, 0x14, 0x48, 0x2b, 0xa2, 0x76, 0xd3, 0x18, + 0x61, 0x14, 0x11, 0x9e, 0x6a, 0x42, 0xee, 0x39, 0xf1, 0xe8, 0x6f, 0xa9, + 0x6b, 0xaf, 0x79, 0xc6, 0xa1, 0xb6, 0xba, 0x84, 0xe3, 0x58, 0x29, 0xd0, + 0xcb, 0xb4, 0x8f, 0xad, 0x6b, 0x5d, 0x2c, 0x20, 0x3a, 0xde, 0xc0, 0xdd, + 0xea, 0x11, 0x36, 0xfc, 0xd4, 0xe6, 0xd0, 0x83, 0xf3, 0x24, 0x8c, 0x53, + 0xdb, 0x2d, 0x89, 0xf4, 0x3d, 0x2b, 0x5c, 0x69, 0x12, 0x9e, 0x81, 0x68, + 0xb5, 0x46, 0xe3, 0x39, 0x70, 0x46, 0xc3, 0x01, 0xc0, 0x5a, 0x89, 0xeb, + 0xaa, 0x63, 0xe7, 0xba, 0x16, 0xf3, 0x9f, 0xf1, 0x49, 0x92, 0x18, 0xcb, + 0xb2, 0x69, 0xbe, 0xb8, 0xa8, 0x81, 0x5a, 0x12, 0x77, 0xc4, 0xc5, 0x59, + 0xeb, 0x3e, 0xbf, 0xe6, 0xbc, 0x9b, 0xdf, 0x41, 0xf9, 0x32, 0xaf, 0x6b, + 0xe7, 0xdd, 0x6f, 0x1a, 0xba, 0xaf, 0x75, 0xf6, 0x5b, 0xb4, 0xce, 0x6e, + 0xec, 0xa3, 0xbc, 0xb1, 0xc9, 0x15, 0x69, 0xbd, 0xbc, 0x01, 0x44, 0x03, + 0xa0, 0x54, 0xbd, 0xfa, 0x4e, 0xe5, 0x0d, 0xd6, 0xcf, 0xdf, 0x1b, 0x91, + 0xb7, 0x41, 0xd7, 0x75, 0xfe, 0x99, 0x6b, 0x8d, 0x06, 0x0a, 0x7b, 0xa0, + 0x7a, 0x43, 0x43, 0x12, 0x6a, 0x4e, 0x3d, 0x07, 0xcd, 0x4a, 0x70, 0x9d, + 0x7a, 0x0a, 0xd6, 0x02, 0x0d, 0xbd, 0x72, 0x00, 0x14, 0x84, 0x2a, 0x04, + 0x2c, 0xdb, 0x62, 0x17, 0x70, 0xb6, 0xd9, 0x00, 0xdb, 0x40, 0xb2, 0xc0, + 0x6f, 0x86, 0x34, 0xed, 0x3a, 0xae, 0xa3, 0x20, 0x5b, 0x71, 0x9c, 0x30, + 0x5e, 0xab, 0xa7, 0x00, 0x2c, 0x65, 0xa7, 0xfd, 0xe4, 0xc2, 0x42, 0x0d, + 0xb3, 0x42, 0xc3, 0xac, 0x54, 0x4e, 0xba, 0xed, 0x41, 0xf5, 0xcd, 0xee, + 0xea, 0x79, 0x8c, 0x35, 0x79, 0x8a, 0x63, 0xb0, 0x6d, 0xe5, 0x03, 0xd4, + 0x04, 0xf6, 0xc5, 0x13, 0xe0, 0xd5, 0xfc, 0xae, 0x34, 0x3d, 0xc7, 0xc5, + 0x75, 0x3c, 0xce, 0x36, 0xc1, 0xb6, 0x4d, 0xfa, 0x06, 0xf5, 0x65, 0xa4, + 0xe0, 0x5f, 0x61, 0xe4, 0xf3, 0xc8, 0x7e, 0xf8, 0x50, 0x6f, 0xf3, 0x29, + 0x0f, 0xd2, 0xd2, 0xeb, 0x79, 0xd8, 0xd5, 0x40, 0x28, 0x56, 0xce, 0xfe, + 0x72, 0xc0, 0x58, 0xf9, 0x34, 0xcd, 0x31, 0xb1, 0x6e, 0x80, 0xed, 0xab, + 0x03, 0x9e, 0xb9, 0x4c, 0xdb, 0xac, 0x6a, 0xd1, 0x68, 0x85, 0x2c, 0x3e, + 0xbf, 0x48, 0x59, 0x28, 0x98, 0x96, 0x25, 0xda, 0x58, 0x02, 0xfc, 0x35, + 0xb0, 0x4e, 0x2b, 0xd0, 0xd6, 0xbb, 0xde, 0x73, 0x07, 0x9f, 0xd3, 0x40, + 0xce, 0xa5, 0xa5, 0x79, 0x3e, 0xf8, 0xc1, 0xdb, 0x79, 0xfc, 0x33, 0x8f, + 0x33, 0xf7, 0xdc, 0x13, 0x69, 0xb2, 0xde, 0x88, 0xaa, 0x6f, 0x65, 0x27, + 0xa6, 0x8c, 0x83, 0x1f, 0x05, 0x38, 0xba, 0x3f, 0x3b, 0xea, 0xc0, 0xfc, + 0x09, 0xd5, 0x4e, 0x2e, 0x57, 0x1c, 0xfc, 0x28, 0xa2, 0xe6, 0x75, 0xf7, + 0x65, 0x19, 0x20, 0x96, 0x7f, 0x3e, 0x6b, 0x93, 0xcb, 0xd7, 0x43, 0xc4, + 0x16, 0x17, 0xf1, 0xcd, 0x2c, 0x2c, 0x4c, 0x24, 0xf6, 0x56, 0x8f, 0xf8, + 0x92, 0x4f, 0xb3, 0x11, 0xc2, 0x9b, 0xd5, 0xfe, 0x30, 0xd7, 0x9f, 0x98, + 0xb7, 0x4f, 0x7d, 0xb5, 0xdb, 0x29, 0x28, 0xcb, 0x2a, 0x25, 0xcc, 0x1f, + 0x57, 0xe9, 0xcd, 0x5f, 0xf0, 0x71, 0x9d, 0xee, 0xe7, 0x0e, 0x3f, 0x0a, + 0xb0, 0x44, 0xf7, 0x73, 0xe2, 0x93, 0xcf, 0x1e, 0xe3, 0xee, 0x5f, 0xfa, + 0x20, 0x8f, 0x3e, 0xfa, 0x24, 0x71, 0x2b, 0xc4, 0xae, 0xb8, 0x3c, 0xfa, + 0xe8, 0x93, 0x4c, 0xdd, 0x7a, 0x3b, 0xf1, 0x56, 0x09, 0x12, 0xe6, 0x57, + 0xe6, 0xb1, 0x23, 0x48, 0x62, 0x09, 0x36, 0x08, 0x29, 0x48, 0xb6, 0xaa, + 0xb3, 0x61, 0x5d, 0xb2, 0x48, 0x74, 0xbf, 0x95, 0x25, 0x24, 0x89, 0x14, + 0xcc, 0x2f, 0xf9, 0xa4, 0x4f, 0x56, 0x23, 0x12, 0x12, 0xb4, 0x8d, 0xcb, + 0xd4, 0xcd, 0xe3, 0xcc, 0x3d, 0xb7, 0xa8, 0xa1, 0xf9, 0xdd, 0x40, 0xad, + 0x30, 0x01, 0xa4, 0xa4, 0x6c, 0xb9, 0x34, 0x9a, 0x41, 0x1a, 0xbe, 0xbf, + 0xda, 0xdf, 0x47, 0xba, 0x47, 0xc3, 0x69, 0xdc, 0x8a, 0x43, 0x33, 0xc9, + 0xf5, 0xd1, 0x95, 0x1c, 0x9c, 0x91, 0x3d, 0x44, 0xd1, 0x22, 0x0a, 0x78, + 0x16, 0xea, 0x0f, 0x8a, 0x34, 0xa0, 0xe4, 0x40, 0x27, 0x42, 0x94, 0xea, + 0x58, 0xc2, 0x22, 0x6a, 0x9d, 0x48, 0xc3, 0x94, 0x6a, 0x28, 0x6c, 0xc9, + 0x59, 0xaa, 0xa3, 0xe3, 0x44, 0x6b, 0x3e, 0x52, 0x86, 0x54, 0x47, 0xc7, + 0x09, 0x56, 0xe7, 0xc8, 0xc3, 0xb4, 0x2c, 0x31, 0x86, 0x28, 0xd9, 0x44, + 0xad, 0x45, 0x2c, 0x51, 0xd3, 0xeb, 0xfa, 0x99, 0xa9, 0x03, 0x60, 0x61, + 0x5b, 0x16, 0xb2, 0xe3, 0x90, 0xc8, 0x88, 0xda, 0xa8, 0xa7, 0xd7, 0x37, + 0x09, 0x9a, 0x2a, 0x95, 0xfb, 0x9f, 0x6b, 0x4b, 0x1b, 0xd7, 0xce, 0x49, + 0x92, 0xa4, 0x63, 0x36, 0xf9, 0x75, 0x23, 0x03, 0xa9, 0xe9, 0xb5, 0xcf, + 0xdb, 0xf6, 0xda, 0xf4, 0x4a, 0x02, 0x32, 0x89, 0x10, 0x96, 0x85, 0x4c, + 0x12, 0x0d, 0xd2, 0x02, 0x5a, 0x28, 0xb0, 0x43, 0xaf, 0x7d, 0xde, 0xa6, + 0x67, 0xbb, 0x6b, 0x5f, 0x47, 0xe2, 0x6a, 0x70, 0xdd, 0x9e, 0x8a, 0x45, + 0x43, 0xdb, 0xe7, 0xeb, 0xf0, 0x46, 0x90, 0xa4, 0x20, 0x29, 0x05, 0xa0, + 0xaa, 0xa6, 0x7e, 0x17, 0x82, 0x00, 0xc3, 0x94, 0x9a, 0x5d, 0xc8, 0xa0, + 0x55, 0xa0, 0x00, 0x57, 0x46, 0x41, 0x80, 0x82, 0x09, 0x54, 0x15, 0x24, + 0x6a, 0x7a, 0x06, 0x08, 0x14, 0xe8, 0xa9, 0x3a, 0x31, 0xad, 0xe2, 0xcf, + 0xce, 0x92, 0x73, 0xad, 0x9d, 0xc0, 0xc2, 0x0c, 0xcc, 0xcc, 0x54, 0x59, + 0x98, 0x0d, 0x74, 0x1e, 0x02, 0x15, 0x1f, 0x65, 0x3c, 0x3d, 0x11, 0xe8, + 0xbc, 0xe8, 0x7c, 0x4c, 0x57, 0x99, 0x5d, 0x50, 0xf9, 0x5a, 0x98, 0x06, + 0x66, 0x60, 0x62, 0x5a, 0xe5, 0x21, 0xcb, 0x7b, 0xa0, 0xd3, 0xcc, 0xf9, + 0x9d, 0x56, 0x50, 0xaf, 0xd9, 0x99, 0x1c, 0x90, 0x6b, 0x06, 0x66, 0x75, + 0x8c, 0x69, 0xe0, 0xc0, 0x0c, 0x4c, 0xdc, 0x05, 0x1f, 0xfb, 0xb5, 0x43, + 0x4c, 0x7f, 0xfc, 0x88, 0xf2, 0x13, 0x28, 0x7e, 0x42, 0xaa, 0xaa, 0x86, + 0x69, 0x69, 0x2d, 0x4c, 0x68, 0x7f, 0xb3, 0xfa, 0x18, 0xe5, 0x6c, 0xf3, + 0xc0, 0x2b, 0x55, 0x16, 0x5d, 0xa6, 0x85, 0x40, 0x95, 0x4e, 0xfb, 0x9a, + 0x5d, 0xe8, 0x06, 0x6f, 0xa5, 0x20, 0x30, 0xe0, 0xc3, 0xf9, 0x0e, 0xbd, + 0xff, 0x2b, 0x03, 0x6a, 0xe5, 0x7d, 0x57, 0xab, 0x30, 0x3b, 0x0b, 0x3f, + 0x55, 0x5d, 0xbf, 0xdf, 0xac, 0xaf, 0x73, 0x66, 0x1d, 0xa0, 0x16, 0x30, + 0x10, 0x94, 0xb5, 0xd9, 0x30, 0x4a, 0x82, 0xae, 0x60, 0x3d, 0x6e, 0x69, + 0x55, 0xac, 0xb4, 0xfd, 0x69, 0x55, 0xc8, 0xc6, 0xf4, 0x5a, 0x6a, 0x8c, + 0xcc, 0x8c, 0x83, 0x48, 0xd9, 0x33, 0xce, 0xd2, 0x91, 0x24, 0x49, 0x94, + 0x5e, 0x5b, 0x42, 0x0c, 0x18, 0xa3, 0xec, 0x2d, 0x5b, 0x1e, 0xa6, 0x35, + 0xe4, 0x43, 0x21, 0xeb, 0xe9, 0x8a, 0xca, 0xdf, 0xc9, 0x00, 0x5b, 0xe6, + 0xfa, 0x2f, 0x93, 0x3d, 0xd7, 0xc4, 0xad, 0x04, 0xff, 0x7f, 0x3e, 0x88, + 0xe7, 0xb8, 0x84, 0xbf, 0xf2, 0x31, 0x92, 0x24, 0xc1, 0x1d, 0x71, 0x78, + 0xcc, 0x75, 0xf1, 0xcf, 0x35, 0x71, 0x2d, 0x0b, 0xca, 0x59, 0xbd, 0xf4, + 0x30, 0xaa, 0xb7, 0xeb, 0xe1, 0x7f, 0x93, 0x41, 0xb5, 0x60, 0x70, 0xbf, + 0xd9, 0x7a, 0xe3, 0x5c, 0x79, 0xd8, 0x7d, 0x17, 0x68, 0x4b, 0x08, 0x12, + 0x14, 0x28, 0x4b, 0xa6, 0x1f, 0x7a, 0x12, 0xc4, 0x80, 0xe8, 0x1b, 0xbd, + 0x03, 0x0b, 0x49, 0x0d, 0x41, 0xa3, 0xa3, 0x10, 0xfa, 0x9e, 0x06, 0xc4, + 0x34, 0x3a, 0x0a, 0x56, 0x05, 0x0a, 0x58, 0x75, 0xa4, 0x04, 0x47, 0x51, + 0x10, 0xaa, 0x07, 0x3b, 0xf0, 0xb8, 0x86, 0x45, 0x1d, 0xea, 0xa8, 0x8f, + 0x1c, 0xd8, 0x25, 0xb8, 0xfb, 0x37, 0x5d, 0xee, 0xfa, 0x55, 0x1f, 0x0b, + 0xb8, 0xf3, 0x3e, 0x17, 0xee, 0x0f, 0xf9, 0x58, 0x2e, 0xad, 0x29, 0x14, + 0xa4, 0x0a, 0x14, 0xa8, 0xea, 0x08, 0x70, 0xa8, 0x04, 0x6e, 0x49, 0x10, + 0x77, 0x14, 0xd8, 0xca, 0x00, 0xae, 0x32, 0xd0, 0x55, 0xf7, 0xf9, 0xb1, + 0x4b, 0x0a, 0x3c, 0x74, 0xe4, 0x46, 0x38, 0xf4, 0x3c, 0xd4, 0x4b, 0xf0, + 0x98, 0xde, 0x97, 0x87, 0x6b, 0x89, 0x12, 0x1c, 0x95, 0x92, 0xa4, 0x24, + 0xa8, 0x77, 0xa0, 0x51, 0x02, 0x90, 0x78, 0xc0, 0xe3, 0xa5, 0x32, 0x6e, + 0xa7, 0x4d, 0x7f, 0x6b, 0x21, 0x4b, 0xf7, 0x08, 0x70, 0x48, 0xc0, 0x2e, + 0x09, 0x77, 0x94, 0x54, 0x7e, 0x0f, 0xe5, 0xee, 0x37, 0xe6, 0xd8, 0x1c, + 0x36, 0xe5, 0xd0, 0xf9, 0xbc, 0x5f, 0xe7, 0xc1, 0xee, 0x29, 0x13, 0x37, + 0x02, 0xcf, 0xab, 0xf5, 0x28, 0x3f, 0x7e, 0xad, 0xc7, 0xb9, 0xf8, 0x39, + 0x75, 0xae, 0x7f, 0x78, 0xe7, 0x3f, 0x87, 0xe6, 0xeb, 0x29, 0x48, 0xca, + 0xe8, 0xf5, 0xf0, 0xd5, 0x14, 0x3e, 0x05, 0x70, 0x8d, 0x0b, 0xaf, 0xbc, + 0xf2, 0x4a, 0x0a, 0x6e, 0xca, 0x03, 0x9c, 0x0c, 0x50, 0xea, 0x95, 0x57, + 0x5e, 0x81, 0x1e, 0x18, 0x94, 0x81, 0x3f, 0xbd, 0xfa, 0xda, 0xeb, 0xf0, + 0xda, 0x2b, 0x5d, 0x3e, 0x4d, 0x9c, 0x6b, 0x5c, 0xd2, 0xb4, 0xb7, 0x6d, + 0xdb, 0xc6, 0xc5, 0x8b, 0x17, 0xd9, 0xb6, 0x6d, 0x5b, 0x57, 0x9e, 0xf2, + 0xc0, 0x2b, 0x93, 0x0f, 0xe3, 0x13, 0xe8, 0xcb, 0x6b, 0xbe, 0x2c, 0xdf, + 0x09, 0x9f, 0x66, 0xdf, 0xc5, 0x8b, 0x17, 0xbb, 0x21, 0x5c, 0xb9, 0xf2, + 0x7f, 0x2f, 0x8e, 0xe9, 0x0f, 0x5b, 0x7f, 0xaf, 0x56, 0x7e, 0x2e, 0x86, + 0xff, 0xac, 0x56, 0xf3, 0x75, 0xb8, 0x55, 0xf3, 0x40, 0xd8, 0xc8, 0xb5, + 0x10, 0x3f, 0x4e, 0xb0, 0x01, 0xe9, 0xa9, 0x7b, 0xbc, 0xa0, 0x4d, 0x7b, + 0x0d, 0xaa, 0xa3, 0x55, 0x9c, 0x8a, 0x87, 0xf8, 0x69, 0x75, 0xd5, 0x27, + 0x9d, 0x90, 0xf8, 0xcd, 0x92, 0xf0, 0xa4, 0x6a, 0x01, 0x4c, 0xde, 0x36, + 0x89, 0x65, 0xb9, 0xd4, 0x80, 0xe6, 0x4b, 0xcb, 0x78, 0x15, 0x07, 0x7f, + 0x2d, 0x62, 0xea, 0x1d, 0xaa, 0x3f, 0x2f, 0x49, 0xda, 0x78, 0x3b, 0x74, + 0x1d, 0x54, 0x8a, 0x91, 0x32, 0xc2, 0xae, 0xda, 0x2c, 0xbf, 0xb4, 0x88, + 0x77, 0x7d, 0x0d, 0xb1, 0x35, 0xa4, 0xd9, 0x68, 0x22, 0x3b, 0x92, 0xa9, + 0xf7, 0x1e, 0x48, 0xf3, 0x5e, 0x3e, 0xd5, 0x84, 0x12, 0x84, 0x51, 0x1b, + 0x4f, 0xf7, 0x6b, 0xc4, 0x49, 0x8c, 0xad, 0xdf, 0x11, 0x39, 0xfb, 0xd2, + 0x32, 0xb5, 0x1d, 0xbb, 0x60, 0xc7, 0x2e, 0x92, 0xc8, 0xa7, 0x76, 0xfd, + 0x38, 0x32, 0x09, 0x49, 0x56, 0x43, 0x84, 0xe5, 0x22, 0x5b, 0xaa, 0x7d, + 0x6e, 0x97, 0xa0, 0x76, 0xd3, 0x14, 0xe1, 0x5a, 0x82, 0xb0, 0xa0, 0xf9, + 0xe2, 0x32, 0x54, 0x6c, 0xbc, 0x51, 0xf5, 0x2c, 0xa0, 0x20, 0x5b, 0x12, + 0x61, 0x41, 0xbb, 0xd3, 0xc6, 0xb6, 0x6c, 0x42, 0x7f, 0x99, 0xa9, 0xdb, + 0xc6, 0x38, 0xfa, 0xd4, 0x31, 0xf6, 0x8c, 0xda, 0xcc, 0x9f, 0x6a, 0x32, + 0x3e, 0x6a, 0xb3, 0x1c, 0xc5, 0xd4, 0x2a, 0x2e, 0x07, 0x6f, 0x3b, 0xc8, + 0xfc, 0xf1, 0x39, 0xa6, 0x6e, 0x1e, 0x63, 0x71, 0xa9, 0xc9, 0xae, 0x11, + 0x0f, 0xc7, 0x29, 0x93, 0xac, 0xc5, 0x24, 0x89, 0xc0, 0x1a, 0x29, 0x53, + 0x2e, 0x41, 0x75, 0x47, 0x99, 0xf8, 0xf5, 0x84, 0xa9, 0x5b, 0xc7, 0x79, + 0xfc, 0x99, 0x39, 0xea, 0x8e, 0xe0, 0xc4, 0xf9, 0x88, 0xba, 0x63, 0x21, + 0x5b, 0x12, 0x57, 0x58, 0xd4, 0xc7, 0x6a, 0xcc, 0x3f, 0x9f, 0x60, 0x59, + 0x92, 0x44, 0xda, 0x78, 0xc2, 0xc3, 0xb2, 0xda, 0xfa, 0xd8, 0x95, 0x71, + 0x2d, 0x35, 0x7e, 0xd1, 0x7e, 0xb3, 0x0b, 0x89, 0xcf, 0xfe, 0xb1, 0xfd, + 0xc8, 0x96, 0x4f, 0xd8, 0x6c, 0xd2, 0x4c, 0xa0, 0xe6, 0x94, 0x69, 0x46, + 0x71, 0x77, 0x1d, 0x6e, 0xce, 0x39, 0x70, 0xc3, 0xdb, 0xde, 0xc6, 0x30, + 0xf5, 0x42, 0x9f, 0xf2, 0x00, 0xa9, 0x3c, 0x58, 0xaa, 0x17, 0x1c, 0x95, + 0xb7, 0x33, 0xf0, 0xa8, 0x57, 0xbf, 0xf6, 0x95, 0x3e, 0x60, 0x56, 0x6f, + 0xbc, 0x3c, 0x68, 0x6a, 0x35, 0x3a, 0x9f, 0x82, 0xba, 0x0c, 0x08, 0x6b, + 0xec, 0x5f, 0x5f, 0xc7, 0xd2, 0x17, 0x5f, 0xee, 0x03, 0x6a, 0x0d, 0x4a, + 0x73, 0x90, 0xff, 0xd5, 0xe8, 0x7c, 0x0a, 0xcb, 0x7a, 0xfa, 0x3f, 0x7d, + 0xae, 0x2b, 0xee, 0x6a, 0x74, 0x9e, 0x2f, 0x9f, 0xbb, 0x90, 0xee, 0x37, + 0x10, 0x2d, 0xe3, 0xef, 0xad, 0x57, 0x6f, 0xe7, 0xcb, 0xe7, 0x2e, 0xf4, + 0x95, 0x3b, 0x9f, 0x6e, 0x2f, 0x60, 0xcb, 0x6c, 0x5f, 0x4e, 0xb9, 0xf3, + 0xf9, 0xcf, 0xe7, 0x01, 0xc8, 0xe0, 0x5a, 0x13, 0x41, 0x37, 0x64, 0x8b, + 0x00, 0x66, 0x80, 0x69, 0xb8, 0x21, 0x78, 0x1b, 0x0d, 0xbe, 0xd1, 0x75, + 0x4d, 0x17, 0x2a, 0x54, 0xa8, 0x50, 0xa1, 0x42, 0x85, 0x0a, 0x15, 0x2a, + 0x54, 0xa8, 0x50, 0xa1, 0x42, 0x85, 0x0a, 0x15, 0x2a, 0x54, 0xa8, 0x50, + 0xa1, 0x42, 0x85, 0x0a, 0x15, 0x2a, 0x54, 0xa8, 0x50, 0xa1, 0xcd, 0xab, + 0x80, 0x6a, 0x15, 0x2a, 0x54, 0xa8, 0x50, 0xa1, 0x42, 0xdf, 0x2b, 0x1d, + 0xb7, 0xe1, 0x3d, 0x31, 0x72, 0x45, 0xe2, 0x56, 0xd5, 0x0b, 0x7c, 0xae, + 0xe3, 0x10, 0x27, 0x1a, 0x4a, 0xa5, 0x27, 0x0d, 0xcb, 0xae, 0x2f, 0x9c, + 0x0b, 0xca, 0x15, 0x41, 0xbb, 0x25, 0xb3, 0xc9, 0x8a, 0x25, 0x81, 0x6c, + 0xc5, 0x08, 0x21, 0xb0, 0x2b, 0x22, 0xfd, 0x4a, 0x30, 0xd0, 0xff, 0x82, + 0xb7, 0x01, 0x09, 0x08, 0x01, 0x55, 0x8f, 0xb0, 0x07, 0xba, 0x93, 0x7e, + 0xa9, 0x39, 0x49, 0x08, 0x25, 0xd8, 0x23, 0x36, 0x42, 0x64, 0x5f, 0x4c, + 0x16, 0x42, 0xe0, 0x6e, 0x75, 0x70, 0xb7, 0x3a, 0xec, 0xba, 0xba, 0x46, + 0x78, 0x29, 0x22, 0x5e, 0x0b, 0xbb, 0x3e, 0xfe, 0x1e, 0x6b, 0x68, 0x95, + 0x6d, 0xd9, 0xc8, 0x0e, 0xe9, 0xd7, 0xe5, 0x4d, 0xb8, 0xc9, 0x87, 0x65, + 0xd9, 0x38, 0xa3, 0x2e, 0xe6, 0xc5, 0x64, 0x7b, 0xab, 0xad, 0x5f, 0xb8, + 0xcf, 0x7d, 0xe1, 0x53, 0xbf, 0x80, 0x3f, 0xbe, 0x7f, 0x92, 0xc5, 0x13, + 0xf3, 0xb4, 0x73, 0x3e, 0x0c, 0x60, 0x2b, 0x4e, 0x62, 0x64, 0x07, 0x9c, + 0x6f, 0x5a, 0xb0, 0x45, 0x85, 0xb5, 0x65, 0x1b, 0x68, 0x53, 0xdb, 0xe1, + 0x41, 0xd5, 0x83, 0x52, 0x99, 0xb1, 0xb1, 0x49, 0x96, 0x96, 0x14, 0x20, + 0x28, 0xd1, 0xa0, 0xac, 0x58, 0x26, 0xd8, 0x7a, 0xe2, 0x66, 0x32, 0xa2, + 0x60, 0x43, 0xb2, 0x23, 0xbb, 0xf2, 0x1a, 0xad, 0xfa, 0x88, 0x52, 0xff, + 0x0b, 0xdf, 0x83, 0x24, 0x4a, 0x02, 0xb9, 0x22, 0x55, 0x09, 0x8e, 0x67, + 0x50, 0xa0, 0xe4, 0xb4, 0x84, 0x09, 0x88, 0x56, 0x13, 0xa8, 0x82, 0xeb, + 0x58, 0x0a, 0xe0, 0x34, 0xe0, 0xdd, 0xfb, 0x44, 0x4f, 0xc4, 0x1a, 0x04, + 0x7e, 0x72, 0x9d, 0x6c, 0xe2, 0xcc, 0x20, 0xc9, 0x44, 0xe2, 0x8d, 0x3a, + 0xea, 0xcb, 0xca, 0xab, 0xdd, 0xf1, 0x4d, 0xdc, 0x41, 0x70, 0xab, 0x24, + 0x91, 0x03, 0xa1, 0x51, 0xae, 0x63, 0x91, 0x24, 0x6d, 0x2c, 0x61, 0x75, + 0xe7, 0x55, 0x2a, 0xd0, 0x14, 0x0c, 0x06, 0x6a, 0x99, 0xb4, 0xd2, 0xf4, + 0x7a, 0x26, 0x1d, 0x98, 0x32, 0x9a, 0xdf, 0xc6, 0xd0, 0x7c, 0x0e, 0x89, + 0x37, 0x2c, 0xcd, 0x6f, 0xe7, 0x98, 0xf6, 0xa5, 0x47, 0x56, 0xc6, 0x61, + 0x30, 0xae, 0x68, 0x55, 0x4d, 0x60, 0x4c, 0x4e, 0xe7, 0x7e, 0xb7, 0xb9, + 0xeb, 0xda, 0x78, 0x12, 0xc2, 0x1a, 0x08, 0xc7, 0xca, 0x87, 0x0f, 0xb3, + 0xe9, 0xb5, 0x87, 0x7e, 0xd0, 0x56, 0xf3, 0x7c, 0x33, 0xf7, 0x65, 0xf5, + 0xbc, 0xfd, 0xe0, 0xc9, 0x1d, 0xeb, 0x4e, 0x10, 0xe9, 0x91, 0xeb, 0xb8, + 0xdd, 0xd7, 0x2e, 0xfa, 0xab, 0xea, 0x03, 0x26, 0x8e, 0xc8, 0x41, 0x13, + 0x66, 0xf4, 0x17, 0xbe, 0x37, 0xad, 0xef, 0xe4, 0xd3, 0xc9, 0xb7, 0xe1, + 0x7b, 0xa3, 0xeb, 0xda, 0xbd, 0xbe, 0xde, 0x17, 0x27, 0x8a, 0x22, 0xdc, + 0x51, 0x77, 0xd3, 0x69, 0x5c, 0xae, 0xfd, 0x77, 0x23, 0x8d, 0xef, 0x27, + 0xfb, 0x2b, 0xf5, 0xed, 0x8e, 0xba, 0x43, 0xeb, 0x4c, 0x50, 0xd7, 0xb9, + 0x3b, 0x92, 0xf9, 0x8d, 0xce, 0x37, 0xe9, 0xbd, 0xae, 0x2f, 0x9d, 0x6e, + 0x51, 0xfb, 0x99, 0x1f, 0xe5, 0xc2, 0x6a, 0x8b, 0xdf, 0xcb, 0xcd, 0x2f, + 0x1f, 0x04, 0xd3, 0x32, 0x61, 0xc7, 0xcf, 0xc3, 0x23, 0x9f, 0xfc, 0x24, + 0x1f, 0xfa, 0xf0, 0x87, 0xbb, 0xd2, 0x3b, 0x7e, 0xfc, 0x38, 0xb7, 0xdc, + 0x72, 0x0b, 0x70, 0x65, 0xfb, 0xbf, 0x1f, 0x74, 0xf5, 0xc6, 0x26, 0xdf, + 0x77, 0x3a, 0x77, 0xfe, 0x7c, 0x1f, 0x54, 0xeb, 0xc2, 0x6a, 0x0b, 0x18, + 0xe1, 0xd2, 0xe9, 0x16, 0xf0, 0x23, 0x00, 0x24, 0x2d, 0xf5, 0x5d, 0xf6, + 0xa8, 0x05, 0xf3, 0xa7, 0xd4, 0x8c, 0xb1, 0x27, 0x6e, 0xfc, 0x38, 0x1f, + 0xdf, 0x29, 0x11, 0xbf, 0xfb, 0x27, 0x00, 0x4c, 0x02, 0x87, 0x5f, 0xfa, + 0xf6, 0xf2, 0x13, 0x9f, 0x9a, 0x07, 0xe1, 0xc2, 0x5a, 0x6e, 0xd2, 0xf6, + 0x80, 0x7b, 0x62, 0xaf, 0x7e, 0x10, 0x80, 0x57, 0xdf, 0x4b, 0xfb, 0x2e, + 0xe5, 0xe2, 0x44, 0x2d, 0xb5, 0x4c, 0x5a, 0x36, 0x88, 0x24, 0x5b, 0x47, + 0x12, 0xf5, 0xb6, 0x8b, 0x46, 0x5c, 0x38, 0xdd, 0x84, 0x24, 0x86, 0x1b, + 0x35, 0xf0, 0x24, 0x8c, 0xde, 0x40, 0xa0, 0x96, 0x92, 0xb3, 0xcf, 0xc2, + 0x3f, 0x91, 0xe0, 0xed, 0xd7, 0x93, 0x22, 0x2b, 0x19, 0x68, 0xab, 0xf1, + 0x4c, 0x82, 0x99, 0xf0, 0x3b, 0x54, 0x8b, 0x4f, 0xf0, 0xa0, 0x10, 0x69, + 0x5b, 0xf9, 0x9e, 0x92, 0x50, 0x80, 0xad, 0xe3, 0x73, 0x10, 0xf8, 0x8a, + 0x18, 0x71, 0x42, 0xcf, 0x66, 0xdf, 0x9f, 0x9b, 0x88, 0x12, 0xf8, 0xdf, + 0x5f, 0x40, 0x2d, 0x0d, 0xd2, 0x7a, 0x30, 0x17, 0x74, 0x0f, 0xa8, 0x3c, + 0x9f, 0x38, 0x01, 0xab, 0x3e, 0x9c, 0xd3, 0xcf, 0x2b, 0x06, 0x12, 0x06, + 0x43, 0xcb, 0x11, 0x25, 0x12, 0x46, 0xcb, 0xea, 0xfc, 0x56, 0xf4, 0xb9, + 0x36, 0xf7, 0xeb, 0x28, 0xc2, 0xdb, 0x3d, 0x18, 0xc4, 0xb9, 0x69, 0xf5, + 0xc1, 0x62, 0x00, 0x19, 0x0f, 0x5c, 0xdf, 0xcc, 0xb3, 0x83, 0xec, 0x0c, + 0x5e, 0xdf, 0x7c, 0x7e, 0x2e, 0x13, 0xcc, 0x67, 0xea, 0x99, 0x7c, 0x7d, + 0x33, 0x60, 0xbd, 0x8d, 0x82, 0x76, 0x98, 0xe5, 0xa0, 0x3c, 0x76, 0xad, + 0xe7, 0x0a, 0xdb, 0xbe, 0x92, 0x72, 0xf4, 0x3a, 0x19, 0x6c, 0xd0, 0x95, + 0x46, 0x14, 0x45, 0x40, 0xb5, 0xeb, 0x7e, 0xfd, 0x72, 0xeb, 0x12, 0x93, + 0x3f, 0x5a, 0xe3, 0xab, 0xad, 0x0b, 0x83, 0x5d, 0x14, 0xfa, 0x81, 0xd4, + 0x57, 0x5b, 0x17, 0x60, 0x44, 0x9d, 0x5f, 0x7d, 0xbb, 0xee, 0xba, 0x5f, + 0x87, 0xfa, 0x5e, 0x7a, 0xf6, 0x7c, 0x83, 0xc9, 0x5b, 0xf7, 0xe3, 0x5f, + 0xf0, 0x91, 0xe7, 0x23, 0xe8, 0xc8, 0x3e, 0xb8, 0x5a, 0x72, 0xde, 0x87, + 0x7b, 0xc6, 0x49, 0x1e, 0x6c, 0x60, 0x69, 0xd8, 0x96, 0x59, 0x4a, 0x09, + 0x6c, 0x17, 0x4c, 0xbd, 0xbf, 0xc6, 0xdc, 0x67, 0x14, 0x4c, 0x23, 0x5c, + 0x8b, 0x79, 0xd7, 0xfb, 0x3d, 0x9a, 0x81, 0x84, 0xa6, 0xfa, 0x0d, 0x1a, + 0xa0, 0x16, 0x48, 0xc2, 0x95, 0x26, 0xfe, 0x27, 0x0e, 0x22, 0x3e, 0x32, + 0x8f, 0xbb, 0xb3, 0x8e, 0xbb, 0xb3, 0x96, 0x02, 0xa7, 0x00, 0xa4, 0xa5, + 0xe2, 0xdc, 0x7e, 0xcf, 0xbb, 0x78, 0xf2, 0x41, 0x35, 0xa9, 0x2f, 0x5a, + 0x6d, 0x53, 0xbf, 0x79, 0x0f, 0x24, 0x10, 0x86, 0x39, 0xa0, 0xe2, 0xee, + 0x3d, 0x84, 0x67, 0x96, 0x15, 0x5c, 0xeb, 0x9e, 0x3b, 0x09, 0xff, 0xcd, + 0x63, 0x58, 0x80, 0xbd, 0x7b, 0x0f, 0x51, 0x94, 0x50, 0xbf, 0xb6, 0x4e, + 0xa3, 0xb1, 0xc8, 0xe4, 0x7b, 0xc7, 0xc1, 0x91, 0x84, 0xa7, 0x7d, 0xa2, + 0xd3, 0x39, 0x70, 0xc8, 0x56, 0x1b, 0x6b, 0xab, 0x4d, 0xa3, 0xa1, 0xf2, + 0x6e, 0xef, 0xae, 0xe1, 0x9f, 0x52, 0x00, 0x97, 0x04, 0x35, 0xa1, 0xd5, + 0x62, 0x4e, 0x5f, 0xd3, 0x99, 0x4f, 0x00, 0xb7, 0x0e, 0x53, 0xbb, 0xe1, + 0x81, 0x07, 0xd5, 0xc4, 0xd8, 0xdb, 0xff, 0xed, 0x14, 0xcd, 0x33, 0x3e, + 0x6e, 0xc9, 0xc5, 0x75, 0x5d, 0x1a, 0x27, 0x97, 0x55, 0xb9, 0x57, 0x16, + 0x09, 0xcf, 0x40, 0xc2, 0x38, 0x16, 0x8b, 0x3d, 0xc7, 0x43, 0x3d, 0x27, + 0xba, 0xae, 0x8b, 0x5b, 0xb3, 0x18, 0xdb, 0xa9, 0xc2, 0x1e, 0xff, 0xa3, + 0x26, 0xcd, 0xd3, 0xcb, 0x1c, 0xf8, 0xe5, 0x1a, 0x8d, 0x33, 0xea, 0x78, + 0xb4, 0x3b, 0xd0, 0x5e, 0x8b, 0xf5, 0xb1, 0x97, 0xea, 0xbc, 0xfc, 0x52, + 0x0d, 0xf7, 0xa5, 0xdc, 0xf9, 0xd5, 0x75, 0x78, 0xfe, 0xba, 0xde, 0x3d, + 0xf0, 0x17, 0x32, 0x5c, 0xff, 0xea, 0xda, 0x1f, 0xe2, 0xb9, 0xdf, 0xf8, + 0xfb, 0xbe, 0xf0, 0xeb, 0x3e, 0xf2, 0x43, 0x44, 0xab, 0xf0, 0x0f, 0xac, + 0x0f, 0x87, 0xf2, 0xb6, 0xbd, 0x89, 0xd7, 0x36, 0xb0, 0xb9, 0x52, 0x79, + 0xdb, 0xde, 0xc4, 0xcb, 0x9f, 0xf8, 0x87, 0x81, 0xfb, 0xc6, 0x7f, 0xed, + 0x87, 0x36, 0x4c, 0xf7, 0xea, 0x9f, 0x78, 0x53, 0x0e, 0x43, 0xf2, 0xc6, + 0xab, 0xbc, 0x0a, 0x5f, 0x7b, 0xb1, 0x3f, 0x0f, 0x37, 0xff, 0xe6, 0x3f, + 0xe3, 0xb9, 0xcf, 0xf6, 0x1f, 0xd3, 0xbc, 0x36, 0x73, 0xdc, 0x06, 0x5d, + 0xd7, 0xf9, 0x67, 0xae, 0x9f, 0x1d, 0x9b, 0x64, 0xee, 0xc4, 0x1c, 0xe3, + 0xfb, 0xa7, 0x68, 0x46, 0x3e, 0xae, 0x53, 0xd7, 0xd0, 0x2c, 0x8f, 0x10, + 0x70, 0x23, 0x9f, 0xb3, 0xcd, 0x06, 0xbb, 0x6a, 0x0a, 0xac, 0x35, 0xbe, + 0xbf, 0xce, 0xa2, 0xb6, 0x0f, 0x23, 0xd5, 0x0c, 0x0a, 0x23, 0xb0, 0x1d, + 0x8f, 0xc5, 0x13, 0x73, 0x78, 0xb5, 0x1a, 0xae, 0xe3, 0x41, 0x0e, 0x7a, + 0x65, 0x6c, 0xc0, 0xc7, 0xae, 0xd5, 0x69, 0x46, 0x0d, 0xcc, 0x5d, 0xcf, + 0xb6, 0x2d, 0x0d, 0xec, 0xf2, 0xb0, 0x80, 0xc5, 0x58, 0x5d, 0x1b, 0x71, + 0x9c, 0x68, 0x70, 0x97, 0xca, 0x4b, 0x1c, 0x37, 0xc8, 0xcb, 0x05, 0x2c, + 0xc7, 0xd3, 0xf6, 0x5e, 0xea, 0xa3, 0x5b, 0x3e, 0xd0, 0xed, 0x7b, 0x7c, + 0xbf, 0xc9, 0x8b, 0x52, 0xcd, 0xf1, 0x48, 0x1c, 0xe3, 0xdb, 0x00, 0xc6, + 0x7c, 0x5c, 0x20, 0x76, 0xdc, 0xd4, 0xb7, 0x09, 0x27, 0x85, 0x9d, 0x67, + 0xf9, 0xe9, 0x05, 0x69, 0x59, 0x74, 0x75, 0xdd, 0x62, 0xdd, 0x90, 0xed, + 0xa3, 0x27, 0x3c, 0x1f, 0x36, 0xcc, 0x6e, 0x23, 0x59, 0x37, 0xa8, 0xf4, + 0x06, 0x3e, 0x73, 0x99, 0xb6, 0x59, 0x90, 0x10, 0x56, 0xc0, 0xb5, 0x42, + 0x64, 0x0b, 0x2c, 0xa1, 0x80, 0x4d, 0xde, 0x48, 0x99, 0xfa, 0xa8, 0x45, + 0xa8, 0xfb, 0xc7, 0x17, 0x9f, 0x7b, 0x12, 0xd7, 0x12, 0x48, 0x29, 0x09, + 0x5b, 0x31, 0x0f, 0xfc, 0xef, 0x0f, 0x03, 0xe0, 0x56, 0x74, 0xff, 0xcc, + 0x16, 0xf0, 0x75, 0x7d, 0xaa, 0xe0, 0x5a, 0x0a, 0xce, 0x15, 0xe9, 0xa6, + 0x83, 0x25, 0xda, 0xc8, 0x0e, 0x24, 0xb2, 0x0c, 0x2d, 0x05, 0xac, 0x0a, + 0xc3, 0x18, 0xd1, 0xb1, 0x89, 0x74, 0x5b, 0xda, 0x1b, 0xb1, 0x70, 0xb6, + 0x42, 0x74, 0x49, 0xc5, 0x39, 0x70, 0xdb, 0xed, 0x2c, 0xbe, 0xf0, 0x24, + 0xf2, 0xf5, 0x90, 0x30, 0xca, 0xda, 0x20, 0xae, 0x23, 0xe0, 0x9b, 0x21, + 0xae, 0x25, 0x74, 0xb8, 0x9f, 0x85, 0x6b, 0x4d, 0xde, 0x72, 0x3b, 0x4f, + 0xfc, 0xf1, 0xe3, 0x3d, 0xe1, 0x09, 0xbe, 0xbe, 0x5f, 0xc5, 0x80, 0xe7, + 0x64, 0x7d, 0x10, 0x26, 0xbc, 0xe6, 0xa9, 0xf2, 0x84, 0x61, 0xac, 0xf2, + 0x9a, 0x3f, 0x9e, 0xa2, 0xcd, 0x13, 0x4f, 0xa9, 0x72, 0x27, 0xb2, 0x4c, + 0x22, 0x13, 0xee, 0xff, 0x95, 0x7b, 0x79, 0xf8, 0x69, 0x1d, 0x16, 0x4b, + 0xee, 0xb8, 0xf9, 0x00, 0xc7, 0x5e, 0x7a, 0x82, 0x76, 0xa7, 0x8c, 0x67, + 0x29, 0x18, 0x9d, 0x51, 0xf9, 0x6a, 0x49, 0x62, 0xc6, 0x1b, 0x2e, 0x38, + 0xf4, 0xb5, 0x54, 0x3b, 0x1a, 0x77, 0xa2, 0x8f, 0xc7, 0xb1, 0xe3, 0xaa, + 0xff, 0x5c, 0x74, 0x62, 0xc6, 0xc7, 0xa6, 0x58, 0x0c, 0x32, 0x78, 0xaf, + 0x6b, 0x01, 0x08, 0x12, 0x0d, 0x89, 0x15, 0x02, 0xe2, 0x55, 0x41, 0x14, + 0xf4, 0xf7, 0x91, 0x2e, 0xb7, 0x12, 0xa6, 0x2c, 0x08, 0x07, 0x40, 0xec, + 0x93, 0xb5, 0x1e, 0x9c, 0x48, 0x27, 0xca, 0xc1, 0xb3, 0xaa, 0x58, 0xc2, + 0x22, 0x31, 0xfd, 0x9f, 0x5d, 0x40, 0xad, 0xc1, 0xc0, 0xab, 0x68, 0xad, + 0xff, 0xc3, 0x02, 0xa2, 0x64, 0x23, 0x3b, 0x71, 0xdf, 0x7a, 0x26, 0xd3, + 0xd2, 0x55, 0xe5, 0x56, 0x63, 0x32, 0xc3, 0xdb, 0xa4, 0xf6, 0x88, 0x45, + 0xbc, 0x96, 0x40, 0xa7, 0x8d, 0x04, 0x44, 0xa7, 0x8c, 0xa4, 0x8d, 0xa0, + 0x9c, 0xc2, 0x63, 0x44, 0x27, 0xef, 0xb1, 0x5b, 0x06, 0x8a, 0x95, 0x87, + 0x68, 0xf5, 0x02, 0xb5, 0x06, 0x41, 0xb6, 0xcc, 0x76, 0x3e, 0x3c, 0xdf, + 0x37, 0x9e, 0x07, 0x68, 0xe5, 0x65, 0xb6, 0xbb, 0xc2, 0x7b, 0x80, 0x5a, + 0x06, 0x98, 0x35, 0x2c, 0x6e, 0xba, 0xde, 0x91, 0x29, 0xc8, 0x2b, 0x6c, + 0x45, 0x30, 0xa2, 0xce, 0xaf, 0xf1, 0x97, 0xaf, 0xc3, 0x41, 0x01, 0x9d, + 0x0c, 0x58, 0x2b, 0xaf, 0x2e, 0xd0, 0xd3, 0x44, 0x06, 0x8c, 0x9a, 0x9e, + 0x9e, 0x26, 0x58, 0x58, 0x20, 0x20, 0x83, 0x6e, 0x55, 0xab, 0x30, 0x3b, + 0x93, 0xd9, 0x4f, 0xcf, 0x28, 0x08, 0x57, 0x95, 0x6c, 0x3f, 0xc0, 0xf4, + 0x6c, 0xa0, 0x60, 0x03, 0x33, 0x8a, 0x43, 0x30, 0x31, 0x0d, 0x33, 0x33, + 0x81, 0x02, 0x6b, 0x05, 0x01, 0x13, 0x41, 0x15, 0x66, 0x02, 0x66, 0x67, + 0x02, 0x9d, 0x6e, 0x95, 0x20, 0x08, 0x98, 0x0e, 0xd4, 0xfa, 0xc2, 0x4c, + 0x80, 0xc9, 0xd6, 0x34, 0x0a, 0x8a, 0x55, 0xad, 0x56, 0x81, 0x80, 0x19, + 0x73, 0xb7, 0xd5, 0xf9, 0x98, 0x99, 0x51, 0x30, 0xad, 0xd9, 0x19, 0x98, + 0x0d, 0xaa, 0x2c, 0x54, 0xd5, 0xfe, 0xa0, 0x0a, 0x0b, 0x0b, 0x30, 0x11, + 0x54, 0x99, 0xd0, 0x71, 0x02, 0x9d, 0xe7, 0x9f, 0x8f, 0xe0, 0xb5, 0x87, + 0x8e, 0xb0, 0x50, 0xd5, 0xa0, 0xac, 0x40, 0x85, 0x2f, 0xe8, 0x44, 0x17, + 0x02, 0x05, 0x01, 0x53, 0xeb, 0x01, 0xd3, 0x0b, 0xda, 0x9f, 0x39, 0x0e, + 0x13, 0x10, 0x2c, 0x64, 0x4b, 0x4c, 0x1e, 0x03, 0x65, 0x0f, 0xc0, 0x84, + 0x82, 0x92, 0x2d, 0x04, 0x2a, 0xe1, 0x2a, 0x10, 0x4c, 0xe8, 0xe5, 0x82, + 0x3a, 0xce, 0xb3, 0x81, 0x3a, 0x66, 0xef, 0xfc, 0x43, 0x15, 0xe5, 0xad, + 0xfa, 0x5f, 0xde, 0xaf, 0x81, 0x83, 0x4d, 0x54, 0xab, 0xcc, 0x10, 0x60, + 0x6f, 0xd0, 0x6f, 0x96, 0x1f, 0xbf, 0xa3, 0x24, 0xba, 0xa1, 0x53, 0xdf, + 0x8e, 0x4a, 0x62, 0x53, 0x3e, 0xac, 0x8a, 0x48, 0xc7, 0x2d, 0x65, 0x7e, + 0x5c, 0x31, 0x07, 0xa2, 0x92, 0x32, 0x49, 0xc7, 0x86, 0x2c, 0xcb, 0xe9, + 0x1b, 0x8b, 0x49, 0x74, 0x9f, 0xb1, 0x94, 0x0a, 0xac, 0xd5, 0x37, 0xbe, + 0x91, 0xdf, 0x1e, 0xb6, 0xfe, 0x46, 0xa9, 0x77, 0xbc, 0x45, 0x8f, 0x55, + 0x65, 0x25, 0x13, 0x40, 0x5b, 0xd5, 0x3a, 0x25, 0x81, 0xd0, 0x10, 0x3f, + 0xc7, 0x71, 0x29, 0x97, 0x04, 0xed, 0x8e, 0x1e, 0xdf, 0xea, 0x48, 0x64, + 0x47, 0xe2, 0x79, 0x1e, 0xc9, 0xa5, 0x98, 0xb9, 0xa7, 0x1f, 0xc6, 0xa9, + 0x3a, 0x44, 0x81, 0xaa, 0x4b, 0xab, 0x3b, 0xaa, 0xb8, 0x4e, 0xcf, 0x07, + 0x56, 0x06, 0xf4, 0x9b, 0xe5, 0xc7, 0xb9, 0xda, 0xea, 0xdb, 0x49, 0x94, + 0x7b, 0xd0, 0xa9, 0x63, 0x80, 0xc6, 0xd4, 0x23, 0x3b, 0x30, 0xd6, 0x92, + 0x34, 0x2a, 0x42, 0xd5, 0x89, 0x25, 0x13, 0x3e, 0x78, 0x2c, 0x09, 0x20, + 0x41, 0xb0, 0x24, 0xc0, 0xd5, 0x85, 0x54, 0x78, 0x1b, 0x25, 0x03, 0xc4, + 0x3a, 0x72, 0x9f, 0xc3, 0xa1, 0xfb, 0x23, 0xda, 0xb4, 0x41, 0xc2, 0x7d, + 0x1a, 0x3c, 0xb5, 0xab, 0x04, 0xb1, 0xa9, 0xbf, 0x3b, 0x70, 0xdf, 0x6f, + 0x84, 0x1c, 0xb9, 0x01, 0xd8, 0xef, 0x72, 0xe8, 0xfe, 0x10, 0x3a, 0x30, + 0x55, 0x82, 0x45, 0x54, 0x9b, 0x44, 0xdd, 0xc9, 0x14, 0xc4, 0x2b, 0x34, + 0xfe, 0x3b, 0x10, 0x22, 0x11, 0xfa, 0x08, 0xc7, 0xba, 0x0e, 0x8f, 0x3b, + 0x70, 0x44, 0xc0, 0x61, 0x24, 0xbb, 0x4a, 0x82, 0xb3, 0x1a, 0x4e, 0x75, + 0xff, 0x18, 0xf0, 0x0e, 0x97, 0x43, 0xf7, 0xab, 0x63, 0xd4, 0xd0, 0xf6, + 0x79, 0xa0, 0xd6, 0x91, 0x12, 0x7c, 0x1c, 0x05, 0xd2, 0xca, 0x80, 0x5a, + 0xe4, 0xec, 0xdb, 0xb4, 0x81, 0x23, 0x52, 0x81, 0xb3, 0xa6, 0x24, 0xcc, + 0x69, 0x9b, 0xfb, 0xc7, 0x14, 0xac, 0xeb, 0x3e, 0x7d, 0x0d, 0x2c, 0xa3, + 0x40, 0x62, 0xbd, 0xa3, 0xd3, 0xf7, 0xe9, 0xe5, 0x43, 0xf7, 0xd9, 0x1c, + 0xba, 0x3f, 0xd6, 0x60, 0x2d, 0x78, 0x40, 0xc3, 0xe7, 0x5c, 0x54, 0x7b, + 0x23, 0x3d, 0x36, 0x4b, 0x0a, 0x04, 0xc6, 0x3b, 0x5c, 0xde, 0xf9, 0x51, + 0xbf, 0x6f, 0x9c, 0x8b, 0xbf, 0xb4, 0xe1, 0x17, 0x63, 0xbe, 0xb1, 0xf2, + 0x75, 0x76, 0xee, 0xdd, 0xc7, 0xc5, 0x8b, 0x17, 0x01, 0x05, 0x6a, 0xba, + 0xea, 0x2d, 0x5b, 0xd8, 0xe2, 0x5e, 0x95, 0xc2, 0xa8, 0x8c, 0x0c, 0xbc, + 0xc9, 0x80, 0xa0, 0xe6, 0xe7, 0x55, 0xdb, 0xa1, 0x17, 0x0a, 0x65, 0x80, + 0x50, 0x06, 0xfe, 0xb4, 0xc5, 0xbd, 0x8a, 0xab, 0xe8, 0x86, 0x66, 0xf5, + 0xfa, 0x34, 0xe9, 0x9a, 0x38, 0x2b, 0x39, 0x18, 0xd5, 0xab, 0xaf, 0xbd, + 0xce, 0x35, 0xd7, 0x5c, 0xc3, 0xeb, 0xe1, 0xab, 0x5d, 0x10, 0x2a, 0x93, + 0xe6, 0xa0, 0xbc, 0x76, 0xc1, 0xb3, 0xbe, 0x03, 0x3e, 0x5f, 0x0f, 0x5f, + 0xed, 0xf2, 0x97, 0x8f, 0xf7, 0xca, 0x2b, 0xaf, 0x30, 0x39, 0x39, 0xf9, + 0x3d, 0x39, 0xa6, 0xdf, 0x58, 0xf9, 0xba, 0xba, 0x0c, 0xff, 0x32, 0x37, + 0xa6, 0x99, 0xab, 0xc3, 0x1d, 0xc7, 0xa5, 0x71, 0xb2, 0x81, 0xb7, 0xb5, + 0x8a, 0x8c, 0x7c, 0xf0, 0x6c, 0x92, 0x56, 0x80, 0x4b, 0x8d, 0xf2, 0x48, + 0x99, 0xf6, 0x5a, 0x9b, 0xf2, 0x88, 0x4b, 0xd2, 0xe9, 0x6e, 0xb3, 0xd5, + 0x76, 0xd4, 0xb1, 0x7f, 0x9a, 0x14, 0xc2, 0x9f, 0x24, 0x21, 0x72, 0x4d, + 0x62, 0x5b, 0x36, 0x62, 0x44, 0xe0, 0x9f, 0xf3, 0x49, 0x92, 0x36, 0xfe, + 0x19, 0x1f, 0x77, 0x47, 0x99, 0x28, 0x52, 0xe0, 0x5a, 0x27, 0x6d, 0xcf, + 0x38, 0xf8, 0xda, 0x67, 0xad, 0xea, 0x21, 0xf6, 0x5a, 0x29, 0x2c, 0x2b, + 0x4e, 0x62, 0xe4, 0x5a, 0x42, 0xd8, 0x6a, 0x53, 0xdb, 0xed, 0xe1, 0x37, + 0x97, 0x68, 0xaf, 0x49, 0xfc, 0x95, 0xb3, 0xd8, 0x3b, 0x6c, 0xe2, 0xa8, + 0x8c, 0x7f, 0x7e, 0x19, 0x57, 0xb7, 0xa5, 0xdd, 0x11, 0x0b, 0x7f, 0x15, + 0x44, 0x12, 0x12, 0xb6, 0x14, 0x44, 0x4b, 0xb6, 0x7c, 0x9c, 0x9d, 0x1e, + 0x61, 0xe2, 0xd3, 0xee, 0xa8, 0x7e, 0x53, 0x77, 0xbb, 0x20, 0xbc, 0x14, + 0x63, 0x8f, 0xd8, 0xb4, 0x65, 0x1b, 0x51, 0x6a, 0xa7, 0x63, 0x86, 0xb2, + 0x23, 0x09, 0x57, 0xe3, 0x34, 0x7d, 0x46, 0xac, 0xb4, 0xfe, 0x3a, 0x1b, + 0xb5, 0x99, 0xda, 0xab, 0xfa, 0x3c, 0x6a, 0x89, 0xfe, 0x40, 0xc3, 0x85, + 0x65, 0xa4, 0x80, 0x27, 0x8e, 0xcf, 0xb3, 0x4b, 0x7f, 0x68, 0xa1, 0x5c, + 0x6a, 0x67, 0x2d, 0xef, 0x92, 0xaa, 0xab, 0x7b, 0xef, 0x65, 0x8d, 0x28, + 0x61, 0xff, 0xf5, 0x35, 0x05, 0x6e, 0xb7, 0x34, 0xd4, 0x2b, 0xd6, 0x6d, + 0x5c, 0x21, 0x06, 0x36, 0x1e, 0xdb, 0x6f, 0x76, 0xb3, 0x3a, 0x59, 0x4b, + 0xae, 0x25, 0x34, 0x13, 0x18, 0xaf, 0x79, 0xc4, 0xaf, 0x27, 0xb8, 0x95, + 0x36, 0x4b, 0xf9, 0x3a, 0xbc, 0xd2, 0x4a, 0xaf, 0xe9, 0x17, 0xbe, 0xf4, + 0x25, 0xee, 0xec, 0x77, 0xdb, 0x05, 0x7a, 0xea, 0x85, 0x3e, 0xf5, 0xda, + 0xe5, 0x95, 0x87, 0x49, 0xe5, 0xe1, 0x51, 0x57, 0xfd, 0xf8, 0x4f, 0xf2, + 0x37, 0x2f, 0xff, 0x55, 0x17, 0xf0, 0xaa, 0x17, 0x36, 0x95, 0x4f, 0x63, + 0xd4, 0xd9, 0xc1, 0xab, 0x5f, 0xfb, 0x4a, 0x17, 0x08, 0x6b, 0xe9, 0x8b, + 0x2f, 0x03, 0xf4, 0x01, 0xb5, 0x7a, 0xd3, 0x36, 0xf1, 0x7a, 0x65, 0xe0, + 0x59, 0x7f, 0xf3, 0xf2, 0x5f, 0xf5, 0xc5, 0x7b, 0xfb, 0x75, 0x3f, 0xcb, + 0x7b, 0xfe, 0x47, 0x8b, 0xda, 0x9e, 0x1f, 0xa3, 0xb9, 0xfc, 0x77, 0x00, + 0xe9, 0xfa, 0xa0, 0xb2, 0xf7, 0x96, 0xbb, 0xf7, 0x78, 0xf5, 0xfa, 0xe7, + 0xff, 0x67, 0xef, 0xee, 0x83, 0xe4, 0x38, 0x0f, 0xfb, 0xce, 0xff, 0x86, + 0x19, 0x5d, 0x7a, 0x4e, 0x4b, 0xab, 0xa7, 0x6a, 0x79, 0x9e, 0x21, 0xc1, + 0xe3, 0xcc, 0x1d, 0x28, 0x62, 0x50, 0x60, 0xc4, 0x45, 0x28, 0x15, 0x81, + 0x22, 0x5d, 0x0b, 0x28, 0xca, 0x49, 0x94, 0x5f, 0x8e, 0xa4, 0x94, 0xd8, + 0x92, 0x5d, 0xb7, 0xf6, 0xa9, 0x2e, 0x89, 0x08, 0xbf, 0xa4, 0xac, 0x9c, + 0xaf, 0xce, 0x94, 0x0f, 0x3e, 0xc9, 0x55, 0xe7, 0x92, 0x55, 0x7e, 0x21, + 0xa9, 0x9c, 0x1d, 0x49, 0x46, 0x55, 0x44, 0xc9, 0x0e, 0x0d, 0xaa, 0x12, + 0x45, 0xa0, 0x22, 0xc9, 0x20, 0x4e, 0xd4, 0x01, 0xaa, 0x90, 0xc1, 0xd2, + 0x11, 0x8a, 0x03, 0x8a, 0x38, 0xcd, 0x28, 0x04, 0x35, 0x13, 0x63, 0xab, + 0xba, 0x2d, 0xae, 0x33, 0x8f, 0xcf, 0x73, 0x99, 0xfb, 0xe3, 0xe9, 0xa7, + 0xe7, 0x99, 0xde, 0x9e, 0x97, 0x5d, 0xec, 0x0b, 0x80, 0xfd, 0x7e, 0xaa, + 0xb6, 0xa6, 0xe7, 0x79, 0xba, 0x9f, 0x7e, 0xa6, 0x67, 0xfb, 0x65, 0x66, + 0xba, 0x7f, 0xad, 0xb7, 0x4d, 0xa8, 0x5b, 0xdb, 0x7f, 0x17, 0xe4, 0xa5, + 0x24, 0xe8, 0x55, 0xb5, 0x76, 0x72, 0xac, 0xd9, 0xb6, 0x07, 0x90, 0xb5, + 0xe4, 0xf1, 0xb8, 0xec, 0x41, 0x5f, 0x32, 0xfc, 0xcd, 0xef, 0x7c, 0x47, + 0x6f, 0xd6, 0x1d, 0x23, 0xeb, 0x34, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x60, 0x76, 0x84, 0x6a, 0x01, 0x00, 0x70, 0x0d, + 0x0a, 0x43, 0xff, 0x24, 0xc7, 0x58, 0xa1, 0xa4, 0x20, 0x28, 0xc9, 0x18, + 0x2f, 0x4c, 0xcb, 0xe9, 0xbb, 0xa0, 0xa1, 0xb2, 0xa2, 0xd8, 0x28, 0x98, + 0x93, 0x4a, 0x81, 0xbb, 0x5b, 0x70, 0xa0, 0xc0, 0x3f, 0xb1, 0x7d, 0x64, + 0x3a, 0x29, 0x8e, 0x23, 0x85, 0x61, 0x39, 0x0d, 0xf5, 0x1a, 0x8e, 0x63, + 0x43, 0x48, 0xa2, 0x95, 0xe1, 0xc5, 0x26, 0xd5, 0x3d, 0x55, 0x95, 0xe7, + 0x42, 0xa9, 0x67, 0xec, 0xed, 0x90, 0x93, 0x53, 0x8d, 0xcb, 0x73, 0x65, + 0x69, 0x8f, 0x0d, 0x7a, 0x8a, 0xe3, 0xc8, 0xf6, 0x75, 0x2e, 0xc8, 0x84, + 0x68, 0x79, 0x01, 0x60, 0xc9, 0x45, 0x3c, 0x41, 0x18, 0x26, 0x77, 0x8e, + 0x36, 0x36, 0xe4, 0x4b, 0xee, 0x9c, 0xc1, 0x24, 0xbc, 0xa6, 0xef, 0x85, + 0x6b, 0x49, 0xaa, 0x26, 0x21, 0x60, 0xa5, 0xb0, 0xac, 0x7a, 0xbd, 0xe6, + 0xbd, 0x10, 0x3b, 0xdc, 0x6a, 0xb5, 0x55, 0x91, 0xd4, 0x4d, 0xda, 0x3f, + 0xf4, 0xf6, 0x43, 0xe9, 0xc5, 0xde, 0x41, 0xbf, 0x37, 0x6c, 0x67, 0x4f, + 0x5d, 0xc1, 0x9c, 0xbd, 0x4b, 0x7b, 0xbc, 0x12, 0x49, 0xa1, 0xed, 0x4b, + 0x2f, 0xce, 0x09, 0x18, 0x48, 0x97, 0x6d, 0x30, 0x7a, 0xf5, 0xd9, 0x55, + 0xa8, 0xef, 0x09, 0x15, 0xc7, 0x46, 0xa5, 0x24, 0x6c, 0xa8, 0xe7, 0x1d, + 0x8d, 0x19, 0x63, 0x14, 0xcc, 0xe7, 0x04, 0x46, 0xcd, 0x27, 0xc1, 0x4f, + 0xc9, 0x49, 0x9e, 0x79, 0xf7, 0xbc, 0x37, 0x49, 0xa0, 0x54, 0xa7, 0x6b, + 0xa4, 0xe2, 0x30, 0x1c, 0xaa, 0x5e, 0x09, 0xa4, 0x62, 0x29, 0x0d, 0x12, + 0x2b, 0xb9, 0x40, 0xa5, 0xe4, 0x76, 0xd2, 0x91, 0x31, 0x0a, 0xe7, 0xc3, + 0x35, 0x17, 0xf2, 0xd7, 0x93, 0x0b, 0xbf, 0xf2, 0xfa, 0x1a, 0x27, 0x17, + 0xd1, 0xe4, 0x05, 0x58, 0x55, 0xe7, 0xc3, 0xb4, 0x9f, 0xe9, 0x49, 0xa0, + 0x7e, 0x50, 0xd5, 0x94, 0x60, 0x2c, 0xc9, 0x0b, 0xfe, 0x72, 0x27, 0x9d, + 0x16, 0x83, 0xb5, 0xd3, 0x79, 0xb7, 0xc3, 0xae, 0x56, 0x42, 0x45, 0x66, + 0x4c, 0xa0, 0x96, 0x89, 0x73, 0xfb, 0x3a, 0xb2, 0x4c, 0x73, 0xfa, 0xe9, + 0x8c, 0x0b, 0x1b, 0x93, 0xe4, 0x6e, 0x52, 0x3f, 0xd6, 0xb4, 0xa0, 0xac, + 0x69, 0x21, 0x5a, 0xeb, 0x99, 0x26, 0x08, 0x02, 0x75, 0x57, 0x86, 0x17, + 0xa9, 0xf9, 0x17, 0x2a, 0xe4, 0x85, 0x68, 0x95, 0x82, 0x92, 0x7a, 0xa6, + 0x97, 0x3e, 0xce, 0xc2, 0x8d, 0x6b, 0x92, 0x0b, 0x33, 0xc6, 0x72, 0x41, + 0x5a, 0x1b, 0xfc, 0xa4, 0x31, 0xb5, 0x6d, 0x69, 0x6a, 0xc0, 0xca, 0x9a, + 0x36, 0xc6, 0xf4, 0xa5, 0xb7, 0xda, 0x53, 0x69, 0x2e, 0x67, 0x8d, 0x5a, + 0x6f, 0x18, 0x98, 0x27, 0x5a, 0xb1, 0x27, 0x67, 0xe7, 0x95, 0x4d, 0xaa, + 0x9b, 0x75, 0xfc, 0xed, 0x98, 0xc7, 0x4e, 0x8e, 0x7f, 0x35, 0xaf, 0x35, + 0x5a, 0x89, 0x54, 0x0a, 0x86, 0xef, 0xa7, 0x1f, 0xa6, 0xe5, 0x07, 0x3e, + 0xe6, 0xf1, 0xef, 0x74, 0x3d, 0xc9, 0xff, 0x99, 0x3c, 0x0e, 0x06, 0xf9, + 0x61, 0x5a, 0xc3, 0xb2, 0x3b, 0xf5, 0x9e, 0xf7, 0x48, 0x8f, 0xff, 0xc2, + 0xe3, 0x7a, 0xf6, 0xd9, 0xd1, 0x36, 0x2e, 0xd9, 0xcc, 0x2c, 0x3d, 0xfb, + 0xac, 0xf4, 0xec, 0xe3, 0x8f, 0x4b, 0x92, 0xde, 0xe3, 0x95, 0x3d, 0x9e, + 0x8c, 0x97, 0x9d, 0xfe, 0xd4, 0xab, 0xaf, 0x4e, 0xed, 0xdf, 0x76, 0x18, + 0xb8, 0xce, 0x5e, 0x47, 0x0a, 0xcf, 0x3e, 0x3b, 0x5c, 0xc8, 0xeb, 0x64, + 0x1e, 0xff, 0x90, 0x3e, 0xb2, 0xc9, 0xfd, 0x19, 0x69, 0xdf, 0xbf, 0x62, + 0x62, 0xdc, 0x76, 0x67, 0x75, 0xb6, 0x70, 0xcf, 0x5d, 0x3b, 0xbe, 0x6f, + 0x23, 0xdb, 0xee, 0x7d, 0x49, 0x30, 0xe2, 0xc5, 0x65, 0x29, 0x72, 0x57, + 0xdf, 0x97, 0xa5, 0xe7, 0x4f, 0xdb, 0x60, 0xad, 0x4b, 0x2f, 0x6f, 0xb4, + 0x37, 0x53, 0xb5, 0x9e, 0xdb, 0xc0, 0x01, 0xe6, 0xd9, 0xa7, 0x24, 0x25, + 0xc7, 0x8d, 0x41, 0x60, 0x03, 0xb5, 0x1c, 0x3f, 0x58, 0xcb, 0x79, 0xfa, + 0xf3, 0xd2, 0xfb, 0x3f, 0x60, 0x87, 0x5f, 0x38, 0xa7, 0x6b, 0xcd, 0x27, + 0xc6, 0x55, 0x1c, 0x39, 0x22, 0x3d, 0xdb, 0x1b, 0x86, 0x6a, 0x6d, 0xc6, + 0xeb, 0xb8, 0xb3, 0xac, 0xd2, 0xdd, 0xc9, 0xf2, 0x32, 0xc6, 0x0e, 0x7f, + 0x7b, 0x78, 0x71, 0x58, 0x39, 0x28, 0x4b, 0x6f, 0x0a, 0x54, 0xbf, 0xbd, + 0xaa, 0xe4, 0x23, 0x85, 0xea, 0xb7, 0x57, 0xd5, 0x59, 0x35, 0x3a, 0x34, + 0x57, 0x55, 0xeb, 0xb5, 0xe1, 0xb8, 0xf5, 0xf9, 0x40, 0xf5, 0x3b, 0xeb, + 0x52, 0xd4, 0x93, 0x82, 0x92, 0xea, 0xa5, 0xb2, 0xd4, 0x93, 0x7d, 0x94, + 0xd4, 0x7a, 0xd5, 0xfb, 0x1c, 0x15, 0x86, 0xaa, 0xd6, 0x92, 0xe0, 0x99, + 0xb8, 0x33, 0x76, 0x58, 0xb2, 0xc7, 0x72, 0xc1, 0x3d, 0x65, 0x05, 0x8b, + 0x99, 0xc0, 0xd4, 0x38, 0x4e, 0xcb, 0xcc, 0x99, 0xe1, 0xfb, 0x5b, 0x0e, + 0x43, 0xd5, 0x6b, 0x0b, 0xc9, 0x28, 0x81, 0xea, 0xb5, 0x85, 0x91, 0x47, + 0x17, 0xd8, 0x6c, 0x5f, 0x4b, 0xa8, 0x85, 0x40, 0x72, 0x87, 0xda, 0x6b, + 0x86, 0xa3, 0x58, 0xad, 0x24, 0x70, 0xb8, 0x3c, 0x17, 0xaa, 0xba, 0xa7, + 0x21, 0x13, 0xdb, 0xd7, 0x5c, 0xde, 0xd3, 0x48, 0xfa, 0x28, 0xdb, 0xe7, + 0xd8, 0x2d, 0x0b, 0xdb, 0xe7, 0xf2, 0xcf, 0xb8, 0xd7, 0x11, 0xab, 0xe4, + 0xfa, 0x1e, 0xc7, 0xd2, 0x7d, 0xde, 0x70, 0xb2, 0xfc, 0x0e, 0x25, 0x41, + 0x3e, 0x9d, 0x15, 0xa3, 0x43, 0xb7, 0x2f, 0x48, 0x46, 0xe9, 0x32, 0xee, + 0xac, 0x9a, 0x91, 0x64, 0x91, 0x43, 0xfb, 0x92, 0xf7, 0x2b, 0x36, 0xaa, + 0xcf, 0xdb, 0x24, 0x93, 0x9e, 0x59, 0x1b, 0xcc, 0x80, 0xdd, 0x6b, 0xff, + 0xdb, 0x1b, 0x3a, 0xfb, 0x85, 0x53, 0x3a, 0xfc, 0x53, 0x36, 0x38, 0xaa, + 0x7e, 0x7b, 0x5d, 0xa7, 0x5f, 0x6a, 0xab, 0x3c, 0x17, 0x28, 0x9c, 0x0f, + 0xd3, 0x8b, 0xcd, 0x25, 0x1b, 0x7d, 0x12, 0x7f, 0xc2, 0x86, 0x41, 0xd5, + 0xbd, 0x80, 0xef, 0x78, 0x35, 0x52, 0x14, 0xc7, 0x3a, 0x54, 0x2b, 0x4b, + 0x66, 0x6d, 0x9b, 0x8d, 0x9a, 0x74, 0xf2, 0xf9, 0x48, 0xd5, 0xf9, 0xb2, + 0xca, 0xa1, 0xfd, 0x3f, 0x0c, 0x6e, 0x96, 0x3a, 0x17, 0x9b, 0x0a, 0x7e, + 0xf1, 0x29, 0x55, 0xf7, 0x35, 0xd4, 0xb8, 0x7b, 0x7f, 0x3a, 0x9f, 0x4e, + 0xa7, 0xa3, 0xee, 0xe5, 0x8e, 0x8e, 0xfe, 0x58, 0x72, 0x6c, 0xb9, 0xda, + 0x54, 0xe3, 0x5d, 0xfb, 0x75, 0xfa, 0xf1, 0x93, 0x3a, 0xfa, 0xf3, 0x8f, + 0xa8, 0x71, 0x4f, 0x5d, 0xd5, 0x7e, 0x4b, 0x9f, 0xfc, 0xed, 0x8e, 0x2a, + 0x7b, 0x6c, 0x70, 0x95, 0x24, 0x55, 0x2a, 0xa1, 0x96, 0xbf, 0x7e, 0x5a, + 0x9d, 0xff, 0xe1, 0x33, 0xaa, 0x1e, 0x38, 0xa8, 0x4a, 0x25, 0x4c, 0xeb, + 0x3a, 0x9d, 0x96, 0x1a, 0xef, 0xb2, 0xf3, 0x68, 0x1c, 0xa8, 0x6b, 0xf9, + 0xd9, 0xf3, 0x23, 0xd3, 0x1e, 0xbd, 0x5f, 0x7a, 0xea, 0xe9, 0x8e, 0x16, + 0x8e, 0x34, 0xd6, 0x7c, 0x77, 0x51, 0x95, 0x5b, 0x67, 0xbc, 0x36, 0xe7, + 0xa5, 0xce, 0xb7, 0x5b, 0xfa, 0xe0, 0xfb, 0xab, 0x32, 0x45, 0xe9, 0xd4, + 0x4b, 0xd2, 0x2f, 0xff, 0xbc, 0x5d, 0x8f, 0x3b, 0x92, 0x8e, 0x26, 0xa1, + 0x58, 0x4f, 0x3d, 0xdd, 0x51, 0xe3, 0x5d, 0xfb, 0xb5, 0xb0, 0x57, 0x3a, + 0xfd, 0xa5, 0xaa, 0xba, 0x97, 0x3b, 0xaa, 0x2a, 0x52, 0xe7, 0xa2, 0x51, + 0xe3, 0xfe, 0xa3, 0x5e, 0xff, 0x3a, 0x8a, 0x57, 0x3a, 0x7a, 0xf8, 0xa1, + 0x50, 0xb1, 0xa4, 0x73, 0x17, 0x93, 0x65, 0x71, 0xb1, 0xa9, 0xc3, 0x3f, + 0x6b, 0x97, 0xe3, 0xa1, 0x9a, 0xf4, 0x99, 0x74, 0x39, 0x0e, 0xf7, 0x5d, + 0x2f, 0x4b, 0x8a, 0x7f, 0xf5, 0x14, 0xbf, 0x54, 0x21, 0x15, 0x4b, 0x49, + 0x40, 0xd6, 0x30, 0x94, 0xaa, 0x23, 0x49, 0x5d, 0x1b, 0x2c, 0xd5, 0x91, + 0x6c, 0xa0, 0x56, 0x66, 0xba, 0x4e, 0x12, 0x9a, 0x95, 0xee, 0x46, 0x92, + 0xe7, 0x51, 0x14, 0xcb, 0x85, 0x1f, 0x29, 0x1d, 0xc7, 0xed, 0x4b, 0xeb, + 0x52, 0x57, 0xaa, 0x56, 0x16, 0x46, 0xca, 0xab, 0x15, 0x1b, 0x5c, 0x65, + 0xe7, 0x25, 0x9d, 0x7d, 0x4e, 0xaa, 0x1f, 0x59, 0xf0, 0xe6, 0x31, 0xdc, + 0x17, 0xbb, 0x71, 0x5d, 0x79, 0xdc, 0xed, 0xa8, 0x53, 0x0e, 0x47, 0xca, + 0xb3, 0xe3, 0xba, 0xb6, 0xf3, 0xfa, 0x1f, 0x4b, 0x7a, 0xb9, 0x69, 0xe7, + 0x5b, 0x2e, 0x87, 0x69, 0x00, 0x98, 0xdf, 0xb6, 0x92, 0x90, 0xb0, 0x46, + 0xa5, 0x9e, 0x04, 0x8f, 0xd5, 0xe5, 0x87, 0x6a, 0x65, 0x43, 0xb0, 0xb2, + 0x47, 0x9c, 0xf1, 0x37, 0x25, 0xdd, 0x3f, 0x5a, 0xe6, 0x02, 0xb5, 0xb2, + 0x81, 0x5c, 0x59, 0xd9, 0xe0, 0xad, 0x3c, 0x69, 0xfd, 0x94, 0xf5, 0xba, + 0x1a, 0xda, 0x20, 0x2d, 0xa7, 0x3e, 0x9f, 0xf7, 0x8d, 0xe7, 0x14, 0x6f, + 0x0c, 0x07, 0xd7, 0x7c, 0x67, 0x9e, 0x51, 0x99, 0x0b, 0xd2, 0xc0, 0x5d, + 0xc9, 0xa8, 0x92, 0x7c, 0xc7, 0xd8, 0x33, 0x36, 0xcd, 0xa3, 0x97, 0x4c, + 0x7f, 0xfa, 0xd9, 0xcf, 0xab, 0x13, 0x1b, 0x99, 0x7e, 0xa4, 0xb8, 0xef, + 0x7d, 0xc7, 0xe0, 0x7d, 0x4f, 0x3e, 0xae, 0xfc, 0x93, 0xff, 0xec, 0x53, + 0xf9, 0xe3, 0x7b, 0x41, 0x59, 0xad, 0x95, 0x8e, 0xaa, 0xd5, 0xcc, 0xf7, + 0x0f, 0x6f, 0x68, 0x5d, 0x5a, 0xad, 0xa6, 0xd4, 0x89, 0xa4, 0xaa, 0xd4, + 0xeb, 0x97, 0xf4, 0xf9, 0x17, 0x9f, 0x91, 0xfb, 0xc6, 0xb8, 0x93, 0x1c, + 0xe0, 0x45, 0x57, 0xec, 0xf7, 0x7d, 0x61, 0x51, 0x36, 0x2d, 0x55, 0x92, + 0xe6, 0xed, 0x0a, 0x12, 0x26, 0x79, 0x11, 0x71, 0x14, 0x29, 0xb8, 0xa5, + 0xaa, 0xea, 0xcd, 0x91, 0xcc, 0x1b, 0x1d, 0x7d, 0xe0, 0xc8, 0xc3, 0xfa, + 0xec, 0xb3, 0xcf, 0xd8, 0xfe, 0x4b, 0x3a, 0xf5, 0x82, 0x1d, 0x0e, 0xe7, + 0xdc, 0x3e, 0xd3, 0x28, 0x08, 0x92, 0x6b, 0xff, 0x93, 0xc5, 0x5d, 0xde, + 0x63, 0xa4, 0x0b, 0xb3, 0xf7, 0x3d, 0x50, 0x59, 0x61, 0x58, 0x4d, 0x82, + 0xb0, 0x3a, 0xf6, 0x7b, 0xec, 0xf4, 0x73, 0xdc, 0x11, 0x49, 0xcf, 0xc9, + 0xf4, 0xeb, 0x0a, 0x8a, 0xc9, 0xf7, 0xd5, 0xc5, 0x4a, 0xf2, 0x3b, 0x41, + 0x12, 0xa8, 0x55, 0x8c, 0x14, 0xa8, 0xaa, 0xf6, 0x65, 0x1b, 0x91, 0x12, + 0x14, 0x1b, 0xaa, 0xcc, 0xd7, 0xd5, 0xbe, 0xbc, 0x36, 0x70, 0x2b, 0x28, + 0x96, 0x73, 0x87, 0x93, 0x57, 0xaf, 0xe6, 0xe5, 0xe4, 0xf5, 0x05, 0x0d, + 0x05, 0x61, 0x28, 0x93, 0x0d, 0xfb, 0xf2, 0xf5, 0x87, 0x8f, 0x41, 0x51, + 0x32, 0xfd, 0xde, 0xf0, 0x31, 0xa9, 0x9a, 0xf4, 0x1f, 0x98, 0x0d, 0xcb, + 0x9a, 0x65, 0x9c, 0xfc, 0xf6, 0xd6, 0x96, 0x66, 0x43, 0xb1, 0x66, 0x35, + 0x71, 0xba, 0xcc, 0x77, 0xab, 0x79, 0xdf, 0xe5, 0x4f, 0x72, 0xa6, 0xed, + 0xc2, 0x9a, 0xda, 0x23, 0xe5, 0xb5, 0x5a, 0x12, 0xa6, 0xd5, 0xb6, 0x01, + 0x55, 0x4e, 0x5b, 0x6d, 0x9d, 0x38, 0x61, 0xc3, 0xa1, 0x5c, 0x60, 0xd6, + 0xf1, 0xe3, 0x35, 0x1d, 0x3f, 0xd1, 0xd6, 0xd2, 0x92, 0xd6, 0x58, 0x5c, + 0x5c, 0xd2, 0x89, 0x13, 0x27, 0xec, 0x70, 0x5b, 0xaa, 0x1d, 0x1f, 0xd6, + 0x2d, 0x1d, 0xb7, 0x81, 0x53, 0x67, 0x4e, 0x48, 0x5a, 0xb2, 0x41, 0x5c, + 0x4b, 0xc7, 0x5d, 0xbf, 0x6c, 0xb9, 0x0b, 0xe9, 0x72, 0x61, 0x5c, 0xae, + 0x5f, 0x8b, 0x4b, 0x52, 0xbb, 0xdd, 0x56, 0xad, 0x66, 0x43, 0xb6, 0x24, + 0xa9, 0x76, 0xbc, 0xa6, 0xb6, 0xda, 0x3a, 0xde, 0x6e, 0x4b, 0x67, 0xa4, + 0xa5, 0x9a, 0x74, 0xa6, 0xd6, 0x56, 0x4d, 0x35, 0x2d, 0x1d, 0xb7, 0x41, + 0x60, 0x4b, 0xc7, 0xed, 0x74, 0x8b, 0x49, 0xe7, 0xcf, 0x48, 0xfa, 0xf1, + 0xee, 0xf0, 0xb5, 0xff, 0xf8, 0x92, 0xf4, 0x70, 0xf2, 0xba, 0x16, 0x6b, + 0x35, 0xd5, 0x96, 0x86, 0x75, 0xc7, 0x4f, 0xd8, 0xe1, 0xa5, 0x25, 0x1b, + 0xa8, 0x55, 0x93, 0x1f, 0x38, 0xa6, 0xb4, 0x23, 0x27, 0xdc, 0xb2, 0x3a, + 0x93, 0x2c, 0xd5, 0x64, 0x9c, 0x33, 0xb5, 0x9a, 0xce, 0xa8, 0xad, 0x45, + 0xef, 0xf5, 0x0f, 0x17, 0x86, 0x74, 0x3c, 0x99, 0xbe, 0xdd, 0x96, 0xde, + 0xe7, 0x55, 0x1d, 0xff, 0xb5, 0x24, 0x48, 0xac, 0xbd, 0x36, 0x04, 0x6d, + 0x69, 0x51, 0xfa, 0xb3, 0x69, 0x81, 0x8a, 0x7e, 0x60, 0x88, 0xbb, 0x59, + 0xc9, 0x46, 0xc3, 0xa6, 0xb2, 0x6d, 0x65, 0xad, 0xf9, 0xae, 0x3f, 0x98, + 0x9e, 0xcb, 0x2c, 0xbb, 0x5f, 0x08, 0xc3, 0x61, 0xb8, 0xb6, 0xbb, 0x69, + 0x49, 0x1c, 0xbb, 0x83, 0x05, 0x2f, 0x80, 0xcb, 0x85, 0x52, 0x4d, 0xeb, + 0xdf, 0x56, 0xf1, 0xdb, 0x1f, 0x09, 0x29, 0x93, 0x4c, 0x51, 0x72, 0xf1, + 0x5a, 0x66, 0x35, 0x92, 0xe6, 0xca, 0x0a, 0xfa, 0x3d, 0x99, 0x38, 0x52, + 0xaf, 0x6f, 0x54, 0xaf, 0x35, 0xd4, 0xed, 0x76, 0x54, 0xdf, 0x53, 0x57, + 0x10, 0xd8, 0xb0, 0x31, 0x13, 0x45, 0x8a, 0x4c, 0xac, 0x07, 0xdf, 0xfd, + 0x61, 0x45, 0xab, 0x5d, 0x3d, 0x78, 0x64, 0x41, 0x9f, 0xfd, 0xc3, 0x8f, + 0xaa, 0x7d, 0xa9, 0xad, 0xf6, 0xa5, 0xb6, 0x0e, 0xdd, 0xff, 0x01, 0x9d, + 0xfb, 0xe6, 0xe7, 0x25, 0x49, 0x0f, 0x17, 0x6b, 0x33, 0x75, 0x31, 0x28, + 0xf6, 0x24, 0x95, 0x6c, 0x4f, 0x8a, 0xd2, 0xb9, 0xbe, 0xdd, 0xc7, 0xc4, + 0xc9, 0xf6, 0xf1, 0x9c, 0xa4, 0x30, 0xe9, 0x6f, 0xd8, 0x37, 0xc9, 0x78, + 0xc1, 0xd8, 0xfd, 0x73, 0x28, 0x23, 0x63, 0x02, 0x75, 0x02, 0x69, 0xd9, + 0x98, 0xf4, 0xd8, 0xc8, 0xc5, 0x3f, 0xc6, 0x7d, 0xa9, 0x27, 0xa3, 0x50, + 0x3d, 0x7d, 0x42, 0xd2, 0x67, 0x8b, 0xe9, 0x11, 0x9d, 0x5e, 0xf6, 0xbe, + 0xff, 0x7b, 0xb0, 0x68, 0xe7, 0xfd, 0x1b, 0x2f, 0x06, 0xea, 0x7c, 0xb3, + 0x63, 0x23, 0x13, 0x8b, 0xd2, 0xa9, 0xbe, 0xd4, 0x90, 0xfd, 0xdf, 0xb4, + 0x47, 0x4a, 0xc9, 0xbe, 0x4c, 0xc3, 0x58, 0xc5, 0x27, 0xee, 0x93, 0x3e, + 0xf2, 0xad, 0x24, 0x34, 0x4b, 0x36, 0xb0, 0xaa, 0xde, 0x97, 0x92, 0x78, + 0x49, 0x75, 0xbc, 0xf6, 0x8f, 0x3d, 0x2f, 0xe9, 0x85, 0x8e, 0x4a, 0x2a, + 0xa5, 0xaf, 0xdb, 0x05, 0x6a, 0xb9, 0xc7, 0x63, 0x7d, 0xa5, 0xfb, 0x89, + 0x0f, 0xfe, 0xaf, 0xa1, 0xfe, 0xc7, 0xe7, 0x63, 0x1d, 0x3b, 0x27, 0x2d, + 0x24, 0x7d, 0x8f, 0xfb, 0x25, 0x7d, 0x46, 0x3d, 0x3d, 0x39, 0x57, 0x92, + 0xfa, 0x3d, 0x3d, 0xe5, 0xfd, 0xce, 0x79, 0xec, 0x79, 0xef, 0x35, 0x49, + 0x6a, 0x07, 0x52, 0xab, 0x6f, 0x97, 0xc7, 0x72, 0xdf, 0x7e, 0x6f, 0xe3, + 0x82, 0xbc, 0xa2, 0xbe, 0xfd, 0x85, 0xbe, 0x5c, 0x94, 0x3e, 0x2b, 0x69, + 0xbf, 0x92, 0x63, 0xe4, 0xe2, 0xda, 0x65, 0x73, 0x2a, 0x09, 0xd6, 0x8a, + 0x9e, 0x9f, 0xb0, 0x8f, 0x4b, 0xb8, 0xa0, 0x26, 0x69, 0x18, 0xf2, 0x24, + 0x69, 0x24, 0xfc, 0xe9, 0x8d, 0xce, 0xf7, 0xd3, 0x20, 0xaa, 0xbb, 0xee, + 0xba, 0x2b, 0x0d, 0x81, 0xf2, 0x83, 0xa2, 0x5e, 0x79, 0xe5, 0x15, 0x49, + 0xd2, 0xd1, 0x7b, 0x6f, 0x4b, 0xdb, 0xfc, 0xfe, 0x0f, 0xde, 0xd0, 0x5d, + 0xd5, 0x61, 0x28, 0x94, 0xdf, 0x9e, 0xcf, 0x05, 0x5c, 0x65, 0xc7, 0x7b, + 0xe5, 0x95, 0x57, 0xa4, 0x82, 0x0d, 0x8e, 0x3a, 0x9d, 0xcc, 0x33, 0xed, + 0x47, 0xd5, 0xd6, 0xdf, 0x55, 0x1d, 0xf6, 0xd5, 0xb5, 0xeb, 0x87, 0x66, + 0x6d, 0x76, 0x9b, 0x7e, 0x99, 0x7b, 0xfd, 0x17, 0x5f, 0x7c, 0x41, 0xdf, + 0x7f, 0xe3, 0x0d, 0x1d, 0xbd, 0xf7, 0xb6, 0x9d, 0x5d, 0xa6, 0x85, 0x9b, + 0x35, 0x4d, 0xfd, 0x96, 0x9a, 0x1a, 0xf7, 0xd6, 0x55, 0xdd, 0x5b, 0xd2, + 0xe9, 0x2f, 0x9e, 0x55, 0xe3, 0xee, 0x05, 0x49, 0xa1, 0xc2, 0x30, 0x50, + 0x10, 0x8c, 0x86, 0x8d, 0x76, 0x2e, 0x75, 0xd4, 0xfc, 0x76, 0x53, 0x87, + 0x1f, 0x38, 0x2c, 0xb3, 0x32, 0x1a, 0x68, 0x1a, 0x24, 0xdf, 0xd7, 0x19, + 0xd3, 0xd5, 0xc1, 0xb7, 0x1f, 0x94, 0x31, 0x5d, 0x55, 0xf7, 0xda, 0xe3, + 0xd2, 0xa0, 0x1f, 0xa8, 0x3e, 0x5f, 0x55, 0x6b, 0xa5, 0xa3, 0x70, 0xd5, + 0x28, 0xbc, 0xa7, 0x22, 0x45, 0x46, 0xcb, 0x5f, 0x3b, 0xa7, 0xc6, 0x42, + 0xc3, 0x86, 0x68, 0x25, 0x37, 0xb8, 0xd2, 0x9c, 0x14, 0xcc, 0x87, 0x6a, + 0xcc, 0xdb, 0xdf, 0xd6, 0x17, 0x1e, 0x38, 0x2a, 0xd3, 0x97, 0xaa, 0x7b, + 0x87, 0xdf, 0xb7, 0x54, 0xe7, 0xab, 0xea, 0xc4, 0x46, 0xe5, 0xd5, 0x96, + 0xaa, 0xf3, 0x0b, 0xd2, 0x6a, 0x24, 0x53, 0x2c, 0xab, 0x5c, 0x94, 0x2a, + 0xfb, 0xea, 0x32, 0xb1, 0x64, 0xba, 0x91, 0xea, 0xf3, 0xa1, 0xca, 0xf3, + 0x0d, 0x19, 0x63, 0xf4, 0xf2, 0xc5, 0x96, 0xea, 0x95, 0xaa, 0xc2, 0xb9, + 0x50, 0x3d, 0x05, 0x8a, 0x57, 0x62, 0x85, 0xf3, 0xa1, 0x4a, 0x81, 0x3d, + 0x36, 0x0c, 0xf7, 0x54, 0xd5, 0xba, 0xf0, 0xb2, 0x8e, 0xee, 0xab, 0x2b, + 0xee, 0x76, 0x15, 0xaf, 0x1e, 0xd4, 0xe1, 0x3d, 0xde, 0x79, 0x3a, 0xdd, + 0xae, 0x5a, 0xa6, 0xa7, 0x83, 0x95, 0xd1, 0xcf, 0x2a, 0xbd, 0x64, 0xbb, + 0xdd, 0xeb, 0x97, 0x15, 0xce, 0x97, 0x14, 0xc7, 0x3d, 0xa9, 0x6f, 0xd4, + 0x32, 0x5d, 0x35, 0x24, 0x75, 0x56, 0xed, 0x8d, 0xf3, 0x16, 0x6a, 0x95, + 0x91, 0xe9, 0x3a, 0xa6, 0xa3, 0x46, 0x25, 0x54, 0x49, 0x3d, 0x05, 0x41, + 0xa0, 0x46, 0xa3, 0xa1, 0x73, 0xe7, 0xda, 0x69, 0x7d, 0x78, 0x4b, 0x35, + 0x0d, 0x97, 0x8d, 0x4c, 0xa4, 0x85, 0x62, 0xa8, 0x4e, 0x14, 0xcb, 0xc4, + 0x2d, 0x45, 0x3d, 0xa3, 0x86, 0xdf, 0xb7, 0xdc, 0x33, 0x46, 0xf2, 0xb9, + 0x70, 0xa8, 0xbc, 0x40, 0x2d, 0x3f, 0x10, 0xea, 0x7b, 0x17, 0x63, 0xdd, + 0xb1, 0x2f, 0x4c, 0xeb, 0x5c, 0x20, 0x94, 0x1f, 0xa8, 0x95, 0x17, 0xae, + 0xe5, 0x64, 0x03, 0xb5, 0xc6, 0x71, 0x41, 0x58, 0x92, 0xf4, 0x73, 0xff, + 0xf8, 0x5d, 0xfa, 0xdf, 0x7f, 0xe5, 0x9f, 0xa6, 0xd3, 0x66, 0xc3, 0xbe, + 0xde, 0xf1, 0xb6, 0x77, 0xea, 0xfb, 0xff, 0xf1, 0x7b, 0xfa, 0xc6, 0xf3, + 0xcf, 0xe9, 0x27, 0xdf, 0xb7, 0xb4, 0x26, 0x3c, 0xcb, 0x8d, 0x93, 0xf5, + 0x47, 0x7f, 0x72, 0x42, 0xef, 0xb0, 0x99, 0x57, 0x69, 0xa0, 0x96, 0x3f, + 0xec, 0x5e, 0xcb, 0x77, 0x5f, 0x7d, 0x2d, 0xf7, 0x75, 0xbb, 0xf9, 0x66, + 0x5f, 0xeb, 0xad, 0x3f, 0x7c, 0xc7, 0x9a, 0xd7, 0xee, 0xf7, 0x37, 0x1b, + 0x2c, 0x36, 0x75, 0x99, 0xd4, 0x24, 0x9d, 0xa9, 0x25, 0xa9, 0xa9, 0xb5, + 0x61, 0xb0, 0xd6, 0x89, 0xa4, 0xae, 0x2d, 0xe9, 0xab, 0x93, 0x9b, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4c, 0xc6, + 0xa5, 0x0a, 0x00, 0x00, 0x5c, 0x73, 0x02, 0x1b, 0xb0, 0x50, 0x2c, 0x49, + 0xc6, 0x5e, 0x7c, 0xe3, 0x82, 0xb5, 0xb2, 0xdc, 0xc9, 0xc8, 0x41, 0x30, + 0x0c, 0x1f, 0x92, 0x92, 0x8b, 0x81, 0x82, 0x40, 0x41, 0x72, 0x02, 0xb3, + 0xa4, 0xb1, 0xe1, 0x5a, 0x41, 0x10, 0xc8, 0xc4, 0x3d, 0x05, 0x61, 0x49, + 0xea, 0x9b, 0xe1, 0xc5, 0x1b, 0x73, 0xa1, 0xe2, 0xb9, 0x40, 0xd1, 0xe5, + 0xe4, 0x42, 0xea, 0x39, 0xaf, 0x07, 0x3d, 0xc9, 0x9d, 0x4c, 0x19, 0x04, + 0x81, 0xca, 0x2a, 0x2b, 0x52, 0xa4, 0x50, 0x65, 0xc5, 0x71, 0x24, 0xc5, + 0xa3, 0xc1, 0x60, 0xc3, 0x60, 0xa4, 0xce, 0x48, 0xb9, 0x0b, 0x31, 0x89, + 0x8d, 0x91, 0x3a, 0x1d, 0x95, 0x93, 0x0b, 0x32, 0x47, 0xc3, 0xb5, 0xec, + 0x32, 0x09, 0x82, 0x40, 0xdd, 0xb8, 0xa3, 0x7a, 0x58, 0x56, 0x2f, 0x39, + 0x29, 0xb8, 0x24, 0x29, 0xac, 0x54, 0x15, 0x48, 0xaa, 0xcc, 0x57, 0x75, + 0xce, 0xbf, 0xc0, 0xde, 0x5b, 0x1e, 0x26, 0x69, 0x27, 0x28, 0x06, 0x32, + 0x7d, 0x7b, 0xc7, 0xd4, 0x4e, 0x72, 0x81, 0xb9, 0x0b, 0x02, 0xcb, 0x13, + 0xc7, 0x91, 0x1a, 0x7b, 0xca, 0x6a, 0xb5, 0xd7, 0xde, 0xed, 0x7e, 0xa3, + 0x5c, 0x38, 0x94, 0x24, 0x85, 0x61, 0xa0, 0x9e, 0xbb, 0x1b, 0x6a, 0xec, + 0xfa, 0x6b, 0xd2, 0xc0, 0xa7, 0xce, 0x4a, 0xac, 0xfa, 0x7c, 0x98, 0x4e, + 0x53, 0x0d, 0x87, 0x77, 0xa6, 0x76, 0x7f, 0xad, 0xcb, 0xf1, 0xf0, 0x49, + 0x3f, 0x48, 0xc2, 0xb0, 0x02, 0xb5, 0xba, 0xc3, 0xf9, 0xc4, 0x2b, 0x91, + 0x54, 0x0c, 0x14, 0xce, 0xc9, 0xfe, 0x5f, 0x25, 0x5a, 0x71, 0x27, 0xbd, + 0x0b, 0xb3, 0x0b, 0xd1, 0x1a, 0x99, 0x2e, 0x5e, 0x7b, 0xb2, 0xbb, 0x49, + 0x82, 0xdb, 0xf2, 0xf8, 0x81, 0x5a, 0xe5, 0x60, 0x34, 0xc8, 0x2a, 0x8a, + 0x8d, 0xe2, 0x95, 0x78, 0xf4, 0x02, 0x9c, 0xc0, 0x86, 0x0c, 0x74, 0xbc, + 0x8b, 0xfd, 0x5d, 0x38, 0x56, 0x39, 0x0d, 0x82, 0x4a, 0x4e, 0x74, 0x37, + 0xc3, 0x70, 0xa8, 0xea, 0x7c, 0x68, 0x4f, 0xb2, 0x0d, 0x92, 0x79, 0xae, + 0x0c, 0x03, 0xb5, 0xca, 0x73, 0x41, 0xda, 0x87, 0x78, 0x65, 0x78, 0x17, + 0x6c, 0x7f, 0x99, 0x4e, 0xea, 0xa7, 0x24, 0xb5, 0x2e, 0x75, 0x15, 0xcc, + 0x05, 0x69, 0x5f, 0x5d, 0x88, 0x56, 0xb6, 0x9f, 0xd7, 0xe2, 0xbd, 0x40, + 0xf3, 0x02, 0xb4, 0xe2, 0xd5, 0xb5, 0x81, 0x1d, 0x2e, 0x48, 0x6b, 0x5a, + 0xa0, 0x96, 0x31, 0x46, 0xa5, 0xa0, 0x34, 0x1a, 0x92, 0x37, 0x8d, 0x77, + 0x91, 0xd9, 0xba, 0x3e, 0x6d, 0x8c, 0x19, 0xd7, 0xf4, 0x8c, 0x82, 0xd2, + 0xf0, 0x22, 0x92, 0x0d, 0x49, 0xfa, 0x92, 0x0d, 0xd1, 0x2a, 0xcd, 0x95, + 0xd4, 0x5b, 0xcd, 0x59, 0x06, 0xeb, 0x9c, 0x8f, 0x0b, 0x20, 0x74, 0x01, + 0x4f, 0xee, 0xb9, 0x1f, 0x4c, 0x98, 0x37, 0x3c, 0xeb, 0xf8, 0xdb, 0x31, + 0x8f, 0x6b, 0x65, 0x7c, 0x17, 0x96, 0xb5, 0x9e, 0xb6, 0x3b, 0x97, 0x87, + 0x17, 0x84, 0xf8, 0xff, 0xaf, 0xfe, 0xff, 0x6d, 0x39, 0x2c, 0x2b, 0x8a, + 0xa3, 0x35, 0x65, 0x1b, 0xe5, 0xc2, 0xb3, 0xd6, 0x86, 0x69, 0xd9, 0xb2, + 0xc7, 0x1f, 0x97, 0x7e, 0xe1, 0x17, 0x46, 0xa7, 0xf9, 0xbd, 0xdf, 0xb3, + 0x8f, 0x7e, 0xf9, 0xac, 0x65, 0xd7, 0x92, 0x3b, 0xf7, 0xce, 0x76, 0x52, + 0xfc, 0xb5, 0xe2, 0xd2, 0x55, 0x84, 0x91, 0x7d, 0xe0, 0x9e, 0x8a, 0x4a, + 0x92, 0x9e, 0x7a, 0xe0, 0xe3, 0x32, 0x8f, 0x7f, 0x48, 0x0f, 0xee, 0x91, + 0x4e, 0x5d, 0x96, 0x7e, 0xeb, 0xf7, 0x3f, 0xad, 0x8f, 0xfc, 0x83, 0x0f, + 0x6d, 0xb8, 0xdd, 0xf2, 0x81, 0xc3, 0x0a, 0x8a, 0x52, 0xdc, 0x0d, 0xd2, + 0xcb, 0x1e, 0xa2, 0x4b, 0xcd, 0xb1, 0x17, 0xe8, 0x99, 0x55, 0x23, 0xd5, + 0xec, 0x31, 0xd2, 0xc8, 0xf6, 0x29, 0x94, 0xd4, 0x5f, 0xbb, 0x0d, 0xbb, + 0xa1, 0xc7, 0x5f, 0x1d, 0xb3, 0x3f, 0x5a, 0xcd, 0x39, 0x66, 0xc9, 0x1f, + 0x33, 0xdf, 0xc5, 0x24, 0x84, 0xa0, 0x1c, 0x48, 0xaa, 0x4a, 0x2b, 0x1d, + 0x1b, 0xac, 0x35, 0xc1, 0x87, 0x7f, 0xff, 0x31, 0x7d, 0xea, 0x0f, 0x3f, + 0x23, 0x7d, 0x6b, 0xfa, 0x45, 0x69, 0x23, 0xfd, 0x4a, 0x2e, 0xae, 0x3b, + 0xbb, 0x09, 0xf9, 0x56, 0x26, 0x09, 0xa8, 0x4d, 0x3d, 0x6f, 0xc3, 0x62, + 0xe4, 0x02, 0x73, 0x5b, 0x6d, 0x69, 0xbe, 0x3a, 0x1a, 0x48, 0x95, 0xe7, + 0xdd, 0xfb, 0xa5, 0xaf, 0x6c, 0x5d, 0x78, 0x58, 0xae, 0x7f, 0xff, 0xe5, + 0xd1, 0xe7, 0x7d, 0x33, 0x1a, 0x10, 0xe6, 0x54, 0x2b, 0xb3, 0xbf, 0x8e, + 0x69, 0xfc, 0xab, 0xff, 0xbd, 0x61, 0x93, 0x1c, 0x7f, 0x06, 0x37, 0x4b, + 0x92, 0x51, 0x7c, 0x45, 0x0a, 0x6f, 0x71, 0x01, 0xb3, 0xf6, 0x18, 0x3c, + 0x8e, 0xb3, 0x4d, 0x19, 0x99, 0xc8, 0x3e, 0x4a, 0x46, 0x26, 0x0a, 0xa4, + 0x72, 0x69, 0x18, 0x58, 0x90, 0xe8, 0xc9, 0x48, 0x73, 0x65, 0x69, 0xa5, + 0x63, 0x83, 0x6a, 0xc3, 0xea, 0x30, 0x90, 0x2a, 0x3b, 0xac, 0xae, 0x4c, + 0xbf, 0x27, 0xcd, 0x85, 0xd2, 0x4a, 0x66, 0x86, 0x61, 0xa8, 0x20, 0xd3, + 0x89, 0xb8, 0x2f, 0x05, 0x73, 0x92, 0x49, 0x82, 0xb0, 0x82, 0xd0, 0x0e, + 0xfb, 0x8f, 0x69, 0x8a, 0x86, 0x69, 0x29, 0x0c, 0x16, 0x14, 0x47, 0xb1, + 0xc2, 0x72, 0x72, 0x21, 0x71, 0x66, 0x38, 0xf0, 0xaf, 0xc3, 0x0a, 0xab, + 0x36, 0x50, 0x2b, 0x4c, 0xd6, 0xc5, 0x71, 0xc3, 0x2e, 0xac, 0x27, 0xe9, + 0x5b, 0x2f, 0x08, 0x55, 0x8a, 0x63, 0xf5, 0x8c, 0xa4, 0xb9, 0x20, 0x2d, + 0x97, 0xf7, 0x19, 0xa0, 0xb3, 0x92, 0x7c, 0xb6, 0x99, 0x0b, 0x46, 0x86, + 0xdd, 0xb2, 0x6e, 0x8f, 0xbc, 0xc8, 0x24, 0x54, 0x38, 0xa8, 0x0c, 0xc3, + 0xb4, 0xf8, 0x36, 0x1b, 0x9e, 0x5a, 0xcd, 0x48, 0xef, 0x3e, 0xaa, 0x5a, + 0xcd, 0x68, 0xf9, 0xdb, 0x1d, 0xc5, 0x97, 0xba, 0xaa, 0x27, 0x61, 0x06, + 0xf5, 0xbb, 0xeb, 0x6a, 0x7d, 0x7b, 0xf8, 0x59, 0xbe, 0xbe, 0xa7, 0xaa, + 0xe5, 0x4b, 0x2d, 0xd5, 0xef, 0x4d, 0xc2, 0x14, 0x65, 0x54, 0x5f, 0xa8, + 0x6b, 0xf9, 0xf9, 0x48, 0xf5, 0x3d, 0x75, 0x9d, 0xfb, 0x5a, 0xa4, 0xf0, + 0xce, 0xb2, 0x1a, 0x5e, 0x9b, 0xcd, 0x8b, 0x81, 0x3a, 0xaf, 0x76, 0xb4, + 0x7f, 0x6f, 0x55, 0x51, 0x6c, 0xd4, 0x38, 0x64, 0xd4, 0x3c, 0x67, 0x64, + 0xde, 0x90, 0x1a, 0xf7, 0x1d, 0x56, 0xf3, 0x5b, 0x67, 0x55, 0xaf, 0x35, + 0x24, 0xf5, 0xa4, 0x50, 0x6a, 0xec, 0x93, 0xf4, 0x2d, 0x1b, 0x5c, 0x75, + 0xea, 0xe9, 0x24, 0x88, 0x6e, 0xa1, 0x6a, 0xcb, 0xdf, 0xff, 0x88, 0x1a, + 0xfb, 0xa4, 0xe5, 0xaf, 0x34, 0xb5, 0x5c, 0x91, 0x1a, 0x77, 0xef, 0x57, + 0x14, 0x45, 0x6a, 0xdc, 0x6b, 0x74, 0xfa, 0x4b, 0x91, 0xca, 0x73, 0x55, + 0x2d, 0xfc, 0x9d, 0xa3, 0x5a, 0xfe, 0xfa, 0x69, 0x2d, 0x2c, 0x34, 0xb4, + 0xfc, 0xc2, 0x79, 0x55, 0x1b, 0x55, 0x35, 0xee, 0xa9, 0x4b, 0x67, 0xa4, + 0xfa, 0x3e, 0xa3, 0xe5, 0x97, 0x9a, 0x5a, 0xd8, 0x3b, 0x3a, 0xed, 0xf2, + 0x37, 0xa5, 0x53, 0x17, 0xa4, 0x72, 0xb9, 0x2c, 0x23, 0xa3, 0x85, 0x7b, + 0xa5, 0xd3, 0x5f, 0x8a, 0xd4, 0xd8, 0x33, 0x87, 0x77, 0x84, 0x00, 0x00, + 0x20, 0x00, 0x49, 0x44, 0x41, 0x54, 0x6b, 0x43, 0xb2, 0x9a, 0x17, 0xcf, + 0x4b, 0x92, 0x16, 0xde, 0x7e, 0x50, 0xcb, 0x2f, 0x9c, 0xd7, 0xd1, 0x9f, + 0x3a, 0xac, 0xe6, 0x4b, 0xad, 0x34, 0x10, 0xeb, 0xec, 0x19, 0xa9, 0xb1, + 0x58, 0x57, 0x67, 0xd5, 0x86, 0x91, 0x2c, 0x5f, 0x6a, 0x6a, 0xb9, 0x2b, + 0x1d, 0xbd, 0x3f, 0x50, 0xb9, 0x5c, 0x4e, 0xca, 0xa4, 0xee, 0xe5, 0x8e, + 0x1a, 0x77, 0xef, 0x57, 0xf3, 0xdb, 0xe7, 0x93, 0x40, 0xad, 0x50, 0x9d, + 0x4e, 0x47, 0x47, 0x1f, 0x0a, 0xd5, 0xf9, 0xa2, 0x54, 0xaf, 0x35, 0xf4, + 0xcc, 0xd3, 0x5d, 0x95, 0xc3, 0x8a, 0x16, 0xde, 0x95, 0x2c, 0xe1, 0x77, + 0x1f, 0x55, 0xa3, 0x26, 0x2d, 0xbf, 0x68, 0xa4, 0xc8, 0x68, 0xff, 0x5e, + 0x3b, 0xcf, 0xda, 0x82, 0x0d, 0x76, 0xe8, 0x75, 0xa4, 0xfa, 0x9e, 0xba, + 0x96, 0x2f, 0x6d, 0xde, 0x77, 0x2e, 0xb8, 0xfe, 0x3d, 0xf5, 0xc5, 0x67, + 0xbc, 0x67, 0xcb, 0x63, 0xc6, 0x5a, 0x1e, 0x19, 0xae, 0x87, 0x81, 0x4e, + 0x9f, 0x5b, 0xd6, 0x07, 0x25, 0xe9, 0x21, 0x57, 0xfe, 0xf0, 0x9a, 0x60, + 0xab, 0x46, 0xa5, 0xae, 0x78, 0xf4, 0x9a, 0x66, 0x49, 0xcf, 0xe8, 0xa9, + 0x2f, 0xda, 0xa1, 0xba, 0xa4, 0xc3, 0x0f, 0x49, 0x4f, 0x7d, 0x71, 0x74, + 0xbe, 0xf5, 0xb0, 0x23, 0x75, 0x1b, 0x23, 0xed, 0x34, 0x2b, 0x52, 0xa7, + 0x7b, 0x4a, 0xad, 0x73, 0x46, 0xd9, 0xff, 0xe0, 0xd6, 0xb9, 0xe5, 0xb4, + 0x8f, 0xae, 0x4f, 0x2f, 0x37, 0x1f, 0x56, 0xb5, 0xa2, 0x34, 0x28, 0x4c, + 0xb2, 0x87, 0x39, 0xf6, 0xb1, 0x2e, 0xe9, 0x19, 0xe9, 0x8b, 0xd2, 0x53, + 0xc9, 0x74, 0xe5, 0xc6, 0x82, 0xa4, 0x61, 0xff, 0x1b, 0x95, 0xba, 0x5a, + 0xcd, 0xa6, 0x4e, 0x27, 0x6d, 0xd7, 0x43, 0xa9, 0xd5, 0xb4, 0xeb, 0xed, + 0xcf, 0x3f, 0x67, 0xa7, 0xf1, 0x03, 0xaf, 0xf2, 0xc2, 0xaf, 0xfc, 0xb2, + 0x5a, 0x68, 0x0f, 0x13, 0xdc, 0xa1, 0x82, 0x0b, 0xda, 0x5a, 0x57, 0x90, + 0xd6, 0xfd, 0x92, 0xbc, 0xf9, 0xa5, 0xed, 0xcc, 0xa8, 0x13, 0xdb, 0x60, + 0x2d, 0xa7, 0xb5, 0xd2, 0xd3, 0xc1, 0x46, 0x59, 0x9d, 0x2b, 0xb1, 0xaa, + 0xe1, 0xe8, 0x77, 0x71, 0xa6, 0xdf, 0x53, 0x75, 0x6e, 0x78, 0x7c, 0xde, + 0x49, 0x3e, 0x17, 0xfc, 0xf2, 0x2f, 0x7c, 0x5c, 0x9f, 0xff, 0xec, 0x27, + 0x47, 0xca, 0x62, 0x53, 0x52, 0x18, 0xf4, 0xd2, 0x61, 0x49, 0x0a, 0x83, + 0x9e, 0xba, 0xab, 0x4a, 0x83, 0xb4, 0x24, 0xa9, 0x9b, 0x7c, 0x86, 0x38, + 0xd4, 0x08, 0xd5, 0x7a, 0xcd, 0xa8, 0x7e, 0x7b, 0x20, 0xf3, 0x86, 0x0d, + 0xbd, 0xb2, 0xd3, 0x0d, 0xdb, 0xf1, 0xdb, 0x72, 0xed, 0x6d, 0xa4, 0xbc, + 0x3e, 0x5f, 0x55, 0x27, 0x0e, 0xd4, 0xe9, 0xd8, 0xbe, 0xba, 0xd7, 0xd4, + 0xf1, 0x3e, 0xe7, 0x34, 0x92, 0x1b, 0x2e, 0xf8, 0x65, 0xfe, 0xeb, 0x90, + 0xa4, 0x67, 0xbe, 0xf4, 0x94, 0x0d, 0x24, 0x8b, 0xa5, 0x6a, 0xd1, 0x3e, + 0x1a, 0xf5, 0xa4, 0xd0, 0x8e, 0xe7, 0x02, 0xb5, 0x7c, 0x51, 0xdc, 0x53, + 0xfd, 0xf6, 0x92, 0x5a, 0xaf, 0xf5, 0x14, 0x94, 0xbd, 0xcf, 0x3a, 0xc9, + 0xef, 0x0f, 0xc6, 0x48, 0xcf, 0xbc, 0x78, 0x6a, 0xd8, 0xe7, 0x5b, 0x02, + 0xc5, 0x57, 0x72, 0x3e, 0x67, 0xd9, 0x9f, 0x1d, 0x74, 0xe4, 0xee, 0x07, + 0x75, 0xee, 0xd5, 0x53, 0x6b, 0xea, 0xf3, 0xb9, 0x15, 0xcf, 0x05, 0xd9, + 0x24, 0xfd, 0x2b, 0x1a, 0xa9, 0x9f, 0x94, 0xf5, 0xbb, 0xc9, 0x71, 0x9e, + 0x8b, 0x53, 0x09, 0x92, 0x40, 0x2d, 0x77, 0x0c, 0x98, 0x0c, 0xf7, 0xbb, + 0x52, 0xb1, 0x2a, 0x29, 0x4c, 0x82, 0xb2, 0x32, 0x41, 0x38, 0xfe, 0x34, + 0x13, 0xd9, 0xff, 0xb1, 0x30, 0x48, 0x7e, 0x8f, 0x88, 0x27, 0x4f, 0x13, + 0x25, 0xf5, 0x36, 0x48, 0xcb, 0xa4, 0xbf, 0x33, 0xc8, 0x3d, 0x2a, 0xf9, + 0xed, 0xc1, 0x9b, 0xc6, 0xa4, 0xbf, 0x72, 0x6c, 0x71, 0x18, 0xcf, 0x66, + 0xd9, 0xe4, 0xd0, 0xa0, 0xe3, 0x4b, 0xd2, 0xf1, 0x13, 0x6b, 0x9f, 0xa7, + 0x01, 0x56, 0x8b, 0x4b, 0x69, 0x9d, 0x1f, 0x92, 0x35, 0xda, 0x86, 0x0d, + 0xb4, 0x72, 0xe3, 0xb4, 0x93, 0xf2, 0x9a, 0xa4, 0x33, 0x67, 0x6c, 0x80, + 0xd4, 0x8f, 0x77, 0xa5, 0x7f, 0x25, 0x49, 0x7f, 0x47, 0xfa, 0xe9, 0xcf, + 0x49, 0x9f, 0xab, 0xd8, 0xba, 0xc5, 0x25, 0x69, 0xf1, 0x8c, 0xa4, 0xa5, + 0x5a, 0x1a, 0x5c, 0xb5, 0xb8, 0x68, 0xa7, 0xa9, 0x69, 0x18, 0xf7, 0xe5, + 0x42, 0xb6, 0x5c, 0x98, 0x97, 0x53, 0x53, 0xa6, 0xe0, 0x8c, 0xd2, 0x80, + 0xaf, 0x13, 0x27, 0xec, 0xeb, 0xa9, 0xa9, 0x26, 0xd7, 0xc3, 0x5a, 0x4d, + 0x69, 0x5f, 0x6b, 0x92, 0xf4, 0x07, 0x92, 0xfe, 0x27, 0x49, 0x5f, 0x97, + 0xfe, 0xfd, 0x71, 0xa9, 0x7d, 0x7c, 0xb8, 0x3c, 0xdc, 0x54, 0x27, 0x4e, + 0x68, 0x24, 0x34, 0xec, 0x4c, 0xf2, 0xfc, 0xf8, 0x09, 0xe9, 0x84, 0x57, + 0x2e, 0xd9, 0x30, 0xad, 0xda, 0x62, 0x32, 0xfd, 0xa2, 0x0b, 0x2d, 0xb3, + 0x01, 0x5f, 0x27, 0x4e, 0x48, 0x8b, 0xb2, 0xe1, 0x62, 0xed, 0x76, 0xce, + 0x6b, 0x59, 0x1c, 0xb6, 0x21, 0xd9, 0xd0, 0xac, 0x61, 0xcf, 0xed, 0x34, + 0x67, 0xda, 0xd2, 0x62, 0xcd, 0x06, 0x8f, 0xcd, 0xa4, 0x6f, 0xd2, 0xb0, + 0x6f, 0xf7, 0x3c, 0xd7, 0x2c, 0x81, 0x54, 0xb3, 0xfc, 0xef, 0x79, 0xed, + 0xb8, 0xdf, 0x7c, 0x5c, 0x80, 0x54, 0x38, 0x17, 0xda, 0xbe, 0xf8, 0xeb, + 0x60, 0xdf, 0x8c, 0xfc, 0x56, 0x62, 0x4c, 0x9c, 0x86, 0x6a, 0x49, 0x52, + 0xe0, 0xff, 0xde, 0x39, 0x29, 0x50, 0x6b, 0x42, 0xff, 0x46, 0x5e, 0xff, + 0x56, 0x72, 0xbf, 0xf3, 0xba, 0x50, 0xbf, 0xd5, 0x48, 0x9d, 0x55, 0x23, + 0x63, 0x3a, 0x92, 0x02, 0xb5, 0x24, 0x95, 0xe7, 0xaa, 0x8a, 0x62, 0x7b, + 0x2c, 0x1e, 0xf4, 0x6d, 0x10, 0x5e, 0xa0, 0x40, 0x9d, 0x6e, 0x5b, 0xd5, + 0xf9, 0x8a, 0x4c, 0xdf, 0xe8, 0xc1, 0x77, 0xff, 0x9c, 0xdc, 0x8f, 0x61, + 0xd1, 0x6a, 0x37, 0x0d, 0xdc, 0xd2, 0xb7, 0xce, 0x4f, 0xef, 0x83, 0x91, + 0xa2, 0x40, 0x92, 0xe9, 0xa5, 0xbf, 0xa7, 0x95, 0xe4, 0x02, 0xb5, 0xec, + 0xbe, 0xe7, 0x90, 0xa4, 0x65, 0x77, 0x63, 0x1e, 0x05, 0x0a, 0x8c, 0x64, + 0x8a, 0x66, 0xcd, 0x0d, 0x4c, 0x0e, 0xb9, 0x10, 0xae, 0x62, 0x90, 0xd6, + 0xd5, 0x93, 0x65, 0x1c, 0x25, 0x75, 0x87, 0x25, 0x9d, 0x2d, 0x4a, 0xc7, + 0x7e, 0xb5, 0xa3, 0x72, 0x12, 0x58, 0xe5, 0x7b, 0x42, 0xd2, 0x31, 0x0d, + 0xc3, 0xac, 0x1a, 0x45, 0x49, 0x5e, 0x30, 0x57, 0xb5, 0x2f, 0x7d, 0xbc, + 0x28, 0x3d, 0xd6, 0x97, 0xe2, 0xbe, 0xd1, 0xb9, 0xe4, 0x95, 0x37, 0x25, + 0x2d, 0xf4, 0xa5, 0x56, 0x31, 0x50, 0x28, 0xe9, 0xd8, 0x37, 0x25, 0x15, + 0x8d, 0xa2, 0x7e, 0xa0, 0x8f, 0x16, 0xed, 0x1e, 0xe8, 0xbc, 0xa4, 0xf3, + 0x46, 0xaa, 0x26, 0xbf, 0x83, 0x76, 0x25, 0x7d, 0xac, 0x6f, 0xe7, 0xe7, + 0xb8, 0x38, 0xd3, 0x6c, 0xbf, 0x24, 0x69, 0x41, 0x52, 0x47, 0x46, 0xc1, + 0xf3, 0xb1, 0x1e, 0x3b, 0x67, 0xd4, 0xe8, 0xdb, 0x30, 0xac, 0x30, 0x59, + 0x36, 0x4f, 0x16, 0x4b, 0x3a, 0xdf, 0xef, 0xe9, 0x60, 0xfa, 0x68, 0xcb, + 0xcf, 0x7b, 0x81, 0x59, 0x0f, 0x2a, 0xd0, 0x31, 0xd9, 0x08, 0xb3, 0xe5, + 0x24, 0xb4, 0xeb, 0x23, 0xfd, 0x40, 0x0f, 0x17, 0xdd, 0xb2, 0x93, 0x8e, + 0x7d, 0xac, 0xa5, 0x72, 0xd1, 0xbe, 0xff, 0x6e, 0xb9, 0x45, 0xc9, 0xb2, + 0xf9, 0x68, 0x31, 0xe9, 0x73, 0xdf, 0x06, 0x6b, 0xb5, 0x93, 0xba, 0x69, + 0xbe, 0xff, 0x83, 0x37, 0x74, 0xf4, 0xe8, 0x51, 0xbd, 0xfe, 0xfa, 0xeb, + 0x69, 0xd0, 0x93, 0x0b, 0x77, 0x92, 0x94, 0x06, 0x3b, 0xdd, 0xfa, 0x43, + 0x37, 0xa7, 0xc1, 0x4f, 0x92, 0xb4, 0xef, 0xde, 0xb7, 0xeb, 0xf5, 0xd7, + 0x5f, 0xb7, 0xe1, 0x4f, 0xdf, 0xb1, 0x41, 0x55, 0x77, 0xbd, 0xf5, 0x2e, + 0xbd, 0xfe, 0xfa, 0xeb, 0x69, 0x9b, 0x37, 0x27, 0xc1, 0x50, 0x2e, 0xb8, + 0x2a, 0x1b, 0x72, 0x75, 0x73, 0xf5, 0x56, 0x5b, 0xaf, 0x61, 0xc8, 0x56, + 0x1a, 0x28, 0xe5, 0xb5, 0x79, 0xf1, 0xc5, 0x17, 0xd2, 0x3e, 0xb9, 0x80, + 0x29, 0xd7, 0x4f, 0xc7, 0x0f, 0xea, 0x72, 0x81, 0x5a, 0x5b, 0xd5, 0xa6, + 0x1f, 0x7c, 0xf5, 0xfa, 0xeb, 0xaf, 0xeb, 0xfb, 0x6f, 0xbc, 0xa1, 0xbb, + 0xde, 0x7a, 0x97, 0x4e, 0x3f, 0x77, 0x5a, 0x77, 0xbd, 0xf5, 0xae, 0x1d, + 0x5d, 0xa6, 0x93, 0x98, 0xd8, 0xa4, 0xc1, 0x57, 0x52, 0x28, 0xb7, 0x29, + 0x8b, 0xda, 0x2d, 0x05, 0xfb, 0xec, 0xb1, 0x51, 0xb4, 0x32, 0x1c, 0x3f, + 0x08, 0xab, 0xaa, 0xd7, 0x8d, 0xce, 0xbf, 0x70, 0x3e, 0xfd, 0x2e, 0x21, + 0x76, 0x5b, 0xdc, 0xcb, 0x2d, 0x1d, 0xba, 0xef, 0x90, 0xfd, 0x9a, 0x75, + 0x4e, 0x6a, 0x9e, 0x6b, 0xaa, 0x71, 0xa8, 0xe1, 0x85, 0x1a, 0xc6, 0x0a, + 0x57, 0xed, 0x36, 0xa9, 0x1c, 0x96, 0x55, 0x49, 0x3e, 0x04, 0x35, 0x97, + 0x9b, 0xe9, 0xb0, 0xf7, 0xeb, 0xbb, 0x16, 0xf6, 0xed, 0x97, 0xdb, 0xae, + 0x34, 0x5f, 0x3a, 0xab, 0xc6, 0x3d, 0x87, 0x35, 0xdc, 0x7c, 0x57, 0x55, + 0x36, 0xfe, 0xcd, 0x06, 0xca, 0xea, 0xf5, 0x7b, 0xaa, 0xee, 0xad, 0xcb, + 0x74, 0x23, 0x55, 0xef, 0xac, 0x2a, 0xea, 0x04, 0x32, 0xab, 0x46, 0x2f, + 0xb7, 0x5b, 0xda, 0x5f, 0xab, 0xeb, 0xf0, 0xdb, 0x17, 0xb4, 0xfc, 0xc2, + 0x39, 0x05, 0x45, 0x1b, 0x44, 0x57, 0xdd, 0x53, 0x57, 0xe7, 0x72, 0x4b, + 0x4a, 0x02, 0x7d, 0x4b, 0x41, 0xa0, 0xfa, 0x81, 0xfd, 0x0a, 0xfa, 0x3d, + 0x2d, 0x3c, 0x70, 0xc4, 0x86, 0x17, 0xba, 0x9e, 0x77, 0xbb, 0xaa, 0x54, + 0x2a, 0xaa, 0x1b, 0xa3, 0x4a, 0x72, 0x1e, 0x85, 0xff, 0x3b, 0x73, 0xa9, + 0x18, 0x24, 0xdb, 0xc5, 0x92, 0xfd, 0x2b, 0x06, 0xaa, 0x87, 0x75, 0xf5, + 0xde, 0x14, 0x6a, 0x61, 0xa1, 0x2a, 0xe3, 0xfd, 0x06, 0x1f, 0xc7, 0x91, + 0xaa, 0xa1, 0x14, 0xc7, 0x55, 0x55, 0xc3, 0x9e, 0x7a, 0x6f, 0xaa, 0x2a, + 0xee, 0x27, 0xa1, 0xb0, 0x63, 0x76, 0x25, 0xf5, 0x30, 0x50, 0xd4, 0x97, + 0x1a, 0x0b, 0x47, 0x64, 0x56, 0x87, 0xaf, 0x3b, 0x7a, 0x23, 0x56, 0xf9, + 0xe6, 0x70, 0xe4, 0xc6, 0x42, 0x79, 0x9e, 0xfe, 0xe3, 0x93, 0xe9, 0xb0, + 0x0b, 0x89, 0xf2, 0xf9, 0x61, 0x5a, 0x2e, 0xa8, 0xea, 0x8e, 0x7d, 0xe1, + 0x48, 0x9d, 0x3f, 0x4e, 0xf6, 0xb9, 0x1b, 0xce, 0x06, 0x4e, 0xcd, 0xca, + 0x4d, 0xd7, 0x3c, 0xff, 0xe7, 0xb9, 0x81, 0x5a, 0xff, 0xcd, 0x9d, 0xb7, + 0x4b, 0x52, 0x1a, 0xa8, 0xf5, 0x23, 0x0f, 0x1c, 0x19, 0x09, 0xaf, 0xca, + 0xf2, 0xeb, 0x6e, 0xfd, 0xe1, 0x3b, 0xd2, 0xe9, 0x25, 0xe9, 0xdc, 0xff, + 0xf5, 0x67, 0xb9, 0x61, 0x57, 0xae, 0x0f, 0xee, 0x75, 0xbb, 0x7e, 0xed, + 0xa9, 0xec, 0xcd, 0x0d, 0x1d, 0xcb, 0x06, 0x7e, 0xe5, 0x19, 0x17, 0x40, + 0x36, 0x12, 0xae, 0xb5, 0x24, 0xe9, 0xb8, 0xec, 0x41, 0xe3, 0x92, 0x6c, + 0xca, 0xe9, 0x09, 0xd9, 0x83, 0xb2, 0x25, 0x29, 0x3d, 0x0c, 0x75, 0xe3, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xae, + 0x0a, 0x97, 0x21, 0x01, 0x00, 0x70, 0x2d, 0x70, 0x27, 0xde, 0x16, 0xa5, + 0x34, 0x4c, 0x6a, 0xce, 0xde, 0x6d, 0x39, 0x9c, 0x0b, 0x15, 0x86, 0x55, + 0x95, 0xc3, 0x6c, 0x18, 0x56, 0x49, 0xf1, 0x6a, 0xa4, 0xc8, 0xbf, 0xe0, + 0xba, 0x6f, 0x2f, 0x38, 0x29, 0xb9, 0x20, 0xa2, 0xd5, 0x48, 0x61, 0x72, + 0x71, 0xce, 0x9a, 0x70, 0x2d, 0xd9, 0x40, 0x2a, 0xa3, 0x24, 0x9c, 0xca, + 0x9d, 0x44, 0x9e, 0xf6, 0xc5, 0xd8, 0xbb, 0xd0, 0x57, 0xca, 0xea, 0xb4, + 0x5b, 0xea, 0x49, 0x63, 0xef, 0x77, 0x19, 0x04, 0x81, 0xb4, 0x62, 0x4f, + 0x66, 0x6f, 0xec, 0xdb, 0x6f, 0x83, 0xb6, 0x6e, 0x09, 0x95, 0x9e, 0x05, + 0xd8, 0xb3, 0xf3, 0xec, 0xac, 0x74, 0x15, 0xad, 0x46, 0x6b, 0x4e, 0xf2, + 0xb3, 0x17, 0xa1, 0x48, 0x91, 0x17, 0xac, 0x65, 0x97, 0x84, 0x15, 0x5d, + 0xb1, 0xa7, 0x42, 0xd7, 0x6b, 0xc9, 0xdd, 0x48, 0xff, 0xda, 0xa4, 0x27, + 0x6d, 0x2a, 0xb9, 0xe3, 0xb1, 0x8a, 0x81, 0x16, 0xde, 0x7e, 0x48, 0x67, + 0xbf, 0x76, 0x4a, 0xd5, 0xbd, 0x8d, 0xe4, 0x75, 0x64, 0xee, 0xee, 0xac, + 0xe1, 0x09, 0xf7, 0x92, 0x54, 0xd9, 0x53, 0x55, 0xb5, 0x52, 0x57, 0xb9, + 0x3c, 0x3c, 0x51, 0x2e, 0xba, 0xd2, 0x55, 0x67, 0xa5, 0xa3, 0xf6, 0xa5, + 0xa6, 0x64, 0x62, 0xa9, 0x52, 0xb6, 0xe1, 0x4a, 0xf1, 0x30, 0xb0, 0x28, + 0x0c, 0xc3, 0xdc, 0xa0, 0xa2, 0x59, 0xf4, 0x92, 0xf7, 0xa1, 0xd4, 0x97, + 0x3a, 0xd9, 0x93, 0x1d, 0x8b, 0xc9, 0x72, 0xba, 0x9c, 0xb4, 0x1d, 0xac, + 0x0d, 0x84, 0xe8, 0x5c, 0x8e, 0x55, 0xdf, 0x63, 0x43, 0xa1, 0xaa, 0xee, + 0x42, 0xb0, 0xfe, 0xf0, 0x35, 0xf9, 0xa1, 0x58, 0xbe, 0x30, 0xb4, 0x77, + 0x3e, 0x4e, 0xc3, 0x2b, 0x8a, 0x25, 0xd5, 0x2b, 0x55, 0x75, 0xba, 0xd1, + 0xd8, 0xe9, 0x7a, 0x45, 0xa5, 0xf3, 0x58, 0xd3, 0x57, 0x79, 0xe1, 0x56, + 0x4a, 0xbb, 0x2b, 0x19, 0xa9, 0x3c, 0x1f, 0x28, 0x9c, 0x2b, 0x69, 0xf9, + 0x62, 0x4b, 0xf5, 0x4a, 0x45, 0x51, 0x6c, 0x54, 0x0e, 0x03, 0x65, 0x33, + 0xba, 0xaa, 0x61, 0xa8, 0x4e, 0xd7, 0x5b, 0x8e, 0xc5, 0x64, 0xfa, 0x30, + 0xe7, 0xec, 0xd1, 0xd5, 0xe1, 0x4c, 0x3a, 0xd9, 0x90, 0x01, 0x4f, 0x34, + 0xe6, 0x04, 0xd2, 0x74, 0x99, 0x3a, 0x2e, 0x9d, 0x4c, 0x52, 0xab, 0xdb, + 0x1d, 0xe9, 0xa7, 0x32, 0xa1, 0x61, 0x69, 0x1f, 0xdd, 0x5d, 0xa3, 0x67, + 0x3c, 0x82, 0x36, 0xc9, 0x9d, 0x64, 0xdd, 0xe3, 0x2c, 0xe3, 0x5e, 0xcd, + 0x38, 0x66, 0xd5, 0xc8, 0xac, 0x1a, 0x85, 0xf3, 0x6b, 0x63, 0xe2, 0xc2, + 0xf9, 0x70, 0xe4, 0x8e, 0xe0, 0xa5, 0xa0, 0x34, 0x12, 0xa8, 0x35, 0x12, + 0x5c, 0x95, 0xd1, 0x33, 0xbd, 0x8d, 0x5d, 0x1c, 0x32, 0xeb, 0x27, 0x0d, + 0x77, 0x51, 0xc5, 0x98, 0x10, 0xae, 0x71, 0xfd, 0xca, 0xe3, 0x2e, 0x6a, + 0x5b, 0xd3, 0x76, 0xa6, 0xdd, 0xdc, 0x20, 0xad, 0xab, 0xe0, 0xb6, 0x07, + 0xd9, 0xed, 0x42, 0xde, 0x76, 0xc2, 0x2f, 0x5b, 0xef, 0xf8, 0xdb, 0x31, + 0x8f, 0x9d, 0x1e, 0xff, 0x6a, 0x97, 0x4f, 0x67, 0x65, 0x18, 0x6e, 0x63, + 0xbc, 0xfd, 0x9d, 0x5f, 0x9e, 0x2d, 0xf3, 0x1f, 0x1b, 0x6b, 0xc6, 0x1a, + 0xf5, 0x0f, 0x25, 0xfd, 0xb2, 0xc6, 0x87, 0x69, 0x65, 0xcb, 0xc6, 0x95, + 0x6f, 0x64, 0xfa, 0x67, 0xd7, 0xde, 0xf4, 0x19, 0x33, 0x7a, 0x55, 0xd2, + 0xbb, 0x65, 0x03, 0xb6, 0xf6, 0xde, 0x79, 0xe7, 0xcc, 0xd3, 0x7d, 0xfe, + 0xa5, 0xae, 0x82, 0x7f, 0xf4, 0x84, 0x1e, 0xdb, 0x67, 0x14, 0xfc, 0xfe, + 0xa7, 0x25, 0x49, 0x47, 0x25, 0x3d, 0x76, 0xe1, 0xea, 0xfa, 0x13, 0x5d, + 0x38, 0x2b, 0x05, 0x55, 0x19, 0xef, 0x8e, 0xee, 0x69, 0xd0, 0x4f, 0x77, + 0xf4, 0x7f, 0x3a, 0xfd, 0x2f, 0x9e, 0xaf, 0x48, 0x79, 0x21, 0x9f, 0x2b, + 0x37, 0xee, 0xf8, 0xe6, 0x52, 0x73, 0xed, 0xf8, 0x79, 0xfa, 0xb2, 0xcb, + 0xaf, 0x52, 0x19, 0x6d, 0xc3, 0x69, 0x4f, 0x9b, 0xde, 0x68, 0xe4, 0x40, + 0xd7, 0x05, 0x6b, 0x49, 0x52, 0x27, 0x73, 0x61, 0xf5, 0xcf, 0x1e, 0xd5, + 0x07, 0xee, 0x39, 0xa8, 0xcf, 0x4b, 0x1b, 0x0a, 0xd4, 0xb2, 0x3e, 0x2d, + 0xd3, 0x97, 0xce, 0xbd, 0xf8, 0x3e, 0x49, 0xd2, 0xa1, 0x7b, 0x87, 0x35, + 0xe7, 0x5e, 0xb4, 0x8f, 0x8d, 0xb0, 0xad, 0x66, 0x5c, 0x5b, 0x3b, 0xe9, + 0x57, 0x3f, 0x23, 0x7d, 0xed, 0xb4, 0x3e, 0xf6, 0xc0, 0x61, 0x29, 0x6f, + 0xdf, 0xec, 0xed, 0xeb, 0x55, 0xa9, 0x8e, 0xd6, 0xe5, 0x2c, 0xff, 0x4f, + 0x9c, 0x3f, 0x69, 0x83, 0xac, 0xfe, 0xd6, 0x7b, 0xd7, 0xf9, 0x1a, 0xae, + 0x52, 0x12, 0xa8, 0xf5, 0x89, 0x59, 0x2e, 0x9c, 0x75, 0x01, 0x61, 0xce, + 0xd3, 0x9f, 0xdf, 0x82, 0x0e, 0x01, 0xb8, 0x5e, 0x35, 0x9b, 0x46, 0xf1, + 0x4a, 0x4f, 0x35, 0x2f, 0xf2, 0x38, 0x5e, 0xe9, 0x2a, 0x9c, 0x4f, 0x2e, + 0xde, 0x74, 0x1f, 0x8d, 0x62, 0xc9, 0xcc, 0x65, 0x3e, 0x03, 0x24, 0x75, + 0xe1, 0x9c, 0xfd, 0x6e, 0x45, 0x92, 0xd4, 0x91, 0x9a, 0x3d, 0xdb, 0x66, + 0xaf, 0x5d, 0x56, 0x29, 0x72, 0xdf, 0x65, 0x44, 0xaa, 0x26, 0x81, 0xaf, + 0x2a, 0x07, 0x52, 0xe4, 0x6d, 0xbf, 0xaa, 0x46, 0xa6, 0x13, 0x48, 0x73, + 0xc3, 0x0f, 0x99, 0x9d, 0x8e, 0xb7, 0x7f, 0x30, 0x3d, 0xc9, 0x48, 0x9d, + 0x4e, 0x2c, 0xbd, 0x14, 0x4a, 0x2a, 0xa9, 0xb3, 0xdc, 0xd1, 0xd1, 0x9f, + 0xaa, 0xaa, 0x79, 0xa6, 0xac, 0xe5, 0x4b, 0x52, 0xb9, 0x91, 0x84, 0x82, + 0x24, 0xbb, 0x3e, 0x13, 0x1a, 0x35, 0xde, 0xb5, 0xdf, 0x86, 0x70, 0xac, + 0x36, 0x65, 0x42, 0xa9, 0xf9, 0x52, 0x4f, 0x8a, 0x4b, 0x3a, 0xb5, 0x9c, + 0x84, 0x75, 0x55, 0xab, 0xf6, 0x7b, 0x9e, 0x8a, 0xd4, 0x59, 0xee, 0xa8, + 0xba, 0x60, 0xb7, 0xfb, 0x23, 0xed, 0x49, 0xd2, 0xc5, 0xd1, 0x36, 0x97, + 0x5f, 0x6a, 0xa6, 0xaf, 0xff, 0xa9, 0xa7, 0x23, 0x95, 0xcb, 0x65, 0x2d, + 0xbf, 0xd4, 0xb4, 0xc1, 0x5f, 0x89, 0x4e, 0xa7, 0xa3, 0xa7, 0x9e, 0x96, + 0xaa, 0x8d, 0x30, 0x6d, 0xa6, 0xf1, 0x40, 0x5d, 0x23, 0xc9, 0x81, 0xa1, + 0x0d, 0xb5, 0x5e, 0xbe, 0x60, 0x54, 0x9e, 0x0b, 0xb5, 0xf0, 0x2e, 0xe9, + 0xf4, 0xd3, 0x76, 0x61, 0x2f, 0xbf, 0x98, 0x5c, 0xac, 0x1f, 0x7b, 0xcb, + 0x24, 0x09, 0xc5, 0x75, 0xcb, 0x31, 0x6d, 0x29, 0x9c, 0x2d, 0xc0, 0xe3, + 0x5d, 0xbf, 0xfe, 0x37, 0xd6, 0x94, 0xfd, 0x3f, 0x97, 0x07, 0xfa, 0x6f, + 0xf7, 0x14, 0x72, 0xc6, 0xb6, 0xd6, 0x4e, 0x61, 0xfd, 0xad, 0xf7, 0xdc, + 0x24, 0xbd, 0x67, 0x63, 0xf3, 0x9c, 0xd5, 0x46, 0xfb, 0xf6, 0xe6, 0x52, + 0x61, 0xa6, 0xf9, 0x5e, 0x4d, 0xdf, 0xa6, 0xb9, 0xf0, 0xec, 0x7f, 0x1e, + 0xdb, 0xbf, 0xcd, 0xe8, 0xdb, 0xa9, 0x8f, 0x4d, 0x9e, 0xfe, 0xd1, 0x87, + 0x1e, 0x4e, 0x2f, 0xaa, 0xf6, 0xf3, 0x21, 0xcf, 0x3e, 0x77, 0x4a, 0x0f, + 0x1e, 0x79, 0x50, 0xf2, 0xca, 0xfc, 0x71, 0x0e, 0x67, 0xda, 0xe9, 0x74, + 0x5b, 0xaa, 0x56, 0xea, 0x23, 0xc1, 0x5a, 0xcd, 0xae, 0xd4, 0xa8, 0x28, + 0xd3, 0xfe, 0xc3, 0xfa, 0xe0, 0x43, 0x92, 0xd4, 0x92, 0x54, 0x57, 0x28, + 0xe9, 0xd1, 0x87, 0xb2, 0xe3, 0x68, 0x24, 0x9c, 0x2b, 0x96, 0x14, 0x35, + 0x97, 0xb5, 0xbf, 0xf1, 0xa0, 0xaa, 0x0f, 0x49, 0x0f, 0x6a, 0x74, 0xfc, + 0x66, 0xb7, 0x65, 0x03, 0xbc, 0xbc, 0xfe, 0xec, 0xcf, 0xf9, 0xb0, 0xe9, + 0xbf, 0x3e, 0xe9, 0x61, 0xe9, 0x21, 0x1b, 0xc2, 0x75, 0xf6, 0xb9, 0x53, + 0x92, 0x37, 0xbf, 0x6a, 0xa5, 0xae, 0x66, 0xb7, 0xa5, 0xc3, 0x47, 0x1e, + 0xd4, 0xe1, 0x35, 0xd3, 0x49, 0x7a, 0xcd, 0x06, 0x91, 0xf9, 0x81, 0x56, + 0xf1, 0x37, 0x33, 0x21, 0x5a, 0x92, 0xf4, 0xa3, 0x52, 0xf8, 0x0f, 0x25, + 0xfd, 0x68, 0x9c, 0xce, 0x3f, 0x5c, 0x0d, 0xed, 0x07, 0xdd, 0x7f, 0x3d, + 0x0c, 0xd9, 0xca, 0x86, 0x68, 0xe5, 0x05, 0x75, 0x85, 0x39, 0xf3, 0x4b, + 0x5f, 0xd7, 0xb8, 0x10, 0xae, 0x59, 0xbc, 0x61, 0x03, 0xb4, 0xcc, 0x9b, + 0x66, 0xfb, 0x2e, 0xe8, 0x93, 0xbf, 0xf7, 0xd8, 0x48, 0xd8, 0xd6, 0x46, + 0x98, 0x37, 0xec, 0xa3, 0x0b, 0x90, 0xf2, 0xc3, 0xb0, 0x7c, 0x8f, 0xfe, + 0xec, 0x87, 0xf5, 0xe4, 0x1f, 0x7e, 0x6a, 0xc3, 0xf3, 0xa9, 0xcf, 0x57, + 0xa7, 0x8f, 0xe4, 0xf1, 0x03, 0xb7, 0xdc, 0x77, 0x78, 0xe9, 0x57, 0xa6, + 0xab, 0x25, 0xb9, 0x2d, 0xa9, 0xf1, 0xb7, 0xcd, 0x2b, 0x3d, 0x1b, 0x80, + 0x90, 0xf9, 0x6a, 0x30, 0x8a, 0x93, 0x71, 0x8b, 0x81, 0xca, 0x73, 0x51, + 0x1a, 0xa4, 0xe5, 0xc4, 0x57, 0x8c, 0x7a, 0xfd, 0x20, 0x9d, 0xec, 0x03, + 0xef, 0x7a, 0x50, 0xa7, 0xce, 0x9d, 0xb6, 0xd3, 0xae, 0xda, 0xb9, 0xb8, + 0xe1, 0x72, 0x20, 0x99, 0x55, 0xe9, 0x99, 0x73, 0xa7, 0xec, 0x47, 0xa7, + 0x59, 0x14, 0xdd, 0xf7, 0xf8, 0x75, 0x19, 0xb5, 0x64, 0x56, 0xdd, 0xef, + 0x10, 0x99, 0xcf, 0x5b, 0xc9, 0x73, 0xa3, 0xaa, 0x82, 0x62, 0xa6, 0xde, + 0x1b, 0x36, 0xfd, 0x48, 0xb5, 0xca, 0x41, 0x75, 0x57, 0x5a, 0x32, 0xfd, + 0x68, 0xd8, 0x9e, 0x8e, 0x24, 0xbf, 0x09, 0x34, 0x14, 0x9b, 0x48, 0x61, + 0x60, 0x97, 0x61, 0xdc, 0x8f, 0x14, 0x16, 0xd7, 0xfe, 0x9f, 0xd4, 0xf6, + 0x1c, 0x56, 0xbc, 0xd2, 0x52, 0x6c, 0x3a, 0xaa, 0xed, 0xa9, 0xcb, 0xac, + 0x4c, 0x8f, 0x1c, 0x31, 0xc9, 0xef, 0x2f, 0xee, 0xd1, 0x7e, 0x5d, 0x1c, + 0xa4, 0x75, 0x36, 0xd4, 0xc7, 0xbd, 0x27, 0x6b, 0xbf, 0xa3, 0xbd, 0xe6, + 0x6c, 0x72, 0x90, 0x96, 0x34, 0x1a, 0xe8, 0x74, 0xe6, 0xf8, 0xf0, 0xc9, + 0x99, 0x76, 0x7b, 0x4d, 0xd8, 0x93, 0xcf, 0x0f, 0xac, 0x72, 0xc3, 0xc7, + 0x4f, 0xb4, 0xb5, 0xb4, 0x64, 0x03, 0xb5, 0x96, 0x96, 0x4e, 0xa4, 0xe5, + 0xb5, 0x24, 0x90, 0xab, 0xdd, 0x96, 0x7e, 0xe8, 0xb1, 0x63, 0xd2, 0xe7, + 0x9e, 0x50, 0xed, 0xeb, 0x35, 0x7d, 0xae, 0x92, 0x04, 0x4c, 0x2d, 0xba, + 0x90, 0x2b, 0xe9, 0xc4, 0x89, 0x76, 0xfa, 0xbd, 0x40, 0xad, 0x66, 0xc3, + 0xa4, 0x5c, 0xbb, 0x6a, 0x4b, 0xc7, 0x8f, 0xd7, 0x74, 0x46, 0x6d, 0x2d, + 0x6a, 0x18, 0xbe, 0x75, 0x7c, 0x69, 0xd8, 0xaf, 0xe3, 0xed, 0xb6, 0x96, + 0x6a, 0x1a, 0xb6, 0x91, 0x44, 0x72, 0xb9, 0x36, 0x6a, 0x35, 0x1b, 0x4f, + 0x25, 0x2f, 0xa4, 0x2a, 0xf5, 0x07, 0xd2, 0x77, 0xbf, 0x2b, 0xb5, 0x7f, + 0xda, 0x5b, 0x26, 0xc9, 0x72, 0x68, 0xb7, 0x6d, 0x9b, 0x2e, 0xc3, 0x6a, + 0xb1, 0x36, 0x1a, 0xb0, 0xa5, 0xc5, 0xe1, 0xfc, 0x8e, 0x4b, 0xaa, 0x2d, + 0x26, 0x7d, 0x5e, 0x4a, 0xba, 0x72, 0xc6, 0xd6, 0xb7, 0x8f, 0xdb, 0xe9, + 0xdc, 0x9c, 0xdd, 0x32, 0x76, 0xa1, 0x59, 0x7e, 0xb0, 0x99, 0x1b, 0xac, + 0x2d, 0xad, 0xfd, 0xaa, 0x64, 0xb1, 0xe6, 0x8d, 0x77, 0x46, 0x5a, 0x98, + 0xf2, 0xdd, 0xbe, 0xff, 0x5b, 0xc3, 0x58, 0xde, 0xf7, 0xf4, 0x61, 0x18, + 0x2a, 0xf6, 0x82, 0xa2, 0xc3, 0xb0, 0xa2, 0xd8, 0x85, 0xd9, 0xad, 0x27, + 0x78, 0xcb, 0x6b, 0x33, 0x5e, 0x8d, 0x15, 0x14, 0x83, 0xf4, 0xfb, 0xe1, + 0xa0, 0x18, 0x28, 0x9c, 0xb3, 0xbf, 0xdd, 0xb9, 0xc0, 0x2b, 0xff, 0x37, + 0x95, 0x34, 0x00, 0x2f, 0x1b, 0xa8, 0xb5, 0x01, 0x33, 0xbf, 0xfe, 0xa4, + 0x7d, 0xd7, 0x2f, 0x27, 0xfb, 0x7c, 0xaa, 0xbe, 0x24, 0xc5, 0xf6, 0xe6, + 0x33, 0x45, 0x3b, 0x1c, 0x04, 0x55, 0x19, 0x13, 0xa9, 0x54, 0x0c, 0x64, + 0x4c, 0xa4, 0x60, 0xae, 0xaa, 0x9e, 0x89, 0xed, 0x8d, 0x6b, 0x92, 0xe5, + 0x54, 0xdf, 0x53, 0x93, 0x8a, 0x52, 0xf3, 0xdb, 0x49, 0x00, 0x67, 0xf2, + 0x39, 0xa9, 0x5a, 0xad, 0x2b, 0x8a, 0xa2, 0xf5, 0xfd, 0xee, 0x33, 0x9a, + 0x1a, 0x68, 0xb7, 0x74, 0x81, 0x24, 0xf5, 0x54, 0x52, 0x49, 0xe7, 0x24, + 0x1b, 0x66, 0xe6, 0x6e, 0x76, 0xe4, 0xfe, 0x87, 0x32, 0xc1, 0x53, 0xe7, + 0xc6, 0xfc, 0x6f, 0x55, 0x93, 0x69, 0x9a, 0xfd, 0x9e, 0x8e, 0xf4, 0xa5, + 0x93, 0x92, 0x9e, 0x78, 0x40, 0xfa, 0x68, 0x12, 0x4a, 0xff, 0x84, 0xa4, + 0x73, 0x92, 0x9e, 0x92, 0xf4, 0xd9, 0xa2, 0xa4, 0x7e, 0xa0, 0x8f, 0x06, + 0x46, 0x4f, 0x2c, 0x48, 0xc7, 0x9e, 0xb7, 0xdd, 0x7b, 0x42, 0xd2, 0xb1, + 0x64, 0x99, 0x1f, 0xeb, 0xdb, 0xb2, 0x85, 0xbe, 0xf4, 0x68, 0x51, 0x3a, + 0x56, 0x0c, 0x14, 0xba, 0x1b, 0x40, 0x69, 0x18, 0xcc, 0xf5, 0xe9, 0xfb, + 0xa4, 0x0f, 0x7d, 0xcb, 0xa8, 0xa2, 0x40, 0xcd, 0xa4, 0xaf, 0x4f, 0x14, + 0xa5, 0x63, 0xc9, 0x6f, 0x8d, 0x1f, 0x0b, 0xa4, 0x63, 0xb2, 0x37, 0xe7, + 0xf9, 0xa0, 0x91, 0x4e, 0xcf, 0xd9, 0x90, 0xac, 0x46, 0x51, 0xea, 0x48, + 0xfa, 0xb8, 0xa4, 0xcf, 0x78, 0xaf, 0xc3, 0x7e, 0xda, 0x0a, 0x74, 0xec, + 0x9c, 0x7d, 0xfc, 0xad, 0x20, 0xd0, 0x4f, 0x9b, 0x38, 0x09, 0x20, 0x93, + 0x9a, 0x7d, 0xa9, 0xa4, 0x92, 0x3a, 0xfd, 0x9e, 0x9e, 0xf8, 0x68, 0x55, + 0xc7, 0x7e, 0x75, 0xf4, 0xbb, 0x45, 0x17, 0x22, 0xf6, 0x84, 0xa4, 0x4f, + 0xf5, 0xa5, 0x8f, 0xb9, 0x9b, 0x45, 0x15, 0xa5, 0xa3, 0x7d, 0xbb, 0xc7, + 0x39, 0xa5, 0x40, 0x4f, 0x3c, 0x20, 0xfd, 0xc6, 0x0b, 0x36, 0x50, 0xeb, + 0x09, 0x49, 0xa7, 0x8a, 0xd2, 0xa9, 0xbe, 0x5d, 0x36, 0x51, 0xdf, 0x06, + 0x6b, 0x3d, 0x71, 0xc8, 0x2e, 0x1b, 0xb7, 0xfc, 0x7e, 0x34, 0x7f, 0xd1, + 0xa7, 0x6e, 0xfd, 0xa1, 0x9b, 0x75, 0xf1, 0xc5, 0x17, 0x74, 0x73, 0xf5, + 0x56, 0xdd, 0x5c, 0xbd, 0x55, 0x77, 0x55, 0x35, 0x12, 0x74, 0xe5, 0xc2, + 0x9b, 0xfc, 0xa0, 0xa8, 0x5b, 0xf5, 0xfd, 0xf1, 0x81, 0x51, 0xdf, 0x79, + 0x45, 0x77, 0xdd, 0x65, 0x43, 0xab, 0xa4, 0x61, 0x18, 0x95, 0x7b, 0x74, + 0xc1, 0x54, 0xdf, 0xff, 0xc1, 0x1b, 0xe9, 0x3c, 0xf6, 0xdd, 0xfb, 0x76, + 0x9d, 0x3e, 0x7d, 0xda, 0xb6, 0x2b, 0x1b, 0x66, 0x75, 0xd7, 0x5b, 0x47, + 0x83, 0xb1, 0x5c, 0x00, 0x97, 0x2b, 0xcb, 0x6b, 0x2f, 0xf5, 0x03, 0xdb, + 0x07, 0xf7, 0x3a, 0x36, 0xb3, 0x4d, 0x17, 0xa6, 0xe5, 0x96, 0x99, 0x24, + 0x29, 0xf9, 0x2d, 0xc7, 0xb5, 0xbf, 0x53, 0xcb, 0x74, 0x9a, 0x20, 0xf9, + 0x32, 0xbc, 0xf9, 0x62, 0x4b, 0xd5, 0xbd, 0xd5, 0xe1, 0x3d, 0x08, 0xe6, + 0x87, 0x81, 0x5a, 0x26, 0xee, 0xa8, 0xba, 0xb7, 0xaa, 0xd6, 0x4b, 0x2d, + 0xd5, 0xef, 0xa9, 0xcb, 0xc4, 0x81, 0xea, 0x77, 0xd6, 0x65, 0x4c, 0xa0, + 0x85, 0xfb, 0xf7, 0xab, 0xd4, 0x0f, 0x14, 0xf5, 0xed, 0xb1, 0xd3, 0xf2, + 0x8b, 0xcb, 0xaa, 0xef, 0xad, 0x26, 0x41, 0x5a, 0x4d, 0x45, 0xed, 0x48, + 0x91, 0x22, 0x55, 0xf7, 0x54, 0x15, 0xcc, 0x87, 0x0a, 0xba, 0x91, 0xaa, + 0x07, 0xea, 0x8a, 0xe2, 0x48, 0xb1, 0xa4, 0x6a, 0x58, 0xb2, 0xe1, 0x53, + 0xa6, 0xa7, 0x83, 0xf7, 0x1c, 0x96, 0x29, 0x1a, 0xf5, 0x56, 0x8c, 0x34, + 0x27, 0x95, 0x8b, 0xf6, 0xdc, 0x03, 0x17, 0xa4, 0x15, 0x77, 0x5b, 0xaa, + 0x84, 0x75, 0x99, 0x38, 0xb9, 0x81, 0x40, 0x57, 0xaa, 0xec, 0xab, 0x2b, + 0xea, 0xc7, 0xea, 0xf5, 0x7b, 0x32, 0xab, 0x46, 0x9d, 0x0b, 0x2d, 0xed, + 0xbf, 0xe7, 0xa0, 0x24, 0xc9, 0xf4, 0x93, 0x80, 0xab, 0xd5, 0x8e, 0x3d, + 0x67, 0x60, 0x2e, 0x56, 0xbd, 0xd6, 0xb0, 0x41, 0x5a, 0x92, 0x5a, 0xed, + 0xa6, 0x2a, 0x95, 0xba, 0xe2, 0xb8, 0xa3, 0xea, 0xde, 0xba, 0x82, 0xbe, + 0x3d, 0x19, 0xc3, 0xa8, 0xa7, 0xd6, 0xab, 0x4d, 0xb5, 0x2e, 0x19, 0x95, + 0xbd, 0xf3, 0x04, 0xba, 0xdd, 0xae, 0xd4, 0x4f, 0x3a, 0x13, 0x94, 0xf4, + 0xc1, 0xf7, 0x1c, 0xd5, 0xd9, 0x73, 0x76, 0x4d, 0xef, 0xf5, 0x8d, 0x14, + 0x94, 0xa5, 0x62, 0xa0, 0x56, 0xdc, 0x54, 0x4d, 0x0d, 0x85, 0x61, 0x4f, + 0x52, 0xa8, 0x6e, 0xeb, 0xbc, 0x9a, 0xed, 0x92, 0xdc, 0xbd, 0xec, 0x82, + 0x62, 0x72, 0x5c, 0x1d, 0x48, 0xbd, 0x37, 0xd9, 0xe5, 0xfc, 0xf0, 0x91, + 0x43, 0x3a, 0x75, 0xce, 0x86, 0x44, 0x4b, 0xf6, 0xdc, 0x9f, 0x72, 0x51, + 0x5a, 0x36, 0x91, 0x16, 0x8a, 0xa1, 0x4c, 0x50, 0x92, 0x79, 0x23, 0x56, + 0xdc, 0x5e, 0x56, 0xab, 0x93, 0xb9, 0x71, 0xdd, 0x0c, 0xfb, 0xa1, 0xef, + 0xbe, 0xfa, 0x9a, 0x7e, 0xe4, 0x81, 0x23, 0x69, 0x70, 0xd4, 0xf7, 0xff, + 0xe3, 0xf7, 0xd2, 0x61, 0x3f, 0x50, 0xca, 0xe7, 0x82, 0xb8, 0xfc, 0xfa, + 0xef, 0xbe, 0xfa, 0x5a, 0x1a, 0x50, 0xe5, 0x0f, 0xe7, 0x4d, 0x3b, 0xa9, + 0x7e, 0xd2, 0x3c, 0xdd, 0x74, 0x7e, 0xff, 0x24, 0x1b, 0x46, 0x95, 0xad, + 0xcb, 0x4e, 0xbb, 0xa7, 0xb2, 0x37, 0x0d, 0x05, 0xf3, 0xc7, 0xfd, 0xee, + 0xab, 0xaf, 0xe9, 0x1d, 0x6f, 0x1b, 0xdf, 0x7e, 0xb6, 0xbd, 0xec, 0x78, + 0x79, 0xd3, 0xb8, 0xf9, 0xe4, 0x2d, 0xb3, 0xec, 0x6b, 0xcd, 0xeb, 0x7f, + 0x3a, 0xcf, 0x13, 0xc9, 0x5f, 0x5b, 0x36, 0x34, 0xeb, 0x84, 0xa4, 0x33, + 0x35, 0x5b, 0x70, 0x5c, 0xd2, 0x52, 0xcd, 0x0b, 0xda, 0x92, 0xf4, 0xd5, + 0x35, 0xb3, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xac, 0x03, 0xa1, 0x5a, 0x00, 0x00, 0x5c, 0x03, 0x8c, 0x8c, 0xd4, + 0x0f, 0xd4, 0x5b, 0x8d, 0x65, 0x32, 0x27, 0x18, 0x07, 0x73, 0xe5, 0xdc, + 0x90, 0x21, 0xd3, 0x4f, 0xea, 0xa4, 0x91, 0x60, 0x2d, 0x13, 0xc7, 0x2a, + 0x85, 0x95, 0xf4, 0x04, 0xe7, 0x58, 0x49, 0xb0, 0x56, 0xd2, 0xae, 0xbb, + 0x58, 0xd4, 0x9f, 0x4f, 0x30, 0x97, 0x73, 0xb1, 0x50, 0x52, 0x1f, 0xce, + 0x85, 0x6a, 0xc6, 0x91, 0x86, 0x97, 0xe8, 0x78, 0x77, 0x77, 0x96, 0xd6, + 0x06, 0x64, 0x05, 0x81, 0xca, 0x73, 0x61, 0x72, 0x46, 0xf5, 0x68, 0x5d, + 0x75, 0xbe, 0xa2, 0x68, 0x25, 0x52, 0x30, 0x17, 0xc8, 0xc4, 0xb1, 0x0d, + 0xab, 0xca, 0xbc, 0xa6, 0xce, 0x6b, 0x1d, 0x55, 0x6f, 0x09, 0xa5, 0xa0, + 0xa4, 0xa8, 0x63, 0xef, 0xb4, 0x1c, 0x9b, 0xd8, 0xce, 0xd7, 0xf4, 0x14, + 0xb8, 0x80, 0x80, 0x91, 0x20, 0x32, 0xa5, 0x27, 0xa7, 0x1f, 0x3e, 0x72, + 0x54, 0xf1, 0x4a, 0x64, 0xe7, 0xdc, 0x1f, 0xf6, 0xb6, 0xdb, 0x6d, 0xc9, + 0x64, 0x4e, 0x52, 0x2f, 0xcf, 0x95, 0x93, 0x40, 0x2d, 0x93, 0x5e, 0xd1, + 0x59, 0x9e, 0x0b, 0xd5, 0xb9, 0xdc, 0x51, 0x6d, 0x4f, 0x43, 0xed, 0xcb, + 0x4d, 0x99, 0xbe, 0x49, 0x5f, 0x63, 0x7a, 0x07, 0xec, 0xb9, 0x60, 0x18, + 0xf2, 0xb4, 0x41, 0xbd, 0x71, 0x27, 0x8e, 0xbb, 0xa0, 0xaa, 0x9c, 0x73, + 0x21, 0xe3, 0xd8, 0xa8, 0xbe, 0x27, 0x54, 0xeb, 0x72, 0xac, 0x6a, 0xf2, + 0x38, 0x32, 0x6d, 0x25, 0x50, 0x67, 0x4c, 0xa8, 0x96, 0x24, 0xc5, 0xab, + 0x92, 0xfa, 0x46, 0xe1, 0x7c, 0x39, 0x79, 0x0f, 0x86, 0x17, 0x0a, 0x05, + 0x45, 0xad, 0xf9, 0xdf, 0x93, 0xf2, 0xc3, 0xb4, 0xd2, 0xba, 0xbc, 0x20, + 0x8c, 0x34, 0xa8, 0x2a, 0x52, 0xbd, 0x52, 0x49, 0x03, 0xab, 0x6c, 0x55, + 0x52, 0x19, 0x78, 0xaf, 0x33, 0xf0, 0x26, 0xee, 0xdb, 0xba, 0x30, 0x2c, + 0xa9, 0xd5, 0xb6, 0x7d, 0x2b, 0x87, 0x81, 0x5a, 0xdd, 0xee, 0xe8, 0x4c, + 0x02, 0x8d, 0x04, 0x89, 0x8d, 0xbb, 0x83, 0xab, 0x8a, 0x46, 0x0a, 0x82, + 0xb5, 0xe1, 0x5d, 0xfd, 0xe1, 0x34, 0x91, 0x31, 0x23, 0xfd, 0x1c, 0x99, + 0x57, 0xb0, 0x36, 0x38, 0x2c, 0x9d, 0x7e, 0x83, 0x82, 0x20, 0x4c, 0x2f, + 0xe4, 0xf0, 0x87, 0x27, 0x8d, 0x2f, 0xcd, 0x16, 0xba, 0xe5, 0x18, 0x63, + 0xc6, 0xde, 0x9d, 0x36, 0x08, 0xec, 0x45, 0x26, 0xd9, 0x0b, 0x36, 0xa2, + 0x38, 0xca, 0x5c, 0x91, 0x69, 0xe5, 0x05, 0x11, 0x49, 0x99, 0x8b, 0xc4, + 0xc7, 0xf1, 0x96, 0xd3, 0xc4, 0x0b, 0x44, 0xfa, 0x6b, 0x87, 0x67, 0x6a, + 0x7f, 0x4c, 0xdb, 0xc6, 0x5f, 0x79, 0xfa, 0xa3, 0x8f, 0x71, 0x1c, 0x8f, + 0x5c, 0xbc, 0x33, 0x4d, 0x7a, 0x71, 0xcc, 0xdc, 0xe4, 0x8b, 0x4b, 0xe2, + 0x31, 0x41, 0x6f, 0xe3, 0xca, 0xd7, 0xdb, 0xce, 0x66, 0x4e, 0x73, 0x3d, + 0x8f, 0xbf, 0x55, 0x6d, 0x8f, 0x8c, 0x37, 0xe3, 0x27, 0xe4, 0xb7, 0x16, + 0x6c, 0x50, 0x93, 0xb4, 0xf5, 0x61, 0x5a, 0xae, 0xfc, 0xd4, 0xab, 0xba, + 0x26, 0xac, 0x27, 0x94, 0x6a, 0xa7, 0x5d, 0x7a, 0xf5, 0x55, 0x3d, 0xfb, + 0xf8, 0xe3, 0xe9, 0xf0, 0x46, 0x98, 0x7f, 0x7a, 0x4c, 0x8f, 0xcd, 0x3a, + 0xee, 0xac, 0xfb, 0x87, 0xfe, 0xf8, 0x5d, 0x97, 0x2a, 0xc3, 0x0b, 0xfb, + 0xd2, 0xad, 0x59, 0x37, 0xce, 0x0f, 0xa4, 0xba, 0x81, 0xc7, 0x9f, 0x18, + 0xa8, 0x35, 0x6e, 0xdd, 0x0e, 0xcb, 0x32, 0xdd, 0xbc, 0xfd, 0xc7, 0x94, + 0x0b, 0x04, 0x3f, 0xf6, 0x1b, 0x05, 0xfd, 0xf7, 0x0f, 0x0f, 0x26, 0x8f, + 0xa4, 0x91, 0x40, 0x2d, 0x7d, 0xe1, 0xa9, 0x0d, 0x06, 0x6a, 0x49, 0xf5, + 0x24, 0x24, 0xea, 0xd0, 0x7d, 0xf6, 0xf9, 0x83, 0x47, 0xbc, 0xca, 0x64, + 0x1b, 0x74, 0xee, 0x5b, 0x1b, 0x6a, 0x7a, 0x5d, 0xd2, 0x40, 0xad, 0xff, + 0xf9, 0x9f, 0x6c, 0xfd, 0xcc, 0x9c, 0xdf, 0x7c, 0x74, 0x38, 0xfc, 0x73, + 0x3f, 0xad, 0x7f, 0x22, 0xe9, 0x13, 0x7f, 0xf0, 0xe9, 0xd9, 0xa7, 0xaf, + 0xd7, 0xa4, 0x95, 0x8e, 0x34, 0x5f, 0x95, 0x64, 0x8f, 0x15, 0x3f, 0x76, + 0xf6, 0x29, 0x7d, 0xf4, 0xf0, 0x07, 0x67, 0x9a, 0xfc, 0xa9, 0xdf, 0x1e, + 0x1e, 0x23, 0xc4, 0xf2, 0xde, 0xbf, 0xaf, 0x9f, 0x55, 0xa8, 0xd1, 0x8b, + 0xec, 0x23, 0xef, 0x78, 0x62, 0x78, 0xc4, 0x5c, 0xd6, 0xe9, 0xaf, 0xc4, + 0x92, 0x3e, 0x3b, 0x73, 0x97, 0x3f, 0xf9, 0xcf, 0x4e, 0x65, 0x4a, 0xba, + 0x13, 0x87, 0x3f, 0xfe, 0xe8, 0x73, 0x63, 0x5a, 0xf2, 0xc7, 0xb5, 0x9f, + 0xdd, 0x4e, 0xff, 0x83, 0x4c, 0x08, 0x41, 0xda, 0xe7, 0xec, 0xa3, 0x14, + 0x5e, 0x3a, 0xa5, 0x53, 0x97, 0xb2, 0x7d, 0xc9, 0xf7, 0x8c, 0xca, 0x7a, + 0xa6, 0xbb, 0x3c, 0x53, 0x7f, 0x25, 0xe9, 0xc9, 0x6f, 0x95, 0xa5, 0x6f, + 0x99, 0x9c, 0x71, 0x32, 0x57, 0xdc, 0xaa, 0xac, 0x8a, 0xca, 0x69, 0x69, + 0xcb, 0xab, 0x77, 0xc3, 0x91, 0xa4, 0x4a, 0x12, 0x71, 0x19, 0x5e, 0x3a, + 0xa5, 0x66, 0xe6, 0x5a, 0xa9, 0x38, 0x79, 0x37, 0x1e, 0x9c, 0xe9, 0x95, + 0x60, 0xb7, 0x58, 0x78, 0x57, 0x59, 0xcd, 0xa6, 0x19, 0x09, 0x16, 0x6c, + 0xdc, 0x69, 0x64, 0x4c, 0x57, 0xf5, 0xdb, 0xed, 0x36, 0xb7, 0xa5, 0x96, + 0xea, 0xb7, 0xd7, 0xd5, 0xda, 0xd3, 0x56, 0x50, 0xb1, 0xdf, 0x6e, 0x34, + 0xea, 0x36, 0xb4, 0xbb, 0xbe, 0x50, 0xd7, 0xf2, 0xf3, 0x2f, 0x27, 0x53, + 0x9a, 0xb4, 0xcd, 0x56, 0xd3, 0xa8, 0x67, 0x86, 0xfb, 0x90, 0xda, 0x82, + 0xd4, 0x33, 0x46, 0xb5, 0x7d, 0x81, 0xda, 0x17, 0x03, 0x95, 0xcb, 0x81, + 0xc2, 0x95, 0xba, 0x1a, 0x35, 0xa9, 0x69, 0x8c, 0x1a, 0x35, 0xfb, 0xfd, + 0xc8, 0xa1, 0xfb, 0x02, 0x3d, 0xf3, 0xf4, 0xb0, 0x2f, 0xa6, 0x6f, 0xb4, + 0x7c, 0x41, 0x3a, 0xfa, 0x50, 0xa8, 0xe6, 0x45, 0xc9, 0x7d, 0xf9, 0x70, + 0xfa, 0x0b, 0x1d, 0x1d, 0x7d, 0xc8, 0x7e, 0xf7, 0xe1, 0x02, 0xb3, 0xca, + 0xf5, 0x40, 0xd5, 0x7d, 0x75, 0x35, 0xf6, 0x49, 0xcd, 0x8b, 0x52, 0x63, + 0x9f, 0xed, 0x51, 0x67, 0xb9, 0x63, 0x03, 0xae, 0xbc, 0xe0, 0x94, 0xc6, + 0x7d, 0xf6, 0x22, 0xd8, 0xc6, 0x3e, 0xa9, 0xb3, 0x3c, 0x1c, 0xa7, 0x71, + 0x8f, 0x6d, 0xaf, 0x71, 0x4f, 0xf2, 0x3d, 0x8f, 0xa9, 0x4b, 0x41, 0x69, + 0xa4, 0xcd, 0xe6, 0x45, 0x3b, 0xfe, 0xb0, 0x93, 0x3d, 0x35, 0x5f, 0x5a, + 0xbb, 0x6c, 0x3b, 0xcd, 0x58, 0xd5, 0x46, 0xa8, 0x43, 0xfb, 0xa4, 0xe7, + 0x2e, 0x18, 0x2d, 0x1c, 0x08, 0x64, 0xfa, 0x76, 0x99, 0x9a, 0xd7, 0x24, + 0x55, 0xa5, 0x46, 0x4d, 0x52, 0xcd, 0xe8, 0xf4, 0xd3, 0x6b, 0xf7, 0xcf, + 0x0b, 0xef, 0x09, 0xd5, 0xbc, 0x38, 0xfa, 0xd9, 0x74, 0xe1, 0xed, 0xa1, + 0xa2, 0x7e, 0xac, 0x7a, 0x4d, 0x6a, 0xf5, 0x8c, 0xea, 0xf5, 0xba, 0x5a, + 0x7b, 0x3b, 0x52, 0x7b, 0xf2, 0x7e, 0xf5, 0xf4, 0xff, 0xf6, 0xff, 0xe5, + 0x96, 0x7f, 0x6f, 0xe2, 0x54, 0x6b, 0x5d, 0xf8, 0xdd, 0xff, 0x3c, 0xd3, + 0x78, 0x07, 0x7e, 0xf1, 0xa6, 0x99, 0xc7, 0x1d, 0x67, 0xbd, 0x7d, 0x93, + 0xc6, 0xbf, 0x4e, 0xdf, 0xd1, 0x5f, 0xff, 0x1b, 0x33, 0x8d, 0xb7, 0xd9, + 0x66, 0x99, 0xe7, 0x4c, 0xcb, 0x6d, 0xca, 0x67, 0x2e, 0xf7, 0x9f, 0xd4, + 0x51, 0x12, 0x8c, 0x95, 0x0c, 0x87, 0x95, 0xaa, 0x62, 0x49, 0x2f, 0x37, + 0x97, 0x55, 0x2e, 0x87, 0x69, 0x58, 0x96, 0xfb, 0xcf, 0xf1, 0xc3, 0xb3, + 0x24, 0x29, 0xaa, 0xd4, 0xed, 0xb4, 0x5d, 0xff, 0x38, 0xb4, 0xa5, 0x58, + 0xf5, 0x34, 0x37, 0xb5, 0x23, 0x6f, 0xfc, 0x28, 0xd6, 0xfe, 0x72, 0x4b, + 0xcd, 0x4c, 0x5b, 0x1d, 0xd5, 0x25, 0xb5, 0x14, 0x45, 0xf1, 0x48, 0x28, + 0x7f, 0x6e, 0x9f, 0xbb, 0x2d, 0x75, 0x64, 0xe7, 0xdb, 0xf4, 0xfb, 0x12, + 0xd5, 0x75, 0xb8, 0x91, 0x84, 0x73, 0x49, 0xaa, 0xaa, 0xa5, 0x4e, 0x57, + 0x39, 0x7d, 0xb7, 0xeb, 0x57, 0x58, 0xa9, 0x8e, 0xf6, 0xc1, 0x7b, 0x74, + 0x01, 0x5b, 0xae, 0xbe, 0x5a, 0xa9, 0x4b, 0x79, 0x01, 0x56, 0xf7, 0x0f, + 0x83, 0xb5, 0x24, 0xa9, 0xfd, 0x4d, 0x29, 0xfc, 0xd7, 0x2e, 0xec, 0xca, + 0xbe, 0x8e, 0x91, 0xf0, 0xab, 0xfb, 0x95, 0xb6, 0x93, 0x0d, 0xc4, 0x72, + 0xe3, 0x8d, 0x04, 0x6a, 0xe5, 0x2e, 0x89, 0xe1, 0xfc, 0x36, 0x2c, 0xb9, + 0xe1, 0x80, 0x7a, 0xf6, 0xbb, 0x72, 0xd3, 0xef, 0x29, 0xe8, 0x97, 0xa5, + 0xe2, 0xe6, 0x86, 0xa3, 0xfb, 0x5a, 0x2b, 0x1d, 0x55, 0xe7, 0xca, 0xea, + 0x24, 0xdf, 0x99, 0x57, 0xdc, 0x0d, 0x2a, 0xfa, 0xd1, 0x48, 0xc0, 0xd6, + 0x53, 0x5f, 0xf8, 0x64, 0x1a, 0x6a, 0xe5, 0x97, 0x87, 0xc1, 0xb0, 0x6f, + 0xe3, 0xca, 0x83, 0x91, 0x40, 0xa7, 0xf5, 0x07, 0xb8, 0x54, 0x43, 0x49, + 0xab, 0x25, 0x95, 0xe7, 0xa4, 0x4e, 0xb7, 0xa7, 0x91, 0x90, 0xc3, 0x3c, + 0xb1, 0x0d, 0xe5, 0x90, 0xa4, 0x38, 0x8a, 0xe4, 0x3e, 0x13, 0x99, 0x2b, + 0x1d, 0x45, 0xab, 0x81, 0xca, 0x32, 0x0a, 0x6e, 0x0e, 0x14, 0xad, 0x06, + 0x2a, 0x79, 0xfb, 0xcf, 0xf8, 0x8a, 0x51, 0x6f, 0xd5, 0xe8, 0xc9, 0x2f, + 0x9e, 0x52, 0x79, 0xce, 0x05, 0x6a, 0x4d, 0xd6, 0x9b, 0xf6, 0x79, 0x4b, + 0x92, 0xd4, 0xb1, 0xdf, 0xdd, 0xfb, 0xdf, 0xad, 0x1b, 0xc9, 0xc6, 0xbd, + 0x99, 0x24, 0x14, 0x3f, 0x7b, 0x1c, 0xe9, 0xda, 0xad, 0x69, 0x5a, 0x52, + 0x72, 0x30, 0x57, 0x4e, 0xbe, 0xab, 0x6f, 0xd9, 0xff, 0xa1, 0x7e, 0x23, + 0x69, 0x23, 0x59, 0x4e, 0x7d, 0x93, 0xf3, 0x3f, 0x14, 0xa7, 0x73, 0xf2, + 0xe7, 0x3a, 0x8e, 0xe9, 0x47, 0xc9, 0xfb, 0x18, 0x24, 0xfd, 0xb5, 0x8f, + 0x7e, 0xc0, 0xbf, 0xe9, 0xdb, 0x1b, 0x87, 0x64, 0x6f, 0xb4, 0x60, 0xcc, + 0xc6, 0x3e, 0x3b, 0x5e, 0x8b, 0xc2, 0x62, 0x7d, 0x62, 0xfd, 0xd2, 0xa2, + 0x7d, 0x74, 0xa1, 0x51, 0x67, 0xd4, 0xd6, 0x62, 0xad, 0x26, 0x9d, 0x19, + 0xc6, 0x4d, 0x2d, 0xd6, 0x94, 0x24, 0xfd, 0x59, 0xed, 0x33, 0x67, 0x54, + 0x5b, 0x5c, 0xd4, 0xe2, 0xe2, 0x92, 0xce, 0x9c, 0xb1, 0xc1, 0x59, 0xed, + 0xb6, 0x6d, 0xc3, 0x0f, 0x99, 0x72, 0xe1, 0x5a, 0xbe, 0x5a, 0x4d, 0xfa, + 0xc1, 0x6f, 0x3d, 0xa1, 0x1f, 0xff, 0x5f, 0x24, 0xfd, 0x1f, 0x6d, 0x1d, + 0xff, 0x8a, 0x2d, 0x3f, 0x73, 0x26, 0x09, 0x9a, 0x5a, 0x94, 0x74, 0x46, + 0x5a, 0x3a, 0x3e, 0x9c, 0xe6, 0x4c, 0xbb, 0x3d, 0x6c, 0xb7, 0x66, 0x9f, + 0x2f, 0xd6, 0x6c, 0x2c, 0x96, 0x9b, 0x77, 0xdb, 0xeb, 0xe2, 0x52, 0x4d, + 0x3a, 0x71, 0x7c, 0xb4, 0x8d, 0xc5, 0x45, 0x3b, 0x0f, 0x1b, 0x00, 0xd6, + 0x1e, 0x79, 0x74, 0xf5, 0xff, 0xea, 0xd7, 0xec, 0xf0, 0x89, 0x13, 0xd2, + 0x92, 0xa4, 0x9a, 0xb7, 0x6c, 0x6c, 0xf0, 0x57, 0x4d, 0x4b, 0x4b, 0x6d, + 0x6f, 0x59, 0xd4, 0xe4, 0xff, 0xaf, 0x2f, 0x2d, 0xb9, 0x58, 0xac, 0xb6, + 0x96, 0x34, 0x0c, 0xc4, 0xd2, 0x09, 0x49, 0x8b, 0x49, 0xee, 0x82, 0x64, + 0x1b, 0x3f, 0x63, 0x97, 0xfd, 0x89, 0xe3, 0xd2, 0xe2, 0x92, 0x0b, 0x14, + 0xb3, 0x6d, 0x9d, 0x38, 0xae, 0x91, 0xe5, 0x3d, 0xd4, 0x56, 0xbb, 0x3d, + 0x1c, 0xff, 0xc4, 0xf1, 0xe4, 0xfd, 0x5b, 0x94, 0x6a, 0x67, 0x24, 0x5d, + 0xce, 0x9b, 0x66, 0xa8, 0x52, 0xc9, 0x6d, 0xd4, 0xe3, 0xaf, 0xc7, 0xb2, + 0xbf, 0x4b, 0x85, 0x95, 0xf4, 0x69, 0x1c, 0x77, 0xd3, 0xe7, 0x71, 0xdc, + 0x1d, 0xfe, 0x56, 0x92, 0x17, 0xb0, 0x35, 0x26, 0x74, 0xcb, 0xac, 0xc6, + 0x0a, 0x92, 0x36, 0x82, 0x24, 0x78, 0xc8, 0xfd, 0x06, 0x35, 0x12, 0x9c, + 0x95, 0xe5, 0xb6, 0x47, 0x57, 0x11, 0xa8, 0x55, 0x99, 0xaf, 0x8c, 0x16, + 0xba, 0x9b, 0x7b, 0xac, 0xe1, 0x05, 0x8b, 0x79, 0x7d, 0x8a, 0x57, 0xe3, + 0xf4, 0x79, 0xbc, 0x1a, 0xcf, 0xf4, 0x5b, 0x91, 0x49, 0xc2, 0xb2, 0x4c, + 0x72, 0x13, 0x91, 0x40, 0x3d, 0x19, 0x13, 0xab, 0xd3, 0x6d, 0x8e, 0xcc, + 0xa7, 0xd7, 0x37, 0x2a, 0xcf, 0xd9, 0xc0, 0xad, 0x72, 0x10, 0xa8, 0xd5, + 0xed, 0xa8, 0xbe, 0xc7, 0xae, 0xbb, 0xd1, 0x6a, 0xac, 0x40, 0x81, 0xa2, + 0x4e, 0x47, 0xa5, 0xb9, 0x40, 0xe7, 0x2f, 0x9e, 0x5d, 0x13, 0x4c, 0x3a, + 0x55, 0x76, 0xc3, 0x99, 0x04, 0x6b, 0x49, 0xa5, 0xd1, 0x1b, 0x9e, 0x5c, + 0x85, 0x63, 0x49, 0xdb, 0x1f, 0x3d, 0x67, 0x8f, 0x8e, 0xea, 0x49, 0xd0, + 0xd4, 0xc1, 0x64, 0x39, 0x9f, 0xef, 0xdb, 0xc0, 0xad, 0x0f, 0x7d, 0xcd, + 0x8e, 0xdf, 0x28, 0x1a, 0x2d, 0xa7, 0xbf, 0x19, 0xdb, 0x3e, 0xb8, 0xd0, + 0xac, 0x66, 0xd1, 0x06, 0x6d, 0x3d, 0xdc, 0xb7, 0xe1, 0x92, 0x67, 0x25, + 0x2d, 0xb8, 0x79, 0x48, 0x3a, 0x75, 0xc6, 0xbe, 0x86, 0x66, 0x5f, 0x3a, + 0x28, 0xe9, 0xbc, 0xec, 0xbc, 0x24, 0x9b, 0x67, 0x7f, 0xcc, 0x2d, 0x5b, + 0x23, 0x1d, 0x0d, 0xa4, 0x43, 0xab, 0x3d, 0xdb, 0x6e, 0x50, 0xb2, 0xe1, + 0x5b, 0xee, 0xb7, 0xf4, 0xa2, 0x6c, 0x70, 0x56, 0x31, 0xd0, 0xa7, 0x8b, + 0x81, 0x3e, 0xd2, 0xb7, 0x41, 0x5a, 0x9f, 0x4c, 0xf6, 0xb3, 0xfe, 0xb8, + 0x76, 0x38, 0x39, 0x66, 0x48, 0x6e, 0xe6, 0xf3, 0x41, 0xd9, 0x60, 0xac, + 0x8f, 0xf5, 0x87, 0xcb, 0x60, 0x7f, 0x20, 0x1d, 0x4b, 0x7e, 0x78, 0x3d, + 0xd8, 0xb7, 0x65, 0xee, 0x7f, 0xfc, 0x37, 0x5e, 0x08, 0xe4, 0xbe, 0x1d, + 0x3b, 0x26, 0xdb, 0x77, 0xc9, 0x2e, 0x1b, 0xc9, 0x06, 0x6b, 0xf9, 0xcb, + 0x61, 0x56, 0x2e, 0x5c, 0x4a, 0xb2, 0x81, 0x4f, 0xbe, 0xef, 0xff, 0xe0, + 0x8d, 0x34, 0xbc, 0x49, 0x92, 0x6e, 0xbb, 0xed, 0x36, 0x9d, 0xf6, 0x02, + 0xa2, 0x9c, 0x34, 0xd8, 0x69, 0x90, 0x04, 0x48, 0x25, 0xc1, 0x51, 0xfa, + 0x81, 0x1d, 0x76, 0x65, 0xce, 0x5d, 0x77, 0xdd, 0x25, 0x49, 0x3a, 0x7a, + 0xef, 0x6d, 0xf6, 0xf1, 0xe8, 0x51, 0x5d, 0x7c, 0xf1, 0x85, 0xb4, 0x1d, + 0x17, 0x2e, 0xa5, 0x37, 0x5e, 0x91, 0x06, 0xd2, 0x5d, 0xd5, 0x61, 0xdf, + 0xfc, 0x76, 0x7d, 0xae, 0xcd, 0x57, 0x5e, 0x79, 0x45, 0xb7, 0xdd, 0x76, + 0x9b, 0x6e, 0xbb, 0xed, 0xb6, 0x4d, 0x6f, 0xd3, 0x05, 0x5f, 0xf9, 0xaf, + 0xf9, 0xd6, 0x1f, 0xba, 0x59, 0xaf, 0x7c, 0xc7, 0xb6, 0xe9, 0xa6, 0xdf, + 0x89, 0x65, 0x3a, 0x8b, 0xde, 0x4a, 0x72, 0xd6, 0x47, 0x60, 0x14, 0x04, + 0x52, 0xfd, 0x40, 0x12, 0xe8, 0x7a, 0xc9, 0x1e, 0xb7, 0xb4, 0x56, 0xba, + 0x2a, 0x87, 0x65, 0x1b, 0xa8, 0xb5, 0x32, 0xdc, 0xbe, 0x1e, 0xbc, 0xef, + 0xa0, 0x3a, 0x71, 0x24, 0x93, 0x1c, 0xeb, 0x76, 0x2e, 0xd9, 0xcf, 0x2a, + 0x41, 0xf2, 0xbb, 0xfd, 0xa1, 0xf7, 0x1c, 0x51, 0xe7, 0x42, 0x4b, 0xa5, + 0xb9, 0x92, 0xaa, 0x7b, 0x93, 0xe3, 0x86, 0x03, 0x36, 0x30, 0x4a, 0xb2, + 0x9f, 0x25, 0xdc, 0xb6, 0xa2, 0x71, 0xcf, 0x82, 0xa2, 0x7e, 0x2c, 0xb3, + 0x62, 0x03, 0xb3, 0xe2, 0xcb, 0x1d, 0x69, 0xcf, 0xb0, 0x8f, 0x0b, 0x8b, + 0x87, 0xd5, 0xbd, 0x68, 0xdb, 0xaf, 0xde, 0x6e, 0xa7, 0x29, 0xed, 0x6d, + 0xa8, 0x27, 0xa3, 0xd6, 0xa5, 0x8e, 0xca, 0x73, 0x65, 0x45, 0x26, 0xd2, + 0xfe, 0xfb, 0x0f, 0x0e, 0x27, 0x32, 0x91, 0xdd, 0x5e, 0xc6, 0x91, 0xca, + 0x07, 0xea, 0x8a, 0xba, 0x46, 0xf5, 0x7a, 0x45, 0xad, 0x95, 0x40, 0x81, + 0x77, 0xdc, 0x1b, 0xcc, 0x55, 0x6d, 0x90, 0x57, 0x90, 0xdc, 0x54, 0xcd, + 0x0e, 0xaa, 0xb5, 0xda, 0x51, 0x79, 0xbe, 0xac, 0xf3, 0xed, 0x48, 0x07, + 0x6b, 0x65, 0xc9, 0x18, 0x35, 0xf6, 0x06, 0x7a, 0xee, 0x52, 0x57, 0x47, + 0xf6, 0x56, 0xd4, 0x6c, 0x2e, 0xab, 0xdb, 0x37, 0x6a, 0xcc, 0x07, 0x36, + 0xd8, 0xd5, 0xf4, 0xa4, 0xb9, 0x40, 0x41, 0x10, 0xa8, 0x24, 0x1b, 0x1a, + 0x56, 0xfa, 0x6b, 0xbb, 0x0c, 0x23, 0x45, 0xaa, 0x04, 0x65, 0x35, 0xbb, + 0x91, 0x1a, 0x95, 0xb2, 0x8c, 0xe9, 0x69, 0xa1, 0x1e, 0xea, 0xec, 0xab, + 0x1d, 0x1d, 0xbe, 0xb3, 0xaa, 0x56, 0xab, 0x6d, 0x03, 0x21, 0xc3, 0xb2, + 0xe2, 0x38, 0x09, 0x3a, 0x2c, 0x06, 0x76, 0xf9, 0x14, 0x83, 0x61, 0xf0, + 0x61, 0x31, 0x50, 0xac, 0x92, 0xc2, 0x37, 0x05, 0x6a, 0x5f, 0x89, 0x55, + 0xbb, 0x25, 0x94, 0x89, 0xa4, 0x6a, 0x75, 0xf2, 0x36, 0xf7, 0x27, 0xdf, + 0xb7, 0xa4, 0x3f, 0xfa, 0x93, 0x13, 0xfa, 0x95, 0xc7, 0x7e, 0xc9, 0x2e, + 0xef, 0x83, 0xff, 0x95, 0x9a, 0xe7, 0xdf, 0x96, 0xd6, 0x7f, 0xef, 0xe2, + 0x1d, 0xba, 0x63, 0x5f, 0xfe, 0xfe, 0xd2, 0x8d, 0xfb, 0xf4, 0x1f, 0x9f, + 0xd4, 0xaf, 0x3c, 0xf6, 0x4b, 0xfa, 0xde, 0xc5, 0x38, 0x1d, 0xf7, 0x37, + 0x3f, 0xfe, 0x3b, 0x99, 0x36, 0xff, 0x5c, 0xdf, 0xbb, 0x18, 0xeb, 0xfd, + 0x7f, 0xff, 0x91, 0x74, 0xbc, 0xa7, 0xff, 0xf8, 0xa4, 0xde, 0xff, 0xf7, + 0x1f, 0x19, 0x69, 0xf3, 0xe9, 0x3f, 0x3e, 0xa9, 0x5f, 0xfb, 0xcd, 0x7f, + 0xa4, 0xe6, 0xf9, 0x3f, 0x4f, 0xa7, 0x93, 0xa4, 0x3b, 0xf6, 0x3d, 0x92, + 0xf4, 0xc7, 0x4e, 0xeb, 0x1e, 0x7f, 0xa6, 0xfc, 0x7f, 0xeb, 0xc0, 0x2f, + 0xff, 0xbf, 0xba, 0xf0, 0xc9, 0xff, 0x42, 0xbf, 0x12, 0x3d, 0xa2, 0x9f, + 0xf9, 0x33, 0x1b, 0x70, 0xfc, 0xcf, 0xdf, 0xf6, 0xe1, 0x74, 0xfc, 0x77, + 0xbc, 0xed, 0x9d, 0x92, 0xa4, 0x5b, 0x7f, 0xf8, 0x0e, 0x49, 0xd2, 0x3b, + 0x86, 0x2f, 0x2f, 0x1d, 0x7e, 0xc7, 0xdb, 0xde, 0x39, 0x52, 0xee, 0xf8, + 0xd3, 0xb8, 0xb6, 0xf2, 0xa6, 0xcf, 0x9b, 0x66, 0xb8, 0x0c, 0x87, 0x7d, + 0x90, 0xa4, 0x3f, 0xfa, 0x93, 0x13, 0xfa, 0xc9, 0xf7, 0x2d, 0x49, 0x92, + 0xbe, 0xf1, 0xfc, 0xf0, 0x7b, 0xfe, 0xef, 0xbe, 0xfa, 0xda, 0x68, 0x43, + 0x6d, 0x49, 0xed, 0x9a, 0x1d, 0x58, 0xaa, 0x25, 0x07, 0x8b, 0xed, 0xa4, + 0x2c, 0x19, 0x3e, 0x2e, 0xfb, 0x57, 0x93, 0x74, 0xeb, 0xda, 0xbe, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x37, + 0xfe, 0x56, 0xd9, 0x00, 0x00, 0x60, 0xcb, 0x84, 0x61, 0x38, 0x30, 0x0f, + 0x1d, 0x96, 0x3e, 0x1b, 0xc9, 0x54, 0xf3, 0x43, 0x06, 0x82, 0x7d, 0x81, + 0x4c, 0x72, 0xf1, 0x61, 0xb0, 0x2f, 0xb9, 0x30, 0xe3, 0xa2, 0x49, 0x87, + 0xb1, 0x7d, 0xfc, 0xe5, 0xee, 0xbf, 0x27, 0xe6, 0x62, 0xfe, 0x49, 0xf7, + 0x41, 0xa7, 0x2e, 0xfd, 0x5c, 0x59, 0xc1, 0x17, 0xcf, 0x4a, 0x45, 0xe9, + 0xcb, 0xf3, 0x46, 0x87, 0x7f, 0xbe, 0xa2, 0x47, 0x7e, 0xb1, 0x9d, 0x3b, + 0x7e, 0x65, 0x4f, 0xa8, 0x6e, 0x12, 0x90, 0x55, 0xd9, 0x63, 0x4f, 0x48, + 0xec, 0x5e, 0x8e, 0xd3, 0x61, 0x6c, 0x1f, 0x7f, 0xb9, 0xfb, 0xef, 0x49, + 0xf7, 0x72, 0xfe, 0x05, 0x0d, 0x27, 0x7f, 0xb7, 0xa6, 0xb3, 0x8f, 0x77, + 0xf5, 0xde, 0x95, 0xe4, 0xff, 0xe3, 0xc7, 0x58, 0xaf, 0xaf, 0x17, 0x1b, + 0x5e, 0xaf, 0xbf, 0x74, 0x56, 0x12, 0xeb, 0xf5, 0xf5, 0xe4, 0x6a, 0xd6, + 0xeb, 0xa2, 0x8a, 0x3a, 0x79, 0xcb, 0x5f, 0xea, 0x47, 0x1e, 0xbd, 0x4d, + 0x0f, 0xff, 0x52, 0x3b, 0x77, 0xfc, 0xdb, 0xf7, 0xcc, 0xe9, 0xb5, 0xcb, + 0xab, 0xe9, 0xb0, 0x24, 0xbd, 0x76, 0x79, 0x35, 0x1d, 0xc6, 0xf6, 0xf1, + 0x97, 0xbb, 0xff, 0x9e, 0xb8, 0xe1, 0xac, 0x67, 0x7e, 0xa7, 0xa6, 0x6f, + 0x3c, 0xf9, 0xba, 0x1e, 0xb9, 0xf2, 0x66, 0xf5, 0xfb, 0x7d, 0x7d, 0xd9, + 0xd4, 0x75, 0xf8, 0xde, 0x48, 0x8f, 0x8c, 0x09, 0x34, 0xaa, 0xcc, 0x49, + 0xdd, 0xd5, 0xe1, 0xb0, 0x64, 0x9f, 0x57, 0x78, 0xab, 0xb7, 0x9d, 0xbf, + 0xdc, 0xfd, 0xf7, 0xa4, 0x3b, 0xe6, 0xa2, 0xef, 0x93, 0xf7, 0x49, 0x67, + 0x5f, 0x2c, 0xeb, 0xbd, 0x41, 0xcb, 0x1e, 0x9b, 0xad, 0xd6, 0x75, 0x78, + 0xaf, 0xd1, 0x23, 0x17, 0xa2, 0xdc, 0xf1, 0x2b, 0x61, 0xa0, 0x6e, 0x6c, + 0xd2, 0x61, 0x49, 0xea, 0xc6, 0x26, 0x1d, 0xc6, 0xf6, 0xf1, 0x97, 0xbb, + 0xff, 0x9e, 0xb8, 0xe1, 0xac, 0x93, 0x07, 0xca, 0x3a, 0x7b, 0x29, 0xd0, + 0x7b, 0xe7, 0xec, 0xb1, 0x58, 0xba, 0xbf, 0x7e, 0xb4, 0x9d, 0x3b, 0x7e, + 0xa5, 0x52, 0x51, 0x37, 0x09, 0x55, 0xad, 0x24, 0x41, 0xb0, 0xdd, 0x6e, + 0x37, 0x1d, 0xc6, 0xf6, 0xf1, 0x97, 0xbb, 0xff, 0x9e, 0x74, 0xfd, 0xd0, + 0x5b, 0xcf, 0xc9, 0x27, 0x47, 0xf7, 0xd7, 0x7f, 0xfb, 0x2f, 0x4f, 0xea, + 0x1f, 0xdf, 0xf6, 0x23, 0xfa, 0xa9, 0xf6, 0xc3, 0xb9, 0xe3, 0xff, 0xd7, + 0x73, 0xb7, 0xeb, 0x3f, 0xac, 0xbe, 0x96, 0x0e, 0x4b, 0xd2, 0x7f, 0x58, + 0x7d, 0x2d, 0x1d, 0xc6, 0xf6, 0xf1, 0x97, 0xbb, 0xff, 0x9e, 0xb8, 0xe1, + 0xac, 0x2f, 0xd4, 0x9e, 0xd1, 0x6f, 0xbf, 0xfe, 0x0d, 0xfd, 0xbb, 0x37, + 0x3f, 0xa2, 0xbe, 0xfa, 0x76, 0x1b, 0xce, 0xfe, 0xfa, 0xba, 0xb0, 0xe1, + 0xfd, 0xf5, 0x5c, 0x8b, 0xf5, 0xfa, 0x3a, 0x73, 0x35, 0xeb, 0xb5, 0x24, + 0x3e, 0x73, 0x5d, 0x47, 0xae, 0xea, 0x33, 0x97, 0xfa, 0xd3, 0x8f, 0xcd, + 0x6a, 0xa1, 0xba, 0xed, 0x38, 0x1d, 0x96, 0xa4, 0x6e, 0x3b, 0x4e, 0x87, + 0xb1, 0x7d, 0xfc, 0xe5, 0xee, 0xbf, 0x27, 0x6e, 0x38, 0xcb, 0x3f, 0x36, + 0x93, 0xa4, 0x85, 0xd5, 0x2f, 0xeb, 0xb1, 0x3d, 0x87, 0xf5, 0x48, 0xfb, + 0x91, 0xdc, 0xf1, 0xab, 0x73, 0x15, 0x75, 0x56, 0xbb, 0xe9, 0xb0, 0x24, + 0x75, 0x56, 0xbb, 0xe9, 0x30, 0xb6, 0x8f, 0xbf, 0xdc, 0xfd, 0xf7, 0xc4, + 0x0d, 0x67, 0x9d, 0xac, 0x9d, 0xd4, 0xc7, 0x2f, 0x9f, 0xd5, 0xf2, 0xdc, + 0x7b, 0xf9, 0xde, 0xec, 0x3a, 0xc3, 0xf7, 0x66, 0xbb, 0xc7, 0xd5, 0x7e, + 0x6f, 0xc6, 0xef, 0x5c, 0xd7, 0x8f, 0xab, 0xf9, 0x9d, 0xab, 0xa8, 0xa2, + 0xfe, 0xfa, 0x27, 0xde, 0x21, 0x7d, 0x3a, 0xd2, 0x5f, 0xde, 0x96, 0x1f, + 0x09, 0xfc, 0x37, 0xf7, 0xfd, 0x97, 0xfa, 0xab, 0x8b, 0xff, 0x29, 0x1d, + 0x96, 0xa4, 0xbf, 0xba, 0xf8, 0x9f, 0xd2, 0x61, 0x6c, 0x1f, 0x7f, 0xb9, + 0xfb, 0xef, 0x89, 0x1b, 0xce, 0x7a, 0xf3, 0xeb, 0x77, 0x48, 0x1f, 0x2a, + 0xeb, 0x4d, 0xff, 0xf2, 0xdf, 0xb2, 0x0d, 0xbf, 0xce, 0x6c, 0x74, 0x1b, + 0xfe, 0x13, 0x73, 0xaf, 0x4d, 0x5d, 0xa7, 0xef, 0x7f, 0xeb, 0x5b, 0xf5, + 0xcd, 0xef, 0x7c, 0x27, 0x1d, 0x96, 0xa4, 0x6f, 0x7e, 0xe7, 0x3b, 0xe9, + 0x30, 0xb6, 0x8f, 0xbf, 0xdc, 0xfd, 0xf7, 0xc4, 0x0d, 0x67, 0xf9, 0xeb, + 0xf4, 0xca, 0xca, 0x0a, 0xe7, 0x7b, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xc0, 0x3a, 0x4c, 0xb9, 0x27, 0x34, 0x00, 0x00, + 0xd8, 0x6a, 0x41, 0x67, 0xfc, 0xdd, 0xbd, 0xb3, 0xa7, 0x1f, 0x6f, 0xf7, + 0xe9, 0xc8, 0x3d, 0x9d, 0x55, 0x49, 0x87, 0xd5, 0x93, 0x0d, 0x91, 0x29, + 0x25, 0xf7, 0x2c, 0x76, 0xcf, 0x5d, 0x99, 0xff, 0xfc, 0x6a, 0x65, 0xdb, + 0xcb, 0xce, 0xd3, 0xd5, 0x97, 0xd6, 0x7f, 0xff, 0xe4, 0x0d, 0x0b, 0x66, + 0x18, 0x9e, 0xc5, 0xc9, 0xdf, 0xad, 0x4d, 0xa8, 0xcd, 0x5e, 0x1c, 0xb6, + 0xcd, 0x17, 0x8b, 0x7d, 0xb8, 0x25, 0x7d, 0xaa, 0x6e, 0x1f, 0x25, 0x3b, + 0xec, 0xca, 0x1d, 0xbf, 0x7e, 0x33, 0x64, 0xdb, 0xcb, 0xce, 0xd3, 0xd5, + 0x7f, 0x6a, 0xfc, 0x3a, 0xb2, 0xf9, 0xc2, 0x19, 0x86, 0xa7, 0x63, 0xbd, + 0x1e, 0xc5, 0x7a, 0x3d, 0xee, 0xf9, 0x16, 0x63, 0xbd, 0x4e, 0x6c, 0xce, + 0x7a, 0xfd, 0xcc, 0xef, 0xd4, 0x26, 0xd4, 0xce, 0x4f, 0x79, 0xbe, 0xc5, + 0x1e, 0x7d, 0x55, 0x7a, 0xf2, 0x4e, 0xfb, 0x28, 0xd9, 0x61, 0x57, 0xee, + 0xf8, 0xf5, 0x9b, 0x21, 0xdb, 0x5e, 0x76, 0x9e, 0xae, 0xde, 0x95, 0x6f, + 0x8b, 0xf9, 0x19, 0x86, 0xa7, 0x3b, 0x79, 0xdf, 0xa6, 0x74, 0x66, 0x6b, + 0x3c, 0xdf, 0x92, 0x1e, 0xa8, 0xdb, 0x47, 0xc9, 0x0e, 0xbb, 0x72, 0xc7, + 0xaf, 0xdf, 0x0c, 0xd9, 0xf6, 0xb2, 0xf3, 0x74, 0xf5, 0x0f, 0x6c, 0xe7, + 0x7a, 0xbd, 0x39, 0x4e, 0x1e, 0x28, 0x8f, 0xaf, 0xdc, 0x53, 0x9a, 0xfc, + 0x7c, 0xab, 0x7d, 0xfb, 0x65, 0xe9, 0xee, 0xfd, 0xf6, 0x51, 0xb2, 0xc3, + 0xae, 0xdc, 0xf1, 0xeb, 0x37, 0x43, 0xb6, 0xbd, 0xec, 0x3c, 0x5d, 0xbd, + 0x2b, 0xdf, 0x0e, 0xfe, 0x72, 0x1f, 0x37, 0x3c, 0x83, 0x93, 0x4f, 0xd6, + 0x26, 0xd4, 0x66, 0xeb, 0x26, 0x8d, 0xbb, 0x05, 0xd8, 0x5f, 0x27, 0x6a, + 0x33, 0x0c, 0x4f, 0xf7, 0x85, 0xda, 0x33, 0xe3, 0x2b, 0x77, 0x78, 0x77, + 0xfd, 0xdf, 0xbd, 0x2a, 0xfd, 0x9b, 0x3b, 0xed, 0xa3, 0x64, 0x87, 0x5d, + 0xb9, 0xe3, 0xd7, 0x6f, 0x86, 0x6c, 0x7b, 0xd9, 0x79, 0xba, 0xfa, 0x7f, + 0x73, 0xfd, 0xed, 0xae, 0xd9, 0x5f, 0x67, 0xdd, 0xc0, 0xfb, 0x6b, 0xd6, + 0xeb, 0x51, 0x37, 0xf2, 0x7a, 0xcd, 0x67, 0xae, 0x8c, 0x1b, 0xf9, 0x33, + 0xd7, 0xc4, 0x63, 0x33, 0xbe, 0x4b, 0xb9, 0x36, 0x8e, 0xcd, 0x36, 0xe7, + 0xbb, 0x94, 0x93, 0xb5, 0x93, 0xe3, 0x2b, 0x77, 0x78, 0xb5, 0x3e, 0xfa, + 0xaa, 0x74, 0xfa, 0x4e, 0xfb, 0x28, 0xd9, 0x61, 0x57, 0xee, 0xf8, 0xf5, + 0x9b, 0x21, 0xdb, 0x5e, 0x76, 0x9e, 0xae, 0xfe, 0xf4, 0xf5, 0xb7, 0x5a, + 0xb3, 0x0d, 0xcf, 0xba, 0x91, 0xb7, 0xe1, 0x1c, 0x87, 0x8f, 0xba, 0x81, + 0x8f, 0xc3, 0xf9, 0x9d, 0x6b, 0xd4, 0x8d, 0xfc, 0x3b, 0xd7, 0x9b, 0x5f, + 0xbf, 0x63, 0x6c, 0x5d, 0xf6, 0xa4, 0xc2, 0xed, 0x3e, 0xc9, 0x30, 0xd6, + 0x59, 0x85, 0x3a, 0xac, 0x38, 0x59, 0xce, 0x61, 0xb2, 0x7c, 0x63, 0xef, + 0xbd, 0xf0, 0xeb, 0x37, 0x43, 0xb6, 0xbd, 0xec, 0x3c, 0x5d, 0x7d, 0xb8, + 0x8d, 0xef, 0x75, 0x71, 0x86, 0xe1, 0x59, 0xb0, 0x0d, 0xcf, 0xb8, 0x41, + 0xb7, 0xe1, 0xe3, 0xd6, 0xe9, 0x65, 0xfd, 0x95, 0xde, 0xac, 0x3b, 0xd2, + 0x61, 0x49, 0x7a, 0xb3, 0xee, 0x48, 0x87, 0xb7, 0x03, 0xeb, 0xb4, 0xe5, + 0x2f, 0x77, 0xff, 0x3d, 0x71, 0xc3, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0xcd, 0xc3, 0x9d, 0x8b, 0x00, 0x00, 0xd8, + 0x01, 0x61, 0x18, 0x0e, 0xcc, 0x43, 0x53, 0x4e, 0xca, 0x7a, 0x4f, 0x24, + 0x3d, 0x5b, 0x1e, 0x7d, 0x2e, 0x0d, 0xcb, 0xdc, 0x73, 0x57, 0xe6, 0x3f, + 0xdf, 0xa8, 0xf7, 0x4b, 0x7a, 0x7a, 0x4c, 0xb9, 0x72, 0xea, 0xde, 0xef, + 0x0d, 0x3f, 0x9d, 0x53, 0x96, 0x95, 0x37, 0x8e, 0xdf, 0xe6, 0xb8, 0xf2, + 0x49, 0x7d, 0x70, 0x75, 0x79, 0xe5, 0xeb, 0x95, 0x5d, 0x8e, 0xd9, 0x65, + 0x9d, 0x7d, 0x3f, 0x9e, 0x9d, 0x10, 0xc4, 0x20, 0x29, 0xf8, 0xe2, 0x59, + 0xa9, 0x28, 0x7d, 0x79, 0x3e, 0xff, 0x8e, 0xc0, 0x4e, 0x78, 0x77, 0xa0, + 0xf8, 0xdb, 0x66, 0xe4, 0xb9, 0xa4, 0xb4, 0xcc, 0x3d, 0x77, 0x65, 0xfe, + 0xf3, 0x8d, 0xda, 0xbf, 0x18, 0xea, 0xe5, 0x33, 0x71, 0x6e, 0xb9, 0xa4, + 0x35, 0x75, 0xae, 0xdc, 0xaf, 0xf3, 0xcb, 0xb2, 0xf2, 0xc6, 0xf1, 0xdb, + 0x1c, 0x57, 0x3e, 0xa9, 0x0f, 0x93, 0xfa, 0xbd, 0x5e, 0xd9, 0xe5, 0x98, + 0x5d, 0xd6, 0xd9, 0xf7, 0xc3, 0x7f, 0x9e, 0xe7, 0xbd, 0x2b, 0xc9, 0x9d, + 0xa0, 0x7f, 0x8c, 0xf5, 0x7a, 0x4d, 0x9b, 0x37, 0xda, 0x7a, 0xfd, 0x25, + 0x7b, 0x82, 0x2d, 0xeb, 0xf5, 0x68, 0xd9, 0xa4, 0xf2, 0x49, 0x7d, 0x98, + 0xd4, 0xef, 0xf5, 0xda, 0x8a, 0xf5, 0xba, 0xa8, 0xa2, 0x4e, 0xde, 0xf2, + 0x97, 0x13, 0xc7, 0xbb, 0xe5, 0xee, 0x39, 0x5d, 0xf9, 0xf6, 0xea, 0xc8, + 0x73, 0x49, 0x69, 0x99, 0x7b, 0xee, 0xca, 0xfc, 0xe7, 0x1b, 0xd5, 0xf8, + 0x91, 0xb7, 0xa8, 0xf9, 0x8d, 0xbf, 0xc8, 0x2d, 0x97, 0xb4, 0xa6, 0xce, + 0x95, 0xfb, 0x75, 0x7e, 0x59, 0x56, 0xde, 0x38, 0x7e, 0x9b, 0xe3, 0xca, + 0x27, 0xf5, 0x61, 0x52, 0xbf, 0xd7, 0x2b, 0xbb, 0x1c, 0xb3, 0xcb, 0x3a, + 0xfb, 0x7e, 0xf8, 0xcf, 0xf3, 0x3c, 0x72, 0xe5, 0xcd, 0xe9, 0xdd, 0xda, + 0x27, 0x09, 0xe7, 0x22, 0xc5, 0xab, 0xe5, 0x91, 0xe7, 0x92, 0xd2, 0x32, + 0xf7, 0xdc, 0x95, 0xf9, 0xcf, 0x37, 0x6a, 0xff, 0x3e, 0xe9, 0xe5, 0x8b, + 0xf9, 0xe5, 0xd2, 0xda, 0x3a, 0x57, 0xee, 0xd7, 0xf9, 0x65, 0x59, 0x79, + 0xe3, 0xf8, 0x6d, 0x8e, 0x2b, 0x9f, 0xd4, 0x87, 0x49, 0xfd, 0x5e, 0xaf, + 0xec, 0x72, 0xcc, 0x2e, 0xeb, 0xec, 0xfb, 0xe1, 0x3f, 0xcf, 0xf3, 0xde, + 0xa0, 0x65, 0x8f, 0xcd, 0x56, 0xaf, 0xc1, 0xf7, 0xba, 0x52, 0xd2, 0xcb, + 0xdd, 0x5e, 0x6e, 0xb9, 0xa4, 0x35, 0x75, 0xae, 0xdc, 0xaf, 0xf3, 0xcb, + 0xb2, 0xf2, 0xc6, 0xf1, 0xdb, 0x1c, 0x57, 0x3e, 0xa9, 0x0f, 0x93, 0xfa, + 0xbd, 0x5e, 0x9b, 0xfe, 0x5e, 0xcf, 0xd9, 0x0b, 0x9f, 0xd8, 0x5f, 0x8f, + 0x96, 0x4d, 0x2a, 0x9f, 0xd4, 0x87, 0x49, 0xfd, 0x5e, 0xaf, 0xad, 0xda, + 0x5f, 0xff, 0xed, 0xbf, 0x9c, 0x10, 0xd8, 0x20, 0xe9, 0x6d, 0x73, 0xb7, + 0xe8, 0xcf, 0x56, 0xaf, 0x8c, 0x3c, 0x97, 0x94, 0x96, 0xb9, 0xe7, 0xae, + 0xcc, 0x7f, 0xbe, 0x51, 0x47, 0xdf, 0xd2, 0xd0, 0xe9, 0xbf, 0x68, 0xe6, + 0x96, 0x4b, 0x5a, 0x53, 0xe7, 0xca, 0xfd, 0x3a, 0xbf, 0x2c, 0x2b, 0x6f, + 0x1c, 0xbf, 0xcd, 0x71, 0xe5, 0x93, 0xfa, 0x30, 0xa9, 0xdf, 0xeb, 0x95, + 0x5d, 0x8e, 0xd9, 0x65, 0x9d, 0x7d, 0x3f, 0xfc, 0xe7, 0x79, 0xfe, 0xdd, + 0x9b, 0x1f, 0x51, 0x5f, 0xfd, 0x6b, 0x73, 0x1b, 0xce, 0xfe, 0x7a, 0xd3, + 0xb7, 0xe1, 0xac, 0xd7, 0xbb, 0x67, 0xbd, 0x96, 0xc4, 0x67, 0xae, 0x4c, + 0xd9, 0xa4, 0xf2, 0x49, 0x7d, 0x98, 0xd4, 0xef, 0xf5, 0xda, 0x92, 0xcf, + 0x5c, 0xea, 0x73, 0x6c, 0x96, 0x29, 0x9b, 0x54, 0x3e, 0xa9, 0x0f, 0x93, + 0xfa, 0xbd, 0x5e, 0x5b, 0xf5, 0x1d, 0xe9, 0xc2, 0xea, 0x97, 0x27, 0x8e, + 0x77, 0x70, 0x2e, 0xd4, 0xf9, 0xd5, 0x78, 0xe4, 0xb9, 0xa4, 0xb4, 0xcc, + 0x3d, 0x77, 0x65, 0xfe, 0xf3, 0x8d, 0x7a, 0x30, 0xdc, 0xaf, 0x53, 0xf1, + 0xda, 0x50, 0xe2, 0x07, 0x43, 0x1b, 0x1a, 0x9c, 0xad, 0x73, 0xe5, 0x7e, + 0x9d, 0x5f, 0x96, 0x95, 0x37, 0x8e, 0xdf, 0xe6, 0xb8, 0xf2, 0x49, 0x7d, + 0x98, 0xd4, 0xef, 0xf5, 0xca, 0x2e, 0xc7, 0xec, 0xb2, 0xce, 0xbe, 0x1f, + 0xfe, 0xf3, 0x3c, 0xcb, 0x73, 0xef, 0xe5, 0x7b, 0xb3, 0xdd, 0xb4, 0x0d, + 0xe7, 0x7b, 0xb3, 0x35, 0x65, 0x93, 0xca, 0x27, 0xf5, 0x61, 0x52, 0xbf, + 0xd7, 0x6b, 0xab, 0xbe, 0x37, 0xe3, 0x77, 0xae, 0x9c, 0x36, 0x6f, 0xc0, + 0xdf, 0xb9, 0x8a, 0x2a, 0xea, 0xaf, 0x7f, 0xe2, 0x1d, 0x93, 0xe7, 0xfb, + 0x77, 0x23, 0xe9, 0xab, 0xe5, 0xd1, 0xe7, 0xd2, 0xb0, 0xec, 0xef, 0x7a, + 0x7d, 0xfa, 0x6a, 0x79, 0xf4, 0xf9, 0x46, 0xfd, 0x3d, 0x49, 0xff, 0x62, + 0x4c, 0xb9, 0x72, 0xea, 0xfe, 0x9e, 0x37, 0xfc, 0x2f, 0x72, 0xca, 0xb2, + 0xf2, 0xc6, 0xf1, 0xdb, 0x1c, 0x57, 0x3e, 0xa9, 0x0f, 0xae, 0x2e, 0xaf, + 0x7c, 0xbd, 0xb2, 0xcb, 0x31, 0xbb, 0xac, 0xb3, 0xef, 0xc7, 0x57, 0x27, + 0xbf, 0xd7, 0x6f, 0xfa, 0x97, 0xff, 0x96, 0x6d, 0xf8, 0x2e, 0xd9, 0x86, + 0xff, 0xc4, 0xdc, 0x6b, 0xac, 0xd3, 0xd9, 0xb2, 0x49, 0xe5, 0x93, 0xfa, + 0xe0, 0xea, 0xae, 0xd1, 0x75, 0x7a, 0x65, 0x65, 0x85, 0xf3, 0xbd, 0x01, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x1d, 0xf8, + 0x91, 0x15, 0x00, 0x80, 0x1d, 0x10, 0x86, 0xe1, 0x60, 0xa7, 0xfb, 0x80, + 0x6d, 0xb2, 0xdd, 0xb7, 0xec, 0x05, 0x00, 0x6c, 0x9a, 0x22, 0x1b, 0xf1, + 0x5d, 0xa3, 0xdf, 0xef, 0xef, 0x74, 0x17, 0xb0, 0x5d, 0x58, 0xad, 0x81, + 0x1b, 0x0e, 0xfb, 0xeb, 0xdd, 0xa3, 0x2f, 0xf6, 0xd7, 0xbb, 0x05, 0xeb, + 0x35, 0x70, 0xe3, 0x61, 0x1b, 0x0e, 0xdc, 0x78, 0xd8, 0x5f, 0xef, 0x1e, + 0x7c, 0x6f, 0xb6, 0x8b, 0xb0, 0x5a, 0xef, 0x1a, 0x6c, 0xc3, 0x77, 0x0f, + 0xb6, 0xe1, 0x6c, 0x4b, 0x52, 0xc2, 0x00, 0x00, 0x20, 0x00, 0x49, 0x44, + 0x41, 0x54, 0xbb, 0x43, 0xb1, 0xc8, 0x3a, 0xbd, 0x5b, 0x10, 0xaa, 0x05, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xd6, 0xa3, 0xb0, 0xd3, 0x1d, 0x00, 0x00, 0x00, 0xd7, 0x97, + 0x30, 0x0c, 0x07, 0xdb, 0x3d, 0xcf, 0x38, 0x8e, 0x39, 0x66, 0xd9, 0x64, + 0xe1, 0xfc, 0xf6, 0xbf, 0x8f, 0x9b, 0x21, 0x5e, 0xe1, 0x7f, 0x61, 0x2b, + 0xec, 0xc4, 0xff, 0x03, 0xef, 0xe5, 0xe6, 0x63, 0xbd, 0xde, 0x3d, 0xe6, + 0xe7, 0xe7, 0xaf, 0xcb, 0xf7, 0x7a, 0x65, 0x65, 0x85, 0xf7, 0x7a, 0x0b, + 0x6c, 0xf7, 0xb1, 0x19, 0xc7, 0x65, 0x3b, 0x67, 0xbb, 0xb7, 0xf3, 0x6c, + 0x9f, 0xb7, 0x06, 0xfb, 0xeb, 0x1b, 0xdf, 0xf5, 0xba, 0x9f, 0xce, 0xc3, + 0xbe, 0x7b, 0xf3, 0xb0, 0x0d, 0xbf, 0xbe, 0xb1, 0x5e, 0xef, 0x3e, 0xd7, + 0xeb, 0x7b, 0xce, 0xfb, 0xbb, 0x7e, 0x1c, 0x9b, 0xdd, 0xf8, 0xae, 0xd7, + 0xf7, 0x38, 0x0f, 0xef, 0xfb, 0x6c, 0xd8, 0x86, 0xc3, 0xc7, 0xf7, 0x66, + 0xbb, 0x07, 0xbf, 0x73, 0xed, 0x1e, 0x3b, 0xb1, 0x9d, 0x67, 0x1b, 0xbd, + 0x33, 0xd8, 0x86, 0xef, 0x0e, 0x9c, 0x7f, 0x04, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd8, 0x4a, 0xc5, 0x9d, 0xee, 0x00, + 0x00, 0x00, 0xb8, 0xfe, 0x98, 0xa8, 0xb1, 0xb6, 0xac, 0x70, 0x4e, 0x61, + 0x18, 0xae, 0xa9, 0x1f, 0x57, 0xee, 0xd7, 0xb9, 0xf2, 0x71, 0xcf, 0xb1, + 0x35, 0xa2, 0x5f, 0xb7, 0xcb, 0xb6, 0xf0, 0x68, 0x5b, 0xe1, 0x7c, 0x98, + 0x5b, 0xe6, 0x9e, 0xfb, 0xc6, 0xd5, 0xe5, 0xb5, 0x33, 0x6e, 0x9a, 0xc2, + 0xa3, 0x6d, 0x0d, 0x9e, 0xac, 0x8d, 0xad, 0x1b, 0xd7, 0x1f, 0x6c, 0x1d, + 0x73, 0x65, 0xcc, 0x7a, 0x9d, 0x2c, 0x77, 0xbf, 0x7e, 0x5c, 0xb9, 0x5f, + 0xe7, 0xca, 0xc7, 0x3d, 0xc7, 0xd6, 0x60, 0xbd, 0xde, 0x3d, 0xae, 0x1c, + 0x4f, 0x96, 0xe3, 0xb1, 0x4b, 0x9a, 0x9f, 0x9f, 0xcf, 0x2d, 0x73, 0xcf, + 0x7d, 0xe3, 0xea, 0xf2, 0xda, 0x19, 0x37, 0x4d, 0xe1, 0xd8, 0x25, 0x0d, + 0x9e, 0xd8, 0x3b, 0xb6, 0x6e, 0x5c, 0x7f, 0xb0, 0x75, 0xa2, 0x3d, 0x55, + 0x49, 0x52, 0xe1, 0x42, 0x53, 0x83, 0x03, 0x8d, 0x74, 0xd8, 0x1d, 0x47, + 0xb9, 0xfa, 0x49, 0xe5, 0xd9, 0xfa, 0x6c, 0x9d, 0x2b, 0x0f, 0xc3, 0x70, + 0xc0, 0x05, 0x07, 0x3b, 0x27, 0xaa, 0xb8, 0xf7, 0xba, 0xa7, 0xc1, 0x81, + 0x52, 0x3a, 0x1c, 0xce, 0xc7, 0x23, 0xf5, 0x93, 0xca, 0xb3, 0xf5, 0xd9, + 0x3a, 0x57, 0x1e, 0xce, 0x87, 0x03, 0x2e, 0x0e, 0xdc, 0x1a, 0xec, 0xaf, + 0x6f, 0x7c, 0x9f, 0x0b, 0xaf, 0x48, 0x92, 0xde, 0x7d, 0xa9, 0x90, 0xee, + 0x03, 0x27, 0x95, 0x4d, 0x2a, 0x9f, 0xd6, 0xce, 0xb8, 0xe7, 0x79, 0xd3, + 0x8f, 0x6b, 0x77, 0xd2, 0xfc, 0xb0, 0x79, 0x86, 0xdb, 0xf0, 0xcc, 0xfe, + 0xda, 0xad, 0x77, 0x95, 0xcc, 0xfe, 0x3a, 0xa7, 0x3c, 0x5b, 0xbf, 0x76, + 0x1b, 0x6e, 0xcb, 0xd9, 0x86, 0x6f, 0x3e, 0xd6, 0xeb, 0xdd, 0x87, 0xcf, + 0x5c, 0xbb, 0x07, 0xc7, 0x66, 0x37, 0xbe, 0x93, 0x61, 0x24, 0x49, 0x7a, + 0xe7, 0xa5, 0x42, 0xba, 0xfc, 0x26, 0x95, 0x4d, 0x2a, 0x9f, 0xd6, 0xce, + 0xb8, 0xe7, 0x79, 0xd3, 0x8f, 0x6b, 0x77, 0xd2, 0xfc, 0x30, 0x1b, 0xb6, + 0xe1, 0xf0, 0xf1, 0xbd, 0xd9, 0xee, 0xc1, 0xef, 0x5c, 0xbb, 0xc7, 0x5f, + 0x5f, 0xb9, 0x73, 0x4d, 0xd9, 0x5f, 0x14, 0xce, 0xa5, 0xdb, 0x53, 0xbf, + 0x7e, 0x5c, 0xb9, 0x5f, 0xe7, 0xca, 0xc7, 0x3d, 0xc7, 0xce, 0x61, 0x1b, + 0xbe, 0x3b, 0x70, 0xfe, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x60, 0xab, 0xdc, 0xb4, 0xd3, 0x1d, 0x00, 0x00, 0x00, + 0xd7, 0x2f, 0x53, 0x38, 0x97, 0xfe, 0xa5, 0x65, 0xde, 0x09, 0x69, 0x92, + 0x14, 0x0c, 0x0e, 0x29, 0x8e, 0xe3, 0xdc, 0xe9, 0x70, 0x6d, 0x18, 0x3c, + 0x59, 0x53, 0xbc, 0x12, 0xe7, 0x5e, 0x1c, 0xe6, 0x14, 0x1e, 0x6d, 0xa7, + 0x7f, 0x79, 0x75, 0x7e, 0x3b, 0x7e, 0x59, 0x76, 0x78, 0xb3, 0xfa, 0x83, + 0xad, 0x93, 0xbb, 0x5e, 0x5f, 0xc9, 0x59, 0xaf, 0x57, 0x58, 0xaf, 0xaf, + 0x65, 0xac, 0xd7, 0xbb, 0xc7, 0xe0, 0x89, 0xbd, 0x5a, 0x59, 0x59, 0xc9, + 0xbd, 0x10, 0xd0, 0x29, 0x1c, 0xbb, 0x94, 0xfe, 0xe5, 0xd5, 0xf9, 0xed, + 0xf8, 0x65, 0xd9, 0xe1, 0xcd, 0xea, 0x0f, 0xb6, 0x97, 0x7f, 0xd1, 0x89, + 0x24, 0x0d, 0x0e, 0x34, 0xd6, 0x1c, 0x9b, 0xb9, 0xba, 0x3c, 0x93, 0xa6, + 0xc3, 0xb5, 0xc5, 0x0f, 0xdc, 0x92, 0xa4, 0xc1, 0x81, 0x92, 0xe2, 0x95, + 0xcc, 0xc5, 0xbe, 0x49, 0x5d, 0x9e, 0x49, 0xd3, 0x61, 0x6b, 0xb0, 0xbf, + 0xbe, 0xf1, 0x7d, 0x65, 0xef, 0x40, 0x2b, 0x2b, 0x2b, 0xb9, 0x81, 0x38, + 0x7e, 0x68, 0x8e, 0x3f, 0xae, 0x6f, 0x52, 0x5d, 0x5e, 0x59, 0x76, 0x5a, + 0xf7, 0x37, 0xae, 0x6e, 0xd6, 0x72, 0x6c, 0x3d, 0x3f, 0x70, 0x4b, 0x4a, + 0xf6, 0xbb, 0x2b, 0x1b, 0xdc, 0x5f, 0xaf, 0xb0, 0xbf, 0xde, 0x4a, 0xac, + 0xd7, 0xbb, 0x0f, 0x9f, 0xb9, 0x76, 0x0f, 0x8e, 0xcd, 0x6e, 0x7c, 0x7f, + 0xba, 0x77, 0xa0, 0x78, 0x25, 0xce, 0x0d, 0xba, 0xf2, 0xc3, 0xb0, 0xfc, + 0x71, 0x7d, 0x93, 0xea, 0xf2, 0xca, 0xb2, 0xd3, 0xba, 0xbf, 0x71, 0x75, + 0xb3, 0x96, 0x63, 0x76, 0x6c, 0xc3, 0x31, 0x0d, 0xdf, 0x9b, 0xdd, 0x98, + 0xf8, 0x9d, 0x6b, 0xf7, 0xf8, 0x8b, 0xc2, 0xb9, 0xf4, 0xcf, 0xf1, 0x03, + 0xb1, 0x24, 0xe9, 0x2d, 0x83, 0x43, 0x6b, 0x3e, 0x67, 0x65, 0xa7, 0xc1, + 0xf5, 0x89, 0x6d, 0xf8, 0x8d, 0x87, 0xf3, 0x8f, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9b, 0x8d, 0x50, 0x2d, 0x00, + 0x00, 0xb0, 0x61, 0xc1, 0xe0, 0x90, 0x82, 0xc1, 0x21, 0x49, 0x5a, 0xd7, + 0x1d, 0x1d, 0xfd, 0xe9, 0xa4, 0xd1, 0x13, 0xe0, 0xb2, 0x27, 0xc5, 0x61, + 0x7b, 0x0c, 0x9e, 0xac, 0x4d, 0xad, 0x77, 0xe3, 0xcc, 0x72, 0xf7, 0xe5, + 0xec, 0x38, 0xeb, 0xbd, 0x63, 0xf3, 0xb4, 0xfe, 0x60, 0xeb, 0x8c, 0xac, + 0xd7, 0xeb, 0x78, 0xdf, 0x26, 0xae, 0xd7, 0x57, 0x58, 0xaf, 0x77, 0x02, + 0xeb, 0xf5, 0xee, 0x31, 0x78, 0x62, 0xef, 0xd4, 0x7a, 0x37, 0xce, 0x2c, + 0x77, 0x55, 0xcf, 0x8e, 0xb3, 0xde, 0x3b, 0xb1, 0x4f, 0xeb, 0x0f, 0xb6, + 0x8e, 0xbb, 0x53, 0xfb, 0x46, 0xa7, 0x9b, 0x74, 0x81, 0x09, 0xae, 0x2d, + 0x83, 0x03, 0xa5, 0xab, 0x9a, 0x6e, 0x52, 0xb8, 0x16, 0xb6, 0x17, 0xfb, + 0xeb, 0x1b, 0xdf, 0x57, 0xf6, 0x0e, 0xb6, 0xa4, 0xdd, 0x77, 0x5f, 0x2a, + 0x4c, 0x6c, 0xfb, 0x2b, 0x7b, 0x07, 0x69, 0x7d, 0x76, 0x5f, 0xee, 0xd7, + 0xcd, 0x52, 0x8e, 0xcd, 0xc5, 0xfe, 0xfa, 0xfa, 0xc7, 0x7a, 0xbd, 0xfb, + 0xf0, 0x99, 0x6b, 0xf7, 0xe0, 0xd8, 0xec, 0xc6, 0xf7, 0xa7, 0x5b, 0xb4, + 0x4d, 0x7c, 0xe7, 0xa5, 0xc2, 0xc4, 0xb6, 0xff, 0x74, 0xef, 0x20, 0xad, + 0xcf, 0xfe, 0x1f, 0xf8, 0x75, 0xb3, 0x94, 0x63, 0x7d, 0xd8, 0x86, 0xc3, + 0xe1, 0x38, 0x7c, 0xf7, 0xe0, 0x77, 0xae, 0xdd, 0xe3, 0x2d, 0x83, 0x43, + 0x7a, 0x4b, 0xf2, 0x9e, 0xad, 0x67, 0x7b, 0xec, 0x4f, 0x27, 0x8d, 0x06, + 0x70, 0x65, 0x43, 0xb9, 0x70, 0x6d, 0x60, 0x1b, 0xbe, 0x3b, 0x70, 0xfe, + 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, + 0xb3, 0x11, 0xaa, 0x05, 0x00, 0x00, 0x36, 0x6c, 0xd2, 0x1d, 0x1f, 0xfd, + 0x93, 0xd6, 0xa6, 0x8d, 0x1f, 0x86, 0xe1, 0xe8, 0xdd, 0x26, 0x93, 0xe1, + 0xf5, 0x9c, 0x28, 0x87, 0x8d, 0x2b, 0x3c, 0xda, 0x1e, 0x79, 0x1c, 0x37, + 0xce, 0xa4, 0xfa, 0xf5, 0x9a, 0x74, 0x41, 0xd8, 0x2c, 0xfd, 0xc1, 0xd6, + 0xd9, 0xb4, 0xf5, 0x7a, 0x7e, 0xcc, 0x7a, 0xbd, 0xce, 0x8b, 0x07, 0xb1, + 0x31, 0xac, 0xd7, 0xbb, 0x47, 0xe1, 0xd8, 0xa5, 0x91, 0xc7, 0x71, 0xe3, + 0x4c, 0xaa, 0x5f, 0xaf, 0x49, 0x17, 0xff, 0xcd, 0xd2, 0x1f, 0x6c, 0x9d, + 0x49, 0x17, 0x86, 0x4c, 0xba, 0xe8, 0xc4, 0xbf, 0x23, 0x3b, 0xae, 0x0f, + 0x93, 0x42, 0xb1, 0x26, 0x05, 0x6e, 0xb9, 0xe9, 0x36, 0x1a, 0xca, 0x85, + 0xcd, 0xc5, 0xfe, 0xfa, 0xc6, 0xf7, 0xee, 0x4b, 0x85, 0x91, 0xc7, 0x3c, + 0x57, 0x13, 0x76, 0x33, 0xa9, 0xdd, 0x77, 0x5f, 0x2a, 0xac, 0xa9, 0xcf, + 0x2b, 0x9b, 0x54, 0x8e, 0xad, 0xc1, 0xfe, 0xfa, 0xfa, 0xc6, 0x7a, 0xbd, + 0xfb, 0xf0, 0x99, 0x6b, 0xf7, 0xe0, 0xd8, 0xec, 0xc6, 0xf7, 0xce, 0x64, + 0xbb, 0xf8, 0xce, 0x09, 0xdb, 0xc7, 0xab, 0x09, 0xb1, 0x9a, 0xd4, 0xee, + 0x3b, 0x2f, 0x15, 0xd6, 0xd4, 0xe7, 0x95, 0x4d, 0x2a, 0xc7, 0xfa, 0xb1, + 0x0d, 0x87, 0x8f, 0xe3, 0xf0, 0xdd, 0x83, 0xdf, 0xb9, 0x76, 0x8f, 0xbf, + 0x28, 0x9c, 0x1b, 0x1b, 0x7e, 0xf5, 0x96, 0x9c, 0xf7, 0x7a, 0xdc, 0xf8, + 0xf3, 0xf3, 0xf3, 0x23, 0xe5, 0x6e, 0x78, 0xbd, 0xc1, 0x89, 0xd8, 0x3a, + 0x6c, 0xc3, 0x77, 0x07, 0xce, 0x3f, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x6c, 0x36, 0x42, 0xb5, 0x00, 0x00, 0xc0, + 0x86, 0xb9, 0x3b, 0x3e, 0x06, 0x83, 0x43, 0x8a, 0xe3, 0x78, 0xa4, 0x2e, + 0xef, 0xe4, 0xb5, 0xec, 0x1d, 0x22, 0x7d, 0xd9, 0x13, 0xd8, 0xdc, 0xf3, + 0x38, 0x8e, 0xb9, 0x7a, 0x64, 0x1b, 0x4c, 0xbb, 0x38, 0x6b, 0xf0, 0x64, + 0x2d, 0xfd, 0x8b, 0x57, 0xe2, 0x35, 0x75, 0xd9, 0x36, 0xa2, 0x5f, 0x0f, + 0x47, 0xea, 0xdd, 0x34, 0xd9, 0xf9, 0x8c, 0x9b, 0x2f, 0x17, 0x8b, 0xed, + 0x9c, 0x91, 0xf5, 0x7a, 0xe5, 0x2a, 0xd7, 0xeb, 0xcc, 0x85, 0x05, 0xee, + 0x79, 0xbc, 0xc2, 0x7a, 0xbd, 0x1d, 0x58, 0xaf, 0x77, 0x8f, 0x69, 0x17, + 0xe2, 0x0d, 0x9e, 0xd8, 0x9b, 0xfe, 0xad, 0xac, 0xac, 0xac, 0xa9, 0xcb, + 0xb6, 0x71, 0xe5, 0x78, 0x38, 0x52, 0xef, 0xa6, 0xc9, 0xce, 0x67, 0xdc, + 0x7c, 0xb9, 0x30, 0xf0, 0xda, 0xb4, 0xd1, 0x3b, 0xb1, 0x73, 0x27, 0xf7, + 0xeb, 0xcf, 0xa4, 0xc0, 0xad, 0x49, 0x5c, 0xd0, 0xd6, 0x46, 0xa7, 0xc7, + 0xc6, 0xb0, 0xbf, 0xbe, 0xf1, 0x4d, 0x0b, 0xb5, 0x99, 0x25, 0x98, 0x67, + 0xdc, 0x38, 0x93, 0x2e, 0xee, 0xfc, 0xca, 0xde, 0x41, 0xfa, 0xe7, 0xf6, + 0xe5, 0xee, 0xf9, 0xb8, 0x71, 0xb1, 0xf3, 0xd8, 0x5f, 0x5f, 0x1f, 0x58, + 0xaf, 0x77, 0x1f, 0x3e, 0x73, 0xed, 0x1e, 0x1c, 0x9b, 0xdd, 0xf8, 0xa6, + 0x85, 0x55, 0xcd, 0x12, 0xb8, 0x35, 0x6e, 0x9c, 0x49, 0x21, 0x2b, 0x7f, + 0xba, 0x77, 0x90, 0xfe, 0xb9, 0xff, 0x03, 0xf7, 0x7c, 0xdc, 0xb8, 0xd8, + 0x1c, 0x6c, 0xc3, 0x31, 0x0b, 0x8e, 0xc3, 0x6f, 0x2c, 0xfc, 0xce, 0xb5, + 0x7b, 0xbc, 0x65, 0x70, 0x28, 0xfd, 0xcb, 0x6e, 0xc3, 0xf3, 0xc2, 0xb3, + 0xdc, 0xb8, 0x79, 0xb2, 0x9f, 0xc5, 0xdc, 0xf3, 0x95, 0x95, 0x15, 0xde, + 0xeb, 0x6b, 0x1c, 0xdb, 0xf0, 0x1b, 0x07, 0xe7, 0x1f, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x76, + 0x54, 0x18, 0x86, 0x03, 0x49, 0xb9, 0x7f, 0x1b, 0xa9, 0x4b, 0xca, 0xd7, + 0xb4, 0xeb, 0xca, 0xb1, 0x35, 0xc2, 0xf9, 0xcc, 0xf2, 0x9e, 0x0f, 0x07, + 0x79, 0x65, 0x1a, 0xf7, 0x7e, 0x8e, 0xa9, 0xcb, 0x6b, 0x67, 0x5a, 0xdd, + 0xb8, 0x79, 0x8f, 0xe9, 0x0f, 0xb6, 0xc0, 0x46, 0xde, 0xeb, 0x49, 0x75, + 0xee, 0xbd, 0xe2, 0x3d, 0xdc, 0x5e, 0xac, 0xd7, 0xbb, 0xc7, 0xfc, 0xfc, + 0xfc, 0xc8, 0x72, 0x9c, 0x9f, 0x9f, 0x1f, 0xe4, 0x95, 0x69, 0xcc, 0x7b, + 0x3d, 0xae, 0x2e, 0xaf, 0x9d, 0x69, 0x75, 0xe3, 0xe6, 0x3d, 0xa6, 0x3f, + 0xd8, 0x02, 0x9b, 0x7d, 0x6c, 0x36, 0xa9, 0x2e, 0x0c, 0x43, 0x8e, 0xd1, + 0x76, 0x90, 0xdd, 0x66, 0xd6, 0x72, 0xff, 0x36, 0xbb, 0xce, 0xdb, 0x66, + 0x63, 0x93, 0xb1, 0xbf, 0xbe, 0xf1, 0x6d, 0xe7, 0x7e, 0x7a, 0xb3, 0xda, + 0x9d, 0x50, 0x8e, 0x4d, 0xb2, 0xd9, 0x9f, 0xb9, 0x26, 0xd5, 0xb1, 0x0d, + 0xdf, 0x7c, 0xac, 0xd7, 0xbb, 0x0f, 0x9f, 0xb9, 0x76, 0x0f, 0x8e, 0xcd, + 0x6e, 0x7c, 0xdb, 0xf9, 0x1e, 0x6f, 0x56, 0xbb, 0x13, 0xca, 0x31, 0x03, + 0xb6, 0xe1, 0xf0, 0xf1, 0xbd, 0xd9, 0xee, 0xc1, 0xef, 0x5c, 0xbb, 0xc7, + 0x46, 0xb6, 0xe1, 0x93, 0xea, 0xdc, 0x36, 0x98, 0x6d, 0xf3, 0xb5, 0x87, + 0x6d, 0xf8, 0xee, 0xc0, 0xf9, 0x47, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0xad, 0xc4, 0x9d, 0x97, 0x00, 0x00, 0xc0, + 0xba, 0x6c, 0xc5, 0xc9, 0x66, 0x71, 0x1c, 0x17, 0xf2, 0xda, 0xe5, 0x2e, + 0x91, 0x5b, 0xe7, 0x7a, 0x3d, 0xe9, 0x9b, 0x3b, 0x3f, 0x6f, 0x8d, 0xad, + 0xf8, 0x7f, 0x88, 0x57, 0xe2, 0x42, 0x5e, 0xbb, 0xbc, 0x87, 0x5b, 0x87, + 0xf5, 0x7a, 0xf7, 0xb8, 0x5e, 0x2f, 0xe6, 0xe0, 0x8e, 0xee, 0x5b, 0x63, + 0xbb, 0x2f, 0x04, 0xe0, 0xf8, 0x6c, 0xe7, 0x6c, 0xf7, 0x76, 0x9e, 0xed, + 0xf3, 0xd6, 0x60, 0x7f, 0x7d, 0xe3, 0xbb, 0x5e, 0xf7, 0xd3, 0x79, 0xd8, + 0x77, 0x6f, 0x1e, 0xb6, 0xe1, 0xd7, 0x37, 0xd6, 0xeb, 0xdd, 0xe7, 0x7a, + 0x7d, 0xcf, 0x79, 0x7f, 0xd7, 0x8f, 0x63, 0xb3, 0x1b, 0xdf, 0xf5, 0xfa, + 0x1e, 0xe7, 0xe1, 0x7d, 0x9f, 0x0d, 0xdb, 0x70, 0xf8, 0xf8, 0xde, 0x6c, + 0xf7, 0xe0, 0x77, 0xae, 0xdd, 0x63, 0x2b, 0xb6, 0xf3, 0x2b, 0x2b, 0x2b, + 0x85, 0xbc, 0x76, 0xd9, 0x36, 0xef, 0x2c, 0xb6, 0xe1, 0xbb, 0x03, 0xe7, + 0x1f, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0xcd, 0x56, 0xd8, 0xe9, 0x0e, 0x00, 0x00, 0xb0, 0x1b, 0x0d, 0x06, + 0x83, 0x81, 0x1b, 0x2e, 0x14, 0x0a, 0x85, 0x49, 0xe5, 0x7e, 0xd9, 0xac, + 0x75, 0x53, 0xdb, 0xb9, 0x7b, 0xff, 0x70, 0xfc, 0x0b, 0xcd, 0xe1, 0xfc, + 0x0f, 0x34, 0x06, 0xd9, 0x72, 0xbf, 0x6c, 0xd6, 0xba, 0x69, 0xed, 0xf8, + 0xf3, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x36, 0xc3, 0x4d, 0x3b, 0xdd, 0x01, 0x00, 0x00, 0x76, 0x3b, + 0x17, 0x76, 0x95, 0x17, 0x90, 0x95, 0x57, 0x36, 0xa9, 0x7c, 0x43, 0xf3, + 0x4f, 0xc2, 0xae, 0xf2, 0x02, 0xb2, 0xf2, 0xca, 0x26, 0x95, 0x03, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3b, + 0x85, 0x50, 0x2d, 0x00, 0x00, 0xae, 0x01, 0xb3, 0x84, 0x64, 0x15, 0x0a, + 0x85, 0xc2, 0xb4, 0xb2, 0xbc, 0x71, 0x66, 0x69, 0x7b, 0x96, 0x90, 0xac, + 0xc2, 0x85, 0xe6, 0xda, 0xf9, 0x67, 0xca, 0xf2, 0xc6, 0x21, 0x80, 0x0b, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xdb, 0x81, 0x50, 0x2d, 0x00, 0x00, 0x76, 0x81, 0x59, 0x82, 0xb5, 0xb6, + 0x74, 0xfe, 0x04, 0x6b, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x60, 0x8b, 0x11, 0xaa, 0x05, 0x00, 0xc0, 0x0e, + 0x2b, 0x14, 0x0a, 0x05, 0xff, 0x71, 0x9c, 0xad, 0x0a, 0xc6, 0x2a, 0x5c, + 0x68, 0x16, 0xfc, 0xc7, 0xb1, 0xf3, 0x27, 0x18, 0x0b, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd7, 0x30, 0x42, + 0xb5, 0x00, 0x00, 0xb8, 0x06, 0x4c, 0x0b, 0xd4, 0xda, 0xea, 0xb6, 0xa7, + 0x05, 0x6a, 0x5d, 0xd5, 0xfc, 0xb7, 0xb0, 0x6d, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x21, 0x54, 0x0b, + 0x00, 0x80, 0xeb, 0x44, 0x5e, 0x38, 0xd6, 0x60, 0x30, 0x18, 0x4c, 0x7a, + 0x3e, 0x69, 0xda, 0x75, 0xcf, 0x3f, 0x27, 0x1c, 0x6b, 0x70, 0xa0, 0x31, + 0x98, 0xf4, 0x7c, 0xd2, 0xb4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x66, 0x22, 0x54, 0x0b, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xd7, 0xbd, 0xc2, 0x4e, 0x77, 0x00, 0x00, 0x80, 0xdd, 0x6a, 0x30, + 0x18, 0x0c, 0xb2, 0x65, 0x85, 0x42, 0xa1, 0x30, 0xae, 0x6e, 0x96, 0x7a, + 0x37, 0xce, 0x7a, 0xdb, 0xce, 0xab, 0x9b, 0xb5, 0x6c, 0xcd, 0xbc, 0x0f, + 0x34, 0xd6, 0xb6, 0x7f, 0xa1, 0x69, 0xa7, 0xcb, 0xa9, 0x9b, 0xa5, 0xde, + 0x8d, 0xb3, 0xde, 0xb6, 0xf3, 0xea, 0x66, 0x2d, 0xcb, 0x6b, 0x07, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd7, + 0xae, 0x9b, 0x76, 0xba, 0x03, 0x00, 0x00, 0xec, 0x46, 0xe3, 0x42, 0xa9, + 0x26, 0x85, 0x65, 0xcd, 0x52, 0xbf, 0x55, 0xf3, 0x9d, 0x75, 0xdc, 0x71, + 0xa1, 0x54, 0x93, 0xc2, 0xb2, 0x66, 0xa9, 0x9f, 0xda, 0xa7, 0x0d, 0xce, + 0x77, 0x33, 0xfb, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x80, 0x9d, 0x45, 0xa8, 0x16, 0x00, 0x00, 0x3b, 0xac, + 0x50, 0x28, 0x14, 0xd6, 0x5b, 0x5f, 0x48, 0x8c, 0x2b, 0xcb, 0xab, 0x5b, + 0xef, 0x7c, 0x67, 0x09, 0xda, 0x2a, 0x64, 0x8c, 0xd4, 0x5d, 0x68, 0x4e, + 0x7e, 0x5d, 0x39, 0xf5, 0x85, 0x0b, 0xcd, 0x42, 0xb6, 0xdc, 0x2f, 0xcb, + 0xab, 0x9b, 0xa5, 0x5d, 0xdf, 0x2c, 0xe1, 0x59, 0x6e, 0x9e, 0x79, 0xfd, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xc0, 0xb5, 0xa9, 0xb8, 0xd3, 0x1d, 0x00, 0x00, 0x00, 0xd7, 0xae, 0x69, + 0xc1, 0x5a, 0x7e, 0xfd, 0xb4, 0x90, 0xae, 0x6b, 0xc9, 0xb4, 0x60, 0x2d, + 0xbf, 0x9e, 0x50, 0x2d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x80, 0xeb, 0xc3, 0x4d, 0x3b, 0xdd, 0x01, 0x00, 0x00, + 0x30, 0xd9, 0xb4, 0x60, 0xab, 0xed, 0x36, 0x2e, 0x3c, 0x6b, 0xbd, 0xfd, + 0x9c, 0x16, 0x6c, 0xb5, 0xdd, 0xc6, 0x85, 0x67, 0x5d, 0x6b, 0xfd, 0x04, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, + 0x3e, 0x42, 0xb5, 0x00, 0x00, 0xb8, 0x8e, 0x8c, 0x0b, 0xb4, 0xda, 0xee, + 0x79, 0x15, 0x3c, 0x9b, 0x32, 0xaf, 0x31, 0x81, 0x56, 0x5b, 0x61, 0xd2, + 0xbc, 0x0a, 0x17, 0x9a, 0x05, 0xf7, 0xb7, 0x5d, 0xfd, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xe6, 0x28, + 0xee, 0x74, 0x07, 0x00, 0x00, 0xd8, 0xed, 0x06, 0x83, 0xc1, 0x60, 0x52, + 0xfd, 0x46, 0x82, 0xab, 0xb2, 0x6d, 0x0e, 0x06, 0x83, 0x41, 0xb6, 0x9d, + 0x69, 0xf3, 0x75, 0xf3, 0xce, 0x6b, 0x6b, 0xa6, 0x3e, 0x1c, 0x68, 0x4c, + 0x7e, 0x5d, 0x1b, 0x08, 0xae, 0xca, 0xb6, 0x39, 0x38, 0xd0, 0x18, 0x64, + 0xdb, 0x99, 0x36, 0x5f, 0x37, 0xef, 0xbc, 0xb6, 0xd6, 0xdb, 0x1f, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5c, + 0x3b, 0x6e, 0xda, 0xe9, 0x0e, 0x00, 0x00, 0xb0, 0x1b, 0x8d, 0x0b, 0xca, + 0xda, 0x48, 0x80, 0xd6, 0xb5, 0x32, 0xdf, 0x42, 0xa1, 0x50, 0x18, 0x17, + 0x94, 0xb5, 0x91, 0x00, 0xad, 0x75, 0xcd, 0x7b, 0x0b, 0xe7, 0xbb, 0xd5, + 0x7d, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xc0, 0xe6, 0x28, 0xee, 0x74, 0x07, 0x00, 0x00, 0xd8, 0x8d, 0x06, + 0x83, 0xc1, 0x60, 0xab, 0xa6, 0xf7, 0xeb, 0x0a, 0x85, 0x42, 0xc1, 0x3d, + 0x1f, 0x0c, 0x06, 0x83, 0x71, 0xe1, 0x59, 0x79, 0x75, 0xd9, 0x76, 0xa6, + 0xf6, 0xe9, 0x40, 0x23, 0xb7, 0x4f, 0x2e, 0x94, 0xca, 0xaf, 0xcf, 0x0b, + 0xaa, 0xca, 0x9b, 0x7e, 0xdc, 0xb4, 0xd9, 0x71, 0xc7, 0xcd, 0x3b, 0xaf, + 0xce, 0x3d, 0xf7, 0xfb, 0x30, 0xad, 0xef, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb8, 0xf6, 0xdd, 0xb4, 0xd3, + 0x1d, 0x00, 0x00, 0x00, 0x43, 0xb3, 0x84, 0x6d, 0x8d, 0x1b, 0xe7, 0x6a, + 0x83, 0xba, 0x66, 0x99, 0xe7, 0x46, 0xe6, 0x31, 0x29, 0xf0, 0x6a, 0xda, + 0x38, 0xb3, 0x4c, 0xbb, 0x51, 0xae, 0xed, 0xad, 0x9c, 0x07, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb6, 0x4f, + 0x71, 0xa7, 0x3b, 0x00, 0x00, 0xc0, 0x6e, 0x57, 0x28, 0x14, 0x0a, 0x1b, + 0x0d, 0xc4, 0xba, 0x9a, 0x69, 0xdd, 0xf4, 0x1b, 0x6d, 0x3b, 0x3b, 0xad, + 0x1f, 0x4e, 0x55, 0xb8, 0xd0, 0x2c, 0x6c, 0x34, 0xac, 0xea, 0x6a, 0xa6, + 0x75, 0xd3, 0x6f, 0xb4, 0xed, 0x49, 0xd3, 0x02, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0xda, 0x46, 0xa8, 0x16, + 0x00, 0x00, 0x37, 0xb0, 0x69, 0x81, 0x5b, 0x7e, 0xfd, 0xa4, 0x80, 0xad, + 0xcd, 0x9e, 0xf6, 0x6a, 0x4c, 0x0b, 0xdc, 0xca, 0x86, 0x7b, 0x6d, 0xb4, + 0x6d, 0x02, 0xb6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xae, 0x2f, 0x37, 0xed, 0x74, 0x07, 0x00, 0x00, 0xd8, + 0xed, 0xa6, 0x05, 0x5f, 0xad, 0x77, 0xda, 0xcd, 0x0a, 0xb8, 0x5a, 0x4f, + 0xdb, 0xd9, 0x71, 0xa7, 0x05, 0x5f, 0x4d, 0x9c, 0x6f, 0xce, 0xb4, 0x9b, + 0x15, 0x70, 0xb5, 0x9e, 0xb6, 0xaf, 0xe6, 0x35, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0xfb, 0x15, 0x77, + 0xba, 0x03, 0x00, 0x00, 0x60, 0x68, 0xb3, 0x02, 0xb1, 0xfc, 0x76, 0x26, + 0x85, 0x76, 0xcd, 0x3a, 0x3f, 0x7f, 0xbc, 0x59, 0xdb, 0x4e, 0xc7, 0xdf, + 0xa4, 0x40, 0x2c, 0xbf, 0x9d, 0x49, 0x81, 0x57, 0xb3, 0xce, 0xcf, 0x1f, + 0x6f, 0xd6, 0xb6, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x70, 0xed, 0x22, 0x54, 0x0b, 0x00, 0x80, 0x1d, 0x36, + 0x2d, 0xd8, 0xca, 0x0f, 0xae, 0xca, 0x8e, 0x5b, 0x28, 0x14, 0x0a, 0x79, + 0xc1, 0x56, 0xb3, 0x84, 0x5d, 0xad, 0xa7, 0xed, 0xc1, 0x60, 0x30, 0x18, + 0x37, 0xaf, 0x3c, 0xd3, 0x82, 0xad, 0xfc, 0xe0, 0xaa, 0xec, 0xb8, 0x85, + 0x0b, 0xcd, 0x42, 0x5e, 0xb0, 0xd5, 0xac, 0x61, 0x57, 0xb3, 0xb6, 0x3d, + 0x38, 0xd0, 0x18, 0x8c, 0x9b, 0x17, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xae, 0x3f, 0x37, 0xed, 0x74, 0x07, + 0x00, 0x00, 0xc0, 0xf6, 0x98, 0x16, 0xde, 0x75, 0xad, 0xb6, 0x3d, 0x71, + 0xbe, 0x53, 0xc2, 0xbb, 0xae, 0xd5, 0xb6, 0x01, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb0, 0xf9, 0x08, 0x8b, 0x00, + 0x00, 0x60, 0x07, 0x0c, 0x06, 0x83, 0x41, 0xb6, 0xac, 0x50, 0x28, 0x14, + 0xfc, 0x72, 0x17, 0x54, 0x95, 0x2d, 0xcb, 0x9b, 0x76, 0xdc, 0xf8, 0x23, + 0xd3, 0x1d, 0x68, 0xac, 0x2d, 0xbf, 0xd0, 0x1c, 0x29, 0x77, 0x41, 0x52, + 0xd9, 0xb2, 0xbc, 0x69, 0xc7, 0x8d, 0x9f, 0xad, 0x03, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb6, 0xc3, 0x4d, + 0x3b, 0xdd, 0x01, 0x00, 0x00, 0xb0, 0x79, 0xc6, 0x05, 0x6e, 0x8d, 0x2b, + 0xdf, 0x94, 0x79, 0x8e, 0x09, 0xdc, 0x1a, 0x57, 0x0e, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6c, 0x05, 0x42, + 0xb5, 0x00, 0x00, 0xd8, 0x01, 0x85, 0x42, 0xa1, 0x30, 0xe9, 0xb9, 0x34, + 0x5b, 0x10, 0x56, 0xc1, 0x33, 0x75, 0x1e, 0x17, 0x9a, 0x13, 0x9f, 0x4b, + 0xb3, 0x05, 0x61, 0x15, 0x2e, 0x34, 0x0b, 0xee, 0x2f, 0xaf, 0x6e, 0xda, + 0xf4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xc0, 0x56, 0x28, 0xee, 0x74, 0x07, 0x00, 0x00, 0xc0, 0x78, 0xd3, + 0x82, 0xb5, 0xfc, 0xfa, 0xbc, 0x60, 0xad, 0x0d, 0xcd, 0x73, 0x4a, 0xb0, + 0x96, 0x5f, 0x4f, 0x88, 0x16, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xae, 0x15, 0x37, 0xed, 0x74, 0x07, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x80, 0xab, 0x55, 0xdc, 0xe9, 0x0e, 0x00, 0x00, 0x80, 0x7c, + 0x85, 0x42, 0xa1, 0x30, 0x18, 0x0c, 0x06, 0xd3, 0xc6, 0xd9, 0xd4, 0x79, + 0x5e, 0x68, 0x16, 0x06, 0x07, 0x1a, 0x93, 0xe7, 0x79, 0xa1, 0xb9, 0xa9, + 0xf3, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x36, 0xc3, 0x4d, 0x3b, 0xdd, 0x01, 0x00, 0x00, 0x76, 0xa3, + 0x6c, 0x58, 0xd6, 0xb8, 0xf0, 0xac, 0xab, 0x09, 0xcd, 0x5a, 0x33, 0x8f, + 0x4c, 0x58, 0xd6, 0xb8, 0xf0, 0xac, 0xab, 0x09, 0xcd, 0x9a, 0x16, 0xc8, + 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x6c, 0x15, 0x42, 0xb5, 0x00, 0x00, 0xb8, 0x81, 0x8c, 0x0b, 0xe1, + 0xba, 0x9a, 0x70, 0xae, 0xa9, 0xf3, 0x1c, 0x13, 0xc2, 0x75, 0x35, 0xe1, + 0x5c, 0x00, 0x00, 0xe0, 0xff, 0x6f, 0xe7, 0x0e, 0x5e, 0xdb, 0x38, 0xd3, + 0x00, 0x0e, 0x8f, 0x8c, 0x5d, 0x8c, 0x11, 0x18, 0xa7, 0x97, 0xc4, 0x87, + 0xa4, 0x60, 0xdc, 0x43, 0xf0, 0xd5, 0xe0, 0x3f, 0x61, 0xf7, 0x2f, 0xde, + 0xbd, 0xef, 0x25, 0x90, 0xab, 0xe9, 0xa1, 0x21, 0xd0, 0xf6, 0xe0, 0xf6, + 0xd2, 0x86, 0x80, 0x09, 0xa1, 0x3e, 0x68, 0x0f, 0x13, 0x15, 0x45, 0x9e, + 0xef, 0x9d, 0x91, 0x34, 0x5f, 0xc6, 0xaf, 0xfd, 0x3c, 0xb0, 0xd0, 0x8e, + 0xa4, 0x57, 0x3f, 0x4b, 0x63, 0xd9, 0x5a, 0xb9, 0x2f, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb0, + 0x29, 0xcb, 0x2e, 0x00, 0x60, 0x22, 0x8b, 0xc5, 0x62, 0xb1, 0xfc, 0xe7, + 0x2f, 0x3b, 0xaf, 0x66, 0x5d, 0x97, 0x0d, 0xbd, 0xce, 0xea, 0xe5, 0xd1, + 0x65, 0x43, 0xe6, 0x8f, 0x75, 0xff, 0xb3, 0xd9, 0xac, 0x59, 0x5e, 0x6d, + 0x93, 0xdb, 0xaf, 0x5a, 0x9d, 0xb5, 0xcd, 0xfc, 0xae, 0xb9, 0x7d, 0x33, + 0x9b, 0xa6, 0x99, 0x0d, 0xfd, 0xf7, 0x21, 0x5f, 0x5b, 0xdf, 0x75, 0xc6, + 0x7e, 0xfe, 0xfb, 0x2e, 0xef, 0x7b, 0xfc, 0x36, 0xb9, 0xbc, 0x74, 0x2c, + 0x9a, 0xb1, 0xc9, 0x63, 0x5b, 0xfa, 0xfa, 0x76, 0x15, 0x9d, 0x1f, 0xab, + 0x97, 0x97, 0xae, 0x53, 0xfb, 0xfc, 0xdf, 0xe4, 0xfb, 0x7b, 0xd3, 0xcb, + 0x37, 0xbd, 0xff, 0x6d, 0x1e, 0xfb, 0xa1, 0x8f, 0xef, 0x90, 0xd9, 0x8b, + 0xc5, 0x62, 0xd1, 0xd5, 0x17, 0xdd, 0xb6, 0xeb, 0x9c, 0xda, 0xe4, 0xfc, + 0xda, 0xe5, 0xfb, 0xb3, 0xc6, 0xf3, 0xb3, 0xfe, 0xb5, 0x0c, 0x99, 0xbf, + 0x3c, 0xff, 0xd6, 0xcf, 0xc3, 0xf5, 0x9b, 0x0f, 0x79, 0xed, 0x2c, 0x9d, + 0xd3, 0xd1, 0xfc, 0xe8, 0xfc, 0xef, 0xfa, 0x1a, 0x4b, 0xaf, 0x07, 0x7d, + 0xf7, 0xdf, 0xf7, 0xf8, 0x4d, 0xf5, 0xf3, 0xaf, 0xef, 0xb6, 0xdb, 0xbe, + 0x3e, 0x8c, 0xf9, 0xfa, 0x3d, 0xe4, 0xf2, 0xbe, 0xe7, 0x37, 0x3a, 0xbf, + 0xb6, 0xf9, 0xf9, 0x1b, 0x9d, 0x33, 0xeb, 0x8f, 0x4d, 0x69, 0x7e, 0x74, + 0x9e, 0x7f, 0x8b, 0x9f, 0x2f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4c, 0x6b, 0x6f, 0xea, 0x00, + 0x00, 0x78, 0x8a, 0xd6, 0x96, 0x4a, 0x2c, 0x97, 0x3f, 0x94, 0x16, 0x3d, + 0x84, 0xb7, 0x5f, 0xfe, 0xaf, 0xcb, 0x90, 0xf9, 0x7d, 0xb7, 0xef, 0xba, + 0x7c, 0xe8, 0xfd, 0x47, 0x56, 0x6f, 0xb3, 0xcd, 0xed, 0x4b, 0xb3, 0x36, + 0xb1, 0x7c, 0x5c, 0xba, 0x96, 0x6c, 0xac, 0x5f, 0x67, 0xed, 0xd8, 0xe0, + 0xe7, 0xaf, 0xab, 0x6d, 0xd7, 0xe7, 0x7f, 0xc8, 0x7d, 0x8c, 0xf9, 0xf8, + 0x46, 0xbe, 0x7c, 0x2d, 0xc5, 0xf6, 0xb5, 0x05, 0x29, 0x83, 0x6c, 0x7b, + 0x4e, 0x0d, 0x15, 0x3d, 0xdf, 0x5d, 0x0d, 0x5d, 0xcf, 0xcf, 0x58, 0x8d, + 0xdb, 0x7c, 0x7f, 0x0d, 0xfd, 0xbe, 0x1b, 0xf2, 0xfa, 0x31, 0xe4, 0xf2, + 0xd2, 0xf9, 0xb9, 0xcd, 0x7d, 0x6f, 0x6a, 0x65, 0x19, 0xd6, 0xbd, 0xf9, + 0xa5, 0xae, 0xf5, 0xdb, 0x74, 0xcd, 0x88, 0x1e, 0xbf, 0x4d, 0xbf, 0xbf, + 0xfb, 0x5e, 0x7f, 0x4b, 0x86, 0x3c, 0x8f, 0x7d, 0x97, 0x6d, 0x73, 0x1e, + 0x6e, 0x7a, 0x9b, 0xe8, 0xfb, 0xa5, 0x6b, 0x79, 0x51, 0xd7, 0x75, 0x4a, + 0x33, 0xa3, 0x8e, 0x21, 0xaf, 0xcf, 0x85, 0xdb, 0x8d, 0xf2, 0xfa, 0x3a, + 0xe4, 0xf5, 0xbb, 0xf4, 0xfd, 0x39, 0xf4, 0x3e, 0xba, 0xac, 0x9f, 0xaf, + 0xeb, 0xe7, 0xfa, 0x2e, 0xaf, 0xad, 0xdf, 0x42, 0xed, 0x9e, 0xbe, 0xd7, + 0xe6, 0x52, 0xcf, 0xfa, 0x75, 0xfb, 0x3a, 0x4b, 0x3f, 0xdb, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x78, 0xf8, 0xf6, 0xa7, 0x0e, 0x00, 0x00, 0xca, 0x06, 0x2e, 0xcd, 0xd8, + 0x7a, 0x83, 0xc5, 0xda, 0xfc, 0x7b, 0x73, 0x56, 0x77, 0x99, 0x04, 0x0b, + 0x68, 0x8a, 0x97, 0xf7, 0xec, 0x42, 0x99, 0x35, 0x5f, 0x2f, 0xac, 0xd8, + 0xf8, 0xeb, 0x58, 0x9b, 0xbf, 0xd5, 0xe3, 0x30, 0x64, 0x21, 0xcc, 0x86, + 0x3b, 0x5d, 0x06, 0xcf, 0x1e, 0x7a, 0xfb, 0x01, 0x8b, 0x67, 0xba, 0xae, + 0xb3, 0xf3, 0xe3, 0xbb, 0xa3, 0xf5, 0xfb, 0xff, 0xa7, 0x61, 0xf9, 0x98, + 0x76, 0x2d, 0x8a, 0x59, 0x5e, 0x6f, 0x75, 0x91, 0x4e, 0xb4, 0xd8, 0x66, + 0xe5, 0xf2, 0xc1, 0x5f, 0xdf, 0x90, 0xe7, 0x74, 0xc8, 0xde, 0xad, 0xbe, + 0x65, 0x3f, 0x43, 0x9e, 0xff, 0xa1, 0xdf, 0x3f, 0xeb, 0x8f, 0xcf, 0x97, + 0xcb, 0x3b, 0x17, 0x13, 0xad, 0x3d, 0xbe, 0xbd, 0xdf, 0xbb, 0x95, 0xcc, + 0x66, 0xb3, 0x59, 0xb8, 0x8c, 0x69, 0xd3, 0x79, 0x1d, 0xff, 0x1e, 0x2e, + 0xc3, 0x5b, 0x3e, 0x0e, 0x2b, 0xf7, 0xf5, 0xcf, 0xf9, 0xb7, 0xbc, 0xce, + 0x96, 0x2d, 0x5f, 0xdd, 0xbe, 0x34, 0x63, 0xaa, 0xd7, 0xef, 0xf5, 0xe7, + 0xbf, 0xa3, 0x63, 0x56, 0x3a, 0x77, 0x3a, 0xee, 0x63, 0x11, 0x7d, 0xbf, + 0xac, 0x3e, 0xce, 0xa5, 0xbe, 0xe5, 0x7d, 0xf6, 0x7f, 0x45, 0xdd, 0xf3, + 0xb7, 0xb9, 0x6c, 0x0c, 0x03, 0xe7, 0x77, 0x7d, 0x5d, 0xe1, 0x6b, 0xef, + 0xfa, 0xf3, 0xb3, 0x85, 0xe2, 0x6b, 0xeb, 0xa0, 0x1b, 0xef, 0x7e, 0xff, + 0xbd, 0x77, 0xd1, 0x7c, 0xe9, 0xeb, 0x78, 0x8d, 0xff, 0xa7, 0x73, 0x79, + 0x59, 0xcf, 0xeb, 0x53, 0xd7, 0x6d, 0x77, 0x7a, 0xed, 0x1d, 0xf2, 0xf5, + 0x2f, 0xe7, 0x7f, 0x39, 0xbf, 0x17, 0xcd, 0x0e, 0xdf, 0xa7, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x7c, 0x7b, 0x7b, 0x53, 0x07, 0x00, 0xc0, 0x53, 0x36, 0x64, 0xa1, 0xd3, + 0x90, 0xeb, 0x6d, 0x6b, 0x36, 0x9b, 0x85, 0x4b, 0x55, 0x96, 0x97, 0x6f, + 0xbb, 0x74, 0x66, 0x87, 0x65, 0x35, 0x8b, 0x2f, 0x4b, 0x2d, 0xe2, 0xad, + 0x5c, 0x5f, 0x3f, 0x3e, 0x1b, 0x3f, 0x48, 0xcb, 0xdb, 0xf7, 0x75, 0xee, + 0xf2, 0xf5, 0x8f, 0xf1, 0xf8, 0x75, 0x3d, 0xff, 0xbb, 0xcc, 0x5d, 0x2a, + 0x9d, 0x57, 0x43, 0x97, 0x0e, 0xad, 0x2f, 0xed, 0x59, 0xbb, 0xec, 0xab, + 0xa5, 0x3d, 0x6b, 0xcf, 0xd1, 0x6c, 0x75, 0xe6, 0xfa, 0xd2, 0xa3, 0xc2, + 0x42, 0xad, 0x7b, 0x8b, 0x69, 0xa2, 0xc7, 0xa0, 0xe7, 0x1c, 0xda, 0x68, + 0x01, 0x4d, 0xe9, 0x3e, 0xa2, 0xe3, 0x43, 0xbf, 0xb7, 0xfa, 0xee, 0xbb, + 0xa4, 0x63, 0x29, 0xd2, 0xfa, 0xb2, 0x9a, 0xe2, 0xf9, 0xb3, 0xeb, 0x79, + 0xb9, 0xbc, 0xff, 0x01, 0xdf, 0xa3, 0xb3, 0xa6, 0xf0, 0x58, 0xd7, 0x5c, + 0xea, 0xb3, 0xfc, 0xda, 0x56, 0x17, 0x3e, 0xad, 0x9f, 0x7f, 0xcd, 0x97, + 0x73, 0xb0, 0x74, 0x7e, 0x2d, 0x1b, 0x87, 0xdc, 0x4f, 0x74, 0xf9, 0x90, + 0x39, 0x1d, 0xf7, 0xbb, 0x58, 0xf9, 0xe7, 0xf5, 0x9e, 0xaf, 0xbe, 0x37, + 0x86, 0x2c, 0xf3, 0xea, 0xea, 0x18, 0xd2, 0xb6, 0xb2, 0x90, 0xac, 0xf8, + 0x1c, 0x46, 0x97, 0xd7, 0x7e, 0x7d, 0xde, 0xf5, 0xf5, 0x6f, 0xc8, 0xfd, + 0x8f, 0xf1, 0x3a, 0xdb, 0x3d, 0x3a, 0x3e, 0x6f, 0xd6, 0x9f, 0xf7, 0xd5, + 0xeb, 0xf7, 0xbc, 0xb6, 0x0e, 0xbe, 0xff, 0xda, 0x8f, 0xdf, 0x97, 0x3b, + 0xda, 0xea, 0xb2, 0x9a, 0xb7, 0x1d, 0xb2, 0xec, 0x6e, 0xe8, 0xef, 0x06, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x4c, 0x96, 0x6a, 0x01, 0xc0, 0x84, 0xfa, 0x16, 0x36, + 0x0c, 0x59, 0x7a, 0x14, 0x2d, 0xb7, 0x19, 0xb2, 0x14, 0xa9, 0x63, 0xe1, + 0xcc, 0xbd, 0xbb, 0x5b, 0xf9, 0xdf, 0x46, 0xf3, 0x23, 0x1d, 0x8b, 0x63, + 0x36, 0xee, 0x1f, 0x78, 0x3f, 0x4d, 0xe9, 0xf1, 0xd9, 0x60, 0xf6, 0xbd, + 0x85, 0x4e, 0x1b, 0xf4, 0xdd, 0x7b, 0xfc, 0xba, 0x16, 0xda, 0x6c, 0xba, + 0x18, 0x65, 0x97, 0xa5, 0x44, 0xeb, 0xbd, 0x1d, 0xfd, 0xb3, 0x8e, 0xa5, + 0x22, 0xf7, 0xfa, 0xa3, 0x7f, 0x1e, 0x92, 0xd1, 0xf3, 0xef, 0x4d, 0xd3, + 0x34, 0xd1, 0xf9, 0x39, 0x6b, 0x82, 0x73, 0x73, 0xc8, 0x42, 0xaa, 0xe5, + 0xfc, 0x8e, 0xd9, 0x5d, 0xf7, 0x7f, 0x6f, 0x46, 0xf0, 0xf8, 0x17, 0xbb, + 0xba, 0xe6, 0xf6, 0x2d, 0x2d, 0x1b, 0xf0, 0xb8, 0x16, 0x1f, 0xbb, 0xe8, + 0xbe, 0x4b, 0xf3, 0x37, 0x3c, 0xbf, 0xab, 0x5a, 0x59, 0x30, 0xf4, 0xd5, + 0x17, 0xb3, 0x58, 0x2c, 0x16, 0x41, 0xd7, 0x6c, 0x75, 0xa1, 0x56, 0xdf, + 0xe3, 0xdb, 0xf4, 0x2c, 0x85, 0x2a, 0xe9, 0xfb, 0x1e, 0xdc, 0x75, 0x69, + 0xd8, 0x80, 0xc5, 0x71, 0x43, 0x5e, 0xbf, 0xbb, 0x6e, 0x17, 0x9d, 0xbb, + 0x5f, 0xdd, 0x7f, 0x13, 0x9c, 0xc3, 0x7d, 0x97, 0x47, 0xf7, 0x3f, 0xf4, + 0xba, 0xdb, 0x9c, 0x7b, 0x23, 0x9f, 0xbf, 0xe1, 0xeb, 0xf7, 0xd0, 0x05, + 0x90, 0xeb, 0xba, 0x16, 0x9c, 0xad, 0xde, 0x67, 0xb4, 0x74, 0x70, 0x9b, + 0xfb, 0xe8, 0x38, 0x47, 0xc2, 0xd7, 0xa7, 0xd5, 0xdb, 0x47, 0xaf, 0x23, + 0x85, 0xfb, 0x29, 0xfe, 0xfb, 0xd0, 0xcb, 0x7a, 0xee, 0x77, 0xb1, 0xc9, + 0x73, 0xbb, 0xe5, 0x79, 0x30, 0xdb, 0xf6, 0x71, 0x07, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x7a, + 0xfe, 0x03, 0x51, 0x00, 0x98, 0x46, 0xb4, 0xc0, 0x6a, 0xc8, 0xe5, 0xa5, + 0xeb, 0x44, 0xb7, 0xef, 0xbb, 0x6d, 0xe9, 0xf6, 0x5d, 0xbf, 0x2f, 0xec, + 0x3a, 0xbf, 0x6f, 0xc6, 0xb7, 0x9c, 0x5f, 0x3a, 0xb6, 0xc9, 0xbf, 0x47, + 0xf7, 0x5d, 0xfa, 0x7d, 0x2b, 0xfa, 0x1a, 0x76, 0xfd, 0xfa, 0x86, 0x74, + 0x44, 0xfd, 0xeb, 0xd7, 0x19, 0x7a, 0x0e, 0xac, 0x5e, 0x77, 0xd3, 0xaf, + 0x61, 0xd3, 0xe7, 0x77, 0x88, 0x52, 0xff, 0xa6, 0x8f, 0x5d, 0xd7, 0x75, + 0x86, 0xcc, 0x58, 0xbf, 0x5e, 0x74, 0xfb, 0x9a, 0xcf, 0xed, 0xfa, 0xf5, + 0xb6, 0xf9, 0xfa, 0x37, 0xb9, 0xff, 0x21, 0x36, 0xb9, 0x7d, 0xd7, 0xf3, + 0x58, 0x3c, 0x37, 0x57, 0x17, 0x6e, 0x75, 0x2c, 0xd4, 0x19, 0x32, 0x63, + 0xd7, 0x73, 0x7b, 0xcc, 0xd7, 0xd7, 0xbe, 0x99, 0x9b, 0xdc, 0xff, 0x90, + 0xdb, 0x6e, 0x7a, 0xff, 0x63, 0xf7, 0x75, 0xbd, 0xd6, 0x6e, 0x3a, 0xbf, + 0xeb, 0xfa, 0x63, 0xfe, 0xfc, 0x2b, 0xcd, 0xd8, 0xe4, 0x67, 0xc0, 0x26, + 0xaf, 0xbf, 0xd1, 0xec, 0xae, 0x19, 0xeb, 0x0b, 0xe8, 0xda, 0x0b, 0xbb, + 0x97, 0xa0, 0x6d, 0xfb, 0x58, 0xdf, 0xb3, 0x72, 0x3f, 0x7d, 0x3f, 0xc3, + 0xb6, 0xdd, 0x36, 0x57, 0xea, 0x1b, 0xfa, 0xfd, 0xdb, 0x77, 0xff, 0xfe, + 0xbf, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x04, 0x66, + 0x53, 0x07, 0x00, 0xc0, 0x53, 0x34, 0x3f, 0x38, 0x59, 0xd4, 0x9c, 0x7f, + 0x71, 0xf7, 0xa1, 0xe6, 0xf8, 0xe6, 0xfa, 0xe0, 0xa4, 0xea, 0xfc, 0xda, + 0xfd, 0x3f, 0x1f, 0x9e, 0x56, 0x9d, 0xff, 0xe3, 0xe7, 0x9b, 0xaa, 0xf3, + 0xb3, 0xf7, 0xff, 0x72, 0x74, 0x56, 0x75, 0xfe, 0x0f, 0x9f, 0xde, 0x57, + 0x9d, 0x9f, 0xbd, 0xff, 0x66, 0x7e, 0x51, 0x75, 0xfe, 0xe9, 0xed, 0x75, + 0xd5, 0xf9, 0xd9, 0xfb, 0xff, 0x3c, 0xbe, 0xac, 0x3a, 0xff, 0xfb, 0x8f, + 0x6f, 0xab, 0xce, 0xd7, 0x1f, 0xd3, 0x1f, 0xd3, 0x1f, 0xcb, 0xde, 0x7f, + 0x50, 0xb9, 0xff, 0x4e, 0x7f, 0xe8, 0xef, 0xca, 0xfd, 0xdf, 0xe9, 0x0f, + 0xdd, 0x56, 0xee, 0x9f, 0xeb, 0x0f, 0xbd, 0xab, 0xdc, 0x7f, 0xae, 0x3f, + 0xa4, 0x3f, 0xa6, 0x3f, 0xa6, 0x3f, 0xa6, 0x3f, 0x96, 0xfd, 0xe7, 0x57, + 0xf6, 0xfe, 0xec, 0xbf, 0xbf, 0x65, 0xef, 0xcf, 0xfe, 0xfe, 0x25, 0x7b, + 0x7f, 0xf6, 0xf7, 0xef, 0xfa, 0x63, 0xfa, 0x63, 0xfa, 0x63, 0xfa, 0x63, + 0xfa, 0x63, 0xd9, 0xfb, 0xb3, 0x7f, 0x7e, 0x97, 0xbd, 0x3f, 0xfb, 0xe7, + 0xd7, 0xd9, 0xfb, 0xb3, 0xff, 0xfd, 0x46, 0xf6, 0xfe, 0x37, 0x55, 0xa7, + 0x37, 0xcd, 0x55, 0xe5, 0xf9, 0xfa, 0x63, 0xfa, 0x63, 0xfa, 0x63, 0xdf, + 0xa0, 0xdf, 0x7f, 0x83, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0xc0, + 0xed, 0x4d, 0x1d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xbb, 0xb2, + 0x54, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xf4, 0xf6, 0xa7, 0x0e, + 0x00, 0x80, 0xa7, 0xee, 0xf6, 0xee, 0xc3, 0x28, 0x73, 0xe6, 0x07, 0x27, + 0x9d, 0xc7, 0xdf, 0x8c, 0x32, 0xbd, 0x69, 0xae, 0x0a, 0xc7, 0xb3, 0xf7, + 0xff, 0xf5, 0xf9, 0x66, 0x94, 0xf9, 0xcf, 0x0e, 0x4f, 0x3b, 0x8f, 0xeb, + 0x6f, 0x95, 0xfa, 0xff, 0xf8, 0xf4, 0x7e, 0x94, 0xf9, 0xcf, 0x8f, 0xce, + 0x3a, 0x8f, 0xeb, 0x6f, 0x95, 0xfa, 0x7f, 0xbb, 0xbd, 0x1e, 0x65, 0xfe, + 0xcb, 0xf9, 0x45, 0xe7, 0x71, 0xfd, 0xad, 0x52, 0xff, 0xbb, 0x8f, 0x6f, + 0x47, 0x99, 0x7f, 0x7e, 0x7c, 0xd9, 0x79, 0x5c, 0x7f, 0x4b, 0x7f, 0x4c, + 0x7f, 0x4c, 0x7f, 0xac, 0xd4, 0xff, 0xd3, 0x28, 0xd3, 0x9b, 0xe6, 0x75, + 0xe1, 0xb8, 0xfe, 0x56, 0xa9, 0xff, 0xd7, 0x51, 0xa6, 0x37, 0xcd, 0xab, + 0xc2, 0x71, 0xfd, 0xad, 0x52, 0xff, 0xef, 0xa3, 0x4c, 0x6f, 0x9a, 0x17, + 0x85, 0xe3, 0xfa, 0x5b, 0xa5, 0xfe, 0xda, 0xf4, 0xb7, 0xf4, 0x6f, 0x47, + 0x7f, 0x4b, 0xff, 0x76, 0xf4, 0xb7, 0x1e, 0xeb, 0xcf, 0xaf, 0xec, 0xfd, + 0xd9, 0x7f, 0x7f, 0xcb, 0xde, 0x9f, 0xfd, 0xfd, 0x4b, 0xf6, 0xfe, 0xec, + 0xef, 0xdf, 0xf5, 0xb7, 0xf4, 0xc7, 0xf4, 0xc7, 0xf4, 0xc7, 0xf4, 0xc7, + 0x1e, 0x6b, 0x7f, 0xf6, 0xcf, 0xef, 0xb2, 0xf7, 0x67, 0xff, 0xfc, 0x3a, + 0x7b, 0x7f, 0xf6, 0xbf, 0xdf, 0xc8, 0xde, 0x5f, 0x9b, 0xfe, 0x96, 0xfe, + 0xed, 0xe8, 0x6f, 0xe9, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x5b, + 0xda, 0x9b, 0x3a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x76, 0x65, + 0xa9, 0x16, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe9, 0x59, 0xaa, 0x05, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x7a, 0x96, 0x6a, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x90, 0x9e, 0xa5, 0x5a, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xa4, 0x67, 0xa9, 0x16, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe9, + 0x59, 0xaa, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x7a, 0x96, 0x6a, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x90, 0x9e, 0xa5, 0x5a, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xa4, 0x67, 0xa9, 0x16, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xe9, 0x59, 0xaa, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, + 0x7a, 0x96, 0x6a, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x90, 0x9e, 0xa5, + 0x5a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x67, 0xa9, 0x16, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xe9, 0x59, 0xaa, 0x05, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x40, 0x7a, 0x96, 0x6a, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x90, 0x9e, 0xa5, 0x5a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0xb7, + 0x3f, 0x75, 0x00, 0x00, 0x3c, 0x75, 0xf3, 0x83, 0x93, 0xaa, 0xf3, 0xaf, + 0xaa, 0x4e, 0xcf, 0xdf, 0xff, 0xec, 0xf0, 0xb4, 0xea, 0x7c, 0xfd, 0xb1, + 0xe7, 0x47, 0x67, 0x55, 0xe7, 0xeb, 0x8f, 0xbd, 0x9c, 0x5f, 0x54, 0x9d, + 0xaf, 0x3f, 0x76, 0x7e, 0x7c, 0x59, 0x75, 0xbe, 0xfe, 0x98, 0xfe, 0x98, + 0xfe, 0x98, 0xfe, 0xd8, 0xeb, 0xaa, 0xd3, 0xf5, 0xf7, 0x79, 0x55, 0x75, + 0xba, 0xfe, 0x3e, 0x2f, 0xaa, 0x4e, 0xd7, 0x3f, 0x35, 0xfd, 0xd3, 0xd2, + 0x3f, 0x2d, 0xfd, 0xd3, 0xd2, 0x1f, 0xcb, 0xfe, 0xf3, 0x2b, 0x7b, 0x7f, + 0xf6, 0xdf, 0xdf, 0xb2, 0xf7, 0x67, 0x7f, 0xff, 0x92, 0xbd, 0x3f, 0xfb, + 0xfb, 0x77, 0xfd, 0x31, 0xfd, 0x31, 0xfd, 0x31, 0xfd, 0x31, 0xfd, 0xb1, + 0xec, 0xfd, 0xd9, 0x3f, 0xbf, 0xcb, 0xde, 0x9f, 0xfd, 0xf3, 0xeb, 0xec, + 0xfd, 0xd9, 0xff, 0x7e, 0x23, 0x7b, 0x7f, 0x6d, 0xfa, 0xa7, 0xa5, 0x7f, + 0x5a, 0xfa, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc8, 0x68, 0x6f, 0xea, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd8, 0x95, 0xa5, 0x5a, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x37, 0x9b, 0x3a, 0x00, 0x00, 0x9e, + 0xa2, 0xab, 0xa6, 0x59, 0xd4, 0x9c, 0x7f, 0x7d, 0x70, 0x52, 0x73, 0x7c, + 0x73, 0x71, 0xf7, 0xa1, 0xea, 0xfc, 0xec, 0xfd, 0x3f, 0x1f, 0x9e, 0x56, + 0x9d, 0xff, 0xe3, 0xe7, 0x9b, 0xaa, 0xf3, 0xb3, 0xf7, 0xff, 0x72, 0x74, + 0x56, 0x75, 0xfe, 0x0f, 0x9f, 0xde, 0x57, 0x9d, 0x9f, 0xbd, 0xff, 0x66, + 0x7e, 0x51, 0x75, 0xfe, 0xe9, 0xed, 0x75, 0xd5, 0xf9, 0xd9, 0xfb, 0xff, + 0x3c, 0xbe, 0xac, 0x3a, 0xff, 0xfb, 0x8f, 0x6f, 0xab, 0xce, 0xd7, 0x1f, + 0xd3, 0x1f, 0xd3, 0x1f, 0x3b, 0xa8, 0xdc, 0x7f, 0xa7, 0x3f, 0xf4, 0x77, + 0xe5, 0xfe, 0xef, 0xf4, 0x87, 0x6e, 0x2b, 0xf7, 0xcf, 0xf5, 0x87, 0xde, + 0x55, 0xee, 0x3f, 0xd7, 0x1f, 0xd2, 0x1f, 0xd3, 0x1f, 0xd3, 0x1f, 0xd3, + 0x1f, 0xcb, 0xfe, 0xf3, 0x2b, 0x7b, 0x7f, 0xf6, 0xdf, 0xdf, 0xb2, 0xf7, + 0x67, 0x7f, 0xff, 0x92, 0xbd, 0x3f, 0xfb, 0xfb, 0x77, 0xfd, 0x31, 0xfd, + 0x31, 0xfd, 0x31, 0xfd, 0x31, 0xfd, 0x31, 0xfd, 0xb1, 0xda, 0xfd, 0xd9, + 0x3f, 0xbf, 0xcb, 0xde, 0x9f, 0xfd, 0xf3, 0xeb, 0xec, 0xfd, 0xd9, 0xff, + 0x7e, 0x23, 0x7b, 0xff, 0x9b, 0xaa, 0xd3, 0x9b, 0xe6, 0xaa, 0xf2, 0x7c, + 0xfd, 0x31, 0xfd, 0x31, 0xfd, 0xbd, 0xfc, 0x37, 0x18, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x0f, 0xdc, 0xde, 0xd4, 0x01, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xb0, 0x2b, 0x4b, 0xb5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x48, 0x6f, 0x7f, 0xea, 0x00, 0x00, 0x78, 0xea, 0xde, 0x8c, 0x34, 0xe7, + 0xaa, 0x70, 0xfc, 0xf6, 0xee, 0xc3, 0x28, 0xf3, 0xe7, 0x07, 0x27, 0x9d, + 0xc7, 0xf5, 0xb7, 0x4a, 0xfd, 0x7f, 0x7d, 0xbe, 0x19, 0x65, 0xfe, 0xb3, + 0xc3, 0xd3, 0xce, 0xe3, 0xfa, 0x5b, 0xa5, 0xfe, 0x3f, 0x3e, 0xbd, 0x1f, + 0x65, 0xfe, 0xf3, 0xa3, 0xb3, 0xce, 0xe3, 0xfa, 0x5b, 0xa5, 0xfe, 0xdf, + 0x6e, 0xaf, 0x47, 0x99, 0xff, 0x72, 0x7e, 0xd1, 0x79, 0x5c, 0x7f, 0xab, + 0xd4, 0xff, 0xee, 0xe3, 0xdb, 0x51, 0xe6, 0x9f, 0x1f, 0x5f, 0x76, 0x1e, + 0xd7, 0xdf, 0xd2, 0x1f, 0xd3, 0x1f, 0x9b, 0xaa, 0xff, 0xa7, 0x51, 0xa6, + 0x37, 0xcd, 0xeb, 0xc2, 0x71, 0xfd, 0xad, 0x52, 0xff, 0xaf, 0xa3, 0x4c, + 0x6f, 0x9a, 0x57, 0x85, 0xe3, 0xfa, 0x5b, 0xa5, 0xfe, 0xdf, 0x47, 0x99, + 0xde, 0x34, 0x2f, 0x0a, 0xc7, 0xf5, 0xb7, 0x4a, 0xfd, 0xb5, 0xe9, 0x6f, + 0xe9, 0xdf, 0x8e, 0xfe, 0x96, 0xfe, 0xed, 0xe8, 0x6f, 0x3d, 0xd6, 0x9f, + 0x5f, 0xd9, 0xfb, 0xb3, 0xff, 0xfe, 0x96, 0xbd, 0x3f, 0xfb, 0xfb, 0x97, + 0xec, 0xfd, 0xd9, 0xdf, 0xbf, 0xeb, 0x6f, 0xe9, 0x8f, 0xe9, 0x8f, 0xe9, + 0x8f, 0xe9, 0x8f, 0xe9, 0x8f, 0x4d, 0xd5, 0x9f, 0xfd, 0xf3, 0xbb, 0xec, + 0xfd, 0xd9, 0x3f, 0xbf, 0xce, 0xde, 0x9f, 0xfd, 0xef, 0x37, 0xb2, 0xf7, + 0xd7, 0xa6, 0xbf, 0xa5, 0x7f, 0x3b, 0xfa, 0x5b, 0x53, 0xf5, 0x03, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xf0, 0x30, 0xed, 0x4d, 0x1d, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xbb, 0xb2, 0x54, 0x0b, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x80, 0xf4, 0x2c, 0xd5, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, + 0x3d, 0x4b, 0xb5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x48, 0xcf, 0x52, + 0x2d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd2, 0xb3, 0x54, 0x0b, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0xf4, 0x2c, 0xd5, 0x02, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x20, 0x3d, 0x4b, 0xb5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x48, 0xcf, 0x52, 0x2d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd2, 0xb3, + 0x54, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xf4, 0x2c, 0xd5, 0x02, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x3d, 0x4b, 0xb5, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x48, 0xcf, 0x52, 0x2d, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xd2, 0xb3, 0x54, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xf4, + 0x2c, 0xd5, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x3d, 0x4b, 0xb5, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x48, 0xcf, 0x52, 0x2d, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xd2, 0xdb, 0x9f, 0x3a, 0x00, 0x00, 0x9e, 0xba, + 0xab, 0xca, 0xf3, 0xe7, 0x07, 0x27, 0x55, 0xe7, 0xeb, 0x8f, 0x3d, 0x3b, + 0x3c, 0xad, 0x3a, 0x5f, 0x7f, 0xec, 0xf9, 0xd1, 0x59, 0xd5, 0xf9, 0xfa, + 0x63, 0x2f, 0xe7, 0x17, 0x55, 0xe7, 0xeb, 0x8f, 0x9d, 0x1f, 0x5f, 0x56, + 0x9d, 0xaf, 0x3f, 0xa6, 0x3f, 0xa6, 0x3f, 0x56, 0xbb, 0xff, 0x75, 0xd5, + 0xe9, 0xfa, 0xfb, 0xbc, 0xaa, 0x3a, 0x5d, 0x7f, 0x9f, 0x17, 0x55, 0xa7, + 0xeb, 0x9f, 0x9a, 0xfe, 0x69, 0xe9, 0x9f, 0x96, 0xfe, 0x69, 0xe9, 0x8f, + 0x65, 0xff, 0xf9, 0x95, 0xbd, 0x3f, 0xfb, 0xef, 0x6f, 0xd9, 0xfb, 0xb3, + 0xbf, 0x7f, 0xc9, 0xde, 0x9f, 0xfd, 0xfd, 0xbb, 0xfe, 0x98, 0xfe, 0x98, + 0xfe, 0x98, 0xfe, 0x98, 0xfe, 0x98, 0xfe, 0x98, 0xcf, 0xef, 0x62, 0xd9, + 0xfb, 0xb3, 0x7f, 0x7e, 0x9d, 0xbd, 0x3f, 0xfb, 0xdf, 0x6f, 0x64, 0xef, + 0xaf, 0x4d, 0xff, 0xb4, 0xf4, 0x4f, 0x2b, 0x7b, 0x3f, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x0f, 0xd3, 0xde, 0xd4, 0x01, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xb0, 0x2b, 0x4b, 0xb5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x48, 0x6f, 0x36, 0x75, 0x00, 0x00, 0x3c, 0x45, 0xf3, 0x83, 0x31, 0x87, + 0x20, 0xc2, 0x00, 0x00, 0x07, 0xf1, 0x49, 0x44, 0x41, 0x54, 0x93, 0x45, + 0xcd, 0xf9, 0x17, 0x77, 0x1f, 0x6a, 0x8e, 0x6f, 0xae, 0x0f, 0x4e, 0xaa, + 0xce, 0xaf, 0xdd, 0xff, 0xf3, 0xe1, 0x69, 0xd5, 0xf9, 0x3f, 0x7e, 0xbe, + 0xa9, 0x3a, 0x3f, 0x7b, 0xff, 0x2f, 0x47, 0x67, 0x55, 0xe7, 0xff, 0xf0, + 0xe9, 0x7d, 0xd5, 0xf9, 0xd9, 0xfb, 0x6f, 0xe6, 0x17, 0x55, 0xe7, 0x9f, + 0xde, 0x5e, 0x57, 0x9d, 0x9f, 0xbd, 0xff, 0xcf, 0xe3, 0xcb, 0xaa, 0xf3, + 0xbf, 0xff, 0xf8, 0xb6, 0xea, 0x7c, 0xfd, 0x31, 0xfd, 0x31, 0xfd, 0xb1, + 0xec, 0xfd, 0x07, 0x95, 0xfb, 0xef, 0xf4, 0x87, 0xfe, 0xae, 0xdc, 0xff, + 0x9d, 0xfe, 0xd0, 0x6d, 0xe5, 0xfe, 0xb9, 0xfe, 0xd0, 0xbb, 0xca, 0xfd, + 0xe7, 0xfa, 0x43, 0xfa, 0x63, 0xfa, 0x63, 0xfa, 0x63, 0xfa, 0x63, 0xd9, + 0x7f, 0x7e, 0x65, 0xef, 0xcf, 0xfe, 0xfb, 0x5b, 0xf6, 0xfe, 0xec, 0xef, + 0x5f, 0xb2, 0xf7, 0x67, 0x7f, 0xff, 0xae, 0x3f, 0xa6, 0x3f, 0xa6, 0x3f, + 0xa6, 0x3f, 0xa6, 0x3f, 0x96, 0xbd, 0x3f, 0xfb, 0xe7, 0x77, 0xd9, 0xfb, + 0xb3, 0x7f, 0x7e, 0x9d, 0xbd, 0x3f, 0xfb, 0xdf, 0x6f, 0x64, 0xef, 0x7f, + 0x53, 0x75, 0x7a, 0xd3, 0x5c, 0x55, 0x9e, 0xaf, 0x3f, 0xa6, 0x3f, 0xa6, + 0x3f, 0xf6, 0x0d, 0xfa, 0xfd, 0x37, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x0f, 0xdc, 0xde, 0xd4, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xb0, 0x2b, 0x4b, 0xb5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x48, 0x6f, + 0x7f, 0xea, 0x00, 0x00, 0x78, 0xea, 0x6e, 0xef, 0x3e, 0x8c, 0x32, 0x67, + 0x7e, 0x70, 0xd2, 0x79, 0xfc, 0xcd, 0x28, 0xd3, 0x9b, 0xe6, 0xaa, 0x70, + 0x3c, 0x7b, 0xff, 0x5f, 0x9f, 0x6f, 0x46, 0x99, 0xff, 0xec, 0xf0, 0xb4, + 0xf3, 0xb8, 0xfe, 0x56, 0xa9, 0xff, 0x8f, 0x4f, 0xef, 0x47, 0x99, 0xff, + 0xfc, 0xe8, 0xac, 0xf3, 0xb8, 0xfe, 0x56, 0xa9, 0xff, 0xb7, 0xdb, 0xeb, + 0x51, 0xe6, 0xbf, 0x9c, 0x5f, 0x74, 0x1e, 0xd7, 0xdf, 0x2a, 0xf5, 0xbf, + 0xfb, 0xf8, 0x76, 0x94, 0xf9, 0xe7, 0xc7, 0x97, 0x9d, 0xc7, 0xf5, 0xb7, + 0xf4, 0xc7, 0xf4, 0xc7, 0xf4, 0xc7, 0x4a, 0xfd, 0x3f, 0x8d, 0x32, 0xbd, + 0x69, 0x5e, 0x17, 0x8e, 0xeb, 0x6f, 0x95, 0xfa, 0x7f, 0x1d, 0x65, 0x7a, + 0xd3, 0xbc, 0x2a, 0x1c, 0xd7, 0xdf, 0x2a, 0xf5, 0xff, 0x3e, 0xca, 0xf4, + 0xa6, 0x79, 0x51, 0x38, 0xae, 0xbf, 0x55, 0xea, 0xaf, 0x4d, 0x7f, 0x4b, + 0xff, 0x76, 0xf4, 0xb7, 0xf4, 0x6f, 0x47, 0x7f, 0xeb, 0xb1, 0xfe, 0xfc, + 0xca, 0xde, 0x9f, 0xfd, 0xf7, 0xb7, 0xec, 0xfd, 0xd9, 0xdf, 0xbf, 0x64, + 0xef, 0xcf, 0xfe, 0xfe, 0x5d, 0x7f, 0x4b, 0x7f, 0x4c, 0x7f, 0x4c, 0x7f, + 0x4c, 0x7f, 0xec, 0xb1, 0xf6, 0x67, 0xff, 0xfc, 0x2e, 0x7b, 0x7f, 0xf6, + 0xcf, 0xaf, 0xb3, 0xf7, 0x67, 0xff, 0xfb, 0x8d, 0xec, 0xfd, 0xb5, 0xe9, + 0x6f, 0xe9, 0xdf, 0x8e, 0xfe, 0x96, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xbe, 0xa5, 0xbd, 0xa9, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x60, 0x57, 0x96, 0x6a, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x90, 0x9e, + 0xa5, 0x5a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x67, 0xa9, 0x16, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe9, 0x59, 0xaa, 0x05, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x40, 0x7a, 0x96, 0x6a, 0x01, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x90, 0xde, 0xfe, 0xbf, 0x9b, 0x66, 0x31, 0x75, 0x04, 0x00, 0x3c, + 0x35, 0xff, 0x9b, 0x3a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1e, 0x99, 0xfd, + 0x7f, 0x4d, 0x5d, 0x00, 0x00, 0x4f, 0x90, 0xa5, 0x5a, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x30, 0xae, 0xfd, 0xff, 0x4e, 0x5d, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3b, 0xda, 0x9b, 0x3a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x76, 0xb5, 0xff, 0x9f, 0xa9, 0x0b, 0x00, 0xe0, 0x09, 0x9a, 0x4f, + 0x1d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8f, 0xcc, 0xde, 0xd4, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xb0, 0x2b, 0x4b, 0xb5, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x48, 0xcf, 0x52, 0x2d, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xd2, 0xb3, 0x54, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xf4, + 0x2c, 0xd5, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x3d, 0x4b, 0xb5, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x48, 0x6f, 0x7f, 0xea, 0x00, 0x00, + 0x78, 0xea, 0xe6, 0x07, 0x27, 0x55, 0xe7, 0x5f, 0x55, 0x9d, 0x9e, 0xbf, + 0xff, 0xd9, 0xe1, 0x69, 0xd5, 0xf9, 0xfa, 0x63, 0xcf, 0x8f, 0xce, 0xaa, + 0xce, 0xd7, 0x1f, 0x7b, 0x39, 0xbf, 0xa8, 0x3a, 0x5f, 0x7f, 0xec, 0xfc, + 0xf8, 0xb2, 0xea, 0x7c, 0xfd, 0x31, 0xfd, 0x31, 0xfd, 0x31, 0xfd, 0xb1, + 0xd7, 0x55, 0xa7, 0xeb, 0xef, 0xf3, 0xaa, 0xea, 0x74, 0xfd, 0x7d, 0x5e, + 0x54, 0x9d, 0xae, 0x7f, 0x6a, 0xfa, 0xa7, 0xa5, 0x7f, 0x5a, 0xfa, 0xa7, + 0xa5, 0x3f, 0x96, 0xfd, 0xe7, 0x57, 0xf6, 0xfe, 0xec, 0xbf, 0xbf, 0x65, + 0xef, 0xcf, 0xfe, 0xfe, 0x25, 0x7b, 0x7f, 0xf6, 0xf7, 0xef, 0xfa, 0x63, + 0xfa, 0x63, 0xfa, 0x63, 0xfa, 0x63, 0xfa, 0x63, 0xd9, 0xfb, 0xb3, 0x7f, + 0x7e, 0x97, 0xbd, 0x3f, 0xfb, 0xe7, 0xd7, 0xd9, 0xfb, 0xb3, 0xff, 0xfd, + 0x46, 0xf6, 0xfe, 0xda, 0xf4, 0x4f, 0x4b, 0xff, 0xb4, 0xf4, 0x03, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x90, 0xd1, 0xde, 0xd4, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xb0, 0x2b, 0x4b, 0xb5, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x48, 0x6f, 0xd6, 0x34, 0xcd, 0x62, 0xea, 0x08, 0x00, 0x78, 0x6a, + 0xae, 0x2a, 0xcf, 0xbf, 0x3e, 0x38, 0xa9, 0x3a, 0xff, 0xe2, 0xee, 0x43, + 0xd5, 0xf9, 0xd9, 0xfb, 0x7f, 0x3e, 0x3c, 0xad, 0x3a, 0xff, 0xc7, 0xcf, + 0x37, 0x55, 0xe7, 0x67, 0xef, 0xff, 0xe5, 0xe8, 0xac, 0xea, 0xfc, 0x1f, + 0x3e, 0xbd, 0xaf, 0x3a, 0x3f, 0x7b, 0xff, 0xcd, 0xfc, 0xa2, 0xea, 0xfc, + 0xd3, 0xdb, 0xeb, 0xaa, 0xf3, 0xb3, 0xf7, 0xff, 0x79, 0x7c, 0x59, 0x75, + 0xfe, 0xf7, 0x1f, 0xdf, 0x56, 0x9d, 0xaf, 0x3f, 0xa6, 0x3f, 0xa6, 0x3f, + 0x76, 0x50, 0xb9, 0xff, 0x4e, 0x7f, 0xe8, 0xef, 0xca, 0xfd, 0xdf, 0xe9, + 0x0f, 0xdd, 0x56, 0xee, 0x9f, 0xeb, 0x0f, 0xbd, 0xab, 0xdc, 0x7f, 0xae, + 0x3f, 0xa4, 0x3f, 0xa6, 0x3f, 0xa6, 0x3f, 0xa6, 0x3f, 0x96, 0xfd, 0xe7, + 0x57, 0xf6, 0xfe, 0xec, 0xbf, 0xbf, 0x65, 0xef, 0xcf, 0xfe, 0xfe, 0x25, + 0x7b, 0x7f, 0xf6, 0xf7, 0xef, 0xfa, 0x63, 0xfa, 0x63, 0xfa, 0x63, 0xfa, + 0x63, 0xfa, 0x63, 0xfa, 0x63, 0xb5, 0xfb, 0xb3, 0x7f, 0x7e, 0x97, 0xbd, + 0x3f, 0xfb, 0xe7, 0xd7, 0xd9, 0xfb, 0xb3, 0xff, 0xfd, 0x46, 0xf6, 0xfe, + 0x37, 0x55, 0xa7, 0xd7, 0xff, 0xfb, 0x31, 0xfd, 0x31, 0xfd, 0x31, 0xfd, + 0xbd, 0x66, 0xf5, 0xef, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x5d, + 0xec, 0x4d, 0x1d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xbb, 0xb2, + 0x54, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xf4, 0xf6, 0xa7, 0x0e, + 0x00, 0x80, 0xa7, 0xee, 0xcd, 0x48, 0x73, 0xae, 0x0a, 0xc7, 0x6f, 0xef, + 0x3e, 0x8c, 0x32, 0x7f, 0x7e, 0x70, 0xd2, 0x79, 0x5c, 0x7f, 0xab, 0xd4, + 0xff, 0xd7, 0xe7, 0x9b, 0x51, 0xe6, 0x3f, 0x3b, 0x3c, 0xed, 0x3c, 0xae, + 0xbf, 0x55, 0xea, 0xff, 0xe3, 0xd3, 0xfb, 0x51, 0xe6, 0x3f, 0x3f, 0x3a, + 0xeb, 0x3c, 0xae, 0xbf, 0x55, 0xea, 0xff, 0xed, 0xf6, 0x7a, 0x94, 0xf9, + 0x2f, 0xe7, 0x17, 0x9d, 0xc7, 0xf5, 0xb7, 0x4a, 0xfd, 0xef, 0x3e, 0xbe, + 0x1d, 0x65, 0xfe, 0xf9, 0xf1, 0x65, 0xe7, 0x71, 0xfd, 0x2d, 0xfd, 0x31, + 0xfd, 0xb1, 0xa9, 0xfa, 0x7f, 0x1a, 0x65, 0x7a, 0xd3, 0xbc, 0x2e, 0x1c, + 0xd7, 0xdf, 0x2a, 0xf5, 0xff, 0x3a, 0xca, 0xf4, 0xa6, 0x79, 0x55, 0x38, + 0xae, 0xbf, 0x55, 0xea, 0xff, 0x7d, 0x94, 0xe9, 0x4d, 0xf3, 0xa2, 0x70, + 0x5c, 0x7f, 0xab, 0xd4, 0x5f, 0x9b, 0xfe, 0x96, 0xfe, 0xed, 0xe8, 0x6f, + 0xe9, 0xdf, 0x8e, 0xfe, 0xd6, 0x63, 0xfd, 0xf9, 0x95, 0xbd, 0x3f, 0xfb, + 0xef, 0x6f, 0xd9, 0xfb, 0xb3, 0xbf, 0x7f, 0xc9, 0xde, 0x9f, 0xfd, 0xfd, + 0xbb, 0xfe, 0x96, 0xfe, 0x98, 0xfe, 0x98, 0xfe, 0x98, 0xfe, 0x98, 0xfe, + 0xd8, 0x54, 0xfd, 0xd9, 0x3f, 0xbf, 0xcb, 0xde, 0x9f, 0xfd, 0xf3, 0xeb, + 0xec, 0xfd, 0xd9, 0xff, 0x7e, 0x23, 0x7b, 0x7f, 0x6d, 0xfa, 0x5b, 0xfa, + 0xb7, 0xa3, 0xbf, 0x35, 0x55, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x0f, 0xd3, 0xde, 0xd4, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb0, + 0x2b, 0x4b, 0xb5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x48, 0xcf, 0x52, + 0x2d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd2, 0xb3, 0x54, 0x0b, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0xf4, 0x2c, 0xd5, 0x02, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x20, 0x3d, 0x4b, 0xb5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x48, 0xcf, 0x52, 0x2d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd2, 0xb3, + 0x54, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xf4, 0x2c, 0xd5, 0x02, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x3d, 0x4b, 0xb5, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x48, 0xcf, 0x52, 0x2d, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xd2, 0xb3, 0x54, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xf4, + 0x2c, 0xd5, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x3d, 0x4b, 0xb5, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x48, 0xcf, 0x52, 0x2d, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xd2, 0xb3, 0x54, 0x0b, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x80, 0xf4, 0x2c, 0xd5, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, + 0xbd, 0xfd, 0xa9, 0x03, 0x00, 0xe0, 0xa9, 0xbb, 0xaa, 0x3c, 0x7f, 0x7e, + 0x70, 0x52, 0x75, 0xbe, 0xfe, 0xd8, 0xb3, 0xc3, 0xd3, 0xaa, 0xf3, 0xf5, + 0xc7, 0x9e, 0x1f, 0x9d, 0x55, 0x9d, 0xaf, 0x3f, 0xf6, 0x72, 0x7e, 0x51, + 0x75, 0xbe, 0xfe, 0xd8, 0xf9, 0xf1, 0x65, 0xd5, 0xf9, 0xfa, 0x63, 0xfa, + 0x63, 0xfa, 0x63, 0xb5, 0xfb, 0x5f, 0x57, 0x9d, 0xae, 0xbf, 0xcf, 0xab, + 0xaa, 0xd3, 0xf5, 0xf7, 0x79, 0x51, 0x75, 0xba, 0xfe, 0xa9, 0xe9, 0x9f, + 0x96, 0xfe, 0x69, 0xe9, 0x9f, 0x96, 0xfe, 0x58, 0xf6, 0x9f, 0x5f, 0xd9, + 0xfb, 0xb3, 0xff, 0xfe, 0x96, 0xbd, 0x3f, 0xfb, 0xfb, 0x97, 0xec, 0xfd, + 0xd9, 0xdf, 0xbf, 0xeb, 0x8f, 0xe9, 0x8f, 0xe9, 0x8f, 0xe9, 0x8f, 0xe9, + 0x8f, 0xe9, 0x8f, 0xf9, 0xfc, 0x2e, 0x96, 0xbd, 0x3f, 0xfb, 0xe7, 0xd7, + 0xd9, 0xfb, 0xb3, 0xff, 0xfd, 0x46, 0xf6, 0xfe, 0xda, 0xf4, 0x4f, 0x4b, + 0xff, 0xb4, 0xb2, 0xf7, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x30, + 0xed, 0x4d, 0x1d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xbb, 0xb2, + 0x54, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xf4, 0xfe, 0x0f, 0x9e, + 0x29, 0x4e, 0x3f, 0x7f, 0xc8, 0xaa, 0xe4, 0x00, 0x00, 0x00, 0x00, 0x49, + 0x45, 0x4e, 0x44, 0xae, 0x42, 0x60, 0x82 +}; +unsigned int Spritesheet_png_len = 215407; diff --git a/disasterserver_c/ui/TButton.c b/disasterserver_c/ui/TButton.c new file mode 100644 index 0000000..eaba1a4 --- /dev/null +++ b/disasterserver_c/ui/TButton.c @@ -0,0 +1,52 @@ +#include + +bool tbutton_update(SDL_Renderer* renderer, struct _Component* component) +{ + ToggleButton* button = (ToggleButton*)component; + SDL_FRect src = { button->x, button->y, button->w, button->h }; + SDL_FRect dst = { button->d_x * INTERFACE_SCALE, button->d_y * INTERFACE_SCALE, button->d_w * INTERFACE_SCALE, button->d_h * INTERFACE_SCALE }; + + float mouse_x, mouse_y; + float scale_x, scale_y; + Uint32 flags = SDL_GetMouseState(&mouse_x, &mouse_y); + SDL_GetRenderScale(renderer, &scale_x, &scale_y); + + mouse_x /= scale_x; + mouse_y /= scale_y; + + if (mouse_x >= dst.x && mouse_y >= dst.y && mouse_x < dst.x + dst.w && mouse_y < dst.y + dst.h) + { + src.x += src.w; + + if (flags & SDL_BUTTON_MASK(1)) + { + if (!button->clicked && button->cb) + { + *button->value = !(*button->value); + button->cb(component); + button->clicked = true; + } + dst.y += 2; + } + else + button->clicked = false; + } + else + { + if (*button->value) + { + if(!button->reverse) + src.x += src.w * 2; + } + else + { + if (button->reverse) + src.x += src.w * 2; + } + + button->clicked = false; + } + + SDL_RenderTexture(renderer, g_textureSheet, &src, &dst); + return true; +} diff --git a/resources/Spritesheet.png b/resources/Spritesheet.png new file mode 100644 index 0000000000000000000000000000000000000000..af19320d5c965adb5483c75836906c343e43d3ea GIT binary patch literal 215407 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

X-vmV{#pZ;LP&>f!uYbJ~;n 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 literal 0 HcmV?d00001 diff --git a/resources/icon.ico b/resources/icon.ico new file mode 100644 index 0000000000000000000000000000000000000000..199c4323b767596a04f009c5f3985ba2dc9fd634 GIT binary patch literal 204862 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

NbE6?U$SUJ$dAf_T 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

ak6 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 I`X}&z0c#595dZ)H literal 0 HcmV?d00001 diff --git a/resources/icon.rc b/resources/icon.rc new file mode 100644 index 0000000..14d43bd --- /dev/null +++ b/resources/icon.rc @@ -0,0 +1 @@ +IDI_ICON1 ICON "icon.ico" \ No newline at end of file diff --git a/resources/isiskdjdnd.png b/resources/isiskdjdnd.png new file mode 100644 index 0000000000000000000000000000000000000000..19766b7d8e5dc3afe97c7a7c5edcf8adad614cbb GIT binary patch literal 804 zcmV+<1Ka$GP)aYg5FPAL2Wc%yiy+lf)ZB-e=~Vd+u*yp@xl|$rq0f zZ7{xjck?&;N1N)Z?YI61m_R1u`}v`zVl^Tk!Qh_BVoO`2*vyUD%z}76v-Z)oZfAWb z>M{)6F@f7DTw$T#AHz? zu}t9fgx~~@U5_I%3?H~8mPE*yNfdz>+}b^bSZ^FRh6jZA68y^HlZxQ(hZl;-OM;Z9 zfZpri?Y)0+AlxqTukk!S&x)#xO|qzX&-p7v|y4kqsd%cD=k{kOszx;Ab>p}iIP z)tp)v4u@R?$z)QHIKb->aa34d?`h4!dQ5F=KqwSKA)Utgb5URUO?*oFo{>agXeunP z%uCyMDR3IWA3nCl=1N92T<=w3>;r}b4uL3D+Xg?ijKCyd0m#Jr2q=x7G?l|5ZGLu1 zT}KBl<4s~cxyO6@@K(D|EzT*d7M%7g=*X=AxpARj|K70herxMymq)HPO}Hy*{LAO+ zqk`dKf^|FQcxlJ)DFyGl$HeuKv2K_5G8f)lS^8{AJ0+^;fJP7(P@?=CZt%1gR$>_y z1RAcQ@$VxPJY^V+uHxYGML|SGl33*?8WjYxl3WVdZ6j@YF^4#~qylc>Mpjb6-sE@; zAFvF|182>JGKt=}s*}B83Qo_8&XwLtW8%HdM$kj-YUkI~D}sQB1rL}K^K1P4eiqG6 zMNOe3TY9F)S=PVdpn}A7<$$9?PQq;FDbllD=wM|{zeJF<323;j!Y5xEg-=$PtjI!wf0000x literal 0 HcmV?d00001 diff --git a/shell.nix b/shell.nix new file mode 100644 index 0000000..0008db5 --- /dev/null +++ b/shell.nix @@ -0,0 +1,5 @@ +{ pkgs ? import {}}: + +pkgs.mkShell { + packages = with pkgs; [ gdb zlib curl.dev SDL2 SDL2_image openssl.dev cmake gnumake clang pkg-config ]; +} diff --git a/thirdparty/cjson/CMakeLists.txt b/thirdparty/cjson/CMakeLists.txt new file mode 100644 index 0000000..ba5da3e --- /dev/null +++ b/thirdparty/cjson/CMakeLists.txt @@ -0,0 +1,8 @@ +project(cJSON LANGUAGES C) + +add_library(cJSON STATIC + ${CMAKE_CURRENT_SOURCE_DIR}/cJSON.C + ${CMAKE_CURRENT_SOURCE_DIR}/cJSON_Utils.C +) + +target_include_directories(cJSON PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}) \ No newline at end of file diff --git a/thirdparty/cjson/cJSON.c b/thirdparty/cjson/cJSON.c new file mode 100644 index 0000000..6e4fb0d --- /dev/null +++ b/thirdparty/cjson/cJSON.c @@ -0,0 +1,3191 @@ +/* + Copyright (c) 2009-2017 Dave Gamble and cJSON contributors + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + THE SOFTWARE. +*/ + +/* cJSON */ +/* JSON parser in C. */ + +/* disable warnings about old C89 functions in MSVC */ +#if !defined(_CRT_SECURE_NO_DEPRECATE) && defined(_MSC_VER) +#define _CRT_SECURE_NO_DEPRECATE +#endif + +#ifdef __GNUC__ +#pragma GCC visibility push(default) +#endif +#if defined(_MSC_VER) +#pragma warning (push) +/* disable warning about single line comments in system headers */ +#pragma warning (disable : 4001) +#endif + +#include +#include +#include +#include +#include +#include +#include + +#ifdef ENABLE_LOCALES +#include +#endif + +#if defined(_MSC_VER) +#pragma warning (pop) +#endif +#ifdef __GNUC__ +#pragma GCC visibility pop +#endif + +#include "cJSON.h" + +/* define our own boolean type */ +#ifdef true +#undef true +#endif +#define true ((cJSON_bool)1) + +#ifdef false +#undef false +#endif +#define false ((cJSON_bool)0) + +/* define isnan and isinf for ANSI C, if in C99 or above, isnan and isinf has been defined in math.h */ +#ifndef isinf +#define isinf(d) (isnan((d - d)) && !isnan(d)) +#endif +#ifndef isnan +#define isnan(d) (d != d) +#endif + +#ifndef NAN +#ifdef _WIN32 +#define NAN sqrt(-1.0) +#else +#define NAN 0.0/0.0 +#endif +#endif + +typedef struct { + const unsigned char *json; + size_t position; +} error; +static error global_error = { NULL, 0 }; + +CJSON_PUBLIC(const char *) cJSON_GetErrorPtr(void) +{ + return (const char*) (global_error.json + global_error.position); +} + +CJSON_PUBLIC(char *) cJSON_GetStringValue(const cJSON * const item) +{ + if (!cJSON_IsString(item)) + { + return NULL; + } + + return item->valuestring; +} + +CJSON_PUBLIC(double) cJSON_GetNumberValue(const cJSON * const item) +{ + if (!cJSON_IsNumber(item)) + { + return (double) NAN; + } + + return item->valuedouble; +} + +/* This is a safeguard to prevent copy-pasters from using incompatible C and header files */ +#if (CJSON_VERSION_MAJOR != 1) || (CJSON_VERSION_MINOR != 7) || (CJSON_VERSION_PATCH != 19) + #error cJSON.h and cJSON.c have different versions. Make sure that both have the same. +#endif + +CJSON_PUBLIC(const char*) cJSON_Version(void) +{ + static char version[15]; + sprintf(version, "%i.%i.%i", CJSON_VERSION_MAJOR, CJSON_VERSION_MINOR, CJSON_VERSION_PATCH); + + return version; +} + +/* Case insensitive string comparison, doesn't consider two NULL pointers equal though */ +static int case_insensitive_strcmp(const unsigned char *string1, const unsigned char *string2) +{ + if ((string1 == NULL) || (string2 == NULL)) + { + return 1; + } + + if (string1 == string2) + { + return 0; + } + + for(; tolower(*string1) == tolower(*string2); (void)string1++, string2++) + { + if (*string1 == '\0') + { + return 0; + } + } + + return tolower(*string1) - tolower(*string2); +} + +typedef struct internal_hooks +{ + void *(CJSON_CDECL *allocate)(size_t size); + void (CJSON_CDECL *deallocate)(void *pointer); + void *(CJSON_CDECL *reallocate)(void *pointer, size_t size); +} internal_hooks; + +#if defined(_MSC_VER) +/* work around MSVC error C2322: '...' address of dllimport '...' is not static */ +static void * CJSON_CDECL internal_malloc(size_t size) +{ + return malloc(size); +} +static void CJSON_CDECL internal_free(void *pointer) +{ + free(pointer); +} +static void * CJSON_CDECL internal_realloc(void *pointer, size_t size) +{ + return realloc(pointer, size); +} +#else +#define internal_malloc malloc +#define internal_free free +#define internal_realloc realloc +#endif + +/* strlen of character literals resolved at compile time */ +#define static_strlen(string_literal) (sizeof(string_literal) - sizeof("")) + +static internal_hooks global_hooks = { internal_malloc, internal_free, internal_realloc }; + +static unsigned char* cJSON_strdup(const unsigned char* string, const internal_hooks * const hooks) +{ + size_t length = 0; + unsigned char *copy = NULL; + + if (string == NULL) + { + return NULL; + } + + length = strlen((const char*)string) + sizeof(""); + copy = (unsigned char*)hooks->allocate(length); + if (copy == NULL) + { + return NULL; + } + memcpy(copy, string, length); + + return copy; +} + +CJSON_PUBLIC(void) cJSON_InitHooks(cJSON_Hooks* hooks) +{ + if (hooks == NULL) + { + /* Reset hooks */ + global_hooks.allocate = malloc; + global_hooks.deallocate = free; + global_hooks.reallocate = realloc; + return; + } + + global_hooks.allocate = malloc; + if (hooks->malloc_fn != NULL) + { + global_hooks.allocate = hooks->malloc_fn; + } + + global_hooks.deallocate = free; + if (hooks->free_fn != NULL) + { + global_hooks.deallocate = hooks->free_fn; + } + + /* use realloc only if both free and malloc are used */ + global_hooks.reallocate = NULL; + if ((global_hooks.allocate == malloc) && (global_hooks.deallocate == free)) + { + global_hooks.reallocate = realloc; + } +} + +/* Internal constructor. */ +static cJSON *cJSON_New_Item(const internal_hooks * const hooks) +{ + cJSON* node = (cJSON*)hooks->allocate(sizeof(cJSON)); + if (node) + { + memset(node, '\0', sizeof(cJSON)); + } + + return node; +} + +/* Delete a cJSON structure. */ +CJSON_PUBLIC(void) cJSON_Delete(cJSON *item) +{ + cJSON *next = NULL; + while (item != NULL) + { + next = item->next; + if (!(item->type & cJSON_IsReference) && (item->child != NULL)) + { + cJSON_Delete(item->child); + } + if (!(item->type & cJSON_IsReference) && (item->valuestring != NULL)) + { + global_hooks.deallocate(item->valuestring); + item->valuestring = NULL; + } + if (!(item->type & cJSON_StringIsConst) && (item->string != NULL)) + { + global_hooks.deallocate(item->string); + item->string = NULL; + } + global_hooks.deallocate(item); + item = next; + } +} + +/* get the decimal point character of the current locale */ +static unsigned char get_decimal_point(void) +{ +#ifdef ENABLE_LOCALES + struct lconv *lconv = localeconv(); + return (unsigned char) lconv->decimal_point[0]; +#else + return '.'; +#endif +} + +typedef struct +{ + const unsigned char *content; + size_t length; + size_t offset; + size_t depth; /* How deeply nested (in arrays/objects) is the input at the current offset. */ + internal_hooks hooks; +} parse_buffer; + +/* check if the given size is left to read in a given parse buffer (starting with 1) */ +#define can_read(buffer, size) ((buffer != NULL) && (((buffer)->offset + size) <= (buffer)->length)) +/* check if the buffer can be accessed at the given index (starting with 0) */ +#define can_access_at_index(buffer, index) ((buffer != NULL) && (((buffer)->offset + index) < (buffer)->length)) +#define cannot_access_at_index(buffer, index) (!can_access_at_index(buffer, index)) +/* get a pointer to the buffer at the position */ +#define buffer_at_offset(buffer) ((buffer)->content + (buffer)->offset) + +/* Parse the input text to generate a number, and populate the result into item. */ +static cJSON_bool parse_number(cJSON * const item, parse_buffer * const input_buffer) +{ + double number = 0; + unsigned char *after_end = NULL; + unsigned char *number_c_string; + unsigned char decimal_point = get_decimal_point(); + size_t i = 0; + size_t number_string_length = 0; + cJSON_bool has_decimal_point = false; + + if ((input_buffer == NULL) || (input_buffer->content == NULL)) + { + return false; + } + + /* copy the number into a temporary buffer and replace '.' with the decimal point + * of the current locale (for strtod) + * This also takes care of '\0' not necessarily being available for marking the end of the input */ + for (i = 0; can_access_at_index(input_buffer, i); i++) + { + switch (buffer_at_offset(input_buffer)[i]) + { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case '+': + case '-': + case 'e': + case 'E': + number_string_length++; + break; + + case '.': + number_string_length++; + has_decimal_point = true; + break; + + default: + goto loop_end; + } + } +loop_end: + /* malloc for temporary buffer, add 1 for '\0' */ + number_c_string = (unsigned char *) input_buffer->hooks.allocate(number_string_length + 1); + if (number_c_string == NULL) + { + return false; /* allocation failure */ + } + + memcpy(number_c_string, buffer_at_offset(input_buffer), number_string_length); + number_c_string[number_string_length] = '\0'; + + if (has_decimal_point) + { + for (i = 0; i < number_string_length; i++) + { + if (number_c_string[i] == '.') + { + /* replace '.' with the decimal point of the current locale (for strtod) */ + number_c_string[i] = decimal_point; + } + } + } + + number = strtod((const char*)number_c_string, (char**)&after_end); + if (number_c_string == after_end) + { + /* free the temporary buffer */ + input_buffer->hooks.deallocate(number_c_string); + return false; /* parse_error */ + } + + item->valuedouble = number; + + /* use saturation in case of overflow */ + if (number >= INT_MAX) + { + item->valueint = INT_MAX; + } + else if (number <= (double)INT_MIN) + { + item->valueint = INT_MIN; + } + else + { + item->valueint = (int)number; + } + + item->type = cJSON_Number; + + input_buffer->offset += (size_t)(after_end - number_c_string); + /* free the temporary buffer */ + input_buffer->hooks.deallocate(number_c_string); + return true; +} + +/* don't ask me, but the original cJSON_SetNumberValue returns an integer or double */ +CJSON_PUBLIC(double) cJSON_SetNumberHelper(cJSON *object, double number) +{ + if (number >= INT_MAX) + { + object->valueint = INT_MAX; + } + else if (number <= (double)INT_MIN) + { + object->valueint = INT_MIN; + } + else + { + object->valueint = (int)number; + } + + return object->valuedouble = number; +} + +/* Note: when passing a NULL valuestring, cJSON_SetValuestring treats this as an error and return NULL */ +CJSON_PUBLIC(char*) cJSON_SetValuestring(cJSON *object, const char *valuestring) +{ + char *copy = NULL; + size_t v1_len; + size_t v2_len; + /* if object's type is not cJSON_String or is cJSON_IsReference, it should not set valuestring */ + if ((object == NULL) || !(object->type & cJSON_String) || (object->type & cJSON_IsReference)) + { + return NULL; + } + /* return NULL if the object is corrupted or valuestring is NULL */ + if (object->valuestring == NULL || valuestring == NULL) + { + return NULL; + } + + v1_len = strlen(valuestring); + v2_len = strlen(object->valuestring); + + if (v1_len <= v2_len) + { + /* strcpy does not handle overlapping string: [X1, X2] [Y1, Y2] => X2 < Y1 or Y2 < X1 */ + if (!( valuestring + v1_len < object->valuestring || object->valuestring + v2_len < valuestring )) + { + return NULL; + } + strcpy(object->valuestring, valuestring); + return object->valuestring; + } + copy = (char*) cJSON_strdup((const unsigned char*)valuestring, &global_hooks); + if (copy == NULL) + { + return NULL; + } + if (object->valuestring != NULL) + { + cJSON_free(object->valuestring); + } + object->valuestring = copy; + + return copy; +} + +typedef struct +{ + unsigned char *buffer; + size_t length; + size_t offset; + size_t depth; /* current nesting depth (for formatted printing) */ + cJSON_bool noalloc; + cJSON_bool format; /* is this print a formatted print */ + internal_hooks hooks; +} printbuffer; + +/* realloc printbuffer if necessary to have at least "needed" bytes more */ +static unsigned char* ensure(printbuffer * const p, size_t needed) +{ + unsigned char *newbuffer = NULL; + size_t newsize = 0; + + if ((p == NULL) || (p->buffer == NULL)) + { + return NULL; + } + + if ((p->length > 0) && (p->offset >= p->length)) + { + /* make sure that offset is valid */ + return NULL; + } + + if (needed > INT_MAX) + { + /* sizes bigger than INT_MAX are currently not supported */ + return NULL; + } + + needed += p->offset + 1; + if (needed <= p->length) + { + return p->buffer + p->offset; + } + + if (p->noalloc) { + return NULL; + } + + /* calculate new buffer size */ + if (needed > (INT_MAX / 2)) + { + /* overflow of int, use INT_MAX if possible */ + if (needed <= INT_MAX) + { + newsize = INT_MAX; + } + else + { + return NULL; + } + } + else + { + newsize = needed * 2; + } + + if (p->hooks.reallocate != NULL) + { + /* reallocate with realloc if available */ + newbuffer = (unsigned char*)p->hooks.reallocate(p->buffer, newsize); + if (newbuffer == NULL) + { + p->hooks.deallocate(p->buffer); + p->length = 0; + p->buffer = NULL; + + return NULL; + } + } + else + { + /* otherwise reallocate manually */ + newbuffer = (unsigned char*)p->hooks.allocate(newsize); + if (!newbuffer) + { + p->hooks.deallocate(p->buffer); + p->length = 0; + p->buffer = NULL; + + return NULL; + } + + memcpy(newbuffer, p->buffer, p->offset + 1); + p->hooks.deallocate(p->buffer); + } + p->length = newsize; + p->buffer = newbuffer; + + return newbuffer + p->offset; +} + +/* calculate the new length of the string in a printbuffer and update the offset */ +static void update_offset(printbuffer * const buffer) +{ + const unsigned char *buffer_pointer = NULL; + if ((buffer == NULL) || (buffer->buffer == NULL)) + { + return; + } + buffer_pointer = buffer->buffer + buffer->offset; + + buffer->offset += strlen((const char*)buffer_pointer); +} + +/* securely comparison of floating-point variables */ +static cJSON_bool compare_double(double a, double b) +{ + double maxVal = fabs(a) > fabs(b) ? fabs(a) : fabs(b); + return (fabs(a - b) <= maxVal * DBL_EPSILON); +} + +/* Render the number nicely from the given item into a string. */ +static cJSON_bool print_number(const cJSON * const item, printbuffer * const output_buffer) +{ + unsigned char *output_pointer = NULL; + double d = item->valuedouble; + int length = 0; + size_t i = 0; + unsigned char number_buffer[26] = {0}; /* temporary buffer to print the number into */ + unsigned char decimal_point = get_decimal_point(); + double test = 0.0; + + if (output_buffer == NULL) + { + return false; + } + + /* This checks for NaN and Infinity */ + if (isnan(d) || isinf(d)) + { + length = sprintf((char*)number_buffer, "null"); + } + else if(d == (double)item->valueint) + { + length = sprintf((char*)number_buffer, "%d", item->valueint); + } + else + { + /* Try 15 decimal places of precision to avoid nonsignificant nonzero digits */ + length = sprintf((char*)number_buffer, "%1.15g", d); + + /* Check whether the original double can be recovered */ + if ((sscanf((char*)number_buffer, "%lg", &test) != 1) || !compare_double((double)test, d)) + { + /* If not, print with 17 decimal places of precision */ + length = sprintf((char*)number_buffer, "%1.17g", d); + } + } + + /* sprintf failed or buffer overrun occurred */ + if ((length < 0) || (length > (int)(sizeof(number_buffer) - 1))) + { + return false; + } + + /* reserve appropriate space in the output */ + output_pointer = ensure(output_buffer, (size_t)length + sizeof("")); + if (output_pointer == NULL) + { + return false; + } + + /* copy the printed number to the output and replace locale + * dependent decimal point with '.' */ + for (i = 0; i < ((size_t)length); i++) + { + if (number_buffer[i] == decimal_point) + { + output_pointer[i] = '.'; + continue; + } + + output_pointer[i] = number_buffer[i]; + } + output_pointer[i] = '\0'; + + output_buffer->offset += (size_t)length; + + return true; +} + +/* parse 4 digit hexadecimal number */ +static unsigned parse_hex4(const unsigned char * const input) +{ + unsigned int h = 0; + size_t i = 0; + + for (i = 0; i < 4; i++) + { + /* parse digit */ + if ((input[i] >= '0') && (input[i] <= '9')) + { + h += (unsigned int) input[i] - '0'; + } + else if ((input[i] >= 'A') && (input[i] <= 'F')) + { + h += (unsigned int) 10 + input[i] - 'A'; + } + else if ((input[i] >= 'a') && (input[i] <= 'f')) + { + h += (unsigned int) 10 + input[i] - 'a'; + } + else /* invalid */ + { + return 0; + } + + if (i < 3) + { + /* shift left to make place for the next nibble */ + h = h << 4; + } + } + + return h; +} + +/* converts a UTF-16 literal to UTF-8 + * A literal can be one or two sequences of the form \uXXXX */ +static unsigned char utf16_literal_to_utf8(const unsigned char * const input_pointer, const unsigned char * const input_end, unsigned char **output_pointer) +{ + long unsigned int codepoint = 0; + unsigned int first_code = 0; + const unsigned char *first_sequence = input_pointer; + unsigned char utf8_length = 0; + unsigned char utf8_position = 0; + unsigned char sequence_length = 0; + unsigned char first_byte_mark = 0; + + if ((input_end - first_sequence) < 6) + { + /* input ends unexpectedly */ + goto fail; + } + + /* get the first utf16 sequence */ + first_code = parse_hex4(first_sequence + 2); + + /* check that the code is valid */ + if (((first_code >= 0xDC00) && (first_code <= 0xDFFF))) + { + goto fail; + } + + /* UTF16 surrogate pair */ + if ((first_code >= 0xD800) && (first_code <= 0xDBFF)) + { + const unsigned char *second_sequence = first_sequence + 6; + unsigned int second_code = 0; + sequence_length = 12; /* \uXXXX\uXXXX */ + + if ((input_end - second_sequence) < 6) + { + /* input ends unexpectedly */ + goto fail; + } + + if ((second_sequence[0] != '\\') || (second_sequence[1] != 'u')) + { + /* missing second half of the surrogate pair */ + goto fail; + } + + /* get the second utf16 sequence */ + second_code = parse_hex4(second_sequence + 2); + /* check that the code is valid */ + if ((second_code < 0xDC00) || (second_code > 0xDFFF)) + { + /* invalid second half of the surrogate pair */ + goto fail; + } + + + /* calculate the unicode codepoint from the surrogate pair */ + codepoint = 0x10000 + (((first_code & 0x3FF) << 10) | (second_code & 0x3FF)); + } + else + { + sequence_length = 6; /* \uXXXX */ + codepoint = first_code; + } + + /* encode as UTF-8 + * takes at maximum 4 bytes to encode: + * 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx */ + if (codepoint < 0x80) + { + /* normal ascii, encoding 0xxxxxxx */ + utf8_length = 1; + } + else if (codepoint < 0x800) + { + /* two bytes, encoding 110xxxxx 10xxxxxx */ + utf8_length = 2; + first_byte_mark = 0xC0; /* 11000000 */ + } + else if (codepoint < 0x10000) + { + /* three bytes, encoding 1110xxxx 10xxxxxx 10xxxxxx */ + utf8_length = 3; + first_byte_mark = 0xE0; /* 11100000 */ + } + else if (codepoint <= 0x10FFFF) + { + /* four bytes, encoding 1110xxxx 10xxxxxx 10xxxxxx 10xxxxxx */ + utf8_length = 4; + first_byte_mark = 0xF0; /* 11110000 */ + } + else + { + /* invalid unicode codepoint */ + goto fail; + } + + /* encode as utf8 */ + for (utf8_position = (unsigned char)(utf8_length - 1); utf8_position > 0; utf8_position--) + { + /* 10xxxxxx */ + (*output_pointer)[utf8_position] = (unsigned char)((codepoint | 0x80) & 0xBF); + codepoint >>= 6; + } + /* encode first byte */ + if (utf8_length > 1) + { + (*output_pointer)[0] = (unsigned char)((codepoint | first_byte_mark) & 0xFF); + } + else + { + (*output_pointer)[0] = (unsigned char)(codepoint & 0x7F); + } + + *output_pointer += utf8_length; + + return sequence_length; + +fail: + return 0; +} + +/* Parse the input text into an unescaped cinput, and populate item. */ +static cJSON_bool parse_string(cJSON * const item, parse_buffer * const input_buffer) +{ + const unsigned char *input_pointer = buffer_at_offset(input_buffer) + 1; + const unsigned char *input_end = buffer_at_offset(input_buffer) + 1; + unsigned char *output_pointer = NULL; + unsigned char *output = NULL; + + /* not a string */ + if (buffer_at_offset(input_buffer)[0] != '\"') + { + goto fail; + } + + { + /* calculate approximate size of the output (overestimate) */ + size_t allocation_length = 0; + size_t skipped_bytes = 0; + while (((size_t)(input_end - input_buffer->content) < input_buffer->length) && (*input_end != '\"')) + { + /* is escape sequence */ + if (input_end[0] == '\\') + { + if ((size_t)(input_end + 1 - input_buffer->content) >= input_buffer->length) + { + /* prevent buffer overflow when last input character is a backslash */ + goto fail; + } + skipped_bytes++; + input_end++; + } + input_end++; + } + if (((size_t)(input_end - input_buffer->content) >= input_buffer->length) || (*input_end != '\"')) + { + goto fail; /* string ended unexpectedly */ + } + + /* This is at most how much we need for the output */ + allocation_length = (size_t) (input_end - buffer_at_offset(input_buffer)) - skipped_bytes; + output = (unsigned char*)input_buffer->hooks.allocate(allocation_length + sizeof("")); + if (output == NULL) + { + goto fail; /* allocation failure */ + } + } + + output_pointer = output; + /* loop through the string literal */ + while (input_pointer < input_end) + { + if (*input_pointer != '\\') + { + *output_pointer++ = *input_pointer++; + } + /* escape sequence */ + else + { + unsigned char sequence_length = 2; + if ((input_end - input_pointer) < 1) + { + goto fail; + } + + switch (input_pointer[1]) + { + case 'b': + *output_pointer++ = '\b'; + break; + case 'f': + *output_pointer++ = '\f'; + break; + case 'n': + *output_pointer++ = '\n'; + break; + case 'r': + *output_pointer++ = '\r'; + break; + case 't': + *output_pointer++ = '\t'; + break; + case '\"': + case '\\': + case '/': + *output_pointer++ = input_pointer[1]; + break; + + /* UTF-16 literal */ + case 'u': + sequence_length = utf16_literal_to_utf8(input_pointer, input_end, &output_pointer); + if (sequence_length == 0) + { + /* failed to convert UTF16-literal to UTF-8 */ + goto fail; + } + break; + + default: + goto fail; + } + input_pointer += sequence_length; + } + } + + /* zero terminate the output */ + *output_pointer = '\0'; + + item->type = cJSON_String; + item->valuestring = (char*)output; + + input_buffer->offset = (size_t) (input_end - input_buffer->content); + input_buffer->offset++; + + return true; + +fail: + if (output != NULL) + { + input_buffer->hooks.deallocate(output); + output = NULL; + } + + if (input_pointer != NULL) + { + input_buffer->offset = (size_t)(input_pointer - input_buffer->content); + } + + return false; +} + +/* Render the cstring provided to an escaped version that can be printed. */ +static cJSON_bool print_string_ptr(const unsigned char * const input, printbuffer * const output_buffer) +{ + const unsigned char *input_pointer = NULL; + unsigned char *output = NULL; + unsigned char *output_pointer = NULL; + size_t output_length = 0; + /* numbers of additional characters needed for escaping */ + size_t escape_characters = 0; + + if (output_buffer == NULL) + { + return false; + } + + /* empty string */ + if (input == NULL) + { + output = ensure(output_buffer, sizeof("\"\"")); + if (output == NULL) + { + return false; + } + strcpy((char*)output, "\"\""); + + return true; + } + + /* set "flag" to 1 if something needs to be escaped */ + for (input_pointer = input; *input_pointer; input_pointer++) + { + switch (*input_pointer) + { + case '\"': + case '\\': + case '\b': + case '\f': + case '\n': + case '\r': + case '\t': + /* one character escape sequence */ + escape_characters++; + break; + default: + if (*input_pointer < 32) + { + /* UTF-16 escape sequence uXXXX */ + escape_characters += 5; + } + break; + } + } + output_length = (size_t)(input_pointer - input) + escape_characters; + + output = ensure(output_buffer, output_length + sizeof("\"\"")); + if (output == NULL) + { + return false; + } + + /* no characters have to be escaped */ + if (escape_characters == 0) + { + output[0] = '\"'; + memcpy(output + 1, input, output_length); + output[output_length + 1] = '\"'; + output[output_length + 2] = '\0'; + + return true; + } + + output[0] = '\"'; + output_pointer = output + 1; + /* copy the string */ + for (input_pointer = input; *input_pointer != '\0'; (void)input_pointer++, output_pointer++) + { + if ((*input_pointer > 31) && (*input_pointer != '\"') && (*input_pointer != '\\')) + { + /* normal character, copy */ + *output_pointer = *input_pointer; + } + else + { + /* character needs to be escaped */ + *output_pointer++ = '\\'; + switch (*input_pointer) + { + case '\\': + *output_pointer = '\\'; + break; + case '\"': + *output_pointer = '\"'; + break; + case '\b': + *output_pointer = 'b'; + break; + case '\f': + *output_pointer = 'f'; + break; + case '\n': + *output_pointer = 'n'; + break; + case '\r': + *output_pointer = 'r'; + break; + case '\t': + *output_pointer = 't'; + break; + default: + /* escape and print as unicode codepoint */ + sprintf((char*)output_pointer, "u%04x", *input_pointer); + output_pointer += 4; + break; + } + } + } + output[output_length + 1] = '\"'; + output[output_length + 2] = '\0'; + + return true; +} + +/* Invoke print_string_ptr (which is useful) on an item. */ +static cJSON_bool print_string(const cJSON * const item, printbuffer * const p) +{ + return print_string_ptr((unsigned char*)item->valuestring, p); +} + +/* Predeclare these prototypes. */ +static cJSON_bool parse_value(cJSON * const item, parse_buffer * const input_buffer); +static cJSON_bool print_value(const cJSON * const item, printbuffer * const output_buffer); +static cJSON_bool parse_array(cJSON * const item, parse_buffer * const input_buffer); +static cJSON_bool print_array(const cJSON * const item, printbuffer * const output_buffer); +static cJSON_bool parse_object(cJSON * const item, parse_buffer * const input_buffer); +static cJSON_bool print_object(const cJSON * const item, printbuffer * const output_buffer); + +/* Utility to jump whitespace and cr/lf */ +static parse_buffer *buffer_skip_whitespace(parse_buffer * const buffer) +{ + if ((buffer == NULL) || (buffer->content == NULL)) + { + return NULL; + } + + if (cannot_access_at_index(buffer, 0)) + { + return buffer; + } + + while (can_access_at_index(buffer, 0) && (buffer_at_offset(buffer)[0] <= 32)) + { + buffer->offset++; + } + + if (buffer->offset == buffer->length) + { + buffer->offset--; + } + + return buffer; +} + +/* skip the UTF-8 BOM (byte order mark) if it is at the beginning of a buffer */ +static parse_buffer *skip_utf8_bom(parse_buffer * const buffer) +{ + if ((buffer == NULL) || (buffer->content == NULL) || (buffer->offset != 0)) + { + return NULL; + } + + if (can_access_at_index(buffer, 4) && (strncmp((const char*)buffer_at_offset(buffer), "\xEF\xBB\xBF", 3) == 0)) + { + buffer->offset += 3; + } + + return buffer; +} + +CJSON_PUBLIC(cJSON *) cJSON_ParseWithOpts(const char *value, const char **return_parse_end, cJSON_bool require_null_terminated) +{ + size_t buffer_length; + + if (NULL == value) + { + return NULL; + } + + /* Adding null character size due to require_null_terminated. */ + buffer_length = strlen(value) + sizeof(""); + + return cJSON_ParseWithLengthOpts(value, buffer_length, return_parse_end, require_null_terminated); +} + +/* Parse an object - create a new root, and populate. */ +CJSON_PUBLIC(cJSON *) cJSON_ParseWithLengthOpts(const char *value, size_t buffer_length, const char **return_parse_end, cJSON_bool require_null_terminated) +{ + parse_buffer buffer = { 0, 0, 0, 0, { 0, 0, 0 } }; + cJSON *item = NULL; + + /* reset error position */ + global_error.json = NULL; + global_error.position = 0; + + if (value == NULL || 0 == buffer_length) + { + goto fail; + } + + buffer.content = (const unsigned char*)value; + buffer.length = buffer_length; + buffer.offset = 0; + buffer.hooks = global_hooks; + + item = cJSON_New_Item(&global_hooks); + if (item == NULL) /* memory fail */ + { + goto fail; + } + + if (!parse_value(item, buffer_skip_whitespace(skip_utf8_bom(&buffer)))) + { + /* parse failure. ep is set. */ + goto fail; + } + + /* if we require null-terminated JSON without appended garbage, skip and then check for a null terminator */ + if (require_null_terminated) + { + buffer_skip_whitespace(&buffer); + if ((buffer.offset >= buffer.length) || buffer_at_offset(&buffer)[0] != '\0') + { + goto fail; + } + } + if (return_parse_end) + { + *return_parse_end = (const char*)buffer_at_offset(&buffer); + } + + return item; + +fail: + if (item != NULL) + { + cJSON_Delete(item); + } + + if (value != NULL) + { + error local_error; + local_error.json = (const unsigned char*)value; + local_error.position = 0; + + if (buffer.offset < buffer.length) + { + local_error.position = buffer.offset; + } + else if (buffer.length > 0) + { + local_error.position = buffer.length - 1; + } + + if (return_parse_end != NULL) + { + *return_parse_end = (const char*)local_error.json + local_error.position; + } + + global_error = local_error; + } + + return NULL; +} + +/* Default options for cJSON_Parse */ +CJSON_PUBLIC(cJSON *) cJSON_Parse(const char *value) +{ + return cJSON_ParseWithOpts(value, 0, 0); +} + +CJSON_PUBLIC(cJSON *) cJSON_ParseWithLength(const char *value, size_t buffer_length) +{ + return cJSON_ParseWithLengthOpts(value, buffer_length, 0, 0); +} + +#define cjson_min(a, b) (((a) < (b)) ? (a) : (b)) + +static unsigned char *print(const cJSON * const item, cJSON_bool format, const internal_hooks * const hooks) +{ + static const size_t default_buffer_size = 256; + printbuffer buffer[1]; + unsigned char *printed = NULL; + + memset(buffer, 0, sizeof(buffer)); + + /* create buffer */ + buffer->buffer = (unsigned char*) hooks->allocate(default_buffer_size); + buffer->length = default_buffer_size; + buffer->format = format; + buffer->hooks = *hooks; + if (buffer->buffer == NULL) + { + goto fail; + } + + /* print the value */ + if (!print_value(item, buffer)) + { + goto fail; + } + update_offset(buffer); + + /* check if reallocate is available */ + if (hooks->reallocate != NULL) + { + printed = (unsigned char*) hooks->reallocate(buffer->buffer, buffer->offset + 1); + if (printed == NULL) { + goto fail; + } + buffer->buffer = NULL; + } + else /* otherwise copy the JSON over to a new buffer */ + { + printed = (unsigned char*) hooks->allocate(buffer->offset + 1); + if (printed == NULL) + { + goto fail; + } + memcpy(printed, buffer->buffer, cjson_min(buffer->length, buffer->offset + 1)); + printed[buffer->offset] = '\0'; /* just to be sure */ + + /* free the buffer */ + hooks->deallocate(buffer->buffer); + buffer->buffer = NULL; + } + + return printed; + +fail: + if (buffer->buffer != NULL) + { + hooks->deallocate(buffer->buffer); + buffer->buffer = NULL; + } + + if (printed != NULL) + { + hooks->deallocate(printed); + printed = NULL; + } + + return NULL; +} + +/* Render a cJSON item/entity/structure to text. */ +CJSON_PUBLIC(char *) cJSON_Print(const cJSON *item) +{ + return (char*)print(item, true, &global_hooks); +} + +CJSON_PUBLIC(char *) cJSON_PrintUnformatted(const cJSON *item) +{ + return (char*)print(item, false, &global_hooks); +} + +CJSON_PUBLIC(char *) cJSON_PrintBuffered(const cJSON *item, int prebuffer, cJSON_bool fmt) +{ + printbuffer p = { 0, 0, 0, 0, 0, 0, { 0, 0, 0 } }; + + if (prebuffer < 0) + { + return NULL; + } + + p.buffer = (unsigned char*)global_hooks.allocate((size_t)prebuffer); + if (!p.buffer) + { + return NULL; + } + + p.length = (size_t)prebuffer; + p.offset = 0; + p.noalloc = false; + p.format = fmt; + p.hooks = global_hooks; + + if (!print_value(item, &p)) + { + global_hooks.deallocate(p.buffer); + p.buffer = NULL; + return NULL; + } + + return (char*)p.buffer; +} + +CJSON_PUBLIC(cJSON_bool) cJSON_PrintPreallocated(cJSON *item, char *buffer, const int length, const cJSON_bool format) +{ + printbuffer p = { 0, 0, 0, 0, 0, 0, { 0, 0, 0 } }; + + if ((length < 0) || (buffer == NULL)) + { + return false; + } + + p.buffer = (unsigned char*)buffer; + p.length = (size_t)length; + p.offset = 0; + p.noalloc = true; + p.format = format; + p.hooks = global_hooks; + + return print_value(item, &p); +} + +/* Parser core - when encountering text, process appropriately. */ +static cJSON_bool parse_value(cJSON * const item, parse_buffer * const input_buffer) +{ + if ((input_buffer == NULL) || (input_buffer->content == NULL)) + { + return false; /* no input */ + } + + /* parse the different types of values */ + /* null */ + if (can_read(input_buffer, 4) && (strncmp((const char*)buffer_at_offset(input_buffer), "null", 4) == 0)) + { + item->type = cJSON_NULL; + input_buffer->offset += 4; + return true; + } + /* false */ + if (can_read(input_buffer, 5) && (strncmp((const char*)buffer_at_offset(input_buffer), "false", 5) == 0)) + { + item->type = cJSON_False; + input_buffer->offset += 5; + return true; + } + /* true */ + if (can_read(input_buffer, 4) && (strncmp((const char*)buffer_at_offset(input_buffer), "true", 4) == 0)) + { + item->type = cJSON_True; + item->valueint = 1; + input_buffer->offset += 4; + return true; + } + /* string */ + if (can_access_at_index(input_buffer, 0) && (buffer_at_offset(input_buffer)[0] == '\"')) + { + return parse_string(item, input_buffer); + } + /* number */ + if (can_access_at_index(input_buffer, 0) && ((buffer_at_offset(input_buffer)[0] == '-') || ((buffer_at_offset(input_buffer)[0] >= '0') && (buffer_at_offset(input_buffer)[0] <= '9')))) + { + return parse_number(item, input_buffer); + } + /* array */ + if (can_access_at_index(input_buffer, 0) && (buffer_at_offset(input_buffer)[0] == '[')) + { + return parse_array(item, input_buffer); + } + /* object */ + if (can_access_at_index(input_buffer, 0) && (buffer_at_offset(input_buffer)[0] == '{')) + { + return parse_object(item, input_buffer); + } + + return false; +} + +/* Render a value to text. */ +static cJSON_bool print_value(const cJSON * const item, printbuffer * const output_buffer) +{ + unsigned char *output = NULL; + + if ((item == NULL) || (output_buffer == NULL)) + { + return false; + } + + switch ((item->type) & 0xFF) + { + case cJSON_NULL: + output = ensure(output_buffer, 5); + if (output == NULL) + { + return false; + } + strcpy((char*)output, "null"); + return true; + + case cJSON_False: + output = ensure(output_buffer, 6); + if (output == NULL) + { + return false; + } + strcpy((char*)output, "false"); + return true; + + case cJSON_True: + output = ensure(output_buffer, 5); + if (output == NULL) + { + return false; + } + strcpy((char*)output, "true"); + return true; + + case cJSON_Number: + return print_number(item, output_buffer); + + case cJSON_Raw: + { + size_t raw_length = 0; + if (item->valuestring == NULL) + { + return false; + } + + raw_length = strlen(item->valuestring) + sizeof(""); + output = ensure(output_buffer, raw_length); + if (output == NULL) + { + return false; + } + memcpy(output, item->valuestring, raw_length); + return true; + } + + case cJSON_String: + return print_string(item, output_buffer); + + case cJSON_Array: + return print_array(item, output_buffer); + + case cJSON_Object: + return print_object(item, output_buffer); + + default: + return false; + } +} + +/* Build an array from input text. */ +static cJSON_bool parse_array(cJSON * const item, parse_buffer * const input_buffer) +{ + cJSON *head = NULL; /* head of the linked list */ + cJSON *current_item = NULL; + + if (input_buffer->depth >= CJSON_NESTING_LIMIT) + { + return false; /* to deeply nested */ + } + input_buffer->depth++; + + if (buffer_at_offset(input_buffer)[0] != '[') + { + /* not an array */ + goto fail; + } + + input_buffer->offset++; + buffer_skip_whitespace(input_buffer); + if (can_access_at_index(input_buffer, 0) && (buffer_at_offset(input_buffer)[0] == ']')) + { + /* empty array */ + goto success; + } + + /* check if we skipped to the end of the buffer */ + if (cannot_access_at_index(input_buffer, 0)) + { + input_buffer->offset--; + goto fail; + } + + /* step back to character in front of the first element */ + input_buffer->offset--; + /* loop through the comma separated array elements */ + do + { + /* allocate next item */ + cJSON *new_item = cJSON_New_Item(&(input_buffer->hooks)); + if (new_item == NULL) + { + goto fail; /* allocation failure */ + } + + /* attach next item to list */ + if (head == NULL) + { + /* start the linked list */ + current_item = head = new_item; + } + else + { + /* add to the end and advance */ + current_item->next = new_item; + new_item->prev = current_item; + current_item = new_item; + } + + /* parse next value */ + input_buffer->offset++; + buffer_skip_whitespace(input_buffer); + if (!parse_value(current_item, input_buffer)) + { + goto fail; /* failed to parse value */ + } + buffer_skip_whitespace(input_buffer); + } + while (can_access_at_index(input_buffer, 0) && (buffer_at_offset(input_buffer)[0] == ',')); + + if (cannot_access_at_index(input_buffer, 0) || buffer_at_offset(input_buffer)[0] != ']') + { + goto fail; /* expected end of array */ + } + +success: + input_buffer->depth--; + + if (head != NULL) { + head->prev = current_item; + } + + item->type = cJSON_Array; + item->child = head; + + input_buffer->offset++; + + return true; + +fail: + if (head != NULL) + { + cJSON_Delete(head); + } + + return false; +} + +/* Render an array to text */ +static cJSON_bool print_array(const cJSON * const item, printbuffer * const output_buffer) +{ + unsigned char *output_pointer = NULL; + size_t length = 0; + cJSON *current_element = item->child; + + if (output_buffer == NULL) + { + return false; + } + + /* Compose the output array. */ + /* opening square bracket */ + output_pointer = ensure(output_buffer, 1); + if (output_pointer == NULL) + { + return false; + } + + *output_pointer = '['; + output_buffer->offset++; + output_buffer->depth++; + + while (current_element != NULL) + { + if (!print_value(current_element, output_buffer)) + { + return false; + } + update_offset(output_buffer); + if (current_element->next) + { + length = (size_t) (output_buffer->format ? 2 : 1); + output_pointer = ensure(output_buffer, length + 1); + if (output_pointer == NULL) + { + return false; + } + *output_pointer++ = ','; + if(output_buffer->format) + { + *output_pointer++ = ' '; + } + *output_pointer = '\0'; + output_buffer->offset += length; + } + current_element = current_element->next; + } + + output_pointer = ensure(output_buffer, 2); + if (output_pointer == NULL) + { + return false; + } + *output_pointer++ = ']'; + *output_pointer = '\0'; + output_buffer->depth--; + + return true; +} + +/* Build an object from the text. */ +static cJSON_bool parse_object(cJSON * const item, parse_buffer * const input_buffer) +{ + cJSON *head = NULL; /* linked list head */ + cJSON *current_item = NULL; + + if (input_buffer->depth >= CJSON_NESTING_LIMIT) + { + return false; /* to deeply nested */ + } + input_buffer->depth++; + + if (cannot_access_at_index(input_buffer, 0) || (buffer_at_offset(input_buffer)[0] != '{')) + { + goto fail; /* not an object */ + } + + input_buffer->offset++; + buffer_skip_whitespace(input_buffer); + if (can_access_at_index(input_buffer, 0) && (buffer_at_offset(input_buffer)[0] == '}')) + { + goto success; /* empty object */ + } + + /* check if we skipped to the end of the buffer */ + if (cannot_access_at_index(input_buffer, 0)) + { + input_buffer->offset--; + goto fail; + } + + /* step back to character in front of the first element */ + input_buffer->offset--; + /* loop through the comma separated array elements */ + do + { + /* allocate next item */ + cJSON *new_item = cJSON_New_Item(&(input_buffer->hooks)); + if (new_item == NULL) + { + goto fail; /* allocation failure */ + } + + /* attach next item to list */ + if (head == NULL) + { + /* start the linked list */ + current_item = head = new_item; + } + else + { + /* add to the end and advance */ + current_item->next = new_item; + new_item->prev = current_item; + current_item = new_item; + } + + if (cannot_access_at_index(input_buffer, 1)) + { + goto fail; /* nothing comes after the comma */ + } + + /* parse the name of the child */ + input_buffer->offset++; + buffer_skip_whitespace(input_buffer); + if (!parse_string(current_item, input_buffer)) + { + goto fail; /* failed to parse name */ + } + buffer_skip_whitespace(input_buffer); + + /* swap valuestring and string, because we parsed the name */ + current_item->string = current_item->valuestring; + current_item->valuestring = NULL; + + if (cannot_access_at_index(input_buffer, 0) || (buffer_at_offset(input_buffer)[0] != ':')) + { + goto fail; /* invalid object */ + } + + /* parse the value */ + input_buffer->offset++; + buffer_skip_whitespace(input_buffer); + if (!parse_value(current_item, input_buffer)) + { + goto fail; /* failed to parse value */ + } + buffer_skip_whitespace(input_buffer); + } + while (can_access_at_index(input_buffer, 0) && (buffer_at_offset(input_buffer)[0] == ',')); + + if (cannot_access_at_index(input_buffer, 0) || (buffer_at_offset(input_buffer)[0] != '}')) + { + goto fail; /* expected end of object */ + } + +success: + input_buffer->depth--; + + if (head != NULL) { + head->prev = current_item; + } + + item->type = cJSON_Object; + item->child = head; + + input_buffer->offset++; + return true; + +fail: + if (head != NULL) + { + cJSON_Delete(head); + } + + return false; +} + +/* Render an object to text. */ +static cJSON_bool print_object(const cJSON * const item, printbuffer * const output_buffer) +{ + unsigned char *output_pointer = NULL; + size_t length = 0; + cJSON *current_item = item->child; + + if (output_buffer == NULL) + { + return false; + } + + /* Compose the output: */ + length = (size_t) (output_buffer->format ? 2 : 1); /* fmt: {\n */ + output_pointer = ensure(output_buffer, length + 1); + if (output_pointer == NULL) + { + return false; + } + + *output_pointer++ = '{'; + output_buffer->depth++; + if (output_buffer->format) + { + *output_pointer++ = '\n'; + } + output_buffer->offset += length; + + while (current_item) + { + if (output_buffer->format) + { + size_t i; + output_pointer = ensure(output_buffer, output_buffer->depth); + if (output_pointer == NULL) + { + return false; + } + for (i = 0; i < output_buffer->depth; i++) + { + *output_pointer++ = '\t'; + } + output_buffer->offset += output_buffer->depth; + } + + /* print key */ + if (!print_string_ptr((unsigned char*)current_item->string, output_buffer)) + { + return false; + } + update_offset(output_buffer); + + length = (size_t) (output_buffer->format ? 2 : 1); + output_pointer = ensure(output_buffer, length); + if (output_pointer == NULL) + { + return false; + } + *output_pointer++ = ':'; + if (output_buffer->format) + { + *output_pointer++ = '\t'; + } + output_buffer->offset += length; + + /* print value */ + if (!print_value(current_item, output_buffer)) + { + return false; + } + update_offset(output_buffer); + + /* print comma if not last */ + length = ((size_t)(output_buffer->format ? 1 : 0) + (size_t)(current_item->next ? 1 : 0)); + output_pointer = ensure(output_buffer, length + 1); + if (output_pointer == NULL) + { + return false; + } + if (current_item->next) + { + *output_pointer++ = ','; + } + + if (output_buffer->format) + { + *output_pointer++ = '\n'; + } + *output_pointer = '\0'; + output_buffer->offset += length; + + current_item = current_item->next; + } + + output_pointer = ensure(output_buffer, output_buffer->format ? (output_buffer->depth + 1) : 2); + if (output_pointer == NULL) + { + return false; + } + if (output_buffer->format) + { + size_t i; + for (i = 0; i < (output_buffer->depth - 1); i++) + { + *output_pointer++ = '\t'; + } + } + *output_pointer++ = '}'; + *output_pointer = '\0'; + output_buffer->depth--; + + return true; +} + +/* Get Array size/item / object item. */ +CJSON_PUBLIC(int) cJSON_GetArraySize(const cJSON *array) +{ + cJSON *child = NULL; + size_t size = 0; + + if (array == NULL) + { + return 0; + } + + child = array->child; + + while(child != NULL) + { + size++; + child = child->next; + } + + /* FIXME: Can overflow here. Cannot be fixed without breaking the API */ + + return (int)size; +} + +static cJSON* get_array_item(const cJSON *array, size_t index) +{ + cJSON *current_child = NULL; + + if (array == NULL) + { + return NULL; + } + + current_child = array->child; + while ((current_child != NULL) && (index > 0)) + { + index--; + current_child = current_child->next; + } + + return current_child; +} + +CJSON_PUBLIC(cJSON *) cJSON_GetArrayItem(const cJSON *array, int index) +{ + if (index < 0) + { + return NULL; + } + + return get_array_item(array, (size_t)index); +} + +static cJSON *get_object_item(const cJSON * const object, const char * const name, const cJSON_bool case_sensitive) +{ + cJSON *current_element = NULL; + + if ((object == NULL) || (name == NULL)) + { + return NULL; + } + + current_element = object->child; + if (case_sensitive) + { + while ((current_element != NULL) && (current_element->string != NULL) && (strcmp(name, current_element->string) != 0)) + { + current_element = current_element->next; + } + } + else + { + while ((current_element != NULL) && (case_insensitive_strcmp((const unsigned char*)name, (const unsigned char*)(current_element->string)) != 0)) + { + current_element = current_element->next; + } + } + + if ((current_element == NULL) || (current_element->string == NULL)) { + return NULL; + } + + return current_element; +} + +CJSON_PUBLIC(cJSON *) cJSON_GetObjectItem(const cJSON * const object, const char * const string) +{ + return get_object_item(object, string, false); +} + +CJSON_PUBLIC(cJSON *) cJSON_GetObjectItemCaseSensitive(const cJSON * const object, const char * const string) +{ + return get_object_item(object, string, true); +} + +CJSON_PUBLIC(cJSON_bool) cJSON_HasObjectItem(const cJSON *object, const char *string) +{ + return cJSON_GetObjectItem(object, string) ? 1 : 0; +} + +/* Utility for array list handling. */ +static void suffix_object(cJSON *prev, cJSON *item) +{ + prev->next = item; + item->prev = prev; +} + +/* Utility for handling references. */ +static cJSON *create_reference(const cJSON *item, const internal_hooks * const hooks) +{ + cJSON *reference = NULL; + if (item == NULL) + { + return NULL; + } + + reference = cJSON_New_Item(hooks); + if (reference == NULL) + { + return NULL; + } + + memcpy(reference, item, sizeof(cJSON)); + reference->string = NULL; + reference->type |= cJSON_IsReference; + reference->next = reference->prev = NULL; + return reference; +} + +static cJSON_bool add_item_to_array(cJSON *array, cJSON *item) +{ + cJSON *child = NULL; + + if ((item == NULL) || (array == NULL) || (array == item)) + { + return false; + } + + child = array->child; + /* + * To find the last item in array quickly, we use prev in array + */ + if (child == NULL) + { + /* list is empty, start new one */ + array->child = item; + item->prev = item; + item->next = NULL; + } + else + { + /* append to the end */ + if (child->prev) + { + suffix_object(child->prev, item); + array->child->prev = item; + } + } + + return true; +} + +/* Add item to array/object. */ +CJSON_PUBLIC(cJSON_bool) cJSON_AddItemToArray(cJSON *array, cJSON *item) +{ + return add_item_to_array(array, item); +} + +#if defined(__clang__) || (defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 5)))) + #pragma GCC diagnostic push +#endif +#ifdef __GNUC__ +#pragma GCC diagnostic ignored "-Wcast-qual" +#endif +/* helper function to cast away const */ +static void* cast_away_const(const void* string) +{ + return (void*)string; +} +#if defined(__clang__) || (defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 5)))) + #pragma GCC diagnostic pop +#endif + + +static cJSON_bool add_item_to_object(cJSON * const object, const char * const string, cJSON * const item, const internal_hooks * const hooks, const cJSON_bool constant_key) +{ + char *new_key = NULL; + int new_type = cJSON_Invalid; + + if ((object == NULL) || (string == NULL) || (item == NULL) || (object == item)) + { + return false; + } + + if (constant_key) + { + new_key = (char*)cast_away_const(string); + new_type = item->type | cJSON_StringIsConst; + } + else + { + new_key = (char*)cJSON_strdup((const unsigned char*)string, hooks); + if (new_key == NULL) + { + return false; + } + + new_type = item->type & ~cJSON_StringIsConst; + } + + if (!(item->type & cJSON_StringIsConst) && (item->string != NULL)) + { + hooks->deallocate(item->string); + } + + item->string = new_key; + item->type = new_type; + + return add_item_to_array(object, item); +} + +CJSON_PUBLIC(cJSON_bool) cJSON_AddItemToObject(cJSON *object, const char *string, cJSON *item) +{ + return add_item_to_object(object, string, item, &global_hooks, false); +} + +/* Add an item to an object with constant string as key */ +CJSON_PUBLIC(cJSON_bool) cJSON_AddItemToObjectCS(cJSON *object, const char *string, cJSON *item) +{ + return add_item_to_object(object, string, item, &global_hooks, true); +} + +CJSON_PUBLIC(cJSON_bool) cJSON_AddItemReferenceToArray(cJSON *array, cJSON *item) +{ + if (array == NULL) + { + return false; + } + + return add_item_to_array(array, create_reference(item, &global_hooks)); +} + +CJSON_PUBLIC(cJSON_bool) cJSON_AddItemReferenceToObject(cJSON *object, const char *string, cJSON *item) +{ + if ((object == NULL) || (string == NULL)) + { + return false; + } + + return add_item_to_object(object, string, create_reference(item, &global_hooks), &global_hooks, false); +} + +CJSON_PUBLIC(cJSON*) cJSON_AddNullToObject(cJSON * const object, const char * const name) +{ + cJSON *null = cJSON_CreateNull(); + if (add_item_to_object(object, name, null, &global_hooks, false)) + { + return null; + } + + cJSON_Delete(null); + return NULL; +} + +CJSON_PUBLIC(cJSON*) cJSON_AddTrueToObject(cJSON * const object, const char * const name) +{ + cJSON *true_item = cJSON_CreateTrue(); + if (add_item_to_object(object, name, true_item, &global_hooks, false)) + { + return true_item; + } + + cJSON_Delete(true_item); + return NULL; +} + +CJSON_PUBLIC(cJSON*) cJSON_AddFalseToObject(cJSON * const object, const char * const name) +{ + cJSON *false_item = cJSON_CreateFalse(); + if (add_item_to_object(object, name, false_item, &global_hooks, false)) + { + return false_item; + } + + cJSON_Delete(false_item); + return NULL; +} + +CJSON_PUBLIC(cJSON*) cJSON_AddBoolToObject(cJSON * const object, const char * const name, const cJSON_bool boolean) +{ + cJSON *bool_item = cJSON_CreateBool(boolean); + if (add_item_to_object(object, name, bool_item, &global_hooks, false)) + { + return bool_item; + } + + cJSON_Delete(bool_item); + return NULL; +} + +CJSON_PUBLIC(cJSON*) cJSON_AddNumberToObject(cJSON * const object, const char * const name, const double number) +{ + cJSON *number_item = cJSON_CreateNumber(number); + if (add_item_to_object(object, name, number_item, &global_hooks, false)) + { + return number_item; + } + + cJSON_Delete(number_item); + return NULL; +} + +CJSON_PUBLIC(cJSON*) cJSON_AddStringToObject(cJSON * const object, const char * const name, const char * const string) +{ + cJSON *string_item = cJSON_CreateString(string); + if (add_item_to_object(object, name, string_item, &global_hooks, false)) + { + return string_item; + } + + cJSON_Delete(string_item); + return NULL; +} + +CJSON_PUBLIC(cJSON*) cJSON_AddRawToObject(cJSON * const object, const char * const name, const char * const raw) +{ + cJSON *raw_item = cJSON_CreateRaw(raw); + if (add_item_to_object(object, name, raw_item, &global_hooks, false)) + { + return raw_item; + } + + cJSON_Delete(raw_item); + return NULL; +} + +CJSON_PUBLIC(cJSON*) cJSON_AddObjectToObject(cJSON * const object, const char * const name) +{ + cJSON *object_item = cJSON_CreateObject(); + if (add_item_to_object(object, name, object_item, &global_hooks, false)) + { + return object_item; + } + + cJSON_Delete(object_item); + return NULL; +} + +CJSON_PUBLIC(cJSON*) cJSON_AddArrayToObject(cJSON * const object, const char * const name) +{ + cJSON *array = cJSON_CreateArray(); + if (add_item_to_object(object, name, array, &global_hooks, false)) + { + return array; + } + + cJSON_Delete(array); + return NULL; +} + +CJSON_PUBLIC(cJSON *) cJSON_DetachItemViaPointer(cJSON *parent, cJSON * const item) +{ + if ((parent == NULL) || (item == NULL) || (item != parent->child && item->prev == NULL)) + { + return NULL; + } + + if (item != parent->child) + { + /* not the first element */ + item->prev->next = item->next; + } + if (item->next != NULL) + { + /* not the last element */ + item->next->prev = item->prev; + } + + if (item == parent->child) + { + /* first element */ + parent->child = item->next; + } + else if (item->next == NULL) + { + /* last element */ + parent->child->prev = item->prev; + } + + /* make sure the detached item doesn't point anywhere anymore */ + item->prev = NULL; + item->next = NULL; + + return item; +} + +CJSON_PUBLIC(cJSON *) cJSON_DetachItemFromArray(cJSON *array, int which) +{ + if (which < 0) + { + return NULL; + } + + return cJSON_DetachItemViaPointer(array, get_array_item(array, (size_t)which)); +} + +CJSON_PUBLIC(void) cJSON_DeleteItemFromArray(cJSON *array, int which) +{ + cJSON_Delete(cJSON_DetachItemFromArray(array, which)); +} + +CJSON_PUBLIC(cJSON *) cJSON_DetachItemFromObject(cJSON *object, const char *string) +{ + cJSON *to_detach = cJSON_GetObjectItem(object, string); + + return cJSON_DetachItemViaPointer(object, to_detach); +} + +CJSON_PUBLIC(cJSON *) cJSON_DetachItemFromObjectCaseSensitive(cJSON *object, const char *string) +{ + cJSON *to_detach = cJSON_GetObjectItemCaseSensitive(object, string); + + return cJSON_DetachItemViaPointer(object, to_detach); +} + +CJSON_PUBLIC(void) cJSON_DeleteItemFromObject(cJSON *object, const char *string) +{ + cJSON_Delete(cJSON_DetachItemFromObject(object, string)); +} + +CJSON_PUBLIC(void) cJSON_DeleteItemFromObjectCaseSensitive(cJSON *object, const char *string) +{ + cJSON_Delete(cJSON_DetachItemFromObjectCaseSensitive(object, string)); +} + +/* Replace array/object items with new ones. */ +CJSON_PUBLIC(cJSON_bool) cJSON_InsertItemInArray(cJSON *array, int which, cJSON *newitem) +{ + cJSON *after_inserted = NULL; + + if (which < 0 || newitem == NULL) + { + return false; + } + + after_inserted = get_array_item(array, (size_t)which); + if (after_inserted == NULL) + { + return add_item_to_array(array, newitem); + } + + if (after_inserted != array->child && after_inserted->prev == NULL) { + /* return false if after_inserted is a corrupted array item */ + return false; + } + + newitem->next = after_inserted; + newitem->prev = after_inserted->prev; + after_inserted->prev = newitem; + if (after_inserted == array->child) + { + array->child = newitem; + } + else + { + newitem->prev->next = newitem; + } + return true; +} + +CJSON_PUBLIC(cJSON_bool) cJSON_ReplaceItemViaPointer(cJSON * const parent, cJSON * const item, cJSON * replacement) +{ + if ((parent == NULL) || (parent->child == NULL) || (replacement == NULL) || (item == NULL)) + { + return false; + } + + if (replacement == item) + { + return true; + } + + replacement->next = item->next; + replacement->prev = item->prev; + + if (replacement->next != NULL) + { + replacement->next->prev = replacement; + } + if (parent->child == item) + { + if (parent->child->prev == parent->child) + { + replacement->prev = replacement; + } + parent->child = replacement; + } + else + { /* + * To find the last item in array quickly, we use prev in array. + * We can't modify the last item's next pointer where this item was the parent's child + */ + if (replacement->prev != NULL) + { + replacement->prev->next = replacement; + } + if (replacement->next == NULL) + { + parent->child->prev = replacement; + } + } + + item->next = NULL; + item->prev = NULL; + cJSON_Delete(item); + + return true; +} + +CJSON_PUBLIC(cJSON_bool) cJSON_ReplaceItemInArray(cJSON *array, int which, cJSON *newitem) +{ + if (which < 0) + { + return false; + } + + return cJSON_ReplaceItemViaPointer(array, get_array_item(array, (size_t)which), newitem); +} + +static cJSON_bool replace_item_in_object(cJSON *object, const char *string, cJSON *replacement, cJSON_bool case_sensitive) +{ + if ((replacement == NULL) || (string == NULL)) + { + return false; + } + + /* replace the name in the replacement */ + if (!(replacement->type & cJSON_StringIsConst) && (replacement->string != NULL)) + { + cJSON_free(replacement->string); + } + replacement->string = (char*)cJSON_strdup((const unsigned char*)string, &global_hooks); + if (replacement->string == NULL) + { + return false; + } + + replacement->type &= ~cJSON_StringIsConst; + + return cJSON_ReplaceItemViaPointer(object, get_object_item(object, string, case_sensitive), replacement); +} + +CJSON_PUBLIC(cJSON_bool) cJSON_ReplaceItemInObject(cJSON *object, const char *string, cJSON *newitem) +{ + return replace_item_in_object(object, string, newitem, false); +} + +CJSON_PUBLIC(cJSON_bool) cJSON_ReplaceItemInObjectCaseSensitive(cJSON *object, const char *string, cJSON *newitem) +{ + return replace_item_in_object(object, string, newitem, true); +} + +/* Create basic types: */ +CJSON_PUBLIC(cJSON *) cJSON_CreateNull(void) +{ + cJSON *item = cJSON_New_Item(&global_hooks); + if(item) + { + item->type = cJSON_NULL; + } + + return item; +} + +CJSON_PUBLIC(cJSON *) cJSON_CreateTrue(void) +{ + cJSON *item = cJSON_New_Item(&global_hooks); + if(item) + { + item->type = cJSON_True; + } + + return item; +} + +CJSON_PUBLIC(cJSON *) cJSON_CreateFalse(void) +{ + cJSON *item = cJSON_New_Item(&global_hooks); + if(item) + { + item->type = cJSON_False; + } + + return item; +} + +CJSON_PUBLIC(cJSON *) cJSON_CreateBool(cJSON_bool boolean) +{ + cJSON *item = cJSON_New_Item(&global_hooks); + if(item) + { + item->type = boolean ? cJSON_True : cJSON_False; + } + + return item; +} + +CJSON_PUBLIC(cJSON *) cJSON_CreateNumber(double num) +{ + cJSON *item = cJSON_New_Item(&global_hooks); + if(item) + { + item->type = cJSON_Number; + item->valuedouble = num; + + /* use saturation in case of overflow */ + if (num >= INT_MAX) + { + item->valueint = INT_MAX; + } + else if (num <= (double)INT_MIN) + { + item->valueint = INT_MIN; + } + else + { + item->valueint = (int)num; + } + } + + return item; +} + +CJSON_PUBLIC(cJSON *) cJSON_CreateString(const char *string) +{ + cJSON *item = cJSON_New_Item(&global_hooks); + if(item) + { + item->type = cJSON_String; + item->valuestring = (char*)cJSON_strdup((const unsigned char*)string, &global_hooks); + if(!item->valuestring) + { + cJSON_Delete(item); + return NULL; + } + } + + return item; +} + +CJSON_PUBLIC(cJSON *) cJSON_CreateStringReference(const char *string) +{ + cJSON *item = cJSON_New_Item(&global_hooks); + if (item != NULL) + { + item->type = cJSON_String | cJSON_IsReference; + item->valuestring = (char*)cast_away_const(string); + } + + return item; +} + +CJSON_PUBLIC(cJSON *) cJSON_CreateObjectReference(const cJSON *child) +{ + cJSON *item = cJSON_New_Item(&global_hooks); + if (item != NULL) { + item->type = cJSON_Object | cJSON_IsReference; + item->child = (cJSON*)cast_away_const(child); + } + + return item; +} + +CJSON_PUBLIC(cJSON *) cJSON_CreateArrayReference(const cJSON *child) { + cJSON *item = cJSON_New_Item(&global_hooks); + if (item != NULL) { + item->type = cJSON_Array | cJSON_IsReference; + item->child = (cJSON*)cast_away_const(child); + } + + return item; +} + +CJSON_PUBLIC(cJSON *) cJSON_CreateRaw(const char *raw) +{ + cJSON *item = cJSON_New_Item(&global_hooks); + if(item) + { + item->type = cJSON_Raw; + item->valuestring = (char*)cJSON_strdup((const unsigned char*)raw, &global_hooks); + if(!item->valuestring) + { + cJSON_Delete(item); + return NULL; + } + } + + return item; +} + +CJSON_PUBLIC(cJSON *) cJSON_CreateArray(void) +{ + cJSON *item = cJSON_New_Item(&global_hooks); + if(item) + { + item->type=cJSON_Array; + } + + return item; +} + +CJSON_PUBLIC(cJSON *) cJSON_CreateObject(void) +{ + cJSON *item = cJSON_New_Item(&global_hooks); + if (item) + { + item->type = cJSON_Object; + } + + return item; +} + +/* Create Arrays: */ +CJSON_PUBLIC(cJSON *) cJSON_CreateIntArray(const int *numbers, int count) +{ + size_t i = 0; + cJSON *n = NULL; + cJSON *p = NULL; + cJSON *a = NULL; + + if ((count < 0) || (numbers == NULL)) + { + return NULL; + } + + a = cJSON_CreateArray(); + + for(i = 0; a && (i < (size_t)count); i++) + { + n = cJSON_CreateNumber(numbers[i]); + if (!n) + { + cJSON_Delete(a); + return NULL; + } + if(!i) + { + a->child = n; + } + else + { + suffix_object(p, n); + } + p = n; + } + + if (a && a->child) { + a->child->prev = n; + } + + return a; +} + +CJSON_PUBLIC(cJSON *) cJSON_CreateFloatArray(const float *numbers, int count) +{ + size_t i = 0; + cJSON *n = NULL; + cJSON *p = NULL; + cJSON *a = NULL; + + if ((count < 0) || (numbers == NULL)) + { + return NULL; + } + + a = cJSON_CreateArray(); + + for(i = 0; a && (i < (size_t)count); i++) + { + n = cJSON_CreateNumber((double)numbers[i]); + if(!n) + { + cJSON_Delete(a); + return NULL; + } + if(!i) + { + a->child = n; + } + else + { + suffix_object(p, n); + } + p = n; + } + + if (a && a->child) { + a->child->prev = n; + } + + return a; +} + +CJSON_PUBLIC(cJSON *) cJSON_CreateDoubleArray(const double *numbers, int count) +{ + size_t i = 0; + cJSON *n = NULL; + cJSON *p = NULL; + cJSON *a = NULL; + + if ((count < 0) || (numbers == NULL)) + { + return NULL; + } + + a = cJSON_CreateArray(); + + for(i = 0; a && (i < (size_t)count); i++) + { + n = cJSON_CreateNumber(numbers[i]); + if(!n) + { + cJSON_Delete(a); + return NULL; + } + if(!i) + { + a->child = n; + } + else + { + suffix_object(p, n); + } + p = n; + } + + if (a && a->child) { + a->child->prev = n; + } + + return a; +} + +CJSON_PUBLIC(cJSON *) cJSON_CreateStringArray(const char *const *strings, int count) +{ + size_t i = 0; + cJSON *n = NULL; + cJSON *p = NULL; + cJSON *a = NULL; + + if ((count < 0) || (strings == NULL)) + { + return NULL; + } + + a = cJSON_CreateArray(); + + for (i = 0; a && (i < (size_t)count); i++) + { + n = cJSON_CreateString(strings[i]); + if(!n) + { + cJSON_Delete(a); + return NULL; + } + if(!i) + { + a->child = n; + } + else + { + suffix_object(p,n); + } + p = n; + } + + if (a && a->child) { + a->child->prev = n; + } + + return a; +} + +/* Duplication */ +cJSON * cJSON_Duplicate_rec(const cJSON *item, size_t depth, cJSON_bool recurse); + +CJSON_PUBLIC(cJSON *) cJSON_Duplicate(const cJSON *item, cJSON_bool recurse) +{ + return cJSON_Duplicate_rec(item, 0, recurse ); +} + +cJSON * cJSON_Duplicate_rec(const cJSON *item, size_t depth, cJSON_bool recurse) +{ + cJSON *newitem = NULL; + cJSON *child = NULL; + cJSON *next = NULL; + cJSON *newchild = NULL; + + /* Bail on bad ptr */ + if (!item) + { + goto fail; + } + /* Create new item */ + newitem = cJSON_New_Item(&global_hooks); + if (!newitem) + { + goto fail; + } + /* Copy over all vars */ + newitem->type = item->type & (~cJSON_IsReference); + newitem->valueint = item->valueint; + newitem->valuedouble = item->valuedouble; + if (item->valuestring) + { + newitem->valuestring = (char*)cJSON_strdup((unsigned char*)item->valuestring, &global_hooks); + if (!newitem->valuestring) + { + goto fail; + } + } + if (item->string) + { + newitem->string = (item->type&cJSON_StringIsConst) ? item->string : (char*)cJSON_strdup((unsigned char*)item->string, &global_hooks); + if (!newitem->string) + { + goto fail; + } + } + /* If non-recursive, then we're done! */ + if (!recurse) + { + return newitem; + } + /* Walk the ->next chain for the child. */ + child = item->child; + while (child != NULL) + { + if(depth >= CJSON_CIRCULAR_LIMIT) { + goto fail; + } + newchild = cJSON_Duplicate_rec(child, depth + 1, true); /* Duplicate (with recurse) each item in the ->next chain */ + if (!newchild) + { + goto fail; + } + if (next != NULL) + { + /* If newitem->child already set, then crosswire ->prev and ->next and move on */ + next->next = newchild; + newchild->prev = next; + next = newchild; + } + else + { + /* Set newitem->child and move to it */ + newitem->child = newchild; + next = newchild; + } + child = child->next; + } + if (newitem && newitem->child) + { + newitem->child->prev = newchild; + } + + return newitem; + +fail: + if (newitem != NULL) + { + cJSON_Delete(newitem); + } + + return NULL; +} + +static void skip_oneline_comment(char **input) +{ + *input += static_strlen("//"); + + for (; (*input)[0] != '\0'; ++(*input)) + { + if ((*input)[0] == '\n') { + *input += static_strlen("\n"); + return; + } + } +} + +static void skip_multiline_comment(char **input) +{ + *input += static_strlen("/*"); + + for (; (*input)[0] != '\0'; ++(*input)) + { + if (((*input)[0] == '*') && ((*input)[1] == '/')) + { + *input += static_strlen("*/"); + return; + } + } +} + +static void minify_string(char **input, char **output) { + (*output)[0] = (*input)[0]; + *input += static_strlen("\""); + *output += static_strlen("\""); + + + for (; (*input)[0] != '\0'; (void)++(*input), ++(*output)) { + (*output)[0] = (*input)[0]; + + if ((*input)[0] == '\"') { + (*output)[0] = '\"'; + *input += static_strlen("\""); + *output += static_strlen("\""); + return; + } else if (((*input)[0] == '\\') && ((*input)[1] == '\"')) { + (*output)[1] = (*input)[1]; + *input += static_strlen("\""); + *output += static_strlen("\""); + } + } +} + +CJSON_PUBLIC(void) cJSON_Minify(char *json) +{ + char *into = json; + + if (json == NULL) + { + return; + } + + while (json[0] != '\0') + { + switch (json[0]) + { + case ' ': + case '\t': + case '\r': + case '\n': + json++; + break; + + case '/': + if (json[1] == '/') + { + skip_oneline_comment(&json); + } + else if (json[1] == '*') + { + skip_multiline_comment(&json); + } else { + json++; + } + break; + + case '\"': + minify_string(&json, (char**)&into); + break; + + default: + into[0] = json[0]; + json++; + into++; + } + } + + /* and null-terminate. */ + *into = '\0'; +} + +CJSON_PUBLIC(cJSON_bool) cJSON_IsInvalid(const cJSON * const item) +{ + if (item == NULL) + { + return false; + } + + return (item->type & 0xFF) == cJSON_Invalid; +} + +CJSON_PUBLIC(cJSON_bool) cJSON_IsFalse(const cJSON * const item) +{ + if (item == NULL) + { + return false; + } + + return (item->type & 0xFF) == cJSON_False; +} + +CJSON_PUBLIC(cJSON_bool) cJSON_IsTrue(const cJSON * const item) +{ + if (item == NULL) + { + return false; + } + + return (item->type & 0xff) == cJSON_True; +} + + +CJSON_PUBLIC(cJSON_bool) cJSON_IsBool(const cJSON * const item) +{ + if (item == NULL) + { + return false; + } + + return (item->type & (cJSON_True | cJSON_False)) != 0; +} +CJSON_PUBLIC(cJSON_bool) cJSON_IsNull(const cJSON * const item) +{ + if (item == NULL) + { + return false; + } + + return (item->type & 0xFF) == cJSON_NULL; +} + +CJSON_PUBLIC(cJSON_bool) cJSON_IsNumber(const cJSON * const item) +{ + if (item == NULL) + { + return false; + } + + return (item->type & 0xFF) == cJSON_Number; +} + +CJSON_PUBLIC(cJSON_bool) cJSON_IsString(const cJSON * const item) +{ + if (item == NULL) + { + return false; + } + + return (item->type & 0xFF) == cJSON_String; +} + +CJSON_PUBLIC(cJSON_bool) cJSON_IsArray(const cJSON * const item) +{ + if (item == NULL) + { + return false; + } + + return (item->type & 0xFF) == cJSON_Array; +} + +CJSON_PUBLIC(cJSON_bool) cJSON_IsObject(const cJSON * const item) +{ + if (item == NULL) + { + return false; + } + + return (item->type & 0xFF) == cJSON_Object; +} + +CJSON_PUBLIC(cJSON_bool) cJSON_IsRaw(const cJSON * const item) +{ + if (item == NULL) + { + return false; + } + + return (item->type & 0xFF) == cJSON_Raw; +} + +CJSON_PUBLIC(cJSON_bool) cJSON_Compare(const cJSON * const a, const cJSON * const b, const cJSON_bool case_sensitive) +{ + if ((a == NULL) || (b == NULL) || ((a->type & 0xFF) != (b->type & 0xFF))) + { + return false; + } + + /* check if type is valid */ + switch (a->type & 0xFF) + { + case cJSON_False: + case cJSON_True: + case cJSON_NULL: + case cJSON_Number: + case cJSON_String: + case cJSON_Raw: + case cJSON_Array: + case cJSON_Object: + break; + + default: + return false; + } + + /* identical objects are equal */ + if (a == b) + { + return true; + } + + switch (a->type & 0xFF) + { + /* in these cases and equal type is enough */ + case cJSON_False: + case cJSON_True: + case cJSON_NULL: + return true; + + case cJSON_Number: + if (compare_double(a->valuedouble, b->valuedouble)) + { + return true; + } + return false; + + case cJSON_String: + case cJSON_Raw: + if ((a->valuestring == NULL) || (b->valuestring == NULL)) + { + return false; + } + if (strcmp(a->valuestring, b->valuestring) == 0) + { + return true; + } + + return false; + + case cJSON_Array: + { + cJSON *a_element = a->child; + cJSON *b_element = b->child; + + for (; (a_element != NULL) && (b_element != NULL);) + { + if (!cJSON_Compare(a_element, b_element, case_sensitive)) + { + return false; + } + + a_element = a_element->next; + b_element = b_element->next; + } + + /* one of the arrays is longer than the other */ + if (a_element != b_element) { + return false; + } + + return true; + } + + case cJSON_Object: + { + cJSON *a_element = NULL; + cJSON *b_element = NULL; + cJSON_ArrayForEach(a_element, a) + { + /* TODO This has O(n^2) runtime, which is horrible! */ + b_element = get_object_item(b, a_element->string, case_sensitive); + if (b_element == NULL) + { + return false; + } + + if (!cJSON_Compare(a_element, b_element, case_sensitive)) + { + return false; + } + } + + /* doing this twice, once on a and b to prevent true comparison if a subset of b + * TODO: Do this the proper way, this is just a fix for now */ + cJSON_ArrayForEach(b_element, b) + { + a_element = get_object_item(a, b_element->string, case_sensitive); + if (a_element == NULL) + { + return false; + } + + if (!cJSON_Compare(b_element, a_element, case_sensitive)) + { + return false; + } + } + + return true; + } + + default: + return false; + } +} + +CJSON_PUBLIC(void *) cJSON_malloc(size_t size) +{ + return global_hooks.allocate(size); +} + +CJSON_PUBLIC(void) cJSON_free(void *object) +{ + global_hooks.deallocate(object); + object = NULL; +} diff --git a/thirdparty/cjson/cJSON.h b/thirdparty/cjson/cJSON.h new file mode 100644 index 0000000..7f67ecc --- /dev/null +++ b/thirdparty/cjson/cJSON.h @@ -0,0 +1,308 @@ +/* + Copyright (c) 2009-2017 Dave Gamble and cJSON contributors + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + THE SOFTWARE. +*/ + +#ifndef cJSON__h +#define cJSON__h + +#define CJSON_HIDE_SYMBOLS + +#ifdef __cplusplus +extern "C" +{ +#endif + +#if !defined(__WINDOWS__) && (defined(WIN32) || defined(WIN64) || defined(_MSC_VER) || defined(_WIN32)) +#define __WINDOWS__ +#endif + +#ifdef __WINDOWS__ + +/* When compiling for windows, we specify a specific calling convention to avoid issues where we are being called from a project with a different default calling convention. For windows you have 3 define options: + +CJSON_HIDE_SYMBOLS - Define this in the case where you don't want to ever dllexport symbols +CJSON_EXPORT_SYMBOLS - Define this on library build when you want to dllexport symbols (default) +CJSON_IMPORT_SYMBOLS - Define this if you want to dllimport symbol + +For *nix builds that support visibility attribute, you can define similar behavior by + +setting default visibility to hidden by adding +-fvisibility=hidden (for gcc) +or +-xldscope=hidden (for sun cc) +to CFLAGS + +then using the CJSON_API_VISIBILITY flag to "export" the same symbols the way CJSON_EXPORT_SYMBOLS does + +*/ + +#define CJSON_CDECL __cdecl +#define CJSON_STDCALL __stdcall + +/* export symbols by default, this is necessary for copy pasting the C and header file */ +#if !defined(CJSON_HIDE_SYMBOLS) && !defined(CJSON_IMPORT_SYMBOLS) && !defined(CJSON_EXPORT_SYMBOLS) +#define CJSON_EXPORT_SYMBOLS +#endif + +#if defined(CJSON_HIDE_SYMBOLS) +#define CJSON_PUBLIC(type) type CJSON_STDCALL +#elif defined(CJSON_EXPORT_SYMBOLS) +#define CJSON_PUBLIC(type) __declspec(dllexport) type CJSON_STDCALL +#elif defined(CJSON_IMPORT_SYMBOLS) +#define CJSON_PUBLIC(type) __declspec(dllimport) type CJSON_STDCALL +#endif +#else /* !__WINDOWS__ */ +#define CJSON_CDECL +#define CJSON_STDCALL + +#if (defined(__GNUC__) || defined(__SUNPRO_CC) || defined (__SUNPRO_C)) && defined(CJSON_API_VISIBILITY) +#define CJSON_PUBLIC(type) __attribute__((visibility("default"))) type +#else +#define CJSON_PUBLIC(type) type +#endif +#endif + +/* project version */ +#define CJSON_VERSION_MAJOR 1 +#define CJSON_VERSION_MINOR 7 +#define CJSON_VERSION_PATCH 19 + +#include + +/* cJSON Types: */ +#define cJSON_Invalid (0) +#define cJSON_False (1 << 0) +#define cJSON_True (1 << 1) +#define cJSON_NULL (1 << 2) +#define cJSON_Number (1 << 3) +#define cJSON_String (1 << 4) +#define cJSON_Array (1 << 5) +#define cJSON_Object (1 << 6) +#define cJSON_Raw (1 << 7) /* raw json */ + +#define cJSON_IsReference 256 +#define cJSON_StringIsConst 512 + +/* The cJSON structure: */ +typedef struct cJSON +{ + /* next/prev allow you to walk array/object chains. Alternatively, use GetArraySize/GetArrayItem/GetObjectItem */ + struct cJSON *next; + struct cJSON *prev; + /* An array or object item will have a child pointer pointing to a chain of the items in the array/object. */ + struct cJSON *child; + + /* The type of the item, as above. */ + int type; + + /* The item's string, if type==cJSON_String and type == cJSON_Raw */ + char *valuestring; + /* writing to valueint is DEPRECATED, use cJSON_SetNumberValue instead */ + int valueint; + /* The item's number, if type==cJSON_Number */ + double valuedouble; + + /* The item's name string, if this item is the child of, or is in the list of subitems of an object. */ + char *string; +} cJSON; + +typedef struct cJSON_Hooks +{ + /* malloc/free are CDECL on Windows regardless of the default calling convention of the compiler, so ensure the hooks allow passing those functions directly. */ + void *(CJSON_CDECL *malloc_fn)(size_t sz); + void (CJSON_CDECL *free_fn)(void *ptr); +} cJSON_Hooks; + +typedef int cJSON_bool; + +/* Limits how deeply nested arrays/objects can be before cJSON rejects to parse them. + * This is to prevent stack overflows. */ +#ifndef CJSON_NESTING_LIMIT +#define CJSON_NESTING_LIMIT 1000 +#endif + +/* Limits the length of circular references can be before cJSON rejects to parse them. + * This is to prevent stack overflows. */ +#ifndef CJSON_CIRCULAR_LIMIT +#define CJSON_CIRCULAR_LIMIT 10000 +#endif + +/* returns the version of cJSON as a string */ +CJSON_PUBLIC(const char*) cJSON_Version(void); + +/* Supply malloc, realloc and free functions to cJSON */ +CJSON_PUBLIC(void) cJSON_InitHooks(cJSON_Hooks* hooks); + +/* Memory Management: the caller is always responsible to free the results from all variants of cJSON_Parse (with cJSON_Delete) and cJSON_Print (with stdlib free, cJSON_Hooks.free_fn, or cJSON_free as appropriate). The exception is cJSON_PrintPreallocated, where the caller has full responsibility of the buffer. */ +/* Supply a block of JSON, and this returns a cJSON object you can interrogate. */ +CJSON_PUBLIC(cJSON *) cJSON_Parse(const char *value); +CJSON_PUBLIC(cJSON *) cJSON_ParseWithLength(const char *value, size_t buffer_length); +/* ParseWithOpts allows you to require (and check) that the JSON is null terminated, and to retrieve the pointer to the final byte parsed. */ +/* If you supply a ptr in return_parse_end and parsing fails, then return_parse_end will contain a pointer to the error so will match cJSON_GetErrorPtr(). */ +CJSON_PUBLIC(cJSON *) cJSON_ParseWithOpts(const char *value, const char **return_parse_end, cJSON_bool require_null_terminated); +CJSON_PUBLIC(cJSON *) cJSON_ParseWithLengthOpts(const char *value, size_t buffer_length, const char **return_parse_end, cJSON_bool require_null_terminated); + +/* Render a cJSON entity to text for transfer/storage. */ +CJSON_PUBLIC(char *) cJSON_Print(const cJSON *item); +/* Render a cJSON entity to text for transfer/storage without any formatting. */ +CJSON_PUBLIC(char *) cJSON_PrintUnformatted(const cJSON *item); +/* Render a cJSON entity to text using a buffered strategy. prebuffer is a guess at the final size. guessing well reduces reallocation. fmt=0 gives unformatted, =1 gives formatted */ +CJSON_PUBLIC(char *) cJSON_PrintBuffered(const cJSON *item, int prebuffer, cJSON_bool fmt); +/* Render a cJSON entity to text using a buffer already allocated in memory with given length. Returns 1 on success and 0 on failure. */ +/* NOTE: cJSON is not always 100% accurate in estimating how much memory it will use, so to be safe allocate 5 bytes more than you actually need */ +CJSON_PUBLIC(cJSON_bool) cJSON_PrintPreallocated(cJSON *item, char *buffer, const int length, const cJSON_bool format); +/* Delete a cJSON entity and all subentities. */ +CJSON_PUBLIC(void) cJSON_Delete(cJSON *item); + +/* Returns the number of items in an array (or object). */ +CJSON_PUBLIC(int) cJSON_GetArraySize(const cJSON *array); +/* Retrieve item number "index" from array "array". Returns NULL if unsuccessful. */ +CJSON_PUBLIC(cJSON *) cJSON_GetArrayItem(const cJSON *array, int index); +/* Get item "string" from object. Case insensitive. */ +CJSON_PUBLIC(cJSON *) cJSON_GetObjectItem(const cJSON * const object, const char * const string); +CJSON_PUBLIC(cJSON *) cJSON_GetObjectItemCaseSensitive(const cJSON * const object, const char * const string); +CJSON_PUBLIC(cJSON_bool) cJSON_HasObjectItem(const cJSON *object, const char *string); +/* For analysing failed parses. This returns a pointer to the parse error. You'll probably need to look a few chars back to make sense of it. Defined when cJSON_Parse() returns 0. 0 when cJSON_Parse() succeeds. */ +CJSON_PUBLIC(const char *) cJSON_GetErrorPtr(void); + +/* Check item type and return its value */ +CJSON_PUBLIC(char *) cJSON_GetStringValue(const cJSON * const item); +CJSON_PUBLIC(double) cJSON_GetNumberValue(const cJSON * const item); + +/* These functions check the type of an item */ +CJSON_PUBLIC(cJSON_bool) cJSON_IsInvalid(const cJSON * const item); +CJSON_PUBLIC(cJSON_bool) cJSON_IsFalse(const cJSON * const item); +CJSON_PUBLIC(cJSON_bool) cJSON_IsTrue(const cJSON * const item); +CJSON_PUBLIC(cJSON_bool) cJSON_IsBool(const cJSON * const item); +CJSON_PUBLIC(cJSON_bool) cJSON_IsNull(const cJSON * const item); +CJSON_PUBLIC(cJSON_bool) cJSON_IsNumber(const cJSON * const item); +CJSON_PUBLIC(cJSON_bool) cJSON_IsString(const cJSON * const item); +CJSON_PUBLIC(cJSON_bool) cJSON_IsArray(const cJSON * const item); +CJSON_PUBLIC(cJSON_bool) cJSON_IsObject(const cJSON * const item); +CJSON_PUBLIC(cJSON_bool) cJSON_IsRaw(const cJSON * const item); + +/* These calls create a cJSON item of the appropriate type. */ +CJSON_PUBLIC(cJSON *) cJSON_CreateNull(void); +CJSON_PUBLIC(cJSON *) cJSON_CreateTrue(void); +CJSON_PUBLIC(cJSON *) cJSON_CreateFalse(void); +CJSON_PUBLIC(cJSON *) cJSON_CreateBool(cJSON_bool boolean); +CJSON_PUBLIC(cJSON *) cJSON_CreateNumber(double num); +CJSON_PUBLIC(cJSON *) cJSON_CreateString(const char *string); +/* raw json */ +CJSON_PUBLIC(cJSON *) cJSON_CreateRaw(const char *raw); +CJSON_PUBLIC(cJSON *) cJSON_CreateArray(void); +CJSON_PUBLIC(cJSON *) cJSON_CreateObject(void); + +/* Create a string where valuestring references a string so + * it will not be freed by cJSON_Delete */ +CJSON_PUBLIC(cJSON *) cJSON_CreateStringReference(const char *string); +/* Create an object/array that only references it's elements so + * they will not be freed by cJSON_Delete */ +CJSON_PUBLIC(cJSON *) cJSON_CreateObjectReference(const cJSON *child); +CJSON_PUBLIC(cJSON *) cJSON_CreateArrayReference(const cJSON *child); + +/* These utilities create an Array of count items. + * The parameter count cannot be greater than the number of elements in the number array, otherwise array access will be out of bounds.*/ +CJSON_PUBLIC(cJSON *) cJSON_CreateIntArray(const int *numbers, int count); +CJSON_PUBLIC(cJSON *) cJSON_CreateFloatArray(const float *numbers, int count); +CJSON_PUBLIC(cJSON *) cJSON_CreateDoubleArray(const double *numbers, int count); +CJSON_PUBLIC(cJSON *) cJSON_CreateStringArray(const char *const *strings, int count); + +/* Append item to the specified array/object. */ +CJSON_PUBLIC(cJSON_bool) cJSON_AddItemToArray(cJSON *array, cJSON *item); +CJSON_PUBLIC(cJSON_bool) cJSON_AddItemToObject(cJSON *object, const char *string, cJSON *item); +/* Use this when string is definitely const (i.e. a literal, or as good as), and will definitely survive the cJSON object. + * WARNING: When this function was used, make sure to always check that (item->type & cJSON_StringIsConst) is zero before + * writing to `item->string` */ +CJSON_PUBLIC(cJSON_bool) cJSON_AddItemToObjectCS(cJSON *object, const char *string, cJSON *item); +/* Append reference to item to the specified array/object. Use this when you want to add an existing cJSON to a new cJSON, but don't want to corrupt your existing cJSON. */ +CJSON_PUBLIC(cJSON_bool) cJSON_AddItemReferenceToArray(cJSON *array, cJSON *item); +CJSON_PUBLIC(cJSON_bool) cJSON_AddItemReferenceToObject(cJSON *object, const char *string, cJSON *item); + +/* Remove/Detach items from Arrays/Objects. */ +CJSON_PUBLIC(cJSON *) cJSON_DetachItemViaPointer(cJSON *parent, cJSON * const item); +CJSON_PUBLIC(cJSON *) cJSON_DetachItemFromArray(cJSON *array, int which); +CJSON_PUBLIC(void) cJSON_DeleteItemFromArray(cJSON *array, int which); +CJSON_PUBLIC(cJSON *) cJSON_DetachItemFromObject(cJSON *object, const char *string); +CJSON_PUBLIC(cJSON *) cJSON_DetachItemFromObjectCaseSensitive(cJSON *object, const char *string); +CJSON_PUBLIC(void) cJSON_DeleteItemFromObject(cJSON *object, const char *string); +CJSON_PUBLIC(void) cJSON_DeleteItemFromObjectCaseSensitive(cJSON *object, const char *string); + +/* Update array items. */ +CJSON_PUBLIC(cJSON_bool) cJSON_InsertItemInArray(cJSON *array, int which, cJSON *newitem); /* Shifts pre-existing items to the right. */ +CJSON_PUBLIC(cJSON_bool) cJSON_ReplaceItemViaPointer(cJSON * const parent, cJSON * const item, cJSON * replacement); +CJSON_PUBLIC(cJSON_bool) cJSON_ReplaceItemInArray(cJSON *array, int which, cJSON *newitem); +CJSON_PUBLIC(cJSON_bool) cJSON_ReplaceItemInObject(cJSON *object,const char *string,cJSON *newitem); +CJSON_PUBLIC(cJSON_bool) cJSON_ReplaceItemInObjectCaseSensitive(cJSON *object,const char *string,cJSON *newitem); + +/* Duplicate a cJSON item */ +CJSON_PUBLIC(cJSON *) cJSON_Duplicate(const cJSON *item, cJSON_bool recurse); +/* Duplicate will create a new, identical cJSON item to the one you pass, in new memory that will + * need to be released. With recurse!=0, it will duplicate any children connected to the item. + * The item->next and ->prev pointers are always zero on return from Duplicate. */ +/* Recursively compare two cJSON items for equality. If either a or b is NULL or invalid, they will be considered unequal. + * case_sensitive determines if object keys are treated case sensitive (1) or case insensitive (0) */ +CJSON_PUBLIC(cJSON_bool) cJSON_Compare(const cJSON * const a, const cJSON * const b, const cJSON_bool case_sensitive); + +/* Minify a strings, remove blank characters(such as ' ', '\t', '\r', '\n') from strings. + * The input pointer json cannot point to a read-only address area, such as a string constant, + * but should point to a readable and writable address area. */ +CJSON_PUBLIC(void) cJSON_Minify(char *json); + +/* Helper functions for creating and adding items to an object at the same time. + * They return the added item or NULL on failure. */ +CJSON_PUBLIC(cJSON*) cJSON_AddNullToObject(cJSON * const object, const char * const name); +CJSON_PUBLIC(cJSON*) cJSON_AddTrueToObject(cJSON * const object, const char * const name); +CJSON_PUBLIC(cJSON*) cJSON_AddFalseToObject(cJSON * const object, const char * const name); +CJSON_PUBLIC(cJSON*) cJSON_AddBoolToObject(cJSON * const object, const char * const name, const cJSON_bool boolean); +CJSON_PUBLIC(cJSON*) cJSON_AddNumberToObject(cJSON * const object, const char * const name, const double number); +CJSON_PUBLIC(cJSON*) cJSON_AddStringToObject(cJSON * const object, const char * const name, const char * const string); +CJSON_PUBLIC(cJSON*) cJSON_AddRawToObject(cJSON * const object, const char * const name, const char * const raw); +CJSON_PUBLIC(cJSON*) cJSON_AddObjectToObject(cJSON * const object, const char * const name); +CJSON_PUBLIC(cJSON*) cJSON_AddArrayToObject(cJSON * const object, const char * const name); + +/* When assigning an integer value, it needs to be propagated to valuedouble too. */ +#define cJSON_SetIntValue(object, number) ((object) ? (object)->valueint = (object)->valuedouble = (number) : (number)) +/* helper for the cJSON_SetNumberValue macro */ +CJSON_PUBLIC(double) cJSON_SetNumberHelper(cJSON *object, double number); +#define cJSON_SetNumberValue(object, number) ((object != NULL) ? cJSON_SetNumberHelper(object, (double)number) : (number)) +/* Change the valuestring of a cJSON_String object, only takes effect when type of object is cJSON_String */ +CJSON_PUBLIC(char*) cJSON_SetValuestring(cJSON *object, const char *valuestring); + +/* If the object is not a boolean type this does nothing and returns cJSON_Invalid else it returns the new type*/ +#define cJSON_SetBoolValue(object, boolValue) ( \ + (object != NULL && ((object)->type & (cJSON_False|cJSON_True))) ? \ + (object)->type=((object)->type &(~(cJSON_False|cJSON_True)))|((boolValue)?cJSON_True:cJSON_False) : \ + cJSON_Invalid\ +) + +/* Macro for iterating over an array or object */ +#define cJSON_ArrayForEach(element, array) for(element = (array != NULL) ? (array)->child : NULL; element != NULL; element = element->next) + +/* malloc/free objects using the malloc/free functions that have been set with cJSON_InitHooks */ +CJSON_PUBLIC(void *) cJSON_malloc(size_t size); +CJSON_PUBLIC(void) cJSON_free(void *object); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/thirdparty/cjson/cJSON_Utils.c b/thirdparty/cjson/cJSON_Utils.c new file mode 100644 index 0000000..8fa24f8 --- /dev/null +++ b/thirdparty/cjson/cJSON_Utils.c @@ -0,0 +1,1481 @@ +/* + Copyright (c) 2009-2017 Dave Gamble and cJSON contributors + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + THE SOFTWARE. +*/ + +/* disable warnings about old C89 functions in MSVC */ +#if !defined(_CRT_SECURE_NO_DEPRECATE) && defined(_MSC_VER) +#define _CRT_SECURE_NO_DEPRECATE +#endif + +#ifdef __GNUCC__ +#pragma GCC visibility push(default) +#endif +#if defined(_MSC_VER) +#pragma warning (push) +/* disable warning about single line comments in system headers */ +#pragma warning (disable : 4001) +#endif + +#include +#include +#include +#include +#include +#include +#include +#include + +#if defined(_MSC_VER) +#pragma warning (pop) +#endif +#ifdef __GNUCC__ +#pragma GCC visibility pop +#endif + +#include "cJSON_Utils.h" + +/* define our own boolean type */ +#ifdef true +#undef true +#endif +#define true ((cJSON_bool)1) + +#ifdef false +#undef false +#endif +#define false ((cJSON_bool)0) + +static unsigned char* cJSONUtils_strdup(const unsigned char* const string) +{ + size_t length = 0; + unsigned char *copy = NULL; + + length = strlen((const char*)string) + sizeof(""); + copy = (unsigned char*) cJSON_malloc(length); + if (copy == NULL) + { + return NULL; + } + memcpy(copy, string, length); + + return copy; +} + +/* string comparison which doesn't consider NULL pointers equal */ +static int compare_strings(const unsigned char *string1, const unsigned char *string2, const cJSON_bool case_sensitive) +{ + if ((string1 == NULL) || (string2 == NULL)) + { + return 1; + } + + if (string1 == string2) + { + return 0; + } + + if (case_sensitive) + { + return strcmp((const char*)string1, (const char*)string2); + } + + for(; tolower(*string1) == tolower(*string2); (void)string1++, string2++) + { + if (*string1 == '\0') + { + return 0; + } + } + + return tolower(*string1) - tolower(*string2); +} + +/* securely comparison of floating-point variables */ +static cJSON_bool compare_double(double a, double b) +{ + double maxVal = fabs(a) > fabs(b) ? fabs(a) : fabs(b); + return (fabs(a - b) <= maxVal * DBL_EPSILON); +} + + +/* Compare the next path element of two JSON pointers, two NULL pointers are considered unequal: */ +static cJSON_bool compare_pointers(const unsigned char *name, const unsigned char *pointer, const cJSON_bool case_sensitive) +{ + if ((name == NULL) || (pointer == NULL)) + { + return false; + } + + for (; (*name != '\0') && (*pointer != '\0') && (*pointer != '/'); (void)name++, pointer++) /* compare until next '/' */ + { + if (*pointer == '~') + { + /* check for escaped '~' (~0) and '/' (~1) */ + if (((pointer[1] != '0') || (*name != '~')) && ((pointer[1] != '1') || (*name != '/'))) + { + /* invalid escape sequence or wrong character in *name */ + return false; + } + else + { + pointer++; + } + } + else if ((!case_sensitive && (tolower(*name) != tolower(*pointer))) || (case_sensitive && (*name != *pointer))) + { + return false; + } + } + if (((*pointer != 0) && (*pointer != '/')) != (*name != 0)) + { + /* one string has ended, the other not */ + return false;; + } + + return true; +} + +/* calculate the length of a string if encoded as JSON pointer with ~0 and ~1 escape sequences */ +static size_t pointer_encoded_length(const unsigned char *string) +{ + size_t length; + for (length = 0; *string != '\0'; (void)string++, length++) + { + /* character needs to be escaped? */ + if ((*string == '~') || (*string == '/')) + { + length++; + } + } + + return length; +} + +/* copy a string while escaping '~' and '/' with ~0 and ~1 JSON pointer escape codes */ +static void encode_string_as_pointer(unsigned char *destination, const unsigned char *source) +{ + for (; source[0] != '\0'; (void)source++, destination++) + { + if (source[0] == '/') + { + destination[0] = '~'; + destination[1] = '1'; + destination++; + } + else if (source[0] == '~') + { + destination[0] = '~'; + destination[1] = '0'; + destination++; + } + else + { + destination[0] = source[0]; + } + } + + destination[0] = '\0'; +} + +CJSON_PUBLIC(char *) cJSONUtils_FindPointerFromObjectTo(const cJSON * const object, const cJSON * const target) +{ + size_t child_index = 0; + cJSON *current_child = 0; + + if ((object == NULL) || (target == NULL)) + { + return NULL; + } + + if (object == target) + { + /* found */ + return (char*)cJSONUtils_strdup((const unsigned char*)""); + } + + /* recursively search all children of the object or array */ + for (current_child = object->child; current_child != NULL; (void)(current_child = current_child->next), child_index++) + { + unsigned char *target_pointer = (unsigned char*)cJSONUtils_FindPointerFromObjectTo(current_child, target); + /* found the target? */ + if (target_pointer != NULL) + { + if (cJSON_IsArray(object)) + { + /* reserve enough memory for a 64 bit integer + '/' and '\0' */ + unsigned char *full_pointer = (unsigned char*)cJSON_malloc(strlen((char*)target_pointer) + 20 + sizeof("/")); + /* check if conversion to unsigned long is valid + * This should be eliminated at compile time by dead code elimination + * if size_t is an alias of unsigned long, or if it is bigger */ + if (child_index > ULONG_MAX) + { + cJSON_free(target_pointer); + cJSON_free(full_pointer); + return NULL; + } + sprintf((char*)full_pointer, "/%lu%s", (unsigned long)child_index, target_pointer); /* / */ + cJSON_free(target_pointer); + + return (char*)full_pointer; + } + + if (cJSON_IsObject(object)) + { + unsigned char *full_pointer = (unsigned char*)cJSON_malloc(strlen((char*)target_pointer) + pointer_encoded_length((unsigned char*)current_child->string) + 2); + full_pointer[0] = '/'; + encode_string_as_pointer(full_pointer + 1, (unsigned char*)current_child->string); + strcat((char*)full_pointer, (char*)target_pointer); + cJSON_free(target_pointer); + + return (char*)full_pointer; + } + + /* reached leaf of the tree, found nothing */ + cJSON_free(target_pointer); + return NULL; + } + } + + /* not found */ + return NULL; +} + +/* non broken version of cJSON_GetArrayItem */ +static cJSON *get_array_item(const cJSON *array, size_t item) +{ + cJSON *child = array ? array->child : NULL; + while ((child != NULL) && (item > 0)) + { + item--; + child = child->next; + } + + return child; +} + +static cJSON_bool decode_array_index_from_pointer(const unsigned char * const pointer, size_t * const index) +{ + size_t parsed_index = 0; + size_t position = 0; + + if ((pointer[0] == '0') && ((pointer[1] != '\0') && (pointer[1] != '/'))) + { + /* leading zeroes are not permitted */ + return 0; + } + + for (position = 0; (pointer[position] >= '0') && (pointer[position] <= '9'); position++) + { + parsed_index = (10 * parsed_index) + (size_t)(pointer[position] - '0'); + + } + + if ((pointer[position] != '\0') && (pointer[position] != '/')) + { + return 0; + } + + *index = parsed_index; + + return 1; +} + +static cJSON *get_item_from_pointer(cJSON * const object, const char * pointer, const cJSON_bool case_sensitive) +{ + cJSON *current_element = object; + + if (pointer == NULL) + { + return NULL; + } + + /* follow path of the pointer */ + while ((pointer[0] == '/') && (current_element != NULL)) + { + pointer++; + if (cJSON_IsArray(current_element)) + { + size_t index = 0; + if (!decode_array_index_from_pointer((const unsigned char*)pointer, &index)) + { + return NULL; + } + + current_element = get_array_item(current_element, index); + } + else if (cJSON_IsObject(current_element)) + { + current_element = current_element->child; + /* GetObjectItem. */ + while ((current_element != NULL) && !compare_pointers((unsigned char*)current_element->string, (const unsigned char*)pointer, case_sensitive)) + { + current_element = current_element->next; + } + } + else + { + return NULL; + } + + /* skip to the next path token or end of string */ + while ((pointer[0] != '\0') && (pointer[0] != '/')) + { + pointer++; + } + } + + return current_element; +} + +CJSON_PUBLIC(cJSON *) cJSONUtils_GetPointer(cJSON * const object, const char *pointer) +{ + return get_item_from_pointer(object, pointer, false); +} + +CJSON_PUBLIC(cJSON *) cJSONUtils_GetPointerCaseSensitive(cJSON * const object, const char *pointer) +{ + return get_item_from_pointer(object, pointer, true); +} + +/* JSON Patch implementation. */ +static void decode_pointer_inplace(unsigned char *string) +{ + unsigned char *decoded_string = string; + + if (string == NULL) { + return; + } + + for (; *string; (void)decoded_string++, string++) + { + if (string[0] == '~') + { + if (string[1] == '0') + { + decoded_string[0] = '~'; + } + else if (string[1] == '1') + { + decoded_string[1] = '/'; + } + else + { + /* invalid escape sequence */ + return; + } + + string++; + } + } + + decoded_string[0] = '\0'; +} + +/* non-broken cJSON_DetachItemFromArray */ +static cJSON *detach_item_from_array(cJSON *array, size_t which) +{ + cJSON *c = array->child; + while (c && (which > 0)) + { + c = c->next; + which--; + } + if (!c) + { + /* item doesn't exist */ + return NULL; + } + if (c != array->child) + { + /* not the first element */ + c->prev->next = c->next; + } + if (c->next) + { + c->next->prev = c->prev; + } + if (c == array->child) + { + array->child = c->next; + } + else if (c->next == NULL) + { + array->child->prev = c->prev; + } + /* make sure the detached item doesn't point anywhere anymore */ + c->prev = c->next = NULL; + + return c; +} + +/* detach an item at the given path */ +static cJSON *detach_path(cJSON *object, const unsigned char *path, const cJSON_bool case_sensitive) +{ + unsigned char *parent_pointer = NULL; + unsigned char *child_pointer = NULL; + cJSON *parent = NULL; + cJSON *detached_item = NULL; + + /* copy path and split it in parent and child */ + parent_pointer = cJSONUtils_strdup(path); + if (parent_pointer == NULL) { + goto cleanup; + } + + child_pointer = (unsigned char*)strrchr((char*)parent_pointer, '/'); /* last '/' */ + if (child_pointer == NULL) + { + goto cleanup; + } + /* split strings */ + child_pointer[0] = '\0'; + child_pointer++; + + parent = get_item_from_pointer(object, (char*)parent_pointer, case_sensitive); + decode_pointer_inplace(child_pointer); + + if (cJSON_IsArray(parent)) + { + size_t index = 0; + if (!decode_array_index_from_pointer(child_pointer, &index)) + { + goto cleanup; + } + detached_item = detach_item_from_array(parent, index); + } + else if (cJSON_IsObject(parent)) + { + detached_item = cJSON_DetachItemFromObject(parent, (char*)child_pointer); + } + else + { + /* Couldn't find object to remove child from. */ + goto cleanup; + } + +cleanup: + if (parent_pointer != NULL) + { + cJSON_free(parent_pointer); + } + + return detached_item; +} + +/* sort lists using mergesort */ +static cJSON *sort_list(cJSON *list, const cJSON_bool case_sensitive) +{ + cJSON *first = list; + cJSON *second = list; + cJSON *current_item = list; + cJSON *result = list; + cJSON *result_tail = NULL; + + if ((list == NULL) || (list->next == NULL)) + { + /* One entry is sorted already. */ + return result; + } + + while ((current_item != NULL) && (current_item->next != NULL) && (compare_strings((unsigned char*)current_item->string, (unsigned char*)current_item->next->string, case_sensitive) < 0)) + { + /* Test for list sorted. */ + current_item = current_item->next; + } + if ((current_item == NULL) || (current_item->next == NULL)) + { + /* Leave sorted lists unmodified. */ + return result; + } + + /* reset pointer to the beginning */ + current_item = list; + while (current_item != NULL) + { + /* Walk two pointers to find the middle. */ + second = second->next; + current_item = current_item->next; + /* advances current_item two steps at a time */ + if (current_item != NULL) + { + current_item = current_item->next; + } + } + if ((second != NULL) && (second->prev != NULL)) + { + /* Split the lists */ + second->prev->next = NULL; + second->prev = NULL; + } + + /* Recursively sort the sub-lists. */ + first = sort_list(first, case_sensitive); + second = sort_list(second, case_sensitive); + result = NULL; + + /* Merge the sub-lists */ + while ((first != NULL) && (second != NULL)) + { + cJSON *smaller = NULL; + if (compare_strings((unsigned char*)first->string, (unsigned char*)second->string, case_sensitive) < 0) + { + smaller = first; + } + else + { + smaller = second; + } + + if (result == NULL) + { + /* start merged list with the smaller element */ + result_tail = smaller; + result = smaller; + } + else + { + /* add smaller element to the list */ + result_tail->next = smaller; + smaller->prev = result_tail; + result_tail = smaller; + } + + if (first == smaller) + { + first = first->next; + } + else + { + second = second->next; + } + } + + if (first != NULL) + { + /* Append rest of first list. */ + if (result == NULL) + { + return first; + } + result_tail->next = first; + first->prev = result_tail; + } + if (second != NULL) + { + /* Append rest of second list */ + if (result == NULL) + { + return second; + } + result_tail->next = second; + second->prev = result_tail; + } + + return result; +} + +static void sort_object(cJSON * const object, const cJSON_bool case_sensitive) +{ + if (object == NULL) + { + return; + } + object->child = sort_list(object->child, case_sensitive); +} + +static cJSON_bool compare_json(cJSON *a, cJSON *b, const cJSON_bool case_sensitive) +{ + if ((a == NULL) || (b == NULL) || ((a->type & 0xFF) != (b->type & 0xFF))) + { + /* mismatched type. */ + return false; + } + switch (a->type & 0xFF) + { + case cJSON_Number: + /* numeric mismatch. */ + if ((a->valueint != b->valueint) || (!compare_double(a->valuedouble, b->valuedouble))) + { + return false; + } + else + { + return true; + } + + case cJSON_String: + /* string mismatch. */ + if (strcmp(a->valuestring, b->valuestring) != 0) + { + return false; + } + else + { + return true; + } + + case cJSON_Array: + for ((void)(a = a->child), b = b->child; (a != NULL) && (b != NULL); (void)(a = a->next), b = b->next) + { + cJSON_bool identical = compare_json(a, b, case_sensitive); + if (!identical) + { + return false; + } + } + + /* array size mismatch? (one of both children is not NULL) */ + if ((a != NULL) || (b != NULL)) + { + return false; + } + else + { + return true; + } + + case cJSON_Object: + sort_object(a, case_sensitive); + sort_object(b, case_sensitive); + for ((void)(a = a->child), b = b->child; (a != NULL) && (b != NULL); (void)(a = a->next), b = b->next) + { + cJSON_bool identical = false; + /* compare object keys */ + if (compare_strings((unsigned char*)a->string, (unsigned char*)b->string, case_sensitive)) + { + /* missing member */ + return false; + } + identical = compare_json(a, b, case_sensitive); + if (!identical) + { + return false; + } + } + + /* object length mismatch (one of both children is not null) */ + if ((a != NULL) || (b != NULL)) + { + return false; + } + else + { + return true; + } + + default: + break; + } + + /* null, true or false */ + return true; +} + +/* non broken version of cJSON_InsertItemInArray */ +static cJSON_bool insert_item_in_array(cJSON *array, size_t which, cJSON *newitem) +{ + cJSON *child = array->child; + while (child && (which > 0)) + { + child = child->next; + which--; + } + if (which > 0) + { + /* item is after the end of the array */ + return 0; + } + if (child == NULL) + { + cJSON_AddItemToArray(array, newitem); + return 1; + } + + /* insert into the linked list */ + newitem->next = child; + newitem->prev = child->prev; + child->prev = newitem; + + /* was it at the beginning */ + if (child == array->child) + { + array->child = newitem; + } + else + { + newitem->prev->next = newitem; + } + + return 1; +} + +static cJSON *get_object_item(const cJSON * const object, const char* name, const cJSON_bool case_sensitive) +{ + if (case_sensitive) + { + return cJSON_GetObjectItemCaseSensitive(object, name); + } + + return cJSON_GetObjectItem(object, name); +} + +enum patch_operation { INVALID, ADD, REMOVE, REPLACE, MOVE, COPY, TEST }; + +static enum patch_operation decode_patch_operation(const cJSON * const patch, const cJSON_bool case_sensitive) +{ + cJSON *operation = get_object_item(patch, "op", case_sensitive); + if (!cJSON_IsString(operation)) + { + return INVALID; + } + + if (strcmp(operation->valuestring, "add") == 0) + { + return ADD; + } + + if (strcmp(operation->valuestring, "remove") == 0) + { + return REMOVE; + } + + if (strcmp(operation->valuestring, "replace") == 0) + { + return REPLACE; + } + + if (strcmp(operation->valuestring, "move") == 0) + { + return MOVE; + } + + if (strcmp(operation->valuestring, "copy") == 0) + { + return COPY; + } + + if (strcmp(operation->valuestring, "test") == 0) + { + return TEST; + } + + return INVALID; +} + +/* overwrite and existing item with another one and free resources on the way */ +static void overwrite_item(cJSON * const root, const cJSON replacement) +{ + if (root == NULL) + { + return; + } + + if (root->string != NULL) + { + cJSON_free(root->string); + } + if (root->valuestring != NULL) + { + cJSON_free(root->valuestring); + } + if (root->child != NULL) + { + cJSON_Delete(root->child); + } + + memcpy(root, &replacement, sizeof(cJSON)); +} + +static int apply_patch(cJSON *object, const cJSON *patch, const cJSON_bool case_sensitive) +{ + cJSON *path = NULL; + cJSON *value = NULL; + cJSON *parent = NULL; + enum patch_operation opcode = INVALID; + unsigned char *parent_pointer = NULL; + unsigned char *child_pointer = NULL; + int status = 0; + + path = get_object_item(patch, "path", case_sensitive); + if (!cJSON_IsString(path)) + { + /* malformed patch. */ + status = 2; + goto cleanup; + } + + opcode = decode_patch_operation(patch, case_sensitive); + if (opcode == INVALID) + { + status = 3; + goto cleanup; + } + else if (opcode == TEST) + { + /* compare value: {...} with the given path */ + status = !compare_json(get_item_from_pointer(object, path->valuestring, case_sensitive), get_object_item(patch, "value", case_sensitive), case_sensitive); + goto cleanup; + } + + /* special case for replacing the root */ + if (path->valuestring[0] == '\0') + { + if (opcode == REMOVE) + { + static const cJSON invalid = { NULL, NULL, NULL, cJSON_Invalid, NULL, 0, 0, NULL}; + + overwrite_item(object, invalid); + + status = 0; + goto cleanup; + } + + if ((opcode == REPLACE) || (opcode == ADD)) + { + value = get_object_item(patch, "value", case_sensitive); + if (value == NULL) + { + /* missing "value" for add/replace. */ + status = 7; + goto cleanup; + } + + value = cJSON_Duplicate(value, 1); + if (value == NULL) + { + /* out of memory for add/replace. */ + status = 8; + goto cleanup; + } + + overwrite_item(object, *value); + + /* delete the duplicated value */ + cJSON_free(value); + value = NULL; + + /* the string "value" isn't needed */ + if (object->string != NULL) + { + cJSON_free(object->string); + object->string = NULL; + } + + status = 0; + goto cleanup; + } + } + + if ((opcode == REMOVE) || (opcode == REPLACE)) + { + /* Get rid of old. */ + cJSON *old_item = detach_path(object, (unsigned char*)path->valuestring, case_sensitive); + if (old_item == NULL) + { + status = 13; + goto cleanup; + } + cJSON_Delete(old_item); + if (opcode == REMOVE) + { + /* For Remove, this job is done. */ + status = 0; + goto cleanup; + } + } + + /* Copy/Move uses "from". */ + if ((opcode == MOVE) || (opcode == COPY)) + { + cJSON *from = get_object_item(patch, "from", case_sensitive); + if (from == NULL) + { + /* missing "from" for copy/move. */ + status = 4; + goto cleanup; + } + + if (opcode == MOVE) + { + value = detach_path(object, (unsigned char*)from->valuestring, case_sensitive); + } + if (opcode == COPY) + { + value = get_item_from_pointer(object, from->valuestring, case_sensitive); + } + if (value == NULL) + { + /* missing "from" for copy/move. */ + status = 5; + goto cleanup; + } + if (opcode == COPY) + { + value = cJSON_Duplicate(value, 1); + } + if (value == NULL) + { + /* out of memory for copy/move. */ + status = 6; + goto cleanup; + } + } + else /* Add/Replace uses "value". */ + { + value = get_object_item(patch, "value", case_sensitive); + if (value == NULL) + { + /* missing "value" for add/replace. */ + status = 7; + goto cleanup; + } + value = cJSON_Duplicate(value, 1); + if (value == NULL) + { + /* out of memory for add/replace. */ + status = 8; + goto cleanup; + } + } + + /* Now, just add "value" to "path". */ + + /* split pointer in parent and child */ + parent_pointer = cJSONUtils_strdup((unsigned char*)path->valuestring); + if (parent_pointer) { + child_pointer = (unsigned char*)strrchr((char*)parent_pointer, '/'); + } + if (child_pointer != NULL) + { + child_pointer[0] = '\0'; + child_pointer++; + } + parent = get_item_from_pointer(object, (char*)parent_pointer, case_sensitive); + decode_pointer_inplace(child_pointer); + + /* add, remove, replace, move, copy, test. */ + if ((parent == NULL) || (child_pointer == NULL)) + { + /* Couldn't find object to add to. */ + status = 9; + goto cleanup; + } + else if (cJSON_IsArray(parent)) + { + if (strcmp((char*)child_pointer, "-") == 0) + { + cJSON_AddItemToArray(parent, value); + value = NULL; + } + else + { + size_t index = 0; + if (!decode_array_index_from_pointer(child_pointer, &index)) + { + status = 11; + goto cleanup; + } + + if (!insert_item_in_array(parent, index, value)) + { + status = 10; + goto cleanup; + } + value = NULL; + } + } + else if (cJSON_IsObject(parent)) + { + if (case_sensitive) + { + cJSON_DeleteItemFromObjectCaseSensitive(parent, (char*)child_pointer); + } + else + { + cJSON_DeleteItemFromObject(parent, (char*)child_pointer); + } + cJSON_AddItemToObject(parent, (char*)child_pointer, value); + value = NULL; + } + else /* parent is not an object */ + { + /* Couldn't find object to add to. */ + status = 9; + goto cleanup; + } + +cleanup: + if (value != NULL) + { + cJSON_Delete(value); + } + if (parent_pointer != NULL) + { + cJSON_free(parent_pointer); + } + + return status; +} + +CJSON_PUBLIC(int) cJSONUtils_ApplyPatches(cJSON * const object, const cJSON * const patches) +{ + const cJSON *current_patch = NULL; + int status = 0; + + if (!cJSON_IsArray(patches)) + { + /* malformed patches. */ + return 1; + } + + if (patches != NULL) + { + current_patch = patches->child; + } + + while (current_patch != NULL) + { + status = apply_patch(object, current_patch, false); + if (status != 0) + { + return status; + } + current_patch = current_patch->next; + } + + return 0; +} + +CJSON_PUBLIC(int) cJSONUtils_ApplyPatchesCaseSensitive(cJSON * const object, const cJSON * const patches) +{ + const cJSON *current_patch = NULL; + int status = 0; + + if (!cJSON_IsArray(patches)) + { + /* malformed patches. */ + return 1; + } + + if (patches != NULL) + { + current_patch = patches->child; + } + + while (current_patch != NULL) + { + status = apply_patch(object, current_patch, true); + if (status != 0) + { + return status; + } + current_patch = current_patch->next; + } + + return 0; +} + +static void compose_patch(cJSON * const patches, const unsigned char * const operation, const unsigned char * const path, const unsigned char *suffix, const cJSON * const value) +{ + cJSON *patch = NULL; + + if ((patches == NULL) || (operation == NULL) || (path == NULL)) + { + return; + } + + patch = cJSON_CreateObject(); + if (patch == NULL) + { + return; + } + cJSON_AddItemToObject(patch, "op", cJSON_CreateString((const char*)operation)); + + if (suffix == NULL) + { + cJSON_AddItemToObject(patch, "path", cJSON_CreateString((const char*)path)); + } + else + { + size_t suffix_length = pointer_encoded_length(suffix); + size_t path_length = strlen((const char*)path); + unsigned char *full_path = (unsigned char*)cJSON_malloc(path_length + suffix_length + sizeof("/")); + + sprintf((char*)full_path, "%s/", (const char*)path); + encode_string_as_pointer(full_path + path_length + 1, suffix); + + cJSON_AddItemToObject(patch, "path", cJSON_CreateString((const char*)full_path)); + cJSON_free(full_path); + } + + if (value != NULL) + { + cJSON_AddItemToObject(patch, "value", cJSON_Duplicate(value, 1)); + } + cJSON_AddItemToArray(patches, patch); +} + +CJSON_PUBLIC(void) cJSONUtils_AddPatchToArray(cJSON * const array, const char * const operation, const char * const path, const cJSON * const value) +{ + compose_patch(array, (const unsigned char*)operation, (const unsigned char*)path, NULL, value); +} + +static void create_patches(cJSON * const patches, const unsigned char * const path, cJSON * const from, cJSON * const to, const cJSON_bool case_sensitive) +{ + if ((from == NULL) || (to == NULL)) + { + return; + } + + if ((from->type & 0xFF) != (to->type & 0xFF)) + { + compose_patch(patches, (const unsigned char*)"replace", path, 0, to); + return; + } + + switch (from->type & 0xFF) + { + case cJSON_Number: + if ((from->valueint != to->valueint) || !compare_double(from->valuedouble, to->valuedouble)) + { + compose_patch(patches, (const unsigned char*)"replace", path, NULL, to); + } + return; + + case cJSON_String: + if (strcmp(from->valuestring, to->valuestring) != 0) + { + compose_patch(patches, (const unsigned char*)"replace", path, NULL, to); + } + return; + + case cJSON_Array: + { + size_t index = 0; + cJSON *from_child = from->child; + cJSON *to_child = to->child; + unsigned char *new_path = (unsigned char*)cJSON_malloc(strlen((const char*)path) + 20 + sizeof("/")); /* Allow space for 64bit int. log10(2^64) = 20 */ + + /* generate patches for all array elements that exist in both "from" and "to" */ + for (index = 0; (from_child != NULL) && (to_child != NULL); (void)(from_child = from_child->next), (void)(to_child = to_child->next), index++) + { + /* check if conversion to unsigned long is valid + * This should be eliminated at compile time by dead code elimination + * if size_t is an alias of unsigned long, or if it is bigger */ + if (index > ULONG_MAX) + { + cJSON_free(new_path); + return; + } + sprintf((char*)new_path, "%s/%lu", path, (unsigned long)index); /* path of the current array element */ + create_patches(patches, new_path, from_child, to_child, case_sensitive); + } + + /* remove leftover elements from 'from' that are not in 'to' */ + for (; (from_child != NULL); (void)(from_child = from_child->next)) + { + /* check if conversion to unsigned long is valid + * This should be eliminated at compile time by dead code elimination + * if size_t is an alias of unsigned long, or if it is bigger */ + if (index > ULONG_MAX) + { + cJSON_free(new_path); + return; + } + sprintf((char*)new_path, "%lu", (unsigned long)index); + compose_patch(patches, (const unsigned char*)"remove", path, new_path, NULL); + } + /* add new elements in 'to' that were not in 'from' */ + for (; (to_child != NULL); (void)(to_child = to_child->next), index++) + { + compose_patch(patches, (const unsigned char*)"add", path, (const unsigned char*)"-", to_child); + } + cJSON_free(new_path); + return; + } + + case cJSON_Object: + { + cJSON *from_child = NULL; + cJSON *to_child = NULL; + sort_object(from, case_sensitive); + sort_object(to, case_sensitive); + + from_child = from->child; + to_child = to->child; + /* for all object values in the object with more of them */ + while ((from_child != NULL) || (to_child != NULL)) + { + int diff; + if (from_child == NULL) + { + diff = 1; + } + else if (to_child == NULL) + { + diff = -1; + } + else + { + diff = compare_strings((unsigned char*)from_child->string, (unsigned char*)to_child->string, case_sensitive); + } + + if (diff == 0) + { + /* both object keys are the same */ + size_t path_length = strlen((const char*)path); + size_t from_child_name_length = pointer_encoded_length((unsigned char*)from_child->string); + unsigned char *new_path = (unsigned char*)cJSON_malloc(path_length + from_child_name_length + sizeof("/")); + + sprintf((char*)new_path, "%s/", path); + encode_string_as_pointer(new_path + path_length + 1, (unsigned char*)from_child->string); + + /* create a patch for the element */ + create_patches(patches, new_path, from_child, to_child, case_sensitive); + cJSON_free(new_path); + + from_child = from_child->next; + to_child = to_child->next; + } + else if (diff < 0) + { + /* object element doesn't exist in 'to' --> remove it */ + compose_patch(patches, (const unsigned char*)"remove", path, (unsigned char*)from_child->string, NULL); + + from_child = from_child->next; + } + else + { + /* object element doesn't exist in 'from' --> add it */ + compose_patch(patches, (const unsigned char*)"add", path, (unsigned char*)to_child->string, to_child); + + to_child = to_child->next; + } + } + return; + } + + default: + break; + } +} + +CJSON_PUBLIC(cJSON *) cJSONUtils_GeneratePatches(cJSON * const from, cJSON * const to) +{ + cJSON *patches = NULL; + + if ((from == NULL) || (to == NULL)) + { + return NULL; + } + + patches = cJSON_CreateArray(); + create_patches(patches, (const unsigned char*)"", from, to, false); + + return patches; +} + +CJSON_PUBLIC(cJSON *) cJSONUtils_GeneratePatchesCaseSensitive(cJSON * const from, cJSON * const to) +{ + cJSON *patches = NULL; + + if ((from == NULL) || (to == NULL)) + { + return NULL; + } + + patches = cJSON_CreateArray(); + create_patches(patches, (const unsigned char*)"", from, to, true); + + return patches; +} + +CJSON_PUBLIC(void) cJSONUtils_SortObject(cJSON * const object) +{ + sort_object(object, false); +} + +CJSON_PUBLIC(void) cJSONUtils_SortObjectCaseSensitive(cJSON * const object) +{ + sort_object(object, true); +} + +static cJSON *merge_patch(cJSON *target, const cJSON * const patch, const cJSON_bool case_sensitive) +{ + cJSON *patch_child = NULL; + + if (!cJSON_IsObject(patch)) + { + /* scalar value, array or NULL, just duplicate */ + cJSON_Delete(target); + return cJSON_Duplicate(patch, 1); + } + + if (!cJSON_IsObject(target)) + { + cJSON_Delete(target); + target = cJSON_CreateObject(); + } + + patch_child = patch->child; + while (patch_child != NULL) + { + if (cJSON_IsNull(patch_child)) + { + /* NULL is the indicator to remove a value, see RFC7396 */ + if (case_sensitive) + { + cJSON_DeleteItemFromObjectCaseSensitive(target, patch_child->string); + } + else + { + cJSON_DeleteItemFromObject(target, patch_child->string); + } + } + else + { + cJSON *replace_me = NULL; + cJSON *replacement = NULL; + + if (case_sensitive) + { + replace_me = cJSON_DetachItemFromObjectCaseSensitive(target, patch_child->string); + } + else + { + replace_me = cJSON_DetachItemFromObject(target, patch_child->string); + } + + replacement = merge_patch(replace_me, patch_child, case_sensitive); + if (replacement == NULL) + { + cJSON_Delete(target); + return NULL; + } + + cJSON_AddItemToObject(target, patch_child->string, replacement); + } + patch_child = patch_child->next; + } + return target; +} + +CJSON_PUBLIC(cJSON *) cJSONUtils_MergePatch(cJSON *target, const cJSON * const patch) +{ + return merge_patch(target, patch, false); +} + +CJSON_PUBLIC(cJSON *) cJSONUtils_MergePatchCaseSensitive(cJSON *target, const cJSON * const patch) +{ + return merge_patch(target, patch, true); +} + +static cJSON *generate_merge_patch(cJSON * const from, cJSON * const to, const cJSON_bool case_sensitive) +{ + cJSON *from_child = NULL; + cJSON *to_child = NULL; + cJSON *patch = NULL; + if (to == NULL) + { + /* patch to delete everything */ + return cJSON_CreateNull(); + } + if (!cJSON_IsObject(to) || !cJSON_IsObject(from)) + { + return cJSON_Duplicate(to, 1); + } + + sort_object(from, case_sensitive); + sort_object(to, case_sensitive); + + from_child = from->child; + to_child = to->child; + patch = cJSON_CreateObject(); + if (patch == NULL) + { + return NULL; + } + while (from_child || to_child) + { + int diff; + if (from_child != NULL) + { + if (to_child != NULL) + { + diff = strcmp(from_child->string, to_child->string); + } + else + { + diff = -1; + } + } + else + { + diff = 1; + } + + if (diff < 0) + { + /* from has a value that to doesn't have -> remove */ + cJSON_AddItemToObject(patch, from_child->string, cJSON_CreateNull()); + + from_child = from_child->next; + } + else if (diff > 0) + { + /* to has a value that from doesn't have -> add to patch */ + cJSON_AddItemToObject(patch, to_child->string, cJSON_Duplicate(to_child, 1)); + + to_child = to_child->next; + } + else + { + /* object key exists in both objects */ + if (!compare_json(from_child, to_child, case_sensitive)) + { + /* not identical --> generate a patch */ + cJSON_AddItemToObject(patch, to_child->string, cJSONUtils_GenerateMergePatch(from_child, to_child)); + } + + /* next key in the object */ + from_child = from_child->next; + to_child = to_child->next; + } + } + if (patch->child == NULL) + { + /* no patch generated */ + cJSON_Delete(patch); + return NULL; + } + + return patch; +} + +CJSON_PUBLIC(cJSON *) cJSONUtils_GenerateMergePatch(cJSON * const from, cJSON * const to) +{ + return generate_merge_patch(from, to, false); +} + +CJSON_PUBLIC(cJSON *) cJSONUtils_GenerateMergePatchCaseSensitive(cJSON * const from, cJSON * const to) +{ + return generate_merge_patch(from, to, true); +} diff --git a/thirdparty/cjson/cJSON_Utils.h b/thirdparty/cjson/cJSON_Utils.h new file mode 100644 index 0000000..a970c65 --- /dev/null +++ b/thirdparty/cjson/cJSON_Utils.h @@ -0,0 +1,88 @@ +/* + Copyright (c) 2009-2017 Dave Gamble and cJSON contributors + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + THE SOFTWARE. +*/ + +#ifndef cJSON_Utils__h +#define cJSON_Utils__h + +#ifdef __cplusplus +extern "C" +{ +#endif + +#include "cJSON.h" + +/* Implement RFC6901 (https://tools.ietf.org/html/rfc6901) JSON Pointer spec. */ +CJSON_PUBLIC(cJSON *) cJSONUtils_GetPointer(cJSON * const object, const char *pointer); +CJSON_PUBLIC(cJSON *) cJSONUtils_GetPointerCaseSensitive(cJSON * const object, const char *pointer); + +/* Implement RFC6902 (https://tools.ietf.org/html/rfc6902) JSON Patch spec. */ +/* NOTE: This modifies objects in 'from' and 'to' by sorting the elements by their key */ +CJSON_PUBLIC(cJSON *) cJSONUtils_GeneratePatches(cJSON * const from, cJSON * const to); +CJSON_PUBLIC(cJSON *) cJSONUtils_GeneratePatchesCaseSensitive(cJSON * const from, cJSON * const to); +/* Utility for generating patch array entries. */ +CJSON_PUBLIC(void) cJSONUtils_AddPatchToArray(cJSON * const array, const char * const operation, const char * const path, const cJSON * const value); +/* Returns 0 for success. */ +CJSON_PUBLIC(int) cJSONUtils_ApplyPatches(cJSON * const object, const cJSON * const patches); +CJSON_PUBLIC(int) cJSONUtils_ApplyPatchesCaseSensitive(cJSON * const object, const cJSON * const patches); + +/* +// Note that ApplyPatches is NOT atomic on failure. To implement an atomic ApplyPatches, use: +//int cJSONUtils_AtomicApplyPatches(cJSON **object, cJSON *patches) +//{ +// cJSON *modme = cJSON_Duplicate(*object, 1); +// int error = cJSONUtils_ApplyPatches(modme, patches); +// if (!error) +// { +// cJSON_Delete(*object); +// *object = modme; +// } +// else +// { +// cJSON_Delete(modme); +// } +// +// return error; +//} +// Code not added to library since this strategy is a LOT slower. +*/ + +/* Implement RFC7386 (https://tools.ietf.org/html/rfc7396) JSON Merge Patch spec. */ +/* target will be modified by patch. return value is new ptr for target. */ +CJSON_PUBLIC(cJSON *) cJSONUtils_MergePatch(cJSON *target, const cJSON * const patch); +CJSON_PUBLIC(cJSON *) cJSONUtils_MergePatchCaseSensitive(cJSON *target, const cJSON * const patch); +/* generates a patch to move from -> to */ +/* NOTE: This modifies objects in 'from' and 'to' by sorting the elements by their key */ +CJSON_PUBLIC(cJSON *) cJSONUtils_GenerateMergePatch(cJSON * const from, cJSON * const to); +CJSON_PUBLIC(cJSON *) cJSONUtils_GenerateMergePatchCaseSensitive(cJSON * const from, cJSON * const to); + +/* Given a root object and a target object, construct a pointer from one to the other. */ +CJSON_PUBLIC(char *) cJSONUtils_FindPointerFromObjectTo(const cJSON * const object, const cJSON * const target); + +/* Sorts the members of the object into alphabetical order. */ +CJSON_PUBLIC(void) cJSONUtils_SortObject(cJSON * const object); +CJSON_PUBLIC(void) cJSONUtils_SortObjectCaseSensitive(cJSON * const object); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/thirdparty/enet/.github/workflows/cmake.yml b/thirdparty/enet/.github/workflows/cmake.yml new file mode 100644 index 0000000..721d430 --- /dev/null +++ b/thirdparty/enet/.github/workflows/cmake.yml @@ -0,0 +1,21 @@ +on: [push, pull_request] + +name: CMake + +jobs: + cmake-build: + name: CMake ${{ matrix.os }} ${{ matrix.build_type }} + runs-on: ${{ matrix.os }} + strategy: + fail-fast: false + matrix: + os: ["ubuntu-latest", "windows-latest", "macos-latest"] + build_type: ["Debug", "Release"] + steps: + - uses: actions/checkout@v3 + + - name: Configure CMake + run: cmake -B ${{github.workspace}}/build -DCMAKE_BUILD_TYPE=${{ matrix.build_type }} + + - name: Build + run: cmake --build ${{github.workspace}}/build --config ${{ matrix.build_type }} diff --git a/thirdparty/enet/CMakeLists.txt b/thirdparty/enet/CMakeLists.txt new file mode 100644 index 0000000..82a98b1 --- /dev/null +++ b/thirdparty/enet/CMakeLists.txt @@ -0,0 +1,103 @@ +cmake_minimum_required(VERSION 2.8.12...3.20) + +project(enet) + +# The "configure" step. +include(CheckFunctionExists) +include(CheckStructHasMember) +include(CheckTypeSize) +check_function_exists("fcntl" HAS_FCNTL) +check_function_exists("poll" HAS_POLL) +check_function_exists("getaddrinfo" HAS_GETADDRINFO) +check_function_exists("getnameinfo" HAS_GETNAMEINFO) +check_function_exists("gethostbyname_r" HAS_GETHOSTBYNAME_R) +check_function_exists("gethostbyaddr_r" HAS_GETHOSTBYADDR_R) +check_function_exists("inet_pton" HAS_INET_PTON) +check_function_exists("inet_ntop" HAS_INET_NTOP) +check_struct_has_member("struct msghdr" "msg_flags" "sys/types.h;sys/socket.h" HAS_MSGHDR_FLAGS) +set(CMAKE_EXTRA_INCLUDE_FILES "sys/types.h" "sys/socket.h") +check_type_size("socklen_t" HAS_SOCKLEN_T BUILTIN_TYPES_ONLY) +unset(CMAKE_EXTRA_INCLUDE_FILES) +if(MSVC) + add_definitions(-W3) +else() + add_definitions(-Wno-error) +endif() + +if(HAS_FCNTL) + add_definitions(-DHAS_FCNTL=1) +endif() +if(HAS_POLL) + add_definitions(-DHAS_POLL=1) +endif() +if(HAS_GETNAMEINFO) + add_definitions(-DHAS_GETNAMEINFO=1) +endif() +if(HAS_GETADDRINFO) + add_definitions(-DHAS_GETADDRINFO=1) +endif() +if(HAS_GETHOSTBYNAME_R) + add_definitions(-DHAS_GETHOSTBYNAME_R=1) +endif() +if(HAS_GETHOSTBYADDR_R) + add_definitions(-DHAS_GETHOSTBYADDR_R=1) +endif() +if(HAS_INET_PTON) + add_definitions(-DHAS_INET_PTON=1) +endif() +if(HAS_INET_NTOP) + add_definitions(-DHAS_INET_NTOP=1) +endif() +if(HAS_MSGHDR_FLAGS) + add_definitions(-DHAS_MSGHDR_FLAGS=1) +endif() +if(HAS_SOCKLEN_T) + add_definitions(-DHAS_SOCKLEN_T=1) +endif() + +include_directories(${PROJECT_SOURCE_DIR}/include) + +set(INCLUDE_FILES_PREFIX include/enet) +set(INCLUDE_FILES + ${INCLUDE_FILES_PREFIX}/callbacks.h + ${INCLUDE_FILES_PREFIX}/enet.h + ${INCLUDE_FILES_PREFIX}/list.h + ${INCLUDE_FILES_PREFIX}/protocol.h + ${INCLUDE_FILES_PREFIX}/time.h + ${INCLUDE_FILES_PREFIX}/types.h + ${INCLUDE_FILES_PREFIX}/unix.h + ${INCLUDE_FILES_PREFIX}/utility.h + ${INCLUDE_FILES_PREFIX}/win32.h +) + +set(SOURCE_FILES + callbacks.c + compress.c + host.c + list.c + packet.c + peer.c + protocol.c + unix.c + win32.c) + +source_group(include FILES ${INCLUDE_FILES}) +source_group(source FILES ${SOURCE_FILES}) + +add_library(enet STATIC + ${SOURCE_FILES} +) + +target_include_directories(enet PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/include ) + +if (MINGW) + target_link_libraries(enet winmm ws2_32) +endif() + +install(TARGETS enet + RUNTIME DESTINATION bin + ARCHIVE DESTINATION lib/static + LIBRARY DESTINATION lib) + +install(DIRECTORY include/ + DESTINATION include) diff --git a/thirdparty/enet/ChangeLog b/thirdparty/enet/ChangeLog new file mode 100644 index 0000000..0fc45d3 --- /dev/null +++ b/thirdparty/enet/ChangeLog @@ -0,0 +1,209 @@ +ENet 1.3.18 (April 14, 2024): + +* Packet sending performance improvements +* MTU negotiation fixes +* Checksum alignment fix +* No more dynamic initialization of checksum table +* ENET_SOCKOPT_TTL +* Other miscellaneous small improvements + +ENet 1.3.17 (November 15, 2020): + +* fixes for sender getting too far ahead of receiver that can cause instability with reliable packets + +ENet 1.3.16 (September 8, 2020): + +* fix bug in unreliable fragment queuing +* use single output queue for reliable and unreliable packets for saner ordering +* revert experimental throttle changes that were less stable than prior algorithm + +ENet 1.3.15 (April 20, 2020): + +* quicker RTT initialization +* use fractional precision for RTT calculations +* fixes for packet throttle with low RTT variance +* miscellaneous socket bug fixes + +ENet 1.3.14 (January 27, 2019): + +* bug fix for enet_peer_disconnect_later() +* use getaddrinfo and getnameinfo where available +* miscellaneous cleanups + +ENet 1.3.13 (April 30, 2015): + +* miscellaneous bug fixes +* added premake and cmake support +* miscellaneous documentation cleanups + +ENet 1.3.12 (April 24, 2014): + +* added maximumPacketSize and maximumWaitingData fields to ENetHost to limit the amount of +data waiting to be delivered on a peer (beware that the default maximumPacketSize is +32MB and should be set higher if desired as should maximumWaitingData) + +ENet 1.3.11 (December 26, 2013): + +* allow an ENetHost to connect to itself +* fixed possible bug with disconnect notifications during connect attempts +* fixed some preprocessor definition bugs + +ENet 1.3.10 (October 23, 2013); + +* doubled maximum reliable window size +* fixed RCVTIMEO/SNDTIMEO socket options and also added NODELAY + +ENet 1.3.9 (August 19, 2013): + +* added duplicatePeers option to ENetHost which can limit the number of peers from duplicate IPs +* added enet_socket_get_option() and ENET_SOCKOPT_ERROR +* added enet_host_random_seed() platform stub + +ENet 1.3.8 (June 2, 2013): + +* added enet_linked_version() for checking the linked version +* added enet_socket_get_address() for querying the local address of a socket +* silenced some debugging prints unless ENET_DEBUG is defined during compilation +* handle EINTR in enet_socket_wait() so that enet_host_service() doesn't propagate errors from signals +* optimized enet_host_bandwidth_throttle() to be less expensive for large numbers of peers + +ENet 1.3.7 (March 6, 2013): + +* added ENET_PACKET_FLAG_SENT to indicate that a packet is being freed because it has been sent +* added userData field to ENetPacket +* changed how random seed is generated on Windows to avoid import warnings +* fixed case where disconnects could be generated with no preceding connect event + +ENet 1.3.6 (December 11, 2012): + +* added support for intercept callback in ENetHost that can be used to process raw packets before ENet +* added enet_socket_shutdown() for issuing shutdown on a socket +* fixed enet_socket_connect() to not error on non-blocking connects +* fixed bug in MTU negotiation during connections + +ENet 1.3.5 (July 31, 2012): + +* fixed bug in unreliable packet fragment queuing + +ENet 1.3.4 (May 29, 2012): + +* added enet_peer_ping_interval() for configuring per-peer ping intervals +* added enet_peer_timeout() for configuring per-peer timeouts +* added protocol packet size limits + +ENet 1.3.3 (June 28, 2011): + +* fixed bug with simultaneous disconnects not dispatching events + +ENet 1.3.2 (May 31, 2011): + +* added support for unreliable packet fragmenting via the packet flag +ENET_PACKET_FLAG_UNRELIABLE_FRAGMENT +* fixed regression in unreliable packet queuing +* added check against received port to limit some forms of IP-spoofing + +ENet 1.3.1 (February 10, 2011): + +* fixed bug in tracking of reliable data in transit +* reliable data window size now scales with the throttle +* fixed bug in fragment length calculation when checksums are used + +ENet 1.3.0 (June 5, 2010): + +* enet_host_create() now requires the channel limit to be specified as +a parameter +* enet_host_connect() now accepts a data parameter which is supplied +to the receiving receiving host in the event data field for a connect event +* added an adaptive order-2 PPM range coder as a built-in compressor option +which can be set with enet_host_compress_with_range_coder() +* added support for packet compression configurable with a callback +* improved session number handling to not rely on the packet checksum +field, saving 4 bytes per packet unless the checksum option is used +* removed the dependence on the rand callback for session number handling + +Caveats: This version is not protocol compatible with the 1.2 series or +earlier. The enet_host_connect and enet_host_create API functions require +supplying additional parameters. + +ENet 1.2.5 (June 28, 2011): + +* fixed bug with simultaneous disconnects not dispatching events + +ENet 1.2.4 (May 31, 2011): + +* fixed regression in unreliable packet queuing +* added check against received port to limit some forms of IP-spoofing + +ENet 1.2.3 (February 10, 2011): + +* fixed bug in tracking reliable data in transit + +ENet 1.2.2 (June 5, 2010): + +* checksum functionality is now enabled by setting a checksum callback +inside ENetHost instead of being a configure script option +* added totalSentData, totalSentPackets, totalReceivedData, and +totalReceivedPackets counters inside ENetHost for getting usage +statistics +* added enet_host_channel_limit() for limiting the maximum number of +channels allowed by connected peers +* now uses dispatch queues for event dispatch rather than potentially +unscalable array walking +* added no_memory callback that is called when a malloc attempt fails, +such that if no_memory returns rather than aborts (the default behavior), +then the error is propagated to the return value of the API calls +* now uses packed attribute for protocol structures on platforms with +strange alignment rules +* improved autoconf build system contributed by Nathan Brink allowing +for easier building as a shared library + +Caveats: If you were using the compile-time option that enabled checksums, +make sure to set the checksum callback inside ENetHost to enet_crc32 to +regain the old behavior. The ENetCallbacks structure has added new fields, +so make sure to clear the structure to zero before use if +using enet_initialize_with_callbacks(). + +ENet 1.2.1 (November 12, 2009): + +* fixed bug that could cause disconnect events to be dropped +* added thin wrapper around select() for portable usage +* added ENET_SOCKOPT_REUSEADDR socket option +* factored enet_socket_bind()/enet_socket_listen() out of enet_socket_create() +* added contributed Code::Blocks build file + +ENet 1.2 (February 12, 2008): + +* fixed bug in VERIFY_CONNECT acknowledgement that could cause connect +attempts to occasionally timeout +* fixed acknowledgements to check both the outgoing and sent queues +when removing acknowledged packets +* fixed accidental bit rot in the MSVC project file +* revised sequence number overflow handling to address some possible +disconnect bugs +* added enet_host_check_events() for getting only local queued events +* factored out socket option setting into enet_socket_set_option() so +that socket options are now set separately from enet_socket_create() + +Caveats: While this release is superficially protocol compatible with 1.1, +differences in the sequence number overflow handling can potentially cause +random disconnects. + +ENet 1.1 (June 6, 2007): + +* optional CRC32 just in case someone needs a stronger checksum than UDP +provides (--enable-crc32 configure option) +* the size of packet headers are half the size they used to be (so less +overhead when sending small packets) +* enet_peer_disconnect_later() that waits till all queued outgoing +packets get sent before issuing an actual disconnect +* freeCallback field in individual packets for notification of when a +packet is about to be freed +* ENET_PACKET_FLAG_NO_ALLOCATE for supplying pre-allocated data to a +packet (can be used in concert with freeCallback to support some custom +allocation schemes that the normal memory allocation callbacks would +normally not allow) +* enet_address_get_host_ip() for printing address numbers +* promoted the enet_socket_*() functions to be part of the API now +* a few stability/crash fixes + + diff --git a/thirdparty/enet/Doxyfile b/thirdparty/enet/Doxyfile new file mode 100644 index 0000000..b72cb50 --- /dev/null +++ b/thirdparty/enet/Doxyfile @@ -0,0 +1,2303 @@ +# Doxyfile 1.8.6 + +# This file describes the settings to be used by the documentation system +# doxygen (www.doxygen.org) for a project. +# +# All text after a double hash (##) is considered a comment and is placed in +# front of the TAG it is preceding. +# +# All text after a single hash (#) is considered a comment and will be ignored. +# The format is: +# TAG = value [value, ...] +# For lists, items can also be appended using: +# TAG += value [value, ...] +# Values that contain spaces should be placed between quotes (\" \"). + +#--------------------------------------------------------------------------- +# Project related configuration options +#--------------------------------------------------------------------------- + +# This tag specifies the encoding used for all characters in the config file +# that follow. The default is UTF-8 which is also the encoding used for all text +# before the first occurrence of this tag. Doxygen uses libiconv (or the iconv +# built into libc) for the transcoding. See http://www.gnu.org/software/libiconv +# for the list of possible encodings. +# The default value is: UTF-8. + +DOXYFILE_ENCODING = UTF-8 + +# The PROJECT_NAME tag is a single word (or a sequence of words surrounded by +# double-quotes, unless you are using Doxywizard) that should identify the +# project for which the documentation is generated. This name is used in the +# title of most generated pages and in a few other places. +# The default value is: My Project. + +PROJECT_NAME = "ENet" + +# The PROJECT_NUMBER tag can be used to enter a project or revision number. This +# could be handy for archiving the generated documentation or if some version +# control system is used. + +PROJECT_NUMBER = v1.3.18 + +# Using the PROJECT_BRIEF tag one can provide an optional one line description +# for a project that appears at the top of each page and should give viewer a +# quick idea about the purpose of the project. Keep the description short. + +PROJECT_BRIEF = "Reliable UDP networking library" + +# With the PROJECT_LOGO tag one can specify an logo or icon that is included in +# the documentation. The maximum height of the logo should not exceed 55 pixels +# and the maximum width should not exceed 200 pixels. Doxygen will copy the logo +# to the output directory. + +PROJECT_LOGO = + +# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) path +# into which the generated documentation will be written. If a relative path is +# entered, it will be relative to the location where doxygen was started. If +# left blank the current directory will be used. + +OUTPUT_DIRECTORY = docs + +# If the CREATE_SUBDIRS tag is set to YES, then doxygen will create 4096 sub- +# directories (in 2 levels) under the output directory of each output format and +# will distribute the generated files over these directories. Enabling this +# option can be useful when feeding doxygen a huge amount of source files, where +# putting all generated files in the same directory would otherwise causes +# performance problems for the file system. +# The default value is: NO. + +CREATE_SUBDIRS = NO + +# The OUTPUT_LANGUAGE tag is used to specify the language in which all +# documentation generated by doxygen is written. Doxygen will use this +# information to generate all constant output in the proper language. +# Possible values are: Afrikaans, Arabic, Armenian, Brazilian, Catalan, Chinese, +# Chinese-Traditional, Croatian, Czech, Danish, Dutch, English (United States), +# Esperanto, Farsi (Persian), Finnish, French, German, Greek, Hungarian, +# Indonesian, Italian, Japanese, Japanese-en (Japanese with English messages), +# Korean, Korean-en (Korean with English messages), Latvian, Lithuanian, +# Macedonian, Norwegian, Persian (Farsi), Polish, Portuguese, Romanian, Russian, +# Serbian, Serbian-Cyrillic, Slovak, Slovene, Spanish, Swedish, Turkish, +# Ukrainian and Vietnamese. +# The default value is: English. + +OUTPUT_LANGUAGE = English + +# If the BRIEF_MEMBER_DESC tag is set to YES doxygen will include brief member +# descriptions after the members that are listed in the file and class +# documentation (similar to Javadoc). Set to NO to disable this. +# The default value is: YES. + +BRIEF_MEMBER_DESC = YES + +# If the REPEAT_BRIEF tag is set to YES doxygen will prepend the brief +# description of a member or function before the detailed description +# +# Note: If both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the +# brief descriptions will be completely suppressed. +# The default value is: YES. + +REPEAT_BRIEF = YES + +# This tag implements a quasi-intelligent brief description abbreviator that is +# used to form the text in various listings. Each string in this list, if found +# as the leading text of the brief description, will be stripped from the text +# and the result, after processing the whole list, is used as the annotated +# text. Otherwise, the brief description is used as-is. If left blank, the +# following values are used ($name is automatically replaced with the name of +# the entity):The $name class, The $name widget, The $name file, is, provides, +# specifies, contains, represents, a, an and the. + +ABBREVIATE_BRIEF = + +# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then +# doxygen will generate a detailed section even if there is only a brief +# description. +# The default value is: NO. + +ALWAYS_DETAILED_SEC = YES + +# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all +# inherited members of a class in the documentation of that class as if those +# members were ordinary class members. Constructors, destructors and assignment +# operators of the base classes will not be shown. +# The default value is: NO. + +INLINE_INHERITED_MEMB = YES + +# If the FULL_PATH_NAMES tag is set to YES doxygen will prepend the full path +# before files name in the file list and in the header files. If set to NO the +# shortest path that makes the file name unique will be used +# The default value is: YES. + +FULL_PATH_NAMES = YES + +# The STRIP_FROM_PATH tag can be used to strip a user-defined part of the path. +# Stripping is only done if one of the specified strings matches the left-hand +# part of the path. The tag can be used to show relative paths in the file list. +# If left blank the directory from which doxygen is run is used as the path to +# strip. +# +# Note that you can specify absolute paths here, but also relative paths, which +# will be relative from the directory where doxygen is started. +# This tag requires that the tag FULL_PATH_NAMES is set to YES. + +STRIP_FROM_PATH = + +# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of the +# path mentioned in the documentation of a class, which tells the reader which +# header file to include in order to use a class. If left blank only the name of +# the header file containing the class definition is used. Otherwise one should +# specify the list of include paths that are normally passed to the compiler +# using the -I flag. + +STRIP_FROM_INC_PATH = + +# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter (but +# less readable) file names. This can be useful is your file systems doesn't +# support long names like on DOS, Mac, or CD-ROM. +# The default value is: NO. + +SHORT_NAMES = NO + +# If the JAVADOC_AUTOBRIEF tag is set to YES then doxygen will interpret the +# first line (until the first dot) of a Javadoc-style comment as the brief +# description. If set to NO, the Javadoc-style will behave just like regular Qt- +# style comments (thus requiring an explicit @brief command for a brief +# description.) +# The default value is: NO. + +JAVADOC_AUTOBRIEF = YES + +# If the QT_AUTOBRIEF tag is set to YES then doxygen will interpret the first +# line (until the first dot) of a Qt-style comment as the brief description. If +# set to NO, the Qt-style will behave just like regular Qt-style comments (thus +# requiring an explicit \brief command for a brief description.) +# The default value is: NO. + +QT_AUTOBRIEF = NO + +# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make doxygen treat a +# multi-line C++ special comment block (i.e. a block of //! or /// comments) as +# a brief description. This used to be the default behavior. The new default is +# to treat a multi-line C++ comment block as a detailed description. Set this +# tag to YES if you prefer the old behavior instead. +# +# Note that setting this tag to YES also means that rational rose comments are +# not recognized any more. +# The default value is: NO. + +MULTILINE_CPP_IS_BRIEF = NO + +# If the INHERIT_DOCS tag is set to YES then an undocumented member inherits the +# documentation from any documented member that it re-implements. +# The default value is: YES. + +INHERIT_DOCS = YES + +# If the SEPARATE_MEMBER_PAGES tag is set to YES, then doxygen will produce a +# new page for each member. If set to NO, the documentation of a member will be +# part of the file/class/namespace that contains it. +# The default value is: NO. + +SEPARATE_MEMBER_PAGES = NO + +# The TAB_SIZE tag can be used to set the number of spaces in a tab. Doxygen +# uses this value to replace tabs by spaces in code fragments. +# Minimum value: 1, maximum value: 16, default value: 4. + +TAB_SIZE = 4 + +# This tag can be used to specify a number of aliases that act as commands in +# the documentation. An alias has the form: +# name=value +# For example adding +# "sideeffect=@par Side Effects:\n" +# will allow you to put the command \sideeffect (or @sideeffect) in the +# documentation, which will result in a user-defined paragraph with heading +# "Side Effects:". You can put \n's in the value part of an alias to insert +# newlines. + +ALIASES = + +# This tag can be used to specify a number of word-keyword mappings (TCL only). +# A mapping has the form "name=value". For example adding "class=itcl::class" +# will allow you to use the command class in the itcl::class meaning. + +TCL_SUBST = + +# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C sources +# only. Doxygen will then generate output that is more tailored for C. For +# instance, some of the names that are used will be different. The list of all +# members will be omitted, etc. +# The default value is: NO. + +OPTIMIZE_OUTPUT_FOR_C = YES + +# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java or +# Python sources only. Doxygen will then generate output that is more tailored +# for that language. For instance, namespaces will be presented as packages, +# qualified scopes will look different, etc. +# The default value is: NO. + +OPTIMIZE_OUTPUT_JAVA = NO + +# Set the OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran +# sources. Doxygen will then generate output that is tailored for Fortran. +# The default value is: NO. + +OPTIMIZE_FOR_FORTRAN = NO + +# Set the OPTIMIZE_OUTPUT_VHDL tag to YES if your project consists of VHDL +# sources. Doxygen will then generate output that is tailored for VHDL. +# The default value is: NO. + +OPTIMIZE_OUTPUT_VHDL = NO + +# Doxygen selects the parser to use depending on the extension of the files it +# parses. With this tag you can assign which parser to use for a given +# extension. Doxygen has a built-in mapping, but you can override or extend it +# using this tag. The format is ext=language, where ext is a file extension, and +# language is one of the parsers supported by doxygen: IDL, Java, Javascript, +# C#, C, C++, D, PHP, Objective-C, Python, Fortran, VHDL. For instance to make +# doxygen treat .inc files as Fortran files (default is PHP), and .f files as C +# (default is Fortran), use: inc=Fortran f=C. +# +# Note For files without extension you can use no_extension as a placeholder. +# +# Note that for custom extensions you also need to set FILE_PATTERNS otherwise +# the files are not read by doxygen. + +EXTENSION_MAPPING = + +# If the MARKDOWN_SUPPORT tag is enabled then doxygen pre-processes all comments +# according to the Markdown format, which allows for more readable +# documentation. See http://daringfireball.net/projects/markdown/ for details. +# The output of markdown processing is further processed by doxygen, so you can +# mix doxygen, HTML, and XML commands with Markdown formatting. Disable only in +# case of backward compatibilities issues. +# The default value is: YES. + +MARKDOWN_SUPPORT = YES + +# When enabled doxygen tries to link words that correspond to documented +# classes, or namespaces to their corresponding documentation. Such a link can +# be prevented in individual cases by by putting a % sign in front of the word +# or globally by setting AUTOLINK_SUPPORT to NO. +# The default value is: YES. + +AUTOLINK_SUPPORT = YES + +# If you use STL classes (i.e. std::string, std::vector, etc.) but do not want +# to include (a tag file for) the STL sources as input, then you should set this +# tag to YES in order to let doxygen match functions declarations and +# definitions whose arguments contain STL classes (e.g. func(std::string); +# versus func(std::string) {}). This also make the inheritance and collaboration +# diagrams that involve STL classes more complete and accurate. +# The default value is: NO. + +BUILTIN_STL_SUPPORT = NO + +# If you use Microsoft's C++/CLI language, you should set this option to YES to +# enable parsing support. +# The default value is: NO. + +CPP_CLI_SUPPORT = NO + +# Set the SIP_SUPPORT tag to YES if your project consists of sip (see: +# http://www.riverbankcomputing.co.uk/software/sip/intro) sources only. Doxygen +# will parse them like normal C++ but will assume all classes use public instead +# of private inheritance when no explicit protection keyword is present. +# The default value is: NO. + +SIP_SUPPORT = NO + +# For Microsoft's IDL there are propget and propput attributes to indicate +# getter and setter methods for a property. Setting this option to YES will make +# doxygen to replace the get and set methods by a property in the documentation. +# This will only work if the methods are indeed getting or setting a simple +# type. If this is not the case, or you want to show the methods anyway, you +# should set this option to NO. +# The default value is: YES. + +IDL_PROPERTY_SUPPORT = YES + +# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC +# tag is set to YES, then doxygen will reuse the documentation of the first +# member in the group (if any) for the other members of the group. By default +# all members of a group must be documented explicitly. +# The default value is: NO. + +DISTRIBUTE_GROUP_DOC = YES + +# Set the SUBGROUPING tag to YES to allow class member groups of the same type +# (for instance a group of public functions) to be put as a subgroup of that +# type (e.g. under the Public Functions section). Set it to NO to prevent +# subgrouping. Alternatively, this can be done per class using the +# \nosubgrouping command. +# The default value is: YES. + +SUBGROUPING = YES + +# When the INLINE_GROUPED_CLASSES tag is set to YES, classes, structs and unions +# are shown inside the group in which they are included (e.g. using \ingroup) +# instead of on a separate page (for HTML and Man pages) or section (for LaTeX +# and RTF). +# +# Note that this feature does not work in combination with +# SEPARATE_MEMBER_PAGES. +# The default value is: NO. + +INLINE_GROUPED_CLASSES = YES + +# When the INLINE_SIMPLE_STRUCTS tag is set to YES, structs, classes, and unions +# with only public data fields or simple typedef fields will be shown inline in +# the documentation of the scope in which they are defined (i.e. file, +# namespace, or group documentation), provided this scope is documented. If set +# to NO, structs, classes, and unions are shown on a separate page (for HTML and +# Man pages) or section (for LaTeX and RTF). +# The default value is: NO. + +INLINE_SIMPLE_STRUCTS = NO + +# When TYPEDEF_HIDES_STRUCT tag is enabled, a typedef of a struct, union, or +# enum is documented as struct, union, or enum with the name of the typedef. So +# typedef struct TypeS {} TypeT, will appear in the documentation as a struct +# with name TypeT. When disabled the typedef will appear as a member of a file, +# namespace, or class. And the struct will be named TypeS. This can typically be +# useful for C code in case the coding convention dictates that all compound +# types are typedef'ed and only the typedef is referenced, never the tag name. +# The default value is: NO. + +TYPEDEF_HIDES_STRUCT = YES + +# The size of the symbol lookup cache can be set using LOOKUP_CACHE_SIZE. This +# cache is used to resolve symbols given their name and scope. Since this can be +# an expensive process and often the same symbol appears multiple times in the +# code, doxygen keeps a cache of pre-resolved symbols. If the cache is too small +# doxygen will become slower. If the cache is too large, memory is wasted. The +# cache size is given by this formula: 2^(16+LOOKUP_CACHE_SIZE). The valid range +# is 0..9, the default is 0, corresponding to a cache size of 2^16=65536 +# symbols. At the end of a run doxygen will report the cache usage and suggest +# the optimal cache size from a speed point of view. +# Minimum value: 0, maximum value: 9, default value: 0. + +LOOKUP_CACHE_SIZE = 0 + +#--------------------------------------------------------------------------- +# Build related configuration options +#--------------------------------------------------------------------------- + +# If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in +# documentation are documented, even if no documentation was available. Private +# class members and static file members will be hidden unless the +# EXTRACT_PRIVATE respectively EXTRACT_STATIC tags are set to YES. +# Note: This will also disable the warnings about undocumented members that are +# normally produced when WARNINGS is set to YES. +# The default value is: NO. + +EXTRACT_ALL = YES + +# If the EXTRACT_PRIVATE tag is set to YES all private members of a class will +# be included in the documentation. +# The default value is: NO. + +EXTRACT_PRIVATE = NO + +# If the EXTRACT_PACKAGE tag is set to YES all members with package or internal +# scope will be included in the documentation. +# The default value is: NO. + +EXTRACT_PACKAGE = NO + +# If the EXTRACT_STATIC tag is set to YES all static members of a file will be +# included in the documentation. +# The default value is: NO. + +EXTRACT_STATIC = NO + +# If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs) defined +# locally in source files will be included in the documentation. If set to NO +# only classes defined in header files are included. Does not have any effect +# for Java sources. +# The default value is: YES. + +EXTRACT_LOCAL_CLASSES = NO + +# This flag is only useful for Objective-C code. When set to YES local methods, +# which are defined in the implementation section but not in the interface are +# included in the documentation. If set to NO only methods in the interface are +# included. +# The default value is: NO. + +EXTRACT_LOCAL_METHODS = NO + +# If this flag is set to YES, the members of anonymous namespaces will be +# extracted and appear in the documentation as a namespace called +# 'anonymous_namespace{file}', where file will be replaced with the base name of +# the file that contains the anonymous namespace. By default anonymous namespace +# are hidden. +# The default value is: NO. + +EXTRACT_ANON_NSPACES = NO + +# If the HIDE_UNDOC_MEMBERS tag is set to YES, doxygen will hide all +# undocumented members inside documented classes or files. If set to NO these +# members will be included in the various overviews, but no documentation +# section is generated. This option has no effect if EXTRACT_ALL is enabled. +# The default value is: NO. + +HIDE_UNDOC_MEMBERS = YES + +# If the HIDE_UNDOC_CLASSES tag is set to YES, doxygen will hide all +# undocumented classes that are normally visible in the class hierarchy. If set +# to NO these classes will be included in the various overviews. This option has +# no effect if EXTRACT_ALL is enabled. +# The default value is: NO. + +HIDE_UNDOC_CLASSES = YES + +# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, doxygen will hide all friend +# (class|struct|union) declarations. If set to NO these declarations will be +# included in the documentation. +# The default value is: NO. + +HIDE_FRIEND_COMPOUNDS = NO + +# If the HIDE_IN_BODY_DOCS tag is set to YES, doxygen will hide any +# documentation blocks found inside the body of a function. If set to NO these +# blocks will be appended to the function's detailed documentation block. +# The default value is: NO. + +HIDE_IN_BODY_DOCS = NO + +# The INTERNAL_DOCS tag determines if documentation that is typed after a +# \internal command is included. If the tag is set to NO then the documentation +# will be excluded. Set it to YES to include the internal documentation. +# The default value is: NO. + +INTERNAL_DOCS = NO + +# If the CASE_SENSE_NAMES tag is set to NO then doxygen will only generate file +# names in lower-case letters. If set to YES upper-case letters are also +# allowed. This is useful if you have classes or files whose names only differ +# in case and if your file system supports case sensitive file names. Windows +# and Mac users are advised to set this option to NO. +# The default value is: system dependent. + +CASE_SENSE_NAMES = YES + +# If the HIDE_SCOPE_NAMES tag is set to NO then doxygen will show members with +# their full class and namespace scopes in the documentation. If set to YES the +# scope will be hidden. +# The default value is: NO. + +HIDE_SCOPE_NAMES = NO + +# If the SHOW_INCLUDE_FILES tag is set to YES then doxygen will put a list of +# the files that are included by a file in the documentation of that file. +# The default value is: YES. + +SHOW_INCLUDE_FILES = YES + +# If the SHOW_GROUPED_MEMB_INC tag is set to YES then Doxygen will add for each +# grouped member an include statement to the documentation, telling the reader +# which file to include in order to use the member. +# The default value is: NO. + +SHOW_GROUPED_MEMB_INC = YES + +# If the FORCE_LOCAL_INCLUDES tag is set to YES then doxygen will list include +# files with double quotes in the documentation rather than with sharp brackets. +# The default value is: NO. + +FORCE_LOCAL_INCLUDES = NO + +# If the INLINE_INFO tag is set to YES then a tag [inline] is inserted in the +# documentation for inline members. +# The default value is: YES. + +INLINE_INFO = YES + +# If the SORT_MEMBER_DOCS tag is set to YES then doxygen will sort the +# (detailed) documentation of file and class members alphabetically by member +# name. If set to NO the members will appear in declaration order. +# The default value is: YES. + +SORT_MEMBER_DOCS = YES + +# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the brief +# descriptions of file, namespace and class members alphabetically by member +# name. If set to NO the members will appear in declaration order. Note that +# this will also influence the order of the classes in the class list. +# The default value is: NO. + +SORT_BRIEF_DOCS = YES + +# If the SORT_MEMBERS_CTORS_1ST tag is set to YES then doxygen will sort the +# (brief and detailed) documentation of class members so that constructors and +# destructors are listed first. If set to NO the constructors will appear in the +# respective orders defined by SORT_BRIEF_DOCS and SORT_MEMBER_DOCS. +# Note: If SORT_BRIEF_DOCS is set to NO this option is ignored for sorting brief +# member documentation. +# Note: If SORT_MEMBER_DOCS is set to NO this option is ignored for sorting +# detailed member documentation. +# The default value is: NO. + +SORT_MEMBERS_CTORS_1ST = YES + +# If the SORT_GROUP_NAMES tag is set to YES then doxygen will sort the hierarchy +# of group names into alphabetical order. If set to NO the group names will +# appear in their defined order. +# The default value is: NO. + +SORT_GROUP_NAMES = YES + +# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be sorted by +# fully-qualified names, including namespaces. If set to NO, the class list will +# be sorted only by class name, not including the namespace part. +# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES. +# Note: This option applies only to the class list, not to the alphabetical +# list. +# The default value is: NO. + +SORT_BY_SCOPE_NAME = YES + +# If the STRICT_PROTO_MATCHING option is enabled and doxygen fails to do proper +# type resolution of all parameters of a function it will reject a match between +# the prototype and the implementation of a member function even if there is +# only one candidate or it is obvious which candidate to choose by doing a +# simple string match. By disabling STRICT_PROTO_MATCHING doxygen will still +# accept a match between prototype and implementation in such cases. +# The default value is: NO. + +STRICT_PROTO_MATCHING = NO + +# The GENERATE_TODOLIST tag can be used to enable ( YES) or disable ( NO) the +# todo list. This list is created by putting \todo commands in the +# documentation. +# The default value is: YES. + +GENERATE_TODOLIST = YES + +# The GENERATE_TESTLIST tag can be used to enable ( YES) or disable ( NO) the +# test list. This list is created by putting \test commands in the +# documentation. +# The default value is: YES. + +GENERATE_TESTLIST = YES + +# The GENERATE_BUGLIST tag can be used to enable ( YES) or disable ( NO) the bug +# list. This list is created by putting \bug commands in the documentation. +# The default value is: YES. + +GENERATE_BUGLIST = YES + +# The GENERATE_DEPRECATEDLIST tag can be used to enable ( YES) or disable ( NO) +# the deprecated list. This list is created by putting \deprecated commands in +# the documentation. +# The default value is: YES. + +GENERATE_DEPRECATEDLIST= YES + +# The ENABLED_SECTIONS tag can be used to enable conditional documentation +# sections, marked by \if ... \endif and \cond +# ... \endcond blocks. + +ENABLED_SECTIONS = + +# The MAX_INITIALIZER_LINES tag determines the maximum number of lines that the +# initial value of a variable or macro / define can have for it to appear in the +# documentation. If the initializer consists of more lines than specified here +# it will be hidden. Use a value of 0 to hide initializers completely. The +# appearance of the value of individual variables and macros / defines can be +# controlled using \showinitializer or \hideinitializer command in the +# documentation regardless of this setting. +# Minimum value: 0, maximum value: 10000, default value: 30. + +MAX_INITIALIZER_LINES = 30 + +# Set the SHOW_USED_FILES tag to NO to disable the list of files generated at +# the bottom of the documentation of classes and structs. If set to YES the list +# will mention the files that were used to generate the documentation. +# The default value is: YES. + +SHOW_USED_FILES = YES + +# Set the SHOW_FILES tag to NO to disable the generation of the Files page. This +# will remove the Files entry from the Quick Index and from the Folder Tree View +# (if specified). +# The default value is: YES. + +SHOW_FILES = YES + +# Set the SHOW_NAMESPACES tag to NO to disable the generation of the Namespaces +# page. This will remove the Namespaces entry from the Quick Index and from the +# Folder Tree View (if specified). +# The default value is: YES. + +SHOW_NAMESPACES = YES + +# The FILE_VERSION_FILTER tag can be used to specify a program or script that +# doxygen should invoke to get the current version for each file (typically from +# the version control system). Doxygen will invoke the program by executing (via +# popen()) the command command input-file, where command is the value of the +# FILE_VERSION_FILTER tag, and input-file is the name of an input file provided +# by doxygen. Whatever the program writes to standard output is used as the file +# version. For an example see the documentation. + +FILE_VERSION_FILTER = + +# The LAYOUT_FILE tag can be used to specify a layout file which will be parsed +# by doxygen. The layout file controls the global structure of the generated +# output files in an output format independent way. To create the layout file +# that represents doxygen's defaults, run doxygen with the -l option. You can +# optionally specify a file name after the option, if omitted DoxygenLayout.xml +# will be used as the name of the layout file. +# +# Note that if you run doxygen from a directory containing a file called +# DoxygenLayout.xml, doxygen will parse it automatically even if the LAYOUT_FILE +# tag is left empty. + +LAYOUT_FILE = DoxygenLayout.xml + +# The CITE_BIB_FILES tag can be used to specify one or more bib files containing +# the reference definitions. This must be a list of .bib files. The .bib +# extension is automatically appended if omitted. This requires the bibtex tool +# to be installed. See also http://en.wikipedia.org/wiki/BibTeX for more info. +# For LaTeX the style of the bibliography can be controlled using +# LATEX_BIB_STYLE. To use this feature you need bibtex and perl available in the +# search path. Do not use file names with spaces, bibtex cannot handle them. See +# also \cite for info how to create references. + +CITE_BIB_FILES = + +#--------------------------------------------------------------------------- +# Configuration options related to warning and progress messages +#--------------------------------------------------------------------------- + +# The QUIET tag can be used to turn on/off the messages that are generated to +# standard output by doxygen. If QUIET is set to YES this implies that the +# messages are off. +# The default value is: NO. + +QUIET = NO + +# The WARNINGS tag can be used to turn on/off the warning messages that are +# generated to standard error ( stderr) by doxygen. If WARNINGS is set to YES +# this implies that the warnings are on. +# +# Tip: Turn warnings on while writing the documentation. +# The default value is: YES. + +WARNINGS = YES + +# If the WARN_IF_UNDOCUMENTED tag is set to YES, then doxygen will generate +# warnings for undocumented members. If EXTRACT_ALL is set to YES then this flag +# will automatically be disabled. +# The default value is: YES. + +WARN_IF_UNDOCUMENTED = YES + +# If the WARN_IF_DOC_ERROR tag is set to YES, doxygen will generate warnings for +# potential errors in the documentation, such as not documenting some parameters +# in a documented function, or documenting parameters that don't exist or using +# markup commands wrongly. +# The default value is: YES. + +WARN_IF_DOC_ERROR = YES + +# This WARN_NO_PARAMDOC option can be enabled to get warnings for functions that +# are documented, but have no documentation for their parameters or return +# value. If set to NO doxygen will only warn about wrong or incomplete parameter +# documentation, but not about the absence of documentation. +# The default value is: NO. + +WARN_NO_PARAMDOC = YES + +# The WARN_FORMAT tag determines the format of the warning messages that doxygen +# can produce. The string should contain the $file, $line, and $text tags, which +# will be replaced by the file and line number from which the warning originated +# and the warning text. Optionally the format may contain $version, which will +# be replaced by the version of the file (if it could be obtained via +# FILE_VERSION_FILTER) +# The default value is: $file:$line: $text. + +WARN_FORMAT = "$file:$line: $text" + +# The WARN_LOGFILE tag can be used to specify a file to which warning and error +# messages should be written. If left blank the output is written to standard +# error (stderr). + +WARN_LOGFILE = + +#--------------------------------------------------------------------------- +# Configuration options related to the input files +#--------------------------------------------------------------------------- + +# The INPUT tag is used to specify the files and/or directories that contain +# documented source files. You may enter file names like myfile.cpp or +# directories like /usr/src/myproject. Separate the files or directories with +# spaces. +# Note: If this tag is empty the current directory is searched. + +INPUT = + +# This tag can be used to specify the character encoding of the source files +# that doxygen parses. Internally doxygen uses the UTF-8 encoding. Doxygen uses +# libiconv (or the iconv built into libc) for the transcoding. See the libiconv +# documentation (see: http://www.gnu.org/software/libiconv) for the list of +# possible encodings. +# The default value is: UTF-8. + +INPUT_ENCODING = UTF-8 + +# If the value of the INPUT tag contains directories, you can use the +# FILE_PATTERNS tag to specify one or more wildcard patterns (like *.cpp and +# *.h) to filter out the source-files in the directories. If left blank the +# following patterns are tested:*.c, *.cc, *.cxx, *.cpp, *.c++, *.java, *.ii, +# *.ixx, *.ipp, *.i++, *.inl, *.idl, *.ddl, *.odl, *.h, *.hh, *.hxx, *.hpp, +# *.h++, *.cs, *.d, *.php, *.php4, *.php5, *.phtml, *.inc, *.m, *.markdown, +# *.md, *.mm, *.dox, *.py, *.f90, *.f, *.for, *.tcl, *.vhd, *.vhdl, *.ucf, +# *.qsf, *.as and *.js. + +FILE_PATTERNS = *.c *.h *.dox + +# The RECURSIVE tag can be used to specify whether or not subdirectories should +# be searched for input files as well. +# The default value is: NO. + +RECURSIVE = YES + +# The EXCLUDE tag can be used to specify files and/or directories that should be +# excluded from the INPUT source files. This way you can easily exclude a +# subdirectory from a directory tree whose root is specified with the INPUT tag. +# +# Note that relative paths are relative to the directory from which doxygen is +# run. + +EXCLUDE = + +# The EXCLUDE_SYMLINKS tag can be used to select whether or not files or +# directories that are symbolic links (a Unix file system feature) are excluded +# from the input. +# The default value is: NO. + +EXCLUDE_SYMLINKS = NO + +# If the value of the INPUT tag contains directories, you can use the +# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude +# certain files from those directories. +# +# Note that the wildcards are matched against the file with absolute path, so to +# exclude all test directories for example use the pattern */test/* + +EXCLUDE_PATTERNS = + +# The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names +# (namespaces, classes, functions, etc.) that should be excluded from the +# output. The symbol name can be a fully qualified name, a word, or if the +# wildcard * is used, a substring. Examples: ANamespace, AClass, +# AClass::ANamespace, ANamespace::*Test +# +# Note that the wildcards are matched against the file with absolute path, so to +# exclude all test directories use the pattern */test/* + +EXCLUDE_SYMBOLS = + +# The EXAMPLE_PATH tag can be used to specify one or more files or directories +# that contain example code fragments that are included (see the \include +# command). + +EXAMPLE_PATH = + +# If the value of the EXAMPLE_PATH tag contains directories, you can use the +# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp and +# *.h) to filter out the source-files in the directories. If left blank all +# files are included. + +EXAMPLE_PATTERNS = + +# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be +# searched for input files to be used with the \include or \dontinclude commands +# irrespective of the value of the RECURSIVE tag. +# The default value is: NO. + +EXAMPLE_RECURSIVE = NO + +# The IMAGE_PATH tag can be used to specify one or more files or directories +# that contain images that are to be included in the documentation (see the +# \image command). + +IMAGE_PATH = ${CMAKE_CURRENT_SOURCE_DIR} + +# The INPUT_FILTER tag can be used to specify a program that doxygen should +# invoke to filter for each input file. Doxygen will invoke the filter program +# by executing (via popen()) the command: +# +# +# +# where is the value of the INPUT_FILTER tag, and is the +# name of an input file. Doxygen will then use the output that the filter +# program writes to standard output. If FILTER_PATTERNS is specified, this tag +# will be ignored. +# +# Note that the filter must not add or remove lines; it is applied before the +# code is scanned, but not when the output code is generated. If lines are added +# or removed, the anchors will not be placed correctly. + +INPUT_FILTER = + +# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern +# basis. Doxygen will compare the file name with each pattern and apply the +# filter if there is a match. The filters are a list of the form: pattern=filter +# (like *.cpp=my_cpp_filter). See INPUT_FILTER for further information on how +# filters are used. If the FILTER_PATTERNS tag is empty or if none of the +# patterns match the file name, INPUT_FILTER is applied. + +FILTER_PATTERNS = + +# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using +# INPUT_FILTER ) will also be used to filter the input files that are used for +# producing the source files to browse (i.e. when SOURCE_BROWSER is set to YES). +# The default value is: NO. + +FILTER_SOURCE_FILES = NO + +# The FILTER_SOURCE_PATTERNS tag can be used to specify source filters per file +# pattern. A pattern will override the setting for FILTER_PATTERN (if any) and +# it is also possible to disable source filtering for a specific pattern using +# *.ext= (so without naming a filter). +# This tag requires that the tag FILTER_SOURCE_FILES is set to YES. + +FILTER_SOURCE_PATTERNS = + +# If the USE_MDFILE_AS_MAINPAGE tag refers to the name of a markdown file that +# is part of the input, its contents will be placed on the main page +# (index.html). This can be useful if you have a project on for instance GitHub +# and want to reuse the introduction page also for the doxygen output. + +USE_MDFILE_AS_MAINPAGE = + +#--------------------------------------------------------------------------- +# Configuration options related to source browsing +#--------------------------------------------------------------------------- + +# If the SOURCE_BROWSER tag is set to YES then a list of source files will be +# generated. Documented entities will be cross-referenced with these sources. +# +# Note: To get rid of all source code in the generated output, make sure that +# also VERBATIM_HEADERS is set to NO. +# The default value is: NO. + +SOURCE_BROWSER = NO + +# Setting the INLINE_SOURCES tag to YES will include the body of functions, +# classes and enums directly into the documentation. +# The default value is: NO. + +INLINE_SOURCES = NO + +# Setting the STRIP_CODE_COMMENTS tag to YES will instruct doxygen to hide any +# special comment blocks from generated source code fragments. Normal C, C++ and +# Fortran comments will always remain visible. +# The default value is: YES. + +STRIP_CODE_COMMENTS = YES + +# If the REFERENCED_BY_RELATION tag is set to YES then for each documented +# function all documented functions referencing it will be listed. +# The default value is: NO. + +REFERENCED_BY_RELATION = NO + +# If the REFERENCES_RELATION tag is set to YES then for each documented function +# all documented entities called/used by that function will be listed. +# The default value is: NO. + +REFERENCES_RELATION = NO + +# If the REFERENCES_LINK_SOURCE tag is set to YES and SOURCE_BROWSER tag is set +# to YES, then the hyperlinks from functions in REFERENCES_RELATION and +# REFERENCED_BY_RELATION lists will link to the source code. Otherwise they will +# link to the documentation. +# The default value is: YES. + +REFERENCES_LINK_SOURCE = NO + +# If SOURCE_TOOLTIPS is enabled (the default) then hovering a hyperlink in the +# source code will show a tooltip with additional information such as prototype, +# brief description and links to the definition and documentation. Since this +# will make the HTML file larger and loading of large files a bit slower, you +# can opt to disable this feature. +# The default value is: YES. +# This tag requires that the tag SOURCE_BROWSER is set to YES. + +SOURCE_TOOLTIPS = YES + +# If the USE_HTAGS tag is set to YES then the references to source code will +# point to the HTML generated by the htags(1) tool instead of doxygen built-in +# source browser. The htags tool is part of GNU's global source tagging system +# (see http://www.gnu.org/software/global/global.html). You will need version +# 4.8.6 or higher. +# +# To use it do the following: +# - Install the latest version of global +# - Enable SOURCE_BROWSER and USE_HTAGS in the config file +# - Make sure the INPUT points to the root of the source tree +# - Run doxygen as normal +# +# Doxygen will invoke htags (and that will in turn invoke gtags), so these +# tools must be available from the command line (i.e. in the search path). +# +# The result: instead of the source browser generated by doxygen, the links to +# source code will now point to the output of htags. +# The default value is: NO. +# This tag requires that the tag SOURCE_BROWSER is set to YES. + +USE_HTAGS = NO + +# If the VERBATIM_HEADERS tag is set the YES then doxygen will generate a +# verbatim copy of the header file for each class for which an include is +# specified. Set to NO to disable this. +# See also: Section \class. +# The default value is: YES. + +VERBATIM_HEADERS = NO + +#--------------------------------------------------------------------------- +# Configuration options related to the alphabetical class index +#--------------------------------------------------------------------------- + +# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index of all +# compounds will be generated. Enable this if the project contains a lot of +# classes, structs, unions or interfaces. +# The default value is: YES. + +ALPHABETICAL_INDEX = YES + +# The COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns in +# which the alphabetical index list will be split. +# Minimum value: 1, maximum value: 20, default value: 5. +# This tag requires that the tag ALPHABETICAL_INDEX is set to YES. + +COLS_IN_ALPHA_INDEX = 1 + +# In case all classes in a project start with a common prefix, all classes will +# be put under the same header in the alphabetical index. The IGNORE_PREFIX tag +# can be used to specify a prefix (or a list of prefixes) that should be ignored +# while generating the index headers. +# This tag requires that the tag ALPHABETICAL_INDEX is set to YES. + +IGNORE_PREFIX = + +#--------------------------------------------------------------------------- +# Configuration options related to the HTML output +#--------------------------------------------------------------------------- + +# If the GENERATE_HTML tag is set to YES doxygen will generate HTML output +# The default value is: YES. + +GENERATE_HTML = YES + +# The HTML_OUTPUT tag is used to specify where the HTML docs will be put. If a +# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of +# it. +# The default directory is: html. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_OUTPUT = html + +# The HTML_FILE_EXTENSION tag can be used to specify the file extension for each +# generated HTML page (for example: .htm, .php, .asp). +# The default value is: .html. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_FILE_EXTENSION = .html + +# The HTML_HEADER tag can be used to specify a user-defined HTML header file for +# each generated HTML page. If the tag is left blank doxygen will generate a +# standard header. +# +# To get valid HTML the header file that includes any scripts and style sheets +# that doxygen needs, which is dependent on the configuration options used (e.g. +# the setting GENERATE_TREEVIEW). It is highly recommended to start with a +# default header using +# doxygen -w html new_header.html new_footer.html new_stylesheet.css +# YourConfigFile +# and then modify the file new_header.html. See also section "Doxygen usage" +# for information on how to generate the default header that doxygen normally +# uses. +# Note: The header is subject to change so you typically have to regenerate the +# default header when upgrading to a newer version of doxygen. For a description +# of the possible markers and block names see the documentation. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_HEADER = + +# The HTML_FOOTER tag can be used to specify a user-defined HTML footer for each +# generated HTML page. If the tag is left blank doxygen will generate a standard +# footer. See HTML_HEADER for more information on how to generate a default +# footer and what special commands can be used inside the footer. See also +# section "Doxygen usage" for information on how to generate the default footer +# that doxygen normally uses. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_FOOTER = + +# The HTML_STYLESHEET tag can be used to specify a user-defined cascading style +# sheet that is used by each HTML page. It can be used to fine-tune the look of +# the HTML output. If left blank doxygen will generate a default style sheet. +# See also section "Doxygen usage" for information on how to generate the style +# sheet that doxygen normally uses. +# Note: It is recommended to use HTML_EXTRA_STYLESHEET instead of this tag, as +# it is more robust and this tag (HTML_STYLESHEET) will in the future become +# obsolete. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_STYLESHEET = + +# The HTML_EXTRA_STYLESHEET tag can be used to specify an additional user- +# defined cascading style sheet that is included after the standard style sheets +# created by doxygen. Using this option one can overrule certain style aspects. +# This is preferred over using HTML_STYLESHEET since it does not replace the +# standard style sheet and is therefor more robust against future updates. +# Doxygen will copy the style sheet file to the output directory. For an example +# see the documentation. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_EXTRA_STYLESHEET = + +# The HTML_EXTRA_FILES tag can be used to specify one or more extra images or +# other source files which should be copied to the HTML output directory. Note +# that these files will be copied to the base HTML output directory. Use the +# $relpath^ marker in the HTML_HEADER and/or HTML_FOOTER files to load these +# files. In the HTML_STYLESHEET file, use the file name only. Also note that the +# files will be copied as-is; there are no commands or markers available. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_EXTRA_FILES = + +# The HTML_COLORSTYLE_HUE tag controls the color of the HTML output. Doxygen +# will adjust the colors in the stylesheet and background images according to +# this color. Hue is specified as an angle on a colorwheel, see +# http://en.wikipedia.org/wiki/Hue for more information. For instance the value +# 0 represents red, 60 is yellow, 120 is green, 180 is cyan, 240 is blue, 300 +# purple, and 360 is red again. +# Minimum value: 0, maximum value: 359, default value: 220. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_COLORSTYLE_HUE = 118 + +# The HTML_COLORSTYLE_SAT tag controls the purity (or saturation) of the colors +# in the HTML output. For a value of 0 the output will use grayscales only. A +# value of 255 will produce the most vivid colors. +# Minimum value: 0, maximum value: 255, default value: 100. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_COLORSTYLE_SAT = 100 + +# The HTML_COLORSTYLE_GAMMA tag controls the gamma correction applied to the +# luminance component of the colors in the HTML output. Values below 100 +# gradually make the output lighter, whereas values above 100 make the output +# darker. The value divided by 100 is the actual gamma applied, so 80 represents +# a gamma of 0.8, The value 220 represents a gamma of 2.2, and 100 does not +# change the gamma. +# Minimum value: 40, maximum value: 240, default value: 80. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_COLORSTYLE_GAMMA = 240 + +# If the HTML_TIMESTAMP tag is set to YES then the footer of each generated HTML +# page will contain the date and time when the page was generated. Setting this +# to NO can help when comparing the output of multiple runs. +# The default value is: YES. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_TIMESTAMP = YES + +# If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML +# documentation will contain sections that can be hidden and shown after the +# page has loaded. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_DYNAMIC_SECTIONS = NO + +# With HTML_INDEX_NUM_ENTRIES one can control the preferred number of entries +# shown in the various tree structured indices initially; the user can expand +# and collapse entries dynamically later on. Doxygen will expand the tree to +# such a level that at most the specified number of entries are visible (unless +# a fully collapsed tree already exceeds this amount). So setting the number of +# entries 1 will produce a full collapsed tree by default. 0 is a special value +# representing an infinite number of entries and will result in a full expanded +# tree by default. +# Minimum value: 0, maximum value: 9999, default value: 100. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_INDEX_NUM_ENTRIES = 0 + +# If the GENERATE_DOCSET tag is set to YES, additional index files will be +# generated that can be used as input for Apple's Xcode 3 integrated development +# environment (see: http://developer.apple.com/tools/xcode/), introduced with +# OSX 10.5 (Leopard). To create a documentation set, doxygen will generate a +# Makefile in the HTML output directory. Running make will produce the docset in +# that directory and running make install will install the docset in +# ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find it at +# startup. See http://developer.apple.com/tools/creatingdocsetswithdoxygen.html +# for more information. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +GENERATE_DOCSET = NO + +# This tag determines the name of the docset feed. A documentation feed provides +# an umbrella under which multiple documentation sets from a single provider +# (such as a company or product suite) can be grouped. +# The default value is: Doxygen generated docs. +# This tag requires that the tag GENERATE_DOCSET is set to YES. + +DOCSET_FEEDNAME = "Doxygen generated docs" + +# This tag specifies a string that should uniquely identify the documentation +# set bundle. This should be a reverse domain-name style string, e.g. +# com.mycompany.MyDocSet. Doxygen will append .docset to the name. +# The default value is: org.doxygen.Project. +# This tag requires that the tag GENERATE_DOCSET is set to YES. + +DOCSET_BUNDLE_ID = org.doxygen.Project + +# The DOCSET_PUBLISHER_ID tag specifies a string that should uniquely identify +# the documentation publisher. This should be a reverse domain-name style +# string, e.g. com.mycompany.MyDocSet.documentation. +# The default value is: org.doxygen.Publisher. +# This tag requires that the tag GENERATE_DOCSET is set to YES. + +DOCSET_PUBLISHER_ID = org.doxygen.Publisher + +# The DOCSET_PUBLISHER_NAME tag identifies the documentation publisher. +# The default value is: Publisher. +# This tag requires that the tag GENERATE_DOCSET is set to YES. + +DOCSET_PUBLISHER_NAME = Publisher + +# If the GENERATE_HTMLHELP tag is set to YES then doxygen generates three +# additional HTML index files: index.hhp, index.hhc, and index.hhk. The +# index.hhp is a project file that can be read by Microsoft's HTML Help Workshop +# (see: http://www.microsoft.com/en-us/download/details.aspx?id=21138) on +# Windows. +# +# The HTML Help Workshop contains a compiler that can convert all HTML output +# generated by doxygen into a single compiled HTML file (.chm). Compiled HTML +# files are now used as the Windows 98 help format, and will replace the old +# Windows help format (.hlp) on all Windows platforms in the future. Compressed +# HTML files also contain an index, a table of contents, and you can search for +# words in the documentation. The HTML workshop also contains a viewer for +# compressed HTML files. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +GENERATE_HTMLHELP = NO + +# The CHM_FILE tag can be used to specify the file name of the resulting .chm +# file. You can add a path in front of the file if the result should not be +# written to the html output directory. +# This tag requires that the tag GENERATE_HTMLHELP is set to YES. + +CHM_FILE = + +# The HHC_LOCATION tag can be used to specify the location (absolute path +# including file name) of the HTML help compiler ( hhc.exe). If non-empty +# doxygen will try to run the HTML help compiler on the generated index.hhp. +# The file has to be specified with full path. +# This tag requires that the tag GENERATE_HTMLHELP is set to YES. + +HHC_LOCATION = + +# The GENERATE_CHI flag controls if a separate .chi index file is generated ( +# YES) or that it should be included in the master .chm file ( NO). +# The default value is: NO. +# This tag requires that the tag GENERATE_HTMLHELP is set to YES. + +GENERATE_CHI = NO + +# The CHM_INDEX_ENCODING is used to encode HtmlHelp index ( hhk), content ( hhc) +# and project file content. +# This tag requires that the tag GENERATE_HTMLHELP is set to YES. + +CHM_INDEX_ENCODING = + +# The BINARY_TOC flag controls whether a binary table of contents is generated ( +# YES) or a normal table of contents ( NO) in the .chm file. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTMLHELP is set to YES. + +BINARY_TOC = NO + +# The TOC_EXPAND flag can be set to YES to add extra items for group members to +# the table of contents of the HTML help documentation and to the tree view. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTMLHELP is set to YES. + +TOC_EXPAND = YES + +# If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and +# QHP_VIRTUAL_FOLDER are set, an additional index file will be generated that +# can be used as input for Qt's qhelpgenerator to generate a Qt Compressed Help +# (.qch) of the generated HTML documentation. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +GENERATE_QHP = NO + +# If the QHG_LOCATION tag is specified, the QCH_FILE tag can be used to specify +# the file name of the resulting .qch file. The path specified is relative to +# the HTML output folder. +# This tag requires that the tag GENERATE_QHP is set to YES. + +QCH_FILE = + +# The QHP_NAMESPACE tag specifies the namespace to use when generating Qt Help +# Project output. For more information please see Qt Help Project / Namespace +# (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#namespace). +# The default value is: org.doxygen.Project. +# This tag requires that the tag GENERATE_QHP is set to YES. + +QHP_NAMESPACE = org.doxygen.Project + +# The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating Qt +# Help Project output. For more information please see Qt Help Project / Virtual +# Folders (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#virtual- +# folders). +# The default value is: doc. +# This tag requires that the tag GENERATE_QHP is set to YES. + +QHP_VIRTUAL_FOLDER = doc + +# If the QHP_CUST_FILTER_NAME tag is set, it specifies the name of a custom +# filter to add. For more information please see Qt Help Project / Custom +# Filters (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#custom- +# filters). +# This tag requires that the tag GENERATE_QHP is set to YES. + +QHP_CUST_FILTER_NAME = + +# The QHP_CUST_FILTER_ATTRS tag specifies the list of the attributes of the +# custom filter to add. For more information please see Qt Help Project / Custom +# Filters (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#custom- +# filters). +# This tag requires that the tag GENERATE_QHP is set to YES. + +QHP_CUST_FILTER_ATTRS = + +# The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this +# project's filter section matches. Qt Help Project / Filter Attributes (see: +# http://qt-project.org/doc/qt-4.8/qthelpproject.html#filter-attributes). +# This tag requires that the tag GENERATE_QHP is set to YES. + +QHP_SECT_FILTER_ATTRS = + +# The QHG_LOCATION tag can be used to specify the location of Qt's +# qhelpgenerator. If non-empty doxygen will try to run qhelpgenerator on the +# generated .qhp file. +# This tag requires that the tag GENERATE_QHP is set to YES. + +QHG_LOCATION = + +# If the GENERATE_ECLIPSEHELP tag is set to YES, additional index files will be +# generated, together with the HTML files, they form an Eclipse help plugin. To +# install this plugin and make it available under the help contents menu in +# Eclipse, the contents of the directory containing the HTML and XML files needs +# to be copied into the plugins directory of eclipse. The name of the directory +# within the plugins directory should be the same as the ECLIPSE_DOC_ID value. +# After copying Eclipse needs to be restarted before the help appears. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +GENERATE_ECLIPSEHELP = NO + +# A unique identifier for the Eclipse help plugin. When installing the plugin +# the directory name containing the HTML and XML files should also have this +# name. Each documentation set should have its own identifier. +# The default value is: org.doxygen.Project. +# This tag requires that the tag GENERATE_ECLIPSEHELP is set to YES. + +ECLIPSE_DOC_ID = org.doxygen.Project + +# If you want full control over the layout of the generated HTML pages it might +# be necessary to disable the index and replace it with your own. The +# DISABLE_INDEX tag can be used to turn on/off the condensed index (tabs) at top +# of each HTML page. A value of NO enables the index and the value YES disables +# it. Since the tabs in the index contain the same information as the navigation +# tree, you can set this option to YES if you also set GENERATE_TREEVIEW to YES. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +DISABLE_INDEX = NO + +# The GENERATE_TREEVIEW tag is used to specify whether a tree-like index +# structure should be generated to display hierarchical information. If the tag +# value is set to YES, a side panel will be generated containing a tree-like +# index structure (just like the one that is generated for HTML Help). For this +# to work a browser that supports JavaScript, DHTML, CSS and frames is required +# (i.e. any modern browser). Windows users are probably better off using the +# HTML help feature. Via custom stylesheets (see HTML_EXTRA_STYLESHEET) one can +# further fine-tune the look of the index. As an example, the default style +# sheet generated by doxygen has an example that shows how to put an image at +# the root of the tree instead of the PROJECT_NAME. Since the tree basically has +# the same information as the tab index, you could consider setting +# DISABLE_INDEX to YES when enabling this option. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +GENERATE_TREEVIEW = NO + +# The ENUM_VALUES_PER_LINE tag can be used to set the number of enum values that +# doxygen will group on one line in the generated HTML documentation. +# +# Note that a value of 0 will completely suppress the enum values from appearing +# in the overview section. +# Minimum value: 0, maximum value: 20, default value: 4. +# This tag requires that the tag GENERATE_HTML is set to YES. + +ENUM_VALUES_PER_LINE = 1 + +# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be used +# to set the initial width (in pixels) of the frame in which the tree is shown. +# Minimum value: 0, maximum value: 1500, default value: 250. +# This tag requires that the tag GENERATE_HTML is set to YES. + +TREEVIEW_WIDTH = 250 + +# When the EXT_LINKS_IN_WINDOW option is set to YES doxygen will open links to +# external symbols imported via tag files in a separate window. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +EXT_LINKS_IN_WINDOW = NO + +# Use this tag to change the font size of LaTeX formulas included as images in +# the HTML documentation. When you change the font size after a successful +# doxygen run you need to manually remove any form_*.png images from the HTML +# output directory to force them to be regenerated. +# Minimum value: 8, maximum value: 50, default value: 10. +# This tag requires that the tag GENERATE_HTML is set to YES. + +FORMULA_FONTSIZE = 10 + +# Use the FORMULA_TRANPARENT tag to determine whether or not the images +# generated for formulas are transparent PNGs. Transparent PNGs are not +# supported properly for IE 6.0, but are supported on all modern browsers. +# +# Note that when changing this option you need to delete any form_*.png files in +# the HTML output directory before the changes have effect. +# The default value is: YES. +# This tag requires that the tag GENERATE_HTML is set to YES. + +FORMULA_TRANSPARENT = YES + +# Enable the USE_MATHJAX option to render LaTeX formulas using MathJax (see +# http://www.mathjax.org) which uses client side Javascript for the rendering +# instead of using prerendered bitmaps. Use this if you do not have LaTeX +# installed or if you want to formulas look prettier in the HTML output. When +# enabled you may also need to install MathJax separately and configure the path +# to it using the MATHJAX_RELPATH option. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +USE_MATHJAX = NO + +# When MathJax is enabled you can set the default output format to be used for +# the MathJax output. See the MathJax site (see: +# http://docs.mathjax.org/en/latest/output.html) for more details. +# Possible values are: HTML-CSS (which is slower, but has the best +# compatibility), NativeMML (i.e. MathML) and SVG. +# The default value is: HTML-CSS. +# This tag requires that the tag USE_MATHJAX is set to YES. + +MATHJAX_FORMAT = HTML-CSS + +# When MathJax is enabled you need to specify the location relative to the HTML +# output directory using the MATHJAX_RELPATH option. The destination directory +# should contain the MathJax.js script. For instance, if the mathjax directory +# is located at the same level as the HTML output directory, then +# MATHJAX_RELPATH should be ../mathjax. The default value points to the MathJax +# Content Delivery Network so you can quickly see the result without installing +# MathJax. However, it is strongly recommended to install a local copy of +# MathJax from http://www.mathjax.org before deployment. +# The default value is: http://cdn.mathjax.org/mathjax/latest. +# This tag requires that the tag USE_MATHJAX is set to YES. + +MATHJAX_RELPATH = http://cdn.mathjax.org/mathjax/latest + +# The MATHJAX_EXTENSIONS tag can be used to specify one or more MathJax +# extension names that should be enabled during MathJax rendering. For example +# MATHJAX_EXTENSIONS = TeX/AMSmath TeX/AMSsymbols +# This tag requires that the tag USE_MATHJAX is set to YES. + +MATHJAX_EXTENSIONS = + +# The MATHJAX_CODEFILE tag can be used to specify a file with javascript pieces +# of code that will be used on startup of the MathJax code. See the MathJax site +# (see: http://docs.mathjax.org/en/latest/output.html) for more details. For an +# example see the documentation. +# This tag requires that the tag USE_MATHJAX is set to YES. + +MATHJAX_CODEFILE = + +# When the SEARCHENGINE tag is enabled doxygen will generate a search box for +# the HTML output. The underlying search engine uses javascript and DHTML and +# should work on any modern browser. Note that when using HTML help +# (GENERATE_HTMLHELP), Qt help (GENERATE_QHP), or docsets (GENERATE_DOCSET) +# there is already a search function so this one should typically be disabled. +# For large projects the javascript based search engine can be slow, then +# enabling SERVER_BASED_SEARCH may provide a better solution. It is possible to +# search using the keyboard; to jump to the search box use + S +# (what the is depends on the OS and browser, but it is typically +# , /Documentation + + */ + +/** +@page Downloads Downloads + +You can retrieve the source to ENet by downloading it in either .tar.gz form +or accessing the github distribution directly. + +The most recent stable release (1.3.18) can be downloaded here. +The last release that is protocol compatible with the 1.2 series or earlier (1.2.5) can be downloaded here. + +You can find the most recent ENet source at the github repository. + +*/ + +/** +@page MailingList Mailing List + +The enet-discuss list is for discussion of ENet, including bug reports or feature requests. + +*/ + +/** +@page IRCChannel IRC Channel + +Join the \#enet channel on the Libera Chat IRC network (irc.libera.chat) for real-time discussion about the ENet library. + +*/ + diff --git a/thirdparty/enet/docs/tutorial.dox b/thirdparty/enet/docs/tutorial.dox new file mode 100644 index 0000000..19a7a45 --- /dev/null +++ b/thirdparty/enet/docs/tutorial.dox @@ -0,0 +1,366 @@ +/** +@page Tutorial Tutorial + +@ref Initialization + +@ref CreateServer + +@ref CreateClient + +@ref ManageHost + +@ref SendingPacket + +@ref Disconnecting + +@ref Connecting + +@section Initialization Initialization + +You should include the file when using ENet. Do not +include without the directory prefix, as this may cause +file name conflicts on some systems. + +Before using ENet, you must call enet_initialize() to initialize the +library. Upon program exit, you should call enet_deinitialize() so +that the library may clean up any used resources. + +@code +#include + +int +main (int argc, char ** argv) +{ + if (enet_initialize () != 0) + { + fprintf (stderr, "An error occurred while initializing ENet.\n"); + return EXIT_FAILURE; + } + atexit (enet_deinitialize); + ... + ... + ... +} +@endcode + +@section CreateServer Creating an ENet server + +Servers in ENet are constructed with enet_host_create(). You must +specify an address on which to receive data and new connections, as +well as the maximum allowable numbers of connected peers. You may +optionally specify the incoming and outgoing bandwidth of the server +in bytes per second so that ENet may try to statically manage +bandwidth resources among connected peers in addition to its dynamic +throttling algorithm; specifying 0 for these two options will cause +ENet to rely entirely upon its dynamic throttling algorithm to manage +bandwidth. + +When done with a host, the host may be destroyed with +enet_host_destroy(). All connected peers to the host will be reset, +and the resources used by the host will be freed. + +@code + ENetAddress address; + ENetHost * server; + + /* Bind the server to the default localhost. */ + /* A specific host address can be specified by */ + /* enet_address_set_host (& address, "x.x.x.x"); */ + + address.host = ENET_HOST_ANY; + /* Bind the server to port 1234. */ + address.port = 1234; + + server = enet_host_create (& address /* the address to bind the server host to */, + 32 /* allow up to 32 clients and/or outgoing connections */, + 2 /* allow up to 2 channels to be used, 0 and 1 */, + 0 /* assume any amount of incoming bandwidth */, + 0 /* assume any amount of outgoing bandwidth */); + if (server == NULL) + { + fprintf (stderr, + "An error occurred while trying to create an ENet server host.\n"); + exit (EXIT_FAILURE); + } + ... + ... + ... + enet_host_destroy(server); +@endcode + +@section CreateClient Creating an ENet client + +Clients in ENet are similarly constructed with enet_host_create() when +no address is specified to bind the host to. Bandwidth may be +specified for the client host as in the above example. The peer count +controls the maximum number of connections to other server hosts that +may be simultaneously open. + +@code + ENetHost * client; + + client = enet_host_create (NULL /* create a client host */, + 1 /* only allow 1 outgoing connection */, + 2 /* allow up 2 channels to be used, 0 and 1 */, + 0 /* assume any amount of incoming bandwidth */, + 0 /* assume any amount of outgoing bandwidth */); + + if (client == NULL) + { + fprintf (stderr, + "An error occurred while trying to create an ENet client host.\n"); + exit (EXIT_FAILURE); + } + ... + ... + ... + enet_host_destroy(client); +@endcode + +@section ManageHost Managing an ENet host + +ENet uses a polled event model to notify the programmer of significant +events. ENet hosts are polled for events with enet_host_service(), +where an optional timeout value in milliseconds may be specified to +control how long ENet will poll; if a timeout of 0 is specified, +enet_host_service() will return immediately if there are no events to +dispatch. enet_host_service() will return 1 if an event was dispatched +within the specified timeout. + +Beware that most processing of the network with the ENet stack is done +inside enet_host_service(). Both hosts that make up the sides of a connection +must regularly call this function to ensure packets are actually sent and +received. A common symptom of not actively calling enet_host_service() +on both ends is that one side receives events while the other does not. +The best way to schedule this activity to ensure adequate service is, for +example, to call enet_host_service() with a 0 timeout (meaning non-blocking) +at the beginning of every frame in a game loop. + +Currently there are only four types of significant events in ENet: + +An event of type ENET_EVENT_TYPE_NONE is returned if no event occurred +within the specified time limit. enet_host_service() will return 0 +with this event. + +An event of type ENET_EVENT_TYPE_CONNECT is returned when either a new client +host has connected to the server host or when an attempt to establish a +connection with a foreign host has succeeded. Only the "peer" field of the +event structure is valid for this event and contains the newly connected peer. + +An event of type ENET_EVENT_TYPE_RECEIVE is returned when a packet is received +from a connected peer. The "peer" field contains the peer the packet was +received from, "channelID" is the channel on which the packet was sent, and +"packet" is the packet that was sent. The packet contained in the "packet" +field must be destroyed with enet_packet_destroy() when you are done +inspecting its contents. + +An event of type ENET_EVENT_TYPE_DISCONNECT is returned when a connected peer +has either explicitly disconnected or timed out. Only the "peer" field of the +event structure is valid for this event and contains the peer that +disconnected. Only the "data" field of the peer is still valid on a +disconnect event and must be explicitly reset. + +@code + ENetEvent event; + + /* Wait up to 1000 milliseconds for an event. */ + while (enet_host_service (client, & event, 1000) > 0) + { + switch (event.type) + { + case ENET_EVENT_TYPE_CONNECT: + printf ("A new client connected from %x:%u.\n", + event.peer -> address.host, + event.peer -> address.port); + + /* Store any relevant client information here. */ + event.peer -> data = "Client information"; + + break; + + case ENET_EVENT_TYPE_RECEIVE: + printf ("A packet of length %u containing %s was received from %s on channel %u.\n", + event.packet -> dataLength, + event.packet -> data, + event.peer -> data, + event.channelID); + + /* Clean up the packet now that we're done using it. */ + enet_packet_destroy (event.packet); + + break; + + case ENET_EVENT_TYPE_DISCONNECT: + printf ("%s disconnected.\n", event.peer -> data); + + /* Reset the peer's client information. */ + + event.peer -> data = NULL; + } + } + ... + ... + ... +@endcode + +@section SendingPacket Sending a packet to an ENet peer + +Packets in ENet are created with enet_packet_create(), where the size +of the packet must be specified. Optionally, initial data may be +specified to copy into the packet. + +Certain flags may also be supplied to enet_packet_create() to control +various packet features: + +ENET_PACKET_FLAG_RELIABLE specifies that the packet must use reliable +delivery. A reliable packet is guaranteed to be delivered, and a +number of retry attempts will be made until an acknowledgement is +received from the foreign host the packet is sent to. If a certain +number of retry attempts is reached without any acknowledgement, ENet +will assume the peer has disconnected and forcefully reset the +connection. If this flag is not specified, the packet is assumed an +unreliable packet, and no retry attempts will be made nor +acknowledgements generated. + +A packet may be resized (extended or truncated) with +enet_packet_resize(). + +A packet is sent to a foreign host with +enet_peer_send(). enet_peer_send() accepts a channel id over which to +send the packet to a given peer. Once the packet is handed over to +ENet with enet_peer_send(), ENet will handle its deallocation and +enet_packet_destroy() should not be used upon it. + +One may also use enet_host_broadcast() to send a packet to all +connected peers on a given host over a specified channel id, as with +enet_peer_send(). + +Queued packets will be sent on a call to enet_host_service(). +Alternatively, enet_host_flush() will send out queued packets without +dispatching any events. + +@code + /* Create a reliable packet of size 7 containing "packet\0" */ + ENetPacket * packet = enet_packet_create ("packet", + strlen ("packet") + 1, + ENET_PACKET_FLAG_RELIABLE); + + /* Extend the packet so and append the string "foo", so it now */ + /* contains "packetfoo\0" */ + enet_packet_resize (packet, strlen ("packetfoo") + 1); + strcpy (& packet -> data [strlen ("packet")], "foo"); + + /* Send the packet to the peer over channel id 0. */ + /* One could also broadcast the packet by */ + /* enet_host_broadcast (host, 0, packet); */ + enet_peer_send (peer, 0, packet); + ... + ... + ... + /* One could just use enet_host_service() instead. */ + enet_host_flush (host); +@endcode + +@section Disconnecting Disconnecting an ENet peer + +Peers may be gently disconnected with enet_peer_disconnect(). A +disconnect request will be sent to the foreign host, and ENet will +wait for an acknowledgement from the foreign host before finally +disconnecting. An event of type ENET_EVENT_TYPE_DISCONNECT will be +generated once the disconnection succeeds. Normally timeouts apply to +the disconnect acknowledgement, and so if no acknowledgement is +received after a length of time the peer will be forcefully +disconnected. + +enet_peer_reset() will forcefully disconnect a peer. The foreign host +will get no notification of a disconnect and will time out on the +foreign host. No event is generated. + +@code + ENetEvent event; + + enet_peer_disconnect (peer, 0); + + /* Allow up to 3 seconds for the disconnect to succeed + * and drop any packets received packets. + */ + while (enet_host_service (client, & event, 3000) > 0) + { + switch (event.type) + { + case ENET_EVENT_TYPE_RECEIVE: + enet_packet_destroy (event.packet); + break; + + case ENET_EVENT_TYPE_DISCONNECT: + puts ("Disconnection succeeded."); + return; + ... + ... + ... + } + } + + /* We've arrived here, so the disconnect attempt didn't */ + /* succeed yet. Force the connection down. */ + enet_peer_reset (peer); + ... + ... + ... +@endcode + +@section Connecting Connecting to an ENet host + +A connection to a foreign host is initiated with enet_host_connect(). +It accepts the address of a foreign host to connect to, and the number +of channels that should be allocated for communication. If N channels +are allocated for use, their channel ids will be numbered 0 through +N-1. A peer representing the connection attempt is returned, or NULL +if there were no available peers over which to initiate the +connection. When the connection attempt succeeds, an event of type +ENET_EVENT_TYPE_CONNECT will be generated. If the connection attempt +times out or otherwise fails, an event of type +ENET_EVENT_TYPE_DISCONNECT will be generated. + +@code + ENetAddress address; + ENetEvent event; + ENetPeer *peer; + + /* Connect to some.server.net:1234. */ + enet_address_set_host (& address, "some.server.net"); + address.port = 1234; + + /* Initiate the connection, allocating the two channels 0 and 1. */ + peer = enet_host_connect (client, & address, 2, 0); + + if (peer == NULL) + { + fprintf (stderr, + "No available peers for initiating an ENet connection.\n"); + exit (EXIT_FAILURE); + } + + /* Wait up to 5 seconds for the connection attempt to succeed. */ + if (enet_host_service (client, & event, 5000) > 0 && + event.type == ENET_EVENT_TYPE_CONNECT) + { + puts ("Connection to some.server.net:1234 succeeded."); + ... + ... + ... + } + else + { + /* Either the 5 seconds are up or a disconnect event was */ + /* received. Reset the peer in the event the 5 seconds */ + /* had run out without any significant event. */ + enet_peer_reset (peer); + + puts ("Connection to some.server.net:1234 failed."); + } + ... + ... + ... +@endcode +*/ diff --git a/thirdparty/enet/enet.dsp b/thirdparty/enet/enet.dsp new file mode 100644 index 0000000..dce4537 --- /dev/null +++ b/thirdparty/enet/enet.dsp @@ -0,0 +1,168 @@ +# Microsoft Developer Studio Project File - Name="enet" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Static Library" 0x0104 + +CFG=enet - Win32 Debug +!MESSAGE This is not a valid makefile. To build this project using NMAKE, +!MESSAGE use the Export Makefile command and run +!MESSAGE +!MESSAGE NMAKE /f "enet.mak". +!MESSAGE +!MESSAGE You can specify a configuration when running NMAKE +!MESSAGE by defining the macro CFG on the command line. For example: +!MESSAGE +!MESSAGE NMAKE /f "enet.mak" CFG="enet - Win32 Debug" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "enet - Win32 Release" (based on "Win32 (x86) Static Library") +!MESSAGE "enet - Win32 Debug" (based on "Win32 (x86) Static Library") +!MESSAGE + +# Begin Project +# PROP AllowPerConfigDependencies 0 +# PROP Scc_ProjName "" +# PROP Scc_LocalPath "" +CPP=cl.exe +RSC=rc.exe + +!IF "$(CFG)" == "enet - Win32 Release" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "Release" +# PROP BASE Intermediate_Dir "Release" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "Release" +# PROP Intermediate_Dir "Release" +# PROP Target_Dir "" +MTL=midl.exe +# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_MBCS" /D "_LIB" /YX /FD /c +# ADD CPP /nologo /W3 /O2 /I "include" /D "WIN32" /D "NDEBUG" /D "_MBCS" /D "_LIB" /FD /c +# SUBTRACT CPP /YX +# ADD BASE RSC /l 0x409 /d "NDEBUG" +# ADD RSC /l 0x409 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LIB32=link.exe -lib +# ADD BASE LIB32 /nologo +# ADD LIB32 /nologo + +!ELSEIF "$(CFG)" == "enet - Win32 Debug" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "Debug" +# PROP BASE Intermediate_Dir "Debug" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "Debug" +# PROP Intermediate_Dir "Debug" +# PROP Target_Dir "" +MTL=midl.exe +# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_MBCS" /D "_LIB" /YX /FD /GZ /c +# ADD CPP /nologo /G6 /MTd /W3 /ZI /Od /I "include" /D "WIN32" /D "_DEBUG" /D "_MBCS" /D "_LIB" /FR /FD /GZ /c +# SUBTRACT CPP /YX +# ADD BASE RSC /l 0x409 /d "_DEBUG" +# ADD RSC /l 0x409 /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LIB32=link.exe -lib +# ADD BASE LIB32 /nologo +# ADD LIB32 /nologo + +!ENDIF + +# Begin Target + +# Name "enet - Win32 Release" +# Name "enet - Win32 Debug" +# Begin Group "Source Files" + +# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" +# Begin Source File + +SOURCE=.\host.c +# End Source File +# Begin Source File + +SOURCE=.\list.c +# End Source File +# Begin Source File + +SOURCE=.\callbacks.c +# End Source File +# Begin Source File + +SOURCE=.\compress.c +# End Source File +# Begin Source File + +SOURCE=.\packet.c +# End Source File +# Begin Source File + +SOURCE=.\peer.c +# End Source File +# Begin Source File + +SOURCE=.\protocol.c +# End Source File +# Begin Source File + +SOURCE=.\unix.c +# End Source File +# Begin Source File + +SOURCE=.\win32.c +# End Source File +# End Group +# Begin Group "Header Files" + +# PROP Default_Filter "h;hpp;hxx;hm;inl" +# Begin Source File + +SOURCE=.\include\enet\enet.h +# End Source File +# Begin Source File + +SOURCE=.\include\enet\list.h +# End Source File +# Begin Source File + +SOURCE=.\include\enet\callbacks.h +# End Source File +# Begin Source File + +SOURCE=.\include\enet\protocol.h +# End Source File +# Begin Source File + +SOURCE=.\include\enet\time.h +# End Source File +# Begin Source File + +SOURCE=.\include\enet\types.h +# End Source File +# Begin Source File + +SOURCE=.\include\enet\unix.h +# End Source File +# Begin Source File + +SOURCE=.\include\enet\utility.h +# End Source File +# Begin Source File + +SOURCE=.\include\enet\win32.h +# End Source File +# End Group +# End Target +# End Project diff --git a/thirdparty/enet/enet_dll.cbp b/thirdparty/enet/enet_dll.cbp new file mode 100644 index 0000000..961274c --- /dev/null +++ b/thirdparty/enet/enet_dll.cbp @@ -0,0 +1,86 @@ + + + + + + diff --git a/thirdparty/enet/host.c b/thirdparty/enet/host.c new file mode 100644 index 0000000..fff946a --- /dev/null +++ b/thirdparty/enet/host.c @@ -0,0 +1,503 @@ +/** + @file host.c + @brief ENet host management functions +*/ +#define ENET_BUILDING_LIB 1 +#include +#include "enet/enet.h" + +/** @defgroup host ENet host functions + @{ +*/ + +/** Creates a host for communicating to peers. + + @param address the address at which other peers may connect to this host. If NULL, then no peers may connect to the host. + @param peerCount the maximum number of peers that should be allocated for the host. + @param channelLimit the maximum number of channels allowed; if 0, then this is equivalent to ENET_PROTOCOL_MAXIMUM_CHANNEL_COUNT + @param incomingBandwidth downstream bandwidth of the host in bytes/second; if 0, ENet will assume unlimited bandwidth. + @param outgoingBandwidth upstream bandwidth of the host in bytes/second; if 0, ENet will assume unlimited bandwidth. + + @returns the host on success and NULL on failure + + @remarks ENet will strategically drop packets on specific sides of a connection between hosts + to ensure the host's bandwidth is not overwhelmed. The bandwidth parameters also determine + the window size of a connection which limits the amount of reliable packets that may be in transit + at any given time. +*/ +ENetHost * +enet_host_create (const ENetAddress * address, size_t peerCount, size_t channelLimit, enet_uint32 incomingBandwidth, enet_uint32 outgoingBandwidth) +{ + ENetHost * host; + ENetPeer * currentPeer; + + if (peerCount > ENET_PROTOCOL_MAXIMUM_PEER_ID) + return NULL; + + host = (ENetHost *) enet_malloc (sizeof (ENetHost)); + if (host == NULL) + return NULL; + memset (host, 0, sizeof (ENetHost)); + + host -> peers = (ENetPeer *) enet_malloc (peerCount * sizeof (ENetPeer)); + if (host -> peers == NULL) + { + enet_free (host); + + return NULL; + } + memset (host -> peers, 0, peerCount * sizeof (ENetPeer)); + + host -> socket = enet_socket_create (ENET_SOCKET_TYPE_DATAGRAM); + if (host -> socket == ENET_SOCKET_NULL || (address != NULL && enet_socket_bind (host -> socket, address) < 0)) + { + if (host -> socket != ENET_SOCKET_NULL) + enet_socket_destroy (host -> socket); + + enet_free (host -> peers); + enet_free (host); + + return NULL; + } + + enet_socket_set_option (host -> socket, ENET_SOCKOPT_NONBLOCK, 1); + enet_socket_set_option (host -> socket, ENET_SOCKOPT_BROADCAST, 1); + enet_socket_set_option (host -> socket, ENET_SOCKOPT_RCVBUF, ENET_HOST_RECEIVE_BUFFER_SIZE); + enet_socket_set_option (host -> socket, ENET_SOCKOPT_SNDBUF, ENET_HOST_SEND_BUFFER_SIZE); + + if (address != NULL && enet_socket_get_address (host -> socket, & host -> address) < 0) + host -> address = * address; + + if (! channelLimit || channelLimit > ENET_PROTOCOL_MAXIMUM_CHANNEL_COUNT) + channelLimit = ENET_PROTOCOL_MAXIMUM_CHANNEL_COUNT; + else + if (channelLimit < ENET_PROTOCOL_MINIMUM_CHANNEL_COUNT) + channelLimit = ENET_PROTOCOL_MINIMUM_CHANNEL_COUNT; + + host -> randomSeed = (enet_uint32) (size_t) host; + host -> randomSeed += enet_host_random_seed (); + host -> randomSeed = (host -> randomSeed << 16) | (host -> randomSeed >> 16); + host -> channelLimit = channelLimit; + host -> incomingBandwidth = incomingBandwidth; + host -> outgoingBandwidth = outgoingBandwidth; + host -> bandwidthThrottleEpoch = 0; + host -> recalculateBandwidthLimits = 0; + host -> mtu = ENET_HOST_DEFAULT_MTU; + host -> peerCount = peerCount; + host -> commandCount = 0; + host -> bufferCount = 0; + host -> checksum = NULL; + host -> receivedAddress.host = ENET_HOST_ANY; + host -> receivedAddress.port = 0; + host -> receivedData = NULL; + host -> receivedDataLength = 0; + + host -> totalSentData = 0; + host -> totalSentPackets = 0; + host -> totalReceivedData = 0; + host -> totalReceivedPackets = 0; + host -> totalQueued = 0; + + host -> connectedPeers = 0; + host -> bandwidthLimitedPeers = 0; + host -> duplicatePeers = ENET_PROTOCOL_MAXIMUM_PEER_ID; + host -> maximumPacketSize = ENET_HOST_DEFAULT_MAXIMUM_PACKET_SIZE; + host -> maximumWaitingData = ENET_HOST_DEFAULT_MAXIMUM_WAITING_DATA; + + host -> compressor.context = NULL; + host -> compressor.compress = NULL; + host -> compressor.decompress = NULL; + host -> compressor.destroy = NULL; + + host -> intercept = NULL; + + enet_list_clear (& host -> dispatchQueue); + + for (currentPeer = host -> peers; + currentPeer < & host -> peers [host -> peerCount]; + ++ currentPeer) + { + currentPeer -> host = host; + currentPeer -> incomingPeerID = currentPeer - host -> peers; + currentPeer -> outgoingSessionID = currentPeer -> incomingSessionID = 0xFF; + currentPeer -> data = NULL; + + enet_list_clear (& currentPeer -> acknowledgements); + enet_list_clear (& currentPeer -> sentReliableCommands); + enet_list_clear (& currentPeer -> outgoingCommands); + enet_list_clear (& currentPeer -> outgoingSendReliableCommands); + enet_list_clear (& currentPeer -> dispatchedCommands); + + enet_peer_reset (currentPeer); + } + + return host; +} + +/** Destroys the host and all resources associated with it. + @param host pointer to the host to destroy +*/ +void +enet_host_destroy (ENetHost * host) +{ + ENetPeer * currentPeer; + + if (host == NULL) + return; + + enet_socket_destroy (host -> socket); + + for (currentPeer = host -> peers; + currentPeer < & host -> peers [host -> peerCount]; + ++ currentPeer) + { + enet_peer_reset (currentPeer); + } + + if (host -> compressor.context != NULL && host -> compressor.destroy) + (* host -> compressor.destroy) (host -> compressor.context); + + enet_free (host -> peers); + enet_free (host); +} + +enet_uint32 +enet_host_random (ENetHost * host) +{ + /* Mulberry32 by Tommy Ettinger */ + enet_uint32 n = (host -> randomSeed += 0x6D2B79F5U); + n = (n ^ (n >> 15)) * (n | 1U); + n ^= n + (n ^ (n >> 7)) * (n | 61U); + return n ^ (n >> 14); +} + +/** Initiates a connection to a foreign host. + @param host host seeking the connection + @param address destination for the connection + @param channelCount number of channels to allocate + @param data user data supplied to the receiving host + @returns a peer representing the foreign host on success, NULL on failure + @remarks The peer returned will have not completed the connection until enet_host_service() + notifies of an ENET_EVENT_TYPE_CONNECT event for the peer. +*/ +ENetPeer * +enet_host_connect (ENetHost * host, const ENetAddress * address, size_t channelCount, enet_uint32 data) +{ + ENetPeer * currentPeer; + ENetChannel * channel; + ENetProtocol command; + + if (channelCount < ENET_PROTOCOL_MINIMUM_CHANNEL_COUNT) + channelCount = ENET_PROTOCOL_MINIMUM_CHANNEL_COUNT; + else + if (channelCount > ENET_PROTOCOL_MAXIMUM_CHANNEL_COUNT) + channelCount = ENET_PROTOCOL_MAXIMUM_CHANNEL_COUNT; + + for (currentPeer = host -> peers; + currentPeer < & host -> peers [host -> peerCount]; + ++ currentPeer) + { + if (currentPeer -> state == ENET_PEER_STATE_DISCONNECTED) + break; + } + + if (currentPeer >= & host -> peers [host -> peerCount]) + return NULL; + + currentPeer -> channels = (ENetChannel *) enet_malloc (channelCount * sizeof (ENetChannel)); + if (currentPeer -> channels == NULL) + return NULL; + currentPeer -> channelCount = channelCount; + currentPeer -> state = ENET_PEER_STATE_CONNECTING; + currentPeer -> address = * address; + currentPeer -> connectID = enet_host_random (host); + currentPeer -> mtu = host -> mtu; + + if (host -> outgoingBandwidth == 0) + currentPeer -> windowSize = ENET_PROTOCOL_MAXIMUM_WINDOW_SIZE; + else + currentPeer -> windowSize = (host -> outgoingBandwidth / + ENET_PEER_WINDOW_SIZE_SCALE) * + ENET_PROTOCOL_MINIMUM_WINDOW_SIZE; + + if (currentPeer -> windowSize < ENET_PROTOCOL_MINIMUM_WINDOW_SIZE) + currentPeer -> windowSize = ENET_PROTOCOL_MINIMUM_WINDOW_SIZE; + else + if (currentPeer -> windowSize > ENET_PROTOCOL_MAXIMUM_WINDOW_SIZE) + currentPeer -> windowSize = ENET_PROTOCOL_MAXIMUM_WINDOW_SIZE; + + for (channel = currentPeer -> channels; + channel < & currentPeer -> channels [channelCount]; + ++ channel) + { + channel -> outgoingReliableSequenceNumber = 0; + channel -> outgoingUnreliableSequenceNumber = 0; + channel -> incomingReliableSequenceNumber = 0; + channel -> incomingUnreliableSequenceNumber = 0; + + enet_list_clear (& channel -> incomingReliableCommands); + enet_list_clear (& channel -> incomingUnreliableCommands); + + channel -> usedReliableWindows = 0; + memset (channel -> reliableWindows, 0, sizeof (channel -> reliableWindows)); + } + + command.header.command = ENET_PROTOCOL_COMMAND_CONNECT | ENET_PROTOCOL_COMMAND_FLAG_ACKNOWLEDGE; + command.header.channelID = 0xFF; + command.connect.outgoingPeerID = ENET_HOST_TO_NET_16 (currentPeer -> incomingPeerID); + command.connect.incomingSessionID = currentPeer -> incomingSessionID; + command.connect.outgoingSessionID = currentPeer -> outgoingSessionID; + command.connect.mtu = ENET_HOST_TO_NET_32 (currentPeer -> mtu); + command.connect.windowSize = ENET_HOST_TO_NET_32 (currentPeer -> windowSize); + command.connect.channelCount = ENET_HOST_TO_NET_32 (channelCount); + command.connect.incomingBandwidth = ENET_HOST_TO_NET_32 (host -> incomingBandwidth); + command.connect.outgoingBandwidth = ENET_HOST_TO_NET_32 (host -> outgoingBandwidth); + command.connect.packetThrottleInterval = ENET_HOST_TO_NET_32 (currentPeer -> packetThrottleInterval); + command.connect.packetThrottleAcceleration = ENET_HOST_TO_NET_32 (currentPeer -> packetThrottleAcceleration); + command.connect.packetThrottleDeceleration = ENET_HOST_TO_NET_32 (currentPeer -> packetThrottleDeceleration); + command.connect.connectID = currentPeer -> connectID; + command.connect.data = ENET_HOST_TO_NET_32 (data); + + enet_peer_queue_outgoing_command (currentPeer, & command, NULL, 0, 0); + + return currentPeer; +} + +/** Queues a packet to be sent to all peers associated with the host. + @param host host on which to broadcast the packet + @param channelID channel on which to broadcast + @param packet packet to broadcast +*/ +void +enet_host_broadcast (ENetHost * host, enet_uint8 channelID, ENetPacket * packet) +{ + ENetPeer * currentPeer; + + for (currentPeer = host -> peers; + currentPeer < & host -> peers [host -> peerCount]; + ++ currentPeer) + { + if (currentPeer -> state != ENET_PEER_STATE_CONNECTED) + continue; + + enet_peer_send (currentPeer, channelID, packet); + } + + if (packet -> referenceCount == 0) + enet_packet_destroy (packet); +} + +/** Sets the packet compressor the host should use to compress and decompress packets. + @param host host to enable or disable compression for + @param compressor callbacks for for the packet compressor; if NULL, then compression is disabled +*/ +void +enet_host_compress (ENetHost * host, const ENetCompressor * compressor) +{ + if (host -> compressor.context != NULL && host -> compressor.destroy) + (* host -> compressor.destroy) (host -> compressor.context); + + if (compressor) + host -> compressor = * compressor; + else + host -> compressor.context = NULL; +} + +/** Limits the maximum allowed channels of future incoming connections. + @param host host to limit + @param channelLimit the maximum number of channels allowed; if 0, then this is equivalent to ENET_PROTOCOL_MAXIMUM_CHANNEL_COUNT +*/ +void +enet_host_channel_limit (ENetHost * host, size_t channelLimit) +{ + if (! channelLimit || channelLimit > ENET_PROTOCOL_MAXIMUM_CHANNEL_COUNT) + channelLimit = ENET_PROTOCOL_MAXIMUM_CHANNEL_COUNT; + else + if (channelLimit < ENET_PROTOCOL_MINIMUM_CHANNEL_COUNT) + channelLimit = ENET_PROTOCOL_MINIMUM_CHANNEL_COUNT; + + host -> channelLimit = channelLimit; +} + + +/** Adjusts the bandwidth limits of a host. + @param host host to adjust + @param incomingBandwidth new incoming bandwidth + @param outgoingBandwidth new outgoing bandwidth + @remarks the incoming and outgoing bandwidth parameters are identical in function to those + specified in enet_host_create(). +*/ +void +enet_host_bandwidth_limit (ENetHost * host, enet_uint32 incomingBandwidth, enet_uint32 outgoingBandwidth) +{ + host -> incomingBandwidth = incomingBandwidth; + host -> outgoingBandwidth = outgoingBandwidth; + host -> recalculateBandwidthLimits = 1; +} + +void +enet_host_bandwidth_throttle (ENetHost * host) +{ + enet_uint32 timeCurrent = enet_time_get (), + elapsedTime = timeCurrent - host -> bandwidthThrottleEpoch, + peersRemaining = (enet_uint32) host -> connectedPeers, + dataTotal = ~0, + bandwidth = ~0, + throttle = 0, + bandwidthLimit = 0; + int needsAdjustment = host -> bandwidthLimitedPeers > 0 ? 1 : 0; + ENetPeer * peer; + ENetProtocol command; + + if (elapsedTime < ENET_HOST_BANDWIDTH_THROTTLE_INTERVAL) + return; + + host -> bandwidthThrottleEpoch = timeCurrent; + + if (peersRemaining == 0) + return; + + if (host -> outgoingBandwidth != 0) + { + dataTotal = 0; + bandwidth = (host -> outgoingBandwidth * elapsedTime) / 1000; + + for (peer = host -> peers; + peer < & host -> peers [host -> peerCount]; + ++ peer) + { + if (peer -> state != ENET_PEER_STATE_CONNECTED && peer -> state != ENET_PEER_STATE_DISCONNECT_LATER) + continue; + + dataTotal += peer -> outgoingDataTotal; + } + } + + while (peersRemaining > 0 && needsAdjustment != 0) + { + needsAdjustment = 0; + + if (dataTotal <= bandwidth) + throttle = ENET_PEER_PACKET_THROTTLE_SCALE; + else + throttle = (bandwidth * ENET_PEER_PACKET_THROTTLE_SCALE) / dataTotal; + + for (peer = host -> peers; + peer < & host -> peers [host -> peerCount]; + ++ peer) + { + enet_uint32 peerBandwidth; + + if ((peer -> state != ENET_PEER_STATE_CONNECTED && peer -> state != ENET_PEER_STATE_DISCONNECT_LATER) || + peer -> incomingBandwidth == 0 || + peer -> outgoingBandwidthThrottleEpoch == timeCurrent) + continue; + + peerBandwidth = (peer -> incomingBandwidth * elapsedTime) / 1000; + if ((throttle * peer -> outgoingDataTotal) / ENET_PEER_PACKET_THROTTLE_SCALE <= peerBandwidth) + continue; + + peer -> packetThrottleLimit = (peerBandwidth * + ENET_PEER_PACKET_THROTTLE_SCALE) / peer -> outgoingDataTotal; + + if (peer -> packetThrottleLimit == 0) + peer -> packetThrottleLimit = 1; + + if (peer -> packetThrottle > peer -> packetThrottleLimit) + peer -> packetThrottle = peer -> packetThrottleLimit; + + peer -> outgoingBandwidthThrottleEpoch = timeCurrent; + + peer -> incomingDataTotal = 0; + peer -> outgoingDataTotal = 0; + + needsAdjustment = 1; + -- peersRemaining; + bandwidth -= peerBandwidth; + dataTotal -= peerBandwidth; + } + } + + if (peersRemaining > 0) + { + if (dataTotal <= bandwidth) + throttle = ENET_PEER_PACKET_THROTTLE_SCALE; + else + throttle = (bandwidth * ENET_PEER_PACKET_THROTTLE_SCALE) / dataTotal; + + for (peer = host -> peers; + peer < & host -> peers [host -> peerCount]; + ++ peer) + { + if ((peer -> state != ENET_PEER_STATE_CONNECTED && peer -> state != ENET_PEER_STATE_DISCONNECT_LATER) || + peer -> outgoingBandwidthThrottleEpoch == timeCurrent) + continue; + + peer -> packetThrottleLimit = throttle; + + if (peer -> packetThrottle > peer -> packetThrottleLimit) + peer -> packetThrottle = peer -> packetThrottleLimit; + + peer -> incomingDataTotal = 0; + peer -> outgoingDataTotal = 0; + } + } + + if (host -> recalculateBandwidthLimits) + { + host -> recalculateBandwidthLimits = 0; + + peersRemaining = (enet_uint32) host -> connectedPeers; + bandwidth = host -> incomingBandwidth; + needsAdjustment = 1; + + if (bandwidth == 0) + bandwidthLimit = 0; + else + while (peersRemaining > 0 && needsAdjustment != 0) + { + needsAdjustment = 0; + bandwidthLimit = bandwidth / peersRemaining; + + for (peer = host -> peers; + peer < & host -> peers [host -> peerCount]; + ++ peer) + { + if ((peer -> state != ENET_PEER_STATE_CONNECTED && peer -> state != ENET_PEER_STATE_DISCONNECT_LATER) || + peer -> incomingBandwidthThrottleEpoch == timeCurrent) + continue; + + if (peer -> outgoingBandwidth > 0 && + peer -> outgoingBandwidth >= bandwidthLimit) + continue; + + peer -> incomingBandwidthThrottleEpoch = timeCurrent; + + needsAdjustment = 1; + -- peersRemaining; + bandwidth -= peer -> outgoingBandwidth; + } + } + + for (peer = host -> peers; + peer < & host -> peers [host -> peerCount]; + ++ peer) + { + if (peer -> state != ENET_PEER_STATE_CONNECTED && peer -> state != ENET_PEER_STATE_DISCONNECT_LATER) + continue; + + command.header.command = ENET_PROTOCOL_COMMAND_BANDWIDTH_LIMIT | ENET_PROTOCOL_COMMAND_FLAG_ACKNOWLEDGE; + command.header.channelID = 0xFF; + command.bandwidthLimit.outgoingBandwidth = ENET_HOST_TO_NET_32 (host -> outgoingBandwidth); + + if (peer -> incomingBandwidthThrottleEpoch == timeCurrent) + command.bandwidthLimit.incomingBandwidth = ENET_HOST_TO_NET_32 (peer -> outgoingBandwidth); + else + command.bandwidthLimit.incomingBandwidth = ENET_HOST_TO_NET_32 (bandwidthLimit); + + enet_peer_queue_outgoing_command (peer, & command, NULL, 0, 0); + } + } +} + +/** @} */ diff --git a/thirdparty/enet/include/enet/callbacks.h b/thirdparty/enet/include/enet/callbacks.h new file mode 100644 index 0000000..340a4a9 --- /dev/null +++ b/thirdparty/enet/include/enet/callbacks.h @@ -0,0 +1,27 @@ +/** + @file callbacks.h + @brief ENet callbacks +*/ +#ifndef __ENET_CALLBACKS_H__ +#define __ENET_CALLBACKS_H__ + +#include + +typedef struct _ENetCallbacks +{ + void * (ENET_CALLBACK * malloc) (size_t size); + void (ENET_CALLBACK * free) (void * memory); + void (ENET_CALLBACK * no_memory) (void); +} ENetCallbacks; + +/** @defgroup callbacks ENet internal callbacks + @{ + @ingroup private +*/ +extern void * enet_malloc (size_t); +extern void enet_free (void *); + +/** @} */ + +#endif /* __ENET_CALLBACKS_H__ */ + diff --git a/thirdparty/enet/include/enet/enet.h b/thirdparty/enet/include/enet/enet.h new file mode 100644 index 0000000..3001018 --- /dev/null +++ b/thirdparty/enet/include/enet/enet.h @@ -0,0 +1,616 @@ +/** + @file enet.h + @brief ENet public header file +*/ +#ifndef __ENET_ENET_H__ +#define __ENET_ENET_H__ + +#ifdef __cplusplus +extern "C" +{ +#endif + +#include + +#ifdef _WIN32 +#include "enet/win32.h" +#else +#include "enet/unix.h" +#endif + +#include "enet/types.h" +#include "enet/protocol.h" +#include "enet/list.h" +#include "enet/callbacks.h" + +#define ENET_VERSION_MAJOR 1 +#define ENET_VERSION_MINOR 3 +#define ENET_VERSION_PATCH 18 +#define ENET_VERSION_CREATE(major, minor, patch) (((major)<<16) | ((minor)<<8) | (patch)) +#define ENET_VERSION_GET_MAJOR(version) (((version)>>16)&0xFF) +#define ENET_VERSION_GET_MINOR(version) (((version)>>8)&0xFF) +#define ENET_VERSION_GET_PATCH(version) ((version)&0xFF) +#define ENET_VERSION ENET_VERSION_CREATE(ENET_VERSION_MAJOR, ENET_VERSION_MINOR, ENET_VERSION_PATCH) + +typedef enet_uint32 ENetVersion; + +struct _ENetHost; +struct _ENetEvent; +struct _ENetPacket; + +typedef enum _ENetSocketType +{ + ENET_SOCKET_TYPE_STREAM = 1, + ENET_SOCKET_TYPE_DATAGRAM = 2 +} ENetSocketType; + +typedef enum _ENetSocketWait +{ + ENET_SOCKET_WAIT_NONE = 0, + ENET_SOCKET_WAIT_SEND = (1 << 0), + ENET_SOCKET_WAIT_RECEIVE = (1 << 1), + ENET_SOCKET_WAIT_INTERRUPT = (1 << 2) +} ENetSocketWait; + +typedef enum _ENetSocketOption +{ + ENET_SOCKOPT_NONBLOCK = 1, + ENET_SOCKOPT_BROADCAST = 2, + ENET_SOCKOPT_RCVBUF = 3, + ENET_SOCKOPT_SNDBUF = 4, + ENET_SOCKOPT_REUSEADDR = 5, + ENET_SOCKOPT_RCVTIMEO = 6, + ENET_SOCKOPT_SNDTIMEO = 7, + ENET_SOCKOPT_ERROR = 8, + ENET_SOCKOPT_NODELAY = 9, + ENET_SOCKOPT_TTL = 10 +} ENetSocketOption; + +typedef enum _ENetSocketShutdown +{ + ENET_SOCKET_SHUTDOWN_READ = 0, + ENET_SOCKET_SHUTDOWN_WRITE = 1, + ENET_SOCKET_SHUTDOWN_READ_WRITE = 2 +} ENetSocketShutdown; + +#define ENET_HOST_ANY 0 +#define ENET_HOST_BROADCAST 0xFFFFFFFFU +#define ENET_PORT_ANY 0 + +/** + * Portable internet address structure. + * + * The host must be specified in network byte-order, and the port must be in host + * byte-order. The constant ENET_HOST_ANY may be used to specify the default + * server host. The constant ENET_HOST_BROADCAST may be used to specify the + * broadcast address (255.255.255.255). This makes sense for enet_host_connect, + * but not for enet_host_create. Once a server responds to a broadcast, the + * address is updated from ENET_HOST_BROADCAST to the server's actual IP address. + */ +typedef struct _ENetAddress +{ + enet_uint32 host; + enet_uint16 port; +} ENetAddress; + +/** + * Packet flag bit constants. + * + * The host must be specified in network byte-order, and the port must be in + * host byte-order. The constant ENET_HOST_ANY may be used to specify the + * default server host. + + @sa ENetPacket +*/ +typedef enum _ENetPacketFlag +{ + /** packet must be received by the target peer and resend attempts should be + * made until the packet is delivered */ + ENET_PACKET_FLAG_RELIABLE = (1 << 0), + /** packet will not be sequenced with other packets + * not supported for reliable packets + */ + ENET_PACKET_FLAG_UNSEQUENCED = (1 << 1), + /** packet will not allocate data, and user must supply it instead */ + ENET_PACKET_FLAG_NO_ALLOCATE = (1 << 2), + /** packet will be fragmented using unreliable (instead of reliable) sends + * if it exceeds the MTU */ + ENET_PACKET_FLAG_UNRELIABLE_FRAGMENT = (1 << 3), + + /** whether the packet has been sent from all queues it has been entered into */ + ENET_PACKET_FLAG_SENT = (1<<8) +} ENetPacketFlag; + +typedef void (ENET_CALLBACK * ENetPacketFreeCallback) (struct _ENetPacket *); + +/** + * ENet packet structure. + * + * An ENet data packet that may be sent to or received from a peer. The shown + * fields should only be read and never modified. The data field contains the + * allocated data for the packet. The dataLength fields specifies the length + * of the allocated data. The flags field is either 0 (specifying no flags), + * or a bitwise-or of any combination of the following flags: + * + * ENET_PACKET_FLAG_RELIABLE - packet must be received by the target peer + * and resend attempts should be made until the packet is delivered + * + * ENET_PACKET_FLAG_UNSEQUENCED - packet will not be sequenced with other packets + * (not supported for reliable packets) + * + * ENET_PACKET_FLAG_NO_ALLOCATE - packet will not allocate data, and user must supply it instead + * + * ENET_PACKET_FLAG_UNRELIABLE_FRAGMENT - packet will be fragmented using unreliable + * (instead of reliable) sends if it exceeds the MTU + * + * ENET_PACKET_FLAG_SENT - whether the packet has been sent from all queues it has been entered into + @sa ENetPacketFlag + */ +typedef struct _ENetPacket +{ + size_t referenceCount; /**< internal use only */ + enet_uint32 flags; /**< bitwise-or of ENetPacketFlag constants */ + enet_uint8 * data; /**< allocated data for packet */ + size_t dataLength; /**< length of data */ + ENetPacketFreeCallback freeCallback; /**< function to be called when the packet is no longer in use */ + void * userData; /**< application private data, may be freely modified */ +} ENetPacket; + +typedef struct _ENetAcknowledgement +{ + ENetListNode acknowledgementList; + enet_uint32 sentTime; + ENetProtocol command; +} ENetAcknowledgement; + +typedef struct _ENetOutgoingCommand +{ + ENetListNode outgoingCommandList; + enet_uint16 reliableSequenceNumber; + enet_uint16 unreliableSequenceNumber; + enet_uint32 sentTime; + enet_uint32 roundTripTimeout; + enet_uint32 queueTime; + enet_uint32 fragmentOffset; + enet_uint16 fragmentLength; + enet_uint16 sendAttempts; + ENetProtocol command; + ENetPacket * packet; +} ENetOutgoingCommand; + +typedef struct _ENetIncomingCommand +{ + ENetListNode incomingCommandList; + enet_uint16 reliableSequenceNumber; + enet_uint16 unreliableSequenceNumber; + ENetProtocol command; + enet_uint32 fragmentCount; + enet_uint32 fragmentsRemaining; + enet_uint32 * fragments; + ENetPacket * packet; +} ENetIncomingCommand; + +typedef enum _ENetPeerState +{ + ENET_PEER_STATE_DISCONNECTED = 0, + ENET_PEER_STATE_CONNECTING = 1, + ENET_PEER_STATE_ACKNOWLEDGING_CONNECT = 2, + ENET_PEER_STATE_CONNECTION_PENDING = 3, + ENET_PEER_STATE_CONNECTION_SUCCEEDED = 4, + ENET_PEER_STATE_CONNECTED = 5, + ENET_PEER_STATE_DISCONNECT_LATER = 6, + ENET_PEER_STATE_DISCONNECTING = 7, + ENET_PEER_STATE_ACKNOWLEDGING_DISCONNECT = 8, + ENET_PEER_STATE_ZOMBIE = 9 +} ENetPeerState; + +#ifndef ENET_BUFFER_MAXIMUM +#define ENET_BUFFER_MAXIMUM (1 + 2 * ENET_PROTOCOL_MAXIMUM_PACKET_COMMANDS) +#endif + +enum +{ + ENET_HOST_RECEIVE_BUFFER_SIZE = 256 * 1024, + ENET_HOST_SEND_BUFFER_SIZE = 256 * 1024, + ENET_HOST_BANDWIDTH_THROTTLE_INTERVAL = 1000, + ENET_HOST_DEFAULT_MTU = 1392, + ENET_HOST_DEFAULT_MAXIMUM_PACKET_SIZE = 32 * 1024 * 1024, + ENET_HOST_DEFAULT_MAXIMUM_WAITING_DATA = 32 * 1024 * 1024, + + ENET_PEER_DEFAULT_ROUND_TRIP_TIME = 500, + ENET_PEER_DEFAULT_PACKET_THROTTLE = 32, + ENET_PEER_PACKET_THROTTLE_SCALE = 32, + ENET_PEER_PACKET_THROTTLE_COUNTER = 7, + ENET_PEER_PACKET_THROTTLE_ACCELERATION = 2, + ENET_PEER_PACKET_THROTTLE_DECELERATION = 2, + ENET_PEER_PACKET_THROTTLE_INTERVAL = 5000, + ENET_PEER_PACKET_LOSS_SCALE = (1 << 16), + ENET_PEER_PACKET_LOSS_INTERVAL = 10000, + ENET_PEER_WINDOW_SIZE_SCALE = 64 * 1024, + ENET_PEER_TIMEOUT_LIMIT = 32, + ENET_PEER_TIMEOUT_MINIMUM = 5000, + ENET_PEER_TIMEOUT_MAXIMUM = 30000, + ENET_PEER_PING_INTERVAL = 500, + ENET_PEER_UNSEQUENCED_WINDOWS = 64, + ENET_PEER_UNSEQUENCED_WINDOW_SIZE = 1024, + ENET_PEER_FREE_UNSEQUENCED_WINDOWS = 32, + ENET_PEER_RELIABLE_WINDOWS = 16, + ENET_PEER_RELIABLE_WINDOW_SIZE = 0x1000, + ENET_PEER_FREE_RELIABLE_WINDOWS = 8 +}; + +typedef struct _ENetChannel +{ + enet_uint16 outgoingReliableSequenceNumber; + enet_uint16 outgoingUnreliableSequenceNumber; + enet_uint16 usedReliableWindows; + enet_uint16 reliableWindows [ENET_PEER_RELIABLE_WINDOWS]; + enet_uint16 incomingReliableSequenceNumber; + enet_uint16 incomingUnreliableSequenceNumber; + ENetList incomingReliableCommands; + ENetList incomingUnreliableCommands; +} ENetChannel; + +typedef enum _ENetPeerFlag +{ + ENET_PEER_FLAG_NEEDS_DISPATCH = (1 << 0), + ENET_PEER_FLAG_CONTINUE_SENDING = (1 << 1) +} ENetPeerFlag; + +/** + * An ENet peer which data packets may be sent or received from. + * + * No fields should be modified unless otherwise specified. + */ +typedef struct _ENetPeer +{ + ENetListNode dispatchList; + struct _ENetHost * host; + enet_uint16 outgoingPeerID; + enet_uint16 incomingPeerID; + enet_uint32 connectID; + enet_uint8 outgoingSessionID; + enet_uint8 incomingSessionID; + ENetAddress address; /**< Internet address of the peer */ + void * data; /**< Application private data, may be freely modified */ + ENetPeerState state; + ENetChannel * channels; + size_t channelCount; /**< Number of channels allocated for communication with peer */ + enet_uint32 incomingBandwidth; /**< Downstream bandwidth of the client in bytes/second */ + enet_uint32 outgoingBandwidth; /**< Upstream bandwidth of the client in bytes/second */ + enet_uint32 incomingBandwidthThrottleEpoch; + enet_uint32 outgoingBandwidthThrottleEpoch; + enet_uint32 incomingDataTotal; + enet_uint32 outgoingDataTotal; + enet_uint32 lastSendTime; + enet_uint32 lastReceiveTime; + enet_uint32 nextTimeout; + enet_uint32 earliestTimeout; + enet_uint32 packetLossEpoch; + enet_uint32 packetsSent; + enet_uint32 packetsLost; + enet_uint32 packetLoss; /**< mean packet loss of reliable packets as a ratio with respect to the constant ENET_PEER_PACKET_LOSS_SCALE */ + enet_uint32 packetLossVariance; + enet_uint32 packetThrottle; + enet_uint32 packetThrottleLimit; + enet_uint32 packetThrottleCounter; + enet_uint32 packetThrottleEpoch; + enet_uint32 packetThrottleAcceleration; + enet_uint32 packetThrottleDeceleration; + enet_uint32 packetThrottleInterval; + enet_uint32 pingInterval; + enet_uint32 timeoutLimit; + enet_uint32 timeoutMinimum; + enet_uint32 timeoutMaximum; + enet_uint32 lastRoundTripTime; + enet_uint32 lowestRoundTripTime; + enet_uint32 lastRoundTripTimeVariance; + enet_uint32 highestRoundTripTimeVariance; + enet_uint32 roundTripTime; /**< mean round trip time (RTT), in milliseconds, between sending a reliable packet and receiving its acknowledgement */ + enet_uint32 roundTripTimeVariance; + enet_uint32 mtu; + enet_uint32 windowSize; + enet_uint32 reliableDataInTransit; + enet_uint16 outgoingReliableSequenceNumber; + ENetList acknowledgements; + ENetList sentReliableCommands; + ENetList outgoingSendReliableCommands; + ENetList outgoingCommands; + ENetList dispatchedCommands; + enet_uint16 flags; + enet_uint16 reserved; + enet_uint16 incomingUnsequencedGroup; + enet_uint16 outgoingUnsequencedGroup; + enet_uint32 unsequencedWindow [ENET_PEER_UNSEQUENCED_WINDOW_SIZE / 32]; + enet_uint32 eventData; + size_t totalWaitingData; +} ENetPeer; + +/** An ENet packet compressor for compressing UDP packets before socket sends or receives. + */ +typedef struct _ENetCompressor +{ + /** Context data for the compressor. Must be non-NULL. */ + void * context; + /** Compresses from inBuffers[0:inBufferCount-1], containing inLimit bytes, to outData, outputting at most outLimit bytes. Should return 0 on failure. */ + size_t (ENET_CALLBACK * compress) (void * context, const ENetBuffer * inBuffers, size_t inBufferCount, size_t inLimit, enet_uint8 * outData, size_t outLimit); + /** Decompresses from inData, containing inLimit bytes, to outData, outputting at most outLimit bytes. Should return 0 on failure. */ + size_t (ENET_CALLBACK * decompress) (void * context, const enet_uint8 * inData, size_t inLimit, enet_uint8 * outData, size_t outLimit); + /** Destroys the context when compression is disabled or the host is destroyed. May be NULL. */ + void (ENET_CALLBACK * destroy) (void * context); +} ENetCompressor; + +/** Callback that computes the checksum of the data held in buffers[0:bufferCount-1] */ +typedef enet_uint32 (ENET_CALLBACK * ENetChecksumCallback) (const ENetBuffer * buffers, size_t bufferCount); + +/** Callback for intercepting received raw UDP packets. Should return 1 to intercept, 0 to ignore, or -1 to propagate an error. */ +typedef int (ENET_CALLBACK * ENetInterceptCallback) (struct _ENetHost * host, struct _ENetEvent * event); + +/** An ENet host for communicating with peers. + * + * No fields should be modified unless otherwise stated. + + @sa enet_host_create() + @sa enet_host_destroy() + @sa enet_host_connect() + @sa enet_host_service() + @sa enet_host_flush() + @sa enet_host_broadcast() + @sa enet_host_compress() + @sa enet_host_compress_with_range_coder() + @sa enet_host_channel_limit() + @sa enet_host_bandwidth_limit() + @sa enet_host_bandwidth_throttle() + */ +typedef struct _ENetHost +{ + ENetSocket socket; + ENetAddress address; /**< Internet address of the host */ + enet_uint32 incomingBandwidth; /**< downstream bandwidth of the host */ + enet_uint32 outgoingBandwidth; /**< upstream bandwidth of the host */ + enet_uint32 bandwidthThrottleEpoch; + enet_uint32 mtu; + enet_uint32 randomSeed; + int recalculateBandwidthLimits; + ENetPeer * peers; /**< array of peers allocated for this host */ + size_t peerCount; /**< number of peers allocated for this host */ + size_t channelLimit; /**< maximum number of channels allowed for connected peers */ + enet_uint32 serviceTime; + ENetList dispatchQueue; + enet_uint32 totalQueued; + size_t packetSize; + enet_uint16 headerFlags; + ENetProtocol commands [ENET_PROTOCOL_MAXIMUM_PACKET_COMMANDS]; + size_t commandCount; + ENetBuffer buffers [ENET_BUFFER_MAXIMUM]; + size_t bufferCount; + ENetChecksumCallback checksum; /**< callback the user can set to enable packet checksums for this host */ + ENetCompressor compressor; + enet_uint8 packetData [2][ENET_PROTOCOL_MAXIMUM_MTU]; + ENetAddress receivedAddress; + enet_uint8 * receivedData; + size_t receivedDataLength; + enet_uint32 totalSentData; /**< total data sent, user should reset to 0 as needed to prevent overflow */ + enet_uint32 totalSentPackets; /**< total UDP packets sent, user should reset to 0 as needed to prevent overflow */ + enet_uint32 totalReceivedData; /**< total data received, user should reset to 0 as needed to prevent overflow */ + enet_uint32 totalReceivedPackets; /**< total UDP packets received, user should reset to 0 as needed to prevent overflow */ + ENetInterceptCallback intercept; /**< callback the user can set to intercept received raw UDP packets */ + size_t connectedPeers; + size_t bandwidthLimitedPeers; + size_t duplicatePeers; /**< optional number of allowed peers from duplicate IPs, defaults to ENET_PROTOCOL_MAXIMUM_PEER_ID */ + size_t maximumPacketSize; /**< the maximum allowable packet size that may be sent or received on a peer */ + size_t maximumWaitingData; /**< the maximum aggregate amount of buffer space a peer may use waiting for packets to be delivered */ +} ENetHost; + +/** + * An ENet event type, as specified in @ref ENetEvent. + */ +typedef enum _ENetEventType +{ + /** no event occurred within the specified time limit */ + ENET_EVENT_TYPE_NONE = 0, + + /** a connection request initiated by enet_host_connect has completed. + * The peer field contains the peer which successfully connected. + */ + ENET_EVENT_TYPE_CONNECT = 1, + + /** a peer has disconnected. This event is generated on a successful + * completion of a disconnect initiated by enet_peer_disconnect, if + * a peer has timed out, or if a connection request intialized by + * enet_host_connect has timed out. The peer field contains the peer + * which disconnected. The data field contains user supplied data + * describing the disconnection, or 0, if none is available. + */ + ENET_EVENT_TYPE_DISCONNECT = 2, + + /** a packet has been received from a peer. The peer field specifies the + * peer which sent the packet. The channelID field specifies the channel + * number upon which the packet was received. The packet field contains + * the packet that was received; this packet must be destroyed with + * enet_packet_destroy after use. + */ + ENET_EVENT_TYPE_RECEIVE = 3 +} ENetEventType; + +/** + * An ENet event as returned by enet_host_service(). + + @sa enet_host_service + */ +typedef struct _ENetEvent +{ + ENetEventType type; /**< type of the event */ + ENetPeer * peer; /**< peer that generated a connect, disconnect or receive event */ + enet_uint8 channelID; /**< channel on the peer that generated the event, if appropriate */ + enet_uint32 data; /**< data associated with the event, if appropriate */ + ENetPacket * packet; /**< packet associated with the event, if appropriate */ +} ENetEvent; + +/** @defgroup global ENet global functions + @{ +*/ + +/** + Initializes ENet globally. Must be called prior to using any functions in + ENet. + @returns 0 on success, < 0 on failure +*/ +ENET_API int enet_initialize (void); + +/** + Initializes ENet globally and supplies user-overridden callbacks. Must be called prior to using any functions in ENet. Do not use enet_initialize() if you use this variant. Make sure the ENetCallbacks structure is zeroed out so that any additional callbacks added in future versions will be properly ignored. + + @param version the constant ENET_VERSION should be supplied so ENet knows which version of ENetCallbacks struct to use + @param inits user-overridden callbacks where any NULL callbacks will use ENet's defaults + @returns 0 on success, < 0 on failure +*/ +ENET_API int enet_initialize_with_callbacks (ENetVersion version, const ENetCallbacks * inits); + +/** + Shuts down ENet globally. Should be called when a program that has + initialized ENet exits. +*/ +ENET_API void enet_deinitialize (void); + +/** + Gives the linked version of the ENet library. + @returns the version number +*/ +ENET_API ENetVersion enet_linked_version (void); + +/** @} */ + +/** @defgroup private ENet private implementation functions */ + +/** + Returns the wall-time in milliseconds. Its initial value is unspecified + unless otherwise set. + */ +ENET_API enet_uint32 enet_time_get (void); +/** + Sets the current wall-time in milliseconds. + */ +ENET_API void enet_time_set (enet_uint32); + +/** @defgroup socket ENet socket functions + @{ +*/ +ENET_API ENetSocket enet_socket_create (ENetSocketType); +ENET_API int enet_socket_bind (ENetSocket, const ENetAddress *); +ENET_API int enet_socket_get_address (ENetSocket, ENetAddress *); +ENET_API int enet_socket_listen (ENetSocket, int); +ENET_API ENetSocket enet_socket_accept (ENetSocket, ENetAddress *); +ENET_API int enet_socket_connect (ENetSocket, const ENetAddress *); +ENET_API int enet_socket_send (ENetSocket, const ENetAddress *, const ENetBuffer *, size_t); +ENET_API int enet_socket_receive (ENetSocket, ENetAddress *, ENetBuffer *, size_t); +ENET_API int enet_socket_wait (ENetSocket, enet_uint32 *, enet_uint32); +ENET_API int enet_socket_set_option (ENetSocket, ENetSocketOption, int); +ENET_API int enet_socket_get_option (ENetSocket, ENetSocketOption, int *); +ENET_API int enet_socket_shutdown (ENetSocket, ENetSocketShutdown); +ENET_API void enet_socket_destroy (ENetSocket); +ENET_API int enet_socketset_select (ENetSocket, ENetSocketSet *, ENetSocketSet *, enet_uint32); + +/** @} */ + +/** @defgroup Address ENet address functions + @{ +*/ + +/** Attempts to parse the printable form of the IP address in the parameter hostName + and sets the host field in the address parameter if successful. + @param address destination to store the parsed IP address + @param hostName IP address to parse + @retval 0 on success + @retval < 0 on failure + @returns the address of the given hostName in address on success +*/ +ENET_API int enet_address_set_host_ip (ENetAddress * address, const char * hostName); + +/** Attempts to resolve the host named by the parameter hostName and sets + the host field in the address parameter if successful. + @param address destination to store resolved address + @param hostName host name to lookup + @retval 0 on success + @retval < 0 on failure + @returns the address of the given hostName in address on success +*/ +ENET_API int enet_address_set_host (ENetAddress * address, const char * hostName); + +/** Gives the printable form of the IP address specified in the address parameter. + @param address address printed + @param hostName destination for name, must not be NULL + @param nameLength maximum length of hostName. + @returns the null-terminated name of the host in hostName on success + @retval 0 on success + @retval < 0 on failure +*/ +ENET_API int enet_address_get_host_ip (const ENetAddress * address, char * hostName, size_t nameLength); + +/** Attempts to do a reverse lookup of the host field in the address parameter. + @param address address used for reverse lookup + @param hostName destination for name, must not be NULL + @param nameLength maximum length of hostName. + @returns the null-terminated name of the host in hostName on success + @retval 0 on success + @retval < 0 on failure +*/ +ENET_API int enet_address_get_host (const ENetAddress * address, char * hostName, size_t nameLength); + +/** @} */ + +ENET_API ENetPacket * enet_packet_create (const void *, size_t, enet_uint32); +ENET_API void enet_packet_destroy (ENetPacket *); +ENET_API int enet_packet_resize (ENetPacket *, size_t); +ENET_API enet_uint32 enet_crc32 (const ENetBuffer *, size_t); + +ENET_API ENetHost * enet_host_create (const ENetAddress *, size_t, size_t, enet_uint32, enet_uint32); +ENET_API void enet_host_destroy (ENetHost *); +ENET_API ENetPeer * enet_host_connect (ENetHost *, const ENetAddress *, size_t, enet_uint32); +ENET_API int enet_host_check_events (ENetHost *, ENetEvent *); +ENET_API int enet_host_service (ENetHost *, ENetEvent *, enet_uint32); +ENET_API void enet_host_flush (ENetHost *); +ENET_API void enet_host_broadcast (ENetHost *, enet_uint8, ENetPacket *); +ENET_API void enet_host_compress (ENetHost *, const ENetCompressor *); +ENET_API int enet_host_compress_with_range_coder (ENetHost * host); +ENET_API void enet_host_channel_limit (ENetHost *, size_t); +ENET_API void enet_host_bandwidth_limit (ENetHost *, enet_uint32, enet_uint32); +extern void enet_host_bandwidth_throttle (ENetHost *); +extern enet_uint32 enet_host_random_seed (void); +extern enet_uint32 enet_host_random (ENetHost *); + +ENET_API int enet_peer_send (ENetPeer *, enet_uint8, ENetPacket *); +ENET_API ENetPacket * enet_peer_receive (ENetPeer *, enet_uint8 * channelID); +ENET_API void enet_peer_ping (ENetPeer *); +ENET_API void enet_peer_ping_interval (ENetPeer *, enet_uint32); +ENET_API void enet_peer_timeout (ENetPeer *, enet_uint32, enet_uint32, enet_uint32); +ENET_API void enet_peer_reset (ENetPeer *); +ENET_API void enet_peer_disconnect (ENetPeer *, enet_uint32); +ENET_API void enet_peer_disconnect_now (ENetPeer *, enet_uint32); +ENET_API void enet_peer_disconnect_later (ENetPeer *, enet_uint32); +ENET_API void enet_peer_throttle_configure (ENetPeer *, enet_uint32, enet_uint32, enet_uint32); +extern int enet_peer_throttle (ENetPeer *, enet_uint32); +extern void enet_peer_reset_queues (ENetPeer *); +extern int enet_peer_has_outgoing_commands (ENetPeer *); +extern void enet_peer_setup_outgoing_command (ENetPeer *, ENetOutgoingCommand *); +extern ENetOutgoingCommand * enet_peer_queue_outgoing_command (ENetPeer *, const ENetProtocol *, ENetPacket *, enet_uint32, enet_uint16); +extern ENetIncomingCommand * enet_peer_queue_incoming_command (ENetPeer *, const ENetProtocol *, const void *, size_t, enet_uint32, enet_uint32); +extern ENetAcknowledgement * enet_peer_queue_acknowledgement (ENetPeer *, const ENetProtocol *, enet_uint16); +extern void enet_peer_dispatch_incoming_unreliable_commands (ENetPeer *, ENetChannel *, ENetIncomingCommand *); +extern void enet_peer_dispatch_incoming_reliable_commands (ENetPeer *, ENetChannel *, ENetIncomingCommand *); +extern void enet_peer_on_connect (ENetPeer *); +extern void enet_peer_on_disconnect (ENetPeer *); + +ENET_API void * enet_range_coder_create (void); +ENET_API void enet_range_coder_destroy (void *); +ENET_API size_t enet_range_coder_compress (void *, const ENetBuffer *, size_t, size_t, enet_uint8 *, size_t); +ENET_API size_t enet_range_coder_decompress (void *, const enet_uint8 *, size_t, enet_uint8 *, size_t); + +extern size_t enet_protocol_command_size (enet_uint8); + +#ifdef __cplusplus +} +#endif + +#endif /* __ENET_ENET_H__ */ + diff --git a/thirdparty/enet/include/enet/list.h b/thirdparty/enet/include/enet/list.h new file mode 100644 index 0000000..d7b2600 --- /dev/null +++ b/thirdparty/enet/include/enet/list.h @@ -0,0 +1,43 @@ +/** + @file list.h + @brief ENet list management +*/ +#ifndef __ENET_LIST_H__ +#define __ENET_LIST_H__ + +#include + +typedef struct _ENetListNode +{ + struct _ENetListNode * next; + struct _ENetListNode * previous; +} ENetListNode; + +typedef ENetListNode * ENetListIterator; + +typedef struct _ENetList +{ + ENetListNode sentinel; +} ENetList; + +extern void enet_list_clear (ENetList *); + +extern ENetListIterator enet_list_insert (ENetListIterator, void *); +extern void * enet_list_remove (ENetListIterator); +extern ENetListIterator enet_list_move (ENetListIterator, void *, void *); + +extern size_t enet_list_size (ENetList *); + +#define enet_list_begin(list) ((list) -> sentinel.next) +#define enet_list_end(list) (& (list) -> sentinel) + +#define enet_list_empty(list) (enet_list_begin (list) == enet_list_end (list)) + +#define enet_list_next(iterator) ((iterator) -> next) +#define enet_list_previous(iterator) ((iterator) -> previous) + +#define enet_list_front(list) ((void *) (list) -> sentinel.next) +#define enet_list_back(list) ((void *) (list) -> sentinel.previous) + +#endif /* __ENET_LIST_H__ */ + diff --git a/thirdparty/enet/include/enet/protocol.h b/thirdparty/enet/include/enet/protocol.h new file mode 100644 index 0000000..f8c73d8 --- /dev/null +++ b/thirdparty/enet/include/enet/protocol.h @@ -0,0 +1,198 @@ +/** + @file protocol.h + @brief ENet protocol +*/ +#ifndef __ENET_PROTOCOL_H__ +#define __ENET_PROTOCOL_H__ + +#include "enet/types.h" + +enum +{ + ENET_PROTOCOL_MINIMUM_MTU = 576, + ENET_PROTOCOL_MAXIMUM_MTU = 4096, + ENET_PROTOCOL_MAXIMUM_PACKET_COMMANDS = 32, + ENET_PROTOCOL_MINIMUM_WINDOW_SIZE = 4096, + ENET_PROTOCOL_MAXIMUM_WINDOW_SIZE = 65536, + ENET_PROTOCOL_MINIMUM_CHANNEL_COUNT = 1, + ENET_PROTOCOL_MAXIMUM_CHANNEL_COUNT = 255, + ENET_PROTOCOL_MAXIMUM_PEER_ID = 0xFFF, + ENET_PROTOCOL_MAXIMUM_FRAGMENT_COUNT = 1024 * 1024 +}; + +typedef enum _ENetProtocolCommand +{ + ENET_PROTOCOL_COMMAND_NONE = 0, + ENET_PROTOCOL_COMMAND_ACKNOWLEDGE = 1, + ENET_PROTOCOL_COMMAND_CONNECT = 2, + ENET_PROTOCOL_COMMAND_VERIFY_CONNECT = 3, + ENET_PROTOCOL_COMMAND_DISCONNECT = 4, + ENET_PROTOCOL_COMMAND_PING = 5, + ENET_PROTOCOL_COMMAND_SEND_RELIABLE = 6, + ENET_PROTOCOL_COMMAND_SEND_UNRELIABLE = 7, + ENET_PROTOCOL_COMMAND_SEND_FRAGMENT = 8, + ENET_PROTOCOL_COMMAND_SEND_UNSEQUENCED = 9, + ENET_PROTOCOL_COMMAND_BANDWIDTH_LIMIT = 10, + ENET_PROTOCOL_COMMAND_THROTTLE_CONFIGURE = 11, + ENET_PROTOCOL_COMMAND_SEND_UNRELIABLE_FRAGMENT = 12, + ENET_PROTOCOL_COMMAND_COUNT = 13, + + ENET_PROTOCOL_COMMAND_MASK = 0x0F +} ENetProtocolCommand; + +typedef enum _ENetProtocolFlag +{ + ENET_PROTOCOL_COMMAND_FLAG_ACKNOWLEDGE = (1 << 7), + ENET_PROTOCOL_COMMAND_FLAG_UNSEQUENCED = (1 << 6), + + ENET_PROTOCOL_HEADER_FLAG_COMPRESSED = (1 << 14), + ENET_PROTOCOL_HEADER_FLAG_SENT_TIME = (1 << 15), + ENET_PROTOCOL_HEADER_FLAG_MASK = ENET_PROTOCOL_HEADER_FLAG_COMPRESSED | ENET_PROTOCOL_HEADER_FLAG_SENT_TIME, + + ENET_PROTOCOL_HEADER_SESSION_MASK = (3 << 12), + ENET_PROTOCOL_HEADER_SESSION_SHIFT = 12 +} ENetProtocolFlag; + +#ifdef _MSC_VER +#pragma pack(push, 1) +#define ENET_PACKED +#elif defined(__GNUC__) || defined(__clang__) +#define ENET_PACKED __attribute__ ((packed)) +#else +#define ENET_PACKED +#endif + +typedef struct _ENetProtocolHeader +{ + enet_uint16 peerID; + enet_uint16 sentTime; +} ENET_PACKED ENetProtocolHeader; + +typedef struct _ENetProtocolCommandHeader +{ + enet_uint8 command; + enet_uint8 channelID; + enet_uint16 reliableSequenceNumber; +} ENET_PACKED ENetProtocolCommandHeader; + +typedef struct _ENetProtocolAcknowledge +{ + ENetProtocolCommandHeader header; + enet_uint16 receivedReliableSequenceNumber; + enet_uint16 receivedSentTime; +} ENET_PACKED ENetProtocolAcknowledge; + +typedef struct _ENetProtocolConnect +{ + ENetProtocolCommandHeader header; + enet_uint16 outgoingPeerID; + enet_uint8 incomingSessionID; + enet_uint8 outgoingSessionID; + enet_uint32 mtu; + enet_uint32 windowSize; + enet_uint32 channelCount; + enet_uint32 incomingBandwidth; + enet_uint32 outgoingBandwidth; + enet_uint32 packetThrottleInterval; + enet_uint32 packetThrottleAcceleration; + enet_uint32 packetThrottleDeceleration; + enet_uint32 connectID; + enet_uint32 data; +} ENET_PACKED ENetProtocolConnect; + +typedef struct _ENetProtocolVerifyConnect +{ + ENetProtocolCommandHeader header; + enet_uint16 outgoingPeerID; + enet_uint8 incomingSessionID; + enet_uint8 outgoingSessionID; + enet_uint32 mtu; + enet_uint32 windowSize; + enet_uint32 channelCount; + enet_uint32 incomingBandwidth; + enet_uint32 outgoingBandwidth; + enet_uint32 packetThrottleInterval; + enet_uint32 packetThrottleAcceleration; + enet_uint32 packetThrottleDeceleration; + enet_uint32 connectID; +} ENET_PACKED ENetProtocolVerifyConnect; + +typedef struct _ENetProtocolBandwidthLimit +{ + ENetProtocolCommandHeader header; + enet_uint32 incomingBandwidth; + enet_uint32 outgoingBandwidth; +} ENET_PACKED ENetProtocolBandwidthLimit; + +typedef struct _ENetProtocolThrottleConfigure +{ + ENetProtocolCommandHeader header; + enet_uint32 packetThrottleInterval; + enet_uint32 packetThrottleAcceleration; + enet_uint32 packetThrottleDeceleration; +} ENET_PACKED ENetProtocolThrottleConfigure; + +typedef struct _ENetProtocolDisconnect +{ + ENetProtocolCommandHeader header; + enet_uint32 data; +} ENET_PACKED ENetProtocolDisconnect; + +typedef struct _ENetProtocolPing +{ + ENetProtocolCommandHeader header; +} ENET_PACKED ENetProtocolPing; + +typedef struct _ENetProtocolSendReliable +{ + ENetProtocolCommandHeader header; + enet_uint16 dataLength; +} ENET_PACKED ENetProtocolSendReliable; + +typedef struct _ENetProtocolSendUnreliable +{ + ENetProtocolCommandHeader header; + enet_uint16 unreliableSequenceNumber; + enet_uint16 dataLength; +} ENET_PACKED ENetProtocolSendUnreliable; + +typedef struct _ENetProtocolSendUnsequenced +{ + ENetProtocolCommandHeader header; + enet_uint16 unsequencedGroup; + enet_uint16 dataLength; +} ENET_PACKED ENetProtocolSendUnsequenced; + +typedef struct _ENetProtocolSendFragment +{ + ENetProtocolCommandHeader header; + enet_uint16 startSequenceNumber; + enet_uint16 dataLength; + enet_uint32 fragmentCount; + enet_uint32 fragmentNumber; + enet_uint32 totalLength; + enet_uint32 fragmentOffset; +} ENET_PACKED ENetProtocolSendFragment; + +typedef union _ENetProtocol +{ + ENetProtocolCommandHeader header; + ENetProtocolAcknowledge acknowledge; + ENetProtocolConnect connect; + ENetProtocolVerifyConnect verifyConnect; + ENetProtocolDisconnect disconnect; + ENetProtocolPing ping; + ENetProtocolSendReliable sendReliable; + ENetProtocolSendUnreliable sendUnreliable; + ENetProtocolSendUnsequenced sendUnsequenced; + ENetProtocolSendFragment sendFragment; + ENetProtocolBandwidthLimit bandwidthLimit; + ENetProtocolThrottleConfigure throttleConfigure; +} ENET_PACKED ENetProtocol; + +#ifdef _MSC_VER +#pragma pack(pop) +#endif + +#endif /* __ENET_PROTOCOL_H__ */ + diff --git a/thirdparty/enet/include/enet/time.h b/thirdparty/enet/include/enet/time.h new file mode 100644 index 0000000..c82a546 --- /dev/null +++ b/thirdparty/enet/include/enet/time.h @@ -0,0 +1,18 @@ +/** + @file time.h + @brief ENet time constants and macros +*/ +#ifndef __ENET_TIME_H__ +#define __ENET_TIME_H__ + +#define ENET_TIME_OVERFLOW 86400000 + +#define ENET_TIME_LESS(a, b) ((a) - (b) >= ENET_TIME_OVERFLOW) +#define ENET_TIME_GREATER(a, b) ((b) - (a) >= ENET_TIME_OVERFLOW) +#define ENET_TIME_LESS_EQUAL(a, b) (! ENET_TIME_GREATER (a, b)) +#define ENET_TIME_GREATER_EQUAL(a, b) (! ENET_TIME_LESS (a, b)) + +#define ENET_TIME_DIFFERENCE(a, b) ((a) - (b) >= ENET_TIME_OVERFLOW ? (b) - (a) : (a) - (b)) + +#endif /* __ENET_TIME_H__ */ + diff --git a/thirdparty/enet/include/enet/types.h b/thirdparty/enet/include/enet/types.h new file mode 100644 index 0000000..ab010a4 --- /dev/null +++ b/thirdparty/enet/include/enet/types.h @@ -0,0 +1,13 @@ +/** + @file types.h + @brief type definitions for ENet +*/ +#ifndef __ENET_TYPES_H__ +#define __ENET_TYPES_H__ + +typedef unsigned char enet_uint8; /**< unsigned 8-bit type */ +typedef unsigned short enet_uint16; /**< unsigned 16-bit type */ +typedef unsigned int enet_uint32; /**< unsigned 32-bit type */ + +#endif /* __ENET_TYPES_H__ */ + diff --git a/thirdparty/enet/include/enet/unix.h b/thirdparty/enet/include/enet/unix.h new file mode 100644 index 0000000..b55be33 --- /dev/null +++ b/thirdparty/enet/include/enet/unix.h @@ -0,0 +1,48 @@ +/** + @file unix.h + @brief ENet Unix header +*/ +#ifndef __ENET_UNIX_H__ +#define __ENET_UNIX_H__ + +#include +#include +#include +#include +#include +#include +#include + +#ifdef MSG_MAXIOVLEN +#define ENET_BUFFER_MAXIMUM MSG_MAXIOVLEN +#endif + +typedef int ENetSocket; + +#define ENET_SOCKET_NULL -1 + +#define ENET_HOST_TO_NET_16(value) (htons (value)) /**< macro that converts host to net byte-order of a 16-bit value */ +#define ENET_HOST_TO_NET_32(value) (htonl (value)) /**< macro that converts host to net byte-order of a 32-bit value */ + +#define ENET_NET_TO_HOST_16(value) (ntohs (value)) /**< macro that converts net to host byte-order of a 16-bit value */ +#define ENET_NET_TO_HOST_32(value) (ntohl (value)) /**< macro that converts net to host byte-order of a 32-bit value */ + +typedef struct +{ + void * data; + size_t dataLength; +} ENetBuffer; + +#define ENET_CALLBACK + +#define ENET_API extern + +typedef fd_set ENetSocketSet; + +#define ENET_SOCKETSET_EMPTY(sockset) FD_ZERO (& (sockset)) +#define ENET_SOCKETSET_ADD(sockset, socket) FD_SET (socket, & (sockset)) +#define ENET_SOCKETSET_REMOVE(sockset, socket) FD_CLR (socket, & (sockset)) +#define ENET_SOCKETSET_CHECK(sockset, socket) FD_ISSET (socket, & (sockset)) + +#endif /* __ENET_UNIX_H__ */ + diff --git a/thirdparty/enet/include/enet/utility.h b/thirdparty/enet/include/enet/utility.h new file mode 100644 index 0000000..b04bb7a --- /dev/null +++ b/thirdparty/enet/include/enet/utility.h @@ -0,0 +1,13 @@ +/** + @file utility.h + @brief ENet utility header +*/ +#ifndef __ENET_UTILITY_H__ +#define __ENET_UTILITY_H__ + +#define ENET_MAX(x, y) ((x) > (y) ? (x) : (y)) +#define ENET_MIN(x, y) ((x) < (y) ? (x) : (y)) +#define ENET_DIFFERENCE(x, y) ((x) < (y) ? (y) - (x) : (x) - (y)) + +#endif /* __ENET_UTILITY_H__ */ + diff --git a/thirdparty/enet/include/enet/win32.h b/thirdparty/enet/include/enet/win32.h new file mode 100644 index 0000000..6fbd7c0 --- /dev/null +++ b/thirdparty/enet/include/enet/win32.h @@ -0,0 +1,59 @@ +/** + @file win32.h + @brief ENet Win32 header +*/ +#ifndef __ENET_WIN32_H__ +#define __ENET_WIN32_H__ + +#ifdef _MSC_VER +#ifdef ENET_BUILDING_LIB +#pragma warning (disable: 4267) // size_t to int conversion +#pragma warning (disable: 4244) // 64bit to 32bit int +#pragma warning (disable: 4018) // signed/unsigned mismatch +#pragma warning (disable: 4146) // unary minus operator applied to unsigned type +#define _CRT_SECURE_NO_DEPRECATE +#define _CRT_SECURE_NO_WARNINGS +#endif +#endif + +#include +#include + +typedef SOCKET ENetSocket; + +#define ENET_SOCKET_NULL INVALID_SOCKET + +#define ENET_HOST_TO_NET_16(value) (htons (value)) +#define ENET_HOST_TO_NET_32(value) (htonl (value)) + +#define ENET_NET_TO_HOST_16(value) (ntohs (value)) +#define ENET_NET_TO_HOST_32(value) (ntohl (value)) + +typedef struct +{ + size_t dataLength; + void * data; +} ENetBuffer; + +#define ENET_CALLBACK __cdecl + +#ifdef ENET_DLL +#ifdef ENET_BUILDING_LIB +#define ENET_API __declspec( dllexport ) +#else +#define ENET_API __declspec( dllimport ) +#endif /* ENET_BUILDING_LIB */ +#else /* !ENET_DLL */ +#define ENET_API extern +#endif /* ENET_DLL */ + +typedef fd_set ENetSocketSet; + +#define ENET_SOCKETSET_EMPTY(sockset) FD_ZERO (& (sockset)) +#define ENET_SOCKETSET_ADD(sockset, socket) FD_SET (socket, & (sockset)) +#define ENET_SOCKETSET_REMOVE(sockset, socket) FD_CLR (socket, & (sockset)) +#define ENET_SOCKETSET_CHECK(sockset, socket) FD_ISSET (socket, & (sockset)) + +#endif /* __ENET_WIN32_H__ */ + + diff --git a/thirdparty/enet/libenet.pc.in b/thirdparty/enet/libenet.pc.in new file mode 100644 index 0000000..7af85ad --- /dev/null +++ b/thirdparty/enet/libenet.pc.in @@ -0,0 +1,10 @@ +prefix=@prefix@ +exec_prefix=@exec_prefix@ +libdir=@libdir@ +includedir=@includedir@ + +Name: @PACKAGE_NAME@ +Description: Low-latency UDP networking library supporting optional reliability +Version: @PACKAGE_VERSION@ +Cflags: -I${includedir} +Libs: -L${libdir} -lenet diff --git a/thirdparty/enet/list.c b/thirdparty/enet/list.c new file mode 100644 index 0000000..1c1a8df --- /dev/null +++ b/thirdparty/enet/list.c @@ -0,0 +1,75 @@ +/** + @file list.c + @brief ENet linked list functions +*/ +#define ENET_BUILDING_LIB 1 +#include "enet/enet.h" + +/** + @defgroup list ENet linked list utility functions + @ingroup private + @{ +*/ +void +enet_list_clear (ENetList * list) +{ + list -> sentinel.next = & list -> sentinel; + list -> sentinel.previous = & list -> sentinel; +} + +ENetListIterator +enet_list_insert (ENetListIterator position, void * data) +{ + ENetListIterator result = (ENetListIterator) data; + + result -> previous = position -> previous; + result -> next = position; + + result -> previous -> next = result; + position -> previous = result; + + return result; +} + +void * +enet_list_remove (ENetListIterator position) +{ + position -> previous -> next = position -> next; + position -> next -> previous = position -> previous; + + return position; +} + +ENetListIterator +enet_list_move (ENetListIterator position, void * dataFirst, void * dataLast) +{ + ENetListIterator first = (ENetListIterator) dataFirst, + last = (ENetListIterator) dataLast; + + first -> previous -> next = last -> next; + last -> next -> previous = first -> previous; + + first -> previous = position -> previous; + last -> next = position; + + first -> previous -> next = first; + position -> previous = last; + + return first; +} + +size_t +enet_list_size (ENetList * list) +{ + size_t size = 0; + ENetListIterator position; + + for (position = enet_list_begin (list); + position != enet_list_end (list); + position = enet_list_next (position)) + ++ size; + + return size; +} + +/** @} */ diff --git a/thirdparty/enet/m4/.keep b/thirdparty/enet/m4/.keep new file mode 100644 index 0000000..e69de29 diff --git a/thirdparty/enet/packet.c b/thirdparty/enet/packet.c new file mode 100644 index 0000000..d51c640 --- /dev/null +++ b/thirdparty/enet/packet.c @@ -0,0 +1,158 @@ +/** + @file packet.c + @brief ENet packet management functions +*/ +#include +#define ENET_BUILDING_LIB 1 +#include "enet/enet.h" + +/** @defgroup Packet ENet packet functions + @{ +*/ + +/** Creates a packet that may be sent to a peer. + @param data initial contents of the packet's data; the packet's data will remain uninitialized if data is NULL. + @param dataLength size of the data allocated for this packet + @param flags flags for this packet as described for the ENetPacket structure. + @returns the packet on success, NULL on failure +*/ +ENetPacket * +enet_packet_create (const void * data, size_t dataLength, enet_uint32 flags) +{ + ENetPacket * packet = (ENetPacket *) enet_malloc (sizeof (ENetPacket)); + if (packet == NULL) + return NULL; + + if (flags & ENET_PACKET_FLAG_NO_ALLOCATE) + packet -> data = (enet_uint8 *) data; + else + if (dataLength <= 0) + packet -> data = NULL; + else + { + packet -> data = (enet_uint8 *) enet_malloc (dataLength); + if (packet -> data == NULL) + { + enet_free (packet); + return NULL; + } + + if (data != NULL) + memcpy (packet -> data, data, dataLength); + } + + packet -> referenceCount = 0; + packet -> flags = flags; + packet -> dataLength = dataLength; + packet -> freeCallback = NULL; + packet -> userData = NULL; + + return packet; +} + +/** Destroys the packet and deallocates its data. + @param packet packet to be destroyed +*/ +void +enet_packet_destroy (ENetPacket * packet) +{ + if (packet == NULL) + return; + + if (packet -> freeCallback != NULL) + (* packet -> freeCallback) (packet); + if (! (packet -> flags & ENET_PACKET_FLAG_NO_ALLOCATE) && + packet -> data != NULL) + enet_free (packet -> data); + enet_free (packet); +} + +/** Attempts to resize the data in the packet to length specified in the + dataLength parameter + @param packet packet to resize + @param dataLength new size for the packet data + @returns 0 on success, < 0 on failure +*/ +int +enet_packet_resize (ENetPacket * packet, size_t dataLength) +{ + enet_uint8 * newData; + + if (dataLength <= packet -> dataLength || (packet -> flags & ENET_PACKET_FLAG_NO_ALLOCATE)) + { + packet -> dataLength = dataLength; + + return 0; + } + + newData = (enet_uint8 *) enet_malloc (dataLength); + if (newData == NULL) + return -1; + + memcpy (newData, packet -> data, packet -> dataLength); + enet_free (packet -> data); + + packet -> data = newData; + packet -> dataLength = dataLength; + + return 0; +} + +static const enet_uint32 crcTable [256] = +{ + 0, 0x77073096, 0xEE0E612C, 0x990951BA, 0x076DC419, 0x706AF48F, 0xE963A535, 0x9E6495A3, + 0x0EDB8832, 0x79DCB8A4, 0xE0D5E91E, 0x97D2D988, 0x09B64C2B, 0x7EB17CBD, 0xE7B82D07, 0x90BF1D91, + 0x1DB71064, 0x6AB020F2, 0xF3B97148, 0x84BE41DE, 0x1ADAD47D, 0x6DDDE4EB, 0xF4D4B551, 0x83D385C7, + 0x136C9856, 0x646BA8C0, 0xFD62F97A, 0x8A65C9EC, 0x14015C4F, 0x63066CD9, 0xFA0F3D63, 0x8D080DF5, + 0x3B6E20C8, 0x4C69105E, 0xD56041E4, 0xA2677172, 0x3C03E4D1, 0x4B04D447, 0xD20D85FD, 0xA50AB56B, + 0x35B5A8FA, 0x42B2986C, 0xDBBBC9D6, 0xACBCF940, 0x32D86CE3, 0x45DF5C75, 0xDCD60DCF, 0xABD13D59, + 0x26D930AC, 0x51DE003A, 0xC8D75180, 0xBFD06116, 0x21B4F4B5, 0x56B3C423, 0xCFBA9599, 0xB8BDA50F, + 0x2802B89E, 0x5F058808, 0xC60CD9B2, 0xB10BE924, 0x2F6F7C87, 0x58684C11, 0xC1611DAB, 0xB6662D3D, + 0x76DC4190, 0x01DB7106, 0x98D220BC, 0xEFD5102A, 0x71B18589, 0x06B6B51F, 0x9FBFE4A5, 0xE8B8D433, + 0x7807C9A2, 0x0F00F934, 0x9609A88E, 0xE10E9818, 0x7F6A0DBB, 0x086D3D2D, 0x91646C97, 0xE6635C01, + 0x6B6B51F4, 0x1C6C6162, 0x856530D8, 0xF262004E, 0x6C0695ED, 0x1B01A57B, 0x8208F4C1, 0xF50FC457, + 0x65B0D9C6, 0x12B7E950, 0x8BBEB8EA, 0xFCB9887C, 0x62DD1DDF, 0x15DA2D49, 0x8CD37CF3, 0xFBD44C65, + 0x4DB26158, 0x3AB551CE, 0xA3BC0074, 0xD4BB30E2, 0x4ADFA541, 0x3DD895D7, 0xA4D1C46D, 0xD3D6F4FB, + 0x4369E96A, 0x346ED9FC, 0xAD678846, 0xDA60B8D0, 0x44042D73, 0x33031DE5, 0xAA0A4C5F, 0xDD0D7CC9, + 0x5005713C, 0x270241AA, 0xBE0B1010, 0xC90C2086, 0x5768B525, 0x206F85B3, 0xB966D409, 0xCE61E49F, + 0x5EDEF90E, 0x29D9C998, 0xB0D09822, 0xC7D7A8B4, 0x59B33D17, 0x2EB40D81, 0xB7BD5C3B, 0xC0BA6CAD, + 0xEDB88320, 0x9ABFB3B6, 0x03B6E20C, 0x74B1D29A, 0xEAD54739, 0x9DD277AF, 0x04DB2615, 0x73DC1683, + 0xE3630B12, 0x94643B84, 0x0D6D6A3E, 0x7A6A5AA8, 0xE40ECF0B, 0x9309FF9D, 0x0A00AE27, 0x7D079EB1, + 0xF00F9344, 0x8708A3D2, 0x1E01F268, 0x6906C2FE, 0xF762575D, 0x806567CB, 0x196C3671, 0x6E6B06E7, + 0xFED41B76, 0x89D32BE0, 0x10DA7A5A, 0x67DD4ACC, 0xF9B9DF6F, 0x8EBEEFF9, 0x17B7BE43, 0x60B08ED5, + 0xD6D6A3E8, 0xA1D1937E, 0x38D8C2C4, 0x4FDFF252, 0xD1BB67F1, 0xA6BC5767, 0x3FB506DD, 0x48B2364B, + 0xD80D2BDA, 0xAF0A1B4C, 0x36034AF6, 0x41047A60, 0xDF60EFC3, 0xA867DF55, 0x316E8EEF, 0x4669BE79, + 0xCB61B38C, 0xBC66831A, 0x256FD2A0, 0x5268E236, 0xCC0C7795, 0xBB0B4703, 0x220216B9, 0x5505262F, + 0xC5BA3BBE, 0xB2BD0B28, 0x2BB45A92, 0x5CB36A04, 0xC2D7FFA7, 0xB5D0CF31, 0x2CD99E8B, 0x5BDEAE1D, + 0x9B64C2B0, 0xEC63F226, 0x756AA39C, 0x026D930A, 0x9C0906A9, 0xEB0E363F, 0x72076785, 0x5005713, + 0x95BF4A82, 0xE2B87A14, 0x7BB12BAE, 0x0CB61B38, 0x92D28E9B, 0xE5D5BE0D, 0x7CDCEFB7, 0xBDBDF21, + 0x86D3D2D4, 0xF1D4E242, 0x68DDB3F8, 0x1FDA836E, 0x81BE16CD, 0xF6B9265B, 0x6FB077E1, 0x18B74777, + 0x88085AE6, 0xFF0F6A70, 0x66063BCA, 0x11010B5C, 0x8F659EFF, 0xF862AE69, 0x616BFFD3, 0x166CCF45, + 0xA00AE278, 0xD70DD2EE, 0x4E048354, 0x3903B3C2, 0xA7672661, 0xD06016F7, 0x4969474D, 0x3E6E77DB, + 0xAED16A4A, 0xD9D65ADC, 0x40DF0B66, 0x37D83BF0, 0xA9BCAE53, 0xDEBB9EC5, 0x47B2CF7F, 0x30B5FFE9, + 0xBDBDF21C, 0xCABAC28A, 0x53B39330, 0x24B4A3A6, 0xBAD03605, 0xCDD70693, 0x54DE5729, 0x23D967BF, + 0xB3667A2E, 0xC4614AB8, 0x5D681B02, 0x2A6F2B94, 0xB40BBE37, 0xC30C8EA1, 0x5A05DF1B, 0x2D02EF8D +}; + +enet_uint32 +enet_crc32 (const ENetBuffer * buffers, size_t bufferCount) +{ + enet_uint32 crc = 0xFFFFFFFF; + + while (bufferCount -- > 0) + { + const enet_uint8 * data = (const enet_uint8 *) buffers -> data, + * dataEnd = & data [buffers -> dataLength]; + + while (data < dataEnd) + { + crc = (crc >> 8) ^ crcTable [(crc & 0xFF) ^ *data++]; + } + + ++ buffers; + } + + return ENET_HOST_TO_NET_32 (~ crc); +} + +/** @} */ diff --git a/thirdparty/enet/peer.c b/thirdparty/enet/peer.c new file mode 100644 index 0000000..a7ac012 --- /dev/null +++ b/thirdparty/enet/peer.c @@ -0,0 +1,1027 @@ +/** + @file peer.c + @brief ENet peer management functions +*/ +#include +#define ENET_BUILDING_LIB 1 +#include "enet/enet.h" + +/** @defgroup peer ENet peer functions + @{ +*/ + +/** Configures throttle parameter for a peer. + + Unreliable packets are dropped by ENet in response to the varying conditions + of the Internet connection to the peer. The throttle represents a probability + that an unreliable packet should not be dropped and thus sent by ENet to the peer. + The lowest mean round trip time from the sending of a reliable packet to the + receipt of its acknowledgement is measured over an amount of time specified by + the interval parameter in milliseconds. If a measured round trip time happens to + be significantly less than the mean round trip time measured over the interval, + then the throttle probability is increased to allow more traffic by an amount + specified in the acceleration parameter, which is a ratio to the ENET_PEER_PACKET_THROTTLE_SCALE + constant. If a measured round trip time happens to be significantly greater than + the mean round trip time measured over the interval, then the throttle probability + is decreased to limit traffic by an amount specified in the deceleration parameter, which + is a ratio to the ENET_PEER_PACKET_THROTTLE_SCALE constant. When the throttle has + a value of ENET_PEER_PACKET_THROTTLE_SCALE, no unreliable packets are dropped by + ENet, and so 100% of all unreliable packets will be sent. When the throttle has a + value of 0, all unreliable packets are dropped by ENet, and so 0% of all unreliable + packets will be sent. Intermediate values for the throttle represent intermediate + probabilities between 0% and 100% of unreliable packets being sent. The bandwidth + limits of the local and foreign hosts are taken into account to determine a + sensible limit for the throttle probability above which it should not raise even in + the best of conditions. + + @param peer peer to configure + @param interval interval, in milliseconds, over which to measure lowest mean RTT; the default value is ENET_PEER_PACKET_THROTTLE_INTERVAL. + @param acceleration rate at which to increase the throttle probability as mean RTT declines + @param deceleration rate at which to decrease the throttle probability as mean RTT increases +*/ +void +enet_peer_throttle_configure (ENetPeer * peer, enet_uint32 interval, enet_uint32 acceleration, enet_uint32 deceleration) +{ + ENetProtocol command; + + peer -> packetThrottleInterval = interval; + peer -> packetThrottleAcceleration = acceleration; + peer -> packetThrottleDeceleration = deceleration; + + command.header.command = ENET_PROTOCOL_COMMAND_THROTTLE_CONFIGURE | ENET_PROTOCOL_COMMAND_FLAG_ACKNOWLEDGE; + command.header.channelID = 0xFF; + + command.throttleConfigure.packetThrottleInterval = ENET_HOST_TO_NET_32 (interval); + command.throttleConfigure.packetThrottleAcceleration = ENET_HOST_TO_NET_32 (acceleration); + command.throttleConfigure.packetThrottleDeceleration = ENET_HOST_TO_NET_32 (deceleration); + + enet_peer_queue_outgoing_command (peer, & command, NULL, 0, 0); +} + +int +enet_peer_throttle (ENetPeer * peer, enet_uint32 rtt) +{ + if (peer -> lastRoundTripTime <= peer -> lastRoundTripTimeVariance) + { + peer -> packetThrottle = peer -> packetThrottleLimit; + } + else + if (rtt <= peer -> lastRoundTripTime) + { + peer -> packetThrottle += peer -> packetThrottleAcceleration; + + if (peer -> packetThrottle > peer -> packetThrottleLimit) + peer -> packetThrottle = peer -> packetThrottleLimit; + + return 1; + } + else + if (rtt > peer -> lastRoundTripTime + 2 * peer -> lastRoundTripTimeVariance) + { + if (peer -> packetThrottle > peer -> packetThrottleDeceleration) + peer -> packetThrottle -= peer -> packetThrottleDeceleration; + else + peer -> packetThrottle = 0; + + return -1; + } + + return 0; +} + +/** Queues a packet to be sent. + + On success, ENet will assume ownership of the packet, and so enet_packet_destroy + should not be called on it thereafter. On failure, the caller still must destroy + the packet on its own as ENet has not queued the packet. The caller can also + check the packet's referenceCount field after sending to check if ENet queued + the packet and thus incremented the referenceCount. + + @param peer destination for the packet + @param channelID channel on which to send + @param packet packet to send + @retval 0 on success + @retval < 0 on failure +*/ +int +enet_peer_send (ENetPeer * peer, enet_uint8 channelID, ENetPacket * packet) +{ + ENetChannel * channel; + ENetProtocol command; + size_t fragmentLength; + + if (peer -> state != ENET_PEER_STATE_CONNECTED || + channelID >= peer -> channelCount || + packet -> dataLength > peer -> host -> maximumPacketSize) + return -1; + + channel = & peer -> channels [channelID]; + fragmentLength = peer -> mtu - sizeof (ENetProtocolHeader) - sizeof (ENetProtocolSendFragment); + if (peer -> host -> checksum != NULL) + fragmentLength -= sizeof(enet_uint32); + + if (packet -> dataLength > fragmentLength) + { + enet_uint32 fragmentCount = (packet -> dataLength + fragmentLength - 1) / fragmentLength, + fragmentNumber, + fragmentOffset; + enet_uint8 commandNumber; + enet_uint16 startSequenceNumber; + ENetList fragments; + ENetOutgoingCommand * fragment; + + if (fragmentCount > ENET_PROTOCOL_MAXIMUM_FRAGMENT_COUNT) + return -1; + + if ((packet -> flags & (ENET_PACKET_FLAG_RELIABLE | ENET_PACKET_FLAG_UNRELIABLE_FRAGMENT)) == ENET_PACKET_FLAG_UNRELIABLE_FRAGMENT && + channel -> outgoingUnreliableSequenceNumber < 0xFFFF) + { + commandNumber = ENET_PROTOCOL_COMMAND_SEND_UNRELIABLE_FRAGMENT; + startSequenceNumber = ENET_HOST_TO_NET_16 (channel -> outgoingUnreliableSequenceNumber + 1); + } + else + { + commandNumber = ENET_PROTOCOL_COMMAND_SEND_FRAGMENT | ENET_PROTOCOL_COMMAND_FLAG_ACKNOWLEDGE; + startSequenceNumber = ENET_HOST_TO_NET_16 (channel -> outgoingReliableSequenceNumber + 1); + } + + enet_list_clear (& fragments); + + for (fragmentNumber = 0, + fragmentOffset = 0; + fragmentOffset < packet -> dataLength; + ++ fragmentNumber, + fragmentOffset += fragmentLength) + { + if (packet -> dataLength - fragmentOffset < fragmentLength) + fragmentLength = packet -> dataLength - fragmentOffset; + + fragment = (ENetOutgoingCommand *) enet_malloc (sizeof (ENetOutgoingCommand)); + if (fragment == NULL) + { + while (! enet_list_empty (& fragments)) + { + fragment = (ENetOutgoingCommand *) enet_list_remove (enet_list_begin (& fragments)); + + enet_free (fragment); + } + + return -1; + } + + fragment -> fragmentOffset = fragmentOffset; + fragment -> fragmentLength = fragmentLength; + fragment -> packet = packet; + fragment -> command.header.command = commandNumber; + fragment -> command.header.channelID = channelID; + fragment -> command.sendFragment.startSequenceNumber = startSequenceNumber; + fragment -> command.sendFragment.dataLength = ENET_HOST_TO_NET_16 (fragmentLength); + fragment -> command.sendFragment.fragmentCount = ENET_HOST_TO_NET_32 (fragmentCount); + fragment -> command.sendFragment.fragmentNumber = ENET_HOST_TO_NET_32 (fragmentNumber); + fragment -> command.sendFragment.totalLength = ENET_HOST_TO_NET_32 (packet -> dataLength); + fragment -> command.sendFragment.fragmentOffset = ENET_NET_TO_HOST_32 (fragmentOffset); + + enet_list_insert (enet_list_end (& fragments), fragment); + } + + packet -> referenceCount += fragmentNumber; + + while (! enet_list_empty (& fragments)) + { + fragment = (ENetOutgoingCommand *) enet_list_remove (enet_list_begin (& fragments)); + + enet_peer_setup_outgoing_command (peer, fragment); + } + + return 0; + } + + command.header.channelID = channelID; + + if ((packet -> flags & (ENET_PACKET_FLAG_RELIABLE | ENET_PACKET_FLAG_UNSEQUENCED)) == ENET_PACKET_FLAG_UNSEQUENCED) + { + command.header.command = ENET_PROTOCOL_COMMAND_SEND_UNSEQUENCED | ENET_PROTOCOL_COMMAND_FLAG_UNSEQUENCED; + command.sendUnsequenced.dataLength = ENET_HOST_TO_NET_16 (packet -> dataLength); + } + else + if (packet -> flags & ENET_PACKET_FLAG_RELIABLE || channel -> outgoingUnreliableSequenceNumber >= 0xFFFF) + { + command.header.command = ENET_PROTOCOL_COMMAND_SEND_RELIABLE | ENET_PROTOCOL_COMMAND_FLAG_ACKNOWLEDGE; + command.sendReliable.dataLength = ENET_HOST_TO_NET_16 (packet -> dataLength); + } + else + { + command.header.command = ENET_PROTOCOL_COMMAND_SEND_UNRELIABLE; + command.sendUnreliable.dataLength = ENET_HOST_TO_NET_16 (packet -> dataLength); + } + + if (enet_peer_queue_outgoing_command (peer, & command, packet, 0, packet -> dataLength) == NULL) + return -1; + + return 0; +} + +/** Attempts to dequeue any incoming queued packet. + @param peer peer to dequeue packets from + @param channelID holds the channel ID of the channel the packet was received on success + @returns a pointer to the packet, or NULL if there are no available incoming queued packets +*/ +ENetPacket * +enet_peer_receive (ENetPeer * peer, enet_uint8 * channelID) +{ + ENetIncomingCommand * incomingCommand; + ENetPacket * packet; + + if (enet_list_empty (& peer -> dispatchedCommands)) + return NULL; + + incomingCommand = (ENetIncomingCommand *) enet_list_remove (enet_list_begin (& peer -> dispatchedCommands)); + + if (channelID != NULL) + * channelID = incomingCommand -> command.header.channelID; + + packet = incomingCommand -> packet; + + -- packet -> referenceCount; + + if (incomingCommand -> fragments != NULL) + enet_free (incomingCommand -> fragments); + + enet_free (incomingCommand); + + peer -> totalWaitingData -= packet -> dataLength; + + return packet; +} + +static void +enet_peer_reset_outgoing_commands (ENetList * queue) +{ + ENetOutgoingCommand * outgoingCommand; + + while (! enet_list_empty (queue)) + { + outgoingCommand = (ENetOutgoingCommand *) enet_list_remove (enet_list_begin (queue)); + + if (outgoingCommand -> packet != NULL) + { + -- outgoingCommand -> packet -> referenceCount; + + if (outgoingCommand -> packet -> referenceCount == 0) + enet_packet_destroy (outgoingCommand -> packet); + } + + enet_free (outgoingCommand); + } +} + +static void +enet_peer_remove_incoming_commands (ENetList * queue, ENetListIterator startCommand, ENetListIterator endCommand, ENetIncomingCommand * excludeCommand) +{ + ENetListIterator currentCommand; + + for (currentCommand = startCommand; currentCommand != endCommand; ) + { + ENetIncomingCommand * incomingCommand = (ENetIncomingCommand *) currentCommand; + + currentCommand = enet_list_next (currentCommand); + + if (incomingCommand == excludeCommand) + continue; + + enet_list_remove (& incomingCommand -> incomingCommandList); + + if (incomingCommand -> packet != NULL) + { + -- incomingCommand -> packet -> referenceCount; + + if (incomingCommand -> packet -> referenceCount == 0) + enet_packet_destroy (incomingCommand -> packet); + } + + if (incomingCommand -> fragments != NULL) + enet_free (incomingCommand -> fragments); + + enet_free (incomingCommand); + } +} + +static void +enet_peer_reset_incoming_commands (ENetList * queue) +{ + enet_peer_remove_incoming_commands(queue, enet_list_begin (queue), enet_list_end (queue), NULL); +} + +void +enet_peer_reset_queues (ENetPeer * peer) +{ + ENetChannel * channel; + + if (peer -> flags & ENET_PEER_FLAG_NEEDS_DISPATCH) + { + enet_list_remove (& peer -> dispatchList); + + peer -> flags &= ~ ENET_PEER_FLAG_NEEDS_DISPATCH; + } + + while (! enet_list_empty (& peer -> acknowledgements)) + enet_free (enet_list_remove (enet_list_begin (& peer -> acknowledgements))); + + enet_peer_reset_outgoing_commands (& peer -> sentReliableCommands); + enet_peer_reset_outgoing_commands (& peer -> outgoingCommands); + enet_peer_reset_outgoing_commands (& peer -> outgoingSendReliableCommands); + enet_peer_reset_incoming_commands (& peer -> dispatchedCommands); + + if (peer -> channels != NULL && peer -> channelCount > 0) + { + for (channel = peer -> channels; + channel < & peer -> channels [peer -> channelCount]; + ++ channel) + { + enet_peer_reset_incoming_commands (& channel -> incomingReliableCommands); + enet_peer_reset_incoming_commands (& channel -> incomingUnreliableCommands); + } + + enet_free (peer -> channels); + } + + peer -> channels = NULL; + peer -> channelCount = 0; +} + +void +enet_peer_on_connect (ENetPeer * peer) +{ + if (peer -> state != ENET_PEER_STATE_CONNECTED && peer -> state != ENET_PEER_STATE_DISCONNECT_LATER) + { + if (peer -> incomingBandwidth != 0) + ++ peer -> host -> bandwidthLimitedPeers; + + ++ peer -> host -> connectedPeers; + } +} + +void +enet_peer_on_disconnect (ENetPeer * peer) +{ + if (peer -> state == ENET_PEER_STATE_CONNECTED || peer -> state == ENET_PEER_STATE_DISCONNECT_LATER) + { + if (peer -> incomingBandwidth != 0) + -- peer -> host -> bandwidthLimitedPeers; + + -- peer -> host -> connectedPeers; + } +} + +/** Forcefully disconnects a peer. + @param peer peer to forcefully disconnect + @remarks The foreign host represented by the peer is not notified of the disconnection and will timeout + on its connection to the local host. +*/ +void +enet_peer_reset (ENetPeer * peer) +{ + enet_peer_on_disconnect (peer); + + peer -> outgoingPeerID = ENET_PROTOCOL_MAXIMUM_PEER_ID; + peer -> connectID = 0; + + peer -> state = ENET_PEER_STATE_DISCONNECTED; + + peer -> incomingBandwidth = 0; + peer -> outgoingBandwidth = 0; + peer -> incomingBandwidthThrottleEpoch = 0; + peer -> outgoingBandwidthThrottleEpoch = 0; + peer -> incomingDataTotal = 0; + peer -> outgoingDataTotal = 0; + peer -> lastSendTime = 0; + peer -> lastReceiveTime = 0; + peer -> nextTimeout = 0; + peer -> earliestTimeout = 0; + peer -> packetLossEpoch = 0; + peer -> packetsSent = 0; + peer -> packetsLost = 0; + peer -> packetLoss = 0; + peer -> packetLossVariance = 0; + peer -> packetThrottle = ENET_PEER_DEFAULT_PACKET_THROTTLE; + peer -> packetThrottleLimit = ENET_PEER_PACKET_THROTTLE_SCALE; + peer -> packetThrottleCounter = 0; + peer -> packetThrottleEpoch = 0; + peer -> packetThrottleAcceleration = ENET_PEER_PACKET_THROTTLE_ACCELERATION; + peer -> packetThrottleDeceleration = ENET_PEER_PACKET_THROTTLE_DECELERATION; + peer -> packetThrottleInterval = ENET_PEER_PACKET_THROTTLE_INTERVAL; + peer -> pingInterval = ENET_PEER_PING_INTERVAL; + peer -> timeoutLimit = ENET_PEER_TIMEOUT_LIMIT; + peer -> timeoutMinimum = ENET_PEER_TIMEOUT_MINIMUM; + peer -> timeoutMaximum = ENET_PEER_TIMEOUT_MAXIMUM; + peer -> lastRoundTripTime = ENET_PEER_DEFAULT_ROUND_TRIP_TIME; + peer -> lowestRoundTripTime = ENET_PEER_DEFAULT_ROUND_TRIP_TIME; + peer -> lastRoundTripTimeVariance = 0; + peer -> highestRoundTripTimeVariance = 0; + peer -> roundTripTime = ENET_PEER_DEFAULT_ROUND_TRIP_TIME; + peer -> roundTripTimeVariance = 0; + peer -> mtu = peer -> host -> mtu; + peer -> reliableDataInTransit = 0; + peer -> outgoingReliableSequenceNumber = 0; + peer -> windowSize = ENET_PROTOCOL_MAXIMUM_WINDOW_SIZE; + peer -> incomingUnsequencedGroup = 0; + peer -> outgoingUnsequencedGroup = 0; + peer -> eventData = 0; + peer -> totalWaitingData = 0; + peer -> flags = 0; + + memset (peer -> unsequencedWindow, 0, sizeof (peer -> unsequencedWindow)); + + enet_peer_reset_queues (peer); +} + +/** Sends a ping request to a peer. + @param peer destination for the ping request + @remarks ping requests factor into the mean round trip time as designated by the + roundTripTime field in the ENetPeer structure. ENet automatically pings all connected + peers at regular intervals, however, this function may be called to ensure more + frequent ping requests. +*/ +void +enet_peer_ping (ENetPeer * peer) +{ + ENetProtocol command; + + if (peer -> state != ENET_PEER_STATE_CONNECTED) + return; + + command.header.command = ENET_PROTOCOL_COMMAND_PING | ENET_PROTOCOL_COMMAND_FLAG_ACKNOWLEDGE; + command.header.channelID = 0xFF; + + enet_peer_queue_outgoing_command (peer, & command, NULL, 0, 0); +} + +/** Sets the interval at which pings will be sent to a peer. + + Pings are used both to monitor the liveness of the connection and also to dynamically + adjust the throttle during periods of low traffic so that the throttle has reasonable + responsiveness during traffic spikes. + + @param peer the peer to adjust + @param pingInterval the interval at which to send pings; defaults to ENET_PEER_PING_INTERVAL if 0 +*/ +void +enet_peer_ping_interval (ENetPeer * peer, enet_uint32 pingInterval) +{ + peer -> pingInterval = pingInterval ? pingInterval : ENET_PEER_PING_INTERVAL; +} + +/** Sets the timeout parameters for a peer. + + The timeout parameter control how and when a peer will timeout from a failure to acknowledge + reliable traffic. Timeout values use an exponential backoff mechanism, where if a reliable + packet is not acknowledge within some multiple of the average RTT plus a variance tolerance, + the timeout will be doubled until it reaches a set limit. If the timeout is thus at this + limit and reliable packets have been sent but not acknowledged within a certain minimum time + period, the peer will be disconnected. Alternatively, if reliable packets have been sent + but not acknowledged for a certain maximum time period, the peer will be disconnected regardless + of the current timeout limit value. + + @param peer the peer to adjust + @param timeoutLimit the timeout limit; defaults to ENET_PEER_TIMEOUT_LIMIT if 0 + @param timeoutMinimum the timeout minimum; defaults to ENET_PEER_TIMEOUT_MINIMUM if 0 + @param timeoutMaximum the timeout maximum; defaults to ENET_PEER_TIMEOUT_MAXIMUM if 0 +*/ + +void +enet_peer_timeout (ENetPeer * peer, enet_uint32 timeoutLimit, enet_uint32 timeoutMinimum, enet_uint32 timeoutMaximum) +{ + peer -> timeoutLimit = timeoutLimit ? timeoutLimit : ENET_PEER_TIMEOUT_LIMIT; + peer -> timeoutMinimum = timeoutMinimum ? timeoutMinimum : ENET_PEER_TIMEOUT_MINIMUM; + peer -> timeoutMaximum = timeoutMaximum ? timeoutMaximum : ENET_PEER_TIMEOUT_MAXIMUM; +} + +/** Force an immediate disconnection from a peer. + @param peer peer to disconnect + @param data data describing the disconnection + @remarks No ENET_EVENT_DISCONNECT event will be generated. The foreign peer is not + guaranteed to receive the disconnect notification, and is reset immediately upon + return from this function. +*/ +void +enet_peer_disconnect_now (ENetPeer * peer, enet_uint32 data) +{ + ENetProtocol command; + + if (peer -> state == ENET_PEER_STATE_DISCONNECTED) + return; + + if (peer -> state != ENET_PEER_STATE_ZOMBIE && + peer -> state != ENET_PEER_STATE_DISCONNECTING) + { + enet_peer_reset_queues (peer); + + command.header.command = ENET_PROTOCOL_COMMAND_DISCONNECT | ENET_PROTOCOL_COMMAND_FLAG_UNSEQUENCED; + command.header.channelID = 0xFF; + command.disconnect.data = ENET_HOST_TO_NET_32 (data); + + enet_peer_queue_outgoing_command (peer, & command, NULL, 0, 0); + + enet_host_flush (peer -> host); + } + + enet_peer_reset (peer); +} + +/** Request a disconnection from a peer. + @param peer peer to request a disconnection + @param data data describing the disconnection + @remarks An ENET_EVENT_DISCONNECT event will be generated by enet_host_service() + once the disconnection is complete. +*/ +void +enet_peer_disconnect (ENetPeer * peer, enet_uint32 data) +{ + ENetProtocol command; + + if (peer -> state == ENET_PEER_STATE_DISCONNECTING || + peer -> state == ENET_PEER_STATE_DISCONNECTED || + peer -> state == ENET_PEER_STATE_ACKNOWLEDGING_DISCONNECT || + peer -> state == ENET_PEER_STATE_ZOMBIE) + return; + + enet_peer_reset_queues (peer); + + command.header.command = ENET_PROTOCOL_COMMAND_DISCONNECT; + command.header.channelID = 0xFF; + command.disconnect.data = ENET_HOST_TO_NET_32 (data); + + if (peer -> state == ENET_PEER_STATE_CONNECTED || peer -> state == ENET_PEER_STATE_DISCONNECT_LATER) + command.header.command |= ENET_PROTOCOL_COMMAND_FLAG_ACKNOWLEDGE; + else + command.header.command |= ENET_PROTOCOL_COMMAND_FLAG_UNSEQUENCED; + + enet_peer_queue_outgoing_command (peer, & command, NULL, 0, 0); + + if (peer -> state == ENET_PEER_STATE_CONNECTED || peer -> state == ENET_PEER_STATE_DISCONNECT_LATER) + { + enet_peer_on_disconnect (peer); + + peer -> state = ENET_PEER_STATE_DISCONNECTING; + } + else + { + enet_host_flush (peer -> host); + enet_peer_reset (peer); + } +} + +int +enet_peer_has_outgoing_commands (ENetPeer * peer) +{ + if (enet_list_empty (& peer -> outgoingCommands) && + enet_list_empty (& peer -> outgoingSendReliableCommands) && + enet_list_empty (& peer -> sentReliableCommands)) + return 0; + + return 1; +} + +/** Request a disconnection from a peer, but only after all queued outgoing packets are sent. + @param peer peer to request a disconnection + @param data data describing the disconnection + @remarks An ENET_EVENT_DISCONNECT event will be generated by enet_host_service() + once the disconnection is complete. +*/ +void +enet_peer_disconnect_later (ENetPeer * peer, enet_uint32 data) +{ + if ((peer -> state == ENET_PEER_STATE_CONNECTED || peer -> state == ENET_PEER_STATE_DISCONNECT_LATER) && + enet_peer_has_outgoing_commands (peer)) + { + peer -> state = ENET_PEER_STATE_DISCONNECT_LATER; + peer -> eventData = data; + } + else + enet_peer_disconnect (peer, data); +} + +ENetAcknowledgement * +enet_peer_queue_acknowledgement (ENetPeer * peer, const ENetProtocol * command, enet_uint16 sentTime) +{ + ENetAcknowledgement * acknowledgement; + + if (command -> header.channelID < peer -> channelCount) + { + ENetChannel * channel = & peer -> channels [command -> header.channelID]; + enet_uint16 reliableWindow = command -> header.reliableSequenceNumber / ENET_PEER_RELIABLE_WINDOW_SIZE, + currentWindow = channel -> incomingReliableSequenceNumber / ENET_PEER_RELIABLE_WINDOW_SIZE; + + if (command -> header.reliableSequenceNumber < channel -> incomingReliableSequenceNumber) + reliableWindow += ENET_PEER_RELIABLE_WINDOWS; + + if (reliableWindow >= currentWindow + ENET_PEER_FREE_RELIABLE_WINDOWS - 1 && reliableWindow <= currentWindow + ENET_PEER_FREE_RELIABLE_WINDOWS) + return NULL; + } + + acknowledgement = (ENetAcknowledgement *) enet_malloc (sizeof (ENetAcknowledgement)); + if (acknowledgement == NULL) + return NULL; + + peer -> outgoingDataTotal += sizeof (ENetProtocolAcknowledge); + + acknowledgement -> sentTime = sentTime; + acknowledgement -> command = * command; + + enet_list_insert (enet_list_end (& peer -> acknowledgements), acknowledgement); + + return acknowledgement; +} + +void +enet_peer_setup_outgoing_command (ENetPeer * peer, ENetOutgoingCommand * outgoingCommand) +{ + peer -> outgoingDataTotal += enet_protocol_command_size (outgoingCommand -> command.header.command) + outgoingCommand -> fragmentLength; + + if (outgoingCommand -> command.header.channelID == 0xFF) + { + ++ peer -> outgoingReliableSequenceNumber; + + outgoingCommand -> reliableSequenceNumber = peer -> outgoingReliableSequenceNumber; + outgoingCommand -> unreliableSequenceNumber = 0; + } + else + { + ENetChannel * channel = & peer -> channels [outgoingCommand -> command.header.channelID]; + + if (outgoingCommand -> command.header.command & ENET_PROTOCOL_COMMAND_FLAG_ACKNOWLEDGE) + { + ++ channel -> outgoingReliableSequenceNumber; + channel -> outgoingUnreliableSequenceNumber = 0; + + outgoingCommand -> reliableSequenceNumber = channel -> outgoingReliableSequenceNumber; + outgoingCommand -> unreliableSequenceNumber = 0; + } + else + if (outgoingCommand -> command.header.command & ENET_PROTOCOL_COMMAND_FLAG_UNSEQUENCED) + { + ++ peer -> outgoingUnsequencedGroup; + + outgoingCommand -> reliableSequenceNumber = 0; + outgoingCommand -> unreliableSequenceNumber = 0; + } + else + { + if (outgoingCommand -> fragmentOffset == 0) + ++ channel -> outgoingUnreliableSequenceNumber; + + outgoingCommand -> reliableSequenceNumber = channel -> outgoingReliableSequenceNumber; + outgoingCommand -> unreliableSequenceNumber = channel -> outgoingUnreliableSequenceNumber; + } + } + + outgoingCommand -> sendAttempts = 0; + outgoingCommand -> sentTime = 0; + outgoingCommand -> roundTripTimeout = 0; + outgoingCommand -> command.header.reliableSequenceNumber = ENET_HOST_TO_NET_16 (outgoingCommand -> reliableSequenceNumber); + outgoingCommand -> queueTime = ++ peer -> host -> totalQueued; + + switch (outgoingCommand -> command.header.command & ENET_PROTOCOL_COMMAND_MASK) + { + case ENET_PROTOCOL_COMMAND_SEND_UNRELIABLE: + outgoingCommand -> command.sendUnreliable.unreliableSequenceNumber = ENET_HOST_TO_NET_16 (outgoingCommand -> unreliableSequenceNumber); + break; + + case ENET_PROTOCOL_COMMAND_SEND_UNSEQUENCED: + outgoingCommand -> command.sendUnsequenced.unsequencedGroup = ENET_HOST_TO_NET_16 (peer -> outgoingUnsequencedGroup); + break; + + default: + break; + } + + if ((outgoingCommand -> command.header.command & ENET_PROTOCOL_COMMAND_FLAG_ACKNOWLEDGE) != 0 && + outgoingCommand -> packet != NULL) + enet_list_insert (enet_list_end (& peer -> outgoingSendReliableCommands), outgoingCommand); + else + enet_list_insert (enet_list_end (& peer -> outgoingCommands), outgoingCommand); +} + +ENetOutgoingCommand * +enet_peer_queue_outgoing_command (ENetPeer * peer, const ENetProtocol * command, ENetPacket * packet, enet_uint32 offset, enet_uint16 length) +{ + ENetOutgoingCommand * outgoingCommand = (ENetOutgoingCommand *) enet_malloc (sizeof (ENetOutgoingCommand)); + if (outgoingCommand == NULL) + return NULL; + + outgoingCommand -> command = * command; + outgoingCommand -> fragmentOffset = offset; + outgoingCommand -> fragmentLength = length; + outgoingCommand -> packet = packet; + if (packet != NULL) + ++ packet -> referenceCount; + + enet_peer_setup_outgoing_command (peer, outgoingCommand); + + return outgoingCommand; +} + +void +enet_peer_dispatch_incoming_unreliable_commands (ENetPeer * peer, ENetChannel * channel, ENetIncomingCommand * queuedCommand) +{ + ENetListIterator droppedCommand, startCommand, currentCommand; + + for (droppedCommand = startCommand = currentCommand = enet_list_begin (& channel -> incomingUnreliableCommands); + currentCommand != enet_list_end (& channel -> incomingUnreliableCommands); + currentCommand = enet_list_next (currentCommand)) + { + ENetIncomingCommand * incomingCommand = (ENetIncomingCommand *) currentCommand; + + if ((incomingCommand -> command.header.command & ENET_PROTOCOL_COMMAND_MASK) == ENET_PROTOCOL_COMMAND_SEND_UNSEQUENCED) + continue; + + if (incomingCommand -> reliableSequenceNumber == channel -> incomingReliableSequenceNumber) + { + if (incomingCommand -> fragmentsRemaining <= 0) + { + channel -> incomingUnreliableSequenceNumber = incomingCommand -> unreliableSequenceNumber; + continue; + } + + if (startCommand != currentCommand) + { + enet_list_move (enet_list_end (& peer -> dispatchedCommands), startCommand, enet_list_previous (currentCommand)); + + if (! (peer -> flags & ENET_PEER_FLAG_NEEDS_DISPATCH)) + { + enet_list_insert (enet_list_end (& peer -> host -> dispatchQueue), & peer -> dispatchList); + + peer -> flags |= ENET_PEER_FLAG_NEEDS_DISPATCH; + } + + droppedCommand = currentCommand; + } + else + if (droppedCommand != currentCommand) + droppedCommand = enet_list_previous (currentCommand); + } + else + { + enet_uint16 reliableWindow = incomingCommand -> reliableSequenceNumber / ENET_PEER_RELIABLE_WINDOW_SIZE, + currentWindow = channel -> incomingReliableSequenceNumber / ENET_PEER_RELIABLE_WINDOW_SIZE; + if (incomingCommand -> reliableSequenceNumber < channel -> incomingReliableSequenceNumber) + reliableWindow += ENET_PEER_RELIABLE_WINDOWS; + if (reliableWindow >= currentWindow && reliableWindow < currentWindow + ENET_PEER_FREE_RELIABLE_WINDOWS - 1) + break; + + droppedCommand = enet_list_next (currentCommand); + + if (startCommand != currentCommand) + { + enet_list_move (enet_list_end (& peer -> dispatchedCommands), startCommand, enet_list_previous (currentCommand)); + + if (! (peer -> flags & ENET_PEER_FLAG_NEEDS_DISPATCH)) + { + enet_list_insert (enet_list_end (& peer -> host -> dispatchQueue), & peer -> dispatchList); + + peer -> flags |= ENET_PEER_FLAG_NEEDS_DISPATCH; + } + } + } + + startCommand = enet_list_next (currentCommand); + } + + if (startCommand != currentCommand) + { + enet_list_move (enet_list_end (& peer -> dispatchedCommands), startCommand, enet_list_previous (currentCommand)); + + if (! (peer -> flags & ENET_PEER_FLAG_NEEDS_DISPATCH)) + { + enet_list_insert (enet_list_end (& peer -> host -> dispatchQueue), & peer -> dispatchList); + + peer -> flags |= ENET_PEER_FLAG_NEEDS_DISPATCH; + } + + droppedCommand = currentCommand; + } + + enet_peer_remove_incoming_commands (& channel -> incomingUnreliableCommands, enet_list_begin (& channel -> incomingUnreliableCommands), droppedCommand, queuedCommand); +} + +void +enet_peer_dispatch_incoming_reliable_commands (ENetPeer * peer, ENetChannel * channel, ENetIncomingCommand * queuedCommand) +{ + ENetListIterator currentCommand; + + for (currentCommand = enet_list_begin (& channel -> incomingReliableCommands); + currentCommand != enet_list_end (& channel -> incomingReliableCommands); + currentCommand = enet_list_next (currentCommand)) + { + ENetIncomingCommand * incomingCommand = (ENetIncomingCommand *) currentCommand; + + if (incomingCommand -> fragmentsRemaining > 0 || + incomingCommand -> reliableSequenceNumber != (enet_uint16) (channel -> incomingReliableSequenceNumber + 1)) + break; + + channel -> incomingReliableSequenceNumber = incomingCommand -> reliableSequenceNumber; + + if (incomingCommand -> fragmentCount > 0) + channel -> incomingReliableSequenceNumber += incomingCommand -> fragmentCount - 1; + } + + if (currentCommand == enet_list_begin (& channel -> incomingReliableCommands)) + return; + + channel -> incomingUnreliableSequenceNumber = 0; + + enet_list_move (enet_list_end (& peer -> dispatchedCommands), enet_list_begin (& channel -> incomingReliableCommands), enet_list_previous (currentCommand)); + + if (! (peer -> flags & ENET_PEER_FLAG_NEEDS_DISPATCH)) + { + enet_list_insert (enet_list_end (& peer -> host -> dispatchQueue), & peer -> dispatchList); + + peer -> flags |= ENET_PEER_FLAG_NEEDS_DISPATCH; + } + + if (! enet_list_empty (& channel -> incomingUnreliableCommands)) + enet_peer_dispatch_incoming_unreliable_commands (peer, channel, queuedCommand); +} + +ENetIncomingCommand * +enet_peer_queue_incoming_command (ENetPeer * peer, const ENetProtocol * command, const void * data, size_t dataLength, enet_uint32 flags, enet_uint32 fragmentCount) +{ + static ENetIncomingCommand dummyCommand; + + ENetChannel * channel = & peer -> channels [command -> header.channelID]; + enet_uint32 unreliableSequenceNumber = 0, reliableSequenceNumber = 0; + enet_uint16 reliableWindow, currentWindow; + ENetIncomingCommand * incomingCommand; + ENetListIterator currentCommand; + ENetPacket * packet = NULL; + + if (peer -> state == ENET_PEER_STATE_DISCONNECT_LATER) + goto discardCommand; + + if ((command -> header.command & ENET_PROTOCOL_COMMAND_MASK) != ENET_PROTOCOL_COMMAND_SEND_UNSEQUENCED) + { + reliableSequenceNumber = command -> header.reliableSequenceNumber; + reliableWindow = reliableSequenceNumber / ENET_PEER_RELIABLE_WINDOW_SIZE; + currentWindow = channel -> incomingReliableSequenceNumber / ENET_PEER_RELIABLE_WINDOW_SIZE; + + if (reliableSequenceNumber < channel -> incomingReliableSequenceNumber) + reliableWindow += ENET_PEER_RELIABLE_WINDOWS; + + if (reliableWindow < currentWindow || reliableWindow >= currentWindow + ENET_PEER_FREE_RELIABLE_WINDOWS - 1) + goto discardCommand; + } + + switch (command -> header.command & ENET_PROTOCOL_COMMAND_MASK) + { + case ENET_PROTOCOL_COMMAND_SEND_FRAGMENT: + case ENET_PROTOCOL_COMMAND_SEND_RELIABLE: + if (reliableSequenceNumber == channel -> incomingReliableSequenceNumber) + goto discardCommand; + + for (currentCommand = enet_list_previous (enet_list_end (& channel -> incomingReliableCommands)); + currentCommand != enet_list_end (& channel -> incomingReliableCommands); + currentCommand = enet_list_previous (currentCommand)) + { + incomingCommand = (ENetIncomingCommand *) currentCommand; + + if (reliableSequenceNumber >= channel -> incomingReliableSequenceNumber) + { + if (incomingCommand -> reliableSequenceNumber < channel -> incomingReliableSequenceNumber) + continue; + } + else + if (incomingCommand -> reliableSequenceNumber >= channel -> incomingReliableSequenceNumber) + break; + + if (incomingCommand -> reliableSequenceNumber <= reliableSequenceNumber) + { + if (incomingCommand -> reliableSequenceNumber < reliableSequenceNumber) + break; + + goto discardCommand; + } + } + break; + + case ENET_PROTOCOL_COMMAND_SEND_UNRELIABLE: + case ENET_PROTOCOL_COMMAND_SEND_UNRELIABLE_FRAGMENT: + unreliableSequenceNumber = ENET_NET_TO_HOST_16 (command -> sendUnreliable.unreliableSequenceNumber); + + if (reliableSequenceNumber == channel -> incomingReliableSequenceNumber && + unreliableSequenceNumber <= channel -> incomingUnreliableSequenceNumber) + goto discardCommand; + + for (currentCommand = enet_list_previous (enet_list_end (& channel -> incomingUnreliableCommands)); + currentCommand != enet_list_end (& channel -> incomingUnreliableCommands); + currentCommand = enet_list_previous (currentCommand)) + { + incomingCommand = (ENetIncomingCommand *) currentCommand; + + if ((command -> header.command & ENET_PROTOCOL_COMMAND_MASK) == ENET_PROTOCOL_COMMAND_SEND_UNSEQUENCED) + continue; + + if (reliableSequenceNumber >= channel -> incomingReliableSequenceNumber) + { + if (incomingCommand -> reliableSequenceNumber < channel -> incomingReliableSequenceNumber) + continue; + } + else + if (incomingCommand -> reliableSequenceNumber >= channel -> incomingReliableSequenceNumber) + break; + + if (incomingCommand -> reliableSequenceNumber < reliableSequenceNumber) + break; + + if (incomingCommand -> reliableSequenceNumber > reliableSequenceNumber) + continue; + + if (incomingCommand -> unreliableSequenceNumber <= unreliableSequenceNumber) + { + if (incomingCommand -> unreliableSequenceNumber < unreliableSequenceNumber) + break; + + goto discardCommand; + } + } + break; + + case ENET_PROTOCOL_COMMAND_SEND_UNSEQUENCED: + currentCommand = enet_list_end (& channel -> incomingUnreliableCommands); + break; + + default: + goto discardCommand; + } + + if (peer -> totalWaitingData >= peer -> host -> maximumWaitingData) + goto notifyError; + + packet = enet_packet_create (data, dataLength, flags); + if (packet == NULL) + goto notifyError; + + incomingCommand = (ENetIncomingCommand *) enet_malloc (sizeof (ENetIncomingCommand)); + if (incomingCommand == NULL) + goto notifyError; + + incomingCommand -> reliableSequenceNumber = command -> header.reliableSequenceNumber; + incomingCommand -> unreliableSequenceNumber = unreliableSequenceNumber & 0xFFFF; + incomingCommand -> command = * command; + incomingCommand -> fragmentCount = fragmentCount; + incomingCommand -> fragmentsRemaining = fragmentCount; + incomingCommand -> packet = packet; + incomingCommand -> fragments = NULL; + + if (fragmentCount > 0) + { + if (fragmentCount <= ENET_PROTOCOL_MAXIMUM_FRAGMENT_COUNT) + incomingCommand -> fragments = (enet_uint32 *) enet_malloc ((fragmentCount + 31) / 32 * sizeof (enet_uint32)); + if (incomingCommand -> fragments == NULL) + { + enet_free (incomingCommand); + + goto notifyError; + } + memset (incomingCommand -> fragments, 0, (fragmentCount + 31) / 32 * sizeof (enet_uint32)); + } + + if (packet != NULL) + { + ++ packet -> referenceCount; + + peer -> totalWaitingData += packet -> dataLength; + } + + enet_list_insert (enet_list_next (currentCommand), incomingCommand); + + switch (command -> header.command & ENET_PROTOCOL_COMMAND_MASK) + { + case ENET_PROTOCOL_COMMAND_SEND_FRAGMENT: + case ENET_PROTOCOL_COMMAND_SEND_RELIABLE: + enet_peer_dispatch_incoming_reliable_commands (peer, channel, incomingCommand); + break; + + default: + enet_peer_dispatch_incoming_unreliable_commands (peer, channel, incomingCommand); + break; + } + + return incomingCommand; + +discardCommand: + if (fragmentCount > 0) + goto notifyError; + + if (packet != NULL && packet -> referenceCount == 0) + enet_packet_destroy (packet); + + return & dummyCommand; + +notifyError: + if (packet != NULL && packet -> referenceCount == 0) + enet_packet_destroy (packet); + + return NULL; +} + +/** @} */ diff --git a/thirdparty/enet/premake4.lua b/thirdparty/enet/premake4.lua new file mode 100644 index 0000000..0e6e7ad --- /dev/null +++ b/thirdparty/enet/premake4.lua @@ -0,0 +1,59 @@ +solution "enet" + configurations { "Debug", "Release" } + platforms { "x32", "x64" } + + project "enet_static" + kind "StaticLib" + language "C" + + files { "*.c" } + + includedirs { "include/" } + + configuration "Debug" + targetsuffix "d" + + defines({ "DEBUG" }) + + flags { "Symbols" } + + configuration "Release" + defines({ "NDEBUG" }) + + flags { "Optimize" } + + configuration { "Debug", "x64" } + targetsuffix "64d" + + configuration { "Release", "x64" } + targetsuffix "64" + + project "enet" + kind "SharedLib" + language "C" + + files { "*.c" } + + includedirs { "include/" } + + defines({"ENET_DLL=1" }) + + configuration "Debug" + targetsuffix "d" + + defines({ "DEBUG" }) + + flags { "Symbols" } + + configuration "Release" + defines({ "NDEBUG" }) + + flags { "Optimize" } + + configuration { "Debug", "x64" } + targetsuffix "64d" + + configuration { "Release", "x64" } + targetsuffix "64" + + \ No newline at end of file diff --git a/thirdparty/enet/protocol.c b/thirdparty/enet/protocol.c new file mode 100644 index 0000000..843a719 --- /dev/null +++ b/thirdparty/enet/protocol.c @@ -0,0 +1,1919 @@ +/** + @file protocol.c + @brief ENet protocol functions +*/ +#include +#include +#define ENET_BUILDING_LIB 1 +#include "enet/utility.h" +#include "enet/time.h" +#include "enet/enet.h" + +static const size_t commandSizes [ENET_PROTOCOL_COMMAND_COUNT] = +{ + 0, + sizeof (ENetProtocolAcknowledge), + sizeof (ENetProtocolConnect), + sizeof (ENetProtocolVerifyConnect), + sizeof (ENetProtocolDisconnect), + sizeof (ENetProtocolPing), + sizeof (ENetProtocolSendReliable), + sizeof (ENetProtocolSendUnreliable), + sizeof (ENetProtocolSendFragment), + sizeof (ENetProtocolSendUnsequenced), + sizeof (ENetProtocolBandwidthLimit), + sizeof (ENetProtocolThrottleConfigure), + sizeof (ENetProtocolSendFragment) +}; + +size_t +enet_protocol_command_size (enet_uint8 commandNumber) +{ + return commandSizes [commandNumber & ENET_PROTOCOL_COMMAND_MASK]; +} + +static void +enet_protocol_change_state (ENetHost * host, ENetPeer * peer, ENetPeerState state) +{ + if (state == ENET_PEER_STATE_CONNECTED || state == ENET_PEER_STATE_DISCONNECT_LATER) + enet_peer_on_connect (peer); + else + enet_peer_on_disconnect (peer); + + peer -> state = state; +} + +static void +enet_protocol_dispatch_state (ENetHost * host, ENetPeer * peer, ENetPeerState state) +{ + enet_protocol_change_state (host, peer, state); + + if (! (peer -> flags & ENET_PEER_FLAG_NEEDS_DISPATCH)) + { + enet_list_insert (enet_list_end (& host -> dispatchQueue), & peer -> dispatchList); + + peer -> flags |= ENET_PEER_FLAG_NEEDS_DISPATCH; + } +} + +static int +enet_protocol_dispatch_incoming_commands (ENetHost * host, ENetEvent * event) +{ + while (! enet_list_empty (& host -> dispatchQueue)) + { + ENetPeer * peer = (ENetPeer *) enet_list_remove (enet_list_begin (& host -> dispatchQueue)); + + peer -> flags &= ~ ENET_PEER_FLAG_NEEDS_DISPATCH; + + switch (peer -> state) + { + case ENET_PEER_STATE_CONNECTION_PENDING: + case ENET_PEER_STATE_CONNECTION_SUCCEEDED: + enet_protocol_change_state (host, peer, ENET_PEER_STATE_CONNECTED); + + event -> type = ENET_EVENT_TYPE_CONNECT; + event -> peer = peer; + event -> data = peer -> eventData; + + return 1; + + case ENET_PEER_STATE_ZOMBIE: + host -> recalculateBandwidthLimits = 1; + + event -> type = ENET_EVENT_TYPE_DISCONNECT; + event -> peer = peer; + event -> data = peer -> eventData; + + enet_peer_reset (peer); + + return 1; + + case ENET_PEER_STATE_CONNECTED: + if (enet_list_empty (& peer -> dispatchedCommands)) + continue; + + event -> packet = enet_peer_receive (peer, & event -> channelID); + if (event -> packet == NULL) + continue; + + event -> type = ENET_EVENT_TYPE_RECEIVE; + event -> peer = peer; + + if (! enet_list_empty (& peer -> dispatchedCommands)) + { + peer -> flags |= ENET_PEER_FLAG_NEEDS_DISPATCH; + + enet_list_insert (enet_list_end (& host -> dispatchQueue), & peer -> dispatchList); + } + + return 1; + + default: + break; + } + } + + return 0; +} + +static void +enet_protocol_notify_connect (ENetHost * host, ENetPeer * peer, ENetEvent * event) +{ + host -> recalculateBandwidthLimits = 1; + + if (event != NULL) + { + enet_protocol_change_state (host, peer, ENET_PEER_STATE_CONNECTED); + + event -> type = ENET_EVENT_TYPE_CONNECT; + event -> peer = peer; + event -> data = peer -> eventData; + } + else + enet_protocol_dispatch_state (host, peer, peer -> state == ENET_PEER_STATE_CONNECTING ? ENET_PEER_STATE_CONNECTION_SUCCEEDED : ENET_PEER_STATE_CONNECTION_PENDING); +} + +static void +enet_protocol_notify_disconnect (ENetHost * host, ENetPeer * peer, ENetEvent * event) +{ + if (peer -> state >= ENET_PEER_STATE_CONNECTION_PENDING) + host -> recalculateBandwidthLimits = 1; + + if (peer -> state != ENET_PEER_STATE_CONNECTING && peer -> state < ENET_PEER_STATE_CONNECTION_SUCCEEDED) + enet_peer_reset (peer); + else + if (event != NULL) + { + event -> type = ENET_EVENT_TYPE_DISCONNECT; + event -> peer = peer; + event -> data = 0; + + enet_peer_reset (peer); + } + else + { + peer -> eventData = 0; + + enet_protocol_dispatch_state (host, peer, ENET_PEER_STATE_ZOMBIE); + } +} + +static void +enet_protocol_remove_sent_unreliable_commands (ENetPeer * peer, ENetList * sentUnreliableCommands) +{ + ENetOutgoingCommand * outgoingCommand; + + if (enet_list_empty (sentUnreliableCommands)) + return; + + do + { + outgoingCommand = (ENetOutgoingCommand *) enet_list_front (sentUnreliableCommands); + + enet_list_remove (& outgoingCommand -> outgoingCommandList); + + if (outgoingCommand -> packet != NULL) + { + -- outgoingCommand -> packet -> referenceCount; + + if (outgoingCommand -> packet -> referenceCount == 0) + { + outgoingCommand -> packet -> flags |= ENET_PACKET_FLAG_SENT; + + enet_packet_destroy (outgoingCommand -> packet); + } + } + + enet_free (outgoingCommand); + } while (! enet_list_empty (sentUnreliableCommands)); + + if (peer -> state == ENET_PEER_STATE_DISCONNECT_LATER && + ! enet_peer_has_outgoing_commands (peer)) + enet_peer_disconnect (peer, peer -> eventData); +} + +static ENetOutgoingCommand * +enet_protocol_find_sent_reliable_command (ENetList * list, enet_uint16 reliableSequenceNumber, enet_uint8 channelID) +{ + ENetListIterator currentCommand; + + for (currentCommand = enet_list_begin (list); + currentCommand != enet_list_end (list); + currentCommand = enet_list_next (currentCommand)) + { + ENetOutgoingCommand * outgoingCommand = (ENetOutgoingCommand *) currentCommand; + + if (! (outgoingCommand -> command.header.command & ENET_PROTOCOL_COMMAND_FLAG_ACKNOWLEDGE)) + continue; + + if (outgoingCommand -> sendAttempts < 1) + break; + + if (outgoingCommand -> reliableSequenceNumber == reliableSequenceNumber && + outgoingCommand -> command.header.channelID == channelID) + return outgoingCommand; + } + + return NULL; +} + +static ENetProtocolCommand +enet_protocol_remove_sent_reliable_command (ENetPeer * peer, enet_uint16 reliableSequenceNumber, enet_uint8 channelID) +{ + ENetOutgoingCommand * outgoingCommand = NULL; + ENetListIterator currentCommand; + ENetProtocolCommand commandNumber; + int wasSent = 1; + + for (currentCommand = enet_list_begin (& peer -> sentReliableCommands); + currentCommand != enet_list_end (& peer -> sentReliableCommands); + currentCommand = enet_list_next (currentCommand)) + { + outgoingCommand = (ENetOutgoingCommand *) currentCommand; + + if (outgoingCommand -> reliableSequenceNumber == reliableSequenceNumber && + outgoingCommand -> command.header.channelID == channelID) + break; + } + + if (currentCommand == enet_list_end (& peer -> sentReliableCommands)) + { + outgoingCommand = enet_protocol_find_sent_reliable_command (& peer -> outgoingCommands, reliableSequenceNumber, channelID); + if (outgoingCommand == NULL) + outgoingCommand = enet_protocol_find_sent_reliable_command (& peer -> outgoingSendReliableCommands, reliableSequenceNumber, channelID); + + wasSent = 0; + } + + if (outgoingCommand == NULL) + return ENET_PROTOCOL_COMMAND_NONE; + + if (channelID < peer -> channelCount) + { + ENetChannel * channel = & peer -> channels [channelID]; + enet_uint16 reliableWindow = reliableSequenceNumber / ENET_PEER_RELIABLE_WINDOW_SIZE; + if (channel -> reliableWindows [reliableWindow] > 0) + { + -- channel -> reliableWindows [reliableWindow]; + if (! channel -> reliableWindows [reliableWindow]) + channel -> usedReliableWindows &= ~ (1 << reliableWindow); + } + } + + commandNumber = (ENetProtocolCommand) (outgoingCommand -> command.header.command & ENET_PROTOCOL_COMMAND_MASK); + + enet_list_remove (& outgoingCommand -> outgoingCommandList); + + if (outgoingCommand -> packet != NULL) + { + if (wasSent) + peer -> reliableDataInTransit -= outgoingCommand -> fragmentLength; + + -- outgoingCommand -> packet -> referenceCount; + + if (outgoingCommand -> packet -> referenceCount == 0) + { + outgoingCommand -> packet -> flags |= ENET_PACKET_FLAG_SENT; + + enet_packet_destroy (outgoingCommand -> packet); + } + } + + enet_free (outgoingCommand); + + if (enet_list_empty (& peer -> sentReliableCommands)) + return commandNumber; + + outgoingCommand = (ENetOutgoingCommand *) enet_list_front (& peer -> sentReliableCommands); + + peer -> nextTimeout = outgoingCommand -> sentTime + outgoingCommand -> roundTripTimeout; + + return commandNumber; +} + +static ENetPeer * +enet_protocol_handle_connect (ENetHost * host, ENetProtocolHeader * header, ENetProtocol * command) +{ + enet_uint8 incomingSessionID, outgoingSessionID; + enet_uint32 mtu, windowSize; + ENetChannel * channel; + size_t channelCount, duplicatePeers = 0; + ENetPeer * currentPeer, * peer = NULL; + ENetProtocol verifyCommand; + + channelCount = ENET_NET_TO_HOST_32 (command -> connect.channelCount); + + if (channelCount < ENET_PROTOCOL_MINIMUM_CHANNEL_COUNT || + channelCount > ENET_PROTOCOL_MAXIMUM_CHANNEL_COUNT) + return NULL; + + for (currentPeer = host -> peers; + currentPeer < & host -> peers [host -> peerCount]; + ++ currentPeer) + { + if (currentPeer -> state == ENET_PEER_STATE_DISCONNECTED) + { + if (peer == NULL) + peer = currentPeer; + } + else + if (currentPeer -> state != ENET_PEER_STATE_CONNECTING && + currentPeer -> address.host == host -> receivedAddress.host) + { + if (currentPeer -> address.port == host -> receivedAddress.port && + currentPeer -> connectID == command -> connect.connectID) + return NULL; + + ++ duplicatePeers; + } + } + + if (peer == NULL || duplicatePeers >= host -> duplicatePeers) + return NULL; + + if (channelCount > host -> channelLimit) + channelCount = host -> channelLimit; + peer -> channels = (ENetChannel *) enet_malloc (channelCount * sizeof (ENetChannel)); + if (peer -> channels == NULL) + return NULL; + peer -> channelCount = channelCount; + peer -> state = ENET_PEER_STATE_ACKNOWLEDGING_CONNECT; + peer -> connectID = command -> connect.connectID; + peer -> address = host -> receivedAddress; + peer -> mtu = host -> mtu; + peer -> outgoingPeerID = ENET_NET_TO_HOST_16 (command -> connect.outgoingPeerID); + peer -> incomingBandwidth = ENET_NET_TO_HOST_32 (command -> connect.incomingBandwidth); + peer -> outgoingBandwidth = ENET_NET_TO_HOST_32 (command -> connect.outgoingBandwidth); + peer -> packetThrottleInterval = ENET_NET_TO_HOST_32 (command -> connect.packetThrottleInterval); + peer -> packetThrottleAcceleration = ENET_NET_TO_HOST_32 (command -> connect.packetThrottleAcceleration); + peer -> packetThrottleDeceleration = ENET_NET_TO_HOST_32 (command -> connect.packetThrottleDeceleration); + peer -> eventData = ENET_NET_TO_HOST_32 (command -> connect.data); + + incomingSessionID = command -> connect.incomingSessionID == 0xFF ? peer -> outgoingSessionID : command -> connect.incomingSessionID; + incomingSessionID = (incomingSessionID + 1) & (ENET_PROTOCOL_HEADER_SESSION_MASK >> ENET_PROTOCOL_HEADER_SESSION_SHIFT); + if (incomingSessionID == peer -> outgoingSessionID) + incomingSessionID = (incomingSessionID + 1) & (ENET_PROTOCOL_HEADER_SESSION_MASK >> ENET_PROTOCOL_HEADER_SESSION_SHIFT); + peer -> outgoingSessionID = incomingSessionID; + + outgoingSessionID = command -> connect.outgoingSessionID == 0xFF ? peer -> incomingSessionID : command -> connect.outgoingSessionID; + outgoingSessionID = (outgoingSessionID + 1) & (ENET_PROTOCOL_HEADER_SESSION_MASK >> ENET_PROTOCOL_HEADER_SESSION_SHIFT); + if (outgoingSessionID == peer -> incomingSessionID) + outgoingSessionID = (outgoingSessionID + 1) & (ENET_PROTOCOL_HEADER_SESSION_MASK >> ENET_PROTOCOL_HEADER_SESSION_SHIFT); + peer -> incomingSessionID = outgoingSessionID; + + for (channel = peer -> channels; + channel < & peer -> channels [channelCount]; + ++ channel) + { + channel -> outgoingReliableSequenceNumber = 0; + channel -> outgoingUnreliableSequenceNumber = 0; + channel -> incomingReliableSequenceNumber = 0; + channel -> incomingUnreliableSequenceNumber = 0; + + enet_list_clear (& channel -> incomingReliableCommands); + enet_list_clear (& channel -> incomingUnreliableCommands); + + channel -> usedReliableWindows = 0; + memset (channel -> reliableWindows, 0, sizeof (channel -> reliableWindows)); + } + + mtu = ENET_NET_TO_HOST_32 (command -> connect.mtu); + + if (mtu < ENET_PROTOCOL_MINIMUM_MTU) + mtu = ENET_PROTOCOL_MINIMUM_MTU; + else + if (mtu > ENET_PROTOCOL_MAXIMUM_MTU) + mtu = ENET_PROTOCOL_MAXIMUM_MTU; + + if (mtu < peer -> mtu) + peer -> mtu = mtu; + + if (host -> outgoingBandwidth == 0 && + peer -> incomingBandwidth == 0) + peer -> windowSize = ENET_PROTOCOL_MAXIMUM_WINDOW_SIZE; + else + if (host -> outgoingBandwidth == 0 || + peer -> incomingBandwidth == 0) + peer -> windowSize = (ENET_MAX (host -> outgoingBandwidth, peer -> incomingBandwidth) / + ENET_PEER_WINDOW_SIZE_SCALE) * + ENET_PROTOCOL_MINIMUM_WINDOW_SIZE; + else + peer -> windowSize = (ENET_MIN (host -> outgoingBandwidth, peer -> incomingBandwidth) / + ENET_PEER_WINDOW_SIZE_SCALE) * + ENET_PROTOCOL_MINIMUM_WINDOW_SIZE; + + if (peer -> windowSize < ENET_PROTOCOL_MINIMUM_WINDOW_SIZE) + peer -> windowSize = ENET_PROTOCOL_MINIMUM_WINDOW_SIZE; + else + if (peer -> windowSize > ENET_PROTOCOL_MAXIMUM_WINDOW_SIZE) + peer -> windowSize = ENET_PROTOCOL_MAXIMUM_WINDOW_SIZE; + + if (host -> incomingBandwidth == 0) + windowSize = ENET_PROTOCOL_MAXIMUM_WINDOW_SIZE; + else + windowSize = (host -> incomingBandwidth / ENET_PEER_WINDOW_SIZE_SCALE) * + ENET_PROTOCOL_MINIMUM_WINDOW_SIZE; + + if (windowSize > ENET_NET_TO_HOST_32 (command -> connect.windowSize)) + windowSize = ENET_NET_TO_HOST_32 (command -> connect.windowSize); + + if (windowSize < ENET_PROTOCOL_MINIMUM_WINDOW_SIZE) + windowSize = ENET_PROTOCOL_MINIMUM_WINDOW_SIZE; + else + if (windowSize > ENET_PROTOCOL_MAXIMUM_WINDOW_SIZE) + windowSize = ENET_PROTOCOL_MAXIMUM_WINDOW_SIZE; + + verifyCommand.header.command = ENET_PROTOCOL_COMMAND_VERIFY_CONNECT | ENET_PROTOCOL_COMMAND_FLAG_ACKNOWLEDGE; + verifyCommand.header.channelID = 0xFF; + verifyCommand.verifyConnect.outgoingPeerID = ENET_HOST_TO_NET_16 (peer -> incomingPeerID); + verifyCommand.verifyConnect.incomingSessionID = incomingSessionID; + verifyCommand.verifyConnect.outgoingSessionID = outgoingSessionID; + verifyCommand.verifyConnect.mtu = ENET_HOST_TO_NET_32 (peer -> mtu); + verifyCommand.verifyConnect.windowSize = ENET_HOST_TO_NET_32 (windowSize); + verifyCommand.verifyConnect.channelCount = ENET_HOST_TO_NET_32 (channelCount); + verifyCommand.verifyConnect.incomingBandwidth = ENET_HOST_TO_NET_32 (host -> incomingBandwidth); + verifyCommand.verifyConnect.outgoingBandwidth = ENET_HOST_TO_NET_32 (host -> outgoingBandwidth); + verifyCommand.verifyConnect.packetThrottleInterval = ENET_HOST_TO_NET_32 (peer -> packetThrottleInterval); + verifyCommand.verifyConnect.packetThrottleAcceleration = ENET_HOST_TO_NET_32 (peer -> packetThrottleAcceleration); + verifyCommand.verifyConnect.packetThrottleDeceleration = ENET_HOST_TO_NET_32 (peer -> packetThrottleDeceleration); + verifyCommand.verifyConnect.connectID = peer -> connectID; + + enet_peer_queue_outgoing_command (peer, & verifyCommand, NULL, 0, 0); + + return peer; +} + +static int +enet_protocol_handle_send_reliable (ENetHost * host, ENetPeer * peer, const ENetProtocol * command, enet_uint8 ** currentData) +{ + size_t dataLength; + + if (command -> header.channelID >= peer -> channelCount || + (peer -> state != ENET_PEER_STATE_CONNECTED && peer -> state != ENET_PEER_STATE_DISCONNECT_LATER)) + return -1; + + dataLength = ENET_NET_TO_HOST_16 (command -> sendReliable.dataLength); + * currentData += dataLength; + if (dataLength > host -> maximumPacketSize || + * currentData < host -> receivedData || + * currentData > & host -> receivedData [host -> receivedDataLength]) + return -1; + + if (enet_peer_queue_incoming_command (peer, command, (const enet_uint8 *) command + sizeof (ENetProtocolSendReliable), dataLength, ENET_PACKET_FLAG_RELIABLE, 0) == NULL) + return -1; + + return 0; +} + +static int +enet_protocol_handle_send_unsequenced (ENetHost * host, ENetPeer * peer, const ENetProtocol * command, enet_uint8 ** currentData) +{ + enet_uint32 unsequencedGroup, index; + size_t dataLength; + + if (command -> header.channelID >= peer -> channelCount || + (peer -> state != ENET_PEER_STATE_CONNECTED && peer -> state != ENET_PEER_STATE_DISCONNECT_LATER)) + return -1; + + dataLength = ENET_NET_TO_HOST_16 (command -> sendUnsequenced.dataLength); + * currentData += dataLength; + if (dataLength > host -> maximumPacketSize || + * currentData < host -> receivedData || + * currentData > & host -> receivedData [host -> receivedDataLength]) + return -1; + + unsequencedGroup = ENET_NET_TO_HOST_16 (command -> sendUnsequenced.unsequencedGroup); + index = unsequencedGroup % ENET_PEER_UNSEQUENCED_WINDOW_SIZE; + + if (unsequencedGroup < peer -> incomingUnsequencedGroup) + unsequencedGroup += 0x10000; + + if (unsequencedGroup >= (enet_uint32) peer -> incomingUnsequencedGroup + ENET_PEER_FREE_UNSEQUENCED_WINDOWS * ENET_PEER_UNSEQUENCED_WINDOW_SIZE) + return 0; + + unsequencedGroup &= 0xFFFF; + + if (unsequencedGroup - index != peer -> incomingUnsequencedGroup) + { + peer -> incomingUnsequencedGroup = unsequencedGroup - index; + + memset (peer -> unsequencedWindow, 0, sizeof (peer -> unsequencedWindow)); + } + else + if (peer -> unsequencedWindow [index / 32] & (1 << (index % 32))) + return 0; + + if (enet_peer_queue_incoming_command (peer, command, (const enet_uint8 *) command + sizeof (ENetProtocolSendUnsequenced), dataLength, ENET_PACKET_FLAG_UNSEQUENCED, 0) == NULL) + return -1; + + peer -> unsequencedWindow [index / 32] |= 1 << (index % 32); + + return 0; +} + +static int +enet_protocol_handle_send_unreliable (ENetHost * host, ENetPeer * peer, const ENetProtocol * command, enet_uint8 ** currentData) +{ + size_t dataLength; + + if (command -> header.channelID >= peer -> channelCount || + (peer -> state != ENET_PEER_STATE_CONNECTED && peer -> state != ENET_PEER_STATE_DISCONNECT_LATER)) + return -1; + + dataLength = ENET_NET_TO_HOST_16 (command -> sendUnreliable.dataLength); + * currentData += dataLength; + if (dataLength > host -> maximumPacketSize || + * currentData < host -> receivedData || + * currentData > & host -> receivedData [host -> receivedDataLength]) + return -1; + + if (enet_peer_queue_incoming_command (peer, command, (const enet_uint8 *) command + sizeof (ENetProtocolSendUnreliable), dataLength, 0, 0) == NULL) + return -1; + + return 0; +} + +static int +enet_protocol_handle_send_fragment (ENetHost * host, ENetPeer * peer, const ENetProtocol * command, enet_uint8 ** currentData) +{ + enet_uint32 fragmentNumber, + fragmentCount, + fragmentOffset, + fragmentLength, + startSequenceNumber, + totalLength; + ENetChannel * channel; + enet_uint16 startWindow, currentWindow; + ENetListIterator currentCommand; + ENetIncomingCommand * startCommand = NULL; + + if (command -> header.channelID >= peer -> channelCount || + (peer -> state != ENET_PEER_STATE_CONNECTED && peer -> state != ENET_PEER_STATE_DISCONNECT_LATER)) + return -1; + + fragmentLength = ENET_NET_TO_HOST_16 (command -> sendFragment.dataLength); + * currentData += fragmentLength; + if (fragmentLength <= 0 || + fragmentLength > host -> maximumPacketSize || + * currentData < host -> receivedData || + * currentData > & host -> receivedData [host -> receivedDataLength]) + return -1; + + channel = & peer -> channels [command -> header.channelID]; + startSequenceNumber = ENET_NET_TO_HOST_16 (command -> sendFragment.startSequenceNumber); + startWindow = startSequenceNumber / ENET_PEER_RELIABLE_WINDOW_SIZE; + currentWindow = channel -> incomingReliableSequenceNumber / ENET_PEER_RELIABLE_WINDOW_SIZE; + + if (startSequenceNumber < channel -> incomingReliableSequenceNumber) + startWindow += ENET_PEER_RELIABLE_WINDOWS; + + if (startWindow < currentWindow || startWindow >= currentWindow + ENET_PEER_FREE_RELIABLE_WINDOWS - 1) + return 0; + + fragmentNumber = ENET_NET_TO_HOST_32 (command -> sendFragment.fragmentNumber); + fragmentCount = ENET_NET_TO_HOST_32 (command -> sendFragment.fragmentCount); + fragmentOffset = ENET_NET_TO_HOST_32 (command -> sendFragment.fragmentOffset); + totalLength = ENET_NET_TO_HOST_32 (command -> sendFragment.totalLength); + + if (fragmentCount > ENET_PROTOCOL_MAXIMUM_FRAGMENT_COUNT || + fragmentNumber >= fragmentCount || + totalLength > host -> maximumPacketSize || + totalLength < fragmentCount || + fragmentOffset >= totalLength || + fragmentLength > totalLength - fragmentOffset) + return -1; + + for (currentCommand = enet_list_previous (enet_list_end (& channel -> incomingReliableCommands)); + currentCommand != enet_list_end (& channel -> incomingReliableCommands); + currentCommand = enet_list_previous (currentCommand)) + { + ENetIncomingCommand * incomingCommand = (ENetIncomingCommand *) currentCommand; + + if (startSequenceNumber >= channel -> incomingReliableSequenceNumber) + { + if (incomingCommand -> reliableSequenceNumber < channel -> incomingReliableSequenceNumber) + continue; + } + else + if (incomingCommand -> reliableSequenceNumber >= channel -> incomingReliableSequenceNumber) + break; + + if (incomingCommand -> reliableSequenceNumber <= startSequenceNumber) + { + if (incomingCommand -> reliableSequenceNumber < startSequenceNumber) + break; + + if ((incomingCommand -> command.header.command & ENET_PROTOCOL_COMMAND_MASK) != ENET_PROTOCOL_COMMAND_SEND_FRAGMENT || + totalLength != incomingCommand -> packet -> dataLength || + fragmentCount != incomingCommand -> fragmentCount) + return -1; + + startCommand = incomingCommand; + break; + } + } + + if (startCommand == NULL) + { + ENetProtocol hostCommand = * command; + + hostCommand.header.reliableSequenceNumber = startSequenceNumber; + + startCommand = enet_peer_queue_incoming_command (peer, & hostCommand, NULL, totalLength, ENET_PACKET_FLAG_RELIABLE, fragmentCount); + if (startCommand == NULL) + return -1; + } + + if ((startCommand -> fragments [fragmentNumber / 32] & (1 << (fragmentNumber % 32))) == 0) + { + -- startCommand -> fragmentsRemaining; + + startCommand -> fragments [fragmentNumber / 32] |= (1 << (fragmentNumber % 32)); + + if (fragmentOffset + fragmentLength > startCommand -> packet -> dataLength) + fragmentLength = startCommand -> packet -> dataLength - fragmentOffset; + + memcpy (startCommand -> packet -> data + fragmentOffset, + (enet_uint8 *) command + sizeof (ENetProtocolSendFragment), + fragmentLength); + + if (startCommand -> fragmentsRemaining <= 0) + enet_peer_dispatch_incoming_reliable_commands (peer, channel, NULL); + } + + return 0; +} + +static int +enet_protocol_handle_send_unreliable_fragment (ENetHost * host, ENetPeer * peer, const ENetProtocol * command, enet_uint8 ** currentData) +{ + enet_uint32 fragmentNumber, + fragmentCount, + fragmentOffset, + fragmentLength, + reliableSequenceNumber, + startSequenceNumber, + totalLength; + enet_uint16 reliableWindow, currentWindow; + ENetChannel * channel; + ENetListIterator currentCommand; + ENetIncomingCommand * startCommand = NULL; + + if (command -> header.channelID >= peer -> channelCount || + (peer -> state != ENET_PEER_STATE_CONNECTED && peer -> state != ENET_PEER_STATE_DISCONNECT_LATER)) + return -1; + + fragmentLength = ENET_NET_TO_HOST_16 (command -> sendFragment.dataLength); + * currentData += fragmentLength; + if (fragmentLength > host -> maximumPacketSize || + * currentData < host -> receivedData || + * currentData > & host -> receivedData [host -> receivedDataLength]) + return -1; + + channel = & peer -> channels [command -> header.channelID]; + reliableSequenceNumber = command -> header.reliableSequenceNumber; + startSequenceNumber = ENET_NET_TO_HOST_16 (command -> sendFragment.startSequenceNumber); + + reliableWindow = reliableSequenceNumber / ENET_PEER_RELIABLE_WINDOW_SIZE; + currentWindow = channel -> incomingReliableSequenceNumber / ENET_PEER_RELIABLE_WINDOW_SIZE; + + if (reliableSequenceNumber < channel -> incomingReliableSequenceNumber) + reliableWindow += ENET_PEER_RELIABLE_WINDOWS; + + if (reliableWindow < currentWindow || reliableWindow >= currentWindow + ENET_PEER_FREE_RELIABLE_WINDOWS - 1) + return 0; + + if (reliableSequenceNumber == channel -> incomingReliableSequenceNumber && + startSequenceNumber <= channel -> incomingUnreliableSequenceNumber) + return 0; + + fragmentNumber = ENET_NET_TO_HOST_32 (command -> sendFragment.fragmentNumber); + fragmentCount = ENET_NET_TO_HOST_32 (command -> sendFragment.fragmentCount); + fragmentOffset = ENET_NET_TO_HOST_32 (command -> sendFragment.fragmentOffset); + totalLength = ENET_NET_TO_HOST_32 (command -> sendFragment.totalLength); + + if (fragmentCount > ENET_PROTOCOL_MAXIMUM_FRAGMENT_COUNT || + fragmentNumber >= fragmentCount || + totalLength > host -> maximumPacketSize || + fragmentOffset >= totalLength || + fragmentLength > totalLength - fragmentOffset) + return -1; + + for (currentCommand = enet_list_previous (enet_list_end (& channel -> incomingUnreliableCommands)); + currentCommand != enet_list_end (& channel -> incomingUnreliableCommands); + currentCommand = enet_list_previous (currentCommand)) + { + ENetIncomingCommand * incomingCommand = (ENetIncomingCommand *) currentCommand; + + if (reliableSequenceNumber >= channel -> incomingReliableSequenceNumber) + { + if (incomingCommand -> reliableSequenceNumber < channel -> incomingReliableSequenceNumber) + continue; + } + else + if (incomingCommand -> reliableSequenceNumber >= channel -> incomingReliableSequenceNumber) + break; + + if (incomingCommand -> reliableSequenceNumber < reliableSequenceNumber) + break; + + if (incomingCommand -> reliableSequenceNumber > reliableSequenceNumber) + continue; + + if (incomingCommand -> unreliableSequenceNumber <= startSequenceNumber) + { + if (incomingCommand -> unreliableSequenceNumber < startSequenceNumber) + break; + + if ((incomingCommand -> command.header.command & ENET_PROTOCOL_COMMAND_MASK) != ENET_PROTOCOL_COMMAND_SEND_UNRELIABLE_FRAGMENT || + totalLength != incomingCommand -> packet -> dataLength || + fragmentCount != incomingCommand -> fragmentCount) + return -1; + + startCommand = incomingCommand; + break; + } + } + + if (startCommand == NULL) + { + startCommand = enet_peer_queue_incoming_command (peer, command, NULL, totalLength, ENET_PACKET_FLAG_UNRELIABLE_FRAGMENT, fragmentCount); + if (startCommand == NULL) + return -1; + } + + if ((startCommand -> fragments [fragmentNumber / 32] & (1 << (fragmentNumber % 32))) == 0) + { + -- startCommand -> fragmentsRemaining; + + startCommand -> fragments [fragmentNumber / 32] |= (1 << (fragmentNumber % 32)); + + if (fragmentOffset + fragmentLength > startCommand -> packet -> dataLength) + fragmentLength = startCommand -> packet -> dataLength - fragmentOffset; + + memcpy (startCommand -> packet -> data + fragmentOffset, + (enet_uint8 *) command + sizeof (ENetProtocolSendFragment), + fragmentLength); + + if (startCommand -> fragmentsRemaining <= 0) + enet_peer_dispatch_incoming_unreliable_commands (peer, channel, NULL); + } + + return 0; +} + +static int +enet_protocol_handle_ping (ENetHost * host, ENetPeer * peer, const ENetProtocol * command) +{ + if (peer -> state != ENET_PEER_STATE_CONNECTED && peer -> state != ENET_PEER_STATE_DISCONNECT_LATER) + return -1; + + return 0; +} + +static int +enet_protocol_handle_bandwidth_limit (ENetHost * host, ENetPeer * peer, const ENetProtocol * command) +{ + if (peer -> state != ENET_PEER_STATE_CONNECTED && peer -> state != ENET_PEER_STATE_DISCONNECT_LATER) + return -1; + + if (peer -> incomingBandwidth != 0) + -- host -> bandwidthLimitedPeers; + + peer -> incomingBandwidth = ENET_NET_TO_HOST_32 (command -> bandwidthLimit.incomingBandwidth); + peer -> outgoingBandwidth = ENET_NET_TO_HOST_32 (command -> bandwidthLimit.outgoingBandwidth); + + if (peer -> incomingBandwidth != 0) + ++ host -> bandwidthLimitedPeers; + + if (peer -> incomingBandwidth == 0 && host -> outgoingBandwidth == 0) + peer -> windowSize = ENET_PROTOCOL_MAXIMUM_WINDOW_SIZE; + else + if (peer -> incomingBandwidth == 0 || host -> outgoingBandwidth == 0) + peer -> windowSize = (ENET_MAX (peer -> incomingBandwidth, host -> outgoingBandwidth) / + ENET_PEER_WINDOW_SIZE_SCALE) * ENET_PROTOCOL_MINIMUM_WINDOW_SIZE; + else + peer -> windowSize = (ENET_MIN (peer -> incomingBandwidth, host -> outgoingBandwidth) / + ENET_PEER_WINDOW_SIZE_SCALE) * ENET_PROTOCOL_MINIMUM_WINDOW_SIZE; + + if (peer -> windowSize < ENET_PROTOCOL_MINIMUM_WINDOW_SIZE) + peer -> windowSize = ENET_PROTOCOL_MINIMUM_WINDOW_SIZE; + else + if (peer -> windowSize > ENET_PROTOCOL_MAXIMUM_WINDOW_SIZE) + peer -> windowSize = ENET_PROTOCOL_MAXIMUM_WINDOW_SIZE; + + return 0; +} + +static int +enet_protocol_handle_throttle_configure (ENetHost * host, ENetPeer * peer, const ENetProtocol * command) +{ + if (peer -> state != ENET_PEER_STATE_CONNECTED && peer -> state != ENET_PEER_STATE_DISCONNECT_LATER) + return -1; + + peer -> packetThrottleInterval = ENET_NET_TO_HOST_32 (command -> throttleConfigure.packetThrottleInterval); + peer -> packetThrottleAcceleration = ENET_NET_TO_HOST_32 (command -> throttleConfigure.packetThrottleAcceleration); + peer -> packetThrottleDeceleration = ENET_NET_TO_HOST_32 (command -> throttleConfigure.packetThrottleDeceleration); + + return 0; +} + +static int +enet_protocol_handle_disconnect (ENetHost * host, ENetPeer * peer, const ENetProtocol * command) +{ + if (peer -> state == ENET_PEER_STATE_DISCONNECTED || peer -> state == ENET_PEER_STATE_ZOMBIE || peer -> state == ENET_PEER_STATE_ACKNOWLEDGING_DISCONNECT) + return 0; + + enet_peer_reset_queues (peer); + + if (peer -> state == ENET_PEER_STATE_CONNECTION_SUCCEEDED || peer -> state == ENET_PEER_STATE_DISCONNECTING || peer -> state == ENET_PEER_STATE_CONNECTING) + enet_protocol_dispatch_state (host, peer, ENET_PEER_STATE_ZOMBIE); + else + if (peer -> state != ENET_PEER_STATE_CONNECTED && peer -> state != ENET_PEER_STATE_DISCONNECT_LATER) + { + if (peer -> state == ENET_PEER_STATE_CONNECTION_PENDING) host -> recalculateBandwidthLimits = 1; + + enet_peer_reset (peer); + } + else + if (command -> header.command & ENET_PROTOCOL_COMMAND_FLAG_ACKNOWLEDGE) + enet_protocol_change_state (host, peer, ENET_PEER_STATE_ACKNOWLEDGING_DISCONNECT); + else + enet_protocol_dispatch_state (host, peer, ENET_PEER_STATE_ZOMBIE); + + if (peer -> state != ENET_PEER_STATE_DISCONNECTED) + peer -> eventData = ENET_NET_TO_HOST_32 (command -> disconnect.data); + + return 0; +} + +static int +enet_protocol_handle_acknowledge (ENetHost * host, ENetEvent * event, ENetPeer * peer, const ENetProtocol * command) +{ + enet_uint32 roundTripTime, + receivedSentTime, + receivedReliableSequenceNumber; + ENetProtocolCommand commandNumber; + + if (peer -> state == ENET_PEER_STATE_DISCONNECTED || peer -> state == ENET_PEER_STATE_ZOMBIE) + return 0; + + receivedSentTime = ENET_NET_TO_HOST_16 (command -> acknowledge.receivedSentTime); + receivedSentTime |= host -> serviceTime & 0xFFFF0000; + if ((receivedSentTime & 0x8000) > (host -> serviceTime & 0x8000)) + receivedSentTime -= 0x10000; + + if (ENET_TIME_LESS (host -> serviceTime, receivedSentTime)) + return 0; + + roundTripTime = ENET_TIME_DIFFERENCE (host -> serviceTime, receivedSentTime); + roundTripTime = ENET_MAX (roundTripTime, 1); + + if (peer -> lastReceiveTime > 0) + { + enet_peer_throttle (peer, roundTripTime); + + peer -> roundTripTimeVariance -= peer -> roundTripTimeVariance / 4; + + if (roundTripTime >= peer -> roundTripTime) + { + enet_uint32 diff = roundTripTime - peer -> roundTripTime; + peer -> roundTripTimeVariance += diff / 4; + peer -> roundTripTime += diff / 8; + } + else + { + enet_uint32 diff = peer -> roundTripTime - roundTripTime; + peer -> roundTripTimeVariance += diff / 4; + peer -> roundTripTime -= diff / 8; + } + } + else + { + peer -> roundTripTime = roundTripTime; + peer -> roundTripTimeVariance = (roundTripTime + 1) / 2; + } + + if (peer -> roundTripTime < peer -> lowestRoundTripTime) + peer -> lowestRoundTripTime = peer -> roundTripTime; + + if (peer -> roundTripTimeVariance > peer -> highestRoundTripTimeVariance) + peer -> highestRoundTripTimeVariance = peer -> roundTripTimeVariance; + + if (peer -> packetThrottleEpoch == 0 || + ENET_TIME_DIFFERENCE (host -> serviceTime, peer -> packetThrottleEpoch) >= peer -> packetThrottleInterval) + { + peer -> lastRoundTripTime = peer -> lowestRoundTripTime; + peer -> lastRoundTripTimeVariance = ENET_MAX (peer -> highestRoundTripTimeVariance, 1); + peer -> lowestRoundTripTime = peer -> roundTripTime; + peer -> highestRoundTripTimeVariance = peer -> roundTripTimeVariance; + peer -> packetThrottleEpoch = host -> serviceTime; + } + + peer -> lastReceiveTime = ENET_MAX (host -> serviceTime, 1); + peer -> earliestTimeout = 0; + + receivedReliableSequenceNumber = ENET_NET_TO_HOST_16 (command -> acknowledge.receivedReliableSequenceNumber); + + commandNumber = enet_protocol_remove_sent_reliable_command (peer, receivedReliableSequenceNumber, command -> header.channelID); + + switch (peer -> state) + { + case ENET_PEER_STATE_ACKNOWLEDGING_CONNECT: + if (commandNumber != ENET_PROTOCOL_COMMAND_VERIFY_CONNECT) + return -1; + + enet_protocol_notify_connect (host, peer, event); + break; + + case ENET_PEER_STATE_DISCONNECTING: + if (commandNumber != ENET_PROTOCOL_COMMAND_DISCONNECT) + return -1; + + enet_protocol_notify_disconnect (host, peer, event); + break; + + case ENET_PEER_STATE_DISCONNECT_LATER: + if (! enet_peer_has_outgoing_commands (peer)) + enet_peer_disconnect (peer, peer -> eventData); + break; + + default: + break; + } + + return 0; +} + +static int +enet_protocol_handle_verify_connect (ENetHost * host, ENetEvent * event, ENetPeer * peer, const ENetProtocol * command) +{ + enet_uint32 mtu, windowSize; + size_t channelCount; + + if (peer -> state != ENET_PEER_STATE_CONNECTING) + return 0; + + channelCount = ENET_NET_TO_HOST_32 (command -> verifyConnect.channelCount); + + if (channelCount < ENET_PROTOCOL_MINIMUM_CHANNEL_COUNT || channelCount > ENET_PROTOCOL_MAXIMUM_CHANNEL_COUNT || + ENET_NET_TO_HOST_32 (command -> verifyConnect.packetThrottleInterval) != peer -> packetThrottleInterval || + ENET_NET_TO_HOST_32 (command -> verifyConnect.packetThrottleAcceleration) != peer -> packetThrottleAcceleration || + ENET_NET_TO_HOST_32 (command -> verifyConnect.packetThrottleDeceleration) != peer -> packetThrottleDeceleration || + command -> verifyConnect.connectID != peer -> connectID) + { + peer -> eventData = 0; + + enet_protocol_dispatch_state (host, peer, ENET_PEER_STATE_ZOMBIE); + + return -1; + } + + enet_protocol_remove_sent_reliable_command (peer, 1, 0xFF); + + if (channelCount < peer -> channelCount) + peer -> channelCount = channelCount; + + peer -> outgoingPeerID = ENET_NET_TO_HOST_16 (command -> verifyConnect.outgoingPeerID); + peer -> incomingSessionID = command -> verifyConnect.incomingSessionID; + peer -> outgoingSessionID = command -> verifyConnect.outgoingSessionID; + + mtu = ENET_NET_TO_HOST_32 (command -> verifyConnect.mtu); + + if (mtu < ENET_PROTOCOL_MINIMUM_MTU) + mtu = ENET_PROTOCOL_MINIMUM_MTU; + else + if (mtu > ENET_PROTOCOL_MAXIMUM_MTU) + mtu = ENET_PROTOCOL_MAXIMUM_MTU; + + if (mtu < peer -> mtu) + peer -> mtu = mtu; + + windowSize = ENET_NET_TO_HOST_32 (command -> verifyConnect.windowSize); + + if (windowSize < ENET_PROTOCOL_MINIMUM_WINDOW_SIZE) + windowSize = ENET_PROTOCOL_MINIMUM_WINDOW_SIZE; + + if (windowSize > ENET_PROTOCOL_MAXIMUM_WINDOW_SIZE) + windowSize = ENET_PROTOCOL_MAXIMUM_WINDOW_SIZE; + + if (windowSize < peer -> windowSize) + peer -> windowSize = windowSize; + + peer -> incomingBandwidth = ENET_NET_TO_HOST_32 (command -> verifyConnect.incomingBandwidth); + peer -> outgoingBandwidth = ENET_NET_TO_HOST_32 (command -> verifyConnect.outgoingBandwidth); + + enet_protocol_notify_connect (host, peer, event); + return 0; +} + +static int +enet_protocol_handle_incoming_commands (ENetHost * host, ENetEvent * event) +{ + ENetProtocolHeader * header; + ENetProtocol * command; + ENetPeer * peer; + enet_uint8 * currentData; + size_t headerSize; + enet_uint16 peerID, flags; + enet_uint8 sessionID; + + if (host -> receivedDataLength < (size_t) & ((ENetProtocolHeader *) 0) -> sentTime) + return 0; + + header = (ENetProtocolHeader *) host -> receivedData; + + peerID = ENET_NET_TO_HOST_16 (header -> peerID); + sessionID = (peerID & ENET_PROTOCOL_HEADER_SESSION_MASK) >> ENET_PROTOCOL_HEADER_SESSION_SHIFT; + flags = peerID & ENET_PROTOCOL_HEADER_FLAG_MASK; + peerID &= ~ (ENET_PROTOCOL_HEADER_FLAG_MASK | ENET_PROTOCOL_HEADER_SESSION_MASK); + + headerSize = (flags & ENET_PROTOCOL_HEADER_FLAG_SENT_TIME ? sizeof (ENetProtocolHeader) : (size_t) & ((ENetProtocolHeader *) 0) -> sentTime); + if (host -> checksum != NULL) + headerSize += sizeof (enet_uint32); + + if (peerID == ENET_PROTOCOL_MAXIMUM_PEER_ID) + peer = NULL; + else + if (peerID >= host -> peerCount) + return 0; + else + { + peer = & host -> peers [peerID]; + + if (peer -> state == ENET_PEER_STATE_DISCONNECTED || + peer -> state == ENET_PEER_STATE_ZOMBIE || + ((host -> receivedAddress.host != peer -> address.host || + host -> receivedAddress.port != peer -> address.port) && + peer -> address.host != ENET_HOST_BROADCAST) || + (peer -> outgoingPeerID < ENET_PROTOCOL_MAXIMUM_PEER_ID && + sessionID != peer -> incomingSessionID)) + return 0; + } + + if (flags & ENET_PROTOCOL_HEADER_FLAG_COMPRESSED) + { + size_t originalSize; + if (host -> compressor.context == NULL || host -> compressor.decompress == NULL) + return 0; + + originalSize = host -> compressor.decompress (host -> compressor.context, + host -> receivedData + headerSize, + host -> receivedDataLength - headerSize, + host -> packetData [1] + headerSize, + sizeof (host -> packetData [1]) - headerSize); + if (originalSize <= 0 || originalSize > sizeof (host -> packetData [1]) - headerSize) + return 0; + + memcpy (host -> packetData [1], header, headerSize); + host -> receivedData = host -> packetData [1]; + host -> receivedDataLength = headerSize + originalSize; + } + + if (host -> checksum != NULL) + { + enet_uint32 * checksum = (enet_uint32 *) & host -> receivedData [headerSize - sizeof (enet_uint32)]; + enet_uint32 desiredChecksum, newChecksum; + ENetBuffer buffer; + /* Checksum may be an unaligned pointer, use memcpy to avoid undefined behaviour. */ + memcpy (& desiredChecksum, checksum, sizeof (enet_uint32)); + + newChecksum = peer != NULL ? peer -> connectID : 0; + memcpy (checksum, & newChecksum, sizeof (enet_uint32)); + + buffer.data = host -> receivedData; + buffer.dataLength = host -> receivedDataLength; + + if (host -> checksum (& buffer, 1) != desiredChecksum) + return 0; + } + + if (peer != NULL) + { + peer -> address.host = host -> receivedAddress.host; + peer -> address.port = host -> receivedAddress.port; + peer -> incomingDataTotal += host -> receivedDataLength; + } + + currentData = host -> receivedData + headerSize; + + while (currentData < & host -> receivedData [host -> receivedDataLength]) + { + enet_uint8 commandNumber; + size_t commandSize; + + command = (ENetProtocol *) currentData; + + if (currentData + sizeof (ENetProtocolCommandHeader) > & host -> receivedData [host -> receivedDataLength]) + break; + + commandNumber = command -> header.command & ENET_PROTOCOL_COMMAND_MASK; + if (commandNumber >= ENET_PROTOCOL_COMMAND_COUNT) + break; + + commandSize = commandSizes [commandNumber]; + if (commandSize == 0 || currentData + commandSize > & host -> receivedData [host -> receivedDataLength]) + break; + + currentData += commandSize; + + if (peer == NULL && commandNumber != ENET_PROTOCOL_COMMAND_CONNECT) + break; + + command -> header.reliableSequenceNumber = ENET_NET_TO_HOST_16 (command -> header.reliableSequenceNumber); + + switch (commandNumber) + { + case ENET_PROTOCOL_COMMAND_ACKNOWLEDGE: + if (enet_protocol_handle_acknowledge (host, event, peer, command)) + goto commandError; + break; + + case ENET_PROTOCOL_COMMAND_CONNECT: + if (peer != NULL) + goto commandError; + peer = enet_protocol_handle_connect (host, header, command); + if (peer == NULL) + goto commandError; + break; + + case ENET_PROTOCOL_COMMAND_VERIFY_CONNECT: + if (enet_protocol_handle_verify_connect (host, event, peer, command)) + goto commandError; + break; + + case ENET_PROTOCOL_COMMAND_DISCONNECT: + if (enet_protocol_handle_disconnect (host, peer, command)) + goto commandError; + break; + + case ENET_PROTOCOL_COMMAND_PING: + if (enet_protocol_handle_ping (host, peer, command)) + goto commandError; + break; + + case ENET_PROTOCOL_COMMAND_SEND_RELIABLE: + if (enet_protocol_handle_send_reliable (host, peer, command, & currentData)) + goto commandError; + break; + + case ENET_PROTOCOL_COMMAND_SEND_UNRELIABLE: + if (enet_protocol_handle_send_unreliable (host, peer, command, & currentData)) + goto commandError; + break; + + case ENET_PROTOCOL_COMMAND_SEND_UNSEQUENCED: + if (enet_protocol_handle_send_unsequenced (host, peer, command, & currentData)) + goto commandError; + break; + + case ENET_PROTOCOL_COMMAND_SEND_FRAGMENT: + if (enet_protocol_handle_send_fragment (host, peer, command, & currentData)) + goto commandError; + break; + + case ENET_PROTOCOL_COMMAND_BANDWIDTH_LIMIT: + if (enet_protocol_handle_bandwidth_limit (host, peer, command)) + goto commandError; + break; + + case ENET_PROTOCOL_COMMAND_THROTTLE_CONFIGURE: + if (enet_protocol_handle_throttle_configure (host, peer, command)) + goto commandError; + break; + + case ENET_PROTOCOL_COMMAND_SEND_UNRELIABLE_FRAGMENT: + if (enet_protocol_handle_send_unreliable_fragment (host, peer, command, & currentData)) + goto commandError; + break; + + default: + goto commandError; + } + + if (peer != NULL && + (command -> header.command & ENET_PROTOCOL_COMMAND_FLAG_ACKNOWLEDGE) != 0) + { + enet_uint16 sentTime; + + if (! (flags & ENET_PROTOCOL_HEADER_FLAG_SENT_TIME)) + break; + + sentTime = ENET_NET_TO_HOST_16 (header -> sentTime); + + switch (peer -> state) + { + case ENET_PEER_STATE_DISCONNECTING: + case ENET_PEER_STATE_ACKNOWLEDGING_CONNECT: + case ENET_PEER_STATE_DISCONNECTED: + case ENET_PEER_STATE_ZOMBIE: + break; + + case ENET_PEER_STATE_ACKNOWLEDGING_DISCONNECT: + if ((command -> header.command & ENET_PROTOCOL_COMMAND_MASK) == ENET_PROTOCOL_COMMAND_DISCONNECT) + enet_peer_queue_acknowledgement (peer, command, sentTime); + break; + + default: + enet_peer_queue_acknowledgement (peer, command, sentTime); + break; + } + } + } + +commandError: + if (event != NULL && event -> type != ENET_EVENT_TYPE_NONE) + return 1; + + return 0; +} + +static int +enet_protocol_receive_incoming_commands (ENetHost * host, ENetEvent * event) +{ + int packets; + + for (packets = 0; packets < 256; ++ packets) + { + int receivedLength; + ENetBuffer buffer; + + buffer.data = host -> packetData [0]; + buffer.dataLength = sizeof (host -> packetData [0]); + + receivedLength = enet_socket_receive (host -> socket, + & host -> receivedAddress, + & buffer, + 1); + + if (receivedLength == -2) + continue; + + if (receivedLength < 0) + return -1; + + if (receivedLength == 0) + return 0; + + host -> receivedData = host -> packetData [0]; + host -> receivedDataLength = receivedLength; + + host -> totalReceivedData += receivedLength; + host -> totalReceivedPackets ++; + + if (host -> intercept != NULL) + { + switch (host -> intercept (host, event)) + { + case 1: + if (event != NULL && event -> type != ENET_EVENT_TYPE_NONE) + return 1; + + continue; + + case -1: + return -1; + + default: + break; + } + } + + switch (enet_protocol_handle_incoming_commands (host, event)) + { + case 1: + return 1; + + case -1: + return -1; + + default: + break; + } + } + + return 0; +} + +static void +enet_protocol_send_acknowledgements (ENetHost * host, ENetPeer * peer) +{ + ENetProtocol * command = & host -> commands [host -> commandCount]; + ENetBuffer * buffer = & host -> buffers [host -> bufferCount]; + ENetAcknowledgement * acknowledgement; + ENetListIterator currentAcknowledgement; + enet_uint16 reliableSequenceNumber; + + currentAcknowledgement = enet_list_begin (& peer -> acknowledgements); + + while (currentAcknowledgement != enet_list_end (& peer -> acknowledgements)) + { + if (command >= & host -> commands [sizeof (host -> commands) / sizeof (ENetProtocol)] || + buffer >= & host -> buffers [sizeof (host -> buffers) / sizeof (ENetBuffer)] || + peer -> mtu - host -> packetSize < sizeof (ENetProtocolAcknowledge)) + { + peer -> flags |= ENET_PEER_FLAG_CONTINUE_SENDING; + + break; + } + + acknowledgement = (ENetAcknowledgement *) currentAcknowledgement; + + currentAcknowledgement = enet_list_next (currentAcknowledgement); + + buffer -> data = command; + buffer -> dataLength = sizeof (ENetProtocolAcknowledge); + + host -> packetSize += buffer -> dataLength; + + reliableSequenceNumber = ENET_HOST_TO_NET_16 (acknowledgement -> command.header.reliableSequenceNumber); + + command -> header.command = ENET_PROTOCOL_COMMAND_ACKNOWLEDGE; + command -> header.channelID = acknowledgement -> command.header.channelID; + command -> header.reliableSequenceNumber = reliableSequenceNumber; + command -> acknowledge.receivedReliableSequenceNumber = reliableSequenceNumber; + command -> acknowledge.receivedSentTime = ENET_HOST_TO_NET_16 (acknowledgement -> sentTime); + + if ((acknowledgement -> command.header.command & ENET_PROTOCOL_COMMAND_MASK) == ENET_PROTOCOL_COMMAND_DISCONNECT) + enet_protocol_dispatch_state (host, peer, ENET_PEER_STATE_ZOMBIE); + + enet_list_remove (& acknowledgement -> acknowledgementList); + enet_free (acknowledgement); + + ++ command; + ++ buffer; + } + + host -> commandCount = command - host -> commands; + host -> bufferCount = buffer - host -> buffers; +} + +static int +enet_protocol_check_timeouts (ENetHost * host, ENetPeer * peer, ENetEvent * event) +{ + ENetOutgoingCommand * outgoingCommand; + ENetListIterator currentCommand, insertPosition, insertSendReliablePosition; + + currentCommand = enet_list_begin (& peer -> sentReliableCommands); + insertPosition = enet_list_begin (& peer -> outgoingCommands); + insertSendReliablePosition = enet_list_begin (& peer -> outgoingSendReliableCommands); + + while (currentCommand != enet_list_end (& peer -> sentReliableCommands)) + { + outgoingCommand = (ENetOutgoingCommand *) currentCommand; + + currentCommand = enet_list_next (currentCommand); + + if (ENET_TIME_DIFFERENCE (host -> serviceTime, outgoingCommand -> sentTime) < outgoingCommand -> roundTripTimeout) + continue; + + if (peer -> earliestTimeout == 0 || + ENET_TIME_LESS (outgoingCommand -> sentTime, peer -> earliestTimeout)) + peer -> earliestTimeout = outgoingCommand -> sentTime; + + if (peer -> earliestTimeout != 0 && + (ENET_TIME_DIFFERENCE (host -> serviceTime, peer -> earliestTimeout) >= peer -> timeoutMaximum || + ((1 << (outgoingCommand -> sendAttempts - 1)) >= peer -> timeoutLimit && + ENET_TIME_DIFFERENCE (host -> serviceTime, peer -> earliestTimeout) >= peer -> timeoutMinimum))) + { + enet_protocol_notify_disconnect (host, peer, event); + + return 1; + } + + ++ peer -> packetsLost; + + outgoingCommand -> roundTripTimeout *= 2; + + if (outgoingCommand -> packet != NULL) + { + peer -> reliableDataInTransit -= outgoingCommand -> fragmentLength; + + enet_list_insert (insertSendReliablePosition, enet_list_remove (& outgoingCommand -> outgoingCommandList)); + } + else + enet_list_insert (insertPosition, enet_list_remove (& outgoingCommand -> outgoingCommandList)); + + if (currentCommand == enet_list_begin (& peer -> sentReliableCommands) && + ! enet_list_empty (& peer -> sentReliableCommands)) + { + outgoingCommand = (ENetOutgoingCommand *) currentCommand; + + peer -> nextTimeout = outgoingCommand -> sentTime + outgoingCommand -> roundTripTimeout; + } + } + + return 0; +} + +static int +enet_protocol_check_outgoing_commands (ENetHost * host, ENetPeer * peer, ENetList * sentUnreliableCommands) +{ + ENetProtocol * command = & host -> commands [host -> commandCount]; + ENetBuffer * buffer = & host -> buffers [host -> bufferCount]; + ENetOutgoingCommand * outgoingCommand; + ENetListIterator currentCommand, currentSendReliableCommand; + ENetChannel *channel = NULL; + enet_uint16 reliableWindow = 0; + size_t commandSize; + int windowWrap = 0, canPing = 1; + + currentCommand = enet_list_begin (& peer -> outgoingCommands); + currentSendReliableCommand = enet_list_begin (& peer -> outgoingSendReliableCommands); + + for (;;) + { + if (currentCommand != enet_list_end (& peer -> outgoingCommands)) + { + outgoingCommand = (ENetOutgoingCommand *) currentCommand; + + if (currentSendReliableCommand != enet_list_end (& peer -> outgoingSendReliableCommands) && + ENET_TIME_LESS (((ENetOutgoingCommand *) currentSendReliableCommand) -> queueTime, outgoingCommand -> queueTime)) + goto useSendReliableCommand; + + currentCommand = enet_list_next (currentCommand); + } + else + if (currentSendReliableCommand != enet_list_end (& peer -> outgoingSendReliableCommands)) + { + useSendReliableCommand: + outgoingCommand = (ENetOutgoingCommand *) currentSendReliableCommand; + currentSendReliableCommand = enet_list_next (currentSendReliableCommand); + } + else + break; + + if (outgoingCommand -> command.header.command & ENET_PROTOCOL_COMMAND_FLAG_ACKNOWLEDGE) + { + channel = outgoingCommand -> command.header.channelID < peer -> channelCount ? & peer -> channels [outgoingCommand -> command.header.channelID] : NULL; + reliableWindow = outgoingCommand -> reliableSequenceNumber / ENET_PEER_RELIABLE_WINDOW_SIZE; + if (channel != NULL) + { + if (windowWrap) + continue; + else + if (outgoingCommand -> sendAttempts < 1 && + ! (outgoingCommand -> reliableSequenceNumber % ENET_PEER_RELIABLE_WINDOW_SIZE) && + (channel -> reliableWindows [(reliableWindow + ENET_PEER_RELIABLE_WINDOWS - 1) % ENET_PEER_RELIABLE_WINDOWS] >= ENET_PEER_RELIABLE_WINDOW_SIZE || + channel -> usedReliableWindows & ((((1 << (ENET_PEER_FREE_RELIABLE_WINDOWS + 2)) - 1) << reliableWindow) | + (((1 << (ENET_PEER_FREE_RELIABLE_WINDOWS + 2)) - 1) >> (ENET_PEER_RELIABLE_WINDOWS - reliableWindow))))) + { + windowWrap = 1; + currentSendReliableCommand = enet_list_end (& peer -> outgoingSendReliableCommands); + + continue; + } + } + + if (outgoingCommand -> packet != NULL) + { + enet_uint32 windowSize = (peer -> packetThrottle * peer -> windowSize) / ENET_PEER_PACKET_THROTTLE_SCALE; + + if (peer -> reliableDataInTransit + outgoingCommand -> fragmentLength > ENET_MAX (windowSize, peer -> mtu)) + { + currentSendReliableCommand = enet_list_end (& peer -> outgoingSendReliableCommands); + + continue; + } + } + + canPing = 0; + } + + commandSize = commandSizes [outgoingCommand -> command.header.command & ENET_PROTOCOL_COMMAND_MASK]; + if (command >= & host -> commands [sizeof (host -> commands) / sizeof (ENetProtocol)] || + buffer + 1 >= & host -> buffers [sizeof (host -> buffers) / sizeof (ENetBuffer)] || + peer -> mtu - host -> packetSize < commandSize || + (outgoingCommand -> packet != NULL && + (enet_uint16) (peer -> mtu - host -> packetSize) < (enet_uint16) (commandSize + outgoingCommand -> fragmentLength))) + { + peer -> flags |= ENET_PEER_FLAG_CONTINUE_SENDING; + + break; + } + + if (outgoingCommand -> command.header.command & ENET_PROTOCOL_COMMAND_FLAG_ACKNOWLEDGE) + { + if (channel != NULL && outgoingCommand -> sendAttempts < 1) + { + channel -> usedReliableWindows |= 1 << reliableWindow; + ++ channel -> reliableWindows [reliableWindow]; + } + + ++ outgoingCommand -> sendAttempts; + + if (outgoingCommand -> roundTripTimeout == 0) + outgoingCommand -> roundTripTimeout = peer -> roundTripTime + 4 * peer -> roundTripTimeVariance; + + if (enet_list_empty (& peer -> sentReliableCommands)) + peer -> nextTimeout = host -> serviceTime + outgoingCommand -> roundTripTimeout; + + enet_list_insert (enet_list_end (& peer -> sentReliableCommands), + enet_list_remove (& outgoingCommand -> outgoingCommandList)); + + outgoingCommand -> sentTime = host -> serviceTime; + + host -> headerFlags |= ENET_PROTOCOL_HEADER_FLAG_SENT_TIME; + + peer -> reliableDataInTransit += outgoingCommand -> fragmentLength; + } + else + { + if (outgoingCommand -> packet != NULL && outgoingCommand -> fragmentOffset == 0) + { + peer -> packetThrottleCounter += ENET_PEER_PACKET_THROTTLE_COUNTER; + peer -> packetThrottleCounter %= ENET_PEER_PACKET_THROTTLE_SCALE; + + if (peer -> packetThrottleCounter > peer -> packetThrottle) + { + enet_uint16 reliableSequenceNumber = outgoingCommand -> reliableSequenceNumber, + unreliableSequenceNumber = outgoingCommand -> unreliableSequenceNumber; + for (;;) + { + -- outgoingCommand -> packet -> referenceCount; + + if (outgoingCommand -> packet -> referenceCount == 0) + enet_packet_destroy (outgoingCommand -> packet); + + enet_list_remove (& outgoingCommand -> outgoingCommandList); + enet_free (outgoingCommand); + + if (currentCommand == enet_list_end (& peer -> outgoingCommands)) + break; + + outgoingCommand = (ENetOutgoingCommand *) currentCommand; + if (outgoingCommand -> reliableSequenceNumber != reliableSequenceNumber || + outgoingCommand -> unreliableSequenceNumber != unreliableSequenceNumber) + break; + + currentCommand = enet_list_next (currentCommand); + } + + continue; + } + } + + enet_list_remove (& outgoingCommand -> outgoingCommandList); + + if (outgoingCommand -> packet != NULL) + enet_list_insert (enet_list_end (sentUnreliableCommands), outgoingCommand); + } + + buffer -> data = command; + buffer -> dataLength = commandSize; + + host -> packetSize += buffer -> dataLength; + + * command = outgoingCommand -> command; + + if (outgoingCommand -> packet != NULL) + { + ++ buffer; + + buffer -> data = outgoingCommand -> packet -> data + outgoingCommand -> fragmentOffset; + buffer -> dataLength = outgoingCommand -> fragmentLength; + + host -> packetSize += outgoingCommand -> fragmentLength; + } + else + if (! (outgoingCommand -> command.header.command & ENET_PROTOCOL_COMMAND_FLAG_ACKNOWLEDGE)) + enet_free (outgoingCommand); + + ++ peer -> packetsSent; + + ++ command; + ++ buffer; + } + + host -> commandCount = command - host -> commands; + host -> bufferCount = buffer - host -> buffers; + + if (peer -> state == ENET_PEER_STATE_DISCONNECT_LATER && + ! enet_peer_has_outgoing_commands (peer) && + enet_list_empty (sentUnreliableCommands)) + enet_peer_disconnect (peer, peer -> eventData); + + return canPing; +} + +static int +enet_protocol_send_outgoing_commands (ENetHost * host, ENetEvent * event, int checkForTimeouts) +{ + enet_uint8 headerData [sizeof (ENetProtocolHeader) + sizeof (enet_uint32)]; + ENetProtocolHeader * header = (ENetProtocolHeader *) headerData; + int sentLength = 0; + size_t shouldCompress = 0; + ENetList sentUnreliableCommands; + + enet_list_clear (& sentUnreliableCommands); + + for (int sendPass = 0, continueSending = 0; sendPass <= continueSending; ++ sendPass) + for (ENetPeer * currentPeer = host -> peers; + currentPeer < & host -> peers [host -> peerCount]; + ++ currentPeer) + { + if (currentPeer -> state == ENET_PEER_STATE_DISCONNECTED || + currentPeer -> state == ENET_PEER_STATE_ZOMBIE || + (sendPass > 0 && ! (currentPeer -> flags & ENET_PEER_FLAG_CONTINUE_SENDING))) + continue; + + currentPeer -> flags &= ~ ENET_PEER_FLAG_CONTINUE_SENDING; + + host -> headerFlags = 0; + host -> commandCount = 0; + host -> bufferCount = 1; + host -> packetSize = sizeof (ENetProtocolHeader); + + if (! enet_list_empty (& currentPeer -> acknowledgements)) + enet_protocol_send_acknowledgements (host, currentPeer); + + if (checkForTimeouts != 0 && + ! enet_list_empty (& currentPeer -> sentReliableCommands) && + ENET_TIME_GREATER_EQUAL (host -> serviceTime, currentPeer -> nextTimeout) && + enet_protocol_check_timeouts (host, currentPeer, event) == 1) + { + if (event != NULL && event -> type != ENET_EVENT_TYPE_NONE) + return 1; + else + goto nextPeer; + } + + if (((enet_list_empty (& currentPeer -> outgoingCommands) && + enet_list_empty (& currentPeer -> outgoingSendReliableCommands)) || + enet_protocol_check_outgoing_commands (host, currentPeer, & sentUnreliableCommands)) && + enet_list_empty (& currentPeer -> sentReliableCommands) && + ENET_TIME_DIFFERENCE (host -> serviceTime, currentPeer -> lastReceiveTime) >= currentPeer -> pingInterval && + currentPeer -> mtu - host -> packetSize >= sizeof (ENetProtocolPing)) + { + enet_peer_ping (currentPeer); + enet_protocol_check_outgoing_commands (host, currentPeer, & sentUnreliableCommands); + } + + if (host -> commandCount == 0) + goto nextPeer; + + if (currentPeer -> packetLossEpoch == 0) + currentPeer -> packetLossEpoch = host -> serviceTime; + else + if (ENET_TIME_DIFFERENCE (host -> serviceTime, currentPeer -> packetLossEpoch) >= ENET_PEER_PACKET_LOSS_INTERVAL && + currentPeer -> packetsSent > 0) + { + enet_uint32 packetLoss = currentPeer -> packetsLost * ENET_PEER_PACKET_LOSS_SCALE / currentPeer -> packetsSent; + +#ifdef ENET_DEBUG + printf ("peer %u: %f%%+-%f%% packet loss, %u+-%u ms round trip time, %f%% throttle, %u outgoing, %u/%u incoming\n", currentPeer -> incomingPeerID, currentPeer -> packetLoss / (float) ENET_PEER_PACKET_LOSS_SCALE, currentPeer -> packetLossVariance / (float) ENET_PEER_PACKET_LOSS_SCALE, currentPeer -> roundTripTime, currentPeer -> roundTripTimeVariance, currentPeer -> packetThrottle / (float) ENET_PEER_PACKET_THROTTLE_SCALE, enet_list_size (& currentPeer -> outgoingCommands) + enet_list_size (& currentPeer -> outgoingSendReliableCommands), currentPeer -> channels != NULL ? enet_list_size (& currentPeer -> channels -> incomingReliableCommands) : 0, currentPeer -> channels != NULL ? enet_list_size (& currentPeer -> channels -> incomingUnreliableCommands) : 0); +#endif + + currentPeer -> packetLossVariance = (currentPeer -> packetLossVariance * 3 + ENET_DIFFERENCE (packetLoss, currentPeer -> packetLoss)) / 4; + currentPeer -> packetLoss = (currentPeer -> packetLoss * 7 + packetLoss) / 8; + + currentPeer -> packetLossEpoch = host -> serviceTime; + currentPeer -> packetsSent = 0; + currentPeer -> packetsLost = 0; + } + + host -> buffers -> data = headerData; + if (host -> headerFlags & ENET_PROTOCOL_HEADER_FLAG_SENT_TIME) + { + header -> sentTime = ENET_HOST_TO_NET_16 (host -> serviceTime & 0xFFFF); + + host -> buffers -> dataLength = sizeof (ENetProtocolHeader); + } + else + host -> buffers -> dataLength = (size_t) & ((ENetProtocolHeader *) 0) -> sentTime; + + shouldCompress = 0; + if (host -> compressor.context != NULL && host -> compressor.compress != NULL) + { + size_t originalSize = host -> packetSize - sizeof(ENetProtocolHeader), + compressedSize = host -> compressor.compress (host -> compressor.context, + & host -> buffers [1], host -> bufferCount - 1, + originalSize, + host -> packetData [1], + originalSize); + if (compressedSize > 0 && compressedSize < originalSize) + { + host -> headerFlags |= ENET_PROTOCOL_HEADER_FLAG_COMPRESSED; + shouldCompress = compressedSize; +#ifdef ENET_DEBUG_COMPRESS + printf ("peer %u: compressed %u -> %u (%u%%)\n", currentPeer -> incomingPeerID, originalSize, compressedSize, (compressedSize * 100) / originalSize); +#endif + } + } + + if (currentPeer -> outgoingPeerID < ENET_PROTOCOL_MAXIMUM_PEER_ID) + host -> headerFlags |= currentPeer -> outgoingSessionID << ENET_PROTOCOL_HEADER_SESSION_SHIFT; + header -> peerID = ENET_HOST_TO_NET_16 (currentPeer -> outgoingPeerID | host -> headerFlags); + if (host -> checksum != NULL) + { + enet_uint32 * checksum = (enet_uint32 *) & headerData [host -> buffers -> dataLength]; + enet_uint32 newChecksum = currentPeer -> outgoingPeerID < ENET_PROTOCOL_MAXIMUM_PEER_ID ? currentPeer -> connectID : 0; + /* Checksum may be unaligned, use memcpy to avoid undefined behaviour. */ + memcpy(checksum, & newChecksum, sizeof (enet_uint32)); + host -> buffers -> dataLength += sizeof (enet_uint32); + newChecksum = host -> checksum (host -> buffers, host -> bufferCount); + memcpy(checksum, & newChecksum, sizeof (enet_uint32)); + } + + if (shouldCompress > 0) + { + host -> buffers [1].data = host -> packetData [1]; + host -> buffers [1].dataLength = shouldCompress; + host -> bufferCount = 2; + } + + currentPeer -> lastSendTime = host -> serviceTime; + + sentLength = enet_socket_send (host -> socket, & currentPeer -> address, host -> buffers, host -> bufferCount); + + enet_protocol_remove_sent_unreliable_commands (currentPeer, & sentUnreliableCommands); + + if (sentLength < 0) + return -1; + + host -> totalSentData += sentLength; + host -> totalSentPackets ++; + + nextPeer: + if (currentPeer -> flags & ENET_PEER_FLAG_CONTINUE_SENDING) + continueSending = sendPass + 1; + } + + return 0; +} + +/** Sends any queued packets on the host specified to its designated peers. + + @param host host to flush + @remarks this function need only be used in circumstances where one wishes to send queued packets earlier than in a call to enet_host_service(). + @ingroup host +*/ +void +enet_host_flush (ENetHost * host) +{ + host -> serviceTime = enet_time_get (); + + enet_protocol_send_outgoing_commands (host, NULL, 0); +} + +/** Checks for any queued events on the host and dispatches one if available. + + @param host host to check for events + @param event an event structure where event details will be placed if available + @retval > 0 if an event was dispatched + @retval 0 if no events are available + @retval < 0 on failure + @ingroup host +*/ +int +enet_host_check_events (ENetHost * host, ENetEvent * event) +{ + if (event == NULL) return -1; + + event -> type = ENET_EVENT_TYPE_NONE; + event -> peer = NULL; + event -> packet = NULL; + + return enet_protocol_dispatch_incoming_commands (host, event); +} + +/** Waits for events on the host specified and shuttles packets between + the host and its peers. + + @param host host to service + @param event an event structure where event details will be placed if one occurs + if event == NULL then no events will be delivered + @param timeout number of milliseconds that ENet should wait for events + @retval > 0 if an event occurred within the specified time limit + @retval 0 if no event occurred + @retval < 0 on failure + @remarks enet_host_service should be called fairly regularly for adequate performance + @ingroup host +*/ +int +enet_host_service (ENetHost * host, ENetEvent * event, enet_uint32 timeout) +{ + enet_uint32 waitCondition; + + if (event != NULL) + { + event -> type = ENET_EVENT_TYPE_NONE; + event -> peer = NULL; + event -> packet = NULL; + + switch (enet_protocol_dispatch_incoming_commands (host, event)) + { + case 1: + return 1; + + case -1: +#ifdef ENET_DEBUG + perror ("Error dispatching incoming packets"); +#endif + + return -1; + + default: + break; + } + } + + host -> serviceTime = enet_time_get (); + + timeout += host -> serviceTime; + + do + { + if (ENET_TIME_DIFFERENCE (host -> serviceTime, host -> bandwidthThrottleEpoch) >= ENET_HOST_BANDWIDTH_THROTTLE_INTERVAL) + enet_host_bandwidth_throttle (host); + + switch (enet_protocol_send_outgoing_commands (host, event, 1)) + { + case 1: + return 1; + + case -1: +#ifdef ENET_DEBUG + perror ("Error sending outgoing packets"); +#endif + + return -1; + + default: + break; + } + + switch (enet_protocol_receive_incoming_commands (host, event)) + { + case 1: + return 1; + + case -1: +#ifdef ENET_DEBUG + perror ("Error receiving incoming packets"); +#endif + + return -1; + + default: + break; + } + + switch (enet_protocol_send_outgoing_commands (host, event, 1)) + { + case 1: + return 1; + + case -1: +#ifdef ENET_DEBUG + perror ("Error sending outgoing packets"); +#endif + + return -1; + + default: + break; + } + + if (event != NULL) + { + switch (enet_protocol_dispatch_incoming_commands (host, event)) + { + case 1: + return 1; + + case -1: +#ifdef ENET_DEBUG + perror ("Error dispatching incoming packets"); +#endif + + return -1; + + default: + break; + } + } + + if (ENET_TIME_GREATER_EQUAL (host -> serviceTime, timeout)) + return 0; + + do + { + host -> serviceTime = enet_time_get (); + + if (ENET_TIME_GREATER_EQUAL (host -> serviceTime, timeout)) + return 0; + + waitCondition = ENET_SOCKET_WAIT_RECEIVE | ENET_SOCKET_WAIT_INTERRUPT; + + if (enet_socket_wait (host -> socket, & waitCondition, ENET_TIME_DIFFERENCE (timeout, host -> serviceTime)) != 0) + return -1; + } + while (waitCondition & ENET_SOCKET_WAIT_INTERRUPT); + + host -> serviceTime = enet_time_get (); + } while (waitCondition & ENET_SOCKET_WAIT_RECEIVE); + + return 0; +} + diff --git a/thirdparty/enet/unix.c b/thirdparty/enet/unix.c new file mode 100644 index 0000000..6669216 --- /dev/null +++ b/thirdparty/enet/unix.c @@ -0,0 +1,624 @@ +/** + @file unix.c + @brief ENet Unix system specific functions +*/ +#ifndef _WIN32 + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define ENET_BUILDING_LIB 1 +#include "enet/enet.h" + +#ifdef __APPLE__ +#ifdef HAS_POLL +#undef HAS_POLL +#endif +#ifndef HAS_FCNTL +#define HAS_FCNTL 1 +#endif +#ifndef HAS_INET_PTON +#define HAS_INET_PTON 1 +#endif +#ifndef HAS_INET_NTOP +#define HAS_INET_NTOP 1 +#endif +#ifndef HAS_MSGHDR_FLAGS +#define HAS_MSGHDR_FLAGS 1 +#endif +#ifndef HAS_SOCKLEN_T +#define HAS_SOCKLEN_T 1 +#endif +#ifndef HAS_GETADDRINFO +#define HAS_GETADDRINFO 1 +#endif +#ifndef HAS_GETNAMEINFO +#define HAS_GETNAMEINFO 1 +#endif +#endif + +#ifdef HAS_FCNTL +#include +#endif + +#ifdef HAS_POLL +#include +#endif + +#if !defined(HAS_SOCKLEN_T) && !defined(__socklen_t_defined) +typedef int socklen_t; +#endif + +#ifndef MSG_NOSIGNAL +#define MSG_NOSIGNAL 0 +#endif + +static enet_uint32 timeBase = 0; + +int +enet_initialize (void) +{ + return 0; +} + +void +enet_deinitialize (void) +{ +} + +enet_uint32 +enet_host_random_seed (void) +{ + return (enet_uint32) time (NULL); +} + +enet_uint32 +enet_time_get (void) +{ + struct timeval timeVal; + + gettimeofday (& timeVal, NULL); + + return timeVal.tv_sec * 1000 + timeVal.tv_usec / 1000 - timeBase; +} + +void +enet_time_set (enet_uint32 newTimeBase) +{ + struct timeval timeVal; + + gettimeofday (& timeVal, NULL); + + timeBase = timeVal.tv_sec * 1000 + timeVal.tv_usec / 1000 - newTimeBase; +} + +int +enet_address_set_host_ip (ENetAddress * address, const char * name) +{ +#ifdef HAS_INET_PTON + if (! inet_pton (AF_INET, name, & address -> host)) +#else + if (! inet_aton (name, (struct in_addr *) & address -> host)) +#endif + return -1; + + return 0; +} + +int +enet_address_set_host (ENetAddress * address, const char * name) +{ +#ifdef HAS_GETADDRINFO + struct addrinfo hints, * resultList = NULL, * result = NULL; + + memset (& hints, 0, sizeof (hints)); + hints.ai_family = AF_INET; + + if (getaddrinfo (name, NULL, NULL, & resultList) != 0) + return -1; + + for (result = resultList; result != NULL; result = result -> ai_next) + { + if (result -> ai_family == AF_INET && result -> ai_addr != NULL && result -> ai_addrlen >= sizeof (struct sockaddr_in)) + { + struct sockaddr_in * sin = (struct sockaddr_in *) result -> ai_addr; + + address -> host = sin -> sin_addr.s_addr; + + freeaddrinfo (resultList); + + return 0; + } + } + + if (resultList != NULL) + freeaddrinfo (resultList); +#else + struct hostent * hostEntry = NULL; +#ifdef HAS_GETHOSTBYNAME_R + struct hostent hostData; + char buffer [2048]; + int errnum; + +#if defined(linux) || defined(__linux) || defined(__linux__) || defined(__FreeBSD__) || defined(__FreeBSD_kernel__) || defined(__DragonFly__) || defined(__GNU__) + gethostbyname_r (name, & hostData, buffer, sizeof (buffer), & hostEntry, & errnum); +#else + hostEntry = gethostbyname_r (name, & hostData, buffer, sizeof (buffer), & errnum); +#endif +#else + hostEntry = gethostbyname (name); +#endif + + if (hostEntry != NULL && hostEntry -> h_addrtype == AF_INET) + { + address -> host = * (enet_uint32 *) hostEntry -> h_addr_list [0]; + + return 0; + } +#endif + + return enet_address_set_host_ip (address, name); +} + +int +enet_address_get_host_ip (const ENetAddress * address, char * name, size_t nameLength) +{ +#ifdef HAS_INET_NTOP + if (inet_ntop (AF_INET, & address -> host, name, nameLength) == NULL) +#else + char * addr = inet_ntoa (* (struct in_addr *) & address -> host); + if (addr != NULL) + { + size_t addrLen = strlen(addr); + if (addrLen >= nameLength) + return -1; + memcpy (name, addr, addrLen + 1); + } + else +#endif + return -1; + return 0; +} + +int +enet_address_get_host (const ENetAddress * address, char * name, size_t nameLength) +{ +#ifdef HAS_GETNAMEINFO + struct sockaddr_in sin; + int err; + + memset (& sin, 0, sizeof (struct sockaddr_in)); + + sin.sin_family = AF_INET; + sin.sin_port = ENET_HOST_TO_NET_16 (address -> port); + sin.sin_addr.s_addr = address -> host; + + err = getnameinfo ((struct sockaddr *) & sin, sizeof (sin), name, nameLength, NULL, 0, NI_NAMEREQD); + if (! err) + { + if (name != NULL && nameLength > 0 && ! memchr (name, '\0', nameLength)) + return -1; + return 0; + } + if (err != EAI_NONAME) + return -1; +#else + struct in_addr in; + struct hostent * hostEntry = NULL; +#ifdef HAS_GETHOSTBYADDR_R + struct hostent hostData; + char buffer [2048]; + int errnum; + + in.s_addr = address -> host; + +#if defined(linux) || defined(__linux) || defined(__linux__) || defined(__FreeBSD__) || defined(__FreeBSD_kernel__) || defined(__DragonFly__) || defined(__GNU__) + gethostbyaddr_r ((char *) & in, sizeof (struct in_addr), AF_INET, & hostData, buffer, sizeof (buffer), & hostEntry, & errnum); +#else + hostEntry = gethostbyaddr_r ((char *) & in, sizeof (struct in_addr), AF_INET, & hostData, buffer, sizeof (buffer), & errnum); +#endif +#else + in.s_addr = address -> host; + + hostEntry = gethostbyaddr ((char *) & in, sizeof (struct in_addr), AF_INET); +#endif + + if (hostEntry != NULL) + { + size_t hostLen = strlen (hostEntry -> h_name); + if (hostLen >= nameLength) + return -1; + memcpy (name, hostEntry -> h_name, hostLen + 1); + return 0; + } +#endif + + return enet_address_get_host_ip (address, name, nameLength); +} + +int +enet_socket_bind (ENetSocket socket, const ENetAddress * address) +{ + struct sockaddr_in sin; + + memset (& sin, 0, sizeof (struct sockaddr_in)); + + sin.sin_family = AF_INET; + + if (address != NULL) + { + sin.sin_port = ENET_HOST_TO_NET_16 (address -> port); + sin.sin_addr.s_addr = address -> host; + } + else + { + sin.sin_port = 0; + sin.sin_addr.s_addr = INADDR_ANY; + } + + return bind (socket, + (struct sockaddr *) & sin, + sizeof (struct sockaddr_in)); +} + +int +enet_socket_get_address (ENetSocket socket, ENetAddress * address) +{ + struct sockaddr_in sin; + socklen_t sinLength = sizeof (struct sockaddr_in); + + if (getsockname (socket, (struct sockaddr *) & sin, & sinLength) == -1) + return -1; + + address -> host = (enet_uint32) sin.sin_addr.s_addr; + address -> port = ENET_NET_TO_HOST_16 (sin.sin_port); + + return 0; +} + +int +enet_socket_listen (ENetSocket socket, int backlog) +{ + return listen (socket, backlog < 0 ? SOMAXCONN : backlog); +} + +ENetSocket +enet_socket_create (ENetSocketType type) +{ + return socket (PF_INET, type == ENET_SOCKET_TYPE_DATAGRAM ? SOCK_DGRAM : SOCK_STREAM, 0); +} + +int +enet_socket_set_option (ENetSocket socket, ENetSocketOption option, int value) +{ + int result = -1; + switch (option) + { + case ENET_SOCKOPT_NONBLOCK: +#ifdef HAS_FCNTL + result = fcntl (socket, F_SETFL, (value ? O_NONBLOCK : 0) | (fcntl (socket, F_GETFL) & ~O_NONBLOCK)); +#else + result = ioctl (socket, FIONBIO, & value); +#endif + break; + + case ENET_SOCKOPT_BROADCAST: + result = setsockopt (socket, SOL_SOCKET, SO_BROADCAST, (char *) & value, sizeof (int)); + break; + + case ENET_SOCKOPT_REUSEADDR: + result = setsockopt (socket, SOL_SOCKET, SO_REUSEADDR, (char *) & value, sizeof (int)); + break; + + case ENET_SOCKOPT_RCVBUF: + result = setsockopt (socket, SOL_SOCKET, SO_RCVBUF, (char *) & value, sizeof (int)); + break; + + case ENET_SOCKOPT_SNDBUF: + result = setsockopt (socket, SOL_SOCKET, SO_SNDBUF, (char *) & value, sizeof (int)); + break; + + case ENET_SOCKOPT_RCVTIMEO: + { + struct timeval timeVal; + timeVal.tv_sec = value / 1000; + timeVal.tv_usec = (value % 1000) * 1000; + result = setsockopt (socket, SOL_SOCKET, SO_RCVTIMEO, (char *) & timeVal, sizeof (struct timeval)); + break; + } + + case ENET_SOCKOPT_SNDTIMEO: + { + struct timeval timeVal; + timeVal.tv_sec = value / 1000; + timeVal.tv_usec = (value % 1000) * 1000; + result = setsockopt (socket, SOL_SOCKET, SO_SNDTIMEO, (char *) & timeVal, sizeof (struct timeval)); + break; + } + + case ENET_SOCKOPT_NODELAY: + result = setsockopt (socket, IPPROTO_TCP, TCP_NODELAY, (char *) & value, sizeof (int)); + break; + + case ENET_SOCKOPT_TTL: + result = setsockopt (socket, IPPROTO_IP, IP_TTL, (char *) & value, sizeof (int)); + break; + + default: + break; + } + return result == -1 ? -1 : 0; +} + +int +enet_socket_get_option (ENetSocket socket, ENetSocketOption option, int * value) +{ + int result = -1; + socklen_t len; + switch (option) + { + case ENET_SOCKOPT_ERROR: + len = sizeof (int); + result = getsockopt (socket, SOL_SOCKET, SO_ERROR, value, & len); + break; + + case ENET_SOCKOPT_TTL: + len = sizeof (int); + result = getsockopt (socket, IPPROTO_IP, IP_TTL, (char *) value, & len); + break; + + default: + break; + } + return result == -1 ? -1 : 0; +} + +int +enet_socket_connect (ENetSocket socket, const ENetAddress * address) +{ + struct sockaddr_in sin; + int result; + + memset (& sin, 0, sizeof (struct sockaddr_in)); + + sin.sin_family = AF_INET; + sin.sin_port = ENET_HOST_TO_NET_16 (address -> port); + sin.sin_addr.s_addr = address -> host; + + result = connect (socket, (struct sockaddr *) & sin, sizeof (struct sockaddr_in)); + if (result == -1 && errno == EINPROGRESS) + return 0; + + return result; +} + +ENetSocket +enet_socket_accept (ENetSocket socket, ENetAddress * address) +{ + int result; + struct sockaddr_in sin; + socklen_t sinLength = sizeof (struct sockaddr_in); + + result = accept (socket, + address != NULL ? (struct sockaddr *) & sin : NULL, + address != NULL ? & sinLength : NULL); + + if (result == -1) + return ENET_SOCKET_NULL; + + if (address != NULL) + { + address -> host = (enet_uint32) sin.sin_addr.s_addr; + address -> port = ENET_NET_TO_HOST_16 (sin.sin_port); + } + + return result; +} + +int +enet_socket_shutdown (ENetSocket socket, ENetSocketShutdown how) +{ + return shutdown (socket, (int) how); +} + +void +enet_socket_destroy (ENetSocket socket) +{ + if (socket != -1) + close (socket); +} + +int +enet_socket_send (ENetSocket socket, + const ENetAddress * address, + const ENetBuffer * buffers, + size_t bufferCount) +{ + struct msghdr msgHdr; + struct sockaddr_in sin; + int sentLength; + + memset (& msgHdr, 0, sizeof (struct msghdr)); + + if (address != NULL) + { + memset (& sin, 0, sizeof (struct sockaddr_in)); + + sin.sin_family = AF_INET; + sin.sin_port = ENET_HOST_TO_NET_16 (address -> port); + sin.sin_addr.s_addr = address -> host; + + msgHdr.msg_name = & sin; + msgHdr.msg_namelen = sizeof (struct sockaddr_in); + } + + msgHdr.msg_iov = (struct iovec *) buffers; + msgHdr.msg_iovlen = bufferCount; + + sentLength = sendmsg (socket, & msgHdr, MSG_NOSIGNAL); + + if (sentLength == -1) + { + if (errno == EWOULDBLOCK) + return 0; + + return -1; + } + + return sentLength; +} + +int +enet_socket_receive (ENetSocket socket, + ENetAddress * address, + ENetBuffer * buffers, + size_t bufferCount) +{ + struct msghdr msgHdr; + struct sockaddr_in sin; + int recvLength; + + memset (& msgHdr, 0, sizeof (struct msghdr)); + + if (address != NULL) + { + msgHdr.msg_name = & sin; + msgHdr.msg_namelen = sizeof (struct sockaddr_in); + } + + msgHdr.msg_iov = (struct iovec *) buffers; + msgHdr.msg_iovlen = bufferCount; + + recvLength = recvmsg (socket, & msgHdr, MSG_NOSIGNAL); + + if (recvLength == -1) + { + if (errno == EWOULDBLOCK) + return 0; + + return -1; + } + +#ifdef HAS_MSGHDR_FLAGS + if (msgHdr.msg_flags & MSG_TRUNC) + return -2; +#endif + + if (address != NULL) + { + address -> host = (enet_uint32) sin.sin_addr.s_addr; + address -> port = ENET_NET_TO_HOST_16 (sin.sin_port); + } + + return recvLength; +} + +int +enet_socketset_select (ENetSocket maxSocket, ENetSocketSet * readSet, ENetSocketSet * writeSet, enet_uint32 timeout) +{ + struct timeval timeVal; + + timeVal.tv_sec = timeout / 1000; + timeVal.tv_usec = (timeout % 1000) * 1000; + + return select (maxSocket + 1, readSet, writeSet, NULL, & timeVal); +} + +int +enet_socket_wait (ENetSocket socket, enet_uint32 * condition, enet_uint32 timeout) +{ +#ifdef HAS_POLL + struct pollfd pollSocket; + int pollCount; + + pollSocket.fd = socket; + pollSocket.events = 0; + + if (* condition & ENET_SOCKET_WAIT_SEND) + pollSocket.events |= POLLOUT; + + if (* condition & ENET_SOCKET_WAIT_RECEIVE) + pollSocket.events |= POLLIN; + + pollCount = poll (& pollSocket, 1, timeout); + + if (pollCount < 0) + { + if (errno == EINTR && * condition & ENET_SOCKET_WAIT_INTERRUPT) + { + * condition = ENET_SOCKET_WAIT_INTERRUPT; + + return 0; + } + + return -1; + } + + * condition = ENET_SOCKET_WAIT_NONE; + + if (pollCount == 0) + return 0; + + if (pollSocket.revents & POLLOUT) + * condition |= ENET_SOCKET_WAIT_SEND; + + if (pollSocket.revents & POLLIN) + * condition |= ENET_SOCKET_WAIT_RECEIVE; + + return 0; +#else + fd_set readSet, writeSet; + struct timeval timeVal; + int selectCount; + + timeVal.tv_sec = timeout / 1000; + timeVal.tv_usec = (timeout % 1000) * 1000; + + FD_ZERO (& readSet); + FD_ZERO (& writeSet); + + if (* condition & ENET_SOCKET_WAIT_SEND) + FD_SET (socket, & writeSet); + + if (* condition & ENET_SOCKET_WAIT_RECEIVE) + FD_SET (socket, & readSet); + + selectCount = select (socket + 1, & readSet, & writeSet, NULL, & timeVal); + + if (selectCount < 0) + { + if (errno == EINTR && * condition & ENET_SOCKET_WAIT_INTERRUPT) + { + * condition = ENET_SOCKET_WAIT_INTERRUPT; + + return 0; + } + + return -1; + } + + * condition = ENET_SOCKET_WAIT_NONE; + + if (selectCount == 0) + return 0; + + if (FD_ISSET (socket, & writeSet)) + * condition |= ENET_SOCKET_WAIT_SEND; + + if (FD_ISSET (socket, & readSet)) + * condition |= ENET_SOCKET_WAIT_RECEIVE; + + return 0; +#endif +} + +#endif + diff --git a/thirdparty/enet/win32.c b/thirdparty/enet/win32.c new file mode 100644 index 0000000..f395c09 --- /dev/null +++ b/thirdparty/enet/win32.c @@ -0,0 +1,454 @@ +/** + @file win32.c + @brief ENet Win32 system specific functions +*/ +#ifdef _WIN32 + +#define ENET_BUILDING_LIB 1 +#include "enet/enet.h" +#include +#include +#include + +static enet_uint32 timeBase = 0; + +int +enet_initialize (void) +{ + WORD versionRequested = MAKEWORD (1, 1); + WSADATA wsaData; + + if (WSAStartup (versionRequested, & wsaData)) + return -1; + + if (LOBYTE (wsaData.wVersion) != 1|| + HIBYTE (wsaData.wVersion) != 1) + { + WSACleanup (); + + return -1; + } + + timeBeginPeriod (1); + + return 0; +} + +void +enet_deinitialize (void) +{ + timeEndPeriod (1); + + WSACleanup (); +} + +enet_uint32 +enet_host_random_seed (void) +{ + return (enet_uint32) timeGetTime (); +} + +enet_uint32 +enet_time_get (void) +{ + return (enet_uint32) timeGetTime () - timeBase; +} + +void +enet_time_set (enet_uint32 newTimeBase) +{ + timeBase = (enet_uint32) timeGetTime () - newTimeBase; +} + +int +enet_address_set_host_ip (ENetAddress * address, const char * name) +{ + enet_uint8 vals [4] = { 0, 0, 0, 0 }; + int i; + + for (i = 0; i < 4; ++ i) + { + const char * next = name + 1; + if (* name != '0') + { + long val = strtol (name, (char **) & next, 10); + if (val < 0 || val > 255 || next == name || next - name > 3) + return -1; + vals [i] = (enet_uint8) val; + } + + if (* next != (i < 3 ? '.' : '\0')) + return -1; + name = next + 1; + } + + memcpy (& address -> host, vals, sizeof (enet_uint32)); + return 0; +} + +int +enet_address_set_host (ENetAddress * address, const char * name) +{ + struct hostent * hostEntry; + + hostEntry = gethostbyname (name); + if (hostEntry == NULL || + hostEntry -> h_addrtype != AF_INET) + return enet_address_set_host_ip (address, name); + + address -> host = * (enet_uint32 *) hostEntry -> h_addr_list [0]; + + return 0; +} + +int +enet_address_get_host_ip (const ENetAddress * address, char * name, size_t nameLength) +{ + char * addr = inet_ntoa (* (struct in_addr *) & address -> host); + if (addr == NULL) + return -1; + else + { + size_t addrLen = strlen(addr); + if (addrLen >= nameLength) + return -1; + memcpy (name, addr, addrLen + 1); + } + return 0; +} + +int +enet_address_get_host (const ENetAddress * address, char * name, size_t nameLength) +{ + struct in_addr in; + struct hostent * hostEntry; + + in.s_addr = address -> host; + + hostEntry = gethostbyaddr ((char *) & in, sizeof (struct in_addr), AF_INET); + if (hostEntry == NULL) + return enet_address_get_host_ip (address, name, nameLength); + else + { + size_t hostLen = strlen (hostEntry -> h_name); + if (hostLen >= nameLength) + return -1; + memcpy (name, hostEntry -> h_name, hostLen + 1); + } + + return 0; +} + +int +enet_socket_bind (ENetSocket socket, const ENetAddress * address) +{ + struct sockaddr_in sin; + + memset (& sin, 0, sizeof (struct sockaddr_in)); + + sin.sin_family = AF_INET; + + if (address != NULL) + { + sin.sin_port = ENET_HOST_TO_NET_16 (address -> port); + sin.sin_addr.s_addr = address -> host; + } + else + { + sin.sin_port = 0; + sin.sin_addr.s_addr = INADDR_ANY; + } + + return bind (socket, + (struct sockaddr *) & sin, + sizeof (struct sockaddr_in)) == SOCKET_ERROR ? -1 : 0; +} + +int +enet_socket_get_address (ENetSocket socket, ENetAddress * address) +{ + struct sockaddr_in sin; + int sinLength = sizeof (struct sockaddr_in); + + if (getsockname (socket, (struct sockaddr *) & sin, & sinLength) == -1) + return -1; + + address -> host = (enet_uint32) sin.sin_addr.s_addr; + address -> port = ENET_NET_TO_HOST_16 (sin.sin_port); + + return 0; +} + +int +enet_socket_listen (ENetSocket socket, int backlog) +{ + return listen (socket, backlog < 0 ? SOMAXCONN : backlog) == SOCKET_ERROR ? -1 : 0; +} + +ENetSocket +enet_socket_create (ENetSocketType type) +{ + return socket (PF_INET, type == ENET_SOCKET_TYPE_DATAGRAM ? SOCK_DGRAM : SOCK_STREAM, 0); +} + +int +enet_socket_set_option (ENetSocket socket, ENetSocketOption option, int value) +{ + int result = SOCKET_ERROR; + switch (option) + { + case ENET_SOCKOPT_NONBLOCK: + { + u_long nonBlocking = (u_long) value; + result = ioctlsocket (socket, FIONBIO, & nonBlocking); + break; + } + + case ENET_SOCKOPT_BROADCAST: + result = setsockopt (socket, SOL_SOCKET, SO_BROADCAST, (char *) & value, sizeof (int)); + break; + + case ENET_SOCKOPT_REUSEADDR: + result = setsockopt (socket, SOL_SOCKET, SO_REUSEADDR, (char *) & value, sizeof (int)); + break; + + case ENET_SOCKOPT_RCVBUF: + result = setsockopt (socket, SOL_SOCKET, SO_RCVBUF, (char *) & value, sizeof (int)); + break; + + case ENET_SOCKOPT_SNDBUF: + result = setsockopt (socket, SOL_SOCKET, SO_SNDBUF, (char *) & value, sizeof (int)); + break; + + case ENET_SOCKOPT_RCVTIMEO: + result = setsockopt (socket, SOL_SOCKET, SO_RCVTIMEO, (char *) & value, sizeof (int)); + break; + + case ENET_SOCKOPT_SNDTIMEO: + result = setsockopt (socket, SOL_SOCKET, SO_SNDTIMEO, (char *) & value, sizeof (int)); + break; + + case ENET_SOCKOPT_NODELAY: + result = setsockopt (socket, IPPROTO_TCP, TCP_NODELAY, (char *) & value, sizeof (int)); + break; + + case ENET_SOCKOPT_TTL: + result = setsockopt (socket, IPPROTO_IP, IP_TTL, (char *) & value, sizeof (int)); + break; + + default: + break; + } + return result == SOCKET_ERROR ? -1 : 0; +} + +int +enet_socket_get_option (ENetSocket socket, ENetSocketOption option, int * value) +{ + int result = SOCKET_ERROR, len; + switch (option) + { + case ENET_SOCKOPT_ERROR: + len = sizeof(int); + result = getsockopt (socket, SOL_SOCKET, SO_ERROR, (char *) value, & len); + break; + + case ENET_SOCKOPT_TTL: + len = sizeof(int); + result = getsockopt (socket, IPPROTO_IP, IP_TTL, (char *) value, & len); + break; + + default: + break; + } + return result == SOCKET_ERROR ? -1 : 0; +} + +int +enet_socket_connect (ENetSocket socket, const ENetAddress * address) +{ + struct sockaddr_in sin; + int result; + + memset (& sin, 0, sizeof (struct sockaddr_in)); + + sin.sin_family = AF_INET; + sin.sin_port = ENET_HOST_TO_NET_16 (address -> port); + sin.sin_addr.s_addr = address -> host; + + result = connect (socket, (struct sockaddr *) & sin, sizeof (struct sockaddr_in)); + if (result == SOCKET_ERROR && WSAGetLastError () != WSAEWOULDBLOCK) + return -1; + + return 0; +} + +ENetSocket +enet_socket_accept (ENetSocket socket, ENetAddress * address) +{ + SOCKET result; + struct sockaddr_in sin; + int sinLength = sizeof (struct sockaddr_in); + + result = accept (socket, + address != NULL ? (struct sockaddr *) & sin : NULL, + address != NULL ? & sinLength : NULL); + + if (result == INVALID_SOCKET) + return ENET_SOCKET_NULL; + + if (address != NULL) + { + address -> host = (enet_uint32) sin.sin_addr.s_addr; + address -> port = ENET_NET_TO_HOST_16 (sin.sin_port); + } + + return result; +} + +int +enet_socket_shutdown (ENetSocket socket, ENetSocketShutdown how) +{ + return shutdown (socket, (int) how) == SOCKET_ERROR ? -1 : 0; +} + +void +enet_socket_destroy (ENetSocket socket) +{ + if (socket != INVALID_SOCKET) + closesocket (socket); +} + +int +enet_socket_send (ENetSocket socket, + const ENetAddress * address, + const ENetBuffer * buffers, + size_t bufferCount) +{ + struct sockaddr_in sin; + DWORD sentLength = 0; + + if (address != NULL) + { + memset (& sin, 0, sizeof (struct sockaddr_in)); + + sin.sin_family = AF_INET; + sin.sin_port = ENET_HOST_TO_NET_16 (address -> port); + sin.sin_addr.s_addr = address -> host; + } + + if (WSASendTo (socket, + (LPWSABUF) buffers, + (DWORD) bufferCount, + & sentLength, + 0, + address != NULL ? (struct sockaddr *) & sin : NULL, + address != NULL ? sizeof (struct sockaddr_in) : 0, + NULL, + NULL) == SOCKET_ERROR) + { + if (WSAGetLastError () == WSAEWOULDBLOCK) + return 0; + + return -1; + } + + return (int) sentLength; +} + +int +enet_socket_receive (ENetSocket socket, + ENetAddress * address, + ENetBuffer * buffers, + size_t bufferCount) +{ + INT sinLength = sizeof (struct sockaddr_in); + DWORD flags = 0, + recvLength = 0; + struct sockaddr_in sin; + + if (WSARecvFrom (socket, + (LPWSABUF) buffers, + (DWORD) bufferCount, + & recvLength, + & flags, + address != NULL ? (struct sockaddr *) & sin : NULL, + address != NULL ? & sinLength : NULL, + NULL, + NULL) == SOCKET_ERROR) + { + switch (WSAGetLastError ()) + { + case WSAEWOULDBLOCK: + case WSAECONNRESET: + return 0; + case WSAEMSGSIZE: + return -2; + } + + return -1; + } + + if (flags & MSG_PARTIAL) + return -2; + + if (address != NULL) + { + address -> host = (enet_uint32) sin.sin_addr.s_addr; + address -> port = ENET_NET_TO_HOST_16 (sin.sin_port); + } + + return (int) recvLength; +} + +int +enet_socketset_select (ENetSocket maxSocket, ENetSocketSet * readSet, ENetSocketSet * writeSet, enet_uint32 timeout) +{ + struct timeval timeVal; + + timeVal.tv_sec = timeout / 1000; + timeVal.tv_usec = (timeout % 1000) * 1000; + + return select (maxSocket + 1, readSet, writeSet, NULL, & timeVal); +} + +int +enet_socket_wait (ENetSocket socket, enet_uint32 * condition, enet_uint32 timeout) +{ + fd_set readSet, writeSet; + struct timeval timeVal; + int selectCount; + + timeVal.tv_sec = timeout / 1000; + timeVal.tv_usec = (timeout % 1000) * 1000; + + FD_ZERO (& readSet); + FD_ZERO (& writeSet); + + if (* condition & ENET_SOCKET_WAIT_SEND) + FD_SET (socket, & writeSet); + + if (* condition & ENET_SOCKET_WAIT_RECEIVE) + FD_SET (socket, & readSet); + + selectCount = select (socket + 1, & readSet, & writeSet, NULL, & timeVal); + + if (selectCount < 0) + return -1; + + * condition = ENET_SOCKET_WAIT_NONE; + + if (selectCount == 0) + return 0; + + if (FD_ISSET (socket, & writeSet)) + * condition |= ENET_SOCKET_WAIT_SEND; + + if (FD_ISSET (socket, & readSet)) + * condition |= ENET_SOCKET_WAIT_RECEIVE; + + return 0; +} + +#endif + diff --git a/vcpkg-configuration.json b/vcpkg-configuration.json new file mode 100644 index 0000000..abf55f7 --- /dev/null +++ b/vcpkg-configuration.json @@ -0,0 +1,7 @@ +{ + "default-registry": { + "kind": "git", + "baseline": "9e593bb18ea69cc5095e012465dcd675a822ed0d", + "repository": "https://github.com/microsoft/vcpkg" + } +} \ No newline at end of file diff --git a/vcpkg.json b/vcpkg.json new file mode 100644 index 0000000..340ae53 --- /dev/null +++ b/vcpkg.json @@ -0,0 +1,7 @@ +{ + "name": "disasterserver", + "version": "0.0.1", + "dependencies": [ + "boost-bind" + ] +} \ No newline at end of file From 84b0adf86921c5f6d712d98cece0a8715ca3f09c Mon Sep 17 00:00:00 2001 From: MilesGlitch Date: Tue, 8 Sep 2026 15:31:36 +0300 Subject: [PATCH 23/61] Update --- disasterserver/CMakeLists.txt | 15 +- disasterserver/Client.hpp | 5 +- disasterserver/Core/Packet.hpp | 2 +- disasterserver/Core/Types.hpp | 9 + disasterserver/GameStateController.cpp | 93 +++++++- disasterserver/GameStateController.hpp | 33 +-- disasterserver/Server.cpp | 12 +- disasterserver/Server.hpp | 3 +- disasterserver/States/CharSelect.cpp | 140 ++++++------ disasterserver/States/CharSelect.hpp | 10 +- disasterserver/States/LobbyState.cpp | 300 ++++++++++++------------- disasterserver/States/LobbyState.hpp | 17 +- disasterserver/States/MapVoteState.cpp | 21 ++ disasterserver/States/MapVoteState.hpp | 29 +++ 14 files changed, 412 insertions(+), 277 deletions(-) create mode 100644 disasterserver/Core/Types.hpp create mode 100644 disasterserver/States/MapVoteState.cpp create mode 100644 disasterserver/States/MapVoteState.hpp diff --git a/disasterserver/CMakeLists.txt b/disasterserver/CMakeLists.txt index 70ecefe..228af93 100644 --- a/disasterserver/CMakeLists.txt +++ b/disasterserver/CMakeLists.txt @@ -27,9 +27,11 @@ set(COMPILER_OPTIONS > ) -file(GLOB_RECURSE SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/*.cpp) -# file(GLOB_RECURSE SOURCES CONFIGURE_DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/*.cpp) +set(DEFINES + $<$:SERVER_DEBUG> +) +file(GLOB_RECURSE SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/*.cpp) if(ANDROID) add_library(DisasterServerCXX SHARED "Android.cpp" ${SOURCES}) @@ -37,7 +39,8 @@ if(ANDROID) set(THREADS_PREFER_PTHREAD_FLAG ON) find_package(Threads REQUIRED) target_include_directories(DisasterServerCXX PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}) - target_compile_options(DisasterServer PRIVATE ${COMPILER_OPTIONS}) + target_compile_options(DisasterServerCXX PRIVATE ${COMPILER_OPTIONS}) + target_compile_definitions(DisasterServerCXX PRIVATE ${DEFINES}) target_link_libraries(DisasterServerCXX PRIVATE cJSON log enet m Threads::Threads) else() if(DYLIB) # Build .dll or .so @@ -51,7 +54,8 @@ else() target_link_libraries(DisasterServerCXX PRIVATE cJSON enet m Threads::Threads) endif() - target_compile_options(DisasterServer PRIVATE ${COMPILER_OPTIONS}) + target_compile_options(DisasterServerCXX PRIVATE ${COMPILER_OPTIONS}) + target_compile_definitions(DisasterServerCXX PRIVATE ${DEFINES}) target_include_directories(DisasterServerCXX PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}) else() # Build executable @@ -119,7 +123,8 @@ else() target_link_libraries(DisasterServerCXX PRIVATE cJSON enet m Threads::Threads) endif() - target_compile_options(DisasterServer PRIVATE ${COMPILER_OPTIONS}) + target_compile_options(DisasterServerCXX PRIVATE ${COMPILER_OPTIONS}) + target_compile_definitions(DisasterServerCXX PRIVATE ${DEFINES}) target_include_directories(DisasterServerCXX PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}) endif() diff --git a/disasterserver/Client.hpp b/disasterserver/Client.hpp index 12576eb..e1d43fb 100644 --- a/disasterserver/Client.hpp +++ b/disasterserver/Client.hpp @@ -2,6 +2,7 @@ #define DISASTERSERVER_PEER_HPP #include "Core/Packet.hpp" +#include "Core/Types.hpp" namespace DisasterServer { @@ -84,7 +85,6 @@ namespace DisasterServer } } - using clientId = uint16_t; class Client { clientId id; @@ -156,9 +156,10 @@ namespace DisasterServer bool isInGame() { return in_game; } void setCanVote(bool flag) { can_vote = flag; } bool isCanVote() { return can_vote; } + void setOperator(bool flag) { op = flag; } + bool isOpped() { return op; } bool isVerified() { return verified; } - bool isOpped() { return op; } bool isModified() { return mod_tool; } void setReady(bool flag) { ready = flag; } bool isReady() { return ready; } diff --git a/disasterserver/Core/Packet.hpp b/disasterserver/Core/Packet.hpp index 71dd8b5..67eec88 100644 --- a/disasterserver/Core/Packet.hpp +++ b/disasterserver/Core/Packet.hpp @@ -376,7 +376,7 @@ namespace DisasterServer { std::string readString(); void writeString(const std::string &value); - bool send(Client &client, bool reliable); + bool send(Client &client, bool reliable = true); void sendBroadcast(Server &server, bool reliable, std::function predicate = [](const Client& _) { return true; }); }; } diff --git a/disasterserver/Core/Types.hpp b/disasterserver/Core/Types.hpp new file mode 100644 index 0000000..668d783 --- /dev/null +++ b/disasterserver/Core/Types.hpp @@ -0,0 +1,9 @@ +#ifndef DISASTERSERVER_TYPES_HPP +#define DISASTERSERVER_TYPES_HPP + +#include + +using clientId = uint16_t; +using commandHash = unsigned long; + +#endif //DISASTERSERVER_TYPES_HPP diff --git a/disasterserver/GameStateController.cpp b/disasterserver/GameStateController.cpp index c63d26d..1c68800 100644 --- a/disasterserver/GameStateController.cpp +++ b/disasterserver/GameStateController.cpp @@ -203,9 +203,98 @@ unsigned long GameStateController::cmd_parse(std::string &string) { return hash; } -bool GameStateController::cmd_handle(const Client &client, commandHash hash, const std::string &string) { +bool GameStateController::cmd_handle(Client &client, commandHash hash, const std::string &message) { switch (hash) { - default: return false; break; + case CMD_BAN: { + if (!client.isOpped()) { + this->server->send_message(client, "{}you aren't an operator.", CLRCODE_RED); + break; + } + + if (this->server->getInGameCount() <= 1) { + this->server->send_message(client, "{}dude are you gonna ban yourself?", CLRCODE_RED); + break; + } + + Packet pack(PacketType::CLIENT_LOBBY_CHOOSEBAN); + RAssert(pack.send(client)); + break; + } + + case CMD_KICK: { + if (!client.isOpped()) { + this->server->send_message(client, "{}you aren't an operator.", CLRCODE_RED); + break; + } + + if (this->server->getInGameCount() <= 1) { + this->server->send_message(client, "{}dude are you gonna kick yourself?", CLRCODE_RED); + break; + } + + Packet pack(PacketType::SERVER_LOBBY_CHOOSEKICK); + RAssert(pack.send(client)); + break; + } + + case CMD_OP: { + if (!client.isOpped()) { + this->server->send_message(client, "{}you aren't an operator.", CLRCODE_RED); + break; + } + + if (this->server->getInGameCount() <= 1) { + this->server->send_message(client, "{}you're already an operator tho??", CLRCODE_RED); + break; + } + + Packet pack(PacketType::SERVER_LOBBY_CHOOSEOP); + RAssert(pack.send(client)); + break; + } + + case CMD_LOBBY: { + int ind; + if (sscanf(message.c_str(), ".lobby %d", &ind) <= 0) + { + this->server->send_message(client, "{}example:~ .lobby 1"); + break; + } + break; + } + + case CMD_HELP: { + this->server->send_message(client, "~-----~ {}command list:{} ~-----~", CLRCODE_GRN, CLRCODE_RST); + this->server->send_message(client, "|- .vk~ - vote kick "); + this->server->send_message(client, "|- .info~ - information about server"); + this->server->send_message(client, "|- .vp~ - vote practice mode (wip)"); + break; + } + + case CMD_INFO: { + this->server->send_message(client, "|build from &{} @{}~", __DATE__, __TIME__); + this->server->send_message(client, "{}hander{} - original binary", CLRCODE_YLW, CLRCODE_RST); + this->server->send_message(client, "{}miles{}glitch{} - rewritten server to c++", CLRCODE_BLU, CLRCODE_PUR, CLRCODE_RST); + this->server->send_message(client, "{}faker{}null{}0{} - help with code", CLRCODE_GRA, CLRCODE_RED, CLRCODE_GRN, CLRCODE_RST); + break; + } + +#if defined(SERVER_DEBUG) + case CMD_SELFOP: { + client.setOperator(true); + this->server->send_message(client, "{}you aren't an operator.", CLRCODE_GRN); + break; + } + case CMD_DEBUG: { + if (!client.isOpped()) { + this->server->send_message(client, "{}иди нахуй :3", CLRCODE_PUR); + break; + } + break; + } +#endif + + default: return false; } return true; diff --git a/disasterserver/GameStateController.hpp b/disasterserver/GameStateController.hpp index e3b26ab..295b103 100644 --- a/disasterserver/GameStateController.hpp +++ b/disasterserver/GameStateController.hpp @@ -17,22 +17,23 @@ namespace DisasterServer RESULTS }; -#define CMD_HELP 45680751 -#define CMD_MAP 1478254 -#define CMD_STINK 1426706039 -#define CMD_VK 47971 -#define CMD_VP 47976 -#define CMD_BAN 1467681 -#define CMD_KICK 45773684 -#define CMD_OP 47759 -#define CMD_YES 1489913 -#define CMD_Y 1547 -#define CMD_NO 47727 -#define CMD_N 1536 -#define CMD_INFO 45719004 -#define CMD_LOBBY 1420085352 + constexpr commandHash CMD_HELP = 45680751; + constexpr commandHash CMD_MAP = 1478254; + constexpr commandHash CMD_STINK = 1426706039; + constexpr commandHash CMD_VK = 47971; + constexpr commandHash CMD_VP = 47976; + constexpr commandHash CMD_BAN = 1467681; + constexpr commandHash CMD_KICK = 45773684; + constexpr commandHash CMD_OP = 47759; + constexpr commandHash CMD_YES = 1489913; + constexpr commandHash CMD_Y = 1547; + constexpr commandHash CMD_NO = 47727; + constexpr commandHash CMD_N = 1536; + constexpr commandHash CMD_INFO = 45719004; + constexpr commandHash CMD_LOBBY = 1420085352; - using commandHash = unsigned long; + constexpr commandHash CMD_SELFOP = 1264443355; //Only debugging + constexpr commandHash CMD_DEBUG = 1412399845; //Only debugging class GameStateController { Server *server = nullptr; @@ -50,7 +51,7 @@ namespace DisasterServer bool handle(Client& peer, Packet& packet); commandHash cmd_parse(std::string& string); - bool cmd_handle(const Client& client, commandHash hash, const std::string& string); + bool cmd_handle(Client& client, commandHash hash, const std::string& message); States getCurrentState() const { return state; } void setState(States state) { this->state = state; } diff --git a/disasterserver/Server.cpp b/disasterserver/Server.cpp index f0df033..63dc413 100644 --- a/disasterserver/Server.cpp +++ b/disasterserver/Server.cpp @@ -204,12 +204,12 @@ void Server::broadcast_ex(Packet &packet, bool reliable, clientId ignore) { packet.sendBroadcast(*this, reliable, [ignore](const Client& v) { return v.getId() != ignore; }); } -size_t Server::getClientsInGameCount() { - return std::ranges::count_if(peers, - [](const auto& cl) { - return cl->isInGame(); - } - ); +int Server::getClientCount() { + return std::ranges::count_if(peers, [](const auto& _) { return true; }); +} + +int Server::getInGameCount() { + return std::ranges::count_if(peers, [](const auto& cl) { return cl->isInGame(); }); } void Server::send_message(Client &client, std::string message) { diff --git a/disasterserver/Server.hpp b/disasterserver/Server.hpp index 998ff38..0076c18 100644 --- a/disasterserver/Server.hpp +++ b/disasterserver/Server.hpp @@ -48,8 +48,9 @@ namespace DisasterServer void broadcast_ex(Packet &packet, bool reliable, clientId ignore); + int getClientCount(); + int getInGameCount(); - size_t getClientsInGameCount(); std::vector> &getClients() { return peers; } GameStateController &getGameStateController(); diff --git a/disasterserver/States/CharSelect.cpp b/disasterserver/States/CharSelect.cpp index 64c8ee0..919ee51 100644 --- a/disasterserver/States/CharSelect.cpp +++ b/disasterserver/States/CharSelect.cpp @@ -12,69 +12,23 @@ using namespace DisasterServer; CharSelectState::CharSelectState(Server* server, GameStateController* controller) : server(server), controller(controller) { } -bool CharSelectState::chooseExe() { - uint32_t weight = 0; - - for (auto& peer : server->getClients()) { - if (!peer || !peer->isInGame()) - continue; - - peer->setExeCharacter(ExesCharacters::NONE); - peer->setSurvCharacter(SurvCharacters::NONE); - - weight += peer->getExeChance(); - } - - if (weight == 0) - weight++; - - uint32_t rnd = static_cast(std::rand()) % weight; - - for (auto& peer : server->getClients()) { - if (!peer || !peer->isInGame()) - continue; - - if (peer->getExeChance() >= 100) { - exe = peer->getId(); - return true; - } - - if (rnd < peer->getExeChance() && !peer->isModified()) { - Info("{} (id {}, c {}) is exe!", peer->getNickname(), peer->getId(), peer->getExeChance()); - - peer->setExeChance(1 + std::rand() % 1); - - exe = peer->getId(); - return true; - } - rnd -= peer->getExeChance(); - } - exe = static_cast(-1); - return false; +bool CharSelectState::joined(Client& client) { + return true; } -bool CharSelectState::checkState() { - bool shouldStart = true; - - for (auto& peer : server->getClients()) { - if (!peer->isInGame()) - continue; - - if (peer->getExeCharacter() == ExesCharacters::NONE && - peer->getSurvCharacter() == SurvCharacters::NONE) { - shouldStart = false; - break; - } +bool CharSelectState::leaved(Client& client) { + if (client.getSurvCharacter() != SurvCharacters::NONE) { + const auto character = client.getSurvCharacter(); + avail[character] = false; } - if (shouldStart) { - controller->setState(States::GAME); //Game start - return true; + if (this->server->getInGameCount() <= 1 || client.getId() == exe) { + return controller->getLobbyState().init(); } - return true; + return checkState(); } bool CharSelectState::init(int8_t selectedMap) { @@ -93,8 +47,6 @@ bool CharSelectState::init(int8_t selectedMap) { countdownSec = 30; countdown = TICKSPERSEC; - avail.fill(true); - Packet pack(PacketType::SERVER_LOBBY_EXE); pack.write(exe); pack.write(map); @@ -165,10 +117,12 @@ bool CharSelectState::handle(Client& client, Packet& packet) { return false; } - const bool available = avail[id]; + SurvCharacters character = static_cast(id); + + const bool available = !avail[character]; if (available) { - avail[id] = false; + avail[character] = true; } Packet response(PacketType::SERVER_LOBBY_CHARACTER_RESPONSE); @@ -237,23 +191,67 @@ void CharSelectState::tick() { countdown -= server->getDelta(); } -bool CharSelectState::joined(Client& client) { - return true; -} +bool CharSelectState::chooseExe() { + uint32_t weight = 0; -bool CharSelectState::leaved(Client& client) { - if (client.getSurvCharacter() != SurvCharacters::NONE) { - const auto character = client.getSurvCharacter(); - const size_t index = static_cast(character); + for (auto& peer : server->getClients()) { + if (!peer || !peer->isInGame()) + continue; + + peer->setExeCharacter(ExesCharacters::NONE); + peer->setSurvCharacter(SurvCharacters::NONE); + + weight += peer->getExeChance(); + } + + if (weight == 0) + weight++; + + uint32_t rnd = static_cast(std::rand()) % weight; + + for (auto& peer : server->getClients()) { + if (!peer || !peer->isInGame()) + continue; + + if (peer->getExeChance() >= 100) { + exe = peer->getId(); + return true; + } + + if (rnd < peer->getExeChance() && !peer->isModified()) { + Info("{} (id {}, c {}) is exe!", peer->getNickname(), peer->getId(), peer->getExeChance()); + + peer->setExeChance(1 + std::rand() % 1); - if (index < avail.size()) { - avail[index] = true; + exe = peer->getId(); + return true; } + + rnd -= peer->getExeChance(); } - if (this->server->getClientsInGameCount() <= 1 || client.getId() == exe) { - return controller->getLobbyState().init(); + exe = static_cast(-1); + return false; +} + +bool CharSelectState::checkState() { + bool shouldStart = true; + + for (auto& peer : server->getClients()) { + if (!peer->isInGame()) + continue; + + if (peer->getExeCharacter() == ExesCharacters::NONE && + peer->getSurvCharacter() == SurvCharacters::NONE) { + shouldStart = false; + break; + } } - return checkState(); + if (shouldStart) { + controller->setState(States::GAME); //Game start + return true; + } + + return true; } \ No newline at end of file diff --git a/disasterserver/States/CharSelect.hpp b/disasterserver/States/CharSelect.hpp index ad7416a..ff757e2 100644 --- a/disasterserver/States/CharSelect.hpp +++ b/disasterserver/States/CharSelect.hpp @@ -6,6 +6,7 @@ #include "Client.hpp" #include "Core/Packet.hpp" +#include "Core/Types.hpp" namespace DisasterServer { @@ -20,11 +21,7 @@ class CharSelectState { int8_t map = 0; clientId exe = 0; - - std::array avail{}; - - bool checkState(); - bool chooseExe(); + std::unordered_map avail; public: CharSelectState(Server* server, GameStateController* controller); @@ -39,6 +36,9 @@ class CharSelectState { clientId getExe() const { return exe; } int8_t getMap() const { return map; } +private: + bool checkState(); + bool chooseExe(); }; } diff --git a/disasterserver/States/LobbyState.cpp b/disasterserver/States/LobbyState.cpp index 4b9dc53..60a67a5 100644 --- a/disasterserver/States/LobbyState.cpp +++ b/disasterserver/States/LobbyState.cpp @@ -11,8 +11,6 @@ using namespace DisasterServer; LobbyState::LobbyState(Server *server, GameStateController *controller) : server(server), controller(controller), vote(server) { } -LobbyState::~LobbyState() = default; - bool LobbyState::init() { for (auto &peer : server->getClients()) { peer->setReady(false); @@ -188,7 +186,7 @@ bool LobbyState::tick() { countdown += TICKSPERSEC; if (--countdown_sec == 0) { - return controller->getCharSelect().init(map) || init(); + return controller->getCharSelect().init(0) || init(); } RAssert(sendCountdown()); @@ -235,184 +233,173 @@ bool LobbyState::handle(Client &client, Packet &packet) { clientId pid = packet.read(); std::string message = packet.readString(); - bool ignore = true; commandHash hash = controller->cmd_parse(message); + bool isCommand = cmdHandle(client, pid, hash, message); - switch (hash) { - default: { - if (!controller->cmd_handle(client, hash, message)) { - ignore = false; - } - break; - } - - case CMD_MAP: { - /*if (!client.isOpped()) { - this->server->send_message(client, "{}you aren't an operator", CLRCODE_RED); - break; - }*/ + Info("{} (id {}): {}", client.getNickname(), client.getId(), message); + if (!isCommand) { + server->send_broadcast_message(client.getId(), message); + } - int ind; - if (sscanf(message.c_str(), ".map %d", &ind) <= 0) { - this->server->send_message(client, "{}example:~ .map 1", CLRCODE_RED); - break; - } + break; + } + case PacketType::CLIENT_LOBBY_READY_STATE: { + uint8_t state = packet.read(); + client.setReady(state); - ind--; - if (ind < 0 || ind >= MAP_COUNT+1) { - this->server->send_message(client, "{}map should be between 1 and {}", CLRCODE_RED, MAP_COUNT+1); - break; - } + Packet pack(PacketType::SERVER_LOBBY_READY_STATE); + pack.write(client.getId()); + pack.write(state); + pack.sendBroadcast(*this->server, true); - controller->getCharSelect().init(ind); - break; - } + break; + } - case CMD_HELP: { - this->server->send_message(client, "~-----~ {}command list:{} ~-----~", CLRCODE_GRN, CLRCODE_RST); - this->server->send_message(client, "|- .vk~ - vote kick "); - this->server->send_message(client, "|- .info~ - information about server"); - this->server->send_message(client, "|- .vp~ - vote practice mode (wip)"); - break; - } + case PacketType::CLIENT_LOBBY_CHOOSEVOTEKICK: { + clientId pid = packet.read(); - case CMD_INFO: { - this->server->send_message(client, "|build from &{} @{}~", __DATE__, __TIME__); - this->server->send_message(client, "{}hander{} - original binary", CLRCODE_YLW, CLRCODE_RST); - this->server->send_message(client, "{}miles{}glitch{} - rewritten server to c++", CLRCODE_BLU, CLRCODE_PUR, CLRCODE_RST); - this->server->send_message(client, "{}faker{}null{}0{} - help with code", CLRCODE_GRA, CLRCODE_RED, CLRCODE_GRN, CLRCODE_RST); + if (vote.isOnGoing()) { + if (!client.isCanVote()) { + this->server->send_message(client, "{}you can't participate in this vote.", CLRCODE_RED); break; } - case CMD_Y: - case CMD_YES: { - if (!vote.isOnGoing()) { - break; - } - - if (!client.isCanVote()) { - this->server->send_message(client, "{}you can't participate in this vote.", CLRCODE_RED); - break; - } - - if (vote.getCurrentVoteType() == VoteType::KICK && kick_target == client.getId()) { - this->server->send_message(client, "{}why are you kicking yourself ???", CLRCODE_RED); - break; - } - + if (pid == kick_target) { switch (vote.add(client)) { - case VoteState::SUCCESS: { this->server->send_broadcast_message(0, "{}~ {}voted~.", client.getNickname(), CLRCODE_GRN); break; } - case VoteState::ALREADY_VOTED: { this->server->send_message(client, "{}you have already voted.", CLRCODE_RED); break; } - - case VoteState::FULL: { - checkVote(); - break; - } - + case VoteState::FULL: { checkVote(); break; } default: break; } - - break; + } else { + this->server->send_message(client, "{}another vote is already in progress.", CLRCODE_RED); } - - case CMD_VP: { - if (vote.isOnGoing()) { - if (!client.isCanVote()) { - this->server->send_message(client, "{}you can't participate in this vote.", CLRCODE_RED); - break; + break; + } else { + bool found = false; + for (auto &c : this->server->getClients()) { + if (c->getId() == pid) { + if (c->isOpped()) { + this->server->send_message(client, "you're permissionless"); + return true; } - if (pid == kick_target) { - switch (vote.add(client)) { - case VoteState::SUCCESS: { - this->server->send_broadcast_message(0, "{}~ {}voted~.", client.getNickname(), CLRCODE_GRN); - break; - } - case VoteState::ALREADY_VOTED: { - this->server->send_message(client, "{}you have already voted.", CLRCODE_RED); - break; - } - case VoteState::FULL: { checkVote(); break; } - default: break; - } - } else { - this->server->send_message(client, "{}another vote is already in progress.", CLRCODE_RED); - } + kick_target = c->getId(); + found = true; break; } + } + if (found) { if (client.getVoteCooldown() > 0) { this->server->send_message(client, "you cannot start another vote for {}", static_cast(client.getVoteCooldown() / TICKSPERSEC)); break; } - if (!vote.init(VoteType::PRACTICE, 0)) { + if (!vote.init(VoteType::KICK, kick_target)) { this->server->send_message(client, "{}not enough participants.", CLRCODE_RED); break; } - this->server->send_broadcast_message(0, "{}~ `started practice vote.~", client.getNickname()); + this->server->send_broadcast_message(0, "{}~ `started kick vote.~", client.getNickname()); this->server->send_broadcast_message(0, "type @.yes~ or ignore"); this->server->send_broadcast_message(0, "results will be summarized in @20~ sec"); vote.add(client); client.setVoteCooldown(30 * TICKSPERSEC); - break; + } else { + this->server->send_broadcast_message(0, "{}specified player not found.", CLRCODE_RED); } + } - case CMD_VK: { - if (vote.isOnGoing()) { - this->server->send_message(client, "{}another vote is already in progress.", CLRCODE_RED); - break; - } + break; + } - if (client.getVoteCooldown() > 0) { - this->server->send_message(client, "you cannot start another vote for {}", static_cast(client.getVoteCooldown() / TICKSPERSEC)); - break; - } + default: break; + } - if (this->server->getClients().size() > 2) { - Packet pack(PacketType::SERVER_LOBBY_CHOOSEVOTEKICK); - pack.send(client, true); - } else { - this->server->send_message(client, "{}not enough participants.", CLRCODE_RED); - } + return result; +} - break; - } +bool LobbyState::cmdHandle(Client &client, clientId pid, commandHash hash, std::string &message) { + switch (hash) { + default: { + if (!controller->cmd_handle(client, hash, message)) { + return false; } + break; + } - Info("{} (id {}): {}", client.getNickname(), client.getId(), message); - if (!ignore) { - server->send_broadcast_message(client.getId(), message); + case CMD_MAP: { + /*if (!client.isOpped()) { + this->server->send_message(client, "{}you aren't an operator", CLRCODE_RED); + break; + }*/ + + int ind; + if (sscanf(message.c_str(), ".map %d", &ind) <= 0) { + this->server->send_message(client, "{}example:~ .map 1", CLRCODE_RED); + break; + } + + ind--; + if (ind < 0 || ind >= MAP_COUNT+1) { + this->server->send_message(client, "{}map should be between 1 and {}", CLRCODE_RED, MAP_COUNT+1); + break; } + controller->getCharSelect().init(ind); break; } - case PacketType::CLIENT_LOBBY_READY_STATE: { - uint8_t state = packet.read(); - client.setReady(state); - Packet pack(PacketType::SERVER_LOBBY_READY_STATE); - pack.write(client.getId()); - pack.write(state); - pack.sendBroadcast(*this->server, true); + case CMD_Y: + case CMD_YES: { + if (!vote.isOnGoing()) { + break; + } + + if (!client.isCanVote()) { + this->server->send_message(client, "{}you can't participate in this vote.", CLRCODE_RED); + break; + } + + if (vote.getCurrentVoteType() == VoteType::KICK && kick_target == client.getId()) { + this->server->send_message(client, "{}why are you kicking yourself ???", CLRCODE_RED); + break; + } + + switch (vote.add(client)) { + + case VoteState::SUCCESS: { + this->server->send_broadcast_message(0, "{}~ {}voted~.", client.getNickname(), CLRCODE_GRN); + break; + } + + case VoteState::ALREADY_VOTED: { + this->server->send_message(client, "{}you have already voted.", CLRCODE_RED); + break; + } + + case VoteState::FULL: { + checkVote(); + break; + } + + default: break; + } break; } - case PacketType::CLIENT_LOBBY_CHOOSEVOTEKICK: { - clientId pid = packet.read(); + case CMD_VP: { if (vote.isOnGoing()) { if (!client.isCanVote()) { this->server->send_message(client, "{}you can't participate in this vote.", CLRCODE_RED); @@ -435,51 +422,50 @@ bool LobbyState::handle(Client &client, Packet &packet) { } else { this->server->send_message(client, "{}another vote is already in progress.", CLRCODE_RED); } + break; + } + if (client.getVoteCooldown() > 0) { + this->server->send_message(client, "you cannot start another vote for {}", static_cast(client.getVoteCooldown() / TICKSPERSEC)); break; - } else { - bool found = false; - for (auto &c : this->server->getClients()) { - if (c->getId() == pid) { + } - if (c->isOpped()) { - this->server->send_message(client, "you're permissionless"); - return true; - } + if (!vote.init(VoteType::PRACTICE, 0)) { + this->server->send_message(client, "{}not enough participants.", CLRCODE_RED); + break; + } - kick_target = c->getId(); - found = true; - break; - } - } + this->server->send_broadcast_message(0, "{}~ `started practice vote.~", client.getNickname()); + this->server->send_broadcast_message(0, "type @.yes~ or ignore"); + this->server->send_broadcast_message(0, "results will be summarized in @20~ sec"); - if (found) { - if (client.getVoteCooldown() > 0) { - this->server->send_message(client, "you cannot start another vote for {}", static_cast(client.getVoteCooldown() / TICKSPERSEC)); - break; - } + vote.add(client); + client.setVoteCooldown(30 * TICKSPERSEC); + break; + } - if (!vote.init(VoteType::KICK, kick_target)) { - this->server->send_message(client, "{}not enough participants.", CLRCODE_RED); - break; - } + case CMD_VK: { + if (vote.isOnGoing()) { + this->server->send_message(client, "{}another vote is already in progress.", CLRCODE_RED); + break; + } - this->server->send_broadcast_message(0, "{}~ `started kick vote.~", client.getNickname()); - this->server->send_broadcast_message(0, "type @.yes~ or ignore"); - this->server->send_broadcast_message(0, "results will be summarized in @20~ sec"); + if (client.getVoteCooldown() > 0) { + this->server->send_message(client, "you cannot start another vote for {}", static_cast(client.getVoteCooldown() / TICKSPERSEC)); + break; + } - vote.add(client); - client.setVoteCooldown(30 * TICKSPERSEC); - } else { - this->server->send_broadcast_message(0, "{}specified player not found.", CLRCODE_RED); - } + int ingame = this->server->getInGameCount(); + + if (ingame > 2) { + Packet pack(PacketType::SERVER_LOBBY_CHOOSEVOTEKICK); + pack.send(client, true); + } else { + this->server->send_message(client, "{}not enough participants.", CLRCODE_RED); } break; } - - default: break; } - - return result; -} \ No newline at end of file + return true; +} diff --git a/disasterserver/States/LobbyState.hpp b/disasterserver/States/LobbyState.hpp index ba9b88c..b97b14b 100644 --- a/disasterserver/States/LobbyState.hpp +++ b/disasterserver/States/LobbyState.hpp @@ -2,7 +2,9 @@ #define DISASTERSERVER_LOBBY_HPP #include + #include "Vote.hpp" +#include "Core/Types.hpp" constexpr int COUNTDOWN = 5; constexpr int NO_COUNTDOWN = 5 + 1; @@ -20,18 +22,9 @@ namespace DisasterServer uint8_t countdown_sec = 0; Vote vote; clientId kick_target = 0; - - /* Map Vote */ - uint8_t maps[3] = {}; - uint8_t votes[3] = {}; - - /* Character Select */ - int8_t map = 0; - clientId exe = 0; - std::unordered_map avail; public: - explicit LobbyState(Server *server, GameStateController *controller); - ~LobbyState(); + LobbyState(Server *server, GameStateController *controller); + ~LobbyState() = default; bool init(); @@ -43,6 +36,8 @@ namespace DisasterServer bool leaved(Client &peer); bool tick(); bool handle(Client &client, Packet &packet); + + bool cmdHandle(Client &client, clientId pid, commandHash hash, std::string &message); }; diff --git a/disasterserver/States/MapVoteState.cpp b/disasterserver/States/MapVoteState.cpp new file mode 100644 index 0000000..6825415 --- /dev/null +++ b/disasterserver/States/MapVoteState.cpp @@ -0,0 +1,21 @@ +#include "MapVoteState.hpp" + +using namespace DisasterServer; + +MapVoteState::MapVoteState(Server *server, GameStateController *controller) : server(server), controller(controller) { +} + +bool MapVoteState::joined(Client &client) { + return true; +} + +bool MapVoteState::leaved(Client &client) { + return true; +} + +void MapVoteState::tick() { +} + +bool MapVoteState::handle(Client &client, Packet &packet) { + return true; +} diff --git a/disasterserver/States/MapVoteState.hpp b/disasterserver/States/MapVoteState.hpp new file mode 100644 index 0000000..c65a811 --- /dev/null +++ b/disasterserver/States/MapVoteState.hpp @@ -0,0 +1,29 @@ +#ifndef DISASTERSERVER_MAPVOTESTATE_HPP +#define DISASTERSERVER_MAPVOTESTATE_HPP + +#include "Client.hpp" +#include "Core/Types.hpp" + +namespace DisasterServer +{ + class Server; + class GameStateController; + + class MapVoteState { + Server *server; + GameStateController *controller; + + uint8_t maps[3] = {}; + uint8_t votes[3] = {}; + public: + MapVoteState(Server *server, GameStateController *controller); + ~MapVoteState() = default; + + bool joined(Client& client); + bool leaved(Client& client); + void tick(); + bool handle(Client& client, Packet& packet); + }; +} + +#endif //DISASTERSERVER_MAPVOTESTATE_HPP From 1caf0658c55cf4f2ec25044b4c74e79519c3f7b0 Mon Sep 17 00:00:00 2001 From: MilesGlitch Date: Tue, 8 Sep 2026 17:22:25 +0300 Subject: [PATCH 24/61] Update --- CMakePresets.json | 3 +- disasterserver/Client.hpp | 5 +++ disasterserver/Core/Map.hpp | 32 ++++++++++++++++++ disasterserver/Core/Packet.hpp | 2 +- disasterserver/GameStateController.cpp | 2 +- disasterserver/GameStateController.hpp | 11 +++++-- disasterserver/Maps/HideAndSeekAct2.cpp | 22 +++++++++++++ disasterserver/Maps/HideAndSeekAct2.hpp | 22 +++++++++++++ disasterserver/Server.cpp | 12 +++---- disasterserver/Server.hpp | 6 ++-- disasterserver/States/CharSelect.cpp | 20 +++++++----- disasterserver/States/CharSelect.hpp | 21 ++++++------ disasterserver/States/LobbyState.cpp | 18 +++++++---- disasterserver/States/LobbyState.hpp | 19 ++++++----- disasterserver/States/MapVoteState.cpp | 36 +++++++++++++++++++-- disasterserver/States/MapVoteState.hpp | 23 +++++++------ disasterserver/States/State.hpp | 41 ++++++++++++++++++++++++ disasterserver_c/Packet.c | 4 +-- resources/icon.ico | Bin 204862 -> 180542 bytes 19 files changed, 232 insertions(+), 67 deletions(-) create mode 100644 disasterserver/Core/Map.hpp create mode 100644 disasterserver/Maps/HideAndSeekAct2.cpp create mode 100644 disasterserver/Maps/HideAndSeekAct2.hpp create mode 100644 disasterserver/States/State.hpp diff --git a/CMakePresets.json b/CMakePresets.json index 26872e5..fb4654a 100644 --- a/CMakePresets.json +++ b/CMakePresets.json @@ -57,7 +57,8 @@ "CMAKE_BUILD_TYPE": "Debug", "CMAKE_C_COMPILER": "cl.exe", "CMAKE_CXX_COMPILER": "cl.exe", - "CMAKE_MSVC_RUNTIME_LIBRARY": "MultiThreaded$<$:Debug>DLL" + "CMAKE_MSVC_RUNTIME_LIBRARY": "MultiThreaded$<$:Debug>DLL", + "BUILD_UI": true }, "vendor": { "microsoft.com/VisualStudioSettings/CMake/1.0": { diff --git a/disasterserver/Client.hpp b/disasterserver/Client.hpp index e1d43fb..0152231 100644 --- a/disasterserver/Client.hpp +++ b/disasterserver/Client.hpp @@ -170,6 +170,11 @@ namespace DisasterServer bool identity_process(const std::string & addr, bool is_banned, uint64_t timeout, bool do_timeout); bool message_received(Packet &packet); void disconnect(DisconnectReason reason, const std::string& message = ""); + + template + void disconnect(DisconnectReason reason, std::format_string fmt, Args&&... args) { + disconnect(reason, std::format(fmt, std::forward(args)...)); + } }; } diff --git a/disasterserver/Core/Map.hpp b/disasterserver/Core/Map.hpp new file mode 100644 index 0000000..a787ad5 --- /dev/null +++ b/disasterserver/Core/Map.hpp @@ -0,0 +1,32 @@ +#ifndef DISASTERSERVER_MAP_HPP +#define DISASTERSERVER_MAP_HPP + +#include +#include "Client.hpp" + +namespace DisasterServer +{ + class Server; + + class Map { + Server *server = nullptr; + std::string name; + + uint8_t spawn_red_rings; + uint8_t ring_count; + public: + Map(Server *server, const std::string &name, uint8_t spawn_red_rings, uint8_t ring_count) : + server(server), + name(name), + spawn_red_rings(spawn_red_rings), + ring_count(ring_count) {} + virtual ~Map(){} + + virtual void init() = 0; + virtual void tick() = 0; + virtual void handle(Client &client, Packet& packet) = 0; + virtual void left(Client &client) = 0; + }; +} + +#endif //DISASTERSERVER_MAP_HPP diff --git a/disasterserver/Core/Packet.hpp b/disasterserver/Core/Packet.hpp index 67eec88..bdb52d7 100644 --- a/disasterserver/Core/Packet.hpp +++ b/disasterserver/Core/Packet.hpp @@ -377,7 +377,7 @@ namespace DisasterServer { void writeString(const std::string &value); bool send(Client &client, bool reliable = true); - void sendBroadcast(Server &server, bool reliable, std::function predicate = [](const Client& _) { return true; }); + void sendBroadcast(Server &server, bool reliable = true, std::function predicate = [](const Client& _) { return true; }); }; } diff --git a/disasterserver/GameStateController.cpp b/disasterserver/GameStateController.cpp index 1c68800..90309de 100644 --- a/disasterserver/GameStateController.cpp +++ b/disasterserver/GameStateController.cpp @@ -164,7 +164,7 @@ bool GameStateController::handle(Client &peer, Packet &packet) { return true; } -unsigned long GameStateController::cmd_parse(std::string &string) { +commandHash GameStateController::cmd_parse(std::string string) { static std::array clr_list = CLRLIST; std::string current; diff --git a/disasterserver/GameStateController.hpp b/disasterserver/GameStateController.hpp index 295b103..080aea2 100644 --- a/disasterserver/GameStateController.hpp +++ b/disasterserver/GameStateController.hpp @@ -50,16 +50,21 @@ namespace DisasterServer void tick(); bool handle(Client& peer, Packet& packet); - commandHash cmd_parse(std::string& string); + static commandHash cmd_parse(std::string string); bool cmd_handle(Client& client, commandHash hash, const std::string& message); States getCurrentState() const { return state; } void setState(States state) { this->state = state; } - LobbyState& getLobbyState() { return lobby; } - CharSelectState& getCharSelect() { return charSelect; } + LobbyState& getLobbyState() { return lobby.get(); } + CharSelectState& getCharSelect() { return charSelect.get(); } }; } +#define AssertOrDisconnect(client, x) \ +if(!(x)) { \ + client.disconnect(DisconnectReason::OTHER, "AssertOrDisconnect({}) failed!", #x); return false; \ +} + #endif //DISASTERSERVER_STATEMACHINE_HPP diff --git a/disasterserver/Maps/HideAndSeekAct2.cpp b/disasterserver/Maps/HideAndSeekAct2.cpp new file mode 100644 index 0000000..59fc60e --- /dev/null +++ b/disasterserver/Maps/HideAndSeekAct2.cpp @@ -0,0 +1,22 @@ +#include "HideAndSeekAct2.hpp" + +using namespace DisasterServer::Maps; + +HideAndSeekAct2::HideAndSeekAct2(Server *server) : + Map(server, "Hide And Seek Act2", 1, 30) {} + +void HideAndSeekAct2::init() { + +} + +void HideAndSeekAct2::tick() { + +} + +void HideAndSeekAct2::handle(Client &client, Packet &packet) { + +} + +void HideAndSeekAct2::left(Client &client) { + +} diff --git a/disasterserver/Maps/HideAndSeekAct2.hpp b/disasterserver/Maps/HideAndSeekAct2.hpp new file mode 100644 index 0000000..6da9e15 --- /dev/null +++ b/disasterserver/Maps/HideAndSeekAct2.hpp @@ -0,0 +1,22 @@ +#ifndef DISASTERSERVER_HIDEANDSEEKACT2_HPP +#define DISASTERSERVER_HIDEANDSEEKACT2_HPP + +#include "Core/Map.hpp" + +namespace DisasterServer::Maps +{ + class HideAndSeekAct2 : public Map { + public: + explicit HideAndSeekAct2(Server *server); + + void init() override; + + void tick() override; + + void handle(Client &client, Packet &packet) override; + + void left(Client &client) override; + }; +} + +#endif //DISASTERSERVER_HIDEANDSEEKACT2_HPP diff --git a/disasterserver/Server.cpp b/disasterserver/Server.cpp index 63dc413..432dd3e 100644 --- a/disasterserver/Server.cpp +++ b/disasterserver/Server.cpp @@ -12,7 +12,7 @@ using namespace DisasterServer; -Server::Server(const uint16_t n) : id(n), stateManager(this) { +Server::Server(const uint16_t n) : id(n), stateController(this) { ENetAddress addr; addr.host = ENET_HOST_ANY; addr.port = BASE_SERVER_PORT + n; @@ -121,7 +121,7 @@ void Server::initialize() { } if (client->isVerified()) { - stateManager.playerLeft(*client); + stateController.playerLeft(*client); } ev.peer->data = nullptr; @@ -172,7 +172,7 @@ void Server::initialize() { while (next_tick < now) { next_tick += TARGET_FPS; - stateManager.tick(); + stateController.tick(); // Heartbeat if (peers.size() > 0) { @@ -204,11 +204,11 @@ void Server::broadcast_ex(Packet &packet, bool reliable, clientId ignore) { packet.sendBroadcast(*this, reliable, [ignore](const Client& v) { return v.getId() != ignore; }); } -int Server::getClientCount() { +size_t Server::getClientCount() { return std::ranges::count_if(peers, [](const auto& _) { return true; }); } -int Server::getInGameCount() { +size_t Server::getInGameCount() { return std::ranges::count_if(peers, [](const auto& cl) { return cl->isInGame(); }); } @@ -228,5 +228,5 @@ void Server::send_broadcast_message(clientId sender, std::string message) { } GameStateController &Server::getGameStateController() { - return stateManager; + return stateController; } \ No newline at end of file diff --git a/disasterserver/Server.hpp b/disasterserver/Server.hpp index 0076c18..9195262 100644 --- a/disasterserver/Server.hpp +++ b/disasterserver/Server.hpp @@ -24,7 +24,7 @@ namespace DisasterServer ENetHost *host = nullptr; std::vector> peers; - GameStateController stateManager; + GameStateController stateController; double delta = 0; public: Server(uint16_t n = 0); @@ -48,8 +48,8 @@ namespace DisasterServer void broadcast_ex(Packet &packet, bool reliable, clientId ignore); - int getClientCount(); - int getInGameCount(); + size_t getClientCount(); + size_t getInGameCount(); std::vector> &getClients() { return peers; } GameStateController &getGameStateController(); diff --git a/disasterserver/States/CharSelect.cpp b/disasterserver/States/CharSelect.cpp index 919ee51..e7facc0 100644 --- a/disasterserver/States/CharSelect.cpp +++ b/disasterserver/States/CharSelect.cpp @@ -9,11 +9,9 @@ using namespace DisasterServer; -CharSelectState::CharSelectState(Server* server, GameStateController* controller) : server(server), controller(controller) { +CharSelectState::CharSelectState(Server* server, GameStateController* controller) : State(server, controller) { } - - bool CharSelectState::joined(Client& client) { return true; } @@ -91,7 +89,7 @@ bool CharSelectState::handle(Client& client, Packet& packet) { change.write(id); change.sendBroadcast(*server, true); - Info("{}{}{} (id {}) choses [{}{}{}]!", client.getNickname(), CLRCODE_RST, "", client.getId(), CLRCODE_RED, EXE_NAMES[id], CLRCODE_RST); + Info("{} {} (id {}) choses [{}{}{}]!", client.getNickname(), CLRCODE_RST, client.getId(), CLRCODE_RED, EXE_NAMES[id], CLRCODE_RST); return checkState(); } @@ -141,7 +139,7 @@ bool CharSelectState::handle(Client& client, Packet& packet) { change.sendBroadcast(*server, true); } - Info("{}{}{} (id {}) choses [{}{}{}]!", client.getNickname(), CLRCODE_RST, "", client.getId(), CLRCODE_GRN, SURV_NAMES[id], CLRCODE_RST); + Info("{} {} (id {}) choses [{}{}{}]!", client.getNickname(), CLRCODE_RST, client.getId(), CLRCODE_GRN, SURV_NAMES[id], CLRCODE_RST); return checkState(); } @@ -156,7 +154,10 @@ bool CharSelectState::handle(Client& client, Packet& packet) { client.setTimeout(0); - Info("{}{}{} (id {}): {}", client.getNickname(), CLRCODE_RST, "", client.getId(), message); + Info("{} {} (id {}): {}", client.getNickname(), CLRCODE_RST, client.getId(), message); + + controller->cmd_handle(client, this->controller->cmd_parse(message), message); + break; } @@ -166,7 +167,7 @@ bool CharSelectState::handle(Client& client, Packet& packet) { return true; } -void CharSelectState::tick() { +bool CharSelectState::tick() { if (countdown <= 0) { countdown += TICKSPERSEC; @@ -189,6 +190,8 @@ void CharSelectState::tick() { } countdown -= server->getDelta(); + + return true; } bool CharSelectState::chooseExe() { @@ -243,9 +246,10 @@ bool CharSelectState::checkState() { if (peer->getExeCharacter() == ExesCharacters::NONE && peer->getSurvCharacter() == SurvCharacters::NONE) { + shouldStart = false; break; - } + } } if (shouldStart) { diff --git a/disasterserver/States/CharSelect.hpp b/disasterserver/States/CharSelect.hpp index ff757e2..6944899 100644 --- a/disasterserver/States/CharSelect.hpp +++ b/disasterserver/States/CharSelect.hpp @@ -1,20 +1,17 @@ #ifndef DISASTERSERVER_CHARSELECTSTATE_HPP #define DISASTERSERVER_CHARSELECTSTATE_HPP -#include -#include - #include "Client.hpp" +#include "State.hpp" #include "Core/Packet.hpp" #include "Core/Types.hpp" -namespace DisasterServer { +namespace DisasterServer +{ class GameStateController; -class CharSelectState { - Server *server = nullptr; - GameStateController* controller = nullptr; +class CharSelectState : public State { double countdown = 0; uint8_t countdownSec = 30; @@ -29,13 +26,15 @@ class CharSelectState { bool init(int8_t map); - bool joined(Client& client); - bool leaved(Client& client); - void tick(); - bool handle(Client& client, Packet& packet); + bool joined(Client& client) override; + bool leaved(Client& client) override; + bool tick() override; + bool handle(Client& client, Packet& packet) override; clientId getExe() const { return exe; } int8_t getMap() const { return map; } + + CharSelectState &get() override { return *this; } private: bool checkState(); bool chooseExe(); diff --git a/disasterserver/States/LobbyState.cpp b/disasterserver/States/LobbyState.cpp index 60a67a5..a8b911b 100644 --- a/disasterserver/States/LobbyState.cpp +++ b/disasterserver/States/LobbyState.cpp @@ -8,7 +8,7 @@ using namespace DisasterServer; -LobbyState::LobbyState(Server *server, GameStateController *controller) : server(server), controller(controller), vote(server) { +LobbyState::LobbyState(Server *server, GameStateController *controller) : State(server, controller), vote(server) { } bool LobbyState::init() { @@ -167,20 +167,23 @@ bool LobbyState::tick() { } break; } + case States::CHARSELECT: { + return controller->getCharSelect().tick(); + } default: break; } - if (vote.isOnGoing() && !vote.tick()) { - checkVote(); - } - if (prac_countdown > 0) { prac_countdown -= server->getDelta(); if (prac_countdown <= 0) { - return init(); + return controller->getCharSelect().init(20) || init(); } } + if (vote.isOnGoing() && !vote.tick()) { + checkVote(); + } + if (countdown_sec <= COUNTDOWN) { if (countdown <= 0) { countdown += TICKSPERSEC; @@ -252,6 +255,7 @@ bool LobbyState::handle(Client &client, Packet &packet) { pack.write(state); pack.sendBroadcast(*this->server, true); + checkCountdown(); break; } @@ -286,7 +290,7 @@ bool LobbyState::handle(Client &client, Packet &packet) { bool found = false; for (auto &c : this->server->getClients()) { if (c->getId() == pid) { - if (c->isOpped()) { + if (!c->isOpped()) { this->server->send_message(client, "you're permissionless"); return true; } diff --git a/disasterserver/States/LobbyState.hpp b/disasterserver/States/LobbyState.hpp index b97b14b..2b70af5 100644 --- a/disasterserver/States/LobbyState.hpp +++ b/disasterserver/States/LobbyState.hpp @@ -3,8 +3,8 @@ #include +#include "State.hpp" #include "Vote.hpp" -#include "Core/Types.hpp" constexpr int COUNTDOWN = 5; constexpr int NO_COUNTDOWN = 5 + 1; @@ -13,10 +13,7 @@ namespace DisasterServer { class GameStateController; - class LobbyState { - Server *server = nullptr; - GameStateController *controller = nullptr; - + class LobbyState : public State { double countdown = 0; double prac_countdown = 0; uint8_t countdown_sec = 0; @@ -24,7 +21,7 @@ namespace DisasterServer clientId kick_target = 0; public: LobbyState(Server *server, GameStateController *controller); - ~LobbyState() = default; + ~LobbyState() override = default; bool init(); @@ -32,12 +29,14 @@ namespace DisasterServer bool checkCountdown(); void checkVote(); - bool joined(Client &peer); - bool leaved(Client &peer); - bool tick(); - bool handle(Client &client, Packet &packet); + bool joined(Client &peer) override; + bool leaved(Client &peer) override; + bool tick() override; + bool handle(Client &client, Packet &packet) override; bool cmdHandle(Client &client, clientId pid, commandHash hash, std::string &message); + + LobbyState &get() override { return *this; } }; diff --git a/disasterserver/States/MapVoteState.cpp b/disasterserver/States/MapVoteState.cpp index 6825415..ed75c16 100644 --- a/disasterserver/States/MapVoteState.cpp +++ b/disasterserver/States/MapVoteState.cpp @@ -1,8 +1,11 @@ #include "MapVoteState.hpp" +#include "GameStateController.hpp" +#include "Server.hpp" + using namespace DisasterServer; -MapVoteState::MapVoteState(Server *server, GameStateController *controller) : server(server), controller(controller) { +MapVoteState::MapVoteState(Server *server, GameStateController *controller) : State(server, controller) { } bool MapVoteState::joined(Client &client) { @@ -13,9 +16,38 @@ bool MapVoteState::leaved(Client &client) { return true; } -void MapVoteState::tick() { +bool MapVoteState::tick() { + return true; } bool MapVoteState::handle(Client &client, Packet &packet) { + switch (packet.getPacketType()) { + case PacketType::CLIENT_VOTE_REQUEST: { + if (client.isInGame()) { + break; + } + + uint8_t map = packet.read(); + + AssertOrDisconnect(client, !client.isVoted()); + AssertOrDisconnect(client, map >= 0); + AssertOrDisconnect(client, map < 3); + + votes[map]++; + client.setVoted(true); + + Packet pack(PacketType::SERVER_VOTE_SET); + for (int i = 0; i < 3; i++) { + pack.write(votes[i]); + } + + pack.sendBroadcast(*server); + //mapvote_check_state(v->server); + break; + } + + default: break; + } + return true; } diff --git a/disasterserver/States/MapVoteState.hpp b/disasterserver/States/MapVoteState.hpp index c65a811..1a5ffd5 100644 --- a/disasterserver/States/MapVoteState.hpp +++ b/disasterserver/States/MapVoteState.hpp @@ -2,27 +2,26 @@ #define DISASTERSERVER_MAPVOTESTATE_HPP #include "Client.hpp" -#include "Core/Types.hpp" +#include "State.hpp" namespace DisasterServer { class Server; class GameStateController; - class MapVoteState { - Server *server; - GameStateController *controller; - - uint8_t maps[3] = {}; - uint8_t votes[3] = {}; + class MapVoteState : public State { + std::array maps; + std::array votes; public: MapVoteState(Server *server, GameStateController *controller); - ~MapVoteState() = default; + ~MapVoteState() override = default; + + bool joined(Client& client) override; + bool leaved(Client& client) override; + bool tick() override; + bool handle(Client& client, Packet& packet) override; - bool joined(Client& client); - bool leaved(Client& client); - void tick(); - bool handle(Client& client, Packet& packet); + MapVoteState &get() override { return *this; } }; } diff --git a/disasterserver/States/State.hpp b/disasterserver/States/State.hpp new file mode 100644 index 0000000..3471150 --- /dev/null +++ b/disasterserver/States/State.hpp @@ -0,0 +1,41 @@ +#ifndef DISASTERSERVER_STATE_HPP +#define DISASTERSERVER_STATE_HPP + +#include "Client.hpp" +#include "Core/Types.hpp" + +namespace DisasterServer +{ + class GameStateController; + class Server; + + template + class State { + protected: + Server *server; + GameStateController *controller; + public: + State(Server *server, GameStateController *controller) : server(server), controller(controller) {} + virtual ~State() = default; + + virtual bool joined(Client& client) { + return true; + } + + virtual bool leaved(Client& client) { + return true; + } + + virtual bool tick() { + return true; + } + + virtual bool handle(Client& client, Packet& packet) { + return true; + } + + virtual T &get() = 0; + }; +} + +#endif //DISASTERSERVER_STATE_HPP diff --git a/disasterserver_c/Packet.c b/disasterserver_c/Packet.c index c5851c0..729209a 100644 --- a/disasterserver_c/Packet.c +++ b/disasterserver_c/Packet.c @@ -201,7 +201,7 @@ bool packet_new(Packet* packet, PacketType type) PacketWrite(packet, packet_write8, 0); PacketWrite(packet, packet_write8, (uint8_t)type); - Debug("Created packet %s", getPacketTypeName(type)); + //Debug("Created packet %s", getPacketTypeName(type)); return true; } @@ -221,7 +221,7 @@ bool packet_send(ENetPeer* peer, Packet* packet, bool reliable) return true; if (packet->buff[1] != SERVER_HEARTBEAT) { - Debug("Sending packet %s", getPacketTypeName(packet->buff[1])); + //Debug("Sending packet %s", getPacketTypeName(packet->buff[1])); } packet->pos = 0; diff --git a/resources/icon.ico b/resources/icon.ico index 199c4323b767596a04f009c5f3985ba2dc9fd634..34fa044a117f173e3aecd9aba12b895864ec99a5 100644 GIT binary patch literal 180542 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 cFX6+V4_Hq)$ literal 204862 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

NbE6?U$SUJ$dAf_T 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

ak6 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 I`X}&z0c#595dZ)H From bceb5490d6d183446da803df30997697be0f5c5c Mon Sep 17 00:00:00 2001 From: MilesGlitch Date: Tue, 8 Sep 2026 20:39:08 +0300 Subject: [PATCH 25/61] Update --- disasterserver/Client.cpp | 12 ++++++------ disasterserver/Server.cpp | 4 ++-- disasterserver/Server.hpp | 8 ++++---- ...StateController.cpp => StateController.cpp} | 18 +++++++++--------- ...StateController.hpp => StateController.hpp} | 8 ++++---- disasterserver/States/CharSelect.cpp | 4 ++-- disasterserver/States/CharSelect.hpp | 4 ++-- disasterserver/States/LobbyState.cpp | 4 ++-- disasterserver/States/LobbyState.hpp | 4 ++-- disasterserver/States/MapVoteState.cpp | 4 ++-- disasterserver/States/MapVoteState.hpp | 4 ++-- disasterserver/States/State.hpp | 6 +++--- 12 files changed, 40 insertions(+), 40 deletions(-) rename disasterserver/{GameStateController.cpp => StateController.cpp} (92%) rename disasterserver/{GameStateController.hpp => StateController.hpp} (91%) diff --git a/disasterserver/Client.cpp b/disasterserver/Client.cpp index ce8fd90..6e80232 100644 --- a/disasterserver/Client.cpp +++ b/disasterserver/Client.cpp @@ -42,7 +42,7 @@ bool Client::identity(Packet &packet) { this->lobby_icon = lobby_icon; this->pet = pet; - this->in_game = (server->getGameStateController().getCurrentState() == States::LOBBY); + this->in_game = (server->getStateController().getCurrentState() == States::LOBBY); this->exe_chance = 1 + rand() % 4; if (this->server->getClients().size() >= MAX_PLAYERS) { @@ -102,14 +102,14 @@ bool Client::identity_process(const std::string &addr, bool is_banned, uint64_t } } - if (!this->server->getGameStateController().playerJoined(*this)) { + if (!this->server->getStateController().playerJoined(*this)) { should_timeout = false; this->disconnect(DisconnectReason::OTHER, "Report this to dev: 415 baza otvette, mi tonem"); return false; } Packet packet(PacketType::SERVER_IDENTITY_RESPONSE); - packet.write(server->getGameStateController().getCurrentState() == States::LOBBY); + packet.write(server->getStateController().getCurrentState() == States::LOBBY); packet.write(id); packet.send(*this, true); @@ -123,11 +123,11 @@ bool Client::identity_process(const std::string &addr, bool is_banned, uint64_t } Packet pack(PacketType::SERVER_WAITING_PLAYER_INFO); - pack.write(server->getGameStateController().getCurrentState() == States::GAME && client->in_game); + pack.write(server->getStateController().getCurrentState() == States::GAME && client->in_game); pack.write(client->getId()); pack.writeString(nickname); - if (server->getGameStateController().getCurrentState() == States::GAME && client->in_game) { + if (server->getStateController().getCurrentState() == States::GAME && client->in_game) { pack.write( 0 /* v->server->game.exe == peer->id */ ); pack.write( 0 /* v->server->game.exe == peer->id ? peer->exe_char : peer->surv_char */); @@ -159,7 +159,7 @@ bool Client::message_received(Packet &packet) { return false; } - return this->server->getGameStateController().handle(*this, packet); + return this->server->getStateController().handle(*this, packet); } void Client::disconnect(DisconnectReason reason, const std::string &message) { diff --git a/disasterserver/Server.cpp b/disasterserver/Server.cpp index 432dd3e..495add1 100644 --- a/disasterserver/Server.cpp +++ b/disasterserver/Server.cpp @@ -6,7 +6,7 @@ #include "Core/Log.hpp" #include "Core/Time.hpp" -#include "GameStateController.hpp" +#include "StateController.hpp" #include "Core/Colors.hpp" using namespace DisasterServer; @@ -227,6 +227,6 @@ void Server::send_broadcast_message(clientId sender, std::string message) { packet.sendBroadcast(*this, true); } -GameStateController &Server::getGameStateController() { +StateController &Server::getStateController() { return stateController; } \ No newline at end of file diff --git a/disasterserver/Server.hpp b/disasterserver/Server.hpp index 9195262..203bdb9 100644 --- a/disasterserver/Server.hpp +++ b/disasterserver/Server.hpp @@ -2,13 +2,13 @@ #define DISASTERSERVER_SERVER_HPP #include "Client.hpp" -#include "GameStateController.hpp" +#include "StateController.hpp" constexpr int TICKSPERSEC = 60; namespace DisasterServer { - class GameStateController; + class StateController; constexpr int MAX_PLAYERS = 7; constexpr int MAP_COUNT = 20; @@ -24,7 +24,7 @@ namespace DisasterServer ENetHost *host = nullptr; std::vector> peers; - GameStateController stateController; + StateController stateController; double delta = 0; public: Server(uint16_t n = 0); @@ -52,7 +52,7 @@ namespace DisasterServer size_t getInGameCount(); std::vector> &getClients() { return peers; } - GameStateController &getGameStateController(); + StateController &getStateController(); double getDelta() { return delta; diff --git a/disasterserver/GameStateController.cpp b/disasterserver/StateController.cpp similarity index 92% rename from disasterserver/GameStateController.cpp rename to disasterserver/StateController.cpp index 90309de..41c45b5 100644 --- a/disasterserver/GameStateController.cpp +++ b/disasterserver/StateController.cpp @@ -1,16 +1,16 @@ -#include "GameStateController.hpp" +#include "StateController.hpp" #include "Server.hpp" #include "Core/Colors.hpp" using namespace DisasterServer; -GameStateController::GameStateController(Server *server): server(server), lobby(server, this), charSelect(server, this) { +StateController::StateController(Server *server): server(server), lobby(server, this), charSelect(server, this) { } -GameStateController::~GameStateController() = default; +StateController::~StateController() = default; -bool GameStateController::playerJoined(Client &peer) { +bool StateController::playerJoined(Client &peer) { Packet packet(PacketType::SERVER_LOBBY_EXE_CHANCE); packet.write(peer.getExeChance()); packet.send(peer, true); @@ -42,7 +42,7 @@ bool GameStateController::playerJoined(Client &peer) { return true; } -void GameStateController::playerLeft(Client &peer) { +void StateController::playerLeft(Client &peer) { Packet packet(PacketType::SERVER_PLAYER_LEFT); packet.write(peer.getId()); packet.sendBroadcast(*server, true); @@ -68,7 +68,7 @@ void GameStateController::playerLeft(Client &peer) { } } -void GameStateController::tick() { +void StateController::tick() { switch (state) { case States::LOBBY: @@ -90,7 +90,7 @@ void GameStateController::tick() { } } -bool GameStateController::handle(Client &peer, Packet &packet) { +bool StateController::handle(Client &peer, Packet &packet) { switch (packet.getPacketType()) { case PacketType::CLIENT_LOBBY_CHOOSEBAN: { if (!peer.isOpped()) { @@ -164,7 +164,7 @@ bool GameStateController::handle(Client &peer, Packet &packet) { return true; } -commandHash GameStateController::cmd_parse(std::string string) { +commandHash StateController::cmd_parse(std::string string) { static std::array clr_list = CLRLIST; std::string current; @@ -203,7 +203,7 @@ commandHash GameStateController::cmd_parse(std::string string) { return hash; } -bool GameStateController::cmd_handle(Client &client, commandHash hash, const std::string &message) { +bool StateController::cmd_handle(Client &client, commandHash hash, const std::string &message) { switch (hash) { case CMD_BAN: { if (!client.isOpped()) { diff --git a/disasterserver/GameStateController.hpp b/disasterserver/StateController.hpp similarity index 91% rename from disasterserver/GameStateController.hpp rename to disasterserver/StateController.hpp index 080aea2..af07113 100644 --- a/disasterserver/GameStateController.hpp +++ b/disasterserver/StateController.hpp @@ -35,22 +35,22 @@ namespace DisasterServer constexpr commandHash CMD_SELFOP = 1264443355; //Only debugging constexpr commandHash CMD_DEBUG = 1412399845; //Only debugging - class GameStateController { + class StateController { Server *server = nullptr; States state = States::LOBBY; LobbyState lobby; CharSelectState charSelect; public: - explicit GameStateController(Server* server); - ~GameStateController(); + explicit StateController(Server* server); + ~StateController(); bool playerJoined(Client& peer); void playerLeft(Client& peer); void tick(); bool handle(Client& peer, Packet& packet); - static commandHash cmd_parse(std::string string); + commandHash cmd_parse(std::string string); bool cmd_handle(Client& client, commandHash hash, const std::string& message); States getCurrentState() const { return state; } diff --git a/disasterserver/States/CharSelect.cpp b/disasterserver/States/CharSelect.cpp index e7facc0..4514dbf 100644 --- a/disasterserver/States/CharSelect.cpp +++ b/disasterserver/States/CharSelect.cpp @@ -4,12 +4,12 @@ #include "Server.hpp" #include "Client.hpp" -#include "GameStateController.hpp" +#include "StateController.hpp" #include "Core/Colors.hpp" using namespace DisasterServer; -CharSelectState::CharSelectState(Server* server, GameStateController* controller) : State(server, controller) { +CharSelectState::CharSelectState(Server* server, StateController* controller) : State(server, controller) { } bool CharSelectState::joined(Client& client) { diff --git a/disasterserver/States/CharSelect.hpp b/disasterserver/States/CharSelect.hpp index 6944899..62372e3 100644 --- a/disasterserver/States/CharSelect.hpp +++ b/disasterserver/States/CharSelect.hpp @@ -9,7 +9,7 @@ namespace DisasterServer { -class GameStateController; +class StateController; class CharSelectState : public State { @@ -21,7 +21,7 @@ class CharSelectState : public State { std::unordered_map avail; public: - CharSelectState(Server* server, GameStateController* controller); + CharSelectState(Server* server, StateController* controller); ~CharSelectState() = default; bool init(int8_t map); diff --git a/disasterserver/States/LobbyState.cpp b/disasterserver/States/LobbyState.cpp index a8b911b..396822c 100644 --- a/disasterserver/States/LobbyState.cpp +++ b/disasterserver/States/LobbyState.cpp @@ -3,12 +3,12 @@ #include #include "Server.hpp" -#include "GameStateController.hpp" +#include "StateController.hpp" #include "Core/Colors.hpp" using namespace DisasterServer; -LobbyState::LobbyState(Server *server, GameStateController *controller) : State(server, controller), vote(server) { +LobbyState::LobbyState(Server *server, StateController *controller) : State(server, controller), vote(server) { } bool LobbyState::init() { diff --git a/disasterserver/States/LobbyState.hpp b/disasterserver/States/LobbyState.hpp index 2b70af5..6298a10 100644 --- a/disasterserver/States/LobbyState.hpp +++ b/disasterserver/States/LobbyState.hpp @@ -11,7 +11,7 @@ constexpr int NO_COUNTDOWN = 5 + 1; namespace DisasterServer { - class GameStateController; + class StateController; class LobbyState : public State { double countdown = 0; @@ -20,7 +20,7 @@ namespace DisasterServer Vote vote; clientId kick_target = 0; public: - LobbyState(Server *server, GameStateController *controller); + LobbyState(Server *server, StateController *controller); ~LobbyState() override = default; bool init(); diff --git a/disasterserver/States/MapVoteState.cpp b/disasterserver/States/MapVoteState.cpp index ed75c16..4c8d01a 100644 --- a/disasterserver/States/MapVoteState.cpp +++ b/disasterserver/States/MapVoteState.cpp @@ -1,11 +1,11 @@ #include "MapVoteState.hpp" -#include "GameStateController.hpp" +#include "StateController.hpp" #include "Server.hpp" using namespace DisasterServer; -MapVoteState::MapVoteState(Server *server, GameStateController *controller) : State(server, controller) { +MapVoteState::MapVoteState(Server *server, StateController *controller) : State(server, controller) { } bool MapVoteState::joined(Client &client) { diff --git a/disasterserver/States/MapVoteState.hpp b/disasterserver/States/MapVoteState.hpp index 1a5ffd5..b207eb8 100644 --- a/disasterserver/States/MapVoteState.hpp +++ b/disasterserver/States/MapVoteState.hpp @@ -7,13 +7,13 @@ namespace DisasterServer { class Server; - class GameStateController; + class StateController; class MapVoteState : public State { std::array maps; std::array votes; public: - MapVoteState(Server *server, GameStateController *controller); + MapVoteState(Server *server, StateController *controller); ~MapVoteState() override = default; bool joined(Client& client) override; diff --git a/disasterserver/States/State.hpp b/disasterserver/States/State.hpp index 3471150..b10679d 100644 --- a/disasterserver/States/State.hpp +++ b/disasterserver/States/State.hpp @@ -6,16 +6,16 @@ namespace DisasterServer { - class GameStateController; + class StateController; class Server; template class State { protected: Server *server; - GameStateController *controller; + StateController *controller; public: - State(Server *server, GameStateController *controller) : server(server), controller(controller) {} + State(Server *server, StateController *controller) : server(server), controller(controller) {} virtual ~State() = default; virtual bool joined(Client& client) { From 7872c8fa39fe5f8480d93ebcfb8a0bdb6f953f3c Mon Sep 17 00:00:00 2001 From: MilesGlitch Date: Wed, 9 Sep 2026 01:23:25 +0300 Subject: [PATCH 26/61] Update --- disasterserver/{States => Core}/State.hpp | 6 +- disasterserver/StateController.cpp | 78 +++-------------------- disasterserver/StateController.hpp | 14 +++- disasterserver/States/CharSelect.cpp | 7 +- disasterserver/States/CharSelect.hpp | 8 +-- disasterserver/States/LobbyState.cpp | 56 +++++++--------- disasterserver/States/LobbyState.hpp | 8 +-- disasterserver/States/MapVoteState.cpp | 3 +- disasterserver/States/MapVoteState.hpp | 8 +-- disasterserver/States/TestState.hpp | 36 +++++++++++ 10 files changed, 97 insertions(+), 127 deletions(-) rename disasterserver/{States => Core}/State.hpp (87%) create mode 100644 disasterserver/States/TestState.hpp diff --git a/disasterserver/States/State.hpp b/disasterserver/Core/State.hpp similarity index 87% rename from disasterserver/States/State.hpp rename to disasterserver/Core/State.hpp index b10679d..1b0644c 100644 --- a/disasterserver/States/State.hpp +++ b/disasterserver/Core/State.hpp @@ -9,7 +9,6 @@ namespace DisasterServer class StateController; class Server; - template class State { protected: Server *server; @@ -26,15 +25,12 @@ namespace DisasterServer return true; } - virtual bool tick() { - return true; + virtual void tick() { } virtual bool handle(Client& client, Packet& packet) { return true; } - - virtual T &get() = 0; }; } diff --git a/disasterserver/StateController.cpp b/disasterserver/StateController.cpp index 41c45b5..8691ff4 100644 --- a/disasterserver/StateController.cpp +++ b/disasterserver/StateController.cpp @@ -1,11 +1,10 @@ #include "StateController.hpp" #include "Server.hpp" - #include "Core/Colors.hpp" using namespace DisasterServer; -StateController::StateController(Server *server): server(server), lobby(server, this), charSelect(server, this) { +StateController::StateController(Server *server): server(server), lobby(server, this), charSelect(server, this), current(std::make_unique(server, this)) { } StateController::~StateController() = default; @@ -22,21 +21,8 @@ bool StateController::playerJoined(Client &peer) { playerJoined.write(peer.getPet()); this->server->broadcast_ex(playerJoined, true, peer.getId()); - switch (state) { - case States::LOBBY: - case States::MAPVOTE: - return lobby.joined(peer); - - case States::CHARSELECT: { - return charSelect.joined(peer); - } - case States::GAME: { - return true; - } - case States::RESULTS: { - break; - } - default: break; + if (current) { + current->joined(peer); } return true; @@ -47,46 +33,14 @@ void StateController::playerLeft(Client &peer) { packet.write(peer.getId()); packet.sendBroadcast(*server, true); - switch (state) - { - case States::LOBBY: - case States::MAPVOTE: - lobby.leaved(peer); - break; - - case States::CHARSELECT: - charSelect.leaved(peer); - break; - - case States::GAME: - //game_state_tick(server); - break; - - case States::RESULTS: - //results_state_tick(server); - break; + if (current) { + current->leaved(peer); } } void StateController::tick() { - switch (state) - { - case States::LOBBY: - case States::MAPVOTE: - lobby.tick(); - break; - - case States::CHARSELECT: - charSelect.tick(); - break; - - case States::GAME: - // game_state_tick(server); - break; - - case States::RESULTS: - // results_state_tick(server); - break; + if (current) { + current->tick(); } } @@ -142,23 +96,9 @@ bool StateController::handle(Client &peer, Packet &packet) { } default: break; } - switch (state) { - case States::LOBBY: - case States::MAPVOTE: - lobby.handle(peer, packet); - break; - - case States::CHARSELECT: - charSelect.handle(peer, packet); - break; - case States::GAME: - // game state handle - break; - - case States::RESULTS: - // results state handle - break; + if (current) { + current->handle(peer, packet); } return true; diff --git a/disasterserver/StateController.hpp b/disasterserver/StateController.hpp index af07113..906d5c4 100644 --- a/disasterserver/StateController.hpp +++ b/disasterserver/StateController.hpp @@ -2,6 +2,7 @@ #define DISASTERSERVER_STATEMACHINE_HPP #include "Core/Packet.hpp" +#include "Core/State.hpp" #include "States/LobbyState.hpp" #include "States/CharSelect.hpp" @@ -41,10 +42,21 @@ namespace DisasterServer LobbyState lobby; CharSelectState charSelect; + std::unique_ptr current; public: explicit StateController(Server* server); ~StateController(); + template T, typename... Args> + requires requires (T& state, Args&&... args) { state.init(std::forward(args)...); } + void changeTo(Args&&... args) { + auto state = std::make_unique(server, this); + + state->init(std::forward(args)...); + + current = std::move(state); + } + bool playerJoined(Client& peer); void playerLeft(Client& peer); void tick(); @@ -64,7 +76,7 @@ namespace DisasterServer #define AssertOrDisconnect(client, x) \ if(!(x)) { \ - client.disconnect(DisconnectReason::OTHER, "AssertOrDisconnect({}) failed!", #x); return false; \ + client.disconnect(DisconnectReason::OTHER, "AssertOrDisconnect({}) failed!", #x); break; \ } #endif //DISASTERSERVER_STATEMACHINE_HPP diff --git a/disasterserver/States/CharSelect.cpp b/disasterserver/States/CharSelect.cpp index 4514dbf..d723a32 100644 --- a/disasterserver/States/CharSelect.cpp +++ b/disasterserver/States/CharSelect.cpp @@ -23,7 +23,8 @@ bool CharSelectState::leaved(Client& client) { } if (this->server->getInGameCount() <= 1 || client.getId() == exe) { - return controller->getLobbyState().init(); + controller->changeTo(); + return true; } return checkState(); @@ -167,7 +168,7 @@ bool CharSelectState::handle(Client& client, Packet& packet) { return true; } -bool CharSelectState::tick() { +void CharSelectState::tick() { if (countdown <= 0) { countdown += TICKSPERSEC; @@ -190,8 +191,6 @@ bool CharSelectState::tick() { } countdown -= server->getDelta(); - - return true; } bool CharSelectState::chooseExe() { diff --git a/disasterserver/States/CharSelect.hpp b/disasterserver/States/CharSelect.hpp index 62372e3..af95c89 100644 --- a/disasterserver/States/CharSelect.hpp +++ b/disasterserver/States/CharSelect.hpp @@ -2,7 +2,7 @@ #define DISASTERSERVER_CHARSELECTSTATE_HPP #include "Client.hpp" -#include "State.hpp" +#include "Core/State.hpp" #include "Core/Packet.hpp" #include "Core/Types.hpp" @@ -11,7 +11,7 @@ namespace DisasterServer class StateController; -class CharSelectState : public State { +class CharSelectState : public State { double countdown = 0; uint8_t countdownSec = 30; @@ -28,13 +28,13 @@ class CharSelectState : public State { bool joined(Client& client) override; bool leaved(Client& client) override; - bool tick() override; + void tick() override; bool handle(Client& client, Packet& packet) override; clientId getExe() const { return exe; } int8_t getMap() const { return map; } - CharSelectState &get() override { return *this; } + CharSelectState &get() { return *this; } private: bool checkState(); bool chooseExe(); diff --git a/disasterserver/States/LobbyState.cpp b/disasterserver/States/LobbyState.cpp index 396822c..fdfdca5 100644 --- a/disasterserver/States/LobbyState.cpp +++ b/disasterserver/States/LobbyState.cpp @@ -140,43 +140,32 @@ bool LobbyState::leaved(Client &peer) { return true; } -bool LobbyState::tick() { - switch (controller->getCurrentState()) { - case States::LOBBY: { - for (auto &peer : server->getClients()) { - if (peer->getVoteCooldown() > 0) { - peer->setVoteCooldown(peer->getVoteCooldown() - server->getDelta()); - } - - if (!peer->isReady()) { - - //Чтобы не мешалось - /* - peer->setTimeout(peer->getTimeout() + server->getDelta()); - if (std::fmod(peer->getTimeout(), 60) == 0) { - Debug("tick for {}: {}", peer->getNickname(), peer->getTimeout() / 60.0f); - } - */ +void LobbyState::tick() { + for (auto &peer : server->getClients()) { + if (peer->getVoteCooldown() > 0) { + peer->setVoteCooldown(peer->getVoteCooldown() - server->getDelta()); + } - if (peer->getTimeout() >= 25 * TICKSPERSEC) { - peer->disconnect(DisconnectReason::AFKTIMEOUT); - } - } else { - peer->setTimeout(0); - } + if (!peer->isReady()) { +#if !defined(SERVER_DEBUG) + peer->setTimeout(peer->getTimeout() + server->getDelta()); + if (std::fmod(peer->getTimeout(), 60) == 0) { + Debug("tick for {}: {}", peer->getNickname(), peer->getTimeout() / 60.0f); } - break; - } - case States::CHARSELECT: { - return controller->getCharSelect().tick(); +#endif + if (peer->getTimeout() >= 25 * TICKSPERSEC) { + peer->disconnect(DisconnectReason::AFKTIMEOUT); + } + } else { + peer->setTimeout(0); } - default: break; } if (prac_countdown > 0) { prac_countdown -= server->getDelta(); if (prac_countdown <= 0) { - return controller->getCharSelect().init(20) || init(); + controller->changeTo(20); + return; } } @@ -189,16 +178,15 @@ bool LobbyState::tick() { countdown += TICKSPERSEC; if (--countdown_sec == 0) { - return controller->getCharSelect().init(0) || init(); + controller->changeTo(0); + return; } - RAssert(sendCountdown()); + sendCountdown(); } countdown -= server->getDelta(); } - - return true; } bool LobbyState::handle(Client &client, Packet &packet) { @@ -359,7 +347,7 @@ bool LobbyState::cmdHandle(Client &client, clientId pid, commandHash hash, std:: break; } - controller->getCharSelect().init(ind); + controller->changeTo(ind); break; } diff --git a/disasterserver/States/LobbyState.hpp b/disasterserver/States/LobbyState.hpp index 6298a10..d5857f2 100644 --- a/disasterserver/States/LobbyState.hpp +++ b/disasterserver/States/LobbyState.hpp @@ -3,7 +3,7 @@ #include -#include "State.hpp" +#include "Core/State.hpp" #include "Vote.hpp" constexpr int COUNTDOWN = 5; @@ -13,7 +13,7 @@ namespace DisasterServer { class StateController; - class LobbyState : public State { + class LobbyState : public State { double countdown = 0; double prac_countdown = 0; uint8_t countdown_sec = 0; @@ -31,12 +31,12 @@ namespace DisasterServer bool joined(Client &peer) override; bool leaved(Client &peer) override; - bool tick() override; + void tick() override; bool handle(Client &client, Packet &packet) override; bool cmdHandle(Client &client, clientId pid, commandHash hash, std::string &message); - LobbyState &get() override { return *this; } + LobbyState &get() { return *this; } }; diff --git a/disasterserver/States/MapVoteState.cpp b/disasterserver/States/MapVoteState.cpp index 4c8d01a..78d9d4b 100644 --- a/disasterserver/States/MapVoteState.cpp +++ b/disasterserver/States/MapVoteState.cpp @@ -16,8 +16,7 @@ bool MapVoteState::leaved(Client &client) { return true; } -bool MapVoteState::tick() { - return true; +void MapVoteState::tick() { } bool MapVoteState::handle(Client &client, Packet &packet) { diff --git a/disasterserver/States/MapVoteState.hpp b/disasterserver/States/MapVoteState.hpp index b207eb8..7aa4c39 100644 --- a/disasterserver/States/MapVoteState.hpp +++ b/disasterserver/States/MapVoteState.hpp @@ -2,14 +2,14 @@ #define DISASTERSERVER_MAPVOTESTATE_HPP #include "Client.hpp" -#include "State.hpp" +#include "Core/State.hpp" namespace DisasterServer { class Server; class StateController; - class MapVoteState : public State { + class MapVoteState : public State { std::array maps; std::array votes; public: @@ -18,10 +18,10 @@ namespace DisasterServer bool joined(Client& client) override; bool leaved(Client& client) override; - bool tick() override; + void tick() override; bool handle(Client& client, Packet& packet) override; - MapVoteState &get() override { return *this; } + MapVoteState &get() { return *this; } }; } diff --git a/disasterserver/States/TestState.hpp b/disasterserver/States/TestState.hpp new file mode 100644 index 0000000..e4be1fb --- /dev/null +++ b/disasterserver/States/TestState.hpp @@ -0,0 +1,36 @@ +#ifndef DISASTERSERVER_TESTSTATE_HPP +#define DISASTERSERVER_TESTSTATE_HPP + +#include "Core/State.hpp" + +namespace DisasterServer +{ + class TestState : public State { + Server *server = nullptr; + StateController *controller = nullptr; + public: + TestState(Server *server, StateController *controller, int test = 0) : State(server, controller) {} + + ~TestState() override { + + } + + bool joined(Client &client) override { + return true; + } + + bool leaved(Client &client) override { + return true; + }; + + void tick() override { + }; + + void handle(Client &client, Packet &packet) override { + }; + }; +} + + + +#endif //DISASTERSERVER_TESTSTATE_HPP From 3bddbf09884f8ca9dceac5e40263610e3e6e575f Mon Sep 17 00:00:00 2001 From: MilesGlitch Date: Wed, 9 Sep 2026 15:41:14 +0300 Subject: [PATCH 27/61] Update --- disasterserver/Client.cpp | 4 +- disasterserver/Core/Packet.cpp | 16 +- disasterserver/Core/Packet.hpp | 311 ++++++++++++---------- disasterserver/Server.cpp | 2 +- disasterserver/StateController.cpp | 29 +- disasterserver/StateController.hpp | 19 +- disasterserver/States/CharSelect.cpp | 68 +++-- disasterserver/States/CharSelect.hpp | 15 +- disasterserver/States/LobbyState.cpp | 57 ++-- disasterserver/States/LobbyState.hpp | 22 +- disasterserver/States/MapVoteState.cpp | 67 ++++- disasterserver/States/MapVoteState.hpp | 13 +- disasterserver/{Core => States}/State.hpp | 0 disasterserver/States/TestState.hpp | 36 --- disasterserver/Util/Countdown.cpp | 30 +++ disasterserver/Util/Countdown.hpp | 32 +++ 16 files changed, 417 insertions(+), 304 deletions(-) rename disasterserver/{Core => States}/State.hpp (100%) delete mode 100644 disasterserver/States/TestState.hpp create mode 100644 disasterserver/Util/Countdown.cpp create mode 100644 disasterserver/Util/Countdown.hpp diff --git a/disasterserver/Client.cpp b/disasterserver/Client.cpp index 6e80232..e750c9d 100644 --- a/disasterserver/Client.cpp +++ b/disasterserver/Client.cpp @@ -42,7 +42,7 @@ bool Client::identity(Packet &packet) { this->lobby_icon = lobby_icon; this->pet = pet; - this->in_game = (server->getStateController().getCurrentState() == States::LOBBY); + this->in_game = server->getStateController().isState(); this->exe_chance = 1 + rand() % 4; if (this->server->getClients().size() >= MAX_PLAYERS) { @@ -109,7 +109,7 @@ bool Client::identity_process(const std::string &addr, bool is_banned, uint64_t } Packet packet(PacketType::SERVER_IDENTITY_RESPONSE); - packet.write(server->getStateController().getCurrentState() == States::LOBBY); + packet.write(server->getStateController().isState()); packet.write(id); packet.send(*this, true); diff --git a/disasterserver/Core/Packet.cpp b/disasterserver/Core/Packet.cpp index c1b2c8e..9a032f0 100644 --- a/disasterserver/Core/Packet.cpp +++ b/disasterserver/Core/Packet.cpp @@ -7,15 +7,7 @@ #include "Server.hpp" #include "Exceptions.hpp" -#ifdef __GNUC__ // GCC, clang... - #define BYTESWAP_16(x) __builtin_bswap16((x)) - #define BYTESWAP_32(x) __builtin_bswap32((x)) - #define BYTESWAP_64(x) __builtin_bswap64((x)) -#else - #define BYTESWAP_16(x) _byteswap_ushort((x)) - #define BYTESWAP_32(x) _byteswap_ulong((x)) - #define BYTESWAP_64(x) _byteswap_uint64((x)) -#endif + using namespace DisasterServer; @@ -41,14 +33,14 @@ Packet::Packet(ENetPacket *packet) : buffer({}) { read(); type = static_cast(read()); - Debug("Packet received PacketType::{}", getPacketTypeName(type)); + Debug("Packet received {}", getPacketTypeName(type)); } Packet::Packet(PacketType type) : buffer({}), type(type) { write(0); write(static_cast(type)); if (type != PacketType::SERVER_HEARTBEAT) { - Debug("Packet created PacketType::{}", getPacketTypeName(type)); + Debug("Packet created {}", getPacketTypeName(type)); } } @@ -85,7 +77,7 @@ bool Packet::send(Client &client, bool reliable) { if(client.isDisconnecting()) return true; - Debug("PacketType::{} sending to {} (id {})", getPacketTypeName(type), client.getNickname(), client.getId()); + Debug("{} sending to {} (id {})", getPacketTypeName(type), client.getNickname(), client.getId()); ENetPacket* pack = enet_packet_create(buffer.data(), len, reliable ? ENET_PACKET_FLAG_RELIABLE : 0); diff --git a/disasterserver/Core/Packet.hpp b/disasterserver/Core/Packet.hpp index bdb52d7..e1b5c6a 100644 --- a/disasterserver/Core/Packet.hpp +++ b/disasterserver/Core/Packet.hpp @@ -175,150 +175,160 @@ enum class PacketType : uint8_t inline std::string getPacketTypeName(PacketType type) { switch (type) { - case PacketType::IDENTITY: return "IDENTITY"; - case PacketType::SERVER_IDENTITY_RESPONSE: return "SERVER_IDENTITY_RESPONSE"; - case PacketType::SERVER_PLAYER_JOINED: return "SERVER_PLAYER_JOINED"; - case PacketType::SERVER_PLAYER_LEFT: return "SERVER_PLAYER_LEFT"; - case PacketType::SERVER_PLAYER_FORCE_DISCONNECT: return "SERVER_PLAYER_FORCE_DISCONNECT"; - case PacketType::SERVER_WAITING_PLAYER_INFO: return "SERVER_WAITING_PLAYER_INFO"; - case PacketType::SERVER_LOBBY_READY_STATE: return "SERVER_LOBBY_READY_STATE"; - case PacketType::SERVER_LOBBY_EXE: return "SERVER_LOBBY_EXE"; - case PacketType::SERVER_LOBBY_COUNTDOWN: return "SERVER_LOBBY_COUNTDOWN"; - case PacketType::SERVER_LOBBY_EXE_CHANGE: return "SERVER_LOBBY_EXE_CHANGE"; - case PacketType::SERVER_LOBBY_CHARACTER_CHANGE: return "SERVER_LOBBY_CHARACTER_CHANGE"; - case PacketType::SERVER_LOBBY_CHARACTER_RESPONSE: return "SERVER_LOBBY_CHARACTER_RESPONSE"; - case PacketType::SERVER_LOBBY_EXECHARACTER_RESPONSE: return "SERVER_LOBBY_EXECHARACTER_RESPONSE"; - case PacketType::SERVER_LOBBY_GAME_START: return "SERVER_LOBBY_GAME_START"; - case PacketType::SERVER_LOBBY_PLAYER: return "SERVER_LOBBY_PLAYER"; - case PacketType::SERVER_LOBBY_EXE_CHANCE: return "SERVER_LOBBY_EXE_CHANCE"; - case PacketType::SERVER_LOBBY_CORRECT: return "SERVER_LOBBY_CORRECT"; - case PacketType::SERVER_LOBBY_CHOOSEVOTEKICK: return "SERVER_LOBBY_CHOOSEVOTEKICK"; - case PacketType::SERVER_LOBBY_CHOOSEBAN: return "SERVER_LOBBY_CHOOSEBAN"; - case PacketType::SERVER_LOBBY_CHOOSEKICK: return "SERVER_LOBBY_CHOOSEKICK"; - case PacketType::SERVER_LOBBY_CHOOSEOP: return "SERVER_LOBBY_CHOOSEOP"; - case PacketType::SERVER_LOBBY_CHANGELOBBY: return "SERVER_LOBBY_CHANGELOBBY"; - case PacketType::SERVER_CHAR_TIME_SYNC: return "SERVER_CHAR_TIME_SYNC"; - case PacketType::SERVER_VOTE_MAPS: return "SERVER_VOTE_MAPS"; - case PacketType::SERVER_VOTE_SET: return "SERVER_VOTE_SET"; - case PacketType::SERVER_VOTE_TIME_SYNC: return "SERVER_VOTE_TIME_SYNC"; - case PacketType::SERVER_GAME_PLAYERS_READY: return "SERVER_GAME_PLAYERS_READY"; - case PacketType::SERVER_GAME_EXE_WINS: return "SERVER_GAME_EXE_WINS"; - case PacketType::SERVER_GAME_SURVIVOR_WIN: return "SERVER_GAME_SURVIVOR_WIN"; - case PacketType::SERVER_GAME_SPAWN_RING: return "SERVER_GAME_SPAWN_RING"; - case PacketType::SERVER_GAME_PLAYER_ESCAPED: return "SERVER_GAME_PLAYER_ESCAPED"; - case PacketType::SERVER_GAME_BACK_TO_LOBBY: return "SERVER_GAME_BACK_TO_LOBBY"; - case PacketType::SERVER_GAME_TIME_SYNC: return "SERVER_GAME_TIME_SYNC"; - case PacketType::SERVER_GAME_TIME_OVER: return "SERVER_GAME_TIME_OVER"; - case PacketType::SERVER_GAME_PING: return "SERVER_GAME_PING"; - case PacketType::SERVER_PLAYER_DEATH_STATE: return "SERVER_PLAYER_DEATH_STATE"; - case PacketType::SERVER_GAME_DEATHTIMER_TICK: return "SERVER_GAME_DEATHTIMER_TICK"; - case PacketType::SERVER_GAME_DEATHTIMER_END: return "SERVER_GAME_DEATHTIMER_END"; - case PacketType::SERVER_REQUEST_INFO: return "SERVER_REQUEST_INFO"; - case PacketType::SERVER_HEARTBEAT: return "SERVER_HEARTBEAT"; - case PacketType::SERVER_PONG: return "SERVER_PONG"; - case PacketType::SERVER_FORCE_DAMAGE: return "SERVER_FORCE_DAMAGE"; - case PacketType::SERVER_GAME_RING_READY: return "SERVER_GAME_RING_READY"; - case PacketType::SERVER_PLAYER_BACKTRACK: return "SERVER_PLAYER_BACKTRACK"; - case PacketType::SERVER_TPROJECTILE_STATE: return "SERVER_TPROJECTILE_STATE"; - case PacketType::SERVER_ETRACKER_STATE: return "SERVER_ETRACKER_STATE"; - case PacketType::SERVER_ERECTOR_BRING_SPAWN: return "SERVER_ERECTOR_BRING_SPAWN"; - case PacketType::SERVER_RMZSLIME_STATE: return "SERVER_RMZSLIME_STATE"; - case PacketType::SERVER_RMZSLIME_RINGBONUS: return "SERVER_RMZSLIME_RINGBONUS"; - case PacketType::SERVER_RMZSHARD_STATE: return "SERVER_RMZSHARD_STATE"; - case PacketType::SERVER_LCEYE_STATE: return "SERVER_LCEYE_STATE"; - case PacketType::SERVER_LCCHAIN_STATE: return "SERVER_LCCHAIN_STATE"; - case PacketType::SERVER_NPCONTROLLER_STATE: return "SERVER_NPCONTROLLER_STATE"; - case PacketType::SERVER_KAFMONITOR_STATE: return "SERVER_KAFMONITOR_STATE"; - case PacketType::SERVER_YCRSMOKE_STATE: return "SERVER_YCRSMOKE_STATE"; - case PacketType::SERVER_YCRSMOKE_READY: return "SERVER_YCRSMOKE_READY"; - case PacketType::SERVER_MOVINGSPIKE_STATE: return "SERVER_MOVINGSPIKE_STATE"; - case PacketType::SERVER_RING_STATE: return "SERVER_RING_STATE"; - case PacketType::SERVER_RING_COLLECTED: return "SERVER_RING_COLLECTED"; - case PacketType::SERVER_ACT9WALL_STATE: return "SERVER_ACT9WALL_STATE"; - case PacketType::SERVER_NAPBALL_STATE: return "SERVER_NAPBALL_STATE"; - case PacketType::SERVER_NAPICE_STATE: return "SERVER_NAPICE_STATE"; - case PacketType::SERVER_PFLIFT_STATE: return "SERVER_PFLIFT_STATE"; - case PacketType::SERVER_BRING_STATE: return "SERVER_BRING_STATE"; - case PacketType::SERVER_BRING_COLLECTED: return "SERVER_BRING_COLLECTED"; - case PacketType::SERVER_VVLCOLUMN_STATE: return "SERVER_VVLCOLUMN_STATE"; - case PacketType::SERVER_VVVASE_STATE: return "SERVER_VVVASE_STATE"; - case PacketType::SERVER_GHZTHUNDER_STATE: return "SERVER_GHZTHUNDER_STATE"; - case PacketType::SERVER_TCGOM_STATE: return "SERVER_TCGOM_STATE"; - case PacketType::SERVER_EXELLERCLONE_STATE: return "SERVER_EXELLERCLONE_STATE"; - case PacketType::SERVER_DTTAILSDOLL_STATE: return "SERVER_DTTAILSDOLL_STATE"; - case PacketType::SERVER_DTBALL_STATE: return "SERVER_DTBALL_STATE"; - case PacketType::SERVER_DTASS_STATE: return "SERVER_DTASS_STATE"; - case PacketType::SERVER_HDDOOR_STATE: return "SERVER_HDDOOR_STATE"; - case PacketType::SERVER_WDLATERN_ACTIVATE: return "SERVER_WDLATERN_ACTIVATE"; - case PacketType::SERVER_FART_STATE: return "SERVER_FART_STATE"; - case PacketType::SERVER_MJLAVA_STATE: return "SERVER_MJLAVA_STATE"; - case PacketType::SERVER_MJJUDGER_STATE: return "SERVER_MJJUDGER_STATE"; - case PacketType::SERVER_MJCRYSTAL_STATE: return "SERVER_MJCRYSTAL_STATE"; - case PacketType::CLIENT_ETRACKER: return "CLIENT_ETRACKER"; - case PacketType::CLIENT_ETRACKER_ACTIVATED: return "CLIENT_ETRACKER_ACTIVATED"; - case PacketType::CLIENT_TPROJECTILE: return "CLIENT_TPROJECTILE"; - case PacketType::CLIENT_TPROJECTILE_HIT: return "CLIENT_TPROJECTILE_HIT"; - case PacketType::CLIENT_TPROJECTILE_STARTCHARGE: return "CLIENT_TPROJECTILE_STARTCHARGE"; - case PacketType::CLIENT_ERECTOR_BALLS: return "CLIENT_ERECTOR_BALLS"; - case PacketType::CLIENT_ERECTOR_BRING_SPAWN: return "CLIENT_ERECTOR_BRING_SPAWN"; - case PacketType::CLIENT_EXELLER_SPAWN_CLONE: return "CLIENT_EXELLER_SPAWN_CLONE"; - case PacketType::CLIENT_EXELLER_TELEPORT_CLONE: return "CLIENT_EXELLER_TELEPORT_CLONE"; - case PacketType::CLIENT_MERCOIN_BONUS: return "CLIENT_MERCOIN_BONUS"; - case PacketType::CLIENT_RMZSLIME_HIT: return "CLIENT_RMZSLIME_HIT"; - case PacketType::CLIENT_LCEYE_REQUEST_ACTIVATE: return "CLIENT_LCEYE_REQUEST_ACTIVATE"; - case PacketType::CLIENT_KAFMONITOR_ACTIVATE: return "CLIENT_KAFMONITOR_ACTIVATE"; - case PacketType::CLIENT_RING_COLLECTED: return "CLIENT_RING_COLLECTED"; - case PacketType::CLIENT_RING_BROKE: return "CLIENT_RING_BROKE"; - case PacketType::CLIENT_BRING_COLLECTED: return "CLIENT_BRING_COLLECTED"; - case PacketType::CLIENT_NAPICE_ACTIVATE: return "CLIENT_NAPICE_ACTIVATE"; - case PacketType::CLIENT_SPRING_USE: return "CLIENT_SPRING_USE"; - case PacketType::CLIENT_PFLIT_ACTIVATE: return "CLIENT_PFLIT_ACTIVATE"; - case PacketType::CLIENT_VVVASE_BREAK: return "CLIENT_VVVASE_BREAK"; - case PacketType::CLIENT_RMZSHARD_COLLECT: return "CLIENT_RMZSHARD_COLLECT"; - case PacketType::CLIENT_RMZSHARD_LAND: return "CLIENT_RMZSHARD_LAND"; - case PacketType::CLIENT_DTASS_ACTIVATE: return "CLIENT_DTASS_ACTIVATE"; - case PacketType::CLIENT_HDDOOR_TOGGLE: return "CLIENT_HDDOOR_TOGGLE"; - case PacketType::CLIENT_FART_PUSH: return "CLIENT_FART_PUSH"; - case PacketType::CLIENT_LOBBY_READY_STATE: return "CLIENT_LOBBY_READY_STATE"; - case PacketType::CLIENT_REQUESTED_INFO: return "CLIENT_REQUESTED_INFO"; - case PacketType::CLIENT_PLAYER_DATA: return "CLIENT_PLAYER_DATA"; - case PacketType::CLIENT_PLAYER_HURT: return "CLIENT_PLAYER_HURT"; - case PacketType::CLIENT_SOUND_EMIT: return "CLIENT_SOUND_EMIT"; - case PacketType::CLIENT_PING: return "CLIENT_PING"; - case PacketType::CLIENT_REVIVAL_PROGRESS: return "CLIENT_REVIVAL_PROGRESS"; - case PacketType::CLIENT_PLAYER_HEAL: return "CLIENT_PLAYER_HEAL"; - case PacketType::CLIENT_PLAYER_HEAL_PART: return "CLIENT_PLAYER_HEAL_PART"; - case PacketType::SERVER_REVIVAL_PROGRESS: return "SERVER_REVIVAL_PROGRESS"; - case PacketType::SERVER_REVIVAL_STATUS: return "SERVER_REVIVAL_STATUS"; - case PacketType::SERVER_REVIVAL_RINGSUB: return "SERVER_REVIVAL_RINGSUB"; - case PacketType::SERVER_REVIVAL_REVIVED: return "SERVER_REVIVAL_REVIVED"; - case PacketType::CLIENT_REQUEST_CHARACTER: return "CLIENT_REQUEST_CHARACTER"; - case PacketType::CLIENT_REQUEST_EXECHARACTER: return "CLIENT_REQUEST_EXECHARACTER"; - case PacketType::CLIENT_VOTE_REQUEST: return "CLIENT_VOTE_REQUEST"; - case PacketType::CLIENT_PLAYER_DEATH_STATE: return "CLIENT_PLAYER_DEATH_STATE"; - case PacketType::CLIENT_PLAYER_ESCAPED: return "CLIENT_PLAYER_ESCAPED"; - case PacketType::SERVER_PLAYER_ESCAPED: return "SERVER_PLAYER_ESCAPED"; - case PacketType::CLIENT_LOBBY_PLAYERS_REQUEST: return "CLIENT_LOBBY_PLAYERS_REQUEST"; - case PacketType::CLIENT_CREAM_SPAWN_RINGS: return "CLIENT_CREAM_SPAWN_RINGS"; - case PacketType::CLIENT_SPAWN_EFFECT: return "CLIENT_SPAWN_EFFECT"; - case PacketType::CLIENT_CHAT_MESSAGE: return "CLIENT_CHAT_MESSAGE"; - case PacketType::CLIENT_LOBBY_CHOOSEVOTEKICK: return "CLIENT_LOBBY_CHOOSEVOTEKICK"; - case PacketType::CLIENT_LOBBY_CHOOSEBAN: return "CLIENT_LOBBY_CHOOSEBAN"; - case PacketType::CLIENT_LOBBY_CHOOSEKICK: return "CLIENT_LOBBY_CHOOSEKICK"; - case PacketType::CLIENT_LOBBY_CHOOSEOP: return "CLIENT_LOBBY_CHOOSEOP"; - case PacketType::CLIENT_PLAYER_PALETTE: return "CLIENT_PLAYER_PALETTE"; - case PacketType::CLIENT_PET_PALETTE: return "CLIENT_PET_PALETTE"; - case PacketType::SERVER_RESULTS: return "SERVER_RESULTS"; - case PacketType::SERVER_RESULTS_DATA: return "SERVER_RESULTS_DATA"; - case PacketType::CLIENT_RESULTS_REQUEST: return "CLIENT_RESULTS_REQUEST"; - case PacketType::CLIENT_STATS_REPORT: return "CLIENT_STATS_REPORT"; - case PacketType::SERVER_PREIDENTITY: return "SERVER_PREIDENTITY"; - case PacketType::SERVER_FELLA: return "SERVER_FELLA"; - case PacketType::CLIENT_PLAYER_POTATER: return "CLIENT_PLAYER_POTATER"; + case PacketType::IDENTITY: return "PacketType::IDENTITY"; + case PacketType::SERVER_IDENTITY_RESPONSE: return "PacketType::SERVER_IDENTITY_RESPONSE"; + case PacketType::SERVER_PLAYER_JOINED: return "PacketType::SERVER_PLAYER_JOINED"; + case PacketType::SERVER_PLAYER_LEFT: return "PacketType::SERVER_PLAYER_LEFT"; + case PacketType::SERVER_PLAYER_FORCE_DISCONNECT: return "PacketType::SERVER_PLAYER_FORCE_DISCONNECT"; + case PacketType::SERVER_WAITING_PLAYER_INFO: return "PacketType::SERVER_WAITING_PLAYER_INFO"; + case PacketType::SERVER_LOBBY_READY_STATE: return "PacketType::SERVER_LOBBY_READY_STATE"; + case PacketType::SERVER_LOBBY_EXE: return "PacketType::SERVER_LOBBY_EXE"; + case PacketType::SERVER_LOBBY_COUNTDOWN: return "PacketType::SERVER_LOBBY_COUNTDOWN"; + case PacketType::SERVER_LOBBY_EXE_CHANGE: return "PacketType::SERVER_LOBBY_EXE_CHANGE"; + case PacketType::SERVER_LOBBY_CHARACTER_CHANGE: return "PacketType::SERVER_LOBBY_CHARACTER_CHANGE"; + case PacketType::SERVER_LOBBY_CHARACTER_RESPONSE: return "PacketType::SERVER_LOBBY_CHARACTER_RESPONSE"; + case PacketType::SERVER_LOBBY_EXECHARACTER_RESPONSE: return "PacketType::SERVER_LOBBY_EXECHARACTER_RESPONSE"; + case PacketType::SERVER_LOBBY_GAME_START: return "PacketType::SERVER_LOBBY_GAME_START"; + case PacketType::SERVER_LOBBY_PLAYER: return "PacketType::SERVER_LOBBY_PLAYER"; + case PacketType::SERVER_LOBBY_EXE_CHANCE: return "PacketType::SERVER_LOBBY_EXE_CHANCE"; + case PacketType::SERVER_LOBBY_CORRECT: return "PacketType::SERVER_LOBBY_CORRECT"; + case PacketType::SERVER_LOBBY_CHOOSEVOTEKICK: return "PacketType::SERVER_LOBBY_CHOOSEVOTEKICK"; + case PacketType::SERVER_LOBBY_CHOOSEBAN: return "PacketType::SERVER_LOBBY_CHOOSEBAN"; + case PacketType::SERVER_LOBBY_CHOOSEKICK: return "PacketType::SERVER_LOBBY_CHOOSEKICK"; + case PacketType::SERVER_LOBBY_CHOOSEOP: return "PacketType::SERVER_LOBBY_CHOOSEOP"; + case PacketType::SERVER_LOBBY_CHANGELOBBY: return "PacketType::SERVER_LOBBY_CHANGELOBBY"; + case PacketType::SERVER_CHAR_TIME_SYNC: return "PacketType::SERVER_CHAR_TIME_SYNC"; + case PacketType::SERVER_VOTE_MAPS: return "PacketType::SERVER_VOTE_MAPS"; + case PacketType::SERVER_VOTE_SET: return "PacketType::SERVER_VOTE_SET"; + case PacketType::SERVER_VOTE_TIME_SYNC: return "PacketType::SERVER_VOTE_TIME_SYNC"; + case PacketType::SERVER_GAME_PLAYERS_READY: return "PacketType::SERVER_GAME_PLAYERS_READY"; + case PacketType::SERVER_GAME_EXE_WINS: return "PacketType::SERVER_GAME_EXE_WINS"; + case PacketType::SERVER_GAME_SURVIVOR_WIN: return "PacketType::SERVER_GAME_SURVIVOR_WIN"; + case PacketType::SERVER_GAME_SPAWN_RING: return "PacketType::SERVER_GAME_SPAWN_RING"; + case PacketType::SERVER_GAME_PLAYER_ESCAPED: return "PacketType::SERVER_GAME_PLAYER_ESCAPED"; + case PacketType::SERVER_GAME_BACK_TO_LOBBY: return "PacketType::SERVER_GAME_BACK_TO_LOBBY"; + case PacketType::SERVER_GAME_TIME_SYNC: return "PacketType::SERVER_GAME_TIME_SYNC"; + case PacketType::SERVER_GAME_TIME_OVER: return "PacketType::SERVER_GAME_TIME_OVER"; + case PacketType::SERVER_GAME_PING: return "PacketType::SERVER_GAME_PING"; + case PacketType::SERVER_PLAYER_DEATH_STATE: return "PacketType::SERVER_PLAYER_DEATH_STATE"; + case PacketType::SERVER_GAME_DEATHTIMER_TICK: return "PacketType::SERVER_GAME_DEATHTIMER_TICK"; + case PacketType::SERVER_GAME_DEATHTIMER_END: return "PacketType::SERVER_GAME_DEATHTIMER_END"; + case PacketType::SERVER_REQUEST_INFO: return "PacketType::SERVER_REQUEST_INFO"; + case PacketType::SERVER_HEARTBEAT: return "PacketType::SERVER_HEARTBEAT"; + case PacketType::SERVER_PONG: return "PacketType::SERVER_PONG"; + case PacketType::SERVER_FORCE_DAMAGE: return "PacketType::SERVER_FORCE_DAMAGE"; + case PacketType::SERVER_GAME_RING_READY: return "PacketType::SERVER_GAME_RING_READY"; + case PacketType::SERVER_PLAYER_BACKTRACK: return "PacketType::SERVER_PLAYER_BACKTRACK"; + case PacketType::SERVER_TPROJECTILE_STATE: return "PacketType::SERVER_TPROJECTILE_STATE"; + case PacketType::SERVER_ETRACKER_STATE: return "PacketType::SERVER_ETRACKER_STATE"; + case PacketType::SERVER_ERECTOR_BRING_SPAWN: return "PacketType::SERVER_ERECTOR_BRING_SPAWN"; + case PacketType::SERVER_RMZSLIME_STATE: return "PacketType::SERVER_RMZSLIME_STATE"; + case PacketType::SERVER_RMZSLIME_RINGBONUS: return "PacketType::SERVER_RMZSLIME_RINGBONUS"; + case PacketType::SERVER_RMZSHARD_STATE: return "PacketType::SERVER_RMZSHARD_STATE"; + case PacketType::SERVER_LCEYE_STATE: return "PacketType::SERVER_LCEYE_STATE"; + case PacketType::SERVER_LCCHAIN_STATE: return "PacketType::SERVER_LCCHAIN_STATE"; + case PacketType::SERVER_NPCONTROLLER_STATE: return "PacketType::SERVER_NPCONTROLLER_STATE"; + case PacketType::SERVER_KAFMONITOR_STATE: return "PacketType::SERVER_KAFMONITOR_STATE"; + case PacketType::SERVER_YCRSMOKE_STATE: return "PacketType::SERVER_YCRSMOKE_STATE"; + case PacketType::SERVER_YCRSMOKE_READY: return "PacketType::SERVER_YCRSMOKE_READY"; + case PacketType::SERVER_MOVINGSPIKE_STATE: return "PacketType::SERVER_MOVINGSPIKE_STATE"; + case PacketType::SERVER_RING_STATE: return "PacketType::SERVER_RING_STATE"; + case PacketType::SERVER_RING_COLLECTED: return "PacketType::SERVER_RING_COLLECTED"; + case PacketType::SERVER_ACT9WALL_STATE: return "PacketType::SERVER_ACT9WALL_STATE"; + case PacketType::SERVER_NAPBALL_STATE: return "PacketType::SERVER_NAPBALL_STATE"; + case PacketType::SERVER_NAPICE_STATE: return "PacketType::SERVER_NAPICE_STATE"; + case PacketType::SERVER_PFLIFT_STATE: return "PacketType::SERVER_PFLIFT_STATE"; + case PacketType::SERVER_BRING_STATE: return "PacketType::SERVER_BRING_STATE"; + case PacketType::SERVER_BRING_COLLECTED: return "PacketType::SERVER_BRING_COLLECTED"; + case PacketType::SERVER_VVLCOLUMN_STATE: return "PacketType::SERVER_VVLCOLUMN_STATE"; + case PacketType::SERVER_VVVASE_STATE: return "PacketType::SERVER_VVVASE_STATE"; + case PacketType::SERVER_GHZTHUNDER_STATE: return "PacketType::SERVER_GHZTHUNDER_STATE"; + case PacketType::SERVER_TCGOM_STATE: return "PacketType::SERVER_TCGOM_STATE"; + case PacketType::SERVER_EXELLERCLONE_STATE: return "PacketType::SERVER_EXELLERCLONE_STATE"; + case PacketType::SERVER_DTTAILSDOLL_STATE: return "PacketType::SERVER_DTTAILSDOLL_STATE"; + case PacketType::SERVER_DTBALL_STATE: return "PacketType::SERVER_DTBALL_STATE"; + case PacketType::SERVER_DTASS_STATE: return "PacketType::SERVER_DTASS_STATE"; + case PacketType::SERVER_HDDOOR_STATE: return "PacketType::SERVER_HDDOOR_STATE"; + case PacketType::SERVER_WDLATERN_ACTIVATE: return "PacketType::SERVER_WDLATERN_ACTIVATE"; + case PacketType::SERVER_FART_STATE: return "PacketType::SERVER_FART_STATE"; + case PacketType::SERVER_MJLAVA_STATE: return "PacketType::SERVER_MJLAVA_STATE"; + case PacketType::SERVER_MJJUDGER_STATE: return "PacketType::SERVER_MJJUDGER_STATE"; + case PacketType::SERVER_MJCRYSTAL_STATE: return "PacketType::SERVER_MJCRYSTAL_STATE"; + case PacketType::CLIENT_ETRACKER: return "PacketType::CLIENT_ETRACKER"; + case PacketType::CLIENT_ETRACKER_ACTIVATED: return "PacketType::CLIENT_ETRACKER_ACTIVATED"; + case PacketType::CLIENT_TPROJECTILE: return "PacketType::CLIENT_TPROJECTILE"; + case PacketType::CLIENT_TPROJECTILE_HIT: return "PacketType::CLIENT_TPROJECTILE_HIT"; + case PacketType::CLIENT_TPROJECTILE_STARTCHARGE: return "PacketType::CLIENT_TPROJECTILE_STARTCHARGE"; + case PacketType::CLIENT_ERECTOR_BALLS: return "PacketType::CLIENT_ERECTOR_BALLS"; + case PacketType::CLIENT_ERECTOR_BRING_SPAWN: return "PacketType::CLIENT_ERECTOR_BRING_SPAWN"; + case PacketType::CLIENT_EXELLER_SPAWN_CLONE: return "PacketType::CLIENT_EXELLER_SPAWN_CLONE"; + case PacketType::CLIENT_EXELLER_TELEPORT_CLONE: return "PacketType::CLIENT_EXELLER_TELEPORT_CLONE"; + case PacketType::CLIENT_MERCOIN_BONUS: return "PacketType::CLIENT_MERCOIN_BONUS"; + case PacketType::CLIENT_RMZSLIME_HIT: return "PacketType::CLIENT_RMZSLIME_HIT"; + case PacketType::CLIENT_LCEYE_REQUEST_ACTIVATE: return "PacketType::CLIENT_LCEYE_REQUEST_ACTIVATE"; + case PacketType::CLIENT_KAFMONITOR_ACTIVATE: return "PacketType::CLIENT_KAFMONITOR_ACTIVATE"; + case PacketType::CLIENT_RING_COLLECTED: return "PacketType::CLIENT_RING_COLLECTED"; + case PacketType::CLIENT_RING_BROKE: return "PacketType::CLIENT_RING_BROKE"; + case PacketType::CLIENT_BRING_COLLECTED: return "PacketType::CLIENT_BRING_COLLECTED"; + case PacketType::CLIENT_NAPICE_ACTIVATE: return "PacketType::CLIENT_NAPICE_ACTIVATE"; + case PacketType::CLIENT_SPRING_USE: return "PacketType::CLIENT_SPRING_USE"; + case PacketType::CLIENT_PFLIT_ACTIVATE: return "PacketType::CLIENT_PFLIT_ACTIVATE"; + case PacketType::CLIENT_VVVASE_BREAK: return "PacketType::CLIENT_VVVASE_BREAK"; + case PacketType::CLIENT_RMZSHARD_COLLECT: return "PacketType::CLIENT_RMZSHARD_COLLECT"; + case PacketType::CLIENT_RMZSHARD_LAND: return "PacketType::CLIENT_RMZSHARD_LAND"; + case PacketType::CLIENT_DTASS_ACTIVATE: return "PacketType::CLIENT_DTASS_ACTIVATE"; + case PacketType::CLIENT_HDDOOR_TOGGLE: return "PacketType::CLIENT_HDDOOR_TOGGLE"; + case PacketType::CLIENT_FART_PUSH: return "PacketType::CLIENT_FART_PUSH"; + case PacketType::CLIENT_LOBBY_READY_STATE: return "PacketType::CLIENT_LOBBY_READY_STATE"; + case PacketType::CLIENT_REQUESTED_INFO: return "PacketType::CLIENT_REQUESTED_INFO"; + case PacketType::CLIENT_PLAYER_DATA: return "PacketType::CLIENT_PLAYER_DATA"; + case PacketType::CLIENT_PLAYER_HURT: return "PacketType::CLIENT_PLAYER_HURT"; + case PacketType::CLIENT_SOUND_EMIT: return "PacketType::CLIENT_SOUND_EMIT"; + case PacketType::CLIENT_PING: return "PacketType::CLIENT_PING"; + case PacketType::CLIENT_REVIVAL_PROGRESS: return "PacketType::CLIENT_REVIVAL_PROGRESS"; + case PacketType::CLIENT_PLAYER_HEAL: return "PacketType::CLIENT_PLAYER_HEAL"; + case PacketType::CLIENT_PLAYER_HEAL_PART: return "PacketType::CLIENT_PLAYER_HEAL_PART"; + case PacketType::SERVER_REVIVAL_PROGRESS: return "PacketType::SERVER_REVIVAL_PROGRESS"; + case PacketType::SERVER_REVIVAL_STATUS: return "PacketType::SERVER_REVIVAL_STATUS"; + case PacketType::SERVER_REVIVAL_RINGSUB: return "PacketType::SERVER_REVIVAL_RINGSUB"; + case PacketType::SERVER_REVIVAL_REVIVED: return "PacketType::SERVER_REVIVAL_REVIVED"; + case PacketType::CLIENT_REQUEST_CHARACTER: return "PacketType::CLIENT_REQUEST_CHARACTER"; + case PacketType::CLIENT_REQUEST_EXECHARACTER: return "PacketType::CLIENT_REQUEST_EXECHARACTER"; + case PacketType::CLIENT_VOTE_REQUEST: return "PacketType::CLIENT_VOTE_REQUEST"; + case PacketType::CLIENT_PLAYER_DEATH_STATE: return "PacketType::CLIENT_PLAYER_DEATH_STATE"; + case PacketType::CLIENT_PLAYER_ESCAPED: return "PacketType::CLIENT_PLAYER_ESCAPED"; + case PacketType::SERVER_PLAYER_ESCAPED: return "PacketType::SERVER_PLAYER_ESCAPED"; + case PacketType::CLIENT_LOBBY_PLAYERS_REQUEST: return "PacketType::CLIENT_LOBBY_PLAYERS_REQUEST"; + case PacketType::CLIENT_CREAM_SPAWN_RINGS: return "PacketType::CLIENT_CREAM_SPAWN_RINGS"; + case PacketType::CLIENT_SPAWN_EFFECT: return "PacketType::CLIENT_SPAWN_EFFECT"; + case PacketType::CLIENT_CHAT_MESSAGE: return "PacketType::CLIENT_CHAT_MESSAGE"; + case PacketType::CLIENT_LOBBY_CHOOSEVOTEKICK: return "PacketType::CLIENT_LOBBY_CHOOSEVOTEKICK"; + case PacketType::CLIENT_LOBBY_CHOOSEBAN: return "PacketType::CLIENT_LOBBY_CHOOSEBAN"; + case PacketType::CLIENT_LOBBY_CHOOSEKICK: return "PacketType::CLIENT_LOBBY_CHOOSEKICK"; + case PacketType::CLIENT_LOBBY_CHOOSEOP: return "PacketType::CLIENT_LOBBY_CHOOSEOP"; + case PacketType::CLIENT_PLAYER_PALETTE: return "PacketType::CLIENT_PLAYER_PALETTE"; + case PacketType::CLIENT_PET_PALETTE: return "PacketType::CLIENT_PET_PALETTE"; + case PacketType::SERVER_RESULTS: return "PacketType::SERVER_RESULTS"; + case PacketType::SERVER_RESULTS_DATA: return "PacketType::SERVER_RESULTS_DATA"; + case PacketType::CLIENT_RESULTS_REQUEST: return "PacketType::CLIENT_RESULTS_REQUEST"; + case PacketType::CLIENT_STATS_REPORT: return "PacketType::CLIENT_STATS_REPORT"; + case PacketType::SERVER_PREIDENTITY: return "PacketType::SERVER_PREIDENTITY"; + case PacketType::SERVER_FELLA: return "PacketType::SERVER_FELLA"; + case PacketType::CLIENT_PLAYER_POTATER: return "PacketType::CLIENT_PLAYER_POTATER"; default: return ""; } } +#ifdef __GNUC__ // GCC, clang... +#define BYTESWAP_16(x) __builtin_bswap16((x)) +#define BYTESWAP_32(x) __builtin_bswap32((x)) +#define BYTESWAP_64(x) __builtin_bswap64((x)) +#else +#define BYTESWAP_16(x) _byteswap_ushort((x)) +#define BYTESWAP_32(x) _byteswap_ulong((x)) +#define BYTESWAP_64(x) _byteswap_uint64((x)) +#endif + static constexpr int PACKET_MAXSIZE = 256; #undef min @@ -352,6 +362,17 @@ namespace DisasterServer { } T value {}; + +#ifdef SYS_BIG_ENDIAN + if (sizeof(T) == sizeof(uint16_t)) { + value = BYTESWAP_16(value); + } else if (sizeof(T) == sizeof(uint32_t)) { + value = BYTESWAP_32(value); + } else if (sizeof(T) == sizeof(uint64_t)) { + value = BYTESWAP_64(value); + } +#endif + std::memcpy(&value, buffer.data() + position, sizeof(T)); position += sizeof(T); @@ -367,6 +388,16 @@ namespace DisasterServer { throw std::runtime_error("Packet overflow"); } +#ifdef SYS_BIG_ENDIAN + if (sizeof(T) == sizeof(uint16_t)) { + value = BYTESWAP_16(value); + } else if (sizeof(T) == sizeof(uint32_t)) { + value = BYTESWAP_32(value); + } else if (sizeof(T) == sizeof(uint64_t)) { + value = BYTESWAP_64(value); + } +#endif + std::memcpy(buffer.data() + position, &value, sizeof(T)); position += sizeof(T); diff --git a/disasterserver/Server.cpp b/disasterserver/Server.cpp index 495add1..8ccdca0 100644 --- a/disasterserver/Server.cpp +++ b/disasterserver/Server.cpp @@ -200,7 +200,7 @@ void Server::disconnect_by_id(const clientId client_id, DisconnectReason reason, } void Server::broadcast_ex(Packet &packet, bool reliable, clientId ignore) { - Debug("PacketType::{} sending broadcast, ignoring client {}", getPacketTypeName(packet.getPacketType()), ignore); + Debug("{} sending broadcast, ignoring client {}", getPacketTypeName(packet.getPacketType()), ignore); packet.sendBroadcast(*this, reliable, [ignore](const Client& v) { return v.getId() != ignore; }); } diff --git a/disasterserver/StateController.cpp b/disasterserver/StateController.cpp index 8691ff4..4a41df3 100644 --- a/disasterserver/StateController.cpp +++ b/disasterserver/StateController.cpp @@ -4,7 +4,7 @@ using namespace DisasterServer; -StateController::StateController(Server *server): server(server), lobby(server, this), charSelect(server, this), current(std::make_unique(server, this)) { +StateController::StateController(Server *server): server(server), current(std::make_unique(server, this)) { } StateController::~StateController() = default; @@ -104,7 +104,7 @@ bool StateController::handle(Client &peer, Packet &packet) { return true; } -commandHash StateController::cmd_parse(std::string string) { +commandHash StateController::cmdParse(std::string string) { static std::array clr_list = CLRLIST; std::string current; @@ -143,7 +143,7 @@ commandHash StateController::cmd_parse(std::string string) { return hash; } -bool StateController::cmd_handle(Client &client, commandHash hash, const std::string &message) { +bool StateController::cmdHandle(Client &client, commandHash hash, const std::string &message) { switch (hash) { case CMD_BAN: { if (!client.isOpped()) { @@ -157,7 +157,10 @@ bool StateController::cmd_handle(Client &client, commandHash hash, const std::st } Packet pack(PacketType::CLIENT_LOBBY_CHOOSEBAN); - RAssert(pack.send(client)); + if (!pack.send(client, true)) { + Warn("Failed send packet {} to {} (id {})", getPacketTypeName(pack.getPacketType()), client.getNickname(), client.getId()); + return false; + } break; } @@ -173,7 +176,10 @@ bool StateController::cmd_handle(Client &client, commandHash hash, const std::st } Packet pack(PacketType::SERVER_LOBBY_CHOOSEKICK); - RAssert(pack.send(client)); + if (!pack.send(client, true)) { + Warn("Failed send packet {} to {} (id {})", getPacketTypeName(pack.getPacketType()), client.getNickname(), client.getId()); + return false; + } break; } @@ -189,14 +195,16 @@ bool StateController::cmd_handle(Client &client, commandHash hash, const std::st } Packet pack(PacketType::SERVER_LOBBY_CHOOSEOP); - RAssert(pack.send(client)); + if (!pack.send(client, true)) { + Warn("Failed send packet {} to {} (id {})", getPacketTypeName(pack.getPacketType()), client.getNickname(), client.getId()); + return false; + } break; } case CMD_LOBBY: { int ind; - if (sscanf(message.c_str(), ".lobby %d", &ind) <= 0) - { + if (sscanf(message.c_str(), ".lobby %d", &ind) <= 0) { this->server->send_message(client, "{}example:~ .lobby 1"); break; } @@ -205,9 +213,10 @@ bool StateController::cmd_handle(Client &client, commandHash hash, const std::st case CMD_HELP: { this->server->send_message(client, "~-----~ {}command list:{} ~-----~", CLRCODE_GRN, CLRCODE_RST); - this->server->send_message(client, "|- .vk~ - vote kick "); this->server->send_message(client, "|- .info~ - information about server"); + this->server->send_message(client, "|- .vk~ - vote kick"); this->server->send_message(client, "|- .vp~ - vote practice mode (wip)"); + this->server->send_message(client, "|- .lobby~ - change lobby (wip)"); break; } @@ -222,7 +231,7 @@ bool StateController::cmd_handle(Client &client, commandHash hash, const std::st #if defined(SERVER_DEBUG) case CMD_SELFOP: { client.setOperator(true); - this->server->send_message(client, "{}you aren't an operator.", CLRCODE_GRN); + this->server->send_message(client, "{}you're an operator now", CLRCODE_GRN); break; } case CMD_DEBUG: { diff --git a/disasterserver/StateController.hpp b/disasterserver/StateController.hpp index 906d5c4..69ebf73 100644 --- a/disasterserver/StateController.hpp +++ b/disasterserver/StateController.hpp @@ -2,7 +2,7 @@ #define DISASTERSERVER_STATEMACHINE_HPP #include "Core/Packet.hpp" -#include "Core/State.hpp" +#include "States/State.hpp" #include "States/LobbyState.hpp" #include "States/CharSelect.hpp" @@ -40,8 +40,6 @@ namespace DisasterServer Server *server = nullptr; States state = States::LOBBY; - LobbyState lobby; - CharSelectState charSelect; std::unique_ptr current; public: explicit StateController(Server* server); @@ -57,26 +55,27 @@ namespace DisasterServer current = std::move(state); } + template T> + bool isState() const { + return dynamic_cast(current.get()) != nullptr; + } + bool playerJoined(Client& peer); void playerLeft(Client& peer); void tick(); bool handle(Client& peer, Packet& packet); - commandHash cmd_parse(std::string string); - bool cmd_handle(Client& client, commandHash hash, const std::string& message); + commandHash cmdParse(std::string string); + bool cmdHandle(Client& client, commandHash hash, const std::string& message); States getCurrentState() const { return state; } void setState(States state) { this->state = state; } - - - LobbyState& getLobbyState() { return lobby.get(); } - CharSelectState& getCharSelect() { return charSelect.get(); } }; } #define AssertOrDisconnect(client, x) \ if(!(x)) { \ - client.disconnect(DisconnectReason::OTHER, "AssertOrDisconnect({}) failed!", #x); break; \ + client.disconnect(DisconnectReason::OTHER, "AssertOrDisconnect({}) failed!", #x); return false; \ } #endif //DISASTERSERVER_STATEMACHINE_HPP diff --git a/disasterserver/States/CharSelect.cpp b/disasterserver/States/CharSelect.cpp index d723a32..f558c82 100644 --- a/disasterserver/States/CharSelect.cpp +++ b/disasterserver/States/CharSelect.cpp @@ -9,7 +9,7 @@ using namespace DisasterServer; -CharSelectState::CharSelectState(Server* server, StateController* controller) : State(server, controller) { +CharSelectState::CharSelectState(Server* server, StateController* controller) : State(server, controller), countdown(server) { } bool CharSelectState::joined(Client& client) { @@ -30,21 +30,32 @@ bool CharSelectState::leaved(Client& client) { return checkState(); } -bool CharSelectState::init(int8_t selectedMap) { +void CharSelectState::init(int8_t selectedMap) { Debug("Attempting to enter ST_CHARSELECT..."); if (!chooseExe()) { Err("Failed to pick exe for some reason!"); - controller->setState(States::LOBBY); - return true; + controller->changeTo(); + return; } map = selectedMap; controller->setState(States::CHARSELECT); - countdownSec = 30; - countdown = TICKSPERSEC; + countdown.start(30); + countdown.setEndOfCountdown([&] { + for (auto& peer : server->getClients()) { + if (!peer || !peer->isInGame()) + continue; + + if (peer->getExeCharacter() == ExesCharacters::NONE + && peer->getSurvCharacter() == SurvCharacters::NONE) { + + peer->disconnect(DisconnectReason::AFKTIMEOUT); + } + } + }); Packet pack(PacketType::SERVER_LOBBY_EXE); pack.write(exe); @@ -52,12 +63,10 @@ bool CharSelectState::init(int8_t selectedMap) { pack.sendBroadcast(*server, true); Packet timePack(PacketType::SERVER_CHAR_TIME_SYNC); - timePack.write(countdownSec); + timePack.write(countdown.getCountdownSec()); timePack.sendBroadcast(*server, true); Info("{}Server is now in {}Character Select{}", CLRCODE_YLW, CLRCODE_PUR, CLRCODE_RST); - - return true; } bool CharSelectState::handle(Client& client, Packet& packet) { @@ -83,7 +92,10 @@ bool CharSelectState::handle(Client& client, Packet& packet) { Packet pack(PacketType::SERVER_LOBBY_EXECHARACTER_RESPONSE); pack.write(id); - RAssert(pack.send(client, true)); + if (!pack.send(client, true)) { + Warn("Failed send packet {} to {} (id {})", getPacketTypeName(pack.getPacketType()), client.getNickname(), client.getId()); + return false; + } Packet change(PacketType::SERVER_LOBBY_CHARACTER_CHANGE); change.write(client.getId()); @@ -145,8 +157,8 @@ bool CharSelectState::handle(Client& client, Packet& packet) { } case PacketType::CLIENT_CHAT_MESSAGE: { - const clientId pid = packet.read(); - const std::string message = packet.readString(); + clientId pid = packet.read(); + std::string message = packet.readString(); if (message.size() > 40) { client.disconnect(DisconnectReason::OTHER, "Chat message too long"); @@ -155,10 +167,13 @@ bool CharSelectState::handle(Client& client, Packet& packet) { client.setTimeout(0); - Info("{} {} (id {}): {}", client.getNickname(), CLRCODE_RST, client.getId(), message); - - controller->cmd_handle(client, this->controller->cmd_parse(message), message); + commandHash hash = controller->cmdParse(message); + bool isCommand = controller->cmdHandle(client, hash, message); + Info("{} (id {}): {}", client.getNickname(), client.getId(), message); + if (!isCommand) { + server->send_broadcast_message(client.getId(), message); + } break; } @@ -169,28 +184,7 @@ bool CharSelectState::handle(Client& client, Packet& packet) { } void CharSelectState::tick() { - if (countdown <= 0) { - countdown += TICKSPERSEC; - - if (--countdownSec == 0) { - for (auto& peer : server->getClients()) { - if (!peer || !peer->isInGame()) - continue; - - if (peer->getExeCharacter() == ExesCharacters::NONE - && peer->getSurvCharacter() == SurvCharacters::NONE) { - - peer->disconnect(DisconnectReason::AFKTIMEOUT); - } - } - } - - Packet pack(PacketType::SERVER_CHAR_TIME_SYNC); - pack.write(countdownSec); - pack.sendBroadcast(*server, true); - } - - countdown -= server->getDelta(); + countdown.update(); } bool CharSelectState::chooseExe() { diff --git a/disasterserver/States/CharSelect.hpp b/disasterserver/States/CharSelect.hpp index af95c89..e2b9f03 100644 --- a/disasterserver/States/CharSelect.hpp +++ b/disasterserver/States/CharSelect.hpp @@ -2,7 +2,8 @@ #define DISASTERSERVER_CHARSELECTSTATE_HPP #include "Client.hpp" -#include "Core/State.hpp" +#include "State.hpp" +#include "Util/Countdown.hpp" #include "Core/Packet.hpp" #include "Core/Types.hpp" @@ -12,29 +13,21 @@ namespace DisasterServer class StateController; class CharSelectState : public State { - - double countdown = 0; - uint8_t countdownSec = 30; + Countdown countdown; int8_t map = 0; clientId exe = 0; std::unordered_map avail; - public: CharSelectState(Server* server, StateController* controller); ~CharSelectState() = default; - bool init(int8_t map); + void init(int8_t map); bool joined(Client& client) override; bool leaved(Client& client) override; void tick() override; bool handle(Client& client, Packet& packet) override; - - clientId getExe() const { return exe; } - int8_t getMap() const { return map; } - - CharSelectState &get() { return *this; } private: bool checkState(); bool chooseExe(); diff --git a/disasterserver/States/LobbyState.cpp b/disasterserver/States/LobbyState.cpp index fdfdca5..bbf17c3 100644 --- a/disasterserver/States/LobbyState.cpp +++ b/disasterserver/States/LobbyState.cpp @@ -11,7 +11,7 @@ using namespace DisasterServer; LobbyState::LobbyState(Server *server, StateController *controller) : State(server, controller), vote(server) { } -bool LobbyState::init() { +void LobbyState::init() { for (auto &peer : server->getClients()) { peer->setReady(false); peer->setVoted(false); @@ -39,21 +39,18 @@ bool LobbyState::init() { } } - controller->setState(States::LOBBY); countdown = TICKSPERSEC; - countdown_sec = NO_COUNTDOWN; - prac_countdown = 0; + countdownSec = NO_COUNTDOWN; + pracCountdown = 0; Packet pack(PacketType::SERVER_GAME_BACK_TO_LOBBY); pack.sendBroadcast(*server, true); - - return true; } bool LobbyState::sendCountdown() { Packet pack(PacketType::SERVER_LOBBY_COUNTDOWN); - pack.write(this->countdown_sec < NO_COUNTDOWN); - pack.write(countdown_sec); + pack.write(this->countdownSec < NO_COUNTDOWN); + pack.write(countdownSec); pack.sendBroadcast(*server, true); return true; } @@ -76,13 +73,13 @@ bool LobbyState::checkCountdown() { if (ready == players->size() && players->size() > 1) { countdown = TICKSPERSEC; - countdown_sec = COUNTDOWN; + countdownSec = START_COUNTDOWN; return sendCountdown(); } - if (countdown_sec != NO_COUNTDOWN) { + if (countdownSec != NO_COUNTDOWN) { countdown = TICKSPERSEC; - countdown_sec = NO_COUNTDOWN; + countdownSec = NO_COUNTDOWN; return sendCountdown(); } @@ -100,7 +97,7 @@ void LobbyState::checkVote() { case VoteType::PRACTICE: { this->server->send_broadcast_message(0, "vote practice succeeded~ (@{} ~from \\{}", vote.getVoteCount(), vote.getVoteTotal()); - prac_countdown = 2 * TICKSPERSEC; + pracCountdown = 2 * TICKSPERSEC; break; } @@ -127,7 +124,7 @@ void LobbyState::checkVote() { } bool LobbyState::joined(Client &peer) { - RAssert(checkCountdown()); + checkCountdown(); return true; } @@ -136,7 +133,7 @@ bool LobbyState::leaved(Client &peer) { return true; } - RAssert(checkCountdown()); + checkCountdown(); return true; } @@ -161,9 +158,9 @@ void LobbyState::tick() { } } - if (prac_countdown > 0) { - prac_countdown -= server->getDelta(); - if (prac_countdown <= 0) { + if (pracCountdown > 0) { + pracCountdown -= server->getDelta(); + if (pracCountdown <= 0) { controller->changeTo(20); return; } @@ -173,12 +170,12 @@ void LobbyState::tick() { checkVote(); } - if (countdown_sec <= COUNTDOWN) { + if (countdownSec <= START_COUNTDOWN) { if (countdown <= 0) { countdown += TICKSPERSEC; - if (--countdown_sec == 0) { - controller->changeTo(0); + if (--countdownSec == 0) { + controller->changeTo(0); //Map vote return; } @@ -224,7 +221,14 @@ bool LobbyState::handle(Client &client, Packet &packet) { clientId pid = packet.read(); std::string message = packet.readString(); - commandHash hash = controller->cmd_parse(message); + if (message.size() > 40) { + client.disconnect(DisconnectReason::OTHER, "Chat message too long"); + return false; + } + + client.setTimeout(0); + + commandHash hash = controller->cmdParse(message); bool isCommand = cmdHandle(client, pid, hash, message); Info("{} (id {}): {}", client.getNickname(), client.getId(), message); @@ -323,18 +327,19 @@ bool LobbyState::handle(Client &client, Packet &packet) { bool LobbyState::cmdHandle(Client &client, clientId pid, commandHash hash, std::string &message) { switch (hash) { default: { - if (!controller->cmd_handle(client, hash, message)) { + if (!controller->cmdHandle(client, hash, message)) { return false; } break; } case CMD_MAP: { - /*if (!client.isOpped()) { +#if !defined(SERVER_DEBUG) + if (!client.isOpped()) { this->server->send_message(client, "{}you aren't an operator", CLRCODE_RED); break; - }*/ - + } +#endif int ind; if (sscanf(message.c_str(), ".map %d", &ind) <= 0) { this->server->send_message(client, "{}example:~ .map 1", CLRCODE_RED); @@ -447,7 +452,7 @@ bool LobbyState::cmdHandle(Client &client, clientId pid, commandHash hash, std:: break; } - int ingame = this->server->getInGameCount(); + size_t ingame = this->server->getInGameCount(); if (ingame > 2) { Packet pack(PacketType::SERVER_LOBBY_CHOOSEVOTEKICK); diff --git a/disasterserver/States/LobbyState.hpp b/disasterserver/States/LobbyState.hpp index d5857f2..2941300 100644 --- a/disasterserver/States/LobbyState.hpp +++ b/disasterserver/States/LobbyState.hpp @@ -3,11 +3,11 @@ #include -#include "Core/State.hpp" +#include "State.hpp" #include "Vote.hpp" -constexpr int COUNTDOWN = 5; -constexpr int NO_COUNTDOWN = 5 + 1; +constexpr int START_COUNTDOWN = 5; +constexpr int NO_COUNTDOWN = START_COUNTDOWN + 1; namespace DisasterServer { @@ -15,28 +15,26 @@ namespace DisasterServer class LobbyState : public State { double countdown = 0; - double prac_countdown = 0; - uint8_t countdown_sec = 0; + double pracCountdown = 0; + uint8_t countdownSec = 0; Vote vote; clientId kick_target = 0; public: LobbyState(Server *server, StateController *controller); ~LobbyState() override = default; - bool init(); - - bool sendCountdown(); - bool checkCountdown(); - void checkVote(); + void init(); bool joined(Client &peer) override; bool leaved(Client &peer) override; void tick() override; bool handle(Client &client, Packet &packet) override; + private: + bool sendCountdown(); + bool checkCountdown(); + void checkVote(); bool cmdHandle(Client &client, clientId pid, commandHash hash, std::string &message); - - LobbyState &get() { return *this; } }; diff --git a/disasterserver/States/MapVoteState.cpp b/disasterserver/States/MapVoteState.cpp index 78d9d4b..7ce8dde 100644 --- a/disasterserver/States/MapVoteState.cpp +++ b/disasterserver/States/MapVoteState.cpp @@ -1,11 +1,27 @@ #include "MapVoteState.hpp" +#include + #include "StateController.hpp" #include "Server.hpp" using namespace DisasterServer; -MapVoteState::MapVoteState(Server *server, StateController *controller) : State(server, controller) { +MapVoteState::MapVoteState(Server *server, StateController *controller) : State(server, controller), countdown(server) { +} + +void MapVoteState::init() { + Debug("Attepting to enter ST_MAPVOTE..."); + + // randomize + time_t seed = time(nullptr); + Debug("Mapvote seed: %d", seed); + srand(static_cast(seed)); + + countdown.start(30); + countdown.setEndOfCountdown([&] { + + }); } bool MapVoteState::joined(Client &client) { @@ -13,10 +29,15 @@ bool MapVoteState::joined(Client &client) { } bool MapVoteState::leaved(Client &client) { + if (this->server->getInGameCount() <= 1) { + controller->changeTo(); + return true; + } return true; } void MapVoteState::tick() { + countdown.update(); } bool MapVoteState::handle(Client &client, Packet &packet) { @@ -29,7 +50,7 @@ bool MapVoteState::handle(Client &client, Packet &packet) { uint8_t map = packet.read(); AssertOrDisconnect(client, !client.isVoted()); - AssertOrDisconnect(client, map >= 0); + AssertOrDisconnect(client, map > 0); AssertOrDisconnect(client, map < 3); votes[map]++; @@ -41,7 +62,29 @@ bool MapVoteState::handle(Client &client, Packet &packet) { } pack.sendBroadcast(*server); - //mapvote_check_state(v->server); + checkState(); + break; + } + + case PacketType::CLIENT_CHAT_MESSAGE: { + const clientId pid = packet.read(); + const std::string message = packet.readString(); + + if (message.size() > 40) { + client.disconnect(DisconnectReason::OTHER, "Chat message too long"); + return false; + } + + client.setTimeout(0); + + commandHash hash = controller->cmdParse(message); + bool isCommand = controller->cmdHandle(client, hash, message); + + Info("{} (id {}): {}", client.getNickname(), client.getId(), message); + if (!isCommand) { + server->send_broadcast_message(client.getId(), message); + } + break; } @@ -50,3 +93,21 @@ bool MapVoteState::handle(Client &client, Packet &packet) { return true; } + +void MapVoteState::checkState() { + const auto players = &server->getClients(); + const auto count = std::ranges::count_if( + *players, + [](const auto& peer) { + return peer->isInGame() && peer->isVoted(); + } + ); + + if (count <= this->server->getInGameCount()) { + /*if (server->lobby.countdown_sec > 3) + { + server->lobby.countdown = 0; + server->lobby.countdown_sec = 4; + }*/ + } +} diff --git a/disasterserver/States/MapVoteState.hpp b/disasterserver/States/MapVoteState.hpp index 7aa4c39..8a883a3 100644 --- a/disasterserver/States/MapVoteState.hpp +++ b/disasterserver/States/MapVoteState.hpp @@ -2,7 +2,8 @@ #define DISASTERSERVER_MAPVOTESTATE_HPP #include "Client.hpp" -#include "Core/State.hpp" +#include "State.hpp" +#include "Util/Countdown.hpp" namespace DisasterServer { @@ -10,18 +11,22 @@ namespace DisasterServer class StateController; class MapVoteState : public State { - std::array maps; - std::array votes; + Countdown countdown; + + std::array maps = {}; + std::array votes = {}; public: MapVoteState(Server *server, StateController *controller); ~MapVoteState() override = default; + void init(); bool joined(Client& client) override; bool leaved(Client& client) override; void tick() override; bool handle(Client& client, Packet& packet) override; - MapVoteState &get() { return *this; } + private: + void checkState(); }; } diff --git a/disasterserver/Core/State.hpp b/disasterserver/States/State.hpp similarity index 100% rename from disasterserver/Core/State.hpp rename to disasterserver/States/State.hpp diff --git a/disasterserver/States/TestState.hpp b/disasterserver/States/TestState.hpp deleted file mode 100644 index e4be1fb..0000000 --- a/disasterserver/States/TestState.hpp +++ /dev/null @@ -1,36 +0,0 @@ -#ifndef DISASTERSERVER_TESTSTATE_HPP -#define DISASTERSERVER_TESTSTATE_HPP - -#include "Core/State.hpp" - -namespace DisasterServer -{ - class TestState : public State { - Server *server = nullptr; - StateController *controller = nullptr; - public: - TestState(Server *server, StateController *controller, int test = 0) : State(server, controller) {} - - ~TestState() override { - - } - - bool joined(Client &client) override { - return true; - } - - bool leaved(Client &client) override { - return true; - }; - - void tick() override { - }; - - void handle(Client &client, Packet &packet) override { - }; - }; -} - - - -#endif //DISASTERSERVER_TESTSTATE_HPP diff --git a/disasterserver/Util/Countdown.cpp b/disasterserver/Util/Countdown.cpp new file mode 100644 index 0000000..057226d --- /dev/null +++ b/disasterserver/Util/Countdown.cpp @@ -0,0 +1,30 @@ +#include "Countdown.hpp" + +#include "Server.hpp" + +using namespace DisasterServer; + +Countdown::Countdown(Server *server) : server(server){ +} + +void Countdown::start(uint8_t seconds) { + countdownSec = seconds; + countdown = TICKSPERSEC; +} + +void Countdown::update() { + if (countdown <= 0) { + countdown += TICKSPERSEC; + + if (--countdownSec == 0) { + endOfCountdown(); + return; + } + + Packet pack(PacketType::SERVER_CHAR_TIME_SYNC); + pack.write(countdownSec); + pack.sendBroadcast(*server, true); + } + + countdown -= server->getDelta(); +} diff --git a/disasterserver/Util/Countdown.hpp b/disasterserver/Util/Countdown.hpp new file mode 100644 index 0000000..663b09e --- /dev/null +++ b/disasterserver/Util/Countdown.hpp @@ -0,0 +1,32 @@ +#ifndef DISASTERSERVER_COUNTDOWN_HPP +#define DISASTERSERVER_COUNTDOWN_HPP + +#include + +#include "Core/Types.hpp" + +namespace DisasterServer +{ + class Server; + + class Countdown { + Server *server = nullptr; + + double countdown = 0; + uint8_t countdownSec = 0; + + std::function endOfCountdown = [] {}; + + public: + Countdown(Server *server); + + void start(uint8_t seconds); + void update(); + + void setEndOfCountdown(const std::function callback) { this->endOfCountdown = callback; } + + uint8_t getCountdownSec() { return countdownSec; } + }; +} + +#endif //DISASTERSERVER_COUNTDOWN_HPP From e55d99ed7cc8d786d2cb8c66036239e67549d8c7 Mon Sep 17 00:00:00 2001 From: FakerNull0 Date: Wed, 9 Sep 2026 20:03:42 +0300 Subject: [PATCH 28/61] ? --- disasterserver/Server.hpp | 2 -- 1 file changed, 2 deletions(-) diff --git a/disasterserver/Server.hpp b/disasterserver/Server.hpp index 203bdb9..e033862 100644 --- a/disasterserver/Server.hpp +++ b/disasterserver/Server.hpp @@ -15,8 +15,6 @@ namespace DisasterServer constexpr int BUILD_VERSION = 1101; constexpr int BASE_SERVER_PORT = 8606; - - class Server { uint16_t id = 0; bool running = false; From 95b9e96b167c901dfa3013396e002e8eb8f80c32 Mon Sep 17 00:00:00 2001 From: FakerNull0 Date: Wed, 9 Sep 2026 21:01:30 +0300 Subject: [PATCH 29/61] good update --- README.md | 6 + disasterserver/Config.cpp | 72 + disasterserver/Config.hpp | 13 + disasterserver/Main.cpp | 41 +- disasterserver/Server.cpp | 8 +- disasterserver/Server.hpp | 1 - disasterserver/StateController.cpp | 20 +- disasterserver/Util/Countdown.cpp | 1 - thirdparty/cjson/json.hpp | 25526 +++++++++++++++++++++++++++ 9 files changed, 25671 insertions(+), 17 deletions(-) create mode 100644 disasterserver/Config.cpp create mode 100644 disasterserver/Config.hpp create mode 100644 thirdparty/cjson/json.hpp diff --git a/README.md b/README.md index 4c66027..659e7d1 100644 --- a/README.md +++ b/README.md @@ -4,4 +4,10 @@ ```bash git clone --recursive https://github.com/AX88M2/DisasterServer.git cmake -S . -B build && cmake --build build +``` + +## Alternative method building source +```bash +cmake -S . -B build +cmake --build build --config Release ``` \ No newline at end of file diff --git a/disasterserver/Config.cpp b/disasterserver/Config.cpp new file mode 100644 index 0000000..13a6ff4 --- /dev/null +++ b/disasterserver/Config.cpp @@ -0,0 +1,72 @@ +#include "Config.hpp" + +#include +#include + +#include + +Config g_config; + +bool Config::load(const std::string& filename) +{ + std::ifstream file(filename); + + if (!file.is_open()) { + std::ofstream new_file(filename); + + if (!new_file.is_open()) { + return false; + } + + new_file << R"({ + "server": { + "port": 8606, + "lobby_count": 1 + } +})"; + + new_file.close(); + + port = 8606; + lobby_count = 1; + + return true; + } + + std::stringstream buffer; + buffer << file.rdbuf(); + + const std::string content = buffer.str(); + + cJSON* root = cJSON_Parse(content.c_str()); + + if (!root) { + return false; + } + + cJSON* server = + cJSON_GetObjectItemCaseSensitive(root, "server"); + + if (!server || !cJSON_IsObject(server)) { + cJSON_Delete(root); + return false; + } + + cJSON* port_json = + cJSON_GetObjectItemCaseSensitive(server, "port"); + + if (port_json && cJSON_IsNumber(port_json)) { + port = static_cast(port_json->valueint); + } + + cJSON* lobby_json = + cJSON_GetObjectItemCaseSensitive(server, "lobby_count"); + + if (lobby_json && cJSON_IsNumber(lobby_json)) { + lobby_count = static_cast(lobby_json->valueint); + } + + cJSON_Delete(root); + + return true; +} \ No newline at end of file diff --git a/disasterserver/Config.hpp b/disasterserver/Config.hpp new file mode 100644 index 0000000..47573ce --- /dev/null +++ b/disasterserver/Config.hpp @@ -0,0 +1,13 @@ +#pragma once + +#include +#include + +struct Config { + uint32_t port = 8606; + uint32_t lobby_count = 1; + + bool load(const std::string& filename); +}; + +extern Config g_config; \ No newline at end of file diff --git a/disasterserver/Main.cpp b/disasterserver/Main.cpp index ef9ffc2..7902c41 100644 --- a/disasterserver/Main.cpp +++ b/disasterserver/Main.cpp @@ -1,32 +1,59 @@ #include "Server.hpp" - +#include "Config.hpp" #include "Core/Log.hpp" -int main(int argc, char *argv[]) { + +int main(int argc, char** argv[]) { + #ifdef _WIN32 SetConsoleCP(CP_UTF8); SetConsoleOutputCP(CP_UTF8); HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE); - DWORD mode = 0; + if (GetConsoleMode(handle, &mode)) { mode |= ENABLE_VIRTUAL_TERMINAL_PROCESSING; SetConsoleMode(handle, mode); } #endif + if (!g_config.load("config.json")) { + Err("Failed to load config.json"); + return 1; + } + try { enet_initialize(); Info("- DisasterServerCXX v{}", DisasterServer::BUILD_VERSION); Info("- Build from {} {}", __DATE__, __TIME__); - DisasterServer::Server server; - server.initialize(); + std::vector> servers; + std::vector threads; + + for (uint32_t i = 0; i < g_config.lobby_count; ++i) { + + auto server = std::make_unique(static_cast(i)); + + DisasterServer::Server* serverPtr = server.get(); + + servers.push_back(std::move(server)); + + threads.emplace_back([serverPtr]() { + serverPtr->initialize(); + }); + } + + for (auto& thread : threads) { + thread.join(); + } enet_deinitialize(); - } catch (std::exception& e) { + + } catch (const std::exception& e) { Err("Exception: {}", e.what()); } -} + + return 0; +} \ No newline at end of file diff --git a/disasterserver/Server.cpp b/disasterserver/Server.cpp index 8ccdca0..b91218b 100644 --- a/disasterserver/Server.cpp +++ b/disasterserver/Server.cpp @@ -1,11 +1,9 @@ #include "Server.hpp" - +#include "Config.hpp" #include - #include "Core/Packet.hpp" #include "Core/Log.hpp" #include "Core/Time.hpp" - #include "StateController.hpp" #include "Core/Colors.hpp" @@ -15,7 +13,7 @@ using namespace DisasterServer; Server::Server(const uint16_t n) : id(n), stateController(this) { ENetAddress addr; addr.host = ENET_HOST_ANY; - addr.port = BASE_SERVER_PORT + n; + addr.port = static_cast(g_config.port + n); host = enet_host_create(&addr, 50, 2, 0, 0); Info("Listening on port {}", addr.port); @@ -33,8 +31,6 @@ void Server::initialize() { double heartbeat = 0.0; constexpr double TARGET_FPS = 1000.0 / 60; - // - while (!running) { ENetEvent ev; if (enet_host_service(host, &ev, 5) > 0) { diff --git a/disasterserver/Server.hpp b/disasterserver/Server.hpp index e033862..00dcc62 100644 --- a/disasterserver/Server.hpp +++ b/disasterserver/Server.hpp @@ -13,7 +13,6 @@ namespace DisasterServer constexpr int MAX_PLAYERS = 7; constexpr int MAP_COUNT = 20; constexpr int BUILD_VERSION = 1101; - constexpr int BASE_SERVER_PORT = 8606; class Server { uint16_t id = 0; diff --git a/disasterserver/StateController.cpp b/disasterserver/StateController.cpp index 4a41df3..6143bb6 100644 --- a/disasterserver/StateController.cpp +++ b/disasterserver/StateController.cpp @@ -1,5 +1,6 @@ #include "StateController.hpp" #include "Server.hpp" +#include "Config.hpp" #include "Core/Colors.hpp" using namespace DisasterServer; @@ -203,11 +204,26 @@ bool StateController::cmdHandle(Client &client, commandHash hash, const std::str } case CMD_LOBBY: { + int ind; - if (sscanf(message.c_str(), ".lobby %d", &ind) <= 0) { - this->server->send_message(client, "{}example:~ .lobby 1"); + if (sscanf(message.c_str(), ".lobby %d", &ind) != 1) { + this->server->send_message(client, "{}example: .lobby 1", CLRCODE_RED); break; } + + if (ind < 1 || ind > static_cast(g_config.lobby_count)) { + this->server->send_message(client, std::string(CLRCODE_RED) + "lobby should be between 1 and " + std::to_string(g_config.lobby_count)); + break; + } + + Packet pack(PacketType::SERVER_LOBBY_CHANGELOBBY); + uint32_t port = g_config.port + static_cast(ind - 1); + pack.write(port); + + if (!pack.send(client, true)) { + Warn("Failed to send lobby change packet to {} (id {})", client.getNickname(), client.getId()); + } + break; } diff --git a/disasterserver/Util/Countdown.cpp b/disasterserver/Util/Countdown.cpp index 057226d..1c16b5e 100644 --- a/disasterserver/Util/Countdown.cpp +++ b/disasterserver/Util/Countdown.cpp @@ -1,5 +1,4 @@ #include "Countdown.hpp" - #include "Server.hpp" using namespace DisasterServer; diff --git a/thirdparty/cjson/json.hpp b/thirdparty/cjson/json.hpp new file mode 100644 index 0000000..82d69f7 --- /dev/null +++ b/thirdparty/cjson/json.hpp @@ -0,0 +1,25526 @@ +// __ _____ _____ _____ +// __| | __| | | | JSON for Modern C++ +// | | |__ | | | | | | version 3.12.0 +// |_____|_____|_____|_|___| https://github.com/nlohmann/json +// +// SPDX-FileCopyrightText: 2013 - 2025 Niels Lohmann +// SPDX-License-Identifier: MIT + +/****************************************************************************\ + * Note on documentation: The source files contain links to the online * + * documentation of the public API at https://json.nlohmann.me. This URL * + * contains the most recent documentation and should also be applicable to * + * previous versions; documentation for deprecated functions is not * + * removed, but marked deprecated. See "Generate documentation" section in * + * file docs/README.md. * +\****************************************************************************/ + +#ifndef INCLUDE_NLOHMANN_JSON_HPP_ +#define INCLUDE_NLOHMANN_JSON_HPP_ + +#include // all_of, find, for_each +#include // nullptr_t, ptrdiff_t, size_t +#include // hash, less +#include // initializer_list +#ifndef JSON_NO_IO + #include // istream, ostream +#endif // JSON_NO_IO +#include // random_access_iterator_tag +#include // unique_ptr +#include // string, stoi, to_string +#include // declval, forward, move, pair, swap +#include // vector + +// #include +// __ _____ _____ _____ +// __| | __| | | | JSON for Modern C++ +// | | |__ | | | | | | version 3.12.0 +// |_____|_____|_____|_|___| https://github.com/nlohmann/json +// +// SPDX-FileCopyrightText: 2013 - 2025 Niels Lohmann +// SPDX-License-Identifier: MIT + + + +#include + +// #include +// __ _____ _____ _____ +// __| | __| | | | JSON for Modern C++ +// | | |__ | | | | | | version 3.12.0 +// |_____|_____|_____|_|___| https://github.com/nlohmann/json +// +// SPDX-FileCopyrightText: 2013 - 2025 Niels Lohmann +// SPDX-License-Identifier: MIT + + + +// This file contains all macro definitions affecting or depending on the ABI + +#ifndef JSON_SKIP_LIBRARY_VERSION_CHECK + #if defined(NLOHMANN_JSON_VERSION_MAJOR) && defined(NLOHMANN_JSON_VERSION_MINOR) && defined(NLOHMANN_JSON_VERSION_PATCH) + #if NLOHMANN_JSON_VERSION_MAJOR != 3 || NLOHMANN_JSON_VERSION_MINOR != 12 || NLOHMANN_JSON_VERSION_PATCH != 0 + #warning "Already included a different version of the library!" + #endif + #endif +#endif + +#define NLOHMANN_JSON_VERSION_MAJOR 3 // NOLINT(modernize-macro-to-enum) +#define NLOHMANN_JSON_VERSION_MINOR 12 // NOLINT(modernize-macro-to-enum) +#define NLOHMANN_JSON_VERSION_PATCH 0 // NOLINT(modernize-macro-to-enum) + +#ifndef JSON_DIAGNOSTICS + #define JSON_DIAGNOSTICS 0 +#endif + +#ifndef JSON_DIAGNOSTIC_POSITIONS + #define JSON_DIAGNOSTIC_POSITIONS 0 +#endif + +#ifndef JSON_USE_LEGACY_DISCARDED_VALUE_COMPARISON + #define JSON_USE_LEGACY_DISCARDED_VALUE_COMPARISON 0 +#endif + +#if JSON_DIAGNOSTICS + #define NLOHMANN_JSON_ABI_TAG_DIAGNOSTICS _diag +#else + #define NLOHMANN_JSON_ABI_TAG_DIAGNOSTICS +#endif + +#if JSON_DIAGNOSTIC_POSITIONS + #define NLOHMANN_JSON_ABI_TAG_DIAGNOSTIC_POSITIONS _dp +#else + #define NLOHMANN_JSON_ABI_TAG_DIAGNOSTIC_POSITIONS +#endif + +#if JSON_USE_LEGACY_DISCARDED_VALUE_COMPARISON + #define NLOHMANN_JSON_ABI_TAG_LEGACY_DISCARDED_VALUE_COMPARISON _ldvcmp +#else + #define NLOHMANN_JSON_ABI_TAG_LEGACY_DISCARDED_VALUE_COMPARISON +#endif + +#ifndef NLOHMANN_JSON_NAMESPACE_NO_VERSION + #define NLOHMANN_JSON_NAMESPACE_NO_VERSION 0 +#endif + +// Construct the namespace ABI tags component +#define NLOHMANN_JSON_ABI_TAGS_CONCAT_EX(a, b, c) json_abi ## a ## b ## c +#define NLOHMANN_JSON_ABI_TAGS_CONCAT(a, b, c) \ + NLOHMANN_JSON_ABI_TAGS_CONCAT_EX(a, b, c) + +#define NLOHMANN_JSON_ABI_TAGS \ + NLOHMANN_JSON_ABI_TAGS_CONCAT( \ + NLOHMANN_JSON_ABI_TAG_DIAGNOSTICS, \ + NLOHMANN_JSON_ABI_TAG_LEGACY_DISCARDED_VALUE_COMPARISON, \ + NLOHMANN_JSON_ABI_TAG_DIAGNOSTIC_POSITIONS) + +// Construct the namespace version component +#define NLOHMANN_JSON_NAMESPACE_VERSION_CONCAT_EX(major, minor, patch) \ + _v ## major ## _ ## minor ## _ ## patch +#define NLOHMANN_JSON_NAMESPACE_VERSION_CONCAT(major, minor, patch) \ + NLOHMANN_JSON_NAMESPACE_VERSION_CONCAT_EX(major, minor, patch) + +#if NLOHMANN_JSON_NAMESPACE_NO_VERSION +#define NLOHMANN_JSON_NAMESPACE_VERSION +#else +#define NLOHMANN_JSON_NAMESPACE_VERSION \ + NLOHMANN_JSON_NAMESPACE_VERSION_CONCAT(NLOHMANN_JSON_VERSION_MAJOR, \ + NLOHMANN_JSON_VERSION_MINOR, \ + NLOHMANN_JSON_VERSION_PATCH) +#endif + +// Combine namespace components +#define NLOHMANN_JSON_NAMESPACE_CONCAT_EX(a, b) a ## b +#define NLOHMANN_JSON_NAMESPACE_CONCAT(a, b) \ + NLOHMANN_JSON_NAMESPACE_CONCAT_EX(a, b) + +#ifndef NLOHMANN_JSON_NAMESPACE +#define NLOHMANN_JSON_NAMESPACE \ + nlohmann::NLOHMANN_JSON_NAMESPACE_CONCAT( \ + NLOHMANN_JSON_ABI_TAGS, \ + NLOHMANN_JSON_NAMESPACE_VERSION) +#endif + +#ifndef NLOHMANN_JSON_NAMESPACE_BEGIN +#define NLOHMANN_JSON_NAMESPACE_BEGIN \ + namespace nlohmann \ + { \ + inline namespace NLOHMANN_JSON_NAMESPACE_CONCAT( \ + NLOHMANN_JSON_ABI_TAGS, \ + NLOHMANN_JSON_NAMESPACE_VERSION) \ + { +#endif + +#ifndef NLOHMANN_JSON_NAMESPACE_END +#define NLOHMANN_JSON_NAMESPACE_END \ + } /* namespace (inline namespace) NOLINT(readability/namespace) */ \ + } // namespace nlohmann +#endif + +// #include +// __ _____ _____ _____ +// __| | __| | | | JSON for Modern C++ +// | | |__ | | | | | | version 3.12.0 +// |_____|_____|_____|_|___| https://github.com/nlohmann/json +// +// SPDX-FileCopyrightText: 2013 - 2025 Niels Lohmann +// SPDX-License-Identifier: MIT + + + +#include // transform +#include // array +#include // forward_list +#include // inserter, front_inserter, end +#include // map +#ifdef JSON_HAS_CPP_17 + #include // optional +#endif +#include // string +#include // tuple, make_tuple +#include // is_arithmetic, is_same, is_enum, underlying_type, is_convertible +#include // unordered_map +#include // pair, declval +#include // valarray + +// #include +// __ _____ _____ _____ +// __| | __| | | | JSON for Modern C++ +// | | |__ | | | | | | version 3.12.0 +// |_____|_____|_____|_|___| https://github.com/nlohmann/json +// +// SPDX-FileCopyrightText: 2013 - 2025 Niels Lohmann +// SPDX-License-Identifier: MIT + + + +#include // nullptr_t +#include // exception +#if JSON_DIAGNOSTICS + #include // accumulate +#endif +#include // runtime_error +#include // to_string +#include // vector + +// #include +// __ _____ _____ _____ +// __| | __| | | | JSON for Modern C++ +// | | |__ | | | | | | version 3.12.0 +// |_____|_____|_____|_|___| https://github.com/nlohmann/json +// +// SPDX-FileCopyrightText: 2013 - 2025 Niels Lohmann +// SPDX-License-Identifier: MIT + + + +#include // array +#include // size_t +#include // uint8_t +#include // string + +// #include +// __ _____ _____ _____ +// __| | __| | | | JSON for Modern C++ +// | | |__ | | | | | | version 3.12.0 +// |_____|_____|_____|_|___| https://github.com/nlohmann/json +// +// SPDX-FileCopyrightText: 2013 - 2025 Niels Lohmann +// SPDX-License-Identifier: MIT + + + +#include // declval, pair +// #include +// __ _____ _____ _____ +// __| | __| | | | JSON for Modern C++ +// | | |__ | | | | | | version 3.12.0 +// |_____|_____|_____|_|___| https://github.com/nlohmann/json +// +// SPDX-FileCopyrightText: 2013 - 2025 Niels Lohmann +// SPDX-License-Identifier: MIT + + + +#include + +// #include +// __ _____ _____ _____ +// __| | __| | | | JSON for Modern C++ +// | | |__ | | | | | | version 3.12.0 +// |_____|_____|_____|_|___| https://github.com/nlohmann/json +// +// SPDX-FileCopyrightText: 2013 - 2025 Niels Lohmann +// SPDX-License-Identifier: MIT + + + +// #include + + +NLOHMANN_JSON_NAMESPACE_BEGIN +namespace detail +{ + +template struct make_void +{ + using type = void; +}; +template using void_t = typename make_void::type; + +} // namespace detail +NLOHMANN_JSON_NAMESPACE_END + + +NLOHMANN_JSON_NAMESPACE_BEGIN +namespace detail +{ + +// https://en.cppreference.com/w/cpp/experimental/is_detected +struct nonesuch +{ + nonesuch() = delete; + ~nonesuch() = delete; + nonesuch(nonesuch const&) = delete; + nonesuch(nonesuch const&&) = delete; + void operator=(nonesuch const&) = delete; + void operator=(nonesuch&&) = delete; +}; + +template class Op, + class... Args> +struct detector +{ + using value_t = std::false_type; + using type = Default; +}; + +template class Op, class... Args> +struct detector>, Op, Args...> +{ + using value_t = std::true_type; + using type = Op; +}; + +template class Op, class... Args> +using is_detected = typename detector::value_t; + +template class Op, class... Args> +struct is_detected_lazy : is_detected { }; + +template class Op, class... Args> +using detected_t = typename detector::type; + +template class Op, class... Args> +using detected_or = detector; + +template class Op, class... Args> +using detected_or_t = typename detected_or::type; + +template class Op, class... Args> +using is_detected_exact = std::is_same>; + +template class Op, class... Args> +using is_detected_convertible = + std::is_convertible, To>; + +} // namespace detail +NLOHMANN_JSON_NAMESPACE_END + +// #include + + +// __ _____ _____ _____ +// __| | __| | | | JSON for Modern C++ +// | | |__ | | | | | | version 3.12.0 +// |_____|_____|_____|_|___| https://github.com/nlohmann/json +// +// SPDX-FileCopyrightText: 2013 - 2025 Niels Lohmann +// SPDX-FileCopyrightText: 2016 - 2021 Evan Nemerson +// SPDX-License-Identifier: MIT + +/* Hedley - https://nemequ.github.io/hedley + * Created by Evan Nemerson + */ + +#if !defined(JSON_HEDLEY_VERSION) || (JSON_HEDLEY_VERSION < 15) +#if defined(JSON_HEDLEY_VERSION) + #undef JSON_HEDLEY_VERSION +#endif +#define JSON_HEDLEY_VERSION 15 + +#if defined(JSON_HEDLEY_STRINGIFY_EX) + #undef JSON_HEDLEY_STRINGIFY_EX +#endif +#define JSON_HEDLEY_STRINGIFY_EX(x) #x + +#if defined(JSON_HEDLEY_STRINGIFY) + #undef JSON_HEDLEY_STRINGIFY +#endif +#define JSON_HEDLEY_STRINGIFY(x) JSON_HEDLEY_STRINGIFY_EX(x) + +#if defined(JSON_HEDLEY_CONCAT_EX) + #undef JSON_HEDLEY_CONCAT_EX +#endif +#define JSON_HEDLEY_CONCAT_EX(a,b) a##b + +#if defined(JSON_HEDLEY_CONCAT) + #undef JSON_HEDLEY_CONCAT +#endif +#define JSON_HEDLEY_CONCAT(a,b) JSON_HEDLEY_CONCAT_EX(a,b) + +#if defined(JSON_HEDLEY_CONCAT3_EX) + #undef JSON_HEDLEY_CONCAT3_EX +#endif +#define JSON_HEDLEY_CONCAT3_EX(a,b,c) a##b##c + +#if defined(JSON_HEDLEY_CONCAT3) + #undef JSON_HEDLEY_CONCAT3 +#endif +#define JSON_HEDLEY_CONCAT3(a,b,c) JSON_HEDLEY_CONCAT3_EX(a,b,c) + +#if defined(JSON_HEDLEY_VERSION_ENCODE) + #undef JSON_HEDLEY_VERSION_ENCODE +#endif +#define JSON_HEDLEY_VERSION_ENCODE(major,minor,revision) (((major) * 1000000) + ((minor) * 1000) + (revision)) + +#if defined(JSON_HEDLEY_VERSION_DECODE_MAJOR) + #undef JSON_HEDLEY_VERSION_DECODE_MAJOR +#endif +#define JSON_HEDLEY_VERSION_DECODE_MAJOR(version) ((version) / 1000000) + +#if defined(JSON_HEDLEY_VERSION_DECODE_MINOR) + #undef JSON_HEDLEY_VERSION_DECODE_MINOR +#endif +#define JSON_HEDLEY_VERSION_DECODE_MINOR(version) (((version) % 1000000) / 1000) + +#if defined(JSON_HEDLEY_VERSION_DECODE_REVISION) + #undef JSON_HEDLEY_VERSION_DECODE_REVISION +#endif +#define JSON_HEDLEY_VERSION_DECODE_REVISION(version) ((version) % 1000) + +#if defined(JSON_HEDLEY_GNUC_VERSION) + #undef JSON_HEDLEY_GNUC_VERSION +#endif +#if defined(__GNUC__) && defined(__GNUC_PATCHLEVEL__) + #define JSON_HEDLEY_GNUC_VERSION JSON_HEDLEY_VERSION_ENCODE(__GNUC__, __GNUC_MINOR__, __GNUC_PATCHLEVEL__) +#elif defined(__GNUC__) + #define JSON_HEDLEY_GNUC_VERSION JSON_HEDLEY_VERSION_ENCODE(__GNUC__, __GNUC_MINOR__, 0) +#endif + +#if defined(JSON_HEDLEY_GNUC_VERSION_CHECK) + #undef JSON_HEDLEY_GNUC_VERSION_CHECK +#endif +#if defined(JSON_HEDLEY_GNUC_VERSION) + #define JSON_HEDLEY_GNUC_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_GNUC_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch)) +#else + #define JSON_HEDLEY_GNUC_VERSION_CHECK(major,minor,patch) (0) +#endif + +#if defined(JSON_HEDLEY_MSVC_VERSION) + #undef JSON_HEDLEY_MSVC_VERSION +#endif +#if defined(_MSC_FULL_VER) && (_MSC_FULL_VER >= 140000000) && !defined(__ICL) + #define JSON_HEDLEY_MSVC_VERSION JSON_HEDLEY_VERSION_ENCODE(_MSC_FULL_VER / 10000000, (_MSC_FULL_VER % 10000000) / 100000, (_MSC_FULL_VER % 100000) / 100) +#elif defined(_MSC_FULL_VER) && !defined(__ICL) + #define JSON_HEDLEY_MSVC_VERSION JSON_HEDLEY_VERSION_ENCODE(_MSC_FULL_VER / 1000000, (_MSC_FULL_VER % 1000000) / 10000, (_MSC_FULL_VER % 10000) / 10) +#elif defined(_MSC_VER) && !defined(__ICL) + #define JSON_HEDLEY_MSVC_VERSION JSON_HEDLEY_VERSION_ENCODE(_MSC_VER / 100, _MSC_VER % 100, 0) +#endif + +#if defined(JSON_HEDLEY_MSVC_VERSION_CHECK) + #undef JSON_HEDLEY_MSVC_VERSION_CHECK +#endif +#if !defined(JSON_HEDLEY_MSVC_VERSION) + #define JSON_HEDLEY_MSVC_VERSION_CHECK(major,minor,patch) (0) +#elif defined(_MSC_VER) && (_MSC_VER >= 1400) + #define JSON_HEDLEY_MSVC_VERSION_CHECK(major,minor,patch) (_MSC_FULL_VER >= ((major * 10000000) + (minor * 100000) + (patch))) +#elif defined(_MSC_VER) && (_MSC_VER >= 1200) + #define JSON_HEDLEY_MSVC_VERSION_CHECK(major,minor,patch) (_MSC_FULL_VER >= ((major * 1000000) + (minor * 10000) + (patch))) +#else + #define JSON_HEDLEY_MSVC_VERSION_CHECK(major,minor,patch) (_MSC_VER >= ((major * 100) + (minor))) +#endif + +#if defined(JSON_HEDLEY_INTEL_VERSION) + #undef JSON_HEDLEY_INTEL_VERSION +#endif +#if defined(__INTEL_COMPILER) && defined(__INTEL_COMPILER_UPDATE) && !defined(__ICL) + #define JSON_HEDLEY_INTEL_VERSION JSON_HEDLEY_VERSION_ENCODE(__INTEL_COMPILER / 100, __INTEL_COMPILER % 100, __INTEL_COMPILER_UPDATE) +#elif defined(__INTEL_COMPILER) && !defined(__ICL) + #define JSON_HEDLEY_INTEL_VERSION JSON_HEDLEY_VERSION_ENCODE(__INTEL_COMPILER / 100, __INTEL_COMPILER % 100, 0) +#endif + +#if defined(JSON_HEDLEY_INTEL_VERSION_CHECK) + #undef JSON_HEDLEY_INTEL_VERSION_CHECK +#endif +#if defined(JSON_HEDLEY_INTEL_VERSION) + #define JSON_HEDLEY_INTEL_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_INTEL_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch)) +#else + #define JSON_HEDLEY_INTEL_VERSION_CHECK(major,minor,patch) (0) +#endif + +#if defined(JSON_HEDLEY_INTEL_CL_VERSION) + #undef JSON_HEDLEY_INTEL_CL_VERSION +#endif +#if defined(__INTEL_COMPILER) && defined(__INTEL_COMPILER_UPDATE) && defined(__ICL) + #define JSON_HEDLEY_INTEL_CL_VERSION JSON_HEDLEY_VERSION_ENCODE(__INTEL_COMPILER, __INTEL_COMPILER_UPDATE, 0) +#endif + +#if defined(JSON_HEDLEY_INTEL_CL_VERSION_CHECK) + #undef JSON_HEDLEY_INTEL_CL_VERSION_CHECK +#endif +#if defined(JSON_HEDLEY_INTEL_CL_VERSION) + #define JSON_HEDLEY_INTEL_CL_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_INTEL_CL_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch)) +#else + #define JSON_HEDLEY_INTEL_CL_VERSION_CHECK(major,minor,patch) (0) +#endif + +#if defined(JSON_HEDLEY_PGI_VERSION) + #undef JSON_HEDLEY_PGI_VERSION +#endif +#if defined(__PGI) && defined(__PGIC__) && defined(__PGIC_MINOR__) && defined(__PGIC_PATCHLEVEL__) + #define JSON_HEDLEY_PGI_VERSION JSON_HEDLEY_VERSION_ENCODE(__PGIC__, __PGIC_MINOR__, __PGIC_PATCHLEVEL__) +#endif + +#if defined(JSON_HEDLEY_PGI_VERSION_CHECK) + #undef JSON_HEDLEY_PGI_VERSION_CHECK +#endif +#if defined(JSON_HEDLEY_PGI_VERSION) + #define JSON_HEDLEY_PGI_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_PGI_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch)) +#else + #define JSON_HEDLEY_PGI_VERSION_CHECK(major,minor,patch) (0) +#endif + +#if defined(JSON_HEDLEY_SUNPRO_VERSION) + #undef JSON_HEDLEY_SUNPRO_VERSION +#endif +#if defined(__SUNPRO_C) && (__SUNPRO_C > 0x1000) + #define JSON_HEDLEY_SUNPRO_VERSION JSON_HEDLEY_VERSION_ENCODE((((__SUNPRO_C >> 16) & 0xf) * 10) + ((__SUNPRO_C >> 12) & 0xf), (((__SUNPRO_C >> 8) & 0xf) * 10) + ((__SUNPRO_C >> 4) & 0xf), (__SUNPRO_C & 0xf) * 10) +#elif defined(__SUNPRO_C) + #define JSON_HEDLEY_SUNPRO_VERSION JSON_HEDLEY_VERSION_ENCODE((__SUNPRO_C >> 8) & 0xf, (__SUNPRO_C >> 4) & 0xf, (__SUNPRO_C) & 0xf) +#elif defined(__SUNPRO_CC) && (__SUNPRO_CC > 0x1000) + #define JSON_HEDLEY_SUNPRO_VERSION JSON_HEDLEY_VERSION_ENCODE((((__SUNPRO_CC >> 16) & 0xf) * 10) + ((__SUNPRO_CC >> 12) & 0xf), (((__SUNPRO_CC >> 8) & 0xf) * 10) + ((__SUNPRO_CC >> 4) & 0xf), (__SUNPRO_CC & 0xf) * 10) +#elif defined(__SUNPRO_CC) + #define JSON_HEDLEY_SUNPRO_VERSION JSON_HEDLEY_VERSION_ENCODE((__SUNPRO_CC >> 8) & 0xf, (__SUNPRO_CC >> 4) & 0xf, (__SUNPRO_CC) & 0xf) +#endif + +#if defined(JSON_HEDLEY_SUNPRO_VERSION_CHECK) + #undef JSON_HEDLEY_SUNPRO_VERSION_CHECK +#endif +#if defined(JSON_HEDLEY_SUNPRO_VERSION) + #define JSON_HEDLEY_SUNPRO_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_SUNPRO_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch)) +#else + #define JSON_HEDLEY_SUNPRO_VERSION_CHECK(major,minor,patch) (0) +#endif + +#if defined(JSON_HEDLEY_EMSCRIPTEN_VERSION) + #undef JSON_HEDLEY_EMSCRIPTEN_VERSION +#endif +#if defined(__EMSCRIPTEN__) + #define JSON_HEDLEY_EMSCRIPTEN_VERSION JSON_HEDLEY_VERSION_ENCODE(__EMSCRIPTEN_major__, __EMSCRIPTEN_minor__, __EMSCRIPTEN_tiny__) +#endif + +#if defined(JSON_HEDLEY_EMSCRIPTEN_VERSION_CHECK) + #undef JSON_HEDLEY_EMSCRIPTEN_VERSION_CHECK +#endif +#if defined(JSON_HEDLEY_EMSCRIPTEN_VERSION) + #define JSON_HEDLEY_EMSCRIPTEN_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_EMSCRIPTEN_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch)) +#else + #define JSON_HEDLEY_EMSCRIPTEN_VERSION_CHECK(major,minor,patch) (0) +#endif + +#if defined(JSON_HEDLEY_ARM_VERSION) + #undef JSON_HEDLEY_ARM_VERSION +#endif +#if defined(__CC_ARM) && defined(__ARMCOMPILER_VERSION) + #define JSON_HEDLEY_ARM_VERSION JSON_HEDLEY_VERSION_ENCODE(__ARMCOMPILER_VERSION / 1000000, (__ARMCOMPILER_VERSION % 1000000) / 10000, (__ARMCOMPILER_VERSION % 10000) / 100) +#elif defined(__CC_ARM) && defined(__ARMCC_VERSION) + #define JSON_HEDLEY_ARM_VERSION JSON_HEDLEY_VERSION_ENCODE(__ARMCC_VERSION / 1000000, (__ARMCC_VERSION % 1000000) / 10000, (__ARMCC_VERSION % 10000) / 100) +#endif + +#if defined(JSON_HEDLEY_ARM_VERSION_CHECK) + #undef JSON_HEDLEY_ARM_VERSION_CHECK +#endif +#if defined(JSON_HEDLEY_ARM_VERSION) + #define JSON_HEDLEY_ARM_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_ARM_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch)) +#else + #define JSON_HEDLEY_ARM_VERSION_CHECK(major,minor,patch) (0) +#endif + +#if defined(JSON_HEDLEY_IBM_VERSION) + #undef JSON_HEDLEY_IBM_VERSION +#endif +#if defined(__ibmxl__) + #define JSON_HEDLEY_IBM_VERSION JSON_HEDLEY_VERSION_ENCODE(__ibmxl_version__, __ibmxl_release__, __ibmxl_modification__) +#elif defined(__xlC__) && defined(__xlC_ver__) + #define JSON_HEDLEY_IBM_VERSION JSON_HEDLEY_VERSION_ENCODE(__xlC__ >> 8, __xlC__ & 0xff, (__xlC_ver__ >> 8) & 0xff) +#elif defined(__xlC__) + #define JSON_HEDLEY_IBM_VERSION JSON_HEDLEY_VERSION_ENCODE(__xlC__ >> 8, __xlC__ & 0xff, 0) +#endif + +#if defined(JSON_HEDLEY_IBM_VERSION_CHECK) + #undef JSON_HEDLEY_IBM_VERSION_CHECK +#endif +#if defined(JSON_HEDLEY_IBM_VERSION) + #define JSON_HEDLEY_IBM_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_IBM_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch)) +#else + #define JSON_HEDLEY_IBM_VERSION_CHECK(major,minor,patch) (0) +#endif + +#if defined(JSON_HEDLEY_TI_VERSION) + #undef JSON_HEDLEY_TI_VERSION +#endif +#if \ + defined(__TI_COMPILER_VERSION__) && \ + ( \ + defined(__TMS470__) || defined(__TI_ARM__) || \ + defined(__MSP430__) || \ + defined(__TMS320C2000__) \ + ) +#if (__TI_COMPILER_VERSION__ >= 16000000) + #define JSON_HEDLEY_TI_VERSION JSON_HEDLEY_VERSION_ENCODE(__TI_COMPILER_VERSION__ / 1000000, (__TI_COMPILER_VERSION__ % 1000000) / 1000, (__TI_COMPILER_VERSION__ % 1000)) +#endif +#endif + +#if defined(JSON_HEDLEY_TI_VERSION_CHECK) + #undef JSON_HEDLEY_TI_VERSION_CHECK +#endif +#if defined(JSON_HEDLEY_TI_VERSION) + #define JSON_HEDLEY_TI_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_TI_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch)) +#else + #define JSON_HEDLEY_TI_VERSION_CHECK(major,minor,patch) (0) +#endif + +#if defined(JSON_HEDLEY_TI_CL2000_VERSION) + #undef JSON_HEDLEY_TI_CL2000_VERSION +#endif +#if defined(__TI_COMPILER_VERSION__) && defined(__TMS320C2000__) + #define JSON_HEDLEY_TI_CL2000_VERSION JSON_HEDLEY_VERSION_ENCODE(__TI_COMPILER_VERSION__ / 1000000, (__TI_COMPILER_VERSION__ % 1000000) / 1000, (__TI_COMPILER_VERSION__ % 1000)) +#endif + +#if defined(JSON_HEDLEY_TI_CL2000_VERSION_CHECK) + #undef JSON_HEDLEY_TI_CL2000_VERSION_CHECK +#endif +#if defined(JSON_HEDLEY_TI_CL2000_VERSION) + #define JSON_HEDLEY_TI_CL2000_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_TI_CL2000_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch)) +#else + #define JSON_HEDLEY_TI_CL2000_VERSION_CHECK(major,minor,patch) (0) +#endif + +#if defined(JSON_HEDLEY_TI_CL430_VERSION) + #undef JSON_HEDLEY_TI_CL430_VERSION +#endif +#if defined(__TI_COMPILER_VERSION__) && defined(__MSP430__) + #define JSON_HEDLEY_TI_CL430_VERSION JSON_HEDLEY_VERSION_ENCODE(__TI_COMPILER_VERSION__ / 1000000, (__TI_COMPILER_VERSION__ % 1000000) / 1000, (__TI_COMPILER_VERSION__ % 1000)) +#endif + +#if defined(JSON_HEDLEY_TI_CL430_VERSION_CHECK) + #undef JSON_HEDLEY_TI_CL430_VERSION_CHECK +#endif +#if defined(JSON_HEDLEY_TI_CL430_VERSION) + #define JSON_HEDLEY_TI_CL430_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_TI_CL430_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch)) +#else + #define JSON_HEDLEY_TI_CL430_VERSION_CHECK(major,minor,patch) (0) +#endif + +#if defined(JSON_HEDLEY_TI_ARMCL_VERSION) + #undef JSON_HEDLEY_TI_ARMCL_VERSION +#endif +#if defined(__TI_COMPILER_VERSION__) && (defined(__TMS470__) || defined(__TI_ARM__)) + #define JSON_HEDLEY_TI_ARMCL_VERSION JSON_HEDLEY_VERSION_ENCODE(__TI_COMPILER_VERSION__ / 1000000, (__TI_COMPILER_VERSION__ % 1000000) / 1000, (__TI_COMPILER_VERSION__ % 1000)) +#endif + +#if defined(JSON_HEDLEY_TI_ARMCL_VERSION_CHECK) + #undef JSON_HEDLEY_TI_ARMCL_VERSION_CHECK +#endif +#if defined(JSON_HEDLEY_TI_ARMCL_VERSION) + #define JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_TI_ARMCL_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch)) +#else + #define JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(major,minor,patch) (0) +#endif + +#if defined(JSON_HEDLEY_TI_CL6X_VERSION) + #undef JSON_HEDLEY_TI_CL6X_VERSION +#endif +#if defined(__TI_COMPILER_VERSION__) && defined(__TMS320C6X__) + #define JSON_HEDLEY_TI_CL6X_VERSION JSON_HEDLEY_VERSION_ENCODE(__TI_COMPILER_VERSION__ / 1000000, (__TI_COMPILER_VERSION__ % 1000000) / 1000, (__TI_COMPILER_VERSION__ % 1000)) +#endif + +#if defined(JSON_HEDLEY_TI_CL6X_VERSION_CHECK) + #undef JSON_HEDLEY_TI_CL6X_VERSION_CHECK +#endif +#if defined(JSON_HEDLEY_TI_CL6X_VERSION) + #define JSON_HEDLEY_TI_CL6X_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_TI_CL6X_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch)) +#else + #define JSON_HEDLEY_TI_CL6X_VERSION_CHECK(major,minor,patch) (0) +#endif + +#if defined(JSON_HEDLEY_TI_CL7X_VERSION) + #undef JSON_HEDLEY_TI_CL7X_VERSION +#endif +#if defined(__TI_COMPILER_VERSION__) && defined(__C7000__) + #define JSON_HEDLEY_TI_CL7X_VERSION JSON_HEDLEY_VERSION_ENCODE(__TI_COMPILER_VERSION__ / 1000000, (__TI_COMPILER_VERSION__ % 1000000) / 1000, (__TI_COMPILER_VERSION__ % 1000)) +#endif + +#if defined(JSON_HEDLEY_TI_CL7X_VERSION_CHECK) + #undef JSON_HEDLEY_TI_CL7X_VERSION_CHECK +#endif +#if defined(JSON_HEDLEY_TI_CL7X_VERSION) + #define JSON_HEDLEY_TI_CL7X_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_TI_CL7X_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch)) +#else + #define JSON_HEDLEY_TI_CL7X_VERSION_CHECK(major,minor,patch) (0) +#endif + +#if defined(JSON_HEDLEY_TI_CLPRU_VERSION) + #undef JSON_HEDLEY_TI_CLPRU_VERSION +#endif +#if defined(__TI_COMPILER_VERSION__) && defined(__PRU__) + #define JSON_HEDLEY_TI_CLPRU_VERSION JSON_HEDLEY_VERSION_ENCODE(__TI_COMPILER_VERSION__ / 1000000, (__TI_COMPILER_VERSION__ % 1000000) / 1000, (__TI_COMPILER_VERSION__ % 1000)) +#endif + +#if defined(JSON_HEDLEY_TI_CLPRU_VERSION_CHECK) + #undef JSON_HEDLEY_TI_CLPRU_VERSION_CHECK +#endif +#if defined(JSON_HEDLEY_TI_CLPRU_VERSION) + #define JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_TI_CLPRU_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch)) +#else + #define JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(major,minor,patch) (0) +#endif + +#if defined(JSON_HEDLEY_CRAY_VERSION) + #undef JSON_HEDLEY_CRAY_VERSION +#endif +#if defined(_CRAYC) + #if defined(_RELEASE_PATCHLEVEL) + #define JSON_HEDLEY_CRAY_VERSION JSON_HEDLEY_VERSION_ENCODE(_RELEASE_MAJOR, _RELEASE_MINOR, _RELEASE_PATCHLEVEL) + #else + #define JSON_HEDLEY_CRAY_VERSION JSON_HEDLEY_VERSION_ENCODE(_RELEASE_MAJOR, _RELEASE_MINOR, 0) + #endif +#endif + +#if defined(JSON_HEDLEY_CRAY_VERSION_CHECK) + #undef JSON_HEDLEY_CRAY_VERSION_CHECK +#endif +#if defined(JSON_HEDLEY_CRAY_VERSION) + #define JSON_HEDLEY_CRAY_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_CRAY_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch)) +#else + #define JSON_HEDLEY_CRAY_VERSION_CHECK(major,minor,patch) (0) +#endif + +#if defined(JSON_HEDLEY_IAR_VERSION) + #undef JSON_HEDLEY_IAR_VERSION +#endif +#if defined(__IAR_SYSTEMS_ICC__) + #if __VER__ > 1000 + #define JSON_HEDLEY_IAR_VERSION JSON_HEDLEY_VERSION_ENCODE((__VER__ / 1000000), ((__VER__ / 1000) % 1000), (__VER__ % 1000)) + #else + #define JSON_HEDLEY_IAR_VERSION JSON_HEDLEY_VERSION_ENCODE(__VER__ / 100, __VER__ % 100, 0) + #endif +#endif + +#if defined(JSON_HEDLEY_IAR_VERSION_CHECK) + #undef JSON_HEDLEY_IAR_VERSION_CHECK +#endif +#if defined(JSON_HEDLEY_IAR_VERSION) + #define JSON_HEDLEY_IAR_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_IAR_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch)) +#else + #define JSON_HEDLEY_IAR_VERSION_CHECK(major,minor,patch) (0) +#endif + +#if defined(JSON_HEDLEY_TINYC_VERSION) + #undef JSON_HEDLEY_TINYC_VERSION +#endif +#if defined(__TINYC__) + #define JSON_HEDLEY_TINYC_VERSION JSON_HEDLEY_VERSION_ENCODE(__TINYC__ / 1000, (__TINYC__ / 100) % 10, __TINYC__ % 100) +#endif + +#if defined(JSON_HEDLEY_TINYC_VERSION_CHECK) + #undef JSON_HEDLEY_TINYC_VERSION_CHECK +#endif +#if defined(JSON_HEDLEY_TINYC_VERSION) + #define JSON_HEDLEY_TINYC_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_TINYC_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch)) +#else + #define JSON_HEDLEY_TINYC_VERSION_CHECK(major,minor,patch) (0) +#endif + +#if defined(JSON_HEDLEY_DMC_VERSION) + #undef JSON_HEDLEY_DMC_VERSION +#endif +#if defined(__DMC__) + #define JSON_HEDLEY_DMC_VERSION JSON_HEDLEY_VERSION_ENCODE(__DMC__ >> 8, (__DMC__ >> 4) & 0xf, __DMC__ & 0xf) +#endif + +#if defined(JSON_HEDLEY_DMC_VERSION_CHECK) + #undef JSON_HEDLEY_DMC_VERSION_CHECK +#endif +#if defined(JSON_HEDLEY_DMC_VERSION) + #define JSON_HEDLEY_DMC_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_DMC_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch)) +#else + #define JSON_HEDLEY_DMC_VERSION_CHECK(major,minor,patch) (0) +#endif + +#if defined(JSON_HEDLEY_COMPCERT_VERSION) + #undef JSON_HEDLEY_COMPCERT_VERSION +#endif +#if defined(__COMPCERT_VERSION__) + #define JSON_HEDLEY_COMPCERT_VERSION JSON_HEDLEY_VERSION_ENCODE(__COMPCERT_VERSION__ / 10000, (__COMPCERT_VERSION__ / 100) % 100, __COMPCERT_VERSION__ % 100) +#endif + +#if defined(JSON_HEDLEY_COMPCERT_VERSION_CHECK) + #undef JSON_HEDLEY_COMPCERT_VERSION_CHECK +#endif +#if defined(JSON_HEDLEY_COMPCERT_VERSION) + #define JSON_HEDLEY_COMPCERT_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_COMPCERT_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch)) +#else + #define JSON_HEDLEY_COMPCERT_VERSION_CHECK(major,minor,patch) (0) +#endif + +#if defined(JSON_HEDLEY_PELLES_VERSION) + #undef JSON_HEDLEY_PELLES_VERSION +#endif +#if defined(__POCC__) + #define JSON_HEDLEY_PELLES_VERSION JSON_HEDLEY_VERSION_ENCODE(__POCC__ / 100, __POCC__ % 100, 0) +#endif + +#if defined(JSON_HEDLEY_PELLES_VERSION_CHECK) + #undef JSON_HEDLEY_PELLES_VERSION_CHECK +#endif +#if defined(JSON_HEDLEY_PELLES_VERSION) + #define JSON_HEDLEY_PELLES_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_PELLES_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch)) +#else + #define JSON_HEDLEY_PELLES_VERSION_CHECK(major,minor,patch) (0) +#endif + +#if defined(JSON_HEDLEY_MCST_LCC_VERSION) + #undef JSON_HEDLEY_MCST_LCC_VERSION +#endif +#if defined(__LCC__) && defined(__LCC_MINOR__) + #define JSON_HEDLEY_MCST_LCC_VERSION JSON_HEDLEY_VERSION_ENCODE(__LCC__ / 100, __LCC__ % 100, __LCC_MINOR__) +#endif + +#if defined(JSON_HEDLEY_MCST_LCC_VERSION_CHECK) + #undef JSON_HEDLEY_MCST_LCC_VERSION_CHECK +#endif +#if defined(JSON_HEDLEY_MCST_LCC_VERSION) + #define JSON_HEDLEY_MCST_LCC_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_MCST_LCC_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch)) +#else + #define JSON_HEDLEY_MCST_LCC_VERSION_CHECK(major,minor,patch) (0) +#endif + +#if defined(JSON_HEDLEY_GCC_VERSION) + #undef JSON_HEDLEY_GCC_VERSION +#endif +#if \ + defined(JSON_HEDLEY_GNUC_VERSION) && \ + !defined(__clang__) && \ + !defined(JSON_HEDLEY_INTEL_VERSION) && \ + !defined(JSON_HEDLEY_PGI_VERSION) && \ + !defined(JSON_HEDLEY_ARM_VERSION) && \ + !defined(JSON_HEDLEY_CRAY_VERSION) && \ + !defined(JSON_HEDLEY_TI_VERSION) && \ + !defined(JSON_HEDLEY_TI_ARMCL_VERSION) && \ + !defined(JSON_HEDLEY_TI_CL430_VERSION) && \ + !defined(JSON_HEDLEY_TI_CL2000_VERSION) && \ + !defined(JSON_HEDLEY_TI_CL6X_VERSION) && \ + !defined(JSON_HEDLEY_TI_CL7X_VERSION) && \ + !defined(JSON_HEDLEY_TI_CLPRU_VERSION) && \ + !defined(__COMPCERT__) && \ + !defined(JSON_HEDLEY_MCST_LCC_VERSION) + #define JSON_HEDLEY_GCC_VERSION JSON_HEDLEY_GNUC_VERSION +#endif + +#if defined(JSON_HEDLEY_GCC_VERSION_CHECK) + #undef JSON_HEDLEY_GCC_VERSION_CHECK +#endif +#if defined(JSON_HEDLEY_GCC_VERSION) + #define JSON_HEDLEY_GCC_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_GCC_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch)) +#else + #define JSON_HEDLEY_GCC_VERSION_CHECK(major,minor,patch) (0) +#endif + +#if defined(JSON_HEDLEY_HAS_ATTRIBUTE) + #undef JSON_HEDLEY_HAS_ATTRIBUTE +#endif +#if \ + defined(__has_attribute) && \ + ( \ + (!defined(JSON_HEDLEY_IAR_VERSION) || JSON_HEDLEY_IAR_VERSION_CHECK(8,5,9)) \ + ) +# define JSON_HEDLEY_HAS_ATTRIBUTE(attribute) __has_attribute(attribute) +#else +# define JSON_HEDLEY_HAS_ATTRIBUTE(attribute) (0) +#endif + +#if defined(JSON_HEDLEY_GNUC_HAS_ATTRIBUTE) + #undef JSON_HEDLEY_GNUC_HAS_ATTRIBUTE +#endif +#if defined(__has_attribute) + #define JSON_HEDLEY_GNUC_HAS_ATTRIBUTE(attribute,major,minor,patch) JSON_HEDLEY_HAS_ATTRIBUTE(attribute) +#else + #define JSON_HEDLEY_GNUC_HAS_ATTRIBUTE(attribute,major,minor,patch) JSON_HEDLEY_GNUC_VERSION_CHECK(major,minor,patch) +#endif + +#if defined(JSON_HEDLEY_GCC_HAS_ATTRIBUTE) + #undef JSON_HEDLEY_GCC_HAS_ATTRIBUTE +#endif +#if defined(__has_attribute) + #define JSON_HEDLEY_GCC_HAS_ATTRIBUTE(attribute,major,minor,patch) JSON_HEDLEY_HAS_ATTRIBUTE(attribute) +#else + #define JSON_HEDLEY_GCC_HAS_ATTRIBUTE(attribute,major,minor,patch) JSON_HEDLEY_GCC_VERSION_CHECK(major,minor,patch) +#endif + +#if defined(JSON_HEDLEY_HAS_CPP_ATTRIBUTE) + #undef JSON_HEDLEY_HAS_CPP_ATTRIBUTE +#endif +#if \ + defined(__has_cpp_attribute) && \ + defined(__cplusplus) && \ + (!defined(JSON_HEDLEY_SUNPRO_VERSION) || JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,15,0)) + #define JSON_HEDLEY_HAS_CPP_ATTRIBUTE(attribute) __has_cpp_attribute(attribute) +#else + #define JSON_HEDLEY_HAS_CPP_ATTRIBUTE(attribute) (0) +#endif + +#if defined(JSON_HEDLEY_HAS_CPP_ATTRIBUTE_NS) + #undef JSON_HEDLEY_HAS_CPP_ATTRIBUTE_NS +#endif +#if !defined(__cplusplus) || !defined(__has_cpp_attribute) + #define JSON_HEDLEY_HAS_CPP_ATTRIBUTE_NS(ns,attribute) (0) +#elif \ + !defined(JSON_HEDLEY_PGI_VERSION) && \ + !defined(JSON_HEDLEY_IAR_VERSION) && \ + (!defined(JSON_HEDLEY_SUNPRO_VERSION) || JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,15,0)) && \ + (!defined(JSON_HEDLEY_MSVC_VERSION) || JSON_HEDLEY_MSVC_VERSION_CHECK(19,20,0)) + #define JSON_HEDLEY_HAS_CPP_ATTRIBUTE_NS(ns,attribute) JSON_HEDLEY_HAS_CPP_ATTRIBUTE(ns::attribute) +#else + #define JSON_HEDLEY_HAS_CPP_ATTRIBUTE_NS(ns,attribute) (0) +#endif + +#if defined(JSON_HEDLEY_GNUC_HAS_CPP_ATTRIBUTE) + #undef JSON_HEDLEY_GNUC_HAS_CPP_ATTRIBUTE +#endif +#if defined(__has_cpp_attribute) && defined(__cplusplus) + #define JSON_HEDLEY_GNUC_HAS_CPP_ATTRIBUTE(attribute,major,minor,patch) __has_cpp_attribute(attribute) +#else + #define JSON_HEDLEY_GNUC_HAS_CPP_ATTRIBUTE(attribute,major,minor,patch) JSON_HEDLEY_GNUC_VERSION_CHECK(major,minor,patch) +#endif + +#if defined(JSON_HEDLEY_GCC_HAS_CPP_ATTRIBUTE) + #undef JSON_HEDLEY_GCC_HAS_CPP_ATTRIBUTE +#endif +#if defined(__has_cpp_attribute) && defined(__cplusplus) + #define JSON_HEDLEY_GCC_HAS_CPP_ATTRIBUTE(attribute,major,minor,patch) __has_cpp_attribute(attribute) +#else + #define JSON_HEDLEY_GCC_HAS_CPP_ATTRIBUTE(attribute,major,minor,patch) JSON_HEDLEY_GCC_VERSION_CHECK(major,minor,patch) +#endif + +#if defined(JSON_HEDLEY_HAS_BUILTIN) + #undef JSON_HEDLEY_HAS_BUILTIN +#endif +#if defined(__has_builtin) + #define JSON_HEDLEY_HAS_BUILTIN(builtin) __has_builtin(builtin) +#else + #define JSON_HEDLEY_HAS_BUILTIN(builtin) (0) +#endif + +#if defined(JSON_HEDLEY_GNUC_HAS_BUILTIN) + #undef JSON_HEDLEY_GNUC_HAS_BUILTIN +#endif +#if defined(__has_builtin) + #define JSON_HEDLEY_GNUC_HAS_BUILTIN(builtin,major,minor,patch) __has_builtin(builtin) +#else + #define JSON_HEDLEY_GNUC_HAS_BUILTIN(builtin,major,minor,patch) JSON_HEDLEY_GNUC_VERSION_CHECK(major,minor,patch) +#endif + +#if defined(JSON_HEDLEY_GCC_HAS_BUILTIN) + #undef JSON_HEDLEY_GCC_HAS_BUILTIN +#endif +#if defined(__has_builtin) + #define JSON_HEDLEY_GCC_HAS_BUILTIN(builtin,major,minor,patch) __has_builtin(builtin) +#else + #define JSON_HEDLEY_GCC_HAS_BUILTIN(builtin,major,minor,patch) JSON_HEDLEY_GCC_VERSION_CHECK(major,minor,patch) +#endif + +#if defined(JSON_HEDLEY_HAS_FEATURE) + #undef JSON_HEDLEY_HAS_FEATURE +#endif +#if defined(__has_feature) + #define JSON_HEDLEY_HAS_FEATURE(feature) __has_feature(feature) +#else + #define JSON_HEDLEY_HAS_FEATURE(feature) (0) +#endif + +#if defined(JSON_HEDLEY_GNUC_HAS_FEATURE) + #undef JSON_HEDLEY_GNUC_HAS_FEATURE +#endif +#if defined(__has_feature) + #define JSON_HEDLEY_GNUC_HAS_FEATURE(feature,major,minor,patch) __has_feature(feature) +#else + #define JSON_HEDLEY_GNUC_HAS_FEATURE(feature,major,minor,patch) JSON_HEDLEY_GNUC_VERSION_CHECK(major,minor,patch) +#endif + +#if defined(JSON_HEDLEY_GCC_HAS_FEATURE) + #undef JSON_HEDLEY_GCC_HAS_FEATURE +#endif +#if defined(__has_feature) + #define JSON_HEDLEY_GCC_HAS_FEATURE(feature,major,minor,patch) __has_feature(feature) +#else + #define JSON_HEDLEY_GCC_HAS_FEATURE(feature,major,minor,patch) JSON_HEDLEY_GCC_VERSION_CHECK(major,minor,patch) +#endif + +#if defined(JSON_HEDLEY_HAS_EXTENSION) + #undef JSON_HEDLEY_HAS_EXTENSION +#endif +#if defined(__has_extension) + #define JSON_HEDLEY_HAS_EXTENSION(extension) __has_extension(extension) +#else + #define JSON_HEDLEY_HAS_EXTENSION(extension) (0) +#endif + +#if defined(JSON_HEDLEY_GNUC_HAS_EXTENSION) + #undef JSON_HEDLEY_GNUC_HAS_EXTENSION +#endif +#if defined(__has_extension) + #define JSON_HEDLEY_GNUC_HAS_EXTENSION(extension,major,minor,patch) __has_extension(extension) +#else + #define JSON_HEDLEY_GNUC_HAS_EXTENSION(extension,major,minor,patch) JSON_HEDLEY_GNUC_VERSION_CHECK(major,minor,patch) +#endif + +#if defined(JSON_HEDLEY_GCC_HAS_EXTENSION) + #undef JSON_HEDLEY_GCC_HAS_EXTENSION +#endif +#if defined(__has_extension) + #define JSON_HEDLEY_GCC_HAS_EXTENSION(extension,major,minor,patch) __has_extension(extension) +#else + #define JSON_HEDLEY_GCC_HAS_EXTENSION(extension,major,minor,patch) JSON_HEDLEY_GCC_VERSION_CHECK(major,minor,patch) +#endif + +#if defined(JSON_HEDLEY_HAS_DECLSPEC_ATTRIBUTE) + #undef JSON_HEDLEY_HAS_DECLSPEC_ATTRIBUTE +#endif +#if defined(__has_declspec_attribute) + #define JSON_HEDLEY_HAS_DECLSPEC_ATTRIBUTE(attribute) __has_declspec_attribute(attribute) +#else + #define JSON_HEDLEY_HAS_DECLSPEC_ATTRIBUTE(attribute) (0) +#endif + +#if defined(JSON_HEDLEY_GNUC_HAS_DECLSPEC_ATTRIBUTE) + #undef JSON_HEDLEY_GNUC_HAS_DECLSPEC_ATTRIBUTE +#endif +#if defined(__has_declspec_attribute) + #define JSON_HEDLEY_GNUC_HAS_DECLSPEC_ATTRIBUTE(attribute,major,minor,patch) __has_declspec_attribute(attribute) +#else + #define JSON_HEDLEY_GNUC_HAS_DECLSPEC_ATTRIBUTE(attribute,major,minor,patch) JSON_HEDLEY_GNUC_VERSION_CHECK(major,minor,patch) +#endif + +#if defined(JSON_HEDLEY_GCC_HAS_DECLSPEC_ATTRIBUTE) + #undef JSON_HEDLEY_GCC_HAS_DECLSPEC_ATTRIBUTE +#endif +#if defined(__has_declspec_attribute) + #define JSON_HEDLEY_GCC_HAS_DECLSPEC_ATTRIBUTE(attribute,major,minor,patch) __has_declspec_attribute(attribute) +#else + #define JSON_HEDLEY_GCC_HAS_DECLSPEC_ATTRIBUTE(attribute,major,minor,patch) JSON_HEDLEY_GCC_VERSION_CHECK(major,minor,patch) +#endif + +#if defined(JSON_HEDLEY_HAS_WARNING) + #undef JSON_HEDLEY_HAS_WARNING +#endif +#if defined(__has_warning) + #define JSON_HEDLEY_HAS_WARNING(warning) __has_warning(warning) +#else + #define JSON_HEDLEY_HAS_WARNING(warning) (0) +#endif + +#if defined(JSON_HEDLEY_GNUC_HAS_WARNING) + #undef JSON_HEDLEY_GNUC_HAS_WARNING +#endif +#if defined(__has_warning) + #define JSON_HEDLEY_GNUC_HAS_WARNING(warning,major,minor,patch) __has_warning(warning) +#else + #define JSON_HEDLEY_GNUC_HAS_WARNING(warning,major,minor,patch) JSON_HEDLEY_GNUC_VERSION_CHECK(major,minor,patch) +#endif + +#if defined(JSON_HEDLEY_GCC_HAS_WARNING) + #undef JSON_HEDLEY_GCC_HAS_WARNING +#endif +#if defined(__has_warning) + #define JSON_HEDLEY_GCC_HAS_WARNING(warning,major,minor,patch) __has_warning(warning) +#else + #define JSON_HEDLEY_GCC_HAS_WARNING(warning,major,minor,patch) JSON_HEDLEY_GCC_VERSION_CHECK(major,minor,patch) +#endif + +#if \ + (defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L)) || \ + defined(__clang__) || \ + JSON_HEDLEY_GCC_VERSION_CHECK(3,0,0) || \ + JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \ + JSON_HEDLEY_IAR_VERSION_CHECK(8,0,0) || \ + JSON_HEDLEY_PGI_VERSION_CHECK(18,4,0) || \ + JSON_HEDLEY_ARM_VERSION_CHECK(4,1,0) || \ + JSON_HEDLEY_TI_VERSION_CHECK(15,12,0) || \ + JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(4,7,0) || \ + JSON_HEDLEY_TI_CL430_VERSION_CHECK(2,0,1) || \ + JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,1,0) || \ + JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,0,0) || \ + JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \ + JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,1,0) || \ + JSON_HEDLEY_CRAY_VERSION_CHECK(5,0,0) || \ + JSON_HEDLEY_TINYC_VERSION_CHECK(0,9,17) || \ + JSON_HEDLEY_SUNPRO_VERSION_CHECK(8,0,0) || \ + (JSON_HEDLEY_IBM_VERSION_CHECK(10,1,0) && defined(__C99_PRAGMA_OPERATOR)) + #define JSON_HEDLEY_PRAGMA(value) _Pragma(#value) +#elif JSON_HEDLEY_MSVC_VERSION_CHECK(15,0,0) + #define JSON_HEDLEY_PRAGMA(value) __pragma(value) +#else + #define JSON_HEDLEY_PRAGMA(value) +#endif + +#if defined(JSON_HEDLEY_DIAGNOSTIC_PUSH) + #undef JSON_HEDLEY_DIAGNOSTIC_PUSH +#endif +#if defined(JSON_HEDLEY_DIAGNOSTIC_POP) + #undef JSON_HEDLEY_DIAGNOSTIC_POP +#endif +#if defined(__clang__) + #define JSON_HEDLEY_DIAGNOSTIC_PUSH _Pragma("clang diagnostic push") + #define JSON_HEDLEY_DIAGNOSTIC_POP _Pragma("clang diagnostic pop") +#elif JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) + #define JSON_HEDLEY_DIAGNOSTIC_PUSH _Pragma("warning(push)") + #define JSON_HEDLEY_DIAGNOSTIC_POP _Pragma("warning(pop)") +#elif JSON_HEDLEY_GCC_VERSION_CHECK(4,6,0) + #define JSON_HEDLEY_DIAGNOSTIC_PUSH _Pragma("GCC diagnostic push") + #define JSON_HEDLEY_DIAGNOSTIC_POP _Pragma("GCC diagnostic pop") +#elif \ + JSON_HEDLEY_MSVC_VERSION_CHECK(15,0,0) || \ + JSON_HEDLEY_INTEL_CL_VERSION_CHECK(2021,1,0) + #define JSON_HEDLEY_DIAGNOSTIC_PUSH __pragma(warning(push)) + #define JSON_HEDLEY_DIAGNOSTIC_POP __pragma(warning(pop)) +#elif JSON_HEDLEY_ARM_VERSION_CHECK(5,6,0) + #define JSON_HEDLEY_DIAGNOSTIC_PUSH _Pragma("push") + #define JSON_HEDLEY_DIAGNOSTIC_POP _Pragma("pop") +#elif \ + JSON_HEDLEY_TI_VERSION_CHECK(15,12,0) || \ + JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(5,2,0) || \ + JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,4,0) || \ + JSON_HEDLEY_TI_CL6X_VERSION_CHECK(8,1,0) || \ + JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \ + JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,1,0) + #define JSON_HEDLEY_DIAGNOSTIC_PUSH _Pragma("diag_push") + #define JSON_HEDLEY_DIAGNOSTIC_POP _Pragma("diag_pop") +#elif JSON_HEDLEY_PELLES_VERSION_CHECK(2,90,0) + #define JSON_HEDLEY_DIAGNOSTIC_PUSH _Pragma("warning(push)") + #define JSON_HEDLEY_DIAGNOSTIC_POP _Pragma("warning(pop)") +#else + #define JSON_HEDLEY_DIAGNOSTIC_PUSH + #define JSON_HEDLEY_DIAGNOSTIC_POP +#endif + +/* JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_ is for + HEDLEY INTERNAL USE ONLY. API subject to change without notice. */ +#if defined(JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_) + #undef JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_ +#endif +#if defined(__cplusplus) +# if JSON_HEDLEY_HAS_WARNING("-Wc++98-compat") +# if JSON_HEDLEY_HAS_WARNING("-Wc++17-extensions") +# if JSON_HEDLEY_HAS_WARNING("-Wc++1z-extensions") +# define JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_(xpr) \ + JSON_HEDLEY_DIAGNOSTIC_PUSH \ + _Pragma("clang diagnostic ignored \"-Wc++98-compat\"") \ + _Pragma("clang diagnostic ignored \"-Wc++17-extensions\"") \ + _Pragma("clang diagnostic ignored \"-Wc++1z-extensions\"") \ + xpr \ + JSON_HEDLEY_DIAGNOSTIC_POP +# else +# define JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_(xpr) \ + JSON_HEDLEY_DIAGNOSTIC_PUSH \ + _Pragma("clang diagnostic ignored \"-Wc++98-compat\"") \ + _Pragma("clang diagnostic ignored \"-Wc++17-extensions\"") \ + xpr \ + JSON_HEDLEY_DIAGNOSTIC_POP +# endif +# else +# define JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_(xpr) \ + JSON_HEDLEY_DIAGNOSTIC_PUSH \ + _Pragma("clang diagnostic ignored \"-Wc++98-compat\"") \ + xpr \ + JSON_HEDLEY_DIAGNOSTIC_POP +# endif +# endif +#endif +#if !defined(JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_(x) x +#endif + +#if defined(JSON_HEDLEY_CONST_CAST) + #undef JSON_HEDLEY_CONST_CAST +#endif +#if defined(__cplusplus) +# define JSON_HEDLEY_CONST_CAST(T, expr) (const_cast(expr)) +#elif \ + JSON_HEDLEY_HAS_WARNING("-Wcast-qual") || \ + JSON_HEDLEY_GCC_VERSION_CHECK(4,6,0) || \ + JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) +# define JSON_HEDLEY_CONST_CAST(T, expr) (__extension__ ({ \ + JSON_HEDLEY_DIAGNOSTIC_PUSH \ + JSON_HEDLEY_DIAGNOSTIC_DISABLE_CAST_QUAL \ + ((T) (expr)); \ + JSON_HEDLEY_DIAGNOSTIC_POP \ + })) +#else +# define JSON_HEDLEY_CONST_CAST(T, expr) ((T) (expr)) +#endif + +#if defined(JSON_HEDLEY_REINTERPRET_CAST) + #undef JSON_HEDLEY_REINTERPRET_CAST +#endif +#if defined(__cplusplus) + #define JSON_HEDLEY_REINTERPRET_CAST(T, expr) (reinterpret_cast(expr)) +#else + #define JSON_HEDLEY_REINTERPRET_CAST(T, expr) ((T) (expr)) +#endif + +#if defined(JSON_HEDLEY_STATIC_CAST) + #undef JSON_HEDLEY_STATIC_CAST +#endif +#if defined(__cplusplus) + #define JSON_HEDLEY_STATIC_CAST(T, expr) (static_cast(expr)) +#else + #define JSON_HEDLEY_STATIC_CAST(T, expr) ((T) (expr)) +#endif + +#if defined(JSON_HEDLEY_CPP_CAST) + #undef JSON_HEDLEY_CPP_CAST +#endif +#if defined(__cplusplus) +# if JSON_HEDLEY_HAS_WARNING("-Wold-style-cast") +# define JSON_HEDLEY_CPP_CAST(T, expr) \ + JSON_HEDLEY_DIAGNOSTIC_PUSH \ + _Pragma("clang diagnostic ignored \"-Wold-style-cast\"") \ + ((T) (expr)) \ + JSON_HEDLEY_DIAGNOSTIC_POP +# elif JSON_HEDLEY_IAR_VERSION_CHECK(8,3,0) +# define JSON_HEDLEY_CPP_CAST(T, expr) \ + JSON_HEDLEY_DIAGNOSTIC_PUSH \ + _Pragma("diag_suppress=Pe137") \ + JSON_HEDLEY_DIAGNOSTIC_POP +# else +# define JSON_HEDLEY_CPP_CAST(T, expr) ((T) (expr)) +# endif +#else +# define JSON_HEDLEY_CPP_CAST(T, expr) (expr) +#endif + +#if defined(JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED) + #undef JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED +#endif +#if JSON_HEDLEY_HAS_WARNING("-Wdeprecated-declarations") + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED _Pragma("clang diagnostic ignored \"-Wdeprecated-declarations\"") +#elif JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED _Pragma("warning(disable:1478 1786)") +#elif JSON_HEDLEY_INTEL_CL_VERSION_CHECK(2021,1,0) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED __pragma(warning(disable:1478 1786)) +#elif JSON_HEDLEY_PGI_VERSION_CHECK(20,7,0) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED _Pragma("diag_suppress 1215,1216,1444,1445") +#elif JSON_HEDLEY_PGI_VERSION_CHECK(17,10,0) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED _Pragma("diag_suppress 1215,1444") +#elif JSON_HEDLEY_GCC_VERSION_CHECK(4,3,0) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED _Pragma("GCC diagnostic ignored \"-Wdeprecated-declarations\"") +#elif JSON_HEDLEY_MSVC_VERSION_CHECK(15,0,0) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED __pragma(warning(disable:4996)) +#elif JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED _Pragma("diag_suppress 1215,1444") +#elif \ + JSON_HEDLEY_TI_VERSION_CHECK(15,12,0) || \ + (JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(4,8,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(5,2,0) || \ + (JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,4,0) || \ + (JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,3,0) || \ + (JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,2,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,5,0) || \ + JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \ + JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,1,0) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED _Pragma("diag_suppress 1291,1718") +#elif JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,13,0) && !defined(__cplusplus) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED _Pragma("error_messages(off,E_DEPRECATED_ATT,E_DEPRECATED_ATT_MESS)") +#elif JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,13,0) && defined(__cplusplus) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED _Pragma("error_messages(off,symdeprecated,symdeprecated2)") +#elif JSON_HEDLEY_IAR_VERSION_CHECK(8,0,0) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED _Pragma("diag_suppress=Pe1444,Pe1215") +#elif JSON_HEDLEY_PELLES_VERSION_CHECK(2,90,0) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED _Pragma("warn(disable:2241)") +#else + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED +#endif + +#if defined(JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS) + #undef JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS +#endif +#if JSON_HEDLEY_HAS_WARNING("-Wunknown-pragmas") + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS _Pragma("clang diagnostic ignored \"-Wunknown-pragmas\"") +#elif JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS _Pragma("warning(disable:161)") +#elif JSON_HEDLEY_INTEL_CL_VERSION_CHECK(2021,1,0) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS __pragma(warning(disable:161)) +#elif JSON_HEDLEY_PGI_VERSION_CHECK(17,10,0) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS _Pragma("diag_suppress 1675") +#elif JSON_HEDLEY_GCC_VERSION_CHECK(4,3,0) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS _Pragma("GCC diagnostic ignored \"-Wunknown-pragmas\"") +#elif JSON_HEDLEY_MSVC_VERSION_CHECK(15,0,0) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS __pragma(warning(disable:4068)) +#elif \ + JSON_HEDLEY_TI_VERSION_CHECK(16,9,0) || \ + JSON_HEDLEY_TI_CL6X_VERSION_CHECK(8,0,0) || \ + JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \ + JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,3,0) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS _Pragma("diag_suppress 163") +#elif JSON_HEDLEY_TI_CL6X_VERSION_CHECK(8,0,0) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS _Pragma("diag_suppress 163") +#elif JSON_HEDLEY_IAR_VERSION_CHECK(8,0,0) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS _Pragma("diag_suppress=Pe161") +#elif JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS _Pragma("diag_suppress 161") +#else + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS +#endif + +#if defined(JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_CPP_ATTRIBUTES) + #undef JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_CPP_ATTRIBUTES +#endif +#if JSON_HEDLEY_HAS_WARNING("-Wunknown-attributes") + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_CPP_ATTRIBUTES _Pragma("clang diagnostic ignored \"-Wunknown-attributes\"") +#elif JSON_HEDLEY_GCC_VERSION_CHECK(4,6,0) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_CPP_ATTRIBUTES _Pragma("GCC diagnostic ignored \"-Wdeprecated-declarations\"") +#elif JSON_HEDLEY_INTEL_VERSION_CHECK(17,0,0) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_CPP_ATTRIBUTES _Pragma("warning(disable:1292)") +#elif JSON_HEDLEY_INTEL_CL_VERSION_CHECK(2021,1,0) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_CPP_ATTRIBUTES __pragma(warning(disable:1292)) +#elif JSON_HEDLEY_MSVC_VERSION_CHECK(19,0,0) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_CPP_ATTRIBUTES __pragma(warning(disable:5030)) +#elif JSON_HEDLEY_PGI_VERSION_CHECK(20,7,0) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_CPP_ATTRIBUTES _Pragma("diag_suppress 1097,1098") +#elif JSON_HEDLEY_PGI_VERSION_CHECK(17,10,0) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_CPP_ATTRIBUTES _Pragma("diag_suppress 1097") +#elif JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,14,0) && defined(__cplusplus) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_CPP_ATTRIBUTES _Pragma("error_messages(off,attrskipunsup)") +#elif \ + JSON_HEDLEY_TI_VERSION_CHECK(18,1,0) || \ + JSON_HEDLEY_TI_CL6X_VERSION_CHECK(8,3,0) || \ + JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_CPP_ATTRIBUTES _Pragma("diag_suppress 1173") +#elif JSON_HEDLEY_IAR_VERSION_CHECK(8,0,0) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_CPP_ATTRIBUTES _Pragma("diag_suppress=Pe1097") +#elif JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_CPP_ATTRIBUTES _Pragma("diag_suppress 1097") +#else + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_CPP_ATTRIBUTES +#endif + +#if defined(JSON_HEDLEY_DIAGNOSTIC_DISABLE_CAST_QUAL) + #undef JSON_HEDLEY_DIAGNOSTIC_DISABLE_CAST_QUAL +#endif +#if JSON_HEDLEY_HAS_WARNING("-Wcast-qual") + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_CAST_QUAL _Pragma("clang diagnostic ignored \"-Wcast-qual\"") +#elif JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_CAST_QUAL _Pragma("warning(disable:2203 2331)") +#elif JSON_HEDLEY_GCC_VERSION_CHECK(3,0,0) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_CAST_QUAL _Pragma("GCC diagnostic ignored \"-Wcast-qual\"") +#else + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_CAST_QUAL +#endif + +#if defined(JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNUSED_FUNCTION) + #undef JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNUSED_FUNCTION +#endif +#if JSON_HEDLEY_HAS_WARNING("-Wunused-function") + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNUSED_FUNCTION _Pragma("clang diagnostic ignored \"-Wunused-function\"") +#elif JSON_HEDLEY_GCC_VERSION_CHECK(3,4,0) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNUSED_FUNCTION _Pragma("GCC diagnostic ignored \"-Wunused-function\"") +#elif JSON_HEDLEY_MSVC_VERSION_CHECK(1,0,0) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNUSED_FUNCTION __pragma(warning(disable:4505)) +#elif JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNUSED_FUNCTION _Pragma("diag_suppress 3142") +#else + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNUSED_FUNCTION +#endif + +#if defined(JSON_HEDLEY_DEPRECATED) + #undef JSON_HEDLEY_DEPRECATED +#endif +#if defined(JSON_HEDLEY_DEPRECATED_FOR) + #undef JSON_HEDLEY_DEPRECATED_FOR +#endif +#if \ + JSON_HEDLEY_MSVC_VERSION_CHECK(14,0,0) || \ + JSON_HEDLEY_INTEL_CL_VERSION_CHECK(2021,1,0) + #define JSON_HEDLEY_DEPRECATED(since) __declspec(deprecated("Since " # since)) + #define JSON_HEDLEY_DEPRECATED_FOR(since, replacement) __declspec(deprecated("Since " #since "; use " #replacement)) +#elif \ + (JSON_HEDLEY_HAS_EXTENSION(attribute_deprecated_with_message) && !defined(JSON_HEDLEY_IAR_VERSION)) || \ + JSON_HEDLEY_GCC_VERSION_CHECK(4,5,0) || \ + JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \ + JSON_HEDLEY_ARM_VERSION_CHECK(5,6,0) || \ + JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,13,0) || \ + JSON_HEDLEY_PGI_VERSION_CHECK(17,10,0) || \ + JSON_HEDLEY_TI_VERSION_CHECK(18,1,0) || \ + JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(18,1,0) || \ + JSON_HEDLEY_TI_CL6X_VERSION_CHECK(8,3,0) || \ + JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \ + JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,3,0) || \ + JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) + #define JSON_HEDLEY_DEPRECATED(since) __attribute__((__deprecated__("Since " #since))) + #define JSON_HEDLEY_DEPRECATED_FOR(since, replacement) __attribute__((__deprecated__("Since " #since "; use " #replacement))) +#elif defined(__cplusplus) && (__cplusplus >= 201402L) + #define JSON_HEDLEY_DEPRECATED(since) JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_([[deprecated("Since " #since)]]) + #define JSON_HEDLEY_DEPRECATED_FOR(since, replacement) JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_([[deprecated("Since " #since "; use " #replacement)]]) +#elif \ + JSON_HEDLEY_HAS_ATTRIBUTE(deprecated) || \ + JSON_HEDLEY_GCC_VERSION_CHECK(3,1,0) || \ + JSON_HEDLEY_ARM_VERSION_CHECK(4,1,0) || \ + JSON_HEDLEY_TI_VERSION_CHECK(15,12,0) || \ + (JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(4,8,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(5,2,0) || \ + (JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,4,0) || \ + (JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,3,0) || \ + (JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,2,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,5,0) || \ + JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \ + JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,1,0) || \ + JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) || \ + JSON_HEDLEY_IAR_VERSION_CHECK(8,10,0) + #define JSON_HEDLEY_DEPRECATED(since) __attribute__((__deprecated__)) + #define JSON_HEDLEY_DEPRECATED_FOR(since, replacement) __attribute__((__deprecated__)) +#elif \ + JSON_HEDLEY_MSVC_VERSION_CHECK(13,10,0) || \ + JSON_HEDLEY_PELLES_VERSION_CHECK(6,50,0) || \ + JSON_HEDLEY_INTEL_CL_VERSION_CHECK(2021,1,0) + #define JSON_HEDLEY_DEPRECATED(since) __declspec(deprecated) + #define JSON_HEDLEY_DEPRECATED_FOR(since, replacement) __declspec(deprecated) +#elif JSON_HEDLEY_IAR_VERSION_CHECK(8,0,0) + #define JSON_HEDLEY_DEPRECATED(since) _Pragma("deprecated") + #define JSON_HEDLEY_DEPRECATED_FOR(since, replacement) _Pragma("deprecated") +#else + #define JSON_HEDLEY_DEPRECATED(since) + #define JSON_HEDLEY_DEPRECATED_FOR(since, replacement) +#endif + +#if defined(JSON_HEDLEY_UNAVAILABLE) + #undef JSON_HEDLEY_UNAVAILABLE +#endif +#if \ + JSON_HEDLEY_HAS_ATTRIBUTE(warning) || \ + JSON_HEDLEY_GCC_VERSION_CHECK(4,3,0) || \ + JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \ + JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) + #define JSON_HEDLEY_UNAVAILABLE(available_since) __attribute__((__warning__("Not available until " #available_since))) +#else + #define JSON_HEDLEY_UNAVAILABLE(available_since) +#endif + +#if defined(JSON_HEDLEY_WARN_UNUSED_RESULT) + #undef JSON_HEDLEY_WARN_UNUSED_RESULT +#endif +#if defined(JSON_HEDLEY_WARN_UNUSED_RESULT_MSG) + #undef JSON_HEDLEY_WARN_UNUSED_RESULT_MSG +#endif +#if \ + JSON_HEDLEY_HAS_ATTRIBUTE(warn_unused_result) || \ + JSON_HEDLEY_GCC_VERSION_CHECK(3,4,0) || \ + JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \ + JSON_HEDLEY_TI_VERSION_CHECK(15,12,0) || \ + (JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(4,8,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(5,2,0) || \ + (JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,4,0) || \ + (JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,3,0) || \ + (JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,2,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,5,0) || \ + JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \ + JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,1,0) || \ + (JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,15,0) && defined(__cplusplus)) || \ + JSON_HEDLEY_PGI_VERSION_CHECK(17,10,0) || \ + JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) + #define JSON_HEDLEY_WARN_UNUSED_RESULT __attribute__((__warn_unused_result__)) + #define JSON_HEDLEY_WARN_UNUSED_RESULT_MSG(msg) __attribute__((__warn_unused_result__)) +#elif (JSON_HEDLEY_HAS_CPP_ATTRIBUTE(nodiscard) >= 201907L) + #define JSON_HEDLEY_WARN_UNUSED_RESULT JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_([[nodiscard]]) + #define JSON_HEDLEY_WARN_UNUSED_RESULT_MSG(msg) JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_([[nodiscard(msg)]]) +#elif JSON_HEDLEY_HAS_CPP_ATTRIBUTE(nodiscard) + #define JSON_HEDLEY_WARN_UNUSED_RESULT JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_([[nodiscard]]) + #define JSON_HEDLEY_WARN_UNUSED_RESULT_MSG(msg) JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_([[nodiscard]]) +#elif defined(_Check_return_) /* SAL */ + #define JSON_HEDLEY_WARN_UNUSED_RESULT _Check_return_ + #define JSON_HEDLEY_WARN_UNUSED_RESULT_MSG(msg) _Check_return_ +#else + #define JSON_HEDLEY_WARN_UNUSED_RESULT + #define JSON_HEDLEY_WARN_UNUSED_RESULT_MSG(msg) +#endif + +#if defined(JSON_HEDLEY_SENTINEL) + #undef JSON_HEDLEY_SENTINEL +#endif +#if \ + JSON_HEDLEY_HAS_ATTRIBUTE(sentinel) || \ + JSON_HEDLEY_GCC_VERSION_CHECK(4,0,0) || \ + JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \ + JSON_HEDLEY_ARM_VERSION_CHECK(5,4,0) || \ + JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) + #define JSON_HEDLEY_SENTINEL(position) __attribute__((__sentinel__(position))) +#else + #define JSON_HEDLEY_SENTINEL(position) +#endif + +#if defined(JSON_HEDLEY_NO_RETURN) + #undef JSON_HEDLEY_NO_RETURN +#endif +#if JSON_HEDLEY_IAR_VERSION_CHECK(8,0,0) + #define JSON_HEDLEY_NO_RETURN __noreturn +#elif \ + JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \ + JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) + #define JSON_HEDLEY_NO_RETURN __attribute__((__noreturn__)) +#elif defined(__STDC_VERSION__) && __STDC_VERSION__ >= 201112L + #define JSON_HEDLEY_NO_RETURN _Noreturn +#elif defined(__cplusplus) && (__cplusplus >= 201103L) + #define JSON_HEDLEY_NO_RETURN JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_([[noreturn]]) +#elif \ + JSON_HEDLEY_HAS_ATTRIBUTE(noreturn) || \ + JSON_HEDLEY_GCC_VERSION_CHECK(3,2,0) || \ + JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,11,0) || \ + JSON_HEDLEY_ARM_VERSION_CHECK(4,1,0) || \ + JSON_HEDLEY_IBM_VERSION_CHECK(10,1,0) || \ + JSON_HEDLEY_TI_VERSION_CHECK(15,12,0) || \ + (JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(4,8,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(5,2,0) || \ + (JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,4,0) || \ + (JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,3,0) || \ + (JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,2,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,5,0) || \ + JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \ + JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,1,0) || \ + JSON_HEDLEY_IAR_VERSION_CHECK(8,10,0) + #define JSON_HEDLEY_NO_RETURN __attribute__((__noreturn__)) +#elif JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,10,0) + #define JSON_HEDLEY_NO_RETURN _Pragma("does_not_return") +#elif \ + JSON_HEDLEY_MSVC_VERSION_CHECK(13,10,0) || \ + JSON_HEDLEY_INTEL_CL_VERSION_CHECK(2021,1,0) + #define JSON_HEDLEY_NO_RETURN __declspec(noreturn) +#elif JSON_HEDLEY_TI_CL6X_VERSION_CHECK(6,0,0) && defined(__cplusplus) + #define JSON_HEDLEY_NO_RETURN _Pragma("FUNC_NEVER_RETURNS;") +#elif JSON_HEDLEY_COMPCERT_VERSION_CHECK(3,2,0) + #define JSON_HEDLEY_NO_RETURN __attribute((noreturn)) +#elif JSON_HEDLEY_PELLES_VERSION_CHECK(9,0,0) + #define JSON_HEDLEY_NO_RETURN __declspec(noreturn) +#else + #define JSON_HEDLEY_NO_RETURN +#endif + +#if defined(JSON_HEDLEY_NO_ESCAPE) + #undef JSON_HEDLEY_NO_ESCAPE +#endif +#if JSON_HEDLEY_HAS_ATTRIBUTE(noescape) + #define JSON_HEDLEY_NO_ESCAPE __attribute__((__noescape__)) +#else + #define JSON_HEDLEY_NO_ESCAPE +#endif + +#if defined(JSON_HEDLEY_UNREACHABLE) + #undef JSON_HEDLEY_UNREACHABLE +#endif +#if defined(JSON_HEDLEY_UNREACHABLE_RETURN) + #undef JSON_HEDLEY_UNREACHABLE_RETURN +#endif +#if defined(JSON_HEDLEY_ASSUME) + #undef JSON_HEDLEY_ASSUME +#endif +#if \ + JSON_HEDLEY_MSVC_VERSION_CHECK(13,10,0) || \ + JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \ + JSON_HEDLEY_INTEL_CL_VERSION_CHECK(2021,1,0) + #define JSON_HEDLEY_ASSUME(expr) __assume(expr) +#elif JSON_HEDLEY_HAS_BUILTIN(__builtin_assume) + #define JSON_HEDLEY_ASSUME(expr) __builtin_assume(expr) +#elif \ + JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,2,0) || \ + JSON_HEDLEY_TI_CL6X_VERSION_CHECK(4,0,0) + #if defined(__cplusplus) + #define JSON_HEDLEY_ASSUME(expr) std::_nassert(expr) + #else + #define JSON_HEDLEY_ASSUME(expr) _nassert(expr) + #endif +#endif +#if \ + (JSON_HEDLEY_HAS_BUILTIN(__builtin_unreachable) && (!defined(JSON_HEDLEY_ARM_VERSION))) || \ + JSON_HEDLEY_GCC_VERSION_CHECK(4,5,0) || \ + JSON_HEDLEY_PGI_VERSION_CHECK(18,10,0) || \ + JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \ + JSON_HEDLEY_IBM_VERSION_CHECK(13,1,5) || \ + JSON_HEDLEY_CRAY_VERSION_CHECK(10,0,0) || \ + JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) + #define JSON_HEDLEY_UNREACHABLE() __builtin_unreachable() +#elif defined(JSON_HEDLEY_ASSUME) + #define JSON_HEDLEY_UNREACHABLE() JSON_HEDLEY_ASSUME(0) +#endif +#if !defined(JSON_HEDLEY_ASSUME) + #if defined(JSON_HEDLEY_UNREACHABLE) + #define JSON_HEDLEY_ASSUME(expr) JSON_HEDLEY_STATIC_CAST(void, ((expr) ? 1 : (JSON_HEDLEY_UNREACHABLE(), 1))) + #else + #define JSON_HEDLEY_ASSUME(expr) JSON_HEDLEY_STATIC_CAST(void, expr) + #endif +#endif +#if defined(JSON_HEDLEY_UNREACHABLE) + #if \ + JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,2,0) || \ + JSON_HEDLEY_TI_CL6X_VERSION_CHECK(4,0,0) + #define JSON_HEDLEY_UNREACHABLE_RETURN(value) return (JSON_HEDLEY_STATIC_CAST(void, JSON_HEDLEY_ASSUME(0)), (value)) + #else + #define JSON_HEDLEY_UNREACHABLE_RETURN(value) JSON_HEDLEY_UNREACHABLE() + #endif +#else + #define JSON_HEDLEY_UNREACHABLE_RETURN(value) return (value) +#endif +#if !defined(JSON_HEDLEY_UNREACHABLE) + #define JSON_HEDLEY_UNREACHABLE() JSON_HEDLEY_ASSUME(0) +#endif + +JSON_HEDLEY_DIAGNOSTIC_PUSH +#if JSON_HEDLEY_HAS_WARNING("-Wpedantic") + #pragma clang diagnostic ignored "-Wpedantic" +#endif +#if JSON_HEDLEY_HAS_WARNING("-Wc++98-compat-pedantic") && defined(__cplusplus) + #pragma clang diagnostic ignored "-Wc++98-compat-pedantic" +#endif +#if JSON_HEDLEY_GCC_HAS_WARNING("-Wvariadic-macros",4,0,0) + #if defined(__clang__) + #pragma clang diagnostic ignored "-Wvariadic-macros" + #elif defined(JSON_HEDLEY_GCC_VERSION) + #pragma GCC diagnostic ignored "-Wvariadic-macros" + #endif +#endif +#if defined(JSON_HEDLEY_NON_NULL) + #undef JSON_HEDLEY_NON_NULL +#endif +#if \ + JSON_HEDLEY_HAS_ATTRIBUTE(nonnull) || \ + JSON_HEDLEY_GCC_VERSION_CHECK(3,3,0) || \ + JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \ + JSON_HEDLEY_ARM_VERSION_CHECK(4,1,0) + #define JSON_HEDLEY_NON_NULL(...) __attribute__((__nonnull__(__VA_ARGS__))) +#else + #define JSON_HEDLEY_NON_NULL(...) +#endif +JSON_HEDLEY_DIAGNOSTIC_POP + +#if defined(JSON_HEDLEY_PRINTF_FORMAT) + #undef JSON_HEDLEY_PRINTF_FORMAT +#endif +#if defined(__MINGW32__) && JSON_HEDLEY_GCC_HAS_ATTRIBUTE(format,4,4,0) && !defined(__USE_MINGW_ANSI_STDIO) + #define JSON_HEDLEY_PRINTF_FORMAT(string_idx,first_to_check) __attribute__((__format__(ms_printf, string_idx, first_to_check))) +#elif defined(__MINGW32__) && JSON_HEDLEY_GCC_HAS_ATTRIBUTE(format,4,4,0) && defined(__USE_MINGW_ANSI_STDIO) + #define JSON_HEDLEY_PRINTF_FORMAT(string_idx,first_to_check) __attribute__((__format__(gnu_printf, string_idx, first_to_check))) +#elif \ + JSON_HEDLEY_HAS_ATTRIBUTE(format) || \ + JSON_HEDLEY_GCC_VERSION_CHECK(3,1,0) || \ + JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \ + JSON_HEDLEY_ARM_VERSION_CHECK(5,6,0) || \ + JSON_HEDLEY_IBM_VERSION_CHECK(10,1,0) || \ + JSON_HEDLEY_TI_VERSION_CHECK(15,12,0) || \ + (JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(4,8,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(5,2,0) || \ + (JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,4,0) || \ + (JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,3,0) || \ + (JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,2,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,5,0) || \ + JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \ + JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,1,0) || \ + JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) + #define JSON_HEDLEY_PRINTF_FORMAT(string_idx,first_to_check) __attribute__((__format__(__printf__, string_idx, first_to_check))) +#elif JSON_HEDLEY_PELLES_VERSION_CHECK(6,0,0) + #define JSON_HEDLEY_PRINTF_FORMAT(string_idx,first_to_check) __declspec(vaformat(printf,string_idx,first_to_check)) +#else + #define JSON_HEDLEY_PRINTF_FORMAT(string_idx,first_to_check) +#endif + +#if defined(JSON_HEDLEY_CONSTEXPR) + #undef JSON_HEDLEY_CONSTEXPR +#endif +#if defined(__cplusplus) + #if __cplusplus >= 201103L + #define JSON_HEDLEY_CONSTEXPR JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_(constexpr) + #endif +#endif +#if !defined(JSON_HEDLEY_CONSTEXPR) + #define JSON_HEDLEY_CONSTEXPR +#endif + +#if defined(JSON_HEDLEY_PREDICT) + #undef JSON_HEDLEY_PREDICT +#endif +#if defined(JSON_HEDLEY_LIKELY) + #undef JSON_HEDLEY_LIKELY +#endif +#if defined(JSON_HEDLEY_UNLIKELY) + #undef JSON_HEDLEY_UNLIKELY +#endif +#if defined(JSON_HEDLEY_UNPREDICTABLE) + #undef JSON_HEDLEY_UNPREDICTABLE +#endif +#if JSON_HEDLEY_HAS_BUILTIN(__builtin_unpredictable) + #define JSON_HEDLEY_UNPREDICTABLE(expr) __builtin_unpredictable((expr)) +#endif +#if \ + (JSON_HEDLEY_HAS_BUILTIN(__builtin_expect_with_probability) && !defined(JSON_HEDLEY_PGI_VERSION)) || \ + JSON_HEDLEY_GCC_VERSION_CHECK(9,0,0) || \ + JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) +# define JSON_HEDLEY_PREDICT(expr, value, probability) __builtin_expect_with_probability( (expr), (value), (probability)) +# define JSON_HEDLEY_PREDICT_TRUE(expr, probability) __builtin_expect_with_probability(!!(expr), 1 , (probability)) +# define JSON_HEDLEY_PREDICT_FALSE(expr, probability) __builtin_expect_with_probability(!!(expr), 0 , (probability)) +# define JSON_HEDLEY_LIKELY(expr) __builtin_expect (!!(expr), 1 ) +# define JSON_HEDLEY_UNLIKELY(expr) __builtin_expect (!!(expr), 0 ) +#elif \ + (JSON_HEDLEY_HAS_BUILTIN(__builtin_expect) && !defined(JSON_HEDLEY_INTEL_CL_VERSION)) || \ + JSON_HEDLEY_GCC_VERSION_CHECK(3,0,0) || \ + JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \ + (JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,15,0) && defined(__cplusplus)) || \ + JSON_HEDLEY_ARM_VERSION_CHECK(4,1,0) || \ + JSON_HEDLEY_IBM_VERSION_CHECK(10,1,0) || \ + JSON_HEDLEY_TI_VERSION_CHECK(15,12,0) || \ + JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(4,7,0) || \ + JSON_HEDLEY_TI_CL430_VERSION_CHECK(3,1,0) || \ + JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,1,0) || \ + JSON_HEDLEY_TI_CL6X_VERSION_CHECK(6,1,0) || \ + JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \ + JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,1,0) || \ + JSON_HEDLEY_TINYC_VERSION_CHECK(0,9,27) || \ + JSON_HEDLEY_CRAY_VERSION_CHECK(8,1,0) || \ + JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) +# define JSON_HEDLEY_PREDICT(expr, expected, probability) \ + (((probability) >= 0.9) ? __builtin_expect((expr), (expected)) : (JSON_HEDLEY_STATIC_CAST(void, expected), (expr))) +# define JSON_HEDLEY_PREDICT_TRUE(expr, probability) \ + (__extension__ ({ \ + double hedley_probability_ = (probability); \ + ((hedley_probability_ >= 0.9) ? __builtin_expect(!!(expr), 1) : ((hedley_probability_ <= 0.1) ? __builtin_expect(!!(expr), 0) : !!(expr))); \ + })) +# define JSON_HEDLEY_PREDICT_FALSE(expr, probability) \ + (__extension__ ({ \ + double hedley_probability_ = (probability); \ + ((hedley_probability_ >= 0.9) ? __builtin_expect(!!(expr), 0) : ((hedley_probability_ <= 0.1) ? __builtin_expect(!!(expr), 1) : !!(expr))); \ + })) +# define JSON_HEDLEY_LIKELY(expr) __builtin_expect(!!(expr), 1) +# define JSON_HEDLEY_UNLIKELY(expr) __builtin_expect(!!(expr), 0) +#else +# define JSON_HEDLEY_PREDICT(expr, expected, probability) (JSON_HEDLEY_STATIC_CAST(void, expected), (expr)) +# define JSON_HEDLEY_PREDICT_TRUE(expr, probability) (!!(expr)) +# define JSON_HEDLEY_PREDICT_FALSE(expr, probability) (!!(expr)) +# define JSON_HEDLEY_LIKELY(expr) (!!(expr)) +# define JSON_HEDLEY_UNLIKELY(expr) (!!(expr)) +#endif +#if !defined(JSON_HEDLEY_UNPREDICTABLE) + #define JSON_HEDLEY_UNPREDICTABLE(expr) JSON_HEDLEY_PREDICT(expr, 1, 0.5) +#endif + +#if defined(JSON_HEDLEY_MALLOC) + #undef JSON_HEDLEY_MALLOC +#endif +#if \ + JSON_HEDLEY_HAS_ATTRIBUTE(malloc) || \ + JSON_HEDLEY_GCC_VERSION_CHECK(3,1,0) || \ + JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \ + JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,11,0) || \ + JSON_HEDLEY_ARM_VERSION_CHECK(4,1,0) || \ + JSON_HEDLEY_IBM_VERSION_CHECK(12,1,0) || \ + JSON_HEDLEY_TI_VERSION_CHECK(15,12,0) || \ + (JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(4,8,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(5,2,0) || \ + (JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,4,0) || \ + (JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,3,0) || \ + (JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,2,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,5,0) || \ + JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \ + JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,1,0) || \ + JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) + #define JSON_HEDLEY_MALLOC __attribute__((__malloc__)) +#elif JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,10,0) + #define JSON_HEDLEY_MALLOC _Pragma("returns_new_memory") +#elif \ + JSON_HEDLEY_MSVC_VERSION_CHECK(14,0,0) || \ + JSON_HEDLEY_INTEL_CL_VERSION_CHECK(2021,1,0) + #define JSON_HEDLEY_MALLOC __declspec(restrict) +#else + #define JSON_HEDLEY_MALLOC +#endif + +#if defined(JSON_HEDLEY_PURE) + #undef JSON_HEDLEY_PURE +#endif +#if \ + JSON_HEDLEY_HAS_ATTRIBUTE(pure) || \ + JSON_HEDLEY_GCC_VERSION_CHECK(2,96,0) || \ + JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \ + JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,11,0) || \ + JSON_HEDLEY_ARM_VERSION_CHECK(4,1,0) || \ + JSON_HEDLEY_IBM_VERSION_CHECK(10,1,0) || \ + JSON_HEDLEY_TI_VERSION_CHECK(15,12,0) || \ + (JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(4,8,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(5,2,0) || \ + (JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,4,0) || \ + (JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,3,0) || \ + (JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,2,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,5,0) || \ + JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \ + JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,1,0) || \ + JSON_HEDLEY_PGI_VERSION_CHECK(17,10,0) || \ + JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) +# define JSON_HEDLEY_PURE __attribute__((__pure__)) +#elif JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,10,0) +# define JSON_HEDLEY_PURE _Pragma("does_not_write_global_data") +#elif defined(__cplusplus) && \ + ( \ + JSON_HEDLEY_TI_CL430_VERSION_CHECK(2,0,1) || \ + JSON_HEDLEY_TI_CL6X_VERSION_CHECK(4,0,0) || \ + JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) \ + ) +# define JSON_HEDLEY_PURE _Pragma("FUNC_IS_PURE;") +#else +# define JSON_HEDLEY_PURE +#endif + +#if defined(JSON_HEDLEY_CONST) + #undef JSON_HEDLEY_CONST +#endif +#if \ + JSON_HEDLEY_HAS_ATTRIBUTE(const) || \ + JSON_HEDLEY_GCC_VERSION_CHECK(2,5,0) || \ + JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \ + JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,11,0) || \ + JSON_HEDLEY_ARM_VERSION_CHECK(4,1,0) || \ + JSON_HEDLEY_IBM_VERSION_CHECK(10,1,0) || \ + JSON_HEDLEY_TI_VERSION_CHECK(15,12,0) || \ + (JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(4,8,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(5,2,0) || \ + (JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,4,0) || \ + (JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,3,0) || \ + (JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,2,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,5,0) || \ + JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \ + JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,1,0) || \ + JSON_HEDLEY_PGI_VERSION_CHECK(17,10,0) || \ + JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) + #define JSON_HEDLEY_CONST __attribute__((__const__)) +#elif \ + JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,10,0) + #define JSON_HEDLEY_CONST _Pragma("no_side_effect") +#else + #define JSON_HEDLEY_CONST JSON_HEDLEY_PURE +#endif + +#if defined(JSON_HEDLEY_RESTRICT) + #undef JSON_HEDLEY_RESTRICT +#endif +#if defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) && !defined(__cplusplus) + #define JSON_HEDLEY_RESTRICT restrict +#elif \ + JSON_HEDLEY_GCC_VERSION_CHECK(3,1,0) || \ + JSON_HEDLEY_MSVC_VERSION_CHECK(14,0,0) || \ + JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \ + JSON_HEDLEY_INTEL_CL_VERSION_CHECK(2021,1,0) || \ + JSON_HEDLEY_ARM_VERSION_CHECK(4,1,0) || \ + JSON_HEDLEY_IBM_VERSION_CHECK(10,1,0) || \ + JSON_HEDLEY_PGI_VERSION_CHECK(17,10,0) || \ + JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,3,0) || \ + JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,2,4) || \ + JSON_HEDLEY_TI_CL6X_VERSION_CHECK(8,1,0) || \ + JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \ + (JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,14,0) && defined(__cplusplus)) || \ + JSON_HEDLEY_IAR_VERSION_CHECK(8,0,0) || \ + defined(__clang__) || \ + JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) + #define JSON_HEDLEY_RESTRICT __restrict +#elif JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,3,0) && !defined(__cplusplus) + #define JSON_HEDLEY_RESTRICT _Restrict +#else + #define JSON_HEDLEY_RESTRICT +#endif + +#if defined(JSON_HEDLEY_INLINE) + #undef JSON_HEDLEY_INLINE +#endif +#if \ + (defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L)) || \ + (defined(__cplusplus) && (__cplusplus >= 199711L)) + #define JSON_HEDLEY_INLINE inline +#elif \ + defined(JSON_HEDLEY_GCC_VERSION) || \ + JSON_HEDLEY_ARM_VERSION_CHECK(6,2,0) + #define JSON_HEDLEY_INLINE __inline__ +#elif \ + JSON_HEDLEY_MSVC_VERSION_CHECK(12,0,0) || \ + JSON_HEDLEY_INTEL_CL_VERSION_CHECK(2021,1,0) || \ + JSON_HEDLEY_ARM_VERSION_CHECK(4,1,0) || \ + JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(5,1,0) || \ + JSON_HEDLEY_TI_CL430_VERSION_CHECK(3,1,0) || \ + JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,2,0) || \ + JSON_HEDLEY_TI_CL6X_VERSION_CHECK(8,0,0) || \ + JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \ + JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,1,0) || \ + JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) + #define JSON_HEDLEY_INLINE __inline +#else + #define JSON_HEDLEY_INLINE +#endif + +#if defined(JSON_HEDLEY_ALWAYS_INLINE) + #undef JSON_HEDLEY_ALWAYS_INLINE +#endif +#if \ + JSON_HEDLEY_HAS_ATTRIBUTE(always_inline) || \ + JSON_HEDLEY_GCC_VERSION_CHECK(4,0,0) || \ + JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \ + JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,11,0) || \ + JSON_HEDLEY_ARM_VERSION_CHECK(4,1,0) || \ + JSON_HEDLEY_IBM_VERSION_CHECK(10,1,0) || \ + JSON_HEDLEY_TI_VERSION_CHECK(15,12,0) || \ + (JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(4,8,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(5,2,0) || \ + (JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,4,0) || \ + (JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,3,0) || \ + (JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,2,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,5,0) || \ + JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \ + JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,1,0) || \ + JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) || \ + JSON_HEDLEY_IAR_VERSION_CHECK(8,10,0) +# define JSON_HEDLEY_ALWAYS_INLINE __attribute__((__always_inline__)) JSON_HEDLEY_INLINE +#elif \ + JSON_HEDLEY_MSVC_VERSION_CHECK(12,0,0) || \ + JSON_HEDLEY_INTEL_CL_VERSION_CHECK(2021,1,0) +# define JSON_HEDLEY_ALWAYS_INLINE __forceinline +#elif defined(__cplusplus) && \ + ( \ + JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(5,2,0) || \ + JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,3,0) || \ + JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,4,0) || \ + JSON_HEDLEY_TI_CL6X_VERSION_CHECK(6,1,0) || \ + JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \ + JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,1,0) \ + ) +# define JSON_HEDLEY_ALWAYS_INLINE _Pragma("FUNC_ALWAYS_INLINE;") +#elif JSON_HEDLEY_IAR_VERSION_CHECK(8,0,0) +# define JSON_HEDLEY_ALWAYS_INLINE _Pragma("inline=forced") +#else +# define JSON_HEDLEY_ALWAYS_INLINE JSON_HEDLEY_INLINE +#endif + +#if defined(JSON_HEDLEY_NEVER_INLINE) + #undef JSON_HEDLEY_NEVER_INLINE +#endif +#if \ + JSON_HEDLEY_HAS_ATTRIBUTE(noinline) || \ + JSON_HEDLEY_GCC_VERSION_CHECK(4,0,0) || \ + JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \ + JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,11,0) || \ + JSON_HEDLEY_ARM_VERSION_CHECK(4,1,0) || \ + JSON_HEDLEY_IBM_VERSION_CHECK(10,1,0) || \ + JSON_HEDLEY_TI_VERSION_CHECK(15,12,0) || \ + (JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(4,8,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(5,2,0) || \ + (JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,4,0) || \ + (JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,3,0) || \ + (JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,2,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,5,0) || \ + JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \ + JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,1,0) || \ + JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) || \ + JSON_HEDLEY_IAR_VERSION_CHECK(8,10,0) + #define JSON_HEDLEY_NEVER_INLINE __attribute__((__noinline__)) +#elif \ + JSON_HEDLEY_MSVC_VERSION_CHECK(13,10,0) || \ + JSON_HEDLEY_INTEL_CL_VERSION_CHECK(2021,1,0) + #define JSON_HEDLEY_NEVER_INLINE __declspec(noinline) +#elif JSON_HEDLEY_PGI_VERSION_CHECK(10,2,0) + #define JSON_HEDLEY_NEVER_INLINE _Pragma("noinline") +#elif JSON_HEDLEY_TI_CL6X_VERSION_CHECK(6,0,0) && defined(__cplusplus) + #define JSON_HEDLEY_NEVER_INLINE _Pragma("FUNC_CANNOT_INLINE;") +#elif JSON_HEDLEY_IAR_VERSION_CHECK(8,0,0) + #define JSON_HEDLEY_NEVER_INLINE _Pragma("inline=never") +#elif JSON_HEDLEY_COMPCERT_VERSION_CHECK(3,2,0) + #define JSON_HEDLEY_NEVER_INLINE __attribute((noinline)) +#elif JSON_HEDLEY_PELLES_VERSION_CHECK(9,0,0) + #define JSON_HEDLEY_NEVER_INLINE __declspec(noinline) +#else + #define JSON_HEDLEY_NEVER_INLINE +#endif + +#if defined(JSON_HEDLEY_PRIVATE) + #undef JSON_HEDLEY_PRIVATE +#endif +#if defined(JSON_HEDLEY_PUBLIC) + #undef JSON_HEDLEY_PUBLIC +#endif +#if defined(JSON_HEDLEY_IMPORT) + #undef JSON_HEDLEY_IMPORT +#endif +#if defined(_WIN32) || defined(__CYGWIN__) +# define JSON_HEDLEY_PRIVATE +# define JSON_HEDLEY_PUBLIC __declspec(dllexport) +# define JSON_HEDLEY_IMPORT __declspec(dllimport) +#else +# if \ + JSON_HEDLEY_HAS_ATTRIBUTE(visibility) || \ + JSON_HEDLEY_GCC_VERSION_CHECK(3,3,0) || \ + JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,11,0) || \ + JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \ + JSON_HEDLEY_ARM_VERSION_CHECK(4,1,0) || \ + JSON_HEDLEY_IBM_VERSION_CHECK(13,1,0) || \ + ( \ + defined(__TI_EABI__) && \ + ( \ + (JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,2,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,5,0) \ + ) \ + ) || \ + JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) +# define JSON_HEDLEY_PRIVATE __attribute__((__visibility__("hidden"))) +# define JSON_HEDLEY_PUBLIC __attribute__((__visibility__("default"))) +# else +# define JSON_HEDLEY_PRIVATE +# define JSON_HEDLEY_PUBLIC +# endif +# define JSON_HEDLEY_IMPORT extern +#endif + +#if defined(JSON_HEDLEY_NO_THROW) + #undef JSON_HEDLEY_NO_THROW +#endif +#if \ + JSON_HEDLEY_HAS_ATTRIBUTE(nothrow) || \ + JSON_HEDLEY_GCC_VERSION_CHECK(3,3,0) || \ + JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \ + JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) + #define JSON_HEDLEY_NO_THROW __attribute__((__nothrow__)) +#elif \ + JSON_HEDLEY_MSVC_VERSION_CHECK(13,1,0) || \ + JSON_HEDLEY_INTEL_CL_VERSION_CHECK(2021,1,0) || \ + JSON_HEDLEY_ARM_VERSION_CHECK(4,1,0) + #define JSON_HEDLEY_NO_THROW __declspec(nothrow) +#else + #define JSON_HEDLEY_NO_THROW +#endif + +#if defined(JSON_HEDLEY_FALL_THROUGH) + #undef JSON_HEDLEY_FALL_THROUGH +#endif +#if \ + JSON_HEDLEY_HAS_ATTRIBUTE(fallthrough) || \ + JSON_HEDLEY_GCC_VERSION_CHECK(7,0,0) || \ + JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) + #define JSON_HEDLEY_FALL_THROUGH __attribute__((__fallthrough__)) +#elif JSON_HEDLEY_HAS_CPP_ATTRIBUTE_NS(clang,fallthrough) + #define JSON_HEDLEY_FALL_THROUGH JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_([[clang::fallthrough]]) +#elif JSON_HEDLEY_HAS_CPP_ATTRIBUTE(fallthrough) + #define JSON_HEDLEY_FALL_THROUGH JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_([[fallthrough]]) +#elif defined(__fallthrough) /* SAL */ + #define JSON_HEDLEY_FALL_THROUGH __fallthrough +#else + #define JSON_HEDLEY_FALL_THROUGH +#endif + +#if defined(JSON_HEDLEY_RETURNS_NON_NULL) + #undef JSON_HEDLEY_RETURNS_NON_NULL +#endif +#if \ + JSON_HEDLEY_HAS_ATTRIBUTE(returns_nonnull) || \ + JSON_HEDLEY_GCC_VERSION_CHECK(4,9,0) || \ + JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) + #define JSON_HEDLEY_RETURNS_NON_NULL __attribute__((__returns_nonnull__)) +#elif defined(_Ret_notnull_) /* SAL */ + #define JSON_HEDLEY_RETURNS_NON_NULL _Ret_notnull_ +#else + #define JSON_HEDLEY_RETURNS_NON_NULL +#endif + +#if defined(JSON_HEDLEY_ARRAY_PARAM) + #undef JSON_HEDLEY_ARRAY_PARAM +#endif +#if \ + defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) && \ + !defined(__STDC_NO_VLA__) && \ + !defined(__cplusplus) && \ + !defined(JSON_HEDLEY_PGI_VERSION) && \ + !defined(JSON_HEDLEY_TINYC_VERSION) + #define JSON_HEDLEY_ARRAY_PARAM(name) (name) +#else + #define JSON_HEDLEY_ARRAY_PARAM(name) +#endif + +#if defined(JSON_HEDLEY_IS_CONSTANT) + #undef JSON_HEDLEY_IS_CONSTANT +#endif +#if defined(JSON_HEDLEY_REQUIRE_CONSTEXPR) + #undef JSON_HEDLEY_REQUIRE_CONSTEXPR +#endif +/* JSON_HEDLEY_IS_CONSTEXPR_ is for + HEDLEY INTERNAL USE ONLY. API subject to change without notice. */ +#if defined(JSON_HEDLEY_IS_CONSTEXPR_) + #undef JSON_HEDLEY_IS_CONSTEXPR_ +#endif +#if \ + JSON_HEDLEY_HAS_BUILTIN(__builtin_constant_p) || \ + JSON_HEDLEY_GCC_VERSION_CHECK(3,4,0) || \ + JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \ + JSON_HEDLEY_TINYC_VERSION_CHECK(0,9,19) || \ + JSON_HEDLEY_ARM_VERSION_CHECK(4,1,0) || \ + JSON_HEDLEY_IBM_VERSION_CHECK(13,1,0) || \ + JSON_HEDLEY_TI_CL6X_VERSION_CHECK(6,1,0) || \ + (JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,10,0) && !defined(__cplusplus)) || \ + JSON_HEDLEY_CRAY_VERSION_CHECK(8,1,0) || \ + JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) + #define JSON_HEDLEY_IS_CONSTANT(expr) __builtin_constant_p(expr) +#endif +#if !defined(__cplusplus) +# if \ + JSON_HEDLEY_HAS_BUILTIN(__builtin_types_compatible_p) || \ + JSON_HEDLEY_GCC_VERSION_CHECK(3,4,0) || \ + JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \ + JSON_HEDLEY_IBM_VERSION_CHECK(13,1,0) || \ + JSON_HEDLEY_CRAY_VERSION_CHECK(8,1,0) || \ + JSON_HEDLEY_ARM_VERSION_CHECK(5,4,0) || \ + JSON_HEDLEY_TINYC_VERSION_CHECK(0,9,24) +#if defined(__INTPTR_TYPE__) + #define JSON_HEDLEY_IS_CONSTEXPR_(expr) __builtin_types_compatible_p(__typeof__((1 ? (void*) ((__INTPTR_TYPE__) ((expr) * 0)) : (int*) 0)), int*) +#else + #include + #define JSON_HEDLEY_IS_CONSTEXPR_(expr) __builtin_types_compatible_p(__typeof__((1 ? (void*) ((intptr_t) ((expr) * 0)) : (int*) 0)), int*) +#endif +# elif \ + ( \ + defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 201112L) && \ + !defined(JSON_HEDLEY_SUNPRO_VERSION) && \ + !defined(JSON_HEDLEY_PGI_VERSION) && \ + !defined(JSON_HEDLEY_IAR_VERSION)) || \ + (JSON_HEDLEY_HAS_EXTENSION(c_generic_selections) && !defined(JSON_HEDLEY_IAR_VERSION)) || \ + JSON_HEDLEY_GCC_VERSION_CHECK(4,9,0) || \ + JSON_HEDLEY_INTEL_VERSION_CHECK(17,0,0) || \ + JSON_HEDLEY_IBM_VERSION_CHECK(12,1,0) || \ + JSON_HEDLEY_ARM_VERSION_CHECK(5,3,0) +#if defined(__INTPTR_TYPE__) + #define JSON_HEDLEY_IS_CONSTEXPR_(expr) _Generic((1 ? (void*) ((__INTPTR_TYPE__) ((expr) * 0)) : (int*) 0), int*: 1, void*: 0) +#else + #include + #define JSON_HEDLEY_IS_CONSTEXPR_(expr) _Generic((1 ? (void*) ((intptr_t) * 0) : (int*) 0), int*: 1, void*: 0) +#endif +# elif \ + defined(JSON_HEDLEY_GCC_VERSION) || \ + defined(JSON_HEDLEY_INTEL_VERSION) || \ + defined(JSON_HEDLEY_TINYC_VERSION) || \ + defined(JSON_HEDLEY_TI_ARMCL_VERSION) || \ + JSON_HEDLEY_TI_CL430_VERSION_CHECK(18,12,0) || \ + defined(JSON_HEDLEY_TI_CL2000_VERSION) || \ + defined(JSON_HEDLEY_TI_CL6X_VERSION) || \ + defined(JSON_HEDLEY_TI_CL7X_VERSION) || \ + defined(JSON_HEDLEY_TI_CLPRU_VERSION) || \ + defined(__clang__) +# define JSON_HEDLEY_IS_CONSTEXPR_(expr) ( \ + sizeof(void) != \ + sizeof(*( \ + 1 ? \ + ((void*) ((expr) * 0L) ) : \ +((struct { char v[sizeof(void) * 2]; } *) 1) \ + ) \ + ) \ + ) +# endif +#endif +#if defined(JSON_HEDLEY_IS_CONSTEXPR_) + #if !defined(JSON_HEDLEY_IS_CONSTANT) + #define JSON_HEDLEY_IS_CONSTANT(expr) JSON_HEDLEY_IS_CONSTEXPR_(expr) + #endif + #define JSON_HEDLEY_REQUIRE_CONSTEXPR(expr) (JSON_HEDLEY_IS_CONSTEXPR_(expr) ? (expr) : (-1)) +#else + #if !defined(JSON_HEDLEY_IS_CONSTANT) + #define JSON_HEDLEY_IS_CONSTANT(expr) (0) + #endif + #define JSON_HEDLEY_REQUIRE_CONSTEXPR(expr) (expr) +#endif + +#if defined(JSON_HEDLEY_BEGIN_C_DECLS) + #undef JSON_HEDLEY_BEGIN_C_DECLS +#endif +#if defined(JSON_HEDLEY_END_C_DECLS) + #undef JSON_HEDLEY_END_C_DECLS +#endif +#if defined(JSON_HEDLEY_C_DECL) + #undef JSON_HEDLEY_C_DECL +#endif +#if defined(__cplusplus) + #define JSON_HEDLEY_BEGIN_C_DECLS extern "C" { + #define JSON_HEDLEY_END_C_DECLS } + #define JSON_HEDLEY_C_DECL extern "C" +#else + #define JSON_HEDLEY_BEGIN_C_DECLS + #define JSON_HEDLEY_END_C_DECLS + #define JSON_HEDLEY_C_DECL +#endif + +#if defined(JSON_HEDLEY_STATIC_ASSERT) + #undef JSON_HEDLEY_STATIC_ASSERT +#endif +#if \ + !defined(__cplusplus) && ( \ + (defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 201112L)) || \ + (JSON_HEDLEY_HAS_FEATURE(c_static_assert) && !defined(JSON_HEDLEY_INTEL_CL_VERSION)) || \ + JSON_HEDLEY_GCC_VERSION_CHECK(6,0,0) || \ + JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \ + defined(_Static_assert) \ + ) +# define JSON_HEDLEY_STATIC_ASSERT(expr, message) _Static_assert(expr, message) +#elif \ + (defined(__cplusplus) && (__cplusplus >= 201103L)) || \ + JSON_HEDLEY_MSVC_VERSION_CHECK(16,0,0) || \ + JSON_HEDLEY_INTEL_CL_VERSION_CHECK(2021,1,0) +# define JSON_HEDLEY_STATIC_ASSERT(expr, message) JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_(static_assert(expr, message)) +#else +# define JSON_HEDLEY_STATIC_ASSERT(expr, message) +#endif + +#if defined(JSON_HEDLEY_NULL) + #undef JSON_HEDLEY_NULL +#endif +#if defined(__cplusplus) + #if __cplusplus >= 201103L + #define JSON_HEDLEY_NULL JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_(nullptr) + #elif defined(NULL) + #define JSON_HEDLEY_NULL NULL + #else + #define JSON_HEDLEY_NULL JSON_HEDLEY_STATIC_CAST(void*, 0) + #endif +#elif defined(NULL) + #define JSON_HEDLEY_NULL NULL +#else + #define JSON_HEDLEY_NULL ((void*) 0) +#endif + +#if defined(JSON_HEDLEY_MESSAGE) + #undef JSON_HEDLEY_MESSAGE +#endif +#if JSON_HEDLEY_HAS_WARNING("-Wunknown-pragmas") +# define JSON_HEDLEY_MESSAGE(msg) \ + JSON_HEDLEY_DIAGNOSTIC_PUSH \ + JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS \ + JSON_HEDLEY_PRAGMA(message msg) \ + JSON_HEDLEY_DIAGNOSTIC_POP +#elif \ + JSON_HEDLEY_GCC_VERSION_CHECK(4,4,0) || \ + JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) +# define JSON_HEDLEY_MESSAGE(msg) JSON_HEDLEY_PRAGMA(message msg) +#elif JSON_HEDLEY_CRAY_VERSION_CHECK(5,0,0) +# define JSON_HEDLEY_MESSAGE(msg) JSON_HEDLEY_PRAGMA(_CRI message msg) +#elif JSON_HEDLEY_IAR_VERSION_CHECK(8,0,0) +# define JSON_HEDLEY_MESSAGE(msg) JSON_HEDLEY_PRAGMA(message(msg)) +#elif JSON_HEDLEY_PELLES_VERSION_CHECK(2,0,0) +# define JSON_HEDLEY_MESSAGE(msg) JSON_HEDLEY_PRAGMA(message(msg)) +#else +# define JSON_HEDLEY_MESSAGE(msg) +#endif + +#if defined(JSON_HEDLEY_WARNING) + #undef JSON_HEDLEY_WARNING +#endif +#if JSON_HEDLEY_HAS_WARNING("-Wunknown-pragmas") +# define JSON_HEDLEY_WARNING(msg) \ + JSON_HEDLEY_DIAGNOSTIC_PUSH \ + JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS \ + JSON_HEDLEY_PRAGMA(clang warning msg) \ + JSON_HEDLEY_DIAGNOSTIC_POP +#elif \ + JSON_HEDLEY_GCC_VERSION_CHECK(4,8,0) || \ + JSON_HEDLEY_PGI_VERSION_CHECK(18,4,0) || \ + JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) +# define JSON_HEDLEY_WARNING(msg) JSON_HEDLEY_PRAGMA(GCC warning msg) +#elif \ + JSON_HEDLEY_MSVC_VERSION_CHECK(15,0,0) || \ + JSON_HEDLEY_INTEL_CL_VERSION_CHECK(2021,1,0) +# define JSON_HEDLEY_WARNING(msg) JSON_HEDLEY_PRAGMA(message(msg)) +#else +# define JSON_HEDLEY_WARNING(msg) JSON_HEDLEY_MESSAGE(msg) +#endif + +#if defined(JSON_HEDLEY_REQUIRE) + #undef JSON_HEDLEY_REQUIRE +#endif +#if defined(JSON_HEDLEY_REQUIRE_MSG) + #undef JSON_HEDLEY_REQUIRE_MSG +#endif +#if JSON_HEDLEY_HAS_ATTRIBUTE(diagnose_if) +# if JSON_HEDLEY_HAS_WARNING("-Wgcc-compat") +# define JSON_HEDLEY_REQUIRE(expr) \ + JSON_HEDLEY_DIAGNOSTIC_PUSH \ + _Pragma("clang diagnostic ignored \"-Wgcc-compat\"") \ + __attribute__((diagnose_if(!(expr), #expr, "error"))) \ + JSON_HEDLEY_DIAGNOSTIC_POP +# define JSON_HEDLEY_REQUIRE_MSG(expr,msg) \ + JSON_HEDLEY_DIAGNOSTIC_PUSH \ + _Pragma("clang diagnostic ignored \"-Wgcc-compat\"") \ + __attribute__((diagnose_if(!(expr), msg, "error"))) \ + JSON_HEDLEY_DIAGNOSTIC_POP +# else +# define JSON_HEDLEY_REQUIRE(expr) __attribute__((diagnose_if(!(expr), #expr, "error"))) +# define JSON_HEDLEY_REQUIRE_MSG(expr,msg) __attribute__((diagnose_if(!(expr), msg, "error"))) +# endif +#else +# define JSON_HEDLEY_REQUIRE(expr) +# define JSON_HEDLEY_REQUIRE_MSG(expr,msg) +#endif + +#if defined(JSON_HEDLEY_FLAGS) + #undef JSON_HEDLEY_FLAGS +#endif +#if JSON_HEDLEY_HAS_ATTRIBUTE(flag_enum) && (!defined(__cplusplus) || JSON_HEDLEY_HAS_WARNING("-Wbitfield-enum-conversion")) + #define JSON_HEDLEY_FLAGS __attribute__((__flag_enum__)) +#else + #define JSON_HEDLEY_FLAGS +#endif + +#if defined(JSON_HEDLEY_FLAGS_CAST) + #undef JSON_HEDLEY_FLAGS_CAST +#endif +#if JSON_HEDLEY_INTEL_VERSION_CHECK(19,0,0) +# define JSON_HEDLEY_FLAGS_CAST(T, expr) (__extension__ ({ \ + JSON_HEDLEY_DIAGNOSTIC_PUSH \ + _Pragma("warning(disable:188)") \ + ((T) (expr)); \ + JSON_HEDLEY_DIAGNOSTIC_POP \ + })) +#else +# define JSON_HEDLEY_FLAGS_CAST(T, expr) JSON_HEDLEY_STATIC_CAST(T, expr) +#endif + +#if defined(JSON_HEDLEY_EMPTY_BASES) + #undef JSON_HEDLEY_EMPTY_BASES +#endif +#if \ + (JSON_HEDLEY_MSVC_VERSION_CHECK(19,0,23918) && !JSON_HEDLEY_MSVC_VERSION_CHECK(20,0,0)) || \ + JSON_HEDLEY_INTEL_CL_VERSION_CHECK(2021,1,0) + #define JSON_HEDLEY_EMPTY_BASES __declspec(empty_bases) +#else + #define JSON_HEDLEY_EMPTY_BASES +#endif + +/* Remaining macros are deprecated. */ + +#if defined(JSON_HEDLEY_GCC_NOT_CLANG_VERSION_CHECK) + #undef JSON_HEDLEY_GCC_NOT_CLANG_VERSION_CHECK +#endif +#if defined(__clang__) + #define JSON_HEDLEY_GCC_NOT_CLANG_VERSION_CHECK(major,minor,patch) (0) +#else + #define JSON_HEDLEY_GCC_NOT_CLANG_VERSION_CHECK(major,minor,patch) JSON_HEDLEY_GCC_VERSION_CHECK(major,minor,patch) +#endif + +#if defined(JSON_HEDLEY_CLANG_HAS_ATTRIBUTE) + #undef JSON_HEDLEY_CLANG_HAS_ATTRIBUTE +#endif +#define JSON_HEDLEY_CLANG_HAS_ATTRIBUTE(attribute) JSON_HEDLEY_HAS_ATTRIBUTE(attribute) + +#if defined(JSON_HEDLEY_CLANG_HAS_CPP_ATTRIBUTE) + #undef JSON_HEDLEY_CLANG_HAS_CPP_ATTRIBUTE +#endif +#define JSON_HEDLEY_CLANG_HAS_CPP_ATTRIBUTE(attribute) JSON_HEDLEY_HAS_CPP_ATTRIBUTE(attribute) + +#if defined(JSON_HEDLEY_CLANG_HAS_BUILTIN) + #undef JSON_HEDLEY_CLANG_HAS_BUILTIN +#endif +#define JSON_HEDLEY_CLANG_HAS_BUILTIN(builtin) JSON_HEDLEY_HAS_BUILTIN(builtin) + +#if defined(JSON_HEDLEY_CLANG_HAS_FEATURE) + #undef JSON_HEDLEY_CLANG_HAS_FEATURE +#endif +#define JSON_HEDLEY_CLANG_HAS_FEATURE(feature) JSON_HEDLEY_HAS_FEATURE(feature) + +#if defined(JSON_HEDLEY_CLANG_HAS_EXTENSION) + #undef JSON_HEDLEY_CLANG_HAS_EXTENSION +#endif +#define JSON_HEDLEY_CLANG_HAS_EXTENSION(extension) JSON_HEDLEY_HAS_EXTENSION(extension) + +#if defined(JSON_HEDLEY_CLANG_HAS_DECLSPEC_DECLSPEC_ATTRIBUTE) + #undef JSON_HEDLEY_CLANG_HAS_DECLSPEC_DECLSPEC_ATTRIBUTE +#endif +#define JSON_HEDLEY_CLANG_HAS_DECLSPEC_ATTRIBUTE(attribute) JSON_HEDLEY_HAS_DECLSPEC_ATTRIBUTE(attribute) + +#if defined(JSON_HEDLEY_CLANG_HAS_WARNING) + #undef JSON_HEDLEY_CLANG_HAS_WARNING +#endif +#define JSON_HEDLEY_CLANG_HAS_WARNING(warning) JSON_HEDLEY_HAS_WARNING(warning) + +#endif /* !defined(JSON_HEDLEY_VERSION) || (JSON_HEDLEY_VERSION < X) */ + + +// This file contains all internal macro definitions (except those affecting ABI) +// You MUST include macro_unscope.hpp at the end of json.hpp to undef all of them + +// #include + + +// exclude unsupported compilers +#if !defined(JSON_SKIP_UNSUPPORTED_COMPILER_CHECK) + #if defined(__clang__) + #if (__clang_major__ * 10000 + __clang_minor__ * 100 + __clang_patchlevel__) < 30400 + #error "unsupported Clang version - see https://github.com/nlohmann/json#supported-compilers" + #endif + #elif defined(__GNUC__) && !(defined(__ICC) || defined(__INTEL_COMPILER)) + #if (__GNUC__ * 10000 + __GNUC_MINOR__ * 100 + __GNUC_PATCHLEVEL__) < 40800 + #error "unsupported GCC version - see https://github.com/nlohmann/json#supported-compilers" + #endif + #endif +#endif + +// C++ language standard detection +// if the user manually specified the used c++ version this is skipped +#if !defined(JSON_HAS_CPP_23) && !defined(JSON_HAS_CPP_20) && !defined(JSON_HAS_CPP_17) && !defined(JSON_HAS_CPP_14) && !defined(JSON_HAS_CPP_11) + #if (defined(__cplusplus) && __cplusplus > 202002L) || (defined(_MSVC_LANG) && _MSVC_LANG > 202002L) + #define JSON_HAS_CPP_23 + #define JSON_HAS_CPP_20 + #define JSON_HAS_CPP_17 + #define JSON_HAS_CPP_14 + #elif (defined(__cplusplus) && __cplusplus > 201703L) || (defined(_MSVC_LANG) && _MSVC_LANG > 201703L) + #define JSON_HAS_CPP_20 + #define JSON_HAS_CPP_17 + #define JSON_HAS_CPP_14 + #elif (defined(__cplusplus) && __cplusplus > 201402L) || (defined(_HAS_CXX17) && _HAS_CXX17 == 1) // fix for issue #464 + #define JSON_HAS_CPP_17 + #define JSON_HAS_CPP_14 + #elif (defined(__cplusplus) && __cplusplus > 201103L) || (defined(_HAS_CXX14) && _HAS_CXX14 == 1) + #define JSON_HAS_CPP_14 + #endif + // the cpp 11 flag is always specified because it is the minimal required version + #define JSON_HAS_CPP_11 +#endif + +#ifdef __has_include + #if __has_include() + #include + #endif +#endif + +#if !defined(JSON_HAS_FILESYSTEM) && !defined(JSON_HAS_EXPERIMENTAL_FILESYSTEM) + #ifdef JSON_HAS_CPP_17 + #if defined(__cpp_lib_filesystem) + #define JSON_HAS_FILESYSTEM 1 + #elif defined(__cpp_lib_experimental_filesystem) + #define JSON_HAS_EXPERIMENTAL_FILESYSTEM 1 + #elif !defined(__has_include) + #define JSON_HAS_EXPERIMENTAL_FILESYSTEM 1 + #elif __has_include() + #define JSON_HAS_FILESYSTEM 1 + #elif __has_include() + #define JSON_HAS_EXPERIMENTAL_FILESYSTEM 1 + #endif + + // std::filesystem does not work on MinGW GCC 8: https://sourceforge.net/p/mingw-w64/bugs/737/ + #if defined(__MINGW32__) && defined(__GNUC__) && __GNUC__ == 8 + #undef JSON_HAS_FILESYSTEM + #undef JSON_HAS_EXPERIMENTAL_FILESYSTEM + #endif + + // no filesystem support before GCC 8: https://en.cppreference.com/w/cpp/compiler_support + #if defined(__GNUC__) && !defined(__clang__) && __GNUC__ < 8 + #undef JSON_HAS_FILESYSTEM + #undef JSON_HAS_EXPERIMENTAL_FILESYSTEM + #endif + + // no filesystem support before Clang 7: https://en.cppreference.com/w/cpp/compiler_support + #if defined(__clang_major__) && __clang_major__ < 7 + #undef JSON_HAS_FILESYSTEM + #undef JSON_HAS_EXPERIMENTAL_FILESYSTEM + #endif + + // no filesystem support before MSVC 19.14: https://en.cppreference.com/w/cpp/compiler_support + #if defined(_MSC_VER) && _MSC_VER < 1914 + #undef JSON_HAS_FILESYSTEM + #undef JSON_HAS_EXPERIMENTAL_FILESYSTEM + #endif + + // no filesystem support before iOS 13 + #if defined(__IPHONE_OS_VERSION_MIN_REQUIRED) && __IPHONE_OS_VERSION_MIN_REQUIRED < 130000 + #undef JSON_HAS_FILESYSTEM + #undef JSON_HAS_EXPERIMENTAL_FILESYSTEM + #endif + + // no filesystem support before macOS Catalina + #if defined(__MAC_OS_X_VERSION_MIN_REQUIRED) && __MAC_OS_X_VERSION_MIN_REQUIRED < 101500 + #undef JSON_HAS_FILESYSTEM + #undef JSON_HAS_EXPERIMENTAL_FILESYSTEM + #endif + #endif +#endif + +#ifndef JSON_HAS_EXPERIMENTAL_FILESYSTEM + #define JSON_HAS_EXPERIMENTAL_FILESYSTEM 0 +#endif + +#ifndef JSON_HAS_FILESYSTEM + #define JSON_HAS_FILESYSTEM 0 +#endif + +#ifndef JSON_HAS_THREE_WAY_COMPARISON + #if defined(__cpp_impl_three_way_comparison) && __cpp_impl_three_way_comparison >= 201907L \ + && defined(__cpp_lib_three_way_comparison) && __cpp_lib_three_way_comparison >= 201907L + #define JSON_HAS_THREE_WAY_COMPARISON 1 + #else + #define JSON_HAS_THREE_WAY_COMPARISON 0 + #endif +#endif + +#ifndef JSON_HAS_RANGES + // ranges header shipping in GCC 11.1.0 (released 2021-04-27) has syntax error + #if defined(__GLIBCXX__) && __GLIBCXX__ == 20210427 + #define JSON_HAS_RANGES 0 + #elif defined(__cpp_lib_ranges) + #define JSON_HAS_RANGES 1 + #else + #define JSON_HAS_RANGES 0 + #endif +#endif + +#ifndef JSON_HAS_STATIC_RTTI + #if !defined(_HAS_STATIC_RTTI) || _HAS_STATIC_RTTI != 0 + #define JSON_HAS_STATIC_RTTI 1 + #else + #define JSON_HAS_STATIC_RTTI 0 + #endif +#endif + +#ifdef JSON_HAS_CPP_17 + #define JSON_INLINE_VARIABLE inline +#else + #define JSON_INLINE_VARIABLE +#endif + +#if JSON_HEDLEY_HAS_ATTRIBUTE(no_unique_address) + #define JSON_NO_UNIQUE_ADDRESS [[no_unique_address]] +#else + #define JSON_NO_UNIQUE_ADDRESS +#endif + +// disable documentation warnings on clang +#if defined(__clang__) + #pragma clang diagnostic push + #pragma clang diagnostic ignored "-Wdocumentation" + #pragma clang diagnostic ignored "-Wdocumentation-unknown-command" +#endif + +// allow disabling exceptions +#if (defined(__cpp_exceptions) || defined(__EXCEPTIONS) || defined(_CPPUNWIND)) && !defined(JSON_NOEXCEPTION) + #define JSON_THROW(exception) throw exception + #define JSON_TRY try + #define JSON_CATCH(exception) catch(exception) + #define JSON_INTERNAL_CATCH(exception) catch(exception) +#else + #include + #define JSON_THROW(exception) std::abort() + #define JSON_TRY if(true) + #define JSON_CATCH(exception) if(false) + #define JSON_INTERNAL_CATCH(exception) if(false) +#endif + +// override exception macros +#if defined(JSON_THROW_USER) + #undef JSON_THROW + #define JSON_THROW JSON_THROW_USER +#endif +#if defined(JSON_TRY_USER) + #undef JSON_TRY + #define JSON_TRY JSON_TRY_USER +#endif +#if defined(JSON_CATCH_USER) + #undef JSON_CATCH + #define JSON_CATCH JSON_CATCH_USER + #undef JSON_INTERNAL_CATCH + #define JSON_INTERNAL_CATCH JSON_CATCH_USER +#endif +#if defined(JSON_INTERNAL_CATCH_USER) + #undef JSON_INTERNAL_CATCH + #define JSON_INTERNAL_CATCH JSON_INTERNAL_CATCH_USER +#endif + +// allow overriding assert +#if !defined(JSON_ASSERT) + #include // assert + #define JSON_ASSERT(x) assert(x) +#endif + +// allow to access some private functions (needed by the test suite) +#if defined(JSON_TESTS_PRIVATE) + #define JSON_PRIVATE_UNLESS_TESTED public +#else + #define JSON_PRIVATE_UNLESS_TESTED private +#endif + +/*! +@brief macro to briefly define a mapping between an enum and JSON +@def NLOHMANN_JSON_SERIALIZE_ENUM +@since version 3.4.0 +*/ +#define NLOHMANN_JSON_SERIALIZE_ENUM(ENUM_TYPE, ...) \ + template \ + inline void to_json(BasicJsonType& j, const ENUM_TYPE& e) \ + { \ + /* NOLINTNEXTLINE(modernize-type-traits) we use C++11 */ \ + static_assert(std::is_enum::value, #ENUM_TYPE " must be an enum!"); \ + /* NOLINTNEXTLINE(modernize-avoid-c-arrays) we don't want to depend on */ \ + static const std::pair m[] = __VA_ARGS__; \ + auto it = std::find_if(std::begin(m), std::end(m), \ + [e](const std::pair& ej_pair) -> bool \ + { \ + return ej_pair.first == e; \ + }); \ + j = ((it != std::end(m)) ? it : std::begin(m))->second; \ + } \ + template \ + inline void from_json(const BasicJsonType& j, ENUM_TYPE& e) \ + { \ + /* NOLINTNEXTLINE(modernize-type-traits) we use C++11 */ \ + static_assert(std::is_enum::value, #ENUM_TYPE " must be an enum!"); \ + /* NOLINTNEXTLINE(modernize-avoid-c-arrays) we don't want to depend on */ \ + static const std::pair m[] = __VA_ARGS__; \ + auto it = std::find_if(std::begin(m), std::end(m), \ + [&j](const std::pair& ej_pair) -> bool \ + { \ + return ej_pair.second == j; \ + }); \ + e = ((it != std::end(m)) ? it : std::begin(m))->first; \ + } + +// Ugly macros to avoid uglier copy-paste when specializing basic_json. They +// may be removed in the future once the class is split. + +#define NLOHMANN_BASIC_JSON_TPL_DECLARATION \ + template class ObjectType, \ + template class ArrayType, \ + class StringType, class BooleanType, class NumberIntegerType, \ + class NumberUnsignedType, class NumberFloatType, \ + template class AllocatorType, \ + template class JSONSerializer, \ + class BinaryType, \ + class CustomBaseClass> + +#define NLOHMANN_BASIC_JSON_TPL \ + basic_json + +// Macros to simplify conversion from/to types + +#define NLOHMANN_JSON_EXPAND( x ) x +#define NLOHMANN_JSON_GET_MACRO(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63, _64, NAME,...) NAME +#define NLOHMANN_JSON_PASTE(...) NLOHMANN_JSON_EXPAND(NLOHMANN_JSON_GET_MACRO(__VA_ARGS__, \ + NLOHMANN_JSON_PASTE64, \ + NLOHMANN_JSON_PASTE63, \ + NLOHMANN_JSON_PASTE62, \ + NLOHMANN_JSON_PASTE61, \ + NLOHMANN_JSON_PASTE60, \ + NLOHMANN_JSON_PASTE59, \ + NLOHMANN_JSON_PASTE58, \ + NLOHMANN_JSON_PASTE57, \ + NLOHMANN_JSON_PASTE56, \ + NLOHMANN_JSON_PASTE55, \ + NLOHMANN_JSON_PASTE54, \ + NLOHMANN_JSON_PASTE53, \ + NLOHMANN_JSON_PASTE52, \ + NLOHMANN_JSON_PASTE51, \ + NLOHMANN_JSON_PASTE50, \ + NLOHMANN_JSON_PASTE49, \ + NLOHMANN_JSON_PASTE48, \ + NLOHMANN_JSON_PASTE47, \ + NLOHMANN_JSON_PASTE46, \ + NLOHMANN_JSON_PASTE45, \ + NLOHMANN_JSON_PASTE44, \ + NLOHMANN_JSON_PASTE43, \ + NLOHMANN_JSON_PASTE42, \ + NLOHMANN_JSON_PASTE41, \ + NLOHMANN_JSON_PASTE40, \ + NLOHMANN_JSON_PASTE39, \ + NLOHMANN_JSON_PASTE38, \ + NLOHMANN_JSON_PASTE37, \ + NLOHMANN_JSON_PASTE36, \ + NLOHMANN_JSON_PASTE35, \ + NLOHMANN_JSON_PASTE34, \ + NLOHMANN_JSON_PASTE33, \ + NLOHMANN_JSON_PASTE32, \ + NLOHMANN_JSON_PASTE31, \ + NLOHMANN_JSON_PASTE30, \ + NLOHMANN_JSON_PASTE29, \ + NLOHMANN_JSON_PASTE28, \ + NLOHMANN_JSON_PASTE27, \ + NLOHMANN_JSON_PASTE26, \ + NLOHMANN_JSON_PASTE25, \ + NLOHMANN_JSON_PASTE24, \ + NLOHMANN_JSON_PASTE23, \ + NLOHMANN_JSON_PASTE22, \ + NLOHMANN_JSON_PASTE21, \ + NLOHMANN_JSON_PASTE20, \ + NLOHMANN_JSON_PASTE19, \ + NLOHMANN_JSON_PASTE18, \ + NLOHMANN_JSON_PASTE17, \ + NLOHMANN_JSON_PASTE16, \ + NLOHMANN_JSON_PASTE15, \ + NLOHMANN_JSON_PASTE14, \ + NLOHMANN_JSON_PASTE13, \ + NLOHMANN_JSON_PASTE12, \ + NLOHMANN_JSON_PASTE11, \ + NLOHMANN_JSON_PASTE10, \ + NLOHMANN_JSON_PASTE9, \ + NLOHMANN_JSON_PASTE8, \ + NLOHMANN_JSON_PASTE7, \ + NLOHMANN_JSON_PASTE6, \ + NLOHMANN_JSON_PASTE5, \ + NLOHMANN_JSON_PASTE4, \ + NLOHMANN_JSON_PASTE3, \ + NLOHMANN_JSON_PASTE2, \ + NLOHMANN_JSON_PASTE1)(__VA_ARGS__)) +#define NLOHMANN_JSON_PASTE2(func, v1) func(v1) +#define NLOHMANN_JSON_PASTE3(func, v1, v2) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE2(func, v2) +#define NLOHMANN_JSON_PASTE4(func, v1, v2, v3) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE3(func, v2, v3) +#define NLOHMANN_JSON_PASTE5(func, v1, v2, v3, v4) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE4(func, v2, v3, v4) +#define NLOHMANN_JSON_PASTE6(func, v1, v2, v3, v4, v5) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE5(func, v2, v3, v4, v5) +#define NLOHMANN_JSON_PASTE7(func, v1, v2, v3, v4, v5, v6) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE6(func, v2, v3, v4, v5, v6) +#define NLOHMANN_JSON_PASTE8(func, v1, v2, v3, v4, v5, v6, v7) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE7(func, v2, v3, v4, v5, v6, v7) +#define NLOHMANN_JSON_PASTE9(func, v1, v2, v3, v4, v5, v6, v7, v8) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE8(func, v2, v3, v4, v5, v6, v7, v8) +#define NLOHMANN_JSON_PASTE10(func, v1, v2, v3, v4, v5, v6, v7, v8, v9) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE9(func, v2, v3, v4, v5, v6, v7, v8, v9) +#define NLOHMANN_JSON_PASTE11(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE10(func, v2, v3, v4, v5, v6, v7, v8, v9, v10) +#define NLOHMANN_JSON_PASTE12(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE11(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11) +#define NLOHMANN_JSON_PASTE13(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE12(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12) +#define NLOHMANN_JSON_PASTE14(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE13(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13) +#define NLOHMANN_JSON_PASTE15(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE14(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14) +#define NLOHMANN_JSON_PASTE16(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE15(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15) +#define NLOHMANN_JSON_PASTE17(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE16(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16) +#define NLOHMANN_JSON_PASTE18(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE17(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17) +#define NLOHMANN_JSON_PASTE19(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE18(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18) +#define NLOHMANN_JSON_PASTE20(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE19(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19) +#define NLOHMANN_JSON_PASTE21(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE20(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20) +#define NLOHMANN_JSON_PASTE22(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE21(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21) +#define NLOHMANN_JSON_PASTE23(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE22(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22) +#define NLOHMANN_JSON_PASTE24(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE23(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23) +#define NLOHMANN_JSON_PASTE25(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE24(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24) +#define NLOHMANN_JSON_PASTE26(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE25(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25) +#define NLOHMANN_JSON_PASTE27(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE26(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26) +#define NLOHMANN_JSON_PASTE28(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE27(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27) +#define NLOHMANN_JSON_PASTE29(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE28(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28) +#define NLOHMANN_JSON_PASTE30(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE29(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29) +#define NLOHMANN_JSON_PASTE31(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE30(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30) +#define NLOHMANN_JSON_PASTE32(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE31(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31) +#define NLOHMANN_JSON_PASTE33(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE32(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32) +#define NLOHMANN_JSON_PASTE34(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE33(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33) +#define NLOHMANN_JSON_PASTE35(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE34(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34) +#define NLOHMANN_JSON_PASTE36(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE35(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35) +#define NLOHMANN_JSON_PASTE37(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE36(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36) +#define NLOHMANN_JSON_PASTE38(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE37(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37) +#define NLOHMANN_JSON_PASTE39(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE38(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38) +#define NLOHMANN_JSON_PASTE40(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE39(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39) +#define NLOHMANN_JSON_PASTE41(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE40(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40) +#define NLOHMANN_JSON_PASTE42(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE41(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41) +#define NLOHMANN_JSON_PASTE43(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE42(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42) +#define NLOHMANN_JSON_PASTE44(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE43(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43) +#define NLOHMANN_JSON_PASTE45(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE44(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44) +#define NLOHMANN_JSON_PASTE46(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE45(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45) +#define NLOHMANN_JSON_PASTE47(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE46(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46) +#define NLOHMANN_JSON_PASTE48(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE47(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47) +#define NLOHMANN_JSON_PASTE49(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE48(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48) +#define NLOHMANN_JSON_PASTE50(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE49(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49) +#define NLOHMANN_JSON_PASTE51(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE50(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50) +#define NLOHMANN_JSON_PASTE52(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE51(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51) +#define NLOHMANN_JSON_PASTE53(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE52(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52) +#define NLOHMANN_JSON_PASTE54(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE53(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53) +#define NLOHMANN_JSON_PASTE55(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE54(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54) +#define NLOHMANN_JSON_PASTE56(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE55(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55) +#define NLOHMANN_JSON_PASTE57(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE56(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56) +#define NLOHMANN_JSON_PASTE58(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, v57) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE57(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, v57) +#define NLOHMANN_JSON_PASTE59(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, v57, v58) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE58(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, v57, v58) +#define NLOHMANN_JSON_PASTE60(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, v57, v58, v59) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE59(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, v57, v58, v59) +#define NLOHMANN_JSON_PASTE61(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, v57, v58, v59, v60) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE60(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, v57, v58, v59, v60) +#define NLOHMANN_JSON_PASTE62(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, v57, v58, v59, v60, v61) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE61(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, v57, v58, v59, v60, v61) +#define NLOHMANN_JSON_PASTE63(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, v57, v58, v59, v60, v61, v62) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE62(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, v57, v58, v59, v60, v61, v62) +#define NLOHMANN_JSON_PASTE64(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, v57, v58, v59, v60, v61, v62, v63) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE63(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, v57, v58, v59, v60, v61, v62, v63) + +#define NLOHMANN_JSON_TO(v1) nlohmann_json_j[#v1] = nlohmann_json_t.v1; +#define NLOHMANN_JSON_FROM(v1) nlohmann_json_j.at(#v1).get_to(nlohmann_json_t.v1); +#define NLOHMANN_JSON_FROM_WITH_DEFAULT(v1) nlohmann_json_t.v1 = !nlohmann_json_j.is_null() ? nlohmann_json_j.value(#v1, nlohmann_json_default_obj.v1) : nlohmann_json_default_obj.v1; + +/*! +@brief macro +@def NLOHMANN_DEFINE_TYPE_INTRUSIVE +@since version 3.9.0 +@sa https://json.nlohmann.me/api/macros/nlohmann_define_type_intrusive/ +*/ +#define NLOHMANN_DEFINE_TYPE_INTRUSIVE(Type, ...) \ + template::value, int> = 0> \ + friend void to_json(BasicJsonType& nlohmann_json_j, const Type& nlohmann_json_t) { NLOHMANN_JSON_EXPAND(NLOHMANN_JSON_PASTE(NLOHMANN_JSON_TO, __VA_ARGS__)) } \ + template::value, int> = 0> \ + friend void from_json(const BasicJsonType& nlohmann_json_j, Type& nlohmann_json_t) { NLOHMANN_JSON_EXPAND(NLOHMANN_JSON_PASTE(NLOHMANN_JSON_FROM, __VA_ARGS__)) } + +/*! +@brief macro +@def NLOHMANN_DEFINE_TYPE_INTRUSIVE_WITH_DEFAULT +@since version 3.11.0 +@sa https://json.nlohmann.me/api/macros/nlohmann_define_type_intrusive/ +*/ +#define NLOHMANN_DEFINE_TYPE_INTRUSIVE_WITH_DEFAULT(Type, ...) \ + template::value, int> = 0> \ + friend void to_json(BasicJsonType& nlohmann_json_j, const Type& nlohmann_json_t) { NLOHMANN_JSON_EXPAND(NLOHMANN_JSON_PASTE(NLOHMANN_JSON_TO, __VA_ARGS__)) } \ + template::value, int> = 0> \ + friend void from_json(const BasicJsonType& nlohmann_json_j, Type& nlohmann_json_t) { const Type nlohmann_json_default_obj{}; NLOHMANN_JSON_EXPAND(NLOHMANN_JSON_PASTE(NLOHMANN_JSON_FROM_WITH_DEFAULT, __VA_ARGS__)) } + +/*! +@brief macro +@def NLOHMANN_DEFINE_TYPE_INTRUSIVE_ONLY_SERIALIZE +@since version 3.11.3 +@sa https://json.nlohmann.me/api/macros/nlohmann_define_type_intrusive/ +*/ +#define NLOHMANN_DEFINE_TYPE_INTRUSIVE_ONLY_SERIALIZE(Type, ...) \ + template::value, int> = 0> \ + friend void to_json(BasicJsonType& nlohmann_json_j, const Type& nlohmann_json_t) { NLOHMANN_JSON_EXPAND(NLOHMANN_JSON_PASTE(NLOHMANN_JSON_TO, __VA_ARGS__)) } + +/*! +@brief macro +@def NLOHMANN_DEFINE_TYPE_NON_INTRUSIVE +@since version 3.9.0 +@sa https://json.nlohmann.me/api/macros/nlohmann_define_type_non_intrusive/ +*/ +#define NLOHMANN_DEFINE_TYPE_NON_INTRUSIVE(Type, ...) \ + template::value, int> = 0> \ + void to_json(BasicJsonType& nlohmann_json_j, const Type& nlohmann_json_t) { NLOHMANN_JSON_EXPAND(NLOHMANN_JSON_PASTE(NLOHMANN_JSON_TO, __VA_ARGS__)) } \ + template::value, int> = 0> \ + void from_json(const BasicJsonType& nlohmann_json_j, Type& nlohmann_json_t) { NLOHMANN_JSON_EXPAND(NLOHMANN_JSON_PASTE(NLOHMANN_JSON_FROM, __VA_ARGS__)) } + +/*! +@brief macro +@def NLOHMANN_DEFINE_TYPE_NON_INTRUSIVE_WITH_DEFAULT +@since version 3.11.0 +@sa https://json.nlohmann.me/api/macros/nlohmann_define_type_non_intrusive/ +*/ +#define NLOHMANN_DEFINE_TYPE_NON_INTRUSIVE_WITH_DEFAULT(Type, ...) \ + template::value, int> = 0> \ + void to_json(BasicJsonType& nlohmann_json_j, const Type& nlohmann_json_t) { NLOHMANN_JSON_EXPAND(NLOHMANN_JSON_PASTE(NLOHMANN_JSON_TO, __VA_ARGS__)) } \ + template::value, int> = 0> \ + void from_json(const BasicJsonType& nlohmann_json_j, Type& nlohmann_json_t) { const Type nlohmann_json_default_obj{}; NLOHMANN_JSON_EXPAND(NLOHMANN_JSON_PASTE(NLOHMANN_JSON_FROM_WITH_DEFAULT, __VA_ARGS__)) } + +/*! +@brief macro +@def NLOHMANN_DEFINE_TYPE_NON_INTRUSIVE_ONLY_SERIALIZE +@since version 3.11.3 +@sa https://json.nlohmann.me/api/macros/nlohmann_define_type_non_intrusive/ +*/ +#define NLOHMANN_DEFINE_TYPE_NON_INTRUSIVE_ONLY_SERIALIZE(Type, ...) \ + template::value, int> = 0> \ + void to_json(BasicJsonType& nlohmann_json_j, const Type& nlohmann_json_t) { NLOHMANN_JSON_EXPAND(NLOHMANN_JSON_PASTE(NLOHMANN_JSON_TO, __VA_ARGS__)) } + +/*! +@brief macro +@def NLOHMANN_DEFINE_DERIVED_TYPE_INTRUSIVE +@since version 3.12.0 +@sa https://json.nlohmann.me/api/macros/nlohmann_define_derived_type/ +*/ +#define NLOHMANN_DEFINE_DERIVED_TYPE_INTRUSIVE(Type, BaseType, ...) \ + template::value, int> = 0> \ + friend void to_json(BasicJsonType& nlohmann_json_j, const Type& nlohmann_json_t) { nlohmann::to_json(nlohmann_json_j, static_cast(nlohmann_json_t)); NLOHMANN_JSON_EXPAND(NLOHMANN_JSON_PASTE(NLOHMANN_JSON_TO, __VA_ARGS__)) } \ + template::value, int> = 0> \ + friend void from_json(const BasicJsonType& nlohmann_json_j, Type& nlohmann_json_t) { nlohmann::from_json(nlohmann_json_j, static_cast(nlohmann_json_t)); NLOHMANN_JSON_EXPAND(NLOHMANN_JSON_PASTE(NLOHMANN_JSON_FROM, __VA_ARGS__)) } + +/*! +@brief macro +@def NLOHMANN_DEFINE_DERIVED_TYPE_INTRUSIVE_WITH_DEFAULT +@since version 3.12.0 +@sa https://json.nlohmann.me/api/macros/nlohmann_define_derived_type/ +*/ +#define NLOHMANN_DEFINE_DERIVED_TYPE_INTRUSIVE_WITH_DEFAULT(Type, BaseType, ...) \ + template::value, int> = 0> \ + friend void to_json(BasicJsonType& nlohmann_json_j, const Type& nlohmann_json_t) { nlohmann::to_json(nlohmann_json_j, static_cast(nlohmann_json_t)); NLOHMANN_JSON_EXPAND(NLOHMANN_JSON_PASTE(NLOHMANN_JSON_TO, __VA_ARGS__)) } \ + template::value, int> = 0> \ + friend void from_json(const BasicJsonType& nlohmann_json_j, Type& nlohmann_json_t) { nlohmann::from_json(nlohmann_json_j, static_cast(nlohmann_json_t)); const Type nlohmann_json_default_obj{}; NLOHMANN_JSON_EXPAND(NLOHMANN_JSON_PASTE(NLOHMANN_JSON_FROM_WITH_DEFAULT, __VA_ARGS__)) } + +/*! +@brief macro +@def NLOHMANN_DEFINE_DERIVED_TYPE_INTRUSIVE_ONLY_SERIALIZE +@since version 3.12.0 +@sa https://json.nlohmann.me/api/macros/nlohmann_define_derived_type/ +*/ +#define NLOHMANN_DEFINE_DERIVED_TYPE_INTRUSIVE_ONLY_SERIALIZE(Type, BaseType, ...) \ + template::value, int> = 0> \ + friend void to_json(BasicJsonType& nlohmann_json_j, const Type& nlohmann_json_t) { nlohmann::to_json(nlohmann_json_j, static_cast(nlohmann_json_t)); NLOHMANN_JSON_EXPAND(NLOHMANN_JSON_PASTE(NLOHMANN_JSON_TO, __VA_ARGS__)) } + +/*! +@brief macro +@def NLOHMANN_DEFINE_DERIVED_TYPE_NON_INTRUSIVE +@since version 3.12.0 +@sa https://json.nlohmann.me/api/macros/nlohmann_define_derived_type/ +*/ +#define NLOHMANN_DEFINE_DERIVED_TYPE_NON_INTRUSIVE(Type, BaseType, ...) \ + template::value, int> = 0> \ + void to_json(BasicJsonType& nlohmann_json_j, const Type& nlohmann_json_t) { nlohmann::to_json(nlohmann_json_j, static_cast(nlohmann_json_t)); NLOHMANN_JSON_EXPAND(NLOHMANN_JSON_PASTE(NLOHMANN_JSON_TO, __VA_ARGS__)) } \ + template::value, int> = 0> \ + void from_json(const BasicJsonType& nlohmann_json_j, Type& nlohmann_json_t) { nlohmann::from_json(nlohmann_json_j, static_cast(nlohmann_json_t)); NLOHMANN_JSON_EXPAND(NLOHMANN_JSON_PASTE(NLOHMANN_JSON_FROM, __VA_ARGS__)) } + +/*! +@brief macro +@def NLOHMANN_DEFINE_DERIVED_TYPE_NON_INTRUSIVE_WITH_DEFAULT +@since version 3.12.0 +@sa https://json.nlohmann.me/api/macros/nlohmann_define_derived_type/ +*/ +#define NLOHMANN_DEFINE_DERIVED_TYPE_NON_INTRUSIVE_WITH_DEFAULT(Type, BaseType, ...) \ + template::value, int> = 0> \ + void to_json(BasicJsonType& nlohmann_json_j, const Type& nlohmann_json_t) { nlohmann::to_json(nlohmann_json_j, static_cast(nlohmann_json_t)); NLOHMANN_JSON_EXPAND(NLOHMANN_JSON_PASTE(NLOHMANN_JSON_TO, __VA_ARGS__)) } \ + template::value, int> = 0> \ + void from_json(const BasicJsonType& nlohmann_json_j, Type& nlohmann_json_t) { nlohmann::from_json(nlohmann_json_j, static_cast(nlohmann_json_t)); const Type nlohmann_json_default_obj{}; NLOHMANN_JSON_EXPAND(NLOHMANN_JSON_PASTE(NLOHMANN_JSON_FROM_WITH_DEFAULT, __VA_ARGS__)) } + +/*! +@brief macro +@def NLOHMANN_DEFINE_DERIVED_TYPE_NON_INTRUSIVE_ONLY_SERIALIZE +@since version 3.12.0 +@sa https://json.nlohmann.me/api/macros/nlohmann_define_derived_type/ +*/ +#define NLOHMANN_DEFINE_DERIVED_TYPE_NON_INTRUSIVE_ONLY_SERIALIZE(Type, BaseType, ...) \ + template::value, int> = 0> \ + void to_json(BasicJsonType& nlohmann_json_j, const Type& nlohmann_json_t) { nlohmann::to_json(nlohmann_json_j, static_cast(nlohmann_json_t)); NLOHMANN_JSON_EXPAND(NLOHMANN_JSON_PASTE(NLOHMANN_JSON_TO, __VA_ARGS__)) } + +// inspired from https://stackoverflow.com/a/26745591 +// allows calling any std function as if (e.g., with begin): +// using std::begin; begin(x); +// +// it allows using the detected idiom to retrieve the return type +// of such an expression +#define NLOHMANN_CAN_CALL_STD_FUNC_IMPL(std_name) \ + namespace detail { \ + using std::std_name; \ + \ + template \ + using result_of_##std_name = decltype(std_name(std::declval()...)); \ + } \ + \ + namespace detail2 { \ + struct std_name##_tag \ + { \ + }; \ + \ + template \ + std_name##_tag std_name(T&&...); \ + \ + template \ + using result_of_##std_name = decltype(std_name(std::declval()...)); \ + \ + template \ + struct would_call_std_##std_name \ + { \ + static constexpr auto const value = ::nlohmann::detail:: \ + is_detected_exact::value; \ + }; \ + } /* namespace detail2 */ \ + \ + template \ + struct would_call_std_##std_name : detail2::would_call_std_##std_name \ + { \ + } + +#ifndef JSON_USE_IMPLICIT_CONVERSIONS + #define JSON_USE_IMPLICIT_CONVERSIONS 1 +#endif + +#if JSON_USE_IMPLICIT_CONVERSIONS + #define JSON_EXPLICIT +#else + #define JSON_EXPLICIT explicit +#endif + +#ifndef JSON_DISABLE_ENUM_SERIALIZATION + #define JSON_DISABLE_ENUM_SERIALIZATION 0 +#endif + +#ifndef JSON_USE_GLOBAL_UDLS + #define JSON_USE_GLOBAL_UDLS 1 +#endif + +#if JSON_HAS_THREE_WAY_COMPARISON + #include // partial_ordering +#endif + +NLOHMANN_JSON_NAMESPACE_BEGIN +namespace detail +{ + +/////////////////////////// +// JSON type enumeration // +/////////////////////////// + +/*! +@brief the JSON type enumeration + +This enumeration collects the different JSON types. It is internally used to +distinguish the stored values, and the functions @ref basic_json::is_null(), +@ref basic_json::is_object(), @ref basic_json::is_array(), +@ref basic_json::is_string(), @ref basic_json::is_boolean(), +@ref basic_json::is_number() (with @ref basic_json::is_number_integer(), +@ref basic_json::is_number_unsigned(), and @ref basic_json::is_number_float()), +@ref basic_json::is_discarded(), @ref basic_json::is_primitive(), and +@ref basic_json::is_structured() rely on it. + +@note There are three enumeration entries (number_integer, number_unsigned, and +number_float), because the library distinguishes these three types for numbers: +@ref basic_json::number_unsigned_t is used for unsigned integers, +@ref basic_json::number_integer_t is used for signed integers, and +@ref basic_json::number_float_t is used for floating-point numbers or to +approximate integers which do not fit in the limits of their respective type. + +@sa see @ref basic_json::basic_json(const value_t value_type) -- create a JSON +value with the default value for a given type + +@since version 1.0.0 +*/ +enum class value_t : std::uint8_t +{ + null, ///< null value + object, ///< object (unordered set of name/value pairs) + array, ///< array (ordered collection of values) + string, ///< string value + boolean, ///< boolean value + number_integer, ///< number value (signed integer) + number_unsigned, ///< number value (unsigned integer) + number_float, ///< number value (floating-point) + binary, ///< binary array (ordered collection of bytes) + discarded ///< discarded by the parser callback function +}; + +/*! +@brief comparison operator for JSON types + +Returns an ordering that is similar to Python: +- order: null < boolean < number < object < array < string < binary +- furthermore, each type is not smaller than itself +- discarded values are not comparable +- binary is represented as a b"" string in python and directly comparable to a + string; however, making a binary array directly comparable with a string would + be surprising behavior in a JSON file. + +@since version 1.0.0 +*/ +#if JSON_HAS_THREE_WAY_COMPARISON + inline std::partial_ordering operator<=>(const value_t lhs, const value_t rhs) noexcept // *NOPAD* +#else + inline bool operator<(const value_t lhs, const value_t rhs) noexcept +#endif +{ + static constexpr std::array order = {{ + 0 /* null */, 3 /* object */, 4 /* array */, 5 /* string */, + 1 /* boolean */, 2 /* integer */, 2 /* unsigned */, 2 /* float */, + 6 /* binary */ + } + }; + + const auto l_index = static_cast(lhs); + const auto r_index = static_cast(rhs); +#if JSON_HAS_THREE_WAY_COMPARISON + if (l_index < order.size() && r_index < order.size()) + { + return order[l_index] <=> order[r_index]; // *NOPAD* + } + return std::partial_ordering::unordered; +#else + return l_index < order.size() && r_index < order.size() && order[l_index] < order[r_index]; +#endif +} + +// GCC selects the built-in operator< over an operator rewritten from +// a user-defined spaceship operator +// Clang, MSVC, and ICC select the rewritten candidate +// (see GCC bug https://gcc.gnu.org/bugzilla/show_bug.cgi?id=105200) +#if JSON_HAS_THREE_WAY_COMPARISON && defined(__GNUC__) +inline bool operator<(const value_t lhs, const value_t rhs) noexcept +{ + return std::is_lt(lhs <=> rhs); // *NOPAD* +} +#endif + +} // namespace detail +NLOHMANN_JSON_NAMESPACE_END + +// #include +// __ _____ _____ _____ +// __| | __| | | | JSON for Modern C++ +// | | |__ | | | | | | version 3.12.0 +// |_____|_____|_____|_|___| https://github.com/nlohmann/json +// +// SPDX-FileCopyrightText: 2013 - 2025 Niels Lohmann +// SPDX-License-Identifier: MIT + + + +// #include + + +NLOHMANN_JSON_NAMESPACE_BEGIN +namespace detail +{ + +/*! +@brief replace all occurrences of a substring by another string + +@param[in,out] s the string to manipulate; changed so that all + occurrences of @a f are replaced with @a t +@param[in] f the substring to replace with @a t +@param[in] t the string to replace @a f + +@pre The search string @a f must not be empty. **This precondition is +enforced with an assertion.** + +@since version 2.0.0 +*/ +template +inline void replace_substring(StringType& s, const StringType& f, + const StringType& t) +{ + JSON_ASSERT(!f.empty()); + for (auto pos = s.find(f); // find first occurrence of f + pos != StringType::npos; // make sure f was found + s.replace(pos, f.size(), t), // replace with t, and + pos = s.find(f, pos + t.size())) // find next occurrence of f + {} +} + +/*! + * @brief string escaping as described in RFC 6901 (Sect. 4) + * @param[in] s string to escape + * @return escaped string + * + * Note the order of escaping "~" to "~0" and "/" to "~1" is important. + */ +template +inline StringType escape(StringType s) +{ + replace_substring(s, StringType{"~"}, StringType{"~0"}); + replace_substring(s, StringType{"/"}, StringType{"~1"}); + return s; +} + +/*! + * @brief string unescaping as described in RFC 6901 (Sect. 4) + * @param[in] s string to unescape + * @return unescaped string + * + * Note the order of escaping "~1" to "/" and "~0" to "~" is important. + */ +template +static void unescape(StringType& s) +{ + replace_substring(s, StringType{"~1"}, StringType{"/"}); + replace_substring(s, StringType{"~0"}, StringType{"~"}); +} + +} // namespace detail +NLOHMANN_JSON_NAMESPACE_END + +// #include +// __ _____ _____ _____ +// __| | __| | | | JSON for Modern C++ +// | | |__ | | | | | | version 3.12.0 +// |_____|_____|_____|_|___| https://github.com/nlohmann/json +// +// SPDX-FileCopyrightText: 2013 - 2025 Niels Lohmann +// SPDX-License-Identifier: MIT + + + +#include // size_t + +// #include + + +NLOHMANN_JSON_NAMESPACE_BEGIN +namespace detail +{ + +/// struct to capture the start position of the current token +struct position_t +{ + /// the total number of characters read + std::size_t chars_read_total = 0; + /// the number of characters read in the current line + std::size_t chars_read_current_line = 0; + /// the number of lines read + std::size_t lines_read = 0; + + /// conversion to size_t to preserve SAX interface + constexpr operator size_t() const + { + return chars_read_total; + } +}; + +} // namespace detail +NLOHMANN_JSON_NAMESPACE_END + +// #include + +// #include +// __ _____ _____ _____ +// __| | __| | | | JSON for Modern C++ +// | | |__ | | | | | | version 3.12.0 +// |_____|_____|_____|_|___| https://github.com/nlohmann/json +// +// SPDX-FileCopyrightText: 2013 - 2025 Niels Lohmann +// SPDX-FileCopyrightText: 2018 The Abseil Authors +// SPDX-License-Identifier: MIT + + + +#include // array +#include // size_t +#include // conditional, enable_if, false_type, integral_constant, is_constructible, is_integral, is_same, remove_cv, remove_reference, true_type +#include // index_sequence, make_index_sequence, index_sequence_for + +// #include + + +NLOHMANN_JSON_NAMESPACE_BEGIN +namespace detail +{ + +template +using uncvref_t = typename std::remove_cv::type>::type; + +#ifdef JSON_HAS_CPP_14 + +// the following utilities are natively available in C++14 +using std::enable_if_t; +using std::index_sequence; +using std::make_index_sequence; +using std::index_sequence_for; + +#else + +// alias templates to reduce boilerplate +template +using enable_if_t = typename std::enable_if::type; + +// The following code is taken from https://github.com/abseil/abseil-cpp/blob/10cb35e459f5ecca5b2ff107635da0bfa41011b4/absl/utility/utility.h +// which is part of Google Abseil (https://github.com/abseil/abseil-cpp), licensed under the Apache License 2.0. + +//// START OF CODE FROM GOOGLE ABSEIL + +// integer_sequence +// +// Class template representing a compile-time integer sequence. An instantiation +// of `integer_sequence` has a sequence of integers encoded in its +// type through its template arguments (which is a common need when +// working with C++11 variadic templates). `absl::integer_sequence` is designed +// to be a drop-in replacement for C++14's `std::integer_sequence`. +// +// Example: +// +// template< class T, T... Ints > +// void user_function(integer_sequence); +// +// int main() +// { +// // user_function's `T` will be deduced to `int` and `Ints...` +// // will be deduced to `0, 1, 2, 3, 4`. +// user_function(make_integer_sequence()); +// } +template +struct integer_sequence +{ + using value_type = T; + static constexpr std::size_t size() noexcept + { + return sizeof...(Ints); + } +}; + +// index_sequence +// +// A helper template for an `integer_sequence` of `size_t`, +// `absl::index_sequence` is designed to be a drop-in replacement for C++14's +// `std::index_sequence`. +template +using index_sequence = integer_sequence; + +namespace utility_internal +{ + +template +struct Extend; + +// Note that SeqSize == sizeof...(Ints). It's passed explicitly for efficiency. +template +struct Extend, SeqSize, 0> +{ + using type = integer_sequence < T, Ints..., (Ints + SeqSize)... >; +}; + +template +struct Extend, SeqSize, 1> +{ + using type = integer_sequence < T, Ints..., (Ints + SeqSize)..., 2 * SeqSize >; +}; + +// Recursion helper for 'make_integer_sequence'. +// 'Gen::type' is an alias for 'integer_sequence'. +template +struct Gen +{ + using type = + typename Extend < typename Gen < T, N / 2 >::type, N / 2, N % 2 >::type; +}; + +template +struct Gen +{ + using type = integer_sequence; +}; + +} // namespace utility_internal + +// Compile-time sequences of integers + +// make_integer_sequence +// +// This template alias is equivalent to +// `integer_sequence`, and is designed to be a drop-in +// replacement for C++14's `std::make_integer_sequence`. +template +using make_integer_sequence = typename utility_internal::Gen::type; + +// make_index_sequence +// +// This template alias is equivalent to `index_sequence<0, 1, ..., N-1>`, +// and is designed to be a drop-in replacement for C++14's +// `std::make_index_sequence`. +template +using make_index_sequence = make_integer_sequence; + +// index_sequence_for +// +// Converts a typename pack into an index sequence of the same length, and +// is designed to be a drop-in replacement for C++14's +// `std::index_sequence_for()` +template +using index_sequence_for = make_index_sequence; + +//// END OF CODE FROM GOOGLE ABSEIL + +#endif + +// dispatch utility (taken from ranges-v3) +template struct priority_tag : priority_tag < N - 1 > {}; +template<> struct priority_tag<0> {}; + +// taken from ranges-v3 +template +struct static_const +{ + static JSON_INLINE_VARIABLE constexpr T value{}; +}; + +#ifndef JSON_HAS_CPP_17 + template + constexpr T static_const::value; +#endif + +template +constexpr std::array make_array(Args&& ... args) +{ + return std::array {{static_cast(std::forward(args))...}}; +} + +} // namespace detail +NLOHMANN_JSON_NAMESPACE_END + +// #include +// __ _____ _____ _____ +// __| | __| | | | JSON for Modern C++ +// | | |__ | | | | | | version 3.12.0 +// |_____|_____|_____|_|___| https://github.com/nlohmann/json +// +// SPDX-FileCopyrightText: 2013 - 2025 Niels Lohmann +// SPDX-License-Identifier: MIT + + + +#include // numeric_limits +#include // char_traits +#include // tuple +#include // false_type, is_constructible, is_integral, is_same, true_type +#include // declval + +// #include +// __ _____ _____ _____ +// __| | __| | | | JSON for Modern C++ +// | | |__ | | | | | | version 3.12.0 +// |_____|_____|_____|_|___| https://github.com/nlohmann/json +// +// SPDX-FileCopyrightText: 2013 - 2025 Niels Lohmann +// SPDX-License-Identifier: MIT + + + +#include // random_access_iterator_tag + +// #include + +// #include + +// #include + + +NLOHMANN_JSON_NAMESPACE_BEGIN +namespace detail +{ + +template +struct iterator_types {}; + +template +struct iterator_types < + It, + void_t> +{ + using difference_type = typename It::difference_type; + using value_type = typename It::value_type; + using pointer = typename It::pointer; + using reference = typename It::reference; + using iterator_category = typename It::iterator_category; +}; + +// This is required as some compilers implement std::iterator_traits in a way that +// doesn't work with SFINAE. See https://github.com/nlohmann/json/issues/1341. +template +struct iterator_traits +{ +}; + +template +struct iterator_traits < T, enable_if_t < !std::is_pointer::value >> + : iterator_types +{ +}; + +template +struct iterator_traits::value>> +{ + using iterator_category = std::random_access_iterator_tag; + using value_type = T; + using difference_type = ptrdiff_t; + using pointer = T*; + using reference = T&; +}; + +} // namespace detail +NLOHMANN_JSON_NAMESPACE_END + +// #include + +// #include +// __ _____ _____ _____ +// __| | __| | | | JSON for Modern C++ +// | | |__ | | | | | | version 3.12.0 +// |_____|_____|_____|_|___| https://github.com/nlohmann/json +// +// SPDX-FileCopyrightText: 2013 - 2025 Niels Lohmann +// SPDX-License-Identifier: MIT + + + +// #include + + +NLOHMANN_JSON_NAMESPACE_BEGIN + +NLOHMANN_CAN_CALL_STD_FUNC_IMPL(begin); + +NLOHMANN_JSON_NAMESPACE_END + +// #include +// __ _____ _____ _____ +// __| | __| | | | JSON for Modern C++ +// | | |__ | | | | | | version 3.12.0 +// |_____|_____|_____|_|___| https://github.com/nlohmann/json +// +// SPDX-FileCopyrightText: 2013 - 2025 Niels Lohmann +// SPDX-License-Identifier: MIT + + + +// #include + + +NLOHMANN_JSON_NAMESPACE_BEGIN + +NLOHMANN_CAN_CALL_STD_FUNC_IMPL(end); + +NLOHMANN_JSON_NAMESPACE_END + +// #include + +// #include + +// #include +// __ _____ _____ _____ +// __| | __| | | | JSON for Modern C++ +// | | |__ | | | | | | version 3.12.0 +// |_____|_____|_____|_|___| https://github.com/nlohmann/json +// +// SPDX-FileCopyrightText: 2013 - 2025 Niels Lohmann +// SPDX-License-Identifier: MIT + +#ifndef INCLUDE_NLOHMANN_JSON_FWD_HPP_ + #define INCLUDE_NLOHMANN_JSON_FWD_HPP_ + + #include // int64_t, uint64_t + #include // map + #include // allocator + #include // string + #include // vector + + // #include + + + /*! + @brief namespace for Niels Lohmann + @see https://github.com/nlohmann + @since version 1.0.0 + */ + NLOHMANN_JSON_NAMESPACE_BEGIN + + /*! + @brief default JSONSerializer template argument + + This serializer ignores the template arguments and uses ADL + ([argument-dependent lookup](https://en.cppreference.com/w/cpp/language/adl)) + for serialization. + */ + template + struct adl_serializer; + + /// a class to store JSON values + /// @sa https://json.nlohmann.me/api/basic_json/ + template class ObjectType = + std::map, + template class ArrayType = std::vector, + class StringType = std::string, class BooleanType = bool, + class NumberIntegerType = std::int64_t, + class NumberUnsignedType = std::uint64_t, + class NumberFloatType = double, + template class AllocatorType = std::allocator, + template class JSONSerializer = + adl_serializer, + class BinaryType = std::vector, // cppcheck-suppress syntaxError + class CustomBaseClass = void> + class basic_json; + + /// @brief JSON Pointer defines a string syntax for identifying a specific value within a JSON document + /// @sa https://json.nlohmann.me/api/json_pointer/ + template + class json_pointer; + + /*! + @brief default specialization + @sa https://json.nlohmann.me/api/json/ + */ + using json = basic_json<>; + + /// @brief a minimal map-like container that preserves insertion order + /// @sa https://json.nlohmann.me/api/ordered_map/ + template + struct ordered_map; + + /// @brief specialization that maintains the insertion order of object keys + /// @sa https://json.nlohmann.me/api/ordered_json/ + using ordered_json = basic_json; + + NLOHMANN_JSON_NAMESPACE_END + +#endif // INCLUDE_NLOHMANN_JSON_FWD_HPP_ + + +NLOHMANN_JSON_NAMESPACE_BEGIN +/*! +@brief detail namespace with internal helper functions + +This namespace collects functions that should not be exposed, +implementations of some @ref basic_json methods, and meta-programming helpers. + +@since version 2.1.0 +*/ +namespace detail +{ + +///////////// +// helpers // +///////////// + +// Note to maintainers: +// +// Every trait in this file expects a non CV-qualified type. +// The only exceptions are in the 'aliases for detected' section +// (i.e. those of the form: decltype(T::member_function(std::declval()))) +// +// In this case, T has to be properly CV-qualified to constraint the function arguments +// (e.g. to_json(BasicJsonType&, const T&)) + +template struct is_basic_json : std::false_type {}; + +NLOHMANN_BASIC_JSON_TPL_DECLARATION +struct is_basic_json : std::true_type {}; + +// used by exceptions create() member functions +// true_type for pointer to possibly cv-qualified basic_json or std::nullptr_t +// false_type otherwise +template +struct is_basic_json_context : + std::integral_constant < bool, + is_basic_json::type>::type>::value + || std::is_same::value > +{}; + +////////////////////// +// json_ref helpers // +////////////////////// + +template +class json_ref; + +template +struct is_json_ref : std::false_type {}; + +template +struct is_json_ref> : std::true_type {}; + +////////////////////////// +// aliases for detected // +////////////////////////// + +template +using mapped_type_t = typename T::mapped_type; + +template +using key_type_t = typename T::key_type; + +template +using value_type_t = typename T::value_type; + +template +using difference_type_t = typename T::difference_type; + +template +using pointer_t = typename T::pointer; + +template +using reference_t = typename T::reference; + +template +using iterator_category_t = typename T::iterator_category; + +template +using to_json_function = decltype(T::to_json(std::declval()...)); + +template +using from_json_function = decltype(T::from_json(std::declval()...)); + +template +using get_template_function = decltype(std::declval().template get()); + +// trait checking if JSONSerializer::from_json(json const&, udt&) exists +template +struct has_from_json : std::false_type {}; + +// trait checking if j.get is valid +// use this trait instead of std::is_constructible or std::is_convertible, +// both rely on, or make use of implicit conversions, and thus fail when T +// has several constructors/operator= (see https://github.com/nlohmann/json/issues/958) +template +struct is_getable +{ + static constexpr bool value = is_detected::value; +}; + +template +struct has_from_json < BasicJsonType, T, enable_if_t < !is_basic_json::value >> +{ + using serializer = typename BasicJsonType::template json_serializer; + + static constexpr bool value = + is_detected_exact::value; +}; + +// This trait checks if JSONSerializer::from_json(json const&) exists +// this overload is used for non-default-constructible user-defined-types +template +struct has_non_default_from_json : std::false_type {}; + +template +struct has_non_default_from_json < BasicJsonType, T, enable_if_t < !is_basic_json::value >> +{ + using serializer = typename BasicJsonType::template json_serializer; + + static constexpr bool value = + is_detected_exact::value; +}; + +// This trait checks if BasicJsonType::json_serializer::to_json exists +// Do not evaluate the trait when T is a basic_json type, to avoid template instantiation infinite recursion. +template +struct has_to_json : std::false_type {}; + +template +struct has_to_json < BasicJsonType, T, enable_if_t < !is_basic_json::value >> +{ + using serializer = typename BasicJsonType::template json_serializer; + + static constexpr bool value = + is_detected_exact::value; +}; + +template +using detect_key_compare = typename T::key_compare; + +template +struct has_key_compare : std::integral_constant::value> {}; + +// obtains the actual object key comparator +template +struct actual_object_comparator +{ + using object_t = typename BasicJsonType::object_t; + using object_comparator_t = typename BasicJsonType::default_object_comparator_t; + using type = typename std::conditional < has_key_compare::value, + typename object_t::key_compare, object_comparator_t>::type; +}; + +template +using actual_object_comparator_t = typename actual_object_comparator::type; + +///////////////// +// char_traits // +///////////////// + +// Primary template of char_traits calls std char_traits +template +struct char_traits : std::char_traits +{}; + +// Explicitly define char traits for unsigned char since it is not standard +template<> +struct char_traits : std::char_traits +{ + using char_type = unsigned char; + using int_type = uint64_t; + + // Redefine to_int_type function + static int_type to_int_type(char_type c) noexcept + { + return static_cast(c); + } + + static char_type to_char_type(int_type i) noexcept + { + return static_cast(i); + } + + static constexpr int_type eof() noexcept + { + return static_cast(std::char_traits::eof()); + } +}; + +// Explicitly define char traits for signed char since it is not standard +template<> +struct char_traits : std::char_traits +{ + using char_type = signed char; + using int_type = uint64_t; + + // Redefine to_int_type function + static int_type to_int_type(char_type c) noexcept + { + return static_cast(c); + } + + static char_type to_char_type(int_type i) noexcept + { + return static_cast(i); + } + + static constexpr int_type eof() noexcept + { + return static_cast(std::char_traits::eof()); + } +}; + +/////////////////// +// is_ functions // +/////////////////// + +// https://en.cppreference.com/w/cpp/types/conjunction +template struct conjunction : std::true_type { }; +template struct conjunction : B { }; +template +struct conjunction +: std::conditional(B::value), conjunction, B>::type {}; + +// https://en.cppreference.com/w/cpp/types/negation +template struct negation : std::integral_constant < bool, !B::value > { }; + +// Reimplementation of is_constructible and is_default_constructible, due to them being broken for +// std::pair and std::tuple until LWG 2367 fix (see https://cplusplus.github.io/LWG/lwg-defects.html#2367). +// This causes compile errors in e.g. clang 3.5 or gcc 4.9. +template +struct is_default_constructible : std::is_default_constructible {}; + +template +struct is_default_constructible> + : conjunction, is_default_constructible> {}; + +template +struct is_default_constructible> + : conjunction, is_default_constructible> {}; + +template +struct is_default_constructible> + : conjunction...> {}; + +template +struct is_default_constructible> + : conjunction...> {}; + +template +struct is_constructible : std::is_constructible {}; + +template +struct is_constructible> : is_default_constructible> {}; + +template +struct is_constructible> : is_default_constructible> {}; + +template +struct is_constructible> : is_default_constructible> {}; + +template +struct is_constructible> : is_default_constructible> {}; + +template +struct is_iterator_traits : std::false_type {}; + +template +struct is_iterator_traits> +{ + private: + using traits = iterator_traits; + + public: + static constexpr auto value = + is_detected::value && + is_detected::value && + is_detected::value && + is_detected::value && + is_detected::value; +}; + +template +struct is_range +{ + private: + using t_ref = typename std::add_lvalue_reference::type; + + using iterator = detected_t; + using sentinel = detected_t; + + // to be 100% correct, it should use https://en.cppreference.com/w/cpp/iterator/input_or_output_iterator + // and https://en.cppreference.com/w/cpp/iterator/sentinel_for + // but reimplementing these would be too much work, as a lot of other concepts are used underneath + static constexpr auto is_iterator_begin = + is_iterator_traits>::value; + + public: + static constexpr bool value = !std::is_same::value && !std::is_same::value && is_iterator_begin; +}; + +template +using iterator_t = enable_if_t::value, result_of_begin())>>; + +template +using range_value_t = value_type_t>>; + +// The following implementation of is_complete_type is taken from +// https://blogs.msdn.microsoft.com/vcblog/2015/12/02/partial-support-for-expression-sfinae-in-vs-2015-update-1/ +// and is written by Xiang Fan who agreed to using it in this library. + +template +struct is_complete_type : std::false_type {}; + +template +struct is_complete_type : std::true_type {}; + +template +struct is_compatible_object_type_impl : std::false_type {}; + +template +struct is_compatible_object_type_impl < + BasicJsonType, CompatibleObjectType, + enable_if_t < is_detected::value&& + is_detected::value >> +{ + using object_t = typename BasicJsonType::object_t; + + // macOS's is_constructible does not play well with nonesuch... + static constexpr bool value = + is_constructible::value && + is_constructible::value; +}; + +template +struct is_compatible_object_type + : is_compatible_object_type_impl {}; + +template +struct is_constructible_object_type_impl : std::false_type {}; + +template +struct is_constructible_object_type_impl < + BasicJsonType, ConstructibleObjectType, + enable_if_t < is_detected::value&& + is_detected::value >> +{ + using object_t = typename BasicJsonType::object_t; + + static constexpr bool value = + (is_default_constructible::value && + (std::is_move_assignable::value || + std::is_copy_assignable::value) && + (is_constructible::value && + std::is_same < + typename object_t::mapped_type, + typename ConstructibleObjectType::mapped_type >::value)) || + (has_from_json::value || + has_non_default_from_json < + BasicJsonType, + typename ConstructibleObjectType::mapped_type >::value); +}; + +template +struct is_constructible_object_type + : is_constructible_object_type_impl {}; + +template +struct is_compatible_string_type +{ + static constexpr auto value = + is_constructible::value; +}; + +template +struct is_constructible_string_type +{ + // launder type through decltype() to fix compilation failure on ICPC +#ifdef __INTEL_COMPILER + using laundered_type = decltype(std::declval()); +#else + using laundered_type = ConstructibleStringType; +#endif + + static constexpr auto value = + conjunction < + is_constructible, + is_detected_exact>::value; +}; + +template +struct is_compatible_array_type_impl : std::false_type {}; + +template +struct is_compatible_array_type_impl < + BasicJsonType, CompatibleArrayType, + enable_if_t < + is_detected::value&& + is_iterator_traits>>::value&& +// special case for types like std::filesystem::path whose iterator's value_type are themselves +// c.f. https://github.com/nlohmann/json/pull/3073 + !std::is_same>::value >> +{ + static constexpr bool value = + is_constructible>::value; +}; + +template +struct is_compatible_array_type + : is_compatible_array_type_impl {}; + +template +struct is_constructible_array_type_impl : std::false_type {}; + +template +struct is_constructible_array_type_impl < + BasicJsonType, ConstructibleArrayType, + enable_if_t::value >> + : std::true_type {}; + +template +struct is_constructible_array_type_impl < + BasicJsonType, ConstructibleArrayType, + enable_if_t < !std::is_same::value&& + !is_compatible_string_type::value&& + is_default_constructible::value&& +(std::is_move_assignable::value || + std::is_copy_assignable::value)&& +is_detected::value&& +is_iterator_traits>>::value&& +is_detected::value&& +// special case for types like std::filesystem::path whose iterator's value_type are themselves +// c.f. https://github.com/nlohmann/json/pull/3073 +!std::is_same>::value&& +is_complete_type < +detected_t>::value >> +{ + using value_type = range_value_t; + + static constexpr bool value = + std::is_same::value || + has_from_json::value || + has_non_default_from_json < + BasicJsonType, + value_type >::value; +}; + +template +struct is_constructible_array_type + : is_constructible_array_type_impl {}; + +template +struct is_compatible_integer_type_impl : std::false_type {}; + +template +struct is_compatible_integer_type_impl < + RealIntegerType, CompatibleNumberIntegerType, + enable_if_t < std::is_integral::value&& + std::is_integral::value&& + !std::is_same::value >> +{ + // is there an assert somewhere on overflows? + using RealLimits = std::numeric_limits; + using CompatibleLimits = std::numeric_limits; + + static constexpr auto value = + is_constructible::value && + CompatibleLimits::is_integer && + RealLimits::is_signed == CompatibleLimits::is_signed; +}; + +template +struct is_compatible_integer_type + : is_compatible_integer_type_impl {}; + +template +struct is_compatible_type_impl: std::false_type {}; + +template +struct is_compatible_type_impl < + BasicJsonType, CompatibleType, + enable_if_t::value >> +{ + static constexpr bool value = + has_to_json::value; +}; + +template +struct is_compatible_type + : is_compatible_type_impl {}; + +template +struct is_constructible_tuple : std::false_type {}; + +template +struct is_constructible_tuple> : conjunction...> {}; + +template +struct is_json_iterator_of : std::false_type {}; + +template +struct is_json_iterator_of : std::true_type {}; + +template +struct is_json_iterator_of : std::true_type +{}; + +// checks if a given type T is a template specialization of Primary +template