From d59ae34e12957fd65362d15fda9fd4acd4464e03 Mon Sep 17 00:00:00 2001 From: Tim Allen Date: Tue, 25 Dec 2012 16:31:55 +1100 Subject: [PATCH] Update to higan v091r14 and ananke v00r03 releases. byuu says: higan changelog: - generates title displayed in emulator window by asking the core - core builds title solely from "information/title" ... if it's not there, you don't get a title at all - sub-system load menu is gone ... since there are multiple revisions of the SGB, this never really worked well anyway - to load an SGB, BS-X or ST cartridge, load the base cartridge first - "File->Load Game" moved to "Load->Import Game" ... may cause a bit of confusion to new users, but I don't like having a single-item menu, we'll just have to explain it to new users - browser window redone to look like ananke - home button here goes to ~/Emulation rather than just ~ like ananke, since this is the home of game folders - game folder icon is now the executable icon for the Tango theme (orange diamond), meant to represent a complete game rather than a game file or archive ananke changelog: - outputs GBC games to "Game Boy Color/" instead of "Game Boy/" - adds the file basename to "information/title" Known issues: - using ananke to load a GB game trips the Super Famicom SGB mode and fails (need to make the full-path auto-detection ignore non-bootable systems) - need to dump and test some BS-X media before releasing - ananke lacks BS-X Satellaview cartridge support - v092 isn't going to let you retarget the ananke/higan game folder path of ~/Emulation, you will have to wait for a future version if that bothers you so greatly [Later, after the v092 release, byuu posted this additional changelog: - kill laevateinn - add title() - add bootable, remove load - combine file, library - combine [][][] paths - fix SFC subtype handling XML->BML - update file browser to use buttons - update file browser keyboard handling - update system XML->BML - fix sufami turbo hashing - remove Cartridge::manifest ] --- ananke/ananke.cpp | 27 + ananke/database/sufami-turbo.hpp | 153 + ananke/database/super-famicom.hpp | 96 +- ananke/famicom.cpp | 1 + ananke/file-dialog.cpp | 24 +- ananke/game-boy-advance.cpp | 1 + ananke/game-boy.cpp | 5 +- ananke/phoenix/core/core.cpp | 4 + ananke/phoenix/core/core.hpp | 1 + ananke/phoenix/gtk/platform.hpp | 4 + ananke/phoenix/gtk/widget/hex-edit.cpp | 4 + ananke/phoenix/gtk/widget/list-view.cpp | 4 + ananke/phoenix/gtk/widget/text-edit.cpp | 4 + ananke/phoenix/gtk/widget/widget.cpp | 6 +- ananke/phoenix/gtk/window.cpp | 1 + ananke/phoenix/qt/platform.moc | 2 +- ananke/resource/archive.png | Bin 0 -> 1067 bytes ananke/resource/resource.bml | 1 + ananke/resource/resource.cpp | 37 + ananke/resource/resource.hpp | 1 + ananke/sufami-turbo.cpp | 71 + ananke/super-famicom.cpp | 3 +- higan/data/laevateinn.hpp | 3812 ----------------- higan/emulator/emulator.hpp | 2 +- higan/emulator/interface.hpp | 3 +- higan/fc/cartridge/board/board.cpp | 7 +- higan/fc/cartridge/cartridge.cpp | 4 + higan/fc/cartridge/cartridge.hpp | 3 + higan/fc/interface/interface.cpp | 6 +- higan/fc/interface/interface.hpp | 1 + higan/gb/cartridge/cartridge.cpp | 7 +- higan/gb/cartridge/cartridge.hpp | 3 + higan/gb/interface/interface.cpp | 8 +- higan/gb/interface/interface.hpp | 1 + higan/gba/cartridge/cartridge.cpp | 13 +- higan/gba/cartridge/cartridge.hpp | 3 + higan/gba/interface/interface.cpp | 6 +- higan/gba/interface/interface.hpp | 1 + higan/nall/directory.hpp | 76 +- higan/nall/emulation/famicom.hpp | 111 +- higan/nall/emulation/game-boy-advance.hpp | 23 +- higan/nall/emulation/game-boy.hpp | 12 +- higan/nall/emulation/super-famicom.hpp | 332 +- higan/nall/file.hpp | 8 + higan/nall/string/base.hpp | 1 + higan/nall/string/core.hpp | 6 + higan/phoenix/core/core.cpp | 4 + higan/phoenix/core/core.hpp | 1 + higan/phoenix/gtk/platform.hpp | 4 + higan/phoenix/gtk/widget/hex-edit.cpp | 4 + higan/phoenix/gtk/widget/list-view.cpp | 4 + higan/phoenix/gtk/widget/text-edit.cpp | 4 + higan/phoenix/gtk/widget/widget.cpp | 12 +- higan/phoenix/gtk/window.cpp | 1 + higan/phoenix/qt/platform.moc | 2 +- higan/phoenix/qt/platform.moc.hpp | 1 + higan/phoenix/qt/widget/widget.cpp | 6 +- higan/phoenix/reference/platform.hpp | 1 + higan/phoenix/reference/widget/widget.cpp | 6 +- higan/phoenix/windows/platform.hpp | 1 + higan/phoenix/windows/widget/widget.cpp | 6 +- .../profile/BS-X Satellaview.sfc/manifest.bml | 9 - higan/profile/Sufami Turbo.sfc/manifest.bml | 10 - higan/profile/Super Game Boy.sfc/boot.rom | Bin 256 -> 0 bytes higan/profile/Super Game Boy.sfc/manifest.bml | 6 - higan/sfc/cartridge/cartridge.cpp | 68 +- higan/sfc/cartridge/cartridge.hpp | 11 + higan/sfc/cartridge/markup.cpp | 6 +- higan/sfc/chip/event-skeleton/event.cpp | 70 + higan/sfc/chip/event-skeleton/event.hpp | 37 + higan/sfc/chip/event/event.cpp | 149 +- higan/sfc/chip/event/event.hpp | 19 +- higan/sfc/interface/interface.cpp | 12 +- higan/sfc/interface/interface.hpp | 1 + higan/target-ethos/general/browser.cpp | 72 +- higan/target-ethos/general/browser.hpp | 5 +- higan/target-ethos/general/presentation.cpp | 23 +- higan/target-ethos/general/presentation.hpp | 5 +- higan/target-ethos/input/input.cpp | 3 - higan/target-ethos/resource/cabinet.png | Bin 667 -> 0 bytes higan/target-ethos/resource/file.png | Bin 844 -> 0 bytes higan/target-ethos/resource/game.png | Bin 0 -> 1490 bytes higan/target-ethos/resource/home.png | Bin 1774 -> 606 bytes higan/target-ethos/resource/resource.bml | 5 +- higan/target-ethos/resource/resource.cpp | 240 +- higan/target-ethos/resource/resource.hpp | 7 +- higan/target-ethos/resource/up.png | Bin 1193 -> 652 bytes higan/target-ethos/utility/utility.cpp | 31 +- higan/target-ethos/utility/utility.hpp | 2 +- higan/target-laevateinn/Makefile | 86 - higan/target-laevateinn/base.hpp | 53 - .../breakpoint/breakpoint.cpp | 238 - .../breakpoint/breakpoint.hpp | 60 - higan/target-laevateinn/console/about.cpp | 32 - higan/target-laevateinn/console/console.cpp | 196 - higan/target-laevateinn/console/console.hpp | 70 - higan/target-laevateinn/cpu/cpu.cpp | 160 - higan/target-laevateinn/cpu/cpu.hpp | 59 - higan/target-laevateinn/cpu/registers.cpp | 105 - higan/target-laevateinn/debugger/debugger.cpp | 76 - higan/target-laevateinn/debugger/debugger.hpp | 71 - higan/target-laevateinn/debugger/hook.cpp | 207 - higan/target-laevateinn/debugger/usage.cpp | 57 - .../target-laevateinn/interface/interface.cpp | 159 - .../target-laevateinn/interface/interface.hpp | 28 - higan/target-laevateinn/main.cpp | 116 - higan/target-laevateinn/memory/memory.cpp | 116 - higan/target-laevateinn/memory/memory.hpp | 21 - .../properties/properties.cpp | 110 - .../properties/properties.hpp | 15 - higan/target-laevateinn/resource.rc | 2 - higan/target-laevateinn/settings/settings.cpp | 15 - higan/target-laevateinn/settings/settings.hpp | 11 - higan/target-laevateinn/smp/registers.cpp | 88 - higan/target-laevateinn/smp/smp.cpp | 108 - higan/target-laevateinn/smp/smp.hpp | 51 - higan/target-laevateinn/tracer/tracer.cpp | 55 - higan/target-laevateinn/tracer/tracer.hpp | 22 - higan/target-laevateinn/video/video.cpp | 46 - higan/target-laevateinn/video/video.hpp | 8 - higan/target-laevateinn/vram/vram.cpp | 126 - higan/target-laevateinn/vram/vram.hpp | 15 - higan/target-laevateinn/window/window.cpp | 25 - higan/target-laevateinn/window/window.hpp | 15 - 124 files changed, 1345 insertions(+), 7024 deletions(-) create mode 100644 ananke/database/sufami-turbo.hpp create mode 100644 ananke/resource/archive.png create mode 100644 ananke/sufami-turbo.cpp delete mode 100755 higan/data/laevateinn.hpp delete mode 100644 higan/profile/BS-X Satellaview.sfc/manifest.bml delete mode 100644 higan/profile/Sufami Turbo.sfc/manifest.bml delete mode 100755 higan/profile/Super Game Boy.sfc/boot.rom delete mode 100644 higan/profile/Super Game Boy.sfc/manifest.bml create mode 100644 higan/sfc/chip/event-skeleton/event.cpp create mode 100644 higan/sfc/chip/event-skeleton/event.hpp delete mode 100644 higan/target-ethos/resource/cabinet.png delete mode 100644 higan/target-ethos/resource/file.png create mode 100644 higan/target-ethos/resource/game.png delete mode 100755 higan/target-laevateinn/Makefile delete mode 100755 higan/target-laevateinn/base.hpp delete mode 100755 higan/target-laevateinn/breakpoint/breakpoint.cpp delete mode 100755 higan/target-laevateinn/breakpoint/breakpoint.hpp delete mode 100755 higan/target-laevateinn/console/about.cpp delete mode 100755 higan/target-laevateinn/console/console.cpp delete mode 100755 higan/target-laevateinn/console/console.hpp delete mode 100755 higan/target-laevateinn/cpu/cpu.cpp delete mode 100755 higan/target-laevateinn/cpu/cpu.hpp delete mode 100755 higan/target-laevateinn/cpu/registers.cpp delete mode 100755 higan/target-laevateinn/debugger/debugger.cpp delete mode 100755 higan/target-laevateinn/debugger/debugger.hpp delete mode 100755 higan/target-laevateinn/debugger/hook.cpp delete mode 100755 higan/target-laevateinn/debugger/usage.cpp delete mode 100755 higan/target-laevateinn/interface/interface.cpp delete mode 100755 higan/target-laevateinn/interface/interface.hpp delete mode 100755 higan/target-laevateinn/main.cpp delete mode 100755 higan/target-laevateinn/memory/memory.cpp delete mode 100755 higan/target-laevateinn/memory/memory.hpp delete mode 100755 higan/target-laevateinn/properties/properties.cpp delete mode 100755 higan/target-laevateinn/properties/properties.hpp delete mode 100755 higan/target-laevateinn/resource.rc delete mode 100755 higan/target-laevateinn/settings/settings.cpp delete mode 100755 higan/target-laevateinn/settings/settings.hpp delete mode 100755 higan/target-laevateinn/smp/registers.cpp delete mode 100755 higan/target-laevateinn/smp/smp.cpp delete mode 100755 higan/target-laevateinn/smp/smp.hpp delete mode 100755 higan/target-laevateinn/tracer/tracer.cpp delete mode 100755 higan/target-laevateinn/tracer/tracer.hpp delete mode 100755 higan/target-laevateinn/video/video.cpp delete mode 100755 higan/target-laevateinn/video/video.hpp delete mode 100755 higan/target-laevateinn/vram/vram.cpp delete mode 100755 higan/target-laevateinn/vram/vram.hpp delete mode 100755 higan/target-laevateinn/window/window.cpp delete mode 100755 higan/target-laevateinn/window/window.hpp diff --git a/ananke/ananke.cpp b/ananke/ananke.cpp index 74a0713c..f52aae2b 100644 --- a/ananke/ananke.cpp +++ b/ananke/ananke.cpp @@ -11,6 +11,7 @@ using namespace phoenix; namespace Database { #include "database/super-famicom.hpp" + #include "database/sufami-turbo.hpp" }; struct Ananke { @@ -42,6 +43,12 @@ struct Ananke { void createSuperFamicomHeuristicFirmware(vector &buffer, const string &pathname, bool firmware_appended); string openSuperFamicom(vector &buffer); + //sufami-turbo.cpp + void copySufamiTurboSaves(const string &pathname); + string createSufamiTurboDatabase(vector &buffer, Markup::Node &document, const string &manifest); + string createSufamiTurboHeuristic(vector &buffer); + string openSufamiTurbo(vector &buffer); + //game-boy.cpp void copyGameBoySaves(const string &pathname); string createGameBoyHeuristic(vector &buffer); @@ -52,6 +59,7 @@ struct Ananke { string createGameBoyAdvanceHeuristic(vector &buffer); string openGameBoyAdvance(vector &buffer); + static bool supported(const string &filename); string open(string filename = ""); }; @@ -61,11 +69,29 @@ struct Ananke { #include "patch.cpp" #include "famicom.cpp" #include "super-famicom.cpp" +#include "sufami-turbo.cpp" #include "game-boy.cpp" #include "game-boy-advance.cpp" FileDialog *fileDialog = nullptr; +bool Ananke::supported(const string &filename) { + string extension = nall::extension(filename); + + if(extension == "fc" ) return true; + if(extension == "nes") return true; + if(extension == "sfc") return true; + if(extension == "smc") return true; + if(extension == "bs" ) return true; + if(extension == "st" ) return true; + if(extension == "gb" ) return true; + if(extension == "gbc") return true; + if(extension == "gba") return true; + if(extension == "zip") return true; + + return false; +} + string Ananke::open(string filename) { if(filename.empty()) { if(!fileDialog) fileDialog = new FileDialog; @@ -92,6 +118,7 @@ string Ananke::open(string filename) { if(information.name.endswith(".fc") || information.name.endswith(".nes")) return openFamicom(buffer); if(information.name.endswith(".sfc") || information.name.endswith(".smc")) return openSuperFamicom(buffer); + if(information.name.endswith(".st")) return openSufamiTurbo(buffer); if(information.name.endswith(".gb") || information.name.endswith(".gbc")) return openGameBoy(buffer); if(information.name.endswith(".gba")) return openGameBoyAdvance(buffer); return ""; diff --git a/ananke/database/sufami-turbo.hpp b/ananke/database/sufami-turbo.hpp new file mode 100644 index 00000000..da9c7997 --- /dev/null +++ b/ananke/database/sufami-turbo.hpp @@ -0,0 +1,153 @@ +string SufamiTurbo = R"( + +database revision=2012-12-24 + +release + cartridge region=NTSC + rom name=program.rom size=0x80000 + ram name=save.ram size=0x800 + information + title: SDウルトラバトル ウルトラマン伝説 + name: SD Ultra Battle - Ultraman Densetsu + region: JP + revision: 1.0 + serial: SFT-0101-JPN + sha256: 2bb55214fb668ca603d7b944b14f105dfb10b987a8902d420fe4ae1cb69c1d4a + configuration + rom name=program.rom size=0x80000 + ram name=save.ram size=0x800 + +release + cartridge region=NTSC + rom name=program.rom size=0x80000 + ram name=save.ram size=0x800 + information + title: SDウルトラバトル セブン伝説 + name: SD Ultra Battle - Seven Densetsu + region: JP + revision: 1.0 + serial: SFT-0102-JPN + sha256: 2fec5f2bc7dee010af10569a3d2bc18715a79a126940800c3eade5abbd625e3f + configuration + rom name=program.rom size=0x80000 + ram name=save.ram size=0x800 + +release + cartridge region=NTSC + rom name=program.rom size=0x80000 + ram name=save.ram size=0x800 + information + title: ポイポイ忍者ワールド + name: Poi Poi Ninja World + region: JP + revision: 1.0 + serial: SFT-0103-JPN + sha256: 602b20b788640f5743487108a10f3f77bca5ce2d24208b25b1ca498a96eb0d69 + configuration + rom name=program.rom size=0x80000 + ram name=save.ram size=0x800 + +release + cartridge region=NTSC + rom name=program.rom size=0x80000 + ram name=save.ram size=0x2000 + information + title: SDガンダムジェネレーション 一年戦争機 + name: SD Gundam Generation - Ichinen Sensouki + region: JP + revision: 1.0 + serial: SFT-0104-JPN + sha256: 3e82215bed08274874b30d461fc4a965c6bca932229da5d46d56e36f484d65eb + configuration + rom name=program.rom size=0x80000 + ram name=save.ram size=0x2000 + +release + cartridge region=NTSC + rom name=program.rom size=0x80000 + ram name=save.ram size=0x2000 + information + title: SDガンダムジェネレーション グリプス戦記 + name: SD Gundam Generation - Grips Senki + region: JP + revision: 1.0 + serial: SFT-0105-JPN + sha256: 8547a08ed11fe408eac282a90ac46654bd2e5f49bda3aec8e5edf166a0a4b9af + configuration + rom name=program.rom size=0x80000 + ram name=save.ram size=0x2000 + +release + cartridge region=NTSC + rom name=program.rom size=0x80000 + information + title: ゲゲゲの鬼太郎 妖怪ドンジャン + name: Gegege no Kitarou - Youkai Dungeon + region: JP + revision: 1.0 + serial: SFT-0106-JPN + sha256: d93b3a570e7cf343f680ab0768a50b77e3577f9c555007e2de3decd6bc4765c8 + configuration + rom name=program.rom size=0x80000 + +release + cartridge region=NTSC + rom name=program.rom size=0x80000 + ram name=save.ram size=0x2000 + information + title: SDガンダムジェネレーション アクシズ戦記 + name: SD Gundam Generation - Axis Senki + region: JP + revision: 1.0 + serial: SFT-0107-JPN + sha256: 2a9d7c9a61318861028a73ca03e32a48cff162d76cba36fbaab8690b212efe9b + configuration + rom name=program.rom size=0x80000 + ram name=save.ram size=0x2000 + +release + cartridge region=NTSC + rom name=program.rom size=0x80000 + ram name=save.ram size=0x2000 + information + title: SDガンダムジェネレーション バビロニア建国戦記 + name: SD Gundam Generation - Babylonia Kenkoku Senki + region: JP + revision: 1.0 + serial: SFT-0108-JPN + sha256: 60ac017c18f534e8cf24ca7f38e22ce92db95ea6c30b2d59d76f13c4f1c8a6e4 + configuration + rom name=program.rom size=0x80000 + ram name=save.ram size=0x2000 + +release + cartridge region=NTSC + rom name=program.rom size=0x80000 + ram name=save.ram size=0x2000 + information + title: SDガンダムジェネレーション ザンスカール戦記 + name: SD Gundam Generation - Zanscar Senki + region: JP + revision: 1.0 + serial: SFT-0110-JPN + sha256: 5951a58a91d8e397d0a237ccc2b1248e17c7312cb9cc11cbc350200a97b4e021 + configuration + rom name=program.rom size=0x80000 + ram name=save.ram size=0x2000 + +release + cartridge region=NTSC + rom name=program.rom size=0x80000 + ram name=save.ram size=0x2000 + information + title: SDガンダムジェネレーション コロニア格闘記 + name: SD Gundam Generation - Colonia Kakotouki + region: JP + revision: 1.0 + serial: SFT-0111-JPN + sha256: e639b5d5d722432b6809ccc6801dc584e1a3016379f34b335ed2dfa73b1ebf69 + configuration + rom name=program.rom size=0x80000 + ram name=save.ram size=0x2000 + +)"; diff --git a/ananke/database/super-famicom.hpp b/ananke/database/super-famicom.hpp index 6c2e653a..fde406a5 100644 --- a/ananke/database/super-famicom.hpp +++ b/ananke/database/super-famicom.hpp @@ -1,6 +1,30 @@ string SuperFamicom = R"( -database revision=2012-12-18 +database revision=2012-12-24 + +release + cartridge region=NTSC + board id:Sufami Turbo + rom name=program.rom size=0x40000 + map id=rom address=00-1f,80-9f:8000-ffff mask=0x8000 + sufamiturbo + slot id=A + map id=rom address=20-3f,a0-bf:8000-ffff mask=0x8000 + map id=ram address=60-6f,e0-ef:0000-ffff + slot id=B + map id=rom address=40-5f,c0-df:0000-7fff mask=0x8000 + map id=rom address=40-5f,c0-df:8000-ffff mask=0x8000 + map id=ram address=70-7f,f0-ff:0000-ffff + information + title: スーファミターボ + name: Sufami Turbo + region: JP + revision: 1.0 + board: Sufami Turbo + serial: SFT-0100-JPN + sha256: edacb453da14f825f05d1134d6035f4bf034e55f7cfb97c70c4ee107eabc7342 + configuration + rom name=program.rom size=0x40000 release cartridge region=NTSC @@ -2394,10 +2418,10 @@ release release cartridge region=NTSC board type=1CA0N6S revision=01 - superfx revision=2 + superfx revision=4 rom name=program.rom size=0x80000 ram name=save.ram size=0x10000 - map id=io address=00-3f,80-bf:3000-32ff + map id=io address=00-3f,80-bf:3000-34ff map id=rom address=00-3f,80-bf:8000-ffff mask=0x8000 map id=rom address=40-5f,c0-df:0000-ffff map id=ram address=00-3f,80-bf:6000-7fff size=0x2000 @@ -2413,6 +2437,7 @@ release configuration rom name=program.rom size=0x80000 ram name=save.ram size=0x10000 + superfx revision=4 release cartridge region=NTSC @@ -2477,10 +2502,10 @@ release release cartridge region=NTSC board type=1CB0N7S revision=01 - superfx revision=3 + superfx revision=4 rom name=program.rom size=0x200000 ram name=save.ram size=0x10000 - map id=io address=00-3f,80-bf:3000-32ff + map id=io address=00-3f,80-bf:3000-34ff map id=rom address=00-3f:8000-ffff mask=0x8000 map id=rom address=40-5f:0000-ffff map id=ram address=00-3f,80-bf:6000-7fff size=0x2000 @@ -2496,6 +2521,7 @@ release configuration rom name=program.rom size=0x200000 ram name=save.ram size=0x10000 + superfx revision=4 release cartridge region=NTSC @@ -5483,6 +5509,26 @@ release rom name=program.rom size=0x100000 ram name=save.ram size=0x2000 +release + cartridge region=NTSC + board type=1J3M revision=01,11,20 + rom name=program.rom size=0x180000 + ram name=save.ram size=0x2000 + map id=rom address=00-3f,80-bf:8000-ffff + map id=rom address=40-7f,c0-ff:0000-ffff + map id=ram address=20-3f,a0-bf:6000-7fff mask=0xe000 + information + title: Madden NFL '96 + name: Madden NFL '96 + region: NA + revision: 1.0 + board: SHVC-1J3M-20 + serial: M/SNS-A6FE-USA + sha256: 3059d86cdc383985c564a7a891fe18e08f5222ead7ede9fa309159d60cde13a1 + configuration + rom name=program.rom size=0x180000 + ram name=save.ram size=0x2000 + release cartridge region=NTSC board type=1J3M revision=01,11,20 @@ -9366,7 +9412,7 @@ release superfx revision=1 rom name=program.rom size=0x100000 ram name=save.ram size=0x8000 - map id=io address=00-3f,80-bf:3000-32ff + map id=io address=00-3f,80-bf:3000-34ff map id=rom address=00-1f,80-9f:8000-ffff mask=0x8000 map id=ram address=60-7f,e0-ff:0000-ffff information @@ -9380,6 +9426,7 @@ release configuration rom name=program.rom size=0x100000 ram name=save.ram size=0x8000 + superfx revision=1 release cartridge region=NTSC @@ -9624,10 +9671,10 @@ release release cartridge region=NTSC board type=1CA6B revision=01 - superfx revision=2 + superfx revision=4 rom name=program.rom size=0x100000 ram name=save.ram size=0x10000 - map id=io address=00-3f,80-bf:3000-32ff + map id=io address=00-3f,80-bf:3000-34ff map id=rom address=00-3f,80-bf:8000-ffff mask=0x8000 map id=rom address=40-5f,c0-df:0000-ffff map id=ram address=00-3f,80-bf:6000-7fff size=0x2000 @@ -9643,6 +9690,7 @@ release configuration rom name=program.rom size=0x100000 ram name=save.ram size=0x10000 + superfx revision=4 release cartridge region=NTSC @@ -10106,6 +10154,28 @@ release configuration rom name=program.rom size=0x100000 +release + cartridge region=NTSC + board id:Super Game Boy + rom name=program.rom size=0x40000 + map id=rom address=00-7f,80-ff:8000-ffff mask=0x8000 + map id=rom address=40-7f,c0-ff:0000-7fff mask=0x8000 + icd2 revision=1 + rom name=sgb.boot.rom size=0x100 + map id=io address=00-3f,80-bf:6000-67ff + map id=io address=00-3f,80-bf:7000-7fff + information + title: Super Game Boy + name: Super Game Boy + region: NA + revision: 1.2 + board: Super Game Boy + serial: N/A + sha256: 4d7fc331a811b8dc630b469262fd6f45e289243cef83101f32038158967d1b28 + configuration + rom name=program.rom size=0x40000 + rom name=sgb.boot.rom size=0x100 + release cartridge region=NTSC board type=1A0N revision=01,02,10,20,30 @@ -10305,10 +10375,10 @@ release release cartridge region=NTSC board type=1CB5B revision=20 - superfx revision=3 + superfx revision=4 rom name=program.rom size=0x200000 ram name=save.ram size=0x8000 - map id=io address=00-3f,80-bf:3000-32ff + map id=io address=00-3f,80-bf:3000-34ff map id=rom address=00-3f:8000-ffff mask=0x8000 map id=rom address=40-5f:0000-ffff map id=ram address=00-3f,80-bf:6000-7fff size=0x2000 @@ -10324,6 +10394,7 @@ release configuration rom name=program.rom size=0x200000 ram name=save.ram size=0x8000 + superfx revision=4 release cartridge region=NTSC @@ -11958,10 +12029,10 @@ release release cartridge region=NTSC board type=1CA0N5S revision=01 - superfx revision=2 + superfx revision=4 rom name=program.rom size=0x80000 ram name=save.ram size=0x8000 - map id=io address=00-3f,80-bf:3000-32ff + map id=io address=00-3f,80-bf:3000-34ff map id=rom address=00-3f,80-bf:8000-ffff mask=0x8000 map id=rom address=40-5f,c0-df:0000-ffff map id=ram address=00-3f,80-bf:6000-7fff size=0x2000 @@ -11977,6 +12048,7 @@ release configuration rom name=program.rom size=0x80000 ram name=save.ram size=0x8000 + superfx revision=4 release cartridge region=NTSC diff --git a/ananke/famicom.cpp b/ananke/famicom.cpp index 1ec80390..00f945e0 100644 --- a/ananke/famicom.cpp +++ b/ananke/famicom.cpp @@ -16,6 +16,7 @@ string Ananke::createFamicomHeuristic(vector &buffer) { FamicomCartridge info(buffer.data(), buffer.size()); string markup = info.markup(); + markup.append("\ninformation\n title: ", nall::basename(information.name), "\n"); if(!information.manifest.empty()) markup = information.manifest; //override with embedded beat manifest, if one exists file::write({pathname, "manifest.bml"}, markup); diff --git a/ananke/file-dialog.cpp b/ananke/file-dialog.cpp index 5821b4b2..fbed32ef 100644 --- a/ananke/file-dialog.cpp +++ b/ananke/file-dialog.cpp @@ -6,7 +6,7 @@ struct FileDialog : Window { Button upButton; ListView fileList; HorizontalLayout controlLayout; - Widget spacer; + Label filterLabel; Button openButton; string open() { @@ -14,11 +14,21 @@ struct FileDialog : Window { setVisible(); fileList.setFocused(); filename = ""; + bool backspace = false; dialogActive = true; while(dialogActive) { OS::processEvents(); if(Keyboard::pressed(Keyboard::Scancode::Escape)) onClose(); + if(Keyboard::pressed(Keyboard::Scancode::Backspace)) { + if(backspace == false) { + backspace = true; + if(fileList.focused()) upButton.onActivate(); + } + } else { + backspace = false; + } + usleep(20 * 1000); } return filename; @@ -42,8 +52,13 @@ struct FileDialog : Window { lstring files = directory::ifiles(pathname); for(auto &file : files) { + if(Ananke::supported(file) == false) continue; //ignore unsupported extensions fileList.append(file); - fileList.setImage(filenameList.size(), 0, {resource::file, sizeof resource::file}); + if(extension(file) == "zip") { + fileList.setImage(filenameList.size(), 0, {resource::archive, sizeof resource::archive}); + } else { + fileList.setImage(filenameList.size(), 0, {resource::file, sizeof resource::file}); + } filenameList.append({pathname, file}); } @@ -53,12 +68,13 @@ struct FileDialog : Window { } FileDialog() { - setGeometry({64, 64, 480, 600}); + setFrameGeometry({64, 64, 480, 600}); setTitle("Load Image"); layout.setMargin(5); homeButton.setImage({resource::home, sizeof resource::home}); upButton.setImage({resource::up, sizeof resource::up}); + filterLabel.setText("Filter: *.fc, *.sfc, *.bs, *.st, *.gb, *.gbc, *.gba, *.nes, *.smc, *.zip"); openButton.setText("Open"); append(layout); @@ -68,7 +84,7 @@ struct FileDialog : Window { pathLayout.append(upButton, {28, 28}); layout.append(fileList, {~0, ~0}, 5); layout.append(controlLayout, {~0, 0}); - controlLayout.append(spacer, {~0, 0}); + controlLayout.append(filterLabel, {~0, 0}, 5); controlLayout.append(openButton, {80, 0}); pathEdit.onActivate = [&] { diff --git a/ananke/game-boy-advance.cpp b/ananke/game-boy-advance.cpp index d4ab934c..30b93f59 100644 --- a/ananke/game-boy-advance.cpp +++ b/ananke/game-boy-advance.cpp @@ -22,6 +22,7 @@ string Ananke::createGameBoyAdvanceHeuristic(vector &buffer) { GameBoyAdvanceCartridge info(buffer.data(), buffer.size()); string markup = info.markup; + markup.append("\ninformation\n title: ", nall::basename(information.name), "\n"); if(!information.manifest.empty()) markup = information.manifest; //override with embedded beat manifest, if one exists file::write({pathname, "manifest.bml"}, markup); diff --git a/ananke/game-boy.cpp b/ananke/game-boy.cpp index d6c5d142..3daca00c 100644 --- a/ananke/game-boy.cpp +++ b/ananke/game-boy.cpp @@ -17,16 +17,17 @@ string Ananke::createGameBoyHeuristic(vector &buffer) { string pathname = { userpath(), - "Emulation/Game Boy/", + "Emulation/Game Boy", (info.info.cgb ? " Color" : ""), "/", nall::basename(information.name), " (!).", (info.info.cgb ? "gbc" : "gb"), "/" }; directory::create(pathname); string markup = info.markup; + markup.append("\ninformation\n title: ", nall::basename(information.name), "\n"); if(!information.manifest.empty()) markup = information.manifest; //override with embedded beat manifest, if one exists - file::write({pathname, "manifest.bml"}, info.markup); + file::write({pathname, "manifest.bml"}, markup); file::write({pathname, "program.rom"}, buffer); copyGameBoySaves(pathname); diff --git a/ananke/phoenix/core/core.cpp b/ananke/phoenix/core/core.cpp index 83767dca..caa326b4 100644 --- a/ananke/phoenix/core/core.cpp +++ b/ananke/phoenix/core/core.cpp @@ -674,6 +674,10 @@ bool Widget::enabled() { return state.enabled; } +bool Widget::focused() { + return p.focused(); +} + string Widget::font() { return state.font; } diff --git a/ananke/phoenix/core/core.hpp b/ananke/phoenix/core/core.hpp index a11d756c..dbf53a73 100644 --- a/ananke/phoenix/core/core.hpp +++ b/ananke/phoenix/core/core.hpp @@ -333,6 +333,7 @@ struct Layout : private nall::base_from_member, Sizable { struct Widget : private nall::base_from_member, Sizable { bool enabled(); + bool focused(); nall::string font(); Geometry geometry(); Geometry minimumGeometry(); diff --git a/ananke/phoenix/gtk/platform.hpp b/ananke/phoenix/gtk/platform.hpp index 344e8239..01c4a223 100644 --- a/ananke/phoenix/gtk/platform.hpp +++ b/ananke/phoenix/gtk/platform.hpp @@ -231,6 +231,7 @@ struct pWidget : public pSizable { GtkWidget *gtkWidget; bool enabled(); + virtual bool focused(); virtual Geometry minimumGeometry(); void setEnabled(bool enabled); virtual void setFocused(); @@ -310,6 +311,7 @@ struct pHexEdit : public pWidget { GtkTextBuffer *textBuffer; GtkTextMark *textCursor; + bool focused(); void setColumns(unsigned columns); void setLength(unsigned length); void setOffset(unsigned offset); @@ -396,6 +398,7 @@ struct pListView : public pWidget { void append(const lstring &text); void autoSizeColumns(); bool checked(unsigned row); + bool focused(); void modify(unsigned row, const lstring &text); void remove(unsigned row); void reset(); @@ -449,6 +452,7 @@ struct pTextEdit : public pWidget { GtkWidget *subWidget; GtkTextBuffer *textBuffer; + bool focused(); void setCursorPosition(unsigned position); void setEditable(bool editable); void setText(const string &text); diff --git a/ananke/phoenix/gtk/widget/hex-edit.cpp b/ananke/phoenix/gtk/widget/hex-edit.cpp index 9c0dbdef..ec10cd7c 100644 --- a/ananke/phoenix/gtk/widget/hex-edit.cpp +++ b/ananke/phoenix/gtk/widget/hex-edit.cpp @@ -7,6 +7,10 @@ static bool HexEdit_scroll(GtkRange *range, GtkScrollType scroll, gdouble value, return false; } +bool pHexEdit::focused() { + return GTK_WIDGET_HAS_FOCUS(subWidget); +} + void pHexEdit::setColumns(unsigned columns) { setScroll(); update(); diff --git a/ananke/phoenix/gtk/widget/list-view.cpp b/ananke/phoenix/gtk/widget/list-view.cpp index 5572c1f7..10e1d439 100644 --- a/ananke/phoenix/gtk/widget/list-view.cpp +++ b/ananke/phoenix/gtk/widget/list-view.cpp @@ -35,6 +35,10 @@ bool pListView::checked(unsigned row) { return state; } +bool pListView::focused() { + return GTK_WIDGET_HAS_FOCUS(subWidget); +} + void pListView::modify(unsigned row, const lstring &text) { GtkTreeModel *model = gtk_tree_view_get_model(GTK_TREE_VIEW(subWidget)); GtkTreeIter iter; diff --git a/ananke/phoenix/gtk/widget/text-edit.cpp b/ananke/phoenix/gtk/widget/text-edit.cpp index 08812fb3..2d2b740b 100644 --- a/ananke/phoenix/gtk/widget/text-edit.cpp +++ b/ananke/phoenix/gtk/widget/text-edit.cpp @@ -3,6 +3,10 @@ static void TextEdit_change(TextEdit *self) { if(self->p.locked == false && self->onChange) self->onChange(); } +bool pTextEdit::focused() { + return GTK_WIDGET_HAS_FOCUS(subWidget); +} + void pTextEdit::setCursorPosition(unsigned position) { GtkTextMark *mark = gtk_text_buffer_get_mark(textBuffer, "insert"); GtkTextIter iter; diff --git a/ananke/phoenix/gtk/widget/widget.cpp b/ananke/phoenix/gtk/widget/widget.cpp index dceb8266..a3b04c1b 100644 --- a/ananke/phoenix/gtk/widget/widget.cpp +++ b/ananke/phoenix/gtk/widget/widget.cpp @@ -1,11 +1,15 @@ Geometry pWidget::minimumGeometry() { - return { 0, 0, 0, 0 }; + return {0, 0, 0, 0}; } bool pWidget::enabled() { return gtk_widget_get_sensitive(gtkWidget); } +bool pWidget::focused() { + return GTK_WIDGET_HAS_FOCUS(gtkWidget); +} + void pWidget::setEnabled(bool enabled) { if(widget.state.abstract) enabled = false; if(sizable.state.layout && sizable.state.layout->enabled() == false) enabled = false; diff --git a/ananke/phoenix/gtk/window.cpp b/ananke/phoenix/gtk/window.cpp index ae1521a3..b2457b5e 100644 --- a/ananke/phoenix/gtk/window.cpp +++ b/ananke/phoenix/gtk/window.cpp @@ -30,6 +30,7 @@ static gboolean Window_expose(GtkWidget *widget, GdkEvent *event, Window *window static gboolean Window_configure(GtkWidget *widget, GdkEvent *event, Window *window) { if(gtk_widget_get_realized(window->p.widget) == false) return false; + if(window->visible() == false) return false; GdkWindow *gdkWindow = gtk_widget_get_window(widget); GdkRectangle border, client; diff --git a/ananke/phoenix/qt/platform.moc b/ananke/phoenix/qt/platform.moc index bf31cfa0..eab647f5 100644 --- a/ananke/phoenix/qt/platform.moc +++ b/ananke/phoenix/qt/platform.moc @@ -1,7 +1,7 @@ /**************************************************************************** ** Meta object code from reading C++ file 'platform.moc.hpp' ** -** Created: Thu Aug 9 18:10:14 2012 +** Created: Fri Dec 21 16:30:24 2012 ** by: The Qt Meta Object Compiler version 62 (Qt 4.6.3) ** ** WARNING! All changes made in this file will be lost! diff --git a/ananke/resource/archive.png b/ananke/resource/archive.png new file mode 100644 index 0000000000000000000000000000000000000000..4b55b504af9993c40c2314f11d1ab58f728cb43b GIT binary patch literal 1067 zcmV+`1l0S9P)_(TaVgb657zbqVb6YQ9Yp{)uHPI$P&0x6?Cz35>9(%)GIKJ0~gQwNc=SFiy%eIa0j`vjVrz@2MUC9L` zlgIB}-QBkMfz^8aLLaBU`B(~tE7&N++6X0}L{JK}5|k3O0yV8KE>Gd|PjXYoi<1B2 z6s?KS8y?HAdip^#@af57-&G!XzpG(hGL<~JY~`l*_9Y$Kjs1!jG*FBton)N_Ye5-A zd$FikD7B&uh%OsWHqWP!8>g>#Euu8PT^O5i)^6(DlRa1_(6cc;H)u>9Yg@2%p*V6w z1AXa7o_UStxwn!VIX8JRhas`u}9i&)h|J z`KdRmMbb1E6Hhm12HH(3p8@`Kql%qrYQ|6WC%77hWlg4X5eF z+;zwDf1agr&LZw!xuHe09=1v^7C7n@JE!~w2e!{S{P^bG52rH=ubChI3%=dIJvVgz z$Bmu4Dq;X&Uw6|(V(n3-bx}llqBPD%HJElY&WOae94>F8C;)hVPgbT7a3CLcH@5&3 zZFH$)?W+tN>#1(BM%;Y=I==sW2cFVx0G{~8XLk)|0Zf@CIChU-2I$?ACXq^$Or`5W zAV@X>u%TqX66UJaB`9t1lMQttpp7@<+>8XY@$eJ%@qjjd?F5YW2om-2fcf_xxRC@r zkDyL5VEpnG_(0)W1OlKH;)-Yd6u4S)K^2HXsdCZ11sDS^0Z}yq%|ON}Z*aK(%-qbv zj?!>Nl5v#@$CY(gbxqt3_4i@L8v^E+_KZp-rV!92-TUJ7#9P>%uM1&IjpwZjhZ*_g z#Kb#50`RDKhfL4;tw5&K2E=z(4-^0eWQk9H9w=5L0FVS)N}JCZq%|TWzK>C093~&P l*Q &buffer, Markup::Node &document, const string &manifest) { + string pathname = { + userpath(), "Emulation/Sufami Turbo/", + document["release/information/name"].text(), + " (", document["release/information/region"].text(), ")", + " (", document["release/information/revision"].text(), ")", + ".st/" + }; + directory::create(pathname); + + //strip "release" root node from database entry (since a single game manifest isn't part of a database) + string markup = manifest; + markup.replace("\n ", "\n"); + markup.replace("information", "\ninformation"); + markup.ltrim<1>("release\n"); + + file::write({pathname, "manifest.bml"}, markup); + file::write({pathname, "program.rom"}, buffer); + copySufamiTurboSaves(pathname); + + return ""; +} + +string Ananke::createSufamiTurboHeuristic(vector &buffer) { + string pathname = { + userpath(), "Emulation/Sufami Turbo/", + nall::basename(information.name), + " (!).st/" + }; + directory::create(pathname); + + file::write({pathname, "manifest.bml"}, { + "cartridge\n", + " rom name=program.rom size=0x", hex(buffer.size()), "\n", + " ram name=save.ram size=0x2000\n" + "\n" + "information\n" + " title: ", nall::basename(information.name), "\n" + }); + file::write({pathname, "program.rom"}, buffer); + copySufamiTurboSaves(pathname); + + return ""; +} + +string Ananke::openSufamiTurbo(vector &buffer) { + string sha256 = nall::sha256(buffer.data(), buffer.size()); + + string databaseText = string::read({configpath(), "ananke/database/Sufami Turbo.bml"}).strip(); + if(databaseText.empty()) databaseText = string{Database::SufamiTurbo}.strip(); + lstring databaseItem = databaseText.split("\n\n"); + + for(auto &item : databaseItem) { + item.append("\n"); + auto document = Markup::Document(item); + + if(document["release/information/sha256"].text() == sha256) { + return createSufamiTurboDatabase(buffer, document, item); + } + } + + return createSufamiTurboHeuristic(buffer); +} diff --git a/ananke/super-famicom.cpp b/ananke/super-famicom.cpp index 40612a00..02a80f29 100644 --- a/ananke/super-famicom.cpp +++ b/ananke/super-famicom.cpp @@ -55,6 +55,7 @@ string Ananke::createSuperFamicomHeuristic(vector &buffer) { SuperFamicomCartridge info(buffer.data(), buffer.size()); string markup = info.markup; + markup.append("\ninformation\n title: ", nall::basename(information.name), "\n"); if(!information.manifest.empty()) markup = information.manifest; //override with embedded beat manifest, if one exists information.manifest = markup; //save for use with firmware routine below @@ -121,7 +122,7 @@ void Ananke::createSuperFamicomHeuristicFirmware(vector &buffer, const string Ananke::openSuperFamicom(vector &buffer) { string sha256 = nall::sha256(buffer.data(), buffer.size()); - string databaseText = string::read({configpath(), "ananke/database/Super Famicom.bml"}).rtrim("\n"); + string databaseText = string::read({configpath(), "ananke/database/Super Famicom.bml"}).strip(); if(databaseText.empty()) databaseText = string{Database::SuperFamicom}.strip(); lstring databaseItem = databaseText.split("\n\n"); diff --git a/higan/data/laevateinn.hpp b/higan/data/laevateinn.hpp deleted file mode 100755 index b3746f38..00000000 --- a/higan/data/laevateinn.hpp +++ /dev/null @@ -1,3812 +0,0 @@ -uint8_t laevateinnLogo[121905] = { - 137,80,78,71,13,10,26,10,0,0,0,13,73,72,68,82,0,0,1,32,0,0,1,104,8,6,0,0,0,247,136,38, - 129,0,0,0,9,112,72,89,115,0,0,11,19,0,0,11,19,1,0,154,156,24,0,0,0,4,103,65,77,65,0,0, - 177,142,124,251,81,147,0,0,0,32,99,72,82,77,0,0,122,37,0,0,128,131,0,0,249,255,0,0,128,233,0,0, - 117,48,0,0,234,96,0,0,58,152,0,0,23,111,146,95,197,70,0,1,219,167,73,68,65,84,120,218,236,253,119,152, - 100,215,117,222,11,255,246,62,161,114,85,231,220,51,61,57,103,12,114,14,36,2,193,28,36,81,129,162,2,149,124,229, - 251,73,150,174,172,123,45,75,126,244,93,203,178,37,75,178,44,90,209,164,40,81,34,197,12,18,32,0,34,199,193,0, - 147,83,247,116,206,93,93,93,185,234,196,189,239,31,85,51,24,128,32,197,128,72,246,122,158,126,122,166,186,234,156,83, - 59,188,123,173,119,37,81,187,239,125,188,26,98,10,137,18,146,55,131,68,226,22,255,242,224,4,31,248,143,79,240,86, - 144,255,1,244,0,255,127,224,111,129,191,4,54,3,231,129,63,251,46,175,245,21,96,14,56,2,124,28,24,5,2,224, - 52,176,23,184,23,216,222,252,187,15,104,192,0,20,208,14,180,129,184,14,228,81,48,218,65,100,33,92,128,160,23,184, - 237,251,252,158,117,96,6,216,4,252,28,176,3,200,1,78,243,153,126,5,168,189,9,231,231,131,192,6,192,2,126,23, - 248,123,224,16,240,54,32,211,124,246,231,154,99,56,12,172,109,142,101,25,120,7,112,79,115,156,199,128,46,96,13,112, - 13,240,123,205,107,143,0,133,230,56,76,0,235,128,241,230,123,119,1,207,3,155,119,238,163,239,193,23,48,61,221,188, - 218,171,35,251,6,223,216,61,107,178,42,63,116,34,155,160,147,105,44,0,209,9,134,9,118,20,226,2,18,199,32,19, - 129,214,18,200,24,44,118,73,57,211,166,84,185,38,132,54,163,81,64,124,119,55,20,2,195,247,80,190,191,58,248,171, - 178,10,64,63,140,18,54,79,216,13,64,43,24,123,192,182,32,17,66,26,104,23,141,3,183,79,66,111,20,186,93,41, - 123,124,132,182,85,248,76,196,180,239,245,60,231,220,161,214,142,96,241,255,248,61,116,52,14,74,125,199,247,246,147,105, - 54,223,251,207,180,220,251,25,172,213,169,88,149,85,0,250,225,17,221,52,125,210,32,135,193,238,128,84,30,58,5,244, - 43,88,35,97,16,24,112,160,191,98,199,122,150,251,250,187,138,61,93,169,83,139,179,241,3,83,51,179,59,96,26,207, - 137,152,169,140,40,253,135,255,73,213,144,72,253,237,77,0,45,4,82,26,152,145,40,174,214,4,158,71,128,32,4,236, - 213,41,89,149,85,0,250,225,208,120,2,96,17,140,50,36,98,66,116,197,96,77,168,245,6,27,54,123,66,110,204,167, - 50,107,179,241,84,231,98,212,200,208,149,78,248,29,237,178,218,213,75,110,100,148,173,217,229,153,29,97,248,152,128,103, - 77,88,52,93,39,236,125,236,107,44,93,125,27,202,52,17,175,0,66,66,26,24,177,56,218,169,81,203,103,25,57,252, - 56,239,172,85,120,252,208,163,164,42,165,213,73,89,149,85,0,250,65,151,0,72,0,187,64,62,6,113,3,250,226,176, - 205,210,122,47,66,236,200,153,246,186,137,150,206,129,165,77,27,90,229,186,158,72,58,41,201,196,124,124,43,198,145,227, - 211,180,125,249,158,218,187,87,138,103,58,225,17,15,30,76,194,177,9,88,238,242,92,117,205,125,159,229,212,229,55,224, - 89,54,232,240,2,234,16,88,54,88,22,193,242,2,147,143,126,149,59,206,30,69,140,156,226,241,192,167,79,107,20,223, - 53,107,180,42,171,0,180,42,111,69,137,3,62,216,87,64,187,11,59,12,184,218,133,203,207,39,90,182,77,172,219,208, - 163,183,15,196,90,59,99,162,95,57,224,148,136,138,12,211,101,120,254,201,231,184,250,220,248,220,53,120,135,52,60,236, - 193,83,14,140,236,129,242,28,168,218,37,54,157,22,2,109,152,4,150,141,85,175,48,116,234,24,222,217,227,44,31,126, - 156,133,82,30,5,92,160,170,245,234,148,172,202,42,0,189,53,197,6,142,211,112,237,14,54,205,42,247,95,209,38,34, - 96,172,129,30,23,110,0,110,155,138,197,47,159,61,112,217,218,112,109,38,154,76,199,241,125,77,101,113,133,186,116,137, - 181,165,152,40,20,201,62,252,130,247,225,197,236,240,32,250,81,23,30,52,225,72,20,22,142,129,59,1,108,107,242,72, - 8,129,147,72,129,20,36,10,57,182,61,245,32,226,241,175,179,185,94,229,108,224,147,93,213,116,94,19,209,128,48,4, - 58,13,162,40,208,1,160,245,42,0,173,202,107,43,17,224,33,94,140,141,201,1,7,128,202,183,249,140,4,211,131,117, - 26,222,54,223,59,240,54,245,193,187,186,230,74,211,20,231,75,164,242,138,164,89,39,19,9,49,91,211,156,154,205,211, - 245,240,243,249,31,175,212,143,217,240,144,11,143,104,56,101,64,241,147,16,246,53,65,79,92,0,22,207,101,207,3,159, - 167,115,252,28,189,195,39,48,125,143,17,173,145,171,83,245,154,138,0,188,153,25,236,143,255,111,130,187,62,128,221,26, - 193,180,77,188,10,232,239,194,27,249,102,148,213,181,243,22,56,33,82,64,43,141,128,181,86,96,99,83,43,217,242,178, - 159,237,64,6,12,5,9,7,186,23,174,189,188,99,232,186,253,144,93,166,152,155,39,52,107,36,45,73,38,222,206,241, - 51,203,36,30,58,154,191,171,82,127,214,128,127,9,224,115,2,158,47,65,254,72,3,119,88,15,172,0,109,205,251,77, - 250,30,251,191,242,15,12,158,60,140,233,185,63,48,167,240,91,1,128,252,220,18,230,191,251,57,190,116,160,151,242,47, - 254,12,143,254,237,39,8,125,7,157,150,72,67,34,132,120,203,174,239,85,121,139,136,75,35,58,186,11,56,215,60,61, - 76,26,241,61,23,248,150,24,4,109,144,79,9,57,91,59,114,186,242,84,127,75,250,221,239,184,150,165,130,199,225,179, - 227,100,11,101,142,141,47,208,114,236,92,237,71,235,181,243,62,60,166,225,97,31,70,226,224,215,155,38,223,94,224,102, - 160,175,105,126,117,94,48,195,86,229,141,3,162,48,192,171,148,153,253,220,39,121,254,115,159,164,255,207,126,159,53,191, - 252,127,225,190,227,131,136,182,40,182,48,9,235,26,241,22,98,222,86,53,160,183,152,186,42,129,98,243,255,123,155,192, - 240,110,224,110,224,125,192,65,240,21,76,249,90,61,125,197,244,228,11,149,39,143,120,231,23,114,244,36,76,126,241,253, - 239,226,224,109,55,48,93,46,176,195,169,123,166,82,10,48,52,100,108,104,53,33,214,6,70,6,68,186,121,143,36,141, - 20,3,86,249,157,55,149,214,96,2,245,241,17,82,191,249,49,126,251,178,62,30,252,185,159,36,56,122,146,72,82,144, - 202,72,132,148,171,0,180,42,175,157,74,158,108,114,67,135,155,154,143,251,162,137,166,5,100,5,60,17,117,235,95,217, - 255,252,137,231,22,159,92,116,203,50,202,217,51,79,115,249,222,65,62,241,55,255,133,142,159,252,137,248,145,84,219,80, - 5,110,143,194,135,37,188,199,129,235,99,176,235,122,232,235,130,68,30,228,170,145,245,230,20,125,225,64,10,3,170,149, - 50,222,151,62,77,225,206,3,212,126,238,39,249,235,191,250,59,148,91,195,72,75,120,147,155,103,171,0,244,22,151,11, - 218,201,2,112,31,240,32,240,0,120,45,48,234,194,215,59,85,240,249,29,223,120,248,208,241,7,158,115,236,161,29,76, - 61,51,130,63,126,158,119,255,231,143,217,87,63,248,143,221,227,63,242,227,151,63,148,234,254,192,188,48,63,22,192,47, - 75,248,185,24,124,64,194,117,243,176,201,129,54,7,236,101,16,106,117,184,223,212,27,217,242,61,114,159,251,123,254,224, - 215,63,202,115,55,239,162,246,241,191,68,151,43,184,118,136,142,201,55,165,14,187,10,64,63,64,11,48,108,254,30,2, - 178,224,250,66,140,251,82,62,210,165,220,175,111,250,242,163,39,31,253,187,111,248,201,29,219,8,85,129,83,247,126,134, - 193,190,8,63,251,233,63,177,14,124,246,239,186,30,185,237,242,125,159,217,216,241,246,175,182,118,254,200,73,97,253,156, - 134,159,181,225,199,21,220,169,224,178,121,88,51,3,153,115,13,48,146,149,75,78,226,87,55,63,123,85,190,31,205,248, - 2,196,20,39,199,168,254,246,47,51,117,112,128,23,126,225,35,116,29,59,73,152,20,68,51,18,195,120,243,108,251,85, - 18,250,45,174,130,155,52,74,92,196,64,238,132,72,28,98,123,32,82,6,43,166,117,2,104,245,161,214,175,130,197,200, - 215,190,158,251,219,185,185,204,109,191,241,145,216,181,155,54,51,253,220,33,18,99,51,188,237,230,183,113,217,13,255,204, - 3,95,254,188,125,254,145,39,218,78,141,140,183,77,14,207,173,237,158,205,30,88,27,250,51,105,56,111,194,176,130,241, - 89,152,93,128,101,160,96,66,197,6,119,1,130,16,148,209,220,0,171,154,210,155,3,140,172,48,192,43,23,73,126,225, - 31,232,187,231,179,100,223,249,35,28,186,246,22,54,189,235,3,116,181,197,168,85,87,1,104,85,190,7,147,75,52,249, - 31,11,228,46,136,204,67,70,65,71,10,122,5,12,248,208,158,128,24,208,82,211,186,199,133,78,29,141,13,4,134,109, - 4,147,11,222,63,255,201,39,98,238,237,215,176,251,250,189,200,184,201,233,71,191,64,207,192,90,62,116,199,157,204,95, - 113,37,199,159,57,204,212,11,47,36,138,249,108,226,212,236,210,96,231,124,97,103,219,124,33,107,46,101,23,98,42,156, - 181,27,152,55,227,55,126,22,134,97,217,130,194,58,168,70,192,115,33,176,65,201,85,205,232,205,35,190,71,199,231,62, - 201,103,63,247,73,158,250,147,255,196,47,125,236,215,121,215,135,126,178,113,116,173,2,208,170,124,167,38,86,20,164,15, - 86,39,196,103,161,43,6,131,186,81,227,107,115,29,134,10,210,30,200,71,51,173,37,83,70,74,17,25,9,186,59,147, - 173,67,221,150,238,50,69,44,147,17,59,77,67,72,175,74,110,250,12,167,31,94,161,119,247,78,118,92,125,3,238,204, - 56,179,11,103,176,218,58,185,226,242,13,108,90,223,203,244,240,56,194,194,240,188,82,139,151,93,105,145,217,202,250,197, - 147,147,110,253,228,104,41,62,183,180,210,230,123,75,9,21,206,217,48,19,194,76,0,179,157,176,16,192,130,3,203,239, - 132,90,5,130,55,39,251,240,195,107,162,229,39,206,243,251,191,245,11,124,226,227,127,200,244,196,249,85,0,90,149,111, - 109,102,105,26,9,166,221,192,187,32,102,67,151,128,53,26,214,89,13,208,217,90,74,36,55,102,215,172,233,245,183,108, - 204,68,55,14,68,186,134,58,89,159,18,152,182,65,38,145,36,21,73,160,113,241,106,101,242,217,34,147,19,243,20,125, - 65,247,224,6,218,163,54,165,209,195,164,59,123,145,145,78,170,217,5,170,179,11,88,118,11,194,173,48,57,50,77,204, - 142,99,72,65,203,134,30,99,199,85,59,227,66,136,120,113,33,219,179,112,122,118,235,194,185,37,71,143,206,151,219,114, - 139,185,120,105,101,49,230,121,51,17,24,14,224,76,59,140,45,193,220,46,40,218,224,85,65,197,86,167,245,77,35,51, - 147,163,171,38,216,170,124,235,211,202,1,118,131,116,32,146,131,150,40,108,240,225,160,134,253,158,97,172,243,182,111,31, - 140,220,124,85,231,186,171,46,139,237,219,181,149,174,222,86,18,134,143,187,188,64,173,176,66,189,158,167,90,46,82,90, - 89,96,113,198,225,252,200,12,11,139,115,84,42,21,52,154,186,231,113,199,157,55,35,60,147,249,177,73,2,165,145,94, - 72,173,92,226,212,233,103,57,121,102,129,68,42,131,45,43,172,223,48,196,145,103,198,153,158,157,97,227,166,245,108,220, - 188,150,125,119,94,38,115,55,86,226,227,243,115,241,220,66,177,123,102,198,223,102,78,228,170,241,231,143,45,117,230,151, - 198,82,112,86,192,169,8,156,155,131,73,96,73,64,77,129,10,87,167,120,85,86,1,232,205,169,245,132,52,106,68,239, - 130,104,4,186,13,88,175,97,91,8,251,253,100,122,175,185,127,199,154,246,119,95,149,105,191,249,114,187,189,187,7,83, - 24,248,65,141,218,114,142,114,177,74,173,152,101,121,113,145,233,137,44,83,19,5,242,185,2,158,23,224,123,62,8,69, - 123,71,59,123,246,110,231,236,185,83,204,206,76,49,48,48,64,16,212,241,157,58,197,124,141,83,167,39,152,153,207,99, - 24,6,61,61,25,182,110,216,134,38,228,236,240,89,234,53,135,177,225,57,166,207,205,146,157,88,162,163,43,142,116,86, - 216,56,48,128,215,37,197,226,166,174,100,112,195,254,228,236,249,197,65,253,204,11,187,219,199,206,78,119,248,222,176,132, - 19,33,28,43,193,185,71,96,97,23,212,98,205,162,30,171,230,217,42,0,173,202,155,68,106,192,187,193,176,26,209,201, - 155,3,184,50,132,203,107,241,196,22,174,61,56,212,255,222,107,91,218,247,14,200,120,103,154,170,227,178,56,126,26,171, - 226,227,107,147,92,169,192,252,248,20,115,99,43,44,47,151,240,3,23,173,3,12,35,74,166,37,138,97,71,232,237,237, - 225,178,131,251,104,105,73,176,148,27,101,165,48,75,60,33,72,216,38,181,98,153,51,39,167,153,157,171,98,88,38,187, - 246,13,176,255,192,46,38,207,45,114,236,216,57,240,99,152,34,32,244,53,169,68,146,241,51,227,84,115,109,184,190,75, - 118,230,44,67,27,6,8,22,179,184,161,195,208,149,91,173,232,29,63,222,85,24,47,116,142,223,255,220,38,243,201,39, - 246,245,122,245,51,54,28,10,225,153,235,225,204,52,228,98,16,60,191,10,66,171,0,180,42,111,172,214,163,128,61,64, - 90,136,72,0,253,66,235,253,2,110,168,152,230,149,165,131,187,55,164,223,182,163,165,123,231,128,72,102,98,84,150,179, - 20,23,75,132,118,18,95,105,130,208,34,59,49,202,244,217,17,148,19,16,141,9,6,7,44,42,53,240,189,24,169,84, - 146,104,90,209,183,166,151,173,155,119,83,173,214,153,158,158,102,112,112,128,149,149,121,226,49,73,173,84,228,236,153,9, - 102,23,92,214,172,31,228,186,27,119,208,213,157,230,228,145,179,156,56,122,14,161,109,148,167,48,36,40,237,17,232,50, - 209,152,65,177,178,140,101,69,113,106,117,70,199,203,236,217,188,159,82,54,207,241,7,159,164,173,183,155,129,157,59,197, - 246,95,123,111,122,225,3,55,167,143,127,254,145,181,173,143,62,188,121,200,247,54,85,225,145,78,120,110,16,166,179,80, - 75,128,94,117,223,175,2,208,170,188,1,18,0,189,192,207,64,52,167,245,122,19,110,242,17,111,31,235,235,61,160,110, - 220,215,53,176,175,203,108,77,197,17,37,141,99,69,209,173,237,76,230,28,202,203,130,173,125,157,84,230,158,69,85,23, - 88,55,216,70,185,88,162,144,175,83,42,7,152,81,73,215,64,156,150,76,43,155,182,109,32,153,206,48,62,58,207,83, - 79,29,2,2,238,120,251,245,12,116,247,18,4,46,163,99,203,100,75,1,7,175,219,205,101,151,239,161,179,35,201,241, - 231,143,112,234,216,73,146,169,52,197,66,158,100,44,192,13,20,117,87,19,104,137,176,99,8,229,35,76,77,75,164,21, - 237,4,76,143,143,113,229,213,87,209,222,223,201,161,67,71,88,122,228,41,226,137,35,108,220,185,143,107,255,175,95,138, - 21,127,244,253,219,167,254,248,127,116,182,157,60,54,152,130,161,50,60,121,13,156,42,195,202,213,224,63,180,186,28,86, - 1,104,85,94,63,105,7,182,130,140,66,186,10,155,13,184,169,140,184,227,252,229,59,47,107,185,110,107,162,45,29,65, - 40,73,45,189,134,192,202,4,167,142,79,250,247,62,241,141,232,141,7,47,19,63,241,206,43,200,207,60,71,57,59,73, - 107,122,144,220,92,153,153,233,105,12,43,164,107,160,157,68,107,154,150,246,46,246,236,217,137,235,132,60,245,196,17,158, - 63,124,140,82,185,204,174,93,27,105,107,109,165,94,54,120,225,217,51,44,45,213,185,233,174,119,48,56,212,74,123,71, - 23,99,167,71,120,254,217,23,216,180,126,13,249,124,157,82,14,82,137,54,42,110,133,114,181,130,10,45,76,51,130,37, - 192,182,21,137,136,6,83,226,122,112,236,244,121,174,184,230,50,2,35,224,244,209,83,184,229,128,83,79,61,195,209,67, - 207,178,227,170,155,197,158,63,255,175,93,147,159,250,236,53,211,159,248,68,255,160,231,110,240,225,27,54,60,245,23,48, - 245,235,224,127,101,117,89,172,2,208,170,188,246,210,10,252,21,200,86,104,173,194,126,19,222,158,179,172,155,231,110,56, - 176,99,224,170,117,182,169,29,202,178,133,149,160,63,116,62,243,76,221,120,224,193,194,76,44,94,252,240,31,254,135,77, - 63,118,215,94,251,196,67,95,66,121,154,109,91,110,225,241,71,30,36,191,56,67,166,61,195,192,218,181,40,203,164,115, - 160,143,189,7,14,50,63,183,192,151,63,127,63,227,195,83,248,65,72,58,147,226,186,27,174,194,176,52,167,78,159,32, - 183,92,226,246,119,223,141,213,210,202,82,193,67,137,26,143,63,246,48,251,118,239,197,64,114,238,236,51,248,129,139,20, - 96,154,2,165,60,16,17,194,208,37,147,180,137,89,18,97,10,68,194,64,59,117,202,245,5,206,159,63,198,222,93,187, - 112,75,101,150,230,178,8,105,83,118,2,158,254,250,151,24,31,57,205,59,126,225,23,227,139,183,222,180,237,153,127,247, - 219,157,187,167,198,58,99,144,88,129,111,252,58,76,206,128,119,100,117,121,172,2,208,91,215,166,81,12,245,167,248,104, - 204,36,94,15,222,116,143,39,104,212,245,249,40,200,53,208,86,134,131,6,188,103,50,154,184,173,240,174,221,107,217,176, - 70,156,158,245,48,74,34,104,157,122,161,218,57,242,47,225,96,62,111,44,173,221,144,254,137,191,253,179,142,157,87,174, - 181,135,31,252,2,169,100,23,117,87,241,141,175,63,64,177,176,196,174,45,107,104,233,236,166,26,73,17,177,108,118,221, - 120,51,185,5,135,251,62,251,48,147,19,179,8,13,65,205,231,170,59,111,97,243,229,87,240,232,87,63,67,33,183,192, - 141,31,248,8,166,213,201,99,143,223,199,187,127,228,102,14,223,243,5,246,93,117,128,181,93,67,60,248,185,127,33,12, - 67,236,72,132,13,59,58,41,29,117,113,67,129,182,5,161,31,96,96,99,199,45,132,37,136,89,54,150,105,226,4,62, - 197,133,25,178,109,105,182,236,187,140,74,253,49,98,65,149,221,215,220,196,218,66,200,163,159,249,60,255,244,7,255,149, - 219,126,226,131,226,214,207,252,69,231,151,127,241,223,95,183,239,200,243,86,43,24,2,30,252,67,152,248,3,112,31,88, - 221,159,171,0,244,86,20,215,11,217,179,181,141,191,89,147,134,115,43,111,202,103,60,2,194,133,150,50,92,110,192,123, - 78,183,244,222,185,242,246,253,125,139,97,9,239,203,71,195,93,203,197,149,205,229,106,37,89,173,24,85,116,98,106,203, - 118,251,170,79,252,81,116,211,238,1,49,124,228,27,196,218,7,153,31,30,231,200,83,143,97,101,210,92,119,235,53,152, - 134,137,136,167,73,122,16,198,147,212,42,240,249,79,124,146,233,233,81,226,210,100,185,234,209,218,155,228,250,119,222,206, - 204,244,34,217,51,103,185,250,182,187,17,45,29,252,239,63,249,115,222,255,225,119,49,125,242,24,27,247,236,102,104,112, - 3,15,127,249,171,204,231,107,24,74,210,217,155,34,149,72,160,252,0,219,180,16,66,161,209,4,174,70,9,69,58,147, - 33,168,58,180,102,146,172,84,106,24,210,96,126,126,129,237,3,91,217,188,125,43,51,195,39,153,62,119,148,93,55,125, - 16,251,125,119,243,240,61,247,242,197,191,254,43,110,184,253,38,222,243,201,191,74,125,237,55,126,239,234,161,123,191,104, - 12,128,136,195,253,127,14,19,191,10,222,189,172,22,183,95,5,160,183,160,8,165,121,108,99,43,75,231,86,136,190,137, - 22,176,160,209,147,61,6,86,20,54,90,240,246,231,83,233,183,141,92,182,182,79,59,14,137,35,147,206,221,83,211,167, - 19,232,9,5,201,10,172,29,219,185,43,115,197,159,255,135,104,95,166,34,150,142,61,65,88,79,241,220,11,143,48,55, - 114,130,205,219,46,99,221,206,109,84,107,53,226,189,27,33,48,56,126,232,16,55,223,125,19,159,251,248,167,152,25,61, - 135,21,53,113,11,62,90,187,236,58,120,45,86,75,154,35,159,253,59,118,238,191,150,68,219,102,254,244,79,255,148,157, - 251,182,210,158,12,9,173,14,98,177,56,227,195,167,153,60,55,73,24,104,122,6,51,244,182,165,113,156,0,29,64,196, - 18,72,20,66,8,66,109,162,181,162,165,189,29,199,42,35,181,207,218,129,126,22,151,22,49,172,24,11,51,227,108,222, - 190,147,234,202,50,209,120,148,51,71,30,229,192,141,119,80,169,228,152,57,113,130,35,143,60,70,53,95,227,93,127,242, - 159,18,255,24,56,87,69,30,184,79,117,128,154,129,7,126,23,38,62,2,254,111,209,232,171,190,42,171,0,244,150,17, - 165,225,234,15,110,229,239,31,158,98,164,230,191,105,190,104,72,131,120,222,3,182,11,253,121,196,174,177,173,91,7,172, - 84,20,207,180,216,92,115,22,82,232,23,60,152,171,192,238,225,237,91,219,238,252,227,255,51,221,221,150,19,249,108,157, - 225,163,11,44,156,58,139,142,150,185,250,237,55,210,187,102,19,179,217,58,235,182,239,167,88,11,249,234,151,191,200,93, - 239,126,39,143,124,241,203,204,158,62,135,29,143,147,207,175,32,137,144,110,177,184,230,230,59,152,124,246,16,118,44,32, - 185,237,0,255,248,231,159,33,29,137,112,249,21,91,177,35,9,102,22,230,233,145,146,179,199,39,88,41,86,24,90,223, - 67,166,45,74,87,111,23,83,99,203,24,40,44,41,8,3,31,35,158,64,99,128,14,8,8,73,182,183,82,93,154,39, - 157,78,81,172,214,73,36,227,148,139,203,184,129,199,250,237,91,25,31,27,167,191,191,155,147,207,61,206,45,239,125,39, - 15,212,139,36,39,22,88,56,241,12,45,189,157,252,236,223,254,89,236,239,223,247,225,203,15,28,58,164,18,16,58,112, - 95,15,204,232,102,141,234,55,242,208,88,149,85,0,250,174,68,123,33,230,134,22,254,231,250,22,14,159,204,190,169,158, - 109,29,240,73,16,6,68,235,66,196,172,142,148,236,137,39,24,173,72,10,94,24,24,96,215,97,221,83,91,215,94,254, - 142,255,250,163,157,29,93,54,197,34,60,241,224,163,228,38,230,24,236,235,224,218,155,238,68,117,116,48,182,82,99,247, - 238,93,228,230,10,124,225,239,255,137,107,111,189,129,201,225,97,78,28,122,148,68,36,66,177,6,181,186,65,34,226,178, - 102,251,110,162,49,201,137,227,135,216,115,203,29,124,233,11,159,167,184,56,201,157,239,127,39,61,237,157,140,13,79,48, - 122,234,44,108,217,196,137,23,70,24,92,219,199,198,109,189,136,48,164,88,113,153,95,88,70,10,69,212,50,241,116,136, - 52,37,94,224,227,7,26,215,169,211,223,223,15,78,21,45,52,107,214,111,96,102,114,148,254,158,118,102,103,103,89,179, - 115,43,177,229,28,137,68,27,197,106,141,220,194,20,215,188,251,71,120,232,111,254,28,195,142,114,254,169,199,25,220,188, - 133,31,255,244,223,165,255,238,166,187,46,191,126,106,162,106,64,54,132,242,255,128,149,95,162,145,203,241,70,200,157,192, - 41,88,237,107,191,10,64,223,165,248,154,63,248,217,221,124,242,183,30,37,246,38,33,163,3,26,133,222,45,208,30,4, - 150,86,126,88,169,106,217,153,18,118,232,144,174,149,45,31,118,63,188,161,171,247,186,255,240,190,238,205,61,67,148,115, - 33,247,221,251,56,243,147,75,92,181,111,43,123,174,28,162,158,238,97,97,185,194,222,77,67,76,159,25,231,51,159,254, - 10,67,107,186,104,75,68,120,226,203,247,97,9,15,55,2,249,233,10,145,120,10,83,21,184,236,178,131,76,15,31,98, - 253,238,237,28,125,126,134,217,23,142,177,123,215,102,246,237,219,193,82,110,153,227,143,62,66,186,173,155,71,30,121,1, - 133,98,223,101,123,8,205,26,38,146,167,159,126,26,161,37,201,148,77,213,115,41,87,20,194,0,67,132,40,213,208,130, - 34,81,155,84,71,23,245,90,149,206,174,62,140,120,130,120,58,195,114,190,64,93,197,24,216,186,157,217,99,103,216,116, - 217,181,28,125,242,235,92,255,142,237,236,184,253,29,156,190,231,11,68,8,121,244,179,127,207,135,126,245,223,115,213,199, - 255,180,229,217,119,126,224,224,245,129,59,173,97,54,1,199,174,3,231,93,52,26,47,190,94,230,180,160,209,2,105,8, - 56,182,138,21,171,0,244,93,147,209,126,200,205,7,123,137,189,237,114,106,247,188,64,50,116,222,112,46,72,52,65,168, - 42,68,96,65,190,69,235,101,39,183,236,22,183,182,69,141,88,192,11,102,44,49,220,18,111,217,245,203,239,200,28,88, - 183,153,226,66,137,175,127,229,81,102,22,23,185,226,170,131,236,191,238,50,220,120,156,249,133,49,54,246,244,50,117,102, - 152,47,125,238,33,12,13,151,95,125,5,79,220,255,16,94,165,66,36,146,96,58,183,130,17,51,8,252,26,157,131,189, - 180,24,14,11,229,34,210,90,195,243,247,127,129,174,182,118,174,185,237,42,234,213,37,14,61,248,32,182,25,99,114,106, - 150,243,227,243,188,253,230,27,105,233,109,69,136,62,190,113,207,131,228,203,30,189,157,237,40,175,68,60,22,197,205,150, - 145,134,36,26,19,4,190,34,172,215,240,92,151,100,71,55,70,97,9,199,41,211,187,102,136,82,181,72,111,79,47,185, - 185,101,54,238,216,72,177,99,28,183,84,99,219,142,203,24,126,225,105,118,222,240,46,102,78,30,71,207,12,163,170,121, - 30,254,204,95,243,206,95,253,247,156,254,165,159,239,27,255,211,63,187,122,8,198,235,144,253,29,152,52,32,124,130,70, - 195,198,215,235,176,24,4,54,208,168,185,157,92,197,139,85,0,250,174,57,151,186,199,169,107,174,71,143,57,140,158,120, - 1,255,77,96,211,251,192,101,90,251,235,96,62,2,19,3,211,139,165,178,179,62,26,139,216,60,222,25,239,248,137,15, - 94,203,173,91,118,144,159,94,228,254,135,30,165,180,156,103,247,142,141,92,113,235,1,114,126,146,194,236,50,157,145,8, - 165,185,105,238,255,234,19,44,231,86,184,235,125,111,103,122,114,150,236,204,50,118,36,194,74,197,195,175,128,142,249,216, - 150,205,150,13,107,169,150,230,232,236,216,194,3,247,61,142,233,229,217,125,219,173,88,173,157,60,125,207,61,88,245,34, - 185,178,199,212,76,158,206,84,156,43,174,222,67,188,175,135,67,247,60,196,249,115,211,180,175,93,71,166,205,164,152,45, - 227,122,53,66,101,82,173,213,24,236,238,164,82,244,33,240,241,156,58,118,75,15,201,150,12,142,227,144,238,236,98,170, - 88,160,181,163,139,252,228,28,245,250,38,122,182,236,99,250,244,17,6,247,188,141,153,153,5,170,217,105,246,222,113,39, - 135,254,106,132,104,194,98,105,250,28,71,238,253,28,63,250,91,255,70,254,229,211,207,109,237,125,238,153,27,44,152,172, - 192,202,151,160,240,31,223,0,243,235,83,171,56,177,10,64,223,215,151,172,85,57,115,203,173,76,207,79,161,151,151,223, - 112,0,114,128,187,33,148,141,190,127,83,221,229,242,242,241,115,11,93,253,253,107,185,243,134,237,28,216,219,207,92,174, - 192,177,195,231,153,155,42,177,123,247,102,246,94,127,13,243,139,57,168,101,145,229,28,178,179,147,251,31,58,198,236,82, - 137,221,7,54,211,221,191,134,175,252,195,23,176,67,240,112,112,235,62,166,157,164,84,175,208,219,31,37,29,171,98,70, - 58,56,127,106,140,194,236,18,173,3,61,108,220,212,205,217,135,31,32,63,151,101,197,181,152,207,151,241,116,145,187,110, - 123,15,61,59,246,113,244,249,195,28,127,238,24,101,4,87,239,219,128,63,49,73,162,127,55,231,166,142,18,143,72,44, - 21,18,79,39,41,151,74,88,126,26,211,55,128,16,51,211,69,186,93,18,250,54,237,221,189,148,36,116,173,233,39,63, - 55,204,224,222,91,137,45,230,41,85,86,216,182,107,23,147,135,159,102,251,29,31,160,99,215,30,166,158,123,142,142,214, - 22,142,63,253,36,155,118,109,225,154,223,253,88,114,228,67,35,251,118,149,115,35,37,24,91,7,181,35,224,101,120,125, - 88,105,5,44,241,237,59,209,174,202,42,0,253,235,11,73,107,34,134,201,71,15,94,206,173,247,126,237,77,241,76,115, - 192,104,3,132,252,65,100,125,238,244,233,176,163,199,54,222,113,240,6,220,162,195,217,137,19,140,156,153,103,253,166,126, - 54,31,220,199,82,190,68,220,180,152,31,155,96,221,224,32,207,29,58,66,118,49,71,34,30,227,134,235,175,225,209,71, - 159,32,168,87,144,134,164,232,128,235,75,66,29,176,156,93,228,178,45,173,88,145,24,133,178,203,201,99,47,96,9,159, - 3,187,247,48,123,126,130,241,241,25,10,165,144,133,114,13,79,5,220,176,239,74,174,121,251,141,204,204,143,243,212,231, - 239,35,87,118,233,93,59,64,202,148,4,153,52,35,51,57,188,208,37,149,177,80,190,38,29,79,82,107,113,209,66,35, - 180,194,150,6,134,48,201,116,247,176,188,84,33,221,217,141,31,84,105,27,218,74,233,228,11,248,165,69,186,55,239,101, - 114,244,20,235,55,109,66,159,51,88,26,61,78,255,182,45,204,140,156,34,148,146,238,246,14,158,253,210,61,92,251,225, - 31,99,226,195,239,238,47,126,252,111,174,72,192,153,93,48,119,24,178,255,9,72,188,198,243,83,5,222,9,252,6,171, - 49,72,171,0,244,42,240,46,132,33,19,93,221,124,218,178,89,241,189,55,172,29,136,15,220,14,44,131,169,160,219,132, - 161,69,51,222,150,234,77,27,87,237,90,131,95,90,98,97,197,229,204,232,44,169,22,131,45,91,215,177,82,45,210,158, - 106,225,220,11,71,88,191,110,29,163,99,83,156,59,55,73,221,117,185,254,198,107,40,23,74,204,143,76,96,138,144,58, - 154,92,197,64,72,141,83,89,161,45,105,145,140,154,216,137,14,142,157,28,70,121,21,134,134,122,49,60,135,83,103,207, - 145,173,4,148,28,73,221,115,88,219,222,198,53,183,221,130,39,3,30,253,199,127,162,92,172,178,88,169,112,199,193,189, - 212,22,166,168,213,234,156,159,24,39,17,129,84,202,164,86,242,177,132,69,91,103,148,122,177,142,48,4,182,52,49,13, - 139,74,185,142,176,162,216,81,129,87,168,33,19,29,116,12,109,165,180,56,78,251,142,107,73,183,117,224,84,43,172,217, - 178,141,133,201,115,180,68,147,108,234,236,97,120,108,134,190,129,77,172,20,203,44,12,31,103,237,135,111,52,143,125,249, - 129,173,87,207,77,237,43,194,209,1,200,223,7,129,249,26,3,67,216,156,171,202,235,0,118,171,0,244,67,32,86,24, - 144,235,238,230,119,58,58,152,155,159,123,67,159,229,19,192,46,200,4,176,51,64,238,249,106,202,236,187,226,134,237,36, - 133,65,185,230,113,106,116,158,122,32,217,185,103,16,39,8,232,203,100,152,30,25,37,98,88,168,80,113,246,236,56,97, - 40,73,38,227,108,217,184,134,71,30,126,12,225,73,66,9,139,213,34,136,86,68,80,98,176,39,131,16,73,218,59,186, - 40,149,92,150,231,150,104,111,73,16,77,70,56,59,60,74,97,217,165,162,13,102,23,151,232,73,89,236,220,187,145,68, - 87,146,199,62,255,53,102,39,150,88,88,42,177,101,221,26,218,18,154,211,249,5,230,151,125,156,74,157,222,182,56,134, - 45,201,86,28,234,46,116,244,180,177,232,47,162,77,11,165,13,34,241,20,147,75,43,180,246,174,193,76,216,216,174,139, - 87,117,137,247,108,36,91,88,193,173,20,72,181,245,81,201,205,211,214,222,67,108,126,138,154,83,198,111,73,18,233,74, - 113,100,248,40,151,93,113,45,165,185,57,182,239,216,197,147,59,55,181,85,231,166,182,153,176,81,192,120,59,20,186,94, - 7,243,235,12,171,29,62,86,1,232,85,18,13,104,165,249,191,59,58,152,158,159,123,67,120,160,0,216,12,108,4,171, - 2,67,17,184,242,1,219,220,25,63,56,24,217,209,217,142,19,106,78,141,44,49,53,190,200,190,131,67,4,129,164,22, - 132,196,80,120,133,34,93,93,253,156,56,113,22,215,215,84,42,21,174,223,127,128,153,233,41,230,103,22,64,167,240,13, - 73,197,201,97,186,43,108,93,147,36,157,73,178,82,170,210,218,217,199,185,115,19,68,132,198,178,34,228,235,30,11,203, - 53,2,199,96,62,159,197,196,101,215,206,77,236,186,124,43,39,158,121,146,177,211,147,76,45,215,48,165,224,138,141,189, - 44,206,156,97,227,101,59,89,250,198,8,218,13,72,153,54,75,69,151,137,133,89,10,117,197,134,76,55,42,12,48,19, - 73,132,29,199,136,165,176,18,6,161,17,39,146,72,224,213,92,66,167,140,76,117,17,233,88,71,80,88,38,210,190,6, - 59,209,142,178,76,82,109,93,248,229,28,6,81,58,18,9,86,86,86,24,30,59,203,229,251,47,35,234,4,180,29,92, - 99,14,63,104,108,220,171,194,221,10,142,157,134,210,92,35,214,244,53,3,159,12,141,70,0,171,230,215,42,0,189,106, - 98,75,193,51,155,55,243,201,19,199,223,176,103,248,101,96,7,100,52,236,42,10,246,159,236,74,116,95,181,126,19,117, - 223,228,204,236,44,99,83,89,118,109,92,79,151,105,83,93,41,83,143,39,201,23,138,132,74,51,183,144,37,183,82,161, - 238,134,196,226,22,107,215,246,243,252,115,207,163,148,137,231,43,166,150,151,209,166,77,198,172,115,235,53,151,115,242,236, - 44,126,42,201,66,54,79,49,151,39,110,71,112,125,200,45,85,169,249,38,78,221,163,176,178,194,205,215,238,98,231,190, - 173,76,143,141,115,252,133,147,12,143,45,163,3,147,104,218,192,165,68,79,87,15,78,32,25,29,31,165,163,163,133,72, - 36,205,212,217,19,244,118,181,81,169,215,137,39,186,112,131,58,50,30,131,104,156,192,138,16,104,159,194,74,145,129,238, - 22,108,211,196,115,202,68,188,58,177,76,59,70,190,138,174,150,136,165,219,81,161,67,44,213,66,224,213,105,233,236,97, - 246,204,89,34,194,102,105,108,146,197,158,33,182,116,247,179,255,170,45,252,195,96,186,123,247,100,126,187,9,131,117,152, - 106,17,56,81,33,94,19,13,69,105,152,209,154,204,42,62,172,2,208,247,203,253,24,198,75,207,48,17,188,113,1,137, - 221,192,219,32,226,55,58,90,92,118,38,30,223,52,176,111,187,140,26,38,103,198,102,153,43,58,164,50,22,173,29,38, - 132,146,114,121,133,206,53,3,228,242,14,133,74,149,192,119,240,85,132,82,117,145,171,175,216,69,185,88,100,97,33,71, - 46,95,197,247,171,140,77,76,33,77,155,15,254,232,213,180,183,218,228,75,30,118,42,206,202,194,28,6,224,32,169,150, - 92,28,79,224,7,146,185,236,60,91,54,12,178,117,219,58,68,16,48,114,102,154,231,207,205,19,81,81,76,229,208,215, - 213,70,251,230,13,68,35,113,30,252,204,3,216,194,161,103,176,143,177,209,60,166,17,161,167,53,73,110,57,139,136,167, - 177,220,4,177,136,69,44,147,38,16,26,21,106,178,243,51,208,151,193,10,125,180,1,97,117,9,51,22,129,104,2,183, - 84,37,154,105,69,105,133,178,227,84,61,159,214,181,189,56,118,43,149,165,9,16,130,211,39,78,209,51,212,199,230,129, - 94,50,87,110,139,205,77,62,53,216,7,107,210,112,52,121,93,143,211,241,43,219,161,250,42,207,103,212,192,123,122,137, - 194,159,158,186,216,131,109,85,222,34,0,36,66,31,180,70,232,111,61,115,90,74,180,52,95,23,240,177,45,197,83,195, - 105,230,10,54,166,161,241,124,159,161,161,117,252,175,206,78,98,217,236,235,110,223,39,128,118,104,9,97,79,89,136,253, - 75,67,67,157,3,125,61,156,30,31,70,210,78,61,95,98,235,254,65,60,81,198,140,183,80,203,105,100,80,103,110,170, - 140,235,9,28,207,163,238,64,34,149,102,211,230,33,158,125,242,41,234,53,143,68,186,149,192,119,217,180,113,136,233,233, - 28,189,61,173,148,42,69,66,34,40,165,241,74,43,24,34,77,222,245,169,187,33,102,96,145,93,92,32,22,179,217,180, - 174,159,84,58,198,217,115,195,156,56,54,131,242,19,24,17,131,206,76,72,207,218,78,90,218,123,120,232,75,223,96,126, - 126,133,158,158,40,21,191,200,200,194,18,59,214,246,210,106,249,148,242,5,202,158,75,34,221,2,97,128,157,138,227,4, - 33,137,104,140,229,233,89,156,245,157,4,202,193,204,164,240,43,57,68,221,71,71,186,112,148,32,82,93,70,91,22,102, - 44,129,246,125,132,25,167,111,231,65,206,31,57,73,172,59,73,189,144,229,196,11,135,232,28,90,207,142,45,59,152,146, - 207,244,174,81,106,75,21,186,71,94,200,21,150,126,227,185,240,33,165,95,213,192,68,71,10,150,170,62,31,1,188,85, - 124,120,139,105,64,226,146,51,67,235,111,77,198,188,142,224,115,255,137,86,44,67,53,74,58,104,141,25,137,112,109,95, - 31,219,179,175,111,126,152,6,38,192,156,134,62,19,246,12,183,182,110,180,183,247,202,217,233,69,164,72,115,108,228,60, - 107,122,227,180,91,9,92,55,68,91,130,48,208,120,245,144,229,165,44,210,202,80,174,130,235,20,217,190,181,135,202,74, - 129,226,138,75,36,146,34,48,67,178,185,34,61,241,24,187,175,218,198,99,207,159,100,239,182,1,234,94,29,101,36,16, - 50,66,185,28,195,49,60,108,51,32,87,9,169,73,159,125,235,186,233,236,78,115,234,220,4,199,143,156,163,94,49,216, - 50,180,150,120,220,199,169,251,108,221,188,145,83,135,142,114,250,244,52,233,214,20,157,61,93,156,56,57,65,95,107,134, - 84,139,32,29,137,145,155,206,147,43,213,105,221,49,72,117,105,5,225,25,216,82,147,72,26,212,202,5,74,249,25,44, - 11,12,67,16,202,40,166,246,9,107,115,196,226,105,38,199,102,105,235,233,38,38,77,210,153,36,243,231,79,179,118,235, - 62,156,76,27,178,90,163,61,109,176,60,91,162,183,31,114,97,157,195,241,72,251,213,149,250,78,19,182,234,138,63,251, - 217,138,95,252,143,175,193,92,221,13,68,86,1,232,117,17,249,90,236,126,45,5,136,55,70,121,125,37,240,145,151,60, - 74,8,28,217,188,229,117,127,174,57,96,188,193,253,108,211,49,123,215,242,166,13,237,174,136,178,130,226,232,124,141,137, - 185,101,54,111,28,196,169,214,136,69,18,228,139,53,234,174,67,97,165,132,33,13,180,8,8,117,29,116,141,193,254,78, - 74,249,2,201,88,6,169,35,184,149,0,165,5,151,239,31,226,206,107,215,83,171,133,140,205,150,9,181,135,246,3,74, - 85,143,26,101,12,195,162,80,87,228,114,69,214,36,91,217,186,126,128,74,81,113,228,217,89,170,213,40,123,47,223,192, - 238,61,237,84,75,33,189,131,59,89,200,213,121,230,217,83,164,18,146,189,123,214,178,176,156,39,8,108,90,210,22,201, - 136,164,88,83,76,46,174,176,48,51,71,186,181,3,35,18,199,173,86,241,106,14,241,168,137,227,212,88,94,92,194,173, - 150,168,151,114,104,183,138,10,61,138,217,5,76,29,176,56,61,205,242,236,12,97,173,68,52,18,165,86,40,99,20,231, - 233,104,109,161,230,133,132,190,198,201,151,88,158,93,228,150,107,246,225,108,236,140,157,128,173,54,28,4,214,108,7,235, - 5,26,197,221,134,95,133,159,49,224,126,26,45,145,86,193,231,45,206,1,105,41,26,10,145,126,125,253,8,134,161,191, - 37,248,0,72,165,112,98,49,78,89,22,117,223,127,221,80,190,4,166,108,104,63,251,167,6,82,91,11,67,182,204,21, - 10,248,85,55,44,158,56,231,236,218,191,62,222,22,141,9,207,169,32,140,56,213,186,143,101,155,132,94,136,129,196,113, - 107,4,94,157,246,182,4,17,203,96,33,191,66,168,20,129,22,44,231,74,68,146,130,237,155,187,232,138,105,134,122,186, - 153,205,86,17,134,133,143,166,226,107,204,168,71,224,184,104,124,210,41,69,87,123,134,207,63,114,152,145,169,42,217,108, - 137,116,91,138,150,13,67,140,207,140,210,155,137,17,181,202,28,121,106,4,203,15,184,249,166,61,228,10,75,44,47,231, - 73,164,186,104,77,43,80,146,217,229,58,21,108,38,70,70,160,126,43,201,76,6,191,94,129,168,73,128,160,173,53,73, - 110,49,75,210,110,35,84,154,168,22,141,14,32,245,58,181,220,50,150,10,88,30,31,165,51,38,48,149,34,157,105,97, - 242,204,11,108,236,111,103,228,228,9,90,99,157,196,82,6,227,231,206,49,184,161,143,95,251,141,159,230,19,191,249,103, - 131,3,211,43,87,167,97,100,16,150,214,193,98,203,171,56,87,47,52,181,159,85,239,215,15,0,9,253,189,130,80,163, - 135,245,119,175,65,89,134,230,252,82,140,175,31,111,197,54,191,25,124,0,204,32,96,182,171,151,199,110,184,140,205,76, - 17,190,150,124,148,33,16,121,23,255,153,121,52,216,41,24,148,182,177,109,177,61,222,94,10,125,188,154,230,170,195,167, - 244,181,42,112,39,135,122,35,97,221,51,237,136,77,165,230,80,119,5,145,168,141,82,26,83,154,132,174,34,12,13,58, - 90,218,169,151,235,56,117,15,199,245,89,42,20,81,166,207,186,53,93,156,58,125,142,53,215,237,166,61,29,50,53,94, - 71,102,58,200,57,117,164,97,163,188,24,78,221,99,219,150,1,114,115,115,36,99,146,122,201,32,105,11,118,95,213,133, - 165,5,143,127,245,97,202,150,73,255,80,146,222,169,4,235,162,105,222,127,215,78,18,241,20,71,142,157,37,145,76,98, - 133,1,177,136,77,190,92,35,87,241,137,198,50,44,205,44,82,92,204,17,239,104,195,117,106,16,106,194,32,164,163,53, - 69,118,120,140,206,140,32,40,231,105,109,15,176,35,49,34,82,80,90,156,167,51,19,227,228,209,179,248,67,29,132,190, - 166,165,181,149,233,169,97,34,134,69,111,58,205,226,114,137,100,87,27,237,49,131,211,207,31,231,234,155,174,226,182,95, - 125,159,253,248,127,252,196,142,187,43,222,213,30,156,125,26,10,55,128,27,127,149,166,44,191,10,62,63,56,0,244,61, - 129,144,10,27,149,114,190,23,11,78,128,231,55,62,40,191,205,231,181,227,211,122,199,229,220,114,211,32,248,175,97,76, - 116,212,132,99,89,170,207,204,243,28,68,4,116,85,226,86,207,76,44,98,230,243,130,203,207,12,115,192,113,228,61,109, - 233,84,34,106,154,245,114,133,68,50,73,174,92,197,215,6,81,105,162,128,192,15,81,74,18,4,10,195,20,184,174,71, - 185,226,178,82,113,8,12,131,206,238,65,182,236,220,197,220,169,231,169,215,61,44,83,35,13,131,154,235,226,6,130,56, - 54,149,165,69,174,189,241,0,43,203,51,100,90,90,153,93,206,210,27,85,252,232,29,87,115,195,45,123,120,250,201,163, - 12,182,230,241,80,140,206,79,115,126,120,153,229,214,58,219,74,91,145,211,231,169,121,33,65,8,237,209,128,90,5,38, - 22,11,84,93,69,75,170,149,236,66,145,243,231,199,217,158,138,160,188,42,166,157,34,116,125,210,9,155,145,92,158,226, - 114,156,72,202,194,169,228,81,161,143,82,38,197,66,133,150,142,54,234,149,2,203,217,44,173,201,4,182,109,2,22,174, - 87,34,211,102,227,87,163,76,205,231,88,187,111,3,229,92,150,217,153,37,174,62,176,149,133,15,94,219,62,241,183,15, - 237,29,130,189,192,248,121,152,223,253,166,229,36,86,229,13,5,160,151,130,144,250,215,193,231,251,229,128,196,119,130,93, - 2,225,121,80,246,112,188,215,112,201,121,33,86,205,191,48,208,73,9,221,217,184,108,61,47,163,12,78,140,115,121,174, - 160,179,160,139,29,29,70,171,52,241,132,192,215,6,78,40,240,131,0,132,65,168,160,230,6,248,210,34,212,14,97,88, - 193,113,13,20,49,140,88,130,236,236,28,207,158,56,204,87,30,120,150,119,223,184,19,66,133,34,69,16,113,240,189,50, - 86,24,163,86,169,113,112,111,134,158,78,205,200,249,42,158,105,176,88,45,242,254,219,182,113,227,141,251,120,228,248,56, - 71,79,77,144,136,117,82,43,215,56,184,125,11,191,245,43,123,89,88,28,231,190,135,143,112,236,252,18,189,3,253,12, - 181,37,136,69,5,147,179,37,114,249,18,177,84,138,68,196,162,88,23,12,159,27,103,243,246,117,84,86,150,200,152,38, - 129,231,19,248,46,149,98,157,165,133,101,50,97,28,211,180,0,19,203,142,224,212,139,4,142,133,20,33,203,75,203,196, - 227,54,34,8,233,78,119,49,154,205,163,18,96,135,17,90,204,8,139,75,75,108,221,190,133,236,114,129,254,181,29,92, - 125,231,205,60,246,208,185,245,3,19,179,151,197,225,248,60,228,55,128,243,253,164,76,132,77,243,107,21,128,126,0,1, - 232,69,16,18,175,41,248,124,199,167,156,212,20,170,38,165,186,137,149,146,4,175,209,178,211,9,139,200,87,38,200,129, - 225,67,91,28,6,71,205,68,107,109,46,199,205,139,133,170,173,9,231,77,17,9,123,218,109,223,13,81,82,80,115,53, - 1,6,86,196,32,12,21,1,10,95,73,28,213,232,187,5,18,199,215,56,129,96,38,91,224,200,240,24,185,66,25,37, - 35,60,118,124,152,95,184,235,50,42,85,240,80,132,161,70,121,117,218,146,46,215,223,114,61,95,252,234,97,42,53,147, - 66,121,158,171,118,173,231,242,61,219,152,61,63,193,200,211,199,137,201,22,150,75,5,122,6,91,120,247,123,222,70,123, - 52,164,191,67,163,61,77,189,22,97,114,102,153,254,116,130,106,96,144,47,231,233,110,73,163,109,139,154,83,197,83,154, - 209,243,147,120,181,18,94,181,128,114,91,49,16,212,42,21,220,80,83,173,56,196,226,38,97,50,164,232,172,16,73,196, - 80,126,29,191,90,34,30,143,145,95,46,210,217,213,142,235,86,137,69,34,8,211,192,182,18,232,160,206,192,96,55,11, - 217,9,178,133,42,81,203,98,108,100,134,13,219,183,179,233,67,55,181,204,252,193,167,246,12,193,30,15,198,70,27,90, - 208,247,108,61,105,26,9,168,171,113,63,63,160,0,212,0,33,121,33,39,226,101,127,120,125,173,110,83,106,22,10,17, - 62,127,184,135,247,113,156,104,169,134,146,175,1,8,69,12,196,112,158,42,88,26,186,149,45,215,140,214,189,212,45,181, - 122,169,191,234,157,243,193,46,180,199,214,183,116,219,17,199,113,176,19,54,78,45,192,247,3,220,48,192,22,22,142,227, - 161,100,148,98,65,81,200,149,184,108,219,16,229,98,141,108,190,196,249,169,41,234,129,203,109,119,221,198,35,79,62,195, - 120,182,192,216,146,162,82,171,98,40,31,29,196,112,41,243,158,119,30,96,41,95,226,252,116,1,167,88,227,198,171,215, - 178,119,251,58,254,215,23,159,64,27,22,182,52,153,95,158,227,224,181,59,184,237,214,171,201,196,77,202,203,115,56,85, - 56,125,122,150,182,182,24,109,109,235,89,90,92,97,37,167,217,176,113,13,182,97,51,54,91,160,98,40,180,33,41,172, - 20,88,158,159,195,112,107,204,207,205,146,238,237,195,148,146,88,52,69,177,148,39,98,67,220,78,96,199,99,148,253,2, - 58,244,41,23,86,144,192,226,252,50,155,214,15,225,84,170,24,177,4,117,215,33,226,219,40,167,128,163,11,116,117,118, - 50,61,58,207,198,93,235,88,156,89,198,52,206,177,229,109,123,197,99,95,124,118,157,119,110,228,50,27,142,47,195,74, - 245,251,208,130,70,128,5,126,112,34,115,47,180,251,190,180,163,136,15,108,7,10,64,180,249,218,109,66,80,3,254,127, - 64,43,200,19,64,7,176,95,32,42,32,109,13,69,208,25,96,14,212,156,144,106,141,148,220,22,190,10,1,160,90,191, - 1,227,45,52,66,135,47,49,135,244,27,112,238,216,166,98,44,151,160,240,143,231,25,92,124,237,146,83,235,192,50,68, - 109,232,94,50,69,111,143,172,235,43,115,225,41,87,115,196,132,181,174,157,88,23,137,199,168,20,115,152,106,128,114,169, - 140,138,40,100,16,226,25,18,169,34,248,182,197,220,202,40,145,192,71,134,1,110,16,16,218,138,80,123,220,125,235,205, - 12,172,93,207,195,135,158,192,117,66,166,86,106,212,61,129,210,38,117,127,133,91,175,92,199,182,141,235,248,155,207,60, - 207,242,138,195,205,151,247,115,231,141,59,8,48,145,113,139,231,78,206,177,110,176,139,247,189,255,26,246,31,216,141,54, - 193,119,92,12,51,198,244,226,18,115,139,85,140,68,18,148,79,38,99,114,228,236,57,118,238,186,3,175,84,197,50,12, - 240,192,50,4,150,116,152,157,203,179,169,51,197,236,196,4,177,182,86,132,147,37,244,28,150,43,144,72,24,20,202,117, - 218,13,16,150,73,40,12,106,78,128,169,161,88,88,161,144,207,34,157,18,113,101,131,39,241,66,80,210,164,156,119,88, - 211,27,67,198,45,10,181,10,45,221,105,38,78,158,101,115,75,130,214,247,92,223,58,247,159,71,246,174,133,61,53,24, - 27,129,185,189,223,163,22,228,208,112,189,191,85,0,72,240,205,137,178,33,141,96,215,43,105,148,253,213,96,244,129,92, - 0,121,4,44,31,34,239,1,227,253,52,98,133,47,92,39,214,32,223,77,31,34,151,131,84,160,115,166,140,251,82,38, - 2,95,99,106,37,114,90,7,49,33,150,93,59,146,141,168,176,74,248,253,171,13,226,141,31,239,55,6,124,46,136,101, - 194,211,251,246,96,222,55,135,255,26,45,18,191,177,80,82,22,244,22,44,187,115,171,171,151,173,192,59,18,192,88,96, - 136,181,180,167,109,173,4,146,8,190,239,98,68,108,44,219,100,114,97,146,245,29,237,248,41,201,161,83,195,108,236,234, - 197,162,68,169,236,82,117,52,245,42,172,233,105,227,238,187,174,227,239,62,251,69,214,12,117,147,27,89,96,169,84,66, - 186,62,158,27,210,55,144,225,166,171,247,144,205,213,120,250,216,48,91,182,36,121,239,59,118,33,148,197,3,143,156,96, - 102,106,137,24,54,43,139,33,209,222,237,24,9,69,80,145,232,48,192,208,14,51,195,141,54,207,74,91,72,71,34,173, - 50,251,247,108,98,97,106,12,167,226,35,147,73,132,43,81,94,149,164,29,101,102,114,142,205,125,187,201,231,87,200,228, - 86,136,25,38,90,249,56,1,84,29,15,179,34,136,26,130,138,227,208,209,223,141,31,56,104,173,240,253,144,66,161,72, - 92,56,216,118,128,16,6,85,167,2,72,42,101,7,217,103,82,173,46,51,20,31,228,233,51,227,108,90,51,200,233,103, - 159,99,205,174,203,121,114,99,223,134,129,243,115,7,34,112,44,7,185,58,56,177,239,97,174,14,243,230,46,187,161,94, - 166,221,12,2,105,16,43,96,252,58,136,182,6,125,21,5,236,63,7,233,131,229,8,50,129,38,213,9,209,18,180,216, - 208,33,26,101,181,69,243,154,34,124,209,244,180,37,196,107,96,9,80,218,87,41,80,45,102,195,159,35,45,112,208,250, - 240,86,207,125,112,9,38,254,30,130,239,119,231,254,248,27,11,64,111,44,248,64,195,37,63,190,117,59,127,240,252,243, - 156,207,46,189,234,93,15,170,192,31,129,56,8,137,58,244,120,97,16,27,10,229,168,15,167,36,132,117,73,138,76,204, - 244,157,0,219,74,162,148,196,138,25,60,125,122,150,106,181,196,250,193,54,74,51,211,129,59,54,73,164,175,197,172,59, - 121,132,53,128,227,135,204,78,101,121,231,59,175,35,26,79,226,155,9,182,110,106,103,206,181,176,45,3,223,146,4,58, - 228,142,155,174,34,30,143,113,232,244,56,233,4,252,244,135,175,198,204,68,121,232,171,243,140,158,90,226,230,245,189,108, - 218,210,199,200,82,158,175,125,250,51,56,239,184,145,253,251,215,32,178,14,245,108,141,137,169,105,100,50,129,17,212,49, - 227,81,106,142,230,242,29,107,89,219,187,158,143,255,229,103,136,217,22,130,8,17,4,81,108,166,70,39,152,223,182,6, - 43,26,101,250,220,8,109,49,147,88,196,98,178,94,161,221,183,136,56,6,21,17,48,187,148,195,76,164,72,196,37,10, - 141,109,90,44,45,46,211,223,17,197,245,92,164,105,226,251,1,166,105,224,120,14,110,208,56,221,205,192,97,118,116,78, - 205,44,150,197,157,7,7,197,194,232,4,246,149,187,83,203,231,231,118,117,195,182,16,206,253,41,56,135,248,206,235,70, - 95,168,251,220,10,108,105,254,255,205,96,62,133,151,252,187,187,9,54,117,48,222,222,0,3,179,15,18,26,210,37,104, - 233,129,136,130,88,8,93,10,218,234,13,16,137,26,154,238,0,58,60,136,185,208,186,212,232,194,107,215,65,42,137,148, - 45,81,211,76,181,27,153,116,43,73,219,22,178,37,110,215,45,195,202,248,4,90,41,171,144,138,70,77,5,195,139,139, - 166,58,57,86,221,83,175,216,105,173,142,181,193,212,171,69,154,152,63,172,224,115,193,6,245,108,155,223,236,235,101,83, - 118,233,85,215,130,4,144,23,24,37,77,204,144,36,83,17,225,91,43,238,24,130,73,67,211,89,71,91,85,203,48,133, - 150,40,45,48,12,240,74,94,232,77,158,87,221,91,215,90,132,161,190,245,196,72,184,211,136,232,115,182,52,116,61,46, - 92,71,83,171,6,4,129,203,219,111,191,150,19,203,57,58,187,50,244,245,174,97,75,79,63,253,201,144,163,243,37,6, - 54,15,178,177,183,13,87,216,76,45,151,249,185,15,221,202,96,91,43,15,30,26,102,106,118,146,159,124,255,21,12,118, - 39,0,159,237,7,215,114,71,165,204,67,135,206,240,130,146,236,31,138,48,159,203,147,243,125,44,171,149,208,119,49,35, - 30,137,68,156,253,59,215,178,178,88,162,119,176,143,201,98,153,122,221,167,63,29,37,34,76,74,181,42,103,71,167,25, - 234,76,178,48,62,67,172,173,133,68,34,138,167,53,133,82,141,132,29,161,46,52,232,40,217,197,60,201,161,118,10,43, - 43,152,194,160,82,170,19,25,108,167,92,173,16,248,1,82,8,132,144,4,74,162,13,19,97,219,148,124,135,43,194,186, - 119,246,159,159,50,102,7,127,204,138,71,193,78,217,204,36,173,129,158,138,191,222,134,150,20,100,243,160,163,223,169,163, - 178,201,121,116,189,193,128,115,1,116,90,26,38,145,184,12,100,103,195,237,16,217,12,81,175,209,164,50,19,133,120,0, - 45,1,244,3,253,17,232,213,144,240,33,234,67,187,111,209,90,4,171,22,137,70,172,206,174,132,234,104,137,120,221,153, - 136,234,107,183,253,100,218,112,181,166,181,107,128,150,206,62,58,122,162,100,50,17,146,241,56,81,163,5,105,36,209,70, - 17,219,174,97,153,41,86,170,113,142,63,119,26,249,169,79,234,76,224,23,98,176,160,161,178,8,218,121,149,8,123,243, - 135,22,124,154,98,40,197,244,129,203,24,56,125,154,136,239,191,234,9,170,105,67,26,62,196,170,40,35,29,181,23,12, - 237,159,83,66,47,40,65,107,104,72,225,106,139,184,97,97,154,6,158,82,12,30,59,18,252,70,165,194,61,118,82,119, - 158,154,100,99,37,176,166,90,147,74,70,219,132,81,215,40,63,164,86,170,177,125,91,55,109,3,41,138,217,113,166,38, - 167,184,245,230,247,112,253,190,62,22,31,253,18,207,157,112,56,120,112,7,17,91,242,252,212,50,201,100,140,237,123,182, - 114,98,116,146,104,107,47,107,247,71,248,203,7,79,50,50,159,67,71,12,58,91,219,185,253,242,157,220,118,211,110,142, - 29,158,225,72,49,65,217,247,177,12,19,35,16,32,21,53,167,206,186,161,94,122,58,51,140,158,155,64,218,38,137,76, - 11,139,217,89,54,247,15,161,180,34,17,77,50,57,189,200,250,190,118,68,168,41,230,202,68,35,22,210,128,82,205,163, - 43,16,184,82,35,164,77,110,185,76,119,103,10,161,37,82,107,170,85,15,207,83,212,106,53,84,24,98,154,38,94,16, - 18,4,10,164,69,44,153,196,215,96,91,166,184,9,170,71,254,238,254,136,252,229,59,98,209,164,36,155,238,75,233,202, - 228,128,7,29,59,97,124,59,248,198,119,184,241,101,147,47,249,223,188,49,1,136,94,227,190,114,8,100,9,204,86,136, - 104,72,26,208,26,64,135,134,30,7,58,13,232,50,161,39,132,148,215,40,102,215,225,24,180,228,108,145,172,181,182,89, - 254,154,193,104,106,219,58,187,107,235,70,57,180,109,155,76,116,117,138,104,212,198,52,20,49,91,99,104,141,22,105,36, - 33,82,7,168,48,68,249,17,194,48,66,72,13,109,186,248,9,7,233,183,177,48,86,228,236,51,95,231,133,127,190,63, - 232,62,125,50,123,64,135,103,227,240,180,47,196,67,62,204,174,211,58,216,218,164,23,222,98,0,244,230,2,31,104,148, - 231,40,119,118,17,219,190,131,125,199,142,190,234,215,31,214,90,204,106,148,138,26,37,85,113,79,43,244,9,132,88,17, - 154,80,41,45,221,58,196,132,198,140,69,113,206,142,168,173,243,203,86,214,142,74,237,150,217,183,152,45,187,160,118,106, - 109,158,206,150,68,89,229,13,39,180,240,117,157,253,91,118,147,232,72,227,10,143,227,71,207,49,113,126,148,31,185,177, - 155,66,220,160,187,183,147,205,125,237,132,150,199,240,216,12,87,238,221,78,61,168,208,211,222,205,174,246,36,247,124,227, - 81,254,249,171,207,51,91,174,33,12,31,17,154,124,234,179,143,241,238,183,93,197,31,254,219,219,153,152,56,199,83,15, - 204,16,77,117,224,133,11,36,4,84,20,236,191,108,23,158,231,83,174,186,132,134,65,224,185,116,180,36,169,86,242,100, - 58,90,49,132,201,217,19,231,216,177,161,151,104,60,73,53,95,194,72,68,73,197,108,242,185,18,43,249,42,177,206,24, - 134,101,81,47,7,20,11,14,182,105,99,89,30,85,87,129,54,240,61,15,161,12,208,16,134,10,195,176,168,212,125,218, - 210,9,132,72,50,231,4,34,3,229,253,185,229,250,125,159,255,134,61,112,215,141,70,216,151,140,150,231,232,137,67,71, - 180,145,31,230,231,1,227,95,1,31,1,252,20,175,95,239,121,113,137,217,87,5,174,3,115,25,98,45,208,38,160,189, - 21,90,52,116,27,13,237,102,64,65,191,7,93,158,160,213,137,154,73,63,30,139,217,93,157,102,56,212,111,235,161,129, - 72,106,235,6,99,239,222,93,70,219,192,26,209,218,217,73,38,149,66,16,82,175,22,168,101,243,248,117,151,208,87,4, - 21,141,175,5,210,168,32,209,104,165,64,40,180,89,193,76,152,8,43,67,49,43,41,63,242,156,90,186,255,1,167,242, - 212,211,133,200,114,121,225,54,152,141,194,233,80,136,163,14,156,10,17,83,81,173,202,31,3,45,94,5,13,232,200,235, - 11,64,111,62,240,185,168,5,133,33,79,31,56,192,142,211,167,176,95,229,252,176,64,19,134,144,53,148,126,94,6,202, - 214,48,44,108,163,38,125,5,90,9,29,8,76,219,162,92,171,211,123,98,76,183,131,113,175,101,177,117,122,182,208,94, - 241,206,250,16,169,71,229,134,211,99,19,178,187,59,70,190,110,99,38,51,12,244,102,48,204,56,185,149,2,29,107,44, - 54,175,143,66,105,145,186,97,51,56,56,64,75,20,42,174,102,247,182,45,12,118,166,17,212,104,137,181,162,29,201,173, - 183,222,196,143,158,26,99,105,161,78,58,157,161,230,154,156,158,153,226,51,15,63,201,137,209,113,254,228,255,252,32,142, - 243,2,174,204,16,143,165,8,209,8,2,34,150,162,86,15,89,90,174,163,181,160,94,172,209,221,154,32,102,42,106,190, - 131,23,64,91,60,69,97,165,198,218,222,78,22,23,115,68,45,131,164,13,181,88,138,124,169,78,91,166,14,18,66,5, - 165,98,64,79,87,138,48,200,17,120,62,165,146,131,82,26,165,154,155,68,107,180,214,184,190,135,29,77,81,11,193,43, - 23,116,4,194,8,136,202,100,62,124,230,208,113,99,109,187,37,11,130,84,139,38,238,129,241,88,195,243,248,109,23,183, - 4,114,192,187,128,206,215,208,13,78,243,250,57,16,251,192,168,64,36,128,216,97,65,194,214,180,133,176,198,128,109,192, - 122,23,58,106,208,153,53,232,46,116,180,182,6,3,125,241,204,150,13,102,199,230,33,177,249,178,125,180,111,218,104,196, - 58,219,101,178,165,21,75,36,46,49,222,52,42,112,169,45,173,80,45,228,241,106,53,36,33,162,153,24,174,12,133,22, - 2,67,75,2,237,35,34,18,43,222,142,83,55,89,58,57,198,202,163,247,184,197,123,238,91,142,140,78,207,38,52,227, - 25,56,175,96,220,145,114,174,36,141,25,59,12,103,187,181,42,181,161,131,231,128,9,160,244,214,226,128,222,188,224,115, - 129,140,206,117,118,243,55,111,123,59,153,175,222,131,241,42,46,194,37,165,131,107,97,161,210,150,122,82,85,92,218,12, - 149,117,163,134,233,59,1,50,98,72,211,48,16,150,141,51,126,92,111,41,86,228,162,132,32,226,132,151,175,168,115,46, - 188,32,97,104,74,249,155,111,247,139,65,49,140,235,101,207,176,167,23,23,200,180,40,158,126,230,52,165,37,201,7,126, - 242,110,90,35,37,194,48,141,76,117,176,101,83,59,200,0,203,136,176,177,63,133,214,117,164,178,209,198,50,129,17,98, - 248,109,252,252,135,63,74,217,180,241,204,58,170,170,57,117,116,130,209,145,191,224,200,68,150,31,253,157,79,240,222,253, - 235,137,214,86,168,233,126,180,21,98,72,77,181,144,195,21,105,170,149,144,106,197,37,42,108,18,134,32,22,139,80,168, - 87,113,61,69,79,107,7,249,124,153,174,206,118,132,101,225,185,30,49,91,34,165,65,165,90,160,86,47,17,139,199,177, - 172,8,181,170,143,235,132,160,53,174,227,82,173,214,137,217,18,199,11,209,65,136,144,2,75,218,4,94,128,17,161,145, - 152,187,82,213,113,136,78,65,196,221,188,217,76,34,88,10,20,197,88,44,161,107,245,88,25,172,143,55,72,219,111,239, - 85,122,223,32,191,117,52,79,251,104,229,85,39,158,85,211,180,138,131,60,7,70,8,209,168,20,45,10,186,18,74,247, - 74,232,69,211,229,193,128,7,67,43,146,161,74,79,107,135,222,183,59,97,239,217,26,233,216,185,93,30,216,178,141,158, - 53,253,116,180,247,33,69,180,121,213,0,8,209,58,68,43,7,80,132,126,136,83,174,80,206,47,35,188,34,190,82,96, - 74,66,105,128,2,83,128,169,65,10,141,101,219,120,86,154,249,165,50,163,95,254,186,170,220,123,111,53,250,252,241,92, - 186,86,63,223,213,104,254,122,74,193,152,50,228,156,134,124,183,210,213,245,97,224,58,90,171,58,47,150,169,125,85,247, - 222,155,20,124,36,223,75,61,112,161,249,94,227,9,109,207,101,97,243,22,254,219,232,40,163,103,207,188,154,3,172,127, - 10,106,63,23,132,211,194,13,245,147,155,219,212,238,146,151,150,5,87,4,166,33,61,51,66,197,149,172,29,158,162,29, - 56,19,143,178,207,241,231,227,65,120,216,131,49,23,6,214,87,235,42,81,15,245,189,107,135,228,201,241,37,242,11,211, - 74,162,228,23,255,225,94,238,121,226,24,29,109,30,239,253,237,95,2,87,178,166,205,192,146,146,208,215,152,26,148,14, - 240,132,129,52,53,132,38,10,65,96,215,233,222,121,128,132,175,41,101,115,56,134,207,76,253,36,50,97,208,167,109,150, - 202,43,124,237,148,207,71,175,184,130,201,229,89,98,233,20,113,13,201,214,4,139,229,10,181,64,17,56,117,162,113,131, - 192,52,145,70,4,215,171,18,132,154,76,50,65,189,86,103,114,114,154,214,100,138,74,190,136,33,162,216,162,74,93,88, - 44,149,20,27,226,6,66,249,20,234,14,29,42,13,150,69,32,45,10,133,26,209,142,40,158,14,240,180,137,36,64,154, - 10,39,80,180,119,246,82,158,93,193,46,84,132,134,212,177,238,54,59,181,166,93,82,243,88,200,57,132,158,27,54,220, - 10,255,250,98,211,29,49,42,31,222,192,232,137,195,175,10,216,248,77,18,59,11,98,47,24,181,70,220,87,42,2,109, - 115,130,22,67,138,238,152,102,67,160,244,134,26,172,45,27,244,122,93,45,45,198,150,237,233,250,250,181,137,158,235,175, - 180,46,191,250,160,232,29,218,68,220,74,54,129,198,107,130,141,131,82,30,34,84,8,165,192,48,17,134,129,10,60,74, - 133,101,156,82,25,28,15,67,105,124,35,64,10,11,48,16,10,4,10,211,16,88,241,24,165,186,203,243,39,198,152,249, - 198,131,97,237,222,135,138,61,83,75,115,107,97,202,128,147,2,94,240,225,84,8,243,62,84,66,165,188,130,70,175,208, - 72,182,211,52,226,217,94,147,195,255,77,170,148,124,215,38,185,105,104,202,117,131,39,207,165,190,169,12,235,119,180,144, - 180,38,33,37,31,187,235,29,124,74,41,142,15,159,123,117,76,48,224,48,232,15,47,85,131,54,224,137,152,197,254,177, - 162,246,5,58,162,66,165,13,137,51,59,205,166,21,175,230,131,231,137,192,90,231,233,211,30,60,35,165,88,118,37,107, - 211,62,103,133,98,192,175,185,93,29,53,167,124,176,37,145,237,50,195,181,119,175,247,141,53,102,63,67,91,214,179,182, - 51,133,242,67,82,182,137,144,146,80,11,132,48,80,65,136,41,52,104,208,194,64,104,133,22,81,140,84,11,45,166,69, - 75,166,135,170,91,226,252,223,252,21,3,235,123,200,46,45,162,86,66,114,75,14,247,157,26,230,198,61,131,12,15,143, - 113,249,213,7,233,239,239,226,137,135,14,81,114,5,158,103,210,154,138,18,137,74,202,78,185,65,88,155,38,166,109,224, - 148,170,96,4,164,162,49,180,144,13,198,32,240,137,167,146,148,234,101,92,47,196,48,36,65,16,82,173,59,8,36,65, - 8,94,160,48,140,8,16,160,53,24,166,129,86,30,160,72,180,164,8,135,71,117,199,114,77,30,49,236,232,226,142,205, - 70,151,225,224,36,35,172,61,114,162,180,51,84,199,125,152,78,130,243,175,45,106,239,238,181,232,206,24,120,234,123,6, - 157,11,191,195,134,185,103,196,32,102,65,70,64,103,18,6,12,88,167,96,157,214,116,215,66,221,145,179,228,96,126,235, - 186,238,244,181,87,166,214,221,118,139,53,180,255,0,109,125,253,36,162,9,26,141,159,125,52,146,80,151,26,166,19,205, - 138,16,186,81,23,66,27,141,240,10,25,132,56,203,57,156,124,145,192,245,208,194,71,9,159,64,42,108,47,5,34,68, - 154,130,72,52,129,39,108,166,39,23,56,253,232,99,122,241,190,251,234,177,19,199,178,61,117,127,178,3,206,1,195,72, - 70,208,98,212,215,122,78,64,201,129,224,113,224,61,26,166,121,125,58,130,252,64,0,144,105,104,170,174,228,211,79,117, - 50,151,183,137,88,223,219,208,133,74,97,72,201,143,223,253,78,254,241,171,247,112,244,85,210,132,4,141,72,219,94,224, - 231,78,47,19,184,65,16,66,45,229,134,165,104,189,70,218,93,10,218,20,35,161,41,103,91,133,142,24,129,122,18,33, - 142,99,136,101,195,70,201,90,184,16,129,219,163,179,227,173,183,153,134,185,46,214,18,141,218,49,125,112,255,70,54,236, - 18,100,29,133,19,4,216,34,138,208,32,48,27,105,47,82,162,9,137,232,16,95,25,104,17,34,9,49,100,43,161,142, - 162,133,194,138,90,204,44,207,209,179,166,133,236,82,1,35,19,161,51,235,50,59,186,204,211,19,83,116,182,152,116,182, - 182,18,105,137,96,104,193,244,228,34,133,90,136,29,137,147,180,45,132,17,176,92,171,209,22,111,193,182,77,74,181,50, - 150,105,18,145,38,217,165,28,137,100,26,195,240,240,125,31,76,80,65,72,177,82,35,22,75,130,10,240,92,31,59,26, - 37,240,67,10,165,42,126,79,11,90,52,180,102,67,10,124,191,17,174,175,77,129,187,88,81,158,130,83,219,55,25,109, - 221,157,72,81,161,245,169,99,229,107,151,139,15,75,205,215,93,56,187,5,234,223,174,52,135,247,158,117,184,63,181,5, - 81,169,126,207,139,50,13,226,86,48,218,32,226,65,42,215,160,121,134,162,176,41,132,141,14,12,229,161,223,237,104,235, - 52,246,239,79,198,47,219,27,93,119,195,126,235,250,253,91,232,239,24,68,98,161,81,132,40,66,85,67,104,1,72,132, - 12,154,247,145,23,217,29,33,77,36,2,237,123,132,133,2,197,210,50,190,83,193,8,105,104,59,161,64,10,19,33,21, - 102,74,19,216,105,178,217,42,231,159,124,150,153,175,223,235,170,39,159,46,116,46,21,103,246,193,168,13,231,20,156,85, - 112,62,148,204,213,52,133,184,214,78,11,4,9,96,180,73,142,27,188,126,57,113,111,249,212,151,11,224,243,143,223,39, - 248,188,28,132,62,252,142,187,1,94,21,16,18,77,210,238,44,80,116,2,98,16,68,32,23,13,89,138,230,178,193,90, - 51,168,200,144,231,107,113,158,73,36,76,95,149,194,147,113,173,39,59,4,229,41,41,29,52,241,16,174,75,73,33,54, - 184,42,26,109,209,162,98,184,242,175,254,247,33,14,94,115,53,7,111,222,77,170,173,23,93,175,67,165,136,212,10,80, - 4,42,68,72,141,8,0,105,130,112,145,42,64,34,8,13,19,45,192,194,199,17,37,60,25,80,175,251,152,50,78,36, - 19,101,253,174,24,213,179,30,143,156,154,225,221,215,238,102,231,154,126,142,29,27,103,169,172,8,84,149,116,84,17,141, - 71,88,40,214,49,68,2,91,154,164,19,113,150,86,150,72,71,99,72,37,41,22,74,212,3,72,91,54,182,33,113,195, - 0,41,37,139,133,50,131,177,52,182,105,82,42,215,72,201,4,142,227,99,91,49,234,174,143,235,249,104,4,90,43,76, - 41,48,165,198,64,112,104,50,43,135,147,105,177,123,87,15,126,80,163,235,208,169,194,129,201,149,135,77,248,188,7,143, - 9,88,252,57,80,83,175,176,176,47,144,194,159,122,247,58,182,3,206,119,145,72,16,208,168,146,40,64,60,3,137,46, - 104,87,208,173,161,39,10,107,21,108,168,194,166,9,201,250,234,250,53,93,173,55,220,156,28,186,253,22,123,224,224,54, - 186,6,250,137,26,177,198,167,117,136,14,61,180,172,163,209,13,62,69,112,17,128,16,2,113,9,101,33,53,72,29,224, - 215,29,138,185,37,130,74,30,194,56,182,106,107,104,77,162,138,145,180,9,173,12,149,130,207,216,115,231,89,122,232,33, - 183,250,192,131,249,216,212,220,194,122,173,231,18,48,34,224,76,0,195,10,166,21,228,138,80,233,85,248,109,155,218,208, - 107,91,201,156,88,196,91,172,124,91,208,17,151,104,124,171,0,244,26,129,207,165,32,4,188,106,32,244,203,192,7,47, - 57,85,206,65,48,39,200,107,197,66,87,33,91,233,180,236,101,31,206,200,152,124,50,210,106,231,163,243,110,126,113,119, - 135,255,111,71,11,234,63,7,218,5,12,101,202,248,160,8,141,116,45,192,137,39,164,83,13,196,154,238,30,222,113,227, - 94,84,34,137,236,221,140,118,43,184,99,103,208,78,1,105,134,8,161,64,75,2,109,160,81,104,29,66,24,130,159,195, - 84,30,138,4,161,174,179,152,159,229,217,167,143,147,157,112,9,253,16,105,91,236,220,63,200,14,175,151,199,14,157,103, - 114,165,198,117,251,47,227,11,95,251,26,11,101,72,89,38,173,73,131,188,83,161,92,9,105,77,165,176,76,240,156,26, - 82,74,52,130,114,217,37,87,172,19,213,146,88,139,77,60,158,160,86,113,136,68,44,170,181,128,186,235,97,1,126,168, - 113,253,16,203,182,9,148,64,55,141,15,21,42,164,173,209,66,19,49,36,65,224,51,177,52,45,250,111,56,32,156,154, - 71,234,169,163,197,131,185,242,55,20,124,78,193,227,54,44,236,132,96,188,49,190,223,82,220,122,128,252,46,58,138,57, - 64,1,140,27,32,42,161,189,14,91,76,56,32,97,83,21,250,114,208,95,237,77,119,26,119,222,210,214,255,238,119,219, - 187,14,238,166,167,187,239,197,130,122,90,65,232,190,168,210,75,129,198,110,150,44,22,141,121,145,205,26,50,58,104,2, - 147,198,64,163,3,159,90,62,71,181,144,39,244,61,148,148,88,113,15,195,20,40,146,84,43,41,150,94,56,173,86,238, - 255,107,103,249,137,103,202,242,252,84,182,37,8,167,6,224,172,132,17,13,83,33,76,187,176,216,1,165,4,184,213,102, - 16,225,105,224,39,223,191,3,239,195,123,80,227,121,156,223,127,148,241,103,102,144,188,114,63,52,221,32,213,169,1,87, - 208,104,91,109,3,191,14,148,127,24,1,232,181,2,159,151,131,208,7,222,113,55,119,172,228,48,151,150,190,39,155,56, - 108,14,242,151,154,150,126,243,52,209,221,154,98,0,103,215,19,30,201,132,65,46,132,225,120,38,154,45,38,35,229,167, - 41,187,31,61,216,205,246,243,5,162,245,144,58,40,165,116,208,231,135,174,4,229,24,22,237,153,148,216,183,206,198,155, - 29,65,119,15,96,244,121,205,218,209,141,133,44,66,191,17,243,97,68,80,134,36,212,33,66,107,164,214,232,242,28,42, - 55,134,213,127,128,197,149,2,133,98,145,160,102,224,86,61,28,63,143,233,38,41,45,151,233,27,104,99,123,161,151,115, - 195,19,60,119,252,28,75,43,57,20,6,61,233,54,12,83,242,194,201,83,172,31,88,135,109,248,24,182,65,173,236,17, - 139,197,240,67,152,203,21,241,180,69,80,13,40,152,117,44,59,130,161,170,152,210,66,152,17,60,165,176,100,35,70,193, - 241,21,150,29,65,171,11,44,178,64,235,16,83,154,212,252,144,68,50,70,185,232,48,212,191,14,119,121,153,190,67,71, - 151,175,170,235,71,52,124,46,3,143,231,96,225,73,8,175,249,22,188,197,26,26,45,150,87,190,67,126,71,54,41,224, - 69,48,92,136,71,160,91,194,70,9,59,44,216,191,4,187,178,157,173,61,246,45,55,166,215,190,251,174,200,198,107,175, - 164,191,127,8,3,7,133,36,84,1,154,0,83,6,77,156,177,65,11,2,195,69,96,33,154,126,86,173,21,66,132,205, - 140,44,141,198,70,160,144,58,36,112,234,212,242,121,220,90,5,75,8,146,169,52,117,223,101,100,58,203,249,163,167,117, - 238,240,11,202,59,114,156,158,201,217,122,79,213,153,26,128,51,18,134,53,156,15,13,57,42,18,246,12,117,63,231,250, - 97,61,222,116,159,141,2,22,80,4,6,219,162,176,191,135,112,190,140,217,147,36,104,143,243,56,141,250,218,127,13,220, - 8,204,3,159,166,17,41,30,3,102,129,25,224,87,155,224,35,224,251,246,24,155,111,85,240,169,56,146,79,63,253,218, - 128,207,75,64,200,48,88,115,227,77,188,251,139,95,32,230,121,223,181,203,246,2,255,19,52,255,45,27,155,65,143,192, - 138,13,79,164,82,166,111,133,70,217,135,227,53,105,84,122,126,108,155,90,99,12,163,86,28,222,237,134,20,32,136,194, - 34,154,163,49,211,138,104,188,158,146,231,244,137,104,210,238,234,74,82,169,46,99,85,210,88,179,35,4,218,67,121,69, - 164,169,209,161,64,138,6,151,16,202,16,169,12,164,150,168,208,199,93,94,164,92,122,148,129,206,61,124,227,235,207,50, - 188,120,158,254,158,22,70,14,159,193,78,70,113,189,42,239,184,227,61,108,220,220,13,127,253,87,220,55,58,205,231,30, - 126,154,181,45,22,25,225,145,73,165,56,61,179,130,167,45,226,49,11,59,34,40,148,203,88,42,130,64,80,40,87,8, - 35,81,220,154,130,138,199,162,95,96,77,127,111,147,12,215,72,51,66,185,82,37,145,137,226,169,0,169,163,40,165,9, - 252,0,167,238,160,1,211,50,26,174,99,203,196,178,77,102,167,230,88,58,62,172,110,28,159,154,217,21,232,39,92,248, - 178,5,143,215,97,241,167,32,188,254,91,140,127,23,240,251,192,31,127,7,0,228,0,237,32,111,4,99,14,98,2,186, - 227,176,197,130,125,62,236,27,131,77,51,189,237,125,153,15,190,51,115,195,207,127,212,216,186,125,23,70,83,95,80,65, - 0,74,54,10,226,153,54,10,137,175,13,164,110,120,35,5,96,104,11,180,68,160,154,161,124,32,154,142,109,45,20,129, - 14,49,5,248,213,42,94,169,220,56,44,148,193,233,177,9,61,252,194,201,202,200,195,207,80,123,230,233,200,186,170,195, - 0,200,76,163,118,40,2,124,13,117,5,66,66,135,161,180,208,37,39,161,160,104,129,31,64,181,8,197,86,168,215,165, - 168,215,162,150,155,142,219,33,125,113,162,90,32,164,226,191,41,197,127,190,100,204,126,189,73,25,156,164,81,35,91,54, - 249,33,221,244,250,25,175,2,248,188,37,1,232,34,225,252,116,39,179,121,155,168,245,218,114,245,194,247,89,90,191,129, - 71,222,243,94,222,255,133,207,97,122,223,127,160,226,116,99,114,235,183,69,140,243,149,76,36,107,44,57,254,12,148,31, - 245,116,240,95,119,119,232,61,55,244,178,248,27,79,179,59,212,76,54,22,208,121,91,235,207,163,25,5,174,15,131,242, - 109,245,96,62,190,41,99,81,171,135,24,122,5,51,63,140,162,225,110,87,194,66,9,19,161,5,82,11,180,240,17,218, - 68,8,65,173,86,197,114,3,130,202,12,71,31,125,132,103,158,62,195,228,226,89,174,189,102,39,243,163,179,44,44,58, - 184,70,141,88,58,193,237,119,126,152,193,182,36,167,206,255,22,95,123,246,40,31,190,114,63,189,182,196,48,235,200,116, - 146,142,238,54,108,83,19,6,18,47,52,136,199,108,10,217,28,190,180,193,142,35,92,31,25,72,156,176,74,177,90,38, - 147,140,83,116,92,76,59,78,88,115,80,97,128,52,76,234,78,195,68,137,68,34,56,110,13,105,68,16,194,0,67,99, - 219,54,42,12,56,117,126,146,53,35,147,185,125,240,100,21,190,160,225,73,15,150,254,13,132,179,205,77,242,74,114,35, - 112,217,37,218,231,43,29,16,186,249,249,24,68,90,27,7,126,79,0,107,34,176,211,135,253,39,96,199,200,64,79,223, - 192,143,191,47,254,158,143,252,132,216,186,101,55,160,80,65,133,80,7,200,166,9,21,24,33,146,8,50,144,72,84,67, - 213,69,19,52,1,72,42,137,144,52,52,30,169,80,104,20,18,133,1,72,44,1,213,252,10,203,179,179,172,100,151,56, - 119,118,148,211,195,227,12,143,78,213,219,202,245,177,141,90,119,237,187,246,42,203,72,197,140,138,97,136,98,224,235,48, - 244,162,241,233,169,181,153,66,61,93,23,166,23,56,245,48,146,205,151,109,215,95,1,42,17,168,75,200,9,88,12,96, - 209,132,145,13,112,54,168,122,43,39,191,58,170,73,88,252,247,167,166,249,167,135,39,94,98,110,5,151,104,147,226,18, - 109,231,213,38,167,205,183,34,248,252,227,83,175,15,248,92,16,203,113,56,53,180,1,235,3,239,228,125,99,15,17,126, - 31,173,240,140,230,98,223,234,43,189,231,150,1,103,204,85,110,252,217,69,253,216,92,153,251,128,63,245,5,110,41,160, - 227,182,53,24,15,76,243,44,40,3,150,251,160,232,151,189,37,13,45,201,124,241,64,97,50,223,174,135,6,8,98,53, - 100,52,131,54,35,40,229,129,110,122,80,154,43,37,208,26,17,154,52,104,93,3,59,146,68,219,53,122,12,77,245,252, - 189,204,62,241,53,198,202,6,27,182,237,230,142,159,186,129,92,161,64,164,213,192,110,171,224,215,231,217,177,115,31,215, - 238,189,10,127,41,135,44,251,120,105,151,157,123,55,49,249,213,51,244,39,210,8,83,80,173,215,73,71,226,44,101,107, - 212,125,3,43,30,37,112,93,16,62,174,112,49,66,73,110,197,193,232,76,128,168,147,208,30,85,101,82,114,5,118,84, - 129,23,16,134,62,177,72,28,223,53,209,166,66,168,0,180,66,74,3,97,180,147,61,123,154,235,97,198,133,167,52,60, - 187,17,22,127,20,212,201,239,194,109,14,32,163,38,36,44,4,166,64,52,74,227,185,192,14,136,182,195,218,0,174,181, - 224,114,9,67,71,97,232,204,186,129,193,117,31,249,96,236,23,126,242,67,108,24,218,222,216,154,170,4,90,32,37,104, - 109,162,164,70,8,129,208,2,161,53,200,176,89,112,71,160,181,70,135,10,132,64,27,18,33,100,67,79,17,23,66,221, - 4,66,55,12,191,153,185,5,22,230,231,177,165,36,217,219,207,149,107,214,115,203,123,83,36,146,201,184,29,139,239,209, - 134,13,72,12,36,47,50,72,46,245,114,177,197,171,214,90,10,117,23,191,82,68,45,206,18,22,115,202,169,213,241,207, - 77,121,198,200,100,85,79,206,151,39,78,141,228,218,43,149,175,217,53,111,101,33,30,47,236,94,219,17,78,254,221,243, - 252,237,51,211,111,88,33,254,183,12,0,73,169,169,56,6,255,244,116,199,235,10,62,23,36,230,212,57,219,191,158,23, - 222,21,103,207,224,10,142,255,189,15,93,10,184,29,112,37,152,83,85,109,28,93,126,105,43,24,5,65,103,12,131,139, - 33,105,234,65,112,175,145,98,73,134,122,36,153,11,102,103,78,206,175,223,179,101,139,97,184,14,66,216,104,105,54,106, - 249,43,208,170,233,71,17,128,144,104,45,176,8,27,175,197,146,208,35,80,78,133,117,25,205,239,255,230,79,243,223,63, - 241,0,95,254,155,47,208,189,126,45,45,237,25,122,58,225,206,159,234,32,48,210,140,29,127,134,31,185,170,157,167,14, - 173,176,84,14,249,233,219,110,66,21,171,104,39,32,154,49,240,202,37,226,182,73,169,90,163,84,171,34,236,8,126,189, - 78,24,134,168,208,199,50,13,132,18,184,158,71,161,84,35,21,181,9,125,15,41,44,252,80,96,95,168,146,41,26,62, - 22,199,181,65,123,196,164,66,40,27,33,5,149,208,35,117,126,182,218,11,163,46,156,201,64,182,23,212,210,165,135,68, - 243,247,191,118,52,84,158,93,196,88,168,49,125,182,160,83,19,53,158,7,43,14,173,29,176,14,184,70,194,109,163,176, - 251,112,103,111,91,219,135,223,17,253,165,255,227,167,216,178,110,91,99,187,171,202,139,228,178,80,104,125,1,232,27,222, - 43,137,113,81,235,65,92,40,252,41,144,23,163,99,197,37,241,61,141,185,185,168,81,104,77,107,75,43,61,221,61,205, - 218,217,151,178,136,23,156,242,206,139,196,182,208,132,190,143,87,173,18,120,46,202,115,233,242,60,252,132,129,183,113,29, - 138,77,50,97,69,176,238,136,68,199,231,115,209,111,252,243,231,218,35,217,201,68,119,133,152,6,217,107,74,230,239,59, - 71,223,201,197,215,45,23,238,45,13,64,2,248,226,225,54,166,87,108,98,182,122,253,239,47,64,187,138,175,62,209,133, - 216,235,179,99,160,72,16,126,111,10,169,110,146,156,134,37,209,190,250,166,217,215,52,194,231,1,54,55,189,12,247,1, - 251,108,195,73,251,225,116,38,208,163,39,159,24,222,51,122,203,158,214,13,17,137,112,125,116,52,104,156,194,77,125,89, - 8,217,44,89,39,80,8,164,14,145,40,28,105,160,34,73,100,196,198,8,3,54,182,69,249,179,223,253,8,95,253,198, - 211,252,197,23,158,225,204,211,19,108,191,233,74,118,245,95,137,191,178,64,75,238,8,190,214,28,159,154,226,231,255,237, - 47,176,53,99,240,197,47,61,65,213,138,96,248,14,9,45,176,60,159,217,66,141,64,130,170,151,137,70,19,248,42,36, - 12,66,108,9,210,48,208,90,81,171,59,180,36,91,0,141,129,129,235,213,73,136,20,74,132,23,249,49,47,208,8,35, - 36,105,106,162,86,156,72,92,82,172,102,105,203,22,139,2,198,108,152,93,6,239,31,128,247,210,136,208,213,77,222,226, - 159,128,31,5,254,27,141,246,58,175,36,243,127,113,138,243,13,173,199,254,8,36,21,244,107,216,103,194,149,57,56,240, - 92,38,186,185,252,182,235,91,126,254,119,255,31,118,108,219,117,209,35,39,116,136,16,47,166,96,94,244,226,11,209,124, - 253,197,72,33,33,26,154,143,66,53,56,33,33,64,74,228,203,154,117,138,38,128,9,209,0,166,104,44,142,16,16,40, - 191,241,94,193,37,224,3,82,27,160,20,129,23,80,43,22,168,151,75,104,223,107,120,205,164,164,174,53,194,87,68,34, - 16,8,139,225,137,37,142,220,255,117,74,95,255,146,187,113,98,101,166,99,185,244,164,47,197,115,166,214,121,103,169,34, - 70,191,112,134,4,112,249,37,252,100,0,180,93,98,154,138,75,158,64,252,48,3,144,210,130,170,39,177,140,55,174,107, - 147,20,154,32,148,60,63,209,198,206,129,2,175,85,184,86,212,146,252,250,87,199,249,23,26,245,97,46,40,235,27,220, - 208,191,75,50,231,193,153,158,137,229,153,195,143,30,107,25,186,243,42,33,170,69,140,116,10,161,26,17,221,90,92,136, - 49,105,28,195,18,8,165,198,71,55,204,17,213,56,173,165,246,9,253,10,66,86,121,247,157,251,184,245,246,203,152,171, - 175,161,84,5,127,101,154,72,249,56,9,237,240,201,167,207,179,239,134,155,216,217,223,78,121,110,154,179,217,60,42,106, - 96,213,29,66,219,68,116,245,241,182,91,15,96,164,18,4,149,10,231,207,141,112,242,228,41,108,211,38,240,124,44,219, - 38,150,136,19,6,30,149,154,75,50,150,64,185,1,74,131,235,42,180,18,132,126,8,177,0,95,5,68,13,3,33,52, - 133,124,158,190,150,30,150,103,150,216,228,185,89,5,99,38,228,74,160,254,170,65,24,95,228,39,198,129,71,129,39,155, - 174,226,87,138,229,105,3,214,129,156,109,100,157,175,51,96,155,13,187,43,112,224,217,72,100,187,250,192,29,157,55,124, - 244,253,198,222,125,7,104,111,25,36,84,46,26,7,137,66,72,235,69,187,182,233,78,191,0,60,151,174,72,253,34,50, - 33,164,184,228,35,226,21,15,213,11,181,81,181,166,193,9,105,133,209,220,246,141,178,133,205,164,92,21,226,59,37,220, - 90,21,183,90,195,119,29,164,166,241,94,173,145,82,225,27,30,190,7,163,39,199,56,252,181,7,116,237,193,135,217,60, - 189,236,109,119,152,83,232,99,190,33,206,34,113,3,45,6,129,150,13,232,218,10,184,127,4,161,120,233,183,99,17,194, - 12,184,123,193,179,32,12,64,249,47,139,169,250,161,35,161,141,55,65,62,171,16,188,230,32,24,26,130,143,20,61,238, - 184,100,146,21,208,171,180,174,41,86,2,33,142,116,184,122,199,210,61,71,187,135,247,108,236,218,220,219,134,84,33,88, - 54,66,169,139,39,150,210,205,152,90,13,218,104,20,61,147,74,35,84,136,8,131,134,166,36,37,129,80,4,53,133,37, - 124,54,12,118,34,186,119,146,127,254,211,104,97,242,213,19,101,162,235,54,242,209,95,253,21,152,59,193,76,161,140,87, - 171,96,187,62,182,109,114,224,174,91,184,249,199,126,134,100,162,163,177,165,66,31,183,84,228,191,253,225,127,229,196,147, - 135,73,70,163,32,124,148,104,84,223,241,125,240,35,26,69,64,168,66,156,186,79,52,102,33,165,137,105,90,13,86,68, - 131,198,34,91,152,165,199,238,167,101,116,165,214,171,24,13,27,26,80,229,243,77,183,240,119,218,62,217,111,186,226,255, - 75,35,182,175,67,192,65,75,112,139,167,217,55,97,152,67,11,183,222,216,187,235,223,124,36,114,227,109,183,17,179,227, - 64,149,144,21,16,2,67,91,13,186,70,7,23,13,189,75,181,150,11,187,86,107,253,178,230,10,151,232,12,23,114,43, - 46,1,41,33,154,237,203,47,124,166,169,237,8,33,64,105,132,214,104,215,39,112,61,188,106,21,223,119,80,65,13,165, - 21,82,9,162,182,133,214,18,33,12,234,142,199,244,232,212,202,249,103,158,173,231,30,122,34,33,142,156,74,116,85,125, - 99,176,57,148,181,198,50,234,36,212,251,129,109,2,28,1,69,9,5,11,106,10,92,1,74,188,148,120,118,4,228,226, - 176,124,225,189,2,138,187,193,139,64,88,7,21,252,176,1,208,15,131,104,91,162,198,138,236,124,102,129,157,175,240,247, - 28,212,206,74,206,248,33,15,175,159,173,245,157,251,242,179,215,247,254,252,237,49,103,114,140,193,205,59,81,58,64,43, - 133,48,26,133,190,80,141,83,212,84,178,1,224,34,36,148,33,161,80,8,37,65,75,164,144,24,202,68,11,77,205,157, - 33,230,117,147,220,112,5,207,191,112,138,106,172,206,199,126,249,231,177,109,131,122,60,67,49,48,192,243,177,162,54,183, - 252,196,7,185,254,157,119,83,170,58,100,179,83,8,199,37,101,26,68,186,58,120,255,135,127,132,225,23,78,18,11,37, - 117,63,192,48,13,148,1,90,11,66,165,9,181,7,66,82,171,55,178,186,209,18,207,13,208,134,194,16,18,165,45,234, - 8,188,186,75,102,116,54,31,133,17,31,166,11,224,118,2,73,94,204,204,22,52,130,228,254,238,21,180,159,11,81,232, - 191,14,70,7,116,20,225,74,27,222,181,160,185,102,118,247,214,190,173,255,207,111,37,223,119,247,123,72,68,108,80,121, - 116,152,3,33,144,58,14,202,108,84,87,150,77,72,191,164,146,187,18,23,186,247,234,139,224,35,94,118,95,160,145,70, - 113,129,43,186,128,53,66,188,168,246,104,221,12,74,108,2,91,216,32,166,67,207,163,144,93,194,171,214,136,72,3,80, - 120,74,224,123,138,48,208,100,179,139,12,143,142,177,148,91,97,118,126,145,229,233,133,133,100,32,196,254,116,50,189,115, - 239,118,77,44,174,114,235,7,68,189,61,99,25,129,209,237,213,85,71,44,212,202,46,231,67,170,101,229,85,92,191,90, - 169,251,245,252,138,175,114,139,158,44,150,125,233,163,162,26,221,56,154,240,58,97,57,218,0,160,172,1,19,6,140,11, - 200,234,134,133,155,141,67,97,63,132,23,28,43,122,21,128,222,250,98,8,65,169,30,242,84,197,127,69,3,79,129,78, - 135,58,107,194,33,19,214,25,79,12,175,27,191,109,231,102,34,17,74,238,41,182,109,223,214,168,193,32,4,58,84,77, - 30,186,97,138,53,56,135,176,201,75,152,141,214,209,161,192,8,65,201,198,194,143,155,105,130,68,18,17,239,96,243,110, - 147,3,215,223,128,21,145,248,165,37,100,162,143,147,211,57,252,100,156,15,253,155,95,97,219,21,151,113,242,153,103,9, - 150,39,57,55,50,130,244,32,25,143,178,249,242,253,244,110,222,75,223,64,55,213,241,5,194,80,225,41,143,132,25,197, - 196,196,247,61,164,33,16,1,4,190,38,176,66,98,182,133,101,198,240,194,42,49,105,83,117,92,42,218,162,54,187,172, - 251,242,249,121,224,188,132,229,35,160,206,54,53,160,75,221,232,15,210,136,83,121,185,172,7,210,141,154,201,253,21,56, - 40,224,206,179,177,216,245,241,95,251,216,192,7,254,237,207,152,189,237,27,208,97,136,242,139,96,248,72,17,111,92,81, - 104,180,104,128,164,86,118,195,172,21,193,69,176,160,105,46,93,170,25,139,139,252,144,190,200,241,160,117,243,35,47,155, - 77,253,34,183,115,1,188,164,110,0,22,90,81,171,84,241,195,16,105,155,248,42,100,37,191,130,171,26,190,76,180,192, - 72,217,108,219,187,157,3,233,20,109,157,93,100,90,90,183,155,182,73,16,58,72,195,215,150,180,69,163,40,137,5,40, - 67,19,52,41,122,31,240,240,21,56,110,72,165,88,164,146,91,160,90,206,227,187,10,157,247,244,232,249,113,49,49,114, - 142,147,199,143,121,198,153,243,181,158,98,173,218,129,206,103,96,33,10,75,22,76,73,120,54,132,103,255,35,44,29,132, - 48,250,61,174,247,215,182,55,60,224,155,175,108,41,26,97,35,42,119,85,94,58,96,66,10,178,17,131,187,191,205,219, - 254,12,130,43,4,51,30,28,238,172,232,125,39,191,114,120,240,237,191,253,177,88,109,121,153,51,103,207,178,105,203,38, - 164,33,47,122,107,80,154,64,4,104,209,152,112,137,1,170,113,44,107,173,80,4,104,12,124,105,147,72,116,99,41,1, - 190,75,71,199,26,148,89,37,12,29,172,84,148,231,30,61,198,11,231,103,249,149,223,252,117,182,238,185,154,165,241,73, - 142,126,253,97,238,190,121,35,235,46,91,203,200,209,17,138,133,69,178,227,22,189,107,215,178,121,93,31,207,156,62,127, - 209,235,92,119,234,196,205,24,50,116,73,183,37,41,4,30,166,105,96,26,18,203,50,65,90,136,64,99,73,197,210,242, - 10,21,97,161,71,243,245,54,152,212,48,62,15,149,71,155,91,217,123,153,137,245,74,43,233,99,192,251,33,150,135,141, - 6,220,92,135,91,206,174,25,56,184,247,47,255,168,231,250,183,223,10,202,71,5,117,144,117,148,233,131,136,53,202,180, - 106,141,32,4,35,68,8,137,194,126,9,67,114,193,84,185,148,152,109,240,34,26,201,37,164,180,190,100,94,181,190,120, - 137,11,36,117,131,211,126,209,12,187,152,34,34,4,241,116,146,88,50,70,168,124,164,212,116,172,29,64,88,241,134,163, - 1,205,139,81,57,170,121,139,0,180,198,178,98,104,146,194,215,160,117,163,252,170,8,21,130,16,101,149,16,161,137,192, - 192,68,145,136,106,82,177,22,68,79,95,19,156,2,180,46,136,203,220,27,81,126,137,165,229,37,123,124,100,218,158,56, - 53,217,50,115,242,201,190,167,78,205,110,159,159,153,11,47,203,174,100,175,242,130,62,95,136,26,90,63,245,52,84,204, - 239,129,19,186,250,181,4,160,6,248,152,104,241,202,196,77,96,10,204,64,173,130,80,115,172,12,192,52,37,248,138,223, - 249,219,211,0,252,39,224,237,47,91,232,33,176,9,24,211,212,29,193,112,20,14,103,14,79,110,63,241,232,195,155,111, - 189,245,38,150,28,147,233,249,60,107,6,50,8,25,34,60,139,128,128,80,106,164,54,208,1,152,90,96,8,133,47,2, - 66,83,161,5,72,101,96,198,90,32,29,33,20,1,194,20,72,93,69,134,10,204,8,94,16,97,105,185,204,175,253,246, - 255,197,208,230,54,116,101,30,63,63,131,95,25,103,236,120,129,84,170,131,45,155,182,50,54,55,66,169,94,34,162,53, - 45,157,173,20,164,75,155,25,69,184,146,80,155,248,202,71,138,16,229,42,44,173,209,134,79,77,185,216,97,28,195,53, - 208,194,2,17,103,108,101,12,153,233,192,158,95,40,70,97,44,132,57,19,188,193,151,141,71,4,248,228,43,152,94,31, - 3,254,45,68,231,96,83,4,238,40,192,93,243,219,55,236,184,227,31,254,170,109,211,222,3,40,85,110,212,163,110,210, - 169,66,73,180,16,141,252,57,104,166,138,54,204,167,70,113,29,129,18,242,165,4,242,37,218,80,35,133,228,165,38,21, - 82,188,196,116,19,205,247,93,228,122,208,223,212,148,243,2,191,36,45,11,129,141,41,227,23,175,161,155,238,251,134,229, - 118,137,215,243,130,141,215,44,183,34,132,110,130,84,67,147,19,6,141,239,170,26,190,46,37,53,161,50,26,26,93,104, - 225,185,43,56,37,7,191,80,196,113,243,132,74,161,101,0,66,178,113,168,159,221,59,118,224,127,232,78,113,244,244,130, - 248,252,23,191,36,191,241,207,159,235,219,148,203,109,237,210,97,183,130,72,47,84,206,164,187,56,157,238,194,250,46,58, - 28,191,102,0,244,175,129,207,139,32,36,127,168,65,72,235,198,26,141,26,130,34,48,50,87,102,231,207,220,207,169,137, - 70,193,203,141,52,90,198,116,188,194,68,41,80,207,106,22,44,120,161,187,194,222,209,175,30,233,155,218,190,33,217,223, - 189,150,176,179,11,45,42,24,161,196,23,17,164,12,145,218,65,41,19,141,68,73,3,36,72,97,98,162,145,26,234,42, - 70,164,109,29,218,72,17,18,109,20,118,11,125,192,68,135,54,74,187,188,237,157,183,99,10,141,90,153,99,250,201,71, - 153,57,245,12,111,223,218,66,107,68,50,90,158,103,161,146,96,253,198,253,28,25,27,195,72,182,146,74,119,17,53,50, - 248,218,197,51,66,2,45,64,248,16,106,44,71,18,145,113,194,208,165,90,211,84,188,16,171,37,192,54,5,185,170,207, - 249,108,133,93,137,20,125,149,106,46,132,169,40,172,168,102,224,97,178,185,198,50,205,177,41,188,108,108,126,17,248,101, - 136,102,97,115,12,238,152,129,119,46,222,124,213,238,187,255,231,31,37,215,110,217,76,232,151,144,82,54,188,84,13,134, - 254,130,241,132,190,36,81,245,34,81,252,175,122,59,5,82,128,80,47,227,116,154,38,154,104,106,57,23,201,231,75,212, - 163,23,95,19,40,173,26,102,156,108,0,141,210,186,17,30,213,52,238,68,211,101,166,185,96,214,93,2,110,23,59,125, - 53,126,139,230,231,27,32,212,128,35,37,18,8,17,34,133,66,234,8,110,177,68,41,55,131,235,44,162,194,70,235,116, - 221,76,71,141,68,50,8,105,48,59,151,227,216,225,167,56,250,196,115,228,15,31,14,183,100,151,10,183,132,225,84,43, - 234,217,16,166,5,184,115,210,224,233,76,47,75,118,20,227,187,220,203,230,171,15,62,226,59,2,159,183,44,8,105,144, - 82,96,197,76,172,240,251,44,80,105,75,44,41,248,171,165,58,127,12,224,134,23,193,135,75,52,158,11,114,164,233,74, - 94,75,163,0,205,54,168,77,195,25,19,158,106,63,182,188,254,248,163,231,246,246,191,175,95,202,176,68,104,24,16,74, - 180,89,65,134,38,82,69,81,210,71,75,8,80,205,69,220,168,19,44,125,144,169,86,204,206,126,132,180,48,0,77,72, - 104,40,12,173,144,8,108,161,17,202,3,41,240,234,30,231,78,62,207,80,74,146,136,36,168,135,2,179,189,141,84,95, - 39,83,243,179,172,219,119,57,164,251,41,151,42,196,81,132,36,208,162,134,208,149,198,169,110,219,84,106,5,236,84,26, - 180,198,112,53,1,18,199,171,147,74,38,89,56,63,227,222,136,161,188,92,33,154,168,57,57,96,97,9,106,91,175,238, - 230,137,159,218,2,213,0,210,22,249,71,231,248,155,191,31,249,38,205,231,23,4,177,5,205,198,40,220,62,13,119,79, - 255,216,123,15,252,212,255,250,147,72,71,50,142,242,29,164,97,18,170,0,169,5,82,24,232,70,78,250,75,72,226,11, - 224,163,255,213,67,228,82,80,225,18,142,232,69,13,233,155,61,100,47,242,68,23,249,34,241,210,251,138,151,93,227,69, - 222,232,165,69,244,245,75,72,111,31,173,26,209,214,186,25,230,173,208,72,83,54,25,251,16,130,16,175,190,76,117,165, - 68,173,84,68,251,145,134,6,108,6,104,43,133,105,25,56,78,192,209,199,159,231,248,253,79,233,236,227,207,184,169,165, - 197,202,94,29,228,214,192,76,2,206,134,112,50,128,19,81,56,87,131,250,54,33,249,188,48,176,3,255,187,46,217,250, - 170,1,144,18,160,132,73,104,200,239,186,4,235,91,9,132,44,75,82,174,133,124,249,177,57,180,254,254,34,33,226,17, - 131,191,252,202,20,255,114,50,247,29,189,255,15,128,231,155,38,199,85,64,23,168,17,88,72,192,179,173,138,109,35,15, - 28,91,179,124,251,21,29,3,177,40,53,203,192,51,92,162,4,160,147,40,34,23,205,12,68,67,77,215,90,19,72,192, - 22,68,187,251,17,102,10,2,129,209,12,156,107,228,41,53,242,201,132,50,192,148,84,189,18,86,58,65,203,250,181,100, - 23,134,9,170,33,45,109,45,12,14,12,16,90,25,18,91,214,147,216,178,155,186,87,229,212,240,9,132,165,17,210,199, - 10,67,162,50,141,210,49,20,1,142,237,81,244,202,72,25,65,38,45,180,97,161,2,143,186,23,232,245,231,167,117,183, - 143,253,180,239,122,17,205,18,176,92,4,239,100,87,140,93,215,246,64,45,96,97,161,198,244,179,217,151,228,120,125,12, - 248,37,136,102,53,155,162,112,251,18,220,189,252,145,247,31,248,217,143,255,69,36,99,27,232,192,105,144,202,8,164,52, - 27,0,163,245,75,65,231,82,96,121,249,38,255,22,135,234,203,65,72,55,181,157,11,17,208,23,92,246,226,18,144,186, - 8,52,151,120,194,94,84,142,244,55,1,20,90,55,211,60,94,10,112,23,238,117,33,250,186,81,73,160,25,151,45,27, - 166,152,20,33,161,239,226,87,203,148,86,86,168,87,138,232,192,66,26,62,210,118,49,173,22,16,113,150,23,151,57,249, - 216,51,122,226,95,190,236,196,142,159,92,217,164,84,238,58,88,176,97,76,193,48,48,225,55,126,230,4,20,43,141,96, - 126,173,208,24,250,66,100,208,119,169,1,133,230,171,83,130,61,16,223,95,144,206,91,1,132,76,195,32,84,1,127,250, - 233,251,57,55,49,254,186,223,63,74,163,92,194,245,192,205,192,127,111,188,230,8,24,213,112,168,115,108,101,231,225,199, - 143,180,245,127,232,46,105,251,80,55,163,104,21,160,241,209,70,216,136,105,1,12,45,65,105,148,33,168,98,17,105,111, - 67,180,182,17,202,176,113,34,53,131,25,181,8,9,180,198,212,141,2,21,210,84,60,248,229,71,57,176,251,74,174,120, - 207,207,224,44,157,34,168,186,152,210,196,136,8,140,88,43,178,109,51,136,56,95,248,235,191,101,252,228,56,41,195,66, - 227,16,183,163,120,142,34,12,11,152,102,140,152,145,198,11,138,88,145,58,166,78,17,170,8,102,44,193,252,217,97,125, - 101,177,110,22,34,166,209,234,82,54,149,88,240,208,57,27,252,142,71,231,248,210,135,30,192,2,126,63,231,242,239,231, - 107,23,83,47,126,190,201,249,204,195,230,8,220,145,131,187,202,63,251,35,251,127,228,47,254,75,52,35,3,180,47,26, - 109,254,154,192,162,155,224,160,105,132,41,188,28,92,132,248,230,141,46,148,254,166,224,195,11,57,237,66,235,151,106,42, - 223,230,122,92,226,134,191,232,194,215,47,94,77,41,133,144,47,166,105,232,151,152,117,77,83,238,2,184,73,9,234,66, - 90,136,213,236,117,214,76,111,65,131,87,167,88,204,81,45,21,209,117,69,160,52,194,210,216,73,3,100,7,229,130,199, - 248,179,99,156,252,250,87,66,241,248,179,229,182,133,133,236,229,48,18,131,51,26,198,53,204,186,48,29,194,130,130,82, - 28,234,62,4,223,0,222,71,163,204,201,247,181,167,180,120,243,116,171,184,0,66,198,155,22,124,66,254,247,23,190,240, - 134,128,207,75,198,9,184,31,184,6,248,91,96,3,228,115,112,188,21,142,156,249,210,161,141,35,55,95,213,185,185,179, - 27,25,104,124,67,99,74,15,41,20,74,54,226,130,100,8,82,24,248,158,137,209,210,65,180,123,35,202,202,160,49,27, - 166,25,141,124,178,6,51,18,130,82,72,21,131,64,176,105,176,131,99,135,238,199,176,174,165,181,117,39,86,107,2,31, - 23,63,212,232,64,50,127,122,156,39,238,125,152,67,247,63,74,90,138,70,175,119,51,66,32,162,104,211,196,240,52,182, - 229,163,85,21,233,196,176,68,12,175,150,35,18,143,82,168,197,25,152,92,168,119,67,165,40,85,116,200,146,185,0,61, - 159,132,210,147,160,254,40,239,145,202,123,204,240,98,35,116,23,248,8,240,107,16,93,130,205,86,3,124,238,142,255,230, - 175,238,187,245,255,253,141,120,4,80,126,163,220,169,104,166,168,92,64,16,45,154,197,183,4,8,169,95,22,11,252,82, - 142,231,229,4,179,184,84,59,121,41,17,211,244,84,125,11,210,79,136,70,116,243,203,194,8,26,227,254,82,79,219,75, - 52,160,230,139,2,113,193,94,123,17,188,46,128,83,216,224,134,132,14,9,61,135,122,169,68,113,101,137,192,119,209,161, - 143,25,49,136,91,3,120,161,102,230,204,48,211,15,254,189,95,123,228,201,146,30,158,91,94,239,185,11,29,48,35,96, - 84,193,49,13,231,12,200,22,161,166,193,217,6,193,68,147,236,183,105,212,20,50,249,254,115,1,222,116,113,64,129,217, - 200,97,122,121,176,177,16,224,171,111,50,165,95,23,17,134,65,94,133,124,234,11,95,96,250,117,6,31,69,35,144,46, - 70,163,44,232,102,26,233,25,208,232,125,53,3,236,2,47,7,227,10,14,245,143,230,183,63,245,215,247,93,179,230,247, - 126,206,138,6,117,234,129,129,86,54,134,80,4,194,71,107,129,106,146,158,166,105,16,73,165,27,190,36,175,142,33,156, - 198,30,242,66,68,224,161,107,101,66,191,134,87,201,33,162,109,196,122,183,177,125,251,126,122,51,41,102,39,158,161,112, - 206,35,32,206,163,79,78,48,63,179,132,196,163,180,180,140,80,62,137,164,69,72,140,74,13,100,110,89,235,90,41,52, - 106,126,32,67,165,137,72,115,70,154,150,159,106,161,175,175,149,195,195,139,236,223,179,155,244,153,17,239,186,154,55,18, - 192,233,152,169,83,25,211,204,107,130,19,75,80,218,14,252,51,141,158,84,191,220,228,198,42,192,30,16,183,65,44,11, - 27,5,220,177,40,197,187,210,127,240,127,31,184,241,215,255,157,109,170,58,218,23,40,67,130,244,154,113,80,13,243,228, - 98,154,213,5,66,247,21,192,231,82,205,67,136,70,106,197,203,65,225,165,154,211,139,92,207,43,154,109,151,182,108,121, - 217,53,190,245,53,95,38,82,54,92,250,151,106,79,82,54,146,97,195,128,192,173,83,40,229,169,22,11,232,48,68,106, - 136,153,49,140,68,27,185,21,143,227,79,62,194,210,253,159,173,89,79,189,176,216,86,114,38,58,27,241,85,35,192,68, - 8,115,10,22,53,100,79,64,165,27,194,103,129,187,155,196,127,132,239,188,27,170,6,2,33,47,86,87,12,223,42,0, - 4,141,196,148,80,188,20,105,76,169,185,98,107,137,123,15,183,163,20,223,115,251,157,239,158,219,146,180,6,1,43,95, - 254,34,91,38,198,217,247,58,220,83,2,75,128,182,164,204,133,58,122,94,233,164,103,10,243,46,41,195,119,5,42,20, - 13,247,6,18,168,131,154,6,95,75,81,87,112,44,173,244,99,181,47,62,211,250,229,142,142,109,215,255,236,221,118,79, - 74,53,74,154,41,129,173,3,66,35,68,94,112,211,74,129,242,11,184,5,141,33,163,16,4,44,229,114,84,10,121,234, - 217,101,130,252,50,125,109,49,90,50,146,32,221,65,208,222,142,21,73,144,236,105,103,125,122,27,102,118,25,137,226,176, - 59,195,202,228,36,137,100,138,54,43,202,178,142,113,106,122,130,182,153,69,255,250,124,57,59,224,7,11,113,33,22,163, - 176,108,8,173,2,33,187,39,165,222,248,181,232,194,154,229,32,176,215,72,35,156,93,92,52,110,155,95,206,103,224,89, - 15,238,71,136,168,237,135,69,109,136,99,29,154,202,101,77,239,212,85,52,114,194,135,128,110,144,46,180,120,176,85,195, - 205,5,203,184,115,224,79,254,223,3,7,127,241,151,237,80,23,9,67,11,41,45,132,40,53,245,198,104,195,236,121,169, - 114,211,124,77,55,184,147,151,113,65,151,186,217,47,104,27,175,8,16,23,52,155,75,226,122,94,66,66,211,136,5,122, - 185,105,166,47,189,230,183,57,92,47,130,84,211,92,212,77,206,220,144,141,64,2,167,84,196,205,47,83,169,148,1,133, - 105,128,29,143,17,10,155,217,185,44,195,79,62,64,238,159,254,177,212,121,98,106,122,72,233,51,86,131,72,62,235,195, - 152,104,244,124,47,246,129,51,6,126,28,244,87,163,49,18,157,221,120,90,83,93,156,67,124,71,13,59,53,90,52,146, - 159,109,173,25,170,23,41,211,104,42,208,253,45,64,232,45,19,9,29,40,193,238,161,42,2,248,234,115,237,160,244,235, - 2,66,129,109,33,142,156,228,87,199,199,95,183,78,1,178,169,234,206,24,50,86,86,225,86,83,176,91,6,186,37,36, - 244,116,179,157,184,209,212,142,44,8,60,40,10,88,70,32,3,152,239,134,115,185,191,190,39,253,249,167,158,239,237,184, - 251,230,72,98,221,58,145,140,42,210,26,173,48,133,111,134,184,161,135,225,88,218,43,141,170,108,181,196,204,236,10,142, - 17,149,55,92,153,22,29,122,137,184,15,201,168,141,45,91,9,172,110,66,105,160,52,120,118,10,203,52,48,34,73,252, - 232,0,166,91,162,119,211,54,156,51,179,36,13,155,66,96,48,63,124,42,188,241,252,228,242,21,138,145,36,28,11,225, - 180,175,245,148,7,203,74,163,109,84,255,166,144,3,63,175,195,131,103,142,157,221,184,54,157,202,220,95,25,201,108,243, - 194,115,30,60,99,192,161,182,254,164,173,114,94,205,174,135,185,205,126,35,15,242,62,224,134,102,120,194,143,131,84,208, - 41,225,50,1,111,91,138,152,215,117,253,241,239,238,184,252,23,127,222,86,170,130,129,68,75,5,194,71,72,187,225,48, - 208,47,166,79,188,4,129,180,108,242,42,250,197,236,214,75,114,192,47,132,254,93,40,167,193,203,226,12,47,18,196,23, - 254,205,203,210,45,46,209,166,46,37,182,95,9,232,46,60,128,66,94,124,14,217,4,64,133,68,233,16,83,138,6,177, - 236,186,84,107,53,202,165,50,65,181,78,52,128,84,50,130,138,155,20,29,201,169,211,211,76,220,123,79,24,60,240,245, - 98,215,88,118,118,87,168,207,72,120,193,131,163,65,35,177,55,107,65,117,26,252,253,52,226,203,114,141,67,141,13,169, - 12,195,137,164,80,82,234,149,74,25,163,176,194,203,113,59,108,174,85,129,192,23,18,87,154,36,125,135,117,229,69,226, - 245,18,31,240,29,30,66,211,10,220,250,86,210,128,190,149,56,190,100,215,80,35,224,254,245,0,33,37,4,237,142,195, - 214,231,15,115,150,215,183,102,74,40,132,136,43,221,166,67,125,205,68,103,199,135,229,64,111,111,91,189,86,243,157,122, - 232,170,0,63,187,18,132,245,64,73,8,19,80,76,42,157,141,66,77,66,84,64,123,23,120,45,167,231,157,249,211,255, - 32,103,26,113,159,165,184,166,12,212,155,165,233,49,192,182,33,101,64,107,31,68,134,219,82,97,251,13,63,101,173,73, - 116,136,208,55,49,77,129,157,105,67,68,18,248,178,145,48,170,149,9,97,163,57,158,145,178,32,30,101,112,219,110,110, - 215,81,148,107,114,239,95,126,42,120,207,240,228,249,205,240,148,3,79,213,225,152,11,211,157,141,234,124,110,69,32,52, - 156,117,53,195,118,160,94,216,11,91,188,98,105,207,59,90,205,206,104,160,190,161,224,249,0,22,91,93,41,242,131,105, - 181,101,155,17,164,29,197,194,209,101,206,185,33,155,27,156,151,72,65,139,223,72,173,120,239,25,219,184,105,211,159,252, - 222,154,235,62,246,75,82,133,85,208,18,100,179,96,24,97,83,49,49,26,69,249,95,209,181,45,154,193,123,92,244,40, - 137,87,40,179,113,177,20,199,43,104,63,23,189,102,23,180,156,151,113,5,175,164,53,105,253,114,127,241,37,247,19,23, - 32,175,17,115,45,180,194,192,71,5,62,181,178,131,91,171,18,184,46,6,146,184,105,163,91,82,20,203,14,211,35,243, - 156,121,246,176,94,254,198,131,161,56,123,182,178,109,185,54,218,14,39,128,19,202,146,39,156,64,141,36,52,75,75,80, - 63,11,250,61,52,42,116,206,211,136,171,26,107,237,224,241,84,11,37,41,177,131,64,187,166,201,5,191,182,201,133,72, - 250,6,248,164,128,127,0,126,58,244,185,166,48,203,110,223,229,164,87,165,30,54,180,37,131,75,139,137,252,0,0,208, - 235,13,66,17,219,230,75,95,249,50,255,146,91,126,93,137,241,58,240,81,173,217,233,135,241,10,172,217,248,177,119,110, - 221,253,159,126,51,173,242,53,60,215,197,247,2,242,75,57,10,75,89,150,167,23,244,194,233,179,106,244,204,176,151,31, - 159,13,168,212,84,111,161,236,183,57,129,104,7,107,109,131,52,116,149,38,231,193,148,110,180,127,154,145,141,212,163,245, - 6,236,209,144,142,128,25,89,41,135,75,167,199,213,134,43,182,26,90,134,152,137,52,210,238,110,198,13,129,161,84,163, - 22,22,70,115,163,74,2,12,182,237,223,71,199,166,237,156,56,57,74,223,216,112,105,3,60,235,192,191,120,112,164,31, - 86,218,193,171,209,136,95,42,104,248,61,40,222,13,213,101,152,78,195,17,17,114,40,150,87,41,87,235,113,11,198,239, - 7,255,151,198,10,180,188,127,29,173,255,237,26,62,254,63,78,210,255,236,34,9,160,3,100,26,90,3,216,39,225,142, - 115,173,137,155,7,254,231,31,174,189,233,71,62,140,14,43,47,70,36,95,0,11,117,129,39,17,77,160,145,223,12,16, - 77,240,81,77,19,234,149,57,152,198,86,18,151,16,216,47,183,192,190,213,78,123,49,243,253,165,87,187,96,71,189,36, - 53,227,194,103,84,216,12,60,84,16,134,4,245,26,94,181,138,235,120,184,174,143,235,120,148,138,21,38,39,102,57,113, - 242,44,249,145,145,124,109,108,216,88,51,189,16,235,207,215,228,53,224,90,48,229,55,0,253,89,97,136,83,102,204,156, - 147,213,32,31,13,149,235,210,200,20,27,107,2,201,87,104,116,202,8,34,49,38,146,25,153,9,3,21,85,10,91,11, - 30,235,236,71,6,138,71,42,69,190,4,124,148,70,221,165,5,224,243,13,109,148,27,74,139,244,53,189,180,21,190,243, - 180,140,183,100,50,234,5,16,18,2,238,57,244,218,128,144,101,154,204,205,207,243,240,217,179,175,122,47,164,239,68,110, - 0,246,104,68,8,102,44,217,47,147,244,161,50,85,132,104,20,62,239,93,115,177,129,138,0,109,184,97,57,182,148,155, - 167,84,46,48,55,57,195,212,145,243,250,240,225,243,186,120,110,152,182,220,124,108,112,41,223,209,227,40,47,2,217,16, - 106,33,152,6,164,198,132,104,31,110,105,137,22,93,47,92,87,171,230,90,243,229,20,200,132,52,162,200,148,133,107,229, - 81,50,142,150,233,70,65,117,45,64,70,16,82,52,220,189,97,163,240,86,119,119,130,175,252,253,255,98,125,205,91,84, - 112,220,133,227,253,176,176,17,152,4,18,23,52,187,38,121,158,131,224,48,20,63,0,101,11,22,203,161,50,214,128,251, - 36,184,127,0,252,12,240,92,214,225,127,254,151,163,252,233,159,159,228,243,192,26,176,108,232,146,112,64,195,237,165,76, - 250,166,171,254,254,207,7,118,220,245,126,130,160,210,228,182,196,69,23,117,131,179,109,186,219,149,122,17,124,94,142,28, - 77,32,144,151,124,238,229,222,39,248,102,207,214,69,254,134,11,37,68,248,166,207,139,75,180,35,165,94,212,172,94,130, - 87,47,139,148,110,120,220,26,122,170,239,57,84,74,121,220,74,25,252,128,149,149,60,181,186,71,173,238,49,49,51,207, - 226,66,14,17,181,105,235,235,19,189,169,184,144,221,163,82,31,63,175,231,22,171,34,13,177,8,12,152,224,25,161,110, - 11,74,94,86,66,182,0,139,253,144,107,129,66,20,106,43,224,183,130,142,0,134,231,97,132,74,186,161,86,82,8,162, - 129,230,72,189,194,223,185,245,139,49,87,203,52,34,244,79,241,98,70,154,126,153,17,201,15,50,0,93,0,161,157,107, - 27,154,208,107,1,66,134,97,240,216,225,231,8,85,248,134,124,191,11,147,106,130,206,215,124,237,19,34,195,26,72,147, - 80,55,203,104,200,11,252,132,194,32,66,95,215,122,6,187,12,118,108,184,18,110,54,133,86,174,88,204,206,49,50,113, - 46,58,118,236,68,244,208,163,79,182,183,221,247,116,251,246,149,122,175,9,98,12,54,157,123,207,245,131,215,255,226,7, - 101,101,201,229,228,253,79,166,75,237,129,29,218,26,17,79,224,218,81,180,138,96,5,22,58,149,68,199,163,4,42,96, - 121,110,129,165,133,121,226,153,86,58,186,218,105,207,100,240,171,121,206,61,244,164,190,22,202,33,20,53,184,6,141,34, - 97,247,2,31,2,62,69,163,72,124,51,187,9,23,216,10,234,75,80,253,29,224,12,240,80,243,111,21,224,43,143,206, - 243,196,163,243,252,52,208,11,177,42,12,41,184,90,195,45,243,107,123,174,61,248,169,143,15,108,184,246,122,17,6,43, - 32,12,228,203,0,230,37,32,112,233,198,208,47,117,155,95,52,161,46,252,214,23,198,95,95,108,22,248,45,61,99,188, - 88,84,76,124,139,200,233,134,199,170,1,112,250,146,32,67,33,68,3,24,47,137,235,185,16,6,129,144,132,161,71,62, - 151,35,240,235,24,82,98,196,98,116,13,38,72,181,180,17,73,164,185,222,176,65,92,48,140,68,139,2,74,78,145,133, - 233,49,157,31,57,23,45,28,25,94,59,251,220,217,94,255,220,240,101,198,212,120,49,94,243,243,169,70,137,141,89,5, - 147,9,56,239,194,68,2,22,175,129,146,15,117,242,75,238,79,212,202,193,94,26,93,68,222,171,53,89,183,254,138,222, - 217,239,62,236,240,7,8,128,46,130,208,80,21,165,5,95,123,174,237,85,3,33,211,182,25,93,92,228,216,185,179,111, - 216,119,107,244,73,64,27,160,23,166,39,148,210,10,67,217,205,8,87,209,108,164,217,104,54,168,181,143,212,38,194,139, - 162,133,73,64,136,22,43,72,233,209,211,221,70,79,247,219,184,238,138,183,227,124,244,39,204,111,124,250,203,107,206,252, - 218,239,180,110,207,86,253,197,107,14,36,223,251,27,255,70,182,36,44,18,125,49,214,118,246,198,23,142,62,128,29,109, - 69,71,99,120,120,216,118,20,75,219,84,133,205,137,211,195,148,11,62,137,136,69,75,58,73,173,94,225,216,209,89,186, - 210,105,34,169,52,231,102,43,92,15,105,19,54,25,176,105,14,130,105,40,181,53,171,233,253,241,255,199,222,123,199,217, - 117,149,247,222,223,181,214,46,167,77,239,51,234,93,150,229,38,119,227,130,11,54,166,183,64,2,132,155,158,155,155,114, - 19,82,222,220,36,55,164,151,123,19,146,144,16,72,66,239,197,16,192,96,3,198,5,92,112,151,44,201,234,189,204,140, - 166,207,169,187,172,181,222,63,214,62,103,70,178,76,53,224,228,230,240,25,70,26,143,102,206,217,251,236,103,63,207,239, - 249,21,224,143,178,77,214,141,89,255,166,178,59,234,126,154,70,17,112,67,54,134,126,20,7,94,212,32,156,115,185,92, - 183,104,184,249,208,170,193,243,174,250,196,191,244,173,190,248,50,108,163,138,240,36,66,52,64,228,78,103,17,47,46,26, - 103,217,64,157,214,117,180,68,157,139,185,62,207,212,129,137,197,27,119,78,103,55,115,150,85,186,109,117,98,205,85,187, - 61,189,131,82,226,244,231,213,114,57,51,72,207,167,167,175,223,5,22,26,139,242,218,16,129,223,250,54,99,156,10,222, - 10,39,129,80,214,208,233,123,116,174,217,36,88,123,129,224,86,29,164,54,9,166,166,231,75,227,71,78,244,207,239,219, - 97,15,222,247,96,90,127,124,71,173,180,125,247,100,123,61,62,90,114,145,205,135,44,28,247,225,96,193,218,221,126,163, - 54,125,14,152,19,60,83,103,247,92,63,254,195,251,1,53,98,201,121,43,29,31,211,21,33,103,96,255,61,111,189,124, - 159,32,142,89,121,223,189,252,182,214,92,147,157,4,153,93,32,63,140,77,152,118,107,102,155,56,70,66,67,237,60,80, - 179,141,90,135,80,113,166,55,148,160,20,88,135,232,42,171,176,82,96,165,118,30,54,217,165,97,17,104,93,67,232,58, - 200,54,124,227,113,205,45,151,240,15,95,190,176,112,223,3,59,226,107,126,243,141,254,72,103,137,100,190,1,185,10,51, - 149,105,82,145,71,149,58,192,179,104,35,25,159,52,140,87,38,136,139,9,253,171,206,103,243,134,165,132,62,64,140,65, - 161,141,71,101,106,146,131,251,15,226,13,15,138,79,31,216,191,244,245,85,115,99,55,248,17,220,187,28,182,141,192,88, - 12,177,202,58,155,187,178,99,122,3,11,102,242,100,119,220,45,56,119,248,128,22,7,74,53,96,73,0,55,106,120,217, - 193,229,131,231,110,249,216,187,187,214,95,124,9,54,106,32,68,30,43,34,231,111,36,220,138,221,102,184,138,92,188,137, - 18,153,233,232,25,51,130,104,205,79,246,244,177,107,113,135,100,237,130,153,252,162,175,137,197,223,243,108,139,233,140,213, - 236,192,158,133,21,250,130,127,116,214,79,88,155,165,124,45,220,130,132,144,168,112,33,167,212,0,198,198,11,99,165,176, - 88,171,179,151,102,73,12,72,235,35,72,49,105,5,147,54,208,73,66,187,47,9,150,119,18,45,191,90,172,185,230,26, - 191,62,55,221,49,182,107,95,199,232,35,79,174,60,252,213,175,111,233,220,115,96,186,189,90,31,247,45,143,214,225,54, - 11,143,126,18,170,159,226,59,231,253,252,63,91,128,206,94,132,196,247,84,132,82,223,167,119,98,130,45,247,222,195,174, - 195,135,152,1,150,224,200,127,202,1,160,4,217,65,251,65,110,196,4,206,136,126,171,243,216,58,37,199,71,203,211,83, - 167,134,134,151,12,187,145,208,58,252,71,202,44,87,70,100,74,105,107,17,86,58,155,11,235,185,39,41,37,86,73,18, - 98,60,17,208,102,122,88,114,254,11,213,93,245,32,247,115,231,93,32,210,106,131,88,37,132,94,142,106,165,138,232,132, - 178,178,28,62,28,19,37,154,160,179,159,254,245,231,50,176,124,21,158,95,192,164,41,90,71,8,83,67,11,69,34,243, - 116,116,117,112,225,149,23,242,190,15,255,35,159,255,244,237,197,79,191,231,195,23,108,126,244,233,158,75,97,169,117,24, - 196,3,157,176,255,167,160,246,199,217,177,123,20,199,126,187,57,27,201,200,186,162,235,129,159,202,10,212,195,160,82,232, - 15,224,242,20,110,28,95,59,180,241,198,79,125,168,115,249,249,91,72,245,60,248,46,10,71,154,28,66,164,153,227,181, - 124,198,150,203,97,48,98,225,224,46,234,86,22,182,87,11,38,241,52,71,163,179,21,163,51,199,59,151,205,243,237,55, - 170,198,208,36,97,187,95,223,36,19,102,4,199,69,40,182,3,184,155,223,172,48,24,176,38,243,139,150,217,18,64,160, - 172,113,186,54,112,185,243,88,210,164,65,92,171,81,47,59,255,104,173,19,4,41,90,167,40,83,68,161,232,44,104,250, - 46,185,128,117,87,94,46,143,191,233,21,237,247,127,230,193,246,79,189,243,125,43,94,54,118,212,95,6,79,106,216,94, - 128,234,237,223,170,176,62,71,215,192,127,26,71,196,102,17,146,194,102,152,208,119,94,132,172,16,164,185,28,35,59,119, - 114,197,237,159,39,111,12,59,23,241,28,118,186,98,192,239,3,219,112,36,65,47,187,59,152,31,80,1,74,220,239,174, - 181,195,100,114,252,196,220,177,29,187,24,94,178,2,97,107,24,145,58,118,136,113,184,135,64,96,108,130,69,35,133,135, - 161,233,13,227,184,47,210,10,148,104,160,100,66,234,41,214,174,91,71,185,81,19,161,215,78,213,215,20,138,37,198,199, - 171,60,250,200,54,150,173,232,98,235,145,58,221,93,195,44,239,31,164,179,167,15,47,223,129,53,18,25,71,46,132,79, - 133,24,225,82,30,148,17,164,24,76,221,163,88,232,226,205,191,240,38,110,120,213,203,212,39,223,253,158,21,159,251,135, - 247,118,95,51,57,63,220,3,125,83,112,199,107,97,215,32,84,150,227,12,229,107,14,219,225,15,178,215,189,59,27,207, - 60,32,132,92,5,134,115,112,89,12,47,217,183,105,213,197,183,124,234,125,189,203,55,158,143,73,107,40,17,100,57,242, - 58,235,48,228,66,202,232,226,35,185,128,49,187,85,251,34,1,167,104,229,179,55,11,9,88,163,51,32,219,91,52,107, - 89,7,190,159,229,60,181,198,182,197,74,245,69,242,136,5,89,70,246,217,52,123,41,133,200,182,139,194,58,206,143,22, - 230,180,78,205,117,112,205,140,52,50,251,16,72,77,154,157,119,103,169,130,177,52,42,53,26,51,83,212,27,53,210,56, - 205,70,190,172,177,242,2,194,66,1,63,240,137,26,121,118,238,59,202,190,109,247,219,209,199,183,210,216,179,71,148,199, - 102,204,202,122,163,220,41,196,169,196,218,186,2,17,130,250,63,60,211,236,77,103,55,229,114,230,201,182,234,12,44,168, - 105,88,47,255,95,43,64,205,34,116,238,138,197,192,244,183,47,66,34,8,16,81,196,11,254,253,179,12,236,219,235,132, - 125,103,153,249,39,178,207,255,148,97,22,167,50,238,196,0,11,190,116,207,21,6,158,100,39,249,173,160,173,160,33,181, - 173,31,221,185,219,94,118,203,75,132,53,166,101,116,229,248,42,10,147,70,40,21,128,244,1,141,182,137,243,162,17,46, - 201,3,44,82,231,193,8,140,156,101,112,164,141,75,131,13,164,73,157,242,92,204,67,15,60,206,252,220,36,151,95,122, - 62,107,215,174,160,88,204,161,60,176,182,65,121,126,10,85,169,208,72,52,86,10,148,231,161,2,31,63,204,17,230,66, - 2,223,119,215,140,116,214,15,73,18,51,208,211,193,255,252,131,63,226,241,23,223,218,254,133,223,249,211,75,214,221,253, - 245,226,114,80,83,160,207,133,167,87,66,35,204,198,175,147,184,248,223,197,111,240,216,53,154,171,10,130,27,107,150,155, - 14,111,94,125,233,77,183,189,191,127,197,218,205,232,180,214,26,65,164,179,248,194,74,147,169,192,207,94,206,133,56,109, - 249,125,246,49,11,50,31,30,177,136,202,99,159,85,22,33,207,32,26,182,186,38,33,206,218,21,181,48,166,69,187,34, - 41,213,105,207,72,234,133,231,99,23,255,47,43,68,210,40,119,3,144,174,240,234,184,65,163,86,163,92,158,163,62,63, - 143,72,98,60,95,225,135,62,202,247,177,210,39,137,148,173,156,154,177,213,99,227,118,238,233,189,118,247,3,247,137,104, - 199,94,81,152,170,138,245,64,55,152,130,107,56,119,199,176,59,21,2,13,107,67,107,163,203,120,166,101,154,0,82,208, - 101,168,21,161,252,135,144,196,160,79,66,50,13,137,2,221,6,38,255,29,222,156,255,211,121,66,127,55,69,200,203,229, - 56,176,115,39,87,126,227,235,44,159,157,33,250,22,109,101,115,58,239,203,62,6,112,182,24,17,240,24,112,14,206,169, - 59,120,142,230,102,237,126,118,26,90,102,187,96,122,108,235,211,141,196,146,23,214,115,70,85,66,225,171,144,79,127,228, - 195,28,63,122,132,13,235,55,177,124,217,10,186,250,122,232,25,232,195,207,133,88,12,198,166,104,147,58,189,144,1,191, - 212,206,192,224,48,189,253,3,84,171,49,255,244,143,239,226,154,23,188,136,91,94,116,51,158,151,144,196,17,82,64,210, - 136,153,155,47,115,226,228,65,198,198,78,33,60,203,224,72,63,249,124,193,21,0,1,158,242,8,124,159,182,182,54,134, - 134,151,81,104,239,67,36,33,210,88,140,173,177,229,194,11,89,253,185,127,13,222,243,91,127,112,65,250,174,79,38,171, - 225,88,12,199,191,2,141,52,27,189,62,176,8,232,92,1,188,26,100,10,3,70,112,117,108,121,229,244,85,151,92,116, - 235,135,255,185,99,100,197,26,76,82,119,29,139,177,45,60,70,32,78,207,16,62,91,9,18,11,89,94,205,172,180,103, - 22,22,113,186,176,243,180,53,252,25,197,230,204,175,53,173,53,178,175,25,173,91,106,246,211,192,232,214,182,75,62,19, - 44,183,32,116,54,216,72,225,230,193,38,25,81,10,231,243,147,26,226,90,157,70,173,74,220,168,18,69,53,226,70,21, - 33,44,129,239,33,60,159,52,150,156,56,94,225,232,193,99,181,249,221,187,27,237,247,63,24,200,125,135,130,100,182,66, - 1,228,250,236,61,42,28,198,72,12,102,206,245,92,5,13,107,141,181,253,205,198,167,154,221,84,253,236,254,146,45,69, - 80,78,174,49,13,156,178,80,141,33,50,48,61,15,83,109,48,215,11,115,33,148,143,66,61,5,109,255,95,42,64,139, - 139,144,177,130,59,31,239,122,198,2,68,10,65,152,207,115,106,231,14,158,254,226,23,184,241,12,117,242,183,43,12,205, - 105,189,169,217,122,12,120,41,46,155,106,34,239,49,178,166,235,116,123,134,239,226,97,149,32,56,50,79,105,54,98,210, - 221,85,102,67,152,50,7,142,214,211,68,231,67,233,33,50,165,110,84,171,114,226,232,81,174,191,250,42,2,9,141,202, - 56,251,198,14,178,107,187,160,167,127,128,222,193,97,186,122,251,200,23,218,177,36,36,38,226,158,59,238,99,207,83,123, - 152,153,153,97,116,116,140,185,185,42,71,70,15,49,246,249,67,228,11,1,70,67,181,82,229,232,209,227,212,235,17,155, - 207,219,68,119,119,55,185,208,163,16,180,57,230,109,62,143,239,7,24,109,41,22,74,72,161,152,157,158,34,74,43,180, - 151,150,99,180,101,98,242,40,137,31,19,180,181,211,104,31,100,20,186,215,67,91,3,188,82,246,198,155,4,30,204,94, - 247,18,224,93,32,135,160,119,26,46,73,45,55,206,94,188,121,243,245,31,127,111,71,223,146,37,152,196,209,219,164,148, - 216,166,230,234,180,49,122,225,236,61,147,193,252,29,30,123,219,12,116,124,38,194,97,207,98,217,193,153,22,28,205,247, - 208,34,43,141,38,222,228,222,51,178,21,143,241,12,177,170,112,124,42,137,0,149,73,59,146,212,97,110,81,76,163,86, - 165,209,40,147,36,26,147,106,172,181,40,165,176,169,100,102,102,134,19,199,71,57,118,98,130,157,59,247,114,236,248,41, - 100,117,126,230,188,82,33,90,221,211,57,220,86,216,32,68,222,103,170,187,67,38,94,81,200,70,106,195,80,217,106,181, - 74,106,36,22,221,102,73,54,8,21,172,71,41,26,141,72,128,37,73,18,102,102,102,169,149,231,173,72,82,163,163,216, - 138,114,205,20,162,52,237,168,39,245,30,99,230,219,161,81,66,197,37,204,84,17,59,46,96,34,133,19,243,78,228,186, - 215,131,19,29,110,169,249,255,78,1,106,22,161,11,86,85,104,196,146,59,31,239,166,16,58,62,143,167,20,115,105,202, - 216,191,127,134,23,239,221,203,23,207,4,27,191,71,204,166,11,167,163,249,236,242,118,126,227,95,110,194,143,191,55,254, - 144,95,244,121,234,111,31,231,182,143,238,226,34,80,121,8,44,228,166,106,243,42,142,171,228,242,33,214,24,148,242,136, - 116,76,127,95,39,157,165,28,82,198,116,248,37,122,123,139,68,81,66,35,174,113,108,207,78,142,239,243,105,111,239,101, - 104,213,8,119,221,253,21,118,60,250,4,235,86,173,97,205,218,53,116,118,94,68,71,103,27,158,132,66,49,159,69,5, - 123,104,35,8,253,128,98,161,8,194,210,136,106,84,231,202,196,181,6,243,229,121,230,102,102,80,126,192,232,248,20,113, - 108,41,182,117,209,223,219,195,240,210,110,10,109,167,8,75,121,196,84,157,180,10,239,254,147,191,182,249,247,125,226,212, - 229,240,120,4,251,5,84,101,118,23,254,100,134,3,45,1,254,5,100,27,244,77,194,229,192,203,107,27,214,92,114,213, - 135,255,173,187,119,201,8,54,169,158,54,224,74,41,91,163,137,88,148,225,105,91,91,36,123,58,59,78,52,61,155,23, - 157,51,217,244,87,126,54,85,250,162,31,112,230,205,228,204,181,254,217,100,23,207,144,99,100,120,212,153,52,128,214,118, - 13,164,48,196,113,76,60,87,67,232,148,180,214,32,169,55,144,218,162,109,138,13,5,129,167,176,74,50,51,61,203,238, - 221,123,8,253,60,70,67,24,22,216,180,105,13,23,110,217,72,177,148,35,95,12,71,132,204,140,254,241,92,51,37,53, - 18,31,161,82,129,172,57,199,196,36,15,86,97,68,226,104,29,89,113,183,214,217,177,196,73,76,181,82,197,88,75,221, - 24,170,149,6,149,153,121,102,78,78,48,119,114,106,228,196,169,25,166,143,157,196,142,159,74,194,153,217,122,119,165,86, - 95,153,234,153,165,82,236,193,232,47,47,133,59,103,224,232,39,224,25,254,161,175,195,5,184,252,72,30,70,255,224,227, - 149,235,117,56,103,73,153,3,39,67,142,76,228,201,5,146,84,107,222,251,185,207,114,233,225,195,180,63,199,219,44,211, - 4,144,51,159,25,15,136,98,227,188,130,191,83,80,206,64,116,235,74,62,253,209,93,92,14,129,130,254,41,24,106,44, - 27,46,204,140,30,163,99,213,114,148,114,152,64,26,55,144,104,164,72,157,21,110,172,113,114,83,75,41,148,116,149,186, - 136,19,131,177,53,190,246,185,207,177,103,207,62,126,241,45,111,194,164,53,151,248,160,4,82,248,120,34,64,42,167,239, - 202,229,10,72,225,183,214,199,113,212,160,32,61,74,61,93,84,243,21,74,29,1,8,129,151,11,185,236,186,23,160,241, - 57,126,226,20,251,159,62,200,216,214,61,120,187,83,134,7,214,177,97,213,18,238,254,250,109,76,124,232,19,245,159,129, - 253,117,248,186,133,237,13,168,188,22,248,52,240,53,96,56,43,62,157,158,232,139,12,87,10,99,95,145,174,91,121,245, - 21,159,124,207,72,223,250,245,50,142,43,120,50,231,138,135,52,45,213,248,66,195,35,154,104,24,167,105,181,206,204,8, - 196,182,188,128,108,139,107,179,240,181,211,199,46,187,160,56,111,226,58,103,99,80,115,58,217,145,179,224,66,103,122,8, - 61,243,214,229,176,186,184,94,35,154,153,164,94,111,96,180,37,244,3,16,6,63,244,73,227,6,105,146,50,51,17,51, - 63,55,75,165,90,38,142,35,250,250,122,233,239,239,115,189,149,108,254,44,139,177,22,157,38,88,19,101,214,35,210,165, - 117,24,133,145,21,164,148,24,43,49,198,98,237,188,3,186,149,36,206,250,17,37,133,99,109,43,133,47,125,58,218,58, - 0,232,22,2,213,43,241,215,120,8,225,48,56,163,45,245,70,131,185,114,217,223,123,120,212,63,188,255,88,251,103,31, - 120,108,32,124,242,233,85,255,173,82,169,97,205,182,1,56,177,226,89,70,49,239,71,149,74,111,127,8,198,62,218,66, - 62,208,108,89,51,207,209,169,54,82,157,240,222,207,222,198,232,145,35,167,241,79,158,75,78,195,216,193,57,102,254,247, - 253,116,221,58,194,145,216,176,118,67,59,81,79,248,109,38,225,69,88,83,209,227,158,247,238,227,45,110,19,212,158,194, - 114,17,120,189,47,122,221,203,212,196,137,35,116,119,22,104,235,233,70,8,73,16,248,228,11,69,180,214,40,229,147,106, - 23,195,172,178,14,193,96,16,158,160,179,189,13,165,36,183,222,114,11,161,95,64,11,133,205,6,122,223,243,201,249,65, - 43,149,52,8,3,80,1,214,24,76,220,192,15,2,226,70,29,109,36,90,120,24,98,44,134,90,101,150,198,241,132,161, - 165,171,89,181,118,41,171,86,172,70,235,6,163,19,163,28,218,55,198,87,239,126,136,7,31,222,77,106,50,127,245,108, - 115,155,89,136,240,23,25,173,225,223,64,118,74,87,124,48,246,21,102,227,218,107,206,255,204,7,151,245,110,216,168,76, - 92,193,19,57,119,36,68,218,210,120,157,185,144,90,40,62,226,204,170,115,218,96,109,23,173,226,77,179,81,90,228,241, - 35,190,53,144,116,218,182,235,204,247,114,147,213,124,214,81,254,76,230,245,25,203,108,173,53,243,115,179,152,114,25,139, - 98,126,174,78,185,50,1,194,80,173,206,81,174,76,18,71,17,129,234,164,171,171,157,129,254,126,218,218,138,72,153,117, - 70,38,33,77,45,36,29,8,153,96,101,156,193,82,11,59,41,119,191,55,40,105,48,40,172,245,17,158,1,34,103,134, - 111,3,60,147,45,44,172,192,147,18,155,166,136,108,27,39,132,192,170,4,29,107,76,170,144,66,160,13,72,233,33,164, - 164,191,167,151,21,195,195,228,110,189,149,187,174,189,150,143,253,228,47,10,83,54,162,238,249,202,19,66,182,37,241,217, - 237,56,188,192,249,57,252,103,125,24,235,66,248,82,173,249,192,23,110,99,255,145,35,63,80,254,78,45,214,200,175,28, - 101,223,87,142,242,49,224,87,87,149,88,213,29,224,125,135,5,8,37,184,254,64,5,11,109,17,108,0,46,232,186,233, - 170,193,145,139,207,147,113,35,98,114,124,140,84,8,186,186,7,200,181,117,208,214,222,197,216,232,56,35,75,70,72,227, - 6,81,20,145,234,148,142,174,110,242,97,59,237,165,46,230,171,53,62,247,229,111,208,221,185,151,180,222,160,94,143,64, - 74,130,66,30,229,41,194,48,164,45,151,167,179,179,157,68,167,228,139,5,218,74,69,138,249,60,197,66,145,238,174,46, - 60,9,90,71,72,153,18,228,44,197,98,14,52,76,143,141,211,63,146,107,165,57,12,14,141,176,100,201,74,116,3,54, - 156,191,137,47,118,22,115,15,190,243,67,171,207,171,214,174,242,224,104,8,179,95,132,185,50,240,49,129,236,245,101,255, - 116,106,175,16,198,190,162,177,105,205,117,151,125,252,253,75,187,55,92,40,83,51,139,240,3,164,86,32,26,88,97,90, - 68,189,103,52,55,77,173,150,149,173,228,136,133,235,126,209,72,181,88,166,145,117,54,38,43,26,226,140,17,204,158,225, - 233,179,184,8,157,205,60,236,89,73,140,103,233,150,78,251,183,214,221,48,186,251,250,72,219,114,164,137,100,223,177,157, - 124,226,195,159,68,199,13,222,252,230,215,177,106,233,74,2,31,60,63,135,16,160,83,141,78,235,88,233,54,124,86,11, - 39,94,85,83,46,128,205,10,44,10,139,2,180,43,58,210,2,1,22,15,99,99,132,108,128,245,17,228,240,164,205,190, - 22,46,104,213,178,96,75,99,12,82,72,180,53,72,17,34,164,235,55,53,218,33,211,153,191,184,240,45,211,26,190,242, - 129,79,113,232,95,62,208,120,203,169,169,173,5,120,172,34,228,169,113,163,245,209,179,148,246,245,128,55,113,4,122,151, - 130,209,63,26,183,193,31,104,151,5,4,158,59,9,239,255,236,103,56,114,226,200,15,252,119,202,69,7,58,0,142,29, - 172,112,240,96,139,215,243,29,109,191,2,240,115,176,92,193,181,243,249,240,226,117,63,251,230,110,161,192,39,193,183,30, - 181,83,167,40,4,57,114,237,29,108,222,178,133,251,238,189,135,250,241,83,248,74,224,133,62,29,221,61,116,13,47,161, - 212,214,131,151,239,225,227,255,248,143,124,241,142,123,92,23,147,36,8,33,9,115,1,133,66,1,129,32,159,203,19,248, - 10,172,161,82,174,210,213,221,73,62,95,160,171,171,135,174,174,46,70,70,70,104,47,21,9,67,143,36,137,72,211,136, - 92,33,199,208,224,32,29,157,93,172,169,230,88,190,102,53,42,231,131,174,97,162,8,43,37,235,54,46,97,253,95,255, - 145,188,239,134,235,134,143,252,247,223,186,98,213,161,227,187,18,216,185,18,230,254,28,100,81,138,254,138,229,10,105,236, - 203,103,214,175,188,238,202,207,125,100,121,247,234,117,152,120,14,165,50,110,143,48,217,152,37,159,209,172,159,222,9,101, - 209,128,173,137,71,156,177,164,18,103,124,77,46,98,173,216,22,31,200,46,96,194,173,49,236,76,133,215,217,138,82,211, - 235,199,88,123,58,23,168,201,206,166,153,122,154,21,176,22,43,209,25,138,161,36,126,177,11,207,192,11,110,186,150,203, - 175,125,1,79,111,219,202,201,163,71,153,173,86,88,190,116,8,33,12,70,155,140,116,154,249,159,73,137,149,25,243,219, - 164,46,138,71,8,82,157,96,173,197,243,36,58,115,4,240,60,39,136,85,66,161,173,197,26,131,20,22,41,36,18,31, - 35,220,88,230,150,112,205,110,83,162,17,88,233,82,86,180,141,64,198,40,233,226,180,149,108,35,159,239,230,169,253,199, - 248,216,187,255,129,238,47,126,117,242,102,109,158,204,195,93,26,238,233,78,162,99,69,72,54,61,219,212,240,197,127,50, - 108,185,85,112,254,13,130,164,241,159,167,8,89,32,231,43,106,145,225,215,254,246,171,28,57,49,246,67,127,14,205,4, - 207,37,192,123,61,201,197,61,57,60,251,173,187,181,82,78,209,85,142,131,198,108,180,188,2,91,218,126,230,245,171,122, - 47,63,223,75,102,38,65,130,18,18,171,83,230,167,38,9,11,5,122,6,7,121,205,143,191,17,226,136,204,113,222,141, - 24,70,32,85,129,147,71,143,241,158,127,125,31,249,92,1,109,44,54,116,54,238,97,24,80,200,135,180,149,74,228,195, - 28,190,239,49,95,158,99,249,242,141,116,119,119,211,104,68,88,11,245,122,141,253,251,247,209,211,211,203,208,208,32,109, - 109,109,116,116,245,99,45,76,76,213,153,156,170,113,240,192,9,252,251,190,201,170,117,43,216,180,105,21,253,131,195,96, - 12,169,174,33,76,204,181,55,191,146,167,254,199,193,254,147,191,249,123,75,3,232,172,64,110,8,122,99,195,21,70,155, - 151,77,175,92,118,205,165,183,125,100,217,192,234,13,232,164,150,225,25,11,70,239,54,51,18,179,226,153,91,46,123,26, - 5,206,62,203,46,115,113,78,215,194,184,214,210,128,101,69,200,62,99,228,90,92,184,236,194,38,236,89,116,95,205,63, - 159,46,209,176,103,248,155,137,69,100,200,38,118,212,44,122,210,209,38,210,24,233,9,206,187,228,82,54,108,58,135,71, - 30,124,136,173,59,246,48,52,208,198,178,101,75,65,27,140,78,81,153,190,204,100,111,30,65,224,2,8,108,83,162,225, - 88,214,70,91,135,235,89,147,21,70,137,18,62,40,87,40,181,209,174,32,10,139,20,214,141,240,38,205,206,65,22,92, - 153,141,245,158,113,131,180,47,115,228,138,93,236,59,122,138,79,125,226,227,76,124,246,206,198,117,19,83,135,54,195,55, - 35,196,189,6,30,182,216,99,159,132,250,215,112,132,211,51,81,223,59,1,207,11,225,241,47,89,172,129,11,110,250,207, - 81,132,154,197,39,74,52,175,253,253,251,185,235,209,177,31,217,115,17,56,191,149,39,82,195,223,157,170,125,219,39,190, - 186,232,241,33,95,73,1,5,81,104,235,92,245,154,151,21,66,155,160,149,79,67,164,88,235,238,70,42,244,93,116,142, - 54,8,153,137,112,173,6,227,236,163,132,244,104,212,26,252,217,31,255,9,211,83,243,25,224,232,86,183,74,42,10,197, - 2,237,165,18,197,66,129,48,8,176,6,242,185,18,82,122,36,137,97,217,178,229,244,244,244,162,148,34,77,19,164,10, - 8,130,144,66,62,143,151,145,15,131,48,68,74,137,167,20,137,182,236,223,115,152,93,79,109,103,205,154,117,92,117,237, - 53,20,59,219,73,227,42,96,56,122,236,168,144,224,75,40,25,88,171,225,82,99,237,205,135,206,93,125,237,77,183,125, - 164,127,233,186,115,176,105,109,209,78,235,116,132,199,32,90,23,108,243,179,64,60,163,112,60,91,186,197,89,87,235,54, - 235,128,132,57,115,239,213,234,100,68,115,164,177,218,145,15,197,162,228,138,179,128,211,207,64,144,172,104,241,121,206,70, - 108,180,103,254,173,89,192,44,152,180,129,31,6,188,224,198,27,168,204,76,179,111,223,14,14,31,31,37,80,138,37,67, - 131,46,5,181,105,105,111,116,134,217,184,191,43,33,49,194,18,71,177,11,160,12,36,198,24,148,82,173,231,178,160,204, - 23,72,97,220,22,12,135,43,45,144,61,101,11,196,51,50,165,224,231,105,203,117,113,104,106,142,79,127,232,147,236,252, - 228,109,233,198,99,167,38,95,1,219,242,240,64,3,30,76,176,59,45,76,142,65,250,55,217,43,219,250,108,29,144,16, - 224,133,240,196,157,238,80,252,71,47,66,139,139,207,171,255,215,55,184,251,241,241,231,197,115,138,128,53,22,46,195,185, - 200,61,235,8,86,77,169,147,226,131,208,190,146,182,171,72,152,43,161,181,34,17,18,41,36,133,82,27,197,174,46,12, - 2,161,156,233,150,149,2,76,118,113,74,15,33,139,252,223,191,250,99,190,246,213,123,41,22,219,169,79,79,35,84,118, - 199,204,238,132,82,74,10,133,2,82,72,76,106,89,187,102,57,3,3,3,228,11,121,164,20,164,105,74,20,53,0,40, - 22,115,88,43,72,82,237,18,208,133,179,44,73,18,67,181,218,32,200,21,40,22,187,8,59,187,56,114,248,4,135,143, - 126,140,235,111,186,142,53,27,86,115,228,232,97,182,125,233,75,141,107,161,145,192,144,148,226,74,140,189,113,199,138,161, - 11,174,251,224,59,123,151,174,91,139,73,235,136,51,182,86,139,35,142,229,194,226,170,213,251,156,214,113,156,134,241,156, - 93,169,116,186,233,87,51,53,116,17,6,100,79,239,169,16,34,43,68,153,145,153,213,167,249,61,139,51,87,237,167,133, - 197,219,103,84,25,113,166,6,77,136,211,10,174,177,22,217,180,4,201,248,78,214,106,48,150,82,103,59,23,94,122,21, - 229,185,89,158,124,236,17,158,124,106,39,171,151,47,167,187,179,205,69,47,25,247,111,77,86,52,173,176,167,61,133,36, - 77,241,148,122,70,113,182,214,180,70,86,105,2,172,0,109,53,40,137,49,41,82,8,164,20,228,253,128,92,208,203,225, - 137,25,62,246,217,207,240,244,71,63,155,172,218,119,96,236,23,96,127,39,60,213,128,135,53,60,81,128,19,171,161,250, - 105,119,180,190,163,197,13,255,89,138,208,243,177,248,156,129,237,240,30,224,167,127,250,28,254,249,68,133,79,127,249,232, - 179,118,77,18,40,207,207,113,108,114,138,145,13,27,8,81,228,186,186,240,61,31,161,20,86,184,145,196,98,91,156,22, - 132,194,104,139,231,151,184,255,158,123,249,220,103,110,167,175,119,144,169,233,153,86,212,142,177,6,41,37,249,124,158,70, - 212,160,92,46,211,213,217,201,242,85,43,25,26,30,65,41,133,214,6,79,73,180,214,88,4,129,31,16,167,41,129,167, - 72,180,211,34,133,65,224,198,34,9,243,149,57,162,169,41,124,21,16,4,138,193,193,62,180,213,124,254,115,183,115,197, - 216,69,28,63,126,136,244,224,177,134,15,121,3,91,164,177,151,110,239,41,157,123,225,251,254,161,103,243,133,87,97,226, - 8,35,125,20,49,173,128,10,177,136,216,144,137,106,91,113,196,44,26,139,22,37,139,158,141,168,124,118,236,198,44,152, - 248,44,170,23,130,166,188,99,49,190,100,91,106,249,211,126,214,179,36,92,156,253,132,202,236,215,125,235,228,139,211,210, - 80,155,5,106,145,135,144,177,150,182,246,78,174,185,225,197,156,56,124,128,29,79,62,70,173,86,101,96,176,15,169,124, - 172,78,156,187,163,116,157,139,196,137,117,141,160,101,51,219,244,36,58,19,104,151,82,160,132,201,18,83,156,216,213,243, - 218,200,231,138,196,218,112,224,224,17,30,189,253,54,115,244,246,59,162,129,227,99,227,111,128,61,109,240,84,140,216,170, - 177,187,12,28,59,9,51,47,1,93,248,46,232,45,222,226,19,246,31,185,8,89,32,23,40,162,248,249,87,124,22,23, - 161,16,184,126,77,7,87,252,220,70,110,89,219,193,7,255,113,123,139,85,157,224,108,75,11,2,147,130,198,218,116,207, - 99,123,184,234,134,155,17,74,33,132,114,162,200,236,205,216,244,45,151,44,164,58,120,97,59,123,119,238,224,207,255,244, - 47,73,34,77,20,149,169,71,141,76,81,237,70,135,56,142,137,26,17,197,66,158,217,217,89,134,6,7,89,189,122,53, - 141,200,225,7,82,9,132,114,129,119,66,42,16,130,124,24,56,193,100,26,187,205,145,213,132,228,240,60,143,158,238,110, - 166,166,103,104,52,34,246,238,61,200,206,157,154,205,231,111,102,233,210,21,60,245,212,46,190,126,199,109,220,34,17,90, - 179,66,193,154,93,133,112,237,198,127,249,63,93,47,184,238,70,97,235,17,66,129,146,198,189,182,197,235,110,177,144,154, - 213,74,156,104,74,48,90,235,47,113,70,247,97,22,9,65,57,109,252,18,139,198,161,179,93,33,11,0,180,131,36,68, - 51,135,203,90,215,41,44,170,116,14,12,62,163,152,136,51,54,110,167,81,240,237,183,125,255,58,185,140,125,134,98,191, - 181,224,104,254,44,157,50,178,98,53,3,67,67,236,222,241,20,7,143,29,99,184,127,128,66,224,101,231,72,103,218,56, - 155,253,59,183,26,73,146,52,27,197,221,77,168,249,209,122,89,158,70,201,128,92,88,66,19,80,158,139,120,242,129,135, - 217,245,239,95,76,204,35,143,151,71,102,231,38,46,132,189,121,216,26,193,182,58,98,143,192,158,28,133,242,11,32,249, - 213,246,46,78,116,13,210,35,37,187,231,103,88,89,153,65,68,141,51,209,181,179,23,160,211,138,208,151,93,21,61,255, - 122,65,18,61,255,139,80,171,243,137,29,230,243,124,44,62,139,31,73,61,197,11,37,111,186,164,159,6,112,17,206,119, - 163,153,52,80,21,66,251,82,76,247,167,230,216,206,219,190,56,63,251,203,63,219,222,81,116,209,58,153,41,51,11,216, - 165,27,208,173,1,233,121,76,141,141,242,119,255,247,239,153,24,159,33,151,203,51,53,51,77,106,82,87,160,76,243,46, - 168,80,158,66,42,247,230,27,24,24,68,41,73,16,40,146,36,117,108,0,169,8,139,33,90,55,215,213,58,99,201,186, - 255,102,141,197,106,139,198,141,114,189,61,221,204,206,206,49,56,56,192,142,157,219,184,247,190,123,88,182,108,13,155,206, - 217,64,190,161,77,91,66,65,194,186,157,146,96,201,219,255,184,235,186,87,191,65,17,213,48,126,8,178,140,178,153,6, - 158,179,103,168,59,178,176,205,152,68,89,1,70,184,162,156,145,17,207,228,215,44,12,84,153,207,134,205,112,35,97,207, - 88,179,139,69,225,128,205,95,103,22,105,195,154,155,173,133,84,141,69,102,138,11,237,203,25,124,159,211,177,44,193,89, - 85,206,139,190,195,216,102,176,32,173,32,196,133,232,101,50,239,203,108,28,212,110,175,122,238,150,203,232,29,26,100,235, - 163,143,210,219,86,160,187,187,27,116,236,54,174,210,224,206,16,45,240,185,169,133,107,210,15,22,176,49,197,252,124,72, - 181,86,101,108,239,54,83,126,106,135,174,60,242,68,213,223,181,127,236,2,99,143,117,192,9,224,64,2,59,234,206,184, - 96,172,13,91,126,0,244,23,195,2,83,195,107,197,230,193,1,117,56,78,210,131,198,144,235,236,229,64,154,176,244,200, - 211,36,90,63,171,168,215,59,27,223,202,11,224,241,59,50,96,250,198,231,119,17,122,62,143,93,223,242,121,27,203,124, - 93,179,29,24,233,207,51,244,91,231,19,76,69,148,254,113,7,179,149,36,78,60,113,40,128,71,151,60,250,228,250,237, - 159,252,218,5,87,255,212,155,149,17,211,8,225,2,121,164,112,111,71,163,53,202,186,214,186,50,59,207,7,223,251,126, - 118,237,216,69,28,69,8,145,32,36,36,105,236,52,142,40,60,207,157,242,40,138,16,88,186,187,58,25,25,25,161,17, - 213,17,66,226,251,30,105,170,73,146,132,102,250,152,203,145,119,22,31,82,186,11,192,24,67,163,17,83,44,134,24,13, - 82,105,122,186,187,9,131,60,66,88,246,31,218,203,232,201,113,102,166,102,233,152,153,211,61,16,110,131,92,254,207,126, - 39,184,229,231,127,73,88,61,143,246,173,179,165,208,165,140,163,96,22,21,133,179,24,132,53,49,27,187,80,114,172,93, - 232,140,22,219,170,158,54,102,137,38,85,81,180,144,102,113,154,48,93,156,54,146,185,159,233,10,123,26,55,176,70,163, - 60,31,225,133,153,98,158,211,114,220,23,35,207,86,44,162,1,180,86,238,238,247,138,111,119,13,157,153,174,209,98,124, - 187,215,43,132,187,38,13,22,132,143,240,21,198,90,6,135,151,115,221,139,122,120,236,129,251,56,120,232,48,43,150,47, - 67,90,131,78,154,192,57,24,235,50,227,23,119,108,98,17,160,142,128,219,190,248,37,238,255,200,199,245,155,70,103,234, - 75,97,34,132,109,30,60,154,192,46,13,39,4,76,24,152,150,80,233,117,170,119,198,128,13,61,35,28,237,25,22,210, - 198,166,45,204,228,170,64,136,207,79,159,119,233,183,165,173,240,108,69,232,137,47,91,182,222,101,241,195,111,107,252,246, - 95,197,231,251,120,148,218,124,46,188,117,41,23,254,252,6,30,186,114,128,183,129,169,106,59,38,148,120,172,31,182,237, - 254,195,63,153,62,180,103,39,82,228,49,153,49,149,37,197,24,231,88,100,165,162,49,55,199,71,223,243,30,226,90,68, - 169,212,65,165,214,32,54,134,84,27,124,207,71,41,15,164,32,213,174,147,73,163,132,98,190,68,79,103,47,7,247,31, - 68,9,69,224,5,8,43,240,164,162,144,203,103,120,129,115,220,83,158,36,181,9,81,26,97,208,104,171,209,104,82,82, - 240,140,243,32,178,146,92,46,164,191,127,128,165,35,203,81,184,0,196,113,66,241,69,48,252,194,235,188,55,252,206,111, - 8,146,170,243,50,178,30,210,26,164,204,66,126,229,226,150,66,186,213,176,84,8,225,33,240,129,16,107,189,150,105,152, - 108,117,42,58,139,220,177,153,69,109,19,59,106,154,218,122,24,60,180,144,24,164,91,231,11,201,233,213,40,179,226,192, - 229,198,91,33,17,82,144,70,117,202,19,167,152,31,27,165,50,126,146,104,242,20,233,236,12,186,86,197,54,195,250,172, - 205,46,186,208,197,22,101,161,197,86,200,5,172,78,200,236,87,44,40,231,91,133,192,178,224,55,36,178,96,78,43,90, - 126,207,2,167,231,50,210,71,120,190,27,155,76,132,213,117,210,198,28,141,218,4,158,109,112,197,37,151,81,204,151,120, - 252,209,173,212,27,41,126,88,112,63,35,43,232,74,137,236,6,34,90,36,204,230,50,194,26,205,155,127,242,21,252,194, - 255,252,25,188,82,206,134,16,9,24,77,224,113,3,247,43,120,226,48,28,30,132,185,17,208,62,139,12,233,173,37,112, - 218,170,103,232,171,82,99,158,245,227,172,29,208,217,138,16,60,255,58,161,255,44,197,71,2,149,147,85,118,254,212,189, - 116,92,220,199,69,219,166,248,6,144,51,214,8,37,231,45,118,98,201,177,195,51,31,253,173,183,182,255,247,15,189,55, - 236,110,47,98,90,35,8,40,1,149,249,89,190,248,233,219,104,43,150,8,194,144,125,251,15,80,40,148,90,249,214,190, - 23,16,37,49,82,10,124,207,167,45,95,96,227,134,141,220,244,162,155,40,21,139,28,58,112,144,167,119,238,98,104,104, - 152,222,222,94,226,36,65,74,141,82,210,249,14,103,23,180,84,206,129,49,73,157,57,173,82,30,86,24,18,163,9,189, - 0,99,52,74,41,58,58,58,73,211,148,106,165,202,204,244,36,199,144,94,233,77,175,84,191,247,215,127,156,217,136,153, - 204,144,75,101,0,111,102,237,102,4,167,231,172,187,24,229,197,227,202,226,116,27,219,180,171,48,77,252,102,241,154,91, - 60,99,196,113,205,136,229,76,97,168,205,112,35,97,89,180,165,202,222,99,133,54,124,47,164,49,63,79,189,58,75,195, - 90,60,207,119,5,48,12,145,126,128,244,60,60,47,64,249,185,204,175,91,101,171,109,88,112,247,182,78,203,150,61,167, - 166,62,94,176,32,1,81,205,239,21,22,132,6,145,96,77,226,182,97,90,211,168,167,36,141,8,157,38,160,83,116,154, - 160,20,40,225,196,201,198,8,206,219,188,153,142,82,59,15,62,248,16,23,92,176,153,174,238,78,82,157,58,75,143,172, - 35,115,55,22,78,103,61,91,139,77,234,92,243,202,91,213,238,37,75,75,91,255,226,29,35,107,118,236,223,220,1,7, - 19,56,30,194,252,17,72,255,12,231,16,250,19,56,83,57,128,224,251,232,78,188,111,211,17,62,47,139,208,127,4,192, - 249,91,22,157,156,135,40,249,168,188,231,200,138,117,205,204,35,19,236,124,100,66,108,132,224,103,160,24,91,150,234,212, - 92,154,131,181,39,160,120,255,254,125,234,186,167,119,112,213,21,87,161,117,234,140,57,37,212,231,102,121,232,222,123,200, - 133,1,231,157,119,9,191,244,171,191,157,141,88,13,18,157,32,4,164,169,118,126,49,64,71,169,141,43,175,188,138,203, - 47,191,12,33,36,213,106,157,161,145,37,244,246,246,243,212,182,167,16,66,48,60,50,66,154,166,232,38,111,196,146,233, - 205,92,247,97,140,193,247,125,247,166,213,6,229,123,153,133,105,198,164,149,130,92,46,207,192,96,63,213,234,44,155,54, - 175,229,111,222,241,215,162,173,61,143,77,51,210,27,11,192,110,19,225,104,25,58,103,238,132,153,68,124,209,90,62,89, - 4,183,152,86,113,49,42,115,17,68,182,210,39,220,159,23,214,241,130,133,173,90,211,155,199,102,27,42,87,188,52,146, - 5,162,162,200,254,134,12,80,133,28,197,48,135,95,244,153,154,156,194,88,67,33,204,19,71,17,38,106,184,130,128,2, - 2,60,79,162,60,137,242,37,158,167,50,16,223,98,140,64,72,31,229,185,104,63,33,165,219,236,53,253,160,141,37,19, - 108,145,38,17,113,28,147,164,13,162,168,130,213,105,182,197,116,60,48,79,228,8,252,2,161,151,35,110,104,166,166,102, - 152,157,155,102,174,54,65,84,143,178,85,190,102,199,142,237,92,121,213,21,173,232,105,41,188,214,117,189,32,204,93,136, - 10,50,22,26,213,26,231,92,124,161,232,123,207,219,219,238,251,179,183,95,60,242,249,187,109,31,80,131,59,95,10,251, - 246,67,244,1,92,142,88,9,231,2,177,49,137,184,81,72,106,194,146,96,159,219,88,158,197,69,200,26,184,240,69,63, - 218,34,212,44,62,245,72,243,218,223,123,254,23,159,179,105,254,199,222,191,139,173,119,28,166,109,46,230,10,231,129,227, - 165,144,31,128,238,105,24,206,195,106,15,206,155,131,139,239,246,212,57,201,27,95,218,253,143,127,244,251,106,245,178,149, - 24,147,56,113,32,150,168,90,225,169,199,30,69,38,49,47,184,230,26,62,245,233,59,56,114,228,56,202,47,160,211,20, - 165,36,105,154,98,173,37,77,52,109,197,60,151,92,114,49,87,94,121,5,214,66,154,26,108,38,84,244,130,128,11,183, - 92,196,222,189,123,57,124,248,48,43,86,174,196,36,177,3,174,165,192,195,203,88,183,238,46,154,166,105,182,69,81,206, - 151,90,138,140,105,11,105,10,81,20,227,123,138,246,206,18,191,246,214,95,163,163,179,3,155,214,79,67,102,69,203,112, - 43,251,63,35,51,112,52,91,23,55,85,18,139,41,130,217,158,222,54,67,129,155,104,188,144,8,171,78,147,97,156,222, - 1,217,204,59,121,193,176,127,161,11,50,89,244,241,98,31,48,231,182,108,179,11,19,25,16,148,250,233,180,121,30,248, - 198,215,137,170,53,206,219,120,14,165,66,158,188,23,146,154,132,88,87,73,106,154,200,90,132,84,153,255,15,72,169,48, - 169,118,91,69,213,202,115,59,29,196,182,26,157,197,30,88,107,49,198,253,59,87,44,148,243,254,17,1,141,40,98,174, - 58,195,244,244,33,198,70,79,186,227,236,251,116,119,119,209,213,217,73,208,231,152,238,107,215,175,33,77,83,234,245,26, - 129,159,253,62,165,178,209,107,1,220,151,82,34,68,182,17,203,10,118,163,94,161,191,163,141,151,255,213,219,114,183,231, - 131,75,249,196,157,178,31,152,150,66,189,205,216,189,1,212,255,21,23,48,80,1,142,77,28,197,122,62,151,44,93,70, - 49,151,107,117,231,205,71,156,234,239,189,0,45,46,66,79,126,197,109,199,126,84,43,122,55,118,73,162,72,243,154,255, - 245,13,238,121,226,249,91,124,154,50,12,223,157,36,241,83,174,169,102,7,200,198,190,89,191,109,223,172,15,228,87,65, - 167,134,190,192,37,63,172,50,176,110,10,86,31,47,230,151,151,175,187,112,96,203,127,251,153,224,69,47,127,25,97,32, - 51,191,98,139,20,6,29,215,217,189,253,41,26,213,42,231,158,179,129,201,137,105,62,251,185,59,220,77,52,78,29,153, - 76,90,180,78,17,66,225,41,197,198,13,27,185,225,134,27,72,146,20,157,9,13,201,124,117,76,166,13,218,176,97,3, - 39,78,156,96,122,122,138,246,142,14,146,36,193,243,188,86,209,81,74,225,123,62,22,75,24,230,78,187,147,42,41,73, - 83,157,17,24,107,76,207,76,240,147,111,121,35,107,214,175,194,196,53,7,160,47,6,123,79,91,90,57,194,159,148,106, - 1,111,22,103,168,220,173,92,100,163,145,97,44,52,173,80,23,143,89,139,137,118,180,182,88,66,184,49,47,91,136,45, - 116,69,214,100,79,193,169,188,155,58,168,38,171,24,229,64,92,99,60,194,98,39,87,95,247,34,62,127,219,109,188,227, - 159,222,197,213,87,92,134,77,18,74,109,5,186,251,122,233,236,234,34,151,207,101,5,195,98,181,198,88,75,16,8,68, - 170,177,54,117,4,71,99,92,184,99,166,162,183,139,214,248,70,184,174,211,104,65,212,72,152,153,157,97,98,124,130,180, - 150,16,199,117,188,64,82,106,47,177,116,168,159,174,238,118,194,156,27,249,82,29,56,177,170,214,164,105,140,64,100,57, - 242,142,211,149,218,20,223,247,179,162,227,116,97,14,71,116,12,121,79,10,82,99,80,158,79,172,99,66,47,228,250,223, - 249,149,240,35,19,99,151,108,185,123,43,61,198,114,80,96,126,205,178,175,2,141,71,112,38,124,6,248,234,232,1,182, - 206,141,211,155,47,160,179,194,96,172,37,244,20,47,60,127,133,99,219,159,165,96,124,199,134,100,63,106,158,80,171,248, - 196,134,87,61,143,139,143,205,10,207,16,112,37,120,69,232,152,128,174,45,16,10,144,167,32,167,160,87,66,183,20,244, - 24,203,176,133,37,51,176,108,174,32,135,14,175,236,239,111,187,225,230,210,85,175,127,179,220,124,233,133,4,94,1,155, - 156,194,164,22,43,2,84,230,5,124,96,247,110,162,74,153,101,75,151,225,249,57,30,120,232,235,28,63,57,138,31,230, - 136,35,131,49,154,36,137,81,217,93,111,201,146,165,188,228,37,47,67,8,137,214,6,41,21,82,42,226,56,113,155,21, - 107,144,74,18,197,17,253,3,253,76,76,78,50,57,57,73,119,119,55,58,91,163,54,127,22,214,226,7,65,246,51,220, - 155,27,4,105,170,1,131,54,49,213,250,60,55,220,124,61,151,92,117,25,38,174,184,81,71,102,106,245,236,130,63,29, - 58,56,195,102,35,179,134,16,173,113,141,108,3,40,22,81,110,154,32,242,217,155,254,211,229,23,217,103,105,155,200,146, - 163,52,160,145,210,100,18,23,223,121,130,139,69,72,141,176,173,142,200,8,141,176,150,32,231,243,186,183,188,145,77,155, - 214,50,126,242,56,133,192,99,226,212,56,99,123,198,17,66,146,207,23,80,50,160,84,106,163,171,187,7,41,37,81,84, - 35,12,36,133,98,17,233,41,167,50,207,70,48,79,9,7,196,167,138,153,185,89,198,199,199,49,22,38,38,198,25,27, - 27,5,97,89,58,50,204,234,21,195,20,139,75,16,170,9,44,187,206,197,24,137,181,6,99,146,214,177,116,161,149,174, - 139,107,18,16,83,215,250,180,58,85,215,1,137,204,192,222,44,12,79,214,245,237,81,220,160,51,95,224,53,127,250,7, - 193,39,254,215,219,46,185,252,222,237,116,91,24,21,232,255,105,217,63,0,241,57,110,60,3,96,162,86,97,162,86,57, - 237,28,228,124,197,21,254,48,42,239,60,134,190,231,2,244,163,44,66,22,200,7,146,70,244,252,46,62,38,43,60,123, - 64,14,66,113,37,44,77,224,252,60,108,106,64,151,113,240,100,62,133,190,26,116,54,160,189,177,172,191,39,89,190,188, - 45,190,96,93,225,220,87,190,70,94,125,238,58,70,250,7,92,102,130,174,145,234,4,41,2,16,26,33,52,73,189,194, - 145,189,187,153,61,53,78,127,223,0,105,106,40,215,98,238,252,202,61,68,137,110,145,118,149,244,48,104,164,112,42,242, - 107,174,185,150,158,238,62,170,213,42,74,121,45,224,209,243,92,17,106,94,228,72,137,54,134,158,158,30,198,198,198,208, - 90,227,251,62,113,28,103,186,176,212,141,6,8,148,148,142,187,34,5,214,100,133,201,151,204,204,205,115,209,197,231,113, - 243,173,55,162,147,154,219,250,100,119,221,103,51,142,63,19,57,88,144,88,44,30,85,78,231,250,180,92,126,196,194,144, - 181,96,193,209,140,10,48,173,177,102,1,164,182,8,227,10,101,101,118,154,156,47,241,252,16,25,128,80,138,211,242,115, - 178,223,34,113,199,95,120,25,39,74,39,156,179,229,2,84,8,147,227,99,108,188,96,51,36,142,115,19,71,41,213,106, - 149,249,249,10,251,247,63,77,181,86,165,86,109,96,109,64,106,52,65,62,231,214,212,97,64,62,23,162,68,70,50,52, - 144,36,17,66,64,177,173,64,161,144,99,227,57,107,232,235,235,166,88,204,163,141,161,158,38,78,63,5,72,233,35,164, - 69,72,183,217,84,173,132,215,172,208,24,155,141,113,162,213,145,25,52,86,187,142,71,74,153,121,253,100,99,104,182,62, - 151,6,12,26,172,32,214,13,250,187,186,120,205,159,254,126,112,199,111,191,109,203,197,15,238,138,11,150,114,44,168,236, - 183,28,95,147,221,42,158,205,95,171,22,120,217,120,44,206,74,67,248,174,45,89,127,216,69,168,89,124,106,13,205,107, - 126,239,254,231,101,241,105,190,244,113,16,47,133,48,129,193,58,156,155,131,203,27,112,201,231,61,54,219,13,203,58,54, - 109,88,139,10,115,178,109,176,223,43,14,244,169,225,213,43,68,247,134,245,44,93,185,134,82,190,23,80,36,204,128,174, - 96,117,136,81,138,84,54,240,76,17,37,60,180,46,51,57,54,74,84,157,163,167,173,136,137,99,194,98,23,59,118,238, - 99,215,222,131,72,233,99,18,231,100,40,148,69,38,144,232,148,11,46,184,136,145,165,203,152,171,84,156,130,218,44,208, - 242,141,113,178,11,132,112,64,179,204,86,199,214,50,56,56,232,248,66,66,180,64,103,165,36,113,156,16,248,97,166,145, - 106,70,12,91,2,63,68,155,26,221,189,93,188,248,101,183,32,133,37,205,182,46,205,78,166,181,133,130,69,110,132,11, - 43,240,197,199,244,116,165,148,93,64,212,178,191,54,234,13,140,73,241,2,133,239,231,51,69,183,201,138,141,62,61,4, - 80,184,146,37,22,17,21,149,144,8,147,80,158,42,35,165,68,169,60,97,91,9,145,203,163,194,124,11,204,118,227,161, - 68,216,180,213,137,89,107,209,169,97,253,230,75,240,194,93,140,31,59,196,146,158,54,71,233,203,41,242,249,78,250,250, - 186,193,46,37,77,99,210,52,65,199,16,197,17,73,154,146,36,49,198,106,226,56,194,87,110,52,245,51,87,130,32,116, - 254,74,190,231,57,145,177,49,164,73,138,167,4,158,231,103,128,52,40,105,157,32,213,64,170,117,70,207,200,172,52,76, - 179,112,103,93,163,176,142,74,145,166,89,23,156,58,199,4,41,51,247,129,12,7,202,60,177,155,61,160,198,16,39,49, - 3,125,3,220,248,231,127,152,123,248,87,254,191,139,46,216,126,120,202,90,38,58,160,254,183,48,121,5,216,194,179,92, - 27,255,62,210,205,231,66,159,103,51,5,253,158,60,161,23,23,33,107,224,194,155,127,48,69,104,113,241,121,229,239,126, - 131,175,111,61,245,188,235,120,74,56,141,215,227,16,52,160,91,194,234,28,92,106,224,170,195,176,121,199,133,231,46,217, - 244,171,63,81,120,217,173,47,99,160,103,192,129,182,162,105,146,41,1,141,38,198,152,121,140,54,72,5,82,134,46,251, - 93,128,103,4,216,8,140,97,110,252,56,181,242,20,109,197,54,172,129,212,104,144,130,47,221,249,32,243,243,49,97,62, - 135,240,193,232,4,147,26,148,231,81,44,229,185,224,188,243,169,55,234,20,138,153,37,71,118,199,109,105,159,132,116,171, - 253,51,174,119,41,37,97,16,158,230,141,99,12,4,65,136,177,169,75,35,213,22,79,42,180,244,48,66,18,155,136,87, - 191,246,37,132,161,64,235,4,37,189,76,104,9,70,8,148,16,11,155,31,107,29,231,166,85,22,100,6,248,106,36,41, - 88,207,221,91,69,132,65,96,200,35,172,65,89,3,196,68,213,41,170,115,83,180,229,115,232,32,68,230,219,80,65,9, - 229,23,90,64,175,21,26,105,23,118,97,182,137,237,88,199,142,46,22,59,137,171,13,60,37,49,58,166,58,125,202,17, - 23,189,128,32,215,70,144,43,160,2,31,25,184,115,34,132,116,204,243,102,183,104,45,171,214,109,34,138,99,78,156,58, - 202,96,95,31,113,220,192,87,162,101,221,33,149,64,90,137,10,45,126,46,0,2,132,40,44,216,189,102,224,126,146,141, - 178,198,58,207,30,112,96,180,209,238,247,89,109,80,74,162,164,66,42,55,198,217,236,123,108,230,138,208,202,32,147,14, - 103,210,58,93,24,149,141,205,70,63,145,173,227,197,34,19,126,131,176,25,193,85,100,185,101,86,58,59,14,43,208,81, - 194,210,229,67,164,127,246,191,58,182,254,244,111,93,113,254,228,220,108,21,230,45,60,60,47,68,185,240,44,23,255,233, - 29,233,115,84,128,22,23,161,31,20,48,221,196,124,234,177,225,53,191,119,255,243,174,248,88,96,30,104,3,245,50,104, - 159,129,85,121,184,72,192,165,71,225,162,3,195,35,171,54,254,218,207,181,253,198,207,191,89,245,118,14,0,25,167,195, - 58,203,4,157,1,192,50,107,79,221,159,5,18,149,113,80,82,48,6,105,5,66,106,102,39,198,168,204,76,161,178,107, - 39,49,134,48,95,224,233,93,251,120,224,193,71,200,229,242,88,44,73,154,96,113,188,144,56,142,185,250,234,107,241,125, - 143,70,189,142,167,20,86,186,213,185,53,6,43,37,202,115,227,88,148,38,40,207,195,164,89,14,185,82,173,55,107,189, - 94,207,214,199,153,12,32,3,173,211,36,109,201,50,130,192,99,124,106,156,235,111,186,156,190,254,126,146,184,134,151,141, - 122,205,206,71,102,12,240,150,162,92,186,55,190,182,180,156,139,17,6,105,125,192,50,63,55,138,141,35,2,191,157,160, - 208,129,10,18,231,101,44,36,214,8,138,109,29,232,218,60,42,53,216,184,70,101,118,30,153,243,9,219,58,200,21,123, - 16,94,9,33,60,76,22,33,217,12,2,180,100,90,55,173,81,133,18,181,40,225,11,183,223,197,45,55,191,136,182,66, - 142,52,170,161,107,117,170,229,6,101,41,240,194,0,21,4,120,190,115,144,244,131,0,233,41,132,82,110,181,109,13,27, - 54,110,100,91,181,204,212,116,153,238,142,34,164,177,99,107,219,5,203,179,56,141,241,60,229,36,31,89,81,55,214,102, - 76,118,213,234,38,69,86,224,148,146,11,86,105,86,32,133,211,229,185,163,230,176,42,87,180,28,165,192,99,193,122,196, - 66,75,231,101,140,235,142,132,114,91,75,99,22,114,140,28,30,232,192,112,163,227,172,19,202,18,102,149,200,126,183,163, - 78,164,115,49,235,55,108,98,230,143,127,123,100,255,255,252,131,235,214,197,102,84,195,216,209,192,219,51,16,167,137,176, - 150,249,124,192,124,16,32,173,37,159,106,202,129,231,98,204,4,207,109,1,250,65,142,99,205,226,211,72,12,175,254,221, - 231,23,230,211,180,214,120,41,136,9,40,120,48,226,193,230,18,92,53,1,151,62,220,217,190,33,247,250,91,187,223,240, - 255,253,154,88,179,226,28,208,13,108,60,237,66,3,133,204,138,131,68,102,109,252,2,101,159,214,197,189,248,0,74,9, - 213,185,57,42,51,83,232,196,96,53,248,94,182,209,193,227,158,123,31,100,106,118,146,124,169,3,107,154,124,29,73,18, - 199,44,95,177,156,222,222,30,26,141,6,237,165,118,124,169,136,162,24,47,155,255,91,9,161,82,18,134,33,66,72,82, - 145,144,36,77,162,161,211,139,197,218,16,71,13,167,128,111,42,240,133,68,102,172,92,97,161,92,153,165,171,43,207,5, - 231,159,139,77,19,60,233,157,238,134,218,234,58,50,37,185,200,36,180,214,145,41,143,31,62,142,50,150,145,165,125,104, - 13,74,5,120,70,83,173,205,145,154,6,186,86,165,216,149,71,133,237,164,4,24,169,240,130,54,74,93,35,124,234,67, - 31,228,130,13,231,176,97,205,106,106,233,12,245,233,57,226,234,28,42,232,33,87,234,70,5,42,187,168,220,69,107,16, - 104,44,66,73,148,181,116,13,143,48,93,174,240,206,119,253,43,151,95,186,133,75,46,56,159,48,40,96,51,191,101,157, - 52,72,226,42,66,204,99,90,84,33,129,31,230,200,23,10,228,11,69,84,24,112,222,69,91,216,250,205,7,169,213,26, - 116,20,242,206,61,50,203,100,107,130,189,89,127,114,122,240,97,38,18,150,25,174,70,147,40,152,241,157,68,43,46,58, - 219,46,105,183,73,211,214,249,73,35,101,86,220,105,173,192,23,19,12,23,127,246,60,119,99,106,110,24,157,175,145,114, - 231,196,72,76,10,73,146,18,132,57,114,249,60,190,239,147,234,20,164,64,153,2,74,5,92,255,250,215,243,213,195,71, - 87,86,254,250,221,87,23,96,255,140,16,147,123,124,239,212,80,156,152,59,215,47,231,238,117,75,200,197,9,22,75,212, - 168,146,79,52,4,242,185,47,64,63,168,34,20,20,125,230,107,9,111,120,30,21,159,230,203,57,23,72,193,239,131,158, - 58,108,204,193,149,21,184,242,126,212,102,251,202,155,6,95,243,135,111,245,207,187,224,82,55,92,153,26,146,4,45,93, - 210,128,27,50,196,34,81,35,139,20,214,42,187,91,101,122,40,233,220,232,116,163,78,101,106,18,27,215,51,149,182,227, - 199,4,97,64,173,150,240,248,227,187,16,82,16,69,13,103,189,137,91,151,231,243,121,150,142,44,101,118,102,22,63,8, - 24,236,31,68,167,14,227,105,110,179,172,181,153,118,201,117,94,105,156,128,117,56,131,49,6,99,45,137,54,148,218,219, - 153,58,213,112,220,34,207,207,108,64,4,198,186,87,161,4,204,205,159,226,101,215,223,154,113,12,229,66,113,21,153,118, - 201,90,164,205,46,46,148,147,38,52,191,142,199,212,196,36,127,253,39,127,206,235,127,236,101,220,250,146,27,48,8,114, - 126,129,163,99,71,232,234,76,41,132,41,181,169,57,188,182,24,194,118,68,152,39,5,130,246,94,242,157,3,252,201,95, - 189,157,151,191,244,22,174,190,246,114,122,250,186,104,68,85,210,250,113,210,234,4,190,151,35,95,106,71,22,243,8,207, - 203,52,87,142,123,172,177,228,10,69,174,190,230,106,226,242,44,91,183,110,101,223,211,59,89,187,118,29,171,87,174,166, - 189,171,45,243,172,209,200,236,60,10,161,48,198,146,212,42,36,181,26,85,53,67,174,80,32,44,182,177,97,253,6,118, - 110,125,146,80,121,174,131,177,110,205,110,108,243,220,36,173,237,94,83,24,108,22,5,38,234,212,180,228,18,45,81,109, - 230,223,212,204,184,215,153,38,183,169,225,18,194,97,84,74,41,7,174,167,174,232,45,246,187,118,92,48,147,177,225,131, - 214,249,215,70,131,117,227,153,39,20,82,250,156,56,118,146,71,30,125,146,217,217,10,197,82,7,113,234,92,17,139,82, - 153,216,243,101,174,163,157,74,190,83,153,82,238,220,155,42,141,11,114,198,110,219,106,236,212,61,74,154,163,3,221,20, - 147,52,27,83,93,167,103,197,247,65,68,252,110,139,144,49,112,209,247,138,9,41,1,165,0,121,231,33,222,254,190,29, - 220,115,100,254,121,131,243,120,192,86,8,87,65,135,129,145,8,46,12,224,5,79,192,101,135,46,58,103,213,213,111,251, - 205,220,77,183,190,132,130,10,177,73,12,194,67,202,16,43,3,55,70,145,102,155,6,90,2,70,219,132,69,133,61,205, - 200,202,98,192,164,96,83,230,167,166,209,81,132,176,6,147,106,164,200,129,48,4,65,158,199,30,223,197,209,99,163,89, - 158,151,165,16,134,164,58,37,142,35,86,173,88,65,224,5,196,141,4,129,108,17,7,155,250,159,230,22,68,91,227,120, - 27,25,15,136,76,221,78,147,109,108,28,95,168,84,44,146,38,49,158,39,50,31,99,31,163,13,185,32,96,98,242,36, - 55,223,122,61,155,206,63,7,19,71,144,173,248,23,2,134,229,34,43,13,15,211,50,252,113,24,152,37,101,195,166,245, - 188,229,167,222,204,206,173,59,248,192,191,126,136,55,188,233,21,148,43,227,124,237,158,187,217,180,97,21,43,87,44,161, - 183,111,144,242,244,12,86,149,233,232,233,197,43,228,177,218,240,226,87,190,10,21,132,116,182,133,220,113,215,55,24,30, - 232,101,203,69,231,208,81,10,49,105,132,174,55,168,68,117,100,181,64,190,173,132,44,228,241,51,233,8,128,82,30,58, - 142,232,40,42,94,250,226,23,50,55,51,207,209,35,199,217,190,107,27,198,26,114,69,159,66,49,79,160,60,172,5,223, - 15,41,149,218,41,22,10,228,194,34,86,8,226,122,131,36,113,30,203,75,70,150,114,96,255,62,150,44,29,65,74,157, - 101,185,11,172,116,36,64,99,178,77,85,54,146,138,150,232,55,163,14,88,209,74,181,16,66,100,227,58,45,110,77,166, - 241,200,192,125,215,197,164,38,201,156,10,36,210,247,22,156,32,141,113,124,41,211,84,214,139,133,200,33,75,107,75,38, - 1,99,171,88,227,179,100,89,63,93,189,215,179,103,247,33,238,190,231,126,238,184,235,94,150,159,154,173,188,30,100,5, - 194,57,72,61,33,170,195,74,140,165,16,201,56,49,43,192,218,165,253,28,236,235,66,87,170,174,248,26,251,109,141,129, - 212,203,87,108,226,185,42,66,82,193,137,189,238,239,3,155,3,103,215,9,103,221,255,63,131,148,228,75,84,106,137,62, - 127,128,169,191,122,132,187,102,35,30,255,1,22,150,115,28,79,135,47,0,215,1,131,208,138,13,241,128,163,184,236,247, - 141,64,63,168,97,232,172,194,6,9,215,9,184,101,14,110,250,90,33,127,149,255,214,95,89,241,75,255,242,14,111,203, - 249,151,184,187,154,6,33,83,172,172,162,69,138,176,2,165,113,130,165,22,249,77,52,47,203,150,36,193,178,192,203,16, - 214,32,173,161,60,53,73,101,118,26,29,71,88,171,29,160,168,20,169,177,120,65,145,143,124,228,223,217,181,239,32,66, - 185,55,162,146,146,70,163,193,242,101,203,24,26,26,162,81,143,72,226,24,223,243,25,25,30,161,163,163,163,181,209,106, - 90,115,10,225,124,166,155,212,27,99,109,230,247,99,81,205,55,167,148,8,4,73,28,81,40,228,220,29,93,187,72,159, - 74,121,150,21,43,135,185,238,69,87,67,90,205,236,49,112,41,7,210,100,177,55,205,77,140,187,176,164,16,206,12,29, - 119,193,10,64,73,159,153,201,41,94,112,229,69,212,171,101,142,30,59,65,169,163,141,70,82,101,205,138,213,236,221,123, - 132,147,227,19,44,93,178,20,133,161,94,153,67,160,221,230,40,215,70,163,81,65,165,13,174,190,250,18,166,167,78,241, - 228,227,219,104,52,160,189,171,159,160,24,184,245,115,98,168,215,42,164,141,134,203,140,80,14,232,23,82,49,123,106,20, - 91,155,65,40,139,239,91,6,135,135,24,26,30,166,212,222,70,88,200,17,132,1,18,231,201,164,181,102,126,126,158,217, - 217,121,198,199,79,49,57,57,73,189,94,35,142,234,40,41,41,22,157,217,255,216,216,40,93,93,93,24,92,87,226,232, - 0,166,101,231,138,16,142,46,161,53,82,73,247,125,198,32,61,183,20,176,89,247,104,23,235,227,50,230,183,109,158,39, - 200,86,236,11,139,3,22,165,125,216,211,178,202,68,171,104,181,206,107,147,243,36,5,210,115,14,11,82,66,152,83,44, - 95,57,204,13,55,92,201,245,55,94,137,215,91,244,106,115,243,114,249,212,60,23,91,42,235,96,95,175,177,15,105,120, - 200,8,246,140,64,121,87,185,202,147,161,207,234,66,64,109,182,66,96,53,117,105,241,148,68,158,225,198,8,240,226,55, - 252,236,115,87,128,90,69,200,19,156,218,111,216,244,181,71,73,139,48,94,8,232,233,201,35,197,233,133,200,97,15,224, - 121,64,168,136,235,154,131,255,223,55,136,63,187,143,156,117,145,189,143,253,8,10,80,115,217,171,128,30,240,11,78,30, - 177,202,131,75,5,188,164,10,183,30,201,5,87,140,190,244,166,245,55,252,243,223,119,188,254,167,222,76,33,144,152,36, - 1,27,33,189,196,109,147,132,231,114,233,49,8,210,86,139,221,60,80,34,147,83,52,137,59,198,106,87,72,140,70,232, - 148,70,121,142,249,217,105,116,26,97,172,70,91,199,225,72,77,138,16,1,115,229,132,127,123,223,71,168,214,27,24,43, - 104,107,111,7,99,220,232,181,108,153,3,142,149,135,239,135,128,96,96,104,136,190,254,62,7,122,74,143,32,112,1,131, - 152,172,0,9,209,42,100,162,73,39,206,86,232,82,56,223,231,35,71,14,35,149,32,137,99,138,133,18,38,49,204,205, - 157,226,197,47,190,14,105,106,84,102,167,168,205,206,81,47,207,81,153,159,162,94,157,195,152,212,109,210,50,81,169,176, - 26,27,87,136,203,179,196,181,121,132,73,128,20,233,183,51,63,51,71,18,31,103,213,138,33,226,196,99,247,222,131,116, - 118,118,210,217,81,164,127,160,135,83,167,198,121,240,129,135,24,30,90,66,87,103,23,229,242,60,198,166,40,31,6,6, - 6,216,187,243,105,186,58,66,134,6,186,233,235,237,101,108,108,150,221,251,14,82,141,27,228,242,57,242,94,232,88,193, - 113,76,163,82,6,163,81,158,68,6,62,243,83,147,212,231,103,200,229,115,8,105,209,58,198,104,75,144,11,201,5,1, - 133,92,142,66,230,137,93,42,21,233,104,111,163,152,47,208,214,94,194,243,157,128,180,86,175,49,61,53,205,228,169,9, - 124,223,167,82,169,80,107,212,41,149,10,24,173,23,121,240,100,55,58,165,88,236,53,100,164,235,58,117,147,37,173,84, - 171,224,104,171,91,27,43,247,217,197,229,144,69,243,8,68,102,60,118,250,67,46,26,197,154,221,206,153,141,192,2,77, - 34,4,235,186,87,173,13,105,26,145,36,13,58,219,10,92,124,249,37,98,228,165,47,149,135,86,13,201,3,135,14,89, - 127,186,220,200,195,148,128,83,169,16,83,5,168,30,135,180,227,212,12,175,59,118,138,251,246,159,224,156,64,114,168,191, - 131,208,242,172,5,232,185,143,102,22,160,60,75,254,155,39,217,122,223,1,62,210,87,224,231,94,187,158,210,149,195,12, - 175,232,32,150,2,153,24,172,208,164,13,152,154,134,162,136,40,253,221,67,76,111,61,197,200,143,24,231,105,184,15,5, - 20,151,195,146,8,46,16,112,241,60,156,51,26,248,107,219,111,189,161,239,210,183,254,98,113,253,149,87,73,95,42,116, - 50,143,80,2,37,52,86,65,34,20,2,137,167,21,34,177,88,37,137,125,80,26,148,21,167,3,74,66,96,141,118,46, - 131,25,200,40,17,36,245,58,243,83,51,217,70,202,160,141,118,88,2,96,137,41,20,123,121,228,177,237,76,78,78,227, - 135,62,104,133,231,249,164,113,196,234,213,171,29,142,22,248,20,10,5,199,245,16,34,219,130,168,12,60,150,72,37,145, - 218,44,128,224,144,37,97,58,44,161,121,193,232,196,141,15,66,74,230,231,231,105,107,203,83,106,43,33,165,228,228,169, - 19,68,141,121,172,142,168,204,78,162,27,13,140,105,218,196,106,188,208,163,26,85,9,148,71,80,232,68,8,69,125,110, - 154,250,236,56,202,104,12,150,56,200,97,165,194,47,212,8,114,134,250,20,68,94,68,255,96,129,199,182,143,17,230,125, - 36,18,29,87,56,119,211,42,60,47,228,67,31,191,141,203,46,187,140,203,175,188,136,180,94,167,82,63,76,231,224,74, - 150,175,63,159,253,71,118,178,102,249,32,158,74,57,111,211,48,147,83,115,28,62,60,198,212,232,36,3,3,61,244,247, - 116,211,221,213,78,206,247,169,207,205,209,72,26,116,122,18,235,73,234,177,162,77,248,142,252,137,113,196,195,84,18,40, - 15,79,41,180,72,29,142,150,73,83,124,169,72,109,138,231,229,51,128,55,68,73,143,52,49,204,205,205,83,175,71,204, - 150,231,24,24,236,115,199,189,25,211,179,136,155,36,90,148,240,108,21,46,29,46,36,69,115,92,166,101,38,223,148,84, - 156,206,161,114,93,171,181,214,1,255,176,40,117,195,182,64,108,33,84,166,219,91,48,34,91,176,4,177,153,7,146,251, - 253,22,227,10,28,18,171,33,78,12,105,84,163,83,5,188,236,149,183,50,122,197,150,194,214,79,126,97,237,161,15,255, - 123,199,154,153,202,64,151,181,253,99,240,192,74,216,117,94,170,167,147,84,39,41,208,54,58,67,223,138,126,234,249,80, - 72,125,118,38,208,115,218,1,53,47,42,105,45,231,31,223,199,184,78,121,186,150,80,121,108,140,187,62,187,143,158,221, - 211,4,93,33,141,130,79,41,12,184,243,253,17,223,252,178,34,248,210,33,214,238,220,207,97,183,214,38,0,238,255,33, - 117,64,159,7,174,117,99,22,243,160,166,161,93,194,50,31,46,77,224,230,10,188,100,2,174,180,47,185,97,253,133,239, - 254,219,254,23,252,214,175,230,6,151,175,20,202,196,96,211,214,93,199,10,133,144,62,194,42,164,49,72,147,186,187,91, - 203,250,32,91,129,90,155,201,1,12,214,68,164,81,13,145,52,16,94,136,231,121,152,70,141,217,137,113,210,168,6,164, - 104,147,130,132,52,50,40,44,97,33,135,80,37,62,240,193,127,103,223,129,195,248,97,128,49,78,159,21,4,30,203,150, - 45,167,90,169,129,21,52,26,17,181,90,13,63,240,233,233,235,101,96,112,8,132,179,147,80,202,61,23,231,51,166,50, - 8,78,46,152,97,129,19,152,10,65,144,11,73,117,194,216,232,40,131,195,67,248,126,224,240,159,48,196,90,216,191,255, - 8,86,75,134,135,187,48,196,120,120,40,27,184,215,232,105,194,246,62,60,47,71,90,47,51,59,121,138,70,45,97,199, - 246,221,28,63,54,202,190,61,71,169,206,59,182,116,154,166,212,203,243,148,242,10,27,25,6,122,122,40,21,139,200,64, - 129,74,209,113,66,79,95,39,171,86,175,224,115,159,189,131,123,239,254,38,231,172,63,151,174,174,18,213,202,44,131,67, - 75,216,187,247,0,158,167,241,130,132,52,54,20,115,221,244,247,119,225,231,19,198,167,78,113,228,240,40,163,99,115,212, - 106,154,82,123,39,57,63,196,214,34,230,39,103,152,175,84,233,236,40,33,209,120,153,191,182,219,248,25,60,101,240,173, - 1,5,49,17,49,113,43,93,85,10,141,18,174,75,77,211,24,41,161,173,84,164,183,183,155,174,206,118,210,36,201,116, - 95,114,193,161,17,50,108,48,91,193,227,54,163,10,133,146,178,21,61,237,198,68,167,217,50,34,3,168,165,200,70,173, - 108,89,209,106,172,79,143,153,118,133,200,129,230,82,40,100,214,237,168,236,239,74,122,40,169,50,204,73,128,72,51,135, - 2,145,25,215,137,22,93,66,102,22,33,113,163,74,177,144,99,221,11,46,147,225,181,151,183,237,139,107,75,226,61,135, - 134,59,45,189,30,132,17,164,101,79,69,126,46,72,87,87,26,102,122,178,204,236,112,15,86,10,34,99,8,172,165,106, - 29,65,245,229,63,241,243,63,216,2,52,166,83,118,102,23,247,36,208,126,188,76,238,206,67,188,225,222,195,236,220,41, - 40,141,119,65,94,49,88,158,102,197,244,24,135,126,136,5,104,67,86,120,78,2,151,128,151,64,123,2,43,115,112,137, - 132,155,107,112,235,168,20,215,153,27,174,89,119,193,223,253,69,207,101,191,251,214,252,208,234,213,194,166,113,203,50,162, - 57,199,187,109,146,104,193,170,34,235,40,76,198,217,240,154,35,142,196,89,74,152,6,113,163,76,220,168,33,133,192,15, - 243,72,229,99,146,152,185,233,9,162,90,5,97,82,140,118,65,115,113,154,34,45,46,19,94,73,70,199,230,249,208,71, - 254,157,36,117,93,68,154,26,210,56,102,227,198,13,36,73,194,220,220,92,166,160,150,45,196,105,96,104,136,225,37,195, - 173,77,138,88,36,136,212,214,224,121,30,94,118,135,116,44,95,71,114,84,153,131,98,189,81,103,122,106,138,129,129,193, - 108,125,235,188,127,218,218,59,177,214,227,240,161,19,84,171,101,86,172,90,138,78,12,74,248,72,101,192,131,124,251,48, - 158,42,18,85,167,137,27,117,254,230,255,188,147,201,169,83,12,14,247,80,43,215,153,155,158,228,196,241,221,236,218,177, - 139,137,137,73,150,45,31,33,213,41,97,40,8,60,223,17,0,173,67,231,140,142,200,229,60,182,92,180,133,35,135,143, - 240,165,47,222,65,190,208,198,224,96,15,194,54,200,229,122,216,182,237,73,86,172,26,68,39,9,214,72,18,211,160,88, - 240,24,234,233,163,187,179,11,107,53,71,78,28,100,239,129,157,104,19,145,247,3,146,56,101,122,126,150,206,142,130,27, - 19,173,117,219,46,43,16,190,202,64,122,72,172,192,88,31,172,135,20,22,107,98,140,9,176,54,196,52,77,245,173,117, - 198,111,153,20,36,73,19,140,209,100,203,242,86,209,144,139,198,34,145,37,158,52,61,168,149,116,93,167,20,77,157,150, - 69,121,94,203,199,89,8,199,106,106,222,48,220,8,230,131,53,25,21,99,209,184,101,221,54,78,54,59,46,139,35,58, - 54,237,177,141,197,247,252,12,163,84,25,83,218,117,106,142,24,155,153,193,42,247,164,141,53,164,141,152,161,129,62,214, - 222,112,173,55,187,102,121,223,190,125,251,151,250,211,229,145,18,116,91,99,101,155,239,55,172,49,245,168,30,235,246,241, - 89,202,147,243,92,121,98,154,59,78,206,240,115,39,103,88,118,114,134,77,191,249,59,63,128,17,236,91,60,252,172,184, - 236,29,173,131,158,228,226,245,43,137,236,217,55,79,5,96,89,86,144,158,227,9,145,41,160,221,253,124,239,167,160,211, - 194,18,13,235,125,56,127,10,46,60,226,123,235,195,235,175,237,191,240,87,126,62,127,238,141,215,202,48,12,177,105,140, - 142,235,25,203,212,158,150,180,41,165,2,19,103,231,218,57,20,54,205,38,69,179,213,198,96,211,24,147,212,72,163,138, - 107,171,189,16,47,95,34,149,57,60,19,83,157,155,165,58,95,70,24,157,141,102,218,109,169,210,166,5,171,32,244,11, - 60,245,212,195,76,77,207,160,188,144,212,52,28,5,223,88,114,185,28,214,66,169,216,70,24,134,173,118,61,8,67,226, - 40,33,110,36,142,222,47,100,118,103,204,146,47,140,88,72,121,200,116,67,198,51,196,73,130,242,90,217,20,244,246,244, - 44,240,75,178,21,176,214,41,74,9,122,123,135,120,234,169,253,168,32,224,133,87,93,76,117,126,194,129,233,132,120,66, - 96,26,53,66,36,183,221,241,21,250,123,114,188,254,199,94,73,154,70,136,53,110,75,103,116,157,19,199,39,57,116,236, - 20,245,40,69,121,30,154,58,164,26,79,231,28,48,171,4,136,0,173,45,82,214,120,227,155,95,194,19,79,236,228,206, - 47,221,201,241,99,199,120,193,213,151,177,254,220,45,60,112,191,230,248,145,41,134,6,122,137,117,140,23,186,142,207,75, - 99,58,218,36,29,237,221,12,175,232,160,161,83,230,230,170,108,219,181,155,217,233,121,82,93,103,229,202,129,204,195,56, - 243,104,150,62,130,16,85,112,145,53,182,150,162,210,4,207,52,0,67,148,122,238,70,35,82,20,34,19,238,186,68,82, - 99,156,83,163,144,153,53,171,36,27,129,132,235,60,180,3,124,129,214,185,114,203,129,102,188,82,214,233,224,196,170,22, - 78,147,74,180,70,173,166,45,73,22,163,172,252,108,3,37,23,162,119,50,115,163,172,163,163,21,71,100,172,93,228,104, - 32,90,9,25,206,184,126,65,38,35,51,246,126,115,175,105,5,212,107,117,132,240,184,244,214,23,137,213,87,94,214,247, - 240,251,62,118,229,248,251,63,189,124,117,181,177,170,163,214,184,39,129,251,47,132,3,59,231,107,181,234,124,205,46,113, - 114,37,214,3,179,207,229,26,254,185,126,212,129,45,192,255,206,10,197,115,253,56,4,28,6,127,47,140,0,151,249,112, - 249,20,156,183,211,87,107,210,27,175,27,188,234,127,252,66,112,249,139,110,32,231,123,24,93,67,235,90,70,18,92,164, - 79,60,51,241,160,229,18,191,144,224,233,128,66,199,227,48,81,133,56,170,101,197,37,193,15,11,168,176,128,80,62,218, - 122,212,202,83,212,102,167,145,214,162,211,20,147,17,204,146,40,118,73,150,190,203,137,210,90,241,232,227,219,72,98,77, - 16,122,104,60,164,108,160,132,79,28,167,132,97,136,181,150,40,138,92,8,97,38,32,77,146,36,139,219,1,109,221,22, - 38,77,93,145,243,148,202,182,52,11,236,89,4,156,56,126,2,207,247,233,31,26,0,11,61,189,189,45,127,161,133,196, - 5,129,84,146,36,53,12,141,172,225,209,71,118,179,100,112,136,53,171,123,73,162,42,194,72,68,90,3,155,176,111,247, - 110,234,243,243,188,225,13,47,162,94,157,65,144,67,83,201,216,185,57,134,87,140,48,180,124,136,36,169,64,154,3,36, - 158,116,121,33,90,104,231,25,40,66,23,29,100,83,26,81,149,139,46,218,196,154,213,171,184,227,75,95,229,95,255,245, - 189,92,180,101,23,107,86,159,203,158,29,219,25,236,27,6,17,115,226,228,60,163,51,101,218,58,67,218,243,237,116,149, - 138,180,151,138,4,34,33,239,215,25,238,210,76,79,205,80,141,34,210,52,6,225,186,8,41,221,152,114,114,116,156,79, - 127,230,118,110,121,237,107,57,127,195,16,186,92,37,170,186,124,52,165,12,130,26,70,72,132,8,50,198,53,248,74,144, - 26,237,28,2,172,113,221,135,176,173,209,215,100,95,211,90,59,135,69,156,48,24,32,77,12,94,224,57,6,181,21,40, - 229,116,120,58,43,140,142,62,101,23,34,118,140,105,221,240,36,194,17,21,155,140,104,235,70,54,151,31,183,128,31,25, - 187,40,245,3,131,54,73,214,253,56,125,153,151,101,192,11,156,31,146,64,57,83,53,33,50,61,95,147,34,144,82,155, - 159,165,61,23,240,162,223,249,101,127,255,77,55,173,120,234,79,255,166,123,217,99,79,13,116,67,127,29,238,91,3,79, - 143,192,84,29,210,31,8,15,232,7,241,240,128,227,192,19,56,215,181,231,74,102,150,41,119,69,8,221,22,174,138,225, - 199,238,246,197,101,83,87,93,212,251,226,223,248,53,117,253,139,111,33,244,60,76,218,192,234,104,65,108,105,113,41,18, - 139,131,229,22,100,218,88,161,178,194,211,76,182,52,78,65,173,35,162,242,28,166,81,113,216,143,159,71,228,219,32,44, - 97,132,135,50,160,27,101,202,83,167,28,215,71,39,217,29,70,56,47,31,41,145,194,195,24,167,171,154,158,169,179,227, - 233,189,248,185,208,17,5,147,20,129,197,247,20,133,124,17,173,83,188,76,94,209,244,239,177,205,162,150,69,242,72,41, - 241,60,143,70,189,209,98,222,106,227,86,193,173,13,77,150,47,222,136,234,244,233,94,4,206,200,94,107,221,42,64,158, - 231,161,124,223,69,189,56,110,49,131,35,203,185,253,43,95,231,205,111,120,9,61,29,69,44,9,73,109,26,99,12,79, - 62,177,141,205,155,55,146,36,77,95,194,8,95,228,92,241,147,130,122,162,241,101,72,177,80,36,170,215,81,162,136,69, - 160,213,52,158,103,65,75,140,141,81,184,149,184,53,146,168,214,160,152,151,188,238,199,110,229,208,161,81,190,252,149,175, - 115,247,93,15,18,122,138,11,183,172,162,171,167,200,71,63,248,97,187,245,51,95,73,214,244,150,76,111,88,50,229,190, - 222,176,184,126,141,58,247,210,243,185,240,130,117,12,245,20,24,26,30,160,222,112,91,31,33,36,202,83,153,154,220,210, - 222,86,98,207,206,221,236,255,242,111,38,151,222,112,149,186,241,77,175,147,203,70,122,168,85,230,193,72,148,113,26,183, - 200,102,242,153,76,49,239,216,201,105,54,138,201,214,104,212,196,120,76,162,209,166,105,117,226,198,42,173,93,103,105,180, - 113,239,169,44,245,212,117,56,246,180,104,103,215,58,45,176,233,155,93,145,75,69,37,115,175,116,203,4,169,156,59,163, - 181,26,147,69,48,139,204,123,201,104,235,54,182,210,69,55,233,108,116,84,202,91,40,106,198,56,220,72,169,140,63,229, - 192,109,149,17,34,211,52,193,206,204,112,206,133,107,89,254,137,119,182,63,242,79,31,184,236,224,59,63,208,179,162,17, - 47,1,238,11,225,225,126,56,122,171,11,167,108,93,207,63,20,12,168,55,27,123,150,3,221,192,191,2,61,197,14,46, - 237,29,33,18,226,25,24,16,192,41,160,19,23,228,183,18,231,177,211,200,100,16,223,207,71,195,49,153,101,27,44,53, - 112,235,126,120,113,254,247,126,123,240,173,239,123,167,60,103,195,58,72,106,24,19,211,116,201,19,50,19,141,46,10,150, - 91,28,24,215,76,62,48,25,2,36,5,72,171,177,105,132,169,149,137,42,179,68,213,50,146,132,32,8,81,249,118,200, - 119,160,113,6,240,202,104,170,83,99,36,213,10,214,56,51,47,164,92,224,142,180,230,118,67,24,150,216,246,212,65,62, - 119,251,151,209,8,226,212,117,50,82,24,148,244,24,28,28,162,90,173,146,36,73,166,94,135,52,141,105,111,47,81,106, - 239,96,112,112,8,47,195,17,140,214,204,77,207,16,6,65,203,106,85,52,59,59,107,241,149,211,143,149,43,101,186,187, - 187,168,84,202,140,143,143,83,42,149,220,27,46,73,48,64,172,83,154,214,23,82,57,142,75,163,30,115,96,223,97,46, - 187,228,18,226,164,138,16,154,3,123,199,248,240,135,190,192,181,215,189,16,223,115,223,175,132,139,148,110,254,222,32,200, - 243,192,3,223,228,228,196,52,203,55,174,198,16,97,76,13,79,88,20,37,192,199,11,156,53,171,181,26,37,125,172,17, - 238,98,53,150,246,206,18,151,92,118,46,43,87,13,211,168,205,179,122,213,114,188,98,158,169,39,118,233,155,31,223,62, - 126,109,165,177,115,253,220,252,211,203,79,142,77,136,237,79,199,251,238,190,87,124,253,129,111,122,135,15,159,82,34,223, - 70,190,187,141,192,47,96,82,71,53,182,56,147,181,158,222,62,214,12,173,48,171,62,250,133,164,99,219,46,238,186,239, - 126,83,238,108,147,203,54,110,20,18,141,212,25,195,93,57,156,78,96,178,205,149,204,54,84,11,162,204,214,184,147,145, - 244,154,197,164,89,128,90,235,115,165,144,202,59,205,92,77,74,47,219,106,57,224,218,102,226,81,129,43,46,82,218,108, - 11,237,181,164,46,94,107,228,118,62,220,82,101,110,147,25,77,180,233,229,228,249,62,65,224,103,108,124,215,121,57,44, - 203,100,210,25,215,77,53,77,236,90,64,186,84,25,171,27,164,53,52,226,10,202,19,172,186,241,133,42,58,127,67,223, - 222,71,30,29,41,205,213,122,67,80,101,152,223,12,101,1,73,4,44,125,219,219,158,191,5,104,60,251,119,219,128,23, - 3,251,129,92,86,68,244,247,241,145,56,182,131,232,114,78,132,235,36,172,46,231,219,59,123,175,186,74,245,118,117,183, - 14,238,66,116,174,204,76,157,108,139,7,198,162,216,149,197,198,222,2,11,38,193,52,230,73,107,243,196,245,42,58,137, - 241,124,69,144,43,161,114,29,200,92,59,86,6,174,179,209,154,168,60,77,52,63,135,53,41,137,78,91,119,134,36,137, - 51,31,95,137,18,78,45,237,7,37,62,253,153,47,179,99,247,94,132,39,73,83,227,46,62,157,98,181,165,183,183,159, - 32,240,93,17,3,226,36,194,247,61,148,39,201,23,139,12,12,12,18,134,1,74,10,226,70,131,153,217,25,74,109,165, - 204,145,207,1,210,2,119,65,75,41,169,215,234,76,79,79,211,209,222,65,20,69,84,170,21,242,249,60,73,146,32,148, - 114,14,50,217,103,173,181,83,170,251,146,131,7,142,114,244,240,9,70,134,251,24,25,233,167,222,136,249,236,109,247,242, - 133,219,239,181,227,147,147,246,170,107,46,22,70,39,89,132,112,132,16,62,18,69,41,95,96,106,42,226,111,255,224,239, - 141,61,62,97,251,87,111,20,29,221,157,40,13,54,13,156,207,178,202,116,75,77,2,103,6,176,198,113,138,242,5,73, - 18,209,222,86,224,188,205,235,81,50,65,134,30,39,31,221,101,58,30,223,177,43,116,180,175,47,21,224,169,101,112,112, - 147,182,199,214,77,206,141,182,109,219,53,123,242,142,187,204,211,79,110,15,170,94,222,107,95,177,78,180,183,119,96,83, - 221,186,80,251,134,134,197,209,71,182,177,98,116,44,218,56,95,157,62,118,239,55,27,219,43,149,220,240,69,151,200,246, - 146,71,156,206,131,240,90,248,152,204,58,3,107,51,183,1,227,120,60,77,140,167,233,119,36,165,204,162,178,29,251,76, - 41,185,16,13,155,45,10,164,204,198,160,236,66,111,74,6,29,107,221,165,152,98,44,86,184,116,18,229,57,221,97,115, - 141,191,248,103,54,109,81,140,209,25,55,75,162,148,199,212,212,12,199,142,31,39,73,52,93,93,189,20,10,237,88,235, - 225,41,191,165,49,107,254,91,23,86,96,22,109,218,50,66,43,26,169,242,206,21,179,49,199,242,13,171,233,186,233,166, - 210,131,79,63,61,28,30,31,239,233,0,149,56,190,208,124,47,196,67,111,123,219,243,119,4,107,221,9,50,240,250,1, - 96,45,240,170,53,43,145,97,232,248,41,223,75,125,148,146,122,185,98,211,19,39,79,73,184,175,23,66,190,124,199,245, - 255,120,205,182,115,47,253,139,63,41,189,241,205,63,142,34,70,39,213,150,8,112,97,173,105,221,217,207,236,11,108,54, - 79,59,115,246,24,29,85,208,245,26,186,81,93,24,159,188,128,48,95,64,132,29,224,231,29,144,104,65,144,146,68,21, - 170,243,115,45,221,148,144,2,171,29,17,77,103,134,237,205,45,135,20,130,70,148,178,119,239,33,151,78,33,83,144,10, - 147,56,64,51,142,99,170,149,50,29,157,157,24,107,168,204,149,209,58,37,232,238,106,49,97,141,209,132,97,128,213,134, - 122,189,230,180,77,74,182,212,211,58,251,221,178,201,164,21,144,36,9,149,74,133,122,189,78,177,88,92,192,30,22,105, - 102,141,78,177,169,135,111,37,229,104,134,35,39,142,114,238,218,77,220,123,223,253,172,95,183,132,253,123,70,57,116,100, - 154,141,107,86,26,241,137,207,148,111,31,110,235,120,249,79,189,74,216,250,52,146,46,172,6,45,171,36,54,101,100,100, - 41,175,8,84,188,241,35,95,168,238,253,242,131,118,246,103,222,216,177,226,199,110,240,11,237,17,34,138,177,186,13,76, - 1,107,99,16,117,132,72,200,231,139,236,217,125,152,157,187,246,242,19,111,122,5,181,250,28,113,84,7,163,240,108,129, - 40,74,45,48,7,236,177,240,144,15,186,14,29,30,116,23,160,167,4,35,75,27,233,186,232,225,167,55,158,124,108,247, - 198,219,207,253,226,138,252,141,47,40,92,116,227,229,172,94,210,139,213,41,65,201,67,191,248,74,255,240,227,91,103,214, - 192,225,203,82,91,63,252,193,207,45,253,244,99,59,151,109,250,213,159,204,95,126,213,5,248,141,50,73,156,100,9,166, - 54,99,60,123,25,197,126,193,186,214,247,61,148,148,36,81,228,248,62,86,144,232,20,79,153,150,32,217,225,52,167,167, - 184,182,44,245,237,98,91,219,76,47,47,133,147,50,89,73,20,167,25,111,200,203,206,143,110,42,104,157,5,136,92,196, - 1,178,78,30,210,209,217,133,69,242,205,111,62,198,39,15,221,206,154,213,235,184,224,130,243,105,235,110,39,95,244,40, - 20,10,248,210,221,112,146,216,121,133,59,174,216,130,127,139,38,64,89,75,206,226,88,231,147,83,12,15,247,240,186,143, - 189,179,248,201,63,252,203,203,226,15,124,161,125,9,20,186,193,36,176,29,168,63,247,5,200,146,9,13,5,207,85,148, - 152,201,112,160,49,224,43,253,125,204,108,62,151,174,158,30,12,180,192,211,239,92,233,26,144,236,217,107,87,125,234,179, - 243,231,192,19,85,152,235,133,137,87,157,56,57,245,165,159,253,239,151,60,246,181,123,251,127,230,183,127,157,243,206,57, - 7,72,177,182,138,209,73,214,146,11,240,146,108,26,203,185,243,29,213,137,230,231,169,215,103,93,38,148,21,110,87,32, - 12,129,231,225,23,125,100,62,135,48,29,238,46,164,18,231,110,152,132,232,234,44,38,213,104,75,118,23,116,109,182,214, - 137,203,231,82,77,63,22,141,31,230,217,179,239,48,7,15,31,192,147,57,103,195,160,117,6,110,250,104,171,105,36,41, - 189,65,72,17,231,37,236,251,33,190,23,18,4,5,164,80,212,171,53,68,175,3,64,157,209,216,194,69,161,117,38,139, - 200,18,19,92,70,188,3,45,171,149,10,213,122,149,238,30,103,47,234,186,51,55,22,26,1,158,239,17,39,154,36,181, - 28,63,58,74,95,119,23,202,179,76,207,215,185,239,193,157,204,205,84,233,94,210,77,116,106,55,47,129,220,248,59,62, - 24,223,221,217,21,220,242,186,91,69,50,119,10,148,135,79,9,105,37,29,29,17,43,194,180,214,3,79,119,79,78,29, - 159,249,171,127,24,217,122,207,215,206,89,250,43,111,236,93,118,233,133,120,34,135,174,213,92,232,30,10,67,74,148,148, - 89,189,98,132,191,248,155,247,50,173,125,126,230,45,47,67,86,29,238,148,164,30,179,115,53,177,44,75,203,243,33,250, - 123,168,253,24,204,215,225,100,59,120,62,20,2,231,203,189,114,185,54,23,13,111,219,121,201,161,109,59,55,125,249,179, - 159,95,90,184,229,134,252,245,175,125,57,27,58,218,88,127,227,53,60,254,206,15,229,245,116,57,74,225,209,165,240,68, - 207,211,251,207,219,241,43,127,188,233,99,111,120,197,240,205,191,240,122,213,91,8,73,234,21,148,13,157,75,161,15,202, - 198,32,36,146,16,223,151,236,216,190,23,223,111,99,243,133,231,17,37,51,152,40,65,105,133,39,116,230,9,21,128,20, - 232,36,109,185,73,186,162,147,96,154,182,45,74,181,240,31,33,157,231,135,77,45,86,57,5,190,78,242,116,246,14,80, - 77,43,40,147,34,18,75,98,157,24,217,36,206,176,77,91,183,1,13,124,144,194,167,191,119,128,87,189,252,165,236,220, - 181,155,183,191,227,159,249,219,183,255,189,61,167,123,64,247,118,180,201,225,85,171,200,47,25,22,157,157,29,98,253,198, - 245,116,46,233,161,20,122,4,197,144,124,144,119,72,145,1,235,187,27,87,65,135,40,235,209,16,208,217,83,228,13,239, - 248,43,245,129,246,190,115,27,239,254,104,178,58,110,28,10,225,72,179,0,137,231,16,227,117,107,232,36,114,219,158,231, - 120,125,46,129,39,30,124,132,244,193,71,184,165,179,147,183,175,90,197,202,222,94,82,192,51,250,59,250,57,218,83,20, - 199,79,177,6,236,131,80,94,15,187,125,40,123,48,254,234,56,62,245,228,7,62,116,229,223,125,249,171,203,250,94,245, - 178,252,117,175,125,37,215,93,117,57,249,176,132,181,115,78,179,147,6,88,34,226,122,149,202,220,20,245,202,73,108,195, - 93,176,94,16,226,169,28,72,139,23,128,231,229,240,189,65,87,144,189,6,72,141,16,121,182,62,190,27,79,39,172,94, - 94,114,153,88,102,33,165,50,77,210,204,103,199,3,163,157,225,148,181,72,229,243,212,246,167,169,215,27,72,175,13,171, - 117,102,239,96,49,110,209,66,189,81,71,72,153,97,64,30,185,92,142,32,8,73,226,196,197,23,27,67,26,39,196,73, - 66,20,69,132,97,216,178,90,245,148,215,242,126,110,102,72,181,214,237,88,226,56,162,80,200,19,199,206,211,198,233,151, - 60,71,48,139,99,132,176,196,137,165,90,174,51,50,52,76,20,53,40,181,117,113,223,55,30,165,222,104,112,222,249,231, - 50,174,149,72,160,182,57,181,243,143,253,245,187,218,30,235,42,117,95,114,203,229,34,173,52,32,81,24,25,227,21,75, - 200,124,71,156,50,179,195,74,238,106,183,116,151,30,217,121,249,232,127,251,189,45,135,174,190,116,101,215,155,94,221,177, - 250,178,245,180,11,73,28,91,82,91,192,143,35,6,7,218,184,238,234,139,237,29,127,255,47,186,61,158,151,175,253,201, - 215,72,223,143,105,152,148,106,181,134,128,192,56,83,8,249,112,198,1,219,3,122,35,232,21,16,245,194,220,78,56,209, - 7,251,125,216,190,14,182,172,62,56,122,209,158,119,126,120,237,55,110,255,218,240,137,87,190,164,125,203,207,254,184,232, - 127,221,43,75,179,239,254,80,169,13,142,196,240,100,14,30,187,34,73,175,222,247,161,219,94,240,222,39,182,158,115,245, - 111,252,82,120,229,69,235,208,209,156,179,242,208,30,66,120,248,138,140,119,229,156,12,254,252,143,255,214,252,196,229,87, - 214,174,121,229,11,67,127,197,144,111,83,13,73,197,157,79,98,132,245,91,145,211,218,58,111,33,79,132,46,11,77,8, - 140,145,11,221,144,112,238,142,214,6,36,86,211,222,222,197,195,95,127,154,233,250,94,70,54,44,165,171,179,68,87,80, - 164,80,242,240,177,232,68,99,116,66,170,147,44,214,59,193,10,227,168,4,82,113,225,249,235,249,231,119,253,61,31,248, - 192,199,236,204,59,62,208,120,113,66,88,127,124,167,152,130,186,133,153,3,158,31,197,189,237,121,57,212,87,202,15,244, - 250,221,93,189,150,124,65,106,15,225,231,124,26,113,34,210,68,136,40,182,162,166,181,80,57,161,148,178,178,160,125,142, - 118,150,250,151,159,106,116,10,199,200,193,211,139,52,42,223,119,167,34,21,65,146,176,121,231,3,168,36,250,129,140,100, - 194,97,56,44,153,157,101,199,19,79,224,175,92,201,165,235,215,49,154,47,226,39,201,183,237,186,140,231,225,123,62,5, - 224,239,129,235,161,241,135,112,100,43,84,27,48,113,17,28,222,52,54,118,241,142,127,254,215,141,31,253,200,39,134,63, - 245,194,23,22,110,250,137,31,231,250,155,46,101,160,171,155,164,82,229,212,177,253,68,245,58,58,173,97,68,10,66,226, - 217,60,8,65,24,8,148,50,120,42,36,8,123,17,170,4,54,198,120,21,148,232,228,201,39,182,242,207,127,247,65,254, - 247,31,253,12,86,85,80,34,135,162,66,108,155,137,74,11,138,116,99,28,111,68,10,73,146,194,182,167,158,206,146,33, - 88,72,86,0,140,73,65,26,146,164,129,53,9,81,92,199,247,21,160,49,54,205,70,170,148,122,189,158,229,77,185,181, - 124,144,249,251,52,199,5,167,144,23,45,207,104,128,192,119,49,47,190,231,103,29,83,102,33,225,172,11,221,198,204,243, - 65,107,142,30,58,72,169,173,216,2,84,133,16,116,116,180,211,209,217,65,26,43,84,216,41,82,24,53,240,196,249,213, - 70,238,208,31,252,237,69,79,21,255,96,213,249,215,93,33,146,169,57,18,157,71,22,3,212,208,128,210,219,15,207,43, - 196,30,35,152,53,214,238,29,210,118,71,116,239,195,23,159,120,232,209,243,199,206,95,183,180,235,229,47,111,95,253,162, - 43,68,79,41,79,82,241,41,91,201,171,111,125,161,221,248,190,79,234,218,63,124,216,124,106,223,17,239,210,95,253,111, - 114,229,186,62,130,66,160,44,120,10,100,10,66,122,138,255,91,12,185,38,78,145,245,152,62,87,140,204,19,80,253,125, - 56,180,31,78,85,97,175,128,39,206,133,245,201,209,209,115,103,254,225,223,206,125,236,190,251,87,207,14,247,23,151,64, - 93,193,116,10,251,82,56,96,224,248,42,24,239,222,121,160,250,185,95,255,223,23,236,251,169,215,151,222,240,166,91,241, - 61,75,28,37,120,228,144,120,136,32,161,30,85,217,176,121,35,231,93,112,142,173,124,240,227,250,196,231,190,24,249,55, - 191,48,237,252,137,87,230,58,214,12,8,17,105,116,212,128,36,1,153,102,17,105,46,225,213,26,144,66,97,132,108,197, - 221,139,204,122,54,53,26,105,37,82,248,8,242,12,140,172,225,61,63,253,139,201,13,105,61,153,238,235,150,141,174,110, - 149,95,187,214,27,220,184,94,244,175,24,97,201,146,126,58,219,114,132,129,165,16,148,48,217,150,20,43,136,26,41,190, - 87,224,23,126,225,151,229,189,203,55,22,239,251,179,191,49,151,159,154,176,23,65,57,130,167,72,147,29,140,77,233,116, - 108,170,207,64,91,234,80,133,86,146,116,152,33,88,6,2,235,188,208,187,50,71,160,74,30,182,106,41,247,42,225,188, - 236,213,139,151,174,19,205,20,200,239,235,67,41,66,157,226,237,124,128,115,230,38,233,200,212,228,223,207,22,172,23,120, - 20,184,52,91,199,55,181,90,2,56,31,248,48,176,105,118,150,63,59,118,156,253,198,80,238,237,117,140,228,111,225,3, - 98,165,196,171,84,216,116,242,36,95,7,206,3,86,128,249,18,212,150,194,120,10,71,20,28,29,129,83,23,71,81,165, - 125,207,30,253,224,231,110,247,63,249,149,123,195,121,191,32,214,174,94,74,163,122,16,17,73,156,223,118,128,17,78,135, - 19,248,142,206,46,101,72,174,212,133,42,118,160,101,10,94,29,37,251,184,247,158,199,245,47,191,241,231,163,11,182,108, - 244,94,250,170,43,132,49,57,68,90,192,36,51,36,38,33,73,13,198,56,98,159,109,234,115,16,72,79,50,51,23,241, - 177,143,127,142,249,114,29,169,194,150,126,168,169,138,22,210,97,11,195,35,195,84,202,101,146,36,33,78,92,183,146,203, - 231,40,20,74,228,139,37,250,250,250,91,152,78,46,151,35,151,203,157,230,78,208,36,162,57,16,186,70,163,222,192,90, - 71,74,108,235,232,68,8,209,50,44,203,96,119,60,47,192,232,148,167,182,61,201,146,165,75,90,155,65,169,20,129,23, - 226,41,143,48,204,49,55,53,46,250,247,238,58,220,109,184,67,195,99,157,81,194,145,7,30,239,143,54,109,236,24,94, - 61,76,18,205,33,61,143,234,227,59,35,182,239,123,82,89,30,46,88,142,90,24,175,101,231,165,215,216,147,157,39,38, - 231,167,238,126,64,60,177,125,87,219,76,247,176,223,183,118,25,129,151,208,222,214,43,78,126,253,97,214,142,77,84,139, - 251,143,206,222,245,245,251,189,249,225,165,126,189,28,137,182,199,183,141,118,194,55,107,176,111,255,210,222,248,134,151,92, - 140,89,210,203,138,147,211,244,68,9,51,64,21,208,171,151,216,125,133,48,233,105,196,179,210,152,227,53,56,32,224,64, - 9,78,20,199,39,199,242,251,143,28,42,193,99,10,30,213,112,34,7,101,13,211,26,38,11,80,63,55,74,228,177,71, - 159,108,187,251,192,201,226,208,5,231,139,190,238,18,58,78,193,170,44,119,76,18,248,121,180,240,101,253,174,251,88,87, - 139,166,234,59,247,28,63,126,215,125,241,201,169,185,92,95,111,191,144,253,93,210,10,139,48,54,211,214,57,50,163,208, - 110,60,246,164,135,20,94,198,168,118,157,144,242,220,6,214,74,103,96,56,48,178,18,253,196,86,125,209,238,253,51,107, - 103,202,187,87,158,60,245,116,251,142,93,19,115,247,220,95,59,246,149,187,211,167,190,118,31,15,60,252,184,183,239,216, - 184,56,49,17,83,77,61,252,124,158,66,123,59,126,222,177,216,173,110,176,225,220,13,162,235,186,203,229,103,246,238,146, - 246,196,68,60,12,71,19,120,60,133,135,44,60,98,224,9,31,30,43,192,163,1,60,18,102,31,121,120,196,135,199,61, - 216,25,194,174,188,235,22,191,33,224,94,223,218,237,135,172,157,217,244,182,183,25,245,146,21,231,56,127,145,239,241,67, - 72,1,65,192,188,73,97,251,253,12,206,79,209,151,97,54,63,140,2,180,18,120,181,214,148,38,39,41,38,9,7,187, - 58,91,6,234,223,174,0,125,3,216,12,228,129,29,96,127,22,226,131,48,171,225,164,128,131,22,14,247,192,177,243,77, - 58,179,124,116,212,124,253,11,119,228,239,124,234,80,126,217,69,235,24,236,107,39,137,28,211,85,18,226,7,41,82,20, - 193,20,201,183,43,194,206,14,180,42,146,98,240,85,192,189,119,61,200,87,222,244,179,213,181,227,39,167,110,253,223,191, - 218,182,124,245,106,169,100,55,245,250,52,81,189,74,28,107,180,112,185,230,82,169,69,32,166,196,247,124,246,29,28,227, - 246,59,238,67,27,151,81,165,141,201,120,59,182,101,222,174,60,197,64,127,63,73,146,16,134,97,139,88,88,200,231,105, - 107,239,192,243,3,6,7,7,169,84,42,204,205,205,209,222,222,222,250,190,166,61,135,148,110,11,150,38,9,245,122,157, - 90,173,70,28,199,88,225,128,74,99,140,219,130,9,129,54,218,89,148,134,1,7,15,236,227,228,137,227,12,15,15,83, - 40,20,1,137,209,6,147,26,124,207,35,159,11,153,26,61,70,207,238,221,227,253,134,251,45,60,2,204,245,214,27,109, - 187,190,241,80,95,99,243,154,210,200,234,97,172,81,212,183,29,142,147,199,182,61,225,195,19,59,96,186,0,105,23,148, - 171,48,30,9,14,43,193,145,94,152,30,56,62,158,238,190,243,238,226,131,251,15,149,114,131,35,98,120,195,57,76,157, - 154,162,246,224,35,199,122,96,219,218,249,250,232,182,187,31,236,248,242,216,104,225,220,70,116,178,95,235,7,124,216,183, - 175,171,20,7,107,6,201,21,67,70,67,159,205,135,79,49,3,204,0,135,54,44,231,67,29,121,57,210,209,97,143,143, - 79,197,1,148,115,112,202,194,97,96,79,0,79,120,240,100,93,136,163,58,80,245,131,66,216,47,26,155,92,15,179,21, - 24,19,48,177,222,82,111,63,116,212,191,247,193,199,59,146,145,149,254,202,117,43,193,68,24,237,52,88,88,75,123,87, - 7,163,247,127,179,209,55,53,191,61,128,123,219,106,141,253,114,235,174,74,245,174,175,219,164,26,133,114,100,73,40,59, - 219,178,248,69,7,40,123,74,183,54,175,205,121,64,168,166,215,143,51,169,55,194,45,37,242,249,2,39,103,102,100,124, - 223,67,39,74,136,175,74,248,98,9,158,88,1,79,175,77,210,189,235,102,203,199,87,30,25,157,146,143,110,175,142,223, - 253,141,248,208,61,247,153,167,190,122,143,61,240,228,14,230,199,103,68,106,60,225,229,138,104,1,75,150,143,112,201,43, - 95,204,214,208,43,28,222,177,163,115,56,210,70,194,9,3,79,3,251,103,225,216,1,56,49,14,39,230,225,196,180,251, - 56,94,132,99,2,14,249,176,199,135,157,13,120,58,129,35,67,48,247,215,160,223,248,182,183,225,9,249,125,64,197,82, - 210,240,2,134,70,15,145,28,218,201,88,117,158,149,63,34,211,176,26,112,245,161,67,220,118,242,36,226,242,203,88,210, - 209,65,242,221,2,212,192,0,104,237,214,132,149,125,48,154,194,118,3,143,117,193,133,111,49,233,165,7,238,252,220,249, - 31,219,241,224,234,235,255,248,55,11,215,94,117,1,113,89,59,169,187,9,176,214,195,47,6,228,218,219,209,170,13,132, - 36,39,75,124,225,75,119,114,255,79,255,82,114,235,248,132,255,200,138,165,253,43,55,111,86,66,150,72,210,136,90,99, - 14,99,5,214,74,200,172,54,155,160,176,187,187,73,60,21,114,114,116,130,212,56,150,181,209,169,115,198,75,77,166,60, - 119,164,182,52,77,169,214,106,52,50,15,231,92,46,68,8,168,55,26,89,102,151,243,140,158,154,158,98,110,110,142,129, - 129,129,5,155,212,108,164,211,70,163,50,207,155,52,117,164,198,106,181,130,231,251,36,113,130,206,120,63,90,107,242,249, - 60,169,209,68,81,196,83,219,183,227,73,65,165,90,161,84,106,39,8,66,26,245,26,105,154,96,140,231,112,138,92,136, - 17,228,51,130,123,213,131,71,19,40,108,158,156,11,182,255,250,159,95,227,255,253,255,238,63,247,134,23,210,144,70,130, - 75,201,121,8,196,91,193,222,13,118,9,212,102,45,117,96,178,33,196,49,15,14,92,147,166,7,199,239,184,247,138,39, - 239,121,96,237,209,87,221,218,21,172,88,45,165,146,149,78,109,190,14,204,223,92,111,28,89,115,108,236,188,46,216,149, - 194,148,5,253,226,137,57,246,221,189,29,5,36,229,6,201,162,243,159,79,13,129,48,70,9,56,1,244,129,93,14,141, - 163,48,30,193,196,90,144,135,193,204,251,210,188,125,197,32,7,106,49,155,142,79,48,15,209,52,28,233,132,57,5,199, - 151,193,161,225,67,199,175,121,236,55,254,232,162,175,253,226,79,12,190,224,167,94,169,2,79,19,55,98,132,214,116,117, - 21,232,190,228,60,191,190,247,120,84,128,29,177,146,7,75,218,12,218,153,249,205,245,127,251,216,150,185,207,127,229,156, - 220,143,191,108,73,223,107,94,150,207,181,21,33,174,97,50,224,88,217,108,3,108,29,7,72,169,192,57,88,26,231,221, - 108,132,32,169,85,24,222,114,190,216,147,15,252,161,70,50,223,64,108,75,5,147,214,216,64,64,187,133,158,60,12,110, - 132,193,77,38,237,53,19,211,131,241,196,116,87,125,247,225,82,237,243,95,27,56,224,121,67,71,6,7,11,233,178,193, - 112,186,183,35,23,172,90,233,47,61,247,60,30,127,237,107,6,30,250,208,39,94,116,101,172,27,10,198,139,48,243,105, - 136,62,212,215,205,96,123,27,7,14,30,109,221,252,127,215,65,28,81,46,107,36,174,200,232,53,197,214,240,254,253,48, - 161,133,36,108,212,8,14,63,206,227,227,71,88,251,28,225,72,223,239,163,22,69,60,241,205,135,185,229,242,203,232,250, - 30,139,144,7,12,131,57,8,213,21,80,59,8,147,9,28,154,23,114,247,10,107,47,93,118,124,226,202,135,126,227,109, - 91,202,191,242,203,3,183,254,216,11,105,164,117,148,113,166,233,165,206,78,164,215,71,66,153,128,28,159,249,216,167,120, - 232,215,126,179,114,203,196,116,53,133,98,254,130,11,242,189,67,75,49,186,76,101,126,28,27,57,5,181,54,41,70,91, - 252,64,185,13,136,118,43,82,109,44,105,170,217,127,240,176,75,193,96,193,71,88,32,72,181,65,41,71,92,75,226,20, - 107,156,245,66,18,167,248,126,64,177,88,36,31,58,249,130,231,121,142,207,83,169,180,186,35,173,77,198,204,21,89,2, - 170,201,220,236,154,210,15,141,214,154,98,91,137,40,170,103,250,38,183,190,215,58,37,151,207,241,248,147,79,114,248,208, - 97,150,45,91,74,165,82,71,14,73,192,9,92,141,78,73,211,8,131,34,150,109,52,82,81,144,216,206,216,193,242,39, - 21,124,221,3,177,121,114,142,253,191,246,167,215,242,119,165,190,153,184,33,187,93,60,149,120,11,240,242,204,175,169,238, - 220,41,237,16,212,235,214,30,30,133,153,72,136,163,157,214,238,185,161,145,108,153,253,216,231,54,77,75,217,222,5,219, - 53,108,87,176,47,129,61,171,140,89,38,92,103,187,207,135,248,162,106,196,37,7,198,91,55,175,33,224,224,34,166,188, - 56,203,242,35,155,108,116,7,232,70,246,30,241,172,68,90,129,201,58,247,127,129,244,245,48,85,133,39,187,221,181,118, - 228,170,36,57,122,236,29,31,184,242,246,3,251,55,92,249,91,191,144,31,233,233,163,81,157,69,10,205,210,27,94,16, - 158,250,212,87,250,243,113,154,151,150,195,8,177,211,90,187,35,132,39,194,83,83,23,215,254,254,253,151,237,251,210,125, - 155,251,222,242,250,129,190,235,174,240,115,93,3,136,70,13,97,83,36,22,147,166,238,153,25,157,73,187,36,224,12,225, - 172,110,48,178,106,5,187,54,172,239,74,158,220,62,4,20,123,44,7,31,2,221,11,19,75,224,112,23,132,51,144,143, - 17,5,129,237,244,160,216,14,133,18,44,85,105,122,142,62,126,124,40,61,126,220,31,0,111,30,218,27,208,115,89,46, - 223,145,211,4,13,33,86,230,172,93,86,129,29,63,37,68,237,215,63,245,46,214,94,123,13,47,125,201,143,243,197,47, - 221,115,26,141,166,150,25,252,93,189,232,152,126,207,82,140,102,247,55,170,35,186,142,236,100,213,232,17,118,192,115,182, - 114,127,46,120,67,68,17,247,126,243,97,174,187,252,50,58,59,58,90,196,188,239,5,240,14,192,182,67,180,27,78,46, - 179,102,182,140,56,26,192,209,107,103,235,149,187,255,234,237,47,188,179,144,239,187,233,213,215,17,71,51,20,114,125,248, - 133,54,12,49,129,24,224,99,239,127,55,123,126,229,183,199,95,90,105,60,29,184,147,176,118,217,11,175,42,42,124,234, - 177,38,169,205,227,153,186,179,68,85,202,217,36,32,72,18,237,232,241,64,16,228,72,146,148,39,183,62,69,35,74,240, - 61,129,177,41,24,213,98,164,57,129,161,19,192,234,212,129,195,133,66,129,48,8,72,19,195,124,92,163,119,64,58,14, - 84,163,65,173,90,35,23,132,217,136,119,198,5,39,197,105,120,16,64,18,199,36,73,12,130,76,107,102,90,65,127,179, - 179,179,220,127,255,55,72,210,148,249,185,121,226,40,198,247,67,146,36,38,142,99,226,36,194,226,145,198,101,148,138,137, - 124,169,68,172,125,235,8,9,169,239,64,233,123,37,232,181,147,51,122,247,175,252,246,213,39,7,10,225,53,80,21,160, - 119,0,247,1,31,3,126,43,3,56,243,110,148,215,255,2,211,55,88,91,85,112,60,22,98,91,27,118,77,187,49,69, - 11,199,37,236,170,194,120,23,140,213,97,123,10,166,46,101,237,27,195,189,122,133,239,157,150,95,158,19,130,227,99,83, - 20,234,17,241,183,120,47,136,51,254,44,206,120,223,231,28,152,109,39,160,254,98,56,44,97,38,129,227,35,48,154,255, - 210,3,47,186,227,196,196,69,235,127,253,87,74,87,93,184,14,157,206,227,15,245,49,223,221,217,63,56,54,57,130,49, - 185,57,24,87,80,109,131,113,33,196,254,146,181,187,114,251,14,93,89,253,253,191,188,120,124,211,186,181,226,101,47,238, - 94,243,226,27,188,222,193,110,68,92,65,103,90,178,38,107,217,136,24,35,20,34,219,156,182,21,187,105,223,114,65,169, - 241,228,246,21,121,88,90,135,253,151,64,101,22,204,16,152,149,144,252,37,84,126,222,90,49,5,199,43,32,102,92,154, - 111,41,129,135,45,116,20,192,203,131,44,66,73,66,31,141,122,95,10,131,218,109,196,70,243,136,184,108,45,203,239,126, - 16,174,125,5,27,54,110,56,173,0,125,39,55,251,239,234,130,180,22,166,106,85,198,100,76,199,98,178,220,243,236,209, - 136,34,190,254,205,135,121,225,229,151,225,117,118,226,125,7,27,178,179,233,198,196,130,67,162,189,20,170,59,176,251,231, - 161,170,133,240,175,141,211,206,47,252,237,187,175,28,216,60,84,218,114,241,58,114,94,63,34,168,33,100,59,31,124,199, - 59,25,251,173,223,61,126,83,212,248,134,134,29,22,86,207,230,139,107,87,95,122,190,80,212,209,181,50,164,150,84,7, - 88,45,209,52,220,109,86,40,84,38,85,208,169,65,169,54,118,239,61,194,201,147,167,92,168,96,22,146,103,50,55,69, - 175,233,189,108,93,56,93,189,94,199,247,61,230,203,179,228,146,156,219,194,120,30,214,172,68,24,67,212,168,97,172,118, - 235,220,38,246,211,202,102,207,248,24,89,122,130,1,231,49,29,69,206,134,213,104,116,154,102,221,86,66,24,6,60,249, - 196,99,148,231,102,41,21,243,36,105,76,35,106,100,99,90,246,243,165,159,177,101,53,185,80,226,11,105,45,90,148,64, - 252,155,235,28,244,159,194,216,46,248,134,133,198,218,153,185,67,29,149,249,110,43,217,17,26,202,87,184,84,52,74,25, - 126,88,207,126,178,6,118,3,111,133,72,193,216,46,107,167,27,176,39,20,194,171,75,17,89,109,170,239,242,189,244,173, - 198,38,161,214,141,195,64,163,187,131,111,44,25,224,65,125,58,101,67,41,201,73,33,248,229,131,39,158,181,0,125,55, - 239,153,28,240,9,208,183,194,76,55,108,77,161,218,13,241,181,219,246,218,79,253,202,111,111,25,253,221,95,45,189,230, - 213,55,83,236,21,212,134,58,58,205,216,228,50,31,250,234,112,98,24,146,97,40,111,149,226,64,155,182,147,33,28,44, - 193,246,252,206,189,151,204,236,220,123,254,163,159,248,236,170,244,69,215,247,174,127,205,139,228,218,149,61,4,113,13,83, - 49,52,82,1,94,128,210,9,74,164,104,37,17,166,74,215,85,23,4,99,239,249,208,170,53,150,115,12,60,5,84,125, - 176,126,118,179,62,226,206,129,109,128,126,218,9,181,211,155,161,113,24,102,134,64,238,2,209,6,98,0,60,1,97,234, - 146,96,58,178,17,234,212,56,182,118,29,80,124,247,135,225,143,222,10,66,127,247,13,195,119,116,96,133,196,0,115,149, - 154,243,167,201,188,75,44,207,223,71,45,138,56,255,155,15,115,217,196,4,137,82,24,241,253,149,74,15,184,0,116,55, - 140,167,214,62,0,124,249,134,137,241,39,119,254,233,59,235,185,96,53,109,61,189,88,217,205,71,255,242,159,152,252,141, - 223,60,246,130,168,113,183,134,219,45,236,139,161,48,191,102,99,199,138,181,27,193,84,80,113,29,163,45,41,22,45,42, - 24,17,103,33,115,26,99,82,164,213,40,233,168,246,123,246,29,165,92,174,226,43,233,66,246,204,226,188,115,219,18,204, - 98,33,77,83,2,223,35,151,11,240,125,137,177,41,65,224,19,6,62,2,75,163,94,39,201,212,210,14,247,113,96,119, - 83,41,45,113,98,198,32,8,9,124,31,107,13,141,70,131,184,17,145,100,192,116,212,104,224,7,62,211,211,211,60,245, - 212,54,2,223,233,146,242,249,128,56,142,136,227,40,187,176,61,60,149,209,249,133,64,6,62,210,247,91,117,206,7,113, - 151,235,50,181,128,49,11,95,71,240,193,37,154,119,74,195,253,101,152,237,7,126,26,120,109,214,253,248,139,72,107,217, - 104,68,135,139,48,140,34,152,94,109,237,169,138,54,115,13,41,210,137,149,35,252,159,229,67,220,213,81,34,1,62,219, - 221,142,106,196,200,40,125,198,71,162,159,219,119,114,0,236,3,251,110,168,247,193,222,58,220,81,144,226,246,31,47,215, - 31,158,250,139,127,152,189,235,182,187,40,118,15,209,253,194,171,75,115,176,82,192,112,55,132,99,192,161,165,195,220,38, - 68,218,6,211,35,240,84,10,183,11,120,111,63,188,103,195,161,163,159,233,123,247,251,31,249,230,27,127,105,226,115,255, - 252,49,115,232,100,3,89,232,193,107,11,65,214,145,194,195,218,34,58,205,147,214,35,86,92,184,145,227,171,151,142,36, - 112,142,129,37,101,8,206,119,16,3,53,22,34,149,197,233,98,109,0,29,67,242,147,16,255,6,68,18,170,19,48,189, - 27,78,204,57,238,220,110,11,147,135,65,231,0,101,191,143,137,229,219,147,11,21,158,209,84,230,43,46,127,92,8,254, - 163,60,186,162,136,223,125,240,33,126,126,199,14,26,158,71,34,229,247,84,54,69,182,153,59,8,108,133,164,29,142,104, - 248,106,27,124,101,237,55,183,239,251,210,255,125,39,141,134,229,206,95,255,221,200,254,238,31,61,125,121,170,191,20,195, - 103,44,60,233,9,81,152,130,165,237,55,95,87,234,236,25,164,17,107,146,52,197,88,13,162,225,140,226,61,7,24,75, - 233,10,137,182,77,27,77,143,67,135,142,208,204,55,183,100,248,79,214,13,37,73,66,146,164,45,169,72,163,81,207,100, - 68,34,35,34,6,180,181,181,99,45,52,26,13,106,149,106,150,7,238,182,93,77,75,6,33,197,130,129,89,22,84,87, - 44,21,169,215,235,206,80,107,33,34,47,243,149,150,60,244,208,131,212,170,85,4,130,192,15,72,181,161,209,168,19,69, - 81,246,124,220,129,51,198,32,172,34,159,47,34,60,217,58,250,33,112,0,248,128,251,179,46,193,244,180,101,207,148,177, - 59,13,140,190,11,226,165,89,231,211,147,73,113,78,102,255,238,91,61,20,48,213,222,70,90,40,112,220,83,226,51,253, - 221,76,251,222,247,124,145,124,175,227,123,30,120,63,240,215,208,232,130,253,210,218,47,74,33,62,241,242,114,253,75,242, - 247,255,252,208,151,254,244,29,182,227,156,243,68,226,201,162,128,124,0,42,41,20,184,125,203,38,246,158,187,156,82,33, - 180,195,16,23,224,148,132,173,53,248,130,17,226,125,67,240,111,215,78,204,222,214,255,183,239,127,228,209,31,255,31,227, - 95,123,251,187,147,137,163,167,80,165,30,76,24,144,40,67,138,65,164,138,174,66,55,118,195,186,194,60,172,148,176,172, - 13,242,191,8,172,206,54,201,143,103,29,219,183,42,12,205,73,96,30,56,1,118,214,221,48,180,1,27,60,7,174,23, - 223,242,225,123,1,113,220,224,166,237,15,242,249,193,181,212,242,37,22,242,35,254,227,60,94,114,232,48,162,82,225,223, - 55,111,102,214,247,191,43,29,153,205,222,76,63,9,124,57,251,218,79,64,227,23,225,64,10,247,244,65,223,145,119,254, - 115,225,75,95,249,106,91,241,177,39,183,173,132,111,212,225,126,31,118,10,65,155,176,118,233,177,32,24,217,252,162,23, - 10,73,149,212,206,97,109,140,180,206,30,65,10,133,209,100,118,12,174,250,184,20,76,69,20,165,28,61,54,234,128,229, - 36,93,176,118,205,56,64,77,187,141,166,104,49,73,19,210,196,145,202,42,213,170,91,183,183,181,163,148,200,54,37,134, - 66,46,143,144,146,56,137,1,129,31,248,24,227,152,177,2,233,214,238,153,71,241,244,244,36,113,220,64,27,77,163,209, - 192,247,125,60,223,103,247,238,61,236,221,179,151,92,232,236,52,172,181,78,31,100,52,229,242,28,185,92,216,26,197,154, - 26,51,63,231,163,23,4,222,173,187,238,59,112,38,85,43,129,74,22,206,209,140,188,94,36,133,250,158,186,109,63,155, - 79,127,20,157,122,243,245,189,23,184,1,26,67,150,253,158,176,243,137,224,248,185,150,35,39,223,247,241,43,230,191,122, - 95,223,160,231,111,51,105,116,18,72,162,98,158,40,244,68,161,183,221,70,199,39,17,181,136,28,216,54,136,231,96,188, - 108,237,108,4,71,66,33,182,143,88,54,143,76,78,159,55,255,222,143,174,63,249,233,47,172,60,122,243,245,35,93,175, - 127,121,113,233,166,85,120,73,21,146,136,156,77,233,187,226,82,111,223,237,95,27,190,18,150,166,80,186,9,102,207,201, - 158,91,31,80,254,46,143,173,92,4,206,243,131,44,64,57,47,96,235,216,17,46,57,180,131,142,90,5,59,178,241,91, - 197,60,63,175,31,22,88,61,49,201,173,15,63,204,23,151,46,37,254,14,95,134,5,84,232,81,236,43,210,103,45,61, - 217,129,175,10,193,234,40,173,111,159,168,238,202,195,23,150,206,150,39,244,99,79,134,30,236,52,176,53,132,99,57,104, - 84,45,189,18,122,231,151,246,119,174,88,51,140,52,9,126,45,160,62,171,72,26,9,90,217,204,46,193,137,65,37,158, - 243,151,22,128,244,40,87,235,204,204,149,93,146,106,83,95,151,233,181,50,143,52,164,116,185,95,22,50,37,123,22,131, - 99,45,149,114,153,84,59,100,67,107,87,68,38,167,166,24,28,26,66,27,227,236,53,117,150,25,134,6,147,105,172,180, - 38,78,98,166,166,167,41,228,29,97,177,214,136,90,69,236,145,71,31,161,88,44,58,83,45,207,195,88,67,181,90,165, - 167,187,135,70,189,65,146,56,47,37,151,129,5,58,241,72,101,129,138,81,207,32,126,236,3,30,2,54,101,221,139,121, - 142,222,220,103,43,6,63,170,71,4,204,66,114,200,114,242,133,80,158,23,156,28,18,98,155,57,62,90,170,11,113,164, - 164,228,158,57,109,26,43,227,152,251,26,117,139,49,46,162,121,209,207,104,119,31,81,25,198,231,173,157,17,66,28,70, - 200,199,74,66,172,108,159,47,159,87,253,212,231,46,57,244,229,187,207,219,127,203,13,131,171,95,249,226,96,205,121,107, - 177,74,177,246,178,45,124,165,191,171,199,156,154,89,146,66,231,18,24,237,118,93,12,41,240,89,92,224,230,143,66,153, - 254,172,191,179,232,7,220,115,226,32,159,223,245,8,55,103,99,216,127,228,135,197,121,10,13,87,107,60,182,123,15,243, - 89,31,247,237,94,149,1,122,54,13,176,230,61,175,227,252,70,210,122,67,4,161,199,145,253,19,54,120,203,39,103,195, - 122,250,88,13,14,27,183,217,153,42,192,108,9,210,237,32,87,128,104,128,39,134,151,132,125,67,75,64,38,164,182,76, - 156,206,145,16,147,106,237,178,211,180,51,244,210,194,173,197,141,209,4,126,200,190,253,123,153,154,158,35,8,115,89,170, - 230,162,43,202,100,209,127,214,233,194,76,150,233,222,244,152,9,130,160,149,243,21,199,49,24,75,173,90,229,216,209,163, - 244,245,15,144,102,244,123,41,165,43,70,153,69,131,84,46,158,55,141,83,78,157,154,96,233,210,17,170,181,90,203,14, - 116,219,142,29,140,79,76,48,60,56,224,114,231,27,53,230,230,202,88,107,153,157,157,161,90,173,96,76,63,158,231,161, - 73,51,103,65,73,42,13,54,244,229,217,238,182,31,199,197,35,249,217,197,250,159,237,225,3,211,238,195,62,12,243,203, - 44,187,114,214,30,77,65,21,125,191,241,84,28,215,255,16,204,137,185,50,183,140,79,225,183,121,207,90,68,219,220,71, - 60,111,237,68,206,218,233,26,28,138,29,227,120,247,134,249,242,11,231,63,249,239,91,14,124,241,43,75,182,95,123,69, - 207,218,55,252,88,176,246,242,43,232,219,120,78,208,56,245,64,78,65,104,23,185,202,248,217,53,48,138,243,109,87,207, - 135,2,84,244,3,238,61,126,128,247,239,126,148,206,31,192,221,232,71,253,40,0,159,92,24,165,190,109,225,66,128,240, - 37,42,149,173,55,129,39,5,81,123,142,193,246,208,60,89,79,103,111,128,249,0,120,59,216,139,221,156,204,52,216,21, - 78,241,59,90,124,122,207,169,143,188,237,15,150,47,191,98,11,253,131,253,12,181,15,225,217,105,114,170,141,184,58,141, - 64,99,108,232,50,161,132,15,66,16,4,121,142,30,61,73,28,155,86,212,110,147,249,108,157,149,139,43,26,210,81,252, - 109,43,194,215,109,183,234,181,58,245,122,157,48,12,241,148,34,214,9,167,38,38,168,84,42,207,72,220,212,38,235,156, - 204,194,10,190,94,143,40,151,43,204,205,151,201,231,10,132,97,200,212,204,12,199,30,127,188,209,38,165,138,226,216,239, - 234,233,116,73,17,137,38,137,28,151,105,102,118,150,254,106,149,66,62,159,153,162,25,148,210,120,42,38,202,73,121,182, - 134,100,183,227,209,240,42,254,115,63,60,96,7,176,20,226,99,16,231,129,210,77,87,146,91,49,200,137,127,250,184,123, - 207,125,155,72,225,69,155,103,91,130,180,8,243,7,160,218,14,51,41,140,182,193,246,77,213,218,218,202,151,190,182,246, - 216,157,247,174,20,155,206,41,92,52,57,121,12,216,173,96,38,6,83,57,227,186,142,29,190,195,16,252,80,199,85,239, - 217,138,207,251,118,63,250,221,173,201,254,131,62,222,149,97,59,133,111,83,133,172,113,24,71,11,143,48,22,180,107,147, - 143,2,189,142,153,195,49,224,66,224,114,96,5,216,105,167,66,121,248,146,169,153,158,177,191,122,215,229,251,61,57,242, - 228,210,161,206,210,133,23,22,251,183,44,83,165,117,151,176,118,237,106,74,254,12,245,90,68,16,228,29,94,163,53,66, - 10,142,30,61,74,162,173,75,218,104,122,49,11,167,126,55,194,100,91,48,183,138,39,179,224,108,90,105,68,113,140,78, - 83,252,192,39,8,3,202,243,21,102,166,167,221,184,102,108,43,230,87,9,73,98,210,140,5,237,108,65,165,116,88,144, - 167,60,242,249,2,113,148,224,43,159,189,251,246,243,170,169,169,169,109,61,221,249,131,97,208,45,148,114,91,81,79,97, - 234,49,198,58,32,60,142,35,114,97,136,20,206,49,47,77,53,167,166,230,145,58,80,153,171,18,157,96,123,178,21,187, - 197,241,125,150,0,23,253,144,47,130,31,5,54,180,248,186,210,75,6,24,122,221,141,144,21,160,239,118,172,44,0,79, - 128,190,2,166,82,167,191,218,39,161,175,0,203,55,26,189,212,108,223,30,26,152,180,82,238,212,198,140,111,2,179,129, - 103,26,52,75,135,193,177,251,71,85,128,206,44,62,207,199,49,202,126,171,78,229,123,120,236,199,153,223,255,222,115,244, - 28,115,192,71,129,123,178,150,251,106,168,156,11,79,104,152,29,134,39,71,82,179,70,31,58,177,180,118,232,68,127,249, - 51,12,29,232,40,141,60,116,238,218,174,53,175,185,53,184,238,166,11,32,73,49,54,64,72,69,189,150,242,244,206,253, - 68,105,130,239,41,23,5,148,113,126,180,113,186,32,165,188,214,129,145,66,97,172,35,11,166,105,74,20,69,72,169,240, - 85,72,146,164,212,234,53,202,213,50,169,78,152,153,157,164,189,171,141,36,73,145,210,169,223,61,33,208,169,198,42,231, - 114,23,248,30,74,73,106,229,50,126,143,199,241,153,9,186,79,30,169,94,232,137,233,199,69,184,52,78,34,82,29,19, - 120,121,106,166,1,194,144,36,49,141,70,204,220,220,60,133,124,17,37,4,66,26,142,29,29,101,223,137,99,108,136,202, - 210,66,177,12,185,95,3,249,151,89,94,195,226,115,248,24,206,61,204,240,255,200,35,77,73,171,245,239,235,71,152,108, - 34,159,131,218,90,168,165,48,49,9,135,114,144,87,66,72,35,101,162,181,174,134,16,165,223,98,252,249,97,99,101,222, - 243,181,248,216,179,108,63,100,118,119,236,18,66,230,133,224,45,198,216,243,129,186,227,129,144,126,31,7,240,95,221,29, - 153,151,63,7,179,254,195,89,39,4,112,23,152,79,193,140,15,79,213,224,160,231,172,96,123,124,232,25,128,21,75,231, - 42,91,230,31,120,242,226,175,76,79,175,191,232,218,75,242,29,57,139,173,67,222,11,24,155,172,48,54,117,18,223,115, - 62,65,206,22,214,37,17,52,237,51,28,33,217,189,106,99,156,249,124,24,6,132,97,64,20,53,16,66,81,42,181,161, - 148,199,204,236,44,81,163,129,84,146,233,233,41,150,44,91,146,117,47,26,161,157,19,162,148,210,129,210,198,1,219,243, - 115,51,4,74,146,6,146,147,199,14,218,159,47,151,119,14,167,246,120,151,79,71,156,212,58,203,179,51,148,74,61,228, - 194,128,164,94,195,90,147,217,126,164,40,207,167,90,174,112,252,248,113,70,79,142,146,120,130,137,134,9,82,23,21,215, - 61,233,204,192,158,193,253,91,130,147,94,180,159,229,61,225,101,56,133,230,191,30,103,219,78,153,236,184,41,208,71,161, - 50,0,21,191,144,231,112,103,59,246,196,216,183,223,60,253,40,10,80,201,15,184,231,135,92,124,100,230,222,159,1,14, - 167,223,16,178,55,153,196,41,225,113,40,189,88,46,68,174,96,109,151,18,162,77,11,33,127,25,140,6,61,6,113,27, - 204,231,96,190,243,123,188,113,158,194,81,253,159,2,126,253,57,124,157,198,117,69,86,64,60,235,136,101,51,195,112,244, - 8,248,41,108,5,118,151,96,118,243,190,35,165,135,62,243,232,154,87,252,220,139,136,235,179,228,148,199,145,147,135,152, - 169,214,9,50,202,157,102,33,218,89,156,102,21,75,43,194,215,121,240,116,48,54,54,70,181,90,109,121,243,52,85,237, - 113,146,64,98,153,158,158,166,86,173,17,71,17,190,239,172,52,13,206,228,160,201,51,82,74,209,219,211,231,120,64,149, - 10,29,149,114,125,189,101,42,134,184,88,176,169,177,41,81,37,38,31,54,144,38,193,24,75,45,170,227,123,1,149,74, - 5,157,166,204,204,204,112,252,248,9,82,29,225,135,57,142,7,65,190,2,61,237,208,86,1,249,123,110,59,116,26,248, - 41,178,177,108,219,25,199,50,1,254,12,120,159,27,121,255,235,241,109,138,145,93,116,60,237,162,209,239,249,52,222,122, - 29,65,142,175,30,219,199,251,127,136,197,71,0,181,52,161,166,19,33,114,69,100,154,218,102,225,153,119,237,119,216,13, - 109,83,80,58,7,228,28,36,155,17,73,44,212,176,181,233,197,21,99,214,104,240,27,144,134,142,137,57,147,192,142,10, - 60,249,155,48,62,233,138,18,179,223,67,27,255,33,215,181,112,103,118,17,60,87,175,183,201,48,77,192,46,117,192,97, - 122,24,234,26,234,17,20,86,165,44,253,234,63,189,179,247,241,115,251,58,95,112,233,38,76,108,216,189,247,8,105,234, - 17,72,141,16,6,107,85,43,21,193,117,60,38,51,46,115,0,178,51,47,183,248,190,79,189,94,119,172,232,32,32,159, - 119,78,134,113,28,19,71,49,22,195,252,220,28,113,20,97,180,195,125,48,6,154,60,164,204,116,44,8,67,250,251,7, - 24,30,25,228,224,241,147,204,167,135,180,208,182,77,66,187,110,196,62,97,145,52,85,232,84,210,214,214,78,146,66,165, - 92,161,90,173,50,49,49,65,28,39,116,117,117,209,221,221,197,201,209,19,144,164,32,172,48,66,120,202,90,85,5,241, - 101,156,213,174,127,150,110,39,231,192,218,211,58,225,175,3,247,2,111,248,175,26,243,159,3,148,255,231,29,15,242,240, - 248,177,31,218,88,5,153,255,206,212,73,222,246,228,221,246,47,58,251,81,167,142,52,145,120,175,12,61,33,172,246,96, - 163,116,221,120,232,65,69,99,103,165,213,195,147,112,237,216,11,175,61,239,188,23,92,42,102,39,39,244,215,239,123,208, - 118,60,189,119,242,74,120,56,114,222,190,247,127,22,198,151,131,249,48,176,231,123,120,158,163,192,205,25,56,253,214,231, - 104,46,22,103,220,153,194,236,2,27,135,121,207,25,116,223,127,237,236,204,242,175,188,245,207,207,143,254,244,119,243,183, - 190,248,6,14,29,61,134,109,8,116,62,71,98,26,88,76,11,136,110,146,16,91,157,86,182,189,114,49,44,130,70,163, - 225,142,117,62,79,24,134,204,206,206,82,46,87,156,197,134,175,72,146,132,90,181,138,213,198,113,90,105,70,234,209,202, - 187,87,202,3,41,41,150,74,188,232,133,55,178,173,187,163,248,205,219,62,222,251,210,24,211,83,179,70,229,114,4,185, - 60,169,182,120,40,124,223,39,159,207,145,38,186,37,219,104,111,107,99,249,178,229,204,151,231,169,233,24,109,61,18,161, - 66,109,211,188,15,222,83,124,119,225,147,54,187,81,213,255,235,218,253,207,81,128,238,31,61,252,67,41,60,249,69,179, - 251,91,64,204,3,249,218,60,203,106,243,210,130,122,28,194,14,24,66,136,203,140,181,87,31,18,226,130,253,109,249,145, - 178,231,7,75,202,149,202,154,68,79,117,89,27,142,14,14,44,187,244,207,254,160,125,96,73,55,131,186,206,242,95,253, - 73,238,248,200,167,186,238,251,235,127,41,93,19,107,171,161,190,23,238,15,97,214,251,62,218,205,49,224,175,113,174,89, - 127,225,73,46,15,60,102,107,9,223,143,10,165,153,240,33,113,196,187,221,174,48,217,115,96,70,193,145,18,76,174,28, - 157,136,126,251,247,254,62,191,231,104,196,145,99,147,248,158,33,53,202,229,145,147,182,58,158,230,248,181,240,57,91,163, - 91,75,28,199,148,203,142,151,211,214,214,70,163,209,200,64,233,6,82,58,161,105,28,199,212,106,245,108,156,115,193,132, - 126,150,57,238,140,254,21,65,16,16,197,17,59,158,126,26,99,44,231,93,118,177,124,104,244,196,242,13,247,126,99,180, - 61,49,137,78,35,27,9,45,146,58,200,176,68,154,56,158,82,169,88,68,72,183,137,51,198,80,106,43,177,102,205,90, - 158,220,177,29,163,13,13,107,187,36,44,139,160,227,56,84,58,157,24,242,59,46,244,2,199,222,205,204,40,254,235,241, - 31,185,0,61,151,128,113,83,165,108,179,121,61,7,108,2,177,20,188,13,142,89,95,24,135,194,171,193,111,146,160,170, - 80,208,208,51,15,189,1,172,173,90,123,213,232,186,85,151,180,255,204,27,251,46,95,191,138,64,133,236,123,236,137,222, - 59,191,124,207,210,104,215,238,116,175,151,250,235,38,142,146,51,147,40,105,200,123,138,159,124,243,171,248,55,196,208,67, - 127,250,206,23,92,13,83,198,137,230,182,11,168,174,201,166,176,239,181,110,220,11,188,124,207,4,159,127,242,4,151,159, - 55,196,108,57,250,174,139,80,179,8,158,4,190,8,252,21,142,108,55,147,225,77,109,144,171,67,239,140,16,61,95,90, - 186,169,237,156,45,215,51,58,238,115,228,248,52,50,144,36,137,70,170,44,86,165,25,137,44,23,46,189,166,129,188,51, - 17,211,84,170,85,26,141,70,22,1,227,183,204,198,92,18,134,32,8,2,146,56,166,50,63,15,38,75,212,108,30,33, - 65,43,39,94,74,69,177,80,32,73,19,142,28,57,194,255,207,222,123,135,89,118,149,87,222,191,189,247,57,231,158,155, - 43,231,234,234,156,179,164,86,4,101,129,4,152,12,6,27,99,123,28,39,224,48,51,30,143,103,252,217,51,223,140,199, - 51,159,51,99,112,24,27,27,147,49,89,36,33,161,156,67,119,171,115,206,149,211,205,39,237,189,191,63,206,173,150,192, - 2,36,1,99,140,123,63,79,61,221,93,93,85,125,251,222,123,214,121,223,245,174,119,173,92,87,137,242,186,205,217,227, - 247,63,86,144,214,46,34,173,49,132,202,104,75,28,57,248,217,44,149,197,69,234,141,6,158,151,161,217,108,210,221,213, - 69,24,134,148,203,101,214,172,88,193,179,179,115,76,98,187,87,192,166,12,140,30,131,233,127,15,145,126,137,96,146,144, - 50,217,241,165,107,248,159,33,0,9,65,44,101,123,177,51,253,33,101,96,29,136,60,56,11,224,204,129,19,67,126,53, - 20,5,116,91,232,7,134,60,232,79,192,79,131,121,83,190,81,66,191,130,238,105,232,173,92,187,107,100,231,127,255,181, - 114,247,64,39,34,104,130,54,108,126,211,141,220,116,251,13,234,196,185,115,234,200,193,189,228,85,128,20,14,73,98,112, - 157,2,245,133,38,175,121,253,107,249,235,135,158,90,118,252,190,39,110,90,13,81,11,58,250,224,184,7,51,7,161,54, - 10,201,203,29,235,206,84,2,94,243,11,159,230,139,127,246,166,139,32,244,82,72,104,128,101,109,0,218,0,44,127,222, - 196,194,1,21,66,191,7,27,191,226,23,87,230,111,255,247,106,108,104,45,141,153,67,84,195,6,70,105,156,184,157,217, - 69,202,249,44,129,207,82,37,180,196,9,201,118,96,95,179,209,32,12,67,114,217,108,170,70,214,154,102,179,73,171,213, - 66,42,117,209,86,181,213,10,8,162,224,185,239,109,47,168,218,118,210,156,239,251,228,242,121,42,149,69,130,8,206,158, - 159,167,114,104,143,185,206,198,250,110,225,150,26,137,80,69,55,139,17,128,150,72,55,213,251,88,99,218,85,86,10,214, - 75,153,230,35,3,3,84,54,175,227,161,39,22,203,151,53,163,181,192,198,60,156,252,63,48,189,30,108,242,50,110,124, - 230,210,53,252,207,3,128,44,16,73,7,227,120,104,27,176,97,102,130,53,243,51,116,130,188,17,252,50,228,37,116,132, - 208,211,132,78,153,182,246,125,10,6,99,24,170,194,80,5,122,106,80,182,2,133,227,96,188,140,66,73,101,141,206,156, - 23,248,135,6,250,51,183,189,241,181,114,239,209,147,100,78,9,58,203,37,138,133,28,88,75,214,81,172,28,234,99,253, - 138,59,72,116,148,142,138,157,212,3,39,209,134,188,178,188,253,63,190,71,125,248,220,111,174,115,79,156,114,135,211,229, - 233,131,26,246,77,193,161,41,184,224,164,147,178,248,229,84,67,243,149,128,87,255,226,167,249,244,255,126,3,215,108,30, - 120,158,37,198,55,30,221,110,55,151,196,117,189,164,226,174,9,96,61,233,206,205,210,81,192,60,120,53,24,108,193,234, - 249,141,151,117,6,54,161,85,15,9,235,53,226,200,160,156,28,56,96,147,22,178,221,34,89,1,86,183,163,163,121,46, - 129,2,1,81,146,80,111,181,240,252,44,70,107,114,185,60,214,10,170,213,26,113,162,201,250,25,172,77,201,230,74,165, - 70,171,217,34,49,49,74,40,208,34,13,202,75,119,60,48,218,162,163,4,29,197,100,253,12,243,19,83,120,135,142,55, - 71,33,156,87,73,167,107,98,154,129,69,43,131,175,138,40,55,3,38,117,89,108,182,34,206,157,187,64,177,80,166,187, - 171,139,32,9,81,142,195,134,21,107,216,31,132,254,215,159,222,187,250,85,113,184,83,192,222,22,44,220,7,209,203,105, - 167,18,224,230,239,182,148,183,160,228,243,242,183,196,37,96,248,129,2,32,11,120,214,112,213,133,195,220,239,120,220,214, - 90,20,73,109,65,90,40,36,48,80,134,49,9,43,37,140,58,48,92,135,190,42,20,103,161,107,54,235,117,68,35,195, - 133,100,100,89,174,184,98,76,245,173,24,19,163,171,150,211,209,211,73,177,163,156,110,118,43,69,44,211,55,127,80,171, - 80,175,213,240,179,89,28,165,40,148,10,196,81,8,113,72,61,142,9,230,170,104,29,35,73,205,206,93,79,146,245,179, - 40,2,86,12,117,241,150,255,249,91,153,191,253,221,63,94,151,28,56,56,182,51,8,119,108,183,28,205,167,142,120,187, - 45,236,86,82,158,190,222,218,230,110,107,41,191,68,18,121,113,49,224,15,126,247,62,94,241,177,119,18,235,23,190,247, - 246,1,159,108,19,171,246,121,109,133,126,129,159,23,164,0,228,100,160,179,9,93,131,151,191,194,25,218,182,138,147,143, - 29,34,168,158,163,101,23,241,113,113,18,137,176,41,73,108,141,109,175,107,136,212,74,213,202,52,5,68,164,235,20,73, - 162,169,213,27,216,118,75,230,186,94,234,19,100,210,118,76,107,147,110,180,43,39,213,22,181,35,132,93,215,35,245,210, - 75,227,168,181,182,88,163,201,250,89,226,176,133,178,10,226,128,150,76,172,128,74,54,54,121,153,56,196,194,224,185,14, - 65,16,210,108,77,161,209,41,178,10,67,179,213,96,247,238,221,172,92,177,130,209,177,101,88,107,112,81,108,216,118,25, - 7,102,23,123,174,57,126,116,121,6,122,59,64,173,120,153,213,140,37,157,156,46,126,19,217,255,82,142,54,154,225,142, - 110,166,87,172,164,162,155,200,122,149,75,40,244,3,6,64,202,90,118,206,95,96,38,181,103,204,207,195,72,6,54,40, - 216,94,133,45,23,96,197,184,82,189,141,145,193,162,90,191,42,59,118,197,78,53,184,102,149,216,177,106,37,203,87,173, - 160,220,217,133,239,101,83,155,137,139,44,81,59,18,24,131,115,113,15,250,249,102,151,75,69,118,59,128,205,88,116,28, - 161,117,66,216,74,91,138,11,231,207,113,106,124,130,78,87,210,211,231,179,126,243,10,126,249,189,255,69,158,56,125,54, - 119,244,177,167,151,127,233,222,71,7,157,131,199,183,94,153,36,59,6,225,158,121,99,191,250,6,56,124,3,52,110,125, - 57,207,216,254,73,248,127,239,193,253,47,183,242,66,100,208,111,189,132,31,213,72,43,35,87,164,22,152,57,153,93,38, - 122,251,55,99,215,133,124,241,83,159,194,209,22,87,5,88,225,160,141,66,182,125,127,165,109,87,60,8,172,208,88,76, - 154,220,106,185,216,110,93,140,207,53,134,40,142,72,146,24,33,5,197,124,30,37,37,58,73,40,149,74,72,36,58,49, - 224,166,62,63,214,154,139,217,235,162,45,76,76,55,229,45,157,61,157,136,87,222,80,248,203,187,238,46,28,17,210,179, - 73,154,202,42,132,161,165,107,132,24,60,199,75,109,67,144,88,145,134,234,157,60,125,28,99,34,86,44,91,145,166,104, - 184,14,174,163,158,167,106,74,95,237,151,187,8,41,72,69,164,241,203,2,49,139,35,125,20,14,227,157,101,60,213,65, - 62,10,33,142,46,161,195,15,10,0,233,118,27,49,3,110,63,244,87,97,179,15,87,87,96,215,177,172,191,97,230,242, - 237,131,125,215,93,235,93,253,202,235,88,179,125,19,165,222,18,121,229,165,218,14,27,164,235,5,82,131,105,160,69,234, - 25,147,218,73,60,103,7,170,137,46,10,234,150,198,192,105,252,111,123,103,201,182,121,138,182,185,186,231,103,41,118,66, - 223,208,8,213,90,149,35,135,14,179,231,248,41,134,122,106,140,246,117,50,188,105,140,91,119,109,161,246,75,191,152,121, - 246,196,185,129,3,127,254,119,221,225,223,127,182,60,134,21,85,8,71,225,200,239,66,252,44,223,217,224,234,155,193,56, - 248,248,94,54,150,125,222,252,238,157,200,246,243,243,219,164,102,101,153,23,57,121,11,128,159,3,114,105,21,217,63,239, - 137,78,205,180,208,45,67,247,186,173,92,119,227,235,169,125,240,12,149,112,150,192,81,184,194,34,76,106,84,33,105,71, - 177,96,211,88,222,246,126,185,92,210,9,33,176,58,173,94,178,217,44,66,8,162,40,192,152,152,108,214,79,213,208,82, - 48,60,60,140,239,103,73,146,246,247,88,211,190,37,200,118,224,161,105,71,28,65,43,174,99,61,75,95,247,144,152,188, - 234,186,85,231,158,120,128,188,83,67,40,7,99,4,113,4,202,203,33,133,139,53,1,88,75,179,25,144,241,28,60,207, - 97,106,106,18,41,29,150,141,44,163,49,62,201,166,179,231,230,242,112,38,129,217,41,72,142,72,69,67,170,151,93,119, - 44,73,27,50,128,76,162,23,105,58,103,113,165,143,148,169,243,163,74,82,7,130,53,203,86,177,80,173,50,117,242,2, - 59,234,141,75,40,241,143,9,64,121,160,7,196,30,200,59,66,172,114,225,106,107,237,43,15,185,206,229,181,31,185,125, - 108,215,123,126,193,219,186,107,7,5,191,128,192,96,147,8,155,36,216,168,73,34,65,40,16,142,66,90,209,78,249,20, - 40,218,126,53,230,121,250,76,153,82,182,22,241,92,27,110,211,59,190,18,2,164,109,103,102,181,69,120,23,91,32,65, - 169,84,230,138,171,175,98,205,154,21,60,249,232,67,156,58,91,101,168,167,27,217,10,105,105,135,141,203,70,184,233,35, - 31,112,255,71,125,126,107,246,43,15,84,122,225,228,28,92,16,176,176,234,101,220,121,35,96,213,103,246,19,172,237,166, - 33,37,203,129,199,218,119,225,23,123,1,185,41,160,203,101,208,33,96,232,116,71,87,231,53,87,46,48,53,115,23,83, - 93,87,176,241,21,111,166,59,83,230,207,63,240,159,136,131,121,144,18,35,44,74,184,23,239,250,75,155,239,75,207,162, - 227,40,116,98,46,198,246,64,170,11,106,54,91,212,42,21,178,126,6,199,145,200,172,79,146,36,244,245,245,165,213,81, - 28,167,49,64,24,172,144,88,253,156,235,165,235,58,105,61,106,28,148,113,168,53,102,216,177,109,61,6,205,179,135,246, - 34,164,33,137,13,198,10,84,152,96,12,56,34,133,101,171,53,137,134,90,35,198,74,69,237,236,41,180,84,12,156,31, - 215,87,52,235,39,13,236,137,224,194,70,72,30,24,93,205,254,114,23,222,119,145,174,98,73,165,13,253,115,51,116,36, - 213,54,24,127,103,240,249,134,91,134,181,184,214,50,222,217,73,112,227,181,76,30,60,130,57,113,230,82,67,246,253,2, - 160,63,250,54,101,109,51,189,67,11,23,58,178,176,85,89,123,243,20,220,120,124,211,218,45,215,253,222,255,40,239,188, - 245,6,124,105,208,113,128,14,43,41,123,96,69,138,37,66,98,101,59,66,214,166,246,17,72,137,177,23,67,61,219,9, - 195,233,189,74,182,163,126,133,32,229,52,172,120,222,202,65,59,232,181,237,153,188,68,188,166,111,24,147,2,89,28,209, - 81,46,243,202,91,110,227,240,190,189,84,90,13,114,210,165,228,251,140,31,59,66,169,220,201,141,255,254,87,220,103,238, - 126,112,77,127,98,183,52,97,207,29,80,217,242,50,7,41,122,166,193,51,255,225,43,84,141,97,61,105,192,225,75,109, - 27,22,193,13,211,232,218,254,227,221,203,243,242,217,73,222,117,29,60,112,230,28,11,250,77,12,94,254,42,222,229,6, - 252,221,95,252,54,173,160,138,235,186,36,137,198,145,41,249,156,130,143,196,74,133,213,105,76,139,213,150,48,8,113,93, - 23,207,243,176,214,82,171,86,218,57,94,57,28,199,161,218,168,224,185,46,25,207,107,155,216,123,116,150,59,218,160,37, - 16,74,181,127,103,211,169,24,128,208,68,205,6,25,167,196,236,220,60,55,221,112,3,29,221,163,196,145,226,216,241,227, - 204,205,156,64,234,10,88,7,209,158,214,117,117,119,131,116,168,44,214,169,53,3,2,3,207,30,216,207,234,74,189,89, - 134,227,45,56,148,129,133,86,177,195,30,236,234,19,57,99,172,80,223,157,178,199,2,83,3,35,156,211,33,5,179,72, - 189,29,120,253,162,192,231,121,63,67,36,9,189,133,28,135,175,186,12,175,191,151,209,125,135,113,106,245,75,64,244,189, - 6,160,95,250,54,127,89,1,246,65,190,2,91,115,240,198,211,112,243,145,219,111,89,247,142,63,255,3,119,221,232,114, - 108,179,130,177,22,225,8,148,77,121,3,35,5,70,202,246,82,81,42,241,183,198,192,146,110,101,201,64,253,249,4,0, - 96,133,69,44,177,1,82,128,89,186,203,155,246,59,34,229,36,210,175,177,207,17,7,109,13,140,149,233,198,85,198,245, - 89,189,122,19,179,227,103,56,119,250,4,103,107,167,88,187,118,45,147,227,211,92,117,195,205,60,118,245,174,158,214,131, - 143,111,20,66,172,18,214,158,107,119,151,47,249,124,1,56,163,13,111,79,43,153,139,250,167,151,2,64,46,136,24,84, - 11,156,161,145,117,170,115,205,47,242,208,177,143,114,251,214,25,30,57,244,121,206,235,55,177,122,215,143,242,46,41,249, - 196,223,254,1,243,115,51,120,174,135,54,17,74,164,201,168,8,137,182,18,108,130,104,123,53,47,217,180,46,69,47,87, - 43,85,146,68,35,16,23,199,239,67,3,67,164,118,169,9,181,90,21,221,219,151,6,13,168,231,216,55,108,74,108,59, - 74,165,9,28,78,234,237,99,90,130,133,201,5,118,237,220,198,19,79,28,228,250,107,223,194,248,244,9,14,60,251,21, - 38,39,199,201,100,4,165,130,123,113,234,134,6,71,56,184,174,67,84,111,209,105,76,64,26,199,51,61,12,225,233,124, - 153,80,185,228,237,247,136,119,177,134,172,202,144,213,14,53,251,124,255,156,244,125,243,237,192,231,249,199,104,131,210,134, - 103,86,45,103,95,87,39,87,29,56,74,120,246,60,74,107,226,54,117,112,233,124,31,91,176,67,169,195,223,144,15,175, - 220,15,175,58,245,186,215,174,251,213,191,121,159,232,233,42,162,163,10,66,88,144,10,109,21,70,180,147,60,165,32,165, - 118,108,187,164,79,53,32,75,117,134,64,164,241,51,237,23,223,216,165,132,13,217,230,122,82,228,145,242,27,151,45,49, - 75,127,175,210,76,236,165,22,36,245,46,37,17,26,43,45,210,66,190,144,197,118,117,35,19,203,93,119,223,207,211,207, - 222,197,149,215,94,203,198,29,87,208,243,250,59,178,71,30,124,124,237,86,107,215,71,130,61,79,88,234,127,202,115,254, - 195,47,134,187,185,146,212,198,242,245,164,177,38,19,164,158,198,75,174,139,47,22,128,18,72,52,204,150,224,216,192,189, - 159,155,152,188,252,142,209,210,213,239,225,209,83,159,226,154,141,115,60,113,230,243,156,27,191,150,177,157,63,194,47,13, - 12,242,249,143,252,37,123,246,62,141,20,22,75,26,51,100,219,185,244,32,48,38,193,90,8,163,8,41,4,158,151,193, - 207,248,56,82,165,211,179,196,16,6,17,58,209,20,11,121,180,78,173,56,150,252,160,51,110,6,107,45,137,214,237,205, - 248,212,156,94,41,133,116,124,34,109,209,113,136,43,18,106,243,9,165,206,44,215,94,181,149,135,31,57,206,216,234,43, - 25,25,219,197,225,67,15,115,248,192,3,212,234,227,72,17,162,128,140,155,198,205,234,86,132,159,203,209,104,70,194,166, - 11,196,241,95,10,73,179,107,152,46,109,172,254,30,250,241,41,43,24,16,121,38,169,34,173,37,80,105,142,154,43,51, - 72,94,154,70,62,19,70,152,98,158,71,174,189,156,179,27,86,211,113,232,56,131,211,83,232,182,141,238,165,243,93,0, - 208,35,223,226,226,136,83,102,198,247,96,109,3,118,29,223,117,217,138,159,252,195,223,17,61,93,101,140,105,130,171,210, - 182,202,74,84,27,8,46,142,157,77,123,74,99,211,88,153,148,93,110,79,184,172,109,195,144,2,43,144,164,230,235,90, - 132,169,203,95,123,26,102,144,72,68,202,175,90,211,30,99,139,246,224,169,189,81,213,206,155,50,194,32,210,102,36,205, - 170,151,146,66,111,15,65,164,185,253,142,219,249,195,223,251,35,238,249,210,221,220,252,218,87,177,237,182,155,249,108,199, - 31,246,111,91,92,92,81,177,162,119,28,59,225,130,254,78,133,255,210,50,105,54,229,196,46,122,74,91,82,129,225,67, - 192,239,242,210,244,40,115,144,236,133,115,49,60,120,93,210,24,249,226,123,255,237,171,78,118,255,81,207,198,109,239,228, - 174,147,159,225,138,145,179,140,85,239,229,153,201,141,120,189,87,243,174,95,93,199,138,187,254,134,175,126,234,111,105,180, - 2,132,148,56,9,196,42,193,8,75,70,120,72,3,58,140,145,89,73,198,177,132,141,58,65,210,66,40,65,198,207,128, - 53,40,71,209,217,213,141,177,150,36,14,201,122,57,180,73,176,50,211,30,4,216,244,102,34,210,40,232,40,73,109,85, - 131,32,192,69,129,136,105,73,203,212,228,52,229,142,65,110,188,97,29,247,62,178,155,254,161,27,217,124,249,205,44,223, - 176,133,67,251,30,231,236,241,251,16,97,72,33,91,64,121,150,196,26,140,114,105,136,212,144,204,2,21,107,56,219,168, - 176,58,55,74,168,147,239,225,157,85,82,23,169,78,90,58,46,15,175,95,143,149,18,247,185,250,238,37,29,169,13,82, - 27,206,151,75,156,191,122,39,199,163,152,177,74,133,76,43,160,171,25,162,171,181,75,104,242,114,94,167,109,223,130,32, - 61,12,76,67,41,7,171,38,4,171,58,111,184,38,179,97,213,10,48,205,20,80,218,166,232,152,212,10,73,146,182,93, - 98,169,52,21,150,56,14,9,91,13,130,160,133,20,2,141,197,241,92,116,98,81,72,208,130,68,107,162,88,227,58,30, - 82,72,180,17,120,249,84,60,39,17,8,37,41,20,10,40,183,61,186,183,96,147,118,176,158,72,91,51,99,45,210,202, - 182,103,177,73,135,249,74,82,232,233,160,50,49,193,47,252,236,59,120,255,251,63,205,196,228,56,155,55,111,224,254,171, - 174,206,215,191,242,229,101,74,138,161,78,99,15,255,123,104,13,240,237,61,102,50,164,155,216,51,164,155,216,75,220,153, - 36,93,57,249,125,224,115,192,79,1,231,95,68,69,37,73,87,49,118,66,101,23,236,14,97,232,142,250,212,216,95,253, - 254,111,92,206,47,255,169,191,105,251,79,115,207,225,15,177,189,251,36,55,47,123,146,7,46,92,160,150,187,158,87,220, - 241,111,89,177,250,50,62,251,177,223,227,248,161,221,100,29,7,37,178,41,99,227,8,140,4,65,76,54,83,38,91,44, - 34,125,65,206,115,200,56,170,205,163,9,242,249,34,202,245,104,5,1,190,239,163,148,67,98,82,32,87,74,33,244,146, - 252,65,145,201,248,152,212,166,158,140,167,144,74,225,185,89,154,145,69,182,34,102,231,38,24,27,27,229,134,107,87,241, - 204,254,61,148,114,59,65,141,176,121,251,32,99,195,27,56,114,240,75,204,77,95,192,247,32,239,187,52,98,80,237,16, - 178,165,214,232,193,233,51,52,130,26,201,247,48,222,91,34,168,217,8,81,116,232,238,234,72,23,109,173,229,187,53,163, - 112,218,161,134,177,82,244,118,119,211,227,56,228,187,58,185,112,239,35,168,90,253,18,162,188,212,231,211,125,161,242,21, - 40,130,156,135,14,11,203,38,10,217,238,93,183,220,146,150,249,246,185,221,33,33,192,10,145,190,184,34,45,215,177,154, - 168,213,96,126,118,146,70,179,70,28,181,104,5,13,116,3,226,88,179,88,173,208,106,182,208,218,48,51,53,211,246,37, - 22,136,88,210,213,213,197,220,194,2,70,74,138,165,14,234,173,58,177,78,245,42,43,87,143,210,223,223,71,169,80,162, - 183,183,143,108,169,4,82,161,218,83,155,165,164,80,129,104,175,40,216,180,220,247,50,116,118,247,112,235,171,174,101,122, - 98,138,193,129,53,172,127,253,237,153,217,175,124,121,100,153,49,163,46,20,159,133,214,239,125,135,234,37,3,172,252,14, - 32,37,218,237,217,223,167,220,25,47,230,126,126,57,152,24,22,12,226,172,143,157,219,185,48,31,253,207,63,248,13,255, - 199,223,243,159,217,113,245,59,121,236,208,215,152,169,60,197,173,91,15,113,120,98,146,131,19,55,144,95,249,42,254,197, - 191,219,206,51,247,125,132,7,238,251,4,179,231,79,145,83,2,235,103,168,89,77,214,201,128,86,72,235,16,197,150,86, - 37,38,151,41,224,186,46,205,122,147,222,222,62,242,249,220,197,22,55,73,98,130,32,32,159,47,96,180,126,78,6,97, - 12,142,163,200,102,253,148,196,206,229,48,198,144,36,9,174,43,137,163,144,106,181,198,252,124,149,129,161,94,214,173,201, - 112,234,196,5,58,75,155,152,171,79,147,47,174,231,138,171,7,57,121,226,49,142,236,189,27,130,38,42,159,67,40,41, - 45,8,167,253,156,53,90,117,30,108,125,127,46,222,45,133,49,148,84,36,250,123,107,97,38,172,69,91,139,136,34,230, - 10,5,158,184,241,26,42,247,63,134,170,84,47,161,202,75,1,160,167,190,197,221,217,3,37,160,171,5,67,206,182,157, - 133,13,91,54,129,14,46,146,194,66,166,160,35,68,58,38,215,180,35,94,130,128,51,71,78,18,183,90,156,60,123,138, - 133,197,5,130,32,68,89,133,53,6,63,147,105,231,139,91,134,7,135,211,133,73,199,161,163,51,79,28,133,12,143,118, - 164,137,161,113,68,198,43,210,217,81,38,137,99,22,91,117,22,39,35,38,130,128,3,218,82,238,232,164,171,167,143,190, - 129,65,186,122,123,17,106,41,35,93,94,220,137,2,75,161,92,162,114,161,198,202,85,3,212,226,212,200,97,211,77,215, - 240,245,193,254,126,59,49,181,78,8,49,16,88,59,223,13,137,255,45,238,143,75,169,1,115,164,33,121,223,174,170,89, - 11,252,87,224,20,112,125,58,69,252,182,99,54,63,173,52,169,97,29,11,190,144,137,76,146,9,62,246,222,255,132,174, - 84,217,126,199,91,25,191,48,198,223,223,251,113,110,222,58,75,199,232,151,120,236,236,49,90,185,155,185,234,246,247,176, - 249,218,215,242,204,131,159,102,247,61,95,100,122,230,48,142,178,8,153,39,50,9,36,1,50,48,68,6,130,36,70,38, - 10,165,28,6,7,7,47,26,142,165,94,215,105,162,234,18,32,165,55,25,139,227,166,162,66,221,30,203,63,55,154,119, - 145,82,18,199,49,11,243,243,20,242,121,124,63,203,200,64,63,213,217,211,212,235,46,165,66,39,243,205,10,34,238,100, - 213,170,219,232,239,26,228,192,179,119,179,24,206,209,240,60,215,166,97,154,50,223,150,122,124,47,189,151,104,131,127,0, - 148,11,133,111,200,129,255,94,31,11,120,73,194,92,46,71,207,29,55,113,100,255,17,70,246,29,226,18,61,253,34,1, - 232,53,223,60,94,78,171,31,254,2,100,25,178,13,200,55,202,157,94,185,88,120,238,242,124,190,27,95,59,31,70,27, - 141,43,4,11,211,179,92,56,115,158,7,191,126,31,197,114,39,195,163,203,72,104,209,55,214,137,142,90,116,119,116,81, - 89,92,36,54,17,142,43,40,230,75,36,113,76,152,196,20,75,229,52,143,42,138,40,148,10,228,11,57,16,22,87,102, - 41,116,20,210,246,75,150,49,214,210,108,133,204,207,92,96,118,234,2,67,195,35,44,223,184,1,148,215,78,134,16,44, - 169,26,189,76,6,43,37,86,196,44,46,84,33,137,25,91,53,74,112,221,174,238,250,39,191,176,62,3,107,198,224,204, - 155,160,146,255,54,79,212,19,164,86,171,223,137,100,94,178,136,248,98,187,10,250,207,124,251,152,153,32,125,206,133,0, - 37,16,242,140,180,42,145,33,182,85,229,99,127,241,223,57,55,127,154,31,121,235,47,16,103,255,35,159,223,255,247,108, - 236,219,205,109,203,14,112,114,102,154,51,19,219,241,58,47,231,234,215,255,18,219,175,123,3,207,62,248,9,30,255,234, - 199,169,213,171,180,156,136,134,209,120,65,11,191,208,194,46,54,81,178,128,155,117,241,51,62,158,227,34,132,162,209,106, - 162,164,75,24,68,196,113,140,231,101,80,109,65,160,235,58,237,73,153,38,155,205,34,5,248,190,79,24,134,105,204,15, - 16,199,17,173,102,147,74,173,2,18,54,111,238,99,239,254,35,52,163,245,248,110,158,102,18,208,170,75,74,29,107,217, - 113,117,7,15,62,249,89,106,179,23,164,133,108,29,188,127,3,226,119,193,126,183,245,201,146,37,111,196,115,137,171,159, - 4,62,109,204,247,12,220,190,45,233,221,54,116,107,109,219,72,183,181,92,216,127,248,18,186,188,152,215,109,241,5,62, - 169,83,182,69,168,52,106,94,230,11,37,225,56,18,99,211,81,174,160,173,223,177,96,49,24,171,81,82,208,170,55,88, - 152,159,97,239,222,39,201,21,92,54,110,94,77,179,213,162,148,201,224,23,50,72,147,33,142,34,202,229,18,133,114,137, - 68,39,68,65,64,33,155,37,155,203,167,252,141,209,228,140,143,114,36,137,73,72,76,130,18,138,140,78,91,2,233,164, - 161,125,133,130,79,169,109,200,30,55,42,204,140,95,160,111,120,20,107,4,86,56,136,139,194,69,7,199,247,113,154,25, - 38,46,156,33,142,12,110,206,101,228,77,175,247,206,127,242,11,171,54,88,187,206,192,83,143,65,229,67,192,193,111,226, - 111,2,224,215,72,179,180,95,236,69,178,68,115,126,1,184,163,253,125,47,52,244,93,34,251,115,105,5,160,141,148,122, - 10,165,164,73,136,51,18,220,22,247,125,238,125,212,79,158,227,245,239,254,77,70,175,255,89,78,158,126,128,227,143,127, - 134,203,86,76,112,229,80,200,145,241,195,204,85,174,194,27,216,192,43,223,248,107,92,126,205,235,248,244,223,253,79,78, - 28,60,128,54,14,213,100,150,48,108,161,100,6,33,4,189,189,189,228,115,89,194,32,196,216,212,27,104,41,1,99,201, - 196,222,201,56,23,125,130,148,227,160,148,66,57,10,207,115,46,102,143,45,249,18,197,113,68,181,182,136,227,123,40,199, - 5,19,177,110,93,31,143,63,117,150,56,92,75,206,87,72,63,33,137,93,92,217,143,162,72,35,140,29,4,93,198,210, - 177,8,78,25,162,151,91,49,136,54,232,76,146,186,215,205,145,186,40,22,121,241,170,244,239,89,53,100,45,197,56,230, - 224,214,13,212,138,5,244,254,195,112,137,23,122,249,99,248,54,24,137,66,62,143,116,36,214,36,41,255,44,100,26,73, - 35,20,182,173,235,17,198,18,54,27,180,90,117,250,6,123,232,40,21,105,197,85,188,188,79,169,179,139,170,205,49,61, - 49,137,104,70,148,10,69,206,94,152,160,214,104,176,56,51,67,78,185,244,12,150,24,24,30,192,43,228,241,51,62,120, - 30,158,35,113,76,130,176,6,169,45,113,24,166,21,142,209,72,145,198,254,10,99,81,2,206,158,62,73,161,212,65,190, - 208,209,142,45,94,26,249,75,220,140,79,33,219,73,88,63,68,179,17,82,206,185,172,223,181,139,61,163,195,189,27,207, - 93,88,174,161,191,23,198,143,67,252,4,223,24,209,211,108,223,89,95,234,182,181,109,183,110,187,72,247,195,14,240,15, - 87,62,18,82,143,146,159,77,43,160,76,40,101,102,210,203,40,199,177,88,147,42,140,115,46,236,221,243,5,78,76,236, - 225,214,183,252,75,174,190,225,237,68,3,235,121,224,200,215,233,170,62,195,43,86,213,136,230,191,204,179,103,158,161,82, - 190,153,222,225,43,233,91,185,139,243,71,143,80,82,62,137,81,44,198,18,43,211,74,181,163,163,3,173,45,173,86,72, - 62,159,199,109,139,21,151,44,91,93,215,35,81,26,167,13,50,182,237,23,148,198,252,152,246,126,24,228,218,124,80,163, - 209,32,10,35,146,208,208,106,132,184,82,162,154,130,245,235,11,60,253,196,17,124,103,53,184,10,229,184,84,171,115,220, - 126,199,107,56,59,189,215,137,235,139,93,2,74,205,182,47,244,2,47,111,23,76,3,171,219,207,239,111,241,141,246,173, - 255,40,109,144,5,147,104,122,87,47,103,119,111,55,157,247,62,204,194,37,16,122,249,0,100,128,169,70,5,109,52,158, - 16,8,41,150,214,183,144,207,11,249,22,54,193,36,33,97,28,18,26,136,172,67,182,208,65,172,5,159,253,224,231,147, - 252,145,51,81,249,194,68,131,102,43,156,179,194,132,81,8,88,65,162,77,67,39,40,87,234,70,214,167,81,40,120,153, - 238,110,183,212,215,231,169,254,190,172,237,239,247,220,145,97,89,88,214,75,71,111,7,165,124,14,207,53,160,35,146,176, - 133,176,144,81,10,27,133,156,57,126,130,141,219,46,79,31,156,18,24,155,234,31,51,121,31,213,82,216,216,112,104,239, - 1,54,94,185,133,209,177,85,176,126,99,62,60,119,97,181,130,205,85,184,240,255,192,228,8,232,85,237,202,36,79,170, - 247,153,253,46,248,129,165,29,165,107,218,96,246,205,23,79,79,90,113,185,2,10,129,177,185,89,37,164,193,161,16,180, - 208,174,36,214,14,89,215,82,153,57,206,199,255,228,215,56,254,208,125,220,244,182,159,101,195,214,215,177,184,112,45,247, - 159,122,136,13,229,211,108,31,29,103,166,254,73,162,243,67,228,106,147,88,199,208,148,139,120,162,128,105,37,120,74,210, - 217,217,73,198,203,224,56,46,133,66,234,19,20,133,81,202,233,56,146,32,104,145,205,230,47,102,205,107,157,242,63,218, - 24,146,86,3,109,76,234,17,148,205,166,70,102,237,141,251,88,74,106,139,115,120,202,210,242,44,218,10,178,89,201,101, - 59,243,60,189,247,16,61,93,215,80,79,90,116,44,203,112,249,117,155,25,191,115,64,6,231,143,229,114,80,168,131,219, - 1,65,129,151,182,127,190,180,186,28,144,250,119,247,112,209,115,251,31,253,8,32,14,35,114,133,60,111,186,241,90,62, - 122,239,195,232,75,32,244,242,0,40,11,198,206,204,196,81,148,168,76,214,77,53,55,214,182,137,222,182,74,217,10,48, - 49,113,171,133,175,92,58,253,60,25,229,227,10,159,7,247,61,203,194,71,63,95,191,221,154,195,89,216,35,211,106,249, - 31,12,136,108,172,177,113,3,170,13,244,248,148,171,57,216,21,195,64,4,61,11,66,246,93,200,251,69,53,220,159,111, - 140,141,22,114,107,87,120,107,118,108,21,195,171,150,211,219,85,34,136,91,116,151,60,166,43,11,84,234,243,148,139,93, - 232,68,163,149,64,197,22,33,92,158,125,234,9,146,19,231,216,125,224,36,251,190,248,69,198,182,111,167,153,207,58,79, - 192,218,87,10,110,139,45,139,30,220,223,7,115,222,243,218,176,230,119,121,39,13,129,219,72,45,68,119,242,141,230,235, - 30,105,124,143,134,188,128,129,5,207,235,108,42,71,120,90,32,149,34,81,2,97,5,73,96,112,85,1,215,141,217,247, - 244,231,57,120,224,49,118,94,117,19,55,191,254,103,24,89,255,54,206,206,157,224,220,133,167,232,244,142,210,223,125,138, - 145,174,57,114,202,39,104,25,172,87,33,10,22,200,229,11,100,243,57,130,176,133,163,36,158,151,65,8,73,156,196,56, - 110,6,99,37,141,70,64,177,20,130,205,33,109,26,241,19,39,1,137,78,240,253,18,54,106,96,13,132,97,152,106,130, - 28,143,140,231,17,4,33,100,28,162,160,6,139,22,175,100,104,36,62,197,142,60,163,67,49,227,51,135,160,80,96,197, - 134,213,204,84,3,236,64,159,154,131,222,2,140,72,40,253,66,106,24,247,146,193,125,201,210,228,205,252,96,198,244,232, - 36,161,92,200,243,230,27,175,37,119,223,195,44,84,47,129,208,63,0,160,225,111,65,66,251,41,49,104,179,96,250,143, - 159,106,86,166,23,51,197,229,253,34,229,129,12,234,226,186,68,58,148,55,70,147,232,4,37,5,133,124,142,64,39,8, - 44,173,243,231,185,202,154,233,28,220,19,192,23,61,24,247,47,6,0,191,240,157,77,131,106,64,209,131,46,15,122,58, - 172,233,95,85,111,246,36,71,78,245,53,142,156,26,108,222,245,64,255,184,159,29,126,106,221,218,1,239,53,183,248,59, - 111,184,154,213,195,221,148,18,216,247,204,30,174,187,249,150,116,132,172,193,120,30,135,190,254,40,147,79,62,203,168,117, - 136,109,76,56,95,227,236,221,247,49,236,23,196,99,219,119,12,179,111,223,43,110,208,201,100,3,78,159,132,106,247,243, - 110,164,115,237,73,213,119,115,98,210,77,249,183,124,83,27,118,30,232,6,53,9,61,2,70,79,249,217,174,138,78,112, - 19,75,36,93,26,58,65,201,4,132,197,146,128,149,56,190,143,164,202,67,247,126,138,221,123,30,231,234,27,223,200,43, - 110,125,11,254,208,143,48,94,27,231,236,133,103,248,250,222,251,241,243,46,30,5,116,24,145,152,0,215,47,2,6,161, - 68,187,186,209,237,236,120,77,162,227,116,162,169,53,73,152,16,169,22,202,247,144,210,193,90,73,28,181,200,203,12,126, - 156,2,163,177,10,84,134,70,28,227,88,40,228,114,32,114,44,52,4,93,210,210,172,47,162,242,69,106,21,65,71,38, - 203,193,201,167,25,222,122,13,221,197,65,230,206,61,66,105,216,99,143,155,25,92,21,135,235,68,106,198,54,245,157,84, - 11,182,13,54,89,82,239,159,191,36,141,81,250,65,63,113,146,208,93,200,179,251,198,235,232,190,247,33,184,4,66,223, - 8,64,31,248,22,37,164,74,51,183,26,2,170,250,194,249,248,212,83,187,245,200,138,55,56,152,56,229,128,158,95,48, - 11,129,17,130,216,26,60,47,131,206,103,72,26,49,213,48,34,123,252,92,50,10,167,99,120,170,12,251,143,64,237,99, - 60,103,216,245,66,21,195,43,65,172,5,57,148,218,187,122,58,245,141,206,73,33,202,69,107,187,243,48,212,31,180,54, - 13,237,221,123,217,227,135,14,109,121,255,167,191,216,187,235,221,111,146,239,124,237,143,112,126,226,32,179,179,85,122,74, - 101,172,178,60,113,207,3,204,60,248,12,189,137,203,162,14,72,124,23,139,164,208,140,233,118,51,116,92,117,19,95,157, - 154,237,223,49,113,110,99,14,150,73,56,114,20,226,28,255,48,66,247,187,45,203,91,164,30,64,180,43,161,227,41,247, - 211,45,96,163,145,106,237,25,100,222,152,180,183,21,130,52,173,194,74,164,18,196,38,85,121,199,38,65,90,75,62,231, - 19,53,230,248,218,231,254,150,189,143,125,157,181,87,95,207,214,203,110,98,164,176,145,185,74,158,124,182,129,113,154,232, - 208,65,24,151,222,174,62,60,55,131,209,22,235,62,71,154,10,169,48,86,224,42,139,2,148,240,49,38,70,27,23,43, - 20,249,194,16,35,99,221,212,227,41,26,141,42,74,7,100,140,164,228,122,52,99,152,175,213,241,114,57,98,109,137,162, - 38,217,2,56,56,100,45,8,109,153,156,156,166,111,104,25,107,174,184,153,153,185,113,156,224,8,59,95,113,35,95,191, - 255,80,169,126,124,207,72,6,186,207,130,243,63,32,105,188,192,243,109,218,36,115,12,252,27,224,198,246,215,252,83,242, - 130,214,73,66,35,159,227,236,13,215,176,101,223,97,226,83,103,47,45,181,46,1,144,255,173,91,7,13,76,41,56,210, - 169,147,43,206,61,252,104,39,111,125,61,98,105,157,93,152,180,245,18,233,116,74,27,155,218,48,196,26,27,197,248,174, - 143,240,74,20,206,94,168,23,82,223,151,115,171,160,245,44,240,249,239,240,160,124,176,99,160,71,65,111,134,240,46,168, - 29,2,177,222,90,153,128,147,133,156,65,236,206,97,247,223,26,69,215,109,59,124,120,215,23,255,243,255,90,243,191,142, - 158,45,188,225,221,63,198,153,163,103,233,185,246,74,238,253,244,167,169,60,180,155,46,55,71,147,16,47,159,101,106,106, - 156,201,133,89,150,245,13,144,201,56,12,58,25,250,55,110,80,227,19,231,122,214,65,103,5,188,46,104,244,145,106,127, - 158,127,7,254,174,198,180,164,41,132,197,118,235,85,77,63,50,157,176,198,194,245,161,114,214,158,21,194,83,82,32,77, - 106,76,2,169,162,215,216,37,11,1,129,209,237,142,55,106,33,133,164,232,100,104,206,30,229,145,79,61,203,222,47,127, - 148,101,3,43,112,154,51,8,25,99,28,7,43,12,153,124,7,224,209,106,134,228,114,170,29,1,38,241,60,31,19,4, - 109,11,15,133,112,125,66,4,58,49,100,173,139,137,67,74,189,131,172,94,117,3,129,219,160,90,25,167,114,254,12,141, - 241,83,152,218,60,133,172,194,218,132,230,194,28,126,206,197,68,9,113,224,35,203,30,177,142,152,159,169,51,189,80,97, - 227,13,175,39,50,157,248,225,35,244,173,88,77,82,188,6,151,191,17,9,168,12,168,4,196,23,218,213,230,11,157,1, - 224,39,219,191,38,255,68,47,52,155,36,116,231,114,76,189,98,23,149,66,30,111,223,161,75,32,4,56,175,248,22,127, - 81,1,115,4,102,90,112,160,27,206,78,236,217,55,92,175,7,94,54,171,48,70,183,149,207,207,191,83,165,147,176,44, - 138,140,149,148,186,122,120,252,169,103,233,156,156,152,151,112,214,194,236,57,208,111,0,254,11,112,250,59,60,176,165,26, - 107,105,204,58,1,182,3,244,97,208,191,13,225,126,108,173,46,228,116,36,196,153,110,163,79,188,91,39,175,248,218,7, - 62,116,197,99,103,207,117,154,205,91,188,147,251,15,138,234,19,251,88,153,47,19,232,128,40,171,104,85,107,184,40,114, - 217,28,243,205,6,211,181,58,203,178,9,3,67,131,84,148,83,210,58,233,117,33,191,31,22,178,237,187,239,104,187,90, - 89,154,132,137,23,104,13,94,10,225,246,252,11,168,0,69,3,27,4,98,71,75,80,170,72,97,173,54,36,198,166,123, - 113,109,107,18,251,60,204,23,168,212,39,210,154,182,108,161,133,194,82,118,75,216,56,224,216,137,71,232,236,232,99,96, - 96,3,70,70,132,166,198,192,80,47,74,57,24,29,227,58,94,106,28,143,192,104,157,146,200,113,140,149,14,210,86,72, - 140,143,16,121,226,56,34,227,123,24,221,162,94,159,33,215,177,154,129,238,229,244,119,93,65,188,174,194,252,212,41,42, - 211,39,80,139,231,112,231,199,105,53,102,201,72,151,164,161,193,248,160,20,245,230,44,214,19,248,189,35,196,149,3,140, - 22,230,161,112,25,39,78,156,134,179,135,227,66,26,85,168,151,146,80,95,8,128,254,93,58,37,164,183,205,163,253,83, - 142,100,182,198,16,7,17,3,91,54,176,63,159,195,63,116,148,124,165,246,207,58,90,200,121,226,219,0,128,77,187,134, - 51,57,56,161,247,29,216,122,238,240,177,194,134,203,55,162,105,181,151,77,219,190,199,82,34,218,134,89,38,163,136,48, - 36,174,67,50,49,75,95,20,77,27,56,231,67,245,44,216,113,210,176,191,255,240,2,83,161,239,212,194,40,158,139,251, - 217,2,201,39,173,153,217,134,172,205,41,103,194,96,39,110,215,58,56,118,207,253,215,254,233,179,7,6,244,53,55,136, - 45,195,163,84,234,53,50,217,12,213,133,58,253,221,61,248,29,61,244,234,144,90,189,70,208,10,113,98,139,109,181,104, - 10,81,86,176,49,20,98,75,217,90,115,12,90,18,188,30,200,180,65,48,216,14,205,24,162,10,36,175,2,51,198,115, - 49,210,170,61,53,179,223,226,34,81,109,238,98,22,56,75,26,53,61,4,185,0,6,21,182,107,193,245,212,28,86,40, - 209,246,225,65,182,141,226,45,218,166,254,58,142,148,104,169,72,172,193,74,75,98,12,194,26,12,6,35,19,172,107,8, - 165,32,223,223,67,215,96,63,245,202,28,174,3,25,233,18,71,33,174,163,136,194,144,140,159,26,146,213,226,56,117,20, - 48,22,35,211,113,187,140,12,210,19,132,162,69,70,120,120,246,44,3,250,20,241,252,8,85,49,66,226,244,163,253,101, - 184,67,187,24,28,189,28,25,207,19,213,207,241,232,221,159,39,172,30,167,25,79,192,180,71,103,103,9,108,72,84,247, - 200,196,45,138,242,12,34,51,64,192,48,167,15,252,111,26,166,34,4,162,96,176,221,125,224,191,29,90,255,235,155,158, - 179,159,110,243,60,147,252,240,100,193,139,118,75,118,104,213,24,238,216,8,93,135,142,81,46,22,200,122,223,56,15,210, - 198,180,29,37,126,200,1,168,247,219,220,173,207,64,18,195,84,6,142,118,206,207,205,28,190,231,190,222,181,151,111,148, - 26,131,176,18,99,44,82,138,246,226,168,196,85,14,145,23,161,28,69,53,137,48,71,143,7,101,152,146,48,81,131,214, - 191,39,93,59,200,127,15,30,120,210,174,138,214,89,211,186,160,205,169,33,169,108,2,203,234,136,29,215,108,189,92,174, - 29,26,33,10,154,36,36,204,78,204,179,122,221,90,138,217,60,213,122,149,176,217,66,70,134,178,85,224,88,198,122,250, - 216,219,219,159,143,38,206,95,230,166,180,250,122,139,93,48,136,18,216,142,246,150,255,188,129,113,9,51,207,192,220,143, - 64,179,149,238,113,133,203,161,121,103,26,251,99,103,193,22,33,185,21,204,70,176,109,87,1,100,27,132,154,237,22,204, - 73,253,1,18,43,68,224,88,27,238,21,34,179,104,141,202,180,13,121,76,123,186,40,108,90,13,25,44,113,18,131,146, - 23,183,213,109,123,41,216,160,144,196,72,45,17,81,150,206,82,23,157,69,143,218,92,72,62,91,66,99,112,165,67,33, - 151,197,113,93,220,140,135,148,18,173,19,60,215,193,106,75,66,136,84,46,54,17,224,36,68,73,66,98,19,108,220,162, - 39,43,88,53,50,78,61,58,205,212,130,195,228,162,207,108,216,71,160,198,176,249,101,228,186,183,113,213,237,195,60,240, - 241,223,68,196,51,76,78,78,18,199,13,146,160,202,217,83,139,76,29,254,26,195,253,62,13,255,90,166,39,231,184,98, - 213,58,30,184,230,21,153,167,31,184,111,249,21,176,173,14,7,222,10,117,7,226,223,121,222,107,124,45,124,15,13,58, - 126,176,142,27,39,88,4,147,27,215,242,112,108,233,126,228,32,151,111,88,131,20,130,158,142,46,98,223,225,212,112,192, - 234,249,35,63,212,32,228,204,124,7,222,194,135,69,11,135,58,224,232,153,47,126,105,108,226,39,223,92,28,232,43,163, - 19,221,118,62,20,24,99,17,6,114,194,197,58,14,67,165,46,142,213,90,168,233,153,192,75,141,167,102,124,136,127,227, - 121,63,59,7,252,53,112,231,119,113,39,17,192,161,116,34,162,255,212,232,133,6,204,42,41,131,174,108,14,207,90,180, - 209,92,152,155,98,205,242,149,4,58,161,53,59,75,173,81,163,209,168,147,203,231,201,10,197,162,74,200,27,67,180,110, - 149,247,224,236,196,104,167,160,39,31,155,43,124,75,3,172,159,3,207,73,219,176,166,130,57,7,166,61,152,12,82,35, - 179,200,73,53,116,83,37,104,154,212,43,32,114,97,254,38,168,89,72,198,65,151,161,181,3,90,25,72,202,160,175,4, - 179,10,120,28,90,89,107,231,91,82,182,158,208,137,103,164,159,238,102,37,150,68,164,249,92,210,128,86,233,230,191,35, - 36,198,104,210,42,41,5,39,129,76,197,78,137,64,138,182,119,180,142,241,4,20,179,69,60,223,167,22,215,136,147,144, - 56,118,208,198,224,122,30,25,63,131,49,138,36,136,136,194,16,75,130,144,14,117,147,80,84,26,47,80,216,102,72,100, - 251,121,252,252,50,78,214,106,140,20,38,25,235,213,108,236,155,195,154,113,206,205,238,231,196,124,15,83,199,135,201,116, - 108,102,211,150,171,56,183,239,126,84,62,67,103,79,23,171,151,239,224,150,215,102,153,159,158,103,114,188,14,225,97,154, - 11,243,140,150,11,220,246,186,183,115,239,153,211,35,171,206,156,190,170,8,199,5,204,172,129,137,78,176,141,118,165,171, - 190,7,220,91,234,109,109,47,70,87,127,203,246,200,90,164,146,66,57,202,10,243,127,79,194,232,0,115,51,21,166,39, - 22,184,229,202,157,88,11,113,162,193,194,189,59,251,104,57,30,187,118,239,35,225,135,51,167,195,217,245,29,190,224,49, - 104,85,225,120,14,246,116,60,245,244,166,211,247,63,189,110,224,45,183,99,68,170,17,86,58,139,164,133,69,145,144,32, - 133,193,149,30,78,208,192,204,205,68,18,170,57,104,124,1,204,31,180,73,216,165,22,175,249,93,60,240,12,112,21,169, - 10,246,6,96,30,226,24,230,134,140,158,58,120,116,223,134,96,120,84,29,189,48,73,103,95,47,245,86,64,92,173,147, - 247,179,20,10,57,18,155,208,208,33,129,182,104,161,72,170,13,122,123,202,202,125,235,155,74,214,186,229,217,106,125,32, - 142,66,194,74,213,122,81,152,196,54,164,30,104,225,90,73,41,137,66,181,184,216,234,136,194,86,103,28,71,202,232,166, - 50,118,209,215,186,233,98,181,132,64,195,84,11,230,69,10,70,129,133,105,9,51,2,230,151,193,76,4,243,71,161,238, - 131,235,66,102,194,24,47,191,118,141,44,47,44,18,214,235,72,87,33,141,193,152,212,168,40,117,55,209,32,76,123,83, - 61,141,82,150,8,16,169,58,221,74,151,68,26,172,136,17,194,16,39,233,96,160,209,104,97,149,68,138,84,152,105,219, - 62,220,73,18,227,72,213,22,150,90,180,246,208,45,133,173,215,241,125,23,137,33,50,33,94,71,15,197,254,107,145,249, - 14,78,212,207,115,118,122,150,130,188,64,89,158,98,176,212,228,21,131,14,54,57,203,68,235,28,135,91,57,206,61,61, - 207,79,255,244,187,24,29,217,198,211,251,31,97,106,246,12,202,184,108,94,191,138,254,101,99,220,249,217,221,204,197,69, - 70,135,70,217,250,227,255,218,123,248,189,191,179,233,117,213,249,27,170,48,177,6,30,126,4,22,159,1,251,197,231,77, - 12,95,238,49,192,244,194,12,29,29,57,162,56,249,14,0,132,152,24,215,120,158,123,49,125,246,255,246,153,254,166,106, - 192,72,201,167,124,88,238,72,250,18,243,67,211,134,126,51,0,127,219,179,46,37,163,167,66,216,223,209,106,157,62,254, - 55,31,28,91,127,253,43,253,114,159,151,78,188,108,2,2,148,204,160,114,25,162,106,19,167,88,162,88,109,208,129,142, - 73,199,249,118,241,185,201,207,119,38,235,218,15,76,61,239,207,75,21,207,211,192,47,183,63,159,125,30,169,123,11,4, - 121,56,219,1,199,87,46,204,108,123,242,196,190,158,140,246,40,248,89,202,142,34,235,251,104,87,80,181,17,249,21,3, - 12,244,118,210,104,53,177,113,194,220,212,52,51,187,199,185,108,213,70,209,33,60,146,82,55,90,88,132,53,34,177,198, - 109,186,16,4,1,42,189,248,157,32,12,243,73,98,168,36,26,27,37,152,32,180,45,221,50,68,129,201,86,234,177,91, - 173,5,162,82,105,9,173,181,103,146,200,105,52,22,125,99,230,114,48,147,129,211,26,142,135,112,18,33,93,97,205,170, - 9,199,235,222,118,245,53,156,250,210,157,132,214,96,100,90,221,72,1,86,166,147,48,97,212,146,137,118,26,84,36,68, - 154,72,138,76,189,149,72,117,89,54,129,66,182,132,182,130,88,235,116,130,102,64,40,65,156,36,237,148,12,80,66,97, - 116,186,43,39,29,151,196,24,164,8,145,97,140,13,242,180,132,64,197,30,243,139,211,60,244,192,123,217,114,217,13,116, - 140,141,162,115,131,196,238,8,13,189,129,11,211,103,136,142,29,166,171,40,24,27,113,48,245,115,252,220,187,175,103,93, - 95,157,39,30,254,51,194,240,24,219,7,71,169,212,138,28,222,115,132,83,135,87,242,166,31,123,7,95,254,200,71,72, - 14,31,100,96,229,70,46,220,254,134,238,71,63,254,215,87,95,13,115,13,88,240,97,119,3,154,57,190,55,171,20,19, - 139,21,94,123,197,90,74,133,252,119,4,33,99,140,181,63,96,54,171,145,235,112,202,110,162,247,177,125,63,156,45,216, - 99,47,98,124,12,180,20,156,148,112,40,127,255,189,27,14,127,253,254,209,235,222,113,135,208,214,96,149,65,227,165,102, - 244,74,33,132,32,227,123,72,215,33,178,246,37,197,168,23,219,147,142,114,202,63,177,145,84,41,188,240,60,78,224,120, - 155,200,245,248,198,45,243,126,72,234,112,65,195,190,85,179,139,151,77,214,102,186,54,93,245,10,89,12,67,50,170,192, - 140,12,81,197,28,43,55,109,100,104,205,10,156,98,150,32,9,137,130,16,105,45,217,66,47,245,147,19,248,89,72,116, - 11,141,70,234,20,61,77,75,80,148,2,161,99,172,16,20,164,2,207,65,102,221,37,79,52,81,149,90,25,101,149,103, - 133,155,196,113,46,49,150,80,107,148,1,211,10,160,214,52,157,211,211,13,255,236,177,185,176,82,155,30,17,226,168,197, - 84,34,216,220,88,191,161,99,217,134,245,84,63,246,145,84,151,211,54,230,90,138,72,22,214,98,132,2,37,73,255,233, - 212,9,50,137,13,70,75,144,62,74,106,76,18,98,146,152,108,54,67,24,54,137,147,0,65,202,33,105,13,185,108,39, - 90,39,169,17,125,123,9,53,181,47,81,88,19,145,36,9,17,14,81,208,174,146,154,9,73,125,150,82,118,142,112,230, - 62,138,93,43,144,129,68,235,136,196,106,178,217,18,178,184,134,11,245,44,181,51,17,181,70,133,91,54,94,205,35,247, - 222,201,198,177,38,221,197,49,162,102,158,137,164,130,191,90,48,25,87,201,184,176,101,203,229,60,248,137,207,18,52,37, - 35,171,54,240,208,246,237,203,123,247,236,185,126,21,76,159,133,218,74,56,42,32,204,182,227,154,95,46,36,40,128,86, - 204,93,79,29,231,95,253,232,237,20,115,89,162,56,254,118,247,189,31,188,201,153,235,48,151,47,147,60,182,239,135,114, - 90,230,108,126,17,61,116,8,201,65,184,96,16,79,246,52,195,13,39,255,224,247,203,43,175,92,95,30,90,54,132,49, - 25,140,10,145,194,162,28,23,161,28,28,199,165,148,117,201,27,243,146,28,115,239,109,143,98,111,32,221,193,122,8,120, - 42,173,194,184,21,24,35,221,249,249,237,209,110,26,175,216,136,8,82,75,8,41,5,225,125,7,236,225,217,218,124,3, - 246,116,88,246,244,30,62,190,108,124,221,198,190,53,157,157,92,168,205,211,179,125,61,87,223,124,61,110,46,131,113,4, - 185,98,30,71,41,38,206,158,37,14,90,108,186,122,39,31,63,240,33,234,170,68,62,91,0,107,240,4,100,61,135,188, - 54,132,128,201,180,109,72,196,115,153,101,75,30,57,153,216,193,70,6,100,130,239,40,148,77,16,82,146,104,144,221,5, - 220,222,188,76,214,174,47,26,179,181,248,165,135,246,44,47,31,56,180,238,199,9,23,38,161,152,189,102,123,214,201,8, - 194,48,198,207,58,109,240,73,35,101,172,105,71,239,200,4,35,20,82,120,88,171,48,177,192,234,152,56,106,18,199,117, - 50,74,144,207,101,233,44,118,160,148,64,8,155,154,134,197,17,174,114,136,181,161,21,182,200,229,178,40,165,136,162,40, - 181,93,69,16,39,26,147,24,116,18,35,176,233,186,134,147,163,190,88,167,195,87,188,229,103,95,203,192,96,23,113,28, - 34,76,130,52,169,105,153,227,148,153,152,147,124,238,171,123,25,159,126,156,43,182,230,56,118,110,145,226,250,87,17,200, - 83,28,57,118,138,153,133,73,74,125,17,214,134,228,76,68,227,224,103,89,59,186,130,135,74,46,141,184,138,51,221,98, - 195,117,183,136,207,157,155,88,251,115,115,83,183,102,211,61,252,135,214,97,79,91,152,95,132,166,110,143,234,159,95,13, - 191,148,115,102,124,154,63,254,240,157,252,226,91,95,69,169,144,251,118,32,244,131,7,64,34,37,172,127,104,73,232,23, - 3,251,58,29,133,46,14,10,158,54,150,21,157,79,61,51,240,212,95,254,237,198,219,126,227,151,92,55,163,211,241,173, - 112,144,210,65,58,10,157,196,116,117,22,201,186,110,219,98,254,219,191,105,124,82,187,139,92,251,223,242,218,119,175,32, - 29,127,47,145,225,23,99,120,107,195,221,236,126,219,213,100,60,7,225,58,24,207,97,112,172,143,161,223,255,124,184,23, - 142,187,240,240,198,74,107,205,125,7,14,118,30,187,252,106,119,231,245,87,112,245,107,95,133,151,205,165,62,214,66,32, - 76,140,176,130,254,129,33,166,207,157,167,111,69,63,21,23,62,253,241,79,4,87,117,14,76,140,40,213,202,11,37,202, - 25,95,120,70,91,143,36,84,74,218,80,91,217,178,86,33,5,197,40,168,106,173,109,36,85,102,198,58,217,166,116,164, - 201,122,194,31,232,43,228,123,123,138,185,82,103,169,156,119,133,34,65,52,234,216,48,192,201,186,236,220,190,131,207,52, - 131,242,157,23,78,101,87,68,161,94,117,229,14,113,122,110,254,226,126,138,16,92,180,187,16,237,63,91,97,145,210,66, - 146,144,104,77,28,6,228,178,138,109,219,215,176,115,231,6,6,7,250,89,190,124,53,205,38,60,240,192,19,68,113,66, - 20,69,88,107,209,73,154,15,102,109,66,146,164,6,244,105,56,161,67,46,155,199,81,46,129,14,169,213,2,114,37,15, - 43,99,172,208,104,13,141,106,147,122,117,134,164,187,132,49,25,164,128,216,90,4,25,180,245,249,223,239,251,3,62,251, - 165,123,121,219,107,199,24,240,135,137,206,62,192,200,174,215,80,11,86,80,218,182,140,214,228,126,142,31,219,199,80,209, - 208,229,58,76,28,121,152,142,242,28,17,167,56,51,211,203,224,192,24,121,109,96,235,86,255,35,247,126,109,219,59,160, - 80,196,174,183,112,48,134,67,83,105,209,59,57,13,181,24,194,206,151,89,170,92,152,154,227,125,159,248,10,255,242,109, - 175,254,39,7,66,63,212,99,248,229,47,226,139,22,83,222,37,249,5,107,207,157,135,7,59,96,244,204,135,63,222,115, - 244,214,107,135,151,111,94,78,38,223,131,240,28,60,215,195,145,30,49,134,216,106,98,215,83,34,245,20,194,182,57,155, - 111,30,193,215,72,125,148,243,109,82,90,191,192,164,107,137,80,92,250,92,235,169,19,108,253,177,63,97,247,117,235,185, - 80,240,177,203,122,25,60,62,193,44,216,5,88,40,73,113,176,104,236,225,222,61,251,214,53,174,189,105,224,198,31,123, - 39,137,14,48,109,163,117,4,104,41,17,214,160,74,29,248,3,9,65,163,202,174,155,47,35,249,244,167,247,190,101,252, - 100,3,40,170,116,75,221,145,96,36,68,6,90,54,157,110,77,89,88,84,208,20,233,194,68,70,67,46,134,76,12,158, - 62,66,182,226,120,229,179,29,221,195,251,7,7,135,157,161,193,242,178,190,65,183,47,223,75,172,96,172,91,240,234,157, - 235,57,209,95,114,31,218,119,76,252,233,246,157,226,209,15,126,100,137,12,189,152,151,150,122,46,153,52,5,68,184,72, - 35,48,73,72,49,235,242,138,155,174,225,182,219,94,201,166,77,107,40,20,178,104,29,226,120,89,246,236,57,77,24,5, - 68,113,154,59,18,197,26,41,51,8,35,48,164,153,97,126,166,221,138,216,152,40,12,41,20,242,212,91,13,130,88,147, - 49,160,109,4,186,65,172,21,81,51,166,213,146,248,8,116,220,66,40,69,44,92,156,156,207,211,207,62,195,125,15,222, - 69,94,249,100,84,39,121,191,128,27,79,83,158,184,11,71,75,142,78,187,148,70,54,51,58,230,33,22,158,37,8,103, - 48,174,230,208,161,51,172,217,212,65,159,189,158,82,239,54,130,112,158,203,86,95,205,201,181,55,149,255,122,247,23,182, - 118,28,220,189,106,103,189,181,107,53,28,207,194,129,24,14,78,193,97,5,167,47,164,34,209,208,121,25,111,246,241,233, - 121,254,236,19,95,229,23,223,254,42,138,249,236,119,228,132,46,157,255,11,0,52,255,34,191,240,33,160,15,90,87,194, - 65,3,247,14,158,155,26,222,243,71,239,237,44,253,206,111,229,50,190,38,155,45,80,46,101,80,66,18,217,24,183,152, - 71,45,27,245,245,225,227,217,16,252,155,64,190,234,121,165,244,18,152,212,73,85,176,159,123,9,99,85,155,104,114,137, - 102,242,171,123,56,6,76,57,138,13,214,162,64,14,9,242,218,82,114,32,211,165,49,61,235,151,131,202,226,196,97,10, - 131,82,96,219,53,153,149,14,177,213,20,122,122,177,81,196,230,109,91,184,48,50,224,150,78,76,22,45,20,3,48,115, - 105,118,151,246,192,22,192,203,66,38,129,121,224,209,4,206,56,16,9,200,56,80,80,144,247,133,40,88,232,238,76,162, - 193,177,217,137,179,149,217,137,206,211,251,232,61,151,43,244,62,211,213,215,39,58,186,243,163,235,199,252,98,206,119,94, - 185,113,187,200,116,244,184,217,98,153,201,233,185,148,116,54,105,194,136,84,41,63,99,76,140,181,6,87,248,68,97,204, - 202,229,67,252,198,175,255,75,182,108,92,1,54,33,138,18,162,86,12,196,40,233,50,59,51,135,239,231,9,163,6,202, - 241,240,132,106,251,100,91,176,54,245,90,106,171,160,43,149,10,165,82,137,122,195,16,39,1,82,1,184,8,225,96,73, - 147,48,144,138,133,74,19,163,178,104,33,17,38,196,8,129,181,25,190,240,169,123,136,155,10,95,41,102,79,44,128,238, - 161,123,32,198,149,103,136,231,224,194,211,179,68,227,231,89,185,186,159,242,138,141,116,13,140,112,254,244,9,78,79,45, - 32,131,26,29,180,144,241,33,186,202,89,84,255,50,70,54,111,96,230,71,222,236,76,158,61,85,126,232,209,251,202,143, - 60,122,215,242,213,39,246,110,223,105,146,211,157,112,32,129,103,38,96,183,129,83,59,97,177,6,177,247,18,11,162,243, - 211,115,188,255,227,151,64,232,159,204,20,108,233,60,145,146,192,118,21,44,28,21,226,41,215,218,209,206,47,62,52,248, - 212,234,79,109,187,230,23,127,222,169,45,44,96,35,7,71,129,16,22,47,227,209,185,105,75,46,184,235,222,225,2,12, - 20,225,248,40,180,158,239,187,236,1,79,146,202,173,95,108,95,255,66,239,182,237,137,22,245,52,126,106,192,71,108,149, - 214,222,120,24,113,249,131,163,3,93,255,250,218,45,128,64,75,137,37,73,53,52,86,32,177,160,5,170,157,79,223,85, - 238,66,74,151,248,242,29,195,247,156,248,242,254,72,8,119,118,217,80,39,91,55,149,71,134,150,201,206,76,54,62,188, - 119,95,179,116,255,253,23,182,65,103,132,141,52,156,146,80,237,2,49,14,202,3,71,88,155,113,32,167,5,29,210,210, - 215,1,195,87,192,232,21,205,122,223,98,179,222,213,56,127,178,120,240,192,147,189,143,143,173,222,184,113,219,206,206,219, - 55,174,227,238,191,249,36,103,206,78,226,100,50,237,69,223,246,30,152,76,147,79,165,6,75,68,54,47,120,219,219,223, - 72,189,94,101,102,102,134,254,190,94,132,208,224,136,52,58,25,143,241,241,25,164,244,145,78,140,21,85,140,141,144,210, - 18,69,26,99,12,82,42,98,157,16,5,33,66,8,226,56,68,74,129,54,45,170,213,6,249,108,9,95,229,9,194,42, - 74,65,146,68,84,26,139,212,77,3,43,19,124,1,190,155,101,247,238,125,124,245,174,123,208,72,106,113,131,103,15,159, - 226,252,226,38,186,199,58,81,73,196,196,220,34,187,118,173,101,245,152,33,227,183,72,58,60,76,118,136,51,213,5,182, - 223,242,106,238,251,227,15,179,102,125,63,214,137,105,212,22,41,134,103,144,11,130,78,127,3,185,194,50,198,222,244,11, - 52,238,248,113,239,252,222,199,134,62,243,192,157,125,35,123,239,91,179,179,190,176,173,11,182,37,240,164,134,253,187,225, - 108,17,230,55,65,180,159,23,31,113,187,4,66,191,240,182,87,81,42,92,2,161,127,84,0,250,173,23,249,133,173,116, - 212,205,40,232,9,107,199,107,130,7,187,12,253,231,223,251,151,217,71,58,10,235,95,249,83,111,144,141,197,102,26,27, - 44,5,50,134,193,45,235,220,211,66,140,89,107,215,122,176,111,1,90,30,207,173,44,36,237,10,40,251,18,30,240,18, - 80,133,164,41,21,243,160,174,130,114,21,214,10,184,38,177,246,154,61,142,186,108,207,170,141,203,6,174,190,76,14,246, - 244,3,150,216,73,144,218,32,100,6,131,64,137,246,35,176,26,161,65,228,178,20,125,151,107,127,250,39,250,159,90,179, - 166,227,242,237,59,221,205,87,94,33,7,6,250,241,148,2,145,97,174,81,235,254,47,111,253,137,98,249,203,95,93,92, - 14,235,76,90,13,86,130,174,156,126,56,159,73,134,39,170,97,54,209,205,94,168,248,150,201,4,142,251,144,55,208,165, - 5,253,121,33,6,242,198,142,45,179,108,89,125,230,76,240,145,102,115,235,202,222,219,123,243,139,117,250,154,77,78,233, - 136,166,35,145,56,68,113,219,78,22,137,84,6,99,45,90,27,86,173,92,201,232,112,7,199,142,31,96,177,209,162,191, - 103,144,114,49,135,213,17,137,129,153,233,89,194,216,67,71,154,160,25,163,117,76,34,99,4,14,142,82,132,65,11,107, - 92,28,71,96,180,69,107,75,146,88,28,233,225,170,136,66,206,39,104,52,83,123,85,44,73,28,179,48,211,64,73,69, - 147,26,245,106,130,176,17,7,142,28,229,45,239,124,35,171,214,174,38,95,40,208,221,81,102,213,202,110,30,127,226,107, - 116,84,78,179,110,101,142,19,167,78,81,77,178,116,14,150,168,31,127,132,19,39,190,192,230,155,111,227,177,199,31,230, - 83,159,123,128,119,47,191,149,238,145,45,212,235,17,65,116,146,188,62,75,71,253,36,121,14,80,173,116,18,184,27,88, - 189,227,54,130,237,183,58,11,103,158,233,125,234,177,207,117,116,223,251,197,209,229,11,211,91,123,96,127,2,79,207,195, - 211,111,134,83,175,72,205,79,227,23,107,195,122,126,122,142,247,125,252,43,252,203,183,191,250,18,8,253,99,2,208,111, - 191,20,77,66,27,136,28,104,97,57,28,193,151,70,19,237,156,248,159,127,168,30,42,103,215,94,251,250,183,136,168,122, - 6,27,43,84,162,232,218,190,220,185,176,105,213,160,222,127,124,125,219,246,116,166,10,250,239,218,213,79,22,216,192,119, - 182,86,48,237,15,153,2,160,152,6,25,167,252,76,126,27,244,44,194,38,7,174,31,151,188,242,220,192,200,202,198,142, - 173,165,155,70,134,193,8,62,255,39,31,226,186,55,188,154,245,87,109,66,219,24,107,52,162,157,154,97,37,88,43,81, - 70,98,173,68,72,197,77,183,190,138,155,110,123,109,38,93,116,139,176,198,164,22,22,38,160,59,239,243,250,255,248,43, - 29,119,223,119,223,192,170,86,184,50,132,21,37,152,94,86,240,26,215,254,206,91,57,114,190,198,226,175,127,212,58,25, - 87,111,74,52,43,180,73,230,33,248,40,44,92,111,57,171,172,205,70,136,161,38,200,85,54,46,141,9,102,14,206,84, - 122,175,236,233,228,45,219,119,176,122,120,144,175,29,220,195,133,153,69,140,147,5,41,177,73,76,36,99,148,200,98,2, - 203,201,99,167,184,238,154,215,176,108,85,63,205,0,142,31,62,199,252,220,34,35,195,125,4,65,68,101,113,30,215,45, - 179,56,191,136,159,201,17,71,146,70,163,74,198,151,248,25,159,68,71,88,155,32,132,135,231,101,136,99,112,28,31,97, - 20,229,130,139,235,89,164,155,38,126,26,12,94,198,101,97,174,202,212,133,26,142,239,208,217,53,72,177,84,226,95,239, - 188,140,92,71,169,189,165,223,78,26,181,146,7,190,250,36,193,66,200,232,96,204,230,245,203,153,89,116,104,212,170,68, - 97,139,93,215,92,201,195,15,31,226,191,253,225,167,89,140,28,238,255,242,39,120,203,143,175,162,232,119,81,149,155,168, - 216,117,212,90,169,101,71,201,158,98,212,59,77,101,106,15,161,222,66,121,232,42,226,119,110,119,155,55,189,97,240,209, - 251,239,238,203,220,243,169,53,151,205,143,111,238,130,13,9,60,213,5,71,3,56,223,130,249,22,132,241,139,0,162,241, - 153,121,222,251,137,175,240,115,111,185,149,174,66,238,82,202,233,63,6,0,245,190,140,111,10,129,255,15,170,151,195,238, - 10,176,170,169,197,233,255,244,135,60,214,146,107,118,188,253,102,105,91,85,130,160,2,133,50,133,55,189,161,103,126,255, - 239,109,40,192,218,105,56,243,21,88,252,111,237,159,147,5,254,15,208,249,45,52,28,73,123,244,222,9,162,9,238,83, - 224,143,65,105,10,186,61,232,3,134,93,88,101,96,203,161,156,191,109,239,154,13,99,219,215,95,38,70,50,9,173,184, - 142,107,50,20,206,204,241,224,255,249,48,65,229,141,108,191,237,26,52,139,168,56,1,229,161,201,34,173,196,72,137,176, - 81,106,178,166,117,59,58,90,96,81,72,233,32,150,242,233,117,194,117,87,95,197,3,183,221,56,52,243,185,175,12,118, - 10,54,212,45,199,15,159,93,12,30,251,47,159,215,255,106,253,16,191,1,140,253,250,79,51,246,181,199,40,61,178,151, - 66,250,248,205,221,16,174,135,112,25,214,137,97,110,26,244,181,63,254,182,242,132,163,168,157,153,32,235,101,217,62,180, - 140,85,195,203,248,155,175,125,153,163,11,149,180,66,145,16,11,137,65,35,177,92,56,63,142,137,13,97,208,164,92,234, - 229,198,155,174,103,252,252,105,46,156,63,207,137,35,231,168,53,91,148,74,5,114,121,143,86,171,73,18,71,120,202,69, - 181,165,157,158,155,199,203,164,177,58,73,172,145,42,38,8,234,100,28,15,199,247,136,146,16,17,164,137,24,253,189,125, - 108,218,124,5,235,214,173,160,111,176,135,98,169,132,114,220,52,230,89,199,36,173,58,66,73,140,86,168,140,225,228,193, - 11,220,249,247,15,115,235,149,189,140,207,88,38,38,103,240,179,89,100,70,160,114,61,124,242,238,125,124,232,131,79,17, - 219,60,142,155,240,212,83,95,100,126,113,130,155,110,254,49,150,173,186,145,200,207,18,20,251,72,138,61,232,214,10,26, - 245,167,41,101,46,48,160,38,89,152,57,78,203,221,72,166,107,35,234,45,219,85,237,230,55,247,62,250,192,103,58,7, - 191,242,209,209,85,243,211,59,58,224,176,128,61,6,246,238,131,147,62,204,119,180,239,109,223,110,247,112,106,122,158,123, - 190,254,36,111,127,235,109,196,65,240,131,55,134,151,75,130,211,31,82,0,122,185,126,199,191,10,246,189,80,217,6,207, - 84,128,229,141,186,158,252,205,255,126,243,151,159,217,179,110,251,123,126,202,31,30,44,18,53,91,148,111,186,193,187,240, - 55,31,93,95,56,123,97,151,134,99,151,195,193,253,16,149,219,163,245,163,164,118,120,226,121,31,103,64,172,2,121,1, - 252,13,144,143,82,109,98,95,19,134,29,88,230,195,88,13,70,23,97,240,28,12,76,45,27,232,17,107,175,204,245,101, - 186,168,207,46,226,118,65,156,5,145,40,10,194,195,209,154,167,62,254,85,148,231,177,229,198,109,152,164,133,21,46,137, - 214,120,74,99,117,64,101,126,30,41,92,202,93,253,128,131,69,182,251,61,139,21,150,176,85,33,137,19,10,221,195,236, - 250,137,31,237,57,240,185,175,12,189,2,177,198,40,177,34,214,102,241,213,199,38,235,61,199,38,77,2,12,61,190,15, - 198,103,196,49,144,66,8,222,97,173,249,20,216,38,72,3,29,64,127,0,114,213,101,59,212,198,177,17,190,246,251,127, - 198,154,142,110,116,28,208,159,205,241,234,203,118,113,246,174,47,147,56,30,194,58,56,66,18,91,131,116,4,71,143,29, - 199,154,52,251,188,85,171,34,112,25,89,53,198,208,178,101,140,173,88,164,220,55,200,163,143,62,205,161,67,7,169,54, - 230,112,132,67,198,201,18,39,49,186,73,154,124,42,36,142,43,144,74,160,140,193,10,77,98,18,58,187,58,89,179,110, - 5,155,54,111,100,205,186,181,12,13,15,145,205,57,24,27,166,22,32,6,76,146,164,105,35,78,123,173,195,182,141,234, - 85,7,239,253,203,223,224,169,19,71,40,117,110,228,240,196,113,150,173,42,49,49,222,224,236,217,179,52,131,152,179,147, - 139,44,38,77,148,235,33,181,79,87,214,99,252,228,147,124,224,240,1,54,111,121,45,175,188,253,205,116,47,91,142,113, - 61,34,53,74,152,93,206,108,120,6,79,239,102,48,123,148,188,152,226,216,228,50,146,194,46,74,29,235,176,111,251,101, - 167,250,138,59,70,239,187,251,115,195,197,175,126,120,227,206,122,101,103,55,236,9,225,225,8,30,219,2,167,239,132,240, - 150,111,83,101,91,32,115,248,36,79,62,186,151,61,219,214,254,192,105,110,172,182,120,113,130,211,158,16,255,176,97,145, - 243,114,191,177,9,252,28,216,223,129,234,245,240,76,12,97,95,146,204,21,62,249,185,27,158,120,122,239,142,158,159,121, - 91,207,21,119,220,72,255,166,85,28,124,215,219,6,103,255,251,31,94,221,13,251,59,224,194,126,152,105,144,138,11,51, - 41,143,195,29,224,132,224,27,200,157,132,156,16,162,179,0,35,218,218,81,23,70,66,24,173,193,232,108,70,13,85,151, - 143,118,71,27,54,20,135,175,186,194,221,184,124,132,43,202,30,95,255,139,123,161,101,209,229,60,117,211,164,172,125,92, - 153,37,16,146,216,9,232,52,134,7,63,242,25,138,3,93,44,91,191,10,27,7,184,142,38,104,85,169,77,77,18,6, - 45,84,38,71,161,88,66,122,105,59,102,1,132,33,104,86,153,60,119,18,147,64,20,132,92,121,237,101,242,145,203,86, - 13,5,79,159,24,113,16,87,186,66,196,85,107,199,31,135,202,27,160,89,252,202,35,145,0,91,149,82,72,229,48,26, - 71,252,120,74,184,103,67,88,225,192,242,102,111,79,103,207,142,77,157,29,253,253,68,158,143,49,150,68,1,73,200,246, - 101,99,108,26,26,100,247,248,56,158,244,17,86,146,88,141,116,28,206,157,31,103,97,190,194,208,96,153,90,163,73,117, - 113,14,227,196,116,116,245,48,48,54,200,107,86,142,113,203,107,111,229,217,189,123,121,240,222,251,121,248,193,71,153,56, - 63,133,148,30,57,183,128,227,42,194,168,65,173,17,226,251,14,125,125,93,172,90,179,156,173,91,183,177,117,219,22,134, - 151,13,166,182,171,198,16,235,132,80,71,169,37,172,77,121,162,116,12,105,177,54,245,132,178,6,92,47,195,158,199,143, - 241,249,79,61,194,181,175,249,121,250,10,27,89,49,154,165,48,178,154,199,38,79,240,245,103,31,192,77,36,82,101,80, - 94,54,141,36,180,13,50,142,207,112,255,86,140,8,153,158,188,155,143,188,255,62,198,86,92,201,229,55,188,145,225,245, - 151,33,61,151,68,46,71,139,229,28,174,236,161,211,28,98,77,247,121,102,91,179,204,206,174,193,45,109,39,91,90,71, - 231,143,254,170,92,188,229,142,222,175,124,254,131,221,93,119,127,113,213,85,113,99,101,1,74,49,124,169,4,167,247,131, - 254,78,237,152,186,247,9,214,61,178,7,97,127,0,5,209,75,202,248,31,70,0,250,249,31,187,227,101,127,115,40,4, - 227,90,219,229,159,189,183,50,219,10,247,84,97,222,135,115,219,79,158,62,53,254,159,254,215,229,15,127,242,139,171,86, - 190,243,71,75,249,85,171,229,190,130,191,188,175,30,12,7,144,149,164,194,195,129,182,14,104,64,144,47,35,70,98,107, - 215,74,88,150,129,158,196,218,254,58,140,205,73,70,167,187,75,189,254,214,141,197,190,107,175,202,110,189,254,58,57,184, - 97,61,157,93,93,228,60,15,18,77,117,110,150,51,219,78,179,247,177,253,100,108,142,156,91,38,12,99,84,70,226,34, - 8,181,65,139,58,185,88,242,200,231,191,194,200,202,159,69,217,144,96,161,202,92,181,78,88,115,112,165,196,198,81,218, - 178,184,217,54,87,4,104,77,88,91,64,154,4,172,96,126,250,2,163,203,71,89,249,230,215,246,237,121,250,143,187,175, - 210,102,27,208,237,192,116,11,38,59,225,212,28,156,171,192,124,193,152,16,27,155,12,216,115,32,26,208,225,195,234,16, - 58,162,203,118,12,12,44,31,201,0,204,218,132,185,249,10,29,253,69,140,78,200,36,17,55,239,184,156,221,231,63,77, - 228,104,18,43,48,214,128,181,44,86,235,156,60,115,129,161,129,14,226,32,2,5,149,185,84,76,209,217,219,143,142,35, - 28,79,114,249,149,219,185,226,202,29,252,196,79,253,24,251,246,28,224,137,199,158,230,240,225,163,8,145,142,224,215,174, - 219,201,43,175,191,150,117,27,214,208,211,221,129,200,120,96,53,38,14,208,137,69,27,1,66,33,80,32,36,66,164,27, - 249,105,46,156,68,155,36,213,39,161,48,49,188,247,15,255,128,53,27,174,99,243,85,111,34,23,204,176,125,85,7,103, - 90,189,108,191,106,43,123,239,251,56,81,165,65,44,45,218,196,16,249,184,210,16,198,85,170,181,2,93,221,157,108,223, - 178,21,76,194,249,201,3,220,245,201,67,44,95,249,74,118,92,119,7,157,99,43,9,173,193,235,221,202,124,180,146,218, - 236,110,86,230,206,177,206,123,154,201,197,25,234,254,86,156,100,140,114,223,213,116,253,202,118,121,250,85,111,239,250,240, - 159,254,215,87,190,227,216,222,74,25,14,206,193,248,209,212,219,233,219,15,55,180,70,54,91,63,144,23,169,37,221,16, - 216,244,188,63,255,176,0,145,243,59,191,246,238,151,255,221,74,98,90,17,61,119,63,206,211,173,176,57,11,39,214,193, - 124,0,39,70,44,123,226,221,7,118,46,238,254,205,205,161,159,233,93,158,36,167,53,92,80,16,68,164,251,92,127,159, - 246,231,170,19,49,96,148,122,85,148,232,91,166,50,238,234,70,95,87,201,27,91,150,203,237,220,84,232,189,242,106,247, - 170,237,155,233,31,91,70,33,95,64,160,177,38,65,199,49,81,171,133,43,28,10,249,78,174,184,126,23,123,158,217,71, - 216,140,73,132,139,41,42,78,76,143,179,170,220,75,81,56,52,109,64,62,91,96,238,228,9,230,206,156,162,80,204,80, - 169,212,121,252,201,61,124,240,125,127,205,205,175,190,142,119,253,228,59,8,91,33,174,159,180,125,28,52,205,197,69,90, - 243,139,88,29,162,227,244,197,159,157,156,224,182,55,189,195,255,223,79,28,219,250,245,3,7,123,152,158,93,219,91,173, - 47,174,176,204,101,96,82,192,73,13,135,106,112,2,107,103,14,64,115,17,148,11,125,2,198,166,17,197,145,87,189,106, - 48,167,28,180,209,204,218,128,189,19,11,220,177,236,10,154,245,5,194,176,197,182,21,43,184,122,205,58,30,56,121,140, - 68,185,169,233,153,84,4,81,200,161,163,39,184,250,170,205,184,78,10,14,214,66,101,118,22,79,42,114,165,46,180,128, - 132,4,97,45,221,125,93,220,248,170,91,185,254,230,155,105,181,26,24,157,0,134,92,161,128,114,50,64,132,77,52,38, - 137,48,86,35,5,40,71,130,78,9,122,179,148,45,212,78,154,21,50,181,106,148,86,97,181,197,205,149,249,226,167,238, - 228,171,247,220,207,143,189,231,15,241,187,122,112,170,83,152,150,192,196,9,157,221,253,244,116,140,50,62,127,20,199,1, - 45,35,146,88,224,186,89,92,229,210,106,213,152,153,75,144,86,179,124,120,140,203,119,172,38,138,66,90,213,89,206,237, - 254,40,97,243,42,220,225,109,248,189,61,72,153,195,25,188,141,115,141,115,148,155,79,49,82,154,160,170,90,76,235,38, - 51,147,5,230,239,188,11,142,236,182,203,42,139,13,9,201,210,82,243,146,31,211,203,145,120,188,148,243,188,148,170,212, - 120,236,123,120,161,54,72,227,190,151,28,58,127,104,42,160,197,234,119,97,122,32,37,34,140,232,49,150,67,41,113,28, - 119,192,244,2,84,90,112,202,194,238,14,88,39,130,176,23,152,116,225,169,24,42,187,218,252,79,51,125,98,101,221,218, - 222,86,146,92,190,251,230,235,111,189,252,103,127,212,95,121,229,101,116,118,15,80,46,22,17,184,24,83,131,216,98,194, - 6,70,91,148,148,72,161,144,210,96,116,140,112,44,107,215,175,99,120,120,132,202,153,89,180,74,149,136,98,237,0,182, - 179,135,218,145,11,20,157,28,74,11,178,70,179,255,177,61,100,55,174,226,11,239,255,115,90,159,248,66,243,109,245,32, - 56,60,61,145,63,123,219,171,51,43,150,151,83,235,83,37,105,213,106,212,230,22,176,173,16,107,12,2,7,169,52,97, - 88,161,103,112,132,255,250,145,191,235,90,172,78,117,77,78,76,177,239,254,251,147,175,126,226,51,11,165,221,7,207,111, - 105,197,43,251,97,163,129,19,9,28,158,128,83,82,136,166,180,118,5,208,51,49,48,210,189,245,149,215,148,209,49,74, - 41,138,197,28,143,157,121,140,27,47,187,140,92,38,75,37,105,209,211,108,242,214,43,94,193,222,11,231,168,4,17,24, - 139,81,2,141,228,196,153,51,233,84,80,72,28,41,72,140,1,163,89,24,159,34,9,5,229,254,126,140,6,173,99,140, - 8,81,34,53,148,205,102,51,72,229,97,173,198,152,8,171,147,182,177,25,96,28,4,10,33,52,90,167,213,158,20,96, - 218,161,201,194,62,39,180,177,88,148,80,8,165,8,170,1,127,249,23,31,76,35,169,29,135,140,205,97,18,7,215,19, - 184,40,92,153,165,123,104,152,83,103,159,197,87,5,164,236,68,136,0,76,66,18,122,40,207,18,199,77,90,58,199,248, - 220,4,129,182,148,187,202,20,250,124,60,71,160,226,99,36,103,26,52,167,71,233,27,217,4,57,65,208,53,68,93,189, - 158,227,115,251,25,245,206,112,244,145,255,195,153,15,223,213,124,91,99,97,124,8,78,231,225,104,4,79,184,112,170,148, - 210,129,47,171,98,88,2,18,251,188,95,29,210,165,105,219,150,144,44,217,201,214,158,167,103,211,237,143,239,213,70,255, - 210,73,248,70,7,136,127,214,28,208,11,189,88,178,141,206,165,116,80,54,25,192,124,8,199,28,200,218,244,115,149,63, - 133,232,227,41,127,196,111,183,65,8,33,68,108,173,51,186,125,179,115,213,107,95,77,78,129,112,92,146,184,137,49,18, - 169,34,148,178,88,157,65,57,233,2,37,218,193,160,17,78,130,49,6,183,203,163,88,234,164,170,23,201,40,135,34,1, - 117,163,25,216,186,134,163,231,39,232,52,30,74,122,148,242,125,124,237,107,15,17,253,201,159,52,55,62,125,224,244,6, - 56,225,128,245,79,78,108,56,116,247,189,171,150,253,226,207,72,176,152,48,160,58,63,67,43,104,34,19,129,81,14,70, - 217,246,210,173,67,125,113,138,98,169,72,127,95,137,254,254,78,182,109,223,225,220,246,227,111,239,125,228,254,71,122,159, - 253,212,157,43,159,249,234,189,23,54,207,45,142,142,192,186,12,92,136,173,157,5,70,34,40,231,118,236,40,143,109,89, - 35,34,211,196,35,139,239,120,156,91,152,227,240,228,4,87,141,142,225,196,17,213,102,157,145,114,47,55,172,219,204,157, - 187,159,190,184,21,47,5,28,60,116,156,133,169,10,185,140,160,110,67,132,54,233,135,99,89,152,157,34,182,49,221,3, - 253,8,52,173,122,19,37,21,158,239,35,165,194,232,180,181,82,202,37,165,59,20,194,166,246,159,82,24,76,210,74,237, - 91,93,63,37,151,133,76,173,65,5,36,54,193,36,9,74,42,172,80,72,191,192,61,95,254,18,207,236,222,67,222,207, - 227,187,14,82,104,10,94,157,130,235,96,19,23,233,186,116,116,14,225,56,30,142,167,176,198,65,138,12,218,36,88,101, - 16,142,192,34,152,157,95,192,40,15,47,170,147,143,93,172,22,24,207,67,10,69,193,153,71,133,211,156,157,216,143,59, - 186,158,190,213,155,241,115,93,36,93,59,152,138,214,51,123,236,110,251,182,198,194,248,6,184,43,128,251,66,56,161,96, - 162,158,190,255,146,59,190,139,247,181,253,38,16,58,3,124,186,125,225,188,166,77,110,223,73,234,91,253,76,27,116,30, - 2,238,227,59,135,47,188,220,51,7,140,243,226,133,151,255,44,0,232,155,79,41,181,38,13,247,66,232,183,53,68,69, - 224,179,237,23,115,24,120,36,5,44,83,178,118,174,12,7,131,63,122,255,225,207,52,170,27,95,249,175,126,70,118,142, - 173,32,235,58,184,145,70,203,24,227,104,192,199,42,131,197,32,172,147,218,149,138,4,240,208,54,193,70,17,69,199,197, - 203,88,20,2,89,151,228,189,94,26,165,18,83,173,152,250,226,52,227,251,247,210,119,112,207,244,174,106,229,41,15,30, - 138,5,207,198,144,235,181,188,250,244,103,191,208,177,248,99,111,237,45,120,14,213,233,243,52,26,243,196,26,92,225,161, - 188,12,210,245,168,86,99,76,61,166,191,71,81,89,152,160,220,55,64,98,21,150,26,189,93,157,188,225,77,111,225,142, - 55,190,174,124,232,208,193,242,189,31,248,208,216,222,79,126,121,124,228,236,248,248,58,107,23,59,64,237,67,248,157,175, - 188,118,56,239,186,196,129,1,109,176,137,197,10,151,251,14,29,96,219,200,74,50,218,33,116,35,22,27,243,220,180,97, - 51,15,31,57,200,124,162,209,113,140,231,42,46,156,155,228,194,133,25,214,172,30,36,177,49,174,21,40,229,146,96,16, - 34,161,190,56,131,181,33,221,125,253,228,114,89,234,245,26,65,101,145,92,62,139,235,151,16,202,193,46,205,118,69,234, - 21,36,226,144,168,89,37,136,106,56,158,2,161,176,184,32,228,115,222,223,74,34,176,200,118,66,71,210,108,242,129,15, - 252,13,6,131,192,69,57,89,116,70,227,183,170,248,202,96,148,139,245,36,57,183,128,175,114,228,242,89,146,40,33,8, - 44,202,85,196,196,248,94,9,37,37,36,134,176,90,37,204,250,84,106,46,197,66,9,98,8,26,53,180,235,145,205,100, - 240,11,45,42,23,30,101,234,248,179,228,122,70,217,120,229,245,20,186,6,88,179,122,7,254,189,127,63,23,193,83,45, - 184,127,57,204,45,19,66,127,170,220,203,121,225,80,196,126,203,41,152,32,245,87,202,72,73,40,21,179,97,131,147,213, - 89,222,3,124,0,184,11,248,125,210,72,160,159,109,87,58,191,218,254,222,190,118,107,244,239,128,155,219,85,79,208,6, - 136,137,239,227,69,219,221,6,186,195,237,235,42,119,9,128,190,69,135,246,60,17,225,82,170,68,0,188,11,248,205,246, - 215,156,1,115,6,38,98,184,175,79,27,191,242,103,127,55,243,208,157,95,91,165,110,191,165,47,127,245,102,127,100,245, - 58,58,70,87,146,207,57,148,221,58,94,94,98,93,23,171,12,18,9,70,128,91,96,113,186,78,208,168,50,176,58,79, - 44,66,166,106,57,166,171,13,62,252,135,127,106,221,163,251,155,43,26,141,122,179,177,104,182,199,102,122,165,225,233,8, - 190,14,60,222,99,153,88,128,162,6,213,247,204,225,222,163,255,237,79,110,244,254,159,127,87,8,91,53,112,50,248,126, - 129,102,173,202,196,161,99,236,254,234,67,230,192,35,123,76,77,9,249,147,191,253,107,114,231,101,27,113,43,53,242,229, - 158,84,200,168,53,134,58,174,48,108,219,184,142,173,255,223,255,155,63,255,171,239,89,243,213,143,125,110,249,103,62,244, - 145,41,177,239,208,244,179,153,226,240,239,95,127,117,65,64,234,241,99,36,65,173,137,167,60,158,61,127,138,199,78,29, - 225,218,21,43,73,154,243,52,77,72,87,161,155,235,86,175,229,179,207,238,70,41,31,7,65,16,180,56,53,51,193,198, - 205,99,228,27,49,218,21,88,145,178,30,70,91,48,134,218,252,34,58,140,233,27,25,166,80,42,209,168,24,154,139,45, - 16,33,126,54,79,198,207,130,84,104,44,113,28,17,53,234,36,65,19,235,8,156,76,14,161,60,140,21,237,8,238,118, - 44,135,84,8,44,24,139,116,61,238,185,251,30,158,120,236,9,164,204,32,165,32,155,207,32,20,41,32,73,11,86,227, - 56,2,63,171,200,100,28,162,40,198,36,186,189,100,107,137,163,152,197,133,5,114,126,22,207,245,48,81,196,252,252,2, - 185,124,158,90,189,138,239,250,56,174,131,18,1,45,233,226,185,46,130,132,110,223,229,193,187,63,196,23,62,255,127,184, - 229,77,239,166,35,174,165,51,17,168,10,168,127,26,244,96,255,24,79,245,175,16,70,27,123,252,133,232,75,33,136,132, - 130,36,194,181,150,3,213,89,94,101,18,46,36,14,127,14,188,17,56,72,234,69,21,183,39,181,223,188,44,189,20,70, - 240,173,184,160,239,231,201,2,203,219,143,173,126,9,128,94,26,65,119,152,52,217,50,76,117,64,118,11,212,119,192,179, - 139,80,45,195,254,142,243,147,155,26,127,249,161,13,115,127,197,202,135,123,75,253,193,198,45,101,59,208,159,17,29,174, - 83,30,232,35,55,188,140,114,247,32,94,28,81,244,5,34,59,192,193,67,167,56,126,244,0,141,146,203,236,252,130,205, - 29,57,95,95,57,63,55,181,78,71,147,131,105,16,197,148,132,170,77,237,82,15,145,146,196,179,247,130,190,28,130,34, - 60,174,160,167,250,55,31,41,63,45,212,21,93,111,185,53,27,5,33,167,31,123,218,94,248,250,61,65,241,240,201,249, - 177,122,60,190,25,154,53,232,120,242,151,127,125,153,255,191,254,123,199,166,87,94,43,164,93,32,147,247,16,202,69,10, - 23,99,85,59,23,62,97,120,176,151,127,241,43,191,232,206,252,204,59,71,190,242,229,123,71,234,95,249,58,179,211,19, - 212,23,150,81,236,44,145,4,9,245,70,3,148,131,80,138,47,237,126,130,109,163,99,100,29,159,36,105,161,116,204,173, - 219,118,240,236,133,115,140,87,234,40,41,8,195,144,233,249,25,172,35,200,40,73,160,4,137,146,88,29,227,41,7,172, - 192,2,173,90,157,233,11,227,244,13,15,81,236,236,38,172,212,168,86,22,152,175,84,210,197,87,44,137,209,32,5,210, - 88,60,199,161,88,236,38,155,43,160,73,3,28,219,126,176,96,117,250,103,210,120,25,41,21,79,60,254,20,81,148,224, - 184,25,132,84,72,7,144,22,215,19,64,130,78,82,71,183,32,108,17,197,17,142,147,73,237,65,180,190,104,186,6,16, - 132,1,58,73,200,21,10,212,27,117,102,103,102,25,28,24,68,72,65,38,147,65,74,73,20,4,216,36,0,82,23,131, - 171,175,216,204,71,62,243,73,123,240,247,126,253,194,45,94,166,208,137,136,19,172,206,183,51,198,102,162,144,215,75,41, - 173,49,198,55,198,10,251,141,224,51,23,54,217,216,92,224,125,115,147,252,86,28,114,167,73,216,108,45,3,207,123,159, - 186,207,187,145,62,159,19,250,65,57,75,2,94,143,139,41,54,151,0,232,197,32,247,147,237,143,165,243,46,176,59,161, - 218,7,135,154,112,182,9,207,248,176,108,196,176,98,217,84,117,5,83,15,143,54,160,187,9,158,150,66,170,82,209,9, - 189,140,87,211,113,113,206,147,185,8,71,121,113,28,220,22,132,11,34,136,26,142,53,81,65,155,105,7,14,39,112,50, - 134,243,110,90,25,55,27,208,234,128,186,128,214,211,96,63,6,60,0,250,55,97,60,17,226,254,162,181,170,241,215,127, - 59,113,242,99,31,31,115,132,16,157,141,86,109,5,204,122,112,74,167,9,203,181,28,140,244,93,152,190,242,200,207,191, - 231,242,125,111,123,195,178,235,126,226,93,106,205,154,49,92,39,64,100,36,42,159,65,74,175,221,96,42,172,209,244,229, - 242,252,196,219,222,193,59,223,240,22,158,121,244,81,190,252,185,59,89,190,97,37,171,214,108,32,182,233,174,87,94,249, - 140,207,47,178,255,220,5,174,26,25,193,177,9,149,70,147,114,161,196,91,174,185,129,191,248,234,151,48,194,144,203,120, - 140,12,244,19,155,4,199,145,100,28,149,242,52,142,147,2,134,49,36,73,130,227,186,52,235,117,198,207,158,161,119,112, - 132,76,103,39,29,74,48,55,53,65,18,181,82,133,183,214,88,11,137,177,168,92,14,199,203,130,112,48,86,98,72,23, - 139,133,181,169,159,52,169,1,155,148,233,37,153,36,73,10,8,72,252,76,150,66,190,72,83,202,118,76,147,32,142,45, - 81,108,72,76,186,221,239,186,46,73,148,18,239,82,74,146,36,193,247,125,76,146,198,122,87,106,21,138,249,34,139,11, - 139,20,139,69,242,185,2,90,27,28,199,197,201,8,130,184,129,235,150,105,180,52,190,245,184,124,199,21,162,246,232,3, - 185,245,173,74,171,19,188,6,244,199,208,251,223,32,122,255,252,68,156,205,20,116,165,123,72,202,48,178,66,63,55,188, - 86,82,49,93,91,224,134,233,227,68,223,52,85,250,167,120,17,119,0,215,180,129,200,254,19,251,63,56,63,8,15,66, - 183,251,218,61,16,91,88,92,9,213,6,156,179,176,55,130,14,13,189,121,40,21,193,193,88,97,23,171,66,67,78,66, - 183,133,46,1,142,72,189,202,38,85,106,92,21,3,139,81,58,18,159,143,160,53,15,73,23,152,22,169,195,98,134,116, - 195,127,233,109,57,11,81,100,237,241,30,168,249,176,119,172,25,244,164,77,7,45,155,38,131,76,59,48,23,65,104,161, - 75,194,241,13,245,214,153,217,191,254,232,149,15,126,229,222,245,15,223,126,71,247,142,183,222,33,215,109,26,65,84,18, - 28,39,75,54,87,38,147,205,164,182,111,66,160,77,21,28,151,93,215,95,199,182,203,183,112,230,252,25,246,29,220,71, - 161,51,143,209,17,113,93,35,4,60,116,228,0,155,187,251,192,64,236,74,162,86,139,109,67,163,236,88,177,146,39,78, - 30,98,229,216,8,91,214,175,79,39,227,158,32,231,102,144,198,208,50,26,29,155,116,148,174,210,216,29,132,32,168,55, - 24,191,112,158,254,225,81,114,165,18,157,194,80,153,153,78,101,12,142,3,198,16,145,128,235,226,120,89,180,85,169,143, - 180,48,169,254,199,74,108,234,68,157,166,112,96,0,69,127,255,0,74,165,127,151,36,22,99,12,142,114,240,51,30,142, - 82,40,149,69,57,62,249,66,23,202,113,241,51,25,146,40,38,12,195,52,231,204,113,112,92,23,225,56,132,129,197,74, - 73,179,213,36,155,201,50,63,63,79,33,95,164,179,195,35,73,18,188,140,143,227,103,8,2,131,163,4,73,43,98,197, - 224,50,38,95,125,91,215,251,238,127,40,249,209,249,133,100,23,220,146,128,73,224,193,159,131,211,155,38,79,4,159,136, - 154,230,129,242,16,195,78,6,169,35,148,77,249,65,7,251,79,18,108,190,213,185,177,253,235,103,191,203,106,104,105,216, - 249,66,64,102,127,88,1,104,105,130,22,181,127,63,0,230,35,208,250,21,104,77,164,137,170,103,22,83,253,172,176,109, - 240,112,193,77,192,183,144,117,64,68,16,89,104,212,32,30,2,83,77,61,124,226,205,96,159,4,142,181,53,20,29,47, - 80,70,183,109,103,109,111,90,29,157,109,193,164,3,174,74,57,0,109,32,9,32,89,3,166,15,56,11,141,22,84,18, - 56,219,3,7,123,199,39,47,155,248,171,191,222,246,196,103,63,181,102,239,107,95,213,179,253,45,175,87,171,55,172,32, - 9,38,168,26,131,159,41,146,237,200,33,10,185,118,230,87,140,231,43,214,174,91,199,202,213,154,237,235,54,242,166,55, - 190,158,143,124,232,99,60,249,212,51,236,62,190,159,67,43,86,177,105,108,25,113,220,34,1,188,48,224,214,157,59,57, - 120,234,16,171,215,172,96,160,167,11,97,3,80,18,225,56,120,198,160,181,67,100,108,58,209,146,138,36,138,145,164,173, - 85,24,71,204,205,78,147,205,46,35,83,44,211,227,231,169,204,205,210,172,86,17,90,227,229,114,148,251,250,17,78,134, - 37,27,75,113,241,109,151,86,57,75,138,104,107,210,102,172,88,204,97,109,130,209,18,207,243,200,102,51,52,37,40,9, - 81,20,34,133,139,69,80,234,236,70,58,138,56,138,200,102,179,196,113,140,214,26,165,84,90,169,73,121,145,23,66,164, - 45,89,28,197,76,76,142,35,133,160,84,42,209,106,74,6,6,71,72,10,1,34,8,136,234,17,141,36,98,120,120,136, - 210,27,223,236,220,249,236,177,209,35,7,158,44,190,182,217,236,44,65,201,194,125,231,172,57,54,54,119,161,22,55,107, - 118,117,190,155,185,234,36,65,18,179,81,8,250,237,15,103,202,196,171,219,215,199,233,151,43,237,187,245,38,138,115,243, - 204,61,179,7,233,121,208,174,16,83,45,149,133,40,38,250,30,78,224,156,31,196,39,209,182,201,106,128,65,176,14,68, - 127,0,252,113,187,133,115,129,63,7,70,160,50,3,236,39,141,232,185,162,253,241,31,219,147,1,159,139,33,128,223,192, - 65,125,43,194,220,1,150,129,249,91,8,126,25,2,213,254,89,91,128,25,210,165,198,101,109,128,44,195,226,126,216,31, - 195,249,24,158,29,130,77,195,115,149,157,83,127,251,137,29,207,124,254,171,107,142,190,225,182,158,245,111,125,181,187,114, - 205,90,146,102,196,66,117,1,145,115,201,117,116,145,45,150,144,202,193,152,8,33,160,163,167,200,237,111,126,45,55,189, - 238,102,14,238,63,194,103,62,246,247,156,219,189,159,245,118,8,33,12,137,128,40,106,177,186,187,135,203,86,172,98,221, - 230,245,120,133,44,178,25,33,148,2,165,80,66,224,42,23,235,88,172,11,113,172,193,145,8,157,102,139,121,74,224,9, - 145,146,192,158,143,113,93,202,67,163,100,59,155,136,56,193,201,122,8,199,35,209,2,229,40,140,142,145,194,166,244,15, - 50,245,38,146,22,97,204,197,59,97,162,99,44,38,181,246,48,49,25,79,160,51,18,209,212,40,149,250,25,107,12,185, - 114,9,39,227,161,16,184,174,139,159,205,18,180,90,237,133,216,24,199,203,224,56,110,186,110,34,36,81,16,81,169,86, - 208,70,51,206,56,153,140,143,239,101,9,234,77,108,62,38,215,161,40,117,15,147,13,13,141,100,134,142,216,208,187,235, - 26,198,215,45,239,248,204,163,143,94,251,234,19,71,11,253,208,23,192,215,250,97,207,191,105,85,231,163,86,213,24,224, - 66,251,117,206,192,15,85,5,180,116,252,246,175,43,218,215,5,75,96,241,29,226,33,230,129,207,190,230,86,110,253,139, - 247,49,98,52,221,83,147,56,174,228,136,84,56,24,6,50,62,61,129,166,231,175,62,72,183,16,20,30,120,152,137,103, - 246,124,67,48,196,203,105,0,157,127,10,79,234,82,117,212,106,127,44,69,52,47,137,190,158,4,150,50,238,159,31,106, - 247,114,9,195,214,243,166,27,75,158,212,223,172,164,205,167,178,130,56,134,153,69,88,172,192,25,23,246,245,192,83,125, - 11,149,203,170,31,248,228,246,103,63,245,149,181,123,126,228,166,190,45,239,120,131,179,105,229,106,104,105,42,141,73,234, - 153,25,242,133,34,133,114,23,210,247,1,131,214,45,148,35,216,190,125,19,59,118,94,193,189,95,254,60,207,254,221,157, - 44,235,236,69,39,9,6,77,220,108,240,218,107,175,167,123,243,102,18,29,227,96,113,164,72,163,119,132,197,113,21,82, - 186,237,40,30,131,20,14,38,1,109,45,153,124,129,82,87,55,202,203,96,68,59,198,71,72,220,108,17,149,181,152,196, - 64,34,80,210,1,13,66,56,128,193,202,84,246,96,76,123,13,67,210,142,39,2,180,69,161,210,93,181,56,162,90,173, - 224,245,141,162,45,8,71,161,172,73,205,253,51,89,92,225,145,241,4,198,164,36,112,54,227,35,164,160,22,133,88,171, - 83,0,138,116,218,24,73,136,147,152,102,171,73,146,36,184,174,199,208,192,32,218,196,100,101,142,108,174,68,100,13,89, - 223,163,51,59,12,197,132,70,165,197,138,158,126,146,183,190,205,127,108,207,158,203,183,220,125,87,231,170,36,234,76,160, - 83,194,83,29,48,62,10,225,89,248,161,143,59,94,58,183,181,193,231,2,16,89,251,130,23,251,125,82,242,176,82,124, - 162,148,101,199,96,31,119,36,9,228,124,252,229,203,16,210,50,166,20,214,106,132,227,177,44,219,193,178,63,122,47,18, - 139,174,207,209,251,145,143,193,227,79,131,235,96,58,74,72,235,178,99,235,14,68,154,197,242,195,3,64,223,170,109,19, - 63,0,143,193,73,249,171,216,135,217,10,84,26,112,46,3,251,243,240,244,182,106,237,138,234,135,62,119,213,163,247,62, - 177,254,203,183,221,80,188,254,213,55,137,213,43,135,41,169,12,141,185,57,26,243,21,178,29,93,100,59,75,72,191,136, - 72,210,84,83,237,86,185,252,134,87,240,236,87,31,198,54,83,99,144,136,4,17,135,20,115,5,162,201,121,154,11,117, - 148,167,41,229,178,184,74,97,132,64,184,18,29,130,39,37,74,164,36,178,245,124,188,108,150,76,190,3,161,92,172,0, - 217,22,52,98,116,170,243,65,180,45,72,12,2,157,42,193,5,88,155,90,146,24,97,48,50,13,128,182,109,112,19,104, - 50,25,15,129,197,65,129,181,212,155,17,101,45,209,56,88,233,226,181,127,180,151,201,82,200,228,136,117,3,207,241,176, - 94,134,168,221,134,229,50,62,137,142,241,114,57,18,99,8,195,16,107,45,9,9,142,118,112,179,46,51,115,211,56,174, - 162,175,175,15,89,149,68,42,71,190,3,176,17,210,228,32,235,210,211,81,38,104,54,169,87,155,100,174,187,81,29,237, - 237,91,179,248,249,191,207,111,173,84,251,124,24,136,224,129,81,56,57,2,141,14,48,179,255,12,128,40,211,254,117,117, - 179,69,156,36,212,129,74,251,243,79,9,201,111,43,197,61,158,67,36,21,125,82,226,39,58,29,98,104,131,49,49,82, - 66,164,12,214,106,60,35,48,42,4,66,116,146,96,149,160,244,51,255,130,235,127,238,23,136,177,36,214,66,163,194,143, - 190,253,29,92,121,197,46,126,235,143,222,135,251,183,31,33,8,130,111,107,56,232,112,233,124,79,42,180,98,90,21,197, - 13,152,173,67,197,131,115,49,28,47,66,227,138,241,137,210,39,246,61,187,218,121,251,155,157,125,199,78,225,74,24,234, - 235,101,100,104,144,122,101,145,74,109,145,66,161,76,161,80,70,102,60,84,226,82,204,22,216,120,227,149,156,251,194,61, - 116,228,92,76,168,49,86,18,88,141,188,48,203,252,133,41,250,215,14,97,17,184,25,15,35,210,85,136,200,137,16,82, - 224,23,20,210,113,17,174,151,110,246,91,121,209,58,35,69,151,54,202,144,122,69,199,34,37,129,211,225,187,70,152,246, - 215,90,213,94,64,77,37,123,50,141,64,73,199,191,89,47,101,229,148,33,140,99,180,38,21,132,90,157,2,149,149,96, - 28,130,40,68,155,164,29,145,108,200,23,10,56,97,72,181,90,197,245,50,72,157,78,200,60,99,169,215,235,88,107,113, - 93,151,32,10,48,85,131,159,241,89,88,88,160,84,42,145,113,61,230,231,231,112,28,69,169,92,38,136,67,92,225,18, - 134,17,126,33,79,38,87,32,12,66,202,155,54,139,153,129,158,225,123,62,253,247,165,93,39,78,246,116,194,64,19,30, - 184,10,246,1,51,42,29,120,252,80,182,97,255,144,211,176,108,8,163,116,170,9,156,22,146,91,51,62,139,58,161,0, - 20,172,109,79,2,237,139,191,243,106,131,105,214,254,1,23,100,162,128,213,171,86,242,193,247,255,41,51,191,244,139,204, - 252,241,251,89,248,224,71,49,173,214,11,254,116,121,9,62,190,55,156,149,38,85,10,23,149,100,205,166,149,113,73,136, - 57,13,39,45,156,93,180,4,87,190,242,122,110,121,213,237,220,241,250,55,179,126,199,229,156,188,48,197,157,95,185,155, - 19,39,207,32,173,67,115,113,158,11,103,142,48,57,113,154,160,50,139,9,106,92,126,227,117,168,190,46,90,145,193,117, - 50,104,12,218,104,220,70,200,153,61,7,73,34,77,173,25,208,10,99,164,116,177,66,225,248,57,220,124,17,167,88,66, - 100,243,224,100,48,109,127,35,33,213,18,149,136,21,162,93,253,144,122,69,27,129,163,21,50,17,105,116,128,85,96,28, - 172,149,169,49,91,170,45,111,127,127,250,125,133,114,39,94,214,71,170,52,220,208,117,60,16,26,217,38,128,116,148,160, - 112,81,174,194,113,20,74,41,92,215,37,12,3,132,16,248,190,79,171,149,110,80,105,109,240,50,25,124,223,191,248,152, - 16,208,10,90,196,73,76,162,19,78,159,60,197,252,252,60,97,24,50,55,55,71,189,94,187,168,101,74,172,166,21,70, - 169,239,134,114,80,40,58,186,250,112,223,245,19,197,7,111,190,113,215,241,76,230,45,46,252,152,129,87,39,176,106,13, - 100,71,254,9,143,222,95,238,141,114,137,182,72,218,124,145,252,62,92,11,81,24,98,26,139,244,174,89,197,150,247,255, - 111,86,61,121,63,215,255,236,187,209,126,134,228,155,8,236,75,0,244,61,122,97,11,215,110,165,244,23,191,65,199,215, - 223,199,201,95,251,9,62,150,246,220,158,128,210,98,185,84,216,250,186,219,157,184,85,35,142,99,70,71,151,243,198,183, - 189,157,91,94,243,90,38,166,23,248,179,63,255,32,71,14,159,38,235,23,48,113,200,212,212,89,230,166,206,209,89,42, - 50,118,249,118,154,77,141,171,124,12,224,68,26,7,48,243,77,206,236,63,65,189,209,98,110,122,134,185,137,105,130,70, - 11,199,91,90,56,109,3,133,77,39,88,130,52,27,222,144,242,48,73,219,15,218,146,170,168,149,213,56,58,74,53,63, - 8,18,36,186,237,196,8,233,254,151,112,74,224,116,32,156,34,80,64,73,31,109,210,189,48,99,192,26,141,181,6,163, - 65,73,23,136,48,218,146,201,102,113,92,15,209,254,58,99,82,49,98,46,151,67,169,148,173,75,18,141,53,134,142,142, - 14,178,217,180,104,183,198,162,28,69,43,108,17,4,45,140,78,56,119,246,44,73,146,10,25,167,166,166,9,131,16,129, - 68,73,7,137,32,10,67,28,169,80,66,225,58,25,58,243,157,12,189,246,77,238,161,159,250,233,181,247,12,15,189,166, - 9,239,116,224,13,30,108,207,64,231,111,129,204,241,195,181,224,249,98,222,175,223,111,225,162,5,116,16,18,53,42,244, - 175,91,205,235,254,252,253,44,127,226,126,214,252,234,191,161,176,115,219,69,224,185,212,130,125,23,199,180,73,234,210,255, - 243,47,136,223,118,43,145,54,184,74,17,158,28,103,52,213,16,117,88,24,74,6,122,74,67,107,87,96,226,38,160,136, - 162,22,17,134,193,193,1,182,110,187,156,255,241,187,239,229,243,159,189,155,155,110,122,5,175,187,227,70,214,108,94,65, - 216,106,82,57,119,150,45,187,182,49,241,240,51,152,200,226,40,133,147,24,34,215,144,23,25,78,61,117,16,191,183,3, - 183,84,32,50,1,97,16,208,170,53,200,117,116,224,186,30,202,115,145,34,165,211,141,16,8,156,116,149,130,148,7,18, - 194,164,122,31,218,58,37,82,165,143,112,188,20,112,144,128,70,7,13,230,102,43,60,187,247,49,142,28,57,194,209,19, - 199,169,84,106,28,61,122,146,102,43,193,207,56,56,42,105,147,214,138,32,0,147,104,92,39,65,8,75,161,80,166,88, - 238,32,8,26,120,153,12,82,73,226,40,194,113,20,229,114,153,106,181,138,209,134,140,239,224,121,30,97,54,36,73,146, - 139,130,71,173,53,213,106,21,155,203,33,149,195,233,51,167,88,189,106,53,126,214,103,97,110,17,37,93,84,94,161,28, - 7,19,39,32,13,158,227,166,109,32,22,153,24,134,215,110,161,241,158,213,93,247,126,225,179,215,238,120,248,161,238,101, - 214,14,68,112,207,182,212,76,111,250,42,184,100,75,255,253,186,78,130,144,136,144,242,250,53,116,254,254,239,99,103,39, - 248,179,233,169,75,0,244,114,80,253,249,228,119,63,233,86,242,248,31,124,20,241,135,31,7,173,113,114,25,114,198,178, - 28,60,3,253,17,12,251,91,54,229,187,123,186,48,205,22,105,60,160,193,145,134,218,194,34,73,28,80,44,148,56,120, - 232,60,31,254,232,151,248,252,231,190,196,101,215,109,227,71,223,248,35,92,181,115,39,133,129,46,198,46,95,207,249,199, - 14,162,146,20,40,194,56,198,119,125,50,145,160,118,118,150,161,237,61,196,113,11,172,165,58,59,75,109,126,17,229,58, - 160,210,145,186,163,36,142,151,69,121,62,158,231,225,185,46,74,201,148,10,34,181,221,176,34,109,205,194,102,131,218,204, - 2,23,206,79,50,49,62,207,131,143,238,225,200,177,115,140,79,157,231,212,233,99,52,90,1,202,73,223,54,89,63,79, - 46,87,194,81,146,40,10,8,227,38,89,225,130,200,131,53,56,78,68,146,52,241,157,44,158,235,163,164,68,88,112,149, - 11,14,184,142,139,231,198,116,118,116,210,106,181,112,164,67,208,12,40,20,10,180,90,45,146,36,65,41,133,227,56,68, - 97,72,144,196,20,50,30,245,122,141,169,169,41,186,186,123,8,90,49,70,27,250,7,7,241,179,89,50,94,134,56,12, - 193,88,50,153,12,74,57,36,38,70,9,129,151,47,211,241,174,127,225,31,94,187,97,235,236,39,63,214,185,165,86,237, - 143,161,95,192,67,255,17,206,84,161,53,115,233,109,254,253,3,162,48,194,132,115,80,200,210,95,94,117,9,128,94,44, - 223,182,84,170,6,221,69,196,181,27,80,218,48,215,126,242,150,3,178,61,61,144,142,195,212,147,199,152,157,175,16,64, - 193,194,138,166,80,203,54,189,243,237,57,229,56,36,66,97,173,69,160,81,54,66,135,117,226,86,29,19,69,224,68,72, - 33,169,198,134,175,220,245,8,143,221,187,155,107,175,187,154,55,191,237,181,108,217,188,138,153,195,231,17,115,53,66,98, - 76,148,208,116,35,138,110,142,233,125,39,176,89,65,71,119,145,156,155,33,227,103,81,66,96,226,136,56,136,16,114,73, - 152,232,34,165,139,227,56,184,109,0,114,92,23,99,12,65,24,50,55,49,201,204,169,227,212,166,78,227,235,136,142,174, - 46,170,147,1,31,252,139,191,162,34,11,72,71,225,59,138,124,161,204,115,121,209,32,132,38,142,66,130,32,100,97,113, - 154,14,20,88,31,33,13,158,151,106,132,48,144,201,228,176,218,16,133,17,174,235,144,245,211,132,184,180,210,18,248,126, - 22,185,180,162,17,37,20,75,69,106,213,218,197,10,72,72,73,20,199,52,91,45,178,94,150,233,233,105,124,207,167,80, - 44,209,108,212,153,153,158,97,96,100,20,33,52,94,198,67,34,72,116,132,148,160,156,20,132,132,176,136,80,179,252,154, - 235,229,252,216,138,177,199,255,238,3,165,45,199,143,246,20,161,59,134,251,11,112,120,13,84,138,96,47,5,55,127,31, - 79,162,73,18,141,231,94,2,160,23,77,48,119,237,92,5,63,125,11,167,119,172,34,142,147,23,236,159,109,62,71,249, - 61,127,65,117,166,34,61,232,49,176,198,172,95,55,180,252,218,43,68,208,172,3,42,157,120,91,129,213,22,97,4,7, - 14,28,228,252,249,115,56,174,0,155,96,145,248,210,39,136,52,95,186,231,94,238,185,255,126,110,186,237,149,12,121,89, - 174,232,30,196,183,224,8,65,172,35,60,153,26,238,139,4,142,61,245,8,61,158,143,182,2,63,159,167,216,221,135,223, - 145,238,118,57,202,65,154,42,96,48,66,210,136,19,90,173,58,173,234,34,73,216,162,90,93,32,151,132,12,122,134,53, - 195,14,121,175,139,76,161,72,166,152,167,171,203,39,138,29,132,80,8,173,211,165,84,155,198,246,8,33,104,181,90,100, - 188,12,66,89,154,149,25,60,4,161,1,33,124,242,66,96,100,3,39,155,101,100,120,37,231,78,61,75,43,104,144,203, - 117,147,196,26,207,115,201,248,89,130,86,61,53,63,75,12,89,223,167,218,38,151,93,215,33,142,19,176,233,106,137,144, - 146,48,12,241,253,44,26,195,249,137,243,140,58,203,144,74,176,88,153,71,184,146,238,238,30,100,46,135,146,50,173,180, - 68,186,80,155,113,61,12,26,35,32,105,54,233,30,24,70,255,187,95,239,220,247,137,15,95,179,242,235,247,116,13,192, - 64,12,95,237,135,167,223,7,115,185,84,164,112,233,124,159,207,37,0,250,78,0,84,206,177,242,55,223,78,97,199,42, - 28,11,241,124,125,105,10,253,15,201,61,33,57,143,37,1,47,3,195,13,88,237,92,113,69,103,174,171,19,130,26,200, - 182,157,131,117,8,91,134,56,178,8,225,18,90,139,176,94,234,179,108,19,12,49,214,1,215,129,88,107,190,252,149,251, - 209,38,130,155,111,229,142,181,27,104,132,53,116,20,17,37,13,172,7,11,103,166,216,212,157,165,91,47,18,197,134,160, - 57,195,98,237,60,21,105,137,98,1,26,242,158,70,235,24,132,196,24,131,82,208,145,243,232,202,185,100,59,193,179,46, - 33,9,129,114,208,78,30,145,43,19,213,27,36,42,139,138,45,74,90,180,1,99,82,0,18,237,134,84,107,67,172,45, - 174,155,65,68,33,34,73,136,84,145,122,224,80,84,6,109,2,2,58,200,229,251,200,250,62,142,227,226,58,146,172,159, - 67,39,233,184,189,213,170,147,203,103,169,87,91,180,146,136,124,190,192,212,204,20,65,216,74,205,207,172,33,227,186,196, - 90,163,141,165,25,180,200,250,62,137,73,24,31,63,207,200,208,8,249,98,129,218,226,44,185,172,143,82,233,22,189,178, - 110,10,100,66,181,157,52,221,116,191,77,9,162,48,0,41,232,121,231,187,114,199,135,134,183,206,125,226,227,229,245,81, - 152,159,7,103,5,60,81,134,185,16,180,250,103,52,37,187,4,64,63,128,199,91,49,64,199,174,245,80,105,164,201,16, - 124,139,119,164,35,241,166,23,217,120,126,134,253,144,179,48,90,135,145,149,175,185,53,231,180,219,47,41,82,247,63,105, - 53,166,109,73,225,251,62,153,76,134,40,1,41,69,106,229,209,206,113,183,128,163,20,56,18,18,143,71,158,221,203,174, - 177,21,120,128,107,72,205,200,200,112,238,248,105,114,45,232,89,110,41,120,154,66,162,233,83,146,4,151,216,180,72,226, - 4,69,38,37,161,29,133,227,121,233,191,101,12,88,13,137,37,116,125,76,174,3,223,203,144,241,114,248,249,2,181,230, - 34,97,164,177,194,71,155,182,72,13,153,122,253,8,145,114,58,194,162,117,128,235,100,105,181,2,162,56,192,136,50,21, - 221,192,247,52,106,209,18,75,129,240,179,32,60,194,168,65,54,107,113,148,68,39,169,124,192,81,30,113,148,144,205,101, - 169,84,43,184,142,147,90,223,11,73,28,199,72,41,105,180,90,169,37,145,76,249,32,107,12,25,207,35,20,33,179,243, - 179,105,101,41,139,84,22,22,112,29,7,87,185,36,50,78,167,45,142,69,74,217,110,69,83,98,91,202,116,89,55,170, - 69,244,188,226,6,103,118,112,112,213,254,15,126,192,221,50,53,237,89,40,238,134,39,94,7,231,207,64,216,184,116,25, - 92,2,160,127,12,242,199,2,255,225,240,57,242,111,255,159,237,139,239,219,16,108,2,8,18,78,44,212,132,73,55,244, - 87,200,177,177,190,161,93,59,132,14,67,116,98,176,194,34,164,66,0,113,156,198,221,44,44,204,147,196,26,219,94,198, - 20,136,180,221,17,6,172,192,24,11,66,227,8,135,179,115,21,158,188,112,134,155,150,175,34,14,170,24,9,42,148,12, - 100,75,28,57,126,150,229,43,150,83,246,154,248,82,35,66,11,73,130,114,219,91,238,90,161,68,146,122,60,199,33,56, - 14,82,57,168,92,1,215,203,64,182,76,156,205,164,73,176,6,66,147,86,79,218,90,148,112,144,82,161,173,69,24,157, - 174,122,0,190,239,183,219,81,75,172,35,170,139,85,220,36,194,201,100,72,156,14,90,97,3,234,211,148,186,7,137,202, - 125,8,225,97,76,189,29,131,220,194,115,51,24,99,145,56,180,90,1,253,3,93,56,142,75,165,86,193,115,93,162,56, - 68,170,244,249,114,93,151,36,73,136,227,228,226,90,147,163,20,158,239,81,169,84,112,84,202,109,37,218,32,133,32,231, - 231,8,140,65,250,105,84,184,54,26,199,49,40,153,142,253,149,82,24,107,80,66,160,91,1,229,101,43,136,126,254,95, - 143,238,251,240,7,95,189,230,196,241,238,28,244,41,184,127,59,156,116,160,230,94,42,132,46,1,208,247,227,44,245,249, - 9,233,242,36,22,116,71,158,241,31,185,138,133,235,55,227,198,9,147,201,119,96,3,60,23,142,156,103,230,247,63,67, - 0,153,44,140,6,176,62,185,106,87,111,247,72,31,81,216,192,81,109,245,133,0,163,53,73,28,33,133,192,243,188,246, - 184,184,13,64,162,173,57,54,242,121,44,84,170,157,49,74,114,215,222,103,184,106,120,57,217,172,143,209,9,194,104,178, - 34,131,34,203,185,169,144,174,117,62,166,217,66,198,2,233,132,184,133,44,20,58,49,38,3,218,34,173,70,74,129,227, - 185,72,223,71,171,12,137,148,36,194,1,225,96,69,130,32,6,41,169,214,154,52,234,77,92,223,193,42,7,129,76,221, - 17,17,8,37,72,18,147,106,114,172,70,11,77,117,161,134,215,168,113,228,232,126,190,254,236,125,76,157,59,77,148,127, - 146,155,239,248,89,250,139,5,138,197,50,177,142,136,162,0,172,37,151,203,131,149,228,243,121,130,32,32,10,67,186,58, - 59,152,157,157,65,199,49,38,142,113,189,12,113,18,183,129,39,125,129,172,16,88,1,65,20,81,173,215,112,149,199,204, - 236,44,66,64,185,212,193,92,98,112,28,143,193,193,65,162,56,253,191,248,89,15,129,65,72,69,18,235,139,45,115,90, - 57,41,140,209,200,254,97,17,254,155,95,233,127,236,99,31,190,113,211,99,143,116,15,64,95,8,247,70,176,231,231,97, - 190,4,102,242,18,102,92,2,160,239,25,25,15,108,219,181,142,205,221,69,186,194,152,226,80,23,211,55,108,225,102,207, - 101,98,160,19,25,166,214,3,223,241,248,30,162,210,196,79,127,102,65,192,170,10,172,236,186,225,218,172,227,8,116,144, - 182,46,44,45,142,26,67,18,133,56,40,58,203,29,233,218,65,156,70,1,89,107,177,86,60,103,79,1,233,132,77,10, - 140,167,56,51,53,205,67,135,14,242,234,203,47,35,172,46,160,140,129,48,98,89,103,63,11,103,23,176,43,251,16,109, - 19,121,169,66,12,46,153,108,23,38,155,71,27,131,176,26,129,193,96,137,218,160,107,149,192,90,147,250,157,144,238,132, - 105,35,105,133,49,219,119,172,231,192,193,99,180,106,6,63,151,79,125,161,69,42,102,140,163,4,221,230,86,98,27,179, - 103,239,93,76,157,58,196,98,165,130,146,154,108,214,165,57,255,56,159,252,192,89,150,13,172,38,138,82,71,71,219,222, - 130,15,154,1,126,54,143,16,130,124,46,155,146,197,94,134,124,46,143,49,154,140,231,81,15,154,44,9,31,4,224,184, - 46,218,104,162,56,198,247,50,52,27,77,188,76,170,251,153,155,155,195,113,92,148,227,50,55,59,75,119,119,55,89,149, - 218,128,184,142,76,247,221,108,2,66,166,147,53,241,60,208,23,2,27,71,184,142,67,199,187,127,42,255,100,111,239,229, - 43,239,252,92,215,6,75,111,29,242,235,224,201,16,102,22,190,117,200,234,165,115,9,128,94,26,248,12,116,21,248,87, - 255,225,141,172,29,234,166,22,167,187,74,54,78,24,176,22,147,68,47,108,248,251,2,39,171,44,247,43,203,33,16,111, - 132,206,22,172,136,203,229,222,101,87,110,151,54,142,192,36,8,153,102,179,99,83,151,108,107,12,70,8,252,76,106,69, - 33,180,65,182,243,183,82,140,50,207,245,130,128,181,26,109,64,185,89,30,56,122,152,171,182,110,199,117,92,116,28,99, - 147,24,215,117,209,161,195,190,3,211,236,220,186,130,36,94,76,147,37,52,196,205,4,229,45,201,12,219,252,146,53,41, - 207,34,117,234,120,212,254,207,10,36,72,197,108,181,198,186,45,59,248,236,47,254,42,15,125,253,1,62,243,233,47,240, - 200,227,79,48,61,61,155,174,116,136,244,255,35,69,186,160,42,5,196,225,44,211,179,139,248,170,140,159,45,147,201,58, - 100,85,1,226,26,141,234,73,10,165,30,226,8,48,26,107,192,38,134,70,189,134,21,6,173,99,114,126,17,41,4,171, - 86,172,224,232,177,163,132,73,8,22,60,207,5,225,98,77,250,28,104,163,145,66,16,132,1,25,207,35,142,99,178,126, - 26,63,61,61,61,157,182,139,90,115,226,216,49,70,199,198,200,102,179,40,41,200,249,153,246,243,107,47,62,183,66,164, - 196,186,84,2,48,8,99,241,129,177,215,254,136,123,168,92,88,155,124,226,19,222,246,40,206,135,105,248,228,195,155,224, - 204,187,33,248,219,75,216,113,9,128,190,11,122,135,0,216,91,206,241,200,131,251,137,155,209,119,178,75,249,246,252,143, - 171,40,158,159,227,149,224,52,83,151,198,97,239,138,171,59,70,214,175,33,138,67,162,168,69,198,207,97,172,139,144,2, - 99,211,181,3,229,58,184,174,131,148,18,41,68,106,99,33,190,177,245,122,110,196,102,112,141,69,187,25,206,87,170,60, - 121,248,48,183,108,221,66,171,85,1,13,73,20,147,203,229,56,121,230,12,189,3,29,12,150,2,164,78,64,91,76,80, - 195,77,124,28,79,97,52,88,218,91,241,8,208,54,213,199,72,129,65,128,112,81,46,44,212,22,232,90,182,21,63,231, - 115,251,235,110,231,213,175,186,133,147,103,79,243,133,59,191,194,103,63,115,39,199,143,159,161,217,76,87,63,148,235,34, - 99,133,75,142,76,33,143,167,92,60,199,193,87,25,28,89,194,45,130,227,8,114,25,129,117,115,52,72,39,128,74,57, - 100,125,15,35,98,36,26,109,210,231,37,155,203,210,221,213,197,133,201,113,148,146,132,73,76,20,133,40,169,144,202,185, - 8,32,66,136,180,146,65,18,4,1,74,130,14,2,38,38,38,88,54,186,140,36,78,24,191,112,129,174,238,238,148,195, - 91,106,251,218,207,174,49,9,82,181,95,15,13,74,9,176,2,97,65,132,17,91,110,184,77,44,244,12,44,123,252,175, - 254,50,187,177,86,237,85,80,94,132,175,254,71,56,161,33,108,94,154,144,93,2,160,151,123,44,176,239,212,52,242,143, - 238,252,174,109,25,52,80,78,171,170,172,132,145,89,88,230,222,112,77,33,155,245,9,170,77,116,16,33,179,37,44,2, - 71,74,130,56,73,167,96,206,243,114,167,236,18,215,163,17,66,126,67,11,38,132,196,8,77,198,74,180,21,68,158,195, - 151,119,63,197,229,171,86,83,114,50,52,117,147,172,85,96,4,29,165,97,246,236,57,67,247,53,35,228,141,64,146,16, - 55,154,104,55,192,233,44,145,40,23,35,36,82,39,8,97,144,10,72,156,212,149,82,25,12,160,173,75,66,134,124,169, - 64,28,199,24,18,164,53,172,94,179,138,95,249,15,255,150,119,255,228,187,120,248,225,71,249,216,71,63,197,3,247,63, - 68,171,213,32,227,122,196,65,72,98,193,235,44,180,195,84,61,148,35,200,248,46,249,98,145,140,159,37,12,2,124,64, - 219,0,233,74,164,74,53,62,249,206,78,226,150,65,152,84,39,53,56,52,196,236,252,28,205,48,160,157,74,125,177,130, - 115,29,7,173,77,10,28,214,98,140,166,86,171,226,103,92,242,249,18,205,48,96,110,97,30,41,211,240,196,106,165,130, - 171,20,214,164,156,85,169,92,198,242,60,159,35,33,218,228,123,186,123,102,173,193,90,8,171,117,122,183,236,80,103,255, - 237,175,15,220,245,161,191,45,222,112,252,136,219,1,98,6,238,250,87,112,34,130,214,225,75,24,114,9,128,94,42,240, - 44,192,255,207,222,123,199,89,118,223,245,221,239,95,57,229,246,185,211,103,103,123,209,54,173,122,177,154,37,119,185,202, - 13,8,37,33,129,0,126,72,131,39,161,132,36,15,36,36,144,74,66,66,28,74,32,4,176,41,46,184,55,92,100,201, - 234,171,174,149,86,219,251,238,236,244,91,79,249,149,231,143,115,103,180,54,205,96,9,21,239,239,245,154,151,118,71,187, - 51,103,239,156,243,185,223,242,41,156,2,126,128,111,186,203,250,75,143,4,42,80,23,176,105,57,174,76,95,246,186,107, - 20,244,33,183,72,235,113,69,201,129,116,30,151,231,136,193,59,50,8,132,20,197,140,199,14,222,149,165,196,15,38,226, - 43,96,4,133,113,188,207,13,62,84,156,238,119,249,232,93,119,243,247,223,248,38,66,151,98,113,96,37,97,20,211,239, - 84,121,250,217,62,235,215,150,169,55,60,42,239,35,58,179,184,216,67,185,4,57,216,94,31,35,83,84,37,38,144,67, - 24,47,176,54,3,21,146,187,18,41,154,80,123,180,47,200,139,86,40,50,3,222,180,169,15,149,120,251,123,110,231,205, - 111,125,3,15,222,247,8,31,252,221,63,228,161,7,31,37,138,67,74,81,137,32,136,72,211,28,143,32,42,5,24,231, - 17,40,36,18,147,91,242,204,162,148,64,105,89,16,6,131,128,74,84,193,135,130,220,230,56,60,81,28,177,121,203,86, - 30,127,226,113,20,25,90,234,162,85,146,174,208,153,5,33,198,20,192,157,166,41,129,214,24,227,72,243,20,132,164,159, - 37,164,54,167,159,244,9,195,128,86,171,77,225,40,154,227,128,90,163,134,84,18,55,88,48,40,169,17,82,23,44,174, - 11,218,178,94,123,153,117,211,107,104,254,248,63,173,60,252,209,143,94,127,197,151,63,175,134,189,143,13,124,165,4,251, - 183,192,82,5,252,69,29,217,69,0,250,166,42,149,73,10,13,215,142,231,177,124,86,192,19,32,231,138,66,104,58,219, - 185,99,100,227,206,93,216,212,146,244,59,8,233,138,42,198,23,27,163,94,175,11,222,161,68,145,12,97,141,89,157,251, - 60,199,50,94,49,79,24,84,65,120,140,42,102,53,101,35,80,42,230,107,7,158,100,219,206,77,188,97,199,165,244,150, - 90,8,227,176,57,172,25,154,224,228,241,51,124,224,171,79,112,235,171,119,113,199,117,83,216,164,199,252,236,25,98,29, - 81,206,45,54,201,88,204,12,102,104,136,145,53,101,130,64,35,188,4,165,153,157,159,71,72,69,183,211,197,171,25,234, - 141,26,82,87,112,94,33,149,194,225,73,147,28,137,224,198,91,111,230,85,55,221,196,129,125,251,249,202,151,190,202,51, - 207,60,195,220,220,18,74,4,100,169,37,233,91,42,165,50,161,87,68,198,147,24,143,49,142,60,205,80,113,9,107,29, - 100,142,37,215,37,40,85,208,81,8,162,152,243,76,76,140,50,58,210,228,212,233,110,81,149,12,44,69,140,205,65,20, - 91,49,47,32,140,35,140,49,56,147,99,58,150,48,138,152,95,92,160,223,79,152,28,155,196,26,67,179,217,196,123,79, - 169,92,66,105,69,16,40,226,114,92,172,227,157,35,203,51,132,176,3,198,53,104,173,7,111,4,158,60,203,168,40,73, - 237,111,127,79,233,228,244,248,117,230,247,63,80,155,204,237,68,79,138,207,143,35,30,250,53,231,230,43,224,22,120,101, - 229,182,95,4,160,231,241,40,10,95,103,65,17,18,118,252,121,158,41,165,160,34,168,183,96,172,113,211,117,213,122,163, - 129,107,183,240,214,160,66,129,84,2,225,5,46,203,200,211,180,136,151,246,126,96,71,81,188,227,66,65,144,91,25,64, - 23,174,132,172,154,181,163,36,18,65,104,138,90,174,87,141,249,208,253,95,99,247,186,45,108,40,197,44,119,91,104,23, - 146,229,142,169,181,27,105,239,123,154,95,248,149,79,32,126,244,157,212,134,234,220,125,239,62,226,44,229,71,190,235,38, - 134,71,3,226,126,196,51,71,231,105,68,109,42,227,13,50,93,66,232,136,131,7,159,162,185,118,43,222,11,22,102,206, - 211,91,156,163,212,104,82,105,142,82,173,84,10,95,34,95,120,10,101,105,23,240,236,216,179,149,75,118,108,227,220,153, - 179,60,244,208,163,124,229,139,119,113,238,244,108,17,76,24,4,148,42,37,172,205,8,203,37,114,60,229,64,23,179,111, - 40,230,58,78,128,41,82,53,34,165,137,163,136,32,214,92,126,249,30,218,189,22,110,169,69,154,24,210,36,91,229,4, - 33,4,65,84,48,116,196,32,230,71,56,143,233,247,9,131,16,37,36,75,75,11,56,107,145,82,210,239,247,168,155,58, - 81,20,130,244,88,107,168,86,171,72,41,144,97,136,179,30,231,138,24,162,149,159,197,10,113,209,123,240,221,140,145,215, - 191,49,58,63,57,124,89,247,215,254,111,125,211,242,98,121,9,175,55,194,67,85,152,237,129,41,93,196,148,87,30,0, - 125,171,206,117,9,133,153,188,164,176,164,204,95,128,235,139,139,55,191,81,7,35,91,46,223,173,36,96,50,131,183,25, - 74,23,43,102,37,21,153,45,230,22,82,73,156,119,232,32,24,168,203,47,92,189,251,63,245,13,60,126,16,56,232,49, - 20,179,26,25,132,204,183,219,124,224,11,159,231,159,221,241,86,156,42,24,214,74,20,38,242,223,247,198,55,241,95,126, - 111,150,159,254,165,207,33,34,232,38,57,161,81,28,88,106,177,123,199,4,71,143,44,115,234,200,44,127,247,221,55,242, - 222,219,47,195,36,243,232,234,40,235,199,199,120,228,153,253,116,83,197,182,29,59,49,198,50,127,110,134,246,210,34,181, - 122,131,218,80,131,168,92,69,6,33,86,120,172,119,164,38,69,34,153,88,59,206,29,27,238,224,181,175,123,45,143,63, - 246,36,95,250,226,157,28,63,114,140,36,55,84,170,117,84,168,177,222,147,103,6,99,220,96,123,101,168,196,101,164,119, - 144,59,172,51,232,82,5,41,2,166,214,172,99,235,37,219,185,251,174,175,17,170,128,36,179,160,6,100,1,231,49,185, - 41,12,213,100,97,65,43,133,24,48,206,29,89,158,211,106,183,240,206,17,134,154,90,173,86,204,216,36,76,6,147,184, - 208,208,235,118,169,213,235,133,188,68,20,145,67,193,96,213,239,157,199,13,126,47,165,198,25,73,214,74,41,95,114,185, - 92,248,7,63,182,57,251,205,255,169,183,207,156,143,60,52,143,193,253,13,56,190,5,146,228,34,174,188,178,0,40,191, - 106,43,187,119,175,35,252,163,175,145,165,127,53,248,176,20,9,25,215,3,163,47,212,245,1,79,8,17,119,188,31,213, - 245,198,232,212,13,87,107,156,197,101,25,206,228,56,95,2,81,112,115,140,205,201,77,134,180,6,165,195,1,35,167,168, - 118,132,144,120,107,89,33,37,174,14,94,133,0,161,144,182,72,109,74,5,32,37,42,7,77,200,67,71,14,242,91,95, - 249,10,239,186,246,90,148,51,72,163,201,101,78,173,164,248,238,55,190,129,95,248,208,23,104,231,61,100,73,145,89,205, - 231,246,158,225,179,15,157,70,6,37,162,192,243,31,62,242,101,234,53,197,229,27,70,153,61,177,200,153,182,227,145,189, - 79,241,203,191,254,33,182,238,220,205,187,223,253,110,94,253,170,203,8,69,74,107,110,158,197,249,121,42,245,58,245,225, - 97,42,141,6,129,214,184,193,63,194,58,75,106,218,132,21,197,77,183,93,207,171,110,186,154,131,7,14,112,223,221,15, - 243,181,59,247,226,241,148,43,49,46,246,180,187,93,202,141,152,176,20,145,38,9,222,43,2,29,32,101,72,174,37,113, - 92,34,183,112,233,165,87,242,212,83,79,211,107,181,105,14,213,200,242,28,33,130,98,16,237,252,234,155,128,146,18,239, - 92,17,83,173,60,233,128,240,24,230,41,51,51,231,200,243,140,181,211,107,73,251,125,150,151,150,145,82,18,132,30,209, - 233,80,138,75,128,28,180,93,32,69,161,204,119,190,144,204,56,114,188,18,4,82,144,167,25,181,141,155,200,255,201,143, - 173,127,246,183,126,227,246,245,135,142,78,148,97,84,194,157,167,224,224,20,180,215,95,92,144,189,124,1,72,0,121,163, - 194,210,27,174,96,230,138,77,152,177,6,183,106,197,231,119,174,227,183,191,244,56,31,253,218,211,228,105,206,115,89,151, - 127,246,113,20,121,222,55,12,90,176,244,5,122,1,159,5,209,246,190,9,172,173,108,217,212,28,222,52,141,181,6,147, - 119,11,93,151,208,131,135,195,144,244,186,224,236,128,241,60,96,227,14,134,209,120,183,218,126,121,127,1,40,249,194,185, - 112,229,239,32,5,94,120,148,3,229,21,46,138,248,236,19,251,104,150,154,220,182,117,19,89,146,162,51,75,191,103,216, - 56,58,194,119,191,246,10,126,247,11,119,147,57,5,58,35,20,49,24,141,15,114,140,78,57,179,232,249,177,247,127,133, - 225,102,133,110,39,101,177,221,38,115,22,21,132,156,252,218,131,60,242,200,19,188,241,182,27,121,215,59,223,202,174,221, - 59,9,53,244,187,61,58,237,54,81,185,68,115,116,132,70,99,4,175,36,214,219,66,217,142,45,60,138,156,103,199,206, - 75,216,121,217,101,220,254,246,183,240,229,47,124,145,189,247,61,200,236,217,89,134,202,117,92,167,133,75,3,164,183,164, - 38,165,60,52,76,181,90,47,50,169,180,0,231,41,5,17,239,121,199,59,57,124,248,89,158,120,226,9,162,114,137,165, - 229,22,97,28,145,13,88,210,114,16,249,147,101,57,30,79,54,72,96,245,56,58,221,54,181,106,13,99,114,58,221,22, - 229,82,153,229,229,101,148,82,52,135,155,88,107,73,210,148,40,140,7,175,125,209,26,15,56,163,3,141,158,197,11,135, - 247,2,169,21,89,158,32,106,227,200,31,253,137,177,187,255,240,119,94,189,235,129,251,135,214,195,104,15,190,252,42,120, - 236,10,88,72,193,70,23,49,230,229,1,64,57,48,178,123,61,122,231,58,90,151,109,228,245,113,200,201,209,58,34,55, - 8,99,73,115,203,244,112,149,159,255,222,219,248,123,175,187,156,234,151,30,71,126,237,105,236,159,83,17,57,138,16,194, - 179,131,141,215,11,241,118,36,129,118,113,237,81,73,136,245,125,239,119,174,123,219,219,199,100,185,140,233,246,240,46,65, - 137,0,208,197,128,217,249,85,63,100,6,156,151,40,12,137,226,136,86,183,187,26,123,188,34,205,88,253,62,82,146,187, - 65,219,229,61,184,98,107,230,5,228,206,226,60,200,64,243,249,71,246,178,113,120,132,201,106,68,110,122,4,68,180,231, - 123,188,113,247,30,22,151,58,124,244,190,135,16,97,8,34,35,84,93,80,224,92,97,89,177,216,207,152,235,167,68,90, - 34,117,128,34,2,169,209,58,36,113,57,127,252,185,187,249,220,157,143,112,219,173,215,112,199,219,223,192,158,93,91,168, - 148,98,156,49,204,30,63,193,114,121,137,161,137,9,170,181,234,192,243,87,161,131,16,132,162,211,233,179,124,254,12,179, - 199,207,176,182,82,133,117,235,56,221,77,169,135,49,177,82,132,8,186,121,194,162,135,185,153,57,186,75,109,198,54,111, - 33,8,36,105,150,99,109,78,24,106,190,255,251,190,143,143,125,252,227,124,249,43,119,2,30,107,114,180,208,171,131,107, - 103,115,226,48,36,51,6,169,21,74,74,76,150,23,0,222,106,83,12,174,60,83,83,147,68,97,206,242,242,50,14,71, - 115,120,152,74,69,145,101,57,229,178,94,5,33,6,111,16,206,186,98,254,230,67,112,133,246,77,106,79,154,56,74,81, - 157,202,59,223,19,155,55,189,254,234,195,191,248,31,27,91,242,108,196,66,53,132,7,159,130,153,61,96,194,151,216,67, - 191,79,202,213,88,171,111,43,0,74,128,141,19,67,252,236,15,188,129,70,28,98,7,15,85,131,34,139,107,221,244,8, - 86,73,82,99,25,118,30,219,251,250,154,37,51,142,204,164,76,13,87,113,223,123,27,188,238,114,26,95,126,2,113,247, - 62,220,5,64,180,18,45,123,30,88,203,11,231,247,187,242,3,108,65,213,123,191,149,56,222,210,124,219,235,171,18,75, - 150,165,152,220,13,86,236,186,216,222,164,93,178,126,175,24,184,202,66,12,89,138,53,229,114,9,63,200,137,89,1,32, - 107,221,170,254,85,136,98,85,239,133,192,27,139,240,14,137,194,121,143,8,20,210,58,188,55,44,187,156,15,221,123,55, - 223,123,235,45,12,199,18,155,231,160,36,173,185,14,223,121,221,13,44,47,182,248,220,254,131,184,178,4,111,209,54,192, - 88,80,202,18,72,80,14,228,64,29,39,40,252,155,17,16,149,202,248,146,198,163,120,248,209,253,156,58,113,134,93,219, - 54,114,203,205,215,113,217,229,187,24,106,12,145,217,140,133,153,25,210,110,74,165,54,68,218,233,49,115,242,0,199,15, - 28,96,230,228,9,226,126,159,114,98,112,78,210,64,49,57,189,113,176,66,79,200,77,142,202,12,205,80,179,182,92,99, - 46,77,153,57,124,24,61,220,164,50,62,78,230,45,206,11,78,159,62,201,79,252,228,63,33,205,219,124,233,75,119,35, - 69,165,160,38,136,140,40,14,169,196,53,58,221,14,90,10,188,45,242,230,65,160,85,17,1,237,188,35,205,51,150,150, - 150,169,85,235,8,4,189,110,159,48,234,162,164,162,82,9,200,243,156,48,140,6,250,48,199,74,136,136,243,2,114,9, - 42,196,147,35,29,84,194,144,78,107,137,209,106,153,239,251,233,127,166,62,181,110,253,246,189,63,246,99,149,43,186,189, - 138,4,213,129,175,46,195,236,8,188,36,82,88,87,172,69,126,41,8,200,40,66,59,95,241,0,180,178,72,206,128,145, - 177,6,191,250,99,119,176,126,98,168,48,154,186,96,78,99,160,248,92,246,156,115,255,159,91,45,25,7,38,133,225,42, - 35,223,115,43,63,248,218,203,80,95,126,2,238,222,135,72,115,202,20,17,181,103,120,97,27,113,89,128,156,16,48,226, - 96,115,112,217,158,53,205,203,182,8,159,27,112,41,185,145,72,157,82,81,10,188,34,239,247,17,198,34,80,24,28,126, - 197,255,199,56,172,43,66,6,87,164,2,82,62,39,192,47,214,243,190,16,203,242,220,127,5,130,64,72,188,240,56,47, - 201,133,227,208,226,57,62,255,248,227,124,199,245,55,19,136,20,200,201,156,193,119,3,190,247,213,111,96,222,165,220,115, - 228,32,58,172,32,115,65,136,199,34,17,82,16,170,1,120,123,135,240,30,233,50,74,58,100,124,168,73,110,114,132,16, - 140,141,77,17,149,74,156,154,79,249,228,103,239,229,190,251,30,229,170,61,59,216,126,201,70,58,237,22,237,185,46,237, - 217,46,102,185,79,144,101,148,176,172,169,104,148,86,36,78,226,50,75,106,12,221,165,46,206,187,194,31,218,164,69,155, - 3,216,180,79,83,8,106,181,26,11,189,148,238,169,179,232,161,17,42,245,58,231,103,23,233,245,230,249,169,159,252,127, - 88,156,159,101,239,195,71,8,75,101,124,224,41,87,99,66,95,8,116,157,119,3,98,165,34,205,114,50,99,232,167,9, - 121,158,34,148,196,26,75,28,197,76,140,79,33,165,160,221,106,19,4,33,82,104,84,173,134,181,133,231,145,82,43,222, - 73,133,59,54,62,199,32,200,189,65,89,69,37,12,57,53,59,203,235,223,250,90,92,214,229,109,127,255,7,248,125,45, - 215,126,242,239,255,240,107,223,105,221,9,7,79,206,192,124,11,220,139,61,16,18,131,89,232,191,14,67,238,148,154,186, - 51,47,9,81,219,11,10,64,110,0,44,149,102,149,205,175,187,156,137,155,119,225,203,17,157,110,250,252,212,127,3,32, - 154,24,174,97,191,231,86,14,189,254,114,110,253,195,175,177,243,209,195,0,172,249,27,120,1,123,16,28,131,113,11,235, - 135,94,251,186,166,142,171,248,100,25,155,38,120,111,138,76,46,89,100,16,228,121,134,181,69,24,160,29,16,221,60,43, - 186,172,1,24,15,124,130,254,172,90,235,66,113,170,117,5,143,104,69,84,169,156,67,11,137,11,35,30,58,122,144,241, - 198,16,119,92,118,13,174,215,162,143,225,140,93,34,50,1,223,119,213,141,196,157,156,7,79,159,192,198,101,148,15,17, - 214,227,188,199,42,129,86,133,69,170,181,6,231,114,242,212,50,115,110,142,56,148,132,74,50,111,78,49,57,53,65,189, - 90,161,169,20,213,126,206,137,251,31,135,99,103,41,41,133,75,114,74,174,0,70,169,36,198,58,218,185,135,52,71,90, - 135,177,22,99,29,153,207,200,172,41,146,58,132,7,45,80,229,18,149,114,131,70,189,1,65,192,194,177,19,44,204,204, - 34,77,151,233,250,14,36,1,71,143,156,224,250,235,246,240,175,254,229,63,229,39,127,242,223,176,255,192,9,234,67,99, - 52,74,195,88,99,16,84,233,13,50,168,60,158,48,12,81,74,209,207,82,4,144,101,25,222,58,206,156,57,131,115,48, - 58,54,70,104,45,189,118,135,44,203,49,206,80,171,214,169,84,42,171,213,167,247,162,72,232,144,186,48,52,179,69,74, - 108,146,37,84,107,21,46,185,100,43,38,203,9,189,164,50,58,202,130,84,177,178,174,44,64,71,20,113,226,238,69,126, - 208,235,192,191,15,52,127,168,53,53,138,153,226,43,106,6,228,47,120,145,61,69,252,46,59,215,177,118,231,90,198,111, - 217,77,216,168,144,37,25,100,230,121,111,62,141,177,96,44,253,225,58,63,243,67,111,34,253,185,15,242,244,249,165,23, - 244,37,22,131,170,110,73,16,134,158,241,69,88,51,114,235,205,37,133,199,152,12,211,239,34,113,40,21,163,116,128,247, - 22,147,167,5,104,120,135,148,69,128,173,214,130,56,14,87,163,108,87,212,217,95,255,157,10,209,164,64,192,128,211,178, - 242,103,11,41,130,3,225,9,148,66,58,65,174,224,11,143,61,194,80,28,115,203,142,29,200,180,133,72,29,121,218,39, - 182,154,247,190,234,213,52,158,126,156,135,79,31,165,235,10,143,105,97,4,210,41,2,87,172,178,5,158,32,140,40,7, - 33,81,28,83,173,68,140,55,26,76,84,235,76,148,171,76,15,141,80,46,197,200,64,97,133,67,57,143,76,243,130,81, - 237,13,185,243,128,66,234,136,126,55,37,21,150,196,103,232,40,160,50,90,165,54,50,78,169,89,163,57,49,78,117,104, - 136,176,90,163,218,28,162,92,46,83,169,148,209,97,200,77,173,46,79,63,245,12,79,60,246,4,39,143,159,167,22,55, - 57,123,102,134,94,111,43,107,166,70,249,133,127,247,207,249,231,63,253,139,204,205,166,3,110,133,39,75,83,148,146,88, - 231,208,186,104,169,188,119,72,138,100,144,94,210,39,14,66,148,86,44,183,22,169,86,43,40,41,105,181,150,41,85,43, - 69,180,144,43,140,203,74,165,18,74,169,194,187,9,81,196,71,231,14,44,232,72,50,59,115,158,75,182,111,165,222,168, - 97,156,1,169,184,247,11,95,98,71,158,207,122,56,235,161,29,131,123,49,1,200,15,182,191,255,88,7,252,143,64,81, - 161,224,139,188,84,236,102,181,80,223,130,24,65,74,86,254,190,6,42,151,111,66,150,66,244,45,187,177,149,24,49,61, - 194,26,41,241,89,142,233,190,240,236,8,153,229,44,70,1,235,55,79,210,56,191,244,130,127,191,22,240,8,34,2,223, - 12,54,108,104,214,247,236,146,152,156,60,233,99,6,201,12,222,151,65,106,172,205,72,147,94,97,52,54,0,24,231,44, - 74,105,148,214,131,77,23,23,12,161,87,139,157,1,40,13,214,204,95,103,140,54,0,31,239,113,90,32,188,39,180,130, - 80,132,244,69,202,239,63,240,85,114,109,184,117,227,86,84,219,98,8,200,164,71,59,203,219,118,238,225,198,75,182,178, - 104,19,210,126,177,173,114,12,146,36,6,241,205,165,48,42,18,53,148,162,28,86,8,156,34,80,2,103,50,2,97,240, - 89,23,111,53,90,106,188,150,248,40,32,32,66,100,142,126,150,179,220,239,211,241,45,214,111,219,204,216,218,81,202,163, - 21,234,245,10,149,90,140,142,2,84,160,137,74,85,74,213,26,81,185,134,10,162,98,219,132,39,199,211,24,170,115,243, - 173,183,112,243,205,55,113,238,212,57,158,120,252,25,14,60,251,52,135,14,157,96,251,182,141,108,219,182,149,127,243,175, - 127,134,159,255,185,95,98,102,118,17,98,137,212,186,104,193,188,31,204,128,32,12,195,162,133,28,56,34,58,239,73,179, - 156,115,231,207,227,61,108,222,180,165,104,7,251,69,102,189,53,57,173,214,50,206,123,106,213,106,33,135,65,226,173,67, - 73,9,40,156,181,228,54,225,234,107,47,7,60,161,14,217,127,240,8,207,124,252,19,230,125,112,220,194,33,13,75,245, - 193,140,243,197,60,95,144,138,223,213,154,0,255,146,99,106,107,51,119,254,91,40,3,4,56,199,145,127,242,118,110,202, - 51,130,245,227,116,181,42,18,150,60,248,44,255,27,103,67,104,231,217,255,134,43,56,176,247,96,49,176,125,1,223,89, - 98,96,220,251,178,135,145,112,203,214,161,161,169,113,92,178,68,210,235,146,103,25,82,41,52,26,33,4,73,210,37,75, - 250,72,10,73,65,161,245,26,172,214,87,124,120,46,104,189,86,128,198,251,1,39,104,133,22,61,16,78,14,28,134,86, - 127,14,210,121,156,176,24,41,138,12,83,173,233,248,156,143,221,127,15,83,81,149,45,19,83,164,73,15,103,12,185,201, - 136,195,136,102,20,209,240,1,42,168,226,130,128,92,21,32,134,243,152,44,69,82,124,47,233,37,248,140,92,21,98,88, - 165,4,50,0,173,3,194,160,132,150,154,204,89,82,233,88,204,61,243,2,206,217,148,182,75,72,178,46,75,157,121,174, - 10,134,217,50,53,65,92,142,201,242,148,52,201,177,253,20,33,66,234,245,128,72,6,5,209,82,106,172,179,8,169,138, - 170,33,77,16,192,228,218,49,38,55,76,114,211,242,13,28,126,246,32,207,30,58,129,240,134,29,59,118,242,19,63,245, - 15,249,255,126,246,223,178,216,235,145,229,22,41,53,72,129,177,150,64,42,162,168,68,179,57,196,210,114,11,99,115,172, - 241,228,121,78,160,53,173,78,139,243,179,231,24,29,29,195,121,8,130,238,160,237,114,116,41,194,22,203,229,74,97,215, - 33,11,187,146,80,75,206,158,59,195,214,237,91,152,90,55,69,158,166,200,184,194,39,254,248,19,108,63,113,124,110,4, - 158,78,224,72,31,250,127,60,24,246,190,88,51,160,42,240,159,2,205,146,128,202,75,113,13,159,30,125,246,91,255,42, - 227,117,42,66,224,211,28,159,190,184,163,45,151,27,234,27,199,153,188,110,27,203,247,238,127,65,1,40,4,169,165,168, - 230,206,143,235,230,112,69,73,143,119,166,240,44,70,96,156,163,44,11,73,64,175,219,42,230,63,190,40,199,133,4,33, - 10,63,157,80,235,1,25,81,172,90,76,172,180,87,43,230,100,171,237,217,170,107,98,17,203,190,194,158,46,100,98,18, - 163,5,214,21,32,18,137,128,212,102,252,225,125,247,242,206,91,110,102,107,115,24,233,28,38,10,200,180,68,100,14,97, - 5,169,80,120,3,202,22,58,52,37,36,210,5,8,173,87,149,250,198,59,34,33,9,195,34,250,199,8,193,114,158,243, - 236,249,25,90,253,62,105,32,201,227,128,32,174,162,194,26,178,222,164,108,42,212,228,48,253,190,225,206,187,30,224,190, - 251,247,114,249,21,151,177,125,219,54,70,70,134,48,121,70,123,169,67,191,123,140,114,173,70,169,86,163,90,175,161,195, - 16,164,196,123,71,38,61,69,253,97,193,164,196,213,144,61,87,95,193,214,254,37,28,218,255,52,15,61,250,8,227,163, - 99,188,251,59,223,198,175,188,255,183,177,126,32,252,85,1,165,40,70,8,65,158,229,140,141,142,16,232,128,165,165,37, - 210,52,197,25,143,113,142,94,191,207,169,51,103,136,227,18,163,195,99,152,44,167,211,110,175,254,12,236,192,132,191,82, - 41,3,18,233,100,65,127,200,51,110,190,229,70,114,107,64,41,78,159,62,203,227,31,248,160,249,30,56,156,195,227,14, - 78,255,79,48,159,124,177,159,240,32,36,148,138,242,138,156,231,165,6,64,66,61,15,99,32,99,95,244,33,219,215,129, - 131,117,76,188,246,114,166,30,60,64,108,220,11,242,238,179,226,41,52,7,82,128,94,74,83,221,203,218,4,120,18,107, - 81,113,140,116,150,168,84,198,153,140,164,215,43,252,119,156,67,106,133,27,112,160,165,210,132,97,225,197,44,132,94,5, - 155,21,48,130,129,47,180,95,177,140,125,78,167,228,87,53,99,69,236,178,178,128,183,24,105,139,4,119,227,80,50,228, - 88,210,227,255,124,233,203,220,176,105,59,87,109,222,204,84,165,76,32,32,215,6,35,28,194,57,20,30,159,231,132,74, - 227,124,142,14,10,101,184,80,122,80,81,72,156,146,28,95,110,113,236,208,97,150,140,97,161,223,199,5,138,209,169,9, - 26,149,6,54,243,136,92,130,233,17,42,77,164,21,198,42,130,32,102,116,122,10,25,6,28,62,182,200,129,3,119,51, - 49,218,96,207,165,219,88,51,57,140,146,158,206,226,121,58,11,179,180,162,152,82,181,78,181,57,76,185,82,33,212,193, - 192,56,3,44,186,176,6,17,150,168,164,184,236,218,107,217,190,123,55,167,78,28,229,202,252,42,246,92,246,0,247,61, - 240,16,82,69,104,161,73,179,140,56,138,139,193,179,135,225,102,147,114,169,68,183,223,163,221,43,236,102,187,73,31,235, - 28,71,143,29,199,89,201,154,169,73,100,36,105,181,90,24,107,168,84,138,90,83,105,73,92,138,9,101,192,169,83,167, - 216,125,217,78,70,199,70,233,231,125,170,213,33,62,241,177,223,99,253,51,79,204,143,192,83,25,60,149,195,210,20,248, - 247,240,226,144,237,34,224,30,41,57,174,36,218,191,116,73,217,175,72,49,170,207,12,193,166,9,22,174,217,198,254,251, - 159,125,65,128,127,80,1,249,186,243,109,5,199,151,191,248,133,195,31,188,241,117,155,198,234,13,113,166,164,74,205,43, - 246,68,107,174,190,92,236,186,118,13,209,112,25,99,115,220,64,107,36,173,69,200,24,239,51,180,202,10,107,10,21,124, - 67,235,245,28,8,201,193,122,94,2,94,174,12,159,221,215,189,163,121,81,216,189,202,66,201,129,195,227,133,196,121,129, - 208,154,101,39,249,204,254,125,124,245,232,1,118,142,141,115,249,212,90,214,77,140,83,46,151,8,181,38,116,2,97,13, - 206,122,180,214,16,134,244,157,101,169,223,99,118,97,145,99,115,51,156,92,158,39,183,30,21,197,56,161,200,173,165,42, - 171,72,25,98,157,196,107,72,76,78,40,161,84,9,139,217,150,113,24,160,223,206,104,84,98,42,186,142,12,60,231,206, - 156,231,248,241,47,49,52,92,225,138,43,119,179,97,253,52,181,114,136,49,57,11,243,231,105,45,204,17,149,202,148,199, - 70,168,150,107,148,75,53,132,18,88,145,98,189,197,122,143,77,19,164,128,205,219,182,178,105,203,22,174,186,250,58,62, - 251,185,207,243,155,191,245,127,121,252,177,125,120,36,18,79,160,66,150,150,150,72,210,144,48,138,105,54,135,9,162,136, - 126,175,143,71,146,152,148,124,113,158,44,55,244,210,46,107,166,166,136,227,152,165,197,37,242,204,210,28,86,164,73,66, - 24,133,180,250,203,72,13,55,223,124,19,206,90,34,29,115,250,212,121,30,249,205,223,202,239,192,31,204,97,175,135,19, - 215,65,246,134,23,241,25,56,43,4,215,135,209,115,109,250,69,0,250,27,110,197,172,99,232,245,87,176,254,225,67,168, - 220,62,239,85,144,2,22,193,159,132,249,146,20,119,111,74,211,220,61,252,204,6,15,245,10,76,44,127,230,158,201,103, - 66,53,126,248,250,43,71,174,252,169,31,175,142,111,223,36,122,102,22,235,52,113,10,50,116,56,45,64,36,131,97,178, - 64,122,119,129,254,75,174,130,80,209,183,13,124,158,145,69,237,228,60,98,176,13,43,64,106,64,54,241,30,225,124,65, - 58,19,96,241,104,83,36,107,248,80,145,56,203,3,167,143,179,247,212,113,154,97,133,169,70,147,201,161,49,214,84,203, - 12,87,75,212,107,67,100,166,207,241,153,25,78,44,204,114,116,113,150,142,40,134,172,129,40,242,182,116,146,3,25,90, - 41,98,165,48,253,62,11,221,46,94,64,20,197,140,143,143,19,148,11,51,51,75,225,225,147,154,132,133,158,39,10,3, - 164,132,90,115,132,166,30,35,207,83,246,62,116,148,135,246,30,100,227,186,81,118,108,219,88,164,99,152,140,94,119,153, - 243,201,34,101,25,51,90,110,82,30,31,161,92,175,160,148,198,51,240,215,150,146,196,230,72,33,104,140,84,248,222,31, - 248,30,222,126,199,219,248,212,39,63,205,239,254,223,15,242,228,147,251,233,27,139,117,142,118,183,131,214,133,24,182,214, - 168,81,42,149,232,245,122,88,231,48,194,51,215,158,163,125,184,205,252,252,28,155,55,109,97,120,120,152,110,167,131,214, - 138,74,41,70,24,199,233,153,83,188,243,221,239,96,104,164,70,154,100,148,170,53,62,244,187,191,206,182,39,30,62,51, - 10,15,36,240,112,11,22,62,51,40,88,95,140,83,1,126,55,8,56,73,193,253,185,8,64,47,198,201,12,126,227,4, - 242,71,223,202,154,247,127,26,242,231,127,241,216,7,74,208,203,157,223,39,224,140,46,102,126,229,88,48,86,246,172,153, - 202,236,166,252,238,189,59,14,221,255,247,46,219,123,199,235,54,237,252,225,247,68,235,39,183,145,36,139,72,221,66,136, - 18,74,12,161,85,4,184,162,130,17,69,122,198,10,17,110,117,45,63,48,172,119,190,104,187,164,82,95,103,170,190,194, - 7,186,112,139,38,87,62,47,37,129,82,88,99,11,251,213,48,194,11,232,144,115,176,53,195,254,185,211,72,233,9,164, - 36,210,49,74,200,194,188,203,122,172,20,232,56,90,77,39,213,170,200,55,43,151,43,68,113,140,113,150,147,167,79,19, - 199,37,198,199,39,24,105,142,96,115,203,236,204,44,113,28,175,234,245,162,40,30,236,44,86,248,75,57,214,22,60,29, - 173,3,132,16,28,63,50,199,129,103,142,49,60,82,101,231,246,205,108,218,184,150,161,64,98,178,140,179,217,121,92,111, - 137,122,28,81,175,84,24,106,142,16,68,85,242,129,161,91,110,7,196,186,44,71,7,146,239,249,219,223,199,219,223,254, - 46,30,221,251,24,95,251,218,125,124,225,11,95,230,192,161,99,244,147,132,32,10,152,155,93,40,30,0,165,138,156,54, - 239,80,66,225,242,156,153,153,51,100,105,159,203,47,191,156,145,145,113,242,60,163,221,105,211,237,119,216,184,105,3,59, - 119,238,32,207,13,97,24,114,248,196,49,30,248,63,191,145,127,63,236,207,225,254,18,28,59,5,217,223,126,49,239,253, - 48,68,42,93,204,125,46,2,208,139,119,68,146,49,127,249,102,178,31,125,43,27,223,255,105,196,243,12,66,26,232,22, - 221,88,79,67,63,0,150,64,214,60,65,8,165,150,96,88,121,177,109,58,207,110,46,127,248,179,183,126,245,193,71,47, - 189,228,39,126,108,232,134,215,95,67,175,107,7,3,77,129,51,5,229,95,14,252,160,221,138,6,98,208,146,173,216,77, - 92,104,211,186,2,60,43,195,106,121,65,53,116,97,43,183,226,105,227,7,131,43,233,197,170,127,142,212,18,99,45,178, - 172,81,66,32,45,24,36,198,175,204,47,67,74,186,200,143,151,10,226,74,9,111,29,165,114,133,48,138,200,178,12,188, - 39,51,57,213,160,134,150,146,110,167,179,250,61,3,173,139,7,92,22,210,143,64,5,104,45,139,239,53,96,25,39,73, - 138,14,52,113,80,162,57,60,133,195,210,89,94,228,179,95,184,151,102,57,224,150,203,118,49,185,110,140,242,196,8,153, - 23,164,237,54,115,237,22,203,115,115,148,42,13,106,35,35,148,107,197,247,206,93,97,248,111,129,110,183,69,20,135,220, - 124,219,141,188,250,53,175,230,71,254,193,63,224,222,123,31,230,163,127,252,97,238,249,218,221,164,105,70,20,70,196,113, - 68,158,164,244,147,4,231,61,222,21,18,142,86,123,137,125,251,246,177,109,155,97,100,100,140,126,191,199,240,112,131,183, - 189,237,205,224,29,89,106,208,181,144,79,125,224,119,184,250,240,129,99,117,184,191,7,251,2,104,189,19,120,138,63,61, - 243,125,33,225,192,3,35,192,7,148,226,159,43,77,224,95,30,98,124,245,163,111,185,230,149,140,65,200,220,144,172,27, - 163,191,126,140,161,71,14,33,158,71,82,252,50,48,63,88,135,43,10,233,199,97,240,195,96,110,133,36,135,37,7,231, - 114,56,83,130,214,250,229,142,220,255,213,123,26,231,70,199,106,27,47,221,69,232,11,207,228,187,238,126,128,99,39,207, - 34,6,98,157,21,95,232,213,56,154,193,44,200,57,55,208,39,125,189,80,245,27,65,103,229,215,95,71,106,84,18,47, - 7,105,139,198,162,17,84,163,50,177,10,9,133,70,152,66,218,81,12,155,1,45,81,113,128,197,146,216,34,157,162,86, - 169,33,164,32,77,19,58,157,46,253,94,15,132,96,100,120,152,90,165,86,180,70,222,23,219,62,32,138,162,85,66,95, - 1,176,158,104,144,131,22,69,17,66,72,180,214,40,169,176,206,98,156,71,5,17,149,114,141,250,208,48,253,133,101,204, - 233,89,78,31,58,68,167,213,166,17,86,168,13,213,32,16,228,182,24,236,247,151,151,232,245,150,17,18,202,165,26,82, - 72,36,32,10,50,19,198,89,146,44,33,42,133,236,218,189,157,55,191,249,245,220,116,211,171,24,30,110,210,233,180,201, - 147,140,230,240,8,65,16,210,239,245,113,110,197,255,71,18,6,17,173,86,139,209,209,81,192,241,93,127,235,93,76,77, - 142,131,135,40,8,120,250,208,97,238,253,167,255,108,249,245,237,206,87,114,248,84,31,158,222,9,201,8,48,14,140,81, - 144,0,199,6,191,127,161,63,246,42,201,63,14,34,114,254,108,171,97,33,64,13,136,173,43,213,180,82,197,27,66,16, - 40,182,93,178,149,219,110,187,141,64,235,130,157,63,208,38,66,225,101,37,131,129,182,223,63,63,43,39,21,86,95,249, - 0,180,10,66,235,199,72,166,71,105,60,114,248,121,3,161,229,98,11,198,32,114,144,14,133,58,126,18,216,58,184,249, - 142,64,22,193,2,48,99,161,179,49,55,254,236,87,31,168,60,99,178,198,37,55,92,33,165,15,185,235,174,123,57,120, - 248,40,98,0,38,43,244,255,21,32,185,16,100,86,254,255,159,85,13,21,22,18,254,235,51,197,6,21,149,23,69,154, - 59,222,35,7,10,203,220,22,41,167,94,60,247,103,133,150,232,80,23,214,164,120,132,119,104,41,16,174,48,0,203,141, - 25,196,240,20,128,40,133,160,90,173,82,46,149,9,244,192,169,144,130,252,87,42,149,208,90,175,138,58,181,46,182,124, - 5,248,20,198,97,122,224,229,236,188,65,234,34,128,81,8,129,14,66,74,66,161,150,58,12,151,42,204,157,56,203,201, - 253,135,56,183,52,143,174,151,41,85,170,68,74,131,119,164,105,135,110,167,67,191,157,130,49,4,90,19,69,1,171,92, - 5,37,16,194,96,93,15,176,172,93,183,134,155,111,186,145,27,111,184,145,237,219,183,211,239,247,72,146,62,214,153,130, - 57,237,4,90,6,228,198,144,36,61,188,201,121,247,187,223,206,21,87,237,128,65,36,80,88,42,243,191,126,225,23,217, - 114,231,93,7,198,225,179,33,220,181,31,230,126,0,120,255,224,227,127,0,7,129,47,3,159,166,160,95,4,64,243,5, - 186,207,127,58,8,216,43,20,241,159,215,17,92,4,160,23,25,132,54,140,147,172,29,165,241,232,17,132,115,207,27,0, - 137,11,0,168,69,225,57,189,117,101,27,1,124,28,92,0,157,42,204,120,33,102,167,156,203,179,135,159,172,63,124,250, - 196,208,182,215,223,166,31,121,120,31,79,238,219,143,80,23,182,96,69,98,231,133,192,115,97,69,115,97,160,222,133,31, - 127,250,166,27,124,222,249,34,73,85,8,132,82,88,1,70,128,21,2,43,5,97,28,17,14,0,76,10,129,242,130,72, - 40,68,110,136,229,74,52,51,40,165,136,194,16,147,229,148,202,101,132,148,88,99,168,148,43,40,161,80,74,209,104,52, - 40,149,74,88,107,169,84,42,88,235,6,179,30,189,26,127,180,34,176,181,222,129,42,72,131,82,250,2,248,84,64,16, - 134,4,129,98,105,126,150,10,138,166,138,8,132,100,118,97,129,243,11,45,250,25,116,146,156,70,115,132,48,8,144,94, - 144,246,251,180,91,139,116,218,45,156,51,68,81,68,168,117,193,107,18,30,188,45,76,225,140,193,88,203,80,179,206,174, - 221,59,185,245,214,155,217,115,217,110,202,229,98,91,54,55,191,136,16,146,40,10,177,38,225,59,223,115,7,111,127,251, - 27,73,122,11,72,47,168,87,235,220,255,216,227,124,246,103,255,117,255,246,36,185,207,194,231,42,176,223,9,145,255,170, - 82,76,3,63,2,188,9,248,126,224,106,224,243,131,22,105,106,80,17,189,16,231,83,82,241,184,148,127,46,219,249,34, - 0,189,84,64,104,221,74,37,228,94,112,0,154,7,126,163,248,188,123,15,116,219,48,155,75,185,52,226,125,172,159,61, - 54,246,200,153,51,213,67,185,212,199,142,159,64,72,113,65,11,245,167,65,230,27,103,60,23,126,254,194,57,209,133,109, - 218,133,25,90,43,119,97,33,128,245,104,161,80,40,66,161,80,20,159,119,214,19,40,141,68,146,231,150,204,88,156,144, - 196,229,242,64,246,225,168,86,170,200,193,48,58,12,2,130,32,32,142,34,148,146,228,121,70,28,199,212,106,85,140,177, - 3,208,41,230,88,90,7,5,165,96,48,181,16,74,34,6,67,115,41,5,10,77,32,66,156,144,24,239,144,145,66,85, - 35,252,82,155,138,0,161,5,37,17,19,82,97,98,221,86,206,39,57,15,62,254,52,210,72,42,81,68,169,22,162,180, - 36,79,83,146,126,143,246,242,18,38,205,9,132,64,171,16,169,10,223,231,98,192,47,138,65,184,203,144,26,214,111,90, - 203,141,55,189,138,55,221,126,59,91,54,95,194,210,252,34,103,207,158,225,166,87,93,197,143,255,216,15,147,167,139,96, - 115,148,144,232,176,196,175,252,187,255,192,165,15,63,122,116,29,124,33,128,175,61,4,179,191,43,21,135,227,146,248,77, - 107,185,213,123,70,6,85,112,23,248,42,176,133,194,30,230,133,114,230,252,152,122,249,1,208,183,93,44,143,234,38,180, - 174,216,196,241,31,125,11,27,222,255,25,68,254,55,19,168,82,46,64,200,127,12,90,239,113,238,201,28,106,107,2,61, - 162,62,123,119,248,137,122,109,109,80,10,3,147,101,5,176,32,240,190,96,224,202,11,218,178,11,129,71,107,189,170,156, - 255,198,1,245,159,2,222,213,135,188,16,105,226,11,177,176,116,30,133,67,88,135,87,106,85,68,236,115,87,128,3,160, - 116,0,74,174,182,94,74,106,130,32,64,169,34,125,52,75,83,2,29,144,36,9,165,184,132,214,138,52,77,72,211,180, - 16,122,42,133,247,130,44,203,73,146,132,32,8,208,90,19,134,65,241,239,92,105,135,69,49,73,243,78,16,149,34,172, - 183,32,61,149,177,81,146,133,14,121,110,136,69,70,100,37,73,63,99,97,102,158,181,87,238,161,149,24,172,136,176,132, - 60,246,212,126,70,134,26,172,95,55,141,240,130,180,103,88,236,205,210,154,59,79,169,54,68,125,116,146,74,165,178,250, - 58,20,129,140,30,164,163,159,180,208,82,50,54,222,224,123,254,238,119,113,199,187,222,198,125,119,223,69,123,105,142,3, - 71,15,49,82,47,209,172,55,136,202,53,62,240,193,63,66,253,209,71,58,55,192,137,4,142,155,162,186,85,223,139,183, - 239,77,19,191,222,89,186,20,130,207,139,190,172,223,198,91,176,63,31,132,210,191,113,16,26,36,103,240,105,224,59,160, - 229,225,145,60,55,245,105,76,253,54,19,15,237,151,97,83,73,133,244,133,133,201,96,169,245,117,21,205,115,225,133,110, - 117,229,126,97,149,115,33,0,93,88,49,201,65,98,132,148,5,168,136,193,12,200,225,177,24,130,32,40,218,160,193,106, - 57,8,66,178,52,69,7,10,99,114,170,229,18,206,121,50,103,9,162,66,185,111,141,161,221,110,19,40,141,22,10,188, - 164,215,235,83,173,86,17,162,112,23,140,99,63,72,251,240,171,177,67,118,85,205,47,16,190,144,91,40,89,128,159,147, - 30,161,5,46,207,145,74,16,160,9,157,194,78,79,211,59,115,142,97,33,73,69,70,213,90,206,45,156,166,218,94,203, - 214,233,181,180,150,231,217,126,229,53,148,71,154,236,123,252,81,206,157,122,130,169,241,49,214,173,157,70,135,138,126,218, - 162,179,60,71,119,160,120,175,53,139,205,89,16,197,3,6,127,49,124,87,74,226,69,78,158,47,16,215,20,175,127,251, - 107,49,73,194,241,99,199,120,230,137,39,57,113,98,158,196,30,227,127,252,231,255,225,254,89,97,183,90,115,176,205,192, - 242,102,56,42,156,59,231,112,173,164,176,46,243,23,193,231,226,22,236,47,104,199,44,201,250,81,146,117,99,212,31,61, - 140,176,127,245,178,242,155,105,193,78,3,95,24,108,41,174,0,62,3,236,46,90,179,100,20,18,15,147,75,129,222,113, - 79,16,14,173,26,143,249,175,39,25,94,88,201,60,231,25,237,255,84,229,179,82,233,92,88,45,93,248,241,245,105,171, - 98,0,72,2,37,139,217,77,173,86,43,42,22,87,228,198,107,173,6,118,20,121,81,53,88,91,248,47,11,177,202,221, - 41,149,98,164,144,4,65,72,24,22,237,88,173,86,195,24,67,191,223,71,41,73,28,199,197,182,107,144,193,181,178,5, - 91,189,14,85,72,116,133,148,148,162,98,132,170,131,194,196,204,216,156,64,23,100,199,186,214,4,145,38,208,10,149,24, - 178,32,96,100,122,154,110,167,79,88,210,236,220,185,133,53,227,147,52,26,67,156,157,61,207,189,123,31,194,8,207,244, - 154,117,133,87,146,77,201,210,132,94,183,69,175,189,140,201,82,162,149,175,39,20,82,42,112,133,246,12,1,206,228,120, - 111,24,30,29,102,219,246,173,12,53,71,152,157,95,196,40,201,99,179,11,242,72,107,185,46,97,93,19,182,70,176,206, - 64,195,129,232,64,222,1,227,193,141,83,240,197,190,10,108,186,216,130,253,233,25,208,255,243,230,171,191,109,209,87,100, - 134,254,186,49,146,181,99,127,173,153,208,55,3,64,25,133,53,236,235,128,155,128,215,0,87,2,107,192,47,10,161,148, - 16,235,231,2,125,197,93,81,52,94,216,119,20,55,134,251,51,222,63,47,36,27,94,72,58,252,198,13,217,10,224,92, - 184,166,247,43,119,224,5,159,135,98,168,28,4,1,81,84,36,83,224,158,179,170,202,243,252,185,121,141,16,168,129,110, - 80,14,4,158,90,43,226,48,162,92,42,35,101,1,52,65,16,124,29,96,73,41,87,179,207,86,190,215,55,94,183,146, - 18,169,116,145,243,165,53,90,43,172,115,120,201,192,210,86,66,160,49,173,14,195,97,136,245,25,97,102,72,90,61,212, - 88,19,89,169,113,254,236,121,54,78,79,81,27,169,177,216,91,230,247,127,255,35,254,254,223,254,80,254,216,159,124,213, - 30,234,180,148,42,69,76,140,142,82,46,151,17,206,224,242,140,164,215,97,105,126,142,164,215,65,74,77,24,132,133,79, - 211,224,7,106,125,1,150,198,26,28,158,106,181,198,246,93,59,120,211,91,222,44,118,191,229,109,106,118,235,246,210,231, - 218,253,241,175,204,205,111,236,153,108,211,56,108,170,193,100,0,85,1,162,11,121,0,249,44,248,71,128,141,23,1,232, - 79,207,128,38,38,38,94,54,120,241,66,181,212,246,205,55,96,190,244,56,225,190,111,45,174,112,197,34,227,194,27,96, - 35,240,11,23,252,126,199,5,189,239,97,48,161,247,125,19,5,206,13,98,120,86,103,60,74,14,18,82,159,3,20,117, - 1,251,249,194,10,231,66,160,249,70,55,197,231,42,158,194,33,80,12,188,94,87,190,222,74,85,149,37,105,225,43,228, - 45,185,181,196,113,188,250,178,135,97,76,150,37,148,203,17,74,23,132,201,96,112,45,74,235,1,232,20,21,79,24,134, - 69,64,160,16,171,243,22,231,28,229,114,153,52,43,28,33,117,16,20,195,231,193,133,25,87,248,236,228,185,193,5,97, - 209,18,250,34,31,76,42,141,115,144,5,33,182,20,147,246,51,116,172,17,145,167,153,88,22,14,31,165,126,233,165,204, - 182,150,56,126,242,4,179,251,186,252,187,159,248,41,191,227,145,39,91,63,14,103,37,36,119,254,250,31,76,252,247,15, - 126,124,116,244,134,43,131,55,220,254,70,110,188,114,55,99,205,42,206,27,146,52,37,109,119,56,215,61,74,80,174,48, - 52,220,164,54,84,71,69,49,129,150,216,188,216,70,122,33,48,214,147,166,61,132,16,92,178,101,138,75,127,252,135,249, - 161,31,252,62,238,189,255,193,240,19,31,250,232,244,175,126,225,243,19,151,156,56,185,237,38,184,98,2,30,15,96,239, - 89,120,188,15,199,190,23,218,7,94,58,62,96,47,157,25,80,24,134,47,151,107,245,47,220,23,86,200,231,1,212,11, - 65,5,252,44,240,79,225,207,21,2,230,20,65,137,63,225,189,247,96,149,49,70,72,141,25,0,14,23,144,249,86,77, - 199,248,122,210,225,74,43,243,141,159,91,153,15,93,56,59,90,169,128,132,120,78,200,170,68,49,68,214,74,81,173,86, - 87,205,182,210,52,93,5,193,32,8,232,118,187,24,107,193,187,98,230,19,132,8,160,239,60,195,205,38,149,74,5,147, - 23,128,83,46,151,87,1,111,229,250,87,6,214,174,184,217,176,198,224,188,71,5,1,38,207,65,136,2,180,156,37,140, - 66,156,47,172,107,81,2,57,40,216,28,133,206,45,43,149,105,27,199,132,14,232,121,143,207,13,165,249,54,173,83,167, - 104,14,53,249,157,223,251,48,159,253,253,15,154,239,59,63,159,222,10,173,20,142,59,152,191,3,230,111,233,244,183,61, - 244,39,247,142,125,248,43,247,133,31,216,185,69,190,229,29,111,17,55,191,234,106,54,76,142,162,149,34,115,57,73,210, - 102,230,84,155,133,185,136,122,115,152,90,189,73,20,215,48,190,104,73,133,0,169,139,64,73,99,251,216,110,66,41,82, - 220,254,198,27,120,211,235,110,224,208,177,127,170,63,242,161,15,79,126,241,211,159,27,93,247,216,227,151,236,236,116,174, - 24,134,7,26,112,87,0,143,77,194,185,114,81,20,95,60,43,0,228,47,142,202,120,62,94,131,112,48,239,249,183,20, - 100,196,191,236,43,182,1,3,46,4,87,206,140,209,202,96,84,177,14,183,182,80,186,75,33,7,91,46,40,244,97,254, - 235,170,158,11,183,98,43,45,149,187,192,162,99,5,152,164,148,24,91,228,207,23,218,44,177,10,94,206,58,242,126,74, - 189,81,35,12,3,74,165,136,110,183,95,8,73,139,80,44,82,147,19,170,194,5,208,218,132,114,169,76,181,90,98,104, - 104,168,104,159,2,137,28,204,145,86,218,172,149,108,245,149,225,55,23,108,239,140,41,18,73,181,214,104,253,28,123,90, - 74,137,70,144,217,156,168,28,23,222,217,214,96,28,72,47,17,97,192,49,151,33,90,30,180,39,183,57,97,187,205,204, - 99,143,179,254,85,215,81,171,14,83,93,88,238,93,9,157,54,4,22,38,34,8,45,148,70,192,191,13,220,205,198,243, - 208,147,135,236,211,79,254,119,243,133,177,33,185,254,230,107,130,247,220,113,135,216,190,117,35,181,122,165,152,115,101,57, - 115,167,79,51,119,118,134,90,189,201,208,96,104,141,42,108,79,156,181,104,41,7,105,181,134,44,105,225,17,108,89,63, - 198,79,255,212,63,98,246,135,254,142,190,251,203,119,79,28,250,131,15,15,143,125,234,51,211,235,178,108,189,133,225,58, - 124,41,40,110,147,231,221,189,230,132,16,124,94,74,162,151,217,222,77,95,196,224,111,97,144,61,120,1,203,192,239,3, - 191,53,152,3,125,83,253,239,115,173,154,143,140,177,161,247,244,40,188,52,86,30,216,149,42,167,152,191,200,231,82,64, - 47,168,124,86,54,75,23,174,227,197,64,114,113,97,251,182,98,249,90,128,128,194,89,183,250,224,59,239,72,211,148,94, - 175,75,20,133,84,42,101,22,22,22,11,16,9,20,105,154,21,32,87,76,131,190,174,178,202,141,65,34,209,58,88,157, - 37,73,41,139,54,234,2,64,52,198,224,6,243,158,149,107,14,130,160,152,177,24,51,240,20,95,177,25,113,88,99,81, - 97,1,186,89,106,8,101,64,28,71,44,215,107,252,201,221,247,177,165,92,162,84,10,176,222,226,45,124,229,143,62,68, - 180,102,154,242,230,237,165,223,58,125,202,212,148,10,250,121,190,45,200,51,43,173,113,147,222,186,141,144,55,65,93,5, - 193,109,16,204,205,46,229,159,248,227,47,166,31,104,103,225,219,238,120,135,172,5,158,141,155,214,51,50,82,39,10,53, - 185,201,232,46,157,167,187,52,71,189,57,76,99,100,132,82,185,134,212,26,235,5,43,221,110,241,227,114,88,215,199,164, - 142,70,89,241,246,59,222,72,239,246,55,4,15,126,226,115,155,190,248,190,127,216,120,125,167,157,133,112,252,17,152,75, - 161,255,124,62,120,49,240,39,66,114,94,8,94,110,217,244,223,246,0,228,129,72,73,30,84,146,57,254,108,13,205,159, - 247,194,157,165,208,127,245,129,95,229,175,94,91,251,98,162,139,242,222,175,12,7,157,181,88,191,162,118,151,120,111,113, - 206,15,120,65,254,207,229,4,5,90,99,173,35,179,41,184,175,31,151,121,231,86,245,86,197,223,187,160,234,27,128,88, - 154,166,56,103,201,178,12,41,19,194,48,36,205,50,148,86,148,227,24,188,39,233,39,69,72,98,150,17,13,196,168,54, - 55,12,53,134,6,3,242,66,130,177,242,245,86,42,177,114,185,24,82,155,60,95,53,81,211,90,127,93,219,168,180,198, - 91,135,113,133,234,62,237,39,3,43,211,2,124,115,147,161,140,32,170,84,89,123,227,53,36,79,31,163,18,104,84,4, - 65,47,97,107,86,38,157,235,114,199,149,215,4,217,149,215,12,103,70,144,228,150,110,150,144,184,54,39,90,139,254,104, - 55,53,203,115,11,44,206,207,243,182,172,231,95,131,15,255,46,248,47,124,229,158,124,230,242,43,213,134,91,111,208,15, - 238,125,148,102,179,196,174,93,219,25,31,29,198,228,133,60,163,179,180,64,187,181,72,165,58,68,115,100,156,32,174,160, - 244,115,206,141,120,7,162,208,240,121,44,214,244,137,133,226,213,239,125,23,31,255,216,167,135,143,127,248,143,182,109,133, - 53,195,16,206,64,127,246,175,112,175,253,101,167,2,220,163,95,158,143,242,183,61,0,5,74,210,109,117,249,254,133,54, - 135,94,12,0,116,30,161,240,74,73,164,215,224,4,94,184,1,232,20,182,173,5,109,71,252,185,43,120,231,139,249,141, - 240,224,132,28,232,187,184,224,255,23,155,45,53,144,118,172,240,129,164,44,196,160,94,21,153,92,248,162,85,11,130,162, - 98,169,148,203,24,99,200,179,140,74,165,138,119,158,60,45,6,201,231,207,159,103,124,108,12,45,53,253,126,151,56,46, - 97,109,78,191,223,93,173,12,86,218,176,110,183,139,28,180,103,43,109,151,25,16,27,87,255,77,206,225,114,143,213,26, - 179,50,243,202,29,65,24,144,123,67,63,237,145,230,93,84,185,66,88,110,224,119,239,96,254,236,25,154,89,74,179,84, - 163,30,164,88,44,198,88,60,1,78,121,188,4,89,142,208,97,9,53,57,41,188,44,5,29,239,57,221,235,241,216,147, - 143,219,108,255,227,217,171,33,120,131,181,250,171,191,244,203,233,145,74,32,174,127,235,237,234,231,255,213,191,226,212,47, - 189,159,55,191,243,173,220,254,166,55,178,97,106,2,157,165,100,54,161,215,94,162,215,94,34,46,149,169,52,134,9,226, - 50,97,169,134,14,138,71,201,228,30,47,5,194,91,156,203,41,137,136,225,45,27,57,5,149,237,69,66,143,254,183,192, - 195,207,235,122,70,18,73,73,153,151,31,241,241,219,26,128,60,80,137,67,126,243,179,15,114,232,204,220,139,118,25,66, - 12,36,9,185,27,108,127,28,97,20,15,34,101,190,222,110,227,27,231,86,43,15,112,150,21,38,235,74,107,124,158,35, - 7,131,95,9,127,106,118,100,76,65,62,92,221,168,249,98,104,92,138,99,164,145,171,179,155,44,203,138,234,42,12,177, - 206,210,104,52,232,180,59,197,32,217,57,90,157,54,227,163,99,116,58,93,178,44,167,86,171,161,117,80,248,74,43,69, - 167,211,193,90,75,189,94,39,138,99,202,23,108,197,46,188,30,127,129,207,245,133,28,40,147,231,228,89,182,218,190,9, - 20,50,181,132,161,194,106,73,180,118,18,211,110,49,179,208,98,56,44,19,90,139,201,186,8,219,67,9,6,255,254,16, - 155,129,145,2,71,70,37,210,92,90,41,177,254,218,107,212,93,101,229,245,99,143,154,219,156,87,183,122,252,190,255,244, - 43,221,127,241,91,31,168,150,206,204,38,63,236,236,210,131,255,249,183,74,255,243,247,63,86,222,244,246,215,68,183,188, - 245,118,118,109,216,136,179,69,234,109,175,219,163,211,238,34,164,162,92,169,50,52,60,76,92,107,12,6,238,131,159,13, - 197,155,67,150,246,40,13,8,16,226,121,54,42,147,80,252,220,121,121,178,174,181,248,38,6,176,94,136,87,36,0,5, - 74,114,126,169,195,175,124,252,158,23,251,82,68,97,77,33,73,243,108,176,249,178,95,183,126,191,208,120,236,194,141,88, - 33,43,176,72,245,156,220,66,172,204,89,46,96,76,127,35,41,49,207,243,213,25,204,202,124,103,69,201,94,171,213,240, - 222,211,233,116,200,178,98,254,179,242,255,148,86,197,60,202,88,250,189,62,105,154,49,52,52,132,177,197,26,62,8,10, - 131,177,44,203,8,195,112,181,101,76,211,20,165,53,81,20,173,126,223,149,107,88,81,213,139,32,40,18,63,6,169,31, - 22,86,171,55,49,232,29,51,151,97,41,252,137,164,128,160,62,132,13,74,156,57,55,79,61,205,9,130,136,72,43,148, - 183,8,111,139,167,61,136,8,61,4,222,146,134,142,52,55,52,156,224,77,55,222,166,127,119,126,81,76,30,63,154,238, - 128,238,206,126,178,212,56,117,46,105,192,137,38,254,216,110,208,189,211,11,235,246,255,234,71,182,253,218,135,62,191,97, - 252,246,215,69,111,127,215,59,216,181,121,35,18,75,154,116,192,102,244,151,231,232,46,207,19,86,134,168,214,170,84,135, - 234,232,48,196,91,71,47,203,232,236,223,239,47,131,118,6,61,1,246,223,82,240,197,190,85,187,212,50,112,191,84,252, - 162,210,168,151,169,232,67,39,165,242,95,8,60,65,158,17,89,59,88,133,190,114,54,102,43,213,207,175,127,250,254,23, - 179,250,1,16,218,58,167,115,235,173,64,104,165,48,3,34,226,133,91,172,11,43,134,149,7,248,194,85,188,86,186,0, - 145,85,169,131,127,14,136,6,9,15,43,132,192,21,146,224,202,223,245,222,19,68,17,146,194,42,35,77,83,196,96,61, - 190,2,122,121,158,175,242,123,242,44,39,142,34,154,205,38,105,150,50,51,151,16,40,141,51,150,48,140,104,54,203,116, - 187,93,172,181,12,13,13,81,169,20,6,102,43,213,207,115,4,199,231,24,217,43,215,185,250,206,254,13,215,30,234,0, - 165,4,137,183,164,38,69,101,80,139,74,32,53,190,18,163,55,213,233,44,204,211,95,92,32,76,44,85,52,35,213,58, - 145,214,160,52,62,235,19,121,131,18,30,167,138,8,160,82,14,187,119,95,169,62,114,234,36,255,208,26,91,129,100,10, - 191,15,184,179,15,143,74,200,53,172,191,26,174,222,62,223,185,254,238,15,124,124,215,255,252,228,159,76,172,123,211,107, - 195,219,239,120,27,187,119,108,36,150,96,178,132,220,102,244,91,243,116,150,102,40,45,86,89,187,126,19,165,210,16,79, - 28,61,65,250,208,195,189,13,112,58,133,153,12,50,1,12,125,139,55,141,2,122,192,31,234,96,53,212,242,101,9,64, - 139,163,227,127,209,251,50,42,203,16,199,15,83,81,154,106,20,21,171,217,139,213,207,243,141,65,133,127,179,181,200,149, - 182,228,2,87,196,213,85,246,224,172,0,193,202,92,200,88,75,150,103,148,227,210,234,223,231,207,40,201,173,181,95,71, - 62,52,198,20,45,214,160,10,209,58,160,215,235,173,206,110,194,48,252,58,80,200,178,172,112,47,140,99,194,32,192,56, - 135,25,84,72,65,89,19,14,192,107,121,185,181,186,142,95,1,62,231,28,225,192,7,104,5,120,130,32,40,4,173,131, - 86,111,229,123,58,107,49,214,226,173,45,102,71,82,22,57,97,74,17,138,194,167,40,136,53,214,184,194,168,222,56,4, - 158,225,13,27,17,155,54,211,106,183,56,115,226,56,159,190,243,43,92,177,121,11,187,166,167,25,174,213,200,136,145,73, - 6,202,145,75,143,119,41,87,111,216,204,3,155,182,198,31,59,122,176,247,110,107,235,17,76,8,40,171,66,175,119,92, - 192,225,12,14,68,240,212,91,224,154,155,91,189,171,30,253,208,167,182,253,241,231,191,60,246,241,27,175,41,95,255,166, - 215,113,205,158,61,140,52,106,64,27,233,37,189,78,135,94,187,71,80,26,229,253,255,241,151,217,50,191,56,171,225,89, - 3,167,114,72,119,125,139,237,146,167,144,246,252,11,29,240,172,148,148,95,206,0,244,23,201,15,132,16,24,33,216,55, - 119,158,208,123,174,153,156,166,30,69,171,67,194,151,123,245,243,27,159,121,128,163,231,22,94,244,203,177,66,8,39,165, - 80,30,172,53,8,41,86,3,9,87,230,49,43,60,153,11,213,241,43,109,145,16,130,64,7,132,65,56,112,31,20,44, - 181,90,36,105,178,250,103,87,248,54,223,56,83,242,222,147,36,9,161,14,8,148,94,101,91,175,104,192,210,52,45,228, - 11,131,207,25,99,80,90,17,199,49,73,146,32,7,127,206,24,75,187,221,38,73,82,148,210,12,15,15,147,166,41,73, - 146,16,69,17,149,106,117,149,39,116,225,28,107,101,48,141,128,204,24,88,201,70,27,208,10,156,115,88,99,176,74,34, - 188,165,174,52,10,137,183,158,92,128,177,25,101,25,18,7,1,253,110,11,39,5,165,106,137,203,110,188,142,153,229,121, - 62,253,135,31,92,122,168,86,209,217,186,245,213,87,109,187,148,219,54,108,2,219,199,5,142,52,119,228,121,198,27,111, - 121,141,252,108,84,105,250,220,149,166,142,62,91,190,62,239,165,85,88,246,208,139,225,204,60,28,140,97,198,195,254,18, - 60,122,11,92,117,77,171,183,231,233,207,221,181,229,107,95,184,107,242,163,219,54,85,119,220,114,179,184,241,198,43,217, - 186,101,35,81,37,226,248,92,139,255,253,239,126,146,214,7,254,168,117,19,60,154,194,163,17,204,236,1,103,249,214,34, - 186,106,192,71,164,226,215,180,38,126,153,235,237,245,55,243,184,134,74,145,36,9,123,103,206,112,205,196,154,151,61,8, - 5,74,50,187,220,125,137,84,63,224,149,20,102,144,199,190,210,130,173,156,231,136,133,114,53,177,211,185,231,126,191,2, - 64,165,82,9,29,232,213,53,249,138,126,235,194,170,105,5,92,190,145,45,29,199,49,12,86,231,113,28,99,140,89,229, - 243,36,73,66,150,101,171,85,138,16,130,126,82,172,227,123,221,238,115,178,139,82,137,82,41,166,217,28,161,84,42,175, - 126,191,21,64,188,112,139,247,156,164,196,13,218,61,57,248,40,180,95,43,219,58,187,210,98,42,133,196,33,241,244,77, - 94,132,57,170,112,224,68,233,201,92,74,181,86,98,106,106,130,109,27,54,50,57,62,78,185,28,115,229,213,187,249,103, - 143,61,232,174,127,246,96,251,232,179,79,199,159,61,114,84,61,178,126,147,104,148,34,122,121,215,39,121,207,118,50,39, - 95,117,253,205,242,159,252,227,31,86,111,254,142,247,86,62,252,145,79,85,62,243,207,126,252,198,239,94,94,232,89,200, - 186,112,207,56,156,186,15,22,215,64,123,4,78,59,120,42,128,173,87,193,206,43,28,123,142,62,123,116,231,221,207,30, - 93,251,137,15,124,184,220,216,48,173,171,99,195,114,225,216,73,179,246,228,217,243,223,9,15,123,248,140,135,71,66,104, - 111,124,158,238,153,223,209,26,67,65,128,125,133,3,80,49,190,87,82,146,90,251,178,7,161,11,171,159,35,103,231,95, - 2,205,23,3,134,113,225,137,140,179,5,33,111,181,109,242,3,23,65,143,16,138,21,73,156,181,102,181,34,82,74,21, - 51,163,129,190,42,140,34,98,91,72,30,86,102,40,23,146,26,87,102,44,23,182,117,74,107,162,32,92,213,128,93,56, - 35,42,170,167,149,245,127,33,82,93,94,90,34,10,67,70,199,70,49,166,216,144,85,202,85,226,56,94,117,67,92,249, - 58,0,206,219,85,194,30,40,172,117,200,65,108,178,247,14,99,115,132,20,88,87,84,117,129,14,144,206,15,0,78,17, - 73,79,20,72,140,82,244,83,67,158,230,140,12,85,152,94,51,194,182,29,219,216,180,125,51,81,169,136,146,206,109,74, - 47,111,177,110,253,8,59,223,125,199,240,167,254,227,47,219,255,98,77,247,157,182,191,116,239,129,167,105,67,84,3,166, - 192,30,17,68,95,242,95,27,254,251,255,224,45,162,119,226,253,220,241,234,75,248,204,85,219,26,31,253,202,3,55,222, - 1,202,67,156,194,23,119,192,201,113,48,1,44,204,193,114,2,199,203,240,88,14,15,108,133,93,219,96,107,222,239,79, - 183,247,31,26,207,246,67,13,206,85,224,217,12,30,1,30,11,225,204,231,192,206,62,15,131,231,95,15,66,190,58,88, - 187,243,237,0,64,171,55,169,16,47,123,16,10,148,228,196,220,50,255,253,37,80,253,200,1,32,42,231,188,114,6,227, - 37,88,139,210,133,77,134,117,190,16,66,122,0,183,106,82,182,82,65,88,187,226,52,168,233,39,253,213,200,158,114,92, - 194,187,162,154,114,23,180,50,23,174,189,47,156,237,24,99,40,85,170,3,50,227,0,12,7,171,246,48,8,80,170,144, - 216,22,12,103,69,146,244,241,222,19,199,49,253,164,143,247,20,145,205,81,12,136,85,250,192,74,139,24,4,33,73,210, - 71,135,146,56,138,113,206,99,140,69,41,143,84,69,88,99,160,53,121,102,200,93,159,40,10,16,88,130,32,6,95,24, - 154,73,41,233,247,123,116,146,46,211,235,183,113,217,149,87,176,235,210,73,154,67,18,69,72,234,13,137,73,208,94,17, - 34,137,116,128,142,52,239,125,199,155,184,235,127,255,150,56,63,187,112,126,18,238,122,7,156,0,170,22,106,30,26,151, - 122,54,29,62,55,115,233,71,62,252,209,202,143,191,117,138,118,251,52,127,247,125,63,192,151,47,191,97,234,19,239,255, - 213,87,191,57,75,76,6,231,170,5,240,180,119,3,71,192,222,83,84,51,157,75,96,38,135,103,162,194,113,117,172,2, - 99,213,34,63,242,188,129,51,227,48,235,160,253,24,216,127,241,188,220,192,33,82,169,87,4,248,252,149,1,232,149,0, - 66,97,24,240,236,161,67,4,103,231,185,134,23,135,59,145,3,235,10,0,114,30,242,178,148,121,5,225,164,144,82,201, - 16,111,61,94,8,4,69,91,226,188,43,204,213,97,96,105,186,146,152,250,28,49,49,205,178,213,121,141,28,56,24,22, - 182,30,174,72,85,85,10,86,140,205,190,193,95,122,165,82,113,74,81,138,99,122,189,222,160,106,241,180,187,221,162,170, - 137,34,164,42,230,81,73,146,160,6,109,185,119,80,169,214,88,88,88,164,20,198,171,121,101,245,122,189,168,148,150,151, - 7,2,219,18,56,137,53,14,200,9,2,133,195,98,93,78,16,104,164,15,80,65,76,183,215,34,233,165,148,203,133,65, - 126,28,133,244,122,29,146,92,48,181,118,45,183,223,188,155,157,59,182,83,137,99,108,178,64,150,245,232,199,160,100,76, - 77,14,227,115,199,252,249,57,14,30,61,194,211,207,236,231,238,251,31,33,201,145,22,102,45,220,99,225,222,160,160,8, - 197,22,154,33,92,247,247,50,155,254,193,175,255,201,213,223,243,213,241,202,223,249,222,157,124,215,119,220,192,77,215,190, - 153,127,121,238,224,240,129,63,248,244,158,61,112,99,15,22,53,28,59,12,73,21,242,157,144,204,21,233,39,253,95,131, - 126,6,51,215,66,16,13,186,162,37,200,230,32,255,106,16,184,207,72,197,130,27,36,226,126,43,15,171,82,104,165,94, - 81,46,139,127,45,34,226,133,32,116,245,196,20,141,40,126,89,128,144,7,114,60,151,126,97,47,159,132,23,53,182,214, - 3,45,48,61,88,172,88,63,55,153,154,116,127,160,75,2,95,8,30,157,69,42,139,195,226,68,134,20,1,160,159,99, - 15,15,88,109,43,131,97,6,9,170,105,154,210,237,245,208,97,161,100,247,30,114,155,23,22,172,43,149,208,160,197,91, - 5,161,129,236,220,230,134,174,237,98,108,1,50,214,59,116,16,96,156,165,213,237,16,5,69,164,78,16,20,155,42,173, - 52,81,41,38,208,97,177,129,27,172,247,251,253,62,81,20,97,173,45,140,225,195,16,103,60,46,7,235,13,65,168,209, - 129,68,74,141,201,13,89,102,16,164,4,2,130,64,98,93,136,115,138,126,63,37,142,45,219,47,217,202,158,203,47,99, - 106,253,24,97,212,71,164,51,244,211,24,194,18,65,60,74,144,37,156,57,113,130,47,127,249,94,190,116,247,221,28,217, - 255,172,239,159,62,237,242,86,151,27,44,173,239,86,122,46,18,242,73,227,221,193,16,142,29,131,52,2,49,5,97,2, - 179,35,96,126,36,237,155,255,249,196,241,171,14,189,118,199,80,126,250,113,76,247,126,242,236,188,127,6,134,119,194,107, - 203,48,12,28,113,176,32,96,113,35,156,222,10,167,247,194,252,113,72,26,66,184,159,10,163,172,3,249,15,228,153,187, - 196,57,150,148,226,95,198,101,132,41,94,255,146,82,223,242,61,243,74,147,142,255,181,153,208,43,32,244,200,204,89,174, - 126,153,84,66,58,10,88,126,234,56,159,187,247,41,190,213,77,196,183,122,28,176,6,242,6,44,74,239,231,107,34,207, - 188,84,37,107,93,193,109,241,224,68,113,203,121,10,79,26,37,2,172,179,171,36,197,149,70,206,11,6,214,167,197,170, - 60,73,18,170,213,234,64,237,110,10,112,241,30,59,224,232,10,64,12,92,8,205,10,25,208,59,210,204,80,42,151,209, - 50,192,38,253,213,25,146,14,3,74,149,50,194,250,194,170,85,7,104,21,210,168,55,128,149,149,126,78,150,166,212,234, - 117,226,184,96,113,175,172,214,87,54,119,133,252,162,184,0,33,21,94,56,180,10,9,116,76,150,118,73,109,138,195,208, - 79,18,70,170,99,92,190,231,50,118,239,222,196,80,67,131,207,112,189,51,228,46,162,92,170,162,136,56,125,126,129,7, - 31,122,148,135,191,120,15,247,222,251,0,237,67,207,158,127,167,243,226,53,208,108,20,65,145,167,198,224,17,97,205,163, - 25,60,49,139,56,50,142,207,239,4,223,0,95,133,228,237,112,184,13,159,15,32,248,187,80,251,245,223,249,218,149,191, - 184,212,209,239,124,245,110,126,228,123,222,34,62,89,154,174,253,183,15,124,114,247,20,118,203,8,180,154,208,217,2,115, - 163,5,24,61,213,133,189,111,131,103,119,121,191,52,158,103,238,7,117,192,175,232,128,255,145,165,133,252,5,79,252,10, - 5,143,23,21,128,86,64,40,177,150,135,103,206,188,44,64,168,36,37,127,231,143,239,226,99,238,165,113,43,252,12,248, - 119,64,138,16,169,243,194,247,123,125,74,104,130,48,32,80,197,107,233,188,67,136,98,51,229,165,89,29,32,251,129,183, - 143,25,200,46,16,197,0,214,73,48,206,162,164,36,138,35,108,226,209,66,224,6,62,60,43,44,99,49,200,85,151,162, - 152,217,36,64,32,21,153,49,36,105,178,170,176,95,33,51,166,73,2,214,83,138,34,156,43,170,176,44,179,152,60,33, - 77,18,26,245,6,89,150,145,231,249,42,137,113,197,107,202,185,162,133,244,88,16,154,60,55,228,166,88,193,91,45,72, - 83,75,210,79,200,146,62,195,163,13,110,126,245,213,92,118,217,38,234,117,112,121,139,180,231,169,149,27,120,17,178,208, - 106,243,244,147,251,216,251,213,175,241,209,79,126,129,103,79,46,32,109,137,53,19,147,184,205,219,199,190,60,59,107,190, - 103,121,222,173,135,52,135,253,105,225,130,123,95,13,102,103,241,253,35,96,195,193,48,247,35,192,195,144,254,12,28,233, - 195,87,134,96,226,187,22,186,67,255,245,195,15,109,126,253,235,47,83,55,110,232,81,249,225,55,197,15,204,44,199,229, - 205,67,53,35,237,216,253,135,78,241,224,153,37,187,246,224,169,43,47,207,179,107,55,194,14,15,95,217,15,15,237,113, - 238,204,127,201,179,236,45,66,176,3,248,80,209,44,191,92,177,65,92,80,120,189,96,33,175,223,178,22,236,229,2,66, - 229,40,224,158,167,142,241,241,123,247,189,116,230,81,131,159,172,245,222,13,85,70,184,227,134,91,56,127,234,56,39,79, - 157,98,126,113,1,235,28,106,176,90,71,136,162,101,49,22,196,96,51,38,4,114,32,236,92,49,154,95,145,56,204,46, - 204,23,85,135,181,69,5,165,20,62,207,87,239,38,99,12,65,24,174,126,222,172,16,26,173,193,243,28,119,72,43,133, - 183,174,16,60,70,17,245,198,16,189,110,159,40,140,137,194,8,194,152,102,163,73,185,84,194,154,156,94,191,143,181,142, - 40,140,144,82,17,4,186,176,243,144,128,40,130,13,165,16,100,89,138,201,45,222,27,22,151,22,169,148,170,220,122,203, - 205,92,127,243,46,42,117,135,164,143,233,89,170,97,21,33,60,7,159,58,206,99,251,246,99,204,97,166,226,156,93,99, - 53,254,160,157,210,177,33,168,156,222,153,131,84,202,195,34,155,88,23,252,198,248,26,110,60,188,47,122,151,115,53,9, - 210,67,107,45,116,52,69,100,114,95,8,62,161,20,39,164,226,113,224,90,147,39,55,57,119,208,192,87,182,192,212,107, - 114,51,242,192,190,83,195,19,165,53,212,70,207,242,254,127,249,86,198,194,243,184,126,159,115,157,173,60,125,90,168,143, - 124,234,145,225,79,30,57,54,180,235,192,209,137,215,56,214,120,24,202,225,75,175,247,254,68,201,123,115,39,80,113,150, - 205,121,202,17,196,75,118,93,190,220,237,253,69,29,223,243,14,56,207,59,0,125,35,8,93,245,18,157,9,73,41,249, - 111,127,124,23,47,37,3,182,213,85,59,176,102,88,249,31,253,185,31,36,112,158,179,167,207,243,228,190,131,60,241,196, - 1,158,126,250,8,231,206,44,176,208,89,160,155,247,11,195,116,64,106,81,196,15,11,129,148,226,185,8,6,241,220,102, - 107,176,59,195,251,226,123,72,165,80,131,129,179,31,172,236,173,115,152,34,178,162,120,109,132,64,105,133,51,6,41,6, - 18,16,231,7,9,164,125,250,253,136,56,46,209,168,15,13,64,199,144,39,41,222,121,162,168,112,163,9,131,136,36,201, - 16,162,79,181,82,37,10,74,228,62,195,120,135,55,197,32,189,223,239,210,235,181,25,159,104,240,250,107,175,227,154,43, - 119,210,108,150,112,174,143,235,41,194,64,98,179,148,71,246,222,207,222,251,30,65,36,125,214,142,198,92,186,103,148,201, - 24,194,160,201,77,87,93,198,19,159,219,75,32,21,129,14,232,245,251,204,31,120,134,109,59,118,211,122,251,119,213,14, - 127,250,195,155,182,155,124,171,131,198,211,48,127,100,0,250,29,33,120,36,8,87,95,176,223,6,46,201,210,214,4,60, - 147,195,179,187,83,119,205,127,251,181,7,154,187,214,191,87,92,219,60,67,205,159,101,230,76,153,251,246,206,185,110,119, - 33,247,113,69,93,187,103,90,230,175,218,36,79,158,216,61,245,135,191,253,169,215,124,167,65,73,104,117,161,245,155,48, - 255,223,87,122,231,36,1,41,249,86,114,87,180,14,8,165,228,149,120,158,55,53,252,115,32,116,246,37,55,152,126,41, - 86,63,223,136,69,165,190,53,89,43,161,90,215,172,95,223,228,146,109,183,241,29,239,126,35,189,94,198,249,243,203,28, - 58,126,150,199,158,216,199,190,125,207,112,226,212,25,102,103,103,233,116,123,197,170,94,7,40,93,84,24,214,121,148,28, - 172,218,189,31,100,204,131,23,133,95,141,148,10,132,68,249,130,173,236,173,99,121,121,169,168,182,6,51,155,162,109,242, - 148,74,33,194,67,160,20,81,41,38,203,115,148,82,196,113,72,28,5,148,74,49,54,203,11,189,21,80,138,203,68,81, - 145,128,154,229,25,198,228,116,187,109,194,40,164,52,112,56,236,251,156,118,171,205,182,205,235,216,181,115,61,59,118,108, - 64,71,2,159,167,100,253,46,81,88,69,88,120,230,169,103,57,250,204,83,44,159,63,202,166,137,42,215,108,158,102,88, - 65,31,129,109,39,16,119,184,114,235,56,13,105,232,231,21,146,204,80,170,8,94,123,251,237,124,255,223,254,219,56,169, - 120,232,115,31,171,237,52,249,176,134,210,62,144,191,9,174,60,104,9,127,60,77,248,62,10,61,85,213,123,22,138,185, - 156,14,32,90,130,224,53,55,111,23,87,239,18,132,153,225,177,19,146,255,245,191,62,213,25,222,123,236,204,22,108,39, - 131,176,23,4,149,71,26,209,248,219,127,234,7,43,251,191,247,13,245,79,253,223,63,185,246,61,112,220,194,145,119,66, - 235,198,129,230,11,88,245,64,250,235,156,8,120,214,26,126,90,134,175,152,213,251,11,2,64,207,13,166,205,75,111,48, - 45,37,255,249,99,119,243,82,179,159,29,100,71,121,128,48,199,229,169,67,250,12,227,60,173,110,159,178,74,169,6,138, - 242,150,113,182,93,178,134,119,188,241,122,122,153,103,113,185,199,204,217,57,158,126,230,48,143,61,185,159,253,135,79,114, - 244,228,97,58,221,101,146,126,66,55,77,87,13,194,180,214,232,32,64,135,18,231,115,108,238,8,116,132,240,2,155,102, - 140,142,12,163,177,180,59,61,140,19,152,44,47,120,63,130,130,91,100,45,181,106,21,237,61,141,161,38,121,47,1,231, - 10,65,129,205,129,194,30,67,233,0,99,115,66,17,20,148,1,239,168,85,202,131,86,78,146,39,41,189,212,18,84,43, - 252,173,191,251,119,120,253,171,175,98,241,244,179,180,151,207,97,115,11,178,132,14,170,156,61,113,130,3,143,239,133,229, - 57,46,223,56,198,186,29,187,136,108,135,60,239,208,77,5,58,140,144,218,227,130,156,53,235,70,169,197,138,161,250,90, - 110,188,241,90,94,247,218,107,185,100,219,86,166,166,198,217,251,212,126,78,8,74,14,154,6,234,59,65,253,123,112,43, - 117,196,144,115,104,10,81,104,27,8,32,246,176,193,193,182,131,181,234,200,123,223,179,142,178,106,243,248,137,26,63,250, - 51,127,96,222,61,51,127,250,45,112,46,131,57,9,202,230,249,154,225,185,220,63,254,201,47,175,249,225,159,121,79,252, - 75,143,31,31,59,249,216,129,61,83,176,41,132,103,95,15,89,157,111,221,123,85,2,111,177,150,131,210,242,155,175,32, - 254,207,11,2,64,5,8,73,18,107,94,50,51,33,161,36,203,173,46,127,231,240,105,254,22,47,238,234,253,27,183,96, - 235,138,119,224,60,130,190,233,206,219,133,222,105,182,143,94,70,63,53,24,23,16,226,193,165,96,139,253,149,140,37,37, - 37,40,85,42,76,79,87,185,241,150,93,228,230,29,116,251,134,153,185,101,102,231,218,204,205,206,179,180,208,97,110,118, - 145,67,135,15,242,196,83,143,49,59,127,142,94,43,39,75,66,156,205,232,185,148,74,53,30,196,225,8,100,32,105,12, - 213,201,50,7,222,19,69,33,81,20,22,121,240,214,210,235,39,40,175,177,61,195,216,240,36,54,207,81,104,132,83,164, - 73,74,46,28,97,12,113,37,68,40,64,73,74,213,42,30,65,110,44,66,132,76,172,27,231,85,183,188,138,43,174,190, - 154,230,112,19,103,251,184,74,147,172,211,33,10,97,105,126,150,39,31,250,2,233,204,73,182,143,196,108,219,53,68,228, - 123,100,221,54,125,93,69,69,138,168,98,177,193,16,157,4,206,156,237,112,190,167,248,161,31,122,31,59,118,92,205,244, - 250,41,234,83,67,52,27,53,234,181,26,181,99,39,232,70,81,216,79,250,227,33,140,70,16,156,129,188,53,232,82,175, - 133,85,251,210,62,176,4,141,26,108,159,129,45,126,199,198,242,214,181,195,56,99,249,195,63,121,138,205,51,243,11,111, - 132,51,125,184,211,193,163,190,16,171,190,102,23,92,245,216,177,153,106,88,169,197,239,248,225,55,203,131,63,122,112,98, - 26,63,145,64,105,14,90,125,158,31,243,231,18,240,3,38,231,247,47,240,120,186,8,64,47,19,16,82,129,102,249,83, - 247,33,206,46,80,127,137,189,248,75,224,71,160,229,224,240,68,43,61,254,197,159,253,207,99,71,222,246,198,96,237,101, - 151,49,189,101,51,107,38,155,84,130,10,206,148,16,190,87,188,243,187,0,239,37,194,123,92,158,161,165,160,57,164,24, - 25,31,65,134,235,64,86,128,106,241,158,110,61,203,115,243,204,156,159,225,244,241,147,156,59,125,134,133,197,5,22,151, - 22,57,112,240,8,7,15,30,165,223,205,9,196,40,82,25,202,129,193,26,75,185,84,42,152,206,229,10,90,199,248,33, - 65,185,20,161,164,160,217,24,90,181,103,53,38,47,12,208,188,199,102,20,13,12,26,29,133,12,141,55,25,30,31,102, - 199,158,29,236,217,115,41,107,38,199,208,10,200,115,76,190,128,144,154,201,233,13,152,126,151,175,253,201,39,57,247,212, - 35,108,31,42,179,253,146,181,52,117,15,210,22,97,92,33,168,213,105,59,152,79,60,179,11,17,199,206,205,179,212,17, - 120,93,195,196,13,202,205,38,135,15,31,98,219,246,181,172,221,48,129,73,83,114,147,80,174,196,196,113,232,252,50,101, - 89,176,158,245,135,128,227,131,155,94,81,100,116,101,69,155,35,43,208,20,176,105,6,198,235,155,135,85,197,58,206,46, - 88,14,239,61,216,251,91,112,198,195,147,192,231,66,120,58,131,97,15,211,18,182,145,137,94,167,103,217,181,125,130,211, - 235,215,214,237,137,147,227,10,170,15,193,121,247,60,154,143,85,188,231,173,214,240,81,165,137,46,2,208,95,13,132,174, - 154,88,67,227,69,2,161,220,57,54,125,249,209,213,160,192,151,218,121,12,150,22,224,225,245,48,58,250,196,209,185,51, - 79,252,218,244,113,21,12,221,63,61,217,172,110,24,11,118,95,125,169,26,90,187,46,104,108,89,175,171,155,214,211,156, - 154,162,28,7,196,74,128,177,24,11,121,90,184,41,138,164,131,84,41,82,46,35,84,33,157,104,140,72,26,195,35,92, - 178,163,9,110,119,161,53,203,45,75,203,93,14,30,60,202,145,67,39,201,82,79,146,246,73,211,62,46,55,132,81,136, - 7,180,46,17,148,234,228,22,112,14,147,246,65,72,194,40,64,202,98,125,223,235,117,25,30,25,97,253,166,205,148,235, - 85,42,165,50,35,163,195,140,142,14,17,70,65,65,114,204,19,114,103,201,16,132,74,162,163,18,249,82,139,71,239,187, - 135,199,239,254,28,81,119,150,119,92,191,141,122,4,157,158,229,124,94,165,151,151,56,191,208,99,190,183,68,39,243,88, - 57,198,82,94,195,232,26,178,38,112,222,210,179,125,230,22,12,19,149,17,102,230,219,172,179,125,16,69,182,89,179,217, - 192,53,234,42,155,57,95,45,193,120,31,42,191,3,173,234,224,117,207,40,76,193,84,241,95,113,2,2,15,37,1,106, - 98,44,64,100,158,115,231,19,162,153,197,246,58,88,202,225,176,131,19,37,232,100,80,22,144,59,240,125,107,92,102,202, - 212,42,150,160,86,14,129,161,8,74,29,16,191,8,254,249,2,11,1,100,121,14,66,62,151,219,125,17,128,190,89,16, - 58,205,213,19,211,47,26,8,189,148,207,233,98,88,121,80,67,191,12,79,108,133,41,97,243,9,119,226,228,100,126,226, - 100,57,189,251,145,242,18,140,207,73,57,121,118,98,108,124,97,199,182,70,237,242,75,163,137,93,219,88,187,101,3,155, - 54,173,103,120,184,73,41,174,33,133,192,186,20,99,83,242,172,143,115,16,170,24,41,52,74,4,152,172,208,120,153,172, - 131,119,41,91,54,142,178,109,227,40,89,154,145,228,9,72,135,207,13,43,89,238,65,92,103,106,211,118,116,92,1,163, - 193,40,208,2,148,24,176,25,87,212,108,114,208,108,12,118,61,222,227,141,199,153,12,225,138,73,70,16,133,32,115,206, - 30,62,204,157,95,252,10,15,63,242,4,103,142,159,98,251,250,73,154,18,126,251,147,79,208,233,91,90,189,46,34,170, - 224,130,58,34,26,162,52,212,164,57,220,68,42,69,234,50,140,77,17,153,65,24,143,42,135,32,83,122,249,50,139,173, - 5,188,243,120,103,9,116,68,164,20,163,55,222,24,62,113,224,200,228,171,113,219,37,76,157,128,217,93,131,139,156,3, - 190,60,184,242,16,220,24,44,43,56,85,130,229,212,48,153,101,57,11,243,243,100,89,38,6,149,140,5,92,225,51,128, - 22,16,166,160,109,185,92,174,212,170,120,221,193,24,231,11,168,198,103,3,144,123,62,89,64,10,216,232,28,39,165,124, - 197,120,41,235,237,215,125,255,95,250,135,118,190,234,7,94,222,255,202,183,252,244,243,240,22,244,194,16,202,230,193,111, - 129,238,52,28,122,22,78,54,10,141,82,213,65,173,4,97,0,113,21,38,112,110,211,248,217,153,141,253,179,51,107,231, - 190,242,181,169,115,48,186,175,82,26,90,90,51,94,141,47,217,16,213,182,92,34,215,93,186,135,77,91,55,177,110,221, - 52,227,99,163,212,235,53,4,10,172,7,161,81,218,16,153,20,163,20,221,238,50,253,36,37,75,250,56,151,99,173,195, - 24,139,205,179,2,95,148,38,51,125,122,173,46,37,81,65,72,139,84,249,64,28,43,112,214,32,132,71,72,5,126,224, - 130,236,44,48,176,214,208,234,185,192,196,52,229,169,135,30,228,83,159,248,20,159,252,212,167,121,246,192,81,134,134,39, - 153,94,179,129,67,39,159,198,165,9,65,24,144,89,75,158,24,188,235,208,28,73,89,187,62,160,81,30,161,155,229,100, - 157,22,82,116,113,222,19,251,18,37,221,192,102,14,173,61,129,43,234,17,225,11,78,212,137,163,135,57,125,242,60,187, - 174,186,150,15,127,244,19,35,87,183,150,54,150,97,106,1,246,255,22,152,54,69,60,242,123,41,34,109,90,224,247,22, - 18,139,103,134,224,248,249,179,201,150,174,117,186,82,18,68,165,216,38,105,55,174,192,90,9,19,14,18,9,163,10,198, - 150,160,22,143,143,212,167,39,154,28,63,118,142,116,102,174,39,97,182,15,221,119,130,255,199,23,51,247,94,220,10,232, - 226,249,230,78,13,168,131,61,6,189,59,160,167,96,113,22,196,99,32,42,69,193,29,55,160,238,97,36,132,241,13,48, - 181,9,166,124,183,191,38,59,120,124,124,249,224,241,137,51,220,53,118,66,136,230,61,81,84,203,214,175,47,169,177,97, - 61,178,101,61,83,91,215,203,203,118,109,102,108,98,140,198,240,48,205,161,97,170,113,137,122,189,74,181,86,34,203,250, - 180,219,203,244,218,93,132,19,104,237,112,206,14,12,226,193,59,129,24,36,138,131,197,123,135,31,176,154,11,242,163,67, - 72,141,64,22,149,17,142,180,215,102,97,118,142,179,167,207,114,255,67,123,185,239,206,59,217,251,240,227,28,63,187,132, - 138,43,132,229,17,82,99,153,61,123,130,56,138,9,75,53,82,91,200,62,42,245,18,120,139,53,150,180,227,153,63,181, - 136,14,219,68,97,76,88,170,224,194,12,143,32,245,41,65,20,144,91,139,164,132,233,105,78,159,56,195,236,185,25,146, - 36,97,98,108,138,160,52,130,109,14,171,126,107,169,82,134,138,5,245,243,192,177,193,235,254,159,40,24,209,6,248,73, - 232,141,194,177,97,56,80,189,247,153,43,230,111,223,58,62,62,218,160,182,102,72,204,47,117,101,29,46,205,225,53,2, - 142,10,216,162,96,247,41,168,238,186,118,103,60,210,28,227,211,31,250,34,122,105,113,94,192,153,26,180,38,46,42,47, - 46,2,208,203,237,136,193,59,178,2,95,3,255,191,128,219,193,46,64,126,51,116,54,193,57,7,7,90,16,59,168,9, - 104,56,24,26,130,177,49,152,188,202,251,41,155,36,19,201,193,131,163,173,3,126,125,251,158,251,39,62,14,245,135,95, - 123,121,227,150,171,183,115,250,204,25,162,184,74,84,170,17,150,107,140,78,174,97,124,106,13,229,74,153,56,14,8,180, - 164,26,23,170,119,235,61,181,122,131,122,179,129,8,229,192,59,68,130,144,8,28,72,69,183,219,165,215,107,113,234,216, - 9,150,206,157,243,51,39,79,249,7,159,120,74,238,59,112,136,217,147,231,124,127,118,209,170,86,175,119,14,66,83,10, - 227,70,173,76,106,5,88,139,80,14,41,53,94,120,82,239,233,165,93,148,201,176,174,224,135,15,53,74,180,211,37,12, - 61,70,154,67,152,220,226,130,0,85,46,225,28,228,72,172,51,120,145,177,220,159,229,236,188,102,236,116,149,161,230,48, - 59,118,78,17,4,17,227,169,101,253,166,13,162,127,252,72,12,84,5,4,255,230,130,215,219,83,172,225,37,176,17,204, - 83,136,153,53,248,253,147,179,11,39,239,253,227,189,35,111,251,161,215,168,87,191,243,186,177,47,30,254,68,242,174,212, - 6,99,240,118,15,109,15,141,253,48,218,222,62,93,126,243,13,91,229,204,124,143,19,31,185,167,255,42,56,145,195,233, - 16,250,209,197,219,249,34,0,189,220,193,104,69,54,145,20,31,190,10,118,67,145,170,144,92,1,203,17,156,217,14,114, - 166,224,171,149,50,168,43,168,105,239,135,71,97,207,180,144,175,171,70,225,149,207,148,101,245,251,47,27,87,233,166,136, - 158,177,44,165,158,185,36,229,236,217,3,28,58,184,143,249,133,54,70,123,124,32,144,66,210,79,18,148,86,108,222,188, - 133,241,137,137,66,212,42,29,169,21,28,56,126,26,209,109,229,242,228,114,110,103,23,242,74,107,174,107,78,157,79,226, - 229,180,31,56,223,159,0,53,14,98,24,178,33,208,147,80,250,96,40,235,255,7,166,3,11,161,42,106,169,32,44,177, - 156,230,180,230,23,64,158,69,135,33,90,6,196,145,165,189,176,72,167,221,98,114,98,146,198,218,245,244,18,207,240,112, - 132,245,9,190,163,72,178,140,52,77,16,10,194,40,70,14,53,88,78,187,60,240,208,19,32,61,111,122,243,107,216,188, - 97,29,37,229,137,167,70,196,113,24,222,0,19,10,170,18,22,30,24,188,198,155,129,27,7,211,171,57,96,10,191,224, - 225,137,9,120,228,177,47,62,59,253,145,117,83,147,111,189,121,157,154,123,223,237,27,126,227,55,190,84,190,177,151,196, - 101,200,14,197,98,88,93,119,201,200,119,124,231,107,75,91,166,199,248,226,167,191,66,248,232,35,115,21,216,239,225,228, - 83,144,253,48,133,19,217,197,115,17,128,94,17,71,14,192,72,20,115,35,18,240,21,176,91,192,238,131,252,36,116,46, - 133,185,46,200,114,145,139,126,44,241,174,63,148,36,85,113,102,97,108,169,213,85,165,164,77,89,9,226,178,100,114,56, - 226,202,75,154,56,225,49,182,137,203,99,146,158,167,211,109,23,246,24,66,160,116,134,74,79,23,158,212,222,209,11,135, - 249,224,71,190,148,223,126,240,196,177,29,48,43,224,148,132,101,93,16,138,151,129,150,4,35,6,131,88,15,83,33,92, - 95,113,178,57,57,62,65,218,238,98,114,83,240,139,140,65,74,129,86,10,139,193,25,139,5,226,74,141,13,187,47,229, - 240,193,195,156,58,125,134,36,201,24,29,29,195,227,73,211,4,173,53,181,90,13,169,11,211,251,70,163,62,8,69,244, - 116,243,28,235,50,142,30,57,193,214,13,235,9,117,200,229,55,220,200,129,63,250,88,93,88,51,166,160,218,1,121,15, - 184,0,56,5,236,40,218,95,12,176,31,210,237,176,223,193,151,111,117,102,205,199,127,247,206,87,255,210,177,29,181,27, - 110,189,90,92,250,125,183,140,223,249,208,147,195,59,154,147,249,141,215,174,141,174,223,51,42,17,130,15,127,250,65,158, - 250,95,31,105,189,23,30,205,224,33,13,103,95,3,182,126,241,150,189,8,64,175,244,10,105,229,244,6,160,212,25,110, - 250,131,205,134,93,58,63,107,175,109,119,79,84,181,126,56,52,230,138,238,153,214,149,109,162,168,28,22,218,45,105,5, - 34,151,184,229,28,1,4,206,17,200,30,85,105,104,148,12,178,92,48,161,133,112,3,235,12,137,179,146,188,30,115,221, - 134,166,217,112,240,68,47,128,167,172,20,95,180,206,159,116,208,11,161,107,33,233,22,193,208,94,129,80,176,93,194,88, - 207,178,115,253,154,77,196,74,112,244,200,17,58,221,46,89,154,225,133,64,75,13,14,188,5,111,29,175,186,246,122,38, - 39,38,56,127,110,150,164,215,47,116,103,67,67,148,202,21,26,205,26,245,122,131,48,12,240,94,144,101,57,74,6,104, - 21,32,132,70,5,10,111,224,244,233,25,150,91,29,180,244,76,175,89,195,147,97,16,250,190,25,235,67,115,59,232,255, - 8,217,138,51,207,255,11,60,58,248,245,187,192,189,19,22,246,193,131,26,134,223,149,25,185,247,75,79,237,121,252,208, - 252,216,174,107,214,234,155,223,124,165,170,52,135,181,79,13,95,190,251,44,95,123,226,4,242,161,131,203,223,105,204,3, - 17,124,214,194,35,21,104,109,0,54,92,188,69,47,2,208,183,211,113,83,19,44,252,192,247,50,188,126,154,143,252,246, - 31,224,238,123,200,190,93,208,50,208,206,123,89,190,152,27,166,26,49,105,175,143,196,163,40,188,168,133,87,40,43,200, - 148,47,108,223,125,48,136,193,25,152,224,83,248,66,75,29,82,25,169,49,186,99,93,176,240,197,199,101,3,150,188,231, - 96,9,14,244,33,17,224,215,20,196,74,4,48,3,242,68,209,242,204,220,234,205,204,153,78,107,104,242,170,87,149,135, - 170,77,22,22,23,201,77,78,102,114,28,5,243,186,211,110,177,48,187,128,179,142,44,73,217,181,99,7,195,35,163,84, - 42,85,116,80,100,95,25,155,208,79,250,88,55,176,166,149,122,160,247,76,168,86,27,68,165,42,253,196,113,238,252,121, - 238,186,235,46,174,187,250,74,238,191,239,126,150,250,125,37,96,212,193,72,0,186,83,152,205,83,5,222,116,1,0,181, - 128,115,96,99,56,157,195,23,21,44,222,12,87,181,142,159,189,116,230,248,217,173,7,84,80,127,186,81,169,45,90,167, - 77,43,177,219,124,222,121,3,254,145,10,124,34,133,47,215,224,244,221,96,211,65,251,252,170,139,183,229,69,0,250,118, - 168,130,134,223,242,70,26,183,221,76,84,175,97,146,84,76,13,15,249,33,240,206,24,43,133,200,109,175,103,79,37,37, - 174,220,115,9,174,223,66,249,28,235,44,120,135,82,18,229,29,214,131,68,161,181,92,181,0,89,177,252,80,74,33,188, - 70,212,37,211,87,108,211,251,27,149,198,37,203,221,77,185,247,123,114,232,89,56,103,161,55,13,70,2,243,141,42,98, - 215,70,39,239,123,106,209,195,145,117,48,183,113,238,252,154,92,7,229,230,208,48,181,90,157,86,187,77,16,6,131,88, - 159,12,49,54,73,111,178,87,8,95,131,8,173,131,129,149,71,66,150,103,196,113,132,64,144,13,162,154,181,10,16,97, - 225,85,148,36,9,185,113,68,253,132,126,214,102,124,188,193,198,141,27,24,159,152,96,253,244,26,191,8,153,129,146,132, - 178,5,245,143,120,110,19,118,225,249,18,112,5,240,17,72,167,224,168,45,10,203,39,202,176,99,35,92,177,193,230,235, - 174,88,88,26,77,11,32,115,1,28,17,112,103,14,119,213,225,248,207,67,246,137,111,24,114,95,60,23,1,232,149,59, - 164,110,212,217,247,246,55,211,125,235,155,217,150,36,120,239,105,59,207,142,64,115,165,16,116,189,79,74,176,56,109,252, - 242,209,99,167,39,237,27,174,195,7,2,47,13,129,26,228,194,11,240,88,180,1,37,3,132,44,124,36,44,30,55,8, - 6,76,7,126,67,42,207,152,110,14,241,7,245,242,200,174,94,186,125,60,55,42,47,102,185,79,90,56,180,23,206,4, - 208,146,73,154,29,58,122,150,42,180,135,224,128,18,28,191,172,181,188,225,107,231,79,143,150,154,77,149,180,179,65,212, - 50,228,105,74,191,223,39,12,2,192,145,246,83,162,56,162,223,235,145,244,43,69,245,99,12,81,20,144,101,41,2,49, - 8,106,84,244,122,125,230,231,231,209,90,83,42,101,196,177,230,250,235,174,226,134,27,174,102,168,86,248,16,110,219,182, - 149,3,149,170,179,221,142,18,160,67,16,215,1,179,65,72,62,136,164,6,138,106,108,64,146,237,0,219,33,95,128,249, - 47,192,210,142,98,179,245,132,128,33,7,163,162,248,112,18,78,117,225,208,90,56,255,31,33,255,196,197,219,242,34,0, - 125,59,12,163,37,16,215,106,168,95,254,207,44,76,77,48,209,235,147,196,49,86,41,68,171,229,127,231,137,167,57,224, - 61,255,16,250,30,63,55,10,173,39,79,30,243,56,35,164,119,40,99,81,94,22,188,65,4,74,134,69,150,186,51,120, - 81,176,156,189,0,239,192,230,41,161,20,133,133,173,115,108,27,30,97,121,98,93,229,39,23,186,219,94,27,48,246,234, - 212,109,158,118,254,42,233,253,129,4,246,37,240,116,150,230,199,55,156,155,95,152,128,252,12,28,55,158,199,54,165,189, - 109,15,28,124,106,77,239,234,107,170,81,8,214,130,247,57,120,75,165,20,22,238,140,170,204,210,210,18,103,207,158,197, - 218,124,53,39,205,121,71,191,215,45,140,236,189,165,181,188,76,187,221,65,74,77,185,92,102,120,116,140,184,18,115,237, - 181,123,184,241,166,27,8,66,129,119,6,139,103,108,205,26,49,51,54,90,237,119,59,149,10,52,129,248,111,9,217,186, - 87,107,102,133,64,175,12,247,133,160,159,38,171,175,177,162,160,62,255,30,216,159,131,37,15,45,11,50,40,200,161,161, - 7,50,72,246,64,118,28,220,177,139,183,230,69,0,122,37,159,128,98,215,126,28,120,24,248,114,158,19,255,247,247,35, - 173,165,7,188,15,120,167,16,252,215,52,67,29,61,193,247,131,114,208,80,48,18,10,21,157,93,108,139,204,59,148,42, - 30,46,33,61,82,136,194,224,204,155,129,255,52,131,225,115,33,173,112,194,23,90,46,57,176,65,115,158,106,213,115,245, - 149,235,248,204,254,131,165,195,81,163,244,39,50,29,191,50,207,214,223,108,237,37,187,172,189,162,238,121,54,133,71,12, - 236,157,135,163,14,22,44,236,45,121,191,249,182,163,135,71,254,200,166,91,231,155,35,177,203,29,65,16,82,142,202,104, - 37,137,74,37,116,16,225,40,92,18,17,208,238,180,240,120,22,151,150,57,55,115,22,53,240,59,170,84,170,140,143,79, - 48,50,58,86,132,22,106,205,80,189,198,21,151,239,33,12,21,144,35,148,67,0,19,35,77,122,107,55,132,231,142,29, - 107,108,131,181,93,24,218,229,221,236,118,107,253,169,11,42,32,6,32,116,161,101,139,184,0,240,123,224,158,1,183,9, - 204,229,208,203,129,125,192,26,224,244,197,118,235,34,0,189,18,43,29,53,248,200,129,135,128,95,6,142,80,172,143,73, - 18,120,228,177,213,63,191,56,0,169,53,192,111,128,170,195,154,30,220,164,165,186,233,161,90,48,189,239,124,143,133,118, - 194,186,50,248,92,224,165,4,21,129,243,56,145,129,0,233,229,32,56,112,197,5,177,176,129,45,174,199,147,251,24,35, - 36,187,166,107,12,37,22,167,5,115,26,245,105,17,14,127,1,221,188,50,79,166,111,79,211,141,215,122,191,85,194,250, - 30,124,193,22,46,168,135,114,184,115,155,177,35,239,62,121,50,252,23,231,231,182,46,73,45,99,1,101,95,38,172,6, - 4,177,64,26,138,181,251,248,48,97,57,226,158,7,238,69,15,12,243,165,80,12,213,154,140,143,143,179,113,227,70,198, - 199,199,87,141,238,179,44,199,59,75,24,6,104,161,177,54,195,81,68,92,87,171,21,154,235,55,201,199,249,234,208,46, - 216,100,96,179,135,179,151,102,105,251,75,20,86,28,223,76,187,43,191,97,238,118,225,231,46,158,139,0,244,138,57,126, - 240,67,73,6,15,199,255,6,22,6,31,127,217,89,6,222,11,250,16,76,117,224,213,177,16,119,252,65,168,111,254,61, - 236,72,48,55,199,137,83,103,217,176,107,109,49,244,21,133,188,66,10,89,44,204,133,3,235,87,99,148,189,16,72,33, - 46,176,36,47,172,95,173,205,153,152,24,165,82,138,232,11,192,56,34,47,72,201,196,3,81,84,123,84,168,218,219,109, - 191,249,221,150,114,232,92,71,120,206,106,56,105,138,124,244,53,151,24,63,125,117,224,38,254,68,209,200,77,78,223,38, - 116,151,123,164,243,93,34,89,12,154,159,126,118,63,198,89,186,253,30,34,145,40,37,25,106,12,179,118,237,90,38,39, - 39,209,90,51,55,55,143,247,131,156,51,15,222,103,124,228,35,127,204,238,221,151,177,118,237,52,195,35,117,20,160,149, - 230,242,171,46,229,87,62,72,253,102,216,185,6,110,152,131,147,59,224,192,15,22,94,76,95,87,101,30,0,210,139,183, - 225,69,0,250,118,4,30,63,0,158,47,1,63,55,40,241,191,217,179,161,0,160,82,38,196,250,16,110,18,222,191,229, - 127,135,209,109,31,13,228,8,94,146,167,57,39,207,205,195,101,91,16,178,91,0,138,16,43,145,96,224,197,64,219,229, - 7,96,35,193,23,15,183,240,224,10,89,59,206,121,214,173,157,98,100,180,206,177,249,101,2,10,206,144,146,162,136,241, - 9,34,62,150,155,225,237,222,172,189,21,182,58,24,61,11,39,171,112,62,16,60,161,189,191,242,170,220,108,249,114,16, - 52,144,18,239,40,90,60,29,20,154,89,41,56,114,252,88,145,119,95,174,96,237,202,160,92,112,250,244,25,206,156,57, - 75,16,4,40,165,8,195,16,107,29,165,82,76,165,82,103,97,33,225,228,169,5,154,205,50,235,214,79,176,123,247,78, - 166,215,108,224,29,111,124,43,7,126,232,168,254,191,127,248,123,219,222,215,90,190,182,6,15,108,47,218,195,60,185,160, - 146,81,60,71,74,188,216,82,93,4,160,111,139,147,15,110,248,50,80,1,126,1,248,234,224,255,93,251,77,180,6,51, - 192,15,0,187,10,150,239,142,208,251,215,57,120,221,199,75,149,43,63,22,139,17,107,50,148,137,200,172,101,223,193,83, - 184,219,175,47,36,93,66,12,4,254,174,248,74,131,141,216,10,223,90,8,57,120,240,139,100,213,213,105,137,51,148,99, - 69,163,22,194,156,35,80,69,112,33,222,128,213,164,169,231,93,239,253,110,17,156,56,84,239,223,251,181,161,16,234,1, - 168,25,200,182,121,206,59,56,59,105,109,187,12,62,149,66,56,233,240,72,148,10,112,182,224,79,7,90,35,132,196,120, - 143,10,52,214,89,150,150,151,49,253,156,198,80,131,122,189,78,173,86,163,82,169,18,199,37,202,229,50,72,73,84,138, - 209,58,34,77,4,207,62,125,154,82,216,100,114,124,61,165,178,228,231,255,245,207,240,131,7,247,71,199,239,252,210,240, - 229,133,46,76,253,18,112,248,207,120,93,35,224,141,23,31,142,139,0,244,237,112,222,77,33,64,45,1,223,55,248,248, - 171,156,7,11,200,168,44,195,174,42,188,245,172,224,45,255,167,92,218,253,181,32,46,121,103,80,190,224,252,122,1,7, - 14,159,33,51,30,137,7,87,4,31,10,236,32,190,65,32,6,182,26,43,109,13,12,76,237,253,115,21,129,115,142,56, - 150,52,234,49,74,8,130,160,132,183,57,121,238,169,70,37,222,247,227,63,192,123,190,243,187,248,147,127,251,239,195,62, - 68,10,74,77,144,83,133,71,78,23,88,28,242,190,87,177,206,116,33,208,222,226,172,199,75,191,90,69,57,15,222,90, - 164,80,68,81,192,248,240,36,235,166,166,105,84,170,212,107,53,162,184,72,99,245,64,16,4,120,239,72,115,75,24,150, - 80,90,83,175,87,217,118,201,22,182,109,221,194,190,167,158,225,240,145,131,212,155,195,28,59,120,144,184,120,41,228,95, - 84,229,164,192,191,161,96,73,171,139,183,232,69,0,122,41,156,215,189,128,63,0,199,95,221,59,216,82,236,148,255,65, - 193,109,217,80,134,55,158,144,226,237,255,169,84,185,236,105,233,149,50,109,132,139,240,94,35,149,65,4,130,227,39,230, - 152,95,88,102,178,38,138,21,188,119,56,225,138,172,120,231,89,137,133,6,135,144,131,49,235,74,37,228,28,194,21,195, - 233,176,172,24,27,174,17,42,141,183,144,102,25,245,106,147,31,249,123,63,196,59,223,115,19,67,13,205,182,233,233,220, - 20,224,40,50,16,187,129,253,133,139,96,167,38,72,34,103,157,87,69,58,42,20,241,63,198,185,34,181,195,67,41,42, - 209,108,52,217,181,107,23,107,166,214,80,45,87,240,222,145,231,57,214,88,188,240,56,231,177,174,216,118,149,162,18,227, - 19,147,172,89,211,228,234,171,118,35,4,60,187,255,41,102,102,230,168,86,135,248,195,15,255,49,115,167,79,249,38,194, - 88,188,141,192,95,79,225,11,244,103,101,118,61,53,152,7,133,23,111,253,139,0,244,82,56,175,127,137,93,143,27,180, - 108,145,16,101,188,223,217,22,220,242,191,170,181,221,251,4,74,231,30,79,9,43,50,188,43,188,252,132,146,204,156,91, - 224,212,137,51,108,188,98,29,125,91,184,25,22,98,11,177,106,30,38,86,36,175,162,0,31,111,61,110,80,25,121,231, - 81,94,80,14,67,166,166,70,233,118,30,166,20,72,46,221,115,25,87,94,117,25,141,122,141,102,99,132,201,169,113,246, - 251,126,222,43,170,12,57,68,65,238,235,128,40,131,172,120,196,168,208,249,113,124,36,112,72,100,33,173,16,16,232,128, - 209,145,81,46,217,114,9,107,166,166,89,55,189,22,129,160,159,244,73,173,67,106,93,52,141,82,226,115,67,58,96,70, - 215,170,130,13,235,135,184,245,182,155,112,38,231,216,177,147,76,142,79,179,115,199,30,158,120,242,81,190,118,255,221,236, - 12,117,214,200,178,37,160,149,130,249,135,252,249,142,133,154,130,45,109,46,222,250,23,1,232,165,112,174,123,9,94,211, - 192,178,163,166,97,243,211,65,180,249,113,108,232,51,135,245,113,97,24,166,52,94,166,224,21,82,4,36,253,132,19,167, - 206,227,175,90,11,62,7,4,14,3,34,44,160,200,249,1,15,72,172,14,156,157,119,184,66,147,138,214,10,239,53,4, - 33,67,205,58,245,106,153,239,120,247,247,176,126,243,6,114,155,51,185,102,146,161,102,5,103,115,116,92,97,48,85,18, - 150,98,163,103,33,244,66,12,133,80,90,111,93,239,33,29,84,157,7,229,65,120,135,84,69,250,170,86,154,229,229,37, - 146,94,66,187,221,102,168,222,64,107,77,84,142,144,82,16,133,1,214,58,80,138,204,230,56,239,89,106,45,243,232,99, - 251,112,214,176,107,215,22,54,109,154,162,82,174,35,101,196,254,103,75,140,140,76,17,47,119,140,134,89,96,126,25,204, - 201,191,164,197,242,131,121,144,189,120,251,95,4,160,23,251,76,191,4,193,39,7,206,123,31,199,48,124,88,138,70,99, - 98,138,106,59,97,110,118,17,35,250,8,47,145,212,80,58,67,136,132,4,203,211,71,23,200,165,2,215,67,16,23,187, - 103,167,17,94,34,164,29,12,157,45,120,139,16,197,0,88,138,128,48,16,72,37,232,186,58,123,15,180,104,140,172,225, - 167,127,250,199,144,170,142,115,33,213,74,133,52,239,144,89,143,146,30,19,202,192,21,69,141,110,23,12,98,74,5,214, - 196,66,16,189,38,235,157,251,92,216,168,38,65,165,44,179,30,18,139,117,138,229,86,155,36,205,88,88,94,34,77,83, - 180,86,72,45,169,132,49,163,245,33,226,82,137,40,42,81,169,84,137,74,37,26,205,38,205,161,6,22,203,236,242,18, - 159,251,220,253,220,253,149,199,185,100,251,122,118,239,94,207,244,134,53,188,254,246,155,121,231,99,111,227,225,95,248,69, - 43,160,21,66,119,30,236,255,230,185,104,158,63,235,100,20,118,29,53,10,191,160,139,231,34,0,189,168,45,207,75,13, - 128,6,251,43,7,100,77,155,102,54,77,89,183,126,19,235,214,173,167,155,46,49,115,126,129,78,59,37,79,83,84,160, - 80,50,228,233,103,14,147,244,37,129,45,33,209,8,233,80,72,156,8,112,88,36,96,109,62,232,194,4,58,208,132,129, - 166,155,123,14,29,155,227,201,103,102,88,232,69,68,141,105,140,212,68,161,38,75,22,233,46,11,170,149,53,104,145,16, - 136,58,93,21,199,182,88,238,53,60,68,39,161,83,7,35,240,253,204,35,246,120,228,143,244,58,79,254,102,197,93,149, - 196,34,200,19,137,246,197,171,236,125,97,207,90,252,90,224,12,116,178,30,121,63,39,140,66,172,177,32,36,185,177,212, - 235,117,166,38,167,104,12,53,104,14,15,81,111,52,232,119,251,236,123,230,0,135,142,28,96,100,180,206,117,175,186,134, - 207,125,250,19,220,14,139,1,204,247,160,183,13,252,251,191,201,7,164,51,168,148,46,174,230,47,2,208,139,118,142,191, - 196,174,103,133,176,88,21,162,155,195,204,30,47,230,245,226,210,244,227,179,79,210,104,196,76,174,153,100,203,166,75,8, - 180,32,237,119,88,110,167,204,207,44,112,232,232,57,206,47,100,108,24,109,128,237,227,101,134,243,57,194,150,240,214,225, - 144,168,160,76,138,164,159,195,249,249,22,231,102,206,114,236,76,151,197,126,128,46,13,227,43,49,185,146,148,202,101,146, - 52,33,77,36,198,12,102,73,153,7,235,104,197,97,220,130,177,113,216,24,194,104,13,22,13,116,173,231,24,130,115,192, - 206,203,181,72,74,185,205,19,17,7,222,231,120,231,8,163,8,6,22,32,141,70,131,126,63,161,92,174,224,140,69,139, - 194,34,68,135,1,90,43,66,231,201,179,156,131,7,15,161,165,162,82,46,177,231,242,203,24,25,155,64,139,128,44,73, - 8,84,157,51,103,102,88,56,122,156,221,136,89,131,63,13,116,142,81,108,187,196,55,241,58,91,96,248,226,35,112,17, - 128,94,204,243,95,94,98,215,99,128,49,224,31,120,223,13,224,244,136,245,51,147,222,154,185,32,210,237,118,155,229,103, - 59,184,92,80,175,133,76,77,78,176,105,235,86,110,121,245,109,52,68,198,3,79,156,96,97,195,36,181,74,64,84,146, - 4,65,68,137,162,95,234,244,115,206,47,182,57,126,182,197,249,165,140,110,30,96,9,208,165,117,136,90,72,46,13,173, - 222,34,218,164,180,250,45,188,21,144,137,34,129,79,131,166,2,14,108,37,16,167,161,118,21,236,202,96,23,112,62,130, - 94,7,14,43,207,19,61,33,214,253,161,100,251,178,242,101,209,55,132,50,196,169,98,160,12,20,110,137,65,72,110,44, - 105,146,16,71,49,66,20,219,50,173,52,121,110,8,195,16,188,99,180,89,101,120,120,132,201,137,73,74,149,8,169,60, - 206,11,130,82,5,39,52,79,221,247,128,255,206,126,119,121,13,254,132,135,147,25,244,254,3,112,146,111,110,203,213,5, - 110,5,110,227,162,252,226,34,0,189,72,103,221,75,176,37,44,1,11,144,141,195,233,10,226,200,173,214,93,249,180,204, - 71,141,112,88,43,144,66,145,36,41,71,79,156,224,196,185,179,4,58,100,203,212,52,71,142,214,24,170,55,80,90,82, - 46,69,52,135,70,9,17,116,90,139,24,15,72,69,230,4,137,51,232,168,76,165,86,67,137,5,44,65,161,13,243,17, - 206,20,137,24,38,233,19,12,146,127,58,253,46,86,120,2,33,25,91,183,65,252,110,173,217,188,178,189,184,117,28,110, - 238,65,55,128,243,18,154,66,136,94,46,232,156,80,58,244,97,5,37,28,214,22,2,8,235,44,74,42,162,40,38,10, - 2,112,30,225,60,54,55,244,243,156,82,169,132,146,154,168,28,51,49,49,65,189,86,99,168,209,160,217,28,70,75,137, - 193,144,123,67,154,36,212,202,53,70,199,155,44,60,60,107,111,183,98,57,192,207,121,88,60,15,230,125,131,1,243,55, - 219,86,245,41,12,203,236,197,86,236,34,0,189,24,231,255,188,68,175,235,36,228,7,224,140,240,126,223,245,38,191,254, - 163,165,112,244,180,9,16,206,34,149,71,200,128,220,231,228,105,130,49,134,39,158,125,150,103,15,41,130,40,64,133,138, - 90,181,70,37,170,163,162,128,48,10,152,24,159,68,75,133,205,60,90,104,42,101,79,191,221,163,50,236,209,21,141,18, - 17,129,42,33,92,177,150,215,178,80,206,219,204,97,179,4,21,105,142,30,60,76,103,185,207,252,218,13,149,163,207,44, - 70,27,225,218,0,70,92,241,12,107,229,253,90,9,161,206,93,230,227,40,10,171,134,110,167,131,203,139,73,139,117,142, - 126,63,41,248,62,182,32,73,214,42,17,227,35,195,140,142,140,48,54,62,78,185,92,70,8,65,20,69,132,97,136,195, - 97,188,47,88,222,30,134,155,37,94,115,235,141,92,113,217,78,246,239,154,214,159,124,232,222,230,219,230,59,99,14,38, - 214,66,244,86,200,155,127,141,215,123,255,96,30,148,93,4,162,139,0,244,55,121,222,248,18,188,166,21,50,226,251,96, - 217,195,201,9,231,103,174,116,62,61,165,227,72,248,46,206,25,50,35,33,16,8,161,48,153,65,160,232,91,79,47,233, - 33,140,163,211,239,17,171,101,84,84,38,140,42,232,176,74,163,90,71,88,143,12,32,199,18,7,154,82,169,134,14,66, - 132,119,40,85,100,135,57,60,120,133,113,10,37,28,19,195,35,28,56,116,138,167,247,237,227,181,175,187,141,255,241,203, - 129,123,8,22,79,104,61,229,188,92,103,181,150,21,33,92,57,64,46,161,117,59,170,134,161,75,81,222,131,85,56,71, - 225,196,40,11,167,67,147,27,194,32,64,41,73,20,6,84,74,101,134,26,13,162,32,32,237,247,169,54,26,232,64,99, - 173,33,8,227,85,7,199,169,201,9,110,189,237,58,46,217,58,141,20,150,235,111,186,154,167,254,209,251,234,135,126,238, - 63,239,188,4,174,204,225,217,99,112,164,249,215,216,45,236,24,84,159,103,185,200,146,190,8,64,127,131,231,170,151,224, - 53,57,10,95,227,65,10,69,38,4,182,42,165,143,131,136,110,210,41,18,75,157,7,227,16,210,162,101,128,49,133,221, - 134,0,92,46,177,94,18,232,18,181,48,160,18,56,122,243,243,140,148,107,84,26,53,148,10,64,74,226,161,6,42,8, - 200,250,73,33,4,149,26,132,32,8,11,20,244,214,161,132,103,238,252,121,164,150,188,238,117,175,165,90,21,172,153,26, - 13,207,93,115,203,229,95,61,115,60,156,154,92,167,174,189,226,90,230,44,72,161,169,212,74,220,184,116,134,207,124,242, - 19,136,68,18,171,8,21,12,70,194,206,35,4,72,37,49,214,32,148,198,98,49,121,70,175,219,69,107,77,181,90,197, - 230,25,137,183,84,42,101,180,86,244,147,62,151,94,186,155,55,190,225,54,154,67,1,206,119,81,129,32,235,119,120,239, - 251,126,132,223,253,220,87,214,245,239,127,248,234,0,30,109,195,185,195,208,9,254,26,149,140,184,160,45,63,199,75,111, - 67,122,17,128,94,129,231,223,188,68,175,75,22,109,129,159,7,183,224,157,168,199,37,182,148,202,246,169,118,87,9,153, - 35,2,1,46,66,122,131,215,33,66,245,17,89,134,114,154,76,10,82,219,65,228,41,36,26,235,202,172,153,154,64,201, - 152,40,168,34,20,212,26,85,2,93,162,159,244,208,218,33,116,128,84,17,74,122,2,157,17,8,65,154,90,38,39,167, - 216,188,101,29,155,55,77,115,234,244,49,198,71,167,24,25,25,99,120,100,93,105,118,110,158,157,107,215,177,102,184,78, - 47,43,172,99,227,200,147,14,130,14,51,233,49,94,96,242,124,224,69,45,176,214,21,50,11,33,200,83,135,23,109,210, - 180,143,33,35,138,67,74,165,152,80,23,154,176,21,213,126,160,2,170,37,73,179,161,49,166,139,214,18,239,11,185,199, - 80,179,204,238,31,127,95,229,228,119,255,200,206,109,206,93,106,224,169,3,208,221,86,24,63,254,181,78,147,98,25,176, - 27,248,247,20,12,199,139,85,209,69,0,122,65,206,31,189,68,175,203,1,13,176,35,48,223,176,156,152,232,180,58,253, - 114,117,180,26,196,136,32,34,174,134,196,186,138,182,146,118,183,67,43,179,100,42,64,228,154,177,48,227,93,239,184,137, - 237,107,70,233,217,18,103,90,57,194,149,169,54,70,136,75,21,84,160,9,227,152,78,59,33,38,70,0,214,88,140,109, - 81,171,86,24,170,15,17,70,138,93,59,118,16,87,34,230,230,103,249,204,103,238,100,105,97,137,55,189,233,117,100,166, - 207,252,252,28,89,102,9,130,18,201,32,215,203,11,48,182,136,127,86,74,209,79,123,8,61,16,205,14,56,64,98,96, - 134,239,189,39,203,50,242,44,3,231,232,245,82,164,10,112,192,232,200,24,198,58,242,60,3,4,129,214,236,125,248,49, - 214,174,159,224,242,203,183,35,101,177,206,199,65,158,165,92,121,219,109,60,181,115,251,164,219,247,204,118,9,147,33,156, - 121,166,224,115,126,75,175,191,167,16,20,87,46,206,133,46,2,208,11,117,190,239,37,124,109,39,33,63,4,103,34,120, - 102,93,183,119,110,36,10,70,71,118,236,164,147,245,176,174,143,237,59,172,140,73,236,60,86,122,84,73,97,179,14,183, - 223,176,153,159,253,123,155,137,84,10,229,6,169,108,98,41,225,228,24,186,60,73,88,153,192,137,6,157,174,225,247,255, - 224,83,204,205,45,115,242,216,97,254,249,79,255,191,28,58,116,152,251,239,123,136,230,72,147,153,153,51,68,113,68,146, - 88,164,8,145,42,230,240,225,83,44,183,114,218,157,30,149,106,153,82,57,194,59,79,158,231,8,37,145,66,226,133,160, - 214,168,179,116,182,93,180,92,131,217,207,138,53,170,49,6,231,28,222,23,45,89,24,6,24,239,56,122,226,24,75,75, - 75,108,88,191,145,141,27,55,161,117,33,205,16,194,35,68,192,87,239,188,135,233,233,73,214,172,25,193,56,131,24,24, - 240,215,26,13,162,87,93,85,93,220,247,204,244,16,140,151,32,88,15,185,184,120,123,95,4,160,151,250,249,249,29,91, - 191,181,86,73,10,122,189,132,67,199,78,174,38,156,246,6,239,160,1,127,125,23,62,75,145,111,254,67,133,33,226,177, - 181,130,179,99,237,206,142,153,209,80,215,74,17,129,170,16,170,18,105,234,24,31,242,44,247,115,172,208,228,181,30,83, - 163,107,8,114,205,222,199,78,145,5,150,141,107,107,132,13,141,170,70,104,175,200,243,148,74,217,48,180,174,70,179,17, - 240,129,15,126,17,242,148,7,30,188,143,61,151,95,205,210,167,238,164,159,229,180,147,121,42,165,33,182,111,221,77,167, - 187,196,114,107,137,71,31,125,156,115,231,218,68,113,25,17,44,34,148,69,135,33,185,183,164,105,138,146,18,235,29,185, - 177,168,32,192,121,139,214,154,44,203,96,80,25,173,176,161,87,0,41,183,14,235,115,132,23,204,204,207,34,148,164,90, - 171,50,210,28,37,12,61,198,88,148,22,156,57,59,207,222,189,143,243,174,119,223,142,183,14,63,16,211,134,129,100,250, - 150,87,169,153,223,252,192,240,48,212,13,4,107,249,139,229,24,23,207,69,0,122,73,156,31,187,255,179,223,210,223,47, - 151,75,220,119,223,94,110,185,245,157,171,159,251,238,65,217,254,216,96,142,176,226,126,250,87,121,71,94,81,197,183,33, - 13,133,56,27,59,78,78,119,251,189,195,46,173,135,185,32,119,125,124,45,192,235,128,106,125,152,225,177,6,97,92,129, - 60,195,233,46,198,78,112,223,125,207,240,197,131,135,185,100,119,137,218,80,7,212,12,167,207,156,36,77,186,236,216,178, - 129,127,243,255,253,4,27,55,77,49,50,220,96,100,104,156,123,238,185,143,137,137,105,208,37,130,40,166,89,213,156,63, - 187,72,107,185,195,249,185,89,188,128,135,30,121,4,80,236,218,185,147,165,86,225,96,152,231,22,131,35,75,115,178,52, - 37,203,83,180,214,224,41,204,200,212,115,96,99,173,69,74,185,218,142,57,239,87,171,35,231,138,225,250,201,211,167,233, - 245,82,46,191,116,15,235,214,173,71,107,61,168,162,44,173,78,191,176,154,5,148,84,32,37,198,231,108,189,226,82,230, - 154,181,154,91,108,55,83,40,125,165,136,150,126,65,206,27,47,62,54,23,1,232,249,58,85,251,173,237,58,132,117,148, - 221,215,79,8,110,43,230,55,84,129,255,10,156,31,252,186,207,115,62,65,249,55,1,72,10,120,24,76,15,102,180,243, - 135,174,108,47,207,124,117,126,182,174,70,214,160,93,68,63,237,35,101,128,86,101,210,110,70,156,27,226,72,112,170,53, - 71,223,247,152,152,108,32,207,72,74,19,163,76,111,220,76,175,103,57,112,114,14,239,20,79,63,123,134,179,231,186,172, - 157,30,167,94,21,132,186,196,194,210,89,30,122,244,49,78,159,63,199,184,24,98,98,106,140,36,57,195,236,220,89,42, - 149,33,54,109,222,204,179,7,247,243,192,131,247,48,221,29,193,121,69,210,179,40,209,199,88,135,49,22,155,27,112,48, - 212,24,98,126,113,97,80,233,72,130,32,36,203,50,164,44,92,25,165,112,40,165,177,174,168,140,242,60,71,41,85,152, - 232,75,197,242,242,34,243,139,11,76,79,175,41,116,109,58,196,139,136,32,136,17,74,129,43,190,142,160,240,179,30,25, - 109,34,170,149,42,139,237,241,16,42,103,64,156,42,162,164,47,2,208,69,0,122,233,158,11,227,90,254,90,0,228,253, - 159,250,26,43,70,100,43,118,15,45,224,43,3,16,42,81,48,117,71,41,72,111,127,225,215,6,198,192,183,97,209,10, - 177,127,93,150,31,158,154,111,109,156,31,153,10,162,40,34,176,142,146,6,157,27,50,81,168,219,51,23,112,248,196,34, - 39,103,151,216,176,105,8,189,183,69,127,169,11,137,35,150,130,169,225,33,150,206,157,102,235,230,38,190,127,156,114,216, - 163,81,83,216,20,186,189,20,227,44,141,161,26,179,179,51,132,90,18,137,152,245,235,54,80,169,85,185,246,186,203,121, - 226,233,251,184,251,222,47,241,244,211,251,208,170,138,223,185,7,173,53,173,238,50,198,24,194,64,67,110,169,150,203,68, - 113,140,77,0,239,17,12,236,95,61,197,38,204,250,34,169,195,129,212,98,144,146,225,177,206,98,93,138,22,154,118,167, - 77,146,37,4,161,64,168,16,188,98,121,185,75,158,231,32,36,14,129,146,10,165,4,214,89,150,189,11,37,212,98,8, - 143,131,248,217,23,104,118,252,211,23,31,155,191,124,52,113,241,37,120,233,28,65,161,77,154,0,190,8,28,5,182,3, - 123,254,146,143,75,129,203,129,0,223,75,225,217,80,240,192,119,47,47,28,12,14,62,109,246,31,57,202,242,226,18,42, - 112,136,114,142,174,26,116,41,64,135,101,156,141,57,188,255,8,219,71,21,35,21,201,98,199,18,148,170,148,43,37,74, - 33,216,108,129,157,219,198,56,115,232,46,204,242,51,76,52,43,56,159,163,180,160,181,180,204,200,200,16,185,201,72,186, - 125,230,231,150,144,42,100,211,166,9,46,191,98,51,165,82,132,146,101,112,33,206,164,180,58,139,228,89,142,201,114,242, - 44,39,75,51,140,117,40,169,16,222,83,45,151,169,213,106,68,97,56,112,201,231,185,132,14,60,90,235,194,255,200,217, - 255,191,189,55,15,146,44,59,175,251,126,247,222,183,230,90,123,117,109,221,93,189,47,211,131,30,204,210,192,12,177,11, - 6,33,130,32,77,82,166,68,195,33,129,4,69,74,54,35,108,81,98,72,38,195,132,21,150,195,225,176,197,144,130,52, - 29,148,40,155,146,76,64,65,90,129,85,32,9,96,176,204,0,179,47,61,189,77,239,93,189,212,94,149,149,251,91,238, - 226,63,94,246,0,8,1,3,96,134,164,12,76,158,142,138,138,232,204,172,170,124,121,227,188,239,126,247,59,231,96,116, - 94,52,166,17,4,65,136,117,133,43,163,31,4,164,73,74,110,50,150,110,221,228,206,242,90,17,43,141,195,106,7,86, - 160,173,163,107,139,248,69,59,176,224,31,98,72,64,67,124,155,202,104,21,248,220,160,89,125,237,123,32,175,147,14,61, - 226,220,45,141,248,242,209,180,251,213,191,209,106,172,244,182,26,92,190,241,50,23,206,93,228,230,237,37,122,237,109,186, - 93,135,113,154,209,160,196,75,55,218,4,85,159,233,168,205,230,214,38,205,78,147,64,132,4,50,166,229,199,252,238,191, - 127,130,243,151,215,153,240,50,38,188,30,41,45,140,77,8,114,159,74,28,144,226,104,247,52,123,22,231,216,119,116,47, - 111,121,248,1,68,232,168,213,107,56,87,70,250,1,202,47,230,122,250,253,4,147,107,116,154,99,181,195,104,71,41,46, - 19,123,62,229,40,24,156,98,57,130,208,7,97,113,194,96,156,6,225,6,22,172,134,220,228,32,239,58,56,10,148,10, - 25,169,141,81,10,107,24,93,228,153,42,101,200,18,205,210,213,6,74,21,75,92,72,176,100,32,60,66,43,173,43,10, - 75,163,192,149,138,10,242,207,253,107,136,225,22,236,7,186,26,130,194,80,231,171,20,230,245,63,69,113,90,230,190,195, - 157,35,7,222,3,157,147,206,157,239,195,243,7,123,189,147,123,43,229,217,139,8,181,186,177,196,78,179,196,214,102,13, - 188,6,50,72,169,170,58,47,118,251,236,252,181,26,7,22,119,113,231,220,26,221,213,179,116,243,189,140,149,170,148,168, - 48,58,162,8,186,91,160,199,136,199,171,44,63,187,66,185,84,97,125,189,69,73,167,28,61,124,136,249,137,69,14,44, - 78,115,234,129,123,168,213,203,128,102,110,102,2,103,18,162,168,134,114,146,70,99,27,207,11,200,146,12,173,13,189,94, - 15,99,13,158,39,208,218,160,133,37,203,50,58,157,14,8,129,49,166,120,159,178,120,167,58,207,64,184,194,138,213,57, - 36,130,114,185,202,194,204,28,81,24,98,157,197,243,36,82,21,179,205,58,55,220,185,179,140,179,135,94,73,251,80,190, - 162,219,92,102,188,215,105,1,155,29,232,253,44,184,15,51,156,102,30,18,208,16,175,250,33,245,129,255,7,120,43,69, - 148,204,93,147,172,111,70,27,120,59,184,16,58,73,161,60,111,151,132,176,66,250,202,137,30,185,145,180,58,61,172,200, - 208,46,99,211,180,184,157,106,254,241,239,126,145,191,245,254,123,120,231,67,251,161,26,3,77,164,55,193,187,222,249,1, - 22,230,15,50,165,110,178,185,125,145,140,132,67,71,70,153,156,156,68,246,124,42,163,37,198,103,107,236,158,154,224,212, - 91,78,48,49,81,198,217,14,66,195,7,127,252,199,248,228,39,30,229,169,167,159,38,10,2,218,237,22,213,106,141,36, - 73,73,211,140,36,73,16,82,48,57,53,73,84,46,115,103,229,14,150,98,230,199,1,158,231,21,122,48,99,94,177,232, - 16,131,198,51,22,172,113,4,129,79,92,42,84,243,206,26,114,173,145,158,135,64,160,148,160,209,216,38,77,19,124,79, - 96,172,66,18,211,90,90,33,110,117,219,2,182,29,244,119,81,56,30,14,49,36,160,33,190,7,252,52,240,19,192,19, - 131,187,118,192,183,118,80,13,176,14,166,94,88,143,54,234,190,49,70,91,223,19,49,198,129,181,109,180,177,56,23,163, - 2,139,245,53,159,124,244,44,207,188,120,139,221,187,103,56,116,120,140,67,11,83,212,107,109,234,11,33,75,91,207,179, - 122,227,50,89,175,203,242,102,204,244,244,4,181,186,207,248,220,12,165,114,141,217,189,99,220,127,114,150,209,233,58,56, - 9,248,160,51,198,167,39,248,231,255,236,127,229,23,126,254,111,115,249,234,18,189,44,101,187,181,131,29,196,237,36,3, - 151,198,173,157,109,148,231,35,165,194,225,80,210,67,155,98,0,209,31,52,156,139,237,150,43,236,98,1,207,11,144,158, - 164,86,174,18,120,10,37,7,30,214,131,92,69,229,43,132,146,8,225,13,46,142,68,160,145,100,172,222,106,210,3,95, - 64,41,6,191,199,95,156,197,198,232,112,185,14,9,232,135,13,201,96,91,246,78,224,89,96,135,226,196,204,251,166,173, - 89,9,180,131,237,0,54,102,250,173,190,243,227,200,90,129,24,244,85,144,10,103,2,140,235,33,124,31,75,153,91,89, - 206,202,173,45,158,91,234,17,184,171,40,207,65,52,69,165,62,198,226,158,89,142,239,153,39,40,69,108,53,183,88,223, - 218,225,186,189,138,146,17,60,99,248,220,103,29,229,72,49,59,63,203,190,125,139,28,61,122,15,179,51,33,187,15,44, - 242,214,71,30,230,220,203,87,144,73,194,198,214,6,113,24,147,244,19,250,253,62,97,28,209,207,18,154,173,22,210,83, - 131,137,103,129,211,69,211,217,57,135,26,76,71,91,7,74,250,72,36,129,23,18,135,33,161,31,130,83,148,203,37,162, - 56,194,104,135,31,201,98,230,40,213,196,113,140,231,21,77,109,15,9,120,172,145,114,14,198,143,195,180,134,242,93,253, - 214,144,128,134,4,52,196,247,8,67,161,196,126,25,248,53,160,1,108,125,211,227,191,10,246,175,67,223,65,183,158,219, - 76,6,2,161,114,156,17,88,235,33,132,69,73,141,209,6,163,66,156,144,248,57,196,158,163,54,82,161,82,153,97,98, - 215,36,181,177,17,42,21,71,111,167,207,185,11,231,89,93,91,102,179,177,77,179,185,137,116,22,233,43,178,212,130,246, - 17,46,39,174,88,164,231,51,90,155,224,239,254,242,207,243,139,31,249,48,207,61,253,44,22,104,118,90,196,186,68,191, - 215,199,58,135,167,20,221,126,151,92,107,242,60,47,234,27,103,177,182,168,114,140,49,4,65,128,239,251,197,228,52,69, - 142,189,51,130,122,165,198,216,232,24,66,72,74,229,50,81,185,130,148,30,65,24,19,134,1,202,43,198,30,234,245,42, - 158,95,2,231,112,169,98,237,218,10,127,242,249,47,176,0,210,129,151,22,38,144,194,127,229,220,109,136,33,1,13,241, - 61,33,7,222,11,60,10,252,51,96,134,98,34,186,15,28,43,66,119,50,5,189,58,46,19,206,33,132,1,225,144,162, - 140,19,41,214,36,40,1,206,106,164,176,164,38,71,152,18,19,81,133,242,72,68,63,111,177,115,169,69,171,113,135,78, - 163,73,39,181,164,182,143,39,3,112,17,34,16,120,65,113,196,45,194,24,79,122,8,149,224,16,172,110,36,116,58,154, - 151,47,92,228,244,75,103,200,45,228,198,224,229,26,231,123,36,73,31,41,69,17,52,168,53,89,94,76,58,69,81,132, - 49,26,41,213,43,83,208,214,218,34,185,213,82,16,82,224,227,73,15,171,161,82,45,17,132,33,97,28,33,253,0,49, - 232,138,9,225,136,162,144,99,199,143,131,133,139,231,175,114,250,249,179,156,127,249,44,243,147,7,153,226,139,29,96,51, - 130,238,24,184,128,161,136,116,72,64,67,188,38,56,138,38,234,223,1,62,62,40,251,19,32,130,158,7,235,39,181,219, - 156,205,211,217,155,24,229,91,64,152,65,12,188,68,8,131,20,26,235,4,82,56,66,149,147,52,239,208,182,101,178,92, - 225,76,137,82,181,74,125,122,138,78,71,226,59,77,57,14,112,78,17,198,49,35,99,163,148,226,16,63,18,84,226,49, - 38,198,166,200,109,70,189,50,202,47,254,194,127,193,191,253,131,255,131,237,198,54,65,101,12,144,228,90,19,197,33,214, - 26,180,30,68,66,15,100,22,206,21,249,207,190,31,144,164,41,97,24,17,69,33,58,215,69,106,171,18,4,65,64,41, - 42,225,6,178,140,60,211,4,126,81,37,1,120,126,64,181,90,193,138,132,82,20,209,106,237,240,135,31,251,18,215,175, - 44,225,203,136,95,252,165,95,224,137,175,127,157,165,223,163,237,96,93,65,183,207,95,156,187,225,196,112,121,14,9,232, - 141,64,64,119,19,50,182,128,83,192,20,112,186,24,31,218,30,15,131,246,131,165,48,189,209,77,74,86,170,162,242,81, - 69,195,215,90,240,60,31,79,80,104,165,140,132,176,140,8,170,76,78,140,16,71,49,129,31,82,42,151,145,162,208,89, - 5,161,162,94,169,50,179,107,134,137,137,73,28,14,39,13,158,240,80,8,226,146,224,145,135,239,71,216,46,173,110,78, - 92,25,33,51,133,61,172,181,57,73,226,80,170,176,227,112,20,138,119,156,35,80,30,105,47,65,248,30,126,20,227,71, - 49,206,8,20,130,114,88,34,183,57,185,179,36,58,167,28,151,145,30,72,233,104,55,155,148,226,152,82,165,130,51,57, - 59,141,62,78,100,228,229,140,79,253,135,79,83,138,75,188,253,221,239,226,161,83,135,9,227,18,238,209,62,1,100,18, - 82,13,230,189,124,247,25,171,215,243,217,12,49,36,160,55,84,37,180,14,236,20,125,213,178,47,68,252,114,158,151,190, - 214,151,37,127,208,233,16,66,97,140,123,197,248,235,174,221,133,4,130,80,224,156,161,92,41,225,123,146,40,10,8,131, - 128,192,87,72,169,136,162,144,74,165,68,224,251,197,105,150,148,120,74,18,68,49,161,10,169,87,75,28,62,62,77,37, - 86,124,229,203,79,178,111,225,94,222,254,240,187,121,244,241,79,225,251,1,86,23,106,119,165,84,49,84,168,53,82,74, - 164,82,228,70,227,121,62,115,51,211,136,129,126,203,24,131,53,134,192,15,232,38,224,140,38,12,67,170,213,26,213,82, - 137,145,250,40,56,208,58,71,98,73,91,77,16,29,250,253,62,219,166,207,187,223,243,54,62,240,193,247,49,58,85,197, - 101,109,176,134,104,106,156,185,169,41,161,215,215,221,247,18,203,51,196,144,128,222,208,149,141,25,124,72,187,40,74,154, - 18,223,26,21,156,2,71,65,156,7,239,33,8,182,161,156,20,102,91,71,34,231,30,74,60,127,98,203,6,56,12,190, - 39,9,195,136,110,183,251,138,202,28,4,214,22,19,200,89,146,208,100,7,33,4,181,106,141,44,203,25,31,31,35,46, - 197,72,225,176,78,179,211,106,80,142,74,4,126,128,53,154,137,169,41,132,130,169,201,136,131,251,22,200,82,201,179,79, - 159,69,103,57,247,221,119,148,185,133,159,231,133,211,143,227,132,36,85,26,1,36,73,242,202,239,191,75,132,206,83,164, - 24,86,183,214,241,157,0,235,240,252,16,148,96,164,28,226,17,146,181,13,58,213,244,58,29,226,32,160,213,106,146,166, - 41,165,94,137,76,103,88,44,113,24,80,45,141,16,71,117,118,205,206,50,58,91,67,247,183,49,82,32,156,34,8,66, - 162,169,113,225,214,215,69,34,165,192,14,71,16,135,4,52,68,209,60,29,144,75,31,216,11,140,23,167,234,126,8,234, - 223,12,134,159,75,224,54,192,104,208,17,216,117,80,83,66,212,183,157,219,19,192,108,9,102,29,28,234,195,177,203,176, - 248,25,231,38,115,44,146,162,250,81,74,49,49,49,65,154,166,228,121,142,181,208,235,246,72,242,12,223,243,200,179,46, - 253,110,74,171,212,33,10,183,185,117,243,22,190,239,227,251,62,113,92,98,116,108,132,133,185,57,234,181,58,155,91,107, - 204,206,142,112,248,224,62,230,231,75,52,183,55,184,118,169,199,72,117,146,227,199,15,82,29,243,216,189,56,202,169,251, - 30,225,107,79,63,131,31,22,39,89,189,94,239,149,247,92,88,108,0,72,20,2,157,102,120,126,0,14,242,44,67,42, - 133,116,146,241,145,17,118,207,237,197,89,139,201,52,82,120,40,165,216,181,107,154,241,137,9,132,242,176,194,81,41,133, - 72,25,163,115,88,222,218,192,184,62,218,43,92,151,60,167,88,156,159,231,214,160,240,169,84,171,194,53,155,195,133,55, - 36,160,97,181,3,133,26,126,180,56,30,142,238,133,154,129,81,11,147,41,212,227,193,103,101,192,106,232,118,97,219,66, - 170,160,228,57,119,208,194,67,43,112,20,41,199,111,213,170,187,26,39,79,142,239,126,251,59,188,195,205,166,252,242,239, - 253,139,65,165,99,233,118,187,56,231,136,227,152,169,169,105,70,71,198,169,86,43,180,90,109,182,54,55,201,210,28,165, - 36,198,88,38,38,38,25,31,31,71,8,193,216,232,56,165,82,137,145,209,58,66,8,210,44,195,152,140,118,103,155,61, - 123,223,74,175,189,77,210,117,28,62,186,64,165,86,193,201,140,92,167,148,234,227,156,58,245,16,143,62,246,85,124,79, - 210,75,122,56,91,88,108,216,111,138,98,86,8,164,149,248,161,95,24,145,57,135,181,14,207,8,154,107,155,244,194,62, - 211,115,62,115,51,187,144,82,226,43,69,16,248,148,43,101,164,82,224,64,105,200,123,25,81,92,194,23,10,229,2,164, - 243,9,188,24,145,129,240,4,183,175,95,38,105,236,184,0,108,144,36,246,16,223,16,1,15,49,36,160,55,20,238,78, - 50,123,192,75,224,111,195,136,15,115,33,44,90,88,20,176,96,96,174,11,99,41,120,10,80,96,21,180,125,216,12,5, - 105,28,69,229,164,159,204,239,204,206,28,204,254,171,159,155,147,11,123,228,76,125,130,189,229,50,89,175,203,187,75,49, - 31,255,216,199,217,222,217,65,74,133,49,150,110,183,83,184,4,58,75,158,231,248,254,60,167,30,58,69,165,92,45,44, - 44,40,230,112,188,193,132,178,214,26,157,21,196,36,164,194,247,124,114,33,209,54,225,220,185,11,28,63,190,159,131,139, - 123,153,158,142,192,43,38,108,180,201,10,159,103,107,185,255,161,147,148,75,1,137,205,209,90,23,91,75,99,64,12,200, - 71,41,180,115,168,200,43,172,93,179,194,55,8,41,200,76,142,31,68,196,165,128,208,247,233,247,250,196,97,132,147,10, - 223,47,114,226,115,173,9,130,8,63,10,81,190,135,23,23,199,249,189,180,79,175,101,72,147,46,43,55,110,112,231,153, - 103,89,253,253,63,104,237,190,179,114,221,192,182,78,83,253,171,195,101,56,36,160,55,114,229,51,11,226,131,80,217,130, - 61,62,220,39,225,254,46,28,219,169,148,23,178,67,123,199,163,251,78,148,107,71,78,4,37,63,166,84,46,145,246,58, - 180,87,238,216,213,149,101,221,104,181,92,98,80,87,111,222,82,135,222,247,62,239,248,219,222,33,150,87,183,105,111,236, - 208,189,122,19,155,167,228,121,70,28,149,193,53,6,149,5,24,171,139,74,8,65,224,71,92,191,126,157,213,149,85,14, - 29,60,196,209,163,71,41,87,202,164,105,97,155,161,117,142,231,121,248,129,196,247,138,35,115,132,67,121,1,121,98,232, - 39,9,207,60,119,150,253,123,23,8,60,176,178,136,242,81,158,194,232,156,76,119,57,118,124,15,19,83,35,92,188,118, - 3,103,45,131,248,46,148,87,84,65,74,41,100,16,98,125,15,145,101,28,83,158,59,172,84,190,183,84,182,143,26,237, - 223,240,148,10,203,17,74,74,60,169,16,82,14,12,235,65,121,1,129,167,240,124,69,169,82,65,202,0,47,240,137,3, - 159,180,159,240,167,159,254,18,219,43,55,104,127,245,139,122,241,241,39,239,236,109,182,159,5,254,204,193,21,32,29,97, - 120,90,53,36,160,55,68,185,227,8,162,144,221,129,79,158,229,76,2,199,65,25,152,84,112,111,0,111,111,194,195,75, - 243,147,71,43,63,243,51,19,199,62,248,99,222,222,147,135,9,203,21,154,205,14,237,141,6,59,155,29,182,219,93,58, - 51,123,81,38,15,246,197,37,158,126,242,41,174,108,231,196,205,62,222,197,139,120,94,21,163,193,58,133,242,3,74,149, - 18,83,227,19,220,188,121,3,161,36,32,145,72,148,80,69,206,86,210,197,26,135,53,134,75,151,47,210,238,180,216,189, - 123,55,51,51,51,175,24,201,131,64,9,137,177,57,18,133,117,96,140,35,240,67,242,76,115,229,210,45,110,222,92,230, - 208,225,5,64,224,164,196,57,81,168,218,173,101,116,162,194,193,67,123,57,127,249,26,129,167,200,180,198,9,65,113,16, - 47,113,210,99,26,120,176,215,79,222,150,235,205,195,206,173,214,178,180,17,109,111,143,236,175,215,247,255,47,229,242,88, - 224,251,228,14,82,163,137,131,10,202,247,17,74,81,169,214,112,56,2,79,17,74,69,88,170,224,132,38,105,174,177,249, - 242,6,249,205,149,124,242,210,153,237,61,27,203,87,74,198,60,101,225,177,28,94,168,192,74,2,230,129,225,202,28,18, - 208,27,130,127,146,132,99,15,156,100,233,63,123,23,55,63,243,103,92,6,21,192,116,14,143,4,240,254,51,146,71,58, - 31,120,239,222,247,127,244,127,8,14,221,123,47,141,173,45,46,157,187,204,213,203,55,105,108,247,72,181,33,213,144,234, - 62,89,102,168,84,66,46,95,188,204,167,62,249,71,244,186,9,187,23,231,241,164,34,112,32,68,76,238,43,82,154,8, - 153,48,59,51,70,240,66,128,243,4,185,51,4,25,72,2,82,211,39,239,25,98,47,194,218,20,227,52,102,217,176,181, - 189,77,179,217,100,110,110,142,122,189,142,239,251,72,63,196,106,31,163,53,224,240,132,197,104,141,211,150,220,120,156,63, - 127,135,253,7,23,17,50,47,230,145,133,4,5,78,88,188,48,228,240,225,227,216,79,125,1,35,61,82,37,177,18,170, - 6,142,89,97,223,150,233,230,3,253,254,157,133,60,187,162,224,98,238,220,149,20,26,26,246,239,233,245,126,236,17,193, - 67,87,54,55,162,242,174,24,105,37,189,230,54,196,49,165,145,81,68,183,139,236,103,208,107,131,238,89,215,221,209,213, - 205,181,254,194,214,102,123,180,211,109,84,90,173,59,10,46,89,56,173,225,180,129,107,93,104,229,96,134,42,248,33,1, - 253,224,117,138,95,243,235,29,202,247,249,92,24,112,95,241,63,117,3,15,89,248,169,143,73,222,51,246,119,126,105,242, - 239,255,227,223,164,219,94,231,11,159,253,20,55,110,238,208,110,129,192,129,44,178,176,76,174,89,95,95,35,138,74,108, - 110,44,243,248,227,143,209,235,167,56,41,217,105,117,200,115,69,224,28,34,239,80,246,60,2,127,140,52,239,179,231,224, - 49,68,240,53,210,212,224,2,129,81,6,231,122,88,13,89,174,49,174,77,20,248,104,13,89,154,211,15,19,148,148,180, - 90,45,198,199,199,25,31,31,167,62,50,74,28,151,17,66,160,117,142,186,187,205,234,91,148,15,75,55,111,209,108,118, - 168,215,67,44,22,196,55,196,165,8,193,201,55,221,67,232,41,166,149,112,187,16,118,183,148,233,35,90,111,28,205,147, - 235,37,99,46,230,112,33,131,139,22,150,20,108,196,144,165,112,201,215,58,255,112,171,125,167,215,237,207,245,183,215,199, - 76,24,134,185,16,194,58,135,148,210,73,132,8,172,37,74,211,60,72,211,166,103,244,154,7,235,2,86,44,172,89,184, - 237,224,102,14,203,211,176,179,1,217,39,128,95,228,91,199,25,134,24,18,208,255,175,33,74,175,207,182,92,4,62,171, - 183,111,243,123,79,61,207,63,128,192,135,125,62,188,235,179,240,246,234,223,251,149,201,127,240,27,191,202,141,171,215,248, - 202,87,94,164,223,55,40,95,96,85,134,115,18,97,171,24,151,147,230,109,234,213,10,198,88,46,156,63,67,171,221,64, - 170,8,139,230,250,205,37,238,187,255,17,212,104,153,40,48,4,34,197,237,180,8,101,64,109,126,150,127,244,143,254,59, - 158,121,254,12,159,250,211,79,225,2,1,58,71,80,38,10,21,34,75,200,50,131,211,125,4,105,97,16,102,52,173,86, - 139,157,157,29,58,157,14,225,218,26,181,106,157,90,181,74,185,92,70,122,10,43,0,89,184,43,110,108,111,177,190,182, - 201,216,216,158,226,116,203,13,196,163,88,208,154,197,253,251,248,201,35,135,242,159,184,177,212,155,108,119,151,125,99,206, - 225,220,121,13,47,167,112,217,192,114,79,136,102,197,247,147,11,158,111,30,74,250,108,88,123,117,196,185,158,112,238,217, - 178,205,166,43,121,54,37,122,189,210,160,133,228,238,222,23,92,209,208,207,5,108,3,171,6,182,51,104,4,208,201,161, - 215,133,254,4,216,125,224,250,3,226,17,195,222,207,144,128,126,160,8,40,42,189,190,31,32,235,4,255,242,119,249,123, - 183,151,69,6,19,62,220,127,11,30,156,248,200,223,156,254,165,223,252,135,60,245,245,103,121,233,165,203,116,123,25,16, - 162,240,16,50,68,231,25,142,46,97,232,97,173,67,9,201,157,59,183,232,118,59,100,38,67,170,0,33,12,155,55,175, - 163,154,219,16,180,192,53,168,69,41,39,142,204,51,191,231,0,99,115,135,136,199,39,105,172,174,242,147,63,185,204,51, - 103,95,194,151,96,16,56,151,83,169,84,49,214,145,155,188,232,7,89,203,206,206,78,49,115,99,12,198,24,194,32,228, - 70,118,3,107,45,227,227,227,76,79,79,179,123,247,110,194,40,34,205,50,250,73,206,202,234,38,135,143,238,25,76,88, - 187,66,115,38,36,96,217,53,62,198,125,202,211,83,141,237,29,7,143,167,240,105,13,23,34,216,172,67,247,113,200,43, - 74,33,222,249,30,236,252,110,158,250,250,99,212,94,62,223,115,112,195,193,173,42,132,14,162,154,84,190,21,66,8,163, - 95,225,15,1,244,193,88,72,51,72,98,208,135,193,252,11,112,15,243,141,184,35,201,55,38,159,135,228,51,36,160,31, - 44,200,215,227,242,235,179,178,118,147,223,252,151,255,154,143,64,148,192,225,28,30,217,60,116,226,224,207,253,198,175,169, - 39,190,246,36,79,62,113,13,99,115,60,15,132,208,88,171,112,70,32,148,68,121,61,44,22,129,160,219,233,210,106,183, - 104,236,52,0,131,167,124,156,235,48,26,231,132,233,69,222,60,57,202,190,153,128,241,218,24,206,131,157,214,13,46,175, - 53,104,232,29,30,126,211,65,254,218,143,190,135,231,94,58,143,47,125,172,211,72,207,32,125,159,192,243,169,40,0,73, - 224,135,180,90,173,87,44,82,181,214,68,81,52,240,232,129,181,181,53,54,54,54,72,210,148,137,201,73,162,40,6,33, - 88,91,109,96,173,3,103,80,210,199,57,112,206,98,141,198,143,61,250,187,38,252,68,200,173,192,217,23,36,60,51,15, - 107,255,70,74,247,246,19,111,102,227,194,75,200,44,163,49,62,65,82,171,211,154,156,98,230,229,243,220,4,115,13,204, - 135,32,107,67,251,183,172,161,193,55,220,32,7,213,15,191,9,116,129,167,129,69,224,71,128,165,193,247,97,94,251,144, - 128,126,240,241,75,31,121,29,87,217,99,102,117,157,95,185,179,194,29,24,173,194,61,107,130,19,39,63,250,235,99,171, - 235,91,156,63,123,155,94,218,163,20,71,248,170,168,180,172,203,208,166,141,18,10,167,61,228,192,21,48,73,50,218,221, - 30,105,102,200,116,70,73,194,104,181,198,63,252,200,125,188,247,68,149,216,211,108,172,246,249,202,217,62,59,193,4,170, - 94,193,90,203,243,47,60,198,98,188,195,91,222,188,143,145,145,17,250,205,62,82,21,199,234,89,174,169,214,106,72,9, - 158,244,81,202,43,60,155,141,161,84,46,83,169,86,201,178,194,203,89,12,254,85,171,85,60,63,32,207,53,206,245,9, - 188,136,173,237,54,105,146,17,132,114,64,62,174,16,171,90,240,163,0,87,45,75,131,107,201,162,55,211,254,223,193,157, - 149,146,131,135,142,32,174,188,12,89,134,52,6,97,12,106,144,29,47,191,169,202,113,20,105,33,235,223,230,18,255,253, - 193,115,135,194,138,33,1,253,112,226,247,254,245,235,122,121,90,220,161,131,16,22,82,184,71,189,255,253,187,71,238,63, - 36,31,251,15,143,210,235,121,120,94,136,39,61,28,26,156,5,103,17,214,67,103,96,156,198,247,36,78,56,180,161,232, - 215,72,69,20,251,216,118,198,252,212,40,15,28,153,227,230,245,13,158,191,154,144,149,246,50,119,244,65,14,223,115,148, - 201,93,19,40,4,43,43,151,184,126,229,22,15,190,243,4,123,15,236,225,236,51,103,65,130,176,30,54,203,6,166,96, - 150,192,131,206,118,131,44,203,16,66,20,67,130,90,227,28,248,97,80,36,150,122,133,29,71,165,82,193,247,124,156,133, - 208,143,104,182,123,36,105,70,169,84,193,9,133,47,60,172,21,24,157,162,100,64,85,6,22,231,114,1,89,2,246,143, - 40,28,29,255,122,145,4,246,231,178,45,26,138,75,135,4,244,67,137,207,190,206,215,59,160,4,245,16,142,174,195,137, - 221,63,255,145,145,243,23,174,176,182,182,142,241,71,16,66,33,149,162,82,138,241,148,44,242,175,140,64,27,75,175,155, - 146,154,46,73,218,167,221,237,98,17,56,1,163,99,227,32,2,116,154,16,171,132,229,118,74,26,31,225,3,127,243,151, - 153,152,170,145,247,91,172,173,109,114,230,250,50,141,164,204,198,250,50,129,159,115,242,205,39,120,230,241,39,9,85,5, - 157,75,172,72,104,54,27,4,65,72,71,119,208,218,226,73,133,239,251,84,42,85,148,146,148,203,17,189,94,15,207,243, - 8,195,152,153,153,57,42,229,10,121,166,65,129,182,119,27,207,170,16,183,74,139,115,2,41,68,161,118,247,21,42,146, - 78,64,238,64,43,112,31,2,82,99,153,121,246,73,110,165,9,211,98,72,31,67,2,26,226,219,226,208,235,40,239,5, - 144,129,216,134,154,133,197,246,145,195,123,153,159,147,207,127,246,243,100,198,225,185,14,190,95,71,201,136,114,80,101,106, - 87,141,133,221,147,84,106,33,89,63,163,185,222,226,233,211,231,232,119,83,180,211,168,80,129,113,84,188,93,152,216,177, - 222,91,166,35,160,62,86,97,178,60,143,114,25,79,61,253,12,91,43,13,178,84,210,74,250,84,203,147,92,93,185,68, - 111,189,203,123,31,184,151,127,229,123,224,4,78,40,180,215,67,153,14,42,23,244,122,61,130,32,68,72,69,181,90,29, - 28,187,27,164,204,240,60,143,192,47,51,55,187,155,122,173,74,150,247,7,114,10,31,129,193,23,6,231,2,140,5,165, - 114,44,2,105,65,24,131,72,19,166,186,253,60,42,52,108,205,25,48,255,19,69,143,40,185,126,153,7,128,138,148,124, - 42,8,96,72,68,67,2,26,226,91,209,150,30,145,213,175,137,132,4,133,133,170,145,66,9,235,194,185,201,73,121,249, - 226,101,218,237,30,113,20,160,164,135,179,41,190,215,231,192,161,69,142,31,219,207,200,120,25,235,108,145,242,112,104,158, - 202,68,137,63,250,227,47,83,142,74,96,53,213,74,181,176,39,45,89,214,150,187,108,54,20,123,38,234,92,249,234,139, - 180,31,155,165,39,186,132,186,77,144,135,104,171,241,71,3,150,238,40,206,45,189,192,209,153,58,227,19,85,150,119,114, - 202,153,198,225,145,43,3,54,37,8,2,106,181,26,97,24,99,140,193,247,139,192,192,66,51,22,16,199,49,99,99,99, - 120,158,79,174,19,242,92,35,16,228,66,17,87,71,40,197,37,148,76,144,194,34,40,60,125,208,22,157,58,242,141,173, - 84,194,70,10,59,189,66,209,143,30,92,159,10,69,21,53,255,212,19,44,191,239,175,146,6,193,240,164,106,72,64,67, - 220,197,71,103,142,243,179,27,151,25,207,122,175,105,128,45,7,234,8,36,14,175,211,211,87,94,190,140,242,60,156,53, - 88,28,81,232,113,207,241,67,156,122,232,40,82,229,8,50,24,52,114,51,221,231,240,161,93,28,59,184,200,234,202,50, - 165,56,160,94,171,162,148,32,247,12,73,174,185,178,180,197,131,239,62,73,125,116,25,151,165,140,150,43,180,123,29,124, - 153,178,103,102,140,23,47,95,66,101,227,184,102,29,229,239,112,96,62,230,246,198,38,130,26,46,47,99,92,15,200,145, - 210,209,233,116,169,84,106,232,220,144,231,57,165,82,209,24,15,195,136,133,133,57,170,213,50,89,150,98,29,88,235,8, - 67,137,231,251,76,78,77,17,4,62,66,244,193,89,156,182,197,73,158,12,57,119,254,69,154,171,171,122,15,244,203,144, - 254,54,216,63,248,118,100,125,229,18,251,148,226,64,171,201,189,195,101,55,36,160,33,6,8,74,188,48,58,207,149,181, - 75,223,119,163,51,5,126,6,152,118,206,51,16,172,151,170,126,203,130,176,22,169,20,2,69,28,150,89,92,88,196,147, - 138,60,239,35,144,40,21,35,164,35,211,41,130,156,131,251,23,248,202,87,193,87,18,223,243,208,38,35,55,61,146,212, - 240,153,39,110,241,115,63,254,22,222,245,224,28,143,95,110,211,82,146,204,102,216,238,37,222,250,222,15,178,123,254,24, - 51,174,71,232,174,225,162,113,142,239,61,193,19,79,223,194,85,115,112,10,165,21,8,131,82,138,56,138,209,185,70,8, - 73,28,199,4,65,64,28,151,168,86,107,212,106,181,65,83,218,97,140,197,243,124,162,40,70,231,25,83,211,35,8,101, - 192,88,76,63,3,17,129,11,56,123,238,34,127,252,241,63,230,100,179,149,0,125,3,250,167,129,3,128,255,31,53,203, - 28,189,151,207,51,201,127,156,121,54,196,144,128,222,176,240,157,229,98,105,148,207,188,198,215,63,2,226,158,194,178,198, - 107,132,161,159,106,13,121,70,218,207,81,194,35,80,62,206,88,176,14,233,192,100,6,252,194,172,171,72,123,176,108,53, - 54,177,54,71,56,65,154,100,180,123,13,182,183,54,8,163,18,207,157,89,225,242,218,14,71,78,236,99,185,213,97,114, - 143,100,241,222,119,176,122,166,194,242,165,47,242,230,135,238,33,223,184,205,234,166,225,143,255,244,28,159,127,236,121,202, - 126,133,220,119,8,145,160,80,4,65,9,223,247,9,163,176,120,207,190,55,248,30,16,69,37,198,199,39,8,163,0,173, - 53,214,25,148,44,30,215,58,103,98,178,198,225,67,243,96,179,226,125,8,159,44,151,156,62,125,142,47,125,245,113,242, - 181,6,211,189,254,182,133,13,160,87,5,222,253,29,8,70,80,184,63,150,135,203,110,72,64,67,20,208,206,176,55,30, - 99,79,101,130,165,206,230,247,253,122,67,49,16,103,64,110,6,177,111,173,5,147,145,166,9,158,12,105,119,119,184,185, - 124,131,197,197,147,56,99,16,202,2,41,166,216,231,208,234,102,188,248,210,121,12,154,94,191,152,201,105,181,154,228,185, - 197,154,156,181,141,156,63,250,183,79,242,235,127,171,205,59,102,203,4,113,139,252,230,13,246,250,9,155,145,229,147,159, - 252,18,95,127,106,155,11,75,61,158,56,127,150,70,99,135,48,10,144,89,140,144,2,233,65,24,132,32,10,151,194,32, - 14,176,214,81,42,69,212,235,35,76,78,78,83,173,86,48,38,35,203,82,130,32,66,160,240,124,31,107,53,7,22,23, - 152,26,175,14,124,131,34,214,55,119,120,241,197,23,120,252,107,95,39,40,133,252,149,83,15,57,62,247,39,77,7,155, - 10,146,79,83,196,75,203,87,185,102,18,24,3,194,225,242,27,18,208,27,29,119,239,212,247,141,237,125,77,4,212,150, - 66,72,207,19,46,203,197,213,141,77,185,92,190,78,144,118,209,14,202,229,49,114,157,240,252,139,167,57,126,104,31,147, - 99,37,12,125,4,6,97,4,206,40,190,254,245,115,92,190,118,131,219,43,183,105,52,91,108,109,55,232,180,91,8,2, - 156,53,136,32,231,183,63,251,20,126,205,240,142,251,247,145,52,250,60,250,244,10,103,111,238,32,130,58,126,181,66,101, - 98,23,227,251,29,51,59,107,52,90,25,125,155,225,153,140,216,31,108,245,242,140,177,209,113,2,63,196,31,196,221,140, - 140,140,50,54,54,70,20,21,113,58,214,25,60,95,146,101,41,190,23,99,173,102,100,180,206,187,222,241,118,60,20,91, - 141,38,75,183,87,57,247,242,117,158,121,246,52,229,146,207,135,62,252,55,184,244,135,31,179,94,150,165,2,210,14,152, - 127,69,49,3,244,221,16,1,31,102,56,205,60,36,160,55,56,4,144,59,195,92,121,244,53,85,65,117,235,156,201,114, - 235,131,243,251,61,179,182,182,78,217,246,201,140,99,107,171,205,158,189,123,184,112,225,26,159,253,220,151,248,233,159,248, - 81,170,181,10,189,78,151,141,141,109,158,127,238,28,159,249,179,175,113,107,229,14,107,27,183,89,91,109,97,140,69,72, - 137,213,2,132,69,90,65,187,175,248,39,255,215,83,252,206,39,47,209,111,182,89,152,223,195,254,163,199,40,141,132,220, - 92,90,162,183,233,216,53,61,195,177,197,7,89,187,149,176,153,172,128,167,208,46,67,106,139,26,184,31,214,106,117,162, - 40,38,12,66,198,199,199,41,151,43,120,202,199,216,188,200,228,114,142,48,12,177,6,42,149,42,239,127,255,251,201,211, - 148,39,191,118,158,229,149,117,94,190,188,196,205,213,6,251,14,237,227,167,254,243,247,49,187,48,198,153,141,85,83,118, - 100,14,242,17,112,255,61,133,116,226,187,85,64,171,131,94,208,80,185,62,36,160,33,28,56,241,218,171,160,65,126,151, - 213,155,183,76,143,24,191,18,211,75,183,72,251,45,148,39,152,156,28,231,209,199,30,231,197,179,103,88,152,159,195,88, - 199,141,155,183,89,89,91,163,213,110,115,231,206,29,26,141,6,157,78,7,59,176,50,13,35,133,144,30,253,110,15,207, - 179,24,171,216,218,106,33,149,32,26,169,241,210,153,23,185,179,124,7,173,29,199,143,159,96,114,98,158,218,68,153,217, - 221,19,108,159,93,69,249,22,141,69,225,35,132,71,28,151,136,162,136,145,122,141,106,165,78,41,174,32,133,135,0,66, - 63,160,223,55,132,97,136,195,17,197,30,71,14,29,100,109,121,153,23,159,221,102,117,117,149,102,227,38,211,149,113,254, - 202,187,223,197,125,111,59,202,254,185,17,154,253,148,222,157,213,108,10,183,165,97,167,14,230,191,230,123,107,48,219,193, - 86,109,133,225,148,243,144,128,134,64,91,195,76,121,148,71,38,247,115,102,227,234,171,222,193,239,162,75,113,218,35,192, - 74,208,213,118,91,175,244,175,194,238,41,106,35,37,180,150,108,110,110,209,237,182,153,155,153,97,103,167,193,213,107,87, - 11,77,86,146,113,103,101,149,126,210,39,75,83,180,214,133,68,98,16,103,227,7,1,8,247,74,198,151,64,32,85,113, - 124,255,252,115,207,17,4,1,74,42,74,213,152,245,245,117,54,183,182,152,155,157,225,200,145,35,220,190,125,155,86,171, - 53,168,164,44,190,231,177,111,223,62,74,113,76,20,132,248,42,0,109,169,148,35,74,213,18,142,194,204,222,58,135,242, - 37,83,19,147,52,26,219,92,188,116,145,94,179,195,228,216,24,111,122,211,73,14,29,63,192,209,147,71,168,151,75,144, - 229,228,105,134,235,119,50,96,83,194,78,0,38,227,123,27,236,20,131,30,208,20,176,54,92,176,67,2,26,2,180,115, - 220,63,50,207,135,118,150,17,121,255,187,222,201,45,80,5,215,131,36,130,230,92,24,245,140,203,217,106,111,178,211,131, - 188,229,33,21,212,70,98,110,175,88,202,113,17,63,188,177,177,78,179,221,38,73,179,194,28,62,207,49,198,224,156,195, - 243,60,162,40,34,240,125,210,44,41,102,114,156,0,44,14,144,74,18,122,17,224,176,214,96,172,161,84,142,73,146,62, - 253,126,194,216,232,4,15,191,245,17,190,252,229,175,208,75,250,68,129,79,173,82,163,215,233,161,211,156,190,239,83,171, - 86,193,194,86,150,97,221,24,86,138,66,32,170,36,129,10,216,220,220,66,231,154,90,173,198,248,200,24,7,247,204,114, - 228,196,62,118,31,95,68,8,135,236,39,133,177,124,150,35,114,99,92,97,149,145,255,83,176,191,13,196,223,207,53,167, - 80,185,247,134,203,111,72,64,111,248,126,144,179,180,252,144,237,209,5,126,118,253,210,119,37,32,1,164,224,214,161,99, - 97,61,180,174,147,27,77,214,234,99,243,12,151,6,8,37,72,117,200,214,214,22,58,47,140,224,173,45,146,33,140,27, - 164,82,72,31,165,160,84,42,17,197,49,74,41,90,173,29,250,73,31,107,45,82,202,226,53,20,61,154,48,12,105,53, - 119,144,82,146,235,156,102,163,133,153,53,248,190,143,231,121,204,207,47,176,127,255,126,110,221,188,197,161,195,135,11,31, - 232,48,26,228,128,5,148,75,49,149,114,25,37,20,81,169,140,23,12,166,118,132,32,215,57,253,94,239,149,252,46,229, - 251,220,243,192,125,28,56,92,39,205,83,252,220,71,56,139,139,28,237,126,15,63,147,133,64,30,92,62,184,46,253,239, - 243,186,95,26,46,189,33,1,13,81,64,89,67,119,100,134,79,55,151,185,152,118,94,245,148,198,0,19,192,143,66,106, - 160,61,233,92,111,97,124,146,43,171,55,9,125,129,13,44,214,64,183,219,5,1,149,82,25,231,138,237,158,213,182,72, - 14,117,16,199,17,97,24,146,231,57,253,126,31,173,53,89,158,14,162,142,93,33,6,149,30,142,194,72,172,215,235,97, - 29,8,91,184,19,250,158,143,148,146,36,73,104,54,155,128,96,223,226,62,78,61,120,10,223,247,209,86,147,231,154,36, - 77,17,206,20,166,241,82,18,148,98,130,48,192,243,10,2,202,117,142,195,225,251,62,130,66,49,47,156,164,159,228,128, - 195,211,57,82,75,50,15,124,17,177,121,233,26,193,173,149,190,131,158,6,243,87,129,105,190,255,44,174,187,150,28,191, - 51,232,9,13,49,36,160,55,46,1,57,199,154,10,185,49,115,148,201,27,207,188,106,63,227,110,254,87,12,166,11,201, - 136,54,253,227,243,115,110,105,107,83,88,157,0,69,76,177,67,22,238,126,73,70,24,68,248,94,128,117,22,207,83,8, - 100,97,113,234,28,217,192,62,35,205,138,78,138,214,69,190,123,81,156,200,65,85,82,228,122,149,226,26,221,110,151,90, - 173,198,236,204,44,35,35,163,120,158,95,228,171,87,171,56,99,144,82,208,107,119,48,206,21,141,114,229,21,57,91,65, - 132,19,18,173,13,46,24,100,121,13,72,64,73,137,118,20,118,28,56,242,164,199,250,237,219,184,227,51,8,153,162,189, - 132,160,84,231,198,229,43,172,254,246,239,247,38,175,93,61,99,224,106,94,84,129,188,214,52,10,31,248,101,224,183,248, - 222,142,241,135,24,18,208,15,45,164,213,148,227,17,62,84,153,228,129,206,198,119,125,254,121,208,109,216,246,250,189,141, - 55,151,131,188,245,35,111,15,190,252,165,47,225,97,145,24,156,28,156,147,185,98,186,56,8,130,34,59,29,135,20,96, - 156,165,215,110,99,181,65,15,178,213,7,188,131,148,2,73,17,117,46,165,71,28,197,120,94,192,248,248,36,211,187,118, - 177,184,103,145,106,173,74,28,71,228,70,147,38,9,206,90,130,48,64,122,62,141,78,151,181,149,85,70,171,53,198,198, - 199,169,212,234,120,190,87,152,207,75,85,228,120,41,129,16,2,147,229,131,0,67,135,144,5,225,41,223,103,121,109,21, - 157,38,248,165,0,43,224,153,207,127,145,139,191,250,209,230,220,153,243,79,1,159,13,224,89,160,125,138,215,55,229,252, - 163,192,28,240,145,225,18,28,18,208,27,186,23,52,168,110,62,62,190,135,127,223,217,224,213,82,198,51,224,199,32,159, - 133,213,28,174,30,184,117,103,123,249,173,239,216,181,118,239,253,92,60,127,6,169,187,8,43,144,74,34,165,122,133,124, - 172,213,3,55,68,65,158,166,224,28,218,232,34,81,75,74,140,45,26,195,175,40,207,157,96,126,126,158,125,251,15,48, - 57,53,205,232,232,24,113,24,163,60,143,164,159,144,101,26,135,165,86,175,129,20,116,27,219,52,207,158,177,245,151,47, - 232,122,187,205,246,169,183,121,106,106,90,226,64,56,1,6,226,56,36,14,35,180,213,131,30,147,64,121,170,56,113,19, - 18,103,45,206,15,176,113,136,240,28,55,207,94,224,201,223,255,152,238,254,223,255,110,101,177,217,121,86,194,159,120,240, - 165,18,220,250,29,200,99,160,198,107,183,55,137,40,172,87,135,24,18,208,112,43,102,13,155,165,81,110,76,29,224,193, - 245,43,40,190,253,124,75,6,204,20,237,160,181,12,206,238,186,113,237,202,200,129,197,169,83,15,63,40,199,106,37,46, - 157,62,77,171,213,66,10,65,185,84,166,90,175,131,128,78,167,69,174,51,148,49,248,214,129,47,65,72,242,60,43,42, - 16,107,200,179,12,68,153,61,187,15,240,240,155,223,204,222,61,11,88,9,61,155,163,60,15,172,165,151,116,169,142,84, - 9,2,159,78,179,73,114,237,101,166,175,93,237,239,191,116,121,115,87,171,181,58,225,156,150,48,243,137,222,214,252,86, - 104,101,28,9,130,48,64,57,137,22,142,204,104,140,209,24,35,193,249,4,94,72,106,83,148,7,81,57,70,167,9,165, - 235,55,220,215,255,155,207,247,150,63,241,137,173,250,230,246,245,89,120,30,120,76,195,243,22,86,62,10,217,39,135,75, - 102,136,33,1,253,249,193,1,129,53,28,157,56,192,223,238,53,57,248,42,91,177,12,120,17,90,192,185,32,201,158,59, - 113,230,194,190,47,76,239,157,61,114,252,30,118,239,154,225,133,211,47,176,116,115,169,200,80,239,52,177,198,224,156,69, - 231,57,218,128,239,135,4,202,199,26,73,166,29,58,207,41,197,101,14,239,187,135,99,71,143,113,248,240,65,194,48,164, - 211,238,224,210,28,101,12,81,217,71,196,33,213,168,130,202,53,205,103,158,118,19,47,189,212,222,187,124,123,121,38,77, - 46,120,112,94,195,245,4,144,112,106,223,203,23,223,219,169,141,237,73,246,29,19,65,77,225,252,16,89,13,113,78,160, - 6,65,131,214,9,116,214,39,72,122,148,117,134,60,123,75,215,158,125,170,25,94,187,182,154,102,217,149,121,56,235,224, - 124,14,23,114,184,49,2,173,223,2,51,36,159,33,134,4,244,250,118,92,238,59,61,208,119,134,127,55,177,200,111,188, - 10,1,5,69,21,148,95,133,27,26,158,88,88,186,113,240,216,153,211,245,211,39,223,84,246,75,1,15,63,242,86,22, - 118,47,176,178,186,70,191,215,67,8,65,191,223,163,223,235,97,133,71,169,82,67,73,1,90,83,158,171,48,63,191,192, - 145,35,71,153,158,222,5,194,144,244,59,244,186,93,132,148,152,80,225,171,128,40,12,72,218,93,242,243,215,221,244,11, - 207,108,159,188,117,243,70,93,235,139,14,94,178,240,146,129,107,1,108,38,224,57,88,58,218,106,53,103,190,252,232,91, - 239,60,245,244,108,30,70,126,88,42,17,150,203,104,157,129,49,88,231,112,206,162,180,182,113,158,217,82,146,228,81,187, - 181,86,178,246,162,131,11,182,248,186,146,193,198,94,232,124,5,242,39,249,54,182,27,67,12,49,36,160,239,187,216,121, - 213,7,79,116,183,190,235,15,89,0,82,216,185,3,207,9,152,185,247,185,167,107,237,170,255,192,141,125,135,35,95,120, - 220,115,248,24,39,142,221,75,158,229,104,173,49,185,38,244,3,180,40,82,48,42,81,137,122,181,74,185,84,38,42,197, - 244,147,132,84,247,49,182,56,202,15,189,128,220,106,188,56,198,96,216,57,119,134,125,47,157,110,237,191,181,116,173,154, - 36,207,105,120,206,193,121,3,75,26,54,28,244,207,130,253,47,129,23,32,233,67,163,174,243,211,99,237,198,140,107,23, - 39,229,118,160,130,184,27,6,248,205,217,90,6,50,1,43,6,174,8,184,133,16,59,35,74,245,207,104,109,223,9,156, - 7,110,48,148,81,12,49,36,160,191,80,24,227,136,59,13,150,10,130,121,213,50,202,130,25,131,91,91,240,133,216,104, - 255,109,95,121,204,69,205,238,125,183,79,190,165,98,29,120,198,17,120,1,97,84,122,101,32,209,15,36,206,228,131,19, - 41,73,187,219,161,213,239,224,135,33,42,240,240,157,79,53,174,128,146,100,121,74,239,218,117,70,95,120,186,127,224,252, - 217,165,201,110,247,37,11,79,25,120,38,134,43,171,208,168,64,58,3,238,14,112,109,240,119,37,208,156,135,179,55,225, - 90,9,226,210,64,132,110,41,28,29,131,111,67,36,61,48,9,244,35,33,186,7,14,29,200,211,195,251,221,212,196,8, - 75,95,250,26,246,250,173,225,194,24,98,72,64,127,225,228,99,29,251,234,17,215,30,121,136,23,146,14,82,124,103,133, - 152,39,37,75,221,46,201,115,207,166,191,226,220,149,77,248,211,64,91,115,234,217,231,146,169,102,251,77,23,223,252,224, - 164,155,157,23,65,232,147,27,141,118,14,43,101,17,113,227,10,162,19,18,148,23,225,5,138,32,80,68,113,132,148,18, - 50,141,185,190,68,233,233,39,251,251,47,156,185,189,171,213,56,39,29,207,26,120,110,16,129,188,118,24,250,159,6,142, - 81,72,27,238,18,138,1,38,129,189,144,158,133,116,22,26,255,219,128,120,74,158,98,97,116,140,155,141,6,169,214,175, - 156,254,5,20,121,92,231,129,119,252,200,91,168,253,212,143,99,146,62,38,246,169,47,175,13,9,104,136,33,1,253,101, - 32,183,150,15,28,159,231,161,125,179,69,64,240,171,118,146,4,120,30,239,217,217,225,127,190,114,57,249,187,112,169,15, - 105,136,219,58,116,249,226,234,200,157,219,167,206,47,238,95,216,62,113,50,142,23,22,240,3,133,242,61,60,21,160,42, - 101,132,44,68,167,65,224,19,122,30,158,16,36,157,54,237,75,231,92,240,228,83,189,189,55,174,223,158,236,118,206,75, - 120,206,192,139,249,128,120,22,161,87,3,187,243,77,149,216,119,130,164,104,152,127,124,64,64,191,246,158,119,114,100,113, - 47,255,227,255,249,251,223,242,188,24,248,111,7,63,75,249,62,86,128,233,37,72,5,54,207,135,219,174,33,134,4,244, - 151,5,37,4,89,154,146,234,239,238,92,83,141,34,170,74,241,135,192,12,36,31,129,171,13,104,229,176,58,213,235,222, - 24,63,247,210,253,203,183,150,14,95,157,157,223,149,238,222,29,245,162,72,154,56,22,34,12,113,206,81,169,85,104,182, - 90,168,141,117,29,111,108,234,218,198,122,251,158,181,181,149,145,52,189,12,60,111,224,197,92,138,75,210,186,85,191,176, - 63,181,21,10,85,249,119,83,239,127,59,210,24,13,124,198,148,122,245,215,56,203,43,83,145,67,12,49,36,160,191,92, - 184,239,247,201,119,165,19,64,21,244,255,11,107,143,192,19,10,150,4,188,176,187,213,188,103,161,213,60,144,93,186,48, - 154,64,156,249,126,77,123,94,221,89,43,124,104,187,60,111,199,90,247,98,104,43,88,6,174,89,196,229,28,119,57,129, - 245,178,117,189,17,176,222,224,215,189,158,106,196,216,194,132,108,136,33,134,4,244,195,86,57,1,91,192,117,176,191,14, - 173,231,161,155,192,178,134,211,22,166,34,107,43,1,132,54,77,71,101,154,78,57,80,18,54,44,108,73,72,53,244,50, - 216,150,176,237,227,218,14,250,115,96,253,111,170,78,134,110,130,67,12,9,104,136,87,45,136,238,110,112,170,96,34,104, - 93,131,206,12,220,186,13,106,18,68,25,162,118,209,118,17,9,244,125,72,19,48,62,216,147,160,159,6,171,129,121,94, - 187,196,97,136,33,254,178,33,220,176,180,30,98,136,33,254,19,65,14,47,193,16,67,12,241,159,10,255,31,228,61,54, - 41,71,79,28,213,0,0,0,0,73,69,78,68,174,66,96,130, -}; diff --git a/higan/emulator/emulator.hpp b/higan/emulator/emulator.hpp index c8ec8b69..0e932bd1 100755 --- a/higan/emulator/emulator.hpp +++ b/higan/emulator/emulator.hpp @@ -3,7 +3,7 @@ namespace Emulator { static const char Name[] = "higan"; - static const char Version[] = "091.13"; + static const char Version[] = "091.14"; static const char Author[] = "byuu"; static const char License[] = "GPLv3"; } diff --git a/higan/emulator/interface.hpp b/higan/emulator/interface.hpp index 1fce96f3..50492632 100755 --- a/higan/emulator/interface.hpp +++ b/higan/emulator/interface.hpp @@ -21,7 +21,7 @@ struct Interface { unsigned id; string name; string type; - string load; + bool bootable; //false for slotted sub-cartridges (Super Game Boy et al) }; vector media; @@ -75,6 +75,7 @@ struct Interface { template void notify(Args&... args) { return bind->notify({std::forward(args)...}); } //information + virtual string title() { return ""; } virtual double videoFrequency() = 0; virtual double audioFrequency() = 0; diff --git a/higan/fc/cartridge/board/board.cpp b/higan/fc/cartridge/board/board.cpp index e4eef00e..1a615baa 100755 --- a/higan/fc/cartridge/board/board.cpp +++ b/higan/fc/cartridge/board/board.cpp @@ -86,8 +86,8 @@ Board::Board(Markup::Node &document) { cartridge.board = this; auto cartridge = document["cartridge"]; - information.type = cartridge["board"]["type"].data; - information.battery = cartridge["prg"]["ram"]["nonvolatile"].data == "true"; + information.type = cartridge["board/type"].data; + information.battery = cartridge["prg/ram/nonvolatile"].exists(); auto prom = cartridge["prg"]["rom"]; auto pram = cartridge["prg"]["ram"]; @@ -121,7 +121,8 @@ Board::~Board() { Board* Board::load(const string &manifest) { auto document = Markup::Document(manifest); - string type = document["cartridge"]["board"]["type"].data; + cartridge.information.title = document["information/title"].text(); + string type = document["cartridge/board/type"].text(); if(type == "BANDAI-FCG" ) return new BandaiFCG(document); diff --git a/higan/fc/cartridge/cartridge.cpp b/higan/fc/cartridge/cartridge.cpp index 0ca20e78..be2a45e1 100755 --- a/higan/fc/cartridge/cartridge.cpp +++ b/higan/fc/cartridge/cartridge.cpp @@ -6,6 +6,10 @@ namespace Famicom { #include "board/board.cpp" Cartridge cartridge; +string Cartridge::title() { + return information.title; +} + void Cartridge::Main() { cartridge.main(); } diff --git a/higan/fc/cartridge/cartridge.hpp b/higan/fc/cartridge/cartridge.hpp index 8a390c49..ff933533 100755 --- a/higan/fc/cartridge/cartridge.hpp +++ b/higan/fc/cartridge/cartridge.hpp @@ -16,8 +16,11 @@ struct Cartridge : Thread, property { struct Information { string markup; + string title; } information; + string title(); + struct Memory { unsigned id; string name; diff --git a/higan/fc/interface/interface.cpp b/higan/fc/interface/interface.cpp index b663b1f2..52d32633 100755 --- a/higan/fc/interface/interface.cpp +++ b/higan/fc/interface/interface.cpp @@ -4,6 +4,10 @@ namespace Famicom { Interface *interface = nullptr; +string Interface::title() { + return cartridge.title(); +} + double Interface::videoFrequency() { return 21477272.0 / (262.0 * 1364.0 - 4.0); } @@ -124,7 +128,7 @@ Interface::Interface() { information.capability.states = true; information.capability.cheats = true; - media.append({ID::Famicom, "Famicom", "fc"}); + media.append({ID::Famicom, "Famicom", "fc", true}); { Device device{0, ID::Port1 | ID::Port2, "Controller"}; diff --git a/higan/fc/interface/interface.hpp b/higan/fc/interface/interface.hpp index 78e957f3..58a0fc10 100755 --- a/higan/fc/interface/interface.hpp +++ b/higan/fc/interface/interface.hpp @@ -22,6 +22,7 @@ struct ID { }; struct Interface : Emulator::Interface { + string title(); double videoFrequency(); double audioFrequency(); diff --git a/higan/gb/cartridge/cartridge.cpp b/higan/gb/cartridge/cartridge.cpp index c45e329c..5dbac386 100755 --- a/higan/gb/cartridge/cartridge.cpp +++ b/higan/gb/cartridge/cartridge.cpp @@ -14,6 +14,10 @@ namespace GameBoy { #include "serialization.cpp" Cartridge cartridge; +string Cartridge::title() { + return information.title; +} + void Cartridge::load(System::Revision revision, const string &manifest) { information.markup = manifest; information.mapper = Mapper::Unknown; @@ -26,8 +30,9 @@ void Cartridge::load(System::Revision revision, const string &manifest) { information.ramsize = 0; auto document = Markup::Document(manifest); + information.title = document["information/title"].text(); - auto mapperid = document["cartridge"]["board"]["type"].data; + auto mapperid = document["cartridge/board/type"].text(); if(mapperid == "none" ) information.mapper = Mapper::MBC0; if(mapperid == "MBC1" ) information.mapper = Mapper::MBC1; if(mapperid == "MBC2" ) information.mapper = Mapper::MBC2; diff --git a/higan/gb/cartridge/cartridge.hpp b/higan/gb/cartridge/cartridge.hpp index 90640ce3..2d4736f3 100755 --- a/higan/gb/cartridge/cartridge.hpp +++ b/higan/gb/cartridge/cartridge.hpp @@ -22,6 +22,7 @@ struct Cartridge : MMIO, property { struct Information { string markup; + string title; Mapper mapper; bool ram; @@ -33,6 +34,8 @@ struct Cartridge : MMIO, property { unsigned ramsize; } information; + string title(); + struct Memory { unsigned id; string name; diff --git a/higan/gb/interface/interface.cpp b/higan/gb/interface/interface.cpp index 705318c1..ec831b89 100755 --- a/higan/gb/interface/interface.cpp +++ b/higan/gb/interface/interface.cpp @@ -12,6 +12,10 @@ void Interface::joypWrite(bool p15, bool p14) { if(hook) hook->joypWrite(p15, p14); } +string Interface::title() { + return cartridge.title(); +} + double Interface::videoFrequency() { return 4194304.0 / (154.0 * 456.0); } @@ -140,8 +144,8 @@ Interface::Interface() { information.capability.states = true; information.capability.cheats = true; - media.append({ID::GameBoy, "Game Boy", "gb" }); - media.append({ID::GameBoyColor, "Game Boy Color", "gbc"}); + media.append({ID::GameBoy, "Game Boy", "gb" , true}); + media.append({ID::GameBoyColor, "Game Boy Color", "gbc", true}); { Device device{0, ID::Device, "Controller"}; diff --git a/higan/gb/interface/interface.hpp b/higan/gb/interface/interface.hpp index c7a441fd..99ad5b29 100755 --- a/higan/gb/interface/interface.hpp +++ b/higan/gb/interface/interface.hpp @@ -35,6 +35,7 @@ struct Interface : Emulator::Interface { void lcdScanline(); void joypWrite(bool p15, bool p14); + string title(); double videoFrequency(); double audioFrequency(); diff --git a/higan/gba/cartridge/cartridge.cpp b/higan/gba/cartridge/cartridge.cpp index c8ca1fa1..a3042614 100755 --- a/higan/gba/cartridge/cartridge.cpp +++ b/higan/gba/cartridge/cartridge.cpp @@ -7,13 +7,18 @@ namespace GameBoyAdvance { #include "serialization.cpp" Cartridge cartridge; +string Cartridge::title() { + return information.title; +} + void Cartridge::load(const string &manifest) { information.markup = manifest; auto document = Markup::Document(manifest); + information.title = document["information/title"].text(); unsigned rom_size = 0; - if(document["cartridge"]["rom"].exists()) { - auto info = document["cartridge"]["rom"]; + if(document["cartridge/rom"].exists()) { + auto info = document["cartridge/rom"]; interface->loadRequest(ID::ROM, info["name"].data); rom_size = numeral(info["size"].data); for(unsigned addr = rom_size; addr < rom.size; addr++) { @@ -25,8 +30,8 @@ void Cartridge::load(const string &manifest) { has_eeprom = false; has_flashrom = false; - if(document["cartridge"]["ram"].exists()) { - auto info = document["cartridge"]["ram"]; + if(document["cartridge/ram"].exists()) { + auto info = document["cartridge/ram"]; if(info["type"].data == "SRAM" || info["type"].data == "FRAM") { has_sram = true; diff --git a/higan/gba/cartridge/cartridge.hpp b/higan/gba/cartridge/cartridge.hpp index 7f41dcec..141b5c78 100755 --- a/higan/gba/cartridge/cartridge.hpp +++ b/higan/gba/cartridge/cartridge.hpp @@ -10,8 +10,11 @@ struct Cartridge : property { struct Information { string markup; + string title; } information; + string title(); + struct Media { unsigned id; string name; diff --git a/higan/gba/interface/interface.cpp b/higan/gba/interface/interface.cpp index 60ffa6b4..cc2920ed 100755 --- a/higan/gba/interface/interface.cpp +++ b/higan/gba/interface/interface.cpp @@ -4,6 +4,10 @@ namespace GameBoyAdvance { Interface *interface = nullptr; +string Interface::title() { + return cartridge.title(); +} + double Interface::videoFrequency() { return 16777216.0 / (228.0 * 1232.0); } @@ -118,7 +122,7 @@ Interface::Interface() { information.capability.states = true; information.capability.cheats = false; - media.append({ID::GameBoyAdvance, "Game Boy Advance", "gba"}); + media.append({ID::GameBoyAdvance, "Game Boy Advance", "gba", true}); { Device device{0, ID::Device, "Controller"}; diff --git a/higan/gba/interface/interface.hpp b/higan/gba/interface/interface.hpp index b28cb542..0483e07b 100755 --- a/higan/gba/interface/interface.hpp +++ b/higan/gba/interface/interface.hpp @@ -22,6 +22,7 @@ struct ID { }; struct Interface : Emulator::Interface { + string title(); double videoFrequency(); double audioFrequency(); diff --git a/higan/nall/directory.hpp b/higan/nall/directory.hpp index 36db7532..5617ee4e 100755 --- a/higan/nall/directory.hpp +++ b/higan/nall/directory.hpp @@ -21,9 +21,53 @@ struct directory { static bool create(const string &pathname, unsigned permissions = 0755); //recursive static bool remove(const string &pathname); //recursive static bool exists(const string &pathname); - static lstring folders(const string &pathname, const string &pattern = "*"); - static lstring files(const string &pathname, const string &pattern = "*"); - static lstring contents(const string &pathname, const string &pattern = "*"); + + static lstring folders(const string &pathname, const string &pattern = "*") { + lstring folders = directory::ufolders(pathname, pattern); + folders.sort(); + return folders; + } + + static lstring files(const string &pathname, const string &pattern = "*") { + lstring files = directory::ufiles(pathname, pattern); + files.sort(); + return files; + } + + static lstring contents(const string &pathname, const string &pattern = "*") { + lstring folders = directory::ufolders(pathname); //pattern search of contents should only filter files + lstring files = directory::ufiles(pathname, pattern); + folders.sort(); + files.sort(); + for(auto &file : files) folders.append(file); + return folders; + } + + static lstring ifolders(const string &pathname, const string &pattern = "*") { + lstring folders = ufolders(pathname, pattern); + folders.isort(); + return folders; + } + + static lstring ifiles(const string &pathname, const string &pattern = "*") { + lstring files = ufiles(pathname, pattern); + files.isort(); + return files; + } + + static lstring icontents(const string &pathname, const string &pattern = "*") { + lstring folders = directory::ufolders(pathname); //pattern search of contents should only filter files + lstring files = directory::ufiles(pathname, pattern); + folders.isort(); + files.isort(); + for(auto &file : files) folders.append(file); + return folders; + } + +private: + //internal functions; these return unsorted lists + static lstring ufolders(const string &pathname, const string &pattern = "*"); + static lstring ufiles(const string &pathname, const string &pattern = "*"); }; #if defined(PLATFORM_WINDOWS) @@ -55,7 +99,7 @@ struct directory { return (result & FILE_ATTRIBUTE_DIRECTORY); } - inline lstring directory::folders(const string &pathname, const string &pattern) { + inline lstring directory::ufolders(const string &pathname, const string &pattern) { lstring list; string path = pathname; path.transform("/", "\\"); @@ -81,12 +125,11 @@ struct directory { } FindClose(handle); } - if(list.size() > 0) list.sort(); for(auto &name : list) name.append("/"); //must append after sorting return list; } - inline lstring directory::files(const string &pathname, const string &pattern) { + inline lstring directory::ufiles(const string &pathname, const string &pattern) { lstring list; string path = pathname; path.transform("/", "\\"); @@ -108,16 +151,8 @@ struct directory { } FindClose(handle); } - if(list.size() > 0) list.sort(); return list; } - - inline lstring directory::contents(const string &pathname, const string &pattern) { - lstring folders = directory::folders(pathname); //pattern search of contents() should only filter files - lstring files = directory::files(pathname, pattern); - for(auto &file : files) folders.append(file); - return folders; - } #else inline bool directory::create(const string &pathname, unsigned permissions) { string path; @@ -146,7 +181,7 @@ struct directory { return true; } - inline lstring directory::folders(const string &pathname, const string &pattern) { + inline lstring directory::ufolders(const string &pathname, const string &pattern) { lstring list; DIR *dp; struct dirent *ep; @@ -161,12 +196,11 @@ struct directory { } closedir(dp); } - if(list.size() > 0) list.sort(); for(auto &name : list) name.append("/"); //must append after sorting return list; } - inline lstring directory::files(const string &pathname, const string &pattern) { + inline lstring directory::ufiles(const string &pathname, const string &pattern) { lstring list; DIR *dp; struct dirent *ep; @@ -181,16 +215,8 @@ struct directory { } closedir(dp); } - if(list.size() > 0) list.sort(); return list; } - - inline lstring directory::contents(const string &pathname, const string &pattern) { - lstring folders = directory::folders(pathname); //pattern search of contents() should only filter files - lstring files = directory::files(pathname, pattern); - for(auto &file : files) folders.append(file); - return folders; - } #endif } diff --git a/higan/nall/emulation/famicom.hpp b/higan/nall/emulation/famicom.hpp index 84275d69..08d243ae 100755 --- a/higan/nall/emulation/famicom.hpp +++ b/higan/nall/emulation/famicom.hpp @@ -27,8 +27,6 @@ FamicomCartridge::FamicomCartridge(const uint8_t *data, unsigned size) { if(data[2] != 'S') return; if(data[3] != 26) return; - markup.append("\n"); - mapper = ((data[7] >> 4) << 4) | (data[6] >> 4); mirror = ((data[6] & 0x08) >> 2) | (data[6] & 0x01); prgrom = data[4] * 0x4000; @@ -36,145 +34,138 @@ FamicomCartridge::FamicomCartridge(const uint8_t *data, unsigned size) { prgram = 0u; chrram = chrrom == 0u ? 8192u : 0u; - markup.append("\n"); + markup.append("cartridge\n"); switch(mapper) { default: - markup.append(" \n"); - markup.append(" \n"); + markup.append(" board type=NES-NROM-256\n"); + markup.append(" mirror mode=", mirror == 0 ? "horizontal" : "vertical", "\n"); break; case 1: - markup.append(" \n"); - markup.append(" \n"); + markup.append(" board type=NES-SXROM\n"); + markup.append(" chip type=MMC1B2\n"); prgram = 8192; break; case 2: - markup.append(" \n"); - markup.append(" \n"); + markup.append(" board type=NES-UOROM\n"); + markup.append(" mirror mode=", mirror == 0 ? "horizontal" : "vertical", "\n"); break; case 3: - markup.append(" \n"); - markup.append(" \n"); + markup.append(" board type=NES-CNROM\n"); + markup.append(" mirror mode=", mirror == 0 ? "horizontal" : "vertical", "\n"); break; case 4: //MMC3 - markup.append(" \n"); - markup.append(" \n"); + markup.append(" board type=NES-TLROM\n"); + markup.append(" chip type=MMC3B\n"); prgram = 8192; //MMC6 - //markup.append(" \n"); - //markup.append(" \n"); + //markup.append(" board type=NES-HKROM\n"); + //markup.append(" chip type=MMC6n"); //prgram = 1024; break; case 5: - markup.append(" \n"); - markup.append(" \n"); + markup.append(" board type=NES-ELROM\n"); + markup.append(" chip type=MMC5\n"); prgram = 65536; break; case 7: - markup.append(" \n"); + markup.append(" board type=NES-AOROM\n"); break; case 9: - markup.append(" \n"); - markup.append(" \n"); + markup.append(" board type=NES-PNROM\n"); + markup.append(" chip type=MMC2\n"); prgram = 8192; break; case 10: - markup.append(" \n"); - markup.append(" \n"); + markup.append(" board type=NES-FKROM\n"); + markup.append(" chip type=MMC4\n"); prgram = 8192; break; case 16: - markup.append(" \n"); - markup.append(" \n"); + markup.append(" board type=BANDAI-FCG\n"); + markup.append(" chip type=LZ93D50\n"); break; case 21: case 23: case 25: //VRC4 - markup.append(" \n"); - markup.append(" \n"); - markup.append(" \n"); - markup.append(" \n"); + markup.append(" board type=KONAMI-VRC-4\n"); + markup.append(" chip type=VRC4\n"); + markup.append(" pinout a0=1 a1=0\n"); prgram = 8192; break; case 22: //VRC2 - markup.append(" \n"); - markup.append(" \n"); - markup.append(" \n"); - markup.append(" \n"); + markup.append(" board type=KONAMI-VRC-2\n"); + markup.append(" chip type=VRC2\n"); + markup.append(" pinout a0=0 a1=1\n"); break; case 24: - markup.append(" \n"); - markup.append(" \n"); + markup.append(" board type=KONAMI-VRC-6\n"); + markup.append(" chip type=VRC6\n"); break; case 26: - markup.append(" \n"); - markup.append(" \n"); + markup.append(" board type=KONAMI-VRC-6\n"); + markup.append(" chip type=VRC6\n"); prgram = 8192; break; case 34: - markup.append(" \n"); - markup.append(" \n"); + markup.append(" board type=NES-BNROM\n"); + markup.append(" mirror mode=", mirror == 0 ? "horizontal" : "vertical", "\n"); break; case 66: - markup.append(" \n"); - markup.append(" \n"); + markup.append(" board type=NES-GNROM\n"); + markup.append(" mirror mode=", mirror == 0 ? "horizontal" : "vertical", "\n"); break; case 69: - markup.append(" \n"); - markup.append(" \n"); + markup.append(" board type=SUNSOFT-5B\n"); + markup.append(" chip type=5B\n"); prgram = 8192; break; case 73: - markup.append(" \n"); - markup.append(" \n"); - markup.append(" \n"); + markup.append(" board type=KONAMI-VRC-3\n"); + markup.append(" chip type=VRC3\n"); + markup.append(" mirror mode=", mirror == 0 ? "horizontal" : "vertical", "\n"); prgram = 8192; break; case 75: - markup.append(" \n"); - markup.append(" \n"); + markup.append(" board type=KONAMI-VRC-1\n"); + markup.append(" chip type=VRC1\n"); break; case 85: - markup.append(" \n"); - markup.append(" \n"); + markup.append(" board type=KONAMI-VRC-7\n"); + markup.append(" chip type=VRC7\n"); prgram = 8192; break; } - markup.append(" \n"); - if(prgrom) markup.append(" \n"); - if(prgram) markup.append(" \n"); - markup.append(" \n"); + markup.append(" prg\n"); + if(prgrom) markup.append(" rom name=program.rom size=0x", hex(prgrom), "\n"); + if(prgram) markup.append(" ram name=save.ram size=0x", hex(prgram), "\n"); - markup.append(" \n"); - if(chrrom) markup.append(" \n"); - if(chrram) markup.append(" \n"); - markup.append(" \n"); - - markup.append("\n"); - markup.transform("'", "\""); + markup.append(" chr\n"); + if(chrrom) markup.append(" rom name=character.rom size=0x", hex(chrrom), "\n"); + if(chrram) markup.append(" ram size=0x", hex(chrram), "\n"); } } diff --git a/higan/nall/emulation/game-boy-advance.hpp b/higan/nall/emulation/game-boy-advance.hpp index e16d0949..8e4375ea 100755 --- a/higan/nall/emulation/game-boy-advance.hpp +++ b/higan/nall/emulation/game-boy-advance.hpp @@ -46,21 +46,16 @@ GameBoyAdvanceCartridge::GameBoyAdvanceCartridge(const uint8_t *data, unsigned s identifiers = list.concatenate(","); markup = ""; - - markup.append("\n"); - markup.append("\n"); - markup.append(" \n"); + markup.append("cartridge\n"); + markup.append(" rom name=program.rom size=0x", hex(size), "\n"); if(0); - else if(identifiers.beginswith("SRAM_V" )) markup.append(" \n"); - else if(identifiers.beginswith("SRAM_F_V" )) markup.append(" \n"); - else if(identifiers.beginswith("EEPROM_V" )) markup.append(" \n"); - else if(identifiers.beginswith("FLASH_V" )) markup.append(" \n"); - else if(identifiers.beginswith("FLASH512_V")) markup.append(" \n"); - else if(identifiers.beginswith("FLASH1M_V" )) markup.append(" \n"); - if(identifiers.empty() == false) markup.append(" \n"); - - markup.append("\n"); - markup.transform("'", "\""); + else if(identifiers.beginswith("SRAM_V" )) markup.append(" ram name=save.ram type=SRAM size=0x8000\n"); + else if(identifiers.beginswith("SRAM_F_V" )) markup.append(" ram name=save.ram type=FRAM size=0x8000\n"); + else if(identifiers.beginswith("EEPROM_V" )) markup.append(" ram name=save.ram type=EEPROM size=0x0\n"); + else if(identifiers.beginswith("FLASH_V" )) markup.append(" ram name=save.ram type=FlashROM size=0x10000\n"); + else if(identifiers.beginswith("FLASH512_V")) markup.append(" ram name=save.ram type=FlashROM size=0x10000\n"); + else if(identifiers.beginswith("FLASH1M_V" )) markup.append(" ram name=save.ram type=FlashROM size=0x20000\n"); +//if(identifiers.empty() == false) markup.append(" #detected: ", identifiers, "\n"); } } diff --git a/higan/nall/emulation/game-boy.hpp b/higan/nall/emulation/game-boy.hpp index ef1f3da9..1183911c 100755 --- a/higan/nall/emulation/game-boy.hpp +++ b/higan/nall/emulation/game-boy.hpp @@ -108,13 +108,11 @@ GameBoyCartridge::GameBoyCartridge(uint8_t *romdata, unsigned romsize) { if(info.mapper == "MBC2") info.ramsize = 512; //512 x 4-bit - markup = "\n"; - markup.append("\n"); - markup.append(" \n"); - markup.append(" \n"); - if(info.ramsize > 0) markup.append(" \n"); - markup.append("\n"); - markup.transform("'", "\""); + markup = ""; + markup.append("cartridge\n"); + markup.append(" board type=", info.mapper, "\n"); + markup.append(" rom name=program.rom size=0x", hex(romsize), "\n"); + if(info.ramsize > 0) markup.append(" ram name=save.ram size=0x", hex(info.ramsize), "\n"); } } diff --git a/higan/nall/emulation/super-famicom.hpp b/higan/nall/emulation/super-famicom.hpp index 43be5d7e..c9a28eae 100755 --- a/higan/nall/emulation/super-famicom.hpp +++ b/higan/nall/emulation/super-famicom.hpp @@ -76,10 +76,11 @@ struct SuperFamicomCartridge { DSP1HiROM, }; - bool loaded; //is a base cartridge inserted? - unsigned crc32; //crc32 of all cartridges (base+slot(s)) + bool loaded; //is a base cartridge inserted? + unsigned crc32; //crc32 of all cartridges (base+slot(s)) unsigned rom_size; unsigned ram_size; + bool firmware_appended; //true if firmware is appended to end of ROM data Mode mode; Type type; @@ -106,6 +107,8 @@ struct SuperFamicomCartridge { }; SuperFamicomCartridge::SuperFamicomCartridge(const uint8_t *data, unsigned size) { + firmware_appended = false; + //skip copier header if((size & 0x7fff) == 512) data += 512, size -= 512; @@ -122,35 +125,49 @@ SuperFamicomCartridge::SuperFamicomCartridge(const uint8_t *data, unsigned size) const char *range = (rom_size > 0x200000) || (ram_size > 32 * 1024) ? "0000-7fff" : "0000-ffff"; markup.append("cartridge region=", region == NTSC ? "NTSC" : "PAL", "\n"); - if(type == TypeSuperGameBoy1Bios || type == TypeSuperGameBoy2Bios) markup.append( - " rom name=program.rom size=0x", hex(rom_size), "\n" - " map id=rom address=00-7f,80-ff:8000-ffff\n" - " icd2 revision=1\n" - " rom name=boot.rom size=0x100\n" - " map id=io address=00-3f,80-bf:6000-7fff\n" - ); + if(type == TypeSuperGameBoy1Bios || type == TypeSuperGameBoy2Bios) { + markup.append( + " rom name=program.rom size=0x", hex(rom_size), "\n" + " map id=rom address=00-7f,80-ff:8000-ffff\n" + " icd2 revision=1\n" + " rom name=boot.rom size=0x100\n" + " map id=io address=00-3f,80-bf:6000-7fff\n" + ); + if((rom_size & 0x7fff) == 0x100) { + firmware_appended = true; + rom_size -= 0x100; + } + } - else if(has_cx4) markup.append( - " hitachidsp model=HG51B169 frequency=20000000\n" - " rom id=program name=program.rom size=0x", hex(rom_size), "\n" - " rom id=data name=cx4.data.rom size=0xc00\n" - " ram id=data size=0xc00\n" - " map id=io address=00-3f,80-bf:6000-7fff\n" - " map id=rom address=00-7f,80-ff:8000-ffff mask=0x8000\n" - " map id=ram address=70-77:0000-7fff\n" - ); + else if(has_cx4) { + markup.append( + " hitachidsp model=HG51B169 frequency=20000000\n" + " rom id=program name=program.rom size=0x", hex(rom_size), "\n" + " rom id=data name=cx4.data.rom size=0xc00\n" + " ram id=data size=0xc00\n" + " map id=io address=00-3f,80-bf:6000-7fff\n" + " map id=rom address=00-7f,80-ff:8000-ffff mask=0x8000\n" + " map id=ram address=70-77:0000-7fff\n" + ); + if((rom_size & 0x7fff) == 0xc00) { + firmware_appended = true; + rom_size -= 0xc00; + } + } - else if(has_spc7110) markup.append( - " spc7110\n" - " rom id=program name=program.rom size=0x100000\n" - " rom id=data name=data.rom size=0x", hex(rom_size - 0x100000), "\n" - " ram name=save.ram size=0x", hex(ram_size), "\n" - " map id=io address=00-3f,80-bf:4800-483f\n" - " map id=io address=50:0000-ffff\n" - " map id=rom address=00-3f,80-bf:8000-ffff\n" - " map id=rom address=c0-ff:0000-ffff\n" - " map id=ram address=00-3f,80-bf:6000-7fff mask=0xe000\n" - ); + else if(has_spc7110) { + markup.append( + " spc7110\n" + " rom id=program name=program.rom size=0x100000\n" + " rom id=data name=data.rom size=0x", hex(rom_size - 0x100000), "\n" + " ram name=save.ram size=0x", hex(ram_size), "\n" + " map id=io address=00-3f,80-bf:4800-483f\n" + " map id=io address=50:0000-ffff\n" + " map id=rom address=00-3f,80-bf:8000-ffff\n" + " map id=rom address=c0-ff:0000-ffff\n" + " map id=ram address=00-3f,80-bf:6000-7fff mask=0xe000\n" + ); + } else if(has_sdd1) { markup.append( @@ -280,69 +297,83 @@ SuperFamicomCartridge::SuperFamicomCartridge(const uint8_t *data, unsigned size) ); } - else if(mapper == BSCLoROM) markup.append( - " rom name=program.rom size=0x", hex(rom_size), "\n" - " ram name=save.ram size=0x", hex(ram_size), "\n" - " map id=rom address=00-1f:8000-ffff offset=0x000000 mask=0x8000\n" - " map id=rom address=20-3f:8000-ffff offset=0x100000 mask=0x8000\n" - " map id=rom address=80-9f:8000-ffff offset=0x200000 mask=0x8000\n" - " map id=rom address=a0-bf:8000-ffff offset=0x100000 mask=0x8000\n" - " map id=ram address=70-7f,f0-ff:0000-7fff\n" - " bsxslot\n" - " map id=rom address=c0-ef:0000-ffff\n" - ); + else if(mapper == BSCLoROM) { + markup.append( + " rom name=program.rom size=0x", hex(rom_size), "\n" + " ram name=save.ram size=0x", hex(ram_size), "\n" + " map id=rom address=00-1f:8000-ffff offset=0x000000 mask=0x8000\n" + " map id=rom address=20-3f:8000-ffff offset=0x100000 mask=0x8000\n" + " map id=rom address=80-9f:8000-ffff offset=0x200000 mask=0x8000\n" + " map id=rom address=a0-bf:8000-ffff offset=0x100000 mask=0x8000\n" + " map id=ram address=70-7f,f0-ff:0000-7fff\n" + " bsxslot\n" + " map id=rom address=c0-ef:0000-ffff\n" + ); + } - else if(mapper == BSCHiROM) markup.append( - " rom name=program.rom size=0x", hex(rom_size), "\n" - " ram name=save.ram size=0x", hex(ram_size), "\n" - " map id=rom address=00-1f,80-9f:8000-ffff\n" - " map id=rom address=40-5f,c0-df:0000-ffff\n" - " map id=ram address=20-3f,a0-bf:6000-7fff\n" - " bsxslot\n" - " map id=rom address=20-3f,a0-bf:8000-ffff\n" - " map id=rom address=60-7f,e0-ff:0000-ffff\n" - ); + else if(mapper == BSCHiROM) { + markup.append( + " rom name=program.rom size=0x", hex(rom_size), "\n" + " ram name=save.ram size=0x", hex(ram_size), "\n" + " map id=rom address=00-1f,80-9f:8000-ffff\n" + " map id=rom address=40-5f,c0-df:0000-ffff\n" + " map id=ram address=20-3f,a0-bf:6000-7fff\n" + " bsxslot\n" + " map id=rom address=20-3f,a0-bf:8000-ffff\n" + " map id=rom address=60-7f,e0-ff:0000-ffff\n" + ); + } - else if(mapper == BSXROM) markup.append( - " bsx\n" - " rom name=program.rom size=0x", hex(rom_size), "\n" - " ram id=save name=save.ram size=0x", hex(ram_size), "\n" - " ram id=download name=bsx.ram size=0x40000\n" - " map id=io address=00-3f,80-bf:5000-5fff\n" - " map id=rom address=00-3f,80-bf:8000-ffff\n" - " map id=rom address=40-7f,c0-ff:0000-ffff\n" - " map id=ram address=20-3f:6000-7fff\n" - ); + else if(mapper == BSXROM) { + markup.append( + " bsx\n" + " rom name=program.rom size=0x", hex(rom_size), "\n" + " ram id=save name=save.ram size=0x", hex(ram_size), "\n" + " ram id=download name=bsx.ram size=0x40000\n" + " map id=io address=00-3f,80-bf:5000-5fff\n" + " map id=rom address=00-3f,80-bf:8000-ffff\n" + " map id=rom address=40-7f,c0-ff:0000-ffff\n" + " map id=ram address=20-3f:6000-7fff\n" + ); + } - else if(mapper == STROM) markup.append( - " rom name=program.rom size=0x", hex(rom_size), "\n" - " map id=rom address='00-1f,80-9f:8000-ffff mask=0x8000\n" - " sufamiturbo\n" - " slot id=A\n" - " map id=rom address=20-3f,a0-bf:8000-ffff mask=0x8000\n" - " map id=ram address=60-63,e0-e3:8000-ffff\n" - " slot id=B\n" - " map id=rom address=40-5f,c0-df:8000-ffff mask=0x8000\n" - " map id=ram address=70-73,f0-f3:8000-ffff\n" - ); + else if(mapper == STROM) { + markup.append( + " rom name=program.rom size=0x", hex(rom_size), "\n" + " map id=rom address='00-1f,80-9f:8000-ffff mask=0x8000\n" + " sufamiturbo\n" + " slot id=A\n" + " map id=rom address=20-3f,a0-bf:8000-ffff mask=0x8000\n" + " map id=ram address=60-63,e0-e3:8000-ffff\n" + " slot id=B\n" + " map id=rom address=40-5f,c0-df:8000-ffff mask=0x8000\n" + " map id=ram address=70-73,f0-f3:8000-ffff\n" + ); + } - if(has_spc7110rtc) markup.append( - " epsonrtc\n" - " ram name=rtc.ram size=0x10\n" - " map id=io address=00-3f,80-bf:4840-4842\n" - ); + if(has_spc7110rtc) { + markup.append( + " epsonrtc\n" + " ram name=rtc.ram size=0x10\n" + " map id=io address=00-3f,80-bf:4840-4842\n" + ); + } - if(has_srtc) markup.append( - " sharprtc\n" - " ram name=rtc.ram size=0x10\n" - " map id=io address=00-3f,80-bf:2800-2801\n" - ); + if(has_srtc) { + markup.append( + " sharprtc\n" + " ram name=rtc.ram size=0x10\n" + " map id=io address=00-3f,80-bf:2800-2801\n" + ); + } - if(has_obc1) markup.append( - " obc1\n" - " ram name=save.ram size=0x2000\n" - " map id=io address=00-3f,80-bf:6000-7fff\n" - ); + if(has_obc1) { + markup.append( + " obc1\n" + " ram name=save.ram size=0x2000\n" + " map id=io address=00-3f,80-bf:6000-7fff\n" + ); + } if(has_dsp1) { markup.append( @@ -360,57 +391,97 @@ SuperFamicomCartridge::SuperFamicomCartridge(const uint8_t *data, unsigned size) if(dsp1_mapper == DSP1HiROM) markup.append( " map id=io address=00-1f,80-9f:6000-7fff select=0x1000\n" ); + if((size & 0x7fff) == 0x2000) { + firmware_appended = true; + rom_size -= 0x2000; + } } - if(has_dsp2) markup.append( - " necdsp model=uPD7725 frequency=8000000\n" - " rom id=program name=dsp2.program.rom size=0x1800\n" - " rom id=data name=dsp2.data.rom size=0x800\n" - " ram id=data size=0x200\n" - " map id=io address=20-3f,a0-bf:8000-ffff select=0x4000\n" - ); + if(has_dsp2) { + markup.append( + " necdsp model=uPD7725 frequency=8000000\n" + " rom id=program name=dsp2.program.rom size=0x1800\n" + " rom id=data name=dsp2.data.rom size=0x800\n" + " ram id=data size=0x200\n" + " map id=io address=20-3f,a0-bf:8000-ffff select=0x4000\n" + ); + if((size & 0x7fff) == 0x2000) { + firmware_appended = true; + rom_size -= 0x2000; + } + } - if(has_dsp3) markup.append( - " necdsp model=uPD7725 frequency=8000000\n" - " rom id=program name=dsp3.program.rom size=0x1800\n" - " rom id=data name=dsp3.data.rom size=0x800\n" - " ram id=data size=0x200\n" - " map id=io address=20-3f,a0-bf:8000-ffff select=0x4000\n" - ); + if(has_dsp3) { + markup.append( + " necdsp model=uPD7725 frequency=8000000\n" + " rom id=program name=dsp3.program.rom size=0x1800\n" + " rom id=data name=dsp3.data.rom size=0x800\n" + " ram id=data size=0x200\n" + " map id=io address=20-3f,a0-bf:8000-ffff select=0x4000\n" + ); + if((size & 0x7fff) == 0x2000) { + firmware_appended = true; + rom_size -= 0x2000; + } + } - if(has_dsp4) markup.append( - " necdsp model=uPD7725 frequency=8000000\n" - " rom id=program name=dsp4.program.rom size=0x1800\n" - " rom id=data name=dsp4.data.rom size=0x800\n" - " ram id=data size=0x200\n" - " map address=30-3f,b0-bf:8000-ffff select=0x4000\n" - ); + if(has_dsp4) { + markup.append( + " necdsp model=uPD7725 frequency=8000000\n" + " rom id=program name=dsp4.program.rom size=0x1800\n" + " rom id=data name=dsp4.data.rom size=0x800\n" + " ram id=data size=0x200\n" + " map address=30-3f,b0-bf:8000-ffff select=0x4000\n" + ); + if((size & 0x7fff) == 0x2000) { + firmware_appended = true; + rom_size -= 0x2000; + } + } - if(has_st010) markup.append( - " necdsp model=uPD96050 frequency=11000000\n" - " rom id=program name=st010.program.rom size=0xc000\n" - " rom id=data name=st010.data.rom size=0x1000\n" - " ram id=data name=save.ram size=0x1000\n" - " map id=io address=60-67,e0-e7:0000-3fff select=0x0001\n" - " map id=ram address=68-6f,e8-ef:0000-7fff\n" - ); + if(has_st010) { + markup.append( + " necdsp model=uPD96050 frequency=11000000\n" + " rom id=program name=st010.program.rom size=0xc000\n" + " rom id=data name=st010.data.rom size=0x1000\n" + " ram id=data name=save.ram size=0x1000\n" + " map id=io address=60-67,e0-e7:0000-3fff select=0x0001\n" + " map id=ram address=68-6f,e8-ef:0000-7fff\n" + ); + if((size & 0xffff) == 0xd000) { + firmware_appended = true; + rom_size -= 0xd000; + } + } - if(has_st011) markup.append( - " necdsp model=uPD96050 frequency=15000000\n" - " rom id=program name=st011.program.rom size=0xc000\n" - " rom id=data name=st011.data.rom size=0x1000\n" - " ram id=data name=save.ram size=0x1000\n" - " map id=io address=60-67,e0-e7:0000-3fff select=0x0001\n" - " map id=ram address=68-6f,e8-ef:0000-7fff\n" - ); + if(has_st011) { + markup.append( + " necdsp model=uPD96050 frequency=15000000\n" + " rom id=program name=st011.program.rom size=0xc000\n" + " rom id=data name=st011.data.rom size=0x1000\n" + " ram id=data name=save.ram size=0x1000\n" + " map id=io address=60-67,e0-e7:0000-3fff select=0x0001\n" + " map id=ram address=68-6f,e8-ef:0000-7fff\n" + ); + if((size & 0xffff) == 0xd000) { + firmware_appended = true; + rom_size -= 0xd000; + } + } - if(has_st018) markup.append( - " armdsp frequency=21477272\n" - " rom id=program name=st018.program.rom size=0x20000\n" - " rom id=data name=st018.data.rom size=0x8000\n" - " ram name=save.ram size=0x4000\n" - " map id=io address=00-3f,80-bf:3800-38ff\n" - ); + if(has_st018) { + markup.append( + " armdsp frequency=21477272\n" + " rom id=program name=st018.program.rom size=0x20000\n" + " rom id=data name=st018.data.rom size=0x8000\n" + " ram name=save.ram size=0x4000\n" + " map id=io address=00-3f,80-bf:3800-38ff\n" + ); + if((size & 0x3ffff) == 0x28000) { + firmware_appended = true; + rom_size -= 0x28000; + } + } } void SuperFamicomCartridge::read_header(const uint8_t *data, unsigned size) { @@ -464,6 +535,7 @@ void SuperFamicomCartridge::read_header(const uint8_t *data, unsigned size) { ram_size = 1024 << (data[index + RamSize] & 7); if(ram_size == 1024) ram_size = 0; //no RAM present + if(rom_size == 0 && ram_size) ram_size = 0; //fix for Bazooka Blitzkrieg's malformed header (swapped ROM and RAM sizes) //0, 1, 13 = NTSC; 2 - 12 = PAL region = (regionid <= 1 || regionid >= 13) ? NTSC : PAL; diff --git a/higan/nall/file.hpp b/higan/nall/file.hpp index e9d9a2ff..be9fc086 100755 --- a/higan/nall/file.hpp +++ b/higan/nall/file.hpp @@ -74,6 +74,14 @@ namespace nall { return true; } + static bool write(const string &filename, const string &text) { + file fp; + if(fp.open(filename, mode::write) == false) return false; + fp.print(text); + fp.close(); + return true; + } + static bool write(const string &filename, const vector &buffer) { file fp; if(fp.open(filename, mode::write) == false) return false; diff --git a/higan/nall/string/base.hpp b/higan/nall/string/base.hpp index 5866f877..85645c7f 100755 --- a/higan/nall/string/base.hpp +++ b/higan/nall/string/base.hpp @@ -119,6 +119,7 @@ namespace nall { inline optional find(const char*) const; inline string concatenate(const char*) const; inline void append() {} + inline void isort(); template inline void append(const string&, Args&&...); template inline lstring& split(const char*, const char*); diff --git a/higan/nall/string/core.hpp b/higan/nall/string/core.hpp index d5f75f3a..d843e2fd 100755 --- a/higan/nall/string/core.hpp +++ b/higan/nall/string/core.hpp @@ -151,6 +151,12 @@ template void lstring::append(const string &data, Args&&... ar append(std::forward(args)...); } +void lstring::isort() { + nall::sort(pool, objectsize, [](const string &x, const string &y) { + return istrcmp(x, y) < 0; + }); +} + bool lstring::operator==(const lstring &source) const { if(this == &source) return true; if(size() != source.size()) return false; diff --git a/higan/phoenix/core/core.cpp b/higan/phoenix/core/core.cpp index 83767dca..caa326b4 100755 --- a/higan/phoenix/core/core.cpp +++ b/higan/phoenix/core/core.cpp @@ -674,6 +674,10 @@ bool Widget::enabled() { return state.enabled; } +bool Widget::focused() { + return p.focused(); +} + string Widget::font() { return state.font; } diff --git a/higan/phoenix/core/core.hpp b/higan/phoenix/core/core.hpp index a11d756c..dbf53a73 100755 --- a/higan/phoenix/core/core.hpp +++ b/higan/phoenix/core/core.hpp @@ -333,6 +333,7 @@ struct Layout : private nall::base_from_member, Sizable { struct Widget : private nall::base_from_member, Sizable { bool enabled(); + bool focused(); nall::string font(); Geometry geometry(); Geometry minimumGeometry(); diff --git a/higan/phoenix/gtk/platform.hpp b/higan/phoenix/gtk/platform.hpp index 344e8239..01c4a223 100755 --- a/higan/phoenix/gtk/platform.hpp +++ b/higan/phoenix/gtk/platform.hpp @@ -231,6 +231,7 @@ struct pWidget : public pSizable { GtkWidget *gtkWidget; bool enabled(); + virtual bool focused(); virtual Geometry minimumGeometry(); void setEnabled(bool enabled); virtual void setFocused(); @@ -310,6 +311,7 @@ struct pHexEdit : public pWidget { GtkTextBuffer *textBuffer; GtkTextMark *textCursor; + bool focused(); void setColumns(unsigned columns); void setLength(unsigned length); void setOffset(unsigned offset); @@ -396,6 +398,7 @@ struct pListView : public pWidget { void append(const lstring &text); void autoSizeColumns(); bool checked(unsigned row); + bool focused(); void modify(unsigned row, const lstring &text); void remove(unsigned row); void reset(); @@ -449,6 +452,7 @@ struct pTextEdit : public pWidget { GtkWidget *subWidget; GtkTextBuffer *textBuffer; + bool focused(); void setCursorPosition(unsigned position); void setEditable(bool editable); void setText(const string &text); diff --git a/higan/phoenix/gtk/widget/hex-edit.cpp b/higan/phoenix/gtk/widget/hex-edit.cpp index 9c0dbdef..ec10cd7c 100755 --- a/higan/phoenix/gtk/widget/hex-edit.cpp +++ b/higan/phoenix/gtk/widget/hex-edit.cpp @@ -7,6 +7,10 @@ static bool HexEdit_scroll(GtkRange *range, GtkScrollType scroll, gdouble value, return false; } +bool pHexEdit::focused() { + return GTK_WIDGET_HAS_FOCUS(subWidget); +} + void pHexEdit::setColumns(unsigned columns) { setScroll(); update(); diff --git a/higan/phoenix/gtk/widget/list-view.cpp b/higan/phoenix/gtk/widget/list-view.cpp index 5572c1f7..10e1d439 100755 --- a/higan/phoenix/gtk/widget/list-view.cpp +++ b/higan/phoenix/gtk/widget/list-view.cpp @@ -35,6 +35,10 @@ bool pListView::checked(unsigned row) { return state; } +bool pListView::focused() { + return GTK_WIDGET_HAS_FOCUS(subWidget); +} + void pListView::modify(unsigned row, const lstring &text) { GtkTreeModel *model = gtk_tree_view_get_model(GTK_TREE_VIEW(subWidget)); GtkTreeIter iter; diff --git a/higan/phoenix/gtk/widget/text-edit.cpp b/higan/phoenix/gtk/widget/text-edit.cpp index 08812fb3..2d2b740b 100755 --- a/higan/phoenix/gtk/widget/text-edit.cpp +++ b/higan/phoenix/gtk/widget/text-edit.cpp @@ -3,6 +3,10 @@ static void TextEdit_change(TextEdit *self) { if(self->p.locked == false && self->onChange) self->onChange(); } +bool pTextEdit::focused() { + return GTK_WIDGET_HAS_FOCUS(subWidget); +} + void pTextEdit::setCursorPosition(unsigned position) { GtkTextMark *mark = gtk_text_buffer_get_mark(textBuffer, "insert"); GtkTextIter iter; diff --git a/higan/phoenix/gtk/widget/widget.cpp b/higan/phoenix/gtk/widget/widget.cpp index dceb8266..aa4eacfa 100755 --- a/higan/phoenix/gtk/widget/widget.cpp +++ b/higan/phoenix/gtk/widget/widget.cpp @@ -1,11 +1,15 @@ -Geometry pWidget::minimumGeometry() { - return { 0, 0, 0, 0 }; -} - bool pWidget::enabled() { return gtk_widget_get_sensitive(gtkWidget); } +bool pWidget::focused() { + return GTK_WIDGET_HAS_FOCUS(gtkWidget); +} + +Geometry pWidget::minimumGeometry() { + return {0, 0, 0, 0}; +} + void pWidget::setEnabled(bool enabled) { if(widget.state.abstract) enabled = false; if(sizable.state.layout && sizable.state.layout->enabled() == false) enabled = false; diff --git a/higan/phoenix/gtk/window.cpp b/higan/phoenix/gtk/window.cpp index ae1521a3..b2457b5e 100755 --- a/higan/phoenix/gtk/window.cpp +++ b/higan/phoenix/gtk/window.cpp @@ -30,6 +30,7 @@ static gboolean Window_expose(GtkWidget *widget, GdkEvent *event, Window *window static gboolean Window_configure(GtkWidget *widget, GdkEvent *event, Window *window) { if(gtk_widget_get_realized(window->p.widget) == false) return false; + if(window->visible() == false) return false; GdkWindow *gdkWindow = gtk_widget_get_window(widget); GdkRectangle border, client; diff --git a/higan/phoenix/qt/platform.moc b/higan/phoenix/qt/platform.moc index bf31cfa0..b02a5cd0 100755 --- a/higan/phoenix/qt/platform.moc +++ b/higan/phoenix/qt/platform.moc @@ -1,7 +1,7 @@ /**************************************************************************** ** Meta object code from reading C++ file 'platform.moc.hpp' ** -** Created: Thu Aug 9 18:10:14 2012 +** Created: Fri Dec 21 17:46:20 2012 ** by: The Qt Meta Object Compiler version 62 (Qt 4.6.3) ** ** WARNING! All changes made in this file will be lost! diff --git a/higan/phoenix/qt/platform.moc.hpp b/higan/phoenix/qt/platform.moc.hpp index 9e75fdc8..6a3909bf 100755 --- a/higan/phoenix/qt/platform.moc.hpp +++ b/higan/phoenix/qt/platform.moc.hpp @@ -266,6 +266,7 @@ struct pWidget : public pSizable { Widget &widget; QWidget *qtWidget; + bool focused(); virtual Geometry minimumGeometry(); void setEnabled(bool enabled); void setFocused(); diff --git a/higan/phoenix/qt/widget/widget.cpp b/higan/phoenix/qt/widget/widget.cpp index 0bc4901c..27d23354 100755 --- a/higan/phoenix/qt/widget/widget.cpp +++ b/higan/phoenix/qt/widget/widget.cpp @@ -1,5 +1,9 @@ +bool pWidget::focused() { + return qtWidget->hasFocus(); +} + Geometry pWidget::minimumGeometry() { - return { 0, 0, 0, 0 }; + return {0, 0, 0, 0}; } void pWidget::setEnabled(bool enabled) { diff --git a/higan/phoenix/reference/platform.hpp b/higan/phoenix/reference/platform.hpp index 3acc9d55..cd9e4152 100755 --- a/higan/phoenix/reference/platform.hpp +++ b/higan/phoenix/reference/platform.hpp @@ -183,6 +183,7 @@ struct pWidget : public pSizable { Widget &widget; bool enabled(); + bool focused(); Geometry minimumGeometry(); void setEnabled(bool enabled); void setFocused(); diff --git a/higan/phoenix/reference/widget/widget.cpp b/higan/phoenix/reference/widget/widget.cpp index 49a6c79e..d9c86478 100755 --- a/higan/phoenix/reference/widget/widget.cpp +++ b/higan/phoenix/reference/widget/widget.cpp @@ -2,8 +2,12 @@ bool pWidget::enabled() { return false; } +bool pWidget::focused() { + return false; +} + Geometry pWidget::minimumGeometry() { - return { 0, 0, 0, 0 }; + return {0, 0, 0, 0}; } void pWidget::setEnabled(bool enabled) { diff --git a/higan/phoenix/windows/platform.hpp b/higan/phoenix/windows/platform.hpp index 56277a92..d14685b2 100755 --- a/higan/phoenix/windows/platform.hpp +++ b/higan/phoenix/windows/platform.hpp @@ -223,6 +223,7 @@ struct pWidget : public pSizable { HFONT hfont; bool enabled(); + bool focused(); virtual Geometry minimumGeometry(); void setEnabled(bool enabled); void setFocused(); diff --git a/higan/phoenix/windows/widget/widget.cpp b/higan/phoenix/windows/widget/widget.cpp index b0e60c7d..d8c25c9b 100755 --- a/higan/phoenix/windows/widget/widget.cpp +++ b/higan/phoenix/windows/widget/widget.cpp @@ -2,8 +2,12 @@ bool pWidget::enabled() { return IsWindowEnabled(hwnd); } +bool pWidget::focused() { + return GetFocus() == hwnd; +} + Geometry pWidget::minimumGeometry() { - return { 0, 0, 0, 0 }; + return {0, 0, 0, 0}; } void pWidget::setEnabled(bool enabled) { diff --git a/higan/profile/BS-X Satellaview.sfc/manifest.bml b/higan/profile/BS-X Satellaview.sfc/manifest.bml deleted file mode 100644 index c0126207..00000000 --- a/higan/profile/BS-X Satellaview.sfc/manifest.bml +++ /dev/null @@ -1,9 +0,0 @@ -cartridge region=NTSC - bsx - rom name=program.rom size=0x100000 - ram id=save name=save.ram size=0x8000 - ram id=download name=bsx.ram size=0x40000 - map id=io address=00-3f,80-bf:5000-5fff - map id=rom address=00-3f,80-bf:8000-ffff - map id=rom address=40-7f,c0-ff:0000-7fff - map id=ram address=20-3f:6000-7fff diff --git a/higan/profile/Sufami Turbo.sfc/manifest.bml b/higan/profile/Sufami Turbo.sfc/manifest.bml deleted file mode 100644 index d7fd3d14..00000000 --- a/higan/profile/Sufami Turbo.sfc/manifest.bml +++ /dev/null @@ -1,10 +0,0 @@ -cartridge region=NTSC - rom name=program.rom size=0x40000 - map id=rom address=00-1f,80-9f:8000-ffff mask=0x8000 - sufamiturbo - slot id=A - map id=rom address=20-3f,a0-bf:8000-ffff mask=0x8000 - map id=ram address=60-63,e0-e3:8000-ffff - slot id=B - map id=rom address=40-5f,c0-df:8000-ffff mask=0x8000 - map id=ram address=70-73,f0-f3:8000-ffff diff --git a/higan/profile/Super Game Boy.sfc/boot.rom b/higan/profile/Super Game Boy.sfc/boot.rom deleted file mode 100755 index 2bece74809a9d8ed6d3b92e021093c69c28a94fe..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 256 zcmXr~_utOo0mFL5|MQJb*C_l}RQt~-XxCu$h{x{pBO|-=a=Skd+!f;w@Nuj+;#K$~ z=+9{Pn~&`)8-tXzQG+|L!Vja5MtpqNnEt(2cqPcfs3_1Nb@npD*((gf)&EQsJ_|l$ zVB?SyR#IkF_-QBkN?@j<{!Bg|TMZ7NVL$cwB|h6teBhwSaDb1&j^UA=!6P;SIS#Gx z(@u5*3QTqiAd%BjvI_566<$DiXAd#d{!37}#3yWb5a>kqM-omanifest = manifest; parse_markup(manifest); //print(manifest, "\n\n"); @@ -45,7 +75,15 @@ void Cartridge::load(const string &manifest) { //Sufami Turbo else if(cartridge.has_st_slots()) { - sha256 = nall::sha256(sufamiturbo.slotA.rom.data(), sufamiturbo.slotA.rom.size()); + sha256_ctx sha; + uint8_t hash[32]; + sha256_init(&sha); + sha256_chunk(&sha, sufamiturbo.slotA.rom.data(), sufamiturbo.slotA.rom.size()); + sha256_chunk(&sha, sufamiturbo.slotB.rom.data(), sufamiturbo.slotB.rom.size()); + sha256_final(&sha); + string result; + for(auto &byte : hash) result.append(hex<2>(byte)); + sha256 = result; } //Super Famicom @@ -86,9 +124,10 @@ void Cartridge::load(const string &manifest) { } void Cartridge::load_super_game_boy(const string &manifest) { - XML::Document document(manifest); - auto rom = document["release/cartridge/rom"]; - auto ram = document["release/cartridge/ram"]; + auto document = Markup::Document(manifest); + information.title.gameBoy = document["information/title"].text(); + auto rom = document["cartridge/rom"]; + auto ram = document["cartridge/ram"]; GameBoy::cartridge.load(GameBoy::System::Revision::SuperGameBoy, manifest); @@ -98,8 +137,9 @@ void Cartridge::load_super_game_boy(const string &manifest) { } void Cartridge::load_satellaview(const string &manifest) { - XML::Document document(manifest); - auto rom = document["release/cartridge/rom"]; + auto document = Markup::Document(manifest); + information.title.satellaview = document["information/title"].text(); + auto rom = document["cartridge/rom"]; if(rom["name"].exists()) { unsigned size = numeral(rom["size"].data); @@ -109,9 +149,10 @@ void Cartridge::load_satellaview(const string &manifest) { } void Cartridge::load_sufami_turbo_a(const string &manifest) { - XML::Document document(manifest); - auto rom = document["release/cartridge/rom"]; - auto ram = document["release/cartridge/ram"]; + auto document = Markup::Document(manifest); + information.title.sufamiTurboA = document["information/title"].text(); + auto rom = document["cartridge/rom"]; + auto ram = document["cartridge/ram"]; if(rom["name"].exists()) { unsigned size = numeral(rom["size"].data); @@ -126,15 +167,16 @@ void Cartridge::load_sufami_turbo_a(const string &manifest) { memory.append({ID::SufamiTurboSlotARAM, ram["name"].data}); } - if(document["cartridge"]["linkable"].data == "true") { + if(document["cartridge/linkable"].exists()) { interface->loadRequest(ID::SufamiTurboSlotB, "Sufami Turbo - Slot B", "st"); } } void Cartridge::load_sufami_turbo_b(const string &manifest) { - XML::Document document(manifest); - auto rom = document["release/cartridge/rom"]; - auto ram = document["release/cartridge/ram"]; + auto document = Markup::Document(manifest); + information.title.sufamiTurboB = document["information/title"].text(); + auto rom = document["cartridge/rom"]; + auto ram = document["cartridge/ram"]; if(rom["name"].exists()) { unsigned size = numeral(rom["size"].data); diff --git a/higan/sfc/cartridge/cartridge.hpp b/higan/sfc/cartridge/cartridge.hpp index 6735eb78..eccb9127 100755 --- a/higan/sfc/cartridge/cartridge.hpp +++ b/higan/sfc/cartridge/cartridge.hpp @@ -61,6 +61,17 @@ struct Cartridge : property { }; vector memory; + struct Information { + struct Title { + string cartridge; + string gameBoy; + string satellaview; + string sufamiTurboA; + string sufamiTurboB; + } title; + } information; + string title(); + void load(const string &manifest); void load_super_game_boy(const string &manifest); void load_satellaview(const string &manifest); diff --git a/higan/sfc/cartridge/markup.cpp b/higan/sfc/cartridge/markup.cpp index 5fd2be10..97a834d9 100755 --- a/higan/sfc/cartridge/markup.cpp +++ b/higan/sfc/cartridge/markup.cpp @@ -1,9 +1,13 @@ #ifdef CARTRIDGE_CPP void Cartridge::parse_markup(const char *markup) { - auto cartridge = Markup::Document(markup)["cartridge"]; + auto document = Markup::Document(markup); + auto cartridge = document["cartridge"]; + auto information = document["information"]; region = cartridge["region"].data != "PAL" ? Region::NTSC : Region::PAL; + this->information.title.cartridge = information["title"].text(); + mapping.reset(); parse_markup_cartridge(cartridge); parse_markup_icd2(cartridge["icd2"]); diff --git a/higan/sfc/chip/event-skeleton/event.cpp b/higan/sfc/chip/event-skeleton/event.cpp new file mode 100644 index 00000000..8b5ba938 --- /dev/null +++ b/higan/sfc/chip/event-skeleton/event.cpp @@ -0,0 +1,70 @@ +#include + +#define EVENT_CPP +namespace SuperFamicom { + +Event event; + +void Event::Enter() { event.enter(); } + +void Event::enter() { + while(true) { + if(scheduler.sync == Scheduler::SynchronizeMode::All) { + scheduler.exit(Scheduler::ExitReason::SynchronizeEvent); + } + } + + step(1); + synchronize_cpu(); +} + +void Event::init() { +} + +void Event::load() { +} + +void Event::unload() { + rom[0].reset(); + rom[1].reset(); + rom[2].reset(); + rom[3].reset(); + ram.reset(); +} + +void Event::power() { +} + +void Event::reset() { + create(Event::Enter, 1); +} + +//DSP-1 +uint8 Event::sr(unsigned addr) { + return 0; +} + +//DSP-1 +void Event::dr(unsigned addr, uint8 data) { +} + +//is there bank-switching? +uint8 Event::rom_read(unsigned addr) { + return cpu.regs.mdr; +} + +//is there read-protection? +uint8 Event::ram_read(unsigned addr) { + return cpu.regs.mdr; +} + +//is there write-protection? +void Event::ram_write(unsigned addr, uint8 data) { +} + +void Event::serialize(serializer &s) { + Thread::serialize(s); + s.array(ram.data(), ram.size()); +} + +} diff --git a/higan/sfc/chip/event-skeleton/event.hpp b/higan/sfc/chip/event-skeleton/event.hpp new file mode 100644 index 00000000..75a2cc58 --- /dev/null +++ b/higan/sfc/chip/event-skeleton/event.hpp @@ -0,0 +1,37 @@ +//SNES-EVENT board emulation (skeleton): +//* Campus Challenge '92 +//* Powerfest '94 + +struct Event : Coprocessor { + MappedRAM rom[4]; + MappedRAM ram; + + static void Enter(); + void enter(); + void init(); + void load(); + void unload(); + void power(); + void reset(); + + uint8 sr(unsigned); + void dr(unsigned, uint8 data); + uint8 rom_read(unsigned addr); + uint8 ram_read(unsigned addr); + void ram_write(unsigned addr, uint8 data); + + void serialize(serializer&); + +//private: + enum class Board : unsigned { CampusChallenge92, Powerfest94 } board; + unsigned revision; + unsigned timer; + + string host; + unsigned port; + string path; + string username; + string password; +}; + +extern Event event; diff --git a/higan/sfc/chip/event/event.cpp b/higan/sfc/chip/event/event.cpp index 8b5ba938..9d9d67e5 100644 --- a/higan/sfc/chip/event/event.cpp +++ b/higan/sfc/chip/event/event.cpp @@ -12,10 +12,87 @@ void Event::enter() { if(scheduler.sync == Scheduler::SynchronizeMode::All) { scheduler.exit(Scheduler::ExitReason::SynchronizeEvent); } + + if(scoreActive && scoreSecondsRemaining) { + if(--scoreSecondsRemaining == 0) { + scoreActive = false; + submitScore(); + } + } + + if(timerActive && timerSecondsRemaining) { + if(--timerSecondsRemaining == 0) { + timerActive = false; + status |= 0x02; //time over + scoreActive = true; + scoreSecondsRemaining = 5; + } + } + + step(1); + synchronize_cpu(); + } +} + +void Event::submitScore() { + if(usedSaveState) return; + + string data; + data.append("timer=", timer, ";"); + if(board == Board::CampusChallenge92) { + unsigned mw = 0, fz = 0, pw = 0; + for(unsigned n = 0x0408; n <= 0x040e; n++) mw = mw * 10 + ram.read(n); + for(unsigned n = 0x0413; n >= 0x0410; n--) fz = fz * 10 + ram.read(n); + for(unsigned n = 0x0418; n >= 0x0415; n--) pw = pw * 10 + ram.read(n); + data.append("mw=", mw, ";"); + data.append("fz=", fz, ";"); + data.append("pw=", pw); + } + if(board == Board::Powerfest94) { + unsigned ml = 0, mk[2] = {0}, ba[2] = {0}; + for(unsigned n = 0x0408; n <= 0x040e; n++) ml = ml * 10 + ram.read(n); + for(unsigned n = 0x0413; n >= 0x0412; n--) mk[0] = mk[0] * 10 + ram.read(n); + for(unsigned n = 0x0411; n >= 0x0410; n--) mk[1] = mk[1] * 10 + ram.read(n); + for(unsigned n = 0x0418; n >= 0x0415; n--) ba[0] = ba[0] * 10 + ram.read(n); + for(unsigned n = 0x041a; n >= 0x0419; n--) ba[1] = ba[1] * 10 + ram.read(n); + data.append("ml=", ml, ";"); + data.append("mk=", mk[0], ",", mk[1], ";"); + data.append("ba=", ba[0], ",", ba[1]); } - step(1); - synchronize_cpu(); + lstring side = interface->server().split<1>("@"); + string username = side(0).split<1>(":")(0); + string password = side(0).split<1>(":")(1); + side(1).ltrim<1>("http://"); + string hostname = side(1).split<1>("/")(0); + string hostpath = side(1).split<1>("/")(1); + side = hostname.split<1>(":"); + hostname = side(0); + string hostport = side(1); + if(hostport.empty()) hostport = "80"; + + http server; + if(server.connect(hostname, decimal(hostport))) { + string content = { + "username:", username, "\n", + "password:", password, "\n", + "emulator:bsnes\n", + "sha256:", interface->sha256(), "\n", + "\n", + data + }; + string packet = { + "POST /", hostpath, " HTTP/1.0\r\n", + "Host: ", hostname, "\r\n", + "Connection: close\r\n", + "Content-Type: application/octet-stream\r\n", + "Content-Length: ", content.length(), "\r\n", + "\r\n", + content + }; + server.send(packet); + server.disconnect(); + } } void Event::init() { @@ -33,38 +110,88 @@ void Event::unload() { } void Event::power() { + usedSaveState = false; } void Event::reset() { create(Event::Enter, 1); + for(unsigned n = 0; n < ram.size(); n++) ram.write(n, 0x00); + status = 0x00; + select = 0x00; + timerActive = false; + scoreActive = false; + timerSecondsRemaining = 0; + scoreSecondsRemaining = 0; + usedSaveState = false; } -//DSP-1 -uint8 Event::sr(unsigned addr) { - return 0; +uint8 Event::sr(unsigned) { + return status; } -//DSP-1 -void Event::dr(unsigned addr, uint8 data) { +void Event::dr(unsigned, uint8 data) { + select = data; + if(timer && data == 0x09) { + timerActive = true; + timerSecondsRemaining = timer; + } } -//is there bank-switching? uint8 Event::rom_read(unsigned addr) { + if(board == Board::CampusChallenge92) { + unsigned id = 0; + if(select == 0x09) id = 1; + if(select == 0x05) id = 2; + if(select == 0x03) id = 3; + if((addr & 0x808000) == 0x808000) id = 0; + + if(addr & 0x008000) { + addr = ((addr & 0x7f0000) >> 1) | (addr & 0x7fff); + return rom[id].read(bus.mirror(addr, rom[id].size())); + } + } + + if(board == Board::Powerfest94) { + unsigned id = 0; + if(select == 0x09) id = 1; + if(select == 0x0c) id = 2; + if(select == 0x0a) id = 3; + if((addr & 0x208000) == 0x208000) id = 0; + + if(addr & 0x400000) { + addr &= 0x3fffff; + return rom[id].read(bus.mirror(addr, rom[id].size())); + } + + if(addr & 0x008000) { + addr &= 0x1fffff; + if(id != 2) addr = ((addr & 0x1f0000) >> 1) | (addr & 0x7fff); + return rom[id].read(bus.mirror(addr, rom[id].size())); + } + } + return cpu.regs.mdr; } -//is there read-protection? uint8 Event::ram_read(unsigned addr) { - return cpu.regs.mdr; + return ram.read(bus.mirror(addr, ram.size())); } -//is there write-protection? void Event::ram_write(unsigned addr, uint8 data) { + return ram.write(bus.mirror(addr, ram.size()), data); } void Event::serialize(serializer &s) { Thread::serialize(s); s.array(ram.data(), ram.size()); + s.integer(status); + s.integer(select); + s.integer(timerActive); + s.integer(scoreActive); + s.integer(timerSecondsRemaining); + s.integer(scoreSecondsRemaining); + + usedSaveState = true; } } diff --git a/higan/sfc/chip/event/event.hpp b/higan/sfc/chip/event/event.hpp index 75a2cc58..ae6a9c00 100644 --- a/higan/sfc/chip/event/event.hpp +++ b/higan/sfc/chip/event/event.hpp @@ -1,4 +1,4 @@ -//SNES-EVENT board emulation (skeleton): +//SNES-EVENT board emulation: //* Campus Challenge '92 //* Powerfest '94 @@ -14,6 +14,8 @@ struct Event : Coprocessor { void power(); void reset(); + void submitScore(); + uint8 sr(unsigned); void dr(unsigned, uint8 data); uint8 rom_read(unsigned addr); @@ -27,11 +29,16 @@ struct Event : Coprocessor { unsigned revision; unsigned timer; - string host; - unsigned port; - string path; - string username; - string password; + uint8 status; + uint8 select; + + bool timerActive; + bool scoreActive; + + unsigned timerSecondsRemaining; + unsigned scoreSecondsRemaining; + + bool usedSaveState; }; extern Event event; diff --git a/higan/sfc/interface/interface.cpp b/higan/sfc/interface/interface.cpp index 6e789522..75591447 100755 --- a/higan/sfc/interface/interface.cpp +++ b/higan/sfc/interface/interface.cpp @@ -4,6 +4,10 @@ namespace SuperFamicom { Interface *interface = nullptr; +string Interface::title() { + return cartridge.title(); +} + double Interface::videoFrequency() { switch(system.region()) { default: case System::Region::NTSC: return system.cpu_frequency() / (262.0 * 1364.0 - 4.0); @@ -372,10 +376,10 @@ Interface::Interface() { information.capability.states = true; information.capability.cheats = true; - media.append({ID::SuperFamicom, "Super Famicom", "sfc"}); - media.append({ID::SuperFamicom, "Super Famicom", "gb", "Super Game Boy.sfc"}); - media.append({ID::SuperFamicom, "Super Famicom", "bs", "BS-X Satellaview.sfc"}); - media.append({ID::SuperFamicom, "Super Famicom", "st", "Sufami Turbo.sfc"}); + media.append({ID::SuperFamicom, "Super Famicom", "sfc", true}); + media.append({ID::SuperFamicom, "Super Game Boy", "gb", false}); + media.append({ID::SuperFamicom, "BS-X Satellaview", "bs", false}); + media.append({ID::SuperFamicom, "Sufami Turbo", "st", false}); { Device device{0, ID::Port1 | ID::Port2, "Controller"}; diff --git a/higan/sfc/interface/interface.hpp b/higan/sfc/interface/interface.hpp index f75568fc..001636fe 100755 --- a/higan/sfc/interface/interface.hpp +++ b/higan/sfc/interface/interface.hpp @@ -81,6 +81,7 @@ struct ID { }; struct Interface : Emulator::Interface { + string title(); double videoFrequency(); double audioFrequency(); diff --git a/higan/target-ethos/general/browser.cpp b/higan/target-ethos/general/browser.cpp index 45b95505..1602d659 100755 --- a/higan/target-ethos/general/browser.cpp +++ b/higan/target-ethos/general/browser.cpp @@ -6,15 +6,15 @@ Browser::Browser() { windowManager->append(this, "Browser"); layout.setMargin(5); - pathBrowse.setText("Browse ..."); - pathUp.setText(".."); + homeButton.setImage({resource::home, sizeof resource::home}); + upButton.setImage({resource::up, sizeof resource::up}); openButton.setText("Open"); append(layout); layout.append(pathLayout, {~0, 0}, 5); pathLayout.append(pathEdit, {~0, 0}, 5); - pathLayout.append(pathBrowse, {0, 0}, 5); - pathLayout.append(pathUp, {0, 0}); + pathLayout.append(homeButton, {28, 28}, 5); + pathLayout.append(upButton, {28, 28}); layout.append(fileList, {~0, ~0}, 5); layout.append(controlLayout, {~0, 0}); controlLayout.append(filterLabel, {~0, 0}, 5); @@ -27,17 +27,14 @@ Browser::Browser() { setPath(path); }; - pathBrowse.onActivate = [&] { - string path = DialogWindow::folderSelect(*this, this->path); - if(!path.empty()) setPath(path); + homeButton.onActivate = [&] { + string pathname = {userpath(), "Emulation/"}; + directory::create(pathname); + setPath(pathname); }; - pathUp.onActivate = [&] { - if(this->path == "/") return; - string path = this->path; - path.rtrim<1>("/"); - path = dir(path); - setPath(path); + upButton.onActivate = [&] { + setPath(parentdir(path)); }; fileList.onChange = {&Browser::synchronize, this}; @@ -91,24 +88,6 @@ void Browser::bootstrap() { config.save(application->path("paths.cfg")); } -void Browser::inputEvent(unsigned scancode, int16_t value) { - if(scancode == keyboard(0)[nall::Keyboard::Escape] && value == 0) onClose(); - - //proof of concept only, not very useful: - //joypad up/down moves around in the file list, any joypad button loads selected game - if(fileList.selected() == false) return; - unsigned selection = fileList.selection(); - - if(Joypad::isAnyHat(scancode)) { - if(value & Joypad::HatUp ) fileList.setSelection(selection - 1); - if(value & Joypad::HatDown) fileList.setSelection(selection + 1); - } - - if(Joypad::isAnyButton(scancode) && value == 1) { - fileList.onActivate(); - } -} - string Browser::select(const string &title, const string &extension) { this->extension = extension; @@ -134,9 +113,20 @@ string Browser::select(const string &title, const string &extension) { outputFilename = ""; dialogActive = true; - while(dialogActive == true) { + bool backspace = false; + using phoenix::Keyboard; + + while(dialogActive) { OS::processEvents(); - inputManager->poll(); + if(Keyboard::pressed(Keyboard::Scancode::Escape)) onClose(); + if(Keyboard::pressed(Keyboard::Scancode::Backspace)) { + if(backspace == false) { + backspace = true; + if(fileList.focused()) upButton.onActivate(); + } + } else { + backspace = false; + } usleep(20 * 1000); } @@ -165,7 +155,7 @@ void Browser::setPath(const string &path, unsigned selection) { string name = filename; name.rtrim<1>("/"); fileList.append(name); - fileList.setImage(filenameList.size(), 0, image(resource::folder, sizeof resource::folder)); + fileList.setImage(filenameList.size(), 0, {resource::folder, sizeof resource::folder}); filenameList.append(filename); } } @@ -176,23 +166,11 @@ void Browser::setPath(const string &path, unsigned selection) { string name = filename; name.rtrim<1>(suffix); fileList.append(name); - fileList.setImage(filenameList.size(), 0, image(resource::file, sizeof resource::file)); + fileList.setImage(filenameList.size(), 0, {resource::game, sizeof resource::game}); filenameList.append(filename); } } - /* file loading: deprecated for ananke - for(auto &filename : contents) { - string suffix = {".", this->extension}; - if(filename.endswith(suffix)) { - string name = filename; - name.rtrim<1>(suffix); - fileList.append(name); - fileList.setImage(filenameList.size(), 0, image(resource::file, sizeof resource::file)); - filenameList.append(filename); - } - }*/ - fileList.setSelection(selection); fileList.setFocused(); synchronize(); diff --git a/higan/target-ethos/general/browser.hpp b/higan/target-ethos/general/browser.hpp index 0b51dc40..d3beea4e 100755 --- a/higan/target-ethos/general/browser.hpp +++ b/higan/target-ethos/general/browser.hpp @@ -2,15 +2,14 @@ struct Browser : Window { VerticalLayout layout; HorizontalLayout pathLayout; LineEdit pathEdit; - Button pathBrowse; - Button pathUp; + Button homeButton; + Button upButton; ListView fileList; HorizontalLayout controlLayout; Label filterLabel; Button openButton; string select(const string &title, const string &extension); - void inputEvent(unsigned scancode, int16_t value); void saveConfiguration(); void synchronize(); void bootstrap(); diff --git a/higan/target-ethos/general/presentation.cpp b/higan/target-ethos/general/presentation.cpp index df0b4c12..ad82a59f 100755 --- a/higan/target-ethos/general/presentation.cpp +++ b/higan/target-ethos/general/presentation.cpp @@ -58,9 +58,8 @@ Presentation::Presentation() : active(nullptr) { setMenuVisible(); setStatusVisible(); - fileMenu.setText("File"); - fileLoad.setText("Load Game ..."); loadMenu.setText("Library"); + loadImport.setText("Import Game ..."); settingsMenu.setText("Settings"); videoMenu.setText("Video"); centerVideo.setText("Center"); @@ -86,13 +85,11 @@ Presentation::Presentation() : active(nullptr) { cheatEditor.setText("Cheat Editor"); synchronizeTime.setText("Synchronize Time"); - if(application->ananke.opened()) append(fileMenu); - fileMenu.append(fileLoad); append(loadMenu); for(auto &item : loadListSystem) loadMenu.append(*item); - if(loadListSubsystem.size() > 0) { - loadMenu.append(*new Separator); - for(auto &item : loadListSubsystem) loadMenu.append(*item); + if(application->ananke.opened()) { + loadMenu.append(loadSeparator); + loadMenu.append(loadImport); } for(auto &systemItem : emulatorList) append(systemItem->menu); append(settingsMenu); @@ -120,7 +117,7 @@ Presentation::Presentation() : active(nullptr) { onSize = [&] { utility->resize(); }; onClose = [&] { application->quit = true; }; - fileLoad.onActivate = [&] { + loadImport.onActivate = [&] { if(application->ananke.opened() == false) return; function browse = application->ananke.sym("ananke_browse"); if(browse == false) return; @@ -156,17 +153,13 @@ void Presentation::bootstrap() { iEmulator->interface = emulator; for(auto &media : emulator->media) { + if(media.bootable == false) continue; //do not add sub-cartridge slot entries to menu Item *item = new Item; item->onActivate = [=, &media] { utility->loadMedia(iEmulator->interface, media); }; - if(media.load.empty()) { - item->setText({media.name, " ..."}); - loadListSystem.append(item); - } else { - item->setText({nall::basename(media.load), " ..."}); - loadListSubsystem.append(item); - } + item->setText({media.name, " ..."}); + loadListSystem.append(item); } iEmulator->menu.setText(emulator->information.name); diff --git a/higan/target-ethos/general/presentation.hpp b/higan/target-ethos/general/presentation.hpp index 365dc97f..da260008 100755 --- a/higan/target-ethos/general/presentation.hpp +++ b/higan/target-ethos/general/presentation.hpp @@ -20,11 +20,10 @@ struct Presentation : Window { }; vector emulatorList; - Menu fileMenu; - Item fileLoad; Menu loadMenu; vector loadListSystem; - vector loadListSubsystem; + Separator loadSeparator; + Item loadImport; Menu settingsMenu; Menu videoMenu; RadioItem centerVideo; diff --git a/higan/target-ethos/input/input.cpp b/higan/target-ethos/input/input.cpp index 31d4179d..4419107b 100755 --- a/higan/target-ethos/input/input.cpp +++ b/higan/target-ethos/input/input.cpp @@ -230,9 +230,6 @@ void InputManager::poll() { for(unsigned n = 0; n < Scancode::Limit; n++) { if(scancode[0][n] != scancode[1][n]) { - if(browser->focused()) { - browser->inputEvent(n, scancode[activeScancode][n]); - } if(settings->focused()) { inputSettings->inputEvent(n, scancode[activeScancode][n]); hotkeySettings->inputEvent(n, scancode[activeScancode][n]); diff --git a/higan/target-ethos/resource/cabinet.png b/higan/target-ethos/resource/cabinet.png deleted file mode 100644 index 1d6ce3151066958fc5b5ce763e9f08314429a999..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 667 zcmV;M0%ZM(P)py19{ zU5GARx)6%=UnpJcs)$u^qk;=TTxjdUg@u-yYOML_Waho=VkV|0oylY-(1jj&FvHyQ z?zwmFJ@6m@I%3@dE?vmqAf9}bjCT#~fN5zAQMVSCKFx+wcd{?0e>W0{rb=fX`mg|$_^@-w%+g>?5%bFItQ~k2ka{;NNr!dmTn7(tfzWQzR{?lj64+9H0e{M_`pS;9edrK`u z@+Jn3oFtY$&gH2op1=6mkuTv#Hj*jc&0h(f+`&AB$;X~weFbRS1mMG0o3*m;IrVVH zppZ)-su5CvvH(~wYfg_QyRXa+2=HdbqL9N^fZ=&p!q-B=O8~+{qwwBI`B7lM|^}WaERHA!RuWr zZcp0YmEnxx3hH zFtiW&5PLGBs6!alh$63HAB`vl)Po2ZgqHF?8qo+)21_Pwl002ovPDHLkV1ni` BH>3an diff --git a/higan/target-ethos/resource/file.png b/higan/target-ethos/resource/file.png deleted file mode 100644 index 5b7e64910e6b549d37a0f0c0063f8b73aa15fe5a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 844 zcmV-S1GD^zP)iTsi)!sWzk*lz?LPeE-Uo}T%@-s zQdt!whEz-vJ1kmTj`L?S6+1r3isN|f_r3T0B?JF^h;-oU>gq$5Wj8>jltN00a}H~5 zXkFKZYusNN19n~4eZ0B3`5Nz+jSvZOeQ|M7J@>AkgHN z>rh<$^T)@><@90FtOq5CT`#4isw%Q9LkPji$w}y!WjUBX#lnjvh)t-q##$RHVb^tG z-qLYg&4AZ3&E97aOX8dh40u33%PA&~k|5Q-?|ZDZ;YH+WkHOY;jdN~RhNA$)3kxC0 zvW%*#26OAW4sv);D5XZ59L+#VwFe-j9QeZ+L!RdWtWs)qS)K)up6ApDaVVt*40x&1 zs<;%Zj-f9$vHt$-d(GoIvD@ud1DN_E8c-#KV6)j!mgUG`o6QET^IgQ>!(=g`yQ?JBsgD3{P*Qjq^F>gQvT}u{?*yp zSs0wtxhRUo#nbYe=lKqJ2mA!~DS!%ibANyT`TYF+6HqR$zB2MWr)e655P$CO?!Ex; z0R?;qT%1}CyaiqZTfjU|{1@?ur(|p32k;H}4HJJ(pEoX^0j(=%hr8x)+GM1_(Nr{gdepj+bg-;!Hp8!ZtGP zkKPl6+^slId#p6YR?a5#8>U?U>+ktE^J21=v zZ_|sGk^UCh3$LI=qm)94CVSx({Do<9>GgpVd-?8s>dwo7Y%e>sFyL=|!IqXTiW3(= zYXrFc;Q`#6qo6^HBAMQdIX+C)#p6X0wk3bgYqQm!(}6%-2C@%qw7rH_N)s0mKtvD` z%tT$_f}v0Xxy!HPHnfpXud}u0@LW#J>Odr(e$@6;%Rsw0jcY-mG=7f!^^^Fy&!=9{ zI!FkK)^3dP5vne|Ija*D9mw{uU5gCl((7zL^;Pnt|3tg_sB=Fv28D^B`zQ=VDU=BL zD@XAfmXU9N#1^FDPTUb7+rxHWE2!VhIA_@^fDPu;csSFgZ9>ZJM zLbk2bsRZ#QfU1YzVKe znQZGCM=3cRhll|5ODNz_vA)q}$=4~2oepf5sri~U&4@_oLI5JA$*I{#Sz%aJSoIw! z!wQ`E>>bntk5Q;u?1)S)WCS2D;p4N-p7^9F*WSTtS`!r%Q5eZZC_9OWpmXEo-rYy; z-G2Pc^+?>X643~Znx!mQz8$l+1u;w#E!{Y|49@NU6t$k(g=r&5{))c|`umCDGez^p zb?nA(Aj(9P!d|p`>IB@pjL3A$&FUr+4?TmGT8>%Wh?QE72qZeTP}}uW5>z24`is8j zKT-Wljzo>$=@evo*@no0V*6U#Pc`A+xI|+0Zj|AG2*vY%M(4(ZaYU_HIIDJ}CG1IS zG@ud<=#e4x@&1zb+{feM6#=F}q&sbE#a2|J0ST@^C{E&j{05*gYCG`8-@{nag{tic zg*9l9s(SS35dN_{i_Z#BhR~>ks{46MEnS1oe-U;q_%|;?;U;F|TC~iiKwpRe%jt0nV@AV)V&XTu5cE zZSlz%W^*U_Zg4b_NW3)I=f3}``}BkT90kl!qkP=I1X2mW0-Txg+cRAGb{m(QbHm?} zMIDB!UxxTDSV{bmAxeXN?$KfQN8K-TEGAwCPy~*LTUr^w2m$O^L=Z2Zpl)Mt?Ro5xYIjv@p6rsv!2)UUw6hoYYF#9e*gdg07*qoM6N<$f+&dEi2wiq literal 0 HcmV?d00001 diff --git a/higan/target-ethos/resource/home.png b/higan/target-ethos/resource/home.png index a3ca103e3511e4e013f19b5271d7fde2daef118b..a46fb2220648f4640d48fc34273682db5fc53415 100755 GIT binary patch literal 606 zcmV-k0-^nhP)zpi=LK3kbe)ph6$1us|E@0bs(3;j70N?ldxwS=dZZ43B3h07Tynj^2Yc@GQ zog*HPBZLSEeBTewh7gSA^VD1y1GodMPMto({n9-)s&51E$;vZU9zR8k5p<`8FhN|A1evk_=AdpfbrNok-0q9`y@lykUZ{9CDA`)68V_>uX4$tQ( z0GBRKb2S=6>TxbhlkH7H6&U>${F{F7rSIMjqS-ib^#eg962Z1@5{U!?i4YKr#c&*F s0J1DA{1>jzIOV literal 1774 zcmVX>3&26~}*fd2cq4$6&{HFnA2O$P@^>+9F2?x;Sc3rJ^dd zX^MoDs7fM1R0XNu+DiG9PZ3d-E)oQ~P*y2vE0qQnH3W&c4TK1qKw{!zFxX%`*kjN3 z?!Emm3tom*%7-55N_XBp@0|ZR=YP)J2mjBqPs*47AjGY`Fy~=yh=+M;KlmuMr?H{o ziI$q0+S9$g{edyxcp5(W!U61o#)#JMESNWMLEEfZ;oQ&=Bk44!`}zj*LGYa)LidB% zlMkZ&J6I75g-)+pzI<_8TU!_@aX`fPS>D>(6!yHo{t>?Ug#g&E)Q@UwYX08Y**UAe zu~8x=CaI~k;t{Qnws&+qv1Ik?TB%CvLSTo6aKpnC zj3J~H#yO00AO!WbwULor?yKLmw)TLv|9Gej?1lv~&pWbg&6?Rwt*shs!5CZ+U@u)F zxOIy&!$Vvhyur$3lICcXacjvshXX8dabRF%G@U;9J!75~#RN^0svOv>)RVO}HScw9 z*wEJ0-mXy!q{JD6y?BxFn>TrXXpqE9+gNq#6#q@c=t++fm6C9Y6FA4*#>U#2iNsR} zw0`Rt==;jR0j+-)Z)n)|m9DNCUL;bC+FIPm2G7CgRq{rb3=NVb6i z%!LbFN~gIJ2{ZrA-N^cSf*?RjiIfs+EknP0gY@3LEKk&7gdk-M7I4myN~d%EH*TCy z2f^AckShCC0KbRXQLRrb?d)9nrL}9L<@Q1dY;P~Yg$tZZr%8W#A?>^OAmee2F+?H} zX3m^REEdBULwLnXyw*8cDf=Ja zxUo4ge||9|*5ZNy^U+6S`}+8Bbd(vJH`DaO3m9Xt))I@w2#3Ry%9qJx$Ye5P&z_~{ z`R7>@3Q-dZaordSC35DoS=)Q{>J@9uy6;1e1kg(567B5*r9dg1F$CS+jC}q%-6JE+ ze)UzFUwjeg97-t?i3GmyW38<$V+_9UQ&UqzZ0S-u4jtmGl-$Tzq!2;O~{YnLzcp|vbJc#y=pbvWnHS`&>%OG%pSyu24e5Q#(xx3sYM z?YFtq*huf#7>!yJDS?olhgQl>YeP3MK;hUiE({KG>Cs17e&h(@dGi49JP*(FCOMw! zeB$yv4=<5m;r{)MtzON4Mn`!>DdJKh#qH*+05G3@M(+4=PWJZ`tY6P#hYus;ah!8V zDG@^4m-DIFkeTSD)^*U9H|)6M}rKg3Jhwvx~18Js^q zXghJ@TOaiI|D|BqEiuNDFIaMg0IvKE=NyGX0i{%CV}Jj9K;1MBOq6mBTj#W*wXP7*_x;M=^E{HR zNvyRcU?2r3A&MlMkg#$YthLi>RP_(SIfu2DWHO1?RaF3JXlSSa7|#ae@`mwTz^$hWDmP5 zlTT<9K@`TnH@h?0jfHw>O#jh>1nt2m6SAzrkW<%*%=Q}tRboP9pC%r$9&(LA+0sq)ybQD9srhR zz3Fxu)^6aqJl)?FN%nOeOgb)4?+M_zJQ@)DvRBSb2FFH|!GH*69hXP{3*flC1BAti zbJNzAm&ca3iTKDR3xq|-Y2`eKx?tij|4I5$vH1yqf%5H^Fb8J54jK)5$VM-C5%i8b<|k&Kxh=#FG>Ox&>r z4?sb}hlkg>1-vahgJcyDBP0eg&{{(&pkA-x@zeQAv9vj35<}`!ZpEItce&w-qk8xH z6RRw9@QrP7!N5#{!3lE@ZdYYZTfgiFi6Lb!&3aDLCbZTHrTP~zgJ5t59%w*hO&(@4;J>BJ-*}|DX;Zk|IYy` zHv6y4ynX)KSD${HTk;CtEw8mJ{xg7zEw*w>!L7ThmpvQr4KA|!;pg(L^*>*-DR%e2 z4zTP^X89)P&{L0Wh+nvJisNTKBQOc7maH!DZ17d-Hl|D#z)W;v=?>y1v~_Eizc?)x zx6;t^ElxvPyZ>Op^oPWnSbkf3Q~BcQZhu1qI?=cjt$^hA+5^iMJuzq2opZc~*5iO6 zA~+5C{@fuJEm)j$*R=U%&2#LoiHgGnD^O8u-zuJ6^1{lpHMu96jxdnw!)ciIfMn25 zM{grb?|afe+jQ#wJ4zBwjrID|KLSu*YaTC}I%D@URU6~Kw$;;}Xde_0H5feZ9q6P# z)kE2WmHuz%PFBra%+ba=*F0YQF_)lXYwX@wEdJ^GRh!~1J*VmH|7*-(e_r~9*51=R zy0j)=Jr0*`W#)AQlx|~+y5Q*ZtKP^Dq>l?-zh84-2m9=5zo|NYZvGmZ3za1+3w^am zN_P;SG{D-mn3%I)R#&bsDw;Z7PPd;xRU=VR!~9w>awe)wSVvg#EjHL;Ve-;fNW;7$UN5H%srbEu?9xNZ_*4|opG z6T}0j0WDo;sa#lXTicsw-L~k8-&p64jifbcU=}KOpH@J-WVDMm2Q1Fbfd*3^VlENb-g3A-+i;)r@22i&v z5C{g(OJBy171$)6f^l5zKSx44u{i>gj+Yj9P7wp5gkfm!v3{ZpKn#QfBt}|-VF20o z!yZ!Qn*o$d1LsL-7seMPz1~rVf;vT<;CTWbVag^hfA=0;)P!Vs`hQBd@zMvD&fM+Cvu!5JafOCRK^gfWu=}#OW>H6?(47}7;2otGE zs8J(29b?DeAb_F>f(ns{FbLo>!ZK<72?5wNL3)2jnQAD6xad}xzNS}S%pE@x2L_0? zR4`KDu>cI<4{@yIP&NBCJdbDx$hA$F0do#eemulator) { for(auto &media : emulator->media) { - if(!media.load.empty()) continue; if(type != media.type) continue; return utility->loadMedia(emulator, media, {pathname, "/"}); } @@ -39,30 +38,26 @@ void Utility::loadMedia(string pathname) { //load menu option selected void Utility::loadMedia(Emulator::Interface *emulator, Emulator::Interface::Media &media) { - string pathname; - if(!media.load.empty()) pathname = application->path({media.load, "/"}); - if(!directory::exists(pathname)) pathname = browser->select("Load Media", media.type); + string pathname = browser->select({"Load ", media.name}, media.type); if(!directory::exists(pathname)) return; if(!file::exists({pathname, "manifest.bml"})) return; return loadMedia(emulator, media, pathname); } -//load menu cartridge selected or command-line load +//load base cartridge void Utility::loadMedia(Emulator::Interface *emulator, Emulator::Interface::Media &media, const string &pathname) { unload(); setInterface(emulator); path(0) = application->path({media.name, ".sys/"}); path(media.id) = pathname; - if(media.load.empty()) this->pathname.append(pathname); + this->pathname.append(pathname); - string manifest; - manifest.readfile({pathname, "manifest.bml"}); - system().load(media.id, manifest); + system().load(media.id, string::read({pathname, "manifest.bml"})); system().power(); if(this->pathname.size() == 0) this->pathname.append(pathname); presentation->setSystemName(media.name); - load(Markup::Document(manifest)["information/title"].text()); + load(); } //request from emulation core to load non-volatile media folder @@ -72,9 +67,7 @@ void Utility::loadRequest(unsigned id, const string &name, const string &type) { path(id) = pathname; this->pathname.append(pathname); - string manifest; - manifest.readfile({pathname, "manifest.bml"}); - system().load(id, manifest); + system().load(id, string::read({pathname, "manifest.bml"})); } //request from emulation core to load non-volatile media file @@ -107,16 +100,8 @@ void Utility::reset() { system().reset(); } -void Utility::load(string title) { - if(title.empty()) { - for(auto &path : pathname) { - string name = path; - name.rtrim<1>("/"); - title.append(notdir(nall::basename(name)), " + "); - } - title.rtrim<1>(" + "); - } - presentation->setTitle(title); +void Utility::load() { + presentation->setTitle(system().title()); cheatEditor->load({pathname[0], "cheats.bml"}); stateManager->load({pathname[0], "bsnes/states.bsa"}, 1); diff --git a/higan/target-ethos/utility/utility.hpp b/higan/target-ethos/utility/utility.hpp index d804b2ed..14f796fc 100755 --- a/higan/target-ethos/utility/utility.hpp +++ b/higan/target-ethos/utility/utility.hpp @@ -12,7 +12,7 @@ struct Utility { void connect(unsigned port, unsigned device); void power(); void reset(); - void load(string title = ""); + void load(); void unload(); void saveState(unsigned slot); diff --git a/higan/target-laevateinn/Makefile b/higan/target-laevateinn/Makefile deleted file mode 100755 index cdbea5d8..00000000 --- a/higan/target-laevateinn/Makefile +++ /dev/null @@ -1,86 +0,0 @@ -options += debugger - -processors := arm gsu hg51b lr35902 r65816 spc700 upd96050 -include processor/Makefile - -include $(sfc)/Makefile -include $(gb)/Makefile -name := laevateinn - -ui_objects := ui-main ui-settings ui-interface ui-debugger ui-tracer ui-window -ui_objects += ui-console ui-video ui-cpu ui-smp ui-memory ui-breakpoint ui-properties ui-vram -ui_objects += phoenix ruby -ui_objects += $(if $(call streq,$(platform),win),resource) - -# platform -ifeq ($(platform),x) - ruby := audio.alsa -else ifeq ($(platform),osx) - ruby := audio.openal -else ifeq ($(platform),win) - ruby := audio.xaudio2 -endif - -# phoenix -include phoenix/Makefile -link += $(phoenixlink) - -# ruby -include ruby/Makefile -link += $(rubylink) - -# rules -objects := $(ui_objects) $(objects) -objects := $(patsubst %,obj/%.o,$(objects)) - -obj/ui-main.o: $(ui)/main.cpp $(call rwildcard,$(ui)/) -obj/ui-settings.o: $(ui)/settings/settings.cpp $(call rwildcard,$(ui)/*) -obj/ui-interface.o: $(ui)/interface/interface.cpp $(call rwildcard,$(ui)/*) -obj/ui-debugger.o: $(ui)/debugger/debugger.cpp $(call rwildcard,$(ui)/*) -obj/ui-tracer.o: $(ui)/tracer/tracer.cpp $(call rwildcard,$(ui)/*) -obj/ui-window.o: $(ui)/window/window.cpp $(call rwildcard,$(ui)/*) -obj/ui-console.o: $(ui)/console/console.cpp $(call rwildcard,$(ui)/*) -obj/ui-cpu.o: $(ui)/cpu/cpu.cpp $(call rwildcard,$(ui)/*) -obj/ui-smp.o: $(ui)/smp/smp.cpp $(call rwildcard,$(ui)/*) -obj/ui-video.o: $(ui)/video/video.cpp $(call rwildcard,$(ui)/*) -obj/ui-memory.o: $(ui)/memory/memory.cpp $(call rwildcard,$(ui)/*) -obj/ui-breakpoint.o: $(ui)/breakpoint/breakpoint.cpp $(call rwildcard,$(ui)/*) -obj/ui-properties.o: $(ui)/properties/properties.cpp $(call rwildcard,$(ui)/*) -obj/ui-vram.o: $(ui)/vram/vram.cpp $(call rwildcard,$(ui)/*) - -obj/ruby.o: ruby/ruby.cpp $(call rwildcard,ruby/*) - $(call compile,$(rubyflags)) - -obj/phoenix.o: phoenix/phoenix.cpp $(call rwildcard,phoenix/*) - $(call compile,$(phoenixflags)) - -obj/resource.o: $(ui)/resource.rc -# windres --target=pe-i386 $(ui)/resource.rc obj/resource.o - windres $(ui)/resource.rc obj/resource.o - -# targets -build: $(objects) -ifeq ($(platform),osx) - test -d ../$(name).app || mkdir -p ../$(name).app/Contents/MacOS - $(strip $(cpp) -o ../$(name).app/Contents/MacOS/$(name) $(objects) $(link)) -else - $(strip $(cpp) -o out/$(name) $(objects) $(link)) -endif - -install: -ifeq ($(USER),root) - @echo Please do not run make install as root. - @echo The installer needs to know your home directory to install important files. -else ifeq ($(platform),x) - sudo install -D -m 755 out/$(name) $(DESTDIR)$(prefix)/bin/$(name) - - mkdir -p ~/.config/$(name) - cp -R profile/* ~/.config/$(name) - cp data/cheats.xml ~/.config/$(name)/cheats.xml - chmod -R 777 ~/.config/$(name) -endif - -uninstall: -ifeq ($(platform),x) - sudo rm $(DESTDIR)$(prefix)/bin/$(name) -endif diff --git a/higan/target-laevateinn/base.hpp b/higan/target-laevateinn/base.hpp deleted file mode 100755 index dc54dd99..00000000 --- a/higan/target-laevateinn/base.hpp +++ /dev/null @@ -1,53 +0,0 @@ -#if !defined(PROFILE_ACCURACY) - #error "debugger is only compatible with accuracy profile" -#endif - -#include -namespace SFC = SuperFamicom; - -#include -#include -#include -#include -#include -#include -#include -#include -using namespace nall; - -#include -using namespace phoenix; - -#include -using namespace ruby; - -#include "settings/settings.hpp" -#include "interface/interface.hpp" -#include "debugger/debugger.hpp" -#include "tracer/tracer.hpp" -#include "window/window.hpp" -#include "console/console.hpp" -#include "video/video.hpp" -#include "cpu/cpu.hpp" -#include "smp/smp.hpp" -#include "memory/memory.hpp" -#include "breakpoint/breakpoint.hpp" -#include "properties/properties.hpp" -#include "vram/vram.hpp" -extern uint8_t laevateinnLogo[121905]; - -struct Application { - bool quit; - - string basepath; - string userpath; - - string proportionalFont; - string proportionalFontBold; - string monospaceFont; - - Application(int argc, char **argv); - ~Application(); -}; - -extern Application *application; diff --git a/higan/target-laevateinn/breakpoint/breakpoint.cpp b/higan/target-laevateinn/breakpoint/breakpoint.cpp deleted file mode 100755 index c51a9739..00000000 --- a/higan/target-laevateinn/breakpoint/breakpoint.cpp +++ /dev/null @@ -1,238 +0,0 @@ -#include "../base.hpp" -BreakpointEditor *breakpointEditor = nullptr; - -BreakpointEntry::BreakpointEntry() { - static unsigned id = 1; - enable.setText({ "#", id++ }); - addr.setFont(application->monospaceFont); - data.setFont(application->monospaceFont); - type.append("Read", "Write", "Exec"); - source.append("CPU", "SMP", "VRAM", "OAM", "CGRAM"); - - append(enable, {0, 0}, 5); - append(addr, {50, 0}, 5); - append(data, {25, 0}, 5); - append(type, {0, 0}, 5); - append(source, {0, 0}); - - enable.onToggle = [&] { - bool flag = !enable.checked(); - addr.setEnabled(flag); - data.setEnabled(flag); - type.setEnabled(flag); - source.setEnabled(flag); - breakpointEditor->synchronize(); - }; -} - -BreakpointEditor::BreakpointEditor() { - setTitle("Breakpoint Editor"); - - layout.setMargin(5); - for(auto &bp : breakpointEntry) layout.append(bp, {0, 0}, 5); - append(layout); - - setGeometry({128, 128, layout.minimumGeometry().width, layout.minimumGeometry().height - 5}); - synchronize(); - - windowManager->append(this, "BreakpointEditor"); -} - -//enable checkbox toggled on one of the five BreakpointEntry items: -//cache settings to decrease testing overhead whilst debugging -void BreakpointEditor::synchronize() { - breakpoint.reset(); - unsigned id = 0; - for(auto &entry : breakpointEntry) { - id++; - if(entry.enable.checked() == false) continue; - Breakpoint bp; - bp.id = id; - bp.compare = !entry.data.text().empty(); - bp.addr = hex(entry.addr.text()); - bp.data = hex(entry.data.text()); - bp.type = entry.type.selection(); - bp.source = entry.source.selection(); - breakpoint.append(bp); - } - - breakpointReadCPU.reset(); - breakpointWriteCPU.reset(); - breakpointExecCPU.reset(); - - for(auto &bp : breakpoint) if(bp.type == Breakpoint::Read && bp.source == Breakpoint::CPU) breakpointReadCPU.append(bp); - for(auto &bp : breakpoint) if(bp.type == Breakpoint::Write && bp.source == Breakpoint::CPU) breakpointWriteCPU.append(bp); - for(auto &bp : breakpoint) if(bp.type == Breakpoint::Exec && bp.source == Breakpoint::CPU) breakpointExecCPU.append(bp); - - for(auto &bp : breakpointReadCPU) bp.addr = cpuDebugger->mirror(bp.addr); - for(auto &bp : breakpointWriteCPU) bp.addr = cpuDebugger->mirror(bp.addr); - for(auto &bp : breakpointExecCPU) bp.addr = cpuDebugger->mirror(bp.addr); - - breakpointReadSMP.reset(); - breakpointWriteSMP.reset(); - breakpointExecSMP.reset(); - - for(auto &bp : breakpoint) if(bp.type == Breakpoint::Read && bp.source == Breakpoint::SMP) breakpointReadSMP.append(bp); - for(auto &bp : breakpoint) if(bp.type == Breakpoint::Write && bp.source == Breakpoint::SMP) breakpointWriteSMP.append(bp); - for(auto &bp : breakpoint) if(bp.type == Breakpoint::Exec && bp.source == Breakpoint::SMP) breakpointExecSMP.append(bp); - - breakpointReadVRAM.reset(); - breakpointWriteVRAM.reset(); - - for(auto &bp : breakpoint) if(bp.type == Breakpoint::Read && bp.source == Breakpoint::VRAM) breakpointReadVRAM.append(bp); - for(auto &bp : breakpoint) if(bp.type == Breakpoint::Write && bp.source == Breakpoint::VRAM) breakpointWriteVRAM.append(bp); - - breakpointReadOAM.reset(); - breakpointWriteOAM.reset(); - - for(auto &bp : breakpoint) if(bp.type == Breakpoint::Read && bp.source == Breakpoint::OAM) breakpointReadOAM.append(bp); - for(auto &bp : breakpoint) if(bp.type == Breakpoint::Write && bp.source == Breakpoint::OAM) breakpointWriteOAM.append(bp); - - breakpointReadCGRAM.reset(); - breakpointWriteCGRAM.reset(); - - for(auto &bp : breakpoint) if(bp.type == Breakpoint::Read && bp.source == Breakpoint::CGRAM) breakpointReadCGRAM.append(bp); - for(auto &bp : breakpoint) if(bp.type == Breakpoint::Write && bp.source == Breakpoint::CGRAM) breakpointWriteCGRAM.append(bp); -} - -//S-CPU -//===== - -bool BreakpointEditor::testReadCPU(uint24 addr) { - addr = cpuDebugger->mirror(addr); - for(auto &bp : breakpointReadCPU) { - if(bp.addr == addr) { - if(bp.compare && bp.data != cpuDebugger->read(addr)) continue; - debugger->print("Breakpoint #", bp.id, " hit\n"); - return true; - } - } - return false; -} - -bool BreakpointEditor::testWriteCPU(uint24 addr, uint8 data) { - addr = cpuDebugger->mirror(addr); - for(auto &bp : breakpointWriteCPU) { - if(bp.addr == addr) { - if(bp.compare && bp.data != data) continue; - debugger->print("Breakpoint #", bp.id, " hit\n"); - return true; - } - } - return false; -} - -bool BreakpointEditor::testExecCPU(uint24 addr) { - addr = cpuDebugger->mirror(addr); - for(auto &bp : breakpointExecCPU) { - if(bp.addr == addr) { - debugger->print("Breapoint #", bp.id, " hit\n"); - return true; - } - } - return false; -} - -//S-SMP -//===== - -bool BreakpointEditor::testReadSMP(uint16 addr) { - for(auto &bp : breakpointReadSMP) { - if(bp.addr == addr) { - if(bp.compare && bp.data != smpDebugger->read(addr)) continue; - debugger->print("Breakpoint #", bp.id, " hit\n"); - return true; - } - } - return false; -} - -bool BreakpointEditor::testWriteSMP(uint16 addr, uint8 data) { - for(auto &bp : breakpointWriteSMP) { - if(bp.addr == addr) { - if(bp.compare && bp.data != data) continue; - debugger->print("Breakpoint #", bp.id, " hit\n"); - return true; - } - } - return false; -} - -bool BreakpointEditor::testExecSMP(uint16 addr) { - for(auto &bp : breakpointExecSMP) { - if(bp.addr == addr) { - debugger->print("Breapoint #", bp.id, " hit\n"); - return true; - } - } - return false; -} - -//S-PPU -//===== - -bool BreakpointEditor::testReadVRAM(uint16 addr) { - for(auto &bp : breakpointReadVRAM) { - if(bp.addr == addr) { - if(bp.compare && bp.data != SFC::ppu.vram[addr]) continue; - debugger->print("Breakpoint #", bp.id, " hit\n"); - return true; - } - } - return false; -} - -bool BreakpointEditor::testWriteVRAM(uint16 addr, uint8 data) { - for(auto &bp : breakpointWriteVRAM) { - if(bp.addr == addr) { - if(bp.compare && bp.data != data) continue; - debugger->print("Breakpoint #", bp.id, " hit\n"); - return true; - } - } - return false; -} - -bool BreakpointEditor::testReadOAM(uint16 addr) { - for(auto &bp : breakpointReadOAM) { - if(bp.addr == addr) { - if(bp.compare && bp.data != SFC::ppu.oam[addr]) continue; - debugger->print("Breakpoint #", bp.id, " hit\n"); - return true; - } - } - return false; -} - -bool BreakpointEditor::testWriteOAM(uint16 addr, uint8 data) { - for(auto &bp : breakpointWriteOAM) { - if(bp.addr == addr) { - if(bp.compare && bp.data != data) continue; - debugger->print("Breakpoint #", bp.id, " hit\n"); - return true; - } - } - return false; -} - -bool BreakpointEditor::testReadCGRAM(uint16 addr) { - for(auto &bp : breakpointReadCGRAM) { - if(bp.addr == addr) { - if(bp.compare && bp.data != SFC::ppu.cgram[addr]) continue; - debugger->print("Breakpoint #", bp.id, " hit\n"); - return true; - } - } - return false; -} - -bool BreakpointEditor::testWriteCGRAM(uint16 addr, uint8 data) { - for(auto &bp : breakpointWriteCGRAM) { - if(bp.addr == addr) { - if(bp.compare && bp.data != data) continue; - debugger->print("Breakpoint #", bp.id, " hit\n"); - return true; - } - } - return false; -} diff --git a/higan/target-laevateinn/breakpoint/breakpoint.hpp b/higan/target-laevateinn/breakpoint/breakpoint.hpp deleted file mode 100755 index d0a47b61..00000000 --- a/higan/target-laevateinn/breakpoint/breakpoint.hpp +++ /dev/null @@ -1,60 +0,0 @@ -struct BreakpointEntry : HorizontalLayout { - CheckBox enable; - LineEdit addr; - LineEdit data; - ComboBox type; - ComboBox source; - - BreakpointEntry(); -}; - -struct BreakpointEditor : Window { - VerticalLayout layout; - BreakpointEntry breakpointEntry[8]; - - struct Breakpoint { - enum : unsigned { Read, Write, Exec }; - enum : unsigned { CPU, SMP, VRAM, OAM, CGRAM }; - unsigned id; - bool compare; - unsigned addr; - unsigned data; - unsigned type; - unsigned source; - }; - vector breakpoint; - vector breakpointReadCPU; - vector breakpointWriteCPU; - vector breakpointExecCPU; - vector breakpointReadSMP; - vector breakpointWriteSMP; - vector breakpointExecSMP; - vector breakpointReadVRAM; - vector breakpointWriteVRAM; - vector breakpointReadOAM; - vector breakpointWriteOAM; - vector breakpointReadCGRAM; - vector breakpointWriteCGRAM; - void synchronize(); - - bool testReadCPU(uint24 addr); - bool testWriteCPU(uint24 addr, uint8 data); - bool testExecCPU(uint24 addr); - - bool testReadSMP(uint16 addr); - bool testWriteSMP(uint16 addr, uint8 data); - bool testExecSMP(uint16 addr); - - bool testReadVRAM(uint16 addr); - bool testWriteVRAM(uint16 addr, uint8 data); - - bool testReadOAM(uint16 addr); - bool testWriteOAM(uint16 addr, uint8 data); - - bool testReadCGRAM(uint16 addr); - bool testWriteCGRAM(uint16 addr, uint8 data); - - BreakpointEditor(); -}; - -extern BreakpointEditor *breakpointEditor; diff --git a/higan/target-laevateinn/console/about.cpp b/higan/target-laevateinn/console/about.cpp deleted file mode 100755 index b0486cca..00000000 --- a/higan/target-laevateinn/console/about.cpp +++ /dev/null @@ -1,32 +0,0 @@ -#include -AboutWindow *aboutWindow = nullptr; - -AboutWindow::AboutWindow() { - setTitle("About Laevateinn"); -//setResizable(false); - - layout.setMargin(10); - layout.setAlignment(0.5); - canvas.setSize({288, 360}); - title.setFont("Sans, 16, Bold"); - title.setText("Laevateinn"); - version.setFont("Sans, 8, Bold"); - version.setText({"bsnes/debugger v", Emulator::Version}); - website.setFont("Sans, 8, Bold"); - website.setText("http://byuu.org/"); - - layout.append(canvas, {288, 360}); - layout.append(title, {0, 0}); - layout.append(version, {0, 0}); - layout.append(website, {0, 0}); - append(layout); - - image logo(0, 32, 255u << 24, 255u << 16, 255u << 8, 255u << 0); - logo.loadPNG(laevateinnLogo, sizeof laevateinnLogo); - logo.alphaBlend(backgroundColor().rgb()); - canvas.setImage(logo); - canvas.update(); - - setGeometry({128, 128, layout.minimumGeometry().width, layout.minimumGeometry().height}); - windowManager->append(this, "AboutWindow"); -} diff --git a/higan/target-laevateinn/console/console.cpp b/higan/target-laevateinn/console/console.cpp deleted file mode 100755 index aec48e40..00000000 --- a/higan/target-laevateinn/console/console.cpp +++ /dev/null @@ -1,196 +0,0 @@ -#include "../base.hpp" -ConsoleWindow *consoleWindow = nullptr; - -#include "about.cpp" - -ConsoleWindow::ConsoleWindow() { - setTitle({"Console - Laevateinn v", Emulator::Version}); - setGeometry({64, 640, 640, 400}); - setMenuVisible(); - - menuEmulation.setText("&Emulation"); - menuEmulationReloadCartridge.setText("Reload Cartridge"); - menuEmulationPowerCycle.setText("Power Cycle"); - menuEmulationReset.setText("Reset"); - menuEmulationSynchronizeAudio.setText("Synchronize Audio"); - menuEmulationSynchronizeAudio.setChecked(settings->synchronizeAudio); - menuEmulationMuteAudio.setText("Mute Audio"); - menuEmulationMuteAudio.setChecked(settings->muteAudio); - menuEmulation.append(menuEmulationReloadCartridge, menuEmulationPowerCycle, menuEmulationReset, - menuEmulationSeparator, menuEmulationSynchronizeAudio, menuEmulationMuteAudio); - append(menuEmulation); - - menuDebug.setText("&Debug"); - menuDebugCPU.setText("CPU"); - menuDebugCPU.setChecked(debugger->debug.cpu); - menuDebugSMP.setText("SMP"); - menuDebugSMP.setChecked(debugger->debug.smp); - menuDebug.append(menuDebugCPU, menuDebugSMP); - append(menuDebug); - - menuTracer.setText("&Tracer"); - menuTracerEnable.setText("Enable"); - menuTracerMask.setChecked(tracer->mask); - menuTracerMask.setText("Mask"); - menuTracerMaskReset.setText("Reset Mask"); - menuTracer.append(menuTracerEnable, menuTracerMask, menuTracerMaskReset); - append(menuTracer); - - menuWindows.setText("&Windows"); - menuWindowsVideoWindow.setText("Video"); - menuWindowsCPUDebugger.setText("CPU Debugger"); - menuWindowsSMPDebugger.setText("SMP Debugger"); - menuWindowsMemoryEditor.setText("Memory Editor"); - menuWindowsBreakpointEditor.setText("Breakpoint Editor"); - menuWindowsPropertiesViewer.setText("Properties Viewer"); - menuWindowsVRAMViewer.setText("VRAM Viewer"); - menuWindows.append(menuWindowsVideoWindow, menuWindowsSeparator1, menuWindowsCPUDebugger, - menuWindowsSMPDebugger, menuWindowsSeparator2, menuWindowsMemoryEditor, menuWindowsBreakpointEditor, - menuWindowsPropertiesViewer, menuWindowsVRAMViewer); - append(menuWindows); - - menuState.setText("&State"); - menuStateSave1.setText("Save - Slot 1"); - menuStateSave2.setText("Save - Slot 2"); - menuStateSave3.setText("Save - Slot 3"); - menuStateSave4.setText("Save - Slot 4"); - menuStateSave5.setText("Save - Slot 5"); - menuStateLoad1.setText("Load - Slot 1"); - menuStateLoad2.setText("Load - Slot 2"); - menuStateLoad3.setText("Load - Slot 3"); - menuStateLoad4.setText("Load - Slot 4"); - menuStateLoad5.setText("Load - Slot 5"); - menuState.append(menuStateSave1, menuStateSave2, menuStateSave3, menuStateSave4, menuStateSave5, - menuStateSeparator, menuStateLoad1, menuStateLoad2, menuStateLoad3, menuStateLoad4, menuStateLoad5); - append(menuState); - - menuHelp.setText("&Help"); - menuHelpAbout.setText("About ..."); - menuHelp.append(menuHelpAbout); - append(menuHelp); - - layout.setMargin(5); - runButton.setText("Run"); - stepButton.setText("Step"); - clearButton.setText("Clear"); - console.setFont(application->monospaceFont); - - layout.append(commandLayout, {~0, 0}, 5); - commandLayout.append(runButton, {80, ~0}, 5); - commandLayout.append(stepButton, {80, ~0}, 5); - commandLayout.append(spacer, {~0, 0}); - commandLayout.append(clearButton, {80, ~0}); - layout.append(console, {~0, ~0}); - append(layout); - - onClose = [] { application->quit = true; }; - - menuEmulationReloadCartridge.onActivate = [&] { - interface->loadCartridge(interface->pathName); - }; - - menuEmulationPowerCycle.onActivate = [&] { - SFC::system.power(); - print("System power cycled\n"); - }; - - menuEmulationReset.onActivate = [&] { - SFC::system.reset(); - print("System reset\n"); - }; - - menuEmulationSynchronizeAudio.onToggle = [&] { - audio.set(Audio::Synchronize, settings->synchronizeAudio = menuEmulationSynchronizeAudio.checked()); - }; - - menuEmulationMuteAudio.onToggle = [&] { - settings->muteAudio = menuEmulationMuteAudio.checked(); - }; - - menuDebugCPU.onToggle = [&] { debugger->debug.cpu = menuDebugCPU.checked(); }; - menuDebugSMP.onToggle = [&] { debugger->debug.smp = menuDebugSMP.checked(); }; - - menuTracerEnable.onToggle = [&] { tracer->enable(menuTracerEnable.checked()); }; - menuTracerMask.onToggle = [&] { tracer->mask = menuTracerMask.checked(); }; - menuTracerMaskReset.onActivate = [&] { - tracer->resetMask(); - debugger->print("Tracer mask reset\n"); - }; - - menuWindowsVideoWindow.onActivate = [&] { - videoWindow->setVisible(); - videoWindow->setFocused(); - }; - - menuWindowsCPUDebugger.onActivate = [&] { - cpuDebugger->setVisible(); - cpuDebugger->setFocused(); - }; - - menuWindowsSMPDebugger.onActivate = [&] { - smpDebugger->setVisible(); - smpDebugger->setFocused(); - }; - - menuWindowsMemoryEditor.onActivate = [&] { - memoryEditor->updateView(); - memoryEditor->setVisible(); - memoryEditor->setFocused(); - }; - - menuWindowsBreakpointEditor.onActivate = [&] { - breakpointEditor->setVisible(); - breakpointEditor->setFocused(); - }; - - menuWindowsPropertiesViewer.onActivate = [&] { - propertiesViewer->setVisible(); - propertiesViewer->setFocused(); - }; - - menuWindowsVRAMViewer.onActivate = [&] { - vramViewer->setVisible(); - vramViewer->setFocused(); - }; - - menuStateSave1.onActivate = [&] { interface->saveState(1); }; - menuStateSave2.onActivate = [&] { interface->saveState(2); }; - menuStateSave3.onActivate = [&] { interface->saveState(3); }; - menuStateSave4.onActivate = [&] { interface->saveState(4); }; - menuStateSave5.onActivate = [&] { interface->saveState(5); }; - - menuStateLoad1.onActivate = [&] { interface->loadState(1); }; - menuStateLoad2.onActivate = [&] { interface->loadState(2); }; - menuStateLoad3.onActivate = [&] { interface->loadState(3); }; - menuStateLoad4.onActivate = [&] { interface->loadState(4); }; - menuStateLoad5.onActivate = [&] { interface->loadState(5); }; - - menuHelpAbout.onActivate = [&] { aboutWindow->setVisible(); }; - - runButton.onActivate = [&] { - if(debugger->paused) { - print("\n"); - debugger->resume(); - } else { - debugger->suspend(); - } - }; - - stepButton.onActivate = [&] { - debugger->flags.step = true; - debugger->resume(); - }; - - clearButton.onActivate = [&] { - console.setText(""); - }; - - windowManager->append(this, "ConsoleWindow"); -} - -void ConsoleWindow::print(const string &text) { - string output = console.text(); - output.append(text); - console.setText(output); - console.setCursorPosition(~0); -} diff --git a/higan/target-laevateinn/console/console.hpp b/higan/target-laevateinn/console/console.hpp deleted file mode 100755 index ab30bfba..00000000 --- a/higan/target-laevateinn/console/console.hpp +++ /dev/null @@ -1,70 +0,0 @@ -struct ConsoleWindow : Window { - Menu menuEmulation; - Item menuEmulationReloadCartridge; - Item menuEmulationPowerCycle; - Item menuEmulationReset; - Separator menuEmulationSeparator; - CheckItem menuEmulationSynchronizeAudio; - CheckItem menuEmulationMuteAudio; - - Menu menuDebug; - CheckItem menuDebugCPU; - CheckItem menuDebugSMP; - - Menu menuTracer; - CheckItem menuTracerEnable; - CheckItem menuTracerMask; - Item menuTracerMaskReset; - - Menu menuWindows; - Item menuWindowsVideoWindow; - Separator menuWindowsSeparator1; - Item menuWindowsCPUDebugger; - Item menuWindowsSMPDebugger; - Separator menuWindowsSeparator2; - Item menuWindowsMemoryEditor; - Item menuWindowsBreakpointEditor; - Item menuWindowsPropertiesViewer; - Item menuWindowsVRAMViewer; - - Menu menuState; - Item menuStateSave1; - Item menuStateSave2; - Item menuStateSave3; - Item menuStateSave4; - Item menuStateSave5; - Separator menuStateSeparator; - Item menuStateLoad1; - Item menuStateLoad2; - Item menuStateLoad3; - Item menuStateLoad4; - Item menuStateLoad5; - - Menu menuHelp; - Item menuHelpAbout; - - VerticalLayout layout; - HorizontalLayout commandLayout; - Button runButton; - Button stepButton; - Widget spacer; - Button clearButton; - TextEdit console; - - void print(const string &text); - - ConsoleWindow(); -}; - -struct AboutWindow : Window { - VerticalLayout layout; - Canvas canvas; - Label title; - Label version; - Label website; - - AboutWindow(); -}; - -extern ConsoleWindow *consoleWindow; -extern AboutWindow *aboutWindow; diff --git a/higan/target-laevateinn/cpu/cpu.cpp b/higan/target-laevateinn/cpu/cpu.cpp deleted file mode 100755 index 454a91b3..00000000 --- a/higan/target-laevateinn/cpu/cpu.cpp +++ /dev/null @@ -1,160 +0,0 @@ -#include "../base.hpp" -CPUDebugger *cpuDebugger = nullptr; - -#include "registers.cpp" - -uint24 CPUDebugger::mirror(uint24 addr) { - if((addr & 0x40e000) == 0x0000) addr = 0x7e0000 | (addr & 0x1fff); //$00-3f:80-bf:0000-1fff WRAM - return addr; -} - -uint8 CPUDebugger::read(uint24 addr) { - if((addr & 0x40e000) == 0x2000) return ~0; //$00-3f|80-bf:2000-3fff MMIO - if((addr & 0x40e000) == 0x4000) return ~0; //$00-3f|80-bf:4000-5fff MMIO - return SFC::bus.read(mirror(addr)); -} - -void CPUDebugger::write(uint24 addr, uint8 data) { - if((addr & 0x40e000) == 0x2000) return; //$00-3f|80-bf:2000-3fff MMIO - if((addr & 0x40e000) == 0x4000) return; //$00-3f|80-bf:4000-5fff MMIO - if((addr & 0x40e000) == 0x0000) addr = 0x7e0000 | (addr & 0x1fff); //$00-3f:80-bf:0000-1fff WRAM - return SFC::bus.write(mirror(addr), data); -} - -unsigned CPUDebugger::opcodeLength(uint24 addr) { - #define M 5 - #define X 6 - static unsigned lengthTable[256] = { - 2, 2, 2, 2, 2, 2, 2, 2, 1, M, 1, 1, 3, 3, 3, 4, - 2, 2, 2, 2, 2, 2, 2, 2, 1, 3, 1, 1, 3, 3, 3, 4, - 3, 2, 4, 2, 2, 2, 2, 2, 1, M, 1, 1, 3, 3, 3, 4, - 2, 2, 2, 2, 2, 2, 2, 2, 1, 3, 1, 1, 3, 3, 3, 4, - - 1, 2, 2, 2, 3, 2, 2, 2, 1, M, 1, 1, 3, 3, 3, 4, - 2, 2, 2, 2, 3, 2, 2, 2, 1, 3, 1, 1, 4, 3, 3, 4, - 1, 2, 3, 2, 2, 2, 2, 2, 1, M, 1, 1, 3, 3, 3, 4, - 2, 2, 2, 2, 2, 2, 2, 2, 1, 3, 1, 1, 3, 3, 3, 4, - - 2, 2, 3, 2, 2, 2, 2, 2, 1, M, 1, 1, 3, 3, 3, 4, - 2, 2, 2, 2, 2, 2, 2, 2, 1, 3, 1, 1, 3, 3, 3, 4, - X, 2, X, 2, 2, 2, 2, 2, 1, M, 1, 1, 3, 3, 3, 4, - 2, 2, 2, 2, 2, 2, 2, 2, 1, 3, 1, 1, 3, 3, 3, 4, - - X, 2, 2, 2, 2, 2, 2, 2, 1, M, 1, 1, 3, 3, 3, 4, - 2, 2, 2, 2, 2, 2, 2, 2, 1, 3, 1, 1, 3, 3, 3, 4, - X, 2, 2, 2, 2, 2, 2, 2, 1, M, 1, 1, 3, 3, 3, 4, - 2, 2, 2, 2, 3, 2, 2, 2, 1, 3, 1, 1, 3, 3, 3, 4, - }; - - unsigned length = lengthTable[SFC::bus.read(addr)]; - if(length == M) return 3 - (SFC::cpu.regs.e | SFC::cpu.regs.p.m); - if(length == X) return 3 - (SFC::cpu.regs.e | SFC::cpu.regs.p.x); - return length; - #undef M - #undef X -} - -void CPUDebugger::updateDisassembly() { - string line[15]; - char text[512]; - - SFC::cpu.disassemble_opcode(text, opcodePC); - text[29] = 0; - line[7] = { "> ", text }; - - signed addr = opcodePC; - for(signed o = 6; o >= 0; o--) { - for(signed b = 1; b <= 4; b++) { - if(addr - b >= 0 && (debugger->cpuUsage.data[addr - b] & Usage::Exec)) { - addr -= b; - SFC::cpu.disassemble_opcode(text, addr); - text[29] = 0; - line[o] = { " ", text }; - break; - } - } - } - - addr = opcodePC; - for(signed o = 8; o <= 14; o++) { - for(signed b = 1; b <= 4; b++) { - if(addr + b <= 0xffffff && (debugger->cpuUsage.data[addr + b] & Usage::Exec)) { - addr += b; - SFC::cpu.disassemble_opcode(text, addr); - text[29] = 0; - line[o] = { " ", text }; - break; - } - } - } - - string output; - for(auto &n : line) { - if(n.empty()) output.append(" ...\n"); - else output.append(n, "\n"); - } - output.rtrim<1>("\n"); - - disassembly.setText(output); - registers.setText({ - "A:", hex<4>(SFC::cpu.regs.a), " X:", hex<4>(SFC::cpu.regs.x), " Y:", hex<4>(SFC::cpu.regs.y), - " S:", hex<4>(SFC::cpu.regs.s), " D:", hex<4>(SFC::cpu.regs.d), " DB:", hex<2>(SFC::cpu.regs.db), " ", - SFC::cpu.regs.p.n ? "N" : "n", SFC::cpu.regs.p.v ? "V" : "v", - SFC::cpu.regs.e ? (SFC::cpu.regs.p.m ? "1" : "0") : (SFC::cpu.regs.p.m ? "M" : "m"), - SFC::cpu.regs.e ? (SFC::cpu.regs.p.x ? "B" : "b") : (SFC::cpu.regs.p.x ? "X" : "x"), - SFC::cpu.regs.p.d ? "D" : "d", SFC::cpu.regs.p.i ? "I" : "i", - SFC::cpu.regs.p.z ? "Z" : "z", SFC::cpu.regs.p.c ? "C" : "c", - }); -} - -CPUDebugger::CPUDebugger() { - opcodePC = 0x008000; - - setTitle("CPU Debugger"); - setGeometry({128, 128, 350, 255}); - - layout.setMargin(5); - stepInto.setText("Step Into"); - stepNMI.setText("NMI"); - stepIRQ.setText("IRQ"); - autoUpdate.setText("Auto"); - update.setText("Update"); - disassembly.setFont(application->monospaceFont); - registers.setFont(application->monospaceFont); - registers.setText(" "); - - layout.append(controlLayout, {~0, 0}, 5); - controlLayout.append(stepInto, {80, 0}, 5); - controlLayout.append(stepNMI, {40, 0}, 5); - controlLayout.append(stepIRQ, {40, 0}, 5); - controlLayout.append(spacer, {~0, 0}); - controlLayout.append(autoUpdate, {0, 0}, 5); - controlLayout.append(update, {80, 0}); - layout.append(disassembly, {~0, ~0}, 5); - layout.append(registers, {~0, 0}); - append(layout); - - stepInto.onActivate = [&] { - debugger->flags.cpu.stepInto = true; - debugger->resume(); - }; - - stepNMI.onActivate = [&] { - debugger->flags.cpu.nmi = true; - debugger->resume(); - }; - - stepIRQ.onActivate = [&] { - debugger->flags.cpu.irq = true; - debugger->resume(); - }; - - update.onActivate = { &CPUDebugger::updateDisassembly, this }; - - registers.onActivate = [&] { - cpuRegisterEditor->loadRegisters(); - cpuRegisterEditor->setVisible(); - }; - - windowManager->append(this, "CPUDebugger"); -} diff --git a/higan/target-laevateinn/cpu/cpu.hpp b/higan/target-laevateinn/cpu/cpu.hpp deleted file mode 100755 index a03b5b64..00000000 --- a/higan/target-laevateinn/cpu/cpu.hpp +++ /dev/null @@ -1,59 +0,0 @@ -struct CPUDebugger : Window { - uint24 opcodePC; - - VerticalLayout layout; - HorizontalLayout controlLayout; - Button stepInto; - Button stepNMI; - Button stepIRQ; - Widget spacer; - CheckBox autoUpdate; - Button update; - TextEdit disassembly; - Button registers; - - uint24 mirror(uint24 addr); - uint8_t read(uint24 addr); - void write(uint24 addr, uint8 data); - - unsigned opcodeLength(uint24 addr); - void updateDisassembly(); - CPUDebugger(); -}; - -struct CPURegisterEditor : Window { - VerticalLayout layout; - HorizontalLayout primaryLayout; - Label regALabel; - LineEdit regAValue; - Label regXLabel; - LineEdit regXValue; - Label regYLabel; - LineEdit regYValue; - Label regSLabel; - LineEdit regSValue; - Label regDLabel; - LineEdit regDValue; - Label regDBLabel; - LineEdit regDBValue; - HorizontalLayout secondaryLayout; - CheckBox flagN; - CheckBox flagV; - CheckBox flagM; - CheckBox flagX; - CheckBox flagD; - CheckBox flagI; - CheckBox flagZ; - CheckBox flagC; - HorizontalLayout tertiaryLayout; - CheckBox flagE; - Widget spacer; - Button update; - - void loadRegisters(); - void saveRegisters(); - CPURegisterEditor(); -}; - -extern CPUDebugger *cpuDebugger; -extern CPURegisterEditor *cpuRegisterEditor; diff --git a/higan/target-laevateinn/cpu/registers.cpp b/higan/target-laevateinn/cpu/registers.cpp deleted file mode 100755 index a3d8ceaf..00000000 --- a/higan/target-laevateinn/cpu/registers.cpp +++ /dev/null @@ -1,105 +0,0 @@ -CPURegisterEditor *cpuRegisterEditor = nullptr; - -CPURegisterEditor::CPURegisterEditor() { - setTitle("CPU Register Editor"); - - layout.setMargin(5); - regALabel.setText("A:"); - regAValue.setFont(application->monospaceFont); - regXLabel.setText("X:"); - regXValue.setFont(application->monospaceFont); - regYLabel.setText("Y:"); - regYValue.setFont(application->monospaceFont); - regSLabel.setText("S:"); - regSValue.setFont(application->monospaceFont); - regDLabel.setText("D:"); - regDValue.setFont(application->monospaceFont); - regDBLabel.setText("DB:"); - regDBValue.setFont(application->monospaceFont); - flagN.setText("N"); - flagV.setText("V"); - flagM.setText("M"); - flagX.setText("X"); - flagD.setText("D"); - flagI.setText("I"); - flagZ.setText("Z"); - flagC.setText("C"); - flagE.setText("E"); - update.setText("Update"); - - loadRegisters(); - - layout.append(primaryLayout, {~0, 0}, 5); - primaryLayout.append(regALabel, {0, 0}, 5); - primaryLayout.append(regAValue, {0, 0}, 5); - primaryLayout.append(regXLabel, {0, 0}, 5); - primaryLayout.append(regXValue, {0, 0}, 5); - primaryLayout.append(regYLabel, {0, 0}, 5); - primaryLayout.append(regYValue, {0, 0}, 5); - primaryLayout.append(regSLabel, {0, 0}, 5); - primaryLayout.append(regSValue, {0, 0}, 5); - primaryLayout.append(regDLabel, {0, 0}, 5); - primaryLayout.append(regDValue, {0, 0}, 5); - primaryLayout.append(regDBLabel, {0, 0}, 5); - primaryLayout.append(regDBValue, {0, 0}); - layout.append(secondaryLayout, {~0, 0}, 5); - secondaryLayout.append(flagN, {0, 0}, 5); - secondaryLayout.append(flagV, {0, 0}, 5); - secondaryLayout.append(flagM, {0, 0}, 5); - secondaryLayout.append(flagX, {0, 0}, 5); - secondaryLayout.append(flagD, {0, 0}, 5); - secondaryLayout.append(flagI, {0, 0}, 5); - secondaryLayout.append(flagZ, {0, 0}, 5); - secondaryLayout.append(flagC, {0, 0}); - layout.append(tertiaryLayout, {~0, 0}); - tertiaryLayout.append(flagE, {0, 0}, 5); - tertiaryLayout.append(spacer, {~0, 0}); - tertiaryLayout.append(update, {80, 0}); - append(layout); - - update.onActivate = [&] { - saveRegisters(); - cpuDebugger->updateDisassembly(); - setVisible(false); - }; - - setGeometry({{128, 128}, layout.minimumGeometry().size()}); - windowManager->append(this, "CPURegisterEditor"); -} - -void CPURegisterEditor::loadRegisters() { - regAValue.setText(hex<4>(SFC::cpu.regs.a)); - regXValue.setText(hex<4>(SFC::cpu.regs.x)); - regYValue.setText(hex<4>(SFC::cpu.regs.y)); - regSValue.setText(hex<4>(SFC::cpu.regs.s)); - regDValue.setText(hex<4>(SFC::cpu.regs.d)); - regDBValue.setText(hex<2>(SFC::cpu.regs.db)); - flagN.setChecked(SFC::cpu.regs.p.n); - flagV.setChecked(SFC::cpu.regs.p.v); - flagM.setChecked(SFC::cpu.regs.p.m); - flagX.setChecked(SFC::cpu.regs.p.x); - flagD.setChecked(SFC::cpu.regs.p.d); - flagI.setChecked(SFC::cpu.regs.p.i); - flagZ.setChecked(SFC::cpu.regs.p.z); - flagC.setChecked(SFC::cpu.regs.p.c); - flagE.setChecked(SFC::cpu.regs.e); -} - -void CPURegisterEditor::saveRegisters() { - SFC::cpu.regs.a = hex(regAValue.text()); - SFC::cpu.regs.x = hex(regXValue.text()); - SFC::cpu.regs.y = hex(regYValue.text()); - SFC::cpu.regs.s = hex(regSValue.text()); - SFC::cpu.regs.d = hex(regDValue.text()); - SFC::cpu.regs.db = hex(regDBValue.text()); - SFC::cpu.regs.p.n = flagN.checked(); - SFC::cpu.regs.p.v = flagV.checked(); - SFC::cpu.regs.p.m = flagM.checked(); - SFC::cpu.regs.p.x = flagX.checked(); - SFC::cpu.regs.p.d = flagD.checked(); - SFC::cpu.regs.p.i = flagI.checked(); - SFC::cpu.regs.p.z = flagZ.checked(); - SFC::cpu.regs.p.c = flagC.checked(); - SFC::cpu.regs.e = flagE.checked(); - SFC::cpu.update_table(); //cache E/M/X flags -} diff --git a/higan/target-laevateinn/debugger/debugger.cpp b/higan/target-laevateinn/debugger/debugger.cpp deleted file mode 100755 index 51cfd86b..00000000 --- a/higan/target-laevateinn/debugger/debugger.cpp +++ /dev/null @@ -1,76 +0,0 @@ -#include "../base.hpp" -Debugger *debugger = nullptr; - -#include "hook.cpp" -#include "usage.cpp" - -void Debugger::run() { - if(paused == true) { - usleep(2000); - return; - } - - SFC::system.run(); - if(cpuDebugger->autoUpdate.checked()) cpuDebugger->updateDisassembly(); - if(smpDebugger->autoUpdate.checked()) smpDebugger->updateDisassembly(); - if(memoryEditor->autoUpdate.checked()) memoryEditor->updateView(); - if(propertiesViewer->autoUpdate.checked()) propertiesViewer->updateProperties(); - if(vramViewer->autoUpdate.checked()) vramViewer->updateTiles(); -} - -void Debugger::echo(const string &text) { - consoleWindow->print(text); -} - -void Debugger::resume() { - if(paused == false) return; - paused = false; - consoleWindow->runButton.setText("Stop"); -} - -void Debugger::suspend() { - if(paused == true) return; - paused = true; - flags.step = false; - flags.cpu.stepInto = false; - flags.cpu.nmi = false; - flags.cpu.irq = false; - flags.smp.stepInto = false; - consoleWindow->runButton.setText("Run"); -} - -Debugger::Debugger() { - paused = true; - - flags.step = false; - flags.cpu.stepInto = false; - flags.cpu.nmi = false; - flags.cpu.irq = false; - flags.smp.stepInto = false; - - debug.cpu = true; - debug.smp = false; - - cpuUsage.allocate(16 * 1024 * 1024); - apuUsage.allocate(64 * 1024); - - SFC::cpu.debugger.op_exec = {&Debugger::cpu_op_exec, this}; - SFC::cpu.debugger.op_read = {&Debugger::cpu_op_read, this}; - SFC::cpu.debugger.op_write = {&Debugger::cpu_op_write, this}; - - SFC::cpu.debugger.op_nmi = {&Debugger::cpu_op_nmi, this}; - SFC::cpu.debugger.op_irq = {&Debugger::cpu_op_irq, this}; - - SFC::smp.debugger.op_exec = {&Debugger::smp_op_exec, this}; - SFC::smp.debugger.op_read = {&Debugger::smp_op_read, this}; - SFC::smp.debugger.op_write = {&Debugger::smp_op_write, this}; - - SFC::ppu.debugger.vram_read = {&Debugger::ppu_vram_read, this}; - SFC::ppu.debugger.vram_write = {&Debugger::ppu_vram_write, this}; - - SFC::ppu.debugger.oam_read = {&Debugger::ppu_oam_read, this}; - SFC::ppu.debugger.oam_write = {&Debugger::ppu_oam_write, this}; - - SFC::ppu.debugger.cgram_read = {&Debugger::ppu_cgram_read, this}; - SFC::ppu.debugger.cgram_write = {&Debugger::ppu_cgram_write, this}; -} diff --git a/higan/target-laevateinn/debugger/debugger.hpp b/higan/target-laevateinn/debugger/debugger.hpp deleted file mode 100755 index 16721ea7..00000000 --- a/higan/target-laevateinn/debugger/debugger.hpp +++ /dev/null @@ -1,71 +0,0 @@ -struct Usage { - enum : unsigned { Read = 4, Write = 2, Exec = 1 }; - uint8_t *data; - unsigned size; - - void allocate(unsigned size); - void reset(); - Usage(); - ~Usage(); -}; - -struct Debugger { - bool paused; - - struct Flags { - bool step; - struct CPU { - bool stepInto; - bool nmi; - bool irq; - } cpu; - struct SMP { - bool stepInto; - } smp; - } flags; - - struct Debug { - bool cpu; - bool smp; - } debug; - - Usage cpuUsage; - Usage apuUsage; - void loadUsage(); - void saveUsage(); - void resetUsage(); - - void run(); - void echo(const string &text); - void resume(); //start running until breakpoint is reached - void suspend(); //stop running as soon as possible - - //S-CPU - void cpu_op_exec(uint24 addr); - void cpu_op_read(uint24 addr); - void cpu_op_write(uint24 addr, uint8 data); - void cpu_op_nmi(); - void cpu_op_irq(); - - //S-SMP - void smp_op_exec(uint16 addr); - void smp_op_read(uint16 addr); - void smp_op_write(uint16 addr, uint8 data); - - //S-PPU - void ppu_vram_read(uint16 addr); - void ppu_oam_read(uint16 addr); - void ppu_cgram_read(uint16 addr); - void ppu_vram_write(uint16 addr, uint8 data); - void ppu_oam_write(uint16 addr, uint8 data); - void ppu_cgram_write(uint16 addr, uint8 data); - - Debugger(); - - template void print(Args&&... args) { - string text(std::forward(args)...); - echo(text); - } -}; - -extern Debugger *debugger; diff --git a/higan/target-laevateinn/debugger/hook.cpp b/higan/target-laevateinn/debugger/hook.cpp deleted file mode 100755 index 025c2e52..00000000 --- a/higan/target-laevateinn/debugger/hook.cpp +++ /dev/null @@ -1,207 +0,0 @@ -//S-CPU -//===== - -void Debugger::cpu_op_exec(uint24 addr) { - cpuUsage.data[addr] |= Usage::Exec; - cpuDebugger->opcodePC = addr; - bool breakpointHit = breakpointEditor->testExecCPU(addr); - - if((debug.cpu && tracer->enabled() && !tracer->maskCPU(addr)) - || (debug.cpu && flags.step) - || flags.cpu.stepInto - || breakpointHit - ) { - char text[512]; - SFC::cpu.disassemble_opcode(text, addr); - - if(debug.cpu && tracer->enabled()) tracer->print(text, "\n"); - if((debug.cpu && flags.step) || flags.cpu.stepInto || breakpointHit) { - print(text, "\n"); - if(debug.cpu && flags.step) { - consoleWindow->stepButton.setFocused(); - } - if(flags.cpu.stepInto) { - cpuDebugger->stepInto.setFocused(); - cpuDebugger->updateDisassembly(); - } - suspend(); - SFC::scheduler.debug(); - } - } -} - -void Debugger::cpu_op_read(uint24 addr) { - cpuUsage.data[addr] |= Usage::Read; - bool breakpointHit = breakpointEditor->testReadCPU(addr); - - if(breakpointHit) { - char text[512]; - SFC::cpu.disassemble_opcode(text, cpuDebugger->opcodePC); - print(text, "\n"); - - suspend(); - SFC::scheduler.debug(); - } -} - -void Debugger::cpu_op_write(uint24 addr, uint8 data) { - cpuUsage.data[addr] |= Usage::Write; - bool breakpointHit = breakpointEditor->testWriteCPU(addr, data); - - if(breakpointHit) { - char text[512]; - SFC::cpu.disassemble_opcode(text, cpuDebugger->opcodePC); - print(text, "\n"); - - suspend(); - SFC::scheduler.debug(); - } -} - -void Debugger::cpu_op_nmi() { - if(flags.cpu.nmi) { - print("CPU NMI\n"); //, text, "\n"); - flags.cpu.stepInto = true; - } -} - -void Debugger::cpu_op_irq() { - if(flags.cpu.irq) { - print("CPU IRQ\n"); - flags.cpu.stepInto = true; - } -} - -//S-SMP -//===== - -void Debugger::smp_op_exec(uint16 addr) { - apuUsage.data[addr] |= Usage::Exec; - smpDebugger->opcodePC = addr; - bool breakpointHit = breakpointEditor->testExecSMP(addr); - - if((debug.cpu && tracer->enabled() && !tracer->maskSMP(addr)) - || (debug.smp && flags.step) - || flags.smp.stepInto - || breakpointHit - ) { - string text = SFC::smp.disassemble_opcode(addr); - - if(debug.smp && tracer->enabled()) tracer->print(text, "\n"); - if((debug.smp && flags.step) || flags.smp.stepInto || breakpointHit) { - print(text, "\n"); - if(debug.smp && flags.step) { - consoleWindow->stepButton.setFocused(); - } - if(flags.smp.stepInto) { - smpDebugger->stepInto.setFocused(); - smpDebugger->updateDisassembly(); - } - suspend(); - SFC::scheduler.debug(); - } - } -} - -void Debugger::smp_op_read(uint16 addr) { - apuUsage.data[addr] |= Usage::Read; - bool breakpointHit = breakpointEditor->testReadSMP(addr); - - if(breakpointHit) { - print(SFC::smp.disassemble_opcode(smpDebugger->opcodePC), "\n"); - suspend(); - SFC::scheduler.debug(); - } -} - -void Debugger::smp_op_write(uint16 addr, uint8 data) { - apuUsage.data[addr] |= Usage::Write; - bool breakpointHit = breakpointEditor->testWriteSMP(addr, data); - - if(breakpointHit) { - print(SFC::smp.disassemble_opcode(smpDebugger->opcodePC), "\n"); - suspend(); - SFC::scheduler.debug(); - } -} - -//S-PPU -//===== - -void Debugger::ppu_vram_read(uint16 addr) { - bool breakpointHit = breakpointEditor->testReadVRAM(addr); - - if(breakpointHit) { - char text[512]; - SFC::cpu.disassemble_opcode(text, cpuDebugger->opcodePC); - print(text, "\n"); - - suspend(); - SFC::scheduler.debug(); - } -} - -void Debugger::ppu_vram_write(uint16 addr, uint8 data) { - bool breakpointHit = breakpointEditor->testWriteVRAM(addr, data); - - if(breakpointHit) { - char text[512]; - SFC::cpu.disassemble_opcode(text, cpuDebugger->opcodePC); - print(text, "\n"); - - suspend(); - SFC::scheduler.debug(); - } -} - -void Debugger::ppu_oam_read(uint16 addr) { - bool breakpointHit = breakpointEditor->testReadOAM(addr); - - if(breakpointHit) { - char text[512]; - SFC::cpu.disassemble_opcode(text, cpuDebugger->opcodePC); - print(text, "\n"); - - suspend(); - SFC::scheduler.debug(); - } -} - -void Debugger::ppu_oam_write(uint16 addr, uint8 data) { - bool breakpointHit = breakpointEditor->testWriteOAM(addr, data); - - if(breakpointHit) { - char text[512]; - SFC::cpu.disassemble_opcode(text, cpuDebugger->opcodePC); - print(text, "\n"); - - suspend(); - SFC::scheduler.debug(); - } -} - -void Debugger::ppu_cgram_read(uint16 addr) { - bool breakpointHit = breakpointEditor->testReadCGRAM(addr); - - if(breakpointHit) { - char text[512]; - SFC::cpu.disassemble_opcode(text, cpuDebugger->opcodePC); - print(text, "\n"); - - suspend(); - SFC::scheduler.debug(); - } -} - -void Debugger::ppu_cgram_write(uint16 addr, uint8 data) { - bool breakpointHit = breakpointEditor->testWriteCGRAM(addr, data); - - if(breakpointHit) { - char text[512]; - SFC::cpu.disassemble_opcode(text, cpuDebugger->opcodePC); - print(text, "\n"); - - suspend(); - SFC::scheduler.debug(); - } -} diff --git a/higan/target-laevateinn/debugger/usage.cpp b/higan/target-laevateinn/debugger/usage.cpp deleted file mode 100755 index c3d588ca..00000000 --- a/higan/target-laevateinn/debugger/usage.cpp +++ /dev/null @@ -1,57 +0,0 @@ -void Usage::allocate(unsigned size_) { - if(data) delete[] data; - size = size_; - data = new uint8_t[size](); -} - -Usage::Usage() { - data = nullptr; - size = 0; -} - -Usage::~Usage() { - if(data) delete[] data; -} - -void Debugger::loadUsage() { - file fp; - - //if cartridge image was modified after the usage files, - //then it is possible that the memory map has changed. - //will print invalidation message when files do not exist as well. - - if(file::timestamp({ interface->pathName, "program.rom" }, file::time::modify) >= - file::timestamp({ interface->pathName, "debug/usage.cpu" }, file::time::modify) - ) { - print("CPU usage invalidated\n"); - } else { - if(fp.open({ interface->pathName, "debug/usage.cpu" }, file::mode::read)) { - fp.read(cpuUsage.data, min(cpuUsage.size, fp.size())); - fp.close(); - } - } - - if(file::timestamp({ interface->pathName, "program.rom" }, file::time::modify) >= - file::timestamp({ interface->pathName, "debug/usage.apu" }, file::time::modify) - ) { - print("APU usage invalidated\n"); - } else { - if(fp.open({ interface->pathName, "debug/usage.apu" }, file::mode::read)) { - fp.read(apuUsage.data, min(apuUsage.size, fp.size())); - fp.close(); - } - } -} - -void Debugger::saveUsage() { - string filename; - filename = { interface->pathName, "debug/usage.cpu" }; - file::write(filename, cpuUsage.data, cpuUsage.size); - filename = { interface->pathName, "debug/usage.apu" }; - file::write(filename, apuUsage.data, apuUsage.size); -} - -void Debugger::resetUsage() { - if(cpuUsage.data) memset(cpuUsage.data, 0, cpuUsage.size); - if(apuUsage.data) memset(apuUsage.data, 0, apuUsage.size); -} diff --git a/higan/target-laevateinn/interface/interface.cpp b/higan/target-laevateinn/interface/interface.cpp deleted file mode 100755 index 0bd3b377..00000000 --- a/higan/target-laevateinn/interface/interface.cpp +++ /dev/null @@ -1,159 +0,0 @@ -#include "../base.hpp" -Interface *interface = nullptr; - -bool Interface::loadCartridge(const string &foldername) { - auto memory = file::read({foldername, "program.rom"}); - if(memory.empty()) return false; - - if(SFC::cartridge.loaded()) { - saveMemory(); - SFC::cartridge.unload(); - debugger->print("Cartridge unloaded\n"); - } - - pathName = foldername; - directory::create({pathName, "debug/"}); - - string markup; - markup.readfile({pathName, "manifest.xml"}); - if(markup.empty()) markup = SuperFamicomCartridge(memory.data(), memory.size()).markup; - - SFC::cartridge.load(markup, vectorstream{memory}); - SFC::system.power(); - - string name = pathName; - name.rtrim<1>("/"); - name = notdir(name); - - videoWindow->setTitle(name); - SFC::video.generate_palette(); - debugger->print("Loaded ", pathName, "program.rom\n"); - loadMemory(); - debugger->print(markup, "\n"); - debugger->suspend(); - return true; -} - -void Interface::loadMemory() { - for(auto &memory : SFC::interface->memory) { - string filename{pathName, memory.name}; - filestream fs(filename, file::mode::read); - instance->load(memory.id, fs); - if(file::exists(filename)) debugger->print("Loaded ", filename, "\n"); - } - - debugger->loadUsage(); -} - -void Interface::saveMemory() { - for(auto &memory : SFC::interface->memory) { - string filename{pathName, memory.name}; - filestream fs(filename, file::mode::write); - instance->save(memory.id, fs); - debugger->print("Saved ", filename, "\n"); - } - - debugger->saveUsage(); -} - -bool Interface::loadState(unsigned slot) { - string filename = {pathName, "state-", slot, ".bst"}; - auto memory = file::read(filename); - if(memory.empty()) return false; - serializer s(memory.data(), memory.size()); - bool result = SFC::system.unserialize(s); - if(result) debugger->print("Loaded state from ", filename, "\n"); - return result; -} - -bool Interface::saveState(unsigned slot) { - SFC::system.runtosave(); - serializer s = SFC::system.serialize(); - string filename = {pathName, "state-", slot, ".bst"}; - bool result = file::write(filename, s.data(), s.size()); - if(result) debugger->print("Saved state to ", filename, "\n"); - return result; -} - -uint32_t Interface::videoColor(unsigned source, uint16_t r, uint16_t g, uint16_t b) { - return (r >> 8) << 16 | (g >> 8) << 8 | (b >> 8) << 0; -} - -//hires is always true for accuracy core -//overscan is ignored for the debugger port -void Interface::videoRefresh(const uint32_t *data, unsigned pitch, unsigned width, unsigned height) { - data += 8 * 1024; //skip NTSC overscan compensation - uint32_t *output = videoWindow->canvas.data(); - - bool interlace = height >= 448; - if(interlace == false) { - for(unsigned y = 0; y < 240; y++) { - const uint32_t *sp = data + y * 1024; - uint32_t *dp0 = output + y * 1024, *dp1 = dp0 + 512; - for(unsigned x = 0; x < 512; x++) { - *dp0++ = *sp; - *dp1++ = *sp++; - } - } - } else { - for(unsigned y = 0; y < 480; y++) { - const uint32_t *sp = data + y * 512; - uint32_t *dp = output + y * 512; - for(unsigned x = 0; x < 512; x++) { - *dp++ = *sp++; - } - } - } - - videoWindow->canvas.update(); -} - -void Interface::audioSample(int16_t lsample, int16_t rsample) { - if(consoleWindow->menuEmulationMuteAudio.checked()) lsample = rsample = 0; - audio.sample(lsample, rsample); -} - -int16_t Interface::inputPoll(unsigned port, unsigned device, unsigned index) { - if(videoWindow->focused() == false) return 0; - auto keyboardState = phoenix::Keyboard::state(); - - if(port == 0) { - if(device == (unsigned)SFC::Input::Device::Joypad) { - switch((SFC::Input::JoypadID)index) { - case SFC::Input::JoypadID::Up: return keyboardState[(unsigned)phoenix::Keyboard::Scancode::Up]; - case SFC::Input::JoypadID::Down: return keyboardState[(unsigned)phoenix::Keyboard::Scancode::Down]; - case SFC::Input::JoypadID::Left: return keyboardState[(unsigned)phoenix::Keyboard::Scancode::Left]; - case SFC::Input::JoypadID::Right: return keyboardState[(unsigned)phoenix::Keyboard::Scancode::Right]; - case SFC::Input::JoypadID::B: return keyboardState[(unsigned)phoenix::Keyboard::Scancode::Z]; - case SFC::Input::JoypadID::A: return keyboardState[(unsigned)phoenix::Keyboard::Scancode::X]; - case SFC::Input::JoypadID::Y: return keyboardState[(unsigned)phoenix::Keyboard::Scancode::A]; - case SFC::Input::JoypadID::X: return keyboardState[(unsigned)phoenix::Keyboard::Scancode::S]; - case SFC::Input::JoypadID::L: return keyboardState[(unsigned)phoenix::Keyboard::Scancode::D]; - case SFC::Input::JoypadID::R: return keyboardState[(unsigned)phoenix::Keyboard::Scancode::C]; - case SFC::Input::JoypadID::Select: return keyboardState[(unsigned)phoenix::Keyboard::Scancode::Apostrophe]; - case SFC::Input::JoypadID::Start: return keyboardState[(unsigned)phoenix::Keyboard::Scancode::Return]; - } - } - } - - return 0; -} - -string Interface::path(SFC::Cartridge::Slot slot, const string &hint) { - return {pathName, hint}; -} - -void Interface::message(const string &text) { - debugger->print(text, "\n"); -} - -Interface::Interface() { - instance = new SFC::Interface; - instance->bind = this; - - SFC::video.generate_palette(); - SFC::system.init(); - - filestream fs{{application->userpath, "Super Famicom.sys/spc700.rom"}}; - fs.read(SFC::smp.iplrom, min(64u, fs.size())); -} diff --git a/higan/target-laevateinn/interface/interface.hpp b/higan/target-laevateinn/interface/interface.hpp deleted file mode 100755 index deee0ef8..00000000 --- a/higan/target-laevateinn/interface/interface.hpp +++ /dev/null @@ -1,28 +0,0 @@ -struct Interface : Emulator::Interface::Bind { - string pathName; - - bool loadCartridge(const string &foldername); - void loadMemory(); - void saveMemory(); - bool loadState(unsigned slot); - bool saveState(unsigned slot); - - void loadRequest(unsigned id, const string &path) {} - void loadRequest(unsigned id, const string &name, const string &type, const string &path) {} - uint32_t videoColor(unsigned source, uint16_t red, uint16_t green, uint16_t blue); - void videoRefresh(const uint32_t *data, unsigned pitch, unsigned width, unsigned height); - void audioSample(int16_t lsample, int16_t rsample); - int16_t inputPoll(unsigned port, unsigned device, unsigned index); - unsigned dipSettings(const XML::Node &node) { return 0u; } - string path(unsigned group) { return ""; } - - string path(SFC::Cartridge::Slot slot, const string &hint); - void message(const string &text); - - Interface(); - -private: - SFC::Interface *instance; -}; - -extern Interface *interface; diff --git a/higan/target-laevateinn/main.cpp b/higan/target-laevateinn/main.cpp deleted file mode 100755 index ed29f4e3..00000000 --- a/higan/target-laevateinn/main.cpp +++ /dev/null @@ -1,116 +0,0 @@ -#include "base.hpp" - -Application *application = nullptr; - -Application::Application(int argc, char **argv) { - application = this; - quit = false; - - { - char path[PATH_MAX]; - auto unused = ::realpath(argv[0], path); - basepath = dir(path); - unused = ::userpath(path); - userpath = path; - if(Intrinsics::platform() == Intrinsics::Platform::Windows) { - userpath.append("laevateinn/"); - } else { - userpath.append(".config/laevateinn/"); - } - mkdir(userpath, 0755); - } - - if(Intrinsics::platform() == Intrinsics::Platform::Windows) { - proportionalFont = "Tahoma, 8"; - proportionalFontBold = "Tahoma, 8, Bold"; - monospaceFont = "Lucida Console, 8"; - } else { - proportionalFont = "Sans, 8"; - proportionalFontBold = "Sans, 8, Bold"; - monospaceFont = "Liberation Mono, 8"; - } - - settings = new Settings; - settings->load(); - - string foldername; - if(argc >= 2) foldername = argv[1]; -//if(!directory::exists(foldername)) foldername = "/media/sdb1/root/cartridges/The Legend of Zelda - A Link to the Past (US).sfc/"; - if(!directory::exists(foldername)) foldername = DialogWindow::folderSelect(Window::None, settings->folderpath); - if(!foldername.endswith(".sfc/")) return; - if(!directory::exists(foldername)) return; - - //save path for later; remove cartridge name from path - settings->folderpath = foldername; - settings->folderpath.rtrim<1>("/"); - settings->folderpath = dir(settings->folderpath); - - interface = new Interface; - debugger = new Debugger; - tracer = new Tracer; - windowManager = new WindowManager; - consoleWindow = new ConsoleWindow; - aboutWindow = new AboutWindow; - videoWindow = new VideoWindow; - cpuDebugger = new CPUDebugger; - cpuRegisterEditor = new CPURegisterEditor; - smpDebugger = new SMPDebugger; - smpRegisterEditor = new SMPRegisterEditor; - memoryEditor = new MemoryEditor; - breakpointEditor = new BreakpointEditor; - propertiesViewer = new PropertiesViewer; - vramViewer = new VRAMViewer; - - windowManager->loadGeometry(); - consoleWindow->setVisible(); - videoWindow->setVisible(); - consoleWindow->setFocused(); - - if(audio.init() == false) { - audio.driver("None"); - audio.init(); - } - audio.set(Audio::Synchronize, settings->synchronizeAudio); - audio.set(Audio::Frequency, 32000u); - - if(interface->loadCartridge(foldername) == false) return; - cpuDebugger->updateDisassembly(); - smpDebugger->updateDisassembly(); - memoryEditor->selectSource(); - propertiesViewer->updateProperties(); - vramViewer->updateTiles(); - - while(quit == false) { - OS::processEvents(); - debugger->run(); - } - - interface->saveMemory(); - windowManager->saveGeometry(); - settings->save(); -} - -Application::~Application() { - delete vramViewer; - delete propertiesViewer; - delete breakpointEditor; - delete memoryEditor; - delete smpRegisterEditor; - delete smpDebugger; - delete cpuRegisterEditor; - delete cpuDebugger; - delete videoWindow; - delete aboutWindow; - delete consoleWindow; - delete windowManager; - delete tracer; - delete debugger; - delete interface; - delete settings; -} - -int main(int argc, char **argv) { - new Application(argc, argv); - delete application; - return 0; -} diff --git a/higan/target-laevateinn/memory/memory.cpp b/higan/target-laevateinn/memory/memory.cpp deleted file mode 100755 index 09d9b15e..00000000 --- a/higan/target-laevateinn/memory/memory.cpp +++ /dev/null @@ -1,116 +0,0 @@ -#include "../base.hpp" -MemoryEditor *memoryEditor = nullptr; - -MemoryEditor::MemoryEditor() { - setTitle("Memory Editor"); - setGeometry({128, 128, 485, 255}); - - gotoLabel.setText("Goto:"); - gotoAddress.setFont(application->monospaceFont); - source.append("CPU-Bus", "APU-Bus", "VRAM", "OAM", "CGRAM"); - exportMemory.setText("Export"); - autoUpdate.setText("Auto"); - update.setText("Update"); - editor.setFont(application->monospaceFont); - editor.setColumns(16); - editor.setRows(16); - - layout.setMargin(5); - layout.append(controlLayout, {~0, 0}, 5); - controlLayout.append(gotoLabel, {0, 0}, 5); - controlLayout.append(gotoAddress, {50, 0}, 5); - controlLayout.append(source, {0, 0}, 5); - controlLayout.append(exportMemory, {80, 0}, 5); - controlLayout.append(spacer, {~0, 0}); - controlLayout.append(autoUpdate, {0, 0}, 5); - controlLayout.append(update, {80, 0}); - layout.append(editor, {~0, ~0}); - append(layout); - - gotoAddress.onChange = gotoAddress.onActivate = [&] { - editor.setOffset(hex(gotoAddress.text())); - editor.update(); - }; - - update.onActivate = { &MemoryEditor::updateView, this }; - - source.onChange = { &MemoryEditor::selectSource, this }; - exportMemory.onActivate = { &MemoryEditor::exportMemoryToDisk, this }; - editor.onRead = { &MemoryEditor::read, this }; - editor.onWrite = { &MemoryEditor::write, this }; - - windowManager->append(this, "MemoryEditor"); -} - -uint8_t MemoryEditor::read(unsigned addr) { - if(SFC::cartridge.loaded() == false) return 0x00; - switch(source.selection()) { - case 0: return cpuDebugger->read(addr); - case 1: return smpDebugger->read(addr); - case 2: return SFC::ppu.vram[addr & 0xffff]; - case 3: return SFC::ppu.oam[addr % 544]; - case 4: return SFC::ppu.cgram[addr & 0x01ff]; - } - return ~0; -} - -void MemoryEditor::write(unsigned addr, uint8_t data) { - if(SFC::cartridge.loaded() == false) return; - switch(source.selection()) { - case 0: - SFC::cartridge.rom.write_protect(false); - cpuDebugger->write(addr, data); - SFC::cartridge.rom.write_protect(true); - break; - case 1: - smpDebugger->write(addr, data); - break; - case 2: - SFC::ppu.vram[addr & 0xffff] = data; - break; - case 3: - SFC::ppu.oam[addr % 544] = data; - SFC::ppu.sprite.synchronize(); //cache OAM changes internally - break; - case 4: - SFC::ppu.cgram[addr & 0x01ff] = data; - break; - } -} - -void MemoryEditor::selectSource() { - editor.setOffset(0); - switch(source.selection()) { - case 0: editor.setLength(16 * 1024 * 1024); break; - case 1: editor.setLength(64 * 1024); break; - case 2: editor.setLength(64 * 1024); break; - case 3: editor.setLength(544); break; - case 4: editor.setLength(512); break; - } - updateView(); -} - -void MemoryEditor::exportMemoryToDisk() { - string filename = { interface->pathName, "debug/memory-" }; - switch(source.selection()) { - case 0: filename.append("cpu.bin"); break; - case 1: filename.append("apu.bin"); break; - case 2: filename.append("vram.bin"); break; - case 3: filename.append("oam.bin"); break; - case 4: filename.append("cgram.bin"); break; - } - file fp; - if(fp.open(filename, file::mode::write) == false) return; - switch(source.selection()) { - case 0: for(unsigned addr = 0; addr <= 0xffffff; addr++) fp.write(cpuDebugger->read(addr)); break; - case 1: for(unsigned addr = 0; addr <= 0xffff; addr++) fp.write(smpDebugger->read(addr)); break; - case 2: for(unsigned addr = 0; addr <= 0xffff; addr++) fp.write(SFC::ppu.vram[addr]); break; - case 3: for(unsigned addr = 0; addr <= 0x021f; addr++) fp.write(SFC::ppu.oam[addr]); break; - case 4: for(unsigned addr = 0; addr <= 0x01ff; addr++) fp.write(SFC::ppu.cgram[addr]); break; - } - debugger->print("Exported memory to ", filename, "\n"); -} - -void MemoryEditor::updateView() { - editor.update(); -} diff --git a/higan/target-laevateinn/memory/memory.hpp b/higan/target-laevateinn/memory/memory.hpp deleted file mode 100755 index a4bad266..00000000 --- a/higan/target-laevateinn/memory/memory.hpp +++ /dev/null @@ -1,21 +0,0 @@ -struct MemoryEditor : Window { - VerticalLayout layout; - HorizontalLayout controlLayout; - Label gotoLabel; - LineEdit gotoAddress; - ComboBox source; - Button exportMemory; - Widget spacer; - CheckBox autoUpdate; - Button update; - HexEdit editor; - - uint8_t read(unsigned addr); - void write(unsigned addr, uint8_t data); - void selectSource(); - void exportMemoryToDisk(); - void updateView(); - MemoryEditor(); -}; - -extern MemoryEditor *memoryEditor; diff --git a/higan/target-laevateinn/properties/properties.cpp b/higan/target-laevateinn/properties/properties.cpp deleted file mode 100755 index 23e5002b..00000000 --- a/higan/target-laevateinn/properties/properties.cpp +++ /dev/null @@ -1,110 +0,0 @@ -#include "../base.hpp" -PropertiesViewer *propertiesViewer = nullptr; - -PropertiesViewer::PropertiesViewer() { - setTitle("Properties Viewer"); - setGeometry({128, 128, 300, 400}); - - layout.setMargin(5); - sourceLabel.setText("Source:"); - sourceSelection.append("PPU"); - sourceSelection.setEnabled(false); - autoUpdate.setText("Auto"); - update.setText("Update"); - properties.setFont(application->monospaceFont); - - layout.append(controlLayout, {~0, 0}, 5); - controlLayout.append(sourceLabel, {0, 0}, 5); - controlLayout.append(sourceSelection, {0, 0}, 5); - controlLayout.append(spacer, {~0, 0}); - controlLayout.append(autoUpdate, {0, 0}, 5); - controlLayout.append(update, {0, 0}); - layout.append(properties, {~0, ~0}); - append(layout); - - update.onActivate = { &PropertiesViewer::updateProperties, this }; - - windowManager->append(this, "PropertiesViewer"); -} - -void PropertiesViewer::updateProperties() { - string output; - - output.append("$2100 INIDISP\n" - " Display Disable = ", SFC::ppu.regs.display_disable, "\n", - " Display Brightness = ", SFC::ppu.regs.display_brightness, "\n", - "\n" - ); - - output.append("$2101 OBSEL\n" - " Base Size = ", SFC::ppu.sprite.regs.base_size, "\n", - " Name Select = $", hex<4>(SFC::ppu.sprite.regs.nameselect << 13), "\n", - " Tiledata Address = $", hex<4>(SFC::ppu.sprite.regs.tiledata_addr), "\n", - "\n" - ); - - output.append("$2102 OAMADDL\n" - "$2103 OAMADDH\n" - " Base Address = $", hex<4>(SFC::ppu.regs.oam_baseaddr), "\n", - " Priority = ", SFC::ppu.regs.oam_priority, "\n", - "\n" - ); - - output.append("$2105 BGMODE\n" - " Mode = ", SFC::ppu.regs.bgmode, "\n", - " BG3 Priority = ", SFC::ppu.regs.bg3_priority, "\n", - " BG1 Tile Size = ", SFC::ppu.bg1.regs.tile_size ? "16x16" : "8x8", "\n", - " BG2 Tile Size = ", SFC::ppu.bg2.regs.tile_size ? "16x16" : "8x8", "\n", - " BG3 Tile Size = ", SFC::ppu.bg3.regs.tile_size ? "16x16" : "8x8", "\n", - " BG4 Tile Size = ", SFC::ppu.bg4.regs.tile_size ? "16x16" : "8x8", "\n", - "\n" - ); - - output.append("$2106 MOSAIC\n" - " BG1 Mosaic = ", 1u + SFC::ppu.bg1.regs.mosaic, "x", 1u + SFC::ppu.bg1.regs.mosaic, "\n", - " BG2 Mosaic = ", 1u + SFC::ppu.bg2.regs.mosaic, "x", 1u + SFC::ppu.bg2.regs.mosaic, "\n", - " BG3 Mosaic = ", 1u + SFC::ppu.bg3.regs.mosaic, "x", 1u + SFC::ppu.bg3.regs.mosaic, "\n", - " BG4 Mosaic = ", 1u + SFC::ppu.bg4.regs.mosaic, "x", 1u + SFC::ppu.bg4.regs.mosaic, "\n", - "\n" - ); - - lstring screenSizes = { "32x32", "32x64", "64x32", "64x64" }; - - output.append("$2107 BG1SC\n" - " BG1 Screen Address = $", hex<4>(SFC::ppu.bg1.regs.screen_addr), "\n", - " BG1 Screen Size = ", screenSizes[SFC::ppu.bg1.regs.screen_size], "\n", - "\n" - ); - - output.append("$2108 BG2SC\n" - " BG2 Screen Address = $", hex<4>(SFC::ppu.bg2.regs.screen_addr), "\n", - " BG2 Screen Size = ", screenSizes[SFC::ppu.bg2.regs.screen_size], "\n", - "\n" - ); - - output.append("$2109 BG3SC\n" - " BG3 Screen Address = $", hex<4>(SFC::ppu.bg3.regs.screen_addr), "\n", - " BG3 Screen Size = ", screenSizes[SFC::ppu.bg3.regs.screen_size], "\n", - "\n" - ); - - output.append("$210a BG4SC\n" - " BG4 Screen Address = $", hex<4>(SFC::ppu.bg4.regs.screen_addr), "\n", - " BG4 Screen Size = ", screenSizes[SFC::ppu.bg4.regs.screen_size], "\n", - "\n" - ); - - output.append("$210b BG12NBA\n" - " BG1 Tiledata Address = $", hex<4>(SFC::ppu.bg1.regs.tiledata_addr), "\n", - " BG2 Tiledata Address = $", hex<4>(SFC::ppu.bg2.regs.tiledata_addr), "\n", - "\n" - ); - - output.append("$210c BG34NBA\n" - " BG3 Tiledata Address = $", hex<4>(SFC::ppu.bg3.regs.tiledata_addr), "\n", - " BG4 Tiledata Address = $", hex<4>(SFC::ppu.bg4.regs.tiledata_addr), "\n", - "\n" - ); - - properties.setText(output); -} diff --git a/higan/target-laevateinn/properties/properties.hpp b/higan/target-laevateinn/properties/properties.hpp deleted file mode 100755 index 836fa5b9..00000000 --- a/higan/target-laevateinn/properties/properties.hpp +++ /dev/null @@ -1,15 +0,0 @@ -struct PropertiesViewer : Window { - VerticalLayout layout; - HorizontalLayout controlLayout; - Label sourceLabel; - ComboBox sourceSelection; - Widget spacer; - CheckBox autoUpdate; - Button update; - TextEdit properties; - - void updateProperties(); - PropertiesViewer(); -}; - -extern PropertiesViewer *propertiesViewer; diff --git a/higan/target-laevateinn/resource.rc b/higan/target-laevateinn/resource.rc deleted file mode 100755 index b18944ff..00000000 --- a/higan/target-laevateinn/resource.rc +++ /dev/null @@ -1,2 +0,0 @@ -1 24 "../data/bsnes.Manifest" -2 ICON DISCARDABLE "../data/bsnes.ico" diff --git a/higan/target-laevateinn/settings/settings.cpp b/higan/target-laevateinn/settings/settings.cpp deleted file mode 100755 index 3caf8541..00000000 --- a/higan/target-laevateinn/settings/settings.cpp +++ /dev/null @@ -1,15 +0,0 @@ -#include "../base.hpp" -Settings *settings = nullptr; - -void Settings::load() { - config.append(folderpath, "folderpath"); - config.append(synchronizeAudio = true, "synchronizeAudio"); - config.append(muteAudio = false, "muteAudio"); - - config.load({ application->userpath, "settings.cfg" }); - config.save({ application->userpath, "settings.cfg" }); -} - -void Settings::save() { - config.save({ application->userpath, "settings.cfg" }); -} diff --git a/higan/target-laevateinn/settings/settings.hpp b/higan/target-laevateinn/settings/settings.hpp deleted file mode 100755 index 6bba26c8..00000000 --- a/higan/target-laevateinn/settings/settings.hpp +++ /dev/null @@ -1,11 +0,0 @@ -struct Settings { - configuration config; - string folderpath; - bool synchronizeAudio; - bool muteAudio; - - void load(); - void save(); -}; - -extern Settings *settings; diff --git a/higan/target-laevateinn/smp/registers.cpp b/higan/target-laevateinn/smp/registers.cpp deleted file mode 100755 index 027b1789..00000000 --- a/higan/target-laevateinn/smp/registers.cpp +++ /dev/null @@ -1,88 +0,0 @@ -SMPRegisterEditor *smpRegisterEditor = nullptr; - -SMPRegisterEditor::SMPRegisterEditor() { - setTitle("SMP Register Editor"); - - layout.setMargin(5); - regALabel.setText("A:"); - regAValue.setFont(application->monospaceFont); - regXLabel.setText("X:"); - regXValue.setFont(application->monospaceFont); - regYLabel.setText("Y:"); - regYValue.setFont(application->monospaceFont); - regSLabel.setText("S:01"); - regSValue.setFont(application->monospaceFont); - flagN.setText("N"); - flagV.setText("V"); - flagP.setText("P"); - flagB.setText("B"); - flagH.setText("H"); - flagI.setText("I"); - flagZ.setText("Z"); - flagC.setText("C"); - update.setText("Update"); - - loadRegisters(); - - layout.append(primaryLayout, {~0, 0}, 5); - primaryLayout.append(regALabel, {0, 0}, 5); - primaryLayout.append(regAValue, {0, 0}, 5); - primaryLayout.append(regXLabel, {0, 0}, 5); - primaryLayout.append(regXValue, {0, 0}, 5); - primaryLayout.append(regYLabel, {0, 0}, 5); - primaryLayout.append(regYValue, {0, 0}, 5); - primaryLayout.append(regSLabel, {0, 0}, 5); - primaryLayout.append(regSValue, {0, 0}); - layout.append(secondaryLayout, {~0, 0}, 5); - secondaryLayout.append(flagN, {0, 0}, 5); - secondaryLayout.append(flagV, {0, 0}, 5); - secondaryLayout.append(flagP, {0, 0}, 5); - secondaryLayout.append(flagB, {0, 0}, 5); - secondaryLayout.append(flagH, {0, 0}, 5); - secondaryLayout.append(flagI, {0, 0}, 5); - secondaryLayout.append(flagZ, {0, 0}, 5); - secondaryLayout.append(flagC, {0, 0}); - layout.append(tertiaryLayout, {~0, 0}); - tertiaryLayout.append(spacer, {~0, 0}); - tertiaryLayout.append(update, {80, 0}); - append(layout); - - update.onActivate = [&] { - saveRegisters(); - smpDebugger->updateDisassembly(); - setVisible(false); - }; - - setGeometry({{128, 128}, layout.minimumGeometry().size()}); - windowManager->append(this, "SMPRegisterEditor"); -} - -void SMPRegisterEditor::loadRegisters() { - regAValue.setText(hex<2>(SFC::smp.regs.a)); - regXValue.setText(hex<2>(SFC::smp.regs.x)); - regYValue.setText(hex<2>(SFC::smp.regs.y)); - regSValue.setText(hex<2>(SFC::smp.regs.s)); - flagN.setChecked(SFC::smp.regs.p.n); - flagV.setChecked(SFC::smp.regs.p.v); - flagP.setChecked(SFC::smp.regs.p.p); - flagB.setChecked(SFC::smp.regs.p.b); - flagH.setChecked(SFC::smp.regs.p.h); - flagI.setChecked(SFC::smp.regs.p.i); - flagZ.setChecked(SFC::smp.regs.p.z); - flagC.setChecked(SFC::smp.regs.p.c); -} - -void SMPRegisterEditor::saveRegisters() { - SFC::smp.regs.a = hex(regAValue.text()); - SFC::smp.regs.x = hex(regXValue.text()); - SFC::smp.regs.y = hex(regYValue.text()); - SFC::smp.regs.s = hex(regSValue.text()); - SFC::smp.regs.p.n = flagN.checked(); - SFC::smp.regs.p.v = flagV.checked(); - SFC::smp.regs.p.p = flagP.checked(); - SFC::smp.regs.p.b = flagB.checked(); - SFC::smp.regs.p.h = flagH.checked(); - SFC::smp.regs.p.i = flagI.checked(); - SFC::smp.regs.p.z = flagZ.checked(); - SFC::smp.regs.p.c = flagC.checked(); -} diff --git a/higan/target-laevateinn/smp/smp.cpp b/higan/target-laevateinn/smp/smp.cpp deleted file mode 100755 index 6f9e2692..00000000 --- a/higan/target-laevateinn/smp/smp.cpp +++ /dev/null @@ -1,108 +0,0 @@ -#include "../base.hpp" -SMPDebugger *smpDebugger = nullptr; - -#include "registers.cpp" - -uint8 SMPDebugger::read(uint16 addr) { - if((addr & 0xfff0) == 0x00f0) return ~0; //$00f0-00ff MMIO - return SFC::smp.op_busread(addr); -} - -void SMPDebugger::write(uint16 addr, uint8 data) { - if((addr & 0xfff0) == 0x00f0) return; //$00f0-00ff MMIO - return SFC::smp.op_buswrite(addr, data); -} - -unsigned SMPDebugger::opcodeLength(uint16 addr) { - static unsigned lengthTable[256] = { - 0 - }; - return lengthTable[SFC::smp.op_busread(addr)]; -} - -void SMPDebugger::updateDisassembly() { - string line[15]; - - line[7] = { "> ", SFC::smp.disassemble_opcode(opcodePC) }; - line[7][31] = 0; - - signed addr = opcodePC; - for(signed o = 6; o >= 0; o--) { - for(signed b = 1; b <= 3; b++) { - if(addr - b >= 0 && (debugger->apuUsage.data[addr - b] & Usage::Exec)) { - addr -= b; - line[o] = { " ", SFC::smp.disassemble_opcode(addr) }; - line[o][31] = 0; - break; - } - } - } - - addr = opcodePC; - for(signed o = 8; o <= 14; o++) { - for(signed b = 1; b <= 3; b++) { - if(addr - b <= 0xffff && (debugger->apuUsage.data[addr + b] & Usage::Exec)) { - addr += b; - line[o] = { " ", SFC::smp.disassemble_opcode(addr) }; - line[o][31] = 0; - break; - } - } - } - - string output; - for(auto &n : line) { - if(n.empty()) output.append(" ...\n"); - else output.append(n, "\n"); - } - output.rtrim<1>("\n"); - - disassembly.setText(output); - registers.setText({ - "YA:", hex<2>(SFC::smp.regs.y), hex<2>(SFC::smp.regs.a), - " A:", hex<2>(SFC::smp.regs.a), " X:", hex<2>(SFC::smp.regs.x), - " Y:", hex<2>(SFC::smp.regs.y), " S:01", hex<2>(SFC::smp.regs.s), " ", - SFC::smp.regs.p.n ? "N" : "n", SFC::smp.regs.p.v ? "V" : "v", - SFC::smp.regs.p.p ? "P" : "p", SFC::smp.regs.p.b ? "B" : "b", - SFC::smp.regs.p.h ? "H" : "h", SFC::smp.regs.p.i ? "I" : "i", - SFC::smp.regs.p.z ? "Z" : "z", SFC::smp.regs.p.c ? "C" : "c", - }); -} - -SMPDebugger::SMPDebugger() { - opcodePC = 0xffc0; - - setTitle("SMP Debugger"); - setGeometry({128, 128, 350, 255}); - - layout.setMargin(5); - stepInto.setText("Step Into"); - autoUpdate.setText("Auto"); - update.setText("Update"); - disassembly.setFont(application->monospaceFont); - registers.setFont(application->monospaceFont); - registers.setText(" "); - - layout.append(controlLayout, {~0, 0}, 5); - controlLayout.append(stepInto, {80, 0}, 5); - controlLayout.append(spacer, {~0, 0}); - controlLayout.append(autoUpdate, {0, 0}, 5); - controlLayout.append(update, {80, 0}); - layout.append(disassembly, {~0, ~0}, 5); - layout.append(registers, {~0, 0}); - append(layout); - - stepInto.onActivate = [&] { - debugger->flags.smp.stepInto = true; - debugger->resume(); - }; - - update.onActivate = { &SMPDebugger::updateDisassembly, this }; - - registers.onActivate = [&] { - smpRegisterEditor->loadRegisters(); - smpRegisterEditor->setVisible(); - }; - - windowManager->append(this, "SMPDebugger"); -} diff --git a/higan/target-laevateinn/smp/smp.hpp b/higan/target-laevateinn/smp/smp.hpp deleted file mode 100755 index 146cd2e1..00000000 --- a/higan/target-laevateinn/smp/smp.hpp +++ /dev/null @@ -1,51 +0,0 @@ -struct SMPDebugger : Window { - uint16 opcodePC; - - VerticalLayout layout; - HorizontalLayout controlLayout; - Button stepInto; - Widget spacer; - CheckBox autoUpdate; - Button update; - TextEdit disassembly; - Button registers; - - uint8 read(uint16 addr); - void write(uint16 addr, uint8 data); - - unsigned opcodeLength(uint16 addr); - void updateDisassembly(); - SMPDebugger(); -}; - -struct SMPRegisterEditor : Window { - VerticalLayout layout; - HorizontalLayout primaryLayout; - Label regALabel; - LineEdit regAValue; - Label regXLabel; - LineEdit regXValue; - Label regYLabel; - LineEdit regYValue; - Label regSLabel; - LineEdit regSValue; - HorizontalLayout secondaryLayout; - CheckBox flagN; - CheckBox flagV; - CheckBox flagP; - CheckBox flagB; - CheckBox flagH; - CheckBox flagI; - CheckBox flagZ; - CheckBox flagC; - HorizontalLayout tertiaryLayout; - Widget spacer; - Button update; - - void loadRegisters(); - void saveRegisters(); - SMPRegisterEditor(); -}; - -extern SMPDebugger *smpDebugger; -extern SMPRegisterEditor *smpRegisterEditor; diff --git a/higan/target-laevateinn/tracer/tracer.cpp b/higan/target-laevateinn/tracer/tracer.cpp deleted file mode 100755 index c30dc778..00000000 --- a/higan/target-laevateinn/tracer/tracer.cpp +++ /dev/null @@ -1,55 +0,0 @@ -#include "../base.hpp" -Tracer *tracer = nullptr; - -void Tracer::resetMask() { - memset(cpuMask, 0, 0x200000); - memset(smpMask, 0, 0x2000); -} - -bool Tracer::maskCPU(uint24 addr) { - if(mask == false) return false; - if(cpuMask[addr >> 3] & (1 << (addr & 7))) return true; - cpuMask[addr >> 3] |= 1 << (addr & 7); - return false; -} - -bool Tracer::maskSMP(uint16 addr) { - if(mask == false) return false; - if(smpMask[addr >> 3] & (1 << (addr & 7))) return true; - smpMask[addr >> 3] |= 1 << (addr & 7); - return false; -} - -bool Tracer::enabled() { - return fp.open(); -} - -void Tracer::enable(bool state) { - if(state == false) { - debugger->print("Tracer disabled\n"); - fp.close(); - return; - } - - //try not to overwrite existing traces: scan from 001-999. - //if all files exist, use 000, even if it overwrites another log. - unsigned n = 1; - do { - if(file::exists({ interface->pathName, "debug/trace-", decimal<3, '0'>(n), ".log" }) == false) break; - } while(++n <= 999); - - string filename = { interface->pathName, "debug/trace-", decimal<3, '0'>(n), ".log" }; - if(fp.open(filename, file::mode::write) == false) return; - debugger->print("Tracing to ", filename, "\n"); -} - -Tracer::Tracer() { - mask = false; - cpuMask = new uint8_t[0x200000](); - smpMask = new uint8_t[0x2000](); -} - -Tracer::~Tracer() { - delete[] cpuMask; - delete[] smpMask; -} diff --git a/higan/target-laevateinn/tracer/tracer.hpp b/higan/target-laevateinn/tracer/tracer.hpp deleted file mode 100755 index c599b461..00000000 --- a/higan/target-laevateinn/tracer/tracer.hpp +++ /dev/null @@ -1,22 +0,0 @@ -struct Tracer { - file fp; - bool mask; - uint8_t *cpuMask; - uint8_t *smpMask; - - void resetMask(); - bool maskCPU(uint24 addr); - bool maskSMP(uint16 addr); - - bool enabled(); - void enable(bool); - - Tracer(); - ~Tracer(); - - template void print(Args&&... args) { - fp.print(std::forward(args)...); - } -}; - -extern Tracer *tracer; diff --git a/higan/target-laevateinn/video/video.cpp b/higan/target-laevateinn/video/video.cpp deleted file mode 100755 index 4f6dfd6e..00000000 --- a/higan/target-laevateinn/video/video.cpp +++ /dev/null @@ -1,46 +0,0 @@ -#include "../base.hpp" -VideoWindow *videoWindow = nullptr; - -VideoWindow::VideoWindow() { - setTitle("Video"); -//setResizable(false); - setGeometry({64, 64, 512, 480}); - setStatusFont(application->proportionalFontBold); - setStatusVisible(); - - canvas.setSize({512, 480}); - layout.append(canvas, {~0, ~0}); - append(layout); - - image logo(0, 32, 255u << 24, 255u << 16, 255u << 8, 255u << 0); - logo.loadPNG(laevateinnLogo, sizeof laevateinnLogo); - logo.alphaBlend(0x000000); - - unsigned cx = (512 - logo.width) / 2, cy = (480 - logo.height) / 2; - for(unsigned y = 0; y < logo.height; y++) { - uint32_t *dp = canvas.data() + (y + cy) * 512 + cx; - const uint32_t *sp = (const uint32_t*)logo.data + y * logo.width; - for(unsigned x = 0; x < logo.width; x++) { - *dp++ = *sp++; - } - } - - canvas.update(); - - canvas.onMouseLeave = [&] { - setStatusText(""); - }; - - canvas.onMouseMove = [&](Position position) { - uint32_t color = canvas.data()[position.y * 512 + position.x]; - unsigned r = (color >> 19) & 31, g = (color >> 11) & 31, b = (color >> 3) & 31; - - setStatusText({ - decimal(position.x / 2), ".", decimal((position.x & 1) * 5), ", ", - decimal(position.y / 2), ".", decimal((position.y & 1) * 5), ", ", - "0x", hex<4>((b << 10) + (g << 5) + (r << 0)) - }); - }; - - windowManager->append(this, "VideoWindow"); -} diff --git a/higan/target-laevateinn/video/video.hpp b/higan/target-laevateinn/video/video.hpp deleted file mode 100755 index 68368623..00000000 --- a/higan/target-laevateinn/video/video.hpp +++ /dev/null @@ -1,8 +0,0 @@ -struct VideoWindow : Window { - VerticalLayout layout; - Canvas canvas; - - VideoWindow(); -}; - -extern VideoWindow *videoWindow; diff --git a/higan/target-laevateinn/vram/vram.cpp b/higan/target-laevateinn/vram/vram.cpp deleted file mode 100755 index 36d596de..00000000 --- a/higan/target-laevateinn/vram/vram.cpp +++ /dev/null @@ -1,126 +0,0 @@ -#include "../base.hpp" -VRAMViewer *vramViewer = nullptr; - -VRAMViewer::VRAMViewer() { - setTitle("VRAM Viewer"); - setStatusFont(application->proportionalFontBold); - setStatusVisible(); - - layout.setMargin(5); - modeLabel.setText("Mode:"); - modeSelection.append("2bpp", "4bpp", "8bpp"); - autoUpdate.setText("Auto"); - update.setText("Update"); - canvas.setSize({512, 512}); - - layout.append(controlLayout, {~0, 0}, 5); - controlLayout.append(modeLabel, {0, 0}, 5); - controlLayout.append(modeSelection, {0, 0}, 5); - controlLayout.append(spacer, {~0, 0}); - controlLayout.append(autoUpdate, {0, 0}, 5); - controlLayout.append(update, {80, 0}); - layout.append(canvas, {512, 512}); - append(layout); - - modeSelection.onChange = update.onActivate = { &VRAMViewer::updateTiles, this }; - - canvas.onMouseLeave = [&] { setStatusText(""); }; - canvas.onMouseMove = [&](Position position) { - unsigned x = position.x, y = position.y, mode = modeSelection.selection(); - if(x >= 256 && mode >= 2) return setStatusText(""); - if(y >= 256 && mode >= 1) return setStatusText(""); - string output = { x, ", ", y, ", " }; - x /= 8, y /= 8; - unsigned tile = 0; - if(mode == 0) tile = y * 64 + x; - if(mode == 1) tile = y * 64 + x; - if(mode == 2) tile = y * 32 + x; - output.append("Tile: 0x", hex<4>(tile), ", Address: 0x", hex<4>(tile * (16 << mode))); - setStatusText(output); - }; - - setGeometry({{128, 128}, layout.minimumGeometry().size()}); - windowManager->append(this, "VRAMViewer"); -} - -void VRAMViewer::updateTiles() { - uint32_t *dp = canvas.data(); - for(unsigned y = 0; y < 512; y++) { - for(unsigned x = 0; x < 512; x++) { - *dp++ = 0xff800000; - } - } - dp = canvas.data(); - const uint8_t *sp = SFC::ppu.vram; - - if(modeSelection.selection() == 0) { - for(unsigned tileY = 0; tileY < 64; tileY++) { - for(unsigned tileX = 0; tileX < 64; tileX++) { - for(unsigned y = 0; y < 8; y++) { - uint8_t d[] = { sp[0], sp[1] }; - for(unsigned x = 0; x < 8; x++) { - unsigned color = 0; - color += d[0] & 0x80 ? 1 : 0; - color += d[1] & 0x80 ? 2 : 0; - for(auto &b : d) b <<= 1; - color *= 0x55; - color = (255u << 24) + (color << 16) + (color << 8) + (color << 0); - dp[(tileY * 8 + y) * 512 + (tileX * 8 + x)] = color; - } - sp += 2; - } - } - } - } - - if(modeSelection.selection() == 1) { - for(unsigned tileY = 0; tileY < 32; tileY++) { - for(unsigned tileX = 0; tileX < 64; tileX++) { - for(unsigned y = 0; y < 8; y++) { - uint8_t d[] = { sp[0], sp[1], sp[16], sp[17] }; - for(unsigned x = 0; x < 8; x++) { - unsigned color = 0; - color += d[0] & 0x80 ? 1 : 0; - color += d[1] & 0x80 ? 2 : 0; - color += d[2] & 0x80 ? 4 : 0; - color += d[3] & 0x80 ? 8 : 0; - for(auto &b : d) b <<= 1; - color *= 0x11; - color = (255u << 24) + (color << 16) + (color << 8) + (color << 0); - dp[(tileY * 8 + y) * 512 + (tileX * 8 + x)] = color; - } - sp += 2; - } - sp += 16; - } - } - } - - if(modeSelection.selection() == 2) { - for(unsigned tileY = 0; tileY < 32; tileY++) { - for(unsigned tileX = 0; tileX < 32; tileX++) { - for(unsigned y = 0; y < 8; y++) { - uint8_t d[] = { sp[0], sp[1], sp[16], sp[17], sp[32], sp[33], sp[48], sp[49] }; - for(unsigned x = 0; x < 8; x++) { - unsigned color = 0; - color += d[0] & 0x80 ? 1 : 0; - color += d[1] & 0x80 ? 2 : 0; - color += d[2] & 0x80 ? 4 : 0; - color += d[3] & 0x80 ? 8 : 0; - color += d[4] & 0x80 ? 16 : 0; - color += d[5] & 0x80 ? 32 : 0; - color += d[6] & 0x80 ? 64 : 0; - color += d[7] & 0x80 ? 128 : 0; - for(auto &b : d) b <<= 1; - color = (255u << 24) + (color << 16) + (color << 8) + (color << 0); - dp[(tileY * 8 + y) * 512 + (tileX * 8 + x)] = color; - } - sp += 2; - } - sp += 48; - } - } - } - - canvas.update(); -} diff --git a/higan/target-laevateinn/vram/vram.hpp b/higan/target-laevateinn/vram/vram.hpp deleted file mode 100755 index eb21af6e..00000000 --- a/higan/target-laevateinn/vram/vram.hpp +++ /dev/null @@ -1,15 +0,0 @@ -struct VRAMViewer : Window { - VerticalLayout layout; - HorizontalLayout controlLayout; - Label modeLabel; - ComboBox modeSelection; - Widget spacer; - CheckBox autoUpdate; - Button update; - Canvas canvas; - - void updateTiles(); - VRAMViewer(); -}; - -extern VRAMViewer *vramViewer; diff --git a/higan/target-laevateinn/window/window.cpp b/higan/target-laevateinn/window/window.cpp deleted file mode 100755 index 3353fec3..00000000 --- a/higan/target-laevateinn/window/window.cpp +++ /dev/null @@ -1,25 +0,0 @@ -#include "../base.hpp" -WindowManager *windowManager = nullptr; - -void WindowManager::append(Window *window, const string &name) { - windowList.append({window, name, window->geometry().text()}); -} - -void WindowManager::loadGeometry() { - for(auto &window : windowList) { - config.append(window.geometry, window.name); - } - config.load({application->userpath, "geometry.cfg"}); - config.save({application->userpath, "geometry.cfg"}); - for(auto &window : windowList) { - window.window->setGeometry(window.geometry); - } -} - -void WindowManager::saveGeometry() { - for(auto &window : windowList) { - window.geometry = window.window->geometry().text(); - window.window->setVisible(false); - } - config.save({application->userpath, "geometry.cfg"}); -} diff --git a/higan/target-laevateinn/window/window.hpp b/higan/target-laevateinn/window/window.hpp deleted file mode 100755 index 590beeb0..00000000 --- a/higan/target-laevateinn/window/window.hpp +++ /dev/null @@ -1,15 +0,0 @@ -struct WindowManager { - struct WindowItem { - Window *window; - string name; - string geometry; - }; - vector windowList; - configuration config; - - void append(Window *window, const string &name); - void loadGeometry(); - void saveGeometry(); -}; - -extern WindowManager *windowManager;