From f0209cdb864efbc44bfc2b0a5419ff1334c74c11 Mon Sep 17 00:00:00 2001 From: Vladimir Kononovich Date: Sun, 27 Sep 2020 04:37:49 +0300 Subject: [PATCH 1/8] Added Visual Studio solution for bsnes. --- bsnes/ruby/video/direct3d.cpp | 3 - bsnes/snes/audio/audio.cpp | 4 +- bsnes/snes/cartridge/xml.cpp | 8 +- bsnes/snes/input/input.cpp | 50 +- bsnes/snes/libsnes/libsnes.cpp | 12 +- bsnes/snes/system/system.cpp | 6 +- bsnes/snes/system/system.hpp | 2 +- bsnes/snes/video/video.cpp | 4 +- bsnes/ui-qt/application/application.cpp | 2 +- bsnes/ui-qt/base/main.cpp | 4 +- bsnes/ui-qt/debugger/ppu/oam-data-model.cpp | 2 +- .../ui-qt/debugger/ppu/oam-data-model.moc.hpp | 1 + bsnes/ui-qt/input/userinterface-general.cpp | 6 +- bsnes/ui-qt/interface.cpp | 2 +- bsnes/ui-qt/interface.hpp | 2 +- bsnes/ui-qt/resource/resource.rc | 4 +- bsnes/ui-qt/utility/utility.cpp | 6 +- bsnes/vstudio/bsnes/bsnes.sln | 55 + bsnes/vstudio/bsnes/bsnes.vcxproj | 5576 +++++++++++++++++ bsnes/vstudio/bsnes/bsnes.vcxproj.filters | 1853 ++++++ bsnes/vstudio/bsnes/bsnes.vcxproj.user | 4 + common/nall/bps/patch.hpp | 5 +- common/nall/platform.hpp | 2 +- common/nall/utf8.hpp | 1 - 24 files changed, 7551 insertions(+), 63 deletions(-) create mode 100644 bsnes/vstudio/bsnes/bsnes.sln create mode 100644 bsnes/vstudio/bsnes/bsnes.vcxproj create mode 100644 bsnes/vstudio/bsnes/bsnes.vcxproj.filters create mode 100644 bsnes/vstudio/bsnes/bsnes.vcxproj.user diff --git a/bsnes/ruby/video/direct3d.cpp b/bsnes/ruby/video/direct3d.cpp index 353b0e17..588a36f3 100644 --- a/bsnes/ruby/video/direct3d.cpp +++ b/bsnes/ruby/video/direct3d.cpp @@ -1,8 +1,5 @@ -#undef interface -#define interface struct #include #include -#undef interface #define D3DVERTEX (D3DFVF_XYZRHW | D3DFVF_TEX1) diff --git a/bsnes/snes/audio/audio.cpp b/bsnes/snes/audio/audio.cpp index dc6d504e..1657fc8a 100644 --- a/bsnes/snes/audio/audio.cpp +++ b/bsnes/snes/audio/audio.cpp @@ -80,7 +80,7 @@ void Audio::add_stream(Stream* stream) { void Audio::sample(int16 left, int16 right) { if(!streams.size()) { - system.interface->audio_sample(left, right); + system.intf->audio_sample(left, right); } else { dsp_buffer[dsp_wroffset] = ((uint16)left << 0) + ((uint16)right << 16); dsp_wroffset = (dsp_wroffset + 1) & 32767; @@ -108,7 +108,7 @@ void Audio::flush() { right += (int16)(sample >> 16); } - system.interface->audio_sample( + system.intf->audio_sample( sclamp<16>(left / 2), sclamp<16>(right / 2) ); diff --git a/bsnes/snes/cartridge/xml.cpp b/bsnes/snes/cartridge/xml.cpp index 5dd475d2..3a0a602a 100644 --- a/bsnes/snes/cartridge/xml.cpp +++ b/bsnes/snes/cartridge/xml.cpp @@ -235,7 +235,7 @@ void Cartridge::xml_parse_necdsp(xml_element &root) { for(unsigned n = 0; n < dromsize; n++) necdsp.dataROM[n] = fp.readm(2); fp.seek(0); - uint8_t data[filesize]; + uint8_t *data = new uint8_t[filesize]; fp.read(data, filesize); sha256_ctx sha; @@ -245,6 +245,8 @@ void Cartridge::xml_parse_necdsp(xml_element &root) { sha256_final(&sha); sha256_hash(&sha, shahash); foreach(n, shahash) programhash.append(hex<2>(n)); + + delete[] data; } fp.close(); } @@ -281,9 +283,9 @@ void Cartridge::xml_parse_necdsp(xml_element &root) { } if(programhash == "") { - system.interface->message({ "Warning: NEC DSP program ", program, " is missing." }); + system.intf->message({ "Warning: NEC DSP program ", program, " is missing." }); } else if(sha256 != "" && sha256 != programhash) { - system.interface->message({ + system.intf->message({ "Warning: NEC DSP program ", program, " SHA256 is incorrect.\n\n" "Expected:\n", sha256, "\n\n" "Actual:\n", programhash diff --git a/bsnes/snes/input/input.cpp b/bsnes/snes/input/input.cpp index bd34c106..af2ad043 100644 --- a/bsnes/snes/input/input.cpp +++ b/bsnes/snes/input/input.cpp @@ -14,9 +14,9 @@ uint8 Input::port_read(bool portnumber) { case Device::SGBCommander: { if(cpu.joylatch() == 0) { if(p.counter0 >= 16) return 1; - return system.interface->input_poll(portnumber, p.device, 0, p.counter0++); + return system.intf->input_poll(portnumber, p.device, 0, p.counter0++); } else { - return system.interface->input_poll(portnumber, p.device, 0, 0); + return system.intf->input_poll(portnumber, p.device, 0, 0); } } //case Device::Joypad @@ -42,8 +42,8 @@ uint8 Input::port_read(bool portnumber) { deviceindex1 = 3; //controller 4 } - return (system.interface->input_poll(portnumber, p.device, deviceindex0, deviceidx) << 0) - | (system.interface->input_poll(portnumber, p.device, deviceindex1, deviceidx) << 1); + return (system.intf->input_poll(portnumber, p.device, deviceindex0, deviceidx) << 0) + | (system.intf->input_poll(portnumber, p.device, deviceindex1, deviceidx) << 1); } //case Device::Multitap case Device::Mouse: { @@ -65,8 +65,8 @@ uint8 Input::port_read(bool portnumber) { case 6: return 0; case 7: return 0; - case 8: return system.interface->input_poll(portnumber, p.device, 0, (unsigned)MouseID::Right); - case 9: return system.interface->input_poll(portnumber, p.device, 0, (unsigned)MouseID::Left); + case 8: return system.intf->input_poll(portnumber, p.device, 0, (unsigned)MouseID::Right); + case 9: return system.intf->input_poll(portnumber, p.device, 0, (unsigned)MouseID::Left); case 10: return (p.mouse.speed >> 1) & 1; //speed (0 = slow, 1 = normal, 2 = fast, 3 = unused) case 11: return (p.mouse.speed >> 0) & 1; // || @@ -101,7 +101,7 @@ uint8 Input::port_read(bool portnumber) { if(p.counter0 == 0) { //turbo is a switch; toggle is edge sensitive - bool turbo = system.interface->input_poll(portnumber, p.device, 0, (unsigned)SuperScopeID::Turbo); + bool turbo = system.intf->input_poll(portnumber, p.device, 0, (unsigned)SuperScopeID::Turbo); if(turbo && !p.superscope.turbolock) { p.superscope.turbo = !p.superscope.turbo; //toggle state p.superscope.turbolock = true; @@ -112,7 +112,7 @@ uint8 Input::port_read(bool portnumber) { //trigger is a button //if turbo is active, trigger is level sensitive; otherwise it is edge sensitive p.superscope.trigger = false; - bool trigger = system.interface->input_poll(portnumber, p.device, 0, (unsigned)SuperScopeID::Trigger); + bool trigger = system.intf->input_poll(portnumber, p.device, 0, (unsigned)SuperScopeID::Trigger); if(trigger && (p.superscope.turbo || !p.superscope.triggerlock)) { p.superscope.trigger = true; p.superscope.triggerlock = true; @@ -121,11 +121,11 @@ uint8 Input::port_read(bool portnumber) { } //cursor is a button; it is always level sensitive - p.superscope.cursor = system.interface->input_poll(portnumber, p.device, 0, (unsigned)SuperScopeID::Cursor); + p.superscope.cursor = system.intf->input_poll(portnumber, p.device, 0, (unsigned)SuperScopeID::Cursor); //pause is a button; it is always edge sensitive p.superscope.pause = false; - bool pause = system.interface->input_poll(portnumber, p.device, 0, (unsigned)SuperScopeID::Pause); + bool pause = system.intf->input_poll(portnumber, p.device, 0, (unsigned)SuperScopeID::Pause); if(pause && !p.superscope.pauselock) { p.superscope.pause = true; p.superscope.pauselock = true; @@ -156,12 +156,12 @@ uint8 Input::port_read(bool portnumber) { if(p.counter0 >= 32) return 1; if(p.counter0 == 0) { - p.justifier.trigger1 = system.interface->input_poll(portnumber, p.device, 0, (unsigned)JustifierID::Trigger); - p.justifier.start1 = system.interface->input_poll(portnumber, p.device, 0, (unsigned)JustifierID::Start); + p.justifier.trigger1 = system.intf->input_poll(portnumber, p.device, 0, (unsigned)JustifierID::Trigger); + p.justifier.start1 = system.intf->input_poll(portnumber, p.device, 0, (unsigned)JustifierID::Start); if(p.device == Device::Justifiers) { - p.justifier.trigger2 = system.interface->input_poll(portnumber, p.device, 1, (unsigned)JustifierID::Trigger); - p.justifier.start2 = system.interface->input_poll(portnumber, p.device, 1, (unsigned)JustifierID::Start); + p.justifier.trigger2 = system.intf->input_poll(portnumber, p.device, 1, (unsigned)JustifierID::Trigger); + p.justifier.start2 = system.intf->input_poll(portnumber, p.device, 1, (unsigned)JustifierID::Start); } else { p.justifier.x2 = -1; p.justifier.y2 = -1; @@ -225,9 +225,9 @@ uint8 Input::port_read(bool portnumber) { return 0; } - return system.interface->input_poll(portnumber, p.device, 0, p.counter0++); + return system.intf->input_poll(portnumber, p.device, 0, p.counter0++); } else { - return system.interface->input_poll(portnumber, p.device, 0, 0); + return system.intf->input_poll(portnumber, p.device, 0, 0); } } //case Device::NTTDataKeypad @@ -240,13 +240,13 @@ uint8 Input::port_read(bool portnumber) { //scan all input; update cursor positions if needed void Input::update() { - system.interface->input_poll(); + system.intf->input_poll(); port_t &p = port[1]; switch(p.device) { case Device::SuperScope: { - int x = system.interface->input_poll(1, p.device, 0, (unsigned)SuperScopeID::X); - int y = system.interface->input_poll(1, p.device, 0, (unsigned)SuperScopeID::Y); + int x = system.intf->input_poll(1, p.device, 0, (unsigned)SuperScopeID::X); + int y = system.intf->input_poll(1, p.device, 0, (unsigned)SuperScopeID::Y); x += p.superscope.x; y += p.superscope.y; p.superscope.x = max(-16, min(256 + 16, x)); @@ -258,15 +258,15 @@ void Input::update() { case Device::Justifier: case Device::Justifiers: { - int x1 = system.interface->input_poll(1, p.device, 0, (unsigned)JustifierID::X); - int y1 = system.interface->input_poll(1, p.device, 0, (unsigned)JustifierID::Y); + int x1 = system.intf->input_poll(1, p.device, 0, (unsigned)JustifierID::X); + int y1 = system.intf->input_poll(1, p.device, 0, (unsigned)JustifierID::Y); x1 += p.justifier.x1; y1 += p.justifier.y1; p.justifier.x1 = max(-16, min(256 + 16, x1)); p.justifier.y1 = max(-16, min(240 + 16, y1)); - int x2 = system.interface->input_poll(1, p.device, 1, (unsigned)JustifierID::X); - int y2 = system.interface->input_poll(1, p.device, 1, (unsigned)JustifierID::Y); + int x2 = system.intf->input_poll(1, p.device, 1, (unsigned)JustifierID::X); + int y2 = system.intf->input_poll(1, p.device, 1, (unsigned)JustifierID::Y); x2 += p.justifier.x2; y2 += p.justifier.y2; p.justifier.x2 = max(-16, min(256 + 16, x2)); @@ -360,8 +360,8 @@ void Input::poll() { port[i].counter1 = 0; if(port[i].device == Device::Mouse) { - int x = system.interface->input_poll(i, port[i].device, 0, (unsigned)MouseID::X); //-n = left, 0 = center, +n = right - int y = system.interface->input_poll(i, port[i].device, 0, (unsigned)MouseID::Y); //-n = up, 0 = center, +n = down + int x = system.intf->input_poll(i, port[i].device, 0, (unsigned)MouseID::X); //-n = left, 0 = center, +n = right + int y = system.intf->input_poll(i, port[i].device, 0, (unsigned)MouseID::Y); //-n = up, 0 = center, +n = down port[i].mouse.dx = x < 0; port[i].mouse.dy = y < 0; diff --git a/bsnes/snes/libsnes/libsnes.cpp b/bsnes/snes/libsnes/libsnes.cpp index 4930fa79..445174ec 100644 --- a/bsnes/snes/libsnes/libsnes.cpp +++ b/bsnes/snes/libsnes/libsnes.cpp @@ -31,7 +31,7 @@ struct Interface : public SNES::Interface { } }; -static Interface interface; +static Interface intf; unsigned snes_library_revision_major(void) { return 1; @@ -42,19 +42,19 @@ unsigned snes_library_revision_minor(void) { } void snes_set_video_refresh(snes_video_refresh_t video_refresh) { - interface.pvideo_refresh = video_refresh; + intf.pvideo_refresh = video_refresh; } void snes_set_audio_sample(snes_audio_sample_t audio_sample) { - interface.paudio_sample = audio_sample; + intf.paudio_sample = audio_sample; } void snes_set_input_poll(snes_input_poll_t input_poll) { - interface.pinput_poll = input_poll; + intf.pinput_poll = input_poll; } void snes_set_input_state(snes_input_state_t input_state) { - interface.pinput_state = input_state; + intf.pinput_state = input_state; } void snes_set_controller_port_device(bool port, unsigned device) { @@ -66,7 +66,7 @@ void snes_set_cartridge_basename(const char *basename) { } void snes_init(void) { - SNES::system.init(&interface); + SNES::system.init(&intf); SNES::input.port_set_device(0, SNES::Input::Device::Joypad); SNES::input.port_set_device(1, SNES::Input::Device::Joypad); } diff --git a/bsnes/snes/system/system.cpp b/bsnes/snes/system/system.cpp index 8a6fa9a9..6f09cd00 100644 --- a/bsnes/snes/system/system.cpp +++ b/bsnes/snes/system/system.cpp @@ -71,8 +71,8 @@ bool System::runthreadtosave(cothread_t& thread) { } void System::init(Interface *interface_) { - interface = interface_; - assert(interface != 0); + intf = interface_; + assert(intf != 0); supergameboy.init(); superfx.init(); @@ -236,7 +236,7 @@ void System::scanline() { void System::frame() { } -System::System() : interface(0) { +System::System() : intf(0) { region = Region::Autodetect; expansion = ExpansionPortDevice::None; } diff --git a/bsnes/snes/system/system.hpp b/bsnes/snes/system/system.hpp index 171e6743..a5a812ad 100644 --- a/bsnes/snes/system/system.hpp +++ b/bsnes/snes/system/system.hpp @@ -30,7 +30,7 @@ class System : property { System(); private: - Interface *interface; + Interface *intf; bool runthreadtosave(cothread_t&); void serialize(serializer&); diff --git a/bsnes/snes/video/video.cpp b/bsnes/snes/video/video.cpp index a36a38b9..c34bf7f8 100644 --- a/bsnes/snes/video/video.cpp +++ b/bsnes/snes/video/video.cpp @@ -72,13 +72,13 @@ void Video::update() { } } - system.interface->video_extras(data, width, height); + system.intf->video_extras(data, width, height); if(frame_interlace) { height <<= 1; } - system.interface->video_refresh(ppu.output + 1024, width, height); + system.intf->video_refresh(ppu.output + 1024, width, height); frame_hires = false; frame_interlace = false; diff --git a/bsnes/ui-qt/application/application.cpp b/bsnes/ui-qt/application/application.cpp index f2276482..af49900d 100644 --- a/bsnes/ui-qt/application/application.cpp +++ b/bsnes/ui-qt/application/application.cpp @@ -159,7 +159,7 @@ int Application::main(int &argc, char **argv) { config().load(configFilename); mapper().bind(); init(); - SNES::system.init(&interface); + SNES::system.init(&intf); mainWindow->system_loadSpecial_superGameBoy->setVisible(SNES::supergameboy.opened()); parseArguments(); diff --git a/bsnes/ui-qt/base/main.cpp b/bsnes/ui-qt/base/main.cpp index 98f03c21..8d940df1 100644 --- a/bsnes/ui-qt/base/main.cpp +++ b/bsnes/ui-qt/base/main.cpp @@ -615,12 +615,12 @@ void MainWindow::recordMovieFromHere() { void MainWindow::saveScreenshot() { //tell SNES::Interface to save a screenshot at the next video_refresh() event - interface.saveScreenshot = true; + intf.saveScreenshot = true; } void MainWindow::saveSPC() { //tell the S-SMP core to save a SPC after the next note-on - interface.captureSPC(); + intf.captureSPC(); } void MainWindow::loadState() { diff --git a/bsnes/ui-qt/debugger/ppu/oam-data-model.cpp b/bsnes/ui-qt/debugger/ppu/oam-data-model.cpp index c769b950..192d91d2 100644 --- a/bsnes/ui-qt/debugger/ppu/oam-data-model.cpp +++ b/bsnes/ui-qt/debugger/ppu/oam-data-model.cpp @@ -36,7 +36,7 @@ OamDataModel::OamDataModel(QObject* parent) { assert(COLUMN_STRINGS.size() == N_COLUMNS); assert(FLIP_STRINGS.size() == 4); - assert(OBJECT_SIZE_TABLE == N_OAM_BASE_SIZES); + assert(OBJECT_SIZE_TABLE.size() == N_OAM_BASE_SIZES); for(OamObject& obj : mOamObjects) { obj.visible = true; diff --git a/bsnes/ui-qt/debugger/ppu/oam-data-model.moc.hpp b/bsnes/ui-qt/debugger/ppu/oam-data-model.moc.hpp index 1a778ce8..c2d6bb8a 100644 --- a/bsnes/ui-qt/debugger/ppu/oam-data-model.moc.hpp +++ b/bsnes/ui-qt/debugger/ppu/oam-data-model.moc.hpp @@ -1,3 +1,4 @@ +#undef small struct OamObject { signed xpos; diff --git a/bsnes/ui-qt/input/userinterface-general.cpp b/bsnes/ui-qt/input/userinterface-general.cpp index f1f6fefc..d63ee2e1 100644 --- a/bsnes/ui-qt/input/userinterface-general.cpp +++ b/bsnes/ui-qt/input/userinterface-general.cpp @@ -46,10 +46,10 @@ struct ToggleCheatSystem : HotkeyInput { struct CaptureScreenshot : HotkeyInput { void pressed() { //tell SNES::Interface to save a screenshot at the next video_refresh() event - interface.saveScreenshot = true; + intf.saveScreenshot = true; } - CaptureScreenshot() : HotkeyInput("Capture Screenshot", "input.userInterface.general.captureScreenshot") { + CaptureScreenshot() : HotkeyInput("Capture Screenshot", "input.userintf.general.captureScreenshot") { userInterfaceGeneral.attach(this); } } captureScreenshot; @@ -57,7 +57,7 @@ struct CaptureScreenshot : HotkeyInput { struct CaptureSPC : HotkeyInput { void pressed() { //tell the S-SMP core to save a SPC after the next note-on - interface.captureSPC(); + intf.captureSPC(); } CaptureSPC() : HotkeyInput("Capture SPC Dump", "input.userInterface.general.captureSPC") { diff --git a/bsnes/ui-qt/interface.cpp b/bsnes/ui-qt/interface.cpp index 722138f0..7432faba 100644 --- a/bsnes/ui-qt/interface.cpp +++ b/bsnes/ui-qt/interface.cpp @@ -1,4 +1,4 @@ -Interface interface; +Interface intf; void Interface::video_extras(uint16_t *data, unsigned width, unsigned height) { if (music.loaded()) music.render((uint16_t*)data, 1024, width, height); diff --git a/bsnes/ui-qt/interface.hpp b/bsnes/ui-qt/interface.hpp index 6c1f6080..de047ccc 100644 --- a/bsnes/ui-qt/interface.hpp +++ b/bsnes/ui-qt/interface.hpp @@ -15,4 +15,4 @@ class Interface : public SNES::Interface { unsigned framesExecuted; }; -extern Interface interface; +extern Interface intf; diff --git a/bsnes/ui-qt/resource/resource.rc b/bsnes/ui-qt/resource/resource.rc index 63dfef44..9c54f9c0 100644 --- a/bsnes/ui-qt/resource/resource.rc +++ b/bsnes/ui-qt/resource/resource.rc @@ -1,2 +1,2 @@ -1 24 "data/bsnes.Manifest" -IDI_ICON1 ICON DISCARDABLE "data/bsnes.ico" +1 24 "../../data/bsnes.Manifest" +IDI_ICON1 ICON DISCARDABLE "../../data/bsnes.ico" diff --git a/bsnes/ui-qt/utility/utility.cpp b/bsnes/ui-qt/utility/utility.cpp index 9c1863c3..28e07606 100644 --- a/bsnes/ui-qt/utility/utility.cpp +++ b/bsnes/ui-qt/utility/utility.cpp @@ -30,9 +30,9 @@ void Utility::updateSystemState() { text = "Power off"; } else if(application.pause == true || application.autopause == true) { text = "Paused"; - } else if(interface.framesUpdated == true) { - interface.framesUpdated = false; - text << interface.framesExecuted; + } else if(intf.framesUpdated == true) { + intf.framesUpdated = false; + text << intf.framesExecuted; text << " fps"; } else { //nothing to update diff --git a/bsnes/vstudio/bsnes/bsnes.sln b/bsnes/vstudio/bsnes/bsnes.sln new file mode 100644 index 00000000..640141ec --- /dev/null +++ b/bsnes/vstudio/bsnes/bsnes.sln @@ -0,0 +1,55 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 16 +VisualStudioVersion = 16.0.30517.126 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "bsnes", "bsnes.vcxproj", "{42D864F9-AFDA-4EF7-99C3-218E982AA46E}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug-Accuracy|x64 = Debug-Accuracy|x64 + Debug-Accuracy|x86 = Debug-Accuracy|x86 + Debug-Compatibility|x64 = Debug-Compatibility|x64 + Debug-Compatibility|x86 = Debug-Compatibility|x86 + Debug-Performance|x64 = Debug-Performance|x64 + Debug-Performance|x86 = Debug-Performance|x86 + Release-Accuracy|x64 = Release-Accuracy|x64 + Release-Accuracy|x86 = Release-Accuracy|x86 + Release-Compatibility|x64 = Release-Compatibility|x64 + Release-Compatibility|x86 = Release-Compatibility|x86 + Release-Performance|x64 = Release-Performance|x64 + Release-Performance|x86 = Release-Performance|x86 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {42D864F9-AFDA-4EF7-99C3-218E982AA46E}.Debug-Accuracy|x64.ActiveCfg = Debug-Accuracy|x64 + {42D864F9-AFDA-4EF7-99C3-218E982AA46E}.Debug-Accuracy|x64.Build.0 = Debug-Accuracy|x64 + {42D864F9-AFDA-4EF7-99C3-218E982AA46E}.Debug-Accuracy|x86.ActiveCfg = Debug-Accuracy|Win32 + {42D864F9-AFDA-4EF7-99C3-218E982AA46E}.Debug-Accuracy|x86.Build.0 = Debug-Accuracy|Win32 + {42D864F9-AFDA-4EF7-99C3-218E982AA46E}.Debug-Compatibility|x64.ActiveCfg = Debug-Compatibility|x64 + {42D864F9-AFDA-4EF7-99C3-218E982AA46E}.Debug-Compatibility|x64.Build.0 = Debug-Compatibility|x64 + {42D864F9-AFDA-4EF7-99C3-218E982AA46E}.Debug-Compatibility|x86.ActiveCfg = Debug-Compatibility|Win32 + {42D864F9-AFDA-4EF7-99C3-218E982AA46E}.Debug-Compatibility|x86.Build.0 = Debug-Compatibility|Win32 + {42D864F9-AFDA-4EF7-99C3-218E982AA46E}.Debug-Performance|x64.ActiveCfg = Debug-Performance|x64 + {42D864F9-AFDA-4EF7-99C3-218E982AA46E}.Debug-Performance|x64.Build.0 = Debug-Performance|x64 + {42D864F9-AFDA-4EF7-99C3-218E982AA46E}.Debug-Performance|x86.ActiveCfg = Debug-Performance|Win32 + {42D864F9-AFDA-4EF7-99C3-218E982AA46E}.Debug-Performance|x86.Build.0 = Debug-Performance|Win32 + {42D864F9-AFDA-4EF7-99C3-218E982AA46E}.Release-Accuracy|x64.ActiveCfg = Release-Accuracy|x64 + {42D864F9-AFDA-4EF7-99C3-218E982AA46E}.Release-Accuracy|x64.Build.0 = Release-Accuracy|x64 + {42D864F9-AFDA-4EF7-99C3-218E982AA46E}.Release-Accuracy|x86.ActiveCfg = Release-Accuracy|Win32 + {42D864F9-AFDA-4EF7-99C3-218E982AA46E}.Release-Accuracy|x86.Build.0 = Release-Accuracy|Win32 + {42D864F9-AFDA-4EF7-99C3-218E982AA46E}.Release-Compatibility|x64.ActiveCfg = Release-Compatibility|x64 + {42D864F9-AFDA-4EF7-99C3-218E982AA46E}.Release-Compatibility|x64.Build.0 = Release-Compatibility|x64 + {42D864F9-AFDA-4EF7-99C3-218E982AA46E}.Release-Compatibility|x86.ActiveCfg = Release-Compatibility|Win32 + {42D864F9-AFDA-4EF7-99C3-218E982AA46E}.Release-Compatibility|x86.Build.0 = Release-Compatibility|Win32 + {42D864F9-AFDA-4EF7-99C3-218E982AA46E}.Release-Performance|x64.ActiveCfg = Release-Performance|x64 + {42D864F9-AFDA-4EF7-99C3-218E982AA46E}.Release-Performance|x64.Build.0 = Release-Performance|x64 + {42D864F9-AFDA-4EF7-99C3-218E982AA46E}.Release-Performance|x86.ActiveCfg = Release-Performance|Win32 + {42D864F9-AFDA-4EF7-99C3-218E982AA46E}.Release-Performance|x86.Build.0 = Release-Performance|Win32 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {79215649-444D-4FCC-97DD-3CD012E031FA} + EndGlobalSection +EndGlobal diff --git a/bsnes/vstudio/bsnes/bsnes.vcxproj b/bsnes/vstudio/bsnes/bsnes.vcxproj new file mode 100644 index 00000000..a39323cf --- /dev/null +++ b/bsnes/vstudio/bsnes/bsnes.vcxproj @@ -0,0 +1,5576 @@ + + + + + Debug-Accuracy + Win32 + + + Debug-Accuracy + x64 + + + Debug-Compatibility + Win32 + + + Debug-Compatibility + x64 + + + Debug-Performance + Win32 + + + Debug-Performance + x64 + + + Release-Accuracy + Win32 + + + Release-Accuracy + x64 + + + Release-Compatibility + Win32 + + + Release-Compatibility + x64 + + + Release-Performance + Win32 + + + Release-Performance + x64 + + + + 16.0 + Win32Proj + {42d864f9-afda-4ef7-99c3-218e982aa46e} + bsnes + 10.0 + + + + Application + true + v142 + Unicode + + + Application + true + v142 + Unicode + + + Application + true + v142 + Unicode + + + Application + false + v142 + true + Unicode + + + Application + false + v142 + true + Unicode + + + Application + false + v142 + true + Unicode + + + Application + true + v142 + Unicode + + + Application + true + v142 + Unicode + + + Application + true + v142 + Unicode + + + Application + false + v142 + true + Unicode + + + Application + false + v142 + true + Unicode + + + Application + false + v142 + true + Unicode + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + true + c:\Program Files (x86)\Microsoft DirectX SDK (June 2010)\Include;$(IncludePath) + + + true + c:\Program Files (x86)\Microsoft DirectX SDK (June 2010)\Include;$(IncludePath) + + + true + c:\Program Files (x86)\Microsoft DirectX SDK (June 2010)\Include;$(IncludePath) + + + false + c:\Program Files (x86)\Microsoft DirectX SDK (June 2010)\Include;$(IncludePath) + + + false + c:\Program Files (x86)\Microsoft DirectX SDK (June 2010)\Include;$(IncludePath) + + + false + c:\Program Files (x86)\Microsoft DirectX SDK (June 2010)\Include;$(IncludePath) + + + true + c:\Program Files (x86)\Microsoft DirectX SDK (June 2010)\Include;$(IncludePath) + + + true + c:\Program Files (x86)\Microsoft DirectX SDK (June 2010)\Include;$(IncludePath) + + + true + c:\Program Files (x86)\Microsoft DirectX SDK (June 2010)\Include;$(IncludePath) + + + false + c:\Program Files (x86)\Microsoft DirectX SDK (June 2010)\Include;$(IncludePath) + + + false + c:\Program Files (x86)\Microsoft DirectX SDK (June 2010)\Include;$(IncludePath) + + + false + c:\Program Files (x86)\Microsoft DirectX SDK (June 2010)\Include;$(IncludePath) + + + + Level3 + _CRT_SECURE_NO_WARNINGS;DEBUGGER;VIDEO_DIRECT3D;AUDIO_DIRECTSOUND;INPUT_DIRECTINPUT;PROFILE_PERFORMANCE;WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + $(QTDIR)\include;$(QTDIR)\include\QtCore;$(QTDIR)\include\QtGui;$(QTDIR)\include\QtWidgets;../../;../../snes/;../../ui-qt/debugger/tools/qhexedit2/;../../ui-qt/resource/;../../../common/;../../../common/nall/qt/;%(AdditionalIncludeDirectories) + + + Console + true + c:\Program Files (x86)\Microsoft DirectX SDK (June 2010)\Lib\x86;$(QTDIR)\lib;%(AdditionalLibraryDirectories) + D3d9.lib;Dsound.lib;Dinput8.lib;Dxguid.lib;Qt5Cored.lib;Qt5Guid.lib;Qt5Widgetsd.lib;%(AdditionalDependencies) + + + + + Level3 + _CRT_SECURE_NO_WARNINGS;DEBUGGER;VIDEO_DIRECT3D;AUDIO_DIRECTSOUND;INPUT_DIRECTINPUT;PROFILE_COMPATIBILITY;WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + $(QTDIR)\include;$(QTDIR)\include\QtCore;$(QTDIR)\include\QtGui;$(QTDIR)\include\QtWidgets;../../;../../snes/;../../ui-qt/debugger/tools/qhexedit2/;../../ui-qt/resource/;../../../common/;../../../common/nall/qt/;%(AdditionalIncludeDirectories) + + + Console + true + c:\Program Files (x86)\Microsoft DirectX SDK (June 2010)\Lib\x86;$(QTDIR)\lib;%(AdditionalLibraryDirectories) + D3d9.lib;Dsound.lib;Dinput8.lib;Dxguid.lib;Qt5Cored.lib;Qt5Guid.lib;Qt5Widgetsd.lib;%(AdditionalDependencies) + + + + + Level3 + _CRT_SECURE_NO_WARNINGS;DEBUGGER;VIDEO_DIRECT3D;AUDIO_DIRECTSOUND;INPUT_DIRECTINPUT;PROFILE_ACCURACY;WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + $(QTDIR)\include;$(QTDIR)\include\QtCore;$(QTDIR)\include\QtGui;$(QTDIR)\include\QtWidgets;../../;../../snes/;../../ui-qt/debugger/tools/qhexedit2/;../../ui-qt/resource/;../../../common/;../../../common/nall/qt/;%(AdditionalIncludeDirectories) + + + Console + true + c:\Program Files (x86)\Microsoft DirectX SDK (June 2010)\Lib\x86;$(QTDIR)\lib;%(AdditionalLibraryDirectories) + D3d9.lib;Dsound.lib;Dinput8.lib;Dxguid.lib;Qt5Cored.lib;Qt5Guid.lib;Qt5Widgetsd.lib;%(AdditionalDependencies) + + + + + Level3 + true + true + _CRT_SECURE_NO_WARNINGS;DEBUGGER;VIDEO_DIRECT3D;AUDIO_DIRECTSOUND;INPUT_DIRECTINPUT;PROFILE_PERFORMANCE;WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + $(QTDIR)\include;$(QTDIR)\include\QtCore;$(QTDIR)\include\QtGui;$(QTDIR)\include\QtWidgets;../../;../../snes/;../../ui-qt/debugger/tools/qhexedit2/;../../ui-qt/resource/;../../../common/;../../../common/nall/qt/;%(AdditionalIncludeDirectories) + + + Console + true + true + true + c:\Program Files (x86)\Microsoft DirectX SDK (June 2010)\Lib\x86;$(QTDIR)\lib;%(AdditionalLibraryDirectories) + D3d9.lib;Dsound.lib;Dinput8.lib;Dxguid.lib;Qt5Core.lib;Qt5Gui.lib;Qt5Widgets.lib;%(AdditionalDependencies) + + + + + Level3 + true + true + _CRT_SECURE_NO_WARNINGS;DEBUGGER;VIDEO_DIRECT3D;AUDIO_DIRECTSOUND;INPUT_DIRECTINPUT;PROFILE_COMPATIBILITY;WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + $(QTDIR)\include;$(QTDIR)\include\QtCore;$(QTDIR)\include\QtGui;$(QTDIR)\include\QtWidgets;../../;../../snes/;../../ui-qt/debugger/tools/qhexedit2/;../../ui-qt/resource/;../../../common/;../../../common/nall/qt/;%(AdditionalIncludeDirectories) + + + Console + true + true + true + c:\Program Files (x86)\Microsoft DirectX SDK (June 2010)\Lib\x86;$(QTDIR)\lib;%(AdditionalLibraryDirectories) + D3d9.lib;Dsound.lib;Dinput8.lib;Dxguid.lib;Qt5Core.lib;Qt5Gui.lib;Qt5Widgets.lib;%(AdditionalDependencies) + + + + + Level3 + true + true + _CRT_SECURE_NO_WARNINGS;DEBUGGER;VIDEO_DIRECT3D;AUDIO_DIRECTSOUND;INPUT_DIRECTINPUT;PROFILE_ACCURACY;WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + $(QTDIR)\include;$(QTDIR)\include\QtCore;$(QTDIR)\include\QtGui;$(QTDIR)\include\QtWidgets;../../;../../snes/;../../ui-qt/debugger/tools/qhexedit2/;../../ui-qt/resource/;../../../common/;../../../common/nall/qt/;%(AdditionalIncludeDirectories) + + + Console + true + true + true + c:\Program Files (x86)\Microsoft DirectX SDK (June 2010)\Lib\x86;$(QTDIR)\lib;%(AdditionalLibraryDirectories) + D3d9.lib;Dsound.lib;Dinput8.lib;Dxguid.lib;Qt5Core.lib;Qt5Gui.lib;Qt5Widgets.lib;%(AdditionalDependencies) + + + + + Level3 + _CRT_SECURE_NO_WARNINGS;DEBUGGER;VIDEO_DIRECT3D;AUDIO_DIRECTSOUND;INPUT_DIRECTINPUT;PROFILE_PERFORMANCE;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + $(QTDIR)\include;$(QTDIR)\include\QtCore;$(QTDIR)\include\QtGui;$(QTDIR)\include\QtWidgets;../../;../../snes/;../../ui-qt/debugger/tools/qhexedit2/;../../ui-qt/resource/;../../../common/;../../../common/nall/qt/;%(AdditionalIncludeDirectories) + + + Console + true + c:\Program Files (x86)\Microsoft DirectX SDK (June 2010)\Lib\x64;$(QTDIR)\lib;%(AdditionalLibraryDirectories) + D3d9.lib;Dsound.lib;Dinput8.lib;Dxguid.lib;Qt5Cored.lib;Qt5Guid.lib;Qt5Widgetsd.lib;%(AdditionalDependencies) + + + + + Level3 + _CRT_SECURE_NO_WARNINGS;DEBUGGER;VIDEO_DIRECT3D;AUDIO_DIRECTSOUND;INPUT_DIRECTINPUT;PROFILE_COMPATIBILITY;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + $(QTDIR)\include;$(QTDIR)\include\QtCore;$(QTDIR)\include\QtGui;$(QTDIR)\include\QtWidgets;../../;../../snes/;../../ui-qt/debugger/tools/qhexedit2/;../../ui-qt/resource/;../../../common/;../../../common/nall/qt/;%(AdditionalIncludeDirectories) + + + Console + true + c:\Program Files (x86)\Microsoft DirectX SDK (June 2010)\Lib\x64;$(QTDIR)\lib;%(AdditionalLibraryDirectories) + D3d9.lib;Dsound.lib;Dinput8.lib;Dxguid.lib;Qt5Cored.lib;Qt5Guid.lib;Qt5Widgetsd.lib;%(AdditionalDependencies) + + + + + Level3 + _CRT_SECURE_NO_WARNINGS;DEBUGGER;VIDEO_DIRECT3D;AUDIO_DIRECTSOUND;INPUT_DIRECTINPUT;PROFILE_ACCURACY;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + $(QTDIR)\include;$(QTDIR)\include\QtCore;$(QTDIR)\include\QtGui;$(QTDIR)\include\QtWidgets;../../;../../snes/;../../ui-qt/debugger/tools/qhexedit2/;../../ui-qt/resource/;../../../common/;../../../common/nall/qt/;%(AdditionalIncludeDirectories) + + + Console + true + c:\Program Files (x86)\Microsoft DirectX SDK (June 2010)\Lib\x64;$(QTDIR)\lib;%(AdditionalLibraryDirectories) + D3d9.lib;Dsound.lib;Dinput8.lib;Dxguid.lib;Qt5Cored.lib;Qt5Guid.lib;Qt5Widgetsd.lib;%(AdditionalDependencies) + + + + + Level3 + true + true + _CRT_SECURE_NO_WARNINGS;DEBUGGER;VIDEO_DIRECT3D;AUDIO_DIRECTSOUND;INPUT_DIRECTINPUT;PROFILE_PERFORMANCE;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + $(QTDIR)\include;$(QTDIR)\include\QtCore;$(QTDIR)\include\QtGui;$(QTDIR)\include\QtWidgets;../../;../../snes/;../../ui-qt/debugger/tools/qhexedit2/;../../ui-qt/resource/;../../../common/;../../../common/nall/qt/;%(AdditionalIncludeDirectories) + + + Console + true + true + true + c:\Program Files (x86)\Microsoft DirectX SDK (June 2010)\Lib\x64;$(QTDIR)\lib;%(AdditionalLibraryDirectories) + D3d9.lib;Dsound.lib;Dinput8.lib;Dxguid.lib;Qt5Core.lib;Qt5Gui.lib;Qt5Widgets.lib;%(AdditionalDependencies) + + + + + Level3 + true + true + _CRT_SECURE_NO_WARNINGS;DEBUGGER;VIDEO_DIRECT3D;AUDIO_DIRECTSOUND;INPUT_DIRECTINPUT;PROFILE_COMPATIBILITY;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + $(QTDIR)\include;$(QTDIR)\include\QtCore;$(QTDIR)\include\QtGui;$(QTDIR)\include\QtWidgets;../../;../../snes/;../../ui-qt/debugger/tools/qhexedit2/;../../ui-qt/resource/;../../../common/;../../../common/nall/qt/;%(AdditionalIncludeDirectories) + + + Console + true + true + true + c:\Program Files (x86)\Microsoft DirectX SDK (June 2010)\Lib\x64;$(QTDIR)\lib;%(AdditionalLibraryDirectories) + D3d9.lib;Dsound.lib;Dinput8.lib;Dxguid.lib;Qt5Core.lib;Qt5Gui.lib;Qt5Widgets.lib;%(AdditionalDependencies) + + + + + Level3 + true + true + _CRT_SECURE_NO_WARNINGS;DEBUGGER;VIDEO_DIRECT3D;AUDIO_DIRECTSOUND;INPUT_DIRECTINPUT;PROFILE_ACCURACY;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + $(QTDIR)\include;$(QTDIR)\include\QtCore;$(QTDIR)\include\QtGui;$(QTDIR)\include\QtWidgets;../../;../../snes/;../../ui-qt/debugger/tools/qhexedit2/;../../ui-qt/resource/;../../../common/;../../../common/nall/qt/;%(AdditionalIncludeDirectories) + + + Console + true + true + true + c:\Program Files (x86)\Microsoft DirectX SDK (June 2010)\Lib\x64;$(QTDIR)\lib;%(AdditionalLibraryDirectories) + D3d9.lib;Dsound.lib;Dinput8.lib;Dxguid.lib;Qt5Core.lib;Qt5Gui.lib;Qt5Widgets.lib;%(AdditionalDependencies) + + + + + + + + + + + true + true + true + true + true + true + true + true + true + true + true + true + + + + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + + + + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + + + $(IntDir)/%(RelativeDir)/ + $(IntDir)/%(RelativeDir)/ + $(IntDir)/%(RelativeDir)/ + $(IntDir)/%(RelativeDir)/ + $(IntDir)/%(RelativeDir)/ + $(IntDir)/%(RelativeDir)/ + $(IntDir)/%(RelativeDir)/ + $(IntDir)/%(RelativeDir)/ + $(IntDir)/%(RelativeDir)/ + $(IntDir)/%(RelativeDir)/ + $(IntDir)/%(RelativeDir)/ + $(IntDir)/%(RelativeDir)/ + + + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + + + + + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + + + + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + + + + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + + + + true + true + true + true + true + true + true + true + true + true + true + true + + + + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + + + + true + true + true + true + true + true + true + true + true + true + true + true + + + + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + + + + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + + + + true + true + true + true + true + true + true + true + true + true + true + true + + + + + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + + + + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + + + + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + $(IntDir)/%(RelativeDir)/ + $(IntDir)/%(RelativeDir)/ + $(IntDir)/%(RelativeDir)/ + $(IntDir)/%(RelativeDir)/ + $(IntDir)/%(RelativeDir)/ + $(IntDir)/%(RelativeDir)/ + $(IntDir)/%(RelativeDir)/ + $(IntDir)/%(RelativeDir)/ + $(IntDir)/%(RelativeDir)/ + $(IntDir)/%(RelativeDir)/ + $(IntDir)/%(RelativeDir)/ + $(IntDir)/%(RelativeDir)/ + + + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + + + + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + + + $(IntDir)/%(RelativeDir)/ + $(IntDir)/%(RelativeDir)/ + $(IntDir)/%(RelativeDir)/ + $(IntDir)/%(RelativeDir)/ + $(IntDir)/%(RelativeDir)/ + $(IntDir)/%(RelativeDir)/ + $(IntDir)/%(RelativeDir)/ + $(IntDir)/%(RelativeDir)/ + $(IntDir)/%(RelativeDir)/ + $(IntDir)/%(RelativeDir)/ + $(IntDir)/%(RelativeDir)/ + $(IntDir)/%(RelativeDir)/ + + + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + + + + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + + + + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + + + + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + + + $(IntDir)/%(RelativeDir)/ + $(IntDir)/%(RelativeDir)/ + $(IntDir)/%(RelativeDir)/ + $(IntDir)/%(RelativeDir)/ + $(IntDir)/%(RelativeDir)/ + $(IntDir)/%(RelativeDir)/ + $(IntDir)/%(RelativeDir)/ + $(IntDir)/%(RelativeDir)/ + $(IntDir)/%(RelativeDir)/ + $(IntDir)/%(RelativeDir)/ + $(IntDir)/%(RelativeDir)/ + $(IntDir)/%(RelativeDir)/ + + + true + true + true + true + true + true + true + true + true + true + true + true + + + + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + + + + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + + + + + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + + + + true + true + true + true + true + true + true + true + true + true + true + true + + + + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + + + + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + + + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + + + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + + + + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + + + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + + + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + true + true + true + true + true + true + true + true + + + true + true + true + true + + + true + true + true + true + + + true + true + true + true + + + true + true + true + true + + + true + true + true + true + + + true + true + true + true + + + true + true + true + true + + + true + true + true + true + + + true + true + true + true + + + true + true + true + true + + + true + true + true + true + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + true + true + true + true + + + true + true + true + true + + + true + true + true + true + + + true + true + true + true + + + true + true + true + true + + + true + true + true + true + + + true + true + true + true + + + true + true + true + true + + + true + true + true + true + + + true + true + true + true + + + true + true + true + true + + + + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + + + + + + + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + + + + + + + + + + + + + + + + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + + + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + + + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + + + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + + + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + Compiling %(Filename)%(Extension) using MOC + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + Compiling %(Filename)%(Extension) using MOC + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + Compiling %(Filename)%(Extension) using MOC + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + Compiling %(Filename)%(Extension) using MOC + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + Compiling %(Filename)%(Extension) using MOC + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + Compiling %(Filename)%(Extension) using MOC + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + Compiling %(Filename)%(Extension) using MOC + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + Compiling %(Filename)%(Extension) using MOC + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + Compiling %(Filename)%(Extension) using MOC + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + Compiling %(Filename)%(Extension) using MOC + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + Compiling %(Filename)%(Extension) using MOC + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + Compiling %(Filename)%(Extension) using MOC + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + + + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + Compiling %(Filename)%(Extension) using MOC + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + Compiling %(Filename)%(Extension) using MOC + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + Compiling %(Filename)%(Extension) using MOC + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + Compiling %(Filename)%(Extension) using MOC + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + Compiling %(Filename)%(Extension) using MOC + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + Compiling %(Filename)%(Extension) using MOC + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + Compiling %(Filename)%(Extension) using MOC + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + Compiling %(Filename)%(Extension) using MOC + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + Compiling %(Filename)%(Extension) using MOC + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + Compiling %(Filename)%(Extension) using MOC + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + Compiling %(Filename)%(Extension) using MOC + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + Compiling %(Filename)%(Extension) using MOC + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + + + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + Compiling %(Filename)%(Extension) using MOC + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + Compiling %(Filename)%(Extension) using MOC + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + Compiling %(Filename)%(Extension) using MOC + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + Compiling %(Filename)%(Extension) using MOC + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + Compiling %(Filename)%(Extension) using MOC + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + Compiling %(Filename)%(Extension) using MOC + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + Compiling %(Filename)%(Extension) using MOC + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + Compiling %(Filename)%(Extension) using MOC + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + Compiling %(Filename)%(Extension) using MOC + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + Compiling %(Filename)%(Extension) using MOC + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + Compiling %(Filename)%(Extension) using MOC + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + Compiling %(Filename)%(Extension) using MOC + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + + + + + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + + + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + + + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + + + + + + + + + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + + + + + + + + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + + + + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + + + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + + + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + + + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + + + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + + + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + + + + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + + + + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + + + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + + + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + + + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + + + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + + + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + + + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + Compiling %(Filename)%(Extension) using MOC + %(RootDir)%(Directory)%(Filename);%(Outputs) + Compiling %(Filename)%(Extension) using MOC + %(RootDir)%(Directory)%(Filename);%(Outputs) + Compiling %(Filename)%(Extension) using MOC + %(RootDir)%(Directory)%(Filename);%(Outputs) + Compiling %(Filename)%(Extension) using MOC + %(RootDir)%(Directory)%(Filename);%(Outputs) + Compiling %(Filename)%(Extension) using MOC + %(RootDir)%(Directory)%(Filename);%(Outputs) + Compiling %(Filename)%(Extension) using MOC + %(RootDir)%(Directory)%(Filename);%(Outputs) + Compiling %(Filename)%(Extension) using MOC + %(RootDir)%(Directory)%(Filename);%(Outputs) + Compiling %(Filename)%(Extension) using MOC + %(RootDir)%(Directory)%(Filename);%(Outputs) + Compiling %(Filename)%(Extension) using MOC + %(RootDir)%(Directory)%(Filename);%(Outputs) + Compiling %(Filename)%(Extension) using MOC + %(RootDir)%(Directory)%(Filename);%(Outputs) + Compiling %(Filename)%(Extension) using MOC + %(RootDir)%(Directory)%(Filename);%(Outputs) + Compiling %(Filename)%(Extension) using MOC + %(RootDir)%(Directory)%(Filename);%(Outputs) + + + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + + + + + + + + + + + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + + + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + + + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + + + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + + + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + + + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + + + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + + + + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + + + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + + + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + + + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + + + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + + + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + + + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + %(RootDir)%(Directory)%(Filename);%(Outputs) + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + Compiling %(Filename)%(Extension) using MOC + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + $(QTDIR)\bin\moc.exe -i "%(FullPath)" -o "%(RootDir)%(Directory)%(Filename)" + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Document + $(QTDIR)\bin\rcc.exe %(FullPath) -o %(RootDir)%(Directory)%(Filename).rcc + $(QTDIR)\bin\rcc.exe %(FullPath) -o %(RootDir)%(Directory)%(Filename).rcc + $(QTDIR)\bin\rcc.exe %(FullPath) -o %(RootDir)%(Directory)%(Filename).rcc + $(QTDIR)\bin\rcc.exe %(FullPath) -o %(RootDir)%(Directory)%(Filename).rcc + $(QTDIR)\bin\rcc.exe %(FullPath) -o %(RootDir)%(Directory)%(Filename).rcc + $(QTDIR)\bin\rcc.exe %(FullPath) -o %(RootDir)%(Directory)%(Filename).rcc + $(QTDIR)\bin\rcc.exe %(FullPath) -o %(RootDir)%(Directory)%(Filename).rcc + $(QTDIR)\bin\rcc.exe %(FullPath) -o %(RootDir)%(Directory)%(Filename).rcc + $(QTDIR)\bin\rcc.exe %(FullPath) -o %(RootDir)%(Directory)%(Filename).rcc + $(QTDIR)\bin\rcc.exe %(FullPath) -o %(RootDir)%(Directory)%(Filename).rcc + $(QTDIR)\bin\rcc.exe %(FullPath) -o %(RootDir)%(Directory)%(Filename).rcc + $(QTDIR)\bin\rcc.exe %(FullPath) -o %(RootDir)%(Directory)%(Filename).rcc + Compiling %(Filename)%(Extension) using RCC + %(RootDir)%(Directory)%(Filename).rcc;%(Outputs) + Compiling %(Filename)%(Extension) using RCC + %(RootDir)%(Directory)%(Filename).rcc;%(Outputs) + Compiling %(Filename)%(Extension) using RCC + %(RootDir)%(Directory)%(Filename).rcc;%(Outputs) + Compiling %(Filename)%(Extension) using RCC + %(RootDir)%(Directory)%(Filename).rcc;%(Outputs) + Compiling %(Filename)%(Extension) using RCC + %(RootDir)%(Directory)%(Filename).rcc;%(Outputs) + Compiling %(Filename)%(Extension) using RCC + %(RootDir)%(Directory)%(Filename).rcc;%(Outputs) + Compiling %(Filename)%(Extension) using RCC + %(RootDir)%(Directory)%(Filename).rcc;%(Outputs) + Compiling %(Filename)%(Extension) using RCC + %(RootDir)%(Directory)%(Filename).rcc;%(Outputs) + Compiling %(Filename)%(Extension) using RCC + %(RootDir)%(Directory)%(Filename).rcc;%(Outputs) + Compiling %(Filename)%(Extension) using RCC + %(RootDir)%(Directory)%(Filename).rcc;%(Outputs) + Compiling %(Filename)%(Extension) using RCC + %(RootDir)%(Directory)%(Filename).rcc;%(Outputs) + Compiling %(Filename)%(Extension) using RCC + %(RootDir)%(Directory)%(Filename).rcc;%(Outputs) + + + + + + + + + + + \ No newline at end of file diff --git a/bsnes/vstudio/bsnes/bsnes.vcxproj.filters b/bsnes/vstudio/bsnes/bsnes.vcxproj.filters new file mode 100644 index 00000000..c4dcf636 --- /dev/null +++ b/bsnes/vstudio/bsnes/bsnes.vcxproj.filters @@ -0,0 +1,1853 @@ + + + + + {acd77031-02f8-49a2-bbf1-25c69facfcdd} + + + {70cea245-a73f-408e-b43d-4577fe26a4cb} + + + {626fcbc7-09f9-489b-928a-685320937ccf} + + + {fd4f25dc-2534-4e88-b17f-1a5b7bc84fe4} + + + {e8362c26-2292-4e08-bdaf-b31cb577811a} + + + {3c14ee14-c3b0-4c7e-bd61-7b01730c0919} + + + {18258502-b1ec-4df4-b32d-33b55955f64b} + + + {2c51348c-ac6a-4b5d-b515-46b912f63e58} + + + {cad0ee95-7364-428e-9699-bdb4a1754d6d} + + + {1798fb10-d931-4e41-92c9-64a3222c4ae0} + + + {3c91d563-1ab8-4df1-b7f2-6dfc2c0f3f40} + + + {f6bbb465-9106-4729-8e7f-8e527f5c0e11} + + + {48b91aa9-cf7f-490b-9d0e-516c34129c0e} + + + {57ac3a6e-4010-486a-ad41-1c195df9bd01} + + + {601b8ef2-a300-4eba-98d8-a15212df8613} + + + {d3974109-0028-4b92-ba84-6305f5a0b690} + + + {a8e9772a-0d1c-4ad6-8168-ac1a1d427c62} + + + {30b00000-dd79-49a1-a059-9852e52163ee} + + + {c23fc12a-cae5-4e7a-a5b4-e6a988bffcee} + + + {b87146bf-127f-4f16-87a9-280a1ab3a66c} + + + {eac77925-d76a-487f-b3f4-729f3292e12c} + + + {d65eebe3-05f6-47dd-b0ae-099836f3ffdc} + + + {1df7a165-809e-434d-bb91-052511536cb0} + + + {921bd4f7-a76a-464d-98de-d7c6f93092d3} + + + {03dc6de4-65e9-4e22-beea-9af350968971} + + + {14025810-8974-4e7e-a374-5d3ee2480fb5} + + + {8a2970cb-c9b4-41bb-8bc3-1c5e0535d6ae} + + + {86944617-8e1f-4081-9503-ee657549b12c} + + + {2d81073c-06f4-466f-ac20-c93bcc846eae} + + + {f74e47c9-7c62-4b46-b02f-3770ea8d4a6b} + + + {e1fc50dd-72ef-44ed-a758-b2b0c3251b6e} + + + {b7c5faf4-c3d3-4996-975e-b642d77b7914} + + + {9ed6318f-da0c-4318-9fee-c961c97d692f} + + + {d4737b51-2409-4e57-ba36-388847edffde} + + + {6efb6bad-0d4a-4fc8-a061-2460a8bce976} + + + {eccfcce6-b9e0-4494-8a7d-c3cbce288ac9} + + + {b6c6e828-c371-44bd-aec8-9a069688cd44} + + + {20a649d2-5a4a-4758-acd9-fd08fb8d11bd} + + + {13032fc1-0577-40e9-85d4-5d8124e1b272} + + + {9d11d620-3303-4198-994f-716bf436fd98} + + + {fb13c71f-7fd8-467e-b3f5-420327cc2177} + + + {b5c7f29c-6c51-40ef-b23a-978a09867680} + + + {0323c3ef-81d4-4d9e-ac2d-cc6aa83b0f9f} + + + {c96aed74-c04f-4566-b2c4-10a3953a46d6} + + + {e999255b-61d7-4c81-9716-ab98c20c14aa} + + + {e7649b04-a877-4884-96f3-d46b7d42eb80} + + + {db79c623-8c33-4cbe-bfe2-eb16bca18d39} + + + {e267b9c3-a579-41c4-a9e8-f2a4b93bf017} + + + {78c204cc-e5c6-40d5-b0c7-28d791f720bc} + + + {cea11459-df08-4fe2-bde7-681e1c5cd356} + + + {4acd9689-bae2-4dfc-b78e-e3e26062c437} + + + {14a6ff35-16ff-416e-9def-9fa53c24e93e} + + + {aabbaa14-6d0f-49b5-95b2-b0d2a211e04e} + + + {cea517a4-3e9b-4a80-91d6-a8fd24324268} + + + {1c3f4c6a-aaf3-4da7-94eb-dd9b5a16cb6b} + + + {e8734f1d-7789-4921-989b-109b58a52338} + + + {e8a6a10c-e33b-4850-86ba-a7d333ad182a} + + + {a484e997-e50e-4d33-b87d-637842768a7c} + + + {dd1d04c3-ef77-47f6-99a1-b70bb32e5300} + + + {659d386d-3ff2-43cf-8152-07392ace1eef} + + + {51f2c766-fbfc-484a-a5cb-fc2ea0a4555a} + + + {31fe7a10-ac1b-4a26-81f8-5fd3cc4bd301} + + + {0b954590-3027-4ad7-afb3-108e9309638a} + + + {0bc2e82d-9bd6-4ca2-bc86-1f9abe95374c} + + + {e85cc1cb-0950-4487-8830-7eaa8f9d45ee} + + + {9f9eb3a2-facd-4222-b484-cf428810ef1b} + + + {aff14859-0cd9-4a72-8cd8-285ea41b969b} + + + {537b06c8-1725-4703-a294-9ef3115bd1a9} + + + {fed788f7-d79e-4b83-841d-5a7b4c441ecb} + + + {9ca72061-358c-49ba-89ad-72ffc78fc2fb} + + + {f6a99ada-84ea-4699-b944-8884e825c808} + + + {24753958-aead-4c41-8f80-c64c05ad4cea} + + + {a4bbf361-2b35-43e1-a1b4-108f46279664} + + + {6e3a43c3-e7cd-44f4-af77-b18a5270847a} + + + {2348049f-6872-4199-b1ad-f3f2037cf557} + + + {042405c8-db97-4147-a10f-560369a56104} + + + {f79a6510-9483-4238-b730-d44cef56a0ec} + + + {2d800095-b254-4c2b-b25c-4e4d86fc37bf} + + + {57293206-a35e-4eed-aa5e-bf8f9d4cee61} + + + {804f84f4-c308-4acb-9e68-5ab1f4d343cb} + + + {8672c5f2-dea6-434c-a63b-6d9d94e3d355} + + + {9a51d029-9462-41e1-b091-9c49c3370918} + + + {3e82b754-3305-44c8-b27f-fcda6bf9f858} + + + {694c75c8-8ae1-43a0-a0f3-dadb9901b62a} + + + {d38a4f1f-0474-4d28-b567-1a79a16e1121} + + + {72b3d432-f56c-4d0b-a3e7-f87a4341e102} + + + {005cc49e-0588-4a77-85f1-fb968a8f815e} + + + {f13602a0-e01b-4429-8023-41efeb05d01b} + + + {77b15f02-9346-4292-a6a3-63dec9407187} + + + {6744e85c-04b5-4624-98da-31fc3f2c6e58} + + + {ec5dd2b6-5820-42b2-b598-e566ab91fac5} + + + {a42c83cd-678a-430a-92c5-75e7e3dd123d} + + + {17a483f6-7ea5-48b0-95b7-caf0b10a6f48} + + + {9cd0b4b9-18a4-4b7c-8e52-4499d88ff1c1} + + + {7d1a8e75-3830-4ad6-9a68-043f5f0a4c61} + + + {af5af218-a29b-496e-a765-dc3bd1f53e90} + + + {e235539e-3461-403c-ab3c-4fd343608101} + + + {d4a73649-d17c-4d29-88fb-7c3a153a2f58} + + + {43892867-6aa5-4686-9aaf-5a2c0129511a} + + + {60fe0955-d12b-4c0b-986c-e630fc82bffd} + + + {f8b7264f-ca84-4a7e-9d77-48cec5348288} + + + {e21f8e58-e334-4f8d-a2ba-927153365ab3} + + + {1a72ba3c-9d91-43c4-bdf9-ab9dd97a7a97} + + + {20c63d81-799b-4857-b334-55bc9a027dd7} + + + {fabff825-473b-48c8-8f64-b2fde98619d1} + + + {390e9dcd-7e41-4a8b-a005-8d259da51a8b} + + + {7e4a35b9-7b93-41fc-a22c-699b7a2e207f} + + + + + snes\alt\cpu + + + snes\alt\cpu + + + snes\alt\cpu + + + snes\alt\cpu + + + snes\alt\cpu + + + snes\alt\cpu + + + snes\alt\dsp + + + snes\alt\dsp + + + snes\alt\dsp + + + snes\alt\ppu\debugger + + + snes\alt\ppu\memory + + + snes\alt\ppu\mmio + + + snes\alt\ppu\render + + + snes\alt\ppu\render + + + snes\alt\ppu\render + + + snes\alt\ppu\render + + + snes\alt\ppu\render + + + snes\alt\ppu\render + + + snes\alt\ppu\render + + + snes\alt\ppu\render + + + snes\alt\ppu + + + snes\alt\ppu + + + snes\audio + + + snes\cartridge + + + snes\cartridge + + + snes\cartridge + + + snes\cheat + + + snes\chip\bsx + + + snes\chip\bsx + + + snes\chip\bsx + + + snes\chip\bsx + + + snes\chip\bsx + + + snes\chip\cx4 + + + snes\chip\cx4 + + + snes\chip\cx4 + + + snes\chip\cx4 + + + snes\chip\cx4 + + + snes\chip\cx4 + + + snes\chip\cx4 + + + snes\chip\msu1 + + + snes\chip\msu1 + + + snes\chip\necdsp + + + snes\chip\necdsp + + + snes\chip\necdsp + + + snes\chip\necdsp + + + snes\chip\obc1 + + + snes\chip\obc1 + + + snes\chip\sa1 + + + snes\chip\sa1 + + + snes\chip\sa1\bus + + + snes\chip\sa1\debugger + + + snes\chip\sa1\dma + + + snes\chip\sa1\memory + + + snes\chip\sa1\mmio + + + snes\chip\sdd1 + + + snes\chip\sdd1 + + + snes\chip\sdd1 + + + snes\chip\serial + + + snes\chip\serial + + + snes\chip\spc7110 + + + snes\chip\spc7110 + + + snes\chip\spc7110 + + + snes\chip\srtc + + + snes\chip\srtc + + + snes\chip\st0018 + + + snes\chip\superfx + + + snes\chip\superfx + + + snes\chip\superfx\bus + + + snes\chip\superfx\core + + + snes\chip\superfx\core + + + snes\chip\superfx\core + + + snes\chip\superfx\debugger + + + snes\chip\superfx\disasm + + + snes\chip\superfx\memory + + + snes\chip\superfx\mmio + + + snes\chip\superfx\timing + + + snes\chip\supergameboy\debugger + + + snes\chip\supergameboy + + + snes\chip\supergameboy + + + snes\config + + + snes\cpu + + + snes\cpu + + + snes\cpu\core + + + snes\cpu\core + + + snes\cpu\core + + + snes\cpu\core + + + snes\cpu\core + + + snes\cpu\core + + + snes\cpu\core + + + snes\cpu\core + + + snes\cpu\core + + + snes\cpu\core\disassembler + + + snes\cpu\debugger + + + snes\cpu\debugger + + + snes\cpu\dma + + + snes\cpu\memory + + + snes\cpu\mmio + + + snes\cpu\timing + + + snes\cpu\timing + + + snes\cpu\timing + + + snes\debugger + + + snes\dsp\debugger + + + snes\dsp + + + snes\dsp + + + snes\dsp + + + snes\dsp + + + snes\dsp + + + snes\dsp + + + snes\dsp + + + snes\dsp + + + snes\dsp + + + snes\input + + + snes\memory + + + snes\memory + + + snes\ppu + + + snes\ppu + + + snes\ppu\background + + + snes\ppu\background + + + snes\ppu\counter + + + snes\ppu\debugger + + + snes\ppu\mmio + + + snes\ppu\screen + + + snes\ppu\sprite + + + snes\ppu\sprite + + + snes\ppu\window + + + snes\scheduler + + + snes\smp + + + snes\smp + + + snes\smp + + + snes\smp\core\disassembler + + + snes\smp\core + + + snes\smp\core + + + snes\smp\core + + + snes\smp\core + + + snes\smp\core + + + snes\smp\core + + + snes\smp\core + + + snes\smp\core + + + snes\smp\core + + + snes\smp\debugger + + + snes\smp\memory + + + snes\smp\mmio + + + snes\smp\timing + + + snes\system + + + snes\system + + + snes\system + + + snes\video + + + ruby + + + ruby + + + ruby + + + ruby\audio + + + ruby\input + + + ruby\video + + + ui-qt\application + + + ui-qt\application + + + ui-qt\application + + + ui-qt\base + + + ui-qt\base + + + ui-qt\base + + + ui-qt\base + + + ui-qt\base + + + ui-qt\base + + + ui-qt\base + + + ui-qt\cartridge + + + ui-qt\debugger\disassembler\processor + + + ui-qt\debugger\disassembler\processor + + + ui-qt\debugger\disassembler\processor + + + ui-qt\debugger\disassembler\processor + + + ui-qt\debugger\disassembler\processor + + + ui-qt\debugger\disassembler\symbols\adapters + + + ui-qt\debugger\disassembler\symbols\adapters + + + ui-qt\debugger\disassembler\symbols\adapters + + + ui-qt\debugger\disassembler\symbols + + + ui-qt\debugger\disassembler\symbols + + + ui-qt\debugger\disassembler + + + ui-qt\debugger\disassembler + + + ui-qt\debugger\ppu + + + ui-qt\debugger\ppu + + + ui-qt\debugger\ppu + + + ui-qt\debugger\ppu + + + ui-qt\debugger\ppu + + + ui-qt\debugger\ppu + + + ui-qt\debugger\ppu + + + ui-qt\debugger\ppu + + + ui-qt\debugger\ppu + + + ui-qt\debugger\ppu + + + ui-qt\debugger\ppu + + + ui-qt\debugger\tools\qhexedit2 + + + ui-qt\debugger\tools\qhexedit2 + + + ui-qt\debugger\tools + + + ui-qt\debugger\tools + + + ui-qt\debugger\tools + + + ui-qt\debugger + + + ui-qt\debugger + + + ui-qt\debugger + + + ui-qt\debugger + + + ui-qt\input + + + ui-qt\input + + + ui-qt\input + + + ui-qt\input + + + ui-qt\input + + + ui-qt\input + + + ui-qt\input + + + ui-qt\link + + + ui-qt\link + + + ui-qt\link + + + ui-qt\movie + + + ui-qt\platform + + + ui-qt\settings + + + ui-qt\settings + + + ui-qt\settings + + + ui-qt\settings + + + ui-qt\settings + + + ui-qt\settings + + + ui-qt\settings + + + ui-qt\state + + + ui-qt\tools + + + ui-qt\tools + + + ui-qt\tools + + + ui-qt\tools + + + ui-qt\tools + + + ui-qt\tools + + + ui-qt\tools + + + ui-qt\utility + + + ui-qt\utility + + + ui-qt\utility + + + ui-qt + + + ui-qt + + + ui-qt + + + common\zlib + + + common\zlib + + + common\zlib + + + common\zlib + + + common\zlib + + + common\zlib + + + libco + + + libco + + + libco + + + + + snes\alt\cpu + + + snes\alt\dsp + + + snes\alt\dsp + + + snes\alt\dsp + + + snes\alt\dsp + + + snes\alt\dsp + + + snes\alt\dsp + + + snes\alt\ppu\debugger + + + snes\alt\ppu\memory + + + snes\alt\ppu\mmio + + + snes\alt\ppu\render + + + snes\alt\ppu + + + snes\audio + + + snes\cartridge + + + snes\cheat + + + snes\cheat + + + snes\chip + + + snes\chip\bsx + + + snes\chip\cx4 + + + snes\chip\cx4 + + + snes\chip\msu1 + + + snes\chip\necdsp + + + snes\chip\necdsp + + + snes\chip\obc1 + + + snes\chip\sa1 + + + snes\chip\sa1\bus + + + snes\chip\sa1\debugger + + + snes\chip\sa1\dma + + + snes\chip\sa1\memory + + + snes\chip\sa1\mmio + + + snes\chip\sdd1 + + + snes\chip\sdd1 + + + snes\chip\serial + + + snes\chip\spc7110 + + + snes\chip\spc7110 + + + snes\chip\srtc + + + snes\chip\st0018 + + + snes\chip\superfx + + + snes\chip\superfx\bus + + + snes\chip\superfx\core + + + snes\chip\superfx\core + + + snes\chip\superfx\debugger + + + snes\chip\superfx\disasm + + + snes\chip\superfx\memory + + + snes\chip\superfx\mmio + + + snes\chip\superfx\timing + + + snes\chip\supergameboy\debugger + + + snes\chip\supergameboy + + + snes\config + + + snes\cpu + + + snes\cpu\core + + + snes\cpu\core + + + snes\cpu\core + + + snes\cpu\core\disassembler + + + snes\cpu\debugger + + + snes\cpu\debugger + + + snes\cpu\dma + + + snes\cpu\memory + + + snes\cpu\mmio + + + snes\cpu\timing + + + snes\debugger + + + snes\dsp\debugger + + + snes\dsp + + + snes\input + + + snes\interface + + + snes\memory + + + snes\memory + + + snes\ppu + + + snes\ppu\background + + + snes\ppu\counter + + + snes\ppu\counter + + + snes\ppu\debugger + + + snes\ppu\mmio + + + snes\ppu\screen + + + snes\ppu\sprite + + + snes\ppu\window + + + snes\scheduler + + + snes\smp + + + snes\smp\core\disassembler + + + snes\smp\core + + + snes\smp\core + + + snes\smp\core + + + snes\smp\debugger + + + snes\smp\memory + + + snes\smp\mmio + + + snes\smp\timing + + + snes\system + + + snes\video + + + snes + + + snes + + + snes + + + snes + + + ruby + + + ruby + + + ruby + + + ruby + + + ui-qt\application + + + ui-qt\base + + + ui-qt\base + + + ui-qt\base + + + ui-qt\base + + + ui-qt\base + + + ui-qt\cartridge + + + ui-qt\debugger\disassembler\processor + + + ui-qt\debugger\disassembler\processor + + + ui-qt\debugger\disassembler\processor + + + ui-qt\debugger\disassembler\processor + + + ui-qt\debugger\disassembler\processor + + + ui-qt\debugger\disassembler\symbols\adapters + + + ui-qt\debugger\disassembler\symbols\adapters + + + ui-qt\debugger\disassembler\symbols\adapters + + + ui-qt\debugger\disassembler\symbols\adapters + + + ui-qt\debugger\disassembler\symbols + + + ui-qt\debugger\disassembler\symbols + + + ui-qt\debugger\disassembler + + + ui-qt\debugger\disassembler + + + ui-qt\debugger\disassembler + + + ui-qt\debugger\ppu + + + ui-qt\debugger\ppu + + + ui-qt\debugger\ppu + + + ui-qt\debugger\ppu + + + ui-qt\debugger\ppu + + + ui-qt\debugger\ppu + + + ui-qt\debugger\ppu + + + ui-qt\debugger\ppu + + + ui-qt\debugger\ppu + + + ui-qt\debugger\ppu + + + ui-qt\debugger\ppu + + + ui-qt\debugger\tools\qhexedit2 + + + ui-qt\debugger\tools + + + ui-qt\debugger\tools + + + ui-qt\debugger\tools + + + ui-qt\debugger + + + ui-qt\debugger + + + ui-qt\debugger + + + ui-qt\input + + + ui-qt\input + + + ui-qt\input + + + ui-qt\link + + + ui-qt\link + + + ui-qt\link + + + ui-qt\movie + + + ui-qt\settings + + + ui-qt\settings + + + ui-qt\settings + + + ui-qt\settings + + + ui-qt\settings + + + ui-qt\settings + + + ui-qt\settings + + + ui-qt\state + + + ui-qt\tools + + + ui-qt\tools + + + ui-qt\tools + + + ui-qt\tools + + + ui-qt\tools + + + ui-qt\tools + + + ui-qt\tools + + + ui-qt\utility + + + ui-qt + + + ui-qt + + + ui-qt + + + common\nall + + + common\nall + + + common\nall + + + common\nall + + + common\nall + + + common\nall + + + common\nall + + + common\nall + + + common\nall + + + common\nall + + + common\nall + + + common\nall + + + common\nall + + + common\nall + + + common\nall + + + common\nall + + + common\nall + + + common\nall + + + common\nall + + + common\nall + + + common\nall + + + common\nall + + + common\nall + + + common\nall + + + common\nall + + + common\nall + + + common\nall + + + common\nall + + + common\nall + + + common\nall + + + common\nall + + + common\nall + + + common\nall + + + common\nall + + + common\nall + + + common\nall + + + common\nall\bps + + + common\nall\bps + + + common\nall\bps + + + common\nall\bps + + + common\nall\qt + + + common\nall\qt + + + common\nall\qt + + + common\nall\qt + + + common\nall\qt + + + common\nall\qt + + + common\nall\qt + + + common\nall\snes + + + common\nall\snes + + + common\nall\snes + + + common\nall\snes + + + common\nall\string + + + common\nall\string + + + common\nall\string + + + common\nall\string + + + common\nall\string + + + common\nall\string + + + common\nall\string + + + common\nall\string + + + common\nall\string + + + common\nall\string + + + common\nall\string + + + common\nall\string + + + common\nall\string + + + common\nall\string + + + common\nall\string + + + common\nall\string + + + common\nall\string + + + common\nall\string + + + common\zlib + + + common\zlib + + + common\zlib + + + common\zlib + + + common\zlib + + + common\zlib + + + common\zlib + + + common\zlib + + + libco + + + + + ui-qt\data\icons-16x16 + + + ui-qt\data\icons-16x16 + + + ui-qt\data\icons-16x16 + + + ui-qt\data\icons-16x16 + + + ui-qt\data\icons-16x16 + + + ui-qt\data\icons-16x16 + + + ui-qt\data\icons-16x16 + + + ui-qt\data\icons-16x16 + + + ui-qt\data\icons-16x16 + + + ui-qt\data\icons-16x16 + + + ui-qt\data\icons-16x16 + + + ui-qt\data\icons-16x16 + + + ui-qt\data\icons-16x16 + + + ui-qt\data\icons-16x16 + + + ui-qt\data\icons-16x16 + + + ui-qt\data\icons-16x16 + + + ui-qt\data\icons-16x16 + + + ui-qt\data\icons-16x16 + + + ui-qt\data + + + + + ui-qt\data + + + ui-qt\data + + + ui-qt\resource + + + + + ui-qt\debugger\tools\qhexedit2 + + + common\zlib + + + common\zlib + + + + + ui-qt\base + + + ui-qt\debugger + + + ui-qt\debugger\tools\qhexedit2 + + + \ No newline at end of file diff --git a/bsnes/vstudio/bsnes/bsnes.vcxproj.user b/bsnes/vstudio/bsnes/bsnes.vcxproj.user new file mode 100644 index 00000000..88a55094 --- /dev/null +++ b/bsnes/vstudio/bsnes/bsnes.vcxproj.user @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/common/nall/bps/patch.hpp b/common/nall/bps/patch.hpp index 85c4dcae..80491b9c 100644 --- a/common/nall/bps/patch.hpp +++ b/common/nall/bps/patch.hpp @@ -78,10 +78,11 @@ bool bpspatch::modify(const uint8_t *data, unsigned size) { modifyTargetSize = decode(); modifyMarkupSize = decode(); - char buffer[modifyMarkupSize + 1]; + char *buffer = new char[modifyMarkupSize + 1]; for(unsigned n = 0; n < modifyMarkupSize; n++) buffer[n] = modifyData[offset++]; buffer[modifyMarkupSize] = 0; - metadataString = (const char*)buffer; + metadataString.assign((const char*)buffer); + delete[] buffer; return true; } diff --git a/common/nall/platform.hpp b/common/nall/platform.hpp index 6212a8be..429a630e 100644 --- a/common/nall/platform.hpp +++ b/common/nall/platform.hpp @@ -22,7 +22,7 @@ #include #include #include - #undef interface + #define bsnesexport __declspec(dllexport) #else #include diff --git a/common/nall/utf8.hpp b/common/nall/utf8.hpp index f5597b85..4037bd94 100644 --- a/common/nall/utf8.hpp +++ b/common/nall/utf8.hpp @@ -13,7 +13,6 @@ #define _WIN32_WINNT 0x0501 #define NOMINMAX #include -#undef interface namespace nall { //UTF-8 to UTF-16 From 97b10e56b5f71b97bd872f8139a2f8a9ff3960b5 Mon Sep 17 00:00:00 2001 From: Vladimir Kononovich Date: Sun, 27 Sep 2020 04:42:19 +0300 Subject: [PATCH 2/8] Revert resource.rc modify. --- bsnes/ui-qt/resource/resource.rc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/bsnes/ui-qt/resource/resource.rc b/bsnes/ui-qt/resource/resource.rc index 9c54f9c0..63dfef44 100644 --- a/bsnes/ui-qt/resource/resource.rc +++ b/bsnes/ui-qt/resource/resource.rc @@ -1,2 +1,2 @@ -1 24 "../../data/bsnes.Manifest" -IDI_ICON1 ICON DISCARDABLE "../../data/bsnes.ico" +1 24 "data/bsnes.Manifest" +IDI_ICON1 ICON DISCARDABLE "data/bsnes.ico" From 500fa745322e341f7f34c671a70e9cf2e1df4814 Mon Sep 17 00:00:00 2001 From: Vladimir Kononovich Date: Wed, 14 Apr 2021 22:38:34 +0300 Subject: [PATCH 3/8] Added IDA debugger. --- .gitignore | 2 + bsnes/Snesida/ida_debmod.h | 53 + bsnes/Snesida/ida_debug.cpp | 1025 ++++ bsnes/Snesida/ida_plugin.cpp | 119 + bsnes/Snesida/ida_plugin.h | 4 + bsnes/Snesida/ida_registers.h | 19 + bsnes/Snesida/snesida.vcxproj | 111 + bsnes/Snesida/snesida.vcxproj.filters | 53 + bsnes/Snesida/snesida.vcxproj.user | 13 + bsnes/gen-cpp/BsnesDebugger.cpp | 4524 +++++++++++++++++ bsnes/gen-cpp/BsnesDebugger.h | 1604 ++++++ bsnes/gen-cpp/IdaClient.cpp | 648 +++ bsnes/gen-cpp/IdaClient.h | 421 ++ bsnes/gen-cpp/debug_proto_types.cpp | 658 +++ bsnes/gen-cpp/debug_proto_types.h | 287 ++ bsnes/snes/cpu/cpu.cpp | 1 + bsnes/snes/cpu/debugger/debugger.cpp | 13 +- bsnes/snes/debugger/debugger.cpp | 3 + bsnes/snes/ppu/window/window.cpp | 2 +- bsnes/thrift/debug_proto.thrift | 97 + bsnes/thrift/libevent/bin/event_rpcgen.py | 1925 +++++++ bsnes/thrift/libevent/include/evdns.h | 45 + bsnes/thrift/libevent/include/event.h | 83 + bsnes/thrift/libevent/include/event2/buffer.h | 1077 ++++ .../libevent/include/event2/buffer_compat.h | 116 + .../libevent/include/event2/bufferevent.h | 1024 ++++ .../include/event2/bufferevent_compat.h | 104 + .../include/event2/bufferevent_struct.h | 116 + bsnes/thrift/libevent/include/event2/dns.h | 751 +++ .../libevent/include/event2/dns_compat.h | 358 ++ .../libevent/include/event2/dns_struct.h | 80 + .../libevent/include/event2/event-config.h | 513 ++ bsnes/thrift/libevent/include/event2/event.h | 1672 ++++++ .../libevent/include/event2/event_compat.h | 230 + .../libevent/include/event2/event_struct.h | 180 + bsnes/thrift/libevent/include/event2/http.h | 1192 +++++ .../libevent/include/event2/http_compat.h | 94 + .../libevent/include/event2/http_struct.h | 152 + .../libevent/include/event2/keyvalq_struct.h | 80 + .../thrift/libevent/include/event2/listener.h | 192 + bsnes/thrift/libevent/include/event2/rpc.h | 626 +++ .../libevent/include/event2/rpc_compat.h | 61 + .../libevent/include/event2/rpc_struct.h | 114 + bsnes/thrift/libevent/include/event2/tag.h | 146 + .../libevent/include/event2/tag_compat.h | 49 + bsnes/thrift/libevent/include/event2/thread.h | 253 + bsnes/thrift/libevent/include/event2/util.h | 888 ++++ .../libevent/include/event2/visibility.h | 67 + bsnes/thrift/libevent/include/evhttp.h | 45 + bsnes/thrift/libevent/include/evrpc.h | 45 + bsnes/thrift/libevent/include/evutil.h | 39 + .../lib/cmake/libevent/LibeventConfig.cmake | 183 + .../libevent/LibeventConfigVersion.cmake | 11 + .../LibeventTargets-static-release.cmake | 29 + .../libevent/LibeventTargets-static.cmake | 101 + bsnes/thrift/libevent/lib/event_32.lib | Bin 0 -> 539856 bytes bsnes/thrift/libevent/lib/event_64.lib | Bin 0 -> 993754 bytes bsnes/thrift/libevent/lib/event_core_32.lib | Bin 0 -> 311156 bytes bsnes/thrift/libevent/lib/event_core_64.lib | Bin 0 -> 596854 bytes bsnes/thrift/libevent/lib/event_extra_32.lib | Bin 0 -> 229840 bytes bsnes/thrift/libevent/lib/event_extra_64.lib | Bin 0 -> 398032 bytes .../thrift/libevent/lib/pkgconfig/libevent.pc | 16 + .../libevent/lib/pkgconfig/libevent_core.pc | 16 + .../libevent/lib/pkgconfig/libevent_extra.pc | 16 + bsnes/thrift/thrift/TApplicationException.h | 115 + bsnes/thrift/thrift/TBase.h | 38 + bsnes/thrift/thrift/TConfiguration.h | 55 + bsnes/thrift/thrift/TDispatchProcessor.h | 141 + bsnes/thrift/thrift/TLogging.h | 195 + bsnes/thrift/thrift/TOutput.h | 60 + bsnes/thrift/thrift/TProcessor.h | 229 + bsnes/thrift/thrift/TToString.h | 114 + bsnes/thrift/thrift/Thrift.h | 133 + .../thrift/async/TAsyncBufferProcessor.h | 46 + bsnes/thrift/thrift/async/TAsyncChannel.h | 74 + .../thrift/async/TAsyncDispatchProcessor.h | 151 + bsnes/thrift/thrift/async/TAsyncProcessor.h | 84 + .../thrift/async/TAsyncProtocolProcessor.h | 55 + .../thrift/async/TConcurrentClientSyncInfo.h | 126 + .../thrift/async/TEvhttpClientChannel.h | 88 + bsnes/thrift/thrift/async/TEvhttpServer.h | 74 + bsnes/thrift/thrift/concurrency/Exception.h | 64 + .../thrift/concurrency/FunctionRunner.h | 118 + bsnes/thrift/thrift/concurrency/Monitor.h | 126 + bsnes/thrift/thrift/concurrency/Mutex.h | 89 + bsnes/thrift/thrift/concurrency/Thread.h | 181 + .../thrift/thrift/concurrency/ThreadFactory.h | 76 + .../thrift/thrift/concurrency/ThreadManager.h | 213 + .../thrift/thrift/concurrency/TimerManager.h | 137 + bsnes/thrift/thrift/processor/PeekProcessor.h | 83 + .../thrift/thrift/processor/StatsProcessor.h | 242 + .../thrift/processor/TMultiplexedProcessor.h | 224 + bsnes/thrift/thrift/protocol/TBase64Utils.h | 45 + .../thrift/thrift/protocol/TBinaryProtocol.h | 268 + .../thrift/protocol/TBinaryProtocol.tcc | 491 ++ .../thrift/thrift/protocol/TCompactProtocol.h | 284 ++ .../thrift/protocol/TCompactProtocol.tcc | 858 ++++ bsnes/thrift/thrift/protocol/TDebugProtocol.h | 204 + bsnes/thrift/thrift/protocol/TEnum.h | 66 + .../thrift/thrift/protocol/THeaderProtocol.h | 210 + bsnes/thrift/thrift/protocol/TJSONProtocol.h | 343 ++ bsnes/thrift/thrift/protocol/TList.h | 55 + bsnes/thrift/thrift/protocol/TMap.h | 59 + .../thrift/protocol/TMultiplexedProtocol.h | 95 + bsnes/thrift/thrift/protocol/TProtocol.h | 750 +++ .../thrift/protocol/TProtocolDecorator.h | 151 + .../thrift/protocol/TProtocolException.h | 107 + bsnes/thrift/thrift/protocol/TProtocolTap.h | 177 + bsnes/thrift/thrift/protocol/TProtocolTypes.h | 36 + bsnes/thrift/thrift/protocol/TSet.h | 61 + .../thrift/thrift/protocol/TVirtualProtocol.h | 513 ++ bsnes/thrift/thrift/qt/CMakeLists.txt | 28 + bsnes/thrift/thrift/qt/TQIODeviceTransport.h | 68 + bsnes/thrift/thrift/qt/TQTcpServer.h | 81 + bsnes/thrift/thrift/server/TConnectedClient.h | 110 + .../thrift/thrift/server/TNonblockingServer.h | 859 ++++ bsnes/thrift/thrift/server/TServer.h | 273 + bsnes/thrift/thrift/server/TServerFramework.h | 184 + bsnes/thrift/thrift/server/TSimpleServer.h | 77 + .../thrift/thrift/server/TThreadPoolServer.h | 101 + bsnes/thrift/thrift/server/TThreadedServer.h | 143 + bsnes/thrift/thrift/thrift-config.h | 24 + bsnes/thrift/thrift/thrift_export.h | 20 + .../thrift/thrift/transport/PlatformSocket.h | 128 + bsnes/thrift/thrift/transport/SocketCommon.h | 51 + .../thrift/transport/TBufferTransports.h | 765 +++ bsnes/thrift/thrift/transport/TFDTransport.h | 79 + .../thrift/thrift/transport/TFileTransport.h | 439 ++ .../thrift/transport/THeaderTransport.h | 277 + bsnes/thrift/thrift/transport/THttpClient.h | 71 + bsnes/thrift/thrift/transport/THttpServer.h | 65 + .../thrift/thrift/transport/THttpTransport.h | 106 + .../transport/TNonblockingSSLServerSocket.h | 76 + .../transport/TNonblockingServerSocket.h | 139 + .../transport/TNonblockingServerTransport.h | 100 + bsnes/thrift/thrift/transport/TPipe.h | 113 + bsnes/thrift/thrift/transport/TPipeServer.h | 116 + .../thrift/transport/TSSLServerSocket.h | 76 + bsnes/thrift/thrift/transport/TSSLSocket.h | 442 ++ bsnes/thrift/thrift/transport/TServerSocket.h | 174 + .../thrift/transport/TServerTransport.h | 118 + .../thrift/transport/TShortReadTransport.h | 91 + .../thrift/transport/TSimpleFileTransport.h | 43 + bsnes/thrift/thrift/transport/TSocket.h | 369 ++ bsnes/thrift/thrift/transport/TSocketPool.h | 195 + bsnes/thrift/thrift/transport/TSocketUtils.h | 163 + bsnes/thrift/thrift/transport/TTransport.h | 357 ++ .../thrift/transport/TTransportException.h | 107 + .../thrift/thrift/transport/TTransportUtils.h | 319 ++ .../thrift/transport/TVirtualTransport.h | 140 + .../thrift/thrift/transport/TZlibTransport.h | 251 + bsnes/thrift/thrift/windows/GetTimeOfDay.h | 44 + bsnes/thrift/thrift/windows/Operators.h | 40 + .../windows/OverlappedSubmissionThread.h | 133 + bsnes/thrift/thrift/windows/SocketPair.h | 37 + bsnes/thrift/thrift/windows/Sync.h | 104 + .../thrift/thrift/windows/TWinsockSingleton.h | 73 + bsnes/thrift/thrift/windows/WinFcntl.h | 47 + bsnes/thrift/thrift/windows/config.h | 75 + bsnes/thrift/thrift_32.lib | Bin 0 -> 3749454 bytes bsnes/thrift/thrift_64.lib | Bin 0 -> 5752418 bytes bsnes/thrift/thriftd_32.lib | Bin 0 -> 15517618 bytes bsnes/thrift/thriftd_64.lib | Bin 0 -> 21900332 bytes bsnes/thrift/thriftnb_32.lib | Bin 0 -> 816740 bytes bsnes/thrift/thriftnb_64.lib | Bin 0 -> 1249890 bytes bsnes/thrift/thriftnbd_32.lib | Bin 0 -> 3091758 bytes bsnes/thrift/thriftnbd_64.lib | Bin 0 -> 4401894 bytes bsnes/ui-qt/cartridge/cartridge.cpp | 5 + bsnes/ui-qt/debugger/debugger.cpp | 8 +- bsnes/ui-qt/debugger/remote_debugger.cpp | 286 ++ bsnes/vstudio/bsnes/bsnes.sln | 44 + bsnes/vstudio/bsnes/bsnes.vcxproj | 109 +- bsnes/vstudio/bsnes/bsnes.vcxproj.filters | 297 +- 173 files changed, 38913 insertions(+), 177 deletions(-) create mode 100644 bsnes/Snesida/ida_debmod.h create mode 100644 bsnes/Snesida/ida_debug.cpp create mode 100644 bsnes/Snesida/ida_plugin.cpp create mode 100644 bsnes/Snesida/ida_plugin.h create mode 100644 bsnes/Snesida/ida_registers.h create mode 100644 bsnes/Snesida/snesida.vcxproj create mode 100644 bsnes/Snesida/snesida.vcxproj.filters create mode 100644 bsnes/Snesida/snesida.vcxproj.user create mode 100644 bsnes/gen-cpp/BsnesDebugger.cpp create mode 100644 bsnes/gen-cpp/BsnesDebugger.h create mode 100644 bsnes/gen-cpp/IdaClient.cpp create mode 100644 bsnes/gen-cpp/IdaClient.h create mode 100644 bsnes/gen-cpp/debug_proto_types.cpp create mode 100644 bsnes/gen-cpp/debug_proto_types.h create mode 100644 bsnes/thrift/debug_proto.thrift create mode 100644 bsnes/thrift/libevent/bin/event_rpcgen.py create mode 100644 bsnes/thrift/libevent/include/evdns.h create mode 100644 bsnes/thrift/libevent/include/event.h create mode 100644 bsnes/thrift/libevent/include/event2/buffer.h create mode 100644 bsnes/thrift/libevent/include/event2/buffer_compat.h create mode 100644 bsnes/thrift/libevent/include/event2/bufferevent.h create mode 100644 bsnes/thrift/libevent/include/event2/bufferevent_compat.h create mode 100644 bsnes/thrift/libevent/include/event2/bufferevent_struct.h create mode 100644 bsnes/thrift/libevent/include/event2/dns.h create mode 100644 bsnes/thrift/libevent/include/event2/dns_compat.h create mode 100644 bsnes/thrift/libevent/include/event2/dns_struct.h create mode 100644 bsnes/thrift/libevent/include/event2/event-config.h create mode 100644 bsnes/thrift/libevent/include/event2/event.h create mode 100644 bsnes/thrift/libevent/include/event2/event_compat.h create mode 100644 bsnes/thrift/libevent/include/event2/event_struct.h create mode 100644 bsnes/thrift/libevent/include/event2/http.h create mode 100644 bsnes/thrift/libevent/include/event2/http_compat.h create mode 100644 bsnes/thrift/libevent/include/event2/http_struct.h create mode 100644 bsnes/thrift/libevent/include/event2/keyvalq_struct.h create mode 100644 bsnes/thrift/libevent/include/event2/listener.h create mode 100644 bsnes/thrift/libevent/include/event2/rpc.h create mode 100644 bsnes/thrift/libevent/include/event2/rpc_compat.h create mode 100644 bsnes/thrift/libevent/include/event2/rpc_struct.h create mode 100644 bsnes/thrift/libevent/include/event2/tag.h create mode 100644 bsnes/thrift/libevent/include/event2/tag_compat.h create mode 100644 bsnes/thrift/libevent/include/event2/thread.h create mode 100644 bsnes/thrift/libevent/include/event2/util.h create mode 100644 bsnes/thrift/libevent/include/event2/visibility.h create mode 100644 bsnes/thrift/libevent/include/evhttp.h create mode 100644 bsnes/thrift/libevent/include/evrpc.h create mode 100644 bsnes/thrift/libevent/include/evutil.h create mode 100644 bsnes/thrift/libevent/lib/cmake/libevent/LibeventConfig.cmake create mode 100644 bsnes/thrift/libevent/lib/cmake/libevent/LibeventConfigVersion.cmake create mode 100644 bsnes/thrift/libevent/lib/cmake/libevent/LibeventTargets-static-release.cmake create mode 100644 bsnes/thrift/libevent/lib/cmake/libevent/LibeventTargets-static.cmake create mode 100644 bsnes/thrift/libevent/lib/event_32.lib create mode 100644 bsnes/thrift/libevent/lib/event_64.lib create mode 100644 bsnes/thrift/libevent/lib/event_core_32.lib create mode 100644 bsnes/thrift/libevent/lib/event_core_64.lib create mode 100644 bsnes/thrift/libevent/lib/event_extra_32.lib create mode 100644 bsnes/thrift/libevent/lib/event_extra_64.lib create mode 100644 bsnes/thrift/libevent/lib/pkgconfig/libevent.pc create mode 100644 bsnes/thrift/libevent/lib/pkgconfig/libevent_core.pc create mode 100644 bsnes/thrift/libevent/lib/pkgconfig/libevent_extra.pc create mode 100644 bsnes/thrift/thrift/TApplicationException.h create mode 100644 bsnes/thrift/thrift/TBase.h create mode 100644 bsnes/thrift/thrift/TConfiguration.h create mode 100644 bsnes/thrift/thrift/TDispatchProcessor.h create mode 100644 bsnes/thrift/thrift/TLogging.h create mode 100644 bsnes/thrift/thrift/TOutput.h create mode 100644 bsnes/thrift/thrift/TProcessor.h create mode 100644 bsnes/thrift/thrift/TToString.h create mode 100644 bsnes/thrift/thrift/Thrift.h create mode 100644 bsnes/thrift/thrift/async/TAsyncBufferProcessor.h create mode 100644 bsnes/thrift/thrift/async/TAsyncChannel.h create mode 100644 bsnes/thrift/thrift/async/TAsyncDispatchProcessor.h create mode 100644 bsnes/thrift/thrift/async/TAsyncProcessor.h create mode 100644 bsnes/thrift/thrift/async/TAsyncProtocolProcessor.h create mode 100644 bsnes/thrift/thrift/async/TConcurrentClientSyncInfo.h create mode 100644 bsnes/thrift/thrift/async/TEvhttpClientChannel.h create mode 100644 bsnes/thrift/thrift/async/TEvhttpServer.h create mode 100644 bsnes/thrift/thrift/concurrency/Exception.h create mode 100644 bsnes/thrift/thrift/concurrency/FunctionRunner.h create mode 100644 bsnes/thrift/thrift/concurrency/Monitor.h create mode 100644 bsnes/thrift/thrift/concurrency/Mutex.h create mode 100644 bsnes/thrift/thrift/concurrency/Thread.h create mode 100644 bsnes/thrift/thrift/concurrency/ThreadFactory.h create mode 100644 bsnes/thrift/thrift/concurrency/ThreadManager.h create mode 100644 bsnes/thrift/thrift/concurrency/TimerManager.h create mode 100644 bsnes/thrift/thrift/processor/PeekProcessor.h create mode 100644 bsnes/thrift/thrift/processor/StatsProcessor.h create mode 100644 bsnes/thrift/thrift/processor/TMultiplexedProcessor.h create mode 100644 bsnes/thrift/thrift/protocol/TBase64Utils.h create mode 100644 bsnes/thrift/thrift/protocol/TBinaryProtocol.h create mode 100644 bsnes/thrift/thrift/protocol/TBinaryProtocol.tcc create mode 100644 bsnes/thrift/thrift/protocol/TCompactProtocol.h create mode 100644 bsnes/thrift/thrift/protocol/TCompactProtocol.tcc create mode 100644 bsnes/thrift/thrift/protocol/TDebugProtocol.h create mode 100644 bsnes/thrift/thrift/protocol/TEnum.h create mode 100644 bsnes/thrift/thrift/protocol/THeaderProtocol.h create mode 100644 bsnes/thrift/thrift/protocol/TJSONProtocol.h create mode 100644 bsnes/thrift/thrift/protocol/TList.h create mode 100644 bsnes/thrift/thrift/protocol/TMap.h create mode 100644 bsnes/thrift/thrift/protocol/TMultiplexedProtocol.h create mode 100644 bsnes/thrift/thrift/protocol/TProtocol.h create mode 100644 bsnes/thrift/thrift/protocol/TProtocolDecorator.h create mode 100644 bsnes/thrift/thrift/protocol/TProtocolException.h create mode 100644 bsnes/thrift/thrift/protocol/TProtocolTap.h create mode 100644 bsnes/thrift/thrift/protocol/TProtocolTypes.h create mode 100644 bsnes/thrift/thrift/protocol/TSet.h create mode 100644 bsnes/thrift/thrift/protocol/TVirtualProtocol.h create mode 100644 bsnes/thrift/thrift/qt/CMakeLists.txt create mode 100644 bsnes/thrift/thrift/qt/TQIODeviceTransport.h create mode 100644 bsnes/thrift/thrift/qt/TQTcpServer.h create mode 100644 bsnes/thrift/thrift/server/TConnectedClient.h create mode 100644 bsnes/thrift/thrift/server/TNonblockingServer.h create mode 100644 bsnes/thrift/thrift/server/TServer.h create mode 100644 bsnes/thrift/thrift/server/TServerFramework.h create mode 100644 bsnes/thrift/thrift/server/TSimpleServer.h create mode 100644 bsnes/thrift/thrift/server/TThreadPoolServer.h create mode 100644 bsnes/thrift/thrift/server/TThreadedServer.h create mode 100644 bsnes/thrift/thrift/thrift-config.h create mode 100644 bsnes/thrift/thrift/thrift_export.h create mode 100644 bsnes/thrift/thrift/transport/PlatformSocket.h create mode 100644 bsnes/thrift/thrift/transport/SocketCommon.h create mode 100644 bsnes/thrift/thrift/transport/TBufferTransports.h create mode 100644 bsnes/thrift/thrift/transport/TFDTransport.h create mode 100644 bsnes/thrift/thrift/transport/TFileTransport.h create mode 100644 bsnes/thrift/thrift/transport/THeaderTransport.h create mode 100644 bsnes/thrift/thrift/transport/THttpClient.h create mode 100644 bsnes/thrift/thrift/transport/THttpServer.h create mode 100644 bsnes/thrift/thrift/transport/THttpTransport.h create mode 100644 bsnes/thrift/thrift/transport/TNonblockingSSLServerSocket.h create mode 100644 bsnes/thrift/thrift/transport/TNonblockingServerSocket.h create mode 100644 bsnes/thrift/thrift/transport/TNonblockingServerTransport.h create mode 100644 bsnes/thrift/thrift/transport/TPipe.h create mode 100644 bsnes/thrift/thrift/transport/TPipeServer.h create mode 100644 bsnes/thrift/thrift/transport/TSSLServerSocket.h create mode 100644 bsnes/thrift/thrift/transport/TSSLSocket.h create mode 100644 bsnes/thrift/thrift/transport/TServerSocket.h create mode 100644 bsnes/thrift/thrift/transport/TServerTransport.h create mode 100644 bsnes/thrift/thrift/transport/TShortReadTransport.h create mode 100644 bsnes/thrift/thrift/transport/TSimpleFileTransport.h create mode 100644 bsnes/thrift/thrift/transport/TSocket.h create mode 100644 bsnes/thrift/thrift/transport/TSocketPool.h create mode 100644 bsnes/thrift/thrift/transport/TSocketUtils.h create mode 100644 bsnes/thrift/thrift/transport/TTransport.h create mode 100644 bsnes/thrift/thrift/transport/TTransportException.h create mode 100644 bsnes/thrift/thrift/transport/TTransportUtils.h create mode 100644 bsnes/thrift/thrift/transport/TVirtualTransport.h create mode 100644 bsnes/thrift/thrift/transport/TZlibTransport.h create mode 100644 bsnes/thrift/thrift/windows/GetTimeOfDay.h create mode 100644 bsnes/thrift/thrift/windows/Operators.h create mode 100644 bsnes/thrift/thrift/windows/OverlappedSubmissionThread.h create mode 100644 bsnes/thrift/thrift/windows/SocketPair.h create mode 100644 bsnes/thrift/thrift/windows/Sync.h create mode 100644 bsnes/thrift/thrift/windows/TWinsockSingleton.h create mode 100644 bsnes/thrift/thrift/windows/WinFcntl.h create mode 100644 bsnes/thrift/thrift/windows/config.h create mode 100644 bsnes/thrift/thrift_32.lib create mode 100644 bsnes/thrift/thrift_64.lib create mode 100644 bsnes/thrift/thriftd_32.lib create mode 100644 bsnes/thrift/thriftd_64.lib create mode 100644 bsnes/thrift/thriftnb_32.lib create mode 100644 bsnes/thrift/thriftnb_64.lib create mode 100644 bsnes/thrift/thriftnbd_32.lib create mode 100644 bsnes/thrift/thriftnbd_64.lib create mode 100644 bsnes/ui-qt/debugger/remote_debugger.cpp diff --git a/.gitignore b/.gitignore index ab5676c5..b0d7ed50 100644 --- a/.gitignore +++ b/.gitignore @@ -11,3 +11,5 @@ *.rar */out */bin +/bsnes/vstudio/bsnes/ +/bsnes/Snesida/x64/ diff --git a/bsnes/Snesida/ida_debmod.h b/bsnes/Snesida/ida_debmod.h new file mode 100644 index 00000000..c5dc44a1 --- /dev/null +++ b/bsnes/Snesida/ida_debmod.h @@ -0,0 +1,53 @@ +#pragma once + +// +// +// This is the base debmod_t class definition +// From this class all debugger code must inherite and specialize +// +// Some OS specific functions must be implemented: +// bool init_subsystem(); +// bool term_subsystem(); +// debmod_t *create_debug_session(); +// int create_thread(thread_cb_t thread_cb, void *context); +// + +#undef INLINE + +#include +#include +#include + +//-------------------------------------------------------------------------- +// Very simple class to store pending events +enum queue_pos_t +{ + IN_FRONT, + IN_BACK +}; + +struct eventlist_t : public std::deque +{ +private: + bool synced; +public: + // save a pending event + void enqueue(const debug_event_t &ev, queue_pos_t pos) + { + if (pos != IN_BACK) + push_front(ev); + else + push_back(ev); + } + + // retrieve a pending event + bool retrieve(debug_event_t *event) + { + if (empty()) + return false; + // get the first event and return it + *event = front(); + pop_front(); + return true; + } +}; diff --git a/bsnes/Snesida/ida_debug.cpp b/bsnes/Snesida/ida_debug.cpp new file mode 100644 index 00000000..a87995a4 --- /dev/null +++ b/bsnes/Snesida/ida_debug.cpp @@ -0,0 +1,1025 @@ +#include "gen-cpp/IdaClient.h" +#include "gen-cpp/BsnesDebugger.h" +#include +#include +#include +#include +#include +#include + +using namespace ::apache::thrift; +using namespace ::apache::thrift::protocol; +using namespace ::apache::thrift::transport; +using namespace ::apache::thrift::server; +using namespace ::apache::thrift::concurrency; + +#include +#include +#include +#include +#include + +#include "ida_plugin.h" +#include "ida_debmod.h" +#include "ida_registers.h" + +::std::shared_ptr client; +::std::shared_ptr srv; +::std::shared_ptr cli_transport; + +static ::std::mutex list_mutex; +static eventlist_t events; + +static register_info_t registers[] = { + {"A", 0, RC_CPU, dt_word, NULL, 0}, + {"X", 0, RC_CPU, dt_word, NULL, 0}, + {"Y", 0, RC_CPU, dt_word, NULL, 0}, + + {"D", 0, RC_CPU, dt_word, NULL, 0}, + {"DB", 0, RC_CPU, dt_byte, NULL, 0}, + + {"PC", REGISTER_IP | REGISTER_ADDRESS, RC_CPU, dt_dword, NULL, 0}, + {"S", REGISTER_SP | REGISTER_ADDRESS, RC_CPU, dt_word, NULL, 0}, + + {"P", REGISTER_READONLY, RC_CPU, dt_byte, NULL, 0}, + {"m", REGISTER_READONLY, RC_CPU, dt_byte, NULL, 0}, + {"x", REGISTER_READONLY, RC_CPU, dt_byte, NULL, 0}, + {"e", REGISTER_READONLY, RC_CPU, dt_byte, NULL, 0}, +}; + +static const char* register_classes[] = { + "General Registers", + NULL +}; + +static struct apply_codemap_req : public exec_request_t { +private: + const std::vector& _changed; +public: + apply_codemap_req(const std::vector& changed) : _changed(changed) {}; + + int idaapi execute(void) override { + for (auto i = _changed.cbegin(); i != _changed.cend(); ++i) { + ea_t addr = (ea_t)(*i | 0x800000); + auto_make_code(addr); + plan_ea(addr); + show_addr(addr); + } + + return 0; + } +}; + +static void apply_codemap(const std::vector& changed) +{ + if (changed.empty()) return; + + apply_codemap_req req(changed); + execute_sync(req, MFF_FAST); +} + +static void pause_execution() +{ + try { + if (client) { + client->pause(); + } + } + catch (...) { + + } +} + +static void continue_execution() +{ + try { + if (client) { + client->resume(); + } + } + catch (...) { + + } +} + +static void finish_execution() +{ + try { + if (client) { + client->exit_emulation(); + } + } + catch (...) { + + } +} + +void stop_server() { + try { + srv->stop(); + } + catch (...) { + + } +} + +class IdaClientHandler : virtual public IdaClientIf { + +public: + void pause_event(const int32_t address) override { + ::std::lock_guard<::std::mutex> lock(list_mutex); + + debug_event_t ev; + ev.pid = 1; + ev.tid = 1; + ev.ea = address | 0x800000; + ev.handled = true; + ev.set_eid(PROCESS_SUSPENDED); + events.enqueue(ev, IN_BACK); + } + + + void start_event() override { + ::std::lock_guard<::std::mutex> lock(list_mutex); + + debug_event_t ev; + ev.pid = 1; + ev.tid = 1; + ev.ea = BADADDR; + ev.handled = true; + + ev.set_modinfo(PROCESS_STARTED).name.sprnt("BSNES"); + ev.set_modinfo(PROCESS_STARTED).base = 0; + ev.set_modinfo(PROCESS_STARTED).size = 0; + ev.set_modinfo(PROCESS_STARTED).rebase_to = BADADDR; + + events.enqueue(ev, IN_BACK); + } + + + void stop_event() override { + ::std::lock_guard<::std::mutex> lock(list_mutex); + + debug_event_t ev; + ev.pid = 1; + ev.handled = true; + ev.set_exit_code(PROCESS_EXITED, 0); + + events.enqueue(ev, IN_BACK); + } + + + void add_visited(const std::vector& changed) override { + apply_codemap(changed); + } + +}; + +static void init_ida_server() { + try { + ::std::shared_ptr handler(new IdaClientHandler()); + ::std::shared_ptr processor(new IdaClientProcessor(handler)); + ::std::shared_ptr serverTransport(new TNonblockingServerSocket(9091)); + ::std::shared_ptr transportFactory(new TFramedTransportFactory()); + ::std::shared_ptr protocolFactory(new TBinaryProtocolFactory()); + + srv = ::std::shared_ptr(new TNonblockingServer(processor, protocolFactory, serverTransport)); + ::std::shared_ptr tf(new ThreadFactory()); + ::std::shared_ptr thread = tf->newThread(srv); + thread->start(); + } catch (...) { + + } +} + +static void init_emu_client() { + ::std::shared_ptr socket(new TSocket("127.0.0.1", 9090)); + cli_transport = ::std::shared_ptr(new TFramedTransport(socket)); + ::std::shared_ptr protocol(new TBinaryProtocol(cli_transport)); + client = ::std::shared_ptr(new BsnesDebuggerClient(protocol)); + + show_wait_box("Waiting for BSNES-PLUS emulation..."); + + while (true) { + if (user_cancelled()) { + break; + } + + try { + cli_transport->open(); + break; + } + catch (...) { + + } + } + + hide_wait_box(); +} + + +// Initialize debugger +// Returns true-success +// This function is called from the main thread +static drc_t idaapi init_debugger(const char* hostname, int portnum, const char* password, qstring* errbuf) +{ + return DRC_OK; +} + +// Terminate debugger +// Returns true-success +// This function is called from the main thread +static drc_t idaapi term_debugger(void) +{ + finish_execution(); + return DRC_OK; +} + +// Return information about the n-th "compatible" running process. +// If n is 0, the processes list is reinitialized. +// 1-ok, 0-failed, -1-network error +// This function is called from the main thread +static drc_t s_get_processes(procinfo_vec_t* procs, qstring* errbuf) { + process_info_t info; + info.name.sprnt("bsnes"); + info.pid = 1; + procs->add(info); + + return DRC_OK; +} + +// Start an executable to debug +// 1 - ok, 0 - failed, -2 - file not found (ask for process options) +// 1|CRC32_MISMATCH - ok, but the input file crc does not match +// -1 - network error +// This function is called from debthread +static drc_t idaapi s_start_process(const char* path, + const char* args, + const char* startdir, + uint32 dbg_proc_flags, + const char* input_path, + uint32 input_file_crc32, + qstring* errbuf = NULL) +{ + ::std::lock_guard<::std::mutex> lock(list_mutex); + events.clear(); + + init_ida_server(); + init_emu_client(); + + try { + if (client) { + client->start_emulation(); + } + } + catch (...) { + + } + + return DRC_OK; +} + +// Prepare to pause the process +// This function will prepare to pause the process +// Normally the next get_debug_event() will pause the process +// If the process is sleeping then the pause will not occur +// until the process wakes up. The interface should take care of +// this situation. +// If this function is absent, then it won't be possible to pause the program +// 1-ok, 0-failed, -1-network error +// This function is called from debthread +static drc_t idaapi prepare_to_pause_process(qstring* errbuf) +{ + pause_execution(); + return DRC_OK; +} + +// Stop the process. +// May be called while the process is running or suspended. +// Must terminate the process in any case. +// The kernel will repeatedly call get_debug_event() and until PROCESS_EXIT. +// In this mode, all other events will be automatically handled and process will be resumed. +// 1-ok, 0-failed, -1-network error +// This function is called from debthread +static drc_t idaapi emul_exit_process(qstring* errbuf) +{ + finish_execution(); + + return DRC_OK; +} + +// Get a pending debug event and suspend the process +// This function will be called regularly by IDA. +// This function is called from debthread +static gdecode_t idaapi get_debug_event(debug_event_t* event, int timeout_ms) +{ + while (true) + { + ::std::lock_guard<::std::mutex> lock(list_mutex); + + // are there any pending events? + if (events.retrieve(event)) + { + return events.empty() ? GDE_ONE_EVENT : GDE_MANY_EVENTS; + } + if (events.empty()) + break; + } + return GDE_NO_EVENT; +} + +// Continue after handling the event +// 1-ok, 0-failed, -1-network error +// This function is called from debthread +static drc_t idaapi continue_after_event(const debug_event_t* event) +{ + dbg_notification_t req = get_running_notification(); + switch (event->eid()) + { + case STEP: + case PROCESS_SUSPENDED: + if (req == dbg_null || req == dbg_run_to) { + continue_execution(); + } + break; + case PROCESS_EXITED: + stop_server(); + break; + } + + return DRC_OK; +} + +// The following function will be called by the kernel each time +// when it has stopped the debugger process for some reason, +// refreshed the database and the screen. +// The debugger module may add information to the database if it wants. +// The reason for introducing this function is that when an event line +// LOAD_DLL happens, the database does not reflect the memory state yet +// and therefore we can't add information about the dll into the database +// in the get_debug_event() function. +// Only when the kernel has adjusted the database we can do it. +// Example: for imported PE DLLs we will add the exported function +// names to the database. +// This function pointer may be absent, i.e. NULL. +// This function is called from the main thread +static void idaapi stopped_at_debug_event(bool dlls_added) +{ +} + +// The following functions manipulate threads. +// 1-ok, 0-failed, -1-network error +// These functions are called from debthread +static drc_t idaapi s_set_resume_mode(thid_t tid, resume_mode_t resmod) // Run one instruction in the thread +{ + switch (resmod) + { + case RESMOD_INTO: ///< step into call (the most typical single stepping) + try { + if (client) { + client->step_into(); + } + } + catch (...) { + + } + + break; + case RESMOD_OVER: ///< step over call + try { + if (client) { + client->step_over(); + } + } + catch (...) { + + } + break; + } + + return DRC_OK; +} + +// Read thread registers +// tid - thread id +// clsmask- bitmask of register classes to read +// regval - pointer to vector of regvals for all registers +// regval is assumed to have debugger_t::registers_size elements +// 1-ok, 0-failed, -1-network error +// This function is called from debthread +static drc_t idaapi read_registers(thid_t tid, int clsmask, regval_t* values, qstring* errbuf) +{ + if (clsmask & RC_CPU) + { + BsnesRegisters regs; + + try { + if (client) { + client->get_cpu_regs(regs); + + values[static_cast(SNES_REGS::SR_PC)].ival = regs.pc | 0x800000; + values[static_cast(SNES_REGS::SR_A)].ival = regs.a; + values[static_cast(SNES_REGS::SR_X)].ival = regs.x; + values[static_cast(SNES_REGS::SR_Y)].ival = regs.y; + values[static_cast(SNES_REGS::SR_S)].ival = regs.s; + values[static_cast(SNES_REGS::SR_D)].ival = regs.d; + values[static_cast(SNES_REGS::SR_DB)].ival = regs.db; + values[static_cast(SNES_REGS::SR_P)].ival = regs.p; + values[static_cast(SNES_REGS::SR_MFLAG)].ival = regs.mflag; + values[static_cast(SNES_REGS::SR_XFLAG)].ival = regs.xflag; + values[static_cast(SNES_REGS::SR_EFLAG)].ival = regs.eflag; + } + } + catch (...) { + + } + } + + return DRC_OK; +} + +// Write one thread register +// tid - thread id +// regidx - register index +// regval - new value of the register +// 1-ok, 0-failed, -1-network error +// This function is called from debthread +static drc_t idaapi write_register(thid_t tid, int regidx, const regval_t* value, qstring* errbuf) +{ + if (regidx >= static_cast(SNES_REGS::SR_PC) && regidx <= static_cast(SNES_REGS::SR_EFLAG)) { + try { + if (client) { + client->set_cpu_reg(static_cast(regidx), value->ival & 0xFFFFFFFF); + } + } + catch (...) { + + } + } + + return DRC_OK; + +} + +// The following functions manipulate bytes in the memory. +// +// Get information on the memory areas +// The debugger module fills 'areas'. The returned vector MUST be sorted. +// Returns: +// -3: use idb segmentation +// -2: no changes +// -1: the process does not exist anymore +// 0: failed +// 1: new memory layout is returned +// This function is called from debthread +static drc_t idaapi get_memory_info(meminfo_vec_t& areas, qstring* errbuf) +{ + memory_info_t info; + + info.start_ea = 0x0000; + info.end_ea = 0x01FFF; + info.sclass = "STACK"; + info.bitness = 0; + info.perm = SEGPERM_READ | SEGPERM_WRITE; + areas.push_back(info); + + // Don't remove this loop + for (int i = 0; i < get_segm_qty(); ++i) + { + segment_t* segm = getnseg(i); + + info.start_ea = segm->start_ea; + info.end_ea = segm->end_ea; + + qstring buf; + get_segm_name(&buf, segm); + info.name = buf; + + get_segm_class(&buf, segm); + info.sclass = buf; + + info.sbase = get_segm_base(segm); + + info.perm = segm->perm; + info.bitness = segm->bitness; + areas.push_back(info); + } + // Don't remove this loop + + return DRC_OK; +} + +// Read process memory +// Returns number of read bytes +// 0 means read error +// -1 means that the process does not exist anymore +// This function is called from debthread +static ssize_t idaapi read_memory(ea_t ea, void* buffer, size_t size, qstring* errbuf) +{ + std::string mem; + + try { + if (client) { + client->read_memory(mem, DbgMemorySource::CPUBus, (int32_t)ea, (int32_t)size); + + memcpy(&((unsigned char*)buffer)[0], mem.c_str(), size); + } + } + catch (...) { + + } + + return size; +} + +// Write process memory +// Returns number of written bytes, -1-fatal error +// This function is called from debthread +static ssize_t idaapi write_memory(ea_t ea, const void* buffer, size_t size, qstring* errbuf) +{ + std::string mem((const char*)buffer); + + try { + if (client) { + client->write_memory(DbgMemorySource::CPUBus, (int32_t)ea, mem); + } + } + catch (...) { + + } + + return size; +} + +// Is it possible to set breakpoint? +// Returns: BPT_... +// This function is called from debthread or from the main thread if debthread +// is not running yet. +// It is called to verify hardware breakpoints. +static int idaapi is_ok_bpt(bpttype_t type, ea_t ea, int len) +{ + DbgMemorySource::type btype = DbgMemorySource::CPUBus; + + switch (btype) { + case DbgMemorySource::CPUBus: + case DbgMemorySource::APURAM: + case DbgMemorySource::DSP: + case DbgMemorySource::VRAM: + case DbgMemorySource::OAM: + case DbgMemorySource::CGRAM: + case DbgMemorySource::SA1Bus: + case DbgMemorySource::SFXBus: + break; + default: + return BPT_BAD_TYPE; + } + + switch (type) + { + case BPT_EXEC: + case BPT_READ: + case BPT_WRITE: + case BPT_RDWR: + return BPT_OK; + } + + return BPT_BAD_TYPE; +} + +// Add/del breakpoints. +// bpts array contains nadd bpts to add, followed by ndel bpts to del. +// returns number of successfully modified bpts, -1-network error +// This function is called from debthread +static drc_t idaapi update_bpts(int* nbpts, update_bpt_info_t* bpts, int nadd, int ndel, qstring* errbuf) +{ + for (int i = 0; i < nadd; ++i) + { + ea_t start = bpts[i].ea; + ea_t end = bpts[i].ea + bpts[i].size - 1; + + DbgBreakpoint bp; + bp.bstart = start; + bp.bend = end; + bp.enabled = true; + + switch (bpts[i].type) + { + case BPT_EXEC: + bp.type = BpType::BP_PC; + break; + case BPT_READ: + bp.type = BpType::BP_READ; + break; + case BPT_WRITE: + bp.type = BpType::BP_WRITE; + break; + case BPT_RDWR: + bp.type = BpType::BP_READ; + break; + } + + DbgMemorySource::type type = DbgMemorySource::CPUBus; + + switch (type) { + case DbgMemorySource::CPUBus: + bp.src = DbgBptSource::CPUBus; + break; + case DbgMemorySource::APURAM: + bp.src = DbgBptSource::APURAM; + break; + case DbgMemorySource::DSP: + bp.src = DbgBptSource::DSP; + break; + case DbgMemorySource::VRAM: + bp.src = DbgBptSource::VRAM; + break; + case DbgMemorySource::OAM: + bp.src = DbgBptSource::OAM; + break; + case DbgMemorySource::CGRAM: + bp.src = DbgBptSource::CGRAM; + break; + case DbgMemorySource::SA1Bus: + bp.src = DbgBptSource::SA1Bus; + break; + case DbgMemorySource::SFXBus: + bp.src = DbgBptSource::SFXBus; + break; + default: + continue; + } + + try { + if (client) { + client->add_breakpoint(bp); + } + } + catch (...) { + + } + + bpts[i].code = BPT_OK; + } + + for (int i = 0; i < ndel; ++i) + { + ea_t start = bpts[nadd + i].ea; + ea_t end = bpts[nadd + i].ea + bpts[nadd + i].size - 1; + + DbgBreakpoint bp; + bp.bstart = start; + bp.bend = end; + bp.enabled = true; + + switch (bpts[i].type) + { + case BPT_EXEC: + bp.type = BpType::BP_PC; + break; + case BPT_READ: + bp.type = BpType::BP_READ; + break; + case BPT_WRITE: + bp.type = BpType::BP_WRITE; + break; + case BPT_RDWR: + bp.type = BpType::BP_READ; + break; + } + + DbgMemorySource::type type = DbgMemorySource::CPUBus; + + switch (type) { + case DbgMemorySource::CPUBus: + bp.src = DbgBptSource::CPUBus; + break; + case DbgMemorySource::APURAM: + bp.src = DbgBptSource::APURAM; + break; + case DbgMemorySource::DSP: + bp.src = DbgBptSource::DSP; + break; + case DbgMemorySource::VRAM: + bp.src = DbgBptSource::VRAM; + break; + case DbgMemorySource::OAM: + bp.src = DbgBptSource::OAM; + break; + case DbgMemorySource::CGRAM: + bp.src = DbgBptSource::CGRAM; + break; + case DbgMemorySource::SA1Bus: + bp.src = DbgBptSource::SA1Bus; + break; + case DbgMemorySource::SFXBus: + bp.src = DbgBptSource::SFXBus; + break; + default: + continue; + } + + try { + if (client) { + client->del_breakpoint(bp); + } + } + catch (...) { + + } + + bpts[nadd + i].code = BPT_OK; + } + + *nbpts = (ndel + nadd); + return DRC_OK; +} + +static ssize_t idaapi idd_notify(void*, int msgid, va_list va) { + drc_t retcode = DRC_NONE; + qstring* errbuf; + + switch (msgid) + { + case debugger_t::ev_init_debugger: + { + const char* hostname = va_arg(va, const char*); + + int portnum = va_arg(va, int); + const char* password = va_arg(va, const char*); + errbuf = va_arg(va, qstring*); + QASSERT(1522, errbuf != NULL); + retcode = init_debugger(hostname, portnum, password, errbuf); + } + break; + + case debugger_t::ev_term_debugger: + retcode = term_debugger(); + break; + + case debugger_t::ev_get_processes: + { + procinfo_vec_t* procs = va_arg(va, procinfo_vec_t*); + errbuf = va_arg(va, qstring*); + retcode = s_get_processes(procs, errbuf); + } + break; + + case debugger_t::ev_start_process: + { + const char* path = va_arg(va, const char*); + const char* args = va_arg(va, const char*); + const char* startdir = va_arg(va, const char*); + uint32 dbg_proc_flags = va_arg(va, uint32); + const char* input_path = va_arg(va, const char*); + uint32 input_file_crc32 = va_arg(va, uint32); + errbuf = va_arg(va, qstring*); + retcode = s_start_process(path, + args, + startdir, + dbg_proc_flags, + input_path, + input_file_crc32, + errbuf); + } + break; + + //case debugger_t::ev_attach_process: + //{ + // pid_t pid = va_argi(va, pid_t); + // int event_id = va_arg(va, int); + // uint32 dbg_proc_flags = va_arg(va, uint32); + // errbuf = va_arg(va, qstring*); + // retcode = s_attach_process(pid, event_id, dbg_proc_flags, errbuf); + //} + //break; + + //case debugger_t::ev_detach_process: + // retcode = g_dbgmod.dbg_detach_process(); + // break; + + case debugger_t::ev_get_debapp_attrs: + { + debapp_attrs_t* out_pattrs = va_arg(va, debapp_attrs_t*); + out_pattrs->addrsize = 3; + out_pattrs->is_be = false; + out_pattrs->platform = "snes"; + out_pattrs->cbsize = sizeof(debapp_attrs_t); + retcode = DRC_OK; + } + break; + + case debugger_t::ev_rebase_if_required_to: + { + ea_t new_base = va_arg(va, ea_t); + retcode = DRC_OK; + } + break; + + case debugger_t::ev_request_pause: + errbuf = va_arg(va, qstring*); + retcode = prepare_to_pause_process(errbuf); + break; + + case debugger_t::ev_exit_process: + errbuf = va_arg(va, qstring*); + retcode = emul_exit_process(errbuf); + break; + + case debugger_t::ev_get_debug_event: + { + gdecode_t* code = va_arg(va, gdecode_t*); + debug_event_t* event = va_arg(va, debug_event_t*); + int timeout_ms = va_arg(va, int); + *code = get_debug_event(event, timeout_ms); + retcode = DRC_OK; + } + break; + + case debugger_t::ev_resume: + { + debug_event_t* event = va_arg(va, debug_event_t*); + retcode = continue_after_event(event); + } + break; + + //case debugger_t::ev_set_exception_info: + //{ + // exception_info_t* info = va_arg(va, exception_info_t*); + // int qty = va_arg(va, int); + // g_dbgmod.dbg_set_exception_info(info, qty); + // retcode = DRC_OK; + //} + //break; + + //case debugger_t::ev_suspended: + //{ + // bool dlls_added = va_argi(va, bool); + // thread_name_vec_t* thr_names = va_arg(va, thread_name_vec_t*); + // retcode = DRC_OK; + //} + //break; + + case debugger_t::ev_thread_suspend: + { + thid_t tid = va_argi(va, thid_t); + pause_execution(); + retcode = DRC_OK; + } + break; + + case debugger_t::ev_thread_continue: + { + thid_t tid = va_argi(va, thid_t); + continue_execution(); + retcode = DRC_OK; + } + break; + + case debugger_t::ev_set_resume_mode: + { + thid_t tid = va_argi(va, thid_t); + resume_mode_t resmod = va_argi(va, resume_mode_t); + retcode = s_set_resume_mode(tid, resmod); + } + break; + + case debugger_t::ev_read_registers: + { + thid_t tid = va_argi(va, thid_t); + int clsmask = va_arg(va, int); + regval_t* values = va_arg(va, regval_t*); + errbuf = va_arg(va, qstring*); + retcode = read_registers(tid, clsmask, values, errbuf); + } + break; + + case debugger_t::ev_write_register: + { + thid_t tid = va_argi(va, thid_t); + int regidx = va_arg(va, int); + const regval_t* value = va_arg(va, const regval_t*); + errbuf = va_arg(va, qstring*); + retcode = write_register(tid, regidx, value, errbuf); + } + break; + + case debugger_t::ev_get_memory_info: + { + meminfo_vec_t* ranges = va_arg(va, meminfo_vec_t*); + errbuf = va_arg(va, qstring*); + retcode = get_memory_info(*ranges, errbuf); + } + break; + + case debugger_t::ev_read_memory: + { + size_t* nbytes = va_arg(va, size_t*); + ea_t ea = va_arg(va, ea_t); + void* buffer = va_arg(va, void*); + size_t size = va_arg(va, size_t); + errbuf = va_arg(va, qstring*); + ssize_t code = read_memory(ea, buffer, size, errbuf); + *nbytes = code >= 0 ? code : 0; + retcode = code >= 0 ? DRC_OK : DRC_NOPROC; + } + break; + + case debugger_t::ev_write_memory: + { + size_t* nbytes = va_arg(va, size_t*); + ea_t ea = va_arg(va, ea_t); + const void* buffer = va_arg(va, void*); + size_t size = va_arg(va, size_t); + errbuf = va_arg(va, qstring*); + ssize_t code = write_memory(ea, buffer, size, errbuf); + *nbytes = code >= 0 ? code : 0; + retcode = code >= 0 ? DRC_OK : DRC_NOPROC; + } + break; + + case debugger_t::ev_check_bpt: + { + int* bptvc = va_arg(va, int*); + bpttype_t type = va_argi(va, bpttype_t); + ea_t ea = va_arg(va, ea_t); + int len = va_arg(va, int); + *bptvc = is_ok_bpt(type, ea, len); + retcode = DRC_OK; + } + break; + + case debugger_t::ev_update_bpts: + { + int* nbpts = va_arg(va, int*); + update_bpt_info_t* bpts = va_arg(va, update_bpt_info_t*); + int nadd = va_arg(va, int); + int ndel = va_arg(va, int); + errbuf = va_arg(va, qstring*); + retcode = update_bpts(nbpts, bpts, nadd, ndel, errbuf); + } + break; + + //case debugger_t::ev_update_lowcnds: + //{ + // int* nupdated = va_arg(va, int*); + // const lowcnd_t* lowcnds = va_arg(va, const lowcnd_t*); + // int nlowcnds = va_arg(va, int); + // errbuf = va_arg(va, qstring*); + // retcode = update_lowcnds(nupdated, lowcnds, nlowcnds, errbuf); + //} + //break; + + //case debugger_t::ev_eval_lowcnd: + //{ + // thid_t tid = va_argi(va, thid_t); + // ea_t ea = va_arg(va, ea_t); + // errbuf = va_arg(va, qstring*); + // retcode = g_dbgmod.dbg_eval_lowcnd(tid, ea, errbuf); + //} + //break; + + //case debugger_t::ev_bin_search: + //{ + // ea_t* ea = va_arg(va, ea_t*); + // ea_t start_ea = va_arg(va, ea_t); + // ea_t end_ea = va_arg(va, ea_t); + // const compiled_binpat_vec_t* ptns = va_arg(va, const compiled_binpat_vec_t*); + // int srch_flags = va_arg(va, int); + // errbuf = va_arg(va, qstring*); + // if (ptns != NULL) + // retcode = g_dbgmod.dbg_bin_search(ea, start_ea, end_ea, *ptns, srch_flags, errbuf); + //} + //break; + default: + retcode = DRC_NONE; + } + + return retcode; +} + +debugger_t debugger{ + IDD_INTERFACE_VERSION, + NAME, + 0x8000 + 6581, // (6) + "65816", + + DBG_FLAG_NOHOST | DBG_FLAG_CAN_CONT_BPT | DBG_FLAG_SAFE | DBG_FLAG_FAKE_ATTACH | DBG_FLAG_NOPASSWORD | + DBG_FLAG_NOSTARTDIR | DBG_FLAG_NOPARAMETERS | DBG_FLAG_ANYSIZE_HWBPT | DBG_FLAG_DEBTHREAD | DBG_FLAG_PREFER_SWBPTS, + DBG_HAS_GET_PROCESSES | DBG_HAS_REQUEST_PAUSE | DBG_HAS_SET_RESUME_MODE | DBG_HAS_THREAD_SUSPEND | DBG_HAS_THREAD_CONTINUE | DBG_HAS_CHECK_BPT, + + register_classes, + RC_CPU, + registers, + qnumber(registers), + + 0x1000, + + NULL, + 0, + 0, + + DBG_RESMOD_STEP_INTO | DBG_RESMOD_STEP_OVER, + + NULL, + idd_notify +}; diff --git a/bsnes/Snesida/ida_plugin.cpp b/bsnes/Snesida/ida_plugin.cpp new file mode 100644 index 00000000..916de0e3 --- /dev/null +++ b/bsnes/Snesida/ida_plugin.cpp @@ -0,0 +1,119 @@ +#include +#include +#include +#include + +#include "ida_plugin.h" + +extern debugger_t debugger; + +static bool plugin_inited; + +struct m68k_events_visitor_t : public post_event_visitor_t { + ssize_t idaapi handle_post_event(ssize_t code, int notification_code, va_list va) override { + switch (notification_code) { + case processor_t::ev_get_idd_opinfo: { + idd_opinfo_t* opinf = va_arg(va, idd_opinfo_t*); + ea_t ea = va_arg(va, ea_t); + int n = va_arg(va, int); + int thread_id = va_arg(va, int); + processor_t::regval_getter_t *getreg = va_arg(va, processor_t::regval_getter_t *); + const regval_t* regvalues = va_arg(va, const regval_t*); + + //opinf->ea = BADADDR; + //opinf->debregidx = 0; + //opinf->modified = false; + //opinf->value.ival = 0; + //opinf->value_size = 4; + + insn_t out; + if (!decode_insn(&out, ea)) { + return code; + } + + op_t op = out.ops[n]; + + switch (op.dtype) { + case dt_byte: + opinf->value_size = 1; + break; + case dt_dword: + opinf->value_size = 4; + break; + default: + opinf->value_size = 2; + break; + } + + switch (op.type) { + case o_mem: + case o_near: + opinf->ea = op.addr; + break; + case o_imm: + opinf->ea = op.value; + break; + } + return 1; + } break; + } + + return code; + } +} ctx; + +static bool init_plugin(void) { + return (ph.id == PLFM_65C816); +} + +static void print_version() +{ + static const char format[] = NAME " debugger plugin v%s;\nAuthor: DrMefistO [Lab 313] ."; + info(format, VERSION); + msg(format, VERSION); +} + +static plugmod_t* idaapi init(void) { + if (init_plugin()) { + dbg = &debugger; + plugin_inited = true; + + //register_post_event_visitor(HT_IDP, &ctx, nullptr); + + print_version(); + return PLUGIN_KEEP; + } + + return PLUGIN_SKIP; +} + +static void idaapi term(void) { + if (plugin_inited) { + //unregister_post_event_visitor(HT_IDP, &ctx); + + plugin_inited = false; + } +} + +static bool idaapi run(size_t arg) { + return false; +} + +char comment[] = NAME " debugger plugin by DrMefistO."; + +char help[] = + NAME " debugger plugin by DrMefistO.\n" + "\n" + "This module lets you debug SNES roms in IDA.\n"; + +plugin_t PLUGIN = { + IDP_INTERFACE_VERSION, + PLUGIN_PROC | PLUGIN_DBG, + init, + term, + run, + comment, + help, + NAME " debugger plugin", + "" +}; diff --git a/bsnes/Snesida/ida_plugin.h b/bsnes/Snesida/ida_plugin.h new file mode 100644 index 00000000..95880dcd --- /dev/null +++ b/bsnes/Snesida/ida_plugin.h @@ -0,0 +1,4 @@ +#pragma once + +#define NAME "snesida" +#define VERSION "1.0" diff --git a/bsnes/Snesida/ida_registers.h b/bsnes/Snesida/ida_registers.h new file mode 100644 index 00000000..955f1ba2 --- /dev/null +++ b/bsnes/Snesida/ida_registers.h @@ -0,0 +1,19 @@ +#pragma once + +#define RC_CPU (1 << 0) +#define RC_PPU (1 << 1) + +enum class SNES_REGS : uint8_t +{ + SR_A, + SR_X, + SR_Y, + SR_D, + SR_DB, + SR_PC, + SR_S, + SR_P, + SR_MFLAG, + SR_XFLAG, + SR_EFLAG, +}; diff --git a/bsnes/Snesida/snesida.vcxproj b/bsnes/Snesida/snesida.vcxproj new file mode 100644 index 00000000..b02c0c94 --- /dev/null +++ b/bsnes/Snesida/snesida.vcxproj @@ -0,0 +1,111 @@ + + + + + Debug + x64 + + + Release + x64 + + + + 16.0 + Win32Proj + {c89c7ccd-a6da-4364-a7da-8092983fb9a5} + snesida + 10.0 + + + + DynamicLibrary + true + v142 + MultiByte + + + DynamicLibrary + false + v142 + true + Unicode + + + + + + + + + + + + + + + true + snesida + c:\Program Files\IDA Pro 7.6\plugins\ + + + false + snesida + c:\Program Files\IDA Pro 7.6\plugins\ + + + + Level3 + __NT__;__IDP__;__X64__;USE_STANDARD_FILE_FUNCTIONS;_DEBUG;SNESIDA_EXPORTS;_WINDOWS;_USRDLL;%(PreprocessorDefinitions) + true + d:/idasdk76/include/;../;../thrift/;../thrift/libevent/include/;C:/local/boost_1_75_0/;%(AdditionalIncludeDirectories) + ProgramDatabase + MultiThreadedDebug + + + Windows + true + false + d:\idasdk76\lib\x64_win_vc_32\;../thrift/;../thrift/libevent/lib/;%(AdditionalLibraryDirectories) + ida.lib;thriftd_$(PlatformArchitecture).lib;thriftnbd_$(PlatformArchitecture).lib;event_$(PlatformArchitecture).lib;Iphlpapi.lib;%(AdditionalDependencies) + + + + + Level3 + true + true + __NT__;__IDP__;__X64__;USE_STANDARD_FILE_FUNCTIONS;NDEBUG;SNESIDA_EXPORTS;_WINDOWS;_USRDLL;%(PreprocessorDefinitions) + true + d:/idasdk76/include/;../;../thrift/;../thrift/libevent/include/;C:/local/boost_1_75_0/;%(AdditionalIncludeDirectories) + MultiThreaded + + + Windows + true + true + true + false + d:\idasdk76\lib\x64_win_vc_32\;../thrift/;../thrift/libevent/lib/;%(AdditionalLibraryDirectories) + ida.lib;thriftd_$(PlatformArchitecture).lib;thriftnbd_$(PlatformArchitecture).lib;event_$(PlatformArchitecture).lib;Iphlpapi.lib;%(AdditionalDependencies) + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/bsnes/Snesida/snesida.vcxproj.filters b/bsnes/Snesida/snesida.vcxproj.filters new file mode 100644 index 00000000..04495e99 --- /dev/null +++ b/bsnes/Snesida/snesida.vcxproj.filters @@ -0,0 +1,53 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;c++;cppm;ixx;def;odl;idl;hpj;bat;asm;asmx + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hh;hpp;hxx;h++;hm;inl;inc;ipp;xsd + + + {b200e2f7-35df-470c-8c66-43f4473644b8} + + + + + Source Files + + + Source Files + + + thrift + + + thrift + + + thrift + + + + + Header Files + + + Header Files + + + Header Files + + + thrift + + + thrift + + + thrift + + + \ No newline at end of file diff --git a/bsnes/Snesida/snesida.vcxproj.user b/bsnes/Snesida/snesida.vcxproj.user new file mode 100644 index 00000000..0d878296 --- /dev/null +++ b/bsnes/Snesida/snesida.vcxproj.user @@ -0,0 +1,13 @@ + + + + $(OutDir) + WindowsLocalDebugger + c:\Program Files\IDA Pro 7.6\ida.exe + + + WindowsLocalDebugger + c:\Program Files\IDA Pro 7.6\ida.exe + $(OutDir) + + \ No newline at end of file diff --git a/bsnes/gen-cpp/BsnesDebugger.cpp b/bsnes/gen-cpp/BsnesDebugger.cpp new file mode 100644 index 00000000..fa86f4ca --- /dev/null +++ b/bsnes/gen-cpp/BsnesDebugger.cpp @@ -0,0 +1,4524 @@ +/** + * Autogenerated by Thrift Compiler (0.14.0) + * + * DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING + * @generated + */ +#include "BsnesDebugger.h" + + + + +BsnesDebugger_get_cpu_reg_args::~BsnesDebugger_get_cpu_reg_args() noexcept { +} + + +uint32_t BsnesDebugger_get_cpu_reg_args::read(::apache::thrift::protocol::TProtocol* iprot) { + + ::apache::thrift::protocol::TInputRecursionTracker tracker(*iprot); + uint32_t xfer = 0; + std::string fname; + ::apache::thrift::protocol::TType ftype; + int16_t fid; + + xfer += iprot->readStructBegin(fname); + + using ::apache::thrift::protocol::TProtocolException; + + + while (true) + { + xfer += iprot->readFieldBegin(fname, ftype, fid); + if (ftype == ::apache::thrift::protocol::T_STOP) { + break; + } + switch (fid) + { + case 1: + if (ftype == ::apache::thrift::protocol::T_I32) { + int32_t ecast6; + xfer += iprot->readI32(ecast6); + this->reg = (BsnesRegister::type)ecast6; + this->__isset.reg = true; + } else { + xfer += iprot->skip(ftype); + } + break; + default: + xfer += iprot->skip(ftype); + break; + } + xfer += iprot->readFieldEnd(); + } + + xfer += iprot->readStructEnd(); + + return xfer; +} + +uint32_t BsnesDebugger_get_cpu_reg_args::write(::apache::thrift::protocol::TProtocol* oprot) const { + uint32_t xfer = 0; + ::apache::thrift::protocol::TOutputRecursionTracker tracker(*oprot); + xfer += oprot->writeStructBegin("BsnesDebugger_get_cpu_reg_args"); + + xfer += oprot->writeFieldBegin("reg", ::apache::thrift::protocol::T_I32, 1); + xfer += oprot->writeI32((int32_t)this->reg); + xfer += oprot->writeFieldEnd(); + + xfer += oprot->writeFieldStop(); + xfer += oprot->writeStructEnd(); + return xfer; +} + + +BsnesDebugger_get_cpu_reg_pargs::~BsnesDebugger_get_cpu_reg_pargs() noexcept { +} + + +uint32_t BsnesDebugger_get_cpu_reg_pargs::write(::apache::thrift::protocol::TProtocol* oprot) const { + uint32_t xfer = 0; + ::apache::thrift::protocol::TOutputRecursionTracker tracker(*oprot); + xfer += oprot->writeStructBegin("BsnesDebugger_get_cpu_reg_pargs"); + + xfer += oprot->writeFieldBegin("reg", ::apache::thrift::protocol::T_I32, 1); + xfer += oprot->writeI32((int32_t)(*(this->reg))); + xfer += oprot->writeFieldEnd(); + + xfer += oprot->writeFieldStop(); + xfer += oprot->writeStructEnd(); + return xfer; +} + + +BsnesDebugger_get_cpu_reg_result::~BsnesDebugger_get_cpu_reg_result() noexcept { +} + + +uint32_t BsnesDebugger_get_cpu_reg_result::read(::apache::thrift::protocol::TProtocol* iprot) { + + ::apache::thrift::protocol::TInputRecursionTracker tracker(*iprot); + uint32_t xfer = 0; + std::string fname; + ::apache::thrift::protocol::TType ftype; + int16_t fid; + + xfer += iprot->readStructBegin(fname); + + using ::apache::thrift::protocol::TProtocolException; + + + while (true) + { + xfer += iprot->readFieldBegin(fname, ftype, fid); + if (ftype == ::apache::thrift::protocol::T_STOP) { + break; + } + switch (fid) + { + case 0: + if (ftype == ::apache::thrift::protocol::T_I32) { + xfer += iprot->readI32(this->success); + this->__isset.success = true; + } else { + xfer += iprot->skip(ftype); + } + break; + default: + xfer += iprot->skip(ftype); + break; + } + xfer += iprot->readFieldEnd(); + } + + xfer += iprot->readStructEnd(); + + return xfer; +} + +uint32_t BsnesDebugger_get_cpu_reg_result::write(::apache::thrift::protocol::TProtocol* oprot) const { + + uint32_t xfer = 0; + + xfer += oprot->writeStructBegin("BsnesDebugger_get_cpu_reg_result"); + + if (this->__isset.success) { + xfer += oprot->writeFieldBegin("success", ::apache::thrift::protocol::T_I32, 0); + xfer += oprot->writeI32(this->success); + xfer += oprot->writeFieldEnd(); + } + xfer += oprot->writeFieldStop(); + xfer += oprot->writeStructEnd(); + return xfer; +} + + +BsnesDebugger_get_cpu_reg_presult::~BsnesDebugger_get_cpu_reg_presult() noexcept { +} + + +uint32_t BsnesDebugger_get_cpu_reg_presult::read(::apache::thrift::protocol::TProtocol* iprot) { + + ::apache::thrift::protocol::TInputRecursionTracker tracker(*iprot); + uint32_t xfer = 0; + std::string fname; + ::apache::thrift::protocol::TType ftype; + int16_t fid; + + xfer += iprot->readStructBegin(fname); + + using ::apache::thrift::protocol::TProtocolException; + + + while (true) + { + xfer += iprot->readFieldBegin(fname, ftype, fid); + if (ftype == ::apache::thrift::protocol::T_STOP) { + break; + } + switch (fid) + { + case 0: + if (ftype == ::apache::thrift::protocol::T_I32) { + xfer += iprot->readI32((*(this->success))); + this->__isset.success = true; + } else { + xfer += iprot->skip(ftype); + } + break; + default: + xfer += iprot->skip(ftype); + break; + } + xfer += iprot->readFieldEnd(); + } + + xfer += iprot->readStructEnd(); + + return xfer; +} + + +BsnesDebugger_get_cpu_regs_args::~BsnesDebugger_get_cpu_regs_args() noexcept { +} + + +uint32_t BsnesDebugger_get_cpu_regs_args::read(::apache::thrift::protocol::TProtocol* iprot) { + + ::apache::thrift::protocol::TInputRecursionTracker tracker(*iprot); + uint32_t xfer = 0; + std::string fname; + ::apache::thrift::protocol::TType ftype; + int16_t fid; + + xfer += iprot->readStructBegin(fname); + + using ::apache::thrift::protocol::TProtocolException; + + + while (true) + { + xfer += iprot->readFieldBegin(fname, ftype, fid); + if (ftype == ::apache::thrift::protocol::T_STOP) { + break; + } + xfer += iprot->skip(ftype); + xfer += iprot->readFieldEnd(); + } + + xfer += iprot->readStructEnd(); + + return xfer; +} + +uint32_t BsnesDebugger_get_cpu_regs_args::write(::apache::thrift::protocol::TProtocol* oprot) const { + uint32_t xfer = 0; + ::apache::thrift::protocol::TOutputRecursionTracker tracker(*oprot); + xfer += oprot->writeStructBegin("BsnesDebugger_get_cpu_regs_args"); + + xfer += oprot->writeFieldStop(); + xfer += oprot->writeStructEnd(); + return xfer; +} + + +BsnesDebugger_get_cpu_regs_pargs::~BsnesDebugger_get_cpu_regs_pargs() noexcept { +} + + +uint32_t BsnesDebugger_get_cpu_regs_pargs::write(::apache::thrift::protocol::TProtocol* oprot) const { + uint32_t xfer = 0; + ::apache::thrift::protocol::TOutputRecursionTracker tracker(*oprot); + xfer += oprot->writeStructBegin("BsnesDebugger_get_cpu_regs_pargs"); + + xfer += oprot->writeFieldStop(); + xfer += oprot->writeStructEnd(); + return xfer; +} + + +BsnesDebugger_get_cpu_regs_result::~BsnesDebugger_get_cpu_regs_result() noexcept { +} + + +uint32_t BsnesDebugger_get_cpu_regs_result::read(::apache::thrift::protocol::TProtocol* iprot) { + + ::apache::thrift::protocol::TInputRecursionTracker tracker(*iprot); + uint32_t xfer = 0; + std::string fname; + ::apache::thrift::protocol::TType ftype; + int16_t fid; + + xfer += iprot->readStructBegin(fname); + + using ::apache::thrift::protocol::TProtocolException; + + + while (true) + { + xfer += iprot->readFieldBegin(fname, ftype, fid); + if (ftype == ::apache::thrift::protocol::T_STOP) { + break; + } + switch (fid) + { + case 0: + if (ftype == ::apache::thrift::protocol::T_STRUCT) { + xfer += this->success.read(iprot); + this->__isset.success = true; + } else { + xfer += iprot->skip(ftype); + } + break; + default: + xfer += iprot->skip(ftype); + break; + } + xfer += iprot->readFieldEnd(); + } + + xfer += iprot->readStructEnd(); + + return xfer; +} + +uint32_t BsnesDebugger_get_cpu_regs_result::write(::apache::thrift::protocol::TProtocol* oprot) const { + + uint32_t xfer = 0; + + xfer += oprot->writeStructBegin("BsnesDebugger_get_cpu_regs_result"); + + if (this->__isset.success) { + xfer += oprot->writeFieldBegin("success", ::apache::thrift::protocol::T_STRUCT, 0); + xfer += this->success.write(oprot); + xfer += oprot->writeFieldEnd(); + } + xfer += oprot->writeFieldStop(); + xfer += oprot->writeStructEnd(); + return xfer; +} + + +BsnesDebugger_get_cpu_regs_presult::~BsnesDebugger_get_cpu_regs_presult() noexcept { +} + + +uint32_t BsnesDebugger_get_cpu_regs_presult::read(::apache::thrift::protocol::TProtocol* iprot) { + + ::apache::thrift::protocol::TInputRecursionTracker tracker(*iprot); + uint32_t xfer = 0; + std::string fname; + ::apache::thrift::protocol::TType ftype; + int16_t fid; + + xfer += iprot->readStructBegin(fname); + + using ::apache::thrift::protocol::TProtocolException; + + + while (true) + { + xfer += iprot->readFieldBegin(fname, ftype, fid); + if (ftype == ::apache::thrift::protocol::T_STOP) { + break; + } + switch (fid) + { + case 0: + if (ftype == ::apache::thrift::protocol::T_STRUCT) { + xfer += (*(this->success)).read(iprot); + this->__isset.success = true; + } else { + xfer += iprot->skip(ftype); + } + break; + default: + xfer += iprot->skip(ftype); + break; + } + xfer += iprot->readFieldEnd(); + } + + xfer += iprot->readStructEnd(); + + return xfer; +} + + +BsnesDebugger_set_cpu_reg_args::~BsnesDebugger_set_cpu_reg_args() noexcept { +} + + +uint32_t BsnesDebugger_set_cpu_reg_args::read(::apache::thrift::protocol::TProtocol* iprot) { + + ::apache::thrift::protocol::TInputRecursionTracker tracker(*iprot); + uint32_t xfer = 0; + std::string fname; + ::apache::thrift::protocol::TType ftype; + int16_t fid; + + xfer += iprot->readStructBegin(fname); + + using ::apache::thrift::protocol::TProtocolException; + + + while (true) + { + xfer += iprot->readFieldBegin(fname, ftype, fid); + if (ftype == ::apache::thrift::protocol::T_STOP) { + break; + } + switch (fid) + { + case 1: + if (ftype == ::apache::thrift::protocol::T_I32) { + int32_t ecast7; + xfer += iprot->readI32(ecast7); + this->reg = (BsnesRegister::type)ecast7; + this->__isset.reg = true; + } else { + xfer += iprot->skip(ftype); + } + break; + case 2: + if (ftype == ::apache::thrift::protocol::T_I32) { + xfer += iprot->readI32(this->value); + this->__isset.value = true; + } else { + xfer += iprot->skip(ftype); + } + break; + default: + xfer += iprot->skip(ftype); + break; + } + xfer += iprot->readFieldEnd(); + } + + xfer += iprot->readStructEnd(); + + return xfer; +} + +uint32_t BsnesDebugger_set_cpu_reg_args::write(::apache::thrift::protocol::TProtocol* oprot) const { + uint32_t xfer = 0; + ::apache::thrift::protocol::TOutputRecursionTracker tracker(*oprot); + xfer += oprot->writeStructBegin("BsnesDebugger_set_cpu_reg_args"); + + xfer += oprot->writeFieldBegin("reg", ::apache::thrift::protocol::T_I32, 1); + xfer += oprot->writeI32((int32_t)this->reg); + xfer += oprot->writeFieldEnd(); + + xfer += oprot->writeFieldBegin("value", ::apache::thrift::protocol::T_I32, 2); + xfer += oprot->writeI32(this->value); + xfer += oprot->writeFieldEnd(); + + xfer += oprot->writeFieldStop(); + xfer += oprot->writeStructEnd(); + return xfer; +} + + +BsnesDebugger_set_cpu_reg_pargs::~BsnesDebugger_set_cpu_reg_pargs() noexcept { +} + + +uint32_t BsnesDebugger_set_cpu_reg_pargs::write(::apache::thrift::protocol::TProtocol* oprot) const { + uint32_t xfer = 0; + ::apache::thrift::protocol::TOutputRecursionTracker tracker(*oprot); + xfer += oprot->writeStructBegin("BsnesDebugger_set_cpu_reg_pargs"); + + xfer += oprot->writeFieldBegin("reg", ::apache::thrift::protocol::T_I32, 1); + xfer += oprot->writeI32((int32_t)(*(this->reg))); + xfer += oprot->writeFieldEnd(); + + xfer += oprot->writeFieldBegin("value", ::apache::thrift::protocol::T_I32, 2); + xfer += oprot->writeI32((*(this->value))); + xfer += oprot->writeFieldEnd(); + + xfer += oprot->writeFieldStop(); + xfer += oprot->writeStructEnd(); + return xfer; +} + + +BsnesDebugger_set_cpu_reg_result::~BsnesDebugger_set_cpu_reg_result() noexcept { +} + + +uint32_t BsnesDebugger_set_cpu_reg_result::read(::apache::thrift::protocol::TProtocol* iprot) { + + ::apache::thrift::protocol::TInputRecursionTracker tracker(*iprot); + uint32_t xfer = 0; + std::string fname; + ::apache::thrift::protocol::TType ftype; + int16_t fid; + + xfer += iprot->readStructBegin(fname); + + using ::apache::thrift::protocol::TProtocolException; + + + while (true) + { + xfer += iprot->readFieldBegin(fname, ftype, fid); + if (ftype == ::apache::thrift::protocol::T_STOP) { + break; + } + xfer += iprot->skip(ftype); + xfer += iprot->readFieldEnd(); + } + + xfer += iprot->readStructEnd(); + + return xfer; +} + +uint32_t BsnesDebugger_set_cpu_reg_result::write(::apache::thrift::protocol::TProtocol* oprot) const { + + uint32_t xfer = 0; + + xfer += oprot->writeStructBegin("BsnesDebugger_set_cpu_reg_result"); + + xfer += oprot->writeFieldStop(); + xfer += oprot->writeStructEnd(); + return xfer; +} + + +BsnesDebugger_set_cpu_reg_presult::~BsnesDebugger_set_cpu_reg_presult() noexcept { +} + + +uint32_t BsnesDebugger_set_cpu_reg_presult::read(::apache::thrift::protocol::TProtocol* iprot) { + + ::apache::thrift::protocol::TInputRecursionTracker tracker(*iprot); + uint32_t xfer = 0; + std::string fname; + ::apache::thrift::protocol::TType ftype; + int16_t fid; + + xfer += iprot->readStructBegin(fname); + + using ::apache::thrift::protocol::TProtocolException; + + + while (true) + { + xfer += iprot->readFieldBegin(fname, ftype, fid); + if (ftype == ::apache::thrift::protocol::T_STOP) { + break; + } + xfer += iprot->skip(ftype); + xfer += iprot->readFieldEnd(); + } + + xfer += iprot->readStructEnd(); + + return xfer; +} + + +BsnesDebugger_read_memory_args::~BsnesDebugger_read_memory_args() noexcept { +} + + +uint32_t BsnesDebugger_read_memory_args::read(::apache::thrift::protocol::TProtocol* iprot) { + + ::apache::thrift::protocol::TInputRecursionTracker tracker(*iprot); + uint32_t xfer = 0; + std::string fname; + ::apache::thrift::protocol::TType ftype; + int16_t fid; + + xfer += iprot->readStructBegin(fname); + + using ::apache::thrift::protocol::TProtocolException; + + + while (true) + { + xfer += iprot->readFieldBegin(fname, ftype, fid); + if (ftype == ::apache::thrift::protocol::T_STOP) { + break; + } + switch (fid) + { + case 1: + if (ftype == ::apache::thrift::protocol::T_I32) { + int32_t ecast8; + xfer += iprot->readI32(ecast8); + this->src = (DbgMemorySource::type)ecast8; + this->__isset.src = true; + } else { + xfer += iprot->skip(ftype); + } + break; + case 2: + if (ftype == ::apache::thrift::protocol::T_I32) { + xfer += iprot->readI32(this->address); + this->__isset.address = true; + } else { + xfer += iprot->skip(ftype); + } + break; + case 3: + if (ftype == ::apache::thrift::protocol::T_I32) { + xfer += iprot->readI32(this->size); + this->__isset.size = true; + } else { + xfer += iprot->skip(ftype); + } + break; + default: + xfer += iprot->skip(ftype); + break; + } + xfer += iprot->readFieldEnd(); + } + + xfer += iprot->readStructEnd(); + + return xfer; +} + +uint32_t BsnesDebugger_read_memory_args::write(::apache::thrift::protocol::TProtocol* oprot) const { + uint32_t xfer = 0; + ::apache::thrift::protocol::TOutputRecursionTracker tracker(*oprot); + xfer += oprot->writeStructBegin("BsnesDebugger_read_memory_args"); + + xfer += oprot->writeFieldBegin("src", ::apache::thrift::protocol::T_I32, 1); + xfer += oprot->writeI32((int32_t)this->src); + xfer += oprot->writeFieldEnd(); + + xfer += oprot->writeFieldBegin("address", ::apache::thrift::protocol::T_I32, 2); + xfer += oprot->writeI32(this->address); + xfer += oprot->writeFieldEnd(); + + xfer += oprot->writeFieldBegin("size", ::apache::thrift::protocol::T_I32, 3); + xfer += oprot->writeI32(this->size); + xfer += oprot->writeFieldEnd(); + + xfer += oprot->writeFieldStop(); + xfer += oprot->writeStructEnd(); + return xfer; +} + + +BsnesDebugger_read_memory_pargs::~BsnesDebugger_read_memory_pargs() noexcept { +} + + +uint32_t BsnesDebugger_read_memory_pargs::write(::apache::thrift::protocol::TProtocol* oprot) const { + uint32_t xfer = 0; + ::apache::thrift::protocol::TOutputRecursionTracker tracker(*oprot); + xfer += oprot->writeStructBegin("BsnesDebugger_read_memory_pargs"); + + xfer += oprot->writeFieldBegin("src", ::apache::thrift::protocol::T_I32, 1); + xfer += oprot->writeI32((int32_t)(*(this->src))); + xfer += oprot->writeFieldEnd(); + + xfer += oprot->writeFieldBegin("address", ::apache::thrift::protocol::T_I32, 2); + xfer += oprot->writeI32((*(this->address))); + xfer += oprot->writeFieldEnd(); + + xfer += oprot->writeFieldBegin("size", ::apache::thrift::protocol::T_I32, 3); + xfer += oprot->writeI32((*(this->size))); + xfer += oprot->writeFieldEnd(); + + xfer += oprot->writeFieldStop(); + xfer += oprot->writeStructEnd(); + return xfer; +} + + +BsnesDebugger_read_memory_result::~BsnesDebugger_read_memory_result() noexcept { +} + + +uint32_t BsnesDebugger_read_memory_result::read(::apache::thrift::protocol::TProtocol* iprot) { + + ::apache::thrift::protocol::TInputRecursionTracker tracker(*iprot); + uint32_t xfer = 0; + std::string fname; + ::apache::thrift::protocol::TType ftype; + int16_t fid; + + xfer += iprot->readStructBegin(fname); + + using ::apache::thrift::protocol::TProtocolException; + + + while (true) + { + xfer += iprot->readFieldBegin(fname, ftype, fid); + if (ftype == ::apache::thrift::protocol::T_STOP) { + break; + } + switch (fid) + { + case 0: + if (ftype == ::apache::thrift::protocol::T_STRING) { + xfer += iprot->readBinary(this->success); + this->__isset.success = true; + } else { + xfer += iprot->skip(ftype); + } + break; + default: + xfer += iprot->skip(ftype); + break; + } + xfer += iprot->readFieldEnd(); + } + + xfer += iprot->readStructEnd(); + + return xfer; +} + +uint32_t BsnesDebugger_read_memory_result::write(::apache::thrift::protocol::TProtocol* oprot) const { + + uint32_t xfer = 0; + + xfer += oprot->writeStructBegin("BsnesDebugger_read_memory_result"); + + if (this->__isset.success) { + xfer += oprot->writeFieldBegin("success", ::apache::thrift::protocol::T_STRING, 0); + xfer += oprot->writeBinary(this->success); + xfer += oprot->writeFieldEnd(); + } + xfer += oprot->writeFieldStop(); + xfer += oprot->writeStructEnd(); + return xfer; +} + + +BsnesDebugger_read_memory_presult::~BsnesDebugger_read_memory_presult() noexcept { +} + + +uint32_t BsnesDebugger_read_memory_presult::read(::apache::thrift::protocol::TProtocol* iprot) { + + ::apache::thrift::protocol::TInputRecursionTracker tracker(*iprot); + uint32_t xfer = 0; + std::string fname; + ::apache::thrift::protocol::TType ftype; + int16_t fid; + + xfer += iprot->readStructBegin(fname); + + using ::apache::thrift::protocol::TProtocolException; + + + while (true) + { + xfer += iprot->readFieldBegin(fname, ftype, fid); + if (ftype == ::apache::thrift::protocol::T_STOP) { + break; + } + switch (fid) + { + case 0: + if (ftype == ::apache::thrift::protocol::T_STRING) { + xfer += iprot->readBinary((*(this->success))); + this->__isset.success = true; + } else { + xfer += iprot->skip(ftype); + } + break; + default: + xfer += iprot->skip(ftype); + break; + } + xfer += iprot->readFieldEnd(); + } + + xfer += iprot->readStructEnd(); + + return xfer; +} + + +BsnesDebugger_write_memory_args::~BsnesDebugger_write_memory_args() noexcept { +} + + +uint32_t BsnesDebugger_write_memory_args::read(::apache::thrift::protocol::TProtocol* iprot) { + + ::apache::thrift::protocol::TInputRecursionTracker tracker(*iprot); + uint32_t xfer = 0; + std::string fname; + ::apache::thrift::protocol::TType ftype; + int16_t fid; + + xfer += iprot->readStructBegin(fname); + + using ::apache::thrift::protocol::TProtocolException; + + + while (true) + { + xfer += iprot->readFieldBegin(fname, ftype, fid); + if (ftype == ::apache::thrift::protocol::T_STOP) { + break; + } + switch (fid) + { + case 1: + if (ftype == ::apache::thrift::protocol::T_I32) { + int32_t ecast9; + xfer += iprot->readI32(ecast9); + this->src = (DbgMemorySource::type)ecast9; + this->__isset.src = true; + } else { + xfer += iprot->skip(ftype); + } + break; + case 2: + if (ftype == ::apache::thrift::protocol::T_I32) { + xfer += iprot->readI32(this->address); + this->__isset.address = true; + } else { + xfer += iprot->skip(ftype); + } + break; + case 3: + if (ftype == ::apache::thrift::protocol::T_STRING) { + xfer += iprot->readBinary(this->data); + this->__isset.data = true; + } else { + xfer += iprot->skip(ftype); + } + break; + default: + xfer += iprot->skip(ftype); + break; + } + xfer += iprot->readFieldEnd(); + } + + xfer += iprot->readStructEnd(); + + return xfer; +} + +uint32_t BsnesDebugger_write_memory_args::write(::apache::thrift::protocol::TProtocol* oprot) const { + uint32_t xfer = 0; + ::apache::thrift::protocol::TOutputRecursionTracker tracker(*oprot); + xfer += oprot->writeStructBegin("BsnesDebugger_write_memory_args"); + + xfer += oprot->writeFieldBegin("src", ::apache::thrift::protocol::T_I32, 1); + xfer += oprot->writeI32((int32_t)this->src); + xfer += oprot->writeFieldEnd(); + + xfer += oprot->writeFieldBegin("address", ::apache::thrift::protocol::T_I32, 2); + xfer += oprot->writeI32(this->address); + xfer += oprot->writeFieldEnd(); + + xfer += oprot->writeFieldBegin("data", ::apache::thrift::protocol::T_STRING, 3); + xfer += oprot->writeBinary(this->data); + xfer += oprot->writeFieldEnd(); + + xfer += oprot->writeFieldStop(); + xfer += oprot->writeStructEnd(); + return xfer; +} + + +BsnesDebugger_write_memory_pargs::~BsnesDebugger_write_memory_pargs() noexcept { +} + + +uint32_t BsnesDebugger_write_memory_pargs::write(::apache::thrift::protocol::TProtocol* oprot) const { + uint32_t xfer = 0; + ::apache::thrift::protocol::TOutputRecursionTracker tracker(*oprot); + xfer += oprot->writeStructBegin("BsnesDebugger_write_memory_pargs"); + + xfer += oprot->writeFieldBegin("src", ::apache::thrift::protocol::T_I32, 1); + xfer += oprot->writeI32((int32_t)(*(this->src))); + xfer += oprot->writeFieldEnd(); + + xfer += oprot->writeFieldBegin("address", ::apache::thrift::protocol::T_I32, 2); + xfer += oprot->writeI32((*(this->address))); + xfer += oprot->writeFieldEnd(); + + xfer += oprot->writeFieldBegin("data", ::apache::thrift::protocol::T_STRING, 3); + xfer += oprot->writeBinary((*(this->data))); + xfer += oprot->writeFieldEnd(); + + xfer += oprot->writeFieldStop(); + xfer += oprot->writeStructEnd(); + return xfer; +} + + +BsnesDebugger_write_memory_result::~BsnesDebugger_write_memory_result() noexcept { +} + + +uint32_t BsnesDebugger_write_memory_result::read(::apache::thrift::protocol::TProtocol* iprot) { + + ::apache::thrift::protocol::TInputRecursionTracker tracker(*iprot); + uint32_t xfer = 0; + std::string fname; + ::apache::thrift::protocol::TType ftype; + int16_t fid; + + xfer += iprot->readStructBegin(fname); + + using ::apache::thrift::protocol::TProtocolException; + + + while (true) + { + xfer += iprot->readFieldBegin(fname, ftype, fid); + if (ftype == ::apache::thrift::protocol::T_STOP) { + break; + } + xfer += iprot->skip(ftype); + xfer += iprot->readFieldEnd(); + } + + xfer += iprot->readStructEnd(); + + return xfer; +} + +uint32_t BsnesDebugger_write_memory_result::write(::apache::thrift::protocol::TProtocol* oprot) const { + + uint32_t xfer = 0; + + xfer += oprot->writeStructBegin("BsnesDebugger_write_memory_result"); + + xfer += oprot->writeFieldStop(); + xfer += oprot->writeStructEnd(); + return xfer; +} + + +BsnesDebugger_write_memory_presult::~BsnesDebugger_write_memory_presult() noexcept { +} + + +uint32_t BsnesDebugger_write_memory_presult::read(::apache::thrift::protocol::TProtocol* iprot) { + + ::apache::thrift::protocol::TInputRecursionTracker tracker(*iprot); + uint32_t xfer = 0; + std::string fname; + ::apache::thrift::protocol::TType ftype; + int16_t fid; + + xfer += iprot->readStructBegin(fname); + + using ::apache::thrift::protocol::TProtocolException; + + + while (true) + { + xfer += iprot->readFieldBegin(fname, ftype, fid); + if (ftype == ::apache::thrift::protocol::T_STOP) { + break; + } + xfer += iprot->skip(ftype); + xfer += iprot->readFieldEnd(); + } + + xfer += iprot->readStructEnd(); + + return xfer; +} + + +BsnesDebugger_add_breakpoint_args::~BsnesDebugger_add_breakpoint_args() noexcept { +} + + +uint32_t BsnesDebugger_add_breakpoint_args::read(::apache::thrift::protocol::TProtocol* iprot) { + + ::apache::thrift::protocol::TInputRecursionTracker tracker(*iprot); + uint32_t xfer = 0; + std::string fname; + ::apache::thrift::protocol::TType ftype; + int16_t fid; + + xfer += iprot->readStructBegin(fname); + + using ::apache::thrift::protocol::TProtocolException; + + + while (true) + { + xfer += iprot->readFieldBegin(fname, ftype, fid); + if (ftype == ::apache::thrift::protocol::T_STOP) { + break; + } + switch (fid) + { + case 1: + if (ftype == ::apache::thrift::protocol::T_STRUCT) { + xfer += this->bpt.read(iprot); + this->__isset.bpt = true; + } else { + xfer += iprot->skip(ftype); + } + break; + default: + xfer += iprot->skip(ftype); + break; + } + xfer += iprot->readFieldEnd(); + } + + xfer += iprot->readStructEnd(); + + return xfer; +} + +uint32_t BsnesDebugger_add_breakpoint_args::write(::apache::thrift::protocol::TProtocol* oprot) const { + uint32_t xfer = 0; + ::apache::thrift::protocol::TOutputRecursionTracker tracker(*oprot); + xfer += oprot->writeStructBegin("BsnesDebugger_add_breakpoint_args"); + + xfer += oprot->writeFieldBegin("bpt", ::apache::thrift::protocol::T_STRUCT, 1); + xfer += this->bpt.write(oprot); + xfer += oprot->writeFieldEnd(); + + xfer += oprot->writeFieldStop(); + xfer += oprot->writeStructEnd(); + return xfer; +} + + +BsnesDebugger_add_breakpoint_pargs::~BsnesDebugger_add_breakpoint_pargs() noexcept { +} + + +uint32_t BsnesDebugger_add_breakpoint_pargs::write(::apache::thrift::protocol::TProtocol* oprot) const { + uint32_t xfer = 0; + ::apache::thrift::protocol::TOutputRecursionTracker tracker(*oprot); + xfer += oprot->writeStructBegin("BsnesDebugger_add_breakpoint_pargs"); + + xfer += oprot->writeFieldBegin("bpt", ::apache::thrift::protocol::T_STRUCT, 1); + xfer += (*(this->bpt)).write(oprot); + xfer += oprot->writeFieldEnd(); + + xfer += oprot->writeFieldStop(); + xfer += oprot->writeStructEnd(); + return xfer; +} + + +BsnesDebugger_add_breakpoint_result::~BsnesDebugger_add_breakpoint_result() noexcept { +} + + +uint32_t BsnesDebugger_add_breakpoint_result::read(::apache::thrift::protocol::TProtocol* iprot) { + + ::apache::thrift::protocol::TInputRecursionTracker tracker(*iprot); + uint32_t xfer = 0; + std::string fname; + ::apache::thrift::protocol::TType ftype; + int16_t fid; + + xfer += iprot->readStructBegin(fname); + + using ::apache::thrift::protocol::TProtocolException; + + + while (true) + { + xfer += iprot->readFieldBegin(fname, ftype, fid); + if (ftype == ::apache::thrift::protocol::T_STOP) { + break; + } + xfer += iprot->skip(ftype); + xfer += iprot->readFieldEnd(); + } + + xfer += iprot->readStructEnd(); + + return xfer; +} + +uint32_t BsnesDebugger_add_breakpoint_result::write(::apache::thrift::protocol::TProtocol* oprot) const { + + uint32_t xfer = 0; + + xfer += oprot->writeStructBegin("BsnesDebugger_add_breakpoint_result"); + + xfer += oprot->writeFieldStop(); + xfer += oprot->writeStructEnd(); + return xfer; +} + + +BsnesDebugger_add_breakpoint_presult::~BsnesDebugger_add_breakpoint_presult() noexcept { +} + + +uint32_t BsnesDebugger_add_breakpoint_presult::read(::apache::thrift::protocol::TProtocol* iprot) { + + ::apache::thrift::protocol::TInputRecursionTracker tracker(*iprot); + uint32_t xfer = 0; + std::string fname; + ::apache::thrift::protocol::TType ftype; + int16_t fid; + + xfer += iprot->readStructBegin(fname); + + using ::apache::thrift::protocol::TProtocolException; + + + while (true) + { + xfer += iprot->readFieldBegin(fname, ftype, fid); + if (ftype == ::apache::thrift::protocol::T_STOP) { + break; + } + xfer += iprot->skip(ftype); + xfer += iprot->readFieldEnd(); + } + + xfer += iprot->readStructEnd(); + + return xfer; +} + + +BsnesDebugger_del_breakpoint_args::~BsnesDebugger_del_breakpoint_args() noexcept { +} + + +uint32_t BsnesDebugger_del_breakpoint_args::read(::apache::thrift::protocol::TProtocol* iprot) { + + ::apache::thrift::protocol::TInputRecursionTracker tracker(*iprot); + uint32_t xfer = 0; + std::string fname; + ::apache::thrift::protocol::TType ftype; + int16_t fid; + + xfer += iprot->readStructBegin(fname); + + using ::apache::thrift::protocol::TProtocolException; + + + while (true) + { + xfer += iprot->readFieldBegin(fname, ftype, fid); + if (ftype == ::apache::thrift::protocol::T_STOP) { + break; + } + switch (fid) + { + case 1: + if (ftype == ::apache::thrift::protocol::T_STRUCT) { + xfer += this->bpt.read(iprot); + this->__isset.bpt = true; + } else { + xfer += iprot->skip(ftype); + } + break; + default: + xfer += iprot->skip(ftype); + break; + } + xfer += iprot->readFieldEnd(); + } + + xfer += iprot->readStructEnd(); + + return xfer; +} + +uint32_t BsnesDebugger_del_breakpoint_args::write(::apache::thrift::protocol::TProtocol* oprot) const { + uint32_t xfer = 0; + ::apache::thrift::protocol::TOutputRecursionTracker tracker(*oprot); + xfer += oprot->writeStructBegin("BsnesDebugger_del_breakpoint_args"); + + xfer += oprot->writeFieldBegin("bpt", ::apache::thrift::protocol::T_STRUCT, 1); + xfer += this->bpt.write(oprot); + xfer += oprot->writeFieldEnd(); + + xfer += oprot->writeFieldStop(); + xfer += oprot->writeStructEnd(); + return xfer; +} + + +BsnesDebugger_del_breakpoint_pargs::~BsnesDebugger_del_breakpoint_pargs() noexcept { +} + + +uint32_t BsnesDebugger_del_breakpoint_pargs::write(::apache::thrift::protocol::TProtocol* oprot) const { + uint32_t xfer = 0; + ::apache::thrift::protocol::TOutputRecursionTracker tracker(*oprot); + xfer += oprot->writeStructBegin("BsnesDebugger_del_breakpoint_pargs"); + + xfer += oprot->writeFieldBegin("bpt", ::apache::thrift::protocol::T_STRUCT, 1); + xfer += (*(this->bpt)).write(oprot); + xfer += oprot->writeFieldEnd(); + + xfer += oprot->writeFieldStop(); + xfer += oprot->writeStructEnd(); + return xfer; +} + + +BsnesDebugger_del_breakpoint_result::~BsnesDebugger_del_breakpoint_result() noexcept { +} + + +uint32_t BsnesDebugger_del_breakpoint_result::read(::apache::thrift::protocol::TProtocol* iprot) { + + ::apache::thrift::protocol::TInputRecursionTracker tracker(*iprot); + uint32_t xfer = 0; + std::string fname; + ::apache::thrift::protocol::TType ftype; + int16_t fid; + + xfer += iprot->readStructBegin(fname); + + using ::apache::thrift::protocol::TProtocolException; + + + while (true) + { + xfer += iprot->readFieldBegin(fname, ftype, fid); + if (ftype == ::apache::thrift::protocol::T_STOP) { + break; + } + xfer += iprot->skip(ftype); + xfer += iprot->readFieldEnd(); + } + + xfer += iprot->readStructEnd(); + + return xfer; +} + +uint32_t BsnesDebugger_del_breakpoint_result::write(::apache::thrift::protocol::TProtocol* oprot) const { + + uint32_t xfer = 0; + + xfer += oprot->writeStructBegin("BsnesDebugger_del_breakpoint_result"); + + xfer += oprot->writeFieldStop(); + xfer += oprot->writeStructEnd(); + return xfer; +} + + +BsnesDebugger_del_breakpoint_presult::~BsnesDebugger_del_breakpoint_presult() noexcept { +} + + +uint32_t BsnesDebugger_del_breakpoint_presult::read(::apache::thrift::protocol::TProtocol* iprot) { + + ::apache::thrift::protocol::TInputRecursionTracker tracker(*iprot); + uint32_t xfer = 0; + std::string fname; + ::apache::thrift::protocol::TType ftype; + int16_t fid; + + xfer += iprot->readStructBegin(fname); + + using ::apache::thrift::protocol::TProtocolException; + + + while (true) + { + xfer += iprot->readFieldBegin(fname, ftype, fid); + if (ftype == ::apache::thrift::protocol::T_STOP) { + break; + } + xfer += iprot->skip(ftype); + xfer += iprot->readFieldEnd(); + } + + xfer += iprot->readStructEnd(); + + return xfer; +} + + +BsnesDebugger_pause_args::~BsnesDebugger_pause_args() noexcept { +} + + +uint32_t BsnesDebugger_pause_args::read(::apache::thrift::protocol::TProtocol* iprot) { + + ::apache::thrift::protocol::TInputRecursionTracker tracker(*iprot); + uint32_t xfer = 0; + std::string fname; + ::apache::thrift::protocol::TType ftype; + int16_t fid; + + xfer += iprot->readStructBegin(fname); + + using ::apache::thrift::protocol::TProtocolException; + + + while (true) + { + xfer += iprot->readFieldBegin(fname, ftype, fid); + if (ftype == ::apache::thrift::protocol::T_STOP) { + break; + } + xfer += iprot->skip(ftype); + xfer += iprot->readFieldEnd(); + } + + xfer += iprot->readStructEnd(); + + return xfer; +} + +uint32_t BsnesDebugger_pause_args::write(::apache::thrift::protocol::TProtocol* oprot) const { + uint32_t xfer = 0; + ::apache::thrift::protocol::TOutputRecursionTracker tracker(*oprot); + xfer += oprot->writeStructBegin("BsnesDebugger_pause_args"); + + xfer += oprot->writeFieldStop(); + xfer += oprot->writeStructEnd(); + return xfer; +} + + +BsnesDebugger_pause_pargs::~BsnesDebugger_pause_pargs() noexcept { +} + + +uint32_t BsnesDebugger_pause_pargs::write(::apache::thrift::protocol::TProtocol* oprot) const { + uint32_t xfer = 0; + ::apache::thrift::protocol::TOutputRecursionTracker tracker(*oprot); + xfer += oprot->writeStructBegin("BsnesDebugger_pause_pargs"); + + xfer += oprot->writeFieldStop(); + xfer += oprot->writeStructEnd(); + return xfer; +} + + +BsnesDebugger_pause_result::~BsnesDebugger_pause_result() noexcept { +} + + +uint32_t BsnesDebugger_pause_result::read(::apache::thrift::protocol::TProtocol* iprot) { + + ::apache::thrift::protocol::TInputRecursionTracker tracker(*iprot); + uint32_t xfer = 0; + std::string fname; + ::apache::thrift::protocol::TType ftype; + int16_t fid; + + xfer += iprot->readStructBegin(fname); + + using ::apache::thrift::protocol::TProtocolException; + + + while (true) + { + xfer += iprot->readFieldBegin(fname, ftype, fid); + if (ftype == ::apache::thrift::protocol::T_STOP) { + break; + } + xfer += iprot->skip(ftype); + xfer += iprot->readFieldEnd(); + } + + xfer += iprot->readStructEnd(); + + return xfer; +} + +uint32_t BsnesDebugger_pause_result::write(::apache::thrift::protocol::TProtocol* oprot) const { + + uint32_t xfer = 0; + + xfer += oprot->writeStructBegin("BsnesDebugger_pause_result"); + + xfer += oprot->writeFieldStop(); + xfer += oprot->writeStructEnd(); + return xfer; +} + + +BsnesDebugger_pause_presult::~BsnesDebugger_pause_presult() noexcept { +} + + +uint32_t BsnesDebugger_pause_presult::read(::apache::thrift::protocol::TProtocol* iprot) { + + ::apache::thrift::protocol::TInputRecursionTracker tracker(*iprot); + uint32_t xfer = 0; + std::string fname; + ::apache::thrift::protocol::TType ftype; + int16_t fid; + + xfer += iprot->readStructBegin(fname); + + using ::apache::thrift::protocol::TProtocolException; + + + while (true) + { + xfer += iprot->readFieldBegin(fname, ftype, fid); + if (ftype == ::apache::thrift::protocol::T_STOP) { + break; + } + xfer += iprot->skip(ftype); + xfer += iprot->readFieldEnd(); + } + + xfer += iprot->readStructEnd(); + + return xfer; +} + + +BsnesDebugger_resume_args::~BsnesDebugger_resume_args() noexcept { +} + + +uint32_t BsnesDebugger_resume_args::read(::apache::thrift::protocol::TProtocol* iprot) { + + ::apache::thrift::protocol::TInputRecursionTracker tracker(*iprot); + uint32_t xfer = 0; + std::string fname; + ::apache::thrift::protocol::TType ftype; + int16_t fid; + + xfer += iprot->readStructBegin(fname); + + using ::apache::thrift::protocol::TProtocolException; + + + while (true) + { + xfer += iprot->readFieldBegin(fname, ftype, fid); + if (ftype == ::apache::thrift::protocol::T_STOP) { + break; + } + xfer += iprot->skip(ftype); + xfer += iprot->readFieldEnd(); + } + + xfer += iprot->readStructEnd(); + + return xfer; +} + +uint32_t BsnesDebugger_resume_args::write(::apache::thrift::protocol::TProtocol* oprot) const { + uint32_t xfer = 0; + ::apache::thrift::protocol::TOutputRecursionTracker tracker(*oprot); + xfer += oprot->writeStructBegin("BsnesDebugger_resume_args"); + + xfer += oprot->writeFieldStop(); + xfer += oprot->writeStructEnd(); + return xfer; +} + + +BsnesDebugger_resume_pargs::~BsnesDebugger_resume_pargs() noexcept { +} + + +uint32_t BsnesDebugger_resume_pargs::write(::apache::thrift::protocol::TProtocol* oprot) const { + uint32_t xfer = 0; + ::apache::thrift::protocol::TOutputRecursionTracker tracker(*oprot); + xfer += oprot->writeStructBegin("BsnesDebugger_resume_pargs"); + + xfer += oprot->writeFieldStop(); + xfer += oprot->writeStructEnd(); + return xfer; +} + + +BsnesDebugger_resume_result::~BsnesDebugger_resume_result() noexcept { +} + + +uint32_t BsnesDebugger_resume_result::read(::apache::thrift::protocol::TProtocol* iprot) { + + ::apache::thrift::protocol::TInputRecursionTracker tracker(*iprot); + uint32_t xfer = 0; + std::string fname; + ::apache::thrift::protocol::TType ftype; + int16_t fid; + + xfer += iprot->readStructBegin(fname); + + using ::apache::thrift::protocol::TProtocolException; + + + while (true) + { + xfer += iprot->readFieldBegin(fname, ftype, fid); + if (ftype == ::apache::thrift::protocol::T_STOP) { + break; + } + xfer += iprot->skip(ftype); + xfer += iprot->readFieldEnd(); + } + + xfer += iprot->readStructEnd(); + + return xfer; +} + +uint32_t BsnesDebugger_resume_result::write(::apache::thrift::protocol::TProtocol* oprot) const { + + uint32_t xfer = 0; + + xfer += oprot->writeStructBegin("BsnesDebugger_resume_result"); + + xfer += oprot->writeFieldStop(); + xfer += oprot->writeStructEnd(); + return xfer; +} + + +BsnesDebugger_resume_presult::~BsnesDebugger_resume_presult() noexcept { +} + + +uint32_t BsnesDebugger_resume_presult::read(::apache::thrift::protocol::TProtocol* iprot) { + + ::apache::thrift::protocol::TInputRecursionTracker tracker(*iprot); + uint32_t xfer = 0; + std::string fname; + ::apache::thrift::protocol::TType ftype; + int16_t fid; + + xfer += iprot->readStructBegin(fname); + + using ::apache::thrift::protocol::TProtocolException; + + + while (true) + { + xfer += iprot->readFieldBegin(fname, ftype, fid); + if (ftype == ::apache::thrift::protocol::T_STOP) { + break; + } + xfer += iprot->skip(ftype); + xfer += iprot->readFieldEnd(); + } + + xfer += iprot->readStructEnd(); + + return xfer; +} + + +BsnesDebugger_start_emulation_args::~BsnesDebugger_start_emulation_args() noexcept { +} + + +uint32_t BsnesDebugger_start_emulation_args::read(::apache::thrift::protocol::TProtocol* iprot) { + + ::apache::thrift::protocol::TInputRecursionTracker tracker(*iprot); + uint32_t xfer = 0; + std::string fname; + ::apache::thrift::protocol::TType ftype; + int16_t fid; + + xfer += iprot->readStructBegin(fname); + + using ::apache::thrift::protocol::TProtocolException; + + + while (true) + { + xfer += iprot->readFieldBegin(fname, ftype, fid); + if (ftype == ::apache::thrift::protocol::T_STOP) { + break; + } + xfer += iprot->skip(ftype); + xfer += iprot->readFieldEnd(); + } + + xfer += iprot->readStructEnd(); + + return xfer; +} + +uint32_t BsnesDebugger_start_emulation_args::write(::apache::thrift::protocol::TProtocol* oprot) const { + uint32_t xfer = 0; + ::apache::thrift::protocol::TOutputRecursionTracker tracker(*oprot); + xfer += oprot->writeStructBegin("BsnesDebugger_start_emulation_args"); + + xfer += oprot->writeFieldStop(); + xfer += oprot->writeStructEnd(); + return xfer; +} + + +BsnesDebugger_start_emulation_pargs::~BsnesDebugger_start_emulation_pargs() noexcept { +} + + +uint32_t BsnesDebugger_start_emulation_pargs::write(::apache::thrift::protocol::TProtocol* oprot) const { + uint32_t xfer = 0; + ::apache::thrift::protocol::TOutputRecursionTracker tracker(*oprot); + xfer += oprot->writeStructBegin("BsnesDebugger_start_emulation_pargs"); + + xfer += oprot->writeFieldStop(); + xfer += oprot->writeStructEnd(); + return xfer; +} + + +BsnesDebugger_start_emulation_result::~BsnesDebugger_start_emulation_result() noexcept { +} + + +uint32_t BsnesDebugger_start_emulation_result::read(::apache::thrift::protocol::TProtocol* iprot) { + + ::apache::thrift::protocol::TInputRecursionTracker tracker(*iprot); + uint32_t xfer = 0; + std::string fname; + ::apache::thrift::protocol::TType ftype; + int16_t fid; + + xfer += iprot->readStructBegin(fname); + + using ::apache::thrift::protocol::TProtocolException; + + + while (true) + { + xfer += iprot->readFieldBegin(fname, ftype, fid); + if (ftype == ::apache::thrift::protocol::T_STOP) { + break; + } + xfer += iprot->skip(ftype); + xfer += iprot->readFieldEnd(); + } + + xfer += iprot->readStructEnd(); + + return xfer; +} + +uint32_t BsnesDebugger_start_emulation_result::write(::apache::thrift::protocol::TProtocol* oprot) const { + + uint32_t xfer = 0; + + xfer += oprot->writeStructBegin("BsnesDebugger_start_emulation_result"); + + xfer += oprot->writeFieldStop(); + xfer += oprot->writeStructEnd(); + return xfer; +} + + +BsnesDebugger_start_emulation_presult::~BsnesDebugger_start_emulation_presult() noexcept { +} + + +uint32_t BsnesDebugger_start_emulation_presult::read(::apache::thrift::protocol::TProtocol* iprot) { + + ::apache::thrift::protocol::TInputRecursionTracker tracker(*iprot); + uint32_t xfer = 0; + std::string fname; + ::apache::thrift::protocol::TType ftype; + int16_t fid; + + xfer += iprot->readStructBegin(fname); + + using ::apache::thrift::protocol::TProtocolException; + + + while (true) + { + xfer += iprot->readFieldBegin(fname, ftype, fid); + if (ftype == ::apache::thrift::protocol::T_STOP) { + break; + } + xfer += iprot->skip(ftype); + xfer += iprot->readFieldEnd(); + } + + xfer += iprot->readStructEnd(); + + return xfer; +} + + +BsnesDebugger_exit_emulation_args::~BsnesDebugger_exit_emulation_args() noexcept { +} + + +uint32_t BsnesDebugger_exit_emulation_args::read(::apache::thrift::protocol::TProtocol* iprot) { + + ::apache::thrift::protocol::TInputRecursionTracker tracker(*iprot); + uint32_t xfer = 0; + std::string fname; + ::apache::thrift::protocol::TType ftype; + int16_t fid; + + xfer += iprot->readStructBegin(fname); + + using ::apache::thrift::protocol::TProtocolException; + + + while (true) + { + xfer += iprot->readFieldBegin(fname, ftype, fid); + if (ftype == ::apache::thrift::protocol::T_STOP) { + break; + } + xfer += iprot->skip(ftype); + xfer += iprot->readFieldEnd(); + } + + xfer += iprot->readStructEnd(); + + return xfer; +} + +uint32_t BsnesDebugger_exit_emulation_args::write(::apache::thrift::protocol::TProtocol* oprot) const { + uint32_t xfer = 0; + ::apache::thrift::protocol::TOutputRecursionTracker tracker(*oprot); + xfer += oprot->writeStructBegin("BsnesDebugger_exit_emulation_args"); + + xfer += oprot->writeFieldStop(); + xfer += oprot->writeStructEnd(); + return xfer; +} + + +BsnesDebugger_exit_emulation_pargs::~BsnesDebugger_exit_emulation_pargs() noexcept { +} + + +uint32_t BsnesDebugger_exit_emulation_pargs::write(::apache::thrift::protocol::TProtocol* oprot) const { + uint32_t xfer = 0; + ::apache::thrift::protocol::TOutputRecursionTracker tracker(*oprot); + xfer += oprot->writeStructBegin("BsnesDebugger_exit_emulation_pargs"); + + xfer += oprot->writeFieldStop(); + xfer += oprot->writeStructEnd(); + return xfer; +} + + +BsnesDebugger_exit_emulation_result::~BsnesDebugger_exit_emulation_result() noexcept { +} + + +uint32_t BsnesDebugger_exit_emulation_result::read(::apache::thrift::protocol::TProtocol* iprot) { + + ::apache::thrift::protocol::TInputRecursionTracker tracker(*iprot); + uint32_t xfer = 0; + std::string fname; + ::apache::thrift::protocol::TType ftype; + int16_t fid; + + xfer += iprot->readStructBegin(fname); + + using ::apache::thrift::protocol::TProtocolException; + + + while (true) + { + xfer += iprot->readFieldBegin(fname, ftype, fid); + if (ftype == ::apache::thrift::protocol::T_STOP) { + break; + } + xfer += iprot->skip(ftype); + xfer += iprot->readFieldEnd(); + } + + xfer += iprot->readStructEnd(); + + return xfer; +} + +uint32_t BsnesDebugger_exit_emulation_result::write(::apache::thrift::protocol::TProtocol* oprot) const { + + uint32_t xfer = 0; + + xfer += oprot->writeStructBegin("BsnesDebugger_exit_emulation_result"); + + xfer += oprot->writeFieldStop(); + xfer += oprot->writeStructEnd(); + return xfer; +} + + +BsnesDebugger_exit_emulation_presult::~BsnesDebugger_exit_emulation_presult() noexcept { +} + + +uint32_t BsnesDebugger_exit_emulation_presult::read(::apache::thrift::protocol::TProtocol* iprot) { + + ::apache::thrift::protocol::TInputRecursionTracker tracker(*iprot); + uint32_t xfer = 0; + std::string fname; + ::apache::thrift::protocol::TType ftype; + int16_t fid; + + xfer += iprot->readStructBegin(fname); + + using ::apache::thrift::protocol::TProtocolException; + + + while (true) + { + xfer += iprot->readFieldBegin(fname, ftype, fid); + if (ftype == ::apache::thrift::protocol::T_STOP) { + break; + } + xfer += iprot->skip(ftype); + xfer += iprot->readFieldEnd(); + } + + xfer += iprot->readStructEnd(); + + return xfer; +} + + +BsnesDebugger_step_into_args::~BsnesDebugger_step_into_args() noexcept { +} + + +uint32_t BsnesDebugger_step_into_args::read(::apache::thrift::protocol::TProtocol* iprot) { + + ::apache::thrift::protocol::TInputRecursionTracker tracker(*iprot); + uint32_t xfer = 0; + std::string fname; + ::apache::thrift::protocol::TType ftype; + int16_t fid; + + xfer += iprot->readStructBegin(fname); + + using ::apache::thrift::protocol::TProtocolException; + + + while (true) + { + xfer += iprot->readFieldBegin(fname, ftype, fid); + if (ftype == ::apache::thrift::protocol::T_STOP) { + break; + } + xfer += iprot->skip(ftype); + xfer += iprot->readFieldEnd(); + } + + xfer += iprot->readStructEnd(); + + return xfer; +} + +uint32_t BsnesDebugger_step_into_args::write(::apache::thrift::protocol::TProtocol* oprot) const { + uint32_t xfer = 0; + ::apache::thrift::protocol::TOutputRecursionTracker tracker(*oprot); + xfer += oprot->writeStructBegin("BsnesDebugger_step_into_args"); + + xfer += oprot->writeFieldStop(); + xfer += oprot->writeStructEnd(); + return xfer; +} + + +BsnesDebugger_step_into_pargs::~BsnesDebugger_step_into_pargs() noexcept { +} + + +uint32_t BsnesDebugger_step_into_pargs::write(::apache::thrift::protocol::TProtocol* oprot) const { + uint32_t xfer = 0; + ::apache::thrift::protocol::TOutputRecursionTracker tracker(*oprot); + xfer += oprot->writeStructBegin("BsnesDebugger_step_into_pargs"); + + xfer += oprot->writeFieldStop(); + xfer += oprot->writeStructEnd(); + return xfer; +} + + +BsnesDebugger_step_into_result::~BsnesDebugger_step_into_result() noexcept { +} + + +uint32_t BsnesDebugger_step_into_result::read(::apache::thrift::protocol::TProtocol* iprot) { + + ::apache::thrift::protocol::TInputRecursionTracker tracker(*iprot); + uint32_t xfer = 0; + std::string fname; + ::apache::thrift::protocol::TType ftype; + int16_t fid; + + xfer += iprot->readStructBegin(fname); + + using ::apache::thrift::protocol::TProtocolException; + + + while (true) + { + xfer += iprot->readFieldBegin(fname, ftype, fid); + if (ftype == ::apache::thrift::protocol::T_STOP) { + break; + } + xfer += iprot->skip(ftype); + xfer += iprot->readFieldEnd(); + } + + xfer += iprot->readStructEnd(); + + return xfer; +} + +uint32_t BsnesDebugger_step_into_result::write(::apache::thrift::protocol::TProtocol* oprot) const { + + uint32_t xfer = 0; + + xfer += oprot->writeStructBegin("BsnesDebugger_step_into_result"); + + xfer += oprot->writeFieldStop(); + xfer += oprot->writeStructEnd(); + return xfer; +} + + +BsnesDebugger_step_into_presult::~BsnesDebugger_step_into_presult() noexcept { +} + + +uint32_t BsnesDebugger_step_into_presult::read(::apache::thrift::protocol::TProtocol* iprot) { + + ::apache::thrift::protocol::TInputRecursionTracker tracker(*iprot); + uint32_t xfer = 0; + std::string fname; + ::apache::thrift::protocol::TType ftype; + int16_t fid; + + xfer += iprot->readStructBegin(fname); + + using ::apache::thrift::protocol::TProtocolException; + + + while (true) + { + xfer += iprot->readFieldBegin(fname, ftype, fid); + if (ftype == ::apache::thrift::protocol::T_STOP) { + break; + } + xfer += iprot->skip(ftype); + xfer += iprot->readFieldEnd(); + } + + xfer += iprot->readStructEnd(); + + return xfer; +} + + +BsnesDebugger_step_over_args::~BsnesDebugger_step_over_args() noexcept { +} + + +uint32_t BsnesDebugger_step_over_args::read(::apache::thrift::protocol::TProtocol* iprot) { + + ::apache::thrift::protocol::TInputRecursionTracker tracker(*iprot); + uint32_t xfer = 0; + std::string fname; + ::apache::thrift::protocol::TType ftype; + int16_t fid; + + xfer += iprot->readStructBegin(fname); + + using ::apache::thrift::protocol::TProtocolException; + + + while (true) + { + xfer += iprot->readFieldBegin(fname, ftype, fid); + if (ftype == ::apache::thrift::protocol::T_STOP) { + break; + } + xfer += iprot->skip(ftype); + xfer += iprot->readFieldEnd(); + } + + xfer += iprot->readStructEnd(); + + return xfer; +} + +uint32_t BsnesDebugger_step_over_args::write(::apache::thrift::protocol::TProtocol* oprot) const { + uint32_t xfer = 0; + ::apache::thrift::protocol::TOutputRecursionTracker tracker(*oprot); + xfer += oprot->writeStructBegin("BsnesDebugger_step_over_args"); + + xfer += oprot->writeFieldStop(); + xfer += oprot->writeStructEnd(); + return xfer; +} + + +BsnesDebugger_step_over_pargs::~BsnesDebugger_step_over_pargs() noexcept { +} + + +uint32_t BsnesDebugger_step_over_pargs::write(::apache::thrift::protocol::TProtocol* oprot) const { + uint32_t xfer = 0; + ::apache::thrift::protocol::TOutputRecursionTracker tracker(*oprot); + xfer += oprot->writeStructBegin("BsnesDebugger_step_over_pargs"); + + xfer += oprot->writeFieldStop(); + xfer += oprot->writeStructEnd(); + return xfer; +} + + +BsnesDebugger_step_over_result::~BsnesDebugger_step_over_result() noexcept { +} + + +uint32_t BsnesDebugger_step_over_result::read(::apache::thrift::protocol::TProtocol* iprot) { + + ::apache::thrift::protocol::TInputRecursionTracker tracker(*iprot); + uint32_t xfer = 0; + std::string fname; + ::apache::thrift::protocol::TType ftype; + int16_t fid; + + xfer += iprot->readStructBegin(fname); + + using ::apache::thrift::protocol::TProtocolException; + + + while (true) + { + xfer += iprot->readFieldBegin(fname, ftype, fid); + if (ftype == ::apache::thrift::protocol::T_STOP) { + break; + } + xfer += iprot->skip(ftype); + xfer += iprot->readFieldEnd(); + } + + xfer += iprot->readStructEnd(); + + return xfer; +} + +uint32_t BsnesDebugger_step_over_result::write(::apache::thrift::protocol::TProtocol* oprot) const { + + uint32_t xfer = 0; + + xfer += oprot->writeStructBegin("BsnesDebugger_step_over_result"); + + xfer += oprot->writeFieldStop(); + xfer += oprot->writeStructEnd(); + return xfer; +} + + +BsnesDebugger_step_over_presult::~BsnesDebugger_step_over_presult() noexcept { +} + + +uint32_t BsnesDebugger_step_over_presult::read(::apache::thrift::protocol::TProtocol* iprot) { + + ::apache::thrift::protocol::TInputRecursionTracker tracker(*iprot); + uint32_t xfer = 0; + std::string fname; + ::apache::thrift::protocol::TType ftype; + int16_t fid; + + xfer += iprot->readStructBegin(fname); + + using ::apache::thrift::protocol::TProtocolException; + + + while (true) + { + xfer += iprot->readFieldBegin(fname, ftype, fid); + if (ftype == ::apache::thrift::protocol::T_STOP) { + break; + } + xfer += iprot->skip(ftype); + xfer += iprot->readFieldEnd(); + } + + xfer += iprot->readStructEnd(); + + return xfer; +} + +int32_t BsnesDebuggerClient::get_cpu_reg(const BsnesRegister::type reg) +{ + send_get_cpu_reg(reg); + return recv_get_cpu_reg(); +} + +void BsnesDebuggerClient::send_get_cpu_reg(const BsnesRegister::type reg) +{ + int32_t cseqid = 0; + oprot_->writeMessageBegin("get_cpu_reg", ::apache::thrift::protocol::T_CALL, cseqid); + + BsnesDebugger_get_cpu_reg_pargs args; + args.reg = ® + args.write(oprot_); + + oprot_->writeMessageEnd(); + oprot_->getTransport()->writeEnd(); + oprot_->getTransport()->flush(); +} + +int32_t BsnesDebuggerClient::recv_get_cpu_reg() +{ + + int32_t rseqid = 0; + std::string fname; + ::apache::thrift::protocol::TMessageType mtype; + + iprot_->readMessageBegin(fname, mtype, rseqid); + if (mtype == ::apache::thrift::protocol::T_EXCEPTION) { + ::apache::thrift::TApplicationException x; + x.read(iprot_); + iprot_->readMessageEnd(); + iprot_->getTransport()->readEnd(); + throw x; + } + if (mtype != ::apache::thrift::protocol::T_REPLY) { + iprot_->skip(::apache::thrift::protocol::T_STRUCT); + iprot_->readMessageEnd(); + iprot_->getTransport()->readEnd(); + } + if (fname.compare("get_cpu_reg") != 0) { + iprot_->skip(::apache::thrift::protocol::T_STRUCT); + iprot_->readMessageEnd(); + iprot_->getTransport()->readEnd(); + } + int32_t _return; + BsnesDebugger_get_cpu_reg_presult result; + result.success = &_return; + result.read(iprot_); + iprot_->readMessageEnd(); + iprot_->getTransport()->readEnd(); + + if (result.__isset.success) { + return _return; + } + throw ::apache::thrift::TApplicationException(::apache::thrift::TApplicationException::MISSING_RESULT, "get_cpu_reg failed: unknown result"); +} + +void BsnesDebuggerClient::get_cpu_regs(BsnesRegisters& _return) +{ + send_get_cpu_regs(); + recv_get_cpu_regs(_return); +} + +void BsnesDebuggerClient::send_get_cpu_regs() +{ + int32_t cseqid = 0; + oprot_->writeMessageBegin("get_cpu_regs", ::apache::thrift::protocol::T_CALL, cseqid); + + BsnesDebugger_get_cpu_regs_pargs args; + args.write(oprot_); + + oprot_->writeMessageEnd(); + oprot_->getTransport()->writeEnd(); + oprot_->getTransport()->flush(); +} + +void BsnesDebuggerClient::recv_get_cpu_regs(BsnesRegisters& _return) +{ + + int32_t rseqid = 0; + std::string fname; + ::apache::thrift::protocol::TMessageType mtype; + + iprot_->readMessageBegin(fname, mtype, rseqid); + if (mtype == ::apache::thrift::protocol::T_EXCEPTION) { + ::apache::thrift::TApplicationException x; + x.read(iprot_); + iprot_->readMessageEnd(); + iprot_->getTransport()->readEnd(); + throw x; + } + if (mtype != ::apache::thrift::protocol::T_REPLY) { + iprot_->skip(::apache::thrift::protocol::T_STRUCT); + iprot_->readMessageEnd(); + iprot_->getTransport()->readEnd(); + } + if (fname.compare("get_cpu_regs") != 0) { + iprot_->skip(::apache::thrift::protocol::T_STRUCT); + iprot_->readMessageEnd(); + iprot_->getTransport()->readEnd(); + } + BsnesDebugger_get_cpu_regs_presult result; + result.success = &_return; + result.read(iprot_); + iprot_->readMessageEnd(); + iprot_->getTransport()->readEnd(); + + if (result.__isset.success) { + // _return pointer has now been filled + return; + } + throw ::apache::thrift::TApplicationException(::apache::thrift::TApplicationException::MISSING_RESULT, "get_cpu_regs failed: unknown result"); +} + +void BsnesDebuggerClient::set_cpu_reg(const BsnesRegister::type reg, const int32_t value) +{ + send_set_cpu_reg(reg, value); + recv_set_cpu_reg(); +} + +void BsnesDebuggerClient::send_set_cpu_reg(const BsnesRegister::type reg, const int32_t value) +{ + int32_t cseqid = 0; + oprot_->writeMessageBegin("set_cpu_reg", ::apache::thrift::protocol::T_CALL, cseqid); + + BsnesDebugger_set_cpu_reg_pargs args; + args.reg = ® + args.value = &value; + args.write(oprot_); + + oprot_->writeMessageEnd(); + oprot_->getTransport()->writeEnd(); + oprot_->getTransport()->flush(); +} + +void BsnesDebuggerClient::recv_set_cpu_reg() +{ + + int32_t rseqid = 0; + std::string fname; + ::apache::thrift::protocol::TMessageType mtype; + + iprot_->readMessageBegin(fname, mtype, rseqid); + if (mtype == ::apache::thrift::protocol::T_EXCEPTION) { + ::apache::thrift::TApplicationException x; + x.read(iprot_); + iprot_->readMessageEnd(); + iprot_->getTransport()->readEnd(); + throw x; + } + if (mtype != ::apache::thrift::protocol::T_REPLY) { + iprot_->skip(::apache::thrift::protocol::T_STRUCT); + iprot_->readMessageEnd(); + iprot_->getTransport()->readEnd(); + } + if (fname.compare("set_cpu_reg") != 0) { + iprot_->skip(::apache::thrift::protocol::T_STRUCT); + iprot_->readMessageEnd(); + iprot_->getTransport()->readEnd(); + } + BsnesDebugger_set_cpu_reg_presult result; + result.read(iprot_); + iprot_->readMessageEnd(); + iprot_->getTransport()->readEnd(); + + return; +} + +void BsnesDebuggerClient::read_memory(std::string& _return, const DbgMemorySource::type src, const int32_t address, const int32_t size) +{ + send_read_memory(src, address, size); + recv_read_memory(_return); +} + +void BsnesDebuggerClient::send_read_memory(const DbgMemorySource::type src, const int32_t address, const int32_t size) +{ + int32_t cseqid = 0; + oprot_->writeMessageBegin("read_memory", ::apache::thrift::protocol::T_CALL, cseqid); + + BsnesDebugger_read_memory_pargs args; + args.src = &src; + args.address = &address; + args.size = &size; + args.write(oprot_); + + oprot_->writeMessageEnd(); + oprot_->getTransport()->writeEnd(); + oprot_->getTransport()->flush(); +} + +void BsnesDebuggerClient::recv_read_memory(std::string& _return) +{ + + int32_t rseqid = 0; + std::string fname; + ::apache::thrift::protocol::TMessageType mtype; + + iprot_->readMessageBegin(fname, mtype, rseqid); + if (mtype == ::apache::thrift::protocol::T_EXCEPTION) { + ::apache::thrift::TApplicationException x; + x.read(iprot_); + iprot_->readMessageEnd(); + iprot_->getTransport()->readEnd(); + throw x; + } + if (mtype != ::apache::thrift::protocol::T_REPLY) { + iprot_->skip(::apache::thrift::protocol::T_STRUCT); + iprot_->readMessageEnd(); + iprot_->getTransport()->readEnd(); + } + if (fname.compare("read_memory") != 0) { + iprot_->skip(::apache::thrift::protocol::T_STRUCT); + iprot_->readMessageEnd(); + iprot_->getTransport()->readEnd(); + } + BsnesDebugger_read_memory_presult result; + result.success = &_return; + result.read(iprot_); + iprot_->readMessageEnd(); + iprot_->getTransport()->readEnd(); + + if (result.__isset.success) { + // _return pointer has now been filled + return; + } + throw ::apache::thrift::TApplicationException(::apache::thrift::TApplicationException::MISSING_RESULT, "read_memory failed: unknown result"); +} + +void BsnesDebuggerClient::write_memory(const DbgMemorySource::type src, const int32_t address, const std::string& data) +{ + send_write_memory(src, address, data); + recv_write_memory(); +} + +void BsnesDebuggerClient::send_write_memory(const DbgMemorySource::type src, const int32_t address, const std::string& data) +{ + int32_t cseqid = 0; + oprot_->writeMessageBegin("write_memory", ::apache::thrift::protocol::T_CALL, cseqid); + + BsnesDebugger_write_memory_pargs args; + args.src = &src; + args.address = &address; + args.data = &data; + args.write(oprot_); + + oprot_->writeMessageEnd(); + oprot_->getTransport()->writeEnd(); + oprot_->getTransport()->flush(); +} + +void BsnesDebuggerClient::recv_write_memory() +{ + + int32_t rseqid = 0; + std::string fname; + ::apache::thrift::protocol::TMessageType mtype; + + iprot_->readMessageBegin(fname, mtype, rseqid); + if (mtype == ::apache::thrift::protocol::T_EXCEPTION) { + ::apache::thrift::TApplicationException x; + x.read(iprot_); + iprot_->readMessageEnd(); + iprot_->getTransport()->readEnd(); + throw x; + } + if (mtype != ::apache::thrift::protocol::T_REPLY) { + iprot_->skip(::apache::thrift::protocol::T_STRUCT); + iprot_->readMessageEnd(); + iprot_->getTransport()->readEnd(); + } + if (fname.compare("write_memory") != 0) { + iprot_->skip(::apache::thrift::protocol::T_STRUCT); + iprot_->readMessageEnd(); + iprot_->getTransport()->readEnd(); + } + BsnesDebugger_write_memory_presult result; + result.read(iprot_); + iprot_->readMessageEnd(); + iprot_->getTransport()->readEnd(); + + return; +} + +void BsnesDebuggerClient::add_breakpoint(const DbgBreakpoint& bpt) +{ + send_add_breakpoint(bpt); + recv_add_breakpoint(); +} + +void BsnesDebuggerClient::send_add_breakpoint(const DbgBreakpoint& bpt) +{ + int32_t cseqid = 0; + oprot_->writeMessageBegin("add_breakpoint", ::apache::thrift::protocol::T_CALL, cseqid); + + BsnesDebugger_add_breakpoint_pargs args; + args.bpt = &bpt; + args.write(oprot_); + + oprot_->writeMessageEnd(); + oprot_->getTransport()->writeEnd(); + oprot_->getTransport()->flush(); +} + +void BsnesDebuggerClient::recv_add_breakpoint() +{ + + int32_t rseqid = 0; + std::string fname; + ::apache::thrift::protocol::TMessageType mtype; + + iprot_->readMessageBegin(fname, mtype, rseqid); + if (mtype == ::apache::thrift::protocol::T_EXCEPTION) { + ::apache::thrift::TApplicationException x; + x.read(iprot_); + iprot_->readMessageEnd(); + iprot_->getTransport()->readEnd(); + throw x; + } + if (mtype != ::apache::thrift::protocol::T_REPLY) { + iprot_->skip(::apache::thrift::protocol::T_STRUCT); + iprot_->readMessageEnd(); + iprot_->getTransport()->readEnd(); + } + if (fname.compare("add_breakpoint") != 0) { + iprot_->skip(::apache::thrift::protocol::T_STRUCT); + iprot_->readMessageEnd(); + iprot_->getTransport()->readEnd(); + } + BsnesDebugger_add_breakpoint_presult result; + result.read(iprot_); + iprot_->readMessageEnd(); + iprot_->getTransport()->readEnd(); + + return; +} + +void BsnesDebuggerClient::del_breakpoint(const DbgBreakpoint& bpt) +{ + send_del_breakpoint(bpt); + recv_del_breakpoint(); +} + +void BsnesDebuggerClient::send_del_breakpoint(const DbgBreakpoint& bpt) +{ + int32_t cseqid = 0; + oprot_->writeMessageBegin("del_breakpoint", ::apache::thrift::protocol::T_CALL, cseqid); + + BsnesDebugger_del_breakpoint_pargs args; + args.bpt = &bpt; + args.write(oprot_); + + oprot_->writeMessageEnd(); + oprot_->getTransport()->writeEnd(); + oprot_->getTransport()->flush(); +} + +void BsnesDebuggerClient::recv_del_breakpoint() +{ + + int32_t rseqid = 0; + std::string fname; + ::apache::thrift::protocol::TMessageType mtype; + + iprot_->readMessageBegin(fname, mtype, rseqid); + if (mtype == ::apache::thrift::protocol::T_EXCEPTION) { + ::apache::thrift::TApplicationException x; + x.read(iprot_); + iprot_->readMessageEnd(); + iprot_->getTransport()->readEnd(); + throw x; + } + if (mtype != ::apache::thrift::protocol::T_REPLY) { + iprot_->skip(::apache::thrift::protocol::T_STRUCT); + iprot_->readMessageEnd(); + iprot_->getTransport()->readEnd(); + } + if (fname.compare("del_breakpoint") != 0) { + iprot_->skip(::apache::thrift::protocol::T_STRUCT); + iprot_->readMessageEnd(); + iprot_->getTransport()->readEnd(); + } + BsnesDebugger_del_breakpoint_presult result; + result.read(iprot_); + iprot_->readMessageEnd(); + iprot_->getTransport()->readEnd(); + + return; +} + +void BsnesDebuggerClient::pause() +{ + send_pause(); + recv_pause(); +} + +void BsnesDebuggerClient::send_pause() +{ + int32_t cseqid = 0; + oprot_->writeMessageBegin("pause", ::apache::thrift::protocol::T_CALL, cseqid); + + BsnesDebugger_pause_pargs args; + args.write(oprot_); + + oprot_->writeMessageEnd(); + oprot_->getTransport()->writeEnd(); + oprot_->getTransport()->flush(); +} + +void BsnesDebuggerClient::recv_pause() +{ + + int32_t rseqid = 0; + std::string fname; + ::apache::thrift::protocol::TMessageType mtype; + + iprot_->readMessageBegin(fname, mtype, rseqid); + if (mtype == ::apache::thrift::protocol::T_EXCEPTION) { + ::apache::thrift::TApplicationException x; + x.read(iprot_); + iprot_->readMessageEnd(); + iprot_->getTransport()->readEnd(); + throw x; + } + if (mtype != ::apache::thrift::protocol::T_REPLY) { + iprot_->skip(::apache::thrift::protocol::T_STRUCT); + iprot_->readMessageEnd(); + iprot_->getTransport()->readEnd(); + } + if (fname.compare("pause") != 0) { + iprot_->skip(::apache::thrift::protocol::T_STRUCT); + iprot_->readMessageEnd(); + iprot_->getTransport()->readEnd(); + } + BsnesDebugger_pause_presult result; + result.read(iprot_); + iprot_->readMessageEnd(); + iprot_->getTransport()->readEnd(); + + return; +} + +void BsnesDebuggerClient::resume() +{ + send_resume(); + recv_resume(); +} + +void BsnesDebuggerClient::send_resume() +{ + int32_t cseqid = 0; + oprot_->writeMessageBegin("resume", ::apache::thrift::protocol::T_CALL, cseqid); + + BsnesDebugger_resume_pargs args; + args.write(oprot_); + + oprot_->writeMessageEnd(); + oprot_->getTransport()->writeEnd(); + oprot_->getTransport()->flush(); +} + +void BsnesDebuggerClient::recv_resume() +{ + + int32_t rseqid = 0; + std::string fname; + ::apache::thrift::protocol::TMessageType mtype; + + iprot_->readMessageBegin(fname, mtype, rseqid); + if (mtype == ::apache::thrift::protocol::T_EXCEPTION) { + ::apache::thrift::TApplicationException x; + x.read(iprot_); + iprot_->readMessageEnd(); + iprot_->getTransport()->readEnd(); + throw x; + } + if (mtype != ::apache::thrift::protocol::T_REPLY) { + iprot_->skip(::apache::thrift::protocol::T_STRUCT); + iprot_->readMessageEnd(); + iprot_->getTransport()->readEnd(); + } + if (fname.compare("resume") != 0) { + iprot_->skip(::apache::thrift::protocol::T_STRUCT); + iprot_->readMessageEnd(); + iprot_->getTransport()->readEnd(); + } + BsnesDebugger_resume_presult result; + result.read(iprot_); + iprot_->readMessageEnd(); + iprot_->getTransport()->readEnd(); + + return; +} + +void BsnesDebuggerClient::start_emulation() +{ + send_start_emulation(); + recv_start_emulation(); +} + +void BsnesDebuggerClient::send_start_emulation() +{ + int32_t cseqid = 0; + oprot_->writeMessageBegin("start_emulation", ::apache::thrift::protocol::T_CALL, cseqid); + + BsnesDebugger_start_emulation_pargs args; + args.write(oprot_); + + oprot_->writeMessageEnd(); + oprot_->getTransport()->writeEnd(); + oprot_->getTransport()->flush(); +} + +void BsnesDebuggerClient::recv_start_emulation() +{ + + int32_t rseqid = 0; + std::string fname; + ::apache::thrift::protocol::TMessageType mtype; + + iprot_->readMessageBegin(fname, mtype, rseqid); + if (mtype == ::apache::thrift::protocol::T_EXCEPTION) { + ::apache::thrift::TApplicationException x; + x.read(iprot_); + iprot_->readMessageEnd(); + iprot_->getTransport()->readEnd(); + throw x; + } + if (mtype != ::apache::thrift::protocol::T_REPLY) { + iprot_->skip(::apache::thrift::protocol::T_STRUCT); + iprot_->readMessageEnd(); + iprot_->getTransport()->readEnd(); + } + if (fname.compare("start_emulation") != 0) { + iprot_->skip(::apache::thrift::protocol::T_STRUCT); + iprot_->readMessageEnd(); + iprot_->getTransport()->readEnd(); + } + BsnesDebugger_start_emulation_presult result; + result.read(iprot_); + iprot_->readMessageEnd(); + iprot_->getTransport()->readEnd(); + + return; +} + +void BsnesDebuggerClient::exit_emulation() +{ + send_exit_emulation(); + recv_exit_emulation(); +} + +void BsnesDebuggerClient::send_exit_emulation() +{ + int32_t cseqid = 0; + oprot_->writeMessageBegin("exit_emulation", ::apache::thrift::protocol::T_CALL, cseqid); + + BsnesDebugger_exit_emulation_pargs args; + args.write(oprot_); + + oprot_->writeMessageEnd(); + oprot_->getTransport()->writeEnd(); + oprot_->getTransport()->flush(); +} + +void BsnesDebuggerClient::recv_exit_emulation() +{ + + int32_t rseqid = 0; + std::string fname; + ::apache::thrift::protocol::TMessageType mtype; + + iprot_->readMessageBegin(fname, mtype, rseqid); + if (mtype == ::apache::thrift::protocol::T_EXCEPTION) { + ::apache::thrift::TApplicationException x; + x.read(iprot_); + iprot_->readMessageEnd(); + iprot_->getTransport()->readEnd(); + throw x; + } + if (mtype != ::apache::thrift::protocol::T_REPLY) { + iprot_->skip(::apache::thrift::protocol::T_STRUCT); + iprot_->readMessageEnd(); + iprot_->getTransport()->readEnd(); + } + if (fname.compare("exit_emulation") != 0) { + iprot_->skip(::apache::thrift::protocol::T_STRUCT); + iprot_->readMessageEnd(); + iprot_->getTransport()->readEnd(); + } + BsnesDebugger_exit_emulation_presult result; + result.read(iprot_); + iprot_->readMessageEnd(); + iprot_->getTransport()->readEnd(); + + return; +} + +void BsnesDebuggerClient::step_into() +{ + send_step_into(); + recv_step_into(); +} + +void BsnesDebuggerClient::send_step_into() +{ + int32_t cseqid = 0; + oprot_->writeMessageBegin("step_into", ::apache::thrift::protocol::T_CALL, cseqid); + + BsnesDebugger_step_into_pargs args; + args.write(oprot_); + + oprot_->writeMessageEnd(); + oprot_->getTransport()->writeEnd(); + oprot_->getTransport()->flush(); +} + +void BsnesDebuggerClient::recv_step_into() +{ + + int32_t rseqid = 0; + std::string fname; + ::apache::thrift::protocol::TMessageType mtype; + + iprot_->readMessageBegin(fname, mtype, rseqid); + if (mtype == ::apache::thrift::protocol::T_EXCEPTION) { + ::apache::thrift::TApplicationException x; + x.read(iprot_); + iprot_->readMessageEnd(); + iprot_->getTransport()->readEnd(); + throw x; + } + if (mtype != ::apache::thrift::protocol::T_REPLY) { + iprot_->skip(::apache::thrift::protocol::T_STRUCT); + iprot_->readMessageEnd(); + iprot_->getTransport()->readEnd(); + } + if (fname.compare("step_into") != 0) { + iprot_->skip(::apache::thrift::protocol::T_STRUCT); + iprot_->readMessageEnd(); + iprot_->getTransport()->readEnd(); + } + BsnesDebugger_step_into_presult result; + result.read(iprot_); + iprot_->readMessageEnd(); + iprot_->getTransport()->readEnd(); + + return; +} + +void BsnesDebuggerClient::step_over() +{ + send_step_over(); + recv_step_over(); +} + +void BsnesDebuggerClient::send_step_over() +{ + int32_t cseqid = 0; + oprot_->writeMessageBegin("step_over", ::apache::thrift::protocol::T_CALL, cseqid); + + BsnesDebugger_step_over_pargs args; + args.write(oprot_); + + oprot_->writeMessageEnd(); + oprot_->getTransport()->writeEnd(); + oprot_->getTransport()->flush(); +} + +void BsnesDebuggerClient::recv_step_over() +{ + + int32_t rseqid = 0; + std::string fname; + ::apache::thrift::protocol::TMessageType mtype; + + iprot_->readMessageBegin(fname, mtype, rseqid); + if (mtype == ::apache::thrift::protocol::T_EXCEPTION) { + ::apache::thrift::TApplicationException x; + x.read(iprot_); + iprot_->readMessageEnd(); + iprot_->getTransport()->readEnd(); + throw x; + } + if (mtype != ::apache::thrift::protocol::T_REPLY) { + iprot_->skip(::apache::thrift::protocol::T_STRUCT); + iprot_->readMessageEnd(); + iprot_->getTransport()->readEnd(); + } + if (fname.compare("step_over") != 0) { + iprot_->skip(::apache::thrift::protocol::T_STRUCT); + iprot_->readMessageEnd(); + iprot_->getTransport()->readEnd(); + } + BsnesDebugger_step_over_presult result; + result.read(iprot_); + iprot_->readMessageEnd(); + iprot_->getTransport()->readEnd(); + + return; +} + +bool BsnesDebuggerProcessor::dispatchCall(::apache::thrift::protocol::TProtocol* iprot, ::apache::thrift::protocol::TProtocol* oprot, const std::string& fname, int32_t seqid, void* callContext) { + ProcessMap::iterator pfn; + pfn = processMap_.find(fname); + if (pfn == processMap_.end()) { + iprot->skip(::apache::thrift::protocol::T_STRUCT); + iprot->readMessageEnd(); + iprot->getTransport()->readEnd(); + ::apache::thrift::TApplicationException x(::apache::thrift::TApplicationException::UNKNOWN_METHOD, "Invalid method name: '"+fname+"'"); + oprot->writeMessageBegin(fname, ::apache::thrift::protocol::T_EXCEPTION, seqid); + x.write(oprot); + oprot->writeMessageEnd(); + oprot->getTransport()->writeEnd(); + oprot->getTransport()->flush(); + return true; + } + (this->*(pfn->second))(seqid, iprot, oprot, callContext); + return true; +} + +void BsnesDebuggerProcessor::process_get_cpu_reg(int32_t seqid, ::apache::thrift::protocol::TProtocol* iprot, ::apache::thrift::protocol::TProtocol* oprot, void* callContext) +{ + void* ctx = nullptr; + if (this->eventHandler_.get() != nullptr) { + ctx = this->eventHandler_->getContext("BsnesDebugger.get_cpu_reg", callContext); + } + ::apache::thrift::TProcessorContextFreer freer(this->eventHandler_.get(), ctx, "BsnesDebugger.get_cpu_reg"); + + if (this->eventHandler_.get() != nullptr) { + this->eventHandler_->preRead(ctx, "BsnesDebugger.get_cpu_reg"); + } + + BsnesDebugger_get_cpu_reg_args args; + args.read(iprot); + iprot->readMessageEnd(); + uint32_t bytes = iprot->getTransport()->readEnd(); + + if (this->eventHandler_.get() != nullptr) { + this->eventHandler_->postRead(ctx, "BsnesDebugger.get_cpu_reg", bytes); + } + + BsnesDebugger_get_cpu_reg_result result; + try { + result.success = iface_->get_cpu_reg(args.reg); + result.__isset.success = true; + } catch (const std::exception& e) { + if (this->eventHandler_.get() != nullptr) { + this->eventHandler_->handlerError(ctx, "BsnesDebugger.get_cpu_reg"); + } + + ::apache::thrift::TApplicationException x(e.what()); + oprot->writeMessageBegin("get_cpu_reg", ::apache::thrift::protocol::T_EXCEPTION, seqid); + x.write(oprot); + oprot->writeMessageEnd(); + oprot->getTransport()->writeEnd(); + oprot->getTransport()->flush(); + return; + } + + if (this->eventHandler_.get() != nullptr) { + this->eventHandler_->preWrite(ctx, "BsnesDebugger.get_cpu_reg"); + } + + oprot->writeMessageBegin("get_cpu_reg", ::apache::thrift::protocol::T_REPLY, seqid); + result.write(oprot); + oprot->writeMessageEnd(); + bytes = oprot->getTransport()->writeEnd(); + oprot->getTransport()->flush(); + + if (this->eventHandler_.get() != nullptr) { + this->eventHandler_->postWrite(ctx, "BsnesDebugger.get_cpu_reg", bytes); + } +} + +void BsnesDebuggerProcessor::process_get_cpu_regs(int32_t seqid, ::apache::thrift::protocol::TProtocol* iprot, ::apache::thrift::protocol::TProtocol* oprot, void* callContext) +{ + void* ctx = nullptr; + if (this->eventHandler_.get() != nullptr) { + ctx = this->eventHandler_->getContext("BsnesDebugger.get_cpu_regs", callContext); + } + ::apache::thrift::TProcessorContextFreer freer(this->eventHandler_.get(), ctx, "BsnesDebugger.get_cpu_regs"); + + if (this->eventHandler_.get() != nullptr) { + this->eventHandler_->preRead(ctx, "BsnesDebugger.get_cpu_regs"); + } + + BsnesDebugger_get_cpu_regs_args args; + args.read(iprot); + iprot->readMessageEnd(); + uint32_t bytes = iprot->getTransport()->readEnd(); + + if (this->eventHandler_.get() != nullptr) { + this->eventHandler_->postRead(ctx, "BsnesDebugger.get_cpu_regs", bytes); + } + + BsnesDebugger_get_cpu_regs_result result; + try { + iface_->get_cpu_regs(result.success); + result.__isset.success = true; + } catch (const std::exception& e) { + if (this->eventHandler_.get() != nullptr) { + this->eventHandler_->handlerError(ctx, "BsnesDebugger.get_cpu_regs"); + } + + ::apache::thrift::TApplicationException x(e.what()); + oprot->writeMessageBegin("get_cpu_regs", ::apache::thrift::protocol::T_EXCEPTION, seqid); + x.write(oprot); + oprot->writeMessageEnd(); + oprot->getTransport()->writeEnd(); + oprot->getTransport()->flush(); + return; + } + + if (this->eventHandler_.get() != nullptr) { + this->eventHandler_->preWrite(ctx, "BsnesDebugger.get_cpu_regs"); + } + + oprot->writeMessageBegin("get_cpu_regs", ::apache::thrift::protocol::T_REPLY, seqid); + result.write(oprot); + oprot->writeMessageEnd(); + bytes = oprot->getTransport()->writeEnd(); + oprot->getTransport()->flush(); + + if (this->eventHandler_.get() != nullptr) { + this->eventHandler_->postWrite(ctx, "BsnesDebugger.get_cpu_regs", bytes); + } +} + +void BsnesDebuggerProcessor::process_set_cpu_reg(int32_t seqid, ::apache::thrift::protocol::TProtocol* iprot, ::apache::thrift::protocol::TProtocol* oprot, void* callContext) +{ + void* ctx = nullptr; + if (this->eventHandler_.get() != nullptr) { + ctx = this->eventHandler_->getContext("BsnesDebugger.set_cpu_reg", callContext); + } + ::apache::thrift::TProcessorContextFreer freer(this->eventHandler_.get(), ctx, "BsnesDebugger.set_cpu_reg"); + + if (this->eventHandler_.get() != nullptr) { + this->eventHandler_->preRead(ctx, "BsnesDebugger.set_cpu_reg"); + } + + BsnesDebugger_set_cpu_reg_args args; + args.read(iprot); + iprot->readMessageEnd(); + uint32_t bytes = iprot->getTransport()->readEnd(); + + if (this->eventHandler_.get() != nullptr) { + this->eventHandler_->postRead(ctx, "BsnesDebugger.set_cpu_reg", bytes); + } + + BsnesDebugger_set_cpu_reg_result result; + try { + iface_->set_cpu_reg(args.reg, args.value); + } catch (const std::exception& e) { + if (this->eventHandler_.get() != nullptr) { + this->eventHandler_->handlerError(ctx, "BsnesDebugger.set_cpu_reg"); + } + + ::apache::thrift::TApplicationException x(e.what()); + oprot->writeMessageBegin("set_cpu_reg", ::apache::thrift::protocol::T_EXCEPTION, seqid); + x.write(oprot); + oprot->writeMessageEnd(); + oprot->getTransport()->writeEnd(); + oprot->getTransport()->flush(); + return; + } + + if (this->eventHandler_.get() != nullptr) { + this->eventHandler_->preWrite(ctx, "BsnesDebugger.set_cpu_reg"); + } + + oprot->writeMessageBegin("set_cpu_reg", ::apache::thrift::protocol::T_REPLY, seqid); + result.write(oprot); + oprot->writeMessageEnd(); + bytes = oprot->getTransport()->writeEnd(); + oprot->getTransport()->flush(); + + if (this->eventHandler_.get() != nullptr) { + this->eventHandler_->postWrite(ctx, "BsnesDebugger.set_cpu_reg", bytes); + } +} + +void BsnesDebuggerProcessor::process_read_memory(int32_t seqid, ::apache::thrift::protocol::TProtocol* iprot, ::apache::thrift::protocol::TProtocol* oprot, void* callContext) +{ + void* ctx = nullptr; + if (this->eventHandler_.get() != nullptr) { + ctx = this->eventHandler_->getContext("BsnesDebugger.read_memory", callContext); + } + ::apache::thrift::TProcessorContextFreer freer(this->eventHandler_.get(), ctx, "BsnesDebugger.read_memory"); + + if (this->eventHandler_.get() != nullptr) { + this->eventHandler_->preRead(ctx, "BsnesDebugger.read_memory"); + } + + BsnesDebugger_read_memory_args args; + args.read(iprot); + iprot->readMessageEnd(); + uint32_t bytes = iprot->getTransport()->readEnd(); + + if (this->eventHandler_.get() != nullptr) { + this->eventHandler_->postRead(ctx, "BsnesDebugger.read_memory", bytes); + } + + BsnesDebugger_read_memory_result result; + try { + iface_->read_memory(result.success, args.src, args.address, args.size); + result.__isset.success = true; + } catch (const std::exception& e) { + if (this->eventHandler_.get() != nullptr) { + this->eventHandler_->handlerError(ctx, "BsnesDebugger.read_memory"); + } + + ::apache::thrift::TApplicationException x(e.what()); + oprot->writeMessageBegin("read_memory", ::apache::thrift::protocol::T_EXCEPTION, seqid); + x.write(oprot); + oprot->writeMessageEnd(); + oprot->getTransport()->writeEnd(); + oprot->getTransport()->flush(); + return; + } + + if (this->eventHandler_.get() != nullptr) { + this->eventHandler_->preWrite(ctx, "BsnesDebugger.read_memory"); + } + + oprot->writeMessageBegin("read_memory", ::apache::thrift::protocol::T_REPLY, seqid); + result.write(oprot); + oprot->writeMessageEnd(); + bytes = oprot->getTransport()->writeEnd(); + oprot->getTransport()->flush(); + + if (this->eventHandler_.get() != nullptr) { + this->eventHandler_->postWrite(ctx, "BsnesDebugger.read_memory", bytes); + } +} + +void BsnesDebuggerProcessor::process_write_memory(int32_t seqid, ::apache::thrift::protocol::TProtocol* iprot, ::apache::thrift::protocol::TProtocol* oprot, void* callContext) +{ + void* ctx = nullptr; + if (this->eventHandler_.get() != nullptr) { + ctx = this->eventHandler_->getContext("BsnesDebugger.write_memory", callContext); + } + ::apache::thrift::TProcessorContextFreer freer(this->eventHandler_.get(), ctx, "BsnesDebugger.write_memory"); + + if (this->eventHandler_.get() != nullptr) { + this->eventHandler_->preRead(ctx, "BsnesDebugger.write_memory"); + } + + BsnesDebugger_write_memory_args args; + args.read(iprot); + iprot->readMessageEnd(); + uint32_t bytes = iprot->getTransport()->readEnd(); + + if (this->eventHandler_.get() != nullptr) { + this->eventHandler_->postRead(ctx, "BsnesDebugger.write_memory", bytes); + } + + BsnesDebugger_write_memory_result result; + try { + iface_->write_memory(args.src, args.address, args.data); + } catch (const std::exception& e) { + if (this->eventHandler_.get() != nullptr) { + this->eventHandler_->handlerError(ctx, "BsnesDebugger.write_memory"); + } + + ::apache::thrift::TApplicationException x(e.what()); + oprot->writeMessageBegin("write_memory", ::apache::thrift::protocol::T_EXCEPTION, seqid); + x.write(oprot); + oprot->writeMessageEnd(); + oprot->getTransport()->writeEnd(); + oprot->getTransport()->flush(); + return; + } + + if (this->eventHandler_.get() != nullptr) { + this->eventHandler_->preWrite(ctx, "BsnesDebugger.write_memory"); + } + + oprot->writeMessageBegin("write_memory", ::apache::thrift::protocol::T_REPLY, seqid); + result.write(oprot); + oprot->writeMessageEnd(); + bytes = oprot->getTransport()->writeEnd(); + oprot->getTransport()->flush(); + + if (this->eventHandler_.get() != nullptr) { + this->eventHandler_->postWrite(ctx, "BsnesDebugger.write_memory", bytes); + } +} + +void BsnesDebuggerProcessor::process_add_breakpoint(int32_t seqid, ::apache::thrift::protocol::TProtocol* iprot, ::apache::thrift::protocol::TProtocol* oprot, void* callContext) +{ + void* ctx = nullptr; + if (this->eventHandler_.get() != nullptr) { + ctx = this->eventHandler_->getContext("BsnesDebugger.add_breakpoint", callContext); + } + ::apache::thrift::TProcessorContextFreer freer(this->eventHandler_.get(), ctx, "BsnesDebugger.add_breakpoint"); + + if (this->eventHandler_.get() != nullptr) { + this->eventHandler_->preRead(ctx, "BsnesDebugger.add_breakpoint"); + } + + BsnesDebugger_add_breakpoint_args args; + args.read(iprot); + iprot->readMessageEnd(); + uint32_t bytes = iprot->getTransport()->readEnd(); + + if (this->eventHandler_.get() != nullptr) { + this->eventHandler_->postRead(ctx, "BsnesDebugger.add_breakpoint", bytes); + } + + BsnesDebugger_add_breakpoint_result result; + try { + iface_->add_breakpoint(args.bpt); + } catch (const std::exception& e) { + if (this->eventHandler_.get() != nullptr) { + this->eventHandler_->handlerError(ctx, "BsnesDebugger.add_breakpoint"); + } + + ::apache::thrift::TApplicationException x(e.what()); + oprot->writeMessageBegin("add_breakpoint", ::apache::thrift::protocol::T_EXCEPTION, seqid); + x.write(oprot); + oprot->writeMessageEnd(); + oprot->getTransport()->writeEnd(); + oprot->getTransport()->flush(); + return; + } + + if (this->eventHandler_.get() != nullptr) { + this->eventHandler_->preWrite(ctx, "BsnesDebugger.add_breakpoint"); + } + + oprot->writeMessageBegin("add_breakpoint", ::apache::thrift::protocol::T_REPLY, seqid); + result.write(oprot); + oprot->writeMessageEnd(); + bytes = oprot->getTransport()->writeEnd(); + oprot->getTransport()->flush(); + + if (this->eventHandler_.get() != nullptr) { + this->eventHandler_->postWrite(ctx, "BsnesDebugger.add_breakpoint", bytes); + } +} + +void BsnesDebuggerProcessor::process_del_breakpoint(int32_t seqid, ::apache::thrift::protocol::TProtocol* iprot, ::apache::thrift::protocol::TProtocol* oprot, void* callContext) +{ + void* ctx = nullptr; + if (this->eventHandler_.get() != nullptr) { + ctx = this->eventHandler_->getContext("BsnesDebugger.del_breakpoint", callContext); + } + ::apache::thrift::TProcessorContextFreer freer(this->eventHandler_.get(), ctx, "BsnesDebugger.del_breakpoint"); + + if (this->eventHandler_.get() != nullptr) { + this->eventHandler_->preRead(ctx, "BsnesDebugger.del_breakpoint"); + } + + BsnesDebugger_del_breakpoint_args args; + args.read(iprot); + iprot->readMessageEnd(); + uint32_t bytes = iprot->getTransport()->readEnd(); + + if (this->eventHandler_.get() != nullptr) { + this->eventHandler_->postRead(ctx, "BsnesDebugger.del_breakpoint", bytes); + } + + BsnesDebugger_del_breakpoint_result result; + try { + iface_->del_breakpoint(args.bpt); + } catch (const std::exception& e) { + if (this->eventHandler_.get() != nullptr) { + this->eventHandler_->handlerError(ctx, "BsnesDebugger.del_breakpoint"); + } + + ::apache::thrift::TApplicationException x(e.what()); + oprot->writeMessageBegin("del_breakpoint", ::apache::thrift::protocol::T_EXCEPTION, seqid); + x.write(oprot); + oprot->writeMessageEnd(); + oprot->getTransport()->writeEnd(); + oprot->getTransport()->flush(); + return; + } + + if (this->eventHandler_.get() != nullptr) { + this->eventHandler_->preWrite(ctx, "BsnesDebugger.del_breakpoint"); + } + + oprot->writeMessageBegin("del_breakpoint", ::apache::thrift::protocol::T_REPLY, seqid); + result.write(oprot); + oprot->writeMessageEnd(); + bytes = oprot->getTransport()->writeEnd(); + oprot->getTransport()->flush(); + + if (this->eventHandler_.get() != nullptr) { + this->eventHandler_->postWrite(ctx, "BsnesDebugger.del_breakpoint", bytes); + } +} + +void BsnesDebuggerProcessor::process_pause(int32_t seqid, ::apache::thrift::protocol::TProtocol* iprot, ::apache::thrift::protocol::TProtocol* oprot, void* callContext) +{ + void* ctx = nullptr; + if (this->eventHandler_.get() != nullptr) { + ctx = this->eventHandler_->getContext("BsnesDebugger.pause", callContext); + } + ::apache::thrift::TProcessorContextFreer freer(this->eventHandler_.get(), ctx, "BsnesDebugger.pause"); + + if (this->eventHandler_.get() != nullptr) { + this->eventHandler_->preRead(ctx, "BsnesDebugger.pause"); + } + + BsnesDebugger_pause_args args; + args.read(iprot); + iprot->readMessageEnd(); + uint32_t bytes = iprot->getTransport()->readEnd(); + + if (this->eventHandler_.get() != nullptr) { + this->eventHandler_->postRead(ctx, "BsnesDebugger.pause", bytes); + } + + BsnesDebugger_pause_result result; + try { + iface_->pause(); + } catch (const std::exception& e) { + if (this->eventHandler_.get() != nullptr) { + this->eventHandler_->handlerError(ctx, "BsnesDebugger.pause"); + } + + ::apache::thrift::TApplicationException x(e.what()); + oprot->writeMessageBegin("pause", ::apache::thrift::protocol::T_EXCEPTION, seqid); + x.write(oprot); + oprot->writeMessageEnd(); + oprot->getTransport()->writeEnd(); + oprot->getTransport()->flush(); + return; + } + + if (this->eventHandler_.get() != nullptr) { + this->eventHandler_->preWrite(ctx, "BsnesDebugger.pause"); + } + + oprot->writeMessageBegin("pause", ::apache::thrift::protocol::T_REPLY, seqid); + result.write(oprot); + oprot->writeMessageEnd(); + bytes = oprot->getTransport()->writeEnd(); + oprot->getTransport()->flush(); + + if (this->eventHandler_.get() != nullptr) { + this->eventHandler_->postWrite(ctx, "BsnesDebugger.pause", bytes); + } +} + +void BsnesDebuggerProcessor::process_resume(int32_t seqid, ::apache::thrift::protocol::TProtocol* iprot, ::apache::thrift::protocol::TProtocol* oprot, void* callContext) +{ + void* ctx = nullptr; + if (this->eventHandler_.get() != nullptr) { + ctx = this->eventHandler_->getContext("BsnesDebugger.resume", callContext); + } + ::apache::thrift::TProcessorContextFreer freer(this->eventHandler_.get(), ctx, "BsnesDebugger.resume"); + + if (this->eventHandler_.get() != nullptr) { + this->eventHandler_->preRead(ctx, "BsnesDebugger.resume"); + } + + BsnesDebugger_resume_args args; + args.read(iprot); + iprot->readMessageEnd(); + uint32_t bytes = iprot->getTransport()->readEnd(); + + if (this->eventHandler_.get() != nullptr) { + this->eventHandler_->postRead(ctx, "BsnesDebugger.resume", bytes); + } + + BsnesDebugger_resume_result result; + try { + iface_->resume(); + } catch (const std::exception& e) { + if (this->eventHandler_.get() != nullptr) { + this->eventHandler_->handlerError(ctx, "BsnesDebugger.resume"); + } + + ::apache::thrift::TApplicationException x(e.what()); + oprot->writeMessageBegin("resume", ::apache::thrift::protocol::T_EXCEPTION, seqid); + x.write(oprot); + oprot->writeMessageEnd(); + oprot->getTransport()->writeEnd(); + oprot->getTransport()->flush(); + return; + } + + if (this->eventHandler_.get() != nullptr) { + this->eventHandler_->preWrite(ctx, "BsnesDebugger.resume"); + } + + oprot->writeMessageBegin("resume", ::apache::thrift::protocol::T_REPLY, seqid); + result.write(oprot); + oprot->writeMessageEnd(); + bytes = oprot->getTransport()->writeEnd(); + oprot->getTransport()->flush(); + + if (this->eventHandler_.get() != nullptr) { + this->eventHandler_->postWrite(ctx, "BsnesDebugger.resume", bytes); + } +} + +void BsnesDebuggerProcessor::process_start_emulation(int32_t seqid, ::apache::thrift::protocol::TProtocol* iprot, ::apache::thrift::protocol::TProtocol* oprot, void* callContext) +{ + void* ctx = nullptr; + if (this->eventHandler_.get() != nullptr) { + ctx = this->eventHandler_->getContext("BsnesDebugger.start_emulation", callContext); + } + ::apache::thrift::TProcessorContextFreer freer(this->eventHandler_.get(), ctx, "BsnesDebugger.start_emulation"); + + if (this->eventHandler_.get() != nullptr) { + this->eventHandler_->preRead(ctx, "BsnesDebugger.start_emulation"); + } + + BsnesDebugger_start_emulation_args args; + args.read(iprot); + iprot->readMessageEnd(); + uint32_t bytes = iprot->getTransport()->readEnd(); + + if (this->eventHandler_.get() != nullptr) { + this->eventHandler_->postRead(ctx, "BsnesDebugger.start_emulation", bytes); + } + + BsnesDebugger_start_emulation_result result; + try { + iface_->start_emulation(); + } catch (const std::exception& e) { + if (this->eventHandler_.get() != nullptr) { + this->eventHandler_->handlerError(ctx, "BsnesDebugger.start_emulation"); + } + + ::apache::thrift::TApplicationException x(e.what()); + oprot->writeMessageBegin("start_emulation", ::apache::thrift::protocol::T_EXCEPTION, seqid); + x.write(oprot); + oprot->writeMessageEnd(); + oprot->getTransport()->writeEnd(); + oprot->getTransport()->flush(); + return; + } + + if (this->eventHandler_.get() != nullptr) { + this->eventHandler_->preWrite(ctx, "BsnesDebugger.start_emulation"); + } + + oprot->writeMessageBegin("start_emulation", ::apache::thrift::protocol::T_REPLY, seqid); + result.write(oprot); + oprot->writeMessageEnd(); + bytes = oprot->getTransport()->writeEnd(); + oprot->getTransport()->flush(); + + if (this->eventHandler_.get() != nullptr) { + this->eventHandler_->postWrite(ctx, "BsnesDebugger.start_emulation", bytes); + } +} + +void BsnesDebuggerProcessor::process_exit_emulation(int32_t seqid, ::apache::thrift::protocol::TProtocol* iprot, ::apache::thrift::protocol::TProtocol* oprot, void* callContext) +{ + void* ctx = nullptr; + if (this->eventHandler_.get() != nullptr) { + ctx = this->eventHandler_->getContext("BsnesDebugger.exit_emulation", callContext); + } + ::apache::thrift::TProcessorContextFreer freer(this->eventHandler_.get(), ctx, "BsnesDebugger.exit_emulation"); + + if (this->eventHandler_.get() != nullptr) { + this->eventHandler_->preRead(ctx, "BsnesDebugger.exit_emulation"); + } + + BsnesDebugger_exit_emulation_args args; + args.read(iprot); + iprot->readMessageEnd(); + uint32_t bytes = iprot->getTransport()->readEnd(); + + if (this->eventHandler_.get() != nullptr) { + this->eventHandler_->postRead(ctx, "BsnesDebugger.exit_emulation", bytes); + } + + BsnesDebugger_exit_emulation_result result; + try { + iface_->exit_emulation(); + } catch (const std::exception& e) { + if (this->eventHandler_.get() != nullptr) { + this->eventHandler_->handlerError(ctx, "BsnesDebugger.exit_emulation"); + } + + ::apache::thrift::TApplicationException x(e.what()); + oprot->writeMessageBegin("exit_emulation", ::apache::thrift::protocol::T_EXCEPTION, seqid); + x.write(oprot); + oprot->writeMessageEnd(); + oprot->getTransport()->writeEnd(); + oprot->getTransport()->flush(); + return; + } + + if (this->eventHandler_.get() != nullptr) { + this->eventHandler_->preWrite(ctx, "BsnesDebugger.exit_emulation"); + } + + oprot->writeMessageBegin("exit_emulation", ::apache::thrift::protocol::T_REPLY, seqid); + result.write(oprot); + oprot->writeMessageEnd(); + bytes = oprot->getTransport()->writeEnd(); + oprot->getTransport()->flush(); + + if (this->eventHandler_.get() != nullptr) { + this->eventHandler_->postWrite(ctx, "BsnesDebugger.exit_emulation", bytes); + } +} + +void BsnesDebuggerProcessor::process_step_into(int32_t seqid, ::apache::thrift::protocol::TProtocol* iprot, ::apache::thrift::protocol::TProtocol* oprot, void* callContext) +{ + void* ctx = nullptr; + if (this->eventHandler_.get() != nullptr) { + ctx = this->eventHandler_->getContext("BsnesDebugger.step_into", callContext); + } + ::apache::thrift::TProcessorContextFreer freer(this->eventHandler_.get(), ctx, "BsnesDebugger.step_into"); + + if (this->eventHandler_.get() != nullptr) { + this->eventHandler_->preRead(ctx, "BsnesDebugger.step_into"); + } + + BsnesDebugger_step_into_args args; + args.read(iprot); + iprot->readMessageEnd(); + uint32_t bytes = iprot->getTransport()->readEnd(); + + if (this->eventHandler_.get() != nullptr) { + this->eventHandler_->postRead(ctx, "BsnesDebugger.step_into", bytes); + } + + BsnesDebugger_step_into_result result; + try { + iface_->step_into(); + } catch (const std::exception& e) { + if (this->eventHandler_.get() != nullptr) { + this->eventHandler_->handlerError(ctx, "BsnesDebugger.step_into"); + } + + ::apache::thrift::TApplicationException x(e.what()); + oprot->writeMessageBegin("step_into", ::apache::thrift::protocol::T_EXCEPTION, seqid); + x.write(oprot); + oprot->writeMessageEnd(); + oprot->getTransport()->writeEnd(); + oprot->getTransport()->flush(); + return; + } + + if (this->eventHandler_.get() != nullptr) { + this->eventHandler_->preWrite(ctx, "BsnesDebugger.step_into"); + } + + oprot->writeMessageBegin("step_into", ::apache::thrift::protocol::T_REPLY, seqid); + result.write(oprot); + oprot->writeMessageEnd(); + bytes = oprot->getTransport()->writeEnd(); + oprot->getTransport()->flush(); + + if (this->eventHandler_.get() != nullptr) { + this->eventHandler_->postWrite(ctx, "BsnesDebugger.step_into", bytes); + } +} + +void BsnesDebuggerProcessor::process_step_over(int32_t seqid, ::apache::thrift::protocol::TProtocol* iprot, ::apache::thrift::protocol::TProtocol* oprot, void* callContext) +{ + void* ctx = nullptr; + if (this->eventHandler_.get() != nullptr) { + ctx = this->eventHandler_->getContext("BsnesDebugger.step_over", callContext); + } + ::apache::thrift::TProcessorContextFreer freer(this->eventHandler_.get(), ctx, "BsnesDebugger.step_over"); + + if (this->eventHandler_.get() != nullptr) { + this->eventHandler_->preRead(ctx, "BsnesDebugger.step_over"); + } + + BsnesDebugger_step_over_args args; + args.read(iprot); + iprot->readMessageEnd(); + uint32_t bytes = iprot->getTransport()->readEnd(); + + if (this->eventHandler_.get() != nullptr) { + this->eventHandler_->postRead(ctx, "BsnesDebugger.step_over", bytes); + } + + BsnesDebugger_step_over_result result; + try { + iface_->step_over(); + } catch (const std::exception& e) { + if (this->eventHandler_.get() != nullptr) { + this->eventHandler_->handlerError(ctx, "BsnesDebugger.step_over"); + } + + ::apache::thrift::TApplicationException x(e.what()); + oprot->writeMessageBegin("step_over", ::apache::thrift::protocol::T_EXCEPTION, seqid); + x.write(oprot); + oprot->writeMessageEnd(); + oprot->getTransport()->writeEnd(); + oprot->getTransport()->flush(); + return; + } + + if (this->eventHandler_.get() != nullptr) { + this->eventHandler_->preWrite(ctx, "BsnesDebugger.step_over"); + } + + oprot->writeMessageBegin("step_over", ::apache::thrift::protocol::T_REPLY, seqid); + result.write(oprot); + oprot->writeMessageEnd(); + bytes = oprot->getTransport()->writeEnd(); + oprot->getTransport()->flush(); + + if (this->eventHandler_.get() != nullptr) { + this->eventHandler_->postWrite(ctx, "BsnesDebugger.step_over", bytes); + } +} + +::std::shared_ptr< ::apache::thrift::TProcessor > BsnesDebuggerProcessorFactory::getProcessor(const ::apache::thrift::TConnectionInfo& connInfo) { + ::apache::thrift::ReleaseHandler< BsnesDebuggerIfFactory > cleanup(handlerFactory_); + ::std::shared_ptr< BsnesDebuggerIf > handler(handlerFactory_->getHandler(connInfo), cleanup); + ::std::shared_ptr< ::apache::thrift::TProcessor > processor(new BsnesDebuggerProcessor(handler)); + return processor; +} + +int32_t BsnesDebuggerConcurrentClient::get_cpu_reg(const BsnesRegister::type reg) +{ + int32_t seqid = send_get_cpu_reg(reg); + return recv_get_cpu_reg(seqid); +} + +int32_t BsnesDebuggerConcurrentClient::send_get_cpu_reg(const BsnesRegister::type reg) +{ + int32_t cseqid = this->sync_->generateSeqId(); + ::apache::thrift::async::TConcurrentSendSentry sentry(this->sync_.get()); + oprot_->writeMessageBegin("get_cpu_reg", ::apache::thrift::protocol::T_CALL, cseqid); + + BsnesDebugger_get_cpu_reg_pargs args; + args.reg = ® + args.write(oprot_); + + oprot_->writeMessageEnd(); + oprot_->getTransport()->writeEnd(); + oprot_->getTransport()->flush(); + + sentry.commit(); + return cseqid; +} + +int32_t BsnesDebuggerConcurrentClient::recv_get_cpu_reg(const int32_t seqid) +{ + + int32_t rseqid = 0; + std::string fname; + ::apache::thrift::protocol::TMessageType mtype; + + // the read mutex gets dropped and reacquired as part of waitForWork() + // The destructor of this sentry wakes up other clients + ::apache::thrift::async::TConcurrentRecvSentry sentry(this->sync_.get(), seqid); + + while(true) { + if(!this->sync_->getPending(fname, mtype, rseqid)) { + iprot_->readMessageBegin(fname, mtype, rseqid); + } + if(seqid == rseqid) { + if (mtype == ::apache::thrift::protocol::T_EXCEPTION) { + ::apache::thrift::TApplicationException x; + x.read(iprot_); + iprot_->readMessageEnd(); + iprot_->getTransport()->readEnd(); + sentry.commit(); + throw x; + } + if (mtype != ::apache::thrift::protocol::T_REPLY) { + iprot_->skip(::apache::thrift::protocol::T_STRUCT); + iprot_->readMessageEnd(); + iprot_->getTransport()->readEnd(); + } + if (fname.compare("get_cpu_reg") != 0) { + iprot_->skip(::apache::thrift::protocol::T_STRUCT); + iprot_->readMessageEnd(); + iprot_->getTransport()->readEnd(); + + // in a bad state, don't commit + using ::apache::thrift::protocol::TProtocolException; + throw TProtocolException(TProtocolException::INVALID_DATA); + } + int32_t _return; + BsnesDebugger_get_cpu_reg_presult result; + result.success = &_return; + result.read(iprot_); + iprot_->readMessageEnd(); + iprot_->getTransport()->readEnd(); + + if (result.__isset.success) { + sentry.commit(); + return _return; + } + // in a bad state, don't commit + throw ::apache::thrift::TApplicationException(::apache::thrift::TApplicationException::MISSING_RESULT, "get_cpu_reg failed: unknown result"); + } + // seqid != rseqid + this->sync_->updatePending(fname, mtype, rseqid); + + // this will temporarily unlock the readMutex, and let other clients get work done + this->sync_->waitForWork(seqid); + } // end while(true) +} + +void BsnesDebuggerConcurrentClient::get_cpu_regs(BsnesRegisters& _return) +{ + int32_t seqid = send_get_cpu_regs(); + recv_get_cpu_regs(_return, seqid); +} + +int32_t BsnesDebuggerConcurrentClient::send_get_cpu_regs() +{ + int32_t cseqid = this->sync_->generateSeqId(); + ::apache::thrift::async::TConcurrentSendSentry sentry(this->sync_.get()); + oprot_->writeMessageBegin("get_cpu_regs", ::apache::thrift::protocol::T_CALL, cseqid); + + BsnesDebugger_get_cpu_regs_pargs args; + args.write(oprot_); + + oprot_->writeMessageEnd(); + oprot_->getTransport()->writeEnd(); + oprot_->getTransport()->flush(); + + sentry.commit(); + return cseqid; +} + +void BsnesDebuggerConcurrentClient::recv_get_cpu_regs(BsnesRegisters& _return, const int32_t seqid) +{ + + int32_t rseqid = 0; + std::string fname; + ::apache::thrift::protocol::TMessageType mtype; + + // the read mutex gets dropped and reacquired as part of waitForWork() + // The destructor of this sentry wakes up other clients + ::apache::thrift::async::TConcurrentRecvSentry sentry(this->sync_.get(), seqid); + + while(true) { + if(!this->sync_->getPending(fname, mtype, rseqid)) { + iprot_->readMessageBegin(fname, mtype, rseqid); + } + if(seqid == rseqid) { + if (mtype == ::apache::thrift::protocol::T_EXCEPTION) { + ::apache::thrift::TApplicationException x; + x.read(iprot_); + iprot_->readMessageEnd(); + iprot_->getTransport()->readEnd(); + sentry.commit(); + throw x; + } + if (mtype != ::apache::thrift::protocol::T_REPLY) { + iprot_->skip(::apache::thrift::protocol::T_STRUCT); + iprot_->readMessageEnd(); + iprot_->getTransport()->readEnd(); + } + if (fname.compare("get_cpu_regs") != 0) { + iprot_->skip(::apache::thrift::protocol::T_STRUCT); + iprot_->readMessageEnd(); + iprot_->getTransport()->readEnd(); + + // in a bad state, don't commit + using ::apache::thrift::protocol::TProtocolException; + throw TProtocolException(TProtocolException::INVALID_DATA); + } + BsnesDebugger_get_cpu_regs_presult result; + result.success = &_return; + result.read(iprot_); + iprot_->readMessageEnd(); + iprot_->getTransport()->readEnd(); + + if (result.__isset.success) { + // _return pointer has now been filled + sentry.commit(); + return; + } + // in a bad state, don't commit + throw ::apache::thrift::TApplicationException(::apache::thrift::TApplicationException::MISSING_RESULT, "get_cpu_regs failed: unknown result"); + } + // seqid != rseqid + this->sync_->updatePending(fname, mtype, rseqid); + + // this will temporarily unlock the readMutex, and let other clients get work done + this->sync_->waitForWork(seqid); + } // end while(true) +} + +void BsnesDebuggerConcurrentClient::set_cpu_reg(const BsnesRegister::type reg, const int32_t value) +{ + int32_t seqid = send_set_cpu_reg(reg, value); + recv_set_cpu_reg(seqid); +} + +int32_t BsnesDebuggerConcurrentClient::send_set_cpu_reg(const BsnesRegister::type reg, const int32_t value) +{ + int32_t cseqid = this->sync_->generateSeqId(); + ::apache::thrift::async::TConcurrentSendSentry sentry(this->sync_.get()); + oprot_->writeMessageBegin("set_cpu_reg", ::apache::thrift::protocol::T_CALL, cseqid); + + BsnesDebugger_set_cpu_reg_pargs args; + args.reg = ® + args.value = &value; + args.write(oprot_); + + oprot_->writeMessageEnd(); + oprot_->getTransport()->writeEnd(); + oprot_->getTransport()->flush(); + + sentry.commit(); + return cseqid; +} + +void BsnesDebuggerConcurrentClient::recv_set_cpu_reg(const int32_t seqid) +{ + + int32_t rseqid = 0; + std::string fname; + ::apache::thrift::protocol::TMessageType mtype; + + // the read mutex gets dropped and reacquired as part of waitForWork() + // The destructor of this sentry wakes up other clients + ::apache::thrift::async::TConcurrentRecvSentry sentry(this->sync_.get(), seqid); + + while(true) { + if(!this->sync_->getPending(fname, mtype, rseqid)) { + iprot_->readMessageBegin(fname, mtype, rseqid); + } + if(seqid == rseqid) { + if (mtype == ::apache::thrift::protocol::T_EXCEPTION) { + ::apache::thrift::TApplicationException x; + x.read(iprot_); + iprot_->readMessageEnd(); + iprot_->getTransport()->readEnd(); + sentry.commit(); + throw x; + } + if (mtype != ::apache::thrift::protocol::T_REPLY) { + iprot_->skip(::apache::thrift::protocol::T_STRUCT); + iprot_->readMessageEnd(); + iprot_->getTransport()->readEnd(); + } + if (fname.compare("set_cpu_reg") != 0) { + iprot_->skip(::apache::thrift::protocol::T_STRUCT); + iprot_->readMessageEnd(); + iprot_->getTransport()->readEnd(); + + // in a bad state, don't commit + using ::apache::thrift::protocol::TProtocolException; + throw TProtocolException(TProtocolException::INVALID_DATA); + } + BsnesDebugger_set_cpu_reg_presult result; + result.read(iprot_); + iprot_->readMessageEnd(); + iprot_->getTransport()->readEnd(); + + sentry.commit(); + return; + } + // seqid != rseqid + this->sync_->updatePending(fname, mtype, rseqid); + + // this will temporarily unlock the readMutex, and let other clients get work done + this->sync_->waitForWork(seqid); + } // end while(true) +} + +void BsnesDebuggerConcurrentClient::read_memory(std::string& _return, const DbgMemorySource::type src, const int32_t address, const int32_t size) +{ + int32_t seqid = send_read_memory(src, address, size); + recv_read_memory(_return, seqid); +} + +int32_t BsnesDebuggerConcurrentClient::send_read_memory(const DbgMemorySource::type src, const int32_t address, const int32_t size) +{ + int32_t cseqid = this->sync_->generateSeqId(); + ::apache::thrift::async::TConcurrentSendSentry sentry(this->sync_.get()); + oprot_->writeMessageBegin("read_memory", ::apache::thrift::protocol::T_CALL, cseqid); + + BsnesDebugger_read_memory_pargs args; + args.src = &src; + args.address = &address; + args.size = &size; + args.write(oprot_); + + oprot_->writeMessageEnd(); + oprot_->getTransport()->writeEnd(); + oprot_->getTransport()->flush(); + + sentry.commit(); + return cseqid; +} + +void BsnesDebuggerConcurrentClient::recv_read_memory(std::string& _return, const int32_t seqid) +{ + + int32_t rseqid = 0; + std::string fname; + ::apache::thrift::protocol::TMessageType mtype; + + // the read mutex gets dropped and reacquired as part of waitForWork() + // The destructor of this sentry wakes up other clients + ::apache::thrift::async::TConcurrentRecvSentry sentry(this->sync_.get(), seqid); + + while(true) { + if(!this->sync_->getPending(fname, mtype, rseqid)) { + iprot_->readMessageBegin(fname, mtype, rseqid); + } + if(seqid == rseqid) { + if (mtype == ::apache::thrift::protocol::T_EXCEPTION) { + ::apache::thrift::TApplicationException x; + x.read(iprot_); + iprot_->readMessageEnd(); + iprot_->getTransport()->readEnd(); + sentry.commit(); + throw x; + } + if (mtype != ::apache::thrift::protocol::T_REPLY) { + iprot_->skip(::apache::thrift::protocol::T_STRUCT); + iprot_->readMessageEnd(); + iprot_->getTransport()->readEnd(); + } + if (fname.compare("read_memory") != 0) { + iprot_->skip(::apache::thrift::protocol::T_STRUCT); + iprot_->readMessageEnd(); + iprot_->getTransport()->readEnd(); + + // in a bad state, don't commit + using ::apache::thrift::protocol::TProtocolException; + throw TProtocolException(TProtocolException::INVALID_DATA); + } + BsnesDebugger_read_memory_presult result; + result.success = &_return; + result.read(iprot_); + iprot_->readMessageEnd(); + iprot_->getTransport()->readEnd(); + + if (result.__isset.success) { + // _return pointer has now been filled + sentry.commit(); + return; + } + // in a bad state, don't commit + throw ::apache::thrift::TApplicationException(::apache::thrift::TApplicationException::MISSING_RESULT, "read_memory failed: unknown result"); + } + // seqid != rseqid + this->sync_->updatePending(fname, mtype, rseqid); + + // this will temporarily unlock the readMutex, and let other clients get work done + this->sync_->waitForWork(seqid); + } // end while(true) +} + +void BsnesDebuggerConcurrentClient::write_memory(const DbgMemorySource::type src, const int32_t address, const std::string& data) +{ + int32_t seqid = send_write_memory(src, address, data); + recv_write_memory(seqid); +} + +int32_t BsnesDebuggerConcurrentClient::send_write_memory(const DbgMemorySource::type src, const int32_t address, const std::string& data) +{ + int32_t cseqid = this->sync_->generateSeqId(); + ::apache::thrift::async::TConcurrentSendSentry sentry(this->sync_.get()); + oprot_->writeMessageBegin("write_memory", ::apache::thrift::protocol::T_CALL, cseqid); + + BsnesDebugger_write_memory_pargs args; + args.src = &src; + args.address = &address; + args.data = &data; + args.write(oprot_); + + oprot_->writeMessageEnd(); + oprot_->getTransport()->writeEnd(); + oprot_->getTransport()->flush(); + + sentry.commit(); + return cseqid; +} + +void BsnesDebuggerConcurrentClient::recv_write_memory(const int32_t seqid) +{ + + int32_t rseqid = 0; + std::string fname; + ::apache::thrift::protocol::TMessageType mtype; + + // the read mutex gets dropped and reacquired as part of waitForWork() + // The destructor of this sentry wakes up other clients + ::apache::thrift::async::TConcurrentRecvSentry sentry(this->sync_.get(), seqid); + + while(true) { + if(!this->sync_->getPending(fname, mtype, rseqid)) { + iprot_->readMessageBegin(fname, mtype, rseqid); + } + if(seqid == rseqid) { + if (mtype == ::apache::thrift::protocol::T_EXCEPTION) { + ::apache::thrift::TApplicationException x; + x.read(iprot_); + iprot_->readMessageEnd(); + iprot_->getTransport()->readEnd(); + sentry.commit(); + throw x; + } + if (mtype != ::apache::thrift::protocol::T_REPLY) { + iprot_->skip(::apache::thrift::protocol::T_STRUCT); + iprot_->readMessageEnd(); + iprot_->getTransport()->readEnd(); + } + if (fname.compare("write_memory") != 0) { + iprot_->skip(::apache::thrift::protocol::T_STRUCT); + iprot_->readMessageEnd(); + iprot_->getTransport()->readEnd(); + + // in a bad state, don't commit + using ::apache::thrift::protocol::TProtocolException; + throw TProtocolException(TProtocolException::INVALID_DATA); + } + BsnesDebugger_write_memory_presult result; + result.read(iprot_); + iprot_->readMessageEnd(); + iprot_->getTransport()->readEnd(); + + sentry.commit(); + return; + } + // seqid != rseqid + this->sync_->updatePending(fname, mtype, rseqid); + + // this will temporarily unlock the readMutex, and let other clients get work done + this->sync_->waitForWork(seqid); + } // end while(true) +} + +void BsnesDebuggerConcurrentClient::add_breakpoint(const DbgBreakpoint& bpt) +{ + int32_t seqid = send_add_breakpoint(bpt); + recv_add_breakpoint(seqid); +} + +int32_t BsnesDebuggerConcurrentClient::send_add_breakpoint(const DbgBreakpoint& bpt) +{ + int32_t cseqid = this->sync_->generateSeqId(); + ::apache::thrift::async::TConcurrentSendSentry sentry(this->sync_.get()); + oprot_->writeMessageBegin("add_breakpoint", ::apache::thrift::protocol::T_CALL, cseqid); + + BsnesDebugger_add_breakpoint_pargs args; + args.bpt = &bpt; + args.write(oprot_); + + oprot_->writeMessageEnd(); + oprot_->getTransport()->writeEnd(); + oprot_->getTransport()->flush(); + + sentry.commit(); + return cseqid; +} + +void BsnesDebuggerConcurrentClient::recv_add_breakpoint(const int32_t seqid) +{ + + int32_t rseqid = 0; + std::string fname; + ::apache::thrift::protocol::TMessageType mtype; + + // the read mutex gets dropped and reacquired as part of waitForWork() + // The destructor of this sentry wakes up other clients + ::apache::thrift::async::TConcurrentRecvSentry sentry(this->sync_.get(), seqid); + + while(true) { + if(!this->sync_->getPending(fname, mtype, rseqid)) { + iprot_->readMessageBegin(fname, mtype, rseqid); + } + if(seqid == rseqid) { + if (mtype == ::apache::thrift::protocol::T_EXCEPTION) { + ::apache::thrift::TApplicationException x; + x.read(iprot_); + iprot_->readMessageEnd(); + iprot_->getTransport()->readEnd(); + sentry.commit(); + throw x; + } + if (mtype != ::apache::thrift::protocol::T_REPLY) { + iprot_->skip(::apache::thrift::protocol::T_STRUCT); + iprot_->readMessageEnd(); + iprot_->getTransport()->readEnd(); + } + if (fname.compare("add_breakpoint") != 0) { + iprot_->skip(::apache::thrift::protocol::T_STRUCT); + iprot_->readMessageEnd(); + iprot_->getTransport()->readEnd(); + + // in a bad state, don't commit + using ::apache::thrift::protocol::TProtocolException; + throw TProtocolException(TProtocolException::INVALID_DATA); + } + BsnesDebugger_add_breakpoint_presult result; + result.read(iprot_); + iprot_->readMessageEnd(); + iprot_->getTransport()->readEnd(); + + sentry.commit(); + return; + } + // seqid != rseqid + this->sync_->updatePending(fname, mtype, rseqid); + + // this will temporarily unlock the readMutex, and let other clients get work done + this->sync_->waitForWork(seqid); + } // end while(true) +} + +void BsnesDebuggerConcurrentClient::del_breakpoint(const DbgBreakpoint& bpt) +{ + int32_t seqid = send_del_breakpoint(bpt); + recv_del_breakpoint(seqid); +} + +int32_t BsnesDebuggerConcurrentClient::send_del_breakpoint(const DbgBreakpoint& bpt) +{ + int32_t cseqid = this->sync_->generateSeqId(); + ::apache::thrift::async::TConcurrentSendSentry sentry(this->sync_.get()); + oprot_->writeMessageBegin("del_breakpoint", ::apache::thrift::protocol::T_CALL, cseqid); + + BsnesDebugger_del_breakpoint_pargs args; + args.bpt = &bpt; + args.write(oprot_); + + oprot_->writeMessageEnd(); + oprot_->getTransport()->writeEnd(); + oprot_->getTransport()->flush(); + + sentry.commit(); + return cseqid; +} + +void BsnesDebuggerConcurrentClient::recv_del_breakpoint(const int32_t seqid) +{ + + int32_t rseqid = 0; + std::string fname; + ::apache::thrift::protocol::TMessageType mtype; + + // the read mutex gets dropped and reacquired as part of waitForWork() + // The destructor of this sentry wakes up other clients + ::apache::thrift::async::TConcurrentRecvSentry sentry(this->sync_.get(), seqid); + + while(true) { + if(!this->sync_->getPending(fname, mtype, rseqid)) { + iprot_->readMessageBegin(fname, mtype, rseqid); + } + if(seqid == rseqid) { + if (mtype == ::apache::thrift::protocol::T_EXCEPTION) { + ::apache::thrift::TApplicationException x; + x.read(iprot_); + iprot_->readMessageEnd(); + iprot_->getTransport()->readEnd(); + sentry.commit(); + throw x; + } + if (mtype != ::apache::thrift::protocol::T_REPLY) { + iprot_->skip(::apache::thrift::protocol::T_STRUCT); + iprot_->readMessageEnd(); + iprot_->getTransport()->readEnd(); + } + if (fname.compare("del_breakpoint") != 0) { + iprot_->skip(::apache::thrift::protocol::T_STRUCT); + iprot_->readMessageEnd(); + iprot_->getTransport()->readEnd(); + + // in a bad state, don't commit + using ::apache::thrift::protocol::TProtocolException; + throw TProtocolException(TProtocolException::INVALID_DATA); + } + BsnesDebugger_del_breakpoint_presult result; + result.read(iprot_); + iprot_->readMessageEnd(); + iprot_->getTransport()->readEnd(); + + sentry.commit(); + return; + } + // seqid != rseqid + this->sync_->updatePending(fname, mtype, rseqid); + + // this will temporarily unlock the readMutex, and let other clients get work done + this->sync_->waitForWork(seqid); + } // end while(true) +} + +void BsnesDebuggerConcurrentClient::pause() +{ + int32_t seqid = send_pause(); + recv_pause(seqid); +} + +int32_t BsnesDebuggerConcurrentClient::send_pause() +{ + int32_t cseqid = this->sync_->generateSeqId(); + ::apache::thrift::async::TConcurrentSendSentry sentry(this->sync_.get()); + oprot_->writeMessageBegin("pause", ::apache::thrift::protocol::T_CALL, cseqid); + + BsnesDebugger_pause_pargs args; + args.write(oprot_); + + oprot_->writeMessageEnd(); + oprot_->getTransport()->writeEnd(); + oprot_->getTransport()->flush(); + + sentry.commit(); + return cseqid; +} + +void BsnesDebuggerConcurrentClient::recv_pause(const int32_t seqid) +{ + + int32_t rseqid = 0; + std::string fname; + ::apache::thrift::protocol::TMessageType mtype; + + // the read mutex gets dropped and reacquired as part of waitForWork() + // The destructor of this sentry wakes up other clients + ::apache::thrift::async::TConcurrentRecvSentry sentry(this->sync_.get(), seqid); + + while(true) { + if(!this->sync_->getPending(fname, mtype, rseqid)) { + iprot_->readMessageBegin(fname, mtype, rseqid); + } + if(seqid == rseqid) { + if (mtype == ::apache::thrift::protocol::T_EXCEPTION) { + ::apache::thrift::TApplicationException x; + x.read(iprot_); + iprot_->readMessageEnd(); + iprot_->getTransport()->readEnd(); + sentry.commit(); + throw x; + } + if (mtype != ::apache::thrift::protocol::T_REPLY) { + iprot_->skip(::apache::thrift::protocol::T_STRUCT); + iprot_->readMessageEnd(); + iprot_->getTransport()->readEnd(); + } + if (fname.compare("pause") != 0) { + iprot_->skip(::apache::thrift::protocol::T_STRUCT); + iprot_->readMessageEnd(); + iprot_->getTransport()->readEnd(); + + // in a bad state, don't commit + using ::apache::thrift::protocol::TProtocolException; + throw TProtocolException(TProtocolException::INVALID_DATA); + } + BsnesDebugger_pause_presult result; + result.read(iprot_); + iprot_->readMessageEnd(); + iprot_->getTransport()->readEnd(); + + sentry.commit(); + return; + } + // seqid != rseqid + this->sync_->updatePending(fname, mtype, rseqid); + + // this will temporarily unlock the readMutex, and let other clients get work done + this->sync_->waitForWork(seqid); + } // end while(true) +} + +void BsnesDebuggerConcurrentClient::resume() +{ + int32_t seqid = send_resume(); + recv_resume(seqid); +} + +int32_t BsnesDebuggerConcurrentClient::send_resume() +{ + int32_t cseqid = this->sync_->generateSeqId(); + ::apache::thrift::async::TConcurrentSendSentry sentry(this->sync_.get()); + oprot_->writeMessageBegin("resume", ::apache::thrift::protocol::T_CALL, cseqid); + + BsnesDebugger_resume_pargs args; + args.write(oprot_); + + oprot_->writeMessageEnd(); + oprot_->getTransport()->writeEnd(); + oprot_->getTransport()->flush(); + + sentry.commit(); + return cseqid; +} + +void BsnesDebuggerConcurrentClient::recv_resume(const int32_t seqid) +{ + + int32_t rseqid = 0; + std::string fname; + ::apache::thrift::protocol::TMessageType mtype; + + // the read mutex gets dropped and reacquired as part of waitForWork() + // The destructor of this sentry wakes up other clients + ::apache::thrift::async::TConcurrentRecvSentry sentry(this->sync_.get(), seqid); + + while(true) { + if(!this->sync_->getPending(fname, mtype, rseqid)) { + iprot_->readMessageBegin(fname, mtype, rseqid); + } + if(seqid == rseqid) { + if (mtype == ::apache::thrift::protocol::T_EXCEPTION) { + ::apache::thrift::TApplicationException x; + x.read(iprot_); + iprot_->readMessageEnd(); + iprot_->getTransport()->readEnd(); + sentry.commit(); + throw x; + } + if (mtype != ::apache::thrift::protocol::T_REPLY) { + iprot_->skip(::apache::thrift::protocol::T_STRUCT); + iprot_->readMessageEnd(); + iprot_->getTransport()->readEnd(); + } + if (fname.compare("resume") != 0) { + iprot_->skip(::apache::thrift::protocol::T_STRUCT); + iprot_->readMessageEnd(); + iprot_->getTransport()->readEnd(); + + // in a bad state, don't commit + using ::apache::thrift::protocol::TProtocolException; + throw TProtocolException(TProtocolException::INVALID_DATA); + } + BsnesDebugger_resume_presult result; + result.read(iprot_); + iprot_->readMessageEnd(); + iprot_->getTransport()->readEnd(); + + sentry.commit(); + return; + } + // seqid != rseqid + this->sync_->updatePending(fname, mtype, rseqid); + + // this will temporarily unlock the readMutex, and let other clients get work done + this->sync_->waitForWork(seqid); + } // end while(true) +} + +void BsnesDebuggerConcurrentClient::start_emulation() +{ + int32_t seqid = send_start_emulation(); + recv_start_emulation(seqid); +} + +int32_t BsnesDebuggerConcurrentClient::send_start_emulation() +{ + int32_t cseqid = this->sync_->generateSeqId(); + ::apache::thrift::async::TConcurrentSendSentry sentry(this->sync_.get()); + oprot_->writeMessageBegin("start_emulation", ::apache::thrift::protocol::T_CALL, cseqid); + + BsnesDebugger_start_emulation_pargs args; + args.write(oprot_); + + oprot_->writeMessageEnd(); + oprot_->getTransport()->writeEnd(); + oprot_->getTransport()->flush(); + + sentry.commit(); + return cseqid; +} + +void BsnesDebuggerConcurrentClient::recv_start_emulation(const int32_t seqid) +{ + + int32_t rseqid = 0; + std::string fname; + ::apache::thrift::protocol::TMessageType mtype; + + // the read mutex gets dropped and reacquired as part of waitForWork() + // The destructor of this sentry wakes up other clients + ::apache::thrift::async::TConcurrentRecvSentry sentry(this->sync_.get(), seqid); + + while(true) { + if(!this->sync_->getPending(fname, mtype, rseqid)) { + iprot_->readMessageBegin(fname, mtype, rseqid); + } + if(seqid == rseqid) { + if (mtype == ::apache::thrift::protocol::T_EXCEPTION) { + ::apache::thrift::TApplicationException x; + x.read(iprot_); + iprot_->readMessageEnd(); + iprot_->getTransport()->readEnd(); + sentry.commit(); + throw x; + } + if (mtype != ::apache::thrift::protocol::T_REPLY) { + iprot_->skip(::apache::thrift::protocol::T_STRUCT); + iprot_->readMessageEnd(); + iprot_->getTransport()->readEnd(); + } + if (fname.compare("start_emulation") != 0) { + iprot_->skip(::apache::thrift::protocol::T_STRUCT); + iprot_->readMessageEnd(); + iprot_->getTransport()->readEnd(); + + // in a bad state, don't commit + using ::apache::thrift::protocol::TProtocolException; + throw TProtocolException(TProtocolException::INVALID_DATA); + } + BsnesDebugger_start_emulation_presult result; + result.read(iprot_); + iprot_->readMessageEnd(); + iprot_->getTransport()->readEnd(); + + sentry.commit(); + return; + } + // seqid != rseqid + this->sync_->updatePending(fname, mtype, rseqid); + + // this will temporarily unlock the readMutex, and let other clients get work done + this->sync_->waitForWork(seqid); + } // end while(true) +} + +void BsnesDebuggerConcurrentClient::exit_emulation() +{ + int32_t seqid = send_exit_emulation(); + recv_exit_emulation(seqid); +} + +int32_t BsnesDebuggerConcurrentClient::send_exit_emulation() +{ + int32_t cseqid = this->sync_->generateSeqId(); + ::apache::thrift::async::TConcurrentSendSentry sentry(this->sync_.get()); + oprot_->writeMessageBegin("exit_emulation", ::apache::thrift::protocol::T_CALL, cseqid); + + BsnesDebugger_exit_emulation_pargs args; + args.write(oprot_); + + oprot_->writeMessageEnd(); + oprot_->getTransport()->writeEnd(); + oprot_->getTransport()->flush(); + + sentry.commit(); + return cseqid; +} + +void BsnesDebuggerConcurrentClient::recv_exit_emulation(const int32_t seqid) +{ + + int32_t rseqid = 0; + std::string fname; + ::apache::thrift::protocol::TMessageType mtype; + + // the read mutex gets dropped and reacquired as part of waitForWork() + // The destructor of this sentry wakes up other clients + ::apache::thrift::async::TConcurrentRecvSentry sentry(this->sync_.get(), seqid); + + while(true) { + if(!this->sync_->getPending(fname, mtype, rseqid)) { + iprot_->readMessageBegin(fname, mtype, rseqid); + } + if(seqid == rseqid) { + if (mtype == ::apache::thrift::protocol::T_EXCEPTION) { + ::apache::thrift::TApplicationException x; + x.read(iprot_); + iprot_->readMessageEnd(); + iprot_->getTransport()->readEnd(); + sentry.commit(); + throw x; + } + if (mtype != ::apache::thrift::protocol::T_REPLY) { + iprot_->skip(::apache::thrift::protocol::T_STRUCT); + iprot_->readMessageEnd(); + iprot_->getTransport()->readEnd(); + } + if (fname.compare("exit_emulation") != 0) { + iprot_->skip(::apache::thrift::protocol::T_STRUCT); + iprot_->readMessageEnd(); + iprot_->getTransport()->readEnd(); + + // in a bad state, don't commit + using ::apache::thrift::protocol::TProtocolException; + throw TProtocolException(TProtocolException::INVALID_DATA); + } + BsnesDebugger_exit_emulation_presult result; + result.read(iprot_); + iprot_->readMessageEnd(); + iprot_->getTransport()->readEnd(); + + sentry.commit(); + return; + } + // seqid != rseqid + this->sync_->updatePending(fname, mtype, rseqid); + + // this will temporarily unlock the readMutex, and let other clients get work done + this->sync_->waitForWork(seqid); + } // end while(true) +} + +void BsnesDebuggerConcurrentClient::step_into() +{ + int32_t seqid = send_step_into(); + recv_step_into(seqid); +} + +int32_t BsnesDebuggerConcurrentClient::send_step_into() +{ + int32_t cseqid = this->sync_->generateSeqId(); + ::apache::thrift::async::TConcurrentSendSentry sentry(this->sync_.get()); + oprot_->writeMessageBegin("step_into", ::apache::thrift::protocol::T_CALL, cseqid); + + BsnesDebugger_step_into_pargs args; + args.write(oprot_); + + oprot_->writeMessageEnd(); + oprot_->getTransport()->writeEnd(); + oprot_->getTransport()->flush(); + + sentry.commit(); + return cseqid; +} + +void BsnesDebuggerConcurrentClient::recv_step_into(const int32_t seqid) +{ + + int32_t rseqid = 0; + std::string fname; + ::apache::thrift::protocol::TMessageType mtype; + + // the read mutex gets dropped and reacquired as part of waitForWork() + // The destructor of this sentry wakes up other clients + ::apache::thrift::async::TConcurrentRecvSentry sentry(this->sync_.get(), seqid); + + while(true) { + if(!this->sync_->getPending(fname, mtype, rseqid)) { + iprot_->readMessageBegin(fname, mtype, rseqid); + } + if(seqid == rseqid) { + if (mtype == ::apache::thrift::protocol::T_EXCEPTION) { + ::apache::thrift::TApplicationException x; + x.read(iprot_); + iprot_->readMessageEnd(); + iprot_->getTransport()->readEnd(); + sentry.commit(); + throw x; + } + if (mtype != ::apache::thrift::protocol::T_REPLY) { + iprot_->skip(::apache::thrift::protocol::T_STRUCT); + iprot_->readMessageEnd(); + iprot_->getTransport()->readEnd(); + } + if (fname.compare("step_into") != 0) { + iprot_->skip(::apache::thrift::protocol::T_STRUCT); + iprot_->readMessageEnd(); + iprot_->getTransport()->readEnd(); + + // in a bad state, don't commit + using ::apache::thrift::protocol::TProtocolException; + throw TProtocolException(TProtocolException::INVALID_DATA); + } + BsnesDebugger_step_into_presult result; + result.read(iprot_); + iprot_->readMessageEnd(); + iprot_->getTransport()->readEnd(); + + sentry.commit(); + return; + } + // seqid != rseqid + this->sync_->updatePending(fname, mtype, rseqid); + + // this will temporarily unlock the readMutex, and let other clients get work done + this->sync_->waitForWork(seqid); + } // end while(true) +} + +void BsnesDebuggerConcurrentClient::step_over() +{ + int32_t seqid = send_step_over(); + recv_step_over(seqid); +} + +int32_t BsnesDebuggerConcurrentClient::send_step_over() +{ + int32_t cseqid = this->sync_->generateSeqId(); + ::apache::thrift::async::TConcurrentSendSentry sentry(this->sync_.get()); + oprot_->writeMessageBegin("step_over", ::apache::thrift::protocol::T_CALL, cseqid); + + BsnesDebugger_step_over_pargs args; + args.write(oprot_); + + oprot_->writeMessageEnd(); + oprot_->getTransport()->writeEnd(); + oprot_->getTransport()->flush(); + + sentry.commit(); + return cseqid; +} + +void BsnesDebuggerConcurrentClient::recv_step_over(const int32_t seqid) +{ + + int32_t rseqid = 0; + std::string fname; + ::apache::thrift::protocol::TMessageType mtype; + + // the read mutex gets dropped and reacquired as part of waitForWork() + // The destructor of this sentry wakes up other clients + ::apache::thrift::async::TConcurrentRecvSentry sentry(this->sync_.get(), seqid); + + while(true) { + if(!this->sync_->getPending(fname, mtype, rseqid)) { + iprot_->readMessageBegin(fname, mtype, rseqid); + } + if(seqid == rseqid) { + if (mtype == ::apache::thrift::protocol::T_EXCEPTION) { + ::apache::thrift::TApplicationException x; + x.read(iprot_); + iprot_->readMessageEnd(); + iprot_->getTransport()->readEnd(); + sentry.commit(); + throw x; + } + if (mtype != ::apache::thrift::protocol::T_REPLY) { + iprot_->skip(::apache::thrift::protocol::T_STRUCT); + iprot_->readMessageEnd(); + iprot_->getTransport()->readEnd(); + } + if (fname.compare("step_over") != 0) { + iprot_->skip(::apache::thrift::protocol::T_STRUCT); + iprot_->readMessageEnd(); + iprot_->getTransport()->readEnd(); + + // in a bad state, don't commit + using ::apache::thrift::protocol::TProtocolException; + throw TProtocolException(TProtocolException::INVALID_DATA); + } + BsnesDebugger_step_over_presult result; + result.read(iprot_); + iprot_->readMessageEnd(); + iprot_->getTransport()->readEnd(); + + sentry.commit(); + return; + } + // seqid != rseqid + this->sync_->updatePending(fname, mtype, rseqid); + + // this will temporarily unlock the readMutex, and let other clients get work done + this->sync_->waitForWork(seqid); + } // end while(true) +} + + + diff --git a/bsnes/gen-cpp/BsnesDebugger.h b/bsnes/gen-cpp/BsnesDebugger.h new file mode 100644 index 00000000..3825a66a --- /dev/null +++ b/bsnes/gen-cpp/BsnesDebugger.h @@ -0,0 +1,1604 @@ +/** + * Autogenerated by Thrift Compiler (0.14.0) + * + * DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING + * @generated + */ +#ifndef BsnesDebugger_H +#define BsnesDebugger_H + +#include +#include +#include +#include "debug_proto_types.h" + + + +#ifdef _MSC_VER + #pragma warning( push ) + #pragma warning (disable : 4250 ) //inheriting methods via dominance +#endif + +class BsnesDebuggerIf { + public: + virtual ~BsnesDebuggerIf() {} + virtual int32_t get_cpu_reg(const BsnesRegister::type reg) = 0; + virtual void get_cpu_regs(BsnesRegisters& _return) = 0; + virtual void set_cpu_reg(const BsnesRegister::type reg, const int32_t value) = 0; + virtual void read_memory(std::string& _return, const DbgMemorySource::type src, const int32_t address, const int32_t size) = 0; + virtual void write_memory(const DbgMemorySource::type src, const int32_t address, const std::string& data) = 0; + virtual void add_breakpoint(const DbgBreakpoint& bpt) = 0; + virtual void del_breakpoint(const DbgBreakpoint& bpt) = 0; + virtual void pause() = 0; + virtual void resume() = 0; + virtual void start_emulation() = 0; + virtual void exit_emulation() = 0; + virtual void step_into() = 0; + virtual void step_over() = 0; +}; + +class BsnesDebuggerIfFactory { + public: + typedef BsnesDebuggerIf Handler; + + virtual ~BsnesDebuggerIfFactory() {} + + virtual BsnesDebuggerIf* getHandler(const ::apache::thrift::TConnectionInfo& connInfo) = 0; + virtual void releaseHandler(BsnesDebuggerIf* /* handler */) = 0; +}; + +class BsnesDebuggerIfSingletonFactory : virtual public BsnesDebuggerIfFactory { + public: + BsnesDebuggerIfSingletonFactory(const ::std::shared_ptr& iface) : iface_(iface) {} + virtual ~BsnesDebuggerIfSingletonFactory() {} + + virtual BsnesDebuggerIf* getHandler(const ::apache::thrift::TConnectionInfo&) { + return iface_.get(); + } + virtual void releaseHandler(BsnesDebuggerIf* /* handler */) {} + + protected: + ::std::shared_ptr iface_; +}; + +class BsnesDebuggerNull : virtual public BsnesDebuggerIf { + public: + virtual ~BsnesDebuggerNull() {} + int32_t get_cpu_reg(const BsnesRegister::type /* reg */) { + int32_t _return = 0; + return _return; + } + void get_cpu_regs(BsnesRegisters& /* _return */) { + return; + } + void set_cpu_reg(const BsnesRegister::type /* reg */, const int32_t /* value */) { + return; + } + void read_memory(std::string& /* _return */, const DbgMemorySource::type /* src */, const int32_t /* address */, const int32_t /* size */) { + return; + } + void write_memory(const DbgMemorySource::type /* src */, const int32_t /* address */, const std::string& /* data */) { + return; + } + void add_breakpoint(const DbgBreakpoint& /* bpt */) { + return; + } + void del_breakpoint(const DbgBreakpoint& /* bpt */) { + return; + } + void pause() { + return; + } + void resume() { + return; + } + void start_emulation() { + return; + } + void exit_emulation() { + return; + } + void step_into() { + return; + } + void step_over() { + return; + } +}; + +typedef struct _BsnesDebugger_get_cpu_reg_args__isset { + _BsnesDebugger_get_cpu_reg_args__isset() : reg(false) {} + bool reg :1; +} _BsnesDebugger_get_cpu_reg_args__isset; + +class BsnesDebugger_get_cpu_reg_args { + public: + + BsnesDebugger_get_cpu_reg_args(const BsnesDebugger_get_cpu_reg_args&); + BsnesDebugger_get_cpu_reg_args& operator=(const BsnesDebugger_get_cpu_reg_args&); + BsnesDebugger_get_cpu_reg_args() : reg((BsnesRegister::type)0) { + } + + virtual ~BsnesDebugger_get_cpu_reg_args() noexcept; + /** + * + * @see BsnesRegister + */ + BsnesRegister::type reg; + + _BsnesDebugger_get_cpu_reg_args__isset __isset; + + void __set_reg(const BsnesRegister::type val); + + bool operator == (const BsnesDebugger_get_cpu_reg_args & rhs) const + { + if (!(reg == rhs.reg)) + return false; + return true; + } + bool operator != (const BsnesDebugger_get_cpu_reg_args &rhs) const { + return !(*this == rhs); + } + + bool operator < (const BsnesDebugger_get_cpu_reg_args & ) const; + + uint32_t read(::apache::thrift::protocol::TProtocol* iprot); + uint32_t write(::apache::thrift::protocol::TProtocol* oprot) const; + +}; + + +class BsnesDebugger_get_cpu_reg_pargs { + public: + + + virtual ~BsnesDebugger_get_cpu_reg_pargs() noexcept; + /** + * + * @see BsnesRegister + */ + const BsnesRegister::type* reg; + + uint32_t write(::apache::thrift::protocol::TProtocol* oprot) const; + +}; + +typedef struct _BsnesDebugger_get_cpu_reg_result__isset { + _BsnesDebugger_get_cpu_reg_result__isset() : success(false) {} + bool success :1; +} _BsnesDebugger_get_cpu_reg_result__isset; + +class BsnesDebugger_get_cpu_reg_result { + public: + + BsnesDebugger_get_cpu_reg_result(const BsnesDebugger_get_cpu_reg_result&); + BsnesDebugger_get_cpu_reg_result& operator=(const BsnesDebugger_get_cpu_reg_result&); + BsnesDebugger_get_cpu_reg_result() : success(0) { + } + + virtual ~BsnesDebugger_get_cpu_reg_result() noexcept; + int32_t success; + + _BsnesDebugger_get_cpu_reg_result__isset __isset; + + void __set_success(const int32_t val); + + bool operator == (const BsnesDebugger_get_cpu_reg_result & rhs) const + { + if (!(success == rhs.success)) + return false; + return true; + } + bool operator != (const BsnesDebugger_get_cpu_reg_result &rhs) const { + return !(*this == rhs); + } + + bool operator < (const BsnesDebugger_get_cpu_reg_result & ) const; + + uint32_t read(::apache::thrift::protocol::TProtocol* iprot); + uint32_t write(::apache::thrift::protocol::TProtocol* oprot) const; + +}; + +typedef struct _BsnesDebugger_get_cpu_reg_presult__isset { + _BsnesDebugger_get_cpu_reg_presult__isset() : success(false) {} + bool success :1; +} _BsnesDebugger_get_cpu_reg_presult__isset; + +class BsnesDebugger_get_cpu_reg_presult { + public: + + + virtual ~BsnesDebugger_get_cpu_reg_presult() noexcept; + int32_t* success; + + _BsnesDebugger_get_cpu_reg_presult__isset __isset; + + uint32_t read(::apache::thrift::protocol::TProtocol* iprot); + +}; + + +class BsnesDebugger_get_cpu_regs_args { + public: + + BsnesDebugger_get_cpu_regs_args(const BsnesDebugger_get_cpu_regs_args&); + BsnesDebugger_get_cpu_regs_args& operator=(const BsnesDebugger_get_cpu_regs_args&); + BsnesDebugger_get_cpu_regs_args() { + } + + virtual ~BsnesDebugger_get_cpu_regs_args() noexcept; + + bool operator == (const BsnesDebugger_get_cpu_regs_args & /* rhs */) const + { + return true; + } + bool operator != (const BsnesDebugger_get_cpu_regs_args &rhs) const { + return !(*this == rhs); + } + + bool operator < (const BsnesDebugger_get_cpu_regs_args & ) const; + + uint32_t read(::apache::thrift::protocol::TProtocol* iprot); + uint32_t write(::apache::thrift::protocol::TProtocol* oprot) const; + +}; + + +class BsnesDebugger_get_cpu_regs_pargs { + public: + + + virtual ~BsnesDebugger_get_cpu_regs_pargs() noexcept; + + uint32_t write(::apache::thrift::protocol::TProtocol* oprot) const; + +}; + +typedef struct _BsnesDebugger_get_cpu_regs_result__isset { + _BsnesDebugger_get_cpu_regs_result__isset() : success(false) {} + bool success :1; +} _BsnesDebugger_get_cpu_regs_result__isset; + +class BsnesDebugger_get_cpu_regs_result { + public: + + BsnesDebugger_get_cpu_regs_result(const BsnesDebugger_get_cpu_regs_result&); + BsnesDebugger_get_cpu_regs_result& operator=(const BsnesDebugger_get_cpu_regs_result&); + BsnesDebugger_get_cpu_regs_result() { + } + + virtual ~BsnesDebugger_get_cpu_regs_result() noexcept; + BsnesRegisters success; + + _BsnesDebugger_get_cpu_regs_result__isset __isset; + + void __set_success(const BsnesRegisters& val); + + bool operator == (const BsnesDebugger_get_cpu_regs_result & rhs) const + { + if (!(success == rhs.success)) + return false; + return true; + } + bool operator != (const BsnesDebugger_get_cpu_regs_result &rhs) const { + return !(*this == rhs); + } + + bool operator < (const BsnesDebugger_get_cpu_regs_result & ) const; + + uint32_t read(::apache::thrift::protocol::TProtocol* iprot); + uint32_t write(::apache::thrift::protocol::TProtocol* oprot) const; + +}; + +typedef struct _BsnesDebugger_get_cpu_regs_presult__isset { + _BsnesDebugger_get_cpu_regs_presult__isset() : success(false) {} + bool success :1; +} _BsnesDebugger_get_cpu_regs_presult__isset; + +class BsnesDebugger_get_cpu_regs_presult { + public: + + + virtual ~BsnesDebugger_get_cpu_regs_presult() noexcept; + BsnesRegisters* success; + + _BsnesDebugger_get_cpu_regs_presult__isset __isset; + + uint32_t read(::apache::thrift::protocol::TProtocol* iprot); + +}; + +typedef struct _BsnesDebugger_set_cpu_reg_args__isset { + _BsnesDebugger_set_cpu_reg_args__isset() : reg(false), value(false) {} + bool reg :1; + bool value :1; +} _BsnesDebugger_set_cpu_reg_args__isset; + +class BsnesDebugger_set_cpu_reg_args { + public: + + BsnesDebugger_set_cpu_reg_args(const BsnesDebugger_set_cpu_reg_args&); + BsnesDebugger_set_cpu_reg_args& operator=(const BsnesDebugger_set_cpu_reg_args&); + BsnesDebugger_set_cpu_reg_args() : reg((BsnesRegister::type)0), value(0) { + } + + virtual ~BsnesDebugger_set_cpu_reg_args() noexcept; + /** + * + * @see BsnesRegister + */ + BsnesRegister::type reg; + int32_t value; + + _BsnesDebugger_set_cpu_reg_args__isset __isset; + + void __set_reg(const BsnesRegister::type val); + + void __set_value(const int32_t val); + + bool operator == (const BsnesDebugger_set_cpu_reg_args & rhs) const + { + if (!(reg == rhs.reg)) + return false; + if (!(value == rhs.value)) + return false; + return true; + } + bool operator != (const BsnesDebugger_set_cpu_reg_args &rhs) const { + return !(*this == rhs); + } + + bool operator < (const BsnesDebugger_set_cpu_reg_args & ) const; + + uint32_t read(::apache::thrift::protocol::TProtocol* iprot); + uint32_t write(::apache::thrift::protocol::TProtocol* oprot) const; + +}; + + +class BsnesDebugger_set_cpu_reg_pargs { + public: + + + virtual ~BsnesDebugger_set_cpu_reg_pargs() noexcept; + /** + * + * @see BsnesRegister + */ + const BsnesRegister::type* reg; + const int32_t* value; + + uint32_t write(::apache::thrift::protocol::TProtocol* oprot) const; + +}; + + +class BsnesDebugger_set_cpu_reg_result { + public: + + BsnesDebugger_set_cpu_reg_result(const BsnesDebugger_set_cpu_reg_result&); + BsnesDebugger_set_cpu_reg_result& operator=(const BsnesDebugger_set_cpu_reg_result&); + BsnesDebugger_set_cpu_reg_result() { + } + + virtual ~BsnesDebugger_set_cpu_reg_result() noexcept; + + bool operator == (const BsnesDebugger_set_cpu_reg_result & /* rhs */) const + { + return true; + } + bool operator != (const BsnesDebugger_set_cpu_reg_result &rhs) const { + return !(*this == rhs); + } + + bool operator < (const BsnesDebugger_set_cpu_reg_result & ) const; + + uint32_t read(::apache::thrift::protocol::TProtocol* iprot); + uint32_t write(::apache::thrift::protocol::TProtocol* oprot) const; + +}; + + +class BsnesDebugger_set_cpu_reg_presult { + public: + + + virtual ~BsnesDebugger_set_cpu_reg_presult() noexcept; + + uint32_t read(::apache::thrift::protocol::TProtocol* iprot); + +}; + +typedef struct _BsnesDebugger_read_memory_args__isset { + _BsnesDebugger_read_memory_args__isset() : src(false), address(false), size(false) {} + bool src :1; + bool address :1; + bool size :1; +} _BsnesDebugger_read_memory_args__isset; + +class BsnesDebugger_read_memory_args { + public: + + BsnesDebugger_read_memory_args(const BsnesDebugger_read_memory_args&); + BsnesDebugger_read_memory_args& operator=(const BsnesDebugger_read_memory_args&); + BsnesDebugger_read_memory_args() : src((DbgMemorySource::type)0), address(0), size(0) { + } + + virtual ~BsnesDebugger_read_memory_args() noexcept; + /** + * + * @see DbgMemorySource + */ + DbgMemorySource::type src; + int32_t address; + int32_t size; + + _BsnesDebugger_read_memory_args__isset __isset; + + void __set_src(const DbgMemorySource::type val); + + void __set_address(const int32_t val); + + void __set_size(const int32_t val); + + bool operator == (const BsnesDebugger_read_memory_args & rhs) const + { + if (!(src == rhs.src)) + return false; + if (!(address == rhs.address)) + return false; + if (!(size == rhs.size)) + return false; + return true; + } + bool operator != (const BsnesDebugger_read_memory_args &rhs) const { + return !(*this == rhs); + } + + bool operator < (const BsnesDebugger_read_memory_args & ) const; + + uint32_t read(::apache::thrift::protocol::TProtocol* iprot); + uint32_t write(::apache::thrift::protocol::TProtocol* oprot) const; + +}; + + +class BsnesDebugger_read_memory_pargs { + public: + + + virtual ~BsnesDebugger_read_memory_pargs() noexcept; + /** + * + * @see DbgMemorySource + */ + const DbgMemorySource::type* src; + const int32_t* address; + const int32_t* size; + + uint32_t write(::apache::thrift::protocol::TProtocol* oprot) const; + +}; + +typedef struct _BsnesDebugger_read_memory_result__isset { + _BsnesDebugger_read_memory_result__isset() : success(false) {} + bool success :1; +} _BsnesDebugger_read_memory_result__isset; + +class BsnesDebugger_read_memory_result { + public: + + BsnesDebugger_read_memory_result(const BsnesDebugger_read_memory_result&); + BsnesDebugger_read_memory_result& operator=(const BsnesDebugger_read_memory_result&); + BsnesDebugger_read_memory_result() : success() { + } + + virtual ~BsnesDebugger_read_memory_result() noexcept; + std::string success; + + _BsnesDebugger_read_memory_result__isset __isset; + + void __set_success(const std::string& val); + + bool operator == (const BsnesDebugger_read_memory_result & rhs) const + { + if (!(success == rhs.success)) + return false; + return true; + } + bool operator != (const BsnesDebugger_read_memory_result &rhs) const { + return !(*this == rhs); + } + + bool operator < (const BsnesDebugger_read_memory_result & ) const; + + uint32_t read(::apache::thrift::protocol::TProtocol* iprot); + uint32_t write(::apache::thrift::protocol::TProtocol* oprot) const; + +}; + +typedef struct _BsnesDebugger_read_memory_presult__isset { + _BsnesDebugger_read_memory_presult__isset() : success(false) {} + bool success :1; +} _BsnesDebugger_read_memory_presult__isset; + +class BsnesDebugger_read_memory_presult { + public: + + + virtual ~BsnesDebugger_read_memory_presult() noexcept; + std::string* success; + + _BsnesDebugger_read_memory_presult__isset __isset; + + uint32_t read(::apache::thrift::protocol::TProtocol* iprot); + +}; + +typedef struct _BsnesDebugger_write_memory_args__isset { + _BsnesDebugger_write_memory_args__isset() : src(false), address(false), data(false) {} + bool src :1; + bool address :1; + bool data :1; +} _BsnesDebugger_write_memory_args__isset; + +class BsnesDebugger_write_memory_args { + public: + + BsnesDebugger_write_memory_args(const BsnesDebugger_write_memory_args&); + BsnesDebugger_write_memory_args& operator=(const BsnesDebugger_write_memory_args&); + BsnesDebugger_write_memory_args() : src((DbgMemorySource::type)0), address(0), data() { + } + + virtual ~BsnesDebugger_write_memory_args() noexcept; + /** + * + * @see DbgMemorySource + */ + DbgMemorySource::type src; + int32_t address; + std::string data; + + _BsnesDebugger_write_memory_args__isset __isset; + + void __set_src(const DbgMemorySource::type val); + + void __set_address(const int32_t val); + + void __set_data(const std::string& val); + + bool operator == (const BsnesDebugger_write_memory_args & rhs) const + { + if (!(src == rhs.src)) + return false; + if (!(address == rhs.address)) + return false; + if (!(data == rhs.data)) + return false; + return true; + } + bool operator != (const BsnesDebugger_write_memory_args &rhs) const { + return !(*this == rhs); + } + + bool operator < (const BsnesDebugger_write_memory_args & ) const; + + uint32_t read(::apache::thrift::protocol::TProtocol* iprot); + uint32_t write(::apache::thrift::protocol::TProtocol* oprot) const; + +}; + + +class BsnesDebugger_write_memory_pargs { + public: + + + virtual ~BsnesDebugger_write_memory_pargs() noexcept; + /** + * + * @see DbgMemorySource + */ + const DbgMemorySource::type* src; + const int32_t* address; + const std::string* data; + + uint32_t write(::apache::thrift::protocol::TProtocol* oprot) const; + +}; + + +class BsnesDebugger_write_memory_result { + public: + + BsnesDebugger_write_memory_result(const BsnesDebugger_write_memory_result&); + BsnesDebugger_write_memory_result& operator=(const BsnesDebugger_write_memory_result&); + BsnesDebugger_write_memory_result() { + } + + virtual ~BsnesDebugger_write_memory_result() noexcept; + + bool operator == (const BsnesDebugger_write_memory_result & /* rhs */) const + { + return true; + } + bool operator != (const BsnesDebugger_write_memory_result &rhs) const { + return !(*this == rhs); + } + + bool operator < (const BsnesDebugger_write_memory_result & ) const; + + uint32_t read(::apache::thrift::protocol::TProtocol* iprot); + uint32_t write(::apache::thrift::protocol::TProtocol* oprot) const; + +}; + + +class BsnesDebugger_write_memory_presult { + public: + + + virtual ~BsnesDebugger_write_memory_presult() noexcept; + + uint32_t read(::apache::thrift::protocol::TProtocol* iprot); + +}; + +typedef struct _BsnesDebugger_add_breakpoint_args__isset { + _BsnesDebugger_add_breakpoint_args__isset() : bpt(false) {} + bool bpt :1; +} _BsnesDebugger_add_breakpoint_args__isset; + +class BsnesDebugger_add_breakpoint_args { + public: + + BsnesDebugger_add_breakpoint_args(const BsnesDebugger_add_breakpoint_args&); + BsnesDebugger_add_breakpoint_args& operator=(const BsnesDebugger_add_breakpoint_args&); + BsnesDebugger_add_breakpoint_args() { + } + + virtual ~BsnesDebugger_add_breakpoint_args() noexcept; + DbgBreakpoint bpt; + + _BsnesDebugger_add_breakpoint_args__isset __isset; + + void __set_bpt(const DbgBreakpoint& val); + + bool operator == (const BsnesDebugger_add_breakpoint_args & rhs) const + { + if (!(bpt == rhs.bpt)) + return false; + return true; + } + bool operator != (const BsnesDebugger_add_breakpoint_args &rhs) const { + return !(*this == rhs); + } + + bool operator < (const BsnesDebugger_add_breakpoint_args & ) const; + + uint32_t read(::apache::thrift::protocol::TProtocol* iprot); + uint32_t write(::apache::thrift::protocol::TProtocol* oprot) const; + +}; + + +class BsnesDebugger_add_breakpoint_pargs { + public: + + + virtual ~BsnesDebugger_add_breakpoint_pargs() noexcept; + const DbgBreakpoint* bpt; + + uint32_t write(::apache::thrift::protocol::TProtocol* oprot) const; + +}; + + +class BsnesDebugger_add_breakpoint_result { + public: + + BsnesDebugger_add_breakpoint_result(const BsnesDebugger_add_breakpoint_result&); + BsnesDebugger_add_breakpoint_result& operator=(const BsnesDebugger_add_breakpoint_result&); + BsnesDebugger_add_breakpoint_result() { + } + + virtual ~BsnesDebugger_add_breakpoint_result() noexcept; + + bool operator == (const BsnesDebugger_add_breakpoint_result & /* rhs */) const + { + return true; + } + bool operator != (const BsnesDebugger_add_breakpoint_result &rhs) const { + return !(*this == rhs); + } + + bool operator < (const BsnesDebugger_add_breakpoint_result & ) const; + + uint32_t read(::apache::thrift::protocol::TProtocol* iprot); + uint32_t write(::apache::thrift::protocol::TProtocol* oprot) const; + +}; + + +class BsnesDebugger_add_breakpoint_presult { + public: + + + virtual ~BsnesDebugger_add_breakpoint_presult() noexcept; + + uint32_t read(::apache::thrift::protocol::TProtocol* iprot); + +}; + +typedef struct _BsnesDebugger_del_breakpoint_args__isset { + _BsnesDebugger_del_breakpoint_args__isset() : bpt(false) {} + bool bpt :1; +} _BsnesDebugger_del_breakpoint_args__isset; + +class BsnesDebugger_del_breakpoint_args { + public: + + BsnesDebugger_del_breakpoint_args(const BsnesDebugger_del_breakpoint_args&); + BsnesDebugger_del_breakpoint_args& operator=(const BsnesDebugger_del_breakpoint_args&); + BsnesDebugger_del_breakpoint_args() { + } + + virtual ~BsnesDebugger_del_breakpoint_args() noexcept; + DbgBreakpoint bpt; + + _BsnesDebugger_del_breakpoint_args__isset __isset; + + void __set_bpt(const DbgBreakpoint& val); + + bool operator == (const BsnesDebugger_del_breakpoint_args & rhs) const + { + if (!(bpt == rhs.bpt)) + return false; + return true; + } + bool operator != (const BsnesDebugger_del_breakpoint_args &rhs) const { + return !(*this == rhs); + } + + bool operator < (const BsnesDebugger_del_breakpoint_args & ) const; + + uint32_t read(::apache::thrift::protocol::TProtocol* iprot); + uint32_t write(::apache::thrift::protocol::TProtocol* oprot) const; + +}; + + +class BsnesDebugger_del_breakpoint_pargs { + public: + + + virtual ~BsnesDebugger_del_breakpoint_pargs() noexcept; + const DbgBreakpoint* bpt; + + uint32_t write(::apache::thrift::protocol::TProtocol* oprot) const; + +}; + + +class BsnesDebugger_del_breakpoint_result { + public: + + BsnesDebugger_del_breakpoint_result(const BsnesDebugger_del_breakpoint_result&); + BsnesDebugger_del_breakpoint_result& operator=(const BsnesDebugger_del_breakpoint_result&); + BsnesDebugger_del_breakpoint_result() { + } + + virtual ~BsnesDebugger_del_breakpoint_result() noexcept; + + bool operator == (const BsnesDebugger_del_breakpoint_result & /* rhs */) const + { + return true; + } + bool operator != (const BsnesDebugger_del_breakpoint_result &rhs) const { + return !(*this == rhs); + } + + bool operator < (const BsnesDebugger_del_breakpoint_result & ) const; + + uint32_t read(::apache::thrift::protocol::TProtocol* iprot); + uint32_t write(::apache::thrift::protocol::TProtocol* oprot) const; + +}; + + +class BsnesDebugger_del_breakpoint_presult { + public: + + + virtual ~BsnesDebugger_del_breakpoint_presult() noexcept; + + uint32_t read(::apache::thrift::protocol::TProtocol* iprot); + +}; + + +class BsnesDebugger_pause_args { + public: + + BsnesDebugger_pause_args(const BsnesDebugger_pause_args&); + BsnesDebugger_pause_args& operator=(const BsnesDebugger_pause_args&); + BsnesDebugger_pause_args() { + } + + virtual ~BsnesDebugger_pause_args() noexcept; + + bool operator == (const BsnesDebugger_pause_args & /* rhs */) const + { + return true; + } + bool operator != (const BsnesDebugger_pause_args &rhs) const { + return !(*this == rhs); + } + + bool operator < (const BsnesDebugger_pause_args & ) const; + + uint32_t read(::apache::thrift::protocol::TProtocol* iprot); + uint32_t write(::apache::thrift::protocol::TProtocol* oprot) const; + +}; + + +class BsnesDebugger_pause_pargs { + public: + + + virtual ~BsnesDebugger_pause_pargs() noexcept; + + uint32_t write(::apache::thrift::protocol::TProtocol* oprot) const; + +}; + + +class BsnesDebugger_pause_result { + public: + + BsnesDebugger_pause_result(const BsnesDebugger_pause_result&); + BsnesDebugger_pause_result& operator=(const BsnesDebugger_pause_result&); + BsnesDebugger_pause_result() { + } + + virtual ~BsnesDebugger_pause_result() noexcept; + + bool operator == (const BsnesDebugger_pause_result & /* rhs */) const + { + return true; + } + bool operator != (const BsnesDebugger_pause_result &rhs) const { + return !(*this == rhs); + } + + bool operator < (const BsnesDebugger_pause_result & ) const; + + uint32_t read(::apache::thrift::protocol::TProtocol* iprot); + uint32_t write(::apache::thrift::protocol::TProtocol* oprot) const; + +}; + + +class BsnesDebugger_pause_presult { + public: + + + virtual ~BsnesDebugger_pause_presult() noexcept; + + uint32_t read(::apache::thrift::protocol::TProtocol* iprot); + +}; + + +class BsnesDebugger_resume_args { + public: + + BsnesDebugger_resume_args(const BsnesDebugger_resume_args&); + BsnesDebugger_resume_args& operator=(const BsnesDebugger_resume_args&); + BsnesDebugger_resume_args() { + } + + virtual ~BsnesDebugger_resume_args() noexcept; + + bool operator == (const BsnesDebugger_resume_args & /* rhs */) const + { + return true; + } + bool operator != (const BsnesDebugger_resume_args &rhs) const { + return !(*this == rhs); + } + + bool operator < (const BsnesDebugger_resume_args & ) const; + + uint32_t read(::apache::thrift::protocol::TProtocol* iprot); + uint32_t write(::apache::thrift::protocol::TProtocol* oprot) const; + +}; + + +class BsnesDebugger_resume_pargs { + public: + + + virtual ~BsnesDebugger_resume_pargs() noexcept; + + uint32_t write(::apache::thrift::protocol::TProtocol* oprot) const; + +}; + + +class BsnesDebugger_resume_result { + public: + + BsnesDebugger_resume_result(const BsnesDebugger_resume_result&); + BsnesDebugger_resume_result& operator=(const BsnesDebugger_resume_result&); + BsnesDebugger_resume_result() { + } + + virtual ~BsnesDebugger_resume_result() noexcept; + + bool operator == (const BsnesDebugger_resume_result & /* rhs */) const + { + return true; + } + bool operator != (const BsnesDebugger_resume_result &rhs) const { + return !(*this == rhs); + } + + bool operator < (const BsnesDebugger_resume_result & ) const; + + uint32_t read(::apache::thrift::protocol::TProtocol* iprot); + uint32_t write(::apache::thrift::protocol::TProtocol* oprot) const; + +}; + + +class BsnesDebugger_resume_presult { + public: + + + virtual ~BsnesDebugger_resume_presult() noexcept; + + uint32_t read(::apache::thrift::protocol::TProtocol* iprot); + +}; + + +class BsnesDebugger_start_emulation_args { + public: + + BsnesDebugger_start_emulation_args(const BsnesDebugger_start_emulation_args&); + BsnesDebugger_start_emulation_args& operator=(const BsnesDebugger_start_emulation_args&); + BsnesDebugger_start_emulation_args() { + } + + virtual ~BsnesDebugger_start_emulation_args() noexcept; + + bool operator == (const BsnesDebugger_start_emulation_args & /* rhs */) const + { + return true; + } + bool operator != (const BsnesDebugger_start_emulation_args &rhs) const { + return !(*this == rhs); + } + + bool operator < (const BsnesDebugger_start_emulation_args & ) const; + + uint32_t read(::apache::thrift::protocol::TProtocol* iprot); + uint32_t write(::apache::thrift::protocol::TProtocol* oprot) const; + +}; + + +class BsnesDebugger_start_emulation_pargs { + public: + + + virtual ~BsnesDebugger_start_emulation_pargs() noexcept; + + uint32_t write(::apache::thrift::protocol::TProtocol* oprot) const; + +}; + + +class BsnesDebugger_start_emulation_result { + public: + + BsnesDebugger_start_emulation_result(const BsnesDebugger_start_emulation_result&); + BsnesDebugger_start_emulation_result& operator=(const BsnesDebugger_start_emulation_result&); + BsnesDebugger_start_emulation_result() { + } + + virtual ~BsnesDebugger_start_emulation_result() noexcept; + + bool operator == (const BsnesDebugger_start_emulation_result & /* rhs */) const + { + return true; + } + bool operator != (const BsnesDebugger_start_emulation_result &rhs) const { + return !(*this == rhs); + } + + bool operator < (const BsnesDebugger_start_emulation_result & ) const; + + uint32_t read(::apache::thrift::protocol::TProtocol* iprot); + uint32_t write(::apache::thrift::protocol::TProtocol* oprot) const; + +}; + + +class BsnesDebugger_start_emulation_presult { + public: + + + virtual ~BsnesDebugger_start_emulation_presult() noexcept; + + uint32_t read(::apache::thrift::protocol::TProtocol* iprot); + +}; + + +class BsnesDebugger_exit_emulation_args { + public: + + BsnesDebugger_exit_emulation_args(const BsnesDebugger_exit_emulation_args&); + BsnesDebugger_exit_emulation_args& operator=(const BsnesDebugger_exit_emulation_args&); + BsnesDebugger_exit_emulation_args() { + } + + virtual ~BsnesDebugger_exit_emulation_args() noexcept; + + bool operator == (const BsnesDebugger_exit_emulation_args & /* rhs */) const + { + return true; + } + bool operator != (const BsnesDebugger_exit_emulation_args &rhs) const { + return !(*this == rhs); + } + + bool operator < (const BsnesDebugger_exit_emulation_args & ) const; + + uint32_t read(::apache::thrift::protocol::TProtocol* iprot); + uint32_t write(::apache::thrift::protocol::TProtocol* oprot) const; + +}; + + +class BsnesDebugger_exit_emulation_pargs { + public: + + + virtual ~BsnesDebugger_exit_emulation_pargs() noexcept; + + uint32_t write(::apache::thrift::protocol::TProtocol* oprot) const; + +}; + + +class BsnesDebugger_exit_emulation_result { + public: + + BsnesDebugger_exit_emulation_result(const BsnesDebugger_exit_emulation_result&); + BsnesDebugger_exit_emulation_result& operator=(const BsnesDebugger_exit_emulation_result&); + BsnesDebugger_exit_emulation_result() { + } + + virtual ~BsnesDebugger_exit_emulation_result() noexcept; + + bool operator == (const BsnesDebugger_exit_emulation_result & /* rhs */) const + { + return true; + } + bool operator != (const BsnesDebugger_exit_emulation_result &rhs) const { + return !(*this == rhs); + } + + bool operator < (const BsnesDebugger_exit_emulation_result & ) const; + + uint32_t read(::apache::thrift::protocol::TProtocol* iprot); + uint32_t write(::apache::thrift::protocol::TProtocol* oprot) const; + +}; + + +class BsnesDebugger_exit_emulation_presult { + public: + + + virtual ~BsnesDebugger_exit_emulation_presult() noexcept; + + uint32_t read(::apache::thrift::protocol::TProtocol* iprot); + +}; + + +class BsnesDebugger_step_into_args { + public: + + BsnesDebugger_step_into_args(const BsnesDebugger_step_into_args&); + BsnesDebugger_step_into_args& operator=(const BsnesDebugger_step_into_args&); + BsnesDebugger_step_into_args() { + } + + virtual ~BsnesDebugger_step_into_args() noexcept; + + bool operator == (const BsnesDebugger_step_into_args & /* rhs */) const + { + return true; + } + bool operator != (const BsnesDebugger_step_into_args &rhs) const { + return !(*this == rhs); + } + + bool operator < (const BsnesDebugger_step_into_args & ) const; + + uint32_t read(::apache::thrift::protocol::TProtocol* iprot); + uint32_t write(::apache::thrift::protocol::TProtocol* oprot) const; + +}; + + +class BsnesDebugger_step_into_pargs { + public: + + + virtual ~BsnesDebugger_step_into_pargs() noexcept; + + uint32_t write(::apache::thrift::protocol::TProtocol* oprot) const; + +}; + + +class BsnesDebugger_step_into_result { + public: + + BsnesDebugger_step_into_result(const BsnesDebugger_step_into_result&); + BsnesDebugger_step_into_result& operator=(const BsnesDebugger_step_into_result&); + BsnesDebugger_step_into_result() { + } + + virtual ~BsnesDebugger_step_into_result() noexcept; + + bool operator == (const BsnesDebugger_step_into_result & /* rhs */) const + { + return true; + } + bool operator != (const BsnesDebugger_step_into_result &rhs) const { + return !(*this == rhs); + } + + bool operator < (const BsnesDebugger_step_into_result & ) const; + + uint32_t read(::apache::thrift::protocol::TProtocol* iprot); + uint32_t write(::apache::thrift::protocol::TProtocol* oprot) const; + +}; + + +class BsnesDebugger_step_into_presult { + public: + + + virtual ~BsnesDebugger_step_into_presult() noexcept; + + uint32_t read(::apache::thrift::protocol::TProtocol* iprot); + +}; + + +class BsnesDebugger_step_over_args { + public: + + BsnesDebugger_step_over_args(const BsnesDebugger_step_over_args&); + BsnesDebugger_step_over_args& operator=(const BsnesDebugger_step_over_args&); + BsnesDebugger_step_over_args() { + } + + virtual ~BsnesDebugger_step_over_args() noexcept; + + bool operator == (const BsnesDebugger_step_over_args & /* rhs */) const + { + return true; + } + bool operator != (const BsnesDebugger_step_over_args &rhs) const { + return !(*this == rhs); + } + + bool operator < (const BsnesDebugger_step_over_args & ) const; + + uint32_t read(::apache::thrift::protocol::TProtocol* iprot); + uint32_t write(::apache::thrift::protocol::TProtocol* oprot) const; + +}; + + +class BsnesDebugger_step_over_pargs { + public: + + + virtual ~BsnesDebugger_step_over_pargs() noexcept; + + uint32_t write(::apache::thrift::protocol::TProtocol* oprot) const; + +}; + + +class BsnesDebugger_step_over_result { + public: + + BsnesDebugger_step_over_result(const BsnesDebugger_step_over_result&); + BsnesDebugger_step_over_result& operator=(const BsnesDebugger_step_over_result&); + BsnesDebugger_step_over_result() { + } + + virtual ~BsnesDebugger_step_over_result() noexcept; + + bool operator == (const BsnesDebugger_step_over_result & /* rhs */) const + { + return true; + } + bool operator != (const BsnesDebugger_step_over_result &rhs) const { + return !(*this == rhs); + } + + bool operator < (const BsnesDebugger_step_over_result & ) const; + + uint32_t read(::apache::thrift::protocol::TProtocol* iprot); + uint32_t write(::apache::thrift::protocol::TProtocol* oprot) const; + +}; + + +class BsnesDebugger_step_over_presult { + public: + + + virtual ~BsnesDebugger_step_over_presult() noexcept; + + uint32_t read(::apache::thrift::protocol::TProtocol* iprot); + +}; + +class BsnesDebuggerClient : virtual public BsnesDebuggerIf { + public: + BsnesDebuggerClient(std::shared_ptr< ::apache::thrift::protocol::TProtocol> prot) { + setProtocol(prot); + } + BsnesDebuggerClient(std::shared_ptr< ::apache::thrift::protocol::TProtocol> iprot, std::shared_ptr< ::apache::thrift::protocol::TProtocol> oprot) { + setProtocol(iprot,oprot); + } + private: + void setProtocol(std::shared_ptr< ::apache::thrift::protocol::TProtocol> prot) { + setProtocol(prot,prot); + } + void setProtocol(std::shared_ptr< ::apache::thrift::protocol::TProtocol> iprot, std::shared_ptr< ::apache::thrift::protocol::TProtocol> oprot) { + piprot_=iprot; + poprot_=oprot; + iprot_ = iprot.get(); + oprot_ = oprot.get(); + } + public: + std::shared_ptr< ::apache::thrift::protocol::TProtocol> getInputProtocol() { + return piprot_; + } + std::shared_ptr< ::apache::thrift::protocol::TProtocol> getOutputProtocol() { + return poprot_; + } + int32_t get_cpu_reg(const BsnesRegister::type reg); + void send_get_cpu_reg(const BsnesRegister::type reg); + int32_t recv_get_cpu_reg(); + void get_cpu_regs(BsnesRegisters& _return); + void send_get_cpu_regs(); + void recv_get_cpu_regs(BsnesRegisters& _return); + void set_cpu_reg(const BsnesRegister::type reg, const int32_t value); + void send_set_cpu_reg(const BsnesRegister::type reg, const int32_t value); + void recv_set_cpu_reg(); + void read_memory(std::string& _return, const DbgMemorySource::type src, const int32_t address, const int32_t size); + void send_read_memory(const DbgMemorySource::type src, const int32_t address, const int32_t size); + void recv_read_memory(std::string& _return); + void write_memory(const DbgMemorySource::type src, const int32_t address, const std::string& data); + void send_write_memory(const DbgMemorySource::type src, const int32_t address, const std::string& data); + void recv_write_memory(); + void add_breakpoint(const DbgBreakpoint& bpt); + void send_add_breakpoint(const DbgBreakpoint& bpt); + void recv_add_breakpoint(); + void del_breakpoint(const DbgBreakpoint& bpt); + void send_del_breakpoint(const DbgBreakpoint& bpt); + void recv_del_breakpoint(); + void pause(); + void send_pause(); + void recv_pause(); + void resume(); + void send_resume(); + void recv_resume(); + void start_emulation(); + void send_start_emulation(); + void recv_start_emulation(); + void exit_emulation(); + void send_exit_emulation(); + void recv_exit_emulation(); + void step_into(); + void send_step_into(); + void recv_step_into(); + void step_over(); + void send_step_over(); + void recv_step_over(); + protected: + std::shared_ptr< ::apache::thrift::protocol::TProtocol> piprot_; + std::shared_ptr< ::apache::thrift::protocol::TProtocol> poprot_; + ::apache::thrift::protocol::TProtocol* iprot_; + ::apache::thrift::protocol::TProtocol* oprot_; +}; + +class BsnesDebuggerProcessor : public ::apache::thrift::TDispatchProcessor { + protected: + ::std::shared_ptr iface_; + virtual bool dispatchCall(::apache::thrift::protocol::TProtocol* iprot, ::apache::thrift::protocol::TProtocol* oprot, const std::string& fname, int32_t seqid, void* callContext); + private: + typedef void (BsnesDebuggerProcessor::*ProcessFunction)(int32_t, ::apache::thrift::protocol::TProtocol*, ::apache::thrift::protocol::TProtocol*, void*); + typedef std::map ProcessMap; + ProcessMap processMap_; + void process_get_cpu_reg(int32_t seqid, ::apache::thrift::protocol::TProtocol* iprot, ::apache::thrift::protocol::TProtocol* oprot, void* callContext); + void process_get_cpu_regs(int32_t seqid, ::apache::thrift::protocol::TProtocol* iprot, ::apache::thrift::protocol::TProtocol* oprot, void* callContext); + void process_set_cpu_reg(int32_t seqid, ::apache::thrift::protocol::TProtocol* iprot, ::apache::thrift::protocol::TProtocol* oprot, void* callContext); + void process_read_memory(int32_t seqid, ::apache::thrift::protocol::TProtocol* iprot, ::apache::thrift::protocol::TProtocol* oprot, void* callContext); + void process_write_memory(int32_t seqid, ::apache::thrift::protocol::TProtocol* iprot, ::apache::thrift::protocol::TProtocol* oprot, void* callContext); + void process_add_breakpoint(int32_t seqid, ::apache::thrift::protocol::TProtocol* iprot, ::apache::thrift::protocol::TProtocol* oprot, void* callContext); + void process_del_breakpoint(int32_t seqid, ::apache::thrift::protocol::TProtocol* iprot, ::apache::thrift::protocol::TProtocol* oprot, void* callContext); + void process_pause(int32_t seqid, ::apache::thrift::protocol::TProtocol* iprot, ::apache::thrift::protocol::TProtocol* oprot, void* callContext); + void process_resume(int32_t seqid, ::apache::thrift::protocol::TProtocol* iprot, ::apache::thrift::protocol::TProtocol* oprot, void* callContext); + void process_start_emulation(int32_t seqid, ::apache::thrift::protocol::TProtocol* iprot, ::apache::thrift::protocol::TProtocol* oprot, void* callContext); + void process_exit_emulation(int32_t seqid, ::apache::thrift::protocol::TProtocol* iprot, ::apache::thrift::protocol::TProtocol* oprot, void* callContext); + void process_step_into(int32_t seqid, ::apache::thrift::protocol::TProtocol* iprot, ::apache::thrift::protocol::TProtocol* oprot, void* callContext); + void process_step_over(int32_t seqid, ::apache::thrift::protocol::TProtocol* iprot, ::apache::thrift::protocol::TProtocol* oprot, void* callContext); + public: + BsnesDebuggerProcessor(::std::shared_ptr iface) : + iface_(iface) { + processMap_["get_cpu_reg"] = &BsnesDebuggerProcessor::process_get_cpu_reg; + processMap_["get_cpu_regs"] = &BsnesDebuggerProcessor::process_get_cpu_regs; + processMap_["set_cpu_reg"] = &BsnesDebuggerProcessor::process_set_cpu_reg; + processMap_["read_memory"] = &BsnesDebuggerProcessor::process_read_memory; + processMap_["write_memory"] = &BsnesDebuggerProcessor::process_write_memory; + processMap_["add_breakpoint"] = &BsnesDebuggerProcessor::process_add_breakpoint; + processMap_["del_breakpoint"] = &BsnesDebuggerProcessor::process_del_breakpoint; + processMap_["pause"] = &BsnesDebuggerProcessor::process_pause; + processMap_["resume"] = &BsnesDebuggerProcessor::process_resume; + processMap_["start_emulation"] = &BsnesDebuggerProcessor::process_start_emulation; + processMap_["exit_emulation"] = &BsnesDebuggerProcessor::process_exit_emulation; + processMap_["step_into"] = &BsnesDebuggerProcessor::process_step_into; + processMap_["step_over"] = &BsnesDebuggerProcessor::process_step_over; + } + + virtual ~BsnesDebuggerProcessor() {} +}; + +class BsnesDebuggerProcessorFactory : public ::apache::thrift::TProcessorFactory { + public: + BsnesDebuggerProcessorFactory(const ::std::shared_ptr< BsnesDebuggerIfFactory >& handlerFactory) : + handlerFactory_(handlerFactory) {} + + ::std::shared_ptr< ::apache::thrift::TProcessor > getProcessor(const ::apache::thrift::TConnectionInfo& connInfo); + + protected: + ::std::shared_ptr< BsnesDebuggerIfFactory > handlerFactory_; +}; + +class BsnesDebuggerMultiface : virtual public BsnesDebuggerIf { + public: + BsnesDebuggerMultiface(std::vector >& ifaces) : ifaces_(ifaces) { + } + virtual ~BsnesDebuggerMultiface() {} + protected: + std::vector > ifaces_; + BsnesDebuggerMultiface() {} + void add(::std::shared_ptr iface) { + ifaces_.push_back(iface); + } + public: + int32_t get_cpu_reg(const BsnesRegister::type reg) { + size_t sz = ifaces_.size(); + size_t i = 0; + for (; i < (sz - 1); ++i) { + ifaces_[i]->get_cpu_reg(reg); + } + return ifaces_[i]->get_cpu_reg(reg); + } + + void get_cpu_regs(BsnesRegisters& _return) { + size_t sz = ifaces_.size(); + size_t i = 0; + for (; i < (sz - 1); ++i) { + ifaces_[i]->get_cpu_regs(_return); + } + ifaces_[i]->get_cpu_regs(_return); + return; + } + + void set_cpu_reg(const BsnesRegister::type reg, const int32_t value) { + size_t sz = ifaces_.size(); + size_t i = 0; + for (; i < (sz - 1); ++i) { + ifaces_[i]->set_cpu_reg(reg, value); + } + ifaces_[i]->set_cpu_reg(reg, value); + } + + void read_memory(std::string& _return, const DbgMemorySource::type src, const int32_t address, const int32_t size) { + size_t sz = ifaces_.size(); + size_t i = 0; + for (; i < (sz - 1); ++i) { + ifaces_[i]->read_memory(_return, src, address, size); + } + ifaces_[i]->read_memory(_return, src, address, size); + return; + } + + void write_memory(const DbgMemorySource::type src, const int32_t address, const std::string& data) { + size_t sz = ifaces_.size(); + size_t i = 0; + for (; i < (sz - 1); ++i) { + ifaces_[i]->write_memory(src, address, data); + } + ifaces_[i]->write_memory(src, address, data); + } + + void add_breakpoint(const DbgBreakpoint& bpt) { + size_t sz = ifaces_.size(); + size_t i = 0; + for (; i < (sz - 1); ++i) { + ifaces_[i]->add_breakpoint(bpt); + } + ifaces_[i]->add_breakpoint(bpt); + } + + void del_breakpoint(const DbgBreakpoint& bpt) { + size_t sz = ifaces_.size(); + size_t i = 0; + for (; i < (sz - 1); ++i) { + ifaces_[i]->del_breakpoint(bpt); + } + ifaces_[i]->del_breakpoint(bpt); + } + + void pause() { + size_t sz = ifaces_.size(); + size_t i = 0; + for (; i < (sz - 1); ++i) { + ifaces_[i]->pause(); + } + ifaces_[i]->pause(); + } + + void resume() { + size_t sz = ifaces_.size(); + size_t i = 0; + for (; i < (sz - 1); ++i) { + ifaces_[i]->resume(); + } + ifaces_[i]->resume(); + } + + void start_emulation() { + size_t sz = ifaces_.size(); + size_t i = 0; + for (; i < (sz - 1); ++i) { + ifaces_[i]->start_emulation(); + } + ifaces_[i]->start_emulation(); + } + + void exit_emulation() { + size_t sz = ifaces_.size(); + size_t i = 0; + for (; i < (sz - 1); ++i) { + ifaces_[i]->exit_emulation(); + } + ifaces_[i]->exit_emulation(); + } + + void step_into() { + size_t sz = ifaces_.size(); + size_t i = 0; + for (; i < (sz - 1); ++i) { + ifaces_[i]->step_into(); + } + ifaces_[i]->step_into(); + } + + void step_over() { + size_t sz = ifaces_.size(); + size_t i = 0; + for (; i < (sz - 1); ++i) { + ifaces_[i]->step_over(); + } + ifaces_[i]->step_over(); + } + +}; + +// The 'concurrent' client is a thread safe client that correctly handles +// out of order responses. It is slower than the regular client, so should +// only be used when you need to share a connection among multiple threads +class BsnesDebuggerConcurrentClient : virtual public BsnesDebuggerIf { + public: + BsnesDebuggerConcurrentClient(std::shared_ptr< ::apache::thrift::protocol::TProtocol> prot, std::shared_ptr<::apache::thrift::async::TConcurrentClientSyncInfo> sync) : sync_(sync) +{ + setProtocol(prot); + } + BsnesDebuggerConcurrentClient(std::shared_ptr< ::apache::thrift::protocol::TProtocol> iprot, std::shared_ptr< ::apache::thrift::protocol::TProtocol> oprot, std::shared_ptr<::apache::thrift::async::TConcurrentClientSyncInfo> sync) : sync_(sync) +{ + setProtocol(iprot,oprot); + } + private: + void setProtocol(std::shared_ptr< ::apache::thrift::protocol::TProtocol> prot) { + setProtocol(prot,prot); + } + void setProtocol(std::shared_ptr< ::apache::thrift::protocol::TProtocol> iprot, std::shared_ptr< ::apache::thrift::protocol::TProtocol> oprot) { + piprot_=iprot; + poprot_=oprot; + iprot_ = iprot.get(); + oprot_ = oprot.get(); + } + public: + std::shared_ptr< ::apache::thrift::protocol::TProtocol> getInputProtocol() { + return piprot_; + } + std::shared_ptr< ::apache::thrift::protocol::TProtocol> getOutputProtocol() { + return poprot_; + } + int32_t get_cpu_reg(const BsnesRegister::type reg); + int32_t send_get_cpu_reg(const BsnesRegister::type reg); + int32_t recv_get_cpu_reg(const int32_t seqid); + void get_cpu_regs(BsnesRegisters& _return); + int32_t send_get_cpu_regs(); + void recv_get_cpu_regs(BsnesRegisters& _return, const int32_t seqid); + void set_cpu_reg(const BsnesRegister::type reg, const int32_t value); + int32_t send_set_cpu_reg(const BsnesRegister::type reg, const int32_t value); + void recv_set_cpu_reg(const int32_t seqid); + void read_memory(std::string& _return, const DbgMemorySource::type src, const int32_t address, const int32_t size); + int32_t send_read_memory(const DbgMemorySource::type src, const int32_t address, const int32_t size); + void recv_read_memory(std::string& _return, const int32_t seqid); + void write_memory(const DbgMemorySource::type src, const int32_t address, const std::string& data); + int32_t send_write_memory(const DbgMemorySource::type src, const int32_t address, const std::string& data); + void recv_write_memory(const int32_t seqid); + void add_breakpoint(const DbgBreakpoint& bpt); + int32_t send_add_breakpoint(const DbgBreakpoint& bpt); + void recv_add_breakpoint(const int32_t seqid); + void del_breakpoint(const DbgBreakpoint& bpt); + int32_t send_del_breakpoint(const DbgBreakpoint& bpt); + void recv_del_breakpoint(const int32_t seqid); + void pause(); + int32_t send_pause(); + void recv_pause(const int32_t seqid); + void resume(); + int32_t send_resume(); + void recv_resume(const int32_t seqid); + void start_emulation(); + int32_t send_start_emulation(); + void recv_start_emulation(const int32_t seqid); + void exit_emulation(); + int32_t send_exit_emulation(); + void recv_exit_emulation(const int32_t seqid); + void step_into(); + int32_t send_step_into(); + void recv_step_into(const int32_t seqid); + void step_over(); + int32_t send_step_over(); + void recv_step_over(const int32_t seqid); + protected: + std::shared_ptr< ::apache::thrift::protocol::TProtocol> piprot_; + std::shared_ptr< ::apache::thrift::protocol::TProtocol> poprot_; + ::apache::thrift::protocol::TProtocol* iprot_; + ::apache::thrift::protocol::TProtocol* oprot_; + std::shared_ptr<::apache::thrift::async::TConcurrentClientSyncInfo> sync_; +}; + +#ifdef _MSC_VER + #pragma warning( pop ) +#endif + + + +#endif diff --git a/bsnes/gen-cpp/IdaClient.cpp b/bsnes/gen-cpp/IdaClient.cpp new file mode 100644 index 00000000..2db999a2 --- /dev/null +++ b/bsnes/gen-cpp/IdaClient.cpp @@ -0,0 +1,648 @@ +/** + * Autogenerated by Thrift Compiler (0.14.0) + * + * DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING + * @generated + */ +#include "IdaClient.h" + + + + +IdaClient_start_event_args::~IdaClient_start_event_args() noexcept { +} + + +uint32_t IdaClient_start_event_args::read(::apache::thrift::protocol::TProtocol* iprot) { + + ::apache::thrift::protocol::TInputRecursionTracker tracker(*iprot); + uint32_t xfer = 0; + std::string fname; + ::apache::thrift::protocol::TType ftype; + int16_t fid; + + xfer += iprot->readStructBegin(fname); + + using ::apache::thrift::protocol::TProtocolException; + + + while (true) + { + xfer += iprot->readFieldBegin(fname, ftype, fid); + if (ftype == ::apache::thrift::protocol::T_STOP) { + break; + } + xfer += iprot->skip(ftype); + xfer += iprot->readFieldEnd(); + } + + xfer += iprot->readStructEnd(); + + return xfer; +} + +uint32_t IdaClient_start_event_args::write(::apache::thrift::protocol::TProtocol* oprot) const { + uint32_t xfer = 0; + ::apache::thrift::protocol::TOutputRecursionTracker tracker(*oprot); + xfer += oprot->writeStructBegin("IdaClient_start_event_args"); + + xfer += oprot->writeFieldStop(); + xfer += oprot->writeStructEnd(); + return xfer; +} + + +IdaClient_start_event_pargs::~IdaClient_start_event_pargs() noexcept { +} + + +uint32_t IdaClient_start_event_pargs::write(::apache::thrift::protocol::TProtocol* oprot) const { + uint32_t xfer = 0; + ::apache::thrift::protocol::TOutputRecursionTracker tracker(*oprot); + xfer += oprot->writeStructBegin("IdaClient_start_event_pargs"); + + xfer += oprot->writeFieldStop(); + xfer += oprot->writeStructEnd(); + return xfer; +} + + +IdaClient_add_visited_args::~IdaClient_add_visited_args() noexcept { +} + + +uint32_t IdaClient_add_visited_args::read(::apache::thrift::protocol::TProtocol* iprot) { + + ::apache::thrift::protocol::TInputRecursionTracker tracker(*iprot); + uint32_t xfer = 0; + std::string fname; + ::apache::thrift::protocol::TType ftype; + int16_t fid; + + xfer += iprot->readStructBegin(fname); + + using ::apache::thrift::protocol::TProtocolException; + + + while (true) + { + xfer += iprot->readFieldBegin(fname, ftype, fid); + if (ftype == ::apache::thrift::protocol::T_STOP) { + break; + } + switch (fid) + { + case 1: + if (ftype == ::apache::thrift::protocol::T_LIST) { + { + this->changed.clear(); + uint32_t _size10; + ::apache::thrift::protocol::TType _etype13; + xfer += iprot->readListBegin(_etype13, _size10); + this->changed.resize(_size10); + uint32_t _i14; + for (_i14 = 0; _i14 < _size10; ++_i14) + { + xfer += iprot->readI32(this->changed[_i14]); + } + xfer += iprot->readListEnd(); + } + this->__isset.changed = true; + } else { + xfer += iprot->skip(ftype); + } + break; + default: + xfer += iprot->skip(ftype); + break; + } + xfer += iprot->readFieldEnd(); + } + + xfer += iprot->readStructEnd(); + + return xfer; +} + +uint32_t IdaClient_add_visited_args::write(::apache::thrift::protocol::TProtocol* oprot) const { + uint32_t xfer = 0; + ::apache::thrift::protocol::TOutputRecursionTracker tracker(*oprot); + xfer += oprot->writeStructBegin("IdaClient_add_visited_args"); + + xfer += oprot->writeFieldBegin("changed", ::apache::thrift::protocol::T_LIST, 1); + { + xfer += oprot->writeListBegin(::apache::thrift::protocol::T_I32, static_cast(this->changed.size())); + std::vector ::const_iterator _iter15; + for (_iter15 = this->changed.begin(); _iter15 != this->changed.end(); ++_iter15) + { + xfer += oprot->writeI32((*_iter15)); + } + xfer += oprot->writeListEnd(); + } + xfer += oprot->writeFieldEnd(); + + xfer += oprot->writeFieldStop(); + xfer += oprot->writeStructEnd(); + return xfer; +} + + +IdaClient_add_visited_pargs::~IdaClient_add_visited_pargs() noexcept { +} + + +uint32_t IdaClient_add_visited_pargs::write(::apache::thrift::protocol::TProtocol* oprot) const { + uint32_t xfer = 0; + ::apache::thrift::protocol::TOutputRecursionTracker tracker(*oprot); + xfer += oprot->writeStructBegin("IdaClient_add_visited_pargs"); + + xfer += oprot->writeFieldBegin("changed", ::apache::thrift::protocol::T_LIST, 1); + { + xfer += oprot->writeListBegin(::apache::thrift::protocol::T_I32, static_cast((*(this->changed)).size())); + std::vector ::const_iterator _iter16; + for (_iter16 = (*(this->changed)).begin(); _iter16 != (*(this->changed)).end(); ++_iter16) + { + xfer += oprot->writeI32((*_iter16)); + } + xfer += oprot->writeListEnd(); + } + xfer += oprot->writeFieldEnd(); + + xfer += oprot->writeFieldStop(); + xfer += oprot->writeStructEnd(); + return xfer; +} + + +IdaClient_pause_event_args::~IdaClient_pause_event_args() noexcept { +} + + +uint32_t IdaClient_pause_event_args::read(::apache::thrift::protocol::TProtocol* iprot) { + + ::apache::thrift::protocol::TInputRecursionTracker tracker(*iprot); + uint32_t xfer = 0; + std::string fname; + ::apache::thrift::protocol::TType ftype; + int16_t fid; + + xfer += iprot->readStructBegin(fname); + + using ::apache::thrift::protocol::TProtocolException; + + + while (true) + { + xfer += iprot->readFieldBegin(fname, ftype, fid); + if (ftype == ::apache::thrift::protocol::T_STOP) { + break; + } + switch (fid) + { + case 1: + if (ftype == ::apache::thrift::protocol::T_I32) { + xfer += iprot->readI32(this->address); + this->__isset.address = true; + } else { + xfer += iprot->skip(ftype); + } + break; + default: + xfer += iprot->skip(ftype); + break; + } + xfer += iprot->readFieldEnd(); + } + + xfer += iprot->readStructEnd(); + + return xfer; +} + +uint32_t IdaClient_pause_event_args::write(::apache::thrift::protocol::TProtocol* oprot) const { + uint32_t xfer = 0; + ::apache::thrift::protocol::TOutputRecursionTracker tracker(*oprot); + xfer += oprot->writeStructBegin("IdaClient_pause_event_args"); + + xfer += oprot->writeFieldBegin("address", ::apache::thrift::protocol::T_I32, 1); + xfer += oprot->writeI32(this->address); + xfer += oprot->writeFieldEnd(); + + xfer += oprot->writeFieldStop(); + xfer += oprot->writeStructEnd(); + return xfer; +} + + +IdaClient_pause_event_pargs::~IdaClient_pause_event_pargs() noexcept { +} + + +uint32_t IdaClient_pause_event_pargs::write(::apache::thrift::protocol::TProtocol* oprot) const { + uint32_t xfer = 0; + ::apache::thrift::protocol::TOutputRecursionTracker tracker(*oprot); + xfer += oprot->writeStructBegin("IdaClient_pause_event_pargs"); + + xfer += oprot->writeFieldBegin("address", ::apache::thrift::protocol::T_I32, 1); + xfer += oprot->writeI32((*(this->address))); + xfer += oprot->writeFieldEnd(); + + xfer += oprot->writeFieldStop(); + xfer += oprot->writeStructEnd(); + return xfer; +} + + +IdaClient_stop_event_args::~IdaClient_stop_event_args() noexcept { +} + + +uint32_t IdaClient_stop_event_args::read(::apache::thrift::protocol::TProtocol* iprot) { + + ::apache::thrift::protocol::TInputRecursionTracker tracker(*iprot); + uint32_t xfer = 0; + std::string fname; + ::apache::thrift::protocol::TType ftype; + int16_t fid; + + xfer += iprot->readStructBegin(fname); + + using ::apache::thrift::protocol::TProtocolException; + + + while (true) + { + xfer += iprot->readFieldBegin(fname, ftype, fid); + if (ftype == ::apache::thrift::protocol::T_STOP) { + break; + } + xfer += iprot->skip(ftype); + xfer += iprot->readFieldEnd(); + } + + xfer += iprot->readStructEnd(); + + return xfer; +} + +uint32_t IdaClient_stop_event_args::write(::apache::thrift::protocol::TProtocol* oprot) const { + uint32_t xfer = 0; + ::apache::thrift::protocol::TOutputRecursionTracker tracker(*oprot); + xfer += oprot->writeStructBegin("IdaClient_stop_event_args"); + + xfer += oprot->writeFieldStop(); + xfer += oprot->writeStructEnd(); + return xfer; +} + + +IdaClient_stop_event_pargs::~IdaClient_stop_event_pargs() noexcept { +} + + +uint32_t IdaClient_stop_event_pargs::write(::apache::thrift::protocol::TProtocol* oprot) const { + uint32_t xfer = 0; + ::apache::thrift::protocol::TOutputRecursionTracker tracker(*oprot); + xfer += oprot->writeStructBegin("IdaClient_stop_event_pargs"); + + xfer += oprot->writeFieldStop(); + xfer += oprot->writeStructEnd(); + return xfer; +} + +void IdaClientClient::start_event() +{ + send_start_event(); +} + +void IdaClientClient::send_start_event() +{ + int32_t cseqid = 0; + oprot_->writeMessageBegin("start_event", ::apache::thrift::protocol::T_ONEWAY, cseqid); + + IdaClient_start_event_pargs args; + args.write(oprot_); + + oprot_->writeMessageEnd(); + oprot_->getTransport()->writeEnd(); + oprot_->getTransport()->flush(); +} + +void IdaClientClient::add_visited(const std::vector & changed) +{ + send_add_visited(changed); +} + +void IdaClientClient::send_add_visited(const std::vector & changed) +{ + int32_t cseqid = 0; + oprot_->writeMessageBegin("add_visited", ::apache::thrift::protocol::T_ONEWAY, cseqid); + + IdaClient_add_visited_pargs args; + args.changed = &changed; + args.write(oprot_); + + oprot_->writeMessageEnd(); + oprot_->getTransport()->writeEnd(); + oprot_->getTransport()->flush(); +} + +void IdaClientClient::pause_event(const int32_t address) +{ + send_pause_event(address); +} + +void IdaClientClient::send_pause_event(const int32_t address) +{ + int32_t cseqid = 0; + oprot_->writeMessageBegin("pause_event", ::apache::thrift::protocol::T_ONEWAY, cseqid); + + IdaClient_pause_event_pargs args; + args.address = &address; + args.write(oprot_); + + oprot_->writeMessageEnd(); + oprot_->getTransport()->writeEnd(); + oprot_->getTransport()->flush(); +} + +void IdaClientClient::stop_event() +{ + send_stop_event(); +} + +void IdaClientClient::send_stop_event() +{ + int32_t cseqid = 0; + oprot_->writeMessageBegin("stop_event", ::apache::thrift::protocol::T_ONEWAY, cseqid); + + IdaClient_stop_event_pargs args; + args.write(oprot_); + + oprot_->writeMessageEnd(); + oprot_->getTransport()->writeEnd(); + oprot_->getTransport()->flush(); +} + +bool IdaClientProcessor::dispatchCall(::apache::thrift::protocol::TProtocol* iprot, ::apache::thrift::protocol::TProtocol* oprot, const std::string& fname, int32_t seqid, void* callContext) { + ProcessMap::iterator pfn; + pfn = processMap_.find(fname); + if (pfn == processMap_.end()) { + iprot->skip(::apache::thrift::protocol::T_STRUCT); + iprot->readMessageEnd(); + iprot->getTransport()->readEnd(); + ::apache::thrift::TApplicationException x(::apache::thrift::TApplicationException::UNKNOWN_METHOD, "Invalid method name: '"+fname+"'"); + oprot->writeMessageBegin(fname, ::apache::thrift::protocol::T_EXCEPTION, seqid); + x.write(oprot); + oprot->writeMessageEnd(); + oprot->getTransport()->writeEnd(); + oprot->getTransport()->flush(); + return true; + } + (this->*(pfn->second))(seqid, iprot, oprot, callContext); + return true; +} + +void IdaClientProcessor::process_start_event(int32_t, ::apache::thrift::protocol::TProtocol* iprot, ::apache::thrift::protocol::TProtocol*, void* callContext) +{ + void* ctx = nullptr; + if (this->eventHandler_.get() != nullptr) { + ctx = this->eventHandler_->getContext("IdaClient.start_event", callContext); + } + ::apache::thrift::TProcessorContextFreer freer(this->eventHandler_.get(), ctx, "IdaClient.start_event"); + + if (this->eventHandler_.get() != nullptr) { + this->eventHandler_->preRead(ctx, "IdaClient.start_event"); + } + + IdaClient_start_event_args args; + args.read(iprot); + iprot->readMessageEnd(); + uint32_t bytes = iprot->getTransport()->readEnd(); + + if (this->eventHandler_.get() != nullptr) { + this->eventHandler_->postRead(ctx, "IdaClient.start_event", bytes); + } + + try { + iface_->start_event(); + } catch (const std::exception&) { + if (this->eventHandler_.get() != nullptr) { + this->eventHandler_->handlerError(ctx, "IdaClient.start_event"); + } + return; + } + + if (this->eventHandler_.get() != nullptr) { + this->eventHandler_->asyncComplete(ctx, "IdaClient.start_event"); + } + + return; +} + +void IdaClientProcessor::process_add_visited(int32_t, ::apache::thrift::protocol::TProtocol* iprot, ::apache::thrift::protocol::TProtocol*, void* callContext) +{ + void* ctx = nullptr; + if (this->eventHandler_.get() != nullptr) { + ctx = this->eventHandler_->getContext("IdaClient.add_visited", callContext); + } + ::apache::thrift::TProcessorContextFreer freer(this->eventHandler_.get(), ctx, "IdaClient.add_visited"); + + if (this->eventHandler_.get() != nullptr) { + this->eventHandler_->preRead(ctx, "IdaClient.add_visited"); + } + + IdaClient_add_visited_args args; + args.read(iprot); + iprot->readMessageEnd(); + uint32_t bytes = iprot->getTransport()->readEnd(); + + if (this->eventHandler_.get() != nullptr) { + this->eventHandler_->postRead(ctx, "IdaClient.add_visited", bytes); + } + + try { + iface_->add_visited(args.changed); + } catch (const std::exception&) { + if (this->eventHandler_.get() != nullptr) { + this->eventHandler_->handlerError(ctx, "IdaClient.add_visited"); + } + return; + } + + if (this->eventHandler_.get() != nullptr) { + this->eventHandler_->asyncComplete(ctx, "IdaClient.add_visited"); + } + + return; +} + +void IdaClientProcessor::process_pause_event(int32_t, ::apache::thrift::protocol::TProtocol* iprot, ::apache::thrift::protocol::TProtocol*, void* callContext) +{ + void* ctx = nullptr; + if (this->eventHandler_.get() != nullptr) { + ctx = this->eventHandler_->getContext("IdaClient.pause_event", callContext); + } + ::apache::thrift::TProcessorContextFreer freer(this->eventHandler_.get(), ctx, "IdaClient.pause_event"); + + if (this->eventHandler_.get() != nullptr) { + this->eventHandler_->preRead(ctx, "IdaClient.pause_event"); + } + + IdaClient_pause_event_args args; + args.read(iprot); + iprot->readMessageEnd(); + uint32_t bytes = iprot->getTransport()->readEnd(); + + if (this->eventHandler_.get() != nullptr) { + this->eventHandler_->postRead(ctx, "IdaClient.pause_event", bytes); + } + + try { + iface_->pause_event(args.address); + } catch (const std::exception&) { + if (this->eventHandler_.get() != nullptr) { + this->eventHandler_->handlerError(ctx, "IdaClient.pause_event"); + } + return; + } + + if (this->eventHandler_.get() != nullptr) { + this->eventHandler_->asyncComplete(ctx, "IdaClient.pause_event"); + } + + return; +} + +void IdaClientProcessor::process_stop_event(int32_t, ::apache::thrift::protocol::TProtocol* iprot, ::apache::thrift::protocol::TProtocol*, void* callContext) +{ + void* ctx = nullptr; + if (this->eventHandler_.get() != nullptr) { + ctx = this->eventHandler_->getContext("IdaClient.stop_event", callContext); + } + ::apache::thrift::TProcessorContextFreer freer(this->eventHandler_.get(), ctx, "IdaClient.stop_event"); + + if (this->eventHandler_.get() != nullptr) { + this->eventHandler_->preRead(ctx, "IdaClient.stop_event"); + } + + IdaClient_stop_event_args args; + args.read(iprot); + iprot->readMessageEnd(); + uint32_t bytes = iprot->getTransport()->readEnd(); + + if (this->eventHandler_.get() != nullptr) { + this->eventHandler_->postRead(ctx, "IdaClient.stop_event", bytes); + } + + try { + iface_->stop_event(); + } catch (const std::exception&) { + if (this->eventHandler_.get() != nullptr) { + this->eventHandler_->handlerError(ctx, "IdaClient.stop_event"); + } + return; + } + + if (this->eventHandler_.get() != nullptr) { + this->eventHandler_->asyncComplete(ctx, "IdaClient.stop_event"); + } + + return; +} + +::std::shared_ptr< ::apache::thrift::TProcessor > IdaClientProcessorFactory::getProcessor(const ::apache::thrift::TConnectionInfo& connInfo) { + ::apache::thrift::ReleaseHandler< IdaClientIfFactory > cleanup(handlerFactory_); + ::std::shared_ptr< IdaClientIf > handler(handlerFactory_->getHandler(connInfo), cleanup); + ::std::shared_ptr< ::apache::thrift::TProcessor > processor(new IdaClientProcessor(handler)); + return processor; +} + +void IdaClientConcurrentClient::start_event() +{ + send_start_event(); +} + +void IdaClientConcurrentClient::send_start_event() +{ + int32_t cseqid = 0; + ::apache::thrift::async::TConcurrentSendSentry sentry(this->sync_.get()); + oprot_->writeMessageBegin("start_event", ::apache::thrift::protocol::T_ONEWAY, cseqid); + + IdaClient_start_event_pargs args; + args.write(oprot_); + + oprot_->writeMessageEnd(); + oprot_->getTransport()->writeEnd(); + oprot_->getTransport()->flush(); + + sentry.commit(); +} + +void IdaClientConcurrentClient::add_visited(const std::vector & changed) +{ + send_add_visited(changed); +} + +void IdaClientConcurrentClient::send_add_visited(const std::vector & changed) +{ + int32_t cseqid = 0; + ::apache::thrift::async::TConcurrentSendSentry sentry(this->sync_.get()); + oprot_->writeMessageBegin("add_visited", ::apache::thrift::protocol::T_ONEWAY, cseqid); + + IdaClient_add_visited_pargs args; + args.changed = &changed; + args.write(oprot_); + + oprot_->writeMessageEnd(); + oprot_->getTransport()->writeEnd(); + oprot_->getTransport()->flush(); + + sentry.commit(); +} + +void IdaClientConcurrentClient::pause_event(const int32_t address) +{ + send_pause_event(address); +} + +void IdaClientConcurrentClient::send_pause_event(const int32_t address) +{ + int32_t cseqid = 0; + ::apache::thrift::async::TConcurrentSendSentry sentry(this->sync_.get()); + oprot_->writeMessageBegin("pause_event", ::apache::thrift::protocol::T_ONEWAY, cseqid); + + IdaClient_pause_event_pargs args; + args.address = &address; + args.write(oprot_); + + oprot_->writeMessageEnd(); + oprot_->getTransport()->writeEnd(); + oprot_->getTransport()->flush(); + + sentry.commit(); +} + +void IdaClientConcurrentClient::stop_event() +{ + send_stop_event(); +} + +void IdaClientConcurrentClient::send_stop_event() +{ + int32_t cseqid = 0; + ::apache::thrift::async::TConcurrentSendSentry sentry(this->sync_.get()); + oprot_->writeMessageBegin("stop_event", ::apache::thrift::protocol::T_ONEWAY, cseqid); + + IdaClient_stop_event_pargs args; + args.write(oprot_); + + oprot_->writeMessageEnd(); + oprot_->getTransport()->writeEnd(); + oprot_->getTransport()->flush(); + + sentry.commit(); +} + + + diff --git a/bsnes/gen-cpp/IdaClient.h b/bsnes/gen-cpp/IdaClient.h new file mode 100644 index 00000000..163c6508 --- /dev/null +++ b/bsnes/gen-cpp/IdaClient.h @@ -0,0 +1,421 @@ +/** + * Autogenerated by Thrift Compiler (0.14.0) + * + * DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING + * @generated + */ +#ifndef IdaClient_H +#define IdaClient_H + +#include +#include +#include +#include "debug_proto_types.h" + + + +#ifdef _MSC_VER + #pragma warning( push ) + #pragma warning (disable : 4250 ) //inheriting methods via dominance +#endif + +class IdaClientIf { + public: + virtual ~IdaClientIf() {} + virtual void start_event() = 0; + virtual void add_visited(const std::vector & changed) = 0; + virtual void pause_event(const int32_t address) = 0; + virtual void stop_event() = 0; +}; + +class IdaClientIfFactory { + public: + typedef IdaClientIf Handler; + + virtual ~IdaClientIfFactory() {} + + virtual IdaClientIf* getHandler(const ::apache::thrift::TConnectionInfo& connInfo) = 0; + virtual void releaseHandler(IdaClientIf* /* handler */) = 0; +}; + +class IdaClientIfSingletonFactory : virtual public IdaClientIfFactory { + public: + IdaClientIfSingletonFactory(const ::std::shared_ptr& iface) : iface_(iface) {} + virtual ~IdaClientIfSingletonFactory() {} + + virtual IdaClientIf* getHandler(const ::apache::thrift::TConnectionInfo&) { + return iface_.get(); + } + virtual void releaseHandler(IdaClientIf* /* handler */) {} + + protected: + ::std::shared_ptr iface_; +}; + +class IdaClientNull : virtual public IdaClientIf { + public: + virtual ~IdaClientNull() {} + void start_event() { + return; + } + void add_visited(const std::vector & /* changed */) { + return; + } + void pause_event(const int32_t /* address */) { + return; + } + void stop_event() { + return; + } +}; + + +class IdaClient_start_event_args { + public: + + IdaClient_start_event_args(const IdaClient_start_event_args&); + IdaClient_start_event_args& operator=(const IdaClient_start_event_args&); + IdaClient_start_event_args() { + } + + virtual ~IdaClient_start_event_args() noexcept; + + bool operator == (const IdaClient_start_event_args & /* rhs */) const + { + return true; + } + bool operator != (const IdaClient_start_event_args &rhs) const { + return !(*this == rhs); + } + + bool operator < (const IdaClient_start_event_args & ) const; + + uint32_t read(::apache::thrift::protocol::TProtocol* iprot); + uint32_t write(::apache::thrift::protocol::TProtocol* oprot) const; + +}; + + +class IdaClient_start_event_pargs { + public: + + + virtual ~IdaClient_start_event_pargs() noexcept; + + uint32_t write(::apache::thrift::protocol::TProtocol* oprot) const; + +}; + +typedef struct _IdaClient_add_visited_args__isset { + _IdaClient_add_visited_args__isset() : changed(false) {} + bool changed :1; +} _IdaClient_add_visited_args__isset; + +class IdaClient_add_visited_args { + public: + + IdaClient_add_visited_args(const IdaClient_add_visited_args&); + IdaClient_add_visited_args& operator=(const IdaClient_add_visited_args&); + IdaClient_add_visited_args() { + } + + virtual ~IdaClient_add_visited_args() noexcept; + std::vector changed; + + _IdaClient_add_visited_args__isset __isset; + + void __set_changed(const std::vector & val); + + bool operator == (const IdaClient_add_visited_args & rhs) const + { + if (!(changed == rhs.changed)) + return false; + return true; + } + bool operator != (const IdaClient_add_visited_args &rhs) const { + return !(*this == rhs); + } + + bool operator < (const IdaClient_add_visited_args & ) const; + + uint32_t read(::apache::thrift::protocol::TProtocol* iprot); + uint32_t write(::apache::thrift::protocol::TProtocol* oprot) const; + +}; + + +class IdaClient_add_visited_pargs { + public: + + + virtual ~IdaClient_add_visited_pargs() noexcept; + const std::vector * changed; + + uint32_t write(::apache::thrift::protocol::TProtocol* oprot) const; + +}; + +typedef struct _IdaClient_pause_event_args__isset { + _IdaClient_pause_event_args__isset() : address(false) {} + bool address :1; +} _IdaClient_pause_event_args__isset; + +class IdaClient_pause_event_args { + public: + + IdaClient_pause_event_args(const IdaClient_pause_event_args&); + IdaClient_pause_event_args& operator=(const IdaClient_pause_event_args&); + IdaClient_pause_event_args() : address(0) { + } + + virtual ~IdaClient_pause_event_args() noexcept; + int32_t address; + + _IdaClient_pause_event_args__isset __isset; + + void __set_address(const int32_t val); + + bool operator == (const IdaClient_pause_event_args & rhs) const + { + if (!(address == rhs.address)) + return false; + return true; + } + bool operator != (const IdaClient_pause_event_args &rhs) const { + return !(*this == rhs); + } + + bool operator < (const IdaClient_pause_event_args & ) const; + + uint32_t read(::apache::thrift::protocol::TProtocol* iprot); + uint32_t write(::apache::thrift::protocol::TProtocol* oprot) const; + +}; + + +class IdaClient_pause_event_pargs { + public: + + + virtual ~IdaClient_pause_event_pargs() noexcept; + const int32_t* address; + + uint32_t write(::apache::thrift::protocol::TProtocol* oprot) const; + +}; + + +class IdaClient_stop_event_args { + public: + + IdaClient_stop_event_args(const IdaClient_stop_event_args&); + IdaClient_stop_event_args& operator=(const IdaClient_stop_event_args&); + IdaClient_stop_event_args() { + } + + virtual ~IdaClient_stop_event_args() noexcept; + + bool operator == (const IdaClient_stop_event_args & /* rhs */) const + { + return true; + } + bool operator != (const IdaClient_stop_event_args &rhs) const { + return !(*this == rhs); + } + + bool operator < (const IdaClient_stop_event_args & ) const; + + uint32_t read(::apache::thrift::protocol::TProtocol* iprot); + uint32_t write(::apache::thrift::protocol::TProtocol* oprot) const; + +}; + + +class IdaClient_stop_event_pargs { + public: + + + virtual ~IdaClient_stop_event_pargs() noexcept; + + uint32_t write(::apache::thrift::protocol::TProtocol* oprot) const; + +}; + +class IdaClientClient : virtual public IdaClientIf { + public: + IdaClientClient(std::shared_ptr< ::apache::thrift::protocol::TProtocol> prot) { + setProtocol(prot); + } + IdaClientClient(std::shared_ptr< ::apache::thrift::protocol::TProtocol> iprot, std::shared_ptr< ::apache::thrift::protocol::TProtocol> oprot) { + setProtocol(iprot,oprot); + } + private: + void setProtocol(std::shared_ptr< ::apache::thrift::protocol::TProtocol> prot) { + setProtocol(prot,prot); + } + void setProtocol(std::shared_ptr< ::apache::thrift::protocol::TProtocol> iprot, std::shared_ptr< ::apache::thrift::protocol::TProtocol> oprot) { + piprot_=iprot; + poprot_=oprot; + iprot_ = iprot.get(); + oprot_ = oprot.get(); + } + public: + std::shared_ptr< ::apache::thrift::protocol::TProtocol> getInputProtocol() { + return piprot_; + } + std::shared_ptr< ::apache::thrift::protocol::TProtocol> getOutputProtocol() { + return poprot_; + } + void start_event(); + void send_start_event(); + void add_visited(const std::vector & changed); + void send_add_visited(const std::vector & changed); + void pause_event(const int32_t address); + void send_pause_event(const int32_t address); + void stop_event(); + void send_stop_event(); + protected: + std::shared_ptr< ::apache::thrift::protocol::TProtocol> piprot_; + std::shared_ptr< ::apache::thrift::protocol::TProtocol> poprot_; + ::apache::thrift::protocol::TProtocol* iprot_; + ::apache::thrift::protocol::TProtocol* oprot_; +}; + +class IdaClientProcessor : public ::apache::thrift::TDispatchProcessor { + protected: + ::std::shared_ptr iface_; + virtual bool dispatchCall(::apache::thrift::protocol::TProtocol* iprot, ::apache::thrift::protocol::TProtocol* oprot, const std::string& fname, int32_t seqid, void* callContext); + private: + typedef void (IdaClientProcessor::*ProcessFunction)(int32_t, ::apache::thrift::protocol::TProtocol*, ::apache::thrift::protocol::TProtocol*, void*); + typedef std::map ProcessMap; + ProcessMap processMap_; + void process_start_event(int32_t seqid, ::apache::thrift::protocol::TProtocol* iprot, ::apache::thrift::protocol::TProtocol* oprot, void* callContext); + void process_add_visited(int32_t seqid, ::apache::thrift::protocol::TProtocol* iprot, ::apache::thrift::protocol::TProtocol* oprot, void* callContext); + void process_pause_event(int32_t seqid, ::apache::thrift::protocol::TProtocol* iprot, ::apache::thrift::protocol::TProtocol* oprot, void* callContext); + void process_stop_event(int32_t seqid, ::apache::thrift::protocol::TProtocol* iprot, ::apache::thrift::protocol::TProtocol* oprot, void* callContext); + public: + IdaClientProcessor(::std::shared_ptr iface) : + iface_(iface) { + processMap_["start_event"] = &IdaClientProcessor::process_start_event; + processMap_["add_visited"] = &IdaClientProcessor::process_add_visited; + processMap_["pause_event"] = &IdaClientProcessor::process_pause_event; + processMap_["stop_event"] = &IdaClientProcessor::process_stop_event; + } + + virtual ~IdaClientProcessor() {} +}; + +class IdaClientProcessorFactory : public ::apache::thrift::TProcessorFactory { + public: + IdaClientProcessorFactory(const ::std::shared_ptr< IdaClientIfFactory >& handlerFactory) : + handlerFactory_(handlerFactory) {} + + ::std::shared_ptr< ::apache::thrift::TProcessor > getProcessor(const ::apache::thrift::TConnectionInfo& connInfo); + + protected: + ::std::shared_ptr< IdaClientIfFactory > handlerFactory_; +}; + +class IdaClientMultiface : virtual public IdaClientIf { + public: + IdaClientMultiface(std::vector >& ifaces) : ifaces_(ifaces) { + } + virtual ~IdaClientMultiface() {} + protected: + std::vector > ifaces_; + IdaClientMultiface() {} + void add(::std::shared_ptr iface) { + ifaces_.push_back(iface); + } + public: + void start_event() { + size_t sz = ifaces_.size(); + size_t i = 0; + for (; i < (sz - 1); ++i) { + ifaces_[i]->start_event(); + } + ifaces_[i]->start_event(); + } + + void add_visited(const std::vector & changed) { + size_t sz = ifaces_.size(); + size_t i = 0; + for (; i < (sz - 1); ++i) { + ifaces_[i]->add_visited(changed); + } + ifaces_[i]->add_visited(changed); + } + + void pause_event(const int32_t address) { + size_t sz = ifaces_.size(); + size_t i = 0; + for (; i < (sz - 1); ++i) { + ifaces_[i]->pause_event(address); + } + ifaces_[i]->pause_event(address); + } + + void stop_event() { + size_t sz = ifaces_.size(); + size_t i = 0; + for (; i < (sz - 1); ++i) { + ifaces_[i]->stop_event(); + } + ifaces_[i]->stop_event(); + } + +}; + +// The 'concurrent' client is a thread safe client that correctly handles +// out of order responses. It is slower than the regular client, so should +// only be used when you need to share a connection among multiple threads +class IdaClientConcurrentClient : virtual public IdaClientIf { + public: + IdaClientConcurrentClient(std::shared_ptr< ::apache::thrift::protocol::TProtocol> prot, std::shared_ptr<::apache::thrift::async::TConcurrentClientSyncInfo> sync) : sync_(sync) +{ + setProtocol(prot); + } + IdaClientConcurrentClient(std::shared_ptr< ::apache::thrift::protocol::TProtocol> iprot, std::shared_ptr< ::apache::thrift::protocol::TProtocol> oprot, std::shared_ptr<::apache::thrift::async::TConcurrentClientSyncInfo> sync) : sync_(sync) +{ + setProtocol(iprot,oprot); + } + private: + void setProtocol(std::shared_ptr< ::apache::thrift::protocol::TProtocol> prot) { + setProtocol(prot,prot); + } + void setProtocol(std::shared_ptr< ::apache::thrift::protocol::TProtocol> iprot, std::shared_ptr< ::apache::thrift::protocol::TProtocol> oprot) { + piprot_=iprot; + poprot_=oprot; + iprot_ = iprot.get(); + oprot_ = oprot.get(); + } + public: + std::shared_ptr< ::apache::thrift::protocol::TProtocol> getInputProtocol() { + return piprot_; + } + std::shared_ptr< ::apache::thrift::protocol::TProtocol> getOutputProtocol() { + return poprot_; + } + void start_event(); + void send_start_event(); + void add_visited(const std::vector & changed); + void send_add_visited(const std::vector & changed); + void pause_event(const int32_t address); + void send_pause_event(const int32_t address); + void stop_event(); + void send_stop_event(); + protected: + std::shared_ptr< ::apache::thrift::protocol::TProtocol> piprot_; + std::shared_ptr< ::apache::thrift::protocol::TProtocol> poprot_; + ::apache::thrift::protocol::TProtocol* iprot_; + ::apache::thrift::protocol::TProtocol* oprot_; + std::shared_ptr<::apache::thrift::async::TConcurrentClientSyncInfo> sync_; +}; + +#ifdef _MSC_VER + #pragma warning( pop ) +#endif + + + +#endif diff --git a/bsnes/gen-cpp/debug_proto_types.cpp b/bsnes/gen-cpp/debug_proto_types.cpp new file mode 100644 index 00000000..9f2c9650 --- /dev/null +++ b/bsnes/gen-cpp/debug_proto_types.cpp @@ -0,0 +1,658 @@ +/** + * Autogenerated by Thrift Compiler (0.14.0) + * + * DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING + * @generated + */ +#include "debug_proto_types.h" + +#include +#include + +#include + + + +int _kBsnesRegisterValues[] = { + BsnesRegister::pc, + BsnesRegister::a, + BsnesRegister::x, + BsnesRegister::y, + BsnesRegister::s, + BsnesRegister::d, + BsnesRegister::db, + BsnesRegister::p, + BsnesRegister::mflag, + BsnesRegister::xflag, + BsnesRegister::eflag +}; +const char* _kBsnesRegisterNames[] = { + "pc", + "a", + "x", + "y", + "s", + "d", + "db", + "p", + "mflag", + "xflag", + "eflag" +}; +const std::map _BsnesRegister_VALUES_TO_NAMES(::apache::thrift::TEnumIterator(11, _kBsnesRegisterValues, _kBsnesRegisterNames), ::apache::thrift::TEnumIterator(-1, nullptr, nullptr)); + +std::ostream& operator<<(std::ostream& out, const BsnesRegister::type& val) { + std::map::const_iterator it = _BsnesRegister_VALUES_TO_NAMES.find(val); + if (it != _BsnesRegister_VALUES_TO_NAMES.end()) { + out << it->second; + } else { + out << static_cast(val); + } + return out; +} + +std::string to_string(const BsnesRegister::type& val) { + std::map::const_iterator it = _BsnesRegister_VALUES_TO_NAMES.find(val); + if (it != _BsnesRegister_VALUES_TO_NAMES.end()) { + return std::string(it->second); + } else { + return std::to_string(static_cast(val)); + } +} + +int _kBpTypeValues[] = { + BpType::BP_PC, + BpType::BP_READ, + BpType::BP_WRITE +}; +const char* _kBpTypeNames[] = { + "BP_PC", + "BP_READ", + "BP_WRITE" +}; +const std::map _BpType_VALUES_TO_NAMES(::apache::thrift::TEnumIterator(3, _kBpTypeValues, _kBpTypeNames), ::apache::thrift::TEnumIterator(-1, nullptr, nullptr)); + +std::ostream& operator<<(std::ostream& out, const BpType::type& val) { + std::map::const_iterator it = _BpType_VALUES_TO_NAMES.find(val); + if (it != _BpType_VALUES_TO_NAMES.end()) { + out << it->second; + } else { + out << static_cast(val); + } + return out; +} + +std::string to_string(const BpType::type& val) { + std::map::const_iterator it = _BpType_VALUES_TO_NAMES.find(val); + if (it != _BpType_VALUES_TO_NAMES.end()) { + return std::string(it->second); + } else { + return std::to_string(static_cast(val)); + } +} + +int _kDbgMemorySourceValues[] = { + DbgMemorySource::CPUBus, + DbgMemorySource::APUBus, + DbgMemorySource::APURAM, + DbgMemorySource::DSP, + DbgMemorySource::VRAM, + DbgMemorySource::OAM, + DbgMemorySource::CGRAM, + DbgMemorySource::CartROM, + DbgMemorySource::CartRAM, + DbgMemorySource::SA1Bus, + DbgMemorySource::SFXBus, + DbgMemorySource::SGBBus, + DbgMemorySource::SGBROM, + DbgMemorySource::SGBRAM +}; +const char* _kDbgMemorySourceNames[] = { + "CPUBus", + "APUBus", + "APURAM", + "DSP", + "VRAM", + "OAM", + "CGRAM", + "CartROM", + "CartRAM", + "SA1Bus", + "SFXBus", + "SGBBus", + "SGBROM", + "SGBRAM" +}; +const std::map _DbgMemorySource_VALUES_TO_NAMES(::apache::thrift::TEnumIterator(14, _kDbgMemorySourceValues, _kDbgMemorySourceNames), ::apache::thrift::TEnumIterator(-1, nullptr, nullptr)); + +std::ostream& operator<<(std::ostream& out, const DbgMemorySource::type& val) { + std::map::const_iterator it = _DbgMemorySource_VALUES_TO_NAMES.find(val); + if (it != _DbgMemorySource_VALUES_TO_NAMES.end()) { + out << it->second; + } else { + out << static_cast(val); + } + return out; +} + +std::string to_string(const DbgMemorySource::type& val) { + std::map::const_iterator it = _DbgMemorySource_VALUES_TO_NAMES.find(val); + if (it != _DbgMemorySource_VALUES_TO_NAMES.end()) { + return std::string(it->second); + } else { + return std::to_string(static_cast(val)); + } +} + +int _kDbgBptSourceValues[] = { + DbgBptSource::CPUBus, + DbgBptSource::APURAM, + DbgBptSource::DSP, + DbgBptSource::VRAM, + DbgBptSource::OAM, + DbgBptSource::CGRAM, + DbgBptSource::SA1Bus, + DbgBptSource::SFXBus, + DbgBptSource::SGBBus +}; +const char* _kDbgBptSourceNames[] = { + "CPUBus", + "APURAM", + "DSP", + "VRAM", + "OAM", + "CGRAM", + "SA1Bus", + "SFXBus", + "SGBBus" +}; +const std::map _DbgBptSource_VALUES_TO_NAMES(::apache::thrift::TEnumIterator(9, _kDbgBptSourceValues, _kDbgBptSourceNames), ::apache::thrift::TEnumIterator(-1, nullptr, nullptr)); + +std::ostream& operator<<(std::ostream& out, const DbgBptSource::type& val) { + std::map::const_iterator it = _DbgBptSource_VALUES_TO_NAMES.find(val); + if (it != _DbgBptSource_VALUES_TO_NAMES.end()) { + out << it->second; + } else { + out << static_cast(val); + } + return out; +} + +std::string to_string(const DbgBptSource::type& val) { + std::map::const_iterator it = _DbgBptSource_VALUES_TO_NAMES.find(val); + if (it != _DbgBptSource_VALUES_TO_NAMES.end()) { + return std::string(it->second); + } else { + return std::to_string(static_cast(val)); + } +} + + +BsnesRegisters::~BsnesRegisters() noexcept { +} + + +void BsnesRegisters::__set_pc(const int32_t val) { + this->pc = val; +} + +void BsnesRegisters::__set_a(const int32_t val) { + this->a = val; +} + +void BsnesRegisters::__set_x(const int32_t val) { + this->x = val; +} + +void BsnesRegisters::__set_y(const int32_t val) { + this->y = val; +} + +void BsnesRegisters::__set_s(const int32_t val) { + this->s = val; +} + +void BsnesRegisters::__set_d(const int32_t val) { + this->d = val; +} + +void BsnesRegisters::__set_db(const int16_t val) { + this->db = val; +} + +void BsnesRegisters::__set_p(const int16_t val) { + this->p = val; +} + +void BsnesRegisters::__set_mflag(const int8_t val) { + this->mflag = val; +} + +void BsnesRegisters::__set_xflag(const int8_t val) { + this->xflag = val; +} + +void BsnesRegisters::__set_eflag(const int8_t val) { + this->eflag = val; +} +std::ostream& operator<<(std::ostream& out, const BsnesRegisters& obj) +{ + obj.printTo(out); + return out; +} + + +uint32_t BsnesRegisters::read(::apache::thrift::protocol::TProtocol* iprot) { + + ::apache::thrift::protocol::TInputRecursionTracker tracker(*iprot); + uint32_t xfer = 0; + std::string fname; + ::apache::thrift::protocol::TType ftype; + int16_t fid; + + xfer += iprot->readStructBegin(fname); + + using ::apache::thrift::protocol::TProtocolException; + + + while (true) + { + xfer += iprot->readFieldBegin(fname, ftype, fid); + if (ftype == ::apache::thrift::protocol::T_STOP) { + break; + } + switch (fid) + { + case 1: + if (ftype == ::apache::thrift::protocol::T_I32) { + xfer += iprot->readI32(this->pc); + this->__isset.pc = true; + } else { + xfer += iprot->skip(ftype); + } + break; + case 2: + if (ftype == ::apache::thrift::protocol::T_I32) { + xfer += iprot->readI32(this->a); + this->__isset.a = true; + } else { + xfer += iprot->skip(ftype); + } + break; + case 3: + if (ftype == ::apache::thrift::protocol::T_I32) { + xfer += iprot->readI32(this->x); + this->__isset.x = true; + } else { + xfer += iprot->skip(ftype); + } + break; + case 4: + if (ftype == ::apache::thrift::protocol::T_I32) { + xfer += iprot->readI32(this->y); + this->__isset.y = true; + } else { + xfer += iprot->skip(ftype); + } + break; + case 5: + if (ftype == ::apache::thrift::protocol::T_I32) { + xfer += iprot->readI32(this->s); + this->__isset.s = true; + } else { + xfer += iprot->skip(ftype); + } + break; + case 6: + if (ftype == ::apache::thrift::protocol::T_I32) { + xfer += iprot->readI32(this->d); + this->__isset.d = true; + } else { + xfer += iprot->skip(ftype); + } + break; + case 7: + if (ftype == ::apache::thrift::protocol::T_I16) { + xfer += iprot->readI16(this->db); + this->__isset.db = true; + } else { + xfer += iprot->skip(ftype); + } + break; + case 8: + if (ftype == ::apache::thrift::protocol::T_I16) { + xfer += iprot->readI16(this->p); + this->__isset.p = true; + } else { + xfer += iprot->skip(ftype); + } + break; + case 9: + if (ftype == ::apache::thrift::protocol::T_BYTE) { + xfer += iprot->readByte(this->mflag); + this->__isset.mflag = true; + } else { + xfer += iprot->skip(ftype); + } + break; + case 10: + if (ftype == ::apache::thrift::protocol::T_BYTE) { + xfer += iprot->readByte(this->xflag); + this->__isset.xflag = true; + } else { + xfer += iprot->skip(ftype); + } + break; + case 11: + if (ftype == ::apache::thrift::protocol::T_BYTE) { + xfer += iprot->readByte(this->eflag); + this->__isset.eflag = true; + } else { + xfer += iprot->skip(ftype); + } + break; + default: + xfer += iprot->skip(ftype); + break; + } + xfer += iprot->readFieldEnd(); + } + + xfer += iprot->readStructEnd(); + + return xfer; +} + +uint32_t BsnesRegisters::write(::apache::thrift::protocol::TProtocol* oprot) const { + uint32_t xfer = 0; + ::apache::thrift::protocol::TOutputRecursionTracker tracker(*oprot); + xfer += oprot->writeStructBegin("BsnesRegisters"); + + xfer += oprot->writeFieldBegin("pc", ::apache::thrift::protocol::T_I32, 1); + xfer += oprot->writeI32(this->pc); + xfer += oprot->writeFieldEnd(); + + xfer += oprot->writeFieldBegin("a", ::apache::thrift::protocol::T_I32, 2); + xfer += oprot->writeI32(this->a); + xfer += oprot->writeFieldEnd(); + + xfer += oprot->writeFieldBegin("x", ::apache::thrift::protocol::T_I32, 3); + xfer += oprot->writeI32(this->x); + xfer += oprot->writeFieldEnd(); + + xfer += oprot->writeFieldBegin("y", ::apache::thrift::protocol::T_I32, 4); + xfer += oprot->writeI32(this->y); + xfer += oprot->writeFieldEnd(); + + xfer += oprot->writeFieldBegin("s", ::apache::thrift::protocol::T_I32, 5); + xfer += oprot->writeI32(this->s); + xfer += oprot->writeFieldEnd(); + + xfer += oprot->writeFieldBegin("d", ::apache::thrift::protocol::T_I32, 6); + xfer += oprot->writeI32(this->d); + xfer += oprot->writeFieldEnd(); + + xfer += oprot->writeFieldBegin("db", ::apache::thrift::protocol::T_I16, 7); + xfer += oprot->writeI16(this->db); + xfer += oprot->writeFieldEnd(); + + xfer += oprot->writeFieldBegin("p", ::apache::thrift::protocol::T_I16, 8); + xfer += oprot->writeI16(this->p); + xfer += oprot->writeFieldEnd(); + + xfer += oprot->writeFieldBegin("mflag", ::apache::thrift::protocol::T_BYTE, 9); + xfer += oprot->writeByte(this->mflag); + xfer += oprot->writeFieldEnd(); + + xfer += oprot->writeFieldBegin("xflag", ::apache::thrift::protocol::T_BYTE, 10); + xfer += oprot->writeByte(this->xflag); + xfer += oprot->writeFieldEnd(); + + xfer += oprot->writeFieldBegin("eflag", ::apache::thrift::protocol::T_BYTE, 11); + xfer += oprot->writeByte(this->eflag); + xfer += oprot->writeFieldEnd(); + + xfer += oprot->writeFieldStop(); + xfer += oprot->writeStructEnd(); + return xfer; +} + +void swap(BsnesRegisters &a, BsnesRegisters &b) { + using ::std::swap; + swap(a.pc, b.pc); + swap(a.a, b.a); + swap(a.x, b.x); + swap(a.y, b.y); + swap(a.s, b.s); + swap(a.d, b.d); + swap(a.db, b.db); + swap(a.p, b.p); + swap(a.mflag, b.mflag); + swap(a.xflag, b.xflag); + swap(a.eflag, b.eflag); + swap(a.__isset, b.__isset); +} + +BsnesRegisters::BsnesRegisters(const BsnesRegisters& other0) { + pc = other0.pc; + a = other0.a; + x = other0.x; + y = other0.y; + s = other0.s; + d = other0.d; + db = other0.db; + p = other0.p; + mflag = other0.mflag; + xflag = other0.xflag; + eflag = other0.eflag; + __isset = other0.__isset; +} +BsnesRegisters& BsnesRegisters::operator=(const BsnesRegisters& other1) { + pc = other1.pc; + a = other1.a; + x = other1.x; + y = other1.y; + s = other1.s; + d = other1.d; + db = other1.db; + p = other1.p; + mflag = other1.mflag; + xflag = other1.xflag; + eflag = other1.eflag; + __isset = other1.__isset; + return *this; +} +void BsnesRegisters::printTo(std::ostream& out) const { + using ::apache::thrift::to_string; + out << "BsnesRegisters("; + out << "pc=" << to_string(pc); + out << ", " << "a=" << to_string(a); + out << ", " << "x=" << to_string(x); + out << ", " << "y=" << to_string(y); + out << ", " << "s=" << to_string(s); + out << ", " << "d=" << to_string(d); + out << ", " << "db=" << to_string(db); + out << ", " << "p=" << to_string(p); + out << ", " << "mflag=" << to_string(mflag); + out << ", " << "xflag=" << to_string(xflag); + out << ", " << "eflag=" << to_string(eflag); + out << ")"; +} + + +DbgBreakpoint::~DbgBreakpoint() noexcept { +} + + +void DbgBreakpoint::__set_type(const BpType::type val) { + this->type = val; +} + +void DbgBreakpoint::__set_bstart(const int32_t val) { + this->bstart = val; +} + +void DbgBreakpoint::__set_bend(const int32_t val) { + this->bend = val; +} + +void DbgBreakpoint::__set_enabled(const bool val) { + this->enabled = val; +} + +void DbgBreakpoint::__set_src(const DbgBptSource::type val) { + this->src = val; +} +std::ostream& operator<<(std::ostream& out, const DbgBreakpoint& obj) +{ + obj.printTo(out); + return out; +} + + +uint32_t DbgBreakpoint::read(::apache::thrift::protocol::TProtocol* iprot) { + + ::apache::thrift::protocol::TInputRecursionTracker tracker(*iprot); + uint32_t xfer = 0; + std::string fname; + ::apache::thrift::protocol::TType ftype; + int16_t fid; + + xfer += iprot->readStructBegin(fname); + + using ::apache::thrift::protocol::TProtocolException; + + + while (true) + { + xfer += iprot->readFieldBegin(fname, ftype, fid); + if (ftype == ::apache::thrift::protocol::T_STOP) { + break; + } + switch (fid) + { + case 1: + if (ftype == ::apache::thrift::protocol::T_I32) { + int32_t ecast2; + xfer += iprot->readI32(ecast2); + this->type = (BpType::type)ecast2; + this->__isset.type = true; + } else { + xfer += iprot->skip(ftype); + } + break; + case 2: + if (ftype == ::apache::thrift::protocol::T_I32) { + xfer += iprot->readI32(this->bstart); + this->__isset.bstart = true; + } else { + xfer += iprot->skip(ftype); + } + break; + case 3: + if (ftype == ::apache::thrift::protocol::T_I32) { + xfer += iprot->readI32(this->bend); + this->__isset.bend = true; + } else { + xfer += iprot->skip(ftype); + } + break; + case 4: + if (ftype == ::apache::thrift::protocol::T_BOOL) { + xfer += iprot->readBool(this->enabled); + this->__isset.enabled = true; + } else { + xfer += iprot->skip(ftype); + } + break; + case 5: + if (ftype == ::apache::thrift::protocol::T_I32) { + int32_t ecast3; + xfer += iprot->readI32(ecast3); + this->src = (DbgBptSource::type)ecast3; + this->__isset.src = true; + } else { + xfer += iprot->skip(ftype); + } + break; + default: + xfer += iprot->skip(ftype); + break; + } + xfer += iprot->readFieldEnd(); + } + + xfer += iprot->readStructEnd(); + + return xfer; +} + +uint32_t DbgBreakpoint::write(::apache::thrift::protocol::TProtocol* oprot) const { + uint32_t xfer = 0; + ::apache::thrift::protocol::TOutputRecursionTracker tracker(*oprot); + xfer += oprot->writeStructBegin("DbgBreakpoint"); + + xfer += oprot->writeFieldBegin("type", ::apache::thrift::protocol::T_I32, 1); + xfer += oprot->writeI32((int32_t)this->type); + xfer += oprot->writeFieldEnd(); + + xfer += oprot->writeFieldBegin("bstart", ::apache::thrift::protocol::T_I32, 2); + xfer += oprot->writeI32(this->bstart); + xfer += oprot->writeFieldEnd(); + + xfer += oprot->writeFieldBegin("bend", ::apache::thrift::protocol::T_I32, 3); + xfer += oprot->writeI32(this->bend); + xfer += oprot->writeFieldEnd(); + + xfer += oprot->writeFieldBegin("enabled", ::apache::thrift::protocol::T_BOOL, 4); + xfer += oprot->writeBool(this->enabled); + xfer += oprot->writeFieldEnd(); + + xfer += oprot->writeFieldBegin("src", ::apache::thrift::protocol::T_I32, 5); + xfer += oprot->writeI32((int32_t)this->src); + xfer += oprot->writeFieldEnd(); + + xfer += oprot->writeFieldStop(); + xfer += oprot->writeStructEnd(); + return xfer; +} + +void swap(DbgBreakpoint &a, DbgBreakpoint &b) { + using ::std::swap; + swap(a.type, b.type); + swap(a.bstart, b.bstart); + swap(a.bend, b.bend); + swap(a.enabled, b.enabled); + swap(a.src, b.src); + swap(a.__isset, b.__isset); +} + +DbgBreakpoint::DbgBreakpoint(const DbgBreakpoint& other4) { + type = other4.type; + bstart = other4.bstart; + bend = other4.bend; + enabled = other4.enabled; + src = other4.src; + __isset = other4.__isset; +} +DbgBreakpoint& DbgBreakpoint::operator=(const DbgBreakpoint& other5) { + type = other5.type; + bstart = other5.bstart; + bend = other5.bend; + enabled = other5.enabled; + src = other5.src; + __isset = other5.__isset; + return *this; +} +void DbgBreakpoint::printTo(std::ostream& out) const { + using ::apache::thrift::to_string; + out << "DbgBreakpoint("; + out << "type=" << to_string(type); + out << ", " << "bstart=" << to_string(bstart); + out << ", " << "bend=" << to_string(bend); + out << ", " << "enabled=" << to_string(enabled); + out << ", " << "src=" << to_string(src); + out << ")"; +} + + diff --git a/bsnes/gen-cpp/debug_proto_types.h b/bsnes/gen-cpp/debug_proto_types.h new file mode 100644 index 00000000..7a1630de --- /dev/null +++ b/bsnes/gen-cpp/debug_proto_types.h @@ -0,0 +1,287 @@ +/** + * Autogenerated by Thrift Compiler (0.14.0) + * + * DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING + * @generated + */ +#ifndef debug_proto_TYPES_H +#define debug_proto_TYPES_H + +#include + +#include +#include +#include +#include +#include + +#include +#include + + + + +struct BsnesRegister { + enum type { + pc = 0, + a = 1, + x = 2, + y = 3, + s = 4, + d = 5, + db = 6, + p = 7, + mflag = 8, + xflag = 9, + eflag = 10 + }; +}; + +extern const std::map _BsnesRegister_VALUES_TO_NAMES; + +std::ostream& operator<<(std::ostream& out, const BsnesRegister::type& val); + +std::string to_string(const BsnesRegister::type& val); + +struct BpType { + enum type { + BP_PC = 1, + BP_READ = 2, + BP_WRITE = 4 + }; +}; + +extern const std::map _BpType_VALUES_TO_NAMES; + +std::ostream& operator<<(std::ostream& out, const BpType::type& val); + +std::string to_string(const BpType::type& val); + +struct DbgMemorySource { + enum type { + CPUBus = 0, + APUBus = 1, + APURAM = 2, + DSP = 3, + VRAM = 4, + OAM = 5, + CGRAM = 6, + CartROM = 7, + CartRAM = 8, + SA1Bus = 9, + SFXBus = 10, + SGBBus = 11, + SGBROM = 12, + SGBRAM = 13 + }; +}; + +extern const std::map _DbgMemorySource_VALUES_TO_NAMES; + +std::ostream& operator<<(std::ostream& out, const DbgMemorySource::type& val); + +std::string to_string(const DbgMemorySource::type& val); + +struct DbgBptSource { + enum type { + CPUBus = 0, + APURAM = 1, + DSP = 2, + VRAM = 3, + OAM = 4, + CGRAM = 5, + SA1Bus = 6, + SFXBus = 7, + SGBBus = 8 + }; +}; + +extern const std::map _DbgBptSource_VALUES_TO_NAMES; + +std::ostream& operator<<(std::ostream& out, const DbgBptSource::type& val); + +std::string to_string(const DbgBptSource::type& val); + +class BsnesRegisters; + +class DbgBreakpoint; + +typedef struct _BsnesRegisters__isset { + _BsnesRegisters__isset() : pc(false), a(false), x(false), y(false), s(false), d(false), db(false), p(false), mflag(false), xflag(false), eflag(false) {} + bool pc :1; + bool a :1; + bool x :1; + bool y :1; + bool s :1; + bool d :1; + bool db :1; + bool p :1; + bool mflag :1; + bool xflag :1; + bool eflag :1; +} _BsnesRegisters__isset; + +class BsnesRegisters : public virtual ::apache::thrift::TBase { + public: + + BsnesRegisters(const BsnesRegisters&); + BsnesRegisters& operator=(const BsnesRegisters&); + BsnesRegisters() : pc(0), a(0), x(0), y(0), s(0), d(0), db(0), p(0), mflag(0), xflag(0), eflag(0) { + } + + virtual ~BsnesRegisters() noexcept; + int32_t pc; + int32_t a; + int32_t x; + int32_t y; + int32_t s; + int32_t d; + int16_t db; + int16_t p; + int8_t mflag; + int8_t xflag; + int8_t eflag; + + _BsnesRegisters__isset __isset; + + void __set_pc(const int32_t val); + + void __set_a(const int32_t val); + + void __set_x(const int32_t val); + + void __set_y(const int32_t val); + + void __set_s(const int32_t val); + + void __set_d(const int32_t val); + + void __set_db(const int16_t val); + + void __set_p(const int16_t val); + + void __set_mflag(const int8_t val); + + void __set_xflag(const int8_t val); + + void __set_eflag(const int8_t val); + + bool operator == (const BsnesRegisters & rhs) const + { + if (!(pc == rhs.pc)) + return false; + if (!(a == rhs.a)) + return false; + if (!(x == rhs.x)) + return false; + if (!(y == rhs.y)) + return false; + if (!(s == rhs.s)) + return false; + if (!(d == rhs.d)) + return false; + if (!(db == rhs.db)) + return false; + if (!(p == rhs.p)) + return false; + if (!(mflag == rhs.mflag)) + return false; + if (!(xflag == rhs.xflag)) + return false; + if (!(eflag == rhs.eflag)) + return false; + return true; + } + bool operator != (const BsnesRegisters &rhs) const { + return !(*this == rhs); + } + + bool operator < (const BsnesRegisters & ) const; + + uint32_t read(::apache::thrift::protocol::TProtocol* iprot); + uint32_t write(::apache::thrift::protocol::TProtocol* oprot) const; + + virtual void printTo(std::ostream& out) const; +}; + +void swap(BsnesRegisters &a, BsnesRegisters &b); + +std::ostream& operator<<(std::ostream& out, const BsnesRegisters& obj); + +typedef struct _DbgBreakpoint__isset { + _DbgBreakpoint__isset() : type(false), bstart(false), bend(false), enabled(false), src(false) {} + bool type :1; + bool bstart :1; + bool bend :1; + bool enabled :1; + bool src :1; +} _DbgBreakpoint__isset; + +class DbgBreakpoint : public virtual ::apache::thrift::TBase { + public: + + DbgBreakpoint(const DbgBreakpoint&); + DbgBreakpoint& operator=(const DbgBreakpoint&); + DbgBreakpoint() : type((BpType::type)0), bstart(0), bend(0), enabled(0), src((DbgBptSource::type)0) { + } + + virtual ~DbgBreakpoint() noexcept; + /** + * + * @see BpType + */ + BpType::type type; + int32_t bstart; + int32_t bend; + bool enabled; + /** + * + * @see DbgBptSource + */ + DbgBptSource::type src; + + _DbgBreakpoint__isset __isset; + + void __set_type(const BpType::type val); + + void __set_bstart(const int32_t val); + + void __set_bend(const int32_t val); + + void __set_enabled(const bool val); + + void __set_src(const DbgBptSource::type val); + + bool operator == (const DbgBreakpoint & rhs) const + { + if (!(type == rhs.type)) + return false; + if (!(bstart == rhs.bstart)) + return false; + if (!(bend == rhs.bend)) + return false; + if (!(enabled == rhs.enabled)) + return false; + if (!(src == rhs.src)) + return false; + return true; + } + bool operator != (const DbgBreakpoint &rhs) const { + return !(*this == rhs); + } + + bool operator < (const DbgBreakpoint & ) const; + + uint32_t read(::apache::thrift::protocol::TProtocol* iprot); + uint32_t write(::apache::thrift::protocol::TProtocol* oprot) const; + + virtual void printTo(std::ostream& out) const; +}; + +void swap(DbgBreakpoint &a, DbgBreakpoint &b); + +std::ostream& operator<<(std::ostream& out, const DbgBreakpoint& obj); + + + +#endif diff --git a/bsnes/snes/cpu/cpu.cpp b/bsnes/snes/cpu/cpu.cpp index 68fb79c2..adcf5961 100644 --- a/bsnes/snes/cpu/cpu.cpp +++ b/bsnes/snes/cpu/cpu.cpp @@ -1,4 +1,5 @@ #include +#include #define CPU_CPP namespace SNES { diff --git a/bsnes/snes/cpu/debugger/debugger.cpp b/bsnes/snes/cpu/debugger/debugger.cpp index 4e56d518..1ea5e353 100644 --- a/bsnes/snes/cpu/debugger/debugger.cpp +++ b/bsnes/snes/cpu/debugger/debugger.cpp @@ -46,10 +46,14 @@ void CPUDebugger::op_step() { usage[regs.pc] |= UsageOpcode | (regs.p.m << 1) | (regs.p.x << 0); opcode_pc = regs.pc; + extern void send_pause_event(); + if(debugger.step_cpu && (debugger.step_type == Debugger::StepType::StepInto || (debugger.step_type >= Debugger::StepType::StepOver && debugger.call_count < 0))) { + send_pause_event(); + debugger.break_event = Debugger::BreakEvent::CPUStep; debugger.step_type = Debugger::StepType::None; scheduler.exit(Scheduler::ExitReason::DebuggerEvent); @@ -58,6 +62,8 @@ void CPUDebugger::op_step() { if (debugger.break_on_wdm || debugger.break_on_brk) { uint8 opcode = disassembler_read(opcode_pc); if ((opcode == 0x42 && debugger.break_on_wdm) || (opcode == 0x00 && debugger.break_on_brk)) { + send_pause_event(); + debugger.breakpoint_hit = Debugger::SoftBreakCPU; debugger.break_event = Debugger::BreakEvent::BreakpointHit; scheduler.exit(Scheduler::ExitReason::DebuggerEvent); @@ -65,7 +71,9 @@ void CPUDebugger::op_step() { } debugger.breakpoint_test(Debugger::Breakpoint::Source::CPUBus, Debugger::Breakpoint::Mode::Exec, regs.pc, 0x00); } - if(step_event) step_event(); + if(step_event) { + step_event(); + } uint8 hvb_old; @@ -101,6 +109,9 @@ void CPUDebugger::op_step() { } alwaysinline uint8_t CPUDebugger::op_readpc() { + extern std::vector visited; + visited.push_back(regs.pc); + usage[regs.pc] |= UsageExec; int offset = cartridge.rom_offset(regs.pc); diff --git a/bsnes/snes/debugger/debugger.cpp b/bsnes/snes/debugger/debugger.cpp index c4375137..fd715420 100644 --- a/bsnes/snes/debugger/debugger.cpp +++ b/bsnes/snes/debugger/debugger.cpp @@ -49,6 +49,9 @@ void Debugger::breakpoint_test(Debugger::Breakpoint::Source source, Debugger::Br } } if (addr_start > addr_end) continue; + + extern void send_pause_event(); + send_pause_event(); breakpoint[i].counter++; breakpoint_hit = i; diff --git a/bsnes/snes/ppu/window/window.cpp b/bsnes/snes/ppu/window/window.cpp index f3a29a9a..538b9501 100644 --- a/bsnes/snes/ppu/window/window.cpp +++ b/bsnes/snes/ppu/window/window.cpp @@ -88,7 +88,7 @@ void PPU::Window::test( ) { bool one = Window::one ^ one_invert; bool two = Window::two ^ two_invert; - bool output; + bool output = true; if(one_enable == false && two_enable == false) { output = false; diff --git a/bsnes/thrift/debug_proto.thrift b/bsnes/thrift/debug_proto.thrift new file mode 100644 index 00000000..79682b0c --- /dev/null +++ b/bsnes/thrift/debug_proto.thrift @@ -0,0 +1,97 @@ +enum BsnesRegister { + pc, + a, + x, + y, + s, + d, + db, + p, + mflag, + xflag, + eflag, +} + +struct BsnesRegisters { + 1:i32 pc, + 2:i32 a, + 3:i32 x, + 4:i32 y, + 5:i32 s, + 6:i32 d, + 7:i16 db, + 8:i16 p, + 9:i8 mflag, + 10:i8 xflag, + 11:i8 eflag, +} + +enum BpType { + BP_PC = 1, + BP_READ = 2, + BP_WRITE = 4, +} + +enum DbgMemorySource { + CPUBus, + APUBus, + APURAM, + DSP, + VRAM, + OAM, + CGRAM, + CartROM, + CartRAM, + SA1Bus, + SFXBus, + SGBBus, + SGBROM, + SGBRAM, +} + +enum DbgBptSource { + CPUBus, + APURAM, + DSP, + VRAM, + OAM, + CGRAM, + SA1Bus, + SFXBus, + SGBBus, +} + +struct DbgBreakpoint { + 1:BpType type, + 2:i32 bstart, + 3:i32 bend, + 4:bool enabled, + 5:DbgBptSource src, +} + +service BsnesDebugger { + i32 get_cpu_reg(1:BsnesRegister reg), + BsnesRegisters get_cpu_regs(), + void set_cpu_reg(1:BsnesRegister reg, 2:i32 value), + + binary read_memory(1:DbgMemorySource src, 2:i32 address, 3:i32 size), + void write_memory(1:DbgMemorySource src, 2:i32 address, 3:binary data), + + void add_breakpoint(1:DbgBreakpoint bpt), + void del_breakpoint(1:DbgBreakpoint bpt), + + void pause(), + void resume(), + void start_emulation(), + void exit_emulation(), + + void step_into(), + void step_over(), +} + +service IdaClient { + oneway void start_event(), + oneway void add_visited(1:list changed), + oneway void pause_event(1:i32 address), + oneway void stop_event(), +} diff --git a/bsnes/thrift/libevent/bin/event_rpcgen.py b/bsnes/thrift/libevent/bin/event_rpcgen.py new file mode 100644 index 00000000..0bae3b0f --- /dev/null +++ b/bsnes/thrift/libevent/bin/event_rpcgen.py @@ -0,0 +1,1925 @@ +#!/usr/bin/env python +# +# Copyright (c) 2005-2007 Niels Provos +# Copyright (c) 2007-2012 Niels Provos and Nick Mathewson +# All rights reserved. +# +# Generates marshaling code based on libevent. + +# pylint: disable=too-many-lines +# pylint: disable=too-many-branches +# pylint: disable=too-many-public-methods +# pylint: disable=too-many-statements +# pylint: disable=global-statement + +# TODO: +# 1) propagate the arguments/options parsed by argparse down to the +# instantiated factory objects. +# 2) move the globals into a class that manages execution, including the +# progress outputs that go to stderr at the moment. +# 3) emit other languages. + +import argparse +import re +import sys + +_NAME = "event_rpcgen.py" +_VERSION = "0.1" + +# Globals +LINE_COUNT = 0 + +CPPCOMMENT_RE = re.compile(r"\/\/.*$") +NONIDENT_RE = re.compile(r"\W") +PREPROCESSOR_DEF_RE = re.compile(r"^#define") +STRUCT_REF_RE = re.compile(r"^struct\[(?P[a-zA-Z_][a-zA-Z0-9_]*)\]$") +STRUCT_DEF_RE = re.compile(r"^struct +[a-zA-Z_][a-zA-Z0-9_]* *{$") +WHITESPACE_RE = re.compile(r"\s+") + +HEADER_DIRECT = [] +CPP_DIRECT = [] + +QUIETLY = False + + +def declare(s): + if not QUIETLY: + print(s) + + +def TranslateList(mylist, mydict): + return [x % mydict for x in mylist] + + +class RpcGenError(Exception): + """An Exception class for parse errors.""" + + def __init__(self, why): # pylint: disable=super-init-not-called + self.why = why + + def __str__(self): + return str(self.why) + + +# Holds everything that makes a struct +class Struct(object): + def __init__(self, name): + self._name = name + self._entries = [] + self._tags = {} + declare(" Created struct: %s" % name) + + def AddEntry(self, entry): + if entry.Tag() in self._tags: + raise RpcGenError( + 'Entry "%s" duplicates tag number %d from "%s" ' + "around line %d" + % (entry.Name(), entry.Tag(), self._tags[entry.Tag()], LINE_COUNT) + ) + self._entries.append(entry) + self._tags[entry.Tag()] = entry.Name() + declare(" Added entry: %s" % entry.Name()) + + def Name(self): + return self._name + + def EntryTagName(self, entry): + """Creates the name inside an enumeration for distinguishing data + types.""" + name = "%s_%s" % (self._name, entry.Name()) + return name.upper() + + @staticmethod + def PrintIndented(filep, ident, code): + """Takes an array, add indentation to each entry and prints it.""" + for entry in code: + filep.write("%s%s\n" % (ident, entry)) + + +class StructCCode(Struct): + """ Knows how to generate C code for a struct """ + + def __init__(self, name): + Struct.__init__(self, name) + + def PrintTags(self, filep): + """Prints the tag definitions for a structure.""" + filep.write("/* Tag definition for %s */\n" % self._name) + filep.write("enum %s_ {\n" % self._name.lower()) + for entry in self._entries: + filep.write(" %s=%d,\n" % (self.EntryTagName(entry), entry.Tag())) + filep.write(" %s_MAX_TAGS\n" % (self._name.upper())) + filep.write("};\n\n") + + def PrintForwardDeclaration(self, filep): + filep.write("struct %s;\n" % self._name) + + def PrintDeclaration(self, filep): + filep.write("/* Structure declaration for %s */\n" % self._name) + filep.write("struct %s_access_ {\n" % self._name) + for entry in self._entries: + dcl = entry.AssignDeclaration("(*%s_assign)" % entry.Name()) + dcl.extend(entry.GetDeclaration("(*%s_get)" % entry.Name())) + if entry.Array(): + dcl.extend(entry.AddDeclaration("(*%s_add)" % entry.Name())) + self.PrintIndented(filep, " ", dcl) + filep.write("};\n\n") + + filep.write("struct %s {\n" % self._name) + filep.write(" struct %s_access_ *base;\n\n" % self._name) + for entry in self._entries: + dcl = entry.Declaration() + self.PrintIndented(filep, " ", dcl) + filep.write("\n") + for entry in self._entries: + filep.write(" ev_uint8_t %s_set;\n" % entry.Name()) + filep.write("};\n\n") + + filep.write( + """struct %(name)s *%(name)s_new(void); +struct %(name)s *%(name)s_new_with_arg(void *); +void %(name)s_free(struct %(name)s *); +void %(name)s_clear(struct %(name)s *); +void %(name)s_marshal(struct evbuffer *, const struct %(name)s *); +int %(name)s_unmarshal(struct %(name)s *, struct evbuffer *); +int %(name)s_complete(struct %(name)s *); +void evtag_marshal_%(name)s(struct evbuffer *, ev_uint32_t, + const struct %(name)s *); +int evtag_unmarshal_%(name)s(struct evbuffer *, ev_uint32_t, + struct %(name)s *);\n""" + % {"name": self._name} + ) + + # Write a setting function of every variable + for entry in self._entries: + self.PrintIndented( + filep, "", entry.AssignDeclaration(entry.AssignFuncName()) + ) + self.PrintIndented(filep, "", entry.GetDeclaration(entry.GetFuncName())) + if entry.Array(): + self.PrintIndented(filep, "", entry.AddDeclaration(entry.AddFuncName())) + + filep.write("/* --- %s done --- */\n\n" % self._name) + + def PrintCode(self, filep): + filep.write( + """/* + * Implementation of %s + */ +""" + % (self._name) + ) + + filep.write( + """ +static struct %(name)s_access_ %(name)s_base__ = { +""" + % {"name": self._name} + ) + for entry in self._entries: + self.PrintIndented(filep, " ", entry.CodeBase()) + filep.write("};\n\n") + + # Creation + filep.write( + """struct %(name)s * +%(name)s_new(void) +{ + return %(name)s_new_with_arg(NULL); +} + +struct %(name)s * +%(name)s_new_with_arg(void *unused) +{ + struct %(name)s *tmp; + if ((tmp = malloc(sizeof(struct %(name)s))) == NULL) { + event_warn("%%s: malloc", __func__); + return (NULL); + } + tmp->base = &%(name)s_base__; + +""" + % {"name": self._name} + ) + + for entry in self._entries: + self.PrintIndented(filep, " ", entry.CodeInitialize("tmp")) + filep.write(" tmp->%s_set = 0;\n\n" % entry.Name()) + + filep.write( + """ return (tmp); +} + +""" + ) + + # Adding + for entry in self._entries: + if entry.Array(): + self.PrintIndented(filep, "", entry.CodeAdd()) + filep.write("\n") + + # Assigning + for entry in self._entries: + self.PrintIndented(filep, "", entry.CodeAssign()) + filep.write("\n") + + # Getting + for entry in self._entries: + self.PrintIndented(filep, "", entry.CodeGet()) + filep.write("\n") + + # Clearing + filep.write( + """void +%(name)s_clear(struct %(name)s *tmp) +{ +""" + % {"name": self._name} + ) + for entry in self._entries: + self.PrintIndented(filep, " ", entry.CodeClear("tmp")) + + filep.write("}\n\n") + + # Freeing + filep.write( + """void +%(name)s_free(struct %(name)s *tmp) +{ +""" + % {"name": self._name} + ) + + for entry in self._entries: + self.PrintIndented(filep, " ", entry.CodeFree("tmp")) + + filep.write( + """ free(tmp); +} + +""" + ) + + # Marshaling + filep.write( + """void +%(name)s_marshal(struct evbuffer *evbuf, const struct %(name)s *tmp) { +""" + % {"name": self._name} + ) + for entry in self._entries: + indent = " " + # Optional entries do not have to be set + if entry.Optional(): + indent += " " + filep.write(" if (tmp->%s_set) {\n" % entry.Name()) + self.PrintIndented( + filep, + indent, + entry.CodeMarshal( + "evbuf", + self.EntryTagName(entry), + entry.GetVarName("tmp"), + entry.GetVarLen("tmp"), + ), + ) + if entry.Optional(): + filep.write(" }\n") + + filep.write("}\n\n") + + # Unmarshaling + filep.write( + """int +%(name)s_unmarshal(struct %(name)s *tmp, struct evbuffer *evbuf) +{ + ev_uint32_t tag; + while (evbuffer_get_length(evbuf) > 0) { + if (evtag_peek(evbuf, &tag) == -1) + return (-1); + switch (tag) { + +""" + % {"name": self._name} + ) + for entry in self._entries: + filep.write(" case %s:\n" % (self.EntryTagName(entry))) + if not entry.Array(): + filep.write( + """ if (tmp->%s_set) + return (-1); +""" + % (entry.Name()) + ) + + self.PrintIndented( + filep, + " ", + entry.CodeUnmarshal( + "evbuf", + self.EntryTagName(entry), + entry.GetVarName("tmp"), + entry.GetVarLen("tmp"), + ), + ) + + filep.write( + """ tmp->%s_set = 1; + break; +""" + % (entry.Name()) + ) + filep.write( + """ default: + return -1; + } + } + +""" + ) + # Check if it was decoded completely + filep.write( + """ if (%(name)s_complete(tmp) == -1) + return (-1); + return (0); +} +""" + % {"name": self._name} + ) + + # Checking if a structure has all the required data + filep.write( + """ +int +%(name)s_complete(struct %(name)s *msg) +{ +""" + % {"name": self._name} + ) + for entry in self._entries: + if not entry.Optional(): + code = [ + """if (!msg->%(name)s_set) + return (-1);""" + ] + code = TranslateList(code, entry.GetTranslation()) + self.PrintIndented(filep, " ", code) + + self.PrintIndented( + filep, " ", entry.CodeComplete("msg", entry.GetVarName("msg")) + ) + filep.write( + """ return (0); +} +""" + ) + + # Complete message unmarshaling + filep.write( + """ +int +evtag_unmarshal_%(name)s(struct evbuffer *evbuf, ev_uint32_t need_tag, + struct %(name)s *msg) +{ + ev_uint32_t tag; + int res = -1; + + struct evbuffer *tmp = evbuffer_new(); + + if (evtag_unmarshal(evbuf, &tag, tmp) == -1 || tag != need_tag) + goto error; + + if (%(name)s_unmarshal(msg, tmp) == -1) + goto error; + + res = 0; + + error: + evbuffer_free(tmp); + return (res); +} +""" + % {"name": self._name} + ) + + # Complete message marshaling + filep.write( + """ +void +evtag_marshal_%(name)s(struct evbuffer *evbuf, ev_uint32_t tag, + const struct %(name)s *msg) +{ + struct evbuffer *buf_ = evbuffer_new(); + assert(buf_ != NULL); + %(name)s_marshal(buf_, msg); + evtag_marshal_buffer(evbuf, tag, buf_); + evbuffer_free(buf_); +} + +""" + % {"name": self._name} + ) + + +class Entry(object): + def __init__(self, ent_type, name, tag): + self._type = ent_type + self._name = name + self._tag = int(tag) + self._ctype = ent_type + self._optional = False + self._can_be_array = False + self._array = False + self._line_count = -1 + self._struct = None + self._refname = None + + self._optpointer = True + self._optaddarg = True + + @staticmethod + def GetInitializer(): + raise NotImplementedError("Entry does not provide an initializer") + + def SetStruct(self, struct): + self._struct = struct + + def LineCount(self): + assert self._line_count != -1 + return self._line_count + + def SetLineCount(self, number): + self._line_count = number + + def Array(self): + return self._array + + def Optional(self): + return self._optional + + def Tag(self): + return self._tag + + def Name(self): + return self._name + + def Type(self): + return self._type + + def MakeArray(self): + self._array = True + + def MakeOptional(self): + self._optional = True + + def Verify(self): + if self.Array() and not self._can_be_array: + raise RpcGenError( + 'Entry "%s" cannot be created as an array ' + "around line %d" % (self._name, self.LineCount()) + ) + if not self._struct: + raise RpcGenError( + 'Entry "%s" does not know which struct it belongs to ' + "around line %d" % (self._name, self.LineCount()) + ) + if self._optional and self._array: + raise RpcGenError( + 'Entry "%s" has illegal combination of optional and array ' + "around line %d" % (self._name, self.LineCount()) + ) + + def GetTranslation(self, extradict=None): + if extradict is None: + extradict = {} + mapping = { + "parent_name": self._struct.Name(), + "name": self._name, + "ctype": self._ctype, + "refname": self._refname, + "optpointer": self._optpointer and "*" or "", + "optreference": self._optpointer and "&" or "", + "optaddarg": self._optaddarg and ", const %s value" % self._ctype or "", + } + for (k, v) in list(extradict.items()): + mapping[k] = v + + return mapping + + def GetVarName(self, var): + return "%(var)s->%(name)s_data" % self.GetTranslation({"var": var}) + + def GetVarLen(self, _var): + return "sizeof(%s)" % self._ctype + + def GetFuncName(self): + return "%s_%s_get" % (self._struct.Name(), self._name) + + def GetDeclaration(self, funcname): + code = [ + "int %s(struct %s *, %s *);" % (funcname, self._struct.Name(), self._ctype) + ] + return code + + def CodeGet(self): + code = """int +%(parent_name)s_%(name)s_get(struct %(parent_name)s *msg, %(ctype)s *value) +{ + if (msg->%(name)s_set != 1) + return (-1); + *value = msg->%(name)s_data; + return (0); +}""" + code = code % self.GetTranslation() + return code.split("\n") + + def AssignFuncName(self): + return "%s_%s_assign" % (self._struct.Name(), self._name) + + def AddFuncName(self): + return "%s_%s_add" % (self._struct.Name(), self._name) + + def AssignDeclaration(self, funcname): + code = [ + "int %s(struct %s *, const %s);" + % (funcname, self._struct.Name(), self._ctype) + ] + return code + + def CodeAssign(self): + code = [ + "int", + "%(parent_name)s_%(name)s_assign(struct %(parent_name)s *msg," + " const %(ctype)s value)", + "{", + " msg->%(name)s_set = 1;", + " msg->%(name)s_data = value;", + " return (0);", + "}", + ] + code = "\n".join(code) + code = code % self.GetTranslation() + return code.split("\n") + + def CodeClear(self, structname): + code = ["%s->%s_set = 0;" % (structname, self.Name())] + + return code + + @staticmethod + def CodeComplete(_structname, _var_name): + return [] + + @staticmethod + def CodeFree(_name): + return [] + + def CodeBase(self): + code = ["%(parent_name)s_%(name)s_assign,", "%(parent_name)s_%(name)s_get,"] + if self.Array(): + code.append("%(parent_name)s_%(name)s_add,") + + code = "\n".join(code) + code = code % self.GetTranslation() + return code.split("\n") + + +class EntryBytes(Entry): + def __init__(self, ent_type, name, tag, length): + # Init base class + super(EntryBytes, self).__init__(ent_type, name, tag) + + self._length = length + self._ctype = "ev_uint8_t" + + @staticmethod + def GetInitializer(): + return "NULL" + + def GetVarLen(self, _var): + return "(%s)" % self._length + + @staticmethod + def CodeArrayAdd(varname, _value): + # XXX: copy here + return ["%(varname)s = NULL;" % {"varname": varname}] + + def GetDeclaration(self, funcname): + code = [ + "int %s(struct %s *, %s **);" % (funcname, self._struct.Name(), self._ctype) + ] + return code + + def AssignDeclaration(self, funcname): + code = [ + "int %s(struct %s *, const %s *);" + % (funcname, self._struct.Name(), self._ctype) + ] + return code + + def Declaration(self): + dcl = ["ev_uint8_t %s_data[%s];" % (self._name, self._length)] + + return dcl + + def CodeGet(self): + name = self._name + code = [ + "int", + "%s_%s_get(struct %s *msg, %s **value)" + % (self._struct.Name(), name, self._struct.Name(), self._ctype), + "{", + " if (msg->%s_set != 1)" % name, + " return (-1);", + " *value = msg->%s_data;" % name, + " return (0);", + "}", + ] + return code + + def CodeAssign(self): + name = self._name + code = [ + "int", + "%s_%s_assign(struct %s *msg, const %s *value)" + % (self._struct.Name(), name, self._struct.Name(), self._ctype), + "{", + " msg->%s_set = 1;" % name, + " memcpy(msg->%s_data, value, %s);" % (name, self._length), + " return (0);", + "}", + ] + return code + + def CodeUnmarshal(self, buf, tag_name, var_name, var_len): + code = [ + "if (evtag_unmarshal_fixed(%(buf)s, %(tag)s, " + "%(var)s, %(varlen)s) == -1) {", + ' event_warnx("%%s: failed to unmarshal %(name)s", __func__);', + " return (-1);", + "}", + ] + return TranslateList( + code, + self.GetTranslation( + {"var": var_name, "varlen": var_len, "buf": buf, "tag": tag_name} + ), + ) + + @staticmethod + def CodeMarshal(buf, tag_name, var_name, var_len): + code = ["evtag_marshal(%s, %s, %s, %s);" % (buf, tag_name, var_name, var_len)] + return code + + def CodeClear(self, structname): + code = [ + "%s->%s_set = 0;" % (structname, self.Name()), + "memset(%s->%s_data, 0, sizeof(%s->%s_data));" + % (structname, self._name, structname, self._name), + ] + + return code + + def CodeInitialize(self, name): + code = [ + "memset(%s->%s_data, 0, sizeof(%s->%s_data));" + % (name, self._name, name, self._name) + ] + return code + + def Verify(self): + if not self._length: + raise RpcGenError( + 'Entry "%s" needs a length ' + "around line %d" % (self._name, self.LineCount()) + ) + + super(EntryBytes, self).Verify() + + +class EntryInt(Entry): + def __init__(self, ent_type, name, tag, bits=32): + # Init base class + super(EntryInt, self).__init__(ent_type, name, tag) + + self._can_be_array = True + if bits == 32: + self._ctype = "ev_uint32_t" + self._marshal_type = "int" + if bits == 64: + self._ctype = "ev_uint64_t" + self._marshal_type = "int64" + + @staticmethod + def GetInitializer(): + return "0" + + @staticmethod + def CodeArrayFree(_var): + return [] + + @staticmethod + def CodeArrayAssign(varname, srcvar): + return ["%(varname)s = %(srcvar)s;" % {"varname": varname, "srcvar": srcvar}] + + @staticmethod + def CodeArrayAdd(varname, value): + """Returns a new entry of this type.""" + return ["%(varname)s = %(value)s;" % {"varname": varname, "value": value}] + + def CodeUnmarshal(self, buf, tag_name, var_name, _var_len): + code = [ + "if (evtag_unmarshal_%(ma)s(%(buf)s, %(tag)s, &%(var)s) == -1) {", + ' event_warnx("%%s: failed to unmarshal %(name)s", __func__);', + " return (-1);", + "}", + ] + code = "\n".join(code) % self.GetTranslation( + {"ma": self._marshal_type, "buf": buf, "tag": tag_name, "var": var_name} + ) + return code.split("\n") + + def CodeMarshal(self, buf, tag_name, var_name, _var_len): + code = [ + "evtag_marshal_%s(%s, %s, %s);" + % (self._marshal_type, buf, tag_name, var_name) + ] + return code + + def Declaration(self): + dcl = ["%s %s_data;" % (self._ctype, self._name)] + + return dcl + + def CodeInitialize(self, name): + code = ["%s->%s_data = 0;" % (name, self._name)] + return code + + +class EntryString(Entry): + def __init__(self, ent_type, name, tag): + # Init base class + super(EntryString, self).__init__(ent_type, name, tag) + + self._can_be_array = True + self._ctype = "char *" + + @staticmethod + def GetInitializer(): + return "NULL" + + @staticmethod + def CodeArrayFree(varname): + code = ["if (%(var)s != NULL) free(%(var)s);"] + + return TranslateList(code, {"var": varname}) + + @staticmethod + def CodeArrayAssign(varname, srcvar): + code = [ + "if (%(var)s != NULL)", + " free(%(var)s);", + "%(var)s = strdup(%(srcvar)s);", + "if (%(var)s == NULL) {", + ' event_warnx("%%s: strdup", __func__);', + " return (-1);", + "}", + ] + + return TranslateList(code, {"var": varname, "srcvar": srcvar}) + + @staticmethod + def CodeArrayAdd(varname, value): + code = [ + "if (%(value)s != NULL) {", + " %(var)s = strdup(%(value)s);", + " if (%(var)s == NULL) {", + " goto error;", + " }", + "} else {", + " %(var)s = NULL;", + "}", + ] + + return TranslateList(code, {"var": varname, "value": value}) + + def GetVarLen(self, var): + return "strlen(%s)" % self.GetVarName(var) + + @staticmethod + def CodeMakeInitalize(varname): + return "%(varname)s = NULL;" % {"varname": varname} + + def CodeAssign(self): + code = """int +%(parent_name)s_%(name)s_assign(struct %(parent_name)s *msg, + const %(ctype)s value) +{ + if (msg->%(name)s_data != NULL) + free(msg->%(name)s_data); + if ((msg->%(name)s_data = strdup(value)) == NULL) + return (-1); + msg->%(name)s_set = 1; + return (0); +}""" % ( + self.GetTranslation() + ) + + return code.split("\n") + + def CodeUnmarshal(self, buf, tag_name, var_name, _var_len): + code = [ + "if (evtag_unmarshal_string(%(buf)s, %(tag)s, &%(var)s) == -1) {", + ' event_warnx("%%s: failed to unmarshal %(name)s", __func__);', + " return (-1);", + "}", + ] + code = "\n".join(code) % self.GetTranslation( + {"buf": buf, "tag": tag_name, "var": var_name} + ) + return code.split("\n") + + @staticmethod + def CodeMarshal(buf, tag_name, var_name, _var_len): + code = ["evtag_marshal_string(%s, %s, %s);" % (buf, tag_name, var_name)] + return code + + def CodeClear(self, structname): + code = [ + "if (%s->%s_set == 1) {" % (structname, self.Name()), + " free(%s->%s_data);" % (structname, self.Name()), + " %s->%s_data = NULL;" % (structname, self.Name()), + " %s->%s_set = 0;" % (structname, self.Name()), + "}", + ] + + return code + + def CodeInitialize(self, name): + code = ["%s->%s_data = NULL;" % (name, self._name)] + return code + + def CodeFree(self, name): + code = [ + "if (%s->%s_data != NULL)" % (name, self._name), + " free (%s->%s_data);" % (name, self._name), + ] + + return code + + def Declaration(self): + dcl = ["char *%s_data;" % self._name] + + return dcl + + +class EntryStruct(Entry): + def __init__(self, ent_type, name, tag, refname): + # Init base class + super(EntryStruct, self).__init__(ent_type, name, tag) + + self._optpointer = False + self._can_be_array = True + self._refname = refname + self._ctype = "struct %s*" % refname + self._optaddarg = False + + def GetInitializer(self): + return "NULL" + + def GetVarLen(self, _var): + return "-1" + + def CodeArrayAdd(self, varname, _value): + code = [ + "%(varname)s = %(refname)s_new();", + "if (%(varname)s == NULL)", + " goto error;", + ] + + return TranslateList(code, self.GetTranslation({"varname": varname})) + + def CodeArrayFree(self, var): + code = ["%(refname)s_free(%(var)s);" % self.GetTranslation({"var": var})] + return code + + def CodeArrayAssign(self, var, srcvar): + code = [ + "int had_error = 0;", + "struct evbuffer *tmp = NULL;", + "%(refname)s_clear(%(var)s);", + "if ((tmp = evbuffer_new()) == NULL) {", + ' event_warn("%%s: evbuffer_new()", __func__);', + " had_error = 1;", + " goto done;", + "}", + "%(refname)s_marshal(tmp, %(srcvar)s);", + "if (%(refname)s_unmarshal(%(var)s, tmp) == -1) {", + ' event_warnx("%%s: %(refname)s_unmarshal", __func__);', + " had_error = 1;", + " goto done;", + "}", + "done:", + "if (tmp != NULL)", + " evbuffer_free(tmp);", + "if (had_error) {", + " %(refname)s_clear(%(var)s);", + " return (-1);", + "}", + ] + + return TranslateList(code, self.GetTranslation({"var": var, "srcvar": srcvar})) + + def CodeGet(self): + name = self._name + code = [ + "int", + "%s_%s_get(struct %s *msg, %s *value)" + % (self._struct.Name(), name, self._struct.Name(), self._ctype), + "{", + " if (msg->%s_set != 1) {" % name, + " msg->%s_data = %s_new();" % (name, self._refname), + " if (msg->%s_data == NULL)" % name, + " return (-1);", + " msg->%s_set = 1;" % name, + " }", + " *value = msg->%s_data;" % name, + " return (0);", + "}", + ] + return code + + def CodeAssign(self): + code = ( + """int +%(parent_name)s_%(name)s_assign(struct %(parent_name)s *msg, + const %(ctype)s value) +{ + struct evbuffer *tmp = NULL; + if (msg->%(name)s_set) { + %(refname)s_clear(msg->%(name)s_data); + msg->%(name)s_set = 0; + } else { + msg->%(name)s_data = %(refname)s_new(); + if (msg->%(name)s_data == NULL) { + event_warn("%%s: %(refname)s_new()", __func__); + goto error; + } + } + if ((tmp = evbuffer_new()) == NULL) { + event_warn("%%s: evbuffer_new()", __func__); + goto error; + } + %(refname)s_marshal(tmp, value); + if (%(refname)s_unmarshal(msg->%(name)s_data, tmp) == -1) { + event_warnx("%%s: %(refname)s_unmarshal", __func__); + goto error; + } + msg->%(name)s_set = 1; + evbuffer_free(tmp); + return (0); + error: + if (tmp != NULL) + evbuffer_free(tmp); + if (msg->%(name)s_data != NULL) { + %(refname)s_free(msg->%(name)s_data); + msg->%(name)s_data = NULL; + } + return (-1); +}""" + % self.GetTranslation() + ) + return code.split("\n") + + def CodeComplete(self, structname, var_name): + code = [ + "if (%(structname)s->%(name)s_set && " + "%(refname)s_complete(%(var)s) == -1)", + " return (-1);", + ] + + return TranslateList( + code, self.GetTranslation({"structname": structname, "var": var_name}) + ) + + def CodeUnmarshal(self, buf, tag_name, var_name, _var_len): + code = [ + "%(var)s = %(refname)s_new();", + "if (%(var)s == NULL)", + " return (-1);", + "if (evtag_unmarshal_%(refname)s(%(buf)s, %(tag)s, ", + " %(var)s) == -1) {", + ' event_warnx("%%s: failed to unmarshal %(name)s", __func__);', + " return (-1);", + "}", + ] + code = "\n".join(code) % self.GetTranslation( + {"buf": buf, "tag": tag_name, "var": var_name} + ) + return code.split("\n") + + def CodeMarshal(self, buf, tag_name, var_name, _var_len): + code = [ + "evtag_marshal_%s(%s, %s, %s);" % (self._refname, buf, tag_name, var_name) + ] + return code + + def CodeClear(self, structname): + code = [ + "if (%s->%s_set == 1) {" % (structname, self.Name()), + " %s_free(%s->%s_data);" % (self._refname, structname, self.Name()), + " %s->%s_data = NULL;" % (structname, self.Name()), + " %s->%s_set = 0;" % (structname, self.Name()), + "}", + ] + + return code + + def CodeInitialize(self, name): + code = ["%s->%s_data = NULL;" % (name, self._name)] + return code + + def CodeFree(self, name): + code = [ + "if (%s->%s_data != NULL)" % (name, self._name), + " %s_free(%s->%s_data);" % (self._refname, name, self._name), + ] + + return code + + def Declaration(self): + dcl = ["%s %s_data;" % (self._ctype, self._name)] + + return dcl + + +class EntryVarBytes(Entry): + def __init__(self, ent_type, name, tag): + # Init base class + super(EntryVarBytes, self).__init__(ent_type, name, tag) + + self._ctype = "ev_uint8_t *" + + @staticmethod + def GetInitializer(): + return "NULL" + + def GetVarLen(self, var): + return "%(var)s->%(name)s_length" % self.GetTranslation({"var": var}) + + @staticmethod + def CodeArrayAdd(varname, _value): + # xxx: copy + return ["%(varname)s = NULL;" % {"varname": varname}] + + def GetDeclaration(self, funcname): + code = [ + "int %s(struct %s *, %s *, ev_uint32_t *);" + % (funcname, self._struct.Name(), self._ctype) + ] + return code + + def AssignDeclaration(self, funcname): + code = [ + "int %s(struct %s *, const %s, ev_uint32_t);" + % (funcname, self._struct.Name(), self._ctype) + ] + return code + + def CodeAssign(self): + name = self._name + code = [ + "int", + "%s_%s_assign(struct %s *msg, " + "const %s value, ev_uint32_t len)" + % (self._struct.Name(), name, self._struct.Name(), self._ctype), + "{", + " if (msg->%s_data != NULL)" % name, + " free (msg->%s_data);" % name, + " msg->%s_data = malloc(len);" % name, + " if (msg->%s_data == NULL)" % name, + " return (-1);", + " msg->%s_set = 1;" % name, + " msg->%s_length = len;" % name, + " memcpy(msg->%s_data, value, len);" % name, + " return (0);", + "}", + ] + return code + + def CodeGet(self): + name = self._name + code = [ + "int", + "%s_%s_get(struct %s *msg, %s *value, ev_uint32_t *plen)" + % (self._struct.Name(), name, self._struct.Name(), self._ctype), + "{", + " if (msg->%s_set != 1)" % name, + " return (-1);", + " *value = msg->%s_data;" % name, + " *plen = msg->%s_length;" % name, + " return (0);", + "}", + ] + return code + + def CodeUnmarshal(self, buf, tag_name, var_name, var_len): + code = [ + "if (evtag_payload_length(%(buf)s, &%(varlen)s) == -1)", + " return (-1);", + # We do not want DoS opportunities + "if (%(varlen)s > evbuffer_get_length(%(buf)s))", + " return (-1);", + "if ((%(var)s = malloc(%(varlen)s)) == NULL)", + " return (-1);", + "if (evtag_unmarshal_fixed(%(buf)s, %(tag)s, %(var)s, " + "%(varlen)s) == -1) {", + ' event_warnx("%%s: failed to unmarshal %(name)s", __func__);', + " return (-1);", + "}", + ] + code = "\n".join(code) % self.GetTranslation( + {"buf": buf, "tag": tag_name, "var": var_name, "varlen": var_len} + ) + return code.split("\n") + + @staticmethod + def CodeMarshal(buf, tag_name, var_name, var_len): + code = ["evtag_marshal(%s, %s, %s, %s);" % (buf, tag_name, var_name, var_len)] + return code + + def CodeClear(self, structname): + code = [ + "if (%s->%s_set == 1) {" % (structname, self.Name()), + " free (%s->%s_data);" % (structname, self.Name()), + " %s->%s_data = NULL;" % (structname, self.Name()), + " %s->%s_length = 0;" % (structname, self.Name()), + " %s->%s_set = 0;" % (structname, self.Name()), + "}", + ] + + return code + + def CodeInitialize(self, name): + code = [ + "%s->%s_data = NULL;" % (name, self._name), + "%s->%s_length = 0;" % (name, self._name), + ] + return code + + def CodeFree(self, name): + code = [ + "if (%s->%s_data != NULL)" % (name, self._name), + " free(%s->%s_data);" % (name, self._name), + ] + + return code + + def Declaration(self): + dcl = [ + "ev_uint8_t *%s_data;" % self._name, + "ev_uint32_t %s_length;" % self._name, + ] + + return dcl + + +class EntryArray(Entry): + _index = None + + def __init__(self, entry): + # Init base class + super(EntryArray, self).__init__(entry._type, entry._name, entry._tag) + + self._entry = entry + self._refname = entry._refname + self._ctype = self._entry._ctype + self._optional = True + self._optpointer = self._entry._optpointer + self._optaddarg = self._entry._optaddarg + + # provide a new function for accessing the variable name + def GetVarName(var_name): + return "%(var)s->%(name)s_data[%(index)s]" % self._entry.GetTranslation( + {"var": var_name, "index": self._index} + ) + + self._entry.GetVarName = GetVarName + + def GetInitializer(self): + return "NULL" + + def GetVarName(self, var): + return var + + def GetVarLen(self, _var_name): + return "-1" + + def GetDeclaration(self, funcname): + """Allows direct access to elements of the array.""" + code = [ + "int %(funcname)s(struct %(parent_name)s *, int, %(ctype)s *);" + % self.GetTranslation({"funcname": funcname}) + ] + return code + + def AssignDeclaration(self, funcname): + code = [ + "int %s(struct %s *, int, const %s);" + % (funcname, self._struct.Name(), self._ctype) + ] + return code + + def AddDeclaration(self, funcname): + code = [ + "%(ctype)s %(optpointer)s " + "%(funcname)s(struct %(parent_name)s *msg%(optaddarg)s);" + % self.GetTranslation({"funcname": funcname}) + ] + return code + + def CodeGet(self): + code = """int +%(parent_name)s_%(name)s_get(struct %(parent_name)s *msg, int offset, + %(ctype)s *value) +{ + if (!msg->%(name)s_set || offset < 0 || offset >= msg->%(name)s_length) + return (-1); + *value = msg->%(name)s_data[offset]; + return (0); +} +""" % ( + self.GetTranslation() + ) + + return code.splitlines() + + def CodeAssign(self): + code = [ + "int", + "%(parent_name)s_%(name)s_assign(struct %(parent_name)s *msg, int off,", + " const %(ctype)s value)", + "{", + " if (!msg->%(name)s_set || off < 0 || off >= msg->%(name)s_length)", + " return (-1);", + "", + " {", + ] + code = TranslateList(code, self.GetTranslation()) + + codearrayassign = self._entry.CodeArrayAssign( + "msg->%(name)s_data[off]" % self.GetTranslation(), "value" + ) + code += [" " + x for x in codearrayassign] + + code += TranslateList([" }", " return (0);", "}"], self.GetTranslation()) + + return code + + def CodeAdd(self): + codearrayadd = self._entry.CodeArrayAdd( + "msg->%(name)s_data[msg->%(name)s_length - 1]" % self.GetTranslation(), + "value", + ) + code = [ + "static int", + "%(parent_name)s_%(name)s_expand_to_hold_more(" + "struct %(parent_name)s *msg)", + "{", + " int tobe_allocated = msg->%(name)s_num_allocated;", + " %(ctype)s* new_data = NULL;", + " tobe_allocated = !tobe_allocated ? 1 : tobe_allocated << 1;", + " new_data = (%(ctype)s*) realloc(msg->%(name)s_data,", + " tobe_allocated * sizeof(%(ctype)s));", + " if (new_data == NULL)", + " return -1;", + " msg->%(name)s_data = new_data;", + " msg->%(name)s_num_allocated = tobe_allocated;", + " return 0;", + "}", + "", + "%(ctype)s %(optpointer)s", + "%(parent_name)s_%(name)s_add(struct %(parent_name)s *msg%(optaddarg)s)", + "{", + " if (++msg->%(name)s_length >= msg->%(name)s_num_allocated) {", + " if (%(parent_name)s_%(name)s_expand_to_hold_more(msg)<0)", + " goto error;", + " }", + ] + + code = TranslateList(code, self.GetTranslation()) + + code += [" " + x for x in codearrayadd] + + code += TranslateList( + [ + " msg->%(name)s_set = 1;", + " return %(optreference)s(msg->%(name)s_data[" + "msg->%(name)s_length - 1]);", + "error:", + " --msg->%(name)s_length;", + " return (NULL);", + "}", + ], + self.GetTranslation(), + ) + + return code + + def CodeComplete(self, structname, var_name): + self._index = "i" + tmp = self._entry.CodeComplete(structname, self._entry.GetVarName(var_name)) + # skip the whole loop if there is nothing to check + if not tmp: + return [] + + translate = self.GetTranslation({"structname": structname}) + code = [ + "{", + " int i;", + " for (i = 0; i < %(structname)s->%(name)s_length; ++i) {", + ] + + code = TranslateList(code, translate) + + code += [" " + x for x in tmp] + + code += [" }", "}"] + + return code + + def CodeUnmarshal(self, buf, tag_name, var_name, _var_len): + translate = self.GetTranslation( + { + "var": var_name, + "buf": buf, + "tag": tag_name, + "init": self._entry.GetInitializer(), + } + ) + code = [ + "if (%(var)s->%(name)s_length >= %(var)s->%(name)s_num_allocated &&", + " %(parent_name)s_%(name)s_expand_to_hold_more(%(var)s) < 0) {", + ' puts("HEY NOW");', + " return (-1);", + "}", + ] + + # the unmarshal code directly returns + code = TranslateList(code, translate) + + self._index = "%(var)s->%(name)s_length" % translate + code += self._entry.CodeUnmarshal( + buf, + tag_name, + self._entry.GetVarName(var_name), + self._entry.GetVarLen(var_name), + ) + + code += ["++%(var)s->%(name)s_length;" % translate] + + return code + + def CodeMarshal(self, buf, tag_name, var_name, _var_len): + code = ["{", " int i;", " for (i = 0; i < %(var)s->%(name)s_length; ++i) {"] + + self._index = "i" + code += self._entry.CodeMarshal( + buf, + tag_name, + self._entry.GetVarName(var_name), + self._entry.GetVarLen(var_name), + ) + code += [" }", "}"] + + code = "\n".join(code) % self.GetTranslation({"var": var_name}) + + return code.split("\n") + + def CodeClear(self, structname): + translate = self.GetTranslation({"structname": structname}) + codearrayfree = self._entry.CodeArrayFree( + "%(structname)s->%(name)s_data[i]" + % self.GetTranslation({"structname": structname}) + ) + + code = ["if (%(structname)s->%(name)s_set == 1) {"] + + if codearrayfree: + code += [ + " int i;", + " for (i = 0; i < %(structname)s->%(name)s_length; ++i) {", + ] + + code = TranslateList(code, translate) + + if codearrayfree: + code += [" " + x for x in codearrayfree] + code += [" }"] + + code += TranslateList( + [ + " free(%(structname)s->%(name)s_data);", + " %(structname)s->%(name)s_data = NULL;", + " %(structname)s->%(name)s_set = 0;", + " %(structname)s->%(name)s_length = 0;", + " %(structname)s->%(name)s_num_allocated = 0;", + "}", + ], + translate, + ) + + return code + + def CodeInitialize(self, name): + code = [ + "%s->%s_data = NULL;" % (name, self._name), + "%s->%s_length = 0;" % (name, self._name), + "%s->%s_num_allocated = 0;" % (name, self._name), + ] + return code + + def CodeFree(self, structname): + code = self.CodeClear(structname) + + code += TranslateList( + ["free(%(structname)s->%(name)s_data);"], + self.GetTranslation({"structname": structname}), + ) + + return code + + def Declaration(self): + dcl = [ + "%s *%s_data;" % (self._ctype, self._name), + "int %s_length;" % self._name, + "int %s_num_allocated;" % self._name, + ] + + return dcl + + +def NormalizeLine(line): + + line = CPPCOMMENT_RE.sub("", line) + line = line.strip() + line = WHITESPACE_RE.sub(" ", line) + + return line + + +ENTRY_NAME_RE = re.compile(r"(?P[^\[\]]+)(\[(?P.*)\])?") +ENTRY_TAG_NUMBER_RE = re.compile(r"(0x)?\d+", re.I) + + +def ProcessOneEntry(factory, newstruct, entry): + optional = False + array = False + entry_type = "" + name = "" + tag = "" + tag_set = None + separator = "" + fixed_length = "" + + for token in entry.split(" "): + if not entry_type: + if not optional and token == "optional": + optional = True + continue + + if not array and token == "array": + array = True + continue + + if not entry_type: + entry_type = token + continue + + if not name: + res = ENTRY_NAME_RE.match(token) + if not res: + raise RpcGenError( + r"""Cannot parse name: "%s" around line %d""" % (entry, LINE_COUNT) + ) + name = res.group("name") + fixed_length = res.group("fixed_length") + continue + + if not separator: + separator = token + if separator != "=": + raise RpcGenError( + r'''Expected "=" after name "%s" got "%s"''' % (name, token) + ) + continue + + if not tag_set: + tag_set = 1 + if not ENTRY_TAG_NUMBER_RE.match(token): + raise RpcGenError(r'''Expected tag number: "%s"''' % (entry)) + tag = int(token, 0) + continue + + raise RpcGenError(r'''Cannot parse "%s"''' % (entry)) + + if not tag_set: + raise RpcGenError(r'''Need tag number: "%s"''' % (entry)) + + # Create the right entry + if entry_type == "bytes": + if fixed_length: + newentry = factory.EntryBytes(entry_type, name, tag, fixed_length) + else: + newentry = factory.EntryVarBytes(entry_type, name, tag) + elif entry_type == "int" and not fixed_length: + newentry = factory.EntryInt(entry_type, name, tag) + elif entry_type == "int64" and not fixed_length: + newentry = factory.EntryInt(entry_type, name, tag, bits=64) + elif entry_type == "string" and not fixed_length: + newentry = factory.EntryString(entry_type, name, tag) + else: + res = STRUCT_REF_RE.match(entry_type) + if res: + # References another struct defined in our file + newentry = factory.EntryStruct(entry_type, name, tag, res.group("name")) + else: + raise RpcGenError('Bad type: "%s" in "%s"' % (entry_type, entry)) + + structs = [] + + if optional: + newentry.MakeOptional() + if array: + newentry.MakeArray() + + newentry.SetStruct(newstruct) + newentry.SetLineCount(LINE_COUNT) + newentry.Verify() + + if array: + # We need to encapsulate this entry into a struct + newentry = factory.EntryArray(newentry) + newentry.SetStruct(newstruct) + newentry.SetLineCount(LINE_COUNT) + newentry.MakeArray() + + newstruct.AddEntry(newentry) + + return structs + + +def ProcessStruct(factory, data): + tokens = data.split(" ") + + # First three tokens are: 'struct' 'name' '{' + newstruct = factory.Struct(tokens[1]) + + inside = " ".join(tokens[3:-1]) + + tokens = inside.split(";") + + structs = [] + + for entry in tokens: + entry = NormalizeLine(entry) + if not entry: + continue + + # It's possible that new structs get defined in here + structs.extend(ProcessOneEntry(factory, newstruct, entry)) + + structs.append(newstruct) + return structs + + +C_COMMENT_START = "/*" +C_COMMENT_END = "*/" + +C_COMMENT_START_RE = re.compile(re.escape(C_COMMENT_START)) +C_COMMENT_END_RE = re.compile(re.escape(C_COMMENT_END)) + +C_COMMENT_START_SUB_RE = re.compile(r"%s.*$" % (re.escape(C_COMMENT_START))) +C_COMMENT_END_SUB_RE = re.compile(r"%s.*$" % (re.escape(C_COMMENT_END))) + +C_MULTILINE_COMMENT_SUB_RE = re.compile( + r"%s.*?%s" % (re.escape(C_COMMENT_START), re.escape(C_COMMENT_END)) +) +CPP_CONDITIONAL_BLOCK_RE = re.compile(r"#(if( |def)|endif)") +INCLUDE_RE = re.compile(r'#include (".+"|<.+>)') + + +def GetNextStruct(filep): + global CPP_DIRECT + global LINE_COUNT + + got_struct = False + have_c_comment = False + + data = "" + + while True: + line = filep.readline() + if not line: + break + + LINE_COUNT += 1 + line = line[:-1] + + if not have_c_comment and C_COMMENT_START_RE.search(line): + if C_MULTILINE_COMMENT_SUB_RE.search(line): + line = C_MULTILINE_COMMENT_SUB_RE.sub("", line) + else: + line = C_COMMENT_START_SUB_RE.sub("", line) + have_c_comment = True + + if have_c_comment: + if not C_COMMENT_END_RE.search(line): + continue + have_c_comment = False + line = C_COMMENT_END_SUB_RE.sub("", line) + + line = NormalizeLine(line) + + if not line: + continue + + if not got_struct: + if INCLUDE_RE.match(line): + CPP_DIRECT.append(line) + elif CPP_CONDITIONAL_BLOCK_RE.match(line): + CPP_DIRECT.append(line) + elif PREPROCESSOR_DEF_RE.match(line): + HEADER_DIRECT.append(line) + elif not STRUCT_DEF_RE.match(line): + raise RpcGenError("Missing struct on line %d: %s" % (LINE_COUNT, line)) + else: + got_struct = True + data += line + continue + + # We are inside the struct + tokens = line.split("}") + if len(tokens) == 1: + data += " " + line + continue + + if tokens[1]: + raise RpcGenError("Trailing garbage after struct on line %d" % LINE_COUNT) + + # We found the end of the struct + data += " %s}" % tokens[0] + break + + # Remove any comments, that might be in there + data = re.sub(r"/\*.*\*/", "", data) + + return data + + +def Parse(factory, filep): + """ + Parses the input file and returns C code and corresponding header file. + """ + + entities = [] + + while 1: + # Just gets the whole struct nicely formatted + data = GetNextStruct(filep) + + if not data: + break + + entities.extend(ProcessStruct(factory, data)) + + return entities + + +class CCodeGenerator(object): + def __init__(self): + pass + + @staticmethod + def GuardName(name): + # Use the complete provided path to the input file, with all + # non-identifier characters replaced with underscores, to + # reduce the chance of a collision between guard macros. + return "EVENT_RPCOUT_%s_" % (NONIDENT_RE.sub("_", name).upper()) + + def HeaderPreamble(self, name): + guard = self.GuardName(name) + pre = """ +/* + * Automatically generated from %s + */ + +#ifndef %s +#define %s + +""" % ( + name, + guard, + guard, + ) + + if HEADER_DIRECT: + for statement in HEADER_DIRECT: + pre += "%s\n" % statement + pre += "\n" + + pre += """ +#include /* for ev_uint*_t */ +#include +""" + + return pre + + def HeaderPostamble(self, name): + guard = self.GuardName(name) + return "#endif /* %s */" % (guard) + + @staticmethod + def BodyPreamble(name, header_file): + global _NAME + global _VERSION + + slash = header_file.rfind("/") + if slash != -1: + header_file = header_file[slash + 1 :] + + pre = """ +/* + * Automatically generated from %(name)s + * by %(script_name)s/%(script_version)s. DO NOT EDIT THIS FILE. + */ + +#include +#include +#include +#include +#include +#include +#include + +#if defined(EVENT__HAVE___func__) +# ifndef __func__ +# define __func__ __func__ +# endif +#elif defined(EVENT__HAVE___FUNCTION__) +# define __func__ __FUNCTION__ +#else +# define __func__ __FILE__ +#endif + +""" % { + "name": name, + "script_name": _NAME, + "script_version": _VERSION, + } + + for statement in CPP_DIRECT: + pre += "%s\n" % statement + + pre += '\n#include "%s"\n\n' % header_file + + pre += "void event_warn(const char *fmt, ...);\n" + pre += "void event_warnx(const char *fmt, ...);\n\n" + + return pre + + @staticmethod + def HeaderFilename(filename): + return ".".join(filename.split(".")[:-1]) + ".h" + + @staticmethod + def CodeFilename(filename): + return ".".join(filename.split(".")[:-1]) + ".gen.c" + + @staticmethod + def Struct(name): + return StructCCode(name) + + @staticmethod + def EntryBytes(entry_type, name, tag, fixed_length): + return EntryBytes(entry_type, name, tag, fixed_length) + + @staticmethod + def EntryVarBytes(entry_type, name, tag): + return EntryVarBytes(entry_type, name, tag) + + @staticmethod + def EntryInt(entry_type, name, tag, bits=32): + return EntryInt(entry_type, name, tag, bits) + + @staticmethod + def EntryString(entry_type, name, tag): + return EntryString(entry_type, name, tag) + + @staticmethod + def EntryStruct(entry_type, name, tag, struct_name): + return EntryStruct(entry_type, name, tag, struct_name) + + @staticmethod + def EntryArray(entry): + return EntryArray(entry) + + +class CommandLine(object): + def __init__(self, argv=None): + """Initialize a command-line to launch event_rpcgen, as if + from a command-line with CommandLine(sys.argv). If you're + calling this directly, remember to provide a dummy value + for sys.argv[0] + """ + global QUIETLY + + self.filename = None + self.header_file = None + self.impl_file = None + self.factory = CCodeGenerator() + + parser = argparse.ArgumentParser( + usage="%(prog)s [options] rpc-file [[h-file] c-file]" + ) + parser.add_argument("--quiet", action="store_true", default=False) + parser.add_argument("rpc_file", type=argparse.FileType("r")) + + args, extra_args = parser.parse_known_args(args=argv) + + QUIETLY = args.quiet + + if extra_args: + if len(extra_args) == 1: + self.impl_file = extra_args[0].replace("\\", "/") + elif len(extra_args) == 2: + self.header_file = extra_args[0].replace("\\", "/") + self.impl_file = extra_args[1].replace("\\", "/") + else: + parser.error("Spurious arguments provided") + + self.rpc_file = args.rpc_file + + if not self.impl_file: + self.impl_file = self.factory.CodeFilename(self.rpc_file.name) + + if not self.header_file: + self.header_file = self.factory.HeaderFilename(self.impl_file) + + if not self.impl_file.endswith(".c"): + parser.error("can only generate C implementation files") + if not self.header_file.endswith(".h"): + parser.error("can only generate C header files") + + def run(self): + filename = self.rpc_file.name + header_file = self.header_file + impl_file = self.impl_file + factory = self.factory + + declare('Reading "%s"' % filename) + + with self.rpc_file: + entities = Parse(factory, self.rpc_file) + + declare('... creating "%s"' % header_file) + with open(header_file, "w") as header_fp: + header_fp.write(factory.HeaderPreamble(filename)) + + # Create forward declarations: allows other structs to reference + # each other + for entry in entities: + entry.PrintForwardDeclaration(header_fp) + header_fp.write("\n") + + for entry in entities: + entry.PrintTags(header_fp) + entry.PrintDeclaration(header_fp) + header_fp.write(factory.HeaderPostamble(filename)) + + declare('... creating "%s"' % impl_file) + with open(impl_file, "w") as impl_fp: + impl_fp.write(factory.BodyPreamble(filename, header_file)) + for entry in entities: + entry.PrintCode(impl_fp) + + +def main(argv=None): + try: + CommandLine(argv=argv).run() + return 0 + except RpcGenError as e: + sys.stderr.write(e) + except EnvironmentError as e: + if e.filename and e.strerror: + sys.stderr.write("%s: %s" % (e.filename, e.strerror)) + elif e.strerror: + sys.stderr.write(e.strerror) + else: + raise + return 1 + + +if __name__ == "__main__": + sys.exit(main(argv=sys.argv[1:])) diff --git a/bsnes/thrift/libevent/include/evdns.h b/bsnes/thrift/libevent/include/evdns.h new file mode 100644 index 00000000..8672db03 --- /dev/null +++ b/bsnes/thrift/libevent/include/evdns.h @@ -0,0 +1,45 @@ +/* + * Copyright (c) 2000-2007 Niels Provos + * Copyright (c) 2007-2012 Niels Provos and Nick Mathewson + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +#ifndef EVENT1_EVDNS_H_INCLUDED_ +#define EVENT1_EVDNS_H_INCLUDED_ + +/** @file evdns.h + + A dns subsystem for Libevent. + + The header is deprecated in Libevent 2.0 and later; please + use instead. Depending on what functionality you + need, you may also want to include more of the other + headers. + */ + +#include +#include +#include +#include + +#endif /* EVENT1_EVDNS_H_INCLUDED_ */ diff --git a/bsnes/thrift/libevent/include/event.h b/bsnes/thrift/libevent/include/event.h new file mode 100644 index 00000000..ba518671 --- /dev/null +++ b/bsnes/thrift/libevent/include/event.h @@ -0,0 +1,83 @@ +/* + * Copyright (c) 2000-2007 Niels Provos + * Copyright (c) 2007-2012 Niels Provos and Nick Mathewson + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +#ifndef EVENT1_EVENT_H_INCLUDED_ +#define EVENT1_EVENT_H_INCLUDED_ + +/** @file event.h + + A library for writing event-driven network servers. + + The header is deprecated in Libevent 2.0 and later; please + use instead. Depending on what functionality you + need, you may also want to include more of the other event2/ + headers. + */ + +#ifdef __cplusplus +extern "C" { +#endif + +#include +#ifdef EVENT__HAVE_SYS_TYPES_H +#include +#endif +#ifdef EVENT__HAVE_SYS_TIME_H +#include +#endif +#ifdef EVENT__HAVE_STDINT_H +#include +#endif +#include + +/* For int types. */ +#include + +#ifdef _WIN32 +#ifndef WIN32_LEAN_AND_MEAN +#define WIN32_LEAN_AND_MEAN +#endif +#include +#include +#undef WIN32_LEAN_AND_MEAN +#endif + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#ifdef __cplusplus +} +#endif + +#endif /* EVENT1_EVENT_H_INCLUDED_ */ diff --git a/bsnes/thrift/libevent/include/event2/buffer.h b/bsnes/thrift/libevent/include/event2/buffer.h new file mode 100644 index 00000000..88af3ae1 --- /dev/null +++ b/bsnes/thrift/libevent/include/event2/buffer.h @@ -0,0 +1,1077 @@ +/* + * Copyright (c) 2007-2012 Niels Provos and Nick Mathewson + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +#ifndef EVENT2_BUFFER_H_INCLUDED_ +#define EVENT2_BUFFER_H_INCLUDED_ + +/** @file event2/buffer.h + + Functions for buffering data for network sending or receiving. + + An evbuffer can be used for preparing data before sending it to + the network or conversely for reading data from the network. + Evbuffers try to avoid memory copies as much as possible. As a + result, evbuffers can be used to pass data around without actually + incurring the overhead of copying the data. + + A new evbuffer can be allocated with evbuffer_new(), and can be + freed with evbuffer_free(). Most users will be using evbuffers via + the bufferevent interface. To access a bufferevent's evbuffers, use + bufferevent_get_input() and bufferevent_get_output(). + + There are several guidelines for using evbuffers. + + - if you already know how much data you are going to add as a result + of calling evbuffer_add() multiple times, it makes sense to use + evbuffer_expand() first to make sure that enough memory is allocated + before hand. + + - evbuffer_add_buffer() adds the contents of one buffer to the other + without incurring any unnecessary memory copies. + + - evbuffer_add() and evbuffer_add_buffer() do not mix very well: + if you use them, you will wind up with fragmented memory in your + buffer. + + - For high-performance code, you may want to avoid copying data into and out + of buffers. You can skip the copy step by using + evbuffer_reserve_space()/evbuffer_commit_space() when writing into a + buffer, and evbuffer_peek() when reading. + + In Libevent 2.0 and later, evbuffers are represented using a linked + list of memory chunks, with pointers to the first and last chunk in + the chain. + + As the contents of an evbuffer can be stored in multiple different + memory blocks, it cannot be accessed directly. Instead, evbuffer_pullup() + can be used to force a specified number of bytes to be contiguous. This + will cause memory reallocation and memory copies if the data is split + across multiple blocks. It is more efficient, however, to use + evbuffer_peek() if you don't require that the memory to be contiguous. + */ + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +#include +#include +#ifdef EVENT__HAVE_SYS_TYPES_H +#include +#endif +#ifdef EVENT__HAVE_SYS_UIO_H +#include +#endif +#include + +/** + An evbuffer is an opaque data type for efficiently buffering data to be + sent or received on the network. + + @see event2/event.h for more information +*/ +struct evbuffer +#ifdef EVENT_IN_DOXYGEN_ +{} +#endif +; + +/** + Pointer to a position within an evbuffer. + + Used when repeatedly searching through a buffer. Calling any function + that modifies or re-packs the buffer contents may invalidate all + evbuffer_ptrs for that buffer. Do not modify or contruct these values + except with evbuffer_ptr_set. + + An evbuffer_ptr can represent any position from the start of a buffer up + to a position immediately after the end of a buffer. + + @see evbuffer_ptr_set() + */ +struct evbuffer_ptr { + ev_ssize_t pos; + + /* Do not alter or rely on the values of fields: they are for internal + * use */ + struct { + void *chain; + size_t pos_in_chain; + } internal_; +}; + +/** Describes a single extent of memory inside an evbuffer. Used for + direct-access functions. + + @see evbuffer_reserve_space, evbuffer_commit_space, evbuffer_peek + */ +#ifdef EVENT__HAVE_SYS_UIO_H +#define evbuffer_iovec iovec +/* Internal use -- defined only if we are using the native struct iovec */ +#define EVBUFFER_IOVEC_IS_NATIVE_ +#else +struct evbuffer_iovec { + /** The start of the extent of memory. */ + void *iov_base; + /** The length of the extent of memory. */ + size_t iov_len; +}; +#endif + +/** + Allocate storage for a new evbuffer. + + @return a pointer to a newly allocated evbuffer struct, or NULL if an error + occurred + */ +EVENT2_EXPORT_SYMBOL +struct evbuffer *evbuffer_new(void); +/** + Deallocate storage for an evbuffer. + + @param buf pointer to the evbuffer to be freed + */ +EVENT2_EXPORT_SYMBOL +void evbuffer_free(struct evbuffer *buf); + +/** + Enable locking on an evbuffer so that it can safely be used by multiple + threads at the same time. + + NOTE: when locking is enabled, the lock will be held when callbacks are + invoked. This could result in deadlock if you aren't careful. Plan + accordingly! + + @param buf An evbuffer to make lockable. + @param lock A lock object, or NULL if we should allocate our own. + @return 0 on success, -1 on failure. + */ +EVENT2_EXPORT_SYMBOL +int evbuffer_enable_locking(struct evbuffer *buf, void *lock); + +/** + Acquire the lock on an evbuffer. Has no effect if locking was not enabled + with evbuffer_enable_locking. +*/ +EVENT2_EXPORT_SYMBOL +void evbuffer_lock(struct evbuffer *buf); + +/** + Release the lock on an evbuffer. Has no effect if locking was not enabled + with evbuffer_enable_locking. +*/ +EVENT2_EXPORT_SYMBOL +void evbuffer_unlock(struct evbuffer *buf); + + +/** If this flag is set, then we will not use evbuffer_peek(), + * evbuffer_remove(), evbuffer_remove_buffer(), and so on to read bytes + * from this buffer: we'll only take bytes out of this buffer by + * writing them to the network (as with evbuffer_write_atmost), by + * removing them without observing them (as with evbuffer_drain), + * or by copying them all out at once (as with evbuffer_add_buffer). + * + * Using this option allows the implementation to use sendfile-based + * operations for evbuffer_add_file(); see that function for more + * information. + * + * This flag is on by default for bufferevents that can take advantage + * of it; you should never actually need to set it on a bufferevent's + * output buffer. + */ +#define EVBUFFER_FLAG_DRAINS_TO_FD 1 + +/** Change the flags that are set for an evbuffer by adding more. + * + * @param buffer the evbuffer that the callback is watching. + * @param cb the callback whose status we want to change. + * @param flags One or more EVBUFFER_FLAG_* options + * @return 0 on success, -1 on failure. + */ +EVENT2_EXPORT_SYMBOL +int evbuffer_set_flags(struct evbuffer *buf, ev_uint64_t flags); +/** Change the flags that are set for an evbuffer by removing some. + * + * @param buffer the evbuffer that the callback is watching. + * @param cb the callback whose status we want to change. + * @param flags One or more EVBUFFER_FLAG_* options + * @return 0 on success, -1 on failure. + */ +EVENT2_EXPORT_SYMBOL +int evbuffer_clear_flags(struct evbuffer *buf, ev_uint64_t flags); + +/** + Returns the total number of bytes stored in the evbuffer + + @param buf pointer to the evbuffer + @return the number of bytes stored in the evbuffer +*/ +EVENT2_EXPORT_SYMBOL +size_t evbuffer_get_length(const struct evbuffer *buf); + +/** + Returns the number of contiguous available bytes in the first buffer chain. + + This is useful when processing data that might be split into multiple + chains, or that might all be in the first chain. Calls to + evbuffer_pullup() that cause reallocation and copying of data can thus be + avoided. + + @param buf pointer to the evbuffer + @return 0 if no data is available, otherwise the number of available bytes + in the first buffer chain. +*/ +EVENT2_EXPORT_SYMBOL +size_t evbuffer_get_contiguous_space(const struct evbuffer *buf); + +/** + Expands the available space in an evbuffer. + + Expands the available space in the evbuffer to at least datlen, so that + appending datlen additional bytes will not require any new allocations. + + @param buf the evbuffer to be expanded + @param datlen the new minimum length requirement + @return 0 if successful, or -1 if an error occurred +*/ +EVENT2_EXPORT_SYMBOL +int evbuffer_expand(struct evbuffer *buf, size_t datlen); + +/** + Reserves space in the last chain or chains of an evbuffer. + + Makes space available in the last chain or chains of an evbuffer that can + be arbitrarily written to by a user. The space does not become + available for reading until it has been committed with + evbuffer_commit_space(). + + The space is made available as one or more extents, represented by + an initial pointer and a length. You can force the memory to be + available as only one extent. Allowing more extents, however, makes the + function more efficient. + + Multiple subsequent calls to this function will make the same space + available until evbuffer_commit_space() has been called. + + It is an error to do anything that moves around the buffer's internal + memory structures before committing the space. + + NOTE: The code currently does not ever use more than two extents. + This may change in future versions. + + @param buf the evbuffer in which to reserve space. + @param size how much space to make available, at minimum. The + total length of the extents may be greater than the requested + length. + @param vec an array of one or more evbuffer_iovec structures to + hold pointers to the reserved extents of memory. + @param n_vec The length of the vec array. Must be at least 1; + 2 is more efficient. + @return the number of provided extents, or -1 on error. + @see evbuffer_commit_space() +*/ +EVENT2_EXPORT_SYMBOL +int +evbuffer_reserve_space(struct evbuffer *buf, ev_ssize_t size, + struct evbuffer_iovec *vec, int n_vec); + +/** + Commits previously reserved space. + + Commits some of the space previously reserved with + evbuffer_reserve_space(). It then becomes available for reading. + + This function may return an error if the pointer in the extents do + not match those returned from evbuffer_reserve_space, or if data + has been added to the buffer since the space was reserved. + + If you want to commit less data than you got reserved space for, + modify the iov_len pointer of the appropriate extent to a smaller + value. Note that you may have received more space than you + requested if it was available! + + @param buf the evbuffer in which to reserve space. + @param vec one or two extents returned by evbuffer_reserve_space. + @param n_vecs the number of extents. + @return 0 on success, -1 on error + @see evbuffer_reserve_space() +*/ +EVENT2_EXPORT_SYMBOL +int evbuffer_commit_space(struct evbuffer *buf, + struct evbuffer_iovec *vec, int n_vecs); + +/** + Append data to the end of an evbuffer. + + @param buf the evbuffer to be appended to + @param data pointer to the beginning of the data buffer + @param datlen the number of bytes to be copied from the data buffer + @return 0 on success, -1 on failure. + */ +EVENT2_EXPORT_SYMBOL +int evbuffer_add(struct evbuffer *buf, const void *data, size_t datlen); + + +/** + Read data from an evbuffer and drain the bytes read. + + If more bytes are requested than are available in the evbuffer, we + only extract as many bytes as were available. + + @param buf the evbuffer to be read from + @param data the destination buffer to store the result + @param datlen the maximum size of the destination buffer + @return the number of bytes read, or -1 if we can't drain the buffer. + */ +EVENT2_EXPORT_SYMBOL +int evbuffer_remove(struct evbuffer *buf, void *data, size_t datlen); + +/** + Read data from an evbuffer, and leave the buffer unchanged. + + If more bytes are requested than are available in the evbuffer, we + only extract as many bytes as were available. + + @param buf the evbuffer to be read from + @param data_out the destination buffer to store the result + @param datlen the maximum size of the destination buffer + @return the number of bytes read, or -1 if we can't drain the buffer. + */ +EVENT2_EXPORT_SYMBOL +ev_ssize_t evbuffer_copyout(struct evbuffer *buf, void *data_out, size_t datlen); + +/** + Read data from the middle of an evbuffer, and leave the buffer unchanged. + + If more bytes are requested than are available in the evbuffer, we + only extract as many bytes as were available. + + @param buf the evbuffer to be read from + @param pos the position to start reading from + @param data_out the destination buffer to store the result + @param datlen the maximum size of the destination buffer + @return the number of bytes read, or -1 if we can't drain the buffer. + */ +EVENT2_EXPORT_SYMBOL +ev_ssize_t evbuffer_copyout_from(struct evbuffer *buf, const struct evbuffer_ptr *pos, void *data_out, size_t datlen); + +/** + Read data from an evbuffer into another evbuffer, draining + the bytes from the source buffer. This function avoids copy + operations to the extent possible. + + If more bytes are requested than are available in src, the src + buffer is drained completely. + + @param src the evbuffer to be read from + @param dst the destination evbuffer to store the result into + @param datlen the maximum numbers of bytes to transfer + @return the number of bytes read + */ +EVENT2_EXPORT_SYMBOL +int evbuffer_remove_buffer(struct evbuffer *src, struct evbuffer *dst, + size_t datlen); + +/** Used to tell evbuffer_readln what kind of line-ending to look for. + */ +enum evbuffer_eol_style { + /** Any sequence of CR and LF characters is acceptable as an + * EOL. + * + * Note that this style can produce ambiguous results: the + * sequence "CRLF" will be treated as a single EOL if it is + * all in the buffer at once, but if you first read a CR from + * the network and later read an LF from the network, it will + * be treated as two EOLs. + */ + EVBUFFER_EOL_ANY, + /** An EOL is an LF, optionally preceded by a CR. This style is + * most useful for implementing text-based internet protocols. */ + EVBUFFER_EOL_CRLF, + /** An EOL is a CR followed by an LF. */ + EVBUFFER_EOL_CRLF_STRICT, + /** An EOL is a LF. */ + EVBUFFER_EOL_LF, + /** An EOL is a NUL character (that is, a single byte with value 0) */ + EVBUFFER_EOL_NUL +}; + +/** + * Read a single line from an evbuffer. + * + * Reads a line terminated by an EOL as determined by the evbuffer_eol_style + * argument. Returns a newly allocated nul-terminated string; the caller must + * free the returned value. The EOL is not included in the returned string. + * + * @param buffer the evbuffer to read from + * @param n_read_out if non-NULL, points to a size_t that is set to the + * number of characters in the returned string. This is useful for + * strings that can contain NUL characters. + * @param eol_style the style of line-ending to use. + * @return pointer to a single line, or NULL if an error occurred + */ +EVENT2_EXPORT_SYMBOL +char *evbuffer_readln(struct evbuffer *buffer, size_t *n_read_out, + enum evbuffer_eol_style eol_style); + +/** + Move all data from one evbuffer into another evbuffer. + + This is a destructive add. The data from one buffer moves into + the other buffer. However, no unnecessary memory copies occur. + + @param outbuf the output buffer + @param inbuf the input buffer + @return 0 if successful, or -1 if an error occurred + + @see evbuffer_remove_buffer() + */ +EVENT2_EXPORT_SYMBOL +int evbuffer_add_buffer(struct evbuffer *outbuf, struct evbuffer *inbuf); + +/** + Copy data from one evbuffer into another evbuffer. + + This is a non-destructive add. The data from one buffer is copied + into the other buffer. However, no unnecessary memory copies occur. + + Note that buffers already containing buffer references can't be added + to other buffers. + + @param outbuf the output buffer + @param inbuf the input buffer + @return 0 if successful, or -1 if an error occurred + */ +EVENT2_EXPORT_SYMBOL +int evbuffer_add_buffer_reference(struct evbuffer *outbuf, + struct evbuffer *inbuf); + +/** + A cleanup function for a piece of memory added to an evbuffer by + reference. + + @see evbuffer_add_reference() + */ +typedef void (*evbuffer_ref_cleanup_cb)(const void *data, + size_t datalen, void *extra); + +/** + Reference memory into an evbuffer without copying. + + The memory needs to remain valid until all the added data has been + read. This function keeps just a reference to the memory without + actually incurring the overhead of a copy. + + @param outbuf the output buffer + @param data the memory to reference + @param datlen how memory to reference + @param cleanupfn callback to be invoked when the memory is no longer + referenced by this evbuffer. + @param cleanupfn_arg optional argument to the cleanup callback + @return 0 if successful, or -1 if an error occurred + */ +EVENT2_EXPORT_SYMBOL +int evbuffer_add_reference(struct evbuffer *outbuf, + const void *data, size_t datlen, + evbuffer_ref_cleanup_cb cleanupfn, void *cleanupfn_arg); + +/** + Copy data from a file into the evbuffer for writing to a socket. + + This function avoids unnecessary data copies between userland and + kernel. If sendfile is available and the EVBUFFER_FLAG_DRAINS_TO_FD + flag is set, it uses those functions. Otherwise, it tries to use + mmap (or CreateFileMapping on Windows). + + The function owns the resulting file descriptor and will close it + when finished transferring data. + + The results of using evbuffer_remove() or evbuffer_pullup() on + evbuffers whose data was added using this function are undefined. + + For more fine-grained control, use evbuffer_add_file_segment. + + @param outbuf the output buffer + @param fd the file descriptor + @param offset the offset from which to read data + @param length how much data to read, or -1 to read as much as possible. + (-1 requires that 'fd' support fstat.) + @return 0 if successful, or -1 if an error occurred +*/ + +EVENT2_EXPORT_SYMBOL +int evbuffer_add_file(struct evbuffer *outbuf, int fd, ev_off_t offset, + ev_off_t length); + +/** + An evbuffer_file_segment holds a reference to a range of a file -- + possibly the whole file! -- for use in writing from an evbuffer to a + socket. It could be implemented with mmap, sendfile, splice, or (if all + else fails) by just pulling all the data into RAM. A single + evbuffer_file_segment can be added more than once, and to more than one + evbuffer. + */ +struct evbuffer_file_segment; + +/** + Flag for creating evbuffer_file_segment: If this flag is set, then when + the evbuffer_file_segment is freed and no longer in use by any + evbuffer, the underlying fd is closed. + */ +#define EVBUF_FS_CLOSE_ON_FREE 0x01 +/** + Flag for creating evbuffer_file_segment: Disable memory-map based + implementations. + */ +#define EVBUF_FS_DISABLE_MMAP 0x02 +/** + Flag for creating evbuffer_file_segment: Disable direct fd-to-fd + implementations (including sendfile and splice). + + You might want to use this option if data needs to be taken from the + evbuffer by any means other than writing it to the network: the sendfile + backend is fast, but it only works for sending files directly to the + network. + */ +#define EVBUF_FS_DISABLE_SENDFILE 0x04 +/** + Flag for creating evbuffer_file_segment: Do not allocate a lock for this + segment. If this option is set, then neither the segment nor any + evbuffer it is added to may ever be accessed from more than one thread + at a time. + */ +#define EVBUF_FS_DISABLE_LOCKING 0x08 + +/** + A cleanup function for a evbuffer_file_segment added to an evbuffer + for reference. + */ +typedef void (*evbuffer_file_segment_cleanup_cb)( + struct evbuffer_file_segment const* seg, int flags, void* arg); + +/** + Create and return a new evbuffer_file_segment for reading data from a + file and sending it out via an evbuffer. + + This function avoids unnecessary data copies between userland and + kernel. Where available, it uses sendfile or splice. + + The file descriptor must not be closed so long as any evbuffer is using + this segment. + + The results of using evbuffer_remove() or evbuffer_pullup() or any other + function that reads bytes from an evbuffer on any evbuffer containing + the newly returned segment are undefined, unless you pass the + EVBUF_FS_DISABLE_SENDFILE flag to this function. + + @param fd an open file to read from. + @param offset an index within the file at which to start reading + @param length how much data to read, or -1 to read as much as possible. + (-1 requires that 'fd' support fstat.) + @param flags any number of the EVBUF_FS_* flags + @return a new evbuffer_file_segment, or NULL on failure. + **/ +EVENT2_EXPORT_SYMBOL +struct evbuffer_file_segment *evbuffer_file_segment_new( + int fd, ev_off_t offset, ev_off_t length, unsigned flags); + +/** + Free an evbuffer_file_segment + + It is safe to call this function even if the segment has been added to + one or more evbuffers. The evbuffer_file_segment will not be freed + until no more references to it exist. + */ +EVENT2_EXPORT_SYMBOL +void evbuffer_file_segment_free(struct evbuffer_file_segment *seg); + +/** + Add cleanup callback and argument for the callback to an + evbuffer_file_segment. + + The cleanup callback will be invoked when no more references to the + evbuffer_file_segment exist. + **/ +EVENT2_EXPORT_SYMBOL +void evbuffer_file_segment_add_cleanup_cb(struct evbuffer_file_segment *seg, + evbuffer_file_segment_cleanup_cb cb, void* arg); + +/** + Insert some or all of an evbuffer_file_segment at the end of an evbuffer + + Note that the offset and length parameters of this function have a + different meaning from those provided to evbuffer_file_segment_new: When + you create the segment, the offset is the offset _within the file_, and + the length is the length _of the segment_, whereas when you add a + segment to an evbuffer, the offset is _within the segment_ and the + length is the length of the _part of the segment you want to use. + + In other words, if you have a 10 KiB file, and you create an + evbuffer_file_segment for it with offset 20 and length 1000, it will + refer to bytes 20..1019 inclusive. If you then pass this segment to + evbuffer_add_file_segment and specify an offset of 20 and a length of + 50, you will be adding bytes 40..99 inclusive. + + @param buf the evbuffer to append to + @param seg the segment to add + @param offset the offset within the segment to start from + @param length the amount of data to add, or -1 to add it all. + @return 0 on success, -1 on failure. + */ +EVENT2_EXPORT_SYMBOL +int evbuffer_add_file_segment(struct evbuffer *buf, + struct evbuffer_file_segment *seg, ev_off_t offset, ev_off_t length); + +/** + Append a formatted string to the end of an evbuffer. + + The string is formated as printf. + + @param buf the evbuffer that will be appended to + @param fmt a format string + @param ... arguments that will be passed to printf(3) + @return The number of bytes added if successful, or -1 if an error occurred. + + @see evutil_printf(), evbuffer_add_vprintf() + */ +EVENT2_EXPORT_SYMBOL +int evbuffer_add_printf(struct evbuffer *buf, const char *fmt, ...) +#ifdef __GNUC__ + __attribute__((format(printf, 2, 3))) +#endif +; + +/** + Append a va_list formatted string to the end of an evbuffer. + + @param buf the evbuffer that will be appended to + @param fmt a format string + @param ap a varargs va_list argument array that will be passed to vprintf(3) + @return The number of bytes added if successful, or -1 if an error occurred. + */ +EVENT2_EXPORT_SYMBOL +int evbuffer_add_vprintf(struct evbuffer *buf, const char *fmt, va_list ap) +#ifdef __GNUC__ + __attribute__((format(printf, 2, 0))) +#endif +; + + +/** + Remove a specified number of bytes data from the beginning of an evbuffer. + + @param buf the evbuffer to be drained + @param len the number of bytes to drain from the beginning of the buffer + @return 0 on success, -1 on failure. + */ +EVENT2_EXPORT_SYMBOL +int evbuffer_drain(struct evbuffer *buf, size_t len); + + +/** + Write the contents of an evbuffer to a file descriptor. + + The evbuffer will be drained after the bytes have been successfully written. + + @param buffer the evbuffer to be written and drained + @param fd the file descriptor to be written to + @return the number of bytes written, or -1 if an error occurred + @see evbuffer_read() + */ +EVENT2_EXPORT_SYMBOL +int evbuffer_write(struct evbuffer *buffer, evutil_socket_t fd); + +/** + Write some of the contents of an evbuffer to a file descriptor. + + The evbuffer will be drained after the bytes have been successfully written. + + @param buffer the evbuffer to be written and drained + @param fd the file descriptor to be written to + @param howmuch the largest allowable number of bytes to write, or -1 + to write as many bytes as we can. + @return the number of bytes written, or -1 if an error occurred + @see evbuffer_read() + */ +EVENT2_EXPORT_SYMBOL +int evbuffer_write_atmost(struct evbuffer *buffer, evutil_socket_t fd, + ev_ssize_t howmuch); + +/** + Read from a file descriptor and store the result in an evbuffer. + + @param buffer the evbuffer to store the result + @param fd the file descriptor to read from + @param howmuch the number of bytes to be read. If the given number is negative + or out of maximum bytes per one read, as many bytes as we can will be read. + @return the number of bytes read, or -1 if an error occurred + @see evbuffer_write() + */ +EVENT2_EXPORT_SYMBOL +int evbuffer_read(struct evbuffer *buffer, evutil_socket_t fd, int howmuch); + +/** + Search for a string within an evbuffer. + + @param buffer the evbuffer to be searched + @param what the string to be searched for + @param len the length of the search string + @param start NULL or a pointer to a valid struct evbuffer_ptr. + @return a struct evbuffer_ptr whose 'pos' field has the offset of the + first occurrence of the string in the buffer after 'start'. The 'pos' + field of the result is -1 if the string was not found. + */ +EVENT2_EXPORT_SYMBOL +struct evbuffer_ptr evbuffer_search(struct evbuffer *buffer, const char *what, size_t len, const struct evbuffer_ptr *start); + +/** + Search for a string within part of an evbuffer. + + @param buffer the evbuffer to be searched + @param what the string to be searched for + @param len the length of the search string + @param start NULL or a pointer to a valid struct evbuffer_ptr that + indicates where we should start searching. + @param end NULL or a pointer to a valid struct evbuffer_ptr that + indicates where we should stop searching. + @return a struct evbuffer_ptr whose 'pos' field has the offset of the + first occurrence of the string in the buffer after 'start'. The 'pos' + field of the result is -1 if the string was not found. + */ +EVENT2_EXPORT_SYMBOL +struct evbuffer_ptr evbuffer_search_range(struct evbuffer *buffer, const char *what, size_t len, const struct evbuffer_ptr *start, const struct evbuffer_ptr *end); + +/** + Defines how to adjust an evbuffer_ptr by evbuffer_ptr_set() + + @see evbuffer_ptr_set() */ +enum evbuffer_ptr_how { + /** Sets the pointer to the position; can be called on with an + uninitialized evbuffer_ptr. */ + EVBUFFER_PTR_SET, + /** Advances the pointer by adding to the current position. */ + EVBUFFER_PTR_ADD +}; + +/** + Sets the search pointer in the buffer to position. + + There are two ways to use this function: you can call + evbuffer_ptr_set(buf, &pos, N, EVBUFFER_PTR_SET) + to move 'pos' to a position 'N' bytes after the start of the buffer, or + evbuffer_ptr_set(buf, &pos, N, EVBUFFER_PTR_ADD) + to move 'pos' forward by 'N' bytes. + + If evbuffer_ptr is not initialized, this function can only be called + with EVBUFFER_PTR_SET. + + An evbuffer_ptr can represent any position from the start of the buffer to + a position immediately after the end of the buffer. + + @param buffer the evbuffer to be search + @param ptr a pointer to a struct evbuffer_ptr + @param position the position at which to start the next search + @param how determines how the pointer should be manipulated. + @returns 0 on success or -1 otherwise +*/ +EVENT2_EXPORT_SYMBOL +int +evbuffer_ptr_set(struct evbuffer *buffer, struct evbuffer_ptr *ptr, + size_t position, enum evbuffer_ptr_how how); + +/** + Search for an end-of-line string within an evbuffer. + + @param buffer the evbuffer to be searched + @param start NULL or a pointer to a valid struct evbuffer_ptr to start + searching at. + @param eol_len_out If non-NULL, the pointed-to value will be set to + the length of the end-of-line string. + @param eol_style The kind of EOL to look for; see evbuffer_readln() for + more information + @return a struct evbuffer_ptr whose 'pos' field has the offset of the + first occurrence EOL in the buffer after 'start'. The 'pos' + field of the result is -1 if the string was not found. + */ +EVENT2_EXPORT_SYMBOL +struct evbuffer_ptr evbuffer_search_eol(struct evbuffer *buffer, + struct evbuffer_ptr *start, size_t *eol_len_out, + enum evbuffer_eol_style eol_style); + +/** Function to peek at data inside an evbuffer without removing it or + copying it out. + + Pointers to the data are returned by filling the 'vec_out' array + with pointers to one or more extents of data inside the buffer. + + The total data in the extents that you get back may be more than + you requested (if there is more data last extent than you asked + for), or less (if you do not provide enough evbuffer_iovecs, or if + the buffer does not have as much data as you asked to see). + + @param buffer the evbuffer to peek into, + @param len the number of bytes to try to peek. If len is negative, we + will try to fill as much of vec_out as we can. If len is negative + and vec_out is not provided, we return the number of evbuffer_iovecs + that would be needed to get all the data in the buffer. + @param start_at an evbuffer_ptr indicating the point at which we + should start looking for data. NULL means, "At the start of the + buffer." + @param vec_out an array of evbuffer_iovec + @param n_vec the length of vec_out. If 0, we only count how many + extents would be necessary to point to the requested amount of + data. + @return The number of extents needed. This may be less than n_vec + if we didn't need all the evbuffer_iovecs we were given, or more + than n_vec if we would need more to return all the data that was + requested. + */ +EVENT2_EXPORT_SYMBOL +int evbuffer_peek(struct evbuffer *buffer, ev_ssize_t len, + struct evbuffer_ptr *start_at, + struct evbuffer_iovec *vec_out, int n_vec); + + +/** Structure passed to an evbuffer_cb_func evbuffer callback + + @see evbuffer_cb_func, evbuffer_add_cb() + */ +struct evbuffer_cb_info { + /** The number of bytes in this evbuffer when callbacks were last + * invoked. */ + size_t orig_size; + /** The number of bytes added since callbacks were last invoked. */ + size_t n_added; + /** The number of bytes removed since callbacks were last invoked. */ + size_t n_deleted; +}; + +/** Type definition for a callback that is invoked whenever data is added or + removed from an evbuffer. + + An evbuffer may have one or more callbacks set at a time. The order + in which they are executed is undefined. + + A callback function may add more callbacks, or remove itself from the + list of callbacks, or add or remove data from the buffer. It may not + remove another callback from the list. + + If a callback adds or removes data from the buffer or from another + buffer, this can cause a recursive invocation of your callback or + other callbacks. If you ask for an infinite loop, you might just get + one: watch out! + + @param buffer the buffer whose size has changed + @param info a structure describing how the buffer changed. + @param arg a pointer to user data +*/ +typedef void (*evbuffer_cb_func)(struct evbuffer *buffer, const struct evbuffer_cb_info *info, void *arg); + +struct evbuffer_cb_entry; +/** Add a new callback to an evbuffer. + + Subsequent calls to evbuffer_add_cb() add new callbacks. To remove this + callback, call evbuffer_remove_cb or evbuffer_remove_cb_entry. + + @param buffer the evbuffer to be monitored + @param cb the callback function to invoke when the evbuffer is modified, + or NULL to remove all callbacks. + @param cbarg an argument to be provided to the callback function + @return a handle to the callback on success, or NULL on failure. + */ +EVENT2_EXPORT_SYMBOL +struct evbuffer_cb_entry *evbuffer_add_cb(struct evbuffer *buffer, evbuffer_cb_func cb, void *cbarg); + +/** Remove a callback from an evbuffer, given a handle returned from + evbuffer_add_cb. + + Calling this function invalidates the handle. + + @return 0 if a callback was removed, or -1 if no matching callback was + found. + */ +EVENT2_EXPORT_SYMBOL +int evbuffer_remove_cb_entry(struct evbuffer *buffer, + struct evbuffer_cb_entry *ent); + +/** Remove a callback from an evbuffer, given the function and argument + used to add it. + + @return 0 if a callback was removed, or -1 if no matching callback was + found. + */ +EVENT2_EXPORT_SYMBOL +int evbuffer_remove_cb(struct evbuffer *buffer, evbuffer_cb_func cb, void *cbarg); + +/** If this flag is not set, then a callback is temporarily disabled, and + * should not be invoked. + * + * @see evbuffer_cb_set_flags(), evbuffer_cb_clear_flags() + */ +#define EVBUFFER_CB_ENABLED 1 + +/** Change the flags that are set for a callback on a buffer by adding more. + + @param buffer the evbuffer that the callback is watching. + @param cb the callback whose status we want to change. + @param flags EVBUFFER_CB_ENABLED to re-enable the callback. + @return 0 on success, -1 on failure. + */ +EVENT2_EXPORT_SYMBOL +int evbuffer_cb_set_flags(struct evbuffer *buffer, + struct evbuffer_cb_entry *cb, ev_uint32_t flags); + +/** Change the flags that are set for a callback on a buffer by removing some + + @param buffer the evbuffer that the callback is watching. + @param cb the callback whose status we want to change. + @param flags EVBUFFER_CB_ENABLED to disable the callback. + @return 0 on success, -1 on failure. + */ +EVENT2_EXPORT_SYMBOL +int evbuffer_cb_clear_flags(struct evbuffer *buffer, + struct evbuffer_cb_entry *cb, ev_uint32_t flags); + +#if 0 +/** Postpone calling a given callback until unsuspend is called later. + + This is different from disabling the callback, since the callback will get + invoked later if the buffer size changes between now and when we unsuspend + it. + + @param the buffer that the callback is watching. + @param cb the callback we want to suspend. + */ +EVENT2_EXPORT_SYMBOL +void evbuffer_cb_suspend(struct evbuffer *buffer, struct evbuffer_cb_entry *cb); +/** Stop postponing a callback that we postponed with evbuffer_cb_suspend. + + If data was added to or removed from the buffer while the callback was + suspended, the callback will get called once now. + + @param the buffer that the callback is watching. + @param cb the callback we want to stop suspending. + */ +EVENT2_EXPORT_SYMBOL +void evbuffer_cb_unsuspend(struct evbuffer *buffer, struct evbuffer_cb_entry *cb); +#endif + +/** + Makes the data at the beginning of an evbuffer contiguous. + + @param buf the evbuffer to make contiguous + @param size the number of bytes to make contiguous, or -1 to make the + entire buffer contiguous. + @return a pointer to the contiguous memory array, or NULL if param size + requested more data than is present in the buffer. +*/ + +EVENT2_EXPORT_SYMBOL +unsigned char *evbuffer_pullup(struct evbuffer *buf, ev_ssize_t size); + +/** + Prepends data to the beginning of the evbuffer + + @param buf the evbuffer to which to prepend data + @param data a pointer to the memory to prepend + @param size the number of bytes to prepend + @return 0 if successful, or -1 otherwise +*/ + +EVENT2_EXPORT_SYMBOL +int evbuffer_prepend(struct evbuffer *buf, const void *data, size_t size); + +/** + Prepends all data from the src evbuffer to the beginning of the dst + evbuffer. + + @param dst the evbuffer to which to prepend data + @param src the evbuffer to prepend; it will be emptied as a result + @return 0 if successful, or -1 otherwise +*/ +EVENT2_EXPORT_SYMBOL +int evbuffer_prepend_buffer(struct evbuffer *dst, struct evbuffer* src); + +/** + Prevent calls that modify an evbuffer from succeeding. A buffer may + frozen at the front, at the back, or at both the front and the back. + + If the front of a buffer is frozen, operations that drain data from + the front of the buffer, or that prepend data to the buffer, will + fail until it is unfrozen. If the back a buffer is frozen, operations + that append data from the buffer will fail until it is unfrozen. + + @param buf The buffer to freeze + @param at_front If true, we freeze the front of the buffer. If false, + we freeze the back. + @return 0 on success, -1 on failure. +*/ +EVENT2_EXPORT_SYMBOL +int evbuffer_freeze(struct evbuffer *buf, int at_front); +/** + Re-enable calls that modify an evbuffer. + + @param buf The buffer to un-freeze + @param at_front If true, we unfreeze the front of the buffer. If false, + we unfreeze the back. + @return 0 on success, -1 on failure. + */ +EVENT2_EXPORT_SYMBOL +int evbuffer_unfreeze(struct evbuffer *buf, int at_front); + +struct event_base; +/** + Force all the callbacks on an evbuffer to be run, not immediately after + the evbuffer is altered, but instead from inside the event loop. + + This can be used to serialize all the callbacks to a single thread + of execution. + */ +EVENT2_EXPORT_SYMBOL +int evbuffer_defer_callbacks(struct evbuffer *buffer, struct event_base *base); + +/** + Append data from 1 or more iovec's to an evbuffer + + Calculates the number of bytes needed for an iovec structure and guarantees + all data will fit into a single chain. Can be used in lieu of functionality + which calls evbuffer_add() constantly before being used to increase + performance. + + @param buffer the destination buffer + @param vec the source iovec + @param n_vec the number of iovec structures. + @return the number of bytes successfully written to the output buffer. +*/ +EVENT2_EXPORT_SYMBOL +size_t evbuffer_add_iovec(struct evbuffer * buffer, struct evbuffer_iovec * vec, int n_vec); + +#ifdef __cplusplus +} +#endif + +#endif /* EVENT2_BUFFER_H_INCLUDED_ */ diff --git a/bsnes/thrift/libevent/include/event2/buffer_compat.h b/bsnes/thrift/libevent/include/event2/buffer_compat.h new file mode 100644 index 00000000..0ce10254 --- /dev/null +++ b/bsnes/thrift/libevent/include/event2/buffer_compat.h @@ -0,0 +1,116 @@ +/* + * Copyright (c) 2007-2012 Niels Provos and Nick Mathewson + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef EVENT2_BUFFER_COMPAT_H_INCLUDED_ +#define EVENT2_BUFFER_COMPAT_H_INCLUDED_ + +#include + +/** @file event2/buffer_compat.h + + Obsolete and deprecated versions of the functions in buffer.h: provided + only for backward compatibility. + */ + + +/** + Obsolete alias for evbuffer_readln(buffer, NULL, EVBUFFER_EOL_ANY). + + @deprecated This function is deprecated because its behavior is not correct + for almost any protocol, and also because it's wholly subsumed by + evbuffer_readln(). + + @param buffer the evbuffer to read from + @return pointer to a single line, or NULL if an error occurred + +*/ +EVENT2_EXPORT_SYMBOL +char *evbuffer_readline(struct evbuffer *buffer); + +/** Type definition for a callback that is invoked whenever data is added or + removed from an evbuffer. + + An evbuffer may have one or more callbacks set at a time. The order + in which they are executed is undefined. + + A callback function may add more callbacks, or remove itself from the + list of callbacks, or add or remove data from the buffer. It may not + remove another callback from the list. + + If a callback adds or removes data from the buffer or from another + buffer, this can cause a recursive invocation of your callback or + other callbacks. If you ask for an infinite loop, you might just get + one: watch out! + + @param buffer the buffer whose size has changed + @param old_len the previous length of the buffer + @param new_len the current length of the buffer + @param arg a pointer to user data +*/ +typedef void (*evbuffer_cb)(struct evbuffer *buffer, size_t old_len, size_t new_len, void *arg); + +/** + Replace all callbacks on an evbuffer with a single new callback, or + remove them. + + Subsequent calls to evbuffer_setcb() replace callbacks set by previous + calls. Setting the callback to NULL removes any previously set callback. + + @deprecated This function is deprecated because it clears all previous + callbacks set on the evbuffer, which can cause confusing behavior if + multiple parts of the code all want to add their own callbacks on a + buffer. Instead, use evbuffer_add(), evbuffer_del(), and + evbuffer_setflags() to manage your own evbuffer callbacks without + interfering with callbacks set by others. + + @param buffer the evbuffer to be monitored + @param cb the callback function to invoke when the evbuffer is modified, + or NULL to remove all callbacks. + @param cbarg an argument to be provided to the callback function + @return 0 if successful, or -1 on error + */ +EVENT2_EXPORT_SYMBOL +int evbuffer_setcb(struct evbuffer *buffer, evbuffer_cb cb, void *cbarg); + + +/** + Find a string within an evbuffer. + + @param buffer the evbuffer to be searched + @param what the string to be searched for + @param len the length of the search string + @return a pointer to the beginning of the search string, or NULL if the search failed. + */ +EVENT2_EXPORT_SYMBOL +unsigned char *evbuffer_find(struct evbuffer *buffer, const unsigned char *what, size_t len); + +/** deprecated in favor of calling the functions directly */ +#define EVBUFFER_LENGTH(x) evbuffer_get_length(x) +/** deprecated in favor of calling the functions directly */ +#define EVBUFFER_DATA(x) evbuffer_pullup((x), -1) + +#endif + diff --git a/bsnes/thrift/libevent/include/event2/bufferevent.h b/bsnes/thrift/libevent/include/event2/bufferevent.h new file mode 100644 index 00000000..48cd1535 --- /dev/null +++ b/bsnes/thrift/libevent/include/event2/bufferevent.h @@ -0,0 +1,1024 @@ +/* + * Copyright (c) 2000-2007 Niels Provos + * Copyright (c) 2007-2012 Niels Provos and Nick Mathewson + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +#ifndef EVENT2_BUFFEREVENT_H_INCLUDED_ +#define EVENT2_BUFFEREVENT_H_INCLUDED_ + +/** + @file event2/bufferevent.h + + Functions for buffering data for network sending or receiving. Bufferevents + are higher level than evbuffers: each has an underlying evbuffer for reading + and one for writing, and callbacks that are invoked under certain + circumstances. + + A bufferevent provides input and output buffers that get filled and + drained automatically. The user of a bufferevent no longer deals + directly with the I/O, but instead is reading from input and writing + to output buffers. + + Once initialized, the bufferevent structure can be used repeatedly + with bufferevent_enable() and bufferevent_disable(). + + When reading is enabled, the bufferevent will try to read from the + file descriptor onto its input buffer, and call the read callback. + When writing is enabled, the bufferevent will try to write data onto its + file descriptor when the output buffer has enough data, and call the write + callback when the output buffer is sufficiently drained. + + Bufferevents come in several flavors, including: + +
+
Socket-based bufferevents
+
A bufferevent that reads and writes data onto a network + socket. Created with bufferevent_socket_new().
+ +
Paired bufferevents
+
A pair of bufferevents that send and receive data to one + another without touching the network. Created with + bufferevent_pair_new().
+ +
Filtering bufferevents
+
A bufferevent that transforms data, and sends or receives it + over another underlying bufferevent. Created with + bufferevent_filter_new().
+ +
SSL-backed bufferevents
+
A bufferevent that uses the openssl library to send and + receive data over an encrypted connection. Created with + bufferevent_openssl_socket_new() or + bufferevent_openssl_filter_new().
+
+ */ + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +#include +#ifdef EVENT__HAVE_SYS_TYPES_H +#include +#endif +#ifdef EVENT__HAVE_SYS_TIME_H +#include +#endif + +/* For int types. */ +#include + +/** @name Bufferevent event codes + + These flags are passed as arguments to a bufferevent's event callback. + + @{ +*/ +#define BEV_EVENT_READING 0x01 /**< error encountered while reading */ +#define BEV_EVENT_WRITING 0x02 /**< error encountered while writing */ +#define BEV_EVENT_EOF 0x10 /**< eof file reached */ +#define BEV_EVENT_ERROR 0x20 /**< unrecoverable error encountered */ +#define BEV_EVENT_TIMEOUT 0x40 /**< user-specified timeout reached */ +#define BEV_EVENT_CONNECTED 0x80 /**< connect operation finished. */ +/**@}*/ + +/** + An opaque type for handling buffered IO + + @see event2/bufferevent.h + */ +struct bufferevent +#ifdef EVENT_IN_DOXYGEN_ +{} +#endif +; +struct event_base; +struct evbuffer; +struct sockaddr; + +/** + A read or write callback for a bufferevent. + + The read callback is triggered when new data arrives in the input + buffer and the amount of readable data exceed the low watermark + which is 0 by default. + + The write callback is triggered if the write buffer has been + exhausted or fell below its low watermark. + + @param bev the bufferevent that triggered the callback + @param ctx the user-specified context for this bufferevent + */ +typedef void (*bufferevent_data_cb)(struct bufferevent *bev, void *ctx); + +/** + An event/error callback for a bufferevent. + + The event callback is triggered if either an EOF condition or another + unrecoverable error was encountered. + + For bufferevents with deferred callbacks, this is a bitwise OR of all errors + that have happened on the bufferevent since the last callback invocation. + + @param bev the bufferevent for which the error condition was reached + @param what a conjunction of flags: BEV_EVENT_READING or BEV_EVENT_WRITING + to indicate if the error was encountered on the read or write path, + and one of the following flags: BEV_EVENT_EOF, BEV_EVENT_ERROR, + BEV_EVENT_TIMEOUT, BEV_EVENT_CONNECTED. + + @param ctx the user-specified context for this bufferevent +*/ +typedef void (*bufferevent_event_cb)(struct bufferevent *bev, short what, void *ctx); + +/** Options that can be specified when creating a bufferevent */ +enum bufferevent_options { + /** If set, we close the underlying file + * descriptor/bufferevent/whatever when this bufferevent is freed. */ + BEV_OPT_CLOSE_ON_FREE = (1<<0), + + /** If set, and threading is enabled, operations on this bufferevent + * are protected by a lock */ + BEV_OPT_THREADSAFE = (1<<1), + + /** If set, callbacks are run deferred in the event loop. */ + BEV_OPT_DEFER_CALLBACKS = (1<<2), + + /** If set, callbacks are executed without locks being held on the + * bufferevent. This option currently requires that + * BEV_OPT_DEFER_CALLBACKS also be set; a future version of Libevent + * might remove the requirement.*/ + BEV_OPT_UNLOCK_CALLBACKS = (1<<3) +}; + +/** + Create a new socket bufferevent over an existing socket. + + @param base the event base to associate with the new bufferevent. + @param fd the file descriptor from which data is read and written to. + This file descriptor is not allowed to be a pipe(2). + It is safe to set the fd to -1, so long as you later + set it with bufferevent_setfd or bufferevent_socket_connect(). + @param options Zero or more BEV_OPT_* flags + @return a pointer to a newly allocated bufferevent struct, or NULL if an + error occurred + @see bufferevent_free() + */ +EVENT2_EXPORT_SYMBOL +struct bufferevent *bufferevent_socket_new(struct event_base *base, evutil_socket_t fd, int options); + +/** + Launch a connect() attempt with a socket-based bufferevent. + + When the connect succeeds, the eventcb will be invoked with + BEV_EVENT_CONNECTED set. + + If the bufferevent does not already have a socket set, we allocate a new + socket here and make it nonblocking before we begin. + + If no address is provided, we assume that the socket is already connecting, + and configure the bufferevent so that a BEV_EVENT_CONNECTED event will be + yielded when it is done connecting. + + @param bufev an existing bufferevent allocated with + bufferevent_socket_new(). + @param addr the address we should connect to + @param socklen The length of the address + @return 0 on success, -1 on failure. + */ +EVENT2_EXPORT_SYMBOL +int bufferevent_socket_connect(struct bufferevent *, const struct sockaddr *, int); + +struct evdns_base; +/** + Resolve the hostname 'hostname' and connect to it as with + bufferevent_socket_connect(). + + @param bufev An existing bufferevent allocated with bufferevent_socket_new() + @param evdns_base Optionally, an evdns_base to use for resolving hostnames + asynchronously. May be set to NULL for a blocking resolve. + @param family A preferred address family to resolve addresses to, or + AF_UNSPEC for no preference. Only AF_INET, AF_INET6, and AF_UNSPEC are + supported. + @param hostname The hostname to resolve; see below for notes on recognized + formats + @param port The port to connect to on the resolved address. + @return 0 if successful, -1 on failure. + + Recognized hostname formats are: + + www.example.com (hostname) + 1.2.3.4 (ipv4address) + ::1 (ipv6address) + [::1] ([ipv6address]) + + Performance note: If you do not provide an evdns_base, this function + may block while it waits for a DNS response. This is probably not + what you want. + */ +EVENT2_EXPORT_SYMBOL +int bufferevent_socket_connect_hostname(struct bufferevent *, + struct evdns_base *, int, const char *, int); + +/** + Return the error code for the last failed DNS lookup attempt made by + bufferevent_socket_connect_hostname(). + + @param bev The bufferevent object. + @return DNS error code. + @see evutil_gai_strerror() +*/ +EVENT2_EXPORT_SYMBOL +int bufferevent_socket_get_dns_error(struct bufferevent *bev); + +/** + Assign a bufferevent to a specific event_base. + + NOTE that only socket bufferevents support this function. + + @param base an event_base returned by event_init() + @param bufev a bufferevent struct returned by bufferevent_new() + or bufferevent_socket_new() + @return 0 if successful, or -1 if an error occurred + @see bufferevent_new() + */ +EVENT2_EXPORT_SYMBOL +int bufferevent_base_set(struct event_base *base, struct bufferevent *bufev); + +/** + Return the event_base used by a bufferevent +*/ +EVENT2_EXPORT_SYMBOL +struct event_base *bufferevent_get_base(struct bufferevent *bev); + +/** + Assign a priority to a bufferevent. + + Only supported for socket bufferevents. + + @param bufev a bufferevent struct + @param pri the priority to be assigned + @return 0 if successful, or -1 if an error occurred + */ +EVENT2_EXPORT_SYMBOL +int bufferevent_priority_set(struct bufferevent *bufev, int pri); + +/** + Return the priority of a bufferevent. + + Only supported for socket bufferevents + */ +EVENT2_EXPORT_SYMBOL +int bufferevent_get_priority(const struct bufferevent *bufev); + +/** + Deallocate the storage associated with a bufferevent structure. + + If there is pending data to write on the bufferevent, it probably won't be + flushed before the bufferevent is freed. + + @param bufev the bufferevent structure to be freed. + */ +EVENT2_EXPORT_SYMBOL +void bufferevent_free(struct bufferevent *bufev); + + +/** + Changes the callbacks for a bufferevent. + + @param bufev the bufferevent object for which to change callbacks + @param readcb callback to invoke when there is data to be read, or NULL if + no callback is desired + @param writecb callback to invoke when the file descriptor is ready for + writing, or NULL if no callback is desired + @param eventcb callback to invoke when there is an event on the file + descriptor + @param cbarg an argument that will be supplied to each of the callbacks + (readcb, writecb, and errorcb) + @see bufferevent_new() + */ +EVENT2_EXPORT_SYMBOL +void bufferevent_setcb(struct bufferevent *bufev, + bufferevent_data_cb readcb, bufferevent_data_cb writecb, + bufferevent_event_cb eventcb, void *cbarg); + +/** + Retrieves the callbacks for a bufferevent. + + @param bufev the bufferevent to examine. + @param readcb_ptr if readcb_ptr is nonnull, *readcb_ptr is set to the current + read callback for the bufferevent. + @param writecb_ptr if writecb_ptr is nonnull, *writecb_ptr is set to the + current write callback for the bufferevent. + @param eventcb_ptr if eventcb_ptr is nonnull, *eventcb_ptr is set to the + current event callback for the bufferevent. + @param cbarg_ptr if cbarg_ptr is nonnull, *cbarg_ptr is set to the current + callback argument for the bufferevent. + @see buffervent_setcb() +*/ +EVENT2_EXPORT_SYMBOL +void bufferevent_getcb(struct bufferevent *bufev, + bufferevent_data_cb *readcb_ptr, + bufferevent_data_cb *writecb_ptr, + bufferevent_event_cb *eventcb_ptr, + void **cbarg_ptr); + +/** + Changes the file descriptor on which the bufferevent operates. + Not supported for all bufferevent types. + + @param bufev the bufferevent object for which to change the file descriptor + @param fd the file descriptor to operate on +*/ +EVENT2_EXPORT_SYMBOL +int bufferevent_setfd(struct bufferevent *bufev, evutil_socket_t fd); + +/** + Returns the file descriptor associated with a bufferevent, or -1 if + no file descriptor is associated with the bufferevent. + */ +EVENT2_EXPORT_SYMBOL +evutil_socket_t bufferevent_getfd(struct bufferevent *bufev); + +/** + Returns the underlying bufferevent associated with a bufferevent (if + the bufferevent is a wrapper), or NULL if there is no underlying bufferevent. + */ +EVENT2_EXPORT_SYMBOL +struct bufferevent *bufferevent_get_underlying(struct bufferevent *bufev); + +/** + Write data to a bufferevent buffer. + + The bufferevent_write() function can be used to write data to the file + descriptor. The data is appended to the output buffer and written to the + descriptor automatically as it becomes available for writing. + + @param bufev the bufferevent to be written to + @param data a pointer to the data to be written + @param size the length of the data, in bytes + @return 0 if successful, or -1 if an error occurred + @see bufferevent_write_buffer() + */ +EVENT2_EXPORT_SYMBOL +int bufferevent_write(struct bufferevent *bufev, + const void *data, size_t size); + + +/** + Write data from an evbuffer to a bufferevent buffer. The evbuffer is + being drained as a result. + + @param bufev the bufferevent to be written to + @param buf the evbuffer to be written + @return 0 if successful, or -1 if an error occurred + @see bufferevent_write() + */ +EVENT2_EXPORT_SYMBOL +int bufferevent_write_buffer(struct bufferevent *bufev, struct evbuffer *buf); + + +/** + Read data from a bufferevent buffer. + + The bufferevent_read() function is used to read data from the input buffer. + + @param bufev the bufferevent to be read from + @param data pointer to a buffer that will store the data + @param size the size of the data buffer, in bytes + @return the amount of data read, in bytes. + */ +EVENT2_EXPORT_SYMBOL +size_t bufferevent_read(struct bufferevent *bufev, void *data, size_t size); + +/** + Read data from a bufferevent buffer into an evbuffer. This avoids + memory copies. + + @param bufev the bufferevent to be read from + @param buf the evbuffer to which to add data + @return 0 if successful, or -1 if an error occurred. + */ +EVENT2_EXPORT_SYMBOL +int bufferevent_read_buffer(struct bufferevent *bufev, struct evbuffer *buf); + +/** + Returns the input buffer. + + The user MUST NOT set the callback on this buffer. + + @param bufev the bufferevent from which to get the evbuffer + @return the evbuffer object for the input buffer + */ + +EVENT2_EXPORT_SYMBOL +struct evbuffer *bufferevent_get_input(struct bufferevent *bufev); + +/** + Returns the output buffer. + + The user MUST NOT set the callback on this buffer. + + When filters are being used, the filters need to be manually + triggered if the output buffer was manipulated. + + @param bufev the bufferevent from which to get the evbuffer + @return the evbuffer object for the output buffer + */ + +EVENT2_EXPORT_SYMBOL +struct evbuffer *bufferevent_get_output(struct bufferevent *bufev); + +/** + Enable a bufferevent. + + @param bufev the bufferevent to be enabled + @param event any combination of EV_READ | EV_WRITE. + @return 0 if successful, or -1 if an error occurred + @see bufferevent_disable() + */ +EVENT2_EXPORT_SYMBOL +int bufferevent_enable(struct bufferevent *bufev, short event); + +/** + Disable a bufferevent. + + @param bufev the bufferevent to be disabled + @param event any combination of EV_READ | EV_WRITE. + @return 0 if successful, or -1 if an error occurred + @see bufferevent_enable() + */ +EVENT2_EXPORT_SYMBOL +int bufferevent_disable(struct bufferevent *bufev, short event); + +/** + Return the events that are enabled on a given bufferevent. + + @param bufev the bufferevent to inspect + @return A combination of EV_READ | EV_WRITE + */ +EVENT2_EXPORT_SYMBOL +short bufferevent_get_enabled(struct bufferevent *bufev); + +/** + Set the read and write timeout for a bufferevent. + + A bufferevent's timeout will fire the first time that the indicated + amount of time has elapsed since a successful read or write operation, + during which the bufferevent was trying to read or write. + + (In other words, if reading or writing is disabled, or if the + bufferevent's read or write operation has been suspended because + there's no data to write, or not enough bandwidth, or so on, the + timeout isn't active. The timeout only becomes active when we we're + willing to actually read or write.) + + Calling bufferevent_enable or setting a timeout for a bufferevent + whose timeout is already pending resets its timeout. + + If the timeout elapses, the corresponding operation (EV_READ or + EV_WRITE) becomes disabled until you re-enable it again. The + bufferevent's event callback is called with the + BEV_EVENT_TIMEOUT|BEV_EVENT_READING or + BEV_EVENT_TIMEOUT|BEV_EVENT_WRITING. + + @param bufev the bufferevent to be modified + @param timeout_read the read timeout, or NULL + @param timeout_write the write timeout, or NULL + */ +EVENT2_EXPORT_SYMBOL +int bufferevent_set_timeouts(struct bufferevent *bufev, + const struct timeval *timeout_read, const struct timeval *timeout_write); + +/** + Sets the watermarks for read and write events. + + On input, a bufferevent does not invoke the user read callback unless + there is at least low watermark data in the buffer. If the read buffer + is beyond the high watermark, the bufferevent stops reading from the network. + But be aware that bufferevent input/read buffer can overrun high watermark + limit (typical example is openssl bufferevent), so you should not relay in + this. + + On output, the user write callback is invoked whenever the buffered data + falls below the low watermark. Filters that write to this bufev will try + not to write more bytes to this buffer than the high watermark would allow, + except when flushing. + + @param bufev the bufferevent to be modified + @param events EV_READ, EV_WRITE or both + @param lowmark the lower watermark to set + @param highmark the high watermark to set +*/ + +EVENT2_EXPORT_SYMBOL +void bufferevent_setwatermark(struct bufferevent *bufev, short events, + size_t lowmark, size_t highmark); + +/** + Retrieves the watermarks for read or write events. + Returns non-zero if events contains not only EV_READ or EV_WRITE. + Returns zero if events equal EV_READ or EV_WRITE + + @param bufev the bufferevent to be examined + @param events EV_READ or EV_WRITE + @param lowmark receives the lower watermark if not NULL + @param highmark receives the high watermark if not NULL +*/ +EVENT2_EXPORT_SYMBOL +int bufferevent_getwatermark(struct bufferevent *bufev, short events, + size_t *lowmark, size_t *highmark); + +/** + Acquire the lock on a bufferevent. Has no effect if locking was not + enabled with BEV_OPT_THREADSAFE. + */ +EVENT2_EXPORT_SYMBOL +void bufferevent_lock(struct bufferevent *bufev); + +/** + Release the lock on a bufferevent. Has no effect if locking was not + enabled with BEV_OPT_THREADSAFE. + */ +EVENT2_EXPORT_SYMBOL +void bufferevent_unlock(struct bufferevent *bufev); + + +/** + * Public interface to manually increase the reference count of a bufferevent + * this is useful in situations where a user may reference the bufferevent + * somewhere else (unknown to libevent) + * + * @param bufev the bufferevent to increase the refcount on + * + */ +EVENT2_EXPORT_SYMBOL +void bufferevent_incref(struct bufferevent *bufev); + +/** + * Public interface to manually decrement the reference count of a bufferevent + * + * Warning: make sure you know what you're doing. This is mainly used in + * conjunction with bufferevent_incref(). This will free up all data associated + * with a bufferevent if the reference count hits 0. + * + * @param bufev the bufferevent to decrement the refcount on + * + * @return 1 if the bufferevent was freed, otherwise 0 (still referenced) + */ +EVENT2_EXPORT_SYMBOL +int bufferevent_decref(struct bufferevent *bufev); + +/** + Flags that can be passed into filters to let them know how to + deal with the incoming data. +*/ +enum bufferevent_flush_mode { + /** usually set when processing data */ + BEV_NORMAL = 0, + + /** want to checkpoint all data sent. */ + BEV_FLUSH = 1, + + /** encountered EOF on read or done sending data */ + BEV_FINISHED = 2 +}; + +/** + Triggers the bufferevent to produce more data if possible. + + @param bufev the bufferevent object + @param iotype either EV_READ or EV_WRITE or both. + @param mode either BEV_NORMAL or BEV_FLUSH or BEV_FINISHED + @return -1 on failure, 0 if no data was produces, 1 if data was produced + */ +EVENT2_EXPORT_SYMBOL +int bufferevent_flush(struct bufferevent *bufev, + short iotype, + enum bufferevent_flush_mode mode); + +/** + Flags for bufferevent_trigger(_event) that modify when and how to trigger + the callback. +*/ +enum bufferevent_trigger_options { + /** trigger the callback regardless of the watermarks */ + BEV_TRIG_IGNORE_WATERMARKS = (1<<16), + + /** defer even if the callbacks are not */ + BEV_TRIG_DEFER_CALLBACKS = BEV_OPT_DEFER_CALLBACKS + + /* (Note: for internal reasons, these need to be disjoint from + * bufferevent_options, except when they mean the same thing. */ +}; + +/** + Triggers bufferevent data callbacks. + + The function will honor watermarks unless options contain + BEV_TRIG_IGNORE_WATERMARKS. If the options contain BEV_OPT_DEFER_CALLBACKS, + the callbacks are deferred. + + @param bufev the bufferevent object + @param iotype either EV_READ or EV_WRITE or both. + @param options + */ +EVENT2_EXPORT_SYMBOL +void bufferevent_trigger(struct bufferevent *bufev, short iotype, + int options); + +/** + Triggers the bufferevent event callback. + + If the options contain BEV_OPT_DEFER_CALLBACKS, the callbacks are deferred. + + @param bufev the bufferevent object + @param what the flags to pass onto the event callback + @param options + */ +EVENT2_EXPORT_SYMBOL +void bufferevent_trigger_event(struct bufferevent *bufev, short what, + int options); + +/** + @name Filtering support + + @{ +*/ +/** + Values that filters can return. + */ +enum bufferevent_filter_result { + /** everything is okay */ + BEV_OK = 0, + + /** the filter needs to read more data before output */ + BEV_NEED_MORE = 1, + + /** the filter encountered a critical error, no further data + can be processed. */ + BEV_ERROR = 2 +}; + +/** A callback function to implement a filter for a bufferevent. + + @param src An evbuffer to drain data from. + @param dst An evbuffer to add data to. + @param limit A suggested upper bound of bytes to write to dst. + The filter may ignore this value, but doing so means that + it will overflow the high-water mark associated with dst. + -1 means "no limit". + @param mode Whether we should write data as may be convenient + (BEV_NORMAL), or flush as much data as we can (BEV_FLUSH), + or flush as much as we can, possibly including an end-of-stream + marker (BEV_FINISH). + @param ctx A user-supplied pointer. + + @return BEV_OK if we wrote some data; BEV_NEED_MORE if we can't + produce any more output until we get some input; and BEV_ERROR + on an error. + */ +typedef enum bufferevent_filter_result (*bufferevent_filter_cb)( + struct evbuffer *src, struct evbuffer *dst, ev_ssize_t dst_limit, + enum bufferevent_flush_mode mode, void *ctx); + +/** + Allocate a new filtering bufferevent on top of an existing bufferevent. + + @param underlying the underlying bufferevent. + @param input_filter The filter to apply to data we read from the underlying + bufferevent + @param output_filter The filer to apply to data we write to the underlying + bufferevent + @param options A bitfield of bufferevent options. + @param free_context A function to use to free the filter context when + this bufferevent is freed. + @param ctx A context pointer to pass to the filter functions. + */ +EVENT2_EXPORT_SYMBOL +struct bufferevent * +bufferevent_filter_new(struct bufferevent *underlying, + bufferevent_filter_cb input_filter, + bufferevent_filter_cb output_filter, + int options, + void (*free_context)(void *), + void *ctx); +/**@}*/ + +/** + Allocate a pair of linked bufferevents. The bufferevents behave as would + two bufferevent_sock instances connected to opposite ends of a + socketpair(), except that no internal socketpair is allocated. + + @param base The event base to associate with the socketpair. + @param options A set of options for this bufferevent + @param pair A pointer to an array to hold the two new bufferevent objects. + @return 0 on success, -1 on failure. + */ +EVENT2_EXPORT_SYMBOL +int bufferevent_pair_new(struct event_base *base, int options, + struct bufferevent *pair[2]); + +/** + Given one bufferevent returned by bufferevent_pair_new(), returns the + other one if it still exists. Otherwise returns NULL. + */ +EVENT2_EXPORT_SYMBOL +struct bufferevent *bufferevent_pair_get_partner(struct bufferevent *bev); + +/** + Abstract type used to configure rate-limiting on a bufferevent or a group + of bufferevents. + */ +struct ev_token_bucket_cfg; + +/** + A group of bufferevents which are configured to respect the same rate + limit. +*/ +struct bufferevent_rate_limit_group; + +/** Maximum configurable rate- or burst-limit. */ +#define EV_RATE_LIMIT_MAX EV_SSIZE_MAX + +/** + Initialize and return a new object to configure the rate-limiting behavior + of bufferevents. + + @param read_rate The maximum number of bytes to read per tick on + average. + @param read_burst The maximum number of bytes to read in any single tick. + @param write_rate The maximum number of bytes to write per tick on + average. + @param write_burst The maximum number of bytes to write in any single tick. + @param tick_len The length of a single tick. Defaults to one second. + Any fractions of a millisecond are ignored. + + Note that all rate-limits hare are currently best-effort: future versions + of Libevent may implement them more tightly. + */ +EVENT2_EXPORT_SYMBOL +struct ev_token_bucket_cfg *ev_token_bucket_cfg_new( + size_t read_rate, size_t read_burst, + size_t write_rate, size_t write_burst, + const struct timeval *tick_len); + +/** Free all storage held in 'cfg'. + + Note: 'cfg' is not currently reference-counted; it is not safe to free it + until no bufferevent is using it. + */ +EVENT2_EXPORT_SYMBOL +void ev_token_bucket_cfg_free(struct ev_token_bucket_cfg *cfg); + +/** + Set the rate-limit of a the bufferevent 'bev' to the one specified in + 'cfg'. If 'cfg' is NULL, disable any per-bufferevent rate-limiting on + 'bev'. + + Note that only some bufferevent types currently respect rate-limiting. + They are: socket-based bufferevents (normal and IOCP-based), and SSL-based + bufferevents. + + Return 0 on success, -1 on failure. + */ +EVENT2_EXPORT_SYMBOL +int bufferevent_set_rate_limit(struct bufferevent *bev, + struct ev_token_bucket_cfg *cfg); + +/** + Create a new rate-limit group for bufferevents. A rate-limit group + constrains the maximum number of bytes sent and received, in toto, + by all of its bufferevents. + + @param base An event_base to run any necessary timeouts for the group. + Note that all bufferevents in the group do not necessarily need to share + this event_base. + @param cfg The rate-limit for this group. + + Note that all rate-limits hare are currently best-effort: future versions + of Libevent may implement them more tightly. + + Note also that only some bufferevent types currently respect rate-limiting. + They are: socket-based bufferevents (normal and IOCP-based), and SSL-based + bufferevents. + */ +EVENT2_EXPORT_SYMBOL +struct bufferevent_rate_limit_group *bufferevent_rate_limit_group_new( + struct event_base *base, + const struct ev_token_bucket_cfg *cfg); +/** + Change the rate-limiting settings for a given rate-limiting group. + + Return 0 on success, -1 on failure. +*/ +EVENT2_EXPORT_SYMBOL +int bufferevent_rate_limit_group_set_cfg( + struct bufferevent_rate_limit_group *, + const struct ev_token_bucket_cfg *); + +/** + Change the smallest quantum we're willing to allocate to any single + bufferevent in a group for reading or writing at a time. + + The rationale is that, because of TCP/IP protocol overheads and kernel + behavior, if a rate-limiting group is so tight on bandwidth that you're + only willing to send 1 byte per tick per bufferevent, you might instead + want to batch up the reads and writes so that you send N bytes per + 1/N of the bufferevents (chosen at random) each tick, so you still wind + up send 1 byte per tick per bufferevent on average, but you don't send + so many tiny packets. + + The default min-share is currently 64 bytes. + + Returns 0 on success, -1 on failure. + */ +EVENT2_EXPORT_SYMBOL +int bufferevent_rate_limit_group_set_min_share( + struct bufferevent_rate_limit_group *, size_t); + +/** + Free a rate-limiting group. The group must have no members when + this function is called. +*/ +EVENT2_EXPORT_SYMBOL +void bufferevent_rate_limit_group_free(struct bufferevent_rate_limit_group *); + +/** + Add 'bev' to the list of bufferevents whose aggregate reading and writing + is restricted by 'g'. If 'g' is NULL, remove 'bev' from its current group. + + A bufferevent may belong to no more than one rate-limit group at a time. + If 'bev' is already a member of a group, it will be removed from its old + group before being added to 'g'. + + Return 0 on success and -1 on failure. + */ +EVENT2_EXPORT_SYMBOL +int bufferevent_add_to_rate_limit_group(struct bufferevent *bev, + struct bufferevent_rate_limit_group *g); + +/** Remove 'bev' from its current rate-limit group (if any). */ +EVENT2_EXPORT_SYMBOL +int bufferevent_remove_from_rate_limit_group(struct bufferevent *bev); + +/** + Set the size limit for single read operation. + + Set to 0 for a reasonable default. + + Return 0 on success and -1 on failure. + */ +EVENT2_EXPORT_SYMBOL +int bufferevent_set_max_single_read(struct bufferevent *bev, size_t size); + +/** + Set the size limit for single write operation. + + Set to 0 for a reasonable default. + + Return 0 on success and -1 on failure. + */ +EVENT2_EXPORT_SYMBOL +int bufferevent_set_max_single_write(struct bufferevent *bev, size_t size); + +/** Get the current size limit for single read operation. */ +EVENT2_EXPORT_SYMBOL +ev_ssize_t bufferevent_get_max_single_read(struct bufferevent *bev); + +/** Get the current size limit for single write operation. */ +EVENT2_EXPORT_SYMBOL +ev_ssize_t bufferevent_get_max_single_write(struct bufferevent *bev); + +/** + @name Rate limit inspection + + Return the current read or write bucket size for a bufferevent. + If it is not configured with a per-bufferevent ratelimit, return + EV_SSIZE_MAX. This function does not inspect the group limit, if any. + Note that it can return a negative value if the bufferevent has been + made to read or write more than its limit. + + @{ + */ +EVENT2_EXPORT_SYMBOL +ev_ssize_t bufferevent_get_read_limit(struct bufferevent *bev); +EVENT2_EXPORT_SYMBOL +ev_ssize_t bufferevent_get_write_limit(struct bufferevent *bev); +/*@}*/ + +EVENT2_EXPORT_SYMBOL +ev_ssize_t bufferevent_get_max_to_read(struct bufferevent *bev); +EVENT2_EXPORT_SYMBOL +ev_ssize_t bufferevent_get_max_to_write(struct bufferevent *bev); + +EVENT2_EXPORT_SYMBOL +const struct ev_token_bucket_cfg *bufferevent_get_token_bucket_cfg(const struct bufferevent * bev); + +/** + @name Group Rate limit inspection + + Return the read or write bucket size for a bufferevent rate limit + group. Note that it can return a negative value if bufferevents in + the group have been made to read or write more than their limits. + + @{ + */ +EVENT2_EXPORT_SYMBOL +ev_ssize_t bufferevent_rate_limit_group_get_read_limit( + struct bufferevent_rate_limit_group *); +EVENT2_EXPORT_SYMBOL +ev_ssize_t bufferevent_rate_limit_group_get_write_limit( + struct bufferevent_rate_limit_group *); +/*@}*/ + +/** + @name Rate limit manipulation + + Subtract a number of bytes from a bufferevent's read or write bucket. + The decrement value can be negative, if you want to manually refill + the bucket. If the change puts the bucket above or below zero, the + bufferevent will resume or suspend reading writing as appropriate. + These functions make no change in the buckets for the bufferevent's + group, if any. + + Returns 0 on success, -1 on internal error. + + @{ + */ +EVENT2_EXPORT_SYMBOL +int bufferevent_decrement_read_limit(struct bufferevent *bev, ev_ssize_t decr); +EVENT2_EXPORT_SYMBOL +int bufferevent_decrement_write_limit(struct bufferevent *bev, ev_ssize_t decr); +/*@}*/ + +/** + @name Group rate limit manipulation + + Subtract a number of bytes from a bufferevent rate-limiting group's + read or write bucket. The decrement value can be negative, if you + want to manually refill the bucket. If the change puts the bucket + above or below zero, the bufferevents in the group will resume or + suspend reading writing as appropriate. + + Returns 0 on success, -1 on internal error. + + @{ + */ +EVENT2_EXPORT_SYMBOL +int bufferevent_rate_limit_group_decrement_read( + struct bufferevent_rate_limit_group *, ev_ssize_t); +EVENT2_EXPORT_SYMBOL +int bufferevent_rate_limit_group_decrement_write( + struct bufferevent_rate_limit_group *, ev_ssize_t); +/*@}*/ + + +/** + * Inspect the total bytes read/written on a group. + * + * Set the variable pointed to by total_read_out to the total number of bytes + * ever read on grp, and the variable pointed to by total_written_out to the + * total number of bytes ever written on grp. */ +EVENT2_EXPORT_SYMBOL +void bufferevent_rate_limit_group_get_totals( + struct bufferevent_rate_limit_group *grp, + ev_uint64_t *total_read_out, ev_uint64_t *total_written_out); + +/** + * Reset the total bytes read/written on a group. + * + * Reset the number of bytes read or written on grp as given by + * bufferevent_rate_limit_group_reset_totals(). */ +EVENT2_EXPORT_SYMBOL +void +bufferevent_rate_limit_group_reset_totals( + struct bufferevent_rate_limit_group *grp); + +#ifdef __cplusplus +} +#endif + +#endif /* EVENT2_BUFFEREVENT_H_INCLUDED_ */ diff --git a/bsnes/thrift/libevent/include/event2/bufferevent_compat.h b/bsnes/thrift/libevent/include/event2/bufferevent_compat.h new file mode 100644 index 00000000..a5a3c720 --- /dev/null +++ b/bsnes/thrift/libevent/include/event2/bufferevent_compat.h @@ -0,0 +1,104 @@ +/* + * Copyright (c) 2007-2012 Niels Provos, Nick Mathewson + * Copyright (c) 2000-2007 Niels Provos + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +#ifndef EVENT2_BUFFEREVENT_COMPAT_H_INCLUDED_ +#define EVENT2_BUFFEREVENT_COMPAT_H_INCLUDED_ + +#include + +#define evbuffercb bufferevent_data_cb +#define everrorcb bufferevent_event_cb + +/** + Create a new bufferevent for an fd. + + This function is deprecated. Use bufferevent_socket_new and + bufferevent_set_callbacks instead. + + Libevent provides an abstraction on top of the regular event callbacks. + This abstraction is called a buffered event. A buffered event provides + input and output buffers that get filled and drained automatically. The + user of a buffered event no longer deals directly with the I/O, but + instead is reading from input and writing to output buffers. + + Once initialized, the bufferevent structure can be used repeatedly with + bufferevent_enable() and bufferevent_disable(). + + When read enabled the bufferevent will try to read from the file descriptor + and call the read callback. The write callback is executed whenever the + output buffer is drained below the write low watermark, which is 0 by + default. + + If multiple bases are in use, bufferevent_base_set() must be called before + enabling the bufferevent for the first time. + + @deprecated This function is deprecated because it uses the current + event base, and as such can be error prone for multithreaded programs. + Use bufferevent_socket_new() instead. + + @param fd the file descriptor from which data is read and written to. + This file descriptor is not allowed to be a pipe(2). + @param readcb callback to invoke when there is data to be read, or NULL if + no callback is desired + @param writecb callback to invoke when the file descriptor is ready for + writing, or NULL if no callback is desired + @param errorcb callback to invoke when there is an error on the file + descriptor + @param cbarg an argument that will be supplied to each of the callbacks + (readcb, writecb, and errorcb) + @return a pointer to a newly allocated bufferevent struct, or NULL if an + error occurred + @see bufferevent_base_set(), bufferevent_free() + */ +EVENT2_EXPORT_SYMBOL +struct bufferevent *bufferevent_new(evutil_socket_t fd, + evbuffercb readcb, evbuffercb writecb, everrorcb errorcb, void *cbarg); + + +/** + Set the read and write timeout for a buffered event. + + @param bufev the bufferevent to be modified + @param timeout_read the read timeout + @param timeout_write the write timeout + */ +EVENT2_EXPORT_SYMBOL +void bufferevent_settimeout(struct bufferevent *bufev, + int timeout_read, int timeout_write); + +#define EVBUFFER_READ BEV_EVENT_READING +#define EVBUFFER_WRITE BEV_EVENT_WRITING +#define EVBUFFER_EOF BEV_EVENT_EOF +#define EVBUFFER_ERROR BEV_EVENT_ERROR +#define EVBUFFER_TIMEOUT BEV_EVENT_TIMEOUT + +/** macro for getting access to the input buffer of a bufferevent */ +#define EVBUFFER_INPUT(x) bufferevent_get_input(x) +/** macro for getting access to the output buffer of a bufferevent */ +#define EVBUFFER_OUTPUT(x) bufferevent_get_output(x) + +#endif diff --git a/bsnes/thrift/libevent/include/event2/bufferevent_struct.h b/bsnes/thrift/libevent/include/event2/bufferevent_struct.h new file mode 100644 index 00000000..e84c082c --- /dev/null +++ b/bsnes/thrift/libevent/include/event2/bufferevent_struct.h @@ -0,0 +1,116 @@ +/* + * Copyright (c) 2000-2007 Niels Provos + * Copyright (c) 2007-2012 Niels Provos and Nick Mathewson + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +#ifndef EVENT2_BUFFEREVENT_STRUCT_H_INCLUDED_ +#define EVENT2_BUFFEREVENT_STRUCT_H_INCLUDED_ + +/** @file event2/bufferevent_struct.h + + Data structures for bufferevents. Using these structures may hurt forward + compatibility with later versions of Libevent: be careful! + + @deprecated Use of bufferevent_struct.h is completely deprecated; these + structures are only exposed for backward compatibility with programs + written before Libevent 2.0 that used them. + */ + +#ifdef __cplusplus +extern "C" { +#endif + +#include +#ifdef EVENT__HAVE_SYS_TYPES_H +#include +#endif +#ifdef EVENT__HAVE_SYS_TIME_H +#include +#endif + +/* For int types. */ +#include +/* For struct event */ +#include + +struct event_watermark { + size_t low; + size_t high; +}; + +/** + Shared implementation of a bufferevent. + + This type is exposed only because it was exposed in previous versions, + and some people's code may rely on manipulating it. Otherwise, you + should really not rely on the layout, size, or contents of this structure: + it is fairly volatile, and WILL change in future versions of the code. +**/ +struct bufferevent { + /** Event base for which this bufferevent was created. */ + struct event_base *ev_base; + /** Pointer to a table of function pointers to set up how this + bufferevent behaves. */ + const struct bufferevent_ops *be_ops; + + /** A read event that triggers when a timeout has happened or a socket + is ready to read data. Only used by some subtypes of + bufferevent. */ + struct event ev_read; + /** A write event that triggers when a timeout has happened or a socket + is ready to write data. Only used by some subtypes of + bufferevent. */ + struct event ev_write; + + /** An input buffer. Only the bufferevent is allowed to add data to + this buffer, though the user is allowed to drain it. */ + struct evbuffer *input; + + /** An input buffer. Only the bufferevent is allowed to drain data + from this buffer, though the user is allowed to add it. */ + struct evbuffer *output; + + struct event_watermark wm_read; + struct event_watermark wm_write; + + bufferevent_data_cb readcb; + bufferevent_data_cb writecb; + /* This should be called 'eventcb', but renaming it would break + * backward compatibility */ + bufferevent_event_cb errorcb; + void *cbarg; + + struct timeval timeout_read; + struct timeval timeout_write; + + /** Events that are currently enabled: currently EV_READ and EV_WRITE + are supported. */ + short enabled; +}; + +#ifdef __cplusplus +} +#endif + +#endif /* EVENT2_BUFFEREVENT_STRUCT_H_INCLUDED_ */ diff --git a/bsnes/thrift/libevent/include/event2/dns.h b/bsnes/thrift/libevent/include/event2/dns.h new file mode 100644 index 00000000..13ce027e --- /dev/null +++ b/bsnes/thrift/libevent/include/event2/dns.h @@ -0,0 +1,751 @@ +/* + * Copyright (c) 2006-2007 Niels Provos + * Copyright (c) 2007-2012 Niels Provos and Nick Mathewson + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +/* + * The original DNS code is due to Adam Langley with heavy + * modifications by Nick Mathewson. Adam put his DNS software in the + * public domain. You can find his original copyright below. Please, + * aware that the code as part of Libevent is governed by the 3-clause + * BSD license above. + * + * This software is Public Domain. To view a copy of the public domain dedication, + * visit http://creativecommons.org/licenses/publicdomain/ or send a letter to + * Creative Commons, 559 Nathan Abbott Way, Stanford, California 94305, USA. + * + * I ask and expect, but do not require, that all derivative works contain an + * attribution similar to: + * Parts developed by Adam Langley + * + * You may wish to replace the word "Parts" with something else depending on + * the amount of original code. + * + * (Derivative works does not include programs which link against, run or include + * the source verbatim in their source distributions) + */ + +/** @file event2/dns.h + * + * Welcome, gentle reader + * + * Async DNS lookups are really a whole lot harder than they should be, + * mostly stemming from the fact that the libc resolver has never been + * very good at them. Before you use this library you should see if libc + * can do the job for you with the modern async call getaddrinfo_a + * (see http://www.imperialviolet.org/page25.html#e498). Otherwise, + * please continue. + * + * The library keeps track of the state of nameservers and will avoid + * them when they go down. Otherwise it will round robin between them. + * + * Quick start guide: + * #include "evdns.h" + * void callback(int result, char type, int count, int ttl, + * void *addresses, void *arg); + * evdns_resolv_conf_parse(DNS_OPTIONS_ALL, "/etc/resolv.conf"); + * evdns_resolve("www.hostname.com", 0, callback, NULL); + * + * When the lookup is complete the callback function is called. The + * first argument will be one of the DNS_ERR_* defines in evdns.h. + * Hopefully it will be DNS_ERR_NONE, in which case type will be + * DNS_IPv4_A, count will be the number of IP addresses, ttl is the time + * which the data can be cached for (in seconds), addresses will point + * to an array of uint32_t's and arg will be whatever you passed to + * evdns_resolve. + * + * Searching: + * + * In order for this library to be a good replacement for glibc's resolver it + * supports searching. This involves setting a list of default domains, in + * which names will be queried for. The number of dots in the query name + * determines the order in which this list is used. + * + * Searching appears to be a single lookup from the point of view of the API, + * although many DNS queries may be generated from a single call to + * evdns_resolve. Searching can also drastically slow down the resolution + * of names. + * + * To disable searching: + * 1. Never set it up. If you never call evdns_resolv_conf_parse or + * evdns_search_add then no searching will occur. + * + * 2. If you do call evdns_resolv_conf_parse then don't pass + * DNS_OPTION_SEARCH (or DNS_OPTIONS_ALL, which implies it). + * + * 3. When calling evdns_resolve, pass the DNS_QUERY_NO_SEARCH flag. + * + * The order of searches depends on the number of dots in the name. If the + * number is greater than the ndots setting then the names is first tried + * globally. Otherwise each search domain is appended in turn. + * + * The ndots setting can either be set from a resolv.conf, or by calling + * evdns_search_ndots_set. + * + * For example, with ndots set to 1 (the default) and a search domain list of + * ["myhome.net"]: + * Query: www + * Order: www.myhome.net, www. + * + * Query: www.abc + * Order: www.abc., www.abc.myhome.net + * + * Internals: + * + * Requests are kept in two queues. The first is the inflight queue. In + * this queue requests have an allocated transaction id and nameserver. + * They will soon be transmitted if they haven't already been. + * + * The second is the waiting queue. The size of the inflight ring is + * limited and all other requests wait in waiting queue for space. This + * bounds the number of concurrent requests so that we don't flood the + * nameserver. Several algorithms require a full walk of the inflight + * queue and so bounding its size keeps thing going nicely under huge + * (many thousands of requests) loads. + * + * If a nameserver loses too many requests it is considered down and we + * try not to use it. After a while we send a probe to that nameserver + * (a lookup for google.com) and, if it replies, we consider it working + * again. If the nameserver fails a probe we wait longer to try again + * with the next probe. + */ + +#ifndef EVENT2_DNS_H_INCLUDED_ +#define EVENT2_DNS_H_INCLUDED_ + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* For integer types. */ +#include + +/** Error codes 0-5 are as described in RFC 1035. */ +#define DNS_ERR_NONE 0 +/** The name server was unable to interpret the query */ +#define DNS_ERR_FORMAT 1 +/** The name server was unable to process this query due to a problem with the + * name server */ +#define DNS_ERR_SERVERFAILED 2 +/** The domain name does not exist */ +#define DNS_ERR_NOTEXIST 3 +/** The name server does not support the requested kind of query */ +#define DNS_ERR_NOTIMPL 4 +/** The name server refuses to reform the specified operation for policy + * reasons */ +#define DNS_ERR_REFUSED 5 +/** The reply was truncated or ill-formatted */ +#define DNS_ERR_TRUNCATED 65 +/** An unknown error occurred */ +#define DNS_ERR_UNKNOWN 66 +/** Communication with the server timed out */ +#define DNS_ERR_TIMEOUT 67 +/** The request was canceled because the DNS subsystem was shut down. */ +#define DNS_ERR_SHUTDOWN 68 +/** The request was canceled via a call to evdns_cancel_request */ +#define DNS_ERR_CANCEL 69 +/** There were no answers and no error condition in the DNS packet. + * This can happen when you ask for an address that exists, but a record + * type that doesn't. */ +#define DNS_ERR_NODATA 70 + +#define DNS_IPv4_A 1 +#define DNS_PTR 2 +#define DNS_IPv6_AAAA 3 + +#define DNS_QUERY_NO_SEARCH 1 + +/* Allow searching */ +#define DNS_OPTION_SEARCH 1 +/* Parse "nameserver" and add default if no such section */ +#define DNS_OPTION_NAMESERVERS 2 +/* Parse additional options like: + * - timeout: + * - getaddrinfo-allow-skew: + * - max-timeouts: + * - max-inflight: + * - attempts: + * - randomize-case: + * - initial-probe-timeout: + */ +#define DNS_OPTION_MISC 4 +/* Load hosts file (i.e. "/etc/hosts") */ +#define DNS_OPTION_HOSTSFILE 8 +/** + * All above: + * - DNS_OPTION_SEARCH + * - DNS_OPTION_NAMESERVERS + * - DNS_OPTION_MISC + * - DNS_OPTION_HOSTSFILE + */ +#define DNS_OPTIONS_ALL ( \ + DNS_OPTION_SEARCH | \ + DNS_OPTION_NAMESERVERS | \ + DNS_OPTION_MISC | \ + DNS_OPTION_HOSTSFILE | \ + 0 \ +) +/* Do not "default" nameserver (i.e. "127.0.0.1:53") if there is no nameservers + * in resolv.conf, (iff DNS_OPTION_NAMESERVERS is set) */ +#define DNS_OPTION_NAMESERVERS_NO_DEFAULT 16 + +/* Obsolete name for DNS_QUERY_NO_SEARCH */ +#define DNS_NO_SEARCH DNS_QUERY_NO_SEARCH + +/** + * The callback that contains the results from a lookup. + * - result is one of the DNS_ERR_* values (DNS_ERR_NONE for success) + * - type is either DNS_IPv4_A or DNS_PTR or DNS_IPv6_AAAA + * - count contains the number of addresses of form type + * - ttl is the number of seconds the resolution may be cached for. + * - addresses needs to be cast according to type. It will be an array of + * 4-byte sequences for ipv4, or an array of 16-byte sequences for ipv6, + * or a nul-terminated string for PTR. + */ +typedef void (*evdns_callback_type) (int result, char type, int count, int ttl, void *addresses, void *arg); + +struct evdns_base; +struct event_base; + +/** Flag for evdns_base_new: process resolv.conf. */ +#define EVDNS_BASE_INITIALIZE_NAMESERVERS 1 +/** Flag for evdns_base_new: Do not prevent the libevent event loop from + * exiting when we have no active dns requests. */ +#define EVDNS_BASE_DISABLE_WHEN_INACTIVE 0x8000 +/** Flag for evdns_base_new: If EVDNS_BASE_INITIALIZE_NAMESERVERS isset, do not + * add default nameserver if there are no nameservers in resolv.conf + * @see DNS_OPTION_NAMESERVERS_NO_DEFAULT */ +#define EVDNS_BASE_NAMESERVERS_NO_DEFAULT 0x10000 + +/** + Initialize the asynchronous DNS library. + + This function initializes support for non-blocking name resolution by + calling evdns_resolv_conf_parse() on UNIX and + evdns_config_windows_nameservers() on Windows. + + @param event_base the event base to associate the dns client with + @param flags any of EVDNS_BASE_INITIALIZE_NAMESERVERS| + EVDNS_BASE_DISABLE_WHEN_INACTIVE|EVDNS_BASE_NAMESERVERS_NO_DEFAULT + @return evdns_base object if successful, or NULL if an error occurred. + @see evdns_base_free() + */ +EVENT2_EXPORT_SYMBOL +struct evdns_base * evdns_base_new(struct event_base *event_base, int initialize_nameservers); + + +/** + Shut down the asynchronous DNS resolver and terminate all active requests. + + If the 'fail_requests' option is enabled, all active requests will return + an empty result with the error flag set to DNS_ERR_SHUTDOWN. Otherwise, + the requests will be silently discarded. + + @param evdns_base the evdns base to free + @param fail_requests if zero, active requests will be aborted; if non-zero, + active requests will return DNS_ERR_SHUTDOWN. + @see evdns_base_new() + */ +EVENT2_EXPORT_SYMBOL +void evdns_base_free(struct evdns_base *base, int fail_requests); + +/** + Remove all hosts entries that have been loaded into the event_base via + evdns_base_load_hosts or via event_base_resolv_conf_parse. + + @param evdns_base the evdns base to remove outdated host addresses from + */ +EVENT2_EXPORT_SYMBOL +void evdns_base_clear_host_addresses(struct evdns_base *base); + +/** + Convert a DNS error code to a string. + + @param err the DNS error code + @return a string containing an explanation of the error code +*/ +EVENT2_EXPORT_SYMBOL +const char *evdns_err_to_string(int err); + + +/** + Add a nameserver. + + The address should be an IPv4 address in network byte order. + The type of address is chosen so that it matches in_addr.s_addr. + + @param base the evdns_base to which to add the name server + @param address an IP address in network byte order + @return 0 if successful, or -1 if an error occurred + @see evdns_base_nameserver_ip_add() + */ +EVENT2_EXPORT_SYMBOL +int evdns_base_nameserver_add(struct evdns_base *base, + unsigned long int address); + +/** + Get the number of configured nameservers. + + This returns the number of configured nameservers (not necessarily the + number of running nameservers). This is useful for double-checking + whether our calls to the various nameserver configuration functions + have been successful. + + @param base the evdns_base to which to apply this operation + @return the number of configured nameservers + @see evdns_base_nameserver_add() + */ +EVENT2_EXPORT_SYMBOL +int evdns_base_count_nameservers(struct evdns_base *base); + +/** + Remove all configured nameservers, and suspend all pending resolves. + + Resolves will not necessarily be re-attempted until evdns_base_resume() is called. + + @param base the evdns_base to which to apply this operation + @return 0 if successful, or -1 if an error occurred + @see evdns_base_resume() + */ +EVENT2_EXPORT_SYMBOL +int evdns_base_clear_nameservers_and_suspend(struct evdns_base *base); + + +/** + Resume normal operation and continue any suspended resolve requests. + + Re-attempt resolves left in limbo after an earlier call to + evdns_base_clear_nameservers_and_suspend(). + + @param base the evdns_base to which to apply this operation + @return 0 if successful, or -1 if an error occurred + @see evdns_base_clear_nameservers_and_suspend() + */ +EVENT2_EXPORT_SYMBOL +int evdns_base_resume(struct evdns_base *base); + +/** + Add a nameserver by string address. + + This function parses a n IPv4 or IPv6 address from a string and adds it as a + nameserver. It supports the following formats: + - [IPv6Address]:port + - [IPv6Address] + - IPv6Address + - IPv4Address:port + - IPv4Address + + If no port is specified, it defaults to 53. + + @param base the evdns_base to which to apply this operation + @return 0 if successful, or -1 if an error occurred + @see evdns_base_nameserver_add() + */ +EVENT2_EXPORT_SYMBOL +int evdns_base_nameserver_ip_add(struct evdns_base *base, + const char *ip_as_string); + +/** + Add a nameserver by sockaddr. + **/ +EVENT2_EXPORT_SYMBOL +int +evdns_base_nameserver_sockaddr_add(struct evdns_base *base, + const struct sockaddr *sa, ev_socklen_t len, unsigned flags); + +struct evdns_request; + +/** + Lookup an A record for a given name. + + @param base the evdns_base to which to apply this operation + @param name a DNS hostname + @param flags either 0, or DNS_QUERY_NO_SEARCH to disable searching for this query. + @param callback a callback function to invoke when the request is completed + @param ptr an argument to pass to the callback function + @return an evdns_request object if successful, or NULL if an error occurred. + @see evdns_resolve_ipv6(), evdns_resolve_reverse(), evdns_resolve_reverse_ipv6(), evdns_cancel_request() + */ +EVENT2_EXPORT_SYMBOL +struct evdns_request *evdns_base_resolve_ipv4(struct evdns_base *base, const char *name, int flags, evdns_callback_type callback, void *ptr); + +/** + Lookup an AAAA record for a given name. + + @param base the evdns_base to which to apply this operation + @param name a DNS hostname + @param flags either 0, or DNS_QUERY_NO_SEARCH to disable searching for this query. + @param callback a callback function to invoke when the request is completed + @param ptr an argument to pass to the callback function + @return an evdns_request object if successful, or NULL if an error occurred. + @see evdns_resolve_ipv4(), evdns_resolve_reverse(), evdns_resolve_reverse_ipv6(), evdns_cancel_request() + */ +EVENT2_EXPORT_SYMBOL +struct evdns_request *evdns_base_resolve_ipv6(struct evdns_base *base, const char *name, int flags, evdns_callback_type callback, void *ptr); + +struct in_addr; +struct in6_addr; + +/** + Lookup a PTR record for a given IP address. + + @param base the evdns_base to which to apply this operation + @param in an IPv4 address + @param flags either 0, or DNS_QUERY_NO_SEARCH to disable searching for this query. + @param callback a callback function to invoke when the request is completed + @param ptr an argument to pass to the callback function + @return an evdns_request object if successful, or NULL if an error occurred. + @see evdns_resolve_reverse_ipv6(), evdns_cancel_request() + */ +EVENT2_EXPORT_SYMBOL +struct evdns_request *evdns_base_resolve_reverse(struct evdns_base *base, const struct in_addr *in, int flags, evdns_callback_type callback, void *ptr); + + +/** + Lookup a PTR record for a given IPv6 address. + + @param base the evdns_base to which to apply this operation + @param in an IPv6 address + @param flags either 0, or DNS_QUERY_NO_SEARCH to disable searching for this query. + @param callback a callback function to invoke when the request is completed + @param ptr an argument to pass to the callback function + @return an evdns_request object if successful, or NULL if an error occurred. + @see evdns_resolve_reverse_ipv6(), evdns_cancel_request() + */ +EVENT2_EXPORT_SYMBOL +struct evdns_request *evdns_base_resolve_reverse_ipv6(struct evdns_base *base, const struct in6_addr *in, int flags, evdns_callback_type callback, void *ptr); + +/** + Cancels a pending DNS resolution request. + + @param base the evdns_base that was used to make the request + @param req the evdns_request that was returned by calling a resolve function + @see evdns_base_resolve_ipv4(), evdns_base_resolve_ipv6, evdns_base_resolve_reverse +*/ +EVENT2_EXPORT_SYMBOL +void evdns_cancel_request(struct evdns_base *base, struct evdns_request *req); + +/** + Set the value of a configuration option. + + The currently available configuration options are: + + ndots, timeout, max-timeouts, max-inflight, attempts, randomize-case, + bind-to, initial-probe-timeout, getaddrinfo-allow-skew, + so-rcvbuf, so-sndbuf. + + In versions before Libevent 2.0.3-alpha, the option name needed to end with + a colon. + + @param base the evdns_base to which to apply this operation + @param option the name of the configuration option to be modified + @param val the value to be set + @return 0 if successful, or -1 if an error occurred + */ +EVENT2_EXPORT_SYMBOL +int evdns_base_set_option(struct evdns_base *base, const char *option, const char *val); + + +/** + Parse a resolv.conf file. + + The 'flags' parameter determines what information is parsed from the + resolv.conf file. See the man page for resolv.conf for the format of this + file. + + The following directives are not parsed from the file: sortlist, rotate, + no-check-names, inet6, debug. + + If this function encounters an error, the possible return values are: 1 = + failed to open file, 2 = failed to stat file, 3 = file too large, 4 = out of + memory, 5 = short read from file, 6 = no nameservers listed in the file + + @param base the evdns_base to which to apply this operation + @param flags any of DNS_OPTION_NAMESERVERS|DNS_OPTION_SEARCH|DNS_OPTION_MISC| + DNS_OPTION_HOSTSFILE|DNS_OPTIONS_ALL|DNS_OPTION_NAMESERVERS_NO_DEFAULT + @param filename the path to the resolv.conf file + @return 0 if successful, or various positive error codes if an error + occurred (see above) + @see resolv.conf(3), evdns_config_windows_nameservers() + */ +EVENT2_EXPORT_SYMBOL +int evdns_base_resolv_conf_parse(struct evdns_base *base, int flags, const char *const filename); + +/** + Load an /etc/hosts-style file from 'hosts_fname' into 'base'. + + If hosts_fname is NULL, add minimal entries for localhost, and nothing + else. + + Note that only evdns_getaddrinfo uses the /etc/hosts entries. + + This function does not replace previously loaded hosts entries; to do that, + call evdns_base_clear_host_addresses first. + + Return 0 on success, negative on failure. +*/ +EVENT2_EXPORT_SYMBOL +int evdns_base_load_hosts(struct evdns_base *base, const char *hosts_fname); + +#if defined(EVENT_IN_DOXYGEN_) || defined(_WIN32) +/** + Obtain nameserver information using the Windows API. + + Attempt to configure a set of nameservers based on platform settings on + a win32 host. Preferentially tries to use GetNetworkParams; if that fails, + looks in the registry. + + @return 0 if successful, or -1 if an error occurred + @see evdns_resolv_conf_parse() + */ +EVENT2_EXPORT_SYMBOL +int evdns_base_config_windows_nameservers(struct evdns_base *); +#define EVDNS_BASE_CONFIG_WINDOWS_NAMESERVERS_IMPLEMENTED +#endif + + +/** + Clear the list of search domains. + */ +EVENT2_EXPORT_SYMBOL +void evdns_base_search_clear(struct evdns_base *base); + + +/** + Add a domain to the list of search domains + + @param domain the domain to be added to the search list + */ +EVENT2_EXPORT_SYMBOL +void evdns_base_search_add(struct evdns_base *base, const char *domain); + + +/** + Set the 'ndots' parameter for searches. + + Sets the number of dots which, when found in a name, causes + the first query to be without any search domain. + + @param ndots the new ndots parameter + */ +EVENT2_EXPORT_SYMBOL +void evdns_base_search_ndots_set(struct evdns_base *base, const int ndots); + +/** + A callback that is invoked when a log message is generated + + @param is_warning indicates if the log message is a 'warning' + @param msg the content of the log message + */ +typedef void (*evdns_debug_log_fn_type)(int is_warning, const char *msg); + + +/** + Set the callback function to handle DNS log messages. If this + callback is not set, evdns log messages are handled with the regular + Libevent logging system. + + @param fn the callback to be invoked when a log message is generated + */ +EVENT2_EXPORT_SYMBOL +void evdns_set_log_fn(evdns_debug_log_fn_type fn); + +/** + Set a callback that will be invoked to generate transaction IDs. By + default, we pick transaction IDs based on the current clock time, which + is bad for security. + + @param fn the new callback, or NULL to use the default. + + NOTE: This function has no effect in Libevent 2.0.4-alpha and later, + since Libevent now provides its own secure RNG. + */ +EVENT2_EXPORT_SYMBOL +void evdns_set_transaction_id_fn(ev_uint16_t (*fn)(void)); + +/** + Set a callback used to generate random bytes. By default, we use + the same function as passed to evdns_set_transaction_id_fn to generate + bytes two at a time. If a function is provided here, it's also used + to generate transaction IDs. + + NOTE: This function has no effect in Libevent 2.0.4-alpha and later, + since Libevent now provides its own secure RNG. +*/ +EVENT2_EXPORT_SYMBOL +void evdns_set_random_bytes_fn(void (*fn)(char *, size_t)); + +/* + * Functions used to implement a DNS server. + */ + +struct evdns_server_request; +struct evdns_server_question; + +/** + A callback to implement a DNS server. The callback function receives a DNS + request. It should then optionally add a number of answers to the reply + using the evdns_server_request_add_*_reply functions, before calling either + evdns_server_request_respond to send the reply back, or + evdns_server_request_drop to decline to answer the request. + + @param req A newly received request + @param user_data A pointer that was passed to + evdns_add_server_port_with_base(). + */ +typedef void (*evdns_request_callback_fn_type)(struct evdns_server_request *, void *); +#define EVDNS_ANSWER_SECTION 0 +#define EVDNS_AUTHORITY_SECTION 1 +#define EVDNS_ADDITIONAL_SECTION 2 + +#define EVDNS_TYPE_A 1 +#define EVDNS_TYPE_NS 2 +#define EVDNS_TYPE_CNAME 5 +#define EVDNS_TYPE_SOA 6 +#define EVDNS_TYPE_PTR 12 +#define EVDNS_TYPE_MX 15 +#define EVDNS_TYPE_TXT 16 +#define EVDNS_TYPE_AAAA 28 + +#define EVDNS_QTYPE_AXFR 252 +#define EVDNS_QTYPE_ALL 255 + +#define EVDNS_CLASS_INET 1 + +/* flags that can be set in answers; as part of the err parameter */ +#define EVDNS_FLAGS_AA 0x400 +#define EVDNS_FLAGS_RD 0x080 + +/** Create a new DNS server port. + + @param base The event base to handle events for the server port. + @param socket A UDP socket to accept DNS requests. + @param flags Always 0 for now. + @param callback A function to invoke whenever we get a DNS request + on the socket. + @param user_data Data to pass to the callback. + @return an evdns_server_port structure for this server port or NULL if + an error occurred. + */ +EVENT2_EXPORT_SYMBOL +struct evdns_server_port *evdns_add_server_port_with_base(struct event_base *base, evutil_socket_t socket, int flags, evdns_request_callback_fn_type callback, void *user_data); +/** Close down a DNS server port, and free associated structures. */ +EVENT2_EXPORT_SYMBOL +void evdns_close_server_port(struct evdns_server_port *port); + +/** Sets some flags in a reply we're building. + Allows setting of the AA or RD flags + */ +EVENT2_EXPORT_SYMBOL +void evdns_server_request_set_flags(struct evdns_server_request *req, int flags); + +/* Functions to add an answer to an in-progress DNS reply. + */ +EVENT2_EXPORT_SYMBOL +int evdns_server_request_add_reply(struct evdns_server_request *req, int section, const char *name, int type, int dns_class, int ttl, int datalen, int is_name, const char *data); +EVENT2_EXPORT_SYMBOL +int evdns_server_request_add_a_reply(struct evdns_server_request *req, const char *name, int n, const void *addrs, int ttl); +EVENT2_EXPORT_SYMBOL +int evdns_server_request_add_aaaa_reply(struct evdns_server_request *req, const char *name, int n, const void *addrs, int ttl); +EVENT2_EXPORT_SYMBOL +int evdns_server_request_add_ptr_reply(struct evdns_server_request *req, struct in_addr *in, const char *inaddr_name, const char *hostname, int ttl); +EVENT2_EXPORT_SYMBOL +int evdns_server_request_add_cname_reply(struct evdns_server_request *req, const char *name, const char *cname, int ttl); + +/** + Send back a response to a DNS request, and free the request structure. +*/ +EVENT2_EXPORT_SYMBOL +int evdns_server_request_respond(struct evdns_server_request *req, int err); +/** + Free a DNS request without sending back a reply. +*/ +EVENT2_EXPORT_SYMBOL +int evdns_server_request_drop(struct evdns_server_request *req); +struct sockaddr; +/** + Get the address that made a DNS request. + */ +EVENT2_EXPORT_SYMBOL +int evdns_server_request_get_requesting_addr(struct evdns_server_request *req, struct sockaddr *sa, int addr_len); + +/** Callback for evdns_getaddrinfo. */ +typedef void (*evdns_getaddrinfo_cb)(int result, struct evutil_addrinfo *res, void *arg); + +struct evdns_base; +struct evdns_getaddrinfo_request; +/** Make a non-blocking getaddrinfo request using the dns_base in 'dns_base'. + * + * If we can answer the request immediately (with an error or not!), then we + * invoke cb immediately and return NULL. Otherwise we return + * an evdns_getaddrinfo_request and invoke cb later. + * + * When the callback is invoked, we pass as its first argument the error code + * that getaddrinfo would return (or 0 for no error). As its second argument, + * we pass the evutil_addrinfo structures we found (or NULL on error). We + * pass 'arg' as the third argument. + * + * Limitations: + * + * - The AI_V4MAPPED and AI_ALL flags are not currently implemented. + * - For ai_socktype, we only handle SOCKTYPE_STREAM, SOCKTYPE_UDP, and 0. + * - For ai_protocol, we only handle IPPROTO_TCP, IPPROTO_UDP, and 0. + */ +EVENT2_EXPORT_SYMBOL +struct evdns_getaddrinfo_request *evdns_getaddrinfo( + struct evdns_base *dns_base, + const char *nodename, const char *servname, + const struct evutil_addrinfo *hints_in, + evdns_getaddrinfo_cb cb, void *arg); + +/* Cancel an in-progress evdns_getaddrinfo. This MUST NOT be called after the + * getaddrinfo's callback has been invoked. The resolves will be canceled, + * and the callback will be invoked with the error EVUTIL_EAI_CANCEL. */ +EVENT2_EXPORT_SYMBOL +void evdns_getaddrinfo_cancel(struct evdns_getaddrinfo_request *req); + +/** + Retrieve the address of the 'idx'th configured nameserver. + + @param base The evdns_base to examine. + @param idx The index of the nameserver to get the address of. + @param sa A location to receive the server's address. + @param len The number of bytes available at sa. + + @return the number of bytes written into sa on success. On failure, returns + -1 if idx is greater than the number of configured nameservers, or a + value greater than 'len' if len was not high enough. + */ +EVENT2_EXPORT_SYMBOL +int evdns_base_get_nameserver_addr(struct evdns_base *base, int idx, + struct sockaddr *sa, ev_socklen_t len); + +#ifdef __cplusplus +} +#endif + +#endif /* !EVENT2_DNS_H_INCLUDED_ */ diff --git a/bsnes/thrift/libevent/include/event2/dns_compat.h b/bsnes/thrift/libevent/include/event2/dns_compat.h new file mode 100644 index 00000000..a58c4b29 --- /dev/null +++ b/bsnes/thrift/libevent/include/event2/dns_compat.h @@ -0,0 +1,358 @@ +/* + * Copyright (c) 2006-2007 Niels Provos + * Copyright (c) 2007-2012 Niels Provos and Nick Mathewson + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +#ifndef EVENT2_DNS_COMPAT_H_INCLUDED_ +#define EVENT2_DNS_COMPAT_H_INCLUDED_ + +/** @file event2/dns_compat.h + + Potentially non-threadsafe versions of the functions in dns.h: provided + only for backwards compatibility. + + + */ + +#ifdef __cplusplus +extern "C" { +#endif + +#include +#ifdef EVENT__HAVE_SYS_TYPES_H +#include +#endif +#ifdef EVENT__HAVE_SYS_TIME_H +#include +#endif + +/* For int types. */ +#include +#include + +/** + Initialize the asynchronous DNS library. + + This function initializes support for non-blocking name resolution by + calling evdns_resolv_conf_parse() on UNIX and + evdns_config_windows_nameservers() on Windows. + + @deprecated This function is deprecated because it always uses the current + event base, and is easily confused by multiple calls to event_init(), and + so is not safe for multithreaded use. Additionally, it allocates a global + structure that only one thread can use. The replacement is + evdns_base_new(). + + @return 0 if successful, or -1 if an error occurred + @see evdns_shutdown() + */ +EVENT2_EXPORT_SYMBOL +int evdns_init(void); + +struct evdns_base; +/** + Return the global evdns_base created by event_init() and used by the other + deprecated functions. + + @deprecated This function is deprecated because use of the global + evdns_base is error-prone. + */ +EVENT2_EXPORT_SYMBOL +struct evdns_base *evdns_get_global_base(void); + +/** + Shut down the asynchronous DNS resolver and terminate all active requests. + + If the 'fail_requests' option is enabled, all active requests will return + an empty result with the error flag set to DNS_ERR_SHUTDOWN. Otherwise, + the requests will be silently discarded. + + @deprecated This function is deprecated because it does not allow the + caller to specify which evdns_base it applies to. The recommended + function is evdns_base_shutdown(). + + @param fail_requests if zero, active requests will be aborted; if non-zero, + active requests will return DNS_ERR_SHUTDOWN. + @see evdns_init() + */ +EVENT2_EXPORT_SYMBOL +void evdns_shutdown(int fail_requests); + +/** + Add a nameserver. + + The address should be an IPv4 address in network byte order. + The type of address is chosen so that it matches in_addr.s_addr. + + @deprecated This function is deprecated because it does not allow the + caller to specify which evdns_base it applies to. The recommended + function is evdns_base_nameserver_add(). + + @param address an IP address in network byte order + @return 0 if successful, or -1 if an error occurred + @see evdns_nameserver_ip_add() + */ +EVENT2_EXPORT_SYMBOL +int evdns_nameserver_add(unsigned long int address); + +/** + Get the number of configured nameservers. + + This returns the number of configured nameservers (not necessarily the + number of running nameservers). This is useful for double-checking + whether our calls to the various nameserver configuration functions + have been successful. + + @deprecated This function is deprecated because it does not allow the + caller to specify which evdns_base it applies to. The recommended + function is evdns_base_count_nameservers(). + + @return the number of configured nameservers + @see evdns_nameserver_add() + */ +EVENT2_EXPORT_SYMBOL +int evdns_count_nameservers(void); + +/** + Remove all configured nameservers, and suspend all pending resolves. + + Resolves will not necessarily be re-attempted until evdns_resume() is called. + + @deprecated This function is deprecated because it does not allow the + caller to specify which evdns_base it applies to. The recommended + function is evdns_base_clear_nameservers_and_suspend(). + + @return 0 if successful, or -1 if an error occurred + @see evdns_resume() + */ +EVENT2_EXPORT_SYMBOL +int evdns_clear_nameservers_and_suspend(void); + +/** + Resume normal operation and continue any suspended resolve requests. + + Re-attempt resolves left in limbo after an earlier call to + evdns_clear_nameservers_and_suspend(). + + @deprecated This function is deprecated because it does not allow the + caller to specify which evdns_base it applies to. The recommended + function is evdns_base_resume(). + + @return 0 if successful, or -1 if an error occurred + @see evdns_clear_nameservers_and_suspend() + */ +EVENT2_EXPORT_SYMBOL +int evdns_resume(void); + +/** + Add a nameserver. + + This wraps the evdns_nameserver_add() function by parsing a string as an IP + address and adds it as a nameserver. + + @deprecated This function is deprecated because it does not allow the + caller to specify which evdns_base it applies to. The recommended + function is evdns_base_nameserver_ip_add(). + + @return 0 if successful, or -1 if an error occurred + @see evdns_nameserver_add() + */ +EVENT2_EXPORT_SYMBOL +int evdns_nameserver_ip_add(const char *ip_as_string); + +/** + Lookup an A record for a given name. + + @deprecated This function is deprecated because it does not allow the + caller to specify which evdns_base it applies to. The recommended + function is evdns_base_resolve_ipv4(). + + @param name a DNS hostname + @param flags either 0, or DNS_QUERY_NO_SEARCH to disable searching for this query. + @param callback a callback function to invoke when the request is completed + @param ptr an argument to pass to the callback function + @return 0 if successful, or -1 if an error occurred + @see evdns_resolve_ipv6(), evdns_resolve_reverse(), evdns_resolve_reverse_ipv6() + */ +EVENT2_EXPORT_SYMBOL +int evdns_resolve_ipv4(const char *name, int flags, evdns_callback_type callback, void *ptr); + +/** + Lookup an AAAA record for a given name. + + @param name a DNS hostname + @param flags either 0, or DNS_QUERY_NO_SEARCH to disable searching for this query. + @param callback a callback function to invoke when the request is completed + @param ptr an argument to pass to the callback function + @return 0 if successful, or -1 if an error occurred + @see evdns_resolve_ipv4(), evdns_resolve_reverse(), evdns_resolve_reverse_ipv6() + */ +EVENT2_EXPORT_SYMBOL +int evdns_resolve_ipv6(const char *name, int flags, evdns_callback_type callback, void *ptr); + +struct in_addr; +struct in6_addr; + +/** + Lookup a PTR record for a given IP address. + + @deprecated This function is deprecated because it does not allow the + caller to specify which evdns_base it applies to. The recommended + function is evdns_base_resolve_reverse(). + + @param in an IPv4 address + @param flags either 0, or DNS_QUERY_NO_SEARCH to disable searching for this query. + @param callback a callback function to invoke when the request is completed + @param ptr an argument to pass to the callback function + @return 0 if successful, or -1 if an error occurred + @see evdns_resolve_reverse_ipv6() + */ +EVENT2_EXPORT_SYMBOL +int evdns_resolve_reverse(const struct in_addr *in, int flags, evdns_callback_type callback, void *ptr); + +/** + Lookup a PTR record for a given IPv6 address. + + @deprecated This function is deprecated because it does not allow the + caller to specify which evdns_base it applies to. The recommended + function is evdns_base_resolve_reverse_ipv6(). + + @param in an IPv6 address + @param flags either 0, or DNS_QUERY_NO_SEARCH to disable searching for this query. + @param callback a callback function to invoke when the request is completed + @param ptr an argument to pass to the callback function + @return 0 if successful, or -1 if an error occurred + @see evdns_resolve_reverse_ipv6() + */ +EVENT2_EXPORT_SYMBOL +int evdns_resolve_reverse_ipv6(const struct in6_addr *in, int flags, evdns_callback_type callback, void *ptr); + +/** + Set the value of a configuration option. + + The currently available configuration options are: + + ndots, timeout, max-timeouts, max-inflight, and attempts + + @deprecated This function is deprecated because it does not allow the + caller to specify which evdns_base it applies to. The recommended + function is evdns_base_set_option(). + + @param option the name of the configuration option to be modified + @param val the value to be set + @param flags Ignored. + @return 0 if successful, or -1 if an error occurred + */ +EVENT2_EXPORT_SYMBOL +int evdns_set_option(const char *option, const char *val, int flags); + +/** + Parse a resolv.conf file. + + The 'flags' parameter determines what information is parsed from the + resolv.conf file. See the man page for resolv.conf for the format of this + file. + + The following directives are not parsed from the file: sortlist, rotate, + no-check-names, inet6, debug. + + If this function encounters an error, the possible return values are: 1 = + failed to open file, 2 = failed to stat file, 3 = file too large, 4 = out of + memory, 5 = short read from file, 6 = no nameservers listed in the file + + @deprecated This function is deprecated because it does not allow the + caller to specify which evdns_base it applies to. The recommended + function is evdns_base_resolv_conf_parse(). + + @param flags any of DNS_OPTION_NAMESERVERS|DNS_OPTION_SEARCH|DNS_OPTION_MISC| + DNS_OPTIONS_ALL + @param filename the path to the resolv.conf file + @return 0 if successful, or various positive error codes if an error + occurred (see above) + @see resolv.conf(3), evdns_config_windows_nameservers() + */ +EVENT2_EXPORT_SYMBOL +int evdns_resolv_conf_parse(int flags, const char *const filename); + +/** + Clear the list of search domains. + + @deprecated This function is deprecated because it does not allow the + caller to specify which evdns_base it applies to. The recommended + function is evdns_base_search_clear(). + */ +EVENT2_EXPORT_SYMBOL +void evdns_search_clear(void); + +/** + Add a domain to the list of search domains + + @deprecated This function is deprecated because it does not allow the + caller to specify which evdns_base it applies to. The recommended + function is evdns_base_search_add(). + + @param domain the domain to be added to the search list + */ +EVENT2_EXPORT_SYMBOL +void evdns_search_add(const char *domain); + +/** + Set the 'ndots' parameter for searches. + + Sets the number of dots which, when found in a name, causes + the first query to be without any search domain. + + @deprecated This function is deprecated because it does not allow the + caller to specify which evdns_base it applies to. The recommended + function is evdns_base_search_ndots_set(). + + @param ndots the new ndots parameter + */ +EVENT2_EXPORT_SYMBOL +void evdns_search_ndots_set(const int ndots); + +/** + As evdns_server_new_with_base. + + @deprecated This function is deprecated because it does not allow the + caller to specify which even_base it uses. The recommended + function is evdns_add_server_port_with_base(). + +*/ +EVENT2_EXPORT_SYMBOL +struct evdns_server_port * +evdns_add_server_port(evutil_socket_t socket, int flags, + evdns_request_callback_fn_type callback, void *user_data); + +#ifdef _WIN32 +EVENT2_EXPORT_SYMBOL +int evdns_config_windows_nameservers(void); +#define EVDNS_CONFIG_WINDOWS_NAMESERVERS_IMPLEMENTED +#endif + +#ifdef __cplusplus +} +#endif + +#endif /* EVENT2_EVENT_COMPAT_H_INCLUDED_ */ diff --git a/bsnes/thrift/libevent/include/event2/dns_struct.h b/bsnes/thrift/libevent/include/event2/dns_struct.h new file mode 100644 index 00000000..593a8a70 --- /dev/null +++ b/bsnes/thrift/libevent/include/event2/dns_struct.h @@ -0,0 +1,80 @@ +/* + * Copyright (c) 2000-2007 Niels Provos + * Copyright (c) 2007-2012 Niels Provos and Nick Mathewson + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +#ifndef EVENT2_DNS_STRUCT_H_INCLUDED_ +#define EVENT2_DNS_STRUCT_H_INCLUDED_ + +/** @file event2/dns_struct.h + + Data structures for dns. Using these structures may hurt forward + compatibility with later versions of Libevent: be careful! + + */ + +#ifdef __cplusplus +extern "C" { +#endif + +#include +#ifdef EVENT__HAVE_SYS_TYPES_H +#include +#endif +#ifdef EVENT__HAVE_SYS_TIME_H +#include +#endif + +/* For int types. */ +#include + +/* + * Structures used to implement a DNS server. + */ + +struct evdns_server_request { + int flags; + int nquestions; + struct evdns_server_question **questions; +}; +struct evdns_server_question { + int type; +#ifdef __cplusplus + int dns_question_class; +#else + /* You should refer to this field as "dns_question_class". The + * name "class" works in C for backward compatibility, and will be + * removed in a future version. (1.5 or later). */ + int class; +#define dns_question_class class +#endif + char name[1]; +}; + +#ifdef __cplusplus +} +#endif + +#endif /* EVENT2_DNS_STRUCT_H_INCLUDED_ */ + diff --git a/bsnes/thrift/libevent/include/event2/event-config.h b/bsnes/thrift/libevent/include/event2/event-config.h new file mode 100644 index 00000000..874e6829 --- /dev/null +++ b/bsnes/thrift/libevent/include/event2/event-config.h @@ -0,0 +1,513 @@ +/* event-config.h + * + * This file was generated by cmake when the makefiles were generated. + * + * DO NOT EDIT THIS FILE. + * + * Do not rely on macros in this file existing in later versions. + */ +#ifndef EVENT2_EVENT_CONFIG_H_INCLUDED_ +#define EVENT2_EVENT_CONFIG_H_INCLUDED_ + +/* Numeric representation of the version */ +#define EVENT__NUMERIC_VERSION 0x02010c00 +#define EVENT__PACKAGE_VERSION "2.1.12" + +#define EVENT__VERSION_MAJOR 2 +#define EVENT__VERSION_MINOR 1 +#define EVENT__VERSION_PATCH 12 + +/* Version number of package */ +#define EVENT__VERSION "2.1.12-stable" + +/* Name of package */ +#define EVENT__PACKAGE "libevent" + +/* Define to the address where bug reports for this package should be sent. */ +#define EVENT__PACKAGE_BUGREPORT "" + +/* Define to the full name of this package. */ +#define EVENT__PACKAGE_NAME "" + +/* Define to the full name and version of this package. */ +#define EVENT__PACKAGE_STRING "" + +/* Define to the one symbol short name of this package. */ +#define EVENT__PACKAGE_TARNAME "" + +/* Define if libevent should build without support for a debug mode */ +#define EVENT__DISABLE_DEBUG_MODE 1 + +/* Define if libevent should not allow replacing the mm functions */ +#define EVENT__DISABLE_MM_REPLACEMENT 1 + +/* Define if libevent should not be compiled with thread support */ +/* #undef EVENT__DISABLE_THREAD_SUPPORT */ + +/* Define to 1 if you have the `accept4' function. */ +/* #undef EVENT__HAVE_ACCEPT4 */ + +/* Define to 1 if you have the `arc4random' function. */ +/* #undef EVENT__HAVE_ARC4RANDOM */ + +/* Define to 1 if you have the `arc4random_buf' function. */ +/* #undef EVENT__HAVE_ARC4RANDOM_BUF */ + +/* Define to 1 if you have the `arc4random_addrandom' function. */ +/* #undef EVENT__HAVE_ARC4RANDOM_ADDRANDOM */ + +/* Define if clock_gettime is available in libc */ +/* #undef EVENT__DNS_USE_CPU_CLOCK_FOR_ID */ + +/* Define is no secure id variant is available */ +/* #undef EVENT__DNS_USE_GETTIMEOFDAY_FOR_ID */ +#define EVENT__DNS_USE_FTIME_FOR_ID 1 + +/* Define to 1 if you have the header file. */ +/* #undef EVENT__HAVE_ARPA_INET_H */ + +/* Define to 1 if you have the `clock_gettime' function. */ +/* #undef EVENT__HAVE_CLOCK_GETTIME */ + +/* Define to 1 if you have the declaration of `CTL_KERN'. */ +#define EVENT__HAVE_DECL_CTL_KERN 0 + +/* Define to 1 if you have the declaration of `KERN_ARND'. */ +#define EVENT__HAVE_DECL_KERN_ARND 0 + +/* Define to 1 if you have `getrandom' function. */ +/* #undef EVENT__HAVE_GETRANDOM */ + +/* Define if /dev/poll is available */ +/* #undef EVENT__HAVE_DEVPOLL */ + +/* Define to 1 if you have the header file. */ +/* #undef EVENT__HAVE_NETDB_H */ + +/* Define to 1 if fd_mask type is defined */ +/* #undef EVENT__HAVE_FD_MASK */ + +/* Define to 1 if the header file defines TAILQ_FOREACH. */ +/* #undef EVENT__HAVE_TAILQFOREACH */ + +/* Define to 1 if you have the header file. */ +/* #undef EVENT__HAVE_DLFCN_H */ + +/* Define if your system supports the epoll system calls */ +/* #undef EVENT__HAVE_EPOLL */ + +/* Define to 1 if you have the `epoll_create1' function. */ +/* #undef EVENT__HAVE_EPOLL_CREATE1 */ + +/* Define to 1 if you have the `epoll_ctl' function. */ +/* #undef EVENT__HAVE_EPOLL_CTL */ + +/* Define to 1 if you have the `eventfd' function. */ +/* #undef EVENT__HAVE_EVENTFD */ + +/* Define if your system supports event ports */ +/* #undef EVENT__HAVE_EVENT_PORTS */ + +/* Define to 1 if you have the `fcntl' function. */ +/* #undef EVENT__HAVE_FCNTL */ + +/* Define to 1 if you have the header file. */ +#define EVENT__HAVE_FCNTL_H 1 + +/* Define to 1 if you have the `getaddrinfo' function. */ +#define EVENT__HAVE_GETADDRINFO 1 + +/* Define to 1 if you have the `getegid' function. */ +/* #undef EVENT__HAVE_GETEGID */ + +/* Define to 1 if you have the `geteuid' function. */ +/* #undef EVENT__HAVE_GETEUID */ + +/* TODO: Check for different gethostname argument counts. CheckPrototypeDefinition.cmake can be used. */ +/* Define this if you have any gethostbyname_r() */ +/* #undef EVENT__HAVE_GETHOSTBYNAME_R */ + +/* Define this if gethostbyname_r takes 3 arguments */ +/* #undef EVENT__HAVE_GETHOSTBYNAME_R_3_ARG */ + +/* Define this if gethostbyname_r takes 5 arguments */ +/* #undef EVENT__HAVE_GETHOSTBYNAME_R_5_ARG */ + +/* Define this if gethostbyname_r takes 6 arguments */ +/* #undef EVENT__HAVE_GETHOSTBYNAME_R_6_ARG */ + +/* Define to 1 if you have the `getifaddrs' function. */ +/* #undef EVENT__HAVE_GETIFADDRS */ + +/* Define to 1 if you have the `getnameinfo' function. */ +#define EVENT__HAVE_GETNAMEINFO 1 + +/* Define to 1 if you have the `getprotobynumber' function. */ +#define EVENT__HAVE_GETPROTOBYNUMBER 1 + +/* Define to 1 if you have the `getservbyname' function. */ +#define EVENT__HAVE_GETSERVBYNAME 1 + +/* Define to 1 if you have the `gettimeofday' function. */ +/* #undef EVENT__HAVE_GETTIMEOFDAY */ + +/* Define to 1 if you have the header file. */ +/* #undef EVENT__HAVE_IFADDRS_H */ + +/* Define to 1 if you have the `inet_ntop' function. */ +/* #undef EVENT__HAVE_INET_NTOP */ + +/* Define to 1 if you have the `inet_pton' function. */ +/* #undef EVENT__HAVE_INET_PTON */ + +/* Define to 1 if you have the header file. */ +#define EVENT__HAVE_INTTYPES_H 1 + +/* Define to 1 if you have the `issetugid' function. */ +/* #undef EVENT__HAVE_ISSETUGID */ + +/* Define to 1 if you have the `kqueue' function. */ +/* #undef EVENT__HAVE_KQUEUE */ + +/* Define if the system has zlib */ +/* #undef EVENT__HAVE_LIBZ */ + +/* Define to 1 if you have the `mach_absolute_time' function. */ +/* #undef EVENT__HAVE_MACH_ABSOLUTE_TIME */ + +/* Define to 1 if you have the header file. */ +/* #undef EVENT__HAVE_MACH_MACH_TIME_H */ + +/* Define to 1 if you have the header file. */ +/* #undef EVENT__HAVE_MACH_MACH_H */ + +/* Define to 1 if you have the header file. */ +#define EVENT__HAVE_MEMORY_H 1 + +/* Define to 1 if you have the `mmap' function. */ +/* #undef EVENT__HAVE_MMAP */ + +/* Define to 1 if you have the `nanosleep' function. */ +/* #undef EVENT__HAVE_NANOSLEEP */ + +/* Define to 1 if you have the `usleep' function. */ +/* #undef EVENT__HAVE_USLEEP */ + +/* Define to 1 if you have the header file. */ +/* #undef EVENT__HAVE_NETINET_IN6_H */ + +/* Define to 1 if you have the header file. */ +/* #undef EVENT__HAVE_NETINET_IN_H */ + +/* Define to 1 if you have the header file. */ +/* #undef EVENT__HAVE_NETINET_TCP_H */ + +/* Define to 1 if you have the header file. */ +/* #undef EVENT__HAVE_SYS_UN_H */ + +/* Define to 1 if you have the header file. */ +#define EVENT__HAVE_AFUNIX_H 1 + +/* Define if the system has openssl */ +/* #undef EVENT__HAVE_OPENSSL */ + +/* Define to 1 if you have the `pipe' function. */ +/* #undef EVENT__HAVE_PIPE */ + +/* Define to 1 if you have the `pipe2' function. */ +/* #undef EVENT__HAVE_PIPE2 */ + +/* Define to 1 if you have the `poll' function. */ +/* #undef EVENT__HAVE_POLL */ + +/* Define to 1 if you have the header file. */ +/* #undef EVENT__HAVE_POLL_H */ + +/* Define to 1 if you have the `port_create' function. */ +/* #undef EVENT__HAVE_PORT_CREATE */ + +/* Define to 1 if you have the header file. */ +/* #undef EVENT__HAVE_PORT_H */ + +/* Define if we have pthreads on this system */ +/* #undef EVENT__HAVE_PTHREADS */ + +/* Define to 1 if you have the `putenv' function. */ +#define EVENT__HAVE_PUTENV 1 + +/* Define to 1 if the system has the type `sa_family_t'. */ +/* #undef EVENT__HAVE_SA_FAMILY_T */ + +/* Define to 1 if you have the `select' function. */ +/* #undef EVENT__HAVE_SELECT */ + +/* Define to 1 if you have the `setenv' function. */ +/* #undef EVENT__HAVE_SETENV */ + +/* Define if F_SETFD is defined in */ +/* #undef EVENT__HAVE_SETFD */ + +/* Define to 1 if you have the `setrlimit' function. */ +/* #undef EVENT__HAVE_SETRLIMIT */ + +/* Define to 1 if you have the `sendfile' function. */ +/* #undef EVENT__HAVE_SENDFILE */ + +/* Define to 1 if you have the `sigaction' function. */ +/* #undef EVENT__HAVE_SIGACTION */ + +/* Define to 1 if you have the `signal' function. */ +#define EVENT__HAVE_SIGNAL 1 + +/* Define to 1 if you have the `splice' function. */ +/* #undef EVENT__HAVE_SPLICE */ + +/* Define to 1 if you have the header file. */ +#define EVENT__HAVE_STDARG_H 1 + +/* Define to 1 if you have the header file. */ +#define EVENT__HAVE_STDDEF_H 1 + +/* Define to 1 if you have the header file. */ +#define EVENT__HAVE_STDINT_H 1 + +/* Define to 1 if you have the header file. */ +#define EVENT__HAVE_STDLIB_H 1 + +/* Define to 1 if you have the header file. */ +#define EVENT__HAVE_STRING_H 1 + +/* Define to 1 if you have the `strlcpy' function. */ +/* #undef EVENT__HAVE_STRLCPY */ + +/* Define to 1 if you have the `strsep' function. */ +/* #undef EVENT__HAVE_STRSEP */ + +/* Define to 1 if you have the `strtok_r' function. */ +/* #undef EVENT__HAVE_STRTOK_R */ + +/* Define to 1 if you have the `strtoll' function. */ +#define EVENT__HAVE_STRTOLL 1 + +/* Define to 1 if you have the `_gmtime64_s' function. */ +#define EVENT__HAVE__GMTIME64_S 1 + +/* Define to 1 if you have the `_gmtime64' function. */ +#define EVENT__HAVE__GMTIME64 1 + +/* Define to 1 if the system has the type `struct addrinfo'. */ +#define EVENT__HAVE_STRUCT_ADDRINFO 1 + +/* Define to 1 if the system has the type `struct in6_addr'. */ +#define EVENT__HAVE_STRUCT_IN6_ADDR 1 + +/* Define to 1 if `s6_addr16' is member of `struct in6_addr'. */ +/* #undef EVENT__HAVE_STRUCT_IN6_ADDR_S6_ADDR16 */ + +/* Define to 1 if `s6_addr32' is member of `struct in6_addr'. */ +/* #undef EVENT__HAVE_STRUCT_IN6_ADDR_S6_ADDR32 */ + +/* Define to 1 if the system has the type `struct sockaddr_in6'. */ +#define EVENT__HAVE_STRUCT_SOCKADDR_IN6 1 + +/* Define to 1 if `sin6_len' is member of `struct sockaddr_in6'. */ +/* #undef EVENT__HAVE_STRUCT_SOCKADDR_IN6_SIN6_LEN */ + +/* Define to 1 if `sin_len' is member of `struct sockaddr_in'. */ +/* #undef EVENT__HAVE_STRUCT_SOCKADDR_IN_SIN_LEN */ + +/* Define to 1 if the system has the type `struct sockaddr_un'. */ +#define EVENT__HAVE_STRUCT_SOCKADDR_UN 1 + +/* Define to 1 if the system has the type `struct sockaddr_storage'. */ +#define EVENT__HAVE_STRUCT_SOCKADDR_STORAGE 1 + +/* Define to 1 if `ss_family' is a member of `struct sockaddr_storage'. */ +#define EVENT__HAVE_STRUCT_SOCKADDR_STORAGE_SS_FAMILY 1 + +/* Define to 1 if `__ss_family' is a member of `struct sockaddr_storage'. */ +/* #undef EVENT__HAVE_STRUCT_SOCKADDR_STORAGE___SS_FAMILY */ + +/* Define to 1 if the system has the type `struct linger'. */ +#define EVENT__HAVE_STRUCT_LINGER 1 + +/* Define to 1 if you have the `sysctl' function. */ +/* #undef EVENT__HAVE_SYSCTL */ + +/* Define to 1 if you have the header file. */ +/* #undef EVENT__HAVE_SYS_EPOLL_H */ + +/* Define to 1 if you have the header file. */ +/* #undef EVENT__HAVE_SYS_EVENTFD_H */ + +/* Define to 1 if you have the header file. */ +/* #undef EVENT__HAVE_SYS_EVENT_H */ + +/* Define to 1 if you have the header file. */ +/* #undef EVENT__HAVE_SYS_IOCTL_H */ + +/* Define to 1 if you have the header file. */ +/* #undef EVENT__HAVE_SYS_MMAN_H */ + +/* Define to 1 if you have the header file. */ +/* #undef EVENT__HAVE_SYS_PARAM_H */ + +/* Define to 1 if you have the header file. */ +/* #undef EVENT__HAVE_SYS_QUEUE_H */ + +/* Define to 1 if you have the header file. */ +/* #undef EVENT__HAVE_SYS_RESOURCE_H */ + +/* Define to 1 if you have the header file. */ +/* #undef EVENT__HAVE_SYS_SELECT_H */ + +/* Define to 1 if you have the header file. */ +/* #undef EVENT__HAVE_SYS_SENDFILE_H */ + +/* Define to 1 if you have the header file. */ +/* #undef EVENT__HAVE_SYS_SOCKET_H */ + +/* Define to 1 if you have the header file. */ +#define EVENT__HAVE_SYS_STAT_H 1 + +/* Define to 1 if you have the header file. */ +/* #undef EVENT__HAVE_SYS_RANDOM_H */ + +/* Define to 1 if you have the header file. */ +/* #undef EVENT__HAVE_SYS_SYSCTL_H */ + +/* Define to 1 if you have the header file. */ +/* #undef EVENT__HAVE_SYS_TIMERFD_H */ + +/* Define to 1 if you have the header file. */ +/* #undef EVENT__HAVE_SYS_TIME_H */ + +/* Define to 1 if you have the header file. */ +#define EVENT__HAVE_SYS_TYPES_H 1 + +/* Define to 1 if you have the header file. */ +/* #undef EVENT__HAVE_SYS_UIO_H */ + +/* Define to 1 if you have the header file. */ +/* #undef EVENT__HAVE_SYS_WAIT_H */ + +/* Define to 1 if you have the header file. */ +#define EVENT__HAVE_ERRNO_H 1 + +/* Define if TAILQ_FOREACH is defined in */ +/* #undef EVENT__HAVE_TAILQFOREACH */ + +/* Define if timeradd is defined in */ +/* #undef EVENT__HAVE_TIMERADD */ + +/* Define if timerclear is defined in */ +#define EVENT__HAVE_TIMERCLEAR 1 + +/* Define if timercmp is defined in */ +#define EVENT__HAVE_TIMERCMP 1 + + +/* Define to 1 if you have the `timerfd_create' function. */ +/* #undef EVENT__HAVE_TIMERFD_CREATE */ + +/* Define if timerisset is defined in */ +#define EVENT__HAVE_TIMERISSET 1 + +/* Define to 1 if the system has the type `uint8_t'. */ +#define EVENT__HAVE_UINT8_T 1 + +/* Define to 1 if the system has the type `uint16_t'. */ +#define EVENT__HAVE_UINT16_T 1 + +/* Define to 1 if the system has the type `uint32_t'. */ +#define EVENT__HAVE_UINT32_T 1 + +/* Define to 1 if the system has the type `uint64_t'. */ +#define EVENT__HAVE_UINT64_T 1 + +/* Define to 1 if the system has the type `uintptr_t'. */ +#define EVENT__HAVE_UINTPTR_T 1 + +/* Define to 1 if you have the `umask' function. */ +#define EVENT__HAVE_UMASK 1 + +/* Define to 1 if you have the header file. */ +/* #undef EVENT__HAVE_UNISTD_H */ + +/* Define to 1 if you have the `unsetenv' function. */ +/* #undef EVENT__HAVE_UNSETENV */ + +/* Define to 1 if you have the `vasprintf' function. */ +/* #undef EVENT__HAVE_VASPRINTF */ + +/* Define if kqueue works correctly with pipes */ +/* #undef EVENT__HAVE_WORKING_KQUEUE */ + +#ifdef __USE_UNUSED_DEFINITIONS__ +/* Define to necessary symbol if this constant uses a non-standard name on your system. */ +/* XXX: Hello, this isn't even used, nor is it defined anywhere... - Ellzey */ +#define EVENT__PTHREAD_CREATE_JOINABLE +#endif + +/* The size of `pthread_t', as computed by sizeof. */ +#define EVENT__SIZEOF_PTHREAD_T + +/* The size of a `int', as computed by sizeof. */ +#define EVENT__SIZEOF_INT 4 + +/* The size of a `long', as computed by sizeof. */ +#define EVENT__SIZEOF_LONG 4 + +/* The size of a `long long', as computed by sizeof. */ +#define EVENT__SIZEOF_LONG_LONG 8 + +/* The size of `off_t', as computed by sizeof. */ +#define EVENT__SIZEOF_OFF_T 4 + +#define EVENT__SIZEOF_SSIZE_T 8 + + +/* The size of a `short', as computed by sizeof. */ +#define EVENT__SIZEOF_SHORT 2 + +/* The size of `size_t', as computed by sizeof. */ +#define EVENT__SIZEOF_SIZE_T 8 + +/* Define to 1 if you can safely include both and . */ +/* #undef EVENT__TIME_WITH_SYS_TIME */ + +/* The size of `socklen_t', as computed by sizeof. */ +#define EVENT__SIZEOF_SOCKLEN_T 4 + +/* The size of 'void *', as computer by sizeof */ +#define EVENT__SIZEOF_VOID_P 8 + +/* Define to `__inline__' or `__inline' if that's what the C compiler + calls it, or to nothing if 'inline' is not supported under any name. */ +#ifndef __cplusplus +/* why not c++? + * + * and are we really expected to use EVENT__inline everywhere, + * shouldn't we just do: + * ifdef EVENT__inline + * define inline EVENT__inline + * + * - Ellzey + */ + +#define EVENT__inline inline +#endif + +#define EVENT__HAVE___func__ 1 +#define EVENT__HAVE___FUNCTION__ 1 + +/* Define to `unsigned' if does not define. */ +#define EVENT__size_t size_t + +/* Define to unsigned int if you dont have it */ +#define EVENT__socklen_t socklen_t + +/* Define to `int' if does not define. */ +#define EVENT__ssize_t SSIZE_T + +#endif /* \EVENT2_EVENT_CONFIG_H_INCLUDED_ */ diff --git a/bsnes/thrift/libevent/include/event2/event.h b/bsnes/thrift/libevent/include/event2/event.h new file mode 100644 index 00000000..a6b6144a --- /dev/null +++ b/bsnes/thrift/libevent/include/event2/event.h @@ -0,0 +1,1672 @@ +/* + * Copyright (c) 2000-2007 Niels Provos + * Copyright (c) 2007-2012 Niels Provos and Nick Mathewson + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +#ifndef EVENT2_EVENT_H_INCLUDED_ +#define EVENT2_EVENT_H_INCLUDED_ + +/** + @mainpage + + @section intro Introduction + + Libevent is an event notification library for developing scalable network + servers. The Libevent API provides a mechanism to execute a callback + function when a specific event occurs on a file descriptor or after a + timeout has been reached. Furthermore, Libevent also support callbacks due + to signals or regular timeouts. + + Libevent is meant to replace the event loop found in event driven network + servers. An application just needs to call event_base_dispatch() and then add or + remove events dynamically without having to change the event loop. + + + Currently, Libevent supports /dev/poll, kqueue(2), select(2), poll(2), + epoll(4), and evports. The internal event mechanism is completely + independent of the exposed event API, and a simple update of Libevent can + provide new functionality without having to redesign the applications. As a + result, Libevent allows for portable application development and provides + the most scalable event notification mechanism available on an operating + system. Libevent can also be used for multithreaded programs. Libevent + should compile on Linux, *BSD, Mac OS X, Solaris and, Windows. + + @section usage Standard usage + + Every program that uses Libevent must include the + header, and pass the -levent flag to the linker. (You can instead link + -levent_core if you only want the main event and buffered IO-based code, + and don't want to link any protocol code.) + + @section setup Library setup + + Before you call any other Libevent functions, you need to set up the + library. If you're going to use Libevent from multiple threads in a + multithreaded application, you need to initialize thread support -- + typically by using evthread_use_pthreads() or + evthread_use_windows_threads(). See for more + information. + + This is also the point where you can replace Libevent's memory + management functions with event_set_mem_functions, and enable debug mode + with event_enable_debug_mode(). + + @section base Creating an event base + + Next, you need to create an event_base structure, using event_base_new() + or event_base_new_with_config(). The event_base is responsible for + keeping track of which events are "pending" (that is to say, being + watched to see if they become active) and which events are "active". + Every event is associated with a single event_base. + + @section event Event notification + + For each file descriptor that you wish to monitor, you must create an + event structure with event_new(). (You may also declare an event + structure and call event_assign() to initialize the members of the + structure.) To enable notification, you add the structure to the list + of monitored events by calling event_add(). The event structure must + remain allocated as long as it is active, so it should generally be + allocated on the heap. + + @section loop Dispatching events. + + Finally, you call event_base_dispatch() to loop and dispatch events. + You can also use event_base_loop() for more fine-grained control. + + Currently, only one thread can be dispatching a given event_base at a + time. If you want to run events in multiple threads at once, you can + either have a single event_base whose events add work to a work queue, + or you can create multiple event_base objects. + + @section bufferevent I/O Buffers + + Libevent provides a buffered I/O abstraction on top of the regular event + callbacks. This abstraction is called a bufferevent. A bufferevent + provides input and output buffers that get filled and drained + automatically. The user of a buffered event no longer deals directly + with the I/O, but instead is reading from input and writing to output + buffers. + + Once initialized via bufferevent_socket_new(), the bufferevent structure + can be used repeatedly with bufferevent_enable() and + bufferevent_disable(). Instead of reading and writing directly to a + socket, you would call bufferevent_read() and bufferevent_write(). + + When read enabled the bufferevent will try to read from the file descriptor + and call the read callback. The write callback is executed whenever the + output buffer is drained below the write low watermark, which is 0 by + default. + + See for more information. + + @section timers Timers + + Libevent can also be used to create timers that invoke a callback after a + certain amount of time has expired. The evtimer_new() macro returns + an event struct to use as a timer. To activate the timer, call + evtimer_add(). Timers can be deactivated by calling evtimer_del(). + (These macros are thin wrappers around event_new(), event_add(), + and event_del(); you can also use those instead.) + + @section evdns Asynchronous DNS resolution + + Libevent provides an asynchronous DNS resolver that should be used instead + of the standard DNS resolver functions. See the + functions for more detail. + + @section evhttp Event-driven HTTP servers + + Libevent provides a very simple event-driven HTTP server that can be + embedded in your program and used to service HTTP requests. + + To use this capability, you need to include the header in your + program. See that header for more information. + + @section evrpc A framework for RPC servers and clients + + Libevent provides a framework for creating RPC servers and clients. It + takes care of marshaling and unmarshaling all data structures. + + @section api API Reference + + To browse the complete documentation of the libevent API, click on any of + the following links. + + event2/event.h + The primary libevent header + + event2/thread.h + Functions for use by multithreaded programs + + event2/buffer.h and event2/bufferevent.h + Buffer management for network reading and writing + + event2/util.h + Utility functions for portable nonblocking network code + + event2/dns.h + Asynchronous DNS resolution + + event2/http.h + An embedded libevent-based HTTP server + + event2/rpc.h + A framework for creating RPC servers and clients + + */ + +/** @file event2/event.h + + Core functions for waiting for and receiving events, and using event bases. +*/ + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +#include +#ifdef EVENT__HAVE_SYS_TYPES_H +#include +#endif +#ifdef EVENT__HAVE_SYS_TIME_H +#include +#endif + +#include + +/* For int types. */ +#include + +/** + * Structure to hold information and state for a Libevent dispatch loop. + * + * The event_base lies at the center of Libevent; every application will + * have one. It keeps track of all pending and active events, and + * notifies your application of the active ones. + * + * This is an opaque structure; you can allocate one using + * event_base_new() or event_base_new_with_config(). + * + * @see event_base_new(), event_base_free(), event_base_loop(), + * event_base_new_with_config() + */ +struct event_base +#ifdef EVENT_IN_DOXYGEN_ +{/*Empty body so that doxygen will generate documentation here.*/} +#endif +; + +/** + * @struct event + * + * Structure to represent a single event. + * + * An event can have some underlying condition it represents: a socket + * becoming readable or writeable (or both), or a signal becoming raised. + * (An event that represents no underlying condition is still useful: you + * can use one to implement a timer, or to communicate between threads.) + * + * Generally, you can create events with event_new(), then make them + * pending with event_add(). As your event_base runs, it will run the + * callbacks of an events whose conditions are triggered. When you no + * longer want the event, free it with event_free(). + * + * In more depth: + * + * An event may be "pending" (one whose condition we are watching), + * "active" (one whose condition has triggered and whose callback is about + * to run), neither, or both. Events come into existence via + * event_assign() or event_new(), and are then neither active nor pending. + * + * To make an event pending, pass it to event_add(). When doing so, you + * can also set a timeout for the event. + * + * Events become active during an event_base_loop() call when either their + * condition has triggered, or when their timeout has elapsed. You can + * also activate an event manually using event_active(). The even_base + * loop will run the callbacks of active events; after it has done so, it + * marks them as no longer active. + * + * You can make an event non-pending by passing it to event_del(). This + * also makes the event non-active. + * + * Events can be "persistent" or "non-persistent". A non-persistent event + * becomes non-pending as soon as it is triggered: thus, it only runs at + * most once per call to event_add(). A persistent event remains pending + * even when it becomes active: you'll need to event_del() it manually in + * order to make it non-pending. When a persistent event with a timeout + * becomes active, its timeout is reset: this means you can use persistent + * events to implement periodic timeouts. + * + * This should be treated as an opaque structure; you should never read or + * write any of its fields directly. For backward compatibility with old + * code, it is defined in the event2/event_struct.h header; including this + * header may make your code incompatible with other versions of Libevent. + * + * @see event_new(), event_free(), event_assign(), event_get_assignment(), + * event_add(), event_del(), event_active(), event_pending(), + * event_get_fd(), event_get_base(), event_get_events(), + * event_get_callback(), event_get_callback_arg(), + * event_priority_set() + */ +struct event +#ifdef EVENT_IN_DOXYGEN_ +{/*Empty body so that doxygen will generate documentation here.*/} +#endif +; + +/** + * Configuration for an event_base. + * + * There are many options that can be used to alter the behavior and + * implementation of an event_base. To avoid having to pass them all in a + * complex many-argument constructor, we provide an abstract data type + * where you set up configuration information before passing it to + * event_base_new_with_config(). + * + * @see event_config_new(), event_config_free(), event_base_new_with_config(), + * event_config_avoid_method(), event_config_require_features(), + * event_config_set_flag(), event_config_set_num_cpus_hint() + */ +struct event_config +#ifdef EVENT_IN_DOXYGEN_ +{/*Empty body so that doxygen will generate documentation here.*/} +#endif +; + +/** + * Enable some relatively expensive debugging checks in Libevent that + * would normally be turned off. Generally, these checks cause code that + * would otherwise crash mysteriously to fail earlier with an assertion + * failure. Note that this method MUST be called before any events or + * event_bases have been created. + * + * Debug mode can currently catch the following errors: + * An event is re-assigned while it is added + * Any function is called on a non-assigned event + * + * Note that debugging mode uses memory to track every event that has been + * initialized (via event_assign, event_set, or event_new) but not yet + * released (via event_free or event_debug_unassign). If you want to use + * debug mode, and you find yourself running out of memory, you will need + * to use event_debug_unassign to explicitly stop tracking events that + * are no longer considered set-up. + * + * @see event_debug_unassign() + */ +EVENT2_EXPORT_SYMBOL +void event_enable_debug_mode(void); + +/** + * When debugging mode is enabled, informs Libevent that an event should no + * longer be considered as assigned. When debugging mode is not enabled, does + * nothing. + * + * This function must only be called on a non-added event. + * + * @see event_enable_debug_mode() + */ +EVENT2_EXPORT_SYMBOL +void event_debug_unassign(struct event *); + +/** + * Create and return a new event_base to use with the rest of Libevent. + * + * @return a new event_base on success, or NULL on failure. + * + * @see event_base_free(), event_base_new_with_config() + */ +EVENT2_EXPORT_SYMBOL +struct event_base *event_base_new(void); + +/** + Reinitialize the event base after a fork + + Some event mechanisms do not survive across fork. The event base needs + to be reinitialized with the event_reinit() function. + + @param base the event base that needs to be re-initialized + @return 0 if successful, or -1 if some events could not be re-added. + @see event_base_new() +*/ +EVENT2_EXPORT_SYMBOL +int event_reinit(struct event_base *base); + +/** + Event dispatching loop + + This loop will run the event base until either there are no more pending or + active, or until something calls event_base_loopbreak() or + event_base_loopexit(). + + @param base the event_base structure returned by event_base_new() or + event_base_new_with_config() + @return 0 if successful, -1 if an error occurred, or 1 if we exited because + no events were pending or active. + @see event_base_loop() + */ +EVENT2_EXPORT_SYMBOL +int event_base_dispatch(struct event_base *); + +/** + Get the kernel event notification mechanism used by Libevent. + + @param eb the event_base structure returned by event_base_new() + @return a string identifying the kernel event mechanism (kqueue, epoll, etc.) + */ +EVENT2_EXPORT_SYMBOL +const char *event_base_get_method(const struct event_base *); + +/** + Gets all event notification mechanisms supported by Libevent. + + This functions returns the event mechanism in order preferred by + Libevent. Note that this list will include all backends that + Libevent has compiled-in support for, and will not necessarily check + your OS to see whether it has the required resources. + + @return an array with pointers to the names of support methods. + The end of the array is indicated by a NULL pointer. If an + error is encountered NULL is returned. +*/ +EVENT2_EXPORT_SYMBOL +const char **event_get_supported_methods(void); + +/** Query the current monotonic time from a the timer for a struct + * event_base. + */ +EVENT2_EXPORT_SYMBOL +int event_gettime_monotonic(struct event_base *base, struct timeval *tp); + +/** + @name event type flag + + Flags to pass to event_base_get_num_events() to specify the kinds of events + we want to aggregate counts for +*/ +/**@{*/ +/** count the number of active events, which have been triggered.*/ +#define EVENT_BASE_COUNT_ACTIVE 1U +/** count the number of virtual events, which is used to represent an internal + * condition, other than a pending event, that keeps the loop from exiting. */ +#define EVENT_BASE_COUNT_VIRTUAL 2U +/** count the number of events which have been added to event base, including + * internal events. */ +#define EVENT_BASE_COUNT_ADDED 4U +/**@}*/ + +/** + Gets the number of events in event_base, as specified in the flags. + + Since event base has some internal events added to make some of its + functionalities work, EVENT_BASE_COUNT_ADDED may return more than the + number of events you added using event_add(). + + If you pass EVENT_BASE_COUNT_ACTIVE and EVENT_BASE_COUNT_ADDED together, an + active event will be counted twice. However, this might not be the case in + future libevent versions. The return value is an indication of the work + load, but the user shouldn't rely on the exact value as this may change in + the future. + + @param eb the event_base structure returned by event_base_new() + @param flags a bitwise combination of the kinds of events to aggregate + counts for + @return the number of events specified in the flags +*/ +EVENT2_EXPORT_SYMBOL +int event_base_get_num_events(struct event_base *, unsigned int); + +/** + Get the maximum number of events in a given event_base as specified in the + flags. + + @param eb the event_base structure returned by event_base_new() + @param flags a bitwise combination of the kinds of events to aggregate + counts for + @param clear option used to reset the maximum count. + @return the number of events specified in the flags + */ +EVENT2_EXPORT_SYMBOL +int event_base_get_max_events(struct event_base *, unsigned int, int); + +/** + Allocates a new event configuration object. + + The event configuration object can be used to change the behavior of + an event base. + + @return an event_config object that can be used to store configuration, or + NULL if an error is encountered. + @see event_base_new_with_config(), event_config_free(), event_config +*/ +EVENT2_EXPORT_SYMBOL +struct event_config *event_config_new(void); + +/** + Deallocates all memory associated with an event configuration object + + @param cfg the event configuration object to be freed. +*/ +EVENT2_EXPORT_SYMBOL +void event_config_free(struct event_config *cfg); + +/** + Enters an event method that should be avoided into the configuration. + + This can be used to avoid event mechanisms that do not support certain + file descriptor types, or for debugging to avoid certain event + mechanisms. An application can make use of multiple event bases to + accommodate incompatible file descriptor types. + + @param cfg the event configuration object + @param method the name of the event method to avoid + @return 0 on success, -1 on failure. +*/ +EVENT2_EXPORT_SYMBOL +int event_config_avoid_method(struct event_config *cfg, const char *method); + +/** + A flag used to describe which features an event_base (must) provide. + + Because of OS limitations, not every Libevent backend supports every + possible feature. You can use this type with + event_config_require_features() to tell Libevent to only proceed if your + event_base implements a given feature, and you can receive this type from + event_base_get_features() to see which features are available. +*/ +enum event_method_feature { + /** Require an event method that allows edge-triggered events with EV_ET. */ + EV_FEATURE_ET = 0x01, + /** Require an event method where having one event triggered among + * many is [approximately] an O(1) operation. This excludes (for + * example) select and poll, which are approximately O(N) for N + * equal to the total number of possible events. */ + EV_FEATURE_O1 = 0x02, + /** Require an event method that allows file descriptors as well as + * sockets. */ + EV_FEATURE_FDS = 0x04, + /** Require an event method that allows you to use EV_CLOSED to detect + * connection close without the necessity of reading all the pending data. + * + * Methods that do support EV_CLOSED may not be able to provide support on + * all kernel versions. + **/ + EV_FEATURE_EARLY_CLOSE = 0x08 +}; + +/** + A flag passed to event_config_set_flag(). + + These flags change the behavior of an allocated event_base. + + @see event_config_set_flag(), event_base_new_with_config(), + event_method_feature + */ +enum event_base_config_flag { + /** Do not allocate a lock for the event base, even if we have + locking set up. + + Setting this option will make it unsafe and nonfunctional to call + functions on the base concurrently from multiple threads. + */ + EVENT_BASE_FLAG_NOLOCK = 0x01, + /** Do not check the EVENT_* environment variables when configuring + an event_base */ + EVENT_BASE_FLAG_IGNORE_ENV = 0x02, + /** Windows only: enable the IOCP dispatcher at startup + + If this flag is set then bufferevent_socket_new() and + evconn_listener_new() will use IOCP-backed implementations + instead of the usual select-based one on Windows. + */ + EVENT_BASE_FLAG_STARTUP_IOCP = 0x04, + /** Instead of checking the current time every time the event loop is + ready to run timeout callbacks, check after each timeout callback. + */ + EVENT_BASE_FLAG_NO_CACHE_TIME = 0x08, + + /** If we are using the epoll backend, this flag says that it is + safe to use Libevent's internal change-list code to batch up + adds and deletes in order to try to do as few syscalls as + possible. Setting this flag can make your code run faster, but + it may trigger a Linux bug: it is not safe to use this flag + if you have any fds cloned by dup() or its variants. Doing so + will produce strange and hard-to-diagnose bugs. + + This flag can also be activated by setting the + EVENT_EPOLL_USE_CHANGELIST environment variable. + + This flag has no effect if you wind up using a backend other than + epoll. + */ + EVENT_BASE_FLAG_EPOLL_USE_CHANGELIST = 0x10, + + /** Ordinarily, Libevent implements its time and timeout code using + the fastest monotonic timer that we have. If this flag is set, + however, we use less efficient more precise timer, assuming one is + present. + */ + EVENT_BASE_FLAG_PRECISE_TIMER = 0x20 +}; + +/** + Return a bitmask of the features implemented by an event base. This + will be a bitwise OR of one or more of the values of + event_method_feature + + @see event_method_feature + */ +EVENT2_EXPORT_SYMBOL +int event_base_get_features(const struct event_base *base); + +/** + Enters a required event method feature that the application demands. + + Note that not every feature or combination of features is supported + on every platform. Code that requests features should be prepared + to handle the case where event_base_new_with_config() returns NULL, as in: +
+     event_config_require_features(cfg, EV_FEATURE_ET);
+     base = event_base_new_with_config(cfg);
+     if (base == NULL) {
+       // We can't get edge-triggered behavior here.
+       event_config_require_features(cfg, 0);
+       base = event_base_new_with_config(cfg);
+     }
+   
+ + @param cfg the event configuration object + @param feature a bitfield of one or more event_method_feature values. + Replaces values from previous calls to this function. + @return 0 on success, -1 on failure. + @see event_method_feature, event_base_new_with_config() +*/ +EVENT2_EXPORT_SYMBOL +int event_config_require_features(struct event_config *cfg, int feature); + +/** + * Sets one or more flags to configure what parts of the eventual event_base + * will be initialized, and how they'll work. + * + * @see event_base_config_flags, event_base_new_with_config() + **/ +EVENT2_EXPORT_SYMBOL +int event_config_set_flag(struct event_config *cfg, int flag); + +/** + * Records a hint for the number of CPUs in the system. This is used for + * tuning thread pools, etc, for optimal performance. In Libevent 2.0, + * it is only on Windows, and only when IOCP is in use. + * + * @param cfg the event configuration object + * @param cpus the number of cpus + * @return 0 on success, -1 on failure. + */ +EVENT2_EXPORT_SYMBOL +int event_config_set_num_cpus_hint(struct event_config *cfg, int cpus); + +/** + * Record an interval and/or a number of callbacks after which the event base + * should check for new events. By default, the event base will run as many + * events are as activated at the highest activated priority before checking + * for new events. If you configure it by setting max_interval, it will check + * the time after each callback, and not allow more than max_interval to + * elapse before checking for new events. If you configure it by setting + * max_callbacks to a value >= 0, it will run no more than max_callbacks + * callbacks before checking for new events. + * + * This option can decrease the latency of high-priority events, and + * avoid priority inversions where multiple low-priority events keep us from + * polling for high-priority events, but at the expense of slightly decreasing + * the throughput. Use it with caution! + * + * @param cfg The event_base configuration object. + * @param max_interval An interval after which Libevent should stop running + * callbacks and check for more events, or NULL if there should be + * no such interval. + * @param max_callbacks A number of callbacks after which Libevent should + * stop running callbacks and check for more events, or -1 if there + * should be no such limit. + * @param min_priority A priority below which max_interval and max_callbacks + * should not be enforced. If this is set to 0, they are enforced + * for events of every priority; if it's set to 1, they're enforced + * for events of priority 1 and above, and so on. + * @return 0 on success, -1 on failure. + **/ +EVENT2_EXPORT_SYMBOL +int event_config_set_max_dispatch_interval(struct event_config *cfg, + const struct timeval *max_interval, int max_callbacks, + int min_priority); + +/** + Initialize the event API. + + Use event_base_new_with_config() to initialize a new event base, taking + the specified configuration under consideration. The configuration object + can currently be used to avoid certain event notification mechanisms. + + @param cfg the event configuration object + @return an initialized event_base that can be used to registering events, + or NULL if no event base can be created with the requested event_config. + @see event_base_new(), event_base_free(), event_init(), event_assign() +*/ +EVENT2_EXPORT_SYMBOL +struct event_base *event_base_new_with_config(const struct event_config *); + +/** + Deallocate all memory associated with an event_base, and free the base. + + Note that this function will not close any fds or free any memory passed + to event_new as the argument to callback. + + If there are any pending finalizer callbacks, this function will invoke + them. + + @param eb an event_base to be freed + */ +EVENT2_EXPORT_SYMBOL +void event_base_free(struct event_base *); + +/** + As event_base_free, but do not run finalizers. + */ +EVENT2_EXPORT_SYMBOL +void event_base_free_nofinalize(struct event_base *); + +/** @name Log severities + */ +/**@{*/ +#define EVENT_LOG_DEBUG 0 +#define EVENT_LOG_MSG 1 +#define EVENT_LOG_WARN 2 +#define EVENT_LOG_ERR 3 +/**@}*/ + +/* Obsolete names: these are deprecated, but older programs might use them. + * They violate the reserved-identifier namespace. */ +#define _EVENT_LOG_DEBUG EVENT_LOG_DEBUG +#define _EVENT_LOG_MSG EVENT_LOG_MSG +#define _EVENT_LOG_WARN EVENT_LOG_WARN +#define _EVENT_LOG_ERR EVENT_LOG_ERR + +/** + A callback function used to intercept Libevent's log messages. + + @see event_set_log_callback + */ +typedef void (*event_log_cb)(int severity, const char *msg); +/** + Redirect Libevent's log messages. + + @param cb a function taking two arguments: an integer severity between + EVENT_LOG_DEBUG and EVENT_LOG_ERR, and a string. If cb is NULL, + then the default log is used. + + NOTE: The function you provide *must not* call any other libevent + functionality. Doing so can produce undefined behavior. + */ +EVENT2_EXPORT_SYMBOL +void event_set_log_callback(event_log_cb cb); + +/** + A function to be called if Libevent encounters a fatal internal error. + + @see event_set_fatal_callback + */ +typedef void (*event_fatal_cb)(int err); + +/** + Override Libevent's behavior in the event of a fatal internal error. + + By default, Libevent will call exit(1) if a programming error makes it + impossible to continue correct operation. This function allows you to supply + another callback instead. Note that if the function is ever invoked, + something is wrong with your program, or with Libevent: any subsequent calls + to Libevent may result in undefined behavior. + + Libevent will (almost) always log an EVENT_LOG_ERR message before calling + this function; look at the last log message to see why Libevent has died. + */ +EVENT2_EXPORT_SYMBOL +void event_set_fatal_callback(event_fatal_cb cb); + +#define EVENT_DBG_ALL 0xffffffffu +#define EVENT_DBG_NONE 0 + +/** + Turn on debugging logs and have them sent to the default log handler. + + This is a global setting; if you are going to call it, you must call this + before any calls that create an event-base. You must call it before any + multithreaded use of Libevent. + + Debug logs are verbose. + + @param which Controls which debug messages are turned on. This option is + unused for now; for forward compatibility, you must pass in the constant + "EVENT_DBG_ALL" to turn debugging logs on, or "EVENT_DBG_NONE" to turn + debugging logs off. + */ +EVENT2_EXPORT_SYMBOL +void event_enable_debug_logging(ev_uint32_t which); + +/** + Associate a different event base with an event. + + The event to be associated must not be currently active or pending. + + @param eb the event base + @param ev the event + @return 0 on success, -1 on failure. + */ +EVENT2_EXPORT_SYMBOL +int event_base_set(struct event_base *, struct event *); + +/** @name Loop flags + + These flags control the behavior of event_base_loop(). + */ +/**@{*/ +/** Block until we have an active event, then exit once all active events + * have had their callbacks run. */ +#define EVLOOP_ONCE 0x01 +/** Do not block: see which events are ready now, run the callbacks + * of the highest-priority ones, then exit. */ +#define EVLOOP_NONBLOCK 0x02 +/** Do not exit the loop because we have no pending events. Instead, keep + * running until event_base_loopexit() or event_base_loopbreak() makes us + * stop. + */ +#define EVLOOP_NO_EXIT_ON_EMPTY 0x04 +/**@}*/ + +/** + Wait for events to become active, and run their callbacks. + + This is a more flexible version of event_base_dispatch(). + + By default, this loop will run the event base until either there are no more + pending or active events, or until something calls event_base_loopbreak() or + event_base_loopexit(). You can override this behavior with the 'flags' + argument. + + @param eb the event_base structure returned by event_base_new() or + event_base_new_with_config() + @param flags any combination of EVLOOP_ONCE | EVLOOP_NONBLOCK + @return 0 if successful, -1 if an error occurred, or 1 if we exited because + no events were pending or active. + @see event_base_loopexit(), event_base_dispatch(), EVLOOP_ONCE, + EVLOOP_NONBLOCK + */ +EVENT2_EXPORT_SYMBOL +int event_base_loop(struct event_base *, int); + +/** + Exit the event loop after the specified time + + The next event_base_loop() iteration after the given timer expires will + complete normally (handling all queued events) then exit without + blocking for events again. + + Subsequent invocations of event_base_loop() will proceed normally. + + @param eb the event_base structure returned by event_init() + @param tv the amount of time after which the loop should terminate, + or NULL to exit after running all currently active events. + @return 0 if successful, or -1 if an error occurred + @see event_base_loopbreak() + */ +EVENT2_EXPORT_SYMBOL +int event_base_loopexit(struct event_base *, const struct timeval *); + +/** + Abort the active event_base_loop() immediately. + + event_base_loop() will abort the loop after the next event is completed; + event_base_loopbreak() is typically invoked from this event's callback. + This behavior is analogous to the "break;" statement. + + Subsequent invocations of event_base_loop() will proceed normally. + + @param eb the event_base structure returned by event_init() + @return 0 if successful, or -1 if an error occurred + @see event_base_loopexit() + */ +EVENT2_EXPORT_SYMBOL +int event_base_loopbreak(struct event_base *); + +/** + Tell the active event_base_loop() to scan for new events immediately. + + Calling this function makes the currently active event_base_loop() + start the loop over again (scanning for new events) after the current + event callback finishes. If the event loop is not running, this + function has no effect. + + event_base_loopbreak() is typically invoked from this event's callback. + This behavior is analogous to the "continue;" statement. + + Subsequent invocations of event loop will proceed normally. + + @param eb the event_base structure returned by event_init() + @return 0 if successful, or -1 if an error occurred + @see event_base_loopbreak() + */ +EVENT2_EXPORT_SYMBOL +int event_base_loopcontinue(struct event_base *); + +/** + Checks if the event loop was told to exit by event_base_loopexit(). + + This function will return true for an event_base at every point after + event_loopexit() is called, until the event loop is next entered. + + @param eb the event_base structure returned by event_init() + @return true if event_base_loopexit() was called on this event base, + or 0 otherwise + @see event_base_loopexit() + @see event_base_got_break() + */ +EVENT2_EXPORT_SYMBOL +int event_base_got_exit(struct event_base *); + +/** + Checks if the event loop was told to abort immediately by event_base_loopbreak(). + + This function will return true for an event_base at every point after + event_base_loopbreak() is called, until the event loop is next entered. + + @param eb the event_base structure returned by event_init() + @return true if event_base_loopbreak() was called on this event base, + or 0 otherwise + @see event_base_loopbreak() + @see event_base_got_exit() + */ +EVENT2_EXPORT_SYMBOL +int event_base_got_break(struct event_base *); + +/** + * @name event flags + * + * Flags to pass to event_new(), event_assign(), event_pending(), and + * anything else with an argument of the form "short events" + */ +/**@{*/ +/** Indicates that a timeout has occurred. It's not necessary to pass + * this flag to event_for new()/event_assign() to get a timeout. */ +#define EV_TIMEOUT 0x01 +/** Wait for a socket or FD to become readable */ +#define EV_READ 0x02 +/** Wait for a socket or FD to become writeable */ +#define EV_WRITE 0x04 +/** Wait for a POSIX signal to be raised*/ +#define EV_SIGNAL 0x08 +/** + * Persistent event: won't get removed automatically when activated. + * + * When a persistent event with a timeout becomes activated, its timeout + * is reset to 0. + */ +#define EV_PERSIST 0x10 +/** Select edge-triggered behavior, if supported by the backend. */ +#define EV_ET 0x20 +/** + * If this option is provided, then event_del() will not block in one thread + * while waiting for the event callback to complete in another thread. + * + * To use this option safely, you may need to use event_finalize() or + * event_free_finalize() in order to safely tear down an event in a + * multithreaded application. See those functions for more information. + **/ +#define EV_FINALIZE 0x40 +/** + * Detects connection close events. You can use this to detect when a + * connection has been closed, without having to read all the pending data + * from a connection. + * + * Not all backends support EV_CLOSED. To detect or require it, use the + * feature flag EV_FEATURE_EARLY_CLOSE. + **/ +#define EV_CLOSED 0x80 +/**@}*/ + +/** + @name evtimer_* macros + + Aliases for working with one-shot timer events + If you need EV_PERSIST timer use event_*() functions. + */ +/**@{*/ +#define evtimer_assign(ev, b, cb, arg) \ + event_assign((ev), (b), -1, 0, (cb), (arg)) +#define evtimer_new(b, cb, arg) event_new((b), -1, 0, (cb), (arg)) +#define evtimer_add(ev, tv) event_add((ev), (tv)) +#define evtimer_del(ev) event_del(ev) +#define evtimer_pending(ev, tv) event_pending((ev), EV_TIMEOUT, (tv)) +#define evtimer_initialized(ev) event_initialized(ev) +/**@}*/ + +/** + @name evsignal_* macros + + Aliases for working with signal events + */ +/**@{*/ +#define evsignal_add(ev, tv) event_add((ev), (tv)) +#define evsignal_assign(ev, b, x, cb, arg) \ + event_assign((ev), (b), (x), EV_SIGNAL|EV_PERSIST, cb, (arg)) +#define evsignal_new(b, x, cb, arg) \ + event_new((b), (x), EV_SIGNAL|EV_PERSIST, (cb), (arg)) +#define evsignal_del(ev) event_del(ev) +#define evsignal_pending(ev, tv) event_pending((ev), EV_SIGNAL, (tv)) +#define evsignal_initialized(ev) event_initialized(ev) +/**@}*/ + +/** + @name evuser_* macros + + Aliases for working with user-triggered events + If you need EV_PERSIST event use event_*() functions. + */ +/**@{*/ +#define evuser_new(b, cb, arg) event_new((b), -1, 0, (cb), (arg)) +#define evuser_del(ev) event_del(ev) +#define evuser_pending(ev, tv) event_pending((ev), 0, (tv)) +#define evuser_initialized(ev) event_initialized(ev) +#define evuser_trigger(ev) event_active((ev), 0, 0) +/**@}*/ + +/** + A callback function for an event. + + It receives three arguments: + + @param fd An fd or signal + @param events One or more EV_* flags + @param arg A user-supplied argument. + + @see event_new() + */ +typedef void (*event_callback_fn)(evutil_socket_t, short, void *); + +/** + Return a value used to specify that the event itself must be used as the callback argument. + + The function event_new() takes a callback argument which is passed + to the event's callback function. To specify that the argument to be + passed to the callback function is the event that event_new() returns, + pass in the return value of event_self_cbarg() as the callback argument + for event_new(). + + For example: +
+      struct event *ev = event_new(base, sock, events, callback, %event_self_cbarg());
+  
+ + For consistency with event_new(), it is possible to pass the return value + of this function as the callback argument for event_assign() – this + achieves the same result as passing the event in directly. + + @return a value to be passed as the callback argument to event_new() or + event_assign(). + @see event_new(), event_assign() + */ +EVENT2_EXPORT_SYMBOL +void *event_self_cbarg(void); + +/** + Allocate and assign a new event structure, ready to be added. + + The function event_new() returns a new event that can be used in + future calls to event_add() and event_del(). The fd and events + arguments determine which conditions will trigger the event; the + callback and callback_arg arguments tell Libevent what to do when the + event becomes active. + + If events contains one of EV_READ, EV_WRITE, or EV_READ|EV_WRITE, then + fd is a file descriptor or socket that should get monitored for + readiness to read, readiness to write, or readiness for either operation + (respectively). If events contains EV_SIGNAL, then fd is a signal + number to wait for. If events contains none of those flags, then the + event can be triggered only by a timeout or by manual activation with + event_active(): In this case, fd must be -1. + + The EV_PERSIST flag can also be passed in the events argument: it makes + event_add() persistent until event_del() is called. + + The EV_ET flag is compatible with EV_READ and EV_WRITE, and supported + only by certain backends. It tells Libevent to use edge-triggered + events. + + The EV_TIMEOUT flag has no effect here. + + It is okay to have multiple events all listening on the same fds; but + they must either all be edge-triggered, or all not be edge triggered. + + When the event becomes active, the event loop will run the provided + callback function, with three arguments. The first will be the provided + fd value. The second will be a bitfield of the events that triggered: + EV_READ, EV_WRITE, or EV_SIGNAL. Here the EV_TIMEOUT flag indicates + that a timeout occurred, and EV_ET indicates that an edge-triggered + event occurred. The third event will be the callback_arg pointer that + you provide. + + @param base the event base to which the event should be attached. + @param fd the file descriptor or signal to be monitored, or -1. + @param events desired events to monitor: bitfield of EV_READ, EV_WRITE, + EV_SIGNAL, EV_PERSIST, EV_ET. + @param callback callback function to be invoked when the event occurs + @param callback_arg an argument to be passed to the callback function + + @return a newly allocated struct event that must later be freed with + event_free() or NULL if an error occurred. + @see event_free(), event_add(), event_del(), event_assign() + */ +EVENT2_EXPORT_SYMBOL +struct event *event_new(struct event_base *, evutil_socket_t, short, event_callback_fn, void *); + + +/** + Prepare a new, already-allocated event structure to be added. + + The function event_assign() prepares the event structure ev to be used + in future calls to event_add() and event_del(). Unlike event_new(), it + doesn't allocate memory itself: it requires that you have already + allocated a struct event, probably on the heap. Doing this will + typically make your code depend on the size of the event structure, and + thereby create incompatibility with future versions of Libevent. + + The easiest way to avoid this problem is just to use event_new() and + event_free() instead. + + A slightly harder way to future-proof your code is to use + event_get_struct_event_size() to determine the required size of an event + at runtime. + + Note that it is NOT safe to call this function on an event that is + active or pending. Doing so WILL corrupt internal data structures in + Libevent, and lead to strange, hard-to-diagnose bugs. You _can_ use + event_assign to change an existing event, but only if it is not active + or pending! + + The arguments for this function, and the behavior of the events that it + makes, are as for event_new(). + + @param ev an event struct to be modified + @param base the event base to which ev should be attached. + @param fd the file descriptor to be monitored + @param events desired events to monitor; can be EV_READ and/or EV_WRITE + @param callback callback function to be invoked when the event occurs + @param callback_arg an argument to be passed to the callback function + + @return 0 if success, or -1 on invalid arguments. + + @see event_new(), event_add(), event_del(), event_base_once(), + event_get_struct_event_size() + */ +EVENT2_EXPORT_SYMBOL +int event_assign(struct event *, struct event_base *, evutil_socket_t, short, event_callback_fn, void *); + +/** + Deallocate a struct event * returned by event_new(). + + If the event is pending or active, this function makes it non-pending + and non-active first. + */ +EVENT2_EXPORT_SYMBOL +void event_free(struct event *); + +/** + * Callback type for event_finalize and event_free_finalize(). + **/ +typedef void (*event_finalize_callback_fn)(struct event *, void *); +/** + @name Finalization functions + + These functions are used to safely tear down an event in a multithreaded + application. If you construct your events with EV_FINALIZE to avoid + deadlocks, you will need a way to remove an event in the certainty that + it will definitely not be running its callback when you deallocate it + and its callback argument. + + To do this, call one of event_finalize() or event_free_finalize with + 0 for its first argument, the event to tear down as its second argument, + and a callback function as its third argument. The callback will be + invoked as part of the event loop, with the event's priority. + + After you call a finalizer function, event_add() and event_active() will + no longer work on the event, and event_del() will produce a no-op. You + must not try to change the event's fields with event_assign() or + event_set() while the finalize callback is in progress. Once the + callback has been invoked, you should treat the event structure as + containing uninitialized memory. + + The event_free_finalize() function frees the event after it's finalized; + event_finalize() does not. + + A finalizer callback must not make events pending or active. It must not + add events, activate events, or attempt to "resuscitate" the event being + finalized in any way. + + @return 0 on success, -1 on failure. + */ +/**@{*/ +EVENT2_EXPORT_SYMBOL +int event_finalize(unsigned, struct event *, event_finalize_callback_fn); +EVENT2_EXPORT_SYMBOL +int event_free_finalize(unsigned, struct event *, event_finalize_callback_fn); +/**@}*/ + +/** + Schedule a one-time event + + The function event_base_once() is similar to event_new(). However, it + schedules a callback to be called exactly once, and does not require the + caller to prepare an event structure. + + Note that in Libevent 2.0 and earlier, if the event is never triggered, the + internal memory used to hold it will never be freed. In Libevent 2.1, + the internal memory will get freed by event_base_free() if the event + is never triggered. The 'arg' value, however, will not get freed in either + case--you'll need to free that on your own if you want it to go away. + + @param base an event_base + @param fd a file descriptor to monitor, or -1 for no fd. + @param events event(s) to monitor; can be any of EV_READ | + EV_WRITE, or EV_TIMEOUT + @param callback callback function to be invoked when the event occurs + @param arg an argument to be passed to the callback function + @param timeout the maximum amount of time to wait for the event. NULL + makes an EV_READ/EV_WRITE event make forever; NULL makes an + EV_TIMEOUT event success immediately. + @return 0 if successful, or -1 if an error occurred + */ +EVENT2_EXPORT_SYMBOL +int event_base_once(struct event_base *, evutil_socket_t, short, event_callback_fn, void *, const struct timeval *); + +/** + Add an event to the set of pending events. + + The function event_add() schedules the execution of the event 'ev' when the + condition specified by event_assign() or event_new() occurs, or when the time + specified in timeout has elapsed. If a timeout is NULL, no timeout + occurs and the function will only be + called if a matching event occurs. The event in the + ev argument must be already initialized by event_assign() or event_new() + and may not be used + in calls to event_assign() until it is no longer pending. + + If the event in the ev argument already has a scheduled timeout, calling + event_add() replaces the old timeout with the new one if tv is non-NULL. + + @param ev an event struct initialized via event_assign() or event_new() + @param timeout the maximum amount of time to wait for the event, or NULL + to wait forever + @return 0 if successful, or -1 if an error occurred + @see event_del(), event_assign(), event_new() + */ +EVENT2_EXPORT_SYMBOL +int event_add(struct event *ev, const struct timeval *timeout); + +/** + Remove a timer from a pending event without removing the event itself. + + If the event has a scheduled timeout, this function unschedules it but + leaves the event otherwise pending. + + @param ev an event struct initialized via event_assign() or event_new() + @return 0 on success, or -1 if an error occurred. +*/ +EVENT2_EXPORT_SYMBOL +int event_remove_timer(struct event *ev); + +/** + Remove an event from the set of monitored events. + + The function event_del() will cancel the event in the argument ev. If the + event has already executed or has never been added the call will have no + effect. + + @param ev an event struct to be removed from the working set + @return 0 if successful, or -1 if an error occurred + @see event_add() + */ +EVENT2_EXPORT_SYMBOL +int event_del(struct event *); + +/** + As event_del(), but never blocks while the event's callback is running + in another thread, even if the event was constructed without the + EV_FINALIZE flag. + */ +EVENT2_EXPORT_SYMBOL +int event_del_noblock(struct event *ev); +/** + As event_del(), but always blocks while the event's callback is running + in another thread, even if the event was constructed with the + EV_FINALIZE flag. + */ +EVENT2_EXPORT_SYMBOL +int event_del_block(struct event *ev); + +/** + Make an event active. + + You can use this function on a pending or a non-pending event to make it + active, so that its callback will be run by event_base_dispatch() or + event_base_loop(). + + One common use in multithreaded programs is to wake the thread running + event_base_loop() from another thread. + + @param ev an event to make active. + @param res a set of flags to pass to the event's callback. + @param ncalls an obsolete argument: this is ignored. + **/ +EVENT2_EXPORT_SYMBOL +void event_active(struct event *ev, int res, short ncalls); + +/** + Checks if a specific event is pending or scheduled. + + @param ev an event struct previously passed to event_add() + @param events the requested event type; any of EV_TIMEOUT|EV_READ| + EV_WRITE|EV_SIGNAL + @param tv if this field is not NULL, and the event has a timeout, + this field is set to hold the time at which the timeout will + expire. + + @return true if the event is pending on any of the events in 'what', (that + is to say, it has been added), or 0 if the event is not added. + */ +EVENT2_EXPORT_SYMBOL +int event_pending(const struct event *ev, short events, struct timeval *tv); + +/** + If called from within the callback for an event, returns that event. + + The behavior of this function is not defined when called from outside the + callback function for an event. + */ +EVENT2_EXPORT_SYMBOL +struct event *event_base_get_running_event(struct event_base *base); + +/** + Test if an event structure might be initialized. + + The event_initialized() function can be used to check if an event has been + initialized. + + Warning: This function is only useful for distinguishing a zeroed-out + piece of memory from an initialized event, it can easily be confused by + uninitialized memory. Thus, it should ONLY be used to distinguish an + initialized event from zero. + + @param ev an event structure to be tested + @return 1 if the structure might be initialized, or 0 if it has not been + initialized + */ +EVENT2_EXPORT_SYMBOL +int event_initialized(const struct event *ev); + +/** + Get the signal number assigned to a signal event +*/ +#define event_get_signal(ev) ((int)event_get_fd(ev)) + +/** + Get the socket or signal assigned to an event, or -1 if the event has + no socket. +*/ +EVENT2_EXPORT_SYMBOL +evutil_socket_t event_get_fd(const struct event *ev); + +/** + Get the event_base associated with an event. +*/ +EVENT2_EXPORT_SYMBOL +struct event_base *event_get_base(const struct event *ev); + +/** + Return the events (EV_READ, EV_WRITE, etc) assigned to an event. +*/ +EVENT2_EXPORT_SYMBOL +short event_get_events(const struct event *ev); + +/** + Return the callback assigned to an event. +*/ +EVENT2_EXPORT_SYMBOL +event_callback_fn event_get_callback(const struct event *ev); + +/** + Return the callback argument assigned to an event. +*/ +EVENT2_EXPORT_SYMBOL +void *event_get_callback_arg(const struct event *ev); + +/** + Return the priority of an event. + @see event_priority_init(), event_get_priority() +*/ +EVENT2_EXPORT_SYMBOL +int event_get_priority(const struct event *ev); + +/** + Extract _all_ of arguments given to construct a given event. The + event_base is copied into *base_out, the fd is copied into *fd_out, and so + on. + + If any of the "_out" arguments is NULL, it will be ignored. + */ +EVENT2_EXPORT_SYMBOL +void event_get_assignment(const struct event *event, + struct event_base **base_out, evutil_socket_t *fd_out, short *events_out, + event_callback_fn *callback_out, void **arg_out); + +/** + Return the size of struct event that the Libevent library was compiled + with. + + This will be NO GREATER than sizeof(struct event) if you're running with + the same version of Libevent that your application was built with, but + otherwise might not. + + Note that it might be SMALLER than sizeof(struct event) if some future + version of Libevent adds extra padding to the end of struct event. + We might do this to help ensure ABI-compatibility between different + versions of Libevent. + */ +EVENT2_EXPORT_SYMBOL +size_t event_get_struct_event_size(void); + +/** + Get the Libevent version. + + Note that this will give you the version of the library that you're + currently linked against, not the version of the headers that you've + compiled against. + + @return a string containing the version number of Libevent +*/ +EVENT2_EXPORT_SYMBOL +const char *event_get_version(void); + +/** + Return a numeric representation of Libevent's version. + + Note that this will give you the version of the library that you're + currently linked against, not the version of the headers you've used to + compile. + + The format uses one byte each for the major, minor, and patchlevel parts of + the version number. The low-order byte is unused. For example, version + 2.0.1-alpha has a numeric representation of 0x02000100 +*/ +EVENT2_EXPORT_SYMBOL +ev_uint32_t event_get_version_number(void); + +/** As event_get_version, but gives the version of Libevent's headers. */ +#define LIBEVENT_VERSION EVENT__VERSION +/** As event_get_version_number, but gives the version number of Libevent's + * headers. */ +#define LIBEVENT_VERSION_NUMBER EVENT__NUMERIC_VERSION + +/** Largest number of priorities that Libevent can support. */ +#define EVENT_MAX_PRIORITIES 256 +/** + Set the number of different event priorities + + By default Libevent schedules all active events with the same priority. + However, some time it is desirable to process some events with a higher + priority than others. For that reason, Libevent supports strict priority + queues. Active events with a lower priority are always processed before + events with a higher priority. + + The number of different priorities can be set initially with the + event_base_priority_init() function. This function should be called + before the first call to event_base_dispatch(). The + event_priority_set() function can be used to assign a priority to an + event. By default, Libevent assigns the middle priority to all events + unless their priority is explicitly set. + + Note that urgent-priority events can starve less-urgent events: after + running all urgent-priority callbacks, Libevent checks for more urgent + events again, before running less-urgent events. Less-urgent events + will not have their callbacks run until there are no events more urgent + than them that want to be active. + + @param eb the event_base structure returned by event_base_new() + @param npriorities the maximum number of priorities + @return 0 if successful, or -1 if an error occurred + @see event_priority_set() + */ +EVENT2_EXPORT_SYMBOL +int event_base_priority_init(struct event_base *, int); + +/** + Get the number of different event priorities. + + @param eb the event_base structure returned by event_base_new() + @return Number of different event priorities + @see event_base_priority_init() +*/ +EVENT2_EXPORT_SYMBOL +int event_base_get_npriorities(struct event_base *eb); + +/** + Assign a priority to an event. + + @param ev an event struct + @param priority the new priority to be assigned + @return 0 if successful, or -1 if an error occurred + @see event_priority_init(), event_get_priority() + */ +EVENT2_EXPORT_SYMBOL +int event_priority_set(struct event *, int); + +/** + Prepare an event_base to use a large number of timeouts with the same + duration. + + Libevent's default scheduling algorithm is optimized for having a large + number of timeouts with their durations more or less randomly + distributed. But if you have a large number of timeouts that all have + the same duration (for example, if you have a large number of + connections that all have a 10-second timeout), then you can improve + Libevent's performance by telling Libevent about it. + + To do this, call this function with the common duration. It will return a + pointer to a different, opaque timeout value. (Don't depend on its actual + contents!) When you use this timeout value in event_add(), Libevent will + schedule the event more efficiently. + + (This optimization probably will not be worthwhile until you have thousands + or tens of thousands of events with the same timeout.) + */ +EVENT2_EXPORT_SYMBOL +const struct timeval *event_base_init_common_timeout(struct event_base *base, + const struct timeval *duration); + +#if !defined(EVENT__DISABLE_MM_REPLACEMENT) || defined(EVENT_IN_DOXYGEN_) +/** + Override the functions that Libevent uses for memory management. + + Usually, Libevent uses the standard libc functions malloc, realloc, and + free to allocate memory. Passing replacements for those functions to + event_set_mem_functions() overrides this behavior. + + Note that all memory returned from Libevent will be allocated by the + replacement functions rather than by malloc() and realloc(). Thus, if you + have replaced those functions, it will not be appropriate to free() memory + that you get from Libevent. Instead, you must use the free_fn replacement + that you provided. + + Note also that if you are going to call this function, you should do so + before any call to any Libevent function that does allocation. + Otherwise, those functions will allocate their memory using malloc(), but + then later free it using your provided free_fn. + + @param malloc_fn A replacement for malloc. + @param realloc_fn A replacement for realloc + @param free_fn A replacement for free. + **/ +EVENT2_EXPORT_SYMBOL +void event_set_mem_functions( + void *(*malloc_fn)(size_t sz), + void *(*realloc_fn)(void *ptr, size_t sz), + void (*free_fn)(void *ptr)); +/** This definition is present if Libevent was built with support for + event_set_mem_functions() */ +#define EVENT_SET_MEM_FUNCTIONS_IMPLEMENTED +#endif + +/** + Writes a human-readable description of all inserted and/or active + events to a provided stdio stream. + + This is intended for debugging; its format is not guaranteed to be the same + between libevent versions. + + @param base An event_base on which to scan the events. + @param output A stdio file to write on. + */ +EVENT2_EXPORT_SYMBOL +void event_base_dump_events(struct event_base *, FILE *); + + +/** + Activates all pending events for the given fd and event mask. + + This function activates pending events only. Events which have not been + added will not become active. + + @param base the event_base on which to activate the events. + @param fd An fd to active events on. + @param events One or more of EV_{READ,WRITE,TIMEOUT}. + */ +EVENT2_EXPORT_SYMBOL +void event_base_active_by_fd(struct event_base *base, evutil_socket_t fd, short events); + +/** + Activates all pending signals with a given signal number + + This function activates pending events only. Events which have not been + added will not become active. + + @param base the event_base on which to activate the events. + @param fd The signal to active events on. + */ +EVENT2_EXPORT_SYMBOL +void event_base_active_by_signal(struct event_base *base, int sig); + +/** + * Callback for iterating events in an event base via event_base_foreach_event + */ +typedef int (*event_base_foreach_event_cb)(const struct event_base *, const struct event *, void *); + +/** + Iterate over all added or active events events in an event loop, and invoke + a given callback on each one. + + The callback must not call any function that modifies the event base, that + modifies any event in the event base, or that adds or removes any event to + the event base. Doing so is unsupported and will lead to undefined + behavior -- likely, to crashes. + + event_base_foreach_event() holds a lock on the event_base() for the whole + time it's running: slow callbacks are not advisable. + + Note that Libevent adds some events of its own to make pieces of its + functionality work. You must not assume that the only events you'll + encounter will be the ones you added yourself. + + The callback function must return 0 to continue iteration, or some other + integer to stop iterating. + + @param base An event_base on which to scan the events. + @param fn A callback function to receive the events. + @param arg An argument passed to the callback function. + @return 0 if we iterated over every event, or the value returned by the + callback function if the loop exited early. +*/ +EVENT2_EXPORT_SYMBOL +int event_base_foreach_event(struct event_base *base, event_base_foreach_event_cb fn, void *arg); + + +/** Sets 'tv' to the current time (as returned by gettimeofday()), + looking at the cached value in 'base' if possible, and calling + gettimeofday() or clock_gettime() as appropriate if there is no + cached time. + + Generally, this value will only be cached while actually + processing event callbacks, and may be very inaccurate if your + callbacks take a long time to execute. + + Returns 0 on success, negative on failure. + */ +EVENT2_EXPORT_SYMBOL +int event_base_gettimeofday_cached(struct event_base *base, + struct timeval *tv); + +/** Update cached_tv in the 'base' to the current time + * + * You can use this function is useful for selectively increasing + * the accuracy of the cached time value in 'base' during callbacks + * that take a long time to execute. + * + * This function has no effect if the base is currently not in its + * event loop, or if timeval caching is disabled via + * EVENT_BASE_FLAG_NO_CACHE_TIME. + * + * @return 0 on success, -1 on failure + */ +EVENT2_EXPORT_SYMBOL +int event_base_update_cache_time(struct event_base *base); + +/** Release up all globally-allocated resources allocated by Libevent. + + This function does not free developer-controlled resources like + event_bases, events, bufferevents, listeners, and so on. It only releases + resources like global locks that there is no other way to free. + + It is not actually necessary to call this function before exit: every + resource that it frees would be released anyway on exit. It mainly exists + so that resource-leak debugging tools don't see Libevent as holding + resources at exit. + + You should only call this function when no other Libevent functions will + be invoked -- e.g., when cleanly exiting a program. + */ +EVENT2_EXPORT_SYMBOL +void libevent_global_shutdown(void); + +#ifdef __cplusplus +} +#endif + +#endif /* EVENT2_EVENT_H_INCLUDED_ */ diff --git a/bsnes/thrift/libevent/include/event2/event_compat.h b/bsnes/thrift/libevent/include/event2/event_compat.h new file mode 100644 index 00000000..5110175a --- /dev/null +++ b/bsnes/thrift/libevent/include/event2/event_compat.h @@ -0,0 +1,230 @@ +/* + * Copyright (c) 2000-2007 Niels Provos + * Copyright (c) 2007-2012 Niels Provos and Nick Mathewson + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +#ifndef EVENT2_EVENT_COMPAT_H_INCLUDED_ +#define EVENT2_EVENT_COMPAT_H_INCLUDED_ + +/** @file event2/event_compat.h + + Potentially non-threadsafe versions of the functions in event.h: provided + only for backwards compatibility. + + In the oldest versions of Libevent, event_base was not a first-class + structure. Instead, there was a single event base that every function + manipulated. Later, when separate event bases were added, the old functions + that didn't take an event_base argument needed to work by manipulating the + "current" event base. This could lead to thread-safety issues, and obscure, + hard-to-diagnose bugs. + + @deprecated All functions in this file are by definition deprecated. + */ +#include + +#ifdef __cplusplus +extern "C" { +#endif + +#include +#ifdef EVENT__HAVE_SYS_TYPES_H +#include +#endif +#ifdef EVENT__HAVE_SYS_TIME_H +#include +#endif + +/* For int types. */ +#include + +/** + Initialize the event API. + + The event API needs to be initialized with event_init() before it can be + used. Sets the global current base that gets used for events that have no + base associated with them. + + @deprecated This function is deprecated because it replaces the "current" + event_base, and is totally unsafe for multithreaded use. The replacement + is event_base_new(). + + @see event_base_set(), event_base_new() + */ +EVENT2_EXPORT_SYMBOL +struct event_base *event_init(void); + +/** + Loop to process events. + + Like event_base_dispatch(), but uses the "current" base. + + @deprecated This function is deprecated because it is easily confused by + multiple calls to event_init(), and because it is not safe for + multithreaded use. The replacement is event_base_dispatch(). + + @see event_base_dispatch(), event_init() + */ +EVENT2_EXPORT_SYMBOL +int event_dispatch(void); + +/** + Handle events. + + This function behaves like event_base_loop(), but uses the "current" base + + @deprecated This function is deprecated because it uses the event base from + the last call to event_init, and is therefore not safe for multithreaded + use. The replacement is event_base_loop(). + + @see event_base_loop(), event_init() +*/ +EVENT2_EXPORT_SYMBOL +int event_loop(int); + + +/** + Exit the event loop after the specified time. + + This function behaves like event_base_loopexit(), except that it uses the + "current" base. + + @deprecated This function is deprecated because it uses the event base from + the last call to event_init, and is therefore not safe for multithreaded + use. The replacement is event_base_loopexit(). + + @see event_init, event_base_loopexit() + */ +EVENT2_EXPORT_SYMBOL +int event_loopexit(const struct timeval *); + + +/** + Abort the active event_loop() immediately. + + This function behaves like event_base_loopbreakt(), except that it uses the + "current" base. + + @deprecated This function is deprecated because it uses the event base from + the last call to event_init, and is therefore not safe for multithreaded + use. The replacement is event_base_loopbreak(). + + @see event_base_loopbreak(), event_init() + */ +EVENT2_EXPORT_SYMBOL +int event_loopbreak(void); + +/** + Schedule a one-time event to occur. + + @deprecated This function is obsolete, and has been replaced by + event_base_once(). Its use is deprecated because it relies on the + "current" base configured by event_init(). + + @see event_base_once() + */ +EVENT2_EXPORT_SYMBOL +int event_once(evutil_socket_t , short, + void (*)(evutil_socket_t, short, void *), void *, const struct timeval *); + + +/** + Get the kernel event notification mechanism used by Libevent. + + @deprecated This function is obsolete, and has been replaced by + event_base_get_method(). Its use is deprecated because it relies on the + "current" base configured by event_init(). + + @see event_base_get_method() + */ +EVENT2_EXPORT_SYMBOL +const char *event_get_method(void); + + +/** + Set the number of different event priorities. + + @deprecated This function is deprecated because it is easily confused by + multiple calls to event_init(), and because it is not safe for + multithreaded use. The replacement is event_base_priority_init(). + + @see event_base_priority_init() + */ +EVENT2_EXPORT_SYMBOL +int event_priority_init(int); + +/** + Prepare an event structure to be added. + + @deprecated event_set() is not recommended for new code, because it requires + a subsequent call to event_base_set() to be safe under most circumstances. + Use event_assign() or event_new() instead. + */ +EVENT2_EXPORT_SYMBOL +void event_set(struct event *, evutil_socket_t, short, void (*)(evutil_socket_t, short, void *), void *); + +#define evtimer_set(ev, cb, arg) event_set((ev), -1, 0, (cb), (arg)) +#define evsignal_set(ev, x, cb, arg) \ + event_set((ev), (x), EV_SIGNAL|EV_PERSIST, (cb), (arg)) + + +/** + @name timeout_* macros + + @deprecated These macros are deprecated because their naming is inconsistent + with the rest of Libevent. Use the evtimer_* macros instead. + @{ + */ +#define timeout_add(ev, tv) event_add((ev), (tv)) +#define timeout_set(ev, cb, arg) event_set((ev), -1, 0, (cb), (arg)) +#define timeout_del(ev) event_del(ev) +#define timeout_pending(ev, tv) event_pending((ev), EV_TIMEOUT, (tv)) +#define timeout_initialized(ev) event_initialized(ev) +/**@}*/ + +/** + @name signal_* macros + + @deprecated These macros are deprecated because their naming is inconsistent + with the rest of Libevent. Use the evsignal_* macros instead. + @{ + */ +#define signal_add(ev, tv) event_add((ev), (tv)) +#define signal_set(ev, x, cb, arg) \ + event_set((ev), (x), EV_SIGNAL|EV_PERSIST, (cb), (arg)) +#define signal_del(ev) event_del(ev) +#define signal_pending(ev, tv) event_pending((ev), EV_SIGNAL, (tv)) +#define signal_initialized(ev) event_initialized(ev) +/**@}*/ + +#ifndef EVENT_FD +/* These macros are obsolete; use event_get_fd and event_get_signal instead. */ +#define EVENT_FD(ev) ((int)event_get_fd(ev)) +#define EVENT_SIGNAL(ev) event_get_signal(ev) +#endif + +#ifdef __cplusplus +} +#endif + +#endif /* EVENT2_EVENT_COMPAT_H_INCLUDED_ */ diff --git a/bsnes/thrift/libevent/include/event2/event_struct.h b/bsnes/thrift/libevent/include/event2/event_struct.h new file mode 100644 index 00000000..1c8b71b6 --- /dev/null +++ b/bsnes/thrift/libevent/include/event2/event_struct.h @@ -0,0 +1,180 @@ +/* + * Copyright (c) 2000-2007 Niels Provos + * Copyright (c) 2007-2012 Niels Provos and Nick Mathewson + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +#ifndef EVENT2_EVENT_STRUCT_H_INCLUDED_ +#define EVENT2_EVENT_STRUCT_H_INCLUDED_ + +/** @file event2/event_struct.h + + Structures used by event.h. Using these structures directly WILL harm + forward compatibility: be careful. + + No field declared in this file should be used directly in user code. Except + for historical reasons, these fields would not be exposed at all. + */ + +#ifdef __cplusplus +extern "C" { +#endif + +#include +#ifdef EVENT__HAVE_SYS_TYPES_H +#include +#endif +#ifdef EVENT__HAVE_SYS_TIME_H +#include +#endif + +/* For int types. */ +#include + +/* For evkeyvalq */ +#include + +#define EVLIST_TIMEOUT 0x01 +#define EVLIST_INSERTED 0x02 +#define EVLIST_SIGNAL 0x04 +#define EVLIST_ACTIVE 0x08 +#define EVLIST_INTERNAL 0x10 +#define EVLIST_ACTIVE_LATER 0x20 +#define EVLIST_FINALIZING 0x40 +#define EVLIST_INIT 0x80 + +#define EVLIST_ALL 0xff + +/* Fix so that people don't have to run with */ +#ifndef TAILQ_ENTRY +#define EVENT_DEFINED_TQENTRY_ +#define TAILQ_ENTRY(type) \ +struct { \ + struct type *tqe_next; /* next element */ \ + struct type **tqe_prev; /* address of previous next element */ \ +} +#endif /* !TAILQ_ENTRY */ + +#ifndef TAILQ_HEAD +#define EVENT_DEFINED_TQHEAD_ +#define TAILQ_HEAD(name, type) \ +struct name { \ + struct type *tqh_first; \ + struct type **tqh_last; \ +} +#endif + +/* Fix so that people don't have to run with */ +#ifndef LIST_ENTRY +#define EVENT_DEFINED_LISTENTRY_ +#define LIST_ENTRY(type) \ +struct { \ + struct type *le_next; /* next element */ \ + struct type **le_prev; /* address of previous next element */ \ +} +#endif /* !LIST_ENTRY */ + +#ifndef LIST_HEAD +#define EVENT_DEFINED_LISTHEAD_ +#define LIST_HEAD(name, type) \ +struct name { \ + struct type *lh_first; /* first element */ \ + } +#endif /* !LIST_HEAD */ + +struct event; + +struct event_callback { + TAILQ_ENTRY(event_callback) evcb_active_next; + short evcb_flags; + ev_uint8_t evcb_pri; /* smaller numbers are higher priority */ + ev_uint8_t evcb_closure; + /* allows us to adopt for different types of events */ + union { + void (*evcb_callback)(evutil_socket_t, short, void *); + void (*evcb_selfcb)(struct event_callback *, void *); + void (*evcb_evfinalize)(struct event *, void *); + void (*evcb_cbfinalize)(struct event_callback *, void *); + } evcb_cb_union; + void *evcb_arg; +}; + +struct event_base; +struct event { + struct event_callback ev_evcallback; + + /* for managing timeouts */ + union { + TAILQ_ENTRY(event) ev_next_with_common_timeout; + int min_heap_idx; + } ev_timeout_pos; + evutil_socket_t ev_fd; + + struct event_base *ev_base; + + union { + /* used for io events */ + struct { + LIST_ENTRY (event) ev_io_next; + struct timeval ev_timeout; + } ev_io; + + /* used by signal events */ + struct { + LIST_ENTRY (event) ev_signal_next; + short ev_ncalls; + /* Allows deletes in callback */ + short *ev_pncalls; + } ev_signal; + } ev_; + + short ev_events; + short ev_res; /* result passed to event callback */ + struct timeval ev_timeout; +}; + +TAILQ_HEAD (event_list, event); + +#ifdef EVENT_DEFINED_TQENTRY_ +#undef TAILQ_ENTRY +#endif + +#ifdef EVENT_DEFINED_TQHEAD_ +#undef TAILQ_HEAD +#endif + +LIST_HEAD (event_dlist, event); + +#ifdef EVENT_DEFINED_LISTENTRY_ +#undef LIST_ENTRY +#endif + +#ifdef EVENT_DEFINED_LISTHEAD_ +#undef LIST_HEAD +#endif + +#ifdef __cplusplus +} +#endif + +#endif /* EVENT2_EVENT_STRUCT_H_INCLUDED_ */ diff --git a/bsnes/thrift/libevent/include/event2/http.h b/bsnes/thrift/libevent/include/event2/http.h new file mode 100644 index 00000000..2a41303e --- /dev/null +++ b/bsnes/thrift/libevent/include/event2/http.h @@ -0,0 +1,1192 @@ +/* + * Copyright (c) 2000-2007 Niels Provos + * Copyright (c) 2007-2012 Niels Provos and Nick Mathewson + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +#ifndef EVENT2_HTTP_H_INCLUDED_ +#define EVENT2_HTTP_H_INCLUDED_ + +/* For int types. */ +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* In case we haven't included the right headers yet. */ +struct evbuffer; +struct event_base; +struct bufferevent; +struct evhttp_connection; + +/** @file event2/http.h + * + * Basic support for HTTP serving. + * + * As Libevent is a library for dealing with event notification and most + * interesting applications are networked today, I have often found the + * need to write HTTP code. The following prototypes and definitions provide + * an application with a minimal interface for making HTTP requests and for + * creating a very simple HTTP server. + */ + +/* Response codes */ +#define HTTP_OK 200 /**< request completed ok */ +#define HTTP_NOCONTENT 204 /**< request does not have content */ +#define HTTP_MOVEPERM 301 /**< the uri moved permanently */ +#define HTTP_MOVETEMP 302 /**< the uri moved temporarily */ +#define HTTP_NOTMODIFIED 304 /**< page was not modified from last */ +#define HTTP_BADREQUEST 400 /**< invalid http request was made */ +#define HTTP_NOTFOUND 404 /**< could not find content for uri */ +#define HTTP_BADMETHOD 405 /**< method not allowed for this uri */ +#define HTTP_ENTITYTOOLARGE 413 /**< */ +#define HTTP_EXPECTATIONFAILED 417 /**< we can't handle this expectation */ +#define HTTP_INTERNAL 500 /**< internal error */ +#define HTTP_NOTIMPLEMENTED 501 /**< not implemented */ +#define HTTP_SERVUNAVAIL 503 /**< the server is not available */ + +struct evhttp; +struct evhttp_request; +struct evkeyvalq; +struct evhttp_bound_socket; +struct evconnlistener; +struct evdns_base; + +/** + * Create a new HTTP server. + * + * @param base (optional) the event base to receive the HTTP events + * @return a pointer to a newly initialized evhttp server structure or NULL + * on error + * @see evhttp_free() + */ +EVENT2_EXPORT_SYMBOL +struct evhttp *evhttp_new(struct event_base *base); + +/** + * Binds an HTTP server on the specified address and port. + * + * Can be called multiple times to bind the same http server + * to multiple different ports. + * + * @param http a pointer to an evhttp object + * @param address a string containing the IP address to listen(2) on + * @param port the port number to listen on + * @return 0 on success, -1 on failure. + * @see evhttp_accept_socket() + */ +EVENT2_EXPORT_SYMBOL +int evhttp_bind_socket(struct evhttp *http, const char *address, ev_uint16_t port); + +/** + * Like evhttp_bind_socket(), but returns a handle for referencing the socket. + * + * The returned pointer is not valid after \a http is freed. + * + * @param http a pointer to an evhttp object + * @param address a string containing the IP address to listen(2) on + * @param port the port number to listen on + * @return Handle for the socket on success, NULL on failure. + * @see evhttp_bind_socket(), evhttp_del_accept_socket() + */ +EVENT2_EXPORT_SYMBOL +struct evhttp_bound_socket *evhttp_bind_socket_with_handle(struct evhttp *http, const char *address, ev_uint16_t port); + +/** + * Makes an HTTP server accept connections on the specified socket. + * + * This may be useful to create a socket and then fork multiple instances + * of an http server, or when a socket has been communicated via file + * descriptor passing in situations where an http servers does not have + * permissions to bind to a low-numbered port. + * + * Can be called multiple times to have the http server listen to + * multiple different sockets. + * + * @param http a pointer to an evhttp object + * @param fd a socket fd that is ready for accepting connections + * @return 0 on success, -1 on failure. + * @see evhttp_bind_socket() + */ +EVENT2_EXPORT_SYMBOL +int evhttp_accept_socket(struct evhttp *http, evutil_socket_t fd); + +/** + * Like evhttp_accept_socket(), but returns a handle for referencing the socket. + * + * The returned pointer is not valid after \a http is freed. + * + * @param http a pointer to an evhttp object + * @param fd a socket fd that is ready for accepting connections + * @return Handle for the socket on success, NULL on failure. + * @see evhttp_accept_socket(), evhttp_del_accept_socket() + */ +EVENT2_EXPORT_SYMBOL +struct evhttp_bound_socket *evhttp_accept_socket_with_handle(struct evhttp *http, evutil_socket_t fd); + +/** + * The most low-level evhttp_bind/accept method: takes an evconnlistener, and + * returns an evhttp_bound_socket. The listener will be freed when the bound + * socket is freed. + */ +EVENT2_EXPORT_SYMBOL +struct evhttp_bound_socket *evhttp_bind_listener(struct evhttp *http, struct evconnlistener *listener); + +/** + * Return the listener used to implement a bound socket. + */ +EVENT2_EXPORT_SYMBOL +struct evconnlistener *evhttp_bound_socket_get_listener(struct evhttp_bound_socket *bound); + +typedef void evhttp_bound_socket_foreach_fn(struct evhttp_bound_socket *, void *); +/** + * Applies the function specified in the first argument to all + * evhttp_bound_sockets associated with "http". The user must not + * attempt to free or remove any connections, sockets or listeners + * in the callback "function". + * + * @param http pointer to an evhttp object + * @param function function to apply to every bound socket + * @param argument pointer value passed to function for every socket iterated + */ +EVENT2_EXPORT_SYMBOL +void evhttp_foreach_bound_socket(struct evhttp *http, evhttp_bound_socket_foreach_fn *function, void *argument); + +/** + * Makes an HTTP server stop accepting connections on the specified socket + * + * This may be useful when a socket has been sent via file descriptor passing + * and is no longer needed by the current process. + * + * If you created this bound socket with evhttp_bind_socket_with_handle or + * evhttp_accept_socket_with_handle, this function closes the fd you provided. + * If you created this bound socket with evhttp_bind_listener, this function + * frees the listener you provided. + * + * \a bound_socket is an invalid pointer after this call returns. + * + * @param http a pointer to an evhttp object + * @param bound_socket a handle returned by evhttp_{bind,accept}_socket_with_handle + * @see evhttp_bind_socket_with_handle(), evhttp_accept_socket_with_handle() + */ +EVENT2_EXPORT_SYMBOL +void evhttp_del_accept_socket(struct evhttp *http, struct evhttp_bound_socket *bound_socket); + +/** + * Get the raw file descriptor referenced by an evhttp_bound_socket. + * + * @param bound_socket a handle returned by evhttp_{bind,accept}_socket_with_handle + * @return the file descriptor used by the bound socket + * @see evhttp_bind_socket_with_handle(), evhttp_accept_socket_with_handle() + */ +EVENT2_EXPORT_SYMBOL +evutil_socket_t evhttp_bound_socket_get_fd(struct evhttp_bound_socket *bound_socket); + +/** + * Free the previously created HTTP server. + * + * Works only if no requests are currently being served. + * + * @param http the evhttp server object to be freed + * @see evhttp_start() + */ +EVENT2_EXPORT_SYMBOL +void evhttp_free(struct evhttp* http); + +/** XXX Document. */ +EVENT2_EXPORT_SYMBOL +void evhttp_set_max_headers_size(struct evhttp* http, ev_ssize_t max_headers_size); +/** XXX Document. */ +EVENT2_EXPORT_SYMBOL +void evhttp_set_max_body_size(struct evhttp* http, ev_ssize_t max_body_size); + +/** + Set the value to use for the Content-Type header when none was provided. If + the content type string is NULL, the Content-Type header will not be + automatically added. + + @param http the http server on which to set the default content type + @param content_type the value for the Content-Type header +*/ +EVENT2_EXPORT_SYMBOL +void evhttp_set_default_content_type(struct evhttp *http, + const char *content_type); + +/** + Sets the what HTTP methods are supported in requests accepted by this + server, and passed to user callbacks. + + If not supported they will generate a "405 Method not allowed" response. + + By default this includes the following methods: GET, POST, HEAD, PUT, DELETE + + @param http the http server on which to set the methods + @param methods bit mask constructed from evhttp_cmd_type values +*/ +EVENT2_EXPORT_SYMBOL +void evhttp_set_allowed_methods(struct evhttp* http, ev_uint16_t methods); + +/** + Set a callback for a specified URI + + @param http the http sever on which to set the callback + @param path the path for which to invoke the callback + @param cb the callback function that gets invoked on requesting path + @param cb_arg an additional context argument for the callback + @return 0 on success, -1 if the callback existed already, -2 on failure +*/ +EVENT2_EXPORT_SYMBOL +int evhttp_set_cb(struct evhttp *http, const char *path, + void (*cb)(struct evhttp_request *, void *), void *cb_arg); + +/** Removes the callback for a specified URI */ +EVENT2_EXPORT_SYMBOL +int evhttp_del_cb(struct evhttp *, const char *); + +/** + Set a callback for all requests that are not caught by specific callbacks + + Invokes the specified callback for all requests that do not match any of + the previously specified request paths. This is catchall for requests not + specifically configured with evhttp_set_cb(). + + @param http the evhttp server object for which to set the callback + @param cb the callback to invoke for any unmatched requests + @param arg an context argument for the callback +*/ +EVENT2_EXPORT_SYMBOL +void evhttp_set_gencb(struct evhttp *http, + void (*cb)(struct evhttp_request *, void *), void *arg); + +/** + Set a callback used to create new bufferevents for connections + to a given evhttp object. + + You can use this to override the default bufferevent type -- for example, + to make this evhttp object use SSL bufferevents rather than unencrypted + ones. + + New bufferevents must be allocated with no fd set on them. + + @param http the evhttp server object for which to set the callback + @param cb the callback to invoke for incoming connections + @param arg an context argument for the callback + */ +EVENT2_EXPORT_SYMBOL +void evhttp_set_bevcb(struct evhttp *http, + struct bufferevent *(*cb)(struct event_base *, void *), void *arg); + +/** + Adds a virtual host to the http server. + + A virtual host is a newly initialized evhttp object that has request + callbacks set on it via evhttp_set_cb() or evhttp_set_gencb(). It + most not have any listing sockets associated with it. + + If the virtual host has not been removed by the time that evhttp_free() + is called on the main http server, it will be automatically freed, too. + + It is possible to have hierarchical vhosts. For example: A vhost + with the pattern *.example.com may have other vhosts with patterns + foo.example.com and bar.example.com associated with it. + + @param http the evhttp object to which to add a virtual host + @param pattern the glob pattern against which the hostname is matched. + The match is case insensitive and follows otherwise regular shell + matching. + @param vhost the virtual host to add the regular http server. + @return 0 on success, -1 on failure + @see evhttp_remove_virtual_host() +*/ +EVENT2_EXPORT_SYMBOL +int evhttp_add_virtual_host(struct evhttp* http, const char *pattern, + struct evhttp* vhost); + +/** + Removes a virtual host from the http server. + + @param http the evhttp object from which to remove the virtual host + @param vhost the virtual host to remove from the regular http server. + @return 0 on success, -1 on failure + @see evhttp_add_virtual_host() +*/ +EVENT2_EXPORT_SYMBOL +int evhttp_remove_virtual_host(struct evhttp* http, struct evhttp* vhost); + +/** + Add a server alias to an http object. The http object can be a virtual + host or the main server. + + @param http the evhttp object + @param alias the alias to add + @see evhttp_add_remove_alias() +*/ +EVENT2_EXPORT_SYMBOL +int evhttp_add_server_alias(struct evhttp *http, const char *alias); + +/** + Remove a server alias from an http object. + + @param http the evhttp object + @param alias the alias to remove + @see evhttp_add_server_alias() +*/ +EVENT2_EXPORT_SYMBOL +int evhttp_remove_server_alias(struct evhttp *http, const char *alias); + +/** + * Set the timeout for an HTTP request. + * + * @param http an evhttp object + * @param timeout_in_secs the timeout, in seconds + */ +EVENT2_EXPORT_SYMBOL +void evhttp_set_timeout(struct evhttp *http, int timeout_in_secs); + +/** + * Set the timeout for an HTTP request. + * + * @param http an evhttp object + * @param tv the timeout, or NULL + */ +EVENT2_EXPORT_SYMBOL +void evhttp_set_timeout_tv(struct evhttp *http, const struct timeval* tv); + +/* Read all the clients body, and only after this respond with an error if the + * clients body exceed max_body_size */ +#define EVHTTP_SERVER_LINGERING_CLOSE 0x0001 +/** + * Set connection flags for HTTP server. + * + * @see EVHTTP_SERVER_* + * @return 0 on success, otherwise non zero (for example if flag doesn't + * supported). + */ +EVENT2_EXPORT_SYMBOL +int evhttp_set_flags(struct evhttp *http, int flags); + +/* Request/Response functionality */ + +/** + * Send an HTML error message to the client. + * + * @param req a request object + * @param error the HTTP error code + * @param reason a brief explanation of the error. If this is NULL, we'll + * just use the standard meaning of the error code. + */ +EVENT2_EXPORT_SYMBOL +void evhttp_send_error(struct evhttp_request *req, int error, + const char *reason); + +/** + * Send an HTML reply to the client. + * + * The body of the reply consists of the data in databuf. After calling + * evhttp_send_reply() databuf will be empty, but the buffer is still + * owned by the caller and needs to be deallocated by the caller if + * necessary. + * + * @param req a request object + * @param code the HTTP response code to send + * @param reason a brief message to send with the response code + * @param databuf the body of the response + */ +EVENT2_EXPORT_SYMBOL +void evhttp_send_reply(struct evhttp_request *req, int code, + const char *reason, struct evbuffer *databuf); + +/* Low-level response interface, for streaming/chunked replies */ + +/** + Initiate a reply that uses Transfer-Encoding chunked. + + This allows the caller to stream the reply back to the client and is + useful when either not all of the reply data is immediately available + or when sending very large replies. + + The caller needs to supply data chunks with evhttp_send_reply_chunk() + and complete the reply by calling evhttp_send_reply_end(). + + @param req a request object + @param code the HTTP response code to send + @param reason a brief message to send with the response code +*/ +EVENT2_EXPORT_SYMBOL +void evhttp_send_reply_start(struct evhttp_request *req, int code, + const char *reason); + +/** + Send another data chunk as part of an ongoing chunked reply. + + The reply chunk consists of the data in databuf. After calling + evhttp_send_reply_chunk() databuf will be empty, but the buffer is + still owned by the caller and needs to be deallocated by the caller + if necessary. + + @param req a request object + @param databuf the data chunk to send as part of the reply. +*/ +EVENT2_EXPORT_SYMBOL +void evhttp_send_reply_chunk(struct evhttp_request *req, + struct evbuffer *databuf); + +/** + Send another data chunk as part of an ongoing chunked reply. + + The reply chunk consists of the data in databuf. After calling + evhttp_send_reply_chunk() databuf will be empty, but the buffer is + still owned by the caller and needs to be deallocated by the caller + if necessary. + + @param req a request object + @param databuf the data chunk to send as part of the reply. + @param cb callback funcion + @param call back's argument. +*/ +EVENT2_EXPORT_SYMBOL +void evhttp_send_reply_chunk_with_cb(struct evhttp_request *, struct evbuffer *, + void (*cb)(struct evhttp_connection *, void *), void *arg); + +/** + Complete a chunked reply, freeing the request as appropriate. + + @param req a request object +*/ +EVENT2_EXPORT_SYMBOL +void evhttp_send_reply_end(struct evhttp_request *req); + +/* + * Interfaces for making requests + */ + +/** The different request types supported by evhttp. These are as specified + * in RFC2616, except for PATCH which is specified by RFC5789. + * + * By default, only some of these methods are accepted and passed to user + * callbacks; use evhttp_set_allowed_methods() to change which methods + * are allowed. + */ +enum evhttp_cmd_type { + EVHTTP_REQ_GET = 1 << 0, + EVHTTP_REQ_POST = 1 << 1, + EVHTTP_REQ_HEAD = 1 << 2, + EVHTTP_REQ_PUT = 1 << 3, + EVHTTP_REQ_DELETE = 1 << 4, + EVHTTP_REQ_OPTIONS = 1 << 5, + EVHTTP_REQ_TRACE = 1 << 6, + EVHTTP_REQ_CONNECT = 1 << 7, + EVHTTP_REQ_PATCH = 1 << 8 +}; + +/** a request object can represent either a request or a reply */ +enum evhttp_request_kind { EVHTTP_REQUEST, EVHTTP_RESPONSE }; + +/** + * Create and return a connection object that can be used to for making HTTP + * requests. The connection object tries to resolve address and establish the + * connection when it is given an http request object. + * + * @param base the event_base to use for handling the connection + * @param dnsbase the dns_base to use for resolving host names; if not + * specified host name resolution will block. + * @param bev a bufferevent to use for connecting to the server; if NULL, a + * socket-based bufferevent will be created. This buffrevent will be freed + * when the connection closes. It must have no fd set on it. + * @param address the address to which to connect + * @param port the port to connect to + * @return an evhttp_connection object that can be used for making requests or + * NULL on error + */ +EVENT2_EXPORT_SYMBOL +struct evhttp_connection *evhttp_connection_base_bufferevent_new( + struct event_base *base, struct evdns_base *dnsbase, struct bufferevent* bev, const char *address, ev_uint16_t port); + +/** + * Return the bufferevent that an evhttp_connection is using. + */ +EVENT2_EXPORT_SYMBOL +struct bufferevent* evhttp_connection_get_bufferevent(struct evhttp_connection *evcon); + +/** + * Return the HTTP server associated with this connection, or NULL. + */ +EVENT2_EXPORT_SYMBOL +struct evhttp *evhttp_connection_get_server(struct evhttp_connection *evcon); + +/** + * Creates a new request object that needs to be filled in with the request + * parameters. The callback is executed when the request completed or an + * error occurred. + */ +EVENT2_EXPORT_SYMBOL +struct evhttp_request *evhttp_request_new( + void (*cb)(struct evhttp_request *, void *), void *arg); + +/** + * Enable delivery of chunks to requestor. + * @param cb will be called after every read of data with the same argument + * as the completion callback. Will never be called on an empty + * response. May drain the input buffer; it will be drained + * automatically on return. + */ +EVENT2_EXPORT_SYMBOL +void evhttp_request_set_chunked_cb(struct evhttp_request *, + void (*cb)(struct evhttp_request *, void *)); + +/** + * Register callback for additional parsing of request headers. + * @param cb will be called after receiving and parsing the full header. + * It allows analyzing the header and possibly closing the connection + * by returning a value < 0. + */ +EVENT2_EXPORT_SYMBOL +void evhttp_request_set_header_cb(struct evhttp_request *, + int (*cb)(struct evhttp_request *, void *)); + +/** + * The different error types supported by evhttp + * + * @see evhttp_request_set_error_cb() + */ +enum evhttp_request_error { + /** + * Timeout reached, also @see evhttp_connection_set_timeout() + */ + EVREQ_HTTP_TIMEOUT, + /** + * EOF reached + */ + EVREQ_HTTP_EOF, + /** + * Error while reading header, or invalid header + */ + EVREQ_HTTP_INVALID_HEADER, + /** + * Error encountered while reading or writing + */ + EVREQ_HTTP_BUFFER_ERROR, + /** + * The evhttp_cancel_request() called on this request. + */ + EVREQ_HTTP_REQUEST_CANCEL, + /** + * Body is greater then evhttp_connection_set_max_body_size() + */ + EVREQ_HTTP_DATA_TOO_LONG +}; +/** + * Set a callback for errors + * @see evhttp_request_error for error types. + * + * On error, both the error callback and the regular callback will be called, + * error callback is called before the regular callback. + **/ +EVENT2_EXPORT_SYMBOL +void evhttp_request_set_error_cb(struct evhttp_request *, + void (*)(enum evhttp_request_error, void *)); + +/** + * Set a callback to be called on request completion of evhttp_send_* function. + * + * The callback function will be called on the completion of the request after + * the output data has been written and before the evhttp_request object + * is destroyed. This can be useful for tracking resources associated with a + * request (ex: timing metrics). + * + * @param req a request object + * @param cb callback function that will be called on request completion + * @param cb_arg an additional context argument for the callback + */ +EVENT2_EXPORT_SYMBOL +void evhttp_request_set_on_complete_cb(struct evhttp_request *req, + void (*cb)(struct evhttp_request *, void *), void *cb_arg); + +/** Frees the request object and removes associated events. */ +EVENT2_EXPORT_SYMBOL +void evhttp_request_free(struct evhttp_request *req); + +/** + * Create and return a connection object that can be used to for making HTTP + * requests. The connection object tries to resolve address and establish the + * connection when it is given an http request object. + * + * @param base the event_base to use for handling the connection + * @param dnsbase the dns_base to use for resolving host names; if not + * specified host name resolution will block. + * @param address the address to which to connect + * @param port the port to connect to + * @return an evhttp_connection object that can be used for making requests or + * NULL on error + */ +EVENT2_EXPORT_SYMBOL +struct evhttp_connection *evhttp_connection_base_new( + struct event_base *base, struct evdns_base *dnsbase, + const char *address, ev_uint16_t port); + +/** + * Set family hint for DNS requests. + */ +EVENT2_EXPORT_SYMBOL +void evhttp_connection_set_family(struct evhttp_connection *evcon, + int family); + +/* reuse connection address on retry */ +#define EVHTTP_CON_REUSE_CONNECTED_ADDR 0x0008 +/* Try to read error, since server may already send and close + * connection, but if at that time we have some data to send then we + * can send get EPIPE and fail, while we can read that HTTP error. */ +#define EVHTTP_CON_READ_ON_WRITE_ERROR 0x0010 +/* @see EVHTTP_SERVER_LINGERING_CLOSE */ +#define EVHTTP_CON_LINGERING_CLOSE 0x0020 +/* Padding for public flags, @see EVHTTP_CON_* in http-internal.h */ +#define EVHTTP_CON_PUBLIC_FLAGS_END 0x100000 +/** + * Set connection flags. + * + * @see EVHTTP_CON_* + * @return 0 on success, otherwise non zero (for example if flag doesn't + * supported). + */ +EVENT2_EXPORT_SYMBOL +int evhttp_connection_set_flags(struct evhttp_connection *evcon, + int flags); + +/** Takes ownership of the request object + * + * Can be used in a request callback to keep onto the request until + * evhttp_request_free() is explicitly called by the user. + */ +EVENT2_EXPORT_SYMBOL +void evhttp_request_own(struct evhttp_request *req); + +/** Returns 1 if the request is owned by the user */ +EVENT2_EXPORT_SYMBOL +int evhttp_request_is_owned(struct evhttp_request *req); + +/** + * Returns the connection object associated with the request or NULL + * + * The user needs to either free the request explicitly or call + * evhttp_send_reply_end(). + */ +EVENT2_EXPORT_SYMBOL +struct evhttp_connection *evhttp_request_get_connection(struct evhttp_request *req); + +/** + * Returns the underlying event_base for this connection + */ +EVENT2_EXPORT_SYMBOL +struct event_base *evhttp_connection_get_base(struct evhttp_connection *req); + +EVENT2_EXPORT_SYMBOL +void evhttp_connection_set_max_headers_size(struct evhttp_connection *evcon, + ev_ssize_t new_max_headers_size); + +EVENT2_EXPORT_SYMBOL +void evhttp_connection_set_max_body_size(struct evhttp_connection* evcon, + ev_ssize_t new_max_body_size); + +/** Frees an http connection */ +EVENT2_EXPORT_SYMBOL +void evhttp_connection_free(struct evhttp_connection *evcon); + +/** Disowns a given connection object + * + * Can be used to tell libevent to free the connection object after + * the last request has completed or failed. + */ +EVENT2_EXPORT_SYMBOL +void evhttp_connection_free_on_completion(struct evhttp_connection *evcon); + +/** sets the ip address from which http connections are made */ +EVENT2_EXPORT_SYMBOL +void evhttp_connection_set_local_address(struct evhttp_connection *evcon, + const char *address); + +/** sets the local port from which http connections are made */ +EVENT2_EXPORT_SYMBOL +void evhttp_connection_set_local_port(struct evhttp_connection *evcon, + ev_uint16_t port); + +/** Sets the timeout in seconds for events related to this connection */ +EVENT2_EXPORT_SYMBOL +void evhttp_connection_set_timeout(struct evhttp_connection *evcon, + int timeout_in_secs); + +/** Sets the timeout for events related to this connection. Takes a struct + * timeval. */ +EVENT2_EXPORT_SYMBOL +void evhttp_connection_set_timeout_tv(struct evhttp_connection *evcon, + const struct timeval *tv); + +/** Sets the delay before retrying requests on this connection. This is only + * used if evhttp_connection_set_retries is used to make the number of retries + * at least one. Each retry after the first is twice as long as the one before + * it. */ +EVENT2_EXPORT_SYMBOL +void evhttp_connection_set_initial_retry_tv(struct evhttp_connection *evcon, + const struct timeval *tv); + +/** Sets the retry limit for this connection - -1 repeats indefinitely */ +EVENT2_EXPORT_SYMBOL +void evhttp_connection_set_retries(struct evhttp_connection *evcon, + int retry_max); + +/** Set a callback for connection close. */ +EVENT2_EXPORT_SYMBOL +void evhttp_connection_set_closecb(struct evhttp_connection *evcon, + void (*)(struct evhttp_connection *, void *), void *); + +/** Get the remote address and port associated with this connection. */ +EVENT2_EXPORT_SYMBOL +void evhttp_connection_get_peer(struct evhttp_connection *evcon, + char **address, ev_uint16_t *port); + +/** Get the remote address associated with this connection. + * extracted from getpeername() OR from nameserver. + * + * @return NULL if getpeername() return non success, + * or connection is not connected, + * otherwise it return pointer to struct sockaddr_storage */ +EVENT2_EXPORT_SYMBOL +const struct sockaddr* +evhttp_connection_get_addr(struct evhttp_connection *evcon); + +/** + Make an HTTP request over the specified connection. + + The connection gets ownership of the request. On failure, the + request object is no longer valid as it has been freed. + + @param evcon the evhttp_connection object over which to send the request + @param req the previously created and configured request object + @param type the request type EVHTTP_REQ_GET, EVHTTP_REQ_POST, etc. + @param uri the URI associated with the request + @return 0 on success, -1 on failure + @see evhttp_cancel_request() +*/ +EVENT2_EXPORT_SYMBOL +int evhttp_make_request(struct evhttp_connection *evcon, + struct evhttp_request *req, + enum evhttp_cmd_type type, const char *uri); + +/** + Cancels a pending HTTP request. + + Cancels an ongoing HTTP request. The callback associated with this request + is not executed and the request object is freed. If the request is + currently being processed, e.g. it is ongoing, the corresponding + evhttp_connection object is going to get reset. + + A request cannot be canceled if its callback has executed already. A request + may be canceled reentrantly from its chunked callback. + + @param req the evhttp_request to cancel; req becomes invalid after this call. +*/ +EVENT2_EXPORT_SYMBOL +void evhttp_cancel_request(struct evhttp_request *req); + +/** + * A structure to hold a parsed URI or Relative-Ref conforming to RFC3986. + */ +struct evhttp_uri; + +/** Returns the request URI */ +EVENT2_EXPORT_SYMBOL +const char *evhttp_request_get_uri(const struct evhttp_request *req); +/** Returns the request URI (parsed) */ +EVENT2_EXPORT_SYMBOL +const struct evhttp_uri *evhttp_request_get_evhttp_uri(const struct evhttp_request *req); +/** Returns the request command */ +EVENT2_EXPORT_SYMBOL +enum evhttp_cmd_type evhttp_request_get_command(const struct evhttp_request *req); + +EVENT2_EXPORT_SYMBOL +int evhttp_request_get_response_code(const struct evhttp_request *req); +EVENT2_EXPORT_SYMBOL +const char * evhttp_request_get_response_code_line(const struct evhttp_request *req); + +/** Returns the input headers */ +EVENT2_EXPORT_SYMBOL +struct evkeyvalq *evhttp_request_get_input_headers(struct evhttp_request *req); +/** Returns the output headers */ +EVENT2_EXPORT_SYMBOL +struct evkeyvalq *evhttp_request_get_output_headers(struct evhttp_request *req); +/** Returns the input buffer */ +EVENT2_EXPORT_SYMBOL +struct evbuffer *evhttp_request_get_input_buffer(struct evhttp_request *req); +/** Returns the output buffer */ +EVENT2_EXPORT_SYMBOL +struct evbuffer *evhttp_request_get_output_buffer(struct evhttp_request *req); +/** Returns the host associated with the request. If a client sends an absolute + URI, the host part of that is preferred. Otherwise, the input headers are + searched for a Host: header. NULL is returned if no absolute URI or Host: + header is provided. */ +EVENT2_EXPORT_SYMBOL +const char *evhttp_request_get_host(struct evhttp_request *req); + +/* Interfaces for dealing with HTTP headers */ + +/** + Finds the value belonging to a header. + + @param headers the evkeyvalq object in which to find the header + @param key the name of the header to find + @returns a pointer to the value for the header or NULL if the header + could not be found. + @see evhttp_add_header(), evhttp_remove_header() +*/ +EVENT2_EXPORT_SYMBOL +const char *evhttp_find_header(const struct evkeyvalq *headers, + const char *key); + +/** + Removes a header from a list of existing headers. + + @param headers the evkeyvalq object from which to remove a header + @param key the name of the header to remove + @returns 0 if the header was removed, -1 otherwise. + @see evhttp_find_header(), evhttp_add_header() +*/ +EVENT2_EXPORT_SYMBOL +int evhttp_remove_header(struct evkeyvalq *headers, const char *key); + +/** + Adds a header to a list of existing headers. + + @param headers the evkeyvalq object to which to add a header + @param key the name of the header + @param value the value belonging to the header + @returns 0 on success, -1 otherwise. + @see evhttp_find_header(), evhttp_clear_headers() +*/ +EVENT2_EXPORT_SYMBOL +int evhttp_add_header(struct evkeyvalq *headers, const char *key, const char *value); + +/** + Removes all headers from the header list. + + @param headers the evkeyvalq object from which to remove all headers +*/ +EVENT2_EXPORT_SYMBOL +void evhttp_clear_headers(struct evkeyvalq *headers); + +/* Miscellaneous utility functions */ + + +/** + Helper function to encode a string for inclusion in a URI. All + characters are replaced by their hex-escaped (%22) equivalents, + except for characters explicitly unreserved by RFC3986 -- that is, + ASCII alphanumeric characters, hyphen, dot, underscore, and tilde. + + The returned string must be freed by the caller. + + @param str an unencoded string + @return a newly allocated URI-encoded string or NULL on failure + */ +EVENT2_EXPORT_SYMBOL +char *evhttp_encode_uri(const char *str); + +/** + As evhttp_encode_uri, but if 'size' is nonnegative, treat the string + as being 'size' bytes long. This allows you to encode strings that + may contain 0-valued bytes. + + The returned string must be freed by the caller. + + @param str an unencoded string + @param size the length of the string to encode, or -1 if the string + is NUL-terminated + @param space_to_plus if true, space characters in 'str' are encoded + as +, not %20. + @return a newly allocate URI-encoded string, or NULL on failure. + */ +EVENT2_EXPORT_SYMBOL +char *evhttp_uriencode(const char *str, ev_ssize_t size, int space_to_plus); + +/** + Helper function to sort of decode a URI-encoded string. Unlike + evhttp_uridecode, it decodes all plus characters that appear + _after_ the first question mark character, but no plusses that occur + before. This is not a good way to decode URIs in whole or in part. + + The returned string must be freed by the caller + + @deprecated This function is deprecated; you probably want to use + evhttp_uridecode instead. + + @param uri an encoded URI + @return a newly allocated unencoded URI or NULL on failure + */ +EVENT2_EXPORT_SYMBOL +char *evhttp_decode_uri(const char *uri); + +/** + Helper function to decode a URI-escaped string or HTTP parameter. + + If 'decode_plus' is 1, then we decode the string as an HTTP parameter + value, and convert all plus ('+') characters to spaces. If + 'decode_plus' is 0, we leave all plus characters unchanged. + + The returned string must be freed by the caller. + + @param uri a URI-encode encoded URI + @param decode_plus determines whether we convert '+' to space. + @param size_out if size_out is not NULL, *size_out is set to the size of the + returned string + @return a newly allocated unencoded URI or NULL on failure + */ +EVENT2_EXPORT_SYMBOL +char *evhttp_uridecode(const char *uri, int decode_plus, + size_t *size_out); + +/** + Helper function to parse out arguments in a query. + + Parsing a URI like + + http://foo.com/?q=test&s=some+thing + + will result in two entries in the key value queue. + + The first entry is: key="q", value="test" + The second entry is: key="s", value="some thing" + + @deprecated This function is deprecated as of Libevent 2.0.9. Use + evhttp_uri_parse and evhttp_parse_query_str instead. + + @param uri the request URI + @param headers the head of the evkeyval queue + @return 0 on success, -1 on failure + */ +EVENT2_EXPORT_SYMBOL +int evhttp_parse_query(const char *uri, struct evkeyvalq *headers); + +/** + Helper function to parse out arguments from the query portion of an + HTTP URI. + + Parsing a query string like + + q=test&s=some+thing + + will result in two entries in the key value queue. + + The first entry is: key="q", value="test" + The second entry is: key="s", value="some thing" + + @param query_parse the query portion of the URI + @param headers the head of the evkeyval queue + @return 0 on success, -1 on failure + */ +EVENT2_EXPORT_SYMBOL +int evhttp_parse_query_str(const char *uri, struct evkeyvalq *headers); + +/** + * Escape HTML character entities in a string. + * + * Replaces <, >, ", ' and & with <, >, ", + * ' and & correspondingly. + * + * The returned string needs to be freed by the caller. + * + * @param html an unescaped HTML string + * @return an escaped HTML string or NULL on error + */ +EVENT2_EXPORT_SYMBOL +char *evhttp_htmlescape(const char *html); + +/** + * Return a new empty evhttp_uri with no fields set. + */ +EVENT2_EXPORT_SYMBOL +struct evhttp_uri *evhttp_uri_new(void); + +/** + * Changes the flags set on a given URI. See EVHTTP_URI_* for + * a list of flags. + **/ +EVENT2_EXPORT_SYMBOL +void evhttp_uri_set_flags(struct evhttp_uri *uri, unsigned flags); + +/** Return the scheme of an evhttp_uri, or NULL if there is no scheme has + * been set and the evhttp_uri contains a Relative-Ref. */ +EVENT2_EXPORT_SYMBOL +const char *evhttp_uri_get_scheme(const struct evhttp_uri *uri); +/** + * Return the userinfo part of an evhttp_uri, or NULL if it has no userinfo + * set. + */ +EVENT2_EXPORT_SYMBOL +const char *evhttp_uri_get_userinfo(const struct evhttp_uri *uri); +/** + * Return the host part of an evhttp_uri, or NULL if it has no host set. + * The host may either be a regular hostname (conforming to the RFC 3986 + * "regname" production), or an IPv4 address, or the empty string, or a + * bracketed IPv6 address, or a bracketed 'IP-Future' address. + * + * Note that having a NULL host means that the URI has no authority + * section, but having an empty-string host means that the URI has an + * authority section with no host part. For example, + * "mailto:user@example.com" has a host of NULL, but "file:///etc/motd" + * has a host of "". + */ +EVENT2_EXPORT_SYMBOL +const char *evhttp_uri_get_host(const struct evhttp_uri *uri); +/** Return the port part of an evhttp_uri, or -1 if there is no port set. */ +EVENT2_EXPORT_SYMBOL +int evhttp_uri_get_port(const struct evhttp_uri *uri); +/** Return the path part of an evhttp_uri, or NULL if it has no path set */ +EVENT2_EXPORT_SYMBOL +const char *evhttp_uri_get_path(const struct evhttp_uri *uri); +/** Return the query part of an evhttp_uri (excluding the leading "?"), or + * NULL if it has no query set */ +EVENT2_EXPORT_SYMBOL +const char *evhttp_uri_get_query(const struct evhttp_uri *uri); +/** Return the fragment part of an evhttp_uri (excluding the leading "#"), + * or NULL if it has no fragment set */ +EVENT2_EXPORT_SYMBOL +const char *evhttp_uri_get_fragment(const struct evhttp_uri *uri); + +/** Set the scheme of an evhttp_uri, or clear the scheme if scheme==NULL. + * Returns 0 on success, -1 if scheme is not well-formed. */ +EVENT2_EXPORT_SYMBOL +int evhttp_uri_set_scheme(struct evhttp_uri *uri, const char *scheme); +/** Set the userinfo of an evhttp_uri, or clear the userinfo if userinfo==NULL. + * Returns 0 on success, -1 if userinfo is not well-formed. */ +EVENT2_EXPORT_SYMBOL +int evhttp_uri_set_userinfo(struct evhttp_uri *uri, const char *userinfo); +/** Set the host of an evhttp_uri, or clear the host if host==NULL. + * Returns 0 on success, -1 if host is not well-formed. */ +EVENT2_EXPORT_SYMBOL +int evhttp_uri_set_host(struct evhttp_uri *uri, const char *host); +/** Set the port of an evhttp_uri, or clear the port if port==-1. + * Returns 0 on success, -1 if port is not well-formed. */ +EVENT2_EXPORT_SYMBOL +int evhttp_uri_set_port(struct evhttp_uri *uri, int port); +/** Set the path of an evhttp_uri, or clear the path if path==NULL. + * Returns 0 on success, -1 if path is not well-formed. */ +EVENT2_EXPORT_SYMBOL +int evhttp_uri_set_path(struct evhttp_uri *uri, const char *path); +/** Set the query of an evhttp_uri, or clear the query if query==NULL. + * The query should not include a leading "?". + * Returns 0 on success, -1 if query is not well-formed. */ +EVENT2_EXPORT_SYMBOL +int evhttp_uri_set_query(struct evhttp_uri *uri, const char *query); +/** Set the fragment of an evhttp_uri, or clear the fragment if fragment==NULL. + * The fragment should not include a leading "#". + * Returns 0 on success, -1 if fragment is not well-formed. */ +EVENT2_EXPORT_SYMBOL +int evhttp_uri_set_fragment(struct evhttp_uri *uri, const char *fragment); + +/** + * Helper function to parse a URI-Reference as specified by RFC3986. + * + * This function matches the URI-Reference production from RFC3986, + * which includes both URIs like + * + * scheme://[[userinfo]@]foo.com[:port]]/[path][?query][#fragment] + * + * and relative-refs like + * + * [path][?query][#fragment] + * + * Any optional elements portions not present in the original URI are + * left set to NULL in the resulting evhttp_uri. If no port is + * specified, the port is set to -1. + * + * Note that no decoding is performed on percent-escaped characters in + * the string; if you want to parse them, use evhttp_uridecode or + * evhttp_parse_query_str as appropriate. + * + * Note also that most URI schemes will have additional constraints that + * this function does not know about, and cannot check. For example, + * mailto://www.example.com/cgi-bin/fortune.pl is not a reasonable + * mailto url, http://www.example.com:99999/ is not a reasonable HTTP + * URL, and ftp:username@example.com is not a reasonable FTP URL. + * Nevertheless, all of these URLs conform to RFC3986, and this function + * accepts all of them as valid. + * + * @param source_uri the request URI + * @param flags Zero or more EVHTTP_URI_* flags to affect the behavior + * of the parser. + * @return uri container to hold parsed data, or NULL if there is error + * @see evhttp_uri_free() + */ +EVENT2_EXPORT_SYMBOL +struct evhttp_uri *evhttp_uri_parse_with_flags(const char *source_uri, + unsigned flags); + +/** Tolerate URIs that do not conform to RFC3986. + * + * Unfortunately, some HTTP clients generate URIs that, according to RFC3986, + * are not conformant URIs. If you need to support these URIs, you can + * do so by passing this flag to evhttp_uri_parse_with_flags. + * + * Currently, these changes are: + *
    + *
  • Nonconformant URIs are allowed to contain otherwise unreasonable + * characters in their path, query, and fragment components. + *
+ */ +#define EVHTTP_URI_NONCONFORMANT 0x01 + +/** Alias for evhttp_uri_parse_with_flags(source_uri, 0) */ +EVENT2_EXPORT_SYMBOL +struct evhttp_uri *evhttp_uri_parse(const char *source_uri); + +/** + * Free all memory allocated for a parsed uri. Only use this for URIs + * generated by evhttp_uri_parse. + * + * @param uri container with parsed data + * @see evhttp_uri_parse() + */ +EVENT2_EXPORT_SYMBOL +void evhttp_uri_free(struct evhttp_uri *uri); + +/** + * Join together the uri parts from parsed data to form a URI-Reference. + * + * Note that no escaping of reserved characters is done on the members + * of the evhttp_uri, so the generated string might not be a valid URI + * unless the members of evhttp_uri are themselves valid. + * + * @param uri container with parsed data + * @param buf destination buffer + * @param limit destination buffer size + * @return an joined uri as string or NULL on error + * @see evhttp_uri_parse() + */ +EVENT2_EXPORT_SYMBOL +char *evhttp_uri_join(struct evhttp_uri *uri, char *buf, size_t limit); + +#ifdef __cplusplus +} +#endif + +#endif /* EVENT2_HTTP_H_INCLUDED_ */ diff --git a/bsnes/thrift/libevent/include/event2/http_compat.h b/bsnes/thrift/libevent/include/event2/http_compat.h new file mode 100644 index 00000000..794a5810 --- /dev/null +++ b/bsnes/thrift/libevent/include/event2/http_compat.h @@ -0,0 +1,94 @@ +/* + * Copyright (c) 2000-2007 Niels Provos + * Copyright (c) 2007-2012 Niels Provos and Nick Mathewson + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +#ifndef EVENT2_HTTP_COMPAT_H_INCLUDED_ +#define EVENT2_HTTP_COMPAT_H_INCLUDED_ + +/** @file event2/http_compat.h + + Potentially non-threadsafe versions of the functions in http.h: provided + only for backwards compatibility. + + */ + +#ifdef __cplusplus +extern "C" { +#endif + +#include +#ifdef EVENT__HAVE_SYS_TYPES_H +#include +#endif +#ifdef EVENT__HAVE_SYS_TIME_H +#include +#endif + +/* For int types. */ +#include + +/** + * Start an HTTP server on the specified address and port + * + * @deprecated It does not allow an event base to be specified + * + * @param address the address to which the HTTP server should be bound + * @param port the port number on which the HTTP server should listen + * @return a pointer to a newly initialized evhttp server structure + * or NULL on error + */ +EVENT2_EXPORT_SYMBOL +struct evhttp *evhttp_start(const char *address, ev_uint16_t port); + +/** + * A connection object that can be used to for making HTTP requests. The + * connection object tries to establish the connection when it is given an + * http request object. + * + * @deprecated It does not allow an event base to be specified + */ +EVENT2_EXPORT_SYMBOL +struct evhttp_connection *evhttp_connection_new( + const char *address, ev_uint16_t port); + +/** + * Associates an event base with the connection - can only be called + * on a freshly created connection object that has not been used yet. + * + * @deprecated XXXX Why? + */ +EVENT2_EXPORT_SYMBOL +void evhttp_connection_set_base(struct evhttp_connection *evcon, + struct event_base *base); + + +/** Returns the request URI */ +#define evhttp_request_uri evhttp_request_get_uri + +#ifdef __cplusplus +} +#endif + +#endif /* EVENT2_EVENT_COMPAT_H_INCLUDED_ */ diff --git a/bsnes/thrift/libevent/include/event2/http_struct.h b/bsnes/thrift/libevent/include/event2/http_struct.h new file mode 100644 index 00000000..4bf5b1ff --- /dev/null +++ b/bsnes/thrift/libevent/include/event2/http_struct.h @@ -0,0 +1,152 @@ +/* + * Copyright (c) 2000-2007 Niels Provos + * Copyright (c) 2007-2012 Niels Provos and Nick Mathewson + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +#ifndef EVENT2_HTTP_STRUCT_H_INCLUDED_ +#define EVENT2_HTTP_STRUCT_H_INCLUDED_ + +/** @file event2/http_struct.h + + Data structures for http. Using these structures may hurt forward + compatibility with later versions of Libevent: be careful! + + */ + +#ifdef __cplusplus +extern "C" { +#endif + +#include +#ifdef EVENT__HAVE_SYS_TYPES_H +#include +#endif +#ifdef EVENT__HAVE_SYS_TIME_H +#include +#endif + +/* For int types. */ +#include + +/** + * the request structure that a server receives. + * WARNING: expect this structure to change. I will try to provide + * reasonable accessors. + */ +struct evhttp_request { +#if defined(TAILQ_ENTRY) + TAILQ_ENTRY(evhttp_request) next; +#else +struct { + struct evhttp_request *tqe_next; + struct evhttp_request **tqe_prev; +} next; +#endif + + /* the connection object that this request belongs to */ + struct evhttp_connection *evcon; + int flags; +/** The request obj owns the evhttp connection and needs to free it */ +#define EVHTTP_REQ_OWN_CONNECTION 0x0001 +/** Request was made via a proxy */ +#define EVHTTP_PROXY_REQUEST 0x0002 +/** The request object is owned by the user; the user must free it */ +#define EVHTTP_USER_OWNED 0x0004 +/** The request will be used again upstack; freeing must be deferred */ +#define EVHTTP_REQ_DEFER_FREE 0x0008 +/** The request should be freed upstack */ +#define EVHTTP_REQ_NEEDS_FREE 0x0010 + + struct evkeyvalq *input_headers; + struct evkeyvalq *output_headers; + + /* address of the remote host and the port connection came from */ + char *remote_host; + ev_uint16_t remote_port; + + /* cache of the hostname for evhttp_request_get_host */ + char *host_cache; + + enum evhttp_request_kind kind; + enum evhttp_cmd_type type; + + size_t headers_size; + size_t body_size; + + char *uri; /* uri after HTTP request was parsed */ + struct evhttp_uri *uri_elems; /* uri elements */ + + char major; /* HTTP Major number */ + char minor; /* HTTP Minor number */ + + int response_code; /* HTTP Response code */ + char *response_code_line; /* Readable response */ + + struct evbuffer *input_buffer; /* read data */ + ev_int64_t ntoread; + unsigned chunked:1, /* a chunked request */ + userdone:1; /* the user has sent all data */ + + struct evbuffer *output_buffer; /* outgoing post or data */ + + /* Callback */ + void (*cb)(struct evhttp_request *, void *); + void *cb_arg; + + /* + * Chunked data callback - call for each completed chunk if + * specified. If not specified, all the data is delivered via + * the regular callback. + */ + void (*chunk_cb)(struct evhttp_request *, void *); + + /* + * Callback added for forked-daapd so they can collect ICY + * (shoutcast) metadata from the http header. If return + * int is negative the connection will be closed. + */ + int (*header_cb)(struct evhttp_request *, void *); + + /* + * Error callback - called when error is occured. + * @see evhttp_request_error for error types. + * + * @see evhttp_request_set_error_cb() + */ + void (*error_cb)(enum evhttp_request_error, void *); + + /* + * Send complete callback - called when the request is actually + * sent and completed. + */ + void (*on_complete_cb)(struct evhttp_request *, void *); + void *on_complete_cb_arg; +}; + +#ifdef __cplusplus +} +#endif + +#endif /* EVENT2_HTTP_STRUCT_H_INCLUDED_ */ + diff --git a/bsnes/thrift/libevent/include/event2/keyvalq_struct.h b/bsnes/thrift/libevent/include/event2/keyvalq_struct.h new file mode 100644 index 00000000..bffa54b3 --- /dev/null +++ b/bsnes/thrift/libevent/include/event2/keyvalq_struct.h @@ -0,0 +1,80 @@ +/* + * Copyright (c) 2000-2007 Niels Provos + * Copyright (c) 2007-2012 Niels Provos and Nick Mathewson + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +#ifndef EVENT2_KEYVALQ_STRUCT_H_INCLUDED_ +#define EVENT2_KEYVALQ_STRUCT_H_INCLUDED_ + +#ifdef __cplusplus +extern "C" { +#endif + +/* Fix so that people don't have to run with */ +/* XXXX This code is duplicated with event_struct.h */ +#ifndef TAILQ_ENTRY +#define EVENT_DEFINED_TQENTRY_ +#define TAILQ_ENTRY(type) \ +struct { \ + struct type *tqe_next; /* next element */ \ + struct type **tqe_prev; /* address of previous next element */ \ +} +#endif /* !TAILQ_ENTRY */ + +#ifndef TAILQ_HEAD +#define EVENT_DEFINED_TQHEAD_ +#define TAILQ_HEAD(name, type) \ +struct name { \ + struct type *tqh_first; \ + struct type **tqh_last; \ +} +#endif + +/* + * Key-Value pairs. Can be used for HTTP headers but also for + * query argument parsing. + */ +struct evkeyval { + TAILQ_ENTRY(evkeyval) next; + + char *key; + char *value; +}; + +TAILQ_HEAD (evkeyvalq, evkeyval); + +/* XXXX This code is duplicated with event_struct.h */ +#ifdef EVENT_DEFINED_TQENTRY_ +#undef TAILQ_ENTRY +#endif + +#ifdef EVENT_DEFINED_TQHEAD_ +#undef TAILQ_HEAD +#endif + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/bsnes/thrift/libevent/include/event2/listener.h b/bsnes/thrift/libevent/include/event2/listener.h new file mode 100644 index 00000000..789a27c2 --- /dev/null +++ b/bsnes/thrift/libevent/include/event2/listener.h @@ -0,0 +1,192 @@ +/* + * Copyright (c) 2000-2007 Niels Provos + * Copyright (c) 2007-2012 Niels Provos and Nick Mathewson + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +#ifndef EVENT2_LISTENER_H_INCLUDED_ +#define EVENT2_LISTENER_H_INCLUDED_ + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +#include + +struct sockaddr; +struct evconnlistener; + +/** + A callback that we invoke when a listener has a new connection. + + @param listener The evconnlistener + @param fd The new file descriptor + @param addr The source address of the connection + @param socklen The length of addr + @param user_arg the pointer passed to evconnlistener_new() + */ +typedef void (*evconnlistener_cb)(struct evconnlistener *, evutil_socket_t, struct sockaddr *, int socklen, void *); + +/** + A callback that we invoke when a listener encounters a non-retriable error. + + @param listener The evconnlistener + @param user_arg the pointer passed to evconnlistener_new() + */ +typedef void (*evconnlistener_errorcb)(struct evconnlistener *, void *); + +/** Flag: Indicates that we should not make incoming sockets nonblocking + * before passing them to the callback. */ +#define LEV_OPT_LEAVE_SOCKETS_BLOCKING (1u<<0) +/** Flag: Indicates that freeing the listener should close the underlying + * socket. */ +#define LEV_OPT_CLOSE_ON_FREE (1u<<1) +/** Flag: Indicates that we should set the close-on-exec flag, if possible */ +#define LEV_OPT_CLOSE_ON_EXEC (1u<<2) +/** Flag: Indicates that we should disable the timeout (if any) between when + * this socket is closed and when we can listen again on the same port. */ +#define LEV_OPT_REUSEABLE (1u<<3) +/** Flag: Indicates that the listener should be locked so it's safe to use + * from multiple threadcs at once. */ +#define LEV_OPT_THREADSAFE (1u<<4) +/** Flag: Indicates that the listener should be created in disabled + * state. Use evconnlistener_enable() to enable it later. */ +#define LEV_OPT_DISABLED (1u<<5) +/** Flag: Indicates that the listener should defer accept() until data is + * available, if possible. Ignored on platforms that do not support this. + * + * This option can help performance for protocols where the client transmits + * immediately after connecting. Do not use this option if your protocol + * _doesn't_ start out with the client transmitting data, since in that case + * this option will sometimes cause the kernel to never tell you about the + * connection. + * + * This option is only supported by evconnlistener_new_bind(): it can't + * work with evconnlistener_new_fd(), since the listener needs to be told + * to use the option before it is actually bound. + */ +#define LEV_OPT_DEFERRED_ACCEPT (1u<<6) +/** Flag: Indicates that we ask to allow multiple servers (processes or + * threads) to bind to the same port if they each set the option. + * + * SO_REUSEPORT is what most people would expect SO_REUSEADDR to be, however + * SO_REUSEPORT does not imply SO_REUSEADDR. + * + * This is only available on Linux and kernel 3.9+ + */ +#define LEV_OPT_REUSEABLE_PORT (1u<<7) +/** Flag: Indicates that the listener wants to work only in IPv6 socket. + * + * According to RFC3493 and most Linux distributions, default value is to + * work in IPv4-mapped mode. If there is a requirement to bind same port + * on same ip addresses but different handlers for both IPv4 and IPv6, + * it is required to set IPV6_V6ONLY socket option to be sure that the + * code works as expected without affected by bindv6only sysctl setting in + * system. + * + * This socket option also supported by Windows. + */ +#define LEV_OPT_BIND_IPV6ONLY (1u<<8) + +/** + Allocate a new evconnlistener object to listen for incoming TCP connections + on a given file descriptor. + + @param base The event base to associate the listener with. + @param cb A callback to be invoked when a new connection arrives. If the + callback is NULL, the listener will be treated as disabled until the + callback is set. + @param ptr A user-supplied pointer to give to the callback. + @param flags Any number of LEV_OPT_* flags + @param backlog Passed to the listen() call to determine the length of the + acceptable connection backlog. Set to -1 for a reasonable default. + Set to 0 if the socket is already listening. + @param fd The file descriptor to listen on. It must be a nonblocking + file descriptor, and it should already be bound to an appropriate + port and address. +*/ +EVENT2_EXPORT_SYMBOL +struct evconnlistener *evconnlistener_new(struct event_base *base, + evconnlistener_cb cb, void *ptr, unsigned flags, int backlog, + evutil_socket_t fd); +/** + Allocate a new evconnlistener object to listen for incoming TCP connections + on a given address. + + @param base The event base to associate the listener with. + @param cb A callback to be invoked when a new connection arrives. If the + callback is NULL, the listener will be treated as disabled until the + callback is set. + @param ptr A user-supplied pointer to give to the callback. + @param flags Any number of LEV_OPT_* flags + @param backlog Passed to the listen() call to determine the length of the + acceptable connection backlog. Set to -1 for a reasonable default. + @param addr The address to listen for connections on. + @param socklen The length of the address. + */ +EVENT2_EXPORT_SYMBOL +struct evconnlistener *evconnlistener_new_bind(struct event_base *base, + evconnlistener_cb cb, void *ptr, unsigned flags, int backlog, + const struct sockaddr *sa, int socklen); +/** + Disable and deallocate an evconnlistener. + */ +EVENT2_EXPORT_SYMBOL +void evconnlistener_free(struct evconnlistener *lev); +/** + Re-enable an evconnlistener that has been disabled. + */ +EVENT2_EXPORT_SYMBOL +int evconnlistener_enable(struct evconnlistener *lev); +/** + Stop listening for connections on an evconnlistener. + */ +EVENT2_EXPORT_SYMBOL +int evconnlistener_disable(struct evconnlistener *lev); + +/** Return an evconnlistener's associated event_base. */ +EVENT2_EXPORT_SYMBOL +struct event_base *evconnlistener_get_base(struct evconnlistener *lev); + +/** Return the socket that an evconnlistner is listening on. */ +EVENT2_EXPORT_SYMBOL +evutil_socket_t evconnlistener_get_fd(struct evconnlistener *lev); + +/** Change the callback on the listener to cb and its user_data to arg. + */ +EVENT2_EXPORT_SYMBOL +void evconnlistener_set_cb(struct evconnlistener *lev, + evconnlistener_cb cb, void *arg); + +/** Set an evconnlistener's error callback. */ +EVENT2_EXPORT_SYMBOL +void evconnlistener_set_error_cb(struct evconnlistener *lev, + evconnlistener_errorcb errorcb); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/bsnes/thrift/libevent/include/event2/rpc.h b/bsnes/thrift/libevent/include/event2/rpc.h new file mode 100644 index 00000000..1bc31d57 --- /dev/null +++ b/bsnes/thrift/libevent/include/event2/rpc.h @@ -0,0 +1,626 @@ +/* + * Copyright (c) 2006-2007 Niels Provos + * Copyright (c) 2007-2012 Niels Provos and Nick Mathewson + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +#ifndef EVENT2_RPC_H_INCLUDED_ +#define EVENT2_RPC_H_INCLUDED_ + +/* For int types. */ +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/** @file rpc.h + * + * This header files provides basic support for an RPC server and client. + * + * To support RPCs in a server, every supported RPC command needs to be + * defined and registered. + * + * EVRPC_HEADER(SendCommand, Request, Reply); + * + * SendCommand is the name of the RPC command. + * Request is the name of a structure generated by event_rpcgen.py. + * It contains all parameters relating to the SendCommand RPC. The + * server needs to fill in the Reply structure. + * Reply is the name of a structure generated by event_rpcgen.py. It + * contains the answer to the RPC. + * + * To register an RPC with an HTTP server, you need to first create an RPC + * base with: + * + * struct evrpc_base *base = evrpc_init(http); + * + * A specific RPC can then be registered with + * + * EVRPC_REGISTER(base, SendCommand, Request, Reply, FunctionCB, arg); + * + * when the server receives an appropriately formatted RPC, the user callback + * is invoked. The callback needs to fill in the reply structure. + * + * void FunctionCB(EVRPC_STRUCT(SendCommand)* rpc, void *arg); + * + * To send the reply, call EVRPC_REQUEST_DONE(rpc); + * + * See the regression test for an example. + */ + +/** + Determines if the member has been set in the message + + @param msg the message to inspect + @param member the member variable to test for presences + @return 1 if it's present or 0 otherwise. +*/ +#define EVTAG_HAS(msg, member) \ + ((msg)->member##_set == 1) + +#ifndef EVENT2_RPC_COMPAT_H_INCLUDED_ + +/** + Assigns a value to the member in the message. + + @param msg the message to which to assign a value + @param member the name of the member variable + @param value the value to assign +*/ +#define EVTAG_ASSIGN(msg, member, value) \ + (*(msg)->base->member##_assign)((msg), (value)) +/** + Assigns a value to the member in the message. + + @param msg the message to which to assign a value + @param member the name of the member variable + @param value the value to assign + @param len the length of the value +*/ +#define EVTAG_ASSIGN_WITH_LEN(msg, member, value, len) \ + (*(msg)->base->member##_assign)((msg), (value), (len)) +/** + Returns the value for a member. + + @param msg the message from which to get the value + @param member the name of the member variable + @param pvalue a pointer to the variable to hold the value + @return 0 on success, -1 otherwise. +*/ +#define EVTAG_GET(msg, member, pvalue) \ + (*(msg)->base->member##_get)((msg), (pvalue)) +/** + Returns the value for a member. + + @param msg the message from which to get the value + @param member the name of the member variable + @param pvalue a pointer to the variable to hold the value + @param plen a pointer to the length of the value + @return 0 on success, -1 otherwise. +*/ +#define EVTAG_GET_WITH_LEN(msg, member, pvalue, plen) \ + (*(msg)->base->member##_get)((msg), (pvalue), (plen)) + +#endif /* EVENT2_RPC_COMPAT_H_INCLUDED_ */ + +/** + Adds a value to an array. +*/ +#define EVTAG_ARRAY_ADD_VALUE(msg, member, value) \ + (*(msg)->base->member##_add)((msg), (value)) +/** + Allocates a new entry in the array and returns it. +*/ +#define EVTAG_ARRAY_ADD(msg, member) \ + (*(msg)->base->member##_add)(msg) +/** + Gets a variable at the specified offset from the array. +*/ +#define EVTAG_ARRAY_GET(msg, member, offset, pvalue) \ + (*(msg)->base->member##_get)((msg), (offset), (pvalue)) +/** + Returns the number of entries in the array. +*/ +#define EVTAG_ARRAY_LEN(msg, member) ((msg)->member##_length) + + +struct evbuffer; +struct event_base; +struct evrpc_req_generic; +struct evrpc_request_wrapper; +struct evrpc; + +/** The type of a specific RPC Message + * + * @param rpcname the name of the RPC message + */ +#define EVRPC_STRUCT(rpcname) struct evrpc_req__##rpcname + +struct evhttp_request; +struct evrpc_status; +struct evrpc_hook_meta; + +/** Creates the definitions and prototypes for an RPC + * + * You need to use EVRPC_HEADER to create structures and function prototypes + * needed by the server and client implementation. The structures have to be + * defined in an .rpc file and converted to source code via event_rpcgen.py + * + * @param rpcname the name of the RPC + * @param reqstruct the name of the RPC request structure + * @param replystruct the name of the RPC reply structure + * @see EVRPC_GENERATE() + */ +#define EVRPC_HEADER(rpcname, reqstruct, rplystruct) \ +EVRPC_STRUCT(rpcname) { \ + struct evrpc_hook_meta *hook_meta; \ + struct reqstruct* request; \ + struct rplystruct* reply; \ + struct evrpc* rpc; \ + struct evhttp_request* http_req; \ + struct evbuffer* rpc_data; \ +}; \ +EVENT2_EXPORT_SYMBOL \ +int evrpc_send_request_##rpcname(struct evrpc_pool *, \ + struct reqstruct *, struct rplystruct *, \ + void (*)(struct evrpc_status *, \ + struct reqstruct *, struct rplystruct *, void *cbarg), \ + void *); + +struct evrpc_pool; + +/** use EVRPC_GENERATE instead */ +EVENT2_EXPORT_SYMBOL +struct evrpc_request_wrapper *evrpc_make_request_ctx( + struct evrpc_pool *pool, void *request, void *reply, + const char *rpcname, + void (*req_marshal)(struct evbuffer*, void *), + void (*rpl_clear)(void *), + int (*rpl_unmarshal)(void *, struct evbuffer *), + void (*cb)(struct evrpc_status *, void *, void *, void *), + void *cbarg); + +/** Creates a context structure that contains rpc specific information. + * + * EVRPC_MAKE_CTX is used to populate a RPC specific context that + * contains information about marshaling the RPC data types. + * + * @param rpcname the name of the RPC + * @param reqstruct the name of the RPC request structure + * @param replystruct the name of the RPC reply structure + * @param pool the evrpc_pool over which to make the request + * @param request a pointer to the RPC request structure object + * @param reply a pointer to the RPC reply structure object + * @param cb the callback function to call when the RPC has completed + * @param cbarg the argument to supply to the callback + */ +#define EVRPC_MAKE_CTX(rpcname, reqstruct, rplystruct, \ + pool, request, reply, cb, cbarg) \ + evrpc_make_request_ctx(pool, request, reply, \ + #rpcname, \ + (void (*)(struct evbuffer *, void *))reqstruct##_marshal, \ + (void (*)(void *))rplystruct##_clear, \ + (int (*)(void *, struct evbuffer *))rplystruct##_unmarshal, \ + (void (*)(struct evrpc_status *, void *, void *, void *))cb, \ + cbarg) + +/** Generates the code for receiving and sending an RPC message + * + * EVRPC_GENERATE is used to create the code corresponding to sending + * and receiving a particular RPC message + * + * @param rpcname the name of the RPC + * @param reqstruct the name of the RPC request structure + * @param replystruct the name of the RPC reply structure + * @see EVRPC_HEADER() + */ +#define EVRPC_GENERATE(rpcname, reqstruct, rplystruct) \ + int evrpc_send_request_##rpcname(struct evrpc_pool *pool, \ + struct reqstruct *request, struct rplystruct *reply, \ + void (*cb)(struct evrpc_status *, \ + struct reqstruct *, struct rplystruct *, void *cbarg), \ + void *cbarg) { \ + return evrpc_send_request_generic(pool, request, reply, \ + (void (*)(struct evrpc_status *, void *, void *, void *))cb, \ + cbarg, \ + #rpcname, \ + (void (*)(struct evbuffer *, void *))reqstruct##_marshal, \ + (void (*)(void *))rplystruct##_clear, \ + (int (*)(void *, struct evbuffer *))rplystruct##_unmarshal); \ +} + +/** Provides access to the HTTP request object underlying an RPC + * + * Access to the underlying http object; can be used to look at headers or + * for getting the remote ip address + * + * @param rpc_req the rpc request structure provided to the server callback + * @return an struct evhttp_request object that can be inspected for + * HTTP headers or sender information. + */ +#define EVRPC_REQUEST_HTTP(rpc_req) (rpc_req)->http_req + +/** completes the server response to an rpc request */ +EVENT2_EXPORT_SYMBOL +void evrpc_request_done(struct evrpc_req_generic *req); + +/** accessors for request and reply */ +EVENT2_EXPORT_SYMBOL +void *evrpc_get_request(struct evrpc_req_generic *req); +EVENT2_EXPORT_SYMBOL +void *evrpc_get_reply(struct evrpc_req_generic *req); + +/** Creates the reply to an RPC request + * + * EVRPC_REQUEST_DONE is used to answer a request; the reply is expected + * to have been filled in. The request and reply pointers become invalid + * after this call has finished. + * + * @param rpc_req the rpc request structure provided to the server callback + */ +#define EVRPC_REQUEST_DONE(rpc_req) do { \ + struct evrpc_req_generic *req_ = (struct evrpc_req_generic *)(rpc_req); \ + evrpc_request_done(req_); \ +} while (0) + + +struct evrpc_base; +struct evhttp; + +/* functions to start up the rpc system */ + +/** Creates a new rpc base from which RPC requests can be received + * + * @param server a pointer to an existing HTTP server + * @return a newly allocated evrpc_base struct or NULL if an error occurred + * @see evrpc_free() + */ +EVENT2_EXPORT_SYMBOL +struct evrpc_base *evrpc_init(struct evhttp *server); + +/** + * Frees the evrpc base + * + * For now, you are responsible for making sure that no rpcs are ongoing. + * + * @param base the evrpc_base object to be freed + * @see evrpc_init + */ +EVENT2_EXPORT_SYMBOL +void evrpc_free(struct evrpc_base *base); + +/** register RPCs with the HTTP Server + * + * registers a new RPC with the HTTP server, each RPC needs to have + * a unique name under which it can be identified. + * + * @param base the evrpc_base structure in which the RPC should be + * registered. + * @param name the name of the RPC + * @param request the name of the RPC request structure + * @param reply the name of the RPC reply structure + * @param callback the callback that should be invoked when the RPC + * is received. The callback has the following prototype + * void (*callback)(EVRPC_STRUCT(Message)* rpc, void *arg) + * @param cbarg an additional parameter that can be passed to the callback. + * The parameter can be used to carry around state. + */ +#define EVRPC_REGISTER(base, name, request, reply, callback, cbarg) \ + evrpc_register_generic(base, #name, \ + (void (*)(struct evrpc_req_generic *, void *))callback, cbarg, \ + (void *(*)(void *))request##_new_with_arg, NULL, \ + (void (*)(void *))request##_free, \ + (int (*)(void *, struct evbuffer *))request##_unmarshal, \ + (void *(*)(void *))reply##_new_with_arg, NULL, \ + (void (*)(void *))reply##_free, \ + (int (*)(void *))reply##_complete, \ + (void (*)(struct evbuffer *, void *))reply##_marshal) + +/** + Low level function for registering an RPC with a server. + + Use EVRPC_REGISTER() instead. + + @see EVRPC_REGISTER() +*/ +EVENT2_EXPORT_SYMBOL +int evrpc_register_rpc(struct evrpc_base *, struct evrpc *, + void (*)(struct evrpc_req_generic*, void *), void *); + +/** + * Unregisters an already registered RPC + * + * @param base the evrpc_base object from which to unregister an RPC + * @param name the name of the rpc to unregister + * @return -1 on error or 0 when successful. + * @see EVRPC_REGISTER() + */ +#define EVRPC_UNREGISTER(base, name) evrpc_unregister_rpc((base), #name) + +EVENT2_EXPORT_SYMBOL +int evrpc_unregister_rpc(struct evrpc_base *base, const char *name); + +/* + * Client-side RPC support + */ + +struct evhttp_connection; +struct evrpc_status; + +/** launches an RPC and sends it to the server + * + * EVRPC_MAKE_REQUEST() is used by the client to send an RPC to the server. + * + * @param name the name of the RPC + * @param pool the evrpc_pool that contains the connection objects over which + * the request should be sent. + * @param request a pointer to the RPC request structure - it contains the + * data to be sent to the server. + * @param reply a pointer to the RPC reply structure. It is going to be filled + * if the request was answered successfully + * @param cb the callback to invoke when the RPC request has been answered + * @param cbarg an additional argument to be passed to the client + * @return 0 on success, -1 on failure + */ +#define EVRPC_MAKE_REQUEST(name, pool, request, reply, cb, cbarg) \ + evrpc_send_request_##name((pool), (request), (reply), (cb), (cbarg)) + +/** + Makes an RPC request based on the provided context. + + This is a low-level function and should not be used directly + unless a custom context object is provided. Use EVRPC_MAKE_REQUEST() + instead. + + @param ctx a context from EVRPC_MAKE_CTX() + @returns 0 on success, -1 otherwise. + @see EVRPC_MAKE_REQUEST(), EVRPC_MAKE_CTX() +*/ +EVENT2_EXPORT_SYMBOL +int evrpc_make_request(struct evrpc_request_wrapper *ctx); + +/** creates an rpc connection pool + * + * a pool has a number of connections associated with it. + * rpc requests are always made via a pool. + * + * @param base a pointer to an struct event_based object; can be left NULL + * in singled-threaded applications + * @return a newly allocated struct evrpc_pool object or NULL if an error + * occurred + * @see evrpc_pool_free() + */ +EVENT2_EXPORT_SYMBOL +struct evrpc_pool *evrpc_pool_new(struct event_base *base); +/** frees an rpc connection pool + * + * @param pool a pointer to an evrpc_pool allocated via evrpc_pool_new() + * @see evrpc_pool_new() + */ +EVENT2_EXPORT_SYMBOL +void evrpc_pool_free(struct evrpc_pool *pool); + +/** + * Adds a connection over which rpc can be dispatched to the pool. + * + * The connection object must have been newly created. + * + * @param pool the pool to which to add the connection + * @param evcon the connection to add to the pool. + */ +EVENT2_EXPORT_SYMBOL +void evrpc_pool_add_connection(struct evrpc_pool *pool, + struct evhttp_connection *evcon); + +/** + * Removes a connection from the pool. + * + * The connection object must have been newly created. + * + * @param pool the pool from which to remove the connection + * @param evcon the connection to remove from the pool. + */ +EVENT2_EXPORT_SYMBOL +void evrpc_pool_remove_connection(struct evrpc_pool *pool, + struct evhttp_connection *evcon); + +/** + * Sets the timeout in secs after which a request has to complete. The + * RPC is completely aborted if it does not complete by then. Setting + * the timeout to 0 means that it never timeouts and can be used to + * implement callback type RPCs. + * + * Any connection already in the pool will be updated with the new + * timeout. Connections added to the pool after set_timeout has be + * called receive the pool timeout only if no timeout has been set + * for the connection itself. + * + * @param pool a pointer to a struct evrpc_pool object + * @param timeout_in_secs the number of seconds after which a request should + * timeout and a failure be returned to the callback. + */ +EVENT2_EXPORT_SYMBOL +void evrpc_pool_set_timeout(struct evrpc_pool *pool, int timeout_in_secs); + +/** + * Hooks for changing the input and output of RPCs; this can be used to + * implement compression, authentication, encryption, ... + */ + +enum EVRPC_HOOK_TYPE { + EVRPC_INPUT, /**< apply the function to an input hook */ + EVRPC_OUTPUT /**< apply the function to an output hook */ +}; + +#ifndef _WIN32 +/** Deprecated alias for EVRPC_INPUT. Not available on windows, where it + * conflicts with platform headers. */ +#define INPUT EVRPC_INPUT +/** Deprecated alias for EVRPC_OUTPUT. Not available on windows, where it + * conflicts with platform headers. */ +#define OUTPUT EVRPC_OUTPUT +#endif + +/** + * Return value from hook processing functions + */ + +enum EVRPC_HOOK_RESULT { + EVRPC_TERMINATE = -1, /**< indicates the rpc should be terminated */ + EVRPC_CONTINUE = 0, /**< continue processing the rpc */ + EVRPC_PAUSE = 1 /**< pause processing request until resumed */ +}; + +/** adds a processing hook to either an rpc base or rpc pool + * + * If a hook returns TERMINATE, the processing is aborted. On CONTINUE, + * the request is immediately processed after the hook returns. If the + * hook returns PAUSE, request processing stops until evrpc_resume_request() + * has been called. + * + * The add functions return handles that can be used for removing hooks. + * + * @param vbase a pointer to either struct evrpc_base or struct evrpc_pool + * @param hook_type either INPUT or OUTPUT + * @param cb the callback to call when the hook is activated + * @param cb_arg an additional argument for the callback + * @return a handle to the hook so it can be removed later + * @see evrpc_remove_hook() + */ +EVENT2_EXPORT_SYMBOL +void *evrpc_add_hook(void *vbase, + enum EVRPC_HOOK_TYPE hook_type, + int (*cb)(void *, struct evhttp_request *, struct evbuffer *, void *), + void *cb_arg); + +/** removes a previously added hook + * + * @param vbase a pointer to either struct evrpc_base or struct evrpc_pool + * @param hook_type either INPUT or OUTPUT + * @param handle a handle returned by evrpc_add_hook() + * @return 1 on success or 0 on failure + * @see evrpc_add_hook() + */ +EVENT2_EXPORT_SYMBOL +int evrpc_remove_hook(void *vbase, + enum EVRPC_HOOK_TYPE hook_type, + void *handle); + +/** resume a paused request + * + * @param vbase a pointer to either struct evrpc_base or struct evrpc_pool + * @param ctx the context pointer provided to the original hook call + */ +EVENT2_EXPORT_SYMBOL +int evrpc_resume_request(void *vbase, void *ctx, enum EVRPC_HOOK_RESULT res); + +/** adds meta data to request + * + * evrpc_hook_add_meta() allows hooks to add meta data to a request. for + * a client request, the meta data can be inserted by an outgoing request hook + * and retrieved by the incoming request hook. + * + * @param ctx the context provided to the hook call + * @param key a NUL-terminated c-string + * @param data the data to be associated with the key + * @param data_size the size of the data + */ +EVENT2_EXPORT_SYMBOL +void evrpc_hook_add_meta(void *ctx, const char *key, + const void *data, size_t data_size); + +/** retrieves meta data previously associated + * + * evrpc_hook_find_meta() can be used to retrieve meta data associated to a + * request by a previous hook. + * @param ctx the context provided to the hook call + * @param key a NUL-terminated c-string + * @param data pointer to a data pointer that will contain the retrieved data + * @param data_size pointer to the size of the data + * @return 0 on success or -1 on failure + */ +EVENT2_EXPORT_SYMBOL +int evrpc_hook_find_meta(void *ctx, const char *key, + void **data, size_t *data_size); + +/** + * returns the connection object associated with the request + * + * @param ctx the context provided to the hook call + * @return a pointer to the evhttp_connection object or NULL if an error + * occurred + */ +EVENT2_EXPORT_SYMBOL +struct evhttp_connection *evrpc_hook_get_connection(void *ctx); + +/** + Function for sending a generic RPC request. + + Do not call this function directly, use EVRPC_MAKE_REQUEST() instead. + + @see EVRPC_MAKE_REQUEST() + */ +EVENT2_EXPORT_SYMBOL +int evrpc_send_request_generic(struct evrpc_pool *pool, + void *request, void *reply, + void (*cb)(struct evrpc_status *, void *, void *, void *), + void *cb_arg, + const char *rpcname, + void (*req_marshal)(struct evbuffer *, void *), + void (*rpl_clear)(void *), + int (*rpl_unmarshal)(void *, struct evbuffer *)); + +/** + Function for registering a generic RPC with the RPC base. + + Do not call this function directly, use EVRPC_REGISTER() instead. + + @see EVRPC_REGISTER() + */ +EVENT2_EXPORT_SYMBOL +int evrpc_register_generic(struct evrpc_base *base, const char *name, + void (*callback)(struct evrpc_req_generic *, void *), void *cbarg, + void *(*req_new)(void *), void *req_new_arg, void (*req_free)(void *), + int (*req_unmarshal)(void *, struct evbuffer *), + void *(*rpl_new)(void *), void *rpl_new_arg, void (*rpl_free)(void *), + int (*rpl_complete)(void *), + void (*rpl_marshal)(struct evbuffer *, void *)); + +/** accessors for obscure and undocumented functionality */ +EVENT2_EXPORT_SYMBOL +struct evrpc_pool* evrpc_request_get_pool(struct evrpc_request_wrapper *ctx); +EVENT2_EXPORT_SYMBOL +void evrpc_request_set_pool(struct evrpc_request_wrapper *ctx, + struct evrpc_pool *pool); +EVENT2_EXPORT_SYMBOL +void evrpc_request_set_cb(struct evrpc_request_wrapper *ctx, + void (*cb)(struct evrpc_status*, void *request, void *reply, void *arg), + void *cb_arg); + +#ifdef __cplusplus +} +#endif + +#endif /* EVENT2_RPC_H_INCLUDED_ */ diff --git a/bsnes/thrift/libevent/include/event2/rpc_compat.h b/bsnes/thrift/libevent/include/event2/rpc_compat.h new file mode 100644 index 00000000..8d8334d2 --- /dev/null +++ b/bsnes/thrift/libevent/include/event2/rpc_compat.h @@ -0,0 +1,61 @@ +/* + * Copyright (c) 2006-2007 Niels Provos + * Copyright (c) 2007-2012 Niels Provos and Nick Mathewson + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +#ifndef EVENT2_RPC_COMPAT_H_INCLUDED_ +#define EVENT2_RPC_COMPAT_H_INCLUDED_ + +/** @file event2/rpc_compat.h + + Deprecated versions of the functions in rpc.h: provided only for + backwards compatibility. + + */ + +#ifdef __cplusplus +extern "C" { +#endif + +/** backwards compatible accessors that work only with gcc */ +#if defined(__GNUC__) && !defined(__STRICT_ANSI__) + +#undef EVTAG_ASSIGN +#undef EVTAG_GET +#undef EVTAG_ADD + +#define EVTAG_ASSIGN(msg, member, args...) \ + (*(msg)->base->member##_assign)(msg, ## args) +#define EVTAG_GET(msg, member, args...) \ + (*(msg)->base->member##_get)(msg, ## args) +#define EVTAG_ADD(msg, member, args...) \ + (*(msg)->base->member##_add)(msg, ## args) +#endif +#define EVTAG_LEN(msg, member) ((msg)->member##_length) + +#ifdef __cplusplus +} +#endif + +#endif /* EVENT2_EVENT_COMPAT_H_INCLUDED_ */ diff --git a/bsnes/thrift/libevent/include/event2/rpc_struct.h b/bsnes/thrift/libevent/include/event2/rpc_struct.h new file mode 100644 index 00000000..f3cb460a --- /dev/null +++ b/bsnes/thrift/libevent/include/event2/rpc_struct.h @@ -0,0 +1,114 @@ +/* + * Copyright (c) 2006-2007 Niels Provos + * Copyright (c) 2007-2012 Niels Provos and Nick Mathewson + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +#ifndef EVENT2_RPC_STRUCT_H_INCLUDED_ +#define EVENT2_RPC_STRUCT_H_INCLUDED_ + +#ifdef __cplusplus +extern "C" { +#endif + +/** @file event2/rpc_struct.h + + Structures used by rpc.h. Using these structures directly may harm + forward compatibility: be careful! + + */ + +/* Fix so that people don't have to run with */ +#ifndef TAILQ_ENTRY +#define EVENT_DEFINED_TQENTRY_ +#define TAILQ_ENTRY(type) \ +struct { \ + struct type *tqe_next; /* next element */ \ + struct type **tqe_prev; /* address of previous next element */ \ +} +#endif /* !TAILQ_ENTRY */ + +/** + * provides information about the completed RPC request. + */ +struct evrpc_status { +#define EVRPC_STATUS_ERR_NONE 0 +#define EVRPC_STATUS_ERR_TIMEOUT 1 +#define EVRPC_STATUS_ERR_BADPAYLOAD 2 +#define EVRPC_STATUS_ERR_UNSTARTED 3 +#define EVRPC_STATUS_ERR_HOOKABORTED 4 + int error; + + /* for looking at headers or other information */ + struct evhttp_request *http_req; +}; + +/* the structure below needs to be synchronized with evrpc_req_generic */ + +/* Encapsulates a request */ +struct evrpc { + TAILQ_ENTRY(evrpc) next; + + /* the URI at which the request handler lives */ + const char* uri; + + /* creates a new request structure */ + void *(*request_new)(void *); + void *request_new_arg; + + /* frees the request structure */ + void (*request_free)(void *); + + /* unmarshals the buffer into the proper request structure */ + int (*request_unmarshal)(void *, struct evbuffer *); + + /* creates a new reply structure */ + void *(*reply_new)(void *); + void *reply_new_arg; + + /* frees the reply structure */ + void (*reply_free)(void *); + + /* verifies that the reply is valid */ + int (*reply_complete)(void *); + + /* marshals the reply into a buffer */ + void (*reply_marshal)(struct evbuffer*, void *); + + /* the callback invoked for each received rpc */ + void (*cb)(struct evrpc_req_generic *, void *); + void *cb_arg; + + /* reference for further configuration */ + struct evrpc_base *base; +}; + +#ifdef EVENT_DEFINED_TQENTRY_ +#undef TAILQ_ENTRY +#endif + +#ifdef __cplusplus +} +#endif + +#endif /* EVENT2_RPC_STRUCT_H_INCLUDED_ */ diff --git a/bsnes/thrift/libevent/include/event2/tag.h b/bsnes/thrift/libevent/include/event2/tag.h new file mode 100644 index 00000000..2f73bfc0 --- /dev/null +++ b/bsnes/thrift/libevent/include/event2/tag.h @@ -0,0 +1,146 @@ +/* + * Copyright (c) 2000-2007 Niels Provos + * Copyright (c) 2007-2012 Niels Provos and Nick Mathewson + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +#ifndef EVENT2_TAG_H_INCLUDED_ +#define EVENT2_TAG_H_INCLUDED_ + +/** @file event2/tag.h + + Helper functions for reading and writing tagged data onto buffers. + + */ + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +#include +#ifdef EVENT__HAVE_SYS_TYPES_H +#include +#endif +#ifdef EVENT__HAVE_SYS_TIME_H +#include +#endif + +/* For int types. */ +#include + +struct evbuffer; + +/* + * Marshaling tagged data - We assume that all tags are inserted in their + * numeric order - so that unknown tags will always be higher than the + * known ones - and we can just ignore the end of an event buffer. + */ + +EVENT2_EXPORT_SYMBOL +void evtag_init(void); + +/** + Unmarshals the header and returns the length of the payload + + @param evbuf the buffer from which to unmarshal data + @param ptag a pointer in which the tag id is being stored + @returns -1 on failure or the number of bytes in the remaining payload. +*/ +EVENT2_EXPORT_SYMBOL +int evtag_unmarshal_header(struct evbuffer *evbuf, ev_uint32_t *ptag); + +EVENT2_EXPORT_SYMBOL +void evtag_marshal(struct evbuffer *evbuf, ev_uint32_t tag, const void *data, + ev_uint32_t len); +EVENT2_EXPORT_SYMBOL +void evtag_marshal_buffer(struct evbuffer *evbuf, ev_uint32_t tag, + struct evbuffer *data); + +/** + Encode an integer and store it in an evbuffer. + + We encode integers by nybbles; the first nibble contains the number + of significant nibbles - 1; this allows us to encode up to 64-bit + integers. This function is byte-order independent. + + @param evbuf evbuffer to store the encoded number + @param number a 32-bit integer + */ +EVENT2_EXPORT_SYMBOL +void evtag_encode_int(struct evbuffer *evbuf, ev_uint32_t number); +EVENT2_EXPORT_SYMBOL +void evtag_encode_int64(struct evbuffer *evbuf, ev_uint64_t number); + +EVENT2_EXPORT_SYMBOL +void evtag_marshal_int(struct evbuffer *evbuf, ev_uint32_t tag, + ev_uint32_t integer); +EVENT2_EXPORT_SYMBOL +void evtag_marshal_int64(struct evbuffer *evbuf, ev_uint32_t tag, + ev_uint64_t integer); + +EVENT2_EXPORT_SYMBOL +void evtag_marshal_string(struct evbuffer *buf, ev_uint32_t tag, + const char *string); + +EVENT2_EXPORT_SYMBOL +void evtag_marshal_timeval(struct evbuffer *evbuf, ev_uint32_t tag, + struct timeval *tv); + +EVENT2_EXPORT_SYMBOL +int evtag_unmarshal(struct evbuffer *src, ev_uint32_t *ptag, + struct evbuffer *dst); +EVENT2_EXPORT_SYMBOL +int evtag_peek(struct evbuffer *evbuf, ev_uint32_t *ptag); +EVENT2_EXPORT_SYMBOL +int evtag_peek_length(struct evbuffer *evbuf, ev_uint32_t *plength); +EVENT2_EXPORT_SYMBOL +int evtag_payload_length(struct evbuffer *evbuf, ev_uint32_t *plength); +EVENT2_EXPORT_SYMBOL +int evtag_consume(struct evbuffer *evbuf); + +EVENT2_EXPORT_SYMBOL +int evtag_unmarshal_int(struct evbuffer *evbuf, ev_uint32_t need_tag, + ev_uint32_t *pinteger); +EVENT2_EXPORT_SYMBOL +int evtag_unmarshal_int64(struct evbuffer *evbuf, ev_uint32_t need_tag, + ev_uint64_t *pinteger); + +EVENT2_EXPORT_SYMBOL +int evtag_unmarshal_fixed(struct evbuffer *src, ev_uint32_t need_tag, + void *data, size_t len); + +EVENT2_EXPORT_SYMBOL +int evtag_unmarshal_string(struct evbuffer *evbuf, ev_uint32_t need_tag, + char **pstring); + +EVENT2_EXPORT_SYMBOL +int evtag_unmarshal_timeval(struct evbuffer *evbuf, ev_uint32_t need_tag, + struct timeval *ptv); + +#ifdef __cplusplus +} +#endif + +#endif /* EVENT2_TAG_H_INCLUDED_ */ diff --git a/bsnes/thrift/libevent/include/event2/tag_compat.h b/bsnes/thrift/libevent/include/event2/tag_compat.h new file mode 100644 index 00000000..a276c0d3 --- /dev/null +++ b/bsnes/thrift/libevent/include/event2/tag_compat.h @@ -0,0 +1,49 @@ +/* + * Copyright (c) 2000-2007 Niels Provos + * Copyright (c) 2007-2012 Niels Provos and Nick Mathewson + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +#ifndef EVENT2_TAG_COMPAT_H_INCLUDED_ +#define EVENT2_TAG_COMPAT_H_INCLUDED_ + +/** @file event2/tag_compat.h + + Obsolete/deprecated functions from tag.h; provided only for backwards + compatibility. + */ + +/** + @name Misnamed functions + + @deprecated These macros are deprecated because their names don't follow + Libevent's naming conventions. Use evtag_encode_int and + evtag_encode_int64 instead. + + @{ +*/ +#define encode_int(evbuf, number) evtag_encode_int((evbuf), (number)) +#define encode_int64(evbuf, number) evtag_encode_int64((evbuf), (number)) +/**@}*/ + +#endif /* EVENT2_TAG_H_INCLUDED_ */ diff --git a/bsnes/thrift/libevent/include/event2/thread.h b/bsnes/thrift/libevent/include/event2/thread.h new file mode 100644 index 00000000..b5199863 --- /dev/null +++ b/bsnes/thrift/libevent/include/event2/thread.h @@ -0,0 +1,253 @@ +/* + * Copyright (c) 2008-2012 Niels Provos and Nick Mathewson + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +#ifndef EVENT2_THREAD_H_INCLUDED_ +#define EVENT2_THREAD_H_INCLUDED_ + +/** @file event2/thread.h + + Functions for multi-threaded applications using Libevent. + + When using a multi-threaded application in which multiple threads + add and delete events from a single event base, Libevent needs to + lock its data structures. + + Like the memory-management function hooks, all of the threading functions + _must_ be set up before an event_base is created if you want the base to + use them. + + Most programs will either be using Windows threads or Posix threads. You + can configure Libevent to use one of these event_use_windows_threads() or + event_use_pthreads() respectively. If you're using another threading + library, you'll need to configure threading functions manually using + evthread_set_lock_callbacks() and evthread_set_condition_callbacks(). + + */ + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +#include + +/** + @name Flags passed to lock functions + + @{ +*/ +/** A flag passed to a locking callback when the lock was allocated as a + * read-write lock, and we want to acquire or release the lock for writing. */ +#define EVTHREAD_WRITE 0x04 +/** A flag passed to a locking callback when the lock was allocated as a + * read-write lock, and we want to acquire or release the lock for reading. */ +#define EVTHREAD_READ 0x08 +/** A flag passed to a locking callback when we don't want to block waiting + * for the lock; if we can't get the lock immediately, we will instead + * return nonzero from the locking callback. */ +#define EVTHREAD_TRY 0x10 +/**@}*/ + +#if !defined(EVENT__DISABLE_THREAD_SUPPORT) || defined(EVENT_IN_DOXYGEN_) + +#define EVTHREAD_LOCK_API_VERSION 1 + +/** + @name Types of locks + + @{*/ +/** A recursive lock is one that can be acquired multiple times at once by the + * same thread. No other process can allocate the lock until the thread that + * has been holding it has unlocked it as many times as it locked it. */ +#define EVTHREAD_LOCKTYPE_RECURSIVE 1 +/* A read-write lock is one that allows multiple simultaneous readers, but + * where any one writer excludes all other writers and readers. */ +#define EVTHREAD_LOCKTYPE_READWRITE 2 +/**@}*/ + +/** This structure describes the interface a threading library uses for + * locking. It's used to tell evthread_set_lock_callbacks() how to use + * locking on this platform. + */ +struct evthread_lock_callbacks { + /** The current version of the locking API. Set this to + * EVTHREAD_LOCK_API_VERSION */ + int lock_api_version; + /** Which kinds of locks does this version of the locking API + * support? A bitfield of EVTHREAD_LOCKTYPE_RECURSIVE and + * EVTHREAD_LOCKTYPE_READWRITE. + * + * (Note that RECURSIVE locks are currently mandatory, and + * READWRITE locks are not currently used.) + **/ + unsigned supported_locktypes; + /** Function to allocate and initialize new lock of type 'locktype'. + * Returns NULL on failure. */ + void *(*alloc)(unsigned locktype); + /** Funtion to release all storage held in 'lock', which was created + * with type 'locktype'. */ + void (*free)(void *lock, unsigned locktype); + /** Acquire an already-allocated lock at 'lock' with mode 'mode'. + * Returns 0 on success, and nonzero on failure. */ + int (*lock)(unsigned mode, void *lock); + /** Release a lock at 'lock' using mode 'mode'. Returns 0 on success, + * and nonzero on failure. */ + int (*unlock)(unsigned mode, void *lock); +}; + +/** Sets a group of functions that Libevent should use for locking. + * For full information on the required callback API, see the + * documentation for the individual members of evthread_lock_callbacks. + * + * Note that if you're using Windows or the Pthreads threading library, you + * probably shouldn't call this function; instead, use + * evthread_use_windows_threads() or evthread_use_posix_threads() if you can. + */ +EVENT2_EXPORT_SYMBOL +int evthread_set_lock_callbacks(const struct evthread_lock_callbacks *); + +#define EVTHREAD_CONDITION_API_VERSION 1 + +struct timeval; + +/** This structure describes the interface a threading library uses for + * condition variables. It's used to tell evthread_set_condition_callbacks + * how to use locking on this platform. + */ +struct evthread_condition_callbacks { + /** The current version of the conditions API. Set this to + * EVTHREAD_CONDITION_API_VERSION */ + int condition_api_version; + /** Function to allocate and initialize a new condition variable. + * Returns the condition variable on success, and NULL on failure. + * The 'condtype' argument will be 0 with this API version. + */ + void *(*alloc_condition)(unsigned condtype); + /** Function to free a condition variable. */ + void (*free_condition)(void *cond); + /** Function to signal a condition variable. If 'broadcast' is 1, all + * threads waiting on 'cond' should be woken; otherwise, only on one + * thread is worken. Should return 0 on success, -1 on failure. + * This function will only be called while holding the associated + * lock for the condition. + */ + int (*signal_condition)(void *cond, int broadcast); + /** Function to wait for a condition variable. The lock 'lock' + * will be held when this function is called; should be released + * while waiting for the condition to be come signalled, and + * should be held again when this function returns. + * If timeout is provided, it is interval of seconds to wait for + * the event to become signalled; if it is NULL, the function + * should wait indefinitely. + * + * The function should return -1 on error; 0 if the condition + * was signalled, or 1 on a timeout. */ + int (*wait_condition)(void *cond, void *lock, + const struct timeval *timeout); +}; + +/** Sets a group of functions that Libevent should use for condition variables. + * For full information on the required callback API, see the + * documentation for the individual members of evthread_condition_callbacks. + * + * Note that if you're using Windows or the Pthreads threading library, you + * probably shouldn't call this function; instead, use + * evthread_use_windows_threads() or evthread_use_pthreads() if you can. + */ +EVENT2_EXPORT_SYMBOL +int evthread_set_condition_callbacks( + const struct evthread_condition_callbacks *); + +/** + Sets the function for determining the thread id. + + @param base the event base for which to set the id function + @param id_fn the identify function Libevent should invoke to + determine the identity of a thread. +*/ +EVENT2_EXPORT_SYMBOL +void evthread_set_id_callback( + unsigned long (*id_fn)(void)); + +#if (defined(_WIN32) && !defined(EVENT__DISABLE_THREAD_SUPPORT)) || defined(EVENT_IN_DOXYGEN_) +/** Sets up Libevent for use with Windows builtin locking and thread ID + functions. Unavailable if Libevent is not built for Windows. + + @return 0 on success, -1 on failure. */ +EVENT2_EXPORT_SYMBOL +int evthread_use_windows_threads(void); +/** + Defined if Libevent was built with support for evthread_use_windows_threads() +*/ +#define EVTHREAD_USE_WINDOWS_THREADS_IMPLEMENTED 1 +#endif + +#if defined(EVENT__HAVE_PTHREADS) || defined(EVENT_IN_DOXYGEN_) +/** Sets up Libevent for use with Pthreads locking and thread ID functions. + Unavailable if Libevent is not build for use with pthreads. Requires + libraries to link against Libevent_pthreads as well as Libevent. + + @return 0 on success, -1 on failure. */ +EVENT2_EXPORT_SYMBOL +int evthread_use_pthreads(void); +/** Defined if Libevent was built with support for evthread_use_pthreads() */ +#define EVTHREAD_USE_PTHREADS_IMPLEMENTED 1 + +#endif + +/** Enable debugging wrappers around the current lock callbacks. If Libevent + * makes one of several common locking errors, exit with an assertion failure. + * + * If you're going to call this function, you must do so before any locks are + * allocated. + **/ +EVENT2_EXPORT_SYMBOL +void evthread_enable_lock_debugging(void); + +/* Old (misspelled) version: This is deprecated; use + * evthread_enable_log_debugging instead. */ +EVENT2_EXPORT_SYMBOL +void evthread_enable_lock_debuging(void); + +#endif /* EVENT__DISABLE_THREAD_SUPPORT */ + +struct event_base; +/** Make sure it's safe to tell an event base to wake up from another thread + or a signal handler. + + You shouldn't need to call this by hand; configuring the base with thread + support should be necessary and sufficient. + + @return 0 on success, -1 on failure. + */ +EVENT2_EXPORT_SYMBOL +int evthread_make_base_notifiable(struct event_base *base); + +#ifdef __cplusplus +} +#endif + +#endif /* EVENT2_THREAD_H_INCLUDED_ */ diff --git a/bsnes/thrift/libevent/include/event2/util.h b/bsnes/thrift/libevent/include/event2/util.h new file mode 100644 index 00000000..02aa7ba9 --- /dev/null +++ b/bsnes/thrift/libevent/include/event2/util.h @@ -0,0 +1,888 @@ +/* + * Copyright (c) 2007-2012 Niels Provos and Nick Mathewson + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +#ifndef EVENT2_UTIL_H_INCLUDED_ +#define EVENT2_UTIL_H_INCLUDED_ + +/** @file event2/util.h + + Common convenience functions for cross-platform portability and + related socket manipulations. + + */ +#include + +#ifdef __cplusplus +extern "C" { +#endif + +#include +#ifdef EVENT__HAVE_SYS_TIME_H +#include +#endif +#ifdef EVENT__HAVE_STDINT_H +#include +#elif defined(EVENT__HAVE_INTTYPES_H) +#include +#endif +#ifdef EVENT__HAVE_SYS_TYPES_H +#include +#endif +#ifdef EVENT__HAVE_STDDEF_H +#include +#endif +#ifdef _MSC_VER +#include +#endif +#include +#ifdef EVENT__HAVE_NETDB_H +#include +#endif + +#ifdef _WIN32 +#include +#ifdef EVENT__HAVE_GETADDRINFO +/* for EAI_* definitions. */ +#include +#endif +#else +#ifdef EVENT__HAVE_ERRNO_H +#include +#endif +#include +#endif + +#include + +/* Some openbsd autoconf versions get the name of this macro wrong. */ +#if defined(EVENT__SIZEOF_VOID__) && !defined(EVENT__SIZEOF_VOID_P) +#define EVENT__SIZEOF_VOID_P EVENT__SIZEOF_VOID__ +#endif + +/** + * @name Standard integer types. + * + * Integer type definitions for types that are supposed to be defined in the + * C99-specified stdint.h. Shamefully, some platforms do not include + * stdint.h, so we need to replace it. (If you are on a platform like this, + * your C headers are now over 10 years out of date. You should bug them to + * do something about this.) + * + * We define: + * + *
+ *
ev_uint64_t, ev_uint32_t, ev_uint16_t, ev_uint8_t
+ *
unsigned integer types of exactly 64, 32, 16, and 8 bits + * respectively.
+ *
ev_int64_t, ev_int32_t, ev_int16_t, ev_int8_t
+ *
signed integer types of exactly 64, 32, 16, and 8 bits + * respectively.
+ *
ev_uintptr_t, ev_intptr_t
+ *
unsigned/signed integers large enough + * to hold a pointer without loss of bits.
+ *
ev_ssize_t
+ *
A signed type of the same size as size_t
+ *
ev_off_t
+ *
A signed type typically used to represent offsets within a + * (potentially large) file
+ * + * @{ + */ +#ifdef EVENT__HAVE_UINT64_T +#define ev_uint64_t uint64_t +#define ev_int64_t int64_t +#elif defined(_WIN32) +#define ev_uint64_t unsigned __int64 +#define ev_int64_t signed __int64 +#elif EVENT__SIZEOF_LONG_LONG == 8 +#define ev_uint64_t unsigned long long +#define ev_int64_t long long +#elif EVENT__SIZEOF_LONG == 8 +#define ev_uint64_t unsigned long +#define ev_int64_t long +#elif defined(EVENT_IN_DOXYGEN_) +#define ev_uint64_t ... +#define ev_int64_t ... +#else +#error "No way to define ev_uint64_t" +#endif + +#ifdef EVENT__HAVE_UINT32_T +#define ev_uint32_t uint32_t +#define ev_int32_t int32_t +#elif defined(_WIN32) +#define ev_uint32_t unsigned int +#define ev_int32_t signed int +#elif EVENT__SIZEOF_LONG == 4 +#define ev_uint32_t unsigned long +#define ev_int32_t signed long +#elif EVENT__SIZEOF_INT == 4 +#define ev_uint32_t unsigned int +#define ev_int32_t signed int +#elif defined(EVENT_IN_DOXYGEN_) +#define ev_uint32_t ... +#define ev_int32_t ... +#else +#error "No way to define ev_uint32_t" +#endif + +#ifdef EVENT__HAVE_UINT16_T +#define ev_uint16_t uint16_t +#define ev_int16_t int16_t +#elif defined(_WIN32) +#define ev_uint16_t unsigned short +#define ev_int16_t signed short +#elif EVENT__SIZEOF_INT == 2 +#define ev_uint16_t unsigned int +#define ev_int16_t signed int +#elif EVENT__SIZEOF_SHORT == 2 +#define ev_uint16_t unsigned short +#define ev_int16_t signed short +#elif defined(EVENT_IN_DOXYGEN_) +#define ev_uint16_t ... +#define ev_int16_t ... +#else +#error "No way to define ev_uint16_t" +#endif + +#ifdef EVENT__HAVE_UINT8_T +#define ev_uint8_t uint8_t +#define ev_int8_t int8_t +#elif defined(EVENT_IN_DOXYGEN_) +#define ev_uint8_t ... +#define ev_int8_t ... +#else +#define ev_uint8_t unsigned char +#define ev_int8_t signed char +#endif + +#ifdef EVENT__HAVE_UINTPTR_T +#define ev_uintptr_t uintptr_t +#define ev_intptr_t intptr_t +#elif EVENT__SIZEOF_VOID_P <= 4 +#define ev_uintptr_t ev_uint32_t +#define ev_intptr_t ev_int32_t +#elif EVENT__SIZEOF_VOID_P <= 8 +#define ev_uintptr_t ev_uint64_t +#define ev_intptr_t ev_int64_t +#elif defined(EVENT_IN_DOXYGEN_) +#define ev_uintptr_t ... +#define ev_intptr_t ... +#else +#error "No way to define ev_uintptr_t" +#endif + +#ifdef EVENT__ssize_t +#define ev_ssize_t EVENT__ssize_t +#else +#define ev_ssize_t ssize_t +#endif + +/* Note that we define ev_off_t based on the compile-time size of off_t that + * we used to build Libevent, and not based on the current size of off_t. + * (For example, we don't define ev_off_t to off_t.). We do this because + * some systems let you build your software with different off_t sizes + * at runtime, and so putting in any dependency on off_t would risk API + * mismatch. + */ +#ifdef _WIN32 +#define ev_off_t ev_int64_t +#elif EVENT__SIZEOF_OFF_T == 8 +#define ev_off_t ev_int64_t +#elif EVENT__SIZEOF_OFF_T == 4 +#define ev_off_t ev_int32_t +#elif defined(EVENT_IN_DOXYGEN_) +#define ev_off_t ... +#else +#define ev_off_t off_t +#endif +/**@}*/ + +/* Limits for integer types. + + We're making two assumptions here: + - The compiler does constant folding properly. + - The platform does signed arithmetic in two's complement. +*/ + +/** + @name Limits for integer types + + These macros hold the largest or smallest values possible for the + ev_[u]int*_t types. + + @{ +*/ +#ifndef EVENT__HAVE_STDINT_H +#define EV_UINT64_MAX ((((ev_uint64_t)0xffffffffUL) << 32) | 0xffffffffUL) +#define EV_INT64_MAX ((((ev_int64_t) 0x7fffffffL) << 32) | 0xffffffffL) +#define EV_INT64_MIN ((-EV_INT64_MAX) - 1) +#define EV_UINT32_MAX ((ev_uint32_t)0xffffffffUL) +#define EV_INT32_MAX ((ev_int32_t) 0x7fffffffL) +#define EV_INT32_MIN ((-EV_INT32_MAX) - 1) +#define EV_UINT16_MAX ((ev_uint16_t)0xffffUL) +#define EV_INT16_MAX ((ev_int16_t) 0x7fffL) +#define EV_INT16_MIN ((-EV_INT16_MAX) - 1) +#define EV_UINT8_MAX 255 +#define EV_INT8_MAX 127 +#define EV_INT8_MIN ((-EV_INT8_MAX) - 1) +#else +#define EV_UINT64_MAX UINT64_MAX +#define EV_INT64_MAX INT64_MAX +#define EV_INT64_MIN INT64_MIN +#define EV_UINT32_MAX UINT32_MAX +#define EV_INT32_MAX INT32_MAX +#define EV_INT32_MIN INT32_MIN +#define EV_UINT16_MAX UINT16_MAX +#define EV_INT16_MIN INT16_MIN +#define EV_INT16_MAX INT16_MAX +#define EV_UINT8_MAX UINT8_MAX +#define EV_INT8_MAX INT8_MAX +#define EV_INT8_MIN INT8_MIN +/** @} */ +#endif + + +/** + @name Limits for SIZE_T and SSIZE_T + + @{ +*/ +#if EVENT__SIZEOF_SIZE_T == 8 +#define EV_SIZE_MAX EV_UINT64_MAX +#define EV_SSIZE_MAX EV_INT64_MAX +#elif EVENT__SIZEOF_SIZE_T == 4 +#define EV_SIZE_MAX EV_UINT32_MAX +#define EV_SSIZE_MAX EV_INT32_MAX +#elif defined(EVENT_IN_DOXYGEN_) +#define EV_SIZE_MAX ... +#define EV_SSIZE_MAX ... +#else +#error "No way to define SIZE_MAX" +#endif + +#define EV_SSIZE_MIN ((-EV_SSIZE_MAX) - 1) +/**@}*/ + +#ifdef _WIN32 +#define ev_socklen_t int +#elif defined(EVENT__socklen_t) +#define ev_socklen_t EVENT__socklen_t +#else +#define ev_socklen_t socklen_t +#endif + +#ifdef EVENT__HAVE_STRUCT_SOCKADDR_STORAGE___SS_FAMILY +#if !defined(EVENT__HAVE_STRUCT_SOCKADDR_STORAGE_SS_FAMILY) \ + && !defined(ss_family) +#define ss_family __ss_family +#endif +#endif + +/** + * A type wide enough to hold the output of "socket()" or "accept()". On + * Windows, this is an intptr_t; elsewhere, it is an int. */ +#ifdef _WIN32 +#define evutil_socket_t intptr_t +#else +#define evutil_socket_t int +#endif + +/** + * Structure to hold information about a monotonic timer + * + * Use this with evutil_configure_monotonic_time() and + * evutil_gettime_monotonic(). + * + * This is an opaque structure; you can allocate one using + * evutil_monotonic_timer_new(). + * + * @see evutil_monotonic_timer_new(), evutil_monotonic_timer_free(), + * evutil_configure_monotonic_time(), evutil_gettime_monotonic() + */ +struct evutil_monotonic_timer +#ifdef EVENT_IN_DOXYGEN_ +{/*Empty body so that doxygen will generate documentation here.*/} +#endif +; + +#define EV_MONOT_PRECISE 1 +#define EV_MONOT_FALLBACK 2 + +/** Format a date string using RFC 1123 format (used in HTTP). + * If `tm` is NULL, current system's time will be used. + * The number of characters written will be returned. + * One should check if the return value is smaller than `datelen` to check if + * the result is truncated or not. + */ +EVENT2_EXPORT_SYMBOL int +evutil_date_rfc1123(char *date, const size_t datelen, const struct tm *tm); + +/** Allocate a new struct evutil_monotonic_timer for use with the + * evutil_configure_monotonic_time() and evutil_gettime_monotonic() + * functions. You must configure the timer with + * evutil_configure_monotonic_time() before using it. + */ +EVENT2_EXPORT_SYMBOL +struct evutil_monotonic_timer * evutil_monotonic_timer_new(void); + +/** Free a struct evutil_monotonic_timer that was allocated using + * evutil_monotonic_timer_new(). + */ +EVENT2_EXPORT_SYMBOL +void evutil_monotonic_timer_free(struct evutil_monotonic_timer *timer); + +/** Set up a struct evutil_monotonic_timer; flags can include + * EV_MONOT_PRECISE and EV_MONOT_FALLBACK. + */ +EVENT2_EXPORT_SYMBOL +int evutil_configure_monotonic_time(struct evutil_monotonic_timer *timer, + int flags); + +/** Query the current monotonic time from a struct evutil_monotonic_timer + * previously configured with evutil_configure_monotonic_time(). Monotonic + * time is guaranteed never to run in reverse, but is not necessarily epoch- + * based, or relative to any other definite point. Use it to make reliable + * measurements of elapsed time between events even when the system time + * may be changed. + * + * It is not safe to use this funtion on the same timer from multiple + * threads. + */ +EVENT2_EXPORT_SYMBOL +int evutil_gettime_monotonic(struct evutil_monotonic_timer *timer, + struct timeval *tp); + +/** Create two new sockets that are connected to each other. + + On Unix, this simply calls socketpair(). On Windows, it uses the + loopback network interface on 127.0.0.1, and only + AF_INET,SOCK_STREAM are supported. + + (This may fail on some Windows hosts where firewall software has cleverly + decided to keep 127.0.0.1 from talking to itself.) + + Parameters and return values are as for socketpair() +*/ +EVENT2_EXPORT_SYMBOL +int evutil_socketpair(int d, int type, int protocol, evutil_socket_t sv[2]); +/** Do platform-specific operations as needed to make a socket nonblocking. + + @param sock The socket to make nonblocking + @return 0 on success, -1 on failure + */ +EVENT2_EXPORT_SYMBOL +int evutil_make_socket_nonblocking(evutil_socket_t sock); + +/** Do platform-specific operations to make a listener socket reusable. + + Specifically, we want to make sure that another program will be able + to bind this address right after we've closed the listener. + + This differs from Windows's interpretation of "reusable", which + allows multiple listeners to bind the same address at the same time. + + @param sock The socket to make reusable + @return 0 on success, -1 on failure + */ +EVENT2_EXPORT_SYMBOL +int evutil_make_listen_socket_reuseable(evutil_socket_t sock); + +/** Do platform-specific operations to make a listener port reusable. + + Specifically, we want to make sure that multiple programs which also + set the same socket option will be able to bind, listen at the same time. + + This is a feature available only to Linux 3.9+ + + @param sock The socket to make reusable + @return 0 on success, -1 on failure + */ +EVENT2_EXPORT_SYMBOL +int evutil_make_listen_socket_reuseable_port(evutil_socket_t sock); + +/** Set ipv6 only bind socket option to make listener work only in ipv6 sockets. + + According to RFC3493 and most Linux distributions, default value for the + sockets is to work in IPv4-mapped mode. In IPv4-mapped mode, it is not possible + to bind same port from different IPv4 and IPv6 handlers. + + @param sock The socket to make in ipv6only working mode + @return 0 on success, -1 on failure + */ +EVENT2_EXPORT_SYMBOL +int evutil_make_listen_socket_ipv6only(evutil_socket_t sock); + +/** Do platform-specific operations as needed to close a socket upon a + successful execution of one of the exec*() functions. + + @param sock The socket to be closed + @return 0 on success, -1 on failure + */ +EVENT2_EXPORT_SYMBOL +int evutil_make_socket_closeonexec(evutil_socket_t sock); + +/** Do the platform-specific call needed to close a socket returned from + socket() or accept(). + + @param sock The socket to be closed + @return 0 on success (whether the operation is supported or not), + -1 on failure + */ +EVENT2_EXPORT_SYMBOL +int evutil_closesocket(evutil_socket_t sock); +#define EVUTIL_CLOSESOCKET(s) evutil_closesocket(s) + +/** Do platform-specific operations, if possible, to make a tcp listener + * socket defer accept()s until there is data to read. + * + * Not all platforms support this. You don't want to do this for every + * listener socket: only the ones that implement a protocol where the + * client transmits before the server needs to respond. + * + * @param sock The listening socket to to make deferred + * @return 0 on success (whether the operation is supported or not), + * -1 on failure +*/ +EVENT2_EXPORT_SYMBOL +int evutil_make_tcp_listen_socket_deferred(evutil_socket_t sock); + +#ifdef _WIN32 +/** Return the most recent socket error. Not idempotent on all platforms. */ +#define EVUTIL_SOCKET_ERROR() WSAGetLastError() +/** Replace the most recent socket error with errcode */ +#define EVUTIL_SET_SOCKET_ERROR(errcode) \ + do { WSASetLastError(errcode); } while (0) +/** Return the most recent socket error to occur on sock. */ +EVENT2_EXPORT_SYMBOL +int evutil_socket_geterror(evutil_socket_t sock); +/** Convert a socket error to a string. */ +EVENT2_EXPORT_SYMBOL +const char *evutil_socket_error_to_string(int errcode); +#define EVUTIL_INVALID_SOCKET INVALID_SOCKET +#elif defined(EVENT_IN_DOXYGEN_) +/** + @name Socket error functions + + These functions are needed for making programs compatible between + Windows and Unix-like platforms. + + You see, Winsock handles socket errors differently from the rest of + the world. Elsewhere, a socket error is like any other error and is + stored in errno. But winsock functions require you to retrieve the + error with a special function, and don't let you use strerror for + the error codes. And handling EWOULDBLOCK is ... different. + + @{ +*/ +/** Return the most recent socket error. Not idempotent on all platforms. */ +#define EVUTIL_SOCKET_ERROR() ... +/** Replace the most recent socket error with errcode */ +#define EVUTIL_SET_SOCKET_ERROR(errcode) ... +/** Return the most recent socket error to occur on sock. */ +#define evutil_socket_geterror(sock) ... +/** Convert a socket error to a string. */ +#define evutil_socket_error_to_string(errcode) ... +#define EVUTIL_INVALID_SOCKET -1 +/**@}*/ +#else /** !EVENT_IN_DOXYGEN_ && !_WIN32 */ +#define EVUTIL_SOCKET_ERROR() (errno) +#define EVUTIL_SET_SOCKET_ERROR(errcode) \ + do { errno = (errcode); } while (0) +#define evutil_socket_geterror(sock) (errno) +#define evutil_socket_error_to_string(errcode) (strerror(errcode)) +#define EVUTIL_INVALID_SOCKET -1 +#endif /** !_WIN32 */ + + +/** + * @name Manipulation macros for struct timeval. + * + * We define replacements + * for timeradd, timersub, timerclear, timercmp, and timerisset. + * + * @{ + */ +#ifdef EVENT__HAVE_TIMERADD +#define evutil_timeradd(tvp, uvp, vvp) timeradd((tvp), (uvp), (vvp)) +#define evutil_timersub(tvp, uvp, vvp) timersub((tvp), (uvp), (vvp)) +#else +#define evutil_timeradd(tvp, uvp, vvp) \ + do { \ + (vvp)->tv_sec = (tvp)->tv_sec + (uvp)->tv_sec; \ + (vvp)->tv_usec = (tvp)->tv_usec + (uvp)->tv_usec; \ + if ((vvp)->tv_usec >= 1000000) { \ + (vvp)->tv_sec++; \ + (vvp)->tv_usec -= 1000000; \ + } \ + } while (0) +#define evutil_timersub(tvp, uvp, vvp) \ + do { \ + (vvp)->tv_sec = (tvp)->tv_sec - (uvp)->tv_sec; \ + (vvp)->tv_usec = (tvp)->tv_usec - (uvp)->tv_usec; \ + if ((vvp)->tv_usec < 0) { \ + (vvp)->tv_sec--; \ + (vvp)->tv_usec += 1000000; \ + } \ + } while (0) +#endif /* !EVENT__HAVE_TIMERADD */ + +#ifdef EVENT__HAVE_TIMERCLEAR +#define evutil_timerclear(tvp) timerclear(tvp) +#else +#define evutil_timerclear(tvp) (tvp)->tv_sec = (tvp)->tv_usec = 0 +#endif +/**@}*/ + +/** Return true iff the tvp is related to uvp according to the relational + * operator cmp. Recognized values for cmp are ==, <=, <, >=, and >. */ +#define evutil_timercmp(tvp, uvp, cmp) \ + (((tvp)->tv_sec == (uvp)->tv_sec) ? \ + ((tvp)->tv_usec cmp (uvp)->tv_usec) : \ + ((tvp)->tv_sec cmp (uvp)->tv_sec)) + +#ifdef EVENT__HAVE_TIMERISSET +#define evutil_timerisset(tvp) timerisset(tvp) +#else +#define evutil_timerisset(tvp) ((tvp)->tv_sec || (tvp)->tv_usec) +#endif + +/** Replacement for offsetof on platforms that don't define it. */ +#ifdef offsetof +#define evutil_offsetof(type, field) offsetof(type, field) +#else +#define evutil_offsetof(type, field) ((off_t)(&((type *)0)->field)) +#endif + +/* big-int related functions */ +/** Parse a 64-bit value from a string. Arguments are as for strtol. */ +EVENT2_EXPORT_SYMBOL +ev_int64_t evutil_strtoll(const char *s, char **endptr, int base); + +/** Replacement for gettimeofday on platforms that lack it. */ +#ifdef EVENT__HAVE_GETTIMEOFDAY +#define evutil_gettimeofday(tv, tz) gettimeofday((tv), (tz)) +#else +struct timezone; +EVENT2_EXPORT_SYMBOL +int evutil_gettimeofday(struct timeval *tv, struct timezone *tz); +#endif + +/** Replacement for snprintf to get consistent behavior on platforms for + which the return value of snprintf does not conform to C99. + */ +EVENT2_EXPORT_SYMBOL +int evutil_snprintf(char *buf, size_t buflen, const char *format, ...) +#ifdef __GNUC__ + __attribute__((format(printf, 3, 4))) +#endif +; +/** Replacement for vsnprintf to get consistent behavior on platforms for + which the return value of snprintf does not conform to C99. + */ +EVENT2_EXPORT_SYMBOL +int evutil_vsnprintf(char *buf, size_t buflen, const char *format, va_list ap) +#ifdef __GNUC__ + __attribute__((format(printf, 3, 0))) +#endif +; + +/** Replacement for inet_ntop for platforms which lack it. */ +EVENT2_EXPORT_SYMBOL +const char *evutil_inet_ntop(int af, const void *src, char *dst, size_t len); +/** Variation of inet_pton that also parses IPv6 scopes. Public for + unit tests. No reason to call this directly. + */ +EVENT2_EXPORT_SYMBOL +int evutil_inet_pton_scope(int af, const char *src, void *dst, + unsigned *indexp); +/** Replacement for inet_pton for platforms which lack it. */ +EVENT2_EXPORT_SYMBOL +int evutil_inet_pton(int af, const char *src, void *dst); +struct sockaddr; + +/** Parse an IPv4 or IPv6 address, with optional port, from a string. + + Recognized formats are: + - [IPv6Address]:port + - [IPv6Address] + - IPv6Address + - IPv4Address:port + - IPv4Address + + If no port is specified, the port in the output is set to 0. + + @param str The string to parse. + @param out A struct sockaddr to hold the result. This should probably be + a struct sockaddr_storage. + @param outlen A pointer to the number of bytes that that 'out' can safely + hold. Set to the number of bytes used in 'out' on success. + @return -1 if the address is not well-formed, if the port is out of range, + or if out is not large enough to hold the result. Otherwise returns + 0 on success. +*/ +EVENT2_EXPORT_SYMBOL +int evutil_parse_sockaddr_port(const char *str, struct sockaddr *out, int *outlen); + +/** Compare two sockaddrs; return 0 if they are equal, or less than 0 if sa1 + * preceeds sa2, or greater than 0 if sa1 follows sa2. If include_port is + * true, consider the port as well as the address. Only implemented for + * AF_INET and AF_INET6 addresses. The ordering is not guaranteed to remain + * the same between Libevent versions. */ +EVENT2_EXPORT_SYMBOL +int evutil_sockaddr_cmp(const struct sockaddr *sa1, const struct sockaddr *sa2, + int include_port); + +/** As strcasecmp, but always compares the characters in locale-independent + ASCII. That's useful if you're handling data in ASCII-based protocols. + */ +EVENT2_EXPORT_SYMBOL +int evutil_ascii_strcasecmp(const char *str1, const char *str2); +/** As strncasecmp, but always compares the characters in locale-independent + ASCII. That's useful if you're handling data in ASCII-based protocols. + */ +EVENT2_EXPORT_SYMBOL +int evutil_ascii_strncasecmp(const char *str1, const char *str2, size_t n); + +/* Here we define evutil_addrinfo to the native addrinfo type, or redefine it + * if this system has no getaddrinfo(). */ +#ifdef EVENT__HAVE_STRUCT_ADDRINFO +#define evutil_addrinfo addrinfo +#else +/** A definition of struct addrinfo for systems that lack it. + + (This is just an alias for struct addrinfo if the system defines + struct addrinfo.) +*/ +struct evutil_addrinfo { + int ai_flags; /* AI_PASSIVE, AI_CANONNAME, AI_NUMERICHOST */ + int ai_family; /* PF_xxx */ + int ai_socktype; /* SOCK_xxx */ + int ai_protocol; /* 0 or IPPROTO_xxx for IPv4 and IPv6 */ + size_t ai_addrlen; /* length of ai_addr */ + char *ai_canonname; /* canonical name for nodename */ + struct sockaddr *ai_addr; /* binary address */ + struct evutil_addrinfo *ai_next; /* next structure in linked list */ +}; +#endif +/** @name evutil_getaddrinfo() error codes + + These values are possible error codes for evutil_getaddrinfo() and + related functions. + + @{ +*/ +#if defined(EAI_ADDRFAMILY) && defined(EVENT__HAVE_GETADDRINFO) +#define EVUTIL_EAI_ADDRFAMILY EAI_ADDRFAMILY +#else +#define EVUTIL_EAI_ADDRFAMILY -901 +#endif +#if defined(EAI_AGAIN) && defined(EVENT__HAVE_GETADDRINFO) +#define EVUTIL_EAI_AGAIN EAI_AGAIN +#else +#define EVUTIL_EAI_AGAIN -902 +#endif +#if defined(EAI_BADFLAGS) && defined(EVENT__HAVE_GETADDRINFO) +#define EVUTIL_EAI_BADFLAGS EAI_BADFLAGS +#else +#define EVUTIL_EAI_BADFLAGS -903 +#endif +#if defined(EAI_FAIL) && defined(EVENT__HAVE_GETADDRINFO) +#define EVUTIL_EAI_FAIL EAI_FAIL +#else +#define EVUTIL_EAI_FAIL -904 +#endif +#if defined(EAI_FAMILY) && defined(EVENT__HAVE_GETADDRINFO) +#define EVUTIL_EAI_FAMILY EAI_FAMILY +#else +#define EVUTIL_EAI_FAMILY -905 +#endif +#if defined(EAI_MEMORY) && defined(EVENT__HAVE_GETADDRINFO) +#define EVUTIL_EAI_MEMORY EAI_MEMORY +#else +#define EVUTIL_EAI_MEMORY -906 +#endif +/* This test is a bit complicated, since some MS SDKs decide to + * remove NODATA or redefine it to be the same as NONAME, in a + * fun interpretation of RFC 2553 and RFC 3493. */ +#if defined(EAI_NODATA) && defined(EVENT__HAVE_GETADDRINFO) && (!defined(EAI_NONAME) || EAI_NODATA != EAI_NONAME) +#define EVUTIL_EAI_NODATA EAI_NODATA +#else +#define EVUTIL_EAI_NODATA -907 +#endif +#if defined(EAI_NONAME) && defined(EVENT__HAVE_GETADDRINFO) +#define EVUTIL_EAI_NONAME EAI_NONAME +#else +#define EVUTIL_EAI_NONAME -908 +#endif +#if defined(EAI_SERVICE) && defined(EVENT__HAVE_GETADDRINFO) +#define EVUTIL_EAI_SERVICE EAI_SERVICE +#else +#define EVUTIL_EAI_SERVICE -909 +#endif +#if defined(EAI_SOCKTYPE) && defined(EVENT__HAVE_GETADDRINFO) +#define EVUTIL_EAI_SOCKTYPE EAI_SOCKTYPE +#else +#define EVUTIL_EAI_SOCKTYPE -910 +#endif +#if defined(EAI_SYSTEM) && defined(EVENT__HAVE_GETADDRINFO) +#define EVUTIL_EAI_SYSTEM EAI_SYSTEM +#else +#define EVUTIL_EAI_SYSTEM -911 +#endif + +#define EVUTIL_EAI_CANCEL -90001 + +#if defined(AI_PASSIVE) && defined(EVENT__HAVE_GETADDRINFO) +#define EVUTIL_AI_PASSIVE AI_PASSIVE +#else +#define EVUTIL_AI_PASSIVE 0x1000 +#endif +#if defined(AI_CANONNAME) && defined(EVENT__HAVE_GETADDRINFO) +#define EVUTIL_AI_CANONNAME AI_CANONNAME +#else +#define EVUTIL_AI_CANONNAME 0x2000 +#endif +#if defined(AI_NUMERICHOST) && defined(EVENT__HAVE_GETADDRINFO) +#define EVUTIL_AI_NUMERICHOST AI_NUMERICHOST +#else +#define EVUTIL_AI_NUMERICHOST 0x4000 +#endif +#if defined(AI_NUMERICSERV) && defined(EVENT__HAVE_GETADDRINFO) +#define EVUTIL_AI_NUMERICSERV AI_NUMERICSERV +#else +#define EVUTIL_AI_NUMERICSERV 0x8000 +#endif +#if defined(AI_V4MAPPED) && defined(EVENT__HAVE_GETADDRINFO) +#define EVUTIL_AI_V4MAPPED AI_V4MAPPED +#else +#define EVUTIL_AI_V4MAPPED 0x10000 +#endif +#if defined(AI_ALL) && defined(EVENT__HAVE_GETADDRINFO) +#define EVUTIL_AI_ALL AI_ALL +#else +#define EVUTIL_AI_ALL 0x20000 +#endif +#if defined(AI_ADDRCONFIG) && defined(EVENT__HAVE_GETADDRINFO) +#define EVUTIL_AI_ADDRCONFIG AI_ADDRCONFIG +#else +#define EVUTIL_AI_ADDRCONFIG 0x40000 +#endif +/**@}*/ + +struct evutil_addrinfo; +/** + * This function clones getaddrinfo for systems that don't have it. For full + * details, see RFC 3493, section 6.1. + * + * Limitations: + * - When the system has no getaddrinfo, we fall back to gethostbyname_r or + * gethostbyname, with their attendant issues. + * - The AI_V4MAPPED and AI_ALL flags are not currently implemented. + * + * For a nonblocking variant, see evdns_getaddrinfo. + */ +EVENT2_EXPORT_SYMBOL +int evutil_getaddrinfo(const char *nodename, const char *servname, + const struct evutil_addrinfo *hints_in, struct evutil_addrinfo **res); + +/** Release storage allocated by evutil_getaddrinfo or evdns_getaddrinfo. */ +EVENT2_EXPORT_SYMBOL +void evutil_freeaddrinfo(struct evutil_addrinfo *ai); + +EVENT2_EXPORT_SYMBOL +const char *evutil_gai_strerror(int err); + +/** Generate n bytes of secure pseudorandom data, and store them in buf. + * + * Current versions of Libevent use an ARC4-based random number generator, + * seeded using the platform's entropy source (/dev/urandom on Unix-like + * systems; CryptGenRandom on Windows). This is not actually as secure as it + * should be: ARC4 is a pretty lousy cipher, and the current implementation + * provides only rudimentary prediction- and backtracking-resistance. Don't + * use this for serious cryptographic applications. + */ +EVENT2_EXPORT_SYMBOL +void evutil_secure_rng_get_bytes(void *buf, size_t n); + +/** + * Seed the secure random number generator if needed, and return 0 on + * success or -1 on failure. + * + * It is okay to call this function more than once; it will still return + * 0 if the RNG has been successfully seeded and -1 if it can't be + * seeded. + * + * Ordinarily you don't need to call this function from your own code; + * Libevent will seed the RNG itself the first time it needs good random + * numbers. You only need to call it if (a) you want to double-check + * that one of the seeding methods did succeed, or (b) you plan to drop + * the capability to seed (by chrooting, or dropping capabilities, or + * whatever), and you want to make sure that seeding happens before your + * program loses the ability to do it. + */ +EVENT2_EXPORT_SYMBOL +int evutil_secure_rng_init(void); + +/** + * Set a filename to use in place of /dev/urandom for seeding the secure + * PRNG. Return 0 on success, -1 on failure. + * + * Call this function BEFORE calling any other initialization or RNG + * functions. + * + * (This string will _NOT_ be copied internally. Do not free it while any + * user of the secure RNG might be running. Don't pass anything other than a + * real /dev/...random device file here, or you might lose security.) + * + * This API is unstable, and might change in a future libevent version. + */ +EVENT2_EXPORT_SYMBOL +int evutil_secure_rng_set_urandom_device_file(char *fname); + +#if !defined(EVENT__HAVE_ARC4RANDOM) || defined(EVENT__HAVE_ARC4RANDOM_ADDRANDOM) +/** Seed the random number generator with extra random bytes. + + You should almost never need to call this function; it should be + sufficient to invoke evutil_secure_rng_init(), or let Libevent take + care of calling evutil_secure_rng_init() on its own. + + If you call this function as a _replacement_ for the regular + entropy sources, then you need to be sure that your input + contains a fairly large amount of strong entropy. Doing so is + notoriously hard: most people who try get it wrong. Watch out! + + @param dat a buffer full of a strong source of random numbers + @param datlen the number of bytes to read from datlen + */ +EVENT2_EXPORT_SYMBOL +void evutil_secure_rng_add_bytes(const char *dat, size_t datlen); +#endif + +#ifdef __cplusplus +} +#endif + +#endif /* EVENT1_EVUTIL_H_INCLUDED_ */ diff --git a/bsnes/thrift/libevent/include/event2/visibility.h b/bsnes/thrift/libevent/include/event2/visibility.h new file mode 100644 index 00000000..006bbf06 --- /dev/null +++ b/bsnes/thrift/libevent/include/event2/visibility.h @@ -0,0 +1,67 @@ +/* -*- Mode: C; tab-width: 4; c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* + * Copyright (c) 2007-2012 Niels Provos and Nick Mathewson + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +#ifndef EVENT2_VISIBILITY_H_INCLUDED_ +#define EVENT2_VISIBILITY_H_INCLUDED_ + +#include + +#if defined(event_shared_EXPORTS) || \ + defined(event_extra_shared_EXPORTS) || \ + defined(event_core_shared_EXPORTS) || \ + defined(event_pthreads_shared_EXPORTS) || \ + defined(event_openssl_shared_EXPORTS) + +# if defined (__SUNPRO_C) && (__SUNPRO_C >= 0x550) +# define EVENT2_EXPORT_SYMBOL __global +# elif defined __GNUC__ +# define EVENT2_EXPORT_SYMBOL __attribute__ ((visibility("default"))) +# elif defined(_MSC_VER) +# define EVENT2_EXPORT_SYMBOL __declspec(dllexport) +# else +# define EVENT2_EXPORT_SYMBOL /* unknown compiler */ +# endif + +#else /* event_*_EXPORTS */ + +# define EVENT2_EXPORT_SYMBOL + +#endif /* event_*_EXPORTS */ + +/** We need to dllimport event_debug_logging_mask_ into event_extra */ +#if defined(_MSC_VER) +# if defined(event_core_shared_EXPORTS) /** from core export */ +# define EVENT2_CORE_EXPORT_SYMBOL __declspec(dllexport) +# elif defined(event_extra_shared_EXPORTS) || /** from extra import */ \ + defined(EVENT_VISIBILITY_WANT_DLLIMPORT) +# define EVENT2_CORE_EXPORT_SYMBOL __declspec(dllimport) +# endif +#endif /* _MSC_VER */ +#if !defined(EVENT2_CORE_EXPORT_SYMBOL) +# define EVENT2_CORE_EXPORT_SYMBOL EVENT2_EXPORT_SYMBOL +#endif + +#endif /* EVENT2_VISIBILITY_H_INCLUDED_ */ diff --git a/bsnes/thrift/libevent/include/evhttp.h b/bsnes/thrift/libevent/include/evhttp.h new file mode 100644 index 00000000..549bc9b1 --- /dev/null +++ b/bsnes/thrift/libevent/include/evhttp.h @@ -0,0 +1,45 @@ +/* + * Copyright 2000-2007 Niels Provos + * Copyright 2007-2012 Niels Provos and Nick Mathewson + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +#ifndef EVENT1_EVHTTP_H_INCLUDED_ +#define EVENT1_EVHTTP_H_INCLUDED_ + +/** @file evhttp.h + + An http implementation subsystem for Libevent. + + The header is deprecated in Libevent 2.0 and later; please + use instead. Depending on what functionality you + need, you may also want to include more of the other + headers. + */ + +#include +#include +#include +#include + +#endif /* EVENT1_EVHTTP_H_INCLUDED_ */ diff --git a/bsnes/thrift/libevent/include/evrpc.h b/bsnes/thrift/libevent/include/evrpc.h new file mode 100644 index 00000000..7e986f7d --- /dev/null +++ b/bsnes/thrift/libevent/include/evrpc.h @@ -0,0 +1,45 @@ +/* + * Copyright (c) 2000-2007 Niels Provos + * Copyright (c) 2007-2012 Niels Provos and Nick Mathewson + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +#ifndef EVENT1_EVRPC_H_INCLUDED_ +#define EVENT1_EVRPC_H_INCLUDED_ + +/** @file evrpc.h + + An RPC system for Libevent. + + The header is deprecated in Libevent 2.0 and later; please + use instead. Depending on what functionality you + need, you may also want to include more of the other + headers. + */ + +#include +#include +#include +#include + +#endif /* EVENT1_EVRPC_H_INCLUDED_ */ diff --git a/bsnes/thrift/libevent/include/evutil.h b/bsnes/thrift/libevent/include/evutil.h new file mode 100644 index 00000000..12c137d7 --- /dev/null +++ b/bsnes/thrift/libevent/include/evutil.h @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2007-2012 Niels Provos and Nick Mathewson + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +#ifndef EVENT1_EVUTIL_H_INCLUDED_ +#define EVENT1_EVUTIL_H_INCLUDED_ + +/** @file evutil.h + + Utility and compatibility functions for Libevent. + + The header is deprecated in Libevent 2.0 and later; please + use instead. +*/ + +#include + +#endif /* EVENT1_EVUTIL_H_INCLUDED_ */ diff --git a/bsnes/thrift/libevent/lib/cmake/libevent/LibeventConfig.cmake b/bsnes/thrift/libevent/lib/cmake/libevent/LibeventConfig.cmake new file mode 100644 index 00000000..26fdc72a --- /dev/null +++ b/bsnes/thrift/libevent/lib/cmake/libevent/LibeventConfig.cmake @@ -0,0 +1,183 @@ +# - Config file for the Libevent package +# It defines the following variables +# LIBEVENT_FOUND - true if libevent and all required components found on the system +# LIBEVENT_xxx_FOUND - true if component xxx(see available components) found on the system +# LIBEVENT_VERSION - libevent version in format Major.Minor.Patch +# LIBEVENT_INCLUDE_DIRS - directories where libevent header is located. +# LIBEVENT_INCLUDE_DIR - same as DIRS +# LIBEVENT_LIBRARIES - libevent library to link against. +# LIBEVENT_LIBRARY - same as LIBRARIES +# +# These variables are deprecated, don't use them. +# LIBEVENT_STATIC_LIBRARIES - libraries to link against (archive/static) +# LIBEVENT_SHARED_LIBRARIES - libraries to link against (shared) +# +# When you try to locate the libevent libraries, you should specify which components you want to use. +# The following table lists all available components. If none is given, all imported targets will used. +# core - the core functons of libevent +# extra - extra functions, contains http, dns and rpc +# pthreads - multiple threads for libevent, not exists on Windows +# openssl - openssl support for libevent +# +# By default, the shared libraries of libevent will be found. To find the static ones instead, +# you must set the LIBEVENT_STATIC_LINK variable to TRUE before calling find_package(Libevent ...). +# If no component provided, all components will be used. +# example: +# set(LIBEVENT_STATIC_LINK TRUE) +# find_package(Libevent 2.2 REQUIRED COMPONENTS core) +# include_directories(${LIBEVENT_INCLUDE_DIRS}) # Can be omitted +# target_link_libraries(myapp ${LIBEVENT_LIBRARIES}) +# or target_link_libraries(myapp libevent::core) +# +# find_package() can handle dependencies automatically. For example, given the 'openssl' component, +# all dependencies (libevent_core, libssl, libcrypto and openssl include directories) will be found. + +set(CONFIG_FOR_INSTALL_TREE 1) + +set(LIBEVENT_VERSION 2.1.12) + +# IMPORTED targets from LibeventTargets.cmake +set(LIBEVENT_STATIC_LIBRARIES "core;extra") +set(LIBEVENT_SHARED_LIBRARIES "") + +# Default to the same type as libevent was built: +if(NOT DEFINED LIBEVENT_STATIC_LINK) + set(LIBEVENT_STATIC_LINK NOT OFF) +endif() + +set(CMAKE_FIND_LIBRARY_SUFFIXES_SAVE "${CMAKE_FIND_LIBRARY_SUFFIXES}") +if(${LIBEVENT_STATIC_LINK}) + set(_LIB_TYPE static) + set(CMAKE_FIND_LIBRARY_SUFFIXES ${CMAKE_STATIC_LIBRARY_SUFFIX}) + set(_AVAILABLE_LIBS "${LIBEVENT_STATIC_LIBRARIES}") +else() + set(_LIB_TYPE shared) + set(CMAKE_FIND_LIBRARY_SUFFIXES ${CMAKE_SHARED_LIBRARY_SUFFIX}) + set(_AVAILABLE_LIBS "${LIBEVENT_SHARED_LIBRARIES}") +endif() + +# Get the path of the current file. +get_filename_component(LIBEVENT_CMAKE_DIR "${CMAKE_CURRENT_LIST_FILE}" PATH) +get_filename_component(_INSTALL_PREFIX "${LIBEVENT_CMAKE_DIR}/../../.." ABSOLUTE) + +macro(message_if_needed _flag _msg) + if (NOT ${CMAKE_FIND_PACKAGE_NAME}_FIND_QUIETLY) + message(${_flag} "${_msg}") + endif() +endmacro() + +macro(no_component_msg _comp) + if(${CMAKE_FIND_PACKAGE_NAME}_FIND_REQUIRED_${_comp}) + set(pthreadlib) + if(NOT WIN32) + set(pthreadlib ", pthreads") + endif() + message(FATAL_ERROR "Your libevent library does not contain a ${_comp} component!\n" + "The valid components are core, extra${pthreadlib} and openssl.") + else() + message_if_needed(WARNING "Your libevent library does not contain a ${_comp} component!") + endif() +endmacro() + +set(_EVENT_COMPONENTS) +if(${CMAKE_FIND_PACKAGE_NAME}_FIND_COMPONENTS) + list(REMOVE_DUPLICATES ${CMAKE_FIND_PACKAGE_NAME}_FIND_COMPONENTS) + foreach(_comp ${${CMAKE_FIND_PACKAGE_NAME}_FIND_COMPONENTS}) + list(FIND _AVAILABLE_LIBS ${_comp} _INDEX) + if(_INDEX GREATER -1) + list(APPEND _EVENT_COMPONENTS ${_comp}) + else() + no_component_msg(${_comp}) + endif() + endforeach() +else() + set(_EVENT_COMPONENTS ${_AVAILABLE_LIBS}) +endif() + +set(_POSSIBLE_PKG_NAMES) +list(APPEND _POSSIBLE_PKG_NAMES ${CMAKE_FIND_PACKAGE_NAME} LIBEVENT Libevent libevent) +list(REMOVE_DUPLICATES _POSSIBLE_PKG_NAMES) + +macro(set_case_insensitive_found _comp) + foreach(name ${_POSSIBLE_PKG_NAMES}) + if("${_comp}" STREQUAL "") + set(${name}_FOUND TRUE) + set(${name}_NOTFOUND FALSE) + else() + set(${name}_${_comp}_FOUND TRUE) + set(${name}_${_comp}_NOTFOUND FALSE) + endif() + endforeach() +endmacro() + +if(CONFIG_FOR_INSTALL_TREE) + ## Config for install tree ---------------------------------------- + # Find includes + unset(_event_h CACHE) + find_path(_event_h + NAMES event2/event.h + PATHS "${_INSTALL_PREFIX}/include" + NO_DEFAULT_PATH) + if(_event_h) + set(LIBEVENT_INCLUDE_DIRS "${_event_h}") + message_if_needed(STATUS "Found libevent include directory: ${_event_h}") + else() + message_if_needed(WARNING "Your libevent library does not contain header files!") + endif() + + # Find libraries + macro(find_event_lib _comp) + unset(_event_lib CACHE) + find_library(_event_lib + NAMES "event_${_comp}" + PATHS "${_INSTALL_PREFIX}/lib" + NO_DEFAULT_PATH) + if(_event_lib) + list(APPEND LIBEVENT_LIBRARIES "libevent::${_comp}") + set_case_insensitive_found(${_comp}) + message_if_needed(STATUS "Found libevent component: ${_event_lib}") + else() + no_component_msg(${_comp}) + endif() + endmacro() + + foreach(comp ${_EVENT_COMPONENTS}) + find_event_lib(${comp}) + endforeach() +else() + ## Config for build tree ---------------------------------------- + set(LIBEVENT_INCLUDE_DIRS "D:/git/blastem/thrift/libevent-2.1.12-stable/include;D:/git/blastem/thrift/libevent-2.1.12-stable/build/include") + foreach(_comp ${_EVENT_COMPONENTS}) + list(APPEND LIBEVENT_LIBRARIES "libevent::${_comp}") + set_case_insensitive_found(${_comp}) + endforeach() +endif() + +set(LIBEVENT_INCLUDE_DIR ${LIBEVENT_INCLUDE_DIRS}) +if(LIBEVENT_LIBRARIES) + set(LIBEVENT_LIBRARY ${LIBEVENT_LIBRARIES}) + if(CONFIG_FOR_INSTALL_TREE) + message_if_needed(STATUS "Found libevent ${LIBEVENT_VERSION} in ${_INSTALL_PREFIX}") + else() + message_if_needed(STATUS "Found libevent ${LIBEVENT_VERSION} in ${LIBEVENT_CMAKE_DIR}") + endif() + + # Avoid including targets more than one times + if(NOT TARGET event_core_${_LIB_TYPE}) + # Include the project Targets file, this contains definitions for IMPORTED targets. + include(${LIBEVENT_CMAKE_DIR}/LibeventTargets-${_LIB_TYPE}.cmake) + endif() +else() + if(${CMAKE_FIND_PACKAGE_NAME}_FIND_REQUIRED) + message(FATAL_ERROR "Can not find any libraries for libevent.") + else() + message_if_needed(WARNING "Can not find any libraries for libevent.") + endif() +endif() + +set(CMAKE_FIND_LIBRARY_SUFFIXES "${CMAKE_FIND_LIBRARY_SUFFIXES_SAVE}") +unset(_LIB_TYPE) +unset(_AVAILABLE_LIBS) +unset(_EVENT_COMPONENTS) +unset(_POSSIBLE_PKG_NAMES) +unset(_INSTALL_PREFIX) diff --git a/bsnes/thrift/libevent/lib/cmake/libevent/LibeventConfigVersion.cmake b/bsnes/thrift/libevent/lib/cmake/libevent/LibeventConfigVersion.cmake new file mode 100644 index 00000000..0e4084f9 --- /dev/null +++ b/bsnes/thrift/libevent/lib/cmake/libevent/LibeventConfigVersion.cmake @@ -0,0 +1,11 @@ +set(PACKAGE_VERSION "2.1.12") + +# Check whether the requested PACKAGE_FIND_VERSION is compatible +if("${PACKAGE_VERSION}" VERSION_LESS "${PACKAGE_FIND_VERSION}") + set(PACKAGE_VERSION_COMPATIBLE FALSE) +else() + set(PACKAGE_VERSION_COMPATIBLE TRUE) + if ("${PACKAGE_VERSION}" VERSION_EQUAL "${PACKAGE_FIND_VERSION}") + set(PACKAGE_VERSION_EXACT TRUE) + endif() +endif() diff --git a/bsnes/thrift/libevent/lib/cmake/libevent/LibeventTargets-static-release.cmake b/bsnes/thrift/libevent/lib/cmake/libevent/LibeventTargets-static-release.cmake new file mode 100644 index 00000000..1fddfd66 --- /dev/null +++ b/bsnes/thrift/libevent/lib/cmake/libevent/LibeventTargets-static-release.cmake @@ -0,0 +1,29 @@ +#---------------------------------------------------------------- +# Generated CMake target import file for configuration "Release". +#---------------------------------------------------------------- + +# Commands may need to know the format version. +set(CMAKE_IMPORT_FILE_VERSION 1) + +# Import target "libevent::core" for configuration "Release" +set_property(TARGET libevent::core APPEND PROPERTY IMPORTED_CONFIGURATIONS RELEASE) +set_target_properties(libevent::core PROPERTIES + IMPORTED_LINK_INTERFACE_LANGUAGES_RELEASE "C" + IMPORTED_LOCATION_RELEASE "${_IMPORT_PREFIX}/lib/event_core.lib" + ) + +list(APPEND _IMPORT_CHECK_TARGETS libevent::core ) +list(APPEND _IMPORT_CHECK_FILES_FOR_libevent::core "${_IMPORT_PREFIX}/lib/event_core.lib" ) + +# Import target "libevent::extra" for configuration "Release" +set_property(TARGET libevent::extra APPEND PROPERTY IMPORTED_CONFIGURATIONS RELEASE) +set_target_properties(libevent::extra PROPERTIES + IMPORTED_LINK_INTERFACE_LANGUAGES_RELEASE "C" + IMPORTED_LOCATION_RELEASE "${_IMPORT_PREFIX}/lib/event_extra.lib" + ) + +list(APPEND _IMPORT_CHECK_TARGETS libevent::extra ) +list(APPEND _IMPORT_CHECK_FILES_FOR_libevent::extra "${_IMPORT_PREFIX}/lib/event_extra.lib" ) + +# Commands beyond this point should not need to know the version. +set(CMAKE_IMPORT_FILE_VERSION) diff --git a/bsnes/thrift/libevent/lib/cmake/libevent/LibeventTargets-static.cmake b/bsnes/thrift/libevent/lib/cmake/libevent/LibeventTargets-static.cmake new file mode 100644 index 00000000..569e42af --- /dev/null +++ b/bsnes/thrift/libevent/lib/cmake/libevent/LibeventTargets-static.cmake @@ -0,0 +1,101 @@ +# Generated by CMake + +if("${CMAKE_MAJOR_VERSION}.${CMAKE_MINOR_VERSION}" LESS 2.5) + message(FATAL_ERROR "CMake >= 2.6.0 required") +endif() +cmake_policy(PUSH) +cmake_policy(VERSION 2.6...3.18) +#---------------------------------------------------------------- +# Generated CMake target import file. +#---------------------------------------------------------------- + +# Commands may need to know the format version. +set(CMAKE_IMPORT_FILE_VERSION 1) + +# Protect against multiple inclusion, which would fail when already imported targets are added once more. +set(_targetsDefined) +set(_targetsNotDefined) +set(_expectedTargets) +foreach(_expectedTarget libevent::core libevent::extra) + list(APPEND _expectedTargets ${_expectedTarget}) + if(NOT TARGET ${_expectedTarget}) + list(APPEND _targetsNotDefined ${_expectedTarget}) + endif() + if(TARGET ${_expectedTarget}) + list(APPEND _targetsDefined ${_expectedTarget}) + endif() +endforeach() +if("${_targetsDefined}" STREQUAL "${_expectedTargets}") + unset(_targetsDefined) + unset(_targetsNotDefined) + unset(_expectedTargets) + set(CMAKE_IMPORT_FILE_VERSION) + cmake_policy(POP) + return() +endif() +if(NOT "${_targetsDefined}" STREQUAL "") + message(FATAL_ERROR "Some (but not all) targets in this export set were already defined.\nTargets Defined: ${_targetsDefined}\nTargets not yet defined: ${_targetsNotDefined}\n") +endif() +unset(_targetsDefined) +unset(_targetsNotDefined) +unset(_expectedTargets) + + +# The installation prefix configured by this project. +set(_IMPORT_PREFIX "D:/git/smd_ida_tools2/Gensida/libevent") + +# Create imported target libevent::core +add_library(libevent::core STATIC IMPORTED) + +set_target_properties(libevent::core PROPERTIES + INTERFACE_INCLUDE_DIRECTORIES "${_IMPORT_PREFIX}/include" + INTERFACE_LINK_LIBRARIES "ws2_32;shell32;advapi32;iphlpapi" +) + +# Create imported target libevent::extra +add_library(libevent::extra STATIC IMPORTED) + +set_target_properties(libevent::extra PROPERTIES + INTERFACE_INCLUDE_DIRECTORIES "${_IMPORT_PREFIX}/include" + INTERFACE_LINK_LIBRARIES "ws2_32;shell32;advapi32;libevent::core" +) + +if(CMAKE_VERSION VERSION_LESS 2.8.12) + message(FATAL_ERROR "This file relies on consumers using CMake 2.8.12 or greater.") +endif() + +# Load information for each installed configuration. +get_filename_component(_DIR "${CMAKE_CURRENT_LIST_FILE}" PATH) +file(GLOB CONFIG_FILES "${_DIR}/LibeventTargets-static-*.cmake") +foreach(f ${CONFIG_FILES}) + include(${f}) +endforeach() + +# Cleanup temporary variables. +set(_IMPORT_PREFIX) + +# Loop over all imported files and verify that they actually exist +foreach(target ${_IMPORT_CHECK_TARGETS} ) + foreach(file ${_IMPORT_CHECK_FILES_FOR_${target}} ) + if(NOT EXISTS "${file}" ) + message(FATAL_ERROR "The imported target \"${target}\" references the file + \"${file}\" +but this file does not exist. Possible reasons include: +* The file was deleted, renamed, or moved to another location. +* An install or uninstall procedure did not complete successfully. +* The installation package was faulty and contained + \"${CMAKE_CURRENT_LIST_FILE}\" +but not all the files it references. +") + endif() + endforeach() + unset(_IMPORT_CHECK_FILES_FOR_${target}) +endforeach() +unset(_IMPORT_CHECK_TARGETS) + +# This file does not depend on other imported targets which have +# been exported from the same project but in a separate export set. + +# Commands beyond this point should not need to know the version. +set(CMAKE_IMPORT_FILE_VERSION) +cmake_policy(POP) diff --git a/bsnes/thrift/libevent/lib/event_32.lib b/bsnes/thrift/libevent/lib/event_32.lib new file mode 100644 index 0000000000000000000000000000000000000000..a95035a44449d5b054824a75c05b97b5b6a25947 GIT binary patch literal 539856 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νN6IBn#x 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 In!vIz7yYvd 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%0AIBq< zcLq4eU`x4J(ns<-NKCl&bp!7DF!HE=$3!S^25|EukoQo8@?HUMLl}8vUk*kn?+9?m z!pKX4yjTy`>u`}X?2wJVWC4?B#aZfu%5NqxORYE?d24`KXT@3Mkv_i*%%@hIjl46! zIC3rdu*jqFUk6~Wx8iK%jR9t|6=#u0>01iS16G`kyw`wv%Zjteqx$_+Vn7NPs=a*$ z+)rWTQGS~Y!9Ex+a`n}3e_)1KahCK^{muZU$cnSc?^D3MV#QhHQTbH^bI6Lbk#`E1 z=%JQ;*vLx)Ce@0wkv9aGo2)pCJgSfR5(84WQ1wv++{!TWsQg|5X1l~uZbHec2IgQG zc~pKUB}OE!9(mDu7;oSrXXt??za*~^?`q<^!4DYN2i>f=RVUbo^b z>7(-756m}KoQ=HbzaYQ3$km%)VER~bHu7!)rof7`q>sw41en!UoQ=HKf!S`wS>#dq z9RcPyiL0+ZE&vlhtp5B``K18U$BMH_-%Y?2SaFv0k-QRM9Ptz>JZ&`t;=%U}lDqNBXx?VnoEag|b)A1NT}Od1O!bMkwzi;JykY zkJ6`%E^~NnCy9R|U+0F!D&BPXOZ> z&H1fQUNd0YN?fS=C3)$^^1BU~c~+dI{Aj+q8kkL1oQ=GXfceUbv&bX+qKv^h zAue)8K5XQ51Lk@w&PLuCV5VAeHu9DM^MDm+kw^9W8Zd{fI2(DVfQi1*k`If#B*;sW z7?8q+(mxk)o-p#r9^3}ZQi-ciUseM1NEmsfFB^b)*NU^r?=fJ0v*IlIrTT4g6ZUm+ zk*lwMUBGy(IEy@Lzqd(@5Qtl-@>>Sn17YNmKEDRcL5Zuc{5}WfhcNP}KH_eUQj&0y zt505MV0uZMQ7)GJCPBssV7w8?TLjFCF!HEBS}QRig$q@FuL1W~1oA$OP~KO-{S<+` zCS$qm!lkbza7hvys{BZw`vNn}inGz@*}yEc;w<$+@*V?by%lF8?|onnS#cJ5)ILrD z6FZLcY~;g6UNSJLR-BEzA;65c;%wwC1g6Z2vyu0r#DuGl4Z!UTBah1OC@{ZSaW?5| zF&^VxT;z;$u}NPaU_4fwjlA1{nPTAER1G7DhJhCrGB!==qE>wF{ zCgAxkT;%G@Z)b@SK-@yfyB@d!VdT+z;^YYB%?55^79*a=k>%eUfBaiCi2rwtC zIGg%yHWA|?T;%F2zjRx^j#0!fH3l?J|;&fZ$5A(5y*QMm%y@9uLe+E6zsVN?;zb;%ww?0H(@{vyt}=Fej`yi#)22X8D}gaP`{( zxNZ^~s(p|=PlWO&0yiT9c`JZ<%8Ike?_0oBTXB~BQhj^}%qc6*MqbOwQA!dna-s4| z_PH-Gw@4hJL$%)-z|0RLkLsnMIi4hV9r``Hu+7Qg84o!a-s4|>FW>7 zO;((Zy!pVCSaCM>@hmW}TX8n>_5*XoinEb-7MS<~OFnGmr2x~zinGY0@$N8*p>iP? zs(x<*t{{v&(!Y`j<*f#8O&EEkf7^liO5*C%zvIB12_ui%Z|hs}oCq#*h920Ip9;(f zE6!4Wl;1hPEVbfn+_@ql@<#Hku1IlJ1b(W8!qafQD`n|;R|4KcYI$EN zz5nif1UTvk+fL;&sZSog53^SUxFq0)Mu4OCHY)-g<#%}mxK_Yzi2#=i+`b@OUQqeD zfonI-S}wu3D}fsqgbS{Z>wsGt0j?Ktnlp!#%K5ek zaP(fH#S!2x0`7$faJ1gEDFPgo-_Zzgl;76V!ne5H7fVP`q~r;ey)-wYQ}~xL|pN z^F@H8arUYpTyVTp6ORPp5`x+}y>IQ&AY5?z$X-1agbR+B-oLmd0vyTP9RZH)?$;6E z$d3OO0glqwW>$DT?FL+O1USFJ>eaF+x3bp$w) z=a?P7{79djLAYSOqW-OQ5YAq&u8jak`RE$~&I#Ov2ymo-Gb6x}yu}gVx&U`?1i1FV zZHWL!_TZBUa5S#_G6LLXz+H#{NAr(%cZAo2$-oT{!sP|oA?lAd2H}GBfX4R~5#Xqw z{#OJz8s~f&0gl@5?-AgrJ{r#nUoKS67e#<0dDljOYXMwF1UTvk2SG0iSsVL@9y-j4JNA|tljeG-+&9Af|E= zK78Gi&aw0&h~vu&a`W&c;_Kr`X~Z3aI7iL_0gGi~0K zIdjKO@#c@6I%}?XE~S)@2GHwRX=q1zp&^gz8=IUsa+G_NT6{b;?Qo8E%%h!DwO`%z=~R)m7J&g7AB8TeObvVo^ns})aRr^@g_6h;oAywPQRAp_0 zO?7apM#<2|CQnq0ccr?=j~`dr8L`sT*`W*r6(cB=qH+e8Ln$}>o&)u)2z?dQX%R|! zNKkz~m8&iAn}=&6uG!A!%Zr4}<*WE-E&n{iKWpfx zoN5fwW}&ow*Qvf)NbrP2k%F`X6rUhVEADEdmsVOuZOhG+8cwEfxsa;urowYsGestX zi|R#Ci$wu#1w|+397+`^I!oqI4uIl9I|_>CvJNC_Y;qhGAClxvP8?0@gfdh~nQF32 zE1ac&2UZjtCq-z4v*c0uhAuJpW-{j}o>Y__R0Wg^SC~T6vY->bfr&xoH6cOWy_^b^ zoa+1g8vKaVm`ks{zx1exP);+b^1WR76DsWrwD#XLpyASc7!;S@7EoMz?||ac`w$eD z-bqkgdamIpFSMZhsjaCfHfUYLv^}z!o%BUr5J8x&XDQ1xjE zf;Udp@=y`+s#a}bFWjSQ^k!>_I^b=Rwg;M=baRamM^t4ZNSZh}l+mC#i3>o{VA!F! zhL3iSpjtIj`G+}`6B0by*J|luXGsSb8Pb9=9_Yiw?6e;}_$S3f&73qO&)Gf;dw$wh zk>GNTDuk0-t|cKZK_jJJ6lBR$+$hm+s3)EbQ3rq zJ-sMVMJ)O6s^u-KYaMF&s5ti~#Dn-g;Ph%ivOT`PQ8HDnv0A!kzBHQJdjg)@`bB} zs^x=S9^do?Tqz=o;^*FinDYf$zQ0ix>IR~=imO3+GS*Tt=w@6Sh(f9;YzFfIUAZ|O zS88oLRda#L#5D$dfcP@y@0fJ)zosH=Xq?*ncT|q{Im+2t>J_HAp}TH(uCGgMPH|OS zR`11$&Xs-O?}3#`@}S|QQ0sxQM&%>NT|6Krs@lWWnt`1qQ$BXW&6PAAVr8TkfYX^y zhcX@17(tO*vL9I`#vKKUtxU>590@Y0T^~If)`x#Iyr5Y4>9223ty25jt zL}T1j*hRBb=mz=VQTs`dbxj=D;<_x?ikFF|^wA^T%dB`|9fDrthjxyrSPQ9DcK zRvO;GBBEOHOA%($FR42uEfu*CmK&|ajavGItecB0A9Z_BiafS?NOh0WQ{Gn6-c-Zh zWJz_%)J;nHa0t*XcBW{Z?`NmgxwW6OG8QB*DsXFc(rjKdB%@Co?;vOUA|yf~xr4MO zZG>z?ut&RyJlR}1H!fj&wjfc>-88q+Pe+ zD?zK;cDCVlWWyJs0P4twZ>knyK{cG6u_&Q1D_83!@{PfxVZ(DX7NvL--Oi26IMa(^ z#2W?}@zJux!6WM+NVuNMfTZi=P__5;1hRd&b5c>!$u zf)vu&G<4MoFe2Vdob3U*D^A9{kMj643^cQH<$HWv`CpAXePKXptd>Xo*9rdSLfN3I z==uALp1+uT{=YzjqEuhB6fXpj?Rp=*k?zM9caIk>?L%XHq3OQyTM(!0i=q9n#XLTs zfgzjLp`h5bK4AE5F#P@m#YVOv1hHwo2oybH;!siyKbq!olPm|tlDC0k$@@XEvG^Jk z^VWi5qtX)wnkkP#tv0B&2DKd&OF0ON7VaI&mqw^{xauC|76wQ=nXUaI%|R}VrdIPd z`mwq|l~IMqN-??c`$brrp<7S@pW?oJsBp?(q{UuY)WuH0u3c6&YF$iZdBtLrc-! zz@(j3omt#x`A2>F5J=3dOq~vQ5RIfxPznqK+6Iwu2SM{IPC`#mZ1@KmNpOwC5OJhh zJ|lUDy5u-%oT~AJC2g1L%Wea!z8lj%_#@z~N2{^SElca1B`>0e(4;-(*~``P5j1X) zv%W(Z?3I-vRQ0`?OcrHJypSUr-(HXJ`Q)ScU#Pi9J1T~T*AiO0XSoL)hY;xTy_HO( zEMtUKddgkpNLElzr(y8C1DzW%-1@wv!ka8it#kW+wY(`9WQ#zz+t|4wGfJ(iEU75` zvZ%LG*i`NPd7&fiRBhw5y4r?SF_@w)h{`G6M%Ahyvq?qx)dyWn6w`d;A_CweeD z^k71rq?V6-7zW1KJo{l>FX7sVYd5Zsaea^LG_Hmsb5snSAp}$8q;}5x+Jkg%%zn6_ z_)N4n7WX!ViO!9=kMcCUfaYE2kOYw*Rr^BKkW&;hiE?geh^$^!V2mgu%kLM?l2^bT zkl!s=;D6mfdc?dACbD;xvt$VZFhEmxS5hM?T6h_b!Is|~RrovFLb`tz<;K_a+xoAV+v= zc`hfIQm*rdN1Q%<2_)vWQPbWR*;AM7qF?v82{(_cq@iO@9GR`&pm=mT2Gm4k&Y{pe z@K;<8jZ|7R+wB9D#;dbjiiE#6=@v?icR7aP!9>eyFsy4_JK0xY02>lcm-yw zB>6Srb5=JOFy3qxw0)FVR(v#%OGFnN~INJ7}j#7fSDQDjdfA4R&L&K3BXP)P;vS7lbm9Qch8 zYC9YhPb}tvVikQD6c;cp8*u^e0L2AND$fN>h2Sq>%vin2334WJ(oKtoaz({7o5-U1 z!AD`0fI2`7=+b!_(aA^$DITXIuo^NKNP2Ry#X$rIh12#VUFg%(y6zg1Oz#XP#G@M1A& zzwFtu8YA#myURzqL?mJXq5L^2cg*0EJ-+A2e5$_bNeJnZg{1{`cV;?u*Ns!&y*-D_Nl?LH?C2n@JF7G9cwfAK!ZcCP6vc zY3gH3ztJZ_aeVWdeET$28yNZ0L8PmJx1sWBh)o~uW~E}{Ow^@#MuC_^5 z*%dU8W^p7r_ZrI?! zCL7(bFO-#xjiHj{B2+K^u9ClN@GDf6rUN%Znw$;{A;FfhKuhyjz*%|~Kt?$@OMW1k z|KVJK%A=Xu8*_nm;HENZD9gk$84v?|o(wDnGOH{}P6o2lCtrrXz-}@?TZPV&V!#6? z1o}Y8qt6J22F?hEcFFa1QuWyYR<8BgK)T1bjZC&!b83j$0PVtYmC%Tvsz}u=qZb~v zU=@1&xSK1*R%7jZv`ES$m{Fj3@O(2U9x^`xiig_{2;}ii8YrrHhf;t$a}b6(X!nt+ zk3jKo`*%=0+-`t&!_;U{>)>x}u<7F)?Iczp?1wiVt@1w}-E>3_xNWC_B1J`vptvoH z#RY0``YOo}w8Ee-Zs%$zgf3#aQhTTPXmpnLfxGC-ge+&)8P}T`leWq|{Dnxms;_X=^MLXSg?SS`rHMl}Yi6ZJ*CEbRmaVC{>~U=Fw& zATcA*tuwEu&?pR}yNRZmA=c?>CfYemd#9=)QiwsKTqP;L(>#Y{WZ_3Z2EvLLBq)V# zv$1O5N}n1^3GVGQWkrERdE4r1euyfzcz&Exh-~SrF`nd!B7<()@Z|2qNHF%w4IF|t zp_&vLor(n_WQcm2ZDLH_0TkPQ7bsrJ{|hKy$C(U@YkL+bUdN&4$+b=W3)|{fK}{68 z@GU6T*9)N52tOz8>~|$7_DcsfO{BmDind=^{~s6BY}{G$y`Y{HenPkW8^_`>fH;ld zazj_NA3WMln)dmX?H5rzTWAVaKIlW%Eiq2^-es#&FrjkW4)YxBBYz;*wEu;)j$b(maJ7{#8ADXCLv4P4{C=7I?lP_LltLWT<#q|BxYeTA~g$zg<~-dAb}Pq zlC~s)2&u65&_v&b?LpRVsmnnMM#Y{=XKk>zG$T31y{QR=s+z9AhVH_O$Q`5zl@_+f zSmr3+H5;qU)aB8MLGJ6W0YxkM4rLOkWTC}mF`5g%g`ilAX)oX=5&AGF)^RF!*6h8Y zxOxtQ;_9gZ#g#(#ge#>Pr26~11iin(dh&-D=dA%Qu&%P(d$fBNqnex>202kn+K#I1 z{oRU>I@KLD4p{?L*$2AiYQI!vAM93@{ZY66&J7N{yLun}MuDwaS@wt84#`rLeF&gW zaUIct|I&d?%d-C+0Q?-Fqqx4(fgkI@CS}>51OUGQ=sR4;bl_nf*tjhFvjE@^03Fvs zU+AFtvg|Jn5P2f;U+aO5%Cf(;27a#x#+7B)h(O6zONCOE{S%@&f$OA*ii)6NS@w^H zl&b9C5O@mL89gmO>k?zjvVRExo(1R}t_wQwR~^`(Ec^EWpaM`dE{6_0tpgop*?$B8 zV*!f86|V#T)PXT&+2;d*O>{t=4v5D4$PEB_qMTy%z^Jn92G+oaG7tsa$QssIgo*Cu zq%%P@Sa*esA&U@8+9cpZq&5W z%Z>UEP~50vF)8Cl-O`w-U1dzv(m`>fuK$daKKu!qW$OnTXl%n#CxMzTED-gm0ezud z_zSV4AH3&f8eC$mB@YbHiF1yrGpNTzOf+KEyN-Z^3N#E3I5eOS69N_s>OE(b1gVb- z`RRsyF&^T*$dDP~9b>Ev_9|ET_#Z4kDPdcbmJde}eC`BQ+p#+evX$L#nv`HcPv`Q+ z_~ttTlIUO0FpA(ZFmMsjLIp2C%md{w>_l2>O~Mr1JyM?)sKuLU2CQJ`G5^LykM^ZU zyGl-nx0C;-TMG&bdS7tno(Aif@*$4XHCfupE!3{uA6~$CcgL~zSurPa@_B^MJ4uC& z+~ou7YOr&JIULSGH2^`qAVyoYIBRwr5%85|6*Z#%r=}Qbo!3YOvy7)YVjtK zJ}>X2(b2ELscP@{3LB`tHnmBrMkk-#>F~vclTSW(s+!TBP9e}gSW7J41c9n=IAFt5 zA9bI;AdXY?z+P!_HHGN%^KAo__4;`>-PwB-*>8A zVhLjBBSwA|!%0#)jf+{QXmL`zus@$e8}pxHT}NtH&h847P+d-4MgO8cF-qa7oO0Kn zX{XfUGg0%JpOivPrP@*KJZw^+4q4KLbC(5EJ{Hz-v|MN#vu*u$rLI7=$P>l@>!If7rAXnBl> z(w^QUrtmb9{)b3-0umnQTt)+b_og_JG_m)i+ZZG1&XQ7V!u`n}f|#76_Y^pAC|^#=2cWV7P74aX@r_e!-b6r{1WXN+097X7*!iFYbT<;!CH5f^%~MCW^gxIEU^ad&0#?k6eUmQ`vbn-yqpG6?odH z!1#H?bUSQs9K6`5)=vbX3cYu5ymSgYC|=)_6kqL}|1w6Gb9EI~9C3OtAi~0iydd13 z;`O$%iIeJ=&WQv(FOozPYq1c-UG2?)%n;-5d{DpPawto1KP#y9xX%)y{{+S3?kZ4^ zpllsVYux9EP#O|3@AaVm5WMtUo*G9uT3jm>xaUE!lz7k)p1V%~TtJoCCiG4Ji5 z76_ad6!X3gYLW2U0*ZMLfqDv(915NLSRz6%fMSj`7>yF)*Bcab+z5&}=7U-;LKlN# z4j(Aq#M%jJg$R8Y6!U%tszk&V3%gt{LYsnO-u|Fg3BN(0m}49$=6C_rUq$GvM(ANs zyj0&2UDrb*v>Pbq9R!NYWeF%QmmQ!U6}W0p9B&K;0Z$0O#-Nz@GEf|E2B@b+s0$Qx z6oPtI_}v4FIqn0+9It|UL4>{uiaGpK0#%EqgMBpXz!pg<>YNUEVyu4?4$K~=q3R>m zug)WZ!wj5||gLaCfDE&of@F$7`` zfcnSJ=|h)PoIX@njYv}}=_ay++LPI7397A-Nz-p$d#4Fi7cK&NWJ=CiZ-B27Vs)90 zzKhu%PGS3KGm8$sSBF3NP6f0%cP>)%cgSwUxuFCt7d_I-rSzl5 zyj%CBe0~ZeT#?=XwO`uR{Lfufbc~}xlmFhuHjHZ&-5tjKSP`m{GE-2=Z#Z&3GWqceOlUMCH?K7m+L5P1Ga(9BP68G&_k(aJIh*Gm#Xl!%oj8<0zPN-3jV{L z#KGag3GTXG1vm{|*r2$sO>HBPZHSEa4$_8qp>%VG#F1lX33W}XHb2R^u^}1-^mm?t#<>mE8lUl8$CGNVPgz-CMr0wf4H^* zSw<`!20em-M>lX*Xm@QJeZZ5e?UHTKUH35=H&#_T6i!-B=SfJ#(f=E5vkU&`t~VW2 z-#D@#E>Jw4y9*SJ;~h#hs40T_1{56>!67l+xwBS5wGw``NSrUIow&ye>OtaL9qz6#;y?yv|xqz{y^ESy%*N|KL)bZ<+*ofOfPjYr0ISDb)Fpe^EL zHx6vYMQxsl;2iBp8Fq?2&g>JL^6-Cd%x@g(%-*41eaKy0m*p&ZjO1Wg9$aQv9zRD5 zomT=F?QM^Hw)bKd0EWW2x}x8}TN_(fL>*dAabHE-N`+b2SleA(9qkiEZZA6RRPpyw zIldl9ZC!R@H$1J@IVYo+vy^6l`Z8qAtN4c{V#U>$COK;3og0uTIzoB&!~6M^667YRm{)HRjEC z4UaA1lp53$0~Xd)7($gEUzL`fLe#o47!I&4b>J}k^dNW1qn2dLn+;q!?P3PPHPJr8YP zEgpAz7u#YS0g~dIJ0F!bn+$hT7DjJT@Xf_BkWAzcy%l1qDTX*`M9elCmTdk5H)mFj zNP8!EXL(!O=fL+jQox!*+>p+OqGD^YoWtqrgl!i@yvK{?HV89N_zJb*xDoMwN?mO{ zj_-&Z<9}^1a<@5N+4^u0x?f*27NArboE)KmV1I9HjY-JG7I&2{ByU(=>3 z@19%=AP*Ct2F1qXEGRY)m!Wjm;==hH+}SLDYf!Yh$fx*7;n{o-1I0#r8K_Z$_bE_p zf;NI;qy4>sBO}YW7eR3-nN~Ka6`2bClYu-gx(Sp?9AVK+%SQJ*BCoLzM7gA(*-CD@%g8*DJH zP;=5gJXJ8CJZdl2G}5O{XQ6)-TDr%XRgF=RfTR-yZ-M9mo0a;XD~frissm(k{m@Po z>%dK*SO;!1LQ9QMns{+2P1m{3NLRSdI)mamqZ8WfM=K3trCu*fF?Ql*1~KeU;ghIh zrJ)JL^RhxBC?02cv?Dpb;R(6E%*0&Z;H2T0wUPdryQw7dDHdxDN^be!L_BGv?er#Z zQOFo?Lq@V zwLlgf3KbXmIh1@*k ze6~}&C%S`y6 zyQ+y7B4~`QcyoaDl;21HY^lS(9J=`=8Z)>zMJHgIE%qHyL>(ZVFhRn$U--GMu4Ws8 zir*IH;2ppc=^u;4s6dJBA(1e_66+wbc4jUWKOS?^{w<65ucGXDa)Sq&P;{g%Sw4QO zT)Y~|RrbajQNY8J{6#9*i{DN{fKoV#-fiT6#}3M8D9r;U&%a{Cz?N@d}y*8U_@Rsl*`_@uLAM zA72yXBkaq8zDJ0?ZeR*8G`&ViHJaxW{J4cY!%q*+<6LxWK-f6BK>0UeT0)LPp=G!J zVqu3YI8Sn(19b+ML#f1ly}*&KEf>^DP&~<@4X@jTAC>m4f=Z{mpfYjK7Ls#8v1D3f zZY)Aq;jW6%$BfYZM(9_d28+<+MrbrDjz<&;pytBgq0qJsr)3N%9w|%%)l7sIg5qa! z?g7Pp%_>k+Md)Lo{vzUd2^6P~l!HU7K@Ab12aM2OumfzQ^r;*hY_TIznBX_ja)q2W zk!g8cuE{q-!Le1O{(>##<%Su;lOZk|*r@*3 ztjPC5y-jUSS%X38c2;nx93I<`>C?sQ=+g+}-nz4&38!uEe6lQGTHJlZ%lD)>9SKIb06q zR^0y-)C0J)cCH1*8bJn$3vV|lIjZ3CpYc*QV-71`wX-g{2*_;b#u`cw#@i_4KZ?&s zJ6D#Y67U9gx$;iLd?y5vtfIWe!vRy<@_r&ZQauD5i< zOO1^Q&M@qtuvcwf6^izFk*U)-GMm-%DqeV)kL> zO;i($!c(a+zvh-N;#y{jg>U3u{e4dHxqkB+ZAH|GyLK_yb1*T4%pGd)cbv;_g@0CA zat59s&EK1=?Fta=E^pUE&96lN+puV1dY$5pt#YJe>O^M)*l(WU_aZ3fpuGg9sMpaqv6fUrh}@sFo`q{jroXl7 zYpABw}P?C4M&e&|q~v9Z_zvSo{iFiJk$mxx}%M>4SnL2?a&JiiQm-jDc# zm;zEkdxNk*>9RY|;rGp9@Qh(-5{{?|1yh4x5vOX)shraGWNAZN!jxq7RdoEVBp()s2^d{8#UPCR{7114UQ%v!%UJOjBD_SLzA##GzU5civ87s(d zQQO^1>6e_5grS@ry)f7WQqf_c-54dN@0=1*N$tL~=ys^Exl`&1ibu|)L3I_O6OB;P z^OZ=YLwN$!3PDi^o+@yE163ycHiJqNe%nE@aHVgj$FiKIm*B3S zAT@Jsr=pK4yi$f{Y@#s+mRI;`b2%fU5%Nw**OryxPA@6U(lVRS*jsCc@ilZ5>u^|+ zVT%H^kG8ZBD60O3v`$Dv$r5MS9%Br|IS<^cu1D0#T~(bN7n1@x#kw9@?U$p7$Ivu=On z1{#;o%3si-voS`kLKRR_P=%xkl`T;UT%iL%af77Ia`yWtsJlc3yaS56AZo50+65up zaC?CA3Y@u-Ch6~S)Xw5PUm;c%Y)-hqP6s>;%ExPh7YfLPBReuDEs!oA?2@|jVD}os zuRka@X+uF3iL_1zWoKHF@MP^y@nr2zchS)VddtWsc)C^}9ZS^{kK>{Cxxlf;>NE_n zUI*p`rXo5nxW1qs7fHwg#Sd`)1r!e`u{edjLM#vE;vqPC9P>kYC`Kq$;3=4N@zx^$ z2%mS6{(Jr_MVdlCt*14@<6WvIRHm#q_3r-v@mW23Pn0-kgr%s7#$4C# zi9PBvx%lZ!0j>T!lnJ2t*}dCA@xg_=LGh*_b=Lft&x4@Y%&i5*y7@k+yM>fbKrIl| z_n>%wLGu#US2CMCFZ}N-yOWTv&nqv5Y}m=5=Ye$nwh0morFi$Lf0o$}GB_j2pyrDR zt^*a&$m9Vm86CFnY+|hU4XyqWWm8Dz!oR|Zm*y%oy~jk|i1)w9qRnn*s9e%sF~3$M zL@sH6(k7Go<3ayx4;A@~hqRQdg_cQqCQBO033iQy4xvj};==rD8%@4wjD;n>U+ASr z>A85Y2>+*u_tdWVxV^?@`a|+OG*l3#s{qnu=5HDE5uPa6vazRVRGw` zOF(h?(}0LdE_N?JirkJG|~gG&m0(L>BGOTyKl1$yJMb8>%-s z(!=sQMU!h|9N1Dd)E#>QF9y{= zpk?7B9e7FYlH+9vHE)#RG}Rxd7Anos1J06K0CHiuN{P_o|8K@b?($Jd!a8}%y);Z; z=C{dqbuY~A4i)xOR?64)#93*c^^Z~^KHJaw|Ky3ji9;lJZ zaC4`5E1PQCbYL~24GdNzTI6TH0>h8^ICMQIHqdnTS1#b&bhGFm@nB_OZ;MthTe;|T zNy`GVD6RA`2*pxoN^xzJw{`KKcx2TDA9Z)dG3va_)#J67;Gd)X&xzV*_~#J)vwO$; z^us-JpIA04<$Z8y&`G^B-k0qP{NO?TroIy86S|xBE_C9(ShI2VgDRnP554DuhQ4U{ zEzoVxhpIRqtSHN*9y>q5WJM+*DeWwl#G7oGjoN;m{O6O4AS*|co8tBM?Yk%j^zC@J zP_<}USQLfbao07JeLD<_+$E5GyBO?JaW}@^R$}Ui>FkgdW z<>-zOrl`;6(5awUO=z~w6wL#;Z+{Pz97xiN=aL;Ms4|gmG2G_$I(m4RUr~i`3Hgu8 zmE*+CNmTHXIG|USb6)LPQ|2SYksLRI;um_QV)9F&ay(u^X{si8aO& z6I+Z*uxpIQ!v8sQ?!9|4>ucWc`+onc?4G?d=b4!^XZo2Le%D8R7iu5t4KNxOQK)_) z&A%ml{j^nu5Q?S&n{)-QJJP^F=KOtT>mHwwpmSr6lyn@t!PiOe)4s^oq$-T!?z_+ReI4zWA-fybBXpgE|^zDTd>#U znvE>nZwkp8v%d=pQ82CN<06nL3tLg%n4@w`b~{m6gu#rUV$2=l`rMR%F!wHIfQQjO#2gDdO3d5ZE4JiS9nbWgZk-V+$>Mo1Lqtz3?&znG ze%VJCnvl^JZ9?w z50gVKXk+~H_n;{G1&LCipBjyGtwS)QhAXF#U_Z2$@0o0ysmqbqK`ds$_*tx{A-giO z$KjmXF)-4+KLgb+S4j5pJ|^p3m$bWBaodfUz`iuC2q3l+L}3uwAgGzZ#3iP){YZ6C zRh#JU9WDsmIoFf~ccmnh5}wlm0BaAqD1>I-8P`FS1x*nM#;JsF(f`n(pT-<3sQ=4> z>s0@D!$GV6Q+2Zbesu}H}LW9gv2MTBq$vRlnQU6-` z=?WmN^1pI@i}Ei)j8x@63ExhXe;Z!^?;`(yPyhlE2~7d0fuB?Wp!MNCstQBpQSue7 zS84z{QwH8jXuRdvN9)i%XrOwP%Lkn{Y6~yLKGVnfN~oa(rd(O*GuZlVIL@0CHM7u9 ztv-g>9w{n0fx?CUD*E{9|A#(iBSVEgiuG#!Lx9FM}*rI=~?cwgqyZ z&el||A2YB24f_FM2#^>`QFsq1vc4QwG~G^pmqNzf!Wa{iip|VXSi7;E zMBKSn&f-&MP@Q8gjOU7gN;P;nlO5a5$(GzpuE6`D0>6g}Tnvd!HoNFm}8-I+}BK?VwT?P;Q8$PO6FwWaMa2%)1U0BmWGFd8>IS zu1TQS^;=NvdP1cNqeINDeL-<&JrUGc5n3iFPSKa3cuaQ&6m$Hd`g^SUljohIjOdNQ z?*BqaQ1)0a)(|Yc;m$DoOcUBAnEIJ*eD|QOEgNr%Q-m0};CdQN78cNefJXAEzF6R2 zfgIEhOH9@shww^DD@B)i%3Avr9nvYZwq&y|Cja)1*eN13Ppn&uHD&Z%uy&0_CoENS zS+o&b)=^?8xOz<^2C;gr&p0MrC(WlXSTkT(L9hoKrPI8DjU8ZDn$?GvNwGxgoBJvG z&8lFshZ|s(=(`(Qh7HU~-{S5(?Yi;`hBcjGp)Bt$9~<102qABqjIG^;K5g+y!t zbBkV)*`-WkMZEYwmcvD?=+r5e2}*Sdll6NFT5_CnOST066e%s9lL?x-99{=ZJmzZ+ zYPL|1;h=aCdM#3zppCsZB(JU_okacuDw0ulRQ+2XsP!XUww5DN$q8uQ<*z$!;gA>9}`v(V&q zjDNonTN5GkLTm$2yjIf|6br96s0kur37|M(dnF0~sV-NnoLa$6qNwLv{FP%424q(-1PHZ(6ZQN+dsie%{_1>>e(v0xS4=n0JV zURwZee8-5ZB*zUVi3iiHiizfI&>i?wnRGMTaH(WVEa2zkdMexH8BeS`fnCUgbJ33m zZ&s`v`{7iy%W1#mAE4VDjX_DiV{+)0vo18>WfG%gi=zD~BeQH;3iyL8Fl_?9lbowt!n%F~_LC57#=VMFNWzmIVn>Ru>Mh}a=3^Z(Cbdl0NpKe9kY*2bwL6nhf{ zB%u<~+v9Mox+r3~n<;Rn#r3(^zby)idOHHl zGrgJBE=q{Pj)<0~nMfsiazvi z#8R8OVzMkXapY8CXS^yVWWAihchVI53wtNt%}?d0fjv~%y{Ot!7V+lN^A0F7MAAt; z@p)dbyJ?t~O8{2DMm>OtxQ)OuY?8{tgr)9{|N1Kd7$MJ><}S2gSViLAl^hCp}jwZG zBHR+7SV9#+v4p5=nJ--Hfnt;{pjblvKyeJnvYum*0*d7_3KYlQ3aXF?g-bhS7-c>v zj?0&z+=MGlBeE+D-RT5Ps?(b_zKE?T5oE=WlOaNIm-1^@uZyxPDjup);^gx&tH{-g z-NZ^p$7PC|Xb|mSq)weE8dMdcxl+eHPtiR}EBhL+eNcXGIY(L9xHZpq}E7H=}TKNQOE5 z?h&XT1jpZ?n4=c3mI}P4_+%BQqIyF3>j;Yd4Fq*syo*uaSwa28F;L%q4T{6v1d67# zdA1+DWqEUfAq+aH*(Hx124PVazhv}DY`&dbA9S+i(w&dbj5{$}$nRu374-AiP@1yo z?m~0i%`y(_GZq5($sU|)5_E2CEo1{`nr#=1dh>qkZ>{(I2D{cPIB-??cD)dEd8~W> zfuMWiBIH(BYa1U&T?utuyD$A&>k$_^1^s04F$2;ZbTIX(@nE5VFx$xv_COq{vBw=nH2(z8VEhkgEBhGnqI|ZFhok{z(BM>aZw1mh@eV>6bo(YFBwr6;4mN zPi)wUg_6+8LnygpD;73aZ6hA>+M4L^lBSL`)Yq^G?s70wKx3xDfcH6>Q^BKpz~}@= z%BTN_U>r8Q)^Yxb;7s_X3vRaJJGAkWkmkdE$Bm?uUe?hI+pE`>?cCAjEKC>9pk%k4 zVI5scN~>#XKGZ+0rn*Lf3Z)!b{5ml_hjFZpJERAU`3KF`9NaHH+;_|hI(CD?qlG+* z2p#w%WQ8TZ#q?X5?cl9o1rN4w0uNkP2ZEvnFr5?!>IHh)Iw=hlmk%n9`QjakjNh#R z#lxfnpqTdrsAs|-naQ!g20*0+HJz|c=kd813$ewSYB`K9@+co1IASRxvJt~lAF7+t zCC7vnDe|Cw*3teFHcu#fKmcCWwEw1>h5)2`bo4l0{WDrng50>9dwkbY{k14C8 zmcI%j%%ZS93)N>(ts%$KnG%!4Y5AL~9o{rQ8V3jH zGpMF|{kUY_7%F6tzJt<)i{XBTzYyCj5`HL6S;)beV8w-*fzZs;*R4H&m$2={VbiWBU5~`?B{%XG zQYTw*8S@W^W*#2Dp5ew7q3y*6LN=oE5G66oN)a+?B8)QBi1uze$`POZ;3%q&GL+}x z7{0zPKE;USA9oT#XiR^~zb%Hao3vY9~ffbkYuT) zMuB2w9R?~3e>$ z=4>`OIjSd;tLAReR`|&o+8q>U=nznxdDQuDDO%@|pg8j~K|R5rPWl3$a}a%R2RPV)n}UsBxW zA~GLyjhQ^xD61LchuCtmR?Sc%jv4SbL;*o7p&|mTKNRGsxyr1$*m`3r$J=g7s8j7H z6)~7>oCrE^ilVL7emngdh@T7ng2lI5+O#@G`J&M=%D8<>?KImjo1_WbgV)QPrj|;l z;RaVR!Jt?p-v?zu#_(oT-U%}u?^sKZfhr>LC^8J6E~sF9vMUW0_2L~>K-4Db z1pX93kt(tFZ3V^JcODe$|20shkr}Du9O^$X}1{2&gNiLveEXJoEDK=gItJd_NEu~xqD=noD zBFr*<7Zl5M5Ga-!Kh+P11_e;als)8)f5Mn9W9^qB>DFcfE11XznAdjx~M~tKWXJNUDcD z(U|)Kq8)3!sn=($Au1nNQHz0ltTkUZyzs6z0LBqtTXJlxsf&!o)t9ytwtLoGRNS-{ z48l^x`V5AER*`y&PYxBeJRQ0{7*TRmkYZ>;2dc|z zDhqa~zp43pU!=z3t#x4fKM!eW_*2++FLw&U$#3f;ZxGE&EtMNbnjrRC&h|^ESXlSS z1wr6CswTOAgsY&{?U=cBh#8vWMVhm#9oQ{yBC`ZyL6z}(U13bN9Vfv-r*~3^iAH#o zI2zcAaf7Y1FJ|)f87X*~KH9@upFw3K%=T_4+t-J{Xl~97mJ%!h#eW<4%5PuF)*IVG z+Z%$q;%ERGLCV|s53y&6tFmec2a{13;hcX^aZSrJ+1mRCCF}I|hZL5roiD71^qbqE z*9n8|&IZapoEO?o5dOCI{*;}9n?hCRd0^)xL&9)r1(1{_n!HHaGj$C08Fo0)25p%U zVwdG@wuSq4!tvP@G^#I*91tok9fn~-sIxzfBosSP%ob^av$X1Dn|4UV{W$CpCT#_Y zOJua$w^7VFa#`=9V`|F!p7KMy$!m!Y1@4;E)B;$mCp1Ul9*K?Mm^gs6Q67(&?4=GV zT?rZ^i>$;Eg(7RwZRITG8iy)TQBgTMrBsvQoLO84r>7C(|KRz*IiJ~4eN(@ftM8$p zrXqeiiS&qvE!61o&hHzbLOsa!B`9xH+OFbS<%i&Km1q`>OdnmPZusQ0o%?|*B{-r% zl@$~Xi1=*h;h^|zXId~d2-hi~stbx1LTd`@Q&6=8^(Cmff}-Z3zM#GX#b-Nz52}fH zcMOzXG%CMLhJd0%heZHTB?RwCP~0G8fTH?VC+!8r zaw(3Qol)KcMg4xA)L*4O1;t~7WuT%2-da$Mmko+iuaj~>EfmxxP_e?_E!AI1O!hKL zWl%iA2m{6WF%T4wE9kx!&bNiC>kptvN;>HZsK=mOrR$*n6x1zHPXu)v)L(+S59+C) z9)o%&sHdR*7Ssz+H0h7Xp<*YaDpyGd>ZPDOK)n)_H>i9;i96mPFITLtc1JUgB}LdR zCu2Dq4f+gt(>Cat$-t+Bn^De9nETpBvzbPm=p05jF#X-B`FB*#)HTRWekTDyHR=@c zz0)rp-*mFt)FKd~ev6(*1|j+_Pp!{!#>yj1BI&nuF2t|t{IV9-=Qv~KBEOf7K;iw0 z^*QR%{ruY9;k}vlIZjzw&F?)N?^{}*d+Vpp=J%fBa21+kXAh{3&MA}ZRFC2;VVd&S zXGFt4_0huoqH*g9gmeoEgb0TDwTMMikQD-V(RYche#qh(YklU5^9=CLsNWpwf%|}g z6%m3>9Ko0{)n~ZCh4!bJp5l^M z88%Sl8FQu-J2`w&xngzTJ}n?v59&ySL67v)>24$}JA?#{!S&q}{h$+}WEe}TrN_2| zW=MvKBu6r(j%Nt1T+VQkekHwhZW5agP@)e(=}b`&57JD*(IG+lE#A#I_d@K6g-C%y zg7Wm!KNnt)!?n4bxArt0=?n3t!_gdd%%-?m4;DfW1(Q<@oQ(EPB1NXC!w&vfoau>v z9LXX!H0Y*2a|KC-mbgQjjq=cE(iI^qknMf|pjd1(Af3iN_X-*79N#MFItPtGCqndX zo?_-axOs?QpuP=05O81{yKWbJ<7O^D_mH69^wTe+*oH-Alfos?1;|lnO|IumcJB#7 z{z7V2=%P!g>tCc+xNa44G+JL7^qEv)kcYr0IMfvpP6QOm9u4Pp68k`c{-?q@7kF=Y z)(X760CNa@IBZvutsx{iy4oJ+|2QOOv=1kV-y+9iaKwdns>DO=!*M@0vI=ewNsv*; zDGd!A+_BKvX72jTX(Vu?^(FP8LH_HgFZ^#jCy6Ks#nMrf2I03&lT4k6s9E?rs5(#r z$#+A%H%B?%BXP{&`vwLwZ7jghe2iZpR`sA9Lx_V?27oW2feJ>JOWqX1t_b}{VHYvfXU2nc#4@ul zey-5#Gsy}|TQYS2qGT9tIeV_?)N+wS(bJR*xQViH2*tx$(LkvXxjjm5b8KV}UB@Wsr)eQ-{s-L)2xcBgDK|w?a zAsDHHiz@h4eyBc_`|(&QE3e-IU&71}Rfy8z6>E63qC?Fi9i&aoB~5%$^9l1+YIQZU zS=1^k*C3QfAUwVg1I1k(vVHS_)Ugh)Qp;3|x{B<2My38#DO#(aBzXPs`K_R+>oZMI z2ULn|2TF@~GeNQIMo^4=N~P|A;_ZFZ6=Tj3mp>>{SaRf;Yz z;x3!8@@hbbk!&_Mu;#j023m8yEOo5UeDs+UftfzKA?oCgfpi9uza6TyI~Z4c^V z7&f>zKAbn8pbsNlyT~IL_zB)nh-O!VGxDY5>gu5A0#RF**)ni+6kDXbQ^lZ}R$88l;k z+ICBnK>28kfw*d{~(?j%CaGH%qkyF}3gfwn#k7cV7fmun-=-k$XgY6q) zxv8^BoCs*LXQhK%?}Jl7KND1OW4hj_;|zUq^9;RD+r|3g#>M!(4!_soH?Hw8X5%-m z@-UyoZ`=rByn^4j5yE`mWWD8*w#I}LMYCLB1e=8mV{MaYs7YoXC31p&kl_?x@rq9V zvWEwYgoI)2E6BKp~UV@?`++V2M5Kvs0sgS)d-Wl*|6I5+{_7zkseA4($wMTGVTUriNZMK{R7-1`R zk}w}I*($<7?~&3&hoH;Jz0ug_JE+F8RN(dIOKEqpBp}vVkp}rlA4(3=1O!STQZ#5^ z12v+rsSWNeWm`>?ZJWq>+e4glKr_)cal?CZF3GqjYMhoC1G zs8>hMi~P=XTDE`wlyyjbo-0mxQk@i~Z(`j>joSOY!m82=SX?U9(Yp#l%pAKvBk50`o9wJu z>?#Ja|G4FzWC~SDAQMwEHYI(b^IP`?0VYvoaYs-z`@|MMhcW5eDab6A4Swd-ibd0@3o`D48LT&39)@x z*KB)cGX{p)u2F9$7X`qSF&pT9EpHW>z=%{JJOBxI5t;O(3$1eQaea2)2gSMQI(Y7b6_XXH{7B=nq1N9NwaSexO5D^_$BWF}tnDv5)af=4n#YidIUHFcK5hFg%3d9Mc07e}9PVcq~oB znP|ow)4Hy5$fLZK`7rcDqO;n1lXZQDpV)7MW7CO#N~y%|ZEVqAwG}~RjV={DB^4GY z=va>RRE`YDbA`DEyg^>0o8b?ZYG0DB(-|*C%vlxvI-$it@xgW)IZtguN-Qp)S0=!gfd~ZRUYH!7dV)+3S2q0Z9#n~VmBC6nxGQZ zcN9+_YNpXb(>j-O?;hk2-7FPm(CksVS89Qm7(ZD~tJGm3G% z{`-^KR$Cb1$VUNZWT#yXZdNDF(-d@x?lgLt=N&u+>kFe@NEiMzH~*HTqX-8Td4GA{ zSg|j_3U`VT>)MtC*$^s7zqv3XP+N0t`M(IiG8yJqq?!_yB*rvUQ}%JxloTf$W^#@T zjn6x0w4IZiYwI=GEgaKt))h15?=iLr@yJh$H(8$*PP+}^43gutoa0neuABZvd?1g@ zX&$*lQL7>IuU#b(P>> z#IH2shoVbYQyoXHu~?SlH^-JTkl)QJn1yEBBvIknOt8f|Y^fs02OXuXcxWvSOg=>F zaYyl&73Y&1D^4^#CTBcm&E>?l2=T;KHzsnmKJ!S+RpYOwPoGg6uAIhNj=J+-q^}s# zr_Z>JkuK?EVOb})(~6p+d13Zo+?$l0R#?u0P%4uo50UWP5y+oj@V-Jcru{(i9Pw;W zTnHC~S|wapfLbdG;aO13aS;@ARD?@4;YtnXw}K-U6#FAA_BRLA0{rQu#rULgzD}U7 z7aZqQS9erM%%`})iCH{iY~t1BK!q|njm5j z++EmU)7A2PA0f^ON6YMsmYJ#;7@VP`(Rnlx;*1eKfs6(Q)K{;LT`oTD^qVcN`J^tT zkomT~`A5*$pLJ^AQwvOo402Yt{?XapBvQIugyJgDEku&Cx?_IRJhcS3Bx z8`EC}81-}Zo6*F&m|ahpT$N4~SwUIWP!ExI)$tM<`L^f|>M92W>*pN6Wddfje|GNx zg{z}o*V5#A@Sx5Yx^XZ!5gAVz$}P1_ zXjuNf^q>F>1eOD={28YFob;AKIQT;8ZY%YnT$rGQP3EOb{S4L`DsJ|^3q z92$E|IYu3QnXqGbhH&vbTphWcEkqlXR`ha3t%u}gvL9r}?X`hjSMuOnRnN{K(bZSTft@T~f z>YHqxMMY7WWYz%Lk1IJm^|xSFin3pC`m5m?lHVrgy- zaG_yBxJX6?k&HK`fol%jCrGJ4O0o6|(PGeg*iw`emDAoJoP>z0gXHpQ0>v>Npi(1M zio!%oowCP}8oBujd=czLJN~uOfw^i(WfMiK)lc}dM z5}k}-Ou6+Rw68W&$N5PEu6d&NTmT?| zlxqUgu>ekCYAv#AArYKxn!?})%m~UG{&Z3|P~5l-2E|QO3Mjcpjgyl!WggLSgFO9l zinjA&PHvvymWwi9hJh)FZ7c8+s)Y(@!F*6kvegEPDkv0(XzUIG)c`dQj;}-nu?F&Q zwpyE&t=6!>dJjK@tZYx^L&E0+NZw{mQ-X4{<1k2p4UNNo5c2_75JR!aFVyyeDhH#{ z_Bf>Zm%rfkIM__QQ2O1nR}&UVM1Z(X!9Lz2Xd`(Xb4_;TY_nmQMhyZgGZF>$>~Vg) z>K0;qX=*;7Btz%Jc~PL~Asw|8F=b7mw|RxbvKAA8nG@f9lZP!1ojEqBmwVt4zonb(aS^H(c^*t5O5%QN+3zTjJ-7WIk z_I!ubXxDx*NNSvH!<6Grjk&sa-9gxe1rh>T=T)C(ufugAu zoirMhUQnNc@)6Wmpel%d*m_Vri9=JRTrbdImMQ90CJK%Z)OR!uL|X}U;&yDFoFQdn zjHCc1jHYRFNvlZF*ysHgRKxZX5w&F_etY!Qna8~ zdi!_qf+NH1yh08RF-4uwZ{AsyCYNl7tXEs_x$5Ei zEa+A02+YZa1U(s_g!;~C4=#kAZ#h`U&Rf~C^@x6SO?X()VM|%F-RuG*3j#L>9ZGFu zJm`X5c85FID|(1#LS&mM=t8Q0eva$YpjYD!n32a>Be1m~9+T@yS%OCq>8TwNc`UeI zAs1B7FefoK-z8d)CXFu^*kh*nvU!&i0Qoq0t{+Y=5WdG;m7Q6D@?KIZQ^BOc%JzXb zt2A1Ye`s~q`xtZ6f+cA!nb!#|MyFJ0H5M>Q%V~EAX}x12oeP%jJlp=)VB7!7PFm8V z+LqKV3aF!NLIt=V&KY1yhXozdThE|bp{zORLYorL+4~j>x}=}}Jxw}9?bUCYDl(jP z9EWpZiu4L3JbjUHhkfwWq9lK{bf{xsT$e7km0_euL*c(nQCK?L!z~5hlcdjhA0W7B zDI^OUKKGdHJu!)9@(9TqsbhIZ&7myA$}&z96nQBQKne`Y3Or@Z7n&Y~wR`+u)R)G6wl2Q;U3_xG5K3tPnITV|^d2Z~VNyZyu7bVlJ1Q_9P;8y_P^G-^ zo8Q$?DVo;jchnj%6%XnuxOAd5_!hr(;${RM212~@>eVU~Gk$j)6j!r_F`K}YUZu>S zIDS@8+yX8I#Vz1!P`=1bokVB1ar;9TxpKF$h)#)BEtTpDisLr|6vx2P)?mepHevm< zD}Ds&8SBhtX+r=0|F~+tV&G;#raHAv+PQZBX_h)BT&xg znxMD`(i9Z;Kxi1pJrL?-aSvnwC`O4~fO#MOnwrOvJ!`|sO)9qujA=EkPjLcJ(7v%n3#?@a<>)(OGEM1iV$cAR_t%T5 zoC*a3;^LL)q2Sn{W0sp{TV>mx1vnSruW`O+ zc|*Krnch>xTX?5jEw79jmBo6@<yQ1_a9uMGz=oXdIuU z!tY#AV;3Im8d0bV9Pu>eFY&n!eqlNcnkf%ZWRmSFRdp*Qxdl?bI5^0a{ZURbMcKj} zgi9);JkGF-Fg9$?%b#(Vy!U%cZWb>|dM%t%fM9N4m8uAe!=W%PAl}O3EF3Z>M;bhJ zk|*q^-LAWdm?>NZW6%5)CUcRmB50nJ#~FTU#)lVeYzoSe`6w*LCCn1!MSh&&RuH%@ z6z@QH$+MArGI`eK*m^a`n4&zX%3N4WaBozo0dZu~hx}|%IhZ1jcLYbdauklYBzmm?9iHN5)lpJ-!3UyZr1^xtJm@THpW|TK*#4+_GJhInFe? zQ=a`Q7gNO5TyRyb=qXj~;VG3xzLr3~dY*v}MMH=1Cf9_FR47rZTXZkSBO!35P|2Aiog^h40tQTRl&<2hgAfo2qB6k zQQlqhI$ijRTe2>~wF_%b1Y8SBq7wL(=ZK2M6k*Y%hpSYsW)aCZumWn#Qj+(5&nq6u zg(KX%Fy9P(ksdju+g(#9991!yB23Erf0l*S3@1K+P`Q{QF1owed7e;@MR|^?oJtz z{ZaX0igJ)S$k+GyQyyp7bR;UUX};^f!Y15X3NXH%VK4YcO512SXbOf)7E_d#FPP)C zdOJ+Rbz0?Oinx|J<; zXZVL1pL#-P+(m2@4oW3+6bywq$k#kgJ~+cZ!PxMrjS00d?7LtHj7ykH-h%s+imR2y zn{Zhcgh@5E@;Hm{MHQEPDS7xNT+TznJogsds{&WFh)%SNxLLcHBB|WunD}`}e#rIG z(6FM=Fr^Qm#Ef#9c}TmMBJE;s@ZXo3!gZxLLcHBB{{+1;pfEXczO4b}>cT z#oQGCKKN4}XW^9Pa9-0cg^Ti?xk$U1BJE->@}<=-XZV#EU)C-y2c?oZ3WmZQuWOex z?COjS94#*87W*z30^`1}UCwZ8skmARz6qCQ@w#?7!>zC4B8mm-E@$!OJbYcdoZ&VR zxaBIjW1gtERQSHz6=jqifp9429KFX4_@z8F!eqT;isTijaWQs}xbCRzY zz)&7%VJ!Jadd4Z<@qJm16;l+e<;>yhDfwdL<%^M*FC^~UsMP%uS9tWbQG-B687y_C z2w@E)Xrx|G!*NyRV2U_4GKVOojv2vT8m?<97gNMV3vHO+5c7Lp|6zV_vj*ok6^ALp z+3g4&vqj2$WQ2z6y2`~AaUEbTji$8KaQv=vFhv|k|G`0qpUQJXRC(BCZ;Os~omz zd%D~dehpY?Czn;iH@&JZ-t$MQioq25tRpb0dg&xD%MD2vcuROyxTu9@zf|KgMKvyS zk*_uQQyypd4H+M&=2VW(lRSFliWn(eZ^CCT@--20Rvu^g?=n8TXk&wya%?G$%tv7{ zE@3Wv3vMeF7i_8&--OHZAk6)5!KIz=)YC+~Aa4mWksuT4HMx_FIo8ywF-8454u`^c z_?B?YA{?>G(#Y+;GBT+N4CS!^fm0*d`*#k(wDO^ddd=DZwfA6%DyQ)=A#^AT*91#Kjm?T+mBN$YRrPYp^r4ON>fwK z6onSaoLuiEQy3Jo@(fowm?DlLoCfOMVl9Opg@at#AH89U$_{hTyZ7*?JkGF(Ij~Wu zYB}D7%^ZZQoz-%Noyyqosl~-hIi>|eU|hl+fj{MOhC52dC0~S1&zo>r7KHh+@W&s{ zaK{T=m)71=>&Hc<7Fc;I*+Vat3@j#4w#~Hz?|f(yCzo7!kEcnz$ZNlE?&xL z6c6Sjc``0xzW)~7c>>p^gojiDZDa|wktG@xyW*Yf6#*D&1%1fRC^h9wQHY-l?s9{@ zq`_wzN+nzxNnZDhTq&HbU2)@%TuvYIGgeJGQxx(ZMtM!z+BLp$Di>44mE)8vQV9s(<5e!Ei0c@0`FKb^ zm?igVRB$a-TQ<{GZl;L)N9KNmw*JW3CSou_~6doTvYhw4{GOGqnIL& z%Yvh784sxp=2wba(8@)lmFq!n=p~9zo?l@e%2}pJ-31QO#YRcm*-havX>_@@HOQ-Q>T*CbQEx0cQu8XE`PngPMRkeUAl8&nzX-3uZ zI#@Jd?NDyR6)s9C`=xwgic-p41OPX!cz&1jZ#yGvuH=&Tvbsxa5oQ=y?+^%Yrbq?U6Iw3IbP~JGB^Ed}gS*!xY87 zs^BPx1%a|I?IfQD?47o+kjxxyPC7e?&rB7EDZ-&63zhk?f)+2@{>&tmlPTh?$1xBi zs|o@?8=vIj2wfQ?k@I8~gDLXaSYU{eRdgkctf>BQj3g)}?3Z+mDbg|KBJ2bBQyypd z%^4p@R(e>-@x zFGYfH!evcxGW38r2d2QIKxd+amg29 z)AJ@=&OgHZ>@B!y0=HZRS8RAFBXN&|b<7+14jnrz!sCxDV6u)eMY0+#a9sYwTyh^x zOg>f-m?DG;jG*cH?9+s4Q#qI-j>*g+toVw+iVs$}7}JzT`&7OWTk-YRggI43V2Tjz zoceGNDLlF^tPyKSVpd4HJC#R$29G>UBzRH@Ma0Ts=n@$@8fEc&-Ln<=l8>V z^eJUdDqZZKkeQ+$8FP{^adaHs(BmwO1sn!@P;p5U9Pwa^a*%Nevmf}B#~JPy0@tOg zw^TK{s8kj9kX6z9t=g#4{R&sgoh+MOI+?hOY9u;Ml>k#Dfn@@vTwGBp?(sS)V*h%n zPxN-QdK;vID<&wR@M!>tL%QD;#!vZ~u3|Gq*sB=3IxJ;fo=eKw%Q|os)YSk51m81M z9Ht0oy}+qT^>7nK@d)wvEGzW zJkD@$vLq{dOBFF=RS|VVMbr%y8~NTZbEVYD64|_3n5RLRrKX%IO4}WlVgoO!O5kai zDlUgyeC}f&=cH%0)>64aF-fAlchn2+JZuvYoUP(AMYxX`*WXPl6IfmU!dvB; zr*bew9B!B;KtCVZqHDwc0u}H0p09E+MI2tt!C^#@XU#-|IQfEG>;;0CI4~86FvMJv zg)3f#gIw7k=^<03hs;5~{PCwe>`pr7z%J{+Mr*9)coQ~r5NYC0Kd8Z8@Pon@XRMD6sG?<|w1ZO)%ViY!ff39*eMVy_O^R;=$K^m?_Di>44)t$M@ zVqXvXQe^|ZrLv7m-Y5sZ>pSW2|GN#27!?qh_It@Il{Re7-PLB7grV&)9n%GjitxO>G7w|;233ZgPUjX0Q#u+!gypT+p#(c+Sp zFj~PBFfL)PeGBe%6&FydJl=%M@*vEkZ^4}-a9xBog%@_0c}qpRVVx&}cR(GZz~tvE zAaQ-e6s6=d=B`m#s$p@L4B!_1!!FG7LSe=CGL@St;$FgOqM91zogRgQT-hJx2vd~L z%t5}2X!@Scu$LE*mx4?3a)j>)fpH0Q|66d^2;6e(yrgxHt4b@b8(^jAE4{uhwhrM` z#Gj+wY3IbhR%O8yrFJ9Z8r(5TtHk4J*-9=Ou9S8MRxExg&vF%uDZ<*uX|JS{D($a` z(VCy|tZt#{Xh3$wu5iw`9|eria382oaO3b-(_@p%-WQLy>|(zU@M7Q3O)K@5moQz(i~Kml zy(e%(Q&N&r46!Lm!wd=WgJXurBw7q3;$jjFkk9E}MHhD6l^IS-GK-CtvjPc;mVj2dc4OP0FD3`-iW zgqD3(TutXdQi9|e7gA60$kvs}$guxOQqejt^B;;g3)B_}AbTk4;H4KYS z9TsVciZdi7!edlS{BT4hB)q!;(Hk0L2{0Ip$;pu^B=FRvv=l^n1VjlDa+W}}{xza& zAu}Lb07Q!HkcAT9)YFKRcne8UO&{WwoRne-GDN2&B`3p4W_xpXJ2IML%DJor_HVcl z{Tk5$>i_t}deEbkfXI~O$p2B;Pz^;3govX_#!~xup)G02EL+7#kijx?P*hS{qNP=< z8qt!XK%~NgF92wkl*q)?VeuAOP;X%E9>X4p^`H7!7lJ{qLAnkFAvOJXW$88D?jDmU zayB_7X>bf-LWDz-l7=M21Vkkb6WWx3;s{l>BqbRVk`jjmNUF{cj!&fbB$OdZl=UQS zD4)YeYK+Cuz4M@MZF{xp*-pU6|HH9+c!I-RU6P9Wqy-b#RCPog1Dk3<9QqV^W z1IiiI4$&H4P;Qhl4U!x=N@2H{)T9K|400YJM7eT#lY_xO1-c2qT2h0CjT#3wY5H!n z=8=P=P{gJ9PTd7|sx&Ne zWIY*96FT0;4@(=y^$jGX_>dz+Ob9L^en_0f5st#7xF`}%mAN7=TCPu&RMWdLhlA(y?&?O0xjEql|QbmqSNy(OY)aWqgO+{9Bf#S*a zAe0QnC^6O$OSLH6;*;YNk|UGj1ELcWxF8r3QTrz)ql^`BYae3?kFktMN*M~c$YFAk z5}uKlNW2ViWyq$&H;{NQM7@6c@^ig!oiTT~TV#ZbnPp)1snKaAVUF z5=Id?@*C=jf~QGyxVFN9Bl!xDx{pdlmiBL(hL$eT(l#m4l9H4F4es9^ZFD?9`}c@S zj!*6{k`ZG;8FEwrBH5_QhQ^GlOR+E~!aWwv=j(prRR`5?I9hoMA|?gH)ImUy+M(*z zRt%|zcvM`e^&$3Z4&T+Jka*Ex$5Q3xNS?-bNL*C1gF&iR@OL%nq7qFJ?%O5MYh+0O zPThO7?ebdEQ(}f78&E+g0vHjWC?K^_j7%J*jb?xpmc)&5TvDnf)c~Q3@*|o@B-K$( zrp6!_xj-2b(}oR>NihtGNsLK}v?QejiLO9YB=uZU(x5v%6VXXX8j^^jhsrP^atQhf zsi{=#lhFN&PD~v%7zJ`rV$2BtS^)-QYHHdr((zGAX@+4jk;uc)UTCrhwJ~-N9b^tS z_b?m7%zZ-#g&RACa>u57fRqR*s;4FNO;F#WdtyNVqKZUG5XF1J4-b^v%>U@AsqBe5>FF5(#%cZk?6INk{`Ae?)|`>>_lFU&%eF*K zv!1!K_QZZuMx#v|jy29*QTn2E?qS)di?)6>rk}rM-Ii@-8yc=Hs`AyMW`S<++SWGQ zSLnx8^{3zY{^_@Ub`?D@9gA*v_vd>z%ACHi`F`XIYwXgkjoOCanRhY!`6k^b`;JuT zEQRf@UuH*K?d4YEwNb0vjXqcX&yDrRxc}Pr+~KM9{%~K{sLh?;@5~ypeaoPF!fA}VzX)-du=O5cE-p{F) zSNrUH!?#ZTz^7@-jY>Dey+2vLCZg2WHzlSsign%exI@_byHm#3dB5wg z^%?~X$w@P8=r!}}293TRJ$PmO^uw{n4j%7rXmn%di!YnG&iMBH5|`xqo!foybzsj} zOU9COAO2F-DDCUD#B15v`a`m^ij|R9dk|$@GO1Ic&>cy zuU2;K6xlU(-w&l#K`)B`X zKDKqU)vaRIF7@tFJ}x}%kyk^{-I3|BpLDFA~_Dk7w2^pBD3No1LFGi!awRsp&HFv0UE`qxor2*OPv&)1{4c_2J=3 zuhy20IW@F$^;?!=9S)w}<~!EszH8VohIFs@k1ZUo-&yOC_vH^K6|URvaQK7S7cQ>) zXm4gjsk*v_muF{>vp4*?W%*mt>7hqYjJfypEUELc*+bJzQ| zMlU`3VD<5cJ+p4~DSmc-y=5VV&xge8r>w1A|It-TnYis!wvNixSF}v-JhJ_`%DRog z<1E`_X9u2d({JDQhJg?FuJy><>EiPwIOVes+V-gL{^Z9VfyMS#^UN7^Xz9I0zpuQ! z>3;UN`x-`lm+=0~bM7ODf09<|bdBqe8_fFAGye9+<$ip};#Y0k&n0)n-?(QjQpTK@ zebeVqnD3C(h0R0z`-S~@=8}S!H@QQ--o2V7Wetq(|M1q(o~Ms?y}S7A<+1y(K5G{p znc<`OKU_S0f4`=UdVTZ9ydu3Wce!x;kHqxN&p(>F;%cFjAJpx*>0AF(-M==niZ}8Yu$JSzuWCX`F_Lpnr8TaJayUMQ=w2ChI-U9Ea6DQAjW_>xN zRM1yznoSt~)sY)FJAYo+usOd<6Wf6Db*duGj?CpjTE#>6)pqr}(J+4Y&{>3)+H{8nvtoNxEjdwZ1MN_rIk!?H_u zs`1{i!Ag8T2=YFW*Gm7x$|iUFc~>3a*LTXw_PeJX3;euIl^+Hi8BsfLaETShY3WN9 z|0~>s`t7tP9aZoewsV;rG&|~o@>`K_r&Y^)1|^4|q?5em^CG9`${i<2WfoFXWX06J9 z@vKRqh@_XU8zVn2nY6O)vRNy(FKzY1I^&HhWxGs`tkUltKi}g|E3ZD-|C_euV=qql z#XK+E=lGtFC+Nzoi~nirXJ1u#J-nt>BCd}c*uO!zIpTW468jb1lAbd^oMv0UZRssv zkE+{i{@D7%DOEq8RW^J0ccJxXwaDF6XzGa2=0z_^Zkw0A9N+KJ;nHLGmu&TD|Eu*` zSAMUtYM~O|;6{l)8T&eY@TTx;Zohu5`jy}7-`iO3#`fM`=bAk2TOs*QymxZHzxJ8V z&ka+;tJ|x0o9%yoG)f8YynRiLM!V}xdQ*7jD$VPcoP9gDs4cHcm9;(X*1xt{M+MG3 zSEa&^Y+cV0ru0wxGzssvDz^TKfky)VIu)}q!vD|4Z5zfUZ>f_|tjFLx8$M4Q?s1?; z(a#<(d!Bl8Nma%Fj8EQ;jmTJPc|AQNybWU(yRUy|@Z_b%HoZ4tTYi^admoqZ|1Qb6 z^GnOdtZ#;V=6!tM%OAUpc)WCYYVxexN1NUKBYyC&cdIoV+Wi;5HOH#d-hOV;+P!DH zdmZa>-RDjxMSdS%T-#yq{LDWu47mMKmk*Z4S?nJV&(@nVVz(|=ww(3dV664&4==oDDEM>RZ8$nQpvtq)8kMR3b-m%0dlxe_zf)mc z%|orDSI(PuE%@q;e%G6iT)IxtccnZl_}0%pcp%+PR^ylQa>K+A*ESix;!w=gt^sG? z8*_Kb%*uz4EPDO7Qr=fhk+%Oi|E~FUccnaM|GsAY)T7pB%I`@}CViXo>Db;%_@#2Z z>kY2xpRL4CsuR9;ar}f9%I`ssFU@XIV$j!_-_*FbIxV{0)^h86&3zKQNlCv_Un>5` z$9252bNRAm%J1w~eJ(!OvEr=qyJf}B*M@#tXKbPAqrzXL9U5SX|1oj+u=Y`g(6c8t z#VphS>ZQV8hvUl>{RWS`8!7x-G8{wh=gkuN40*mJ<6}lUp-g+;_}jO*UHg1 z>jy7&b1Ogg%I=CA-@W!{<$A*wEV+I7`^TSFKOSCt-nazU4cnsf#_p+lcb98mtJYIe zf4|n@W{0vD0`H8Q7@pfBCVXI;-?e(3n%=9pb#C{3MSm{34I5Yb%$&;0|Jpr0eelTH z1D76qFTM8B?K@UxjXyN7bm^9xd-Q$3#=N=dP1oM8-m=@+oMKb$p;fJx;d_3r5IZ2? zn5|aj8j>&^gpw=hJyc_&1)D; zA}qJ|TprYTan+%X4xG94*{!(KS&jDYyu7@7jks%%?ydG*adK;+hqkq*#Qq0%UDuEL zvud~X=9QDr7Vo{{T8AQEZ%BW~tjITH#`oDFJ9j?s-@8?2G4l@NlD>1!9(v*Sd&cMM z%bhL!Rc1}sFOSq}5tA2nOrN+r;o&s*=+N^+fB1OR`Gmfk78h}gNj_J9S>2+)UQ+Os z`d|6|)62>$VrI0}om_o%;O0^zswwGF;&-!W`=8rQ*)itj{b;Y*?g%+%zGtIjG8gMk^kkKny=dS^lQF-L$Tk- zR=?Ws$gmr;e8NMAMPI!8PV*X4|kjW-HW!1N1w0xcb%d46Q({p@!+>RnMsR%@+R#3bisEuV-^|4 z`mOrB+qHB>e;Zd=G%&76%+qdtO9rpInsr=hAIHy`SYl6==r7Ff*OFYyw;FaMY^KYt zr!f;Vi#+~(sJ;2t?{+UhNlV%qb!LBT*@}U>QWs`qN5ohb7WuSf$Mbi}7Vne1G&e7& z^SuF^o-f}yt8((F3eRUxHD^8B+3G=+1&O(nhu#>`e?W)5LCcE$ID7x>h8arzHom8> z-OuYAS5Wfr?6TtKW3z*rjr88Jx`O@B3;iDaTEXR3UfjnM=clj!c6g&MxBSmQA)_`=xYp0!>5DH$ZD})iv%RJ9le9i1OSOA{?CSC5_PJd9eRK4knU}qv#Sa`> zp;@r!tN!CVO&E17U|wXEk3U$hpFFk5dbd9o9xt6SyUTB}A$iLNFDUWNotkAUF8OVG z)enPr%%7#yw}sa>eAR3~-1Hurgt-_y(1U%%%)zziGL+M((xXUuWv)SL>fr zK5f>lB|_0gokHG5w>py+=< z?Qy50`+2re>Vt+QYmPe9wM|T|J|~PB?{4!~%1eCJ_sbrf-g=?ssrxe17xU&-nxpUe z^O9Ff-+6cToUPw~A9U#0_xW9WEo=4dtyPnc{P5zVzG+v28jg@!xcOy$Qm@kPzL#3g z$o@7GX{Bo_w17m zn{&^^O$j-_WOw~rf3E&(&dEy)mM(qoaNdzMyJo$cQL5STK2`ReX??j=+LrpYCVran z+b7HW>~|aEcFA{hOk$OjIjy&K?ti#{_`~=OTiRd#sN%W3?^c?4^KRz4@=AYtTbG@w z2X)^qJz0C>#18wW4_H$tbo=hCGP~CNG5A#Bu1`Krd$6j)Li!^(Dsm&!tUwRxpmDp%&WG_Yj6Z?;-upurYR4+x-hCqQY+q${GVY?~(9EPEnKjDP z4tX&@y8PoMX?1q|dcN=ZxH|iSciei=#e2{2fJ3VnxCYmG__uq#k4sc?O}<;WV&K)U zj{f!WW|u}sjO`yyIltg*`_#6PmB+&6tyev#Ale(O$w@AW#>AfxZv1Ld!~kNv4*-_;vj1NPk<`(CvYhdM@de)atHrPbS3 zoH*0Qy<+^=q4Upwv1ZJx5d%&QN)Mx-<{NuN9h*PD!iket zZDmUoURk_h$cDJRn}4)={IVlBc;2M2j{Ans?Ye2ewr4)r^4Mn4xm*6ysg?t~);ag& z*ERMh8}G02?N)!!7mstpM=!K3*t)mqf_o>69x za7yYIk9w3_efP_UD@JvlI_{MFnCH6i!CMS#CT$rR{!^8`lQy5;-1u|@ePFW@xd~wb zH^y(DdwZb$K;F%^L8IF*-@l+;iAT3u6q{`v{`cC@isfqm(6sez+x=Xd7l4z?1d^VzG!?sziG~swtc5>-OxCr!E~?GPo$z9XGffr8m{^6_^qN- zy&o_Aar3f4MoE`e)$K1YOZoBr3O{e-ak0JY>QvWT?R`qr`0bwV&jl{ylWNDMu6pvq zZ*H-oMHWTJY$^VD)7;z_^M=0vexWNoM|nCFqL-}%`y zd41?kkCz{Pd?U)c$>@k>pP$=#zwhiJrCW9Ax}(cC^CJDX^~&x$`Iny7l@ZCYH!AvN zo44ww$6qe{!#88Ik2Rgux0a#ni#2VVU(a1sy+@B{GbVaZ2=`aYVK5dPlLO+TFIaRg zbdR{J6dW59X$ff1V1|oJI=>0P`eKx2xG-TPqX<_Qo5HSs2SmpVP8;IaonHJu_TD=_ zit79S-xxqeR8X3r7!ef^5CVjvlFg>~ND~x|DH{?9Nlc+ADxxAPqM~AbTd;tNh}aPo z8)8Gnjtv`%1r-~j;`f|$&%Jlf%xrc(kKez)dB1mE&OBe|b=%x2nVrR(N)i)Rn05NY zpvKCw<}&p!ya6IHVF0f>rum0Hno{?d;J=6o4Qh_gZtgRq4kLJbLt+BnV+A)dgr3>= z!eqGT0X{jIw!|bt7@0@c)ST{Ra7|*uUd+7z#cKH4kvk9GtDKl{5x&Fgw!eNn-pk;f z9*GI~1Z%t-Ye$Fa=X;rbiTM`ZkvVzGX+L`zyz??K0SZcOH{tx**6No*t(U=4BqltB@9;Wf#~(L%8N7!uG2v8r#};ol=y{m8-R*NA zF?grXA@J$C;UzzM8NBNyF#+#j!WRGP&mZP_nNGyuGuW{eo=Hrq@-q13x5R`q@Eu-1 zZ0_9PWez3=e<|Qd_;luhUqJEQWyZU<5)<&wGHivlzr9`HWw7N`U!d1X@BiV$bR`Dw zPQsGC{%rIxZytOuTw=mjc*ha&<3@L7z=OuPEeOmCi^#H8XoyzW`p;}I`|cR(d3K!u5^Ytwv%mjQcVBFsF#>Al~* zOfO>ewzFTSAD4TX!->IreQ}HZ;HlxCdYL3*U_elL_J1(pHZOAoG5EZLQSfO->SI1k zZ(>%$JC5i7-P->HZyp>qi3uIx9fn8f)zhwB<7N5~a~iy3o|9J{0|N>wAm*Q=h{5d? znO=)ltoAZT6LSW>!)xqQFTZ}c*KiNQOR_kq{cm(CgHW%?0= z>(OC*^krxaw^x5+@X3ET0?w;C|5q<_EHUT8JN8%h==QU{%m8BWE;QU4=Oky2_c8;C z!MpZwd%t?am%F^oAYzcjzNqPS?`AJ^95M6Y9lAdBPv^(r%LVRw4JPJMc*kw9bob30 zyvz_{@VhlQN;<49feFB!Cz+Vx@Q!`@MI@!g%M2w3@AJkz$J+OIEc7zaJut?;2L{L4 zj%#oK)61YsVnPkPV<~?Aq#ioZT^<}=i3xL=`Q@Iqzj&Du#7qV$&ahh+kFEDIBZ)Z+ z7@Rj2&71-of!hnWs>B4$gJWpGmzTrN!Oe_TdEg!Uq9%RUIbH^KpO7aC@7RWWR$i6w zWlkUlM-le>jy;2}^)e?0V8#%01QZkZWIz4+Mu9gE&4hFW65A_GdD7t>%RH-i`wiYa zX~dK;bKL{aJ>+E~#AGpZ{;*9x;~8BN6E0z9;*Y<=X76t23}VV5jN|#In=i@qG7y41 znprmKnN3~>OOlvS1bMJe=kIggQC}86HnGf$c=I1Z(=(By{s7OqJsfCt7 zkz<#5^PCib8B5GWcy9}@O*@Cd^ok{O9`}wT1~wSlb{;EwxXR1GbPVOetpmsNq&IJY z#&GAEKn&j1KNLP48M&mlm%)-GCg3+Ey2Gc#Z+gRLjGasjevca+x-IAq2Ow^*NyOl{ zv9P~p9=+~BF9S^vURT3As;9T#v((GL;VCfqoy+~;)BTfreCB0NC8h$Hj_~Qk=;)bV zW(qMofx$U*RdSNg*f@h15I@iG;}%z}5o zLhVku?rkqqNen(=0q51HS6>Vrh_rJYMim2vL1xU_t@n5t7@E*N^WYuFVbZIYrFxmE z#Nao%=;$_Q#vU(IP0a834zCYKtj_l`HN?PVL0;oKHV*PK(}=+_hI!I2YJ`p3T`w34 zQ07bF9n0MJhE+aezLpp~FW3)0mDN6XhBwa)V$OqiJWhyK9&@mlsUrrD7O)hnMyG!2 zWnj92^58ehv3-^m)IaWJ8i>J>kMqWp_dR*6mpPLd{Ej;w`+bzVF$03g7#Dr32LgA;Ed70V7tiX48eShtJwHsxgY2124$T@Gy|MxxUiLPy~k(EvTw#s;rq>gRO^)iqKac zRDdG*aU}m6|AVauzk^2a>P-o3IA0Q+^^_GMPRcwi;Ao_|JJHk zJ(2f4kuN2yzIz9({;N}ENPZK$YBb`hngChr-$W)GWGZFn{lI|vQ9W#fR z$Qq9HFp1`t4a3sk@{^dv)6M;wC(Q<%^4CctbCNhyDhnYwnM-DZS3pvuuL~i3q zk%>IWk&{dWp9P6aiHUr}k#;7sH%{WP^f3|mc|%$XO=Jv5a!drDDTPahiJZ%kOcPng zk!%xrkt10q@*PJCOk{67@P#GUM2_G{zKP^t)9q}p2!AIWV0voxhL|ACz80YyB2*skpfSo%oCa8iTuwK zdE66u*Av<4iFCyi16p)DALWS@dLmVx$hn@#Qcq+xM<&BaP}AOejtn=EcR7+`BHwXj ziixz@PnCF_i5$$4ktWigBhyVJ!jW1NnZS`zCNhg7vrXhOjzmr5I*wGC$lV-)?+J0e z)^eoTMBd{_gNb~@kwz2QtAnanR}<;Okt0k59;8i62NOAkBO@q6$87K&6@+FQW)3sQ znaG74sW6dSIdZCrJkF6xCh`hLPBW1YI8tdM+c{EZBL8rt+(bI#X*MjSCUOKvPBxJN z967^8Msnm#6UpUBy@{O4k<(2Ce(;u-VJ31pNAgT$4M$Efk=Hmf#6-T~NQ;U5$&oq} z*#}QKV3}qjhjFCFMDTe}xXdt-T#i(m$YhQjZz4?`nPnmua^!FmxrZZDO=LYs`kKh+ z92sgNdpI)DM27HiBxc;vx%I?kpoTSMvja(k%u@k&_v$k$N&@hkt25R zut!8@L}yeq%uyv&3`F3orp^d#1@I1=LByP<;HF5CLwIg&nPm7^g@~Z@bP>TqH;D)q`fL%wLSG;vmN(1$UyVggOG3$XyYOb8H6ns#e$qq+&9-;x%z-uPZ{qMF^u>gUOAn?iiTJOs9q}Fh$_uZ=(4YpZ zItwH8m-IyVwEL80=~gw6Rm6mxUN{3L!Y|5WHhB7G=gr%#DxFot2(P)M!UG*tU3XmS zTB|yhRm2Fdb4ZoMs#lIX_7s(T4ukXGHpJP>*v5FYsbsnj@v)6?^_PN=r z?qC%$!fT%J+V8Cs23ggUtRhBuolh!UjjhpcpKdQ$)!VEhMtIF9m9E#jMK^A;s_$7v zjPSa^sNh5BsMjYS1;15}A7M%Cr2b2c@VXG!im_o;Jy}JJ@Vbap`ZVv36(9Zvzg(>> zLdmQmMtCg{UQb{4QBSKng;m4|uZu~A;}AB9(A!tuzIR9Cbv~k3loG2ivZgd41CGpmRZURMgQn>%bPv#K@+!%A3)5nfk8RQ+8T*W)n~y>#ejOr&v`9tB4U^SCb0o4IGE(|JeWbPR6T-Rm2FdYlPQL33ZiLwU|}J z2(N2N#hZF)`T4~^9%Q`Mu!I zDq@7!Eu_-*dVELPcUHBNRm2FdTa5}n&>Yp%Clcr7QDb6*L+(gZPFI(1e5 zB}RCyfEBjCZaMeSYO6|R6*0o=9#Y}Z!4h7yWn*uvs$~^1!s}k))#1;xhFH~2tRhBu z-6y>IUD~tCs$O9gF~V!5@EY{+cduL3U#ucVc->DbXB!@7+OTgoSP2U;!fO>oZ5v+s z;^Wh;Du-3X2(Jf>3bW#I)S<>}DyxVQUaO4?TYlO5$>&TUbSm@Opw&N%#)0Z#Mq9$Esdn6*0nVEvfW8zvRc0S6bB%tRhBuJxMBDjb8KL zIBdC9bv^__un;4>)vi z*s2z>iWuSb45@IRg7rH4rMeAP^)Rc55nk&_rQ7iLNs|w;s*hPkjPQDvRNCuY_`yZ1 zYSRN&!a|JjdJdwt4bN}bKG3QLu!O?zSye9vx*qu^@8xawe2M*TGd=u z5hJ`_B$eL2aLi|zF@Gnkh!I{Jgcpu^t9qSP#0amKNR@=|@JjxAU`MO^omIpLuZ^VA z{k8a}ynC(c@Sd;|7Gi|g%Mew^hv@bEBO6PsDwkEn2(MR2rM;GJ>E7O|npj1Q@OqV0 zdd#m_-DiPS{f|||2(Q#wCx zU1e3TvWght^&zSBn1AV?^AEGCU92KTcx@40IOeVDs9vxV7Gi|gM-a8+u*=-<`dZak zRuLn-J|>kOhdAb~>O58vBfLHlUjLl=*k@L?l2ybAuTO;+j(My4kX6J8ug`=Rj(MwU zcQ~wsg&5(r6{2=*;F!0np{ycCczsSP92*Jn+ILOem~1oV&tMfX!s`oC={DT**4x)u z)n%+AMtFTmD%_B8%xC=g=Q^u;gjK`{udjsHfX_dC+p0ci6*0o=Yf|YsD&_bK2U^ws zNw5+YVuaT=h}t%+yZf#$t!h*fYC<7mgx5C^O-#`B`g8o=y{sylgc|i*fbx9#TZme( z9oMD&WK~xsp(Yd}MtE(9sNH{k-EYXxR`pa8YT#HKUefD3jF@@j)739uYE|2lU?nWX z2(RxUYPT=hhFy*zQHU7PhCh%>kB$9XR<5#MX{;hfc>PE!=iHlR#^DTB5hJ{I2rry_ zt?EWr5hJ{QB2^N;!>i-MvGc5I1FMJ;UO$sc*Q<1K@er%}ja9@5uU|-o+ZTGxz3TQ+ zR@J*VgkT{?cN)~ejB*-2&>xXNLUFAF~aLlh}v=ZP-XXpR+Yjk zVuaT&QtAF$en804UzMyPMtJ=tym0QdUQ1X-jPTkmygt2u+=*7To>jyMufL5KdNi4Q25|gc?_Y@8>)3CNdhx(q<28a+#0alF zq|$AeJo4O`RyCPb#0andgcn{j&o^FYv5FYsg*zZS=8r92{()89$0}lkR|2VU9OClS zOZ(LIH(npHiWuRwm++du&wUQn@2nz5cqNib&-2Y=%bKj$0Y|A45F@ldNhbtB4U^`-*zuI2>fWHnWNt;niMvT|BF)+^W826*0nVKcm8WE$OqU z-B{!GC##4NULA}o5mafrbFa3l1CGW_@LgVHgxCJ0!nqedgbp5ETRzx$^0cpdQKLCdY`K~@nXybktwB^$37Sw)QS>MXntIc?zUR`oTjh!I|0gx8Ss z7LGWtRhBu9V)yIfi|?N z*H}f2@WQ8IsAB-^8T@-?vGLl$Dq@6JFX6R(ey>hewRd041b2%eBfJjxc#Sq*hqH

i1U2Jc%9BFVuV+3;Wh2moj+OC999t{ypA*~tT)aZ zX~yenRuLn-`WO|?8ykK-dV*E0WEC;O>nNkrUg^f`1y&IwypA?1^!nwN<^rqwl2ybA zuVYAsb1yD;Uh%`%ZH*UwWe}po2(P}v>*Nl*;8$Mt+i+<2{H6*0nVkWr!6l~3OJhE;vYDq@7!aYm)RQjFK{tRhBu4K^zD`s~90{Y@Pbr-@#dr;36*0mqS$I7X{cDz0m9UB!;Wd<0IQL=+pU?QB z+N#cE6*0nVnDCnL_cy0o)italMtBVuUaNlUw$Q2`V-+#ND@AyHeZt_AtZECZh!I{R zNTtv9p6Imt8>{-4Rm2Fdk;3cC*H-LnRY}J}1HnR!@ERq&CSS2?lU1d&iWuQFT6jHp zdU%diRk4Z~;dMNzlAs*eUl}h>XtAnGSVfHRIzf01=+osAt6Iq_VuaU;Mg>-(rQgro zJkE^6H&{iC@ET)OSi-laAChWS+gL@6@Jc0>K2MprZ^t^T`iE7-2(Pg4nzeQFEUW4~ z080(um_tT*rIAXHjT6r=T3}TJSVfHRiU_aE?zk_(sxnwbjPOb~URV}9Umj`Na0;u4 z5ndU>>xTv3++X&@LH?-i&ex3uUz4^;_Z!Htg6RAY*+Q`gYvjHPk8;g z|Cx_j)$yz%MtJ3uN{@}++jDy|-1J!zyBgSE2B_eunPS~E7bvWghtRU*7D|MRoYtmtB4U^CzDDaALcy&`bD!%8+JZU zwIMOWYm)F9_0NhqRyCMa#0am+q{2%`@FDbW!Do$8z4kfKVVf)vWghtRcgGjggsY(4Zq8#kIdg=6*0o=4B_?aby+*C>Q`0~BfQE;rN?38 z`hB}v6T6aJBfM%zrN`m;`X?84HC}rUL4SA}9Wugen()H8*Q)4CeV`&ncuf~xIBy(b zyiQ>+VuV+%@Om*L^1W4^!zyBg*9=nWdH#Zm1J-pgUbnJ}7~xeXyx!{4_9m-(j#b16 zuX<7?L7lPX^OuF;%g=iI`ifP=2(Jd=b$WD3npN$S42fVNMtGe`Dt&A-?Xv1~tZD$O zh!I|m!fWW756-iy5>^o-yqZYW5z2w}T64vVyR532Rm2FdX5n>b+0N6f>UvfYBfMHj zrO)+F`KWZ8Rjp$cF~V!6@cQq=Yi3*3R#p)syk?1do%r9_-d5FSD7HI1sSp|AHCuQc zvezX^R@IkP#0alBq|)OMuWyVnW21mo#0ammgxBr^@-DQhCRPz6yv`<-Zo?->6g_BF zH?WEr;Wbxyjrsn`U#;p{RuLn-&LNc^hm(elX|k&AtRhBuoh!U<|FdqaRdpJsTAmo; zbsnkoINY4@L!MQQVihsMYo73$IcVm7R#nC-VuaWE!mI07hn;9um#~T$;Wb})?RxN( zc~!ebk&+JCs}FJgq(#iYXi!UeA_R~WCuSw)QSS}43Ox&GR_tt!GQVuaTv z#tS}#_LLny`BdXo$tq%m*QLS>uSZ$cMXVx5cwI&+y?t%I|Anip>Mm9hBfJ&~uT#U@ zPqV6*SVfHRx|~$lUpV(pz3IWIRc&V#F~V!H@S3|}<*8P+UkW6Gg&5&=1*!D*_1L{n ze`QqzSw)QSx>9)kcE#FUt14y{F~aLA;f2?utm;fw5hJ{o2roDrZEsaqvx*qubv3E5 zzu-e?c-fNtNoH(3!YX2f*EPZmzZYOtZ?K9O;dL#kbbnoR!G=<+`j%D12(P8WYv1?g zuCuDd5!hRBZ3`LUb)E3K@u1^JSyeAq5hJ{=7hczYeL+X78pSGNgx3wiE4lQZ0;?L& zDq@7!jlyfwUU%nMRXwYS5neZuN{_?l1K+vFsxD;}F~aL+;dR$%?M|?&yI4hx@cN(d z`uc=p+gjCnRuLn-ZV_I0-hE+LtNMsl#0aljg;&vu(U+|14^|N)ylxX-Ll1tZ#i}}u zRAYk};dMKy^gRFHgbPNVX2$#gRuLn-mI<#zr)-BG0@g>c5mpf+yzU?sZeO_IeGZjI zbuz1n5ngu+ua~}jILWFSSVfHRx{FkLUx~-_WyWhEtB4U^cMGp~!u@`;sykRkjPP16 z>NVl9x1K9EUQe-#7~!=-c%As;o;$7T6IKx;yzU_tp2Nb2(9_fQnOkbS{$Uj{!s}k) z^+x&$Gp(xADC~_;h#28@pYg(dO3!8O_p+*^SVfHRS}DB7Typ$Wt2&-l#0anZNu{^t zBk!61hE<)!Dq@7!D&h6O&BfPS)l^myBfK6k^}>3uxjXN~lT91Kg*sY@5nii>SF~57 zLvDt*lM=Eepa5t-n5ndaG*9FP1&$gci!zyBg*K5LS)?e42YE_T2iWuSb zI;oO)9B%mW{X>QrulHF+jPTkdyk6X1xx%V;vx*qu^#-Z*u?^m{)MC62JyEqhF~aLj z;k7brV=t>3#wucj*IU91uSeAxuY6V!BfK^XuZvH+IKiqaSw)QSdRus%{MVXWrx~xg ztRhBuy(7K$t>0i(H?WEr;q@-5^tSw6L9b3$^$4qo5nk^Juf&g6y=YZ$vx*qu^}g_m zCLWtV^B| z3r;`h6stNYRrNA4!s`p+wa-yWldNhGtB4U^Uz&QshfwzGo6ehI+Axn*#0amigx3id zG_+XNbXE}~yuKzC-^w4lY3RKdRU0q-?Fn3n5nkJb*PtGkJ!VyRu!#gczRuLn-wi^|C;otRU8Lxj?MU3$J&Zw}Lr+waTkyUjK zVPE!J?0x1w>)W8 z7qf~O;k83}efQJ!Pps+@RuLn-ej=5gqf+W?zq6_@Sw)QS`dN5=IOg3|R@EsjL<=#( z>lae#Hq38VF=VP~!&FugBfNGBuT!5Ny|-1J&MIPr*RRG4K7?|=KBb|r@tVsjVuaUk zr0M_)92+;C*SOxQ?qU@&!s~ZZ9ZI!^XH|VY?8c$S>vdKUBfS0)Uj6s`WSUj&WEC;O z>rYbQ*ubUD*+(=@G+tdJDoTv-+9kY3tq4DDRhg_JMtJ>Yys$Mc9k8s}s+w3ujPTkm zy#Aj2`9!O_gH^-`ufIu!V*|bZE8c&pRlUtBVuaT}!t0X>kpinqOjoTzjPUxGRC>&J zd+5=htZFE$h!I|UgxAAGp!_um6PCyOC~tTh-O9B1U-Ok8#-Vf6cw~jyMuLM%*v2oA|FMZU;jE!GeMU3#;OL%P?d&lQi)gwc-Au+-$QF#6PblP1Lj8~Xd z#0al8!mDk<3oEQ@DyxVQUTuw6A{1v`!q)9pbvdhu5nkxp@99B)-8v5FYswI8YU`PYx{%{}-)8c%8fLh=Z&uAxoJOBfL5auj^N~ zf5WPdVihsMs}rg8*a$B=ZN63IvWghtb&&9Sa`39FtZD|Uh!I`~3$HiR-+sWVu3{B2 z!mG3J`u>jpjkKyqSVfHR>Ov~#IqZ1TUmvoH7~$1bconB*UujjlSw)QS>SpSNeS^n` z1C3XYY}H@H2(RwK>(liYDP zDq@5e{!Wp7e(yQIPJGs?R&#Y=QtB4U^hmlH;!&^q~>}OTGSVfHR z>Lt7mFL-K?RrShIEl*5nP0=918+ z$ne`kxC5i*bk2j!ULmLI2vQx!+^?DS=ULTKRv{x*y-B5y$A}DrDgQuzU;=eLMx{GLB!LKZf#j;W8H2g9-TT*>&stRttB{eZL8Q`S zton%wQ>^NCRv{x*_={(W34G&7=%Y=|XIs@)Rv{x*gGr@(c}~M=Hx8-`6$st5bHmi`4s$^0f%-pta_x@{D3s{AWR1GCnUsk=^?X$bAYBj5nk*Z;& z(*5=0PJ=~BUQsmrQ5Ld%)cD1(T@i;GE$X7Dt$zK*N)VQ)~k$F$Vk-)Qtij} zTKabRn^tuNtB{eZk)+c7wYA{O=dEfLtB{eZQKah4USG`o$D#U^Rme!yXj18U_1pO` zuCiX;ic~UWr0RH~y5yKD#|&A*DrBVU1X969MN7M5UVs@GLbP1MDrBVUL{jN-*izJU zu~j|GDrBT;j8J`C-u%5)?O_!%Qk6<7y;b&Hk#~|+r4*}@A|q8{QXR=PdF<&8?X0SX zRmezH8mT(5>b)l?+-X(IS%r*LMM$+Ts}7s^$2V5>8mo|zs&rE6{oue|t2$WKx2!@& zsxn9gT}#V*HIuKls-zMXMMkPJN!6ZJ8+wl2ZdGTn3K^-&BGulkdi$=|U$Cn4ScQyK zWs^#8m0wMM;AyM6fmO&zRSv0i8%BneeQs4Ru?iWf$|Y4-F5&exUuRg=m#jiYs`5ys z_wPqneznc24u;W%3o=rbPb$6FJ0_*M$*Ll(LPn|zNOgcp8hU*zo-09!ma|xej8qkp z>KNw!PX5v{WB-p;$VgQYskGOHdw=t-^?HX@$VgQ&sq{R5;q(g}GxndXLPn}eNTo+q z@pEk-w_bzBs)8dURVR^3_g8N3Ik#9il2YLaUm|DrBT;vhaGga`FPJ zTFNS9r0Nt>;nf9P?)mo$$858aRme!ysie}aF|K3YLDuUtRv{x*Q%I%fsA#z72Uhhj ztB{eZ(}b$xk7`H&AzHe^u?H^5NY&}2+DEMp{qNubj`{F7Rv{x*rKCz=mHH2aXvt+2 zGE#L0soF9(G9eX?khN+GtB{eZGE(V%%0Zjgz=4=n&0!TXQdLf>{n=~c#@iip?`l>d zBUKfo(q6rHl`OShZ?Os)sj4JZC-z#l@;b*}uk8dCMnexE$6D1!Rv{x*HKfw> z;dxmvIodFBqACJ1QZR6`x*ay#})i8L661Dt#Q4usq>>tEyrZGE!AbD!o;< zIcE28tGbz0$Vk-;QXRo19R1c|Syr`{RmezHo$%^@_w-Y(>Q7c7BUSaJ(lbEfP0u*? z4qZ-GML7=(L>Et0#0gglKu4RmezHGpY3UHGk*5O;+_2tB{eZ7E)=icivxLX;nQY zDNkgiY9^@$aGCaAyZ3)q1-FXRf{awnBGuunnpWA)QLjc;AtP0@Nu}rBzYbkrYrR&n z3K^-ILn?hH6*_egbU1`)*~ltnr0OhE^HP8QguG5pfa>{{%Npd4?BWY z$VkcXnfb48B5c^{ZjaY06^ z77DMWsh?eEy^2|dj8t7Byl%Yr^TAei9;=X%s!K_wd-?O`>z7;AYE~g5RhN-Up9NfX z|Lmi!YAdUdk*Yr|GAhrfB2Q^mZF5UgR8J_FxuSY{ zQ_3*330+B<=jqLoV)*tmeWMLcj5apa)Yow!t1%ias3~tOYn)?| zlE(Uqw93lHDEvi3r5YQZnqFJq6wQxn3?ju1(K-lZ&Q7z`NiEUFITOojTcS2xUQ<`e zM0In0U9ID@&R^GDU#;W#S;rfr6*H?E>u0c}DOy+ATyOr-+*DsNy}qHD1JEki7}yLP z8J7cXFs>n5QBzi%RbN{fZ7eBku1*U@XSOug)RtCYl`seVA~A>5zp#O$)NC?LvC`)H zQuxv0n!2e*RM!CiY_8J(p4sFIG?X?^st;SA(U%@l*~zrFGF+&VOQN z=f5jzqh*aW+Dg$7#s+0YIW&uC6q^#dqAA)qGunt6k*&U^uDKMuO0CBN8kw?ktSl|7 zt1NA5X@UVKvOpt~eGz_e??43g4d!3_k8-ds&1lWk~gbrQy&G~Ae2E|_e~rs@&J zDfMb}X^b}1&hb~{>aw^%Sy^1Bp}8?$nhG3`twGT34fSTkyDC!ISdSA1ZZxhnFik*K z8d@+((bmeKoIp_Oh?J^P$tX<;n8~rxK;!69;+Q-Tnp#_5URLYut)}XhW*B*TNXRVg zQ4wPj2(tY{+t^LtkzH){dJ}YP&5n@X8g)o+!>*`v^Ti=1Hd4iUw@;tV%d=(0*r;4v zgK4o=w(2O%sFl(3mZ_yJb!AOWHB+(iF)05*6R~1z8Nl9zU1ZH!aDbvD*r~8nt8c7n z#w|tRRWQ*)98@KM6k)#V0Vt#s=7D;PqYpW_HwjE;7-(tabQ!RtO0j1 zj`*~eCOE``ojV+2)zeSxS=`A)AgJDHj$m>}yL%F8OIo0X7mMp?5w zC@?E&PSB`0v9aWEA(e>f~GuZ3QdTrC`n zl$O=PfBaV9zTYoSDxX9xb!v@cJ8Y<_m<}Y)F?#B)se_41?=*C7uW;EnbVqNCI zWK>&=?Zr80cQV5quxPaj^H!weRWLxCU?_%MaeIuzWK$`88=#?dRvByn&{!~OwnRg& zeHT?lXT}Wrb5lz>7RfdJ(t(pt3=U$NX2C&%=4mJAgel-#dzy?rlMEi@;}&d=o9w*g zSw%gHM^UP)Ts_lVGb38x((G<@+^L(&LX*Na3CH4U*A6>%XQwqZ*2Bc0`^?dsRb_By zBG8rwXHL~kv_~#&Y^k$3RLD#yCbx=LLtSdsu;C*j6<0?`-1??LWs}#oG*vsxJ_{zf zs2&2Ymcd`BFD-AWsny4w?v7PkG4u`Wsp0s~QFCaL@~Ewk>L?(;;SOludUY=ktg{oX;k~yScHs z9_BkRse#E*SDQv4f-}ly>kYaIb^}$lHB+mbp+oVo*|7tJ*{V(-4dcGV|7?{T+tDa$ z_pQ`43EFi{>WC1s)kT|U)i+LuzAl3Y`|*5iK{ZMnqf<+#!|AFg3yon|TLV?qM}bs5 zb(W^irya$ob@m`zZCbQFIj4S}6SzjsHD==~_gOi$zFD;$p0Z|-%b{W2m|h))nXeQM z?BGle_Q0jETZQ?$qP~85O*GV}r4DxueH>dp4w60%I9NT=it4hOx;}$FaYcLMiXR?> z_r?`JA_nh`D}H1Q-W&H;mgY=vZB^Kd`<}RZ<^GsAonxHgCg)A$2D~Y}$GzSxK8#Ny zIw!Y=P2xn^Cu!@v>Y8EBu4(;HoE`oz3ZLN>$U_XgI0|n=!8V3x3*HvdE4&ihs`^TT zSM9^Jn#ddw#vM75^d{v=LtUrv7EG>gRi5JCD*7r2td1?$XH2mRV2HR$)CpGHOpJ+i zuFEMRhkKn6n!OsI%?YJvrB|w&*|FP;*_MLwCbGL1pA62GUTG^Adc4(X4OUyG*derr z`|Lkj!&UZVF}K9NM8zc!jC-4fk9cUN@M%-II;PxzJ7qDgj48EO$-Ldb2^@$>1BvxD z9oLmGk*XC;r1M@l6KQ-_3%Tov7hUOCTefO!O7;9u?)li98c^{$xd(}tPwzKkb1Gj- z!1BfCR6c#+6WdqSH$JEG=>wy9`Qmdb->87~jnBm!Ec#NZ7<4|>Fq|r2D+9rhafgf{ zRnArhgCSMUAf(FK%7Ad?3__}$tqclR&LE`9*~-9hpapizj=GF#`16G*>!YXrX!^V?2AgnUCHh4Ul1HvkE zYeUGBIUpQw$l1T*#2axAQWaMpyZFp>4p#MDFjnPlWgvU<24huTeG(U>yunzNx0TJq zQ{G^#%G=6#_v8)6#v2UIzt_bZ4uXx_ae|IJ1qnKCBMUn2BqZp#4K3)n(~zK5?pCH2 zL95(BX_dQ`$;BskP+H|~WqR?+9h7cu0K%yz{Vlk)foGW364Bp{Tg#$=)>7aFUB2FF z{=nQ?MqgeSIIfq<(+aUdwY{D!#VR#Gd{@OXf=lyw7e-7!vtA^is{&Xd$F(0gC2Evu zVpAd+{S{rboQep@{3Tt0HY#9QDp@G^IwADA-l*DCU1j!JE#xrtJQvt>On{C;@So~M zwR~0!Ipow=riRJd$u+S=uB%-Rk^4fIUS+OeIh(_?($|lrK3BF}dcTWW_K$h8p3b%WRYYYO8b3>`h{`f7ewJ1dm1TJREUh9cOG^AKtsRpQC z6|WEZ-Mlw03ZuuMTc&1z?^+h~)S%a!+b+0DF;}ay4(<~ZP?c;2P#K2A%g_p-+c!=b zl4D!w7LSu*XzUFB&FJ`Rt}8XI@#{F>`&h)l;y&^Rbz6w;_DALL3y@WhyjD?_H4w_x zr;%!JFm+DFzN=WKhpMBEMaYHmEk4|mn$%H-U8l^>zfb$FQmu`HTim(o)Wuk-lsKqk zDr2mST~u>llG$iIxh*2o&|fE<#pZH3;ywcZ9g0)xCOC=Xh6i;3ze4W*pw>N5dI@dY)&s3B&tXKIou3n{7qE+=Or4r4lSNXJ~UZqsx zd_=EOD&JM!W`{d%y-kim?{=eZ!}V@095({^;*7ja*GRl;gvfg%uTc7|7IMDdS7>xh zca69+n8~4iWK?&EjOxCSQ7!-ubiT)!lR6`!lL{o{?Rf||oXI-`3q$p1LJol*pgpByh-pe}phM&$H4K*0}n{qrJCY^PadA$b0Xl z$hA%nAwG9^tyP;MZoYJh)U{R*9sjjTYp!YdYR&Zu*IK2GwO09>D;2)lSZn%y^Gyn=vth>d_DNrlz^vwr z7A$N9(2nkJWN1rITzJxn5<2>SV?)@-V|8b#!p5WZ2oFZ<5g&}!TRx{*U>C^D6)F|6~5(Ja;btA<8iX^!JwNTTR@l@u*lMMdwoAfr>Rk zT$HMLvbW|gPW4!PF6Kz^&F3=$T%6dxXp-`Lqf2aFF%WMW8mj7hVf2+tZx#=s>ZY&z zkdueeTaIHc^Dw%NT4VGU(i)@k=<71Am8W$^#ZMj10|X4PsyyIS0j)HW8_vzhPs_{6$qK8h0-h@r#s(U&Agws9BtI`B ztSS%nO|NgMt*lEO*$nN5U$cj=@}>@NYACC~n$;u0}4X@%x!OVk#J#AW>G;Tw;-Gb8zwyJCw2IYnkIN$K}B`y@Ol^u@LZ;7 z&CDoRXA~J-dR90;qa-^sEi+dSBpwU8e3kGa4~G+cCmfT&LkqA+pbt!vjGS;$c41mt zR(fHeBzR)YNt$eu>~K+9dZakBz$6JYq|>3ra?^_QA|(-R9!M9-3uoqMXJzKXu)!)< zrVjJ{PfcCwD4gn2hm|!pl-c5Dh4YHiGc&VcOZq=;fmz|={QT_9{Int%-}Jy29>;2w zL-)Y9`i)I`b~rtfS6onBoDr9lWs^G0kmFcQAGw7kr|BQdX?r$3 zBV3YJ7>Q)(l*Exx4Rh%RKWi8X=cQ+66=Xrj4<3>{blC8e5hF*Hl~=%tqk%@26sM&X z6lE5MYZ_8q^FX99oRb0DS6W5^3`4v;gnLeSN`ac-%4VewhmEIk4!5+)87aU$cwu2? zUcN(DR}Z`vQ$1Co)y(AFQH(0dO3%qH%q$5HNgk0pY%u+Qh)JIUQ(JLvR#tkLZp=#^ zYSu(D!BqJjOih*08d#m?ugD}w+ z99EUSVfDD|J-U^yn-{L2=iVo0VUX4LbyrKBjKCDROZ*yC5$wJG&$+ z43|+-M{&WMoT+odx#`8l8PN4MHNZ79THqLpii4w#m5$7X+4&i{5hxI4){oL~W`;VZ z<)!846=Jt?o0!Z-fV)o^(jc6S=vZ;xG*ojB)c%n(PND; zN7qDQtJUpn`z!*7P{l>Xd0Ck`VfENHct}+0D10!XqogCVz%i`|c0)94je#u^xW)>^sM5{w6L8`&DxZL{M_8^wBpP#JTng- z~Qw>Yl|p7@mky^ROTFpc8@YCSxCD|L7bO(dL=pPQ4PUYr)rjy4ymXTU(I z;2AI`F;3ul+4))dFj+Yh!=}!APdt{b$8xvS!NUoSu!yGa+_bz%xT+3ngNM^_q{`}yqbSRFwJ@K99485CMzsS~ zBf&^SEqsL^>xjS^|dga zq$ZDpo5*S^tVLcpFDE0Cm7OCFCsd!*LHohebW#VaLfQ$UAe;B^K9lSdda!l3rL)kPCaI zX1pY3WUx2P%rDGN%ZBMF3!X5DgUg(rLTkZ6I5+eV_pr^&Nr$YkgMt<5))W6_(x*q@ ztg0X*Ju^EioKeH4czEYY>o!JT5{?vPq?Cm&e_`6Y#gX;cu2iNchG zGYg9g(+djWaKf~vXbm`x%FQS$OwWJ`VR24jF-+<>-1QV>2t4E}$cVs}T1b0~)Zvx&xa+3* zGddeC=vp*8oR?9Y4fQAp^Km0lcnvc;1DY;s%RV9}6Hd5_iwfY>t_mMiZL`3P2PeeE za9*XZgy2CXOrCH-16l+xq13ZZeysNHQv(&2Evs4yQ6 zvi(jYt#2-z!)F&|WWcc(JmC&5p0t#!Cn3T|c(^E5+?h5j47&5}43{+0)993%Pj5~8*z+KDDF7dq zDz%vzMVaY%5zU+%w#+|385AI zkoG}vx?Ir=kC)`-H2CkwHTqxt-}W6tgXnRYea7iEE8xQ@_{9h35)O5Y48j{Q9Kmox zDD*jSN7SldU-(ZrRI=XryP>!Se-Yxr8TiRA;f~?3o5KgduMNQAZ#Zr8aDzShuo>R+ za9&?5--iJ>{8ff80&w)ZG<5(w7Qg!9uUG6Bfa?g{Apy8f!1W8j9R%Fy09-rZ3Ot;* zo!bL9*28(*d4J%h1mG}VO#lvmGo&d1*8#W%0XQt*k^mgG^Q{3mtjFqr+}Z#f*7t<~ z9R6a?`vEu{&)WiUSl>4F@a9@}zf$QbryyFVT{gEEdJFalv7#e^(1i0(~ zTvy=E2*7m%Ze{>33AoDxaM-{12jH-L>jQAue(wd~aQoO6fWvm)8Gys_(yjsC9E;z0 z=?Uw*1>okvekK{XHD{`XxLv`1#xvg^0P(JkiqY?WzPMlL6M(~Z84!TOd1GWiF4K=| zj?QlGGsA3&SiZ5qox&_sKa|w5`!|$ss2j;sL!a~^Y zeq0F{?V1@1<;+$bwzD5M7Pytb?3trD+@Ae7+&%`M1=}3FaEVoq$6?(`!0dZAVWC+0 zo`%)O1M?SiIN$jBZiM)_xuHBmha85t^t@1^9iHlD8GC+!0IYs{)@w5driI| z6e@=oE>K+G@?rbeGJ_m0e!k-&ekO1)G7H1Zm%~G*4}r@h9Bx;B9FFsxYZas4{Wu&4LL0rFvc)dk>iztt3gL*GjRaM)f~0k?|TSoP=&D;@`C>rxQF5^G%H{&&T7 zq0p1?!X;KdtjCMMd=!Vn@$oe?m=71f{@5GhzXjlq2JY_w+@Zi70l)I)T>N~;0dOL4 zS27!G++%+{7a$+D%PRr7tpPY}mp=kDur42%PvdaypnN-l z+4Vn47sBHizj5#wa1FPFLdV>uxLETVPE$_-Q*^uHVwG<^tS$%UQRX1MuWt*iSP#tb zJ5;_{<1Y-Wr!u2R|9o)iBeWd2#Jdy~YrcOHI%+B~z3)-n5%3?sb~yqnSbHxVyRTFn z&JTXvTJX)kAI8Z8ii_oYQ5!g~1!l)XiaRz&zQvI5=0`%I{*NgRk1zdvABXr#U@Gwg zEV!NeaX9WD2IinAkb-kLc=>VjAU+zHwQ;!Xpk2NIX3jbgz|sd^e);O4oj-pn6e@m} zun^8)e%w5$@2k&28@`~pSo=%V{|C%bFDedXzWMHi_;J9z&0O0U+)I$4?S@e3wU<=B zSiWtbzVkMQLKnWGxLDiA1X$hU)ljG&UbukFw|uytz5tlT%*ColPe^b*Fb};EL%t5t$>v1K-`+N*zA6~e?aP;L)hWKV+ z`h9{_?Do4F)(r(_19P~4@@qfXbVD6J4TYYC7cQ~pT`cz~_!VF0;+GHG;lzMkBmmbB z`Xd{-hONpu*1Uo7^~@;JzrI+$jR82!_j&*h^Sv8@!}i+}fWv&B2IRgBz~TJxe4BT`9Qc#sI>LYa@?m>5Vp7NA$KiN6D*)FXd@lj+ z>R(jCSoJ{PADPkCe!jh6m86A9+1lkz~TAAsR6jPz|{lS z?^jia{op@-^;iJ$>wr1zH^s$j=Q*%?7BD|E7i<59`{|V5L!sN?g-a|B=e2Fj5D0I6 z%1ClxxzxsX;<9;9De*IH{-QhoeTyKbfxeJa_ z|56;td^v3Y1A*xphij7vdSLqeqw*aVBOhR)ES$6)i(mQhI&dy~KE^rVCEguyl#RJq+=0fVpWu#l^}8mr6oU05h(G z;$pQ+18^4s^E-2~_WLIRx9|Q5p;O?6ODt{~tg8d2;{h(;+46=4+&@N`!F;%cJHp>3 z>04{+-}sJP5pbt4i}fYWl@Iq@vjgUv2i&4K`Ox>?fcYK;?zsT@wg$}i18}?IY8RjKB{4&VYo&aBfg2VlAGY7vfceUSs|%2CQNVmR1Ggeh zJ{&I_0_NKS+_nJu+H{8T2QOS&9e=iR_d>epy&&~Pd`wf|{t=AXJ*Nd5W^-TtDOn`h-fN5}ZKIK~s%#Ci&r@oH^v(e4@ z~0WVx)^#``!NM;Cxw^;p=0bEI(d^n!# zfSK>+e74`)fLZD0T-z_!_Z48axH+GEyMSraqxJe?`FaDB;^utvjR)ooH|HuJ<~tXd zC2r0q-)dmixjCPFTY%Z&=6v#X=n4CMc;V7o|E4fQAiTxu-w1F;aq?k*)CSBq7r2FS z@?rbk9WdWo;5Nj`hvWIHfcbs~?w>gMu)aMGRc#C(X^GW-{eeqiHdcRNea8b+?dE*? zcL6X<+?;E?VEI-9v);}5gHVeuzU{#^O~FU$@d*Ff4DhUKHOh+#y^@lmRQ@zp}_TJwzct+6)@je;7$*aZ*IVR z3xT^PK)y8r^F0mRD*^I-8!+E*$R)YPm8(B+d+WuF?vhyj(I2>!IQeM40;bx{`HYtZ zz$|fduJYmdTMf)cH|LXY8!$WFoGTx0A03ZK2qnP_7c;JW@{Iu|&&~Pds|IGaoAb%H z6qsdh&Xo`QV?8reKzNJQAFl!TL7aTpAAbPTzIXik_625`n{$;9`(rFH)7+d-eHQ|A zjhl1j!~R$U%yVweC*M|JesFU>`Pv@|$FcCjrM3PY2~38YbLBe}a+EVe3E?ePf1C^4 zrE&7%{I?=tzSY33i<1xgcT2#0JAm6AAYb=Bu%Ct(F0Hj+9xxN#oU8q?f1821(9QYu z?=oOkxj9!ptnX{UY;|)!`St+Q{wP;HT=}qkeSsP2=6v!^1g6~0`Q)3&45X$d)_A!R zxSQkT!|}2SHM5BpQIZ-$G!nadWPG zG@kw-uNl+?-Fo_IT5%V~I7MdjNMdvu56K<-`3)1~60HoKN}A0%n1m^T~H7 zFzei$Prfa{Y;$w2eAs?%;AYFtc*7+urXD`|l7SiH=3M!(zEhZ?gzy%t{hEQB7bhRi z2e$;wcQ6&AG~l{o8#2)E8d3v|3+a#=1FIJ}h4YGn5eCV%7IT z;I53550A%J1}nC~~_2D;kCr@pfi3b^}@WRE^!zbThW(b70Sp5+Ot{_f6oKL3# zGvCemlBz-(}Hu6zR^-&eqNJkeDTpL~OW8SUm=`LKMGfT?zKKKT{^v&7B$E@$y~3d^>^L6DMCE$amxZr!N^5p?Dk-1po1?Q_~W-uQvvGUCW zZc&_kxV_yQFyGU_y%HxM_V2d=^X&qzO{!~Lx%wC9m)^jPX0EmN%K)Y%K)yO=AT=$q z+HV1HOXB3i{#YF_-#Xwn#>t2E-3H7aH|Mi`92$oG2fT2JHD0hkvVfWB=6v!s12fOf zHOlYj;r9h^VFrD1q4x9P?g+r)_fS^^ErtJu!}1mqIZ)EEE>Eq?uhzU=~V*dOf!a5ztP@^Iev!~QtL!+GnA`40DR z{`rpaaNc})-DjYO^X9|vG3N&0us=@ma9&@0UO}mc^ZMfR4;lk-*na1GIIk~0ci>_V z=k-NyNdOLg|L5VnzSu5z1mJLcTjAln<-_({8-T;-fxI4o!|}Yu!+Gn0`9Ak>-tysd z8+HWXa6bOi!+Cvi9PIXRUf(3(_Kmo=b1#R-8~p-sI1UN}aM&)B0&rNesE6z5c|I_H zKfKDrdE2EYaMd2pTVEW17kD^tJ{->r190fO*u!~!vHk7|z+rtK_Hh2?do%!t^W-`Y z=Pe&@M=u26@Ob0>0NgRa{S<)1?YwJx{Beq0-vC^1;6?}Fu-~Qx;PCl0vjT84$ekU4!{>&acxQE%K8Lg51dH-YqRPm4o2t>3atXgCxChyo)U^$S6uH%pBJ{2?y0L@VWtBr-l-6 zE(~Rio-(zjc}jV08T?l8j4934jWt!xQ@}Ag6Mi>sVDg|LgN7szY-%nmuZ>PAZ>g!R zoI-0#A=F$`F{rYpamv_eZ4`d~YD#r;bHkwe@@b*bp%XfV%0rcW);HBxH7E5Q+b^lO0e&pD<}CP~yQK8`84d6Qn~hke|9|=a-U7J8fj^tUJMKc^ z!aBU;&Kdsn3hy|a6GBPwj{kzod+?4^SVCwpyyMOp{!|a|N6@D*yyFR9LMR8`k%bGO z@O~_Pngs8I=+hbSK7>A1!#fUk_`?ajkDyPp;e9lHng{P==+i=YPoqy)!g~gNx*p!M z>C4>pSHp~j7rdc z3-3|-^fSCy)2ChVKAk=R5UQh3`@p9&=~GAe)Iy)S!>8HwDG5HEO`q`Y@N?-C-e+|_ zeZs$NUPzztr$}q+TB4zG@N0Dy)i~Ts8ta?uE9z^TLdE%^bokXc_>I9(T17>)0Y4Pg z*9}Z-X|Aqstii2pW;7|cPW_T%O?@4#{eR583w%`7)joWZ3=nRfsGw0%1`QgEN@}PL z1~o$xI3p8?5EQFIB7}=_iDZUL@sc=+Fg;DhYHQoqwzRfy?c1BJEg-ZQ3=q(&XuaE3 zY_*c6T5K(XR`Y+Jwaz|s5(aGFe*f?L&JQxr*=Mh{Z)>l;_S*aGgWiH~8ZM1n_}X`U z+`q#oV)@Ns|Gp}*IKBv9Kn#~JT($@wE48YYt*D>~->E?wQ5aD;M5lyhv0CkNe35Qt= zV73S!VMNi>JiU~|HTXXA`S@(Sg&LW^coFh7dD+r>D^|aBL4094dNsd%h|d8ElSy?@ zH1jOOq7v-mtHU+RmW5+=%NNv}2j|b69u0)fT-umuKqa7k!d0k*x^T_v20t+$VkRFq`Hv zNyojmpv-aO1&)*4Q8cGZ9=AWi`!8| z*{r*T<44<+Y%jBi9OnLHzn*t{;hkMu5i!;lD=1=Bg}`J>4^CE%Y(~D3@>4z1Fs<#Y zM=C;)`=SuLk9#4Vojtf5x3g;*conx-*qa`+uWENvKQGt|CiYc(oK!_YiPzMCi`%Nh z_^EJ^Yy*;YKxX~jzOAAlhP$#XumX08O)&L%8l%QZ+a8a{H#P5rt7x|a7`)qW{SZ>kttv$PV2$MK&Nd|PuKTIG&O{3lahEUf1&nPo!$CYe29_%*7j8=Rk)M#aPPQRhP4{mJ|ADlrhjxguGX&OeqKbvDgL!) zvw6n`lw!_x*L2Wy`))1;EDH2B5i6QE3nZ)#NJWymJel?-{8ycXz8o(IvtKo#EWv(N zQPAMDMRG(*z2uZWYOnnpVl<7v#%`tRY5Hu>bxzx7d+gR%c(*!hh0}ILmfgAzclO39 z*-o-Uds=I|-Le^hPU)+SBkhej6E294vNx(6^4WcS*3*H<%U^3My})jD{eZ?#J8hrB zoi*PcSwXfrO%sZ}Z+-r@_**{`Ye;zW(d=lRVjpVd9t8S{51`8KlhQQ0jeF?Sbx zSJ8elWKd(2{U^MuVqB4^zoLifw2{ZfdyF4eIE)ha}-p#_}vwVoQ7Ct&DNEdvPD;?`3w& zPkYh4(U)eRlUiI*L=h`#*%QCTYt3I}cB#w!KGzS z;>(W9tcZ5&RSWHirR~C@M%(3eAZ-`+Yi++1eT3RClvJJfUOcV+y%&3SV?ZwK;E>c$ znlLcVr)mlc9rqo_O|cIYKNESFI*0=cemFWQBWO|-cyM}j?|7K@3|qU*i$Mb+Uhbq; z|iA3Zx)qkYEr&O=e4+RH{jmb9AHlAHWo$4`C#{XDZwyKWrV4#^Vt2;4$ju&yIU|OBj(* zDQ%a(<~0z@%n@76ieMjTEAQ!EWXb{aE6+3Syb&)|o=?g#F#7U5R$eU~$x7;=dxX=; zJ_0pA8MdgHbNJ1N45a2jc#cv-Z%BEmhu@HTq2;z;Py|SawW&aVlz4M|#CiUoBy6>h znt+rGrD?Bl`8<$v>1`y3W#~D)g&m>o@~%K_#ZU3gVy%_L>Ba~RHZ~0zX=m;Ae%WVv zWyi0UeU_G8;-0}AO0F*e(lT8Jq$QCYiu#QvSJk2&p;8YgF2hZpm4IkHrnyX&*Rrk7 zN!PdIrHNln(+Q+0P;)MMIMYu#bN~7&Q$fNHBcIlm7x5=hIT=N%>r6x~eyg)g3`-}q zup0kowav_Ht5R)>?1hnKyXE&}ohrm5$1M-zv6CvxHKi()C|flOo)-olCYu-xfgIw= za2L<4_b8KJ(TDLrdQ&4zH6CD4D!G9_?w!0d$rO=|ujbU0?Y`39wDv)X`&4pDepb?@ z*`GZ>RbJwx)JM3l8>u{Q;H-!mGPj6LmE|{oT zlmNwYsTwI3+7V!!cp_Zy$6M#4?*c6qwXhjzn$SM#hdl@Mq&)pAkP2K6&@~c|qoBbSH|~o7!XUV=!dwO?#v6 zo`{UuUhZUa5sz$X0-@vXPR|K0RcI#480}Qyd9yGx!kF1upiw<-fWg7jl<1`Ur2No< z@^BOq`=Qhx+nLsN$SMa?%bG*NCDJZ6KxKli0aE*%B~-hc!-U%1cK{iq03HBQ9sfe9 zXCGPW(toei9N5{e8H$_`o7R8$|8$X)=_0$)JkAy5D;{4^nRFw0us|Y^x~I|0kc4BV(69-e$dWB5OZP0M02YUqkj~ZP4@sNwT>OxaWBV6l?^NB;Kck8oez%*LB|<* zxIvPj?Goq!Qss_|A>**q`bxZNe!#kLPlOW7bznR9cTy8`yF*S2BcnS7|8vBU@<-Mw zM%F#SaYuq#Vq2h&E0L@Y5*!Q_(TN@yIA{%fhEn9p2r~wU4}3uHY^jByi8hbAT~YT? zuz#MK!7?ar@8Xow=`72maZ_2`V{hVo&3$5iDk(~`Gf7<|mQQE0-Gi~zR{D4F^DKTe zkyP>lU@BZp_{C`eA5m*hVmxe9r|l{@G0X(}5F?#=4DE?reS_?k4SRX`h(78ix(4=6 zlI(CL)NbVJ}bh<`puEB-vB9>7lD*^ACNk;-Uiwz6z>E5LQn|V`?;Wj zK+S^6fo>I419Xd^Yk_VPMDNn0g5p5`B?wYgGQT1fD+pJ)yZs49az{zW@koi^Wer(n zGp?lcmC6;V(zEKMnA>4*g3k16Jh`K6&g^T@iKpZ_ z$-_N%%SP~ZFqK{?elq%g8tC2%M>Y@0gA9sY3tx`i(uRo1n+qB&yY+U`z+34FOL0$U z@^u6ucaR@xJ{3|U{1hh5l{zxVUz|95{MNmQo;ZU}%p&8`T*bRp#-&-*ofC5(WkO19 z^uAvPuRDA9qrfjIHB|G#rWBwE9$HH$2 zIP4U}ejyX3G7Ni?D>q3Af$_DDx8sxSoc8D04IKAwb`n-@QE`v>44u@?(CTn+wk!Zk zdnDpuPBjrqY!8)KL{z18D5^~m#vAV1R6owg}q zkh6zZ7K>Z7+BXre#oQUw%2`!y5h=V%fGZW$+J0-bTT@V7;kKh_HPC?Glrg6rvR89S z*+kpAb#TA-UmfV-eb1vg&!EKB&F|+O$1mAz;g8$NAU=*J_h%(`(v^zTr)WAok`A>5 zRE3{ykXhf5hNQWswX0flJ0K&%|>G+3g(Y@H{d358XRv>)1HW9#4Hwzr|SZc z+nc00d^N!761rmicZ~12dns^`yu=fMzDUK-?pFMaJax3gB`-!#OG=Nk62sZa%FYL^ z?}9Gt+ta4x%ZTo!V7D&7V019a?B{AplPu{xAfUrM6<~ zA=b0RGgYh>lf$tA0|Z+gW5b*dTK@kd4H*H_roRE`b_rVxr1s+1{jeVb?UJXQDXC6) z2S{}SZTmaqX%%w3Mi904&4TU#>Yqz(a~IG+LH7Zvh4~$zfEMxPDeSlpQ&AKjJlMP& zzv%cc*)2SpqWQL169U8!7lZhfRJ5(gN`&0EyGJ|jRbh9UiXBAY1l$*zd-rX~QBK5t z+i`927Wlm%hM1>ara_nB4%%g9URry@tB-K6-;aNYxr!G%b49x+4-Hs(x-r&2e>)z* zKlfPAYbJg-7Mhf@`&?H^(R+KNLd?LchW1M!)g;Ncc&Sh1`(RH4eN!l20n*Wf4&*~VOMNVmB&|J?YH>=m-m3{Grr^)`4soSuEL)VzXO#XT`-=h~S21BwrO$-)>$*>KF=+KzzahoShunETKM zU@E!y9CvV)3txA6Zp^NDGd(b(Gu&|qkxZFVS#Ej$10lQhegr;{8y}q9od>5~7cEF+ z6C>iDct5E_7Npmm6v2PCs@Jo!UU#bNz`zHEhNS^+6B7(1CPPUuzzox#g*Sd1TR0B8 zLIb)_b)}Iv{!ZB{RyD8(kHlBtUcy4K&Od>e-}u5!Y_byzSRk|Kq!_% z5;g2*AAJr;pR!Nr)BpC-Pk^d~cC#P0-4A=r4|@e@nZ%=gsOVk)=|6$Amk&i8?a}PH znp6HgfEXdG0ceDjBkrSBK&ML>M+HSqK5Fricv3hD$gYBLF_hs;PI7f#PyEx)T+w4x zxhHyaHus)p)CxM_(>;GcSI9&1?01+?-JMSihsj>Yb=me5jtTSEJMQt08$s_h6Xdk^ zzXB2f)t`MZ0!z%9(X*T<~aJgKj*$#BGKg~847b2hFn_p?*y0i{q zhj4ypgd4u^J@Iqp&OPwn^T|JDIZ0TbiJ{=@8T&ML{2On!63^#4wl^t(WDZ0O<2^s3 zTZrw@tDjK+7jeK)&$4JC*x(;`QGQiwKMC{?v|o<(IUv>Kj{_}1Sjgf$V6mXrfEEej zY~nsa*~t0#1#x*#=P73cQ8Gdn4>tHK{$pJie-8<|8h=%~Z}3sGk2r3;2ihEqa7(t|>ghcy~TFhn?-k68rb z8{-x2FQb+SN(@6wl)DN}O3MX=B<8~T2c!5i0W$@CM&_+j_NBLAMlotB~ zA}wV=DnYeCDw_*{P76|QK!+b>LqhTX_#ICMk1wKOcMmn2lo$=DX2cW9e!8AX07bVPbufWts{fH;v zxjIeokZH$K%}lN%b=NHZy!YsvXp%&JGrTZ))@^yoZ?T@=9C#OhirYIjBNF5hnhSOb zypGMBm3KIu@{8gEW2&TXU75{c=`+QNT2O0v%dIK12$C?u<>_Uw<$Z_j>7dtMI~quR zO(j52z$n#K2VD`UK$!ZK=BMu3fE#Aitoqwg)JJoB#?Z|SP2I&dV_z$bq1&MP+U}zF ziv6P)b0PF8hi;Tq^IrUwd0r|TK6*})9hv{}spg%_-}JLcgmh3DBIu-t!?q%($F|bM zI6lC@x5P;k#RNG!O|5w->zxM-8`1n!HZxJiOqBG_#3(LY>>$37sBnI~dGO z5k1?z>ObW5&-G5vqfHY|+8cAFve0Okl-nDJj5T*-=~XJ^_8NE%c2yLdiG3Z`Iw)n-ULInG#^Pp_ z#CBhdxIGovqO}f*_jE?qoq-*7JEJ|joYGjqDsHt|W#1lS6S*w~O^8EF5^i#t&2i-( z)!yLDePUNA%W`+3f}O~9k!$B%*YRJ7t2;Hm@1qxh{)|#$Omr`YQfMy14P`C|wtq+2 z3{+{@abI>^On&>U14IzrH&D_x!sBdGoqb#Y=DG`_6i7R)VR%~ajzAJ z^1Lc{du&X*+0vAUmKkD=c{(uw8+G8;c?-G*=F(|&mp$#T3De!mnGuXA+LUBw<*hW%OF z%Sz50j4mNLLhIb-lPH{^AZr{#UT~Y3|airn4trq@r=N9JRO%n>O zc%H8DIqq*n9J*~d@Vx#d0kVbb_sgH~qIp{xya~LS$ft+P{cKGP=c;2llDp5DJKAY5 z4?Oh?xqpe`@Y>Ix^~3%Ev|OIjU8r*e&uaJAf+&TaC;m{>eUSFIy$M3u?n)FAl4e_IvXMG+TDo! zKqx*jx$gr!Ny+_wa&VH5FljjFKg3^+n4a<3t#2}p;q@|Z$bCTZGhMp`7pVup-F>hl zJKmUlEiZl(Tr|TQhuK>W4A*4DNa|vBc243*4R)UYNuHopu_mo~F&-qW>v+(MVic^F zsrgP8$Fjm!_Y@>~up=w}HS~}#JKpXeUr-<=&Ddoi_Cedd{zRgC_~s^%&o6y3KDezq zX^Q8W`MtLQoQH^NGSvb7N*c8hXs4jNfpog}2#`+lY?M(ArIA3ZCEhteDlT--sqw@! zgE-|2S(Ab87qkFK4XR~8O0gE`>+&h7QR2jyeH?|05NemY#r$is?OWTvjEviQXZp_Xc^ zSPAcA$Yg>AMjKI8M*S-Aw!EmueLd<`!?}UnRdM?R*1uHrpdMS<`@KB=fv(jC`jHCh zISOO6t#T7(a1hb)aV@oH)Ll^8sc%rG)iZ8EnF9P4h4^jQKe2HKoM@9@bNS>Olf$sF2SZXXb z1!8)DmCfs9t7daELJybZBwp|S!Zx%eiuAVBXX&5p*3+T> zyOZf=zQJ$iM}fW~4bJgH5uMz>P76WWS%FqUD~OPyaZaGKfpy#i(UZaNfY%AlT)UU0 zy&5u%-TpoCilAioaaChApAvHwMo9QAFhWibPsdOy&|a>k+PS@<**7i$96Ue+v56p7;ev_*2Nj!Gr}_q%%bt-;14i2B0=Lk62U9 ztV~Rcafb5FI(B}@f%$iJwWZx)Rq`xD#WMT57Sci*WE`KZVH`{I*gEa6o z6oE1+=*ewh1ckn_}OZE zQ4Itw586Fnl9(cY@D0Zcs$=eoaMV46WMkQv18N}?eNTYC7%S^%uzRA?Ux|-`d>@$} zr(mAE@5Ab6E4I_iFw6H?cJf)<yUZOFPU&u+~Ud{dVFdA>m4xRbnEv0L86J&Tx@uOsvO(?EV57hUy< zBU%MrCci72xkQ$`&h3-k_g-{PYsbE6r)PI}ab)u#DPs*+ShY_!U1r%WamiV%U{=$3 zwBvl^+j$?bi}$V^;gmkM0@K=~)K8V?pESw_>UOE) zR^_)0kwS}kPTEOvIbQgC>A#2l&2 zDnZ7qad`@*KC%X>6x86M@%A&ZfbRp+ah|iR4HEWSKWqS!{=S6K_oMMR6ucv0)BUhb zKwBk@vr&ylkH>aoB_#K6%TtQ2J{<*g7%@Ut0!VX}0@^0=xXVoAk;7^DAF^`bZ)z7b z1W1jlVL)nBjRw-SwTpn%Tq^^*NBB(vQrrJZpofLabwC>h-3X-nKyCrjeIRRrn&s&? zfS8MrwFyYgwXzwU%X9Nr^Iz77Sld)imiH!G144>lshWFuek56vRplOtx$x8abKYK+AVQEjQ21Hqwe!waXY%tFot0_oCr^JV}_3PE>k8Nu-XKUt8K)$ z)7Z@BeIloM2jzf!(BQ_nrh}8x@8(iyRssD@1pNy@*NHg(0O)lI`vuTEiO2cI7e&ly zb*a1X6(609*j++F-v>L7E*0qL%vqA$>{6*4yIs$+U~r!*C{<177CJ9(@WElHlyscF3EFdz{^|8PR*X|8xNut3q4|#HGlPMHh&+@b`dJ=|1C!Q4KUoyw3nB?IIwZ)2{Ku zC|Sy-j1p0n{1z>h59O_>D1-%juDpTA+XLlZ8KXP%GWL?>t+g-+#u1{8s_jkdNZk5Z z;v|mJ{{U;#)li_a+3-S7Dx(@hLoB9Z*^o-H$kXhLH}-9P8q;pUi8y zNeeLr^*ZP264OdS@n#FzCO(|VYfN~SLBZJ}}TYUi=N ziFV6x(piKe)z_jN?wxbo+rPqR?1C!qU)&&ZpX}M&bvBxowj7PpmeG)rD2mq8jtmcA zhUfI~eZtaL?K=kInU)8WS}83`Fx2UJ98XvNrR&d-FT9*-x4s78jCnO())blwO_1r; zr>@5lnS&4Kgl0}QsjOn%I5-k-E$jLcdHF?|5rz=-%*gLrF7j||EvMrpl5tuZ(Vosp zCF3qjya%<-O$u|2g==pca&fZj%=o#pGP!E!;g^o8XQMUx+)qW-|=ZBtc4#oT?`powvnPzJ^f z)BVv>Q(dAjGS(#r!$IINfRx*Dt*QCB3tU>sO!B_?M~G(la2?x zS<4QFiB6$-B&c3$X*gq}2R4Cdzr^;TRh{be>zowl+HzoK8z?wlTwKMZGA)r+xjVc} zn;|!yA9NJYGVt6qU3Cyk_sTfbg#So1#91h>4r+Y!TP?&+py|0(d0YWg`|%*qCQ)x^ zAh&Pgf5`eY{^|y5dWkJ*NSGoKJ zNNKZSlr+d-KM+XQh>inN+Ee|fqktME-r4?BTBh?PjFxGgpw&P(2)Z3;iJ@Ar4i4x|{d zoWH}x=tzH$?COtV$r6e5=aRm;%qmP`YfsbdV$^y-O2=XJIctR8uF zA)o4Jj@M{X5opM1&=nd1!~Wmp%z-0^{5ao*@POUA5JkkWg=KB2Cr+|yd(x(yB{AKp zvE<>r+sfl59F#x7KO>S|+41AJLWiSV&PQykd%giUE<;0V447iT#AH`Eei8o^CcDbw zr#2sM0x4`#j{B8nv?FD!>FS#b)N=$}pjMk*EkGZ=&H`JDs z$PYe(B6+|HrO%=$*jKpe_xY$l*_wo$O1nq~&V=hd#vZ24AbYs{v0k$9T4XcE4t!5>GGY0(o6p~Z{kTo(!RsPS@CeN>=+Vg z|9_d4VKT$%fa6d3lRIi7v+)Ym5X8{Aej$+OdIC~KF&$`%42)C?w~GR30=i953g~7* zUj$k$=)Ztk1#JcTnxGv(cL{m|=nI0L2XY0y3banp0U*r*{rO*)u;b7Jbhw@jq%OV~ zkgBC6KnIB*@6u$w|H1-4O$qNU7bP@g> z#8&sU~_x_Vk83X%*bIvVjJ^TX#~Nt}T%v z3a8!Lj?z**?a#|(%)J#|k8hW9@vsG{FpEcs=Xk&S!3{0qX}2U`@n%x(cI!2G(zYl( zo*!*O)-Ab=_9mX8xR=nTwp%z+zJxv~-CdGwzb|=cu6@U&5-D~`lSJaeDi(X}7CO3m zbtY3F*zYra850L7BPN1Ji7==bD-UU*_<1mmK9^4dq5dYPesT5_n zS3PqLkWyR^q&ZmNKYav9b;X-Nx|s17AWiLLXbsg{BY-rl6iD?Ob&u+|tNnPhfizuC z7dK1pspXXRuYTCOemv~B_Fe@V38eWe08(xLDIhiXCiqVyK$=DjNXLgOfRv&RDD8j6 z8=uB1!`eaTLv5 z(X^()N(^aQbCZ?mKfklQAq%V7SX?(pu4FivBl*a)k}o}H)9;H3 z6Z#K)gOgc4)UG>MNU( zzTR-mp+Nj$Tm3X%lteSqFicq zG>{&f@(CcV{i#5cOW2b}9uP zls2=zR-Pkeb|Q1Q^(F?lbqS+}WBQm2!#edA2R&-ni|J0od}MMpof~}rKT`Tse9%_b zQWuXNqX(kFbWWTSiauWEng08cs3kGc2zJZQaTjZA$igHXTZQbF@8I4e^vzN9pFwyY z&FOUP%Kc7TOFau(oLm*qlBb7ujOGwPZzFdY!N;_|ht()8cp7ur<^y?JX^A?a-T zl&h8+HUdw6BNU^6xZV)5D)CpB)VT1WoH@{Fcc%~fw?eTRNW1&3Kq_$DSFl^U5f|5# zmJ?-2I5x3icMNxWdxwLB9d|YUzl_(qFmG$%Ha3W3Ekv#Y-sD)@e0`TBhD}s#ckZ4bt22!iDcxbWD5e885avd^PzW^VfUlyAAXXBkcaG;U9JXDYMa@&ZY^avdC8j?QmtblcW0? z)gPzlAv$ov?+O)#ogBKoco-I%dJUXEnzNVn>s71t<(1i3834akRGG4(%dP3Nuj`2Xl524$$%wn7`$gQy&N}Hc z-JO(HmD|q&b&LFPVy9C0Ga!}BEkJ)jorbKPKwlL};`)vn2cz*s!ziPiP=zcG4eC3i zJgUUq1*EC{7)W~wO(1>xk&k3(D5FA@Z3f=wQS zXBM;yvap~2i}V+*!Ka#7(KT- z8VQ6)#VmXEM?OhRwY@Ct%? z1=GuqvPx{L!doUo{X}z+gW&d6v?)!kTIzp{E?()$qJ{k=E3nUH9yhZ3k$dd}a36sv326%L{nGeGe^90x->G=$Lz9Ot~P)swS;_|09!j+zk^3S#1(ZcI#3>*)?`6&EBRpS=Dwc$KOcXts}dxkf8o}I9X7?a=Y~sL7_^!wOCLN z_?{~$8)&4UETlgi=n)jg>Ke?j(h9pZTORfUDJKn0YeHcBwxAq@agNfoCOc-g@+}DD z1Ys1aNAmDT-iBc5s^b?=02vJpFhGds~Ch+XlK<35+VCAJ?A z;4QG%J%wLiHd2-7rnH0Y7M8HNrwMx67k|U-do=v1i1)lp0*q)t%9G!{&7(X2r4>oOda4%De8TRTo5lU9&<6yq7 zC8(2G2-oqx7DyG?9YC+5^|37n4cv+UA?w@ttIBT=&>QmfMWCB=`SevFo$$O4q$-MM zj69FKkX1q?cE%+@%B2cOX={K~nO+T~v~)A5+WIPxs^5o!UKK9efz;*kYoI?!*t34v z-+<^I;hIse7oTJs(EI-C%fYqlQBIg^`|Xw%Agl`+dop?G!}zS^p^xGh@@4I*ur%ye znHjk+bl$-}*Tq7f?K8tvb=<5&h!i~My&&D>z1pioFO3CMKed2 zfSep0T#g9~f*VI{LHXE2GV(B+Rk9{yXu~UNcQzriw0-v#NZ>)-SqUsvdh?{xwM=q3 zoV#Yf&b>_tkWE4I2oGYV?J=yN#lSK;rrk+NxUj@l$UMhg*A5D2{Ips2+O0rd)uK1L z$^kuRpi{ctUd!<^m?O$J{H1!_D)1HF$vUXJ z+m-20Y?m+!lzDr6%K>D91AgLFNwmj|e?GnbZ zOeN$spl?VR^VBJ7iyr641kvNHduut7Jx@{_;-fsEF%mWm=o~@$K!t+nIyhGloAVQb z3V@W0w7l=BMK`z!JyuqsAp&0Ypc!?Ht7t3BiM-b?4M|V`l{j97lX-SjxRdnoJs#hJ zuaXSdf;6n|G42$Z=y0tDZ#Kk>G0vJ%Dlj5?&7GbLmvIo}_=ls{iZB{1-Km z*jMDpP`~GWXF?-&b5?jR5SPWcCKXw^P(Xe_9_7E zRH+9x%a||Un4#Q#3PUS4W@n0mU13KFhE_WA34MhsN9O`@a1B{pdwo}A;Z~sc1SNs) zmZu!7RJOPcM%OhS1yT*N7fAd5?}2nrHHV`Pp=Ed9DCi@gUkIXA+AL@SkWz3)!UgV- zH3vvF2xlK0@O{38iXxoT>D%u^#sV*h~C7919dNlej&1`R?BiAowBX*5gS^=jwry@)$*MK zDZ#1U{+s`(05A(O6yV><_h?_d#sMSSpZd<@aWJUUEBRWfKh#ub zc`dklYXIdyf$HGKA1E$4dC+?ubD18X@`0yTd;xqxM;&%{qtlSy5$YisP!CRL(x?P3 z8o)*Bw`uxBAMM4WtmxEN0lW<8A?X~K18HaD5TTuo3ohE(=sM8O)&iuRO=}KE6rn&k zvTX>DY{Lx(DQ+8!(s}g%mowWWQ_@e*M)tK`#`$O>&;qH1YCmkYj}`z`$BE~|tAL=f!&3-K2{|$3O zbhh^O_y~5}pm~7UMi0DBZsfp~7=JO&+npYN-3ff@Mqd8#cc-t|9oUn8n%R?{ffqj? zbYG_3>7z3YnnK@8jU2gEeOD+4qJC>xhO{Q50(G}B7X(%Nd=2Q!(jboksZ;7@Al*g$ z8j$WH{u9u8iPs;B|7Agr+uVd;HboeJnmIu8rm(|}#0ggMPc829x9`tR?#t3wsgIb5 zQ6bCMB*aqldYeq((NT4N8?YR@9zZhx!Y3u-X#8V*P9h$~W4wS}nCVjz{*mNkG&lYc zO7TD8MVk%C05|QXwlXW-I9XJ!49%;Te^sDtERmnylZVlu(^)e+PAr!LDh*7XHJ1Tt zUDp9=ye1#fb));Ge+V>9XlVp!*h@glWgn1oegjDPy#=JxgJd*6gc98KAVT=t?)}ob z@;>@bOdK>(PV3>>h5l#`T)D?005=nFwUa3wiD0q7Z`Lm`MeZA`~!TAn~K%07% zKV6KYg(?CBJX`2Y7-h$~sy6gLDAoUhd#b_BJd%6XtK)1l0?rnh?4y|!X6Qbcf zOl*PaznLZI;8|NETf48QaJRqLwf+5m?xWlHkIdP7H`#_OC(W1YD;H_8*l zA!SZm=!yN9+EkQQL|pYwfG;hYVbE-T8hSz zoKGwYbP!``UkXgfzIp(`VwCq8FL9cH?r89L9KarDOHsq|I7K!W>bqwz_C;jfoSQfi zJ0r4g!8TU!lukseZe9~>LbN#AaYh(p;eOn}&zAT!?h6C==lBihd6IZQ*O@Y}rbPP_ zx4zM|EoF9fJveWb;?cC>*c`H4AKeS2!uU;~AIZ~=K)UgNoBwo|A4YASNA-a{zF2z^ zI{-&H@O^%76M-zbB#xs>mvYIOr@Cg1SFF-fc?dC9;Yiiaauwvpcu;=RF?pPoC(7!s zOO>zU;F3v*V{kce4pEVw@c2#?I9^mCr2Q)X3vn1&yd$4aM@h9CU*MOy0!TXmYg0SL zQa@}pkah~rJGE1M2}nBymAiHdstP-o_5X9A6;jua0O<=5oj^L;_BJ<*npQVJo>;x{ z{!OcOlT8GhY?7;;tayc|1v(?~-CzL8M%DOMO0ahyqteh0h0;<4-UKZ;7#}rQkI=v* zRA&8U>Di-nEbl8ld?(h1Lqn&I=G|HUqim5(n86@INGe z0&OKKbZw=DK-x-6fV7op7^-#D40MLH*E%5G+tmi7%dISq?$lz>(S2OBll18hAnjML z0_lwK&p>LL{sZVSY5#u$scAY0s!&Z+`kvG@y%b1IQ%@#>-cuMvF9pYdci8ysiGL1A zfOI(HMMQ`5rgO&>25nVrqSW5fedGT-4e3ds%*+?V3xO_Kt*(e-RFXF5WkA{yY29mc zeg;UJvkpj`b3TwZC#Ue*5cdFSL$JZLA^rzQ8-j+dHpC-9+7QnJX+yjYlx_&9Kks{Y zXak-`!_Fx$@o;Pxfrfr8^9lr~=6;3r!cmdBQ{v5se+}TRpByeiJL|UB7QgeWUQzmm%@TxZYOGo)G_i;G+9z+GGOwP0238U~m+AiM ztznN7=Zset&nM&E@h~-5R>7t^4;fTX2#tmYk#VkWDf%kV3AyZz-vUw%NUf;N@+gq* z0e=ig_kceKq|Ne2AZ?aIK-w(*d-V?;mGH8MY~>2mt5)T{Bga5t%?J&IRrw!)mR@I; z)ie-1`iHbcY@imz@Ea(;x>*`0ev>xLibbYT;&W)ge8yBS8bj+l*cirlf`Lb&iQTs` z^l6p5OLov0UpI2-Rj+wv8|MVf?zjjU)GCeuX~nksh?T8X%%NSY_}f5Q#k4H7iray- zik}4fnKYCr8E;~LHN^Tbrf3PMZgxpdvqh_8Fi>+PdFOgiVwHNgx3~~r64^|ntM||` z2lF~H#e6>?X7iquLA>Y)z=@P-$iST6lds_My~*z}H7rY-%ygJ0OAI3$Zv;wbQxgp^ zHOZtoi~>j14W9tgI;CD2E+RS&NNb21Mzus8kcuM*3>C-E0jW50NKh^D6CiDw-9SqF zl#luh@c%b#`Q&YR&?v7VNh}9piiMTRSK{ZHZ3IV7wxR9C>GryLqvy(|+i+%3ZenWF zZFqSGOgw}BQZ?v5?HTlA-N~LoKbrjkoo-qt3qoZjt9yXojND488@I5YmKV@LN0W|} zc!V-YhKfYmas8jnTR2nLFn|i`^FTT~{{xVoTtoTSE#q$k=|In6TgMV^B~aNo3rJ;y zj$D-uZsAqgz^1M-%W0x{y-yRpxXL{ZM2V-j6e2AOUQyfS#!i>%{YW!*1dPSD@{hV_i_@_C zTBEzLw4O(+8?U2zv#_DyXn75yrh=Y2Q4mWtqEp`(_P2oJg|ZZmFXfA6`UT9{5Xs(C zaxB5i!h2+P2fLO|xNioE=CV2HjMXXiI-vEUuI>X;6M$og#^WShO#rGojn@vO<^!sn zxbp2&v(2!Jj5B~T-^<4ZwkEBen3tr&+susN6+>#W48OG*EW3) z%)w+-o6H-AkQc3ef36?cX3I>#dXUx$I^0e|UF?;59}DzDL6d;qf?%t4{f?kn2-D9b zUJq0zt+xp1E}^&y=#a$Ytm%NDW*}{!Zvgd^c;bpJ!l>epWn*sTF5C_KHv?+b90^S&-ZB?fo^lpR z3l{;>!d(xfMM?l^C73mamoVqZ4NNyUu%xG-9NU9;g}v^2yVFa8&jJT6GruYvYyw3T zKt-4MXo`=n_7P_R8V@ee68b^;@d0s-h6#%JCzpTVJo42q&Mr~|viL37j{1#8WX^7B z&w>W!;WXU6jg?rt<;MVl&TF@Pol)E?bJ+y&QC)|vpwGlV0SEDV>|L5za$Ytzn|hs4 z`?(QQGcg;#G(WzgkEyQKAr806Bj5Z{je_q-6r~rdt@};kAQBMuwMYJkiPtc|MYi2t@88@|LN%v38m#M zZ=F0X@x!WpG#AK~r~LGrQY3w}9_S15^ecYY1|ZcdKLS$U5#Oj?F1h->A13eY;0_E2mdv7FQ2Vyscov$8v6L2tI_kA*U|E}liSGYTipD{j5>>0#?_!BNmoKdlE z4381P(^%V$S+Z5bt1F3dR$|mHtQ++}7vZqevV%Lb;$`cbZZ74^5x3#x2ppw967Oxa z(kp~4A7^jej+6WCR@y=6$#&}ofJn(ye2(ihMCqc}04rcP=J#o*jhfQ>RaR~`g7Eo+ z5-U+-Z$mhn-qT?)?#d9qE%Nk)<5%{x@87xnlTC+5Cq~&Dr|2dDRO&F?WJ{)TGhj32 zq#K$fXToK6Yb|Ulap>c4C`mVQPgf1Xd@a+8*f`WH*Giymomi_LBCE9W8ePY3_dwq`7|@NOS)Zkmmk1Af-qh525u|1Hxu+ z1V&0K#DjbvRLsej=_J0t?%>$I9~#zt$Wtqg+gw2jE?x)V|Dje|H2>sEHiZQOgw z4g1WE;1*hmX&D5!)EC_T5&QmK%g6jnk~^rW^s9 z#-n3a1BF9M>~v1fCv&M>Qw^U&z;ja2%YdF0bOn$WlxvP!(4|0Mlj6}%)q-+ZKYBsW zuW+-(cO)f>8qsV55zdWkpV)+VuoDMkIUP8zhD|*!Xu$R}qfV5;Rqm~Ra&s+M7Ky{?92xBcZV^4ew@!hNndn5M%nEqJF z*8pkApbba+ulhuq4xMGUa4v@EI5w%L1Mw1FU37^^_w;(DEa_?2#Bc;TLEo&7*xUB@ z9aa8=&Uw7)oXAQJv+<=Px+l*4#DJEmX9i~&eR?K`kYhDhuxA#b+`W6|JOpUZq_-j(%q*-~CwKnT`prZ@yS>9)gdc6SVJ1E9h9|4vHzV)<;ZP6FNvu1k&svhK&V4F^bIbR$F#O6yKj$maRDW1Hp3lbL@Eq^(b#lKYSIJT_ ze|d)cWc*{ey~P*|)Sios-AR2#X9KCP=#xOrlA8)3^%ce3+nEx+`$qQ#_Q8BnliD4{ zXSjm)hrgFJy?5F7)NvW=@y^MzQA9*vrCqFsQ;<}vBsvO63r?fq{!EhWdv~H}R`+Eb z{uV2Jl!sTOCqhxRSmKkqUP8XNl!28|u=3l4 zoGh=;bzg?}H%mWkJkQ=}8=^XU+km!l8{1awZyVRpdT`Yh&G2=@krBnou86z**+^<- zn1@`i6dl!#nea7a7yY(<~6_{AsE&DaVOfK>2DFSqY+0PgOiElgZ z@1kRnm^UN!nkwVrBa*%D(>Pb>OMEIyQM{gn7gBeH3h{+U%1~J*2hzDHlXkQVfOK?= z0_pf(2c)A$+<(e$y&{*^I45^HWm*rUdX@WqzAVz%=m9N7w zh7ZPAh;I(P2?yPy(%ju!Ioa0l2+_t+^fe$(O8F{bpAC`N!HPBhJ#l<;oV_2fEx+1W zC4yLFB`(e&h-X6(>G4Q=H}GYqw0Gm|zQXro6~iNzPN4WHOa5ZY=}27Llljp0q{m9z zvkFMt^D{mQYC$PR>0|M!_QrvxPfw&%2*vq?w}6Y*@g5~?nfN~Uz&{hGHyu6?3mQ7K z{VtGKomw&5W=chkd5_d0T^nEW>Jw*>#BjVrevCr^PQ=k2{y6?YUdul$DRORs6B-}) zCQE^j@4n!;xf%r{1P{MC6RiIZQN)=kK<^6bV^(+*PuV_G`dE6<*TFvFWN5T;Xi@l# z&Yv(kQ4M_vrS(zc!j%?G#p=>M|)B>n(>#{E2!EW)PO;`K*eyHavVfUo|B7{k>16h*XtI70R+g6E*6|0SdlVtmRQe ziYe)I<_)w4P1oE}U7Bm3Po;=dJisi+8r3h`>Nk$}7)0bR-u}j~#v9_JJRqfDEKW_$ zm5KLN%G*M+{}ylZ-E0`+HxqB3vW?cW`&;(B0hW#SurC}e?eWB7uzcmA_ z;TImik5u#c$GhI}sTGlWjZkZg_Lq2uf=@LbTT~HSR4EvXu4;2-;@zygy(orn2>0pq z(c{L&!|(M#3Pn=>ojjB8yC1{5?SGMH^5l*Zb7iWFyM=F1f81@N{BWt3Py8KOLa%_Nf(-n%`#fw9xCk#{n<$SGADF zqs%Iz%qj(A(ahN-d+^Lm-3fRKb?Z|CC_~x1%EQ}?Ff_@rL93}q2)}8KMYX+ z#V@fUmT-?!OB)S@{>ruN>8ihG2juQ8pHdMip9)Y80wt(D%Ha6*woj>ul+S5R^nw6rJYS|>uL zPDE)>ywE-{bl>1wQWY6e{QlK1u_Bh~&2)+5T4F=NJB`N@D`JV2g0Wt}e{*Hx{Z_9M z8@?=YI{kDC%9lL54O2g6Z<@briA77~`s4V40M!A%q>5OU!%CGu$jYBL#LBN3Y~_yw zo<8ir3H!7UemhXp@Aw=PkwcGi7{(rq{}^$GVN@Mflr}`6z3kbOih6@_4t&ENXhSgpvGAySU|=a z9T7+mkMR%D_=A6>`jk)wtph{Bry7qvLJ@m}QZUwhhMOw`Z+>lrqqts%Z}0TeDJWm^ zyvgw7Zw9^*k1r|#63NT(K6akTmyS*U%D{W_|B^TP{?lg+kbyV9w9?zE`PcGIzFZpg zuME6r2ybcqz+9xpC&BqWK9wTY)zwOsp$7%$BmDY}%8epY&QZ#vXa{;u&BZT0Dzzd~ z*JsS_5<`ODkWZzER5zw`i}A`H2Rq-h@nZqXemcD?@HHMW7eEcL|g)c?R`MCceM(`69CL=I_z?YJHIB^#NJU z#P^TFSM88=3z?CQY2^7Wq=+Tx(%f(^0vY0EDEL(4u`U&{g_MG^CgZ=kGV%Va@@8M~ zS|~`>o2$~Zg_MfCe`A>AHxvJVD1ST+@jB$+D{ z@6rE@Jd-Cs5p1qZe8&jiOrF#&h77;_R=4VAMJ&%Jl`=4cT;zX*v}d`v0p=|Hm6!s?QP|q;ZrIi zWmG6d`gRP)eVT$#H6Eo;5v5NlXzBe8|IL+&_cY~wQh)2DcR7j-wfa3fMC?vONq$O6 z&7>$FNGTa>21LwUnbMf4Y0#qz{=r-wE&s}!d>cN7_cb1GO`p7ZvG-_BdZ(cELZ0hB zhHstl%^K9t8gzUA1EGeTTGLt^n1FZjb1mA=ikR90&C#%sHB2=AaT0ffN5OW|xU5%2 ztXHMl0QBX69A)Ca#49n%2>w>hzr&xrzxFZw8++9#bHs}^nl7UvmPPYTo}C}VceU2& zDTAz2#@W^>7Y;vg;=bee+U-LdhSUzOmNWuw6839W5o`7~)S=v98hw|DyK6qGM{ zmVXT2t-?3!D4vW|p!R+QPO51Xu}s^QTIN}4?`&}8=f^&kB2slKRd9yv`Rwlrr1uk_ zQV}ViIA(5ln+nA5gFdw)QvXJ&1HIP?Q2flNP(+HCgyNL^kTvjU{q`9ROe(fxS~4ir z=6cBIqlkQ76+SY4zB@=F8VWwuc;u*vlA#ogRe}HJ%EbE(gb^ zDm{CnQjzyLfjZB`zgzhuW{@u>Ph4xDHV}&piqutUw9oev>p90hgRKbC@BpZpY5iIEuoZ*b$lRqnbH7rSq^29q{{*{UEaE~v3kar7tH@1LDmFVF|__m@5&MdWk7@EH}# z#`wn;vMfWvry7qO6|ruVg0Twm-&~n^7b|a(lM}4m_=#4i<`m&?D9KMLDJP1U3#DYN zn~`U8WlCebrXg1H3B7n9E&s}!eDigP6!w{TU*_@F^i92laI3L8|n z`I=|*c;42rrl|Pk;lC;;ikR9I&5`&;(%x1>#dgxTtXD;>SEXVs?p-!lCjM9SDzV|q z5~uT^h-oQb@(ixtW#W64mKewBoPagp6R-w+!iC4}8`3bimbsDlHwkd@=y@%*B9{6( zrS9Vy4f-w~@u?J%YHpe;u(}qU-?sZyib%CcYarm&G8BBO@mO|6tY@WQtcCb*u1vg_ zDQ_=|;mg`hr=Lzi`I2XoN5P*=d=pwy_A}VBHvE}pmF1TK%I$t>6|p>Pjwr36;8Tsq z(kfzUm4dNe#(#5V;@#YqjXV>*pWC`>Va`$M9wSq|;BQ zpnSsc2^|*E#!4gqo|gka0t-A=AYI5y}S*8GiTp zl!{2XNhrlOeO+x+L&2vSkL{u;&!>=Bfttv~`&Y^vG`tL77A2j2It9&%1)lWOnJW|D z4v#O2^Ka#ue7PmvT$y<9`CsIjJhui$s!V*J625)y(&tQ8@cWqGI*M5T&nXp_7jv%< z9mw9R(fPz&kNZ@L`0N!eL%|TM0G8PZSY{{3`&%bqFU(N*yZgc4&C75Z0j#uP9~A&8 z7seWZG|ZJLz1Moxnc>TJPUlGxB}w^`=V>3q_f0MRF;;gR;BK6;uT6=OWV=mwy?|RawP(+HuS`(v&Sfk+0JmvL%*05(Wmc)lzgKCDL z=2i0c~PJS*Rm90uc3Np`NTh^%VBgWbJ6`g+N+Q zOz$RU%eyj_<#@j=jKuQrI$BwjFL}0p4BwN5Z!i1P^JV;9laRkp`I4fDHFvsF23EDd z6QJ1ZQz#3dF!p~YVNY~vc6~yJTPEizxJF4;~j25jwx4Z@5HEp4DrMS zwFwoG@41?jK2|_OAUDtWREkJ7R;iBCv%Vdm{*6zqh}54_YO%9=?^yp@fbvEvU#${;~aqgj1 zj8zdRS0?^5ls{tfGJGk@={zW6TFRF^gKMXm_+Bl1&t4oawa#9^KQ|?o@#n0f;_>*Y zThdT!)vs6>k2lO&7+t9sgu8q2ASR9MwBYpjaOSY=J6HLbcPI&JCC6R1_{>wluzIX`+7UprM1T>gCH;tv(+?OY7&x7cE!vEHhv zi`QE<%j=dl&aYp7e&y1+%jPXwx*(Vt|N}^;E`}(?hVZ9A6TN-9P`%wd>xV{egxIQr- zbz8pz?J{R+y-JHF7M@?XXfe{DWNFcYAwjyvWpi&tjey+5@M<`am1vPQ2$`xlAW&Rlxq(q$``hG(Fi6OG~W#dT;$Uo^aCg2dI& zvEucs;$zvntTEQ;(W8qloMj@;tCtvw<%>)Rpaz-%ZFm%A`RX}~mNYE3&bBU*T3E7V zj`mAy0(oCLflYSlg!rQP;`&R+6^#o|T^0{dT9#Nk562`);DoUn<@#mwRwMc+FAc=N z-GqiqYZlgry?U#k7oIsi7DgvrS=Sg|3SRTcixLrExTrDQSic-9;(`fd8!nwNRyj%; zQA=JeT)$}Pyg6Ruu3QvfIA>wq(s_$j*DPMth`wxMqUq->yZ#3DI=`+;!*dr>=Hr({ zXG}Z4q~ufM&;O)}&kls1=hwD0v@d`4D^$89z*z6o^2D zzz9Jsu|^e~eNN%IpBQsq=_QtmL|r1jaM|)j@zo|f5S=;tNb);>aoqx6BGb>(WMjvo z0?Mq5k@98MSr}xzI$&JZaO2#C^-Hw5v;!BO+c!!AQXtvwLn^h~C#<0kO1n>(h;`q< z`OE7TEP+C?Ixo86>$kmZ|KXOOJiB}0l~?4fnRn5Hd+xlxWcZ>#|1q_4#+R17d-tSQ zhBZCg&|UCBo}2Sw+c($VbDqWpad&r$TX6~$Qg@*^1xh6qs8Pe+-QC^o;ts{#or}A>%QxrjNKQ7~_uJnk zH+|;$&$A;tyV)dd_AJdi^jX5>9ibe9qtu8-PNV+6ua+@jJ-$q?b@Z_skk0_p1rG)Tp{wvlXD#> zZ0$L5PK{+7b3A(4ZSkI?&*t~YnJFsqRFN%v$~;UTaQyl8*7wGLTj6!L<&7e?3o4g9 zJ$O#l-go>-ra2GKke?)`(X*kC*~RCWM5`UcrW9dhWV@3Kk3|Q{lTM7S+f^++E?@GOs6^* z%JdmkH*wX0Q^vU$>?b>A9(LA+w_~fQF?sT4P_2Iyd?&-&$ zd)3-z^UqB$ckd~-HM7^$UctR@mVGdK_;~l{4~i}>KI!67w_4jCXL&FzY3|U#6L)^i zx^#L+=<-Kv)1|vTzVx-wbx(SId$ISQ0cY9_n`gbFZ}r8=S-M`n7XU&%T{l>Qt`$`8PB?-TFZFd#+)>HosgEKKW3O;ZJk?K6~n2 zwjGiEUpUNd6_~C~qx}q1+`B9bpN+ejl#uydHCgMJbK@Pa~Cg+ zSXnvxPV-mo@)yi<{$_*4o=cmT^S)Wh&vkn%_A661c;`5=<55uj|t5t7Z|Fs^_x=z=$e~Q-`TV{B=Ld%*howx3K zTf25{cgFp6>w6}D?8BO;<13VM>GY=Fj^7POcut*>T)oRH`yEk7Z}<3psYkJ$m53{5xI(8!T-%qVezWa05E-GEU4B4_|T6sO&+c$If{y8(KW7@K!jsttU zJ!s`sWaix}lVa;OIaR6QMxRTsitn%HYvo+R>h6(lvsd09zGd9Z5lwa$_`NV&uTH7u z+tkn7KVXvE^xrc!1gHDCp!(&ve||5yyfJO~*>+96tIxU6sN2gOt2RGbRq$N*rd<}j z+qXRRUejBZ+H`TL$R}*U^#xlv!B#Thijj zR+aW$y%2RXu0pR0HlH3w_o(BxXrWEL*BQ5+|2lup(N8M}#P{4~yU6;{uuI3{`qpio ztND#%mClLz^rP!nhh&=%F2^&^viX=kZSwmMr4mN3G0Y!(etG40^^TONuxxN}?hTIi zXWzdmc=TnfYCTHMEjD$~?DOsuM=bU|x?#zQMypeIc%4ot)8dSEgS|I*Z)?>mYW1|I z4c#M8tQ~(Lx>)HK0Y&p>zgl{5mY`oddiPp$E+}Ar;Ju2Dojp#hYPWmu<@de2I+y)- zXoVL)d({5;V&|$W<7%F?pPkaM`o>A~=2jV5e%tNaKBp@Tx5{dlt@@inpIT(>KiaR4 z&w^z!tJ@tbR_)SZ*NYBgi(k6m_u#0n*>7Yu)Op|H&HT1oW(A~o&oOuXj=t_atnTD> zo87Blie2*V^pD2maY_uT{rc(o%L{*BzT5in@R`#;<(*h@?W=rU4?A6My2QD2mi@2y zzL@-R_Rp=aKGkvbU9-7{%j%UG8qV2V{!*Tz)7nM>8`HYoeX}Qb{m@f4e15t;A9ea& z#3eBfS-)*xeRp>B$l9NG*k#M~?M7&amvMt$m-_YnOQwBi?3%b6if&C;zfzQQ;Y$5_ zEf^7+YsXyA6Mt%bp1&-4`JCq~irp_ZEwuZ&pZf;ZS#hGv{@b^0hE?r2r&8{PqcX*J zat_Wu_DIu|HD_{+^_cFzE`!lF^9`>-{&g$m$oS#%`OSg$ZS9RS`(-^Gc9yLYUBk6kXuIdwBF z%ICDMb=$t@tdC9V=6K-6aIflZS~raEd!WqgJvMb6>|Hz9`dqwpJL>h=<$F6e3=%&V zOP@Y%YQV{?)kj3Wt@L5ur_yb_Qj0&WG2C|lIFFT%eKWrgdim(V`95cx^tUQIxvWim zp8~(<{Ma+tZNS8Na~y2WE-ANa{_QLk3XKjsd+t)!k&7dTeIB+haaP|p;^(Ti+sbZQ z7k*moPvFaRe{5sZJVbubyMK#WKYbCkdqvpW_6y&<&N!xm{T>HDr%{*hPrX+9YQ?N8 zS9x?P`L=ego2lLAw{(2)QsKVKCIxzAsJ!@`rmncu-u;c{qr_xT4m?fVb_b5%zAZi#p?H+ZIWz1G@8}% zP7mMJ%Ud;$yRi1?5Qp%5O=o7m-tlFxfG&%S6TkJYHLLFYpl1UsOz-0o5GTf`^n?yS z+MO6Qb6|raM?a0-+qb3BuTzTc{p#bbwheeQE~eSwVwoFkp1U}?#Q6RtU3c8i=JX+7 z&3?~wX8h;Qx0A-EnQDJ8=TPUz_99nP4$cdAA5!ba)P>n&tEUt!yDxNfXz>RP&ek8e zAalBk&(;|?Zt@s=eQVQQ`5qrxIe34yH^wiYXI1UhPxRNX^X(R&tkGueiettx&1+m~ z+TzZsX1#Olcq{s2ccEtmJ6uXDFZy$IV(|MDOV4x>^XFOBd{o1~2*stHAp>=-!>Gb;Q@@p0SZ|rqn z^|j))TyuNeI`eE~u7=wRPH`CeVMzK0>(*tPHDtE<`RJk>9VWIJu}b`0?4PHF_6$B^ zC-$$&%jY%LJ#(@V`C`6{_IFNqd-}RFGb#)JfETUYGUiTNwb>;@r-}LPTi0^49^QCL z*!4~4#=UQxZ^H}6cZUxIIhXF#v)GR*V?0NG^P2d)=FVSR2lvRnYfZ7SpRVT{*LGBv zKlvVs`l3IzeLi4Co}r>V+27_{)(b(yKP=7i(Z6);-H$8#b~|!zVg8W$J{4{2XG{Bc zqO*O$s=Zs>4M~1o!Ex7+r+ruM+8=tfz;>%@$II<2S!?yH87umDPWdYOcec&`f0s=A zmP_OX_EB; z^8Q=%t@XGs1%Fg+6qR|?zdLeu@Gvgx`n31c71yn%+OKI{wtj}$-)dza{^{R02Zy|# z`K8VMq0SvD9oQ5h>N6i-$9rW{j%Tegdba28-!9|EW*EJ${QGn3cf7A<{~+h}rdtbs z3viqC`{Uq@V*D4kpZTflgVTred2O42-TqkRuSHt7+&eO&yqK?7y`xjl5AIWX=f{=P zOE)dtuHDu`^|PEGo}p3w59b^Gx}T-XqHNp;keDysew?SnmK!u{qH*bdK;c? z-^h=l=d%`n?=o^t7O_4w{}y%WO2qVU@5h{Z_QD)-m!ZZ$|ZZQbBm7^`@iCo>z_ld z#-|rQS8V=mTJ6}n^+o%)uDTPm^4ppEV*ScdspQA-H)qFNf7v$vN5K+hYA$}ArO^9Z zfpO{DW_p~f&Zd87Tx+|cv3=V{^?vn^x^ioF7r*qa*8Fhv33QALEfjn7m5+OqN|S>t zuXpWX*b=k;=YjDq9baA?YX9>0)-N6rue+C7ws-ry{(1Xv702h9^tU}jioMz-)-$o5 zi~V_Vq`}gN=kKow|0t)q{d#oW{7tlH!p-wzrtJUcu$^`BJu6Z?t}Sdo^~$lI86Ms3 zR^(Tk@?(=$l>K^b>ClM9j&aBTIX0njC#$xnvp>o9zT2Ci%|lC0*%?&vV#a{z?4Ndo zoz4}vFXsKYqXP~cTr#`$cX9lP@fZ1(J5SFL?vb}&>&C?@IWLX>80}iB?2+}$&sGnQ zy}v6gsKDg?w_9Y{8b7&y{-ObeYS^VUN@}$BRpU0ttOCl9no-R0pQ7J7HqF2DM4Fi2 zd6N=a&AZWNoA_C*r>S1qT2(6KR^q|vY_V2uR>`YB^m7Z${3uXEb`5S^wbiqCdp(DAspzylh>w&^XZAI`4$-cH;`q>m3li^34Pn-<&CRXWU=xu`}EH z2QTwFzpu7?d!3N?&V5&xd~i9~Bg=r&D<19)54gB>N%6g9E4W-48)G=K>Uwy;T7OQ; z_3g}YkKD&nPt87iaruFz_b2z+T`_21%%W;p&h(u#WP+7-PQQ=}+xGXb`=s{Pl|2jE zS{;1q`RYx+^;4E!v0h=@_h``ReXVl6`dR(=hWZ&x7@N3tcr!oXMe6EfTjuY5xoh#% z=Ov+5gP0?xuik zb-&atb@;K(&R^pn>^iZw-@>kyI&BXK`g|&-{4Y^HeSD|M*Y8#tB>Ky~U`U1@<)b}) zW*r#OvR%WgBP%67>HEB-*Oz=b12;F=?l^i|u5(W!=kM-Wt^D$knZ3SbIBzqc!Qdft z#rfp?nE{>e?MON<=HHK&j|LQ~x$%JA<5wPIhI>{$c4wMHjmZ0%)9z18$Xh4y=C|wV zYFye|r)RBxh7p~rW%%f8Jdoq;otLFQ5yzk71;_1kcl~ZA&PPjs&2e|{+wJb8f6Gqm z;(y{{zG^RvIX0Rt&o?Fac%9u?=vH^Jzt4lSAIM)gOQ2Y9w$C5-eMeM9kNUsMKFu8v z^iRN{-HY$GER<(ZTwuW6ZC45}9r&}ulKGvEX3Ti8-qa5(!=o2IS>QXX;_u)p?gpQe z9dqnj7g%q0@s#03!ulN8dg-C#x2O)o+nyX3{%!S$3H>_sSTgl{`P87Lho>Jn-*CsC z)fqn237S*8^bYUPuZ`Z!b$R}&R?F`PdQGrNe$;+@f?byA#B38nmw2ar^9y+U$!)Et zcc9OZLKX73Mwj`};OC=rj@Nd3O?>+N$-h}$Y^U_>Jt<{(kynA9^R{ig8dM-PeW|l2 zcNe+-XtQ^rJ=W_hJ}S|3L|Wd5f4ckBSv0v`$h=JT{w-N~NdH$2?zH$d%4_MDofBs` zbSQgl)!~>L^Smnedov>~!?=^pzn2*GweV-BeB0cHZH(LNmHTv|^DDMqaQt<(c-@K* zbM$_FbJEY3RqHv=^O#a~-nQV(@p+1WYgYBw&Q!asHc=<%%?WcZ{;@=p9rq8nUUu<& zqSKXGGrXLPr3>eL=J%oaqQNmUY6k^9I$v{1nUf#pc8OYLzpi=N7eBWb{d)Sd*Wqm* zi`J|^r)&Su?K-O(quG* zM8&e>c5PYZU46^%E3V%{emj>MnRdPJ%{+rU*nFEh-@&TG!P(U=dmgV}zre1;rRUv= zS@`N?&swL~KF>3>MyIH`RjxN0{wFB+$o%&wKO5HI`h?~W#@1-Ja$?Q%t=82k(ZtcU z_C|+%qsRQy%z40pbuCuDzP@>6>CX9=REQ}(D7KjUyqy)Y?0iw+^MrOS&dwfQVaoD< ztYRyyE1dhs;S48-G_N_NNpIJQji1~|3wi4JsA=6{9Y%DHXz#!GjBQBv^SLkB<7n()A`grw0;LZkpE2oT|k>u4U%O2Y< zEoY6XS2e@R5mV3Iz7Xc|z0l0eqjou7%^z0t?u0=@CfXGpdHQ|#N{#v*z7cWe=fm35 zckZ8)@UzIw{I84c%HHMir8@BiLOu@2)}!V@n;d&Sw7mAT+o>Ht=5|}u*}qoWrp`5v z_Ly1h>VaE#^DeM%Yuq?}!l82;v=d5!Rpw6MFH;o!wnW&#qrDdlA18)4X7%apLkz4Q&|$07!8=MY z?1QYDXaydc&fZgH6ud1A+pdn$bQ`o zOcS<&hf?r{w2d|NFKm%%-_9sXeB>59T21hVwFmo2KNj$tb8W1}G~Sx*!hXf2NRQy@ z;GyZTw>H*!*&}RTk3J7q)EG{Ihf=wiVq*;>3)_i2?f+HOCQgBeQaFdKwU1)4FRXXm z>7%HVoB|J}phY&;u;;M7+;}EMQBOGq9!f!rY-Co3L17~mm4$Z;cqo+*DR_i!O`}G) z6jgy!P^vxkWB(h#e$tNx99cHjFlw+}$x+r`FzlnnydLn-^a4y#Eq&E}2%EOtY&Doa z0S~1LA|=MXRiCG$6t$RB;Gt9@q{LVh4fI{0sN~S)*kHO=4LDS6*I7bhf=V5*;vCYg6-{^^}&j&$|>+rsu)w$@m}_9Ha5s2%a2pw zp%i?4NF6(uz8~+Ps6m_p52fHk*lI-z-*fw|qE>PWJd}d9$i^C0SJ(~}ZFNymhd2cu zN|j=YS|tK~9t>0z{PH!}z(c9hOi}CnyuSAD6osD!W98tXR2igTL}2^8ug48VRpO^2 z@KCBOQ*5kZrop!NW5KqHYRf6`P^uhLY^-6X!S*@m2>Xo&V!VcM3OtmuWr~e;Y4!-) znYU2}MQ!91cqqk|enyFTc=3pxN!C+Nfk(^F&4wtqH6wr`XU_^)k7%jGjIHAY!@iu! z2Npauot>^&x>)Dq^4}k-sOFpk52Y$0C03H3!!pfOR4S*yL#fJ0iSv7W)8=e2siKvDZR1s+OOMGB57*y?7UFho(0IRzd{Rbz^c^#Intum)|ocf1Sx zAKwb|6AOAs&sS#-b%q_VGLcm*+EtlT;GtPHkjl(!KRuvzS4DYp3OtmmiInL1Pv=Wa zQWShW1UB$c%8n^&4PQM0e!INb!$F(^52b1m>h}HRtPz4*%qj3N3O>?d8ym-du&Rv| zw2OsUT?{DVs8Ob#I_UYp9>Eu1BjAbVHucm+k24E|Q7q7Rc}~3tt_p3e;p2rcUYG4c z*~Js2n$}YvJ#d8r!#*y^nau=qPXqM8@eU=Y>MS~<_cTNg3&48H*0?xb@3BYEUiJuA zZ|`=eutmZ=s}XvRvBzxe-@IL2+0-`oG)52GQ9RB&7JuiX_cTFI1bYO!VTHHz^&SWG zz}JW2s$%BHQ;~X4Q}pzLNA_?2@8;9=o@VHo!ychsJx|+K(0dH%VG99z{v-_!)O#G! z19iYYXJ0>yRSC~b$IA&l{1CM&=~9gy7v>&k^t5D;Fdu8yJ32-0aY0WkJc4Jv=MTNd z6+Q4vC}CCVxqZwwy~hnba88H4D7esJf!^be9{55E%)^LnyN2sM9_WFuxk^SbLjY)Y|X2kI%r zo_+7@Xkko!(F5}ow!Q7DZq(P~$4a#84cLp2>cmi<1TefoM@pa=Q}_PN3Az!Q28%q|=2O3VOrV_>Uv zY;eGB+Rv@f1Ltli*=>K`!m-mDJ+RN-C=fX>H*Yy{8lL{K&X-x84(s9?|wzr#o2apU&uky@EAiU%899_4S0H2NJ<^ z#=m(y2*cfiI&}WzYJS{lY3X-=9SEjAL>R_N@I#hbDSY5_;fT0*;?`o|V{v zYhF(>dSI@yIIGQjqxS1P>~LcHJb*odr`+oo{(4U;dZx3s+p=eks&uz7$Jlbr>VYqL z!`d-={AhL>H{YKg=o!FdIPYv4cK?mu!spSRdtCGfK63t@rdn5Brus&gbFPW7vc;-{-#QfmIrguYIkvS~wTeFe_h%q_;7g>iCa&mlfE`Tc`#cCe@Rebh ztAW*yvWA*_2BQbgO$FF9cf*4Vde0E_Okp0Vr$qjN7RGBRdfj6)Cn zYGfGu)de#m3W>yT>(f8?h^q%Rg zgtd$90<4)2hdHg%duE_Vw5v|fxNyA(W~u6*ft4c4={>WE$M4u?3v+%p@fgAivO~zc zf99Yk7kh-Qh1DrGG0i=5S&5A`oDnjze{m~g=N8~tKGn2yu->x_Julc}7WOZt z-NdVU54*fz{qvSRLOoel^jfF)tUwR^A&cDXS1z3xG5*BL;rH`vr< zSz_D^7F*L;?^%r=_+u@w&tJQG9o2i*phsjKx!K?!y=N_YO0q}TPFE?)y1{&ZSW`{* zXTnaSzuvPRJ#Zd??enREYe=0S z#c#c5H}SaNYVb_&VclV}&z8?|d(i{GkhL&-=5RB*iN2nF=qbw{VU%)N_d2Kd>_-ob z19)7Q?|7j196%5JQr{BnS*@r)clDk$^e_u<1ttWraH!Grn*SjC*~S{~>1Aclc8B|< z=soQ4W}e0D5%y_xwDVNG=P-Kau}4^+%a(8{s`ng0PagINTe;Nwh4h}Iti;9|eknEV z&;7ODo_fzQ^uSpavO4<=d9L>yC!QZQU$Kc`-u4sdfz<=%;*r+jWA&bs=z(9&4{Ptf z<)1B#=_&Mhu*dZ5-v{HMdir`!qX)(cwmBo)SJr#Zuo4?<7kFg<%KjeoTJK>?3G=|0 zxC^jnG4F0|(RRkXWl;-(38L(S)5g`KgZb= zF!x+UPjl}1?6|+2<~E&Um(a6_JwjIG%?^FFde{$EhhPYCE6q~aH|N5l63rA7iF=sM z%##qB*p*AdlMrX-f$s~Oc;M+BnGSo+zxQk6iAXdW`H$>>P&5Amq=|=p9~i$btV!Sr zNsf=E6x-qC_!yyq2R8QmMdhX`@GB?8rYX7MkmH-Cz^_>lo2JyzDGoXXzCbTFjf&PO zy}42wTMF*!(gXXP#J>F=7opX1QF_)950s|ql*c;dn@-8h&TiT!`lql?sjO2RbxM1k z601`N>XfNm=_%W_fGf?UvWY7Osa)Vn1F1aWN<*n+&Z4!dsZ>gE#Yrknxe_Cl_FOSa zC5bDJQW?jUSgFk7$_A-y<;r@goaM?Isl4IJN~vUp#g}cXrNVxr1a1*hslb(WQfa`I zRZ{WbN)xGc=E?}E^yW%qsZ8d|aH*{0%0{Ui;L1NzxyqHbQhCaiMN;|Bl_gTi4wp@A zTOk!&t}K;G6Rs?iN(Zhimr5d6T%|ITD*;m3#g#y*T;s}gsl4FIOsQnauI=G$sZ`*~ zEU7qgWsX$XZ$`pxlvH|f#Z4-cxzbiD8@SR=DyO(ILn?Q;GEFL9xH3j61#)QV{!+2y zN++qb;YvrT^yZ3>R3>r7S1Q}M5+s$ITZFHzqvA1Dg|Xg+wB~7PX)+x_)N;-IX!?sOw1aonvg;dIOrL|NHTv5HzLZ?LPl)gG; zvQC+&Q`YH}9XjQ(PPwd89_f@%Iwd2!%dKtV+PI)jsiadH=oEjQ60K8)a;2s0)p=a; zl*$gScuVCxS9(k38CUv9M60|46=sZ`*~T&XnS%3`VbaV1PD(OgmEK3J#B z(J2RX%44q7Wi`WVaQ4SuxZ)s{QgCyJZ6l@9fGb0!;>DFlQZaI6zEp;C<&;!rawSzN zYq&C4D!aIHS}G^G5+#+JT7rMpymaK%e1 z|iK%2ckzNo6Tl7D{C+SNcok3|G!cq6EDYb*T2s5UUBwV@9iv41|& zQ-?hZB#P*I=@Eiekf3UbvFI!m(JZSFq11&Q>&()7u>WIvU1-I>>>nsv+o2B~xCfQG zus^U#PaV63d0{aJw)>0UqF{Vl#ktIE{=RE~gA3O={ zW~Vp%zg9D}G>rWN1#7MYHLo;P>Wf{Jo_Zpyx1j2acJ&d8n7me-g(9k9*ET#$j{97p z)E1`2QV}x&_EOtJ*k|aU!R-IqoM%t)Xafa3n9gphqX!kN7}_O0m<}T&6&&`9rV0-7 zBceb{;du9A|Ht%(fSqRlK*20rH?Ep0wIM8kQLtkft!ng8-)Fqc6!p!itJ~`@yom1# zFxlz=Kc}F_sz!pMu1Ly;J!|`6%uGd{;}m*G7VMMy48!6T*FW}@S+_Zb9+Gv9WS#F? zq?w}LaSA;o>$;@a6RYy4+m&x7vuuik#{T#c`^Ua%V$!Y~py2n&pj~?x*6g9ElAJ;h z$+{^i_5`yGGOHn{&_l9rNeZ%VtUqg~s9;W^hh)Lps`~J}{oz~lU_D z)D}*mhh)7$O3cHG-E1!@>IA3IL$cnItilia9aGdjPN9cny+bNDJhFdlT|U23)K^ZS zhh)7cSq(x;Wm8nHQml||=pk7jn5unF2C_z%`7%LK6*z?+lJyZOF*gEVzt5v62Tq}f zWPL))a=Th`3Oyw2Gs!BH)+9k?b>$R#NY)pmGP6h6V9rO#xiN@S=pk8OnODt?yqj_@ zRMZSkp@(FBlN4mZ`KyV{TFWW)kgV^Lf}U@(a!5f%o#qsJNY)ReOxra=X1(MTdPvq! zl6B|%gJ4DFD$NSnh8~jji>Y)yY%H^Cl?I0WsXX?No|k`vBG1dEM|ZobsOF_vA=}VH zvi>lYW(}8F38jHyf2@N2qght$I!R@{+dQDAq9&IHhHc;>S=LC2b)(3XzK0gctSzOH zu|f~&!*nDoynW{JiaN_F^pGqYnFXVq?NH|Qih9Z^^pLFdBrB8K-8eeNK6~`&`kgP07LAzjcDHb$vh0GexDfE!6tR&0u{N`gtE$0+^NLDtIbw9~&;Zm7( zgj47tS=mVzT=y#KF{jW&vT`5=eF$^o(h~dnipo$H+R8rt3LcV`lVn*%28~cu1x}%d zWaUCi%ngTue!~>y&MEYetlT7PP}JuQii+YCdPr6tq{Q4v%Mj$cO!nbOPN9cn}3amTDC zimJjX^pLEAB&+44d7l;4f>Y=rS%oA8dy^75q|I{KhkZDO9+Fj9QZ|h8%HQ>mqGoXl zJtV6LQiZi#MB zdPr7rl4YHHQi`H#atb{ps{~S}=gLts%ac>+Az39!*1>B9=PAm_DfE!6QY5QZ{}Bz` zWYz#qp@(FZCRq=v_kN|Q#hgM9$tr`CSP$WKijT}X%qjGctg<9)?3X)t6!nl(=pk9< zBn4vw*ET^iD_wbQywF3kY$XNru>8lBHx*TbQ|KXC<&hHO1+SMo%dB>sLJ!HRK(a)EiErhh)_zS+8;yf3K+A6}9m~56PJ5JtV6>$?9rsfYR; zRFng!&_lA|ofz$ES@fZc%xcXk^pLEkl7c?$vgNh6qLMg;9+K4zDba_Mof7{<%B=C6 zLJ!F@kgP>lYxh&sN=~7NWH}-w){W0EYa}QtjZ^3$SxzL&?cl{1iu#vR=pk9ovR%*{ zeh$W?iu%ea^pGqUl684$sdkFWS6Q1I=pk9INQvvHR@=^}os@l8gHz}sS#Bij)6EmD z73Iz;^pGrfNr|};Dzkz)g&vaSAt~q$m!T8qE2<}_&_l93b?rJKvnFv0JtWJEWF35e z|Cgdxa|%5q%Nr>%55v!mIi4u94sr@TB+G|pjrrY9QU7uZJtWIlwhMY=@0vmH6!n=? z=pk8tBx~1^)VqqxQ$?E_=pkADvR#l>Gh(F)RgF{VAz1+=t8U#~-Bp%5r_e*Pnv-@- z&KA&LQK6hd56KE7SzgbA*D0zmr_e*PS|F8KYqk|!v+a}PHG@;=Az3X+R#jt*U5Z-I zDfE!6R+54^IHw$wS%*1=9+K5sQqc3+cAi+Rs0W-v56NmHDUo$tX5p`0U^040R$EDl zEJc;B3N^8J;J`z&+DQt^pXvVtTfvJT6vR8FCX zWOa}fWF1_VwUMGGaSA;otD~eK%YE97FGpq8T27&dWOb4hWWn4})Co?ZhhzmKCC(|n zJFhfW)MHMehh%joS+5rl{;a6<)nKo!@G}#1yh4zIbsqN6*RbTaqRMg#JtQlXWVNg8 z60Il$r_e*%6^4|!?oH=;$zM^OIE5aP6;86scOO_oQGGat9+G7wSx3jGPp7C^oI(%D ziXd5mSF#pW)OJpxhh#-c3i=r4#z8qZu5b!HBr8f%(DU#*MNywQg&vX>jg*)h@H$0N z1*$_n`_szcAz58W*2u12RTNd9Q|KXCU6B%VqqNJH<%(*Ehh(K7C0;xDmz{rTugsdvDfE!6RFZY)T%jh4TFoi+kgV=9 z3yu`~_F1|sDveX83OyvNzs!P`!#%xCa&C;`6naS30Fo7dqQ1ML=5q=?Bx@j2V$Q?8$`&$f6Q|Ha zvIdc?@3woNDC#_?&_l8YldQpEId`{|S+6;T9+EYLWVK0rI7U&q?6kRo9+EW_DRF$k z`+A--t0t$=L$ZdEtbJz}u2fVYr_e*Ph9d=Y9=2O6mPdHYtYl81hh&W)SqEl@!&MQ|KXC^H)&!E3v@No$qGoXlJtS+Q%wlm?Wfmtq?=9!XE>59`WKAMjW1je~Qq)aO zp@(EmMoL_7H0V5Yj-tME3Oyui3dy>WF0O&1iq(d_wz5JG$(l;C2HiO9si-ELLJ!HB zMzS^r1+`aHM^2%KWKBm(j92FzMe`}DAE(emvSyI1ifWX&R37fW5vr>NVULJ!HBjg(k>VLjX|vwm<2JtS)m$?7b)Hk`Az5okmTQg4){1(}DfE!6wMdCIYT2qw0~Pgy zQ|KXC>qyq!{kKvTmAf9>X||zu2XHEE2=%G&_l8| zN(!>zvj-z();La~hh+UDDd>6l?3|+3aSA;oYZFpp-GF0xh|D_8DfE!6%_M8z#yvR{ z^^{ZSAz53Hg1G@3^kE~Jm9D;~qK9N{C0T6RlPf;&8g&vZ%mt-ZsTo|FKObxVA zMi0r_hm<&$zwMb)Qc>kNg&vZ%pJdft__>>+nsEv}Bj=rpdda1iqONfYJtXTWQexfs_W5|jt}^Qlr_e*Pj*+ZIgKz9mRF;O?+&~Y>I*ych zO|-fHrYedm%PI7btP>>bMO2BKigMr-dPvqu*)HgLzv!`6ifYR#^pLDmB;Q8l64j-u^z&Gwj?=Thd6~El68(` zjKGw&-N(Fj#KC%Sr?IlInSP0U5hIHvAfJ_ z%_;PdtV<+oO-z%%it5EF^pLE}G7IL$o0CN=D{3yM&_lAWkgV{TOKK@9jZ^3$Syzz~ zbN+m{q7xPMgj47tS=UI`+lCzz6_ve_*7N8gS=ULs0ye()QdBKYp@(GMAX(d7XFX9= zYfhnuWZgtctn-FpT@NX$H>c1;vTl*ALaq8oDry0z&_lBRm08eocrV*a&W*#ILJ!Hh zO|rfxv@WfvhnzwW$-0A7VU`1P!?)<{BZ^Ab81mU~>;n(Ux=XTlHe9$)QDr%W9+Gtr zDba@oXIalwloO}WL$dCZtf2R2XDBL^Q|KXC50Db)6pw?ahbG8A9K*fK+ zdx~1hDfE!6N0Nfxf^+3inRS#?=pk8;B?UbX?*%C80jJPIvYto^vfy)iDKhIfr_e*P zo=OU`;2x}^iZ_9p*!RD{L$aPB1$_wAoF9!N6=lyU^pLFQB&&Fv9TOGRmQ&~1 zbK}gjPKxTzDfE!6mn5s&d}CilP2&`LNY*Qv1?}$Qx~{_@*@s&=g&vainq)ma*lwVr z&TtAnB;SznM6<8{X__Jg8sa0)#n>nq7Ro8I-1 zqO6+2UbEk$4IYy94Jk2RO(xzl$*RC9^pLFYB*O3y6I?XBc zkgPvQ!TAfezCrK$50qK2IfWjQ1-}edeV?d%mG!$7mAjc%7kWsRHBvBMu$_n*KPpaU z)#4O-NLD(MwfxHGD~j^u6naRO4N_tr8pq7ot*FkNLJ!G;zbB&F6%aV{f}(nI3Oyt% zgKQU!vUih(@rs(nDfE!6j3g`j*O#vqwVG4tAz7J7yN=)T{;H@$oI(%D%1pA_Rhhp; zQU7uZJtPbMCaw0}Kz+MDa|%5qD=W#`ey@8om6gi?BhP+MHh4%@Hc3G_tcMHb+^A## zjeUkpqfCAmL3T;O9`@+*%TG~`24L9V1kh#WkQ9_J*th*%f0@y0* z0~OVfQ|KXC1(1Sc88*0o7%j6}a0)#nt02jW-(2N^qGCCP9+FiEDY5oWPp$>5JI>0IPkgTF4t7*-5=@oUCQ|KXC@Yjpf z_s#7aFKDi)Kb%4j$tq5=_K#YAPEjSDwDCX>$tr=An1>e*FWaLi2Tq}fWR)aY4_4GH ztEdi~LJ!F*g%o@Q4UVs(X~)A9)tgi3Az7tKR>qkg4HY$uQ|KXCWsnl>@^kKKlC^_V z=pk8UN!I2(i|(qd>zqOl$towapqJtPd>uItzi|pZB+Hg$t<3kZo1*eMLrv`OfPsf( zl}AdE#B~(B=X+jez2_8qNLCG!Wxv9(S5X;UpoiFB z*#Hm8s)-b=^Dtg3HkVspPi7V36naRO9mz`k+Wdo}YH|uaB&(Lpf_?G-J<0d1%yQ!t zdPr7nlC{pK@H9nr;uLyFRvk$}R;x8FO4XNHDV#zN$%4OOq2_$)Pq9gg8p$d2kgR&L zT{bN1sQboTikibI^pLFjBG;2j|

^HRs*EO8g;5vqZ5ic!YTBStcE1Zux7rq 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

  • 2jQFI8}FP?;hjB{m~5JtekZe1?p4Y!@oL zTJ}iKXp)welBT1P@v#H+Z|&lf;~dew<1?aD(tGuhOPZJ-AKx!QtYvhs^o$-EHG>kW z2a5lj);}X5F?v9Ha%x&aaz-x^h)>Rl?%5+f9(f3-q$Ok|#HZ{3v6dV^Q2&D8VQTzG zw)o^8Jrm=j#rK@{6Dy)s5YWH%Pv*a;izV%q*rT_}BQ`O&IPg9 zl;n(r-u+Yhr$?u!_K1zwt?`3W#p>(d)8fR|D2>2zuti0+k^lBA<);$PMYKl+Dt<}m)7IwPB~a?k1BRxlpP{Zpf3d+N*(Hw$@-F`?u?>jU)wYcMXYM?$jZ z28yX>T6Fw1x<^J*O1i0|@jGda)k_!iB-S(^==bQf9?88;nNl;-L?4)vNLhSJqIORe z8;Jf5*V?qUawKDWMvIO#{})1|L9;?+H>Z1IH#$vg`ELx3RZ2~ZPlYYm8gQB+FlIwc zYuP{98i|966Aj-y+_Oh)KhyRFYnLEqW~_F>f1Q|+Y|1Cr!93o*62wB$Xwq&XAvsn| zK^BUO#}Ks-?2!h8o6!eSi(O}8bV54r8=~>wg!C4>2+^6a$B2vOI@mu%<98w3HNaZh z#gVc}MEe^cU>m?bNfVZ0loFD~W^WUZ?IAX{M7x&s*go-b{lz9FC^@sK8=M1T&qHgg zrLld)e2*48d6SxA{gZi=Ix-q^=*5?Yv{#GnB|ZmCd7zVF+KH`HjBC271?FOE53vI= z%M+3Zr1Xo|bHk*^eX5!>rnv4o*{D}cE>gM}(!_XNBi&}+M?@!y&$_gP9*GI&iA!C; zc1{$s?3G~Lg>^JGnr1UjhzzkWNyI6Yl$tTvNka(}lEnvrX+MzGKUsHyqet8T82IQ! z=-Gh@8GWMhaI0-(lXguaJ2Z)I8_~LTlg5s)Hf=l8|0&fgnVunbL-2{*v>hEAq=of~ z7aw}jVn|~9i~SlbkqC$ntCW5T@eaTK$pgjqwTD&G__bE^C!0zV{KN@^yzNp%uRNf(*b~80%wsml{{Lo!YXW)^MeU1Wofm- z?2yCC@N6F#%Gr^e^U&aNA06iT(NYEJrLto)Z6?~(gLZVL%|x5})Q--ynP^il z+tHaeTf0mi1JUPGCLOH~Uu375CYddrdAn1$+481-v$Q*PoTZ(1!ls_Hv^#a3rJZqCwX&}NhwYi5)gLSpx z5HynsV{XbEGoAlf`%Wh?i=5WdUPk?DT4#HiQxDk7D4VH2>}8bAG->T+lB9p)97YKeH_VDWNQut;0M3s#pF~LRlMlOE3X=D_ZzB_NXv$+8f~{~)kvgeBUOz=X3|Kc z>4V6*e==z#k{?%DdNz|ryCG4ReeA}>Xd_EYzZ0elioBmOz#}G4i;S?wGNhy zQgYLvFtu}>^rk^!dgnOlO`Xj2&T-P4I+^L6D&TU#pv)U=_w900+X;sa+O|!+Ub_!E&(}rqRJB6*?CvR3*=b8%J%jLZc zdq_1p^**}~B3aWY@MfnT<8J#pV4vtEURn zkeRkM)j&2j4MdpsW1O&QAi}gSyN=W7k5Ac~+=w zWt>V@g4*RNa}ks*QLifWC8|3272oQ`p?Nwte%{WDiDI z7u{K4O#%12)e{s}nzdO$=cg>JxQ)V^#PU3bHG{R;iaS5HVa;HpuqKfsV1B^En#E3H zO=G^q%bo?XCd*uCO^K5QpKP<{Ftyl2wl@NZq9!W_QS%chR!66Hn#rck+DYNGO*<(l zhiO}NQaEkRP72!RSxc)^w_4hrI@Qwd)TNeo zrw+BW%Z1P6c_F#*nYBvT`c#pmoWg2dof_0iIyDdx=;zcxgiQkx)iWb(8stit9)*(2 zZ;n{USUx0W9b6d>4vr2Bi4JJgETm=Y#w{C#M}&riwr$&_bz^$gD!NtsmQfL5q3xnV z97-A%(jp?FO;~8lrXj(8Vd3e))q`t@r*g$xuizTuUq+{-4c6k&kR~E+v&Nw?GXlN7~64ttDi?EihnrRr1b&^BaGhXy`S9J8Cq@<7l LOX+1P4$uD&tVAcc literal 0 HcmV?d00001 diff --git a/bsnes/thrift/libevent/lib/event_core_32.lib b/bsnes/thrift/libevent/lib/event_core_32.lib new file mode 100644 index 0000000000000000000000000000000000000000..5f68c94728d15186cf24f1310d02941eeea2f7cf GIT binary patch literal 311156 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

    To do so, you instantiate the processor and then register additional + * processors with it, as shown in the following example:

    + * + *
    + * std::shared_ptr processor(new TMultiplexedProcessor()); + * + * processor->registerProcessor( + * "Calculator", + * std::shared_ptr( new CalculatorProcessor( + * std::shared_ptr( new CalculatorHandler())))); + * + * processor->registerProcessor( + * "WeatherReport", + * std::shared_ptr( new WeatherReportProcessor( + * std::shared_ptr( new WeatherReportHandler())))); + * + * std::shared_ptr transport(new TServerSocket(9090)); + * TSimpleServer server(processor, transport); + * + * server.serve(); + *
    + */ +class TMultiplexedProcessor : public TProcessor { +public: + typedef std::map > services_t; + + /** + * 'Register' a service with this TMultiplexedProcessor. This + * allows us to broker requests to individual services by using the service + * name to select them at request time. + * + * \param [in] serviceName Name of a service, has to be identical to the name + * declared in the Thrift IDL, e.g. "WeatherReport". + * \param [in] processor Implementation of a service, usually referred to + * as "handlers", e.g. WeatherReportHandler, + * implementing WeatherReportIf interface. + */ + void registerProcessor(const std::string& serviceName, std::shared_ptr processor) { + services[serviceName] = processor; + } + + /** + * Register a service to be called to process queries without service name + * \param [in] processor Implementation of a service. + */ + void registerDefault(const std::shared_ptr& processor) { + defaultProcessor = processor; + } + + /** + * Chew up invalid input and return an exception to throw. + */ + TException protocol_error(std::shared_ptr in, + std::shared_ptr out, + const std::string& name, + int32_t seqid, + const std::string& msg) const { + in->skip(::apache::thrift::protocol::T_STRUCT); + in->readMessageEnd(); + in->getTransport()->readEnd(); + ::apache::thrift::TApplicationException + x(::apache::thrift::TApplicationException::PROTOCOL_ERROR, + "TMultiplexedProcessor: " + msg); + out->writeMessageBegin(name, ::apache::thrift::protocol::T_EXCEPTION, seqid); + x.write(out.get()); + out->writeMessageEnd(); + out->getTransport()->writeEnd(); + out->getTransport()->flush(); + return TException(msg); +} + + /** + * This implementation of process performs the following steps: + * + *
      + *
    1. Read the beginning of the message.
    2. + *
    3. Extract the service name from the message.
    4. + *
    5. Using the service name to locate the appropriate processor.
    6. + *
    7. Dispatch to the processor, with a decorated instance of TProtocol + * that allows readMessageBegin() to return the original TMessage.
    8. + *
    + * + * \throws TException If the message type is not T_CALL or T_ONEWAY, if + * the service name was not found in the message, or if the service + * name was not found in the service map. + */ + bool process(std::shared_ptr in, + std::shared_ptr out, + void* connectionContext) override { + std::string name; + protocol::TMessageType type; + int32_t seqid; + + // Use the actual underlying protocol (e.g. TBinaryProtocol) to read the + // message header. This pulls the message "off the wire", which we'll + // deal with at the end of this method. + in->readMessageBegin(name, type, seqid); + + if (type != protocol::T_CALL && type != protocol::T_ONEWAY) { + // Unexpected message type. + throw protocol_error(in, out, name, seqid, "Unexpected message type"); + } + + // Extract the service name + boost::tokenizer > tok(name, boost::char_separator(":")); + + std::vector tokens; + std::copy(tok.begin(), tok.end(), std::back_inserter(tokens)); + + // A valid message should consist of two tokens: the service + // name and the name of the method to call. + if (tokens.size() == 2) { + // Search for a processor associated with this service name. + auto it = services.find(tokens[0]); + + if (it != services.end()) { + std::shared_ptr processor = it->second; + // Let the processor registered for this service name + // process the message. + return processor + ->process(std::shared_ptr( + new protocol::StoredMessageProtocol(in, tokens[1], type, seqid)), + out, + connectionContext); + } else { + // Unknown service. + throw protocol_error(in, out, name, seqid, + "Unknown service: " + tokens[0] + + ". Did you forget to call registerProcessor()?"); + } + } else if (tokens.size() == 1) { + if (defaultProcessor) { + // non-multiplexed client forwards to default processor + return defaultProcessor + ->process(std::shared_ptr( + new protocol::StoredMessageProtocol(in, tokens[0], type, seqid)), + out, + connectionContext); + } else { + throw protocol_error(in, out, name, seqid, + "Non-multiplexed client request dropped. " + "Did you forget to call defaultProcessor()?"); + } + } else { + throw protocol_error(in, out, name, seqid, + "Wrong number of tokens."); + } + } + +private: + /** Map of service processor objects, indexed by service names. */ + services_t services; + + //! If a non-multi client requests something, it goes to the + //! default processor (if one is defined) for backwards compatibility. + std::shared_ptr defaultProcessor; +}; +} +} + +#endif // THRIFT_TMULTIPLEXEDPROCESSOR_H_ diff --git a/bsnes/thrift/thrift/protocol/TBase64Utils.h b/bsnes/thrift/thrift/protocol/TBase64Utils.h new file mode 100644 index 00000000..1ea67440 --- /dev/null +++ b/bsnes/thrift/thrift/protocol/TBase64Utils.h @@ -0,0 +1,45 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +#ifndef _THRIFT_PROTOCOL_TBASE64UTILS_H_ +#define _THRIFT_PROTOCOL_TBASE64UTILS_H_ + +#include +#include + +namespace apache { +namespace thrift { +namespace protocol { + +// in must be at least len bytes +// len must be 1, 2, or 3 +// buf must be a buffer of at least 4 bytes and may not overlap in +// the data is not padded with '='; the caller can do this if desired +void base64_encode(const uint8_t* in, uint32_t len, uint8_t* buf); + +// buf must be a buffer of at least 4 bytes and contain base64 encoded values +// buf will be changed to contain output bytes +// len is number of bytes to consume from input (must be 2, 3, or 4) +// no '=' padding should be included in the input +void base64_decode(uint8_t* buf, uint32_t len); +} +} +} // apache::thrift::protocol + +#endif // #define _THRIFT_PROTOCOL_TBASE64UTILS_H_ diff --git a/bsnes/thrift/thrift/protocol/TBinaryProtocol.h b/bsnes/thrift/thrift/protocol/TBinaryProtocol.h new file mode 100644 index 00000000..b4314401 --- /dev/null +++ b/bsnes/thrift/thrift/protocol/TBinaryProtocol.h @@ -0,0 +1,268 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +#ifndef _THRIFT_PROTOCOL_TBINARYPROTOCOL_H_ +#define _THRIFT_PROTOCOL_TBINARYPROTOCOL_H_ 1 + +#include +#include + +#include + +namespace apache { +namespace thrift { +namespace protocol { + +/** + * The default binary protocol for thrift. Writes all data in a very basic + * binary format, essentially just spitting out the raw bytes. + * + */ +template +class TBinaryProtocolT : public TVirtualProtocol > { +public: + static const int32_t VERSION_MASK = ((int32_t)0xffff0000); + static const int32_t VERSION_1 = ((int32_t)0x80010000); + // VERSION_2 (0x80020000) was taken by TDenseProtocol (which has since been removed) + + TBinaryProtocolT(std::shared_ptr trans) + : TVirtualProtocol >(trans), + trans_(trans.get()), + string_limit_(0), + container_limit_(0), + strict_read_(false), + strict_write_(true) {} + + TBinaryProtocolT(std::shared_ptr trans, + int32_t string_limit, + int32_t container_limit, + bool strict_read, + bool strict_write) + : TVirtualProtocol >(trans), + trans_(trans.get()), + string_limit_(string_limit), + container_limit_(container_limit), + strict_read_(strict_read), + strict_write_(strict_write) {} + + void setStringSizeLimit(int32_t string_limit) { string_limit_ = string_limit; } + + void setContainerSizeLimit(int32_t container_limit) { container_limit_ = container_limit; } + + void setStrict(bool strict_read, bool strict_write) { + strict_read_ = strict_read; + strict_write_ = strict_write; + } + + /** + * Writing functions. + */ + + /*ol*/ uint32_t writeMessageBegin(const std::string& name, + const TMessageType messageType, + const int32_t seqid); + + /*ol*/ uint32_t writeMessageEnd(); + + inline uint32_t writeStructBegin(const char* name); + + inline uint32_t writeStructEnd(); + + inline uint32_t writeFieldBegin(const char* name, const TType fieldType, const int16_t fieldId); + + inline uint32_t writeFieldEnd(); + + inline uint32_t writeFieldStop(); + + inline uint32_t writeMapBegin(const TType keyType, const TType valType, const uint32_t size); + + inline uint32_t writeMapEnd(); + + inline uint32_t writeListBegin(const TType elemType, const uint32_t size); + + inline uint32_t writeListEnd(); + + inline uint32_t writeSetBegin(const TType elemType, const uint32_t size); + + inline uint32_t writeSetEnd(); + + inline uint32_t writeBool(const bool value); + + inline uint32_t writeByte(const int8_t byte); + + inline uint32_t writeI16(const int16_t i16); + + inline uint32_t writeI32(const int32_t i32); + + inline uint32_t writeI64(const int64_t i64); + + inline uint32_t writeDouble(const double dub); + + template + inline uint32_t writeString(const StrType& str); + + inline uint32_t writeBinary(const std::string& str); + + /** + * Reading functions + */ + + /*ol*/ uint32_t readMessageBegin(std::string& name, TMessageType& messageType, int32_t& seqid); + + /*ol*/ uint32_t readMessageEnd(); + + inline uint32_t readStructBegin(std::string& name); + + inline uint32_t readStructEnd(); + + inline uint32_t readFieldBegin(std::string& name, TType& fieldType, int16_t& fieldId); + + inline uint32_t readFieldEnd(); + + inline uint32_t readMapBegin(TType& keyType, TType& valType, uint32_t& size); + + inline uint32_t readMapEnd(); + + inline uint32_t readListBegin(TType& elemType, uint32_t& size); + + inline uint32_t readListEnd(); + + inline uint32_t readSetBegin(TType& elemType, uint32_t& size); + + inline uint32_t readSetEnd(); + + inline uint32_t readBool(bool& value); + // Provide the default readBool() implementation for std::vector + using TVirtualProtocol >::readBool; + + inline uint32_t readByte(int8_t& byte); + + inline uint32_t readI16(int16_t& i16); + + inline uint32_t readI32(int32_t& i32); + + inline uint32_t readI64(int64_t& i64); + + inline uint32_t readDouble(double& dub); + + template + inline uint32_t readString(StrType& str); + + inline uint32_t readBinary(std::string& str); + + int getMinSerializedSize(TType type); + + void checkReadBytesAvailable(TSet& set) + { + trans_->checkReadBytesAvailable(set.size_ * getMinSerializedSize(set.elemType_)); + } + + void checkReadBytesAvailable(TList& list) + { + trans_->checkReadBytesAvailable(list.size_ * getMinSerializedSize(list.elemType_)); + } + + void checkReadBytesAvailable(TMap& map) + { + int elmSize = getMinSerializedSize(map.keyType_) + getMinSerializedSize(map.valueType_); + trans_->checkReadBytesAvailable(map.size_ * elmSize); + } + +protected: + template + uint32_t readStringBody(StrType& str, int32_t sz); + + Transport_* trans_; + + int32_t string_limit_; + int32_t container_limit_; + + // Enforce presence of version identifier + bool strict_read_; + bool strict_write_; +}; + +typedef TBinaryProtocolT TBinaryProtocol; +typedef TBinaryProtocolT TLEBinaryProtocol; + +/** + * Constructs binary protocol handlers + */ +template +class TBinaryProtocolFactoryT : public TProtocolFactory { +public: + TBinaryProtocolFactoryT() + : string_limit_(0), container_limit_(0), strict_read_(false), strict_write_(true) {} + + TBinaryProtocolFactoryT(int32_t string_limit, + int32_t container_limit, + bool strict_read, + bool strict_write) + : string_limit_(string_limit), + container_limit_(container_limit), + strict_read_(strict_read), + strict_write_(strict_write) {} + + ~TBinaryProtocolFactoryT() override = default; + + void setStringSizeLimit(int32_t string_limit) { string_limit_ = string_limit; } + + void setContainerSizeLimit(int32_t container_limit) { container_limit_ = container_limit; } + + void setStrict(bool strict_read, bool strict_write) { + strict_read_ = strict_read; + strict_write_ = strict_write; + } + + std::shared_ptr getProtocol(std::shared_ptr trans) override { + std::shared_ptr specific_trans = std::dynamic_pointer_cast(trans); + TProtocol* prot; + if (specific_trans) { + prot = new TBinaryProtocolT(specific_trans, + string_limit_, + container_limit_, + strict_read_, + strict_write_); + } else { + prot = new TBinaryProtocolT(trans, + string_limit_, + container_limit_, + strict_read_, + strict_write_); + } + + return std::shared_ptr(prot); + } + +private: + int32_t string_limit_; + int32_t container_limit_; + bool strict_read_; + bool strict_write_; +}; + +typedef TBinaryProtocolFactoryT TBinaryProtocolFactory; +typedef TBinaryProtocolFactoryT TLEBinaryProtocolFactory; +} +} +} // apache::thrift::protocol + +#include + +#endif // #ifndef _THRIFT_PROTOCOL_TBINARYPROTOCOL_H_ diff --git a/bsnes/thrift/thrift/protocol/TBinaryProtocol.tcc b/bsnes/thrift/thrift/protocol/TBinaryProtocol.tcc new file mode 100644 index 00000000..755f2438 --- /dev/null +++ b/bsnes/thrift/thrift/protocol/TBinaryProtocol.tcc @@ -0,0 +1,491 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +#ifndef _THRIFT_PROTOCOL_TBINARYPROTOCOL_TCC_ +#define _THRIFT_PROTOCOL_TBINARYPROTOCOL_TCC_ 1 + +#include +#include + +#include + +namespace apache { +namespace thrift { +namespace protocol { + +template +uint32_t TBinaryProtocolT::writeMessageBegin(const std::string& name, + const TMessageType messageType, + const int32_t seqid) { + if (this->strict_write_) { + int32_t version = (VERSION_1) | ((int32_t)messageType); + uint32_t wsize = 0; + wsize += writeI32(version); + wsize += writeString(name); + wsize += writeI32(seqid); + return wsize; + } else { + uint32_t wsize = 0; + wsize += writeString(name); + wsize += writeByte((int8_t)messageType); + wsize += writeI32(seqid); + return wsize; + } +} + +template +uint32_t TBinaryProtocolT::writeMessageEnd() { + return 0; +} + +template +uint32_t TBinaryProtocolT::writeStructBegin(const char* name) { + (void)name; + return 0; +} + +template +uint32_t TBinaryProtocolT::writeStructEnd() { + return 0; +} + +template +uint32_t TBinaryProtocolT::writeFieldBegin(const char* name, + const TType fieldType, + const int16_t fieldId) { + (void)name; + uint32_t wsize = 0; + wsize += writeByte((int8_t)fieldType); + wsize += writeI16(fieldId); + return wsize; +} + +template +uint32_t TBinaryProtocolT::writeFieldEnd() { + return 0; +} + +template +uint32_t TBinaryProtocolT::writeFieldStop() { + return writeByte((int8_t)T_STOP); +} + +template +uint32_t TBinaryProtocolT::writeMapBegin(const TType keyType, + const TType valType, + const uint32_t size) { + uint32_t wsize = 0; + wsize += writeByte((int8_t)keyType); + wsize += writeByte((int8_t)valType); + wsize += writeI32((int32_t)size); + return wsize; +} + +template +uint32_t TBinaryProtocolT::writeMapEnd() { + return 0; +} + +template +uint32_t TBinaryProtocolT::writeListBegin(const TType elemType, + const uint32_t size) { + uint32_t wsize = 0; + wsize += writeByte((int8_t)elemType); + wsize += writeI32((int32_t)size); + return wsize; +} + +template +uint32_t TBinaryProtocolT::writeListEnd() { + return 0; +} + +template +uint32_t TBinaryProtocolT::writeSetBegin(const TType elemType, + const uint32_t size) { + uint32_t wsize = 0; + wsize += writeByte((int8_t)elemType); + wsize += writeI32((int32_t)size); + return wsize; +} + +template +uint32_t TBinaryProtocolT::writeSetEnd() { + return 0; +} + +template +uint32_t TBinaryProtocolT::writeBool(const bool value) { + uint8_t tmp = value ? 1 : 0; + this->trans_->write(&tmp, 1); + return 1; +} + +template +uint32_t TBinaryProtocolT::writeByte(const int8_t byte) { + this->trans_->write((uint8_t*)&byte, 1); + return 1; +} + +template +uint32_t TBinaryProtocolT::writeI16(const int16_t i16) { + auto net = (int16_t)ByteOrder_::toWire16(i16); + this->trans_->write((uint8_t*)&net, 2); + return 2; +} + +template +uint32_t TBinaryProtocolT::writeI32(const int32_t i32) { + auto net = (int32_t)ByteOrder_::toWire32(i32); + this->trans_->write((uint8_t*)&net, 4); + return 4; +} + +template +uint32_t TBinaryProtocolT::writeI64(const int64_t i64) { + auto net = (int64_t)ByteOrder_::toWire64(i64); + this->trans_->write((uint8_t*)&net, 8); + return 8; +} + +template +uint32_t TBinaryProtocolT::writeDouble(const double dub) { + static_assert(sizeof(double) == sizeof(uint64_t), "sizeof(double) == sizeof(uint64_t)"); + static_assert(std::numeric_limits::is_iec559, "std::numeric_limits::is_iec559"); + + auto bits = bitwise_cast(dub); + bits = ByteOrder_::toWire64(bits); + this->trans_->write((uint8_t*)&bits, 8); + return 8; +} + +template +template +uint32_t TBinaryProtocolT::writeString(const StrType& str) { + if (str.size() > static_cast((std::numeric_limits::max)())) + throw TProtocolException(TProtocolException::SIZE_LIMIT); + auto size = static_cast(str.size()); + uint32_t result = writeI32((int32_t)size); + if (size > 0) { + this->trans_->write((uint8_t*)str.data(), size); + } + return result + size; +} + +template +uint32_t TBinaryProtocolT::writeBinary(const std::string& str) { + return TBinaryProtocolT::writeString(str); +} + +/** + * Reading functions + */ + +template +uint32_t TBinaryProtocolT::readMessageBegin(std::string& name, + TMessageType& messageType, + int32_t& seqid) { + uint32_t result = 0; + int32_t sz; + result += readI32(sz); + + if (sz < 0) { + // Check for correct version number + int32_t version = sz & VERSION_MASK; + if (version != VERSION_1) { + throw TProtocolException(TProtocolException::BAD_VERSION, "Bad version identifier"); + } + messageType = (TMessageType)(sz & 0x000000ff); + result += readString(name); + result += readI32(seqid); + } else { + if (this->strict_read_) { + throw TProtocolException(TProtocolException::BAD_VERSION, + "No version identifier... old protocol client in strict mode?"); + } else { + // Handle pre-versioned input + int8_t type; + result += readStringBody(name, sz); + result += readByte(type); + messageType = (TMessageType)type; + result += readI32(seqid); + } + } + return result; +} + +template +uint32_t TBinaryProtocolT::readMessageEnd() { + return 0; +} + +template +uint32_t TBinaryProtocolT::readStructBegin(std::string& name) { + name = ""; + return 0; +} + +template +uint32_t TBinaryProtocolT::readStructEnd() { + return 0; +} + +template +uint32_t TBinaryProtocolT::readFieldBegin(std::string& name, + TType& fieldType, + int16_t& fieldId) { + (void)name; + uint32_t result = 0; + int8_t type; + result += readByte(type); + fieldType = (TType)type; + if (fieldType == T_STOP) { + fieldId = 0; + return result; + } + result += readI16(fieldId); + return result; +} + +template +uint32_t TBinaryProtocolT::readFieldEnd() { + return 0; +} + +template +uint32_t TBinaryProtocolT::readMapBegin(TType& keyType, + TType& valType, + uint32_t& size) { + int8_t k, v; + uint32_t result = 0; + int32_t sizei; + result += readByte(k); + keyType = (TType)k; + result += readByte(v); + valType = (TType)v; + result += readI32(sizei); + if (sizei < 0) { + throw TProtocolException(TProtocolException::NEGATIVE_SIZE); + } else if (this->container_limit_ && sizei > this->container_limit_) { + throw TProtocolException(TProtocolException::SIZE_LIMIT); + } + size = (uint32_t)sizei; + + TMap map(keyType, valType, size); + checkReadBytesAvailable(map); + + return result; +} + +template +uint32_t TBinaryProtocolT::readMapEnd() { + return 0; +} + +template +uint32_t TBinaryProtocolT::readListBegin(TType& elemType, uint32_t& size) { + int8_t e; + uint32_t result = 0; + int32_t sizei; + result += readByte(e); + elemType = (TType)e; + result += readI32(sizei); + if (sizei < 0) { + throw TProtocolException(TProtocolException::NEGATIVE_SIZE); + } else if (this->container_limit_ && sizei > this->container_limit_) { + throw TProtocolException(TProtocolException::SIZE_LIMIT); + } + size = (uint32_t)sizei; + + TList list(elemType, size); + checkReadBytesAvailable(list); + + return result; +} + +template +uint32_t TBinaryProtocolT::readListEnd() { + return 0; +} + +template +uint32_t TBinaryProtocolT::readSetBegin(TType& elemType, uint32_t& size) { + int8_t e; + uint32_t result = 0; + int32_t sizei; + result += readByte(e); + elemType = (TType)e; + result += readI32(sizei); + if (sizei < 0) { + throw TProtocolException(TProtocolException::NEGATIVE_SIZE); + } else if (this->container_limit_ && sizei > this->container_limit_) { + throw TProtocolException(TProtocolException::SIZE_LIMIT); + } + size = (uint32_t)sizei; + + TSet set(elemType, size); + checkReadBytesAvailable(set); + + return result; +} + +template +uint32_t TBinaryProtocolT::readSetEnd() { + return 0; +} + +template +uint32_t TBinaryProtocolT::readBool(bool& value) { + uint8_t b[1]; + this->trans_->readAll(b, 1); + value = *(int8_t*)b != 0; + return 1; +} + +template +uint32_t TBinaryProtocolT::readByte(int8_t& byte) { + uint8_t b[1]; + this->trans_->readAll(b, 1); + byte = *(int8_t*)b; + return 1; +} + +template +uint32_t TBinaryProtocolT::readI16(int16_t& i16) { + union bytes { + uint8_t b[2]; + int16_t all; + } theBytes; + this->trans_->readAll(theBytes.b, 2); + i16 = (int16_t)ByteOrder_::fromWire16(theBytes.all); + return 2; +} + +template +uint32_t TBinaryProtocolT::readI32(int32_t& i32) { + union bytes { + uint8_t b[4]; + int32_t all; + } theBytes; + this->trans_->readAll(theBytes.b, 4); + i32 = (int32_t)ByteOrder_::fromWire32(theBytes.all); + return 4; +} + +template +uint32_t TBinaryProtocolT::readI64(int64_t& i64) { + union bytes { + uint8_t b[8]; + int64_t all; + } theBytes; + this->trans_->readAll(theBytes.b, 8); + i64 = (int64_t)ByteOrder_::fromWire64(theBytes.all); + return 8; +} + +template +uint32_t TBinaryProtocolT::readDouble(double& dub) { + static_assert(sizeof(double) == sizeof(uint64_t), "sizeof(double) == sizeof(uint64_t)"); + static_assert(std::numeric_limits::is_iec559, "std::numeric_limits::is_iec559"); + + union bytes { + uint8_t b[8]; + uint64_t all; + } theBytes; + this->trans_->readAll(theBytes.b, 8); + theBytes.all = ByteOrder_::fromWire64(theBytes.all); + dub = bitwise_cast(theBytes.all); + return 8; +} + +template +template +uint32_t TBinaryProtocolT::readString(StrType& str) { + uint32_t result; + int32_t size; + result = readI32(size); + return result + readStringBody(str, size); +} + +template +uint32_t TBinaryProtocolT::readBinary(std::string& str) { + return TBinaryProtocolT::readString(str); +} + +template +template +uint32_t TBinaryProtocolT::readStringBody(StrType& str, int32_t size) { + uint32_t result = 0; + + // Catch error cases + if (size < 0) { + throw TProtocolException(TProtocolException::NEGATIVE_SIZE); + } + if (this->string_limit_ > 0 && size > this->string_limit_) { + throw TProtocolException(TProtocolException::SIZE_LIMIT); + } + + // Catch empty string case + if (size == 0) { + str.clear(); + return result; + } + + // Try to borrow first + const uint8_t* borrow_buf; + uint32_t got = size; + if ((borrow_buf = this->trans_->borrow(nullptr, &got))) { + str.assign((const char*)borrow_buf, size); + this->trans_->consume(size); + return size; + } + + str.resize(size); + this->trans_->readAll(reinterpret_cast(&str[0]), size); + return (uint32_t)size; +} + +// Return the minimum number of bytes a type will consume on the wire +template +int TBinaryProtocolT::getMinSerializedSize(TType type) +{ + switch (type) + { + case T_STOP: return 0; + case T_VOID: return 0; + case T_BOOL: return sizeof(int8_t); + case T_BYTE: return sizeof(int8_t); + case T_DOUBLE: return sizeof(double); + case T_I16: return sizeof(short); + case T_I32: return sizeof(int); + case T_I64: return sizeof(long); + case T_STRING: return sizeof(int); // string length + case T_STRUCT: return 0; // empty struct + case T_MAP: return sizeof(int); // element count + case T_SET: return sizeof(int); // element count + case T_LIST: return sizeof(int); // element count + default: throw TProtocolException(TProtocolException::UNKNOWN, "unrecognized type code"); + } +} + +} +} +} // apache::thrift::protocol + +#endif // #ifndef _THRIFT_PROTOCOL_TBINARYPROTOCOL_TCC_ diff --git a/bsnes/thrift/thrift/protocol/TCompactProtocol.h b/bsnes/thrift/thrift/protocol/TCompactProtocol.h new file mode 100644 index 00000000..6f990b2d --- /dev/null +++ b/bsnes/thrift/thrift/protocol/TCompactProtocol.h @@ -0,0 +1,284 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +#ifndef _THRIFT_PROTOCOL_TCOMPACTPROTOCOL_H_ +#define _THRIFT_PROTOCOL_TCOMPACTPROTOCOL_H_ 1 + +#include + +#include +#include + +namespace apache { +namespace thrift { +namespace protocol { + +/** + * C++ Implementation of the Compact Protocol as described in THRIFT-110 + */ +template +class TCompactProtocolT : public TVirtualProtocol > { +public: + static const int8_t PROTOCOL_ID = (int8_t)0x82u; + static const int8_t VERSION_N = 1; + static const int8_t VERSION_MASK = 0x1f; // 0001 1111 + +protected: + static const int8_t TYPE_MASK = (int8_t)0xE0u; // 1110 0000 + static const int8_t TYPE_BITS = 0x07; // 0000 0111 + static const int32_t TYPE_SHIFT_AMOUNT = 5; + + Transport_* trans_; + + /** + * (Writing) If we encounter a boolean field begin, save the TField here + * so it can have the value incorporated. + */ + struct { + const char* name; + TType fieldType; + int16_t fieldId; + } booleanField_; + + /** + * (Reading) If we read a field header, and it's a boolean field, save + * the boolean value here so that readBool can use it. + */ + struct { + bool hasBoolValue; + bool boolValue; + } boolValue_; + + /** + * Used to keep track of the last field for the current and previous structs, + * so we can do the delta stuff. + */ + + std::stack lastField_; + int16_t lastFieldId_; + +public: + TCompactProtocolT(std::shared_ptr trans) + : TVirtualProtocol >(trans), + trans_(trans.get()), + lastFieldId_(0), + string_limit_(0), + string_buf_(nullptr), + string_buf_size_(0), + container_limit_(0) { + booleanField_.name = nullptr; + boolValue_.hasBoolValue = false; + } + + TCompactProtocolT(std::shared_ptr trans, + int32_t string_limit, + int32_t container_limit) + : TVirtualProtocol >(trans), + trans_(trans.get()), + lastFieldId_(0), + string_limit_(string_limit), + string_buf_(nullptr), + string_buf_size_(0), + container_limit_(container_limit) { + booleanField_.name = nullptr; + boolValue_.hasBoolValue = false; + } + + ~TCompactProtocolT() override { free(string_buf_); } + + /** + * Writing functions + */ + + virtual uint32_t writeMessageBegin(const std::string& name, + const TMessageType messageType, + const int32_t seqid); + + uint32_t writeStructBegin(const char* name); + + uint32_t writeStructEnd(); + + uint32_t writeFieldBegin(const char* name, const TType fieldType, const int16_t fieldId); + + uint32_t writeFieldStop(); + + uint32_t writeListBegin(const TType elemType, const uint32_t size); + + uint32_t writeSetBegin(const TType elemType, const uint32_t size); + + virtual uint32_t writeMapBegin(const TType keyType, const TType valType, const uint32_t size); + + uint32_t writeBool(const bool value); + + uint32_t writeByte(const int8_t byte); + + uint32_t writeI16(const int16_t i16); + + uint32_t writeI32(const int32_t i32); + + uint32_t writeI64(const int64_t i64); + + uint32_t writeDouble(const double dub); + + uint32_t writeString(const std::string& str); + + uint32_t writeBinary(const std::string& str); + + int getMinSerializedSize(TType type); + + void checkReadBytesAvailable(TSet& set) + { + trans_->checkReadBytesAvailable(set.size_ * getMinSerializedSize(set.elemType_)); + } + + void checkReadBytesAvailable(TList& list) + { + trans_->checkReadBytesAvailable(list.size_ * getMinSerializedSize(list.elemType_)); + } + + void checkReadBytesAvailable(TMap& map) + { + int elmSize = getMinSerializedSize(map.keyType_) + getMinSerializedSize(map.valueType_); + trans_->checkReadBytesAvailable(map.size_ * elmSize); + } + + /** + * These methods are called by structs, but don't actually have any wired + * output or purpose + */ + virtual uint32_t writeMessageEnd() { return 0; } + uint32_t writeMapEnd() { return 0; } + uint32_t writeListEnd() { return 0; } + uint32_t writeSetEnd() { return 0; } + uint32_t writeFieldEnd() { return 0; } + +protected: + int32_t writeFieldBeginInternal(const char* name, + const TType fieldType, + const int16_t fieldId, + int8_t typeOverride); + uint32_t writeCollectionBegin(const TType elemType, int32_t size); + uint32_t writeVarint32(uint32_t n); + uint32_t writeVarint64(uint64_t n); + uint64_t i64ToZigzag(const int64_t l); + uint32_t i32ToZigzag(const int32_t n); + inline int8_t getCompactType(const TType ttype); + +public: + uint32_t readMessageBegin(std::string& name, TMessageType& messageType, int32_t& seqid); + + uint32_t readStructBegin(std::string& name); + + uint32_t readStructEnd(); + + uint32_t readFieldBegin(std::string& name, TType& fieldType, int16_t& fieldId); + + uint32_t readMapBegin(TType& keyType, TType& valType, uint32_t& size); + + uint32_t readListBegin(TType& elemType, uint32_t& size); + + uint32_t readSetBegin(TType& elemType, uint32_t& size); + + uint32_t readBool(bool& value); + // Provide the default readBool() implementation for std::vector + using TVirtualProtocol >::readBool; + + uint32_t readByte(int8_t& byte); + + uint32_t readI16(int16_t& i16); + + uint32_t readI32(int32_t& i32); + + uint32_t readI64(int64_t& i64); + + uint32_t readDouble(double& dub); + + uint32_t readString(std::string& str); + + uint32_t readBinary(std::string& str); + + /* + *These methods are here for the struct to call, but don't have any wire + * encoding. + */ + uint32_t readMessageEnd() { return 0; } + uint32_t readFieldEnd() { return 0; } + uint32_t readMapEnd() { return 0; } + uint32_t readListEnd() { return 0; } + uint32_t readSetEnd() { return 0; } + +protected: + uint32_t readVarint32(int32_t& i32); + uint32_t readVarint64(int64_t& i64); + int32_t zigzagToI32(uint32_t n); + int64_t zigzagToI64(uint64_t n); + TType getTType(int8_t type); + + // Buffer for reading strings, save for the lifetime of the protocol to + // avoid memory churn allocating memory on every string read + int32_t string_limit_; + uint8_t* string_buf_; + int32_t string_buf_size_; + int32_t container_limit_; +}; + +typedef TCompactProtocolT TCompactProtocol; + +/** + * Constructs compact protocol handlers + */ +template +class TCompactProtocolFactoryT : public TProtocolFactory { +public: + TCompactProtocolFactoryT() : string_limit_(0), container_limit_(0) {} + + TCompactProtocolFactoryT(int32_t string_limit, int32_t container_limit) + : string_limit_(string_limit), container_limit_(container_limit) {} + + ~TCompactProtocolFactoryT() override = default; + + void setStringSizeLimit(int32_t string_limit) { string_limit_ = string_limit; } + + void setContainerSizeLimit(int32_t container_limit) { container_limit_ = container_limit; } + + std::shared_ptr getProtocol(std::shared_ptr trans) override { + std::shared_ptr specific_trans = std::dynamic_pointer_cast(trans); + TProtocol* prot; + if (specific_trans) { + prot = new TCompactProtocolT(specific_trans, string_limit_, container_limit_); + } else { + prot = new TCompactProtocol(trans, string_limit_, container_limit_); + } + + return std::shared_ptr(prot); + } + +private: + int32_t string_limit_; + int32_t container_limit_; +}; + +typedef TCompactProtocolFactoryT TCompactProtocolFactory; +} +} +} // apache::thrift::protocol + +#include + +#endif diff --git a/bsnes/thrift/thrift/protocol/TCompactProtocol.tcc b/bsnes/thrift/thrift/protocol/TCompactProtocol.tcc new file mode 100644 index 00000000..16780911 --- /dev/null +++ b/bsnes/thrift/thrift/protocol/TCompactProtocol.tcc @@ -0,0 +1,858 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +#ifndef _THRIFT_PROTOCOL_TCOMPACTPROTOCOL_TCC_ +#define _THRIFT_PROTOCOL_TCOMPACTPROTOCOL_TCC_ 1 + +#include + +#include "thrift/config.h" + +/* + * TCompactProtocol::i*ToZigzag depend on the fact that the right shift + * operator on a signed integer is an arithmetic (sign-extending) shift. + * If this is not the case, the current implementation will not work. + * If anyone encounters this error, we can try to figure out the best + * way to implement an arithmetic right shift on their platform. + */ +#if !defined(SIGNED_RIGHT_SHIFT_IS) || !defined(ARITHMETIC_RIGHT_SHIFT) +# error "Unable to determine the behavior of a signed right shift" +#endif +#if SIGNED_RIGHT_SHIFT_IS != ARITHMETIC_RIGHT_SHIFT +# error "TCompactProtocol currently only works if a signed right shift is arithmetic" +#endif + +#ifdef __GNUC__ +#define UNLIKELY(val) (__builtin_expect((val), 0)) +#else +#define UNLIKELY(val) (val) +#endif + +namespace apache { namespace thrift { namespace protocol { + +namespace detail { namespace compact { + +enum Types { + CT_STOP = 0x00, + CT_BOOLEAN_TRUE = 0x01, + CT_BOOLEAN_FALSE = 0x02, + CT_BYTE = 0x03, + CT_I16 = 0x04, + CT_I32 = 0x05, + CT_I64 = 0x06, + CT_DOUBLE = 0x07, + CT_BINARY = 0x08, + CT_LIST = 0x09, + CT_SET = 0x0A, + CT_MAP = 0x0B, + CT_STRUCT = 0x0C +}; + +const int8_t TTypeToCType[16] = { + CT_STOP, // T_STOP + 0, // unused + CT_BOOLEAN_TRUE, // T_BOOL + CT_BYTE, // T_BYTE + CT_DOUBLE, // T_DOUBLE + 0, // unused + CT_I16, // T_I16 + 0, // unused + CT_I32, // T_I32 + 0, // unused + CT_I64, // T_I64 + CT_BINARY, // T_STRING + CT_STRUCT, // T_STRUCT + CT_MAP, // T_MAP + CT_SET, // T_SET + CT_LIST, // T_LIST +}; + +}} // end detail::compact namespace + + +template +uint32_t TCompactProtocolT::writeMessageBegin( + const std::string& name, + const TMessageType messageType, + const int32_t seqid) { + uint32_t wsize = 0; + wsize += writeByte(PROTOCOL_ID); + wsize += writeByte((VERSION_N & VERSION_MASK) | (((int32_t)messageType << TYPE_SHIFT_AMOUNT) & TYPE_MASK)); + wsize += writeVarint32(seqid); + wsize += writeString(name); + return wsize; +} + +/** + * Write a field header containing the field id and field type. If the + * difference between the current field id and the last one is small (< 15), + * then the field id will be encoded in the 4 MSB as a delta. Otherwise, the + * field id will follow the type header as a zigzag varint. + */ +template +uint32_t TCompactProtocolT::writeFieldBegin(const char* name, + const TType fieldType, + const int16_t fieldId) { + if (fieldType == T_BOOL) { + booleanField_.name = name; + booleanField_.fieldType = fieldType; + booleanField_.fieldId = fieldId; + } else { + return writeFieldBeginInternal(name, fieldType, fieldId, -1); + } + return 0; +} + +/** + * Write the STOP symbol so we know there are no more fields in this struct. + */ +template +uint32_t TCompactProtocolT::writeFieldStop() { + return writeByte(T_STOP); +} + +/** + * Write a struct begin. This doesn't actually put anything on the wire. We + * use it as an opportunity to put special placeholder markers on the field + * stack so we can get the field id deltas correct. + */ +template +uint32_t TCompactProtocolT::writeStructBegin(const char* name) { + (void) name; + lastField_.push(lastFieldId_); + lastFieldId_ = 0; + return 0; +} + +/** + * Write a struct end. This doesn't actually put anything on the wire. We use + * this as an opportunity to pop the last field from the current struct off + * of the field stack. + */ +template +uint32_t TCompactProtocolT::writeStructEnd() { + lastFieldId_ = lastField_.top(); + lastField_.pop(); + return 0; +} + +/** + * Write a List header. + */ +template +uint32_t TCompactProtocolT::writeListBegin(const TType elemType, + const uint32_t size) { + return writeCollectionBegin(elemType, size); +} + +/** + * Write a set header. + */ +template +uint32_t TCompactProtocolT::writeSetBegin(const TType elemType, + const uint32_t size) { + return writeCollectionBegin(elemType, size); +} + +/** + * Write a map header. If the map is empty, omit the key and value type + * headers, as we don't need any additional information to skip it. + */ +template +uint32_t TCompactProtocolT::writeMapBegin(const TType keyType, + const TType valType, + const uint32_t size) { + uint32_t wsize = 0; + + if (size == 0) { + wsize += writeByte(0); + } else { + wsize += writeVarint32(size); + wsize += writeByte(getCompactType(keyType) << 4 | getCompactType(valType)); + } + return wsize; +} + +/** + * Write a boolean value. Potentially, this could be a boolean field, in + * which case the field header info isn't written yet. If so, decide what the + * right type header is for the value and then write the field header. + * Otherwise, write a single byte. + */ +template +uint32_t TCompactProtocolT::writeBool(const bool value) { + uint32_t wsize = 0; + + if (booleanField_.name != nullptr) { + // we haven't written the field header yet + wsize + += writeFieldBeginInternal(booleanField_.name, + booleanField_.fieldType, + booleanField_.fieldId, + static_cast(value + ? detail::compact::CT_BOOLEAN_TRUE + : detail::compact::CT_BOOLEAN_FALSE)); + booleanField_.name = nullptr; + } else { + // we're not part of a field, so just write the value + wsize + += writeByte(static_cast(value + ? detail::compact::CT_BOOLEAN_TRUE + : detail::compact::CT_BOOLEAN_FALSE)); + } + return wsize; +} + +template +uint32_t TCompactProtocolT::writeByte(const int8_t byte) { + trans_->write((uint8_t*)&byte, 1); + return 1; +} + +/** + * Write an i16 as a zigzag varint. + */ +template +uint32_t TCompactProtocolT::writeI16(const int16_t i16) { + return writeVarint32(i32ToZigzag(i16)); +} + +/** + * Write an i32 as a zigzag varint. + */ +template +uint32_t TCompactProtocolT::writeI32(const int32_t i32) { + return writeVarint32(i32ToZigzag(i32)); +} + +/** + * Write an i64 as a zigzag varint. + */ +template +uint32_t TCompactProtocolT::writeI64(const int64_t i64) { + return writeVarint64(i64ToZigzag(i64)); +} + +/** + * Write a double to the wire as 8 bytes. + */ +template +uint32_t TCompactProtocolT::writeDouble(const double dub) { + static_assert(sizeof(double) == sizeof(uint64_t), "sizeof(double) == sizeof(uint64_t)"); + static_assert(std::numeric_limits::is_iec559, "std::numeric_limits::is_iec559"); + + auto bits = bitwise_cast(dub); + bits = THRIFT_htolell(bits); + trans_->write((uint8_t*)&bits, 8); + return 8; +} + +/** + * Write a string to the wire with a varint size preceding. + */ +template +uint32_t TCompactProtocolT::writeString(const std::string& str) { + return writeBinary(str); +} + +template +uint32_t TCompactProtocolT::writeBinary(const std::string& str) { + if(str.size() > (std::numeric_limits::max)()) + throw TProtocolException(TProtocolException::SIZE_LIMIT); + auto ssize = static_cast(str.size()); + uint32_t wsize = writeVarint32(ssize) ; + // checking ssize + wsize > uint_max, but we don't want to overflow while checking for overflows. + // transforming the check to ssize > uint_max - wsize + if(ssize > (std::numeric_limits::max)() - wsize) + throw TProtocolException(TProtocolException::SIZE_LIMIT); + wsize += ssize; + trans_->write((uint8_t*)str.data(), ssize); + return wsize; +} + +// +// Internal Writing methods +// + +/** + * The workhorse of writeFieldBegin. It has the option of doing a + * 'type override' of the type header. This is used specifically in the + * boolean field case. + */ +template +int32_t TCompactProtocolT::writeFieldBeginInternal( + const char* name, + const TType fieldType, + const int16_t fieldId, + int8_t typeOverride) { + (void) name; + uint32_t wsize = 0; + + // if there's a type override, use that. + int8_t typeToWrite = (typeOverride == -1 ? getCompactType(fieldType) : typeOverride); + + // check if we can use delta encoding for the field id + if (fieldId > lastFieldId_ && fieldId - lastFieldId_ <= 15) { + // write them together + wsize += writeByte(static_cast((fieldId - lastFieldId_) + << 4 | typeToWrite)); + } else { + // write them separate + wsize += writeByte(typeToWrite); + wsize += writeI16(fieldId); + } + + lastFieldId_ = fieldId; + return wsize; +} + +/** + * Abstract method for writing the start of lists and sets. List and sets on + * the wire differ only by the type indicator. + */ +template +uint32_t TCompactProtocolT::writeCollectionBegin(const TType elemType, + int32_t size) { + uint32_t wsize = 0; + if (size <= 14) { + wsize += writeByte(static_cast(size + << 4 | getCompactType(elemType))); + } else { + wsize += writeByte(0xf0 | getCompactType(elemType)); + wsize += writeVarint32(size); + } + return wsize; +} + +/** + * Write an i32 as a varint. Results in 1-5 bytes on the wire. + */ +template +uint32_t TCompactProtocolT::writeVarint32(uint32_t n) { + uint8_t buf[5]; + uint32_t wsize = 0; + + while (true) { + if ((n & ~0x7F) == 0) { + buf[wsize++] = (int8_t)n; + break; + } else { + buf[wsize++] = (int8_t)((n & 0x7F) | 0x80); + n >>= 7; + } + } + trans_->write(buf, wsize); + return wsize; +} + +/** + * Write an i64 as a varint. Results in 1-10 bytes on the wire. + */ +template +uint32_t TCompactProtocolT::writeVarint64(uint64_t n) { + uint8_t buf[10]; + uint32_t wsize = 0; + + while (true) { + if ((n & ~0x7FL) == 0) { + buf[wsize++] = (int8_t)n; + break; + } else { + buf[wsize++] = (int8_t)((n & 0x7F) | 0x80); + n >>= 7; + } + } + trans_->write(buf, wsize); + return wsize; +} + +/** + * Convert l into a zigzag long. This allows negative numbers to be + * represented compactly as a varint. + */ +template +uint64_t TCompactProtocolT::i64ToZigzag(const int64_t l) { + return (static_cast(l) << 1) ^ (l >> 63); +} + +/** + * Convert n into a zigzag int. This allows negative numbers to be + * represented compactly as a varint. + */ +template +uint32_t TCompactProtocolT::i32ToZigzag(const int32_t n) { + return (static_cast(n) << 1) ^ (n >> 31); +} + +/** + * Given a TType value, find the appropriate detail::compact::Types value + */ +template +int8_t TCompactProtocolT::getCompactType(const TType ttype) { + return detail::compact::TTypeToCType[ttype]; +} + +// +// Reading Methods +// + +/** + * Read a message header. + */ +template +uint32_t TCompactProtocolT::readMessageBegin( + std::string& name, + TMessageType& messageType, + int32_t& seqid) { + uint32_t rsize = 0; + int8_t protocolId; + int8_t versionAndType; + int8_t version; + + rsize += readByte(protocolId); + if (protocolId != PROTOCOL_ID) { + throw TProtocolException(TProtocolException::BAD_VERSION, "Bad protocol identifier"); + } + + rsize += readByte(versionAndType); + version = (int8_t)(versionAndType & VERSION_MASK); + if (version != VERSION_N) { + throw TProtocolException(TProtocolException::BAD_VERSION, "Bad protocol version"); + } + + messageType = (TMessageType)((versionAndType >> TYPE_SHIFT_AMOUNT) & TYPE_BITS); + rsize += readVarint32(seqid); + rsize += readString(name); + + return rsize; +} + +/** + * Read a struct begin. There's nothing on the wire for this, but it is our + * opportunity to push a new struct begin marker on the field stack. + */ +template +uint32_t TCompactProtocolT::readStructBegin(std::string& name) { + name = ""; + lastField_.push(lastFieldId_); + lastFieldId_ = 0; + return 0; +} + +/** + * Doesn't actually consume any wire data, just removes the last field for + * this struct from the field stack. + */ +template +uint32_t TCompactProtocolT::readStructEnd() { + lastFieldId_ = lastField_.top(); + lastField_.pop(); + return 0; +} + +/** + * Read a field header off the wire. + */ +template +uint32_t TCompactProtocolT::readFieldBegin(std::string& name, + TType& fieldType, + int16_t& fieldId) { + (void) name; + uint32_t rsize = 0; + int8_t byte; + int8_t type; + + rsize += readByte(byte); + type = (byte & 0x0f); + + // if it's a stop, then we can return immediately, as the struct is over. + if (type == T_STOP) { + fieldType = T_STOP; + fieldId = 0; + return rsize; + } + + // mask off the 4 MSB of the type header. it could contain a field id delta. + auto modifier = (int16_t)(((uint8_t)byte & 0xf0) >> 4); + if (modifier == 0) { + // not a delta, look ahead for the zigzag varint field id. + rsize += readI16(fieldId); + } else { + fieldId = (int16_t)(lastFieldId_ + modifier); + } + fieldType = getTType(type); + + // if this happens to be a boolean field, the value is encoded in the type + if (type == detail::compact::CT_BOOLEAN_TRUE || + type == detail::compact::CT_BOOLEAN_FALSE) { + // save the boolean value in a special instance variable. + boolValue_.hasBoolValue = true; + boolValue_.boolValue = + (type == detail::compact::CT_BOOLEAN_TRUE ? true : false); + } + + // push the new field onto the field stack so we can keep the deltas going. + lastFieldId_ = fieldId; + return rsize; +} + +/** + * Read a map header off the wire. If the size is zero, skip reading the key + * and value type. This means that 0-length maps will yield TMaps without the + * "correct" types. + */ +template +uint32_t TCompactProtocolT::readMapBegin(TType& keyType, + TType& valType, + uint32_t& size) { + uint32_t rsize = 0; + int8_t kvType = 0; + int32_t msize = 0; + + rsize += readVarint32(msize); + if (msize != 0) + rsize += readByte(kvType); + + if (msize < 0) { + throw TProtocolException(TProtocolException::NEGATIVE_SIZE); + } else if (container_limit_ && msize > container_limit_) { + throw TProtocolException(TProtocolException::SIZE_LIMIT); + } + + keyType = getTType((int8_t)((uint8_t)kvType >> 4)); + valType = getTType((int8_t)((uint8_t)kvType & 0xf)); + size = (uint32_t)msize; + + TMap map(keyType, valType, size); + checkReadBytesAvailable(map); + + return rsize; +} + +/** + * Read a list header off the wire. If the list size is 0-14, the size will + * be packed into the element type header. If it's a longer list, the 4 MSB + * of the element type header will be 0xF, and a varint will follow with the + * true size. + */ +template +uint32_t TCompactProtocolT::readListBegin(TType& elemType, + uint32_t& size) { + int8_t size_and_type; + uint32_t rsize = 0; + int32_t lsize; + + rsize += readByte(size_and_type); + + lsize = ((uint8_t)size_and_type >> 4) & 0x0f; + if (lsize == 15) { + rsize += readVarint32(lsize); + } + + if (lsize < 0) { + throw TProtocolException(TProtocolException::NEGATIVE_SIZE); + } else if (container_limit_ && lsize > container_limit_) { + throw TProtocolException(TProtocolException::SIZE_LIMIT); + } + + elemType = getTType((int8_t)(size_and_type & 0x0f)); + size = (uint32_t)lsize; + + TList list(elemType, size); + checkReadBytesAvailable(list); + + return rsize; +} + +/** + * Read a set header off the wire. If the set size is 0-14, the size will + * be packed into the element type header. If it's a longer set, the 4 MSB + * of the element type header will be 0xF, and a varint will follow with the + * true size. + */ +template +uint32_t TCompactProtocolT::readSetBegin(TType& elemType, + uint32_t& size) { + return readListBegin(elemType, size); +} + +/** + * Read a boolean off the wire. If this is a boolean field, the value should + * already have been read during readFieldBegin, so we'll just consume the + * pre-stored value. Otherwise, read a byte. + */ +template +uint32_t TCompactProtocolT::readBool(bool& value) { + if (boolValue_.hasBoolValue == true) { + value = boolValue_.boolValue; + boolValue_.hasBoolValue = false; + return 0; + } else { + int8_t val; + readByte(val); + value = (val == detail::compact::CT_BOOLEAN_TRUE); + return 1; + } +} + +/** + * Read a single byte off the wire. Nothing interesting here. + */ +template +uint32_t TCompactProtocolT::readByte(int8_t& byte) { + uint8_t b[1]; + trans_->readAll(b, 1); + byte = *(int8_t*)b; + return 1; +} + +/** + * Read an i16 from the wire as a zigzag varint. + */ +template +uint32_t TCompactProtocolT::readI16(int16_t& i16) { + int32_t value; + uint32_t rsize = readVarint32(value); + i16 = (int16_t)zigzagToI32(value); + return rsize; +} + +/** + * Read an i32 from the wire as a zigzag varint. + */ +template +uint32_t TCompactProtocolT::readI32(int32_t& i32) { + int32_t value; + uint32_t rsize = readVarint32(value); + i32 = zigzagToI32(value); + return rsize; +} + +/** + * Read an i64 from the wire as a zigzag varint. + */ +template +uint32_t TCompactProtocolT::readI64(int64_t& i64) { + int64_t value; + uint32_t rsize = readVarint64(value); + i64 = zigzagToI64(value); + return rsize; +} + +/** + * No magic here - just read a double off the wire. + */ +template +uint32_t TCompactProtocolT::readDouble(double& dub) { + static_assert(sizeof(double) == sizeof(uint64_t), "sizeof(double) == sizeof(uint64_t)"); + static_assert(std::numeric_limits::is_iec559, "std::numeric_limits::is_iec559"); + + union { + uint64_t bits; + uint8_t b[8]; + } u; + trans_->readAll(u.b, 8); + u.bits = THRIFT_letohll(u.bits); + dub = bitwise_cast(u.bits); + return 8; +} + +template +uint32_t TCompactProtocolT::readString(std::string& str) { + return readBinary(str); +} + +/** + * Read a byte[] from the wire. + */ +template +uint32_t TCompactProtocolT::readBinary(std::string& str) { + int32_t rsize = 0; + int32_t size; + + rsize += readVarint32(size); + // Catch empty string case + if (size == 0) { + str = ""; + return rsize; + } + + // Catch error cases + if (size < 0) { + throw TProtocolException(TProtocolException::NEGATIVE_SIZE); + } + if (string_limit_ > 0 && size > string_limit_) { + throw TProtocolException(TProtocolException::SIZE_LIMIT); + } + + // Use the heap here to prevent stack overflow for v. large strings + if (size > string_buf_size_ || string_buf_ == nullptr) { + void* new_string_buf = std::realloc(string_buf_, (uint32_t)size); + if (new_string_buf == nullptr) { + throw std::bad_alloc(); + } + string_buf_ = (uint8_t*)new_string_buf; + string_buf_size_ = size; + } + trans_->readAll(string_buf_, size); + str.assign((char*)string_buf_, size); + + trans_->checkReadBytesAvailable(rsize + (uint32_t)size); + + return rsize + (uint32_t)size; +} + +/** + * Read an i32 from the wire as a varint. The MSB of each byte is set + * if there is another byte to follow. This can read up to 5 bytes. + */ +template +uint32_t TCompactProtocolT::readVarint32(int32_t& i32) { + int64_t val; + uint32_t rsize = readVarint64(val); + i32 = (int32_t)val; + return rsize; +} + +/** + * Read an i64 from the wire as a proper varint. The MSB of each byte is set + * if there is another byte to follow. This can read up to 10 bytes. + */ +template +uint32_t TCompactProtocolT::readVarint64(int64_t& i64) { + uint32_t rsize = 0; + uint64_t val = 0; + int shift = 0; + uint8_t buf[10]; // 64 bits / (7 bits/byte) = 10 bytes. + uint32_t buf_size = sizeof(buf); + const uint8_t* borrowed = trans_->borrow(buf, &buf_size); + + // Fast path. + if (borrowed != nullptr) { + while (true) { + uint8_t byte = borrowed[rsize]; + rsize++; + val |= (uint64_t)(byte & 0x7f) << shift; + shift += 7; + if (!(byte & 0x80)) { + i64 = val; + trans_->consume(rsize); + return rsize; + } + // Have to check for invalid data so we don't crash. + if (UNLIKELY(rsize == sizeof(buf))) { + throw TProtocolException(TProtocolException::INVALID_DATA, "Variable-length int over 10 bytes."); + } + } + } + + // Slow path. + else { + while (true) { + uint8_t byte; + rsize += trans_->readAll(&byte, 1); + val |= (uint64_t)(byte & 0x7f) << shift; + shift += 7; + if (!(byte & 0x80)) { + i64 = val; + return rsize; + } + // Might as well check for invalid data on the slow path too. + if (UNLIKELY(rsize >= sizeof(buf))) { + throw TProtocolException(TProtocolException::INVALID_DATA, "Variable-length int over 10 bytes."); + } + } + } +} + +/** + * Convert from zigzag int to int. + */ +template +int32_t TCompactProtocolT::zigzagToI32(uint32_t n) { + return (n >> 1) ^ static_cast(-static_cast(n & 1)); +} + +/** + * Convert from zigzag long to long. + */ +template +int64_t TCompactProtocolT::zigzagToI64(uint64_t n) { + return (n >> 1) ^ static_cast(-static_cast(n & 1)); +} + +template +TType TCompactProtocolT::getTType(int8_t type) { + switch (type) { + case T_STOP: + return T_STOP; + case detail::compact::CT_BOOLEAN_FALSE: + case detail::compact::CT_BOOLEAN_TRUE: + return T_BOOL; + case detail::compact::CT_BYTE: + return T_BYTE; + case detail::compact::CT_I16: + return T_I16; + case detail::compact::CT_I32: + return T_I32; + case detail::compact::CT_I64: + return T_I64; + case detail::compact::CT_DOUBLE: + return T_DOUBLE; + case detail::compact::CT_BINARY: + return T_STRING; + case detail::compact::CT_LIST: + return T_LIST; + case detail::compact::CT_SET: + return T_SET; + case detail::compact::CT_MAP: + return T_MAP; + case detail::compact::CT_STRUCT: + return T_STRUCT; + default: + throw TException(std::string("don't know what type: ") + (char)type); + } +} + +// Return the minimum number of bytes a type will consume on the wire +template +int TCompactProtocolT::getMinSerializedSize(TType type) +{ + switch (type) + { + case T_STOP: return 0; + case T_VOID: return 0; + case T_BOOL: return sizeof(int8_t); + case T_DOUBLE: return 8; // uses fixedLongToBytes() which always writes 8 bytes + case T_BYTE: return sizeof(int8_t); + case T_I16: return sizeof(int8_t); // zigzag + case T_I32: return sizeof(int8_t); // zigzag + case T_I64: return sizeof(int8_t); // zigzag + case T_STRING: return sizeof(int8_t); // string length + case T_STRUCT: return 0; // empty struct + case T_MAP: return sizeof(int8_t); // element count + case T_SET: return sizeof(int8_t); // element count + case T_LIST: return sizeof(int8_t); // element count + default: throw TProtocolException(TProtocolException::UNKNOWN, "unrecognized type code"); + } +} + + +}}} // apache::thrift::protocol + +#endif // _THRIFT_PROTOCOL_TCOMPACTPROTOCOL_TCC_ diff --git a/bsnes/thrift/thrift/protocol/TDebugProtocol.h b/bsnes/thrift/thrift/protocol/TDebugProtocol.h new file mode 100644 index 00000000..41bb0d4e --- /dev/null +++ b/bsnes/thrift/thrift/protocol/TDebugProtocol.h @@ -0,0 +1,204 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +#ifndef _THRIFT_PROTOCOL_TDEBUGPROTOCOL_H_ +#define _THRIFT_PROTOCOL_TDEBUGPROTOCOL_H_ 1 + +#include + +#include + +namespace apache { +namespace thrift { +namespace protocol { + +/* + +!!! EXPERIMENTAL CODE !!! + +This protocol is very much a work in progress. +It doesn't handle many cases properly. +It throws exceptions in many cases. +It probably segfaults in many cases. +Bug reports and feature requests are welcome. +Complaints are not. :R + +*/ + +/** + * Protocol that prints the payload in a nice human-readable format. + * Reading from this protocol is not supported. + * + */ +class TDebugProtocol : public TVirtualProtocol { +private: + enum write_state_t { UNINIT, STRUCT, LIST, SET, MAP_KEY, MAP_VALUE }; + +public: + TDebugProtocol(std::shared_ptr trans) + : TVirtualProtocol(trans), + trans_(trans.get()), + string_limit_(DEFAULT_STRING_LIMIT), + string_prefix_size_(DEFAULT_STRING_PREFIX_SIZE) { + write_state_.push_back(UNINIT); + } + + static const int32_t DEFAULT_STRING_LIMIT = 256; + static const int32_t DEFAULT_STRING_PREFIX_SIZE = 16; + + void setStringSizeLimit(int32_t string_limit) { string_limit_ = string_limit; } + + void setStringPrefixSize(int32_t string_prefix_size) { string_prefix_size_ = string_prefix_size; } + + uint32_t writeMessageBegin(const std::string& name, + const TMessageType messageType, + const int32_t seqid); + + uint32_t writeMessageEnd(); + + uint32_t writeStructBegin(const char* name); + + uint32_t writeStructEnd(); + + uint32_t writeFieldBegin(const char* name, const TType fieldType, const int16_t fieldId); + + uint32_t writeFieldEnd(); + + uint32_t writeFieldStop(); + + uint32_t writeMapBegin(const TType keyType, const TType valType, const uint32_t size); + + uint32_t writeMapEnd(); + + uint32_t writeListBegin(const TType elemType, const uint32_t size); + + uint32_t writeListEnd(); + + uint32_t writeSetBegin(const TType elemType, const uint32_t size); + + uint32_t writeSetEnd(); + + uint32_t writeBool(const bool value); + + uint32_t writeByte(const int8_t byte); + + uint32_t writeI16(const int16_t i16); + + uint32_t writeI32(const int32_t i32); + + uint32_t writeI64(const int64_t i64); + + uint32_t writeDouble(const double dub); + + uint32_t writeString(const std::string& str); + + uint32_t writeBinary(const std::string& str); + +private: + void indentUp(); + void indentDown(); + uint32_t writePlain(const std::string& str); + uint32_t writeIndented(const std::string& str); + uint32_t startItem(); + uint32_t endItem(); + uint32_t writeItem(const std::string& str); + + static std::string fieldTypeName(TType type); + + TTransport* trans_; + + int32_t string_limit_; + int32_t string_prefix_size_; + + std::string indent_str_; + static const int indent_inc = 2; + + std::vector write_state_; + std::vector list_idx_; +}; + +/** + * Constructs debug protocol handlers + */ +class TDebugProtocolFactory : public TProtocolFactory { +public: + TDebugProtocolFactory() = default; + ~TDebugProtocolFactory() override = default; + + std::shared_ptr getProtocol(std::shared_ptr trans) override { + return std::shared_ptr(new TDebugProtocol(trans)); + } +}; +} +} +} // apache::thrift::protocol + +// TODO(dreiss): Move (part of) ThriftDebugString into a .cpp file and remove this. +#include + +namespace apache { +namespace thrift { + +template +std::string ThriftDebugString(const ThriftStruct& ts) { + using namespace apache::thrift::transport; + using namespace apache::thrift::protocol; + auto* buffer = new TMemoryBuffer; + std::shared_ptr trans(buffer); + TDebugProtocol protocol(trans); + + ts.write(&protocol); + + uint8_t* buf; + uint32_t size; + buffer->getBuffer(&buf, &size); + return std::string((char*)buf, (unsigned int)size); +} + +// TODO(dreiss): This is badly broken. Don't use it unless you are me. +#if 0 +template +std::string DebugString(const std::vector& vec) { + using namespace apache::thrift::transport; + using namespace apache::thrift::protocol; + TMemoryBuffer* buffer = new TMemoryBuffer; + std::shared_ptr trans(buffer); + TDebugProtocol protocol(trans); + + // I am gross! + protocol.writeStructBegin("SomeRandomVector"); + + // TODO: Fix this with a trait. + protocol.writeListBegin((TType)99, vec.size()); + typename std::vector::const_iterator it; + for (it = vec.begin(); it != vec.end(); ++it) { + it->write(&protocol); + } + protocol.writeListEnd(); + + uint8_t* buf; + uint32_t size; + buffer->getBuffer(&buf, &size); + return std::string((char*)buf, (unsigned int)size); +} +#endif // 0 +} +} // apache::thrift + +#endif // #ifndef _THRIFT_PROTOCOL_TDEBUGPROTOCOL_H_ diff --git a/bsnes/thrift/thrift/protocol/TEnum.h b/bsnes/thrift/thrift/protocol/TEnum.h new file mode 100644 index 00000000..9636785e --- /dev/null +++ b/bsnes/thrift/thrift/protocol/TEnum.h @@ -0,0 +1,66 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +#ifndef _THRIFT_ENUM_H_ +#define _THRIFT_ENUM_H_ + +namespace apache { +namespace thrift { +namespace protocol { + +/** + * Enumerated definition of the types that the Thrift protocol supports. + * Take special note of the T_END type which is used specifically to mark + * the end of a sequence of fields. + */ +enum TType { + T_STOP = 0, + T_VOID = 1, + T_BOOL = 2, + T_BYTE = 3, + T_I08 = 3, + T_I16 = 6, + T_I32 = 8, + T_U64 = 9, + T_I64 = 10, + T_DOUBLE = 4, + T_STRING = 11, + T_UTF7 = 11, + T_STRUCT = 12, + T_MAP = 13, + T_SET = 14, + T_LIST = 15, + T_UTF8 = 16, + T_UTF16 = 17 +}; + +/** + * Enumerated definition of the message types that the Thrift protocol + * supports. + */ +enum TMessageType { + T_CALL = 1, + T_REPLY = 2, + T_EXCEPTION = 3, + T_ONEWAY = 4 +}; + +}}} // apache::thrift::protocol + +#endif // #define _THRIFT_ENUM_H_ diff --git a/bsnes/thrift/thrift/protocol/THeaderProtocol.h b/bsnes/thrift/thrift/protocol/THeaderProtocol.h new file mode 100644 index 00000000..0d501859 --- /dev/null +++ b/bsnes/thrift/thrift/protocol/THeaderProtocol.h @@ -0,0 +1,210 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +#ifndef THRIFT_PROTOCOL_THEADERPROTOCOL_H_ +#define THRIFT_PROTOCOL_THEADERPROTOCOL_H_ 1 + +#include +#include +#include +#include + +#include + +using apache::thrift::transport::THeaderTransport; + +namespace apache { +namespace thrift { +namespace protocol { + +/** + * The header protocol for thrift. Reads unframed, framed, header format, + * and http + * + */ +class THeaderProtocol : public TVirtualProtocol { +protected: +public: + void resetProtocol(); + + explicit THeaderProtocol(const std::shared_ptr& trans, + uint16_t protoId = T_COMPACT_PROTOCOL) + : TVirtualProtocol(std::shared_ptr(new THeaderTransport(trans))), + trans_(std::dynamic_pointer_cast(getTransport())), + protoId_(protoId) { + trans_->setProtocolId(protoId); + resetProtocol(); + } + + THeaderProtocol(const std::shared_ptr& inTrans, + const std::shared_ptr& outTrans, + uint16_t protoId = T_COMPACT_PROTOCOL) + : TVirtualProtocol( + std::shared_ptr(new THeaderTransport(inTrans, outTrans))), + trans_(std::dynamic_pointer_cast(getTransport())), + protoId_(protoId) { + trans_->setProtocolId(protoId); + resetProtocol(); + } + + ~THeaderProtocol() override = default; + + /** + * Functions to work with headers by calling into THeaderTransport + */ + void setProtocolId(uint16_t protoId) { + trans_->setProtocolId(protoId); + resetProtocol(); + } + + typedef THeaderTransport::StringToStringMap StringToStringMap; + + // these work with write headers + void setHeader(const std::string& key, const std::string& value) { + trans_->setHeader(key, value); + } + + void clearHeaders() { trans_->clearHeaders(); } + + StringToStringMap& getWriteHeaders() { return trans_->getWriteHeaders(); } + + // these work with read headers + const StringToStringMap& getHeaders() const { return trans_->getHeaders(); } + + /** + * Writing functions. + */ + + /*ol*/ uint32_t writeMessageBegin(const std::string& name, + const TMessageType messageType, + const int32_t seqId); + + /*ol*/ uint32_t writeMessageEnd(); + + uint32_t writeStructBegin(const char* name); + + uint32_t writeStructEnd(); + + uint32_t writeFieldBegin(const char* name, const TType fieldType, const int16_t fieldId); + + uint32_t writeFieldEnd(); + + uint32_t writeFieldStop(); + + uint32_t writeMapBegin(const TType keyType, const TType valType, const uint32_t size); + + uint32_t writeMapEnd(); + + uint32_t writeListBegin(const TType elemType, const uint32_t size); + + uint32_t writeListEnd(); + + uint32_t writeSetBegin(const TType elemType, const uint32_t size); + + uint32_t writeSetEnd(); + + uint32_t writeBool(const bool value); + + uint32_t writeByte(const int8_t byte); + + uint32_t writeI16(const int16_t i16); + + uint32_t writeI32(const int32_t i32); + + uint32_t writeI64(const int64_t i64); + + uint32_t writeDouble(const double dub); + + uint32_t writeString(const std::string& str); + + uint32_t writeBinary(const std::string& str); + + /** + * Reading functions + */ + + /*ol*/ uint32_t readMessageBegin(std::string& name, TMessageType& messageType, int32_t& seqId); + + /*ol*/ uint32_t readMessageEnd(); + + uint32_t readStructBegin(std::string& name); + + uint32_t readStructEnd(); + + uint32_t readFieldBegin(std::string& name, TType& fieldType, int16_t& fieldId); + + uint32_t readFieldEnd(); + + uint32_t readMapBegin(TType& keyType, TType& valType, uint32_t& size); + + uint32_t readMapEnd(); + + uint32_t readListBegin(TType& elemType, uint32_t& size); + + uint32_t readListEnd(); + + uint32_t readSetBegin(TType& elemType, uint32_t& size); + + uint32_t readSetEnd(); + + uint32_t readBool(bool& value); + // Provide the default readBool() implementation for std::vector + using TVirtualProtocol::readBool; + + uint32_t readByte(int8_t& byte); + + uint32_t readI16(int16_t& i16); + + uint32_t readI32(int32_t& i32); + + uint32_t readI64(int64_t& i64); + + uint32_t readDouble(double& dub); + + uint32_t readString(std::string& str); + + uint32_t readBinary(std::string& binary); + +protected: + std::shared_ptr trans_; + + std::shared_ptr proto_; + uint32_t protoId_; +}; + +class THeaderProtocolFactory : public TProtocolFactory { +public: + std::shared_ptr getProtocol(std::shared_ptr trans) override { + auto* headerProtocol + = new THeaderProtocol(trans, trans, T_BINARY_PROTOCOL); + return std::shared_ptr(headerProtocol); + } + + std::shared_ptr getProtocol( + std::shared_ptr inTrans, + std::shared_ptr outTrans) override { + auto* headerProtocol = new THeaderProtocol(inTrans, outTrans, T_BINARY_PROTOCOL); + return std::shared_ptr(headerProtocol); + } +}; +} +} +} // apache::thrift::protocol + +#endif // #ifndef THRIFT_PROTOCOL_THEADERPROTOCOL_H_ diff --git a/bsnes/thrift/thrift/protocol/TJSONProtocol.h b/bsnes/thrift/thrift/protocol/TJSONProtocol.h new file mode 100644 index 00000000..e775240a --- /dev/null +++ b/bsnes/thrift/thrift/protocol/TJSONProtocol.h @@ -0,0 +1,343 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +#ifndef _THRIFT_PROTOCOL_TJSONPROTOCOL_H_ +#define _THRIFT_PROTOCOL_TJSONPROTOCOL_H_ 1 + +#include + +#include + +namespace apache { +namespace thrift { +namespace protocol { + +// Forward declaration +class TJSONContext; + +/** + * JSON protocol for Thrift. + * + * Implements a protocol which uses JSON as the wire-format. + * + * Thrift types are represented as described below: + * + * 1. Every Thrift integer type is represented as a JSON number. + * + * 2. Thrift doubles are represented as JSON numbers. Some special values are + * represented as strings: + * a. "NaN" for not-a-number values + * b. "Infinity" for positive infinity + * c. "-Infinity" for negative infinity + * + * 3. Thrift string values are emitted as JSON strings, with appropriate + * escaping. + * + * 4. Thrift binary values are encoded into Base64 and emitted as JSON strings. + * The readBinary() method is written such that it will properly skip if + * called on a Thrift string (although it will decode garbage data). + * + * NOTE: Base64 padding is optional for Thrift binary value encoding. So + * the readBinary() method needs to decode both input strings with padding + * and those without one. + * + * 5. Thrift structs are represented as JSON objects, with the field ID as the + * key, and the field value represented as a JSON object with a single + * key-value pair. The key is a short string identifier for that type, + * followed by the value. The valid type identifiers are: "tf" for bool, + * "i8" for byte, "i16" for 16-bit integer, "i32" for 32-bit integer, "i64" + * for 64-bit integer, "dbl" for double-precision loating point, "str" for + * string (including binary), "rec" for struct ("records"), "map" for map, + * "lst" for list, "set" for set. + * + * 6. Thrift lists and sets are represented as JSON arrays, with the first + * element of the JSON array being the string identifier for the Thrift + * element type and the second element of the JSON array being the count of + * the Thrift elements. The Thrift elements then follow. + * + * 7. Thrift maps are represented as JSON arrays, with the first two elements + * of the JSON array being the string identifiers for the Thrift key type + * and value type, followed by the count of the Thrift pairs, followed by a + * JSON object containing the key-value pairs. Note that JSON keys can only + * be strings, which means that the key type of the Thrift map should be + * restricted to numeric or string types -- in the case of numerics, they + * are serialized as strings. + * + * 8. Thrift messages are represented as JSON arrays, with the protocol + * version #, the message name, the message type, and the sequence ID as + * the first 4 elements. + * + * More discussion of the double handling is probably warranted. The aim of + * the current implementation is to match as closely as possible the behavior + * of Java's Double.toString(), which has no precision loss. Implementors in + * other languages should strive to achieve that where possible. I have not + * yet verified whether std::istringstream::operator>>, which is doing that + * work for me in C++, loses any precision, but I am leaving this as a future + * improvement. I may try to provide a C component for this, so that other + * languages could bind to the same underlying implementation for maximum + * consistency. + * + */ +class TJSONProtocol : public TVirtualProtocol { +public: + TJSONProtocol(std::shared_ptr ptrans); + + ~TJSONProtocol() override; + +private: + void pushContext(std::shared_ptr c); + + void popContext(); + + uint32_t writeJSONEscapeChar(uint8_t ch); + + uint32_t writeJSONChar(uint8_t ch); + + uint32_t writeJSONString(const std::string& str); + + uint32_t writeJSONBase64(const std::string& str); + + template + uint32_t writeJSONInteger(NumberType num); + + uint32_t writeJSONDouble(double num); + + uint32_t writeJSONObjectStart(); + + uint32_t writeJSONObjectEnd(); + + uint32_t writeJSONArrayStart(); + + uint32_t writeJSONArrayEnd(); + + uint32_t readJSONSyntaxChar(uint8_t ch); + + uint32_t readJSONEscapeChar(uint16_t* out); + + uint32_t readJSONString(std::string& str, bool skipContext = false); + + uint32_t readJSONBase64(std::string& str); + + uint32_t readJSONNumericChars(std::string& str); + + template + uint32_t readJSONInteger(NumberType& num); + + uint32_t readJSONDouble(double& num); + + uint32_t readJSONObjectStart(); + + uint32_t readJSONObjectEnd(); + + uint32_t readJSONArrayStart(); + + uint32_t readJSONArrayEnd(); + +public: + /** + * Writing functions. + */ + + uint32_t writeMessageBegin(const std::string& name, + const TMessageType messageType, + const int32_t seqid); + + uint32_t writeMessageEnd(); + + uint32_t writeStructBegin(const char* name); + + uint32_t writeStructEnd(); + + uint32_t writeFieldBegin(const char* name, const TType fieldType, const int16_t fieldId); + + uint32_t writeFieldEnd(); + + uint32_t writeFieldStop(); + + uint32_t writeMapBegin(const TType keyType, const TType valType, const uint32_t size); + + uint32_t writeMapEnd(); + + uint32_t writeListBegin(const TType elemType, const uint32_t size); + + uint32_t writeListEnd(); + + uint32_t writeSetBegin(const TType elemType, const uint32_t size); + + uint32_t writeSetEnd(); + + uint32_t writeBool(const bool value); + + uint32_t writeByte(const int8_t byte); + + uint32_t writeI16(const int16_t i16); + + uint32_t writeI32(const int32_t i32); + + uint32_t writeI64(const int64_t i64); + + uint32_t writeDouble(const double dub); + + uint32_t writeString(const std::string& str); + + uint32_t writeBinary(const std::string& str); + + /** + * Reading functions + */ + + uint32_t readMessageBegin(std::string& name, TMessageType& messageType, int32_t& seqid); + + uint32_t readMessageEnd(); + + uint32_t readStructBegin(std::string& name); + + uint32_t readStructEnd(); + + uint32_t readFieldBegin(std::string& name, TType& fieldType, int16_t& fieldId); + + uint32_t readFieldEnd(); + + uint32_t readMapBegin(TType& keyType, TType& valType, uint32_t& size); + + uint32_t readMapEnd(); + + uint32_t readListBegin(TType& elemType, uint32_t& size); + + uint32_t readListEnd(); + + uint32_t readSetBegin(TType& elemType, uint32_t& size); + + uint32_t readSetEnd(); + + uint32_t readBool(bool& value); + + // Provide the default readBool() implementation for std::vector + using TVirtualProtocol::readBool; + + uint32_t readByte(int8_t& byte); + + uint32_t readI16(int16_t& i16); + + uint32_t readI32(int32_t& i32); + + uint32_t readI64(int64_t& i64); + + uint32_t readDouble(double& dub); + + uint32_t readString(std::string& str); + + uint32_t readBinary(std::string& str); + + int getMinSerializedSize(TType type); + + void checkReadBytesAvailable(TSet& set) + { + trans_->checkReadBytesAvailable(set.size_ * getMinSerializedSize(set.elemType_)); + } + + void checkReadBytesAvailable(TList& list) + { + trans_->checkReadBytesAvailable(list.size_ * getMinSerializedSize(list.elemType_)); + } + + void checkReadBytesAvailable(TMap& map) + { + int elmSize = getMinSerializedSize(map.keyType_) + getMinSerializedSize(map.valueType_); + trans_->checkReadBytesAvailable(map.size_ * elmSize); + } + + class LookaheadReader { + + public: + LookaheadReader(TTransport& trans) : trans_(&trans), hasData_(false), data_(0) {} + + uint8_t read() { + if (hasData_) { + hasData_ = false; + } else { + trans_->readAll(&data_, 1); + } + return data_; + } + + uint8_t peek() { + if (!hasData_) { + trans_->readAll(&data_, 1); + } + hasData_ = true; + return data_; + } + + private: + TTransport* trans_; + bool hasData_; + uint8_t data_; + }; + +private: + TTransport* trans_; + + std::stack > contexts_; + std::shared_ptr context_; + LookaheadReader reader_; +}; + +/** + * Constructs input and output protocol objects given transports. + */ +class TJSONProtocolFactory : public TProtocolFactory { +public: + TJSONProtocolFactory() = default; + + ~TJSONProtocolFactory() override = default; + + std::shared_ptr getProtocol(std::shared_ptr trans) override { + return std::shared_ptr(new TJSONProtocol(trans)); + } +}; +} +} +} // apache::thrift::protocol + +// TODO(dreiss): Move part of ThriftJSONString into a .cpp file and remove this. +#include + +namespace apache { +namespace thrift { + +template +std::string ThriftJSONString(const ThriftStruct& ts) { + using namespace apache::thrift::transport; + using namespace apache::thrift::protocol; + auto* buffer = new TMemoryBuffer; + std::shared_ptr trans(buffer); + TJSONProtocol protocol(trans); + + ts.write(&protocol); + + uint8_t* buf; + uint32_t size; + buffer->getBuffer(&buf, &size); + return std::string((char*)buf, (unsigned int)size); +} +} +} // apache::thrift + +#endif // #define _THRIFT_PROTOCOL_TJSONPROTOCOL_H_ 1 diff --git a/bsnes/thrift/thrift/protocol/TList.h b/bsnes/thrift/thrift/protocol/TList.h new file mode 100644 index 00000000..bf2c1f9d --- /dev/null +++ b/bsnes/thrift/thrift/protocol/TList.h @@ -0,0 +1,55 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +#ifndef _THRIFT_TLIST_H_ +#define _THRIFT_TLIST_H_ + +#include + +namespace apache { +namespace thrift { +namespace protocol { + +// using namespace apache::thrift::protocol; + +/** + * Helper class that encapsulates list metadata. + * + */ +class TList { +public: + TList() : elemType_(T_STOP), + size_(0) { + + } + + TList(TType t = T_STOP, int s = 0) + : elemType_(t), + size_(s) { + + } + + TType elemType_; + int size_; +}; +} +} +} // apache::thrift::protocol + +#endif // #ifndef _THRIFT_TLIST_H_ diff --git a/bsnes/thrift/thrift/protocol/TMap.h b/bsnes/thrift/thrift/protocol/TMap.h new file mode 100644 index 00000000..b52ea8fa --- /dev/null +++ b/bsnes/thrift/thrift/protocol/TMap.h @@ -0,0 +1,59 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +#ifndef _THRIFT_TMAP_H_ +#define _THRIFT_TMAP_H_ + +#include + +namespace apache { +namespace thrift { +namespace protocol { + +using namespace apache::thrift::protocol; + +/** + * Helper class that encapsulates map metadata. + * + */ +class TMap { +public: + TMap() + : keyType_(T_STOP), + valueType_(T_STOP), + size_(0) { + + } + + TMap(TType k, TType v, int s) + : keyType_(k), + valueType_(v), + size_(s) { + + } + + TType keyType_; + TType valueType_; + int size_; +}; +} +} +} // apache::thrift::protocol + +#endif // #ifndef _THRIFT_TMAP_H_ diff --git a/bsnes/thrift/thrift/protocol/TMultiplexedProtocol.h b/bsnes/thrift/thrift/protocol/TMultiplexedProtocol.h new file mode 100644 index 00000000..0dc96058 --- /dev/null +++ b/bsnes/thrift/thrift/protocol/TMultiplexedProtocol.h @@ -0,0 +1,95 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +#ifndef THRIFT_TMULTIPLEXEDPROTOCOL_H_ +#define THRIFT_TMULTIPLEXEDPROTOCOL_H_ 1 + +#include + +namespace apache { +namespace thrift { +namespace protocol { +using std::shared_ptr; + +/** + * TMultiplexedProtocol is a protocol-independent concrete decorator + * that allows a Thrift client to communicate with a multiplexing Thrift server, + * by prepending the service name to the function name during function calls. + * + * \note THIS IS NOT USED BY SERVERS. On the server, use + * {@link apache::thrift::TMultiplexedProcessor TMultiplexedProcessor} to handle requests + * from a multiplexing client. + * + * This example uses a single socket transport to invoke two services: + * + *
    + * shared_ptr transport(new TSocket("localhost", 9090)); + * transport->open(); + * + * shared_ptr protocol(new TBinaryProtocol(transport)); + * + * shared_ptr mp1(new TMultiplexedProtocol(protocol, "Calculator")); + * shared_ptr service1(new CalculatorClient(mp1)); + * + * shared_ptr mp2(new TMultiplexedProtocol(protocol, "WeatherReport")); + * shared_ptr service2(new WeatherReportClient(mp2)); + * + * service1->add(2,2); + * int temp = service2->getTemperature(); + *
    + * + * @see apache::thrift::protocol::TProtocolDecorator + */ +class TMultiplexedProtocol : public TProtocolDecorator { +public: + /** + * Wrap the specified protocol, allowing it to be used to communicate with a + * multiplexing server. The serviceName is required as it is + * prepended to the message header so that the multiplexing server can broker + * the function call to the proper service. + * + * \param _protocol Your communication protocol of choice, e.g. TBinaryProtocol. + * \param _serviceName The service name of the service communicating via this protocol. + */ + TMultiplexedProtocol(shared_ptr _protocol, const std::string& _serviceName) + : TProtocolDecorator(_protocol), serviceName(_serviceName), separator(":") {} + ~TMultiplexedProtocol() override = default; + + /** + * Prepends the service name to the function name, separated by TMultiplexedProtocol::SEPARATOR. + * + * \param [in] _name The name of the method to be called in the service. + * \param [in] _type The type of message + * \param [in] _name The sequential id of the message + * + * \throws TException Passed through from wrapped TProtocol instance. + */ + uint32_t writeMessageBegin_virt(const std::string& _name, + const TMessageType _type, + const int32_t _seqid) override; + +private: + const std::string serviceName; + const std::string separator; +}; +} +} +} + +#endif // THRIFT_TMULTIPLEXEDPROTOCOL_H_ diff --git a/bsnes/thrift/thrift/protocol/TProtocol.h b/bsnes/thrift/thrift/protocol/TProtocol.h new file mode 100644 index 00000000..867ceb07 --- /dev/null +++ b/bsnes/thrift/thrift/protocol/TProtocol.h @@ -0,0 +1,750 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +#ifndef _THRIFT_PROTOCOL_TPROTOCOL_H_ +#define _THRIFT_PROTOCOL_TPROTOCOL_H_ 1 + +#ifdef _WIN32 +// Need to come before any Windows.h includes +#include +#endif + +#include +#include +#include +#include +#include +#include + +#include + +#ifdef HAVE_NETINET_IN_H +#include +#endif +#include +#include +#include +#include +#include + +// Use this to get around strict aliasing rules. +// For example, uint64_t i = bitwise_cast(returns_double()); +// The most obvious implementation is to just cast a pointer, +// but that doesn't work. +// For a pretty in-depth explanation of the problem, see +// http://cellperformance.beyond3d.com/articles/2006/06/understanding-strict-aliasing.html +template +static inline To bitwise_cast(From from) { + static_assert(sizeof(From) == sizeof(To), "sizeof(From) == sizeof(To)"); + + // BAD!!! These are all broken with -O2. + //return *reinterpret_cast(&from); // BAD!!! + //return *static_cast(static_cast(&from)); // BAD!!! + //return *(To*)(void*)&from; // BAD!!! + + // Super clean and paritally blessed by section 3.9 of the standard. + //unsigned char c[sizeof(from)]; + //memcpy(c, &from, sizeof(from)); + //To to; + //memcpy(&to, c, sizeof(c)); + //return to; + + // Slightly more questionable. + // Same code emitted by GCC. + //To to; + //memcpy(&to, &from, sizeof(from)); + //return to; + + // Technically undefined, but almost universally supported, + // and the most efficient implementation. + union { + From f; + To t; + } u; + u.f = from; + return u.t; +} + + +#ifdef HAVE_SYS_PARAM_H +#include +#endif + +#ifndef __THRIFT_BYTE_ORDER +# if defined(BYTE_ORDER) && defined(LITTLE_ENDIAN) && defined(BIG_ENDIAN) +# define __THRIFT_BYTE_ORDER BYTE_ORDER +# define __THRIFT_LITTLE_ENDIAN LITTLE_ENDIAN +# define __THRIFT_BIG_ENDIAN BIG_ENDIAN +# else +# include +# if BOOST_ENDIAN_BIG_BYTE +# define __THRIFT_BYTE_ORDER 4321 +# define __THRIFT_LITTLE_ENDIAN 0 +# define __THRIFT_BIG_ENDIAN __THRIFT_BYTE_ORDER +# elif BOOST_ENDIAN_LITTLE_BYTE +# define __THRIFT_BYTE_ORDER 1234 +# define __THRIFT_LITTLE_ENDIAN __THRIFT_BYTE_ORDER +# define __THRIFT_BIG_ENDIAN 0 +# endif +# ifdef BOOST_LITTLE_ENDIAN +# else +# endif +# endif +#endif + +#if __THRIFT_BYTE_ORDER == __THRIFT_BIG_ENDIAN +# if !defined(THRIFT_ntohll) +# define THRIFT_ntohll(n) (n) +# define THRIFT_htonll(n) (n) +# endif +# if defined(__GNUC__) && defined(__GLIBC__) +# include +# define THRIFT_htolell(n) bswap_64(n) +# define THRIFT_letohll(n) bswap_64(n) +# define THRIFT_htolel(n) bswap_32(n) +# define THRIFT_letohl(n) bswap_32(n) +# define THRIFT_htoles(n) bswap_16(n) +# define THRIFT_letohs(n) bswap_16(n) +# else /* GNUC & GLIBC */ +# define bswap_64(n) \ + ( (((n) & 0xff00000000000000ull) >> 56) \ + | (((n) & 0x00ff000000000000ull) >> 40) \ + | (((n) & 0x0000ff0000000000ull) >> 24) \ + | (((n) & 0x000000ff00000000ull) >> 8) \ + | (((n) & 0x00000000ff000000ull) << 8) \ + | (((n) & 0x0000000000ff0000ull) << 24) \ + | (((n) & 0x000000000000ff00ull) << 40) \ + | (((n) & 0x00000000000000ffull) << 56) ) +# define bswap_32(n) \ + ( (((n) & 0xff000000ul) >> 24) \ + | (((n) & 0x00ff0000ul) >> 8) \ + | (((n) & 0x0000ff00ul) << 8) \ + | (((n) & 0x000000fful) << 24) ) +# define bswap_16(n) \ + ( (((n) & ((unsigned short)0xff00ul)) >> 8) \ + | (((n) & ((unsigned short)0x00fful)) << 8) ) +# define THRIFT_htolell(n) bswap_64(n) +# define THRIFT_letohll(n) bswap_64(n) +# define THRIFT_htolel(n) bswap_32(n) +# define THRIFT_letohl(n) bswap_32(n) +# define THRIFT_htoles(n) bswap_16(n) +# define THRIFT_letohs(n) bswap_16(n) +# endif /* GNUC & GLIBC */ +#elif __THRIFT_BYTE_ORDER == __THRIFT_LITTLE_ENDIAN +# define THRIFT_htolell(n) (n) +# define THRIFT_letohll(n) (n) +# define THRIFT_htolel(n) (n) +# define THRIFT_letohl(n) (n) +# define THRIFT_htoles(n) (n) +# define THRIFT_letohs(n) (n) +# if defined(__GNUC__) && defined(__GLIBC__) +# include +# define THRIFT_ntohll(n) bswap_64(n) +# define THRIFT_htonll(n) bswap_64(n) +# elif defined(_MSC_VER) /* Microsoft Visual C++ */ +# define THRIFT_ntohll(n) ( _byteswap_uint64((uint64_t)n) ) +# define THRIFT_htonll(n) ( _byteswap_uint64((uint64_t)n) ) +# elif !defined(THRIFT_ntohll) /* Not GNUC/GLIBC or MSVC */ +# define THRIFT_ntohll(n) ( (((uint64_t)ntohl((uint32_t)n)) << 32) + ntohl((uint32_t)(n >> 32)) ) +# define THRIFT_htonll(n) ( (((uint64_t)htonl((uint32_t)n)) << 32) + htonl((uint32_t)(n >> 32)) ) +# endif /* GNUC/GLIBC or MSVC or something else */ +#else /* __THRIFT_BYTE_ORDER */ +# error "Can't define THRIFT_htonll or THRIFT_ntohll!" +#endif + +namespace apache { +namespace thrift { +namespace protocol { + +using apache::thrift::transport::TTransport; + +/** + * Abstract class for a thrift protocol driver. These are all the methods that + * a protocol must implement. Essentially, there must be some way of reading + * and writing all the base types, plus a mechanism for writing out structs + * with indexed fields. + * + * TProtocol objects should not be shared across multiple encoding contexts, + * as they may need to maintain internal state in some protocols (i.e. XML). + * Note that is is acceptable for the TProtocol module to do its own internal + * buffered reads/writes to the underlying TTransport where appropriate (i.e. + * when parsing an input XML stream, reading should be batched rather than + * looking ahead character by character for a close tag). + * + */ +class TProtocol { +public: + virtual ~TProtocol(); + + /** + * Writing functions. + */ + + virtual uint32_t writeMessageBegin_virt(const std::string& name, + const TMessageType messageType, + const int32_t seqid) = 0; + + virtual uint32_t writeMessageEnd_virt() = 0; + + virtual uint32_t writeStructBegin_virt(const char* name) = 0; + + virtual uint32_t writeStructEnd_virt() = 0; + + virtual uint32_t writeFieldBegin_virt(const char* name, + const TType fieldType, + const int16_t fieldId) = 0; + + virtual uint32_t writeFieldEnd_virt() = 0; + + virtual uint32_t writeFieldStop_virt() = 0; + + virtual uint32_t writeMapBegin_virt(const TType keyType, const TType valType, const uint32_t size) + = 0; + + virtual uint32_t writeMapEnd_virt() = 0; + + virtual uint32_t writeListBegin_virt(const TType elemType, const uint32_t size) = 0; + + virtual uint32_t writeListEnd_virt() = 0; + + virtual uint32_t writeSetBegin_virt(const TType elemType, const uint32_t size) = 0; + + virtual uint32_t writeSetEnd_virt() = 0; + + virtual uint32_t writeBool_virt(const bool value) = 0; + + virtual uint32_t writeByte_virt(const int8_t byte) = 0; + + virtual uint32_t writeI16_virt(const int16_t i16) = 0; + + virtual uint32_t writeI32_virt(const int32_t i32) = 0; + + virtual uint32_t writeI64_virt(const int64_t i64) = 0; + + virtual uint32_t writeDouble_virt(const double dub) = 0; + + virtual uint32_t writeString_virt(const std::string& str) = 0; + + virtual uint32_t writeBinary_virt(const std::string& str) = 0; + + uint32_t writeMessageBegin(const std::string& name, + const TMessageType messageType, + const int32_t seqid) { + T_VIRTUAL_CALL(); + return writeMessageBegin_virt(name, messageType, seqid); + } + + uint32_t writeMessageEnd() { + T_VIRTUAL_CALL(); + return writeMessageEnd_virt(); + } + + uint32_t writeStructBegin(const char* name) { + T_VIRTUAL_CALL(); + return writeStructBegin_virt(name); + } + + uint32_t writeStructEnd() { + T_VIRTUAL_CALL(); + return writeStructEnd_virt(); + } + + uint32_t writeFieldBegin(const char* name, const TType fieldType, const int16_t fieldId) { + T_VIRTUAL_CALL(); + return writeFieldBegin_virt(name, fieldType, fieldId); + } + + uint32_t writeFieldEnd() { + T_VIRTUAL_CALL(); + return writeFieldEnd_virt(); + } + + uint32_t writeFieldStop() { + T_VIRTUAL_CALL(); + return writeFieldStop_virt(); + } + + uint32_t writeMapBegin(const TType keyType, const TType valType, const uint32_t size) { + T_VIRTUAL_CALL(); + return writeMapBegin_virt(keyType, valType, size); + } + + uint32_t writeMapEnd() { + T_VIRTUAL_CALL(); + return writeMapEnd_virt(); + } + + uint32_t writeListBegin(const TType elemType, const uint32_t size) { + T_VIRTUAL_CALL(); + return writeListBegin_virt(elemType, size); + } + + uint32_t writeListEnd() { + T_VIRTUAL_CALL(); + return writeListEnd_virt(); + } + + uint32_t writeSetBegin(const TType elemType, const uint32_t size) { + T_VIRTUAL_CALL(); + return writeSetBegin_virt(elemType, size); + } + + uint32_t writeSetEnd() { + T_VIRTUAL_CALL(); + return writeSetEnd_virt(); + } + + uint32_t writeBool(const bool value) { + T_VIRTUAL_CALL(); + return writeBool_virt(value); + } + + uint32_t writeByte(const int8_t byte) { + T_VIRTUAL_CALL(); + return writeByte_virt(byte); + } + + uint32_t writeI16(const int16_t i16) { + T_VIRTUAL_CALL(); + return writeI16_virt(i16); + } + + uint32_t writeI32(const int32_t i32) { + T_VIRTUAL_CALL(); + return writeI32_virt(i32); + } + + uint32_t writeI64(const int64_t i64) { + T_VIRTUAL_CALL(); + return writeI64_virt(i64); + } + + uint32_t writeDouble(const double dub) { + T_VIRTUAL_CALL(); + return writeDouble_virt(dub); + } + + uint32_t writeString(const std::string& str) { + T_VIRTUAL_CALL(); + return writeString_virt(str); + } + + uint32_t writeBinary(const std::string& str) { + T_VIRTUAL_CALL(); + return writeBinary_virt(str); + } + + /** + * Reading functions + */ + + virtual uint32_t readMessageBegin_virt(std::string& name, + TMessageType& messageType, + int32_t& seqid) = 0; + + virtual uint32_t readMessageEnd_virt() = 0; + + virtual uint32_t readStructBegin_virt(std::string& name) = 0; + + virtual uint32_t readStructEnd_virt() = 0; + + virtual uint32_t readFieldBegin_virt(std::string& name, TType& fieldType, int16_t& fieldId) = 0; + + virtual uint32_t readFieldEnd_virt() = 0; + + virtual uint32_t readMapBegin_virt(TType& keyType, TType& valType, uint32_t& size) = 0; + + virtual uint32_t readMapEnd_virt() = 0; + + virtual uint32_t readListBegin_virt(TType& elemType, uint32_t& size) = 0; + + virtual uint32_t readListEnd_virt() = 0; + + virtual uint32_t readSetBegin_virt(TType& elemType, uint32_t& size) = 0; + + virtual uint32_t readSetEnd_virt() = 0; + + virtual uint32_t readBool_virt(bool& value) = 0; + + virtual uint32_t readBool_virt(std::vector::reference value) = 0; + + virtual uint32_t readByte_virt(int8_t& byte) = 0; + + virtual uint32_t readI16_virt(int16_t& i16) = 0; + + virtual uint32_t readI32_virt(int32_t& i32) = 0; + + virtual uint32_t readI64_virt(int64_t& i64) = 0; + + virtual uint32_t readDouble_virt(double& dub) = 0; + + virtual uint32_t readString_virt(std::string& str) = 0; + + virtual uint32_t readBinary_virt(std::string& str) = 0; + + uint32_t readMessageBegin(std::string& name, TMessageType& messageType, int32_t& seqid) { + T_VIRTUAL_CALL(); + return readMessageBegin_virt(name, messageType, seqid); + } + + uint32_t readMessageEnd() { + T_VIRTUAL_CALL(); + return readMessageEnd_virt(); + } + + uint32_t readStructBegin(std::string& name) { + T_VIRTUAL_CALL(); + return readStructBegin_virt(name); + } + + uint32_t readStructEnd() { + T_VIRTUAL_CALL(); + return readStructEnd_virt(); + } + + uint32_t readFieldBegin(std::string& name, TType& fieldType, int16_t& fieldId) { + T_VIRTUAL_CALL(); + return readFieldBegin_virt(name, fieldType, fieldId); + } + + uint32_t readFieldEnd() { + T_VIRTUAL_CALL(); + return readFieldEnd_virt(); + } + + uint32_t readMapBegin(TType& keyType, TType& valType, uint32_t& size) { + T_VIRTUAL_CALL(); + return readMapBegin_virt(keyType, valType, size); + } + + uint32_t readMapEnd() { + T_VIRTUAL_CALL(); + return readMapEnd_virt(); + } + + uint32_t readListBegin(TType& elemType, uint32_t& size) { + T_VIRTUAL_CALL(); + return readListBegin_virt(elemType, size); + } + + uint32_t readListEnd() { + T_VIRTUAL_CALL(); + return readListEnd_virt(); + } + + uint32_t readSetBegin(TType& elemType, uint32_t& size) { + T_VIRTUAL_CALL(); + return readSetBegin_virt(elemType, size); + } + + uint32_t readSetEnd() { + T_VIRTUAL_CALL(); + return readSetEnd_virt(); + } + + uint32_t readBool(bool& value) { + T_VIRTUAL_CALL(); + return readBool_virt(value); + } + + uint32_t readByte(int8_t& byte) { + T_VIRTUAL_CALL(); + return readByte_virt(byte); + } + + uint32_t readI16(int16_t& i16) { + T_VIRTUAL_CALL(); + return readI16_virt(i16); + } + + uint32_t readI32(int32_t& i32) { + T_VIRTUAL_CALL(); + return readI32_virt(i32); + } + + uint32_t readI64(int64_t& i64) { + T_VIRTUAL_CALL(); + return readI64_virt(i64); + } + + uint32_t readDouble(double& dub) { + T_VIRTUAL_CALL(); + return readDouble_virt(dub); + } + + uint32_t readString(std::string& str) { + T_VIRTUAL_CALL(); + return readString_virt(str); + } + + uint32_t readBinary(std::string& str) { + T_VIRTUAL_CALL(); + return readBinary_virt(str); + } + + /* + * std::vector is specialized for bool, and its elements are individual bits + * rather than bools. We need to define a different version of readBool() + * to work with std::vector. + */ + uint32_t readBool(std::vector::reference value) { + T_VIRTUAL_CALL(); + return readBool_virt(value); + } + + /** + * Method to arbitrarily skip over data. + */ + uint32_t skip(TType type) { + T_VIRTUAL_CALL(); + return skip_virt(type); + } + virtual uint32_t skip_virt(TType type); + + inline std::shared_ptr getTransport() { return ptrans_; } + + // TODO: remove these two calls, they are for backwards + // compatibility + inline std::shared_ptr getInputTransport() { return ptrans_; } + inline std::shared_ptr getOutputTransport() { return ptrans_; } + + // input and output recursion depth are kept separate so that one protocol + // can be used concurrently for both input and output. + void incrementInputRecursionDepth() { + if (recursion_limit_ < ++input_recursion_depth_) { + throw TProtocolException(TProtocolException::DEPTH_LIMIT); + } + } + void decrementInputRecursionDepth() { --input_recursion_depth_; } + + void incrementOutputRecursionDepth() { + if (recursion_limit_ < ++output_recursion_depth_) { + throw TProtocolException(TProtocolException::DEPTH_LIMIT); + } + } + void decrementOutputRecursionDepth() { --output_recursion_depth_; } + + uint32_t getRecursionLimit() const {return recursion_limit_;} + void setRecurisionLimit(uint32_t depth) {recursion_limit_ = depth;} + + // Returns the minimum amount of bytes needed to store the smallest possible instance of TType. + virtual int getMinSerializedSize(TType type) { + THRIFT_UNUSED_VARIABLE(type); + return 0; + } + +protected: + TProtocol(std::shared_ptr ptrans) + : ptrans_(ptrans), input_recursion_depth_(0), output_recursion_depth_(0), + recursion_limit_(ptrans->getConfiguration()->getRecursionLimit()) + {} + + virtual void checkReadBytesAvailable(TSet& set) + { + ptrans_->checkReadBytesAvailable(set.size_ * getMinSerializedSize(set.elemType_)); + } + + virtual void checkReadBytesAvailable(TList& list) + { + ptrans_->checkReadBytesAvailable(list.size_ * getMinSerializedSize(list.elemType_)); + } + + virtual void checkReadBytesAvailable(TMap& map) + { + int elmSize = getMinSerializedSize(map.keyType_) + getMinSerializedSize(map.valueType_); + ptrans_->checkReadBytesAvailable(map.size_ * elmSize); + } + + std::shared_ptr ptrans_; + +private: + TProtocol() = default; + uint32_t input_recursion_depth_; + uint32_t output_recursion_depth_; + uint32_t recursion_limit_; +}; + +/** + * Constructs input and output protocol objects given transports. + */ +class TProtocolFactory { +public: + TProtocolFactory() = default; + + virtual ~TProtocolFactory(); + + virtual std::shared_ptr getProtocol(std::shared_ptr trans) = 0; + virtual std::shared_ptr getProtocol(std::shared_ptr inTrans, + std::shared_ptr outTrans) { + (void)outTrans; + return getProtocol(inTrans); + } +}; + +/** + * Dummy protocol class. + * + * This class does nothing, and should never be instantiated. + * It is used only by the generator code. + */ +class TDummyProtocol : public TProtocol {}; + +// This is the default / legacy choice +struct TNetworkBigEndian +{ + static uint16_t toWire16(uint16_t x) {return htons(x);} + static uint32_t toWire32(uint32_t x) {return htonl(x);} + static uint64_t toWire64(uint64_t x) {return THRIFT_htonll(x);} + static uint16_t fromWire16(uint16_t x) {return ntohs(x);} + static uint32_t fromWire32(uint32_t x) {return ntohl(x);} + static uint64_t fromWire64(uint64_t x) {return THRIFT_ntohll(x);} +}; + +// On most systems, this will be a bit faster than TNetworkBigEndian +struct TNetworkLittleEndian +{ + static uint16_t toWire16(uint16_t x) {return THRIFT_htoles(x);} + static uint32_t toWire32(uint32_t x) {return THRIFT_htolel(x);} + static uint64_t toWire64(uint64_t x) {return THRIFT_htolell(x);} + static uint16_t fromWire16(uint16_t x) {return THRIFT_letohs(x);} + static uint32_t fromWire32(uint32_t x) {return THRIFT_letohl(x);} + static uint64_t fromWire64(uint64_t x) {return THRIFT_letohll(x);} +}; + +struct TOutputRecursionTracker { + TProtocol &prot_; + TOutputRecursionTracker(TProtocol &prot) : prot_(prot) { + prot_.incrementOutputRecursionDepth(); + } + ~TOutputRecursionTracker() { + prot_.decrementOutputRecursionDepth(); + } +}; + +struct TInputRecursionTracker { + TProtocol &prot_; + TInputRecursionTracker(TProtocol &prot) : prot_(prot) { + prot_.incrementInputRecursionDepth(); + } + ~TInputRecursionTracker() { + prot_.decrementInputRecursionDepth(); + } +}; + +/** + * Helper template for implementing TProtocol::skip(). + * + * Templatized to avoid having to make virtual function calls. + */ +template +uint32_t skip(Protocol_& prot, TType type) { + TInputRecursionTracker tracker(prot); + + switch (type) { + case T_BOOL: { + bool boolv; + return prot.readBool(boolv); + } + case T_BYTE: { + int8_t bytev = 0; + return prot.readByte(bytev); + } + case T_I16: { + int16_t i16; + return prot.readI16(i16); + } + case T_I32: { + int32_t i32; + return prot.readI32(i32); + } + case T_I64: { + int64_t i64; + return prot.readI64(i64); + } + case T_DOUBLE: { + double dub; + return prot.readDouble(dub); + } + case T_STRING: { + std::string str; + return prot.readBinary(str); + } + case T_STRUCT: { + uint32_t result = 0; + std::string name; + int16_t fid; + TType ftype; + result += prot.readStructBegin(name); + while (true) { + result += prot.readFieldBegin(name, ftype, fid); + if (ftype == T_STOP) { + break; + } + result += skip(prot, ftype); + result += prot.readFieldEnd(); + } + result += prot.readStructEnd(); + return result; + } + case T_MAP: { + uint32_t result = 0; + TType keyType; + TType valType; + uint32_t i, size; + result += prot.readMapBegin(keyType, valType, size); + for (i = 0; i < size; i++) { + result += skip(prot, keyType); + result += skip(prot, valType); + } + result += prot.readMapEnd(); + return result; + } + case T_SET: { + uint32_t result = 0; + TType elemType; + uint32_t i, size; + result += prot.readSetBegin(elemType, size); + for (i = 0; i < size; i++) { + result += skip(prot, elemType); + } + result += prot.readSetEnd(); + return result; + } + case T_LIST: { + uint32_t result = 0; + TType elemType; + uint32_t i, size; + result += prot.readListBegin(elemType, size); + for (i = 0; i < size; i++) { + result += skip(prot, elemType); + } + result += prot.readListEnd(); + return result; + } + default: + break; + } + + throw TProtocolException(TProtocolException::INVALID_DATA, + "invalid TType"); +} + +}}} // apache::thrift::protocol + +#endif // #define _THRIFT_PROTOCOL_TPROTOCOL_H_ 1 diff --git a/bsnes/thrift/thrift/protocol/TProtocolDecorator.h b/bsnes/thrift/thrift/protocol/TProtocolDecorator.h new file mode 100644 index 00000000..5258159f --- /dev/null +++ b/bsnes/thrift/thrift/protocol/TProtocolDecorator.h @@ -0,0 +1,151 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +#ifndef THRIFT_TPROTOCOLDECORATOR_H_ +#define THRIFT_TPROTOCOLDECORATOR_H_ 1 + +#include +#include + +namespace apache { +namespace thrift { +namespace protocol { +using std::shared_ptr; + +/** + * TProtocolDecorator forwards all requests to an enclosed + * TProtocol instance, providing a way to author concise + * concrete decorator subclasses. + * + *

    See p.175 of Design Patterns (by Gamma et al.)

    + * + * @see apache::thrift::protocol::TMultiplexedProtocol + */ +class TProtocolDecorator : public TProtocol { +public: + ~TProtocolDecorator() override = default; + + // Desc: Initializes the protocol decorator object. + TProtocolDecorator(shared_ptr proto) + : TProtocol(proto->getTransport()), protocol(proto) {} + + uint32_t writeMessageBegin_virt(const std::string& name, + const TMessageType messageType, + const int32_t seqid) override { + return protocol->writeMessageBegin(name, messageType, seqid); + } + uint32_t writeMessageEnd_virt() override { return protocol->writeMessageEnd(); } + uint32_t writeStructBegin_virt(const char* name) override { + return protocol->writeStructBegin(name); + } + uint32_t writeStructEnd_virt() override { return protocol->writeStructEnd(); } + + uint32_t writeFieldBegin_virt(const char* name, + const TType fieldType, + const int16_t fieldId) override { + return protocol->writeFieldBegin(name, fieldType, fieldId); + } + + uint32_t writeFieldEnd_virt() override { return protocol->writeFieldEnd(); } + uint32_t writeFieldStop_virt() override { return protocol->writeFieldStop(); } + + uint32_t writeMapBegin_virt(const TType keyType, + const TType valType, + const uint32_t size) override { + return protocol->writeMapBegin(keyType, valType, size); + } + + uint32_t writeMapEnd_virt() override { return protocol->writeMapEnd(); } + + uint32_t writeListBegin_virt(const TType elemType, const uint32_t size) override { + return protocol->writeListBegin(elemType, size); + } + uint32_t writeListEnd_virt() override { return protocol->writeListEnd(); } + + uint32_t writeSetBegin_virt(const TType elemType, const uint32_t size) override { + return protocol->writeSetBegin(elemType, size); + } + uint32_t writeSetEnd_virt() override { return protocol->writeSetEnd(); } + + uint32_t writeBool_virt(const bool value) override { return protocol->writeBool(value); } + uint32_t writeByte_virt(const int8_t byte) override { return protocol->writeByte(byte); } + uint32_t writeI16_virt(const int16_t i16) override { return protocol->writeI16(i16); } + uint32_t writeI32_virt(const int32_t i32) override { return protocol->writeI32(i32); } + uint32_t writeI64_virt(const int64_t i64) override { return protocol->writeI64(i64); } + + uint32_t writeDouble_virt(const double dub) override { return protocol->writeDouble(dub); } + uint32_t writeString_virt(const std::string& str) override { return protocol->writeString(str); } + uint32_t writeBinary_virt(const std::string& str) override { return protocol->writeBinary(str); } + + uint32_t readMessageBegin_virt(std::string& name, + TMessageType& messageType, + int32_t& seqid) override { + return protocol->readMessageBegin(name, messageType, seqid); + } + uint32_t readMessageEnd_virt() override { return protocol->readMessageEnd(); } + + uint32_t readStructBegin_virt(std::string& name) override { + return protocol->readStructBegin(name); + } + uint32_t readStructEnd_virt() override { return protocol->readStructEnd(); } + + uint32_t readFieldBegin_virt(std::string& name, TType& fieldType, int16_t& fieldId) override { + return protocol->readFieldBegin(name, fieldType, fieldId); + } + uint32_t readFieldEnd_virt() override { return protocol->readFieldEnd(); } + + uint32_t readMapBegin_virt(TType& keyType, TType& valType, uint32_t& size) override { + return protocol->readMapBegin(keyType, valType, size); + } + uint32_t readMapEnd_virt() override { return protocol->readMapEnd(); } + + uint32_t readListBegin_virt(TType& elemType, uint32_t& size) override { + return protocol->readListBegin(elemType, size); + } + uint32_t readListEnd_virt() override { return protocol->readListEnd(); } + + uint32_t readSetBegin_virt(TType& elemType, uint32_t& size) override { + return protocol->readSetBegin(elemType, size); + } + uint32_t readSetEnd_virt() override { return protocol->readSetEnd(); } + + uint32_t readBool_virt(bool& value) override { return protocol->readBool(value); } + uint32_t readBool_virt(std::vector::reference value) override { + return protocol->readBool(value); + } + + uint32_t readByte_virt(int8_t& byte) override { return protocol->readByte(byte); } + + uint32_t readI16_virt(int16_t& i16) override { return protocol->readI16(i16); } + uint32_t readI32_virt(int32_t& i32) override { return protocol->readI32(i32); } + uint32_t readI64_virt(int64_t& i64) override { return protocol->readI64(i64); } + + uint32_t readDouble_virt(double& dub) override { return protocol->readDouble(dub); } + + uint32_t readString_virt(std::string& str) override { return protocol->readString(str); } + uint32_t readBinary_virt(std::string& str) override { return protocol->readBinary(str); } + +private: + shared_ptr protocol; +}; +} +} +} + +#endif // THRIFT_TPROTOCOLDECORATOR_H_ diff --git a/bsnes/thrift/thrift/protocol/TProtocolException.h b/bsnes/thrift/thrift/protocol/TProtocolException.h new file mode 100644 index 00000000..4ace9046 --- /dev/null +++ b/bsnes/thrift/thrift/protocol/TProtocolException.h @@ -0,0 +1,107 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +#ifndef _THRIFT_PROTOCOL_TPROTOCOLEXCEPTION_H_ +#define _THRIFT_PROTOCOL_TPROTOCOLEXCEPTION_H_ 1 + +#include + +namespace apache { +namespace thrift { +namespace protocol { + +/** + * Class to encapsulate all the possible types of protocol errors that may + * occur in various protocol systems. This provides a sort of generic + * wrapper around the vague UNIX E_ error codes that lets a common code + * base of error handling to be used for various types of protocols, i.e. + * pipes etc. + * + */ +class TProtocolException : public apache::thrift::TException { +public: + /** + * Error codes for the various types of exceptions. + */ + enum TProtocolExceptionType { + UNKNOWN = 0, + INVALID_DATA = 1, + NEGATIVE_SIZE = 2, + SIZE_LIMIT = 3, + BAD_VERSION = 4, + NOT_IMPLEMENTED = 5, + DEPTH_LIMIT = 6 + }; + + TProtocolException() : apache::thrift::TException(), type_(UNKNOWN) {} + + TProtocolException(TProtocolExceptionType type) : apache::thrift::TException(), type_(type) {} + + TProtocolException(const std::string& message) + : apache::thrift::TException(message), type_(UNKNOWN) {} + + TProtocolException(TProtocolExceptionType type, const std::string& message) + : apache::thrift::TException(message), type_(type) {} + + ~TProtocolException() noexcept override = default; + + /** + * Returns an error code that provides information about the type of error + * that has occurred. + * + * @return Error code + */ + TProtocolExceptionType getType() const { return type_; } + + const char* what() const noexcept override { + if (message_.empty()) { + switch (type_) { + case UNKNOWN: + return "TProtocolException: Unknown protocol exception"; + case INVALID_DATA: + return "TProtocolException: Invalid data"; + case NEGATIVE_SIZE: + return "TProtocolException: Negative size"; + case SIZE_LIMIT: + return "TProtocolException: Exceeded size limit"; + case BAD_VERSION: + return "TProtocolException: Invalid version"; + case NOT_IMPLEMENTED: + return "TProtocolException: Not implemented"; + case DEPTH_LIMIT: + return "TProtocolException: Exceeded depth limit"; + default: + return "TProtocolException: (Invalid exception type)"; + } + } else { + return message_.c_str(); + } + } + +protected: + /** + * Error code + */ + TProtocolExceptionType type_; +}; +} +} +} // apache::thrift::protocol + +#endif // #ifndef _THRIFT_PROTOCOL_TPROTOCOLEXCEPTION_H_ diff --git a/bsnes/thrift/thrift/protocol/TProtocolTap.h b/bsnes/thrift/thrift/protocol/TProtocolTap.h new file mode 100644 index 00000000..d000ba61 --- /dev/null +++ b/bsnes/thrift/thrift/protocol/TProtocolTap.h @@ -0,0 +1,177 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +#ifndef _THRIFT_PROTOCOL_TPROTOCOLTAP_H_ +#define _THRIFT_PROTOCOL_TPROTOCOLTAP_H_ 1 + +#include + +namespace apache { +namespace thrift { +namespace protocol { + +using apache::thrift::transport::TTransport; + +/** + * Puts a wiretap on a protocol object. Any reads to this class are passed + * through to an enclosed protocol object, but also mirrored as write to a + * second protocol object. + * + */ +class TProtocolTap : public TVirtualProtocol { +public: + TProtocolTap(std::shared_ptr source, std::shared_ptr sink) + : TVirtualProtocol(source->getTransport()), source_(source), sink_(sink) {} + + uint32_t readMessageBegin(std::string& name, TMessageType& messageType, int32_t& seqid) { + uint32_t rv = source_->readMessageBegin(name, messageType, seqid); + sink_->writeMessageBegin(name, messageType, seqid); + return rv; + } + + uint32_t readMessageEnd() { + uint32_t rv = source_->readMessageEnd(); + sink_->writeMessageEnd(); + return rv; + } + + uint32_t readStructBegin(std::string& name) { + uint32_t rv = source_->readStructBegin(name); + sink_->writeStructBegin(name.c_str()); + return rv; + } + + uint32_t readStructEnd() { + uint32_t rv = source_->readStructEnd(); + sink_->writeStructEnd(); + return rv; + } + + uint32_t readFieldBegin(std::string& name, TType& fieldType, int16_t& fieldId) { + uint32_t rv = source_->readFieldBegin(name, fieldType, fieldId); + if (fieldType == T_STOP) { + sink_->writeFieldStop(); + } else { + sink_->writeFieldBegin(name.c_str(), fieldType, fieldId); + } + return rv; + } + + uint32_t readFieldEnd() { + uint32_t rv = source_->readFieldEnd(); + sink_->writeFieldEnd(); + return rv; + } + + uint32_t readMapBegin(TType& keyType, TType& valType, uint32_t& size) { + uint32_t rv = source_->readMapBegin(keyType, valType, size); + sink_->writeMapBegin(keyType, valType, size); + return rv; + } + + uint32_t readMapEnd() { + uint32_t rv = source_->readMapEnd(); + sink_->writeMapEnd(); + return rv; + } + + uint32_t readListBegin(TType& elemType, uint32_t& size) { + uint32_t rv = source_->readListBegin(elemType, size); + sink_->writeListBegin(elemType, size); + return rv; + } + + uint32_t readListEnd() { + uint32_t rv = source_->readListEnd(); + sink_->writeListEnd(); + return rv; + } + + uint32_t readSetBegin(TType& elemType, uint32_t& size) { + uint32_t rv = source_->readSetBegin(elemType, size); + sink_->writeSetBegin(elemType, size); + return rv; + } + + uint32_t readSetEnd() { + uint32_t rv = source_->readSetEnd(); + sink_->writeSetEnd(); + return rv; + } + + uint32_t readBool(bool& value) { + uint32_t rv = source_->readBool(value); + sink_->writeBool(value); + return rv; + } + + // Provide the default readBool() implementation for std::vector + using TVirtualProtocol::readBool; + + uint32_t readByte(int8_t& byte) { + uint32_t rv = source_->readByte(byte); + sink_->writeByte(byte); + return rv; + } + + uint32_t readI16(int16_t& i16) { + uint32_t rv = source_->readI16(i16); + sink_->writeI16(i16); + return rv; + } + + uint32_t readI32(int32_t& i32) { + uint32_t rv = source_->readI32(i32); + sink_->writeI32(i32); + return rv; + } + + uint32_t readI64(int64_t& i64) { + uint32_t rv = source_->readI64(i64); + sink_->writeI64(i64); + return rv; + } + + uint32_t readDouble(double& dub) { + uint32_t rv = source_->readDouble(dub); + sink_->writeDouble(dub); + return rv; + } + + uint32_t readString(std::string& str) { + uint32_t rv = source_->readString(str); + sink_->writeString(str); + return rv; + } + + uint32_t readBinary(std::string& str) { + uint32_t rv = source_->readBinary(str); + sink_->writeBinary(str); + return rv; + } + +private: + std::shared_ptr source_; + std::shared_ptr sink_; +}; +} +} +} // apache::thrift::protocol + +#endif // #define _THRIFT_PROTOCOL_TPROTOCOLTAP_H_ 1 diff --git a/bsnes/thrift/thrift/protocol/TProtocolTypes.h b/bsnes/thrift/thrift/protocol/TProtocolTypes.h new file mode 100644 index 00000000..6898b24e --- /dev/null +++ b/bsnes/thrift/thrift/protocol/TProtocolTypes.h @@ -0,0 +1,36 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +#ifndef THRIFT_PROTOCOL_TPROTOCOLTYPES_H_ +#define THRIFT_PROTOCOL_TPROTOCOLTYPES_H_ 1 + +namespace apache { +namespace thrift { +namespace protocol { + +enum PROTOCOL_TYPES { + T_BINARY_PROTOCOL = 0, + T_JSON_PROTOCOL = 1, + T_COMPACT_PROTOCOL = 2, +}; +} +} +} // apache::thrift::protocol + +#endif // #define _THRIFT_PROTOCOL_TPROTOCOLTYPES_H_ 1 diff --git a/bsnes/thrift/thrift/protocol/TSet.h b/bsnes/thrift/thrift/protocol/TSet.h new file mode 100644 index 00000000..3a4718cd --- /dev/null +++ b/bsnes/thrift/thrift/protocol/TSet.h @@ -0,0 +1,61 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +#ifndef _THRIFT_TSET_H_ +#define _THRIFT_TSET_H_ + +#include +#include + +namespace apache { +namespace thrift { +namespace protocol { + +using namespace apache::thrift::protocol; + +/** + * Helper class that encapsulates set metadata. + * + */ +class TSet { +public: + TSet() : elemType_(T_STOP), size_(0) { + + } + + TSet(TType t, int s) + : elemType_(t), + size_(s) { + + } + + TSet(TList list) + : elemType_(list.elemType_), + size_(list.size_) { + + } + + TType elemType_; + int size_; +}; +} +} +} // apache::thrift::protocol + +#endif // #ifndef _THRIFT_TSET_H_ diff --git a/bsnes/thrift/thrift/protocol/TVirtualProtocol.h b/bsnes/thrift/thrift/protocol/TVirtualProtocol.h new file mode 100644 index 00000000..b7fe929a --- /dev/null +++ b/bsnes/thrift/thrift/protocol/TVirtualProtocol.h @@ -0,0 +1,513 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +#ifndef _THRIFT_PROTOCOL_TVIRTUALPROTOCOL_H_ +#define _THRIFT_PROTOCOL_TVIRTUALPROTOCOL_H_ 1 + +#include + +namespace apache { +namespace thrift { +namespace protocol { + +using apache::thrift::transport::TTransport; + +/** + * Helper class that provides default implementations of TProtocol methods. + * + * This class provides default implementations of the non-virtual TProtocol + * methods. It exists primarily so TVirtualProtocol can derive from it. It + * prevents TVirtualProtocol methods from causing infinite recursion if the + * non-virtual methods are not overridden by the TVirtualProtocol subclass. + * + * You probably don't want to use this class directly. Use TVirtualProtocol + * instead. + */ +class TProtocolDefaults : public TProtocol { +public: + uint32_t readMessageBegin(std::string& name, TMessageType& messageType, int32_t& seqid) { + (void)name; + (void)messageType; + (void)seqid; + throw TProtocolException(TProtocolException::NOT_IMPLEMENTED, + "this protocol does not support reading (yet)."); + } + + uint32_t readMessageEnd() { + throw TProtocolException(TProtocolException::NOT_IMPLEMENTED, + "this protocol does not support reading (yet)."); + } + + uint32_t readStructBegin(std::string& name) { + (void)name; + throw TProtocolException(TProtocolException::NOT_IMPLEMENTED, + "this protocol does not support reading (yet)."); + } + + uint32_t readStructEnd() { + throw TProtocolException(TProtocolException::NOT_IMPLEMENTED, + "this protocol does not support reading (yet)."); + } + + uint32_t readFieldBegin(std::string& name, TType& fieldType, int16_t& fieldId) { + (void)name; + (void)fieldType; + (void)fieldId; + throw TProtocolException(TProtocolException::NOT_IMPLEMENTED, + "this protocol does not support reading (yet)."); + } + + uint32_t readFieldEnd() { + throw TProtocolException(TProtocolException::NOT_IMPLEMENTED, + "this protocol does not support reading (yet)."); + } + + uint32_t readMapBegin(TType& keyType, TType& valType, uint32_t& size) { + (void)keyType; + (void)valType; + (void)size; + throw TProtocolException(TProtocolException::NOT_IMPLEMENTED, + "this protocol does not support reading (yet)."); + } + + uint32_t readMapEnd() { + throw TProtocolException(TProtocolException::NOT_IMPLEMENTED, + "this protocol does not support reading (yet)."); + } + + uint32_t readListBegin(TType& elemType, uint32_t& size) { + (void)elemType; + (void)size; + throw TProtocolException(TProtocolException::NOT_IMPLEMENTED, + "this protocol does not support reading (yet)."); + } + + uint32_t readListEnd() { + throw TProtocolException(TProtocolException::NOT_IMPLEMENTED, + "this protocol does not support reading (yet)."); + } + + uint32_t readSetBegin(TType& elemType, uint32_t& size) { + (void)elemType; + (void)size; + throw TProtocolException(TProtocolException::NOT_IMPLEMENTED, + "this protocol does not support reading (yet)."); + } + + uint32_t readSetEnd() { + throw TProtocolException(TProtocolException::NOT_IMPLEMENTED, + "this protocol does not support reading (yet)."); + } + + uint32_t readBool(bool& value) { + (void)value; + throw TProtocolException(TProtocolException::NOT_IMPLEMENTED, + "this protocol does not support reading (yet)."); + } + + uint32_t readBool(std::vector::reference value) { + (void)value; + throw TProtocolException(TProtocolException::NOT_IMPLEMENTED, + "this protocol does not support reading (yet)."); + } + + uint32_t readByte(int8_t& byte) { + (void)byte; + throw TProtocolException(TProtocolException::NOT_IMPLEMENTED, + "this protocol does not support reading (yet)."); + } + + uint32_t readI16(int16_t& i16) { + (void)i16; + throw TProtocolException(TProtocolException::NOT_IMPLEMENTED, + "this protocol does not support reading (yet)."); + } + + uint32_t readI32(int32_t& i32) { + (void)i32; + throw TProtocolException(TProtocolException::NOT_IMPLEMENTED, + "this protocol does not support reading (yet)."); + } + + uint32_t readI64(int64_t& i64) { + (void)i64; + throw TProtocolException(TProtocolException::NOT_IMPLEMENTED, + "this protocol does not support reading (yet)."); + } + + uint32_t readDouble(double& dub) { + (void)dub; + throw TProtocolException(TProtocolException::NOT_IMPLEMENTED, + "this protocol does not support reading (yet)."); + } + + uint32_t readString(std::string& str) { + (void)str; + throw TProtocolException(TProtocolException::NOT_IMPLEMENTED, + "this protocol does not support reading (yet)."); + } + + uint32_t readBinary(std::string& str) { + (void)str; + throw TProtocolException(TProtocolException::NOT_IMPLEMENTED, + "this protocol does not support reading (yet)."); + } + + uint32_t writeMessageBegin(const std::string& name, + const TMessageType messageType, + const int32_t seqid) { + (void)name; + (void)messageType; + (void)seqid; + throw TProtocolException(TProtocolException::NOT_IMPLEMENTED, + "this protocol does not support writing (yet)."); + } + + uint32_t writeMessageEnd() { + throw TProtocolException(TProtocolException::NOT_IMPLEMENTED, + "this protocol does not support writing (yet)."); + } + + uint32_t writeStructBegin(const char* name) { + (void)name; + throw TProtocolException(TProtocolException::NOT_IMPLEMENTED, + "this protocol does not support writing (yet)."); + } + + uint32_t writeStructEnd() { + throw TProtocolException(TProtocolException::NOT_IMPLEMENTED, + "this protocol does not support writing (yet)."); + } + + uint32_t writeFieldBegin(const char* name, const TType fieldType, const int16_t fieldId) { + (void)name; + (void)fieldType; + (void)fieldId; + throw TProtocolException(TProtocolException::NOT_IMPLEMENTED, + "this protocol does not support writing (yet)."); + } + + uint32_t writeFieldEnd() { + throw TProtocolException(TProtocolException::NOT_IMPLEMENTED, + "this protocol does not support writing (yet)."); + } + + uint32_t writeFieldStop() { + throw TProtocolException(TProtocolException::NOT_IMPLEMENTED, + "this protocol does not support writing (yet)."); + } + + uint32_t writeMapBegin(const TType keyType, const TType valType, const uint32_t size) { + (void)keyType; + (void)valType; + (void)size; + throw TProtocolException(TProtocolException::NOT_IMPLEMENTED, + "this protocol does not support writing (yet)."); + } + + uint32_t writeMapEnd() { + throw TProtocolException(TProtocolException::NOT_IMPLEMENTED, + "this protocol does not support writing (yet)."); + } + + uint32_t writeListBegin(const TType elemType, const uint32_t size) { + (void)elemType; + (void)size; + throw TProtocolException(TProtocolException::NOT_IMPLEMENTED, + "this protocol does not support writing (yet)."); + } + + uint32_t writeListEnd() { + throw TProtocolException(TProtocolException::NOT_IMPLEMENTED, + "this protocol does not support writing (yet)."); + } + + uint32_t writeSetBegin(const TType elemType, const uint32_t size) { + (void)elemType; + (void)size; + throw TProtocolException(TProtocolException::NOT_IMPLEMENTED, + "this protocol does not support writing (yet)."); + } + + uint32_t writeSetEnd() { + throw TProtocolException(TProtocolException::NOT_IMPLEMENTED, + "this protocol does not support writing (yet)."); + } + + uint32_t writeBool(const bool value) { + (void)value; + throw TProtocolException(TProtocolException::NOT_IMPLEMENTED, + "this protocol does not support writing (yet)."); + } + + uint32_t writeByte(const int8_t byte) { + (void)byte; + throw TProtocolException(TProtocolException::NOT_IMPLEMENTED, + "this protocol does not support writing (yet)."); + } + + uint32_t writeI16(const int16_t i16) { + (void)i16; + throw TProtocolException(TProtocolException::NOT_IMPLEMENTED, + "this protocol does not support writing (yet)."); + } + + uint32_t writeI32(const int32_t i32) { + (void)i32; + throw TProtocolException(TProtocolException::NOT_IMPLEMENTED, + "this protocol does not support writing (yet)."); + } + + uint32_t writeI64(const int64_t i64) { + (void)i64; + throw TProtocolException(TProtocolException::NOT_IMPLEMENTED, + "this protocol does not support writing (yet)."); + } + + uint32_t writeDouble(const double dub) { + (void)dub; + throw TProtocolException(TProtocolException::NOT_IMPLEMENTED, + "this protocol does not support writing (yet)."); + } + + uint32_t writeString(const std::string& str) { + (void)str; + throw TProtocolException(TProtocolException::NOT_IMPLEMENTED, + "this protocol does not support writing (yet)."); + } + + uint32_t writeBinary(const std::string& str) { + (void)str; + throw TProtocolException(TProtocolException::NOT_IMPLEMENTED, + "this protocol does not support writing (yet)."); + } + + uint32_t skip(TType type) { return ::apache::thrift::protocol::skip(*this, type); } + +protected: + TProtocolDefaults(std::shared_ptr ptrans) : TProtocol(ptrans) {} +}; + +/** + * Concrete TProtocol classes should inherit from TVirtualProtocol + * so they don't have to manually override virtual methods. + */ +template +class TVirtualProtocol : public Super_ { +public: + /** + * Writing functions. + */ + + uint32_t writeMessageBegin_virt(const std::string& name, + const TMessageType messageType, + const int32_t seqid) override { + return static_cast(this)->writeMessageBegin(name, messageType, seqid); + } + + uint32_t writeMessageEnd_virt() override { + return static_cast(this)->writeMessageEnd(); + } + + uint32_t writeStructBegin_virt(const char* name) override { + return static_cast(this)->writeStructBegin(name); + } + + uint32_t writeStructEnd_virt() override { return static_cast(this)->writeStructEnd(); } + + uint32_t writeFieldBegin_virt(const char* name, + const TType fieldType, + const int16_t fieldId) override { + return static_cast(this)->writeFieldBegin(name, fieldType, fieldId); + } + + uint32_t writeFieldEnd_virt() override { return static_cast(this)->writeFieldEnd(); } + + uint32_t writeFieldStop_virt() override { return static_cast(this)->writeFieldStop(); } + + uint32_t writeMapBegin_virt(const TType keyType, + const TType valType, + const uint32_t size) override { + return static_cast(this)->writeMapBegin(keyType, valType, size); + } + + uint32_t writeMapEnd_virt() override { return static_cast(this)->writeMapEnd(); } + + uint32_t writeListBegin_virt(const TType elemType, const uint32_t size) override { + return static_cast(this)->writeListBegin(elemType, size); + } + + uint32_t writeListEnd_virt() override { return static_cast(this)->writeListEnd(); } + + uint32_t writeSetBegin_virt(const TType elemType, const uint32_t size) override { + return static_cast(this)->writeSetBegin(elemType, size); + } + + uint32_t writeSetEnd_virt() override { return static_cast(this)->writeSetEnd(); } + + uint32_t writeBool_virt(const bool value) override { + return static_cast(this)->writeBool(value); + } + + uint32_t writeByte_virt(const int8_t byte) override { + return static_cast(this)->writeByte(byte); + } + + uint32_t writeI16_virt(const int16_t i16) override { + return static_cast(this)->writeI16(i16); + } + + uint32_t writeI32_virt(const int32_t i32) override { + return static_cast(this)->writeI32(i32); + } + + uint32_t writeI64_virt(const int64_t i64) override { + return static_cast(this)->writeI64(i64); + } + + uint32_t writeDouble_virt(const double dub) override { + return static_cast(this)->writeDouble(dub); + } + + uint32_t writeString_virt(const std::string& str) override { + return static_cast(this)->writeString(str); + } + + uint32_t writeBinary_virt(const std::string& str) override { + return static_cast(this)->writeBinary(str); + } + + /** + * Reading functions + */ + + uint32_t readMessageBegin_virt(std::string& name, + TMessageType& messageType, + int32_t& seqid) override { + return static_cast(this)->readMessageBegin(name, messageType, seqid); + } + + uint32_t readMessageEnd_virt() override { return static_cast(this)->readMessageEnd(); } + + uint32_t readStructBegin_virt(std::string& name) override { + return static_cast(this)->readStructBegin(name); + } + + uint32_t readStructEnd_virt() override { return static_cast(this)->readStructEnd(); } + + uint32_t readFieldBegin_virt(std::string& name, TType& fieldType, int16_t& fieldId) override { + return static_cast(this)->readFieldBegin(name, fieldType, fieldId); + } + + uint32_t readFieldEnd_virt() override { return static_cast(this)->readFieldEnd(); } + + uint32_t readMapBegin_virt(TType& keyType, TType& valType, uint32_t& size) override { + return static_cast(this)->readMapBegin(keyType, valType, size); + } + + uint32_t readMapEnd_virt() override { return static_cast(this)->readMapEnd(); } + + uint32_t readListBegin_virt(TType& elemType, uint32_t& size) override { + return static_cast(this)->readListBegin(elemType, size); + } + + uint32_t readListEnd_virt() override { return static_cast(this)->readListEnd(); } + + uint32_t readSetBegin_virt(TType& elemType, uint32_t& size) override { + return static_cast(this)->readSetBegin(elemType, size); + } + + uint32_t readSetEnd_virt() override { return static_cast(this)->readSetEnd(); } + + uint32_t readBool_virt(bool& value) override { + return static_cast(this)->readBool(value); + } + + uint32_t readBool_virt(std::vector::reference value) override { + return static_cast(this)->readBool(value); + } + + uint32_t readByte_virt(int8_t& byte) override { + return static_cast(this)->readByte(byte); + } + + uint32_t readI16_virt(int16_t& i16) override { + return static_cast(this)->readI16(i16); + } + + uint32_t readI32_virt(int32_t& i32) override { + return static_cast(this)->readI32(i32); + } + + uint32_t readI64_virt(int64_t& i64) override { + return static_cast(this)->readI64(i64); + } + + uint32_t readDouble_virt(double& dub) override { + return static_cast(this)->readDouble(dub); + } + + uint32_t readString_virt(std::string& str) override { + return static_cast(this)->readString(str); + } + + uint32_t readBinary_virt(std::string& str) override { + return static_cast(this)->readBinary(str); + } + + uint32_t skip_virt(TType type) override { return static_cast(this)->skip(type); } + + /* + * Provide a default skip() implementation that uses non-virtual read + * methods. + * + * Note: subclasses that use TVirtualProtocol to derive from another protocol + * implementation (i.e., not TProtocolDefaults) should beware that this may + * override any non-default skip() implementation provided by the parent + * transport class. They may need to explicitly redefine skip() to call the + * correct parent implementation, if desired. + */ + uint32_t skip(TType type) { + auto* const prot = static_cast(this); + return ::apache::thrift::protocol::skip(*prot, type); + } + + /* + * Provide a default readBool() implementation for use with + * std::vector, that behaves the same as reading into a normal bool. + * + * Subclasses can override this if desired, but there normally shouldn't + * be a need to. + */ + uint32_t readBool(std::vector::reference value) { + bool b = false; + uint32_t ret = static_cast(this)->readBool(b); + value = b; + return ret; + } + using Super_::readBool; // so we don't hide readBool(bool&) + +protected: + TVirtualProtocol(std::shared_ptr ptrans) : Super_(ptrans) {} +}; +} +} +} // apache::thrift::protocol + +#endif // #define _THRIFT_PROTOCOL_TVIRTUALPROTOCOL_H_ 1 diff --git a/bsnes/thrift/thrift/qt/CMakeLists.txt b/bsnes/thrift/thrift/qt/CMakeLists.txt new file mode 100644 index 00000000..04a9a316 --- /dev/null +++ b/bsnes/thrift/thrift/qt/CMakeLists.txt @@ -0,0 +1,28 @@ +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +# + +set( thriftcppqt5_SOURCES + TQIODeviceTransport.cpp + TQTcpServer.cpp +) +set(CMAKE_AUTOMOC ON) +find_package(Qt5 REQUIRED COMPONENTS Core Network) +ADD_LIBRARY_THRIFT(thriftqt5 ${thriftcppqt5_SOURCES}) +TARGET_LINK_LIBRARIES_THRIFT(thriftqt5 Qt5::Core Qt5::Network) +TARGET_LINK_LIBRARIES_THRIFT_AGAINST_THRIFT_LIBRARY(thriftqt5 thrift) diff --git a/bsnes/thrift/thrift/qt/TQIODeviceTransport.h b/bsnes/thrift/thrift/qt/TQIODeviceTransport.h new file mode 100644 index 00000000..a3b511de --- /dev/null +++ b/bsnes/thrift/thrift/qt/TQIODeviceTransport.h @@ -0,0 +1,68 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +#ifndef _THRIFT_ASYNC_TQIODEVICE_TRANSPORT_H_ +#define _THRIFT_ASYNC_TQIODEVICE_TRANSPORT_H_ 1 + +#include + +#include + +class QIODevice; + +namespace apache { +namespace thrift { +namespace transport { + +/** + * Transport that operates on a QIODevice (socket, file, etc). + */ +class TQIODeviceTransport + : public apache::thrift::transport::TVirtualTransport { +public: + explicit TQIODeviceTransport(std::shared_ptr dev); + ~TQIODeviceTransport() override; + + void open() override; + bool isOpen() const override; + bool peek() override; + void close() override; + + uint32_t readAll(uint8_t* buf, uint32_t len); + uint32_t read(uint8_t* buf, uint32_t len); + + void write(const uint8_t* buf, uint32_t len); + uint32_t write_partial(const uint8_t* buf, uint32_t len); + + void flush() override; + + uint8_t* borrow(uint8_t* buf, uint32_t* len); + void consume(uint32_t len); + +private: + TQIODeviceTransport(const TQIODeviceTransport&); + TQIODeviceTransport& operator=(const TQIODeviceTransport&); + + std::shared_ptr dev_; +}; +} +} +} // apache::thrift::transport + +#endif // #ifndef _THRIFT_ASYNC_TQIODEVICE_TRANSPORT_H_ diff --git a/bsnes/thrift/thrift/qt/TQTcpServer.h b/bsnes/thrift/thrift/qt/TQTcpServer.h new file mode 100644 index 00000000..25994ab8 --- /dev/null +++ b/bsnes/thrift/thrift/qt/TQTcpServer.h @@ -0,0 +1,81 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +#ifndef _THRIFT_TASYNC_QTCP_SERVER_H_ +#define _THRIFT_TASYNC_QTCP_SERVER_H_ + +#include +#include + +#include + +namespace apache { +namespace thrift { +namespace protocol { +class TProtocolFactory; +} +} +} // apache::thrift::protocol + +namespace apache { +namespace thrift { +namespace async { + +class TAsyncProcessor; + +/** + * Server that uses Qt to listen for connections. + * Simply give it a QTcpServer that is listening, along with an async + * processor and a protocol factory, and then run the Qt event loop. + */ +class TQTcpServer : public QObject { + Q_OBJECT +public: + TQTcpServer(std::shared_ptr server, + std::shared_ptr processor, + std::shared_ptr protocolFactory, + QObject* parent = nullptr); + ~TQTcpServer() override; + +private Q_SLOTS: + void processIncoming(); + void beginDecode(); + void socketClosed(); + void deleteConnectionContext(QTcpSocket* connection); + +private: + Q_DISABLE_COPY(TQTcpServer) + + struct ConnectionContext; + + void scheduleDeleteConnectionContext(QTcpSocket* connection); + void finish(std::shared_ptr ctx, bool healthy); + + std::shared_ptr server_; + std::shared_ptr processor_; + std::shared_ptr pfact_; + + typedef std::map > ConnectionContextMap; + ConnectionContextMap ctxMap_; +}; +} +} +} // apache::thrift::async + +#endif // #ifndef _THRIFT_TASYNC_QTCP_SERVER_H_ diff --git a/bsnes/thrift/thrift/server/TConnectedClient.h b/bsnes/thrift/thrift/server/TConnectedClient.h new file mode 100644 index 00000000..071571a8 --- /dev/null +++ b/bsnes/thrift/thrift/server/TConnectedClient.h @@ -0,0 +1,110 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +#ifndef _THRIFT_SERVER_TCONNECTEDCLIENT_H_ +#define _THRIFT_SERVER_TCONNECTEDCLIENT_H_ 1 + +#include +#include +#include +#include +#include + +namespace apache { +namespace thrift { +namespace server { + +/** + * This represents a client connected to a TServer. The + * processing loop for a client must provide some required + * functionality common to all implementations so it is + * encapsulated here. + */ + +class TConnectedClient : public apache::thrift::concurrency::Runnable { +public: + /** + * Constructor. + * + * @param[in] processor the TProcessor + * @param[in] inputProtocol the input TProtocol + * @param[in] outputProtocol the output TProtocol + * @param[in] eventHandler the server event handler + * @param[in] client the TTransport representing the client + */ + TConnectedClient( + const std::shared_ptr& processor, + const std::shared_ptr& inputProtocol, + const std::shared_ptr& outputProtocol, + const std::shared_ptr& eventHandler, + const std::shared_ptr& client); + + /** + * Destructor. + */ + ~TConnectedClient() override; + + /** + * Drive the client until it is done. + * The client processing loop is: + * + * [optional] call eventHandler->createContext once + * [optional] call eventHandler->processContext per request + * call processor->process per request + * handle expected transport exceptions: + * END_OF_FILE means the client is gone + * INTERRUPTED means the client was interrupted + * by TServerTransport::interruptChildren() + * handle unexpected transport exceptions by logging + * handle standard exceptions by logging + * handle unexpected exceptions by logging + * cleanup() + */ + void run() override /* override */; + +protected: + /** + * Cleanup after a client. This happens if the client disconnects, + * or if the server is stopped, or if an exception occurs. + * + * The cleanup processing is: + * [optional] call eventHandler->deleteContext once + * close the inputProtocol's TTransport + * close the outputProtocol's TTransport + * close the client + */ + virtual void cleanup(); + +private: + std::shared_ptr processor_; + std::shared_ptr inputProtocol_; + std::shared_ptr outputProtocol_; + std::shared_ptr eventHandler_; + std::shared_ptr client_; + + /** + * Context acquired from the eventHandler_ if one exists. + */ + void* opaqueContext_; +}; +} +} +} + +#endif // #ifndef _THRIFT_SERVER_TCONNECTEDCLIENT_H_ diff --git a/bsnes/thrift/thrift/server/TNonblockingServer.h b/bsnes/thrift/thrift/server/TNonblockingServer.h new file mode 100644 index 00000000..65e569dc --- /dev/null +++ b/bsnes/thrift/thrift/server/TNonblockingServer.h @@ -0,0 +1,859 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +#ifndef _THRIFT_SERVER_TNONBLOCKINGSERVER_H_ +#define _THRIFT_SERVER_TNONBLOCKINGSERVER_H_ 1 + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#ifdef HAVE_UNISTD_H +#include +#endif +#include +#include +#include + +namespace apache { +namespace thrift { +namespace server { + +using apache::thrift::transport::TMemoryBuffer; +using apache::thrift::transport::TSocket; +using apache::thrift::transport::TNonblockingServerTransport; +using apache::thrift::protocol::TProtocol; +using apache::thrift::concurrency::Runnable; +using apache::thrift::concurrency::ThreadManager; +using apache::thrift::concurrency::ThreadFactory; +using apache::thrift::concurrency::Thread; +using apache::thrift::concurrency::Mutex; +using apache::thrift::concurrency::Guard; + +#ifdef LIBEVENT_VERSION_NUMBER +#define LIBEVENT_VERSION_MAJOR (LIBEVENT_VERSION_NUMBER >> 24) +#define LIBEVENT_VERSION_MINOR ((LIBEVENT_VERSION_NUMBER >> 16) & 0xFF) +#define LIBEVENT_VERSION_REL ((LIBEVENT_VERSION_NUMBER >> 8) & 0xFF) +#else +// assume latest version 1 series +#define LIBEVENT_VERSION_MAJOR 1 +#define LIBEVENT_VERSION_MINOR 14 +#define LIBEVENT_VERSION_REL 13 +#define LIBEVENT_VERSION_NUMBER \ + ((LIBEVENT_VERSION_MAJOR << 24) | (LIBEVENT_VERSION_MINOR << 16) | (LIBEVENT_VERSION_REL << 8)) +#endif + +#if LIBEVENT_VERSION_NUMBER < 0x02000000 +typedef THRIFT_SOCKET evutil_socket_t; +#endif + +#ifndef SOCKOPT_CAST_T +#ifndef _WIN32 +#define SOCKOPT_CAST_T void +#else +#define SOCKOPT_CAST_T char +#endif // _WIN32 +#endif + +template +inline const SOCKOPT_CAST_T* const_cast_sockopt(const T* v) { + return reinterpret_cast(v); +} + +template +inline SOCKOPT_CAST_T* cast_sockopt(T* v) { + return reinterpret_cast(v); +} + +/** + * This is a non-blocking server in C++ for high performance that + * operates a set of IO threads (by default only one). It assumes that + * all incoming requests are framed with a 4 byte length indicator and + * writes out responses using the same framing. + */ + +/// Overload condition actions. +enum TOverloadAction { + T_OVERLOAD_NO_ACTION, ///< Don't handle overload */ + T_OVERLOAD_CLOSE_ON_ACCEPT, ///< Drop new connections immediately */ + T_OVERLOAD_DRAIN_TASK_QUEUE ///< Drop some tasks from head of task queue */ +}; + +class TNonblockingIOThread; + +class TNonblockingServer : public TServer { +private: + class TConnection; + + friend class TNonblockingIOThread; + +private: + /// Listen backlog + static const int LISTEN_BACKLOG = 1024; + + /// Default limit on size of idle connection pool + static const size_t CONNECTION_STACK_LIMIT = 1024; + + /// Default limit on frame size + static const int MAX_FRAME_SIZE = 256 * 1024 * 1024; + + /// Default limit on total number of connected sockets + static const int MAX_CONNECTIONS = INT_MAX; + + /// Default limit on connections in handler/task processing + static const int MAX_ACTIVE_PROCESSORS = INT_MAX; + + /// Default size of write buffer + static const int WRITE_BUFFER_DEFAULT_SIZE = 1024; + + /// Maximum size of read buffer allocated to idle connection (0 = unlimited) + static const int IDLE_READ_BUFFER_LIMIT = 1024; + + /// Maximum size of write buffer allocated to idle connection (0 = unlimited) + static const int IDLE_WRITE_BUFFER_LIMIT = 1024; + + /// # of calls before resizing oversized buffers (0 = check only on close) + static const int RESIZE_BUFFER_EVERY_N = 512; + + /// # of IO threads to use by default + static const int DEFAULT_IO_THREADS = 1; + + /// # of IO threads this server will use + size_t numIOThreads_; + + /// Whether to set high scheduling priority for IO threads + bool useHighPriorityIOThreads_; + + /// Server socket file descriptor + THRIFT_SOCKET serverSocket_; + + /// The optional user-provided event-base (for single-thread servers) + event_base* userEventBase_; + + /// For processing via thread pool, may be nullptr + std::shared_ptr threadManager_; + + /// Is thread pool processing? + bool threadPoolProcessing_; + + // Factory to create the IO threads + std::shared_ptr ioThreadFactory_; + + // Vector of IOThread objects that will handle our IO + std::vector > ioThreads_; + + // Index of next IO Thread to be used (for round-robin) + uint32_t nextIOThread_; + + // Synchronizes access to connection stack and similar data + Mutex connMutex_; + + /// Number of TConnection object we've created + size_t numTConnections_; + + /// Number of Connections processing or waiting to process + size_t numActiveProcessors_; + + /// Limit for how many TConnection objects to cache + size_t connectionStackLimit_; + + /// Limit for number of connections processing or waiting to process + size_t maxActiveProcessors_; + + /// Limit for number of open connections + size_t maxConnections_; + + /// Limit for frame size + size_t maxFrameSize_; + + /// Time in milliseconds before an unperformed task expires (0 == infinite). + int64_t taskExpireTime_; + + /** + * Hysteresis for overload state. This is the fraction of the overload + * value that needs to be reached before the overload state is cleared; + * must be <= 1.0. + */ + double overloadHysteresis_; + + /// Action to take when we're overloaded. + TOverloadAction overloadAction_; + + /** + * The write buffer is initialized (and when idleWriteBufferLimit_ is checked + * and found to be exceeded, reinitialized) to this size. + */ + size_t writeBufferDefaultSize_; + + /** + * Max read buffer size for an idle TConnection. When we place an idle + * TConnection into connectionStack_ or on every resizeBufferEveryN_ calls, + * we will free the buffer (such that it will be reinitialized by the next + * received frame) if it has exceeded this limit. 0 disables this check. + */ + size_t idleReadBufferLimit_; + + /** + * Max write buffer size for an idle connection. When we place an idle + * TConnection into connectionStack_ or on every resizeBufferEveryN_ calls, + * we insure that its write buffer is <= to this size; otherwise we + * replace it with a new one of writeBufferDefaultSize_ bytes to insure that + * idle connections don't hog memory. 0 disables this check. + */ + size_t idleWriteBufferLimit_; + + /** + * Every N calls we check the buffer size limits on a connected TConnection. + * 0 disables (i.e. the checks are only done when a connection closes). + */ + int32_t resizeBufferEveryN_; + + /// Set if we are currently in an overloaded state. + bool overloaded_; + + /// Count of connections dropped since overload started + uint32_t nConnectionsDropped_; + + /// Count of connections dropped on overload since server started + uint64_t nTotalConnectionsDropped_; + + /** + * This is a stack of all the objects that have been created but that + * are NOT currently in use. When we close a connection, we place it on this + * stack so that the object can be reused later, rather than freeing the + * memory and reallocating a new object later. + */ + std::stack connectionStack_; + + /** + * This container holds pointers to all active connections. This container + * allows the server to clean up unlcosed connection objects at destruction, + * which in turn allows their transports, protocols, processors and handlers + * to deallocate and clean up correctly. + */ + std::vector activeConnections_; + + /* + */ + std::shared_ptr serverTransport_; + + /** + * Called when server socket had something happen. We accept all waiting + * client connections on listen socket fd and assign TConnection objects + * to handle those requests. + * + * @param which the event flag that triggered the handler. + */ + void handleEvent(THRIFT_SOCKET fd, short which); + + void init() { + serverSocket_ = THRIFT_INVALID_SOCKET; + numIOThreads_ = DEFAULT_IO_THREADS; + nextIOThread_ = 0; + useHighPriorityIOThreads_ = false; + userEventBase_ = nullptr; + threadPoolProcessing_ = false; + numTConnections_ = 0; + numActiveProcessors_ = 0; + connectionStackLimit_ = CONNECTION_STACK_LIMIT; + maxActiveProcessors_ = MAX_ACTIVE_PROCESSORS; + maxConnections_ = MAX_CONNECTIONS; + maxFrameSize_ = MAX_FRAME_SIZE; + taskExpireTime_ = 0; + overloadHysteresis_ = 0.8; + overloadAction_ = T_OVERLOAD_NO_ACTION; + writeBufferDefaultSize_ = WRITE_BUFFER_DEFAULT_SIZE; + idleReadBufferLimit_ = IDLE_READ_BUFFER_LIMIT; + idleWriteBufferLimit_ = IDLE_WRITE_BUFFER_LIMIT; + resizeBufferEveryN_ = RESIZE_BUFFER_EVERY_N; + overloaded_ = false; + nConnectionsDropped_ = 0; + nTotalConnectionsDropped_ = 0; + } + +public: + TNonblockingServer(const std::shared_ptr& processorFactory, + const std::shared_ptr& serverTransport) + : TServer(processorFactory), serverTransport_(serverTransport) { + init(); + } + + TNonblockingServer(const std::shared_ptr& processor, + const std::shared_ptr& serverTransport) + : TServer(processor), serverTransport_(serverTransport) { + init(); + } + + + TNonblockingServer(const std::shared_ptr& processorFactory, + const std::shared_ptr& protocolFactory, + const std::shared_ptr& serverTransport, + const std::shared_ptr& threadManager + = std::shared_ptr()) + : TServer(processorFactory), serverTransport_(serverTransport) { + init(); + + setInputProtocolFactory(protocolFactory); + setOutputProtocolFactory(protocolFactory); + setThreadManager(threadManager); + } + + TNonblockingServer(const std::shared_ptr& processor, + const std::shared_ptr& protocolFactory, + const std::shared_ptr& serverTransport, + const std::shared_ptr& threadManager + = std::shared_ptr()) + : TServer(processor), serverTransport_(serverTransport) { + init(); + + setInputProtocolFactory(protocolFactory); + setOutputProtocolFactory(protocolFactory); + setThreadManager(threadManager); + } + + TNonblockingServer(const std::shared_ptr& processorFactory, + const std::shared_ptr& inputTransportFactory, + const std::shared_ptr& outputTransportFactory, + const std::shared_ptr& inputProtocolFactory, + const std::shared_ptr& outputProtocolFactory, + const std::shared_ptr& serverTransport, + const std::shared_ptr& threadManager + = std::shared_ptr()) + : TServer(processorFactory), serverTransport_(serverTransport) { + init(); + + setInputTransportFactory(inputTransportFactory); + setOutputTransportFactory(outputTransportFactory); + setInputProtocolFactory(inputProtocolFactory); + setOutputProtocolFactory(outputProtocolFactory); + setThreadManager(threadManager); + } + + TNonblockingServer(const std::shared_ptr& processor, + const std::shared_ptr& inputTransportFactory, + const std::shared_ptr& outputTransportFactory, + const std::shared_ptr& inputProtocolFactory, + const std::shared_ptr& outputProtocolFactory, + const std::shared_ptr& serverTransport, + const std::shared_ptr& threadManager + = std::shared_ptr()) + : TServer(processor), serverTransport_(serverTransport) { + init(); + + setInputTransportFactory(inputTransportFactory); + setOutputTransportFactory(outputTransportFactory); + setInputProtocolFactory(inputProtocolFactory); + setOutputProtocolFactory(outputProtocolFactory); + setThreadManager(threadManager); + } + + ~TNonblockingServer() override; + + void setThreadManager(std::shared_ptr threadManager); + + int getListenPort() { return serverTransport_->getListenPort(); } + + std::shared_ptr getThreadManager() { return threadManager_; } + + /** + * Sets the number of IO threads used by this server. Can only be used before + * the call to serve() and has no effect afterwards. + */ + void setNumIOThreads(size_t numThreads) { + numIOThreads_ = numThreads; + // User-provided event-base doesn't works for multi-threaded servers + assert(numIOThreads_ <= 1 || !userEventBase_); + } + + /** Return whether the IO threads will get high scheduling priority */ + bool useHighPriorityIOThreads() const { return useHighPriorityIOThreads_; } + + /** Set whether the IO threads will get high scheduling priority. */ + void setUseHighPriorityIOThreads(bool val) { useHighPriorityIOThreads_ = val; } + + /** Return the number of IO threads used by this server. */ + size_t getNumIOThreads() const { return numIOThreads_; } + + /** + * Get the maximum number of unused TConnection we will hold in reserve. + * + * @return the current limit on TConnection pool size. + */ + size_t getConnectionStackLimit() const { return connectionStackLimit_; } + + /** + * Set the maximum number of unused TConnection we will hold in reserve. + * + * @param sz the new limit for TConnection pool size. + */ + void setConnectionStackLimit(size_t sz) { connectionStackLimit_ = sz; } + + bool isThreadPoolProcessing() const { return threadPoolProcessing_; } + + void addTask(std::shared_ptr task) { + threadManager_->add(task, 0LL, taskExpireTime_); + } + + /** + * Return the count of sockets currently connected to. + * + * @return count of connected sockets. + */ + size_t getNumConnections() const { return numTConnections_; } + + /** + * Return the count of sockets currently connected to. + * + * @return count of connected sockets. + */ + size_t getNumActiveConnections() const { return getNumConnections() - getNumIdleConnections(); } + + /** + * Return the count of connection objects allocated but not in use. + * + * @return count of idle connection objects. + */ + size_t getNumIdleConnections() const { return connectionStack_.size(); } + + /** + * Return count of number of connections which are currently processing. + * This is defined as a connection where all data has been received and + * either assigned a task (when threading) or passed to a handler (when + * not threading), and where the handler has not yet returned. + * + * @return # of connections currently processing. + */ + size_t getNumActiveProcessors() const { return numActiveProcessors_; } + + /// Increment the count of connections currently processing. + void incrementActiveProcessors() { + Guard g(connMutex_); + ++numActiveProcessors_; + } + + /// Decrement the count of connections currently processing. + void decrementActiveProcessors() { + Guard g(connMutex_); + if (numActiveProcessors_ > 0) { + --numActiveProcessors_; + } + } + + /** + * Get the maximum # of connections allowed before overload. + * + * @return current setting. + */ + size_t getMaxConnections() const { return maxConnections_; } + + /** + * Set the maximum # of connections allowed before overload. + * + * @param maxConnections new setting for maximum # of connections. + */ + void setMaxConnections(size_t maxConnections) { maxConnections_ = maxConnections; } + + /** + * Get the maximum # of connections waiting in handler/task before overload. + * + * @return current setting. + */ + size_t getMaxActiveProcessors() const { return maxActiveProcessors_; } + + /** + * Set the maximum # of connections waiting in handler/task before overload. + * + * @param maxActiveProcessors new setting for maximum # of active processes. + */ + void setMaxActiveProcessors(size_t maxActiveProcessors) { + maxActiveProcessors_ = maxActiveProcessors; + } + + /** + * Get the maximum allowed frame size. + * + * If a client tries to send a message larger than this limit, + * its connection will be closed. + * + * @return Maxium frame size, in bytes. + */ + size_t getMaxFrameSize() const { return maxFrameSize_; } + + /** + * Set the maximum allowed frame size. + * + * @param maxFrameSize The new maximum frame size. + */ + void setMaxFrameSize(size_t maxFrameSize) { maxFrameSize_ = maxFrameSize; } + + /** + * Get fraction of maximum limits before an overload condition is cleared. + * + * @return hysteresis fraction + */ + double getOverloadHysteresis() const { return overloadHysteresis_; } + + /** + * Set fraction of maximum limits before an overload condition is cleared. + * A good value would probably be between 0.5 and 0.9. + * + * @param hysteresisFraction fraction <= 1.0. + */ + void setOverloadHysteresis(double hysteresisFraction) { + if (hysteresisFraction <= 1.0 && hysteresisFraction > 0.0) { + overloadHysteresis_ = hysteresisFraction; + } + } + + /** + * Get the action the server will take on overload. + * + * @return a TOverloadAction enum value for the currently set action. + */ + TOverloadAction getOverloadAction() const { return overloadAction_; } + + /** + * Set the action the server is to take on overload. + * + * @param overloadAction a TOverloadAction enum value for the action. + */ + void setOverloadAction(TOverloadAction overloadAction) { overloadAction_ = overloadAction; } + + /** + * Get the time in milliseconds after which a task expires (0 == infinite). + * + * @return a 64-bit time in milliseconds. + */ + int64_t getTaskExpireTime() const { return taskExpireTime_; } + + /** + * Set the time in milliseconds after which a task expires (0 == infinite). + * + * @param taskExpireTime a 64-bit time in milliseconds. + */ + void setTaskExpireTime(int64_t taskExpireTime) { taskExpireTime_ = taskExpireTime; } + + /** + * Determine if the server is currently overloaded. + * This function checks the maximums for open connections and connections + * currently in processing, and sets an overload condition if they are + * exceeded. The overload will persist until both values are below the + * current hysteresis fraction of their maximums. + * + * @return true if an overload condition exists, false if not. + */ + bool serverOverloaded(); + + /** Pop and discard next task on threadpool wait queue. + * + * @return true if a task was discarded, false if the wait queue was empty. + */ + bool drainPendingTask(); + + /** + * Get the starting size of a TConnection object's write buffer. + * + * @return # bytes we initialize a TConnection object's write buffer to. + */ + size_t getWriteBufferDefaultSize() const { return writeBufferDefaultSize_; } + + /** + * Set the starting size of a TConnection object's write buffer. + * + * @param size # bytes we initialize a TConnection object's write buffer to. + */ + void setWriteBufferDefaultSize(size_t size) { writeBufferDefaultSize_ = size; } + + /** + * Get the maximum size of read buffer allocated to idle TConnection objects. + * + * @return # bytes beyond which we will dealloc idle buffer. + */ + size_t getIdleReadBufferLimit() const { return idleReadBufferLimit_; } + + /** + * [NOTE: This is for backwards compatibility, use getIdleReadBufferLimit().] + * Get the maximum size of read buffer allocated to idle TConnection objects. + * + * @return # bytes beyond which we will dealloc idle buffer. + */ + size_t getIdleBufferMemLimit() const { return idleReadBufferLimit_; } + + /** + * Set the maximum size read buffer allocated to idle TConnection objects. + * If a TConnection object is found (either on connection close or between + * calls when resizeBufferEveryN_ is set) with more than this much memory + * allocated to its read buffer, we free it and allow it to be reinitialized + * on the next received frame. + * + * @param limit of bytes beyond which we will shrink buffers when checked. + */ + void setIdleReadBufferLimit(size_t limit) { idleReadBufferLimit_ = limit; } + + /** + * [NOTE: This is for backwards compatibility, use setIdleReadBufferLimit().] + * Set the maximum size read buffer allocated to idle TConnection objects. + * If a TConnection object is found (either on connection close or between + * calls when resizeBufferEveryN_ is set) with more than this much memory + * allocated to its read buffer, we free it and allow it to be reinitialized + * on the next received frame. + * + * @param limit of bytes beyond which we will shrink buffers when checked. + */ + void setIdleBufferMemLimit(size_t limit) { idleReadBufferLimit_ = limit; } + + /** + * Get the maximum size of write buffer allocated to idle TConnection objects. + * + * @return # bytes beyond which we will reallocate buffers when checked. + */ + size_t getIdleWriteBufferLimit() const { return idleWriteBufferLimit_; } + + /** + * Set the maximum size write buffer allocated to idle TConnection objects. + * If a TConnection object is found (either on connection close or between + * calls when resizeBufferEveryN_ is set) with more than this much memory + * allocated to its write buffer, we destroy and construct that buffer with + * writeBufferDefaultSize_ bytes. + * + * @param limit of bytes beyond which we will shrink buffers when idle. + */ + void setIdleWriteBufferLimit(size_t limit) { idleWriteBufferLimit_ = limit; } + + /** + * Get # of calls made between buffer size checks. 0 means disabled. + * + * @return # of calls between buffer size checks. + */ + int32_t getResizeBufferEveryN() const { return resizeBufferEveryN_; } + + /** + * Check buffer sizes every "count" calls. This allows buffer limits + * to be enforced for persistent connections with a controllable degree + * of overhead. 0 disables checks except at connection close. + * + * @param count the number of calls between checks, or 0 to disable + */ + void setResizeBufferEveryN(int32_t count) { resizeBufferEveryN_ = count; } + + /** + * Main workhorse function, starts up the server listening on a port and + * loops over the libevent handler. + */ + void serve() override; + + /** + * Causes the server to terminate gracefully (can be called from any thread). + */ + void stop() override; + + /// Creates a socket to listen on and binds it to the local port. + void createAndListenOnSocket(); + + /** + * Register the optional user-provided event-base (for single-thread servers) + * + * This method should be used when the server is running in a single-thread + * mode, and the event base is provided by the user (i.e., the caller). + * + * @param user_event_base the user-provided event-base. The user is + * responsible for freeing the event base memory. + */ + void registerEvents(event_base* user_event_base); + + /** + * Returns the optional user-provided event-base (for single-thread servers). + */ + event_base* getUserEventBase() const { return userEventBase_; } + + /** Some transports, like THeaderTransport, require passing through + * the framing size instead of stripping it. + */ + bool getHeaderTransport(); + +private: + /** + * Callback function that the threadmanager calls when a task reaches + * its expiration time. It is needed to clean up the expired connection. + * + * @param task the runnable associated with the expired task. + */ + void expireClose(std::shared_ptr task); + + /** + * Return an initialized connection object. Creates or recovers from + * pool a TConnection and initializes it with the provided socket FD + * and flags. + * + * @param socket FD of socket associated with this connection. + * @param addr the sockaddr of the client + * @param addrLen the length of addr + * @return pointer to initialized TConnection object. + */ + TConnection* createConnection(std::shared_ptr socket); + + /** + * Returns a connection to pool or deletion. If the connection pool + * (a stack) isn't full, place the connection object on it, otherwise + * just delete it. + * + * @param connection the TConection being returned. + */ + void returnConnection(TConnection* connection); +}; + +class TNonblockingIOThread : public Runnable { +public: + // Creates an IO thread and sets up the event base. The listenSocket should + // be a valid FD on which listen() has already been called. If the + // listenSocket is < 0, accepting will not be done. + TNonblockingIOThread(TNonblockingServer* server, + int number, + THRIFT_SOCKET listenSocket, + bool useHighPriority); + + ~TNonblockingIOThread() override; + + // Returns the event-base for this thread. + event_base* getEventBase() const { return eventBase_; } + + // Returns the server for this thread. + TNonblockingServer* getServer() const { return server_; } + + // Returns the number of this IO thread. + int getThreadNumber() const { return number_; } + + // Returns the thread id associated with this object. This should + // only be called after the thread has been started. + Thread::id_t getThreadId() const { return threadId_; } + + // Returns the send-fd for task complete notifications. + evutil_socket_t getNotificationSendFD() const { return notificationPipeFDs_[1]; } + + // Returns the read-fd for task complete notifications. + evutil_socket_t getNotificationRecvFD() const { return notificationPipeFDs_[0]; } + + // Returns the actual thread object associated with this IO thread. + std::shared_ptr getThread() const { return thread_; } + + // Sets the actual thread object associated with this IO thread. + void setThread(const std::shared_ptr& t) { thread_ = t; } + + // Used by TConnection objects to indicate processing has finished. + bool notify(TNonblockingServer::TConnection* conn); + + // Enters the event loop and does not return until a call to stop(). + void run() override; + + // Exits the event loop as soon as possible. + void stop(); + + // Ensures that the event-loop thread is fully finished and shut down. + void join(); + + /// Registers the events for the notification & listen sockets + void registerEvents(); + +private: + /** + * C-callable event handler for signaling task completion. Provides a + * callback that libevent can understand that will read a connection + * object's address from a pipe and call connection->transition() for + * that object. + * + * @param fd the descriptor the event occurred on. + */ + static void notifyHandler(evutil_socket_t fd, short which, void* v); + + /** + * C-callable event handler for listener events. Provides a callback + * that libevent can understand which invokes server->handleEvent(). + * + * @param fd the descriptor the event occurred on. + * @param which the flags associated with the event. + * @param v void* callback arg where we placed TNonblockingServer's "this". + */ + static void listenHandler(evutil_socket_t fd, short which, void* v) { + ((TNonblockingServer*)v)->handleEvent(fd, which); + } + + /// Exits the loop ASAP in case of shutdown or error. + void breakLoop(bool error); + + /// Create the pipe used to notify I/O process of task completion. + void createNotificationPipe(); + + /// Unregisters our events for notification and listen sockets. + void cleanupEvents(); + + /// Sets (or clears) high priority scheduling status for the current thread. + void setCurrentThreadHighPriority(bool value); + +private: + /// associated server + TNonblockingServer* server_; + + /// thread number (for debugging). + const int number_; + + /// The actual physical thread id. + Thread::id_t threadId_; + + /// If listenSocket_ >= 0, adds an event on the event_base to accept conns + THRIFT_SOCKET listenSocket_; + + /// Sets a high scheduling priority when running + bool useHighPriority_; + + /// pointer to eventbase to be used for looping + event_base* eventBase_; + + /// Set to true if this class is responsible for freeing the event base + /// memory. + bool ownEventBase_; + + /// Used with eventBase_ for connection events (only in listener thread) + struct event serverEvent_; + + /// Used with eventBase_ for task completion notification + struct event notificationEvent_; + + /// File descriptors for pipe used for task completion notification. + evutil_socket_t notificationPipeFDs_[2]; + + /// Actual IO Thread + std::shared_ptr thread_; +}; +} +} +} // apache::thrift::server + +#endif // #ifndef _THRIFT_SERVER_TNONBLOCKINGSERVER_H_ diff --git a/bsnes/thrift/thrift/server/TServer.h b/bsnes/thrift/thrift/server/TServer.h new file mode 100644 index 00000000..d2eabde1 --- /dev/null +++ b/bsnes/thrift/thrift/server/TServer.h @@ -0,0 +1,273 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +#ifndef _THRIFT_SERVER_TSERVER_H_ +#define _THRIFT_SERVER_TSERVER_H_ 1 + +#include +#include +#include +#include + +#include + +namespace apache { +namespace thrift { +namespace server { + +using apache::thrift::TProcessor; +using apache::thrift::protocol::TBinaryProtocolFactory; +using apache::thrift::protocol::TProtocol; +using apache::thrift::protocol::TProtocolFactory; +using apache::thrift::transport::TServerTransport; +using apache::thrift::transport::TTransport; +using apache::thrift::transport::TTransportFactory; + +/** + * Virtual interface class that can handle events from the server core. To + * use this you should subclass it and implement the methods that you care + * about. Your subclass can also store local data that you may care about, + * such as additional "arguments" to these methods (stored in the object + * instance's state). + */ +class TServerEventHandler { +public: + virtual ~TServerEventHandler() = default; + + /** + * Called before the server begins. + */ + virtual void preServe() {} + + /** + * Called when a new client has connected and is about to being processing. + */ + virtual void* createContext(std::shared_ptr input, + std::shared_ptr output) { + (void)input; + (void)output; + return nullptr; + } + + /** + * Called when a client has finished request-handling to delete server + * context. + */ + virtual void deleteContext(void* serverContext, + std::shared_ptr input, + std::shared_ptr output) { + (void)serverContext; + (void)input; + (void)output; + } + + /** + * Called when a client is about to call the processor. + */ + virtual void processContext(void* serverContext, std::shared_ptr transport) { + (void)serverContext; + (void)transport; + } + +protected: + /** + * Prevent direct instantiation. + */ + TServerEventHandler() = default; +}; + +/** + * Thrift server. + * + */ +class TServer : public concurrency::Runnable { +public: + ~TServer() override = default; + + virtual void serve() = 0; + + virtual void stop() {} + + // Allows running the server as a Runnable thread + void run() override { serve(); } + + std::shared_ptr getProcessorFactory() { return processorFactory_; } + + std::shared_ptr getServerTransport() { return serverTransport_; } + + std::shared_ptr getInputTransportFactory() { return inputTransportFactory_; } + + std::shared_ptr getOutputTransportFactory() { + return outputTransportFactory_; + } + + std::shared_ptr getInputProtocolFactory() { return inputProtocolFactory_; } + + std::shared_ptr getOutputProtocolFactory() { return outputProtocolFactory_; } + + std::shared_ptr getEventHandler() { return eventHandler_; } + +protected: + TServer(const std::shared_ptr& processorFactory) + : processorFactory_(processorFactory) { + setInputTransportFactory(std::shared_ptr(new TTransportFactory())); + setOutputTransportFactory(std::shared_ptr(new TTransportFactory())); + setInputProtocolFactory(std::shared_ptr(new TBinaryProtocolFactory())); + setOutputProtocolFactory(std::shared_ptr(new TBinaryProtocolFactory())); + } + + TServer(const std::shared_ptr& processor) + : processorFactory_(new TSingletonProcessorFactory(processor)) { + setInputTransportFactory(std::shared_ptr(new TTransportFactory())); + setOutputTransportFactory(std::shared_ptr(new TTransportFactory())); + setInputProtocolFactory(std::shared_ptr(new TBinaryProtocolFactory())); + setOutputProtocolFactory(std::shared_ptr(new TBinaryProtocolFactory())); + } + + TServer(const std::shared_ptr& processorFactory, + const std::shared_ptr& serverTransport) + : processorFactory_(processorFactory), serverTransport_(serverTransport) { + setInputTransportFactory(std::shared_ptr(new TTransportFactory())); + setOutputTransportFactory(std::shared_ptr(new TTransportFactory())); + setInputProtocolFactory(std::shared_ptr(new TBinaryProtocolFactory())); + setOutputProtocolFactory(std::shared_ptr(new TBinaryProtocolFactory())); + } + + TServer(const std::shared_ptr& processor, + const std::shared_ptr& serverTransport) + : processorFactory_(new TSingletonProcessorFactory(processor)), + serverTransport_(serverTransport) { + setInputTransportFactory(std::shared_ptr(new TTransportFactory())); + setOutputTransportFactory(std::shared_ptr(new TTransportFactory())); + setInputProtocolFactory(std::shared_ptr(new TBinaryProtocolFactory())); + setOutputProtocolFactory(std::shared_ptr(new TBinaryProtocolFactory())); + } + + TServer(const std::shared_ptr& processorFactory, + const std::shared_ptr& serverTransport, + const std::shared_ptr& transportFactory, + const std::shared_ptr& protocolFactory) + : processorFactory_(processorFactory), + serverTransport_(serverTransport), + inputTransportFactory_(transportFactory), + outputTransportFactory_(transportFactory), + inputProtocolFactory_(protocolFactory), + outputProtocolFactory_(protocolFactory) {} + + TServer(const std::shared_ptr& processor, + const std::shared_ptr& serverTransport, + const std::shared_ptr& transportFactory, + const std::shared_ptr& protocolFactory) + : processorFactory_(new TSingletonProcessorFactory(processor)), + serverTransport_(serverTransport), + inputTransportFactory_(transportFactory), + outputTransportFactory_(transportFactory), + inputProtocolFactory_(protocolFactory), + outputProtocolFactory_(protocolFactory) {} + + TServer(const std::shared_ptr& processorFactory, + const std::shared_ptr& serverTransport, + const std::shared_ptr& inputTransportFactory, + const std::shared_ptr& outputTransportFactory, + const std::shared_ptr& inputProtocolFactory, + const std::shared_ptr& outputProtocolFactory) + : processorFactory_(processorFactory), + serverTransport_(serverTransport), + inputTransportFactory_(inputTransportFactory), + outputTransportFactory_(outputTransportFactory), + inputProtocolFactory_(inputProtocolFactory), + outputProtocolFactory_(outputProtocolFactory) {} + + TServer(const std::shared_ptr& processor, + const std::shared_ptr& serverTransport, + const std::shared_ptr& inputTransportFactory, + const std::shared_ptr& outputTransportFactory, + const std::shared_ptr& inputProtocolFactory, + const std::shared_ptr& outputProtocolFactory) + : processorFactory_(new TSingletonProcessorFactory(processor)), + serverTransport_(serverTransport), + inputTransportFactory_(inputTransportFactory), + outputTransportFactory_(outputTransportFactory), + inputProtocolFactory_(inputProtocolFactory), + outputProtocolFactory_(outputProtocolFactory) {} + + /** + * Get a TProcessor to handle calls on a particular connection. + * + * This method should only be called once per connection (never once per + * call). This allows the TProcessorFactory to return a different processor + * for each connection if it desires. + */ + std::shared_ptr getProcessor(std::shared_ptr inputProtocol, + std::shared_ptr outputProtocol, + std::shared_ptr transport) { + TConnectionInfo connInfo; + connInfo.input = inputProtocol; + connInfo.output = outputProtocol; + connInfo.transport = transport; + return processorFactory_->getProcessor(connInfo); + } + + // Class variables + std::shared_ptr processorFactory_; + std::shared_ptr serverTransport_; + + std::shared_ptr inputTransportFactory_; + std::shared_ptr outputTransportFactory_; + + std::shared_ptr inputProtocolFactory_; + std::shared_ptr outputProtocolFactory_; + + std::shared_ptr eventHandler_; + +public: + void setInputTransportFactory(std::shared_ptr inputTransportFactory) { + inputTransportFactory_ = inputTransportFactory; + } + + void setOutputTransportFactory(std::shared_ptr outputTransportFactory) { + outputTransportFactory_ = outputTransportFactory; + } + + void setInputProtocolFactory(std::shared_ptr inputProtocolFactory) { + inputProtocolFactory_ = inputProtocolFactory; + } + + void setOutputProtocolFactory(std::shared_ptr outputProtocolFactory) { + outputProtocolFactory_ = outputProtocolFactory; + } + + void setServerEventHandler(std::shared_ptr eventHandler) { + eventHandler_ = eventHandler; + } +}; + +/** + * Helper function to increase the max file descriptors limit + * for the current process and all of its children. + * By default, tries to increase it to as much as 2^24. + */ +#ifdef HAVE_SYS_RESOURCE_H +int increase_max_fds(int max_fds = (1 << 24)); +#endif +} +} +} // apache::thrift::server + +#endif // #ifndef _THRIFT_SERVER_TSERVER_H_ diff --git a/bsnes/thrift/thrift/server/TServerFramework.h b/bsnes/thrift/thrift/server/TServerFramework.h new file mode 100644 index 00000000..dac79ef5 --- /dev/null +++ b/bsnes/thrift/thrift/server/TServerFramework.h @@ -0,0 +1,184 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +#ifndef _THRIFT_SERVER_TSERVERFRAMEWORK_H_ +#define _THRIFT_SERVER_TSERVERFRAMEWORK_H_ 1 + +#include +#include +#include +#include +#include +#include +#include +#include + +namespace apache { +namespace thrift { +namespace server { + +/** + * TServerFramework provides a single consolidated processing loop for + * servers. By having a single processing loop, behavior between servers + * is more predictable and maintenance cost is lowered. Implementations + * of TServerFramework must provide a method to deal with a client that + * connects and one that disconnects. + * + * While this functionality could be rolled directly into TServer, and + * probably should be, it would break the TServer interface contract so + * to maintain backwards compatibility for third party servers, no TServers + * were harmed in the making of this class. + */ +class TServerFramework : public TServer { +public: + TServerFramework( + const std::shared_ptr& processorFactory, + const std::shared_ptr& serverTransport, + const std::shared_ptr& transportFactory, + const std::shared_ptr& protocolFactory); + + TServerFramework( + const std::shared_ptr& processor, + const std::shared_ptr& serverTransport, + const std::shared_ptr& transportFactory, + const std::shared_ptr& protocolFactory); + + TServerFramework( + const std::shared_ptr& processorFactory, + const std::shared_ptr& serverTransport, + const std::shared_ptr& inputTransportFactory, + const std::shared_ptr& outputTransportFactory, + const std::shared_ptr& inputProtocolFactory, + const std::shared_ptr& outputProtocolFactory); + + TServerFramework( + const std::shared_ptr& processor, + const std::shared_ptr& serverTransport, + const std::shared_ptr& inputTransportFactory, + const std::shared_ptr& outputTransportFactory, + const std::shared_ptr& inputProtocolFactory, + const std::shared_ptr& outputProtocolFactory); + + ~TServerFramework() override; + + /** + * Accept clients from the TServerTransport and add them for processing. + * Call stop() on another thread to interrupt processing + * and return control to the caller. + * Post-conditions (return guarantees): + * The serverTransport will be closed. + */ + void serve() override; + + /** + * Interrupt serve() so that it meets post-conditions and returns. + */ + void stop() override; + + /** + * Get the concurrent client limit. + * \returns the concurrent client limit + */ + virtual int64_t getConcurrentClientLimit() const; + + /** + * Get the number of currently connected clients. + * \returns the number of currently connected clients + */ + virtual int64_t getConcurrentClientCount() const; + + /** + * Get the highest number of concurrent clients. + * \returns the highest number of concurrent clients + */ + virtual int64_t getConcurrentClientCountHWM() const; + + /** + * Set the concurrent client limit. This can be changed while + * the server is serving however it will not necessarily be + * enforced until the next client is accepted and added. If the + * limit is lowered below the number of connected clients, no + * action is taken to disconnect the clients. + * The default value used if this is not called is INT64_MAX. + * \param[in] newLimit the new limit of concurrent clients + * \throws std::invalid_argument if newLimit is less than 1 + */ + virtual void setConcurrentClientLimit(int64_t newLimit); + +protected: + /** + * A client has connected. The implementation is responsible for managing the + * lifetime of the client object. This is called during the serve() thread, + * therefore a failure to return quickly will result in new client connection + * delays. + * + * \param[in] pClient the newly connected client + */ + virtual void onClientConnected(const std::shared_ptr& pClient) = 0; + + /** + * A client has disconnected. + * When called: + * The server no longer tracks the client. + * The client TTransport has already been closed. + * The implementation must not delete the pointer. + * + * \param[in] pClient the disconnected client + */ + virtual void onClientDisconnected(TConnectedClient* pClient) = 0; + +private: + /** + * Common handling for new connected clients. Implements concurrent + * client rate limiting after onClientConnected returns by blocking the + * serve() thread if the limit has been reached. + */ + void newlyConnectedClient(const std::shared_ptr& pClient); + + /** + * Smart pointer client deletion. + * Calls onClientDisconnected and then deletes pClient. + */ + void disposeConnectedClient(TConnectedClient* pClient); + + /** + * Monitor for limiting the number of concurrent clients. + */ + apache::thrift::concurrency::Monitor mon_; + + /** + * The number of concurrent clients. + */ + int64_t clients_; + + /** + * The high water mark of concurrent clients. + */ + int64_t hwm_; + + /** + * The limit on the number of concurrent clients. + */ + int64_t limit_; +}; +} +} +} // apache::thrift::server + +#endif // #ifndef _THRIFT_SERVER_TSERVERFRAMEWORK_H_ diff --git a/bsnes/thrift/thrift/server/TSimpleServer.h b/bsnes/thrift/thrift/server/TSimpleServer.h new file mode 100644 index 00000000..3afeb79d --- /dev/null +++ b/bsnes/thrift/thrift/server/TSimpleServer.h @@ -0,0 +1,77 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +#ifndef _THRIFT_SERVER_TSIMPLESERVER_H_ +#define _THRIFT_SERVER_TSIMPLESERVER_H_ 1 + +#include + +namespace apache { +namespace thrift { +namespace server { + +/** + * This is the most basic simple server. It is single-threaded and runs a + * continuous loop of accepting a single connection, processing requests on + * that connection until it closes, and then repeating. + */ +class TSimpleServer : public TServerFramework { +public: + TSimpleServer( + const std::shared_ptr& processorFactory, + const std::shared_ptr& serverTransport, + const std::shared_ptr& transportFactory, + const std::shared_ptr& protocolFactory); + + TSimpleServer( + const std::shared_ptr& processor, + const std::shared_ptr& serverTransport, + const std::shared_ptr& transportFactory, + const std::shared_ptr& protocolFactory); + + TSimpleServer( + const std::shared_ptr& processorFactory, + const std::shared_ptr& serverTransport, + const std::shared_ptr& inputTransportFactory, + const std::shared_ptr& outputTransportFactory, + const std::shared_ptr& inputProtocolFactory, + const std::shared_ptr& outputProtocolFactory); + + TSimpleServer( + const std::shared_ptr& processor, + const std::shared_ptr& serverTransport, + const std::shared_ptr& inputTransportFactory, + const std::shared_ptr& outputTransportFactory, + const std::shared_ptr& inputProtocolFactory, + const std::shared_ptr& outputProtocolFactory); + + ~TSimpleServer() override; + +protected: + void onClientConnected(const std::shared_ptr& pClient) override /* override */; + void onClientDisconnected(TConnectedClient* pClient) override /* override */; + +private: + void setConcurrentClientLimit(int64_t newLimit) override; // hide +}; +} +} +} // apache::thrift::server + +#endif // #ifndef _THRIFT_SERVER_TSIMPLESERVER_H_ diff --git a/bsnes/thrift/thrift/server/TThreadPoolServer.h b/bsnes/thrift/thrift/server/TThreadPoolServer.h new file mode 100644 index 00000000..a9411b86 --- /dev/null +++ b/bsnes/thrift/thrift/server/TThreadPoolServer.h @@ -0,0 +1,101 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +#ifndef _THRIFT_SERVER_TTHREADPOOLSERVER_H_ +#define _THRIFT_SERVER_TTHREADPOOLSERVER_H_ 1 + +#include +#include +#include + +namespace apache { +namespace thrift { +namespace server { + +/** + * Manage clients using a thread pool. + */ +class TThreadPoolServer : public TServerFramework { +public: + TThreadPoolServer( + const std::shared_ptr& processorFactory, + const std::shared_ptr& serverTransport, + const std::shared_ptr& transportFactory, + const std::shared_ptr& protocolFactory, + const std::shared_ptr& threadManager + = apache::thrift::concurrency::ThreadManager::newSimpleThreadManager()); + + TThreadPoolServer( + const std::shared_ptr& processor, + const std::shared_ptr& serverTransport, + const std::shared_ptr& transportFactory, + const std::shared_ptr& protocolFactory, + const std::shared_ptr& threadManager + = apache::thrift::concurrency::ThreadManager::newSimpleThreadManager()); + + TThreadPoolServer( + const std::shared_ptr& processorFactory, + const std::shared_ptr& serverTransport, + const std::shared_ptr& inputTransportFactory, + const std::shared_ptr& outputTransportFactory, + const std::shared_ptr& inputProtocolFactory, + const std::shared_ptr& outputProtocolFactory, + const std::shared_ptr& threadManager + = apache::thrift::concurrency::ThreadManager::newSimpleThreadManager()); + + TThreadPoolServer( + const std::shared_ptr& processor, + const std::shared_ptr& serverTransport, + const std::shared_ptr& inputTransportFactory, + const std::shared_ptr& outputTransportFactory, + const std::shared_ptr& inputProtocolFactory, + const std::shared_ptr& outputProtocolFactory, + const std::shared_ptr& threadManager + = apache::thrift::concurrency::ThreadManager::newSimpleThreadManager()); + + ~TThreadPoolServer() override; + + /** + * Post-conditions (return guarantees): + * There will be no clients connected. + */ + void serve() override; + + virtual int64_t getTimeout() const; + virtual void setTimeout(int64_t value); + + virtual int64_t getTaskExpiration() const; + virtual void setTaskExpiration(int64_t value); + + virtual std::shared_ptr getThreadManager() const; + +protected: + void onClientConnected(const std::shared_ptr& pClient) override /* override */; + void onClientDisconnected(TConnectedClient* pClient) override /* override */; + + std::shared_ptr threadManager_; + std::atomic timeout_; + std::atomic taskExpiration_; +}; + +} +} +} // apache::thrift::server + +#endif // #ifndef _THRIFT_SERVER_TTHREADPOOLSERVER_H_ diff --git a/bsnes/thrift/thrift/server/TThreadedServer.h b/bsnes/thrift/thrift/server/TThreadedServer.h new file mode 100644 index 00000000..756e5a06 --- /dev/null +++ b/bsnes/thrift/thrift/server/TThreadedServer.h @@ -0,0 +1,143 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +#ifndef _THRIFT_SERVER_TTHREADEDSERVER_H_ +#define _THRIFT_SERVER_TTHREADEDSERVER_H_ 1 + +#include +#include +#include +#include +#include + +namespace apache { +namespace thrift { +namespace server { + +/** + * Manage clients using threads - threads are created one for each client and are + * released when the client disconnects. This server is used to make a dynamically + * scalable server up to the concurrent connection limit. + */ +class TThreadedServer : public TServerFramework { +public: + TThreadedServer( + const std::shared_ptr& processorFactory, + const std::shared_ptr& serverTransport, + const std::shared_ptr& transportFactory, + const std::shared_ptr& protocolFactory, + const std::shared_ptr& threadFactory + = std::shared_ptr( + new apache::thrift::concurrency::ThreadFactory(false))); + + TThreadedServer( + const std::shared_ptr& processor, + const std::shared_ptr& serverTransport, + const std::shared_ptr& transportFactory, + const std::shared_ptr& protocolFactory, + const std::shared_ptr& threadFactory + = std::shared_ptr( + new apache::thrift::concurrency::ThreadFactory(false))); + + TThreadedServer( + const std::shared_ptr& processorFactory, + const std::shared_ptr& serverTransport, + const std::shared_ptr& inputTransportFactory, + const std::shared_ptr& outputTransportFactory, + const std::shared_ptr& inputProtocolFactory, + const std::shared_ptr& outputProtocolFactory, + const std::shared_ptr& threadFactory + = std::shared_ptr( + new apache::thrift::concurrency::ThreadFactory(false))); + + TThreadedServer( + const std::shared_ptr& processor, + const std::shared_ptr& serverTransport, + const std::shared_ptr& inputTransportFactory, + const std::shared_ptr& outputTransportFactory, + const std::shared_ptr& inputProtocolFactory, + const std::shared_ptr& outputProtocolFactory, + const std::shared_ptr& threadFactory + = std::shared_ptr( + new apache::thrift::concurrency::ThreadFactory(false))); + + ~TThreadedServer() override; + + /** + * Post-conditions (return guarantees): + * There will be no clients connected. + */ + void serve() override; + +protected: + /** + * Drain recently connected clients by joining their threads - this is done lazily because + * we cannot do it inside the thread context that is disconnecting. + */ + virtual void drainDeadClients(); + + /** + * Implementation of TServerFramework::onClientConnected + */ + void onClientConnected(const std::shared_ptr& pClient) override /* override */; + + /** + * Implementation of TServerFramework::onClientDisconnected + */ + void onClientDisconnected(TConnectedClient *pClient) override /* override */; + + std::shared_ptr threadFactory_; + + /** + * A helper wrapper used to wrap the client in something we can use to maintain + * the lifetime of the connected client within a detached thread. We cannot simply + * track the threads because a shared_ptr hangs on to the Runnable it is + * passed, and TServerFramework requires the runnable (TConnectedClient) to be + * destroyed in order to work properly. + */ + class TConnectedClientRunner : public apache::thrift::concurrency::Runnable + { + public: + TConnectedClientRunner(const std::shared_ptr& pClient); + ~TConnectedClientRunner() override; + void run() override /* override */; + private: + std::shared_ptr pClient_; + }; + + apache::thrift::concurrency::Monitor clientMonitor_; + + typedef std::map > ClientMap; + + /** + * A map of active clients + */ + ClientMap activeClientMap_; + + /** + * A map of clients that have disconnected but their threads have not been joined + */ + ClientMap deadClientMap_; +}; + +} +} +} // apache::thrift::server + +#endif // #ifndef _THRIFT_SERVER_TTHREADEDSERVER_H_ diff --git a/bsnes/thrift/thrift/thrift-config.h b/bsnes/thrift/thrift/thrift-config.h new file mode 100644 index 00000000..d648706c --- /dev/null +++ b/bsnes/thrift/thrift/thrift-config.h @@ -0,0 +1,24 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +#ifdef _WIN32 +#include +#else +#include +#endif diff --git a/bsnes/thrift/thrift/thrift_export.h b/bsnes/thrift/thrift/thrift_export.h new file mode 100644 index 00000000..f5c059fb --- /dev/null +++ b/bsnes/thrift/thrift/thrift_export.h @@ -0,0 +1,20 @@ +#ifndef THRIFT_EXPORT_H +#define THRIFT_EXPORT_H + +#ifdef THRIFT_STATIC_DEFINE +# define THRIFT_EXPORT +#elif defined(_MSC_VER ) +# ifndef THRIFT_EXPORT +# ifdef thrift_EXPORTS + /* We are building this library */ +# define THRIFT_EXPORT __declspec(dllexport) +# else + /* We are using this library */ +# define THRIFT_EXPORT __declspec(dllimport) +# endif +# endif +#else +# define THRIFT_EXPORT +#endif + +#endif /* THRIFT_EXPORT_H */ diff --git a/bsnes/thrift/thrift/transport/PlatformSocket.h b/bsnes/thrift/thrift/transport/PlatformSocket.h new file mode 100644 index 00000000..10df9446 --- /dev/null +++ b/bsnes/thrift/thrift/transport/PlatformSocket.h @@ -0,0 +1,128 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +// clang-format off + +#ifndef _THRIFT_TRANSPORT_PLATFORM_SOCKET_H_ +# define _THRIFT_TRANSPORT_PLATFORM_SOCKET_H_ + +#ifdef _WIN32 +# include +# define THRIFT_GET_SOCKET_ERROR ::WSAGetLastError() +# define THRIFT_ERRNO (*_errno()) +# define THRIFT_EINPROGRESS WSAEINPROGRESS +# define THRIFT_EAGAIN WSAEWOULDBLOCK +# define THRIFT_EINTR WSAEINTR +# define THRIFT_ECONNRESET WSAECONNRESET +# define THRIFT_ENOTCONN WSAENOTCONN +# define THRIFT_ETIMEDOUT WSAETIMEDOUT +# define THRIFT_EWOULDBLOCK WSAEWOULDBLOCK +# define THRIFT_EPIPE WSAECONNRESET +# define THRIFT_NO_SOCKET_CACHING SO_EXCLUSIVEADDRUSE +# define THRIFT_SOCKET SOCKET +# define THRIFT_INVALID_SOCKET INVALID_SOCKET +# define THRIFT_SOCKETPAIR thrift_socketpair +# define THRIFT_FCNTL thrift_fcntl +# define THRIFT_O_NONBLOCK 1 +# define THRIFT_F_GETFL 0 +# define THRIFT_F_SETFL 1 +# define THRIFT_GETTIMEOFDAY thrift_gettimeofday +# define THRIFT_CLOSESOCKET closesocket +# define THRIFT_CLOSE _close +# define THRIFT_OPEN _open +# define THRIFT_FTRUNCATE _chsize_s +# define THRIFT_FSYNC _commit +# define THRIFT_LSEEK _lseek +# define THRIFT_WRITE _write +# define THRIFT_READ _read +# define THRIFT_IOCTL_SOCKET ioctlsocket +# define THRIFT_IOCTL_SOCKET_NUM_BYTES_TYPE u_long +# define THRIFT_FSTAT _fstat +# define THRIFT_STAT _stat +# ifdef _WIN32_WCE +# define THRIFT_GAI_STRERROR(...) thrift_wstr2str(gai_strerrorW(__VA_ARGS__)) +# else +# define THRIFT_GAI_STRERROR gai_strerrorA +# endif +# define THRIFT_SSIZET ptrdiff_t +# if (_MSC_VER < 1900) +# define THRIFT_SNPRINTF _snprintf +# else +# define THRIFT_SNPRINTF snprintf +# endif +# define THRIFT_SLEEP_SEC thrift_sleep +# define THRIFT_SLEEP_USEC thrift_usleep +# define THRIFT_TIMESPEC thrift_timespec +# define THRIFT_CTIME_R thrift_ctime_r +# define THRIFT_POLL WSAPoll +# define THRIFT_POLLFD pollfd +# define THRIFT_POLLIN POLLIN +# define THRIFT_POLLOUT POLLOUT +# define THRIFT_SHUT_RDWR SD_BOTH +# if !defined(AI_ADDRCONFIG) +# define AI_ADDRCONFIG 0x00000400 +# endif +#else //not _WIN32 +# include +# define THRIFT_GET_SOCKET_ERROR errno +# define THRIFT_ERRNO errno +# define THRIFT_EINTR EINTR +# define THRIFT_EINPROGRESS EINPROGRESS +# define THRIFT_ECONNRESET ECONNRESET +# define THRIFT_ENOTCONN ENOTCONN +# define THRIFT_ETIMEDOUT ETIMEDOUT +# define THRIFT_EWOULDBLOCK EWOULDBLOCK +# define THRIFT_EAGAIN EAGAIN +# define THRIFT_EPIPE EPIPE +# define THRIFT_NO_SOCKET_CACHING SO_REUSEADDR +# define THRIFT_SOCKET int +# define THRIFT_INVALID_SOCKET (-1) +# define THRIFT_SOCKETPAIR socketpair +# define THRIFT_FCNTL fcntl +# define THRIFT_O_NONBLOCK O_NONBLOCK +# define THRIFT_F_GETFL F_GETFL +# define THRIFT_F_SETFL F_SETFL +# define THRIFT_GETTIMEOFDAY gettimeofday +# define THRIFT_CLOSESOCKET close +# define THRIFT_CLOSE close +# define THRIFT_OPEN open +# define THRIFT_FTRUNCATE ftruncate +# define THRIFT_FSYNC fsync +# define THRIFT_LSEEK lseek +# define THRIFT_WRITE write +# define THRIFT_READ read +# define THRIFT_IOCTL_SOCKET ioctl +# define THRIFT_IOCTL_SOCKET_NUM_BYTES_TYPE int +# define THRIFT_STAT stat +# define THRIFT_FSTAT fstat +# define THRIFT_GAI_STRERROR gai_strerror +# define THRIFT_SSIZET ssize_t +# define THRIFT_SNPRINTF snprintf +# define THRIFT_SLEEP_SEC sleep +# define THRIFT_SLEEP_USEC usleep +# define THRIFT_TIMESPEC timespec +# define THRIFT_CTIME_R ctime_r +# define THRIFT_POLL poll +# define THRIFT_POLLFD pollfd +# define THRIFT_POLLIN POLLIN +# define THRIFT_POLLOUT POLLOUT +# define THRIFT_SHUT_RDWR SHUT_RDWR +#endif + +#endif // _THRIFT_TRANSPORT_PLATFORM_SOCKET_H_ diff --git a/bsnes/thrift/thrift/transport/SocketCommon.h b/bsnes/thrift/thrift/transport/SocketCommon.h new file mode 100644 index 00000000..78839c4e --- /dev/null +++ b/bsnes/thrift/thrift/transport/SocketCommon.h @@ -0,0 +1,51 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * + * @author: David Suárez + */ + +#ifndef THRIFT_SOCKETCOMMON_H +#define THRIFT_SOCKETCOMMON_H + +#ifndef _WIN32 + +#include + +#ifdef HAVE_UNISTD_H +#include +#endif + +#ifdef HAVE_SYS_UN_H +#include +#endif + +#include + +namespace apache { +namespace thrift { +namespace transport { + +socklen_t fillUnixSocketAddr(struct sockaddr_un& address, std::string& path); + +} +} +} // apache::thrift::transport + +#endif // _WIN32 + +#endif //THRIFT_SOCKETCOMMON_H diff --git a/bsnes/thrift/thrift/transport/TBufferTransports.h b/bsnes/thrift/thrift/transport/TBufferTransports.h new file mode 100644 index 00000000..179934ba --- /dev/null +++ b/bsnes/thrift/thrift/transport/TBufferTransports.h @@ -0,0 +1,765 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +#ifndef _THRIFT_TRANSPORT_TBUFFERTRANSPORTS_H_ +#define _THRIFT_TRANSPORT_TBUFFERTRANSPORTS_H_ 1 + +#include +#include +#include +#include + +#include +#include + +#ifdef __GNUC__ +#define TDB_LIKELY(val) (__builtin_expect((val), 1)) +#define TDB_UNLIKELY(val) (__builtin_expect((val), 0)) +#else +#define TDB_LIKELY(val) (val) +#define TDB_UNLIKELY(val) (val) +#endif + +namespace apache { +namespace thrift { +namespace transport { + +/** + * Base class for all transports that use read/write buffers for performance. + * + * TBufferBase is designed to implement the fast-path "memcpy" style + * operations that work in the common case. It does so with small and + * (eventually) nonvirtual, inlinable methods. TBufferBase is an abstract + * class. Subclasses are expected to define the "slow path" operations + * that have to be done when the buffers are full or empty. + * + */ +class TBufferBase : public TVirtualTransport { + +public: + /** + * Fast-path read. + * + * When we have enough data buffered to fulfill the read, we can satisfy it + * with a single memcpy, then adjust our internal pointers. If the buffer + * is empty, we call out to our slow path, implemented by a subclass. + * This method is meant to eventually be nonvirtual and inlinable. + */ + uint32_t read(uint8_t* buf, uint32_t len) { + checkReadBytesAvailable(len); + uint8_t* new_rBase = rBase_ + len; + if (TDB_LIKELY(new_rBase <= rBound_)) { + std::memcpy(buf, rBase_, len); + rBase_ = new_rBase; + return len; + } + return readSlow(buf, len); + } + + /** + * Shortcutted version of readAll. + */ + uint32_t readAll(uint8_t* buf, uint32_t len) { + uint8_t* new_rBase = rBase_ + len; + if (TDB_LIKELY(new_rBase <= rBound_)) { + std::memcpy(buf, rBase_, len); + rBase_ = new_rBase; + return len; + } + return apache::thrift::transport::readAll(*this, buf, len); + } + + /** + * Fast-path write. + * + * When we have enough empty space in our buffer to accommodate the write, we + * can satisfy it with a single memcpy, then adjust our internal pointers. + * If the buffer is full, we call out to our slow path, implemented by a + * subclass. This method is meant to eventually be nonvirtual and + * inlinable. + */ + void write(const uint8_t* buf, uint32_t len) { + uint8_t* new_wBase = wBase_ + len; + if (TDB_LIKELY(new_wBase <= wBound_)) { + std::memcpy(wBase_, buf, len); + wBase_ = new_wBase; + return; + } + writeSlow(buf, len); + } + + /** + * Fast-path borrow. A lot like the fast-path read. + */ + const uint8_t* borrow(uint8_t* buf, uint32_t* len) { + if (TDB_LIKELY(static_cast(*len) <= rBound_ - rBase_)) { + // With strict aliasing, writing to len shouldn't force us to + // refetch rBase_ from memory. TODO(dreiss): Verify this. + *len = static_cast(rBound_ - rBase_); + return rBase_; + } + return borrowSlow(buf, len); + } + + /** + * Consume doesn't require a slow path. + */ + void consume(uint32_t len) { + countConsumedMessageBytes(len); + if (TDB_LIKELY(static_cast(len) <= rBound_ - rBase_)) { + rBase_ += len; + } else { + throw TTransportException(TTransportException::BAD_ARGS, "consume did not follow a borrow."); + } + } + +protected: + /// Slow path read. + virtual uint32_t readSlow(uint8_t* buf, uint32_t len) = 0; + + /// Slow path write. + virtual void writeSlow(const uint8_t* buf, uint32_t len) = 0; + + /** + * Slow path borrow. + * + * POSTCONDITION: return == nullptr || rBound_ - rBase_ >= *len + */ + virtual const uint8_t* borrowSlow(uint8_t* buf, uint32_t* len) = 0; + + /** + * Trivial constructor. + * + * Initialize pointers safely. Constructing is not a very + * performance-sensitive operation, so it is okay to just leave it to + * the concrete class to set up pointers correctly. + */ + TBufferBase(std::shared_ptr config = nullptr) + : TVirtualTransport(config), rBase_(nullptr), rBound_(nullptr), wBase_(nullptr), wBound_(nullptr) {} + + /// Convenience mutator for setting the read buffer. + void setReadBuffer(uint8_t* buf, uint32_t len) { + rBase_ = buf; + rBound_ = buf + len; + } + + /// Convenience mutator for setting the write buffer. + void setWriteBuffer(uint8_t* buf, uint32_t len) { + wBase_ = buf; + wBound_ = buf + len; + } + + ~TBufferBase() override = default; + + /// Reads begin here. + uint8_t* rBase_; + /// Reads may extend to just before here. + uint8_t* rBound_; + + /// Writes begin here. + uint8_t* wBase_; + /// Writes may extend to just before here. + uint8_t* wBound_; +}; + +/** + * Buffered transport. For reads it will read more data than is requested + * and will serve future data out of a local buffer. For writes, data is + * stored to an in memory buffer before being written out. + * + */ +class TBufferedTransport : public TVirtualTransport { +public: + static const int DEFAULT_BUFFER_SIZE = 512; + + /// Use default buffer sizes. + TBufferedTransport(std::shared_ptr transport, std::shared_ptr config = nullptr) + : TVirtualTransport(config), + transport_(transport), + rBufSize_(DEFAULT_BUFFER_SIZE), + wBufSize_(DEFAULT_BUFFER_SIZE), + rBuf_(new uint8_t[rBufSize_]), + wBuf_(new uint8_t[wBufSize_]) { + initPointers(); + } + + /// Use specified buffer sizes. + TBufferedTransport(std::shared_ptr transport, uint32_t sz, std::shared_ptr config = nullptr) + : TVirtualTransport(config), + transport_(transport), + rBufSize_(sz), + wBufSize_(sz), + rBuf_(new uint8_t[rBufSize_]), + wBuf_(new uint8_t[wBufSize_]) { + initPointers(); + } + + /// Use specified read and write buffer sizes. + TBufferedTransport(std::shared_ptr transport, uint32_t rsz, uint32_t wsz, + std::shared_ptr config = nullptr) + : TVirtualTransport(config), + transport_(transport), + rBufSize_(rsz), + wBufSize_(wsz), + rBuf_(new uint8_t[rBufSize_]), + wBuf_(new uint8_t[wBufSize_]) { + initPointers(); + } + + void open() override { transport_->open(); } + + bool isOpen() const override { return transport_->isOpen(); } + + bool peek() override { + if (rBase_ == rBound_) { + setReadBuffer(rBuf_.get(), transport_->read(rBuf_.get(), rBufSize_)); + } + return (rBound_ > rBase_); + } + + void close() override { + flush(); + transport_->close(); + } + + uint32_t readSlow(uint8_t* buf, uint32_t len) override; + + void writeSlow(const uint8_t* buf, uint32_t len) override; + + void flush() override; + + /** + * Returns the origin of the underlying transport + */ + const std::string getOrigin() const override { return transport_->getOrigin(); } + + /** + * The following behavior is currently implemented by TBufferedTransport, + * but that may change in a future version: + * 1/ If len is at most rBufSize_, borrow will never return nullptr. + * Depending on the underlying transport, it could throw an exception + * or hang forever. + * 2/ Some borrow requests may copy bytes internally. However, + * if len is at most rBufSize_/2, none of the copied bytes + * will ever have to be copied again. For optimial performance, + * stay under this limit. + */ + const uint8_t* borrowSlow(uint8_t* buf, uint32_t* len) override; + + std::shared_ptr getUnderlyingTransport() { return transport_; } + + /* + * TVirtualTransport provides a default implementation of readAll(). + * We want to use the TBufferBase version instead. + */ + uint32_t readAll(uint8_t* buf, uint32_t len) { return TBufferBase::readAll(buf, len); } + +protected: + void initPointers() { + setReadBuffer(rBuf_.get(), 0); + setWriteBuffer(wBuf_.get(), wBufSize_); + // Write size never changes. + } + + std::shared_ptr transport_; + + uint32_t rBufSize_; + uint32_t wBufSize_; + boost::scoped_array rBuf_; + boost::scoped_array wBuf_; +}; + +/** + * Wraps a transport into a buffered one. + * + */ +class TBufferedTransportFactory : public TTransportFactory { +public: + TBufferedTransportFactory() = default; + + ~TBufferedTransportFactory() override = default; + + /** + * Wraps the transport into a buffered one. + */ + std::shared_ptr getTransport(std::shared_ptr trans) override { + return std::shared_ptr(new TBufferedTransport(trans)); + } +}; + +/** + * Framed transport. All writes go into an in-memory buffer until flush is + * called, at which point the transport writes the length of the entire + * binary chunk followed by the data payload. This allows the receiver on the + * other end to always do fixed-length reads. + * + */ +class TFramedTransport : public TVirtualTransport { +public: + static const int DEFAULT_BUFFER_SIZE = 512; + static const int DEFAULT_MAX_FRAME_SIZE = 256 * 1024 * 1024; + + /// Use default buffer sizes. + TFramedTransport(std::shared_ptr config = nullptr) + : TVirtualTransport(config), + transport_(), + rBufSize_(0), + wBufSize_(DEFAULT_BUFFER_SIZE), + rBuf_(), + wBuf_(new uint8_t[wBufSize_]), + bufReclaimThresh_((std::numeric_limits::max)()) { + initPointers(); + } + + TFramedTransport(std::shared_ptr transport, std::shared_ptr config = nullptr) + : TVirtualTransport(config), + transport_(transport), + rBufSize_(0), + wBufSize_(DEFAULT_BUFFER_SIZE), + rBuf_(), + wBuf_(new uint8_t[wBufSize_]), + bufReclaimThresh_((std::numeric_limits::max)()), + maxFrameSize_(configuration_->getMaxFrameSize()) { + initPointers(); + } + + TFramedTransport(std::shared_ptr transport, + uint32_t sz, + uint32_t bufReclaimThresh = (std::numeric_limits::max)(), + std::shared_ptr config = nullptr) + : TVirtualTransport(config), + transport_(transport), + rBufSize_(0), + wBufSize_(sz), + rBuf_(), + wBuf_(new uint8_t[wBufSize_]), + bufReclaimThresh_(bufReclaimThresh), + maxFrameSize_(configuration_->getMaxFrameSize()) { + initPointers(); + } + + void open() override { transport_->open(); } + + bool isOpen() const override { return transport_->isOpen(); } + + bool peek() override { return (rBase_ < rBound_) || transport_->peek(); } + + void close() override { + flush(); + transport_->close(); + } + + uint32_t readSlow(uint8_t* buf, uint32_t len) override; + + void writeSlow(const uint8_t* buf, uint32_t len) override; + + void flush() override; + + uint32_t readEnd() override; + + uint32_t writeEnd() override; + + const uint8_t* borrowSlow(uint8_t* buf, uint32_t* len) override; + + std::shared_ptr getUnderlyingTransport() { return transport_; } + + /* + * TVirtualTransport provides a default implementation of readAll(). + * We want to use the TBufferBase version instead. + */ + using TBufferBase::readAll; + + /** + * Returns the origin of the underlying transport + */ + const std::string getOrigin() const override { return transport_->getOrigin(); } + + /** + * Set the maximum size of the frame at read + */ + void setMaxFrameSize(uint32_t maxFrameSize) { maxFrameSize_ = maxFrameSize; } + + /** + * Get the maximum size of the frame at read + */ + uint32_t getMaxFrameSize() { return maxFrameSize_; } + +protected: + /** + * Reads a frame of input from the underlying stream. + * + * Returns true if a frame was read successfully, or false on EOF. + * (Raises a TTransportException if EOF occurs after a partial frame.) + */ + virtual bool readFrame(); + + void initPointers() { + setReadBuffer(nullptr, 0); + setWriteBuffer(wBuf_.get(), wBufSize_); + + // Pad the buffer so we can insert the size later. + int32_t pad = 0; + this->write((uint8_t*)&pad, sizeof(pad)); + } + + std::shared_ptr transport_; + + uint32_t rBufSize_; + uint32_t wBufSize_; + boost::scoped_array rBuf_; + boost::scoped_array wBuf_; + uint32_t bufReclaimThresh_; + uint32_t maxFrameSize_; +}; + +/** + * Wraps a transport into a framed one. + * + */ +class TFramedTransportFactory : public TTransportFactory { +public: + TFramedTransportFactory() = default; + + ~TFramedTransportFactory() override = default; + + /** + * Wraps the transport into a framed one. + */ + std::shared_ptr getTransport(std::shared_ptr trans) override { + return std::shared_ptr(new TFramedTransport(trans)); + } +}; + +/** + * A memory buffer is a tranpsort that simply reads from and writes to an + * in memory buffer. Anytime you call write on it, the data is simply placed + * into a buffer, and anytime you call read, data is read from that buffer. + * + * The buffers are allocated using C constructs malloc,realloc, and the size + * doubles as necessary. We've considered using scoped + * + */ +class TMemoryBuffer : public TVirtualTransport { +private: + // Common initialization done by all constructors. + void initCommon(uint8_t* buf, uint32_t size, bool owner, uint32_t wPos) { + + maxBufferSize_ = (std::numeric_limits::max)(); + + if (buf == nullptr && size != 0) { + assert(owner); + buf = (uint8_t*)std::malloc(size); + if (buf == nullptr) { + throw std::bad_alloc(); + } + } + + buffer_ = buf; + bufferSize_ = size; + + rBase_ = buffer_; + rBound_ = buffer_ + wPos; + // TODO(dreiss): Investigate NULL-ing this if !owner. + wBase_ = buffer_ + wPos; + wBound_ = buffer_ + bufferSize_; + + owner_ = owner; + + // rBound_ is really an artifact. In principle, it should always be + // equal to wBase_. We update it in a few places (computeRead, etc.). + } + +public: + static const uint32_t defaultSize = 1024; + + /** + * This enum specifies how a TMemoryBuffer should treat + * memory passed to it via constructors or resetBuffer. + * + * OBSERVE: + * TMemoryBuffer will simply store a pointer to the memory. + * It is the callers responsibility to ensure that the pointer + * remains valid for the lifetime of the TMemoryBuffer, + * and that it is properly cleaned up. + * Note that no data can be written to observed buffers. + * + * COPY: + * TMemoryBuffer will make an internal copy of the buffer. + * The caller has no responsibilities. + * + * TAKE_OWNERSHIP: + * TMemoryBuffer will become the "owner" of the buffer, + * and will be responsible for freeing it. + * The membory must have been allocated with malloc. + */ + enum MemoryPolicy { OBSERVE = 1, COPY = 2, TAKE_OWNERSHIP = 3 }; + + /** + * Construct a TMemoryBuffer with a default-sized buffer, + * owned by the TMemoryBuffer object. + */ + TMemoryBuffer(std::shared_ptr config = nullptr) + : TVirtualTransport(config) { + initCommon(nullptr, defaultSize, true, 0); + } + + /** + * Construct a TMemoryBuffer with a buffer of a specified size, + * owned by the TMemoryBuffer object. + * + * @param sz The initial size of the buffer. + */ + TMemoryBuffer(uint32_t sz, std::shared_ptr config = nullptr) + : TVirtualTransport(config) { + initCommon(nullptr, sz, true, 0); + } + + /** + * Construct a TMemoryBuffer with buf as its initial contents. + * + * @param buf The initial contents of the buffer. + * Note that, while buf is a non-const pointer, + * TMemoryBuffer will not write to it if policy == OBSERVE, + * so it is safe to const_cast(whatever). + * @param sz The size of @c buf. + * @param policy See @link MemoryPolicy @endlink . + */ + TMemoryBuffer(uint8_t* buf, uint32_t sz, MemoryPolicy policy = OBSERVE, std::shared_ptr config = nullptr) + : TVirtualTransport(config) { + if (buf == nullptr && sz != 0) { + throw TTransportException(TTransportException::BAD_ARGS, + "TMemoryBuffer given null buffer with non-zero size."); + } + + switch (policy) { + case OBSERVE: + case TAKE_OWNERSHIP: + initCommon(buf, sz, policy == TAKE_OWNERSHIP, sz); + break; + case COPY: + initCommon(nullptr, sz, true, 0); + this->write(buf, sz); + break; + default: + throw TTransportException(TTransportException::BAD_ARGS, + "Invalid MemoryPolicy for TMemoryBuffer"); + } + } + + ~TMemoryBuffer() override { + if (owner_) { + std::free(buffer_); + } + } + + bool isOpen() const override { return true; } + + bool peek() override { return (rBase_ < wBase_); } + + void open() override {} + + void close() override {} + + // TODO(dreiss): Make bufPtr const. + void getBuffer(uint8_t** bufPtr, uint32_t* sz) { + *bufPtr = rBase_; + *sz = static_cast(wBase_ - rBase_); + } + + std::string getBufferAsString() { + if (buffer_ == nullptr) { + return ""; + } + uint8_t* buf; + uint32_t sz; + getBuffer(&buf, &sz); + return std::string((char*)buf, (std::string::size_type)sz); + } + + void appendBufferToString(std::string& str) { + if (buffer_ == nullptr) { + return; + } + uint8_t* buf; + uint32_t sz; + getBuffer(&buf, &sz); + str.append((char*)buf, sz); + } + + void resetBuffer() { + rBase_ = buffer_; + rBound_ = buffer_; + wBase_ = buffer_; + // It isn't safe to write into a buffer we don't own. + if (!owner_) { + wBound_ = wBase_; + bufferSize_ = 0; + } + } + + /// See constructor documentation. + void resetBuffer(uint8_t* buf, uint32_t sz, MemoryPolicy policy = OBSERVE) { + // Use a variant of the copy-and-swap trick for assignment operators. + // This is sub-optimal in terms of performance for two reasons: + // 1/ The constructing and swapping of the (small) values + // in the temporary object takes some time, and is not necessary. + // 2/ If policy == COPY, we allocate the new buffer before + // freeing the old one, precluding the possibility of + // reusing that memory. + // I doubt that either of these problems could be optimized away, + // but the second is probably no a common case, and the first is minor. + // I don't expect resetBuffer to be a common operation, so I'm willing to + // bite the performance bullet to make the method this simple. + + // Construct the new buffer. + TMemoryBuffer new_buffer(buf, sz, policy); + // Move it into ourself. + this->swap(new_buffer); + // Our old self gets destroyed. + } + + /// See constructor documentation. + void resetBuffer(uint32_t sz) { + // Construct the new buffer. + TMemoryBuffer new_buffer(sz); + // Move it into ourself. + this->swap(new_buffer); + // Our old self gets destroyed. + } + + std::string readAsString(uint32_t len) { + std::string str; + (void)readAppendToString(str, len); + return str; + } + + uint32_t readAppendToString(std::string& str, uint32_t len); + + // return number of bytes read + uint32_t readEnd() override { + // This cast should be safe, because buffer_'s size is a uint32_t + auto bytes = static_cast(rBase_ - buffer_); + if (rBase_ == wBase_) { + resetBuffer(); + } + return bytes; + } + + // Return number of bytes written + uint32_t writeEnd() override { + // This cast should be safe, because buffer_'s size is a uint32_t + return static_cast(wBase_ - buffer_); + } + + uint32_t available_read() const { + // Remember, wBase_ is the real rBound_. + return static_cast(wBase_ - rBase_); + } + + uint32_t available_write() const { return static_cast(wBound_ - wBase_); } + + // Returns a pointer to where the client can write data to append to + // the TMemoryBuffer, and ensures the buffer is big enough to accommodate a + // write of the provided length. The returned pointer is very convenient for + // passing to read(), recv(), or similar. You must call wroteBytes() as soon + // as data is written or the buffer will not be aware that data has changed. + uint8_t* getWritePtr(uint32_t len) { + ensureCanWrite(len); + return wBase_; + } + + // Informs the buffer that the client has written 'len' bytes into storage + // that had been provided by getWritePtr(). + void wroteBytes(uint32_t len); + + /* + * TVirtualTransport provides a default implementation of readAll(). + * We want to use the TBufferBase version instead. + */ + uint32_t readAll(uint8_t* buf, uint32_t len) { return TBufferBase::readAll(buf, len); } + + //! \brief Get the current buffer size + //! \returns the current buffer size + uint32_t getBufferSize() const { + return bufferSize_; + } + + //! \brief Get the current maximum buffer size + //! \returns the current maximum buffer size + uint32_t getMaxBufferSize() const { + return maxBufferSize_; + } + + //! \brief Change the maximum buffer size + //! \param[in] maxSize the new maximum buffer size allowed to grow to + //! \throws TTransportException(BAD_ARGS) if maxSize is less than the current buffer size + void setMaxBufferSize(uint32_t maxSize) { + if (maxSize < bufferSize_) { + throw TTransportException(TTransportException::BAD_ARGS, + "Maximum buffer size would be less than current buffer size"); + } + maxBufferSize_ = maxSize; + } + +protected: + void swap(TMemoryBuffer& that) { + using std::swap; + swap(buffer_, that.buffer_); + swap(bufferSize_, that.bufferSize_); + + swap(rBase_, that.rBase_); + swap(rBound_, that.rBound_); + swap(wBase_, that.wBase_); + swap(wBound_, that.wBound_); + + swap(owner_, that.owner_); + } + + // Make sure there's at least 'len' bytes available for writing. + void ensureCanWrite(uint32_t len); + + // Compute the position and available data for reading. + void computeRead(uint32_t len, uint8_t** out_start, uint32_t* out_give); + + uint32_t readSlow(uint8_t* buf, uint32_t len) override; + + void writeSlow(const uint8_t* buf, uint32_t len) override; + + const uint8_t* borrowSlow(uint8_t* buf, uint32_t* len) override; + + // Data buffer + uint8_t* buffer_; + + // Allocated buffer size + uint32_t bufferSize_; + + // Maximum allowed size + uint32_t maxBufferSize_; + + // Is this object the owner of the buffer? + bool owner_; + + // Don't forget to update constrctors, initCommon, and swap if + // you add new members. +}; +} +} +} // apache::thrift::transport + +#endif // #ifndef _THRIFT_TRANSPORT_TBUFFERTRANSPORTS_H_ diff --git a/bsnes/thrift/thrift/transport/TFDTransport.h b/bsnes/thrift/thrift/transport/TFDTransport.h new file mode 100644 index 00000000..fb84c9d8 --- /dev/null +++ b/bsnes/thrift/thrift/transport/TFDTransport.h @@ -0,0 +1,79 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +#ifndef _THRIFT_TRANSPORT_TFDTRANSPORT_H_ +#define _THRIFT_TRANSPORT_TFDTRANSPORT_H_ 1 + +#include +#ifdef HAVE_SYS_TIME_H +#include +#endif + +#include +#include + +namespace apache { +namespace thrift { +namespace transport { + +/** + * Dead-simple wrapper around a file descriptor. + * + */ +class TFDTransport : public TVirtualTransport { +public: + enum ClosePolicy { NO_CLOSE_ON_DESTROY = 0, CLOSE_ON_DESTROY = 1 }; + + TFDTransport(int fd, ClosePolicy close_policy = NO_CLOSE_ON_DESTROY, + std::shared_ptr config = nullptr) + : TVirtualTransport(config), fd_(fd), close_policy_(close_policy) { + } + + ~TFDTransport() override { + if (close_policy_ == CLOSE_ON_DESTROY) { + try { + close(); + } catch (TTransportException& ex) { + GlobalOutput.printf("~TFDTransport TTransportException: '%s'", ex.what()); + } + } + } + + bool isOpen() const override { return fd_ >= 0; } + + void open() override {} + + void close() override; + + uint32_t read(uint8_t* buf, uint32_t len); + + void write(const uint8_t* buf, uint32_t len); + + void setFD(int fd) { fd_ = fd; } + int getFD() { return fd_; } + +protected: + int fd_; + ClosePolicy close_policy_; +}; +} +} +} // apache::thrift::transport + +#endif // #ifndef _THRIFT_TRANSPORT_TFDTRANSPORT_H_ diff --git a/bsnes/thrift/thrift/transport/TFileTransport.h b/bsnes/thrift/thrift/transport/TFileTransport.h new file mode 100644 index 00000000..608cff18 --- /dev/null +++ b/bsnes/thrift/thrift/transport/TFileTransport.h @@ -0,0 +1,439 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +#ifndef _THRIFT_TRANSPORT_TFILETRANSPORT_H_ +#define _THRIFT_TRANSPORT_TFILETRANSPORT_H_ 1 + +#include +#include +#include + +#include +#include +#include + +#include +#include +#include +#include + +namespace apache { +namespace thrift { +namespace transport { + +using apache::thrift::TProcessor; +using apache::thrift::protocol::TProtocolFactory; +using apache::thrift::concurrency::Mutex; +using apache::thrift::concurrency::Monitor; + +// Data pertaining to a single event +typedef struct eventInfo { + uint8_t* eventBuff_; + uint32_t eventSize_; + uint32_t eventBuffPos_; + + eventInfo() : eventBuff_(nullptr), eventSize_(0), eventBuffPos_(0){}; + ~eventInfo() { + if (eventBuff_) { + delete[] eventBuff_; + } + } +} eventInfo; + +// information about current read state +typedef struct readState { + eventInfo* event_; + + // keep track of event size + uint8_t eventSizeBuff_[4]; + uint8_t eventSizeBuffPos_; + bool readingSize_; + + // read buffer variables + int32_t bufferPtr_; + int32_t bufferLen_; + + // last successful dispatch point + int32_t lastDispatchPtr_; + + void resetState(uint32_t lastDispatchPtr) { + readingSize_ = true; + eventSizeBuffPos_ = 0; + lastDispatchPtr_ = lastDispatchPtr; + } + + void resetAllValues() { + resetState(0); + bufferPtr_ = 0; + bufferLen_ = 0; + if (event_) { + delete (event_); + } + event_ = nullptr; + } + + inline uint32_t getEventSize() { + const void* buffer = reinterpret_cast(eventSizeBuff_); + return *reinterpret_cast(buffer); + } + + readState() { + event_ = nullptr; + resetAllValues(); + } + + ~readState() { + if (event_) { + delete (event_); + } + } + +} readState; + +/** + * TFileTransportBuffer - buffer class used by TFileTransport for queueing up events + * to be written to disk. Should be used in the following way: + * 1) Buffer created + * 2) Buffer written to (addEvent) + * 3) Buffer read from (getNext) + * 4) Buffer reset (reset) + * 5) Go back to 2, or destroy buffer + * + * The buffer should never be written to after it is read from, unless it is reset first. + * Note: The above rules are enforced mainly for debugging its sole client TFileTransport + * which uses the buffer in this way. + * + */ +class TFileTransportBuffer { +public: + TFileTransportBuffer(uint32_t size); + ~TFileTransportBuffer(); + + bool addEvent(eventInfo* event); + eventInfo* getNext(); + void reset(); + bool isFull(); + bool isEmpty(); + +private: + TFileTransportBuffer(); // should not be used + + enum mode { WRITE, READ }; + mode bufferMode_; + + uint32_t writePoint_; + uint32_t readPoint_; + uint32_t size_; + eventInfo** buffer_; +}; + +/** + * Abstract interface for transports used to read files + */ +class TFileReaderTransport : virtual public TTransport { +public: + virtual int32_t getReadTimeout() = 0; + virtual void setReadTimeout(int32_t readTimeout) = 0; + + virtual uint32_t getNumChunks() = 0; + virtual uint32_t getCurChunk() = 0; + virtual void seekToChunk(int32_t chunk) = 0; + virtual void seekToEnd() = 0; +}; + +/** + * Abstract interface for transports used to write files + */ +class TFileWriterTransport : virtual public TTransport { +public: + virtual uint32_t getChunkSize() = 0; + virtual void setChunkSize(uint32_t chunkSize) = 0; +}; + +/** + * File implementation of a transport. Reads and writes are done to a + * file on disk. + * + */ +class TFileTransport : public TFileReaderTransport, public TFileWriterTransport { +public: + TFileTransport(std::string path, bool readOnly = false, std::shared_ptr config = nullptr); + ~TFileTransport() override; + + // TODO: what is the correct behaviour for this? + // the log file is generally always open + bool isOpen() const override { return true; } + + void write(const uint8_t* buf, uint32_t len); + void flush() override; + + uint32_t readAll(uint8_t* buf, uint32_t len); + uint32_t read(uint8_t* buf, uint32_t len); + bool peek() override; + + // log-file specific functions + void seekToChunk(int32_t chunk) override; + void seekToEnd() override; + uint32_t getNumChunks() override; + uint32_t getCurChunk() override; + + // for changing the output file + void resetOutputFile(int fd, std::string filename, off_t offset); + + // Setter/Getter functions for user-controllable options + void setReadBuffSize(uint32_t readBuffSize) { + if (readBuffSize) { + readBuffSize_ = readBuffSize; + } + } + uint32_t getReadBuffSize() { return readBuffSize_; } + + static const int32_t TAIL_READ_TIMEOUT = -1; + static const int32_t NO_TAIL_READ_TIMEOUT = 0; + void setReadTimeout(int32_t readTimeout) override { readTimeout_ = readTimeout; } + int32_t getReadTimeout() override { return readTimeout_; } + + void setChunkSize(uint32_t chunkSize) override { + if (chunkSize) { + chunkSize_ = chunkSize; + } + } + uint32_t getChunkSize() override { return chunkSize_; } + + void setEventBufferSize(uint32_t bufferSize) { + if (bufferAndThreadInitialized_) { + GlobalOutput("Cannot change the buffer size after writer thread started"); + return; + } + eventBufferSize_ = bufferSize; + } + + uint32_t getEventBufferSize() { return eventBufferSize_; } + + void setFlushMaxUs(uint32_t flushMaxUs) { + if (flushMaxUs) { + flushMaxUs_ = flushMaxUs; + } + } + uint32_t getFlushMaxUs() { return flushMaxUs_; } + + void setFlushMaxBytes(uint32_t flushMaxBytes) { + if (flushMaxBytes) { + flushMaxBytes_ = flushMaxBytes; + } + } + uint32_t getFlushMaxBytes() { return flushMaxBytes_; } + + void setMaxEventSize(uint32_t maxEventSize) { maxEventSize_ = maxEventSize; } + uint32_t getMaxEventSize() { return maxEventSize_; } + + void setMaxCorruptedEvents(uint32_t maxCorruptedEvents) { + maxCorruptedEvents_ = maxCorruptedEvents; + } + uint32_t getMaxCorruptedEvents() { return maxCorruptedEvents_; } + + void setEofSleepTimeUs(uint32_t eofSleepTime) { + if (eofSleepTime) { + eofSleepTime_ = eofSleepTime; + } + } + uint32_t getEofSleepTimeUs() { return eofSleepTime_; } + + /* + * Override TTransport *_virt() functions to invoke our implementations. + * We cannot use TVirtualTransport to provide these, since we need to inherit + * virtually from TTransport. + */ + uint32_t read_virt(uint8_t* buf, uint32_t len) override { return this->read(buf, len); } + uint32_t readAll_virt(uint8_t* buf, uint32_t len) override { return this->readAll(buf, len); } + void write_virt(const uint8_t* buf, uint32_t len) override { this->write(buf, len); } + +private: + // helper functions for writing to a file + void enqueueEvent(const uint8_t* buf, uint32_t eventLen); + bool swapEventBuffers(const std::chrono::time_point *deadline); + bool initBufferAndWriteThread(); + + // control for writer thread + static void* startWriterThread(void* ptr) { + static_cast(ptr)->writerThread(); + return nullptr; + } + void writerThread(); + + // helper functions for reading from a file + eventInfo* readEvent(); + + // event corruption-related functions + bool isEventCorrupted(); + void performRecovery(); + + // Utility functions + void openLogFile(); + std::chrono::time_point getNextFlushTime(); + + // Class variables + readState readState_; + uint8_t* readBuff_; + eventInfo* currentEvent_; + + uint32_t readBuffSize_; + static const uint32_t DEFAULT_READ_BUFF_SIZE = 1 * 1024 * 1024; + + int32_t readTimeout_; + static const int32_t DEFAULT_READ_TIMEOUT_MS = 200; + + // size of chunks that file will be split up into + uint32_t chunkSize_; + static const uint32_t DEFAULT_CHUNK_SIZE = 16 * 1024 * 1024; + + // size of event buffers + uint32_t eventBufferSize_; + static const uint32_t DEFAULT_EVENT_BUFFER_SIZE = 10000; + + // max number of microseconds that can pass without flushing + uint32_t flushMaxUs_; + static const uint32_t DEFAULT_FLUSH_MAX_US = 3000000; + + // max number of bytes that can be written without flushing + uint32_t flushMaxBytes_; + static const uint32_t DEFAULT_FLUSH_MAX_BYTES = 1000 * 1024; + + // max event size + uint32_t maxEventSize_; + static const uint32_t DEFAULT_MAX_EVENT_SIZE = 0; + + // max number of corrupted events per chunk + uint32_t maxCorruptedEvents_; + static const uint32_t DEFAULT_MAX_CORRUPTED_EVENTS = 0; + + // sleep duration when EOF is hit + uint32_t eofSleepTime_; + static const uint32_t DEFAULT_EOF_SLEEP_TIME_US = 500 * 1000; + + // sleep duration when a corrupted event is encountered + uint32_t corruptedEventSleepTime_; + static const uint32_t DEFAULT_CORRUPTED_SLEEP_TIME_US = 1 * 1000 * 1000; + + // sleep duration in seconds when an IO error is encountered in the writer thread + uint32_t writerThreadIOErrorSleepTime_; + static const uint32_t DEFAULT_WRITER_THREAD_SLEEP_TIME_US = 60 * 1000 * 1000; + + // writer thread + apache::thrift::concurrency::ThreadFactory threadFactory_; + std::shared_ptr writerThread_; + + // buffers to hold data before it is flushed. Each element of the buffer stores a msg that + // needs to be written to the file. The buffers are swapped by the writer thread. + TFileTransportBuffer* dequeueBuffer_; + TFileTransportBuffer* enqueueBuffer_; + + // conditions used to block when the buffer is full or empty + Monitor notFull_, notEmpty_; + std::atomic closing_; + + // To keep track of whether the buffer has been flushed + Monitor flushed_; + std::atomic forceFlush_; + + // Mutex that is grabbed when enqueueing and swapping the read/write buffers + Mutex mutex_; + + // File information + std::string filename_; + int fd_; + + // Whether the writer thread and buffers have been initialized + bool bufferAndThreadInitialized_; + + // Offset within the file + off_t offset_; + + // event corruption information + uint32_t lastBadChunk_; + uint32_t numCorruptedEventsInChunk_; + + bool readOnly_; +}; + +// Exception thrown when EOF is hit +class TEOFException : public TTransportException { +public: + TEOFException() : TTransportException(TTransportException::END_OF_FILE){}; +}; + +// wrapper class to process events from a file containing thrift events +class TFileProcessor { +public: + /** + * Constructor that defaults output transport to null transport + * + * @param processor processes log-file events + * @param protocolFactory protocol factory + * @param inputTransport file transport + */ + TFileProcessor(std::shared_ptr processor, + std::shared_ptr protocolFactory, + std::shared_ptr inputTransport); + + TFileProcessor(std::shared_ptr processor, + std::shared_ptr inputProtocolFactory, + std::shared_ptr outputProtocolFactory, + std::shared_ptr inputTransport); + + /** + * Constructor + * + * @param processor processes log-file events + * @param protocolFactory protocol factory + * @param inputTransport input file transport + * @param output output transport + */ + TFileProcessor(std::shared_ptr processor, + std::shared_ptr protocolFactory, + std::shared_ptr inputTransport, + std::shared_ptr outputTransport); + + /** + * processes events from the file + * + * @param numEvents number of events to process (0 for unlimited) + * @param tail tails the file if true + */ + void process(uint32_t numEvents, bool tail); + + /** + * process events until the end of the chunk + * + */ + void processChunk(); + +private: + std::shared_ptr processor_; + std::shared_ptr inputProtocolFactory_; + std::shared_ptr outputProtocolFactory_; + std::shared_ptr inputTransport_; + std::shared_ptr outputTransport_; +}; +} +} +} // apache::thrift::transport + +#endif // _THRIFT_TRANSPORT_TFILETRANSPORT_H_ + diff --git a/bsnes/thrift/thrift/transport/THeaderTransport.h b/bsnes/thrift/thrift/transport/THeaderTransport.h new file mode 100644 index 00000000..63a4ac88 --- /dev/null +++ b/bsnes/thrift/thrift/transport/THeaderTransport.h @@ -0,0 +1,277 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +#ifndef THRIFT_TRANSPORT_THEADERTRANSPORT_H_ +#define THRIFT_TRANSPORT_THEADERTRANSPORT_H_ 1 + +#include +#include +#include +#include +#include +#include + +#ifdef HAVE_STDINT_H +#include +#elif HAVE_INTTYPES_H +#include +#endif + +#include + +#include +#include +#include +#include + +enum CLIENT_TYPE { + THRIFT_HEADER_CLIENT_TYPE = 0, + THRIFT_FRAMED_BINARY = 1, + THRIFT_UNFRAMED_BINARY = 2, + THRIFT_FRAMED_COMPACT = 3, + THRIFT_UNFRAMED_COMPACT = 4, + THRIFT_UNKNOWN_CLIENT_TYPE = 5, +}; + +namespace apache { +namespace thrift { +namespace transport { + +using apache::thrift::protocol::T_COMPACT_PROTOCOL; + +/** + * Header transport. All writes go into an in-memory buffer until flush is + * called, at which point the transport writes the length of the entire + * binary chunk followed by the data payload. This allows the receiver on the + * other end to always do fixed-length reads. + * + * Subclass TFramedTransport because most of the read/write methods are similar + * and need similar buffers. Major changes are readFrame & flush. + * + * Header Transport *must* be the same transport for both input and + * output when used on the server side - client responses should be + * the same protocol as those in the request. + */ +class THeaderTransport : public TVirtualTransport { +public: + static const int DEFAULT_BUFFER_SIZE = 512u; + static const int THRIFT_MAX_VARINT32_BYTES = 5; + + /// Use default buffer sizes. + explicit THeaderTransport(const std::shared_ptr& transport, + std::shared_ptr config = nullptr) + : TVirtualTransport(transport, config), + outTransport_(transport), + protoId(T_COMPACT_PROTOCOL), + clientType(THRIFT_HEADER_CLIENT_TYPE), + seqId(0), + flags(0), + tBufSize_(0), + tBuf_(nullptr) { + if (!transport_) throw std::invalid_argument("transport is empty"); + initBuffers(); + } + + THeaderTransport(const std::shared_ptr inTransport, + const std::shared_ptr outTransport, + std::shared_ptr config = nullptr) + : TVirtualTransport(inTransport, config), + outTransport_(outTransport), + protoId(T_COMPACT_PROTOCOL), + clientType(THRIFT_HEADER_CLIENT_TYPE), + seqId(0), + flags(0), + tBufSize_(0), + tBuf_(nullptr) { + if (!transport_) throw std::invalid_argument("inTransport is empty"); + if (!outTransport_) throw std::invalid_argument("outTransport is empty"); + initBuffers(); + } + + uint32_t readSlow(uint8_t* buf, uint32_t len) override; + void flush() override; + + void resizeTransformBuffer(uint32_t additionalSize = 0); + + uint16_t getProtocolId() const; + void setProtocolId(uint16_t protoId) { this->protoId = protoId; } + + void resetProtocol(); + + /** + * We know we got a packet in header format here, try to parse the header + * + * @param headerSize size of the header portion + * @param sz Size of the whole message, including header + */ + void readHeaderFormat(uint16_t headerSize, uint32_t sz); + + /** + * Untransform the data based on the received header flags + * On conclusion of function, setReadBuffer is called with the + * untransformed data. + * + * @param ptr ptr to data + * @param size of data + */ + void untransform(uint8_t* ptr, uint32_t sz); + + /** + * Transform the data based on our write transform flags + * At conclusion of function the write buffer is set to the + * transformed data. + * + * @param ptr Ptr to data to transform + * @param sz Size of data buffer + */ + void transform(uint8_t* ptr, uint32_t sz); + + uint16_t getNumTransforms() const { + return safe_numeric_cast(writeTrans_.size()); + } + + void setTransform(uint16_t transId) { writeTrans_.push_back(transId); } + + // Info headers + + typedef std::map StringToStringMap; + + // these work with write headers + void setHeader(const std::string& key, const std::string& value); + + void clearHeaders(); + + StringToStringMap& getWriteHeaders() { return writeHeaders_; } + + // these work with read headers + const StringToStringMap& getHeaders() const { return readHeaders_; } + + // accessors for seqId + int32_t getSequenceNumber() const { return seqId; } + void setSequenceNumber(int32_t seqId) { this->seqId = seqId; } + + enum TRANSFORMS { + ZLIB_TRANSFORM = 0x01, + }; + +protected: + /** + * Reads a frame of input from the underlying stream. + * + * Returns true if a frame was read successfully, or false on EOF. + * (Raises a TTransportException if EOF occurs after a partial frame.) + */ + bool readFrame() override; + + void ensureReadBuffer(uint32_t sz); + uint32_t getWriteBytes(); + + void initBuffers() { + setReadBuffer(nullptr, 0); + setWriteBuffer(wBuf_.get(), wBufSize_); + } + + std::shared_ptr outTransport_; + + // 0 and 16th bits must be 0 to differentiate from framed & unframed + static const uint32_t HEADER_MAGIC = 0x0FFF0000; + static const uint32_t HEADER_MASK = 0xFFFF0000; + static const uint32_t FLAGS_MASK = 0x0000FFFF; + + static const uint32_t MAX_FRAME_SIZE = 0x3FFFFFFF; + + int16_t protoId; + uint16_t clientType; + uint32_t seqId; + uint16_t flags; + + std::vector readTrans_; + std::vector writeTrans_; + + // Map to use for headers + StringToStringMap readHeaders_; + StringToStringMap writeHeaders_; + + /** + * Returns the maximum number of bytes that write k/v headers can take + */ + uint32_t getMaxWriteHeadersSize() const; + + struct infoIdType { + enum idType { + // start at 1 to avoid confusing header padding for an infoId + KEYVALUE = 1, + END // signal the end of infoIds we can handle + }; + }; + + // Buffers to use for transform processing + uint32_t tBufSize_; + boost::scoped_array tBuf_; + + void readString(uint8_t*& ptr, /* out */ std::string& str, uint8_t const* headerBoundary); + + void writeString(uint8_t*& ptr, const std::string& str); + + // Varint utils + /** + * Read an i16 from the wire as a varint. The MSB of each byte is set + * if there is another byte to follow. This can read up to 3 bytes. + */ + uint32_t readVarint16(uint8_t const* ptr, int16_t* i16, uint8_t const* boundary); + + /** + * Read an i32 from the wire as a varint. The MSB of each byte is set + * if there is another byte to follow. This can read up to 5 bytes. + */ + uint32_t readVarint32(uint8_t const* ptr, int32_t* i32, uint8_t const* boundary); + + /** + * Write an i32 as a varint. Results in 1-5 bytes on the wire. + */ + uint32_t writeVarint32(int32_t n, uint8_t* pkt); + + /** + * Write an i16 as a varint. Results in 1-3 bytes on the wire. + */ + uint32_t writeVarint16(int16_t n, uint8_t* pkt); +}; + +/** + * Wraps a transport into a header one. + * + */ +class THeaderTransportFactory : public TTransportFactory { +public: + THeaderTransportFactory() = default; + + ~THeaderTransportFactory() override = default; + + /** + * Wraps the transport into a header one. + */ + std::shared_ptr getTransport(std::shared_ptr trans) override { + return std::shared_ptr(new THeaderTransport(trans)); + } +}; +} +} +} // apache::thrift::transport + +#endif // #ifndef THRIFT_TRANSPORT_THEADERTRANSPORT_H_ diff --git a/bsnes/thrift/thrift/transport/THttpClient.h b/bsnes/thrift/thrift/transport/THttpClient.h new file mode 100644 index 00000000..f0d7e8b2 --- /dev/null +++ b/bsnes/thrift/thrift/transport/THttpClient.h @@ -0,0 +1,71 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +#ifndef _THRIFT_TRANSPORT_THTTPCLIENT_H_ +#define _THRIFT_TRANSPORT_THTTPCLIENT_H_ 1 + +#include + +namespace apache { +namespace thrift { +namespace transport { + +/** + * @brief Client transport using HTTP. The path is an optional field that is + * not required by Thrift HTTP server or client. It can be used i.e. with HTTP + * redirection, load balancing or forwarding on the server. + */ +class THttpClient : public THttpTransport { +public: + /** + * @brief Constructor that wraps an existing transport, but also sets the + * host and path. The host and path are not used for the connection but are + * set in the HTTP header of the transport. + */ + THttpClient(std::shared_ptr transport, + std::string host = "localhost", + std::string path = "/service", + std::shared_ptr config = nullptr); + + /** + * @brief Constructor that will create a new socket transport using the host + * and port. + */ + THttpClient(std::string host, int port, + std::string path = "", + std::shared_ptr config = nullptr); + + ~THttpClient() override; + + void flush() override; + + void setPath(std::string path); + +protected: + std::string host_; + std::string path_; + + void parseHeader(char* header) override; + bool parseStatusLine(char* status) override; +}; +} +} +} // apache::thrift::transport + +#endif // #ifndef _THRIFT_TRANSPORT_THTTPCLIENT_H_ diff --git a/bsnes/thrift/thrift/transport/THttpServer.h b/bsnes/thrift/thrift/transport/THttpServer.h new file mode 100644 index 00000000..bc98986d --- /dev/null +++ b/bsnes/thrift/thrift/transport/THttpServer.h @@ -0,0 +1,65 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +#ifndef _THRIFT_TRANSPORT_THTTPSERVER_H_ +#define _THRIFT_TRANSPORT_THTTPSERVER_H_ 1 + +#include + +namespace apache { +namespace thrift { +namespace transport { + +class THttpServer : public THttpTransport { +public: + THttpServer(std::shared_ptr transport, std::shared_ptr config = nullptr); + + ~THttpServer() override; + + void flush() override; + +protected: + virtual std::string getHeader(uint32_t len); + void readHeaders(); + void parseHeader(char* header) override; + bool parseStatusLine(char* status) override; + std::string getTimeRFC1123(); +}; + +/** + * Wraps a transport into HTTP protocol + */ +class THttpServerTransportFactory : public TTransportFactory { +public: + THttpServerTransportFactory() = default; + + ~THttpServerTransportFactory() override = default; + + /** + * Wraps the transport into a buffered one. + */ + std::shared_ptr getTransport(std::shared_ptr trans) override { + return std::shared_ptr(new THttpServer(trans)); + } +}; +} +} +} // apache::thrift::transport + +#endif // #ifndef _THRIFT_TRANSPORT_THTTPSERVER_H_ diff --git a/bsnes/thrift/thrift/transport/THttpTransport.h b/bsnes/thrift/thrift/transport/THttpTransport.h new file mode 100644 index 00000000..5d2bd37f --- /dev/null +++ b/bsnes/thrift/thrift/transport/THttpTransport.h @@ -0,0 +1,106 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +#ifndef _THRIFT_TRANSPORT_THTTPTRANSPORT_H_ +#define _THRIFT_TRANSPORT_THTTPTRANSPORT_H_ 1 + +#include +#include + +namespace apache { +namespace thrift { +namespace transport { + +/** + * HTTP implementation of the thrift transport. This was irritating + * to write, but the alternatives in C++ land are daunting. Linking CURL + * requires 23 dynamic libraries last time I checked (WTF?!?). All we have + * here is a VERY basic HTTP/1.1 client which supports HTTP 100 Continue, + * chunked transfer encoding, keepalive, etc. Tested against Apache. + */ +class THttpTransport : public TVirtualTransport { +public: + THttpTransport(std::shared_ptr transport, std::shared_ptr config = nullptr); + + ~THttpTransport() override; + + void open() override { transport_->open(); } + + bool isOpen() const override { return transport_->isOpen(); } + + bool peek() override { return transport_->peek(); } + + void close() override { transport_->close(); } + + uint32_t read(uint8_t* buf, uint32_t len); + + uint32_t readEnd() override; + + void write(const uint8_t* buf, uint32_t len); + + void flush() override { + resetConsumedMessageSize(); + }; + + const std::string getOrigin() const override; + +protected: + std::shared_ptr transport_; + std::string origin_; + + TMemoryBuffer writeBuffer_; + TMemoryBuffer readBuffer_; + + bool readHeaders_; + bool chunked_; + bool chunkedDone_; + uint32_t chunkSize_; + uint32_t contentLength_; + + char* httpBuf_; + uint32_t httpPos_; + uint32_t httpBufLen_; + uint32_t httpBufSize_; + + virtual void init(); + + uint32_t readMoreData(); + char* readLine(); + + void readHeaders(); + virtual void parseHeader(char* header) = 0; + virtual bool parseStatusLine(char* status) = 0; + + uint32_t readChunked(); + void readChunkedFooters(); + uint32_t parseChunkSize(char* line); + + uint32_t readContent(uint32_t size); + + void refill(); + void shift(); + + static const char* CRLF; + static const int CRLF_LEN; +}; +} +} +} // apache::thrift::transport + +#endif // #ifndef _THRIFT_TRANSPORT_THTTPCLIENT_H_ diff --git a/bsnes/thrift/thrift/transport/TNonblockingSSLServerSocket.h b/bsnes/thrift/thrift/transport/TNonblockingSSLServerSocket.h new file mode 100644 index 00000000..a38bf126 --- /dev/null +++ b/bsnes/thrift/thrift/transport/TNonblockingSSLServerSocket.h @@ -0,0 +1,76 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +#ifndef _THRIFT_TRANSPORT_TNONBLOCKINGSSLSERVERSOCKET_H_ +#define _THRIFT_TRANSPORT_TNONBLOCKINGSSLSERVERSOCKET_H_ 1 + +#include + +namespace apache { +namespace thrift { +namespace transport { + +class TSSLSocketFactory; + +/** + * Nonblocking Server socket that accepts SSL connections. + */ +class TNonblockingSSLServerSocket : public TNonblockingServerSocket { +public: + /** + * Constructor. Binds to all interfaces. + * + * @param port Listening port + * @param factory SSL socket factory implementation + */ + TNonblockingSSLServerSocket(int port, std::shared_ptr factory); + + /** + * Constructor. Binds to the specified address. + * + * @param address Address to bind to + * @param port Listening port + * @param factory SSL socket factory implementation + */ + TNonblockingSSLServerSocket(const std::string& address, + int port, + std::shared_ptr factory); + + /** + * Constructor. Binds to all interfaces. + * + * @param port Listening port + * @param sendTimeout Socket send timeout + * @param recvTimeout Socket receive timeout + * @param factory SSL socket factory implementation + */ + TNonblockingSSLServerSocket(int port, + int sendTimeout, + int recvTimeout, + std::shared_ptr factory); + +protected: + std::shared_ptr createSocket(THRIFT_SOCKET socket) override; + std::shared_ptr factory_; +}; +} +} +} + +#endif diff --git a/bsnes/thrift/thrift/transport/TNonblockingServerSocket.h b/bsnes/thrift/thrift/transport/TNonblockingServerSocket.h new file mode 100644 index 00000000..1ed2b07f --- /dev/null +++ b/bsnes/thrift/thrift/transport/TNonblockingServerSocket.h @@ -0,0 +1,139 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +#ifndef _THRIFT_TRANSPORT_TNONBLOCKINGSERVERSOCKET_H_ +#define _THRIFT_TRANSPORT_TNONBLOCKINGSERVERSOCKET_H_ 1 + +#include +#include + +namespace apache { +namespace thrift { +namespace transport { + +class TSocket; + +/** + * Nonblocking Server socket implementation of TNonblockingServerTransport. Wrapper around a unix + * socket listen and accept calls. + * + */ +class TNonblockingServerSocket : public TNonblockingServerTransport { +public: + typedef std::function socket_func_t; + + const static int DEFAULT_BACKLOG = 1024; + + /** + * Constructor. + * + * @param port Port number to bind to + */ + TNonblockingServerSocket(int port); + + /** + * Constructor. + * + * @param port Port number to bind to + * @param sendTimeout Socket send timeout + * @param recvTimeout Socket receive timeout + */ + TNonblockingServerSocket(int port, int sendTimeout, int recvTimeout); + + /** + * Constructor. + * + * @param address Address to bind to + * @param port Port number to bind to + */ + TNonblockingServerSocket(const std::string& address, int port); + + /** + * Constructor used for unix sockets. + * + * @param path Pathname for unix socket. + */ + TNonblockingServerSocket(const std::string& path); + + ~TNonblockingServerSocket() override; + + void setSendTimeout(int sendTimeout); + void setRecvTimeout(int recvTimeout); + + void setAcceptBacklog(int accBacklog); + + void setRetryLimit(int retryLimit); + void setRetryDelay(int retryDelay); + + void setKeepAlive(bool keepAlive) { keepAlive_ = keepAlive; } + + void setTcpSendBuffer(int tcpSendBuffer); + void setTcpRecvBuffer(int tcpRecvBuffer); + + // listenCallback gets called just before listen, and after all Thrift + // setsockopt calls have been made. If you have custom setsockopt + // things that need to happen on the listening socket, this is the place to do it. + void setListenCallback(const socket_func_t& listenCallback) { listenCallback_ = listenCallback; } + + // acceptCallback gets called after each accept call, on the newly created socket. + // It is called after all Thrift setsockopt calls have been made. If you have + // custom setsockopt things that need to happen on the accepted + // socket, this is the place to do it. + void setAcceptCallback(const socket_func_t& acceptCallback) { acceptCallback_ = acceptCallback; } + + THRIFT_SOCKET getSocketFD() override { return serverSocket_; } + + int getPort() override; + + int getListenPort() override; + + void listen() override; + void close() override; + +protected: + std::shared_ptr acceptImpl() override; + virtual std::shared_ptr createSocket(THRIFT_SOCKET client); + +private: + int port_; + int listenPort_; + std::string address_; + std::string path_; + THRIFT_SOCKET serverSocket_; + int acceptBacklog_; + int sendTimeout_; + int recvTimeout_; + int retryLimit_; + int retryDelay_; + int tcpSendBuffer_; + int tcpRecvBuffer_; + bool keepAlive_; + bool listening_; + + socket_func_t listenCallback_; + socket_func_t acceptCallback_; + + void _setup_sockopts(); + void _setup_tcp_sockopts(); +}; +} +} +} // apache::thrift::transport + +#endif // #ifndef _THRIFT_TRANSPORT_TNONBLOCKINGSERVERSOCKET_H_ diff --git a/bsnes/thrift/thrift/transport/TNonblockingServerTransport.h b/bsnes/thrift/thrift/transport/TNonblockingServerTransport.h new file mode 100644 index 00000000..e8997d78 --- /dev/null +++ b/bsnes/thrift/thrift/transport/TNonblockingServerTransport.h @@ -0,0 +1,100 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +#ifndef _THRIFT_TRANSPORT_TNONBLOCKINGSERVERTRANSPORT_H_ +#define _THRIFT_TRANSPORT_TNONBLOCKINGSERVERTRANSPORT_H_ 1 + +#include +#include + +namespace apache { +namespace thrift { +namespace transport { + +/** + * Server transport framework. A server needs to have some facility for + * creating base transports to read/write from. The server is expected + * to keep track of TTransport children that it creates for purposes of + * controlling their lifetime. + */ +class TNonblockingServerTransport { +public: + virtual ~TNonblockingServerTransport() = default; + + /** + * Starts the server transport listening for new connections. Prior to this + * call most transports will not return anything when accept is called. + * + * @throws TTransportException if we were unable to listen + */ + virtual void listen() {} + + /** + * Gets a new dynamically allocated transport object and passes it to the + * caller. Note that it is the explicit duty of the caller to free the + * allocated object. The returned TTransport object must always be in the + * opened state. nullptr should never be returned, instead an Exception should + * always be thrown. + * + * @return A new TTransport object + * @throws TTransportException if there is an error + */ + std::shared_ptr accept() { + std::shared_ptr result = acceptImpl(); + if (!result) { + throw TTransportException("accept() may not return nullptr"); + } + return result; + } + + /** + * Utility method + * + * @return server socket file descriptor + * @throw TTransportException If an error occurs + */ + + virtual THRIFT_SOCKET getSocketFD() = 0; + + virtual int getPort() = 0; + + virtual int getListenPort() = 0; + + /** + * Closes this transport such that future calls to accept will do nothing. + */ + virtual void close() = 0; + +protected: + TNonblockingServerTransport() = default; + + /** + * Subclasses should implement this function for accept. + * + * @return A newly allocated TTransport object + * @throw TTransportException If an error occurs + */ + virtual std::shared_ptr acceptImpl() = 0; + +}; +} +} +} // apache::thrift::transport + +#endif // #ifndef _THRIFT_TRANSPORT_TNONBLOCKINGSERVERTRANSPORT_H_ diff --git a/bsnes/thrift/thrift/transport/TPipe.h b/bsnes/thrift/thrift/transport/TPipe.h new file mode 100644 index 00000000..7795151a --- /dev/null +++ b/bsnes/thrift/thrift/transport/TPipe.h @@ -0,0 +1,113 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +#ifndef _THRIFT_TRANSPORT_TPIPE_H_ +#define _THRIFT_TRANSPORT_TPIPE_H_ 1 + +#include +#include +#ifndef _WIN32 +#include +#endif +#ifdef _WIN32 +#include +#endif +#include +#ifdef _WIN32 +#include +#endif + +namespace apache { +namespace thrift { +namespace transport { + +/** + * Windows Pipes implementation of the TTransport interface. + * Don't destroy a TPipe at global scope, as that will cause a thread join + * during DLLMain. That also means that client objects using TPipe shouldn't be at global + * scope. + */ +#ifdef _WIN32 +class TPipeImpl; + +class TPipe : public TVirtualTransport { +public: + // Constructs a new pipe object. + TPipe(std::shared_ptr config = nullptr); + // Named pipe constructors - + explicit TPipe(HANDLE Pipe, std::shared_ptr config = nullptr); // HANDLE is a void* + explicit TPipe(TAutoHandle& Pipe, std::shared_ptr config = nullptr); // this ctor will clear out / move from Pipe + // need a const char * overload so string literals don't go to the HANDLE overload + explicit TPipe(const char* pipename, std::shared_ptr config = nullptr); + explicit TPipe(const std::string& pipename, std::shared_ptr config = nullptr); + // Anonymous pipe - + TPipe(HANDLE PipeRd, HANDLE PipeWrt, std::shared_ptr config = nullptr); + + // Destroys the pipe object, closing it if necessary. + virtual ~TPipe(); + + // Returns whether the pipe is open & valid. + bool isOpen() const override; + + // Checks whether more data is available in the pipe. + bool peek() override; + + // Creates and opens the named/anonymous pipe. + void open() override; + + // Shuts down communications on the pipe. + void close() override; + + // Reads from the pipe. + virtual uint32_t read(uint8_t* buf, uint32_t len); + + // Writes to the pipe. + virtual void write(const uint8_t* buf, uint32_t len); + + // Accessors + std::string getPipename(); + void setPipename(const std::string& pipename); + HANDLE getPipeHandle(); // doubles as the read handle for anon pipe + void setPipeHandle(HANDLE pipehandle); + HANDLE getWrtPipeHandle(); + void setWrtPipeHandle(HANDLE pipehandle); + long getConnTimeout(); + void setConnTimeout(long seconds); + + // this function is intended to be used in generic / template situations, + // so its name needs to be the same as TPipeServer's + HANDLE getNativeWaitHandle(); + +private: + std::shared_ptr impl_; + + std::string pipename_; + + long TimeoutSeconds_; + bool isAnonymous_; +}; + +#else +typedef TSocket TPipe; +#endif +} +} +} // apache::thrift::transport + +#endif // #ifndef _THRIFT_TRANSPORT_TPIPE_H_ diff --git a/bsnes/thrift/thrift/transport/TPipeServer.h b/bsnes/thrift/thrift/transport/TPipeServer.h new file mode 100644 index 00000000..67c5d51a --- /dev/null +++ b/bsnes/thrift/thrift/transport/TPipeServer.h @@ -0,0 +1,116 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +#ifndef _THRIFT_TRANSPORT_TSERVERWINPIPES_H_ +#define _THRIFT_TRANSPORT_TSERVERWINPIPES_H_ 1 + +#include +#include +#ifndef _WIN32 +#include +#endif +#ifdef _WIN32 +#include +#endif + +#define TPIPE_SERVER_MAX_CONNS_DEFAULT PIPE_UNLIMITED_INSTANCES + +// Windows - set security to allow non-elevated apps +// to access pipes created by elevated apps. +// Full access to everyone +const std::string DEFAULT_PIPE_SECURITY{"D:(A;;FA;;;WD)"}; + +namespace apache { +namespace thrift { +namespace transport { + +/** + * Windows Pipes implementation of TServerTransport. + * Don't destroy a TPipeServer at global scope, as that will cause a thread join + * during DLLMain. That also means that TServer's using TPipeServer shouldn't be at global + * scope. + */ +#ifdef _WIN32 +class TPipeServerImpl; +class TPipe; + +class TPipeServer : public TServerTransport { +public: + // Constructors + // Named Pipe - + TPipeServer(const std::string& pipename, uint32_t bufsize); + TPipeServer(const std::string& pipename, uint32_t bufsize, uint32_t maxconnections); + TPipeServer(const std::string& pipename, + uint32_t bufsize, + uint32_t maxconnections, + const std::string& securityDescriptor); + TPipeServer(const std::string& pipename); + // Anonymous pipe - + TPipeServer(int bufsize); + TPipeServer(); + + // Destructor + virtual ~TPipeServer(); + + bool isOpen() const override; + + // Standard transport callbacks + void interrupt() override; + void close() override; + void listen() override; + + // Accessors + std::string getPipename(); + void setPipename(const std::string& pipename); + int getBufferSize(); + void setBufferSize(int bufsize); + HANDLE getPipeHandle(); // Named Pipe R/W -or- Anonymous pipe Read handle + HANDLE getWrtPipeHandle(); + HANDLE getClientRdPipeHandle(); + HANDLE getClientWrtPipeHandle(); + bool getAnonymous(); + void setAnonymous(bool anon); + void setMaxConnections(uint32_t maxconnections); + void setSecurityDescriptor(const std::string& securityDescriptor); + + // this function is intended to be used in generic / template situations, + // so its name needs to be the same as TPipe's + HANDLE getNativeWaitHandle(); + +protected: + virtual std::shared_ptr acceptImpl(); + +private: + std::shared_ptr impl_; + + std::string pipename_; + std::string securityDescriptor_; + uint32_t bufsize_; + uint32_t maxconns_; + bool isAnonymous_; +}; +#else //_WIN32 +//*NIX named pipe implementation uses domain socket +typedef TServerSocket TPipeServer; +#endif +} +} +} // apache::thrift::transport + +#endif // #ifndef _THRIFT_TRANSPORT_TSERVERWINPIPES_H_ diff --git a/bsnes/thrift/thrift/transport/TSSLServerSocket.h b/bsnes/thrift/thrift/transport/TSSLServerSocket.h new file mode 100644 index 00000000..44df4327 --- /dev/null +++ b/bsnes/thrift/thrift/transport/TSSLServerSocket.h @@ -0,0 +1,76 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +#ifndef _THRIFT_TRANSPORT_TSSLSERVERSOCKET_H_ +#define _THRIFT_TRANSPORT_TSSLSERVERSOCKET_H_ 1 + +#include + +namespace apache { +namespace thrift { +namespace transport { + +class TSSLSocketFactory; + +/** + * Server socket that accepts SSL connections. + */ +class TSSLServerSocket : public TServerSocket { +public: + /** + * Constructor. Binds to all interfaces. + * + * @param port Listening port + * @param factory SSL socket factory implementation + */ + TSSLServerSocket(int port, std::shared_ptr factory); + + /** + * Constructor. Binds to the specified address. + * + * @param address Address to bind to + * @param port Listening port + * @param factory SSL socket factory implementation + */ + TSSLServerSocket(const std::string& address, + int port, + std::shared_ptr factory); + + /** + * Constructor. Binds to all interfaces. + * + * @param port Listening port + * @param sendTimeout Socket send timeout + * @param recvTimeout Socket receive timeout + * @param factory SSL socket factory implementation + */ + TSSLServerSocket(int port, + int sendTimeout, + int recvTimeout, + std::shared_ptr factory); + +protected: + std::shared_ptr createSocket(THRIFT_SOCKET socket) override; + std::shared_ptr factory_; +}; +} +} +} + +#endif diff --git a/bsnes/thrift/thrift/transport/TSSLSocket.h b/bsnes/thrift/thrift/transport/TSSLSocket.h new file mode 100644 index 00000000..5afc571f --- /dev/null +++ b/bsnes/thrift/thrift/transport/TSSLSocket.h @@ -0,0 +1,442 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +#ifndef _THRIFT_TRANSPORT_TSSLSOCKET_H_ +#define _THRIFT_TRANSPORT_TSSLSOCKET_H_ 1 + +// Put this first to avoid WIN32 build failure +#include + +#include +#include +#include + +namespace apache { +namespace thrift { +namespace transport { + +class AccessManager; +class SSLContext; + +enum SSLProtocol { + SSLTLS = 0, // Supports SSLv2 and SSLv3 handshake but only negotiates at TLSv1_0 or later. +//SSLv2 = 1, // HORRIBLY INSECURE! + SSLv3 = 2, // Supports SSLv3 only - also horribly insecure! + TLSv1_0 = 3, // Supports TLSv1_0 or later. + TLSv1_1 = 4, // Supports TLSv1_1 or later. + TLSv1_2 = 5, // Supports TLSv1_2 or later. + LATEST = TLSv1_2 +}; + +#define TSSL_EINTR 0 +#define TSSL_DATA 1 + +/** + * Initialize OpenSSL library. This function, or some other + * equivalent function to initialize OpenSSL, must be called before + * TSSLSocket is used. If you set TSSLSocketFactory to use manual + * OpenSSL initialization, you should call this function or otherwise + * ensure OpenSSL is initialized yourself. + */ +void initializeOpenSSL(); +/** + * Cleanup OpenSSL library. This function should be called to clean + * up OpenSSL after use of OpenSSL functionality is finished. If you + * set TSSLSocketFactory to use manual OpenSSL initialization, you + * should call this function yourself or ensure that whatever + * initialized OpenSSL cleans it up too. + */ +void cleanupOpenSSL(); + +/** + * OpenSSL implementation for SSL socket interface. + */ +class TSSLSocket : public TSocket { +public: + ~TSSLSocket() override; + /** + * TTransport interface. + */ + bool isOpen() const override; + bool peek() override; + void open() override; + void close() override; + bool hasPendingDataToRead() override; + uint32_t read(uint8_t* buf, uint32_t len) override; + void write(const uint8_t* buf, uint32_t len) override; + uint32_t write_partial(const uint8_t* buf, uint32_t len) override; + void flush() override; + /** + * Set whether to use client or server side SSL handshake protocol. + * + * @param flag Use server side handshake protocol if true. + */ + void server(bool flag) { server_ = flag; } + /** + * Determine whether the SSL socket is server or client mode. + */ + bool server() const { return server_; } + /** + * Set AccessManager. + * + * @param manager Instance of AccessManager + */ + virtual void access(std::shared_ptr manager) { access_ = manager; } + /** + * Set eventSafe flag if libevent is used. + */ + void setLibeventSafe() { eventSafe_ = true; } + /** + * Determines whether SSL Socket is libevent safe or not. + */ + bool isLibeventSafe() const { return eventSafe_; } + +protected: + /** + * Constructor. + */ + TSSLSocket(std::shared_ptr ctx, std::shared_ptr config = nullptr); + /** + * Constructor with an interrupt signal. + */ + TSSLSocket(std::shared_ptr ctx, std::shared_ptr interruptListener, + std::shared_ptr config = nullptr); + /** + * Constructor, create an instance of TSSLSocket given an existing socket. + * + * @param socket An existing socket + */ + TSSLSocket(std::shared_ptr ctx, THRIFT_SOCKET socket, std::shared_ptr config = nullptr); + /** + * Constructor, create an instance of TSSLSocket given an existing socket that can be interrupted. + * + * @param socket An existing socket + */ + TSSLSocket(std::shared_ptr ctx, THRIFT_SOCKET socket, std::shared_ptr interruptListener, + std::shared_ptr config = nullptr); + /** + * Constructor. + * + * @param host Remote host name + * @param port Remote port number + */ + TSSLSocket(std::shared_ptr ctx, std::string host, int port, std::shared_ptr config = nullptr); + /** + * Constructor with an interrupt signal. + * + * @param host Remote host name + * @param port Remote port number + */ + TSSLSocket(std::shared_ptr ctx, std::string host, int port, std::shared_ptr interruptListener, + std::shared_ptr config = nullptr); + /** + * Authorize peer access after SSL handshake completes. + */ + virtual void authorize(); + /** + * Initiate SSL handshake if not already initiated. + */ + void initializeHandshake(); + /** + * Initiate SSL handshake params. + */ + void initializeHandshakeParams(); + /** + * Check if SSL handshake is completed or not. + */ + bool checkHandshake(); + /** + * Waits for an socket or shutdown event. + * + * @throw TTransportException::INTERRUPTED if interrupted is signaled. + * + * @return TSSL_EINTR if EINTR happened on the underlying socket + * TSSL_DATA if data is available on the socket. + */ + unsigned int waitForEvent(bool wantRead); + + bool server_; + SSL* ssl_; + std::shared_ptr ctx_; + std::shared_ptr access_; + friend class TSSLSocketFactory; + +private: + bool handshakeCompleted_; + int readRetryCount_; + bool eventSafe_; + + void init(); +}; + +/** + * SSL socket factory. SSL sockets should be created via SSL factory. + * The factory will automatically initialize and cleanup openssl as long as + * there is a TSSLSocketFactory instantiated, and as long as the static + * boolean manualOpenSSLInitialization_ is set to false, the default. + * + * If you would like to initialize and cleanup openssl yourself, set + * manualOpenSSLInitialization_ to true and TSSLSocketFactory will no + * longer be responsible for openssl initialization and teardown. + * + * It is the responsibility of the code using TSSLSocketFactory to + * ensure that the factory lifetime exceeds the lifetime of any sockets + * it might create. If this is not guaranteed, a socket may call into + * openssl after the socket factory has cleaned up openssl! This + * guarantee is unnecessary if manualOpenSSLInitialization_ is true, + * however, since it would be up to the consuming application instead. + */ +class TSSLSocketFactory { +public: + /** + * Constructor/Destructor + * + * @param protocol The SSL/TLS protocol to use. + */ + TSSLSocketFactory(SSLProtocol protocol = SSLTLS); + virtual ~TSSLSocketFactory(); + /** + * Create an instance of TSSLSocket with a fresh new socket. + */ + virtual std::shared_ptr createSocket(); + /** + * Create an instance of TSSLSocket with a fresh new socket, which is interruptable. + */ + virtual std::shared_ptr createSocket(std::shared_ptr interruptListener); + /** + * Create an instance of TSSLSocket with the given socket. + * + * @param socket An existing socket. + */ + virtual std::shared_ptr createSocket(THRIFT_SOCKET socket); + /** + * Create an instance of TSSLSocket with the given socket which is interruptable. + * + * @param socket An existing socket. + */ + virtual std::shared_ptr createSocket(THRIFT_SOCKET socket, std::shared_ptr interruptListener); + /** + * Create an instance of TSSLSocket. + * + * @param host Remote host to be connected to + * @param port Remote port to be connected to + */ + virtual std::shared_ptr createSocket(const std::string& host, int port); + /** + * Create an instance of TSSLSocket. + * + * @param host Remote host to be connected to + * @param port Remote port to be connected to + */ + virtual std::shared_ptr createSocket(const std::string& host, int port, std::shared_ptr interruptListener); + /** + * Set ciphers to be used in SSL handshake process. + * + * @param ciphers A list of ciphers + */ + virtual void ciphers(const std::string& enable); + /** + * Enable/Disable authentication. + * + * @param required Require peer to present valid certificate if true + */ + virtual void authenticate(bool required); + /** + * Load server certificate. + * + * @param path Path to the certificate file + * @param format Certificate file format + */ + virtual void loadCertificate(const char* path, const char* format = "PEM"); + virtual void loadCertificateFromBuffer(const char* aCertificate, const char* format = "PEM"); + /** + * Load private key. + * + * @param path Path to the private key file + * @param format Private key file format + */ + virtual void loadPrivateKey(const char* path, const char* format = "PEM"); + virtual void loadPrivateKeyFromBuffer(const char* aPrivateKey, const char* format = "PEM"); + /** + * Load trusted certificates from specified file. + * + * @param path Path to trusted certificate file + */ + virtual void loadTrustedCertificates(const char* path, const char* capath = nullptr); + virtual void loadTrustedCertificatesFromBuffer(const char* aCertificate, const char* aChain = nullptr); + /** + * Default randomize method. + */ + virtual void randomize(); + /** + * Override default OpenSSL password callback with getPassword(). + */ + void overrideDefaultPasswordCallback(); + /** + * Set/Unset server mode. + * + * @param flag Server mode if true + */ + virtual void server(bool flag) { server_ = flag; } + /** + * Determine whether the socket is in server or client mode. + * + * @return true, if server mode, or, false, if client mode + */ + virtual bool server() const { return server_; } + /** + * Set AccessManager. + * + * @param manager The AccessManager instance + */ + virtual void access(std::shared_ptr manager) { access_ = manager; } + static void setManualOpenSSLInitialization(bool manualOpenSSLInitialization) { + manualOpenSSLInitialization_ = manualOpenSSLInitialization; + } + +protected: + std::shared_ptr ctx_; + + /** + * Override this method for custom password callback. It may be called + * multiple times at any time during a session as necessary. + * + * @param password Pass collected password to OpenSSL + * @param size Maximum length of password including NULL character + */ + virtual void getPassword(std::string& /* password */, int /* size */) {} + +private: + bool server_; + std::shared_ptr access_; + static concurrency::Mutex mutex_; + static uint64_t count_; + THRIFT_EXPORT static bool manualOpenSSLInitialization_; + void setup(std::shared_ptr ssl); + static int passwordCallback(char* password, int size, int, void* data); +}; + +/** + * SSL exception. + */ +class TSSLException : public TTransportException { +public: + TSSLException(const std::string& message) + : TTransportException(TTransportException::INTERNAL_ERROR, message) {} + + const char* what() const noexcept override { + if (message_.empty()) { + return "TSSLException"; + } else { + return message_.c_str(); + } + } +}; + +/** + * Wrap OpenSSL SSL_CTX into a class. + */ +class SSLContext { +public: + SSLContext(const SSLProtocol& protocol = SSLTLS); + virtual ~SSLContext(); + SSL* createSSL(); + SSL_CTX* get() { return ctx_; } + +private: + SSL_CTX* ctx_; +}; + +/** + * Callback interface for access control. It's meant to verify the remote host. + * It's constructed when application starts and set to TSSLSocketFactory + * instance. It's passed onto all TSSLSocket instances created by this factory + * object. + */ +class AccessManager { +public: + enum Decision { + DENY = -1, // deny access + SKIP = 0, // cannot make decision, move on to next (if any) + ALLOW = 1 // allow access + }; + /** + * Destructor + */ + virtual ~AccessManager() = default; + /** + * Determine whether the peer should be granted access or not. It's called + * once after the SSL handshake completes successfully, before peer certificate + * is examined. + * + * If a valid decision (ALLOW or DENY) is returned, the peer certificate is + * not to be verified. + * + * @param sa Peer IP address + * @return True if the peer is trusted, false otherwise + */ + virtual Decision verify(const sockaddr_storage& /* sa */) noexcept { return DENY; } + /** + * Determine whether the peer should be granted access or not. It's called + * every time a DNS subjectAltName/common name is extracted from peer's + * certificate. + * + * @param host Client mode: host name returned by TSocket::getHost() + * Server mode: host name returned by TSocket::getPeerHost() + * @param name SubjectAltName or common name extracted from peer certificate + * @param size Length of name + * @return True if the peer is trusted, false otherwise + * + * Note: The "name" parameter may be UTF8 encoded. + */ + virtual Decision verify(const std::string& /* host */, + const char* /* name */, + int /* size */) noexcept { + return DENY; + } + /** + * Determine whether the peer should be granted access or not. It's called + * every time an IP subjectAltName is extracted from peer's certificate. + * + * @param sa Peer IP address retrieved from the underlying socket + * @param data IP address extracted from certificate + * @param size Length of the IP address + * @return True if the peer is trusted, false otherwise + */ + virtual Decision verify(const sockaddr_storage& /* sa */, + const char* /* data */, + int /* size */) noexcept { + return DENY; + } +}; + +typedef AccessManager::Decision Decision; + +class DefaultClientAccessManager : public AccessManager { +public: + // AccessManager interface + Decision verify(const sockaddr_storage& sa) noexcept override; + Decision verify(const std::string& host, const char* name, int size) noexcept override; + Decision verify(const sockaddr_storage& sa, const char* data, int size) noexcept override; +}; +} +} +} + +#endif diff --git a/bsnes/thrift/thrift/transport/TServerSocket.h b/bsnes/thrift/thrift/transport/TServerSocket.h new file mode 100644 index 00000000..e4659a03 --- /dev/null +++ b/bsnes/thrift/thrift/transport/TServerSocket.h @@ -0,0 +1,174 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +#ifndef _THRIFT_TRANSPORT_TSERVERSOCKET_H_ +#define _THRIFT_TRANSPORT_TSERVERSOCKET_H_ 1 + +#include +#include +#include + +#include +#ifdef HAVE_SYS_SOCKET_H +#include +#endif +#ifdef HAVE_NETDB_H +#include +#endif + +namespace apache { +namespace thrift { +namespace transport { + +class TSocket; + +/** + * Server socket implementation of TServerTransport. Wrapper around a unix + * socket listen and accept calls. + * + */ +class TServerSocket : public TServerTransport { +public: + typedef std::function socket_func_t; + + const static int DEFAULT_BACKLOG = 1024; + + /** + * Constructor. + * + * @param port Port number to bind to + */ + TServerSocket(int port); + + /** + * Constructor. + * + * @param port Port number to bind to + * @param sendTimeout Socket send timeout + * @param recvTimeout Socket receive timeout + */ + TServerSocket(int port, int sendTimeout, int recvTimeout); + + /** + * Constructor. + * + * @param address Address to bind to + * @param port Port number to bind to + */ + TServerSocket(const std::string& address, int port); + + /** + * Constructor used for unix sockets. + * + * @param path Pathname for unix socket. + */ + TServerSocket(const std::string& path); + + ~TServerSocket() override; + + + bool isOpen() const override; + + void setSendTimeout(int sendTimeout); + void setRecvTimeout(int recvTimeout); + + void setAcceptTimeout(int accTimeout); + void setAcceptBacklog(int accBacklog); + + void setRetryLimit(int retryLimit); + void setRetryDelay(int retryDelay); + + void setKeepAlive(bool keepAlive) { keepAlive_ = keepAlive; } + + void setTcpSendBuffer(int tcpSendBuffer); + void setTcpRecvBuffer(int tcpRecvBuffer); + + // listenCallback gets called just before listen, and after all Thrift + // setsockopt calls have been made. If you have custom setsockopt + // things that need to happen on the listening socket, this is the place to do it. + void setListenCallback(const socket_func_t& listenCallback) { listenCallback_ = listenCallback; } + + // acceptCallback gets called after each accept call, on the newly created socket. + // It is called after all Thrift setsockopt calls have been made. If you have + // custom setsockopt things that need to happen on the accepted + // socket, this is the place to do it. + void setAcceptCallback(const socket_func_t& acceptCallback) { acceptCallback_ = acceptCallback; } + + // When enabled (the default), new children TSockets will be constructed so + // they can be interrupted by TServerTransport::interruptChildren(). + // This is more expensive in terms of system calls (poll + recv) however + // ensures a connected client cannot interfere with TServer::stop(). + // + // When disabled, TSocket children do not incur an additional poll() call. + // Server-side reads are more efficient, however a client can interfere with + // the server's ability to shutdown properly by staying connected. + // + // Must be called before listen(); mode cannot be switched after that. + // \throws std::logic_error if listen() has been called + void setInterruptableChildren(bool enable); + + THRIFT_SOCKET getSocketFD() override { return serverSocket_; } + + int getPort(); + + void listen() override; + void interrupt() override; + void interruptChildren() override; + void close() override; + +protected: + std::shared_ptr acceptImpl() override; + virtual std::shared_ptr createSocket(THRIFT_SOCKET client); + bool interruptableChildren_; + std::shared_ptr pChildInterruptSockReader_; // if interruptableChildren_ this is shared with child TSockets + +private: + void notify(THRIFT_SOCKET notifySock); + void _setup_sockopts(); + void _setup_unixdomain_sockopts(); + void _setup_tcp_sockopts(); + + int port_; + std::string address_; + std::string path_; + THRIFT_SOCKET serverSocket_; + int acceptBacklog_; + int sendTimeout_; + int recvTimeout_; + int accTimeout_; + int retryLimit_; + int retryDelay_; + int tcpSendBuffer_; + int tcpRecvBuffer_; + bool keepAlive_; + bool listening_; + + concurrency::Mutex rwMutex_; // thread-safe interrupt + THRIFT_SOCKET interruptSockWriter_; // is notified on interrupt() + THRIFT_SOCKET interruptSockReader_; // is used in select/poll with serverSocket_ for interruptability + THRIFT_SOCKET childInterruptSockWriter_; // is notified on interruptChildren() + + socket_func_t listenCallback_; + socket_func_t acceptCallback_; +}; +} +} +} // apache::thrift::transport + +#endif // #ifndef _THRIFT_TRANSPORT_TSERVERSOCKET_H_ diff --git a/bsnes/thrift/thrift/transport/TServerTransport.h b/bsnes/thrift/thrift/transport/TServerTransport.h new file mode 100644 index 00000000..0c566092 --- /dev/null +++ b/bsnes/thrift/thrift/transport/TServerTransport.h @@ -0,0 +1,118 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +#ifndef _THRIFT_TRANSPORT_TSERVERTRANSPORT_H_ +#define _THRIFT_TRANSPORT_TSERVERTRANSPORT_H_ 1 + +#include +#include + +namespace apache { +namespace thrift { +namespace transport { + +/** + * Server transport framework. A server needs to have some facility for + * creating base transports to read/write from. The server is expected + * to keep track of TTransport children that it creates for purposes of + * controlling their lifetime. + */ +class TServerTransport { +public: + virtual ~TServerTransport() = default; + + /** + * Whether this transport is open. + */ + virtual bool isOpen() const { return false; } + + /** + * Starts the server transport listening for new connections. Prior to this + * call most transports will not return anything when accept is called. + * + * @throws TTransportException if we were unable to listen + */ + virtual void listen() {} + + /** + * Gets a new dynamically allocated transport object and passes it to the + * caller. Note that it is the explicit duty of the caller to free the + * allocated object. The returned TTransport object must always be in the + * opened state. nullptr should never be returned, instead an Exception should + * always be thrown. + * + * @return A new TTransport object + * @throws TTransportException if there is an error + */ + std::shared_ptr accept() { + std::shared_ptr result = acceptImpl(); + if (!result) { + throw TTransportException("accept() may not return nullptr"); + } + return result; + } + + /** + * For "smart" TServerTransport implementations that work in a multi + * threaded context this can be used to break out of an accept() call. + * It is expected that the transport will throw a TTransportException + * with the INTERRUPTED error code. + * + * This will not make an attempt to interrupt any TTransport children. + */ + virtual void interrupt() {} + + /** + * This will interrupt the children created by the server transport. + * allowing them to break out of any blocking data reception call. + * It is expected that the children will throw a TTransportException + * with the INTERRUPTED error code. + */ + virtual void interruptChildren() {} + + /** + * Utility method + * + * @return server socket file descriptor + * @throw TTransportException If an error occurs + */ + + virtual THRIFT_SOCKET getSocketFD() { return -1; } + + /** + * Closes this transport such that future calls to accept will do nothing. + */ + virtual void close() = 0; + +protected: + TServerTransport() = default; + + /** + * Subclasses should implement this function for accept. + * + * @return A newly allocated TTransport object + * @throw TTransportException If an error occurs + */ + virtual std::shared_ptr acceptImpl() = 0; +}; +} +} +} // apache::thrift::transport + +#endif // #ifndef _THRIFT_TRANSPORT_TSERVERTRANSPORT_H_ diff --git a/bsnes/thrift/thrift/transport/TShortReadTransport.h b/bsnes/thrift/thrift/transport/TShortReadTransport.h new file mode 100644 index 00000000..c99e6a72 --- /dev/null +++ b/bsnes/thrift/thrift/transport/TShortReadTransport.h @@ -0,0 +1,91 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +#ifndef _THRIFT_TRANSPORT_TSHORTREADTRANSPORT_H_ +#define _THRIFT_TRANSPORT_TSHORTREADTRANSPORT_H_ 1 + +#include + +#include +#include + +namespace apache { +namespace thrift { +namespace transport { +namespace test { + +/** + * This class is only meant for testing. It wraps another transport. + * Calls to read are passed through with some probability. Otherwise, + * the read amount is randomly reduced before being passed through. + * + */ +class TShortReadTransport : public TVirtualTransport { +public: + TShortReadTransport(std::shared_ptr transport, double full_prob, + std::shared_ptr config = nullptr) + : TVirtualTransport(config), transport_(transport), fullProb_(full_prob) { + } + + bool isOpen() const override { return transport_->isOpen(); } + + bool peek() override { return transport_->peek(); } + + void open() override { transport_->open(); } + + void close() override { transport_->close(); } + + uint32_t read(uint8_t* buf, uint32_t len) { + checkReadBytesAvailable(len); + if (len == 0) { + return 0; + } + + if (rand() / (double)RAND_MAX >= fullProb_) { + len = 1 + rand() % len; + } + return transport_->read(buf, len); + } + + void write(const uint8_t* buf, uint32_t len) { transport_->write(buf, len); } + + void flush() override { + resetConsumedMessageSize(); + transport_->flush(); + } + + const uint8_t* borrow(uint8_t* buf, uint32_t* len) { return transport_->borrow(buf, len); } + + void consume(uint32_t len) { + countConsumedMessageBytes(len); + return transport_->consume(len); + } + + std::shared_ptr getUnderlyingTransport() { return transport_; } + +protected: + std::shared_ptr transport_; + double fullProb_; +}; +} +} +} +} // apache::thrift::transport::test + +#endif // #ifndef _THRIFT_TRANSPORT_TSHORTREADTRANSPORT_H_ diff --git a/bsnes/thrift/thrift/transport/TSimpleFileTransport.h b/bsnes/thrift/thrift/transport/TSimpleFileTransport.h new file mode 100644 index 00000000..24741b0f --- /dev/null +++ b/bsnes/thrift/thrift/transport/TSimpleFileTransport.h @@ -0,0 +1,43 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +#ifndef _THRIFT_TRANSPORT_TSIMPLEFILETRANSPORT_H_ +#define _THRIFT_TRANSPORT_TSIMPLEFILETRANSPORT_H_ 1 + +#include + +namespace apache { +namespace thrift { +namespace transport { + +/** + * Dead-simple wrapper around a file. + * + * Writeable files are opened with O_CREAT and O_APPEND + */ +class TSimpleFileTransport : public TFDTransport { +public: + TSimpleFileTransport(const std::string& path, bool read = true, bool write = false, + std::shared_ptr config = nullptr); +}; +} +} +} // apache::thrift::transport + +#endif // _THRIFT_TRANSPORT_TSIMPLEFILETRANSPORT_H_ diff --git a/bsnes/thrift/thrift/transport/TSocket.h b/bsnes/thrift/thrift/transport/TSocket.h new file mode 100644 index 00000000..8a224f2d --- /dev/null +++ b/bsnes/thrift/thrift/transport/TSocket.h @@ -0,0 +1,369 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +#ifndef _THRIFT_TRANSPORT_TSOCKET_H_ +#define _THRIFT_TRANSPORT_TSOCKET_H_ 1 + +#include + +#include +#include +#include +#include + +#ifdef HAVE_ARPA_INET_H +#include +#endif +#ifdef HAVE_SYS_TIME_H +#include +#endif +#ifdef HAVE_NETDB_H +#include +#endif + +namespace apache { +namespace thrift { +namespace transport { + +/** + * TCP Socket implementation of the TTransport interface. + * + */ +class TSocket : public TVirtualTransport { +public: + /** + * Constructs a new socket. Note that this does NOT actually connect the + * socket. + * + */ + TSocket(std::shared_ptr config = nullptr); + + /** + * Constructs a new socket. Note that this does NOT actually connect the + * socket. + * + * @param host An IP address or hostname to connect to + * @param port The port to connect on + */ + TSocket(const std::string& host, int port, std::shared_ptr config = nullptr); + + /** + * Constructs a new Unix domain socket. + * Note that this does NOT actually connect the socket. + * + * @param path The Unix domain socket e.g. "/tmp/ThriftTest.binary.thrift" + * or a zero-prefixed string to create an abstract domain socket on Linux. + */ + TSocket(const std::string& path, std::shared_ptr config = nullptr); + + /** + * Destroyes the socket object, closing it if necessary. + */ + ~TSocket() override; + + /** + * Whether the socket is alive. + * + * @return Is the socket alive? + */ + bool isOpen() const override; + + /** + * Checks whether there is more data available in the socket to read. + * + * This call blocks until at least one byte is available or the socket is closed. + */ + bool peek() override; + + /** + * Creates and opens the UNIX socket. + * + * @throws TTransportException If the socket could not connect + */ + void open() override; + + /** + * Shuts down communications on the socket. + */ + void close() override; + + /** + * Determines whether there is pending data to read or not. + * + * This call does not block. + * \throws TTransportException of types: + * NOT_OPEN means the socket has been closed + * UNKNOWN means something unexpected happened + * \returns true if there is pending data to read, false otherwise + */ + virtual bool hasPendingDataToRead(); + + /** + * Reads from the underlying socket. + * \returns the number of bytes read or 0 indicates EOF + * \throws TTransportException of types: + * INTERRUPTED means the socket was interrupted + * out of a blocking call + * NOT_OPEN means the socket has been closed + * TIMED_OUT means the receive timeout expired + * UNKNOWN means something unexpected happened + */ + virtual uint32_t read(uint8_t* buf, uint32_t len); + + /** + * Writes to the underlying socket. Loops until done or fail. + */ + virtual void write(const uint8_t* buf, uint32_t len); + + /** + * Writes to the underlying socket. Does single send() and returns result. + */ + virtual uint32_t write_partial(const uint8_t* buf, uint32_t len); + + /** + * Get the host that the socket is connected to + * + * @return string host identifier + */ + std::string getHost(); + + /** + * Get the port that the socket is connected to + * + * @return int port number + */ + int getPort(); + + /** + * Get the Unix domain socket path that the socket is connected to + * + * @return std::string path + */ + std::string getPath(); + + /** + * Set the host that socket will connect to + * + * @param host host identifier + */ + void setHost(std::string host); + + /** + * Set the port that socket will connect to + * + * @param port port number + */ + void setPort(int port); + + /** + * Set the Unix domain socket path for the socket + * + * @param path std::string path + */ + void setPath(std::string path); + + /** + * Controls whether the linger option is set on the socket. + * + * @param on Whether SO_LINGER is on + * @param linger If linger is active, the number of seconds to linger for + */ + void setLinger(bool on, int linger); + + /** + * Whether to enable/disable Nagle's algorithm. + * + * @param noDelay Whether or not to disable the algorithm. + * @return + */ + void setNoDelay(bool noDelay); + + /** + * Set the connect timeout + */ + void setConnTimeout(int ms); + + /** + * Set the receive timeout + */ + void setRecvTimeout(int ms); + + /** + * Set the send timeout + */ + void setSendTimeout(int ms); + + /** + * Set the max number of recv retries in case of an THRIFT_EAGAIN + * error + */ + void setMaxRecvRetries(int maxRecvRetries); + + /** + * Set SO_KEEPALIVE + */ + void setKeepAlive(bool keepAlive); + + /** + * Get socket information formatted as a string + */ + std::string getSocketInfo() const; + + /** + * Returns the DNS name of the host to which the socket is connected + */ + std::string getPeerHost() const; + + /** + * Returns the address of the host to which the socket is connected + */ + std::string getPeerAddress() const; + + /** + * Returns the port of the host to which the socket is connected + **/ + int getPeerPort() const; + + /** + * Returns the underlying socket file descriptor. + */ + THRIFT_SOCKET getSocketFD() { return socket_; } + + /** + * (Re-)initialize a TSocket for the supplied descriptor. This is only + * intended for use by TNonblockingServer -- other use may result in + * unfortunate surprises. + * + * @param fd the descriptor for an already-connected socket + */ + void setSocketFD(THRIFT_SOCKET fd); + + /* + * Returns a cached copy of the peer address. + */ + sockaddr* getCachedAddress(socklen_t* len) const; + + /** + * Sets whether to use a low minimum TCP retransmission timeout. + */ + static void setUseLowMinRto(bool useLowMinRto); + + /** + * Gets whether to use a low minimum TCP retransmission timeout. + */ + static bool getUseLowMinRto(); + + /** + * Get the origin the socket is connected to + * + * @return string peer host identifier and port + */ + const std::string getOrigin() const override; + + /** + * Constructor to create socket from file descriptor. + */ + TSocket(THRIFT_SOCKET socket, std::shared_ptr config = nullptr); + + /** + * Constructor to create socket from file descriptor that + * can be interrupted safely. + */ + TSocket(THRIFT_SOCKET socket, std::shared_ptr interruptListener, + std::shared_ptr config = nullptr); + + /** + * Set a cache of the peer address (used when trivially available: e.g. + * accept() or connect()). Only caches IPV4 and IPV6; unset for others. + */ + void setCachedAddress(const sockaddr* addr, socklen_t len); + +protected: + /** connect, called by open */ + void openConnection(struct addrinfo* res); + + /** Host to connect to */ + std::string host_; + + /** Port number to connect on */ + int port_; + + /** UNIX domain socket path */ + std::string path_; + + /** Underlying socket handle */ + THRIFT_SOCKET socket_; + + /** Peer hostname */ + mutable std::string peerHost_; + + /** Peer address */ + mutable std::string peerAddress_; + + /** Peer port */ + mutable int peerPort_; + + /** + * A shared socket pointer that will interrupt a blocking read if data + * becomes available on it + */ + std::shared_ptr interruptListener_; + + /** Connect timeout in ms */ + int connTimeout_; + + /** Send timeout in ms */ + int sendTimeout_; + + /** Recv timeout in ms */ + int recvTimeout_; + + /** Keep alive on */ + bool keepAlive_; + + /** Linger on */ + bool lingerOn_; + + /** Linger val */ + int lingerVal_; + + /** Nodelay */ + bool noDelay_; + + /** Recv EGAIN retries */ + int maxRecvRetries_; + + /** Cached peer address */ + union { + sockaddr_in ipv4; + sockaddr_in6 ipv6; + } cachedPeerAddr_; + + /** Whether to use low minimum TCP retransmission timeout */ + static bool useLowMinRto_; + +private: + void unix_open(); + void local_open(); +}; +} +} +} // apache::thrift::transport + +#endif // #ifndef _THRIFT_TRANSPORT_TSOCKET_H_ diff --git a/bsnes/thrift/thrift/transport/TSocketPool.h b/bsnes/thrift/thrift/transport/TSocketPool.h new file mode 100644 index 00000000..97a2b906 --- /dev/null +++ b/bsnes/thrift/thrift/transport/TSocketPool.h @@ -0,0 +1,195 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +#ifndef _THRIFT_TRANSPORT_TSOCKETPOOL_H_ +#define _THRIFT_TRANSPORT_TSOCKETPOOL_H_ 1 + +#include +#include + +namespace apache { +namespace thrift { +namespace transport { + +/** + * Class to hold server information for TSocketPool + * + */ +class TSocketPoolServer { + +public: + /** + * Default constructor for server info + */ + TSocketPoolServer(); + + /** + * Constructor for TSocketPool server + */ + TSocketPoolServer(const std::string& host, int port); + + // Host name + std::string host_; + + // Port to connect on + int port_; + + // Socket for the server + THRIFT_SOCKET socket_; + + // Last time connecting to this server failed + time_t lastFailTime_; + + // Number of consecutive times connecting to this server failed + int consecutiveFailures_; +}; + +/** + * TCP Socket implementation of the TTransport interface. + * + */ +class TSocketPool : public TSocket { + +public: + /** + * Socket pool constructor + */ + TSocketPool(); + + /** + * Socket pool constructor + * + * @param hosts list of host names + * @param ports list of port names + */ + TSocketPool(const std::vector& hosts, const std::vector& ports); + + /** + * Socket pool constructor + * + * @param servers list of pairs of host name and port + */ + TSocketPool(const std::vector >& servers); + + /** + * Socket pool constructor + * + * @param servers list of TSocketPoolServers + */ + TSocketPool(const std::vector >& servers); + + /** + * Socket pool constructor + * + * @param host single host + * @param port single port + */ + TSocketPool(const std::string& host, int port); + + /** + * Destroyes the socket object, closing it if necessary. + */ + ~TSocketPool() override; + + /** + * Add a server to the pool + */ + void addServer(const std::string& host, int port); + + /** + * Add a server to the pool + */ + void addServer(std::shared_ptr& server); + + /** + * Set list of servers in this pool + */ + void setServers(const std::vector >& servers); + + /** + * Get list of servers in this pool + */ + void getServers(std::vector >& servers); + + /** + * Sets how many times to keep retrying a host in the connect function. + */ + void setNumRetries(int numRetries); + + /** + * Sets how long to wait until retrying a host if it was marked down + */ + void setRetryInterval(int retryInterval); + + /** + * Sets how many times to keep retrying a host before marking it as down. + */ + void setMaxConsecutiveFailures(int maxConsecutiveFailures); + + /** + * Turns randomization in connect order on or off. + */ + void setRandomize(bool randomize); + + /** + * Whether to always try the last server. + */ + void setAlwaysTryLast(bool alwaysTryLast); + + /** + * Creates and opens the UNIX socket. + */ + void open() override; + + /* + * Closes the UNIX socket + */ + void close() override; + +protected: + void setCurrentServer(const std::shared_ptr& server); + + /** List of servers to connect to */ + std::vector > servers_; + + /** Current server */ + std::shared_ptr currentServer_; + + /** How many times to retry each host in connect */ + int numRetries_; + + /** Retry interval in seconds, how long to not try a host if it has been + * marked as down. + */ + time_t retryInterval_; + + /** Max consecutive failures before marking a host down. */ + int maxConsecutiveFailures_; + + /** Try hosts in order? or Randomized? */ + bool randomize_; + + /** Always try last host, even if marked down? */ + bool alwaysTryLast_; +}; +} +} +} // apache::thrift::transport + +#endif // #ifndef _THRIFT_TRANSPORT_TSOCKETPOOL_H_ diff --git a/bsnes/thrift/thrift/transport/TSocketUtils.h b/bsnes/thrift/thrift/transport/TSocketUtils.h new file mode 100644 index 00000000..c9e0e57b --- /dev/null +++ b/bsnes/thrift/thrift/transport/TSocketUtils.h @@ -0,0 +1,163 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +#ifndef _THRIFT_TRANSPORT_SOCKETUTILS_H_ +#define _THRIFT_TRANSPORT_SOCKETUTILS_H_ 1 + +#include +#include +#include +#include + +#include +#ifdef HAVE_SYS_SOCKET_H +#include +#endif +#ifdef HAVE_NETDB_H +#include +#endif + +#include + +namespace apache { +namespace thrift { + +/** + * A helper to resolve hostnames to struct addrinfo's -- and not leak memory. + * + * Use like this: + * + * apache::thrift::AddressResolutionHelper addresses("localhost", "80"); + * + * for (auto addr : addresses.iterate()) { + * connect(sock, addr->ai_addr, addr->ai_addrlen); + * // ... + * } + */ +struct AddressResolutionHelper { + +private: + struct addrinfo_deleter { + void operator()(addrinfo* addr) { + ::freeaddrinfo(addr); // frees the whole list + } + }; + +public: + using PtrOwnedList = std::unique_ptr; + + struct Iter : std::iterator { + value_type ptr = nullptr; + + Iter() = default; + Iter(const addrinfo* head) : ptr(head) {} + + value_type operator*() const { return ptr; } + + bool operator==(const Iter& other) { return this->ptr == other.ptr; } + bool operator!=(const Iter& other) { return this->ptr != other.ptr; } + + operator bool() { return this->ptr != nullptr; } + bool operator!() { return this->ptr == nullptr; } + + Iter& operator++() { + if (ptr == nullptr) { + throw std::out_of_range("won't go pass end of linked list"); + } + ptr = ptr->ai_next; + return *this; + } + Iter operator++(int) { + Iter tmp(*this); + ++(*this); + return tmp; + } + }; + + struct gai_error : std::error_category { + virtual const char* name() const noexcept override { return "getaddrinfo"; } + virtual std::string message(int code) const override { return THRIFT_GAI_STRERROR(code); } + }; + +private: + PtrOwnedList gai_results; + + addrinfo* query(const std::string& host, const std::string& port, int socktype, int flags) { + addrinfo hints{}; + hints.ai_flags = flags; + hints.ai_family = AF_UNSPEC; + hints.ai_socktype = socktype; + + addrinfo* head; + int ret = ::getaddrinfo(host.empty() ? NULL : host.c_str(), port.c_str(), &hints, &head); + if (ret == 0) { + return head; +#ifdef _WIN32 + } else { + throw std::system_error{THRIFT_GET_SOCKET_ERROR, std::system_category()}; +#else + } else if (ret == EAI_SYSTEM) { + throw std::system_error{THRIFT_GET_SOCKET_ERROR, std::system_category()}; + } else { + throw std::system_error{ret, gai_error()}; +#endif + } + } + +public: + /** + * Constructor. May block. Throws errors. + * + * @param port Port number, or service name, as a string. + * @param socktype Socket type, SOCK_STREAM or SOCK_DGRAM. + * @param flags Standard getaddrinfo() flags. + */ + AddressResolutionHelper(const std::string& host, + const std::string& port, // pass "25" or "smtp" for port 25 + int socktype = SOCK_STREAM, + int flags = AI_V4MAPPED | AI_ADDRCONFIG) + : gai_results(query(host, port, socktype, flags)) {} + + AddressResolutionHelper() = default; + + /** + * Manual query. May block. Throws errors. + * + * @param port Port number, or service name, as a string. + * @param socktype Socket type, SOCK_STREAM or SOCK_DGRAM. + * @param flags Standard getaddrinfo() flags. + */ + AddressResolutionHelper& resolve(const std::string& host, + const std::string& port, // pass "25" or "smtp" for port 25 + int socktype = SOCK_STREAM, + int flags = AI_V4MAPPED | AI_ADDRCONFIG) { + gai_results.reset(query(host, port, socktype, flags)); + return *this; + } + + /** + * Return ForwardIterator to struct addrinfo* results. + */ + Iter iterate() const { return Iter{gai_results.get()}; } +}; + +} // namespace thrift +} // namespace apache + +#endif diff --git a/bsnes/thrift/thrift/transport/TTransport.h b/bsnes/thrift/thrift/transport/TTransport.h new file mode 100644 index 00000000..52b3a0a4 --- /dev/null +++ b/bsnes/thrift/thrift/transport/TTransport.h @@ -0,0 +1,357 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +#ifndef _THRIFT_TRANSPORT_TTRANSPORT_H_ +#define _THRIFT_TRANSPORT_TTRANSPORT_H_ 1 + +#include +#include +#include +#include +#include + +namespace apache { +namespace thrift { +namespace transport { + +/** + * Helper template to hoist readAll implementation out of TTransport + */ +template +uint32_t readAll(Transport_& trans, uint8_t* buf, uint32_t len) { + uint32_t have = 0; + uint32_t get = 0; + + while (have < len) { + get = trans.read(buf + have, len - have); + if (get <= 0) { + throw TTransportException(TTransportException::END_OF_FILE, "No more data to read."); + } + have += get; + } + + return have; +} + +/** + * Generic interface for a method of transporting data. A TTransport may be + * capable of either reading or writing, but not necessarily both. + * + */ +class TTransport { +public: + TTransport(std::shared_ptr config = nullptr) { + if(config == nullptr) { + configuration_ = std::shared_ptr (new TConfiguration()); + } else { + configuration_ = config; + } + resetConsumedMessageSize(); + } + + /** + * Virtual deconstructor. + */ + virtual ~TTransport() = default; + + /** + * Whether this transport is open. + */ + virtual bool isOpen() const { return false; } + + /** + * Tests whether there is more data to read or if the remote side is + * still open. By default this is true whenever the transport is open, + * but implementations should add logic to test for this condition where + * possible (i.e. on a socket). + * This is used by a server to check if it should listen for another + * request. + */ + virtual bool peek() { return isOpen(); } + + /** + * Opens the transport for communications. + * + * @return bool Whether the transport was successfully opened + * @throws TTransportException if opening failed + */ + virtual void open() { + throw TTransportException(TTransportException::NOT_OPEN, "Cannot open base TTransport."); + } + + /** + * Closes the transport. + */ + virtual void close() { + throw TTransportException(TTransportException::NOT_OPEN, "Cannot close base TTransport."); + } + + /** + * Attempt to read up to the specified number of bytes into the string. + * + * @param buf Reference to the location to write the data + * @param len How many bytes to read + * @return How many bytes were actually read + * @throws TTransportException If an error occurs + */ + uint32_t read(uint8_t* buf, uint32_t len) { + T_VIRTUAL_CALL(); + return read_virt(buf, len); + } + virtual uint32_t read_virt(uint8_t* /* buf */, uint32_t /* len */) { + throw TTransportException(TTransportException::NOT_OPEN, "Base TTransport cannot read."); + } + + /** + * Reads the given amount of data in its entirety no matter what. + * + * @param s Reference to location for read data + * @param len How many bytes to read + * @return How many bytes read, which must be equal to size + * @throws TTransportException If insufficient data was read + */ + uint32_t readAll(uint8_t* buf, uint32_t len) { + T_VIRTUAL_CALL(); + return readAll_virt(buf, len); + } + virtual uint32_t readAll_virt(uint8_t* buf, uint32_t len) { + return apache::thrift::transport::readAll(*this, buf, len); + } + + /** + * Called when read is completed. + * This can be over-ridden to perform a transport-specific action + * e.g. logging the request to a file + * + * @return number of bytes read if available, 0 otherwise. + */ + virtual uint32_t readEnd() { + // default behaviour is to do nothing + return 0; + } + + /** + * Writes the string in its entirety to the buffer. + * + * Note: You must call flush() to ensure the data is actually written, + * and available to be read back in the future. Destroying a TTransport + * object does not automatically flush pending data--if you destroy a + * TTransport object with written but unflushed data, that data may be + * discarded. + * + * @param buf The data to write out + * @throws TTransportException if an error occurs + */ + void write(const uint8_t* buf, uint32_t len) { + T_VIRTUAL_CALL(); + write_virt(buf, len); + } + virtual void write_virt(const uint8_t* /* buf */, uint32_t /* len */) { + throw TTransportException(TTransportException::NOT_OPEN, "Base TTransport cannot write."); + } + + /** + * Called when write is completed. + * This can be over-ridden to perform a transport-specific action + * at the end of a request. + * + * @return number of bytes written if available, 0 otherwise + */ + virtual uint32_t writeEnd() { + // default behaviour is to do nothing + return 0; + } + + /** + * Flushes any pending data to be written. Typically used with buffered + * transport mechanisms. + * + * @throws TTransportException if an error occurs + */ + virtual void flush() { + // default behaviour is to do nothing + } + + /** + * Attempts to return a pointer to \c len bytes, possibly copied into \c buf. + * Does not consume the bytes read (i.e.: a later read will return the same + * data). This method is meant to support protocols that need to read + * variable-length fields. They can attempt to borrow the maximum amount of + * data that they will need, then consume (see next method) what they + * actually use. Some transports will not support this method and others + * will fail occasionally, so protocols must be prepared to use read if + * borrow fails. + * + * @oaram buf A buffer where the data can be stored if needed. + * If borrow doesn't return buf, then the contents of + * buf after the call are undefined. This parameter may be + * nullptr to indicate that the caller is not supplying storage, + * but would like a pointer into an internal buffer, if + * available. + * @param len *len should initially contain the number of bytes to borrow. + * If borrow succeeds, *len will contain the number of bytes + * available in the returned pointer. This will be at least + * what was requested, but may be more if borrow returns + * a pointer to an internal buffer, rather than buf. + * If borrow fails, the contents of *len are undefined. + * @return If the borrow succeeds, return a pointer to the borrowed data. + * This might be equal to \c buf, or it might be a pointer into + * the transport's internal buffers. + * @throws TTransportException if an error occurs + */ + const uint8_t* borrow(uint8_t* buf, uint32_t* len) { + T_VIRTUAL_CALL(); + return borrow_virt(buf, len); + } + virtual const uint8_t* borrow_virt(uint8_t* /* buf */, uint32_t* /* len */) { return nullptr; } + + /** + * Remove len bytes from the transport. This should always follow a borrow + * of at least len bytes, and should always succeed. + * TODO(dreiss): Is there any transport that could borrow but fail to + * consume, or that would require a buffer to dump the consumed data? + * + * @param len How many bytes to consume + * @throws TTransportException If an error occurs + */ + void consume(uint32_t len) { + T_VIRTUAL_CALL(); + consume_virt(len); + } + virtual void consume_virt(uint32_t /* len */) { + throw TTransportException(TTransportException::NOT_OPEN, "Base TTransport cannot consume."); + } + + /** + * Returns the origin of the transports call. The value depends on the + * transport used. An IP based transport for example will return the + * IP address of the client making the request. + * If the transport doesn't know the origin Unknown is returned. + * + * The returned value can be used in a log message for example + */ + virtual const std::string getOrigin() const { return "Unknown"; } + + std::shared_ptr getConfiguration() { return configuration_; } + + void setConfiguration(std::shared_ptr config) { + if (config != nullptr) configuration_ = config; + } + + /** + * Updates RemainingMessageSize to reflect then known real message size (e.g. framed transport). + * Will throw if we already consumed too many bytes or if the new size is larger than allowed. + * + * @param size real message size + */ + void updateKnownMessageSize(long int size) + { + long int consumed = knownMessageSize_ - remainingMessageSize_; + resetConsumedMessageSize(size); + countConsumedMessageBytes(consumed); + } + + /** + * Throws if there are not enough bytes in the input stream to satisfy a read of numBytes bytes of data + * + * @param numBytes numBytes bytes of data + */ + void checkReadBytesAvailable(long int numBytes) + { + if (remainingMessageSize_ < numBytes) + throw TTransportException(TTransportException::END_OF_FILE, "MaxMessageSize reached"); + } + +protected: + std::shared_ptr configuration_; + long int remainingMessageSize_; + long int knownMessageSize_; + + inline long int getRemainingMessageSize() { return remainingMessageSize_; } + inline void setRemainingMessageSize(long int remainingMessageSize) { remainingMessageSize_ = remainingMessageSize; } + inline int getMaxMessageSize() { return configuration_->getMaxMessageSize(); } + inline long int getKnownMessageSize() { return knownMessageSize_; } + void setKnownMessageSize(long int knownMessageSize) { knownMessageSize_ = knownMessageSize; } + + /** + * Resets RemainingMessageSize to the configured maximum + * + * @param newSize configured size + */ + void resetConsumedMessageSize(long newSize = -1) + { + // full reset + if (newSize < 0) + { + knownMessageSize_ = getMaxMessageSize(); + remainingMessageSize_ = getMaxMessageSize(); + return; + } + + // update only: message size can shrink, but not grow + if (newSize > knownMessageSize_) + throw TTransportException(TTransportException::END_OF_FILE, "MaxMessageSize reached"); + + knownMessageSize_ = newSize; + remainingMessageSize_ = newSize; + } + + /** + * Consumes numBytes from the RemainingMessageSize. + * + * @param numBytes Consumes numBytes + */ + void countConsumedMessageBytes(long int numBytes) + { + if (remainingMessageSize_ >= numBytes) + { + remainingMessageSize_ -= numBytes; + } + else + { + remainingMessageSize_ = 0; + throw TTransportException(TTransportException::END_OF_FILE, "MaxMessageSize reached"); + } + } +}; + +/** + * Generic factory class to make an input and output transport out of a + * source transport. Commonly used inside servers to make input and output + * streams out of raw clients. + * + */ +class TTransportFactory { +public: + TTransportFactory() = default; + + virtual ~TTransportFactory() = default; + + /** + * Default implementation does nothing, just returns the transport given. + */ + virtual std::shared_ptr getTransport(std::shared_ptr trans) { + return trans; + } +}; +} +} +} // apache::thrift::transport + +#endif // #ifndef _THRIFT_TRANSPORT_TTRANSPORT_H_ diff --git a/bsnes/thrift/thrift/transport/TTransportException.h b/bsnes/thrift/thrift/transport/TTransportException.h new file mode 100644 index 00000000..dd5f361f --- /dev/null +++ b/bsnes/thrift/thrift/transport/TTransportException.h @@ -0,0 +1,107 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +#ifndef _THRIFT_TRANSPORT_TTRANSPORTEXCEPTION_H_ +#define _THRIFT_TRANSPORT_TTRANSPORTEXCEPTION_H_ 1 + +#include +#include +#include + +namespace apache { +namespace thrift { +namespace transport { + +/** + * Class to encapsulate all the possible types of transport errors that may + * occur in various transport systems. This provides a sort of generic + * wrapper around the vague UNIX E_ error codes that lets a common code + * base of error handling to be used for various types of transports, i.e. + * pipes etc. + * + */ +class TTransportException : public apache::thrift::TException { +public: + /** + * Error codes for the various types of exceptions. + */ + enum TTransportExceptionType { + UNKNOWN = 0, + NOT_OPEN = 1, + TIMED_OUT = 2, + END_OF_FILE = 3, + INTERRUPTED = 4, + BAD_ARGS = 5, + CORRUPTED_DATA = 6, + INTERNAL_ERROR = 7, + CLIENT_DISCONNECT = 8 + }; + + TTransportException() : apache::thrift::TException(), type_(UNKNOWN) {} + + TTransportException(TTransportExceptionType type) : apache::thrift::TException(), type_(type) {} + + TTransportException(const std::string& message) + : apache::thrift::TException(message), type_(UNKNOWN) {} + + TTransportException(TTransportExceptionType type, const std::string& message) + : apache::thrift::TException(message), type_(type) {} + + TTransportException(TTransportExceptionType type, const std::string& message, int errno_copy) + : apache::thrift::TException(message + ": " + TOutput::strerror_s(errno_copy)), type_(type) {} + + ~TTransportException() noexcept override = default; + + /** + * Returns an error code that provides information about the type of error + * that has occurred. + * + * @return Error code + */ + TTransportExceptionType getType() const noexcept { return type_; } + + const char* what() const noexcept override; + +protected: + /** Just like strerror_r but returns a C++ string object. */ + std::string strerror_s(int errno_copy); + + /** Error code */ + TTransportExceptionType type_; +}; + +/** + * Legacy code in transport implementations have overflow issues + * that need to be enforced. + */ +template To safe_numeric_cast(From i) { + try { + return boost::numeric_cast(i); + } + catch (const std::bad_cast& bc) { + throw TTransportException(TTransportException::CORRUPTED_DATA, + bc.what()); + } +} + +} +} +} // apache::thrift::transport + +#endif // #ifndef _THRIFT_TRANSPORT_TTRANSPORTEXCEPTION_H_ diff --git a/bsnes/thrift/thrift/transport/TTransportUtils.h b/bsnes/thrift/thrift/transport/TTransportUtils.h new file mode 100644 index 00000000..68c25f4c --- /dev/null +++ b/bsnes/thrift/thrift/transport/TTransportUtils.h @@ -0,0 +1,319 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +#ifndef _THRIFT_TRANSPORT_TTRANSPORTUTILS_H_ +#define _THRIFT_TRANSPORT_TTRANSPORTUTILS_H_ 1 + +#include +#include +#include +#include +#include +// Include the buffered transports that used to be defined here. +#include +#include + +namespace apache { +namespace thrift { +namespace transport { + +/** + * The null transport is a dummy transport that doesn't actually do anything. + * It's sort of an analogy to /dev/null, you can never read anything from it + * and it will let you write anything you want to it, though it won't actually + * go anywhere. + * + */ +class TNullTransport : public TVirtualTransport { +public: + TNullTransport() = default; + + ~TNullTransport() override = default; + + bool isOpen() const override { return true; } + + void open() override {} + + void write(const uint8_t* /* buf */, uint32_t /* len */) { return; } +}; + +/** + * TPipedTransport. This transport allows piping of a request from one + * transport to another either when readEnd() or writeEnd(). The typical + * use case for this is to log a request or a reply to disk. + * The underlying buffer expands to a keep a copy of the entire + * request/response. + * + */ +class TPipedTransport : virtual public TTransport { +public: + TPipedTransport(std::shared_ptr srcTrans, std::shared_ptr dstTrans, + std::shared_ptr config = nullptr) + : TTransport(config), + srcTrans_(srcTrans), + dstTrans_(dstTrans), + rBufSize_(512), + rPos_(0), + rLen_(0), + wBufSize_(512), + wLen_(0) { + + // default is to to pipe the request when readEnd() is called + pipeOnRead_ = true; + pipeOnWrite_ = false; + + rBuf_ = (uint8_t*)std::malloc(sizeof(uint8_t) * rBufSize_); + if (rBuf_ == nullptr) { + throw std::bad_alloc(); + } + wBuf_ = (uint8_t*)std::malloc(sizeof(uint8_t) * wBufSize_); + if (wBuf_ == nullptr) { + throw std::bad_alloc(); + } + } + + TPipedTransport(std::shared_ptr srcTrans, + std::shared_ptr dstTrans, + uint32_t sz, + std::shared_ptr config = nullptr) + : TTransport(config), + srcTrans_(srcTrans), + dstTrans_(dstTrans), + rBufSize_(512), + rPos_(0), + rLen_(0), + wBufSize_(sz), + wLen_(0) { + + rBuf_ = (uint8_t*)std::malloc(sizeof(uint8_t) * rBufSize_); + if (rBuf_ == nullptr) { + throw std::bad_alloc(); + } + wBuf_ = (uint8_t*)std::malloc(sizeof(uint8_t) * wBufSize_); + if (wBuf_ == nullptr) { + throw std::bad_alloc(); + } + } + + ~TPipedTransport() override { + std::free(rBuf_); + std::free(wBuf_); + } + + bool isOpen() const override { return srcTrans_->isOpen(); } + + bool peek() override { + if (rPos_ >= rLen_) { + // Double the size of the underlying buffer if it is full + if (rLen_ == rBufSize_) { + rBufSize_ *= 2; + auto * tmpBuf = (uint8_t*)std::realloc(rBuf_, sizeof(uint8_t) * rBufSize_); + if (tmpBuf == nullptr) { + throw std::bad_alloc(); + } + rBuf_ = tmpBuf; + } + + // try to fill up the buffer + rLen_ += srcTrans_->read(rBuf_ + rPos_, rBufSize_ - rPos_); + } + return (rLen_ > rPos_); + } + + void open() override { srcTrans_->open(); } + + void close() override { srcTrans_->close(); } + + void setPipeOnRead(bool pipeVal) { pipeOnRead_ = pipeVal; } + + void setPipeOnWrite(bool pipeVal) { pipeOnWrite_ = pipeVal; } + + uint32_t read(uint8_t* buf, uint32_t len); + + uint32_t readEnd() override { + + if (pipeOnRead_) { + dstTrans_->write(rBuf_, rPos_); + dstTrans_->flush(); + } + + srcTrans_->readEnd(); + + // If requests are being pipelined, copy down our read-ahead data, + // then reset our state. + int read_ahead = rLen_ - rPos_; + uint32_t bytes = rPos_; + memcpy(rBuf_, rBuf_ + rPos_, read_ahead); + rPos_ = 0; + rLen_ = read_ahead; + + return bytes; + } + + void write(const uint8_t* buf, uint32_t len); + + uint32_t writeEnd() override { + if (pipeOnWrite_) { + dstTrans_->write(wBuf_, wLen_); + dstTrans_->flush(); + } + return wLen_; + } + + void flush() override; + + std::shared_ptr getTargetTransport() { return dstTrans_; } + + /* + * Override TTransport *_virt() functions to invoke our implementations. + * We cannot use TVirtualTransport to provide these, since we need to inherit + * virtually from TTransport. + */ + uint32_t read_virt(uint8_t* buf, uint32_t len) override { return this->read(buf, len); } + void write_virt(const uint8_t* buf, uint32_t len) override { this->write(buf, len); } + +protected: + std::shared_ptr srcTrans_; + std::shared_ptr dstTrans_; + + uint8_t* rBuf_; + uint32_t rBufSize_; + uint32_t rPos_; + uint32_t rLen_; + + uint8_t* wBuf_; + uint32_t wBufSize_; + uint32_t wLen_; + + bool pipeOnRead_; + bool pipeOnWrite_; +}; + +/** + * Wraps a transport into a pipedTransport instance. + * + */ +class TPipedTransportFactory : public TTransportFactory { +public: + TPipedTransportFactory() = default; + TPipedTransportFactory(std::shared_ptr dstTrans) { + initializeTargetTransport(dstTrans); + } + ~TPipedTransportFactory() override = default; + + /** + * Wraps the base transport into a piped transport. + */ + std::shared_ptr getTransport(std::shared_ptr srcTrans) override { + return std::shared_ptr(new TPipedTransport(srcTrans, dstTrans_)); + } + + virtual void initializeTargetTransport(std::shared_ptr dstTrans) { + if (dstTrans_.get() == nullptr) { + dstTrans_ = dstTrans; + } else { + throw TException("Target transport already initialized"); + } + } + +protected: + std::shared_ptr dstTrans_; +}; + +/** + * TPipedFileTransport. This is just like a TTransport, except that + * it is a templatized class, so that clients who rely on a specific + * TTransport can still access the original transport. + * + */ +class TPipedFileReaderTransport : public TPipedTransport, public TFileReaderTransport { +public: + TPipedFileReaderTransport(std::shared_ptr srcTrans, + std::shared_ptr dstTrans, + std::shared_ptr config = nullptr); + + ~TPipedFileReaderTransport() override; + + // TTransport functions + bool isOpen() const override; + bool peek() override; + void open() override; + void close() override; + uint32_t read(uint8_t* buf, uint32_t len); + uint32_t readAll(uint8_t* buf, uint32_t len); + uint32_t readEnd() override; + void write(const uint8_t* buf, uint32_t len); + uint32_t writeEnd() override; + void flush() override; + + // TFileReaderTransport functions + int32_t getReadTimeout() override; + void setReadTimeout(int32_t readTimeout) override; + uint32_t getNumChunks() override; + uint32_t getCurChunk() override; + void seekToChunk(int32_t chunk) override; + void seekToEnd() override; + + /* + * Override TTransport *_virt() functions to invoke our implementations. + * We cannot use TVirtualTransport to provide these, since we need to inherit + * virtually from TTransport. + */ + uint32_t read_virt(uint8_t* buf, uint32_t len) override { return this->read(buf, len); } + uint32_t readAll_virt(uint8_t* buf, uint32_t len) override { return this->readAll(buf, len); } + void write_virt(const uint8_t* buf, uint32_t len) override { this->write(buf, len); } + +protected: + // shouldn't be used + TPipedFileReaderTransport(); + std::shared_ptr srcTrans_; +}; + +/** + * Creates a TPipedFileReaderTransport from a filepath and a destination transport + * + */ +class TPipedFileReaderTransportFactory : public TPipedTransportFactory { +public: + TPipedFileReaderTransportFactory() = default; + TPipedFileReaderTransportFactory(std::shared_ptr dstTrans) + : TPipedTransportFactory(dstTrans) {} + ~TPipedFileReaderTransportFactory() override = default; + + std::shared_ptr getTransport(std::shared_ptr srcTrans) override { + std::shared_ptr pFileReaderTransport + = std::dynamic_pointer_cast(srcTrans); + if (pFileReaderTransport.get() != nullptr) { + return getFileReaderTransport(pFileReaderTransport); + } else { + return std::shared_ptr(); + } + } + + std::shared_ptr getFileReaderTransport( + std::shared_ptr srcTrans) { + return std::shared_ptr( + new TPipedFileReaderTransport(srcTrans, dstTrans_)); + } +}; +} +} +} // apache::thrift::transport + +#endif // #ifndef _THRIFT_TRANSPORT_TTRANSPORTUTILS_H_ diff --git a/bsnes/thrift/thrift/transport/TVirtualTransport.h b/bsnes/thrift/thrift/transport/TVirtualTransport.h new file mode 100644 index 00000000..44bfa131 --- /dev/null +++ b/bsnes/thrift/thrift/transport/TVirtualTransport.h @@ -0,0 +1,140 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +#ifndef _THRIFT_TRANSPORT_TVIRTUALTRANSPORT_H_ +#define _THRIFT_TRANSPORT_TVIRTUALTRANSPORT_H_ 1 + +#include + +namespace apache { +namespace thrift { +namespace transport { + +/** + * Helper class that provides default implementations of TTransport methods. + * + * This class provides default implementations of read(), readAll(), write(), + * borrow() and consume(). + * + * In the TTransport base class, each of these methods simply invokes its + * virtual counterpart. This class overrides them to always perform the + * default behavior, without a virtual function call. + * + * The primary purpose of this class is to serve as a base class for + * TVirtualTransport, and prevent infinite recursion if one of its subclasses + * does not override the TTransport implementation of these methods. (Since + * TVirtualTransport::read_virt() calls read(), and TTransport::read() calls + * read_virt().) + */ +class TTransportDefaults : public TTransport { +public: + /* + * TTransport *_virt() methods provide reasonable default implementations. + * Invoke them non-virtually. + */ + uint32_t read(uint8_t* buf, uint32_t len) { return this->TTransport::read_virt(buf, len); } + uint32_t readAll(uint8_t* buf, uint32_t len) { return this->TTransport::readAll_virt(buf, len); } + void write(const uint8_t* buf, uint32_t len) { this->TTransport::write_virt(buf, len); } + const uint8_t* borrow(uint8_t* buf, uint32_t* len) { + return this->TTransport::borrow_virt(buf, len); + } + void consume(uint32_t len) { this->TTransport::consume_virt(len); } + +protected: + TTransportDefaults(std::shared_ptr config = nullptr) : TTransport(config) {} +}; + +/** + * Helper class to provide polymorphism for subclasses of TTransport. + * + * This class implements *_virt() methods of TTransport, to call the + * non-virtual versions of these functions in the proper subclass. + * + * To define your own transport class using TVirtualTransport: + * 1) Derive your subclass from TVirtualTransport + * e.g: class MyTransport : public TVirtualTransport { + * 2) Provide your own implementations of read(), readAll(), etc. + * These methods should be non-virtual. + * + * Transport implementations that need to use virtual inheritance when + * inheriting from TTransport cannot use TVirtualTransport. + * + * @author Chad Walters + */ +template +class TVirtualTransport : public Super_ { +public: + /* + * Implementations of the *_virt() functions, to call the subclass's + * non-virtual implementation function. + */ + uint32_t read_virt(uint8_t* buf, uint32_t len) override { + return static_cast(this)->read(buf, len); + } + + uint32_t readAll_virt(uint8_t* buf, uint32_t len) override { + return static_cast(this)->readAll(buf, len); + } + + void write_virt(const uint8_t* buf, uint32_t len) override { + static_cast(this)->write(buf, len); + } + + const uint8_t* borrow_virt(uint8_t* buf, uint32_t* len) override { + return static_cast(this)->borrow(buf, len); + } + + void consume_virt(uint32_t len) override { static_cast(this)->consume(len); } + + /* + * Provide a default readAll() implementation that invokes + * read() non-virtually. + * + * Note: subclasses that use TVirtualTransport to derive from another + * transport implementation (i.e., not TTransportDefaults) should beware that + * this may override any non-default readAll() implementation provided by + * the parent transport class. They may need to redefine readAll() to call + * the correct parent implementation, if desired. + */ + uint32_t readAll(uint8_t* buf, uint32_t len) { + auto* trans = static_cast(this); + return ::apache::thrift::transport::readAll(*trans, buf, len); + } + +protected: + TVirtualTransport() : Super_() {} + + /* + * Templatized constructors, to allow arguments to be passed to the Super_ + * constructor. Currently we only support 0, 1, or 2 arguments, but + * additional versions can be added as needed. + */ + template + TVirtualTransport(Arg_ const& arg) + : Super_(arg) {} + + template + TVirtualTransport(Arg1_ const& a1, Arg2_ const& a2) + : Super_(a1, a2) {} +}; +} +} +} // apache::thrift::transport + +#endif // #ifndef _THRIFT_TRANSPORT_TVIRTUALTRANSPORT_H_ diff --git a/bsnes/thrift/thrift/transport/TZlibTransport.h b/bsnes/thrift/thrift/transport/TZlibTransport.h new file mode 100644 index 00000000..85765e6b --- /dev/null +++ b/bsnes/thrift/thrift/transport/TZlibTransport.h @@ -0,0 +1,251 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +#ifndef _THRIFT_TRANSPORT_TZLIBTRANSPORT_H_ +#define _THRIFT_TRANSPORT_TZLIBTRANSPORT_H_ 1 + +#include +#include +#include +#include + +struct z_stream_s; + +namespace apache { +namespace thrift { +namespace transport { + +class TZlibTransportException : public TTransportException { +public: + TZlibTransportException(int status, const char* msg) + : TTransportException(TTransportException::INTERNAL_ERROR, errorMessage(status, msg)), + zlib_status_(status), + zlib_msg_(msg == nullptr ? "(null)" : msg) {} + + ~TZlibTransportException() noexcept override = default; + + int getZlibStatus() { return zlib_status_; } + std::string getZlibMessage() { return zlib_msg_; } + + static std::string errorMessage(int status, const char* msg) { + std::string rv = "zlib error: "; + if (msg) { + rv += msg; + } else { + rv += "(no message)"; + } + rv += " (status = "; + rv += to_string(status); + rv += ")"; + return rv; + } + + int zlib_status_; + std::string zlib_msg_; +}; + +/** + * This transport uses zlib to compress on write and decompress on read + * + * TODO(dreiss): Don't do an extra copy of the compressed data if + * the underlying transport is TBuffered or TMemory. + * + */ +class TZlibTransport : public TVirtualTransport { +public: + /** + * @param transport The transport to read compressed data from + * and write compressed data to. + * @param urbuf_size Uncompressed buffer size for reading. + * @param crbuf_size Compressed buffer size for reading. + * @param uwbuf_size Uncompressed buffer size for writing. + * @param cwbuf_size Compressed buffer size for writing. + * @param comp_level Compression level (0=none[fast], 6=default, 9=max[slow]). + */ + TZlibTransport(std::shared_ptr transport, + int urbuf_size = DEFAULT_URBUF_SIZE, + int crbuf_size = DEFAULT_CRBUF_SIZE, + int uwbuf_size = DEFAULT_UWBUF_SIZE, + int cwbuf_size = DEFAULT_CWBUF_SIZE, + int16_t comp_level = Z_DEFAULT_COMPRESSION, + std::shared_ptr config = nullptr) + : TVirtualTransport(config), + transport_(transport), + urpos_(0), + uwpos_(0), + input_ended_(false), + output_finished_(false), + urbuf_size_(urbuf_size), + crbuf_size_(crbuf_size), + uwbuf_size_(uwbuf_size), + cwbuf_size_(cwbuf_size), + urbuf_(nullptr), + crbuf_(nullptr), + uwbuf_(nullptr), + cwbuf_(nullptr), + rstream_(nullptr), + wstream_(nullptr), + comp_level_(comp_level) { + if (uwbuf_size_ < MIN_DIRECT_DEFLATE_SIZE) { + // Have to copy this into a local because of a linking issue. + int minimum = MIN_DIRECT_DEFLATE_SIZE; + throw TTransportException(TTransportException::BAD_ARGS, + "TZLibTransport: uncompressed write buffer must be at least" + + to_string(minimum) + "."); + } + + try { + urbuf_ = new uint8_t[urbuf_size]; + crbuf_ = new uint8_t[crbuf_size]; + uwbuf_ = new uint8_t[uwbuf_size]; + cwbuf_ = new uint8_t[cwbuf_size]; + + // Don't call this outside of the constructor. + initZlib(); + + } catch (...) { + delete[] urbuf_; + delete[] crbuf_; + delete[] uwbuf_; + delete[] cwbuf_; + throw; + } + } + + // Don't call this outside of the constructor. + void initZlib(); + + /** + * TZlibTransport destructor. + * + * Warning: Destroying a TZlibTransport object may discard any written but + * unflushed data. You must explicitly call flush() or finish() to ensure + * that data is actually written and flushed to the underlying transport. + */ + ~TZlibTransport() override; + + bool isOpen() const override; + bool peek() override; + + void open() override { transport_->open(); } + + void close() override { transport_->close(); } + + uint32_t read(uint8_t* buf, uint32_t len); + + void write(const uint8_t* buf, uint32_t len); + + void flush() override; + + /** + * Finalize the zlib stream. + * + * This causes zlib to flush any pending write data and write end-of-stream + * information, including the checksum. Once finish() has been called, no + * new data can be written to the stream. + */ + void finish(); + + const uint8_t* borrow(uint8_t* buf, uint32_t* len); + + void consume(uint32_t len); + + /** + * Verify the checksum at the end of the zlib stream. + * + * This may only be called after all data has been read. + * It verifies the checksum that was written by the finish() call. + */ + void verifyChecksum(); + + /** + * TODO(someone_smart): Choose smart defaults. + */ + static const int DEFAULT_URBUF_SIZE = 128; + static const int DEFAULT_CRBUF_SIZE = 1024; + static const int DEFAULT_UWBUF_SIZE = 128; + static const int DEFAULT_CWBUF_SIZE = 1024; + + std::shared_ptr getUnderlyingTransport() const { return transport_; } + +protected: + inline void checkZlibRv(int status, const char* msg); + inline void checkZlibRvNothrow(int status, const char* msg); + inline int readAvail() const; + void flushToTransport(int flush); + void flushToZlib(const uint8_t* buf, int len, int flush); + bool readFromZlib(); + +protected: + // Writes smaller than this are buffered up. + // Larger (or equal) writes are dumped straight to zlib. + static const uint32_t MIN_DIRECT_DEFLATE_SIZE = 32; + + std::shared_ptr transport_; + + int urpos_; + int uwpos_; + + /// True iff zlib has reached the end of the input stream. + bool input_ended_; + /// True iff we have finished the output stream. + bool output_finished_; + + uint32_t urbuf_size_; + uint32_t crbuf_size_; + uint32_t uwbuf_size_; + uint32_t cwbuf_size_; + + uint8_t* urbuf_; + uint8_t* crbuf_; + uint8_t* uwbuf_; + uint8_t* cwbuf_; + + struct z_stream_s* rstream_; + struct z_stream_s* wstream_; + + const int comp_level_; +}; + +/** + * Wraps a transport into a zlibbed one. + * + */ +class TZlibTransportFactory : public TTransportFactory { +public: + TZlibTransportFactory() = default; + + /** + * Wraps a transport factory into a zlibbed one. + */ + TZlibTransportFactory(std::shared_ptr transportFactory); + + ~TZlibTransportFactory() override = default; + + std::shared_ptr getTransport(std::shared_ptr trans) override; + +protected: + std::shared_ptr transportFactory_; +}; + +} +} +} // apache::thrift::transport + +#endif // #ifndef _THRIFT_TRANSPORT_TZLIBTRANSPORT_H_ diff --git a/bsnes/thrift/thrift/windows/GetTimeOfDay.h b/bsnes/thrift/thrift/windows/GetTimeOfDay.h new file mode 100644 index 00000000..762ac5e2 --- /dev/null +++ b/bsnes/thrift/thrift/windows/GetTimeOfDay.h @@ -0,0 +1,44 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +#ifndef _THRIFT_WINDOWS_GETTIMEOFDAY_H_ +#define _THRIFT_WINDOWS_GETTIMEOFDAY_H_ + +#if defined(_MSC_VER) && (_MSC_VER > 1200) +#pragma once +#endif // _MSC_VER + +#ifndef _WIN32 +#error This is a MSVC header only. +#endif + +#include +#include + +struct thrift_timespec { + int64_t tv_sec; + int64_t tv_nsec; +}; + +int thrift_gettimeofday(struct timeval* tv, struct timezone* tz); +int thrift_sleep(unsigned int seconds); +int thrift_usleep(unsigned int micro_seconds); +char* thrift_ctime_r(const time_t* _clock, char* _buf); + +#endif // _THRIFT_WINDOWS_GETTIMEOFDAY_H_ diff --git a/bsnes/thrift/thrift/windows/Operators.h b/bsnes/thrift/thrift/windows/Operators.h new file mode 100644 index 00000000..9b860968 --- /dev/null +++ b/bsnes/thrift/thrift/windows/Operators.h @@ -0,0 +1,40 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +#ifndef _THRIFT_WINDOWS_OPERATORS_H_ +#define _THRIFT_WINDOWS_OPERATORS_H_ + +#if defined(_MSC_VER) && (_MSC_VER > 1200) +#pragma once +#endif // _MSC_VER + +namespace apache { +namespace thrift { + +class TEnumIterator; + +inline bool operator==(const TEnumIterator&, const TEnumIterator&) { + // Not entirely sure what the test should be here. It is only to enable + // iterator debugging and is not used in release mode. + return true; +} +} +} // apache::thrift + +#endif // _THRIFT_WINDOWS_OPERATORS_H_ diff --git a/bsnes/thrift/thrift/windows/OverlappedSubmissionThread.h b/bsnes/thrift/thrift/windows/OverlappedSubmissionThread.h new file mode 100644 index 00000000..dd0c5c95 --- /dev/null +++ b/bsnes/thrift/thrift/windows/OverlappedSubmissionThread.h @@ -0,0 +1,133 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +#ifndef _THRIFT_WINDOWS_OverlappedSubmissionThread_H_ +#define _THRIFT_WINDOWS_OverlappedSubmissionThread_H_ 1 + +#ifndef _WIN32 +#error "OverlappedSubmissionThread.h is only usable on Windows" +#endif + +#include +#include +#include + +/* + *** Why does this class exist? + In short, because we want to enable something similar to a "select" loop, on Windows, with + named pipes. The core of the "select" loop is a call to WaitForMultipleObjects. So that means + we need a signalable object that indicates when data is available. + + A pipe handle doesn't do that. A pipe handle is signaled when a read or write completes, and if + no one has called read or write, then the pipe handle is useless in WaitForMultipleObjects. So + instead, we use overlapped I/O. With overlapped I/O, you call read, and associate an event with + the read. When the read finishes, the event is signaled. This means that when you create a pipe, + you start a read. When the customer calls read on your transport object, you wait for the last + read to finish, and then kick off another. + + There is one big caveat to this though. The thread that initiated the read must stay alive. If + the thread that initiated the read exits, then the read completes in an error state. To ensure + that the initiating thread stays alive, we create a singleton thread whose sole responsibility is + to manage this overlapped I/O requests. This introduces some overhead, but it is overhead that + is necessary for correct behavior. + + This thread currently supports connect, read, and cancel io. So far, I haven't needed to put any + writes on this thread, but if needed, it could be done. The client write buffer would need to be + copied to ensure that it doesn't get invalidated. + + *** How does one use this class? + Create a TOverlappedWorkItem, and fill in the action and "h", then call reset(). Your work item + is now ready to be submitted to the overlapped submission thread. Create a TAutoOverlapThread, + and call thread->addWorkItem with your work item. After addWorkItem completes, you may inspect + last_error and success. At some point in the future, call workItem.overlappedResults to wait + until the operation has completed. +*/ + +namespace apache { +namespace thrift { +namespace transport { + +struct DECLSPEC_ALIGN(MEMORY_ALLOCATION_ALIGNMENT) TOverlappedWorkItem : public SLIST_ENTRY { + TOverlappedWorkItem(); + + enum action_t { + UNKNOWN = 3000, + CONNECT, + READ, + CANCELIO, + STOP, + }; + + TAutoResetEvent doneSubmittingEvent; + action_t action; + HANDLE h; + uint8_t* buffer; + uint32_t buffer_len; + OVERLAPPED overlap; + + DWORD last_error; + BOOL success; + + void reset(uint8_t* buf, uint32_t len, HANDLE event); + uint32_t overlappedResults(bool signal_failure = true); + bool process(); +}; + +class TOverlappedSubmissionThread : boost::noncopyable { +public: + void addWorkItem(TOverlappedWorkItem* item); + + // singleton stuff +public: + static TOverlappedSubmissionThread* acquire_instance(); + static void release_instance(); + +private: + static TCriticalSection instanceGuard_; + static TOverlappedSubmissionThread* instance_; + static uint32_t instanceRefCount_; + + // thread details +private: + TOverlappedSubmissionThread(); + ~TOverlappedSubmissionThread(); + void run(); + static unsigned __stdcall thread_proc(void* addr); + +private: + DECLSPEC_ALIGN(MEMORY_ALLOCATION_ALIGNMENT) SLIST_HEADER workList_; + TOverlappedWorkItem stopItem_; + TAutoResetEvent workAvailableEvent_; + HANDLE thread_; +}; + +class TAutoOverlapThread : boost::noncopyable { +private: + TOverlappedSubmissionThread* p; + +public: + TAutoOverlapThread() : p(TOverlappedSubmissionThread::acquire_instance()) {} + ~TAutoOverlapThread() { TOverlappedSubmissionThread::release_instance(); } + TOverlappedSubmissionThread* operator->() { return p; } +}; +} +} +} // apache::thrift::transport + +#endif diff --git a/bsnes/thrift/thrift/windows/SocketPair.h b/bsnes/thrift/thrift/windows/SocketPair.h new file mode 100644 index 00000000..86bf4315 --- /dev/null +++ b/bsnes/thrift/thrift/windows/SocketPair.h @@ -0,0 +1,37 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +#ifndef _THRIFT_WINDOWS_SOCKETPAIR_H_ +#define _THRIFT_WINDOWS_SOCKETPAIR_H_ 1 + +#if defined(_MSC_VER) && (_MSC_VER > 1200) +#pragma once +#endif // _MSC_VER + +#ifndef _WIN32 +#error This is a MSVC header only. +#endif + +// Win32 +#include +#include + +int thrift_socketpair(int d, int type, int protocol, THRIFT_SOCKET sv[2]); + +#endif // _THRIFT_WINDOWS_SOCKETPAIR_H_ diff --git a/bsnes/thrift/thrift/windows/Sync.h b/bsnes/thrift/thrift/windows/Sync.h new file mode 100644 index 00000000..a296d7ec --- /dev/null +++ b/bsnes/thrift/thrift/windows/Sync.h @@ -0,0 +1,104 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +#ifndef _THRIFT_WINDOWS_Sync_H_ +#define _THRIFT_WINDOWS_Sync_H_ 1 + +#ifndef _WIN32 +#error "windows/Sync.h is only usable on Windows" +#endif + +#include +#include +#include + +/* + Lightweight synchronization objects that only make sense on Windows. For cross-platform + code, use the classes found in the concurrency namespace +*/ + +namespace apache { +namespace thrift { + +struct TCriticalSection : boost::noncopyable { + CRITICAL_SECTION cs; + TCriticalSection() { InitializeCriticalSection(&cs); } + ~TCriticalSection() { DeleteCriticalSection(&cs); } +}; + +class TAutoCrit : boost::noncopyable { +private: + CRITICAL_SECTION* cs_; + +public: + explicit TAutoCrit(TCriticalSection& cs) : cs_(&cs.cs) { EnterCriticalSection(cs_); } + ~TAutoCrit() { LeaveCriticalSection(cs_); } +}; + +struct TAutoResetEvent : boost::noncopyable { + HANDLE h; + + TAutoResetEvent() { + h = CreateEvent(nullptr, FALSE, FALSE, nullptr); + if (h == nullptr) { + GlobalOutput.perror("TAutoResetEvent unable to create event, GLE=", GetLastError()); + throw apache::thrift::concurrency::SystemResourceException("CreateEvent failed"); + } + } + ~TAutoResetEvent() { CloseHandle(h); } +}; + +struct TManualResetEvent : boost::noncopyable { + HANDLE h; + + TManualResetEvent() { + h = CreateEvent(nullptr, TRUE, FALSE, nullptr); + if (h == nullptr) { + GlobalOutput.perror("TManualResetEvent unable to create event, GLE=", GetLastError()); + throw apache::thrift::concurrency::SystemResourceException("CreateEvent failed"); + } + } + ~TManualResetEvent() { CloseHandle(h); } +}; + +struct TAutoHandle : boost::noncopyable { + HANDLE h; + explicit TAutoHandle(HANDLE h_ = INVALID_HANDLE_VALUE) : h(h_) {} + ~TAutoHandle() { + if (h != INVALID_HANDLE_VALUE) + CloseHandle(h); + } + + HANDLE release() { + HANDLE retval = h; + h = INVALID_HANDLE_VALUE; + return retval; + } + void reset(HANDLE h_ = INVALID_HANDLE_VALUE) { + if (h_ == h) + return; + if (h != INVALID_HANDLE_VALUE) + CloseHandle(h); + h = h_; + } +}; +} +} // apache::thrift + +#endif diff --git a/bsnes/thrift/thrift/windows/TWinsockSingleton.h b/bsnes/thrift/thrift/windows/TWinsockSingleton.h new file mode 100644 index 00000000..a30806b9 --- /dev/null +++ b/bsnes/thrift/thrift/windows/TWinsockSingleton.h @@ -0,0 +1,73 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +#ifndef _THRIFT_TRANSPORT_WINDOWS_TWINSOCKSINGLETON_H_ +#define _THRIFT_TRANSPORT_WINDOWS_TWINSOCKSINGLETON_H_ 1 + +#if defined(_MSC_VER) && (_MSC_VER > 1200) +#pragma once +#endif // _MSC_VER + +#ifndef _WIN32 +#error This is a MSVC header only. +#endif + +#include + +// boost +#include + +#include +#include + + +namespace apache { +namespace thrift { +namespace transport { + +/** + * Winsock2 must be intialised once only in order to create sockets. This class + * performs a one time initialisation when create is called. + */ +class TWinsockSingleton : private boost::noncopyable { + +public: + typedef std::shared_ptr instance_ptr; + +private: + TWinsockSingleton(void); + +public: + ~TWinsockSingleton(void); + +public: + static void create(void); + +private: + static void init(void); + +private: + static instance_ptr instance_ptr_; + static std::once_flag flags_; +}; +} +} +} // apache::thrift::transport + +#endif // _THRIFT_TRANSPORT_WINDOWS_TWINSOCKSINGLETON_H_ diff --git a/bsnes/thrift/thrift/windows/WinFcntl.h b/bsnes/thrift/thrift/windows/WinFcntl.h new file mode 100644 index 00000000..4816fc5e --- /dev/null +++ b/bsnes/thrift/thrift/windows/WinFcntl.h @@ -0,0 +1,47 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +#ifndef _THRIFT_WINDOWS_FCNTL_H_ +#define _THRIFT_WINDOWS_FCNTL_H_ 1 + +#if defined(_MSC_VER) && (_MSC_VER > 1200) +#pragma once +#endif // _MSC_VER + +#ifndef _WIN32 +#error This is a MSVC header only. +#endif + +#ifdef _WIN32_WCE +#include +#endif + +// Win32 +#include +#include + +extern "C" { +int thrift_fcntl(THRIFT_SOCKET fd, int cmd, int flags); +} + +#ifdef _WIN32_WCE +std::string thrift_wstr2str(std::wstring ws); +#endif + +#endif // _THRIFT_WINDOWS_FCNTL_H_ diff --git a/bsnes/thrift/thrift/windows/config.h b/bsnes/thrift/thrift/windows/config.h new file mode 100644 index 00000000..a218d908 --- /dev/null +++ b/bsnes/thrift/thrift/windows/config.h @@ -0,0 +1,75 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +#ifndef _THRIFT_WINDOWS_CONFIG_H_ +#define _THRIFT_WINDOWS_CONFIG_H_ 1 + +#if defined(_MSC_VER) && (_MSC_VER > 1200) +#pragma once +#endif // _MSC_VER + +#ifndef _WIN32 +#error "This is a Windows header only" +#endif + +// Something that defines PRId64 is required to build +#define HAVE_INTTYPES_H 1 + +#ifndef _WIN32_WINNT +#define _WIN32_WINNT 0x0601 +#endif + +#if defined(_M_IX86) || defined(_M_X64) +#define ARITHMETIC_RIGHT_SHIFT 1 +#define SIGNED_RIGHT_SHIFT_IS 1 +#endif + +#ifndef __MINGW32__ +#pragma warning(disable : 4996) // Deprecated posix name. +#endif + +#define HAVE_GETTIMEOFDAY 1 +#define HAVE_SYS_STAT_H 1 + +#include + +#include +#include +#include +#include +#include +#include + +// windows +#include +#include +#ifndef __MINGW32__ + #ifdef _WIN32_WCE + #pragma comment(lib, "Ws2.lib") + #else + #pragma comment(lib, "Ws2_32.lib") + #pragma comment(lib, "gdi32.lib") // For static OpenSSL + #pragma comment(lib, "crypt32.lib") // For static OpenSSL + #pragma comment(lib, "user32.lib") // For static OpenSSL + #pragma comment(lib, "advapi32.lib") // For security APIs in TPipeServer + #pragma comment(lib, "Shlwapi.lib") // For StrStrIA in TPipeServer + #endif +#endif // __MINGW32__ + +#endif // _THRIFT_WINDOWS_CONFIG_H_ diff --git a/bsnes/thrift/thrift_32.lib b/bsnes/thrift/thrift_32.lib new file mode 100644 index 0000000000000000000000000000000000000000..aa860ae39347c789e401c98101dd34d9f7e6d7e1 GIT binary patch literal 3749454 zcmeFa%a0_@vL{rFSAdnC)#*{f}pV@`v>E zFaG-MPyPUY{`5cj=VyQVpZy0ve}3}drwsg*fgd6RfA)|6&$B=K@BZ@9e*V_q=$-xi z`N@NyGVoId{upH7Z~r~#?B~x<9-LYR{-yus|2zBn^OFZpDFgrVf9an6vH$#?|M)*Y zd$gbb;XgY2I~9NamA~~*&VK&gRv^XJ>!@jDG&rhx*yipK?6-*Z$N0 z>3Q(?Ki{4`m!H3w{^PUMpa1@MXMbVx^FROdv%mNa|NMjdzdnon{1?5mfAI6? zCl7wgz)u#cS?s6T zJoj(b{_Nv!y*%s#f4{g7EWiJ@dA^OlIk_f z`rVlr$ahB6Ma{pR5jC^>O>kS-FB{qi+aKHZTZX_Y>ODrd7_cN{zkTqD5&qqJo9sNK zoM^rE@4@%)oLRrvZ4hBPaM9}pAAW7b@XXh%`C+>aR`UmI|9QK(+gr2EZ2md0EMT|Z z6Q?d{(u4cWdOHK9>u;-IYrR|CZJYH;TJN;6#9J1keyhmyuY)^( zzCNt>{>Rxa;F#3c{!5UrT9hOFg=1m-{>wsQM8j_Nu0Ze9e(y2S^t*)}Mw(yO*aE9M zO6wI3k|8PVS8E$~r?Fjpe_>nAnr*f5S7qjNszOYKw8a5Z3FM9H$C6byq^6!jMB`W@ z8iqtPa)`LBPJ|Hp>&rqiSWDjxmI3V^xN{nnw?301p)*aZG!b+^Xm1|mKM`?ssxV7q)+tUh^0D)ASFiblXTze3)jYc}51 z`WrM`# zk2U&_ZSeLIsAl^BX35L9ke9pJVY&Bb;!}UWoh|k|zFnL{Tk(H=u$3M@_az4ZezrOQ z@WKBY%=hapkSso}U@H`$O+ndOuOPRF`5t2AZz`qaf=bHzAaX^9Q+unzCG&>+{dEty}T3{_%1vco^M(1Sf)8y35fw*QZ4M{qv zS-WX}p9dS7m^8DP@dFGpYkCyNL?2}OPY(N#ssg5Q3MJES%7Swy_-`JtwNn26`IPo%OrPH!Yus4n*y+w2an1s+7?Je6m{ZEJ4_SRSdDcaf4fu`D2 zCeZAlU~pR9>~U7S509)NBV>OC+AM)sv}cHmjVHJh#J11vJL_E`3@0&8sDa*5N6w3E z?V+_PvnE3@wh&S!J#3S4DD*Vy^7v-t$?w5;}I;@ZRZ z(0aT2f}_Q%c@>hbHJh}D?a6d(Tgfd%wQ5^kw>uqloT(*j?B-QCug%M_+m1Ex#x1u! z?pxq+^J+%CY+gZUgFvpd71o|L?)Q40-5XnC?STc2Z!oc%=PeIE{pQu(Y_Wt9PB0PI zOO}8_o|VN5Crh!IMghV>#f^ekyD}mh1l?#TD#b9zfYJAc3a60EEhypik812coIkL&erk7IV|ozh(uSyQYvH<(|ob@t@y zjmpfd2A4andb{MDYTw2tH2zKMY-)|twgvs`=)RzRqfJZE6s1UnhA1fx;>(K$a~F=G z7IK9_xcFr2BEsSxK@$Or!x%_W93)$m5-rQfQye%~s1l8nk`-?f6R*^-Q)MjK(qs~q zi#Sa#<0xZlDE@U>K}ZqPILf4~Mq3!lYQ)o=rL;Kay0NI$izKX`+^%yDjG}u3d8(%z z)dX~^^wim>IYNU52C`Dm7Lj_YWYo5R}8XnOS zfIaw5C8P)gklP*I@(@_DvXQ~T``H)aX+$Cfh!B&jjf?qeBhqjm>~<92$yFzuIaOy| z@PhmQ40I=AqYw`6p{qA8S=?wfqZFgO5EN*fIxhJWSL;0jJkno~7g&&t;}G@|xh&?~ zmLW=W2y$DP^Z*7>lsPX6DiPn}8Uv%JPCDx?nF@w|kpMn!VpbY)*TE8+_-kPCfO#<& zp@KN2*{NYhTu~hx%r$1>=stt52sD-%B+0OtMFwj~Cjs%0_0rGLMioULZuTAuVI^@P5ibsQ3ws7smQdv2|GwDW5Am(8l#zWCStWiD8I+ zrbA!UlhCP~d59?W>l~c1$z+IPpXETO7;X$h%I7&)lEw!^lKfc5AvkN-u}@`78{?nd zpf+VhAq2}dpm>{0piUBs?{2(8%5JL{8Q_2^KizM6I+#g&w&@{KE|PPpA07xb=u5=Jbz)VX zkU`&+lpJG{xg1Ed5&1_3U7er*!g8RibfWsr}!Am3`4@Q!;q0;&>rI5JZFYE7g-ZgJIVAxot0iDHR}}9 z$wtcq^e3OvYLY?6DM)jp4si%G{1}JyM1m8G9}fTW1S-=GPTT{X6ZxD~;|nc7@I_vR zsL@`e^c0hHeWQjXXS5(CP8S3Mw$=DTIWzUj@_bDeid2_8O%TX_^E0CuDA}WrNY_az zf}(#NNy6i}iWLtctb&utNmbvaCUg|z=9*ME_FfjZmo1Z&h;JwxVQh5}>F;#x4rK*| zVwe@yFYcC;83{Fai=m?JBc!kijeMWDb0PeX#och?w5aF_R*#0wfB+t`p-UslK}G|z zbbsUMrOmqwFLInnrQQd^9Xx72VhP7inRiVx)XDLUmnV76YiJNv^W5ib5d8J#dmtA|s`7 z0YHQwq8t=K1KfRSv8#i7j@i2vXSmLcu1GxOog3j@gZ5e6MhtY?;DD54>l{{dgEQd> zzTabx4Akde;!dhTS5W`_B2Ms4uu@Q3JY4wKsu<-=<;84yqto0A7DT|Ufh~N3g@<@K zFy8X38Zl;S(K$+3Fz!|O?EHT{k zSOMft?3fQZS4a7aHMxRaJM>{+qNZeAVOsh2XWn^$w9S%JA7 zYucK$+!llh+0Y?z@dZstLa327vh7K`H$`XpFf#_!tuRrTW-ST2)O1Ba*$JpZ|N2>_ zjLMNG6O}hup>J;dg-4N6qZbBpMlHZaoreiP~2c)AdBMAtS>hR_iz*=J@z_37o z!Y8IwL!_b_dX&AwGG^v`1-Ph<9gDb^QVEQLQV`L;FL|7vMT#p7B#alAqJf=SCJXg9)pm9!`(V2+tFrLcZ++dPtOKv;ff4YgU{u%?4Z)H0=F|23 zen#Og{q{UR_KA)to*MnS21Y}hA=Cj~c83}edqOa$>LRjJNhLc6$!}PlD=KP%P^pZe zMo_E{_cT|Q3v_~e9}jn| zI8e53qPjp~u`a~)eqK~){Wc<`d^u(9t#?+uu0sR)ed z0r1q=(nyb4LjlRw%F zZ4{!4sE_dD6DW@evWV)C-z1i}`oa_Qk#5$?X3@1OKV>7*^pE^Jxq`!Q()N4#trBdu z>cyw8%E{?ANgb8(7YT9#e*ryg&@XwBPeoKwC#gW_sOo-KoqZ?iv}m}3 zr{sFCwZ_x2WA|Eo8tJ2pVW;Ix+O3hL)%mD9XasLNWskHv8|B`vJFYwI_nm>YJcJ*% zhQ021IvrR;?ZdV`X$=P`VzT7rJ*cmG&l^mqqX}ASACBC?sNe2(t)Ly^oJ^)|$DQ=8 z%~XAOIh@#i#~rxv3mpRW@zv0tPR7HobvIjLS10+T&R(^r{bA4RcX_1}W>2f{hQn@a zG8_)ch~`RMeuXi&hXZdib_X1gZ-c0DLf4p7tBy69^d=)`(ouFeMI(as-AB|nxgxie z)^^(K4MwAm8)*yukZjwvI-^0S*YX%?OivJA+QXBLJ*(B3VwNU7Yq7#5w*@M)aFJ?W zZPq(hmQIn;vMtA+_S<8xYjIZxW#iwhJE*`y|B`VUipJEwGcZ@Gg(Kt?mIL#XHT|~4 zrg)xvmOa0m^8ZGbZRrt@5RaI;Bhg3+I1qDKiQijW?AO|?Z-pC}S>W&ac7%^jT3X0Hv0%IlxWyGY3exERGqU2`# z;@HL+Z5%anqTj_$o#?kogC|O5=CMU%Uex%B;AfSI{ML5Q3JQuOZZ?20eEBv`VfYm! zh4}ChmxyCP_{MNeMzARug9VueXtEkp;Ea}H3Y_6OOoyy=e#k_XKk|$v9l;h^evxlZ zu=e8kA`4IZGO_CP?;vVSF49jFTFdBq)4oV9r^uISM+mJ!bRmf^L`^5#N?k@G68|zR z6R)oq`K@g=cn$fKFI65uY^}v({Kg9|2hd>EWkTl*AlDCBz((sY3)pZG=73jPiTU{Q zxskCPlPDu=GWqoh7G^5a$m)!@$dhv=tci7;z>>e1{bvFx9V+F^5*)I`8ljB*q$a_qrD)LG8!LtoD1Qa$`ar>y z8zLV}snxG~0@M+UK87ZLq`7Mym{OKFK0VpW=D1Q8bUkMs*E5!Hy};__!po|mg^@Y& zVfq@aXDv;9k-Z}8X={ycZX~51pO%t(y}hy2hd}wVpi8}iDIxU=rj*p{P)A683{Cz> zbEO`bQluWAo=oaFt`wPap?nLk_q7gTAmK@{{F&!6o`5ov@&uHjoTtH6lJpEj`6JGdbq!ZU+O^M5An#FZ z5s6n{CFDB%1`3nOK>CqNwTqfx>f^X{t1puBt$mfI*VWfi8D}5k_879x@8G$PFB;~{ zc&87KKjPze?(X-nxlX`e8}49aMInodWq$b`N;^6gW_DXj%m5s6#raDpM~^%HdZe~) zQOXvpTjzIIv#;1Sm9c5KdOWA?_bKx1d#h|lGyil<6CxVYY^nll`LZN0hbglS3pC3V zPOhj1)v2>CQBBVwI-lVrh~j~i*YKt63_y-KdnfEImfaiVuu;uAD&pwVBZ9Lf>KWcH z)<{ak!;*LYnzys8*Vd&!pdyNs-Q9Q9t&y^oF$aHotk_I>T}7oNbdYiR(R^*eInOdA zV>(AY%vDF6-KYdj$@P-{M@ygZGqSB~us0u2|{v+WP zNqBrv{7+PQB9%Kwp8r+_Jo#6&Fnc^L^EQ0bESh-9-0jp5@2N56f4fHF@*Gc@Eyd%r zOdKN8j7!9NrTtcyZoxLphEGc8DX3vr`cK7C4QZ{+EayE5Xxv*!+ zHU7Nj^Ca#0t^%=ntZ{{Aeb~)bw>y6)ErhHsVZUCkzoC$8nmQGto85%eDZ4wOS{`t% zzW`ZQlLRv4F+J{H^=)yBXL)i)p4C8XBVrf%EMF{VcahXdHcY0)wMVKeegZqK{;npx zM>r0KXd{ywZ-a{mS5drAr`KMr<%nqGJ2n>DgJ*_0?uP=r~Ip2UG? z_j&ydk5E6%6|~_=3@e8_vCv+J1;03kEE1BwCN8JKidWjQl&JGl&<FFU+gvFdlZtQ7VEp)*#kA|;Z8q&KnGAv3H$f&*QIB zWdLh{TC=00`1BC__z>4Q{x7vX672 za{QP8#&vBxZ(py~XSJ)lx+wRJ&%fW_TQBdT|HXel^LN58x>E~h2RAHyk+TI`J3ajO zi_N4RRvvD!`gnpdux!*+d;h!Wv+{508~<)O`$V_ISpzb9P&n#WRAT_vH;}?*u%{=p zWhJS2;iRxg6)GpN70fInrR~(cb9NClxJRL@+4jN5`=qd$-<9Yn#K>-rU6cSNao|93 z`{O}(HthMD{8jXDyxgoso0M_D_r<@A7Fn%8zX<-&eFT&(a;EKJr;WE;J1~C&BAa{R<416&U;wDDqMbrwNvl!BQE*gHK+-U`bGA~fe;PFxA1TWS=7AoKq`4jLa z9*+fa@e^Q)RF$kSA{o^qNy8C!LB`WjWaZX{tU#c|$BJE{UXS_87j9irA3KzzF$b(^ zdWWq&I@Lkw%iw5npRz0(L&f;Z(EwX0^6r2+`CMPvP}r>-R`@VQVX!TNo|;Jej_P~7 zdUw-WukIF~4qLpOLkc!pI*@nrfy(hy;e-gO`G8bI{D!IV^JXvO3QNoo#Dy?65A0y8 z8O5dSKwi6?DvgLj7*E_g_=LU@HT@xDN57l^-n(z_*Y|i(4YjLqlHB<-ek_n5Z}2&u z(}3@a@m+F%+H!51VkrVTY$hv%$ZtyGbwQjF-fe)GYp_KX*AP)kF zgT`ULN6{vKvqU5mif4RSE>+Q+Y?FX!FutX1=;yHhQD3itx>O3yg@-`6K<5Fcl_V_9c16O`S1Ln_%JfZ zVnH8)PRT;z#S6nJP~t{3mz)8-7P!nhUP`=(?MNk36rG3J$%+&4>1EzF^|XfJXf%Oh zUWSOOG{gaw#q7g#D&1w{={R$)WE#dFY!73LEeq5^#Zk2_tn;upgN2j5q(o04jz}-Z zSG##DL%k@>%h&yS3lncOM-{0(&JN7!i>eG4Y!;uSKUV#Q-kYp*R@QFXlTNiFx8{IM zL~1v5KX%GX-l6Uc^IGaSS_ zwh5W6pVSM(BM6CL71&i?(my; zi|zg})6V|!L(e{o`R~HIylN9=VwDLY+~?@lCr#y3&Z)mzi_u~;KjK`?Wcj^1PHJ6+ z&S;~R!4Rc_m)=X#v6v{=G)VcNnW4mT>5+)ccLoVzvczRu!v(IImpb0OaQLexRDkJa zx!vW36UwNClJvYz7Dr;Ri~*iTX=OyeqQJaYDy`@_;T#Dy0(k=SKh9^tPpcm z#lIZX6?2Bpun*~Kx3m3>2O(*v(CWWAJ!?90Is?1Yw??z?Blxs&Y3B`6 zq?%V~I{yrJs48#PxBBgo(;tln2zGUbR55NxMVDKhTl_w5UWK2sU)$H$lWVFn##>%B zUxc{ER;%YsCmnlaIVjPJhgTGj@j%OLwOXUNTAbLi)gE+5?Y;wO(F8{Hs(FPIY!t<1 z*b}0$&U7^HPA3XzzFbrLe5g)qJaqd`KZm|=v}$#3POL$DXm>{4z9q*Htp4f{9MIbg zbmAnlf52btQ7Oq+)N31byVDj5$K~_|17UYS@wRYet+wU3m}+<2u~=*#b8*FwF!ZDj z{6viN9_RjftB=xl#MSvyF$XBR4*c4~E?($~SXMM`94X?~65Bik>{y=Day+-)v2L~x zIE-@fx?Laej(PJnh5az65@iV2vrqug?M{dNWQPqTw~P<>tLI1?z`9tE9xqrr6C9w+;~VhFZ3Of{tSi!z48)~M5++7*C@ zR>vMXeH2qn0Y)9e;7f$l;b@0eZ{VO_BGL#HBiVam+T48m%%&Lw2;s(-gEEbMyXB_9 zv4=Fc0Z5ahL-l*({>Z`WOUd4v=e$tVSQ zxyC}cV{l+p~9vx&;S-(et>DvO1*Q}|HWvfb}{Zl^!g@G)hdWTeImOhYF`0%u;&X-&I0 zY`74T`X}g$`o|^e;0O23IzN`EzhBohmDlN7tx>n#?|E&lf0OZOv?R7v;<_!XKb*9OqhVR%($RU=u;cXF zHrD*{W5otNu&FX_&tglK?^3jg*-W)H{;GFNCCkcl?anj5Mz9io&Tivy}9o2|s+AjVoq z2Q*YcI!H;5OvpH$B!yXXG< zn10G?_J~RymQ7@}9>gJlFUP?jK*$Op2tO)^TKx)AhsRQ1Jv2i2&Ff?pr^AhB!rlw21 z&K=zbnFpL2T)6rHE1a%*r5$w?O^==^5cX7kg~u+dnXeQcqfaBj=z>uS;1MglVNSQ` z*nEXIO0Doll@-o`)H*3z;kq$^y+)~Sr|qpxDU zuPW;}9lrEloq@(=w@wAEw3-zr^YyGiOjfjNY`CVw_NDB3J?-cEvYbXp&-)Qr3{*r> z;!kNzaXq8*JW62-DUZX)@$a+F9VuKb0judVodQF%ClrKmAUTAxxDfcG8W$_Zum{uQ z4THdy$PK-d{pf0{?I31Ed5$rghpv^e(srmI9l2}H+CAd=hVGB^i=pwJt7uVq8$BCW zX^m=t(nPx!qN${5HLSR+v1TH4B;Qi-9K*9TbS3$fL~$gq*6e2PlPot#H>G*|U6kFD ztL`yZ6PCB5dc*}wbQ-Cs|Hk&FcCxlKKDne?H=uNc3T;n9Dn+kzHPOv%i%cz65%@_6 za@x4UP4$OyEghGB*p*%%Chqzho=v@l%;4q>%gz44i$~xReVb+2MNjqykyL+-dQ;)` zB9^lb-hV_Y4?6pbgm?`2Nlj&nWYX4v|Fau#Iw|4)mwlv(!y}_}{)Idw&ci;~*;H$v z-PSO{MK=UkL0^_XX%wD7_q;|l&tBAEinna)j*VHQKK>~Frx0PnEgCu_Uu1x$iDdS? zq5KkVWAF>*cgw@>GXxJo6_lPRx_U3K?$8B%Uc-&UM;AkO&#^QbHhtwV$VnGa%1X=b zQ$j$kuwwkU+N@Et!+MLXxY_N4k2Qx!8RpP>t2Nhl(9yTD%8cK~WiM87#yYRn&TDwQ zdoUWwu?`TmA0g_$3+ikP`Mi}!LS?3-(D3IljesVFFGq&Yby{eX$%uQ^%atK^(}W z8?m<$fJiqsW+|z65~K~%zm0(+^B_gB6b6iu&jN=s8>EETqCC$1bugz&!Ew>go{Vs$ zu%WhA&gDZGc}Hmoc9R^pdgr*r!g;FQ5zg{@Fe8JXa|Nijff&NGiQF^4f`3Q17r$+1 ztaP}!n+;{pqQ!1ornk}=)=^=NiiEgVMclfyyQgMy> ztY8fby7#l~Uby(#<`t8%Z2DWOEZ$jj_ieUe>Vk`;*m({3$81^nx0>gVe%c}b8Q-5R zlQ0&fB3W^cb10`w13#3JEl{qj_uxRJvWa0&G^lTs>2Ex3v^1qpfkBqt8W_-z(&$mr z%PHd6?tBa?QW+5@mQw0bP;uqdcmjnjt(RXnjI^?v>V|D0CcI!fISqbyS>pw9FR>&H z5wIe;rP|-|+UKeWI<7{aH)|-?v)JU6G+|{zV~Zyrg0E2;AQi|gXp8j)pGrWRZ(-YN zRIoCg22|8;?A3Zj4c`P?oW8O(GYySY5K6t0duqs$6 zf+1@Kns#*TfsK`#sj+D=8P~DhG5Y|Fd8*-g9xs^uls%SYsVKf?%n~MA=>`8yB{W=u zImpJd`{34Oo{X>&qUA(o)aLo@ z*FgAe8JMpMCh>Gcxs@OiQ>gM)m>_^kTjf?j1{M?Hm7vBlrvQv;R1hZfm(nV-JRNrtrt6qQ8=U9UrxMMCCK<%}KM>8Xqf3PT+> z6eUmvV_H_P)3dvM8?`z#sH+yIEA02GI}D*ZmecK^XiFEhAg-ctj9j9UWEX$;2`dU& z=)mnk+a5c86x`6dY&08LgVkZZPP>cJJt*1`>o`HM)@9e44xOIcAH=&v1)In`poXVj z>SbVcU1!+0J18uok($DtJFOhaz#6o=J#XrwCP)M-i#HnV(DFRj8%%qs)RKgyPk1Gs znc!}OvqK9dD0-b%YZT|sffZ8JACJLdPYJ;k1UtP^djKJbtKH_64vQy16qsvU6R$Tw z`Gy#GbO8QR4N4n@wRc?C>hwnaX@A_0F9XJYF4$N_eb2%DeQt!=V$M`YTU7q4Rqf!U9$SwQURKEj+h31dv(+Tqm#vwMNu% zg)vd}|BxYVjHlN@UtQF5(IyX)jpc-`a{q>fD_MtOXDH4ywI^-6@0Ng?TGO8EIQA4w z0ZFvpn&&PGX}QCW`WOB7t4oWJ^%kuk@y=LFbF&7!lvW+!xIHEp7jdr0zKJ3*9!U%= zHnrKE#^A!atpJk01I2nW-iIP^Y40|bGbOb9%E!%gHX@U0)}W2&Scfs5U>(S0cGKJE zPpuAPJg))>_qf%q?1*t!Zd&=3noMNo>|&Wg1=vg`IF7=2mJ@)+v?m}<<~s){f6^0x z#xu_$BR4DIJgPF^aU901;)*|=5cAos8xt*hif_5uN>&1xPhnl#m`!G`ep7P7V%PMH z$FB1_j-%3q#gUj#Si_iT&VO83Gd*HT0P_iJl$@|e*$In3-&byhiSr-3e|G$#JAuYz z(i92C(-uM)Ph1FMGIeRK^H*C4VZ7cLNX{(~V|MVRr`@xN+>SY7R!vZv%&>+hc~PSD zrci{wPo87FSL4B-wp)`$g*UyA9H>aP zH|Y$+V|fMq%}=QlE#p~XA$ejhN1)i6I8SG9?hFMYHDUOvamnIJ$j&B$9`4r%`x_ zhHQz&@(YEH09LRUjaM#HddH{xzhO_HqwKJ`fe60K8wxkLGp6M}n!K}xiwbu3i&wbX ze93}hPzNy~m)f?JB8cIrHnA}z<>pqpdRf;Zeo#)`zfaTlENVev3-iqf^Tt%023m$6 zaaa>Jq;zR)$R=Q0D8+uerE3-CaqReA3L~23<%Wd-GVe`7;tBda(P`A3m=y_Q-kSjA z2{if9Y5v46atW*02;!DHU@I62GJ|uE$1jBRBb;Gwpr}kt;$kgFafkCT4 zhzO$49Sf6*g?c{;2`o`7mi`1z7QKL;agUZL&)$;Czbi#AG%`jt0pKB<4ixSgHcFB@{==JW+gMS~~-_u2Lc4N5B(SAU>E?pt6i3i+q z{APzfAE_Uo@WglX91*cKE~P_u1c(I0%4~xw_VTmdNWE2!jOQhF3Q4rus=xPuk&hw6 z^G)vv_=uzOUIKK|JpYOSI`x;`J7qh1w$m2Fd%NO$)e^{V{X6P+l}kGxG-1dlKZ;ax zE}JICN(`1zLfM~VU z5@G1fM5J2ie9T8oD}s_0DVb561z1)p>n@+W>7ba}2t!O&0Z-z~o-x+jks7@mZR#oA zVm82zua!g2LPc6KVgA5@|54F9?qi~_j=Q9uPM1i=W#m+*m6gb!+Va~Wj8>7;hX8T> zUEMHFmA@v#y^1^$&Gd9oQ~e~X737gslFdo_A}hXx3RFZDZ&oz7oE^%!l+VR*Dok~u z29Ylpv4+NUl;pGOChN7(d@9RJuLw89QzhleJAa&9Dl$-%lGY3yCAk-+$53cw*QO$) z+UHM2q**>2RnwBg6>yYt>DX3h;tks4iEHtNMJaB0t8lqqeNq`#cpPdx>GWECS0t)Y z4i{NgNS=!&QMRq&xNG-Y?G~OxBvYNI%+bC4=GBHy6i`z>>$(l3qt3vahbx@23tT+|)Aoe4djMyw{Z*PxZ|114MJWk#nx9(9IzkPxY8 z7!e;Ar7=>5;OjKXCsx}T_1q59{Unqiya24{A^C377TIk`L_}s=NE>_Ok4Wea+sHf{ zhpd`fuG{G#MNQ=3aY)7rKCDboJW}RP@xmX{>J&Q~d`#3iPma}b$V9g%+5%y&@Vg+f z$C=7)fKY$gh)OAxTudd`8CNS&jE2f324pyd7*xKZNoky~Zejo>nGu1`c?Kw-=<*wt zmNXVi#4EE`Wn(d%8ZHajXi9Q3fzD8_Gy+WbEgd9(a^fxX#Yt~ncJw?8Mo+_g3U!t2 zH8qp4VAv*^f2D+~fUL5-O{LFJyyB#o%2)y}U(iyU=d(QlQj#qk9*KZYCus4k!!r6x zksFcF3St!}q9oh6o)XlQ5~6xJ+2Lu4*{%^u0tuFhq}0nget8GT8GJeci61q$N$7H8;^IJXz8VU&)bj0m&%upHEwPt4AF166ug-L?jDGDIv*1 zQj&RGk0@k@nj~y*NOK5~KOxa}`Qj3`EjeZeXp)|p-#=%ama|x#oOvpQB?p|KG&LQv zj0kI^PQ_&?7G{JUH`@2hVD)KFrDcm9oTyMo{>_g8YJS?ght-^X2v*r0i(+~Row4J$ zUds4swlF#m>cy0`)XMB#96)U3b6&zYul!B^0xqvnscXinV0C*G&t*asqFpOhFDjo} zIJEmB(=a`aE}LTjg=ZueIDfVCb9*L&l0qNBMuV0~g=VWd6WnkiXTlfqKV+g#^|7O0 zsWiUa89Y$}Uo1JT0?T6R4-4`N}m2NX|l%GL~FiaE6 zo;y`BmprcA|C-ZSC^udYHlMc;WKjwhJfL)r+ibi@V1V>WO}`-k=B>_yKyy_dYqJXu zw`-sF8Ka&kAA@O19nh%9nk?qU24raDffbP&n_9+Xp>V_i3wa)EUtV}32<-dHr_Qfs$(e1a4rS3a8=8mxy~_HBTC~5z%n8to`(>S`6GnJig#5-DD*C$cr7dP z5mLcg#@XsH-{VCXf3uv;Dd7<>Aow@iAn;e~+rYwao7rM({epZ-TKcSB55Eg!?L-y5 zXql{d9*}7rPUgI(1<(FrBiZsT)zV|X;YAwu!H*`bX35;o=gd0imuJa3o6)6GUQ;-j z5HTtvX>Vt{z~5sHMiXN>lKTc=6!;+>!efOi~6q|@#)<24r3tT!eH$21z2PV_Y^|xT_e_S8%YC{Qe`6=4g ze7!&5Nj?!ia$;uga6Y?i37jG2Sz84#t+ml(ei z`${RJPMT$Glt-eXH2d>_j4Qr((IJN>mEG84yBU4*EDajY25~9w=k{A!N5L>;9(iuA z{#GXc!g^O1Hd`%jrIlJu7=HRaPV-|DEuxy)fh@f@?KQBdMI{}kL)sf6dt;G_sXsr=IIK*XHZb011X_-r@(ZQ^vx_q88&USk$1 zUk&_E(o>XwK(`y=DJXFi`y+A@Bw6*8J_>z`A{RVk-k?%;Msi3I)W+JI2~W64=qPF7S=Ke2&qV2`j5v?pAwL^*wn)bMw%&d*fH2~n z=t94x6yC--9qagr!(NV(kp!~bU|B}%B2Fg2jM&McBKJ{F&BXc%cqi*!XGoD4g%D0N zPSwp$${cm%KE|mTga>A#;rmh>x*#xrVMZI7F{n|7L6LIRr(=-VF0L<+Vo`|2Xic!@ znO6i(H@Mt9`bX%d{T&XL`Cdi|pQk$&md`Wrn8UvM12ir9`1v71YitONmR=?qj)nNV*JxT+ANr<9$CLnGr5LzH`fkS(F*Q76-k{}P6r znfvwqV(!mwQR{cN^JhED@6)0cpKtI5o@(^_f^9O^-SYdWW0=-Xg`X>8c7fS3!n_Sw zZRO22*mJril^<-vf#1mEDPv^Q^%`$Ov*)H6tMKY{H0(w0t)x)FyF3SDP}(!roHHZ| z!23|quG}zJ5?aA25B!ry$?*8%>=QC9uqHASP-0QCKS16lr{?%L!w=xB5~HZB{}kTS zDTe3E;vX!-7h*Fi)DGB=r0d%hL>%(FrtQ&1=mTa>SX0P^3(^!&x~aHDRLBJBv?f8Q*SYlXt_(p)GcjxJ%!>(iV-smn|W00x%ulZ-z}OnLhaGdsiu zYIWh;kW-3wY40h!%y{@@uO=6h!gB(9vv3B8gglEgV*V9klLjDyFjXZ2^l%G{a4hf^ z@d1xxm`;fThI#ge-BtK$n$0#dgf%S-=}!$|x&A@2Cb^JGSXL)v%=6u~kIa4hBjC{S z5_Dmrb#$}DU?nP(#Gq}8Ibr~nG(`-6q#0t|6pxn{Yh;e~(xfTlOUmAB(92`)yN2E8 z@40)}0Q`_F-sKxE?ibhx4UkhjNVq7@n>B>m7pqSwE45xJk3)uvN_~+ud@9sl@)eMGU9nst7Tt40?!>lc*F z<_?@(+aUc(9L2;xJh#msCR2{r>98c3d#@%+;mWM$-MLU13mt2uq>B|?mM`qjmX4X|Ly8-y`3X4#d?{( zGF1H;K9tL=7vLK#qXzwpN1vvjab-MA(GA%whZAvRm2m|TpE(j4A%rK+!+_$Ziq=qx zM#l0{M-?1w@?uicNcG7^?cN{To=MIOVU%lPX9=J_`!CUPt{MboAl z=1y9yRne4%%}q}f5+Z$y<+lliA-@rF?1%`s!wxVX@t)2nlohm{*fL?XC;tIIArqQb=&Yo5CVQ`;)R%E(iW z1DP(zC|vrYjJ8QE&B)jC&cP4dJ-NGxt`s0;JYwBpT*Y%Hz4>C`Kb^vPFWC#Ii$lX+99 zyd-Ehg3{j;`K?NYHn7wuLyT7`_qybw`_1#Hi|l21!U8I4rW;tl)qx@13g=2VBdPc( z>KVhY#hjA2i`{0u3*w$KQ_o$7>rN)zBeg9aifyqYh9Q2HB$kD!_bXnU<*KVlC*|Ri z@nNG#m5xa5fRc)gLnp$a$vnFdc%POBoZ^V)rIj{WHI`mjwK!1dv)N~+tdpDdtO*u} z1etHyIMbFM8GN~MCu_aIh=3zz`EZ0VCZh#$WIOJNP31VTfqgG$vrwiW|Kv1AvRz!x z%ZZfAI@s;k8`*n?EP>;^Q?02Xp}ya`fqRd+9@6(&>lIS4)4$Rq5f}9{9amygW@r+h zreLreke>AZ(8Gsx%*M*XmAtUVCDvHD~@) z&2g-JtgW8qbf(imt3OETg?qC@I2~-zpALq@F8=qB+2&R7ea<@T#<6EiY0~3o2$=Bl7{bW|acuAza;Y;}M} zGowe|Kuo)+m(h*XhRvr=h(aQi%!y*F@7#aut@gpE?QH4q*Z#-D-JRun+*ba8vbZk( z&#T?UTEZBIY-w%Teu`Q|2n5UTj557&L$qdzE}(nsmdBFPtPl2>e_H!ELx`H{q{RZK zJm533+Jm0sIHRt09n6EpSHxScDE6`b8f*)LYF<&Z z=GEuf4gr_o6RtCS#jl8sA3~tk$Z{v6ajQERS-1udJ}u@8C`SMz*BZ?i=rZ^Y%X>9j zYSE$A*z(5h{=n&UEuP!oy!r-}42b*n7Jq(x*azsB$7^;AMI}~sZ-`n>UT0{H*Ru63 zp4_5RM-(BN(LnE5v}ZHh?nB6y)#(oUcFUev_I@ASZ}!9l0%Gr>aMm=h>dmXJL!T?i zwr%zMt-jsvwlGLJ77_{yDRC|lTklYc8^{#g)av$FY{{`OS)ht$i{A>tvxw_0F8{s( zh;<`h{W37{ND1i=66$E!wA~(wWE5Zm9ymqW+Y}aegpB$69?`Sln!WI7h5}~vd%U)U zXSk*|6X^i*vkh9a)vsGrtF>-QprJ*3w><1Vm*pihz64|$_A$5xtNVZ>WwrG!(>G9< z46na<&_Rq1B*FFuFR|U;tlw~TV#o@ZMjm?#;s|;a32l^4d496#bvu-fhxpAO<$V*Hq-uA8$_8uXAhHUls|qJ(S1 zh`5WJ@>8JBM*`S@LPnL+QFD7qEsAtO#Jml@;DKFhfm0pmBU%P$Bm z9f4DBFnD=@ec8klKd^?40r{B}2?;M79e^2hr63|*r7eq0Hl?E|)3%&Ior=eqwwaI*O$wQ5Z~7F&zd-RPW&<=0|Wt zEZeHMq|j;b21AJOAxVJ&2H9`;IQvmN5RbP9LDeObKwvP27#FIb02??Mo#?BqQu3te zUIBr_fciKjUa~j^0YJkaPp+VHVhoK8>=?YH%5)|%S4DX}7AKFC5Y1afbVOAWg~7}f z(_w%_@BL9GtTNL0Z0U#$1{UXzKJg_{>6GlCTW;3J?8@(ZJkn2is*4OW(h&JSeoyA~ zF!x!-g|E56m>--iDT673>WP9@WJi3eX*Gqu$npzZu89~9gAo}}Vt^&mzb>ms9Sact zV7_uTs>)bFTXfEJOa^0%ap)*qIxR?(gG&w`?ZbSJ3^RYTL^O}`FV}b!W}h7wLSRlt zN$FK;qxKN5Bf4V&4=oo&^k0^WBpOv^)w@STY>z9!zYqNT;C{Zr`>6M*-)X(`-#qLP zNaR<1eT4RcPxR~_ivUOhkVBHuti}^J&QU)+3^j`&f{VL+`&$d)-lGD@OgDnLiFZni z=27+zHx(;qQZVg2Xg;6q_Wlk{*PFf7BH~%3yv4qiwIhmpCciSvyE!6=_2eCLK9?C{ z1qj^lq@{vtyV60}{!SMqsmkD9ew22@`B&61l;10m8|02!HRgw9SW^?c)Kzw*+xY7{ zA6OvwGH^-rB=54<(pxA5J8h+e2ztQ4?#G9VN8GPZxf?HTvwPDQB$QCTAs*VI=;5`b z9w2c_`LPb1X9A5y7C{E00f@ zY;VXQ**wagsIrx9k}MG4up88!UT0$WMnj7Wqsr5G^}h<6A)T&gkC3tEM4G{_Y+k*Y_(N~pZC~rn2kl;eI-Gi`&EJe& z=WQq2d}z0NJv+7eb?aTM`DA2!UAs56ny-+}x2Aj=Mt1NWbT_Z)g7pJPqdV4@dN)&~ z4fQ62fdyw5RV}9s^YAuy^L6vwoiOmuE&e&=|J;Qb23BX%?@YT$m(jV!*l^RD`s0b) z9@-ytfI;7Nhy9^rz1alw#U0%azuI8eMFJ717CEIMz{u*iyQ6*^x8WmF6qy%F#GCh*A9c(b_40;_8(TgmwHwiFYW_MfD zu{(5nG5Q+K2BrW{tcU#E1uL*o-gQ@914n-}Xm^IKsC3M6Hl{Qwp8Jfy+19L0AOI&w zx9mfxlbv&k4ZCx^u`8xB?AfuvD942)Ti@2J<}1v?CuB)&pgNGu1!}L>cg?HiVukks z>F;prTP>?Uo_4zJ$)vdNke0CPmNlKay?&=<053)k)`jp`pSC-0yN)V4z;zgE4K%|3 zXpWm#-t^rI|J@56c--!x7Qh(y5Mq^k*Qm*bo*q+t$M(()R?xT3Z+tuQG^U7V{ z3vk=hTA%yg-!NBVc`xABhAtaesLh$Z4%W%qQC^H>=IP6V^?H1Bqd3JIL zPS*fv5h>}y2jE%=Jg_{sGa0&GKM9=HHy98B?svQ0$)F!u=A`+TlqvXmO>J3N7GtoJlW*S#j|Iqj1#OD6(CuP=N{>c30KC z2sxbqW{m!#0}n=%QLi;H={X5Jo=!Rt>mLkCJc8qKSl&zQK| zF!j-GS>u5N1RVoq0tHV@3kQu_h@*aI~{;7GS}W$Hz8~vg-gcH&>pssro3kfpWDM`Kl`{0TAvq7yyAgHJ)f6V z-xMZ(myj6y|tncZO&D9_A{ zwoDqEk?&EDagf?bHs?l8L}e| zmdBHL+azOni)aal3ZsuAC>*qW*|TVw3F?Z6SkD?+wERJZkwp;{jtsR2*nK~bMKbHHL-ZHl?=@~EPsSmzy zw(v`bu4<|uubfC89V zhmG_cBdx}4CDcEPWHy;&?tlb88v%_*Pqbuvx z?SlEbi=|Sylodpsqzz9g229ZeTXJRJEmi@WWgJ>4RKZ=!{OUZ;%%-yke=p0z!pWKs ztrI)zWKSSwf@LZ!=t>!#FiiWDQ>Xytv7|Htkve85IWoVCpT5d=_V`LgO!JCvH5Ld7 z;u5rSxG&ChB&2YdWI|urtVX3Xn}2~v-V_0ZMW!nV1S6c`IG zh<-hSkn3Q-eQ<;2?4eBWY(=up0Uar@P^2PsCcJ?=@(9vz<{KKkxb0}D*Yy5@fJmr{ zfUDnVEaQV6DqtB=roH~G$*m(tviW4I&HsI~M)7aVP)NO2iitagK!YWUx+qb1O66$$0`> z@@p{PCtMaP)uxRz3lfb`m`h*}crHl9 zHsp}5(Um7!nF#@qRN^KgRg z=r>^E9I4d+j#a4kNCeeaZ~(A8%v)49KM5C4yR1VYJ!y0mhtJ;gHQ}nj^3k$ z%?af4kD8+ydA8=Z3K^DUqlrka5g;=mk(sF}d0n5&EfvC-a@47rA6`rLCp;an**3EU^LQMQIxkM` z5iNdF%*qE+g|(qm=ZGOj#)e;xK&1x5+$Dm#UZexTP!!}jZopNAn5~2eMfl|?WNOeQ z2gDNCb=l@V@26f-CcQFJqxT7i0EAP^PIh#bT z!b_vRMPruIJwWkVcVLff%4}2$n$lxg^4rzj47IwDpsaG;T1a;tP3=j)jY7035XgVT z86UZQ>(vV9W3A|S;(ynfP9v5Af%!_C8MI5Z;^~3b3qc68?pu2b4rtB3lPVN z^tGqtMl@UQC~hE=j*YT#geACuR4p+ZKP@Q5KbF(SG7KqHV7wqD+2vOfi%K`*t(SD7RUM=XM9QZi znl;nmF@|6T^8l{$XoDjk4|uvJokVbwFZgIbsGE?_%-DR$U=np7@$qIKFRAGfGr>kn zZuW?(&KI=by&= z0;5d1@k3oxb&-VF#HO0f9o6(jSuFsSgSt#Sm`G0gr(u+ItdhJF7P|a6Q-V zKzvYx;;X!jufSfm?7_tD+XUv0dQ>a}0f_MHZfi0ecX2JhdBuu&M82GKdjoGW88X-@ z6&BIIel_YM$l*;4Y?FgR^% zL}MKHyK)d$Q7YIyh!APVa>oN3)l6VCuo^W)B}k;_$2N;CQovO$ppG?k2IKC~Lrn|b z|8z2BrGP*)3d6+d?OI-^kLSNA(3DyiCJx|P?H;(_9Z)d{J_CqK(Wx$EiY^n{w4-oM zXWYU|W8tAX3~y4_)M*Q&S|iLNGoz%g=q zopwL$njPw(&GP$pET`2OjCyWFZ25tZo*6`5YB=p|(TSo?<@h z)wiLE*oD=9T3u_{?{z2cB*Jm@ItYS|y`%>r<5Y*eLQiyBo$(a!x9Vl!sE2rcD0&1o z1RPqiZHt_-lx1-UuzqH>Uo4>dA(r= zwg!J&k}d*ko7LDFwAxtro=esEs9#ONC?r#BJjFhZ=Q}Mf&KhgN>T;~PdkRa5d`0Z2 z=eJLRE>^`@OL}-J+ZDEUq}P)e`Wi+d6}iTK*jyxT98ZMEjL%ra+P-2+>mQk63s$n=?8$#i7fzOEErU zWq%rW8tXD8B*c$O(nU2;ssS>4ht*6fuzZO9viMF}^(W)n`>isHC|+3AISqs52tCdV zYEh}NlB)5bDSf|K^e+4{OhI-WEN)B+HTt5BaB3KVdIHps7^GB&gp{StuG{tY`%RdE zo}EUX`Hi@B7sV5~d{?`nFGV(7CLRb<;ySwtVa&FGo+}@7yfC5*Q^4a)FQhIlifJ>7 zFdQE4VT*$vi8f(^IB`&zqT!6}3EX+EHJOJFr$%dx%N6jpBB@q7NgADYr$5H!i8nK? zA?$c6)79bnYL*XA>Hp>rL9jam(s#!#fuZ z_}n{fykB71hp>)+!<%%x!IZpkpARA4zSrybre53X&osR7_M&PwO81Y~U&FS8NxO%O zBV+50PQ%dY+D;d59`p~(uybxEd38+;;{T+i0fYox(9YfFEcCQ%3Uqve!Z+r#D53=*gQfJn~{N z#{az0#DZ%nhy;ILOzg4UbMZ6+eEk=f_)*AS4qAhr-9t=iPVb;<)W00KgOP{w=GJ6- z<4wkI6b$^l?s(kw;NP-(H#gJf#RX6{uj;j0^J+5C+x6NbRIzRkt@q8>9bTLWzFqpK z-l{(yLO2k*;tQ2%zxljf-0hnop@=<=J6*RuB|q&N_3>8w=IbF#%Z-fHX<6+dyl1U3 ze5$wty}N@S^>uqSUz67@?6qe>K1L%%RtTLi7YP%Y9L?9vlNq)iSiQlt>kZo!=xcR$ zNRPOpf51=8f7gGz1se99`0J`W3a1JFxCvr=(+-~apo(#LK;bowXS-ffugmqf=4*cF zBw~OkEL*2|ao8pgUHdQWzsd$cu=ni z2V0t}D7wF7?jlEBkTN1zztv<&REoRrNr%WigQ2(4Xq>4)1{<<+L;ipv)=P|xw>2IR z)W{DQP@}|vcw6HET^gb0j?MLUyZ)A!cx<>3%CAmR4=MTchW(NGOdh>Ca()X^=nXMe z8Ua5biAUP0qas^a(oMcrrqvN2Gys#8eUCWuGiw#y(y8&f)4HIC=#2V?3+IT#mvRtF zXO`h~D4!PhPnkjqvA|hs7nEc${8TRa4Hzun`{CyZ%$S4;^2ZVZd%oM8;_&5c7$`q# zEh^s`9Uz|p5pagd8n2@OHP#=*Z<+Q1xhqH`@C<>kxPc8@@<|mtt!;UvZ=UbhFc|S% zp-8FzV7o37aG8e|&p^uB6eJ}r#Nt;uPrQor^AT&mS2BxTrK^@8FLFvZ*sD~gd9`s} zSr^q@1GoZy6Wqg;pKTv}RN==I8C-amCx4Nc$`ohOyg?pB^Tp0z1b>B!0M=}Y2WycB zac_NGQ>+b@Bt@fWZ3knTgkOO>A&Mx{oeyg_>QXLN5&8zSbt1vn)o{j4uC(xUq0Zvk0 z3x7~X;IPS^H+(3OGZr!wyYxyT&gT{!k~nwTpXi*5lS}eEi!_eGv^S>5C+T#A9I^C+ z7>>b;s;SkR^t;m@PT=Yc$Irm5Nu))U<%E4QDr9g*y1ypK(6GuZNlAye5>hyX%En_RdtHXbVvKjU7EAx|nD zJJt1=H2ct%567_QC_12Qw)(h_>|+PFIAAMwzK5Sr zTVB62Ms{-Z+#WYys4vj6?Kya3)f>Rd3!fI>26qdpMfMT7emE0Iix{u`_V7?>*Fh~Z z;cUWttqVi}@RSWbw##A)S2F-IUm631rI@xdA4e*&7&HSjy=TMODZeC4Iyal@5)vBi z)JRUDlr$!pZdkF7%mxwx%BcwVIMSdQ{pq4$Hi#0lq4j7q6?%I!Vp0w!Pq)0{=b0zs zYP?$`)+T_=_^VD|PtDbg@^)ramk?1gz!E&H-F=vF39%qH;c4!X9g+cAGj@%`A0TzFxQy82 zh$UGJdMLD*4l}-&SmtpO#2pl~egLcoV=W`8BR2|*Ng9N3AC2wC6qqrh9K#dAW3!_& zW3_g7#&FS|=n4%z31hq*$wx=dJsJBo<6FJcRZ6V*9R>W*W*Q6~(Gu7Y>pIU$pl_3qI9#s3R_=FLb@^p%W z*~=Rv{Hk@SSr<^`l80~HZJ{>J7!`iT0kT?^uYc2}meBCp;bv(p1N#H!^r|BXewzQ7aPH2K7~k+|o#~ zNtHd|;Bx9<+;Y1%>Xd0@5&(0tB5A>kCb@R4zB3$-oi=K9#vm9YGzj6O)mmjMYpf)7 zl#d|J2GQMAtZQ?)INzq0JGH&xsMEF*RvIovQU))sr68$7FL4U_EL($Qk-d3nPcop6(MxDS( zr;7`*-Ap1|NDN^$=CrgGSj-(~IKr)H)Pv3H4KD#uqKS5683r(()3YZiYnTP5km@KEXCzhLN^}^G&ULKT)EjpwPdo$i?dr=4Y4ot*DQV{0XWUdzX_+l$P?4hU z6>j=}SRK1ef`R$c0o0=y?0<QJ&|RWoG0T}tBbmsmLg7d zN%~MN##^oQ1FopIok^!RX-_i1#=$4tGe?!st6f;x0XhoxIXmqh&fDp|jVYIn8NB!5 z;s@ApJoZLi6c|VcQ$&8%Gv+)LIc|5|39jI$gV8{PTT=Hrk$tO+OXps9iqZ{oz9K9M z!EQAo$58iu$Lsc>NK?V0sx8bAY)!3B$7#0*J?ylpkV>^}wqc3ZiPds#w>5ICh18c^ zzfi_tS0T!jG%{&X@`)`ot-Ts)S->Kxi}c4l1jRJ!r}PA8G6_tBDxxlNtS=@majG__ zFcY+hOnKCmU1jnh-mrLD;}B+~G)(yvHZ&zAgfJr|+~6{~A~YY4s*-`l#3W&g$YBuh z@Xo(nnw*WJd;QYR->@b&2WKxc`PFy8`|;cMzhTcvAqdG+CJgctHla8 z&QS^*vF=+Q@Rl6T948b)PufIsm_ViA)EpJ@8;ID&@W{0cg=UjwyRnNS@w+Ch-3_^1vohPPhP6&dsXq9*5M?Tq@h z8(?(_Bmlbc%EBPl)a+$EU4#jnA=MpKY*^LW@JXm6Y6H})^K(4T${&fspKMQjY7$^C zqiZHv?2tP`%^+lrIROgO3NafUmiq;qf!~8$IgPmzcdQ8xi4|0^lL9SLRzoq1K1men zU?Jm;CTNqf_^@QX$D)osmezkW8IuCV?W}$9eV<9lc@5>0W2M~)wg`^j8mA?KcSB7( z6LM8!0MprGThzch;mN1hP+X8IAcMDX4ALWG{sK8Gd^x^NeZ>tz&BPiL zlZ8BURg2!L-OUgCef@}o@>}cs`}N9)nBjD~_vv{7e|5O`v6)$TMo8306%5OKl8tRg zD2B^x`q_ALhR(6)x!9>p8D~vd>|+D$es$sjT1>q^s7yXU4e(cIk9ZxAxW9s+A26-Z z!kgu69$0Vb!~F~;S++j(+xG{)GEiMu`vS8Pz~>`h$U|{mJMujTaq}+vobMxTe z2N1EZ0hCP_|CdXV|Aqnyk{6Md$p?+i726br9p8ceu&0XHY9N_VVJS*7-9T*M0WlO+ z*CUHxXQIYkPKYFjKV%)+0a-vbl(k5Hr&x>kQ-Zyq0`m(s2B+$eBnP6le(;emf^6{! zSHzU7@nhzH!Glfo3TDWKF4U|Lg*IY_kX0Wlnj1?2GGw|~ZsMiYZVZrLqGo?$PZQVy zzy&J>TS;7GUrB78#p>1v=ka9cdCeIr8S`xW1O0w}-f~=)0SoOHZ9I-O9_KWkM%zxK zO}oJ!M&urrfeTiY*~~OneXx6M3d(?EA)sik9Nu+sH(SjgEPTTDdWQUijbFnyZ&$31 ze?NQp7+_;TCSFVfh-rGeqNHeX2=k@B$ewBR!^EhDzp_OsiWQ#uL*UPqR$Tdq6+4>- zw->Mv5Q^2w(lEva`3MBzy(3s+p|*QvC>p-OouBNoAc!GU$xNk;-NZ3!goXuz`s zbxL3gl))k`hxmZ7z4RWV7aF< z;t9C{0e*~r#PI>O?6nZ0Pr&5s80OeDFTKfJSOrt#+Sn`y1gbg4~GIl6F z4j+4?JX)CV{II|CF`M|ya=TRc;j1NDh`MdZi_O&O)_%R@wWR%hBtrc}-DmaA{7m{@ zQf5~ZN-lw;%%&z(SONzEiV-cIrDSM#6$&bWBTHGtmTQTgVi;AbzH15yrqh9@j?Owe9~1DanPyt&KxVK!0Z6$QFTIHn}yNzvgV95Oz9{@Qbj z=8MKBXu3?HIA6Ah)gH-Sq60ST0;QaGu(}k-#5S)L;(BZuhaX+!u%wj}B^_nr1m}Ag z4W8%DWZ^RMA}dB_<6>geD)7uFi8_8Q>g>8jAynpNiO4Cj%#5TGtbP_-iRPr~6z%p%yh^NUb6jB1Gh(=OZ0aL4@{GxZF_VFZ!e*v6!}dO2)!L&f zFgcOSxyZu-ndri>N4#5&4lDMBy1C)fL`*1ai%~0DhB&y1_CkV}d-dojV19n7*t0N* zszUR=@fvd(w;|W6NXBMb6>l$>2bQ5FhC#m&_}H72$e?+NZ3X^LI1jP$TINAhHuP*9 z=9^MFjuM+uh#-{rs%Bw`>jcVPA|thAvf=CPP539<8}TaASjkqFm9ARLmddyTIcx>uz^A>`e!#_4ulJ8GhWcTRpt3)VCI| z!VkOl#AyxMwuPfTrEF3Vn+Z6EqRtY3NAb*HTXo@KL|^@CQ^{bdJ_ zui^1C)L#cHoAr-(E8LWpJ-iyUDHpdhweZj``I^Ev>0V82chH>-N5t%Nci6o8M9IU= zkj1Z^q1$SYkZjz1odCxJVy*6Y)a~{9RAgP8HgFYVhHJmKiU2h829xd>w?C}6E6mFJ z(~5H3aLs@`C6Z1w8#wOB8MJ#AvvWYv=mvjG=teQF6ff7&SIOGLw(VgA)**qkd4)&J zG}J?@*X~c;Zm)wWfz7&_BdeP3V=Q)}_$NY_jk+Il%^9OWK5C2Nf{@kzj$6;{wJ@v~ z_Wan@{PS!}wM*mtawZlY#bbop2tNnk+30xv|K@pT zSZlt1J!`(c!@tLn%Dx20CYg@r z_z8;>b^_xfTC&#E#E23?P$t}sLK$%~1w@(>nUS~{jBHSCSbMn)GM9}GAR8C184bu}!HDKziHoOO7My*0&(+VX#kh=S zl%0L^ahXkZ2BPDaN|Lw}td}@a(?yd8XTs+=oDok`f#kBtTtf*c2~oI^;*ch*iNk2M zTV!vz-OTo6nHIE>|A>Vj%Ld(4hsQ1*&>Tl$GLw8eNTtGPQe*I^S|1qA$(BXE+-hLW zO;{(GX2d4FtrDp$8Ip}Y#VKPfOD2!$<27f96 z$7oI_;0;rDa=~KFO;{(I8?i}mt3)baz{C5hh63I&7jUhjlcMI4G`Mh?Qf>OU0yc3i zbNR|aVlq>?NQ~w$f#G;T*T!@LQCHYZg*^gb!bAmN#IR^{iE;+PeuK~$a$-&(!(0c{r_MW`)~xtSFOdBI?7d5mBuSDc z7TsIJp02K*twDEH^FFX(g0Rju~aUie+4^LS)- zl~+c1xSNWKii(Pgh>D0lU7Yi4NAAV4IZ7^@Bff0BhX^ptL-vkWkps4Ozo>w$v8bq^ zmm=#|(|C3t*Hyqzsz!w0i`7e@xP5=G`RsH{B{e3~AK7}v2^jL(*orMInnK&Z)LRNY zHE`WK)M0S~X;q8G38Gn#;2^m}`jjilQb6x7dW>oA zFM2Ge{{EuJGVbm#dOgxJ?k{>QD)9cIH@M%_!(r_92{xG`{oLOe#O_*Y)L!GVY+^H6Bos82~3H5X2)OHy_IidCkdta-M?Z2U%8 zDkvdv)}7B^jbEbS6Z}I3g5<=?0)Gm!jT6ZovhCV-LpYes#>kFHj;P2p3O*p{#-eba z2%1x(6z@1)_Fk=)8#)0HWZ%sQ<|v=-LO3oU*x=FhZiasMIDmadXU|c-=Q3VUz^{kO zYNIa~;8zsDclhxeo6*H@lhx8*A(la<=s$Up%Bj3&!=waGcAFbhqt|( z0VpIIlX!Z;3OG8=K{eUo`^W=V^%_NO7b1zq=5EMxlfz=S{#hwyB%Vo=P!vJayP$`} zAwo)ri+p5hZ-hJ=-UZ$ULq$*;T~KF7Bn)+AD||CSn#b+M_VGPUV}P6)7u31=#&Cc1 z@NRI|C=j3fbR=re^;C#La-3@ZbT!5t*pVR(AV6xWH4Ulpu2dqz-f3gtohzA4?d!~p z#Nl#UOD)pr2nL+Wa&IIUFhVIWhJfI{Uiw6-Wt*Vvk_?0Ae}~kb@=UGzBwm1SLQJ$v7mt6jd0k2l|6r$TO*C zoIt4gk-+YLdQw=Gn;s13u4l(6Pi`syc3~Ma?KWMM9A`^%QD>{B-?omi12uR1_)2mO zpR+sW92`|vTi3?2may)AStpSyH$NE7UC)inhQ5pSEY~g9B<^M!tF2gL1Sk{k&e=Qf z{p}}W$<@Q^wBP9hTE+_&<5kfI&$JeOz0B?IV5TZbyv@q~xgG}Sn-`6HbZ~u05}?Bw zz;=Ml2$2UbMJAYVZEuCEBFr7S{C744H=jSZ=@^>@cjWRnQE>B^GiNo& z{f->w8UrV{2yNcXDZ-GyJ9oLpLHnm2>~aA!6#BRd@RcR_Fi0c%$=i6!po=9u4& zx81;i{EQ`??Q8_9eHlNig5d6M-_>SL_?PjpD%72JC33Xu9fA5T<*R2tUWGwfKY0p3 zr3rNRl<#T+m1o*PV4GViGe#IG6r{TlCdDX~+)eM;!_6ovz0xJ8=0MMlgml+alSHZH z)ZDFio6k&1_jbiq3ocJPfAubU=f3S*7+hJ7xpU7p;~MFXF1eoda+ZMZdO0UBDmgcI z>(%D-;_TM0$m+_SbBBKI9S)&{V_V!`C&@1%+yz5tQ7OyGckE#{FaEYEqQGwaws{a% z7w(5V!)0WYIr`vGU-fO%THWz&`7q)orryJY!-ogPe*nTh|NQdO`1F8o9cQ0k7JvSQ z*#H%JZ~Nx%5TsMLhNtgqMSX!5kIAL$7U?f_5o+pY*DoKk#e$pPP`4JaW+wM=ww;mkmHmY^qAB&R3coXS){1c2v2D~qARp(KC= z<|Sd6)5peJ5)MrtEr3V3;#I$=Ef_RYH>~=}8&>@gg+IhI$tzC9#i<)6hpl8x3ocIO z7r>g6sOCNwYRMt)n%p#klBnp#g5gWiv)grp(o+?V(!feU2X`(KH_&f3%dEcsgQyj> zqGkuh<_}a&?gxXg)vbpex{bUR86UTr?PeRr(5WQ2{&?7F`mNfaOHa4e$A>|CIOufy zc=}Km96t_K?kw~m#-K|AGX4viCXai9zW3+035bjejURG6e>w?j_0ry1;L8tS=5&YJnRqJwUC5$t#M$` z;Nif>!vmrWRfk9SA%1FTgPz~+Mm?f53dd)@9(HT3Uf8Ca>3QoU@o4N#slEl_7zB>OTCGRe8@EFo4|^Saj_W0e3<*$=f_|IslW2PvJi$g@ zV(=*J>^s>W^_y4kKE;StaV9=MwIi@A73G1%1&{tRlZ5s z^vRNt#l`NpM=GS5w8Q}eV0pc~A+TkwSL04X^%215y$1=*pu21YM5xeEJ!rnww z;$5>C3Hy#S5eoKAvjGD3ZS`4HwGF!q1>fv}VV@_U%%~ul5bK z<2It>Py2?(>0`uJ6z-$3Y)%4UXFTePf?yrWC*ual0wgclH=JoWkEG5boYk#*ct))=;N%~lh> z%34@&G+R--)9v*K!{0u6diw0_%dfuv-T3)AyE_YeH1ZQi7r3wse;0*=GN)0U&8cXB zWczIm0?Gws5e6ti@@6)^nw*cW=eUC_UX0GiusP0fhIchzyb0EqNZ&UCU^BJ#^{vRP zJ_akoAue=JR0FYt2Ui<2c~hlCbSJCDc(%NrBk41RiE`52xA8E(Pmp2z$4lC}V{OyXOE?IG6bpgQ%v%_r&r7p!NfzXi?LhR0ld>P8em%0VP2_dm|pFFfgNj+ao zCHBaMy7o@^Z7KC$3Krx{Ql@*BgU3F@R&`=~u-K&emT-o{AMSygtR`?5{(bDw?^h5e ziEay}vFI%O_-cMWpUUkE+cNt*qh&p!x=qQR5~_#mQ6S_q!_;_S(KHXBpvEd+F& z<0f4gMNrCKE+&^NZ+tyQS#8e~!6L$B8TB)Itql<9!?**J_1Zf-9WP&brxTP_>5XUO z7qFbRb&q_);{Kh$X+#jeG2`bHqseS^Jw>s8l&OCPb>nmq$DbF=p3~*UwP**7xUR%35|>OV!WEnXWpm{2<*MLe{isW5O&+0UdQ*v za6F2_NwrN#4HrUrfW?SJyv5%5IQxC}0QEiv?NH?Wof)9wr$2yc41W6#PovL9r(!8A z7G+xIIxQ0C6|$S&oY-|YU2+kyop*NA8~HnkO*c*CSvXl#z|{G;k{BIJ!O zYA6AQ++_+B+lNN=1w4l%R5Ff}MK<519e_)I9Om;q4d?5uz9`$^mXoXNDF}eWi31T8MJAT7kQfPmD>dmqYbFop`f)cS`5;vW&7D=xWv) z2;ms5udi_k@_fFAc?bA6t{6)ZMxBjL5ip2T1m~Hc z<2z#-8ls+}pW%*rXNIP<>n(FvNn$bj=?#VbSwP6$^iwpdGKxNz8Uo!?0GM?UlWM{@ z8*&EG5*g#fQh)LetJ0i=`v>q+3B!R8`@3DY$ZdxW>s{P+Q0$Zk z(R3QW7*A0aWEI!HJ&&)MZ+C;w8ib>LTx40o>s<~69fqJO4~zE~FVPedf=EuPKJ$GAvkI;De+3MiL{!|-?j+38PlIxqsGh;s&U z7jQy7e`ih`OnqI=MhPnHMyD{8K#o`frPKHd(Q&xyX@nF8XuobpQh5MLOF%xyH9t2> z?*{MuBwxW6n?OOJeefoY7dEYxIOIEf+*YKj14Z@5TthgzrpYdUT*;==@QqZ2oE`^Zs92<0kji5>yDvW@MDZv#b@x_SkGH!?B8Bnj|@v9vG zDsfVS01^?x>8y4cO-pDyy0xRSq8mC9-DqZc7N%R2(@j+Sx;zkC&)CiBU>c^R{9)O- z&qm05VrD&V)Lg~~=6dIOfa7&778&YGk>v z%(f+%%4qJ$QASHAb~4*p@{-Y{93u$;I>*4A`%1jU0UV9*$s0YmgcF$lB{%C#)&J&Uy5-KOYqB~ ztz$qSR)ss#=|5$;BLQbO+;LQzJB~_n$5DCiI4Z>*M z0jVl~D4-=cM74G15#6%HE~FYe@`-Ba#3{O!<%Xjgl;alGd{dH~JL4Fsa?_ZqbH1D` z=@@)x%CgY`PKD-g62MDoV;dn><#`3X{w*TzP}2*vVBy2>Z~z2+s_#t15c7)j8C!qn z?4uYS?d*epA1CaiXolPTR{Y@ZJMPB0$$dY-;|@@YP&?G=3=`y;>JZU)AbSskLqZKM zf-1qJJ2?DeM?&h*Doxtz9c-Vz-Sol7k)UN4NxBH-`2*R?5dW$or{C^nA(q0E@22mq z%t_|cH@-lPLre1jE^t;VqS9$}N{m=#t3Tpl_{DkLD6q_BqfFoCRVm)4!QJF8&#AFM zaWveL>@eHuk_J|j#U(s6xpMtgVlLX77wefFjD-J{DVSZv0U-3n^Ih}k$-Fve?i+~m?ZD|(EA6h@4VHR_oP8D#=? zXo5@jPozr8s(biV&fly(VVB4O(}0$Vp?=-M|$dpDdmVLTMZr-&{y?r6?)&EU;G*rYh~swRX);F>tEZkw~%KDH=?% z;bk?TJF~w~$978*pPgc0Q`IAFUb;^{8=1?@SLniNYAf_(J9ibju$df@*ucbxMX@bb zLBj}fwki+H+<;uRH}u^m53#6+lyg1TJB zEo)R)#1)XJH)8;kNM64gUBy@8>M8V>7ea4~E~hu;H=h}0zS!TDz#g!4aJuSFT@Pnh ztK)`cAs?@+-)?6TQFPCk9EzAjy_ub%prm9@osXL%zA71D#|3Gg-m1JvJ{EQBtf#qT zM^5utvX4y@RRN@$308&WC2G-Ul5i}kEmsk>ADtqb$Ec`c?f@2gBU=#QK3V0YOmm!e z01=%TS&~Ko!xGmSN_?JkYKIWriVBF7?AV-d9NWlqMCNd>08-QgainOHOQ!SJX00Aa zSe%k#Jb#GHQc!57!lZJN?tE%fn@nsq6`s}%d78@p zXiFuUo2D|ObwPESo9nx%V$H5?VLfpS7L@qs~x+3 zl(^x*#j-3{!DtuPGN1wyx#X;UcyvU@61NXd=X3Zx-wbir?qv3YCVpA6d{Grh43`ph zaBfa}F?J}v-WAD8pjlGfXnWbfCV@u-iZHHM7^8A(g|H9?JpngU`^SyFawwL8_;f<0 zwXHce4`jJ|LfYJ5<945$%pDTuhG3HMBL4lF6-Z3D6Ii~5wQQ9*7JGe4z=H=UOV3O2 z5-ZxazwbZtE3nh=vaof1-JMb2By?V#o$VViBP}Gz{cy=;iB^?s5)?AZ-ngp4SJ%4laRCX6N} z_j3)wl|58To+|XrZ2Mbn6mmP9jpM0J~dS#;Skat!}JIMnjatqxgKrvPc;qA$GFE~8DHRf+S$o*%r2)TIHB(i`vX60 zb^0aXtTmj_>(z!)3wMbp^zoCUlOy64`i-c4T#d_>Dme~3Uk{tzM!nZ5ZpZ`9SzFa1 zZZB^Rnz%Z=*WT8!AAh^byN%b4hlNNktQ}Qy!DH)#jkci}l^gSK!?M!iPvYuEzGPcR zL6B_hMv+uoTcMC@R#G%1p|}c&MC+W=RBkiCS;HuEgnd}0+n40t0%#R>tj!QzDVQ0v zBguFP7P=nWkzD)HZ8Ikrob+VXguv^C-;v!nny(zy^)WwuM;wF9J}y0PyukID{Hu+%$OUY`7EirS|RiLXX}iW zLY2Ie3Q_gOe)4v3Vv;jEC81KB$BxKf5(B<$`OgjXZ7$}o=>j7cqkA^*sp03``;N<8pMW`rfd8bc^qf^BEi+&03SlsRk;?Fmql*xN=}609+Y zUrpoL+p*grkb;6}skoY(6@YW9^09uS_5+$~^eXHb_rBR4joV0{PUHC65qCeRkNPxh zTv3IqsKrLd6EOc!lKCLKB7~4@vB7oW9E!Z#c_Bmu=NybAt?s{4i^*om8gR5w0A}L4 zY5tKcInMuDPAJHFw0d(LFKJm+4JkDxt}t16M>#1tcYqJe{*s)3aqmr(?`Cs+J;vpV zo~#qfHDRd_)6Noqdp*H@o#Z#=brBsm7{nOS{xG?i#(amW1ZC+XLLSvRU7dGopPI$5 z^Bii{hYU~sY_68AZ{CVMw#&U#rk} zT)JBjj3t)0xSvcf;TJ7kZRf7=rUJ(P->hu+jjy_s|F;*4^I8->*?ftOoc6UU7M6oORL0O z^xL=k@?mZVr|`FX2T-wgQ`_gXCjD`%+H?}nR!`r|&ZF7o+#4_PF72YD;gG?D(d&j! z;`48wqUqvIaU*cG(IV9qF1GRb$~M6Qj6 zf}Iqv*x@SX3xNO33u9z!8|=+%im(|=mXHuJ#5Po5utd20=efH;S}u!+S;>INYlq!I zJsi|LT&(*|yf`^tLOLVE|K#}j7^(Kl`1d%{hY)8K1A@rwwS!JS^84QS`FxEBS96pF zh_B-@ZX`r1T#@o4uONU!$Uc>ITgkVOa0>IZ zsvFb?!>HFPZZ*V(l=Jg>qSc_*>(~4aiU;H^XF{01 zY}WQrrXcM4-Qv!2TebVW?ywQni<^CkV)M3)$F44mGvtmjy+RXBGCBLM2pDPER=tbo^K-FXJLlDlGaCUWImsjAYWtj5Q4qG~UxX!2;hSd8Dm&2X;s3VP0{O$OBHNBVemM10I2gmP_ zR;GOf&cCH;p&#B;Ke`NNZas%di97&CUtFyTtFD?=%@HnO|2)+_9Ud8KcfA(fRi%U_eNOaMh zzJ57|D7G;#5lTD^Ld;+y#LK27kLR*^63bQuZ{eis;eoy<+zLY-sAba^JVpDX=5+pi zJRM=RG2zQf|4tA=GMddtOeC<6g9!z!de27Ba45Ank1vEq%FD>7;yEe&m!FB7rxT~j zL8ydC>XZ&`s40Zj5f0Y;vxjuN26;6azQif`fs#rTUo4j@zP&HFNueo@o_Q7Jw}6xg zK_VG&Z|JBFk>6(4yiWvudl{2L`tB1Y6>FX%rf_r)`8a+)W#M)AX7zBzn*IFRhX!~b zmo`NL+!v|MC`G$2J1iv3%_kO*TcxeIiTB=gg4QcmSb5|yXEZ}QGKxRe49UV_+Dnsv?tZ-FMuBwyYkD`TAG2>Dr|K0cLn zcw2@kj$tL*d4r=0!f(}*5of&;?YuG3S@K&rCOVUTtI!rF+jL9k+lG1_ZW<mQ6I`}3h2@PY;EReTvelP?w?8GpdF{R|cU8{pwEMUhfquw0lBHlXu zDQJPTlAjI6RJ7ezTkwVNT^vn z%_k>6Ld+2KEAkanVnQ#znlIjPv<*A?_z?^Ne2*L2ACaf>bMg)2?=K$HH%#S&I61TN z2;Ui&6>Y*h!&_5#o0Is?P*g6tcY}dRC>OcL?u^Fo0{d=rCEpow6$9J*lbKI)XXBU4iDoeIE4SIH}UUnZu|KWy*$y)Q#a`GDWn z0hI9R-me)b;oZG21E}QZy)T2v^Z1e~wJVqJy%{Ieg38X{`!pDexfqpm0Nr6n9G67kAfT0(J!r_gGWb?lAj-lKMx-rfAQdR`r|)%|DWvb?fuvP^pE#mF8_G%|GN6&-v98=ez^A! z|MrJ_|K>k_fA8P_Pv77BKmYj$dw=&YKG>{r~wd z_V&+yz4zh&^P9bkm!IwZ^Wk6b{qDc}>%D*TKmGOIKV1FIUhBX3o4qIh^55P2yMOy& z@Be-8aPO~P9_{_ZfBSInfBaXE_Wt$1`h4%7U460F{a?S>`>#HGy!ZTry}b|iKH2*f zUO(FVkiGu_`)hyief)lZ?=SJ`U*h+#_kMz(`+J}6eIKun@&5h2Kf#NBQfvNt58r); z*FJml)4d<#CEx!F?>@ud@9%wt*T;bL9)tD)+Ws2-$(4{2cR$EN8{onqY=~V zC+sK9FVUHE5z*rZ0uPP>ef~p6rH|M%zr>hmRG(n{ny)zLd1|~Fj)C=M99$NegkUqv!A2Fz$A2=rvq<;je z(zrguZ<<5N4a5r{;&0-HU*hNcf(!lv@JLn=&FEX=B;o^VOLPAlw9@nc5kCFLY=&t* z>1m=D;rt%{BAhus#N9-5ni=ADTCvnKjo?@KE$8tEz=FP`Z-2<1`#$6YpPx^_rJUk~ z;b-h0pHce$BRoZON2`x!oYvnb_({Fm&aswXdd>5BH|JW;H2tP|-qcRg+N86jG|3CT)`-@$zG!8A%+?P0+P_9`Kfq6V(L4U0|0JozpP}dYOFsJx^hKZi0HdRSzsBtSiv6Pz z{|v96GwA#`{ViYoTmF+i<1Oj$U!%o8VZRBk>{0gnbN0!H`1uig_X*=@YV`^J(dr=% zBFX#-pb(c4MdaT2b5Ml%>jV7!5KsRM-w=&Re*GB#2zy#DKVy(+u7A#GPrrZ7c#Zh& z`}p@~fI@Ko3_TJ2KSOUMTd5`g4u zKf`YtJEzF|_=Z~06Mv2uJw@_>et(9Z2=hP1Kl=S6yd&)X9KZj9eaiQOKgV}}fqz`S z{|L|0=N~gTv^L)tqx=y@@-vK$p8N^xm-YjK$8`yUL2HR*CP5%fKE=1R>k@6~Z(6Z@ zd?e{UWuMaDgfFKZ$-kelmLKi?6@x}HjrMZt%Y1Q8c@OZ23V+M`pgodk^CL!Snqe*d z`HIQP9-1%W_D?~t;+^HTq>kL>^W_bf>o+ZJqzvM;BCSK}NhGH~#9y={(|g+IcTYbq z12dM^KtIFBgxQ-&4kohC*9 zFe%A*xg;$~`g1*!)-B)vBt7|_NOa8O%I|0>^@mL~{El*@gOQf&%6*)2-)XEwJ3Eb) zX!W;Pt7P@))wv5jzv_;|v5|Hr=LY^6>0sXjwzPYYB;xkIe3Ekxef|TCO4>AXY@|Qa zi+@i~m``ztL^;xPhzg`-l6ClF(B~u8j_feg-@z>`+M&1xMEVl>4ajryG1H!CtrLA| z?f(^CA3z797x!)GJ%%()uH$gcfpo?{MW27hb|TVxxGnKhU_x3gX=3DwAV}|Lp#4zb zL->(DM%rF{jOm}8D%*bk7`Xo$eR1yr>6qkK_>^%F&BCuivmdhWY4(4@Y=&PbtV!b} z8j&W*sl|VC-v{a4KLxGHR^XbnwBYC)di@k*q_#vSdXeVLt$hBQdm4x~1d*usQ&5R! z<`d`)@8RFi@b5=^-^1V3g4)t=Zg=IDA(NyDruq;H*WPy zjlrBLKHm56JjaCWTH>(J*iWgU&`fe~hty5J2kVqH9sW~mBa#O=2M|37bMi!xPDTId zZ?1O2-qTj_&=x_KMGa;nc8^@Ak`U_By zuUpR1^piX{+}a{Lm*`BZntVNfgnxXGA{g{ft{l?4Y1X7|#%KRS%pzHN+^*u56`$6)%>~)-^FHC95j_3MdrtTGm+;EVC**JXmh*`D34i|yu*&0T&MU;%L>rRw z`=B1#(nNk!*_3&r@3E<@Ta!F-us@Q z4#D8w3Yz_2?EO2GgmH3^&M85KsLRQVHR_0=NK}5w03;uso=q03HSWGs#RYK2G{FH^ zVYPv?Q}t{ZUyj$))skPiRoEipg^5zt2yF1fxz=un_H=&!3Q1#ysNTik+D`}l?qsV*8FdR=7+j`jw3x$fZIUQiccroW5_Qz5*i3(X6<^TsBNXW>UIRr$ z+uSONrDK-@*GG0G1`+AYVoJaEjUt6}iU$~96;&zp*ll@qFH`xVbu!)Jgp5^px$G+lqpR@@cFpw7h+nD! zAd?p}R3F^}R&GBgNZd2@VkRyDh7O(5!MRN_oX@9E*=Nr>ucn%=2wWx9A8{45H&d(FPZKlKfcE2 zm?(s+v*}ecQVV@{2c>AOACtR<1mFla#PXw}cP?;8?VJ|vG{U2HF2-$ed?6*QAcugQ zhjSM4B1SxIytrPVCI``3QuS*eqvja_dg!T#N9~aq5|ku#h`*Rcjw`yau26Xz*6IRR zDU4oERxd}h_02oxOLCbf&^;1Kz1@4vAfGr4+M<;TVGVC#}(^T@&{+rP`t^s-Fouh>RY|f_-&s|90DwEjE&q}q%_YcBuyVL9VzL;rv zN4<30gsthK?0M2aF3VPL)c{K~@LM%XE*;#K%3C!+^14-8l(_8_W(Ot9Fj`^oi3PNM z!>GJ!c8WoHw%#ckrTA{A7*t^lly@gD9o>QwU+`;f#C5sp!!CDrVU*##Rz}X=B5I{r z=@#*G<*{2ttqk*}S;=YZX0&kOr``1C#3H-t(stH&)7vg4a{CridG;K-s5E5`{gj<2 zhc0X;=NW0~tMLT4o{f;#`t2Jjdd)A$u!QxLu%FEDc|$sx`7I1S^Bd7p`CM|0p|fzZ zydJO4al^E=-xWTxLsXVD?YS~wIKBc@p@Dj4aS0g^>a7t%z{4@v+%ogmrmeujXkUy< zdfTOAIiedk`eR&iMwiwXY{u|(r?fY_O`Nj?|H(&nH)w3+qSO9*YJ}1hhMA~hZDJ&r z&6EcyW6Ylk-*K_;+4rLa@wP?6(DNHuz@j-joHz7z(Z4GeSumTYz}|_@SdqIb;Y2EP z#bGOFFg6DP6?%p|^?6wWa%JW)0#iwtfVMb0N)y-WoSqNbhf6py{9EXl25&f8b4I^) zXM(#ieS%{ZR=~t*V!T_sBAHsYyNx_fHzJb2wVh>b3@msjvt79Y61#)}tXM=`v8{-a zEhX;wH^vCB-;AzeoG73i`j9Hg)FqwyU%0Q@AKQd3jaccXO+_V!t zD3=pXF{~OL;6kP>KqUmi81a*EyAu|uy^j;i*?4-F=s+WwzY%Bti2(}Xq{a^!h2lIZ zD%AA}Z;1Q;3P1_zWq@k_)^DajHLXAi@n(Q({nl@#K((wurI^*i@Zi0gKcUxVR*?-L z;u7Na6yl{(GWe@-7E-{SqcFCO+XbNA_+21!y~TzOCFN;m_$A@|R*Cr3zyqjE!o&eS`svATII}gYWOzdj4!^TxwVFn zz`ZmY(sPzKmo})#IV3XCTo%t_3PpEuRYWmoNSi3<3~cACVLK(u%05NFk^mBPD+$Bg z7#Po$ghLwxss4|cYgfLP+_!*R7;&L7yY5!6@EeV*;mcYsZXP!D4b)ZD>2iWC2WX*E zL@APHbnhFFVM62;eCs#ajg~9UGYh7D%VKxLd`f!S@z7f{%+lQY){Iac=5ARR zZ`FXRtiYW{hm;qyXFJ2AJP+>-1#2eTX^$nj;1=UI%CW~SAy|rUZV5LVhPp*m961fL z)HqahOO@iYqQ`Hm!d36ni65$Wr-ztT*meWG;;d~wJloY&S$0%uek}WNnG^?*Y9<68xAmdL`Xt24B(V0+c&u|Q)oyBNXMjy(DOgP^NoS0dm4n*OGIhmck5hfbP&xSx8s zzv1Cw^4Vd|qc17G9zNo96h}eW2&I=$dIlW{j83n{*D@E-9z>e&ElCV(XNn{>7hE5u z4lYD8$t}rL4~FuAN23*Ob6wz&NLoXQM4Veh zg}jvZ-3dPgTPuvGOR`y#!LfuTgO`LS*|ubJ_`1+i`%}t;smO~ZJKn@o6+nvH4-*Q= zb~$25Xso>H{59enpU>B`3y(b1`Espv)|s66R(cBY#jbMN0NP?&w@8;==GMXf_507Mi zqa8`}U63Pf_pu#Ud$y7jx2D_2#8!&&-?;a`kQr{H^YjF>&^*f;F<>OgXSadsM!vm; zd8$Y%V_6)C_eEw@fmoA!Fs32YvMlguf$1OZ~O}O8fvY1s)Sz{vI>4kANyv7oDENgp7TdR zZ~Z79gw2)z_z+;nNr#%~LNZc1pf=#K_l&eP9#54q2S05>Y}StBsz}H@hsgn zvB{g^Ly|z6V9B#p59UINPWCr{D+^}IRVgZj78%YK;1tQMaTL<-mOU<(BffRyO3?4l zG#5iKsH+`{SZ8==SZa#G{r7x1pQ2jAi2SWyrkdy=68<>J9c+8QN#Cq6tBMPpYLpJm zfqcu5dT=nh7*oyE@zphz@uo`I8>*wS`C>EWKVtwq?k6kmJyl*+lx1~CM32H92i-Q^ z{WDWF!~HCm9+WoG0T<0uhf6#uwMO-9B_&REaX!DM4Wjaph!IW|P%~8AunS9g+KHh$I~5WwlkA zn|=UNZB5a4Pp(w!H%ZY;3TjOirbuWZG%BhYLz)QFrA%$50H`cAlb~}JDk5hwSXZbU z(#Z)|$|eWY4P_pZ1Q57xNMI(Yl)nt98!A5JLQO3|n>1i1$`XVt3q-Bn9LBW4#EBto z0J5R!x&by6bLR6+lye5QiGnV`oG9r6*oLAd(}EL(ED3|}%X)V%2}YN$z!H>&ic+$u zBfxB4tajN-K|znS6rm z&BkT7n|{iUYCE4-7>Wb%BK)(3_OcYsK2rp(OjYZ|9Y%5d???#&ZLiaB&Go2duwldM1yRj*yoZF#Q!veCp z>4r(-y0tApz;gYo8QuPTen+mwf0LAUZk>;WQ6)GDKUE}{E)<7}vzoA?pzGP>_b`9h ztz2iMO?otdP(_X7*8{`@48CS672pF}w8eOF|(dp1bDcaqSk|+_*KhgJh9(1DC;;P7X)&*?H{If!i6@VLMl_`TS>9{a&hu@$6!{ z`99aLeI`iV0-N|^jj7@r3mjkv&Y|WT*gqG z(&k`6&6~83W4ofy_((27`;P8kC4uUz;4UWL&Y;XbG9&`$MMMdBnD3Q7gN$q#obB`Wb(zl_$fOECoD+cPRAx$AwuosMNmm9 zY@OAzH!>M}^w)lN+*|t<+IQLRr3TJM%iR>DA?`FbU&NJ~Y{BoCB45h+da;Np+&FbL z55*veTw=CD7@Y)#ggfOL5&FBv6(Z&W@y{q6+ef_J*(rC>1Y{K!yG9DX`PxTS!vv56T+T(2V(ESw zp^c5dts@gkQBSSa>UtM_CE*nHX1OO76IYNh38$zxaVk^ga5G>! zZeTk3LxQ5_gbhkq?42OAJf?c5P{77G1|TM4w-Xlf12S6@`00+>$MOCA=Q^9Uk=8SX zN?GN;-arUb-An5xdJ)oA_Y&PiFG7pay?|+YC{&ExY{ol9Ja-eg6m@+dEohA;Hj$J8 zv5Se7Ta(dG|3>-|o6c&^O3&%M<1oa*5zeE>NPUzdVzqd~j;KeMIK;@LLFo*l%mFrp zyU2MgPJ+_SMFNr}HEgbILQ3|umSj$Cjx2H%#wuhLwzzGsiM4`e9QksXl2Dc?ySWyu zad!h-JP6!Fb%|>Rp^KdCpVQS(k~{d0je{{dT9n_glg1RotW6NJ_0{MFpjD_^mgu+| zJS%ij#EqdV>KP#UO}qR;80_b8mdUc#iOhS`YbWSL=$40PgYGpV=7Dd1-}1{`K&wkC zyRcp%wXaF8k#9UPkjI`|4@akY8W&RzI=EUuU^hC*fnB?Du8}(q5GoV*`3R@ z+{>6VV*ky+aIt2@?wWxSIam*3@65m`+Q(8mmP1b|h`7UAD0G>=os2QL-({h=7*SLO z5GK^Y$^PltWU*S0r%FAv)NIdAWs8tI^#|5YcU>QK`s@xdcaB}a-!&dCbJjF&qdRscIZK;9fm3`i@Il0Uv&>i z_AnlxKD?M94q#iM7)GWYjG6kWGG=x>0k%@Z-a>VTH}OWMp%cB-@IiB_dYV|20~YaG z8r1=zd{1&ZWzKj0*0_PER3V`1NIe@pWpk}_$xzIN-2EuZx+9(Rq7NcL&rlAH*ajnfa|hO~ zpbX}9pj>?wR0TspI`!A9d2KOSr5zwNPIzBW={pQ^`V^JBNcKr5BL;$&nDTg4{{|~P zuRZ4`tCP7rT@N0I%gKv1D+e=6!xxqq(|9OEik~>IYSRgjdHQB{9?dT2-gt?3>88dM z>V{9^^KYJ_DQXfHHWEQn`CXAf5E__)4?td22Fso_6CI?< z;goTePb6@|3~U}>a4sss++05OLBm-4Dgz)zWYL|m-JIGt6sySSCP_&RTvBG+qq~ro zxIZv9m}=9=(>9#ZEIAU+i#d-oPHc>+cHoFs{}? z$#FTLm)M*XEw-I}m!20BRuT{zhXdBWZaK)!urv%6+B+|8>jA%JYsqw~gQgBX(* zjsi?0C$@TRuWs7>u~JO~8dfAT3+)=io0e%HU1@4B%{)q8-@ zS=I%EQRMq;i(Eat51ZNE=(Cabd7)MTJMAzRU0d`1NJxfvj3||8k|0TAfw<<^(9;TB zS4{7!?i+kd8Rp%i&b{Frwf6HIdRZ+0Fd69n5-B@Fax0WLUl&;Akm(5tv@Q2WNuUb0 z*sXUcHB8R7HbX4YqNUof3vfuWwAhk&LC;aYtgnmT)w6LsRtP3+#6JKXh0WqSMw*?- ziOPhLGAZTrdUw>@cbG!E;h@Iy>zb`^%07+W<^YA|dSi;2j; z(j~PJ+~yWoCgcz2cKbxm^pGn7Q-gM#LE+7{$9*TFJA)ca# zCdj&F`^s*w95D+^Vsk*2+F^^L2&y~xvbeKTN{jGgZG^tFw9OI+oM7uW%{IO($|^Q` z*Zf4^k(dYP6$-#y@p30Tj6eu3aKDqg6oq?Kz`Am&p3B(koN8W5{or!g*#BS z6cg2vjyEXmNvQ5-v_gsImCR9LptyF6n1*bVOq@jak{ZV-$)oa@?LSh;AnurS@IL(yVB z$MbK7NSMO#DD81s7Uc?%I4;kS(TpoZrc;`@3K^K?;cz@g-TC>1^4OTjBU%k*TKI^k zOOE2j0y&!OdnVx6-^j_nh$$PpeAKI`5Ok2!k75#W^!t2#F=Bo_jV3x)IrTYT^U<*{ z77JYeK8s(Ert$2>>g5Iyg->c|?8X*Ft27eHZ*{BJ@%Yt<%FY(H%s#d8l*WJ zPay`I;;zMP(Fdt2Fp8!svfH*5$0SzC>A8cr98ad}MeI%H%Mm1PoEoZ3PAz^6dNT6*G91>psy;7PRe z8<=b&o_uh7Rb!sX9mVKVDJ&>gXja}`6)C00Z9z)0JUn{n6>qrPy0uKd*?q@$i7biI z$JItkaoELl+Wi2x9nw|nafIs9^K)JBgl!awlMftZ-O4S^TCy^c5B9Et8;0;!-mJW1 zD(v*0V7BdW1b2t#E!|C$x=FV>{^`?2RyonqD&W1}I7&PV4vJRcbp>ojx8o5^W=Jvj zo{gSCSw{tw3o!tG6~HCc4y4){`}=emAr(@?X=j=~(lb+-bAUF~6kGbyA>D-W5I+MF zKEs#nUMOf}O7Bq;q6o7uPJJqkQF}Q?$%AQr$qN**#@2tbpThqu!k$WD6znX=kD##O zdt68Nh%AuL30wUA#bf#=i(&)h8J$nZ%cb{~y75G5&m`u|CsJgist;tOZK_Vh``pqq zNSj6NG`_-xj$@Q&oxh&Z1jkhBgjE(PR2?k9oY8=YBM5td-O7OpYNU}mi=1jT+2BVB zxn0!Et69~2-HaVe?j27SyMV>xP5EJig>%7XsH*S}qhh65RiMQAQZ-tuRNM4gE0i3)k9IJv zy^vPm+!ce(grn$Lj~8h>-?p`Hf<#vZVV{fWq9gpmroELZMH7cR`$okZH0SDVNlW6U z39R!(=_1;D&0RQ0Pskh2 zE3k|3*t=qTu#4&332=*M$Fmvi*H?O0#Wh>>p;vevdY03_9xrCH{&iy2urEemW|@PZ z=)mJxRKu1xF&!tW$;SG*h3z&M``pwFCk~q%CpcTz?9C!?<(kWHwmT&FST>a|W)qx6 z0}X*i(S#Kc!DI*X7;i)W1(1pmsysKckUkrB&+rgl#J^uNxs`~rB%Rexb4m;Zf0P8H zqF+r~=Hte;OY8VOHsFm&mVlRwZOrU2amVH8axuRetzJ%+@VHu<*>rp*?bejZnIf!% z(U-Gnr(naJ%}Be{Bg|sYJcQe}y>t$TMJ-q%hEDdUD6fi&k<1g2*frU0sQdf1pfq&e zNA5Hc)}oGOLSe`chD#CNb}FH5u+iCfboaLkXSv`C_eD;KUZBE#*H>tsNn*aut5>Q;4A;#Rx%guyj8mulCN&mJIgEQ(>1`Kg_Gs=c!jFQ3-8qF zfTIATO73A3F>7t42oZZls|bQs@$Zd{V3n^~*nQeBlCS1$N5IsTgxCI*YeQRt-nW1* zQ9rD3toBw*A&7z_ovof;lj~TexZ(hSEd(Jqtg9r&aRR*IAr%4gy;L=YbB^|=~ zS?7iGvHehxZ4q1BOZ=~k%D8L>W={JRyXu6iFxk+NNXugb#NkofA)z5qmMRd7h$SZ4@Km$$JQ61f<)Z zkhA!*3`+=9scTT}#tm+ue!;Jyqf;9oe=EJ_nw_bUGsdA)r!@0eN(t|GEa;OFIDeG8 z>>-!=%@J)qip#-qYa1@+v%=o&cm#nMuZ(!-oQ^WjY#k1CAzUcId(Hu9ew_-ILL?>l|Y#MY5rt{U|n-FvcmW!y0^gpAtkJ9#>e{r#Z zdzWs+nyx9*rxj1HAs$nTwBFB4*pT|Lq{&WfH*EX5ALlFKbT3Suw$=@db|o%z)2%I- z*LZl_?P~f_$IH=lL(9w2bOReBT0c!!SG`=!XOq826rt6W@cKFT`zQHW!KMMy9)>pcb$}aP(p}aPn_t!9d#a2+5>jW{^02r(E$A+TD_6;Gk0m zQ$USptTI5%=j}>y7PYXsuSd+B&3!mVH}tr}GPF!VF*=B5xLXA5x@OsHu)a|hk6j4K zD$f+}W~Vk*n9&bCzSS}^o`-E}caO^h%h*K&wu&mWmWZl_!(8;&)2W3w!@x^l#8ToO zmj~tUae1)CmuH~2-EWtA*nwCCn?G(nC)C94c83&t+V@wyYnV-n9DI4tNJmYvh;msB z@>wnVt_!?;NnEU|M;T4Tge`Ncm1UmW7Ppvbu+7JqY2dbeEJ_udJ#48fnR#?`|3Ew&spm_2CMsD78+i}Rk=?6b0H<``FObZB40z|a_++_pw%E;gLeY^$Rs z{j6Nk8x;0*6AS;U(S$sAwnZG0&1|YL7%fWHPS6m_)jZJcU7gUnWyY6de8o)U(drFS zQ%@e8oWQ->oX($*r&M}?9Dh8=XoApjL^6wN2J~@Jc=nxSc2VjW^Xjp*tb2o-^nQO$ zSzd1uDMfvZdqYRcmG`vJ8||8B?>6U8=k{&p-aEsxA{*Zs-b^Ae>TYA`J3}$e+0kr* zY8|MsgS>i(Ty}DlIuFX0zTr0V=t+EuRw&kCI`&oQ@Q7cw&cBo8GLXp#pZ!%)SUZ=g z#=^^kVHMYJ!Z50BjIQ7d9=|ZEuJEy>D&y$ws<<*v@)=#xCi%JYV)HW~MIERoTPx9M zNTS+{Ec%gxm8v+Sn_beWi!5)$8fh|L zqVResS5MiT5TvN12GssO!bW8+D8NjG)K&5hwbx@u&c;!jwR~0v=k8h z1}i1^NH(`6CU0J;F|QU^vS)rNXvxN%Dq}`Hg1wWIl0D;y8`%HskwsE2G9t3%^wS&*n{@G^#j_<|S9(Qtqpf8ra+XTaotEXmkH@+eHQC4H(Q z*sEr}F!VU8&qlbgnhl021PA7kFJH7bGX#wI#^YB~Gwya=t+F8Q1F?3Nv0(D&T}=Hg zB}m-WFw-2j)k|g~>bfA^1(IJkmh=hgHsnX9Up^2+gK6&cN^&>(Cm?AmS{*$6^~wrmc(u!B*Fj+=LjjR-iFdWITW%{4mC^k9-(fE*5dd9`m4IpE1!3}j16~xjSvoj!D~6|*y4Q9<<=ImZ%Q=32 z6VaUFHMS4V($d_3k!w`JR-7_fRJola34ldq=hTtg_WavaL{5)IRq)#EJff<*Mk%)r~!?WN@x}!ph~T zpGKC-69gs13+<}iKq!7W9dq)YIu#*#6zD7Bya#k$kp^Pbb8dH~0ey*J4|B++0BO8a z&C}2w2mhF#lbBi?PlN)_96>Sxp(qnUJ#FWsP>);sBeKt1 z%Op#KO!ctYFOhi6Qj8KrYjpL)4$$2aV-jOF9R_nuMaXV&LsU zU$xOJyuFd5pHmIS$zPOgWm$1gHQMS+N^!pP^h9jd1elcs#m-KGixud0x0 zpKP8A-6$)AFlq=(70c3mLwP$WjZZ;^%>Se#_&C)ge=-H2iJo zWZ-YXhaFvf&Led+QfO4xyO@Tx4dGk_sL`$vs06C)wC<$SZKRWP&Gcin)fRg;J`Xl) z(qA|NN?WJO?)`$L{JW|7+mT~xzLT2)FjKZc8bvFru@(E+;m)T zT?0UEQ190JJ>Yh@(vOCD7o)AoDy1`V%qp&zgN zgIc%a17YLChF@znJKeT7`9eS0Xm*ETKZwxXrT(<(4}w~!?t3fq!$xP&8+2OU2@*yO z+8?&Upg9Pe0braQY9OtaU&lNHG>Dv-mcv#Q1cOc;^gmn}4WiC)h#tJIfpt_H4*XgV zy&it6A8iks&2Eck>Tsq%?bJHW){t{t`{da8qTcLx8L1D&%aPwN3}X zX$~<^&ANxZ5dZm6=p7iS^ukWBU2itMxUM_wxBG)eKxD!BRHT&hQ5z2-;FZsbiK7=49}_OR9+dK0s&M%atmU}$fGJ2Vx5M!nJQ*E`w(4Nm_S%3Og%Q>thSpe2jAt9| zMm=i!p1*!!d^%`=HN!s6f%N)4YDcYhYZ%qN_Sk^i9<~RKe&l=oxfTFN9Sot}=^(5c zxqfQIok6|T>;djm6SHp61ko_I_Ij$H?bbR&zt#!8>C%AEtq;1*9>ku1tryZ!5A^E# zZQuJ6MbT7my^bIB2eqabnjF&ioAsz)A9|;_*hf9v@AYZ}f6!!Wz120DauD_*3PGaY z*ywTqYPKM-y^H4t(t~!-AJ&^~7y`z#!_aSb!j^}FDAnV`aL{kmeelE-q3rtOW;m>M zKvAs4wK3HXo5LQa6>^r<)bJ9jLup7-V_aAGB*goEG(gA&wpne83oxklJtbNj!%5sXH0;d~9$% zCJi8$(q9j|wN@`|({99DCkXx!BC!>A`Yl>53FMEXzTatddOfW9>#1Jh$Bk=FJ_J+{w7fZLNEq_yQKQuu_$};%+(gkWT5U*T5?{1= zoIGSNqL8`yJc??~cDE7rh{d2s>(-qx3jGFhc_9$Lp*HxZRe(pGs8*+~q6O76A^snA z`gldXffvG9PJT7;`+h6L;0{h6J^(@wba%s`9Yn)shwxY%g8B2B-vKirSCR;r>Fx7c z)bN`@uj#F4uV%P5S3&$dtaStIS$*#XH{ta+4TuM_R$g)h%vqC-PGd=5(YqG2@j2E)^6(0{7C>j$-_A3~fwOQSewwmQ*( zsaIidI9|O>kn3|)DGPeRVCcz&ZpkHI)Q4^GXuIjb`ad~l#=ZJ33R<1|0IOwuejZEy;sqvcgzvy;p^xdwfj9CS?*Bn4L3~Sz!c`vhI2Y%RT4!Y31 zU>%0tlj9fj6&9Rs&X}ck(#X_2X#RM(PQX9a<20_3#?LdP5(2j3r)!o&cTY zxOI9uJbCcIWFY7=A!*EmR!bbeYK2{nfu8C2n^7%jcpAjXF*d=IW9UuBbM-DJrXO}V zfq5$T$? zwV?%Jk2-BVi5jOP4CJ&n==V*e27^Wm+Z9CX@%ePVj8Bd!r5@Ou3SSU-p&v%|5Zg>` zzMg_3XEgOB^9I!8Z?yfUhii6bl7lb`a!j5aW8k{)z^eyAw;w{T!5>8-k@|U# zgZV6!Coo@oz-0Ub+NJWQBJkQF=5*K&)tFDC9`Jsq_c~zNZ!|+JupS08!vIz%kGt{g zMQU*dHLup}_nIvjU3gA7%p`p@ZZ$8gkrIkke408NF}4ao3mdeqNT3TEil{6^3LKQkSv z7S%AnUH0$6sXmLw2YS}c#dW$MJxlb^gZThm1|puB^~A1JK_UBO z-D`%;VW$xcq1IiFaRnO|i#mcZDUT;xgH8tulJ{&$RQIv3u-zfMxawX6t*hR~N{x6V z6UdJ^u9IWrB(LKnSZp@X`|C6XbhSLu6l;MN$T5jPJq>ja?AD3;5c@&~^T&jMM;D6) z@~9Pw>!3of0Xc?=Am;{A;WfoCWXaHgVC?u|1ELHS9zZ8rl30(#HP@4cvClzt0)<*w z@3*;ZWS3=O#mBF);@LXU7&N>trWm#oxRnc;A$FJIh1~G^e!t$V)jHm(5sm`HkJ$93 zw=y6z7(iJMAbDhBKRq1JFP~3}UO)qM++el7rOOiuaoNl0b(`yIaZXfye8T2``8et z1!-0H!GIyuv$T9635QFZjfWe}K3EV7Ua{*FEL!s8WjVIx!Ft4G!UBc(rTqbgfQiF9 zaeR%%Ih}lyfZcCHYlC}=tfmRd4G;xiqs~AvGq${8FKBf9MjNKuw>@4{=P3$hGg*S- z1KKu(qoURr!t({)MjTau`IthDMLb_l2su5{$g8)YNi{pLi22bsVPkSQb)mIxbE81p zDCl>BsFT=h7xCp}Iz2f?m?^ddvnx;tE2`f$ySk3!S9;*ZT{VWjkA*&fXo4I7jcJ<} z$|!g>u}MUbkA9ChDS;Trp6Q$itc6Kh#fZFCKMDu+PR|n* z!{R1EwTM^i#fhus0TcIc}tV1a}IZ53E!OlMxkzegbe#eDE?bfKLNqDXGj zN&(A92b*Dg*d1cx4UI<*_Gv#1o;6J9oq8AU!xr|foX4Nk&Qgyr#8$>Wp81=s26?NSe{?X~N@pxx_{KN&_QeS2~sp6AB6{FK?|^(RjTPiU3$ zCyx!s2;9TLu+VDIYm_MKvX&n(w4V9n+CA{4j!hMz{?P+Z|f_4tlf2~pO zc;wO!+7Q0R;!7%|NfXCherOH9nGc7AY)t_dw0!xFE!1P}yuh$ponbSAtD4MBMjkeL zaI7Q(Bd_@Ih(09!nt#~r8LBC?iFU`Y(|nzB{YM3;;c;f5X9Z=)>$J)L4*$ecEaAx| ztt|*8ShmL#@QILDnm}Ez4wCjFSOSFv61u7G)ok9Xx8criHL&t<+cnCrp%ZjToiV#$ zGFu%Tj#g%q-k^aw3~BLk>rxU_4a=B+gSb7f-hoqu?Efe6c?_A4j>gcO=1d{Sr3N6# zB4M@lz_M`p!B>XPm}rm!#V}eD%5>kWwSwWGfeoJGfuSH8vf+F@W9`zLcHaw!y>74H zKsQ|VQTwp`d(^C-vejX*a~}hOU?h{PCLnXhLMBDBXG7Tay=J#o8#IQ2ce*M3LP@*6 z*XayfeR3N4+)02XIo4bG$%AiC9*a0Ovk|n(Rs+6SIRdF!$iGKV^F{>SqThpOy@tdL znh-{+W9-&ohuO*FJXN<3UmCVKY+PPlZ9HJQ)dGv{n5qOp%48f2!N3cGVXxmD!io~q z6K3ls@}bqR-fh4u;x)K+%T#c3jZDTcVnKINMc5Rc=wbkYRUg0u4hF;i!c>EoV`B68 z#drl~6#BmA^Z~5eUMp;LU^EJ92#tIrInW1o@UV?Dm0}L$fDE=kE9_D2S`FHF(Xx^= z$7a%4SOc#GhlD?PDTY4o|$EZx~DzdLxY{!>44PDq+$GPz|8vfcuMviS2C(!7|tG zFjJ_*_6r-0TI56i=)p3@pDUlmqeau9A9Z_;I^y?bV4Suev8+yWoEsQrqgjjUkdX$; zNd-{MOwwS|1Otcxyb2M#*FrUA9)s0*!jvJV<4C83!4pI91l(UZ(=mHa?tZztfZ21i zS@&@UQ8Pg#Rm!c%ce|Y?T#&*t<#L$x0;#NFkBArRYbcy%#{+nPhYcuQB(;{ylgCi~ znMi=XKb^lmc|2H5UQC!7fUU`J=)o)7#kP-QKNIKVu(#qogeCzm2>e2u1R3#}aYzLh zdEgJ*^?ua!c#sz{#Oa(Ei{8l%n+9(ji=tUr8}`F49RA5|3d;~1&gAlq-h7!RtaeI8 zFuWQ*t55nd0L$ zBqJJj!e)d6=Iz8*dm;v7o;VYXW)nwOVDDmyhYeu~8IkO}7ql96a^7u}ui06`_Bm|B zcb+9T_hV{u2T?!d%A01+THpmWoF(B9*5oiIlSkL%1??mnf;nND;P8*uz@>f2>wb)y zqHr=DKfy|)iNf12pG2p1&|N5TX1fN?0(!MJY`lCK6wzv8%gJoj3cGMkMm2JdBoX2LDgMO{n9FUaFgu2tpQC>E9QOssTxSl%LkG#IzOSqe5 zt?bz;*1_-Ba}-upj1Qdy4yD!rTYG+QeYL$W_1QN99a@c+-)xg}{Nqo#5N?^_Y`h(_R7{DtMkVBP<(ylRq#N2DJ(KT5XG=W#~>g60(qhYL}&*2bJ zN{yPuV1--(SlxLDFFB$BdJVFpg>U{8UI=1=9QD;~*lP6QbAeI7O0ZC_=qruhLLF8>a-D*;q@lVB^sO@ zKRa!lJbv(q4vF9|U9PdTpeh1|YaIktgPR)%A5Ge%wKnuJ{+4M%oYZ7(ADldXJU)4R z$&S5AehLjqBT)AO>>%B+-|(0ULrSx_;EOFz^eaXHyOc>_w)oGD`L277dc9F^fxikC z10D5HRgTy=8>_)v9-z!rw+ZfITb!uFtu?%$*$8SuGsKZeQpE5*8Km*aq{2*cHC9KT zp)rog`t=a5%8Wjt=J~rAm zaij;YJmP5b9oxja>NrhfiUWY*u-k4maFojEE}a+5X5x+-8lPZ%gAtl=1VdNpkgG); z!Wu5G^=$kNWG_DyqS78_myM9L(GGO*JQqCQ6S3)o^~_eyVJoU59uWQ`PQ>^^9ydJDdCY4z>jpT_ix8hv*qPjw6Rp}U#5K|>L1H13gPytPGfUZQJgD{h2>pPkt7v>` zg`3Ubgl~my1d5sK1JlN%X_$#5&kD4)3xz9y_J^}Qa;&8ZqnZlJ=_sxiMF%mTR*mA{lV-h-gy9`b*}M1Mk58g1S@P9fRMBqz=v*NtZK1%rHpoMIAWkF(H{j@}L7f{kpe^yd%vJ^Isqu$=Z!6q5&Qd zvl+ry2mN*kt31;iat+CTW5NK((q^kRPFcGMA1j`BC5p{v&pLvEN1>qJszBI#kq5b4&({0#fsU4=}lA-@V=tr^1MgIoWRw66cnNr%?C=%yvT` zA%f5@ie^#Gt+@%bu^;!su8*ywXkp|KsEzFyF+WWN>gDfmdJ>HzIjC-JL{LG2!Dd|4 z+n2aK7K)9z`L{h-yA2MyD|Bq>B8{$>AY@90~`#I$V}A8Jeq?LW|JU zY zzn2sl$CYmqA!c{b>;~PCvYY9^-xWxF3xKL91*}9oNXvH*VixEb`FL%+aW8X ziy%M*KNonXTC85ik~ZgBq9KB*;g3g$S^9ECj>b3^svUUBY}{`la6E{}pJ$$Ckc4Bd z{iNhe@KP7i6T?=6B3)A|7E})vio*Tirh(k^!U1;YCR||=Ouoy@$vMTUVgtCwWh{J2 z$KP`8!(7}w9KF?pW)pIuh(tYRH8K(n^(cEDk}=2=N;0<5<)?`3KyigsUVco8+&#?+ zxIth^I}%xQ#>(r#1%c!jB#0EtvmEK!_X6afw0#(6S(d-7Q(p~x^j-<^P>+E+|mdx(dv1zl3{)~h*e|9B;Wt4v;C&OhA@rvyF(N*|Fa+5VDi z1;WB?7j=-W5H%riGkCIXVuQ5C0YljAvy*x?k`3fBdqp^Q*bR|VlkJs!!QJ@_!bY=^ zkxd1c1))!YDbz(;iKKlmt#7+zBm&*^zCV^gM z_6a`?RB+nWiZ*ZN!l7eYvstGWw0d=HFsDc^Ph5O_a-3oYvl&9WhuD`kXzb5~f5>cw zl&E@yXylwJ*}@1R+}k}wt+gnOrf7i1Qc=B9Lj-Df{ice^)EjVSHn?BMY~1M~RiQ@8 zOnhSEyxLG1mcH?=m6g%myQDKOu0oe5ZT?zd&Hb2dWLX} z+eBVp%^!IFYDMRbv=xxkL1>^99Dt~A99{roe(ZY%w{XZ7Q-r3h%ypn7%_!`)Q1aDjeo0qgL@94we|Wi?Vd~NWXG>@fMGTp z_Sy}^Y1%M8Go7{kgWlO{^`eeXt5taflV^8guOUKl@u|B;ylSn7%vMsbill^MT(jA* zHmHR)B*1_Q+AE&E4V~7XZUu)<2+v*}@lb_yUBp*lKt@{K5FUtn4ch~Gpc{3dJVuaY5qr@ZLXd1`J*`yX;IV^@AmpI|Q6ESqH#HgX*L6spVKLZ5UM!DogW}}9SN<7q{DIKVEEf7Pfwqn z{r~K}3w&I~bw9qcj4i;#CYV5;7*L)hMp_ADAjG?pRp1ZOmc&z$iC>4ajS|v3gV4LB4C2 z9gsPvGWR9S$oML4WruBw$n--$&GfHZhux1f-lExP`b18ZF{JS_FW6l*jEmhcEn{aE zTBxI5(L=+ohPtT?F-K!oxptN@jm2yqZs4Re+N+TfSQ}I8H)5X$tiHko$GSpt+hh)VkfsnJfNy}Z{$JsA7N!XrmVVa3H10@W$BWg$p3O)fJkv3+ zrroM0wa>a(m|tk&$0i2f^L5u?H#{67%*X|@b`4a)zOKGOin>rgbLcbH!N(d~0Zf?- z%qx}(q1>*;egUT##I1()*z0u-I$p?>y@u-8jED{K8?liJK{I&A=W#Z|lphXh>w2+0 z&biEuu1(g>hEy;16!i9DYbw00vND#E5B zY!Dix{XvWyWG!&h<6vsTAT|ub(=x@CcZabLE+bx*WDt9NdJu*Lp+cw=z-yeXiM^=! z^vXN>wYdi`x!*1B;2l~R%feMYb|@hnzPp7T?wFP2>WNGgK&~Oo!B@d@CsiHqp^D~5z3HUf+hg-_l9QgZ zV+wWhtrx-BRWsp-73w6a8Krq{YML6Lx~0rbntYBmm#Jp$1L{WDUI0XdD5?`g#Dnov z%3D_sBF3lOh0!7tn0tasKC-HStkJyb9!a4`N$0SNXiA0$JVX=JJioz!5Vt4PBNXI% z5_KM4m>>-6#G=>8kzTK*K}gzKn20JneiKR!DCO`jN`o20GxI{LEUNF)V8<}7v<^kX zQ}jY}XnvMn7`XyOowOIta=k(w_td>; z&WvKI>y}<*)O1Zkrt!cv$@)&?3n?b@2dkFG@&RY^>0!N+PUiFGNE#c$&*xL3X&4t2 zxZ$RR;Cim#3>3_ami&<`H`l3t1D=^XHWFuH zf@R0?k&zDuD`X){CpqO13MRZDxTpk?tn-Aw0FpCwE?){Um}s)&ejnqsKX;+)pZVv; zGd}sxgKjjH^5Die1<*}FcjD#8(wStru{6#F^dLm(TyAi~GXmYnnkNOikw`J3#r&|z zuN%W~Qt3f9KReJ(KywDFK#H0NdC}}}8PfaEYx?t`bTOCrE=2NB&uQJQ-m9vLU`7$? zVA4yQT&%r4M*6LXWxZ1dy-2FF20d_EHcT%L9KmS$(0K@-avB_ft6?<_!{Sw_u0AZ> zIE=>3{Jz<9WS}m$b`V5$avoN7j^ztLF)tGxvxp}lLb1G8l}Dg?aP-V39wbc@i3-cG z8_+Zjdr}KGm;?Zan|lHf46{KDaTMc}%oc|NSk*a@&x>XqwHDD6Lf}G=Wb>0{2k+_1 zrzOwwoHICJa{}DoB$dO4h#h&a;o9%TZJJ#%T{kZ~a^BTOfv*P!LPFuiucsVv ztcYX(Jb5v%BZ(oKM#XXki;zEw>Cmb)Q4P(uo=h4UvVw529Zlz?JP&H5sVfNHYX2dt zQbB0K%UfTcXThtmxyh~z{S@OBM_Bwi?X=?^BIqtLQ`4av+jpR#=e2N`4?OVC0~&s~ zpa0Wyo;^Q0ZXs!WvP_gmqj?0tnlhmz}ZI+x_Nau%?041 zw&C4cM&w*xN+h+rQ#=%ZYFiOTHSf5}j6jaV2;J%B<*Xziu?cKktXRa^d-p_)wqI0B zc^Nr6s89;rT#<$EE20e{x?MmzR+Q?XcW`Zm7aH5j5cC>bU9-iBEc(Lj`JngM09iqs zQxotXVdyHLwW;g+w$S9Ie{dB|V%kz$Q(MWIaZ}rx^hmb5RAH4pp2uh?7)Y&_?_oR5 zXDh{B@LR+_)v@BtKC&ESt%`C$dTYsk1>@oHXrWZWo-<3cN{zB5Sou?>V2w(hN)9;8 z?L!40n5Z0jkgCpH-Q4#gGFh!D@f@T(XFffVIo6xwxhf>wp(ip$%_-X)lydmAZw?ZS z(#Y#fGTQ~8U<5=O$&SE#2a8^Hx~L)JICs!Bx+ zh+EJzOptAy!l<{l68Y=~bWh0?UX&3HHb0)F*oAg4pqv>2hfve$Q5?yJ?@oMojjU>`;)JYZ%7nGm8b>|CGdSJl&%hR9e=t2tTOlx&^BI;dTa`*}#ruv<+=0O5#4diX zzJlHu6yIvGV=8J&2R@0NZnyC;MaerEi7YExXyAkJme$tMAWj_+sEdHCFaVmVWv7cm z2|)p>1VmTbLfO$yZGOa&T*-I#G-m8jm8$89Mx_GiL7Xr=&%LoUW^%f=Io7 ze&J*_*3d%>-g0yEC^1GWpjruN&LOmD)g`%Bj&1vKUG3Q-XJic3%4MXTQ-_MFQBH@Z z&zVmpq9LAq8Yq6vx*WJ16Qbxsf8&)qhpN0^3)A%Ba}|Na(Qx1kLe%lzQ{ct*C<`E` z<+rE6YakoaV=cl_O&a4MLc9Xvy6XkxiIWPi7o^K9#@wkccq;93)N`eiXTC;RF`b_% z6{oTkcmb38I9*2reEwYA5xqJc{=D>D-hPgkFby!Cuu@i{iMq$Gm`tvz*uIbF@z#w6W z^5k=Xn@$7mO!4(6gb!ps?^?@-j&yY=jCOhwBU0;e;%K<;Il0nV3vj}Fv`@vld8*`96VNn4IEq)-+z^CfQd+t*Dn~jImIn_c8>h4+%65iR`{FnY)rL1q z!_0Heo1%`}oD0YDh4VV#1OizeCLz5-0t zQ!-~hIAGKS%#RT{$#+OAPs6YqH1djb@kdsnaF;kYxTZgx3n{`G&JP>z3Fn08(}PGi zI6q2+51b3Z_CT}mSg0lG;u#1orCqDvku`41yB40Q>Cz!;W_BJgqNa0G5pga@P~W=9ntFN|5Wit3&=^ppb7oJQWG3u=k#OO1*9U?+mx|$S~xXk zhSHx2G3_**qV{5oCM|tmwQ#;nS1L5vlS>K_#yk^J!n~v$-npMbcvf{{*+o#$GB4}o zOK<4Z%9XBtS%)o2t0CnbK2mCB&d|FpqWYo+Q7x8CjYT@;zS+>(Eh3-h9&h0UX%yFW zdkdpfukV`%ZJp)j$QrSnxIF8SW~++Ysc7o6(ZXr5UB8&SDLG8Tb#%ZMO*4zBb}2^N zMRiFToA-1H`yAy$FS zbYaMG9qLpxc>!&Uih~z|4vs?570z(s^ulXRo21Lh&YxnV%$$xXQ3KrV{CqaR=Pr<_ z%kj<&5ySh=OG4iT&x>j7hvy?es*d)|&xakuBhO1iccvJGr!y<`;%R71K9s1ydtL-X zS3NJfroWySO~+}^i(@z+_Mw}H;PaBuoIWejqNZ+sL=A5~ACitspAX5SPb>WTqR@=g za33)}4?jPeTq3Nv-4=Y1S}Ov6EE9*nKx}(OM5&|);%U47`LK2T{{oSWMO1U4!N>dcS!UhaUI-YdeY1n z$BS@H^rvQfCE9lp1HG(g*>Lm+UWscr9erd&3$!n@Mi#hWY)!{KA9AFXE*Qh=B|=;n zgAq0S7=4H)&Wu6GIx!4=cro1?y>#OFHhQU;T0p({VQyP;5cIi1`ly8YL;8Tjog#hU za_QLNf9C`8yGMqCcpMD9upURrz}JD^l0lHR%Vf}7x8I~6LdRoHR+Nsfr8fz0j5_c8 zAcssJjGS@>8rc1=nO*|HF$cX+!A_b!D3_1@XIZ zx*>FZCvkKwb3H5smjPbF_0ZZf4IoW>J;yU}S;Se%(uIT@+6|22$&(iwk(aU~K{?vb zSzN@>B(*FOaUIAM+0>k|H#k+jNw~2`q9Tu)GwBBBF?=50;KZV)Ky@VNbR+b58=}0O zZ{1FY@+D1r=G3>)Jf%~@r7#BDr)R<>D zmyA7xbeDW0Na(Eogpe>?`Us(_$$vr4p}ksi*v$jyTjQ?;r>*f+G~{an@rwpdT*Nq z>T`9I$s2jNIkD<+Z1a!_FaJ<~Hc$$1W5d%1d9Q&|!<^OxtvchwNo5Xv1-PgsV~lx% zq^Uz%GNvC|(rij0xa*JYb(Ykfd5DwDe&fvGvM@4x@=2Fh{R73r~l6C2TR*EKGUdds{B5cr_ zZ*o}6f@-C06uZrdWSfbV`k)is&~Ym{tnaVIVRgku)7ES8uJ4qU)Qit%5!SQ*TF{zP zY#+F8sc6nNEc)RyZ6_2PBO)cl_KQ**Pn=YFw)APoah*yI6Ic2kQ-HVJpMo8w8~~P! zfXB!pvuOD=g*zHCf_ib*yp-)uL^lbGVYriJaF(LC@`9+vM_&}WRQzVQsG^b)N`sy zs(fjZN*9`>%5$dUWIK^K5|sV?96OOHlGK_4#dQZzq^UWvXmF}}(+FcH5=9<0rwI+t zWB6>N!HGpFUv(tsbQAG7k)XVtZ{1EL@+IkQNuNq3GQ$g_%(lzBqkkB#jhLA9{h=x$ov~}uG5EE$S94Cy1wiAh` zIt&gxdNRSmHClV*TwiAhs6z;^}sl7%yk;vo?oJd?a z^*ND9QbtZBPOLhdNIYc1%RkhK1e5}tNbs~lP9&hzFeeg0t07J#oK}DnNk?oak`7ZR zl8%^8Bpqf`3ZZ?*cOvP~oq33q%$!I%G&BN1IP&m70T;`Oq{GOGq(k3{q{DE^Br*}( ziKIhwVkOd%&`~o039s!$(qZ64(&2Rr33VdzK^y6SR!&TuNIIgNNIFcMNC0de4~Qe# zW@4p2XyuR6Fmxj6FmNK_u)1QSY3sFk*LNc6FmWR3(A>LWv7tG|_JQk`iso#?q8~of zc0#c+B2q$#o-V64tUm2HP9zv>>DJCEwhn0hUPS@K#lAZE+iwziVj^T z5&>v6JuJPejtIAyVKxyB`@RKl?nKgI=0ws_pA$((Jx(MYrUo8SDj`lJ9SSFs4h<)g z4q7K-W{s@d1tRG(P1x&3J|~h6m#c^yi|gqg$}W&VCz1~KG{lL70eGEA*ux+v61>oG zBI(d~BIyWrBI$6Kpevt&P9z;FClb6+JCSsRIgxY(IgxZIoJczKoJcxUP9z;A|0#Mx zTvbjaohQ$UWK~xxv1UznlOsvlZO@q-NkpP^#+C34 zXd16HiPTq^;p0a*3x-}Isv?aVQ^J`roZ3bZGxQZvWy#!IL_vuLLtTH7Koa$OjD!)@ zSRo22Zp#Uxey@=*9?kqlLMhcDr&eA$34Py@P=1W8Ga414=|2+2lc|9rnk%0VNpSKZ zUL=tSuOvSbM`koVNrEsmd`bLh;oc0snylZS#K(e`M@b-7T%QsjF-@~} zb)oPqanN%4mN=d_z$e5*txm5HH#L`EhDS16x;!(0W_u_l$hvdvxss^}!oCW50GCLL?vi+w8no310SZY6ZM~u&bvlv4(K6>oXhl@zw&XZ?d>8H@UG| zA=8ydDd`v;7BAY9sdQpZwtGizdV4;bBO$?2OuO@Am0~H?=d!@{agpTT>2zkxwdub8 z{?t|_I1U9mWsXIGb?Y$1kB-MKnd{9uCe=dQM%{8%YJk@ENCBWbE}=cw9|+Ctq(PaY@A z=ChR@h4M*}JoI6xlDbo#Z%J!ZHclDQQf4TQ!&L^&*%Ou(a4c8X5>1wVYn9~y`jfl}&qi$%2Y1Da9I%IULq59d>Gk@yS(=?C9 zAlSHy2)CB%vu5ZRrc=35HZFbU3@sf7gbkg?bh2&kNTxy6#HlQjT)hrvx(R5{f^-Rb zH?|usHEK$Q<@cqzZed8ZL2bff($qOkyP%Csgob4hX%RG|XKL#*qwaHNi!Q}$Ytu&liV+!3+8x3SBz9t$>E@IWuHyi{~saFFHCK_M+ z45U|=<{3mWrq<~v)j*9?Nj#3WsU+4|O;eprTrE>g(OAQbBBgKU4;{QMm9;+2Qq8Qn zR;i>_w??U?9HvbMAn9q6;fSwHEwYGp-^t07Wf|u-)3|A#0ygp1)@#$2c|UeGP9>W- ztC7rJSSrUVBn88zd_KE7H<=o-ew1l&!U75w+spKHCRZq>T3frj*2Y->Wb1TX6L5ZC zORG0B#p&XBzL6=>nqM+S%YiI+)#sd zR$>qGw(5kfQ}sZn7=y!J78+)uQcm@Vd_y1WfSX`?R0c*%rh4F-$bJ9%@=O_}9jIAS zKj$ds5&0W+aYv3=DbDwVq+a$Kj_9ub52n zzN((;YnYxSlvUQjp)(FI--e}HR{@+PbwjsgP7*t@ip;AhXbyQ%S&vE9k%fWcZq_@` z`H}+LhYb4!ONbd@*|v0hk9Isx=6k6jAX~1T=P`42%B(;H{Hea!xdu+*rQCVr_WV2zZ-K`d0}MCnOt)-hc?Y@e-|b&RxZ45 z$_wp3pUv-uOW>pJKCX#eH~aFWz*-I6&;?8K58Pv_1fRe(Wfrqx0b zldK~PL!~jUv7Hib3mtB^g$}G?I!$a|X6M<9!GPQOcWMB$4yOiq`r4MuAsFZiTnsQh z>z|q`mMXc)!h7@Csr=N~%sx1pkzzj@dO9l?((BT2oKV5FBkokHlPq!A84Jhzy)z|{ zwo_w!{gl|;@Y~J;=xK8t9t+aRvl3F1YbAaxzMZitJ@F@VEGJ`HA4?7@6KRUEE{EfOV~Og*4|zE_01c!?Y8BIcN)n0e#6S=K|Ly z%tN94#c)>(m4_JgY>{ws3_}}iY}?&UjIu)QP6n9GxR}XsX#U+Tnw}3QBq*&Chqgc3 zjbN=-IzVwc1I&{NMVTcJd&VukIO0HOdb_q zfc#lmZ^_XsV|A0LP8ar$7pHQC>DbKV#>Vn9m40@ZR~pCI+b4XeBT{1#otfX9EyHob zOhgbxDgtM!GHOdypq0iZtCP`zhGvxKFG@-pk>)McLMfj`43$c5dMuwB-iR3Olerlj zd@@wsHdQE7ymm3yS60>#HXn`RxS~!Ll{Ys&p5j8n76>(>nUbf4r$^B_o{YEC?7DVZ z`=(TfHP2PBq(kavqh|Y?Ej7t0)LIPF1`uRay(@cTzqKbsY{sU|Bd@H?&800^mPTeb z9Yni~^ zi}bOlNDU^A9$;X7YA{cyqph;>8f4UCkU+$ICUtxR40$ft`SXx7mnv4tL7bV8vN*&r zFiqRQ>X0|Eg0_NFBj97mvyCBTJLyu5Buc&*t2(hCaE$iHsFXv@mj}}s#)Ux0Pe&qj zWw2c?Llw3yzr8S>F7KNj!%8Yf8^dsBq|?ddizOHjh9--9Qp3F8(mH4i1J@w!hr}Px zg@X(`JWJ=avM?fgA@-nm1hA3aT`19J!{Jfn!IZaz&bK7v_)G%#VjWj4A@1*PvugCUhsW7q_Q+1OZz*bsITWSo& zA#Bx-q!^iHbngaP)+VQwU2SSwS=H$5p`UD7N2B}LWIi`tok{t2@RtM6uB1X@(gn0q zN(Q>H)UPdT`K|~=<-(XZtTpbCsBw}EM{|hqVCnVd9;EP2F90}diW7ihcCu@0=ODiZ zQt6btT!>jSVnN(!h(;6-8YDa^^J0tY;Jrw&9im+;)s;Z-@MAwcC?**p{o227buC*- zW8(knU=E&NB4-;79nwW42 z&2tr9uQl`|QHqHn^=gV8Se-(<<+^#e-bySpZCql>@|1e4vhuvhValrxGqIEd7yDrx zXmw+A%YtUFIJZpbiIthktX&CnsVr+V5k6wfZRtn#pN&dgQ#BT4R?5>J!Qsu?;mE}b z5dwbz(OOSQ$-@AmhFF*rgnr8i$fc3gu)NhG0gLo-x>_lAW4SFQ45FMTQO=r6R)LEV zQB}naX{`4gm)_}^IM@a;+u(=eL%9WMJU@}EPFA=l1jTtBFYp+rk^TeL0A*n$Y5Qwp zjf$WENA+wkV!&d$9d|@f5~A}6g&8sH9QV2>3mEl=Fyb-GbKuxV1|rl(Uo}@6cR5y~ zR($qmeOo2VAm(Gmefd(hIFX$wOk-J>BxAItaEU~n-pW-EPGs1PFeQYOzzaJ+-pwl${jeh z*<&ZKp1PI0@zgFo@|dTg;FN8<*;BmnW>4|f%MDIczolYzhJ5MfZ0wxIx$juI@@yKV z@w=x-2$>QDR$ctHQLtJ8+OW7G)<|4;tXfMFPd&~o89enkvwG)Kk29-dKJ_?5fZ|iO z4an~J)GIdG6Q6>tSa78%RXXRRF{)h7oHNK>+gU9<1^4Nh|zpxz8fJ z82Rc=Idl;RrscZ)I{L|E4I=Qnbia#fFluUzn+C@8(mnkC2|IV zM>WNI<)`x?w6GOPo{k`DMA%5|)SE;cHFl(tmmY$j!Q0BVGyzsdvh~7x-Lj%X-^hbV zIuPqy9|s23D?^*(=*a zvB2#^A&`c6WQC{Z0Is9P8o>w?11W!Yva}56Irxina8mhcb9Qq7U7I0-@2p3D&pIk0 zM5jh=^2&sl6KyfrT%!FEC3sF(E2M!|c9aSel~isf2QQvf3hO#T9m^y5(@cItbt=VN zjc~RejO*AmUQv3eVqu;y>e#5vO-Ubb?+o^HjMILG?qU^Vx|!1yRyUYZGEvA+jt}Eh zKw3-E-FwxYuEQ?RYJPL)FeNH|n6Ok)DDS|U7`X~qu0i-ehA|yy`US3{U`HAHf(e{1 z!xn{FThpu3TgW!Ty9#g5V^LLBNorM!TUI6}bKA>U)X`tzYa4;s=d*;!6NhWu#AFpY zvb>*l1AlQBYSJ<}zM<1FbEy!Ry@koVbWl)hm_g1jW)v(Z6AP;ZQPT8JcJfOL{$eRg z=|$m5icq4~J_ArRO2va^?uryrtmedmxY5W&6b~9CJSiJsY|l^AiJbYN{4M?Pp-0Ci zJcD#rNTGAArAC0YJ6bT`H-$NNYM2Txs=9&6J651_Kbj##2hqm0QthTLemp%sjuVS$ zGiQWr7Tlt+;fU5+vE!zc;;~>D``tUL)4Mnenhg>~&bnq~fEU%Kamx5w*cix})p8(+ zDhQClN`NTDAVS*S1Cf+8>&45?=2E3W8S_x8Cubf~=2`Q|IUk%gkCwuy%unE zcJqMlI(-8SMHF!Bu&Lz}vTb)}!N^PE@4P%aEd22n}a!os)^PK8`c32=JO>J zRkYsOxu{J_R&%Too^kb$HI(KcV)|(mZCPNy-%4e%pe zm`P&>VT6lg#Yu9pg`*!ClrZQ~d$z_XOM^G)n1j%x1_)PQ>?9z^$e0XB{MZ~2H|jpy zHL^Jwr~9ZhmB{ssWR$SOq5&b@WgDkZ;lfPiu@8b3))HOOBQ!cHVZUPM$x7jwX7;(r zf@@UMM~3YbHOjnE>GGz})^MW+5fraATi5I{90;<`#LO&J4qP|J;;Fw1?W*@wcznZS zo7Y;YBPKjZ3Uw}y+@K$XYdT^!S zM7t}n$x3RgQ1N)0R^%=NuKj%nOWL9oVo>3-XQhw1+@{{{cEl9ZGox4?avd6*BWY&F z;$>h~RkU_x?;6YOrFeN%?-kXApP7-!7-9iP9HunNm}=;pM(B9@$$jX^nSM5aJ+6Dh zM1k3!Eko}}IlsQR2PT$Hm149GJ(QNVa*y3JhK{PB5Y-pC)Km|Rc$%h%NTkkWn{om$ z4RquH?5ND!+Uky6SxjSka+Tb0kw%l~3Pj=Y8r%UHVNDxR%^iD<5Q02Cn&csdVZ-DH ztw6?7b!>x5j<&HAlW6ZZ);T3vS|KO0CQjMBH)7ukvMygrAIxN)haRhE3A`}14M*Ht zlR#|KiaZGuou6F-U8CYiaW@@`mXZVIiEwHx1V@)mjz-S{I)Ld)4`L_lF36LYAa!dT za|E$1v|SSg9=3#PmjHPbA`YYlADz>rSXjp*KPL8?8@sKz8yrc0EnWngB{aVNm!2MH z4wJl}*S5={OnK8HO5FIJ(x3Qw!(5V596U>ux|nMq*VUonwBXg;+>=#H30ICxpumNW za#>-1Amc*GH``%MTUvb^jIl{N&w_>3F<_&U@ae|V$&!Uwgl2<- zY}r5*QFPY)fgP8k5pV=W&BjX(A7!Ahpr>-Xa3Cp#kmRAm#C#RADaXV1lTa+vh}E_f`>!C4I5c>F6i*g zTcG(pbwvH~Sxq&HLg?TjLWy&$`0*reZO{EHME4uw?)^eJKs`vpVl-j-ffHp?;Lh1Vc+hcQ#6E4_Ji(bYB)>RdIrsI3t7gu0mSp#GwnT z5L7?KY3?sAOBGYO0#3uRCZNHkD@=KH)=WU!Tsk8cDCRhQjUCqY%cYh3o^AjU4Tf9WQ=&(@ zI-tk3De|+lHs#BRSP6#?+axUy%&Aywzg}-}7^?dD*29@x34s~yEkl~E7-fvG#w;=j zqu|__z=tw*vC^=i!sSy{eOx;0xLRJ1xRZRDMQqzedI&R%~n}j!p(<7Y>Qlrz|`w#?`!Em&O=qOAsNj zlV!s&0FD?AJiO9OaRzz~i`t-fVvH=T;tWm^X9rCO$N!++au#XXLs#6vB&1ElRy4e0 zfj$|jp-@e+h5;5QO2{3?#$X;}M2K-|MP6oO(DQQ*jj=MJmO>VPV=J|L?p$He?6VuZ z3~P?G2t>w0`B_OCg{+`14(V#gtl%AJSLkVK@ZVtPqDqEHsYYfjZ<7$EbBm>QisCa> zTE$Spu^l^nHB)DTS(zS zHw#w6&{@|^IiTaStg?Vea$kN=Ux#MU5A*)|VsTe)2dZKdKD3XT@F6=K$Fkf=%7c1g zbqpy>f0jt!209&**)$nP!|9osNjMLY+pqNH4Vu`Ibw_4OmIy43q&RR=T7CgENpy3d z>BQhi)Kts;h&m!_Ub*%;7N&I&sq}kFjA`0NYxw>$(AC!cm>Sx)hhM31Yn?CTK{j`` zaS?^B-AjvY98fqpq|qDklD%J z!^NQr=2F-puh-6K?1F-3>4Wg_H=p23RjI3hBLZN8aA|i^5%Q>pjY!#2ta!rSK3M8v zqk0_K+M67NnQE%afzW^IDm$42TEfv|lNTIcMIf!R3#jvx_4(%kf}0)PhWX?~9)8$k z`4mDUXDOIxHa7`>0(W%ee&H3tjd{|f$I1}r2pbiDx2!l|&QIw}7TA28e4RCicv?fE z898NK;Pw`a@ZHB^mOcq)ZDJ(Ilm>f~0WS9ZUlfxxi!@J21o* z$!;%2z!B-^1%Lo48+bpIIILtnj=9N6LalF5SI4byAbfyb(j3TO9cLk)TIYL$s!%S& zV{@2CdQp}Jj&|h4rm%m)bPoo1@^*$a(27mqSbAouQh@4`6`>%+AsL0{-8ObI(%X~I z?aCq+U22r}tE6>Ds@P7ZY_yaRFGq%JxC58%9CD@(->}i#WHnz- zktLmWriPzcVW%w^)pxeCQTa);!=MjjRS$IitsJuH1IrgVA~?uL7z(v^;+gki5rH3EgltjO zAEKy{T3HT1#KM)7(Y`D{W{mnU4Mk}sTE=G1;i6+(k)8svg_%iR$gz|uCml9r)pTih zv(GT&rB9Vh*(gp-I9r!yr~@_@P0S#g^+!Bb8DbEa+>_f^9xm-$pR*6h43C0B0}o%Rr5qTaG;HJYA>ZhzVVQB$ zvxdR*V3*^tVbKgKtgAFVYM85L$UQdgxejPHJ0q6Lk!cYjlnRj{v@#wt24~G~ainge zMHwTQ?nKHDvCWT&<#GoBW-&9v#fK)H{-9Sjrl6(NSnbIW(&sawZn!A3&E#e(J2hVD zfSwKpPvTBPU99!dS>A;)t8FUtb6t8%zcsq(A5%+=*P*g$KUF^lh%Qyz;%Hh#pkL-4Sn*pr{kVULGi)-9|m0#vwC z)902S!AZ8Es2D?($A$=)_Nku@N)B>hd}5?EeTFoW99j4>@ILEQl+Bkq5itYy5FldV zq7aN{z6aIA01Nuc+C+Hr^@bx6B1!qQlhkR3jY?SW%u`g5)o*OdO^+9+XzHysR8cdK zJ=G={G_20t!1`^c?Zl@tGut^wawfBZK1Z^`3tXoY2}X|ybM5TzsOQ;d^;*WdD#KhK>T%9yJ;yu0t@9)=_J2bc0&s0%9<_ zvHYI$=Ov=I!DeKMW8qjl+oWNVLe;vw}z zmaaZLHbXjxWiK^v{vbfIR0jcTx@j;;mh6uh9=2z9z@DSxtTS~?hG!26lMy-q)g)!I z5jiw=O-l}p9PP;zT$5$-F{6~Eq;v4vmbGFC+fkUn>VVlvEd zXV)=v+^)imckTOR>?d}*(J@U$@(~bP#BIyYzvox3<7iF*Q#TXWE&Q5>b-Pm*P}m z&dpn~>YPQ){n)PW9O+4R>|S;tYwUSpQdE!4%lxy#4^e?`#McnLv8Y7c{5lLRT<6{c zuYB6@%Ew$Jr@1bI^(utwrKph=$a8iE2kul-Bg!!UfE%xtSa>ZgSzrS{yHB;YwY9eO ztY3G{z%}V~N+={0Ov`yh0P7+VQBDeqem~C+<}U98TT@vC_sVZCB6J1w%)r5_UDiQ0 z){Ax~1{G*R`~XsIVMfSF>fX>*Vy}J+Yoy_e7vJ1^Ji!&6_MU_&i>oBbM40dJL zi6G_TJ?2~lQJffu(Gx&xv7?_JkTC!%F1vqk5mC@tkUxP`o`hYQL9^ML^_0!_W)Rzu zy;{3=?X`SEmv~?GqZRkyXse<8E&cJ%w-U8e+|z@;r(2qyW1W@7Xd&a{+9!c!H*o#G zf}o##JA&w4S??BabZSrW5-nD8lQb=@=QL#$GPG*RvgdsJ`JiVtB5^0 z9G9(eY!cvk_S6c~#(qmz^6E*HNN=%3BZOvJYgtjU9&)agI0ti^u)xGlwq**1PO0E< z4#sJnr6Lp7NfR|!Z<^#TWqNF(G;E6k%OmJJpY!Q3je?@C$cd|iCZ%*&zB-eh-iPrn z));~UQ=YfDXGe}aMm0k1qGJ(9^l=ZgAmQp z1oa~`%MkvY6D@f`rwOIc4(?|kup&Y;3tC#6s;K>0;l(XHy;GY5Fg2~30hm;$7#Z0S z21+4@IS`>eG>YG3(O4XzAo3n=ize%mr?AYI5Cd}0h{!gnUd0GNjT)^3Sl*0rlRQo0 zmXZ|}vnRi;y4~u7Y$5b?J>a>Y4J`2#WY&ksrfMavzYVy~vpzg2&xZxQafQc1a_ZL_ zU$9^egFIk_F&FOsX19-u`u=X&EinVbR*73u5Avi@J;&JX1-u7+ZL{N zEAyhxN7ii~xXU}mnlp)D$#Tw675>bgehnQfGlbfB=0kyZ=OWW(;UAG_e3;Wy@T4)a zXmFxI#h<<@k~55?zUV@IcCHh$@O`XaoaD5nS%cbq2zWSKOk(s)OiG#+7t)}2_ukiCVwfREuFfd zn1M%Gy-EBb=Ix>%HB)wLM4`(#^k}0dT9kU6Xp=JYM%pXMjIB9R+Ogu6vUr!0gSat6 zJp}5iz#+aurCljP!k!c zw+}-#I9Ez3w3e-dxtY?Iwv)!we8}xd&fM@ob+S^JnauCak4Fv$WQ;i3{8>!(;Ph&E z{lTGN#yS)Z>9PYCzl^9^b-3^7Ypym29 z$2@2{!^|-kdVRdB(jp@Y>(|3vh7{K4f)-NMvOUKY5apoLu;g`jGkKPJgNjj?l%h?t zE&XP36?B-2wH_XrJx0myvXp&}Hdh+7RAm(h)pU!e6>xD6CZqW-IJIE!n_kBN9g2t9 z+FQoXk?9!Q(%1$RzN)jgJX4KJql<68&StxZ*R08IYQvt3{>jPw_S_`QAb6+WXKs}e3Arr`)*7*ChBSEsO8Wxz%Z#86H)6o;x~J9uaV z%K#q@#cFBHpgv;Yh4P{0LdzsU3(`&tmEYOss{G;1#$LO|mAwd0 zOb^yhj)cvZo|JNrIwg`&y|$_PC0K65w{xPhS@BdX8&@>EoorBMWXER{iYP)8jPSH+ z-xu~8+bKu26xw8>jp0t)(_;)5i-;1wPwWSx_F6VzBPMbvM&F`YXQ69vyRCw6<%)vy^P9sZe}&hN=i z=BKw;b~sp3zmA|eM$tXp4B3w&aNT<@SW_fE+>b+OK*F)LhE5O=MN1D-*!-45!0v5D z1SG(gPbwxIK$#936FsGum)($^RnIetkDBvfPw+5+DFju?!ev}+EMuGnzml|)elaNU zQ8tTMLu`C@6n^k4NzBg}V#5~3d}8T)8bSfVVY9`FEat@9o!Rm~4xv%1PP6@M-sTbT zJcNn}6W}G{f9#|onpips-D}wHvpho)Ye)>n)85=KY`J$ocgwT=&R5R%tAMQYmmP7G zL_9UaLLF!^hdi4?yg|ywS9kX|j83O% zLkIUg_IrPiz~6PUmZzn3+6ewe&EH)HV!=Hs-VgUjwsH>QZ{+rKR~xq<`6X#jU2k!2 z`?T{V;`~geIwn@P(FI`kyOaI0zwGBp*DLwFee8;D6Jui*hJ2oEOXk`xn@EZm_Vdda z9r?SXZT0H>s_|8;w=qcT`Q;N67D?Ch3H5WH5j(xTQ&XwVb~hOpP5eM|1cuaHm-lxf zJHg8~k=>pvP?Qj+VWkt<^0f7$?77LJ0?Mq+6IrfGWhcg_E0c*cF1>Vx>uO)setE|g zZL2y~xgM`*6F=K8yIj1v`3z2J<#?fV1EK)Xv0^t2P{4|n#cewiK`(jy3)Smk7RD$1 ztqAg?0#Zk}QDJN@O!rbrsNVM>d?>n}jT1e&eJU7keW%UcDu`huQ${44Aw(XT%vXxj zNKg&9_}y-h=mcBhjS=X?dCCe^5Z;oxeAV# zdUtVZDx^4h6gD~HlvTv+{oV*pG^qx2hG13F67qmzivUr+re(c|(j<`Z0&>UyRHnu2 zPEYO}OP)%4vasdsO$lmg4@!UlS3D)G(^EhRi&s=i$i*pG&fc&SX)uP4hloUfG@QM4{Hpu z#+b|8V@!Kn+p1L&>TebL4dE7yqA1EbCfH5g}TqrmZ)3;%4%UMB;gT=vsi! zie-a0d*SZJ^V7~uBtC%;U8ms_1UCZ$M*y?>RSYa~t_yB2e~9l+e9l;!NW2Fhx>WR@ z!n+y3^ekgw3Cfb4u1)V9c>ddfIU?W|y5Q{mUX16*0dvmTxWUzo52MG+ua`Z<7m;ZP zOj^J-;dg48zx;^(YXGy=0jHuj4w#AqE{NWxpm&>q!7aN~^zH-Pmm}y={tj!>djfFJ zM9_N^==~Tl3tr86qjIt9!!GA_c)kQMqY-dR0C%&1;S|;NF$uU^9rS|AuN6c-0GK}% zaAEa(1TaS<=#gChNWet#_Y=Uq5J8XRvgsU)692EN-_rnhu7Fj^AC>b3fGG$#Dfa>L zd^ce3ji6Tsy*~oXo0fClRPFKtydDHhQNXF>pbEHsfcdvTdUpGLBj8q`v$&c%3|z9_ zJpC25kLv+*mw*e)@1FwZVF4%0ue=x0<8mww`Xc#zQozWE3)&JZ8Ca`i@SS*h6mSb) z!=b33Of73m1;L#Um>vzdEr7Yh3s-WnmpC8k+yj{V1>7PlT@M@;?=gZo4;=sJ2)H)@?t_5&T>&S{ z&yz0Y<1Ya7H7}eeA1eX(eZZVW1%xXsALjw)t!}u$e6#~*RRkR6BL$cn1YB4?W&m@C z7tWK9KG3@dFy9w&JRhmR`gjg7FS+0#f1dKA@v-@}kZXMCQt?OmSOJ)K2f{H__C>13 zpn$QSrk15rE5~;1DzECa9wiQe@hu*>1au0hHkbCM``7pP4)hNVq=&oLUU^Y=V5mDg zn%Q)9`xR|%7X`fUAI@w_4{zL*?a6eF^kvs)MlV}UfDJy+hay->Mf+ay*j^HVo) zi-Gv}uC|r!oh#dK*j?UMEliHz06uRRo0$=B6*h+}6YoB|39Wf?;+(`A5>Hp4(un^9 zg|SkxT%4$^c-yA8uhD!suk?LBS7`&Dt9Qf*qOODJA zw0!Zzi4(WK{)wxezWuego_5v#mh!8c56>>DJ$}x2v$LZMZ@RwrPd7etcoBe39PV96 zu-V$<{3+>(7~>UC6@mBp$}!2-f^h1y!Oin5{cK`_x{85{l%}J-JJMoOKsrg=3mw_KWjdY zd?cRu&8yCNdT7+jdf^B?nO$^OX6Yp_f$iDbTC$u;2ytSBu|~rLXR-}g68s87& zvnVlx?_1b2WMSut9k@-5-%HCf&zGFv@5yZ;PLN6Jf@p9iUPegQf^ebwR2ldK*xN2nf#W^a7(@ywwFD+AR1orjj*`8#OG zc-DlXy`p=|(mU4TH!mX;KQVISQ|#x^(5O`}|8c!2&(UjZM{B=euTNB;I#E4pK^&hQ zIr>E^-`e39e)yN{=1A?47k!LAQkG;qGsNYucH^V7nI9Am5zj-jBR{_6 z_-yrAmI^Dc%B=@8KNvjN-8LjD@W_EjmmGL5Q90wla|^21tseM(WzB(K*^*d#=L5fl z_;+ui(tkYj{iY#C~0))+t}SM+>Nojg98sfhnvKcbbaI_wc*y5gI!B%>mKOfRa{&5vbaMtPb3&D z^}2a{mZKZAXun0?U4pwBK8q66cB!qhuEyO?uN~cdFWw|N9&@zNmuB}L-+9B~#q@&L z%WE@u*PBfGl;-yH6K+P_2xKXJIWCf##fj0{EiGW@ z&6^K=^F;0N@ud&-F07tcTU7hTiDme4Tg%4k>GUgm(}|lGW^a0g@M$u_FP`>#{8-Ey z0&becE9+lBdx^2(=b4tK(c1HsGj}eta@v9sksA9l!0@aAZgg|)rP?0i>EfXSUprBI zg!6Q+`&78jtAHP@ z9F{~?3-wmKTF${8uND}s9M#f_U;N@lvjaaCCpr!xlXS7+8vj|9;r}{(7AI=yg^V!{ zgGb`J7XKMz3#|gfSXE74(YvMc`ppM#YnxblK@Ykyne_v=ZAny*XGhTlsl&Az*-ek| z#>qNN-Vt65%2|AtC$7Xd7m*C^c!z`=#u@#$};E@hwwg|rg^;2UV%H_ zXRpE?@0HWI<2^8BsFrD|jV!74ql0NVm}wcD9a+M-xbfi@HdCAca6m^mG0>6UKBG!=ksMUtwyka)u zj#tMn-0|vg38+fDbR_zhHOPOJaOYt6k2i(E^TfPeta1JBczX?i?); zlqu1_#K(~%dh=!Wh+2eQF;?vb<&X1C`Lp=Gf5+6Xwsar6X7r<-ckb)C=Z1f8ebb+O zpSW%3Z=89@8(Xjc^RFE{_Wb>~RfbPH@w@ll_O-{e=brz}-(U0FyRQ9Q>e(xw z`OdxX+V~gOy#Ka;_?-p+y!THYIkNTi!u1DV{h{`@A09k@fAM3@f0fDp>(>8#`^R>i zebXDi`?1&E{FM*9@Pic}zUiL3{&Dj8XZpVS$CU;_m+n*|D7XS|90!Mi@yIG z58nSTcfM5Fbm@ogANb(^{=moo>btjI_03&xDL;I4$0c8V_`Zov9~gbzvq!(Q?QV;| zKRWBYyU!gQzi{L7D}VBnKkNBj@BdGJ=YKl-z3=sX^-phm;Jb-``20g(FMs9q z-~D9g@=tyFf}ia9(8%Cj_x*7Cv7cT02Uzbk&&FsTlAH4R7*EJ>n^z19Yc6aLn>So!6b}}`yvM~O1 z<+LX1Nt+X?iF~fIvaRjzrl$AtC(d;;l9A@7p9yUHpL30jM6bE&)Ambo=Un$94X(NA zPJ9z|w$Rhd@0>6soy|>msI(u=)MZdYJ z6L$ptk+*zu`ZRXuOlvXTG&enk@6+)a9eF!CRm!WA4)vGKO;mKm+2)UbaLHmH9l~yI zBGrd-c*o}LFA9DfYX)a980x&N7I(Uj&Y28msesv5-SQ1T9ctRmO-?#z`skd+V61WU z2fHsn+fV0JK00Ul=nyB(O_V3PR(4(TYkoS!iJPCLJ~~JqFmJ*)<^9sW5=h$h#n-rK zI?~)kqY%NIxOy8V++G;cjhmaO1n7GD$J_tQ&(Ctaar1MIj~|kn=B8Hq#^>n8tFnGN zq^G#)oa>`=9)ltIqU*hXRGaYAq2AL?=R6-BQmdMqNWSQLAcoQ z=k*MR%8+PvuKh6Nhsm>p&KrDmUhktrYe&sZr2SIfPWy-Tzx3Ay)n;?k1^A{EPXExo ze=O2+tS`~q<|djI6P;iG^MCs*Ck$_=D;Nw*5qEp;{meHm@bPmYgCTjQe2x8&<2U>B zbrFMcwu=iH9Xw`O^goeU!DK3tAc^Fc^@MnJKWP)cmrAUS;>mgP$*g#?SU&lJcyg9} z@_q5-_43JCP5jXX^2r+UY^Zpv&lZ$;% z*7%;>D4x7g()kDR-u#dvD>*!yq0?{fstug{CrIacfX4IR|t`thND zjA!wh=5g$Jit1;9QB7>m^i5VLFaq%b4)$2FoshbY(*$Dcx zf)0bB2Z?6|9sa~g=Ph{aro%NE!g?Fj3gU;s(1XMu;R#*#lS@gh5Z8hPU*F_E-->_D zO*BIBGNGr|T^F!OqzT52^)@_dZlZCPN|Rp})-HiXFu-!G&AuH^nwu`dcN0FVN53p| z3H(UhCpaV+D=ofq{ti5`N4?)p{Na{jYT!y z+(hFe!S?Nb8Wt=I>$D|!go{gsbB!27wI~e>*2a2=z#meFBSM+*s7Anwx@4;|~ND!ML&78CGyfA+$1i8$!k!(6e?CxB!H_t7Elo!xR`$*0vjsXQ z5<62txGmC*L0dN|)YF>wNKlI(?c+n)3HRpbjnd9l^Yd0s58Onck`X$abaEfO2>6+c zQD=4HNHr8QE3IswPH~AEM<|kv0eCjMg>BvihgrCN?4rFl*H-hTec2ftrOK^=@ON-M zoG9gQsphB0_TlkBWiMo)P{CKWT&PsVqwzd;niThWo(iYrY;h0U<3qSqzXFFBDt>e$ z2$_c_J@V6}r*zPwz+rXi_+2h+pUzDt)?~4Pp|~g8?c6DiCc@(ATJL6Ng5FLS_rUaq zlYRGP$CxBK5BwBoz_a3O^x2)*#LgSanpT`3i_&HVl^UI5V#7DFvv1j?S|R%kC_8}| zuf9Xx?K4YRDPQDs>M5$uvf;6voIrx~4(}4D85{?Lx0t+*Qb@I?=CWyZ7#8n~>J#rpMv= z)q!U;v)Wyn!d-sH4*s~+VED^stJ8Z5)8iA>=`jeZ0ctC8qvl-c#=v(bKd)7972P~kJXFu@ZkxgIjh5!Mz%9egL?C z7qB#?4}v3`#LIwbefFnMF;KGCxudQR?W zt5JC+sz6*S{@#ywe*&0G$+(4!>^DLD5xs7}>=$sdoE__5gntm94+3U6nZ0ni%g^TT z3cTwD%(VszkdSE($x%1$>0Bj*Ovq4EmVQH&cG+A{N9b{cLC;c0jDazk3*0aK)8PW zDx$`HYgP2#1)>Eaj7vo?jd#BXn12>NN^GF?x*r2IYtn4b$cRes4T zy?hPE1$^jIrTcljI{=tfDS}eV6*aS4Q`moq4_)r|Ys=|9c=w|e+9g#WF6uXfa9@s~N8{yT z!2FE^PDSqrfI04f3zC-t==}mPW8IuPcl+4OAL5(J?^A$zP{66m?<~MQBVa6K6@Nbg z+zSF$Reo6zY3fNNZpMc$nQlP&-3FLn6>wqn?g7jT0&XE_s`$GggYgX?x>WQ?F0TO0 zdmL~odTRl*#Q_&oAC$js0*2D1OGPgaxM~Ewvw?p*U_K(?7KG6IG+@3EL67+Rih#i_ zyHxx=1h{WU&?El-4lu_ATo`|}HDnn+bgAlt=)Ddwmk78pdTRi)F@jzz=v@bx{a$*W ze)7G5yBjcPQb&kO%9RK1V!Z1B%&35q`~|@61kAw*xHo~`y@2^E0Y~M+>cc~i)VZ$$ z<|P3q+fe}Ac~D~dNRh!62A2oS$2H(S514<{fNSc9zJ^a!x*Gv=dj#AP5c#Bl;S|;F z=(B+PqJUM&)tMmj2w=Y9fK$o+QNTRwfD3Bpr-9zT3z#VWUI5(UbsS2?AN9{?17@Xw zQ`H+(?8JJ&>=$qvm9$@Yla8gbK`rStX^OS&7@wW-|z6Y2#8enm$(j5hXEr9ux z^&IYW{0oxjf5r2bfkfi};zQRWe1hO!jpywf2*SRC;NFVY-5PMD9`4kDqw@Pq5L`g{ zeGYIB30PJ6EeE}?0p|M-xS)JcH9QBHj*Ym%CF{-8&KKidpMYV2_+s<|_}c)un*^+i zKPvwnfSGo{sp#zm%!eFsLG5D-^nML6Cj^|ke%*S>RfCWjeCSfiJ<;0@n12*-Ve~Gz z7V!!2p-V-N>UXPvVSxBj3ibm|tGrhI1AULYGD{e-AiVt0~-aK)MsDJt7&F~<_hc1~958SKq?(oe7 zVP7m=4;;~Z`exX=@S#gZkKmefut(uTmkRD&ynB~`VSxAw%I`8f?*iN=0jsJvf|~%$ zZUHCL<^F?K63kEaV}SXRfNSFE9&&op67U=Fc?>W=6mT+K4?TkWzkoS=8(~@f8sa)R zJca2w!Mz?ZmkYQsde;DEyMPPh?-sxu6mSbbKd9cQT<#SxxMf!m9M#+B0QY49t17=0 zfcrbZ{HK5mP zb(er4dUUaJrhM?9?3?83I>6-wtSlD~J(8DQfVo}3ord4GT-kB*2<~%$c}&2`@?-RD zII6d&0rQ-I6Y2Wmw^2I(0hkvf;HVuf*nxQpK6I(lCH|6t>5YIR{Ur+`!OM|OY; zVD?AQBmV9N%zY7X#NR`J`RfQc;_o@Yyd>aM{GA23<^t@K_|PTWho?S>zm9D%eH1Xi9|1@FeF-pM6L2d2&Ia6H1LmIv+(P^g>es0JUNxCWyaOM)!uWd+U^aQ- zJaX_3(3k+sM+97$9Q-C={?HBQlLL~|F97Dt0#3yr<>T9c`PT?ID(5B`r_Ln<6)qJ$ zD(ANY<_ZC)Dre%a8!+o5=n;Q61LoEUIO6XkfcbO;9P#%6V2%hl6@O;|?mK|_zJLpp z)Bgg@Yo~#LOI0q!-@5>l_QHAOpbc;%fVoq^g~`E(0rM$0oKFrYAD;!xp9{FKd^`o1 z;{r~V52}xaMcBabp-aMf^6@Ub>jX?rz=h>w7hrzH4d=@T$;+L9`BecY)AjWC#NY1# z<|`U--vP|OdEq?ycqip?2K^d7bcN+(HDK1d;e7cZ{bdtiHb=lwK5~HBFW|!RdpBV2 zi-05fdk8Rp?S=E?w;gcL0p@kL;09M%ep><4>4x*=m+I|3faw!(VfnZoFna>w7%S|n z1>ZFRV?AZ@c9|SlPq=@@M}y!TyY2{j1ql8x51bX3*BR2bS}lyPMBrIZP+Q02|IbD7 z-CRy)JCXsJ-acLkd_Gp%H&Y3G1J}}0;EUY&?%Yf;wV@r8d+;tGea-N~zmDp?F45TV z!j4mm>IyK-L(g4JZkwfd99(Ow>#Jo8}s;sZbU!R*?XZ+zrA zdW{&Erz29`jqFFqp&K8eW_>=|=<>wtaJPWnkt@_`>@Fpr@$~c)qG5y6r3DmDm%2hu zmr+}S@Vl9o*_In0!OxuwPE=c-1waB};%;Q|B;UbUAkcv&?|+Hq^n4&3c^LZ$eQ{gcGrfxS$4M?cQ<2L<`I%Vz@DMhSoCQgKG7N3R|I+9yRi1RHI$iF zd}kKV_ovH6SY!&Y$ZD$gV)HNUSkKSs#(MVVCDvocaF z1!-vsR(s?}dGGa9!qp~`F=U12BL8AP=y$cgd?|2dEh(O&uwDZsKpq4p4csR9% zc;ID}Iey@fh*?Y2QVSC&s!I-b6Ws+OF!+H-m)DNod1C1up8=K#c=!rb zdBkNF`jc8258!tltIa_$@=iQko}fO8-`$J5cd=*p;jV+-J%+n>c6U_1eF1kA2YGqo zYJBs%+i{m+&+f!`C%dc3ySwGx!GXVLy~DwQAB+FT*ne--F>%9!eGVb~?B?43mcza1pRw-JOSp*xw=Z8->syBYx3r+P z=D>@~%CB3xZ1Io5@RBA6$@a6r-MO(Y`MCBbk z((}QM3#n;wpiIl*zD}f*puqE~&e^`s+1nQWbTPu&vxkqnM39H=rX=nITRaXkmow@~ zZeg`Sy(1rVXt{rivA=UQHBOcw#u&s-)eX127$lk*2^!08VRw`i7XeD@Ul=2o;ZBM` z14`6ecU;QW z%ex%zt_Q|)7A-hX@^&Kj{;_C5Jm%|_Y(abtQsE*=sty-PT9M!)xdwMXVqEv&&O{_B z7CX+VIM}xkkEV;n2L7m%@d(`x`u4#9|*QOW|ICx%CB{=Wv_{ zipOypD2xqOex3cAvroFo?vj3sB}m;p7nT(6c(yXQ3(uB6=CUeV--*svfF4v=jp|Z6)(EekagYdKYpr zf!OR^LA}!9UXn>D0W0Vq?~9JiZdih`f9csx6VM1IX4A{QNYvASrKGOi3}|}5p)*fm zz&ebd9(~Srlm+Xn?)6l|RY2jYKo{<&SwWKn4ZnLY?znJ%Lc%?YJKnQ=3wOL~eu6vR zrcgY5zBTY_D8GN~Cn4Vnc!!}38h8%4W4aO?(kRXzw! z`{2Mmwf#$GGY`}<%LZqw4~mj(na$uWo`2!M{y#{FTB|JGNlSgCU*E&vPE;SPEk<6i zt$h=*{15Cuw(MZ$=!xpHOS>~i0W)Z8E+fYd{9;+@oj44ptM<_Qf5B#{%WM5FA9(oU zOCI7=)TJLh0@9nTsY1)rWdrvd95}?K^Ul=a&~l?dlYmXm$HOQBr7DQ>VM25aMYpmUTzF`eN5nJCFDX@@gI|S zr0R1q`)l0s!Qc%E>PIO1TvWZv z{yo|v%7s-WqE8^jMG2RPj$-IUHR4za44{L&$MlY#q95&DQroa>wr>d(l8wvwITEB? z@`6}_J6;fP#~sf!X7teAL7j$TURy*Ol78TjJvQ?fLUSi+;RLBG5haVe*RWD-Ai>u% zg5a(85O_*2Je;P1D?vxqz~n-vpf@lG${~lP7w6NL<9ao~neheFirPy%-#xoum>Ia{ z_cA8ENtXX5NMzCB-WI~$xnK~p1WE`G*gt#jffhlB!$4obK`yh45B9ZKI?O^kyMs=1 zc@+@32G@nVUt?VM;qDzEwVWMXv69{C6;?>O>k-hZKHe}G!3c5VvW8-)xx|e>Rtw!* zPyk%$uEyOuRwzi$J)=2rY{k8JE5=gCaXx$~ed;hqNxa6`Nl=exjwaBBT6!Z)AeOnW z#(Pk7SdJdl+hMJ=J1nb+9G%onu5l0s4!e802es#%A&!8TEB{~iz63CeBKy0C2}zJh zq69=l3=jkaAs0883CSb`2!s&sV+ctgfslkS0itqfK#gM*ymdvzV|7&&6%}s|h9_E(I^>J$fl{|F4l{tjsf~N+Z$Qu`w~$JMlQJ`M5)X% z?zSYjavM-Xz|~nWpiqX!(chN1Dm{?Gc%SACn^c&mz($vem11hySRrl6tOtA zW*%afa_lO^+#I`3i`|HrxJzT$VZ^$v5&4TS5sjalu-~1Jm@pAqKi}}^>VHO6bn=C! z$Q#1v;#M$j2&;F4=U?R8I8v?ThPy8$88y(c4V*GUDqHx%Fm9twr98ZW6aB&lPQGRyJ+Ya6RC{4l znoy)BX7uEEJ&q4djyvMxR9QtB0s8|(rree0y(DW$+Hm)V+Co#th=tRpm5z0tRN4BNMZU(c>@cd^%K2^78Ynr zE$kJ6i?!&{Nr)mGX8b0SA=GJ#m{5nV)6~Tnn%5<}*XhZo`NL_b=3;hKFS%Km=vJ`5 z*8t5gWN%J4fW^Q-zv;rAFYfRzl5;(HU{-BLgt|$ghrRNB+@s%m5?+`}`W9fV|RgCZ>x_))Mg!L z2QMOi?D#7Cv$ODv<`U7|r(VQ84$U=|G7TPHeWVR`<;4J08!6xc(aG|VlW|6I2c`}QCOQtbMbs$Y+~#eZ9vB zgOGlhTQHx`jYm(duqScKX1wJk)(@QP8^goJW3}nDcwqi;-?5P*H+VFJX16BHkR9A0 zWIN= z#91q^k@C?ZZXZPB>3#oy&hPB|h(;idd~NYyKD=g8lz0$}$AX(f`YXQ8TJc;(TY4>y zymlq&_jf#4yy_QGG%wSi!)<+gxK#Fh-4(?!FHBIwYeUY$1IR)201}S|IftB%J0crt z;c+FC;6g~y=l+$_#FNd6F13RlzEI8V=280j#u1UHrY-sj=|ToGb|y910M&>IGtzBJ zVV+%x3FCc+m@p493zNaIQKfKOt0t;uFzQG+?I(%NFX;x2Z%j!4K_QjRe4+i_5tU(U z9C*qZt|YAIKLm5sj{b=rNx_;qC$l4bl@Y$dA>hI$kNt;)R7U!g{-Kpkz$d&OoFW4G zzQIX82evPTB8q>*HVt`ED?7PzICh^UoVW=g)}$c$F|e+5VCed`Z#%k2^V8beDhK8= zyd&rJj+CYA@zi$r$Q<7;ww)L!g!2Yg>1@5rkOnyz9;ZM-R}v4isqZ(2JXUTUkv1W! zOykyzesV`m5g9TV2}RAf1MD8)RfYKG+wE!D0YfF>Noq@it-}plG}Db4ab2H;K96L@ z_J-oQ3f&|YbCXoW#Ec{pF)>TYN6a!eu|8fg&rN>hB=iaAAD%~Aun{rp02^rO;8$U~pye9<^oxCh-?DFZE9p$Stp z$LP7oXpWJ4c-g~C5EI?^9K>#5S`}g!G42M$hI4EMV%PB1yAcx{f$j{g3F-!OpgTjy zke=8>dl{!}@xtmONvoiPFur-O`xHC~UynA3tyJTFd$apJhrH#+BrH%JI1%aX0#|JY&d_i@(p!w-K=ourskt}`p)mVA6|69Mr zZ2jWNSB5NmzjCav^6gsp+coZ;%YKYp`a85;vhY1DnL3V`TIWM(q1A^(u-hpXs%zfy zA`GE?buCU(vzY~|632Wyu(!PLC%&NWORw%q?~QnwcB5a%8__#`?)@_r=PyOH(|mJ0 z{WIn=CmWm4WA}Nc;n7LgpK9@Y;UW0;+tnMSOZ&DauJ7aid!!qGUn2Le{-+}{ZKJ`x zsjD?TE(wuS9C?F{Z>O!{0@huXZl_J+q8^M`7mkfZjGlo+D|v`r%P}uvVo4lXLd0%G z>>9rME@GlR{1P$ILL5a*w2UVa6HAwx0o{o?Xjm$w(C-?i(R@-YC7ghmkWBZk1de_$ z#1XALhqI_ubaPO&v|AB#^VQm{xB13{|1Hy3>ZuqN%pIs=e2c5~RE%z`kWagcaR6(v zd|^#-Z|E#8;;&jlm~W`4D88dqPw@1&dU1&QL~!xQD;wkMee;K~7w;!84g-tHcgehU z_^zm9!gs0Bkp8CoE;g5sMAh=`L(SofR{uqZ+;X*8eHkfNUyeE1o58+?`+b!=oj=KX z+Wc4@9u0RM8lro&XgAN0JHN!mqPue+WVIZ$XvK|~aO`=A3Fo{XG2xuIASRsi0mOuJ zK8=`g&Q}lG4b zO@D`cKQ~3EC>C6YLvPV5*|h3WwzvHM=^LRo=d?=If&J=bi;g>?Vnyrxa37vFVvfXq zLH9$^us(vMe3K8>x({Nx!m{@xm)-=zl7)xR2rolSog*;zDk9XRj${7XRCTrL!YT5hVAsTCg7NgoMBi&@Ph*Tf&y~=i^dAsP*yCWvNX$)e*o37SkG%*l9p-Sk`5TaqL6;KBO%0_#9%G*FmsVb{%+!Dbqptx=QRBGkAj)Y>JgSgnmx)fx`Fi< zj>RDM8OPL81A#-Zxqe)e{RGD-*I%BN#3wb0PiYbln7r%&x~C|=8*g&o66V+t4K z7nXaA%Sw%G9ABmJM)~pjLsx4^8p?)p{~}VEmRAsyS5c8y6;oO`Kc=LxbcVOcpPQ?A zb7my-w`XDg2B9o;<|~wi?i?d@62}nX&>dSxAxRG>=|Penkt8-oD{#3O($mC1B(+>f z90f|MBcrG-pl(>d?W848f-Tl8QmJ03!A@#dO)7QsW~o{^Sfr{F>93vCcugt|BSIDI zW`~{oV!UN#F(qZCGmPvUf0OZ?OUCOyp+YH_6_usD+f`vj1@>rbsQoU}bn0NrshYxv znhpc~bm$kOVzj?sY2Z{pum+J4$`n0J6&-uF#%G5c!&fQulQ>4jpTaRJMyp@Vt-|hl zvyD6NvDCo+MD>#bDK&}(lRu@H>_L|Hj5;03<2A|sO_C{PyYK_!Nv9#2F*7ui4dxgb zpf|@T4}CdCy7%GOj6&?3S4_99%pnAIHdN%6ab#K=9fm4th12sYOT00;Znd$Y0kk

    K!X@%KM)@n^80D{+V}4>dA7eDW`D`_a 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

    8-mQr- zYJngv~hU;WA79m?sx?u4^D zVDoe_{nABMponKC@DLp8d#IP-T&28*Nzn?XM&WeVI5#UC(k~-yy{K?Jr{uk_a3l>w zjRajG8t1HF;HkRPOQ*6_&Imt_*^e{ZkF!+akd7W&mcWEdZ3R`QxKx)PRxrWfh**AJ z;RroPge6s`;v!q#3k)=}3f2W0he3OiVv8|s{Tpy7zY9)L9o6DuY2Jf50Zce<4<{Ir z8{xw-f@AXGj0Y!D<9IIvP`w+hBiHEqHsKslBDJ7sOd$y4JAqCk^I%;+vVv<@>flE` zwr)^t5k`Cs@}+20j?J3PHSoL^NlueeHVp=AJ8 zu1auLN*&KQcHG;`w#n0u2GrUFv>`UGdKnerQ|z@x!e4HsJae0V;ZnflIt7s$w<3I> zhzRAq-d0ifhx4GmO(OC)@8}h(129|0j*=rqR0_pwNsYbQCQYlYt65x8icPZ!GtWN? zY#Daj@-}2;?ooyP0YuC^W}B09GSV}$va-xRfzl@YlC0*WOswVLm^klUqiXA|ojylr z2m0+5ofNOm;L-2-X7}PIOqw)_Ezs=VYM$Nei|!rO26P3Q-7}%J@VNra?mY*^fof4!95qX3v-grGvDf0ZpwZh&4IeHF9&pXxtr78uRfV&Ntm%4y^1DLP7fcpWMKGZ?M^+(?k1x(_3a8%o- z19NQ`aHYW1p9e=hp9WwY9dTa0BMLXw*Dhcl^uh(2Z6)`f0_JaCxXxxNHv`k^g$v|f z0^HjRO!xp0xH^l!?_qEOVFogcg>3@mmr1~t0`uS?fuj~R5H1n?w}CMzvj^0=2g1dJ zKdi$HLm*rla90DjLBV$BZysRlwZ9qk6d836AC-ZR7Fqx&paJqoO^)eX3wP z^LH|EUjs9crYvz$eG|yN9&q3qU`i)4tkZZIh3^5xCCs%NpQ517@~a;HW+f zvOPbD*~Q``_3e+^6sB{Z(i;t!vJ zgA^E|Jve*;%4HwmhIqLbs9chJqq^wc6~ImFf_rIQbT0$AIp=YYqPHBFjS7y!8z?=9 zzg@wAZ~53=Bl3+GkCb^>MVWd z2T9UYU>=_?a5RPrlwh zn1y-SY<7-CAmjE*`AxH`j8z0(hv zK?<(3bR*nIV8)yWcO`HMz$`ltE)_TjFuN37XW_E}_XRLl%>;p~v-FLES*?O$ARd9@ z&kX)8UBFTMyBoM}vq0eLEPV961A&>X;5v)H;lPyvv+g|Z^@Rfu0rQW1@>R@f@^^F? zZ}o-QU`k}Ki&xt_tlkgvGFM5~b69*##VZM{yT$df;qb z#4YUtj`GopF5tp|Th#>|)t@(a0Y~L%eHU=l-Q3Ux9ObKbx`3np+VL*nVu0&$H6C79 zASn(SmXGfOj)rYnUBFR3UC;&G<-pz21sn}KUg-jk!gr_(ILgmwx_~2pL$ATZ>k1Tq zRE|b>0XG!5vvx!l?X9Qpfp7jV>H z{;&%;D(9be0T&6};V$5)y*S+k9Qpg39}e?o9qL^gM+9Gshu39}$nn#;LlXggJK+A; zq^2H0;O0p>O6&jpS>Iyn{XZcvMZx={i`sC$&bi&8bgS>azwY2p&Cx5+9Pzc}_2v#< zi8s0fUv4T3on8<}QLj~dug#X5{nvL# zj(*>E?1vwJI{x!7zn=K_$y4p8&-`}w_j8bW`yYOP@w^gf7oESLqVoExh1E5+i|Xoa z_QgwfsSA}=t$Isq&5CJYMAMw z4ijsdGH#j`wuMTSysPE=5Xa%cA08U2zndVC)M!4nUmPR;9uR*5{_dZH@BMS|eSZ%A z!JmV_|L5Qz{yF#_4;->-t0|tvx%MA-WCfh`-yU^GxIo9hd3MB%Z=5ozZ(D5{EP8w{oCXW z^dup#D$+_$%dv#*OG2ScDB+zIEiOGx-AOsn>2ib!(#f`;l%L>C<2CedIe|^%LOl}> zHGL}_Dnuq_=@;ifUC)#z91M3Q4w8@ipyg;pT(-Vq=k>eV8s!OcOUsd-aV-@)#{K=p zt@IKR*K*3ry$#LmrRje|unF4D$JIShFTr0l=r4~4bI0YXxMm`P2 zC+V;yf}N!XyOTg$&L-@!>*aH8M%myDrEf4m8ICjlPI&@8V+(1XvWJ-+El^!`)|q)C z!K$yjA4-;-gGhIhZslavBVn6glE81%>F%Zv0fj-)$_Fb{>GTE9t& zVfKhgiQ)Dhj%7GBJY+7(S8~P0Q~{;NF}Nlt@=4H#iCl)00F7%uCNeF|nc1H3{^A}* zTY~Y*AG(3859 zT0oy#q)+(JewjQz72mlFE+jjeDPa<>(bv5k*Zc|<@q~u<*+oW63;X7BL|`m5Tj;nc z+Cu$d=GTG{NpdGBktFwn5=rt1D3K&o=EYgKkO~yy*`!!!>CjUa6F_>~MXLHBJx=KB zsi@QuntdRmCrbWKAcbZcI_=fOa+2>bPpwiu#^)g0g~Nhuje;PcQOV7FPsy23 zPvo2tB@_lxy>ZGwoow3#$4b3qA0x^XO&5XJSCs+22$d6mGL#J|W}#rAp_Aay1^9{M z0MW2*4k#gK-mzlPsu62<+6DzSZTL#W z28xH80SmX$I6~Cm)W8aAv__HFTKz81iog-{A8`23iOTJ$3tQw}LgW;PH4I6;+ z5%29Hm-%+^7|B^SJ-R{eaS6gN}!Gql+|N7UtTSMCyi@w z2h+uvoP6k$>IL!GyU7_xdyRd(C;;x4$qB`}vytqgCWk*KZLZJWgc@++aw|_2+5V;867VLQ6ohu3?>~-^$LVR-$qE@CJ zqGT*+<}z=*wDAyZRgNonGU5Ih#8=?B8o$9ahhwNx=n6%(>&U!g6cE`)WsBjc-^*FJWo$v2eVNI*VLADfRFMDv1axfgE z5P2EELFRZlh~^w;hQ__CX_l0~p1o}#KJ7C^wotZ3Ia+Mw5L7WtDT^7TTk-sqO`ipI z9aArA)Tb!=;TWiP;R+}!rv`~MYzQ9hc%VknAl(8=RNRk(+ReQG0`(qK z?|>5iQf(k?{Ho!?(T)mS6exj<1vMGIako%wU<$W|!9A^ka2y-80q>$3!VV2N)0CI* zc+c(3+}Gm^M|+U1JDvU;;<5(eT>555LjOf=kc}irg?4HQ{VZ z&38F*}s6m%BGHRJV1m*rSxgnIb9 zqaDTX7X+3LukA;nX3inv`1pY~)YwGrB9x)FTJ}?Q3caWY;bTq#lyM&Pvium#91Z&; zjEz(cp#chxZ@f4Y-29(HdG!Wgxrc}^& zG4(p0RGbXbhjDgH@IjqFza8f|cd^)%iGE874~3MOL!+&tE_m z)apK*nsv&;v^fnww7&2zZUd|Ppge5g4MaLnT*%fOTMOe2xJ7wl4Yjm&$GABdWywBw z!D<+xqD7sY<4V@&XpKUIeB8J>IY?<P7F_AT|Kr@>vF@^Z5?)Q%30gRtIwRX_gt6QZCLY^ z)waGB0qJxYruOe#uQO_){x$y&$ zGsM;}`De$KlD)gxv0b0AweHup8^qXOrjfPJxY}oc8tOE-`BV&8Ha0#EcjXogXlbY| z_atvl{hXArxBkKnASGA)?F?%GokafZt^3KnB+UJxniusVD98iQGTKe3Zbj#cEw^eK zjYKSvgRLR-jdZn!gbM-`)zT;zZlp~o+Z%m7MG0x_2YlNa3h>29auZ8BJ_gFbdtd}L z2BwsS4AM1t3f>}(qK^{12SBypHc3xtycabdHT1L*&LA~wrc?t8yOdD{^@T=Jq6r=~ z^mJ&vNurD?TE%=C%YH!`>}gWyAa1eSQFt{9?}DOoVF{Z`4fm?Kwpmk`pT*A43AWKwYtUh|MNeIX zcUzyScKjF{Z-liixG^~v@CQK&ceIDu3j>-?J$)HG8Ed;#-m&KB6nJQhbQ}$ajiXoE zV*=Vxn1nwAySA~8qdMCqP>@YE`vM9GQ;O?W=-vM133+&y9TZ1$S)CQ)^pc0MuWYnhR<*Q)Qr>OgTZ_&lL3$Ze!|RP!BQn5UBM`QTH*ADQe%|#4TDy!J}5~ z7B)Q$>L#W*86q6VqVpW@xbqQ@J&ovK^|l-`MwlboLeXKN7Ys~YmWUj;-Q=W@sU2NA?-U@8fF{nv#G#ruaSBjj&vv$tH z2=r)1ky`6FVOO#b^!8QLH*cbLhZ@C`=n=XD`d~wN4{0-T2=|(@Lnx`M)ZnYVnFve) z&Xz4Exm_j&#W^x}>f}X{2;X4iW&>5)-SXTYlsnP=yqM}>?X9nz808GjZB2|qNR=jB zo+cb{v_{EBbWAq|44iT8KVU;HG|6$)$a3Xp#pYW3rE(U9Vu<5(kUhNB8r~Z)SE8}4 zH~PJ&b@uLH(F~9)F~qSlOtP0CxuP8Hz3tsFFH2pGwp>TM!JdIPioLev%4kj^c?S(N zciN^KBMipgI%9-2!q_`8LV+ocwkEO@t%>X_W@()GysRjBaTHZ^a}as5B|?dKcbt;+ z`c|$iwuHeu#SE<&Zx=UVjS}ie5D)|U#t>rwWnu-{wai-!UOe;uuGx4?v$0#V@d2ns zY=bJcactu>r~|kS5>;Y*nIa9CqPDq8;}wGvA)qmj2tf@f;oc!oTVdBEO+@6KV@lLY zh}Q^pU$f0Xso64qF=xiH;I>DhJmk1%MLOP!qK&fDpe%#i2I&e=zpL(U z06{zFd!jpl#4tEB;p`!y=HUj0!*j>6>5Pke8?%1$EECNjTEg>C2}i^oaL#&7o)ziL z#AyI;IcIHg7B&|kkKv33<64>p5J!+i(~xNZa;oiuqPbhB*WF<>q?9*nIAw}v+X!SC z!uPfrwYeNyA9-S11XUmC_=_JDG}-bN@MV?VU75R`g}ZY_@uGqYtru@0G;4mN$$%xj zS5K5|;d16~d}YY$Ns{fdlZG&~ln7#h=7n)B4Nr}m&4@WJbH>g4;RNRGn~ote!Q=8`9v?}o3+sII@QR2?3osymhoM~<;vu72 zi5!QT3K}Ge!bb6d8UEqqt^w|9eH2%67?ly9VUhe!;{jVgIhh+%sHson*-+=QDET)z z^EKzBqPaBN?qh|L771t1b6Iw`TG&rIa)XAJxt0A9*gcqau^eIp^o=oiwhtGxJ%|@6A-B8Ydgkz*FRm3?(EID6_(_e&}K@l+Wx!B0z@~HdV!BFUn`Ba#ltW9dP~y={#L-BM35m{KKH`RN8Cx{rUD)My5+%pjhnKAz%p)14K8=iI#wRM!??M{ zX?cXP<<86>0niITh-&zNYIq!m24NVg8m?Cje}Q3`FzjaBw5q!bxJw0`kTV}QJ`e3P zi9O1L+l`xBotE3zC5Ep{>)Dj~4D=Z_SvE41-LO1U?rb;-H)PA>&dgg7vi5b;d#y7Y zn=+qnvOFt*n|2E9v%mpyrW~t8mzGbmKVlz>=L7bEc&@ki$MY_GZ#-|eXX1H_EuSdK~Z9%JLPh-x!8p6JszTwol$nj&AA+e6KX;I8;N;XPy4hsLb;aK6gV zZ4J=e14Kf*{Ux-u&l)#nJ`GV4e2RS|WRmjBF(~ZEDd@61S7}yz=230^@$F(x$HySr zmHC`2SGP`=h-IVG=%B~!f(XG)FCr8HnnW{=JZ_naW(M9v=XA!b{YdJ~DfVOK zXv{_>d|@AnrIzmHt)Y`AJ6eOwodZVRyl})2S3De6!(V~Ds8mIA!K?xhQQ@@!_ z-_}g~p!SRf4~MdOw=#}n6F0y=Pr0S#Q54z;X9IP;jEz+HxGdk{yY^A<1NR}^2Srk< zlK~i<=#7m7;F)YWI2HLrGTz*i-ZBrZIW1n#!Ebri{xxUB>reD*-?s*mVFW&e*Oo(J zJs=$s)?+I@wkzEiXDGJV(wNWPYN2s~s_Q1qY1xfBV{IdxM$U+o z-}9te%&xd**OW0wsd98Jbtjyw8%8UX#!da%Gml7AqY#O*g=8n3t3QNzNX5s~$!7;~ zQ)KKD5ux_|L`3wVkF)GkB7&Aly}tb4@Keq_sKyKRPUONp=u(3)-b@`85eJ9E(9=56 z;~k|BmU+@?IT&{!;gr$wBq2#g#PM6G@wO-Mw$5POv`5~BPA>$xAkM{K@!=sg^t1?v zP%GJT)*e@u9yv2%?~Mm5O17ErNMF##dTGf z{X#<6<_9Rx$R7HFlk z>_=SjSuVX1XI8oNiTR>-ap|XFen!oTk@755pGVNJK;oq-2zAtvrX-zg`5v66Bzph8 zDJd9BCH$_(`?02^5G<7NJL1vuV^dNnR#5QXauin3Kv|AA&4A1R+)L^vTYhPpfuY?= z)x0~*e<^C3(F=f+bDNTSaO5}5Fm`C9Xa;)+y2o+v2I}C_XnGqmia|;SMVZ1RJ%T4S zvZBEjMVs=+X51!eIM9391~vY|E;Z%CE=|+yVN+^5-)0-jP+Ej5TR}|)-z2>U>Pn`{ zv}$3QMo~A^5{Bx))JpXhCVu+c`iLR1TC;~26>g(CqjI>K0vM;-36!s_2Oz7>1t`yT zwJuNT0PH|h6pitv#grr3d78Pv;L=1R%Fx*u3z4f%;}P;yZm%3J$``E$RQBJl6!8N2 zIGbZME^nVrUJL|U^tfq2E}|(>}@ zMMSJQM*U}Ec~)FpjqO-)&S!xMrM{B)ps&7Me#f;)ZPa4kb0q}@x3IWGeQ|;7b+Y3p zD1^)+e_CH!P>?GJfsh(rud;@4+-VSr`L1GkcqcTsUCZ&fTjrAe) z3>>R4%3SVP6)xHB#)wdy)<}H<%pDxUECnJ~GDf6Epxa-N2j1~k%P|9Zq9j8!DI627 zm%;+DsCuNFf;=F4s|Yej?V(mBdeLSe{+(77a%JX`CaJB_Im$_+G%p27OWQtxJ&0T)YN4Hw6GGsP({UmmjWNGu8(eWvH-jTr%=U?SzOVvk<4oji z%(hle&UZFm4O*$s!sPbVSI)N2tt?cUZ2Cm!gETiw@~;0z2;|>l&Sg8?tBf~)hqnTk zRj016icjZ>T*tPc?Q5s5fHjF_VtKB8^-|qrqvg}KY|Mz)yNYy`lhvUXDsEdSW7_7# zoFm6?TgQ&`y0FsP;v?6%SL1_>jx{jU+;_WPCXbL1(W-lxT{7NEqfm6%fxnGfoHl)& z8)J~o%{1jiGiT4ksaN{rfeF3FQn*0BRm!i8ex0uC@FQ9dNIOy2!o{D5FJ6Ebh;sE; zB911(jEz)I<<}`b%u_8uQk`Pn zUqOiu!fsHad7xpqz>!3RXe)_v6T623;W(DF0kk^i2!~`OCcB)L zEz~9>r7WgX`!NMxFrc{=)~HGvF0DpYA(ne(n#*-IG&j1J^`Q?6Oqk4r`B-u4rbwLCj7W1MsC)(T*po~;$aH+?PDLFE`NECY1lT>AYhD0$) z)T0!2Pyr~B4CSD{!)=o8z;i28G-mpODar_+GZhRMT9~3*QP`cNQOTeLu0Z1am%>2CIr?WhKhD(l7~Gs5-;ct@gMDV8wmhhS1p zkLL~Wz`)0`393`zG7Tsw5gs1Nl1Q?UqE-5u`>EfFbJgV@w7}`usdLxs6;T4J#A(K9 zdJCkWFCm;93?!XB3Xo$*klO8yqO^wq0g%YMvx~N;jB%4Ja(@K+E8Idj`WvRM#ZyoS z6)8Wa4wZ3p598+k^46FZW8-=NXm)pmoT^Vq*4KxUlrI#6FKHktINKuQ=F}jPs)=dA z@gU$k&h)p>%Xj64y+N(BD?3cqB?Q@xknMMD)jNLF*Z&mP+%|l2kUa`Ax091}cGJ4V zpvg&?K3|b?2sS=a5p9Xm zL|cZ#b9dZM%4n;MceTiL6f71_ugG__gt=<}O>zukoXWxL>lHk98L`E(%{0^77tjxJ z8(1ecHJ{w)z>*kAtq(_3FUM+}x8QohDGPnP-Zs%ix_-lv{*oeWB`RZ*vWoKVWujcF z;&yysEsM4HgSC&@y97L`QZz_bJg?^blmSZg74t!9eMN{_Q!-M9FF=nGMiL|^8ge1F zMBQX{B+%}>k|YqRrsPG%vz{=*8jU8r1j0-O3&+iqwN(tc&Cq#L=s+TpU*goLs@^XEBszmQ_+)Z^|tOrp8~nv6-n#_cjLjJ8-&6o-nU z7$u5gKT#BWDfI~20*b=8W_ofFBVrib7p3GXP@nR5qn<|9M8c+C^~3Qs=eT|tisnYOa=_}-BodjV zW0A<7EE0*C#f}bA7B@&#Y6JzRQF&lgY7gPoC{LYgGGSngsVAy~Wn+FGrX|o*2-Hm& z0WlFdl!53Va93f8UM;g;{RH$8;@r|~G<($AiB3W+sBdtaSYl96;$yc=f>}lPJO451 z%9s{v09QGKxFycZ=d%;I!fOb>@045KUye#=EnInK;4;K8rBg}VGhOd+u9v_)n2 z9LjoNt5fjdJn(~@$dxQ7a#ocS2}YLYd`7*cw^esY1dL)aywa@>s@=7EcPs}9-Lk@M zv`YFl!=v#0R<($Y1^J>5b6HLl;G_1nT28=F%E2JB)k5PFRhAEw5=1W{5=fF9gX})R zAO%nLr2AvJoho~p->2H1S!h?W!hnKKSOrR`FfHbjv}Y;2a$Lz-G7#FQ9hX zf^*#;7kO-OtkUZD0o-CYiyZ+nuqyqfOqIe!P&a@QrmHmGI#9KYqrQfq_JLZ&yu+Xl z;x-WFX#2Le{%B(JQRXq-S-QzwzmW1P7cU0%GfqH0+*4h@X1t|=|6E?!s$!WLa` zudS`Av%w0^v_!GW48sCcfamMWC z>YD1yan4)K;<7qAI`EHNAv+>GzCnNn=^FU2C@qG6sv~ebTK$sZ`uduZ3Y@!LTg-u1R4gM2_|t9C*H_mpsg^WzpAe{D1Rt)qEvqe)5K@(fN8ZsT zPT5mpIiseexGJ#<+NL?g2wJJV4u>m77gSV}eFX;9&z`sF*rmf`CoYx50lnw5Cr$Cc%php#DbRc2XA$TJpIu-pM8=s>zReN zAu;Qpx@Y2BSM9st-^qE?-v00Y{>?V~$4heBK2U$p-aF#^uR~rcOqsprhA+}*e%SGS z-tA{L{C(4)`6Jf;cIu(oQ_JU9KKjLq%^6j%#5Ye)%g|W{Z2WH4_DNeZKYiVqb@GkE zpyW66A3Qqbo5L@-9@}@c+trPeZwb0^d{XHTkDU1DO&`BIxH9?N7qdS8_SWj)iw54l z@zJ*``aLxC2Y2`Nx_tvDK4FSpKKQm*rvKM7LE|?LoOI0&`$f%+%%-mEw|l2{G($R7ymx^ePd|h;V-vV_qiYq9CI9-oGGX|^^*@$68dp5|YkHM>h{g!#!o5+MDX$zqR5ZC))_q4O&e=OB zbo*bP9DeP9Nt=5<*>~=lB~87~y%TkK`_C`!EqFNX)m}r}?`>NW(($m3^S!Iz)e)C} zS!zM*uj1sU8=td{zaahk z+x~U#|6}hx;G?S2|KXX;kPHx*01**ULQ_=0KmrnjW>RKSNTVgVlp%x!LP;Q*p(rId z2{2rPsH?lW_Ogp>ui)xp0&2jDu4}`!uL~P?7hAxx=KVg;Ik(Kr9mxL5`*}a_|9?K2 zo98~~d!EytQ|~F~wcXbA#x?4Hd+pmhKE5LM(&mrHT{ixm*E?pN|L=u&96aZdFVFja z!C$JKeLW`*D9*1ZJwE+Ye{gfJm7U)l-P33BgB#CvkG%HzvCnlqt)_?i|LxTI{?ga0 zmL>eO>etWqeeKnAj?H_^{l{-JpFTO}S7WYu@Vh6HzTfrEg*VO#I&xkQymx)?&r*7H z#O9|=u)MbB&A}h`e81~r+bs`W^TibdFCTy8MSp*qd|`9>YtDauzHHj-fB4(%^KHuT zF$p<#f9?wOyg7KrEg!uzr|bPcU-8t~ z&Y70>_G9smPb<$~IPv`jxuf2%nBLOqIl5!CZFbrAFKb>K^wHmcc<-H(*$w+fj*0vJ z$GJD$6MXr}C0mbm9=&q;fepX7e#xV&e|w&H&{@7&zx{a1l|TLY{7ZlNRL7dPdMRhV z@zmT8)Js&hJUsk`#%04EJbdggdsgLt_EhYE#@p+Q&KTyNuy^spJ>!o(H?YV3X|KJS z+53aeD*v7NQ|}-1mtT!rnw0ggi9=#O+V$$8#QH;vyt76p75*?M>*eYjMqkx3ctuW1 z0*z(axGL*btQ=Rf=zX8vN`q{h#Z_HZ;TxBne4W+WC^*I=;?YpzN`-mSwf;|DEHZ;Q zG~BjXAJi=+Wjwmd#+cFc59W!dH&VA;8oT_@7>hUZj%~wj*@U%OoA9KNJ(Bt3TIm@7 z#!8Yf6ecV#!;kuYLbCB_`5wfzq9@OCVz=yQ7nBi0L%-8u;<|xxbOS>@pVRq8Q{|__ z^zH_R`iZBL(}yumJSm<3P#l9qCCZpSv=Gr|JvD}GZB|N2a@{}XTXb(JZ;Thy&?qhR zLK!Dc1q$`6A7f4}hdSAza{5Kcp#hA|N;75@p0c!$(cKJ>7i)}_4v41|KW>?QUnGWx zVKyrb%}LwpzkCSF7cOTYV>0Q9-_ZNNN4GT`L*odWH5E@Xl@k|1wZk!kU}Ll9<4Jz~ z&XSoMiJ{2}8=vt?n6j6){yq{jm@%bzQV#Tq=|FOZ`*k*B=n(i}p#J{C6qEF!A&j`> zg>B9?v}x>DRf8q41KK_2^k&NsQrW>7lR*&C_!u@-&GtS@gv3 ziitfhiS&zNW3$qf3u*1JuPfI?Vumw@zAupW6%G63$4JZw#terX(xeA2u7fyA1*1NX zWDIFF*^n6#5oW4+Y*w1~qcC5$BpXkbV>pKWJjVPDPm+~2aORvy%=wI=L)|Gn+a2FR zP`I4YjLE?hFiXLExjQ2<7cho$pImp=5AZ}{E@TYV;iPR_u6-3{Ioz*{7&8}7GJku> z(;SHz0~_Q8p5%Jkzg&wWF;thI?$WDqjOh&_6!(+m51|4G56{Jn8G|rWzQ5P{vo8{p z%$Uu6zV)yHt-mS~<6;ceW+W%>ylYMJJ(DquQ2?nWYkZ{dpCjdPtgSS8OD*)F*UtJ^Bqp2X zkcN<7*PJ;2#z+j6ba9;)yt52%Jm-l>jJq2cQ~{8)mY(=csJM1Tq#QIw!0g78%*V0& zZi&R?!Nz7?h$n^TtzTSlPb7v~H=DHzPfF)~Im_WK#n9N_KrsM@Ru58-D(>m4ypfox zjA;di^7Wg==g)}56f$Nxo)n%v*Y7~k!u={@Ou58NI$}wR#1u2;)b&_NH!!7)A#J2k ztSGBoAL-XL#!zZgn1A!w$H>6&Fi&R;Dmc!sQ9GYOCnX$%ww@v_~z;%Fp>QdsmwNzUPn=?g>*jrl&C zF#`}4>fIjQPhAs=7nyb9AD&4_8E=EHzH&*uI!l9)sa?{VT|BNmd^1TIk>j2s&=(-#IA^(7!qdU&`Mp^hctdHPaAHksy zWU3L8X?uWb1n1QV&fy3SZEjPIaP>n3r>C%Bm>_8*oN5GlaRkQ`!C4T&p%u!i5#;p| z99r|Q8oD5|a(P{Yn)94HUS#tk6(KlvE30ZlIcC>N?hTPl_;)17X(2gezLlJQ8mAvs z>uglag&`boLj$I)(I~={Yp$|FFl1LKImH^rD>>;JXOrYi)HwG_&LtY>b;(K9IA2Rn zn#SpGCm(U$mBu+wa;9jUV#z7eIMtFfRpT^EPKn03QF27tAwPaEIUWu3tmI7BIIl_0 z#Tw^h$r-P4PDoC&#_36o989Lh86`Qn8s}2UIZNZrketC9XNBaPuW>d@&M1v@ljNMI zaUPHyJ*K-OI0qyrR&({f92&IoTR#i{!X8&YhBzrE#8+oC1yWisTe(oPSBqIU1)|oQTC3 zjWbwsW@()9k~2f&WJ}IWjWb7b+!|+tnLBqvYftdg8z8s}Qc8K-e}Nsg{j2PJ2OhWS`>CTJWxb)8`HHBO@B z4AeNIBqv4VWJ=Dt8fUuXT&{5zNlvN8*&sR7G|o+uqlfvC2+n~B&gT&vo+Lsn#%hv> z^x|mYq1LNoBqs?RQKc11&Tx%WAvtGjoGT@#OygWHITvZ1rzK~$#(7I}62TEw{&C3} zpmChkk%BoxPZd4Tvb~UoFIE6;e z)d)x?{^JPN!r}>+fO;E09=|hZGTwF?IjMNzn;8kit|k&^7=9XuhPTjV1BV3ji541$ z1oL(48ixj|yuwuDj86t92S1%dVWyFU&Y`hA^{;gfCC(Kg918S;5Do=#aR`S3RBPl+ zAm9BV9P$f80Nt+%Bsmbm!HZ?P#-XdZX1yJWq0*68rvg+Q_>Y-LS13Vig?LvvgD+HvsribiF8GnP*)2=T-{qh=ftY< z>XfbsBY5$M3NiI`9tBQ92qznyM2%xi!wPWqnWe*5UyebJ>Q{wKB*KJ-a3Q-=we5+c zZBS0t)oSUAFoJgjID_z}hwuS#hG-mPcq& z>b%X*{8D#yT)HAms4J?>Y}O0O3C#I-{eU5#8jE=NONKC^uByQiV_34k{)ysT-Bpfs zMVL@mR4>@9XOk0{fwesm9M!M&(iLGsT`d8}X1$1!sZKQ-vCzLc&A6Y6RyI5z8G;mGpnuB?H&t3;<@6DHKvGIljmx_a%4np<^OInotj zLR~FqS7W8C&ay9V(p_C8T@fbK)e3fXzH~L`>WtyKt0$x@!i2i2WmjsvTn`Qp>aIGZ zE5d}js$*ADbu5FEwjS4AolS)chA<*G(!fc=o37zy;Ml>TpAA3E^ngQoqI0%`)2MNb zrC=qvHme%bqYHjKqWWa9+z(e|2ooCSRp5x3K(gO)>*D8iSD#2%gb8(3&#p$06PQUa z{rPI$RUcUp2@~oHDh0o&43oKg#2?v{7Hxf2bo$SurDN>_vlb+v|FNo&iFS6s*h)s?+J zEMW)}>S`@GdM*0hng#Fct}d6Z2ovgR9lKIP_|^RS`*c@j(iLGsU0unp6*)Oh_)x*|-dtM%-Pw3f_`lOK9pclEk-MHnF|7R}>G zypg^OogV^DP6%fLIEz9!dEhjKaJ=B$8^ZB}^Fjzm0q2Vl&RyWxtw!H>gEKmW^BQpw zSP?>FiQ7Q3tZItP?%#Ky8Y?X2gex+H5r~tLLtMe>ok+AWp=r1gOg-h_{D}5^s{WiI zT@fbK)h2c&3$5kZor}@UQC*Fdt_TBHl}na2OiBeUY7?84s~CP)A2Z=1;}`DfCGHun zjPV&6;!-W|>PfVs%v;0j*D98KU9L1&n#C(^#mWrt>bm6>zMAD#UQ0${Nl9r|X7*I? zj7df@v=~hnRJU?rMddP8mKU>Jw5ZWrUs1cbs&YwHl(1) zF{cJg7JXQBnCY6VT6!>BT3EA?mO{ExRVG}N*4I^Lish6#xUjBbkpySzXnj4P5s8Ue zlC8r$b@eMMd_`EFS+Te((=|a0LPcd|)k>dh`~=neg*CN{46i(|M@dlS)1_6`)z%_1 z23Sp9rEj@}>9R1rM?6{`X~0Tu9lXVWL8j9ZUtR5T-3NMY&|jC=APH;r7}omgmKf0V zYCvP$M&5>cU>Z0q-CVeigQq13LWhN%zB=&zD;8GO>wzerkvXHvS6I>DbJK#?5DR3Q zZlOgAvPg4kYOCv9<0q+6r8#nqtz~;nwU+{dnef_0Rcl!|t-FNYHux6R)OlAzjIY{@ zNMW^V17wBR^5mw`QaHi_sTFm#-qj7lHMt725VN9QZ*_yO!iRFE77vkJD=TX1HP(uX zWmUXJ6$?YL1a~1qw+t&!L+wRQsj&Jge?t|m(d`z|jH#f0r%>T= z@2go+Rad>JLJxOCt(qZfT@}HpsikE0)veS5#GI8V7~Y0TOr=NiHO|V4`Ua6zTycdY zD@BXBl`C}76%Ca&SbvNUP8AJRrWUo~HU{0+{55K}##~G*n|<|KB39MTmFQm!S4*@M2Q| zyG3$T*BFw*7${liX;CuTRWz)tt<*g=TFH=xA+*xMy$IR(YoZYxw5pr~T0zsLFR5DV ztz1%3Pn85huUk+tK~7X+=YzK%Il6dx-NK6H1{GpJ1a~<)0A4KY7Yp>cQ-L~+dk?y7 zsW@5?Mf;wr1GxG_aH{HS(YCCtS&6QXs*PMAs||@y6Q#?m5CsjgI+bIpb*glWu-+C~ z_?D2$qaUDlbl`_fX#soF^BE=+v+=(RRO2${e98Pob*5rV>7jtst5Mqk^Fq zP*sm+9DR$*y5(@|!#*0;Xd`L~dY7=PtbkuAu9PmQIUBqyDpq>)W_oj{my}1h%`S9j zPLFOq-Cc^h)ti->+%0s|;_p%bT2)<0>gAD#*(76u5YwQ^v^beEd9%GLkbU z%Kc7wFK}7BODa}Zi3lP2j5)Ogg$MnIRIWeJ4<;ycCTW}u;a#ySD=T|yURHLYOWi`1 zk-BL4a+gH{vOKQBJWqChexBQvTjh(`SET`qUAfu$C57(764&_28L8N7m64j9k&4|` z8U%4GD$2^v&C1F`Z#a2;Mhb1g%1EI-SQ#l9DU)<)il@|_pH(H51 zM1iYXr1?BKzt~-xJ2fxQRa}=bk^2{#UG`L0ksEfo**PvM!pQK9iDD-h{@2xKOjP%9 z5#`g}d0YiWxtTdRnFTIwn;N;~eQFsKYifZW*oDd*!_SO~`ldI{9}S=Fb`@l2PAw?OL!bavlTP0Xmobs{!in_L zofW&LmKGG|luRv#JFz*AAV_DmPRy97?vKmRl_xvT` zvZlI<3v#kbit~#p5mc>?nheFRqJo0lJeSx?rzwlxnxa^QZ+A1dj8eOzYgy!;5yi6D zE3Kt^Bi03ZrMbCIRf{qviXD9!6UCN3J<=XmRzcC!+|sEoxxG(DBx7Ro zTB;7Q$4>)8@AKTn*|{a9B`&c9E1LXeBt>(VRpfG)W*1K_Ds+=C(KZ9>cm%4b#GO}+ zI!1pC-IS$o7z^Y#E!<++#@w5PKxhti*D%ohjU%O(3D|LLeksCo< zdR;s*Wnz-SjGr|Al9aUMl$1#ZCdl#0$&)65mo_0eP1r2xRY)JTmMvbe9@DIwFA-l!M#?WGr;;}gm~4qVmAndIR-H!Pg$UnOz}#oRnWghV;2r^H zt^Als$!Lb7XnqOIHxftjFvC3y{=b3QLm2}@YG{W0gzWI8>WKVW70qAzRzaVWYVacy z&0iAJ08GE2wqs7-m zUVmVQ8*paws0tbb41KyHb1HdLfGITK%;b@E86GtToLT;IegM;S8XQ^gz=J-3kYdQ)4HL8$WLRgt7QsfzJwa7y4_KFPbYRk}K;l zpGKcCYAVMqs;Qql9p{r^IvciPR%u+_!ljl=EmQhghSMRz1F%NteIF@~_+M00Szp&s zSM5t0J^g|tn&ntgb0wXuk&RvEn6#}&*l^CyT@*$-s|a`A`Cf^VjVECmT`EJ{8-CmJOz)AL|U47 z1n=SoZJdo{gCm8naip^gaqi48r5&dSmUg{~qsW3DIuClFdg>!iTp~Z(JzUQQH`;M< zZ+mR~V~>7>8^}ng3^Fj(yO@q&BJYJ<1xj3>H;s985K#49HvMm5{C&jKZqxL<4mA9S?;07UF7;6dfY`Ca1TB1qSU&F9vsPgD5e~Mdngpl zTZ;QHL33>;Zp^geE&4r~gl+Gk7Gq~W5dab_?$H$X^dvc)`d93yF53$HVtK!4EmKs& zS28siPZ3$_>ImDB8t(#)N4hC+DH@NoRPZQqgj=d;1TR7X`poG6vaS0cd8bzTL zJd#k2Uo5Xf5jjYd({i4fcein_tEmIv?@ zDfA?$h4_girp}g$RSs&k*B7)_eacFX z!+=9(%l48>XU=h@%#KSUM&PisK2+M&BjxNk(v8mQj+J#kWCAitiA}fq&q<$V$2~6| zM|!3MhxU2m(=+4!4#ks@o|)jA9U_GephE?_&TjFYOSh)sqS$o^cmKdToVOeAOt8WS zB{Kmnn+%_CkdkTV+7?$cb6tze*|?_Vnw)AyQJksQEz+F|w8)F|K~YsA?(m)gDv{B& zJSmnjf=AVZkn$)fA%zk~P^}sz+6Zn1L>tM^BM{yFrPn6e&bUC;J-$mr;?h`1{~o!6QVW zYk<2*aC&d&eye}r4DK#bgQ*_N9gkBI)y|K&PSxLEN1^fNqmk)+#LNVxEqH|;*YA;B zT(3v};96>ozc0M(I)k|Er#PY(U5-wFZ}pU4JNg_O5zGq%Z&=GUtlFPKzh*M}HEOU$ zx5~@M7L%5Vw82CVH(QC^l@q*Fjh6{Zbg*V>E=cP{T5ks>(wfREHGYYFO1qHq8s4Wd z52?w$4HRe_t}>+~I;r0w)RHVIlF~BViV`QPyM$<#qK^Vwi=lF(SBkjNRN*B~bdKOl zOxGt|)9k0}MidGH_oIiwP+CYwj1;LsfbeOtS&R&eq8fjZbYy9Wq=>(6WfDc*l2kk_ zafD?`YZ~8D?!2*;lUi^ogsf~tNHZV*<191l*U^B%SC_P?rh$(pq_5CP)&AN_UbU4} zQH@W>Nxmgj>yqe0Wzxc`s@f!c(N6NO#L0KdmnY#H$-;_->-Yq~HFfpN##yo}=*T^+ zBftW~Bo>D?VasU|Vnb3L&R`6eh7}{enu_H$S5_?=XA&T+oLB?^9eDUZ7Ajrle-JeF z@V@(ReEn}nKl*X#lzVUf&7`qAU-AC#;NO1y_S?mG|Gjy9pU3Wb`Qh6h+q?Vt_J0mo zdC8DoZztdXkBa2ClG848t$K0G-P`AVdgY0?3h%w=+dKXd{yy-#u_=j=>=_g_~AE*_5i%^rEPdI!N zt~X(Bd!-3u5UL}L7;3}Cfekc#seLh{B@#pRgE;t#Fxj8}>CQ+@9AhrWlQ1s~eg{o> zxL;IZ+N^42)^cSwnzL{WWq{2}0|FW*4fuE&IundB%okyr1Q@Dg$c9YMhyz;4m($6i zS|wCY?+7`47(+ctO2Z2)Xp?k!c=|@j=@TKx*$p`qqtNg~JIw4tASo1mHvjyD43A-c zu0P8;h$p2&!S%OSMq&mqhGIu@;&y$CMCEuHq{aroHEu=U{8KM zcf((vkHk=GEj9>}56!RVKNN{MlQGn05hibo%_Ka77(*c^OiWBGx;^1xJ}U%se`>i& z+-WE-^pITtvErTOQjS5#&Ss2J#|B5_DQ#G>@hlq2`LeMNdpS5f207W~Qc3#p37CiQ@1W@^l!>QPcUOV}E!#5;L4JsvPq)91((f zdD=xsBjt=_43#np#o6g6)jTz%&nU(i(|IJP57-u}zsTs@kty_K`dgB?o`F^h2BsBN z&OFKKsc|+)jyMv)OUvRU$HEw__6j>#g{*H4!O+Y7lA|9W0cB^SZzxBSvq{o?kFg5Q zFpWcJ_LHFv+*Dgy_{4ttuWxxTkr;hDdyVAi8~3l4oI#qL+ayOn_~B{E8L46ZEIImN z9^XigeuzSU5iG+dZ~bT!HOvJPqaPDOM^ur~k5vdtj(+UKBa&lBcx;SrlbjwJ=Pk*h z10)3IbIGB@Aq1yWa%{{oZY(|zQf<}+EIa%WCmdTC!3w$3RACnyy}&6e0C-BpS#goJ@B!&i)pz_D5B zJ4UEk1{d05R9YP>mW^tC)i6t~H_OKxaYs80QG@l^vJY;s!Aa-%A|YgReX>|?3lLu) zyb<=&T3rvnR+q&qX0Z&<3!lQcV&UyFujYf48v&%Df|sk2a1m_tKd=;+LrJM+?hV_R zdBYYBHH&HeaaiowYE4CrSS%g37#Qhg5?R{c#fc$Oeo57GV^T;fN=sS}qAwVhnPR@0 zn6f0wVq)oz1adm6ih%W`>USnuKuHVs#W+h-6$64(P7V>n6b30`h>d6lj2vz&j0_4z zh#RqFT4iY|Y6u?({8S1g!c>jb{svdjMY-NzrU8oPm`DM{ay2SdMtQ*eqMG9)et(+7QX}IBmBrv zZoF9zn9r@{RS zxZ8o5h#no8X!58X&5#%d;$arwz2ML31}+`AvoO$@NrMfTX#PG5i}}Fxr2!5Mi8k~1 z0^sU_`3()>V5qS(!%^F~ADA9AjDw-9Hp5Y$VJa}IB<@u5ZU*M?X>d)DXG79p5*qr!MDv&QYNy075D$)riC*0R+&vOY{+j94KJe-2+&UU8z>s{iba@a0 zS|o;nQE(%{Ps5OM9t|sDqQy4_cC?AvXw3YjKKw1+z?A?uiH4~LVS?$P6D{9ZUnE8# zW&WD!3vl;HEct7uFGb)#1k4W-NBv;4bY22}UmB(xj2VvfWi@cONNlwDlD^#A4S6$w zd$$`nsxB_1DFTBr3m>W8M)$k;)+=PGzPeThT}|DHBqxM zm?~+5Foz1u14;1Mm5q+{cK=0zF4u;*=Uu>c#Mru8?3>y?i7D-x zbOa21b#%a^DZyC4gBu+!rB-}9Z;5vW%j`;QZ~#8P+PAgmY$L_Dw8U@2U8_NBHEtvK z&aVz;+LbmWI^XR%Z$BI%(Y!7B|DLZ{<`5QFz0#on3j8>Lux=+gmUb7*Yj<%x_`wjt?k4Ut%S4RM7Pf;-h_CbDdeT)(KVijv}-(La5ra5USf0W zo_IKL<{Zdvr<&0c*cXpLq$5bztiw0f`QG+y4l&{*%?t+Lyj@e%bo9bGH3O67#k53e3LCRS`k=vGn#eaZ1tg^jFrmwb-8`o6?~B zTUG;jD6hBnEyaa$xX(^}>gF5agGE23mDpFODRIh_ZMZpgq;seRmk{Ij)B`cLT>AwI|qrGaF||VuWwi4a4&7sz2qVLhELr`Z^D}zimppUAm|4B z=EMG8^Z9CHzGJck3j;4|BZY0TD@&#OlvcXk+x=5ou6^}1<(1&PZ+9x=mG5zd>3FEI z2$zS$<^C!Ckl(KS+~I^a$59|->E_ea8|Mc=09+UuXfy_UhD z!CYLCdOVn$ptz6C59Z?Pcahn2=`jV2I{aJli{-^eTbL@v^E#$xB2WP1DR-rhabXJI$# zsVyKaKJZAjm`6ILuvS6G%oQvBB)K3(V;3`04ySY>Co&LjQiJiJ&zHrR@&?OyNNtck ztL*82@{ds_BOiJrBROh8{I623Qn-W=eOCaHV41B!&;^n)C znXCs;WWkM~L>AlzN@T&^phOnPk}5B26iZPBYp)s=bCCbs4PCV8Mq;^^Ifa;wQ*Cn^)IZnKHcI${XU#gM} z#Tch-NO0~hPF31Qv$&*J zi*ysAX5yM{M+-LuD8 zX);P~%E91lyKLWrdGXc3yo8`57~2)++?^NSvJ&^Bd+^&B8$?4|bn?Xe!3{s*iuF%o z(4jbBckVva+=V1j+MGFuoV#CE+WIsis(}sh7FaPi<)Cx-KIiW8RMh94`(k`&ptf?g zyN}bzAaK$O6>#Ph;bzvKsPBPh9G5GfwEAshoL#uqbpsZJ$8J7If;VqCN!O6A z@rf%~S8U!8&+m(>5%;kzp7_9LNu`Kw?>DD+`Hyw28G?F))Gk zs_fJE)qm45qa}34UWvXz$CFfhl;fAkB~wt3X*_NkhA2hxvfG59yN@>?T<1{Rr!wUUE~KJc zG+t>F%B}Z_M2BdQj88<5sJXQzFa8e{`n^;QJ9AzR79Df$?$?sn*O~KraMsCS(UH9r zALs6~TJjQzHxDi77biY&?(P{Zia+~c;L{l8P3WC-_gBq_m6x44UpaTbqr5CM4@~7{ zWmbIiTg-o5@h70*I(N@c?c5*Za|TwNv_3;B?R3B4-2Hv$e!K7NE;J@@KptH*@7(>S zbN3rgH=aL0O4H$WLkg5Pg0tdZ%F-#!%#BHEuaBIs(0C;tN)Ct5P-+O4d^; z9vv(gjTaEg{`uZH!G5IZqSZ;@9({jwokSmqni@ORDZHc-b3%N6rRd0`T1_ZdCP6#T zQ8v&O)3{e!iNp2MD0tY7fSZB2K0Hc`{m=o22c!lmZC3@4(z0=%_vKwxXYT zOEI6Dir7GFJciN6bXH(;93Z<{{-b z#4Fi})HrnwbZ+g1I$a5n{PdIS*EYBAO#R}d?__ggQ>?8s{lvx}HvbIn zQ0KLT*9H(z(1`E|el(yB(jE5BrYG>G+(0np^^0C^`!r@+i+!g$gg~?q#^4iV9Srbz zl4S&@?6vqOA#mKn+tn6cQ3yh^?awFzZr_7EpDvV5VYf=^UZeySi@~TMaK}4kGB=uB za=FPIro^_Cj0{@gwg-kJd1w^5*RHpVdP_*zFUADh$aDM>ExYj)ZDN%6k9wloI(x2j zCeg5ZqkZGK81csMfim_H7u0hNq#Vjk-)LX|rLs>Onu#H+SD$4_f=JN-QC5{W7g=PXEa`jNDic1=Fjn;spQ7X zG^!smP3u#LT>vQR&{k34sW$vytvpE|QKzJIrm<3OOhau7g>FJTpgUVxIqZ)j#}a0g zmX%X&DQACrdeV1Otk-`q$E&nK*Ts|4MxE*~t(zn>A%Hu~&jVB>gOZnsDW+0v9Z(Y^ zq(TrSiFBe3zh;yfx|1#rt#cfzxVS-hPsS?d1^DXHiZvyTR;&xMVar@BhL-W52Vuoo zGS-?b0Nsl9KaEz5*=%Q`9vFZH!=ML2*OKvn0Zr)6tgA~}QBk`ti8n7cB=JdESUilo z!`I+cCR#^Ki*y$yjamdWndlc_-{?&$EShuT$&P2g{iaW9Y^HjFa{H=b)0MG z&*vQI@zmb_>nfK1&~;?M8Men~T(&1;-;$ntU-h2YHtc~1r@Qk07`s!wz}gWv@{sfT zz`U;8o;iD-3*Xc-zbOuTp-#@z>8;m%eo4rGK3K zyN}k}gW>+#cmM0>jvG=QYkzdp75m?O;OGNIxtnkN`h&-=_{Sw#n_s!+TFdatZ|}JK zvyD0P^LGEW<=_|ZFZikI#Nl4IKK%PXH(uBN>}3tT?)%;Pd9xoXDSqImw3`pV(&zRI z-if>L-n}P!e_q?sbh;~0FRCKA(=F+=bq(=>8Cl{HXCzi48>X5C8wn1bs!pfL)^ z&_~$QU5HD)6`Pg5$CAW1Hjn-^QcfSn&^!^PruDOZCh1I524am8rNX5r^Dc{&<7CWv zc#<6V<0ocEViFjWB{BQkKlesr`Z1;nPm1xLWw&jK#83y`XC+g1=a!cvF{m3MXC$5kdtvb1 ze~H9E6@W>>lgy~++tHsQv{5(C!n@6SD*<3GzU8ZbL}IAU6=jDo=UkoH5{aP?R5mMx zip-O1rd$|_AuZLfRhaXqN#&84a~Sgwo)prnx>A-$V$NkuA)b_9-jd^QL}G?ACKpeV zbNQ4zO>``YG4%bE^5UFd++yO_FvgrZ--k1Xw2}NGGb|$CM}TXy7U4-l$J_rFgCr-k zF)t`LZPq1tl1Z~cg?$9V0e93U8P`Kl8`dpS(Xh-(I3rhNNE3un zIaGs$a@1PV!hVq*4JgRytAO2tVYxuV%#|GdlB5-qqp$G2T5|NY%rwzUMql%LC%@BP zE;WRYOHPu;c~Nro6~6CD&QJ~WPs!2O;o7Z&rLSBbAUXPa-t#0!zc}r3$w{!N;h8Bp zJvGj9$nnvH8b< zKcH?=&4W@hW0=_n4%IP&V_e-l23(t!o@6Ez`~!+EqilIk${}09>!%kv3XkFXrLn+7 zyV&4t>54F+uEwz|szu3!UTmPQTqaED%H@l}!R5qOa$_{VfInDPO3P6fRq^4OA&Z6S zr2;z(apGxh9WUx6G@TTS^WteAAdxCdF1QV61F4_zOL&P3Wdeos=QLS(MR<&_G8kc= z8Qn;^Mt71G<`%+f0d4gnIyPVPqrQqluDwDGj<}|U#~MqVVoOK9F6L8h)v(~S&nldz zE7Os;UMDaBI4`1Lq16G^N35oSvZadD!inL{<&VJ_6D6C07F#MVyq6@k*Z z@+9AIw($ht(5zNtYshAm1*vKpRP*unhHO?XgfoK+ncg+nuZm^As)dwpZV7)3*<$X} z91xaJIBc{EcWTrv)52{K7KSBN!I`yKjf*qp{gr%u0L2f130H`SXha7Xl1yYlgj+S? zjMj#XRnG$r$-sznK#Oo#CC--2Db8|XIv`^r%?IE#PEt@DS1V@(u#}k&euPfbiHH9~ z#~WTeY5ae*PI+R=gvrTRG?kP@>y%&Ob;=1_F&2?ktJykbJ9S@;CdxYHiZGmuPB#oY zWh>q&N78)CmSJ>EY^vbUI%BW*~w-kehEp~GlL%)iiXP)dCC@5^m$2m7!04r z73Oa&>K0U zKMbX(84d#*OA#>JC64mL3};37ZU^R$^8kS9jh`8=82mmM9?YR30!*~<(bdxHfGMHw zJq(Ss&E!$~eGkkX)Zu{Xfu9-fO@!}FVD6@_0Zg>?%Z1%!bObh0X8Kr<8cNoyukR9NgC~-Gsn^Fc_%O>;|Uc#e`$7N z4KP88i{@_~a5n%GBL_9T@NSmQL4{*N(<`PnD zm}upV#MA(DpTtG;mvGMj^WAB14G_@ta(r-b!2wLP{K!E?);|;TT9iOAl;39gwhH`S z9?SvZMwx={#70X$n(6rwn32Wg8zxCjc1LjVNizbh<^#Cw^NwHy~>GMOd8w1Syr@{Rd zxD&v9IFqDB*Mq0XZWeSJKQhtM`DWOiUuLni;zy<@erEBdcnn4%UO)vICR#lH4ZDrN zTs50ve6XOIyxU+Mhf4Zhs;FV2)#D>zM_)0F#!Mb%>qWq=m)L0Gqhz}Un17xIN6lLN z9F!&e$Y^?CQa(Julo@bl<>M^KSRgSh5D&9>5N=&JaHP-IcLPWA-tGpjA8`NZ2JRW) zeg} z4@s;QU^D%r{M`-A0g2Pv1rvE60&`5_tWo4q_&Oy9Bpc2T6M5eQ*K?u3M3YDL&H!MB z7;t9!yA-(dfY~W=(dykI;PwF1qf+=A4VM7xvA|p=aTGo?f2sb97pwROE+=9 z?k4V@Zs4dKKHLo)h3^mDz)^ktB5-d=td=e&`TIUFM-4bL{iE=GBQYS^n5AN*6FgHq^1MkuF^sm5tcN%#dK45xOk*}w27o5NhHQ>zBh2&iz zF)R>|XyLmUxQx@tqhgT{%mWfQ_H0F(BEP`8yCc`+<93Vq@@bhN}brAHd9A%%b%1f=T#x z0CT&hzy82|DKWxl^YCTE@+5HSO9U#Kyy39E0+_2LE?Rt70(UJi zU8j-vB5>!_-~@R5$V8LpMM87}Gi#Z^MGGJ0M*}cHiHj!hLf~$b7$MO-U1r0hcHo9m z2Ev?)pIQEHLHK$g(#k4^MU6)#tnUCOre5GEf6e4k_cb0ET<*sv8ml~a7_~Ii!Z}o>eGk;frU*|{v9zQa6{LFBdksT_xOse2uqWK#OyIH`@kvJ_LCVF25 zjNgDWtFMMb-X>t~lDKI8Qv3T9FfnUDz(muR4%j6D(|aw$^l}+iUwL4C8888f)8Y|^ z%LT3ln71V^n!oFT`x=RZ{Vg#47np?cB=*DM{YN8ByVXqaAyPO?*@+K?d%3F5xC!U z12+t~N4kNddg4$wa07t*tQ)wIzJ~-xS_y3-wj*|a34kBToJdlP``NWCOizrES+hblGY8}Y~b=E zaFPB}`rQ?Qi~PQo1Kh(AxJY?4KL0ub7b%b0GfN{qbYm7@!r2?~Fc>o&)sv1!0|=xU zj_R@g5x9hi{2+e^MBpOhLF3gkyMd$nFR2?i>MxJ(1}+Y`vE9H?yPw((+_}JA+6^4l zL$kYqBYj@lP2B2k;3%E1?glOeIHemnipSn=;HbPEGQ%0p69mMPjD-Fq4EO(+^Fy%8 z;J<%~e7c@xVsiljxcmfD)-mObQXKb78b=mL>et4}8RkqK+wa1%I|K%2_2 zeb-y61PZ~%mXY4r6n2Dg*gMqXK3*zzdMcOT6&qt_E1t>e?&F)r`1>fHDWkf&oR)O= zx0}vcYLT1MtxK(PPZeAwVoTNQ*r@E8tQ1edPT$R+l7ppIZ0p9Z`O=o$1a%Kjyzn2} z%EE#``@haXXr4#t5-l_g`WsWzLH(8~npxe&)HYD}F?A=XR;IAEh4-2#EVU|mlNFZ; zGj=k|UFWo|s?`t-csE)T1IM%j(7C(J(YbH5v#A9(*!?}Jb6-;V^Poj?J9FAQ_a&5a z(i7cgHP8+N-Dsfg20BL2&yYkC;7N6qI-mCRDpfo~Zl10J+e*up5CZ!kW&TXYjz#R@ zq2!^pi?MVMm*qaD#(~|A7D4$@x{_OUJGRnJD`@+mh6HfYuUgA2u8s z_*w!1qa_gN&;%k!*kM(w4vHBl9qP`0#}On2I=kDXqF5Kocrqd;xt z)S>Z83saYY+R0QtD3R{;aY>|m1t^j3D?o{KuLot8?su@1U%^(S`)8o;W*&t{@V)_+ zrREBB7KiC1DUBvYnr>9{$IBw>Nuph!44WTT?nLxNsXHISMG13((#jQiQ?6`GQnpHe z`l?k2n5ZrS&lBI`>%qy^>2Zv9?#5|2vDH02lREmAm1DF0BsE15TpW_21{ix><8iGD z99zUiD)aVJhf{=REGSw`oM_1d^%zs6ybrVWqgraiq zbEoZ|jTiqoPMNf=d3f;+>)J}ou$8T)cp{_vVVmY|N?fh_gyaOI=a_a+G9+2b)T>x< zOu@YUcUk>V{SSe5m9}hs5C7HNaA0e+vuP=yGBZ;- zYyZP6g_o(jcK9}-;9Tfmw`+?pz6@LbMaFjY-R1C|rN7h8U^HapZ6^{wEbPyF9BoJJ zCk_QZv08K2D!J>^bJseHbJqrQ*H;IM9Wm4f;>-;?phzY|M^BbTnb>^T*|ZY>8#nfj z@%Q8Fhk7eEWh(AR91|=~ri4)r?6Ue$pjl!Ul(fLUEj`)4x~!$>_%tk|2R5>ZO284;!QX;81T?Mt9& zpaqdZ<;p6R5~mDNsDgdXyR{l>156j-Gqqr-j;KZjr8*Ez;H0 zV2}-$+`_cSxkXA9zRYr@UCoWs$gZooQMy_-N{OhNAJ-ctgax${dmtMnYM;uct6@bM z#&K&2=_0CE4?+f{98SCANqD>Q5?TIIf6eDL45h>5JVS84l|H(_xj?A-SJMdNi|llE zw*DXr0QW__C|Slt|DR|AMdyS1)rUBf>p_X4vIEpf@M0}Dg8H5*Y7T_DTk$Rm+_|7c zv*-mSI#k<1iN=Uj=O_GPEx*R|2d1d-{>apwc>bHIdo@ZnmC6>A=5MK0@8z*QQj5BH zCOs=Ecp`E%SxlR<5-pjav^J8vlQ*#^Z~6L7m%~GaImpE>&q~GPOZTjF7JF6(J-+!U zN4-@P>_xXq_>dkU*DUa|d6(g~M|Ms1Ak%!zI~?RxP4rPvtiHlRBvU-jl%Te%sdZi7 zT?zjBr8eP9#{w#;*K+J|eAYA>JAxwYK=;y+!y?L)tl>N2^s3&p&{O1bC>9zs4_b4V z&xPXFJ8;DAyC`tP>g$1re=IK2#eIZjbdrJtZEdXoY!N^lx+D5BMu6Z{M|SLN!dT`1 z@P9FqVHu17ea`7dBNmZ4IiSRlx)c=cvy0`kGtOm-Mv5P^i^ZTmVQM`np(f9Qn!-G) zxrVWePe2W2>I+awOi}35G>jp zikb*A0zjQf^}IRgDb@1xIT94O=vBBsehH9r#zPFsMKvCUEp#IA0uB;0FM*p+Q8S*yfuRA>Y6G2$ ztG9PJ@TU1MfZ@vOwB4jMtH<)WW}>aLKicVXpuahzl#VY!7zq9lP&mMZ!1eFq+&Y}{ zc`dgW+0{6&u?cLnjH2h3x{X_ob9bV=#rXSRnoAYqUn*LSFL8V$pZCck*0)P}_d>=- zw^81mBsKK_5^Olm4BGB-j0{X^3>A4Md4?k)Rf!~I{fp>5h$A@r)xcdX@Ojas>9Dy8~mh;l2n6h;)oI#(?SlXp_P95#cWZ3g-Vcj*O z?Ac9dS$+8}TO08%fL*)Ej-@GE*Mo#i^!E+Nz*P^sV;lJGTUiJMv@;Gwm)c>mtKC_T z?4Ho^h?gq!lT2q4m&Qn);%P?shk)-@rwj1f@t7e$ojYiZsO4nP?+Cn<@SjLFw*BZL zKeGwpt{#>*h>vhAmnXvtJ=pagU^13pU0gP>__cJn!0lCsLSQw`_e5qzHTq9~~s= zTs21ArJ~c;(5X^SqoUMMXCw4D-33YL!=|4s$EjpAHdAMk?X0p1V2GYHjmxj#>Wdoi zxlB>-L-e0X_1{PA6Z!Ji6-=!H&&?EdUj=nPs6R9B9Z;eU`V^FC#5zHVsxKKBVVe$0 zHgTYYZHs36Yt8mi&2}Fs(XbuSD5_*>t9l~Oh6rjR;vjHU8bzBQ1aA|lSJ{OE>NTc* z3FlD0nw(y!${6hg!s19t1UlsV6{v%t}Nh`xB<#1SQm+ zPJs|gvyoBq3TD`>CSzKt4_7BHWjk(6xyNUlc;Bri6ECpfvBq zL2R8`r$0eGsaMvSlmHa_SY>x3+);dOwlypHq<`BQoE#VuGjR#F9y993MfIwe^a`oW z^|+WS#%H;$vyoruJvHJ$LM>p%1Pu3v)KqknJs}=)FVTON!s&H}(sDB6YMR zH40aDd;uXi&D)Y+UcBCqMCnIE-@v(g$yj0miN@&|b@`43+IZM~KCD$5^kuzvn zc7tk#_|ZiN4JP<%GY=|fzneEk%4XUhCYzA`ENW|`fi6q*(c{sabEjj9OS$w@X^`XC;r~{ zLw}qod}OF?pY6b&4a2^8?!>=v1;leUmD4>W!|yiJcqOSUC_H?oXxZ(Hn8_Y zvT`=<#Z%ex9z7@1>BtX*YH@$4*ZDMFOIAuIE3-aS=6#a>GF_>V=AF`kJ4Mo8cHZ8K z*w4c$>u_dicORpFIOF()JKhe;f0ouILg9!{+tLW8vx&~02<)X!ochgHxoH<(aO8Cp z4ZW3KN*2Z#zBJsU(sAiUbiTGyKINi61!o;!cXvxBx{t?NuBIvhCwq5XmvXpcXJ`OA z8iQLNBsm3kC5A3#$#OWKE`Uzs9R0unM?1Wy(vXD;`c8u79N?jj{*pj&VHuox05NU6 zvbW9o%T_C=wiejt88qT@pOkqVM`BT_;y`7ZTjLK~A0U#QTS$RrA@=u@lOBW+ncypL zaldUyaLG;Av&DC@l1pE2X1$%h4_|L`@%83C=N@>ZQ~o05{zA5=?jz{(!a2J69X6;Q4%xk(Dv*u&B25ERPFh+LPx{8CZ}@f( zl5kUS?=LBwg$JNh8@_cGVT?O%x~e(}%6rYNYx{1BhtS;gy(DP;ZWI!=WRX*<$97qr zO&|W$)g@ystZ~9LSc0YxjL+f?X~0#LJbRvtCS+K`t1i@BT#(@xicM1^oObM|{)(~=`rK{tKbHETa8%;~qL%GEKnV+f2;E9^82$ZOGt_F1n-(aq&(!>;LA2o~Y=yk=MvJXXFKaof@GcTe{J*O`@V2eQg*8)cM;Qw0z zLobtNUzWg2EG^R~!*C%}Oyns6-VsX&EhguzdK15^$J4BuyRBHk| z&f1^jrSswU$3nVjFR7RP3l3ows3}aRhB(0?Q{1a`W+W#UKbVhN1i_huvYhgo0HUeHDu;nec2aQb0?6phPKxoN zkqNr@bcoM-pn&KDizHv%Gl0;o8VAd0Fzp+GN^qzyo^EBbV~l-c8|>l&*OI`blvZ5y zb7LzOPf#-@XPw*+$}wci)?MJX^K>u>OFKO*!L8JS$T_QaUVTCA_N|}LKbZF1*&_eu z@;{RaOpc!EOjqEAA?@P+3&bl;$xcw-QKrTRucg{GxRokfC3{eCD^=8V82l`pr@nSf za4S{dc)^t6N;MdDI@XjV$$3@># z(66urHrXxC=8y2AxSvG2RV&HL0H|MyoWK;?Hd*N<-?t}R+Rs0@=`COX?WNXBr&;}d z1FbQEwwR{3{9oXvu^za#LDtsquDQC zKP9d!*~oP04KT{)x^oS$CgRv9N}}tKL{NfWP;RTUc`M%Jhry-L1nMF&GRRY))B-aP zd1M@>isCN5Eh2O%7olHKnmgBx<)G@})k9|%Sp;Yj0%Z3k2cDlx`s6>qt3myiU=PX< z0{;GCLMeQh<7&q}8n4aaa8o~+x*5(*vhDL zwGa|I-3f!7&9gx*)ozHu{3W^?&ZaDIaSbIevdL451_g@?w;yQy^xE>q@2&pjxQuG^ z&&W{=F7ESU4BIZR1Hw&nXbf`IF>Ef6VROd>bCb8__HNG|!ZjbaqFoBlriw9aZZ9nD zp@I^?g+${6YfdtpUQn{dS!g7@zuP(&*(#Q1<6=t4z+|0!Yg<4;B zH6J8fosYna;#3Yw405YM9Y;`NEw5<2P~E_?cp zd%;@&QOaSjX~=1c!np2tCeSkWphOB^1*)10LnA0rVNtY1h4m*;A`NL~xF}vsx1?n{ zu;k)E7bY;>j$kI1NmDq~8J3h*ZSFX*cP^6If~6VSw5L6|g?Na5)Fo!TW-JlzM8Q1| zlqk3tff5Bb8I&lv2p7+CNU5RUa+wLJ1p@) zAWQV7{Dw(n(>&nF=o76Mz@<>sX`nJn)vd&B%C)pT}~r*#Kvehdfo zdyaF+oI5Eo?>QKaWu&wYpFCCPEqbyp3TuD4w(8ZhR`IM)_h8klXKm1fRj(zEq^>QE z@Ic{@5y}pt)7zZIZ9!&;j)%hY71U!9#N^;!>VB$IPXpOAIqK3UjppwmwL!or0?%;- zt_AfhQ@4Q&I#>ON>)2xG6%0XCit0mtaAbb7_pY4v6|S$2-o8Sd}H`UOM6=0bGjyiN@GN z6JJ6Qh)~nrk94}KQi=Yp7R{b9RMY2yM{8nZEhV5nX4~1IL~_t38&PbiH{OSFji7on z)dVV@sco9AsKf9%O{9g72B5h}kAWCRy@hcUI{T$s!eE{=d`kj8$EbZpwAJ(Whrh$4 zP}ALHpejy8p2o0)IM`D_oyC+Jl!*K+P$KdRKn-ErMW6;VwFK1JOfA=Jwd#?2++n@z zEZIMsqMYMLM9jG*zBNPaGcC~+x=n>(>=fuev)L3-Fre(NPwo0W(O zvw86wtI$!xwN&Xls5$m0Ovkz?wSSP1-EpbZ)QP-wP-<#N9XF!PrrW)-`c5wjI8BDzjY9Lco1qfS_*}PCpu0rUgM!#be z%Kpd*jW%0;>Bf!XSlEr-3EHPh+T-A&FNXh(^^){aRwM=KP+tx@)oo6uNNGe;Tnul{)4nv^;oTRvRbv#}gT4URsFnE7=DjEr#%t0q)hHTS3Lmw}IU1X^ z`mOs#M+M!*c3gA`)9w-zbFM)Mp=Ey$JVaLz1a1opHPeCNc`+mbCZyC}Uwklgi0tQu zS@g`rtQ03RuUw#Oc>CZo-F$qAhz}Mdbi}o1aVStapFvyAu+F1&R3VNiRs) z0?a&eUWWO}wJurcE7HVGkfJ{qUiTOqDuhPXD--?;^$OQ!QI?+W3{5e-b+_(_2UgS_ z=YkS-2Tc};Vv+;uXC!~DWh$sHrl?4WVloGmC?@MbiF%?DR16o1CQufpwt=uRb&X~# zk~XEaofN>*o@u9l^bwT?u$h<(PQ>Tc?e2IKn3pnp+qCYyN%d|_;=tZpAt#9%l#N=| zfeG|PE==;1urIbtd}~r02%`kCFh%bz>yzuLkSsPTxPku)zMIZFiC)cFkS{W2Bq)(7G|B(}koO+&Q5E~!_-=MdA_;7OD4{4TMLGmR zivih`O@TC8f>M@{Y#nnP>WU%9%4ohRMh3Erb&2SO0V{y<{-d`Tx0K!(Kbb}H~tyB6K|)%g4pGXi+nA(JCzpshtrMTGj`J+ z8rmi6X3j$mPU)S=j1ZPhg*4U+nY4 z9w}dGDQANf|+m{wlwTe--z(&l?* z75q1Cqe_N_3;0~<`>okC2!AmS>n*mW;g_ciH0Gt)s~V+F6`+T}2MD^^*pnjmL0+jP z4y22{J>iI+!>ev^-I$N?(CEqyuIhj`TD(?Vj_B~Wh*>aw4tA`Gh9taMSq;-?45Qbq zz}v>#4BHRvATxD^&fh@#!E}^iPKhmqX%EA8!3C6s|B*UnN(3f^o7rHIr3r$yn;IhC zAd)_l`9N;kk)~1CG3PD#oyjcGB=C*T)W7}6d;)|Ti`z?EsIjV$pP_xzW_B#-Y-8mHAR7u8O zLHvs2Hqm76%FQwUFy3)viKD|FFh&QAF{-gtaST(R3#k)|(m})?}JIJyXz-Y%aHok2BP? z;TvPv%-zbxM8t69pr<3-Q4!|1Zb(+F4FoF(&~p8YMYhqpfe=*Zzz0h|fBo4zb2rI6 zpPZ+(aMR^5@xj(miDgL>&Ck&io^X>JCSF=q5`)3CfHaNDW$9z7V@H;(V6KS}oD<6g zGuj*$GN+a^dtOD54W0=!uY#G|6!|8n74nAq9}q^N$hkk5j}p6F`1g3q0p6+7FqRfJ z@lyzN6++52J`Z-&{%EiLfw?P)J@=Nfn1(a4xET&-WHM6^nCQC*oAHCN_!gmYZtYuy z#u+PLAU3cw(R8(FfAD!#yH`Yf<7Tb=?gv0Mu_EPPm~HquoMkpmRE}b%E->B1!lU>3 zfB@69rB?aD;bUqhz}Q(H!72h~7xeAnjNPcF!XuJh-XIppNlO}yLs~t5d1f~j196nvPRezxPAvtVS zYT)&aMqi~YAgY_Ptqk%{S3-DAq2lLJruJ7x6dg@W^MY(8JrmUVLHX48x_Q;-W?R~)=si~--3V*8 z6LXxhx5sXrTaZHDV(WC_Xt4-()hJ}6C1VtpNnu3?g-J279Pm%DuKtylw=J`wIy(I3 zhHKe@0!XzcV%m0w2I4*FBL>wip2X*2l8uG$L{Az~MiV`phXE8o+mR7oF!1$AcI)*VfG3QlNn zo>QTnzs3T^@-o|&UD%wRbnSC+vb?vllb?Am@>5vBcLIAI(nl)=qu46l zCfpByN+}qCg~p}mFi^l`)r5sC%7>OI=PdiM22iXyYn`&1AG9##2P_-=&>NQYy6vtV zaMVr7Ig4B7Ew5V|u|QB|tH&}pe~8LC(ct`{+?f;sYHuTl@n>H)JUPewG1~%zP4S-S{oIz2YB%(WhWYaXL9N5-Z`S zMC0Q4_DZrnY13aR^CH$yz!?Fo6=&61Jy0u}ZDv!((#lPX1=ZUdS-Od)>Jtv*^?l;$ zjA1d#KfSS-)QTxLspI9ybG-?X)DDQvB5*o;8^Y42DStYV6Qz&p?3R6{0S5cb)& zWJK|!vwUa6ZR_a6vN-R?wl#HtvJcA_Nj$}SmtaGOPZ z|M&p_yb+D5Z1$$P4)fcoBl4T;x+2s)A^d&`va{OVKC-GM3`0X%Ln95Q*0Y%1I>m_2<>^+A#F%fI3P+ZYXST#wR z-dImLMGEeNVghGODDf6_F5Ejp-QQ$w>JJYz4ny^U%?o1+o8P56AIjFZos~?$4^*#u zdU*;I8N~&)Nz^2KA)_f2d@CzC{n21 z`;!h})vNPVQij!bH?4Z@>D$hxla$x7=EoWBpK*>YUS1padovCv5xb(;iyVDucgZj2 zA?9T%szOnB{SZ*}~ZCD(u z*c#Gf{p6#~pRBXQB&Of2W&2xee<{8rh}!DihoIBy_6kSf;|roOLs@F2-9f2VNNeUM z#nMpNtmKY*=Uc_P30-w!<|x#9$7o0;`X;P!j#3t2ZFXYKD9S%tlL^MV2n&~%V$hL7aENxo~TDw?_OE%1+JzyTJc!g1W0Wn#FO*^lo=sSYhk^dAO zfmoH_hQgwi^~^`jN_+O3<{qF}H6xL7464q1!@$0_6D zl$2N=3w&(|{F>OnHZ;f<31h!Nw0wx*-D-YQO`t4KIP9NsmYNYZg8+%se2*(oMq*=l z;>t!+1(U?52;_`^JX7fxYylm#PFqr7IGTf8~owwJyFr9(Vv8D=` zXo4-)v|O4Vm%ObKdtI8S{<&Bi*%hYQ%+v!W{)##brcdz1n&^|&d(1>_<~_{hhR#QP zYhn6=VI*6;trt~HH<1{XB^e7M)$rPqO36}|!u7APCNq6NzARbKa&$OgsgYlm+S z-V&*n2Hq0+Tc*gxKiH}u7OwD(9T3A7P7(=xDWR7^USJNGba~_3PCwBrvNU4{*CPB> zg&uXpwwB~bvGLW4jrEKTq+$Ci5U~Sq%VzwwIrn1U1bGDIuipgI3#(u(_19CS^l!Ke zdSg8e7pPTktbZCNQjPVG3)9|u1*WjZ`kV0wFSJ;AM{fgs1zA1K?w0yCkY_QcnV;CK z=VPnlOe-SxGJDJ&2gdz)W5HmEPXy5<#b4ku)?$ z8&R$vmCzeLw&TOgQBhdczpt5wbqPC2r#D^)T!ou@!juRTPZBpFkku!wRvf8Leu~Ws zmy(%g9;oFn$NEp$H>^GPTXQqcfO&WAj+ISvBy4;U;7KAMj4LGcn;K|BmaluJ&VDS5 zqZ20HjLm^*2aBx-Cb_1z!5M>X<9srNrMS7q+8i&2)~F#dASW|toncC4CL|L57!o8G zr}5t0$F?4tJY6tE=DVepTgj)H{z!j5=5{FiX!=q&ONk*j`V?=ZD{2Sd{InqrfhZA^ zlzS+feY;!T;d{rF^xDe2W!9uaby+xJSv{%)uibFn-=<7C=ie|2wi0oNzn=W`-%3GDqb7!;6pJYGMkWg;KJ~cbz_^ic^16P*|(?!ugTal@qMcfM^>H&xKedFu^+>m3M!hRSBedb@vWtn#s99{0|- zG(2%))3m2MMxodVh#~Z%QAxk?qZ}~~opF}$2i%6&YClf1n-P8d0mP&sb_O~$lYd5Z z(ucNneu`U8q*yO&hKETXdip8TH=R?WHz`X;DaoUf8WG`S8r-JR7SH`jjoe>ka8s)n zkO3xavF?vqI@*pn`ZmQiDrq+&kv=*p1CbEp-=2sBPlbQ60q4*?yxL_4c zu$U;S*wj4}!(zVPq8XnuNeDz8hiF51`O=Vukx4()4ac0j)pEM2)%Hm8=LcKL536x> zM)TN(mp53S2ZT-8BSm$g4~S9z2>-%J-g}9rZzM=p$->8b5mT+i-)Q`$$auzsqC%baii+xD;UIsaGc{|H(=|CO$2pN%S5`zz8@X6nSzYDwlvTQ`y}Vc^S6ACBi>el* zRLIUQ?CR`A6}9f7lEwD2DrAj2$-dBSudb?CY_Idy)Ku4c?7d3tHSSs-7Z)o+$~U-S zrK1VCqPn_T$Km64mAZ7-{1Ifr!BASjYOk|a9_6P?Lv1ISP~ zF>A8ZUR_J()a<-T&NS1|K|=-&89ES!O7a44O{FDvlRc}-O3as4p(l{I2m$&6lg+J7edWL^YgdR3GR z>J>i%{As!FMIM4@z^n!bvtR~!IKZx!^q5{+-|a=kp0WjQ3aqs$tE$dj>v5OxoU6OC zwJDj|27Wh=D8GB<$F?tO|K9LJa^eebt95vMW6zV%9C+bV(d(^fC}bo}IZ->%C2vd4XeFQz`({iy?AF8`?FrJG0e?s6*X%=ZI- zwcWO^_OLZAsp-wFHxJ#@=H{{N>L1uReF%?(45VU>o-6k@|=m?rgoO-?^;oqfWl?+KAhV+x46~J9fvwN#Wy* zl8-eV>iy2i%4LV9e=_#{4ef_6{^-V(iuA`5PtWVz^osIf!NzCbzy68yXHJ{0emuNt z(6!&>-*WfFy{qnPoiXRtZ&0Zn|juh*2N^wdbOzZh!TM4?d_p)n@qvm0LT1_(<3c|83@_i>r4BPxW=b`{0W+qQ2M?F}uwC z@rdxkJHP93_mq3*U+H@G`hz)>u9|uNHBl0 zt@t(Tnr$=vQ)a%G=*1oKG0LX3Wut1|B)F;nwc0lJlA$?Ks3) zHtY3czkeS2kEd^&m9WBpUD=kfs>tz)mYGl9)H=KRPWNAr-ahr&$!9v}Y@0jiiCNz~ zYjqCp7$5!k(doCG=)Cdp?~kN*8a4ToBj!sV`SR^ff6w}*e`L&*9*-RyWc|rrHEZwd zhun9+a7X3vsU3fg^x};sl=IJ># z^Ji8B*OU5h--+n@>F5%b|7Lur#N{8lx7|OnzQeOCH-2~Y%K>rQjube)IM9B>kd?a* z?L2tj#qI8GDm#74@8$d7-nVbWuM>~F{?YMmkVbj6a$g>xS22 z-%cF5XZJ0Cn_e0|?vb)f|Ni!K*M2-|nVSDI@6Eft;MIihr@ql?YUVBF2XAU~tY**A z8~jgAsrmW7)lp0QXMO8`8hZWVSp%>6vS3i%x81{sWPG1Lb>t~m`dg-My%rA)yXNno zCOkGW?zZn98QkUSMSb_AguT;g!3V#soLZJ+dT8Ps6%}27zV$@WHP0>0{cGmZGm~Sp z@AWr*IrwM)yRUTnY}L?Si;h+us9iMf>8WRv*5}3TTmGZ(sVynH+I)K8_Hj{4t7(_r zKXJ(Kji=jP{qqk0Uvl1leSX)MUak3l@6Ky~|Ea$7$B#S}c1OvVJ45d9j?5)xXZe?dtd+P)G_uMc~4GEn|Rr8$96PqoN9k;o24#yP1vo^J=Ht% zo9Nf8hDF`g{Opq3cQqb}uo!+;FC);CT~(c zh)h1be64qMOxHIq8*$m?Q_ozz`QZ<4UDJ2jqt7h~ZyG&u@cYqQUK&1XZRPlJ*KBV3 zYRR3ma)12t>?`eh{x+iF)dyDRUHAL(tUUYK!D}|ZFzr{hUvN-wI;gDVBahYG+)T@_ z9Hs6e&!G7D8_eca92rzn>n`>zaFZJv{#wj4ROj;VAbtnmBm!u7YcbQ5lTqP4Q>rl2 zpxJe_po}RRg<8xs_B5)t0wNAvY3@}d|14&81l!Q}VJxq)wZMG=*a^XONEP{l7kZ zpV1$h6|tDppi|oWyH6GwIkc*U=MVXl`tb?8!Uo4Dj&UfyWb@>MdwLl;wCKcQz8C~5 zx#>$c^)Pa1Ld9af8akENmIaeajU1Y7vY06+DXdO+Z%~Y!u8dO+og}h)Nb8M84oyMv zuqa(mESTyxa%hSUH4Xt$SQWFIP;6w<<}=M_2I5n_Y&9}9m}6(0FObQX!xRzM7d1DS zLpA|_LZ_=cf|x{gKULAl*gnBraytN;=y6{gpI|#0y>p@*7@eAj2sjp zIBI*iAj;Cm$hm@XoTTIVt=r&XMow?WDTGd8waMw?HFDrJ!kR=n9^01@|1fg;GR_0g zTj80UbLwA44z;)zGc8G{u)2OV;~FCeRae7FT{11f$Qi&mb?}7p`TKPwMZtMEka5x= zs3eOS+xCY@`yj@d51r(BTa@p5qd$XnoW-wCLFX16Ry^a7G*Y@IHU0RFku!vGHbAHR z+4`0V1<3r-+)g``ai}#T8&X3I?L4vr`7;O+rkFWzyZt$1SV$^3K6payp>O$PPa8SI z8Rs+T)C1kv{uflZ;B<{(9Lgn9N8UYg)X1T^B8xc%I_2T~5nZy4oKcKJ5<(#yx#77G zVI?w7Ep+l{!kSqj+SMx=C!KUWuMM30qA@J$pDpGm1ZP2ERS0<|3AC8MhE8GKk+lwj z8JzYpjPpEn%EKXRKHX{LT*WwdK)(pjSTo)27VOVh#!=&Zr1d8!jT{H#{0_Y>o~Q16 z*kj}*GtS-6N!q>N)PWit7L|g<+ygqPokg)B$}1H%7V`ws@ob5BWVg|uG{%`MIN!WB z3f)w2SWdf^#T`;DAj*jUU}(5X$h;mgk-Fmm!32ZhblJu`dEH*)eBhvgDXOMZXn z3nPb>xEzoDHhfhG&P1I*t3Mxy=m)2Z^#W!!tUllFUTNeo$uX~mQ>r_YYAt7toGC0U zl0i~~Qu^O0I2!pWfQ^3KJH;SB)N@(P?VyL@d8wconZe?$@dv}oAb$!C{#?yC7mg3Q zs~~@_Hu!^~FgVm6P%I{V@0epu`*g-BhfeL!wkOWojhq>bLsCSX%9J+8jGUQ_69b*X zGC%wv8e^7r%^Q%5ai}JeioM5^YUIp{;2tbAJ`5- zHBCD{MDc*5#^;ml755m!n#(xh&`C|ZCgO2pSY@!$hc(v_7L~Zgya0M6o_DHmh9Izf z*2EdjXpleU27f9ThvGx7`8#8wLU@BY3mJ!UiQ+Ti$c^WX z@ma(;S~*;3h|gliv6GJH-S)>F#;{Ng5TEwYN!?m{5e72B@mUHRi#e5aJlnR;K5FDF zW1Q~LDP8^kv8J<;vz&2Q$-?x>yDttla#k?TtI)}xq1GX%jU03jh>r`=r1*UJ<3pem zTU!TLG0uhac{StogHEb##Ph1GYRcNL#N#B{?>gENiu2Uyq0mOXCa$Qqf&PoIrWT#h_bMLU9seSBWE4s(0Uds*QT^F zXe5HeTF*FCqp2@A_t|_@lwgjZamGNWbd^W{)@0;d$2b>mHx$Ov%Ib9nS-qZdxwZ)u6I-cFz)}!cxd}8zm z%^%{7!4p&OfB(SeMt^Q$oYv4Otp3Mn<0OlZrZ2daakOP|i=ixTV;mZ5k-Go>WiyOn z-3}XznMP$qyK(WS_(P#;=NRu`9Bo)u7M9E9uC1-AhAk;O+_~yJwI$vf4sb+#qUR9f zuJ%9ltdflQLf0D(-D$QXgNk;r&~tdPhx0_h_WoEFKHS0ai) zN+fcJKxRqgQGpaoOfh0;~ zo^769QQ*k(ULsP$F*$WSK-h7KmFSCj_!eBIXF5uInWd zEs#L_9A`j!8jv9dWQ+lE8IUCgL@^+LF(A(vkT(T#J5s@`+Ghf}O(H)UT%9){HhS4( zN|nQ&0?Cp2Ge#hJ5}7HGY>6xuNUlU~6-axDJSq?@SrRh;l0f_tIV6x6iF_xJD7RXqMEE9-BB7YG`TZud^5Sv8a5J-|lP735IiL|Go6I6;s z`UvC_i6jf8vqY{DNJojx7f75$HVWi2i992aDH3^IAPo}vRv-ZhXOmwnj%r!-jbcBc zsYt2;nQlP524s@~dCY*Y1NU{Ie`?^IF(8*j^BB&TF&rY0K%BD;$Xo-m(SY1 z*9^!%4aj!}Kk*fp}Es+9&L`kGVAiOrYD&3WJZknwkMQuXQ z?A#F}VSdC+EBW!(#*k4k-K<51jQ~P#Y{bF7j_llFy2~!Z7^W zgeMyh3oBtbOsjNAJbvW~goTwr{?N<^xnjtW1ej)Pk)agBLwG2`%;%vL!#!GL2qDBH z4)=%RoT5W$#*o4ZaE9X7WG%wtb3G86{ott}4!tExgoRH25W>P5N?}dWA>@kY%Oz(B zh3>(VjEAR!a-&3x451t&m&DBAMe`4ZPq*klGGcq-YKUQHRK^8* z3%54S+4WU?z|}Rv6>;>gFmgB?j%UA-q<5l8RpejtI__&0rDqkvRbG407G%*Wx;yLteK#oU1` zp+?R=wK?Ewgm6V1y{o?h;VTkhFg^a@x$Xg1#ljVF^sXLct~!zvsH2B`sF-RDHw#z9 z(YtyGNZ>2^*&F_PIN<7a;fgqVR}V8+BC|{@qF%Zq;L0SDOB}tcN0=+My!L%!elg&x zmvBWKy{ku=D|L8ue2Wc@q?)cN!WD7!uBb2MUyfif`J>wR3b^tLSH$5yJp+VlC)GcF zjr$uRa>c@}KkxrQb%V1Hg+Ij6hyFNo)eSnSaph;{23$pp3?Po))e}H0X6k)O?JBx| zbHLSD;fgqVS5E>7eAB!&BlE3*t7XC!arCaxaKM$Q{HBa$)tXwcS-2vO-qq90)l}%D z()Y&WBb8bfdxR_E=v_SnB(Mr@;WO9%5^!a{n0!Kuj7RV4??Cu^NV0EwC--Q;m0h?Z zj^5R?%vD=*0=4>z*EH#xCR`Cm@9H@q7P*@D<*<09MNQXA;fgqVSI_HQt^U5_o`9=c zge&6cU2S2m)ECGzhaQ|2aP_!wMI61Wt<04fdO)c$+%H@aNAKzdAc1r_7d;0dS6v+u zu85;|MZGLv)c}KO)#)e*o$BhOa77%wtA8+8REtQBEec15sjh67aFjTDS7-tdRx568 z@;>+-#7A}2Pq-qE-qlOYl{)$Imnn<#1FlkpE8^%~z06#NLnjq?g9X{ChBaNdB97kG zb|4n>W#k0v3-8-E1YCKAE8^%~y#gfAU$i~_44Pgwtha?L;^hcVfU5 z`^*V+2Ohnvoj?LDz>x3nIUaCzh3F87qj$B7xe`+?rs(3{2LrCMg)8FdUF~MB5}=dn zc3^Eyz|~ygia2^#s2G~uNE-R-BLP=03s=O^yLy$mih)k*+P;0q1Y8{zu870)wM`tO zF%A9{&z)B{Vi^0i7rMn9uNJ(d+2H~kP^%J#R@c;-Tzm)OoQmq%MHQ}MZ*48@aHYME zE|aUOtOCa3dG4wbSBblV1Iz)oKaL&iN_Dv66SA_Cb26Q|nGUcWCYP(Mvc~1Yc8LWJ z49dmNI{3hUVjCpBq~ZHoNm;cE`~C32%2i!M+a?hgm%#bHP1k}_PM}D7J%~$jMRlFK zt{M^YNKCwcSC^I)EtX(iRlp^s$IUkCA`P>>b6l0xC2lp{9Pw6(-IgLZSn{z?S7nLq zt6JNVvN~+RES{@Um=nYW@4KG4)g>xSh}d1~E)jNtOy^Svh!D2JR#%l3tFEMHRo+S- zsB|N(DvK5cS@HeEw7*#OMbURPTfxov4&04T03p>SQ-d$ zRaKXkVH+#<7VA8sxd^Rewv#s)a4*6J?_h8?zU9s{ph%^stjenoWKK0iF4zwOb$-;j zD@t9(vx{nFmT8JkFOb?K1}BT9HW+02K--Dc2p5$|nXGkJRxfa~9n-a{HLKk`zhOk? z%|<%Lq{=Db@WVFH{F)%VH+w zkq|T@71T6oSt{nzWGQjgZN*wH&)-Tk4q6nS{k_E^I9HuUcF3Crv_ZPMO3N1z3HWTc z%uJR6YM^}Ax>lITFKVA?Q+rvUmPrS}B1$$>=miUnO!&V{dXf3#LrY%63i8o06aJoT%fvs}=-)vntKA ztS*4ksSUh!M47p2%4(>Kt}Lr^&2<;mpvT3=cvNc*UEhG?{D$!SnJq(ims4UUPCUrQ<4OltdCL5Y5`q zU`tVCE-7`~ZA&zfl9sGlgQLckw-_jv1!c7!F9c6#L4_020_`i#X>e5s%8`2{;h?~o zt*-3}&Q7!sbbdw9AkH%v%@sy6R5zF(ffG$AqTCuo(hB-em1fw zv9Y3o$XINBSFjh%hSi@SznKNoLRomLLRn!vQQ`_246_Lp471=Zd2rO2)xsk5A0c88 zoLH*ZYCG-rcxzb3@b-tAj25g|b9f=UIyc@b+^$*-1X`d~qWQwx0ErzLDXR2WBq9`%{jkHkvP>C|J*PhrTyb*XcWiB1$BVal~ zXpXxAN4@CVbPY~YhVORL$$YQdOI;7E(rgTXlXir6+)lK}JX0@V#T%xO1dYEJsMLm5 zLDRF$En48#kArZU51nblUK}BW6t3`_H4}?jlcC0j<(Ft0>EI-^HL?lUaabi}>E^YA ziiSBBwG(ZMc!QN`(*Jg;{hld^C<9c(tEsIncGuOpgtUriv9MK&IyOQltwJ;!()^UY z3~L98WXuHW>x;Y2j1wZ`qSx6ybcss zSI;YRJBFFYy7KsI|0GX!ZP6UJW9$&jC|qEAz~M-AB#IPjW-bD6QLY*f8U-;ek?ly! zc4lQHkIQ$6N`=cpT!^z(T#t!Gs zXG^!)j+E?_+`OFJT!(tV7xO|AQnDSn=@}^*`Kj3=Y$hB*=YC0gwj(1wEqh#Ma$X=R zBzM)tl9J+dd4hN(JM%KM$&&+h>Q!a5Qt}=7dC7Tcdi-Xr7 zWEjd)1)`(ZP?`9lV0Dl<%npjkox0-xa=FKoe=yW+ixg286b4yyl=Tt{pZhCr7Ms^N-p3J3gY|k|2Nks|DA70>4I_V(C zk)4}2E+Ze+pGQDFtByj}uriP>xf$bA1WV0+9cxrhc5X^m7Tn38r4MOoj`5ipS()Qe zK!1?r__4#)`l-fTpAXVgG}dX!sVMZUaSruFJkiQiS2iL*Om?K^W#o>_P0ey7vr(&_ zMpN#xgJxZ`Y4C{QqwE?rWW35oFu2_rNhj6>q%M~nbAWJvtTAuhsplWE?Z zS$B2fD|YCkgZAts`aJ_rPb--;s&$OIQ)iNj(ighbK|F^kCPjN55pjFsNo)mw@sOhL zV-8ciL%XAi@LW6(fb*l^(f1R3O#ZB3UKa3H_-c|XzMQngyAr(F;M^s6^c6jne}w-- zaA0IA6z?2tXm$EF@qw>Belwot{3UWs)|Ki9M*^T6F-WgwR~2FO1<3>68o@O)9`aAK ztBiP6cs77@PVgvuLdEYb;Dhkt?40;`M&Ii~@pb_B;6v{)v52N^3%m`$cYu>CKKxPe zq5PYOh~ERw4`ML{t-lDx+Xmj92yBx0bVi>WL-AUJHyEBIQU*h{lnx5+8Np#hXrcTY z4SYLzzY167QB)KhO?`+sg8yteB6M}Om^s0 z7U3owrhM8N9YzO*d*T}Ep9YxUkRBrAZq?JB`;?^4iY4wx6!w2Y#ftqsDWx*LhCKDP*1xl_q#jQP+BVy8Z`Pn>}rC z0b<~8$>uFRA?e3pLsygI(0R(RtMSCL)s^_D4pTgI7c(X7V3%k+ahHb0w(dh<;;Jd! zXG+)P;FM~dpYA&g3p!95$FmEsae+=lowzx#VQD76ApnQBKf4}O#wj;9KYP9UW71rh zOyv{laQ6g$BNXm-5$NQC<^=A6Z%^jh)2^9|+S#`HcECa4Zkpz2Wx9BDkh*C>QKG9L zaI&^o+H8*>3 zxlm>x>y@+9Li)pR;-;#=Gp+|rk$A#Q!=X>X6KkST1ve3gCz;D~Oh`Y=g-EG?sW|t< zG}cq$lNwXK`FyjteSyFJ5PmT^<6;g`7=RlU>{=TkXAtf^F|ePgR%faf{Otcoc#A8* zniq=8TDY0J!=)U!hoKGgR0I^wZB$u}q&p=j&w2XoFp*Hin)*O@GZXb{Wz0msE0}4X z#7KM`47&~bN@jWhdI~c=2c5fk87A(_ZkQZ+*j)gHbNe9v;-(t)?(}YSsRLBt>I$CRG z6EzAwAvnBUqOoKwYpx?+!VA1Un zo}Q>YdZc|r{SmkhfCn_xaV#ReJGj_{gYnvBYlg_RPQ*h1Y_P5AS+u9eQv%5W5*oBZObOp@J zQ01(MQ&+S<-qElYzpZ1~4Ja$e#P&x1FB+4BKi-Rd8}`A!zy+r){1-0=))a+{30pO| z+BJo(>@F{j8tf?;1B(F@|mZG=So2uO=G|2*yON*5R+rQM9q6P;&ftvlq8Asy|p;x@ZV5w#bBL z>4f?acIO4?4NkQt(Pdh=Giz~gex>B62t*?hM#tzSn!*wes~ubC0xBF+`Q-fO5e>PS z{C0cRlf;SJ6_Iq@z?Besr01D`fp{h~`+hTfuWa5zji=xVxv?hI-wtr$&~mF9#Xt>_ z2`#sxlVUE)!&O>9C?$*L0`;FcR=UG|96`J^vg!T}^ zdJCwy>qmhj#$g5+dslyLmKwO*}oCoshe$Gj}AM>*@iEqz@%s;x-1;22y3oPE8Cb0;Fbse5?cAuM{nW!Thizn7Zzl)gZ9_Uo&v8IQh^JeC8 zn6ep0rMw(ZxM?T!nGBmR zAsB*2+w5xW!00C)4B6jMQR1>1?Y-=t_Nd}$^HrITra@T90StJoc;#JiG=QG*RhfaMknW);uni8N> zrHp087YS216Lvm^nTp>@%(ezPAHz^3TZ$*##9B^f+W?(cKI$8I<+~52C3wP3RLpz~ z^Ab$Fzt}HLtRSO(II_bthWhx^^*dl^^$ad7H#MxtEVruJhD&q3ok|nysk)%4<*&G^ zB^${0fDJ`C*5rWB>pQ$(?Tln%avUIg@8-i)*i2AG2>n4WXmdpm)KE|96rEh7 zGnyqSF^*CcO(}}xDN;L`fcIRY(Q&RqTvhQlcpqdRElSF^=0UhBO}vK+#q6yxvn%cP0=zY1ncL$oqx+5w#lY$Hs> z2sa&s&fQW|xDZdQ>1*iREw!=SZ7Y-$$NIoTZ8;x~@xF2kTkn z#jvMf;x2Z>#KV09CLYFdn0TN16HGj`-=r+Qu(itZ13*DT|eMy$sWSDrrP1mGx zpL>;<)O&>7{bv=;fBdgMtM>*amD-=%6IIbZd*FnrUHiV)|BIQm*)M*5{zvtGp)~Vg z>r*G5-hK4FgzAfnPOVD4uY0Rcc3$zpny}ZWr9Cv^;ljh-iRUJ|`h2?Ab=?2tiN-6( zl^kn5`j=t%yz^+(7w3&DjkH+U#om0aOEQ|C=PJI1_{y!BYsz2`f>)Wh?a!F?Y{FF!c*&c{aXo3gX}l@n$?5VdIVZcCe& zPa+4H`k%Y!;srGb`B(dm#sZY@>!eOzudL!Hagg^=)Yx!k2crE}L0o>j0Wn|s*AK4+ z_7!IeH&&A!b3s~Ht(dDU=;Z3r?~lR=31N!f6iKx*xC#eqF;kC5F`J(;et*CfbqJ)w z4X!ACE#1Vinz^A_so)q!GFRuIx5txKHwi-tvtZvS{zh_Fnwj{EU}I4aAu`?j%ApQw z4)Ptjk-*;k0USE`jNZ zIX3j=Fo`IVy5Pc{5f0xV*=)TTE*|8{j+nS;J&X8lG7&=RMTzj(;$&Zms2u79xKfedRY3aFmNJ1U zmD58YG@9gLB?%;Oc2l81+DXnbfpn0_Jp!R~NVq@G2_$d|(^~=wr0a77a>{^2aPJUn z)#ok-B;J6e8IY+4q|$(_F(5Y?kiQxbx?h$nHHP~H5;*VfBLnBS0Xbtp)UyWzX>Ugj zB2#Ku-3&;A0hw$-)UyWzK5sH`{$@blG$5ZCkkbaFo!ZUF66|k4(hW$l0ae(bRf{>#Up##{S;8U@u zwnAM8I3hE}nLREatHO9Na{DmWH`cgmnOmjXF=Qw$`fYLluZSRAV5?F!+k?lr+AY8g zppFg8`?2M?v>Fi#`i74*vfY;RbaGDOV0;TjAhP4@aw$cmQ=x8uoYwTrC8t|4uXbD5-_40@k9uBIN1C2Bw@ z21Hw}8KLcYtqHOdd4}t~5f|2YXyZhQ3vLrd;p?NI)>&;egu@H$QPDN3)QOgsRiK;E zdrNptQCSF-<%-(Z4Nc1*KMsr3(%EwI66)#I@D;o95bLq`l_Y+8Fe zkgdJ_vM)b3k;Vj}*4}p2j3?N*A;j9-mte6th{x962CW@E2HtQClrE*I1}GXcg<6AH z4ZISZBZ5a`xR!Xof>TBl6;Lhlx|nh9960yWWCavOHI#qEI|h!0CL^F);td8b3!FtX zApzA=I=%vLA2^TGgaZ`)2^DS|@Uk)Ca5YURK(*xGL$G@koIILTfTCe;Oa3X~+)fh< zP#5y=7&sefasjF(|7iB&HE_ad=nF+7%~0VIuQNCWf53YmymD~H(qsfwOW_i4DLDBw zApzAAuLyS6gYz%JYe^0^gBOLN^51B<3`H+iq0*57{9SN5(~uderSwv`gTUD+coz!y z32<_{Fz;FncP6a8;Jo`Mc)x*jb=N=kZ#6jo6g+yB3zgnP;O#EOayvYvT1xLA*v%9i zMugUqf7gTe>L2*m9&-N?I8B#v-&&H>p0G}$sVI#K749zByTH5L&WSCR$6#2G6&%hC zosK@RtojqY7s0y~ya|`X0M(M5?u1!`_~e060GyU zx&IG%h2T9dINZn3;Vy!ug$hrjSb8;Y!(=rV5n39=`(Img{sbaW{lBs1ycQ=sRFqZz zH$UGhWP|f8eKW^O?`(AipIG>$uoYmmN=U!x`Gt3LX2)zl26;MDd2Z6qU&EDM zJCAj{E7~Ia+Q~eo%I9W5mxbKUofSIFEpu7xXEdbc_lNK_b`{ z;_JMUI{@pQPVcmOp_x4$l!&DCv}IzY1hcfdrk&my>1}g*XPBp*k{(I+7pY%Y@kx9W z{G1sSSNaM{{p&0|e34}lGYx^hhMAT@zm=J;gHFF5BC+}9F)XFX!!w7v?C|X{d+h3$VRao& zaPBJgRtT~ZzxK3u3tMJS?KF>S3QYBQV%cX*V`R?w_J#egMrOS+GD=S5q=JOQzM=u= zm1IXD7FDeaFn+lb|SP);4=4 z%KYqP%ujr9pK5OUcQW-E@^=V|YijAHq%)qp|E}*(!1o60-ISPw~wh%o8ATs#(|93N(Dx=8Y$Un$nKbWzs zHiyb!ZmY{+w24@V7ZY;7hvFjvr9~&7!&~2?IFoJ7hcICui1TcIa{`lXUHb?r*SCCHmydX}rl!#7#0T0`^BU){yqfh(ZLfB!Rj>2kDv}r|Yc^Ge9 z5pcrk)4l_GMvQ5NO~XJn=%gqtyyQ6F4m8KfT~+U~9x7xWu%#~BkqxG%%``;k(&~Vz z2oKL{-k?5&-@HNH3lo=g$|0WVv`AzIb3w~`bgfyTtd!anipqAD`OV((<hJ zgVy0|Lxr;cMxNO-e9n8gWX*&)k?)E;3Jq=Sm3-S25PLF_x@*2Hr}_MNIqP-djE`wnw* ze7gz5gnLIMEs0zy_JK7;pLPr|djgx}BuiN@LWojBfZx;jg3knG4$rDAn0R%qfr(yj zW7#53p7nR*H_zsGVIu!xO`k*Oqo`(>^c9>kSB#Q0HC9b{wDL~>DbfD?=(YP-3|f0| zLaDn6{9djCt}!_(iA`0(@_#7EYSK>x$)3)T89 z=SbM}?__cvIv3mcU~#;leG{QyCK0LWV^CZ)XUX>XtHu_F74i)0PTvTj;Hi$%R-G zE!t_w#iHn@R@zRt0&IBfkoec?8Nx-y;D|6vKm{I^SpSB^g@A#9Gia0!Kl zC?V8}|6&Pokq=QqAw&k7WtDyXbE5sZ*0noUU>vjZVm?#V)Eb@AAI)0PUVZwC!=;1f zswfC-ZiLQ9RFh!R6(*nl3YLKMND&LnGW{1~!8>M(1@D;uTrA|wqB^07Eb-W7Td$pE zEH}%yPdTxNIupo?%MmsodySAeFdil!9=-*58Z)VLbj))Er>Q-ZmDG(cplE2Tc~GB+ zFRFno#=9Km{G#!`9HpehE8~Xw!%?)D&g94_W!z|nAhLfZXv3r*wG4q&>Vl^E2r<7P z_N)A76AU!Fpg5yDoNumC=N0DOjx?5=l^>4buSsm4_eO~AEO_7H+r-NAZ7~+SK6@i= z?J{Cc+E%2-l-fSXuq&x?{)|425zMj0pMlrLNdLmFrJmIF7p!3(qy)aP=8*6$K`nAkNy8u@)6N(F4xEdX!@XOTb7|s90 z^FPDrk1Wzcj3n0l4G8vUu5Grh*-S=N!gP|9Zf_`zN!Xth=DkQs@0pYlYrA=;EhfU& zE}gP3gR(E(PKi(NqhweU)2%BkezX`F(TVAiWW>10+h(GyI3%v=nPaG5T-ZU$jY-;R zOW&uY$MH-{PYW3d{ z^H0dMWlV@kI$%rRTb=@YqDT`lhGLBJpnRnOmqV zqB#|pvXO)W1484AZlfa-R;K2>KRJ!U#4D(FyVUs#^)K&PF^>}b%|PG!l0fjB3$*;y z2J`p6J7MBO_@`l#x%vO2WMfOA$F<R=)Kv@bSK1x*H;?wazRaniPusZbGz`wvh#-c zNTM3Qix~C-bl#(U1{3d5+M$$IFx$&Xe3)qYbrVB+B} zfoVO%8ern>?_)5@7K4P1S`ElUAx>;yd7{1+QE9U8t%@TKld`P)KT~^3$L8GU&xwO@6%;0YWLrmXYs&H%#TlD)*0ydne&HmE+GW0G zbM3;_zp)OkdNux_qnpE9h=nfR?@cZ5s!sa<0C9q_q(emfDdIKhrV^Kh7Zjcvu4d@Uwj{R&z`n76`p&rbAv6m=B389 zi+=y@_>InV3;t>!-Fcr#7}-yQA>Vlc%cJkKA70q@pt6wyC`xPuB1FrThH(tz4~c`^nz>< zA5Up_;;8Fo_YCE?(dX_SYXADc+shuPo>reatJ?>yQuZDg`bht#2lMi;U(*ng^zl_& z5)VAvyXNB)8`^fTEcmKTY?psMSy$Y3>#%#Dz3RDnyKlSyt2e(~YAuNQ=TC2J_&R=0 z&oc!NE}S&{SYyUz|FFEjC;6Y98miC#T2q}mFZ#g+zuwiW^}|nBeE!+eu-rF}H67~x z&dJJUWjQCm8=ta0{2SYQv!Cqo{sW^AJi5^IecRLbtU40Wy4z0H5Fpb{|8rY-Un1{y zO1qU4RmNm7Q#2y+9JzAm-+A@da;%I)^@rGx{qu5su^~y(a$4y)36plNH*&%mhZb%| zz?3q19vakOf5^sSRyp^F?P+i1P)sdmTG&aZ`0?*fF>)?qoUg!%fvLFmgB&9Vt4!e! zeQF|qRz0yW1Sg7d9)eD>uladMPoqE4jHCK<@4!!Tjhr?*e+JKd{&FLyE#r)a9)`zm zTZ~s7L{68_HXWy7|3~QVf;p68i}`)%6z4HRKBzHr=shdIdGw{)Od|(b4^9#3c;5W< z*keWx^(GecX6Pg(mp)jHZX`H9v5b=eozgY2`Axj~1#>QD95t-V=f3%{k#h;-Y=%x@ z?Z3L+T}BRl+p(CbA1BU@%co#G8ypsm;{u$w%Zh$9a%h~vIV9Ov_UQF5Bd0Ut(3~=* zt1@LFI{x6Wx-iZl=%kLE%RFV|bcKz@topM#Z&|sKb1CD{B21Fi_i~<@W#nAOI6a}0 z+Vfx?1~$R*=>{8%c^Bz;#`P`3kSUmBXPm*%NlmtmI%?!x4jYTP4`Y~21FrtjW8`#a zoEM>!93G3>gyB$dSUnhLr{HwBm}DiGLn*SD^Py8dAKDbL(#Ywh<9G`me%{Erf^lep zB}w+Zn-3i}a(Xk)2Ga3lC9HaehpKJsDAoLmSBmMA5AH$W!Ex@(IIlw|o0mJ+Aj^X} z{TPR4*~n(b<+DS`Mt{aBgifmZz-8YU{TTooi+K@aU?J*zn;+nuKf48-Y6@3&mcu-M z^a#nH9#PBQWKvxvsT7HfHz4x_(pPfU2&9ih?h(ip68VQfE|tg;fpn7y&H0eBOJtBh zI!R=LKrWKV0)cdw$Yz1`ln5;&Ak|AEUkW6!0o_WX2}K)Qx$z2t1UB`i2!yu7a-&Ni zferD?1QOT~f2TkK+vr~sNN4Gfy5YO4L^_iALIpO>CkmvED z+39y}Vq2YRq1nJmdlf@m7D`*xRJOWZja@WCmjI(dE5;5?vUho^ad)xUJ?APeougik zYqVg;Ug-9F(QYs>?Pr z2Zee8`DRz}(d{|dVJbFmFT}0RwX^}b&doNh2E(wM!*2@>-gX`GmPWRXnQA5rA=ru7 zthKJ#!}lzeC-tLsKjrFqlda!xfsK2(=e29{5|}oEJQbLMYxS;O#L?7$*i7G=>Pp z8w-3gI5+(P?>q4B21lU;K+%K_^Dij9G#T{0;1G`#yH_V@&$9yjEO8O9O53eQ7=L%*3qd?B0v7v1ARJNW+_8|u^y`h&kT;}iNG7ZMYidEhs? z(2Q5`jV?4Z#g34rZ$$|^3Jb(ZthThhG;jYx9|+ztaPa*d%Pa$y$||ytymK6Hh!&vetReYVi zVA9l2u5`}>7S>R!L=qm(PQV)pQ!KknfMZwTH^-=!B{17H(EBmd6B644lY?RJL8lfd z*7PlO2Q&Q&onzt1Xzp_-n5ad=tuxYuuRrn%9=bL`76-cEsD3ZfAs)_)yRsQEE|~(nP%*!#)HQ!ln>+%`P}jJ>V4puJ#BsK znZb7-{W;&rJccRQBa%dHmXHN<-uDVc#)Nf5eC>&Ec?`Bm(F_eQmp>z#_mUU%ZLE&Hi#M6D9|qSaxzYPj?A^bKXLjcp6tp6OxASs`yT+yMP7j>u?Q*_7aL1 zaT^D2R0zPzJvYN6v~Eee>n`bkXcD*59A)0rhfCZ$plM)kR1RspVizoU%Kuc`XK40% zx6tf$L6aG1_L_86S{F91O4x)b>aN((#FtXI?sgCs;)rLpebnbzaCWgT&D3I0;qbez zxQRX;@b>H)nEEqYYVH0%?%o8jsVeOoPnysM2qZv|0u{<8V3DnCB`9f2+Ol+kN(&;b z2$V%O+k}Ep5JG`)E$$=k=s3zaj-rEt8?=Cw#RYLgLB&x=u&6jNr9vg&?>Xn(lbhT` zocDd_{r=zo!o7X++}}OxbIy6rb2iRf1By(<{BR~-1HLZbeglg0{t1fLMFt2Y|CSC& zAlDs+E|ND0)NsZd1*$Kj$gs*OUiZ}BUJX9>XotYouOd3e)2+n!>bsx}-u8j5ci=CR zd87lXr8qY9JarEZbyHZm?^H%+_lMJAQvafAaUriLVvWE!`m2e)L?x1+N9w>Qk$t#jP5+7c!Z<7?2YiJd$X!{PC#UT-jn6J@^ zw2fcI`b>4QX)76$;vzH`m{3r^2UEENuQb3_DfNC<1^TyB>_UWI-PxUG65d2PfeF(j ze0vl9OU%Xo{>XXwLZyUSeutr_q=tav88iVD{c^AqGP&F?!*5Qlm(=}|Ql~+De%-9m zh1tDQ)g8k}-SlIx4}bdQrso@8^uK(auXx|N%E@`p{=B_@V2B`hUfz-NOW7JsAd@J+%?*ewrcph8r?A_1o> z+792;yb<=UxvgIdezkx;!NpDJ+7MEqG8uowvl;Gb{y}2c5kCyK(*u{qkO%|5HdXoL z1bWhScRLfDp%~J2C;y}F@U7{gk`E@Mf+zVp`me_q@epdm)0|YZw2Cr^@+6$ANH(OU3-EGUQh+DH!ZhG1S6^a*_onIH)&T zaDoGWvvgmT>NpiT&I3BmHXY}Pj`L3)r#Vj)1Y3hRW zb8v4{0f2>d&VpNlAI#8hR?9x&Th)pq>W8JJq(4WJO}8Dh>5gi{&&Z@A5y__e94}bG5);Ly+mxD5 z%@xh2TLav;0!#I6B%AK-;15Q_s_q_6@JKeqvEb9dbuVFqjfSHRU>-2F0vF9DSqxkY zyqre>Tom<4{(8XQ0L&$UBWEMwmViGTk$j0Fii_Y37iRkx*}4a;gl!sml>ONLSmT*IRd4aN0`?aG00Ya4$Q<=}hMQ07+5* zbsXbyn@T})y)+4*5htT7YpKudN%ZYF2V_i9MT=TDtHh?B!f#p-zzNt!`mWlsg?PBU z?QlvQ`^W9m+!Y)gJJ+rntSzvgP*p^Z#WI6a7e-NW%fiji5FgGc3S=SfShiM%TS4dJ zcQC!k7>LmGQ#Nd)&MRw&A=n61^S~=)L<$@x>&9APqqgN~I{L^TWi8o&fTkCBz~Pg) zS;irds1ijW$>Vg~e4#L>$YjCn70LC5B4vW1V9vmxL4LdKWSD4Gm2DX>R4{d~1ylLNK==E>GQi=Gp#ZmC@srFHRqq zo9`~p%_+{9;C3fsen{fN1&PxZBx)4X#PT_w*@>Qo3lmFbmM3C}eP-#*1=DAispfIH zKZ15~sc$CfVRH*;=s-Bv zlHaz~MR?(J8h&F0(6>+8P-#`(6dDoeg>PNB`Bs#idS3DlONs`=c>PEPjckKdgX2WQ zOdfoUC-UJ9->ygSkpao0Ex@pV6T7T+xb5qA@=E<6} ziQK~QW6-wDla7kFpWcOLL;iSa**$sTu0yrlVgrU|zPc>en zLqbFuG8AV;S7MQ5fX6uHaq`l(W)fvhgh<;~Uq{%Au+t$U9Q%ljo^Tm&f4mg#?Qw7- zd%K&kY-}bxWqFN9C!9uaa((-bDq^<`wf$Guw4%!0 zc>c@0jsf3yF>=HVgNls?&kfek>NJy#a3ULd|Eopb! zYvA6EEVQY3x)^mmp5qxc6HgbTNWXxM4Y8`ilgE!&P1uc&k_#Sb>%ana_?*8*D@jYA z?I;u>3V^ou>jGDbm=`1Ql(nBW;Uaparlt+ah;2R8>=)q*UvW*5z7p>98kf`s-r7;W zN&3l;Nmiqfe1t~os$Y!(#5Ve%Qo~zyN-(Bwk$@GTn0qa1rQ9hbsYPX1YT@e_X%q={ z7zM(mI>D6y44LMmihCVgq^ELdb{29COIRWJmDSj;YOWC@D=eSYL5=Q8w!`<;uj6Oa zCxM}A+-cW8yZQs$2eP4@dbfkNNt6kM+SI~#r}VQr9t&xiGk&K0DDDLIt56JnJVv#U ze=TW4ECl>ZO+2xA3jgJ2dQu2TDn$i;rYo_R>hOwdZY(F~+Etca*~e5B>RV00%{4q~ z@U_Q0lU_&J##d8Q2hYJyUCm)s1)f~%Q$SI7GS=`Qo)a1MBA#3m+zx6ITRaqaV@B~sQ}bO#KfU(UU#1W1deHVnuhO?Ww_SO>;fo>nK3KnU z&*b@@7GGX@Mf|*<;%h!lv#nb+b>yU0O?p1t=ChHmc`v-YJ8yFKkO#jyF#4Jk_pjOW z*W*1a?`}7**GrqvKY)O<>;L|UmqiVV{A(5z*%)FNogm*Of}^z+5tiG;iE<{4LfZ(* zWf#@IbeRo_uvcimY631lIh4NoymR;_Z76%;RR?zCVSvg}bl%^Ko+TaTfhl*vd|J#sOo_rcHf7#qVpgeRrpiqrER z(_`!mx8feUPmiJM+hnAwmoUi}%&0lT!`zx-y5mW2y1rKbksi~AVNwJp>Dw}B zRpIV97>2BO44qefOpj^HFn_?4;x+lBEpO^ES1=4!jTGj!Lro%me(#9jMSR7tL{SE5 z;dLk{QO6-IFcd>ge<){);5ZDb%Vj#udL3u8j`O09b4bVeyN+{F#~~RC4Ph%Cr<0B| zRL7a1*6BFU z9Q9OLT42dv9uyc_XvfL#1&0>naq^qXUz{ zn2np&b#x}_AVN_2BTn!H(*9b`Q2a35Bstnq)pp>Tj63iQy=dX2Zd5hW@n!008Jz(d zI1u1uu9Qs9=N~2I|fo?H)He&+XzbUFykcZnw*wH6~+B zo_n+_qSa{RV3>_Y4qmum2EB(xsX=V9^4q@Y6WKo<48pw9?>4GKX z?OL3$bNoV=+l0OR|Hlxs5C>Wp#e{68I5JQ@j*<-|3lPhYa8cy%uo7*~ z0tl1tutWJ;JB&S(Ej%Q63Dz1hFBX6Zo>nMBv8Z$*?51UKe36%ywCY~K*|0ZkiPwUK zeC1ldVMB)U@oWCP+<5nZA;X3YVNe?H9>&JI2cX+=P*hft#=AcZSE(b6cW=Y@1E|8( zTx`5sGZTtl^~C)xa8^fdgQNUpyNfW__#;w0uEVR&P{MDlkg_{qR*61ZsbSOna2z$B1jjw>4OX1wbU%srREZ3gaX zU@}O3!4)lhqy^0Y=Dy3|sIUAIFh2`iwD1iFu1P!=X5gkP8m)C~3A2I!k z@nSVFUy*qQ7v*=PbRG)+{0;`gQ@H6OwJ;Kn{Cyjkp9LuLq{GGsi`XZzW#;6_|mEzl~do z*Eaz3slY{(mj{4556s3cAaF&?-${7)Brq2)gPROo%dY6f*_r^%wc$98 z1&F@C8h56^&~Lifysxl%LDlf+)-W7p9#otE{Jfw)AyBja7v=^1PfQ4+sR^)64>Ne% zkb&BZnI=rNQD>T1IYHIiCfp7K6&Oy5G4_a~OR6Q?3`;gORg@$S164v>8HI0sr$;>j z+K~JfwjQOaB))a$@H61KD&nCZSQV;dHzvPxlD?tgDD1(lxX6SbTgWDwRApip%r~ks zv#>U2I}I$nPKCkmuC7{loDqAm{b;-|xVNtv-&*|M{jXDHw-ZW^0b6M9$*Y1R=1tnk zDyF00C7mtc>^lHtfne;}_+`k;4-DnuV#k&E_Vy~85;k&yu(NTjVXGF6+2 zsW3F!frW=P=MR^3SyzoOkfP%Y6_*vsc_4td7))dFv1R=n78`yp2esWiV{<`qpM_Ac zgSZ;N#fRFnqR2nr)BEw_JbAme8WfIQz-VQNw`^?Gmi0@Rx50y+xVHuPT6&w$qIpac zO?Bz1CBP($hLV+iSj|+D^7y;>5{pZ1+xM~6r3VnI6Bofh%=m|u8r!JDB~7YTv?dEHl!8gJ44+C_XUoM3eLE>d4BnNzbYN}@O=38TnE*X; zj7c-)b(UZOZ+mrN9A+(;F}j)S+ej&9tc&AGcgfEjD%1=kf|hbgr_3GmwDB?L4Blqq zJVIos7}8W1ZINEO8n=V3g!?0-Zo;#SQS&6_1NA)P@!YjWK7>TX3MVX3xRq4eJ3F?3 zl}$}ZH35}dB?EXhom=H;rH-@8SL)0)b1mC@9-+Y88X;KPk@NbsEQydy@~!4v3W!+J zBD1WNkfxoaoM>HBV<+n}O~?UG#yNU4^5n4Kl8RcVL}W@qk@GReKk z03{0wc_Y8NO7((sSgF?@yg^9~X6@R|An2-HOR=G=cI_5UfO<|)2%moQcrkYY@3d*n zB9sWGl_uiNHHiqx>{9~<-(|*yv?inr@aW9~#iK`}%6TNPoVOj6Ok;K4V8Ps&s$z>; zLtvhQCr!DNP*v;biK84krEK2@%G+E8nd>@(9hb7m?2SpTmg~_`P42)XnSd?p%v?iN zan@Y3`T@C`soc4Pxk^ub-Yw-$sVP~P+26c@+Yp#FxNFH@y7*Ux$Qw?ldnXGB~s zq-p;{A;kn31^Y>emR{B*`Y_wJzfz6pg(Yu^JhF$U%m6@m%D_c(`}XzV{2up}SI+32 z4|APzAk=kgC%NmSFjSQXYZnBxg_@7-^iZMIL1G_F+Wme5H44;$=2{u4#E;^3us+pe zj6w`(;+3TkwYZqICeueNH?r=-B;>~NkTPl|sWRW#0C%8lXixRTzW>PwDg(u~tQt1? ztP3DK>2g5H$c0qvA)fKGI}}!h;~d#+9I@y@3qbWa{dDl3RGHJyc>a@Wbo^x1apdVR zJPg6QR~vbMMdR;@xbbokXVY+H%&$b4xUXYC$(Wa*2UAeuYcP9ep6-k3AYR`WO7*vxrMu z%+;Juq=1g@0`lu`={A=k~ zB~E>&Qs>)AB|7+ye$hKp*f0eUT6Qg~<JUAqkgUA1esasm{!$#m7S?U0DV z@f0H2(Oh|lDN`LgsGnHkUt5hoY`+6lS!GJolD5j8?$!|&Z|-comvg!m5mrwdwXuUH zOTnj0S<3?(@{+{{FI6pFXitUpdo12K@k0$6tCnceXkOLYPwIob)&-Hdk)o}4F~mtw4~8zKuHv}~Fr?6rnW8MJa0Y%%i)juK=mB{P5`bx~gJ zV3ey6L@P>%$+ms%+d!?UUfNUHxCIny-Ya{ogf0mwqc?$9p2KtY?RXRf-lrCV^>Vhv zc&=AAZUz@0j6sLi&)6Kzfd92BK)7!9bXGP};{ey&qFbzYT?AZdC_$4s%(s)mZosZE zYd^%_;9U_%u=a0=@(6!Ka>q^S*dw(cgka64EPc^{)_7;hn{SVJdJ zRBTzzM3uv3({_Tw!iPRzmhu>-r#6Kn3Piq0@lW_$HjOz{LsYY2rLuD~T!h0H%1)MJ0gp=!h{(5pJ0K!+DQl<8q?^oLO+J9B=scSv zWpZS{Xf;nT-qb15mOhOXgxF8=k*>UrBw^s~CgmRI?Uy_%bzEG21;xc>FocBTsDk0& z-YG@s3Hg?+#Qg06P*SW|6Qvf&Wy)HrO`E&zTg;fr0ac@DyZ;Z`-+ zRs?$jHz37C3TD>t31+vV@FfVcvQhJo0^1M4;X%v-#e+Cc25}jvH*p7*3bmHGB|>1$ zkplbs(lmNtku#SKrbx-?7EDx&Z4{$2+U#cvgn#2UM5@l}XS*-@SudLF*eYrV-upL_ zia{v)>u3FA)(eP-6j)e=2)mig3vCGrw|Z`X17VpidJVxt7+F68v4yz$ncfdg$j>x> zI&+KF!dSTAXLg$+L`d7;&}v|0TabQ{noXS>TBG$_R;olq2^|~jcqm9}$3`s+`iKP; z|+PE7OcZ1DcL*yC1y8(wYA3!4KS50lOjlv13XDSa+(17r} z&tQwq$^%suXKbS)Cn#A*6_YYHGy@&A5i~>8>}`}doJZzoilN9wK=lfv%uQkQ zE_$+6iwOITP+dFd)|{Yb@iX*XlURI0m1yWfC%dz@v>CQ??}YXng*{9D@3VDhsr8j5n6L^TSKPHVCe3^ zFCky(yOQXaFOwRo+R#zxCiBomY&u5&p3rsIgiZ|-w*;vHMGl3$2+HzEgo{h27Zh&> zH-h5wLDI|RgPK6z41NxZf6>OMenBe^`4^d>_!oJgwgT%g%#oDZ-m6I-Qp33IJiU9E zk-s-RyLAHrNrA#wK%j?OBIclsa3&cMR^k3 zxO^c(Rmgm#(xLi@<^1F$m8So?kD4x@6gd~_wDU(hR-Zqb#k+o#xlDsmdxu)6MMCX> zi7sHyxZL!y#p$Wz#-*jEkIlz=_*=bmaI!+;D0hZ?Lhyw_UDVYzf9tP@H^1x(9Ikq~ z=DSy~{Op={`llW26!Z9~zkb?1VP%`;*RVkV8Tzp~M7azPc>+!dI#&JhqddRifoV?}WuRmXC z{IzOWcJ7PU_3HTAE2&TCZRnb@yEgy(t%IAD%{I;4UXnlIh4aR{?)&R=*(yU-eT3wFLe0axxMI_#;iUWS<@DLaysRU?0#v_rSuth;IWMBGrxUx zMmy`>-=)|dc<##qIqSUle!QV})G=e<);s&h6b~HoSaGMfdYrnkdC{b&KHV6%ukBeJ zZ1%z?m4A0XWrQVdeY-&OFFM!sf2-5LJD&LCACliJ=+oA-b++Y~_r6wEUoraK8DDi? z-{smm|9z%yGk?Cf?LGha(%h#1LoXS6_UO|%?)vYh*k8M5dex*+M;fNp`QN&AV`G={ zBYiF2$E_U~4*E7Oz2*5CZ&&ncZ1Qo+f+wqv%x?Fv?}}?~asNEszg0TBwitKzsSe*aF5K9p;pA5bti%2`9$C$<|J>rXZK@aY zuXX{G30#x0C!R65KR^7)3SM}%7&F845}4le3s37YO&Esy+RZ?n_;JZPJtmf6ZWQjs z<(y; zq?=Hf|2*g17CpwsFr@7e=3LTzs6gRyr}~30ts~5Z&37Sy;h0toLn%Ploz_2~SqaCq z#v7CIIy@=vUUOeK7mjJeFcfmSjx_Aa)MFfYV=|7wliaEKYiVCShC0M1qw3Dy*Crg- zW2n6}(Zq5#g>>ZD%657TSisE0ll(gQ{D`f3OgzIZ5}50|n@;L6?HT4~fk`=gBg8g5 z?j0CrGd*!H+W+JudQ3-#=`S#s#{BHlV-gsKbN~u-&!*o*$kQtsX1Ks)&T9Le-knYi z(*sWm>7>37!pZP3cV-xx%1UXy@%e7|=`o26GZarM`OoDx!WJ6tP8WvxZNIuQ48@MV z9=??h#140-8^cg))0?-H+%NQ)?hHfIRw00f*p=_D)MF?lIK31YDrvK-pMz+J`*jt= z+=(Z}>(crH2wga)C&N?KKa4eV!b*1Q+&`#6k0Bk`Wb7g^Z?6a- z;R(&xoq=FiA`1zZF_lMQ!&$iMPyFQ^a*SY~gpN>QQ41THZ)QjJ=?2^ZV_FteYcy{4cfs%u^!4oPs3(jDJ>et@{XNcsyBRIh`J--y3ZW7ZVIJ69uhuOye7}`os zPr;$(?3{E84lSnVWS-#A;!#e{5uDzV;}e`~BH^&Ul5>r~43L~G!RaG8HwlhGau(<~OLd$o9Y%-dyPpakR_6nZ|3ZHZo^44@`A46c^8#zo@vlFh4ba zrf1x=GLO5obYZD$kmg0E_Ct-}rdTpYfrhf)ftD||IB5L>SA)$k*&eh)73 z*8s@@4h{A_!!wfh8@Tdr%)GhQ@v z!3-t_98Ig}BOGrWlv55YBIG~D|%Ux*1Su(4;g^2Q??yavWM=BzGKanVqnM>xB zv2$6~`XemWSf#bdGiTufwu!&S6*`7kb5g8qrKmE(p$8<{B>r4d*p?ispohC82CKz6%GdDa-2p zU>V=QOYI+zP4V=F3vZb-6MBI-@*;h#Ys@Hj&Nz3LYhu_S!^pwv zD8tCXY?#3XWkTZ~bIH&zWk51kM9S-OyF(-o959e?CqcVI6tdkRZbZMmuTX0u?GEuA z*>bd3gxw*Y!~3SH-B4g7?GE9>yO)9cm%x(J6=_xMN8mSwmGukUbdmZP36~9iBQT@w zgyM#PNVta)zkFbRB#SF9ayAlfF>q_3AYLGgDlQ6UBpjXQvKAKAzmPQ)7kM8Ew-EfX z?Jz|WH(k-}1cwMaJPsINA?uFEHcC8i|YgK#_1C zgHJ2V$B;!57wOfJa67@j3z(cl5V)v65DB**{0)iNCbkO*T+!US4(~Pr^Rd81lY%2ix!XlNU)Q@Y`qE};4;G(7TXTV(m=EI&Ka7A0^SmR!mec5#TAP?l6x-ji-37d;G)Gh6SytF{3LLuDDD*_16sgf zIgc_Lmlby;e~-bVZ-Cj=pTVN03#uT4jjXtuE0TN9;(a&Z-VxY1{EmbpIcNim?=iCI z;%bgN5-uLN(Xi-FBa1Drrnn>FZUg^yU%{{6f7XounIBv$wo4vET zXOJIsQTzA^FwbdlF1tNVJ6KFOst;ZPW{s16MbD2Z2+$^A&Qb$`E1LYR04^Jua)=rn zT%^iGlG9JY&qn2Ol?w!}XytbsGJcc`Cl`_6;A)9Gl6!xIziZMljOb>tsO|Zm@mc|9 zkVvU$>HIBl*8$UwDjHnT>WvF{_b@Q`XE9h*9Mz{SMq_0HZn~nCODc|c0kcowqJ{5C zyf_R@=~(7m)c8J%*B=8@Hjd+>$sd)sKLJxOaMALE^h5`gz*D3M;)>>80Pi~Hpbg1o zu&D8+>LLx8r2-c%zLO9jA27!zaQ9l_Pb4`Q2zjZ**wOZhzwIxj^OwN1E#SCl^$Qj6 z-oV^^8Qj~zEe0m7kh>SHzP}x>*8^jj#BtH$OXA)dnCk^DTKGBuHyfDMmvN8Uk2`>Q zYBKjXTKIYa_dPJJNnmkFT-dHM?eK1rz%U>lkxmmMeR<*Uz)^j*>UZEsF7N&wICAg4 zNVu?FZ+0MIp9;fKVL}J*KfmkEW(4x)|Lm?e|LqNL)Vck>74Zg7lamNBomcN$8T=LJ zk5w`)&RU$-?9Z@Z%MYvrR5Go_{tQ~+V8aJL;pQhvb4s|WbuzG;^P?o@ho{1HsR)4x3Zu{f?MF^n`J1wvD?A-VoL*3LS;&hXX`zE zhXP6lEsW64YOT*mFc;b?3lRb(!-^w%&L4IjwXGY)ep{4b*hZzhvcil%SMt3T*fu0M z@nuaHK!Rs`D1{Ep=da&wu~n{z*Gf%NrX?v8le;a>J*EA45}PvZ`It7#bHZ3m$!sjb z|KRBm$;VE;gRkp%_xFwyM`mN5D}p?b?;*n633tSg?Ykpp!oXbmL zfxpGn{;5{wka84jQCQ5erUd!q{M2IuqRw&1{@ zHAmpQ^O9}NLHw=HOfY*pLi%F7ZRxC(Dz`;$poGP2OD#ybQ-1`I4m9z$5qky{s9VWc z>qcnm7fmf87Hs3@d_SFcvu=wtT|38WKzLF=cVQk{OSEuv)@}X3jH>&=2YMNnodokaF%vYW(;7DM}%*>QdprC)uz z!)2?aoSjWQN1nxJsMfEyt)V$P{P5MPjKtau3w|0z-qvQY`n@)TYED$=2~=}um`}j* z+6+>S3`!Oig5YW}tk;5oXT=9xy})lN%L3#3GZF*oXg#|7#yTuYI&1LKEy`Fc+CM*% zB;CF$$FZLIWLMG?;GagG(N@ylaZUY0>)N9n)a9zeX7=~@t*{$BCdjkD9Kwv2$*Odu z)3h$&sH(cwvnlZGagrzspxc7VOB4$)?Tz&x6j%j*axr}v6c^5?B}EGGbGRJ_YCE{F zr-0%@w;UAz;$Bc(h+hXqA`)w;#*@B^HN1uAkIa=1L2)6DMNV^9+DeKvh`A1R(=SMX zrLx{@LgUP;HI&!Th7j3ZmFpty1Z(;-ko6>t2F2))rD_3x7n%J7{Md#oGd{dJXPcum z1)3~6eB%-xx#{>VOH|0te8?3gI|17!VRJp@Q_@%5)mS>HG|V;5b@|=0!}6+ozmfd!Feop4`6z?)d*emifxDh^Pg z)^7$tai4fl`3!3#C)#}#4ugM1e}B;++Z~m7wbER9q;zHFvE|EF##RPOy_LtxZ!NW~ zqTQHQmd|>X{_FtEkn~>1Jt=NS`Sqn{=lkV3>N*%`X-iT?1sCw{_s0gjd+7j8Y^d-C zj}taBOMpVrRDQt@M+@DDF!(OJ5trUg>T+t|UJ=wPABNlOoZ+}xd1J0lB@LW}oCe)Ki8>{S(0mGD&sAP0+ zg9WhZR{vN_mDzUcJA4Eb)=(ay&)s$`I5lPTQgZsV$;Qczjm>NP*$r&bDLqblQmfp1 zYu(=fYsj;;a_`0cA>ZHtLO};to(OmwxCkrz{S(ho%baaZs!_6$DmVkQuC+4pw2}?} z8G1YMB+l?OeKH|${9JQjalC(G19uD!%YfhpVN+2phi9lvStfEU&HU-q68KSfyU!tp zSTI}HT**iB_m@A9zu($=?JcpD9ffO` zPT1^>HWOW9TQSp~97sOk{Gg&h*^{&z+ZZh$M0x7-)*llr=ZZ7_CvGGw$F_juWnJq zvVTc(GS25*aSgul?K2041Qs`jzQ?{PjhUucoIr{KT!9!>j{HvO{(s zo^ySWn^c844C6qNgg6XKWL}fLk2GgHeL~xS^Q6s&$}Usa%L?YYgd)M4Q_oGd&Mx#D z6O;mrX}6MNH`UZa-c2_y~d;qNxxKO+Y!@7u`3<*zp;VJ$Wvn6?$AQbdk{1 zq3*=gJ*>v(_6DwSEks~>YODaoOFN|jFU9wR;_)R7MrtgoL_`jtcY#hEru?=j@GUlf zLlOo>l7zqfrX-N9<+tSEtt${C9`jzHxE$OFipxQTW=3>?y?A$q_bx`gjKNf`&J6^-O18+o=%&Z4^XY?&$ovj=c)*vWo#k&SR@s0}ofE*TF z`z7hfH~Xp+uSNAXvaHoksydwe7B@51JI|C}sEbj~$Y>$4hH=|qRaRoHi)E2---%k6 z70w!JUA#Z);{8$dKC%*OU92ODfU>Rd$a`MA$@^^DmZWK_gYCjdEkl-B$+N={x7+Eq zmbQKWl=J;E+o}s>2rG}C zioVu4YML|5&fT_k32+fgaVj$wXE&0Wq8`B%#!hrT_L@&ok3v~yQQB1=v8}1YkNPx+ z#p_VUkh5d#aCeNQW16-3eysz$)_D|c9Qg1ha%HNu%1RB5K}kzc zO6{h7rZh{6xjhoXpMB0&xe;&3aSy4?OgUDvAz3HuY)YCr`9RXXjt7#`EFH&KDFRc^ zK~+!^lKoT9B_DHs3O81cU*06eeXe{A)KsN4I+6`ew|)8QlDia}5^F>pvm2FI(|$kV zSq&osqBIf;g>Syy=>5DdCi#GItTnmbI5xPAE-aYu28xxj;f*lun@c)IBErk_mTYyr z)_ejf%4^M6LCO5)wLfX|yrqXCz)k;D2AK7GyfV>38w90MZP+4DG*6*_sWr)Kg{s~Gid?DHmRV|r z<*lGTEg{Ckz8DMDQ-S85Z%O)v3^0(OiFW7t(nM3br4W_p1Xc|hE9|JeuyyzOw8G!WYVS61h)YBlP|cY{^aRCQu0f!Fz|BX5NF<=?u{>xN+#VZNbs7!(7&v5F zjEC9F_v068m;&d~($*M_LEdMhHnd~A?4x9`x1q?uTzJ+w*=}3Cim(`?xz(<;cUrtn z{3~%ry>q|U1cE;D=E_DuIpi#}mmR6gQI0ZsYo(Jkjm*}@!C^yfrkVc0t=df1oYf^N zsdi(kr8bo{YrgST3aQ^_ywyT&t(Kf19X{a&} z#Ag_m#dt+))2-&r+EnNV$iGyUYjDeX#^yVK6m(wj^i`UolK8XpLPhtaeX_10F}x1| zG|0t8ej^MbIN_b@Jp@X%ob`vL8i{QcW-*Kk)+Ml>VpFm8Dk|z6b5f2a32l=_8A37K zf?z<`P_7FqrV6o`V%l6PrgcmIuj!@Ad5nWrPC{dZbV|Yi7OQy_(jJjcV^Z9Wo}`p? zbr`p}sMbVD3)50%m z{;_5?f$@RCZvk7dAbl(lOq{*V_-?o4M6l+Nwk2wpcv*QI6t@&jMn+P?#~N-1#r14b zzj$r69uzNUcY)%y)q|jT4gC@*?#e+>+-0&Jab7Mc-rGdk@tw8?1zR2FPAAI-4dkPl z>Ks+WYN8DHPi&+C=;`o9$#iTPhCBf2JAvmRL)Ct2{^u$G>Sy^u^ecmVc}rCq?~8x3NY!;G}DgyN-m9YOLYy#N9?J0 zuC7J$5e$HLEQFEL_nDz)zQt5|WO>=jCQi4dbRI^dQ3;mM;A%{b^Gw;~D)Rs#J>0zD zxel`qU@Oo}PgpFbC%B=KTK)Y~mYGpkmzkBgLVv89=Q4CMla--Rdq%LbrmB?ZU^b;N zqL)Z2WriI(Wrn3=4yujityd;P)pFL9T7&6=EeE+^^PqX-FcpDPpg^^yTBNsBpYe=; z22>0Z(qY&JiVsw`$8RnS!|4rsdp(|9q_)Yohd@bD;r$waD$VEcr;Z5jU{8kkFq3PJ zxsc{6gtqXNf#Q{=WR3PThcTFUN-6FMz%`Y%SUpBiJm8|5S`y?c8N-0;5Li4Su$XTr ziN3UUfQ4J%=ZY<&QQ@nNJ{{523Nhyer#C2Gr@KIr8W(HG#giADnV|lLn-BAH#b>j8 z%Zf`ce!_-tWdbBF5wf8a_gBgX`LoX`x!s}W`_X^!ou@2Jr@y}_ZM2IiBo6+?1E9G4JTBjEmpmpl zgPy=Q{3x&j8d&6kCA|dQ16xt(h#QR3iW@^xu=Zetx;suVP-;*~Tf6O6#~F*lMi)r| z@~^PdAY(fkWK`8R!Q!>b=@VvuZ1EKIMMGo4zW@)i zpZpG+t;J)GtRwA|4;_+WkPp~W2Zav=E(Y~7ZinG*Jo(Vd2~b?=I|qv6Xi5c7dm1I? zJeK0|yqxOQKG-j++$Y62s8ycP5`WgV0w#iwVUd`6uJYJYj1<(htuiO8onM|;o*2_v zy_2$r4w@JHAzYv0b{O*T{5zxO;wkk>W+K#eT4WNV(rOJjue3UX;%z*lMjw(^_B@#R z%9VH;3d6Lsb>Qi=Gw)@zvrgP<*p68ZEo3$P;D5kk$ThPYAyRCn9>r-3?pSsR*L$EG z2C}s9cs>Y-85~4YW zj`il_Q3Q<@O<=~UYXLR2D!0#0h%A)G$O5J9V41Pl z>NMlc!jp?bDJX7G;DW2SN@?|yxmmLNi=cXqdum-SH~`~wFD4`|%bq6q$*W0v(TyIO ziz@6m1H3{@fq~xSdK$&_SX0W(q$Z*xh;AS{bg2}%pxk6Llb$;s(4OcvGJ%944kp~B z3uwpNaHB3p6el|TF*Hban^|cJ8!v(gO<^f4brxj;rWAT&lG>n54y-(~#Ef3))y^{& z@%R>}ioho9H=jiZ*gxv587|aePRo*Jrls}_)`xu;MOvRStU~3R!}A2LM(kuMV{>Tf z2qJxcBJP+|9G4t8bp?`*CNLu|Pp(C&X`X5I45D6X&3Mxu zIaQVBm8o-CL1Q{=QZc-+;44^ctn^1JF37Oa{@9eo7MwSR0Kr;}sZm+xq(lB;{z-O! zmPL$HC@vNvH9X{g*qq(~jK~pF4aez;!wGnDkA?rde^3l6I5f$73cJDMRGq~2Kq7PA zAW)Rb4nsC5nQ8xX6In4ix)^#U4Cl5rpTQ&Nc|N;^tZ%`ItT-~pZPia?rKSWD5@8x^ zy2f;-9ihTRvp7s&jrGTg8LNCsU^6kHwYDzKS?i5ub6Q2UEXL1iHY<8^5oWVm*lbo( zWrGu1GaMLE=FPv<-u{F01D7Ek_=MK`LGfmhjCXuO>vN!}ui!9{<&{&Ud2x#DvYfhF z=5>Eb(Y}p5*B3|%)zWyXeI{b;pei*!xgPDLUHKAIF=&#h$1d^-@5xd}<7W=vNrPtu z&EuG?G^;$Yq>WOG0$fwtoaS!aW~mxuuIoyAvJszaTZ*8T4>Q~zWq>~hz3wiU5K(1z zQfFEjlJtw|OVo|^-tX}y4(#M(b#1ZV{xL79e9bY&T^j>+B>)Rvw%uO}8@+{Us?eDa z>Re%}g?W*g4vI(nfTR#@jIE)L%uhb%pW1-o6buj{z%7Ig2ydvPstiPOz&5?KiE|vwMjSzpi$Y+be#mu*zJ#by!0Z^j-f@I zUYB$b74&yhIWrqw?v|ikGp325EVP@A z#4)f3t27b)Q`8ZrpiWNkFSYxdDM)Vvx`d?THUbPwfV082n#Nm|mKZNnauSdm?eqA^ zI$ zWmpPTsj5X|`6pPE;sjGMl`j}8N9zU>`Rw-u#Ggwv8-77b zI#|Wt9aOA=3`czOFHHvi5m<*|CSm9{e2?cA@L~;TLA}S`wuD@A_u7Nv+I<<)V#- z6xZ%cL2*}}1|^#f-|6e0fIFh=OzO2>TSmoi#<0t~fm37PE%lVE+&l7SuPiaU@@w5Y z$i&C(E9kejRNOnD*u-5++!amOOE#hnz2(dbObWmr>uUXLrT%nW^E0O?{Bw;}?&tDw zs;c{Vo@lbL_iJIDQ_-l@jl6Zrc^s`KFTI_ha6JQNUIXqC3* zO~85EI8(bVF;E?}<MFSHoTt;TXWs|l8E-Ebp~TJI}Pey4~PUNXSMA*8$)p9qR)^f*v|#U0De zxu7!aV8^!p%BT}~zJNQ{@I9W?i;XpuBj32rumKd${D(ow{yd)mrCG-|6-wvQxMDKt zK(WoV6wt&ztiFnFt@fiFv`!ABcpWRUoM+2MvB7;*fptwWpr4dx$7sHCDCu2i&Ehy; zMS=lGttev>OlM4E>`*FAV=R8_MJ%(xNZF`g%$Z7SXN6<=4xAtthcW@Eu5>TkKiMckVbUos@&fcs9jfwYLI{>4Hd$Ya#ucorLLT7 z#i~*EVA)YOK7u}6ai$Q9fK;;rY^p0X-BLXs_OyLwr@$*0Q9WZOS$KblCW%wtcS6W{ zj$aGv7;b)c6KM|)cH#-?2eF1*@S9f}i$L*8V-+a=E!D!cxE+Sa@%)fcWS!$uP$PLX zz^bVhFl8U9n|uuE3o|DVq%Lirz&DufaQVbt2H|o2uO~0&iIBddPhc7l^)#hZQEl!+ zFc6S_PAN{-p70dE0X&}KBnmvm=Y!%YUJ8n*xDOQn_Fhmt#VLJwivJB1Pu)F|N6NKK z@u-8WcJzYg8bnJED;Z`7t!S;*p$7tpAX>AmpY@dqb@H?WuifDt57rHs}R*wtw)1io2{wJ6s-%TMj6cNnm$IOjZ6?!~0tyOZK0Zo?_3GG4L4#N>V`3yhO9Qgbu z(n0pJw`rhw1Ck{vA1E%q_ecs-5PdFffl}^59Evf%g`OK5;&A3*LWVQL3Q5CIxc5w5 znqH2XH4>%R>`yf-bWBSmi=LWrwB{=}KHQ{8GpYFmKb`>Dh!m$vLGegXkBy7+U6P0B zL@AdTL;W|yg)>vNrO_!pA>*T_457cm4}jL!TabH{0IJZTggJZ{jkY@|1HF?VK0E3*4KgJGd~^x#q}0yiMZaf50tD8eWw$iz;CXW z(!yBQ8r8Z_QlLF8UpL`Tt@|{K0_Io19;xzJX{>8P>*);ssi(D;h5}dR5$_fL0*AlA zj`}{kG5H-{c2VeH zkGl~L*bgJF`O1ecT;G`oiYsg9CBwJCZQD8$_dxebJTb4qtQ4Zb zuw(HOS)8cwsnhtf5=>c`EqbzQL@OoBo^;TkecJRMMuMHcluf8wcRP?&&;Fcr-dVGQ ze%aE_6wGbGo63T@&9LO~9M52s3Mi5=4S46HlU#;Apzo*K6$}}lyd5q$e<^*9>Lg4* zJAz552#C=}U1Vr;w#srO156dDgLShWQDIqY<5)VCoBicvRYBVs=2zr z6a=(zZp>_QX*~6^Skhn=Tj;@YIQk0VO6hF7!wTr@=p`De$^xg1_@N9%Y6?858|%Nv z8eCSyQij^r`~W0H0QOiB{Nscnh0?jlw)$QCRlFx48O>qXjT@cicOS1SM+KV2!snle z3CYx1wvFdAQ4w?q6S86mfcUC4S!ilt5gtNj85+?2kqy7tunmR#I3>UDU;wV*9kL0N z19(majqq6biAwRvk}UMh;a)25&fh-5(!x6!;dUQqaV3d`9h#!t60w`xtPT?gLL&XI zUqz&u8UNHt{3L1BUDzo})Of2vk)b@6mAE#b_@YftrQkQO@oGTzWVm`s(R})&_}*dY z4~j-#9fo^B@w)VDQ2g5-s0;bqQJ~r}SF%8nDIwM{4iuSoVhwqqXaRYw;d)RV8O3S< z2h4)CZW{8%RPE5=3vMsOYF#8;wWke93Zw)nW%Oez`gk+C!L4iI5(?sYvzSnap>_X6 zawb-BnNb3%esL6%wTVXWS0QQ9U0!!DXcUMIY`*w>`f;npwzJv~%<+g;RFHE;V zc`{uRiZ4t7R+?H)F@TPjRGV}j=UJNm>91%sV*diW(wv#0tbUm1e)cWFhAd5a(Ql4{ z%a1YFeLbl;+{nqNU9d%JR%fc!wvM{X$}%$sX2?2NMZZw5l-o_alm6+%43x|STZXq0 z+MH>(-+Knlr|(B|se=p>7H2cB-B)e)?KXo~_LJ{Yqi4_t%kXC2p1w=JdU|ijG7cYO z^mg!Fy5vdNkQFn0OpLb$%nlyg2A64gn#mK_vD&xa2sN)7#l07l%h%w$!RT)2jS!5q zRo+6SFPkiKvlNrb?Qj}b6xF3GZIm)gRhkiV7&82r8)b2p+P$4Hb$(*JbK*HHS;b1B zc+6pKjb3}1#h-7c9691?4%_6ZN00+Z!CDiQ95FwyHr+zrV!a;LibksH&>`jKtB!zi z3H%c%F2^*FgEv!MrBssUMBRxfODLLNZUIFS+?3kDZ@J{p7)9Ei9rjN#!*c2=e2XO? zt?}eRP1ZUVZQg=!rOQxN?9xnNCcVQmCv;^!si*ax`4DfdRU85+Rvu{<)SJYDdJ`?E zPiEWe=z98Y>#7_m6J~6~5W(;!#udXn<0g3R@by)QAC1B}48uV2G0Z#}`}H#R&q(S` zNpUR#`lJP#E+*NHMe9Pfq|3Gwg5abEwjjY&0R7vJ>UZKfOh#%%QL8dH6N&~encfbj ziU!!~oT#AhhHAri(O%IL-M(&UiPB+Nrj89+;Y;mU zh*e{OwVm~bj-tPrg5L8yGI2uluJqvZy!@(4at8Tel@`vv2&(cX1(l47x?LN{s;D(8 zDld~uup=DeAF0*^tR~$BGw92lTeqzl0?mz&R2+F(ngWU!cB-ki;*Mp_6i-R2bGe>M z)@^S3K)(JrQC~Qu@blCr3FE0v zY0Oi*0TfSdDnUH8Q}goNIirfxvrXL(vm1CDoK9oIh=SWMd8<)>od*gw2Hy=IuX@}Z-H@v##`o{*I{o{ld#_M}-_@V2_ zk_{g`wECHreXgv1`u@^OORhZsWmTtNI`(Zk?c9A2dw%%v>t}|~8~;rEZpyhqiC=FX z@WSKCfBNuzhq*qrWJu!AFp}- z(+~gh?1|T!|5)>F{FK85$G@K5 z+-0Y8UDu{l^*@dK2&|R*S~z_&3~mGsBs^& zBrHGqy7y4v&y$}YF{DYeJ@4H==QZP*H>SU^sb7oFmfdi1%->sG-AC!P^0Ufe7h_)^ z@Iw6TS3Xbv>Qw%*yIY+1l}*|Dht{4Avp+1j>y`~Se6_D*?n{%KeEid%Ip5qlzjDB? zc^it(-m+;}r>8oXx5&NeE#LZfkB({f&8umD=(z8NQ|`NdI6CL~drv*Gsn3?!!*5QU zyZ6by*WUBgu3bx3w7&D}rsH7 zXYNhvJm>Z`3m$kW5LmnJ&UK!Fjf20deEaF2doFHq_tu(+{?@(!E7obNug$%`?>~OM zZR(u$172)7Z0vZyIk`u6pNl63)-_v~GNIcu5BHojy4~>=N2@oz-(g_7J6ny{*Vi>( ze;{lB`=$)eyXmLnbSOd`}e=wXuO?sw0q5?@L)02RPlB2 zPhY-|Y(8+(BTuF&|@qNLp#bt4>A0B!3c-L z-D%1&3+ajbeQPhb9z$(~$(Vyr8MS&`ydKk>Vb;Pg(#`f14A`f~SQ%zL+@X{ze)&`6 zYIt~BFbwrCDTW^v{R3n;hGJ|o?!=Q)YFnWRibgnwQqE-Dk0-ffwmq4p$55&S4?r#Y zs3BR8X~i(4$xy!g8rO8zV<^TZ<286vC>n-ztkq-MFw8S}QkaML{A#gYejE&whbQ^< z@s`cU_3qHXr^)EWll-zR8VrF7kNXu2L#aeps%716dQ3aKF&X_P1x z)?*SGhDP2gPp`{-tWl5Y!Z0p8DK@=I?XT%ET^S~mp12!&{R6=dk9#+Up*cA6!Df5TwF+CWDB#o}E1yz&vn5*!{WPBD+WP;)OxLwe@!u{&WFqEfM z@>g54x9Ksx7=}y~RLeZ}>gJ<*OmBvPfUKf9kYUtvIwW}n3U|0W z4GqW?%Lp3`4amVdxsn zeATvt5KV-K$|=Qb$E7V1;y#RFroa)BpB1C(e$a;}g<)0zLoG+;m!F~HCttOG4QCiM zHmrPoajEIAdW@4{XczXDpzex`U8%>6V36hvp0|Io`LEk z9CIDRe2XWQ<@+Cg`hXroHIK=7L14};D|lUxaWM?lV^l{ybzxVX9+S#2lp_?1TaT{( zPLD}rm?r_Cc->iivs;fzXP8IvB>CBV*AX?}Ju{bhy3bz#rePFrUM@_aUa+iaw9J#3u= zU(VNKvKi)fJSh|%2X`*!E^6gDhhZq!$gd{WwJyCoxeW8$WtlV$w7Kwz!c+8O$BlY- z#xqPWfw}R-(y1I%T#VD{7A(YDx)NDPcp7pJ4;xI?>QDTo&>9R>>!}y#P(G;_=S)+7 z;%|(Boocsmy5Nyt`XiZf&fPp5HmJc6xkCJ=KiuW}bezBHIJ}XPF3A}#I2|QtoZuu#&UC>^lbmIOGg5Ny5S%#4c|ve3l2a`>EhXou;53t*I>G5B zIk8mP;krt4x(ZGY$)Q0Tx|&PQbirvMIZFh`COI1gCsA@96P!HBd0ueFOU_$@GeUAc z6r4=S`Brd7OHQNU440giR3YNZlALaWGgNX03QkkW;hO?bTcAqsRDnsCoLdE_mE^1! z9J}N^AvjLSc}Z}FNzPuuNs*k-1?L*c`B89kBu71@xs&8{q^1a$RdV_X&UKQLCOG3H zXM*7LmYivV6RZ!tI*wn*xnIZGspA~gaemfunvvqmE;Z$Q=s4HuIFogp#ey?H#%sOc z43wNd3eFXhvqNy=CFecCxl(dY3r;u5F;T;V>sra_BsgOwXOQ3|OAhr7>FO&va|EX~ zI9!ld3Qjx8c}#FROU`S8(_L~t5uBcqb3t(Eka+HLOX^(VY9l$_1Sd&yt`(dv%iRA1T9JAznDmW&|`BreUC8u6+f|A*aRBCpy)(VE>>9b42 zIg6Htapo^vJTv%J_i;G`hM_s9!RaipO$KlVl1^5Mn>ewILt4>4jT%n!0B~sjy2K=t zc6Ft2hkcby+J6_x(H^`#0dGu3baL3`e0K)IAgX0UM-eZ=;FxXAX)gKTn2fFYM+UQf zuI8%@@fBf0zq+1%WfxyPQTwmFpkHO;E5d|+HIaSAvlk~M9?jCpius9)- zPIV2GFXt?r?wMDHW1(kyTmuHGZsCA)_#QmqTzY~R6J}0d{C{dYo87iy7y#$I=hzdh zYp${5Bu&=L4LV@JPJ-$vj!^jrmhAmJ{YXiXX*+3w0lO3kMUf&!(P?Dhi-3_vS?J}_ zNi0%UpUyTC&`?^4S2;&-CvCWyf0lRPM0Bl@igg;P%cTLV^xHIM51Rcqg1Tc~hdY=H z@Hz+(YI{;Vx7=s%DN}+s6DdZgM46j2F4(K0Fsn)<^R{X=(>2co85X~4NCpu!LW`yo z6GiwTy^v-ieh2lQRrPPUY$Eo(1iq421rdAtvs?5)ZttJ^cy7YueY_2Vuthlt66f5K zpP=rDKl})E+q^)C@MuHnkVD6ZEDxrkJKUkNtt}xqXyE|WBz|$IFE$?w3cHE)*l=k9 z7Pp*R6+c$w3L)TV)aP(xl(REjvQ;UJNZHU$7j z4x#(~19T`l_;o7ZXO`-{uoXx#_|t`n19;u*|j0C(~ajkql*A`4Lu zv~+qBF;EGQxr|t}cc!wWHX)jfrUSUsBOdfyPxAs`7X=vjks>x3_FoY0Zf%q@e-l5SaX6OBE)7o?oiiZQ`?_`+p(JlFfre#~+H@#8 z!=YgC^q30UawI;A47veBGp^gxIj$kH6W0TXIHnwH5{@)%He$p>X=9~MspGQjs#nq1 z44q+na-f3~Q!WawWKIvblj?KTD(qw9;XaSvBr)it(NG#nSUY5pwj%gJ#E3?M?ZH`a zu7`cl$;J&3P7xLu0LEb>=m|kZW}s&&Tc1U3DdZz1XA>rhhPE1nqz806S-I~f*54(M zGsce{Rv1&bcR!^$vm-Zr#tzTxZ|mppYj)VB>3TI|$spf z#ORgdXbon!t9T!UGIKpH=zKaPyDyt`wFYx>x|oN7WgI2x!(+1ly6q?1mQ-Fvw}1Ex DPMn3M literal 0 HcmV?d00001 diff --git a/bsnes/thrift/libevent/lib/event_core_64.lib b/bsnes/thrift/libevent/lib/event_core_64.lib new file mode 100644 index 0000000000000000000000000000000000000000..ab7a5385ab2d8423c58ca1774ccd22d67e0f1a1c GIT binary patch literal 596854 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ɟv3}>v0h%o>kWM_ zM1BK4tAWYpA`gkz>S*QL3I0l8#`4ApDHiT0%mc{7E?yW(j2-UIGj+&cMqOM}EN5e=6M{yt#RcoT!fYjQN)4DkKH+d_qQs>^`6vX{W* z&wyySb5Nikd*iWuUxj1$iiWEIztxF`u>>C`F59BvGQht9n0GWTR(<)m)LvkEaWRh+ zYaGo(UM?_?9R+s>+U0#Q^Cm(B$)O+|LDYNQ&hF zGaI-vjb*zCE=(U!>t#*UcOP(197P}3=ewJz?|tCDZi2pMyafnJvFh6zxXv0ItG;Z% zG+^?=aUstfXsRtf=K`}R92eGpoX)NTW?eWgioR{Yycv!Q(?`1pGzO%kSoQq_xOm>y zAjPUL^_{3O0>mMfz9GPkYJ$F*P1H9ZxWG~L@sfH?6ZPE%+@nX)$NKJSqQ3Wm`}!#Q zlA*5|ZUX!BMi2?ZG-msy0pr!UBb|?PG)5F2LEpK+Ejo%mj<@TYsP9(b)*VHk2l^O( z;#-Y7Qhg5q^T$#2@%(mA!678Y>VN%#8>X?b+K=OHaufB<2QJVAeb)eUUpOwx_f@tcV9{R5c4!f{db9giFSWPF%n)tBdYjK&BMhgj`50l2e|qL1ZU(nNi0fV=J} z`dGdvny7CBaNCZekMr}_!2A)8i_(7GhhT2QhbdP3QC}7?GsAIF^qmjPCE>Uz=l339 zo(jiB(f1}WpN8Y2==%ehwtOIiWYr^zzW%@r3&(}&-}qLl9iV0MJ#!pcW|-vaYjI4+95JhU22>3jnhs92Z63 z?Z7-5j*Fsi7clRKqmk)`Kb5`S=UC)?V3>-vxWc|1}To(&|7- zc}dm(0XJ<#R!&cSb1z$m=V>-RaMT7y2dhX>IQ-WWr!SZMzRUZ`XoIW4&)oGzbtxFiTJhmgzg;^+~|Z&CT6*nwRVCXjdJE{S3651s+nc!rur zh*Jdf{4F%}cQ9x2x@I+qGdj^*yQ5iM&SYuj)I)PeEY81RHe;lwvq;?DGXoM&J*Nt$YRL*V$R(+!IF2_+d z!i%6(BY0KlXy0U<_jRs>)$bvPjZ(YAC4Hg}IcWCQde05%4zZe~#%dBTy2D)A1~9Zk zjI^p6ln$}ZRnyCAl`gcX8>UXOkJLQt*gWW~=zfQClAB4SboloNCz`VX`VES$g98`H zJisu)1zY)~NA(yVDAib1tTaAu<2D>sW8DWzHP)M;)Lii$DBX90zH~&1_IbCm&WUU) z3BnD>Y~O4jH(&V4AIz6Bv^2LXsh{w^s?zGlgw-^3XiS;QADoaJ$npm-oGpE$g|4)P z^*bmTeAsD$700_K0XWt(UbU_sV!NM>aiQW`W6uFEKGU_xgk*m`euaGq zx)wpMXQjN>z zRE=8#Y8*apqa4TaLUG8h5Q@`A1q$YtmnSNO*MQ?xq4wZ7MW}CZTrSiQfTs-&Cvjgy(~uMY|h-a7Dnd%h<-C7bVCtV+5AEJULR zM^3g^LXi6!rzYkFi}E)#Hll99AgkzG&p@~S;NrwwTuyU?yUc;N9bF?H0M#w>f{Q&N zRS9d2)jtM~^#$Kh&|GYG0s0-hT7%bmdSnGJmqO(Hc(0n=LmBJgKMn{ zc5Zj8I8?Z{DDAICOc=pQ@xjAvm{#VDix)aD%c;qW>u6;<9hC0f)@6(^r|#NuX)auI z6VZDRy*$v?AEd3u#Ngq5%~Bg_Oeqh!u<`{GU|}y=_TW+G*lNn0`F2@EJs2506Ek5Z zu5_@H-<7p!PIK5G;Z>Gj#c1zj)nO#475MP=yrVWyV}7zKue6SNJ@T`-QJQBc)avGG zifVLoHpTx~HD`U_RG++(gIRxk@IW43%)#7`Jp)Eaf96|hgB4YqZUj#B*Dgsk0zI>W zZ;TIa%jGUA*jR@z@?akK75L6kb2(m_s$`qw=hYP_O<&z`A=)%AX-ROmIbSdBk=h_} z+FEMsGBKF3zl~PtdydO(mK}2t zmg1O<(75kP3qX%2bn%A^D61Gm6`gIc)dL+|yt(CNB{j&W;`c?uW0&N$#BE$-Q4fIP z;CD;R`7T0XeJiivxQ#?mD}^@@RDn>ZftoKAON&-0^dGbOrMb7HV{S5#(UvgA! zx|cKM3S`#4mMCZaOLf*0R;_GiM(JPOkg%#6zc2yPKHpQsn?MH6raQQMU(2PP<)m@i zFo+tO>l`6w0{;V5jLmD%&>SaMW&5r$<_WlU7 zS*@0(nOjq!&(+1{)fM4oSe*3*JnPE_iuibpr@Bl(xA&=AmX4b$e_ge@{IhtsL62$Z zIXA2V8$Y*hTz>r-Ze_hLb2@vO)BF^OWvBk=3;sAaYs7;5g!&I5njQQlq30?Ph+Xk4 z_W!E=t65EJ-?QEgpMkUQnA*R()ST~ocKU{2@iTODB8<_709Gb`^e<^QWq3PoAdviZ zYu7*^Yt1HJJH2b3y&7M*OshKFj9oZp55U{B&A~PH9LB4%McHTQ7{8j?Lcu^{2ng(qKon;p%LoxEK#@)rJiF!Zr*VrxtYT%maxf z=FUL8FZiBn2EE?ET#PF)yQ;bCQeOS7Ne%d&8=Qd){sM1qu-cy+{EAbKZx$9LTYDpO zIZl*YHq20i?_%)OK;v>XA0M~8iCQH%s#i<09iY_Udk<8NK%-|5<6d-^$$piY3EP2em|~Z$K3b^)o20pWH?xsAWPO z(+sW+LJbC`uFi#^E)d>AP|JXI8&#kxg%9V72X(3NIK_D6);n{Zk zngw6OmRVOp53k~td3Ed;aLGpL|mE-TE% z+mfXT8@`RN4&}^aO}b`b7Ni!vP}DQtlCk5l?maKpoV+l!i&epgCkM{<51*eHz>VqT zq$OFLvasRK_~6R`voUr3INK$x{u!FhLU2<-)k0jzRQl0&YnWa8l2`S1Y&f?1qYK;f zHCb!wUD|oyrllRiC*&m$`CdfBnio>FS(jgC*uYhJbqhS^gj$CM53hk(0M%7LpAXmA@9bIY|b1jU&F5z_=P5xi>OwKY1C4ME2nu8<%IwjQM}ZPm4Z|la?VTW z-UQ4z96#sLj@%}xHSDwaJzaRaa6C(>FL9hH)W2{%Td4M^-~^$1gHofD7sT- zbmxImcfo%HrDlc4ENVL_HFiG))kS2xqxY+k-51nK;qd~eF284jnlC(#4S4{Ss2}oS zcb&uXV8*$aJ(QW|3Urg@Y)uC)DeJ0n)n2B0!aitFKV>NwvY=J#L#(mVxdtuRngpX< zLAYhFBvk}fEONPsmD~qX4rps*-o*D`x1*RZoD9bic?# z+6!fM2Xg{+sXGbIqv{SO4V0RBl>WK3r33La;e(nCf6&#KkCCdb4L$t9JyzKjt2L(# zL;4e%QNCsV5z|k1fQxmr zt^gMV32Wq*8Ea&Wvz;}q&8NZpw)le!68*SUoylu8yGCBH+C$rTG$abLC?t{Age~U}s+Q#Czk$tUN2lNk zDL^oQcKB8o`cpuuk#H`kDtz3s3y&J+58<~u-)~yDUqPu{7mUpki4;(J?0{1G@B;1vYefSXM$Y8arfEa0i64M{4jj=`Fa~V z{X7GAZoWglG*`l^GoVm5y=|i|X?yv`ARlt@x)%>wece;fKlJqPS5HL_`I7mF+PoGi zCdRDar$&dKf>$>z#fF?(RBs$N)4qf87Hmy;=Gv=Z%3q&}TUL4Cl2>1Q6FIoNb1%I; zKk#8(K7Xblx=b=Y9<}7ohrRU1&bSWF#imn|(SFDzs{QqoX4}u`>`aI7NZr}l zjLx#EW*YeomcM~6y0lcug}n9Tk1`Zh_o=Aiu_&0jKnwvj2_Lr{rwFwKM|BaZ2Q^K2 ze4MHld{2T>(^_Ag8`WP1@w5qUG${2XZye8@@aBM0{pEa6%EnC=&NaWaG5@7DMp0U8 zqg`=ZqurUU55#}2_5wQ_C^NA!RX6}e#pCyN!gEb(YfO46(HIwKXLL?$Z*;Eea3JyX zcDvioZX^ATUXf<16A7-M6h$q66JF^4T0U^hbQuU`S5cI>LwKRPR*`EaF07P?Eog;Jw5X1tloU~Ze9RP0|HH^+hz3*@`k74K{8kc9D@r%@ zaz-#yG~G`i6JZ)!yN%W;ck3bQ-0<9*>2eUN#)_iN^}-96$}vUo&EBP?6h)~Qg?A*W zD=aBRQR*cng?Qfy#oS@b-j|CrmYJ>uq3kJ&lCKCa++Kz$f^SX*N=i|b+AX|pgO4$K z7WXoGPWBi*(|Q^`5wyPRfzF?I+})ueu@VrZ$MEssa|u2eqe%4SH52DXrCU+d{jTuB zOXLODOuPapDMe9=w`nB3E7E8}LX zo!gZ6c~_w9vh&fYnO1^OrBD=gelI+=KU!;?2kgssrrMK@9^huWSWqmDqA2+f;kgoU z_U>x)d8>w&l`UpB&v&PQjdY9pk|S3N%C4d){V(D5YTnFf{;$@8G9{R+aP0kxN(7}O zh~h&LGey(=J2LIyC#GJO-nMUBPmU-nIOe%mB1RRHDaE!_ zShl62IA19#qC!VdH2qy|{n$T(^I@n|Ed5G~y4T`krfB*ZdqADFP`x~B3Qew}XiMp( zPR?~^il#To(n}PzFvZfV+Jib92-7K=UT&F&-Voyq^?;;0LyDqZuG>(!?^Kg>>piptu-k$S#ATc!rc->U`c*itlK8 zxdO4rD{IQ+v~BBE?LnP81*ZIV^M7ZwBN;l8`*BGA|KcP}itxBF}UrAB-7JSU)0THgBD=*cGp?cYh z3hk_c(o3DM;bSHbh;Y5LExkmU?Ga0_Y7grCiEy1f_zu@QSM+9cj|9)$s)~i4!lI&* z%0O~IPZ3^aHKvr8EU7Fh3X~Lk@J1al73ChEAhMSj*j#~cRhAbnEHQ|#D6%)hEJ7@D zY=x<`;pJAnp{5O}4ir{l&rH$9d?=Q1y>b2iljdjsS$6SBPk;Mk;QDb( z2W;EuX?feL#~%8%cSENhYkzoR{;ritf2Gfz@$7dC{{8m_UFW(3Yrd-w^xX38kK4a^ zdHQ#03tIS|-`srt*M$%7-}Km{ofp=_Uz5q?Vh}D$glB>SE;D-~&UVg@-?Jvx^e8j}{=?}lR^w}@Z?{ocCS-1cD+nX1> zHsP30Jy#CTo|%;Q*4v*RoU#9#ul6i|!~A{zXIB&*`_h7<@ZaX1oA0*FyJqaxp2N-j zGxs-ZOj@|bf7;BSPpN2e)6HdLGY&2~Y0H^rz8PT4EU&r8XU)XNf8JgB^8C0rFFO0G z@jXAvmuKadfAIWU<6gM9uITNvGiL;j-T2FvKd$@z!Zo+FyLR;5AB^hsVRh@f zHkaM9?t@R-ZObUDaF1W`!`h*(-nf4H08{^4GhW(s>r;O{IsL$iPd@y@$b;{n^rElJ zy)&N)Z=a2yALpC%SBo`o|GigH|BHUU$|7CM^zt$DCyE=@Swg3FjCUt%C;>T{g=c>bfE)71Gv1RX;a|iDY zym0BQZy)%g9E9OM@Y2*H@Dg%~7fZ@)wU$aM#I2SWf;iV~9N8ky z6wp5f<7kam$cb|`;K;I`y!7M0+x4mkhl$~yoNdUZeVmIIYD&F-^Yj(A)Lq~(F_4r~ zisg!P@dCmcKGy4SXIqLlsZ0!q<&@$j)DBqj)DPzkv!z}a8NTioE_IAUYHYU~_t;Wj zYAJ@yVjsfmrud}b6WKm;W9Q;c6RG>3ABIN34@Vm&;CGyhw;An0U7l2qRZBRAi;6fG zZ`GUOb8D;Mxse!3tKCY8Y31LzDiYH{Fg_fK>G0sFPd_x@q%im)juQN4VrdaknAOoqari&2nG}cr z2b-yxxdhS-5A<+H9y8xC$YHv|Aw|y35uAr2IP|YFlhX4_1m~j&&i4_VzalsY1#2Zm z^50^W%rcuhwc51^L}1L2P&TF^0`pb`=l2Lsdv+;Fru7peIH?hwkrAAn2+rgPPEiEs zLe1%9nAWe>oGupU0nO=PaW-mBdyDgy<|JC2A2i3_5w{sTJ(9iuZCB0dYDo>!oNg9p ztmfG5JSBot62Unyg0mumb5#WAfe6m#2+ju)oS!2&9e6>OWVUL*2u@Z6=d1|Mc@Z4t z(?Zpz=6fSB8#Sl1g?U$Vjsr)XmY+1|c#G4F7fYme7N?WuFr1^3!u_M9?iR<~&#;HZ zDbX0ago_*;gjgKHs~HpLa0x}2daC?Z|0xT{TEFp{BAmfPHHKFr#Yxp1Uca0i&gD)H zuPIJFoYfU)2q-4b;lfEvliw;BpffZg|D}zy_8pyj=)-q9S)stL&@~l|BNP~xagdVL z0;mmNUp>c`dO%AF#u0YRBT}60nfAw@e_t2N)>bX$K@Qd=A+K!pBFD1z$$`}OY^krb zlwcgTdW#g-7)%UtX7Bjgj7uUU!8mO70oS%wz2($zY^f8plwcgTl0?e1#l3dzK#{|> zlwcgT`Z{bqecU&1*;3QAlwcgTP82D*f`j^W>-wv0seqOejKkJR4qNyAJ@AJub*+{X zjKfy4NXhC2)ZYi3c)Bh1gq9MF!&X0st=k9n8D&fD(NcnO*y?XdfiU{Mc2-|I$l(Dk zB^ZaT0hSa;^tKP)9A--;=o2CshpmB@6bP|p@2GsTmJ*D^*2$I>ZT;)j>3wXe@mfkS z4qJmPDG*}I-sQMVO9{qd>l91Mv}H?Orlkbqu*G@E-VdDn`gXO(*Zo>bFb-RT9k#kW z@oFnu>SZk@7>6y+F>0iMka~5qY<;Pv1mm#98O|PGdwf66w53|Kq9(iyfDdMXke5X{ zd&RkuadhFcWxn^s&X%oyT1qeuTby5QTfcRTUusK@)l!0S*us)JtX|D6Tjy#i!8mMj zzPD{L^r$UWr=VW1H1*@;xppwyGqsdp9JY90W4Gb`>wc)RrIup08Y^m*9N-z#vqeY4<0nPy9MsLL4VrI+# zQ%ecPVJp*Nt2X%z>~LmEb>WRAl3*ORvcPrr!|s+;hL#eH!&bIPndfVVKY6MxHD5~! z#$juWNU>f_6TW`vgC3TxtF)A09JX?Rwa-`UzaHymORdvVf^pdLi3|^P*;HaCl zlwcgTavipKUACn@)>49T*cvNR=5_hTMGqfmOC8oyf^pay=dg9ksb8FJOLb<`A_>M} zD-T??W@F#z_VRTdZK*UZB^ZaT@gl`+N+l=sxXP9~Q%ecPVQYd&nf-9)>`->{`x9D__G!8mM92G>4c>>IXJA1x&qhpj0h#iHQZH&L!8mN4?XbnZVM~3Yr3B-!g$KtW^Twe&ub*v8{h_4<y{^Msi|5@Fb-P< z4qLC^-r)^fszyr*#$ju=NSSlg!A`f|W=mbCr3B-!Rp_ua`Ow50Y^f);lwcgT=7^Np zH+l!M7uiy8YAL}uY!x|dm3BORmM!&@mJ*D^RB!W-*-5VqFR+R}~_H7p)8eVi5`oN*7iZWS0j@sxq-@cPak3pM*d75lLHT z<&_jJDv6$zTMmK3veNUz^L^#TlPXKgu}ye+K�rDJuzt<84`E|>NxK(mSm2iOb*EkTwGYRU_% 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�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⋘)3ONLzV66bdyD!`uw-USf$*3%7Q9`)fB(Gizc2N+XdqT75KiONj_$;wd z7?kDv9&LV6b~g9E5I*h7zd(s*(gz+z$rKPFjkGjDz~>NUaR~R4JA@&AFO7lmu_9Q| s$w6rVVmk!xe|rUodtU~hOM|B?Ee`U8kiVi}&-DDa2k`tn%2VV201P+y9smFU literal 0 HcmV?d00001 diff --git a/bsnes/thrift/libevent/lib/event_extra_64.lib b/bsnes/thrift/libevent/lib/event_extra_64.lib new file mode 100644 index 0000000000000000000000000000000000000000..3cbaec3e9b6c57ea299b9d7613ccb03c7e7f478f GIT binary patch literal 398032 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�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 + +namespace apache { +namespace thrift { + +namespace protocol { +class TProtocol; +} + +class TApplicationException : public TException { +public: + /** + * Error codes for the various types of exceptions. + */ + enum TApplicationExceptionType { + UNKNOWN = 0, + UNKNOWN_METHOD = 1, + INVALID_MESSAGE_TYPE = 2, + WRONG_METHOD_NAME = 3, + BAD_SEQUENCE_ID = 4, + MISSING_RESULT = 5, + INTERNAL_ERROR = 6, + PROTOCOL_ERROR = 7, + INVALID_TRANSFORM = 8, + INVALID_PROTOCOL = 9, + UNSUPPORTED_CLIENT_TYPE = 10 + }; + + TApplicationException() : TException(), type_(UNKNOWN) {} + + TApplicationException(TApplicationExceptionType type) : TException(), type_(type) {} + + TApplicationException(const std::string& message) : TException(message), type_(UNKNOWN) {} + + TApplicationException(TApplicationExceptionType type, const std::string& message) + : TException(message), type_(type) {} + + ~TApplicationException() noexcept override = default; + + /** + * Returns an error code that provides information about the type of error + * that has occurred. + * + * @return Error code + */ + TApplicationExceptionType getType() const { return type_; } + + const char* what() const noexcept override { + if (message_.empty()) { + switch (type_) { + case UNKNOWN: + return "TApplicationException: Unknown application exception"; + case UNKNOWN_METHOD: + return "TApplicationException: Unknown method"; + case INVALID_MESSAGE_TYPE: + return "TApplicationException: Invalid message type"; + case WRONG_METHOD_NAME: + return "TApplicationException: Wrong method name"; + case BAD_SEQUENCE_ID: + return "TApplicationException: Bad sequence identifier"; + case MISSING_RESULT: + return "TApplicationException: Missing result"; + case INTERNAL_ERROR: + return "TApplicationException: Internal error"; + case PROTOCOL_ERROR: + return "TApplicationException: Protocol error"; + case INVALID_TRANSFORM: + return "TApplicationException: Invalid transform"; + case INVALID_PROTOCOL: + return "TApplicationException: Invalid protocol"; + case UNSUPPORTED_CLIENT_TYPE: + return "TApplicationException: Unsupported client type"; + default: + return "TApplicationException: (Invalid exception type)"; + }; + } else { + return message_.c_str(); + } + } + + uint32_t read(protocol::TProtocol* iprot); + uint32_t write(protocol::TProtocol* oprot) const; + +protected: + /** + * Error code + */ + TApplicationExceptionType type_; +}; +} +} // apache::thrift + +#endif // #ifndef _THRIFT_TAPPLICATIONEXCEPTION_H_ diff --git a/bsnes/thrift/thrift/TBase.h b/bsnes/thrift/thrift/TBase.h new file mode 100644 index 00000000..e2e78e72 --- /dev/null +++ b/bsnes/thrift/thrift/TBase.h @@ -0,0 +1,38 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +#ifndef _THRIFT_TBASE_H_ +#define _THRIFT_TBASE_H_ 1 + +#include +#include + +namespace apache { +namespace thrift { + +class TBase { +public: + virtual ~TBase() = default; + virtual uint32_t read(protocol::TProtocol* iprot) = 0; + virtual uint32_t write(protocol::TProtocol* oprot) const = 0; +}; +} +} // apache::thrift + +#endif // #ifndef _THRIFT_TBASE_H_ diff --git a/bsnes/thrift/thrift/TConfiguration.h b/bsnes/thrift/thrift/TConfiguration.h new file mode 100644 index 00000000..5bff440a --- /dev/null +++ b/bsnes/thrift/thrift/TConfiguration.h @@ -0,0 +1,55 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +#ifndef THRIFT_TCONFIGURATION_H +#define THRIFT_TCONFIGURATION_H + +namespace apache { +namespace thrift { + +class TConfiguration +{ +public: + TConfiguration(int maxMessageSize = DEFAULT_MAX_MESSAGE_SIZE, + int maxFrameSize = DEFAULT_MAX_FRAME_SIZE, int recursionLimit = DEFAULT_RECURSION_DEPTH) + : maxMessageSize_(maxMessageSize), maxFrameSize_(maxFrameSize), recursionLimit_(recursionLimit) {} + + const static int DEFAULT_MAX_MESSAGE_SIZE = 100 * 1024 * 1024; + const static int DEFAULT_MAX_FRAME_SIZE = 16384000; // this value is used consistently across all Thrift libraries + const static int DEFAULT_RECURSION_DEPTH = 64; + + inline int getMaxMessageSize() { return maxMessageSize_; } + inline void setMaxMessageSize(int maxMessageSize) { maxMessageSize_ = maxMessageSize; } + inline int getMaxFrameSize() { return maxFrameSize_; } + inline void setMaxFrameSize(int maxFrameSize) { maxFrameSize_ = maxFrameSize; } + inline int getRecursionLimit() { return recursionLimit_; } + inline void setRecursionLimit(int recursionLimit) { recursionLimit_ = recursionLimit; } + +private: + int maxMessageSize_ = DEFAULT_MAX_MESSAGE_SIZE; + int maxFrameSize_ = DEFAULT_MAX_FRAME_SIZE; + int recursionLimit_ = DEFAULT_RECURSION_DEPTH; + + // TODO(someone_smart): add connection and i/o timeouts +}; +} +} // apache::thrift + +#endif /* THRIFT_TCONFIGURATION_H */ + diff --git a/bsnes/thrift/thrift/TDispatchProcessor.h b/bsnes/thrift/thrift/TDispatchProcessor.h new file mode 100644 index 00000000..ae522b2d --- /dev/null +++ b/bsnes/thrift/thrift/TDispatchProcessor.h @@ -0,0 +1,141 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +#ifndef _THRIFT_TDISPATCHPROCESSOR_H_ +#define _THRIFT_TDISPATCHPROCESSOR_H_ 1 + +#include + +namespace apache { +namespace thrift { + +/** + * TDispatchProcessor is a helper class to parse the message header then call + * another function to dispatch based on the function name. + * + * Subclasses must implement dispatchCall() to dispatch on the function name. + */ +template +class TDispatchProcessorT : public TProcessor { +public: + bool process(std::shared_ptr in, + std::shared_ptr out, + void* connectionContext) override { + protocol::TProtocol* inRaw = in.get(); + protocol::TProtocol* outRaw = out.get(); + + // Try to dynamic cast to the template protocol type + auto* specificIn = dynamic_cast(inRaw); + auto* specificOut = dynamic_cast(outRaw); + if (specificIn && specificOut) { + return processFast(specificIn, specificOut, connectionContext); + } + + // Log the fact that we have to use the slow path + T_GENERIC_PROTOCOL(this, inRaw, specificIn); + T_GENERIC_PROTOCOL(this, outRaw, specificOut); + + std::string fname; + protocol::TMessageType mtype; + int32_t seqid; + inRaw->readMessageBegin(fname, mtype, seqid); + + // If this doesn't look like a valid call, log an error and return false so + // that the server will close the connection. + // + // (The old generated processor code used to try to skip a T_STRUCT and + // continue. However, that seems unsafe.) + if (mtype != protocol::T_CALL && mtype != protocol::T_ONEWAY) { + GlobalOutput.printf("received invalid message type %d from client", mtype); + return false; + } + + return this->dispatchCall(inRaw, outRaw, fname, seqid, connectionContext); + } + +protected: + bool processFast(Protocol_* in, Protocol_* out, void* connectionContext) { + std::string fname; + protocol::TMessageType mtype; + int32_t seqid; + in->readMessageBegin(fname, mtype, seqid); + + if (mtype != protocol::T_CALL && mtype != protocol::T_ONEWAY) { + GlobalOutput.printf("received invalid message type %d from client", mtype); + return false; + } + + return this->dispatchCallTemplated(in, out, fname, seqid, connectionContext); + } + + /** + * dispatchCall() methods must be implemented by subclasses + */ + virtual bool dispatchCall(apache::thrift::protocol::TProtocol* in, + apache::thrift::protocol::TProtocol* out, + const std::string& fname, + int32_t seqid, + void* callContext) = 0; + + virtual bool dispatchCallTemplated(Protocol_* in, + Protocol_* out, + const std::string& fname, + int32_t seqid, + void* callContext) = 0; +}; + +/** + * Non-templatized version of TDispatchProcessor, that doesn't bother trying to + * perform a dynamic_cast. + */ +class TDispatchProcessor : public TProcessor { +public: + bool process(std::shared_ptr in, + std::shared_ptr out, + void* connectionContext) override { + std::string fname; + protocol::TMessageType mtype; + int32_t seqid; + in->readMessageBegin(fname, mtype, seqid); + + if (mtype != protocol::T_CALL && mtype != protocol::T_ONEWAY) { + GlobalOutput.printf("received invalid message type %d from client", mtype); + return false; + } + + return dispatchCall(in.get(), out.get(), fname, seqid, connectionContext); + } + +protected: + virtual bool dispatchCall(apache::thrift::protocol::TProtocol* in, + apache::thrift::protocol::TProtocol* out, + const std::string& fname, + int32_t seqid, + void* callContext) = 0; +}; + +// Specialize TDispatchProcessorT for TProtocol and TDummyProtocol just to use +// the generic TDispatchProcessor. +template <> +class TDispatchProcessorT : public TDispatchProcessor {}; +template <> +class TDispatchProcessorT : public TDispatchProcessor {}; +} +} // apache::thrift + +#endif // _THRIFT_TDISPATCHPROCESSOR_H_ diff --git a/bsnes/thrift/thrift/TLogging.h b/bsnes/thrift/thrift/TLogging.h new file mode 100644 index 00000000..07ff030f --- /dev/null +++ b/bsnes/thrift/thrift/TLogging.h @@ -0,0 +1,195 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +#ifndef _THRIFT_TLOGGING_H_ +#define _THRIFT_TLOGGING_H_ 1 + +#include + +/** + * Contains utility macros for debugging and logging. + * + */ + +#include + +#ifdef HAVE_STDINT_H +#include +#endif + +/** + * T_GLOBAL_DEBUGGING_LEVEL = 0: all debugging turned off, debug macros undefined + * T_GLOBAL_DEBUGGING_LEVEL = 1: all debugging turned on + */ +#define T_GLOBAL_DEBUGGING_LEVEL 0 + +/** + * T_GLOBAL_LOGGING_LEVEL = 0: all logging turned off, logging macros undefined + * T_GLOBAL_LOGGING_LEVEL = 1: all logging turned on + */ +#define T_GLOBAL_LOGGING_LEVEL 1 + +/** + * Standard wrapper around fprintf what will prefix the file name and line + * number to the line. Uses T_GLOBAL_DEBUGGING_LEVEL to control whether it is + * turned on or off. + * + * @param format_string + */ +#if T_GLOBAL_DEBUGGING_LEVEL > 0 +#define T_DEBUG(format_string, ...) \ + if (T_GLOBAL_DEBUGGING_LEVEL > 0) { \ + fprintf(stderr, "[%s,%d] " format_string " \n", __FILE__, __LINE__, ##__VA_ARGS__); \ + } +#else +#define T_DEBUG(format_string, ...) +#endif + +/** + * analogous to T_DEBUG but also prints the time + * + * @param string format_string input: printf style format string + */ +#if T_GLOBAL_DEBUGGING_LEVEL > 0 +#define T_DEBUG_T(format_string, ...) \ + { \ + if (T_GLOBAL_DEBUGGING_LEVEL > 0) { \ + time_t now; \ + char dbgtime[26]; \ + time(&now); \ + THRIFT_CTIME_R(&now, dbgtime); \ + dbgtime[24] = '\0'; \ + fprintf(stderr, \ + "[%s,%d] [%s] " format_string " \n", \ + __FILE__, \ + __LINE__, \ + dbgtime, \ + ##__VA_ARGS__); \ + } \ + } +#else +#define T_DEBUG_T(format_string, ...) +#endif + +/** + * analogous to T_DEBUG but uses input level to determine whether or not the string + * should be logged. + * + * @param int level: specified debug level + * @param string format_string input: format string + */ +#define T_DEBUG_L(level, format_string, ...) \ + if ((level) > 0) { \ + fprintf(stderr, "[%s,%d] " format_string " \n", __FILE__, __LINE__, ##__VA_ARGS__); \ + } + +/** + * Explicit error logging. Prints time, file name and line number + * + * @param string format_string input: printf style format string + */ +#define T_ERROR(format_string, ...) \ + { \ + time_t now; \ + char dbgtime[26]; \ + time(&now); \ + THRIFT_CTIME_R(&now, dbgtime); \ + dbgtime[24] = '\0'; \ + fprintf(stderr, \ + "[%s,%d] [%s] ERROR: " format_string " \n", \ + __FILE__, \ + __LINE__, \ + dbgtime, \ + ##__VA_ARGS__); \ + } + +/** + * Analogous to T_ERROR, additionally aborting the process. + * WARNING: macro calls abort(), ending program execution + * + * @param string format_string input: printf style format string + */ +#define T_ERROR_ABORT(format_string, ...) \ + { \ + time_t now; \ + char dbgtime[26]; \ + time(&now); \ + THRIFT_CTIME_R(&now, dbgtime); \ + dbgtime[24] = '\0'; \ + fprintf(stderr, \ + "[%s,%d] [%s] ERROR: Going to abort " format_string " \n", \ + __FILE__, \ + __LINE__, \ + dbgtime, \ + ##__VA_ARGS__); \ + exit(1); \ + } + +/** + * Log input message + * + * @param string format_string input: printf style format string + */ +#if T_GLOBAL_LOGGING_LEVEL > 0 +#define T_LOG_OPER(format_string, ...) \ + { \ + if (T_GLOBAL_LOGGING_LEVEL > 0) { \ + time_t now; \ + char dbgtime[26]; \ + time(&now); \ + THRIFT_CTIME_R(&now, dbgtime); \ + dbgtime[24] = '\0'; \ + fprintf(stderr, "[%s] " format_string " \n", dbgtime, ##__VA_ARGS__); \ + } \ + } +#else +#define T_LOG_OPER(format_string, ...) +#endif + +/** + * T_GLOBAL_DEBUG_VIRTUAL = 0 or unset: normal operation, + * virtual call debug messages disabled + * T_GLOBAL_DEBUG_VIRTUAL = 1: log a debug messages whenever an + * avoidable virtual call is made + * T_GLOBAL_DEBUG_VIRTUAL = 2: record detailed info that can be + * printed by calling + * apache::thrift::profile_print_info() + */ +#if T_GLOBAL_DEBUG_VIRTUAL > 1 +#define T_VIRTUAL_CALL() ::apache::thrift::profile_virtual_call(typeid(*this)) +#define T_GENERIC_PROTOCOL(template_class, generic_prot, specific_prot) \ + do { \ + if (!(specific_prot)) { \ + ::apache::thrift::profile_generic_protocol(typeid(*template_class), typeid(*generic_prot)); \ + } \ + } while (0) +#elif T_GLOBAL_DEBUG_VIRTUAL == 1 +#define T_VIRTUAL_CALL() fprintf(stderr, "[%s,%d] virtual call\n", __FILE__, __LINE__) +#define T_GENERIC_PROTOCOL(template_class, generic_prot, specific_prot) \ + do { \ + if (!(specific_prot)) { \ + fprintf(stderr, "[%s,%d] failed to cast to specific protocol type\n", __FILE__, __LINE__); \ + } \ + } while (0) +#else +#define T_VIRTUAL_CALL() +#define T_GENERIC_PROTOCOL(template_class, generic_prot, specific_prot) +#endif + +#endif // #ifndef _THRIFT_TLOGGING_H_ diff --git a/bsnes/thrift/thrift/TOutput.h b/bsnes/thrift/thrift/TOutput.h new file mode 100644 index 00000000..26c9a563 --- /dev/null +++ b/bsnes/thrift/thrift/TOutput.h @@ -0,0 +1,60 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +#ifndef _THRIFT_OUTPUT_H_ +#define _THRIFT_OUTPUT_H_ 1 + +#include + +namespace apache { +namespace thrift { + +class TOutput { +public: + TOutput(); + + inline void setOutputFunction(void (*function)(const char*)) { f_ = function; } + + inline void operator()(const char* message) { f_(message); } + + // It is important to have a const char* overload here instead of + // just the string version, otherwise errno could be corrupted + // if there is some problem allocating memory when constructing + // the string. + void perror(const char* message, int errno_copy); + inline void perror(const std::string& message, int errno_copy) { + perror(message.c_str(), errno_copy); + } + + void printf(const char* message, ...); + + static void errorTimeWrapper(const char* msg); + + /** Just like strerror_r but returns a C++ string object. */ + static std::string strerror_s(int errno_copy); + +private: + void (*f_)(const char*); +}; + +THRIFT_EXPORT extern TOutput GlobalOutput; +} +} // namespace apache::thrift + +#endif //_THRIFT_OUTPUT_H_ diff --git a/bsnes/thrift/thrift/TProcessor.h b/bsnes/thrift/thrift/TProcessor.h new file mode 100644 index 00000000..65bf3d4a --- /dev/null +++ b/bsnes/thrift/thrift/TProcessor.h @@ -0,0 +1,229 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +#ifndef _THRIFT_TPROCESSOR_H_ +#define _THRIFT_TPROCESSOR_H_ 1 + +#include +#include + +namespace apache { +namespace thrift { + +/** + * Virtual interface class that can handle events from the processor. To + * use this you should subclass it and implement the methods that you care + * about. Your subclass can also store local data that you may care about, + * such as additional "arguments" to these methods (stored in the object + * instance's state). + */ +class TProcessorEventHandler { +public: + virtual ~TProcessorEventHandler() = default; + + /** + * Called before calling other callback methods. + * Expected to return some sort of context object. + * The return value is passed to all other callbacks + * for that function invocation. + */ + virtual void* getContext(const char* fn_name, void* serverContext) { + (void)fn_name; + (void)serverContext; + return nullptr; + } + + /** + * Expected to free resources associated with a context. + */ + virtual void freeContext(void* ctx, const char* fn_name) { + (void)ctx; + (void)fn_name; + } + + /** + * Called before reading arguments. + */ + virtual void preRead(void* ctx, const char* fn_name) { + (void)ctx; + (void)fn_name; + } + + /** + * Called between reading arguments and calling the handler. + */ + virtual void postRead(void* ctx, const char* fn_name, uint32_t bytes) { + (void)ctx; + (void)fn_name; + (void)bytes; + } + + /** + * Called between calling the handler and writing the response. + */ + virtual void preWrite(void* ctx, const char* fn_name) { + (void)ctx; + (void)fn_name; + } + + /** + * Called after writing the response. + */ + virtual void postWrite(void* ctx, const char* fn_name, uint32_t bytes) { + (void)ctx; + (void)fn_name; + (void)bytes; + } + + /** + * Called when an async function call completes successfully. + */ + virtual void asyncComplete(void* ctx, const char* fn_name) { + (void)ctx; + (void)fn_name; + } + + /** + * Called if the handler throws an undeclared exception. + */ + virtual void handlerError(void* ctx, const char* fn_name) { + (void)ctx; + (void)fn_name; + } + +protected: + TProcessorEventHandler() = default; +}; + +/** + * A helper class used by the generated code to free each context. + */ +class TProcessorContextFreer { +public: + TProcessorContextFreer(TProcessorEventHandler* handler, void* context, const char* method) + : handler_(handler), context_(context), method_(method) {} + ~TProcessorContextFreer() { + if (handler_ != nullptr) + handler_->freeContext(context_, method_); + } + void unregister() { handler_ = nullptr; } + +private: + apache::thrift::TProcessorEventHandler* handler_; + void* context_; + const char* method_; +}; + +/** + * A processor is a generic object that acts upon two streams of data, one + * an input and the other an output. The definition of this object is loose, + * though the typical case is for some sort of server that either generates + * responses to an input stream or forwards data from one pipe onto another. + * + */ +class TProcessor { +public: + virtual ~TProcessor() = default; + + virtual bool process(std::shared_ptr in, + std::shared_ptr out, + void* connectionContext) = 0; + + bool process(std::shared_ptr io, void* connectionContext) { + return process(io, io, connectionContext); + } + + std::shared_ptr getEventHandler() const { return eventHandler_; } + + void setEventHandler(std::shared_ptr eventHandler) { + eventHandler_ = eventHandler; + } + +protected: + TProcessor() = default; + + std::shared_ptr eventHandler_; +}; + +/** + * This is a helper class to allow std::shared_ptr to be used with handler + * pointers returned by the generated handler factories. + * + * The handler factory classes generated by the thrift compiler return raw + * pointers, and factory->releaseHandler() must be called when the handler is + * no longer needed. + * + * A ReleaseHandler object can be instantiated and passed as the second + * parameter to a shared_ptr, so that factory->releaseHandler() will be called + * when the object is no longer needed, instead of deleting the pointer. + */ +template +class ReleaseHandler { +public: + ReleaseHandler(const std::shared_ptr& handlerFactory) + : handlerFactory_(handlerFactory) {} + + void operator()(typename HandlerFactory_::Handler* handler) { + if (handler) { + handlerFactory_->releaseHandler(handler); + } + } + +private: + std::shared_ptr handlerFactory_; +}; + +struct TConnectionInfo { + // The input and output protocols + std::shared_ptr input; + std::shared_ptr output; + // The underlying transport used for the connection + // This is the transport that was returned by TServerTransport::accept(), + // and it may be different than the transport pointed to by the input and + // output protocols. + std::shared_ptr transport; +}; + +class TProcessorFactory { +public: + virtual ~TProcessorFactory() = default; + + /** + * Get the TProcessor to use for a particular connection. + * + * This method is always invoked in the same thread that the connection was + * accepted on. This generally means that this call does not need to be + * thread safe, as it will always be invoked from a single thread. + */ + virtual std::shared_ptr getProcessor(const TConnectionInfo& connInfo) = 0; +}; + +class TSingletonProcessorFactory : public TProcessorFactory { +public: + TSingletonProcessorFactory(std::shared_ptr processor) : processor_(processor) {} + + std::shared_ptr getProcessor(const TConnectionInfo&) override { return processor_; } + +private: + std::shared_ptr processor_; +}; +} +} // apache::thrift + +#endif // #ifndef _THRIFT_TPROCESSOR_H_ diff --git a/bsnes/thrift/thrift/TToString.h b/bsnes/thrift/thrift/TToString.h new file mode 100644 index 00000000..25780f9d --- /dev/null +++ b/bsnes/thrift/thrift/TToString.h @@ -0,0 +1,114 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +#ifndef _THRIFT_TOSTRING_H_ +#define _THRIFT_TOSTRING_H_ 1 + +#include +#include +#include +#include +#include +#include +#include + +namespace apache { +namespace thrift { + +template +std::string to_string(const T& t) { + std::ostringstream o; + o << t; + return o.str(); +} + +// TODO: replace the computations below with std::numeric_limits::max_digits10 once C++11 +// is enabled. +inline std::string to_string(const float& t) { + std::ostringstream o; + o.precision(static_cast(std::ceil(static_cast(std::numeric_limits::digits * std::log10(2.0f) + 1)))); + o << t; + return o.str(); +} + +inline std::string to_string(const double& t) { + std::ostringstream o; + o.precision(static_cast(std::ceil(static_cast(std::numeric_limits::digits * std::log10(2.0f) + 1)))); + o << t; + return o.str(); +} + +inline std::string to_string(const long double& t) { + std::ostringstream o; + o.precision(static_cast(std::ceil(static_cast(std::numeric_limits::digits * std::log10(2.0f) + 1)))); + o << t; + return o.str(); +} + +template +std::string to_string(const std::map& m); + +template +std::string to_string(const std::set& s); + +template +std::string to_string(const std::vector& t); + +template +std::string to_string(const typename std::pair& v) { + std::ostringstream o; + o << to_string(v.first) << ": " << to_string(v.second); + return o.str(); +} + +template +std::string to_string(const T& beg, const T& end) { + std::ostringstream o; + for (T it = beg; it != end; ++it) { + if (it != beg) + o << ", "; + o << to_string(*it); + } + return o.str(); +} + +template +std::string to_string(const std::vector& t) { + std::ostringstream o; + o << "[" << to_string(t.begin(), t.end()) << "]"; + return o.str(); +} + +template +std::string to_string(const std::map& m) { + std::ostringstream o; + o << "{" << to_string(m.begin(), m.end()) << "}"; + return o.str(); +} + +template +std::string to_string(const std::set& s) { + std::ostringstream o; + o << "{" << to_string(s.begin(), s.end()) << "}"; + return o.str(); +} +} +} // apache::thrift + +#endif // _THRIFT_TOSTRING_H_ diff --git a/bsnes/thrift/thrift/Thrift.h b/bsnes/thrift/thrift/Thrift.h new file mode 100644 index 00000000..d5066ee7 --- /dev/null +++ b/bsnes/thrift/thrift/Thrift.h @@ -0,0 +1,133 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +#ifndef _THRIFT_THRIFT_H_ +#define _THRIFT_THRIFT_H_ 1 + +#include + +#include + +#include +#include + +#include +#ifdef HAVE_NETINET_IN_H +#include +#endif +#ifdef HAVE_INTTYPES_H +#include +#endif +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +#define THRIFT_UNUSED_VARIABLE(x) ((void)(x)) + +namespace apache { +namespace thrift { + +class TEnumIterator + : public std::iterator > { +public: + TEnumIterator(int n, int* enums, const char** names) + : ii_(0), n_(n), enums_(enums), names_(names) {} + + int operator++() { return ++ii_; } + + bool operator!=(const TEnumIterator& end) { + THRIFT_UNUSED_VARIABLE(end); + assert(end.n_ == -1); + return (ii_ != n_); + } + + std::pair operator*() const { return std::make_pair(enums_[ii_], names_[ii_]); } + +private: + int ii_; + const int n_; + int* enums_; + const char** names_; +}; + +class TException : public std::exception { +public: + TException() : message_() {} + + TException(const std::string& message) : message_(message) {} + + virtual ~TException() noexcept override = default; + + const char* what() const noexcept override { + if (message_.empty()) { + return "Default TException."; + } else { + return message_.c_str(); + } + } + +protected: + std::string message_; +}; + +class TDelayedException { +public: + template + static TDelayedException* delayException(const E& e); + virtual void throw_it() = 0; + virtual ~TDelayedException() = default; +}; + +template +class TExceptionWrapper : public TDelayedException { +public: + TExceptionWrapper(const E& e) : e_(e) {} + void throw_it() override { + E temp(e_); + delete this; + throw temp; + } + +private: + E e_; +}; + +template +TDelayedException* TDelayedException::delayException(const E& e) { + return new TExceptionWrapper(e); +} + +#if T_GLOBAL_DEBUG_VIRTUAL > 1 +void profile_virtual_call(const std::type_info& info); +void profile_generic_protocol(const std::type_info& template_type, const std::type_info& prot_type); +void profile_print_info(FILE* f); +void profile_print_info(); +void profile_write_pprof(FILE* gen_calls_f, FILE* virtual_calls_f); +#endif +} +} // apache::thrift + +#endif // #ifndef _THRIFT_THRIFT_H_ diff --git a/bsnes/thrift/thrift/async/TAsyncBufferProcessor.h b/bsnes/thrift/thrift/async/TAsyncBufferProcessor.h new file mode 100644 index 00000000..e3c3597c --- /dev/null +++ b/bsnes/thrift/thrift/async/TAsyncBufferProcessor.h @@ -0,0 +1,46 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +#ifndef _THRIFT_TASYNC_BUFFER_PROCESSOR_H_ +#define _THRIFT_TASYNC_BUFFER_PROCESSOR_H_ 1 + +#include +#include + +namespace apache { +namespace thrift { +namespace async { + +class TAsyncBufferProcessor { +public: + // Process data in "in", putting the result in "out". + // Call _return(true) when done, or _return(false) to + // forcefully close the connection (if applicable). + // "in" and "out" should be TMemoryBuffer or similar, + // not a wrapper around a socket. + virtual void process(std::function _return, + std::shared_ptr ibuf, + std::shared_ptr obuf) = 0; + virtual ~TAsyncBufferProcessor() = default; +}; +} +} +} // apache::thrift::async + +#endif // #ifndef _THRIFT_TASYNC_BUFFER_PROCESSOR_H_ diff --git a/bsnes/thrift/thrift/async/TAsyncChannel.h b/bsnes/thrift/thrift/async/TAsyncChannel.h new file mode 100644 index 00000000..22cf3838 --- /dev/null +++ b/bsnes/thrift/thrift/async/TAsyncChannel.h @@ -0,0 +1,74 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +#ifndef _THRIFT_ASYNC_TASYNCCHANNEL_H_ +#define _THRIFT_ASYNC_TASYNCCHANNEL_H_ 1 + +#include +#include +#include + +namespace apache { +namespace thrift { +namespace transport { +class TMemoryBuffer; +} +} +} + +namespace apache { +namespace thrift { +namespace async { +using apache::thrift::transport::TMemoryBuffer; + +class TAsyncChannel { +public: + typedef std::function VoidCallback; + + virtual ~TAsyncChannel() = default; + + // is the channel in a good state? + virtual bool good() const = 0; + virtual bool error() const = 0; + virtual bool timedOut() const = 0; + + /** + * Send a message over the channel. + */ + virtual void sendMessage(const VoidCallback& cob, + apache::thrift::transport::TMemoryBuffer* message) = 0; + + /** + * Receive a message from the channel. + */ + virtual void recvMessage(const VoidCallback& cob, + apache::thrift::transport::TMemoryBuffer* message) = 0; + + /** + * Send a message over the channel and receive a response. + */ + virtual void sendAndRecvMessage(const VoidCallback& cob, + apache::thrift::transport::TMemoryBuffer* sendBuf, + apache::thrift::transport::TMemoryBuffer* recvBuf); +}; +} +} +} // apache::thrift::async + +#endif // #ifndef _THRIFT_ASYNC_TASYNCCHANNEL_H_ diff --git a/bsnes/thrift/thrift/async/TAsyncDispatchProcessor.h b/bsnes/thrift/thrift/async/TAsyncDispatchProcessor.h new file mode 100644 index 00000000..2a694ac5 --- /dev/null +++ b/bsnes/thrift/thrift/async/TAsyncDispatchProcessor.h @@ -0,0 +1,151 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +#ifndef _THRIFT_ASYNC_TASYNCDISPATCHPROCESSOR_H_ +#define _THRIFT_ASYNC_TASYNCDISPATCHPROCESSOR_H_ 1 + +#include + +namespace apache { +namespace thrift { +namespace async { + +/** + * TAsyncDispatchProcessor is a helper class to parse the message header then + * call another function to dispatch based on the function name. + * + * Subclasses must implement dispatchCall() to dispatch on the function name. + */ +template +class TAsyncDispatchProcessorT : public TAsyncProcessor { +public: + void process(std::function _return, + std::shared_ptr in, + std::shared_ptr out) override { + protocol::TProtocol* inRaw = in.get(); + protocol::TProtocol* outRaw = out.get(); + + // Try to dynamic cast to the template protocol type + auto* specificIn = dynamic_cast(inRaw); + auto* specificOut = dynamic_cast(outRaw); + if (specificIn && specificOut) { + return processFast(_return, specificIn, specificOut); + } + + // Log the fact that we have to use the slow path + T_GENERIC_PROTOCOL(this, inRaw, specificIn); + T_GENERIC_PROTOCOL(this, outRaw, specificOut); + + std::string fname; + protocol::TMessageType mtype; + int32_t seqid; + inRaw->readMessageBegin(fname, mtype, seqid); + + // If this doesn't look like a valid call, log an error and return false so + // that the server will close the connection. + // + // (The old generated processor code used to try to skip a T_STRUCT and + // continue. However, that seems unsafe.) + if (mtype != protocol::T_CALL && mtype != protocol::T_ONEWAY) { + GlobalOutput.printf("received invalid message type %d from client", mtype); + _return(false); + return; + } + + return this->dispatchCall(_return, inRaw, outRaw, fname, seqid); + } + + void processFast(std::function _return, + Protocol_* in, + Protocol_* out) { + std::string fname; + protocol::TMessageType mtype; + int32_t seqid; + in->readMessageBegin(fname, mtype, seqid); + + if (mtype != protocol::T_CALL && mtype != protocol::T_ONEWAY) { + GlobalOutput.printf("received invalid message type %d from client", mtype); + _return(false); + return; + } + + return this->dispatchCallTemplated(_return, in, out, fname, seqid); + } + + virtual void dispatchCall(std::function _return, + apache::thrift::protocol::TProtocol* in, + apache::thrift::protocol::TProtocol* out, + const std::string& fname, + int32_t seqid) = 0; + + virtual void dispatchCallTemplated(std::function _return, + Protocol_* in, + Protocol_* out, + const std::string& fname, + int32_t seqid) = 0; +}; + +/** + * Non-templatized version of TAsyncDispatchProcessor, + * that doesn't bother trying to perform a dynamic_cast. + */ +class TAsyncDispatchProcessor : public TAsyncProcessor { +public: + void process(std::function _return, + std::shared_ptr in, + std::shared_ptr out) override { + protocol::TProtocol* inRaw = in.get(); + protocol::TProtocol* outRaw = out.get(); + + std::string fname; + protocol::TMessageType mtype; + int32_t seqid; + inRaw->readMessageBegin(fname, mtype, seqid); + + // If this doesn't look like a valid call, log an error and return false so + // that the server will close the connection. + // + // (The old generated processor code used to try to skip a T_STRUCT and + // continue. However, that seems unsafe.) + if (mtype != protocol::T_CALL && mtype != protocol::T_ONEWAY) { + GlobalOutput.printf("received invalid message type %d from client", mtype); + _return(false); + return; + } + + return dispatchCall(_return, inRaw, outRaw, fname, seqid); + } + + virtual void dispatchCall(std::function _return, + apache::thrift::protocol::TProtocol* in, + apache::thrift::protocol::TProtocol* out, + const std::string& fname, + int32_t seqid) = 0; +}; + +// Specialize TAsyncDispatchProcessorT for TProtocol and TDummyProtocol just to +// use the generic TDispatchProcessor. +template <> +class TAsyncDispatchProcessorT : public TAsyncDispatchProcessor {}; +template <> +class TAsyncDispatchProcessorT : public TAsyncDispatchProcessor {}; +} +} +} // apache::thrift::async + +#endif // _THRIFT_ASYNC_TASYNCDISPATCHPROCESSOR_H_ diff --git a/bsnes/thrift/thrift/async/TAsyncProcessor.h b/bsnes/thrift/thrift/async/TAsyncProcessor.h new file mode 100644 index 00000000..01923394 --- /dev/null +++ b/bsnes/thrift/thrift/async/TAsyncProcessor.h @@ -0,0 +1,84 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +#ifndef _THRIFT_TASYNCPROCESSOR_H_ +#define _THRIFT_TASYNCPROCESSOR_H_ 1 + +#include +#include +#include + +namespace apache { +namespace thrift { +namespace async { + +/** + * Async version of a TProcessor. It is not expected to complete by the time + * the call to process returns. Instead, it calls a cob to signal completion. + */ + +class TAsyncProcessor { +public: + virtual ~TAsyncProcessor() = default; + + virtual void process(std::function _return, + std::shared_ptr in, + std::shared_ptr out) = 0; + + void process(std::function _return, + std::shared_ptr io) { + return process(_return, io, io); + } + + std::shared_ptr getEventHandler() const { return eventHandler_; } + + void setEventHandler(std::shared_ptr eventHandler) { + eventHandler_ = eventHandler; + } + +protected: + TAsyncProcessor() = default; + + std::shared_ptr eventHandler_; +}; + +class TAsyncProcessorFactory { +public: + virtual ~TAsyncProcessorFactory() = default; + + /** + * Get the TAsyncProcessor to use for a particular connection. + * + * This method is always invoked in the same thread that the connection was + * accepted on. This generally means that this call does not need to be + * thread safe, as it will always be invoked from a single thread. + */ + virtual std::shared_ptr getProcessor(const TConnectionInfo& connInfo) = 0; +}; +} +} +} // apache::thrift::async + +namespace apache { +namespace thrift { + using apache::thrift::async::TAsyncProcessor; +} +} + +#endif // #ifndef _THRIFT_TASYNCPROCESSOR_H_ diff --git a/bsnes/thrift/thrift/async/TAsyncProtocolProcessor.h b/bsnes/thrift/thrift/async/TAsyncProtocolProcessor.h new file mode 100644 index 00000000..ace72b6d --- /dev/null +++ b/bsnes/thrift/thrift/async/TAsyncProtocolProcessor.h @@ -0,0 +1,55 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +#ifndef _THRIFT_TNAME_ME_H_ +#define _THRIFT_TNAME_ME_H_ 1 + +#include +#include +#include + +namespace apache { +namespace thrift { +namespace async { + +class TAsyncProtocolProcessor : public TAsyncBufferProcessor { +public: + TAsyncProtocolProcessor(std::shared_ptr underlying, + std::shared_ptr pfact) + : underlying_(underlying), pfact_(pfact) {} + + void process(std::function _return, + std::shared_ptr ibuf, + std::shared_ptr obuf) override; + + ~TAsyncProtocolProcessor() override = default; + +private: + static void finish(std::function _return, + std::shared_ptr oprot, + bool healthy); + + std::shared_ptr underlying_; + std::shared_ptr pfact_; +}; +} +} +} // apache::thrift::async + +#endif // #ifndef _THRIFT_TNAME_ME_H_ diff --git a/bsnes/thrift/thrift/async/TConcurrentClientSyncInfo.h b/bsnes/thrift/thrift/async/TConcurrentClientSyncInfo.h new file mode 100644 index 00000000..0bc5eb56 --- /dev/null +++ b/bsnes/thrift/thrift/async/TConcurrentClientSyncInfo.h @@ -0,0 +1,126 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +#ifndef _THRIFT_TCONCURRENTCLIENTSYNCINFO_H_ +#define _THRIFT_TCONCURRENTCLIENTSYNCINFO_H_ 1 + +#include +#include +#include +#include +#include +#include +#include + +namespace apache { +namespace thrift { +namespace async { + +class TConcurrentClientSyncInfo; + +class TConcurrentSendSentry { +public: + explicit TConcurrentSendSentry(TConcurrentClientSyncInfo* sync); + ~TConcurrentSendSentry(); + + void commit(); + +private: + TConcurrentClientSyncInfo& sync_; + bool committed_; +}; + +class TConcurrentRecvSentry { +public: + TConcurrentRecvSentry(TConcurrentClientSyncInfo* sync, int32_t seqid); + ~TConcurrentRecvSentry(); + + void commit(); + +private: + TConcurrentClientSyncInfo& sync_; + int32_t seqid_; + bool committed_; +}; + +class TConcurrentClientSyncInfo { +private: // typedefs + typedef std::shared_ptr< ::apache::thrift::concurrency::Monitor> MonitorPtr; + typedef std::map MonitorMap; + +public: + TConcurrentClientSyncInfo(); + + int32_t generateSeqId(); + + bool getPending(std::string& fname, + ::apache::thrift::protocol::TMessageType& mtype, + int32_t& rseqid); /* requires readMutex_ */ + + void updatePending(const std::string& fname, + ::apache::thrift::protocol::TMessageType mtype, + int32_t rseqid); /* requires readMutex_ */ + + void waitForWork(int32_t seqid); /* requires readMutex_ */ + + ::apache::thrift::concurrency::Mutex& getReadMutex() { return readMutex_; } + ::apache::thrift::concurrency::Mutex& getWriteMutex() { return writeMutex_; } + +private: // constants + enum { MONITOR_CACHE_SIZE = 10 }; + +private: // functions + MonitorPtr newMonitor_( + const ::apache::thrift::concurrency::Guard& seqidGuard); /* requires seqidMutex_ */ + void deleteMonitor_(const ::apache::thrift::concurrency::Guard& seqidGuard, MonitorPtr& m); + /*noexcept*/ /* requires seqidMutex_ */ + void wakeupAnyone_( + const ::apache::thrift::concurrency::Guard& seqidGuard); /* requires seqidMutex_ */ + void markBad_(const ::apache::thrift::concurrency::Guard& seqidGuard); /* requires seqidMutex_ */ + void throwBadSeqId_(); + void throwDeadConnection_(); + +private: // data members + volatile bool stop_; + + ::apache::thrift::concurrency::Mutex seqidMutex_; + // begin seqidMutex_ protected members + int32_t nextseqid_; + MonitorMap seqidToMonitorMap_; + std::vector freeMonitors_; + // end seqidMutex_ protected members + + ::apache::thrift::concurrency::Mutex writeMutex_; + + ::apache::thrift::concurrency::Mutex readMutex_; + // begin readMutex_ protected members + bool recvPending_; + bool wakeupSomeone_; + int32_t seqidPending_; + std::string fnamePending_; + ::apache::thrift::protocol::TMessageType mtypePending_; + // end readMutex_ protected members + + friend class TConcurrentSendSentry; + friend class TConcurrentRecvSentry; +}; +} +} +} // apache::thrift::async + +#endif // _THRIFT_TCONCURRENTCLIENTSYNCINFO_H_ diff --git a/bsnes/thrift/thrift/async/TEvhttpClientChannel.h b/bsnes/thrift/thrift/async/TEvhttpClientChannel.h new file mode 100644 index 00000000..f7427266 --- /dev/null +++ b/bsnes/thrift/thrift/async/TEvhttpClientChannel.h @@ -0,0 +1,88 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +#ifndef _THRIFT_TEVHTTP_CLIENT_CHANNEL_H_ +#define _THRIFT_TEVHTTP_CLIENT_CHANNEL_H_ 1 + +#include +#include +#include +#include +#include + +struct event_base; +struct evdns_base; +struct evhttp_connection; +struct evhttp_request; + +namespace apache { +namespace thrift { +namespace transport { +class TMemoryBuffer; +} +} +} + +namespace apache { +namespace thrift { +namespace async { + +class TEvhttpClientChannel : public TAsyncChannel { +public: + using TAsyncChannel::VoidCallback; + + TEvhttpClientChannel(const std::string& host, + const std::string& path, + const char* address, + int port, + struct event_base* eb, + struct evdns_base *dnsbase = nullptr); + ~TEvhttpClientChannel() override; + + void sendAndRecvMessage(const VoidCallback& cob, + apache::thrift::transport::TMemoryBuffer* sendBuf, + apache::thrift::transport::TMemoryBuffer* recvBuf) override; + + void sendMessage(const VoidCallback& cob, + apache::thrift::transport::TMemoryBuffer* message) override; + void recvMessage(const VoidCallback& cob, + apache::thrift::transport::TMemoryBuffer* message) override; + + void finish(struct evhttp_request* req); + + // XXX + bool good() const override { return true; } + bool error() const override { return false; } + bool timedOut() const override { return false; } + +private: + static void response(struct evhttp_request* req, void* arg); + + std::string host_; + std::string path_; + typedef std::pair Completion; + typedef std::queue CompletionQueue; + CompletionQueue completionQueue_; + struct evhttp_connection* conn_; +}; +} +} +} // apache::thrift::async + +#endif // #ifndef _THRIFT_TEVHTTP_CLIENT_CHANNEL_H_ diff --git a/bsnes/thrift/thrift/async/TEvhttpServer.h b/bsnes/thrift/thrift/async/TEvhttpServer.h new file mode 100644 index 00000000..c5bf3b6e --- /dev/null +++ b/bsnes/thrift/thrift/async/TEvhttpServer.h @@ -0,0 +1,74 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +#ifndef _THRIFT_TEVHTTP_SERVER_H_ +#define _THRIFT_TEVHTTP_SERVER_H_ 1 + +#include + +struct event_base; +struct evhttp; +struct evhttp_request; + +namespace apache { +namespace thrift { +namespace async { + +class TAsyncBufferProcessor; + +class TEvhttpServer { +public: + /** + * Create a TEvhttpServer for use with an external evhttp instance. + * Must be manually installed with evhttp_set_cb, using + * TEvhttpServer::request as the callback and the + * address of the server as the extra arg. + * Do not call "serve" on this server. + */ + TEvhttpServer(std::shared_ptr processor); + + /** + * Create a TEvhttpServer with an embedded event_base and evhttp, + * listening on port and responding on the endpoint "/". + * Call "serve" on this server to serve forever. + */ + TEvhttpServer(std::shared_ptr processor, int port); + + ~TEvhttpServer(); + + static void request(struct evhttp_request* req, void* self); + int serve(); + + struct event_base* getEventBase(); + +private: + struct RequestContext; + + void process(struct evhttp_request* req); + void complete(RequestContext* ctx, bool success); + + std::shared_ptr processor_; + struct event_base* eb_; + struct evhttp* eh_; +}; +} +} +} // apache::thrift::async + +#endif // #ifndef _THRIFT_TEVHTTP_SERVER_H_ diff --git a/bsnes/thrift/thrift/concurrency/Exception.h b/bsnes/thrift/thrift/concurrency/Exception.h new file mode 100644 index 00000000..947fc9f0 --- /dev/null +++ b/bsnes/thrift/thrift/concurrency/Exception.h @@ -0,0 +1,64 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +#ifndef _THRIFT_CONCURRENCY_EXCEPTION_H_ +#define _THRIFT_CONCURRENCY_EXCEPTION_H_ 1 + +#include +#include + +namespace apache { +namespace thrift { +namespace concurrency { + +class NoSuchTaskException : public apache::thrift::TException {}; + +class UncancellableTaskException : public apache::thrift::TException {}; + +class InvalidArgumentException : public apache::thrift::TException {}; + +class IllegalStateException : public apache::thrift::TException { +public: + IllegalStateException() = default; + IllegalStateException(const std::string& message) : TException(message) {} +}; + +class TimedOutException : public apache::thrift::TException { +public: + TimedOutException() : TException("TimedOutException"){}; + TimedOutException(const std::string& message) : TException(message) {} +}; + +class TooManyPendingTasksException : public apache::thrift::TException { +public: + TooManyPendingTasksException() : TException("TooManyPendingTasksException"){}; + TooManyPendingTasksException(const std::string& message) : TException(message) {} +}; + +class SystemResourceException : public apache::thrift::TException { +public: + SystemResourceException() = default; + + SystemResourceException(const std::string& message) : TException(message) {} +}; +} +} +} // apache::thrift::concurrency + +#endif // #ifndef _THRIFT_CONCURRENCY_EXCEPTION_H_ diff --git a/bsnes/thrift/thrift/concurrency/FunctionRunner.h b/bsnes/thrift/thrift/concurrency/FunctionRunner.h new file mode 100644 index 00000000..46883441 --- /dev/null +++ b/bsnes/thrift/thrift/concurrency/FunctionRunner.h @@ -0,0 +1,118 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +#ifndef _THRIFT_CONCURRENCY_FUNCTION_RUNNER_H +#define _THRIFT_CONCURRENCY_FUNCTION_RUNNER_H 1 + +#include +#include + +namespace apache { +namespace thrift { +namespace concurrency { + +/** + * Convenient implementation of Runnable that will execute arbitrary callbacks. + * Interfaces are provided to accept both a generic 'void(void)' callback, and + * a 'void* (void*)' pthread_create-style callback. + * + * Example use: + * void* my_thread_main(void* arg); + * shared_ptr factory = ...; + * // To create a thread that executes my_thread_main once: + * shared_ptr thread = factory->newThread( + * FunctionRunner::create(my_thread_main, some_argument)); + * thread->start(); + * + * bool A::foo(); + * A* a = new A(); + * // To create a thread that executes a.foo() every 100 milliseconds: + * factory->newThread(FunctionRunner::create( + * std::bind(&A::foo, a), 100))->start(); + * + */ + +class FunctionRunner : public Runnable { +public: + // This is the type of callback 'pthread_create()' expects. + typedef void* (*PthreadFuncPtr)(void* arg); + // This a fully-generic void(void) callback for custom bindings. + typedef std::function VoidFunc; + + typedef std::function BoolFunc; + + /** + * Syntactic sugar to make it easier to create new FunctionRunner + * objects wrapped in shared_ptr. + */ + static std::shared_ptr create(const VoidFunc& cob) { + return std::shared_ptr(new FunctionRunner(cob)); + } + + static std::shared_ptr create(PthreadFuncPtr func, void* arg) { + return std::shared_ptr(new FunctionRunner(func, arg)); + } + +private: + static void pthread_func_wrapper(PthreadFuncPtr func, void* arg) { + // discard return value + func(arg); + } + +public: + /** + * Given a 'pthread_create' style callback, this FunctionRunner will + * execute the given callback. Note that the 'void*' return value is ignored. + */ + FunctionRunner(PthreadFuncPtr func, void* arg) + : func_(std::bind(pthread_func_wrapper, func, arg)), intervalMs_(-1) {} + + /** + * Given a generic callback, this FunctionRunner will execute it. + */ + FunctionRunner(const VoidFunc& cob) : func_(cob), intervalMs_(-1) {} + + /** + * Given a bool foo(...) type callback, FunctionRunner will execute + * the callback repeatedly with 'intervalMs' milliseconds between the calls, + * until it returns false. Note that the actual interval between calls will + * be intervalMs plus execution time of the callback. + */ + FunctionRunner(const BoolFunc& cob, int intervalMs) : repFunc_(cob), intervalMs_(intervalMs) {} + + void run() override { + if (repFunc_) { + while (repFunc_()) { + THRIFT_SLEEP_USEC(intervalMs_ * 1000); + } + } else { + func_(); + } + } + +private: + VoidFunc func_; + BoolFunc repFunc_; + int intervalMs_; +}; +} +} +} // apache::thrift::concurrency + +#endif // #ifndef _THRIFT_CONCURRENCY_FUNCTION_RUNNER_H diff --git a/bsnes/thrift/thrift/concurrency/Monitor.h b/bsnes/thrift/thrift/concurrency/Monitor.h new file mode 100644 index 00000000..b3939cb0 --- /dev/null +++ b/bsnes/thrift/thrift/concurrency/Monitor.h @@ -0,0 +1,126 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +#ifndef _THRIFT_CONCURRENCY_MONITOR_H_ +#define _THRIFT_CONCURRENCY_MONITOR_H_ 1 + +#include +#include +#include + +namespace apache { +namespace thrift { +namespace concurrency { + +/** + * A monitor is a combination mutex and condition-event. Waiting and + * notifying condition events requires that the caller own the mutex. Mutex + * lock and unlock operations can be performed independently of condition + * events. This is more or less analogous to java.lang.Object multi-thread + * operations. + * + * Note the Monitor can create a new, internal mutex; alternatively, a + * separate Mutex can be passed in and the Monitor will re-use it without + * taking ownership. It's the user's responsibility to make sure that the + * Mutex is not deallocated before the Monitor. + * + * Note that all methods are const. Monitors implement logical constness, not + * bit constness. This allows const methods to call monitor methods without + * needing to cast away constness or change to non-const signatures. + * + * @version $Id:$ + */ +class Monitor : boost::noncopyable { +public: + /** Creates a new mutex, and takes ownership of it. */ + Monitor(); + + /** Uses the provided mutex without taking ownership. */ + explicit Monitor(Mutex* mutex); + + /** Uses the mutex inside the provided Monitor without taking ownership. */ + explicit Monitor(Monitor* monitor); + + /** Deallocates the mutex only if we own it. */ + virtual ~Monitor(); + + Mutex& mutex() const; + + virtual void lock() const; + + virtual void unlock() const; + + /** + * Waits a maximum of the specified timeout in milliseconds for the condition + * to occur, or waits forever if timeout is zero. + * + * Returns 0 if condition occurs, THRIFT_ETIMEDOUT on timeout, or an error code. + */ + int waitForTimeRelative(const std::chrono::milliseconds &timeout) const; + + int waitForTimeRelative(uint64_t timeout_ms) const { return waitForTimeRelative(std::chrono::milliseconds(timeout_ms)); } + + /** + * Waits until the absolute time specified by abstime. + * Returns 0 if condition occurs, THRIFT_ETIMEDOUT on timeout, or an error code. + */ + int waitForTime(const std::chrono::time_point& abstime) const; + + /** + * Waits forever until the condition occurs. + * Returns 0 if condition occurs, or an error code otherwise. + */ + int waitForever() const; + + /** + * Exception-throwing version of waitForTimeRelative(), called simply + * wait(std::chrono::milliseconds) for historical reasons. Timeout is in milliseconds. + * + * If the condition occurs, this function returns cleanly; on timeout or + * error an exception is thrown. + */ + void wait(const std::chrono::milliseconds &timeout) const; + + void wait(uint64_t timeout_ms = 0ULL) const { this->wait(std::chrono::milliseconds(timeout_ms)); } + + /** Wakes up one thread waiting on this monitor. */ + virtual void notify() const; + + /** Wakes up all waiting threads on this monitor. */ + virtual void notifyAll() const; + +private: + class Impl; + + Impl* impl_; +}; + +class Synchronized { +public: + Synchronized(const Monitor* monitor) : g(monitor->mutex()) {} + Synchronized(const Monitor& monitor) : g(monitor.mutex()) {} + +private: + Guard g; +}; +} +} +} // apache::thrift::concurrency + +#endif // #ifndef _THRIFT_CONCURRENCY_MONITOR_H_ diff --git a/bsnes/thrift/thrift/concurrency/Mutex.h b/bsnes/thrift/thrift/concurrency/Mutex.h new file mode 100644 index 00000000..27e386ed --- /dev/null +++ b/bsnes/thrift/thrift/concurrency/Mutex.h @@ -0,0 +1,89 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +#ifndef _THRIFT_CONCURRENCY_MUTEX_H_ +#define _THRIFT_CONCURRENCY_MUTEX_H_ 1 + +#include +#include + +namespace apache { +namespace thrift { +namespace concurrency { + +/** + * NOTE: All mutex implementations throw an exception on failure. See each + * specific implementation to understand the exception type(s) used. + */ + +/** + * A simple mutex class + * + * @version $Id:$ + */ +class Mutex { +public: + Mutex(); + virtual ~Mutex() = default; + + virtual void lock() const; + virtual bool trylock() const; + virtual bool timedlock(int64_t milliseconds) const; + virtual void unlock() const; + + void* getUnderlyingImpl() const; + +private: + class impl; + std::shared_ptr impl_; +}; + + +class Guard : boost::noncopyable { +public: + Guard(const Mutex& value, int64_t timeout = 0) : mutex_(&value) { + if (timeout == 0) { + value.lock(); + } else if (timeout < 0) { + if (!value.trylock()) { + mutex_ = nullptr; + } + } else { + if (!value.timedlock(timeout)) { + mutex_ = nullptr; + } + } + } + ~Guard() { + if (mutex_) { + mutex_->unlock(); + } + } + + operator bool() const { return (mutex_ != nullptr); } + +private: + const Mutex* mutex_; +}; + +} +} +} // apache::thrift::concurrency + +#endif // #ifndef _THRIFT_CONCURRENCY_MUTEX_H_ diff --git a/bsnes/thrift/thrift/concurrency/Thread.h b/bsnes/thrift/thrift/concurrency/Thread.h new file mode 100644 index 00000000..344d2ca3 --- /dev/null +++ b/bsnes/thrift/thrift/concurrency/Thread.h @@ -0,0 +1,181 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +#ifndef _THRIFT_CONCURRENCY_THREAD_H_ +#define _THRIFT_CONCURRENCY_THREAD_H_ 1 + +#include +#include + +#include + +namespace apache { +namespace thrift { +namespace concurrency { + +class Thread; + +/** + * Minimal runnable class. More or less analogous to java.lang.Runnable. + * + * @version $Id:$ + */ +class Runnable { + +public: + virtual ~Runnable() = default; + virtual void run() = 0; + + /** + * Gets the thread object that is hosting this runnable object - can return + * an empty boost::shared pointer if no references remain on that thread object + */ + virtual std::shared_ptr thread() { return thread_.lock(); } + + /** + * Sets the thread that is executing this object. This is only meant for + * use by concrete implementations of Thread. + */ + virtual void thread(std::shared_ptr value) { thread_ = value; } + +private: + std::weak_ptr thread_; +}; + +/** + * Minimal thread class. Returned by thread factory bound to a Runnable object + * and ready to start execution. More or less analogous to java.lang.Thread + * (minus all the thread group, priority, mode and other baggage, since that + * is difficult to abstract across platforms and is left for platform-specific + * ThreadFactory implementations to deal with + * + * @see apache::thrift::concurrency::ThreadFactory) + */ +class Thread : public std::enable_shared_from_this { + +public: + typedef std::thread::id id_t; + typedef void (*thread_funct_t)(std::shared_ptr ); + + enum STATE { uninitialized, starting, started, stopping, stopped }; + + static void threadMain(std::shared_ptr thread); + + static inline bool is_current(id_t t) { return t == std::this_thread::get_id(); } + static inline id_t get_current() { return std::this_thread::get_id(); } + + Thread(bool detached, std::shared_ptr runnable) + : state_(uninitialized), detached_(detached) { + this->_runnable = runnable; + } + + virtual ~Thread() { + if (!detached_ && thread_->joinable()) { + try { + join(); + } catch (...) { + // We're really hosed. + } + } + } + + STATE getState() const + { + Synchronized sync(monitor_); + return state_; + } + + void setState(STATE newState) + { + Synchronized sync(monitor_); + state_ = newState; + + // unblock start() with the knowledge that the thread has actually + // started running, which avoids a race in detached threads. + if (newState == started) { + monitor_.notify(); + } + } + + /** + * Starts the thread. Does platform specific thread creation and + * configuration then invokes the run method of the Runnable object bound + * to this thread. + */ + virtual void start() { + if (getState() != uninitialized) { + return; + } + + std::shared_ptr selfRef = shared_from_this(); + setState(starting); + + Synchronized sync(monitor_); + thread_ = std::unique_ptr(new std::thread(getThreadFunc(), selfRef)); + + if (detached_) + thread_->detach(); + + // Wait for the thread to start and get far enough to grab everything + // that it needs from the calling context, thus absolving the caller + // from being required to hold on to runnable indefinitely. + monitor_.wait(); + } + + /** + * Join this thread. If this thread is joinable, the calling thread blocks + * until this thread completes. If the target thread is not joinable, then + * nothing happens. + */ + virtual void join() { + if (!detached_ && state_ != uninitialized) { + thread_->join(); + } + } + + /** + * Gets the thread's platform-specific ID + */ + Thread::id_t getId() const { return thread_.get() ? thread_->get_id() : std::thread::id(); } + + /** + * Gets the runnable object this thread is hosting + */ + std::shared_ptr runnable() const { return _runnable; } + +protected: + + virtual thread_funct_t getThreadFunc() const { + return threadMain; + } + +private: + std::shared_ptr _runnable; + std::unique_ptr thread_; + Monitor monitor_; + STATE state_; + bool detached_; +}; + + +} +} +} // apache::thrift::concurrency + +#endif // #ifndef _THRIFT_CONCURRENCY_THREAD_H_ diff --git a/bsnes/thrift/thrift/concurrency/ThreadFactory.h b/bsnes/thrift/thrift/concurrency/ThreadFactory.h new file mode 100644 index 00000000..9db832e3 --- /dev/null +++ b/bsnes/thrift/thrift/concurrency/ThreadFactory.h @@ -0,0 +1,76 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +#ifndef _THRIFT_CONCURRENCY_THREADFACTORY_H_ +#define _THRIFT_CONCURRENCY_THREADFACTORY_H_ 1 + +#include + +#include +namespace apache { +namespace thrift { +namespace concurrency { + +/** + * Factory to create thread object and bind them to Runnable + * object for execution + */ +class ThreadFactory { +public: + /** + * All threads created by a factory are reference-counted + * via std::shared_ptr. The factory guarantees that threads and the Runnable tasks + * they host will be properly cleaned up once the last strong reference + * to both is given up. + * + * By default threads are not joinable. + */ + ThreadFactory(bool detached = true) : detached_(detached) { } + + virtual ~ThreadFactory() = default; + + /** + * Gets current detached mode + */ + bool isDetached() const { return detached_; } + + /** + * Sets the detached disposition of newly created threads. + */ + void setDetached(bool detached) { detached_ = detached; } + + /** + * Create a new thread. + */ + virtual std::shared_ptr newThread(std::shared_ptr runnable) const; + + /** + * Gets the current thread id or unknown_thread_id if the current thread is not a thrift thread + */ + Thread::id_t getCurrentThreadId() const; + +private: + bool detached_; +}; + +} +} +} // apache::thrift::concurrency + +#endif // #ifndef _THRIFT_CONCURRENCY_THREADFACTORY_H_ diff --git a/bsnes/thrift/thrift/concurrency/ThreadManager.h b/bsnes/thrift/thrift/concurrency/ThreadManager.h new file mode 100644 index 00000000..7b202ca6 --- /dev/null +++ b/bsnes/thrift/thrift/concurrency/ThreadManager.h @@ -0,0 +1,213 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +#ifndef _THRIFT_CONCURRENCY_THREADMANAGER_H_ +#define _THRIFT_CONCURRENCY_THREADMANAGER_H_ 1 + +#include +#include +#include + +namespace apache { +namespace thrift { +namespace concurrency { + +/** + * Thread Pool Manager and related classes + * + * @version $Id:$ + */ +class ThreadManager; + +/** + * ThreadManager class + * + * This class manages a pool of threads. It uses a ThreadFactory to create + * threads. It never actually creates or destroys worker threads, rather + * it maintains statistics on number of idle threads, number of active threads, + * task backlog, and average wait and service times and informs the PoolPolicy + * object bound to instances of this manager of interesting transitions. It is + * then up the PoolPolicy object to decide if the thread pool size needs to be + * adjusted and call this object addWorker and removeWorker methods to make + * changes. + * + * This design allows different policy implementations to use this code to + * handle basic worker thread management and worker task execution and focus on + * policy issues. The simplest policy, StaticPolicy, does nothing other than + * create a fixed number of threads. + */ +class ThreadManager { + +protected: + ThreadManager() = default; + +public: + typedef std::function)> ExpireCallback; + + virtual ~ThreadManager() = default; + + /** + * Starts the thread manager. Verifies all attributes have been properly + * initialized, then allocates necessary resources to begin operation + */ + virtual void start() = 0; + + /** + * Stops the thread manager. Aborts all remaining unprocessed task, shuts + * down all created worker threads, and releases all allocated resources. + * This method blocks for all worker threads to complete, thus it can + * potentially block forever if a worker thread is running a task that + * won't terminate. + * + * Worker threads will be joined depending on the threadFactory's detached + * disposition. + */ + virtual void stop() = 0; + + enum STATE { UNINITIALIZED, STARTING, STARTED, JOINING, STOPPING, STOPPED }; + + virtual STATE state() const = 0; + + /** + * \returns the current thread factory + */ + virtual std::shared_ptr threadFactory() const = 0; + + /** + * Set the thread factory. + * \throws InvalidArgumentException if the new thread factory has a different + * detached disposition than the one replacing it + */ + virtual void threadFactory(std::shared_ptr value) = 0; + + /** + * Adds worker thread(s). + */ + virtual void addWorker(size_t value = 1) = 0; + + /** + * Removes worker thread(s). + * Threads are joined if the thread factory detached disposition allows it. + * Blocks until the number of worker threads reaches the new limit. + * \param[in] value the number to remove + * \throws InvalidArgumentException if the value is greater than the number + * of workers + */ + virtual void removeWorker(size_t value = 1) = 0; + + /** + * Gets the current number of idle worker threads + */ + virtual size_t idleWorkerCount() const = 0; + + /** + * Gets the current number of total worker threads + */ + virtual size_t workerCount() const = 0; + + /** + * Gets the current number of pending tasks + */ + virtual size_t pendingTaskCount() const = 0; + + /** + * Gets the current number of pending and executing tasks + */ + virtual size_t totalTaskCount() const = 0; + + /** + * Gets the maximum pending task count. 0 indicates no maximum + */ + virtual size_t pendingTaskCountMax() const = 0; + + /** + * Gets the number of tasks which have been expired without being run + * since start() was called. + */ + virtual size_t expiredTaskCount() const = 0; + + /** + * Adds a task to be executed at some time in the future by a worker thread. + * + * This method will block if pendingTaskCountMax() in not zero and pendingTaskCount() + * is greater than or equalt to pendingTaskCountMax(). If this method is called in the + * context of a ThreadManager worker thread it will throw a + * TooManyPendingTasksException + * + * @param task The task to queue for execution + * + * @param timeout Time to wait in milliseconds to add a task when a pending-task-count + * is specified. Specific cases: + * timeout = 0 : Wait forever to queue task. + * timeout = -1 : Return immediately if pending task count exceeds specified max + * @param expiration when nonzero, the number of milliseconds the task is valid + * to be run; if exceeded, the task will be dropped off the queue and not run. + * + * @throws TooManyPendingTasksException Pending task count exceeds max pending task count + */ + virtual void add(std::shared_ptr task, + int64_t timeout = 0LL, + int64_t expiration = 0LL) = 0; + + /** + * Removes a pending task + */ + virtual void remove(std::shared_ptr task) = 0; + + /** + * Remove the next pending task which would be run. + * + * @return the task removed. + */ + virtual std::shared_ptr removeNextPending() = 0; + + /** + * Remove tasks from front of task queue that have expired. + */ + virtual void removeExpiredTasks() = 0; + + /** + * Set a callback to be called when a task is expired and not run. + * + * @param expireCallback a function called with the shared_ptr for + * the expired task. + */ + virtual void setExpireCallback(ExpireCallback expireCallback) = 0; + + static std::shared_ptr newThreadManager(); + + /** + * Creates a simple thread manager the uses count number of worker threads and has + * a pendingTaskCountMax maximum pending tasks. The default, 0, specified no limit + * on pending tasks + */ + static std::shared_ptr newSimpleThreadManager(size_t count = 4, + size_t pendingTaskCountMax = 0); + + class Task; + + class Worker; + + class Impl; +}; +} +} +} // apache::thrift::concurrency + +#endif // #ifndef _THRIFT_CONCURRENCY_THREADMANAGER_H_ diff --git a/bsnes/thrift/thrift/concurrency/TimerManager.h b/bsnes/thrift/thrift/concurrency/TimerManager.h new file mode 100644 index 00000000..44d4738d --- /dev/null +++ b/bsnes/thrift/thrift/concurrency/TimerManager.h @@ -0,0 +1,137 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +#ifndef _THRIFT_CONCURRENCY_TIMERMANAGER_H_ +#define _THRIFT_CONCURRENCY_TIMERMANAGER_H_ 1 + +#include +#include + +#include +#include + +namespace apache { +namespace thrift { +namespace concurrency { + +/** + * Timer Manager + * + * This class dispatches timer tasks when they fall due. + * + * @version $Id:$ + */ +class TimerManager { + +public: + class Task; + typedef std::weak_ptr Timer; + + TimerManager(); + + virtual ~TimerManager(); + + virtual std::shared_ptr threadFactory() const; + + virtual void threadFactory(std::shared_ptr value); + + /** + * Starts the timer manager service + * + * @throws IllegalArgumentException Missing thread factory attribute + */ + virtual void start(); + + /** + * Stops the timer manager service + */ + virtual void stop(); + + virtual size_t taskCount() const; + + /** + * Adds a task to be executed at some time in the future by a worker thread. + * + * @param task The task to execute + * @param timeout Time in milliseconds to delay before executing task + * @return Handle of the timer, which can be used to remove the timer. + */ + virtual Timer add(std::shared_ptr task, const std::chrono::milliseconds &timeout); + Timer add(std::shared_ptr task, uint64_t timeout) { return add(task,std::chrono::milliseconds(timeout)); } + + /** + * Adds a task to be executed at some time in the future by a worker thread. + * + * @param task The task to execute + * @param abstime Absolute time in the future to execute task. + * @return Handle of the timer, which can be used to remove the timer. + */ + virtual Timer add(std::shared_ptr task, const std::chrono::time_point& abstime); + + /** + * Removes a pending task + * + * @param task The task to remove. All timers which execute this task will + * be removed. + * @throws NoSuchTaskException Specified task doesn't exist. It was either + * processed already or this call was made for a + * task that was never added to this timer + * + * @throws UncancellableTaskException Specified task is already being + * executed or has completed execution. + */ + virtual void remove(std::shared_ptr task); + + /** + * Removes a single pending task + * + * @param timer The timer to remove. The timer is returned when calling the + * add() method. + * @throws NoSuchTaskException Specified task doesn't exist. It was either + * processed already or this call was made for a + * task that was never added to this timer + * + * @throws UncancellableTaskException Specified task is already being + * executed or has completed execution. + */ + virtual void remove(Timer timer); + + enum STATE { UNINITIALIZED, STARTING, STARTED, STOPPING, STOPPED }; + + virtual STATE state() const; + +private: + std::shared_ptr threadFactory_; + friend class Task; + std::multimap, std::shared_ptr > taskMap_; + size_t taskCount_; + Monitor monitor_; + STATE state_; + class Dispatcher; + friend class Dispatcher; + std::shared_ptr dispatcher_; + std::shared_ptr dispatcherThread_; + using task_iterator = decltype(taskMap_)::iterator; + typedef std::pair task_range; +}; +} +} +} // apache::thrift::concurrency + +#endif // #ifndef _THRIFT_CONCURRENCY_TIMERMANAGER_H_ diff --git a/bsnes/thrift/thrift/processor/PeekProcessor.h b/bsnes/thrift/thrift/processor/PeekProcessor.h new file mode 100644 index 00000000..ae565fc4 --- /dev/null +++ b/bsnes/thrift/thrift/processor/PeekProcessor.h @@ -0,0 +1,83 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +#ifndef PEEKPROCESSOR_H +#define PEEKPROCESSOR_H + +#include +#include +#include +#include +#include +#include + +namespace apache { +namespace thrift { +namespace processor { + +/* + * Class for peeking at the raw data that is being processed by another processor + * and gives the derived class a chance to change behavior accordingly + * + */ +class PeekProcessor : public apache::thrift::TProcessor { + +public: + PeekProcessor(); + ~PeekProcessor() override; + + // Input here: actualProcessor - the underlying processor + // protocolFactory - the protocol factory used to wrap the memory buffer + // transportFactory - this TPipedTransportFactory is used to wrap the source transport + // via a call to getPipedTransport + void initialize( + std::shared_ptr actualProcessor, + std::shared_ptr protocolFactory, + std::shared_ptr transportFactory); + + std::shared_ptr getPipedTransport( + std::shared_ptr in); + + void setTargetTransport(std::shared_ptr targetTransport); + + bool process(std::shared_ptr in, + std::shared_ptr out, + void* connectionContext) override; + + // The following three functions can be overloaded by child classes to + // achieve desired peeking behavior + virtual void peekName(const std::string& fname); + virtual void peekBuffer(uint8_t* buffer, uint32_t size); + virtual void peek(std::shared_ptr in, + apache::thrift::protocol::TType ftype, + int16_t fid); + virtual void peekEnd(); + +private: + std::shared_ptr actualProcessor_; + std::shared_ptr pipedProtocol_; + std::shared_ptr transportFactory_; + std::shared_ptr memoryBuffer_; + std::shared_ptr targetTransport_; +}; +} +} +} // apache::thrift::processor + +#endif diff --git a/bsnes/thrift/thrift/processor/StatsProcessor.h b/bsnes/thrift/thrift/processor/StatsProcessor.h new file mode 100644 index 00000000..e98efb82 --- /dev/null +++ b/bsnes/thrift/thrift/processor/StatsProcessor.h @@ -0,0 +1,242 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +#ifndef STATSPROCESSOR_H +#define STATSPROCESSOR_H + +#include +#include +#include +#include + +namespace apache { +namespace thrift { +namespace processor { + +/* + * Class for keeping track of function call statistics and printing them if desired + * + */ +class StatsProcessor : public apache::thrift::TProcessor { +public: + StatsProcessor(bool print, bool frequency) : print_(print), frequency_(frequency) {} + virtual ~StatsProcessor(){}; + + virtual bool process(std::shared_ptr piprot, + std::shared_ptr poprot, + void* serverContext) { + + piprot_ = piprot; + + std::string fname; + apache::thrift::protocol::TMessageType mtype; + int32_t seqid; + + piprot_->readMessageBegin(fname, mtype, seqid); + if (mtype != apache::thrift::protocol::T_CALL && mtype != apache::thrift::protocol::T_ONEWAY) { + if (print_) { + printf("Unknown message type\n"); + } + throw apache::thrift::TException("Unexpected message type"); + } + if (print_) { + printf("%s (", fname.c_str()); + } + if (frequency_) { + if (frequency_map_.find(fname) != frequency_map_.end()) { + frequency_map_[fname]++; + } else { + frequency_map_[fname] = 1; + } + } + + apache::thrift::protocol::TType ftype; + int16_t fid; + + while (true) { + piprot_->readFieldBegin(fname, ftype, fid); + if (ftype == apache::thrift::protocol::T_STOP) { + break; + } + + printAndPassToBuffer(ftype); + if (print_) { + printf(", "); + } + } + + if (print_) { + printf("\b\b)\n"); + } + return true; + } + + const std::map& get_frequency_map() { return frequency_map_; } + +protected: + void printAndPassToBuffer(apache::thrift::protocol::TType ftype) { + switch (ftype) { + case apache::thrift::protocol::T_BOOL: { + bool boolv; + piprot_->readBool(boolv); + if (print_) { + printf("%d", boolv); + } + } break; + case apache::thrift::protocol::T_BYTE: { + int8_t bytev; + piprot_->readByte(bytev); + if (print_) { + printf("%d", bytev); + } + } break; + case apache::thrift::protocol::T_I16: { + int16_t i16; + piprot_->readI16(i16); + if (print_) { + printf("%d", i16); + } + } break; + case apache::thrift::protocol::T_I32: { + int32_t i32; + piprot_->readI32(i32); + if (print_) { + printf("%d", i32); + } + } break; + case apache::thrift::protocol::T_I64: { + int64_t i64; + piprot_->readI64(i64); + if (print_) { + printf("%ld", i64); + } + } break; + case apache::thrift::protocol::T_DOUBLE: { + double dub; + piprot_->readDouble(dub); + if (print_) { + printf("%f", dub); + } + } break; + case apache::thrift::protocol::T_STRING: { + std::string str; + piprot_->readString(str); + if (print_) { + printf("%s", str.c_str()); + } + } break; + case apache::thrift::protocol::T_STRUCT: { + std::string name; + int16_t fid; + apache::thrift::protocol::TType ftype; + piprot_->readStructBegin(name); + if (print_) { + printf("<"); + } + while (true) { + piprot_->readFieldBegin(name, ftype, fid); + if (ftype == apache::thrift::protocol::T_STOP) { + break; + } + printAndPassToBuffer(ftype); + if (print_) { + printf(","); + } + piprot_->readFieldEnd(); + } + piprot_->readStructEnd(); + if (print_) { + printf("\b>"); + } + } break; + case apache::thrift::protocol::T_MAP: { + apache::thrift::protocol::TType keyType; + apache::thrift::protocol::TType valType; + uint32_t i, size; + piprot_->readMapBegin(keyType, valType, size); + if (print_) { + printf("{"); + } + for (i = 0; i < size; i++) { + printAndPassToBuffer(keyType); + if (print_) { + printf("=>"); + } + printAndPassToBuffer(valType); + if (print_) { + printf(","); + } + } + piprot_->readMapEnd(); + if (print_) { + printf("\b}"); + } + } break; + case apache::thrift::protocol::T_SET: { + apache::thrift::protocol::TType elemType; + uint32_t i, size; + piprot_->readSetBegin(elemType, size); + if (print_) { + printf("{"); + } + for (i = 0; i < size; i++) { + printAndPassToBuffer(elemType); + if (print_) { + printf(","); + } + } + piprot_->readSetEnd(); + if (print_) { + printf("\b}"); + } + } break; + case apache::thrift::protocol::T_LIST: { + apache::thrift::protocol::TType elemType; + uint32_t i, size; + piprot_->readListBegin(elemType, size); + if (print_) { + printf("["); + } + for (i = 0; i < size; i++) { + printAndPassToBuffer(elemType); + if (print_) { + printf(","); + } + } + piprot_->readListEnd(); + if (print_) { + printf("\b]"); + } + } break; + default: + break; + } + } + + std::shared_ptr piprot_; + std::map frequency_map_; + + bool print_; + bool frequency_; +}; +} +} +} // apache::thrift::processor + +#endif diff --git a/bsnes/thrift/thrift/processor/TMultiplexedProcessor.h b/bsnes/thrift/thrift/processor/TMultiplexedProcessor.h new file mode 100644 index 00000000..85c0affc --- /dev/null +++ b/bsnes/thrift/thrift/processor/TMultiplexedProcessor.h @@ -0,0 +1,224 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +#ifndef THRIFT_TMULTIPLEXEDPROCESSOR_H_ +#define THRIFT_TMULTIPLEXEDPROCESSOR_H_ 1 + +#include +#include +#include +#include + +namespace apache { +namespace thrift { +namespace protocol { + +/** + * To be able to work with any protocol, we needed + * to allow them to call readMessageBegin() and get a TMessage in exactly + * the standard format, without the service name prepended to TMessage.name. + */ +class StoredMessageProtocol : public TProtocolDecorator { +public: + StoredMessageProtocol(std::shared_ptr _protocol, + const std::string& _name, + const TMessageType _type, + const int32_t _seqid) + : TProtocolDecorator(_protocol), name(_name), type(_type), seqid(_seqid) {} + + uint32_t readMessageBegin_virt(std::string& _name, TMessageType& _type, int32_t& _seqid) override { + + _name = name; + _type = type; + _seqid = seqid; + + return 0; // (Normal TProtocol read functions return number of bytes read) + } + + std::string name; + TMessageType type; + int32_t seqid; +}; +} // namespace protocol + +/** + * TMultiplexedProcessor is a TProcessor allowing + * a single TServer to provide multiple services. + * + *