[fuzzer] Add api fuzzing capabilities to client & server fuzzer (#34609)

Co-authored-by: ctiller <ctiller@users.noreply.github.com>
pull/34630/head
Craig Tiller 1 year ago committed by GitHub
parent 01907a7767
commit c744f33790
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 4
      test/core/end2end/fuzzers/BUILD
  2. 79
      test/core/end2end/fuzzers/api_fuzzer.cc
  3. 1
      test/core/end2end/fuzzers/api_fuzzer.proto
  4. 15
      test/core/end2end/fuzzers/api_fuzzer_corpus/6224556520964096
  5. 203
      test/core/end2end/fuzzers/client_fuzzer.cc
  6. 3
      test/core/end2end/fuzzers/client_fuzzer_corpus/5247061797699584
  7. 7
      test/core/end2end/fuzzers/client_fuzzer_corpus/5445673047621632
  8. 6
      test/core/end2end/fuzzers/client_fuzzer_corpus/6393293169557504
  9. 36
      test/core/end2end/fuzzers/fuzzer_input.proto
  10. 86
      test/core/end2end/fuzzers/fuzzing_common.cc
  11. 23
      test/core/end2end/fuzzers/fuzzing_common.h
  12. 25
      test/core/end2end/fuzzers/interesting_headers.txt
  13. 148
      test/core/end2end/fuzzers/network_input.cc
  14. 3
      test/core/end2end/fuzzers/network_input.h
  15. 176
      test/core/end2end/fuzzers/server_fuzzer.cc
  16. 3
      test/core/end2end/fuzzers/server_fuzzer_corpus/01c008fa.bin
  17. 3
      test/core/end2end/fuzzers/server_fuzzer_corpus/021ec59f.bin
  18. 3
      test/core/end2end/fuzzers/server_fuzzer_corpus/023517819bc642abe41d8735112fcacaf018c0cc
  19. 3
      test/core/end2end/fuzzers/server_fuzzer_corpus/02918e4ad9e8928845f232c0cb043057add3c9a9
  20. 3
      test/core/end2end/fuzzers/server_fuzzer_corpus/0336e1ff71939de9e2007fdb4aba891e35a37488
  21. 3
      test/core/end2end/fuzzers/server_fuzzer_corpus/033dd2f6.bin
  22. 3
      test/core/end2end/fuzzers/server_fuzzer_corpus/0384345c.bin
  23. 3
      test/core/end2end/fuzzers/server_fuzzer_corpus/03a304b82629155af693978c2b53439e553f6450
  24. 3
      test/core/end2end/fuzzers/server_fuzzer_corpus/03a72675e1969f836094f1ecfec2a7b34418e306
  25. 3
      test/core/end2end/fuzzers/server_fuzzer_corpus/03b9be1fa172dff5d1543be079b9c64fa2c9a278
  26. 3
      test/core/end2end/fuzzers/server_fuzzer_corpus/0416afd6875d9ba55f1e5f86a6456a5445d5e576
  27. 3
      test/core/end2end/fuzzers/server_fuzzer_corpus/052c8f28e5884bb48f0d504461272cd3a5893215
  28. 3
      test/core/end2end/fuzzers/server_fuzzer_corpus/05551028437699c8650f5d08eb5f95ee25adf436
  29. 3
      test/core/end2end/fuzzers/server_fuzzer_corpus/05c3a0390d0f52d241728926fa901599a47e4606
  30. 3
      test/core/end2end/fuzzers/server_fuzzer_corpus/05efe6d81ce606557691432634e81f61e68b0b81
  31. 3
      test/core/end2end/fuzzers/server_fuzzer_corpus/06285b50669cc16463db009ac821f99cf1ec2e24
  32. 3
      test/core/end2end/fuzzers/server_fuzzer_corpus/06bd2f82fefb9943787d63ea359f9b77072380c2
  33. 3
      test/core/end2end/fuzzers/server_fuzzer_corpus/0766afc7c27c06ea18d896083470d587a380de3c
  34. 3
      test/core/end2end/fuzzers/server_fuzzer_corpus/07ad7e0ea2aaecba37f2429a64e946fc6e2556f1
  35. 3
      test/core/end2end/fuzzers/server_fuzzer_corpus/07c96c06eddbed5a3ce050436bc805f6821cbc9b
  36. 3
      test/core/end2end/fuzzers/server_fuzzer_corpus/081e56ce6f6b1c57adb806fbc5baa9f93f87513a
  37. 3
      test/core/end2end/fuzzers/server_fuzzer_corpus/08492d3d0994005206d1d3213b8747d1026ae1eb
  38. 3
      test/core/end2end/fuzzers/server_fuzzer_corpus/084e9e02b8f2ed41ff9c22fef80e522e491227c5
  39. 3
      test/core/end2end/fuzzers/server_fuzzer_corpus/08c42ef29eff83052c5887855f2fa3e07ebe470c
  40. 3
      test/core/end2end/fuzzers/server_fuzzer_corpus/09938e3256d06a8e168eb038d8a58b8462f7f697
  41. 3
      test/core/end2end/fuzzers/server_fuzzer_corpus/0aa599e20761777c2cb9b41cd89e5c2e18f82d9e
  42. 3
      test/core/end2end/fuzzers/server_fuzzer_corpus/0aa7b949.bin
  43. 3
      test/core/end2end/fuzzers/server_fuzzer_corpus/0ab8698b211ee696f35f20a25c27e9429235fa41
  44. 3
      test/core/end2end/fuzzers/server_fuzzer_corpus/0abd533e.bin
  45. 3
      test/core/end2end/fuzzers/server_fuzzer_corpus/0b275a7f.bin
  46. 3
      test/core/end2end/fuzzers/server_fuzzer_corpus/0c129f78eacfb0d0d3c89dd4e578724096a3cea0
  47. 3
      test/core/end2end/fuzzers/server_fuzzer_corpus/0c413d2b361b2221585026d42f3046ff4135d2ff
  48. 3
      test/core/end2end/fuzzers/server_fuzzer_corpus/0d10bb63.bin
  49. 3
      test/core/end2end/fuzzers/server_fuzzer_corpus/0e349b8762703d080b3a696600e21d64c23a2ed3
  50. 3
      test/core/end2end/fuzzers/server_fuzzer_corpus/0f700e05.bin
  51. 3
      test/core/end2end/fuzzers/server_fuzzer_corpus/0ff4d220.bin
  52. 3
      test/core/end2end/fuzzers/server_fuzzer_corpus/10724098.bin
  53. 3
      test/core/end2end/fuzzers/server_fuzzer_corpus/108e270a272e312fc97ec23004b80fdc7bad3906
  54. 3
      test/core/end2end/fuzzers/server_fuzzer_corpus/11516d58.bin
  55. 3
      test/core/end2end/fuzzers/server_fuzzer_corpus/11cda3f70be4b507ea936bca93af9ce5aaab3be7
  56. 3
      test/core/end2end/fuzzers/server_fuzzer_corpus/11e90d0f3ecbf72ad5027051d476a31b8d7e0671
  57. 3
      test/core/end2end/fuzzers/server_fuzzer_corpus/129382aa11fa2922053fa47ba691dddb98901260
  58. 3
      test/core/end2end/fuzzers/server_fuzzer_corpus/13501419f349b7855d2e94060bd08b28923d1f37
  59. 3
      test/core/end2end/fuzzers/server_fuzzer_corpus/1353e447b7b10fb3eabb02863a1fc5bc9bb50460
  60. 3
      test/core/end2end/fuzzers/server_fuzzer_corpus/1421a8e9f045ac65a0f6938fae93fece1060c41d
  61. 3
      test/core/end2end/fuzzers/server_fuzzer_corpus/146b7d66ad932c4b623eec8004e286d3705697d3
  62. 3
      test/core/end2end/fuzzers/server_fuzzer_corpus/14f9a0cda0d64590430218aaf6dedd9be2a3533f
  63. 3
      test/core/end2end/fuzzers/server_fuzzer_corpus/15ae78a8543a4794a27e6c79b0d34540322b97fd
  64. 3
      test/core/end2end/fuzzers/server_fuzzer_corpus/15afdcf2cadb93f56dbe36233d8cd7ea9d2bd6fe
  65. 3
      test/core/end2end/fuzzers/server_fuzzer_corpus/1650b19093c56a1e86ee192bd9cd8d2266a9e353
  66. 3
      test/core/end2end/fuzzers/server_fuzzer_corpus/16753235697083ecc45c117287f1d8ce6ad1ad1a
  67. 3
      test/core/end2end/fuzzers/server_fuzzer_corpus/1703a8f0c3b3c9dda9eba8d3850e69536436d57a
  68. 3
      test/core/end2end/fuzzers/server_fuzzer_corpus/17d7c718ec2597353a5dd2c78d6717a3d6aabfae
  69. 3
      test/core/end2end/fuzzers/server_fuzzer_corpus/18d8d274aa7c163fd6d0084d5c25c8623e10c541
  70. 3
      test/core/end2end/fuzzers/server_fuzzer_corpus/18f00b5f.bin
  71. 3
      test/core/end2end/fuzzers/server_fuzzer_corpus/1928c455f3685f4abe7a04697f571ab864cae02e
  72. 3
      test/core/end2end/fuzzers/server_fuzzer_corpus/1939a9021aba59ea2e49d3d0909e6fdf86ac3f9e
  73. 3
      test/core/end2end/fuzzers/server_fuzzer_corpus/1a69d5fc.bin
  74. 3
      test/core/end2end/fuzzers/server_fuzzer_corpus/1aa6897b6eebb8c68c972cc5025b39c7e60c17fe
  75. 3
      test/core/end2end/fuzzers/server_fuzzer_corpus/1ba889ea1543297824e99e641e6ca8b91f45732e
  76. 3
      test/core/end2end/fuzzers/server_fuzzer_corpus/1cf17783de9e662f3720847f2d83d86dcdcab500
  77. 3
      test/core/end2end/fuzzers/server_fuzzer_corpus/1cfdde7a.bin
  78. 3
      test/core/end2end/fuzzers/server_fuzzer_corpus/1d614f3d6b826f844178a77094bedb534748a362
  79. 3
      test/core/end2end/fuzzers/server_fuzzer_corpus/1e92aaa5.bin
  80. 3
      test/core/end2end/fuzzers/server_fuzzer_corpus/1ea5651f.bin
  81. 3
      test/core/end2end/fuzzers/server_fuzzer_corpus/1f992057.bin
  82. 3
      test/core/end2end/fuzzers/server_fuzzer_corpus/20fd12d3670571283dc0c5dbb3fc139a8e943790
  83. 3
      test/core/end2end/fuzzers/server_fuzzer_corpus/21475569.bin
  84. 3
      test/core/end2end/fuzzers/server_fuzzer_corpus/218c1b123428a07622570947e9b7cdb48c310ca5
  85. 3
      test/core/end2end/fuzzers/server_fuzzer_corpus/21a2dcda.bin
  86. 3
      test/core/end2end/fuzzers/server_fuzzer_corpus/22ad891a.bin
  87. 3
      test/core/end2end/fuzzers/server_fuzzer_corpus/23c582f6e23c7bbc9ae7b039b3b4e2ccdea3d5d2
  88. 3
      test/core/end2end/fuzzers/server_fuzzer_corpus/23f261e44d54a2736f6e288128d98db9e5015206
  89. 3
      test/core/end2end/fuzzers/server_fuzzer_corpus/2463aea879c5ab49f8409d0e5c062c7e086b034b
  90. 3
      test/core/end2end/fuzzers/server_fuzzer_corpus/24ed80095e58199c52997f174046272f61ce4a8d
  91. 3
      test/core/end2end/fuzzers/server_fuzzer_corpus/25ab638f.bin
  92. 3
      test/core/end2end/fuzzers/server_fuzzer_corpus/26048c58bd5f2a94843f6fd1e4ab0be04b232636
  93. 3
      test/core/end2end/fuzzers/server_fuzzer_corpus/26870785fd0564f552af4e0ca418738a85b21086
  94. 3
      test/core/end2end/fuzzers/server_fuzzer_corpus/2701d1669c2996c097a74c5255d569615357b916
  95. 3
      test/core/end2end/fuzzers/server_fuzzer_corpus/27ac2ae2.bin
  96. 3
      test/core/end2end/fuzzers/server_fuzzer_corpus/2814d70c.bin
  97. 3
      test/core/end2end/fuzzers/server_fuzzer_corpus/282b6585.bin
  98. 3
      test/core/end2end/fuzzers/server_fuzzer_corpus/29a8346696d6f0962072714b9626966c81dcef0c
  99. 3
      test/core/end2end/fuzzers/server_fuzzer_corpus/2a688fd507072e1cfa2e3bc58652a7cd82dface3
  100. 3
      test/core/end2end/fuzzers/server_fuzzer_corpus/2abe64b96e5e72adcf2dcc43444a69d0fb664b66
  101. Some files were not shown because too many files have changed in this diff Show More

@ -81,6 +81,7 @@ grpc_proto_library(
"api_fuzzer_proto",
"//test/core/event_engine/fuzzing_event_engine:fuzzing_event_engine_proto",
"//test/core/util:fuzz_config_vars_proto",
"//test/core/util:fuzzing_channel_args_proto",
],
)
@ -107,6 +108,7 @@ grpc_proto_fuzzer(
uses_polling = False,
deps = [
"fuzzer_input_proto",
"fuzzing_common",
"network_input",
"//:gpr",
"//:grpc",
@ -129,11 +131,13 @@ grpc_proto_fuzzer(
uses_polling = False,
deps = [
"fuzzer_input_proto",
"fuzzing_common",
"network_input",
"//:gpr",
"//:grpc",
"//src/core:channel_args",
"//test/core/util:fuzz_config_vars",
"//test/core/util:fuzzing_channel_args",
"//test/core/util:grpc_test_util",
"//test/core/util:grpc_test_util_base",
],

@ -53,7 +53,6 @@
#include "src/core/lib/iomgr/iomgr_fwd.h"
#include "src/core/lib/iomgr/resolve_address.h"
#include "src/core/lib/iomgr/resolved_address.h"
#include "src/core/lib/iomgr/timer_manager.h"
#include "src/core/lib/resolver/endpoint_addresses.h"
#include "src/core/lib/resource_quota/resource_quota.h"
#include "src/libfuzzer/libfuzzer_macro.h"
@ -231,8 +230,6 @@ class ApiFuzzer final : public BasicFuzzer {
public:
explicit ApiFuzzer(const fuzzing_event_engine::Actions& actions);
~ApiFuzzer();
bool Continue() override;
void TryShutdown();
void Tick() override;
grpc_server* Server() { return server_; }
@ -240,9 +237,9 @@ class ApiFuzzer final : public BasicFuzzer {
Result CreateChannel(
const api_fuzzer::CreateChannel& create_channel) override;
Result CloseChannel() override;
Result CreateServer(const api_fuzzer::CreateServer& create_server) override;
void DestroyServer() override;
void DestroyChannel() override;
grpc_server* server() override { return server_; }
grpc_channel* channel() override { return channel_; }
@ -372,24 +369,9 @@ static grpc_channel_credentials* ReadChannelCreds(
}
}
namespace grpc_event_engine {
namespace experimental {
extern bool g_event_engine_supports_fd;
}
} // namespace grpc_event_engine
namespace grpc_core {
namespace testing {
namespace {
int force_experiments = []() {
grpc_event_engine::experimental::g_event_engine_supports_fd = false;
ForceEnableExperiment("event_engine_client", true);
ForceEnableExperiment("event_engine_listener", true);
return 1;
}();
} // namespace
ApiFuzzer::ApiFuzzer(const fuzzing_event_engine::Actions& actions)
: BasicFuzzer(actions) {
ResetDNSResolver(std::make_unique<FuzzerDNSResolver>(engine()));
@ -400,31 +382,6 @@ ApiFuzzer::ApiFuzzer(const fuzzing_event_engine::Actions& actions)
GPR_ASSERT(server_ == nullptr);
}
bool ApiFuzzer::Continue() {
return channel_ != nullptr || server_ != nullptr || BasicFuzzer::Continue();
}
void ApiFuzzer::TryShutdown() {
engine()->FuzzingDone();
if (channel_ != nullptr) {
grpc_channel_destroy(channel_);
channel_ = nullptr;
}
if (server_ != nullptr) {
if (!server_shutdown_called()) {
ShutdownServer();
}
if (server_finished_shutting_down()) {
grpc_server_destroy(server_);
server_ = nullptr;
}
}
ShutdownCalls();
grpc_timer_manager_tick();
GPR_ASSERT(PollCq() == Result::kPending);
}
ApiFuzzer::~ApiFuzzer() {
GPR_ASSERT(channel_ == nullptr);
GPR_ASSERT(server_ == nullptr);
@ -459,16 +416,6 @@ ApiFuzzer::Result ApiFuzzer::CreateChannel(
return Result::kComplete;
}
ApiFuzzer::Result ApiFuzzer::CloseChannel() {
if (channel_ != nullptr) {
grpc_channel_destroy(channel_);
channel_ = nullptr;
} else {
return Result::kFailed;
}
return Result::kComplete;
}
ApiFuzzer::Result ApiFuzzer::CreateServer(
const api_fuzzer::CreateServer& create_server) {
if (server_ == nullptr) {
@ -494,6 +441,11 @@ void ApiFuzzer::DestroyServer() {
server_ = nullptr;
}
void ApiFuzzer::DestroyChannel() {
grpc_channel_destroy(channel_);
channel_ = nullptr;
}
} // namespace testing
} // namespace grpc_core
@ -505,22 +457,5 @@ DEFINE_PROTO_FUZZER(const api_fuzzer::Msg& msg) {
}
grpc_core::ApplyFuzzConfigVars(msg.config_vars());
grpc_core::TestOnlyReloadExperimentsFromConfigVariables();
ApiFuzzer api_fuzzer(msg.event_engine_actions());
int action_index = 0;
auto no_more_actions = [&]() { action_index = msg.actions_size(); };
while (action_index < msg.actions_size() || api_fuzzer.Continue()) {
api_fuzzer.Tick();
if (action_index == msg.actions_size()) {
api_fuzzer.TryShutdown();
continue;
}
auto result = api_fuzzer.ExecuteAction(msg.actions(action_index++));
if (result == ApiFuzzer::Result::kFailed) {
no_more_actions();
}
}
ApiFuzzer(msg.event_engine_actions()).Run(msg.actions());
}

@ -171,6 +171,7 @@ message Action {
Empty request_call = 20;
Empty destroy_call = 21;
uint32 resize_resource_quota = 22;
uint32 sleep_ms = 23;
}
}

@ -0,0 +1,15 @@
actions {
create_channel {
target: "\023\003&\000\000\000\000\000"
channel_args {
args {
key: "\023\003&\000\000\000\000\000"
resource_quota {
}
}
}
}
}
actions {
resize_resource_quota: 0
}

@ -12,202 +12,95 @@
// See the License for the specific language governing permissions and
// limitations under the License.
#include <stdint.h>
#include <string.h>
#include <initializer_list>
#include <memory>
#include <string>
#include "absl/status/statusor.h"
#include "absl/strings/str_format.h"
#include "absl/types/optional.h"
#include <grpc/byte_buffer.h>
#include <grpc/event_engine/event_engine.h>
#include <grpc/grpc.h>
#include <grpc/impl/channel_arg_names.h>
#include <grpc/slice.h>
#include <grpc/status.h>
#include <grpc/support/log.h>
#include <grpc/support/time.h>
#include "src/core/ext/transport/chttp2/transport/chttp2_transport.h"
#include "src/core/lib/channel/channel_args.h"
#include "src/core/lib/channel/channel_args_preconditioning.h"
#include "src/core/lib/config/core_configuration.h"
#include "src/core/lib/event_engine/default_event_engine.h"
#include "src/core/lib/experiments/config.h"
#include "src/core/lib/gprpp/crash.h"
#include "src/core/lib/gprpp/env.h"
#include "src/core/lib/gprpp/ref_counted_ptr.h"
#include "src/core/lib/iomgr/endpoint.h"
#include "src/core/lib/iomgr/exec_ctx.h"
#include "src/core/lib/iomgr/executor.h"
#include "src/core/lib/resource_quota/api.h"
#include "src/core/lib/surface/channel.h"
#include "src/core/lib/surface/channel_stack_type.h"
#include "src/core/lib/surface/event_string.h"
#include "src/core/lib/transport/transport_fwd.h"
#include "src/libfuzzer/libfuzzer_macro.h"
#include "test/core/end2end/fuzzers/api_fuzzer.pb.h"
#include "test/core/end2end/fuzzers/fuzzer_input.pb.h"
#include "test/core/end2end/fuzzers/fuzzing_common.h"
#include "test/core/end2end/fuzzers/network_input.h"
#include "test/core/event_engine/fuzzing_event_engine/fuzzing_event_engine.h"
#include "test/core/event_engine/fuzzing_event_engine/fuzzing_event_engine.pb.h"
#include "test/core/util/fuzz_config_vars.h"
#include "test/core/util/mock_endpoint.h"
using ::grpc_event_engine::experimental::FuzzingEventEngine;
using ::grpc_event_engine::experimental::GetDefaultEventEngine;
bool squelch = true;
bool leak_check = true;
static void discard_write(grpc_slice /*slice*/) {}
static void* tag(intptr_t t) { return reinterpret_cast<void*>(t); }
static void dont_log(gpr_log_func_args* /*args*/) {}
DEFINE_PROTO_FUZZER(const fuzzer_input::Msg& msg) {
if (squelch && !grpc_core::GetEnv("GRPC_TRACE_FUZZER").has_value()) {
gpr_set_log_function(dont_log);
}
grpc_core::ApplyFuzzConfigVars(msg.config_vars());
grpc_core::TestOnlyReloadExperimentsFromConfigVariables();
grpc_event_engine::experimental::SetEventEngineFactory([]() {
return std::make_unique<FuzzingEventEngine>(
FuzzingEventEngine::Options(), fuzzing_event_engine::Actions{});
});
auto engine =
std::dynamic_pointer_cast<FuzzingEventEngine>(GetDefaultEventEngine());
grpc_init();
{
grpc_core::ExecCtx exec_ctx;
grpc_core::Executor::SetThreadingAll(false);
grpc_resource_quota* resource_quota =
grpc_resource_quota_create("context_list_test");
grpc_endpoint* mock_endpoint = grpc_mock_endpoint_create(discard_write);
grpc_completion_queue* cq = grpc_completion_queue_create_for_next(nullptr);
grpc_core::ChannelArgs args = grpc_core::CoreConfiguration::Get()
.channel_args_preconditioning()
.PreconditionChannelArgs(nullptr);
grpc_transport* transport =
grpc_create_chttp2_transport(args, mock_endpoint, true);
grpc_resource_quota_unref(resource_quota);
grpc_chttp2_transport_start_reading(transport, nullptr, nullptr, nullptr);
auto channel_args =
grpc_core::CoreConfiguration::Get()
namespace grpc_core {
namespace testing {
class ClientFuzzer final : public BasicFuzzer {
public:
explicit ClientFuzzer(const fuzzer_input::Msg& msg)
: BasicFuzzer(msg.event_engine_actions()) {
ExecCtx exec_ctx;
UpdateMinimumRunTime(
ScheduleReads(msg.network_input(), mock_endpoint_, engine()));
ChannelArgs args =
CoreConfiguration::Get()
.channel_args_preconditioning()
.PreconditionChannelArgs(nullptr)
.SetIfUnset(GRPC_ARG_DEFAULT_AUTHORITY, "test-authority");
auto channel = grpc_core::Channel::Create(
"test-target", channel_args, GRPC_CLIENT_DIRECT_CHANNEL, transport);
grpc_slice host = grpc_slice_from_static_string("localhost");
grpc_call* call =
grpc_channel_create_call(channel->get()->c_ptr(), nullptr, 0, cq,
grpc_slice_from_static_string("/foo"), &host,
gpr_inf_future(GPR_CLOCK_REALTIME), nullptr);
grpc_transport* transport =
grpc_create_chttp2_transport(args, mock_endpoint_, true);
channel_ = Channel::Create("test-target", args, GRPC_CLIENT_DIRECT_CHANNEL,
transport)
->release()
->c_ptr();
}
grpc_metadata_array initial_metadata_recv;
grpc_metadata_array_init(&initial_metadata_recv);
grpc_byte_buffer* response_payload_recv = nullptr;
grpc_metadata_array trailing_metadata_recv;
grpc_metadata_array_init(&trailing_metadata_recv);
grpc_status_code status;
grpc_slice details = grpc_empty_slice();
~ClientFuzzer() { GPR_ASSERT(channel_ == nullptr); }
engine->Tick();
private:
Result CreateChannel(
const api_fuzzer::CreateChannel& create_channel) override {
return Result::kFailed;
}
Result CreateServer(const api_fuzzer::CreateServer& create_server) override {
return Result::kFailed;
}
void DestroyServer() override {}
void DestroyChannel() override {
grpc_channel_destroy(channel_);
channel_ = nullptr;
}
grpc_op ops[6];
memset(ops, 0, sizeof(ops));
grpc_op* op = ops;
op->op = GRPC_OP_SEND_INITIAL_METADATA;
op->data.send_initial_metadata.count = 0;
op->flags = 0;
op->reserved = nullptr;
op++;
op->op = GRPC_OP_SEND_CLOSE_FROM_CLIENT;
op->flags = 0;
op->reserved = nullptr;
op++;
op->op = GRPC_OP_RECV_INITIAL_METADATA;
op->data.recv_initial_metadata.recv_initial_metadata =
&initial_metadata_recv;
op->flags = 0;
op->reserved = nullptr;
op++;
op->op = GRPC_OP_RECV_MESSAGE;
op->data.recv_message.recv_message = &response_payload_recv;
op->flags = 0;
op->reserved = nullptr;
op++;
op->op = GRPC_OP_RECV_STATUS_ON_CLIENT;
op->data.recv_status_on_client.trailing_metadata = &trailing_metadata_recv;
op->data.recv_status_on_client.status = &status;
op->data.recv_status_on_client.status_details = &details;
op->flags = 0;
op->reserved = nullptr;
op++;
grpc_call_error error = grpc_call_start_batch(
call, ops, static_cast<size_t>(op - ops), tag(1), nullptr);
int requested_calls = 1;
GPR_ASSERT(GRPC_CALL_OK == error);
grpc_server* server() override { return nullptr; }
grpc_channel* channel() override { return channel_; }
grpc_core::ScheduleReads(msg.network_input(), mock_endpoint, engine.get());
grpc_endpoint* mock_endpoint_ = grpc_mock_endpoint_create(discard_write);
grpc_channel* channel_ = nullptr;
};
grpc_event ev;
while (true) {
engine->Tick();
grpc_core::ExecCtx::Get()->Flush();
ev = grpc_completion_queue_next(cq, gpr_inf_past(GPR_CLOCK_REALTIME),
nullptr);
switch (ev.type) {
case GRPC_QUEUE_TIMEOUT:
goto done;
case GRPC_QUEUE_SHUTDOWN:
break;
case GRPC_OP_COMPLETE:
requested_calls--;
break;
}
}
} // namespace testing
} // namespace grpc_core
done:
engine->FuzzingDone();
engine->Tick();
if (requested_calls) {
grpc_call_cancel(call, nullptr);
}
for (int i = 0; i < requested_calls; i++) {
ev = grpc_completion_queue_next(cq, gpr_inf_past(GPR_CLOCK_REALTIME),
nullptr);
if (ev.type != GRPC_OP_COMPLETE) {
grpc_core::Crash(absl::StrFormat(
"[%d/%d requested calls] Unexpected event type (expected "
"COMPLETE): %s",
i, requested_calls, grpc_event_string(&ev).c_str()));
}
}
grpc_completion_queue_shutdown(cq);
for (int i = 0; i < requested_calls; i++) {
ev = grpc_completion_queue_next(cq, gpr_inf_past(GPR_CLOCK_REALTIME),
nullptr);
if (ev.type != GRPC_QUEUE_SHUTDOWN) {
grpc_core::Crash(
absl::StrFormat("Unexpected event type (expected SHUTDOWN): %s",
grpc_event_string(&ev).c_str()));
}
}
grpc_call_unref(call);
grpc_completion_queue_destroy(cq);
grpc_metadata_array_destroy(&initial_metadata_recv);
grpc_metadata_array_destroy(&trailing_metadata_recv);
grpc_slice_unref(details);
if (response_payload_recv != nullptr) {
grpc_byte_buffer_destroy(response_payload_recv);
}
DEFINE_PROTO_FUZZER(const fuzzer_input::Msg& msg) {
if (squelch && !grpc_core::GetEnv("GRPC_TRACE_FUZZER").has_value()) {
gpr_set_log_function(dont_log);
}
grpc_shutdown_blocking();
grpc_core::ApplyFuzzConfigVars(msg.config_vars());
grpc_core::TestOnlyReloadExperimentsFromConfigVariables();
grpc_core::testing::ClientFuzzer(msg).Run(msg.api_actions());
}

@ -0,0 +1,3 @@
network_input {
single_read_bytes: "\000\000\000\004\001\000\000\000\000\000\000\004\003@\000\000\000\001 rook"
}

@ -0,0 +1,7 @@
network_input {
input_segments {
segments {
delay_ms: 4
}
}
}

@ -0,0 +1,6 @@
network_input {
single_read_bytes: "\000\000\000\004\001\000\000\000\000\000\000\004\003\020\000\000\000\001\003 pc-`0\000m0t60our1k"
}
config_vars {
experiments: 18446744073709551607
}

@ -19,6 +19,7 @@ package fuzzer_input;
import "test/core/end2end/fuzzers/api_fuzzer.proto";
import "test/core/event_engine/fuzzing_event_engine/fuzzing_event_engine.proto";
import "test/core/util/fuzz_config_vars.proto";
import "test/core/util/fuzzing_channel_args.proto";
message H2DataFrame {
uint32 stream_id = 1;
@ -27,12 +28,41 @@ message H2DataFrame {
}
message SimpleHeader {
string key = 1;
string value = 2;
// If key & value are set, then a literal unencoded header is added.
optional string key = 1;
optional string value = 2;
// If raw_bytes is set, then after the key/value pair (if emitted) the raw bytes are emitted.
optional bytes raw_bytes = 3;
}
message SimpleHeaders {
repeated SimpleHeader headers = 1;
optional string grpc_timeout = 2;
optional string te = 3;
optional string content_type = 4;
optional string scheme = 5;
optional string method = 6;
optional string grpc_encoding = 7;
optional string grpc_internal_encoding_request = 8;
optional string grpc_accept_encoding = 9;
optional string user_agent = 10;
optional string grpc_message = 11;
optional string host = 12;
optional string endpoint_load_metrics_bin = 13;
optional string grpc_server_stats_bin = 14;
optional string grpc_trace_bin = 15;
optional string grpc_tags_bin = 16;
optional string x_envoy_peer_metadata = 17;
optional string authority = 18;
optional string path = 19;
optional string grpc_status = 20;
optional string grpc_previous_rpc_attempts = 21;
optional string grpc_retry_pushback_ms = 22;
optional string status = 23;
optional string grpclb_client_stats = 24;
optional string lb_token = 25;
optional string lb_cost_bin = 26;
}
message H2HeaderFrame {
@ -100,6 +130,7 @@ message InputSegment {
H2GoawayFrame goaway = 9;
H2WindowUpdateFrame window_update = 10;
H2ClientPrefix client_prefix = 11;
uint32 repeated_zeros = 12;
}
}
@ -119,4 +150,5 @@ message Msg {
repeated api_fuzzer.Action api_actions = 2;
fuzzing_event_engine.Actions event_engine_actions = 3;
grpc.testing.FuzzConfigVars config_vars = 4;
grpc.testing.FuzzingChannelArgs channel_args = 5;
}

@ -37,6 +37,7 @@
#include <grpc/support/time.h>
#include "src/core/lib/event_engine/default_event_engine.h"
#include "src/core/lib/experiments/config.h"
#include "src/core/lib/gprpp/crash.h"
#include "src/core/lib/iomgr/exec_ctx.h"
#include "src/core/lib/iomgr/executor.h"
@ -46,7 +47,23 @@
#include "src/core/lib/surface/channel.h"
#include "test/core/end2end/fuzzers/api_fuzzer.pb.h"
namespace grpc_event_engine {
namespace experimental {
extern bool g_event_engine_supports_fd;
}
} // namespace grpc_event_engine
namespace grpc_core {
namespace {
int force_experiments = []() {
grpc_event_engine::experimental::g_event_engine_supports_fd = false;
ForceEnableExperiment("event_engine_client", true);
ForceEnableExperiment("event_engine_listener", true);
return 1;
}();
} // namespace
namespace testing {
static void free_non_null(void* p) {
@ -549,6 +566,12 @@ BasicFuzzer::Result BasicFuzzer::SendPingOnChannel() {
return Result::kComplete;
}
BasicFuzzer::Result BasicFuzzer::Pause(Duration duration) {
++paused_;
engine()->RunAfterExactly(duration, [this]() { --paused_; });
return Result::kComplete;
}
BasicFuzzer::Result BasicFuzzer::ServerRequestCall() {
if (server() == nullptr) {
return Result::kFailed;
@ -591,10 +614,20 @@ BasicFuzzer::Result BasicFuzzer::ValidateChannelTarget() {
BasicFuzzer::Result BasicFuzzer::ResizeResourceQuota(
uint32_t resize_resource_quota) {
ExecCtx exec_ctx;
resource_quota_->memory_quota()->SetSize(resize_resource_quota);
return Result::kComplete;
}
BasicFuzzer::Result BasicFuzzer::CloseChannel() {
if (channel() != nullptr) {
DestroyChannel();
} else {
return Result::kFailed;
}
return Result::kComplete;
}
Call* BasicFuzzer::ActiveCall() {
while (!calls_.empty()) {
if (active_call_ >= calls_.size()) {
@ -617,8 +650,9 @@ void BasicFuzzer::ShutdownCalls() {
}
bool BasicFuzzer::Continue() {
return pending_channel_watches_ > 0 || pending_pings_ > 0 ||
ActiveCall() != nullptr;
return channel() != nullptr || server() != nullptr ||
pending_channel_watches_ > 0 || pending_pings_ > 0 ||
ActiveCall() != nullptr || paused_;
}
BasicFuzzer::Result BasicFuzzer::ExecuteAction(
@ -693,6 +727,9 @@ BasicFuzzer::Result BasicFuzzer::ExecuteAction(
// resize the buffer pool
case api_fuzzer::Action::kResizeResourceQuota:
return ResizeResourceQuota(action.resize_resource_quota());
case api_fuzzer::Action::kSleepMs:
return Pause(std::min(Duration::Milliseconds(action.sleep_ms()),
Duration::Minutes(1)));
default:
Crash(absl::StrCat("Unsupported Fuzzing Action of type: ",
action.type_case()));
@ -700,5 +737,50 @@ BasicFuzzer::Result BasicFuzzer::ExecuteAction(
return BasicFuzzer::Result::kComplete;
}
void BasicFuzzer::TryShutdown() {
engine()->FuzzingDone();
if (channel() != nullptr) {
DestroyChannel();
}
if (server() != nullptr) {
if (!server_shutdown_called()) {
ShutdownServer();
}
if (server_finished_shutting_down()) {
DestroyServer();
}
}
ShutdownCalls();
grpc_timer_manager_tick();
GPR_ASSERT(PollCq() == Result::kPending);
}
void BasicFuzzer::Run(absl::Span<const api_fuzzer::Action* const> actions) {
int action_index = 0;
auto allow_forced_shutdown = std::make_shared<bool>(false);
auto no_more_actions = [&]() { action_index = actions.size(); };
engine()->RunAfterExactly(minimum_run_time_, [allow_forced_shutdown] {
*allow_forced_shutdown = true;
});
while (action_index < actions.size() || Continue()) {
Tick();
if (paused_) continue;
if (action_index == actions.size()) {
if (*allow_forced_shutdown) TryShutdown();
continue;
}
auto result = ExecuteAction(*actions[action_index++]);
if (result == Result::kFailed) {
no_more_actions();
}
}
}
} // namespace testing
} // namespace grpc_core

@ -22,15 +22,19 @@
#include <stddef.h>
#include <stdint.h>
#include <algorithm>
#include <functional>
#include <memory>
#include <utility>
#include <vector>
#include "absl/types/span.h"
#include <grpc/grpc.h>
#include <grpc/support/log.h>
#include "src/core/lib/gprpp/ref_counted_ptr.h"
#include "src/core/lib/gprpp/time.h"
#include "src/core/lib/resource_quota/resource_quota.h"
#include "test/core/end2end/fuzzers/api_fuzzer.pb.h"
#include "test/core/event_engine/fuzzing_event_engine/fuzzing_event_engine.h"
@ -78,9 +82,11 @@ class BasicFuzzer {
virtual Result ExecuteAction(const api_fuzzer::Action& action);
Call* ActiveCall();
virtual bool Continue();
bool Continue();
virtual void Tick();
void Run(absl::Span<const api_fuzzer::Action* const> actions);
protected:
~BasicFuzzer();
@ -110,14 +116,18 @@ class BasicFuzzer {
grpc_completion_queue* cq() { return cq_; }
void UpdateMinimumRunTime(Duration minimum_run_time) {
minimum_run_time_ = std::max(minimum_run_time, minimum_run_time_);
}
private:
// Channel specific actions.
// Create an active channel with the specified parameters.
virtual Result CreateChannel(
const api_fuzzer::CreateChannel& create_channel) = 0;
// Close the active channel.
virtual Result CloseChannel() = 0;
// Close the active channel.
Result CloseChannel();
// Check whether the channel is connected and optionally try to connect if it
// is not connected.
Result CheckConnectivity(bool try_to_connect);
@ -154,14 +164,19 @@ class BasicFuzzer {
Result ValidatePeerForActiveCall();
// Cancel and destroy the active call.
Result DestroyActiveCall();
// Pause the run loop for some time
Result Pause(Duration duration);
// Other actions.
// Change the resource quota limits.
Result ResizeResourceQuota(uint32_t resize_resource_quota);
void TryShutdown();
virtual grpc_server* server() = 0;
virtual grpc_channel* channel() = 0;
virtual void DestroyServer() = 0;
virtual void DestroyChannel() = 0;
std::shared_ptr<grpc_event_engine::experimental::FuzzingEventEngine> engine_;
grpc_completion_queue* cq_;
@ -169,9 +184,11 @@ class BasicFuzzer {
int pending_server_shutdowns_ = 0;
int pending_channel_watches_ = 0;
int pending_pings_ = 0;
int paused_ = 0;
std::vector<std::shared_ptr<Call>> calls_;
RefCountedPtr<ResourceQuota> resource_quota_;
size_t active_call_ = 0;
Duration minimum_run_time_ = Duration::Zero();
};
} // namespace testing

@ -0,0 +1,25 @@
grpc-timeout
te
content-type
:scheme
:method
grpc-encoding
grpc-internal-encoding-request
grpc-accept-encoding
user-agent
grpc-message
host
endpoint-load-metrics-bin
grpc-server-stats-bin
grpc-trace-bin
grpc-tags-bin
x-envoy-peer-metadata
:authority
:path
grpc-status
grpc-previous-rpc-attempts
grpc-retry-pushback-ms
:status
grpclb_client_stats
lb-token
lb-cost-bin

@ -24,6 +24,7 @@
#include <utility>
#include <vector>
#include "absl/strings/string_view.h"
#include "absl/types/span.h"
#include <grpc/slice.h>
@ -31,6 +32,7 @@
#include "src/core/ext/transport/chttp2/transport/frame.h"
#include "src/core/ext/transport/chttp2/transport/varint.h"
#include "src/core/lib/gpr/useful.h"
#include "src/core/lib/iomgr/exec_ctx.h"
#include "src/core/lib/slice/slice.h"
#include "src/core/lib/slice/slice_buffer.h"
#include "test/core/end2end/fuzzers/fuzzer_input.pb.h"
@ -61,12 +63,101 @@ void AppendLength(size_t length, std::vector<uint8_t>* bytes) {
SliceBuffer SliceBufferFromSimpleHeaders(
const fuzzer_input::SimpleHeaders& headers) {
std::vector<uint8_t> temp;
for (const auto& header : headers.headers()) {
auto add_header = [&temp](absl::string_view key, absl::string_view value) {
temp.push_back(0);
AppendLength(header.key().length(), &temp);
temp.insert(temp.end(), header.key().begin(), header.key().end());
AppendLength(header.value().length(), &temp);
temp.insert(temp.end(), header.value().begin(), header.value().end());
AppendLength(key.length(), &temp);
temp.insert(temp.end(), key.begin(), key.end());
AppendLength(value.length(), &temp);
temp.insert(temp.end(), value.begin(), value.end());
};
if (headers.has_status()) {
add_header(":status", headers.status());
}
if (headers.has_scheme()) {
add_header(":scheme", headers.scheme());
}
if (headers.has_method()) {
add_header(":method", headers.method());
}
if (headers.has_authority()) {
add_header(":authority", headers.authority());
}
if (headers.has_path()) {
add_header(":path", headers.path());
}
for (const auto& header : headers.headers()) {
if (header.has_key() && header.has_value()) {
add_header(header.key(), header.value());
;
}
if (header.has_raw_bytes()) {
for (auto c : header.raw_bytes()) {
temp.push_back(static_cast<uint8_t>(c));
}
}
}
if (headers.has_grpc_timeout()) {
add_header("grpc-timeout", headers.grpc_timeout());
}
if (headers.has_te()) {
add_header("te", headers.te());
}
if (headers.has_content_type()) {
add_header("content-type", headers.content_type());
}
if (headers.has_grpc_encoding()) {
add_header("grpc-encoding", headers.grpc_encoding());
}
if (headers.has_grpc_internal_encoding_request()) {
add_header("grpc-internal-encoding-request",
headers.grpc_internal_encoding_request());
}
if (headers.has_grpc_accept_encoding()) {
add_header("grpc-accept-encoding", headers.grpc_accept_encoding());
}
if (headers.has_user_agent()) {
add_header("user-agent", headers.user_agent());
}
if (headers.has_grpc_message()) {
add_header("grpc-message", headers.grpc_message());
}
if (headers.has_host()) {
add_header("host", headers.host());
}
if (headers.has_endpoint_load_metrics_bin()) {
add_header("endpoint-load-metrics-bin",
headers.endpoint_load_metrics_bin());
}
if (headers.has_grpc_server_stats_bin()) {
add_header("grpc-server-stats-bin", headers.grpc_server_stats_bin());
}
if (headers.has_grpc_trace_bin()) {
add_header("grpc-trace-bin", headers.grpc_trace_bin());
}
if (headers.has_grpc_tags_bin()) {
add_header("grpc-tags-bin", headers.grpc_tags_bin());
}
if (headers.has_x_envoy_peer_metadata()) {
add_header("x-envoy-peer-metadata", headers.x_envoy_peer_metadata());
}
if (headers.has_grpc_status()) {
add_header("grpc-status", headers.grpc_status());
}
if (headers.has_grpc_previous_rpc_attempts()) {
add_header("grpc-previous-rpc-attempts",
headers.grpc_previous_rpc_attempts());
}
if (headers.has_grpc_retry_pushback_ms()) {
add_header("grpc-retry-pushback-ms", headers.grpc_retry_pushback_ms());
}
if (headers.has_grpclb_client_stats()) {
add_header("grpclb_client_stats", headers.grpclb_client_stats());
}
if (headers.has_lb_token()) {
add_header("lb-token", headers.lb_token());
}
if (headers.has_lb_cost_bin()) {
add_header("lb-cost-bin", headers.lb_cost_bin());
}
SliceBuffer buffer;
buffer.Append(Slice::FromCopiedBuffer(temp.data(), temp.size()));
@ -142,6 +233,11 @@ grpc_slice SliceFromSegment(const fuzzer_input::InputSegment& segment) {
});
case fuzzer_input::InputSegment::kClientPrefix:
return grpc_slice_from_static_string("PRI * HTTP/2.0\r\n\r\nSM\r\n\r\n");
case fuzzer_input::InputSegment::kRepeatedZeros: {
std::vector<char> zeros;
zeros.resize(std::min<size_t>(segment.repeated_zeros(), 128 * 1024), 0);
return grpc_slice_from_copied_buffer(zeros.data(), zeros.size());
}
case fuzzer_input::InputSegment::PAYLOAD_NOT_SET:
break;
}
@ -149,7 +245,7 @@ grpc_slice SliceFromSegment(const fuzzer_input::InputSegment& segment) {
}
} // namespace
void ScheduleReads(
Duration ScheduleReads(
const fuzzer_input::NetworkInput& network_input,
grpc_endpoint* mock_endpoint,
grpc_event_engine::experimental::FuzzingEventEngine* event_engine) {
@ -160,26 +256,50 @@ void ScheduleReads(
network_input.single_read_bytes().data(),
network_input.single_read_bytes().size()));
grpc_mock_endpoint_finish_put_reads(mock_endpoint);
} break;
return Duration::Milliseconds(1);
}
case fuzzer_input::NetworkInput::kInputSegments: {
int delay_ms = 0;
SliceBuffer building;
for (const auto& segment : network_input.input_segments().segments()) {
delay_ms += Clamp(segment.delay_ms(), 0, 1000);
const int segment_delay = Clamp(segment.delay_ms(), 0, 1000);
if (segment_delay != 0) {
delay_ms += segment_delay;
if (building.Length() != 0) {
event_engine->RunAfterExactly(
std::chrono::milliseconds(delay_ms),
[mock_endpoint, slice = building.JoinIntoSlice()]() mutable {
ExecCtx exec_ctx;
grpc_mock_endpoint_put_read(mock_endpoint,
slice.TakeCSlice());
});
}
building.Clear();
}
building.Append(Slice(SliceFromSegment(segment)));
}
if (building.Length() != 0) {
++delay_ms;
event_engine->RunAfterExactly(
std::chrono::milliseconds(delay_ms), [mock_endpoint, segment] {
grpc_mock_endpoint_put_read(mock_endpoint,
SliceFromSegment(segment));
std::chrono::milliseconds(delay_ms),
[mock_endpoint, slice = building.JoinIntoSlice()]() mutable {
ExecCtx exec_ctx;
grpc_mock_endpoint_put_read(mock_endpoint, slice.TakeCSlice());
});
}
++delay_ms;
event_engine->RunAfterExactly(
std::chrono::milliseconds(delay_ms + 1), [mock_endpoint] {
std::chrono::milliseconds(delay_ms), [mock_endpoint] {
ExecCtx exec_ctx;
grpc_mock_endpoint_finish_put_reads(mock_endpoint);
});
} break;
return Duration::Milliseconds(delay_ms + 1);
}
case fuzzer_input::NetworkInput::VALUE_NOT_SET:
grpc_mock_endpoint_finish_put_reads(mock_endpoint);
break;
return Duration::Milliseconds(1);
}
GPR_UNREACHABLE_CODE(return Duration::Milliseconds(1));
}
} // namespace grpc_core

@ -15,13 +15,14 @@
#ifndef GRPC_TEST_CORE_END2END_FUZZERS_NETWORK_INPUT_H
#define GRPC_TEST_CORE_END2END_FUZZERS_NETWORK_INPUT_H
#include "src/core/lib/gprpp/time.h"
#include "src/core/lib/iomgr/endpoint.h"
#include "test/core/end2end/fuzzers/fuzzer_input.pb.h"
#include "test/core/event_engine/fuzzing_event_engine/fuzzing_event_engine.h"
namespace grpc_core {
void ScheduleReads(
Duration ScheduleReads(
const fuzzer_input::NetworkInput& network_input,
grpc_endpoint* mock_endpoint,
grpc_event_engine::experimental::FuzzingEventEngine* event_engine);

@ -12,164 +12,102 @@
// See the License for the specific language governing permissions and
// limitations under the License.
#include <stdint.h>
#include <memory>
#include "absl/strings/str_cat.h"
#include "absl/types/optional.h"
#include <grpc/event_engine/event_engine.h>
#include <grpc/grpc.h>
#include <grpc/slice.h>
#include <grpc/support/log.h>
#include <grpc/support/time.h>
#include "src/core/ext/transport/chttp2/transport/chttp2_transport.h"
#include "src/core/lib/channel/channel_args.h"
#include "src/core/lib/channel/channel_args_preconditioning.h"
#include "src/core/lib/channel/channelz.h"
#include "src/core/lib/config/core_configuration.h"
#include "src/core/lib/event_engine/default_event_engine.h"
#include "src/core/lib/experiments/config.h"
#include "src/core/lib/gprpp/crash.h"
#include "src/core/lib/gprpp/env.h"
#include "src/core/lib/iomgr/endpoint.h"
#include "src/core/lib/iomgr/error.h"
#include "src/core/lib/iomgr/exec_ctx.h"
#include "src/core/lib/iomgr/executor.h"
#include "src/core/lib/resource_quota/api.h"
#include "src/core/lib/surface/event_string.h"
#include "src/core/lib/resource_quota/resource_quota.h"
#include "src/core/lib/surface/server.h"
#include "src/core/lib/transport/transport_fwd.h"
#include "src/libfuzzer/libfuzzer_macro.h"
#include "test/core/end2end/fuzzers/api_fuzzer.pb.h"
#include "test/core/end2end/fuzzers/fuzzer_input.pb.h"
#include "test/core/end2end/fuzzers/fuzzing_common.h"
#include "test/core/end2end/fuzzers/network_input.h"
#include "test/core/event_engine/fuzzing_event_engine/fuzzing_event_engine.h"
#include "test/core/event_engine/fuzzing_event_engine/fuzzing_event_engine.pb.h"
#include "test/core/util/fuzz_config_vars.h"
#include "test/core/util/fuzzing_channel_args.h"
#include "test/core/util/mock_endpoint.h"
using ::grpc_event_engine::experimental::FuzzingEventEngine;
using ::grpc_event_engine::experimental::GetDefaultEventEngine;
bool squelch = true;
bool leak_check = true;
static void discard_write(grpc_slice /*slice*/) {}
static void* tag(intptr_t t) { return reinterpret_cast<void*>(t); }
static void dont_log(gpr_log_func_args* /*args*/) {}
DEFINE_PROTO_FUZZER(const fuzzer_input::Msg& msg) {
if (squelch && !grpc_core::GetEnv("GRPC_TRACE_FUZZER").has_value()) {
gpr_set_log_function(dont_log);
}
grpc_core::ApplyFuzzConfigVars(msg.config_vars());
grpc_core::TestOnlyReloadExperimentsFromConfigVariables();
grpc_event_engine::experimental::SetEventEngineFactory(
[actions = msg.event_engine_actions()]() {
return std::make_unique<FuzzingEventEngine>(
FuzzingEventEngine::Options(), actions);
});
auto event_engine =
std::dynamic_pointer_cast<FuzzingEventEngine>(GetDefaultEventEngine());
grpc_init();
{
grpc_core::ExecCtx exec_ctx;
grpc_core::Executor::SetThreadingAll(false);
grpc_resource_quota* resource_quota =
grpc_resource_quota_create("context_list_test");
grpc_endpoint* mock_endpoint = grpc_mock_endpoint_create(discard_write);
grpc_core::ScheduleReads(msg.network_input(), mock_endpoint,
event_engine.get());
grpc_server* server = grpc_server_create(nullptr, nullptr);
grpc_completion_queue* cq = grpc_completion_queue_create_for_next(nullptr);
grpc_server_register_completion_queue(server, cq, nullptr);
namespace grpc_core {
namespace testing {
class ServerFuzzer final : public BasicFuzzer {
public:
explicit ServerFuzzer(const fuzzer_input::Msg& msg)
: BasicFuzzer(msg.event_engine_actions()) {
ExecCtx exec_ctx;
UpdateMinimumRunTime(
ScheduleReads(msg.network_input(), mock_endpoint_, engine()));
grpc_server_register_completion_queue(server_, cq(), nullptr);
// TODO(ctiller): add more registered methods (one for POST, one for PUT)
grpc_server_register_method(server, "/reg", nullptr, {}, 0);
grpc_server_start(server);
grpc_core::ChannelArgs channel_args = grpc_core::CoreConfiguration::Get()
.channel_args_preconditioning()
.PreconditionChannelArgs(nullptr);
grpc_server_register_method(server_, "/reg", nullptr, {}, 0);
grpc_server_start(server_);
ChannelArgs channel_args =
CoreConfiguration::Get()
.channel_args_preconditioning()
.PreconditionChannelArgs(
CreateChannelArgsFromFuzzingConfiguration(
msg.channel_args(), FuzzingEnvironment{resource_quota()})
.ToC()
.get());
grpc_transport* transport =
grpc_create_chttp2_transport(channel_args, mock_endpoint, false);
grpc_resource_quota_unref(resource_quota);
grpc_create_chttp2_transport(channel_args, mock_endpoint_, false);
GPR_ASSERT(GRPC_LOG_IF_ERROR(
"SetupTransport", grpc_core::Server::FromC(server)->SetupTransport(
"SetupTransport", Server::FromC(server_)->SetupTransport(
transport, nullptr, channel_args, nullptr)));
grpc_chttp2_transport_start_reading(transport, nullptr, nullptr, nullptr);
}
~ServerFuzzer() { GPR_ASSERT(server_ == nullptr); }
private:
Result CreateChannel(
const api_fuzzer::CreateChannel& create_channel) override {
return Result::kFailed;
}
Result CreateServer(const api_fuzzer::CreateServer& create_server) override {
return Result::kFailed;
}
void DestroyServer() override {
grpc_server_destroy(server_);
server_ = nullptr;
}
void DestroyChannel() override {}
grpc_call* call1 = nullptr;
grpc_call_details call_details1;
grpc_metadata_array request_metadata1;
grpc_call_details_init(&call_details1);
grpc_metadata_array_init(&request_metadata1);
int requested_calls = 0;
grpc_server* server() override { return server_; }
grpc_channel* channel() override { return nullptr; }
GPR_ASSERT(GRPC_CALL_OK ==
grpc_server_request_call(server, &call1, &call_details1,
&request_metadata1, cq, cq, tag(1)));
requested_calls++;
grpc_endpoint* mock_endpoint_ = grpc_mock_endpoint_create(discard_write);
grpc_server* server_ = grpc_server_create(nullptr, nullptr);
};
grpc_event ev;
while (true) {
event_engine->Tick();
grpc_core::ExecCtx::Get()->Flush();
ev = grpc_completion_queue_next(cq, gpr_inf_past(GPR_CLOCK_REALTIME),
nullptr);
switch (ev.type) {
case GRPC_QUEUE_TIMEOUT:
goto done;
case GRPC_QUEUE_SHUTDOWN:
break;
case GRPC_OP_COMPLETE:
if (ev.tag == tag(1)) {
requested_calls--;
// TODO(ctiller): keep reading that call!
}
break;
}
}
} // namespace testing
} // namespace grpc_core
done:
if (call1 != nullptr) grpc_call_unref(call1);
grpc_server_shutdown_and_notify(server, cq, tag(0xdead));
grpc_server_cancel_all_calls(server);
bool got_dead = false;
while (requested_calls > 0 && !got_dead) {
event_engine->Tick();
ev = grpc_completion_queue_next(cq, gpr_inf_past(GPR_CLOCK_REALTIME),
nullptr);
if (ev.type == GRPC_OP_COMPLETE) {
switch (reinterpret_cast<uintptr_t>(ev.tag)) {
case 1:
requested_calls--;
break;
case 0xdead:
got_dead = true;
break;
}
} else if (ev.type != GRPC_QUEUE_TIMEOUT) {
grpc_core::Crash(
absl::StrCat("Unexpected cq event: ", grpc_event_string(&ev)));
}
grpc_core::ExecCtx::Get()->InvalidateNow();
}
grpc_completion_queue_shutdown(cq);
do {
ev = grpc_completion_queue_next(cq, gpr_inf_past(GPR_CLOCK_REALTIME),
nullptr);
grpc_core::ExecCtx::Get()->InvalidateNow();
} while (ev.type != GRPC_QUEUE_SHUTDOWN);
GPR_ASSERT(ev.type == GRPC_QUEUE_SHUTDOWN);
grpc_call_details_destroy(&call_details1);
grpc_metadata_array_destroy(&request_metadata1);
grpc_server_destroy(server);
grpc_completion_queue_destroy(cq);
DEFINE_PROTO_FUZZER(const fuzzer_input::Msg& msg) {
if (squelch && !grpc_core::GetEnv("GRPC_TRACE_FUZZER").has_value()) {
gpr_set_log_function(dont_log);
}
event_engine->TickUntilIdle();
grpc_shutdown_blocking();
event_engine->UnsetGlobalHooks();
grpc_core::ApplyFuzzConfigVars(msg.config_vars());
grpc_core::TestOnlyReloadExperimentsFromConfigVariables();
grpc_core::testing::ServerFuzzer(msg).Run(msg.api_actions());
}

@ -1,3 +0,0 @@
network_input {
single_read_bytes: "\x50\x52\x49\x20\x2a\x20\x48\x54\x54\x50\x2f\x32\x2e\x30\x0d\x0a\x0d\x0a\x53\x4d\x0d\x0a\x0d\x0a\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\xc9\x01\x04\x00\x00\x00\x01\x10\x05\x3a\x70\x61\x74\x68\x08\x2f\x66\x6f\x6f\x2f\x62\x61\x72\x10\x07\x3a\x73\x63\x68\x65\x6d\x65\x04\x68\x74\x74\x70\x10\x07\x3a\x6d\x65\x74\x68\x6f\x64\x04\x50\x4f\x53\x54\x10\x0a\x3a\x61\x75\x74\x68\x6f\x72\x69\x74\x79\x09\x6c\x6f\x63\x61\x6c\x68\x6f\x73\x74\x10\x0c\x63\x6f\x6e\x74\x65\x6e\x74\x2d\x74\x79\x70\x65\x10\x61\x70\x70\x6c\x69\x63\x61\x74\x69\x6f\x6e\x2f\x67\x72\x70\x63\x10\x14\x67\x72\x70\x63\x2d\x61\x63\x63\x65\x70\x74\x2d\x65\x6e\x63\x6f\x64\x69\x6e\x67\x15\x64\x65\x66\x6c\x61\x74\x65\x2c\x69\x64\x65\x6e\x74\x69\x74\x79\x2c\x67\x7a\x69\x70\x10\x02\x74\x65\x08\x74\x72\x61\x69\x6c\x65\x72\x73\x10\x0a\x75\x73\x65\x72\x2d\x61\x67\x65\x6e\x74\x22\x62\x61\x64\x2d\x63\x6c\x69\x65\x6e\x74\x20\x67\x72\x70\x63\x2d\x63\x2f\x30\x2e\x31\x32\x2e\x30\x2e\x30\x20\x28\x6c\x69\x6e\x75\x78\x29\x00\x00\x00\x03\x10\x00\x00\x00\x01"
}

@ -1,3 +0,0 @@
network_input {
single_read_bytes: "\x50\x52\x49\x20\x2a\x20\x48\x54\x54\x50\x2f\x32\x2e\x30\x0d\x0a\x0d\x0a\x53\x4d\x0d\x0a\x0d\x0a\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x04\x01\x04\x00\x00\x00\x01\xff\x80\x80\x00"
}

@ -1,3 +0,0 @@
network_input {
single_read_bytes: "\x50\x52\x49\x20\x2a\x20\x48\x54\x54\x50\x2f\x32\x2e\x30\x0d\x0a\x0d\x0a\x53\x4d\x0d\x0a\x0d\x0a\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00\x01\x04\x00\x00\x00\x01\x00\x02\x00\x07\x65\x65\x73\x2a\x00\x01"
}

@ -1,3 +0,0 @@
network_input {
single_read_bytes: "\x50\x52\x49\x20\x2a\x20\x48\x54\x54\x50\x2f\x32\x2e\x30\x0d\x0a\x0d\x0a\x53\x4d\x0d\x0a\x0d\x0a\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00\x01\x04\x00\x00\x00\x01\x00\x02\x00\x00\x00\x00\x00\x00\x01\xc6\x00\x00\x01\x04\x10\x00\x00\x01"
}

@ -1,3 +0,0 @@
network_input {
single_read_bytes: "\x50\x52\x49\x20\x2a\x20\x48\x54\x54\x50\x2f\x32\x2e\x30\x0d\x0a\x0d\x0a\x53\x4d\x0d\x0a\x0d\x0a\x00\x03\x00\x04\x00\x00\x00\x00\x00\x3a\x00\x00\x08\x01\x04\x00\x00\x00\x01\xff\x80"
}

@ -1,3 +0,0 @@
network_input {
single_read_bytes: "\x50\x52\x49\x20\x2a\x20\x48\x54\x54\x50\x2f\x32\x2e\x30\x0d\x0a\x0d\x0a\x53\x4d\x0d\x0a\x0d\x0a\x00\x00\x00\x04"
}

@ -1,3 +0,0 @@
network_input {
single_read_bytes: "\x50\x52\x49\x20\x2a\x20\x48\x54\x54\x50\x2f\x32\x2e\x30\x0d\x0a\x0d\x0a\x53\x4d\x0d\x0a\x0d\x0a\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\xf4\x01\x04\x00\x00\x00\x01\x10\x05\x3a\x70\x61\x74\x68\x08\x2f\x66\x6f\x6f\x2f\x62\x61\x72\x10\x07\x3a\x73\x63\x68\x65\x6d\x65\x04\x68\x74\x74\x70\x10\x07\x3a\x6d\x65\x74\x68\x6f\x64\x04\x50\x4f\x53\x54\x10\x04\x68\x6f\x73\x74\x09\x6c\x6f\x63\x61\x6c\x68\x6f\x73\x74\x10\x0c\x63\x6f\x6e\x74\x65\x6e\x74\x2d\x74\x79\x70\x65\x1e\x61\x70\x70\x6c\x69\x63\x61\x74\x69\x6f\x6e\x2f\x67\x72\x70\x63\x2b\x74\x68\x69\x73\x2d\x69\x73\x2d\x76\x61\x6c\x69\x64\x10\x14\x67\x72\x70\x63\x2d\x61\x63\x63\x65\x70\x74\x2d\x65\x6e\x63\x6f\x64\x69\x6e\x67\x15\x69\x64\x65\x6e\x74\x69\x74\x79\x2c\x64\x65\x66\x6c\x61\x74\x65\x2c\x67\x7a\x69\x70\x10\x02\x74\x65\x08\x74\x72\x61\x69\x6c\x65\x72\x73\x10\x0a\x75\x73\x65\x72\x2d\x61\x67\x65\x6e\x74\x22\x62\x61\x64\x2d\x63\x6c\x69\x65\x6e\x74\x20\x67\x72\x70\x63\x2d\x63\x2f\x30\x2e\x31\x32\x2e\x30\x2e\x30\x20\x28\x6c\x69\x6e\x75\x78\x29\x10\x0c\x67\x72\x70\x63\x2d\x74\x69\x6d\x65\x6f\x75\x74\x03\x31\x30\x53\x10\x0c\x67\x72\x70\x63\x2d\x74\x69\x6d\x65\x6f\x75\x74\x02\x35\x53"
}

@ -1,3 +0,0 @@
network_input {
single_read_bytes: "\x50\x52\x49\x20\x2a\x20\x48\x54\x54\x50\x2f\x32\x2e\x30\x0d\x0a\x0d\x0a\x53\x4d\x0d\x0a\x0d\x0a\x50\x52\x49\x20\x2a\x20\x48\x54\x54\x50\x2f\x32\x2e\x30\x0d\x0a\x0d\x0a\x53\x4d\x0d\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00\x01\x04\x00\x00\x01\x0a\x0d\x0a\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x19\x01\x04\x00\x00\x00\x01\x50\x52\x49\x20\x2a\x20\x48\x54\x54\x50\x2f\x32\x2e\x30\x0d\x10\x0c\x67\x72\x70\x63\x2d\x74\x69\x6d\x65\x6f\x75\x74\x0a\x31\x6e\x20\x6f\x64\x73\x65\x30\x63\x73\x00\x00\x19\x01\x04\x00\x00\x00\x03\x10\x0c\x67\x72\x70\x63\x2d\x74\x69\x6d\x65\x6f\x75\x74\x0a\x31\x34\x20\x73\x00\x00\x01\x00\x04\x00\x00\x00\x01\x00\xa5\x00\x00\x01\x00\x00\x00\x65\x63\x6f\x6e\x00\x04\x00\x64\x73\x00\x02\x01\x0a\x0d\x0a\x53\x4d\x0d\x0a\x0d\x0a\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x0a\x01\x04\x00\x00\x00\x03\x00\x00\x02\x00\x00\x00\x00\x00\x03\x00\x00\x00\x09\x04\x00\x00\x00\x01"
}

@ -1,3 +0,0 @@
network_input {
single_read_bytes: "\x50\x52\x49\x20\x2a\x20\x48\x54\x54\x50\x2f\x32\x2e\x30\x0d\x0a\x0d\x0a\x53\x4d\x0d\x0a\x0d\x0a\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\xf4\x01\x04\x00\x00\x00\x01\x10\x05\x3a\x70\x61\x74\x68\x08\x2f\x66\x6f\x6f\x2f\x62\x61\x72\x10\x07\x3a\x73\x63\x68\x65\x6d\x65\x04\x68\x74\x74\x70\x10\x07\x3a\x6d\x65\x74\x68\x6f\x64\x04\x50\x4f\x53\x54\x10\x04\x68\x6f\x73\x74\x09\x6c\x6f\x63\x61\x6c\x68\x6f\x73\x74\x10\x0c\x63\x6f\x6e\x74\x65\x6e\x74\x2d\x74\x79\x70\x65\x1e\x61\x70\x70\x6c\x69\x63\x61\x74\x69\x6f\x6e\x2f\x67\x72\x70\x63\x68\x74\x2b\x69\x73\x2d\x69\x73\x2d\x76\x61\x6c\x69\x64\x01\x00\x00\x00\x70\x63\x2d\x61\x63\x63\x65\x70\x74\x2d\x65\x6e\x63\x6f\x64\x69\x6e\x67\x15\x69\x64\x65\x6e\x74\x69\x74\x79\x2c\x64\x65\x66\x6c\x61\x74\x65\x2c\x67\x7a\x69\x70\x10\x02\x74\x65\x08\x74\x72\x61\x69\x6c\x65\x72\x73\x10\x0a\x75\x73\x65\x72\x2d\x61\x67\x65\x6e\x74\x22\x62\x61\x64\x2d\x63\x6c\x69\x65\x6e\x74\x20\x67\x72\x70\x63\x2d\x63\x2f\x30\x2e\x31\x32\x2e\x30\x2e\x30\x20\x28\x6c\x69\x6e\x75\x78\x29\x10\x0c\x67\x72\x70\x63\x2d\x74\x69\x6d\x65\x6f\x75\x74\x03\x31\x30\x53\x10\x0c\x67\x72\x70\x63\x2d\x74\x69\x6d\x65\x6f\x75\x74\x02\x35\x53"
}

@ -1,3 +0,0 @@
network_input {
single_read_bytes: "\x50\x52\x49\x20\x2a\x20\x48\x54\x54\x50\x2f\x32\x2e\x30\x0d\x0a\x0d\x0a\x53\x4d\x0d\x0a\x0d\x0a\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00\x01\x04\x00\x00\x00\x01\x00\x00\x01\x00\x04\x00\x00\x00\x01\x00\x00\x00\x01\x04\x00\x00\x00\x01"
}

@ -1,3 +0,0 @@
network_input {
single_read_bytes: "\x50\x52\x49\x20\x2a\x20\x48\x54\x54\x50\x2f\x32\x2e\x30\x0d\x0a\x0d\x0a\x53\x4d\x0d\x0a\x0d\x0a\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x02\x00\x01\x04\x00\x00\x00\x01\x10\x05\x3a\x70\x61\x74\x68\x08\x2f\x66\x6f\x6f\x2f\x62\x61\x72\x10\x07\x3a\x73\x63\x68\x65\x6d\x65\x04\x68\x74\x74\x70\x10\x07\x3a\x6d\x65\x74\x68\x6f\x64\x04\x50\x4f\x53\x54\x10\x0a\x3a\x61\x75\x74\x68\x6f\x72\x69\x74\x79\x09\x6c\x6f\x63\x61\x6c\x68\x6f\x73\x74\x10\x0c\x63\x6f\x6e\x74\x65\x6e\x74\x2d\x74\x79\x70\x65\x10\x61\x70\x70\x6c\x69\x63\x61\x74\x69\x6f\x6e\x2f\x67\x72\x70\x63\x10\x14\x67\x72\x70\x63\x2d\x61\x63\x63\x65\x70\x74\x2d\x65\x6e\x63\x6f\x64\x69\x6e\x67\x15\x64\x65\x66\x6c\x61\x74\x65\x2c\x69\x64\x65\x6e\x74\x69\x74\x79\x2c\x67\x7a\x69\x70\x10\x02\x74\x65\x08\x74\x72\x61\x69\x6c\x65\x72\x73\x10\x0a\x75\x73\x65\x72\x2d\x61\x67\x65\x6e\x74\x50\x52\x49\x20\x2a\x20\x48\x54\x54\x50\x2f\x32\x2e\x30\x0d\x0a\x0d\x0a\x53\x4d\x0d\x0a\x0d\x0a\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\xf4\x01\x00\x04\x00\x01\x00\x10\x05\x3a\x70\x61\x74\x68\x08\x22\x62\x61\x64\x2d\x63\x6c\x69\x65\x6e\x74\x20\x67\x72\x70\x63\x2d\x63\x2f\x30\x2e\x31\x32\x2e\x30\x2e\x30\x20\x28\x6c\x69\x6e\x75\x78\x29\x00\x3f\xfc\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0b\x67\x72\x70\x63\x2d\x73\x74\x61\x74\x75\x73\x00\x00\x01\x32\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0d\x67\x72\x70\x63\x2d\x65\x6e\x63\x6f\x64\x69\x6e\x67\x08\x69\x64\x65\x6e\x74\x69\x74\x79\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x2f\x66\x6f\x6f\x2f\x62\x61\x72\x10\x07\x3a\x73\x63\x68\x65\x6d\x65\x04\x68\x74\x74\x70\x10\x07\x3a\x6d\x65\x74\x68\x6f\x64\x04\x50\x4f\x53\x54\x10\x04\x68\x6f\x73\x74\x09\x6c\x6f\x63\x61\x6c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x68\x6f\x73\x74\x10\x0c\x63\x00\x6f\x6e\x00"
}

@ -1,3 +0,0 @@
network_input {
single_read_bytes: "\x50\x52\x49\x20\x2a\x20\x48\x54\x54\x50\x2f\x32\x2e\x30\x0d\x0a\x0d\x0a\x53\x4d\x0d\x0a\x0d\x0a\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\xf4\x01\x04\x00\x00\x00\x01\x10\x05\x3a\x70\x61\x74\x68\x08\x2f\x66\x6f\x6f\x2f\x62\x61\x72\x10\x07\x3a\x73\x63\x68\x65\x6d\x65\x04\x68\x74\x74\x70\x10\x07\x3a\x6d\x65\x74\x68\x6f\x64\x04\x50\x4f\x53\x54\x10\x04\x68\x6f\x73\x74\x09\x6c\x6f\x63\x61\x6c\x68\x6f\x73\x74\x10\x0c\x67\x72\x70\x63\x2d\x6d\x65\x73\x73\x61\x67\x65\x1e\x61\x70\x70\x6c\x69\x63\x61\x74\x69\x6f\x6e\x2f\x67\x72\x70\x63\x2b\x74\x68\x69\x73\x2d\x69\x73\x2d\x76\x01\x32\x69\x64\x10\x14\x67\x72\x70\x63\x2d\x61\x63\x63\x65\x70\x74\x2d\x65\x6e\x63\x6f\x64\x69\x6e\x67\x15\x69\x64\x65\x6e\x74\x69\x74\x79\x2c\x64\x65\x66\x6c\x61\x74\x65\x2c\x67\x7a\x69\x70\x10\x02\x74\x65\x08\x74\x72\x61\x69\x6c\x65\x72\x73\x10\x0a\x75\x73\x65\x72\x2d\x61\x67\x65\x6e\x74\x22\x62\x61\x64\x2d\x63\x6c\x69\x65\x6e\x74\x20\x67\x72\x70\x63\x2d\x63\x2f\x30\x2e\x31\x32\x00\x05\x72\x61\x6e\x67\x65\x00\x6e\x75\x78\x29\x10\x0c\x67\x72\x70\x63\x2d\x74\x69\x6d\x65\x6f\x75\x74\x03\x31\x30\x53\x10\x0c\x67\x72\x70\x63\x2d\x74\x69\x6d\x65\x6f\x75\x74\x02\x32\x53"
}

@ -1,3 +0,0 @@
network_input {
single_read_bytes: "\x50\x52\x49\x20\x2a\x20\x48\x54\x54\x50\x2f\x32\x2e\x30\x0d\x0a\x0d\x0a\x53\x4d\x0d\x0a\x0d\x0a\x00\x00\x00\x88\x04\x00\x00\x00\x00\x00\x29\x00\x07\x01\x04\x00\x00\x00\xff\x80\x80\x80\x80\x80\x00"
}

@ -1,3 +0,0 @@
network_input {
single_read_bytes: "\x50\x52\x49\x20\x48\x2a\x20\x54\x54\x01\x00\x00\x00\x30\x0d\x0a\x0d\x4d\x0d\x53\x0a\x0a\x0d\x0a\x00\x00\x00\x04\x00\x3a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x01\x04\x00\x00\x00\x01\xff\x00"
}

@ -1,3 +0,0 @@
network_input {
single_read_bytes: "\x50\x52\x49\x20\x2a\x20\x48\x54\x54\x50\x2f\x32\x2e\x30\x0d\x0a\x0d\x0a\x53\x4d\x0d\x0a\x0d\x0a\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\xf5\x01\x04\x00\x00\x00\x01\x10\x05\x3a\x70\x61\x74\x68\x08\x2f\x66\x6f\x6f\x2f\x61\x72\x10\x07\x3a\x73\x63\x68\x65\x6d\x65\x04\x68\x74\x74\x70\x10\x07\x3a\x6d\x65\x74\x68\x6f\x64\x04\x50\x4f\x53\xfe\xff\xff\xff\x54\x10\x04\x68\x6f\x73\x74\x09\x6c\x6f\x63\x61\x6c\x68\x6f\x73\x74\x10\x0c\x63\x6f\x6e\x74\x65\x6e\x74\x2d\x74\x79\x70\x65\x1e\x61\x70\x70\x6c\x69\x63\x61\x74\x69\x6f\x6e\x2f\x67\x72\x70\x63\x2b\x74\x68\x69\x73\x2d\x69\x73\x2d\x76\x61\x6c\x69\x64\x10\x14\x67\x72\x70\x63\x2d\x61\x63\x11\x22\x22\x63\x65\x6e\x73\x75\x73\x2d\x62\x69\x6e\x61\x72\x79\x62\x2d\x2c\x69\x6e\x79\x65\x66\x64\x6c\x61\x74\x65\x2c\x67\x7a\x69\x70\x10\x02\x74\x65\x08\x74\x72\x61\x69\x6c\x65\x72\x73\x10\x0a\x75\x73\x65\x72\x2d\x61\x67\x65\x6e\x74\x22\x62\x61\x64\x2d\x63\x6c\x69\x65\x6e\x74\x20\x67\x72\x70\x63\x2d\x63\x2f\x35\x2e\x31\x32\x2e\x30\x2e\x30\x20\x28\x6c\x69\x6e\x75\x78\x29\x10\x0c\x67\x01\x00\x00\x00\x74\x69\x6d\x65\x6f\x75\x74\x03\x31\x30\x6d\x53\x10\x0c\x67\x72\x70\x63\x2d\x74\x69\x6d\x65\x6f\x75\x74\x02\x32\x53"
}

@ -1,3 +0,0 @@
network_input {
single_read_bytes: "\x50\x52\x49\x20\x2a\x20\x48\x54\x54\x50\x2f\x32\x2e\x30\x0d\x0a\x0d\x0a\x53\x4d\x0d\x0a\x0d\x0a\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x02\x00\x01\x04\x00\x00\x00\x01\x10\x05\x3a\x70\x61\x74\x68\x08\x2f\x66\x6f\x6f\x2f\x62\x61\x72\x10\x07\x3a\x73\x63\x68\x65\x6d\x65\x04\x68\x74\x74\x70\x10\x07\x3a\x6d\x65\x74\x68\x6f\x64\x04\x50\x4f\x53\x54\x10\x0a\x3a\x61\x75\x74\x68\x6f\x72\x69\x74\x79\x09\x6c\x6f\x63\x61\x6c\x68\x67\x73\x74\x10\x0c\x63\x6f\x6e\x74\x65\x6e\x74\x2d\x74\x79\x70\x65\x10\x61\x70\x70\x6c\x69\x63\x61\x74\x69\x6f\x6e\x2f\x67\x72\x70\x63\x10\x14\x67\x72\x70\x63\x2d\x61\x63\x63\x65\x70\x74\x2d\x65\x6e\x63\x6f\x64\x69\x6e\x67\x15\x64\x65\x66\x6c\x61\x74\x65\x2c\x69\x64\x65\x6e\x74\x69\x74\x79\x2c\x67\x7a\x69\x70\x10\x02\x74\x65\x08\x74\x72\x61\x69\x6c\x65\x72\x73\x00\x0d\x67\x72\x70\x63\x2d\x65\x6e\x63\x6f\x64\x69\x6e\x67\x04\x67\x7a\x69\x70\x54\x50\x2f\x32\x2e\x30\x0d\x0a\x0d\x0a\x53\x4d\x0d\x0a\x0d\x0a\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\xf4\x01\x00\x04\x00\x01\x00\x10\x05\x3a\x70\x61\x74\x68\x08\x22\x62\x61\x64\x2d\x63\x6c\x69\x65\x6e\x74\x20\x67\x72\x70\x63\x2d\x63\x2f\x30\x2e\x31\x32\x2e\x30\x2e\x30\x20\x28\x6c\x69\x6e\x75\x78\x29\x00\x3f\xfc\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x3a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0b\x67\x72\x70\x63\x2d\x73\x74\x61\x74\x75\x73\x01\x63\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x27\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0d\x67\x72\x70\x63\x2d\x65\x6e\x63\x6f\x64\x69\x6e\x67\x08\x69\x64\x65\x6e\x74\x69\x7c\x79\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x2f\x66\x6f\x6f\x2f\x62\x61\x72\x10\x07\x3a\x73\x63\x68\x65\x6d\x65\x04\x68\x74\x74\x70\x10\x07\x3a\x6d\x65\x74\x68\x6f\x64\x04\x50\x4f\x53\x54\x10\x04\x68\x6f\x73\x74\x09\x6c\x6f\x63\x61\x6c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\x00\x00\x00\x00\x00\x68\x2f\x73\x74\x10\x0c\x63\xc1\x6f\x6e\x00"
}

@ -1,3 +0,0 @@
network_input {
single_read_bytes: "\x50\x52\x49\x20\x2a\x20\x48\x54\x54\x50\x2f\x32\x2e\x30\x0d\x0a\x0d\x0a\x53\x4d\x0d\x0a\x0d\x0a\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x19\x01\x04\x00\x00\x00\x01\x10\x0c\x67\x72\x70\x63\x2d\x74\x69\x6d\x65\x6f\x75\x74\x0a\x20\x31\x35\x73\x65\x63\x6f\x6e\x64\x73"
}

@ -1,3 +0,0 @@
network_input {
single_read_bytes: "\x50\x52\x49\x20\x2a\x20\x48\x54\x54\x50\x2f\x32\x2e\x30\x0d\x0a\x0d\x0a\x53\x4d\x0d\x0a\x0d\x0a\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x04\x01\x04\x00\x00\x00\x01\xa0\x3f\xe1\x1f"
}

@ -1,3 +0,0 @@
network_input {
single_read_bytes: "\x50\x52\x49\x20\x2a\x20\x48\x54\x54\x50\x2f\x32\x2e\x30\x0d\x0a\x0d\x0a\x53\x4d\x0d\x0a\x0d\x0a\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x02\x00\x01\x04\x00\x00\x00\x01\x10\x05\x3a\x70\x61\x74\x68\x08\x2f\x66\x6f\x6f\x2f\x62\x61\x72\x10\x07\x3a\x73\x63\x68\x65\x6d\x65\x04\x68\x74\x74\x70\x10\x07\x3a\x6d\x50\x52\x49\x20\x2a\x20\x48\x54\x54\x50\x2f\x32\x2e\x30\x0d\x0a\x0d\x0a\x53\x4d\x0d\x0a\x0d\x0a\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x02\x03\x01\x04\x00\x00\x00\x01\x3f\x50\x52\x49\x20\x65\x74\x68\x6f\x64\x04\x50\x4f\x53\x54\x10\x0a\x3a\x61\x75\x74\x68\x6f\x72\x69\x74\x79\x09\x6c\x6f\x63\x61\x6c\x68\x6f\x73\x74\x10\x0c\x63\x6f\x6e\x74\x65\x6e\x74\x2d\x74\x79\x70\x65\x10\x61\x70\x70\x6c\x69\x63\x61\x74\x69\x6f\x6e\x2f\x67\x72\x70\x63\x10\x14\x67\x72\x70\x63\x2d\x61\x63\x63\x65\x70\x74\x2d\x65\x6e\x63\x6f\x64\x69\x6e\x67\x15\x64\x65\x66\x6c\x61\x74\x65\x2c\x69\x64\x65\x6e\x74\x69\x74\x79\x2c\x67\x7a\x69\x70\x10\x02\x74\x65\x08\x74\x72\x61\x69\x6c\x65\x72\x73\x10\x0a\x75\x73\x65\x72\x2d\x61\x67\x65\x6e\x74\x50\x52\x49\x20\x2a\x20\x48\x54\x54\x50\x2f\x31\x2e\x30\x0d\x0a\x0d\x0a\x53\x4d\x0d\x0a\x0d\x0a\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\xf4\x01\x04\x00\x00\x00\x01\x10\x05\x3a\x70\x61\x74\x68\x08\x22\x62\x61\x64\x2d\x63\x6c\x69\x65\x6e\x74\x20\x67\x72\x70\x63\x2d\x63\x2f\x30\x2e\x31\x32\x2e\x30\x2e\x30\x20\x28\x6c\x69\x6e\x75\x78\x29\x00\x3f\xfc\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0b\x67\x72\x70\x63\x2d\x73\x74\x61\x74\x75\x73\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x2f\x66\x6f\x6f\x2f\x62\x61\x72\x10\x07\x3a\x73\x63\x68\x65\x6d\x65\x04\x68\x74\x74\x70\x10\x07\x3a\x6d\x65\x74\x68\x6f\x64\x04\x50\x4f\x53\x54\x10\x04\x68\x6f\x73\x74\x09\x6c\x6f\x63\x61\x6c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x2a\x20\x50\x52\x49\x20\x2a\x20\x48\x54\x54\x50\x2f\x32\x2e\x30\x0d\x0a\x0d\x0a\x53\x4d\x0d\x0a\x0d\x0a\x00\x00\x00\x04\x00\x00\x00\x48\x54\x54\x50\x2f\x32\x2e\x30\x0d\x0a\x0d\x0a\x53\x4d\x0d\x0a\x0d\x0a\x00\x03\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x50\x52\x49\x20\x2a\x20\x48\x54\x54\x50\x2f\x33\x2e\x30\x0d\x0a\x0d\x0a\x2a\x53\x4d\x0d\x0a\x0d\x0a\x00\x00\x00\x04\x00\x00\x00\x00\x00\x06\x01\x04\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x01\x04\x00\x00\x00\x01\x10\x05\x3a\x70\x61\x74\x68\x08\x2f\x66\x6f\x6f\x2f\x62\x61\x72\x10\x07\x3a\x73\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x63\x68\x65\x6d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x68\x6f\x73\x74\x10\x0c\x65\x04\x68\x74\x74\x70\x10\x07\x3a\x6d\x65\x74\x68\x6f\x64\x63\x00\x6f\x6e\x00\x04\x50\x4f\x53\x54\x10\x0a\x3a\x61\x75\x74\x68\x6f\x72"
}

@ -1,3 +0,0 @@
network_input {
single_read_bytes: "\x50\x52\x49\x20\x2a\x20\x48\x54\x54\x50\x2f\x32\x2e\x30\x0d\x0a\x0d\x0a\x53\x4d\x0d\x0a\x0d\x0a\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00\x01\x04\x00\x00\x00\x03\x00\x00\x04\x03\x00\x00\x00\x00\x03\x00\x00\x00\x09\x04\x00\x00\x00\x01"
}

@ -1,3 +0,0 @@
network_input {
single_read_bytes: "\x50\x52\x49\x20\x2a\x20\x48\x54\x54\x50\x2f\x32\x2e\x30\x0d\x0a\x0d\x0a\x53\x4d\x0d\x0a\x0d\x0a\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x28\x00\x08\x00\x00\x04\x01\x00\x01\xff"
}

@ -1,3 +0,0 @@
network_input {
single_read_bytes: "\x50\x52\x49\x20\x2a\x20\x48\x54\x54\x50\x2f\x32\x2e\x30\x0d\x0a\x0d\x0a\x53\x4d\x0d\x0a\x0d\x0a\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00\x01\x04\x00\x00\x00\x03\x00\x00\x04\x03\x00\x00\x00\x00\x03\x00\x00\x00\x00\x00\x00\x00\x00\x01"
}

@ -1,3 +0,0 @@
network_input {
single_read_bytes: "\x50\x52\x49\x20\x2a\x20\x48\x54\x54\x50\x2f\x32\x2e\x30\x0d\x0a\x0d\x0a\x53\x4d\x0d\x0a\x0d\x0a\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\xf5\x01\x04\x00\x00\x00\x01\x10\x05\x3a\x70\x61\x74\x68\x08\x2f\x66\x6f\x6f\x2f\x62\x61\x72\x10\x07\x3a\x73\x63\x68\x65\x6d\x65\x04\x68\x74\x74\x70\x10\x07\x3a\x6d\x65\x74\x6c\x6f\x64\x04\x50\x4f\x53\x54\x10\x0a\x3a\x61\x75\x74\x68\x6f\x72\x69\x74\x79\x09\x6c\x6f\x63\x61\x6c\x68\x6f\x73\x74\x00\x07\x3a\x6d\x65\x74\x68\x6f\x64\x03\x50\x55\x54\x65\x10\x61\x70\x70\x6c\x69\x63\x61\x74\x69\x6f\x6e\x2f\x67\x72\x70\x63\x10\x14\x67\x72\x70\x63\x2d\x61\x63\x63\x65\x70\x74\x2d\x6c\x6e\x63\x6f\x64\x69\x6e\x67\x0f\x15\x69\x64\x65\x6e\x74\x69\x74\x79\x2c\x64\x65\x66\x6c\x61\x74\x65\x2c\x67\x7a\x69\x70\x10\x0d\x67\x72\x70\x63\x2d\x65\x6e\x63\x6f\x64\x69\x6e\x67\x1c\x79\x6f\x75\x2d\x64\x6f\x6e\x74\x2d\x6b\x6e\x6f\x77\x2d\x68\x6f\x77\x2d\x74\x6f\x2d\x64\x6f\x2d\x74\x68\x69\x73\x10\x02\x74\x65\x08\x74\x72\x61\x69\x6c\x65\x72\x73\x10\x0a\x75\x73\x65\x72\x2d\x61\x67\x65\x6e\x74\x22\x62\x61\x64\x2d\x63\x6c\x69\x65\x6e\x74\x20\x67\x72\x70\x63\x2d\x63\x2f\x30\x2e\x31\x32\x2e\x30\x2e\x30\x20\x28\x6c\x69\x6e\x75\x78\x29"
}

@ -1,3 +0,0 @@
network_input {
single_read_bytes: "\x50\x52\x49\x20\x2a\x20\x48\x54\x54\x50\x2f\x32\x2e\x30\x0d\x0a\x0d\x0a\x53\x4d\x0d\x0a\x0d\x0a\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x02\x00\x01\x04\x00\x00\x00\x01\x10\x05\x3a\x70\x61\x74\x68\x08\x2f\x66\x6f\x6f\x2f\x62\x61\x72\x10\x07\x3a\x73\x63\x68\x65\x6d\x65\x04\x68\x74\x74\x70\x10\x07\x3a\x6d\x65\x74\x68\x6f\x64\x04\x50\x4f\x53\x54\x10\x0a\x3a\x61\x75\x74\x68\x6f\x72\x69\x74\x79\x09\x6c\x6f\x63\x61\x6c\x68\x6f\x73\x74\x10\x0c\x63\x6f\x6e\x74\x65\x6e\x74\x2d\x74\x79\x70\x65\x10\x61\x70\x70\x6c\x69\x63\x61\x74\x69\x6f\x6e\x2f\x67\x72\x70\x63\x10\x14\x67\x72\x70\x63\x2d\x61\x63\x63\x65\x70\x74\x2d\x65\x6e\x63\x6f\x64\x69\x6e\x67\x15\x64\x65\x66\x6c\x61\x74\x65\x2c\x69\x64\x65\x6e\x74\x69\x74\x79\x2c\x67\x7a\x69\x70\x10\x02\x74\x65\x08\x74\x72\x61\x69\x6c\x65\x72\x73\x10\x0a\x75\x73\x65\x72\x2d\x61\x67\x65\x6e\x74\x50\x52\x49\x20\x2a\x20\x48\x54\x54\x50\x2f\x32\x2e\x30\x0d\x0a\x0d\x0a\x53\x4d\x0d\x0a\x0d\x0a\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\xf4\x01\x00\x04\x00\x01\x00\x10\x05\x3a\x70\x61\x74\x68\x08\x22\x62\x61\x64\x2d\x63\x6c\x69\x65\x6e\x74\x20\x67\x72\x70\x63\x2d\x63\x2f\x30\x2e\x31\x32\x2e\x30\x2e\x30\x20\x28\x6c\x69\x6e\x75\x78\x29\x00\x3f\xfc\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x3a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0b\x67\x72\x70\x63\x2d\x73\x74\x61\x74\x75\x73\x01\x63\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0d\x67\x72\x70\x63\x2d\x65\x6e\x63\x6f\x64\x69\x6e\x67\x08\x69\x64\x65\x6e\x74\x69\x74\x79\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x2f\x66\x6f\x6f\x2f\x62\x61\x72\x10\x07\x3a\x73\x63\x68\x65\x6d\x65\x04\x68\x74\x74\x70\x10\x07\x3a\x6d\x65\x74\x68\x6f\x64\x04\x50\x4f\x53\x54\x10\x04\x68\x6f\x73\x74\x09\x6c\x6f\x63\x61\x6c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\x00\x00\x00\x00\x00\x68\x6f\x73\x74\x10\x0c\x63\x00\x6f\x6e\x00"
}

@ -1,3 +0,0 @@
network_input {
single_read_bytes: "\x50\x52\x49\x20\x2a\x20\x48\x54\x54\x50\x2f\x32\x2e\x30\x0d\x0a\x0d\x0a\x53\x4d\x0d\x0a\x0d\x0a\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00\x01\x04\x00\x00\x00\x01\x00\x00\x01\x08\x04\x00\x00\x00\x01\x00\xa5\x00\x00\x01\x04\x00\x00\x02\x01"
}

@ -1,3 +0,0 @@
network_input {
single_read_bytes: "\x50\x52\x49\x20\x2a\x20\x48\x54\x54\x50\x2f\x32\x2e\x30\x0d\x0a\x0d\x0a\x53\x4d\x0d\x0a\x0d\x0a\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\xc2\x01\x04\x00\x00\x00\x01\x10\x05\x75\x70\x61\x74\x68\x08\x2f\x66\x6f\x6f\x2f\x62\x61\x72\x3a\x10\x07\x73\x63\x68"
}

@ -1,3 +0,0 @@
network_input {
single_read_bytes: "\x50\x52\x49\x20\x2a\x20\x48\x54\x54\x50\x2f\x32\x58"
}

@ -1,3 +0,0 @@
network_input {
single_read_bytes: "\x50\x52\x49\x20\x2a\x20\x48\x54\x54\x50\x2f\x32\x2e\x30\x0d\x0a\x0d\x58"
}

@ -1,3 +0,0 @@
network_input {
single_read_bytes: "\x50\x52\x49\x20\x2a\x20\x48\x54\x54\x50\x2f\x32\x2e\x30\x0d\x0a\x0d\x0a\x53\x4d\x0d\x0a\x0d\x0a\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x03\x01\x04\x00\x00\x00\x01\xff\x80\x00"
}

@ -1,3 +0,0 @@
network_input {
single_read_bytes: "\x48\x54\x54\x50\x2a\x00\x00\x00\x00\x27\x20\x20\x52\x54\x50\x2f\x32\x2e\x30\x0a\x0d\x0a\x53\x1f\x4d\x0d\x0a\x0d\x0a\x00\x00\x00\x04\x00\x00\x00\xfb\x00\x00\x00\x00\x01\x04\x00\x00\x00\x52\x01\x00\x02\x00\x07\x65\x72\x72\x66\x65\x73\x2a\x00\x00\x00\x01"
}

@ -1,3 +0,0 @@
network_input {
single_read_bytes: "\x50\x52\x49\x20\x2a\x20\x48\x54\x54\x50\x2f\x32\x2e\x30\x0d\x0a\x0d\x0a\x53\x4d\x0d\x0a\x0d\x0a\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\xf5\x01\x04\x00\x00\x00\x01\x10\x05\x3a\x70\x61\x74\x68\x08\x2f\x66\x6f\x6f\x2f\x61\x72\x10\x07\x3a\x73\x63\x68\x65\x6d\x65\x04\x68\x74\x74\x70\x10\x07\x3a\x6d\x65\x74\x68\x6f\x64\x04\x50\x4f\x53\xfe\xff\xff\xff\x54\x10\x04\x68\x6f\x73\x74\x09\x6c\x6f\x63\x61\x6c\x68\x6f\x73\x74\x10\x0c\x63\x6f\x6e\x74\x65\x6e\x74\x2d\x74\x79\x70\x65\x1e\x61\x70\x70\x6c\x69\x63\x61\x74\x69\x6f\x6e\x2f\x67\x72\x70\x63\x2b\x74\x68\x69\x73\x2d\x69\x73\x2d\x76\x61\x6c\x69\x64\x10\x14\x67\x72\x70\x63\x2d\x61\x63\x11\x22\x22\x63\x65\x6e\x73\x75\x73\x2d\x62\x69\x6e\x61\x72\x79\x3d\x62\x69\x6e\x79\x2c\x64\x65\x66\x6c\x61\x50\x52\x49\x20\x2a\x20\x48\x54\x54\x50\x2f\x32\x2e\x30\x0d\x0a\x0d\x0a\x53\x4d\x0d\x0a\x0d\x0a\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x01\x00\x00\x00\x09\x04\x00\x00\x00\x74\x65\x2c\x67\x7a\x69\x70\x10\x02\x74\x65\x01"
}

@ -1,3 +0,0 @@
network_input {
single_read_bytes: "\x50\x52\x49\x20\x2a\x20\x48\x54\x54\x50\x2f\x32\x2e\x30\x0d\x0a\x0d\x0a\x53\x4d\x0d\x0a\x0d\x0a\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\xc2\x01\x04\x00\x00\x00\x01\x10\x05\x3a\x70\x61\x74\x68\x08\x2f\x66\x6f\x6f\x2f\x62\x61\x72\x10\x07\x3a\x73\x63\x68\x65\x6d\x65\x04\x68\x74\x74\x70\x10\x07\x3a\x6d\x65\x74\x68\x6f\x64\x04\x50\x4f\x53\x54\x10\x0a\x3a\x61\x75\x74\x68\x6f\x72\x69\x74\x79\x09\x6c\x6f\x63\x61\x6c\x68\x6f\x73\x74\x10\x0c\x63\x6f\x6e\x74\x65\x6e\x74\x2d\x74\x79\x70\x65\x09\x74\x65\x78\x74\x2f\x68\x74\x6d\x6c\x10\x14\x67\x72\x70\x63\x2d\x61\x63\x63\x65\x70\x74\x2d\x65\x6e\x63\x6f\x64\x69\x6e\x67\x15\x69\x64\x65\x6e\x74\x69\x74\x79\x2c\x64\x65\x66\x6c\x61\x74\x65\x2c\x67\x7a\x69\x70\x10\x02\x74\x65\x08\x74\x72\x61\x69\x6c\x65\x72\x73\x10\x0a\x75\x73\x65\x72\x2d\x61\x67\x65\x6e\x74\x22\x62\x61\x64\x2d\x63\x6c\x69\x65\x6e\x74\x20\x67\x72\x70\x63\x2d\x63\x2f\x30\x2e\x31\x32\x2e\x30\x2e\x30\x20\x28\x6c\x69\x6e\x75\x78\x29"
}

@ -1,3 +0,0 @@
network_input {
single_read_bytes: "\x50\x52\x49\x20\x2a\x20\x48\x54\x54\x50\x2f\x32\x2e\x30\x0d\x0a\x0d\x0a\x53\x4d\x0d\x0a\x0d\x0a\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00\x01\x04\x00\x00\x00\x03\x00\x00\x01\x00\x00\x00\x00\x00\x03\x00\x00\x00\x09\x04\x00\x00\x00\x01"
}

@ -1,3 +0,0 @@
network_input {
single_read_bytes: "\x50\x52\x49\x20\x2a\x20\x48\x54\x54\x50\x2f\x32\x2e\x30\x0d\x0a\x0d\x0a\x53\x4d\x0d\x0a\x0d\x0a\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x04\x01\x04\x00\x00\x00\x01\x20\x3f\xe1\x1f"
}

@ -1,3 +0,0 @@
network_input {
single_read_bytes: "\x50\x52\x49\x20\x2a\x20\x48\x54\x54\x50\x2f\x32\x2e\x30\x0d\x0a\x0d\x0a\x53\x4d\x0d\x0a\x0d\x0a\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00\x88\x00\x00\x00\x00\x01"
}

@ -1,3 +0,0 @@
network_input {
single_read_bytes: "\x50\x52\x49\x20\x2a\x20\x48\x54\x54\x50\x2f\x32\x2e\x30\x0d\x0a\x0d\x0a\x53\x4d\x0d\x0a\x0d\x0a\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x01\x00\x00\x00\x00\x04\x00\x00\x00\x01"
}

@ -1,3 +0,0 @@
network_input {
single_read_bytes: "\x50\x52\x49\x20\x2a\x20\x48\x54\x54\x50\x2f\x32\x2e\x30\x0d\x0a\x0d\x0a\x53\x4d\x0d\x0a\x0d\x0a\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00\x01\x04\x00\x00\x00\x03\x00\x00\x04\x03\x00\x00\x00\x00\x03\x00\x00"
}

@ -1,3 +0,0 @@
network_input {
single_read_bytes: "\x50\x52\x49\x20\x2a\x20\x48\x54\x54\x50\x2f\x32\x2e\x30\x0d\x0a\x0d\x0a\x53\x4d\x0d\x0a\x0d\x0a\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x08\x01\x04\x00\x00\x00\x01\xff\x80\x80\x80\x80\x80"
}

@ -1,3 +0,0 @@
network_input {
single_read_bytes: "\x50\x52\x49\x20\x2a\x20\x48\x54\x54\x50\x2f\x32\x2e\x30\x0d\x0a\x0d\x0a\x53\x4d\x0d\x0a\x0d\x0a\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x0a\x01\x04\x00\x00\x00\x03\x00\x00\x02\x00\x00\x00\x00\x00\x03\x00\x00\x00\x09\x04\x00\x00\x00\x01"
}

@ -1,3 +0,0 @@
network_input {
single_read_bytes: "\x50\x52\x49\x20\x2a\x20\x48\x54\x54\x50\x2f\x32\x2e\x30\x0d\x0a\x0d\x0a\x53\x4d\x0d\x0a\x0d\x0a\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00\x01\x04\x00\x00\x00\x01\x00\x02\x00\x07\x65\x66\x65\x73\x2a\x00\x00\x01"
}

@ -1,3 +0,0 @@
network_input {
single_read_bytes: "\x50\x52\x49\x20\x2a\x20\x48\x54\x54\x50\x2f\x32\x2e\x30\x0d\x0a\x0d\x0a\x53\x4d\x0d\x0a\x0d\x0a\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x19\x01\x04\x00\x00\x00\x01\x10\x0c\x67\x72\x70\x63\x2d\x74\x69\x6d\x65\x6f\x75\x74\x00\x00\x00\x0a\x31\x35\x20\x6f\x63\x6e\x73\x65\x64\x73"
}

@ -1,3 +0,0 @@
network_input {
single_read_bytes: "\x50\x52\x49\x20\x2a\x20\x48\x54\x54\x50\x2f\x32\x2e\x30\x0d\x0a\x0d\x0a\x53\x4d\x0d\x0a\x0d\x0a\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\xc9\x01\x04\x00\x00\x00\x01\x10\x05\x3a\x70\x61\x74\x68\x08\x2f\x66\x6f\x6f\x2f\x62\x61\x72\x10\x07\x3a\x73\x63\x68\x65\x6d\x65\x04\x68\x74\x74\x70\x10\x07\x3a\x6d\x65\x74\x68\x6f\x64\x04\x50\x4f\x53\x54\x10\x0a\x3a\x61\x75\x74\x68\x6f\x72\x69\x74\x79\x09\xec\x6f\x63\x61\x6c\x68\x6f\x73\x74\x10\x0c\x63\x6f\x6e\x74\x65\x6e\x74\x2d\x74\x79\x70\x65\x10\x61\x70\x70\x6c\x69\x63\x61\x74\x69\x6f\x6e\x2f\x67\x72\x70\x63\x10\x14\x67\x72\x70\x63\x2d\x61\x63\x63\x65\x70\x74\x2d\x65\x6e\x63\x6f\x64\x69\x6e\x67\x15\x64\x65\x66\x6c\x61\x74\x65\x2c\x69\x64\x65\x6e\x74\x29\x69\x7a\x74\x79\x67\x70\x2c\x10\x02\x74\x65\x08\x74\x72\x61\x69\x6c\x65\x72\x73\x10\x0a\x75\x73\x72\x2d\x61\x67\x65\x6e\x74\x22\x62\x61\x64\x2d\x63\x6c\x69\x65\x6e\x74\x20\x67\x72\x70\x63\x2d\x63\x2f\x30\x2e\x31\x32\x2e\x30\x2e\x30\x20\x28\x6c\x69\x6e\x75\x78\x29\x00\x00\x04\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff"
}

@ -1,3 +0,0 @@
network_input {
single_read_bytes: "\x50\x52\x49\x20\x2a\x20\x48\x54\x54\x50\x2f\x32\x2e\x30\x0d\x0a\x0d\x0a\x53\x4d\x0d\x0a\x0d\x0a\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x02\x03\x01\x04\x00\x00\x00\x01\x3f\x50\x52\x49\x20\x2a\x20\x48\x54\x54\x50\x2f\x32\x2e\x30\x0d\x0a\x0d\x0a\x53\x4d\x0d\x0a\x0d\x0a\x00\x03\x00\x04\x50\x52\x49\x20\x2a\x20\x48\x54\x54\x00\x00\x00\x00\x00\x00\x00\x08\x50\x52\x49\x20\x2a\x20\x48\x54\x54\x50\x2f\x33\x2e\x30\x0d\x0a\x0d\x0a\x2a\x53\x4d\x0d\x0a\x0d\x0a\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\xc2\x01\x04\x00\x00\x00\x01\x10\x05\x3a\x70\x61\x74\x68\x08\x2f\x66\x6f\x6f\x2f\x62\x61\x72\x10\x07\x3a\x73\x63\x68\x65\x6d\x65\x04\x68\x74\x74\x70\x10\x07\x3a\x6d\x65\x74\x68\x6f\x64\x04\x50\x4f\x53\x54\x10\x0a\x3a\x61\x75\x74\x68\x6f\x72\x69\x79\x09\x6c\x6f\x63\x61\x6c\x68\x6f\x73\x74\x10\x0c\x63\x6f\x6e\x74\x65\x6e\x74\x2d\x74\x79\x70\x65\x09\x74\x65\x78\x74\x2f\x68\x74\x6d\x6c\x10\x14\x67\x72\x70\x63\x50\x52\x49\x20\x2a\x20\x48\x54\x54\x50\x2f\x32\x2e\x30\x0d\x0a\x0d\x0a\x53\x4d\x0d\x0a\x0d\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\xd0\x50\x2f\x32\x2e\x30\x0d\x0a\x0d\x0a\x53\x4d\x0d\x0a\x0d\x0a\x00\x00\x28\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x04\x00\x00\x00\x01\x00\x00\x01\x00\x00\x00\x00\x03\x00\x40\x04\x00\x01\x04\x00\x00\x00\x10\x05\x3a\x70\x61\x74\x2d\x61\x63\x63\x65\x70\x74\x2d\x65\x6e\x63\x6f\x64\x69\x6e\x67\x15\x69\x64\x65\x6e\x74\x69\x74\x79\x2c\x64\x65\x66\x6c\x61\x74\x65\x2c\x67\x7a\x69\x70\x10\x02\x74\x65\x08\x74\x72\x61\x69\x6c\x65\x72\x73\x10\x0a\x75\x73\x65\x72\xfe\xff\xff\xff\x2d\x61\x67\x65\x6e\x74\x22\x62\x61\x64\x2d\x63\x6c\x69\x65\x6e\x00\x04\x66\x72\x6f\x6d\x50\x52\x49\x20\x2a\x20\x48\x54\x54\x50\x2f\x32\x2e\x30\x0d\x0a\x0d\x0a\x53\x4d\x0d\x0a\x0d\x0a\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\xd0\x01\x04\x00\x00\x00\x01\x10\x05\x3a\x70\x61\x74\x68\x0f\x2f\x72\x65\x67\x69\x73\x74\x65\x72\x65\x64\x2f\x62\x61\x72\x10\x07\x3a\x73\x63\x68\x65\x6d\x65\x04\x68\x74\x74\x70\x10\x07\x3a\x6d\x65\x74\x68\x6f\x64\x04\x50\x4f\x53\x54\x10\x0a\x3a\x61\x75\x74\x68\x6f\x72\x69\x74\x79\x09\x6c\x6f\x63\x61\x6c\x68\x6f\x73\x74\x10\x0c\x63\x6f\x6e\x74\x65\x6e\x74\x2d\x74\x79\x70\x65\x10\x61\x70\x70\x6c\x69\x63\x61\x74\x69\x6f\x6e\x2f\x67\x72\x70\x63\x10\x14\x67\x72\x70\x63\x2d\x61\x63\x63\x65\x70\x74\x2d\x65\x6e\x63\x6f\x64\x69\x6e\x67\x15\x69\x64\x65\x6e\x74\x69\x74\x79\x2c\x64\x65\x66\x6c\x61\x74\x65\x2c\x67\x7a\x69\x70\x10\x02\x74\x65\x08\x74\x72\x61\x69\x6c\x65\x72\x73\x00\x68\x0f\x2f\x72\x65\x67\x69\x73\x74\x65\x72\x65\x64\x2f\x62\x61\x72\x10\x07\x3a\x73\x63\x68\x65\x6d\x65\x04\x68\x74\x74\x70\x10\x07\x3a\x6d\x65\x74\x68\x6f\x64\x04\x50\x4f\x53\x54\x10\x0a\x3a\x61\x75\x74\x68\x6f\x72\x69\x74\x79\x09\x6c\x6f\x63\x61\x6c\x68\x6f\x73\x74\x10\x0c\x63\x6f\x6e\x74\x65\x6e\x74\x2d\x74\x79\x70\x65\x10\x61\x70\x70\x6c\x69\x63\x61\x74\x69\x6f\x6e\x2f\x67\x72\x70\x63\x10\x14\x67\x72\x70\x63\x2d\x61\x63\x63\x65\x60\x74\x2d\x65\x6e\x63\x6f\x64\x69\x6e\x67\x15\x69\x64\x65\x6c\x74\x69\x74\x79\x2c\x64\x65\x66\x6c\x61\x74\x65\x2c\x67\x7a\x69\x70\x10\x02\x74\x65\x08\x74\x72\x61\x69\x6c\x00\x00\x70\x63\x01\x2d\x63\x65\x72\x73\x10\x0a\x75\x73\x65\x72\x2d\x61\x67\x65\x6e\x74\x22\x62\x61\x64\x2d\x63\x6c\x69\x65\x6e\x74\x20\x67\x72\x70\x63\x2d\x63\x2f\x30\x2e\x31\x32\x2e\x30\x50\x52\x49\x20\x2a\x20\x48\x54\x09\x04\x00\x00\x54\x00\x01\x50\x2f\x32\x2e\x30\x0d\x0a\x0d\x0a\x53\x4d\x0d\x2e\x30\x20\x28\x6c\x69\x6e\x75\x78\x29\x00\x10\x0a\x75\x73\x65\x72\x2d\x61\x67\x65\x6e\x74\x22\x62\x61\x64\x2d\x63\x6c\x69\x65\x6e\x74\x20\x67\x72\x70\x63\x00\xf1\x1e\x03\x00\x00\x00\x00\x00\x01\x2f\x30\x2e\x31\x32\x2e\x30\x00\x00\x00\x2e\x30\x20\x0a\x0d\x0a\x00\x03\x00\x04\x00\x00\x00\x00\x00\x00\x00\x08\x01\x04\x00\x00\x00\xff\x80\x00\x28\x6c\x69\x6e\x75\x78\x00\x01\x29\xff\x80\x2d\x63\x2f\x30\x2e\x31\x32\x2e\x30\x2e\x30\x20\x28\x6c\x6e\x00\x00\x69\x6e\x75\x78\x29\x00\x00\x03\x00\x00\x00\x00\x00\x01\x00\x00\x00"
}

@ -1,3 +0,0 @@
network_input {
single_read_bytes: "\x50\x52\x49\x20\x2a\x20\x48\x54\x54\x50\x2f\x32\x2e\x30\x0d\x0a\x0d\x0a\x53\x4d\x0d\x0a\x0d\x0a\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x28\x00\x08\x02\x00\x00\x00\x00\x00\x04\x01\x00\x01\xff"
}

@ -1,3 +0,0 @@
network_input {
single_read_bytes: "\x50\x52\x49\x20\x2a\x20\x48\x54\x54\x50\x2f\x32\x2e\x30\x0d\x0a\x0d\x0a\x53\x4d\x0d\x0a\x0d\x0a\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\xc2\x01\x04\x00\x00\x00\x01\x10\x05\x75\x70\x61\x74\x68\x08\x2f\x66\x6f\x6f\x2f\x62\x61\x7a\x3a\x10\x07\x73\x63\x68"
}

@ -1,3 +0,0 @@
network_input {
single_read_bytes: "\x50\x52\x49\x20\x2a\x20\x48\x54\x54\x50\x2f\x32\x2e\x30\x0d\x0a\x0d\x0a\x53\x4d\x0d\x0a\x0d\x0a\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\xd0\x01\x04\x00\x00\x00\x01\x10\x05\x3a\x70\x61\x74\x68\x0f\x2f\x72\x65\x67\x69\x73\x74\x65\x72\x65\x64\x2f\x62\x61\x72\x10\x07\x3a\x73\x63\x68\x65\x6d\x65\x04\x68\x74\x74\x70\x10\x07\x3a\x6d\x65\x74\x68\x6f\x64\x04\x50\x4f\x53\x54\x10\x0a\x3a\x61\x75\x74\x68\x6f\x72\x69\x74\x79\x09\x6c\x6f\x63\x61\x6c\x68\x6f\x73\x74\x10\x0c\x63\x6f\x6e\x74\x65\x6e\x74\x2d\x74\x79\x70\x65\x10\x61\x70\x70\x6c\x69\x63\x61\x74\x69\x6f\x6e\x2f\x67\x72\x70\x63\x10\x14\x67\x72\x70\x63\x2d\x61\x63\x63\x65\x70\x74\x2d\x65\x6e\x63\x6f\x64\x69\x6e\x67\x15\x69\x64\x65\x6e\x74\x69\x74\x79\x2c\x00\x00\x00\x00\x61\x74\x65\x2c\x67\x7a\x69\x70\x10\x02\x74\x65\x08\x74\x72\x61\x69\x6c\x65\x72\x73\x10\x0a\x75\x73\x65\x72\x2d\x61\x67\x65\x6e\x74\x22\x62\x61\x64\x2d\x63\x6c\x69\x65\x6e\x74\x20\x67\x72\x70\x63\x2d\x63\x2f\x30\x2e\x31\x32\x2e\x30\x2e\x30\x20\x28\x6c\x69\x6e\x75\x78\x29\x00\x00\x00\x00\x00\x00\x00\x00\x01"
}

@ -1,3 +0,0 @@
network_input {
single_read_bytes: "\x50\x52\x49\x20\x2a\x20\x48\x54\x54\x50\x2f\x32\x2e\x30\x0d\x0a\x0d\x0a\x53\x4d\x0d\x0a\x0d\x0a\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\xf4\x01\x04\x00\x00\x00\x01\x10\x05\x3a\x70\x61\x74\x68\x08\x2f\x66\x6f\x6f\x2f\x62\x61\x72\x10\x07\x3a\x73\x63\x68\x65\x6d\x65\x04\x68\x74\x74\x70\x10\x07\x3a\x6d\x65\x74\x68\x6f\x64\x04\x50\x4f\x53\x54\x10\x04\x68\x6f\x73\x74\x09\x6c\x6f\x63\x61\x6c\x68\x6f\x73\x74\x10\x0c\x63\x6f\x6e\x74\x65\x6e\x74\x2d\x74\x79\x70\x65\x1e\x61\x70\x70\x6c\x69\x63\x61\x74\x69\x6f\x6e\x2f\x67\x72\x70\x63\x2b\x74\x68\x69\x73\x2d\x69\x73\x2d\x76\x61\x6c\x69\x64\x10\x14\x67\x72\x70\x63\x2d\x61\x63\x63\x65\x70\x74\x2d\x65\x6e\x63\x6f\x64\x69\x6e\x67\x15\x69\x64\x65\x6e\x74\x69\x74\x79\x2c\x64\x65\x66\x6c\x61\x74\x65\x2c\x67\x7a\x69\x70\x10\x02\x74\x65\x08\x74\x72\x61\x69\x6c\x65\x72\x73\x10\x0a\x75\x73\x65\x72\x2d\x61\x67\x65\x6e\x74\x22\x62\x61\x64\x2d\x63\x6c\x69\x65\x6e\x74\x20\x67\x72\x70\x63\x2d\x63\x2f\x30\x2e\x31\x32\x2e\x30\x2e\x30\x20\x28\x6c\x69\x6e\x75\x78\x29\x10\x0c\x67\x72\x70\x63\x2d\x74\x69\x6d\x65\x6f\x75\x74\x03\x31\x30\x53\x10\x0c\x67\x72\x70\x63\x2d\x74\x69\x6d\x65\x6f\x75\x74\x02\x32\x53"
}

@ -1,3 +0,0 @@
network_input {
single_read_bytes: "\x50\x52\x49\x20\x2a\x20\x48\x54\x54\x50\x2f\x32\x2e\x30\x0d\x0a\x0d\x0a\x53\x4d\x0d\x0a\x0d\x0a\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x08\x01\x04\x00\x00\x00\x01\x04\x00\x00\x02\x03\x00\x00\x9d\x00\x00\x00\x00\x01\x00\x00\x00\x01\x04\x00\x00\x00\x01"
}

@ -1,3 +0,0 @@
network_input {
single_read_bytes: "\x50\x52\x49\x20\x2a\x20\x48\x54\x54\x50\x2f\x32\x2e\x30\x0d\x0a\x0d\x0a\x53\x4d\x0d\x0a\x0d\x0a\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\xf4\x01\x04\x00\x00\x00\x01\x10\x05\x3a\x70\x61\x74\x68\x08\x2f\x66\x6f\x6f\x2f\x62\x61\x72\x10\x07\x3a\x73\x63\x68\x65\x6d\x65\x04\x68\x74\x74\x70\x10\x07\x3a\x6d\x65\x74\x68\x6f\x64\x04\x50\x4f\x53\x54\x10\x04\x68\x6f\x73\x74\x09\x6c\x6f\x63\x61\x6c\x68\x6f\x73\x74\x10\x0c\x63\x6f\x6e\x74\x65\x6e\x74\x2d\x74\x79\x70\x65\x1e\x61\x70\x70\x6c\x69\x63\x61\x74\x69\x6f\x6e\x2f\x67\x72\x70\x63\x2b\x74\x68\x69\x73\x2d\x69\x73\x2d\x76\x61\x6c\x69\x64\x10\x14\x67\x72\x70\x63\x2d\x61\x63\x63\x65\x70\x74\x6e\x2d\x65\x63\x6f\x64\x69\x6e\x67\x15\x69\x64\x65\x6e\x74\x69\x74\x79\x2c\x64\x65\x66\x6c\x61\x74\x65\x2c\x67\x7a\x69\x70\x10\x02\x74\x65\x08\x74\x72\x61\x69\x6c\x65\x72\x73\x10\x0a\x75\x73\x65\x72\x2d\x61\x67\x65\x6e\x74\x22\x62\x61\x64\x2d\x63\x6c\x69\x65\x6e\x74\x20\x67\x72\x70\x63\x2d\x63\x2f\x30\x2e\x31\x32\x2e\x30\x2e\x30\x20\x28\x6c\x69\x6e\x75\x78\x29\x10\x0c\x67\x72\x70\x63\x2d\x74\x69\x6d\x65\x6f\x75\x74\x03\x31\x30\x53\x10\x0c\x67\x72\x70\x63\x2d\x74\x69\x6d\x65\x6f\x75\x74\x02\x32\x53"
}

@ -1,3 +0,0 @@
network_input {
single_read_bytes: "\x50\x52\x49\x20\x2a\x20\x48\x54\x54\x50\x2f\x32\x2e\x30\x0d\x0a\x0d\x0a\x53\x4d\x0d\x0a\x0d\x0a\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00\x01\x04\x00\x00\x00\x01\x00\x02\x00\x07\x72\x65\x66\x72\x65\x73\x2a\x00\x00\x00\x01"
}

@ -1,3 +0,0 @@
network_input {
single_read_bytes: "\x50\x52\x49\x20\x2a\x20\x48\x54\x54\x50\x2f\x32\x2e\x30\x0d\x0a\x0d\x0a\x53\x4d\x0d\x0a\x0d\x0a\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x19\x01\x04\x00\x00\x00\x28\x10\x8c\x67\x72\x70\x63\xff\xff\xff\xff\x75\x65\x69\x74\x0a\x31\x35\x20\x73\x65\x63\x6f"
}

@ -1,3 +0,0 @@
network_input {
single_read_bytes: "\x50\x52\x49\x20\x2a\x20\x48\x54\x54\x50\x2f\x32\x2e\x30\x0d\x0a\x0d\x0a\x53\x4d\x0d\x0a\x0d\x0a\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\xc2\x01\x04\x00\x00\x00\x6e\x10\x05\x75\x70\x61\x74\x68\x08\x2f\x66\x6f\x6f\x2f\x62\x61\x72\x3a\x10\x07\x73\x63\x68"
}

@ -1,3 +0,0 @@
network_input {
single_read_bytes: "\x50\x52\x49\x20\x2a\x20\x48\x54\x54\x58"
}

@ -1,3 +0,0 @@
network_input {
single_read_bytes: "\x50\x52\x49\x20\x2a\x20\x48\x54\x54\x50\x2f\x32\x2e\x30\x0d\x0a\x0d\x0a\x53\x4d\x0d\x0a\x0d\x0a\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\xf5\x01\x04\x00\x00\x00\x01\x10\x05\x3a\x70\x61\x74\x68\x08\x2f\x66\x6f\x6f\x2f\x62\x61\x72\x10\x07\x3a\x73\x63\x68\x65\x6d\x65\x04\x68\x74\x74\x70\x10\x07\x3a\x6d\x65\x74\x68\x6f\x64\x04\x50\x4f\x53\x54\x10\x0a\x3a\x61\x75\x74\x68\x6f\x72\x69\x74\x79\x09\x6c\x6f\x63\x61\x6c\x68\x6f\x73\x74\x00\x0d\x67\x72\x70\x63\x2d\x65\x6e\x63\x6f\x64\x69\x6e\x67\x07\x64\x65\x66\x6c\x61\x74\x65\x10\x0c\x63\x6f\x6e\x74\x65\x6e\x74\x2d\x74\x79\x70\x65\x10\x61\x70\x70\x6c\x69\x63\x61\x74\x69\x6f\x6e\x2f\x67\x72\x70\x63\x10\x14\x67\x72\x70\x63\x2d\x61\x63\x63\x65\x70\x74\x2d\x65\x6e\x63\x6f\x64\x69\x6e\x67\x15\x69\x64\x65\x6e\x74\x69\x74\x79\x2c\x64\x65\x05\x68\x74\x74\x70\x73\x67\x7a\x69\x70\x10\x0d\x67\x72\x72\x63\x2d\x65\x6e\x63\x6f\x64\x69\x6e\x67\x1c\x79\x6f\x75\x2d\x64\x6f\x6e\x74\x2d\x6b\x6e\x6f\x77\x2d\x68\x6f\x77\x2d\x74\x6f\x2d\x64\x6f\x2d\x74\x68\x69\x73\x10\x02\x74\x65\x08\x74\x72\x61\x69\x6c\x65\x72\x73\x10\x0a\x75\x73\x65\x72\x2d\x61\x67\x65\x6e\x74\x22\x62\x61\x64\x2d\x63\x6c\x69\x65\x6e\x74\x20\x67\x72\x70\x63\x2d\x63\x2f\x34\x2e\x31\x32\x2e\x30\x2e\x30\x20\x28\x6c\x69\x6e\x75\x78\x29"
}

@ -1,3 +0,0 @@
network_input {
single_read_bytes: "\x50\x52\x49\x20\x2a\x20\x48\x54\x54\x50\x2f\x32\x2e\x30\x0d\x0a\x0d\x0a\x53\x4d\x0d\x0a\x0d\x0a\x00\x00\x06\x04\x00\x00\x00\x00\x00\x00\x01\x00\x00\x04\x00"
}

@ -1,3 +0,0 @@
network_input {
single_read_bytes: "\x50\x52\x49\x20\x2a\x20\x48\x54\x54\x50\x2f\x32\x2e\x30\x0d\x0a\x0d\x0a\x53\x4d\x0d\x0a\x0d\x0a\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x05\x01\x24\x00\x00\x00\x01\x00\x00\x00\x00"
}

@ -1,3 +0,0 @@
network_input {
single_read_bytes: "\x50\x52\x49\x20\x2a\x20\x48\x54\x54\x50\x2f\x32\x2e\x30\x0d\x0a\x0d\x0a\x53\x4d\x0d\x0a\x0d\x0a\x00\x00\x04\x08\x00\x00\x00\x00\x00\x00"
}

@ -1,3 +0,0 @@
network_input {
single_read_bytes: "\x50\x52\x49\x20\x2a\x20\x48\x54\x54\x50\x2f\x32\x2e\x30\x0d\x0a\x0d\x0a\x53\x4d\x0d\x0a\x0d\x0a\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x02\x00\x01\x04\x00\x00\x00\x01\x10\x05\x3a\x70\x61\x74\x68\x08\x2f\x66\x6f\x6f\x2f\x62\x61\x72\x10\x07\x3a\x73\x63\x68\x65\x6d\x65\x04\x68\x74\x74\x70\x10\x07\x3a\x6d\x65\x74\x68\x6f\x64\x04\x50\x4f\x53\x54\x10\x0a\x3a\x61\x75\x74\x68\x6f\x72\x69\x74\x79\x09\x6c\x6f\x63\x61\x6c\x68\x6f\x73\x74\x10\x0c\x63\x6f\x6e\x74\x65\x6e\x74\x2d\x74\x79\x70\x65\x10\x61\x70\x70\x6c\x69\x63\x61\x74\x69\x6f\x6e\x2f\x67\x72\x70\x63\x10\x14\x67\x72\x70\x63\x2d\x61\x63\x63\x65\x70\x74\x2d\x65\x6e\x63\x6f\x64\x69\x6e\x67\x15\x64\x65\x66\x6c\x61\x74\x65\x2c\x69\x64\x65\x6e\x74\x69\x74\x79\x2c\x67\x7a\x69\x70\x10\x02\x74\x65\x08\x74\x72\x61\x69\x6c\x65\x72\x73\x10\x0a\x75\x73\x65\x72\x2d\x61\x67\x65\x6e\x74\x50\x52\x49\x20\x2a\x20\x48\x54\x54\x50\x2f\x32\x2e\x30\x0d\x0a\x0d\x0a\x53\x4d\x0d\x0a\x0d\x0a\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\xf4\x01\x00\x04\x00\x01\x00\x10\x05\x3a\x70\x61\x74\x68\x08\x22\x62\x61\x64\x2d\x63\x6c\x69\x65\x6e\x74\x20\x67\x72\x70\x63\x2d\x63\x2f\x30\x2e\x31\x32\x2e\x30\x2e\x30\x20\x28\x6c\x69\x6e\x75\x78\x29\x00\x3f\xfc\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0b\x67\x72\x70\x63\x2d\x73\x74\x61\x74\x75\x73\x01\x31\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0d\x67\x72\x70\x63\x2d\x65\x6e\x63\x6f\x64\x69\x6e\x67\x08\x69\x64\x65\x6e\x74\x69\x74\x79\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x2f\x66\x6f\x6f\x2f\x62\x61\x72\x10\x07\x3a\x73\x63\x68\x65\x6d\x65\x04\x68\x74\x74\x70\x10\x07\x3a\x6d\x65\x74\x68\x6f\x64\x04\x50\x4f\x53\x54\x10\x04\x68\x6f\x73\x74\x09\x6c\x6f\x63\x61\x6c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x68\x6f\x73\x74\x10\x0c\x63\x00\x6f\x6e\x00"
}

@ -1,3 +0,0 @@
network_input {
single_read_bytes: "\x50\x52\x49\x20\x2a\x20\x48\x54\x54\x50\x2f\x32\x2e\x30\x0d\x0a\x0d\x0a\x53\x4d\x0d\x0a\x0d\x0a\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x08\x01\x04\x00\x00\x00\x01\x00\x00\x00\x02\x03\x00\x00\x9d\x00\x00\x00\x00\x01\x00\x00\x01\x04\x00\x00\x00\x01"
}

@ -1,3 +0,0 @@
network_input {
single_read_bytes: "\x50\x52\x49\x20\x2a\x20\x48\x54\x54\x50\x2f\x32\x2e\x30\x0d\x0a\x0d\x0a\x53\x4d\x0d\x0a\x0d\x0a\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\xc9\x01\x04\x00\x00\x00\x01\x10\x05\x3a\x70\x61\x74\x68\x08\x2f\x66\x6f\x6f\x2f\x62\x61\x72\x10\x07\x3a\x73\x63\x68\x65\x6d\x65\x04\x68\x74\x74\x70\x10\x07\x3a\x6d\x65\x74\x68\x6f\x64\x04\x50\x4f\x53\x54\x10\x0a\x3a\x61\x75\x74\x68\x6f\x72\x69\x74\x79\x09\x6c\x6f\x63\x61\x6c\x68\x6f\x73\x74\x10\x0c\x63\x6f\x6e\x74\x65\x6e\x74\x2d\x74\x79\x70\x65\x10\x61\x70\x70\x6c\x69\x63\x61\x74\x69\x6f\x6e\x2f\x67\x72\x70\x63\x10\x14\x67\x72\x70\x63\x2d\x61\x63\x63\x65\x70\x74\x2d\x65\x6e\x63\x6f\x64\x69\x6e\x67\x15\x64\x65\x66\x6c\x61\x74\x65\x2c\x69\x64\x65\x6e\x74\x69\x74\x79\x2c\x67\x7a\x69\x70\x10\x02\x74\x65\x08\x74\x72\x61\x69\x6c\x65\x72\x73\x10\x0a\x75\x73\x65\x72\x2d\x61\x67\x65\x6e\x74\x22\x62\x61\x64\x2d\x63\x6c\x69\x65\x6e\x74\x20\x67\x72\x70\x63\x2d\x63\x2f\x30\x2e\x31\x32\x2e\x30\x2e\x30\x20\x28\x6c\x69\x6e\x75\x78\x29\x00\x00\x04\x07\x00\x00\x00\x00\x00"
}

@ -1,3 +0,0 @@
network_input {
single_read_bytes: "\x50\x52\x49\x20\x2a\x20\x48\x54\x54\x50\x2f\x32\x2e\x30\x0d\x0a\x0d\x0a\x53\x4d\x0d\x0a\x0d\x0a\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x19\x01\x04\x00\x00\x00\x01\x10\x0c\x67\x72\x70\x63\x2d\x74\x69\x6d\x65\x6f\x75\x74\x8a\x16\x31\x35\x20\x73\x65\x63\x6f\x6e\x64\x73\x00\x00\x19\x01\x04\x00\x00\x00\x03\x10\x0c\x67\x72\x70\x63\x2d\x74\x69\x6d\x65\x6f\x75\x74\x0a\x31\x35\x20\x73\x65\x63\x6f\x6e\x64\x73"
}

@ -1,3 +0,0 @@
network_input {
single_read_bytes: "\x50\x52\x49\x20\x2a\x20\x48\x54\x54\x50\x2f\x32\x2e\x30\x0d\x0a\x0d\x0a\x53\x4d\x0d\x0a\x0d\x0a\x00\x00\x06\x04\x00\x00\x00\x00\x00\x00\x06\xff\xff\xff\xff"
}

@ -1,3 +0,0 @@
network_input {
single_read_bytes: "\x50\x52\x49\x20\x2a\x20\x58"
}

@ -1,3 +0,0 @@
network_input {
single_read_bytes: "\x50\x52\x49\x20\x2a\x20\x48\x54\x54\x50\x2f\x32\x2e\x30\x0d\x0a\x0d\x0a\x53\x4d\x0d\x0a\x0d\x0a\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x06\x01\x04\x00\x00\x00\x01\xff\x80\x80\x80\x80\x00"
}

@ -1,3 +0,0 @@
network_input {
single_read_bytes: "\x50\x52\x49\x20\x2a\x20\x48\x54\x54\x50\x2f\x32\x2e\x30\x0d\x0a\x0d\x0a\x53\x4d\x0d\x0a\x0d\x0a\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\xd0\x01\x04\x00\x00\x00\x01\x10\x05\x3a\x70\x61\x74\x68\x0f\x2f\x72\x65\x67\x69\x73\x74\x65\x72\x65\x64\x2f\x62\x61\x72\x10\x07\x3a\x73\x63\x68\x65\x6d\x65\x04\x68\x74\x74\x70\x10\x07\x3a\x6d\x65\x74\x68\x6f\x64\x04\x50\x4f\x53\x54\x10\x0a\x3a\x61\x75\x74\x68\x6f\x72\x69\x74\x79\x09\x6c\x6f\x63\x61\x6c\x68\x6f\x73\x74\x10\x0c\x63\x6f\x6e\x74\x65\x6e\x74\x2d\x74\x79\x70\x65\x10\x61\x70\x70\x6c\x69\x63\x61\x74\x69\x6f\x6e\x2f\x67\x72\x70\x63\x10\x14\x67\x72\x70\x63\x2d\x61\x63\x63\x65\x60\x74\x2d\x65\x6e\x63\x6f\x64\x69\x6e\x67\x15\x69\x64\x65\x6c\x74\x69\x74\x79\x2c\x64\x65\x66\x6c\x61\x74\x65\x2c\x67\x7a\x69\x70\x10\x02\x74\x65\x08\x74\x72\x61\x69\x6c\x65\x72\x73\x10\x0a\x75\x73\x65\x72\x2d\x61\x67\x65\x6e\x74\x22\x62\x61\x64\x2d\x63\x6c\x69\x65\x6e\x74\x20\x67\x72\x70\x63\x2d\x63\x2f\x30\x2e\x31\x32\x2e\x30\x2e\x30\x20\x28\x6c\x69\x6e\x75\x78\x29\x00\x00\x03\x00\x00\x00\x00\x00\x01\x00\x00\x00"
}

@ -1,3 +0,0 @@
network_input {
single_read_bytes: "\x50\x52\x49\x20\x2a\x20\x48\x54\x54\x50\x2f\x32\x2e\x30\x0d\x0a\x0d\x0a\x53\x4d\x0d\x0a\x0d\x0a\x00\x00\x00\x04\x00"
}

@ -1,3 +0,0 @@
network_input {
single_read_bytes: "\x50\x52\x49\x20\x2a\x20\x48\x54\x54\x50\x2f\x32\x2e\x30\x0d\x0a\x0d\x0a\x53\x4d\x0d\x0a\x0d\x0a\x00\x03\x00\x04\x00\x00\x00\x00\x00\x00\x00\x08\x01\x04\x00\x00\x00\x01\xff\x80\x00\x00"
}

@ -1,3 +0,0 @@
network_input {
single_read_bytes: "\x50\x52\x49\x20\x2a\x20\x48\x54\x54\x50\x2f\x32\x2e\x30\x0d\x0a\x0d\x0a\x53\x4d\x0d\x0a\x0d\x0a\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00"
}

@ -1,3 +0,0 @@
network_input {
single_read_bytes: "\x50\x52\x49\x20\x2a\x20\x48\x54\x54\x50\x2f\x32\x2e\x30\x0d\x0a\x0d\x0a\x53\x4d\x0d\x0a\x0d\x0a\x00\x00\x04\x04\x00\x00\x00\x00\x00"
}

@ -1,3 +0,0 @@
network_input {
single_read_bytes: "\x50\x52\x49\x20\x2a\x20\x48\x54\x54\x50\x2f\x32\x2e\x30\x0d\x0a\x0d\x0a\x53\x4d\x0d\x0a\x0d\x0a\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\xc2\x01\x04\x00\x00\x00\x01\x10\x05\x3a\x70\x61\x74\x68\x08\x2f\x66\x6f\x6f\x2f\x62\x61\x72\x10\x07\x3a\x73\x63\x68\x65\x6d\x65\x04\x68\x74\x74\x70\x10\x07\x3a\x6d\x65\x74\x68\x6f\x64\x04\x50\x4f\x53\x54\x10\x0a\x3a\x61\x75\x74\x68\x6f\x72\x69\x74\x79\x09\x6c\x6f\x63\x61\x6c\x68\x6f\x73\x74\x10\x0c\x63\x6f\x6e\x74\x65\x6e\x74\x2d\xf4\x79\x70\x65\x09\x74\x65\x78\x74\x2f\x68\x74\x6d\x6c\x10\x14\x67\x72\x70\x63\x2d\x61\x63\x63\x65\x70\x74\x2d\x65\x6e\x63\x6f\x64\x69\x6e\x67\x15\x69\x64\x65\x6e\x74\x69\x74\x79\x2c\x64\x65\x66\x6c\x61\x74\x65\x2c\x67\x7a\x69\x70\x10\x02\x74\x65\x08\x74\x72\x61\x69\x6c\x65\x72\x73\x10\x0a\x75\x73\x65\x72\x2d\x61\x67\x65\x6e\x74\x22\x62\x61\x64\x2d\x63\x6c\x69\x65\x6e\x74\x50\x52\x49\x20\x2a\x20\x48\x54\x54\x50\x2f\x32\x2e\x30\x0d\x0a\x0d\x0a\x53\x4d\x0d\x0a\x0d\x0a\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x02\x00\x01\x04\x00\xe6\x00\x01\x10\x05\x3a\x70\x61\x74\x68\x08\x2f\x66\x6f\x6f\x2f\x62\x61\x72\x10\x07\x3a\x73\x63\x68\x65\x6d\x65\x04\x68\x74\x74\x70\x10\x07\x3a\x6d\x50\x52\x49\x20\x2a\x20\x48\x54\x54\x50\x2f\x32\x2e\x30\x0d\x0a\x0d\x0a\x53\x4d\x0d\x0a\x0d\x0a\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x02\x03\x01\x04\x00\x00\x00\x01\x3f\x50\x52\x49\x20\x65\x74\x68\x6f\x64\x04\x50\x4f\x53\x54\x10\x0a\x3a\x61\x75\x74\x68\x6f\x72\x69\x74\x79\x09\x6c\x6f\x63\x61\x6c\x68\x6f\x73\x74\x10\x0c\x63\x6f\x6e\x74\x65\x6e\x74\x2d\x74\x79\x70\x65\x10\x61\x70\x70\x6c\x69\x63\x61\x74\x69\x6f\x6e\x2f\x67\x72\x70\x63\x10\x14\x67\x72\x70\x63\x2d\x61\x63\x63\x65\x70\x74\x2d\x65\x6e\x63\x6f\x64\x69\x6e\x67\x15\x64\x65\x66\x6c\x61\x74\x65\x2c\x69\x64\x65\x6e\x74\x69\x74\x79\x2c\x67\x7a\x69\x70\x10\x02\x74\x65\x08\x74\x72\x61\x69\x6c\x65\x72\x73\x10\x0a\x75\x73\x65\x72\x2d\x61\x67\x65\x6e\x74\x50\x52\x49\x20\x2a\x20\x48\x54\x54\x50\x2f\x31\x2e\x30\x0d\x0a\x0d\x0a\x53\x4d\x0d\x0a\x0d\x0a\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\xf4\x01\x04\x00\x00\x00\x01\x10\x05\x3a\x70\x61\x74\x68\x08\x22\x62\x61\x64\x2d\x63\x6c\x69\x65\x6e\x74\x20\x67\x72\x70\x63\x2d\x63\x2f\x30\x2e\x31\x32\x2e\x30\x2e\x30\x20\x28\x6c\x69\x6e\x75\x78\x29\x00\x3f\xfc\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0b\x67\x72\x70\x63\x2d\x73\x74\x61\x74\x75\x73\x01\x30\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0b\x67\x72\x70\x63\x2d\x73\x74\x61\x74\x75\x73\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x2f\x66\x6f\x6f\x2f\x62\x61\x72\x10\x07\x3a\x73\x63\x68\x65\x6d\x65\x04\x68\x74\x74\x70\x10\x07\x3a\x6d\x65\x74\x68\x6f\x64\x04\x50\x4f\x53\x54\x10\x04\x68\x6f\x73\x74\x09\x6c\x6f\x63\x61\x6c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x2a\x20\x50\x52\x49\x20\x2a\x20\x48\x54\x54\x50\x2f\x32\x2e\x30\x0d\x0a\x0d\x0a\x53\x4d\x0d\x0a\x0d\x0a\x00\x00\x00\x04\x00\x00\x00\x48\x54\x54\x50\x2f\x32\x2e\x30\x0d\x0a\x0d\x0a\x53\x4d\x0d\x0a\x0d\x0a\x00\x03\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x50\x52\x49\x20\x2a\x20\x48\x54\x54\x50\x2f\x33\x2e\x30\x0d\x0a\x0d\x0a\x2a\x53\x4d\x0d\x0a\x0d\x0a\x00\x00\x00\x04\x00\x00\x00\x00\x00\x06\x01\x04\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x01\x04\x00\x00\x00\x01\x10\x05\x3a\x70\x61\x74\x68\x08\x2f\x66\x6f\x6f\x2f\x62\x61\x72\x10\x07\x3a\x73\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x63\x68\x65\x6d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x68\x6f\x73\x74\x10\x0c\x65\x04\x68\x74\x74\x70\x10\x07\x3a\x6d\x65\x74\x68\x6f\x64\x63\x00\x6f\x6e\x00\x04\x50\x4f\x53\x20\x67\x72\x70\x63\x2d\x63\x2f\x30\x2e\x31\x32\x2e\x30\x2e\x30\x20\x28\x6c\x69\x6e\x75\x78\x29\x54\x10\x0a\x3a\x61\x75\x74\x68\x6f\x72"
}

@ -1,3 +0,0 @@
network_input {
single_read_bytes: "\x50\x52\x49\x20\x2a\x20\x48\x54\x54\x50\x2f\x32\x2e\x30\x0d\x0a\x0d\x0a\x53\x4d\x0d\x0a\x0d\x0a\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x19\x01\x04\x00\x00\x00\x01\x10\x0c\x67\x72\x70\x63\x2d\x74\x69\x6d\x65\x6f\x75\x74\x0a\x31\x4d\x30\x6f\x73\x65\x64\x20\x63\x73\x00\x00\x19\x01\x04\x00\x00\x00\x03\x10\x0c\x67\x72\x70\x63\x2d\x74\x69\x6d\x65\x6f\x75\x74\x0a\x34\x20\x73\x65\x63\x6f\x6e\x64\x73"
}

@ -1,3 +0,0 @@
network_input {
single_read_bytes: "\x50\x52\x49\x20\x2a\x20\x48\x54\x54\x50\x2f\x32\x2e\x30\x0d\x0a\x0d\x0a\x53\x4d\x0d\x0a\x0d\x0a\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x19\x01\x04\x00\x00\x00\x01\x63\x10\x8c\x72\x70\x67\x2d\x74\x6f\x6d\x75\x65\x69\x74\x0a\x31\x35\x20\x3b\x65\x63\x6f"
}

@ -1,3 +0,0 @@
network_input {
single_read_bytes: "\x50\x52\x49\x20\x2a\x20\x48\x54\x54\x50\x2f\x32\x2e\x30\x0d\x0a\x0d\x0a\x53\x4d\x0d\x0a\x0d\x0a\x00\x00\x08\x06\x00\x00\x00\x50\x52"
}

@ -1,3 +0,0 @@
network_input {
single_read_bytes: "\x50\x52\x49\x20\x2a\x20\x48\x54\x54\x50\x2f\x32\x2e\x30\x0d\x0a\x0d\x0a\x53\x4d\x0d\x0a\x0d\x0a\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\xc9\x01\x04\x00\x00\x00\x01\x10\x05\x3a\x70\x61\x74\x68\x08\x2f\x66\x6f\x6f\x2f\x62\x61\x72\x10\x07\x3a\x73\x63\x68\x65\x6d\x65\x04\x68\x74\x74\x70\x10\x07\x3a\x6d\x65\x74\x68\x6f\x64\x04\x50\x4f\x53\x54\x10\x0a\x3a\x61\x75\x74\x68\x6f\x72\x69\x74\x79\x09\x6c\x6f\x63\x61\x6c\x68\x6f\x73\x74\x10\x0c\x63\x6f\x6e\x74\x65\x6e\x74\x2d\x74\x79\x70\x65\x10\x61\x70\x70\x6c\x69\x63\x61\x74\x69\x6f\x6e\x2f\x67\x72\x70\x63\x10\x14\x67\x72\x70\x63\x2d\x61\x63\x63\x65\x70\x74\x2d\x65\x6e\x63\x6f\x64\x69\x6e\x67\x15\x64\x65\x66\x6c\x61\x74\x65\x2c\x69\x64\x65\x6e\x74\x69\x74\x79\x2c\x67\x7a\x69\x70\x10\x02\x74\x65\x08\x74\x72\x61\x69\x6c\x65\x72\x73\x10\x0a\x75\x73\x65\x72\x2d\x61\x67\x65\x6e\x74\x22\x62\x61\x64\x2d\x63\x6c\x69\x65\x6e\x74\x20\x67\x72\x70\x63\x2d\x63\x2f\x30\x2e\x31\x32\x2e\x30\x2e\x30\x20\x28\x6c\x69\x6e\x75\x78\x29\x00\x00\x01\x03\x00\x00\x00\x00\x01"
}

@ -1,3 +0,0 @@
network_input {
single_read_bytes: "\x50\x52\x49\x20\x2a\x20\x48\x54\x54\x50\x2f\x32\x2e\x30\x0d\x0a\x0d\x0a\x53\x4d\x0d\x0a\x0d\x0a\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x0a\x01\x04\x00\x00\x00\x03\x00\x00\x02\x00\x00\x03\x00\x00\x00\x00\x00\x00\x09\x04\x00\x00\x00\x01"
}

@ -1,3 +0,0 @@
network_input {
single_read_bytes: "\x50\x52\x49\x20\x2a\x20\x48\x54\x54\x50\x2f\x32\x2e\x30\x0d\x0a\x0d\x0a\x53\x4d\x0d\x0a\x0d\x0a\x00\x00\x00\x04\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x04\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x03\x00\x00\x00\x09\x04\x00\x00\x00\x01"
}

@ -1,3 +0,0 @@
network_input {
single_read_bytes: "\x50\x52\x49\x20\x2a\x20\x48\x54\x54\x50\x2f\x32\x2e\x30\x0d\x0a\x0d\x0a\x53\x4d\x0d\x0a\x0d\x0a\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x05\x01\x24\x00\x00\x00\x01\x00\x00\x00\x00\x00"
}

@ -1,3 +0,0 @@
network_input {
single_read_bytes: "\x50\x52\x49\x20\x2a\x20\x48\x54\x54\x50\x2f\x32\x2e\x30\x0d\x0a\x0d\x0a\x53\x4d\x0d\x0a\x0d\x0a\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x05\x01\x24\x00\x00\x00\x01\x00\x00\x00"
}

@ -1,3 +0,0 @@
network_input {
single_read_bytes: "\x58"
}

@ -1,3 +0,0 @@
network_input {
single_read_bytes: "\x50\x52\x49\x20\x2a\x20\x48\x54\x54\x50\x2f\x32\x2e\x30\x0d\x0a\x0d\x0a\x53\x4d\x0d\x0a\x0d\x0a\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x02\x01\x24\x00\x00\x00\x01\x00\x00"
}

@ -1,3 +0,0 @@
network_input {
single_read_bytes: "\x50\x52\x49\x20\x2a\x20\x48\x54\x54\x50\x2f\x32\x2e\x30\x0d\x0a\x0d\x0a\x53\x4d\x0d\x0a\x0d\x0a\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x01\x19\x07\x04\x00\x00\x00\x01\x10\x0c\x67\x72\x70\x63\x2d\x74\x69\x6d\x65\x6f\x75\x74\x0a\x31\x4d\x30\x6f\x73\x65\x64\x20\x63\x73\x00\x00\x19\x01\x04\x00\x00\x00\x03\x10\x0c\x67\x72\x70\x63\x2d\x74\x69\x6d\x65\x6f\x75\x74\x0a\x34\x20\x73\x65\x63\x6f\x6e\x64\x73"
}

@ -1,3 +0,0 @@
network_input {
single_read_bytes: "\x50\x52\x49\x20\x2a\x20\x48\x54\x54\x50\x2f\x32\x2e\x30\x0d\x0a\x0d\x0a\x53\x4d\x0d\x0a\x0d\x0a\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\xf4\x01\x04\x00\x00\x00\x01\x10\x05\x3a\x70\x61\x74\x68\x08\x2f\x66\x6f\x6f\x2f\x62\x61\x72\x10\x07\x3a\x73\x63\x68\x65\x6d\x65\x04\x68\x74\x74\x70\x10\x07\x3a\x6d\x65\x74\x68\x6f\x64\x04\x50\x4f\x53\x54\x10\x04\x68\x6f\x73\x74\x09\x6c\x6f\x63\x61\x6c\x68\x6f\x73\x74\x10\x0c\x67\x72\x70\x63\x2d\x6d\x65\x73\x73\x61\x67\x65\x1e\x61\x70\x70\x6c\x69\x63\x61\x74\x69\x6f\x6e\x2f\x67\x72\x70\x63\x2b\x74\x68\x69\x73\x2d\x69\x73\x2d\x76\x61\x6c\x69\x64\x10\x14\x67\x72\x70\x63\x2d\x61\x63\x63\x65\x70\x74\x2d\x65\x6e\x63\x6f\x64\x69\x6e\x67\x15\x69\x64\x65\x6e\x74\x69\x74\x79\x2c\x64\x65\x66\x6c\x61\x74\x65\x2c\x67\x7a\x69\x70\x10\x02\x74\x65\x08\x74\x72\x61\x69\x6c\x65\x72\x73\x10\x0a\x75\x73\x65\x72\x2d\x61\x67\x65\x6e\x74\x22\x62\x61\x64\x2d\x63\x6c\x69\x65\x6e\x74\x20\x67\x72\x70\x63\x2d\x63\x2f\x30\x2e\x31\x32\x00\x05\x72\x61\x6e\x67\x65\x00\x6e\x75\x78\x29\x10\x0c\x67\x72\x70\x63\x2d\x74\x69\x6d\x65\x6f\x75\x74\x03\x31\x30\x53\x10\x0c\x67\x72\x70\x63\x2d\x74\x69\x6d\x65\x6f\x75\x74\x02\x32\x53"
}

@ -1,3 +0,0 @@
network_input {
single_read_bytes: "\x50\x52\x49\x20\x2a\x20\x48\x54\x54\x50\x2f\x32\x2e\x30\x0d\x0a\x0d\x0a\x53\x4d\x0d\x0a\x0d\x0a\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x08\x01\x50\x52\x49\x20\x2a\x20\x48\x54\x54\x50\x04\x00\x00"
}

Some files were not shown because too many files have changed in this diff Show More

Loading…
Cancel
Save