From aec15123bd9080a64751f840de4829f63e9f410a Mon Sep 17 00:00:00 2001 From: N2614 Date: Wed, 16 Nov 2011 05:32:23 +0000 Subject: [PATCH] =?UTF-8?q?=E3=83=AF=E3=83=BC=E3=82=AF=E3=83=96=E3=83=A9?= =?UTF-8?q?=E3=83=B3=E3=83=81=E3=82=92=E5=89=8A=E9=99=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit git-svn-id: file:///Volumes/Transfer/gigaleak_20231201/2020-05-23%20-%20ctr.7z%20+%20svn_v1.068.zip/ctr/svn/ctr_Repair@515 385bec56-5757-e545-9c3a-d8741f4650f1 --- .../ConsoleBackup/ConsoleBackup.bsf | Bin 2302 -> 0 bytes .../ConsoleBackup/ConsoleBackup.cpp | 442 ----- .../SD_AesCmac/ConsoleBackup/ConsoleBackup.h | 41 - .../ConsoleBackup/ConsoleBackup.rsf | 52 - .../SD_AesCmac/ConsoleBackup/Controller.cpp | 313 ---- .../SD_AesCmac/ConsoleBackup/Controller.h | 34 - .../SD_AesCmac/ConsoleBackup/Exporter.cpp | 558 ------ .../work/SD_AesCmac/ConsoleBackup/Exporter.h | 36 - .../work/SD_AesCmac/ConsoleBackup/OMakefile | 84 - .../ConsoleBackup/banner/model.cbmd | Bin 198785 -> 0 bytes .../ConsoleBackup/banner/sound.cbsd | Bin 198785 -> 0 bytes .../ConsoleBackup/banner/unknown24x24.ctpk | 1 - .../ConsoleBackup/banner/unknown48x48.ctpk | 1 - .../SD_AesCmac/ConsoleBackup/genversion.sh | 3 - .../ConsoleRestore/ConsoleRestore.bsf | Bin 2302 -> 0 bytes .../ConsoleRestore/ConsoleRestore.cpp | 462 ----- .../ConsoleRestore/ConsoleRestore.h | 53 - .../ConsoleRestore/ConsoleRestore.rsf | 52 - .../SD_AesCmac/ConsoleRestore/Controller.cpp | 913 ---------- .../SD_AesCmac/ConsoleRestore/Controller.h | 46 - .../SD_AesCmac/ConsoleRestore/Importer.cpp | 1496 ----------------- .../work/SD_AesCmac/ConsoleRestore/Importer.h | 97 -- .../SD_AesCmac/ConsoleRestore/NtpClient.cpp | 376 ----- .../SD_AesCmac/ConsoleRestore/NtpClient.h | 28 - .../work/SD_AesCmac/ConsoleRestore/OMakefile | 89 - .../SD_AesCmac/ConsoleRestore/Updater.cpp | 249 --- .../work/SD_AesCmac/ConsoleRestore/Updater.h | 32 - .../ConsoleRestore/banner/model.cbmd | Bin 198785 -> 0 bytes .../ConsoleRestore/banner/sound.cbsd | Bin 198785 -> 0 bytes .../ConsoleRestore/banner/unknown24x24.ctpk | 1 - .../ConsoleRestore/banner/unknown48x48.ctpk | 1 - .../SD_AesCmac/ConsoleRestore/genversion.sh | 3 - branches/work/SD_AesCmac/OMakefile | 24 - branches/work/SD_AesCmac/OMakeroot | 73 - branches/work/SD_AesCmac/Readme.txt | 10 - branches/work/SD_AesCmac/common/Aes_define.h | 36 - .../work/SD_AesCmac/common/CommonLogger.cpp | 117 -- .../work/SD_AesCmac/common/CommonLogger.h | 84 - .../SD_AesCmac/common/DrawSystemState.cpp | 120 -- .../work/SD_AesCmac/common/DrawSystemState.h | 70 - .../work/SD_AesCmac/common/FileChecker.cpp | 134 -- branches/work/SD_AesCmac/common/FileChecker.h | 72 - branches/work/SD_AesCmac/common/FileName.h | 92 - .../work/SD_AesCmac/common/FileTransfer.cpp | 249 --- .../work/SD_AesCmac/common/FileTransfer.h | 33 - .../work/SD_AesCmac/common/HardwareInfo.cpp | 69 - .../work/SD_AesCmac/common/HardwareInfo.h | 33 - .../work/SD_AesCmac/common/HeapManager.cpp | 39 - branches/work/SD_AesCmac/common/HeapManager.h | 40 - .../work/SD_AesCmac/common/LogConsole.cpp | 171 -- branches/work/SD_AesCmac/common/LogConsole.h | 68 - .../SD_AesCmac/common/LogConsole_Private.h | 28 - branches/work/SD_AesCmac/common/OMakefile | 18 - .../SD_AesCmac/common/PlayHistoryManager.cpp | 219 --- .../SD_AesCmac/common/PlayHistoryManager.h | 45 - branches/work/SD_AesCmac/common/ProgramId.h | 28 - branches/work/SD_AesCmac/common/SdLogger.cpp | 267 --- branches/work/SD_AesCmac/common/SdLogger.h | 57 - .../work/SD_AesCmac/common/SdMountManager.cpp | 67 - .../work/SD_AesCmac/common/SdMountManager.h | 42 - .../work/SD_AesCmac/common/SdReaderWriter.cpp | 253 --- .../work/SD_AesCmac/common/SdReaderWriter.h | 80 - .../work/SD_AesCmac/common/SimplePlayer.cpp | 240 --- .../work/SD_AesCmac/common/SimplePlayer.h | 37 - .../work/SD_AesCmac/common/VersionDetect.cpp | 120 -- .../work/SD_AesCmac/common/VersionDetect.h | 30 - .../work/SD_AesCmac/common/common_Types.h | 70 - .../work/SD_AesCmac/common/configLoader.cpp | 181 -- .../work/SD_AesCmac/common/configLoader.h | 78 - .../SD_AesCmac/common/romfiles/annotation.wav | Bin 28636 -> 0 bytes .../SD_AesCmac/common/romfiles/cursor.wav | Bin 29996 -> 0 bytes .../work/SD_AesCmac/common/romfiles/ng.wav | Bin 141180 -> 0 bytes .../work/SD_AesCmac/common/romfiles/ok.wav | Bin 158700 -> 0 bytes branches/work/SD_AesCmac/common/wave.cpp | 150 -- branches/work/SD_AesCmac/common/wave.h | 148 -- 75 files changed, 9155 deletions(-) delete mode 100644 branches/work/SD_AesCmac/ConsoleBackup/ConsoleBackup.bsf delete mode 100644 branches/work/SD_AesCmac/ConsoleBackup/ConsoleBackup.cpp delete mode 100644 branches/work/SD_AesCmac/ConsoleBackup/ConsoleBackup.h delete mode 100644 branches/work/SD_AesCmac/ConsoleBackup/ConsoleBackup.rsf delete mode 100644 branches/work/SD_AesCmac/ConsoleBackup/Controller.cpp delete mode 100644 branches/work/SD_AesCmac/ConsoleBackup/Controller.h delete mode 100644 branches/work/SD_AesCmac/ConsoleBackup/Exporter.cpp delete mode 100644 branches/work/SD_AesCmac/ConsoleBackup/Exporter.h delete mode 100644 branches/work/SD_AesCmac/ConsoleBackup/OMakefile delete mode 100644 branches/work/SD_AesCmac/ConsoleBackup/banner/model.cbmd delete mode 100644 branches/work/SD_AesCmac/ConsoleBackup/banner/sound.cbsd delete mode 100644 branches/work/SD_AesCmac/ConsoleBackup/banner/unknown24x24.ctpk delete mode 100644 branches/work/SD_AesCmac/ConsoleBackup/banner/unknown48x48.ctpk delete mode 100755 branches/work/SD_AesCmac/ConsoleBackup/genversion.sh delete mode 100644 branches/work/SD_AesCmac/ConsoleRestore/ConsoleRestore.bsf delete mode 100644 branches/work/SD_AesCmac/ConsoleRestore/ConsoleRestore.cpp delete mode 100644 branches/work/SD_AesCmac/ConsoleRestore/ConsoleRestore.h delete mode 100644 branches/work/SD_AesCmac/ConsoleRestore/ConsoleRestore.rsf delete mode 100644 branches/work/SD_AesCmac/ConsoleRestore/Controller.cpp delete mode 100644 branches/work/SD_AesCmac/ConsoleRestore/Controller.h delete mode 100644 branches/work/SD_AesCmac/ConsoleRestore/Importer.cpp delete mode 100644 branches/work/SD_AesCmac/ConsoleRestore/Importer.h delete mode 100644 branches/work/SD_AesCmac/ConsoleRestore/NtpClient.cpp delete mode 100644 branches/work/SD_AesCmac/ConsoleRestore/NtpClient.h delete mode 100644 branches/work/SD_AesCmac/ConsoleRestore/OMakefile delete mode 100644 branches/work/SD_AesCmac/ConsoleRestore/Updater.cpp delete mode 100644 branches/work/SD_AesCmac/ConsoleRestore/Updater.h delete mode 100644 branches/work/SD_AesCmac/ConsoleRestore/banner/model.cbmd delete mode 100644 branches/work/SD_AesCmac/ConsoleRestore/banner/sound.cbsd delete mode 100644 branches/work/SD_AesCmac/ConsoleRestore/banner/unknown24x24.ctpk delete mode 100644 branches/work/SD_AesCmac/ConsoleRestore/banner/unknown48x48.ctpk delete mode 100755 branches/work/SD_AesCmac/ConsoleRestore/genversion.sh delete mode 100644 branches/work/SD_AesCmac/OMakefile delete mode 100644 branches/work/SD_AesCmac/OMakeroot delete mode 100644 branches/work/SD_AesCmac/Readme.txt delete mode 100644 branches/work/SD_AesCmac/common/Aes_define.h delete mode 100644 branches/work/SD_AesCmac/common/CommonLogger.cpp delete mode 100644 branches/work/SD_AesCmac/common/CommonLogger.h delete mode 100644 branches/work/SD_AesCmac/common/DrawSystemState.cpp delete mode 100644 branches/work/SD_AesCmac/common/DrawSystemState.h delete mode 100644 branches/work/SD_AesCmac/common/FileChecker.cpp delete mode 100644 branches/work/SD_AesCmac/common/FileChecker.h delete mode 100644 branches/work/SD_AesCmac/common/FileName.h delete mode 100644 branches/work/SD_AesCmac/common/FileTransfer.cpp delete mode 100644 branches/work/SD_AesCmac/common/FileTransfer.h delete mode 100644 branches/work/SD_AesCmac/common/HardwareInfo.cpp delete mode 100644 branches/work/SD_AesCmac/common/HardwareInfo.h delete mode 100644 branches/work/SD_AesCmac/common/HeapManager.cpp delete mode 100644 branches/work/SD_AesCmac/common/HeapManager.h delete mode 100644 branches/work/SD_AesCmac/common/LogConsole.cpp delete mode 100644 branches/work/SD_AesCmac/common/LogConsole.h delete mode 100644 branches/work/SD_AesCmac/common/LogConsole_Private.h delete mode 100644 branches/work/SD_AesCmac/common/OMakefile delete mode 100644 branches/work/SD_AesCmac/common/PlayHistoryManager.cpp delete mode 100644 branches/work/SD_AesCmac/common/PlayHistoryManager.h delete mode 100644 branches/work/SD_AesCmac/common/ProgramId.h delete mode 100644 branches/work/SD_AesCmac/common/SdLogger.cpp delete mode 100644 branches/work/SD_AesCmac/common/SdLogger.h delete mode 100644 branches/work/SD_AesCmac/common/SdMountManager.cpp delete mode 100644 branches/work/SD_AesCmac/common/SdMountManager.h delete mode 100644 branches/work/SD_AesCmac/common/SdReaderWriter.cpp delete mode 100644 branches/work/SD_AesCmac/common/SdReaderWriter.h delete mode 100644 branches/work/SD_AesCmac/common/SimplePlayer.cpp delete mode 100644 branches/work/SD_AesCmac/common/SimplePlayer.h delete mode 100644 branches/work/SD_AesCmac/common/VersionDetect.cpp delete mode 100644 branches/work/SD_AesCmac/common/VersionDetect.h delete mode 100644 branches/work/SD_AesCmac/common/common_Types.h delete mode 100644 branches/work/SD_AesCmac/common/configLoader.cpp delete mode 100644 branches/work/SD_AesCmac/common/configLoader.h delete mode 100644 branches/work/SD_AesCmac/common/romfiles/annotation.wav delete mode 100644 branches/work/SD_AesCmac/common/romfiles/cursor.wav delete mode 100644 branches/work/SD_AesCmac/common/romfiles/ng.wav delete mode 100644 branches/work/SD_AesCmac/common/romfiles/ok.wav delete mode 100644 branches/work/SD_AesCmac/common/wave.cpp delete mode 100644 branches/work/SD_AesCmac/common/wave.h diff --git a/branches/work/SD_AesCmac/ConsoleBackup/ConsoleBackup.bsf b/branches/work/SD_AesCmac/ConsoleBackup/ConsoleBackup.bsf deleted file mode 100644 index 104a94da96cd5d963d349ca5c6fcce26ae7e3cbb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2302 zcmb7@%}&BV6ov0r6Q4m6H@Z+KhJ|rsM6B@-iN&}UA&7ugsXvL2;Tss=z?CbPK7-HU z)`;f}40Xb^b~0(1PS3sfyQi1I&zzJblt2oys8<2cr*etalpCCea)sR)c7e2|i~WpD z%Rcro7N2+UHiF)~Uy~`R|H-i|w|LvZ70EsBD^ipPeP2RkjQky)vxJ;2?`%a`MK<2; zYzL^;09`kOt2fp#wk|zHu)7fFWNu`{_Q#rGY=0EX_#@P9p&Pog2InT%2DrMq)-it1 z5bM@4GJuy|>5rV>09lO8Ax`gbHW_E@jjjxRjO#yrP0mrF2RAOE<`)kz2d6kOwUp*I z93`+s$UK?1hPc}iwV4q^!TDfENmN43p675qs~7dEzSM{MR`2Q)_czs1k9R9iC+b3# z6`dZs&Cc53ZE5GPQMHZQ&9SRVZt6E>3%bKUwF@%riEnqMis|N;Ye~iGdv;(iqYmL% zgnF^1x3#kaqppIk4p-ag{~U}rnxmrmV?1-}BHb4wwvf|Jvo7{BYB!CoUDx@U+m9xI zZ~1Ac&QC+NAI&!0$)cen)MPOjjbG&*sbyA9+-82Nvlu4Tel%g~#LiszPN!@7sdh7@sr_j7@Sk?igDXGP`DhB-LF)Z@%5t2-lYH^vj#EOln -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "demo.h" - -#include -#include - -#include "ConsoleBackup.h" -#include "DrawSystemState.h" -#include "FileName.h" -#include "Controller.h" -#include "SimplePlayer.h" -#include "Exporter.h" -#include "CommonLogger.h" -#include "SDMountManager.h" -#include "HeapManager.h" -#include "PlayHistoryManager.h" -#include "common_Types.h" -#include "VersionDetect.h" -#include "HardwareInfo.h" - -// svnリビジョン埋め込み用 -#include "version.h" -#ifndef BACKUP_VERSION_NUM -#define BACKUP_VERSION_NUM 0 -#endif - -namespace { - -// グラフィックスに割り当てるメモリ -const size_t s_GxHeapSize = 0x800000; - - -// バッテリ残量 -u8 batteryRemain = 100; - -// シリアルナンバー -u8 s_SerialNo[nn::cfg::CTR::CFG_SECURE_INFO_SERIAL_NO_LEN]; - -// シリアルナンバーが読めるかどうか -bool s_CanReadSerialNumber = false; - -// IVSへのポインタ -void* sp_Ivs; - -size_t s_SizeofIvs; - -// IVSが読めるかどうか -bool s_CanReadIvs = false; - -// バージョン情報 -common::VerDef s_VerData; - -nn::Handle s_McuSession; - -} // namespace - -namespace ConsoleBackup{ - -bool IsAdapterConnected() -{ - return nn::ptm::CTR::GetAdapterState() == nn::ptm::CTR::ADAPTERSTATE_CONNECTED; -} - -bool IsBatteryLower() -{ - return batteryRemain <= 10; -} - -bool CanReadIVS() -{ - return s_CanReadIvs; -} - -bool CanReadSerialNumber() -{ - return s_CanReadSerialNumber; -} - -void GetSerialNumber(u8** serial, size_t* size) -{ - *serial = s_SerialNo; - *size = nn::cfg::CTR::CFG_SECURE_INFO_SERIAL_NO_LEN; -} - -void GetIvs(void** ivs, size_t* size) -{ - *ivs = sp_Ivs; - *size = s_SizeofIvs; -} - -void GetVersionData(common::VerDef* version) -{ - *version = s_VerData; -} - -nn::Handle GetMcuHandle() -{ - return s_McuSession; -} - - -extern "C" void nnMain(void) -{ - nn::Result result; - - // os の初期化 - nn::os::Initialize(); - - // fs の初期化 - nn::fs::Initialize(); - - // appletの初期化 - nn::applet::Enable( false ); - - // hid の初期化 - result = nn::hid::Initialize(); - NN_UTIL_PANIC_IF_FAILED(result); - - // ndmの初期化 - result = nn::ndm::Initialize(); - NN_ERR_THROW_FATAL_IF_FATAL_ONLY(result); - - // デーモンの自律動作を停止 - result = nn::ndm::Suspend(nn::ndm::DN_CEC); - NN_ERR_THROW_FATAL_IF_FATAL_ONLY(result); - result = nn::ndm::Suspend(nn::ndm::DN_BOSS); - NN_ERR_THROW_FATAL_IF_FATAL_ONLY(result); - result = nn::ndm::Suspend(nn::ndm::DN_FRIENDS); - NN_ERR_THROW_FATAL_IF_FATAL_ONLY(result); - result = nn::ndm::Suspend(nn::ndm::DN_NIM); - NN_ERR_THROW_FATAL_IF_FATAL_ONLY(result); - - // cfg の初期化 - nn::cfg::CTR::init::Initialize(); - nn::cfg::CTR::system::Initialize(); - - // 時計設定用ptm初期化 - nn::ptm::CTR::InitializeForSystemMenu(); - - // ps の初期化 - nn::ps::Initialize(); - - // friendsの初期化 - result = nn::friends::detail::Initialize(); - - // mcuの初期化 - nn::mcu::CTR::InitializeHwCheck(&s_McuSession); - - nn::mcu::CTR::HwCheck mcu(s_McuSession); - - // ヒープの確保 - common::HeapManager::GetHeap()->Initialize(nn::os::GetDeviceMemoryAddress(), nn::os::GetDeviceMemorySize(), nn::os::ALLOCATE_OPTION_LINEAR); - - // RenderSystem の準備 - uptr heapForGx = reinterpret_cast(common::HeapManager::GetHeap()->Allocate(s_GxHeapSize)); - demo::RenderSystemDrawing s_RenderSystem; - s_RenderSystem.Initialize(heapForGx, s_GxHeapSize); - - // サウンドスレッドの起動 - common::InitializeSimplePlayer(); - - // ログ描画の初期化 - common::Logger::GetLoggerInstance()->Initialize(CONSOLE_WIDTH, CONSOLE_HEIGHT, CONSOLE_MAX_LINE, &s_RenderSystem); - - // RenderSystemを作ってからログが出せる - common::Logger::InitializeEjectThread(); - common::Logger::SetEjectHandler(OnSdEjected); - // 起動時に削除 - common::Logger::GetLoggerInstance()->ClearLog(); - - COMMON_LOGGER("\n"); - COMMON_LOGGER("CTR Console Backup start\n"); - - // ボタン入力 - nn::hid::PadReader s_PadReader; - nn::hid::PadStatus padStatus; - - // データの準備 - - // 完全性検証SEEDの取得 - result = nn::fs::MountSpecialArchive(common::NAND_ARCHIVE_NAME, nn::fs::CTR::ARCHIVE_TYPE_CTR_NAND); - if (result.IsSuccess()) - { - nn::fs::FileInputStream fis; - - result = fis.TryInitialize(common::IVS_NAND_PATHNAME); - if (result.IsSuccess()) - { - s64 fileSize = fis.GetSize(); - s32 ret; - void* addr = NULL; - addr = common::HeapManager::GetHeap()->Allocate(fileSize); - if (addr != NULL) - { - sp_Ivs = addr; - s_SizeofIvs = fileSize; - result = fis.TryRead(&ret, addr, fileSize); - if (result.IsSuccess()) - { - s_CanReadIvs = true; - } - // 後でIVSを参照するのでFreeしない - } - } - fis.Finalize(); - } - // 一旦アンマウントしておく - nn::fs::Unmount(common::NAND_ARCHIVE_NAME); - - // リージョンの取得 - nn::cfg::CTR::CfgRegionCode region; - region = nn::cfg::CTR::GetRegion(); - - // シリアルナンバーの取得 - std::memset(s_SerialNo, '\0', - nn::cfg::CTR::CFG_SECURE_INFO_SERIAL_NO_LEN); - result = nn::cfg::CTR::system::GetSerialNo(s_SerialNo); - if(result.IsSuccess()) - { - s_CanReadSerialNumber = true; - } - COMMON_LOGGER_RESULT_IF_FAILED_WITH_LINE(result); - - common::HardwareInfo hwInfo; - hwInfo.AddCheckDigit(reinterpret_cast(s_SerialNo)); - - // デバイスIDの取得 - bit32 deviceId; - result = nn::ps::CTR::GetDeviceId(&deviceId); - COMMON_LOGGER_RESULT_IF_FAILED_WITH_LINE(result); - bit64 infraDeviceId; - result = nn::nim::CTR::InitializeForShop(); - COMMON_LOGGER_RESULT_IF_FAILED_WITH_LINE(result); - result = nn::nim::CTR::Shop::GetInfraDeviceId(deviceId, &infraDeviceId); - COMMON_LOGGER_RESULT_IF_FAILED_WITH_LINE(result); - result = nn::nim::CTR::FinalizeForShop(); - COMMON_LOGGER_RESULT_IF_FAILED_WITH_LINE(result); - - // MACアドレスの取得 - nn::nwm::Mac mac; - char8 macAddress[nn::nwm::Mac::MAC_STRING_SIZE]; - - result = nn::nwm::GetMacAddress(mac); - COMMON_LOGGER_RESULT_IF_FAILED_WITH_LINE(result); - mac.GetString(macAddress); - COMMON_LOGGER_RESULT_IF_FAILED_WITH_LINE(result); - - // フレンドコードの取得 - nn::friends::CTR::FriendKey friendKey; - result = nn::friends::CTR::GetMyFriendKey(&friendKey); - COMMON_LOGGER_RESULT_IF_FAILED_WITH_LINE(result); - u64 friendCode = nn::friends::CTR::FriendKeyToFriendCode(friendKey); - - // バージョンの取得 - common::GetSystemVersion(&s_VerData, region); - - // 情報出力 - COMMON_LOGGER("CTR Console Backup %s Rev.%s\n", __DATE__, BACKUP_VERSION_NUM); - COMMON_LOGGER("System Ver. %d.%d.%d-%d\n", s_VerData.cup.majorVersion, s_VerData.cup.minorVersion, s_VerData.cup.microVersion, - s_VerData.nup.majorVersion); - COMMON_LOGGER("System Region %s\n", nn::cfg::CTR::GetRegionCodeA3(region)); - COMMON_LOGGER("Serial Number %s\n", s_SerialNo); - COMMON_LOGGER("Device ID %llu\n", infraDeviceId); - COMMON_LOGGER("MAC Address %s\n", macAddress); - COMMON_LOGGER("Friend Code %04u-%04u-%04u\n", - static_cast(friendCode / 100000000ULL % 10000ULL), - static_cast(friendCode / 10000ULL % 10000ULL), - static_cast(friendCode % 10000ULL) ); - - - bool flip = false; - bool continueBackup = false; - - for(;;) - { - bool nextStep = false; - s_PadReader.ReadLatest(&padStatus); - - // AまたはSTARTボタンで進行 - if(padStatus.trigger & nn::hid::BUTTON_A || - padStatus.trigger & nn::hid::BUTTON_START) - { - nextStep = true; - } - - // LまたはRボタンで上下画面フリップ - if(padStatus.trigger & nn::hid::BUTTON_R || - padStatus.trigger & nn::hid::BUTTON_L) - { - flip = !flip; - } - - // コンソールスクロール - if(padStatus.hold & nn::hid::BUTTON_UP) - { - common::Logger::GetLoggerInstance()->ScrollUp(); - } - - // コンソールスクロール - if(padStatus.hold & nn::hid::BUTTON_DOWN) - { - common::Logger::GetLoggerInstance()->ScrollDown(); - } - - if(padStatus.hold & nn::hid::BUTTON_LEFT) - { - common::Logger::GetLoggerInstance()->ScrollToBegin(); - } - - if(padStatus.hold & nn::hid::BUTTON_RIGHT) - { - common::Logger::GetLoggerInstance()->ScrollToEnd(); - } - - - // 情報更新 - // バッテリ - mcu.GetBatteryRemain(&batteryRemain); - // ACアダプタ - std::string adapterState; - if(IsAdapterConnected()) - { - adapterState += ::std::string("Connected"); - } - else - { - adapterState += ::std::string("Not Connected"); - } - - // 操作用メッセージ - // 進捗確認メッセージを兼ねる? - ::std::vector operationMessage; - - ControlState(operationMessage, nextStep, continueBackup); - - nn::util::FloatColor titleColor; - - titleColor.r = 0.3f; - titleColor.g = 0.f; - titleColor.b = 0.2f; - - // 上画面表示 - common::DrawSystemState("CTR Console Backup", - s_RenderSystem, - titleColor, - flip, - adapterState, - BACKUP_VERSION_NUM, - &s_VerData, - batteryRemain, - infraDeviceId, - friendCode, - GetProgress(), - macAddress, - operationMessage, - region, - s_SerialNo - ); - - s_RenderSystem.SwapBuffers(); - - // デフォルトで下画面に描画するもの - s_RenderSystem.SetRenderTarget(common::GetRenderTarget(NN_GX_DISPLAY1, flip)); - if(IsBackupSucceeded()) - { - s_RenderSystem.SetClearColor(common::GetRenderTarget(NN_GX_DISPLAY1, flip), SUCCESS_COLOR); - } - if(IsBackupFailed()) - { - s_RenderSystem.SetClearColor(common::GetRenderTarget(NN_GX_DISPLAY1, flip), FAIL_COLOR); - } - s_RenderSystem.Clear(); - s_RenderSystem.SetColor(1.f, 1.f, 1.f); - - common::Logger::GetLoggerInstance()->DrawConsole(); - s_RenderSystem.SwapBuffers(); - - - s_RenderSystem.WaitVsync(NN_GX_DISPLAY_BOTH); - - // 電源長押しで終了 - if ( nn::applet::IsExpectedToCloseApplication()) - { - common::Logger::GetLoggerInstance()->Finalize(); - // アンマウント - nn::fs::Unmount(common::NAND_ARCHIVE_NAME); - nn::fs::Unmount(common::SDMC_ARCHIVE_NAME); - s_RenderSystem.Finalize(); - - nn::mcu::CTR::FinalizeHwCheck(&s_McuSession); - nn::friends::detail::Finalize(); - nn::ps::Finalize(); - nn::ptm::CTR::FinalizeForSystemMenu(); - nn::cfg::CTR::system::Finalize(); - nn::cfg::CTR::init::Finalize(); - nn::hid::Finalize(); - nn::fs::Finalize(); - - nn::applet::PrepareToCloseApplication(); - nn::applet::CloseApplication(); - } - } -} - - -} diff --git a/branches/work/SD_AesCmac/ConsoleBackup/ConsoleBackup.h b/branches/work/SD_AesCmac/ConsoleBackup/ConsoleBackup.h deleted file mode 100644 index 75f71c5..0000000 --- a/branches/work/SD_AesCmac/ConsoleBackup/ConsoleBackup.h +++ /dev/null @@ -1,41 +0,0 @@ -/*---------------------------------------------------------------------------* - Project: Horizon - File: ConsoleBackup.h - - Copyright (C)2009 Nintendo Co., Ltd. All rights reserved. - - These coded instructions, statements, and computer programs contain - proprietary information of Nintendo of America Inc. and/or Nintendo - Company Ltd., and are protected by Federal copyright law. They may - not be disclosed to third parties or copied or duplicated in any form, - in whole or in part, without the prior written consent of Nintendo. - - $Rev$ - *---------------------------------------------------------------------------*/ - -#ifndef NN_CONSOLEBACKUP_H_ -#define NN_CONSOLEBACKUP_H_ - -#include -#include "VersionDetect.h" - -namespace ConsoleBackup -{ - -bool IsAdapterConnected(); -bool IsBatteryLower(); -bool CanReadIVS(); -bool CanReadSerialNumber(); -void GetSerialNumber(u8** serial, size_t* size); -void GetIvs(void** ivs, size_t* size); -nn::Handle GetMcuHandle(); -void GetVersionData(common::VerDef* version); - -const u32 CONSOLE_WIDTH = 38; -const u32 CONSOLE_HEIGHT = 24; -const u32 CONSOLE_MAX_LINE = 1000; - -} - -/* NN_CONSOLEBACKUP_H_ */ -#endif diff --git a/branches/work/SD_AesCmac/ConsoleBackup/ConsoleBackup.rsf b/branches/work/SD_AesCmac/ConsoleBackup/ConsoleBackup.rsf deleted file mode 100644 index a30132a..0000000 --- a/branches/work/SD_AesCmac/ConsoleBackup/ConsoleBackup.rsf +++ /dev/null @@ -1,52 +0,0 @@ -BasicInfo: - Title : ConsoleBackup - ProductCode: ConsoleBackup - BackupMemoryType: None - -TitleInfo: - Use: Evaluation - Category: Application - UniqueId: 0xf8021 - Version: 0 - -SystemControlInfo: - AppType : Application - StackSize : 0x4000 - Dependency : - - gpio - - pdn - - spi - - i2c - - mcu - - ptm - - codec - - cfg - - hid - - gsp - - friends - - nim - - ac - - ndm - -AccessControlInfo: - Priority : 16 - DisableDebug : true - - FileSystemAccess: - - DirectSdmc - - Debug - - Core - - CategoryFileSystemTool - - IoAccessControl: - - FsMountCardSpi - - FsMountNand - - FsMountTwln - -Option: - FreeProductCode: true - - -Rom: - # ROM に含めるファイルシステムのルートパスを指定します。 - HostRoot: "$(ROMFS_ROOT)" \ No newline at end of file diff --git a/branches/work/SD_AesCmac/ConsoleBackup/Controller.cpp b/branches/work/SD_AesCmac/ConsoleBackup/Controller.cpp deleted file mode 100644 index 32cd6b5..0000000 --- a/branches/work/SD_AesCmac/ConsoleBackup/Controller.cpp +++ /dev/null @@ -1,313 +0,0 @@ -/*---------------------------------------------------------------------------* - Project: Horizon - File: Controller.cpp - - Copyright 2009 Nintendo. All rights reserved. - - These coded instructions, statements, and computer programs contain - proprietary information of Nintendo of America Inc. and/or Nintendo - Company Ltd., and are protected by Federal copyright law. They may - not be disclosed to third parties or copied or duplicated in any form, - in whole or in part, without the prior written consent of Nintendo. - - $Rev$ - *---------------------------------------------------------------------------*/ - -#include "Controller.h" -#include "FileChecker.h" -#include "ConsoleBackup.h" -#include "Exporter.h" -#include "SimplePlayer.h" -#include "CommonLogger.h" - -#include - -namespace ConsoleBackup -{ - -namespace -{ - -typedef enum BackupState -{ - STARTUP, // 初期値 - EXPORT_TWL_SOUND, // TWLサウンド領域の吸出し中 - EXPORT_TWL_PHOTO, // TWL写真領域の吸出し中 - EXPORT_CTR_NAND, // 吸出し中 - DELETE_NIM, // nimのシステムセーブデータ削除 - DONE, // 吸出し完了 - FINISHED, // SDカード抜き完了 - FAIL // 失敗 -} BackupState; - - -// APSettingの書式が無い警告サウンドを鳴らしたかどうか -bool s_ExistAPSettingAnnotation = false; -// SDに書き込みできない警告サウンドを鳴らしたかどうか -bool s_SdWriteProetctAnnotation = false; - -BackupState s_BackupState = STARTUP; -bool s_PlayedStartCursor = false; -bool s_PlayedSdPullOutCursor = false; -bool s_PlayedFinishedSound = false; -bool s_PlayedFailSound = false; - -} // namespace - -bool NeedsAcAdateper() -{ - return IsBatteryLower() && !IsAdapterConnected(); -} - -void ControlState(::std::vector& operationMessage, bool& nextStep, bool& continueBackup) -{ - // 状態遷移Controller - switch (s_BackupState) - { - - // 起動時 - case STARTUP: - { - bool error = false; - // 完全性検証SEEDを読めるか? - if (CanReadIVS()) - { - // SDカードが挿入されているか? - if (nn::fs::IsSdmcInserted()) - { - // SDカードに書き込みできるか? - if (!nn::fs::IsSdmcWritable()) - { - if (!s_SdWriteProetctAnnotation) - { - s_SdWriteProetctAnnotation = true; - common::PlaySound(common::SOUND_ANNOTATION); - } - operationMessage.push_back(::std::string("Can*t Write SD Card!!\n")); - break; - } - - // 無線設定ファイルがあるか? - if (common::ExistsAPSetting()) - { - // 書き込み中に抜かないように - if (nextStep) - { - // シリアルナンバーを読み取れるか? - if (!CanReadSerialNumber()) - { - common::PlaySound(common::SOUND_ANNOTATION); - COMMON_LOGGER("Can't Read Serial Number\n"); - } - } - } - else - { - error = true; - if (!s_ExistAPSettingAnnotation) - { - s_ExistAPSettingAnnotation = true; - common::PlaySound(common::SOUND_ANNOTATION); - } - operationMessage.push_back(::std::string("Accsess_Point_Setting does not exist!")); - } - } - else - { - error = true; - operationMessage.push_back(::std::string("Insert SD Card!!")); - } - } - else - { - error = true; - operationMessage.push_back(::std::string("Can't Read IVS!!")); - } - - // ACアダプタが必要か? - if (NeedsAcAdateper()) - { - error = true; - operationMessage.push_back(::std::string("Connect AC Adapter!!")); - } - - // エラーが無ければ進行用メッセージ表示 - if(!error) - { - operationMessage.push_back(::std::string("Push A or START Button")); - if(!s_PlayedStartCursor) - { - common::PlaySound(common::SOUND_CURSOR); - s_PlayedStartCursor = true; - } - } - - if (nextStep && !error) - { - COMMON_LOGGER("Start Export Data\n"); - s_BackupState = EXPORT_TWL_SOUND; - } - } - break; - - // TWLサウンド領域の吸出し中 - case EXPORT_TWL_SOUND: - { - static bool init = true; - if(init) - { - // データを書き込む - ExportTwlSoundData(); - init = false; - } - - // 処理が完了した - if (IsExportFinished()) - { - FinalizeExportThread(); - s_BackupState = EXPORT_TWL_PHOTO; - } - } - break; - - // TWL写真領域の吸出し中 - case EXPORT_TWL_PHOTO: - { - static bool init = true; - if(init) - { - // データを書き込む - ExportTwlPhotoData(); - init = false; - } - - // 処理が完了した - if (IsExportFinished()) - { - FinalizeExportThread(); - s_BackupState = EXPORT_CTR_NAND; - } - } - break; - - // 吸出し中 - case EXPORT_CTR_NAND: - { - continueBackup = true; - - // ACアダプタが必要か? - if (NeedsAcAdateper()) - { - continueBackup = false; - operationMessage.push_back(::std::string("Connect AC Adapter!!")); - } - - // データを書き込む - ExportData(); - - // 処理が完了した - if (continueBackup && IsExportFinished()) - { - FinalizeExportThread(); - COMMON_LOGGER("Export NAND Data Finished.\n"); - - if(GetProgress() > 99) - { - s_BackupState = DELETE_NIM; - } - else - { - s_BackupState = FAIL; - } - - } - } - break; - - // nimのシステムセーブデータ削除 - case DELETE_NIM: - { - DeleteNimSaveData(); - s_BackupState = DONE; - } - break; - - // 吸出し完了 - case DONE: - { - operationMessage.push_back(::std::string("Backup Done. Pull Out SD Card.")); - if(!s_PlayedSdPullOutCursor) - { - common::PlaySound(common::SOUND_CURSOR); - s_PlayedSdPullOutCursor = true; - } - } - break; - - // SDカード抜き完了 - case FINISHED: - { - operationMessage.push_back(::std::string("Backup Succeeded!!\n")); - if(!s_PlayedFinishedSound) - { - common::PlaySound(common::SOUND_OK); - s_PlayedFinishedSound = true; - } - } - break; - - // 吸出し失敗 - case FAIL: - { - operationMessage.push_back(::std::string("Backup Failed.")); - if(!s_PlayedFailSound) - { - common::PlaySound(common::SOUND_NG); - s_PlayedFailSound = true; - } - } - break; - - } -} - -bool InProgress() -{ - return s_BackupState == EXPORT_CTR_NAND; -} - -bool IsBackupSucceeded() -{ - return s_BackupState == FINISHED; -} - -bool IsBackupFailed() -{ - return s_BackupState == FAIL; -} - -void OnSdEjected() -{ - if(s_BackupState == DONE || s_BackupState == FINISHED) - { - s_BackupState = FINISHED; - } - else - { - common::InitializeFileCheck(); - InitializeState(); - } -} - -void InitializeState() -{ - s_BackupState = STARTUP; - s_PlayedFailSound = false; - s_PlayedFinishedSound = false; - s_ExistAPSettingAnnotation = false; - s_PlayedStartCursor = false; - s_PlayedSdPullOutCursor = false; - s_SdWriteProetctAnnotation = false; -} - -} // namespace ConsoleBackup diff --git a/branches/work/SD_AesCmac/ConsoleBackup/Controller.h b/branches/work/SD_AesCmac/ConsoleBackup/Controller.h deleted file mode 100644 index d7f2cbf..0000000 --- a/branches/work/SD_AesCmac/ConsoleBackup/Controller.h +++ /dev/null @@ -1,34 +0,0 @@ -/*---------------------------------------------------------------------------* - Project: Horizon - File: Contoroller.h - - Copyright 2009 Nintendo. All rights reserved. - - These coded instructions, statements, and computer programs contain - proprietary information of Nintendo of America Inc. and/or Nintendo - Company Ltd., and are protected by Federal copyright law. They may - not be disclosed to third parties or copied or duplicated in any form, - in whole or in part, without the prior written consent of Nintendo. - - $Rev$ - *---------------------------------------------------------------------------*/ - -#ifndef CONTOROLLER_H_ -#define CONTOROLLER_H_ - -#include -#include - -namespace ConsoleBackup -{ - -void ControlState(::std::vector& operationMessage, bool& nextStep, bool& continueBackup); -bool InProgress(); -bool IsBackupSucceeded(); -bool IsBackupFailed(); -void OnSdEjected(); -void InitializeState(); - -} - -#endif /* CONTOROLLER_H_ */ diff --git a/branches/work/SD_AesCmac/ConsoleBackup/Exporter.cpp b/branches/work/SD_AesCmac/ConsoleBackup/Exporter.cpp deleted file mode 100644 index f857ebe..0000000 --- a/branches/work/SD_AesCmac/ConsoleBackup/Exporter.cpp +++ /dev/null @@ -1,558 +0,0 @@ -/*---------------------------------------------------------------------------* - Project: Horizon - File: Exporter.cpp - - Copyright 2009 Nintendo. All rights reserved. - - These coded instructions, statements, and computer programs contain - proprietary information of Nintendo of America Inc. and/or Nintendo - Company Ltd., and are protected by Federal copyright law. They may - not be disclosed to third parties or copied or duplicated in any form, - in whole or in part, without the prior written consent of Nintendo. - - $Rev$ - *---------------------------------------------------------------------------*/ - -#include -#include -#include -#include -#include -#include -#include -#include -#include // cfg:norの初期化に必要 -#include -#include -#include -#include -#include - -#include "Exporter.h" -#include "CommonLogger.h" -#include "SDMountManager.h" -#include "ConsoleBackup.h" -#include "HeapManager.h" -#include "SdReaderWriter.h" -#include "FileName.h" -#include "FileTransfer.h" -#include "common_Types.h" -#include "Aes_define.h" -#include "PlayHistoryManager.h" -#include "VersionDetect.h" - -namespace ConsoleBackup -{ - -namespace -{ - -common::SdReaderWriter s_SdWriter; -common::NtrNorData s_NtrNorData; -common::CfgCountryLanguage s_CountryLanguage; - -::std::string s_SysSaveRoot; - -const size_t EXPORT_THREAD_STACK_SIZE = 0x4000; -nn::os::Thread s_ExportThread; -nn::os::StackBuffer s_ExportThreadStack; - -wchar_t s_RootName[256]; - -} - -void DeleteTrash(std::wstring currentDirectory) -{ - // TODO: リードオンリーのファイルが消去できない - - COMMON_LOGGER("Delete Trash.\n"); - - nn::fs::FileInputStream fis; - nn::fs::Directory dir; - nn::Result result; - std::vector entryList; //カレントディレクトリのエントリ一覧を格納 - std::vector::iterator entryIndex; - - common::SdMountManager::Mount(); - - result = dir.TryInitialize(currentDirectory.c_str()); - - if (result.IsSuccess()) - { - nn::fs::DirectoryEntry entry; - s32 numEntry; - for (;;) - { - result = dir.TryRead(&numEntry, &entry, 1); - if (result.IsFailure()) - { - dir.Finalize(); - } - if (numEntry == 0) - { - // ルートディレクトリを閉じる - dir.Finalize(); - - // ルートディレクトリの子を開く - for (entryIndex = entryList.begin(); entryIndex != entryList.end(); entryIndex++) - { - // ディレクトリなら削除する - if (entryIndex->attributes.isDirectory) - { - NN_LOG("Try Delete %ls%ls/\n", currentDirectory.c_str(), entryIndex->entryName); - result = nn::fs::TryDeleteDirectoryRecursively((currentDirectory + ::std::wstring( - entryIndex->entryName)).c_str()); - COMMON_LOGGER_RESULT_IF_FAILED_WITH_LINE(result); - - } - // ファイルならログとAP設定以外は削除する - else - { - if (std::wcscmp(entryIndex->entryName, common::AP_SETTING_FILENAME) != 0 && std::wcscmp( - entryIndex->entryName, common::LOG_FILENAME) != 0) - { - NN_LOG("Try Delete %ls%ls\n", currentDirectory.c_str(), entryIndex->entryName); - result = nn::fs::TryDeleteFile( - (currentDirectory + ::std::wstring(entryIndex->entryName)).c_str()); - COMMON_LOGGER_RESULT_IF_FAILED_WITH_LINE(result); - } - } - } - - // 削除完了 - break; - } - else - { - // vectorに保存する - entryList.push_back(entry); - if (entry.attributes.isDirectory) - { - NN_LOG("%ls%ls/\n", currentDirectory.c_str(), entry.entryName); - } - else - { - NN_LOG("%ls%ls\n", currentDirectory.c_str(), entry.entryName); - } - } - } - } - else - { - NN_LOG("failed initialize directory\n"); - COMMON_LOGGER_RESULT_IF_FAILED_WITH_LINE(result); - dir.Finalize(); - } - - common::SdMountManager::Unmount(); -} - -void WriteRegionData() -{ - COMMON_LOGGER("Export Region Data.\n"); - - nn::cfg::CTR::CfgRegionCode region; - region = nn::cfg::CTR::GetRegion(); - - s_SdWriter.WriteBufWithCmac(common::REGION_DATA_PATHNAME, ®ion, sizeof(nn::cfg::CTR::CfgRegionCode)); -} - -void WriteCountryLanguageData() -{ - COMMON_LOGGER("Export Country and Language Data.\n"); - - nn::Result result; - - nn::cfg::nor::CTR::Initialize(); - - // 国設定 - s_CountryLanguage.country = nn::cfg::CTR::GetCountry(); - if (s_CountryLanguage.country != nn::cfg::CTR::CFG_COUNTRY_UNKNOWN) - { - // 言語設定 - s_CountryLanguage.language = nn::cfg::CTR::GetLanguage(); - - s_SdWriter.WriteBufWithCmac(common::COUNTRY_SETTING_PATHNAME, &s_CountryLanguage, sizeof(s_CountryLanguage)); - } -} - -void WriteNorData() -{ - COMMON_LOGGER("Export NOR Data.\n"); - - nn::Result result; - - nn::cfg::nor::CTR::Initialize(); - - NN_LOG("Get NTR User Setting\n"); - - // NTR設定 - result = nn::cfg::nor::CTR::GetNtrSetting(&s_NtrNorData.ntrConfig.ncd, &s_NtrNorData.ntrConfig.ncd_ex); - COMMON_LOGGER_RESULT_IF_FAILED_WITH_LINE(result); - - // TWL WiFi設定 - result = nn::cfg::nor::CTR::ReadTwlWifiSetting(0, s_NtrNorData.TwlWiFiSetting, common::TWL_WIFI_SETTING_SIZE); - COMMON_LOGGER_RESULT_IF_FAILED_WITH_LINE(result); - - // NTR WiFi設定 - result = nn::cfg::nor::CTR::ReadNtrWifiSetting(0, s_NtrNorData.NtrWiFiSetting, common::NTR_WIFI_SETTING_SIZE); - COMMON_LOGGER_RESULT_IF_FAILED_WITH_LINE(result); - - s_SdWriter.WriteBufWithCmac(common::NOR_PATHNAME, &s_NtrNorData, sizeof(common::NtrNorData)); -} - -void WriteSerialNumber() -{ - COMMON_LOGGER("Export Serial Number.\n"); - - u8* serial; - size_t size; - GetSerialNumber(&serial, &size); - - s_SdWriter.WriteBufWithCmac(common::SERIAL_PATHNAME, serial, size); -} - -void WriteIvs() -{ - COMMON_LOGGER("Export IVS.\n"); - - bit8 iv[AES_BLOCK_SIZE] = - { - 0xdf, 0x0f, 0xf9, 0x1b, 0x34, 0x47, 0x70, 0x7f, - 0x7d, 0x06, 0x85, 0xe6, 0xe7, 0xb6, 0x4e, 0xe9 - }; - - void* ivs; - size_t size; - GetIvs(&ivs, &size); - - void* enc; - nn::Result result; - enc = common::HeapManager::GetHeap()->Allocate(size); - if(enc != NULL) - { - // AES暗号化する - nn::crypto::Initialize(); - - nn::crypto::SwAesCtrContext swAesCtrContest; - - swAesCtrContest.Initialize(iv, common::key, sizeof(common::key)); - swAesCtrContest.Encrypt(enc, ivs, size); - - s_SdWriter.WriteBufWithCmac(common::IVS_PATHNAME, enc, size); - - common::HeapManager::GetHeap()->Free(enc); - } -} - -// IVSからセーブデータディレクトリ名を生成する -void GetSaveDataDirectoryRoot() -{ - nn::Result result; - using namespace nn::dbg; - - const size_t SEED_SIZE = 16; - bit8 hash[nn::crypto::Sha256Context::HASH_SIZE]; - const size_t SYS_SAVE_ROOT_LENGTH = 16; - char rootHash[SYS_SAVE_ROOT_LENGTH]; - char rootStr[SYS_SAVE_ROOT_LENGTH * 2 + 1]; - - void* addr; - size_t size; - GetIvs(&addr, &size); - - // 最後の16バイトのハッシュを使う - nn::crypto::CalculateSha256(hash, &reinterpret_cast (addr)[size - SEED_SIZE], SEED_SIZE); - - for (u8 i = 0; i < SEED_SIZE / 4; i++) - { - for (u8 j = 0; j < SEED_SIZE / 4; j++) - { - rootHash[i * 4 + j] = hash[i * 4 + 3 - j]; - } - } - - // 得られたハッシュから文字列を生成 - for (s32 k = 0; k < SEED_SIZE; k++) - { - for (s32 i = 6; i < 8; ++i) - { - bit32 n = (rootHash[k] >> ((7 - i) * 4)) & 0xf; - NN_TASSERT_(n < 16); - rootStr[i - 6 + k * 2] = static_cast (n < 10 ? '0' + n : 'a' + (n - 10)); - } - } - rootStr[SYS_SAVE_ROOT_LENGTH * 2] = '\0'; - - // セーブデータディレクトリ名を保存する - s_SysSaveRoot = ::std::string(rootStr); - - NN_LOG("%s\n", s_SysSaveRoot.c_str()); -} - -void CreateTwlDirectory(enum common::TWL_PATH_INDEX path) -{ - NN_ASSERT(path < common::TWL_PATHNAME_MAX); - - s_SdWriter.CreateDirectory((::std::wstring(common::SDMC_ROOT_DIRECTORY_PATH) + - std::wstring(common::SD_TWL_ROOTNAME_TABLE[path])).c_str()); -} - -void WriteTwlData(enum common::TWL_PATH_INDEX path) -{ - NN_ASSERT(path < common::TWL_PATHNAME_MAX); - - nn::Result result; - - result = nn::fs::MountSpecialArchive(common::TWL_ARCHIVE_NAME_TABLE[path], common::TWL_FS_ARCHIVE_KIND[path]); - COMMON_LOGGER_RESULT_IF_FAILED_WITH_LINE(result); - - result = common::SdMountManager::Mount(); - - size_t bufSize = common::HeapManager::GetHeap()->GetAllocatableSize(); - NN_LOG("AllocatableSize = %d\n", bufSize); - - u32 fileNum = 0; - u32 fileSize = 0; - common::CalculateFileNum(::std::wstring(common::NAND_TWL_ROOT_PATHNAME_WITH_SLASH_TABLE[path]), fileNum, fileSize); - - nn::fs::Unmount(common::NAND_ARCHIVE_NAME); - - NN_LOG("File Number = %d\n", fileNum); - NN_LOG("File Size = %d\n", fileSize); - // 進捗表示用 - common::InitializeTransferProgress(fileSize); - - void* buf = common::HeapManager::GetHeap()->Allocate(bufSize); - if (buf != NULL) - { - wchar_t archiveName[256]; - ::std::mbstowcs(archiveName, common::TWL_ARCHIVE_NAME_TABLE[path], std::strlen(common::TWL_ARCHIVE_NAME_TABLE[path]) + 1); - std::wstring archiveString(archiveName); - common::CopyDirectory( - (archiveString + ::std::wstring(L"/")).c_str(), - (common::SDMC_ROOT_DIRECTORY_PATH + ::std::wstring(common::SD_TWL_ROOTNAME_TABLE[path])).c_str(), - buf, bufSize); - - common::HeapManager::GetHeap()->Free(buf); - } - - common::SdMountManager::Unmount(); - nn::fs::Unmount(common::TWL_ARCHIVE_NAME_TABLE[path]); - -} - -void WriteTwlPhotoData() -{ - COMMON_LOGGER("Export Twl Photo Data.\n"); - CreateTwlDirectory(common::TWL_PHOTO); - WriteTwlData(common::TWL_PHOTO); -} - -void WriteTwlSoundData() -{ - COMMON_LOGGER("Export Twl Sound Data.\n"); - CreateTwlDirectory(common::TWL_SOUND); - WriteTwlData(common::TWL_SOUND); -} - -void ExportTwlPhotoData() -{ - s_ExportThread.Start(WriteTwlPhotoData, s_ExportThreadStack); -} - -void ExportTwlSoundData() -{ - // 不要なデータを削除する - DeleteTrash(common::SDMC_ROOT_DIRECTORY_PATH); - - s_ExportThread.Start(WriteTwlSoundData, s_ExportThreadStack); -} - - -void WriteMcuRtcData() -{ - COMMON_LOGGER("Export RTC Data.\n"); - nn::Result result; - nn::Handle handle = GetMcuHandle(); - - if(handle.IsValid()) - { - nn::mcu::CTR::HwCheck mcu(handle); - - nn::mcu::CTR::RtcData rtc; - result = mcu.GetRtcAll(&rtc); - NN_LOG("RTC = 20%02d/%02d/%02d %02d:%02d:%02d\n", rtc.m_Year, rtc.m_Month, rtc.m_Day, rtc.m_Hour, rtc.m_Minute, rtc.m_Second); - COMMON_LOGGER_RESULT_IF_FAILED_WITH_LINE(result); - - s_SdWriter.WriteBufWithCmac(common::MCU_RTC_PATHNAME, &rtc, sizeof(rtc)); - } - else - { - NN_LOG("invalid handle\n"); - } -} - -void ExportThreadFunc() -{ - nn::Result result; - - result = nn::fs::MountSpecialArchive(common::NAND_ARCHIVE_NAME, nn::fs::CTR::ARCHIVE_TYPE_CTR_NAND); - COMMON_LOGGER_RESULT_IF_FAILED_WITH_LINE(result); - - result = common::SdMountManager::Mount(); - - size_t bufSize = common::HeapManager::GetHeap()->GetAllocatableSize(); - NN_LOG("AllocatableSize = %d\n", bufSize); - - void* buf = common::HeapManager::GetHeap()->Allocate(bufSize); - if (buf != NULL) - { - - common::CopyDirectory( - (::std::wstring(common::NAND_DATA_ROOT_PATHNAME_WITH_SLASH) + ::std::wstring(s_RootName) + ::std::wstring(L"/")).c_str(), - (common::SDMC_ROOT_DIRECTORY_PATH + ::std::wstring(common::SD_SAVEDATA_ROOT_NAME) + ::std::wstring(s_RootName) + ::std::wstring(L"/")).c_str(), - buf, bufSize); - - common::HeapManager::GetHeap()->Free(buf); - } - - common::SdMountManager::Unmount(); - nn::fs::Unmount(common::NAND_ARCHIVE_NAME); - - NN_LOG("Export Thread Finalize\n"); -} - -nn::Result WriteSaveData() -{ - // NANDからSDカードに書き出し - nn::Result result; - - result = nn::fs::MountSpecialArchive(common::NAND_ARCHIVE_NAME, nn::fs::CTR::ARCHIVE_TYPE_CTR_NAND); - COMMON_LOGGER_RESULT_IF_FAILED_WITH_LINE(result); - - u32 fileNum = 0; - u32 fileSize = 0; - common::CalculateFileNum(::std::wstring(common::NAND_DATA_ROOT_PATHNAME_WITH_SLASH), fileNum, fileSize); - - nn::fs::Unmount(common::NAND_ARCHIVE_NAME); - - NN_LOG("File Number = %d\n", fileNum); - NN_LOG("File Size = %d\n", fileSize); - // 進捗表示用 - common::InitializeTransferProgress(fileSize); - - ::std::mbstowcs(s_RootName, s_SysSaveRoot.c_str(), s_SysSaveRoot.size() + 1); - - NN_LOG("%ls\n", (::std::wstring(common::NAND_DATA_ROOT_PATHNAME_WITH_SLASH) + ::std::wstring(s_RootName) + ::std::wstring(L"/")).c_str()); - - // セーブデータディレクトリ以下のデータをSDカードにコピー - // コピー用ディレクトリ作成 - s_SdWriter.CreateDirectory((::std::wstring(common::SDMC_ROOT_DIRECTORY_PATH) + ::std::wstring( - common::SD_SAVEDATA_ROOT_NAME)).c_str()); - s_SdWriter.CreateDirectory((::std::wstring(common::SDMC_ROOT_DIRECTORY_PATH) + ::std::wstring( - common::SD_SAVEDATA_ROOT_NAME) + ::std::wstring(s_RootName) + ::std::wstring(L"/")).c_str()); - - COMMON_LOGGER("Export NAND Data Start...\n"); - - // SDにコピーするためのスレッドの作成 - s_ExportThread.Start(ExportThreadFunc, s_ExportThreadStack); - - return result; -} - -void FinalizeExportThread() -{ - s_ExportThread.Join(); - s_ExportThread.Finalize(); -} - -void WriteVersionData() -{ - COMMON_LOGGER("Export Version Data.\n"); - - common::VerDef versionData; - GetVersionData(&versionData); - - s_SdWriter.WriteBufWithCmac(common::VERSION_DATA_PATHNAME, &versionData, sizeof(common::VerDef)); -} - -void WritePlayHistory() -{ - common::PlayHistoryManager historyManager; - - COMMON_LOGGER("Export PlayHistory\n"); - historyManager.Export(); -} - -void DeleteNimSaveData() -{ - nn::Result result; - ::std::wstring nimSaveDataPath = - ::std::wstring(common::SDMC_ROOT_DIRECTORY_PATH) + - ::std::wstring(common::SD_SAVEDATA_ROOT_NAME) + - ::std::wstring(s_RootName) + - ::std::wstring(L"/") + - std::wstring(common::NIM_SAVEDATA_DIRECTORY_NAME); - - common::SdMountManager::Mount(); - - NN_LOG("%ls\n", nimSaveDataPath.c_str()); - result = nn::fs::TryDeleteDirectoryRecursively(nimSaveDataPath.c_str()); - COMMON_LOGGER_RESULT_IF_FAILED_WITH_LINE(result); - - common::SdMountManager::Unmount(); -} - - -void ExportData() -{ - static bool init = true; - - if (init) - { - // リージョンデータをSDに書き込む - WriteRegionData(); - - // 国データと言語データをSDに書き込む - WriteCountryLanguageData(); - - // NORデータをSDカードに書き込む - WriteNorData(); - - // シリアルナンバーをSDカードに書き込む - WriteSerialNumber(); - - // 完全性検証SEEDをSDカードに書き込む - WriteIvs(); - - // IVSからセーブデータディレクトリ名を計算 - GetSaveDataDirectoryRoot(); - - // プレイ履歴をSDに書き出す - //WritePlayHistory(); - - // RTCをSDに書き出す - WriteMcuRtcData(); - - // バージョン情報をSDに書き出す - WriteVersionData(); - - // NANDのセーブデータをSDに書き出す - WriteSaveData(); - - init = false; - } -} - -u32 GetProgress() -{ - return common::GetProgress(); -} - -bool IsExportFinished() -{ - return !s_ExportThread.IsAlive(); -} - -} diff --git a/branches/work/SD_AesCmac/ConsoleBackup/Exporter.h b/branches/work/SD_AesCmac/ConsoleBackup/Exporter.h deleted file mode 100644 index 216a277..0000000 --- a/branches/work/SD_AesCmac/ConsoleBackup/Exporter.h +++ /dev/null @@ -1,36 +0,0 @@ -/*---------------------------------------------------------------------------* - Project: Horizon - File: Exporter.h - - Copyright 2009 Nintendo. All rights reserved. - - These coded instructions, statements, and computer programs contain - proprietary information of Nintendo of America Inc. and/or Nintendo - Company Ltd., and are protected by Federal copyright law. They may - not be disclosed to third parties or copied or duplicated in any form, - in whole or in part, without the prior written consent of Nintendo. - - $Rev$ - *---------------------------------------------------------------------------*/ - -#ifndef EXPORTER_H_ -#define EXPORTER_H_ - -#include - -namespace ConsoleBackup -{ - -void ExportTwlPhotoData(); -void ExportTwlSoundData(); -void ExportData(); -void DeleteNimSaveData(); - -u32 GetProgress(); -bool IsExportFinished(); -void FinalizeExportThread(); - - -} - -#endif /* EXPORTER_H_ */ diff --git a/branches/work/SD_AesCmac/ConsoleBackup/OMakefile b/branches/work/SD_AesCmac/ConsoleBackup/OMakefile deleted file mode 100644 index b152d3d..0000000 --- a/branches/work/SD_AesCmac/ConsoleBackup/OMakefile +++ /dev/null @@ -1,84 +0,0 @@ -#!/usr/bin/env omake -#---------------------------------------------------------------------------- -# Project: Horizon -# File: OMakefile -# -# Copyright (C)2009 Nintendo Co., Ltd. All rights reserved. -# -# These coded instructions, statements, and computer programs contain -# proprietary information of Nintendo of America Inc. and/or Nintendo -# Company Ltd., and are protected by Federal copyright law. They may -# not be disclosed to third parties or copied or duplicated in any form, -# in whole or in part, without the prior written consent of Nintendo. -# -# $Rev$ -#---------------------------------------------------------------------------- -SUPPORTED_TARGETS = CTR-T*.Process.MPCore.* -#MAKECSU = true -#INSTALL_SDK_TOOL = true -CTR_APPTYPE = BOTH -CTR_MAKE_DEVELOPMENT_IMAGE = true - -TARGET_PROGRAM = ConsoleBackup - -SAMPLED_DEMOS_COMMON_INCLUDE_DIR = $(dir $(HORIZON_ROOT)/../CTR/SampleDemos/common/include) -INCLUDES += $(SAMPLED_DEMOS_COMMON_INCLUDE_DIR) \ - ../common - -SOURCES[] = - ConsoleBackup.cpp - Controller.cpp - Exporter.cpp - ../common/HardwareInfo.cpp - ../common/DrawSystemState.cpp - ../common/FileTransfer.cpp - ../common/FileChecker.cpp - ../common/SdReaderWriter.cpp - ../common/HeapManager.cpp - ../common/SdLogger.cpp - ../common/wave.cpp - ../common/SimplePlayer.cpp - ../common/LogConsole.cpp - ../common/CommonLogger.cpp - ../common/SdMountManager.cpp - ../common/PlayHistoryManager.cpp - ../common/VersionDetect.cpp - -CTR_BANNER_SPEC = $(TARGET_PROGRAM).bsf - -ROMFS_ROOT = ../common/romfiles - -LIBS += libnn_cfg \ - libnn_driversEeprom \ - libnn_driversi2c \ - libnn_driversCal \ - libnn_crypto \ - libnn_driversCodec \ - libnn_spi \ - libnn_gpio \ - libnn_pdn \ - libnn_mcu \ - libnn_i2c \ - libnn_driversCamera \ - libnn_ps \ - libnn_driversRsa \ - lib_demo \ - libnn_nwm \ - libnn_friends \ - libnn_nim \ - -INSTALL_SDK_TOOL = true - -ROM_SPEC_FILE = $(TARGET_PROGRAM).rsf -DESCRIPTOR = $(HORIZON_ROOT)/resources/specfiles/_private/RepairTool.desc - -include $(ROOT_OMAKE)/modulerules - -VERSION_H = $(file version.h) - -$(VERSION_H): $(SOURCES) - section - bash genversion.sh - -RequireSetup($(VERSION_H)) -build: $(VERSION_H) $(DEFAULT_TARGETS) diff --git a/branches/work/SD_AesCmac/ConsoleBackup/banner/model.cbmd b/branches/work/SD_AesCmac/ConsoleBackup/banner/model.cbmd deleted file mode 100644 index f1c7b6279e13f5278c419d615d7d03d5660005e5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 198785 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 MDvwobWH version.h diff --git a/branches/work/SD_AesCmac/ConsoleRestore/ConsoleRestore.bsf b/branches/work/SD_AesCmac/ConsoleRestore/ConsoleRestore.bsf deleted file mode 100644 index 104a94da96cd5d963d349ca5c6fcce26ae7e3cbb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2302 zcmb7@%}&BV6ov0r6Q4m6H@Z+KhJ|rsM6B@-iN&}UA&7ugsXvL2;Tss=z?CbPK7-HU z)`;f}40Xb^b~0(1PS3sfyQi1I&zzJblt2oys8<2cr*etalpCCea)sR)c7e2|i~WpD z%Rcro7N2+UHiF)~Uy~`R|H-i|w|LvZ70EsBD^ipPeP2RkjQky)vxJ;2?`%a`MK<2; zYzL^;09`kOt2fp#wk|zHu)7fFWNu`{_Q#rGY=0EX_#@P9p&Pog2InT%2DrMq)-it1 z5bM@4GJuy|>5rV>09lO8Ax`gbHW_E@jjjxRjO#yrP0mrF2RAOE<`)kz2d6kOwUp*I z93`+s$UK?1hPc}iwV4q^!TDfENmN43p675qs~7dEzSM{MR`2Q)_czs1k9R9iC+b3# z6`dZs&Cc53ZE5GPQMHZQ&9SRVZt6E>3%bKUwF@%riEnqMis|N;Ye~iGdv;(iqYmL% zgnF^1x3#kaqppIk4p-ag{~U}rnxmrmV?1-}BHb4wwvf|Jvo7{BYB!CoUDx@U+m9xI zZ~1Ac&QC+NAI&!0$)cen)MPOjjbG&*sbyA9+-82Nvlu4Tel%g~#LiszPN!@7sdh7@sr_j7@Sk?igDXGP`DhB-LF)Z@%5t2-lYH^vj#EOln -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "demo.h" - -#include -#include - -#include "ConsoleRestore.h" -#include "DrawSystemState.h" -#include "Controller.h" -#include "SimplePlayer.h" -#include "CommonLogger.h" -#include "SDMountManager.h" -#include "HeapManager.h" -#include "VersionDetect.h" -#include "HardwareInfo.h" - -// svnリビジョン埋め込み用 -#include "version.h" -#ifndef RESTORE_VERSION_NUM -#define RESOTRE_VERSION_NUM 0 -#endif - -namespace { - -// グラフィックスに割り当てるメモリ -const size_t s_GxHeapSize = 0x800000; - -demo::RenderSystemDrawing s_RenderSystem; -nn::Handle s_McuSession; - -// バッテリ残量 -u8 batteryRemain = 100; - -// シリアルナンバー -u8 s_SerialNo[nn::cfg::CTR::CFG_SECURE_INFO_SERIAL_NO_LEN]; - -// シリアルナンバーが読めるかどうか -bool s_CanReadSerialNumber = false; - -// IVSへのポインタ -void* sp_Ivs; - -size_t s_SizeofIvs; - -// IVSが読めるかどうか -bool s_CanReadIvs = false; - -// バージョン情報 -common::VerDef s_VerData; - -} // namespace - -namespace ConsoleRestore{ - -bool IsAdapterConnected() -{ - return nn::ptm::CTR::GetAdapterState() == nn::ptm::CTR::ADAPTERSTATE_CONNECTED; -} - -bool IsBatteryLower() -{ - return batteryRemain <= 10; -} - -bool CanReadIVS() -{ - return s_CanReadIvs; -} - -bool CanReadSerialNumber() -{ - return s_CanReadSerialNumber; -} - -void GetSerialNumber(u8** serial, size_t* size) -{ - *serial = s_SerialNo; - *size = nn::cfg::CTR::CFG_SECURE_INFO_SERIAL_NO_LEN; -} - -void GetIvs(void** ivs, size_t* size) -{ - *ivs = sp_Ivs; - *size = s_SizeofIvs; -} - -void GetVersionData(common::VerDef* version) -{ - *version = s_VerData; -} - -void FinalizeAll() -{ - common::Logger::GetLoggerInstance()->Finalize(); - // アンマウント - nn::fs::Unmount("nand:"); - nn::fs::Unmount("sdmc:"); - s_RenderSystem.Finalize(); - - nn::mcu::CTR::FinalizeHwCheck(&s_McuSession); - nn::friends::detail::Finalize(); - nn::ps::Finalize(); - nn::ptm::CTR::FinalizeForSystemMenu(); - nn::cfg::CTR::system::Finalize(); - nn::cfg::CTR::init::Finalize(); - nn::hid::Finalize(); - nn::fs::Finalize(); - - nn::applet::PrepareToCloseApplication(); - nn::applet::CloseApplication(); -} - -nn::Handle GetMcuHandle() -{ - return s_McuSession; -} - -extern "C" void nnMain(void) -{ - nn::Result result; - - // os の初期化 - nn::os::Initialize(); - - // fs の初期化 - nn::fs::Initialize(); - - // appletの初期化 - nn::applet::Enable( false ); - - // hid の初期化 - result = nn::hid::Initialize(); - NN_ERR_THROW_FATAL_IF_FATAL_ONLY(result); - - // ndmの初期化 - result = nn::ndm::Initialize(); - NN_ERR_THROW_FATAL_IF_FATAL_ONLY(result); - - // デーモンの自律動作を停止 - result = nn::ndm::Suspend(nn::ndm::DN_CEC); - NN_ERR_THROW_FATAL_IF_FATAL_ONLY(result); - result = nn::ndm::Suspend(nn::ndm::DN_BOSS); - NN_ERR_THROW_FATAL_IF_FATAL_ONLY(result); - result = nn::ndm::Suspend(nn::ndm::DN_FRIENDS); - NN_ERR_THROW_FATAL_IF_FATAL_ONLY(result); - result = nn::ndm::Suspend(nn::ndm::DN_NIM); - NN_ERR_THROW_FATAL_IF_FATAL_ONLY(result); - - // cfg の初期化 - nn::cfg::CTR::init::Initialize(); - nn::cfg::CTR::system::Initialize(); - - // 時計設定用ptm初期化 - nn::ptm::CTR::InitializeForSystemMenu(); - - // ps の初期化 - nn::ps::Initialize(); - - // friendsの初期化 - result = nn::friends::detail::Initialize(); - - // mcuの初期化 - nn::mcu::CTR::InitializeHwCheck(&s_McuSession); - nn::mcu::CTR::HwCheck mcu(s_McuSession); - - // amの初期化 - nn::am::InitializeForSystemMenu(); - - // ヒープの確保 - common::HeapManager::GetHeap()->Initialize(nn::os::GetDeviceMemoryAddress(), nn::os::GetDeviceMemorySize(), nn::os::ALLOCATE_OPTION_LINEAR); - - // RenderSystem の準備 - uptr heapForGx = reinterpret_cast(common::HeapManager::GetHeap()->Allocate(s_GxHeapSize)); - s_RenderSystem.Initialize(heapForGx, s_GxHeapSize); - - // サウンドスレッドの起動 - common::InitializeSimplePlayer(); - - // ログ描画の初期化 - common::Logger::GetLoggerInstance()->Initialize(CONSOLE_WIDTH, CONSOLE_HEIGHT, CONSOLE_MAX_LINE, &s_RenderSystem); - - // RenderSystemを作ってからログが出せる - common::Logger::InitializeEjectThread(); - common::Logger::SetEjectHandler(OnSdEjected); - COMMON_LOGGER("\n"); - COMMON_LOGGER("CTR Console Restore start\n"); - - // ボタン入力 - nn::hid::PadReader s_PadReader; - nn::hid::PadStatus padStatus; - - // データの準備 - - // 完全性検証SEEDの取得 - result = nn::fs::MountSpecialArchive("nand:", nn::fs::CTR::ARCHIVE_TYPE_CTR_NAND); - if (result.IsSuccess()) - { - nn::fs::FileInputStream fis; - - result = fis.TryInitialize(L"nand:/private/movable.sed"); - if (result.IsSuccess()) - { - s64 fileSize = fis.GetSize(); - s32 ret; - void* addr = NULL; - addr = common::HeapManager::GetHeap()->Allocate(fileSize); - if (addr != NULL) - { - sp_Ivs = addr; - s_SizeofIvs = fileSize; - result = fis.TryRead(&ret, addr, fileSize); - if (result.IsSuccess()) - { - s_CanReadIvs = true; - } - } - } - fis.Finalize(); - } - // 一旦アンマウントしておく - nn::fs::Unmount("nand:"); - - // リージョンの取得 - nn::cfg::CTR::CfgRegionCode region; - region = nn::cfg::CTR::GetRegion(); - - // シリアルナンバーの取得 - std::memset(s_SerialNo, '\0', - nn::cfg::CTR::CFG_SECURE_INFO_SERIAL_NO_LEN); - result = nn::cfg::CTR::system::GetSerialNo(s_SerialNo); - common::HardwareInfo hwInfo; - hwInfo.AddCheckDigit(reinterpret_cast(s_SerialNo)); - if(result.IsSuccess()) - { - s_CanReadSerialNumber = true; - } - COMMON_LOGGER_RESULT_IF_FAILED_WITH_LINE(result); - - // デバイスIDの取得 - bit32 deviceId; - result = nn::ps::CTR::GetDeviceId(&deviceId); - COMMON_LOGGER_RESULT_IF_FAILED_WITH_LINE(result); - bit64 infraDeviceId; - result = nn::nim::CTR::InitializeForShop(); - COMMON_LOGGER_RESULT_IF_FAILED_WITH_LINE(result); - result = nn::nim::CTR::Shop::GetInfraDeviceId(deviceId, &infraDeviceId); - COMMON_LOGGER_RESULT_IF_FAILED_WITH_LINE(result); - result = nn::nim::CTR::FinalizeForShop(); - COMMON_LOGGER_RESULT_IF_FAILED_WITH_LINE(result); - - // MACアドレスの取得 - nn::nwm::Mac mac; - char8 macAddress[nn::nwm::Mac::MAC_STRING_SIZE]; - - result = nn::nwm::GetMacAddress(mac); - COMMON_LOGGER_RESULT_IF_FAILED_WITH_LINE(result); - mac.GetString(macAddress); - COMMON_LOGGER_RESULT_IF_FAILED_WITH_LINE(result); - - // フレンドコードの取得 - nn::friends::CTR::FriendKey friendKey; - result = nn::friends::CTR::GetMyFriendKey(&friendKey); - COMMON_LOGGER_RESULT_IF_FAILED_WITH_LINE(result); - u64 friendCode = nn::friends::CTR::FriendKeyToFriendCode(friendKey); - - // バージョンの取得 - common::GetSystemVersion(&s_VerData, region); - - // 情報出力 - COMMON_LOGGER("CTR Console Restore %s Rev.%s\n", __DATE__, RESTORE_VERSION_NUM); - COMMON_LOGGER("System Ver. %d.%d.%d-%d\n", s_VerData.cup.majorVersion, s_VerData.cup.minorVersion, s_VerData.cup.microVersion, - s_VerData.nup.majorVersion); - COMMON_LOGGER("System Region %s\n", nn::cfg::CTR::GetRegionCodeA3(region)); - COMMON_LOGGER("Serial Number %s\n", s_SerialNo); - COMMON_LOGGER("Device ID %llu\n", infraDeviceId); - COMMON_LOGGER("MAC Address %s\n", macAddress); - COMMON_LOGGER("Friend Code %04u-%04u-%04u\n", - static_cast(friendCode / 100000000ULL % 10000ULL), - static_cast(friendCode / 10000ULL % 10000ULL), - static_cast(friendCode % 10000ULL) ); - - - bool flip = false; - bool continueRestore = false; - - for(;;) - { - bool nextStep = false; - - s_PadReader.ReadLatest(&padStatus); - - // AまたはSTARTボタンで進行 - if(padStatus.trigger & nn::hid::BUTTON_A || - padStatus.trigger & nn::hid::BUTTON_START) - { - nextStep = true; - } - - // LまたはRボタンで上下画面フリップ - if(padStatus.trigger & nn::hid::BUTTON_R || - padStatus.trigger & nn::hid::BUTTON_L) - { - flip = !flip; - } - - // コンソールスクロール - if(padStatus.hold & nn::hid::BUTTON_UP) - { - common::Logger::GetLoggerInstance()->ScrollUp(); - } - - // コンソールスクロール - if(padStatus.hold & nn::hid::BUTTON_DOWN) - { - common::Logger::GetLoggerInstance()->ScrollDown(); - } - - if(padStatus.hold & nn::hid::BUTTON_LEFT) - { - common::Logger::GetLoggerInstance()->ScrollToBegin(); - } - - if(padStatus.hold & nn::hid::BUTTON_RIGHT) - { - common::Logger::GetLoggerInstance()->ScrollToEnd(); - } - - // 情報更新 - // バッテリ - mcu.GetBatteryRemain(&batteryRemain); - // ACアダプタ - std::string adapterState; - if(IsAdapterConnected()) - { - adapterState += ::std::string("Connected"); - } - else - { - adapterState += ::std::string("Not Connected"); - } - - // 操作用メッセージ - // 進捗確認メッセージを兼ねる? - ::std::vector operationMessage; - - ControlState(operationMessage, nextStep, continueRestore); - - nn::util::FloatColor titleColor; - - if(GetRestoreMode() == RESTORE_MODE_RESTORE) - { - titleColor.r = 0.1f; - titleColor.g = 0.25f; - titleColor.b = 0.1f; - } - else if(GetRestoreMode() == RESTORE_MODE_NUP_ONLY) - { - titleColor.r = 0.35f; - titleColor.g = 0.35f; - titleColor.b = 0.f; - } - - // 上画面表示 - common::DrawSystemState("CTR Console Restore", - s_RenderSystem, - titleColor, - flip, - adapterState, - RESTORE_VERSION_NUM, - &s_VerData, - batteryRemain, - infraDeviceId, - friendCode, - GetProgress(), - macAddress, - operationMessage, - region, - s_SerialNo - ); - - if (GetRestoreMode() == RESTORE_MODE_NUP_ONLY) - { - const u8 spaceSize = 10; - const u8 lineBottom = 23; - const u32 screenWidth = 400; - - s_RenderSystem.SetColor(1.f, 1.f, 1.f); - s_RenderSystem.DrawText(0, lineBottom * spaceSize, "NUP-Only Mode"); - s_RenderSystem.SetColor(titleColor.r, titleColor.g, titleColor.b); - s_RenderSystem.FillRectangle(0, lineBottom * spaceSize, screenWidth, spaceSize); - s_RenderSystem.SetColor(1.f, 1.f, 1.f); - } - - s_RenderSystem.SwapBuffers(); - - // デフォルトで下画面に描画するもの - s_RenderSystem.SetRenderTarget(common::GetRenderTarget(NN_GX_DISPLAY1, flip)); - if(IsRestoreSucceeded()) - { - s_RenderSystem.SetClearColor(common::GetRenderTarget(NN_GX_DISPLAY1, flip), SUCCESS_COLOR); - } - else if(IsRestoreFailed()) - { - s_RenderSystem.SetClearColor(common::GetRenderTarget(NN_GX_DISPLAY1, flip), FAIL_COLOR); - } - else - { - s_RenderSystem.SetClearColor(common::GetRenderTarget(NN_GX_DISPLAY1, flip), NORMAL_COLOR); - } - s_RenderSystem.Clear(); - s_RenderSystem.SetColor(1.f, 1.f, 1.f); - - common::Logger::GetLoggerInstance()->DrawConsole(); - s_RenderSystem.SwapBuffers(); - - - s_RenderSystem.WaitVsync(NN_GX_DISPLAY_BOTH); - - // 電源長押しで終了 - if ( nn::applet::IsExpectedToCloseApplication()) - { - FinalizeAll(); - } - } -} - - -} diff --git a/branches/work/SD_AesCmac/ConsoleRestore/ConsoleRestore.h b/branches/work/SD_AesCmac/ConsoleRestore/ConsoleRestore.h deleted file mode 100644 index 2166c41..0000000 --- a/branches/work/SD_AesCmac/ConsoleRestore/ConsoleRestore.h +++ /dev/null @@ -1,53 +0,0 @@ -/*---------------------------------------------------------------------------* - Project: Horizon - File: ConsoleRestore.h - - Copyright (C)2009 Nintendo Co., Ltd. All rights reserved. - - These coded instructions, statements, and computer programs contain - proprietary information of Nintendo of America Inc. and/or Nintendo - Company Ltd., and are protected by Federal copyright law. They may - not be disclosed to third parties or copied or duplicated in any form, - in whole or in part, without the prior written consent of Nintendo. - - $Rev$ - *---------------------------------------------------------------------------*/ - -#ifndef NN_CONSOLERESTORE_H_ -#define NN_CONSOLERESTORE_H_ - -#include -#include "VersionDetect.h" - -namespace ConsoleRestore -{ - -bool IsAdapterConnected(); -bool IsBatteryLower(); -bool CanReadIVS(); -bool CanReadSerialNumber(); -void GetSerialNumber(u8** serial, size_t* size); -void GetIvs(void** ivs, size_t* size); -nn::Handle GetMcuHandle(); -void GetVersionData(common::VerDef* version); - -void FinalizeAll(); - -const u32 CONSOLE_WIDTH = 38; -const u32 CONSOLE_HEIGHT = 24; -const u32 CONSOLE_MAX_LINE = 1000; - -} - -// 描画色の定義 -#define WHITE_COLOR 1.f, 1.f, 1.f, 1.f -#define GRAY_COLOR 0.5, 0.5, 0.5, 1.f -#define RED_COLOR 1.f, 0.f, 0.f, 1.f -#define GREEN_COLOR 0.f, 1.f, 0.f, 1.f -#define BLUE_COLOR 0.f, 0.f, 1.f, 1.f -#define SUCCESS_COLOR 0.f, 0.6f,0.f, 1.f -#define FAIL_COLOR 0.6f, 0.f,0.f, 1.f -#define NORMAL_COLOR 0.f, 0.f, 0.f, 1.f - -/* NN_CONSOLERESTORE_H_ */ -#endif diff --git a/branches/work/SD_AesCmac/ConsoleRestore/ConsoleRestore.rsf b/branches/work/SD_AesCmac/ConsoleRestore/ConsoleRestore.rsf deleted file mode 100644 index be9685f..0000000 --- a/branches/work/SD_AesCmac/ConsoleRestore/ConsoleRestore.rsf +++ /dev/null @@ -1,52 +0,0 @@ -BasicInfo: - Title : ConsoleRestore - ProductCode: ConsoleRestore - BackupMemoryType: None - -TitleInfo: - Use: Evaluation - Category: Application - UniqueId: 0xf8022 - Version: 0 - -SystemControlInfo: - AppType : Application - StackSize : 0x4000 - Dependency : - - gpio - - pdn - - spi - - i2c - - mcu - - ptm - - codec - - cfg - - hid - - gsp - - friends - - nim - - ac - - ndm - -AccessControlInfo: - Priority : 16 - DisableDebug : true - - FileSystemAccess: - - DirectSdmc - - Debug - - Core - - CategoryFileSystemTool - - IoAccessControl: - - FsMountCardSpi - - FsMountNand - - FsMountTwln - -Option: - FreeProductCode: true - - -Rom: - # ROM に含めるファイルシステムのルートパスを指定します。 - HostRoot: "$(ROMFS_ROOT)" \ No newline at end of file diff --git a/branches/work/SD_AesCmac/ConsoleRestore/Controller.cpp b/branches/work/SD_AesCmac/ConsoleRestore/Controller.cpp deleted file mode 100644 index 8a5c3ea..0000000 --- a/branches/work/SD_AesCmac/ConsoleRestore/Controller.cpp +++ /dev/null @@ -1,913 +0,0 @@ -/*---------------------------------------------------------------------------* - Project: Horizon - File: Controller.cpp - - Copyright 2009 Nintendo. All rights reserved. - - These coded instructions, statements, and computer programs contain - proprietary information of Nintendo of America Inc. and/or Nintendo - Company Ltd., and are protected by Federal copyright law. They may - not be disclosed to third parties or copied or duplicated in any form, - in whole or in part, without the prior written consent of Nintendo. - - $Rev$ - *---------------------------------------------------------------------------*/ - -#include -#include -#include -#include -#include -#include -#include - -#include "Controller.h" -#include "FileChecker.h" -#include "ConsoleRestore.h" -#include "SimplePlayer.h" -#include "CommonLogger.h" -#include "Importer.h" -#include "Updater.h" -#include "NtpClient.h" - -namespace ConsoleRestore -{ - -namespace -{ - -typedef enum RestoreState -{ - STARTUP, // 初期値 - SERIAL_IS_NOT_IN_SD, // シリアルナンバーファイルがSDカードにないことを表示 - SERIAL_IN_SD, // シリアルナンバーの情報を表示 - UPDATE_IN_PROGRESS, // アップデート中 - UPDATE_DONE, // アップデート完了 - NUP_ONLY_WAIT_SD_EJECT, // NUP_ONLYモードでSDカード抜き待ち - NUP_ONLY_WAIT_NEXT, // NUP_ONLYモードでキー入力待ち - RESTORE_TWL_SOUND, // TWLサウンドの書き込み中 - RESTORE_TWL_PHOTO, // TWL写真の書き込み中 - RESTORE_IN_PROGRESS, // 書き込み中 - POST_RESTORE, // 書き込み後の処理 - RESTORE_DONE, // 書き込み完了 - REBOOTING, // 再起動を行う - ERASE, // 削除処理を行う - HISTORY_RECOVER, // プレイ履歴の書き戻しを行う - TIME_ADJUST, // 時計あわせを行う - WAIT_SD_EJECT, // SDカードぬき待ち - ALL_DONE, // すべて完了 - SHUTDOWN, // シャットダウン中 - FAIL // 失敗 -} RestoreState; - -// Restore状態管理 -RestoreState s_RestoreState = STARTUP; -// Restoreモード管理 -RestoreMode s_RestoreMode = RESTORE_MODE_RESTORE; - -// インターネット設定を読んだかどうか -bool s_ReadSettingDone = false; -// インターネット設定を読んだ結果 -bool s_ReadSettingSuccess = false; -// NUP専用モードかどうか -bool s_NupOnlyMode = false; - -// APSettingの書式が無い警告サウンドを鳴らしたかどうか -bool s_ExistAPSettingAnnotation = false; -// APSettingの書式が違っている警告サウンドを鳴らしたかどうか -bool s_APSettingAnnotation = false; -// シリアルナンバーがない警告サウンドを鳴らしたかどうか -bool s_SerialNumberAnnotation = false; -// 失敗サウンドを鳴らしたかどうか -bool s_PlayedFailSound = false; -// 操作開始サウンドを鳴らしたかどうか -bool s_PlayedStartCursor = false; -// リブート開始前サウンドを鳴らしたかどうか -bool s_PlayedRebootCursor = false; -// SD抜き出し前サウンドを鳴らしたかどうか -bool s_PlayedSdPullOutCursor = false; -// バージョンデータが無い警告サウンドを鳴らしたかどうか -bool s_ExistsVersionDataAnnotation = false; -// バージョンデータを読んだかどうか -bool s_ReadVersionDone = false; -// SDに書き込みできない警告サウンドを鳴らしたかどうか -bool s_SdWriteProetctAnnotation = false; - -// ネットワークアップデートを開始したかどうか -bool s_ExecuteFgNup = false; -// FGNUPを何回リトライしたか -u32 s_FgNupRetryCount = 0; - - -} // namespace - -bool NeedsAcAdater() -{ - return IsBatteryLower() && !IsAdapterConnected(); -} - -bool CheckAndReadAPSetting(::std::vector& operationMessage) -{ - using namespace common; - - if (!ExistsAPSetting()) - { - if(!s_ExistAPSettingAnnotation) - { - s_ExistAPSettingAnnotation = true; - common::PlaySound(common::SOUND_ANNOTATION); - } - operationMessage.push_back(::std::string("Accsess_Point_Setting does not exist!")); - return false; - } - - // 設定ファイルからAP設定を読み込む - if (!s_ReadSettingDone) - { - s_ReadSettingDone = true; - s_ReadSettingSuccess = ReadSetting(&s_NupOnlyMode); - } - - if(s_NupOnlyMode) - { - s_RestoreMode = RESTORE_MODE_NUP_ONLY; - } - - if (!s_ReadSettingSuccess) - { - operationMessage.push_back(::std::string("Invalid Accsess_Point_Setting format!")); - if(!s_APSettingAnnotation) - { - s_APSettingAnnotation = true; - common::PlaySound(common::SOUND_ANNOTATION); - } - - } - - return s_ReadSettingSuccess; -} - -bool CheckAndReadVersionData(::std::vector& operationMessage) -{ - using namespace common; - - if (!ExistsVersionData()) - { - if(!s_ExistsVersionDataAnnotation) - { - s_ExistsVersionDataAnnotation = true; - common::PlaySound(common::SOUND_ANNOTATION); - } - operationMessage.push_back(::std::string("Version Data does not exist!")); - return false; - } - - // バージョン情報ファイルを読み込む - if (!s_ReadVersionDone) - { - s_ReadVersionDone = true; - ReadVersionData(); - } - - return s_ReadSettingSuccess; -} - -void PutAliveMessage(::std::vector& operationMessage, const char* str) -{ - std::string message = std::string(str); - static u8 i = 0; - if (i < 0xff / 4) - { - operationMessage.push_back(message + std::string(" /")); - } - else if (i < 0xff * 2 / 4) - { - operationMessage.push_back(message + std::string(" |")); - } - else if (i < 0xff * 3 / 4) - { - operationMessage.push_back(message + std::string(" \\")); - } - else - { - operationMessage.push_back(message + std::string(" -")); - } - i += 4; -} - -void ExecSyncMcuRtc() -{ - if(!common::ExistsRtcSyncFinishedFile()) - { - ImportMcuRtc(); - // 時計を無効化する - CreateRtcSyncFinishedFile(); - } -} - -// Zero NUP限定コード -bool NeedsNup() -{ - if(AlreadyExecutedNup() || s_NupOnlyMode) - { - return !common::ExistsUpdateCheckedFile(); - } - else - { - return false; - } -} - -void ControlState(::std::vector& operationMessage, bool& nextStep, bool& continueRestore) -{ - using namespace common; - - // 状態遷移Controller - switch (s_RestoreState) - { - // 起動時 - case STARTUP: - { - bool error = false; - bool needsUpdate = false; - bool needsErase = false; - bool validApSetting = false; - - // SDカードが挿入されているか? - if (nn::fs::IsSdmcInserted()) - { - // SDカードに書き込みできるか? - if (!nn::fs::IsSdmcWritable()) - { - if (!s_SdWriteProetctAnnotation) - { - s_SdWriteProetctAnnotation = true; - PlaySound(SOUND_ANNOTATION); - } - operationMessage.push_back(::std::string("Can*t Write SD Card!!\n")); - break; - } - - CheckAndReadVersionData(operationMessage); - validApSetting = CheckAndReadAPSetting(operationMessage); - if (!validApSetting) - { - error = true; - } - else - { - // NUPが必要か? - if (!NeedsNup()) - { - if (s_NupOnlyMode) - { - s_RestoreState = NUP_ONLY_WAIT_SD_EJECT; - - // リストア状態チェックファイルをすべて削除 - DeleteAllCheckFiles(); - - break; - } - - // SDカードに書き込み完了ファイルがあるか? - if (!ExistsWriteFinishedFile()) - { - // IVSを読めるか? - if (CanReadIVS()) - { - // 本体初期化完了ファイルがあるか? - if (ExistsConsoleInitializedFile()) - { - // SDカードにシリアルナンバーがあるか? - if (!ExistsSerialNumberFile()) - { - COMMON_LOGGER("Can't Read Serial Number in SD Card!!\n"); - error = true; - s_RestoreState = SERIAL_IS_NOT_IN_SD; - } - else - { - ::std::string serial(reinterpret_cast (ReadSerialNumber())); - operationMessage.push_back(::std::string("Serial Number in SD : ") + serial); - } - - - // SDカードにリージョンデータがあるか? - if (ExistsRegionData()) - { - // リージョンデータは一致しているか? - if (!EqualsRegionDataandRegion()) - { - COMMON_LOGGER("Current Region and Region in SD differ!!\n"); - error = true; - s_RestoreState = FAIL; - } - } - else - { - // 移行不能なのでFAIL - COMMON_LOGGER("Can't Read Region in SD Card!!\n"); - error = true; - s_RestoreState = FAIL; - } - - } - else - { - if (!ExistsIVSFile()) - { - // 移行不能なのでFAIL - COMMON_LOGGER("Can't Read IVS in SD Card!!\n"); - error = true; - s_RestoreState = FAIL; - } - else - { - COMMON_LOGGER("Initialize Console\n"); - - // SDカードのIVSと本体のIVSは異なるか? - if (EqualsIVSFileandIVS()) - { - // 同一本体に書き戻そうとしたファイルを作る - COMMON_LOGGER("Restore to the same console. Initialize.\n"); - CreateTryRestoreSameConsoleFile(); - } - else - { - // 本体初期化完了ファイルを作る - CreateConsoleInitializedFile(); - - } - - // ファイルシステムの初期化を行う - InitializeFileSystem(); - error = true; - s_RestoreState = REBOOTING; - } - } - } - else - { - error = true; - operationMessage.push_back(::std::string("Can't Read IVS!!")); - } - } - else - { - if (validApSetting) - { - // 削除処理を行う - needsErase = true; - } - } - } - else - { - if (validApSetting) - { - // ネットワークアップデートを行う - needsUpdate = true; - } - } - - } - } - else - { - error = true; - operationMessage.push_back(::std::string("Insert SD Card!!")); - } - - // ACアダプタが必要か? - if (NeedsAcAdater()) - { - error = true; - operationMessage.push_back(::std::string("Connect AC Adapter!!")); - } - - // エラーが無ければ進行用メッセージ表示 - if (!error) - { - operationMessage.push_back(::std::string("Push A or START Button")); - if(needsUpdate) - { - operationMessage.push_back(::std::string("Network Update Mode")); - } - else if(needsErase) - { - operationMessage.push_back(::std::string("Clock Sync Mode")); - } - else - { - operationMessage.push_back(::std::string("Import Data Mode")); - } - - if(!s_PlayedStartCursor) - { - PlaySound(SOUND_CURSOR); - s_PlayedStartCursor = true; - } - } - - if (nextStep && !error) - { - if (needsUpdate) - { - COMMON_LOGGER("Start Network Update\n"); - s_RestoreState = UPDATE_IN_PROGRESS; - } - else if(needsErase) - { - COMMON_LOGGER("Erase Trash\n"); - s_RestoreState = ERASE; - } - else - { - COMMON_LOGGER("Start Import Data\n"); - // Zero NUP限定 - // RTC同期を行う - // NUPされない場合があるのでここで同期 - ExecSyncMcuRtc(); - - s_RestoreState = RESTORE_TWL_SOUND; - } - - } - } - break; - - // シリアルナンバーがSDカードにないこと警告 - case SERIAL_IS_NOT_IN_SD: - { - operationMessage.push_back(::std::string("Serial Number Is Not In SD Card")); - operationMessage.push_back(::std::string("Push A or START Button")); - operationMessage.push_back(::std::string("Import Data Mode")); - - if (!s_SerialNumberAnnotation) - { - s_SerialNumberAnnotation = true; - PlaySound(SOUND_ANNOTATION); - } - - if (nextStep) - { - s_RestoreState = RESTORE_TWL_SOUND; - } - } - break; - - // アップデート中 - case UPDATE_IN_PROGRESS: - { - continueRestore = true; - - // ACアダプタが必要か? - if (NeedsAcAdater()) - { - continueRestore = false; - operationMessage.push_back(::std::string("Connect AC Adapter!!")); - } - - // アップデートを行う - if(!s_ExecuteFgNup) - { - ImportCountryLanguageData(); - StartFGNetworkUpdate(); - s_ExecuteFgNup = true; - } - - // 動いていることを表示 - { - PutAliveMessage(operationMessage, "Updating"); - } - - - if (IsNetworkUpdateFinished()) - { - FinishFGNetworkUpdate(); - // エラーがあったら表示する - if(GetUpdateResult().IsFailure()) - { - // APが見つからない - if(GetUpdateResult() == nn::ac::ResultNotFoundAccessPoint()) - { - COMMON_LOGGER("No Access Point Found!"); - } - } - - if (GetUpdateResult().IsSuccess()) - { - COMMON_LOGGER("Network Update Finished.\n"); - // アップデート完了ファイルを作成 - CreateUpdateFinishedFile(); - - s_RestoreState = UPDATE_DONE; - - } - else - { - if (s_FgNupRetryCount++ < RETRY_MAX) - { - // エラーのためやり直す - COMMON_LOGGER_RESULT_IF_FAILED(GetUpdateResult()); - COMMON_LOGGER("Network Update Failed. Retrying... %d\n", s_FgNupRetryCount); - - // FGNUP用のスレッドを作るとこからやり直し - s_ExecuteFgNup = false; - } - else - { - s_RestoreState = FAIL; - } - } - - } - } - break; - - // アップデート完了 - case UPDATE_DONE: - { - operationMessage.push_back(::std::string("Network Update Done.")); - operationMessage.push_back(::std::string("Press A or START Button to Reboot")); - - if(!s_PlayedRebootCursor) - { - PlaySound(SOUND_CURSOR); - s_PlayedRebootCursor = true; - } - - if (nextStep) - { - s_RestoreState = REBOOTING; - } - } - break; - - - // TWLサウンド領域の書き込み中 - case RESTORE_TWL_SOUND: - { - static bool init = true; - if (init) - { - // データを書き込む - ImportTwlSoundData(); - init = false; - } - - // 処理が完了した - if (IsImportFinished()) - { - FinalizeImportThread(); - s_RestoreState = RESTORE_TWL_PHOTO; - } - } - break; - - // TWL写真領域の書き込み - case RESTORE_TWL_PHOTO: - { - static bool init = true; - if (init) - { - // データを書き込む - ImportTwlPhotoData(); - init = false; - } - - // 処理が完了した - if (IsImportFinished()) - { - FinalizeImportThread(); - s_RestoreState = RESTORE_IN_PROGRESS; - } - } - break; - - - // 書き込み中 - case RESTORE_IN_PROGRESS: - { - continueRestore = true; - - // ACアダプタが必要か? - if (NeedsAcAdater()) - { - continueRestore = false; - operationMessage.push_back(::std::string("Connect AC Adapter!!")); - } - - // データを読み込む - ImportData(); - - // 処理が完了した - if (continueRestore && IsImportFinished()) - { - COMMON_LOGGER("Import NAND Data Finished.\n"); - - if (GetProgress() > 99) - { - s_RestoreState = POST_RESTORE; - } - else - { - s_RestoreState = FAIL; - } - - } - } - break; - - // リブート中 - case REBOOTING: - { - static bool init = true; - - if (init) - { - // ErrDispから引用 - // 権限をもらえば成功するはず - nn::Result result = nn::ns::CTR::InitializeForShell(); - if (result.IsSuccess()) - { - COMMON_LOGGER("System Reboot.\n"); - - nn::ns::CTR::HardwareResetAsync(nn::CTR::MEMORY_ARRANGE_NORMAL); - while (!nn::applet::IsExpectedToCloseApplication()) - { - nn::os::Thread::Sleep(nn::fnd::TimeSpan::FromMilliSeconds(5)); - } - - nn::ns::CTR::FinalizeForShell(); - - // INFO: リブートは非同期のため処理は継続 - } - init = false; - } - } - break; - - // 書き込み後の処理 - case POST_RESTORE: - { - operationMessage.push_back(::std::string("Post Process...")); - // 書き込み完了ファイルを作成 - CreateWriteFinishedFile(); - - s_RestoreState = RESTORE_DONE; - } - break; - - // 書き込み完了 - case RESTORE_DONE: - { - operationMessage.push_back(::std::string("Restore Done.")); - operationMessage.push_back(::std::string("Press A or START Button to Reboot")); - - if(!s_PlayedRebootCursor) - { - PlaySound(SOUND_CURSOR); - s_PlayedRebootCursor = true; - } - - if (nextStep) - { - s_RestoreState = REBOOTING; - } - } - break; - - // 削除処理 - case ERASE: - { - Cleanup(); - s_RestoreState = HISTORY_RECOVER; - } - break; - - // 削除処理 - case HISTORY_RECOVER: - { - static bool init = true; - if (init) - { - // ptmのセーブデータ移行後に時計を無効化する - nn::ptm::CTR::InvalidateSystemTime(); - - // 同じ本体に書き戻す場合は初期化しない - if (!ExistsTryRestoreSameConsoleFile()) - { - // cfgのハードウェア固有情報をcal値で初期化する - InitializeHardwareDependentSetting(); - } - - init = false; - } - - s_RestoreState = TIME_ADJUST; - } - - - // 時計あわせ - case TIME_ADJUST: - { - static bool init = true; - if(init) - { - COMMON_LOGGER("Adjust Time\n"); - AdjustTime(); - init = false; - } - - // 動いていることを表示 - { - PutAliveMessage(operationMessage, "Sync Clock"); - } - - if(IsTimeAdjustFinished()) - { - if(IsTimeAdjustSuccessed()) - { - s_RestoreState = WAIT_SD_EJECT; - } - else - { - s_RestoreState = FAIL; - } - - // リストア状態チェックファイルをすべて削除 - DeleteAllCheckFiles(); - } - } - break; - - // すべて完了 - case WAIT_SD_EJECT: - { - operationMessage.push_back(::std::string("ALL Done. Pull Out SD Card.")); - // SDカード抜けのみで次の状態に遷移する - - if (!s_PlayedSdPullOutCursor) - { - common::PlaySound(common::SOUND_CURSOR); - s_PlayedSdPullOutCursor = true; - } - - } - break; - - // すべて完了 - case ALL_DONE: - { - operationMessage.push_back(::std::string("Restore Succeeded!!")); - static bool init = true; - if (init) - { - PlaySound(SOUND_OK); - init = false; - } - } - break; - - // 書き込み失敗 - case FAIL: - { - static bool init = true; - if(init) - { - // 状態初期化 - DeleteAllCheckFiles(); - init = false; - } - - operationMessage.push_back(::std::string("Failed.")); - if (!s_PlayedFailSound) - { - PlaySound(SOUND_NG); - s_PlayedFailSound = true; - } - } - break; - - case NUP_ONLY_WAIT_SD_EJECT: - { - operationMessage.push_back(::std::string("Update Done. Pull Out SD Card.")); - - // SDカード抜けのみで次の状態に遷移する - if (!s_PlayedSdPullOutCursor) - { - common::PlaySound(common::SOUND_CURSOR); - s_PlayedSdPullOutCursor = true; - } - } - break; - - case NUP_ONLY_WAIT_NEXT: - { - operationMessage.push_back(::std::string("A or START Button to Shutdown.")); - - if(nextStep) - { - s_RestoreState = SHUTDOWN; - } - } - break; - - case SHUTDOWN: - { - // 本体初期化を行う - InitializeFileSystem(); - - // シャットダウンする - nn::ptm::CTR::ShutdownAsync(0, nn::fnd::TimeSpan::FromSeconds(0)); - } - break; - - } -} - -bool InProgress() -{ - return s_RestoreState == RESTORE_IN_PROGRESS; -} - -bool IsRestoreSucceeded() -{ - return s_RestoreState == ALL_DONE; -} - -bool IsRestoreFailed() -{ - return s_RestoreState == FAIL; -} - -void OnSdEjected() -{ - if(s_RestoreState == WAIT_SD_EJECT || s_RestoreState == ALL_DONE) - { - s_RestoreState = ALL_DONE; - } - else if(s_RestoreState == NUP_ONLY_WAIT_SD_EJECT || s_RestoreState == NUP_ONLY_WAIT_NEXT) - { - s_RestoreState = NUP_ONLY_WAIT_NEXT; - } - // FAILのときは一旦電源を切らないと動かないようにしておく - else if(s_RestoreState != FAIL) - { - InitializeState(); - ClearFileReadResult(); - } -} - -void InitializeState() -{ - s_RestoreState = STARTUP; - s_RestoreMode = RESTORE_MODE_RESTORE; - - common::InitializeFileCheck(); - - s_ExistAPSettingAnnotation = false; - s_ReadSettingDone = false; - s_ReadSettingSuccess = false; - s_APSettingAnnotation = false; - s_SerialNumberAnnotation = false; - s_PlayedFailSound = false; - s_ExecuteFgNup = false; - s_FgNupRetryCount = 0; - s_PlayedStartCursor = false; - s_PlayedRebootCursor = false; - s_PlayedSdPullOutCursor = false; - s_NupOnlyMode = false; - s_ReadVersionDone = false; - s_SdWriteProetctAnnotation = false; -} - -u32 GetProgress() -{ - if(s_RestoreState == RESTORE_TWL_SOUND || - s_RestoreState == RESTORE_TWL_PHOTO || - s_RestoreState == RESTORE_IN_PROGRESS || - s_RestoreState == POST_RESTORE || - s_RestoreState == RESTORE_DONE) - { - return GetImportProgress(); - } - else if(s_RestoreState == UPDATE_IN_PROGRESS || - s_RestoreState == UPDATE_DONE) - { - return GetUpdateProgress(); - } - else - { - return 0; - } - -} - -RestoreMode GetRestoreMode() -{ - return s_RestoreMode; -} - -} // namespace ConsoleRestore diff --git a/branches/work/SD_AesCmac/ConsoleRestore/Controller.h b/branches/work/SD_AesCmac/ConsoleRestore/Controller.h deleted file mode 100644 index d2b802b..0000000 --- a/branches/work/SD_AesCmac/ConsoleRestore/Controller.h +++ /dev/null @@ -1,46 +0,0 @@ -/*---------------------------------------------------------------------------* - Project: Horizon - File: Contoroller.h - - Copyright 2009 Nintendo. All rights reserved. - - These coded instructions, statements, and computer programs contain - proprietary information of Nintendo of America Inc. and/or Nintendo - Company Ltd., and are protected by Federal copyright law. They may - not be disclosed to third parties or copied or duplicated in any form, - in whole or in part, without the prior written consent of Nintendo. - - $Rev$ - *---------------------------------------------------------------------------*/ - -#ifndef CONTOROLLER_H_ -#define CONTOROLLER_H_ - -#include -#include -#include - -namespace ConsoleRestore -{ - -typedef enum RestoreMode -{ - RESTORE_MODE_RESTORE, - RESTORE_MODE_NUP_ONLY -} RestoreMode; - -const u32 RETRY_MAX = 3; - -void ControlState(::std::vector& operationMessage, bool& nextStep, bool& continueRestore); -bool InProgress(); -bool IsRestoreSucceeded(); -bool IsRestoreFailed(); -u32 GetProgress(); - -void OnSdEjected(); -void InitializeState(); -RestoreMode GetRestoreMode(); - -} - -#endif /* CONTOROLLER_H_ */ diff --git a/branches/work/SD_AesCmac/ConsoleRestore/Importer.cpp b/branches/work/SD_AesCmac/ConsoleRestore/Importer.cpp deleted file mode 100644 index d0bffaa..0000000 --- a/branches/work/SD_AesCmac/ConsoleRestore/Importer.cpp +++ /dev/null @@ -1,1496 +0,0 @@ -/*---------------------------------------------------------------------------* - Project: Horizon - File: Importer.cpp - - Copyright 2009 Nintendo. All rights reserved. - - These coded instructions, statements, and computer programs contain - proprietary information of Nintendo of America Inc. and/or Nintendo - Company Ltd., and are protected by Federal copyright law. They may - not be disclosed to third parties or copied or duplicated in any form, - in whole or in part, without the prior written consent of Nintendo. - - $Rev$ - *---------------------------------------------------------------------------*/ - -#include -#include -#include -#include -#include // cfg:norの初期化に必要 -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "FileName.h" -#include "Importer.h" -#include "SdMountManager.h" -#include "ConsoleRestore.h" -#include "HeapManager.h" -#include "SdReaderWriter.h" -#include "CommonLogger.h" -#include "FileTransfer.h" -#include "common_Types.h" -#include "Aes_define.h" -#include "configLoader.h" -#include "PlayHistoryManager.h" -#include "FileChecker.h" -#include "VersionDetect.h" - -#include -#include - -namespace ConsoleRestore -{ -namespace -{ -const size_t IMPORT_THREAD_STACK_SIZE = 0x4000; -nn::os::Thread s_ImportThread; -nn::os::StackBuffer s_ImportThreadStack; - -const size_t TIME_ZONE_LENGTH = 9; // "+23:45" -char s_TimeZoneStr[TIME_ZONE_LENGTH]; - -TimeZone s_TimeZone; -const size_t NTP_SERVER_NAME_LENGTH = 256; -char s_NtpServerName[NTP_SERVER_NAME_LENGTH]; - -bool s_CheckedEqualsIVSFileandIVS = false; -bool s_CheckedEqualsRegionDataandRegion = false; -bool s_ReadSerialNumber = false; - -// シリアルナンバー -u8 s_SerialNo[nn::cfg::CTR::CFG_SECURE_INFO_SERIAL_NO_LEN]; - -// 空のファイルを作成する -bool CreateEmptyFile(const wchar_t* path); -// SDからNANDにセーブデータをコピーする -void ImportSaveData(); -// SDからNORにNORデータをコピーする -void ImportNorData(); - -// IVS復号化用IV -bit8 s_IvsDecryptIv[AES_BLOCK_SIZE] = -{ - 0xdf, 0x0f, 0xf9, 0x1b, 0x34, 0x47, 0x70, 0x7f, - 0x7d, 0x06, 0x85, 0xe6, 0xe7, 0xb6, 0x4e, 0xe9 -}; - -// SDカードに保存してあるバージョン情報 -common::VerDef s_SDVersionData; - -} - -CheckedNetworkSetting s_CurrentNetowrkSetting1; - -void ConvertTimeZoneString(const char* str) -{ - s_TimeZone.hour = 0; - s_TimeZone.minutes = 0; - s_TimeZone.isMinus = false; - - bool hour = true; - bool ten = true; - u32 count = 0; - for(u32 i = 0; i < TIME_ZONE_LENGTH && count < 2; i++) - { - switch (str[i]) - { - case ':': - { - hour = false; - } - break; - - case '"': - { - // 2回読んだら終了 - count++; - } - break; - - case '+': - { - s_TimeZone.isMinus = false; - } - break; - - case '-': - { - s_TimeZone.isMinus = true; - } - break; - - default: - { - if(hour) - { - if(ten) - { - s_TimeZone.hour += (str[i] - '0') * 10; - ten = false; - } - else - { - s_TimeZone.hour += str[i] - '0'; - ten = true; - } - } - else - { - if(ten) - { - s_TimeZone.minutes += (str[i] - '0') * 10; - ten = false; - } - else - { - s_TimeZone.minutes += str[i] - '0'; - ten = true; - } - } - } - break; - } - } - - - NN_LOG("Converted TimeZone = "); - if(s_TimeZone.isMinus) - { - NN_LOG("-"); - } - NN_LOG("%02d:%02d\n", s_TimeZone.hour, s_TimeZone.minutes); - -} - -namespace -{ - -bool CreateEmptyFile(const wchar_t* path) -{ - nn::Result result; - bool create = false; - result = common::SdMountManager::Mount(); - - if (result.IsSuccess()) - { - nn::fs::FileOutputStream fos; - - result = fos.TryInitialize(path, true); - if(result.IsSuccess()) - { - fos.TryFlush(); - create = true; - } - fos.Finalize(); - } - - common::SdMountManager::Unmount(); - - return create; -} - -} - -u8* ReadSerialNumber() -{ - nn::Result result; - - if(s_ReadSerialNumber) - { - return s_SerialNo; - } - - COMMON_LOGGER("Read Serial Number in SD.\n"); - - size_t readSize; - common::SdReaderWriter sdReader; - size_t bufSize = common::HeapManager::GetHeap()->GetAllocatableSize(); - void* buf = common::HeapManager::GetHeap()->Allocate(bufSize); - if(buf != NULL) - { - result = sdReader.ReadBufWithCmac(common::SERIAL_PATHNAME, buf, bufSize, &readSize); - if(result.IsSuccess()) - { - std::memcpy(s_SerialNo, buf, sizeof(s_SerialNo)); - s_ReadSerialNumber = true; - } - common::HeapManager::GetHeap()->Free(buf); - } - return s_SerialNo; -} - -bool EqualsIVSFileandIVS() -{ - nn::Result result; - void* ivs; - size_t ivsSize; - size_t readSize; - static bool retval = false; - - if(s_CheckedEqualsIVSFileandIVS) - { - return retval; - } - - COMMON_LOGGER("Check IVS\n"); - - GetIvs(&ivs, &ivsSize); - - size_t bufSize = common::HeapManager::GetHeap()->GetAllocatableSize() / 2; - NN_LOG("AllocatableSize = %d\n", bufSize); - - void* enc = common::HeapManager::GetHeap()->Allocate(bufSize); - if (enc != NULL) - { - common::SdReaderWriter sdReader; - - result = sdReader.ReadBufWithCmac(common::IVS_PATHNAME, enc, bufSize, &readSize); - if(result.IsSuccess()) - { - void *dec = common::HeapManager::GetHeap()->Allocate(readSize); - if(dec != NULL) - { - // AES復号化する - nn::crypto::Initialize(); - nn::crypto::SwAesCtrContext swAesCtrContest; - - swAesCtrContest.Initialize(s_IvsDecryptIv, common::key, sizeof(common::key)); - swAesCtrContest.Decrypt(dec, enc, readSize); - - NN_LOG("readSize = %d, ivsSize = %d\n", readSize, ivsSize); - // サイズ一致かつ内容一致でtrue - if (readSize == ivsSize && std::memcmp(ivs, dec, ivsSize) == 0) - { - retval = true; - } - - common::HeapManager::GetHeap()->Free(dec); - - } - else - { - NN_LOG("Failed Allocate Heap!! %s, %d", __FILE__, __LINE__); - } - } - COMMON_LOGGER_RESULT_IF_FAILED_WITH_LINE(result); - - s_CheckedEqualsIVSFileandIVS = true; - common::HeapManager::GetHeap()->Free(enc); - } - else - { - NN_LOG("Failed Allocate Heap!! %s, %d", __FILE__, __LINE__); - return retval; - } - - return retval; -} - -bool EqualsRegionDataandRegion() -{ - nn::Result result; - static bool retval = false; - - if(s_CheckedEqualsRegionDataandRegion) - { - return retval; - } - - COMMON_LOGGER("Check Region\n"); - - nn::cfg::CTR::CfgRegionCode region; - region = nn::cfg::CTR::GetRegion(); - - nn::cfg::CTR::CfgRegionCode sdRegion; - common::SdReaderWriter sdReader; - size_t readSize; - size_t bufSize = common::HeapManager::GetHeap()->GetAllocatableSize(); - void* buf = common::HeapManager::GetHeap()->Allocate(bufSize); - if (buf != NULL) - { - result = sdReader.ReadBufWithCmac(common::REGION_DATA_PATHNAME, buf, bufSize, &readSize); - if (result.IsSuccess()) - { - std::memcpy(&sdRegion, buf, sizeof(sdRegion)); - s_CheckedEqualsRegionDataandRegion = true; - if (result.IsSuccess()) - { - retval = (region == sdRegion); - } - else - { - retval = false; - } - } - else - { - retval = false; - } - common::HeapManager::GetHeap()->Free(buf); - } - - return retval; -} - -void SetCountry(nn::cfg::CTR::CfgCountryCode countryCode) -{ - using namespace nn::cfg::CTR; - using namespace nn::cfg::CTR::detail; - - SimpleAddressIdCfgData simpleAddressId; - TwlCountryCodeCfgData countryData; - - nn::cfg::CTR::system::Initialize(); - - NN_UTIL_PANIC_IF_FAILED(nn::cfg::CTR::system::GetConfig(&simpleAddressId, sizeof(SimpleAddressIdCfgData), GET_CFG_KEY(NN_CFG_SIMPLE_ADDRESS, NN_CFG_SIMPLE_ADDRESS_ID))); - NN_UTIL_PANIC_IF_FAILED(nn::cfg::CTR::system::GetConfig(&countryData, sizeof(TwlCountryCodeCfgData), GET_CFG_KEY(NN_CFG_TWL, NN_CFG_TWL_COUNTRY_CODE))); - nn::cfg::CTR::system::Finalize(); - - simpleAddressId.id = (countryCode << CFG_SIMPLE_ADDRESS_ID_COUNTRY_SHIFT) | (1 - << CFG_SIMPLE_ADDRESS_ID_REGION_SHIFT); - countryData.country = countryCode; - - nn::cfg::CTR::system::Initialize(); - NN_UTIL_PANIC_IF_FAILED(nn::cfg::CTR::system::SetConfig(GET_CFG_KEY(NN_CFG_SIMPLE_ADDRESS, NN_CFG_SIMPLE_ADDRESS_ID), &simpleAddressId, sizeof(SimpleAddressIdCfgData))); - NN_UTIL_PANIC_IF_FAILED(nn::cfg::CTR::system::SetConfig(GET_CFG_KEY(NN_CFG_TWL, NN_CFG_TWL_COUNTRY_CODE), &countryData, sizeof(TwlCountryCodeCfgData))); - nn::cfg::CTR::system::FlushConfig(); - nn::cfg::CTR::system::Finalize(); -} - -void SetLanguage(nn::cfg::CTR::CfgLanguageCode languageCode) -{ - NN_UTIL_PANIC_IF_FAILED(nn::cfg::CTR::init::SetConfig( - GET_CFG_KEY(nn::cfg::CTR::detail::NN_CFG_USER_INFO, - nn::cfg::CTR::detail::NN_CFG_USER_INFO_LANGUAGE), - &languageCode, - sizeof(nn::cfg::CTR::detail::LanguageCfgData))); - NN_UTIL_PANIC_IF_FAILED(nn::cfg::CTR::init::FlushConfig()); - nn::cfg::nor::CTR::Initialize(); - NN_UTIL_PANIC_IF_FAILED(nn::cfg::nor::CTR::SetLanguage(static_cast(languageCode))); - nn::cfg::nor::CTR::Finalize(); -} - -void ImportCountryLanguageData() -{ - nn::Result result; - - if (common::ExistsCountryLanguageFile()) - { - size_t bufSize = common::HeapManager::GetHeap()->GetAllocatableSize(); - void* buf = common::HeapManager::GetHeap()->Allocate(bufSize); - if (buf != NULL) - { - common::SdReaderWriter sdReader; - - size_t readSize; - result = sdReader.ReadBufWithCmac(common::COUNTRY_SETTING_PATHNAME, buf, bufSize, &readSize); - if (result.IsSuccess()) - { - // SDから読み出し成功 - SetCountry(reinterpret_cast (buf)->country); - - SetLanguage(reinterpret_cast (buf)->language); - } - else - { - COMMON_LOGGER_RESULT_IF_FAILED_WITH_LINE(result); - } - common::HeapManager::GetHeap()->Free(buf); - } - } - else - { - // リージョンから適当な国を指定する - nn::cfg::CTR::CfgRegionCode region; - region = nn::cfg::CTR::GetRegion(); - NN_LOG("Country Setting does not exist. Use Default Setting\n"); - switch(region) - { - case nn::cfg::CTR::CFG_REGION_JAPAN: - { - SetCountry(nn::cfg::CTR::CFG_COUNTRY_JAPAN); - } - break; - - case nn::cfg::CTR::CFG_REGION_AMERICA: - { - SetCountry(nn::cfg::CTR::CFG_COUNTRY_UNITED_STATES); - } - break; - - case nn::cfg::CTR::CFG_REGION_EUROPE: - { - SetCountry(nn::cfg::CTR::CFG_COUNTRY_FRANCE); - } - break; - - case nn::cfg::CTR::CFG_REGION_AUSTRALIA: - { - SetCountry(nn::cfg::CTR::CFG_COUNTRY_AUSTRALIA); - } - break; - - case nn::cfg::CTR::CFG_REGION_CHINA: - { - SetCountry(nn::cfg::CTR::CFG_COUNTRY_CHINA); - } - break; - - case nn::cfg::CTR::CFG_REGION_KOREA: - { - SetCountry(nn::cfg::CTR::CFG_COUNTRY_SOUTH_KOREA); - } - break; - - case nn::cfg::CTR::CFG_REGION_TAIWAN: - { - SetCountry(nn::cfg::CTR::CFG_COUNTRY_TAIWAN); - } - break; - } - - } -} - -inline u8 DecimalToBcd(u8 param) -{ - u8 theTen, theOne; - theTen = param / 10; - theOne = param - theTen * 10; - return (theTen << 4 | theOne); -} - -void ImportMcuRtc() -{ - COMMON_LOGGER("Import RTC Data.\n"); - nn::Result result; - nn::Handle handle = GetMcuHandle(); - - if(handle.IsValid()) - { - if (common::CheckFileExists(common::MCU_RTC_PATHNAME)) - { - size_t bufSize = common::HeapManager::GetHeap()->GetAllocatableSize(); - NN_LOG("AllocatableSize = %d\n", bufSize); - - void* buf = common::HeapManager::GetHeap()->Allocate(bufSize); - if (buf != NULL) - { - common::SdReaderWriter sdReader; - - size_t readSize; - result = sdReader.ReadBufWithCmac(common::MCU_RTC_PATHNAME, buf, bufSize, &readSize); - if (result.IsSuccess()) - { - // mcuを使ってセットする - nn::mcu::CTR::HwCheck mcu(handle); - nn::mcu::CTR::RtcData* rtc = reinterpret_cast (buf); - NN_LOG("RTC = 20%02d/%02d/%02d %02d:%02d:%02d\n", rtc->m_Year, rtc->m_Month, rtc->m_Day, rtc->m_Hour, rtc->m_Minute, rtc->m_Second); - - // BCD変換が必要 - - size_t RTC_PARAM_SIZE = sizeof(nn::mcu::CTR::RtcData); - u8 bcd[RTC_PARAM_SIZE]; - for (int i = 0; i < RTC_PARAM_SIZE; i++) - { - bcd[i] = DecimalToBcd(reinterpret_cast (rtc)[i]); - } - - result = mcu.WriteBySend(nn::drivers::mcu::CTR::MCU_RTC_SEC_ADDR, bcd, RTC_PARAM_SIZE); - - COMMON_LOGGER_RESULT_IF_FAILED_WITH_LINE(result); - } - COMMON_LOGGER_RESULT_IF_FAILED_WITH_LINE(result); - - common::HeapManager::GetHeap()->Free(buf); - } - else - { - COMMON_LOGGER("Failed Allocate Heap!!\n"); - } - } - } -} - -void InitializeFileSystem() -{ - nn::Result result; - - for (u32 i = 0; i < common::TWL_PATHNAME_MAX; i++) - { - result = nn::fs::MountSpecialArchive(common::TWL_ARCHIVE_NAME_TABLE[i], common::TWL_FS_ARCHIVE_KIND[i]); - COMMON_LOGGER_RESULT_IF_FAILED_WITH_LINE(result); - if (result.IsSuccess()) - { - nn::fs::Directory dir; - std::vector entryList; //カレントディレクトリのエントリ一覧を格納 - std::vector::iterator entryIndex; - - std::wstring currentDirectory = common::NAND_TWL_ROOT_PATHNAME_WITH_SLASH_TABLE[i]; - result = dir.TryInitialize(currentDirectory.c_str()); - - nn::fs::DirectoryEntry entry; - s32 numEntry; - for (;;) - { - result = dir.TryRead(&numEntry, &entry, 1); - if (result.IsFailure()) - { - dir.Finalize(); - } - if (numEntry == 0) - { - // ルートディレクトリを閉じる - dir.Finalize(); - - // ルートディレクトリの子を開く - for (entryIndex = entryList.begin(); entryIndex != entryList.end(); entryIndex++) - { - // ディレクトリなら削除する - if (entryIndex->attributes.isDirectory) - { - NN_LOG("Try Delete %ls%ls/\n", currentDirectory.c_str(), entryIndex->entryName); - result = nn::fs::TryDeleteDirectoryRecursively((currentDirectory + ::std::wstring( - entryIndex->entryName)).c_str()); - COMMON_LOGGER_RESULT_IF_FAILED_WITH_LINE(result); - - } - // ファイルなら削除する - else - { - NN_LOG("Try Delete %ls%ls\n", currentDirectory.c_str(), entryIndex->entryName); - result = nn::fs::TryDeleteFile( - (currentDirectory + ::std::wstring(entryIndex->entryName)).c_str()); - COMMON_LOGGER_RESULT_IF_FAILED_WITH_LINE(result); - } - } - - // 削除完了 - break; - } - else - { - // vectorに保存する - entryList.push_back(entry); - if (entry.attributes.isDirectory) - { - NN_LOG("%ls%ls/\n", currentDirectory.c_str(), entry.entryName); - } - else - { - NN_LOG("%ls%ls\n", currentDirectory.c_str(), entry.entryName); - } - } - } - } - nn::fs::Unmount(common::TWL_ARCHIVE_NAME_TABLE[i]); - } - - nn::fs::InitializeCtrFileSystem(); -} - -void ImportIvs() -{ - nn::Result result; - nn::fs::FileOutputStream fos; - - size_t bufSize = common::HeapManager::GetHeap()->GetAllocatableSize() / 2; - void* enc = common::HeapManager::GetHeap()->Allocate(bufSize); - if (enc != NULL) - { - common::SdReaderWriter sdReader; - - size_t readSize; - result = sdReader.ReadBufWithCmac(common::IVS_PATHNAME, enc, bufSize, &readSize); - if(result.IsSuccess()) - { - // SDから読み出し成功 - result = nn::fs::MountSpecialArchive(common::NAND_ARCHIVE_NAME, nn::fs::CTR::ARCHIVE_TYPE_CTR_NAND); - if (result.IsSuccess()) - { - void *dec = common::HeapManager::GetHeap()->Allocate(readSize); - if (dec != NULL) - { - // AES復号化する - nn::crypto::Initialize(); - nn::crypto::SwAesCtrContext swAesCtrContest; - - swAesCtrContest.Initialize(s_IvsDecryptIv, common::key, sizeof(common::key)); - swAesCtrContest.Decrypt(dec, enc, readSize); - - // IVS書き込み - result = fos.TryInitialize(common::IVS_NAND_PATHNAME, true); - if (result.IsSuccess()) - { - if (result.IsSuccess()) - { - s32 writeSize; - result = fos.TryWrite(&writeSize, dec, readSize, true); - if (result.IsSuccess()) - { - COMMON_LOGGER("Import IVS.\n"); - } - } - } - common::HeapManager::GetHeap()->Free(dec); - } - else - { - COMMON_LOGGER("Failed Allocate Heap!!\n"); - } - - } - nn::fs::Unmount(common::NAND_ARCHIVE_NAME); - } - common::HeapManager::GetHeap()->Free(enc); - } - else - { - COMMON_LOGGER("Failed Allocate Heap!!\n"); - } -} - -void ImportThreadFunc() -{ - nn::Result result; - - result = nn::fs::MountSpecialArchive(common::NAND_ARCHIVE_NAME, nn::fs::CTR::ARCHIVE_TYPE_CTR_NAND); - COMMON_LOGGER_RESULT_IF_FAILED_WITH_LINE(result); - - result = common::SdMountManager::Mount(); - COMMON_LOGGER_RESULT_IF_FAILED_WITH_LINE(result); - - size_t bufSize = common::HeapManager::GetHeap()->GetAllocatableSize(); - NN_LOG("AllocatableSize = %d\n", bufSize); - - void* buf = common::HeapManager::GetHeap()->Allocate(bufSize); - if (buf != NULL) - { - - common::CopyDirectory( - (::std::wstring(common::SDMC_ROOT_DIRECTORY_PATH) + ::std::wstring(common::SD_SAVEDATA_ROOT_NAME)).c_str(), - common::NAND_DATA_ROOT_PATHNAME_WITH_SLASH, - buf, bufSize); - - common::HeapManager::GetHeap()->Free(buf); - } - - common::SdMountManager::Unmount(); - nn::fs::Unmount(common::NAND_ARCHIVE_NAME); - - NN_LOG("Import Thread Finalize\n"); -} - -namespace -{ - -void ImportSaveData() -{ - // SDカードからNANDに読み込み - nn::Result result; - - // SDカードにあるセーブデータサイズを計算 - u32 fileNum = 0; - u32 fileSize = 0; - - common::SdMountManager::Mount(); - common::CalculateFileNum(::std::wstring(common::SDMC_ROOT_DIRECTORY_PATH) + ::std::wstring(common::SD_SAVEDATA_ROOT_NAME), fileNum, fileSize); - common::SdMountManager::Unmount(); - - // ファイルサイズ設定 - common::InitializeTransferProgress(fileSize); - - NN_LOG("File Number = %d\n", fileNum); - NN_LOG("File Size = %d\n", fileSize); - - // SDカードにあるセーブデータディレクトリ以下のデータをNANDにコピー - COMMON_LOGGER("Import NAND Data Start...\n"); - s_ImportThread.Start(ImportThreadFunc, s_ImportThreadStack); - -} - -void ImportNorData() -{ - COMMON_LOGGER("Import NOR Data.\n"); - - nn::Result result; - - nn::cfg::nor::CTR::Initialize(); - - size_t bufSize = common::HeapManager::GetHeap()->GetAllocatableSize(); - NN_LOG("AllocatableSize = %d\n", bufSize); - - void* buf = common::HeapManager::GetHeap()->Allocate(bufSize); - if (buf != NULL) - { - common::SdReaderWriter sdReader; - - size_t readSize; - result = sdReader.ReadBufWithCmac(common::NOR_PATHNAME, buf, bufSize, &readSize); - if(result.IsSuccess()) - { - // cfgを使ってセットする - result = nn::cfg::nor::CTR::SetNtrSetting(&reinterpret_cast(buf)->ntrConfig.ncd, - &reinterpret_cast(buf)->ntrConfig.ncd_ex); - COMMON_LOGGER_RESULT_IF_FAILED_WITH_LINE(result); - - // TWL WiFi設定 - result = nn::cfg::nor::CTR::WriteTwlWifiSetting(0, reinterpret_cast(buf)->TwlWiFiSetting, - common::TWL_WIFI_SETTING_SIZE); - COMMON_LOGGER_RESULT_IF_FAILED_WITH_LINE(result); - - // NTR WiFi設定 - result = nn::cfg::nor::CTR::WriteNtrWifiSetting(0, reinterpret_cast(buf)->NtrWiFiSetting, - common::NTR_WIFI_SETTING_SIZE); - COMMON_LOGGER_RESULT_IF_FAILED_WITH_LINE(result); - - } - COMMON_LOGGER_RESULT_IF_FAILED_WITH_LINE(result); - - common::HeapManager::GetHeap()->Free(buf); - } - else - { - COMMON_LOGGER("Failed Allocate Heap!!\n"); - } - -} - - -} - -void ReadVersionData() -{ - nn::Result result; - - std::memset(&s_SDVersionData, 0, sizeof(common::VerDef)); - - size_t bufSize = common::HeapManager::GetHeap()->GetAllocatableSize(); - NN_LOG("AllocatableSize = %d\n", bufSize); - - void* buf = common::HeapManager::GetHeap()->Allocate(bufSize); - if (buf != NULL) - { - common::SdReaderWriter sdReader; - - size_t readSize; - result = sdReader.ReadBufWithCmac(common::VERSION_DATA_PATHNAME, buf, bufSize, &readSize); - if(result.IsSuccess()) - { - // バージョン情報を保持する - std::memcpy(&s_SDVersionData, buf, readSize); - NN_LOG("SD Version = %02d.%02d.%02d-%02d\n", s_SDVersionData.cup.majorVersion, - s_SDVersionData.cup.minorVersion, - s_SDVersionData.cup.microVersion, - s_SDVersionData.nup.majorVersion); - COMMON_LOGGER_RESULT_IF_FAILED_WITH_LINE(result); - - } - COMMON_LOGGER_RESULT_IF_FAILED_WITH_LINE(result); - - common::HeapManager::GetHeap()->Free(buf); - } - else - { - COMMON_LOGGER("Failed Allocate Heap!!\n"); - } -} - -bool AlreadyExecutedNup() -{ - return s_SDVersionData.nup.majorVersion != 0; -} - -void Cleanup() -{ - nn::Result result; - bool execCleanup; - - result = nn::am::NeedsCleanup(&execCleanup, nn::fs::MEDIA_TYPE_NAND); - if(result.IsSuccess()) - { - if(execCleanup) - { - COMMON_LOGGER("Cleanup NAND\n"); - nn::am::DoCleanup(nn::fs::MEDIA_TYPE_NAND); - } - } - COMMON_LOGGER_RESULT_IF_FAILED_WITH_LINE(result); -} - -void DeleteAllCheckFiles() -{ - nn::Result result; - common::SdMountManager::Mount(); - - for(u32 i = 0; i < sizeof(CHECK_FILENAME_TABLE) / sizeof(CHECK_FILENAME_TABLE[0]); i++) - { - if(common::CheckFileExists(CHECK_FILENAME_TABLE[i])) - { - result = nn::fs::TryDeleteFile(CHECK_FILENAME_TABLE[i]); - COMMON_LOGGER_RESULT_IF_FAILED(result); - } - } - common::SdMountManager::Unmount(); -} - -void FinalizeImportThread() -{ - s_ImportThread.Join(); - s_ImportThread.Finalize(); -} - -bool IsImportFinished() -{ - return !s_ImportThread.IsAlive(); -} - -void CreateWriteFinishedFile() -{ - CreateEmptyFile(common::WRITE_FINISHED_CHECK_PATHNAME); -} - -void CreateConsoleInitializedFile() -{ - CreateEmptyFile(common::INITIALIZED_CHECK_PATHNAME); -} - -void CreateUpdateFinishedFile() -{ - CreateEmptyFile(common::UPDATE_CHECK_PATHNAME); -} - -void CreateRtcSyncFinishedFile() -{ - CreateEmptyFile(common::RTC_SYNC_CHECK_PATHNAME); -} - -void CreateTryRestoreSameConsoleFile() -{ - CreateEmptyFile(common::TRY_RESTORE_SAME_CONSOLE_PATHNAME); -} - -u32 GetImportProgress() -{ - return common::GetProgress(); -} - -bool UpdateNetworkSetting(nn::ac::NetworkSetting& networkSetting) -{ - nn::Result result; - bool retval = true; - - result = nn::ac::InitializeInternal(); - if(result.IsFailure()) - { - retval = false; - COMMON_LOGGER("Error: nn::ac::InitializeInternal() failed\n"); - } - else - { - //特に入力させる必要のない自動で設定する項目 - networkSetting.wireless.enable = true; - networkSetting.wireless.multiSsid.enable = false; - networkSetting.ip.enableDHCP = true; - networkSetting.scanlessConnect.hasConnected = false; - networkSetting.proxy.enable = false; - networkSetting.other.enableUPnP = false; - - // 現在のインターネット設定1を一時的に保持 - result = nn::ac::LoadNetworkSetting(0, s_CurrentNetowrkSetting1.setting); - if(result.IsSuccess()) - { - s_CurrentNetowrkSetting1.isValid = true; - } - else - { - s_CurrentNetowrkSetting1.isValid = false; - } - - result = nn::ac::UpdateNetworkSetting( 0, networkSetting ); - if(!result.IsSuccess()) - { - retval = false; - COMMON_LOGGER("Error: SetNetworkSetting (Update Error)\n"); - } - else - { - result = nn::ac::FinalizeInternal(); - if (!result.IsSuccess()) - { - retval = false; - COMMON_LOGGER("Error: SetNetworkSetting (Finalize Error)\n"); - } - } - } - - return retval; -} - -bool ReadSetting(bool* nupOnly) -{ - nn::Result result; - bool retval = true; - common::ConfigFileLoader configfileLoader; - - common::SdMountManager::Mount(); - size_t size = common::HeapManager::GetHeap()->GetAllocatableSize(); - void* heapAddr = common::HeapManager::GetHeap()->Allocate(size); - - if(heapAddr != NULL) - { - result = configfileLoader.Initialize(common::AP_SETTING_PATHNAME, heapAddr, size); - if (result.IsSuccess()) - { - nn::ac::NetworkSetting networkSetting; - - { - const char* ssid = configfileLoader.ReadAsChar(L"SSID"); // SSID - if(ssid == NULL) - { - COMMON_LOGGER("SSID: is missing\n"); - retval = false; - } - else - { - std::strncpy(reinterpret_cast (networkSetting.wireless.essidSecurity.ssid), ssid, 32); - networkSetting.wireless.essidSecurity.ssidLength = std::strlen(ssid) % 33; - COMMON_LOGGER("SSID = %s\n", networkSetting.wireless.essidSecurity.ssid); - } - } - - - { - const char* mode = configfileLoader.ReadAsChar(L"MODE"); // MODE - if(mode == NULL) - { - COMMON_LOGGER("MODE: is missing\n"); - retval = false; - } - else - { - if (std::strcmp(mode, "OPEN") == 0) - { - networkSetting.wireless.essidSecurity.securityMode = nn::ac::OPEN; - } - else if (std::strcmp(mode, "WEP40") == 0) - { - networkSetting.wireless.essidSecurity.securityMode = nn::ac::WEP_40BIT; - } - else if (std::strcmp(mode, "WEP104") == 0) - { - networkSetting.wireless.essidSecurity.securityMode = nn::ac::WEP_104BIT; - } - else if (std::strcmp(mode, "WEP128") == 0) - { - networkSetting.wireless.essidSecurity.securityMode = nn::ac::WEP_128BIT; - } - else if (std::strcmp(mode, "WPA-TKIP") == 0) - { - networkSetting.wireless.essidSecurity.securityMode = nn::ac::WPA_TKIP; - } - else if (std::strcmp(mode, "WPA2-TKIP") == 0) - { - networkSetting.wireless.essidSecurity.securityMode = nn::ac::WPA2_TKIP; - } - else if (std::strcmp(mode, "WPA-AES") == 0) - { - networkSetting.wireless.essidSecurity.securityMode = nn::ac::WPA_AES; - } - else if (std::strcmp(mode, "WPA2-AES") == 0) - { - networkSetting.wireless.essidSecurity.securityMode = nn::ac::WPA2_AES; - } - else - { - networkSetting.wireless.essidSecurity.securityMode = nn::ac::OPEN; - } - - switch (networkSetting.wireless.essidSecurity.securityMode) - { - case nn::ac::OPEN: - { - COMMON_LOGGER("MODE = OPEN\n"); - } - break; - - case nn::ac::WEP_40BIT: - { - COMMON_LOGGER("MODE = WEP_40BIT\n"); - } - break; - - case nn::ac::WEP_104BIT: - { - COMMON_LOGGER("MODE = WEP_104BIT\n"); - } - break; - - case nn::ac::WEP_128BIT: - { - COMMON_LOGGER("MODE = WEP_128BIT\n"); - } - break; - - case nn::ac::WPA_TKIP: - { - COMMON_LOGGER("MODE = WPA_TKIP\n"); - } - break; - - case nn::ac::WPA2_TKIP: - { - COMMON_LOGGER("MODE = WPA2_TKIP\n"); - } - break; - - case nn::ac::WPA_AES: - { - COMMON_LOGGER("MODE = WPA_AES\n"); - } - break; - - case nn::ac::WPA2_AES: - { - COMMON_LOGGER("MODE = WPA2_AES\n"); - } - break; - - } - - } - } - - { - const char* pass = configfileLoader.ReadAsChar(L"PASS"); // PASS - if(pass == NULL) - { - COMMON_LOGGER("PASS: is missing\n"); - retval = false; - } - else - { - switch (networkSetting.wireless.essidSecurity.securityMode) - { - case nn::ac::WEP_40BIT: - case nn::ac::WEP_104BIT: - case nn::ac::WEP_128BIT: - { - std::strncpy(reinterpret_cast (networkSetting.wireless.essidSecurity.passphrase), - pass, 64); - std::memcpy(networkSetting.wireless.essidSecurity.key, - networkSetting.wireless.essidSecurity.passphrase, 64); - } - break; - - case nn::ac::WPA_TKIP: - case nn::ac::WPA2_TKIP: - case nn::ac::WPA_AES: - case nn::ac::WPA2_AES: - { - std::strncpy(reinterpret_cast (networkSetting.wireless.essidSecurity.passphrase), - pass, 64); - size_t phrase_size = std::strlen( - reinterpret_cast (networkSetting.wireless.essidSecurity.passphrase)); - - nn::nwm::Ssid ssid(reinterpret_cast (networkSetting.wireless.essidSecurity.ssid)); - nn::nwm::ConvertPasswordToPsk( - reinterpret_cast (networkSetting.wireless.essidSecurity.passphrase), - phrase_size, ssid, networkSetting.wireless.essidSecurity.key); - } - break; - - case nn::ac::OPEN: - default: - { - //do nothing - } - break; - } - } - } - - - { - s32 dnsAuto; // DNS_AUTO - if(configfileLoader.ReadAsChar(L"DNS_AUTO") == NULL) - { - COMMON_LOGGER("DNS_AUTO: is missing\n"); - retval = false; - } - else - { - dnsAuto = configfileLoader.ReadAsInteger(L"DNS_AUTO"); - if (dnsAuto == 1) - { - networkSetting.ip.autoDNSSetting = true; - } - else - { - networkSetting.ip.autoDNSSetting = false; - } - - COMMON_LOGGER("DNS_AUTO = %d\n", networkSetting.ip.autoDNSSetting); - - } - } - - { - const char* dnsPrimary = configfileLoader.ReadAsChar(L"DNS_PRI"); // プライマリDNS - if(!networkSetting.ip.autoDNSSetting) - { - if (dnsPrimary == NULL) - { - COMMON_LOGGER("DNS_PRI: is missing\n"); - retval = false; - - } - else - { - u8 dns[4]; - nn::socket::InAddr addr; - if (1 == nn::socket::InetAtoN(dnsPrimary, &addr)) - { - dns[3] = (0xff & (addr.addr >> 24)); - dns[2] = (0xff & (addr.addr >> 16)); - dns[1] = (0xff & (addr.addr >> 8)); - dns[0] = (0xff & (addr.addr)); - } - std::memcpy(networkSetting.ip.dns[0], dns, 4); - COMMON_LOGGER("DNS_PRI = %03d.%03d.%03d.%03d\n", networkSetting.ip.dns[0][0], - networkSetting.ip.dns[0][1], - networkSetting.ip.dns[0][2], - networkSetting.ip.dns[0][3]); - - } - } - } - - { - const char* dnsSecondary = configfileLoader.ReadAsChar(L"DNS_SEC"); // セカンダリDNS - if(!networkSetting.ip.autoDNSSetting) - { - if(dnsSecondary == NULL) - { - COMMON_LOGGER("DNS_SEC: is missing\n"); - retval = false; - } - else - { - u8 dns[4]; - nn::socket::InAddr addr; - if (1 == nn::socket::InetAtoN(dnsSecondary, &addr)) - { - dns[3] = (0xff & (addr.addr >> 24)); - dns[2] = (0xff & (addr.addr >> 16)); - dns[1] = (0xff & (addr.addr >> 8)); - dns[0] = (0xff & (addr.addr)); - } - std::memcpy(networkSetting.ip.dns[1], dns, 4); - COMMON_LOGGER("DNS_SEC = %03d.%03d.%03d.%03d\n", networkSetting.ip.dns[1][0], - networkSetting.ip.dns[1][1], - networkSetting.ip.dns[1][2], - networkSetting.ip.dns[1][3]); - - } - } - } - - { - const char* ntpServerName = configfileLoader.ReadAsChar(L"NTPSRV"); // NTPサーバ - if(ntpServerName == NULL) - { - COMMON_LOGGER("NTPSRV: is missing\n"); - retval = false; - } - else - { - std::strlcpy(s_NtpServerName, ntpServerName, sizeof(s_NtpServerName)); - COMMON_LOGGER("NTPSRV = %s\n", s_NtpServerName); - } - - - } - - { - const char* timeZone = configfileLoader.ReadAsChar(L"TIMEZONE"); // タイムゾーン - if(timeZone == NULL) - { - COMMON_LOGGER("TIMEZONE: is missing\n"); - retval = false; - } - else - { - std::strlcpy(s_TimeZoneStr, timeZone, sizeof(s_TimeZoneStr)); - COMMON_LOGGER("TIMEZONE = %s\n", s_TimeZoneStr); - ConvertTimeZoneString(s_TimeZoneStr); - } - - } - - { - NN_NULL_ASSERT(nupOnly); - if (configfileLoader.ReadAsChar(L"NUP_ONLY") != NULL) - { - s32 num = configfileLoader.ReadAsInteger(L"NUP_ONLY"); - if (num == 1) - { - *nupOnly = true; - COMMON_LOGGER("NUP Only Mode.\n"); - } - } - } - - configfileLoader.Finalize(); - - // 書き込み完了しなければfalse - if(!UpdateNetworkSetting(networkSetting)) - { - retval = false; - } - - } - else - { - NN_LOG("configfileLoader Initialize Failed\n"); - COMMON_LOGGER_RESULT_IF_FAILED_WITH_LINE(result); - retval = false; - } - common::HeapManager::GetHeap()->Free(heapAddr); - } - else - { - NN_LOG("Can't Allocate Heap\n"); - COMMON_LOGGER_RESULT_IF_FAILED_WITH_LINE(result); - retval = false; - } - - common::SdMountManager::Unmount(); - return retval; -} - -char* GetNtpServerName() -{ - return s_NtpServerName; -} - -TimeZone GetTimeZone() -{ - return s_TimeZone; -} - -CheckedNetworkSetting* GetTempNetworkSetting() -{ - return &s_CurrentNetowrkSetting1; -} - -void ImportTwlData(enum common::TWL_PATH_INDEX path) -{ - NN_ASSERT(path < common::TWL_PATHNAME_MAX); - - nn::Result result; - - result = nn::fs::MountSpecialArchive(common::TWL_ARCHIVE_NAME_TABLE[path], common::TWL_FS_ARCHIVE_KIND[path]); - COMMON_LOGGER_RESULT_IF_FAILED_WITH_LINE(result); - - result = common::SdMountManager::Mount(); - - size_t bufSize = common::HeapManager::GetHeap()->GetAllocatableSize(); - NN_LOG("AllocatableSize = %d\n", bufSize); - - - u32 fileNum = 0; - u32 fileSize = 0; - - common::CalculateFileNum(::std::wstring(common::SDMC_ROOT_DIRECTORY_PATH) + ::std::wstring( - common::SD_TWL_ROOTNAME_TABLE[path]), fileNum, fileSize); - // ファイルサイズ設定 - common::InitializeTransferProgress(fileSize); - - NN_LOG("File Number = %d\n", fileNum); - NN_LOG("File Size = %d\n", fileSize); - - - void* buf = common::HeapManager::GetHeap()->Allocate(bufSize); - if (buf != NULL) - { - wchar_t archiveName[256]; - ::std::mbstowcs(archiveName, common::TWL_ARCHIVE_NAME_TABLE[path], std::strlen(common::TWL_ARCHIVE_NAME_TABLE[path]) + 1); - std::wstring archiveString(archiveName); - common::CopyDirectory( - (::std::wstring(common::SDMC_ROOT_DIRECTORY_PATH) + ::std::wstring(common::SD_TWL_ROOTNAME_TABLE[path])).c_str(), - (archiveString + ::std::wstring(L"/")).c_str(), - buf, bufSize); - - common::HeapManager::GetHeap()->Free(buf); - } - - common::SdMountManager::Unmount(); - nn::fs::Unmount(common::TWL_ARCHIVE_NAME_TABLE[path]); - -} - -void ImportTwlPhotoDataFunc() -{ - COMMON_LOGGER("Import Twl Photo Data.\n"); - ImportTwlData(common::TWL_PHOTO); -} - -void ImportTwlSoundDataFunc() -{ - COMMON_LOGGER("Import Twl Sound Data.\n"); - ImportTwlData(common::TWL_SOUND); -} - -void ImportTwlPhotoData() -{ - s_ImportThread.Start(ImportTwlPhotoDataFunc, s_ImportThreadStack); -} - -void ImportTwlSoundData() -{ - s_ImportThread.Start(ImportTwlSoundDataFunc, s_ImportThreadStack); -} - - -void ClearFileReadResult() -{ - s_CheckedEqualsIVSFileandIVS = false; - s_CheckedEqualsRegionDataandRegion = false; - s_ReadSerialNumber = false; -} - -void ImportPlayHistoryThreadFunc() -{ - common::PlayHistoryManager historyManager; - - COMMON_LOGGER("Import PlayHistory\n"); - historyManager.Import(); -} - -void ImportPlayHistory() -{ - s_ImportThread.Start(ImportPlayHistoryThreadFunc, s_ImportThreadStack); -} - -void ExportTouchPanelCfgData() -{ - using namespace nn::cfg::CTR::detail; - - nn::Result result; - nn::cfg::CTR::detail::TouchPanelCfgData touchPanelCfgData; - common::SdReaderWriter sdWriter; - - COMMON_LOGGER("Export TouchPanelData\n"); - - common::SdMountManager::Mount(); - - result = nn::cfg::CTR::init::GetConfig(&touchPanelCfgData, sizeof(TouchPanelCfgData), - GET_CFG_KEY(NN_CFG_HID, NN_CFG_HID_CAL_TOUCHPANEL)); - COMMON_LOGGER_RESULT_IF_FAILED_WITH_LINE(result); - if (result.IsSuccess()) - { - result = sdWriter.WriteBufWithCmac(common::TOUCH_PANEL_CALIBRATION_PATHNAME, &touchPanelCfgData, sizeof(touchPanelCfgData)); - COMMON_LOGGER_RESULT_IF_FAILED_WITH_LINE(result); - } - - common::SdMountManager::Unmount(); -} - -bool ImportTouchPanelCfgData(nn::cfg::CTR::detail::TouchPanelCfgData* data) -{ - using namespace nn::cfg::CTR::detail; - - nn::Result result; - bool retval = false; - - COMMON_LOGGER("Import TouchPanelData\n"); - - common::SdMountManager::Mount(); - - size_t bufSize = common::HeapManager::GetHeap()->GetAllocatableSize(); - void* buf = common::HeapManager::GetHeap()->Allocate(bufSize); - if (buf != NULL) - { - common::SdReaderWriter sdReader; - - size_t readSize; - result = sdReader.ReadBufWithCmac(common::TOUCH_PANEL_CALIBRATION_PATHNAME, buf, bufSize, &readSize); - if(result.IsSuccess()) - { - // SDから読み出し成功 - std::memcpy(data, buf, readSize); - retval = true; - } - else - { - COMMON_LOGGER_RESULT_IF_FAILED_WITH_LINE(result); - } - common::HeapManager::GetHeap()->Free(buf); - } - - common::SdMountManager::Unmount(); - return retval; -} - -void InitializeHardwareDependentSetting() -{ - using namespace nn::cfg::CTR::detail; - nn::Result result = nn::ResultSuccess(); - - nn::cfg::CTR::detail::TouchPanelCfgData touchPanelCfgData; - if(ImportTouchPanelCfgData(&touchPanelCfgData)) - { - result = nn::cfg::CTR::init::SetConfig(GET_CFG_KEY(NN_CFG_HID, NN_CFG_HID_CAL_TOUCHPANEL), &touchPanelCfgData, - sizeof(TouchPanelCfgData)); - } - - COMMON_LOGGER_RESULT_IF_FAILED_WITH_LINE(result); - - nn::cfg::CTR::init::ResetCameraCalibration(); - COMMON_LOGGER_RESULT_IF_FAILED_WITH_LINE(result); - - nn::cfg::CTR::init::ResetAnalogStickCalibration(); - COMMON_LOGGER_RESULT_IF_FAILED_WITH_LINE(result); -} - -void ImportData() -{ - static bool init = true; - if(init) - { - // NANDのごみを削除する - Cleanup(); - - // SDカードのIVSファイルを書き込む - ImportIvs(); - - // NORデータを書き込む - ImportNorData(); - - // タッチパネルキャリブレーションデータをSDカードに出力する - // 本体初期化後はcal値が設定されている - ExportTouchPanelCfgData(); - - // SDカードのセーブデータをNANDに書き込む - ImportSaveData(); - - init = false; - } - -} - -} diff --git a/branches/work/SD_AesCmac/ConsoleRestore/Importer.h b/branches/work/SD_AesCmac/ConsoleRestore/Importer.h deleted file mode 100644 index 03f46d1..0000000 --- a/branches/work/SD_AesCmac/ConsoleRestore/Importer.h +++ /dev/null @@ -1,97 +0,0 @@ -/*---------------------------------------------------------------------------* - Project: Horizon - File: Importer.h - - Copyright 2009 Nintendo. All rights reserved. - - These coded instructions, statements, and computer programs contain - proprietary information of Nintendo of America Inc. and/or Nintendo - Company Ltd., and are protected by Federal copyright law. They may - not be disclosed to third parties or copied or duplicated in any form, - in whole or in part, without the prior written consent of Nintendo. - - $Rev$ - *---------------------------------------------------------------------------*/ - -#ifndef IMPORTER_H_ -#define IMPORTER_H_ - -#include -#include "FileName.h" -#include - -namespace ConsoleRestore -{ - -bool EqualsIVSFileandIVS(); -bool EqualsRegionDataandRegion(); -u8* ReadSerialNumber(); - -void FinalizeImportThread(); -bool IsImportFinished(); -void ImportTwlSoundData(); -void ImportTwlPhotoData(); -void ImportData(); -void CreateWriteFinishedFile(); -void CreateUpdateFinishedFile(); -void CreateConsoleInitializedFile(); -void CreateRtcSyncFinishedFile(); -void CreateTryRestoreSameConsoleFile(); -u32 GetImportProgress(); - -// NANDのごみを削除する -void Cleanup(); - -const wchar_t* const CHECK_FILENAME_TABLE[] = -{ - common::UPDATE_CHECK_PATHNAME, - common::INITIALIZED_CHECK_PATHNAME, - common::WRITE_FINISHED_CHECK_PATHNAME, - common::RTC_SYNC_CHECK_PATHNAME, - common::TRY_RESTORE_SAME_CONSOLE_PATHNAME -}; - -void DeleteAllCheckFiles(); - -struct TimeZone -{ - u32 hour; - u32 minutes; - bool isMinus; - NN_PADDING3; -}; - -bool ReadSetting(bool* nupOnly); -char* GetNtpServerName(); -TimeZone GetTimeZone(); - -struct CheckedNetworkSetting -{ - nn::ac::CTR::NetworkSetting setting; - bool isValid; - NN_PADDING3; -}; - -CheckedNetworkSetting* GetTempNetworkSetting(); -void ImportCountryLanguageData(); -void ImportMcuRtc(); - -// TWL写真領域を初期化してから本体初期化を行う -void InitializeFileSystem(); - -void ClearFileReadResult(); - -// プレイ履歴を読み込みます。ptmのセーブデータ移行後に呼び出す必要があります -void ImportPlayHistory(); - -// cfgのハードウェア固有領域をcal値で初期化します -void InitializeHardwareDependentSetting(); - -// SDカード上のバージョン情報を読みます -void ReadVersionData(); -// 移行元本体がNUP済みかどうか -bool AlreadyExecutedNup(); - -} - -#endif /* IMPORTER_H_ */ diff --git a/branches/work/SD_AesCmac/ConsoleRestore/NtpClient.cpp b/branches/work/SD_AesCmac/ConsoleRestore/NtpClient.cpp deleted file mode 100644 index f2a5114..0000000 --- a/branches/work/SD_AesCmac/ConsoleRestore/NtpClient.cpp +++ /dev/null @@ -1,376 +0,0 @@ -/*---------------------------------------------------------------------------* - Project: Horizon - File: NtpClient.cpp - - Copyright 2009 Nintendo. All rights reserved. - - These coded instructions, statements, and computer programs contain - proprietary information of Nintendo of America Inc. and/or Nintendo - Company Ltd., and are protected by Federal copyright law. They may - not be disclosed to third parties or copied or duplicated in any form, - in whole or in part, without the prior written consent of Nintendo. - - $Rev$ - *---------------------------------------------------------------------------*/ - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "Importer.h" -#include "CommonLogger.h" - -namespace ConsoleRestore -{ - -namespace { - -const size_t NTP_THREAD_STACK_SIZE = 0x1000; -nn::os::Thread s_NtpThread; -nn::os::StackBuffer s_NtpThreadStack; -bool s_NtpSyncSuccessed = false; - - -struct NTP_Packet{ // NTPパケット - u32 controlWord; - u32 rootDelay; - u32 rootDispersion; - u32 referenceId; - s64 referenceTimestamp; - s64 startTimestamp; - s64 receiveTimestamp; - u32 transmitTimestampSeconds; - u32 transmitTimestampFractions; -}; - -const size_t TIMEOUT_MILLISECOND = 5000; // タイムアウト ミリ秒数 -NTP_Packet s_NTPSendPacket; // 送信するNTPパケット -NTP_Packet s_NTPRecvPacket; // 受信するNTPパケット -const u32 NTP_PORT_NUM = 123; - -nn::Result InitializeNetwork(void) -{ - nn::Result result; - nn::ac::Config config; - - result = nn::ac::Initialize(); - COMMON_LOGGER_RESULT_IF_FAILED_WITH_LINE(result); - - // 接続要求用のパラメータを作成 - result = nn::ac::CreateDefaultConfig(&config); - if (result.IsFailure()) - { - COMMON_LOGGER_RESULT_IF_FAILED_WITH_LINE(result); - return result; - } - - // デバッグ用に接続テストを無効化 - nn::ac::DebugSetNetworkArea(&config, nn::ac::NETWORK_AREA_LAN); - - // 接続要求を発行 - result = nn::ac::ConnectWithoutEula(config); - if (result.IsFailure()) - { - COMMON_LOGGER_RESULT_IF_FAILED_WITH_LINE(result); - return result; - } - - return nn::ResultSuccess(); -} - -nn::Result FinalizeNetwork(void) -{ - nn::Result result; - - // 接続要求用のパラメータを作成 - result = nn::ac::Close(); - NN_UTIL_RETURN_IF_FAILED(result); - - result = nn::ac::Finalize(); - COMMON_LOGGER_RESULT_IF_FAILED_WITH_LINE(result); - - return nn::ResultSuccess(); -} - -bool GetNtpTime(u32* ntpTime) -{ - nn::Result result; - - bool retval = true; - NN_LOG("Initializing network.\n"); - - // 本体に書き込まれているネットワーク設定を使ってネットワーク接続を初期化 - result = InitializeNetwork(); - COMMON_LOGGER_RESULT_IF_FAILED_WITH_LINE(result); - - { - NN_LOG("Initializing socket..\n"); - - // 一つのスレッドからソケット API を利用する - const s32 sessionCount = 1; - // ソケットの送受信バッファとして 64 KB を割り当て - const size_t bufferSizeForSockets = 65536; - // ソケットライブラリに必要なワークサイズを求める - const size_t workSizeForLibrary = nn::socket::GetRequiredMemorySize(bufferSizeForSockets, sessionCount); - - // ワークメモリを確保して 4KB にアラインにする - u8* pWorkMemory = new u8[workSizeForLibrary + 4096]; - uptr workMemoryAddress = nn::math::RoundUp(reinterpret_cast (pWorkMemory), 4096); - - // ソケットライブラリの初期化 - result = nn::socket::Initialize(workMemoryAddress, workSizeForLibrary, bufferSizeForSockets, sessionCount); - COMMON_LOGGER_RESULT_IF_FAILED_WITH_LINE(result); - - { - s32 ret; - nn::socket::InAddr addr, netmask; - ret = nn::socket::GetPrimaryAddress(reinterpret_cast (&addr), reinterpret_cast (&netmask)); - NN_ASSERT(ret == 0); - COMMON_LOGGER("host : %s\n", nn::socket::InetNtoA(addr)); - COMMON_LOGGER("netmask : %s\n", nn::socket::InetNtoA(netmask)); - - nn::socket::InAddr dns1, dns2; - ret = nn::socket::GetResolver(reinterpret_cast (&dns1), reinterpret_cast (&dns2)); - if (ret == 0) - { - COMMON_LOGGER("dns1 : %s\n", nn::socket::InetNtoA(dns1)); - COMMON_LOGGER("dns2 : %s\n", nn::socket::InetNtoA(dns2)); - } - - nn::socket::InAddr gateway; - ret = nn::socket::GetDefaultGateway(reinterpret_cast (&gateway)); - if (ret == 0) - { - COMMON_LOGGER("gateway : %s\n", nn::socket::InetNtoA(gateway)); - } - - COMMON_LOGGER("\n"); -#ifndef NN_SWITCH_DISABLE_DEBUG_PRINT - nn::socket::DumpRoutingTable(); -#endif - } - - { - s32 socket = nn::socket::Socket(nn::socket::PF_INET, nn::socket::SOCK_DGRAM, 0); - NN_LOG("socket = %d\n", socket); - - // クライアントアドレスの設定 - nn::socket::SockAddrIn host_addr; - host_addr.len = sizeof(nn::socket::SockAddrIn); - host_addr.family = nn::socket::AF_INET; - host_addr.addr.addr = 0; - host_addr.port = nn::socket::HtoNs(NTP_PORT_NUM); - - // ローカルアドレスをバインド - s32 ret = nn::socket::Bind(socket, &host_addr); - NN_LOG("bind = %d\n", ret); - - // ******************************************************************************** - // NTPパケットを生成して送る - // ******************************************************************************** - - // サーバアドレスの設定 - nn::socket::SockAddrIn serverSockAddrIn; - serverSockAddrIn.len = sizeof(nn::socket::SockAddrIn); - serverSockAddrIn.family = nn::socket::AF_INET; - - // GetHostByNameを使う場合 - nn::socket::HostEnt* serverHostent; - u64 serveraddr = 0; - serverHostent = nn::socket::GetHostByName(GetNtpServerName()); - if (serverHostent == NULL) - { - COMMON_LOGGER("Error: GetHostByName %s\n", GetNtpServerName()); - retval = false; - } - else - { - // サーバのホスト情報からIPアドレスをコピー - serveraddr = *(reinterpret_cast (serverHostent->addrList[0])); - } - serverSockAddrIn.addr.addr = serveraddr; - COMMON_LOGGER("Destination address: %s\n", nn::socket::InetNtoA(serverSockAddrIn.addr)); - serverSockAddrIn.port = nn::socket::HtoNs(NTP_PORT_NUM); // ポート番号 - - // NTPパケットをSNTP用に初期化する - s_NTPSendPacket.controlWord = nn::socket::HtoNl(0x0B000000); - s_NTPSendPacket.rootDelay = 0; - s_NTPSendPacket.rootDispersion = 0; - s_NTPSendPacket.referenceId = 0; - s_NTPSendPacket.referenceTimestamp = 0; - s_NTPSendPacket.startTimestamp = 0; - s_NTPSendPacket.receiveTimestamp = 0; - s_NTPSendPacket.transmitTimestampSeconds = 0; - s_NTPSendPacket.transmitTimestampFractions = 0; - - // サーバを指定してNTPパケットを送信する - if ((ret = nn::socket::SendTo(socket, reinterpret_cast (&s_NTPSendPacket), sizeof(s_NTPSendPacket), 0, - &serverSockAddrIn)) < 0) - { - COMMON_LOGGER("Error: Failed Send to Server, %d\n", ret); - retval = false; - } - - NN_LOG("SendTo finished\n"); - - // 受信待ち - nn::socket::PollFd pollFd; - pollFd.fd = socket; - pollFd.events = nn::socket::POLLRDNORM; - if ((ret = nn::socket::Poll(&pollFd, 1, TIMEOUT_MILLISECOND)) < 0) - { - COMMON_LOGGER("Error: recv error, %d\n", ret); - retval = false; - } - - NN_LOG("Poll Finished\n"); - - switch (pollFd.revents) - { - case nn::socket::POLLERR: // ソケットにエラーが発生しました。 - COMMON_LOGGER("Error: POLLERR %s %d\n", __FILE__, __LINE__); - retval = false; - break; - case nn::socket::POLLHUP: // ストリーム・ソケットが未接続です。 - COMMON_LOGGER("Error: POLLHUP %s %d\n", __FILE__, __LINE__); - retval = false; - break; - case nn::socket::POLLNVAL: // 不正なソケット記述子です。 - COMMON_LOGGER("Error: POLLNVAL %s %d\n", __FILE__, __LINE__); - retval = false; - break; - default: - break; - } - - // サーバから時刻情報を受信する - // サーバを指定して受信を行う - // 受信するまで待たされる - if ((ret = nn::socket::RecvFrom(socket, reinterpret_cast (&s_NTPRecvPacket), sizeof(s_NTPRecvPacket), nn::socket::MSG_DONTWAIT, - &serverSockAddrIn)) < 0) - { - COMMON_LOGGER("Error: RecvFrom, %d\n", ret); - retval = false; - } - - NN_LOG("RecvFrom finished\n"); - - // NTPサーバから取得した時刻を現地時間に変換する - *ntpTime = nn::socket::NtoHl(s_NTPRecvPacket.transmitTimestampSeconds) - 2208988800; /* 1970/01/01 からの秒数に変換 */ - NN_LOG("ntp_time = %d\n", ntpTime); - - nn::socket::Close(socket); - NN_UNUSED_VAR(ret); - } - - NN_LOG("Finalizing socket..\n"); - // ソケットライブラリの終了 - result = nn::socket::Finalize(); - COMMON_LOGGER_RESULT_IF_FAILED_WITH_LINE(result); - } - - NN_LOG("Finalizing network.\n"); - result = FinalizeNetwork(); - COMMON_LOGGER_RESULT_IF_FAILED_WITH_LINE(result); - - return retval; -} - -void RestoreCurrentInternetSetting() -{ - COMMON_LOGGER("Restore Current Internet Setting\n"); - nn::Result result; - if (GetTempNetworkSetting()->isValid) - { - result = nn::ac::CTR::UpdateNetworkSetting(0, GetTempNetworkSetting()->setting); - COMMON_LOGGER_RESULT_IF_FAILED(result); - } - else - { - // 無効の場合は消去しておく - result = nn::ac::CTR::RemoveNetworkSetting(0); - COMMON_LOGGER_RESULT_IF_FAILED(result); - } - - result = nn::ac::FlushNetworkSetting(); - COMMON_LOGGER_RESULT_IF_FAILED(result); - - result = nn::ac::FinalizeInternal(); - COMMON_LOGGER_RESULT_IF_FAILED(result); -} - -} - -void NtpThreadFunc() -{ - // NTP時間を取得する - u32 ntpTime; - if (GetNtpTime(&ntpTime)) - { - // タイムゾーンを考慮してDateTimeに変換する - TimeZone timeZone = GetTimeZone(); - - // 1970/01/01 - nn::fnd::DateTime utc = nn::fnd::DateTime(1970, 1, 1, 0, 0, 0, 0); - nn::fnd::DateTime current = utc + nn::fnd::TimeSpan::FromSeconds(ntpTime); - - if (timeZone.isMinus) - { - current -= (nn::fnd::TimeSpan::FromHours(timeZone.hour) + nn::fnd::TimeSpan::FromMinutes(timeZone.minutes)); - } - else - { - current += nn::fnd::TimeSpan::FromHours(timeZone.hour) + nn::fnd::TimeSpan::FromMinutes(timeZone.minutes); - } - - // SWCを書き込む - nn::ptm::CTR::SetUserTime(current); - - COMMON_LOGGER("Set User Time %04d/%02d/%02d %02d:%02d:%02d\n", - current.GetYear(), current.GetMonth(), current.GetDay(), current.GetHour(), current.GetMinute(), current.GetSecond()); - - s_NtpSyncSuccessed = true; - } - else - { - COMMON_LOGGER("Failed Get Ntp Time\n"); - s_NtpSyncSuccessed = false; - } - - // インターネット設定を元に戻す - RestoreCurrentInternetSetting(); -} - -bool IsTimeAdjustFinished() -{ - // Initialize済みかつ終了 - return s_NtpThread.IsValid() && !s_NtpThread.IsAlive(); -} - -bool IsTimeAdjustSuccessed() -{ - return s_NtpSyncSuccessed; -} - -void AdjustTime() -{ - nn::Result result; - - result = nn::ac::CTR::InitializeInternal(); - COMMON_LOGGER_RESULT_IF_FAILED(result); - - if(IsTimeAdjustFinished()) - { - s_NtpThread.Join(); - s_NtpThread.Finalize(); - } - s_NtpThread.Start( NtpThreadFunc, s_NtpThreadStack); -} - -} diff --git a/branches/work/SD_AesCmac/ConsoleRestore/NtpClient.h b/branches/work/SD_AesCmac/ConsoleRestore/NtpClient.h deleted file mode 100644 index 7c7bcf1..0000000 --- a/branches/work/SD_AesCmac/ConsoleRestore/NtpClient.h +++ /dev/null @@ -1,28 +0,0 @@ -/*---------------------------------------------------------------------------* - Project: Horizon - File: NtpClient.h - - Copyright 2009 Nintendo. All rights reserved. - - These coded instructions, statements, and computer programs contain - proprietary information of Nintendo of America Inc. and/or Nintendo - Company Ltd., and are protected by Federal copyright law. They may - not be disclosed to third parties or copied or duplicated in any form, - in whole or in part, without the prior written consent of Nintendo. - - $Rev$ - *---------------------------------------------------------------------------*/ - -#ifndef NTPCLIENT_H_ -#define NTPCLIENT_H_ - -namespace ConsoleRestore -{ - -u32 AdjustTime(); -bool IsTimeAdjustFinished(); -bool IsTimeAdjustSuccessed(); - -} - -#endif /* NTPCLIENT_H_ */ diff --git a/branches/work/SD_AesCmac/ConsoleRestore/OMakefile b/branches/work/SD_AesCmac/ConsoleRestore/OMakefile deleted file mode 100644 index 90b2103..0000000 --- a/branches/work/SD_AesCmac/ConsoleRestore/OMakefile +++ /dev/null @@ -1,89 +0,0 @@ -#!/usr/bin/env omake -#---------------------------------------------------------------------------- -# Project: Horizon -# File: OMakefile -# -# Copyright (C)2009 Nintendo Co., Ltd. All rights reserved. -# -# These coded instructions, statements, and computer programs contain -# proprietary information of Nintendo of America Inc. and/or Nintendo -# Company Ltd., and are protected by Federal copyright law. They may -# not be disclosed to third parties or copied or duplicated in any form, -# in whole or in part, without the prior written consent of Nintendo. -# -# $Rev$ -#---------------------------------------------------------------------------- -SUPPORTED_TARGETS = CTR-T*.Process.MPCore.* -#MAKECSU = true -#INSTALL_SDK_TOOL = true -CTR_APPTYPE = BOTH -CTR_MAKE_DEVELOPMENT_IMAGE = true - -TARGET_PROGRAM = ConsoleRestore - -SAMPLED_DEMOS_COMMON_INCLUDE_DIR = $(dir $(HORIZON_ROOT)/../CTR/SampleDemos/common/include) -INCLUDES += $(SAMPLED_DEMOS_COMMON_INCLUDE_DIR) \ - ../common - -SOURCES[] = - ConsoleRestore.cpp - Controller.cpp - Importer.cpp - Updater.cpp - Ntpclient.cpp - ../common/HardwareInfo.cpp - ../common/DrawSystemState.cpp - ../common/FileTransfer.cpp - ../common/FileChecker.cpp - ../common/SdReaderWriter.cpp - ../common/HeapManager.cpp - ../common/SdLogger.cpp - ../common/wave.cpp - ../common/SimplePlayer.cpp - ../common/LogConsole.cpp - ../common/CommonLogger.cpp - ../common/SdMountManager.cpp - ../common/configLoader.cpp - ../common/PlayHistoryManager.cpp - ../common/VersionDetect.cpp - -CTR_BANNER_SPEC = $(TARGET_PROGRAM).bsf - -ROMFS_ROOT = ../common/romfiles - -LIBS += libnn_cfg \ - libnn_driversEeprom \ - libnn_driversi2c \ - libnn_driversCal \ - libnn_crypto \ - libnn_driversCodec \ - libnn_spi \ - libnn_gpio \ - libnn_pdn \ - libnn_mcu \ - libnn_i2c \ - libnn_driversCamera \ - libnn_ps \ - libnn_driversRsa \ - lib_demo \ - libnn_nwm \ - libnn_friends \ - libnn_ns \ - libnn_am \ - libnn_nim \ - -INSTALL_SDK_TOOL = true - -ROM_SPEC_FILE = $(TARGET_PROGRAM).rsf -DESCRIPTOR = $(HORIZON_ROOT)/resources/specfiles/_private/RepairTool.desc - -include $(ROOT_OMAKE)/modulerules - -VERSION_H = $(file version.h) - -$(VERSION_H): $(SOURCES) - section - bash genversion.sh - -RequireSetup($(VERSION_H)) -build: version.h $(DEFAULT_TARGETS) diff --git a/branches/work/SD_AesCmac/ConsoleRestore/Updater.cpp b/branches/work/SD_AesCmac/ConsoleRestore/Updater.cpp deleted file mode 100644 index 5985375..0000000 --- a/branches/work/SD_AesCmac/ConsoleRestore/Updater.cpp +++ /dev/null @@ -1,249 +0,0 @@ -/*---------------------------------------------------------------------------* - Project: Horizon - File: Updater.cpp - - Copyright 2009 Nintendo. All rights reserved. - - These coded instructions, statements, and computer programs contain - proprietary information of Nintendo of America Inc. and/or Nintendo - Company Ltd., and are protected by Federal copyright law. They may - not be disclosed to third parties or copied or duplicated in any form, - in whole or in part, without the prior written consent of Nintendo. - - $Rev$ - *---------------------------------------------------------------------------*/ - -#include -#include -#include -#include -#include -#include -#include -#include - -#include "CommonLogger.h" - -namespace ConsoleRestore -{ - -using namespace ES_NAMESPACE; -using namespace EC_NAMESPACE; - -/* ------------------------------------------------------------------- - GetCustomerSupportCode --------------------------------------------------------------------- */ -#define NIM_UPDATER_RESULT_CHECK(result) \ -do { \ - if (result.IsFailure()) \ - { \ - ECCustomerSupportCode csc; \ - NN_UTIL_PANIC_IF_FAILED( \ - nn::nim::Updater::GetCustomerSupportCode(&csc)); \ - COMMON_LOGGER("CSCode: %d\n", csc); \ - nn::dbg::PrintResult(result); \ - s_Result = result; \ - goto LABEL_FINALIZE; \ - } \ -} while(0) - -namespace -{ - -nn::Result s_Result = nn::ResultSuccess(); - -const size_t UPDATER_THREAD_STACK_SIZE = 0x1000; -nn::os::Thread s_UpdaterThread; -nn::os::StackBuffer s_UpdaterThreadStack; - -u64 s_Progress = 0; - -} - -nn::Result PrintNetworkSetting() -{ - nn::ac::NetworkSetting networkSetting; - NN_UTIL_RETURN_IF_FAILED(nn::ac::LoadNetworkSetting(0, networkSetting)); - COMMON_LOGGER("SSID: %s\n", networkSetting.wireless.essidSecurity.ssid); - COMMON_LOGGER("DNS : %d.%d.%d.%d\n", - networkSetting.ip.dns[0][0], networkSetting.ip.dns[0][1], - networkSetting.ip.dns[0][2], networkSetting.ip.dns[0][3]); - return nn::ResultSuccess(); -} - - -nn::Result ConnectNetwork() -{ - nn::Result result = nn::ResultSuccess(); - nn::ac::Config config; - - result = nn::ac::CreateDefaultConfig(&config); - NN_UTIL_RETURN_IF_FAILED(result); - - result = nn::ac::ConnectWithoutEula(config); - NN_UTIL_RETURN_IF_FAILED(result); - - NN_LOG("Success nn::ac::ConnectWithoutEula\n"); - - NN_UTIL_RETURN_IF_FAILED(PrintNetworkSetting()); - - return nn::ResultSuccess(); -} - -nn::Result InitializeInternal() -{ - nn::Result result = nn::ResultSuccess(); - - result = nn::ac::InitializeInternal(); - NN_UTIL_RETURN_IF_FAILED(result); - - result = ConnectNetwork(); - NN_UTIL_RETURN_IF_FAILED(result); - - return nn::ResultSuccess(); -} - -nn::Result FinalizeInternal() -{ - nn::Result result = nn::ResultSuccess(); - - nn::ac::CloseAll(); - - result = nn::ac::FinalizeInternal(); - NN_UTIL_RETURN_IF_FAILED(result); - - return nn::ResultSuccess(); -} - -void UpdateThreadFunc() -{ - nn::Result result; - - NN_LOG("********************UpdateThreadFunc Start********************\n"); - nn::cfg::CTR::init::Initialize(); - nn::cfg::CfgCountryCode country; - nn::cfg::CfgRegionCode region; - const char *regionStr; - const char *countryStr; - NN_UNUSED_VAR(regionStr); - NN_UNUSED_VAR(countryStr); - - country = nn::cfg::GetCountry(); - region = nn::cfg::GetRegion(); - countryStr = nn::cfg::GetCountryCodeA2(country); - regionStr = nn::cfg::GetRegionCodeA3(region); - - COMMON_LOGGER("[Updater] country:%2d:%s\n", country, countryStr); - COMMON_LOGGER("[Updater] region :%2d:%s\n", region, regionStr); - - /* ------------------------------------------------------------------- - Initialize - -------------------------------------------------------------------- */ - NN_LOG("[Updater] nn::nim::InitializeForUpdater\n"); - result = nn::nim::InitializeForUpdater(); - NIM_UPDATER_RESULT_CHECK(result); - - NN_LOG("[Updater] InitializeInternal\n"); - result = InitializeInternal(); - NIM_UPDATER_RESULT_CHECK(result); - - - /* ------------------------------------------------------------------- - StartNetworkUpdate - -------------------------------------------------------------------- */ - NN_LOG("[Updater] nn::nim::Updater::StartNetworkUpdate()\n"); - result = nn::nim::Updater::StartNetworkUpdate(); - NIM_UPDATER_RESULT_CHECK(result); - - /* ------------------------------------------------------------------- - GetProgress - -------------------------------------------------------------------- */ - NN_LOG("[Updater] nn::nim::Updater::GetProgress()\n"); - - while(true) - { - nn::nim::NetworkUpdateProgress progress; - NIM_UPDATER_RESULT_CHECK(nn::nim::Updater::GetProgress(&progress)); - NIM_UPDATER_RESULT_CHECK(progress.lastResult); - NN_LOG("\x1b[1A\x1b[K"); - NN_LOG("Downloading %2lld/%2lld %8lld/%8lld (%d)\n", - progress.downloadedTitleNum, - progress.totalTitleNum, - progress.currentDownloadedSize, - progress.currentTotalSize, - progress.state); - - // ゼロ除算を防ぐ - if(progress.totalTitleNum == 0) - { - progress.totalTitleNum++; - progress.downloadedTitleNum++; - } - if(progress.state > nn::nim::CTR::NUP_STATE_CHECKING) - { - s_Progress = progress.downloadedTitleNum * 100 / progress.totalTitleNum; - } - - if (progress.state == nn::nim::NUP_STATE_NO_NEED) - { - COMMON_LOGGER("[Updater] No need to NetworkUpdate\n"); - s_Progress = 100; - break; - } - if (progress.state == nn::nim::NUP_STATE_FINISHED) - { - COMMON_LOGGER("[Updater] Finished NetworkUpdate\n"); - s_Progress = 100; - break; - } - - nn::os::Thread::Sleep(nn::fnd::TimeSpan::FromMilliSeconds(300)); - } - - LABEL_FINALIZE: - - /* ------------------------------------------------------------------- - Finalize - -------------------------------------------------------------------- */ - NN_LOG("[Updater] nn::nim::FinalizeForUpdater\n"); - result = nn::nim::FinalizeForUpdater(); - NIM_UPDATER_RESULT_CHECK(result); - - result = FinalizeInternal(); - NIM_UPDATER_RESULT_CHECK(result); - - NN_LOG("[Updater] Finish nim Updater demo.\n"); - -} - -void StartFGNetworkUpdate() -{ - NN_LOG("Start FGNetworkUpdate\n"); - s_Result = nn::ResultSuccess(); - s_UpdaterThread.Start(UpdateThreadFunc, s_UpdaterThreadStack); -} - -void FinishFGNetworkUpdate() -{ - NN_LOG("Finalize FGNetworkUpdate\n"); - s_UpdaterThread.Join(); - s_UpdaterThread.Finalize(); -} - -bool IsNetworkUpdateFinished() -{ - return !s_UpdaterThread.IsAlive(); -} - -u32 GetUpdateProgress() -{ - return s_Progress; -} - -nn::Result GetUpdateResult() -{ - return s_Result; -} - - -} diff --git a/branches/work/SD_AesCmac/ConsoleRestore/Updater.h b/branches/work/SD_AesCmac/ConsoleRestore/Updater.h deleted file mode 100644 index 32e6798..0000000 --- a/branches/work/SD_AesCmac/ConsoleRestore/Updater.h +++ /dev/null @@ -1,32 +0,0 @@ -/*---------------------------------------------------------------------------* - Project: Horizon - File: Updater.h - - Copyright 2009 Nintendo. All rights reserved. - - These coded instructions, statements, and computer programs contain - proprietary information of Nintendo of America Inc. and/or Nintendo - Company Ltd., and are protected by Federal copyright law. They may - not be disclosed to third parties or copied or duplicated in any form, - in whole or in part, without the prior written consent of Nintendo. - - $Rev$ - *---------------------------------------------------------------------------*/ - -#ifndef UPDATER_H_ -#define UPDATER_H_ - -#include - -namespace ConsoleRestore -{ - -void StartFGNetworkUpdate(); -void FinishFGNetworkUpdate(); -bool IsNetworkUpdateFinished(); -u32 GetUpdateProgress(); -nn::Result GetUpdateResult(); - -} - -#endif /* UPDATER_H_ */ diff --git a/branches/work/SD_AesCmac/ConsoleRestore/banner/model.cbmd b/branches/work/SD_AesCmac/ConsoleRestore/banner/model.cbmd deleted file mode 100644 index f1c7b6279e13f5278c419d615d7d03d5660005e5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 198785 zcmeF42b>f|^Y>?tBj+52Lvj*CGTiPSIf@`b5d(;Tf(Ze$9AX9&AYw*DP{DvG5@dG? zCW45fsF($_Vj>uMzrWt;z2=1T`M>%^cKB3HRZVrJ?&+D^yDd6(>w3ce-^+O%>5~iP z^Lz-wSRg-eOThog`A~=S&7fQgl9w|Vb6v>AcJ9$>Kx1T5-Ou3;x!mab-l8AVJjEbg z8=G{~%=HB7V@~4;!z>l7rW_%qgu1)C5`pM`%`%&JyO# zod2O8am46T4BK;p*Pj8~zjF{|tdJX=a8pLR9rF)yOYfnJ@N$fq8$F9`qOf*N3MpRoWmbfe^}1-Y$?3Qy`}Y|db@L=YdSOscXQVD+-t0> z6qvO#*c=a)SYrjeV({88+W@j&3ZA9wwFUAqC*|N@39f67D#3pX-wsH}Q#JTfOt!`s z;I7GlZw9aN1-V`u{^pMdVmf1)pc zR=)$fbN)nM(OUfsbjSUPzUId2r=#2XPxR9r{m)}VhPeW19 ztcT&Rf}aYnXV#1G^WbkVe7g53{5trNni#LBSAhI?z>kG5hW*;`=_Db0g}lOEC-~a% zvR8x%hQW7+m%Sofp9DVwegxx-GvXfjtKi2Nd-=ST@blnhueevjdmDZoyzG_4|33H~ z@UmBu>lIkL=@f7R<9+WauLXQ<_{-tbyr$j&_|EXMSH>&rO@JQ(FMH*v$Zhaf!OLDb zu0IVw5B@yHSMh3iufwl{zX-mnm*MS(-vKXs6}?Jc1@^0SCP?-wd*!`W@U`J(uQJyM z!FPr~i}7XHMJK|KfFB268jG{wuY#AoYTgmvGw}1^Wv@CBY=d71FMHLwz88K6yzEu< zYI+rUcBdCk*sDN%t>J6K%U(_INbdyr&hWBVi+nDE9|13WwYWYT{wnzMu~*(};4Oon z2Y)eq1+Ss^Cj2^h*{kc-^L~Qg0WW*?S=E(!pGYr~uvee!ZQ*OftA2I8M&60=o#9o# zI@r4yegwSiHR7pxC;V0LveyLvE8yqB-(dL0-rMl&;8m~MJPCh>-vNJ#vDd<@vK#+J z6ZV>UM|(S^dGfA=p9in_T6(R# zci`8-Pla!d|6k#Ez{_51u2%8+O>U;Jd@iUOTV7cL)4f zc-iZK#tZPbz{_3-uJ49_3jP|#m-fP5t-Wd9oA5WmXL=#83;eI})6frl5pOhnM)8Eb zEHrL_?+h<{SzKQPKN`LQ8%A56>@UMlgRc(X(d*=;?c_4N5el0e>da1d&hb=!hZn&nBn_)OW@N>ChQ&S_4VF{uMaPK$KlWWInC=0FMG#v zy)OKD@KMJ1@s9U;!_S0&9=;zlGy#4Yyy83F8{pjs{|>zD4MgKbc(w&&Zy?vdgRc$G zQKPa`|G{=71pV?-|fQ{lVjp&xeibw9R;uaJj+)m-`&;6LG= zES^0d<>V{--@z}V|*_CbKwW&q2JfhFHStY;Opk0 z-zb-UUHCn`BOWTA0=e{k_~-M`|M0_{`Y4`x@Uzg*COfyDyb_z^s$BY$;78`6f2yOe z{rM#LR(a^R&!yiAzCa%O6>{m9hJS;1_-vv*Sp468kdv?Cc?y0$`nTlL=M~%>Gjr+R z46mOt4yAvtqp#=J82GMv==aK{-xa<>9{P22>DPq+grAuX6_1}wf8G16fAr^&om-zG ziFCbrT(|E_ivK?NYx2;a%OMei2-8}SL<*A zcDcs1Wz5mY^tsBRVk>>%n2b)0dF9&^@f@u;$mke?WRqa9u|r%gAEP0%S|` z7;|l|F%ia0LUv^yV@}OACd8OQ$d1ipOsiaDIxwaQvMPCuDSqIX^mdHd_zu4-;Ikj) zZ`ZwOdo1F5z^5OJ{sQl^*ix_hXvg`906UsH_F~+n+HZYGd<#UaBf-zg) zO7m(mM!#Qh*Fhq4_CKz>HF%ma3z2>O<)Oz+%{68vW2PWmp2wKebB&2JW(cyY^BB`E z*O=!Rb2PGkd5kH2;28h-z8!lizZQ&f53PZrJNTWYT?{M>t6Rv?wR>f=L+HLkO!lx; z`XO{RANH{O@0%YVJcg?rU9DY>TyzNC6C7QwW!cU?gl=O;SMThyJwUqqAreQSJ_Gu8 zgv>vCTTZ;T4p!;Fvwna0=P+{Q$b_l z-})W;u**Ufh_GX*rddG2#Dd9J*SBxPt_^D7?_ec`vq9EGvax%bR=EzwXBu&x*e>ZLNNt=Z)W&zxY!n{O9(i`6ITp{dT)#9N9vhfzw2A+?03< z?4Ru2mo2`)k-~W&`u$$I=Vc5y!Q3C|AMn|WJzjq;NoV_YnSJ2EBRlLjKn^&^{({%s zZ~}Q{AK$%mf8^=Y9GjCJI%iCFIO!=zXsC?=-@HV#5^=9@w%9^Jp1~!rMu{3FUJR}U zvgG>IwO8`E_GTW}zRly>zJpxTdr5lYKG^>oziHC(fp$3xyw*Q3L%r+fK2XyUx$V_7 zZxo*i1xIr4`V_f6v~KKvYh^iSt<67&)ZUfayAE74{Ejt8V5tA5y{k5#3)!Rg<|O@> z_O4g>?8P3>Ikc7OKFiU_k%~GT_pY}#@vi+rvLea7tM$uCnc2OycOCqZ_-Fgpfi?bj zaQ40HAN6hXR0SerEj|ly-@B|%j!o*2eD9h#F_0&pYpM6HoJu90b$@;Ds{O^B&-LE* z@gpDHCF^=GTVCUWbM@Xe*Z+P~;4xe0&cJCRIR1|JuF=8gJF+)^eez!UOM6#2$7W%N zmXE~2`-=}WKh@uw+>^YXtCRF!+Ml-OeE#LV zygs*jH^%Rpg3qY9A4}QaJxp^xw^9jK*I&}|;sRg9 z=d8W02pt8=CHU z%lO;Sa+MQL2m5NYTPYiWMzZylAl!#Y>bdUZPaVQl(3lDpR^l+0tdol`U7kY`F^M zD^x6Bp;E<4l`B@NQn^ai%2ldWt#(A!YSoXZUgL=B88tF$*2p-r=8?5(9$C9q?K-t; z*R4~xUY)x2>(y^iuYSV@4I4FR*tk*SCXE^&)#RwAO^)L4lGB=|R7Kqrv{xnHE7hiQJ2n*nsjN>wM&zxU7L36+BB_OTC;A=j_!VRkM2h| z@6o(xkLJhpJf>IAV_NiT(YsfRmc3i{>D{tbpH|2AY1R7J)_sp{-KKAw_&bwbvO zCuDUzvEz^vJ9Zk<>7*f@I-k^e=t-Ts4DE9A&@Nq1?t03}UAvvq?bK7cH9NIg_fxy~ zIIYL9(|YtA)^qrMr-lz8-aeD7QBl?^%qR+8s96R!iWBZQmJ8ER#<3=4f zdem|KM)x~&bie**_CM>){>Ptn{Ft+jA24RX*f9eJjvaXR*nxx29(2yxg9e{7_}p^_ zpK$I8=bd}PiRYbo{&^=3Ie*Bw^M{-??xYLGoiy}g;o_KIfXN&pG#+bFaPT-1DwI@49QxJO8@#ufOj6ao3N#;rekG+;G9v8!i|>b^Nrc z<0nj;aO1QI6K|Y&(~T1^yy?Q5Z@Tcbn@_vw=38!^e(Q|sx6Yg~^R^i?XWcgI_S@9T+%SGr(;D(Zq2&q*F5*an&)3!^TJDOUR=NCr44J=Z(Ors)0&Mh zui3PD&C9Q>*}P@VE3dBE^4gkLx2}2Z^)*}HSo8X}HE+DRX4_k9-dwxpEp~#4-38EE*raL%-*o*if`Q%+qChz$i_>GuC93B^w`Wk z6AWE%PVxBI^z}xEbF4(q?ncfz&KM)dMhrb8XI#AU$7PKiKXGh@WfR+R`A+yMVQ9(g z&ABnII3y4BV^&`=NgmjbOD_A0L-HUVBUe1qOW40j@f*3~mtDz;OF0_3a;*4P2_sir zibM8ATYcgRJNjYAe%P@eapDOp4%tziocP0vBZxnuI1~?lB8o$D)n2|6@s}{PrNfQ8ZWu*U0f?Y>xrsA$2I4%@4kwN);fA`;%Y;47H?>-OV7}ZTRpe? zi!BrSg}670$3;u7@uIh)ukoUF7N5|+&ghBOxJ?@itro3#rZ7H`M;!f#V<+O+k2rp_ zG(KU!P?i&CmW>~KvJ;Vx&f*jL*G2Ga>wx`2hL*j>A7*52s=hP6`kcn`TA@;gzVD{_ z@$%EYj7ZKo4sYm6p;D{SGc@B?r^jAtDV-Z`sw;V1wB#Bu8hfiX-r5l_TGyo~TH`cc zbP$h~M;!f#V<+O+&vN{l`p6FUB)4&9+4z;8lb7sg1@T0jIz%+y#?$`&c3D%JZjA5f z(LKIsYCS`1u2e(G*D$xLwP>!Jds{T)R#$3Uu$AbSCT6YHcq`Xu zT6>tri&lLcdBoAzoLW0sj{Pi+*I4DD@uIOOdBn<{_*qMdymWT*jcB~|HBRG2%bu0z zuFqFZn`M=XEQ$AdqeHyj-XjcMYt+&M>UPf0o{@7tpoZv0G?sA()Dv4qj_m_#`{4Pn zwUmCFQLPTBvwTY~eWxa?6^FI&)NQrmkX&b{wk8hAHO{HOu`9X!xO1d9BoFFi=0$Z= z9D)7;bJv_a1N#Te<3%~~95AOge#RXzzfQgf%(dc>ed0P`-ko~NzF7~Nb6bDech>{) zWXX=s?%I%^jo+?^AYUVwA9u|t4(Tf{9V17UTCKCYPQ=GLC3M`ickbNza_7jM7ss!e3)xrRPMinS*{!WxPbc?CuDV5h6^SFS z_sjg#uFo7bY*Or-F*BYWJ8z<)e>|has!(c7>)*I})lb8E z7@cy%d#pNs%myRxI%dPFh9gTD`J3}5u6py0n~j`tt7?s%(Lwf)ns)svY#I5UT}7gb zOY+tuZ!$l(%l?~hl#HVPtmI|Ue+J)@6H65Pt0b3w#UZ)u6OWPiOvGd4=MWFM7EG4#h)UA*Y_w&y-wqW$V8xVc*D!OYvmN&WPbX zG8KpPb+&Wuk23Kax#Hh9HL)I+jhWFwaY$eDrZ}AX7`fsav+MZK*TpZ1eOUMORqfJ4 zhMs-q_Ek&jR5di`D14@L_T~#k(K9sT%o>n<;F%{ypJ%*i$u(Xy_M#duT4#+Ht?SYg zt#KMJI*7;6@}u#Aex_q5WbI=w_3;*@?! za_q^Dp>-CY&@Ugdbx?l9W8{iw(8v{`x2vBWoBZMntIF3{VCY+ZibOk&zs}H{qwt32 zdi2B>`K%9p#+mwvzU8NQG{kt(Es$%xXzABvylB}GpU{s)r6(GDt2AD;;<55x_;K_@ z)(+>8V?U(v8p}9SpM?E*NaL;CiC=a?k}JO-sweXeX}shbM?8jBJg0rJIaIXU=vbdO z-&=L*nJWzaOL%bfoEEbU%{dBhXs$ZUbMz(yyzevE6>#UKtJTz30eD!*YRuWlhEHLxs6l$A<3oRJ14IY_KjTEZ5=d@ zc#K@}%-q)|{OZmI;RTVd(H7h47`niuSoBcxX`>5Vp5!e{Um)UaY(MSOV=U}$u-WU$tx!N^5fEqLvqFC z(uyO{54p7B2<(SkT6GEHF*UNZ;*cG5O-z<{@-;C@jvo_;=!%oV2hdIprEhC1n}!bT zCuwRDwlTOgH8FCHb7}dOU)gqPYGUL;eUh|zK6f*7Smcos%k&xCt%K*aPSJVSfucq9 zyAK_DzfAnrEIa%PU!rh7ztr!FQ;@1bY7L~;z`tV+{E$&Iy!qCt9oVkI8=768S*$~i zaFZRaGTROA5H7uQW#$D}4hgr|Q$93r;K1t^b@YXpzud+iUr;H9y?RRbH!Urx5 zSB$-d=u4jidUa@JsV!sOeM-jX1FD6I%*t27$$?*^#`I+j`qN+xptN+IreL+WNV5(->PPTOV5&TMt_Yo4?K5=4&NQF^Slt`b zfI?t(R!jqmfQxuV!9}TVqRT>>>62KJ6<6FVNzb@a;4+*`(#^08SX~WE(%Y{bxB};r z^bM>4uEe>d=~1XYij|?O(2uYha0K`Wx(!wXYJh8yNj0D*SUm-+0ad`Y=*U+Gs0*%( ztPW5UToc_oKs|6hx&+n%YJnTj|F03y*mVAD0&YTwzD7V(a8r6jH3E(XAB}D!uQ~np zS^zD<>c!UrXbo(%8q()Zo%h;-)p4&4piX-o=#JM0Xaa76 zZX5d7RrSI^6>t?|4+9Z!1l_Rd#usL6JLq=khRLxu-}R{Nbp)$-UKY?9+!@_0AOenH zBMYbt?n3Ncf#%@m`0NT~f-}+W3Umf{#zt453%D(@cLN%L8&HF8KzDF=I_Y&Y-SoQA zF|QqTJ9N7-M^(LEKnNT{)(hwf?ul+Mpf|WTbJzd#Fcdu8JDu;eo$j3h zKEoRc9_ft&k3x3@Fbq5l8zX?>;L+Zh-dVsH@ECla1q=ZXLH8_R6nGRi&H_e*PbHSI zz}euly>r0lc;|x8rJK=M;C%4;*d7a<3LfWOK%d?Vyb0h5-bC<3??Ui}=#B@@1)qzJ z@xVCnMc&2UCBUWNOTEj$mwA_iFGu$h;6m_)*ti6^2z&*(P6CF5hvRb+a6b5abSD9q zgD=O%B;X401Y*esCW9w?SAwtfrhuo=u{j&K8hkajvw;cVYrJc{>wxRQ*VFOvI$$bz zD!SJJQ@~TOaUF0Cc$#-3-;cS`yBT~l9er*BZUx_p?oGf{@KkKv1WW@@C)XLkMc|9@ zIRm&Fd^Nf=fLp=0Vq*p{9eh2p%mi)&-$wW2nZWJf+r8P~+1?%CJFqpH0JsKx4K;fJmdND5!tOl?4)_~V|Yr$*LjRPydE3gpunxT5+ralmH+Y-CoA9|2cozIDx*LI)z%OBABd{L4npj>2 zHiI|Q(feg!3wVq7D)?3JHSlZLei>K|-s-*Xy#Z_kZ}Z*+zv;aNehb|1wf{3*6S0=9ua^FH^!0KNo&>3s$M%KIAp zHM(B_JHb1#@dfZ1_#1B*@7KG$@4(-A--EyRegOY~?zh0#;IFaqE$|KaM{?Z_ybXRE zpSyui!JneL8~6eI12%R8KZ3s`mOa2;@Lq2pc%SzZ_$TjY@Xy{a;9s!42lx{FD{JjH z;A!yF%VlC_kJbypngMI$Wc)yqC|BU=+#_b1Ifmfls zpLhIS^dQ(pF6sU^_)Pb|!hgE|3%coy;m?y9?}L3mA9ydZ=l4ISR{8zUs9Ao0hgZPQ z?-%e3f(!bEz=iyM$oG+7e*a_Us<8h$YooBgl{He>f5j`}7xs&wTNo$+E`W`~z{lXt ztj(f+jC-M|ALX7X>M!?-`9=L==oSTvfQw+GD6kp4jM^0Umy&yN|5s{I9KVJ9;>1u8 zT##|af#t}TbH5hnD~TJt62N-!dhUr5{)=8ozl2}XF9j~;mj;(6*AjpSeu1@F#($2r zSH}Nw;WIw zToxPUfOo;)vDPY3|9pN0>g$7j{8s=t;AxE5S(;7D*CxVk`Xa6P#CKwWTUEH?lef~&zb0vdp;!!-sP zfivKm0FA*%!W{)P0oR6W3LFKl3)c*23a$@#G|&v(0L#sRW5A8zS^&+#jp14XEx=9S zS^+J=N5QoQT7jFwwE9{?WU4+IZHx353QAMBq1 zoCrSA9|9iYp9DS$-4lTR;QrV+0T=`x>YwbN0-Opy)jthh zc({MMKLR)ddaB`0}sQ-2w*t)L}D2Ui~^7HM}tTEXM)f4&jO$2j{%Rt z_DJAF@L2zB{~X|4@VWkZ;Pd?R!RMoU4sa&;Ol+J3j0KPLFYw0$6TlPviQtL;h2RU( z9S@ujJ|7$7fpOrA$n|1iD0nD7F9ybd$Dn&La3T0YY+MXn1U{EoE&(nDU+P~5zRbTI ze7S!G_zHg#coMcR0nP=lzQLago{H{uz}4WZv2h)64R{*4-Uy5XkHhDUz$EY_bZ-Qvf~R8RMqnCv3bEV- z+zh_izXg1Ye=GP_e>!-&KLb1i+cyDIz%yBEw*h^?eVE(ZfLY*K=-vk03ceK^w*fQ3 zXRsD-2WEq3`*(ov@b3iQiSF&dEbuIB+zy-pzKdM%2Ce~LgU`Ex8Q>Y{-VNLdz7rdF z19yRMCiZ)PY;ZO;y9c-ze6N2W_&$FQcn-1L1KbS0l)1Ve7z-ZD8o3{s3!aPa{lLB8 zd$Dmpa4C2cYx4nM5O@&x!~?)Q@H})M0Oo?{V&ef|6!bNDbG`_86#OWc~0^fzt$AE{y z52O1S@F@6EY&-^B4}RQ#!e0zL34YRF0$$=j1%AqZ8vL}s6ui`b2K)@Vi~VK(a(@M| z61>uX7W}Ng3cL#46~I&Ar?9aCSO$*zF+UEh2Cw$lfYUP&x30xyAI^4Ejc`y0R;{Egs^{wDAyY`+Ms z1i$QW_FnO zz^`HB4PYzyZF1cXM8Q#fZU;7jH=(;7cnka%HnszAgSQaNJHWf(cm4Ok@A>b8-}gTN zf8c)z{t(;m09(Kx`5*f`fSur-{wLs1{7=E3qPqilAN)Qxb^srNKl4BLzW}}jf9Zb( z{>uLv{585?0H11 z?}&Xr@DcbUYPKKn()e%V(tNO=mIh8s`yToC=$ zrK6t@@W5W$d&u8IH(%OItj+vs%efcwr!C{2$e*^vFOZf$tpK|Dfpl;>Hu3{6fuE!{ z1=F4&_kwAA@L3SwX=w$C!w36}D+nw>zJ&X=VA{{rrcl~*+zW-$)^Sf1N?YR>PAimF zIIRe{NLo>F(X?NX|3du=rLAUd7E6n<_KKyw%^ED0_NHGvtyo%dbc+Fn!G*C=3|I}` z##$(m_BwN2BJCUIyhPepe#x{FX(iDu0Tc%p$3_WY8~96VUn=c$YFjGpH)>o8zeUqZ z5knDh5yq7QzC!*L>#pV3X4V- z*VvIG_e6BokE(=VY-s5^a=yot)Q{*|U`PI}FZqiEcF=EZXz4mSaYrX+ z?dYr{u=y{I?b#)R!g~kT3V-(2R({vHEc`|KP;)L4Jv03D{KerpYYRnm?e|72jZWm3 z55wPdEF01Jq)RU~^ukZeL=?Z|PRubU=D3rWsdEs6p@Z1sPRwy9m$-ZcImVoLq}S8O$Q*9&Q!>Zu%MTfP*VVo?lLhAeF_T1WjWyGIig|L+uX*>lE*9h+u+pd)!K z@MUTq_|hE29A7c(OYz%yoUt*@z2-$S&4Fs77&OPC6`SO$r)Wpt%zdD*H53o*NFKLx z>=-(*6L;)befhQeu_|l)(9LUBMQ&bme|T?!Q$x3HjYclIhp&!|`udUZ zwg<99OQWle&hay@3vJr?T;#&&1L5VrRy6eczddSVmE8Myv7z5BwmM?vvpTIZ`m(d* z?U$0i@;|pR>FeWG>y0nPQ)JsFqoW+s2fb{@ie5Esy|IZ-)anp()Ugw_cJLLozKA*M z#B6BACLNoX>^QkcZSL}A>!X^)YrYcsK5K@liDKBZ<<_ujqB!roW3s8qdpln-v|_IN z{+1*y`AK)oOpbkY&2Uq5#Xs@6ki5 z$JQaR6Sa1fqvDh=)xn7~YU8vz%7q-wSmmgERnIe~HZw7+p7Leafa0-hVBlE|lWSn$ zoFfgb`H~#_X8ic9UIis*i=2W9;Bl+ zAiweztR=I?g0&QNd_}D<9z*p4qWom2n9bZNs#9+oMW@}$^t%tR{Z;u>5 z^lNjEyjbv#$Y*6gH*50s+wO`qx^|DL^XK2)WpuPA^>-GZ4Blndr0BV~|72<|dfjEe z8M;*DuB7~>iMJbl%~!<|^OC;W?3*6j}i9*Hd7{+_9cVi-B*U2~r* z&cerRGBqh(d7+^d^N=!&lC;Lkssk!36qW@x3bJ<^f!%8zRvR}4HV$YZT z>=Fx2ZDr@~V^)~^)auwe1a_jZy3_ z8c;mim(0AsJSVvZ9{BujLui9CXwfc@PBM)LQV->Tt zFS+NVq48bch-_Fs*3h-?KRL2#!UCi7 zQGpSWE#W7O{M2F}hF>eY)W{c2{WQF}N6g6gPg>vV%l#{i{DKo+X*G1nIwLPy?8BJV zKXK}(u^oZ_PjgO=Tl>ojjEGzNU+%v@J~xQ7@}u+PM+dPD?(|ChwjkzHyS@?M9mMIx zA9do7Ix$C`IHOK%Q74|L6GPPT8+Ck9*JKT&P7R|@t)fnSqE1bsP9367?olV-sFP## z)&BQHKEM20)iByOvOZFz^l^r6*M4y1rG@tz`ivXj4sUyRk)fw8Sl8<22NxT<^o?)F zth`kF!SVM3{Z;+%iT@thY!_J{ZxPsZe1#leA;(w9@fC7>g&bcY$5+Vl6>@xqW)*%r za`hdph%+PnY5xx+OMhq|88V`1c*(A}BQ;iZkKFyhv8>e{ktx^oG&<*J?&N$*Bx_m2 zaKq=f8@kq>lfy$l*=*<|&pqGJLyC8cB<0mx7=78PQ1$|2N4~y)H9P6+lK00OUy7$l z_7tNdn(WIR!@2-njJDWDHO!^vnv+jdL%nuaMeQ=7g zBORNU?AY98$L20ywmz!KtL?6jG`Q`FkaAI+uQi_=QcV=6_CM9+=sHskt(d#cyfH~j zzU`M)?%1ePhnQnO>eM0T)WOh!ov2fXm{W(C;t%5FooJa| zwRW62jXCokbLO4Tppt9DjI}u`-#xV&X@1#Tc9?l*exoK|;$eEt{I>2}FFB{h&p$Fr zOV0edV@(YMn<33(pkwN6<%&mZOl!%+9Qabq)|aCb)g0M4-&ygwS*wb<-h=cMq5g`Y zU%77#O~{_)s-bA`~Ku_L+lCH=sc z(YL-FdDO8Jb?is)ZLlG3@4Ma~tc}}yb8@HkaeHqba}0exf_-W2?pRzgXkRLP_DhD= z{xS08B--vvMjq@-vSarp`Lg?xdj z5BeZ!XXMDwlfJe+@I^A_TN{6vj9EH1FWIrV%Z|-mzHEIIr`?y7i`|!06MMg_CiZ?; z%ywTAZTBT-Y}Bbk%&~9gC8$Hpse_^IzU0&)=F}mk`0c)=9D_Kcs)LPFb+BYXtiyzzU|*6QyDvF&Ve+;6k~3d1 zXHH|zyvLk*H#)&OG_|t(lJd3pyYdb83f`Al^TA%BeC=ML*zCR}+U`rvSW`p0|2R6P z&Q`9N?Y?AU4tyzQ>&wxJDqkDt;EPt8wW@ul_)W{r+Sb1GQT1mGtvyF_yH`lx?n{!} zy~2@)96KS$eyC&3UDj9V#-iU@U!i9%`61~`a_dX_c3+a*`f}t^$4=C-&))7ud(w>f;inxTAR3%Q$aog&$mX3Yap+p3pGL&2o^%Akm}qb) z@)Z^YcI3m*fm=@5K`fH|=g>dReKhn~&xSD|+-g%2A8XUB*FeY4oAD`K ztAD5(I6BFkg50zYj7)Q^xlm4;W7SO&YK|3`Xswk%Kji4!7-dKDSYRiFotR_Ck+l`ri8*$nK|ER?F~wtT z>nvU%9|wyuQ48UmeNsM^gEKZNe*tKIOzfQPyqFkm>^6_Uj&u~8(Fx+0E!i=#>&$f% zyL2^PvC5u1KaNgv&J~LV>R@ds_M{EjQ$DgsOs2-7?LDSzk}Jj_R#V>~R+DcKtDP(9 z+PRV+LkF?ixiUJ|hRxU7(Rl02jt}Cr_m&xtj>$#il&5lZ&dIt4b<-NOvHZvGCt4S( zzUp<5b!YO|npU35J6K0%{v5fv#{xUa_2||{w4Lw7{O3G-B~SP_dzYPKqo2?{K&}{U zUA1PVulca+->e_El2eTiW{chC8=K8&T-0x8vr{ceX_=zp1_+L!KA9Z4mIdPhMKZq@6 z<01E$6GP1Ul}*Q&c@8Dw$a!wqcZR=PPF_*+iUoN^$t%XZC@Lay&KrQR`t<4gJe337pQ*0v&+nbo`0$5W8!`cYN2OVvX0Ig(>t1d2h%gn zyho#J_5{5P*!KbKnD;wpF7*DNgw*pf@vdvvo$BR2SM2+g_6fUwRkJ{zdT$TzW35x? zebxSqVD9-~eVTh-bv)QTAFNNK6Rb~TFIb<(j@GxeW!JZCCFU&g4jt&2pBBy~XSus$(!W`q|N}Yu32gPb9bR2D&D>=G*Qm!MvM2MYdII*$?JQx~Y9B z=d%m5AFHCOi(Rj_X2ChRUbW9i_kUquB8^D8lHt(rJoLp6?X}mHI`DfQsF8CvYw&;N ztXxu%szGWEq}D)c4W!mUY7P8vt^vKTq~O1&2C4h-fAc;}&1-62Q)?i#2L9R_;O{e& zy{V@SOnh2lKC%eVvi8SE9w?A6D)xvM&JEu?bcvxkhs0BV^VyBA507q-3?DTo@Bz@tEjmhJC&N&A zp?|zLwLGggby1+0=}cW5T-+-GE}c~XSMoPt7~;7vaJXd1Q$fNB2W&jPS+KI^59~`QW>ZMR$uGNKsB&B zTUR#Stt-W6(K zu`~zNJz8C`)!(`$SbeaYn?Bgh>4RMhx)!?4>1M5t*KJL|YW2Hr2V{aX(QRk?Gq+=G z3+NW;Ci+>c*L4;xSJcfq0(1g*LN@|rg4L&5y|6>z&g9w!s1H^*?=C=VaBFnC0P0|^ zuF+k9&fxaMqK?+x!0KS#)pW7$N>}Qh(CSj%6-e~KZV%m?)!N6b*gh=ELePZ{(wn*; z@_y*{VGUHE_jCpN{`Ln3fYp1tKcK$UeHq&yCb&o!Y&bvc^lffsG(-5E=_!#Eu6rcvU25aOLAko)a zovVj3?i8Q}SRKtzVNDjHn{yHFh0}m^aJuPTJ-_El%>k-z}3`X`U%9xO!% z>{6_~vw)+)M+beg)fszq&?~zvw7SZl#hPzG2kZvS^;n=IxZ^?kW;aHzZtr7RV_`a0 zhpFv(z=_}!O&{y?=~a9la5ngCY@7#Vfe+nV`=X$e_INr8UjnUO+T(%C!0M+x9=HO0 z1vbWeljw7;Uf7es>SaBdzSC2{>Ono3F3nei)v192c@l%l; zy7%>T)9HE!cm_SGZvxc&TK%ilds5RJvxC49#y6R0mmk!c%=?|^`(lfy`@&5oY9X#Ee16FV92Y~y*vx((FK)s*m z(@R<%rqyR!J)_k2x>2S0AQIX{8!qrgL8^{RdpSO`|{ zX7zGbM`m?mUIHuyFGY6=@C5h?Y%Bp5gP$SSWx!qFyYRUTcm%9|*2@5OaaL#DWq`Ul zs{{3NK>e82&v`lUELi=VmjmiY8^!i=;4!c|JFBnr8q?W%EqER%d7RbylZXb#;CLSPx#0?hC*=@H%X~0H_1>26Ej9ECw&e=SCn3j-snR&+6yA z9vkZLtS-=Nh-DM-GFaW6HvzAJ)!}&)@GAIKY;OYAfM28U^;Xk+d@Ji|CiG0Y^{V6Z z7O=WHt7GqG@Md(kvIgeT;dw57m2>xkPIQ4zbc&wI)tTt37xeRV!&Nuy?Z8^_TKsPZ zwt%K%akPk)S!9l*`tZPaEba6eeR#CHPfFs-iCJAu!@pONcMU>o>e*5>EH zGvH@fgP#NHRs99Jp97zOKf%W5z`fw7SPNeQ8^9Zw^DhB)iT(=RF9CJ9{sJ3c0#AX} zJ^X9nZLoS%e+_&F{tVr(0d>Ou3L9SoFM zc=>_d;N9rv_kW~iUVhV?IzK&=^FjYiECqe_e^wuAb(c=`nO4teb&pmL>0neb{IIGWZ6+nHL)q%PyPz{{u=&T;j>g!ws zT*J=*XJET3PztP0&b5Hr;6z7f^>9{S=NjM|jH?A40Y1X?1g=LX<_3UzJ2y1lm(|U= z0Z;>6gK-UjI$(7QZa~-Na&%i(zv`oa(%{ngSGVUH;2MlO3TOmwglpw7@O{as!w;2ZEatf^Maulg~!Mz|4CuF5Ks;;^DV4mxs@rIVYU8Eo9E!$My>E=y7Mb zXR&Y0wY}5ln)7K3*Xd{Dh|agXGsMvQpWJVMUXJW8Rn+)haO?E2m4Dp->yY&2z!}yqECuZ&7BW8W! zJH~Juv!P{2IyNuaadM|GN+Ngpvh`7%bqZV<(OEethAzab+!QB1Jk?~Rwg-9IAaq;Q9QD_^84Zu`4YYT9WNrA=tQj!F-ILc zQELZZQR|DCqfX3*mL2KXyky78J!*58FIyi|lX~SMpFZEv)I>2Xzpg<3uC8io za^I#3hE~j9H>{GRCGWYbQF826lZ%_0EB-gm$(N`(_6K(=rW{Qj9=|a0te5@zMSeAF zPj-H+QZ!iy>DW31cA~EYc9f&ylrPo6i8E^Bv^vU#9L-qesC-q=-|pMRGcz%F@@3b6 z;<0OB*nlrgY^w9RJ3cnF=1X#oRh@%4%^FMQ%Nmn?<*Pc|e6?n5zFJGNW9P!=tNBXi z8`x1U)|Z|4AWk#yK|E${$d2;0IV#_bOYaD){)$=g1a%839y`BNn$9$|=J%8FHzsMx zH7|B-P)}o1^_0GJvyEXqK>bq^`*RQJa(+&Y`nEZSZh`E#4(k_s=s0= z|6yH2D`v@6L($S#zE)pzRpAG6lzXiaWwv0iIDq%|p8d8_84 zRS(gt_peUMw~SwD^krvWt1U@izl7gN`daz=7UN6tTvGW>qa!=-{P?CBEBdQ5Uo|$h zKCO=KN5@Xo+R;2(Us|6|%!XFX(y@8Tj+1-T<}P2hKB`IolJA)NRkir}wxvo27qpEojf7G!bb?RW=rGh#bIM*_ zPx+o&@EJpkUv|RNNm_FGamJb&1~x;|4|F7tTDf8le1$Yej<2Zo<>;80ZJgRSR72U* znpVDwLHD6(`IKBW6fJ$_YxOlpx#S_oPROw@Iu`hnPAu>h(!S*QiaEYwfiI))__A`v zZ0$rH`oc zYx}VHUXs?1YN?v4_Q713{XCc>Lu;OxyCkjeV5yeQ*kt`wM`;H-hPGo}o35{5eq$P| zSb})8Ry9X9o`ZgONjd2IUOET!YxLc*!F>>wA3Oijwd*m6H+jF=`^M@kZs|DkkYk5y z*oiKK@|G)wgv>+JE-K zHsM#j65;m#>ro&i8d(raPHqXEfidY>9qHwa9cXC9?8rlozNu4SNB*oY`Li*gKhV&! zlQ?qnaclJNri1<8>=|~iNRCX-#W?viGs}%3z^$ zO00EVlROx!z1Fe?r^`2qk(fMETOp#yfQ?UwE1I23N);?(K>ged5EBU;@M%d<$u9=r$|1@-vb2uS8 zVE>nG$?d)>J9dAzc2pN@-_}UAHuEamiSapmo8onRnVMRC$Cs5S^V6819%e3`^^kf` zPV}45&j@zz!_K{6<}H{fy?cZO!CDHlmXdR6*N5hfdo=g@aL1;4`uzuf2S2qhCHJ>~ z+rGq&6FJy-@Ux2?`1|}%e}5$O&8g+XH+=F^=#gSo!x@_&3!OK+ez;EL_0VP64Z~Mm z`8NA*Bs_WOljh9*m^{a}=rhUeP&8V`=wCHyps_RPhY`lkEu#j9Wxvdvvy5KHth3EI z>!=gMyZnYm-v5j@Go>FJc4SEU{r5kTDLa+-+?FZ7zjv)_{7J5Oq^~%ouQ+8#@hk3C z&rdXQ$e-fZ*~%5?9dBG>{M)nayZQVpc;%tE6u;uNXDk0#$Metjr+KjR)4Z+zZ^Z1- zs0R6yXU&h~R!{X1uX<>lJzM$T9q%PKer?uW^GA1^b!N|2uCvyeJ>N2;Y^M0hO&;uE z?u+1TaGsYaq1-QfnZ!1`b>U{4Of_-OEzd(#%hM2Scm& zPYN$T<@y!R{+6-whMlw8m49wh_{960WQKPg(Z0#NCaXSPHz{1W$irEUORS9CSoBMt zp*e?s-G~u^Ojq2mAh|AAJ8(*D`=S5B_?d z|4BZ7f&2vvpck>a?(gJILug~v^|ia}uWm53B>zWA?{NQR)w3)u`B(kgM6BGQC6_+` z*G>H_OEXq>q;KSw#znSr6S#5Myb%Y7`I$T-xen#6x=hK=ZlA%~jd_2rgUkDKLF8aR zr$lnufejAh+o8qhmbto#>*SPNXAf0A*gAV6o*3oYa_xw=*Rr$p|2x{N_N==7**d!j zosGbcKn4Re=Kpt{Y2jo5c^-b6mrqU(vBsKl!JRMI)%^8v9Lo{ttbm43%0*jw1Ug&h z1&3ZUwr*aw){NCn%zJiNXG;M1PAJ&JsXI#M?tT<(_-xYU9)#H&!6|nR~vl zE&bf{ZtI|H8mF_q+bz&x_m?KQdM zYSzd&vgVPsY93j;R_!{qYS*n(w_ct44H`CR)UZM0Mva>^I;v^2rbjnx+WhF|#~j_f z#W5{f9@C;#%T}#hwrbP5P21LO+O=)hzHNuhP-Zxk83{+S!W}zx?$o7or>p2*!;i-L}jbv@TEv9+8 zX!zntpC8J^p<|9b=E%bX=iL`sJ!qiOacEZ_etPY-kvVIx&8-u2hVv@17j=|M+oofv*2f!wS^@-#Zc83|}tu6!dwUYcL4qkOGg_0fG{>^O8- ze&kOvIJAi+n4_5D3TVwQx;o7KMhuylM|+=IedhlVe~un!k?6`FOU28*wrX+r! z=+e8M>lPwbqwms+BTVZI<8!~l0#T_4n-?ha{Ggh zD_0%J)9ARgawShAcWLEH+(z!wii4bu+@+PP)jt%iT(zb(&ed_{%2jJrI)|dQZUwn@ zT)A@9I+l)0%fHsKlsY2`Zi)AsD+I&x^~*!$F>BL{nz%T7D+d7eMMFZ2D@ zSB7=o_FlK}{!dQ}i`QAac%j=qJ+v=HfwsQsgkTRq8{a)XDle~h| zyh`L|^O|Xd8gGIBFQ#OVNRIt@9C|g^W0F-ovZ47IPIOML@i=n3M@dim*vx(8B}>|0 zTJgw7o?&Emj*WOE@GDth-}7n&d1;*}4dunjIc!cje$&RySS5v#Bj1SV+KOf7V!qn^Zu9$NUI|T$X;omhwI(8}%4=IhOpFNNML*+cVfkMM<=^}^rr?AaEbiNm+Y@Z2kYYoKt&XssgDB9KIF!Z`r5**>UFHzjO2d zZ2u|y2d_ZxdC1Kld{j#Mk5=ID-T6|Prz()Dz(2ZA{BP-9{EhONzIF44e@0%LH%#9u zy9qD<3=b)rf2{(k`M32;?SQEYq$+UuR>1B9{~2fZiK%Dk<_!bi-Mr!8|LTvcKQ8h2 z+KJfpEKfXl6MVv!9V^|<8$NC(K4J5wmG)ZVoRHQZw|Rr-ozcTyldV}h6BdOxZ`iw2 z*F+C|*Z!?+VubMA49~l1rEub~cJxjl`r~Fdt>kOBg+$+Q!(V^@=&(0YCB<_&klUZ+ z?y-00FMFgDMX0lT?eC$Z#_lhBa_W?btixVaI8lY1C=c{$D?RYt#ArKLIr=$N{c&gX z@Vwmi64!6I;ii=zH_PG+x0^Sd(L;KFJmzN1&2ZO%JO5e*iGPakkE=2#YB~*!ORTDd zzH2cN{lQjc&iH>fb@=XlsmxOqNLAq9z5o2Ve?8L^&lLCP^{9FJ{`u%X)7ZQrv198Q zv3Wyc-=Afk@QM9g&ka3CJn!RX!hIIjZmTPzH%zbHcK`lg_Q*%6je4fq=U0x`gq0k8 zc@VcGm+x=$$%g5&H8(?i{c(L3%C39lj7(6&Dkb9hbl9iEq}OL*B4$aguKP@s&W7nd zF40+Itj?j%*6zp6hE>uS=_Pz@n4a@iqboUw9n<3yWpm&^H@5??h?~AOk&U&LsC4bN zs%)Qy($G7VGCc6PYAv}lWo4T;wE09;*4vQYaY}8RwKE#bQqH_sDluyM*2F5)JDuK) z4xb~n1EwmFs=(n}fx~B~`%ld@@tnH&n?JrgDB{<)_S>klo>Myi-G{Z?Z{us`cNV$r z&)S*z={FH&?yD*Ozr6y7@6MOXJXL{I1-v<_f2j(jDsZ?~V9wL2f2j(jDsZ?~;Bejd zQhBE;kg9+;=WyNkQhBE;kgC9(r&D`issgDB9KIDu?SZKZq$+UuR^ag6`BIsuDv+wc z;k)ytGEY??Re{tFn5sak0*7w}QafO(0;vidz7;rpcfM5SsS2bjaQNa&d8z`b3LL&WUn=ud1yU6#?RgmkPUx%uuP%MW z1-@;>=4C?(28{B&)2Db|&K1wghde#FE*&Yh(fR-9NcA5`Rp9Wez-;s8G22U=|IYle znKftrVl2<@v$ov32lzpjG3VolF8=1;{e_+^wpP81{+2hOL>|U^v#sUcmEEN~Pc;9> zhT_PYGi;8|SI(I`XT_dsbgbUL_hfae-n)O-U-pmPxpS^G_J_^MnsfR7llSl6wSRB5 zy({)$f4?f6p{uGfx+i|K&2;lF_ii)O@9Ho65A0g|#nu*jQu%-UP{y1noumI?pBT!$ z+h?s}nZG#e@0|G@Ti6cb$&sa~R0UEMNLAoJqXOEW*rjSe{D=MVABj)<8~?gIJbi1h z&l!I1oKjo8*&EhOV25Y-H%IM{&Zsz}A^7*vk`k z4$NToV=KMcyVkZTF(H44o3~%#%~p)1OixGIOT-y{Uv!5Bcb-!zw6yrF{Q5T`zq*ql z-qj|wt^B<&bXbs(&oc4^Ui$yq`w}=QitGPkVYzi7h^``sM7-d~p@6Wn+9-;m2nO&V z374`W5m-eQB@vwHFBmT{#vmaCH{=i#5fDMxkwb`}5m`+XQPfSuM5D;6C?Fv7|9-pX zO?B7wZ13e?elp#knyOdz>UEv3-g{Nu1FWL#?K8H|U|PxamD5RwSM&1q&y~J2Y7ygC zB3}F*FYS0Kx;(mE{OvR5UPl_k2Iihi96r-~=XT!Pf$^`me!XQ-I^zuelIcQs{d3LB zM=dISN6II@E}i*(z2)nzHT}7G{;*@^*$B6xdvfz>C2YZ_8`y4YPAS54GH!%!QFgDR zw@=TXWhmM6PB4m-9eTj-|s-O{G-|9`x7PYIu~0M9*f@9wv@PoK7_2yM!^+@9NKux$M~ws<4V zf1_CQI>+FSg>lF_rv6jX^ndSubEeFhc+R8o@;OuTo|gXE@zT4`aU7(S8_#&~)eH5! zL^vfq(T)-ykI#?44LR${S5JP7|MRhab^VQ`+x`7`eAJ@P-eH-Wy^7i;%dbcLi|bjJ zqJImWTJuq2a1~wd(9+l1Q>|9X(9N{KVb=nj&72Y1$E<7y4ah2`%p2eoJT|T*e=o7` zDE`M=AFby<4aMVHtD9dMFF!Cdw&%UP7R}n2|LBUA z-j(A^tRi26;|rhH_~v)}^zAbYPb}zj-+py3T zpR$a%|I1%gb29xet(xlF{cXdkIf7#-t8olSY9;!AdTsQ7{@#z)v+p_o{_)lw#Rq1_ z%Zsvedy>4McH#F zQnuzZr(T!B|Ej)@3r9`lqbdt12CRzbOof{B(5D?Lnu42#hY!`PUIe&zR>mhew^8O?%ZVkg|7HQSA5D2lp&;? zQUZZ(e$BO?GJx9~Sb?Q|)A>S2wau4{sH%E2Dp7QajSXI0+)uo!rr(1w+iIt=1 z-!G!a+&+fxtpD}TCqHUDX*JrmVM#mrv1#!qUCZ%-+4+waWv_7=^qTVAp0KGx7j{AX zXz6>@A}>rEZYrNPwp-frL|>-umv&S?uUg@;%?76neOa$5DUdGp0orh-Jn4L|?KkN8 zwmxTNm+ppJNY}=1R=U+l%kn$wf@8o|ah3D5L zpzWV~0J=1#F>T#8{co?|91oT1|AfAr>Hkds2hBe-KQr^6bG7R8pW1`judDw2FA1Fg z*a3mu!QBvdmBD_KURfwFB&-Osq6GQ}W@8s6JAd)CIQL(kd}}srCzMg+d)Ht;F;#xi ztI`oGA9&>=S+8Ax!@_CUQ)7E^ANRD9621SsXMTM4YsdV1W-Rwuy`sFoYC=pEKau3$ zYR+z0t!Nu>wz(``u#~%b+$rX+B1ewq_v!clWWB1cFM2ZPes%VLtNUEZ$LAUzQ}z8{ zLr1TOHf+yV86;Iu@W8r-6C%G_B>GA~h_C0K|6XP>*hO6GH4NG8?!LHNX z>v~Pm`^;hczgX$djh9oCr_{9~d;X@`+4fG9^l6YU{U!QeX8$*{|C`zWH|Gl|LudB? z#Y&gz+xtg0oSGvzM(lr*T8aIC_nd|YKXd*g#rhh=@%?dO{6D(90owI<%j5Cbo*1-D z?$j19AGL_*EAQV*nL+Q+ra%8f{OIyiH^y-`^Q%OD#>^?_DNV`|?pf%>x|vv2y(@a^ zit34(x~pCBe7x;qxD zpSZUyVZUEcJRIj%d2_Yl325n+Vf|)j&z;|E3gOD^|Goe0f+eiI?Eh{+c!8EN+)`xr ze`SOR`_k^>i##j7#EU;0{gT=L7p_|jzMwCWA8puRRvgOg|H}w7^S(0kKRNFc=SysU zl$rlBB7=R?>N+IzUVJ-!_7OV&wS0EpR++`o<^8u%Hjq{goBz?}*^ndNTW#`hSRGxy zesw&qS5{fC`Q|QHRu}fHWA?Zfm~shMR>~2h;SS+U!=dC59Tfa3`|fIb2V{)- zc-sZ~yZe;$in*3^O%J7~B^kW;t7`^)SDv6O!J4y-T(gA^&ra}+slbW-p5*&l_Wlpw z{oF<3;_Ufl z_U1DC|K!p3{*mzQwEkgo{)cOIbUD{-Isdg|^}8=!w6(JHf6kQs^QUC@?kD3zYrWfN zaINN=&2{h&IIiVf)47&&O;6h{2_0K&;VbwaC-%DezN}tZ-JGGh!>GIIq=NT<z_N0$fO`gsa%-!{dBxok>%IZ(;wXGSWC7~HRh@b0D&GI)nMuOYJC5pa`X4=-2aymUy)Dl&RymCoAfR-&yMrEAUyjg`~T_se+tfL z&6zS6?>bJy&i0O%>fw#A`WyAfOsKo-l~vX++VW}B7dWha602%*rRQEkW#oo1x&i63 zA`6F3J~IGUa6)~a)#FJBzW*_7*M=oL%f~Z)I0JxF6Wgb#2mJ4U=T4dHp0gLZi)RH{ zW4vej`dn>~aLdWFggjHouel84Nsh!l{Ar%~<{3@hlfnR!lHjm|H=6c^8S)qdjFg6 zkom30>7mU2uSjT_{a=of#CXVj{~;;4%lOE=|Nl+A|8H9VusZ)Uy?W2uSo{ALfo)k99Lzq2-Vm*&#$It$zhFY+uIzk*6$UdAB4B}AJtzZK-3 z4>Od_Q}9IhTRoEIErGvW8R$rDfrKR24CBi^St#w0h_}YCq*mJ3U%}))65e~5$nWj) zIXu&_eFp3vaq zy_bw7|NJMHdA;QdeAAcf^~_k)4NW(cx!FqoLyzIo7x}IlzZJ}H2J>6N`Yal4;~%Z( zw}i=O_^n{~Jh$eTzO|SA#&7ky=e3zmt{{F8FUZ7YTHwfQ0lil0|LUpyx>?C~;(zr} z4(IIUKZ7J@A^s^&&q~_A66Y)Np6VSqpUM4~Cm{_D#}}@EANHKYym$XAC=vGMLEM6c z8rVPVr*`V(~@cZGScT+Rqe+KdV2XzA}KmSXJ;q5c{We>im zTa?ZJ4B~$Y@eNVNdH++Wy5~QNvcGJZd+zb4aQ|o~_6xxq%h--n%lUS&*pH&_cZB(S z>PEiv^HrSogE{5h-xuqG*nb4B?)%^Tn)J)>+_!ZUN^{zl&rzKUe-7KYcx|}y&Y$=}{l5Yapd9OGs_uRP?`BgTImNNe8|H5G?sQ=lY(jVGqukmeg{qEP5 zpkI`|ul4rnzumNZ>l5#g4ln+v5dTYP0ai1;|NCQ%%;D~T2D$$w#CgCQbEnv)Sbrn` ztB3ED9|On#^x=Q`=>PN~%yRPkr_?}5)#P{oE64-;=2qC;L^{7m=a!__IZIVblEKfk zK&AyUEs)Xz3Hit6QkCFnDfuhRQH37P{iw^r-vtl2)?QYYOk@pU&gj zjd8_i1<~6Z|1>Z@2saZ~-4>w85>IJo_Ko+dF7!7i>)=R2qpJ`>g)FwrT?DU$#Ve}86#^gRVea_*ZUvpTyoMG)_<5v|9qaTld?xK+H z=U;m-q>k^f@mbaS+W6u1_hZ=kYYPA08Q;OyRblc}jzOJId_zTZUsDQ`Qad3-S%++@Vd*x0 zRpBuDVd+(Uo{b----v#q`|0bE6u*pr_O-99cD=uTm@AuCZnNRA64>|}w#S2k2R#*! z)A_HQV*hPYZF~*;u~Q+FUx#druyh+=!_G4LYd>21QBb7y z2I&zDzvFj!y?mfpoqv1ca~c96|Y5mv82#RYY!Hs{3jt!o*C$GFmXSv)6p``dz@6YG-5Coy(Ti5EXLy{$`u@sD6v zUGT#Ek@$jWPORL6|H!VKn1fhj2hd|oKXE@=1#bo6x8hr4^A}t6o_3UYJ2yFVs#aoS zrNY!(y!I3uPR-$uvGE0#a@u~`{cD@h+3{!m_2Q?(LRb5y<;vH1+h4c6S9)albF`)08ebshtxSGt z5gCs*>@S^xxU$gM_%dcl#h3K8kUi)G_WD83_u@01aG4N=ueqs-uwj#;L&9w(-p03K8{dY7 zj^W=rB=O?g>D7ZN9dH#k>u@^y5-+~zc^y6BEJx7&__%; zT6mh!*ZEQ<`(U13{a9)k)GTWM*6WC&Yr`fbIAr7d*Ckm;q`d?->qT(L#<$_%T;5p9 z1zfZA#jqEac)zdZ!_UDrYjD;4%rCiJqG-8XxZl-UxGykXiS9>0APB=$p$@oV&5TziDU)FCNT;YKYF3M}%Tjc>!m_sUPS z3pmS!O57dGdba73v&P<9(?a64k}$97P15n>+i>t$O^u~xfz}T_>#1w%D;3j@*$-== zxhQ9wUN!OYcp=u}w#oH=F|^}CkKXQG-@IY;6^Kxm)^|KU692<3knL;TUB{9-pE44% zj?Pc3LR;wQED0ru^mGi}#aKu6MP1%2Pn5aQ2GfN2M7fFO%|(eQCsyj_<&T!1jon0B zM~vN8TQ^L*30;6kL z+i<#kzIe}S$#RrG;afjj5tqYEuXTx>t=#o(0@m_rh)=G=#G&IV4m!wL@h#=m{gG;4 zv|E(+8*((cDa4ijP^fVIrDR2&TP{jsTx;|#u^bQjbdrA^O4Tna*57S>8&1{t{q#)h zh(stc8kX{=lTZa)*PD6du3Ua;m$30E{9MW-a82{u>p>9gU3vK2#cz6Jf^wL+S=(;k zG;3SgR}w?boQ|vf;x`$qS2{+?B&BClu(thIG z1*ZdXf{PO~BX%1h(;QI6S}1s32d< znRbdk*+;7?8s_%<&~~m2!Z74rSO8cjXx9_gHree;bu5F(=lV&z0eg1? zy? ze)VB3Cz<>+ft;FRwLE;a)kZ&DuuE zB=wef@ofyDyVtc77`hUISW?0D$Qwdee4GBPZLFV2Id-aO&ZRr$L_ql=XPIB`PtBua z3O9CHpzQ<(!{jX7Sh`ckJIi>EfaeP2a+Vp5pE6e&*+`m;x<5yX+?*NY&vKh=U&g;m z*f|(?2yYP(I&mIq`J?8|CLL@(6>Wnh`9Z2p+L=ref0^r4mHixs|&PRW6!7d zO>LZdw%N@$(t;hLhD&``$CH-6Y`j#MyZ?e6$H@V|zMWc5e+(@H-d%gz7yR}H;(I%A zAK=|?TXm$qsc ziv#=5Yv1Mg^4goEe>GP&E1ke`*Scf)wX_BEdB>UH+w`Pd-<1CE>g&^33hJfhYqWMM zrAl4jsMm8XmD|R*;kaHs%LHF2v%at(B-i!wC-AI}-shFiN1j%Kug`ZRxS?kN2;Fo( z>jx^y99n8f$N^>S&jaZH1Ifpb4I}g@ooB_d)8M9P`Pw`BztZ3)aFjh$HC+Kkb8tVSMeYoYMYR=}l>7_=-&^fC5%XXr4qAxtLEV0|~ zMp)F6@(lCPZs2PAN$EqVh)=eyB|~Xv4O54x+)eq@E3Z-#^~$rAqf!~HVEw%^IW$N1IF`Q+Tic;kn z($|;SEAg&m%Df#qHvaBk$mMU16x;>loo zT9r#l5(*964o$i=1*>vTsXSJfgiXZcV2rjK@aYoI($FR%aJX-us4(v_uu`=Aa7LI* zpZJh@6sEsx>yMnqFjUBkIaVdVyw@PGU~-kAvtes}N$TAaZ{ypr;HC3zecgtIUScJ4 zK`%eC@oiXhJCox8Bw5a8UQBb#)zOrWT0devF*=QFsn(GNSFiKl{Q%cC;ZkNS>4=md zc~boZy3aG#eMajVNlqKqHVgBH1Mu9k%XtYK--d;*t{Y1&H^bhNh=eLd)v#b!H-BZv z_cx{g+xof<8-5=gvhi(LT2t@-YsidNy`FI0m77{WEdc_Djc<(Fk4TmHTnFWO)TU`W z5IS5v_1OT4(W|E5dwuU)gMyvT*ES1dZ_W$h_MxO^j zd%?PF)@>U$xio%ySf_aVnPGz;oNnVASdUBt>yXTM@x$ncrH9cEOE>gwecjG!ub4I* zTt6L430Z0!>vA&xz+@7mWXX3yKpUv1hUFxFPqy>x(R(0 z>t)lttE?_-(C-(pQBZFA()FdE4JP-!5@y&k6H7erex;WG%znSnIsE-#{k`(#4$f~{ z%3hf@EUQgAzoz;1s?2BU%Z9a->eW9rUzK{>_%^Kb8y#JqBfik7j=vjwqN4kYFLcG{ zu6RWkwH)r0%Vl<1C59*J<#YgL7XSW;U};~=8KpZ%J}2)KjC?L#&)M-JVM@G){q$2I z!PfGLma`bAcV$xX)5UOao;&3_eeJF;NjtJxp@KqsSKgefmlO4=xUvH-DSU>k@7iw7 z_tNz4x+x{Gz3;P`6dg)yT6B4lwyMh5pl{m-!{~>lvlL$X_Bi&Z>l4=+hbuDdH=g=Y zLejN@mV^}V`2gYt-GZ-AHIx}J5wi1e7e>GBpi|i1JmDahoX8MZ+hY%+jyfdq0t@{z zB+%j`uwZ87k z3T{dqdkp3C4V=U_`Fx?$eCgRFX2)d6hba=Jq-OMg^6_A)K>E<|d$SJsLt*)4Jf<7p z=1FDADeN7el3)0q4Tp_SmiG2drp!DuKwE@~(INdlf;V2<;xUF@p_7odO-PBU`Rg|v zY+7De>-&ao`Jq|cc&gBgqr<`b|2*BN-~5vtU6QsDiK!^Rls4V_E&BA|fh3v@ClgXm zY-_UsWdzk+2r)A^& z;ne+q>bTM>+`Ax@WPJ#0-Ie9hqt%aZ(-TT;A3gUZMxTzX*nY3=9RB+FA(kU?C50{T zSps5vcLDgOBIJh&LWS=RdhP6dm!D~*sjd2Y&yc0&K8{@aeK4Fqku^M3esEI+Kk1i2 zqVT-0D6LUlpSA_x`;aal^qvT)E@eBPy|US`jc>y?zJ`u&MhQY#lP|am69-HedIlV!Sfj8XmatqMI0?C?JQ$}FfA&YE9-WnAT0Id8sL5Zs}TLK z-#HM<+84Uo`eW=k67R=`M2!(xh_N7-;E6Bs;>&vt0;lsuOO$khlk1DDGnQ}T3oO2! zU*g5L^>rH#=GxNApCoq2g<7f~mfuj~=ubWOW>cihL0LjBlRsUEv%!3UL$EkLK7;Lm z5(Z^6xf821q=d@dQVvQKkS$sXEWS-e;>9=VA|XnQh6OL3ek9nk|8MZ^kS(EVSlUDE zSvD+GM9Z^b8{dX)e1XLeTXDklcRRn(72nP;@#5EXd{#ccw2a@Ea)@t_Z=M41?z)2) z;%fqB$@dMk^p}2o3tgTxDEo@G1^;EYUwSxL|F`k|)V=l@IWJ&i2%K(w>J}EPRQ+92 zs++&E`}bYa*q`nEQXcKgx*)zkl{RBz`xhLqAC~ULW!R=4mL5hwEIo{VSb7+JlTK+* zzw4lBGVFzQZ2J0Zd^^3euyAL=w_%A-=cmIr{5xI9udh=x)!M0klAX(bzKw6E+xof< z`?*yrWaHa#Y7T!4IhXf+S+D&*VM9sU?5Ncv)6?<+{W{XB`6T?{*2VA>Y6O+jL`m09ZH^}Tw5i(MvpQhnlj@om^k z_nQcFy(3ST%Pxb&i*Kjb6c)PT+w>$}d^^3Su+SCXrYG^@+vzohHC^5QT66YO3AxKCd2M^XK>}NV|&fPc`~D-wgP_q*vSZIQ-#M-H&DF<<;YByB^Z- z;@k8kUi;+IwR@AUcdx*v?teacW$oUEK2Ph_F74W-=3T{Vk1}mWv;)XxQX86znTzeC&mz=rou%Eyx2a3K_;z|tVWCSYBzOg==@Tl>-(0D7 zL$4lmzEY~*PbT3varJ>uclB7M>Kp@yuw2;))Pw7jaH^eBy%5e^Rc(Q+s%Eh8y}iOd zBE2l!+3278s)1?@xQ?m|xGrKEsD`*3tD{toYO0P_-%%|sdK#>g=(-Mss{^WyK$Z0Mb4a&?OFtLC?NQ$bDAiFYWj0FL7^OM}rD}sxHV0;|P1=S1ts01u zjI4(?;xm|st$Z||(h@D(7_odVudGCSGF%_EY7Bh#RCb~sjIYhBrlYDh%W`kKpcbeeY1DP&>m!zPjd+dRkJ;QSRdrTpsXVw|s*kz|v8Spt zR5#T{osHPOs=GP|@s}WFh`LH$qa4*w4Mb>=x>Ai)W7PsC(6SLA48V zoq=cd28DA$V~`rEE>@SS@2lZ>T35t5c*2>Wd!D*n4OXMo7*HRou5;-XfZi?YM{1(F zP5l%!?@M3`lT?wKq3%|<;=Whir+$sJzo;kFBe<91J`IGsuZug#rF$PJ7vV{F<4Hny9-j0Bo-`39 z`zcCRfSTWel0Jlz{Rt(z2PK^cs2y6iBdC)vv{$Xss%N3?`k*wYx~)u3c^rDC5qc^I zJ=GpP(+NFuEPAR9dg@BF)>yP`Ka~C|v@~1xUeLZC&zp+posBa01*KE*q;9Co5KzAc znCGB2m*6?%0S)oXt1iY;Q#`2!#!h`ejld`Dt4;z>;#&c`J;v10iF_Ra^+1hIaN}Dg z=+sY)QkB4KiYJn9>E{Zq+VWY(+Q0O=rsrE0xM%~^jq6)Q7fVtPb?1yc3fMWQbpymS zL_4#UTY?5#oa=N{59{ThG^x~Bmqt}2+ zYhbrmr(xW5Mp`S3rM77Qvw+_lSPsU-MdU38uu97 zlhjQr3jZe8pRVr5{TnqMqxwGeuzC=qwOBo-=3?|NRLe28SEP_`FsH{Vt&4^!*xKg!MZBze3&h5DWgZm9trruQ_sQ2J@s&e&TwF|$y)hBSD zt9^LFPJ};GA0wVIpQ}CUOSK=rd-1#9rCSQh>+mF&Qs{2OlXl=qD^arNP_jiRDNFeZ zaNkDBUO-Nkau+Cn4$3?6q|flAy`W6Gdl0)HPh!c+ky?h5et?p)Wc!e|3nkr+lzC{e z$IxbXqa`0kTdqROZ9-Z8gceMr($f7KMcl5>Vi>r zHb!N0jLKs%F3EoyVN{a;oP=>lzLbMeH5{YrdWZ-9BsCmw@VIS%b$EY#gLc5G z(iLsd9jnP8@aZei553X85v(%b$67NS?O2GlV~V;HYsEe2uODG8nTQqT0jwbppA zXIHf9gQ*07;i875&(D#GacHP)he==)pHJGWvq%vVd?74VN3(~B^& zIlErKh<*xVXeCDc7L4&%+>!n+#_k6gt>x|vdJkin;ZHEacVi^4#yDGtk+&6dWgEsF z>8!^*eG}uJGxS4X?!?Ua9CLv)<74F71&CqJz}*OOM(#uSfI0~O073_Ge}(&y8^@4| zIi%va58~zCy+1)N*+J#;rAKQjrB7a*4s&ArKwkLXNJ;u^0qwH3U zO3G1#L8UWBX;+L&%2z`%LiI=`e>oAewlQWJc}yEuKROPxjCxZ;cSfepN;B))V`gzC z=~>pu4R=Vu%@cefbyk}ECKNn>IafJnIag)=YWQS#PMiFc)x8``^Aqw4@(l6{@(l74 z@)YtCuKAp+YzfX)&RNc7&S}nN&S}n7&RI&UoU@$EoYS1koYUkL2r=VO?XNeeS5wNZ00j#49^g{+CPwZBDoCto8~3tDdZ*ODVhsXT40NO445_e z+?~su)10fEv$~hoyK|Xynsb?Rn!JLupS*%RgS>=c@)GhC@(S_{@(S_{@)C0BXI#1K zkM3OMoaJ2QoaJ2RoaS8SoaS8RoYkvJH+L>`PIE4EPLo%VXOLHrXONeWr;wMBr;t~W zXOLHrXONeWr;wMBr|4PL3Uh(>89jeFr)53|&q_1vPQuJ0&mgZL&mb=$Pa!WMPYIrt zCcg=Jxr~XWtWKGovN~mU%JN+2Da-ST;TL&A9k(>p8RViqPkupJoiaORb;|6NXg|jt5asDEKiwU%kqDBbp`4ST35K=)g`D?XkB6w zD3H#dK$-McfimgejVC^a=gz}eB_AM{A%ED7G5dil(^HnGOix)|OADMCdx1m#Lw-WO zvI&2us4Gymr!GOAg1Q8C3d-tQX6KBge!v;@F`h!X z2Xax#*1~UFr(d8K_H;E_Dg&6x0={Gf-Ec&Olv)It6tJ>J*gK zDYI`!OH*d2EKix9vOHya%IcKaDXUXvrz}sIp0Ye;dg=<)8K^5zXP_=Yor1aqbqeYV z)ETHlh|WNrg1Q8C3d-t~*(s}2W~VGqnVzydWqQi$l-Vh(Q)Z_uPnn*wJY{<73e*{> zD^O>kEI&2us4Gx5r!K+yNnL_-l(IVG8)8mTW~VGq37fJ!=YH_4lv$*J zO*?ZvcjYB6?HO4nxfVlVC8^${v`vq)kG9oO=g|Cuw!Hdiac#4st&TQ3wia!B+LqTU z`A}^uOf6#rV3Ur{*A(rkZHjy@c@S-NwAs;CN1GjOd9>-#mPeZ&ZFRKS(N;&B9c_8E z>Cu))n;vb2v>DP?NSh&TiL@!wme>?w+6rkiq^*!PL)sE)o2M<2HbvU%XtSfOjy5~m z@I!J=*GMv!kt!wl&)FXw#!Dk2XEp3TZQ>t&lcD+7f9~q%Dy)McN8!Go-DM zHbdGHX;Y*vkv2u4OIsancC_V@E^T?V>Csk4n;mU+wAs;?N1GmPd9>-#R!Ey6ZH2TM zo(IabDbkimn<8z6v>6UXNog~rEs-`w+7f9~q^(X{LkrQ$q&E_+ItZ;i(6#B&R!5s1 zZFRKS(UwP>9&LH2qWvyHJZ*-w$kJv=TOw_Wv?bD}NLwLohO`yZW=LBiZHlxd(xymT z9c^~hPPNUB_F>wKkH*b@q@B5uJ0rQ8G7oKodXy>`j}|Q23K`Ft%Q;9}A}{(nlpLzQ zKt*Xj#3LTa`dV5*k=kb2R!h8z^>!XrCc{ zN}!EUD%yFDanrbG$2~Rfw{b6zdwQ}*D8Bs+?_QyuMwokb+_NKH?%9zx_w+c|*katP z#)<_~UFrd00wdPY^{o_#oAdCwozA8bk#MX(RtV4OcV3xKzsMJGYDi^HGl zoXFJ)?eq_@D6O;+H2{55b(nv^to%JXi%zhzb?XWo;* ziNUS*;F@>wyrESt2I(w^la$p>mLhEE`JZDT!B6Lt7sQgKB7I#GQdsJVHxx6WObgUT z3vldmzAV9f(c_r&!M>~WB+f?WTZP%RtjW_Z%@TKZ+SJ2g&bpEoIvmzP#`!)u#7L#E`8jgzF_nR<*8)!`Bre^;{#Fj7$X+$;EyHUeS(tvygfcBa9YK!_X$xwpm662- zpSaYd1uj8&nNM=@j#FyoYcL9_W7p)?y1P(_VV0}{*O4;NU!Bl>{ILc@@_PN1Y0K@! z(qW;rA|V3{EIzTGa$Clazcf*u*9M<7ZkRT?=@1w{$p}_)H6AS|HN`nHI>jK&AyUEpT|Yz^a6PqJ5E>Yg$%XRH^w0 z9ieN-OM1r7v_Pf>f?6PWe#(6MrhI!IOF1N7;OhE8Es=@Kw7`+l0@a;2- zN()qX-c&sw?Tgx0Phak;)A8rfXP(SCB%y1^`*Rsc@H2j<1&+iPFf$=|ety$!V$WkK zkHic7P5GJgSv6~Ud_th!fGdU$fnWC*_!xm){N4b+GjKuwzC$~~C(Qq9@P3D&0C7y| za&q#^qtWjoOguM6dkKPF{S5Q_}2o=e9|wI{RMj;H>F& zvNL>sd*|BvCpn{UYU{jL*4mjq_(Ui6!U;~Ne#bkbo{{>+0+C z2kSaN?N`?sQ=H}WZj$B9x~q=!Maw$Qmn)Rh@do9zI!ifMCvPRe=b9OXRtJ>@jM9_c>?{%@7j;~C}r_ig1&$*SZ0^Yl8-{|v3;jQnXG z=eDJF&`x!npPi89OdXQtjGL9^4BL|BT-vOz)9;G9&Vb+6b*}xOt~0Y|J?HOt)pO2z ztDf`JS=r7HW@bB`c4j+gTvp%t{?hu+y4(iNs5=`t&ZiBW(bqI|Uf9~unKrPI6MdnP z^ZG@Nof$7Qc78FiiF0sk6X(TinmTnqYw9fg-=my0Cmikcf9hyw;P-NzS3b>gUi(!u zXVf{(ouUt#JI6o#9q01?Eu7Zz7S4>7$2c>KS~__>k9B75hg*M~bMDMsXTk8}opoJL zaOO5><@9{FmD7CfiO!N=w|0)6)W(^1aa-r|*6p0vKWXQT*>IB6|5xpu*RT7oGZOvS zy>SQU(YHD{jh39^JpR9@I{*6qY0myLPj~tsb%xXS!!w*MFLZPseY}%%@WKCa+Dz;0 zjJTnT(`-an=gup-IgJOO>3lKdEN9LSx;y8O>)~89t*5i+;j^9Juj=Le_TAo2uND#K zub1XKzr61pXYXt0I_I6%$60^pdCp58obN2V>H_DlFJI^k9eR&Bb{H&8{<6Q<3~>9cZE*lKTLMs&zkBya>s4Xq4%dd zukO9wQ7T$Rm*fur_XCU0jj7c?j;Z*aF?H2FvFO+bVyfHhm|FImnEJRl7A^Z@EPBtM zW6_VFh^fZQV$ru(#MBKXvFPH}vFM_8vFNoMV$oNgi>WU+#niSJV$s4EV`|;zSoHaq zV$r*|#G+ZHG1UXEE!_GoG1VGzU0;f+uYmW{zr~_!p2xE`#-gMD8jEgvHm3fw2IYyx zq61dOq7OY4Q@>ggQv)9d-lH+~-vzPg-+miY1#@E2l@G?E8}5rm@0t;d){Vy0jgw;P z(lIeL`-+$v+%Kl4_r$YKiK&h)W9rX!W2*a(618u2iJJFtiRv?|L^aDPQ4dU9rPS7* zs?QI5sp1X2)XPnKt544Et)kcVR&(y^t%`r!TdiBxTdBYGR@eU%X?uFBm+R-L?%&B% z3tPiKJx@K~Jx@*Ulczcj$W!~S%2O|2o2S+l!u=#qy?1Ax+H-fFYWe^^`!_pJT{$mL z{d_^5TE8$)Wi8HA1DEHi1+hGJ@Yy^y>iImic}t$^^ID!-vpr8;@GfY5kf*LM&r|jH zeyo=>fYlcD!X+=-Ptap>YWVu)QD=? zF{1v^Iik)!GooJV5mDoMM^wXeBI@xz5jFIJh*B3v)RIdhYRsUBYBMCF-n=rR=6ye+ zw*N4q9)UmN>WC^t+&_j!)Llrwe{e+o`+E^J6Yl45ufg4nxNDI1d*Ji{?(xVo2zj@H z#^R9?^~N<3b;WfN)&55j)n{TvJvj+^ZUMd9BGE6Rk?1RTg3gRcH0z#7^s4(K(X9_e z)U<~p(aYvURKIzV=-6W9`9nl?cq|fKwcbnzZLF>QMK;2s9JhoR29R`nio~m;C=*m)#Fjs7p^m0 zE?nJbqH1R>s$PRz1NWyFqiQDH6u9AV7r=FdYYw;XZ&CFQ++X4T4EGDTTi}Mn^@Tef zt{L3k7ozHIxaZ&=hkIyMRNV$w05=fsY`Bvii>fAYdlp93yK|yy3tSBDv7blP!*Da; zrra7;W8sEfA5{b3oU5a%JKPx;M^!tx++HZxX`lmFKNod@Qw{0R{~lKdVY)21x^UTW z_2C-AHG*rBi|@L@HG}&OTuZoIxK?m&;7)?;0CyT(r_+?`2G;|wH{7{!ec>*Ky9{m! z+|_U+dMPyq?gqG<;BJMx9c~8P{csP#&4c^H#Y#O6_Y~Y}xQ%e7aNFSi1@{r$7gs}u zg=;hn-xq{y19v)HcQ^;`Qn;(eDRnJeA>3_nKZpAj-0$I*z^#FM5$+AR_u)Q=tMenJ za^OycI~}ekTwl1$;fBNA0Cy|g&)|LuR}A+A+%rE02ZehB?tQpDaM?dWyTNt17i|M~ zA>5U4W8tR$MyY$@=EE(8`|Dp&Ke&(KvK~iUKciG6Z0jS#o`qMFRx^0fVfEWN>9c=&+;7HKhc5M(xC2TMdPe$lO z7pki+0-O)TR)G1Xzw-dEgRZ9jTB=S#xIG*%Pq*j@{JxyizYqQr&vUI?2jE#9aqI>3 znVscGkU{9!3mW3LDcsSM-^_#OUIlmjB}NBsaQ?HC|F-%srF-(|FzU~5tzJ22#LPdJ z&?$97U%;yo&ZEO-Eu(<`DMK*Yz^xEv;J@4IXEk;R%(=7kRV8$6XFks0 z6RP-G-ag5i^vl)HPrWlj2QGX58}+xGGjP%?C3H%?$v*M)!Rh`sR0aMvjy~W|k3M0g zZ?@7u^r!c!=kJ3)E&P3ida=A0-1(CTol<-2PQ{=r;=sdY_X)>-#aG4c#IE-C$+`zS z=F_o#-^+QS&%y^f=F?p>dg8=_Nqq|^PA-@@d1SY)>ii)iuPGceb!1mJc-{EI!byqn z_`)QxJ$ z4F%&1CXXI}-o$YeMo%7BI8j|W?&fjVj2l00@>COd+33jylg4?mCQMEi3&CWu5SC&g zD8*thQ7jizu}13pg3)78h_Qu=iK_q2?vuwCsLKj&zP{k*A9NkwIVG-JK-`%Dac2d@ zbq|Q^5fInY8`stS((+mOdT|fcQ%O7A{DbzWQ=(tm5AQ7TeGA7IPU?K&gmE|D%%+rR zjV_H;S^PvpRu(KTlku9_E& zyY9N8n=v#K6CtEWgVEDfGZ;HvHPc|Hsb(;Cx@r!&vEbUG@uMeot!zcpWk^@mbol8i zn-)J!b<^R8Rk&MKD{N;7tFVn9R^b%>r!ghwR3fuT$6;8nqsj!V7R^jedt+1UTtim>aScOyYLn>_JhgG;oRV!>~2&=G- zA6DTM{E!OU_@=@`3vQiUG^yaS(Kp^$Fv*pDhm4+Z@hB+K;GuTFN; z7}d#bnx2iiPO1g}p?UFWQSkt6t)LbPou2R=5m6D>uCZ}YvW*!XG1=o!(8b5i+^`o&0 MDvwobWHf|^Y>?tBj+52Lvj*CGTiPSIf@`b5d(;Tf(Ze$9AX9&AYw*DP{DvG5@dG? zCW45fsF($_Vj>uMzrWt;z2=1T`M>%^cKB3HRZVrJ?&+D^yDd6(>w3ce-^+O%>5~iP z^Lz-wSRg-eOThog`A~=S&7fQgl9w|Vb6v>AcJ9$>Kx1T5-Ou3;x!mab-l8AVJjEbg z8=G{~%=HB7V@~4;!z>l7rW_%qgu1)C5`pM`%`%&JyO# zod2O8am46T4BK;p*Pj8~zjF{|tdJX=a8pLR9rF)yOYfnJ@N$fq8$F9`qOf*N3MpRoWmbfe^}1-Y$?3Qy`}Y|db@L=YdSOscXQVD+-t0> z6qvO#*c=a)SYrjeV({88+W@j&3ZA9wwFUAqC*|N@39f67D#3pX-wsH}Q#JTfOt!`s z;I7GlZw9aN1-V`u{^pMdVmf1)pc zR=)$fbN)nM(OUfsbjSUPzUId2r=#2XPxR9r{m)}VhPeW19 ztcT&Rf}aYnXV#1G^WbkVe7g53{5trNni#LBSAhI?z>kG5hW*;`=_Db0g}lOEC-~a% zvR8x%hQW7+m%Sofp9DVwegxx-GvXfjtKi2Nd-=ST@blnhueevjdmDZoyzG_4|33H~ z@UmBu>lIkL=@f7R<9+WauLXQ<_{-tbyr$j&_|EXMSH>&rO@JQ(FMH*v$Zhaf!OLDb zu0IVw5B@yHSMh3iufwl{zX-mnm*MS(-vKXs6}?Jc1@^0SCP?-wd*!`W@U`J(uQJyM z!FPr~i}7XHMJK|KfFB268jG{wuY#AoYTgmvGw}1^Wv@CBY=d71FMHLwz88K6yzEu< zYI+rUcBdCk*sDN%t>J6K%U(_INbdyr&hWBVi+nDE9|13WwYWYT{wnzMu~*(};4Oon z2Y)eq1+Ss^Cj2^h*{kc-^L~Qg0WW*?S=E(!pGYr~uvee!ZQ*OftA2I8M&60=o#9o# zI@r4yegwSiHR7pxC;V0LveyLvE8yqB-(dL0-rMl&;8m~MJPCh>-vNJ#vDd<@vK#+J z6ZV>UM|(S^dGfA=p9in_T6(R# zci`8-Pla!d|6k#Ez{_51u2%8+O>U;Jd@iUOTV7cL)4f zc-iZK#tZPbz{_3-uJ49_3jP|#m-fP5t-Wd9oA5WmXL=#83;eI})6frl5pOhnM)8Eb zEHrL_?+h<{SzKQPKN`LQ8%A56>@UMlgRc(X(d*=;?c_4N5el0e>da1d&hb=!hZn&nBn_)OW@N>ChQ&S_4VF{uMaPK$KlWWInC=0FMG#v zy)OKD@KMJ1@s9U;!_S0&9=;zlGy#4Yyy83F8{pjs{|>zD4MgKbc(w&&Zy?vdgRc$G zQKPa`|G{=71pV?-|fQ{lVjp&xeibw9R;uaJj+)m-`&;6LG= zES^0d<>V{--@z}V|*_CbKwW&q2JfhFHStY;Opk0 z-zb-UUHCn`BOWTA0=e{k_~-M`|M0_{`Y4`x@Uzg*COfyDyb_z^s$BY$;78`6f2yOe z{rM#LR(a^R&!yiAzCa%O6>{m9hJS;1_-vv*Sp468kdv?Cc?y0$`nTlL=M~%>Gjr+R z46mOt4yAvtqp#=J82GMv==aK{-xa<>9{P22>DPq+grAuX6_1}wf8G16fAr^&om-zG ziFCbrT(|E_ivK?NYx2;a%OMei2-8}SL<*A zcDcs1Wz5mY^tsBRVk>>%n2b)0dF9&^@f@u;$mke?WRqa9u|r%gAEP0%S|` z7;|l|F%ia0LUv^yV@}OACd8OQ$d1ipOsiaDIxwaQvMPCuDSqIX^mdHd_zu4-;Ikj) zZ`ZwOdo1F5z^5OJ{sQl^*ix_hXvg`906UsH_F~+n+HZYGd<#UaBf-zg) zO7m(mM!#Qh*Fhq4_CKz>HF%ma3z2>O<)Oz+%{68vW2PWmp2wKebB&2JW(cyY^BB`E z*O=!Rb2PGkd5kH2;28h-z8!lizZQ&f53PZrJNTWYT?{M>t6Rv?wR>f=L+HLkO!lx; z`XO{RANH{O@0%YVJcg?rU9DY>TyzNC6C7QwW!cU?gl=O;SMThyJwUqqAreQSJ_Gu8 zgv>vCTTZ;T4p!;Fvwna0=P+{Q$b_l z-})W;u**Ufh_GX*rddG2#Dd9J*SBxPt_^D7?_ec`vq9EGvax%bR=EzwXBu&x*e>ZLNNt=Z)W&zxY!n{O9(i`6ITp{dT)#9N9vhfzw2A+?03< z?4Ru2mo2`)k-~W&`u$$I=Vc5y!Q3C|AMn|WJzjq;NoV_YnSJ2EBRlLjKn^&^{({%s zZ~}Q{AK$%mf8^=Y9GjCJI%iCFIO!=zXsC?=-@HV#5^=9@w%9^Jp1~!rMu{3FUJR}U zvgG>IwO8`E_GTW}zRly>zJpxTdr5lYKG^>oziHC(fp$3xyw*Q3L%r+fK2XyUx$V_7 zZxo*i1xIr4`V_f6v~KKvYh^iSt<67&)ZUfayAE74{Ejt8V5tA5y{k5#3)!Rg<|O@> z_O4g>?8P3>Ikc7OKFiU_k%~GT_pY}#@vi+rvLea7tM$uCnc2OycOCqZ_-Fgpfi?bj zaQ40HAN6hXR0SerEj|ly-@B|%j!o*2eD9h#F_0&pYpM6HoJu90b$@;Ds{O^B&-LE* z@gpDHCF^=GTVCUWbM@Xe*Z+P~;4xe0&cJCRIR1|JuF=8gJF+)^eez!UOM6#2$7W%N zmXE~2`-=}WKh@uw+>^YXtCRF!+Ml-OeE#LV zygs*jH^%Rpg3qY9A4}QaJxp^xw^9jK*I&}|;sRg9 z=d8W02pt8=CHU z%lO;Sa+MQL2m5NYTPYiWMzZylAl!#Y>bdUZPaVQl(3lDpR^l+0tdol`U7kY`F^M zD^x6Bp;E<4l`B@NQn^ai%2ldWt#(A!YSoXZUgL=B88tF$*2p-r=8?5(9$C9q?K-t; z*R4~xUY)x2>(y^iuYSV@4I4FR*tk*SCXE^&)#RwAO^)L4lGB=|R7Kqrv{xnHE7hiQJ2n*nsjN>wM&zxU7L36+BB_OTC;A=j_!VRkM2h| z@6o(xkLJhpJf>IAV_NiT(YsfRmc3i{>D{tbpH|2AY1R7J)_sp{-KKAw_&bwbvO zCuDUzvEz^vJ9Zk<>7*f@I-k^e=t-Ts4DE9A&@Nq1?t03}UAvvq?bK7cH9NIg_fxy~ zIIYL9(|YtA)^qrMr-lz8-aeD7QBl?^%qR+8s96R!iWBZQmJ8ER#<3=4f zdem|KM)x~&bie**_CM>){>Ptn{Ft+jA24RX*f9eJjvaXR*nxx29(2yxg9e{7_}p^_ zpK$I8=bd}PiRYbo{&^=3Ie*Bw^M{-??xYLGoiy}g;o_KIfXN&pG#+bFaPT-1DwI@49QxJO8@#ufOj6ao3N#;rekG+;G9v8!i|>b^Nrc z<0nj;aO1QI6K|Y&(~T1^yy?Q5Z@Tcbn@_vw=38!^e(Q|sx6Yg~^R^i?XWcgI_S@9T+%SGr(;D(Zq2&q*F5*an&)3!^TJDOUR=NCr44J=Z(Ors)0&Mh zui3PD&C9Q>*}P@VE3dBE^4gkLx2}2Z^)*}HSo8X}HE+DRX4_k9-dwxpEp~#4-38EE*raL%-*o*if`Q%+qChz$i_>GuC93B^w`Wk z6AWE%PVxBI^z}xEbF4(q?ncfz&KM)dMhrb8XI#AU$7PKiKXGh@WfR+R`A+yMVQ9(g z&ABnII3y4BV^&`=NgmjbOD_A0L-HUVBUe1qOW40j@f*3~mtDz;OF0_3a;*4P2_sir zibM8ATYcgRJNjYAe%P@eapDOp4%tziocP0vBZxnuI1~?lB8o$D)n2|6@s}{PrNfQ8ZWu*U0f?Y>xrsA$2I4%@4kwN);fA`;%Y;47H?>-OV7}ZTRpe? zi!BrSg}670$3;u7@uIh)ukoUF7N5|+&ghBOxJ?@itro3#rZ7H`M;!f#V<+O+k2rp_ zG(KU!P?i&CmW>~KvJ;Vx&f*jL*G2Ga>wx`2hL*j>A7*52s=hP6`kcn`TA@;gzVD{_ z@$%EYj7ZKo4sYm6p;D{SGc@B?r^jAtDV-Z`sw;V1wB#Bu8hfiX-r5l_TGyo~TH`cc zbP$h~M;!f#V<+O+&vN{l`p6FUB)4&9+4z;8lb7sg1@T0jIz%+y#?$`&c3D%JZjA5f z(LKIsYCS`1u2e(G*D$xLwP>!Jds{T)R#$3Uu$AbSCT6YHcq`Xu zT6>tri&lLcdBoAzoLW0sj{Pi+*I4DD@uIOOdBn<{_*qMdymWT*jcB~|HBRG2%bu0z zuFqFZn`M=XEQ$AdqeHyj-XjcMYt+&M>UPf0o{@7tpoZv0G?sA()Dv4qj_m_#`{4Pn zwUmCFQLPTBvwTY~eWxa?6^FI&)NQrmkX&b{wk8hAHO{HOu`9X!xO1d9BoFFi=0$Z= z9D)7;bJv_a1N#Te<3%~~95AOge#RXzzfQgf%(dc>ed0P`-ko~NzF7~Nb6bDech>{) zWXX=s?%I%^jo+?^AYUVwA9u|t4(Tf{9V17UTCKCYPQ=GLC3M`ickbNza_7jM7ss!e3)xrRPMinS*{!WxPbc?CuDV5h6^SFS z_sjg#uFo7bY*Or-F*BYWJ8z<)e>|has!(c7>)*I})lb8E z7@cy%d#pNs%myRxI%dPFh9gTD`J3}5u6py0n~j`tt7?s%(Lwf)ns)svY#I5UT}7gb zOY+tuZ!$l(%l?~hl#HVPtmI|Ue+J)@6H65Pt0b3w#UZ)u6OWPiOvGd4=MWFM7EG4#h)UA*Y_w&y-wqW$V8xVc*D!OYvmN&WPbX zG8KpPb+&Wuk23Kax#Hh9HL)I+jhWFwaY$eDrZ}AX7`fsav+MZK*TpZ1eOUMORqfJ4 zhMs-q_Ek&jR5di`D14@L_T~#k(K9sT%o>n<;F%{ypJ%*i$u(Xy_M#duT4#+Ht?SYg zt#KMJI*7;6@}u#Aex_q5WbI=w_3;*@?! za_q^Dp>-CY&@Ugdbx?l9W8{iw(8v{`x2vBWoBZMntIF3{VCY+ZibOk&zs}H{qwt32 zdi2B>`K%9p#+mwvzU8NQG{kt(Es$%xXzABvylB}GpU{s)r6(GDt2AD;;<55x_;K_@ z)(+>8V?U(v8p}9SpM?E*NaL;CiC=a?k}JO-sweXeX}shbM?8jBJg0rJIaIXU=vbdO z-&=L*nJWzaOL%bfoEEbU%{dBhXs$ZUbMz(yyzevE6>#UKtJTz30eD!*YRuWlhEHLxs6l$A<3oRJ14IY_KjTEZ5=d@ zc#K@}%-q)|{OZmI;RTVd(H7h47`niuSoBcxX`>5Vp5!e{Um)UaY(MSOV=U}$u-WU$tx!N^5fEqLvqFC z(uyO{54p7B2<(SkT6GEHF*UNZ;*cG5O-z<{@-;C@jvo_;=!%oV2hdIprEhC1n}!bT zCuwRDwlTOgH8FCHb7}dOU)gqPYGUL;eUh|zK6f*7Smcos%k&xCt%K*aPSJVSfucq9 zyAK_DzfAnrEIa%PU!rh7ztr!FQ;@1bY7L~;z`tV+{E$&Iy!qCt9oVkI8=768S*$~i zaFZRaGTROA5H7uQW#$D}4hgr|Q$93r;K1t^b@YXpzud+iUr;H9y?RRbH!Urx5 zSB$-d=u4jidUa@JsV!sOeM-jX1FD6I%*t27$$?*^#`I+j`qN+xptN+IreL+WNV5(->PPTOV5&TMt_Yo4?K5=4&NQF^Slt`b zfI?t(R!jqmfQxuV!9}TVqRT>>>62KJ6<6FVNzb@a;4+*`(#^08SX~WE(%Y{bxB};r z^bM>4uEe>d=~1XYij|?O(2uYha0K`Wx(!wXYJh8yNj0D*SUm-+0ad`Y=*U+Gs0*%( ztPW5UToc_oKs|6hx&+n%YJnTj|F03y*mVAD0&YTwzD7V(a8r6jH3E(XAB}D!uQ~np zS^zD<>c!UrXbo(%8q()Zo%h;-)p4&4piX-o=#JM0Xaa76 zZX5d7RrSI^6>t?|4+9Z!1l_Rd#usL6JLq=khRLxu-}R{Nbp)$-UKY?9+!@_0AOenH zBMYbt?n3Ncf#%@m`0NT~f-}+W3Umf{#zt453%D(@cLN%L8&HF8KzDF=I_Y&Y-SoQA zF|QqTJ9N7-M^(LEKnNT{)(hwf?ul+Mpf|WTbJzd#Fcdu8JDu;eo$j3h zKEoRc9_ft&k3x3@Fbq5l8zX?>;L+Zh-dVsH@ECla1q=ZXLH8_R6nGRi&H_e*PbHSI zz}euly>r0lc;|x8rJK=M;C%4;*d7a<3LfWOK%d?Vyb0h5-bC<3??Ui}=#B@@1)qzJ z@xVCnMc&2UCBUWNOTEj$mwA_iFGu$h;6m_)*ti6^2z&*(P6CF5hvRb+a6b5abSD9q zgD=O%B;X401Y*esCW9w?SAwtfrhuo=u{j&K8hkajvw;cVYrJc{>wxRQ*VFOvI$$bz zD!SJJQ@~TOaUF0Cc$#-3-;cS`yBT~l9er*BZUx_p?oGf{@KkKv1WW@@C)XLkMc|9@ zIRm&Fd^Nf=fLp=0Vq*p{9eh2p%mi)&-$wW2nZWJf+r8P~+1?%CJFqpH0JsKx4K;fJmdND5!tOl?4)_~V|Yr$*LjRPydE3gpunxT5+ralmH+Y-CoA9|2cozIDx*LI)z%OBABd{L4npj>2 zHiI|Q(feg!3wVq7D)?3JHSlZLei>K|-s-*Xy#Z_kZ}Z*+zv;aNehb|1wf{3*6S0=9ua^FH^!0KNo&>3s$M%KIAp zHM(B_JHb1#@dfZ1_#1B*@7KG$@4(-A--EyRegOY~?zh0#;IFaqE$|KaM{?Z_ybXRE zpSyui!JneL8~6eI12%R8KZ3s`mOa2;@Lq2pc%SzZ_$TjY@Xy{a;9s!42lx{FD{JjH z;A!yF%VlC_kJbypngMI$Wc)yqC|BU=+#_b1Ifmfls zpLhIS^dQ(pF6sU^_)Pb|!hgE|3%coy;m?y9?}L3mA9ydZ=l4ISR{8zUs9Ao0hgZPQ z?-%e3f(!bEz=iyM$oG+7e*a_Us<8h$YooBgl{He>f5j`}7xs&wTNo$+E`W`~z{lXt ztj(f+jC-M|ALX7X>M!?-`9=L==oSTvfQw+GD6kp4jM^0Umy&yN|5s{I9KVJ9;>1u8 zT##|af#t}TbH5hnD~TJt62N-!dhUr5{)=8ozl2}XF9j~;mj;(6*AjpSeu1@F#($2r zSH}Nw;WIw zToxPUfOo;)vDPY3|9pN0>g$7j{8s=t;AxE5S(;7D*CxVk`Xa6P#CKwWTUEH?lef~&zb0vdp;!!-sP zfivKm0FA*%!W{)P0oR6W3LFKl3)c*23a$@#G|&v(0L#sRW5A8zS^&+#jp14XEx=9S zS^+J=N5QoQT7jFwwE9{?WU4+IZHx353QAMBq1 zoCrSA9|9iYp9DS$-4lTR;QrV+0T=`x>YwbN0-Opy)jthh zc({MMKLR)ddaB`0}sQ-2w*t)L}D2Ui~^7HM}tTEXM)f4&jO$2j{%Rt z_DJAF@L2zB{~X|4@VWkZ;Pd?R!RMoU4sa&;Ol+J3j0KPLFYw0$6TlPviQtL;h2RU( z9S@ujJ|7$7fpOrA$n|1iD0nD7F9ybd$Dn&La3T0YY+MXn1U{EoE&(nDU+P~5zRbTI ze7S!G_zHg#coMcR0nP=lzQLago{H{uz}4WZv2h)64R{*4-Uy5XkHhDUz$EY_bZ-Qvf~R8RMqnCv3bEV- z+zh_izXg1Ye=GP_e>!-&KLb1i+cyDIz%yBEw*h^?eVE(ZfLY*K=-vk03ceK^w*fQ3 zXRsD-2WEq3`*(ov@b3iQiSF&dEbuIB+zy-pzKdM%2Ce~LgU`Ex8Q>Y{-VNLdz7rdF z19yRMCiZ)PY;ZO;y9c-ze6N2W_&$FQcn-1L1KbS0l)1Ve7z-ZD8o3{s3!aPa{lLB8 zd$Dmpa4C2cYx4nM5O@&x!~?)Q@H})M0Oo?{V&ef|6!bNDbG`_86#OWc~0^fzt$AE{y z52O1S@F@6EY&-^B4}RQ#!e0zL34YRF0$$=j1%AqZ8vL}s6ui`b2K)@Vi~VK(a(@M| z61>uX7W}Ng3cL#46~I&Ar?9aCSO$*zF+UEh2Cw$lfYUP&x30xyAI^4Ejc`y0R;{Egs^{wDAyY`+Ms z1i$QW_FnO zz^`HB4PYzyZF1cXM8Q#fZU;7jH=(;7cnka%HnszAgSQaNJHWf(cm4Ok@A>b8-}gTN zf8c)z{t(;m09(Kx`5*f`fSur-{wLs1{7=E3qPqilAN)Qxb^srNKl4BLzW}}jf9Zb( z{>uLv{585?0H11 z?}&Xr@DcbUYPKKn()e%V(tNO=mIh8s`yToC=$ zrK6t@@W5W$d&u8IH(%OItj+vs%efcwr!C{2$e*^vFOZf$tpK|Dfpl;>Hu3{6fuE!{ z1=F4&_kwAA@L3SwX=w$C!w36}D+nw>zJ&X=VA{{rrcl~*+zW-$)^Sf1N?YR>PAimF zIIRe{NLo>F(X?NX|3du=rLAUd7E6n<_KKyw%^ED0_NHGvtyo%dbc+Fn!G*C=3|I}` z##$(m_BwN2BJCUIyhPepe#x{FX(iDu0Tc%p$3_WY8~96VUn=c$YFjGpH)>o8zeUqZ z5knDh5yq7QzC!*L>#pV3X4V- z*VvIG_e6BokE(=VY-s5^a=yot)Q{*|U`PI}FZqiEcF=EZXz4mSaYrX+ z?dYr{u=y{I?b#)R!g~kT3V-(2R({vHEc`|KP;)L4Jv03D{KerpYYRnm?e|72jZWm3 z55wPdEF01Jq)RU~^ukZeL=?Z|PRubU=D3rWsdEs6p@Z1sPRwy9m$-ZcImVoLq}S8O$Q*9&Q!>Zu%MTfP*VVo?lLhAeF_T1WjWyGIig|L+uX*>lE*9h+u+pd)!K z@MUTq_|hE29A7c(OYz%yoUt*@z2-$S&4Fs77&OPC6`SO$r)Wpt%zdD*H53o*NFKLx z>=-(*6L;)befhQeu_|l)(9LUBMQ&bme|T?!Q$x3HjYclIhp&!|`udUZ zwg<99OQWle&hay@3vJr?T;#&&1L5VrRy6eczddSVmE8Myv7z5BwmM?vvpTIZ`m(d* z?U$0i@;|pR>FeWG>y0nPQ)JsFqoW+s2fb{@ie5Esy|IZ-)anp()Ugw_cJLLozKA*M z#B6BACLNoX>^QkcZSL}A>!X^)YrYcsK5K@liDKBZ<<_ujqB!roW3s8qdpln-v|_IN z{+1*y`AK)oOpbkY&2Uq5#Xs@6ki5 z$JQaR6Sa1fqvDh=)xn7~YU8vz%7q-wSmmgERnIe~HZw7+p7Leafa0-hVBlE|lWSn$ zoFfgb`H~#_X8ic9UIis*i=2W9;Bl+ zAiweztR=I?g0&QNd_}D<9z*p4qWom2n9bZNs#9+oMW@}$^t%tR{Z;u>5 z^lNjEyjbv#$Y*6gH*50s+wO`qx^|DL^XK2)WpuPA^>-GZ4Blndr0BV~|72<|dfjEe z8M;*DuB7~>iMJbl%~!<|^OC;W?3*6j}i9*Hd7{+_9cVi-B*U2~r* z&cerRGBqh(d7+^d^N=!&lC;Lkssk!36qW@x3bJ<^f!%8zRvR}4HV$YZT z>=Fx2ZDr@~V^)~^)auwe1a_jZy3_ z8c;mim(0AsJSVvZ9{BujLui9CXwfc@PBM)LQV->Tt zFS+NVq48bch-_Fs*3h-?KRL2#!UCi7 zQGpSWE#W7O{M2F}hF>eY)W{c2{WQF}N6g6gPg>vV%l#{i{DKo+X*G1nIwLPy?8BJV zKXK}(u^oZ_PjgO=Tl>ojjEGzNU+%v@J~xQ7@}u+PM+dPD?(|ChwjkzHyS@?M9mMIx zA9do7Ix$C`IHOK%Q74|L6GPPT8+Ck9*JKT&P7R|@t)fnSqE1bsP9367?olV-sFP## z)&BQHKEM20)iByOvOZFz^l^r6*M4y1rG@tz`ivXj4sUyRk)fw8Sl8<22NxT<^o?)F zth`kF!SVM3{Z;+%iT@thY!_J{ZxPsZe1#leA;(w9@fC7>g&bcY$5+Vl6>@xqW)*%r za`hdph%+PnY5xx+OMhq|88V`1c*(A}BQ;iZkKFyhv8>e{ktx^oG&<*J?&N$*Bx_m2 zaKq=f8@kq>lfy$l*=*<|&pqGJLyC8cB<0mx7=78PQ1$|2N4~y)H9P6+lK00OUy7$l z_7tNdn(WIR!@2-njJDWDHO!^vnv+jdL%nuaMeQ=7g zBORNU?AY98$L20ywmz!KtL?6jG`Q`FkaAI+uQi_=QcV=6_CM9+=sHskt(d#cyfH~j zzU`M)?%1ePhnQnO>eM0T)WOh!ov2fXm{W(C;t%5FooJa| zwRW62jXCokbLO4Tppt9DjI}u`-#xV&X@1#Tc9?l*exoK|;$eEt{I>2}FFB{h&p$Fr zOV0edV@(YMn<33(pkwN6<%&mZOl!%+9Qabq)|aCb)g0M4-&ygwS*wb<-h=cMq5g`Y zU%77#O~{_)s-bA`~Ku_L+lCH=sc z(YL-FdDO8Jb?is)ZLlG3@4Ma~tc}}yb8@HkaeHqba}0exf_-W2?pRzgXkRLP_DhD= z{xS08B--vvMjq@-vSarp`Lg?xdj z5BeZ!XXMDwlfJe+@I^A_TN{6vj9EH1FWIrV%Z|-mzHEIIr`?y7i`|!06MMg_CiZ?; z%ywTAZTBT-Y}Bbk%&~9gC8$Hpse_^IzU0&)=F}mk`0c)=9D_Kcs)LPFb+BYXtiyzzU|*6QyDvF&Ve+;6k~3d1 zXHH|zyvLk*H#)&OG_|t(lJd3pyYdb83f`Al^TA%BeC=ML*zCR}+U`rvSW`p0|2R6P z&Q`9N?Y?AU4tyzQ>&wxJDqkDt;EPt8wW@ul_)W{r+Sb1GQT1mGtvyF_yH`lx?n{!} zy~2@)96KS$eyC&3UDj9V#-iU@U!i9%`61~`a_dX_c3+a*`f}t^$4=C-&))7ud(w>f;inxTAR3%Q$aog&$mX3Yap+p3pGL&2o^%Akm}qb) z@)Z^YcI3m*fm=@5K`fH|=g>dReKhn~&xSD|+-g%2A8XUB*FeY4oAD`K ztAD5(I6BFkg50zYj7)Q^xlm4;W7SO&YK|3`Xswk%Kji4!7-dKDSYRiFotR_Ck+l`ri8*$nK|ER?F~wtT z>nvU%9|wyuQ48UmeNsM^gEKZNe*tKIOzfQPyqFkm>^6_Uj&u~8(Fx+0E!i=#>&$f% zyL2^PvC5u1KaNgv&J~LV>R@ds_M{EjQ$DgsOs2-7?LDSzk}Jj_R#V>~R+DcKtDP(9 z+PRV+LkF?ixiUJ|hRxU7(Rl02jt}Cr_m&xtj>$#il&5lZ&dIt4b<-NOvHZvGCt4S( zzUp<5b!YO|npU35J6K0%{v5fv#{xUa_2||{w4Lw7{O3G-B~SP_dzYPKqo2?{K&}{U zUA1PVulca+->e_El2eTiW{chC8=K8&T-0x8vr{ceX_=zp1_+L!KA9Z4mIdPhMKZq@6 z<01E$6GP1Ul}*Q&c@8Dw$a!wqcZR=PPF_*+iUoN^$t%XZC@Lay&KrQR`t<4gJe337pQ*0v&+nbo`0$5W8!`cYN2OVvX0Ig(>t1d2h%gn zyho#J_5{5P*!KbKnD;wpF7*DNgw*pf@vdvvo$BR2SM2+g_6fUwRkJ{zdT$TzW35x? zebxSqVD9-~eVTh-bv)QTAFNNK6Rb~TFIb<(j@GxeW!JZCCFU&g4jt&2pBBy~XSus$(!W`q|N}Yu32gPb9bR2D&D>=G*Qm!MvM2MYdII*$?JQx~Y9B z=d%m5AFHCOi(Rj_X2ChRUbW9i_kUquB8^D8lHt(rJoLp6?X}mHI`DfQsF8CvYw&;N ztXxu%szGWEq}D)c4W!mUY7P8vt^vKTq~O1&2C4h-fAc;}&1-62Q)?i#2L9R_;O{e& zy{V@SOnh2lKC%eVvi8SE9w?A6D)xvM&JEu?bcvxkhs0BV^VyBA507q-3?DTo@Bz@tEjmhJC&N&A zp?|zLwLGggby1+0=}cW5T-+-GE}c~XSMoPt7~;7vaJXd1Q$fNB2W&jPS+KI^59~`QW>ZMR$uGNKsB&B zTUR#Stt-W6(K zu`~zNJz8C`)!(`$SbeaYn?Bgh>4RMhx)!?4>1M5t*KJL|YW2Hr2V{aX(QRk?Gq+=G z3+NW;Ci+>c*L4;xSJcfq0(1g*LN@|rg4L&5y|6>z&g9w!s1H^*?=C=VaBFnC0P0|^ zuF+k9&fxaMqK?+x!0KS#)pW7$N>}Qh(CSj%6-e~KZV%m?)!N6b*gh=ELePZ{(wn*; z@_y*{VGUHE_jCpN{`Ln3fYp1tKcK$UeHq&yCb&o!Y&bvc^lffsG(-5E=_!#Eu6rcvU25aOLAko)a zovVj3?i8Q}SRKtzVNDjHn{yHFh0}m^aJuPTJ-_El%>k-z}3`X`U%9xO!% z>{6_~vw)+)M+beg)fszq&?~zvw7SZl#hPzG2kZvS^;n=IxZ^?kW;aHzZtr7RV_`a0 zhpFv(z=_}!O&{y?=~a9la5ngCY@7#Vfe+nV`=X$e_INr8UjnUO+T(%C!0M+x9=HO0 z1vbWeljw7;Uf7es>SaBdzSC2{>Ono3F3nei)v192c@l%l; zy7%>T)9HE!cm_SGZvxc&TK%ilds5RJvxC49#y6R0mmk!c%=?|^`(lfy`@&5oY9X#Ee16FV92Y~y*vx((FK)s*m z(@R<%rqyR!J)_k2x>2S0AQIX{8!qrgL8^{RdpSO`|{ zX7zGbM`m?mUIHuyFGY6=@C5h?Y%Bp5gP$SSWx!qFyYRUTcm%9|*2@5OaaL#DWq`Ul zs{{3NK>e82&v`lUELi=VmjmiY8^!i=;4!c|JFBnr8q?W%EqER%d7RbylZXb#;CLSPx#0?hC*=@H%X~0H_1>26Ej9ECw&e=SCn3j-snR&+6yA z9vkZLtS-=Nh-DM-GFaW6HvzAJ)!}&)@GAIKY;OYAfM28U^;Xk+d@Ji|CiG0Y^{V6Z z7O=WHt7GqG@Md(kvIgeT;dw57m2>xkPIQ4zbc&wI)tTt37xeRV!&Nuy?Z8^_TKsPZ zwt%K%akPk)S!9l*`tZPaEba6eeR#CHPfFs-iCJAu!@pONcMU>o>e*5>EH zGvH@fgP#NHRs99Jp97zOKf%W5z`fw7SPNeQ8^9Zw^DhB)iT(=RF9CJ9{sJ3c0#AX} zJ^X9nZLoS%e+_&F{tVr(0d>Ou3L9SoFM zc=>_d;N9rv_kW~iUVhV?IzK&=^FjYiECqe_e^wuAb(c=`nO4teb&pmL>0neb{IIGWZ6+nHL)q%PyPz{{u=&T;j>g!ws zT*J=*XJET3PztP0&b5Hr;6z7f^>9{S=NjM|jH?A40Y1X?1g=LX<_3UzJ2y1lm(|U= z0Z;>6gK-UjI$(7QZa~-Na&%i(zv`oa(%{ngSGVUH;2MlO3TOmwglpw7@O{as!w;2ZEatf^Maulg~!Mz|4CuF5Ks;;^DV4mxs@rIVYU8Eo9E!$My>E=y7Mb zXR&Y0wY}5ln)7K3*Xd{Dh|agXGsMvQpWJVMUXJW8Rn+)haO?E2m4Dp->yY&2z!}yqECuZ&7BW8W! zJH~Juv!P{2IyNuaadM|GN+Ngpvh`7%bqZV<(OEethAzab+!QB1Jk?~Rwg-9IAaq;Q9QD_^84Zu`4YYT9WNrA=tQj!F-ILc zQELZZQR|DCqfX3*mL2KXyky78J!*58FIyi|lX~SMpFZEv)I>2Xzpg<3uC8io za^I#3hE~j9H>{GRCGWYbQF826lZ%_0EB-gm$(N`(_6K(=rW{Qj9=|a0te5@zMSeAF zPj-H+QZ!iy>DW31cA~EYc9f&ylrPo6i8E^Bv^vU#9L-qesC-q=-|pMRGcz%F@@3b6 z;<0OB*nlrgY^w9RJ3cnF=1X#oRh@%4%^FMQ%Nmn?<*Pc|e6?n5zFJGNW9P!=tNBXi z8`x1U)|Z|4AWk#yK|E${$d2;0IV#_bOYaD){)$=g1a%839y`BNn$9$|=J%8FHzsMx zH7|B-P)}o1^_0GJvyEXqK>bq^`*RQJa(+&Y`nEZSZh`E#4(k_s=s0= z|6yH2D`v@6L($S#zE)pzRpAG6lzXiaWwv0iIDq%|p8d8_84 zRS(gt_peUMw~SwD^krvWt1U@izl7gN`daz=7UN6tTvGW>qa!=-{P?CBEBdQ5Uo|$h zKCO=KN5@Xo+R;2(Us|6|%!XFX(y@8Tj+1-T<}P2hKB`IolJA)NRkir}wxvo27qpEojf7G!bb?RW=rGh#bIM*_ zPx+o&@EJpkUv|RNNm_FGamJb&1~x;|4|F7tTDf8le1$Yej<2Zo<>;80ZJgRSR72U* znpVDwLHD6(`IKBW6fJ$_YxOlpx#S_oPROw@Iu`hnPAu>h(!S*QiaEYwfiI))__A`v zZ0$rH`oc zYx}VHUXs?1YN?v4_Q713{XCc>Lu;OxyCkjeV5yeQ*kt`wM`;H-hPGo}o35{5eq$P| zSb})8Ry9X9o`ZgONjd2IUOET!YxLc*!F>>wA3Oijwd*m6H+jF=`^M@kZs|DkkYk5y z*oiKK@|G)wgv>+JE-K zHsM#j65;m#>ro&i8d(raPHqXEfidY>9qHwa9cXC9?8rlozNu4SNB*oY`Li*gKhV&! zlQ?qnaclJNri1<8>=|~iNRCX-#W?viGs}%3z^$ zO00EVlROx!z1Fe?r^`2qk(fMETOp#yfQ?UwE1I23N);?(K>ged5EBU;@M%d<$u9=r$|1@-vb2uS8 zVE>nG$?d)>J9dAzc2pN@-_}UAHuEamiSapmo8onRnVMRC$Cs5S^V6819%e3`^^kf` zPV}45&j@zz!_K{6<}H{fy?cZO!CDHlmXdR6*N5hfdo=g@aL1;4`uzuf2S2qhCHJ>~ z+rGq&6FJy-@Ux2?`1|}%e}5$O&8g+XH+=F^=#gSo!x@_&3!OK+ez;EL_0VP64Z~Mm z`8NA*Bs_WOljh9*m^{a}=rhUeP&8V`=wCHyps_RPhY`lkEu#j9Wxvdvvy5KHth3EI z>!=gMyZnYm-v5j@Go>FJc4SEU{r5kTDLa+-+?FZ7zjv)_{7J5Oq^~%ouQ+8#@hk3C z&rdXQ$e-fZ*~%5?9dBG>{M)nayZQVpc;%tE6u;uNXDk0#$Metjr+KjR)4Z+zZ^Z1- zs0R6yXU&h~R!{X1uX<>lJzM$T9q%PKer?uW^GA1^b!N|2uCvyeJ>N2;Y^M0hO&;uE z?u+1TaGsYaq1-QfnZ!1`b>U{4Of_-OEzd(#%hM2Scm& zPYN$T<@y!R{+6-whMlw8m49wh_{960WQKPg(Z0#NCaXSPHz{1W$irEUORS9CSoBMt zp*e?s-G~u^Ojq2mAh|AAJ8(*D`=S5B_?d z|4BZ7f&2vvpck>a?(gJILug~v^|ia}uWm53B>zWA?{NQR)w3)u`B(kgM6BGQC6_+` z*G>H_OEXq>q;KSw#znSr6S#5Myb%Y7`I$T-xen#6x=hK=ZlA%~jd_2rgUkDKLF8aR zr$lnufejAh+o8qhmbto#>*SPNXAf0A*gAV6o*3oYa_xw=*Rr$p|2x{N_N==7**d!j zosGbcKn4Re=Kpt{Y2jo5c^-b6mrqU(vBsKl!JRMI)%^8v9Lo{ttbm43%0*jw1Ug&h z1&3ZUwr*aw){NCn%zJiNXG;M1PAJ&JsXI#M?tT<(_-xYU9)#H&!6|nR~vl zE&bf{ZtI|H8mF_q+bz&x_m?KQdM zYSzd&vgVPsY93j;R_!{qYS*n(w_ct44H`CR)UZM0Mva>^I;v^2rbjnx+WhF|#~j_f z#W5{f9@C;#%T}#hwrbP5P21LO+O=)hzHNuhP-Zxk83{+S!W}zx?$o7or>p2*!;i-L}jbv@TEv9+8 zX!zntpC8J^p<|9b=E%bX=iL`sJ!qiOacEZ_etPY-kvVIx&8-u2hVv@17j=|M+oofv*2f!wS^@-#Zc83|}tu6!dwUYcL4qkOGg_0fG{>^O8- ze&kOvIJAi+n4_5D3TVwQx;o7KMhuylM|+=IedhlVe~un!k?6`FOU28*wrX+r! z=+e8M>lPwbqwms+BTVZI<8!~l0#T_4n-?ha{Ggh zD_0%J)9ARgawShAcWLEH+(z!wii4bu+@+PP)jt%iT(zb(&ed_{%2jJrI)|dQZUwn@ zT)A@9I+l)0%fHsKlsY2`Zi)AsD+I&x^~*!$F>BL{nz%T7D+d7eMMFZ2D@ zSB7=o_FlK}{!dQ}i`QAac%j=qJ+v=HfwsQsgkTRq8{a)XDle~h| zyh`L|^O|Xd8gGIBFQ#OVNRIt@9C|g^W0F-ovZ47IPIOML@i=n3M@dim*vx(8B}>|0 zTJgw7o?&Emj*WOE@GDth-}7n&d1;*}4dunjIc!cje$&RySS5v#Bj1SV+KOf7V!qn^Zu9$NUI|T$X;omhwI(8}%4=IhOpFNNML*+cVfkMM<=^}^rr?AaEbiNm+Y@Z2kYYoKt&XssgDB9KIF!Z`r5**>UFHzjO2d zZ2u|y2d_ZxdC1Kld{j#Mk5=ID-T6|Prz()Dz(2ZA{BP-9{EhONzIF44e@0%LH%#9u zy9qD<3=b)rf2{(k`M32;?SQEYq$+UuR>1B9{~2fZiK%Dk<_!bi-Mr!8|LTvcKQ8h2 z+KJfpEKfXl6MVv!9V^|<8$NC(K4J5wmG)ZVoRHQZw|Rr-ozcTyldV}h6BdOxZ`iw2 z*F+C|*Z!?+VubMA49~l1rEub~cJxjl`r~Fdt>kOBg+$+Q!(V^@=&(0YCB<_&klUZ+ z?y-00FMFgDMX0lT?eC$Z#_lhBa_W?btixVaI8lY1C=c{$D?RYt#ArKLIr=$N{c&gX z@Vwmi64!6I;ii=zH_PG+x0^Sd(L;KFJmzN1&2ZO%JO5e*iGPakkE=2#YB~*!ORTDd zzH2cN{lQjc&iH>fb@=XlsmxOqNLAq9z5o2Ve?8L^&lLCP^{9FJ{`u%X)7ZQrv198Q zv3Wyc-=Afk@QM9g&ka3CJn!RX!hIIjZmTPzH%zbHcK`lg_Q*%6je4fq=U0x`gq0k8 zc@VcGm+x=$$%g5&H8(?i{c(L3%C39lj7(6&Dkb9hbl9iEq}OL*B4$aguKP@s&W7nd zF40+Itj?j%*6zp6hE>uS=_Pz@n4a@iqboUw9n<3yWpm&^H@5??h?~AOk&U&LsC4bN zs%)Qy($G7VGCc6PYAv}lWo4T;wE09;*4vQYaY}8RwKE#bQqH_sDluyM*2F5)JDuK) z4xb~n1EwmFs=(n}fx~B~`%ld@@tnH&n?JrgDB{<)_S>klo>Myi-G{Z?Z{us`cNV$r z&)S*z={FH&?yD*Ozr6y7@6MOXJXL{I1-v<_f2j(jDsZ?~V9wL2f2j(jDsZ?~;Bejd zQhBE;kg9+;=WyNkQhBE;kgC9(r&D`issgDB9KIDu?SZKZq$+UuR^ag6`BIsuDv+wc z;k)ytGEY??Re{tFn5sak0*7w}QafO(0;vidz7;rpcfM5SsS2bjaQNa&d8z`b3LL&WUn=ud1yU6#?RgmkPUx%uuP%MW z1-@;>=4C?(28{B&)2Db|&K1wghde#FE*&Yh(fR-9NcA5`Rp9Wez-;s8G22U=|IYle znKftrVl2<@v$ov32lzpjG3VolF8=1;{e_+^wpP81{+2hOL>|U^v#sUcmEEN~Pc;9> zhT_PYGi;8|SI(I`XT_dsbgbUL_hfae-n)O-U-pmPxpS^G_J_^MnsfR7llSl6wSRB5 zy({)$f4?f6p{uGfx+i|K&2;lF_ii)O@9Ho65A0g|#nu*jQu%-UP{y1noumI?pBT!$ z+h?s}nZG#e@0|G@Ti6cb$&sa~R0UEMNLAoJqXOEW*rjSe{D=MVABj)<8~?gIJbi1h z&l!I1oKjo8*&EhOV25Y-H%IM{&Zsz}A^7*vk`k z4$NToV=KMcyVkZTF(H44o3~%#%~p)1OixGIOT-y{Uv!5Bcb-!zw6yrF{Q5T`zq*ql z-qj|wt^B<&bXbs(&oc4^Ui$yq`w}=QitGPkVYzi7h^``sM7-d~p@6Wn+9-;m2nO&V z374`W5m-eQB@vwHFBmT{#vmaCH{=i#5fDMxkwb`}5m`+XQPfSuM5D;6C?Fv7|9-pX zO?B7wZ13e?elp#knyOdz>UEv3-g{Nu1FWL#?K8H|U|PxamD5RwSM&1q&y~J2Y7ygC zB3}F*FYS0Kx;(mE{OvR5UPl_k2Iihi96r-~=XT!Pf$^`me!XQ-I^zuelIcQs{d3LB zM=dISN6II@E}i*(z2)nzHT}7G{;*@^*$B6xdvfz>C2YZ_8`y4YPAS54GH!%!QFgDR zw@=TXWhmM6PB4m-9eTj-|s-O{G-|9`x7PYIu~0M9*f@9wv@PoK7_2yM!^+@9NKux$M~ws<4V zf1_CQI>+FSg>lF_rv6jX^ndSubEeFhc+R8o@;OuTo|gXE@zT4`aU7(S8_#&~)eH5! zL^vfq(T)-ykI#?44LR${S5JP7|MRhab^VQ`+x`7`eAJ@P-eH-Wy^7i;%dbcLi|bjJ zqJImWTJuq2a1~wd(9+l1Q>|9X(9N{KVb=nj&72Y1$E<7y4ah2`%p2eoJT|T*e=o7` zDE`M=AFby<4aMVHtD9dMFF!Cdw&%UP7R}n2|LBUA z-j(A^tRi26;|rhH_~v)}^zAbYPb}zj-+py3T zpR$a%|I1%gb29xet(xlF{cXdkIf7#-t8olSY9;!AdTsQ7{@#z)v+p_o{_)lw#Rq1_ z%Zsvedy>4McH#F zQnuzZr(T!B|Ej)@3r9`lqbdt12CRzbOof{B(5D?Lnu42#hY!`PUIe&zR>mhew^8O?%ZVkg|7HQSA5D2lp&;? zQUZZ(e$BO?GJx9~Sb?Q|)A>S2wau4{sH%E2Dp7QajSXI0+)uo!rr(1w+iIt=1 z-!G!a+&+fxtpD}TCqHUDX*JrmVM#mrv1#!qUCZ%-+4+waWv_7=^qTVAp0KGx7j{AX zXz6>@A}>rEZYrNPwp-frL|>-umv&S?uUg@;%?76neOa$5DUdGp0orh-Jn4L|?KkN8 zwmxTNm+ppJNY}=1R=U+l%kn$wf@8o|ah3D5L zpzWV~0J=1#F>T#8{co?|91oT1|AfAr>Hkds2hBe-KQr^6bG7R8pW1`judDw2FA1Fg z*a3mu!QBvdmBD_KURfwFB&-Osq6GQ}W@8s6JAd)CIQL(kd}}srCzMg+d)Ht;F;#xi ztI`oGA9&>=S+8Ax!@_CUQ)7E^ANRD9621SsXMTM4YsdV1W-Rwuy`sFoYC=pEKau3$ zYR+z0t!Nu>wz(``u#~%b+$rX+B1ewq_v!clWWB1cFM2ZPes%VLtNUEZ$LAUzQ}z8{ zLr1TOHf+yV86;Iu@W8r-6C%G_B>GA~h_C0K|6XP>*hO6GH4NG8?!LHNX z>v~Pm`^;hczgX$djh9oCr_{9~d;X@`+4fG9^l6YU{U!QeX8$*{|C`zWH|Gl|LudB? z#Y&gz+xtg0oSGvzM(lr*T8aIC_nd|YKXd*g#rhh=@%?dO{6D(90owI<%j5Cbo*1-D z?$j19AGL_*EAQV*nL+Q+ra%8f{OIyiH^y-`^Q%OD#>^?_DNV`|?pf%>x|vv2y(@a^ zit34(x~pCBe7x;qxD zpSZUyVZUEcJRIj%d2_Yl325n+Vf|)j&z;|E3gOD^|Goe0f+eiI?Eh{+c!8EN+)`xr ze`SOR`_k^>i##j7#EU;0{gT=L7p_|jzMwCWA8puRRvgOg|H}w7^S(0kKRNFc=SysU zl$rlBB7=R?>N+IzUVJ-!_7OV&wS0EpR++`o<^8u%Hjq{goBz?}*^ndNTW#`hSRGxy zesw&qS5{fC`Q|QHRu}fHWA?Zfm~shMR>~2h;SS+U!=dC59Tfa3`|fIb2V{)- zc-sZ~yZe;$in*3^O%J7~B^kW;t7`^)SDv6O!J4y-T(gA^&ra}+slbW-p5*&l_Wlpw z{oF<3;_Ufl z_U1DC|K!p3{*mzQwEkgo{)cOIbUD{-Isdg|^}8=!w6(JHf6kQs^QUC@?kD3zYrWfN zaINN=&2{h&IIiVf)47&&O;6h{2_0K&;VbwaC-%DezN}tZ-JGGh!>GIIq=NT<z_N0$fO`gsa%-!{dBxok>%IZ(;wXGSWC7~HRh@b0D&GI)nMuOYJC5pa`X4=-2aymUy)Dl&RymCoAfR-&yMrEAUyjg`~T_se+tfL z&6zS6?>bJy&i0O%>fw#A`WyAfOsKo-l~vX++VW}B7dWha602%*rRQEkW#oo1x&i63 zA`6F3J~IGUa6)~a)#FJBzW*_7*M=oL%f~Z)I0JxF6Wgb#2mJ4U=T4dHp0gLZi)RH{ zW4vej`dn>~aLdWFggjHouel84Nsh!l{Ar%~<{3@hlfnR!lHjm|H=6c^8S)qdjFg6 zkom30>7mU2uSjT_{a=of#CXVj{~;;4%lOE=|Nl+A|8H9VusZ)Uy?W2uSo{ALfo)k99Lzq2-Vm*&#$It$zhFY+uIzk*6$UdAB4B}AJtzZK-3 z4>Od_Q}9IhTRoEIErGvW8R$rDfrKR24CBi^St#w0h_}YCq*mJ3U%}))65e~5$nWj) zIXu&_eFp3vaq zy_bw7|NJMHdA;QdeAAcf^~_k)4NW(cx!FqoLyzIo7x}IlzZJ}H2J>6N`Yal4;~%Z( zw}i=O_^n{~Jh$eTzO|SA#&7ky=e3zmt{{F8FUZ7YTHwfQ0lil0|LUpyx>?C~;(zr} z4(IIUKZ7J@A^s^&&q~_A66Y)Np6VSqpUM4~Cm{_D#}}@EANHKYym$XAC=vGMLEM6c z8rVPVr*`V(~@cZGScT+Rqe+KdV2XzA}KmSXJ;q5c{We>im zTa?ZJ4B~$Y@eNVNdH++Wy5~QNvcGJZd+zb4aQ|o~_6xxq%h--n%lUS&*pH&_cZB(S z>PEiv^HrSogE{5h-xuqG*nb4B?)%^Tn)J)>+_!ZUN^{zl&rzKUe-7KYcx|}y&Y$=}{l5Yapd9OGs_uRP?`BgTImNNe8|H5G?sQ=lY(jVGqukmeg{qEP5 zpkI`|ul4rnzumNZ>l5#g4ln+v5dTYP0ai1;|NCQ%%;D~T2D$$w#CgCQbEnv)Sbrn` ztB3ED9|On#^x=Q`=>PN~%yRPkr_?}5)#P{oE64-;=2qC;L^{7m=a!__IZIVblEKfk zK&AyUEs)Xz3Hit6QkCFnDfuhRQH37P{iw^r-vtl2)?QYYOk@pU&gj zjd8_i1<~6Z|1>Z@2saZ~-4>w85>IJo_Ko+dF7!7i>)=R2qpJ`>g)FwrT?DU$#Ve}86#^gRVea_*ZUvpTyoMG)_<5v|9qaTld?xK+H z=U;m-q>k^f@mbaS+W6u1_hZ=kYYPA08Q;OyRblc}jzOJId_zTZUsDQ`Qad3-S%++@Vd*x0 zRpBuDVd+(Uo{b----v#q`|0bE6u*pr_O-99cD=uTm@AuCZnNRA64>|}w#S2k2R#*! z)A_HQV*hPYZF~*;u~Q+FUx#druyh+=!_G4LYd>21QBb7y z2I&zDzvFj!y?mfpoqv1ca~c96|Y5mv82#RYY!Hs{3jt!o*C$GFmXSv)6p``dz@6YG-5Coy(Ti5EXLy{$`u@sD6v zUGT#Ek@$jWPORL6|H!VKn1fhj2hd|oKXE@=1#bo6x8hr4^A}t6o_3UYJ2yFVs#aoS zrNY!(y!I3uPR-$uvGE0#a@u~`{cD@h+3{!m_2Q?(LRb5y<;vH1+h4c6S9)albF`)08ebshtxSGt z5gCs*>@S^xxU$gM_%dcl#h3K8kUi)G_WD83_u@01aG4N=ueqs-uwj#;L&9w(-p03K8{dY7 zj^W=rB=O?g>D7ZN9dH#k>u@^y5-+~zc^y6BEJx7&__%; zT6mh!*ZEQ<`(U13{a9)k)GTWM*6WC&Yr`fbIAr7d*Ckm;q`d?->qT(L#<$_%T;5p9 z1zfZA#jqEac)zdZ!_UDrYjD;4%rCiJqG-8XxZl-UxGykXiS9>0APB=$p$@oV&5TziDU)FCNT;YKYF3M}%Tjc>!m_sUPS z3pmS!O57dGdba73v&P<9(?a64k}$97P15n>+i>t$O^u~xfz}T_>#1w%D;3j@*$-== zxhQ9wUN!OYcp=u}w#oH=F|^}CkKXQG-@IY;6^Kxm)^|KU692<3knL;TUB{9-pE44% zj?Pc3LR;wQED0ru^mGi}#aKu6MP1%2Pn5aQ2GfN2M7fFO%|(eQCsyj_<&T!1jon0B zM~vN8TQ^L*30;6kL z+i<#kzIe}S$#RrG;afjj5tqYEuXTx>t=#o(0@m_rh)=G=#G&IV4m!wL@h#=m{gG;4 zv|E(+8*((cDa4ijP^fVIrDR2&TP{jsTx;|#u^bQjbdrA^O4Tna*57S>8&1{t{q#)h zh(stc8kX{=lTZa)*PD6du3Ua;m$30E{9MW-a82{u>p>9gU3vK2#cz6Jf^wL+S=(;k zG;3SgR}w?boQ|vf;x`$qS2{+?B&BClu(thIG z1*ZdXf{PO~BX%1h(;QI6S}1s32d< znRbdk*+;7?8s_%<&~~m2!Z74rSO8cjXx9_gHree;bu5F(=lV&z0eg1? zy? ze)VB3Cz<>+ft;FRwLE;a)kZ&DuuE zB=wef@ofyDyVtc77`hUISW?0D$Qwdee4GBPZLFV2Id-aO&ZRr$L_ql=XPIB`PtBua z3O9CHpzQ<(!{jX7Sh`ckJIi>EfaeP2a+Vp5pE6e&*+`m;x<5yX+?*NY&vKh=U&g;m z*f|(?2yYP(I&mIq`J?8|CLL@(6>Wnh`9Z2p+L=ref0^r4mHixs|&PRW6!7d zO>LZdw%N@$(t;hLhD&``$CH-6Y`j#MyZ?e6$H@V|zMWc5e+(@H-d%gz7yR}H;(I%A zAK=|?TXm$qsc ziv#=5Yv1Mg^4goEe>GP&E1ke`*Scf)wX_BEdB>UH+w`Pd-<1CE>g&^33hJfhYqWMM zrAl4jsMm8XmD|R*;kaHs%LHF2v%at(B-i!wC-AI}-shFiN1j%Kug`ZRxS?kN2;Fo( z>jx^y99n8f$N^>S&jaZH1Ifpb4I}g@ooB_d)8M9P`Pw`BztZ3)aFjh$HC+Kkb8tVSMeYoYMYR=}l>7_=-&^fC5%XXr4qAxtLEV0|~ zMp)F6@(lCPZs2PAN$EqVh)=eyB|~Xv4O54x+)eq@E3Z-#^~$rAqf!~HVEw%^IW$N1IF`Q+Tic;kn z($|;SEAg&m%Df#qHvaBk$mMU16x;>loo zT9r#l5(*964o$i=1*>vTsXSJfgiXZcV2rjK@aYoI($FR%aJX-us4(v_uu`=Aa7LI* zpZJh@6sEsx>yMnqFjUBkIaVdVyw@PGU~-kAvtes}N$TAaZ{ypr;HC3zecgtIUScJ4 zK`%eC@oiXhJCox8Bw5a8UQBb#)zOrWT0devF*=QFsn(GNSFiKl{Q%cC;ZkNS>4=md zc~boZy3aG#eMajVNlqKqHVgBH1Mu9k%XtYK--d;*t{Y1&H^bhNh=eLd)v#b!H-BZv z_cx{g+xof<8-5=gvhi(LT2t@-YsidNy`FI0m77{WEdc_Djc<(Fk4TmHTnFWO)TU`W z5IS5v_1OT4(W|E5dwuU)gMyvT*ES1dZ_W$h_MxO^j zd%?PF)@>U$xio%ySf_aVnPGz;oNnVASdUBt>yXTM@x$ncrH9cEOE>gwecjG!ub4I* zTt6L430Z0!>vA&xz+@7mWXX3yKpUv1hUFxFPqy>x(R(0 z>t)lttE?_-(C-(pQBZFA()FdE4JP-!5@y&k6H7erex;WG%znSnIsE-#{k`(#4$f~{ z%3hf@EUQgAzoz;1s?2BU%Z9a->eW9rUzK{>_%^Kb8y#JqBfik7j=vjwqN4kYFLcG{ zu6RWkwH)r0%Vl<1C59*J<#YgL7XSW;U};~=8KpZ%J}2)KjC?L#&)M-JVM@G){q$2I z!PfGLma`bAcV$xX)5UOao;&3_eeJF;NjtJxp@KqsSKgefmlO4=xUvH-DSU>k@7iw7 z_tNz4x+x{Gz3;P`6dg)yT6B4lwyMh5pl{m-!{~>lvlL$X_Bi&Z>l4=+hbuDdH=g=Y zLejN@mV^}V`2gYt-GZ-AHIx}J5wi1e7e>GBpi|i1JmDahoX8MZ+hY%+jyfdq0t@{z zB+%j`uwZ87k z3T{dqdkp3C4V=U_`Fx?$eCgRFX2)d6hba=Jq-OMg^6_A)K>E<|d$SJsLt*)4Jf<7p z=1FDADeN7el3)0q4Tp_SmiG2drp!DuKwE@~(INdlf;V2<;xUF@p_7odO-PBU`Rg|v zY+7De>-&ao`Jq|cc&gBgqr<`b|2*BN-~5vtU6QsDiK!^Rls4V_E&BA|fh3v@ClgXm zY-_UsWdzk+2r)A^& z;ne+q>bTM>+`Ax@WPJ#0-Ie9hqt%aZ(-TT;A3gUZMxTzX*nY3=9RB+FA(kU?C50{T zSps5vcLDgOBIJh&LWS=RdhP6dm!D~*sjd2Y&yc0&K8{@aeK4Fqku^M3esEI+Kk1i2 zqVT-0D6LUlpSA_x`;aal^qvT)E@eBPy|US`jc>y?zJ`u&MhQY#lP|am69-HedIlV!Sfj8XmatqMI0?C?JQ$}FfA&YE9-WnAT0Id8sL5Zs}TLK z-#HM<+84Uo`eW=k67R=`M2!(xh_N7-;E6Bs;>&vt0;lsuOO$khlk1DDGnQ}T3oO2! zU*g5L^>rH#=GxNApCoq2g<7f~mfuj~=ubWOW>cihL0LjBlRsUEv%!3UL$EkLK7;Lm z5(Z^6xf821q=d@dQVvQKkS$sXEWS-e;>9=VA|XnQh6OL3ek9nk|8MZ^kS(EVSlUDE zSvD+GM9Z^b8{dX)e1XLeTXDklcRRn(72nP;@#5EXd{#ccw2a@Ea)@t_Z=M41?z)2) z;%fqB$@dMk^p}2o3tgTxDEo@G1^;EYUwSxL|F`k|)V=l@IWJ&i2%K(w>J}EPRQ+92 zs++&E`}bYa*q`nEQXcKgx*)zkl{RBz`xhLqAC~ULW!R=4mL5hwEIo{VSb7+JlTK+* zzw4lBGVFzQZ2J0Zd^^3euyAL=w_%A-=cmIr{5xI9udh=x)!M0klAX(bzKw6E+xof< z`?*yrWaHa#Y7T!4IhXf+S+D&*VM9sU?5Ncv)6?<+{W{XB`6T?{*2VA>Y6O+jL`m09ZH^}Tw5i(MvpQhnlj@om^k z_nQcFy(3ST%Pxb&i*Kjb6c)PT+w>$}d^^3Su+SCXrYG^@+vzohHC^5QT66YO3AxKCd2M^XK>}NV|&fPc`~D-wgP_q*vSZIQ-#M-H&DF<<;YByB^Z- z;@k8kUi;+IwR@AUcdx*v?teacW$oUEK2Ph_F74W-=3T{Vk1}mWv;)XxQX86znTzeC&mz=rou%Eyx2a3K_;z|tVWCSYBzOg==@Tl>-(0D7 zL$4lmzEY~*PbT3varJ>uclB7M>Kp@yuw2;))Pw7jaH^eBy%5e^Rc(Q+s%Eh8y}iOd zBE2l!+3278s)1?@xQ?m|xGrKEsD`*3tD{toYO0P_-%%|sdK#>g=(-Mss{^WyK$Z0Mb4a&?OFtLC?NQ$bDAiFYWj0FL7^OM}rD}sxHV0;|P1=S1ts01u zjI4(?;xm|st$Z||(h@D(7_odVudGCSGF%_EY7Bh#RCb~sjIYhBrlYDh%W`kKpcbeeY1DP&>m!zPjd+dRkJ;QSRdrTpsXVw|s*kz|v8Spt zR5#T{osHPOs=GP|@s}WFh`LH$qa4*w4Mb>=x>Ai)W7PsC(6SLA48V zoq=cd28DA$V~`rEE>@SS@2lZ>T35t5c*2>Wd!D*n4OXMo7*HRou5;-XfZi?YM{1(F zP5l%!?@M3`lT?wKq3%|<;=Whir+$sJzo;kFBe<91J`IGsuZug#rF$PJ7vV{F<4Hny9-j0Bo-`39 z`zcCRfSTWel0Jlz{Rt(z2PK^cs2y6iBdC)vv{$Xss%N3?`k*wYx~)u3c^rDC5qc^I zJ=GpP(+NFuEPAR9dg@BF)>yP`Ka~C|v@~1xUeLZC&zp+posBa01*KE*q;9Co5KzAc znCGB2m*6?%0S)oXt1iY;Q#`2!#!h`ejld`Dt4;z>;#&c`J;v10iF_Ra^+1hIaN}Dg z=+sY)QkB4KiYJn9>E{Zq+VWY(+Q0O=rsrE0xM%~^jq6)Q7fVtPb?1yc3fMWQbpymS zL_4#UTY?5#oa=N{59{ThG^x~Bmqt}2+ zYhbrmr(xW5Mp`S3rM77Qvw+_lSPsU-MdU38uu97 zlhjQr3jZe8pRVr5{TnqMqxwGeuzC=qwOBo-=3?|NRLe28SEP_`FsH{Vt&4^!*xKg!MZBze3&h5DWgZm9trruQ_sQ2J@s&e&TwF|$y)hBSD zt9^LFPJ};GA0wVIpQ}CUOSK=rd-1#9rCSQh>+mF&Qs{2OlXl=qD^arNP_jiRDNFeZ zaNkDBUO-Nkau+Cn4$3?6q|flAy`W6Gdl0)HPh!c+ky?h5et?p)Wc!e|3nkr+lzC{e z$IxbXqa`0kTdqROZ9-Z8gceMr($f7KMcl5>Vi>r zHb!N0jLKs%F3EoyVN{a;oP=>lzLbMeH5{YrdWZ-9BsCmw@VIS%b$EY#gLc5G z(iLsd9jnP8@aZei553X85v(%b$67NS?O2GlV~V;HYsEe2uODG8nTQqT0jwbppA zXIHf9gQ*07;i875&(D#GacHP)he==)pHJGWvq%vVd?74VN3(~B^& zIlErKh<*xVXeCDc7L4&%+>!n+#_k6gt>x|vdJkin;ZHEacVi^4#yDGtk+&6dWgEsF z>8!^*eG}uJGxS4X?!?Ua9CLv)<74F71&CqJz}*OOM(#uSfI0~O073_Ge}(&y8^@4| zIi%va58~zCy+1)N*+J#;rAKQjrB7a*4s&ArKwkLXNJ;u^0qwH3U zO3G1#L8UWBX;+L&%2z`%LiI=`e>oAewlQWJc}yEuKROPxjCxZ;cSfepN;B))V`gzC z=~>pu4R=Vu%@cefbyk}ECKNn>IafJnIag)=YWQS#PMiFc)x8``^Aqw4@(l6{@(l74 z@)YtCuKAp+YzfX)&RNc7&S}nN&S}n7&RI&UoU@$EoYS1koYUkL2r=VO?XNeeS5wNZ00j#49^g{+CPwZBDoCto8~3tDdZ*ODVhsXT40NO445_e z+?~su)10fEv$~hoyK|Xynsb?Rn!JLupS*%RgS>=c@)GhC@(S_{@(S_{@)C0BXI#1K zkM3OMoaJ2QoaJ2RoaS8SoaS8RoYkvJH+L>`PIE4EPLo%VXOLHrXONeWr;wMBr;t~W zXOLHrXONeWr;wMBr|4PL3Uh(>89jeFr)53|&q_1vPQuJ0&mgZL&mb=$Pa!WMPYIrt zCcg=Jxr~XWtWKGovN~mU%JN+2Da-ST;TL&A9k(>p8RViqPkupJoiaORb;|6NXg|jt5asDEKiwU%kqDBbp`4ST35K=)g`D?XkB6w zD3H#dK$-McfimgejVC^a=gz}eB_AM{A%ED7G5dil(^HnGOix)|OADMCdx1m#Lw-WO zvI&2us4Gymr!GOAg1Q8C3d-tQX6KBge!v;@F`h!X z2Xax#*1~UFr(d8K_H;E_Dg&6x0={Gf-Ec&Olv)It6tJ>J*gK zDYI`!OH*d2EKix9vOHya%IcKaDXUXvrz}sIp0Ye;dg=<)8K^5zXP_=Yor1aqbqeYV z)ETHlh|WNrg1Q8C3d-t~*(s}2W~VGqnVzydWqQi$l-Vh(Q)Z_uPnn*wJY{<73e*{> zD^O>kEI&2us4Gx5r!K+yNnL_-l(IVG8)8mTW~VGq37fJ!=YH_4lv$*J zO*?ZvcjYB6?HO4nxfVlVC8^${v`vq)kG9oO=g|Cuw!Hdiac#4st&TQ3wia!B+LqTU z`A}^uOf6#rV3Ur{*A(rkZHjy@c@S-NwAs;CN1GjOd9>-#mPeZ&ZFRKS(N;&B9c_8E z>Cu))n;vb2v>DP?NSh&TiL@!wme>?w+6rkiq^*!PL)sE)o2M<2HbvU%XtSfOjy5~m z@I!J=*GMv!kt!wl&)FXw#!Dk2XEp3TZQ>t&lcD+7f9~q%Dy)McN8!Go-DM zHbdGHX;Y*vkv2u4OIsancC_V@E^T?V>Csk4n;mU+wAs;?N1GmPd9>-#R!Ey6ZH2TM zo(IabDbkimn<8z6v>6UXNog~rEs-`w+7f9~q^(X{LkrQ$q&E_+ItZ;i(6#B&R!5s1 zZFRKS(UwP>9&LH2qWvyHJZ*-w$kJv=TOw_Wv?bD}NLwLohO`yZW=LBiZHlxd(xymT z9c^~hPPNUB_F>wKkH*b@q@B5uJ0rQ8G7oKodXy>`j}|Q23K`Ft%Q;9}A}{(nlpLzQ zKt*Xj#3LTa`dV5*k=kb2R!h8z^>!XrCc{ zN}!EUD%yFDanrbG$2~Rfw{b6zdwQ}*D8Bs+?_QyuMwokb+_NKH?%9zx_w+c|*katP z#)<_~UFrd00wdPY^{o_#oAdCwozA8bk#MX(RtV4OcV3xKzsMJGYDi^HGl zoXFJ)?eq_@D6O;+H2{55b(nv^to%JXi%zhzb?XWo;* ziNUS*;F@>wyrESt2I(w^la$p>mLhEE`JZDT!B6Lt7sQgKB7I#GQdsJVHxx6WObgUT z3vldmzAV9f(c_r&!M>~WB+f?WTZP%RtjW_Z%@TKZ+SJ2g&bpEoIvmzP#`!)u#7L#E`8jgzF_nR<*8)!`Bre^;{#Fj7$X+$;EyHUeS(tvygfcBa9YK!_X$xwpm662- zpSaYd1uj8&nNM=@j#FyoYcL9_W7p)?y1P(_VV0}{*O4;NU!Bl>{ILc@@_PN1Y0K@! z(qW;rA|V3{EIzTGa$Clazcf*u*9M<7ZkRT?=@1w{$p}_)H6AS|HN`nHI>jK&AyUEpT|Yz^a6PqJ5E>Yg$%XRH^w0 z9ieN-OM1r7v_Pf>f?6PWe#(6MrhI!IOF1N7;OhE8Es=@Kw7`+l0@a;2- zN()qX-c&sw?Tgx0Phak;)A8rfXP(SCB%y1^`*Rsc@H2j<1&+iPFf$=|ety$!V$WkK zkHic7P5GJgSv6~Ud_th!fGdU$fnWC*_!xm){N4b+GjKuwzC$~~C(Qq9@P3D&0C7y| za&q#^qtWjoOguM6dkKPF{S5Q_}2o=e9|wI{RMj;H>F& zvNL>sd*|BvCpn{UYU{jL*4mjq_(Ui6!U;~Ne#bkbo{{>+0+C z2kSaN?N`?sQ=H}WZj$B9x~q=!Maw$Qmn)Rh@do9zI!ifMCvPRe=b9OXRtJ>@jM9_c>?{%@7j;~C}r_ig1&$*SZ0^Yl8-{|v3;jQnXG z=eDJF&`x!npPi89OdXQtjGL9^4BL|BT-vOz)9;G9&Vb+6b*}xOt~0Y|J?HOt)pO2z ztDf`JS=r7HW@bB`c4j+gTvp%t{?hu+y4(iNs5=`t&ZiBW(bqI|Uf9~unKrPI6MdnP z^ZG@Nof$7Qc78FiiF0sk6X(TinmTnqYw9fg-=my0Cmikcf9hyw;P-NzS3b>gUi(!u zXVf{(ouUt#JI6o#9q01?Eu7Zz7S4>7$2c>KS~__>k9B75hg*M~bMDMsXTk8}opoJL zaOO5><@9{FmD7CfiO!N=w|0)6)W(^1aa-r|*6p0vKWXQT*>IB6|5xpu*RT7oGZOvS zy>SQU(YHD{jh39^JpR9@I{*6qY0myLPj~tsb%xXS!!w*MFLZPseY}%%@WKCa+Dz;0 zjJTnT(`-an=gup-IgJOO>3lKdEN9LSx;y8O>)~89t*5i+;j^9Juj=Le_TAo2uND#K zub1XKzr61pXYXt0I_I6%$60^pdCp58obN2V>H_DlFJI^k9eR&Bb{H&8{<6Q<3~>9cZE*lKTLMs&zkBya>s4Xq4%dd zukO9wQ7T$Rm*fur_XCU0jj7c?j;Z*aF?H2FvFO+bVyfHhm|FImnEJRl7A^Z@EPBtM zW6_VFh^fZQV$ru(#MBKXvFPH}vFM_8vFNoMV$oNgi>WU+#niSJV$s4EV`|;zSoHaq zV$r*|#G+ZHG1UXEE!_GoG1VGzU0;f+uYmW{zr~_!p2xE`#-gMD8jEgvHm3fw2IYyx zq61dOq7OY4Q@>ggQv)9d-lH+~-vzPg-+miY1#@E2l@G?E8}5rm@0t;d){Vy0jgw;P z(lIeL`-+$v+%Kl4_r$YKiK&h)W9rX!W2*a(618u2iJJFtiRv?|L^aDPQ4dU9rPS7* zs?QI5sp1X2)XPnKt544Et)kcVR&(y^t%`r!TdiBxTdBYGR@eU%X?uFBm+R-L?%&B% z3tPiKJx@K~Jx@*Ulczcj$W!~S%2O|2o2S+l!u=#qy?1Ax+H-fFYWe^^`!_pJT{$mL z{d_^5TE8$)Wi8HA1DEHi1+hGJ@Yy^y>iImic}t$^^ID!-vpr8;@GfY5kf*LM&r|jH zeyo=>fYlcD!X+=-Ptap>YWVu)QD=? zF{1v^Iik)!GooJV5mDoMM^wXeBI@xz5jFIJh*B3v)RIdhYRsUBYBMCF-n=rR=6ye+ zw*N4q9)UmN>WC^t+&_j!)Llrwe{e+o`+E^J6Yl45ufg4nxNDI1d*Ji{?(xVo2zj@H z#^R9?^~N<3b;WfN)&55j)n{TvJvj+^ZUMd9BGE6Rk?1RTg3gRcH0z#7^s4(K(X9_e z)U<~p(aYvURKIzV=-6W9`9nl?cq|fKwcbnzZLF>QMK;2s9JhoR29R`nio~m;C=*m)#Fjs7p^m0 zE?nJbqH1R>s$PRz1NWyFqiQDH6u9AV7r=FdYYw;XZ&CFQ++X4T4EGDTTi}Mn^@Tef zt{L3k7ozHIxaZ&=hkIyMRNV$w05=fsY`Bvii>fAYdlp93yK|yy3tSBDv7blP!*Da; zrra7;W8sEfA5{b3oU5a%JKPx;M^!tx++HZxX`lmFKNod@Qw{0R{~lKdVY)21x^UTW z_2C-AHG*rBi|@L@HG}&OTuZoIxK?m&;7)?;0CyT(r_+?`2G;|wH{7{!ec>*Ky9{m! z+|_U+dMPyq?gqG<;BJMx9c~8P{csP#&4c^H#Y#O6_Y~Y}xQ%e7aNFSi1@{r$7gs}u zg=;hn-xq{y19v)HcQ^;`Qn;(eDRnJeA>3_nKZpAj-0$I*z^#FM5$+AR_u)Q=tMenJ za^OycI~}ekTwl1$;fBNA0Cy|g&)|LuR}A+A+%rE02ZehB?tQpDaM?dWyTNt17i|M~ zA>5U4W8tR$MyY$@=EE(8`|Dp&Ke&(KvK~iUKciG6Z0jS#o`qMFRx^0fVfEWN>9c=&+;7HKhc5M(xC2TMdPe$lO z7pki+0-O)TR)G1Xzw-dEgRZ9jTB=S#xIG*%Pq*j@{JxyizYqQr&vUI?2jE#9aqI>3 znVscGkU{9!3mW3LDcsSM-^_#OUIlmjB}NBsaQ?HC|F-%srF-(|FzU~5tzJ22#LPdJ z&?$97U%;yo&ZEO-Eu(<`DMK*Yz^xEv;J@4IXEk;R%(=7kRV8$6XFks0 z6RP-G-ag5i^vl)HPrWlj2QGX58}+xGGjP%?C3H%?$v*M)!Rh`sR0aMvjy~W|k3M0g zZ?@7u^r!c!=kJ3)E&P3ida=A0-1(CTol<-2PQ{=r;=sdY_X)>-#aG4c#IE-C$+`zS z=F_o#-^+QS&%y^f=F?p>dg8=_Nqq|^PA-@@d1SY)>ii)iuPGceb!1mJc-{EI!byqn z_`)QxJ$ z4F%&1CXXI}-o$YeMo%7BI8j|W?&fjVj2l00@>COd+33jylg4?mCQMEi3&CWu5SC&g zD8*thQ7jizu}13pg3)78h_Qu=iK_q2?vuwCsLKj&zP{k*A9NkwIVG-JK-`%Dac2d@ zbq|Q^5fInY8`stS((+mOdT|fcQ%O7A{DbzWQ=(tm5AQ7TeGA7IPU?K&gmE|D%%+rR zjV_H;S^PvpRu(KTlku9_E& zyY9N8n=v#K6CtEWgVEDfGZ;HvHPc|Hsb(;Cx@r!&vEbUG@uMeot!zcpWk^@mbol8i zn-)J!b<^R8Rk&MKD{N;7tFVn9R^b%>r!ghwR3fuT$6;8nqsj!V7R^jedt+1UTtim>aScOyYLn>_JhgG;oRV!>~2&=G- zA6DTM{E!OU_@=@`3vQiUG^yaS(Kp^$Fv*pDhm4+Z@hB+K;GuTFN; z7}d#bnx2iiPO1g}p?UFWQSkt6t)LbPou2R=5m6D>uCZ}YvW*!XG1=o!(8b5i+^`o&0 MDvwobWH version.h diff --git a/branches/work/SD_AesCmac/OMakefile b/branches/work/SD_AesCmac/OMakefile deleted file mode 100644 index 203c656..0000000 --- a/branches/work/SD_AesCmac/OMakefile +++ /dev/null @@ -1,24 +0,0 @@ -#!/usr/bin/env omake -#---------------------------------------------------------------------------- -# Project: Horizon -# File: OMakefile -# -# Copyright (C)2009 Nintendo Co., Ltd. All rights reserved. -# -# These coded instructions, statements, and computer programs contain -# proprietary information of Nintendo of America Inc. and/or Nintendo -# Company Ltd., and are protected by Federal copyright law. They may -# not be disclosed to third parties or copied or duplicated in any form, -# in whole or in part, without the prior written consent of Nintendo. -# -# $Rev$ -#---------------------------------------------------------------------------- - -#.SUBDIRS: $(glob D, *) -.SUBDIRS: $(exist-dirs \ - common \ - ConsoleBackup \ - ConsoleRestore \ - ) - -DefineDefaultRules() diff --git a/branches/work/SD_AesCmac/OMakeroot b/branches/work/SD_AesCmac/OMakeroot deleted file mode 100644 index 7ee1cb5..0000000 --- a/branches/work/SD_AesCmac/OMakeroot +++ /dev/null @@ -1,73 +0,0 @@ -#!/usr/bin/env omake -#---------------------------------------------------------------------------- -# Project: Horizon -# File: OMakeroot -# -# Copyright (C)2009 Nintendo Co., Ltd. All rights reserved. -# -# These coded instructions, statements, and computer programs contain -# proprietary information of Nintendo of America Inc. and/or Nintendo -# Company Ltd., and are protected by Federal copyright law. They may -# not be disclosed to third parties or copied or duplicated in any form, -# in whole or in part, without the prior written consent of Nintendo. -# -# $Rev:$ -#---------------------------------------------------------------------------- - -# fBNgCAEgɂ‚Ă̐ -# -# a) \[XR[h[gfBNgɔzuꍇ -# : -# /OMakeroot -# /foo/bar/OMakefile -# -# : -# OMakefile ƓfBNgȉ objects images ܂B -# -# /foo/bar/objects/... -# /foo/bar/images/.. -# -# -# b) \[XR[h sources ȉɔzuꍇ -# : -# /OMakeroot -# /sources/foo/bar/OMakefile -# -# : -# [gfBNgȉ objects images ܂B -# -# /objects/foo/bar/... -# /images/foo/bar/... -# -# - -# [g‹ϐ̎擾 -public.HORIZON_ROOT = -if $(defined-env HORIZON_ROOT) - HORIZON_ROOT = $(absname $(getenv HORIZON_ROOT)) - export - -if $(defined-env CTRSDK_ROOT) - CTRSDK_ROOT = $(absname $(getenv CTRSDK_ROOT)) - if $(and $(defined-env HORIZON_ROOT), $(not $(equal $(HORIZON_ROOT), $(CTRSDK_ROOT)))) - eprintln(HORIZON_ROOT CTRSDK_ROOT v܂BpXݒ肷邩Aǂ炩`ĉB) - exit(1) - HORIZON_ROOT = $(CTRSDK_ROOT) - export - -if $(not $(HORIZON_ROOT)) - eprintln($"$$CTRSDK_ROOT `Ă܂") - exit(1) - -include $(HORIZON_ROOT)/build/omake/commondefs - -DefineCommandVars() - -.PHONY: all build clean clobber -.PHONY: run run-scripts run-emumem - -# -# OMakefile ̓ǂݍ -# -.SUBDIRS: . - diff --git a/branches/work/SD_AesCmac/Readme.txt b/branches/work/SD_AesCmac/Readme.txt deleted file mode 100644 index 2f2f0d5..0000000 --- a/branches/work/SD_AesCmac/Readme.txt +++ /dev/null @@ -1,10 +0,0 @@ -yrh‹z - -ESDK -Horizon 0_14 branch r33437 - + Horizon trunk r33597cfgCu̕ύX}[W - + Horizon 1_0 branch r33839RepairTool.desc}[W - -Ecygwin -Esvnversion - diff --git a/branches/work/SD_AesCmac/common/Aes_define.h b/branches/work/SD_AesCmac/common/Aes_define.h deleted file mode 100644 index e79fe3e..0000000 --- a/branches/work/SD_AesCmac/common/Aes_define.h +++ /dev/null @@ -1,36 +0,0 @@ -/*---------------------------------------------------------------------------* - Project: Horizon - File: Aes_define.h - - Copyright 2009 Nintendo. All rights reserved. - - These coded instructions, statements, and computer programs contain - proprietary information of Nintendo of America Inc. and/or Nintendo - Company Ltd., and are protected by Federal copyright law. They may - not be disclosed to third parties or copied or duplicated in any form, - in whole or in part, without the prior written consent of Nintendo. - - $Rev$ - *---------------------------------------------------------------------------*/ - -#ifndef AES_DEFINE_H_ -#define AES_DEFINE_H_ - -#include - -namespace common -{ - const bit8 key[AES_KEY_SIZE] = - { - 0x81, 0x35, 0xc6, 0x54, 0x19, 0x1a, 0x47, 0x2a, - 0x6b, 0x78, 0xbe, 0x25, 0x90, 0xf6, 0xee, 0x74 - }; - - const bit8 cmacKey[AES_KEY_SIZE] = - { - 0x87, 0xdd, 0xc6, 0xd6, 0xf2, 0xe0, 0x2c, 0xa6, - 0x04, 0x21, 0x9c, 0x5e, 0x33, 0x8c, 0x3d, 0xaa - }; -} - -#endif /* AES_DEFINE_H_ */ diff --git a/branches/work/SD_AesCmac/common/CommonLogger.cpp b/branches/work/SD_AesCmac/common/CommonLogger.cpp deleted file mode 100644 index ffc63b1..0000000 --- a/branches/work/SD_AesCmac/common/CommonLogger.cpp +++ /dev/null @@ -1,117 +0,0 @@ -/*---------------------------------------------------------------------------* - Project: Horizon - File: CommonLogger.cpp - - Copyright 2009 Nintendo. All rights reserved. - - These coded instructions, statements, and computer programs contain - proprietary information of Nintendo of America Inc. and/or Nintendo - Company Ltd., and are protected by Federal copyright law. They may - not be disclosed to third parties or copied or duplicated in any form, - in whole or in part, without the prior written consent of Nintendo. - - $Rev$ - *---------------------------------------------------------------------------*/ - -#include "CommonLogger.h" -#include "LogConsole_Private.h" - -namespace common -{ - -namespace Logger -{ - -namespace -{ - static CommonLogger s_CommonLogger; - -} - -CommonLogger::CommonLogger() -{ - // TODO 自動生成されたコンストラクター・スタブ - -} - -CommonLogger::~CommonLogger() -{ - // TODO Auto-generated destructor stub -} - -void CommonLogger::Initialize(u32 width, u32 height, u32 maxLine, demo::RenderSystemDrawing* renderSystem) -{ - m_CriticalSection.Initialize(); - GetConsoleInstance()->Initialize(width, height, maxLine, renderSystem); -} - -void CommonLogger::Finalize() -{ - -} - -void CommonLogger::Print(const char* fmt, ...) -{ - nn::os::CriticalSection::ScopedLock lock(m_CriticalSection); - va_list vlist; - - va_start(vlist, fmt); - - nn::dbg::detail::VPrintf(fmt, vlist); - GetSdInstance()->Print(fmt, vlist); - GetConsoleInstance()->AddText(fmt, vlist); - - va_end(vlist); -} - -void CommonLogger::PrintResult(const char* fmt, ...) -{ - nn::os::CriticalSection::ScopedLock lock(m_CriticalSection); - va_list vlist; - - va_start(vlist, fmt); - - GetSdInstance()->Print(fmt, vlist); - - va_end(vlist); -} - -void CommonLogger::ClearLog() -{ - nn::os::CriticalSection::ScopedLock lock(m_CriticalSection); - GetSdInstance()->Clear(); -} - -void CommonLogger::ScrollUp() -{ - GetConsoleInstance()->ScrollUp(); -} - -void CommonLogger::ScrollDown() -{ - GetConsoleInstance()->ScrollDown(); -} - -void CommonLogger::ScrollToBegin() -{ - GetConsoleInstance()->ScrollToBegin(); -} - -void CommonLogger::ScrollToEnd() -{ - GetConsoleInstance()->ScrollToEnd(); -} - -void CommonLogger::DrawConsole() -{ - GetConsoleInstance()->Print(); -} - -CommonLogger* GetLoggerInstance() -{ - return &s_CommonLogger; -} - -} - -} diff --git a/branches/work/SD_AesCmac/common/CommonLogger.h b/branches/work/SD_AesCmac/common/CommonLogger.h deleted file mode 100644 index 2105eae..0000000 --- a/branches/work/SD_AesCmac/common/CommonLogger.h +++ /dev/null @@ -1,84 +0,0 @@ -/*---------------------------------------------------------------------------* - Project: Horizon - File: CommonLogger.h - - Copyright 2009 Nintendo. All rights reserved. - - These coded instructions, statements, and computer programs contain - proprietary information of Nintendo of America Inc. and/or Nintendo - Company Ltd., and are protected by Federal copyright law. They may - not be disclosed to third parties or copied or duplicated in any form, - in whole or in part, without the prior written consent of Nintendo. - - $Rev$ - *---------------------------------------------------------------------------*/ - -#ifndef COMMONLOGGER_H_ -#define COMMONLOGGER_H_ - -#include -#include "demo.h" - -#include "SdLogger.h" -#include "LogConsole.h" - -#define COMMON_LOGGER( ... ) (void)common::Logger::GetLoggerInstance()->Print(__VA_ARGS__) -#define COMMON_LOGGER_RESULT(result, func) \ - (void)nn::dbg::PrintResult(result); \ - (void)common::Logger::GetLoggerInstance()->PrintResult("Func = %s\n", func); \ - (void)common::Logger::GetLoggerInstance()->PrintResult("Result = %X\n", result.GetPrintableBits()); \ - -#define COMMON_LOGGER_RESULT_WITH_LINE(result, line, func) \ - (void)nn::dbg::detail::Printf("%s\n", func); \ - (void)nn::dbg::detail::Printf("%d\n", line); \ - (void)nn::dbg::PrintResult(result); \ - (void)common::Logger::GetLoggerInstance()->PrintResult("Func = %s\n", func); \ - (void)common::Logger::GetLoggerInstance()->PrintResult("line = %d\n", line); \ - (void)common::Logger::GetLoggerInstance()->PrintResult("Result = %X\n", result.GetPrintableBits()); \ - -#define COMMON_LOGGER_RESULT_IF_FAILED(result) \ - if(result.IsFailure()) \ - { \ - COMMON_LOGGER_RESULT(result, __func__); \ - } \ - -#define COMMON_LOGGER_RESULT_IF_FAILED_WITH_LINE(result) \ - if(result.IsFailure()) \ - { \ - COMMON_LOGGER_RESULT_WITH_LINE(result, __LINE__, __func__); \ - } \ - -namespace common -{ - -namespace Logger -{ - -class CommonLogger -{ -public: - CommonLogger(); - ~CommonLogger(); - - void Initialize(u32 width, u32 height, u32 maxLine, demo::RenderSystemDrawing* renderSystem); - void Finalize(); - - void Print(const char* fmt, ...); - void PrintResult(const char* fmt, ...); - void ClearLog(); - void ScrollUp(); - void ScrollDown(); - void ScrollToBegin(); - void ScrollToEnd(); - void DrawConsole(); -private: - nn::os::CriticalSection m_CriticalSection; -}; - -CommonLogger* GetLoggerInstance(); - -} - -} - -#endif /* COMMONLOGGER_H_ */ diff --git a/branches/work/SD_AesCmac/common/DrawSystemState.cpp b/branches/work/SD_AesCmac/common/DrawSystemState.cpp deleted file mode 100644 index b0206a0..0000000 --- a/branches/work/SD_AesCmac/common/DrawSystemState.cpp +++ /dev/null @@ -1,120 +0,0 @@ -/*---------------------------------------------------------------------------* - Project: Horizon - File: DrawSystemState.cpp - - Copyright 2009 Nintendo. All rights reserved. - - These coded instructions, statements, and computer programs contain - proprietary information of Nintendo of America Inc. and/or Nintendo - Company Ltd., and are protected by Federal copyright law. They may - not be disclosed to third parties or copied or duplicated in any form, - in whole or in part, without the prior written consent of Nintendo. - - $Rev$ - *---------------------------------------------------------------------------*/ - -#include "DrawSystemState.h" - -const u16 PROGRESS_MAX_LINES = 129; - -namespace common -{ - -u32 GetRenderTarget(u32 target, bool flip) -{ - if(flip) - { - if(target == NN_GX_DISPLAY0) - { - return NN_GX_DISPLAY1; - } - else - { - return NN_GX_DISPLAY0; - } - } - else - { - return target; - } -} - -void DrawSystemState -( - const char* toolName, - demo::RenderSystemDrawing& renderSystem, - nn::util::FloatColor titleColor, - bool flip, - std::string& adapterState, - const char* toolVersion, - common::VerDef* mVerData, - u8 batteryRemain, - u64 deviceId, - u64 friendCode, - u32 progress, - char8* macAddress, - ::std::vector& operationMessage, - nn::cfg::CTR::CfgRegionCode region, - u8* s_SerialNo -) -{ - // デフォルトで上画面に描画するもの - renderSystem.SetRenderTarget(GetRenderTarget(NN_GX_DISPLAY0, flip)); - renderSystem.SetClearColor(GetRenderTarget(NN_GX_DISPLAY0, flip), NORMAL_COLOR); - - - renderSystem.Clear(); - renderSystem.SetColor(1.f, 1.f, 1.f); - u32 line = 0; - - size_t fontSize = 8; - size_t spaceSize = fontSize + 2; - renderSystem.SetFontSize(fontSize); - - renderSystem.DrawText(0, line++ * spaceSize, "%s %s Rev.%s", toolName, __DATE__, toolVersion); - renderSystem.SetColor(titleColor.r, titleColor.g, titleColor.b); - renderSystem.FillRectangle(0, (line - 1) * spaceSize, 400, spaceSize); - renderSystem.SetColor(1.f, 1.f, 1.f); - renderSystem.DrawText(0, line++ * spaceSize, ""); - - fontSize += 2; - spaceSize = fontSize + 2; - renderSystem.SetFontSize(fontSize); - renderSystem.DrawText(0, line++ * spaceSize, "System Ver. %d.%d.%d-%d", mVerData->cup.majorVersion, mVerData->cup.minorVersion, mVerData->cup.microVersion, - mVerData->nup.majorVersion); - renderSystem.DrawText(0, line++ * spaceSize, "System Region %s", nn::cfg::CTR::GetRegionCodeA3(region)); - renderSystem.DrawText(0, line++ * spaceSize, "Serial No. %s", s_SerialNo); - renderSystem.DrawText(0, line++ * spaceSize, "Device ID %llu", deviceId); - renderSystem.DrawText(0, line++ * spaceSize, "MAC Address %s", macAddress); - renderSystem.DrawText(0, line++ * spaceSize, "Friend Code %04u-%04u-%04u", static_cast (friendCode - / 100000000ULL % 10000ULL), static_cast (friendCode / 10000ULL % 10000ULL), - static_cast (friendCode % 10000ULL)); - - renderSystem.DrawText(0, line++ * spaceSize, "Battery %d%%", batteryRemain); - renderSystem.DrawText(0, line++ * spaceSize, "AC Adaper %s", adapterState.c_str()); - renderSystem.DrawText(0, line++ * spaceSize, "Progress %02d%%", progress); - renderSystem.SetColor(0.f, 0.2f, 0.f); - renderSystem.DrawLine(19 * fontSize, (line - 1) * spaceSize, 19 * fontSize + PROGRESS_MAX_LINES, (line - 1) - * spaceSize); - renderSystem.DrawLine(19 * fontSize, (line - 1) * spaceSize, 19 * fontSize, (line) * spaceSize); - renderSystem.DrawLine(19 * fontSize, (line) * spaceSize, 19 * fontSize + PROGRESS_MAX_LINES, (line) * spaceSize); - renderSystem.DrawLine(19 * fontSize + PROGRESS_MAX_LINES, (line - 1) * spaceSize, 19 * fontSize - + PROGRESS_MAX_LINES, (line) * spaceSize + 1); - renderSystem.SetColor(0.f, 0.5f, 0.f); - renderSystem.FillRectangle(19 * fontSize, (line - 1) * spaceSize, progress * PROGRESS_MAX_LINES / 100 + 1, - spaceSize); - - renderSystem.SetColor(1.f, 1.f, 1.f); - renderSystem.DrawText(0, line++ * spaceSize, ""); - - ::std::vector::iterator it; - for (it = operationMessage.begin(); it != operationMessage.end(); it++) - { - renderSystem.DrawText(0, line++ * spaceSize, "%s", it->c_str()); - } - - fontSize -= 2; - renderSystem.SetFontSize(fontSize); -} - -} diff --git a/branches/work/SD_AesCmac/common/DrawSystemState.h b/branches/work/SD_AesCmac/common/DrawSystemState.h deleted file mode 100644 index b1240a2..0000000 --- a/branches/work/SD_AesCmac/common/DrawSystemState.h +++ /dev/null @@ -1,70 +0,0 @@ -/*---------------------------------------------------------------------------* - Project: Horizon - File: DrawSystemState.h - - Copyright 2009 Nintendo. All rights reserved. - - These coded instructions, statements, and computer programs contain - proprietary information of Nintendo of America Inc. and/or Nintendo - Company Ltd., and are protected by Federal copyright law. They may - not be disclosed to third parties or copied or duplicated in any form, - in whole or in part, without the prior written consent of Nintendo. - - $Rev$ - *---------------------------------------------------------------------------*/ - -#ifndef DRAWSYSTEMSTATE_H_ -#define DRAWSYSTEMSTATE_H_ - -#include -#include "demo.h" -#include -#include -#include -#include -#include -#include - -#include -#include - -#include "common_Types.h" - -// 描画色の定義 -#define WHITE_COLOR 1.f, 1.f, 1.f, 1.f -#define GRAY_COLOR 0.5, 0.5, 0.5, 1.f -#define RED_COLOR 1.f, 0.f, 0.f, 1.f -#define GREEN_COLOR 0.f, 1.f, 0.f, 1.f -#define BLUE_COLOR 0.f, 0.f, 1.f, 1.f -#define SUCCESS_COLOR 0.f, 0.6f,0.f, 1.f -#define FAIL_COLOR 0.6f, 0.f,0.f, 1.f -#define NORMAL_COLOR 0.f, 0.f, 0.f, 1.f - -namespace common -{ - -u32 GetRenderTarget(u32 target, bool flip = false); - -void DrawSystemState -( - const char* toolName, - demo::RenderSystemDrawing& renderSystem, - nn::util::FloatColor titleColor, - bool flip, - std::string& adapterState, - const char* toolVersion, - common::VerDef* mVerData, - u8 batteryRemain, - u64 deviceId, - u64 friendCode, - u32 progress, - char8* macAddress, - ::std::vector& operationMessage, - nn::cfg::CTR::CfgRegionCode region, - u8* s_SerialNo -); - -} - - -#endif /* DRAWSYSTEMSTATE_H_ */ diff --git a/branches/work/SD_AesCmac/common/FileChecker.cpp b/branches/work/SD_AesCmac/common/FileChecker.cpp deleted file mode 100644 index c7e1f97..0000000 --- a/branches/work/SD_AesCmac/common/FileChecker.cpp +++ /dev/null @@ -1,134 +0,0 @@ -/*---------------------------------------------------------------------------* - Project: Horizon - File: FileChecker.cpp - - Copyright 2009 Nintendo. All rights reserved. - - These coded instructions, statements, and computer programs contain - proprietary information of Nintendo of America Inc. and/or Nintendo - Company Ltd., and are protected by Federal copyright law. They may - not be disclosed to third parties or copied or duplicated in any form, - in whole or in part, without the prior written consent of Nintendo. - - $Rev$ - *---------------------------------------------------------------------------*/ - -#include -#include "FileChecker.h" -#include "SdMountManager.h" - -namespace common -{ - -bool s_FileExistsChecked[EXISTS_MAX]; -bool s_FileExistsCheckeResult[EXISTS_MAX]; - -bool CheckFileExists(const wchar_t* path) -{ - nn::Result result; - bool exist = false; - result = common::SdMountManager::Mount(); - - if (result.IsSuccess()) - { - nn::fs::FileInputStream fis; - - result = fis.TryInitialize(path); - if(result.IsSuccess()) - { - exist = true; - } - fis.Finalize(); - } - - common::SdMountManager::Unmount(); - - - return exist; -} - -bool ExistsFile(FileExistsCheck index) -{ - if(index > EXISTS_MAX) - { - NN_LOG("Invalid File index!!\n"); - return false; - } - - if(s_FileExistsChecked[index]) - { - return s_FileExistsCheckeResult[index]; - } - - s_FileExistsChecked[index] = true; - s_FileExistsCheckeResult[index] = CheckFileExists(FILENAME_TABLE[index]); - return s_FileExistsCheckeResult[index]; -} - -bool ExistsUpdateCheckedFile() -{ - return ExistsFile(EXISTS_UPDATE_FINISHED); -} - -bool ExistsSerialNumberFile() -{ - return ExistsFile(EXISTS_SERIAL_NUMBER); -} - -bool ExistsIVSFile() -{ - return ExistsFile(EXISTS_IVS); -} - -bool ExistsConsoleInitializedFile() -{ - // どちらかのファイルがあれば初期化済み - return ExistsFile(EXISTS_CONSOLE_INTIALIZED) || - ExistsFile(EXISTS_TRY_RESTORE_SAME_CONSOLE); -} - -bool ExistsWriteFinishedFile() -{ - return ExistsFile(EXISTS_WRITE_FINISHED); -} - -bool ExistsAPSetting() -{ - return ExistsFile(EXISTS_AP_SETTING); -} - -bool ExistsRtcSyncFinishedFile() -{ - return ExistsFile(EXISTS_RTC_SYNC_FINISHED); -} - -bool ExistsCountryLanguageFile() -{ - return ExistsFile(EXISTS_COUNTRY_LANGUAGE); -} - -bool ExistsTryRestoreSameConsoleFile() -{ - return ExistsFile(EXISTS_TRY_RESTORE_SAME_CONSOLE); -} - -bool ExistsVersionData() -{ - return ExistsFile(EXISTS_VERSION_DATA); -} - -bool ExistsRegionData() -{ - return ExistsFile(EXISTS_REGION_DATA); -} - -void InitializeFileCheck() -{ - for(u32 i = 0; i < EXISTS_MAX; i++) - { - s_FileExistsChecked[i] = false; - } -} - - -} diff --git a/branches/work/SD_AesCmac/common/FileChecker.h b/branches/work/SD_AesCmac/common/FileChecker.h deleted file mode 100644 index fc1ac42..0000000 --- a/branches/work/SD_AesCmac/common/FileChecker.h +++ /dev/null @@ -1,72 +0,0 @@ -/*---------------------------------------------------------------------------* - Project: Horizon - File: FileChecker.h - - Copyright 2009 Nintendo. All rights reserved. - - These coded instructions, statements, and computer programs contain - proprietary information of Nintendo of America Inc. and/or Nintendo - Company Ltd., and are protected by Federal copyright law. They may - not be disclosed to third parties or copied or duplicated in any form, - in whole or in part, without the prior written consent of Nintendo. - - $Rev$ - *---------------------------------------------------------------------------*/ - -#ifndef FILECHECKER_H_ -#define FILECHECKER_H_ - -#include "FileName.h" - -namespace common -{ - -typedef enum FILE_EXISTS_CHECK -{ - EXISTS_UPDATE_FINISHED, - EXISTS_SERIAL_NUMBER, - EXISTS_IVS, - EXISTS_CONSOLE_INTIALIZED, - EXISTS_WRITE_FINISHED, - EXISTS_AP_SETTING, - EXISTS_RTC_SYNC_FINISHED, - EXISTS_COUNTRY_LANGUAGE, - EXISTS_TRY_RESTORE_SAME_CONSOLE, - EXISTS_VERSION_DATA, - EXISTS_REGION_DATA, - EXISTS_MAX -} FileExistsCheck; - -const wchar_t* const FILENAME_TABLE[EXISTS_MAX] = -{ - common::UPDATE_CHECK_PATHNAME, - common::SERIAL_PATHNAME, - common::IVS_PATHNAME, - common::INITIALIZED_CHECK_PATHNAME, - common::WRITE_FINISHED_CHECK_PATHNAME, - common::AP_SETTING_PATHNAME, - common::RTC_SYNC_CHECK_PATHNAME, - common::COUNTRY_SETTING_PATHNAME, - common::TRY_RESTORE_SAME_CONSOLE_PATHNAME, - common::VERSION_DATA_PATHNAME, - common::REGION_DATA_PATHNAME -}; - -bool CheckFileExists(const wchar_t* path); -bool ExistsUpdateCheckedFile(); -bool ExistsSerialNumberFile(); -bool ExistsIVSFile(); -bool ExistsConsoleInitializedFile(); -bool ExistsWriteFinishedFile(); -bool ExistsAPSetting(); -bool ExistsRtcSyncFinishedFile(); -bool ExistsCountryLanguageFile(); -bool ExistsTryRestoreSameConsoleFile(); -bool ExistsVersionData(); -bool ExistsRegionData(); - -void InitializeFileCheck(); - -} - -#endif /* FILECHECKER_H_ */ diff --git a/branches/work/SD_AesCmac/common/FileName.h b/branches/work/SD_AesCmac/common/FileName.h deleted file mode 100644 index 531efee..0000000 --- a/branches/work/SD_AesCmac/common/FileName.h +++ /dev/null @@ -1,92 +0,0 @@ -/*---------------------------------------------------------------------------* - Project: Horizon - File: FileName.h - - Copyright 2009 Nintendo. All rights reserved. - - These coded instructions, statements, and computer programs contain - proprietary information of Nintendo of America Inc. and/or Nintendo - Company Ltd., and are protected by Federal copyright law. They may - not be disclosed to third parties or copied or duplicated in any form, - in whole or in part, without the prior written consent of Nintendo. - - $Rev$ - *---------------------------------------------------------------------------*/ - -#ifndef FILENAME_H_ -#define FILENAME_H_ - -#include - -namespace common -{ - -const char* const NAND_ARCHIVE_NAME = "nand:"; -const char* const SDMC_ARCHIVE_NAME = "sdmc:"; -const char* const NAND_TWL_PHOTO_ARCHIVE_NAME = "twlp:"; -const char* const NAND_TWL_SOUND_ARCHIVE_NAME = "twls:"; - -const wchar_t* const LOG_ROOT_DIRECTORY_PATH = L"sdmc:/CTR_Console_Repair"; -const wchar_t* const SD_SAVEDATA_ROOT_NAME = L"CTR_Console_Repair/CTRBackup/"; -const wchar_t* const SD_SAVEDATA_TWL_PHOTO_ROOT_NAME = L"CTR_Console_Repair/TWLPhotoBackup/"; -const wchar_t* const SD_SAVEDATA_TWL_SOUND_ROOT_NAME = L"CTR_Console_Repair/TWLSoundBackup/"; -const wchar_t* const NIM_SAVEDATA_DIRECTORY_NAME = L"sysdata/0001002c"; -const wchar_t* const LOG_PATHNAME = L"CTR_Console_Repair/Migration_Log.txt"; -const wchar_t* const LOG_FILENAME = L"Migration_Log.txt"; -const wchar_t* const COUNTRY_SETTING_PATHNAME = L"sdmc:/CTR_Console_Repair/CountrySetting.bin"; -const wchar_t* const AP_SETTING_FILENAME = L"CTR_Repair_Accsess_Point_Setting.txt"; -const wchar_t* const AP_SETTING_PATHNAME = L"sdmc:/CTR_Repair_Accsess_Point_Setting.txt"; -const wchar_t* const NOR_PATHNAME = L"sdmc:/CTR_Console_Repair/NtrNorSetting.bin"; -const wchar_t* const SERIAL_PATHNAME = L"sdmc:/CTR_Console_Repair/serial.bin"; -const wchar_t* const MCU_RTC_PATHNAME = L"sdmc:/CTR_Console_Repair/rtc.bin"; -const wchar_t* const IVS_NAND_PATHNAME = L"nand:/private/movable.sed"; -const wchar_t* const IVS_PATHNAME = L"sdmc:/CTR_Console_Repair/movable.sed"; -const wchar_t* const NAND_DATA_ROOT_PATHNAME_WITH_SLASH = L"nand:/data/"; -const wchar_t* const NAND_TWL_PHOTO_DATA_ROOT_PATHNAME_WITH_SLASH = L"twlp:/"; -const wchar_t* const NAND_TWL_SOUND_DATA_ROOT_PATHNAME_WITH_SLASH = L"twls:/"; -const wchar_t* const SDMC_ROOT_DIRECTORY_PATH = L"sdmc:/"; -const wchar_t* const WRITE_FINISHED_CHECK_PATHNAME = L"sdmc:/CTR_Console_Repair/WriteFinished"; -const wchar_t* const UPDATE_CHECK_PATHNAME = L"sdmc:/CTR_Console_Repair/UpdateFinished"; -const wchar_t* const INITIALIZED_CHECK_PATHNAME = L"sdmc:/CTR_Console_Repair/ConsoleInitialized"; -const wchar_t* const TRY_RESTORE_SAME_CONSOLE_PATHNAME = L"sdmc:/CTR_Console_Repair/TryRestoreSameConsole"; -const wchar_t* const RTC_SYNC_CHECK_PATHNAME = L"sdmc:/CTR_Console_Repair/RtcSyncFinished"; -const wchar_t* const PLAYHISTORY_PATHNAME = L"sdmc:/CTR_Console_Repair/playhistory.bin"; -const wchar_t* const PLAYHISTORY_COUNT_PATHNAME = L"sdmc:/CTR_Console_Repair/playhistoryCount.bin"; -const wchar_t* const TOUCH_PANEL_CALIBRATION_PATHNAME = L"sdmc:/CTR_Console_Repair/tpCalibration.bin"; -const wchar_t* const VERSION_DATA_PATHNAME = L"sdmc:/CTR_Console_Repair/version.bin"; -const wchar_t* const REGION_DATA_PATHNAME = L"sdmc:/CTR_Console_Repair/Region.bin"; - -enum TWL_PATH_INDEX -{ - TWL_PHOTO = 0, - TWL_SOUND, - TWL_PATHNAME_MAX -}; - -const char* const TWL_ARCHIVE_NAME_TABLE[TWL_PATHNAME_MAX] = -{ - common::NAND_TWL_PHOTO_ARCHIVE_NAME, - common::NAND_TWL_SOUND_ARCHIVE_NAME -}; - -const wchar_t* const SD_TWL_ROOTNAME_TABLE[TWL_PATHNAME_MAX] = -{ - common::SD_SAVEDATA_TWL_PHOTO_ROOT_NAME, - common::SD_SAVEDATA_TWL_SOUND_ROOT_NAME -}; - -const wchar_t* const NAND_TWL_ROOT_PATHNAME_WITH_SLASH_TABLE[TWL_PATHNAME_MAX] = -{ - common::NAND_TWL_PHOTO_DATA_ROOT_PATHNAME_WITH_SLASH, - common::NAND_TWL_SOUND_DATA_ROOT_PATHNAME_WITH_SLASH -}; - -const u32 TWL_FS_ARCHIVE_KIND[TWL_PATHNAME_MAX] = -{ - nn::fs::CTR::ARCHIVE_TYPE_TWL_PHOTO, - nn::fs::CTR::ARCHIVE_TYPE_TWL_SOUND -}; - -} - -#endif /* FILENAME_H_ */ diff --git a/branches/work/SD_AesCmac/common/FileTransfer.cpp b/branches/work/SD_AesCmac/common/FileTransfer.cpp deleted file mode 100644 index 7fad71d..0000000 --- a/branches/work/SD_AesCmac/common/FileTransfer.cpp +++ /dev/null @@ -1,249 +0,0 @@ -/*---------------------------------------------------------------------------* - Project: Horizon - File: FileTransfer.cpp - - Copyright 2009 Nintendo. All rights reserved. - - These coded instructions, statements, and computer programs contain - proprietary information of Nintendo of America Inc. and/or Nintendo - Company Ltd., and are protected by Federal copyright law. They may - not be disclosed to third parties or copied or duplicated in any form, - in whole or in part, without the prior written consent of Nintendo. - - $Rev$ - *---------------------------------------------------------------------------*/ - -#include "FileTransfer.h" -#include - -namespace common -{ - -namespace -{ - -u64 s_TotalFileSize; -u64 s_FinishedFileSize = 0; -u64 s_Progress = 0; - -} - -nn::Result CalculateFileNum(std::wstring currentDirectory, u32& fileNum, u32& fileSize) -{ - nn::fs::FileInputStream fis; - nn::fs::Directory dir; - nn::Result result; - std::vector entryList; //カレントディレクトリのエントリ一覧を格納 - std::vector::iterator entryIndex; - - result = dir.TryInitialize(currentDirectory.c_str()); - - if(result.IsSuccess()) - { - nn::fs::DirectoryEntry entry; - s32 numEntry; - for(;;) - { - result = dir.TryRead(&numEntry, &entry, 1); - if(result.IsFailure()) - { - dir.Finalize(); - return result; - } - if(numEntry == 0) - { - // カレントディレクトリを閉じる - dir.Finalize(); - - // カレントディレクトリの子を開く - for(entryIndex = entryList.begin(); entryIndex != entryList.end(); entryIndex++) - { - if(entryIndex->attributes.isDirectory) - { - CalculateFileNum(currentDirectory + std::wstring(entryIndex->entryName) + std::wstring(L"/"), fileNum, fileSize); - } - } - - return nn::ResultSuccess(); - } - - entryList.push_back(entry); - fileNum++; - fileSize+= entry.entrySize; - } - } - else - { - NN_LOG("failed initialize directory\n"); - dir.Finalize(); - return result; - } - -} - -// ディレクトリ間のコピー -// アーカイブ越しのコピーが可能 -// アーカイブにマウントした状態で呼び出す必要あり -// 書き込み先のディレクトリはあらかじめ消去しておくこと。 -// 引数はスラッシュ付き -bool CopyDirectory(const wchar_t * from_path, const wchar_t * to_path, void* buf, const size_t bufSize) -{ - nn::fs::Directory from_dir; - nn::fs::DirectoryEntry entry; - s32 numread = 0; - std::wostringstream target_from; - std::wostringstream target_to; - bool ret_value = true; - - nn::Result result = from_dir.TryInitialize(from_path); - - if (result.IsFailure()) - { - nn::dbg::PrintResult(result); - return false; - } - - while (1) - { - result = from_dir.TryRead(&numread, &entry, 1); - if (result.IsFailure() || numread != 1) - { - break; - } - - if (std::wcscmp(entry.entryName, L".") == 0 || std::wcscmp(entry.entryName, L"..") == 0) - { - continue; - } - - target_from.str(L""); - target_from.clear(std::stringstream::goodbit); - target_from << from_path << entry.entryName; - - target_to.str(L""); - target_to.clear(std::stringstream::goodbit); - target_to << to_path << entry.entryName; - - // ディレクトリの場合 - if (entry.attributes.isDirectory) - { - // ディレクトリ作成 - NN_LOG("Create Directory %ls\n", target_to.str().c_str()); - result = nn::fs::TryCreateDirectory(target_to.str().c_str()); - if (result.IsFailure()) - { - nn::dbg::PrintResult(result); - ret_value = false; - } - else - { - target_from << L"/"; - target_to << L"/"; - // 再帰処理 - if (!CopyDirectory(target_from.str().c_str(), target_to.str().c_str(), buf, bufSize)) - { - ret_value = false; - } - } - } - // ファイルの場合 - else - { - // ファイル作成 - nn::fs::FileInputStream from_file; - nn::fs::FileOutputStream to_file; - s64 filesize; - s32 readsize; - s32 writesize; - - NN_LOG("Copy File %ls\n", target_from.str().c_str()); - - // 読み込み対象ファイル開く - result = from_file.TryInitialize(target_from.str().c_str()); - - if (result.IsFailure()) - { - nn::dbg::PrintResult(result); - ret_value = false; - } - else - { - // 読み込み対象ファイルのサイズ取得 - result = from_file.TryGetSize(&filesize); - if (result.IsFailure()) - { - nn::dbg::PrintResult(result); - ret_value = false; - } - else - { - // 書き込み対象ファイル作成 - result = nn::fs::TryCreateFile(target_to.str().c_str(), filesize); - result = to_file.TryInitialize(target_to.str().c_str(), false); - if (result.IsFailure()) - { - nn::dbg::PrintResult(result); - ret_value = false; - } - else - { - while (1) - { - result = from_file.TryRead(&readsize, buf, bufSize); - - if (result.IsFailure()) - { - nn::dbg::PrintResult(result); - ret_value = false; - break; - } - else - { - if (readsize == 0) - { - result = to_file.TryFlush(); - if (result.IsFailure()) - { - nn::dbg::PrintResult(result); - ret_value = false; - } - break; - } - else - { - result = to_file.TryWrite(&writesize, buf, readsize, false); - s_FinishedFileSize += readsize; - s_Progress = s_FinishedFileSize * 100/ s_TotalFileSize; - NN_LOG("finish = %lld, total = %lld, progress = %lld\n", s_FinishedFileSize, s_TotalFileSize, s_Progress); - if (result.IsFailure()) - { - nn::dbg::PrintResult(result); - ret_value = false; - } - } - } - } - } - to_file.Finalize(); - } - } - from_file.Finalize(); - } - } - - from_dir.Finalize(); - return ret_value; -} - -u32 GetProgress() -{ - return s_Progress; -} - -void InitializeTransferProgress(u64 totalSize) -{ - s_TotalFileSize = totalSize; - s_FinishedFileSize = 0; -} - -} diff --git a/branches/work/SD_AesCmac/common/FileTransfer.h b/branches/work/SD_AesCmac/common/FileTransfer.h deleted file mode 100644 index cacddfb..0000000 --- a/branches/work/SD_AesCmac/common/FileTransfer.h +++ /dev/null @@ -1,33 +0,0 @@ -/*---------------------------------------------------------------------------* - Project: Horizon - File: FileTransfer.h - - Copyright 2009 Nintendo. All rights reserved. - - These coded instructions, statements, and computer programs contain - proprietary information of Nintendo of America Inc. and/or Nintendo - Company Ltd., and are protected by Federal copyright law. They may - not be disclosed to third parties or copied or duplicated in any form, - in whole or in part, without the prior written consent of Nintendo. - - $Rev$ - *---------------------------------------------------------------------------*/ - -#ifndef FILETRANSFER_H_ -#define FILETRANSFER_H_ - -#include -#include -#include - -namespace common -{ - -nn::Result CalculateFileNum(std::wstring currentDirectory, u32& fileNum, u32& fileSize); -bool CopyDirectory(const wchar_t * from_path, const wchar_t * to_path, void* buf, const size_t bufSize); -u32 GetProgress(); -void InitializeTransferProgress(u64 totalSize); - -} - -#endif /* FILETRANSFER_H_ */ diff --git a/branches/work/SD_AesCmac/common/HardwareInfo.cpp b/branches/work/SD_AesCmac/common/HardwareInfo.cpp deleted file mode 100644 index abf3edd..0000000 --- a/branches/work/SD_AesCmac/common/HardwareInfo.cpp +++ /dev/null @@ -1,69 +0,0 @@ -/*---------------------------------------------------------------------------* - Project: Horizon - File: HardwareInfo.cpp - - Copyright 2009 Nintendo. All rights reserved. - - These coded instructions, statements, and computer programs contain - proprietary information of Nintendo of America Inc. and/or Nintendo - Company Ltd., and are protected by Federal copyright law. They may - not be disclosed to third parties or copied or duplicated in any form, - in whole or in part, without the prior written consent of Nintendo. - - $Rev$ - *---------------------------------------------------------------------------*/ - -#include -#include "HardwareInfo.h" - -#include - -namespace common -{ - -HardwareInfo::HardwareInfo() -{ - // TODO 自動生成されたコンストラクター・スタブ - -} - -HardwareInfo::~HardwareInfo() -{ - // TODO Auto-generated destructor stub -} - -// NULL終端されたシリアルナンバーを受け取る -// NULL終端された場所にチェックデジットを付加して新たにNULL終端する -void HardwareInfo::AddCheckDigit(char* serial) -{ - size_t len = std::strlen(serial); - - u8 digit = 0; - bool odd = true; - for(u8 i = len - 1; i > 0 && std::isdigit(serial[i]); i--) - { - if(odd) - { - digit += (serial[i] - '0') * 3; - } - else - { - digit += (serial[i] - '0'); - } - odd = !odd; - } - - if(digit % 10 != 0) - { - serial[len] = 10 - (digit % 10) + '0'; - } - else - { - serial[len] = '0'; - } - - serial[len + 1] = '\0'; -} - - -} diff --git a/branches/work/SD_AesCmac/common/HardwareInfo.h b/branches/work/SD_AesCmac/common/HardwareInfo.h deleted file mode 100644 index e6406cf..0000000 --- a/branches/work/SD_AesCmac/common/HardwareInfo.h +++ /dev/null @@ -1,33 +0,0 @@ -/*---------------------------------------------------------------------------* - Project: Horizon - File: HardwareInfo.h - - Copyright 2009 Nintendo. All rights reserved. - - These coded instructions, statements, and computer programs contain - proprietary information of Nintendo of America Inc. and/or Nintendo - Company Ltd., and are protected by Federal copyright law. They may - not be disclosed to third parties or copied or duplicated in any form, - in whole or in part, without the prior written consent of Nintendo. - - $Rev$ - *---------------------------------------------------------------------------*/ - -#ifndef HARDWAREINFO_H_ -#define HARDWAREINFO_H_ - -namespace common -{ - -class HardwareInfo -{ -public: - HardwareInfo(); - virtual ~HardwareInfo(); - - void AddCheckDigit(char* serial); -}; - -} - -#endif /* HARDWAREINFO_H_ */ diff --git a/branches/work/SD_AesCmac/common/HeapManager.cpp b/branches/work/SD_AesCmac/common/HeapManager.cpp deleted file mode 100644 index 29f4367..0000000 --- a/branches/work/SD_AesCmac/common/HeapManager.cpp +++ /dev/null @@ -1,39 +0,0 @@ -/*---------------------------------------------------------------------------* - Project: Horizon - File: HeapManager.cpp - - Copyright 2009 Nintendo. All rights reserved. - - These coded instructions, statements, and computer programs contain - proprietary information of Nintendo of America Inc. and/or Nintendo - Company Ltd., and are protected by Federal copyright law. They may - not be disclosed to third parties or copied or duplicated in any form, - in whole or in part, without the prior written consent of Nintendo. - - $Rev$ - *---------------------------------------------------------------------------*/ - -#include "HeapManager.h" - -namespace common -{ - -nn::fnd::ThreadSafeExpHeap HeapManager::s_AppHeap; - -HeapManager::HeapManager() -{ - // TODO 自動生成されたコンストラクター・スタブ - -} - -HeapManager::~HeapManager() -{ - // TODO Auto-generated destructor stub -} - -nn::fnd::ThreadSafeExpHeap* HeapManager::GetHeap() -{ - return &s_AppHeap; -} - -} diff --git a/branches/work/SD_AesCmac/common/HeapManager.h b/branches/work/SD_AesCmac/common/HeapManager.h deleted file mode 100644 index b9fc469..0000000 --- a/branches/work/SD_AesCmac/common/HeapManager.h +++ /dev/null @@ -1,40 +0,0 @@ -/*---------------------------------------------------------------------------* - Project: Horizon - File: HeapManager.h - - Copyright 2009 Nintendo. All rights reserved. - - These coded instructions, statements, and computer programs contain - proprietary information of Nintendo of America Inc. and/or Nintendo - Company Ltd., and are protected by Federal copyright law. They may - not be disclosed to third parties or copied or duplicated in any form, - in whole or in part, without the prior written consent of Nintendo. - - $Rev$ - *---------------------------------------------------------------------------*/ - -#ifndef HEAPMANAGER_H_ -#define HEAPMANAGER_H_ - -#include - -namespace common -{ - -class HeapManager -{ -public: - HeapManager(); - virtual ~HeapManager(); - - static nn::fnd::ThreadSafeExpHeap* GetHeap(); - -private: - // デバイスメモリ管理用拡張ヒープ - static nn::fnd::ThreadSafeExpHeap s_AppHeap; - -}; - -} // namespace common - -#endif /* HEAPMANAGER_H_ */ diff --git a/branches/work/SD_AesCmac/common/LogConsole.cpp b/branches/work/SD_AesCmac/common/LogConsole.cpp deleted file mode 100644 index b77d6d0..0000000 --- a/branches/work/SD_AesCmac/common/LogConsole.cpp +++ /dev/null @@ -1,171 +0,0 @@ -/*---------------------------------------------------------------------------* - Project: Horizon - File: LogConsole.cpp - - Copyright 2009 Nintendo. All rights reserved. - - These coded instructions, statements, and computer programs contain - proprietary information of Nintendo of America Inc. and/or Nintendo - Company Ltd., and are protected by Federal copyright law. They may - not be disclosed to third parties or copied or duplicated in any form, - in whole or in part, without the prior written consent of Nintendo. - - $Rev$ - *---------------------------------------------------------------------------*/ - -#include "LogConsole.h" -#include - -namespace common -{ - -const size_t FONT_WIDTH = 8; -const size_t FONT_HEIGHT = 10; - -static LogConsole s_LogConsole; - -LogConsole* GetConsoleInstance() -{ - return &s_LogConsole; -} - -LogConsole::LogConsole() -{ - -} - -LogConsole::~LogConsole() -{ - -} - -void LogConsole::Initialize(u32 width, u32 height, u32 maxLine, demo::RenderSystemDrawing* renderSystem) -{ - m_Width = width; - m_Height = height; - m_MaxLine = maxLine; - m_RenderSystem = renderSystem; - m_CurrentViewLine = 0; - m_LineNum = 0; -} - -void LogConsole::AddText(const char* fmt, ::std::va_list arg) -{ - s32 stringSize; - const size_t STRING_BUFFER_SIZE = 256; - char formatStr[STRING_BUFFER_SIZE]; - - stringSize = nn::nstd::TVSNPrintf(formatStr, sizeof(formatStr), fmt, arg); - ::std::string str(formatStr); - - size_t addedText = 0; - while (addedText < stringSize) - { - if(m_LineNum >= m_MaxLine) - { - // 満杯なので先頭を削除する - ::std::vector::iterator it; - it = m_Log.begin(); - m_Log.erase(it); - m_LineNum--; - } - - // 部分文字列を追加 - AddWrapedText(str.substr(addedText, m_Width).c_str()); - m_LineNum++; - - // 画面領域以上追加したら末尾にスクロールする - if(m_LineNum > m_Height) - { - ScrollToEnd(); - } - - - if(stringSize - addedText > m_Width) - { - addedText += m_Width; - } - else - { - addedText += stringSize - addedText; - } - } -} - -void LogConsole::ScrollUp() -{ - if(m_CurrentViewLine > 0) - { - m_CurrentViewLine--; - } -} - - - -void LogConsole::ScrollDown() -{ - if (m_LineNum > m_Height) - { - if (m_CurrentViewLine < m_LineNum - m_Height) - { - m_CurrentViewLine++; - } - - } -} - -void LogConsole::ScrollToBegin() -{ - m_CurrentViewLine = 0; -} - -void LogConsole::ScrollToEnd() -{ - if(m_LineNum > m_Height) - { - m_CurrentViewLine = m_LineNum - m_Height; - } -} - - -void LogConsole::Print() -{ - ::std::vector::iterator it; - - it = m_Log.begin(); - it += m_CurrentViewLine; - - u32 count = 0; - for(; it != m_Log.end() && count < m_Height && count < m_MaxLine; it++) - { - m_RenderSystem->DrawText(0, count++ * 10, "%s", it->c_str()); - } - - if(m_LineNum > m_Height) - { - DrawScrollBar(); - } -} - - -void LogConsole::AddWrapedText(const char* str) -{ - m_Log.push_back(::std::string(str)); -} - -void LogConsole::DrawScrollBar() -{ - m_RenderSystem->SetColor(0.4f, 0.4f, 0.4f); - m_RenderSystem->DrawLine((m_Width + 1) * FONT_WIDTH, 0, (m_Width + 2) * FONT_WIDTH - 1, 0); - m_RenderSystem->DrawLine((m_Width + 1)* FONT_WIDTH, 0, (m_Width + 1)* FONT_WIDTH, m_Height * FONT_HEIGHT); - m_RenderSystem->DrawLine((m_Width + 2) * FONT_WIDTH - 1, 0, (m_Width + 2) * FONT_WIDTH - 1, m_Height * FONT_HEIGHT); - m_RenderSystem->DrawLine((m_Width + 1)* FONT_WIDTH, m_Height * FONT_HEIGHT - 1, (m_Width + 2) * FONT_WIDTH - 1, m_Height * FONT_HEIGHT - 1); - - u32 y = (m_Height * FONT_HEIGHT - 2) * m_CurrentViewLine / m_MaxLine; - m_RenderSystem->SetColor(0.7f, 0.7f, 0.7f); - m_RenderSystem->FillRectangle((m_Width + 1) * FONT_WIDTH, y + 1, FONT_WIDTH - 1, FONT_HEIGHT - 4); - - m_RenderSystem->SetColor(1.f, 1.f, 1.f); -} - -} //namespace ConsoleBackup diff --git a/branches/work/SD_AesCmac/common/LogConsole.h b/branches/work/SD_AesCmac/common/LogConsole.h deleted file mode 100644 index b8a7d52..0000000 --- a/branches/work/SD_AesCmac/common/LogConsole.h +++ /dev/null @@ -1,68 +0,0 @@ -/*---------------------------------------------------------------------------* - Project: Horizon - File: LogConsole.h - - Copyright 2009 Nintendo. All rights reserved. - - These coded instructions, statements, and computer programs contain - proprietary information of Nintendo of America Inc. and/or Nintendo - Company Ltd., and are protected by Federal copyright law. They may - not be disclosed to third parties or copied or duplicated in any form, - in whole or in part, without the prior written consent of Nintendo. - - $Rev$ - *---------------------------------------------------------------------------*/ - -#ifndef LOGCONSOLE_H_ -#define LOGCONSOLE_H_ - -#include -#include -#include -#include "demo.h" - -namespace common -{ - -//! @brief 画面にテキストコンソールを描画します -class LogConsole -{ - -public: - LogConsole(); - ~LogConsole(); - - void Initialize(u32 width, u32 height, u32 maxLine, demo::RenderSystemDrawing* renderSystem); - - void AddText(const char* fmt, ::std::va_list arg); - void ScrollUp(); - void ScrollDown(); - void ScrollToBegin(); - void ScrollToEnd(); - void Print(); - -private: - void AddWrapedText(const char* str); - void DrawScrollBar(); - - ::std::vector m_Log; - - //! @brief コンソールの列数 - u32 m_Width; - //! @brief コンソールの行数 - u32 m_Height; - //! @brief コンソールのログの最大行数 - u32 m_MaxLine; - //! @brief 描画のためのRenderSystemDrawingへのポインタ - demo::RenderSystemDrawing* m_RenderSystem; - //! @brief 追加したログの行数 - u32 m_LineNum; - //! @brief 表示を開始するログの行数 - u32 m_CurrentViewLine; - - -}; - -} - -#endif /* LOGCONSOLE_H_ */ diff --git a/branches/work/SD_AesCmac/common/LogConsole_Private.h b/branches/work/SD_AesCmac/common/LogConsole_Private.h deleted file mode 100644 index 8fbdd42..0000000 --- a/branches/work/SD_AesCmac/common/LogConsole_Private.h +++ /dev/null @@ -1,28 +0,0 @@ -/*---------------------------------------------------------------------------* - Project: Horizon - File: LogConsole_Private.h - - Copyright 2009 Nintendo. All rights reserved. - - These coded instructions, statements, and computer programs contain - proprietary information of Nintendo of America Inc. and/or Nintendo - Company Ltd., and are protected by Federal copyright law. They may - not be disclosed to third parties or copied or duplicated in any form, - in whole or in part, without the prior written consent of Nintendo. - - $Rev$ - *---------------------------------------------------------------------------*/ - -#ifndef LOGCONSOLE_PRIVATE_H_ -#define LOGCONSOLE_PRIVATE_H_ - -#include "LogConsole.h" - -namespace common -{ - -LogConsole* GetConsoleInstance(); - -} - -#endif /* LOGCONSOLE_PRIVATE_H_ */ diff --git a/branches/work/SD_AesCmac/common/OMakefile b/branches/work/SD_AesCmac/common/OMakefile deleted file mode 100644 index e874cbc..0000000 --- a/branches/work/SD_AesCmac/common/OMakefile +++ /dev/null @@ -1,18 +0,0 @@ -#!/usr/bin/env omake -#---------------------------------------------------------------------------- -# Project: Horizon -# File: OMakefile -# -# Copyright (C)2009 Nintendo Co., Ltd. All rights reserved. -# -# These coded instructions, statements, and computer programs contain -# proprietary information of Nintendo of America Inc. and/or Nintendo -# Company Ltd., and are protected by Federal copyright law. They may -# not be disclosed to third parties or copied or duplicated in any form, -# in whole or in part, without the prior written consent of Nintendo. -# -# $Rev$ -#---------------------------------------------------------------------------- -include $(ROOT_OMAKE)/modulerules - -DefineDefaultRules() diff --git a/branches/work/SD_AesCmac/common/PlayHistoryManager.cpp b/branches/work/SD_AesCmac/common/PlayHistoryManager.cpp deleted file mode 100644 index bb8607e..0000000 --- a/branches/work/SD_AesCmac/common/PlayHistoryManager.cpp +++ /dev/null @@ -1,219 +0,0 @@ -/*---------------------------------------------------------------------------* - Project: Horizon - File: PlayHistoryManager.cpp - - Copyright 2009 Nintendo. All rights reserved. - - These coded instructions, statements, and computer programs contain - proprietary information of Nintendo of America Inc. and/or Nintendo - Company Ltd., and are protected by Federal copyright law. They may - not be disclosed to third parties or copied or duplicated in any form, - in whole or in part, without the prior written consent of Nintendo. - - $Rev$ - *---------------------------------------------------------------------------*/ - -#include -#include - -#include "PlayHistoryManager.h" -#include "HeapManager.h" -#include "SdMountManager.h" -#include "SdReaderWriter.h" -#include "CommonLogger.h" -#include "FileName.h" -#include "ProgramId.h" - -namespace common -{ - -PlayHistoryManager::PlayHistoryManager() -{ - // TODO 自動生成されたコンストラクター・スタブ - -} - -PlayHistoryManager::~PlayHistoryManager() -{ - // TODO Auto-generated destructor stub -} - -void PlayHistoryManager::Export() -{ - nn::Result result; - SdMountManager::Mount(); - SdReaderWriter sd; - - size_t historyNum = nn::pl::CTR::GetPlayHistoryLength(); - if ( historyNum == 0) - { - NN_LOG("No Play Event\n"); - return; - } - - // SDに書き込む - result = sd.WriteBufWithCmac(common::PLAYHISTORY_COUNT_PATHNAME, reinterpret_cast(&historyNum), - sizeof(historyNum)); - COMMON_LOGGER_RESULT_IF_FAILED_WITH_LINE(result); - - nn::pl::CTR::PlayEvent* pEvent; - pEvent = reinterpret_cast (HeapManager::GetHeap()->Allocate( - sizeof(nn::pl::CTR::PlayEvent) * historyNum)); - if ( pEvent == NULL ) - { - NN_LOG("Failed to Allocate Heap\n"); - return; - } - - // 一番古いデータから素直に全部読み込む - nn::pl::CTR::GetPlayHistory(pEvent, 0, historyNum); - - // SDに書き込む - result = sd.WriteBufWithCmac(common::PLAYHISTORY_PATHNAME, reinterpret_cast(pEvent), - sizeof(nn::pl::CTR::PlayEvent) * historyNum); - COMMON_LOGGER_RESULT_IF_FAILED_WITH_LINE(result); - - HeapManager::GetHeap()->Free(pEvent); - - SdMountManager::Unmount(); -} - -void PlayHistoryManager::GetPlayHistoryNums(size_t* nums) -{ - nn::Result result; - - size_t bufSize = common::HeapManager::GetHeap()->GetAllocatableSize(); - void* buf = common::HeapManager::GetHeap()->Allocate(bufSize); - if (buf != NULL) - { - common::SdReaderWriter sdReader; - - size_t readSize; - result = sdReader.ReadBufWithCmac(common::PLAYHISTORY_COUNT_PATHNAME, buf, bufSize, &readSize); - if (result.IsSuccess()) - { - *nums = *reinterpret_cast (buf); - } - COMMON_LOGGER_RESULT_IF_FAILED_WITH_LINE(result); - } - HeapManager::GetHeap()->Free(buf); -} - -void PlayHistoryManager::Import() -{ - nn::Result result; - SdMountManager::Mount(); - SdReaderWriter sd; - - SdMountManager::Mount(); - - // プレイ履歴の件数を取得する - size_t historyNum = 0; - - GetPlayHistoryNums(&historyNum); - - if(historyNum == 0) - { - NN_LOG("No PlayHistory found\n"); - return; - } - - size_t bufSize = common::HeapManager::GetHeap()->GetAllocatableSize(); - void* buf = common::HeapManager::GetHeap()->Allocate(bufSize); - if (buf != NULL) - { - common::SdReaderWriter sdReader; - - size_t readSize; - result = sdReader.ReadBufWithCmac(common::PLAYHISTORY_PATHNAME, buf, bufSize, &readSize); - if(result.IsSuccess()) - { - nn::pl::CTR::PlayEvent* pEvent = reinterpret_cast(buf); - NN_LOG("history num = %d\n", historyNum); - - // プレイ履歴を無効化する - nn::pl::CTR::ClearPlayHistory(); - - // データ移行ツールを無視して書き込む - for(u32 i = 0; i < historyNum; i++) - { - COMMON_LOGGER("Importing PlayHistory %d/%d", i, historyNum); - if ((pEvent[i].GetProgramId() & WITHOUT_VALIATION_MASK) != CONSOLE_BACKUP_PROGRAM_ID - && (pEvent[i].GetProgramId() & WITHOUT_VALIATION_MASK) != CONSOLE_RESTORE_PROGRAM_ID) - { - NN_LOG("%05d 0x%16llx : %X : %d\n", i, pEvent[i].GetProgramId(), pEvent[i].GetEventType(), - pEvent[i].minutes); - - nn::pl::CTR::NotifyPlayEvent(pEvent[i].GetEventType(), pEvent[i].GetProgramId(), - pEvent[i].GetEventTime()); - } - else - { - NN_LOG("Skipped\n"); - } - } - - } - COMMON_LOGGER_RESULT_IF_FAILED_WITH_LINE(result); - - common::HeapManager::GetHeap()->Free(buf); - } - else - { - NN_LOG("Failed Allocate Heap!! %s, %d", __FILE__, __LINE__); - return; - } - - SdMountManager::Unmount(); -} - -void PlayHistoryManager::Dump() -{ - nn::Result result; - - s32 playEventLength = nn::pl::CTR::GetPlayHistoryLength(); - if ( playEventLength == 0 ) - { - NN_LOG("No Play Event\n"); - return; - } - - nn::pl::CTR::PlayEvent* playEvent = reinterpret_cast (HeapManager::GetHeap()->Allocate( - sizeof(nn::pl::CTR::PlayEvent) * playEventLength)); - if ( playEvent == NULL ) - { - NN_LOG("Failed to Allocate Heap\n"); - return; - } - - // 一番古いデータから素直に全部読み込む - (void)nn::pl::CTR::GetPlayHistory(playEvent, 0, playEventLength); - - // 取得したデータを順番にすべて表示していく - s32 restPlayEventLength = playEventLength; - s32 displayCount = 0; - - nn::pl::CTR::PlayEvent* pEvent; - while ( restPlayEventLength > 0 ) - { - // 一気に表示できるところまで表示する - int line; - for ( line = 0; line < 24; line++ ) - { - pEvent = &playEvent[displayCount]; - NN_LOG("0x%16llx : %X : %d\n", pEvent->GetProgramId(), pEvent->eventType, pEvent->minutes); - restPlayEventLength--; - displayCount++; - if(restPlayEventLength <= 0) - { - break; - } - } - } - NN_UNUSED_VAR(pEvent); - - HeapManager::GetHeap()->Free(playEvent); - return; -} - -} diff --git a/branches/work/SD_AesCmac/common/PlayHistoryManager.h b/branches/work/SD_AesCmac/common/PlayHistoryManager.h deleted file mode 100644 index 916741b..0000000 --- a/branches/work/SD_AesCmac/common/PlayHistoryManager.h +++ /dev/null @@ -1,45 +0,0 @@ -/*---------------------------------------------------------------------------* - Project: Horizon - File: PlayHistoryManager.h - - Copyright 2009 Nintendo. All rights reserved. - - These coded instructions, statements, and computer programs contain - proprietary information of Nintendo of America Inc. and/or Nintendo - Company Ltd., and are protected by Federal copyright law. They may - not be disclosed to third parties or copied or duplicated in any form, - in whole or in part, without the prior written consent of Nintendo. - - $Rev$ - *---------------------------------------------------------------------------*/ - -#ifndef PLAYHISTORYMANAGER_H_ -#define PLAYHISTORYMANAGER_H_ - -namespace common -{ - -//! @brief データ移行ツールの履歴を消しながらプレイ履歴を移行するためのクラスです。 -class PlayHistoryManager -{ -public: - PlayHistoryManager(); - virtual ~PlayHistoryManager(); - - //! @brief SDカードに出力します。 - void Export(); - - //! @brief SDカードからプレイ履歴に書き込みます - void Import(); - - //! @brief デバッグ用。プレイ履歴をデバッグ出力します。 - void Dump(); - -private: - void GetPlayHistoryNums(size_t* nums); - -}; - -} - -#endif /* PLAYHISTORYMANAGER_H_ */ diff --git a/branches/work/SD_AesCmac/common/ProgramId.h b/branches/work/SD_AesCmac/common/ProgramId.h deleted file mode 100644 index c565f11..0000000 --- a/branches/work/SD_AesCmac/common/ProgramId.h +++ /dev/null @@ -1,28 +0,0 @@ -/*---------------------------------------------------------------------------* - Project: Horizon - File: ProgramId.h - - Copyright 2009 Nintendo. All rights reserved. - - These coded instructions, statements, and computer programs contain - proprietary information of Nintendo of America Inc. and/or Nintendo - Company Ltd., and are protected by Federal copyright law. They may - not be disclosed to third parties or copied or duplicated in any form, - in whole or in part, without the prior written consent of Nintendo. - - $Rev$ - *---------------------------------------------------------------------------*/ - -#ifndef PROGRAMID_H_ -#define PROGRAMID_H_ - -namespace common -{ - -const u64 CONSOLE_BACKUP_PROGRAM_ID = 0x000400000f802200L; -const u64 CONSOLE_RESTORE_PROGRAM_ID = 0x000400000f802300L; -const u64 WITHOUT_VALIATION_MASK = 0xffffffffffffff00L; - -} - -#endif /* PROGRAMID_H_ */ diff --git a/branches/work/SD_AesCmac/common/SdLogger.cpp b/branches/work/SD_AesCmac/common/SdLogger.cpp deleted file mode 100644 index 5fb7068..0000000 --- a/branches/work/SD_AesCmac/common/SdLogger.cpp +++ /dev/null @@ -1,267 +0,0 @@ -/*---------------------------------------------------------------------------* - Project: Horizon - File: SdLogger.cpp - - Copyright 2009 Nintendo. All rights reserved. - - These coded instructions, statements, and computer programs contain - proprietary information of Nintendo of America Inc. and/or Nintendo - Company Ltd., and are protected by Federal copyright law. They may - not be disclosed to third parties or copied or duplicated in any form, - in whole or in part, without the prior written consent of Nintendo. - - $Rev$ - *---------------------------------------------------------------------------*/ - -#include "SdLogger.h" -#include -#include "SDMountManager.h" -#include "FileName.h" - -namespace common -{ - -namespace Logger -{ - -static SdLogger s_SdLogger; -static nn::os::LightEvent s_SdEjectedEvent; -static nn::os::LightEvent s_SdInsertedEvent; - -const size_t SDMC_EVENT_THREAD_STACK_SIZE = 1024; -nn::os::Thread s_SdmcEjectedEventThread; -nn::os::StackBuffer s_SdmcEjectedEventThreadStack; - -nn::os::Thread s_SdmcInsertedEventThread; -nn::os::StackBuffer s_SdmcInsertedEventThreadStack; - -void (*s_SdEjectedEventFunc)() = NULL; -void (*s_SdInsertedEventFunc)() = NULL; - -void PrintResultIfFailed(nn::Result result, u32 line = 0) -{ - if (result.IsFailure()) - { - if(line != 0) - { - NN_LOG("%s, %d\n", __FILE__, line); - } - nn::dbg::PrintResult(result); - } -} - -void SdmcEjectedEventThreadFunc() -{ - NN_LOG("********************:SD Ejected Event Thread Start**********************\n"); - - for(;;) - { - s_SdEjectedEvent.Wait(); - NN_LOG("********************:SD Card Ejected**********************\n"); - - if(s_SdEjectedEventFunc != NULL) - { - s_SdEjectedEventFunc(); - } - SdMountManager::ForceUnmount(); - s_SdEjectedEvent.ClearSignal(); - s_SdLogger.Inactivate(); - } -} - -void SdmcInsertedEventThreadFunc() -{ - NN_LOG("********************:SD Inserted Event Thread Start**********************\n"); - - for(;;) - { - s_SdInsertedEvent.Wait(); - NN_LOG("********************:SD Card Inserted*********************\n"); - - if(s_SdInsertedEventFunc != NULL) - { - s_SdInsertedEventFunc(); - } - s_SdInsertedEvent.ClearSignal(); - } -} - -void InitializeEjectThread() -{ - s_SdEjectedEvent.Initialize(true); - s_SdInsertedEvent.Initialize(true); - nn::fs::RegisterSdmcEjectedEvent(&s_SdEjectedEvent); - nn::fs::RegisterSdmcInsertedEvent(&s_SdInsertedEvent); - - // SDカード抜けを検知するためのスレッド作成 - s_SdmcEjectedEventThread.Start(SdmcEjectedEventThreadFunc, s_SdmcEjectedEventThreadStack); - - // SDカード挿入を検知するためのスレッド作成 - s_SdmcInsertedEventThread.Start(SdmcInsertedEventThreadFunc, s_SdmcInsertedEventThreadStack); - -} -void SetEjectHandler(void (*func)()) -{ - s_SdEjectedEventFunc = func; -} - -void SetInsertHandler(void (*func)()) -{ - s_SdInsertedEventFunc = func; -} - -SdLogger::SdLogger() : m_TryActivate(false), m_Permitted(false) -{ - -} - -SdLogger* GetSdInstance() -{ - return &s_SdLogger; -} - -void SdLogger::Print(const char* fmt, ::std::va_list arg) -{ - Activate(); - if(!m_Permitted) - { - NN_LOG("SD Write Not Permitted\n"); - return; - } - - nn::Result result; - result = SdMountManager::Mount(); - if (result.IsFailure()) - { - PrintResultIfFailed(result, __LINE__); - } - - s32 stringSize; - const size_t STRING_BUFFER_SIZE = 256; - char str[STRING_BUFFER_SIZE]; - - stringSize = nn::nstd::TVSNPrintf(str, sizeof(str), fmt, arg); - - ::std::wstring log(common::SDMC_ROOT_DIRECTORY_PATH); - log += common::LOG_PATHNAME; - - // ディレクトリが無ければ作る - nn::fs::Directory dir; - result = dir.TryInitialize(common::LOG_ROOT_DIRECTORY_PATH); - if(result.IsFailure()) - { - result = nn::fs::TryCreateDirectory(common::LOG_ROOT_DIRECTORY_PATH); - } - - result = sd.TryInitialize(log.c_str(), true); - if (result.IsSuccess()) - { - // 追記する - // サイズ取得 - s64 fileSize; - result = sd.TryGetSize(&fileSize); - if (result.IsSuccess()) - { - // 末尾に移動 - result = sd.TrySetPosition(fileSize); - if (result.IsSuccess()) - { - s32 writeSize; - result = sd.TryWrite(&writeSize, str, stringSize, true); - if (result.IsSuccess()) - { - result = sd.TryFlush(); - if (result.IsFailure()) - { - NN_LOG("SD TryFlush failed\n"); - PrintResultIfFailed(result, __LINE__); - } - } - else - { - NN_LOG("SD TryWrite failed\n"); - PrintResultIfFailed(result, __LINE__); - } - } - else - { - NN_LOG("SD TrySetPosition failed\n"); - PrintResultIfFailed(result, __LINE__); - } - } - else - { - NN_LOG("SD TryGetSize failed\n"); - PrintResultIfFailed(result, __LINE__); - } - } - else - { - NN_LOG("SD TryInitialize failed, %s, %d\n", __FILE__, __LINE__); - PrintResultIfFailed(result, __LINE__); - } - - dir.Finalize(); - sd.Finalize(); - SdMountManager::Unmount(); -} - -void SdLogger::Clear() -{ - Activate(); - if(!m_Permitted) - { - return; - } - - nn::Result result; - SdMountManager::Mount(); - - ::std::wstring log(common::SDMC_ROOT_DIRECTORY_PATH); - log += common::LOG_PATHNAME; - - result = nn::fs::TryDeleteFile(log.c_str()); - if(result.IsFailure()) - { - nn::dbg::PrintResult(result); - } - - SdMountManager::Unmount(); -} - -void SdLogger::Inactivate() -{ - m_TryActivate = false; - m_Permitted = false; -} - -void SdLogger::Activate() -{ - if(m_TryActivate) - { - return; - } - - nn::Result result; - result = common::SdMountManager::Mount(); - - if (result.IsSuccess()) - { - nn::fs::FileInputStream fis; - - result = fis.TryInitialize(common::AP_SETTING_PATHNAME); - if(result.IsSuccess()) - { - m_Permitted = true; - } - fis.Finalize(); - } - - common::SdMountManager::Unmount(); - m_TryActivate = true; -} - -} // namespace Logger -} // namespace ConsoleBackup - - diff --git a/branches/work/SD_AesCmac/common/SdLogger.h b/branches/work/SD_AesCmac/common/SdLogger.h deleted file mode 100644 index 2dc736f..0000000 --- a/branches/work/SD_AesCmac/common/SdLogger.h +++ /dev/null @@ -1,57 +0,0 @@ -/*---------------------------------------------------------------------------* - Project: Horizon - File: SdLogger.h - - Copyright 2009 Nintendo. All rights reserved. - - These coded instructions, statements, and computer programs contain - proprietary information of Nintendo of America Inc. and/or Nintendo - Company Ltd., and are protected by Federal copyright law. They may - not be disclosed to third parties or copied or duplicated in any form, - in whole or in part, without the prior written consent of Nintendo. - - $Rev$ - *---------------------------------------------------------------------------*/ - -#ifndef SDLOGGER_H_ -#define SDLOGGER_H_ - -#include - -namespace common -{ - -namespace Logger -{ - -class SdLogger -{ -public: - SdLogger(); - ~SdLogger() {}; - - void Print(const char* fmt, ::std::va_list arg); - void Clear(); - void Inactivate(); - -private: - void Activate(); - - nn::fs::FileOutputStream sd; - bool m_TryActivate; - bool m_Permitted; - NN_PADDING2; - -}; - -void InitializeEjectThread(); -// SDカードが抜けた時に呼ばれるコールバック -void SetEjectHandler(void (*func)()); -// SDカードが挿入された時に呼ばれるコールバック -void SetInsertHandler(void (*func)()); -SdLogger* GetSdInstance(); - -} // namespace Logger -} // namespace ConsoleBackup - -#endif /* SDLOGGER_H_ */ diff --git a/branches/work/SD_AesCmac/common/SdMountManager.cpp b/branches/work/SD_AesCmac/common/SdMountManager.cpp deleted file mode 100644 index 336bebb..0000000 --- a/branches/work/SD_AesCmac/common/SdMountManager.cpp +++ /dev/null @@ -1,67 +0,0 @@ -/*---------------------------------------------------------------------------* - Project: Horizon - File: SdMountManager.cpp - - Copyright 2009 Nintendo. All rights reserved. - - These coded instructions, statements, and computer programs contain - proprietary information of Nintendo of America Inc. and/or Nintendo - Company Ltd., and are protected by Federal copyright law. They may - not be disclosed to third parties or copied or duplicated in any form, - in whole or in part, without the prior written consent of Nintendo. - - $Rev$ - *---------------------------------------------------------------------------*/ - -#include -#include "SdMountManager.h" -#include "FileName.h" - -namespace common -{ - -u32 SdMountManager::m_MountCounter = 0; - -SdMountManager::SdMountManager() -{ - // TODO 自動生成されたコンストラクター・スタブ - -} - -SdMountManager::~SdMountManager() -{ - // TODO Auto-generated destructor stub -} - -nn::Result SdMountManager::Mount() -{ - nn::Result result = nn::ResultSuccess(); - - if(m_MountCounter == 0) - { - result = nn::fs::MountSdmc(); - } - m_MountCounter++; - - return result; -} - -nn::Result SdMountManager::Unmount() -{ - nn::Result result = nn::ResultSuccess(); - if(m_MountCounter != 0 && --m_MountCounter == 0) - { - result = nn::fs::Unmount(common::SDMC_ARCHIVE_NAME); - } - - return result; -} - -nn::Result SdMountManager::ForceUnmount() -{ - m_MountCounter = 0; - return nn::fs::Unmount(common::SDMC_ARCHIVE_NAME); -} - - -} diff --git a/branches/work/SD_AesCmac/common/SdMountManager.h b/branches/work/SD_AesCmac/common/SdMountManager.h deleted file mode 100644 index c4db65b..0000000 --- a/branches/work/SD_AesCmac/common/SdMountManager.h +++ /dev/null @@ -1,42 +0,0 @@ -/*---------------------------------------------------------------------------* - Project: Horizon - File: SdMountManager.h - - Copyright 2009 Nintendo. All rights reserved. - - These coded instructions, statements, and computer programs contain - proprietary information of Nintendo of America Inc. and/or Nintendo - Company Ltd., and are protected by Federal copyright law. They may - not be disclosed to third parties or copied or duplicated in any form, - in whole or in part, without the prior written consent of Nintendo. - - $Rev$ - *---------------------------------------------------------------------------*/ - -#ifndef SDMOUNTMANAGER_H_ -#define SDMOUNTMANAGER_H_ - -namespace common -{ - -//! @brief SDカードのMount状態を管理するためのクラスです -class SdMountManager -{ -public: - SdMountManager(); - virtual ~SdMountManager(); - - //! @brief マウントが必要ならマウントします。 - static nn::Result Mount(); - //! @brief アンマウントが必要ならアンマウントします。 - static nn::Result Unmount(); - //! @brief 強制的にアンマウントします。 - static nn::Result ForceUnmount(); - -private: - static u32 m_MountCounter; -}; - -} - -#endif /* SDMOUNTMANAGER_H_ */ diff --git a/branches/work/SD_AesCmac/common/SdReaderWriter.cpp b/branches/work/SD_AesCmac/common/SdReaderWriter.cpp deleted file mode 100644 index 60282be..0000000 --- a/branches/work/SD_AesCmac/common/SdReaderWriter.cpp +++ /dev/null @@ -1,253 +0,0 @@ -/*---------------------------------------------------------------------------* - Project: Horizon - File: SdReaderWriter.cpp - - Copyright 2009 Nintendo. All rights reserved. - - These coded instructions, statements, and computer programs contain - proprietary information of Nintendo of America Inc. and/or Nintendo - Company Ltd., and are protected by Federal copyright law. They may - not be disclosed to third parties or copied or duplicated in any form, - in whole or in part, without the prior written consent of Nintendo. - - $Rev$ - *---------------------------------------------------------------------------*/ - -#include "SdReaderWriter.h" -#include "SdMountManager.h" -#include "CommonLogger.h" -#include "Aes_define.h" - -#include -#include -#include - -namespace common -{ - -bool Compare(const bit8* p0, const bit8* p1, size_t size) -{ - s32 i; - bool result = true; - for (i = 0; i < size; ++i) - { - if (*(p0 + i) != *(p1 + i)) - { - result = false; - } - } - return result; -} // Compare - - -nn::Result SdReaderWriter::Initialize() -{ - nn::Result result; - - // 初期化済みなら何もしない - if(m_IsInitialized) - { - return nn::ResultSuccess(); - } - - result = SdMountManager::Mount(); - if(result.IsSuccess()) - { - m_IsInitialized = true; - return nn::ResultSuccess(); - } - else - { - return result; - } -} - - -nn::Result SdReaderWriter::Finalize() -{ - nn::Result result; - result = SdMountManager::Unmount(); - - m_IsInitialized = false; - return result; -} - -nn::Result SdReaderWriter::WriteBufCore(const wchar_t* path, void* buf, size_t size) -{ - NN_ASSERT(path != NULL); - NN_ASSERT(size > 0); - - nn::Result result = Initialize(); - COMMON_LOGGER_RESULT_IF_FAILED_WITH_LINE(result); - - result = file.TryInitialize(path, nn::fs::OPEN_MODE_WRITE | nn::fs::OPEN_MODE_CREATE); - - if (result.IsSuccess()) - { - s32 writeSize; - result = file.TryWrite(&writeSize, buf, size, false); - if (result.IsSuccess()) - { - // 何もしない - } - else - { - NN_LOG("SD TryWrite failed\n"); - COMMON_LOGGER_RESULT_IF_FAILED_WITH_LINE(result); - } - } - else - { - NN_LOG("SD TryInitialize failed\n"); - COMMON_LOGGER_RESULT_IF_FAILED_WITH_LINE(result); - } - - return result; -} - -nn::Result SdReaderWriter::WriteBuf(const wchar_t* path, void* buf, size_t size) -{ - nn::Result result; - - result = WriteBufCore(path, buf, size); - NN_UTIL_RETURN_IF_FAILED(result); - - result = file.TryFlush(); - COMMON_LOGGER_RESULT_IF_FAILED_WITH_LINE(result); - file.Finalize(); - - result = Finalize(); - COMMON_LOGGER_RESULT_IF_FAILED_WITH_LINE(result); - - return result; -} - -nn::Result SdReaderWriter::WriteBufWithCmac(const wchar_t* path, void* buf, size_t size) -{ - nn::Result result; - - result = WriteBufCore(path, buf, size); - NN_UTIL_RETURN_IF_FAILED(result); - - nn::crypto::Initialize(); - bit8 sha256Hash[nn::crypto::Sha256Context::HASH_SIZE]; - nn::crypto::CalculateSha256(sha256Hash, buf, size); - - bit8 cmac[nn::crypto::Sha256Context::HASH_SIZE]; - result = nn::crypto::CalculateAesCmacSw(cmac, sha256Hash, nn::crypto::Sha256Context::HASH_SIZE, common::cmacKey); - COMMON_LOGGER_RESULT_IF_FAILED_WITH_LINE(result); - - s32 writeSize; - result = file.TryWrite(&writeSize, cmac, sizeof(cmac), false); - COMMON_LOGGER_RESULT_IF_FAILED_WITH_LINE(result); - - result = file.TryFlush(); - COMMON_LOGGER_RESULT_IF_FAILED_WITH_LINE(result); - - file.Finalize(); - - result = Finalize(); - COMMON_LOGGER_RESULT_IF_FAILED_WITH_LINE(result); - - return result; - -} - -nn::Result SdReaderWriter::ReadBufCore(const wchar_t* path, void* buf, size_t size, size_t* totalSize) -{ - NN_ASSERT(path != NULL); - NN_ASSERT(size > 0); - - nn::Result result; - - if(!m_IsInitialized) - { - Initialize(); - } - - result = file.TryInitialize(path, nn::fs::OPEN_MODE_READ); - if (result.IsSuccess()) - { - s32 readSize; - result = file.TryRead(&readSize, buf, size); - if (result.IsSuccess()) - { - // TODO バッファを超えるサイズのファイル読み込み - *totalSize = readSize; - } - else - { - NN_LOG("SD TryRead failed\n"); - COMMON_LOGGER_RESULT_IF_FAILED_WITH_LINE(result); - } - } - else - { - NN_LOG("SD TryInitialize failed\n"); - COMMON_LOGGER_RESULT_IF_FAILED_WITH_LINE(result); - } - - return result; -} - -nn::Result SdReaderWriter::ReadBuf(const wchar_t* path, void* buf, size_t size, size_t* totalSize) -{ - nn::Result result; - - result = ReadBufCore(path, buf, size, totalSize); - NN_UTIL_RETURN_IF_FAILED(result); - - file.Finalize(); - return result; -} - -nn::Result SdReaderWriter::ReadBufWithCmac(const wchar_t* path, void* buf, size_t size, size_t* totalSize) -{ - nn::Result result; - - NN_ASSERT(size > nn::crypto::Sha256Context::HASH_SIZE); - - result = ReadBufCore(path, buf, size, totalSize); - NN_UTIL_RETURN_IF_FAILED(result); - - file.Finalize(); - - // CMACの検証を行う - nn::crypto::Initialize(); - bit8 sha256Hash[nn::crypto::Sha256Context::HASH_SIZE]; - nn::crypto::CalculateSha256(sha256Hash, buf, size - sizeof(sha256Hash)); - - bit8 cmac[nn::crypto::Sha256Context::HASH_SIZE]; - result = nn::crypto::CalculateAesCmacSw(cmac, sha256Hash, nn::crypto::Sha256Context::HASH_SIZE, common::cmacKey); - COMMON_LOGGER_RESULT_IF_FAILED_WITH_LINE(result); - - if(!Compare(reinterpret_cast(buf) + size - sizeof(sha256Hash), cmac, sizeof(cmac))) - { - // 無効なファイル - COMMON_LOGGER("Verification Failed\n"); - return nn::fs::ResultVerificationFailed(); - } - - *totalSize -= nn::crypto::Sha256Context::HASH_SIZE; - return result; -} - -void SdReaderWriter::CreateDirectory(const wchar_t* path) -{ - nn::Result result; - - if(!m_IsInitialized) - { - Initialize(); - } - - NN_LOG("Create Directory %ls\n", path); - result = nn::fs::TryCreateDirectory(path); - COMMON_LOGGER_RESULT_IF_FAILED_WITH_LINE(result); - - result = Finalize(); - COMMON_LOGGER_RESULT_IF_FAILED_WITH_LINE(result); - -} - -} diff --git a/branches/work/SD_AesCmac/common/SdReaderWriter.h b/branches/work/SD_AesCmac/common/SdReaderWriter.h deleted file mode 100644 index c3d2f63..0000000 --- a/branches/work/SD_AesCmac/common/SdReaderWriter.h +++ /dev/null @@ -1,80 +0,0 @@ -/*---------------------------------------------------------------------------* - Project: Horizon - File: SdReaderWriter.h - - Copyright 2009 Nintendo. All rights reserved. - - These coded instructions, statements, and computer programs contain - proprietary information of Nintendo of America Inc. and/or Nintendo - Company Ltd., and are protected by Federal copyright law. They may - not be disclosed to third parties or copied or duplicated in any form, - in whole or in part, without the prior written consent of Nintendo. - - $Rev$ - *---------------------------------------------------------------------------*/ - -#ifndef SDWRITER_H_ -#define SDWRITER_H_ - -#include - -namespace common -{ - -//! @brief SDカードに書き込むためのクラスです。 -class SdReaderWriter -{ -public : - SdReaderWriter() : m_IsInitialized(false) {}; - ~SdReaderWriter() {}; - - //! @brief 渡されたバッファからサイズ分指定されたパス名で書きこみます - //! @param[in] path sdmc:で始まる出力パス名。予めディレクトリを作っておく必要があります。 - //! @param[in] buf 入力データへのポインタ - //! @param[in] size 入力データのサイズ - nn::Result WriteBuf(const wchar_t* path, void* buf, size_t size); - - //! @brief 渡されたバッファからsizeバイト指定されたパス名で書きこみます。CMACが付加されます。 - //! @param[in] path sdmc:で始まる出力パス名。予めディレクトリを作っておく必要があります。 - //! @param[in] buf 入力データへのポインタ - //! @param[in] size 入力データのサイズ - nn::Result WriteBufWithCmac(const wchar_t* path, void* buf, size_t size); - - //! @brief 渡されたバッファへサイズ分指定されたパス名から読み込みます - //! @param[in] path sdmc:で始まる入力パス名 - //! @param[in] buf 出力バッファへのポインタ - //! @param[in] size バッファサイズ - //! @param[out] totalSize 読み込んだデータのサイズ - nn::Result ReadBuf(const wchar_t* path, void* buf, size_t size, size_t* totalSize); - - //! @brief 渡されたバッファへ(size - CMAC)バイト指定されたパス名から読み込みます - //! @param[in] path sdmc:で始まるCMAC付きの入力パス名 - //! @param[in] buf 出力バッファへのポインタ - //! @param[in] size バッファサイズ - //! @param[out] totalSize 読み込んだデータのサイズ - nn::Result ReadBufWithCmac(const wchar_t* path, void* buf, size_t size, size_t* totalSize); - - //! @brief 渡されたディレクトリ名のディレクトリを作成します - void CreateDirectory(const wchar_t* path); - -private: - nn::Result WriteBufCore(const wchar_t*path, void* buf, size_t size); - - nn::Result ReadBufCore(const wchar_t* path, void* buf, size_t size, size_t* totalSize); - - //! @brief 初期化します。 - nn::Result Initialize(); - - //! @brief 終了します。 - nn::Result Finalize(); - - nn::fs::FileStream file; - - NN_PADDING3; - bool m_IsInitialized; - -}; - -} - -#endif /* SDWRITER_H_ */ diff --git a/branches/work/SD_AesCmac/common/SimplePlayer.cpp b/branches/work/SD_AesCmac/common/SimplePlayer.cpp deleted file mode 100644 index 97e8a76..0000000 --- a/branches/work/SD_AesCmac/common/SimplePlayer.cpp +++ /dev/null @@ -1,240 +0,0 @@ -/*---------------------------------------------------------------------------* - Project: Horizon - File: SimplePlayer.cpp - - Copyright (C)2009 Nintendo Co., Ltd. All rights reserved. - - These coded instructions, statements, and computer programs contain - proprietary information of Nintendo of America Inc. and/or Nintendo - Company Ltd., and are protected by Federal copyright law. They may - not be disclosed to third parties or copied or duplicated in any form, - in whole or in part, without the prior written consent of Nintendo. - - $Rev$ - *---------------------------------------------------------------------------*/ - -#include -#include -#include -#include -#include -#include - -#include -#include "SimplePlayer.h" -#include "wave.h" -#include "HeapManager.h" - -namespace common -{ - -namespace -{ - const int nFiles = 4; // 使用できる voice の最大値は 24 - const char* apFileNames[nFiles] = - { - "rom:/ok.wav", - "rom:/ng.wav", - "rom:/cursor.wav", - "rom:/annotation.wav" - }; - - nn::snd::CTR::Voice* apVoice[nFiles]; - nn::snd::CTR::WaveBuffer aBuffer[nFiles]; - WaveFmt fmt[nFiles]; - WaveData data[nFiles]; - u8* apMemory[nFiles]; - - nn::os::CriticalSection s_CriticalSection; - bool s_SoundThreadInitialized = false; - - // サウンドスレッド関連 - const int SOUND_THREAD_STACK_SIZE = 4096; - nn::os::StackBuffer s_SoundThreadStack; - nn::os::Thread threadSound; - bool threadSoundFlag; - void SoundThreadFunc() - { - // サウンド出力をステレオに - nn::snd::SetSoundOutputMode(nn::snd::OUTPUT_MODE_STEREO); - - // マスターボリュームを設定 - nn::snd::SetMasterVolume( 1.0 ); - - NN_LOG("Loading wav files...\n"); - - // ファイルを開く - for (int i = 0; i < nFiles; i++) - { - if (apFileNames[i] == NULL) continue; - - nn::snd::Voice* pVoice = NULL; - - nn::fs::FileReader fileReader; - nn::Result result = fileReader.TryInitialize(apFileNames[i]); - NN_UTIL_PANIC_IF_FAILED(result); - if (::std::strcmp(::std::strrchr(apFileNames[i], '.'), ".wav") == false) - { - // 連続メモリ領域の取得、確認 - apMemory[i] = reinterpret_cast(HeapManager::GetHeap()->Allocate(GetWaveLength(fileReader), 32)); - if (apMemory[i] == NULL) - { - NN_LOG("Failed to allocate continuous memory\n"); - continue; - } - - - // Wave データを読み込み、キャッシュを無効に - data[i].buf = apMemory[i]; - LoadWave(fileReader, &fmt[i], &data[i]); - nn::snd::FlushDataCache(reinterpret_cast(apMemory[i]), data[i].size); - - NN_LOG("%s (%1dch, %5dHz, %2d-bit wav file)\n", - apFileNames[i], fmt[i].channel, fmt[i].sample_rate, fmt[i].quantum_bits); - - pVoice = apVoice[i] = nn::snd::AllocVoice(128, NULL, NULL); - NN_TASSERT_(pVoice); - - nn::snd::SampleFormat format = (fmt[i].quantum_bits == 8) ? - nn::snd::SAMPLE_FORMAT_PCM8 : - nn::snd::SAMPLE_FORMAT_PCM16; - - pVoice->SetChannelCount( fmt[i].channel ); - pVoice->SetSampleFormat( format ); - - nn::snd::InitializeWaveBuffer(&aBuffer[i]); - aBuffer[i].bufferAddress = apMemory[i]; - aBuffer[i].sampleLength = nn::snd::GetSampleLength(data[i].size, format, fmt[i].channel); - aBuffer[i].loopFlag = false; - - fileReader.Finalize(); - - // 音量の設定 - nn::snd::MixParam mix; - mix.mainBus[nn::snd::CHANNEL_INDEX_FRONT_LEFT ] = 0.707f; // メインボリューム (L) - mix.mainBus[nn::snd::CHANNEL_INDEX_FRONT_RIGHT] = 0.707f; // メインボリューム (R) - pVoice->SetMixParam(mix); - pVoice->SetVolume(1.0f); - - // pitch の設定 - pVoice->SetSampleRate(fmt[i].sample_rate); - pVoice->SetPitch(1.0f); - - } - } - - // 再生開始 - for (int i = 0; i < nFiles; i++) - { - if (apFileNames[i] != NULL) - { - apVoice[i]->SetState( nn::snd::Voice::STATE_PLAY ); - } - } - - s_SoundThreadInitialized = true; - - threadSoundFlag = true; - while (threadSoundFlag) - { - nn::snd::WaitForDspSync(); // DSP からのデータ受信を待つ。 - - - s_CriticalSection.Enter(); // メインスレッドとの排他制御 - nn::snd::SendParameterToDsp(); // パラメータを DSP に送信。 - s_CriticalSection.Leave(); // メインスレッドとの排他制御 - } - - // 再生終了 - for (int i = 0; i < nFiles; i++) - { - if (apVoice[i]) - { - nn::snd::FreeVoice(apVoice[i]); - } - } - } -} - -void InitializeSimplePlayer() -{ - NN_LOG("Initialize SimplePlayer\n"); - - nn::Result result; - - const size_t ROMFS_BUFFER_SIZE = 1024 * 64; - static char buffer[ROMFS_BUFFER_SIZE]; - NN_UTIL_PANIC_IF_FAILED( - nn::fs::MountRom(16, 16, buffer, ROMFS_BUFFER_SIZE)); - - // dsp, snd の初期化 - result = nn::dsp::Initialize(); - NN_UTIL_PANIC_IF_FAILED(result); - result = nn::dsp::LoadDefaultComponent(); - NN_UTIL_PANIC_IF_FAILED(result); - result = nn::snd::Initialize(); - NN_UTIL_PANIC_IF_FAILED(result); - - s_CriticalSection.Initialize(); - - // サウンドスレッドを起動(DSP 割り込みイベント待ち) - threadSound.Start(SoundThreadFunc, s_SoundThreadStack); -} - -void PlaySound(u8 index) -{ - NN_ASSERT(index <= nFiles); - - while(!s_SoundThreadInitialized) - { - nn::os::Thread::Sleep(nn::fnd::TimeSpan::FromMilliSeconds(1)); - } - - nn::snd::CTR::Voice* pVoice = apVoice[index]; - - if (!pVoice->IsPlaying()) - { - nn::snd::InitializeWaveBuffer(&aBuffer[index]); - aBuffer[index].bufferAddress = apMemory[index]; - nn::snd::SampleFormat format = (fmt[index].quantum_bits == 8) ? nn::snd::SAMPLE_FORMAT_PCM8 - : nn::snd::SAMPLE_FORMAT_PCM16; - - aBuffer[index].sampleLength = nn::snd::GetSampleLength(data[index].size, format, fmt[index].channel); - aBuffer[index].loopFlag = false; - - pVoice->AppendWaveBuffer(&aBuffer[index]); - NN_LOG("[voice%d] %s (pitch = %f)\n", - index, - (pVoice->GetState() == nn::snd::Voice::STATE_PAUSE ? "pause" : "play "), - pVoice->GetPitch()); - } -} - -void FinalizeSimplePlayer() -{ - nn::Result result; - - // サウンドスレッドの破棄 - threadSoundFlag = false; - threadSound.Join(); - - // SND の終了処理 - result = nn::snd::Finalize(); - NN_UTIL_PANIC_IF_FAILED(result); - - s_CriticalSection.Finalize(); - - // DSP の終了処理 - result = nn::dsp::UnloadComponent(); - NN_UTIL_PANIC_IF_FAILED(result); - nn::dsp::Finalize(); - - - NN_LOG("Finalize SimplePlayer\n"); - -} - -} // namespace ConsoleBackup -/*---------------------------------------------------------------------------* - End of file - *---------------------------------------------------------------------------*/ diff --git a/branches/work/SD_AesCmac/common/SimplePlayer.h b/branches/work/SD_AesCmac/common/SimplePlayer.h deleted file mode 100644 index b7fe76e..0000000 --- a/branches/work/SD_AesCmac/common/SimplePlayer.h +++ /dev/null @@ -1,37 +0,0 @@ -/*---------------------------------------------------------------------------* - Project: Horizon - File: SimplePlayer.h - - Copyright 2009 Nintendo. All rights reserved. - - These coded instructions, statements, and computer programs contain - proprietary information of Nintendo of America Inc. and/or Nintendo - Company Ltd., and are protected by Federal copyright law. They may - not be disclosed to third parties or copied or duplicated in any form, - in whole or in part, without the prior written consent of Nintendo. - - $Rev$ - *---------------------------------------------------------------------------*/ - -#ifndef SIMPLEPLAYER_H_ -#define SIMPLEPLAYER_H_ - -namespace common -{ - -enum SoundEffect -{ - SOUND_OK, - SOUND_NG, - SOUND_CURSOR, - SOUND_ANNOTATION -}; - -void InitializeSimplePlayer(); -void FinalizeSimplePlayer(); -void PlaySound(u8 index); - -} // namespace ConsoleBackup - - -#endif /* SIMPLEPLAYER_H_ */ diff --git a/branches/work/SD_AesCmac/common/VersionDetect.cpp b/branches/work/SD_AesCmac/common/VersionDetect.cpp deleted file mode 100644 index f028569..0000000 --- a/branches/work/SD_AesCmac/common/VersionDetect.cpp +++ /dev/null @@ -1,120 +0,0 @@ -/*---------------------------------------------------------------------------* - Project: Horizon - File: VersionDetect.cpp - - Copyright 2009 Nintendo. All rights reserved. - - These coded instructions, statements, and computer programs contain - proprietary information of Nintendo of America Inc. and/or Nintendo - Company Ltd., and are protected by Federal copyright law. They may - not be disclosed to third parties or copied or duplicated in any form, - in whole or in part, without the prior written consent of Nintendo. - - $Rev$ - *---------------------------------------------------------------------------*/ - -#include -#include -#include - -#include "VersionDetect.h" -#include "HeapManager.h" -#include "CommonLogger.h" - -namespace common -{ - -void GetCupVersion(nn::pl::CTR::CardUpdateVersion* cup, nn::cfg::CTR::CfgRegionCode region) -{ - nn::Result result; - const size_t BUF_SIZE = 1024; - u8 buf[BUF_SIZE]; - // CUPバージョン - { - result = nn::fs::MountContent("cver:", nn::fs::MEDIA_TYPE_NAND, common::cCupVerId[region], 0, 1, 1, buf, - BUF_SIZE); - COMMON_LOGGER_RESULT_IF_FAILED_WITH_LINE(result); - - nn::fs::FileInputStream fis; - - result = fis.TryInitialize(L"cver:/version.bin"); - COMMON_LOGGER_RESULT_IF_FAILED_WITH_LINE(result); - if (result.IsSuccess()) - { - s64 fileSize = fis.GetSize(); - NN_LOG("version.bin size = %lld\n", fileSize); - s32 ret; - void* addr = NULL; - addr = common::HeapManager::GetHeap()->Allocate(fileSize); - if (addr != NULL) - { - result = fis.TryRead(&ret, addr, fileSize); - COMMON_LOGGER_RESULT_IF_FAILED_WITH_LINE(result); - if (result.IsSuccess()) - { - nn::pl::CTR::CardUpdateVersion* ver_buf = reinterpret_cast (addr); - - std::memcpy(cup, ver_buf, sizeof(nn::pl::CTR::CardUpdateVersion)); - } - common::HeapManager::GetHeap()->Free(addr); - } - } - fis.Finalize(); - - nn::fs::Unmount("cver:"); - } - -} - -void GetNupVersion(nn::pl::CTR::NetworkUpdateVersion* nup, nn::cfg::CTR::CfgRegionCode region) -{ - nn::Result result; - const size_t BUF_SIZE = 1024; - u8 buf[BUF_SIZE]; - - // NUPバージョン - { - result = nn::fs::MountContent("nver:", nn::fs::MEDIA_TYPE_NAND, common::cNupVerId[region], 0, 1, 1, buf, - BUF_SIZE); - COMMON_LOGGER_RESULT_IF_FAILED_WITH_LINE(result); - - nn::fs::FileInputStream fis; - - result = fis.TryInitialize(L"nver:/version.bin"); - COMMON_LOGGER_RESULT_IF_FAILED_WITH_LINE(result); - if (result.IsSuccess()) - { - s64 fileSize = fis.GetSize(); - NN_LOG("version.bin size = %lld\n", fileSize); - s32 ret; - void* addr = NULL; - addr = common::HeapManager::GetHeap()->Allocate(fileSize); - if (addr != NULL) - { - result = fis.TryRead(&ret, addr, fileSize); - COMMON_LOGGER_RESULT_IF_FAILED_WITH_LINE(result); - if (result.IsSuccess()) - { - nn::pl::CTR::NetworkUpdateVersion* ver_buf = - reinterpret_cast (addr); - - std::memcpy(nup, ver_buf, sizeof(nn::pl::CTR::NetworkUpdateVersion)); - } - common::HeapManager::GetHeap()->Free(addr); - } - } - - fis.Finalize(); - nn::fs::Unmount("nver:"); - } - -} - -void GetSystemVersion(common::VerDef* mVerData, nn::cfg::CTR::CfgRegionCode region) -{ - GetCupVersion(&mVerData->cup, region); - GetNupVersion(&mVerData->nup, region); -} - -} - diff --git a/branches/work/SD_AesCmac/common/VersionDetect.h b/branches/work/SD_AesCmac/common/VersionDetect.h deleted file mode 100644 index 652ed09..0000000 --- a/branches/work/SD_AesCmac/common/VersionDetect.h +++ /dev/null @@ -1,30 +0,0 @@ -/*---------------------------------------------------------------------------* - Project: Horizon - File: VersionDetect.h - - Copyright 2009 Nintendo. All rights reserved. - - These coded instructions, statements, and computer programs contain - proprietary information of Nintendo of America Inc. and/or Nintendo - Company Ltd., and are protected by Federal copyright law. They may - not be disclosed to third parties or copied or duplicated in any form, - in whole or in part, without the prior written consent of Nintendo. - - $Rev$ - *---------------------------------------------------------------------------*/ - -#ifndef VERSIONDETECT_H_ -#define VERSIONDETECT_H_ - -#include -#include "common_Types.h" - -namespace common -{ - -void GetSystemVersion(common::VerDef* mVerData, nn::cfg::CTR::CfgRegionCode region); - -} - - -#endif /* VERSIONDETECT_H_ */ diff --git a/branches/work/SD_AesCmac/common/common_Types.h b/branches/work/SD_AesCmac/common/common_Types.h deleted file mode 100644 index 9c7f50d..0000000 --- a/branches/work/SD_AesCmac/common/common_Types.h +++ /dev/null @@ -1,70 +0,0 @@ -/*---------------------------------------------------------------------------* - Project: Horizon - File: common_Types.h - - Copyright 2009 Nintendo. All rights reserved. - - These coded instructions, statements, and computer programs contain - proprietary information of Nintendo of America Inc. and/or Nintendo - Company Ltd., and are protected by Federal copyright law. They may - not be disclosed to third parties or copied or duplicated in any form, - in whole or in part, without the prior written consent of Nintendo. - - $Rev$ - *---------------------------------------------------------------------------*/ - -#ifndef COMMON_TYPES_H_ -#define COMMON_TYPES_H_ - -#include -#include -#include -#include -#include - -namespace common -{ - -const u32 NTR_WIFI_SETTING_SIZE = 0x400; // NTR Wifi 設定のサイズ -const u32 TWL_WIFI_SETTING_SIZE = 0x600; // TWL Wifi 設定のサイズ - - -// NOR領域のみにある設定データ用構造体 -struct NtrNorData -{ - nn::cfg::CTR::NtrConfig ntrConfig; - u8 TwlWiFiSetting[TWL_WIFI_SETTING_SIZE]; - u8 NtrWiFiSetting[NTR_WIFI_SETTING_SIZE]; -}; - -struct CfgCountryLanguage -{ - enum nn::cfg::CTR::CfgCountryCode country; - enum nn::cfg::CTR::CfgLanguageCode language; - NN_PADDING1; -}; - -struct VerDef -{ - nn::pl::CTR::CardUpdateVersion cup; - nn::pl::CTR::NetworkUpdateVersion nup; -}; - -// TODO:リージョン追加時に範囲外アクセスにならないよう注意 -const nn::ProgramId cCupVerId[] = -{ - nn::pl::CTR::SHAREDDATA_TITLEID_CUP_VERSION_JP, - nn::pl::CTR::SHAREDDATA_TITLEID_CUP_VERSION_US, - nn::pl::CTR::SHAREDDATA_TITLEID_CUP_VERSION_EU, -}; - -const nn::ProgramId cNupVerId[] = -{ - nn::pl::CTR::SHAREDDATA_TITLEID_NUP_VERSION_JP, - nn::pl::CTR::SHAREDDATA_TITLEID_NUP_VERSION_US, - nn::pl::CTR::SHAREDDATA_TITLEID_NUP_VERSION_EU, -}; - -} - -#endif /* COMMON_TYPES_H_ */ diff --git a/branches/work/SD_AesCmac/common/configLoader.cpp b/branches/work/SD_AesCmac/common/configLoader.cpp deleted file mode 100644 index b262ba9..0000000 --- a/branches/work/SD_AesCmac/common/configLoader.cpp +++ /dev/null @@ -1,181 +0,0 @@ -#include -#include -#include -#include "configLoader.h" - -namespace common -{ - -Result ConfigFileLoader::Initialize(const wchar_t* fileName, void* buffer, const size_t bufferSize) -{ - s64 fileSize; - FileInputStream fi; - NN_UTIL_RETURN_IF_FAILED(fi.TryInitialize(fileName)); - NN_UTIL_RETURN_IF_FAILED(fi.TryGetSize(&fileSize)); - - // NULL終端ぶん読めるサイズを減らす - if (fileSize > bufferSize - sizeof(wchar_t)) - { - NN_TLOG_("Too Large File\n"); - return Result(nn::Result::LEVEL_FATAL, nn::Result::SUMMARY_OUT_OF_RESOURCE, nn::Result::MODULE_COMMON, nn::Result::DESCRIPTION_TOO_LARGE); - } - - m_Buffer = static_cast(buffer); - NN_UTIL_RETURN_IF_FAILED(fi.TryRead(&m_UsedBufferSize, m_Buffer, fileSize)); - NN_LOG("config size = %d\n", m_UsedBufferSize); - return ParseData(); -} - -void ConfigFileLoader::Finalize() -{ - m_Buffer = 0; - m_ParamNum = 0; -} - -Result ConfigFileLoader::ParseData() -{ - if (!m_Buffer) - { - return Result(nn::Result::LEVEL_FATAL, nn::Result::SUMMARY_INVALID_STATE, nn::Result::MODULE_COMMON, nn::Result::DESCRIPTION_NOT_INITIALIZED); - } - - int pos = 0; - - // ビッグエンディアンでないことを確認 - NN_ASSERTMSG(m_Buffer[0] != 0xfffe, "Invalid Config File's Endian\n"); - - if (m_Buffer[0] == 0xfeff) - { - // UTF-16 BOMの調整 - pos++; - } - - m_ParamNum = 0; - m_ParamName[m_ParamNum] = &(m_Buffer[pos]); - m_ParamValue[m_ParamNum] = L""; - m_Buffer[m_UsedBufferSize / sizeof(wchar_t)] = L'\0'; // NULL終端しておく - - // ダブルクウォート中なら : も文字として読み取る - bool inEscape = false; - // # で行末までコメント - bool inComment = false; - // : で行頭から:までがkey、:から行末までがvalue - bool inSettingKeyValue = false; - - while (pos < m_UsedBufferSize / sizeof(m_Buffer[0])) - { - switch (m_Buffer[pos]) - { - case L'"': - { - inEscape = !inEscape; - } - break; - - case L'#': - { - inComment = true; - } - break; - - case L':': - { - if (inEscape || inComment) - { - break; - } - - if (inSettingKeyValue) - { - break; - } - else - { - inSettingKeyValue = true; - } - m_Buffer[pos] = L'\0'; - m_ParamValue[m_ParamNum++] = &(m_Buffer[pos + 1]); - - } - - break; - case L'\r': - case L'\n': - { - if (inComment) - { - inComment = false; - } - if (inSettingKeyValue) - { - inSettingKeyValue = false; - } - - m_Buffer[pos] = L'\0'; - m_ParamName[m_ParamNum] = &(m_Buffer[pos + 1]); - m_ParamValue[m_ParamNum] = L""; - } - break; - - } - - if (PARAM_MAX_NUM <= m_ParamNum) - { - NN_TLOG_("Too Many Params\n"); - return Result(nn::Result::LEVEL_FATAL, nn::Result::SUMMARY_OUT_OF_RESOURCE, nn::Result::MODULE_COMMON, - nn::Result::DESCRIPTION_TOO_LARGE); - } - pos++; - } - - return ResultSuccess(); -} - -s32 ConfigFileLoader::SearchParamName(const wchar_t *paramName) -{ - if (!m_Buffer) - { - NN_TLOG_("ConfigFileLoader not initialized.\n"); - return -1; - } - - for (s32 i = 0; i < m_ParamNum; i++) - { - if (wcscmp(m_ParamName[i], paramName) == 0) - { - return i; - } - } - return -1; -} - -const wchar_t *ConfigFileLoader::ReadAsWChar(const wchar_t *paramName) -{ - s32 idx = SearchParamName(paramName); - if (idx < 0) - { - NN_LOG("Unknown Parameter Name %ls\n", paramName); - } - return (idx < 0) ? NULL : m_ParamValue[idx]; -} - -const char *ConfigFileLoader::ReadAsChar(const wchar_t *paramName) -{ - memset(m_ReadCharBuffer, 0, sizeof(m_ReadCharBuffer)); - const wchar_t *value = ReadAsWChar(paramName); - if(value == NULL) - { - return NULL; - } - wcstombs(m_ReadCharBuffer, value, sizeof(m_ReadCharBuffer)); - // NULL終端する - m_ReadCharBuffer[sizeof(m_ReadCharBuffer) - 1] = '\0'; - return m_ReadCharBuffer; -} - -int ConfigFileLoader::ReadAsInteger(const wchar_t *paramName) -{ - return atoi(ReadAsChar(paramName)); -} - -} diff --git a/branches/work/SD_AesCmac/common/configLoader.h b/branches/work/SD_AesCmac/common/configLoader.h deleted file mode 100644 index 67e1edf..0000000 --- a/branches/work/SD_AesCmac/common/configLoader.h +++ /dev/null @@ -1,78 +0,0 @@ -#ifndef NN_CONFIG_LOADER_H_ -#define NN_CONFIG_LOADER_H_ - - -namespace common -{ - using namespace nn; - using namespace nn::fs; - using namespace std; - -class ConfigFileLoader -{ -private: - static const int PARAM_VALUE_MAX_STRING_LENGTH = 128; - static const int PARAM_MAX_NUM = 64; - - char m_ReadCharBuffer[PARAM_VALUE_MAX_STRING_LENGTH]; - wchar_t *m_ParamName[PARAM_MAX_NUM]; - wchar_t *m_ParamValue[PARAM_MAX_NUM]; - wchar_t *m_Buffer; - - s32 m_UsedBufferSize; - s32 m_ParamNum; - -public: - ConfigFileLoader() : m_Buffer(0), m_UsedBufferSize(0), m_ParamNum(0) - { - } - -/* - @brief ConfigFileLoader を初期化します. - - 使用するファイルが存在するアーカイブは,あらかじめマウントしておく必要があります. - 読み込みに使用するバッファを確保し,引数 buffer に与える必要があります. - Finalize を呼ぶまでこのバッファは開放しないでください. - - 読み込ませることのできるフォーマット - ・エンコーディング:UTF-16 - ・バイトオーダ  :リトルエンディアン - ・改行記号    :不問 - - 半角コロンを含む行のみパラメータ記述行として読み込み,含まない行は無視します. - 半角コロンより前の文字はすべてパラメータ名として取得し, - 半角コロンより後の文字はすべてパラメータの値として取得します. - ParameterName : ParameterValue; - と記述すると - パラメータ名は L"ParameterName " - パラメータ値は L" ParameterValue;" - となります. - - @param[in] fileName 設定ファイル名 - @param[in] buffer ファイル読み込み用のバッファ - @param[in] bufferSize 上記 buffer の大きさ - - @return 結果を返します. - -*/ - Result Initialize(const wchar_t* fileName, void* buffer, const size_t bufferSize); - void Finalize(); - - // スレッドセーフです. - const wchar_t *ReadAsWChar(const wchar_t *paramName); - - // スレッドセーフではありません. - const char *ReadAsChar(const wchar_t *paramName); - - // スレッドセーフです. - int ReadAsInteger(const wchar_t *paramName); - -private: - Result ParseData(); - s32 SearchParamName(const wchar_t *paramName); -}; - -} - - -#endif // NN_CONFIG_LOADER_H_ diff --git a/branches/work/SD_AesCmac/common/romfiles/annotation.wav b/branches/work/SD_AesCmac/common/romfiles/annotation.wav deleted file mode 100644 index b64f77b43ac9f34d7cd61d8e055e40aee4ba1e2b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 28636 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 diff --git a/branches/work/SD_AesCmac/common/romfiles/cursor.wav b/branches/work/SD_AesCmac/common/romfiles/cursor.wav deleted file mode 100644 index 85765b3dead4eccac6cd33c601a68cd55dadd745..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 29996 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 X9RfQ9b_nbc*dee(V28l}l)(Q2mpGp_ diff --git a/branches/work/SD_AesCmac/common/romfiles/ng.wav b/branches/work/SD_AesCmac/common/romfiles/ng.wav deleted file mode 100644 index dc2f3efc71568e7c5856d8f9db1662051804f6c4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 141180 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 G#Qz^H@u2nq diff --git a/branches/work/SD_AesCmac/common/romfiles/ok.wav b/branches/work/SD_AesCmac/common/romfiles/ok.wav deleted file mode 100644 index bf5149fdbf4e7e1e1cbd4260c707d719eca447a2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 158700 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%0AXBj)7&cZj8@1h8< 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
u?kI$o1k0y}61QJtL!KgbYqfgt&;%p_a6 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 diff --git a/branches/work/SD_AesCmac/common/wave.cpp b/branches/work/SD_AesCmac/common/wave.cpp deleted file mode 100644 index a897109..0000000 --- a/branches/work/SD_AesCmac/common/wave.cpp +++ /dev/null @@ -1,150 +0,0 @@ -/*---------------------------------------------------------------------------* - Project: Horizon - File: wave.c - - Copyright (C)2009 Nintendo Co., Ltd. All rights reserved. - - These coded instructions, statements, and computer programs contain - proprietary information of Nintendo of America Inc. and/or Nintendo - Company Ltd., and are protected by Federal copyright law. They may - not be disclosed to third parties or copied or duplicated in any form, - in whole or in part, without the prior written consent of Nintendo. - - $Rev$ - *---------------------------------------------------------------------------*/ - -/*---------------------------------------------------------------------------*/ -/* includes */ -#include "wave.h" - -/*---------------------------------------------------------------------------*/ -/* functions */ - -/*---------------------------------------------------------------------------* - Name: LoadWave - - Description: Wave データを読み込む. - - Arguments: filepath : ファイルパス - fmt : Wave データの fmt チャンクを格納 - data : Wave データの data チャンクを格納 - - Returns: None. - *---------------------------------------------------------------------------*/ -void LoadWaveCore(nn::fs::FileReader& reader, WaveFmt * fmt, WaveData * data, bool isSizeOnly) -{ - reader.SetPosition(0); - - WaveRiff riff; // RIFF ヘッダ - WaveChunk chunk; // CHUNK - u32 readbyte = 0; // ファイル読み込みの判定に使用 - u32 fsize = reader.GetSize(); - - // RIFF ヘッダ読み込み - reader.Read((u8*)&riff, sizeof(WaveRiff)); - - // サイズを積算 - readbyte += sizeof(WaveRiff); - - // "RIFF" との一致を確認 - if (riff.tag != MAKE_WAVE_TAG_VALUE('R','I','F','F')) - { - NN_PANIC("Not RIFF format.\n"); - } - // "WAVE" との一致を確認 - if ( riff.type != MAKE_WAVE_TAG_VALUE('W','A','V','E') ) - { - NN_PANIC("Not Wave format.\n"); - } - - // ファイルサイズより大きくなるまで読み込む - while(fsize > readbyte) - { - // CHUNK の読み込み - reader.Read((u8*)&chunk, sizeof(WaveChunk)); - readbyte += sizeof(WaveChunk); - - // "fmt " - if (chunk.tag == MAKE_WAVE_TAG_VALUE('f','m','t',' ')) - { - reader.Read((u8*)fmt, sizeof(WaveFmt)); - readbyte += sizeof(WaveFmt); - - // 拡張領域があれば読み捨て - if (chunk.size > sizeof(WaveFmt)) - { - u16 ext_size; - - reader.Read((u8*)&ext_size, sizeof(ext_size)); - readbyte += sizeof(ext_size); - - readbyte += chunk.size; - if (readbyte == fsize) break; - - reader.Seek(ext_size, nn::fs::POSITION_BASE_CURRENT); - } - } - // "data" - else if (chunk.tag == MAKE_WAVE_TAG_VALUE('d','a','t','a')) - { - data->size = chunk.size; - - if (isSizeOnly) - { - return; - } - else - { - reader.Read((u8*)data->buf, data->size); - // 8-bit wav ファイルの場合は unsigned -> signed の変換が必要 - if (fmt->quantum_bits == 8) - { - s8* p = (s8*)data->buf; - for (int i = 0; i < data->size; i++) - { - p[i] -= 128; - } - } - } - readbyte += chunk.size; - } - // それ以外 - else - { - readbyte += chunk.size; - if (readbyte == fsize) break; - - // 読み飛ばす - reader.Seek(chunk.size, nn::fs::POSITION_BASE_CURRENT); - } - } -} - -#ifndef NN_BUILD_RELEASE // Release ビルドでは HostIO は使えません。 -void WriteWaveHeader(nn::hio::CTR::HostFile& hostFile, WaveFmt* fmt, s32 size) -{ - WaveRiff riff; - riff.tag = MAKE_WAVE_TAG_VALUE('R','I','F','F'); - riff.size = - + sizeof(WaveRiff) // riff header - + sizeof(WaveChunk) + sizeof(WaveFmt) // wave fmt header - + sizeof(WaveChunk) + size // wave data - - 8; - riff.type = MAKE_WAVE_TAG_VALUE('W','A','V','E'); - hostFile.Write(&riff, sizeof(WaveRiff)); - - WaveChunk chunk; - chunk.tag = MAKE_WAVE_TAG_VALUE('f','m','t',' '); - chunk.size = sizeof(WaveFmt); - hostFile.Write(&chunk, sizeof(WaveChunk)); - hostFile.Write(fmt, sizeof(WaveFmt)); - - chunk.tag = MAKE_WAVE_TAG_VALUE('d','a','t','a'); - chunk.size = size; - hostFile.Write(&chunk, sizeof(WaveChunk)); -} -#endif // NN_BUILD_RELEASE - -/*---------------------------------------------------------------------------*/ -/* end of file */ -/*---------------------------------------------------------------------------*/ diff --git a/branches/work/SD_AesCmac/common/wave.h b/branches/work/SD_AesCmac/common/wave.h deleted file mode 100644 index cbaf2f3..0000000 --- a/branches/work/SD_AesCmac/common/wave.h +++ /dev/null @@ -1,148 +0,0 @@ -/*---------------------------------------------------------------------------* - Project: Horizon - File: wave.h - - Copyright (C)2009 Nintendo Co., Ltd. All rights reserved. - - These coded instructions, statements, and computer programs contain - proprietary information of Nintendo of America Inc. and/or Nintendo - Company Ltd., and are protected by Federal copyright law. They may - not be disclosed to third parties or copied or duplicated in any form, - in whole or in part, without the prior written consent of Nintendo. - - $Rev$ - *---------------------------------------------------------------------------*/ - -#ifndef __WAVE_HEADER__ -#define __WAVE_HEADER__ - -/*---------------------------------------------------------------------------*/ -/* includes */ -#include -#include -#ifndef NN_BUILD_RELEASE // Release ビルドでは HostIO は使えません。 -#include -#endif // NN_BUILD_RELEASE - -/*---------------------------------------------------------------------------*/ -/* constants */ - -#define MAKE_WAVE_TAG_VALUE(c1, c2, c3, c4) \ - ( c1 | (c2<<8) | (c3<<16) | (c4<<24) ) - -#define MAKE_WAVE_TAG_STRING(str, val) \ - { \ - str[3] = (char) ( (val>>24)&0xff ) ; \ - str[2] = (char) ( (val>>16)&0xff ) ; \ - str[1] = (char) ( (val>> 8)&0xff ) ; \ - str[0] = (char) ( (val )&0xff ) ; \ - str[4] = (char) ( 0 ) ; \ - } - -#define MAKE_FMT_CHUNK(ch, s) \ - { \ - ch.tag = MAKE_WAVE_TAG_VALUE('f', 'm', 't', ' '); \ - ch.size = s; \ - } - -#define MAKE_DATA_CHUNK(ch, s) \ - { \ - ch.tag = MAKE_WAVE_TAG_VALUE('d', 'a', 't', 'a'); \ - ch.size = s; \ - } - -#define saturate(v, min, max) \ - { \ - if ( v < min ) {v = min;} \ - else if ( v > max ) {v = max;} \ - } - -#define swap(v,t) swap_##t##_(v) - -#define swap_u16_(v) \ - { \ - v = (u16)(((v)>> 8)&0x00ff | \ - ((v)<< 8)&0xff00); \ - } - -#define swap_s16_(v) \ - { \ - v = (s16)(((v)>> 8)&0x00ff | \ - ((v)<< 8)&0xff00); \ - } - -#define swap_u32_(v) \ - { \ - v = (u32)(((v)>>24)&0x000000ff | \ - ((v)>> 8)&0x0000ff00 | \ - ((v)<< 8)&0x00ff0000 | \ - ((v)<<24)&0xff000000); \ - } - -#define swap_s32_(v) \ - { \ - v = (s32)(((v)>>24)&0x000000ff | \ - ((v)>> 8)&0x0000ff00 | \ - ((v)<< 8)&0x00ff0000 | \ - ((v)<<24)&0xff000000); \ - } - -/*---------------------------------------------------------------------------*/ -/* typedef */ -typedef struct _riff -{ - u32 tag; - u32 size; - u32 type; -} -WaveRiff; - -typedef struct _chunk -{ - u32 tag; - u32 size; -} -WaveChunk; - -typedef struct _fmt -{ - u16 fmt_id; - u16 channel; - u32 sample_rate; - u32 trans_rate; - u16 block_size; - u16 quantum_bits; -} -WaveFmt; - -typedef struct _data -{ - u32 size; - u8* buf; -} -WaveData; - -/*---------------------------------------------------------------------------*/ -/* prototype */ - -void LoadWaveCore(nn::fs::FileReader&, WaveFmt*, WaveData*, bool); -static inline void LoadWave(nn::fs::FileReader& reader, WaveFmt* fmt, WaveData* data) -{ - LoadWaveCore(reader, fmt, data, false); -} -static inline int GetWaveLength(nn::fs::FileReader& reader) -{ - WaveFmt fmt; - WaveData data; - LoadWaveCore(reader, &fmt, &data, true); - return data.size; -} -#ifndef NN_BUILD_RELEASE // Release ビルドでは HostIO は使えません。 -void WriteWaveHeader(nn::hio::CTR::HostFile& hostFile, WaveFmt* fmt, s32 size); -#endif // NN_BUILD_RELEASE - -#endif // __WAVE_HEADER__ - -/*---------------------------------------------------------------------------*/ -/* end of file */ -/*---------------------------------------------------------------------------*/