// <auto-generated>
//     Generated by the protocol buffer compiler.  DO NOT EDIT!
//     source: datasets/google_message1/proto3/benchmark_message1_proto3.proto
// </auto-generated>
#pragma warning disable 1591, 0612, 3021, 8981
#region Designer generated code

using pb = global::Google.Protobuf;
using pbc = global::Google.Protobuf.Collections;
using pbr = global::Google.Protobuf.Reflection;
using scg = global::System.Collections.Generic;
namespace Benchmarks.Proto3 {

  /// <summary>Holder for reflection information generated from datasets/google_message1/proto3/benchmark_message1_proto3.proto</summary>
  public static partial class BenchmarkMessage1Proto3Reflection {

    #region Descriptor
    /// <summary>File descriptor for datasets/google_message1/proto3/benchmark_message1_proto3.proto</summary>
    public static pbr::FileDescriptor Descriptor {
      get { return descriptor; }
    }
    private static pbr::FileDescriptor descriptor;

    static BenchmarkMessage1Proto3Reflection() {
      byte[] descriptorData = global::System.Convert.FromBase64String(
          string.Concat(
            "Cj9kYXRhc2V0cy9nb29nbGVfbWVzc2FnZTEvcHJvdG8zL2JlbmNobWFya19t",
            "ZXNzYWdlMV9wcm90bzMucHJvdG8SEWJlbmNobWFya3MucHJvdG8zIoMGCg5H",
            "b29nbGVNZXNzYWdlMRIOCgZmaWVsZDEYASABKAkSDgoGZmllbGQ5GAkgASgJ",
            "Eg8KB2ZpZWxkMTgYEiABKAkSDwoHZmllbGQ4MBhQIAEoCBIPCgdmaWVsZDgx",
            "GFEgASgIEg4KBmZpZWxkMhgCIAEoBRIOCgZmaWVsZDMYAyABKAUSEQoIZmll",
            "bGQyODAYmAIgASgFEg4KBmZpZWxkNhgGIAEoBRIPCgdmaWVsZDIyGBYgASgD",
            "Eg4KBmZpZWxkNBgEIAEoCRIOCgZmaWVsZDUYBSADKAYSDwoHZmllbGQ1ORg7",
            "IAEoCBIOCgZmaWVsZDcYByABKAkSDwoHZmllbGQxNhgQIAEoBRIRCghmaWVs",
            "ZDEzMBiCASABKAUSDwoHZmllbGQxMhgMIAEoCBIPCgdmaWVsZDE3GBEgASgI",
            "Eg8KB2ZpZWxkMTMYDSABKAgSDwoHZmllbGQxNBgOIAEoCBIQCghmaWVsZDEw",
            "NBhoIAEoBRIQCghmaWVsZDEwMBhkIAEoBRIQCghmaWVsZDEwMRhlIAEoBRIQ",
            "CghmaWVsZDEwMhhmIAEoCRIQCghmaWVsZDEwMxhnIAEoCRIPCgdmaWVsZDI5",
            "GB0gASgFEg8KB2ZpZWxkMzAYHiABKAgSDwoHZmllbGQ2MBg8IAEoBRIRCghm",
            "aWVsZDI3MRiPAiABKAUSEQoIZmllbGQyNzIYkAIgASgFEhEKCGZpZWxkMTUw",
            "GJYBIAEoBRIPCgdmaWVsZDIzGBcgASgFEg8KB2ZpZWxkMjQYGCABKAgSDwoH",
            "ZmllbGQyNRgZIAEoBRI8CgdmaWVsZDE1GA8gASgLMisuYmVuY2htYXJrcy5w",
            "cm90bzMuR29vZ2xlTWVzc2FnZTFTdWJNZXNzYWdlEg8KB2ZpZWxkNzgYTiAB",
            "KAgSDwoHZmllbGQ2NxhDIAEoBRIPCgdmaWVsZDY4GEQgASgFEhEKCGZpZWxk",
            "MTI4GIABIAEoBRIRCghmaWVsZDEyORiBASABKAkSEQoIZmllbGQxMzEYgwEg",
            "ASgFIvcCChhHb29nbGVNZXNzYWdlMVN1Yk1lc3NhZ2USDgoGZmllbGQxGAEg",
            "ASgFEg4KBmZpZWxkMhgCIAEoBRIOCgZmaWVsZDMYAyABKAUSDwoHZmllbGQx",
            "NRgPIAEoCRIPCgdmaWVsZDEyGAwgASgIEg8KB2ZpZWxkMTMYDSABKAMSDwoH",
            "ZmllbGQxNBgOIAEoAxIPCgdmaWVsZDE2GBAgASgFEg8KB2ZpZWxkMTkYEyAB",
            "KAUSDwoHZmllbGQyMBgUIAEoCBIPCgdmaWVsZDI4GBwgASgIEg8KB2ZpZWxk",
            "MjEYFSABKAYSDwoHZmllbGQyMhgWIAEoBRIPCgdmaWVsZDIzGBcgASgIEhEK",
            "CGZpZWxkMjA2GM4BIAEoCBIRCghmaWVsZDIwMxjLASABKAcSEQoIZmllbGQy",
            "MDQYzAEgASgFEhEKCGZpZWxkMjA1GM0BIAEoCRIRCghmaWVsZDIwNxjPASAB",
            "KAQSEQoIZmllbGQzMDAYrAIgASgEQiUKHmNvbS5nb29nbGUucHJvdG9idWYu",
            "YmVuY2htYXJrc0gB+AEBYgZwcm90bzM="));
      descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
          new pbr::FileDescriptor[] { },
          new pbr::GeneratedClrTypeInfo(null, null, new pbr::GeneratedClrTypeInfo[] {
            new pbr::GeneratedClrTypeInfo(typeof(global::Benchmarks.Proto3.GoogleMessage1), global::Benchmarks.Proto3.GoogleMessage1.Parser, new[]{ "Field1", "Field9", "Field18", "Field80", "Field81", "Field2", "Field3", "Field280", "Field6", "Field22", "Field4", "Field5", "Field59", "Field7", "Field16", "Field130", "Field12", "Field17", "Field13", "Field14", "Field104", "Field100", "Field101", "Field102", "Field103", "Field29", "Field30", "Field60", "Field271", "Field272", "Field150", "Field23", "Field24", "Field25", "Field15", "Field78", "Field67", "Field68", "Field128", "Field129", "Field131" }, null, null, null, null),
            new pbr::GeneratedClrTypeInfo(typeof(global::Benchmarks.Proto3.GoogleMessage1SubMessage), global::Benchmarks.Proto3.GoogleMessage1SubMessage.Parser, new[]{ "Field1", "Field2", "Field3", "Field15", "Field12", "Field13", "Field14", "Field16", "Field19", "Field20", "Field28", "Field21", "Field22", "Field23", "Field206", "Field203", "Field204", "Field205", "Field207", "Field300" }, null, null, null, null)
          }));
    }
    #endregion

  }
  #region Messages
  public sealed partial class GoogleMessage1 : pb::IMessage<GoogleMessage1>
  #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE
      , pb::IBufferMessage
  #endif
  {
    private static readonly pb::MessageParser<GoogleMessage1> _parser = new pb::MessageParser<GoogleMessage1>(() => new GoogleMessage1());
    private pb::UnknownFieldSet _unknownFields;
    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    public static pb::MessageParser<GoogleMessage1> Parser { get { return _parser; } }

    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    public static pbr::MessageDescriptor Descriptor {
      get { return global::Benchmarks.Proto3.BenchmarkMessage1Proto3Reflection.Descriptor.MessageTypes[0]; }
    }

    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    pbr::MessageDescriptor pb::IMessage.Descriptor {
      get { return Descriptor; }
    }

    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    public GoogleMessage1() {
      OnConstruction();
    }

    partial void OnConstruction();

    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    public GoogleMessage1(GoogleMessage1 other) : this() {
      field1_ = other.field1_;
      field9_ = other.field9_;
      field18_ = other.field18_;
      field80_ = other.field80_;
      field81_ = other.field81_;
      field2_ = other.field2_;
      field3_ = other.field3_;
      field280_ = other.field280_;
      field6_ = other.field6_;
      field22_ = other.field22_;
      field4_ = other.field4_;
      field5_ = other.field5_.Clone();
      field59_ = other.field59_;
      field7_ = other.field7_;
      field16_ = other.field16_;
      field130_ = other.field130_;
      field12_ = other.field12_;
      field17_ = other.field17_;
      field13_ = other.field13_;
      field14_ = other.field14_;
      field104_ = other.field104_;
      field100_ = other.field100_;
      field101_ = other.field101_;
      field102_ = other.field102_;
      field103_ = other.field103_;
      field29_ = other.field29_;
      field30_ = other.field30_;
      field60_ = other.field60_;
      field271_ = other.field271_;
      field272_ = other.field272_;
      field150_ = other.field150_;
      field23_ = other.field23_;
      field24_ = other.field24_;
      field25_ = other.field25_;
      field15_ = other.field15_ != null ? other.field15_.Clone() : null;
      field78_ = other.field78_;
      field67_ = other.field67_;
      field68_ = other.field68_;
      field128_ = other.field128_;
      field129_ = other.field129_;
      field131_ = other.field131_;
      _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields);
    }

    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    public GoogleMessage1 Clone() {
      return new GoogleMessage1(this);
    }

    /// <summary>Field number for the "field1" field.</summary>
    public const int Field1FieldNumber = 1;
    private string field1_ = "";
    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    public string Field1 {
      get { return field1_; }
      set {
        field1_ = pb::ProtoPreconditions.CheckNotNull(value, "value");
      }
    }

    /// <summary>Field number for the "field9" field.</summary>
    public const int Field9FieldNumber = 9;
    private string field9_ = "";
    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    public string Field9 {
      get { return field9_; }
      set {
        field9_ = pb::ProtoPreconditions.CheckNotNull(value, "value");
      }
    }

    /// <summary>Field number for the "field18" field.</summary>
    public const int Field18FieldNumber = 18;
    private string field18_ = "";
    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    public string Field18 {
      get { return field18_; }
      set {
        field18_ = pb::ProtoPreconditions.CheckNotNull(value, "value");
      }
    }

    /// <summary>Field number for the "field80" field.</summary>
    public const int Field80FieldNumber = 80;
    private bool field80_;
    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    public bool Field80 {
      get { return field80_; }
      set {
        field80_ = value;
      }
    }

    /// <summary>Field number for the "field81" field.</summary>
    public const int Field81FieldNumber = 81;
    private bool field81_;
    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    public bool Field81 {
      get { return field81_; }
      set {
        field81_ = value;
      }
    }

    /// <summary>Field number for the "field2" field.</summary>
    public const int Field2FieldNumber = 2;
    private int field2_;
    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    public int Field2 {
      get { return field2_; }
      set {
        field2_ = value;
      }
    }

    /// <summary>Field number for the "field3" field.</summary>
    public const int Field3FieldNumber = 3;
    private int field3_;
    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    public int Field3 {
      get { return field3_; }
      set {
        field3_ = value;
      }
    }

    /// <summary>Field number for the "field280" field.</summary>
    public const int Field280FieldNumber = 280;
    private int field280_;
    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    public int Field280 {
      get { return field280_; }
      set {
        field280_ = value;
      }
    }

    /// <summary>Field number for the "field6" field.</summary>
    public const int Field6FieldNumber = 6;
    private int field6_;
    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    public int Field6 {
      get { return field6_; }
      set {
        field6_ = value;
      }
    }

    /// <summary>Field number for the "field22" field.</summary>
    public const int Field22FieldNumber = 22;
    private long field22_;
    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    public long Field22 {
      get { return field22_; }
      set {
        field22_ = value;
      }
    }

    /// <summary>Field number for the "field4" field.</summary>
    public const int Field4FieldNumber = 4;
    private string field4_ = "";
    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    public string Field4 {
      get { return field4_; }
      set {
        field4_ = pb::ProtoPreconditions.CheckNotNull(value, "value");
      }
    }

    /// <summary>Field number for the "field5" field.</summary>
    public const int Field5FieldNumber = 5;
    private static readonly pb::FieldCodec<ulong> _repeated_field5_codec
        = pb::FieldCodec.ForFixed64(42);
    private readonly pbc::RepeatedField<ulong> field5_ = new pbc::RepeatedField<ulong>();
    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    public pbc::RepeatedField<ulong> Field5 {
      get { return field5_; }
    }

    /// <summary>Field number for the "field59" field.</summary>
    public const int Field59FieldNumber = 59;
    private bool field59_;
    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    public bool Field59 {
      get { return field59_; }
      set {
        field59_ = value;
      }
    }

    /// <summary>Field number for the "field7" field.</summary>
    public const int Field7FieldNumber = 7;
    private string field7_ = "";
    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    public string Field7 {
      get { return field7_; }
      set {
        field7_ = pb::ProtoPreconditions.CheckNotNull(value, "value");
      }
    }

    /// <summary>Field number for the "field16" field.</summary>
    public const int Field16FieldNumber = 16;
    private int field16_;
    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    public int Field16 {
      get { return field16_; }
      set {
        field16_ = value;
      }
    }

    /// <summary>Field number for the "field130" field.</summary>
    public const int Field130FieldNumber = 130;
    private int field130_;
    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    public int Field130 {
      get { return field130_; }
      set {
        field130_ = value;
      }
    }

    /// <summary>Field number for the "field12" field.</summary>
    public const int Field12FieldNumber = 12;
    private bool field12_;
    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    public bool Field12 {
      get { return field12_; }
      set {
        field12_ = value;
      }
    }

    /// <summary>Field number for the "field17" field.</summary>
    public const int Field17FieldNumber = 17;
    private bool field17_;
    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    public bool Field17 {
      get { return field17_; }
      set {
        field17_ = value;
      }
    }

    /// <summary>Field number for the "field13" field.</summary>
    public const int Field13FieldNumber = 13;
    private bool field13_;
    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    public bool Field13 {
      get { return field13_; }
      set {
        field13_ = value;
      }
    }

    /// <summary>Field number for the "field14" field.</summary>
    public const int Field14FieldNumber = 14;
    private bool field14_;
    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    public bool Field14 {
      get { return field14_; }
      set {
        field14_ = value;
      }
    }

    /// <summary>Field number for the "field104" field.</summary>
    public const int Field104FieldNumber = 104;
    private int field104_;
    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    public int Field104 {
      get { return field104_; }
      set {
        field104_ = value;
      }
    }

    /// <summary>Field number for the "field100" field.</summary>
    public const int Field100FieldNumber = 100;
    private int field100_;
    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    public int Field100 {
      get { return field100_; }
      set {
        field100_ = value;
      }
    }

    /// <summary>Field number for the "field101" field.</summary>
    public const int Field101FieldNumber = 101;
    private int field101_;
    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    public int Field101 {
      get { return field101_; }
      set {
        field101_ = value;
      }
    }

    /// <summary>Field number for the "field102" field.</summary>
    public const int Field102FieldNumber = 102;
    private string field102_ = "";
    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    public string Field102 {
      get { return field102_; }
      set {
        field102_ = pb::ProtoPreconditions.CheckNotNull(value, "value");
      }
    }

    /// <summary>Field number for the "field103" field.</summary>
    public const int Field103FieldNumber = 103;
    private string field103_ = "";
    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    public string Field103 {
      get { return field103_; }
      set {
        field103_ = pb::ProtoPreconditions.CheckNotNull(value, "value");
      }
    }

    /// <summary>Field number for the "field29" field.</summary>
    public const int Field29FieldNumber = 29;
    private int field29_;
    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    public int Field29 {
      get { return field29_; }
      set {
        field29_ = value;
      }
    }

    /// <summary>Field number for the "field30" field.</summary>
    public const int Field30FieldNumber = 30;
    private bool field30_;
    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    public bool Field30 {
      get { return field30_; }
      set {
        field30_ = value;
      }
    }

    /// <summary>Field number for the "field60" field.</summary>
    public const int Field60FieldNumber = 60;
    private int field60_;
    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    public int Field60 {
      get { return field60_; }
      set {
        field60_ = value;
      }
    }

    /// <summary>Field number for the "field271" field.</summary>
    public const int Field271FieldNumber = 271;
    private int field271_;
    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    public int Field271 {
      get { return field271_; }
      set {
        field271_ = value;
      }
    }

    /// <summary>Field number for the "field272" field.</summary>
    public const int Field272FieldNumber = 272;
    private int field272_;
    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    public int Field272 {
      get { return field272_; }
      set {
        field272_ = value;
      }
    }

    /// <summary>Field number for the "field150" field.</summary>
    public const int Field150FieldNumber = 150;
    private int field150_;
    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    public int Field150 {
      get { return field150_; }
      set {
        field150_ = value;
      }
    }

    /// <summary>Field number for the "field23" field.</summary>
    public const int Field23FieldNumber = 23;
    private int field23_;
    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    public int Field23 {
      get { return field23_; }
      set {
        field23_ = value;
      }
    }

    /// <summary>Field number for the "field24" field.</summary>
    public const int Field24FieldNumber = 24;
    private bool field24_;
    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    public bool Field24 {
      get { return field24_; }
      set {
        field24_ = value;
      }
    }

    /// <summary>Field number for the "field25" field.</summary>
    public const int Field25FieldNumber = 25;
    private int field25_;
    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    public int Field25 {
      get { return field25_; }
      set {
        field25_ = value;
      }
    }

    /// <summary>Field number for the "field15" field.</summary>
    public const int Field15FieldNumber = 15;
    private global::Benchmarks.Proto3.GoogleMessage1SubMessage field15_;
    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    public global::Benchmarks.Proto3.GoogleMessage1SubMessage Field15 {
      get { return field15_; }
      set {
        field15_ = value;
      }
    }

    /// <summary>Field number for the "field78" field.</summary>
    public const int Field78FieldNumber = 78;
    private bool field78_;
    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    public bool Field78 {
      get { return field78_; }
      set {
        field78_ = value;
      }
    }

    /// <summary>Field number for the "field67" field.</summary>
    public const int Field67FieldNumber = 67;
    private int field67_;
    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    public int Field67 {
      get { return field67_; }
      set {
        field67_ = value;
      }
    }

    /// <summary>Field number for the "field68" field.</summary>
    public const int Field68FieldNumber = 68;
    private int field68_;
    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    public int Field68 {
      get { return field68_; }
      set {
        field68_ = value;
      }
    }

    /// <summary>Field number for the "field128" field.</summary>
    public const int Field128FieldNumber = 128;
    private int field128_;
    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    public int Field128 {
      get { return field128_; }
      set {
        field128_ = value;
      }
    }

    /// <summary>Field number for the "field129" field.</summary>
    public const int Field129FieldNumber = 129;
    private string field129_ = "";
    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    public string Field129 {
      get { return field129_; }
      set {
        field129_ = pb::ProtoPreconditions.CheckNotNull(value, "value");
      }
    }

    /// <summary>Field number for the "field131" field.</summary>
    public const int Field131FieldNumber = 131;
    private int field131_;
    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    public int Field131 {
      get { return field131_; }
      set {
        field131_ = value;
      }
    }

    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    public override bool Equals(object other) {
      return Equals(other as GoogleMessage1);
    }

    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    public bool Equals(GoogleMessage1 other) {
      if (ReferenceEquals(other, null)) {
        return false;
      }
      if (ReferenceEquals(other, this)) {
        return true;
      }
      if (Field1 != other.Field1) return false;
      if (Field9 != other.Field9) return false;
      if (Field18 != other.Field18) return false;
      if (Field80 != other.Field80) return false;
      if (Field81 != other.Field81) return false;
      if (Field2 != other.Field2) return false;
      if (Field3 != other.Field3) return false;
      if (Field280 != other.Field280) return false;
      if (Field6 != other.Field6) return false;
      if (Field22 != other.Field22) return false;
      if (Field4 != other.Field4) return false;
      if(!field5_.Equals(other.field5_)) return false;
      if (Field59 != other.Field59) return false;
      if (Field7 != other.Field7) return false;
      if (Field16 != other.Field16) return false;
      if (Field130 != other.Field130) return false;
      if (Field12 != other.Field12) return false;
      if (Field17 != other.Field17) return false;
      if (Field13 != other.Field13) return false;
      if (Field14 != other.Field14) return false;
      if (Field104 != other.Field104) return false;
      if (Field100 != other.Field100) return false;
      if (Field101 != other.Field101) return false;
      if (Field102 != other.Field102) return false;
      if (Field103 != other.Field103) return false;
      if (Field29 != other.Field29) return false;
      if (Field30 != other.Field30) return false;
      if (Field60 != other.Field60) return false;
      if (Field271 != other.Field271) return false;
      if (Field272 != other.Field272) return false;
      if (Field150 != other.Field150) return false;
      if (Field23 != other.Field23) return false;
      if (Field24 != other.Field24) return false;
      if (Field25 != other.Field25) return false;
      if (!object.Equals(Field15, other.Field15)) return false;
      if (Field78 != other.Field78) return false;
      if (Field67 != other.Field67) return false;
      if (Field68 != other.Field68) return false;
      if (Field128 != other.Field128) return false;
      if (Field129 != other.Field129) return false;
      if (Field131 != other.Field131) return false;
      return Equals(_unknownFields, other._unknownFields);
    }

    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    public override int GetHashCode() {
      int hash = 1;
      if (Field1.Length != 0) hash ^= Field1.GetHashCode();
      if (Field9.Length != 0) hash ^= Field9.GetHashCode();
      if (Field18.Length != 0) hash ^= Field18.GetHashCode();
      if (Field80 != false) hash ^= Field80.GetHashCode();
      if (Field81 != false) hash ^= Field81.GetHashCode();
      if (Field2 != 0) hash ^= Field2.GetHashCode();
      if (Field3 != 0) hash ^= Field3.GetHashCode();
      if (Field280 != 0) hash ^= Field280.GetHashCode();
      if (Field6 != 0) hash ^= Field6.GetHashCode();
      if (Field22 != 0L) hash ^= Field22.GetHashCode();
      if (Field4.Length != 0) hash ^= Field4.GetHashCode();
      hash ^= field5_.GetHashCode();
      if (Field59 != false) hash ^= Field59.GetHashCode();
      if (Field7.Length != 0) hash ^= Field7.GetHashCode();
      if (Field16 != 0) hash ^= Field16.GetHashCode();
      if (Field130 != 0) hash ^= Field130.GetHashCode();
      if (Field12 != false) hash ^= Field12.GetHashCode();
      if (Field17 != false) hash ^= Field17.GetHashCode();
      if (Field13 != false) hash ^= Field13.GetHashCode();
      if (Field14 != false) hash ^= Field14.GetHashCode();
      if (Field104 != 0) hash ^= Field104.GetHashCode();
      if (Field100 != 0) hash ^= Field100.GetHashCode();
      if (Field101 != 0) hash ^= Field101.GetHashCode();
      if (Field102.Length != 0) hash ^= Field102.GetHashCode();
      if (Field103.Length != 0) hash ^= Field103.GetHashCode();
      if (Field29 != 0) hash ^= Field29.GetHashCode();
      if (Field30 != false) hash ^= Field30.GetHashCode();
      if (Field60 != 0) hash ^= Field60.GetHashCode();
      if (Field271 != 0) hash ^= Field271.GetHashCode();
      if (Field272 != 0) hash ^= Field272.GetHashCode();
      if (Field150 != 0) hash ^= Field150.GetHashCode();
      if (Field23 != 0) hash ^= Field23.GetHashCode();
      if (Field24 != false) hash ^= Field24.GetHashCode();
      if (Field25 != 0) hash ^= Field25.GetHashCode();
      if (field15_ != null) hash ^= Field15.GetHashCode();
      if (Field78 != false) hash ^= Field78.GetHashCode();
      if (Field67 != 0) hash ^= Field67.GetHashCode();
      if (Field68 != 0) hash ^= Field68.GetHashCode();
      if (Field128 != 0) hash ^= Field128.GetHashCode();
      if (Field129.Length != 0) hash ^= Field129.GetHashCode();
      if (Field131 != 0) hash ^= Field131.GetHashCode();
      if (_unknownFields != null) {
        hash ^= _unknownFields.GetHashCode();
      }
      return hash;
    }

    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    public override string ToString() {
      return pb::JsonFormatter.ToDiagnosticString(this);
    }

    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    public void WriteTo(pb::CodedOutputStream output) {
    #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE
      output.WriteRawMessage(this);
    #else
      if (Field1.Length != 0) {
        output.WriteRawTag(10);
        output.WriteString(Field1);
      }
      if (Field2 != 0) {
        output.WriteRawTag(16);
        output.WriteInt32(Field2);
      }
      if (Field3 != 0) {
        output.WriteRawTag(24);
        output.WriteInt32(Field3);
      }
      if (Field4.Length != 0) {
        output.WriteRawTag(34);
        output.WriteString(Field4);
      }
      field5_.WriteTo(output, _repeated_field5_codec);
      if (Field6 != 0) {
        output.WriteRawTag(48);
        output.WriteInt32(Field6);
      }
      if (Field7.Length != 0) {
        output.WriteRawTag(58);
        output.WriteString(Field7);
      }
      if (Field9.Length != 0) {
        output.WriteRawTag(74);
        output.WriteString(Field9);
      }
      if (Field12 != false) {
        output.WriteRawTag(96);
        output.WriteBool(Field12);
      }
      if (Field13 != false) {
        output.WriteRawTag(104);
        output.WriteBool(Field13);
      }
      if (Field14 != false) {
        output.WriteRawTag(112);
        output.WriteBool(Field14);
      }
      if (field15_ != null) {
        output.WriteRawTag(122);
        output.WriteMessage(Field15);
      }
      if (Field16 != 0) {
        output.WriteRawTag(128, 1);
        output.WriteInt32(Field16);
      }
      if (Field17 != false) {
        output.WriteRawTag(136, 1);
        output.WriteBool(Field17);
      }
      if (Field18.Length != 0) {
        output.WriteRawTag(146, 1);
        output.WriteString(Field18);
      }
      if (Field22 != 0L) {
        output.WriteRawTag(176, 1);
        output.WriteInt64(Field22);
      }
      if (Field23 != 0) {
        output.WriteRawTag(184, 1);
        output.WriteInt32(Field23);
      }
      if (Field24 != false) {
        output.WriteRawTag(192, 1);
        output.WriteBool(Field24);
      }
      if (Field25 != 0) {
        output.WriteRawTag(200, 1);
        output.WriteInt32(Field25);
      }
      if (Field29 != 0) {
        output.WriteRawTag(232, 1);
        output.WriteInt32(Field29);
      }
      if (Field30 != false) {
        output.WriteRawTag(240, 1);
        output.WriteBool(Field30);
      }
      if (Field59 != false) {
        output.WriteRawTag(216, 3);
        output.WriteBool(Field59);
      }
      if (Field60 != 0) {
        output.WriteRawTag(224, 3);
        output.WriteInt32(Field60);
      }
      if (Field67 != 0) {
        output.WriteRawTag(152, 4);
        output.WriteInt32(Field67);
      }
      if (Field68 != 0) {
        output.WriteRawTag(160, 4);
        output.WriteInt32(Field68);
      }
      if (Field78 != false) {
        output.WriteRawTag(240, 4);
        output.WriteBool(Field78);
      }
      if (Field80 != false) {
        output.WriteRawTag(128, 5);
        output.WriteBool(Field80);
      }
      if (Field81 != false) {
        output.WriteRawTag(136, 5);
        output.WriteBool(Field81);
      }
      if (Field100 != 0) {
        output.WriteRawTag(160, 6);
        output.WriteInt32(Field100);
      }
      if (Field101 != 0) {
        output.WriteRawTag(168, 6);
        output.WriteInt32(Field101);
      }
      if (Field102.Length != 0) {
        output.WriteRawTag(178, 6);
        output.WriteString(Field102);
      }
      if (Field103.Length != 0) {
        output.WriteRawTag(186, 6);
        output.WriteString(Field103);
      }
      if (Field104 != 0) {
        output.WriteRawTag(192, 6);
        output.WriteInt32(Field104);
      }
      if (Field128 != 0) {
        output.WriteRawTag(128, 8);
        output.WriteInt32(Field128);
      }
      if (Field129.Length != 0) {
        output.WriteRawTag(138, 8);
        output.WriteString(Field129);
      }
      if (Field130 != 0) {
        output.WriteRawTag(144, 8);
        output.WriteInt32(Field130);
      }
      if (Field131 != 0) {
        output.WriteRawTag(152, 8);
        output.WriteInt32(Field131);
      }
      if (Field150 != 0) {
        output.WriteRawTag(176, 9);
        output.WriteInt32(Field150);
      }
      if (Field271 != 0) {
        output.WriteRawTag(248, 16);
        output.WriteInt32(Field271);
      }
      if (Field272 != 0) {
        output.WriteRawTag(128, 17);
        output.WriteInt32(Field272);
      }
      if (Field280 != 0) {
        output.WriteRawTag(192, 17);
        output.WriteInt32(Field280);
      }
      if (_unknownFields != null) {
        _unknownFields.WriteTo(output);
      }
    #endif
    }

    #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE
    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    void pb::IBufferMessage.InternalWriteTo(ref pb::WriteContext output) {
      if (Field1.Length != 0) {
        output.WriteRawTag(10);
        output.WriteString(Field1);
      }
      if (Field2 != 0) {
        output.WriteRawTag(16);
        output.WriteInt32(Field2);
      }
      if (Field3 != 0) {
        output.WriteRawTag(24);
        output.WriteInt32(Field3);
      }
      if (Field4.Length != 0) {
        output.WriteRawTag(34);
        output.WriteString(Field4);
      }
      field5_.WriteTo(ref output, _repeated_field5_codec);
      if (Field6 != 0) {
        output.WriteRawTag(48);
        output.WriteInt32(Field6);
      }
      if (Field7.Length != 0) {
        output.WriteRawTag(58);
        output.WriteString(Field7);
      }
      if (Field9.Length != 0) {
        output.WriteRawTag(74);
        output.WriteString(Field9);
      }
      if (Field12 != false) {
        output.WriteRawTag(96);
        output.WriteBool(Field12);
      }
      if (Field13 != false) {
        output.WriteRawTag(104);
        output.WriteBool(Field13);
      }
      if (Field14 != false) {
        output.WriteRawTag(112);
        output.WriteBool(Field14);
      }
      if (field15_ != null) {
        output.WriteRawTag(122);
        output.WriteMessage(Field15);
      }
      if (Field16 != 0) {
        output.WriteRawTag(128, 1);
        output.WriteInt32(Field16);
      }
      if (Field17 != false) {
        output.WriteRawTag(136, 1);
        output.WriteBool(Field17);
      }
      if (Field18.Length != 0) {
        output.WriteRawTag(146, 1);
        output.WriteString(Field18);
      }
      if (Field22 != 0L) {
        output.WriteRawTag(176, 1);
        output.WriteInt64(Field22);
      }
      if (Field23 != 0) {
        output.WriteRawTag(184, 1);
        output.WriteInt32(Field23);
      }
      if (Field24 != false) {
        output.WriteRawTag(192, 1);
        output.WriteBool(Field24);
      }
      if (Field25 != 0) {
        output.WriteRawTag(200, 1);
        output.WriteInt32(Field25);
      }
      if (Field29 != 0) {
        output.WriteRawTag(232, 1);
        output.WriteInt32(Field29);
      }
      if (Field30 != false) {
        output.WriteRawTag(240, 1);
        output.WriteBool(Field30);
      }
      if (Field59 != false) {
        output.WriteRawTag(216, 3);
        output.WriteBool(Field59);
      }
      if (Field60 != 0) {
        output.WriteRawTag(224, 3);
        output.WriteInt32(Field60);
      }
      if (Field67 != 0) {
        output.WriteRawTag(152, 4);
        output.WriteInt32(Field67);
      }
      if (Field68 != 0) {
        output.WriteRawTag(160, 4);
        output.WriteInt32(Field68);
      }
      if (Field78 != false) {
        output.WriteRawTag(240, 4);
        output.WriteBool(Field78);
      }
      if (Field80 != false) {
        output.WriteRawTag(128, 5);
        output.WriteBool(Field80);
      }
      if (Field81 != false) {
        output.WriteRawTag(136, 5);
        output.WriteBool(Field81);
      }
      if (Field100 != 0) {
        output.WriteRawTag(160, 6);
        output.WriteInt32(Field100);
      }
      if (Field101 != 0) {
        output.WriteRawTag(168, 6);
        output.WriteInt32(Field101);
      }
      if (Field102.Length != 0) {
        output.WriteRawTag(178, 6);
        output.WriteString(Field102);
      }
      if (Field103.Length != 0) {
        output.WriteRawTag(186, 6);
        output.WriteString(Field103);
      }
      if (Field104 != 0) {
        output.WriteRawTag(192, 6);
        output.WriteInt32(Field104);
      }
      if (Field128 != 0) {
        output.WriteRawTag(128, 8);
        output.WriteInt32(Field128);
      }
      if (Field129.Length != 0) {
        output.WriteRawTag(138, 8);
        output.WriteString(Field129);
      }
      if (Field130 != 0) {
        output.WriteRawTag(144, 8);
        output.WriteInt32(Field130);
      }
      if (Field131 != 0) {
        output.WriteRawTag(152, 8);
        output.WriteInt32(Field131);
      }
      if (Field150 != 0) {
        output.WriteRawTag(176, 9);
        output.WriteInt32(Field150);
      }
      if (Field271 != 0) {
        output.WriteRawTag(248, 16);
        output.WriteInt32(Field271);
      }
      if (Field272 != 0) {
        output.WriteRawTag(128, 17);
        output.WriteInt32(Field272);
      }
      if (Field280 != 0) {
        output.WriteRawTag(192, 17);
        output.WriteInt32(Field280);
      }
      if (_unknownFields != null) {
        _unknownFields.WriteTo(ref output);
      }
    }
    #endif

    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    public int CalculateSize() {
      int size = 0;
      if (Field1.Length != 0) {
        size += 1 + pb::CodedOutputStream.ComputeStringSize(Field1);
      }
      if (Field9.Length != 0) {
        size += 1 + pb::CodedOutputStream.ComputeStringSize(Field9);
      }
      if (Field18.Length != 0) {
        size += 2 + pb::CodedOutputStream.ComputeStringSize(Field18);
      }
      if (Field80 != false) {
        size += 2 + 1;
      }
      if (Field81 != false) {
        size += 2 + 1;
      }
      if (Field2 != 0) {
        size += 1 + pb::CodedOutputStream.ComputeInt32Size(Field2);
      }
      if (Field3 != 0) {
        size += 1 + pb::CodedOutputStream.ComputeInt32Size(Field3);
      }
      if (Field280 != 0) {
        size += 2 + pb::CodedOutputStream.ComputeInt32Size(Field280);
      }
      if (Field6 != 0) {
        size += 1 + pb::CodedOutputStream.ComputeInt32Size(Field6);
      }
      if (Field22 != 0L) {
        size += 2 + pb::CodedOutputStream.ComputeInt64Size(Field22);
      }
      if (Field4.Length != 0) {
        size += 1 + pb::CodedOutputStream.ComputeStringSize(Field4);
      }
      size += field5_.CalculateSize(_repeated_field5_codec);
      if (Field59 != false) {
        size += 2 + 1;
      }
      if (Field7.Length != 0) {
        size += 1 + pb::CodedOutputStream.ComputeStringSize(Field7);
      }
      if (Field16 != 0) {
        size += 2 + pb::CodedOutputStream.ComputeInt32Size(Field16);
      }
      if (Field130 != 0) {
        size += 2 + pb::CodedOutputStream.ComputeInt32Size(Field130);
      }
      if (Field12 != false) {
        size += 1 + 1;
      }
      if (Field17 != false) {
        size += 2 + 1;
      }
      if (Field13 != false) {
        size += 1 + 1;
      }
      if (Field14 != false) {
        size += 1 + 1;
      }
      if (Field104 != 0) {
        size += 2 + pb::CodedOutputStream.ComputeInt32Size(Field104);
      }
      if (Field100 != 0) {
        size += 2 + pb::CodedOutputStream.ComputeInt32Size(Field100);
      }
      if (Field101 != 0) {
        size += 2 + pb::CodedOutputStream.ComputeInt32Size(Field101);
      }
      if (Field102.Length != 0) {
        size += 2 + pb::CodedOutputStream.ComputeStringSize(Field102);
      }
      if (Field103.Length != 0) {
        size += 2 + pb::CodedOutputStream.ComputeStringSize(Field103);
      }
      if (Field29 != 0) {
        size += 2 + pb::CodedOutputStream.ComputeInt32Size(Field29);
      }
      if (Field30 != false) {
        size += 2 + 1;
      }
      if (Field60 != 0) {
        size += 2 + pb::CodedOutputStream.ComputeInt32Size(Field60);
      }
      if (Field271 != 0) {
        size += 2 + pb::CodedOutputStream.ComputeInt32Size(Field271);
      }
      if (Field272 != 0) {
        size += 2 + pb::CodedOutputStream.ComputeInt32Size(Field272);
      }
      if (Field150 != 0) {
        size += 2 + pb::CodedOutputStream.ComputeInt32Size(Field150);
      }
      if (Field23 != 0) {
        size += 2 + pb::CodedOutputStream.ComputeInt32Size(Field23);
      }
      if (Field24 != false) {
        size += 2 + 1;
      }
      if (Field25 != 0) {
        size += 2 + pb::CodedOutputStream.ComputeInt32Size(Field25);
      }
      if (field15_ != null) {
        size += 1 + pb::CodedOutputStream.ComputeMessageSize(Field15);
      }
      if (Field78 != false) {
        size += 2 + 1;
      }
      if (Field67 != 0) {
        size += 2 + pb::CodedOutputStream.ComputeInt32Size(Field67);
      }
      if (Field68 != 0) {
        size += 2 + pb::CodedOutputStream.ComputeInt32Size(Field68);
      }
      if (Field128 != 0) {
        size += 2 + pb::CodedOutputStream.ComputeInt32Size(Field128);
      }
      if (Field129.Length != 0) {
        size += 2 + pb::CodedOutputStream.ComputeStringSize(Field129);
      }
      if (Field131 != 0) {
        size += 2 + pb::CodedOutputStream.ComputeInt32Size(Field131);
      }
      if (_unknownFields != null) {
        size += _unknownFields.CalculateSize();
      }
      return size;
    }

    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    public void MergeFrom(GoogleMessage1 other) {
      if (other == null) {
        return;
      }
      if (other.Field1.Length != 0) {
        Field1 = other.Field1;
      }
      if (other.Field9.Length != 0) {
        Field9 = other.Field9;
      }
      if (other.Field18.Length != 0) {
        Field18 = other.Field18;
      }
      if (other.Field80 != false) {
        Field80 = other.Field80;
      }
      if (other.Field81 != false) {
        Field81 = other.Field81;
      }
      if (other.Field2 != 0) {
        Field2 = other.Field2;
      }
      if (other.Field3 != 0) {
        Field3 = other.Field3;
      }
      if (other.Field280 != 0) {
        Field280 = other.Field280;
      }
      if (other.Field6 != 0) {
        Field6 = other.Field6;
      }
      if (other.Field22 != 0L) {
        Field22 = other.Field22;
      }
      if (other.Field4.Length != 0) {
        Field4 = other.Field4;
      }
      field5_.Add(other.field5_);
      if (other.Field59 != false) {
        Field59 = other.Field59;
      }
      if (other.Field7.Length != 0) {
        Field7 = other.Field7;
      }
      if (other.Field16 != 0) {
        Field16 = other.Field16;
      }
      if (other.Field130 != 0) {
        Field130 = other.Field130;
      }
      if (other.Field12 != false) {
        Field12 = other.Field12;
      }
      if (other.Field17 != false) {
        Field17 = other.Field17;
      }
      if (other.Field13 != false) {
        Field13 = other.Field13;
      }
      if (other.Field14 != false) {
        Field14 = other.Field14;
      }
      if (other.Field104 != 0) {
        Field104 = other.Field104;
      }
      if (other.Field100 != 0) {
        Field100 = other.Field100;
      }
      if (other.Field101 != 0) {
        Field101 = other.Field101;
      }
      if (other.Field102.Length != 0) {
        Field102 = other.Field102;
      }
      if (other.Field103.Length != 0) {
        Field103 = other.Field103;
      }
      if (other.Field29 != 0) {
        Field29 = other.Field29;
      }
      if (other.Field30 != false) {
        Field30 = other.Field30;
      }
      if (other.Field60 != 0) {
        Field60 = other.Field60;
      }
      if (other.Field271 != 0) {
        Field271 = other.Field271;
      }
      if (other.Field272 != 0) {
        Field272 = other.Field272;
      }
      if (other.Field150 != 0) {
        Field150 = other.Field150;
      }
      if (other.Field23 != 0) {
        Field23 = other.Field23;
      }
      if (other.Field24 != false) {
        Field24 = other.Field24;
      }
      if (other.Field25 != 0) {
        Field25 = other.Field25;
      }
      if (other.field15_ != null) {
        if (field15_ == null) {
          Field15 = new global::Benchmarks.Proto3.GoogleMessage1SubMessage();
        }
        Field15.MergeFrom(other.Field15);
      }
      if (other.Field78 != false) {
        Field78 = other.Field78;
      }
      if (other.Field67 != 0) {
        Field67 = other.Field67;
      }
      if (other.Field68 != 0) {
        Field68 = other.Field68;
      }
      if (other.Field128 != 0) {
        Field128 = other.Field128;
      }
      if (other.Field129.Length != 0) {
        Field129 = other.Field129;
      }
      if (other.Field131 != 0) {
        Field131 = other.Field131;
      }
      _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields);
    }

    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    public void MergeFrom(pb::CodedInputStream input) {
    #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE
      input.ReadRawMessage(this);
    #else
      uint tag;
      while ((tag = input.ReadTag()) != 0) {
        switch(tag) {
          default:
            _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input);
            break;
          case 10: {
            Field1 = input.ReadString();
            break;
          }
          case 16: {
            Field2 = input.ReadInt32();
            break;
          }
          case 24: {
            Field3 = input.ReadInt32();
            break;
          }
          case 34: {
            Field4 = input.ReadString();
            break;
          }
          case 42:
          case 41: {
            field5_.AddEntriesFrom(input, _repeated_field5_codec);
            break;
          }
          case 48: {
            Field6 = input.ReadInt32();
            break;
          }
          case 58: {
            Field7 = input.ReadString();
            break;
          }
          case 74: {
            Field9 = input.ReadString();
            break;
          }
          case 96: {
            Field12 = input.ReadBool();
            break;
          }
          case 104: {
            Field13 = input.ReadBool();
            break;
          }
          case 112: {
            Field14 = input.ReadBool();
            break;
          }
          case 122: {
            if (field15_ == null) {
              Field15 = new global::Benchmarks.Proto3.GoogleMessage1SubMessage();
            }
            input.ReadMessage(Field15);
            break;
          }
          case 128: {
            Field16 = input.ReadInt32();
            break;
          }
          case 136: {
            Field17 = input.ReadBool();
            break;
          }
          case 146: {
            Field18 = input.ReadString();
            break;
          }
          case 176: {
            Field22 = input.ReadInt64();
            break;
          }
          case 184: {
            Field23 = input.ReadInt32();
            break;
          }
          case 192: {
            Field24 = input.ReadBool();
            break;
          }
          case 200: {
            Field25 = input.ReadInt32();
            break;
          }
          case 232: {
            Field29 = input.ReadInt32();
            break;
          }
          case 240: {
            Field30 = input.ReadBool();
            break;
          }
          case 472: {
            Field59 = input.ReadBool();
            break;
          }
          case 480: {
            Field60 = input.ReadInt32();
            break;
          }
          case 536: {
            Field67 = input.ReadInt32();
            break;
          }
          case 544: {
            Field68 = input.ReadInt32();
            break;
          }
          case 624: {
            Field78 = input.ReadBool();
            break;
          }
          case 640: {
            Field80 = input.ReadBool();
            break;
          }
          case 648: {
            Field81 = input.ReadBool();
            break;
          }
          case 800: {
            Field100 = input.ReadInt32();
            break;
          }
          case 808: {
            Field101 = input.ReadInt32();
            break;
          }
          case 818: {
            Field102 = input.ReadString();
            break;
          }
          case 826: {
            Field103 = input.ReadString();
            break;
          }
          case 832: {
            Field104 = input.ReadInt32();
            break;
          }
          case 1024: {
            Field128 = input.ReadInt32();
            break;
          }
          case 1034: {
            Field129 = input.ReadString();
            break;
          }
          case 1040: {
            Field130 = input.ReadInt32();
            break;
          }
          case 1048: {
            Field131 = input.ReadInt32();
            break;
          }
          case 1200: {
            Field150 = input.ReadInt32();
            break;
          }
          case 2168: {
            Field271 = input.ReadInt32();
            break;
          }
          case 2176: {
            Field272 = input.ReadInt32();
            break;
          }
          case 2240: {
            Field280 = input.ReadInt32();
            break;
          }
        }
      }
    #endif
    }

    #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE
    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    void pb::IBufferMessage.InternalMergeFrom(ref pb::ParseContext input) {
      uint tag;
      while ((tag = input.ReadTag()) != 0) {
        switch(tag) {
          default:
            _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, ref input);
            break;
          case 10: {
            Field1 = input.ReadString();
            break;
          }
          case 16: {
            Field2 = input.ReadInt32();
            break;
          }
          case 24: {
            Field3 = input.ReadInt32();
            break;
          }
          case 34: {
            Field4 = input.ReadString();
            break;
          }
          case 42:
          case 41: {
            field5_.AddEntriesFrom(ref input, _repeated_field5_codec);
            break;
          }
          case 48: {
            Field6 = input.ReadInt32();
            break;
          }
          case 58: {
            Field7 = input.ReadString();
            break;
          }
          case 74: {
            Field9 = input.ReadString();
            break;
          }
          case 96: {
            Field12 = input.ReadBool();
            break;
          }
          case 104: {
            Field13 = input.ReadBool();
            break;
          }
          case 112: {
            Field14 = input.ReadBool();
            break;
          }
          case 122: {
            if (field15_ == null) {
              Field15 = new global::Benchmarks.Proto3.GoogleMessage1SubMessage();
            }
            input.ReadMessage(Field15);
            break;
          }
          case 128: {
            Field16 = input.ReadInt32();
            break;
          }
          case 136: {
            Field17 = input.ReadBool();
            break;
          }
          case 146: {
            Field18 = input.ReadString();
            break;
          }
          case 176: {
            Field22 = input.ReadInt64();
            break;
          }
          case 184: {
            Field23 = input.ReadInt32();
            break;
          }
          case 192: {
            Field24 = input.ReadBool();
            break;
          }
          case 200: {
            Field25 = input.ReadInt32();
            break;
          }
          case 232: {
            Field29 = input.ReadInt32();
            break;
          }
          case 240: {
            Field30 = input.ReadBool();
            break;
          }
          case 472: {
            Field59 = input.ReadBool();
            break;
          }
          case 480: {
            Field60 = input.ReadInt32();
            break;
          }
          case 536: {
            Field67 = input.ReadInt32();
            break;
          }
          case 544: {
            Field68 = input.ReadInt32();
            break;
          }
          case 624: {
            Field78 = input.ReadBool();
            break;
          }
          case 640: {
            Field80 = input.ReadBool();
            break;
          }
          case 648: {
            Field81 = input.ReadBool();
            break;
          }
          case 800: {
            Field100 = input.ReadInt32();
            break;
          }
          case 808: {
            Field101 = input.ReadInt32();
            break;
          }
          case 818: {
            Field102 = input.ReadString();
            break;
          }
          case 826: {
            Field103 = input.ReadString();
            break;
          }
          case 832: {
            Field104 = input.ReadInt32();
            break;
          }
          case 1024: {
            Field128 = input.ReadInt32();
            break;
          }
          case 1034: {
            Field129 = input.ReadString();
            break;
          }
          case 1040: {
            Field130 = input.ReadInt32();
            break;
          }
          case 1048: {
            Field131 = input.ReadInt32();
            break;
          }
          case 1200: {
            Field150 = input.ReadInt32();
            break;
          }
          case 2168: {
            Field271 = input.ReadInt32();
            break;
          }
          case 2176: {
            Field272 = input.ReadInt32();
            break;
          }
          case 2240: {
            Field280 = input.ReadInt32();
            break;
          }
        }
      }
    }
    #endif

  }

  public sealed partial class GoogleMessage1SubMessage : pb::IMessage<GoogleMessage1SubMessage>
  #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE
      , pb::IBufferMessage
  #endif
  {
    private static readonly pb::MessageParser<GoogleMessage1SubMessage> _parser = new pb::MessageParser<GoogleMessage1SubMessage>(() => new GoogleMessage1SubMessage());
    private pb::UnknownFieldSet _unknownFields;
    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    public static pb::MessageParser<GoogleMessage1SubMessage> Parser { get { return _parser; } }

    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    public static pbr::MessageDescriptor Descriptor {
      get { return global::Benchmarks.Proto3.BenchmarkMessage1Proto3Reflection.Descriptor.MessageTypes[1]; }
    }

    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    pbr::MessageDescriptor pb::IMessage.Descriptor {
      get { return Descriptor; }
    }

    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    public GoogleMessage1SubMessage() {
      OnConstruction();
    }

    partial void OnConstruction();

    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    public GoogleMessage1SubMessage(GoogleMessage1SubMessage other) : this() {
      field1_ = other.field1_;
      field2_ = other.field2_;
      field3_ = other.field3_;
      field15_ = other.field15_;
      field12_ = other.field12_;
      field13_ = other.field13_;
      field14_ = other.field14_;
      field16_ = other.field16_;
      field19_ = other.field19_;
      field20_ = other.field20_;
      field28_ = other.field28_;
      field21_ = other.field21_;
      field22_ = other.field22_;
      field23_ = other.field23_;
      field206_ = other.field206_;
      field203_ = other.field203_;
      field204_ = other.field204_;
      field205_ = other.field205_;
      field207_ = other.field207_;
      field300_ = other.field300_;
      _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields);
    }

    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    public GoogleMessage1SubMessage Clone() {
      return new GoogleMessage1SubMessage(this);
    }

    /// <summary>Field number for the "field1" field.</summary>
    public const int Field1FieldNumber = 1;
    private int field1_;
    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    public int Field1 {
      get { return field1_; }
      set {
        field1_ = value;
      }
    }

    /// <summary>Field number for the "field2" field.</summary>
    public const int Field2FieldNumber = 2;
    private int field2_;
    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    public int Field2 {
      get { return field2_; }
      set {
        field2_ = value;
      }
    }

    /// <summary>Field number for the "field3" field.</summary>
    public const int Field3FieldNumber = 3;
    private int field3_;
    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    public int Field3 {
      get { return field3_; }
      set {
        field3_ = value;
      }
    }

    /// <summary>Field number for the "field15" field.</summary>
    public const int Field15FieldNumber = 15;
    private string field15_ = "";
    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    public string Field15 {
      get { return field15_; }
      set {
        field15_ = pb::ProtoPreconditions.CheckNotNull(value, "value");
      }
    }

    /// <summary>Field number for the "field12" field.</summary>
    public const int Field12FieldNumber = 12;
    private bool field12_;
    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    public bool Field12 {
      get { return field12_; }
      set {
        field12_ = value;
      }
    }

    /// <summary>Field number for the "field13" field.</summary>
    public const int Field13FieldNumber = 13;
    private long field13_;
    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    public long Field13 {
      get { return field13_; }
      set {
        field13_ = value;
      }
    }

    /// <summary>Field number for the "field14" field.</summary>
    public const int Field14FieldNumber = 14;
    private long field14_;
    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    public long Field14 {
      get { return field14_; }
      set {
        field14_ = value;
      }
    }

    /// <summary>Field number for the "field16" field.</summary>
    public const int Field16FieldNumber = 16;
    private int field16_;
    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    public int Field16 {
      get { return field16_; }
      set {
        field16_ = value;
      }
    }

    /// <summary>Field number for the "field19" field.</summary>
    public const int Field19FieldNumber = 19;
    private int field19_;
    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    public int Field19 {
      get { return field19_; }
      set {
        field19_ = value;
      }
    }

    /// <summary>Field number for the "field20" field.</summary>
    public const int Field20FieldNumber = 20;
    private bool field20_;
    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    public bool Field20 {
      get { return field20_; }
      set {
        field20_ = value;
      }
    }

    /// <summary>Field number for the "field28" field.</summary>
    public const int Field28FieldNumber = 28;
    private bool field28_;
    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    public bool Field28 {
      get { return field28_; }
      set {
        field28_ = value;
      }
    }

    /// <summary>Field number for the "field21" field.</summary>
    public const int Field21FieldNumber = 21;
    private ulong field21_;
    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    public ulong Field21 {
      get { return field21_; }
      set {
        field21_ = value;
      }
    }

    /// <summary>Field number for the "field22" field.</summary>
    public const int Field22FieldNumber = 22;
    private int field22_;
    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    public int Field22 {
      get { return field22_; }
      set {
        field22_ = value;
      }
    }

    /// <summary>Field number for the "field23" field.</summary>
    public const int Field23FieldNumber = 23;
    private bool field23_;
    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    public bool Field23 {
      get { return field23_; }
      set {
        field23_ = value;
      }
    }

    /// <summary>Field number for the "field206" field.</summary>
    public const int Field206FieldNumber = 206;
    private bool field206_;
    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    public bool Field206 {
      get { return field206_; }
      set {
        field206_ = value;
      }
    }

    /// <summary>Field number for the "field203" field.</summary>
    public const int Field203FieldNumber = 203;
    private uint field203_;
    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    public uint Field203 {
      get { return field203_; }
      set {
        field203_ = value;
      }
    }

    /// <summary>Field number for the "field204" field.</summary>
    public const int Field204FieldNumber = 204;
    private int field204_;
    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    public int Field204 {
      get { return field204_; }
      set {
        field204_ = value;
      }
    }

    /// <summary>Field number for the "field205" field.</summary>
    public const int Field205FieldNumber = 205;
    private string field205_ = "";
    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    public string Field205 {
      get { return field205_; }
      set {
        field205_ = pb::ProtoPreconditions.CheckNotNull(value, "value");
      }
    }

    /// <summary>Field number for the "field207" field.</summary>
    public const int Field207FieldNumber = 207;
    private ulong field207_;
    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    public ulong Field207 {
      get { return field207_; }
      set {
        field207_ = value;
      }
    }

    /// <summary>Field number for the "field300" field.</summary>
    public const int Field300FieldNumber = 300;
    private ulong field300_;
    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    public ulong Field300 {
      get { return field300_; }
      set {
        field300_ = value;
      }
    }

    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    public override bool Equals(object other) {
      return Equals(other as GoogleMessage1SubMessage);
    }

    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    public bool Equals(GoogleMessage1SubMessage other) {
      if (ReferenceEquals(other, null)) {
        return false;
      }
      if (ReferenceEquals(other, this)) {
        return true;
      }
      if (Field1 != other.Field1) return false;
      if (Field2 != other.Field2) return false;
      if (Field3 != other.Field3) return false;
      if (Field15 != other.Field15) return false;
      if (Field12 != other.Field12) return false;
      if (Field13 != other.Field13) return false;
      if (Field14 != other.Field14) return false;
      if (Field16 != other.Field16) return false;
      if (Field19 != other.Field19) return false;
      if (Field20 != other.Field20) return false;
      if (Field28 != other.Field28) return false;
      if (Field21 != other.Field21) return false;
      if (Field22 != other.Field22) return false;
      if (Field23 != other.Field23) return false;
      if (Field206 != other.Field206) return false;
      if (Field203 != other.Field203) return false;
      if (Field204 != other.Field204) return false;
      if (Field205 != other.Field205) return false;
      if (Field207 != other.Field207) return false;
      if (Field300 != other.Field300) return false;
      return Equals(_unknownFields, other._unknownFields);
    }

    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    public override int GetHashCode() {
      int hash = 1;
      if (Field1 != 0) hash ^= Field1.GetHashCode();
      if (Field2 != 0) hash ^= Field2.GetHashCode();
      if (Field3 != 0) hash ^= Field3.GetHashCode();
      if (Field15.Length != 0) hash ^= Field15.GetHashCode();
      if (Field12 != false) hash ^= Field12.GetHashCode();
      if (Field13 != 0L) hash ^= Field13.GetHashCode();
      if (Field14 != 0L) hash ^= Field14.GetHashCode();
      if (Field16 != 0) hash ^= Field16.GetHashCode();
      if (Field19 != 0) hash ^= Field19.GetHashCode();
      if (Field20 != false) hash ^= Field20.GetHashCode();
      if (Field28 != false) hash ^= Field28.GetHashCode();
      if (Field21 != 0UL) hash ^= Field21.GetHashCode();
      if (Field22 != 0) hash ^= Field22.GetHashCode();
      if (Field23 != false) hash ^= Field23.GetHashCode();
      if (Field206 != false) hash ^= Field206.GetHashCode();
      if (Field203 != 0) hash ^= Field203.GetHashCode();
      if (Field204 != 0) hash ^= Field204.GetHashCode();
      if (Field205.Length != 0) hash ^= Field205.GetHashCode();
      if (Field207 != 0UL) hash ^= Field207.GetHashCode();
      if (Field300 != 0UL) hash ^= Field300.GetHashCode();
      if (_unknownFields != null) {
        hash ^= _unknownFields.GetHashCode();
      }
      return hash;
    }

    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    public override string ToString() {
      return pb::JsonFormatter.ToDiagnosticString(this);
    }

    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    public void WriteTo(pb::CodedOutputStream output) {
    #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE
      output.WriteRawMessage(this);
    #else
      if (Field1 != 0) {
        output.WriteRawTag(8);
        output.WriteInt32(Field1);
      }
      if (Field2 != 0) {
        output.WriteRawTag(16);
        output.WriteInt32(Field2);
      }
      if (Field3 != 0) {
        output.WriteRawTag(24);
        output.WriteInt32(Field3);
      }
      if (Field12 != false) {
        output.WriteRawTag(96);
        output.WriteBool(Field12);
      }
      if (Field13 != 0L) {
        output.WriteRawTag(104);
        output.WriteInt64(Field13);
      }
      if (Field14 != 0L) {
        output.WriteRawTag(112);
        output.WriteInt64(Field14);
      }
      if (Field15.Length != 0) {
        output.WriteRawTag(122);
        output.WriteString(Field15);
      }
      if (Field16 != 0) {
        output.WriteRawTag(128, 1);
        output.WriteInt32(Field16);
      }
      if (Field19 != 0) {
        output.WriteRawTag(152, 1);
        output.WriteInt32(Field19);
      }
      if (Field20 != false) {
        output.WriteRawTag(160, 1);
        output.WriteBool(Field20);
      }
      if (Field21 != 0UL) {
        output.WriteRawTag(169, 1);
        output.WriteFixed64(Field21);
      }
      if (Field22 != 0) {
        output.WriteRawTag(176, 1);
        output.WriteInt32(Field22);
      }
      if (Field23 != false) {
        output.WriteRawTag(184, 1);
        output.WriteBool(Field23);
      }
      if (Field28 != false) {
        output.WriteRawTag(224, 1);
        output.WriteBool(Field28);
      }
      if (Field203 != 0) {
        output.WriteRawTag(221, 12);
        output.WriteFixed32(Field203);
      }
      if (Field204 != 0) {
        output.WriteRawTag(224, 12);
        output.WriteInt32(Field204);
      }
      if (Field205.Length != 0) {
        output.WriteRawTag(234, 12);
        output.WriteString(Field205);
      }
      if (Field206 != false) {
        output.WriteRawTag(240, 12);
        output.WriteBool(Field206);
      }
      if (Field207 != 0UL) {
        output.WriteRawTag(248, 12);
        output.WriteUInt64(Field207);
      }
      if (Field300 != 0UL) {
        output.WriteRawTag(224, 18);
        output.WriteUInt64(Field300);
      }
      if (_unknownFields != null) {
        _unknownFields.WriteTo(output);
      }
    #endif
    }

    #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE
    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    void pb::IBufferMessage.InternalWriteTo(ref pb::WriteContext output) {
      if (Field1 != 0) {
        output.WriteRawTag(8);
        output.WriteInt32(Field1);
      }
      if (Field2 != 0) {
        output.WriteRawTag(16);
        output.WriteInt32(Field2);
      }
      if (Field3 != 0) {
        output.WriteRawTag(24);
        output.WriteInt32(Field3);
      }
      if (Field12 != false) {
        output.WriteRawTag(96);
        output.WriteBool(Field12);
      }
      if (Field13 != 0L) {
        output.WriteRawTag(104);
        output.WriteInt64(Field13);
      }
      if (Field14 != 0L) {
        output.WriteRawTag(112);
        output.WriteInt64(Field14);
      }
      if (Field15.Length != 0) {
        output.WriteRawTag(122);
        output.WriteString(Field15);
      }
      if (Field16 != 0) {
        output.WriteRawTag(128, 1);
        output.WriteInt32(Field16);
      }
      if (Field19 != 0) {
        output.WriteRawTag(152, 1);
        output.WriteInt32(Field19);
      }
      if (Field20 != false) {
        output.WriteRawTag(160, 1);
        output.WriteBool(Field20);
      }
      if (Field21 != 0UL) {
        output.WriteRawTag(169, 1);
        output.WriteFixed64(Field21);
      }
      if (Field22 != 0) {
        output.WriteRawTag(176, 1);
        output.WriteInt32(Field22);
      }
      if (Field23 != false) {
        output.WriteRawTag(184, 1);
        output.WriteBool(Field23);
      }
      if (Field28 != false) {
        output.WriteRawTag(224, 1);
        output.WriteBool(Field28);
      }
      if (Field203 != 0) {
        output.WriteRawTag(221, 12);
        output.WriteFixed32(Field203);
      }
      if (Field204 != 0) {
        output.WriteRawTag(224, 12);
        output.WriteInt32(Field204);
      }
      if (Field205.Length != 0) {
        output.WriteRawTag(234, 12);
        output.WriteString(Field205);
      }
      if (Field206 != false) {
        output.WriteRawTag(240, 12);
        output.WriteBool(Field206);
      }
      if (Field207 != 0UL) {
        output.WriteRawTag(248, 12);
        output.WriteUInt64(Field207);
      }
      if (Field300 != 0UL) {
        output.WriteRawTag(224, 18);
        output.WriteUInt64(Field300);
      }
      if (_unknownFields != null) {
        _unknownFields.WriteTo(ref output);
      }
    }
    #endif

    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    public int CalculateSize() {
      int size = 0;
      if (Field1 != 0) {
        size += 1 + pb::CodedOutputStream.ComputeInt32Size(Field1);
      }
      if (Field2 != 0) {
        size += 1 + pb::CodedOutputStream.ComputeInt32Size(Field2);
      }
      if (Field3 != 0) {
        size += 1 + pb::CodedOutputStream.ComputeInt32Size(Field3);
      }
      if (Field15.Length != 0) {
        size += 1 + pb::CodedOutputStream.ComputeStringSize(Field15);
      }
      if (Field12 != false) {
        size += 1 + 1;
      }
      if (Field13 != 0L) {
        size += 1 + pb::CodedOutputStream.ComputeInt64Size(Field13);
      }
      if (Field14 != 0L) {
        size += 1 + pb::CodedOutputStream.ComputeInt64Size(Field14);
      }
      if (Field16 != 0) {
        size += 2 + pb::CodedOutputStream.ComputeInt32Size(Field16);
      }
      if (Field19 != 0) {
        size += 2 + pb::CodedOutputStream.ComputeInt32Size(Field19);
      }
      if (Field20 != false) {
        size += 2 + 1;
      }
      if (Field28 != false) {
        size += 2 + 1;
      }
      if (Field21 != 0UL) {
        size += 2 + 8;
      }
      if (Field22 != 0) {
        size += 2 + pb::CodedOutputStream.ComputeInt32Size(Field22);
      }
      if (Field23 != false) {
        size += 2 + 1;
      }
      if (Field206 != false) {
        size += 2 + 1;
      }
      if (Field203 != 0) {
        size += 2 + 4;
      }
      if (Field204 != 0) {
        size += 2 + pb::CodedOutputStream.ComputeInt32Size(Field204);
      }
      if (Field205.Length != 0) {
        size += 2 + pb::CodedOutputStream.ComputeStringSize(Field205);
      }
      if (Field207 != 0UL) {
        size += 2 + pb::CodedOutputStream.ComputeUInt64Size(Field207);
      }
      if (Field300 != 0UL) {
        size += 2 + pb::CodedOutputStream.ComputeUInt64Size(Field300);
      }
      if (_unknownFields != null) {
        size += _unknownFields.CalculateSize();
      }
      return size;
    }

    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    public void MergeFrom(GoogleMessage1SubMessage other) {
      if (other == null) {
        return;
      }
      if (other.Field1 != 0) {
        Field1 = other.Field1;
      }
      if (other.Field2 != 0) {
        Field2 = other.Field2;
      }
      if (other.Field3 != 0) {
        Field3 = other.Field3;
      }
      if (other.Field15.Length != 0) {
        Field15 = other.Field15;
      }
      if (other.Field12 != false) {
        Field12 = other.Field12;
      }
      if (other.Field13 != 0L) {
        Field13 = other.Field13;
      }
      if (other.Field14 != 0L) {
        Field14 = other.Field14;
      }
      if (other.Field16 != 0) {
        Field16 = other.Field16;
      }
      if (other.Field19 != 0) {
        Field19 = other.Field19;
      }
      if (other.Field20 != false) {
        Field20 = other.Field20;
      }
      if (other.Field28 != false) {
        Field28 = other.Field28;
      }
      if (other.Field21 != 0UL) {
        Field21 = other.Field21;
      }
      if (other.Field22 != 0) {
        Field22 = other.Field22;
      }
      if (other.Field23 != false) {
        Field23 = other.Field23;
      }
      if (other.Field206 != false) {
        Field206 = other.Field206;
      }
      if (other.Field203 != 0) {
        Field203 = other.Field203;
      }
      if (other.Field204 != 0) {
        Field204 = other.Field204;
      }
      if (other.Field205.Length != 0) {
        Field205 = other.Field205;
      }
      if (other.Field207 != 0UL) {
        Field207 = other.Field207;
      }
      if (other.Field300 != 0UL) {
        Field300 = other.Field300;
      }
      _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields);
    }

    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    public void MergeFrom(pb::CodedInputStream input) {
    #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE
      input.ReadRawMessage(this);
    #else
      uint tag;
      while ((tag = input.ReadTag()) != 0) {
        switch(tag) {
          default:
            _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input);
            break;
          case 8: {
            Field1 = input.ReadInt32();
            break;
          }
          case 16: {
            Field2 = input.ReadInt32();
            break;
          }
          case 24: {
            Field3 = input.ReadInt32();
            break;
          }
          case 96: {
            Field12 = input.ReadBool();
            break;
          }
          case 104: {
            Field13 = input.ReadInt64();
            break;
          }
          case 112: {
            Field14 = input.ReadInt64();
            break;
          }
          case 122: {
            Field15 = input.ReadString();
            break;
          }
          case 128: {
            Field16 = input.ReadInt32();
            break;
          }
          case 152: {
            Field19 = input.ReadInt32();
            break;
          }
          case 160: {
            Field20 = input.ReadBool();
            break;
          }
          case 169: {
            Field21 = input.ReadFixed64();
            break;
          }
          case 176: {
            Field22 = input.ReadInt32();
            break;
          }
          case 184: {
            Field23 = input.ReadBool();
            break;
          }
          case 224: {
            Field28 = input.ReadBool();
            break;
          }
          case 1629: {
            Field203 = input.ReadFixed32();
            break;
          }
          case 1632: {
            Field204 = input.ReadInt32();
            break;
          }
          case 1642: {
            Field205 = input.ReadString();
            break;
          }
          case 1648: {
            Field206 = input.ReadBool();
            break;
          }
          case 1656: {
            Field207 = input.ReadUInt64();
            break;
          }
          case 2400: {
            Field300 = input.ReadUInt64();
            break;
          }
        }
      }
    #endif
    }

    #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE
    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    void pb::IBufferMessage.InternalMergeFrom(ref pb::ParseContext input) {
      uint tag;
      while ((tag = input.ReadTag()) != 0) {
        switch(tag) {
          default:
            _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, ref input);
            break;
          case 8: {
            Field1 = input.ReadInt32();
            break;
          }
          case 16: {
            Field2 = input.ReadInt32();
            break;
          }
          case 24: {
            Field3 = input.ReadInt32();
            break;
          }
          case 96: {
            Field12 = input.ReadBool();
            break;
          }
          case 104: {
            Field13 = input.ReadInt64();
            break;
          }
          case 112: {
            Field14 = input.ReadInt64();
            break;
          }
          case 122: {
            Field15 = input.ReadString();
            break;
          }
          case 128: {
            Field16 = input.ReadInt32();
            break;
          }
          case 152: {
            Field19 = input.ReadInt32();
            break;
          }
          case 160: {
            Field20 = input.ReadBool();
            break;
          }
          case 169: {
            Field21 = input.ReadFixed64();
            break;
          }
          case 176: {
            Field22 = input.ReadInt32();
            break;
          }
          case 184: {
            Field23 = input.ReadBool();
            break;
          }
          case 224: {
            Field28 = input.ReadBool();
            break;
          }
          case 1629: {
            Field203 = input.ReadFixed32();
            break;
          }
          case 1632: {
            Field204 = input.ReadInt32();
            break;
          }
          case 1642: {
            Field205 = input.ReadString();
            break;
          }
          case 1648: {
            Field206 = input.ReadBool();
            break;
          }
          case 1656: {
            Field207 = input.ReadUInt64();
            break;
          }
          case 2400: {
            Field300 = input.ReadUInt64();
            break;
          }
        }
      }
    }
    #endif

  }

  #endregion

}

#endregion Designer generated code
