// <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
#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>, pb::IBufferMessage {
    private static readonly pb::MessageParser<GoogleMessage1> _parser = new pb::MessageParser<GoogleMessage1>(() => new GoogleMessage1());
    private pb::UnknownFieldSet _unknownFields;
    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    public static pb::MessageParser<GoogleMessage1> Parser { get { return _parser; } }

    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    public static pbr::MessageDescriptor Descriptor {
      get { return global::Benchmarks.Proto3.BenchmarkMessage1Proto3Reflection.Descriptor.MessageTypes[0]; }
    }

    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    pbr::MessageDescriptor pb::IMessage.Descriptor {
      get { return Descriptor; }
    }

    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    public GoogleMessage1() {
      OnConstruction();
    }

    partial void OnConstruction();

    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    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]
    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]
    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]
    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]
    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]
    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]
    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]
    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]
    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]
    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]
    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]
    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]
    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]
    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]
    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]
    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]
    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]
    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]
    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]
    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]
    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]
    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]
    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]
    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]
    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]
    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]
    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]
    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]
    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]
    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]
    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]
    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]
    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]
    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]
    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]
    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]
    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]
    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]
    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]
    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]
    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]
    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]
    public int Field131 {
      get { return field131_; }
      set {
        field131_ = value;
      }
    }

    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    public override bool Equals(object other) {
      return Equals(other as GoogleMessage1);
    }

    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    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]
    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]
    public override string ToString() {
      return pb::JsonFormatter.ToDiagnosticString(this);
    }

    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    public void WriteTo(pb::CodedOutputStream 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(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);
      }
    }

    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    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]
    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]
    public void MergeFrom(pb::CodedInputStream input) {
      input.ReadRawMessage(this);
    }

    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    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;
          }
        }
      }
    }

  }

  public sealed partial class GoogleMessage1SubMessage : pb::IMessage<GoogleMessage1SubMessage>, pb::IBufferMessage {
    private static readonly pb::MessageParser<GoogleMessage1SubMessage> _parser = new pb::MessageParser<GoogleMessage1SubMessage>(() => new GoogleMessage1SubMessage());
    private pb::UnknownFieldSet _unknownFields;
    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    public static pb::MessageParser<GoogleMessage1SubMessage> Parser { get { return _parser; } }

    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    public static pbr::MessageDescriptor Descriptor {
      get { return global::Benchmarks.Proto3.BenchmarkMessage1Proto3Reflection.Descriptor.MessageTypes[1]; }
    }

    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    pbr::MessageDescriptor pb::IMessage.Descriptor {
      get { return Descriptor; }
    }

    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    public GoogleMessage1SubMessage() {
      OnConstruction();
    }

    partial void OnConstruction();

    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    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]
    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]
    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]
    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]
    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]
    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]
    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]
    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]
    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]
    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]
    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]
    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]
    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]
    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]
    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]
    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]
    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]
    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]
    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]
    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]
    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]
    public ulong Field300 {
      get { return field300_; }
      set {
        field300_ = value;
      }
    }

    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    public override bool Equals(object other) {
      return Equals(other as GoogleMessage1SubMessage);
    }

    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    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]
    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]
    public override string ToString() {
      return pb::JsonFormatter.ToDiagnosticString(this);
    }

    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    public void WriteTo(pb::CodedOutputStream 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(output);
      }
    }

    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    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]
    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]
    public void MergeFrom(pb::CodedInputStream input) {
      input.ReadRawMessage(this);
    }

    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    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;
          }
        }
      }
    }

  }

  #endregion

}

#endregion Designer generated code
