// Generated by the protocol buffer compiler.  DO NOT EDIT!
// source: google_speed.proto
#pragma warning disable 1591, 0612, 3021
#region Designer generated code

using pb = global::Google.ProtocolBuffers;
using pbc = global::Google.ProtocolBuffers.Collections;
using pbd = global::Google.ProtocolBuffers.Descriptors;
using scg = global::System.Collections.Generic;
namespace Google.ProtocolBuffers.TestProtos {

  [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
  public static partial class GoogleSpeed {

    #region Extension registration
    public static void RegisterAllExtensions(pb::ExtensionRegistry registry) {
    }
    #endregion
    #region Static variables
    internal static pbd::MessageDescriptor internal__static_benchmarks_SpeedMessage1__Descriptor;
    internal static pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.SpeedMessage1, global::Google.ProtocolBuffers.TestProtos.SpeedMessage1.Builder> internal__static_benchmarks_SpeedMessage1__FieldAccessorTable;
    internal static pbd::MessageDescriptor internal__static_benchmarks_SpeedMessage1SubMessage__Descriptor;
    internal static pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.SpeedMessage1SubMessage, global::Google.ProtocolBuffers.TestProtos.SpeedMessage1SubMessage.Builder> internal__static_benchmarks_SpeedMessage1SubMessage__FieldAccessorTable;
    internal static pbd::MessageDescriptor internal__static_benchmarks_SpeedMessage2__Descriptor;
    internal static pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.SpeedMessage2, global::Google.ProtocolBuffers.TestProtos.SpeedMessage2.Builder> internal__static_benchmarks_SpeedMessage2__FieldAccessorTable;
    internal static pbd::MessageDescriptor internal__static_benchmarks_SpeedMessage2_Group1__Descriptor;
    internal static pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.SpeedMessage2.Types.Group1, global::Google.ProtocolBuffers.TestProtos.SpeedMessage2.Types.Group1.Builder> internal__static_benchmarks_SpeedMessage2_Group1__FieldAccessorTable;
    internal static pbd::MessageDescriptor internal__static_benchmarks_SpeedMessage2GroupedMessage__Descriptor;
    internal static pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.SpeedMessage2GroupedMessage, global::Google.ProtocolBuffers.TestProtos.SpeedMessage2GroupedMessage.Builder> internal__static_benchmarks_SpeedMessage2GroupedMessage__FieldAccessorTable;
    #endregion
    #region Descriptor
    public static pbd::FileDescriptor Descriptor {
      get { return descriptor; }
    }
    private static pbd::FileDescriptor descriptor;

    static GoogleSpeed() {
      byte[] descriptorData = global::System.Convert.FromBase64String(
          string.Concat(
            "ChJnb29nbGVfc3BlZWQucHJvdG8SCmJlbmNobWFya3Mi+AYKDVNwZWVkTWVz", 
            "c2FnZTESDgoGZmllbGQxGAEgAigJEg4KBmZpZWxkORgJIAEoCRIPCgdmaWVs", 
            "ZDE4GBIgASgJEhYKB2ZpZWxkODAYUCABKAg6BWZhbHNlEhUKB2ZpZWxkODEY", 
            "USABKAg6BHRydWUSDgoGZmllbGQyGAIgAigFEg4KBmZpZWxkMxgDIAIoBRIR", 
            "CghmaWVsZDI4MBiYAiABKAUSEQoGZmllbGQ2GAYgASgFOgEwEg8KB2ZpZWxk", 
            "MjIYFiABKAMSDgoGZmllbGQ0GAQgASgJEg4KBmZpZWxkNRgFIAMoBhIWCgdm", 
            "aWVsZDU5GDsgASgIOgVmYWxzZRIOCgZmaWVsZDcYByABKAkSDwoHZmllbGQx", 
            "NhgQIAEoBRIUCghmaWVsZDEzMBiCASABKAU6ATASFQoHZmllbGQxMhgMIAEo", 
            "CDoEdHJ1ZRIVCgdmaWVsZDE3GBEgASgIOgR0cnVlEhUKB2ZpZWxkMTMYDSAB", 
            "KAg6BHRydWUSFQoHZmllbGQxNBgOIAEoCDoEdHJ1ZRITCghmaWVsZDEwNBho", 
            "IAEoBToBMBITCghmaWVsZDEwMBhkIAEoBToBMBITCghmaWVsZDEwMRhlIAEo", 
            "BToBMBIQCghmaWVsZDEwMhhmIAEoCRIQCghmaWVsZDEwMxhnIAEoCRISCgdm", 
            "aWVsZDI5GB0gASgFOgEwEhYKB2ZpZWxkMzAYHiABKAg6BWZhbHNlEhMKB2Zp", 
            "ZWxkNjAYPCABKAU6Ai0xEhUKCGZpZWxkMjcxGI8CIAEoBToCLTESFQoIZmll", 
            "bGQyNzIYkAIgASgFOgItMRIRCghmaWVsZDE1MBiWASABKAUSEgoHZmllbGQy", 
            "MxgXIAEoBToBMBIWCgdmaWVsZDI0GBggASgIOgVmYWxzZRISCgdmaWVsZDI1", 
            "GBkgASgFOgEwEjQKB2ZpZWxkMTUYDyABKAsyIy5iZW5jaG1hcmtzLlNwZWVk", 
            "TWVzc2FnZTFTdWJNZXNzYWdlEg8KB2ZpZWxkNzgYTiABKAgSEgoHZmllbGQ2", 
            "NxhDIAEoBToBMBIPCgdmaWVsZDY4GEQgASgFEhQKCGZpZWxkMTI4GIABIAEo", 
            "BToBMBIoCghmaWVsZDEyORiBASABKAk6FXh4eHh4eHh4eHh4eHh4eHh4eHh4", 
            "eBIUCghmaWVsZDEzMRiDASABKAU6ATAiogMKF1NwZWVkTWVzc2FnZTFTdWJN", 
            "ZXNzYWdlEhEKBmZpZWxkMRgBIAEoBToBMBIRCgZmaWVsZDIYAiABKAU6ATAS", 
            "EQoGZmllbGQzGAMgASgFOgEwEg8KB2ZpZWxkMTUYDyABKAkSFQoHZmllbGQx", 
            "MhgMIAEoCDoEdHJ1ZRIPCgdmaWVsZDEzGA0gASgDEg8KB2ZpZWxkMTQYDiAB", 
            "KAMSDwoHZmllbGQxNhgQIAEoBRISCgdmaWVsZDE5GBMgASgFOgEyEhUKB2Zp", 
            "ZWxkMjAYFCABKAg6BHRydWUSFQoHZmllbGQyOBgcIAEoCDoEdHJ1ZRIPCgdm", 
            "aWVsZDIxGBUgASgGEg8KB2ZpZWxkMjIYFiABKAUSFgoHZmllbGQyMxgXIAEo", 
            "CDoFZmFsc2USGAoIZmllbGQyMDYYzgEgASgIOgVmYWxzZRIRCghmaWVsZDIw", 
            "MxjLASABKAcSEQoIZmllbGQyMDQYzAEgASgFEhEKCGZpZWxkMjA1GM0BIAEo", 
            "CRIRCghmaWVsZDIwNxjPASABKAQSEQoIZmllbGQzMDAYrAIgASgEIsoHCg1T", 
            "cGVlZE1lc3NhZ2UyEg4KBmZpZWxkMRgBIAEoCRIOCgZmaWVsZDMYAyABKAMS", 
            "DgoGZmllbGQ0GAQgASgDEg8KB2ZpZWxkMzAYHiABKAMSFgoHZmllbGQ3NRhL", 
            "IAEoCDoFZmFsc2USDgoGZmllbGQ2GAYgASgJEg4KBmZpZWxkMhgCIAEoDBIS", 
            "CgdmaWVsZDIxGBUgASgFOgEwEg8KB2ZpZWxkNzEYRyABKAUSDwoHZmllbGQy", 
            "NRgZIAEoAhITCghmaWVsZDEwORhtIAEoBToBMBIUCghmaWVsZDIxMBjSASAB", 
            "KAU6ATASFAoIZmllbGQyMTEY0wEgASgFOgEwEhQKCGZpZWxkMjEyGNQBIAEo", 
            "BToBMBIUCghmaWVsZDIxMxjVASABKAU6ATASFAoIZmllbGQyMTYY2AEgASgF", 
            "OgEwEhQKCGZpZWxkMjE3GNkBIAEoBToBMBIUCghmaWVsZDIxOBjaASABKAU6", 
            "ATASFAoIZmllbGQyMjAY3AEgASgFOgEwEhQKCGZpZWxkMjIxGN0BIAEoBToB", 
            "MBIUCghmaWVsZDIyMhjeASABKAI6ATASDwoHZmllbGQ2Mxg/IAEoBRIwCgZn", 
            "cm91cDEYCiADKAoyIC5iZW5jaG1hcmtzLlNwZWVkTWVzc2FnZTIuR3JvdXAx", 
            "EhEKCGZpZWxkMTI4GIABIAMoCRIRCghmaWVsZDEzMRiDASABKAMSEAoIZmll", 
            "bGQxMjcYfyADKAkSEQoIZmllbGQxMjkYgQEgASgFEhEKCGZpZWxkMTMwGIIB", 
            "IAMoAxIYCghmaWVsZDIwNRjNASABKAg6BWZhbHNlEhgKCGZpZWxkMjA2GM4B", 
            "IAEoCDoFZmFsc2UawwIKBkdyb3VwMRIPCgdmaWVsZDExGAsgAigCEg8KB2Zp", 
            "ZWxkMjYYGiABKAISDwoHZmllbGQxMhgMIAEoCRIPCgdmaWVsZDEzGA0gASgJ", 
            "Eg8KB2ZpZWxkMTQYDiADKAkSDwoHZmllbGQxNRgPIAIoBBIOCgZmaWVsZDUY", 
            "BSABKAUSDwoHZmllbGQyNxgbIAEoCRIPCgdmaWVsZDI4GBwgASgFEg8KB2Zp", 
            "ZWxkMjkYHSABKAkSDwoHZmllbGQxNhgQIAEoCRIPCgdmaWVsZDIyGBYgAygJ", 
            "Eg8KB2ZpZWxkNzMYSSADKAUSEgoHZmllbGQyMBgUIAEoBToBMBIPCgdmaWVs", 
            "ZDI0GBggASgJEjgKB2ZpZWxkMzEYHyABKAsyJy5iZW5jaG1hcmtzLlNwZWVk", 
            "TWVzc2FnZTJHcm91cGVkTWVzc2FnZSLfAQobU3BlZWRNZXNzYWdlMkdyb3Vw", 
            "ZWRNZXNzYWdlEg4KBmZpZWxkMRgBIAEoAhIOCgZmaWVsZDIYAiABKAISEQoG", 
            "ZmllbGQzGAMgASgCOgEwEg4KBmZpZWxkNBgEIAEoCBIOCgZmaWVsZDUYBSAB", 
            "KAgSFAoGZmllbGQ2GAYgASgIOgR0cnVlEhUKBmZpZWxkNxgHIAEoCDoFZmFs", 
            "c2USDgoGZmllbGQ4GAggASgCEg4KBmZpZWxkORgJIAEoCBIPCgdmaWVsZDEw", 
            "GAogASgCEg8KB2ZpZWxkMTEYCyABKANCM0ILR29vZ2xlU3BlZWRIAaoCIUdv", 
          "b2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcw=="));
      pbd::FileDescriptor.InternalDescriptorAssigner assigner = delegate(pbd::FileDescriptor root) {
        descriptor = root;
        internal__static_benchmarks_SpeedMessage1__Descriptor = Descriptor.MessageTypes[0];
        internal__static_benchmarks_SpeedMessage1__FieldAccessorTable = 
            new pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.SpeedMessage1, global::Google.ProtocolBuffers.TestProtos.SpeedMessage1.Builder>(internal__static_benchmarks_SpeedMessage1__Descriptor,
                new string[] { "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", });
        internal__static_benchmarks_SpeedMessage1SubMessage__Descriptor = Descriptor.MessageTypes[1];
        internal__static_benchmarks_SpeedMessage1SubMessage__FieldAccessorTable = 
            new pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.SpeedMessage1SubMessage, global::Google.ProtocolBuffers.TestProtos.SpeedMessage1SubMessage.Builder>(internal__static_benchmarks_SpeedMessage1SubMessage__Descriptor,
                new string[] { "Field1", "Field2", "Field3", "Field15", "Field12", "Field13", "Field14", "Field16", "Field19", "Field20", "Field28", "Field21", "Field22", "Field23", "Field206", "Field203", "Field204", "Field205", "Field207", "Field300", });
        internal__static_benchmarks_SpeedMessage2__Descriptor = Descriptor.MessageTypes[2];
        internal__static_benchmarks_SpeedMessage2__FieldAccessorTable = 
            new pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.SpeedMessage2, global::Google.ProtocolBuffers.TestProtos.SpeedMessage2.Builder>(internal__static_benchmarks_SpeedMessage2__Descriptor,
                new string[] { "Field1", "Field3", "Field4", "Field30", "Field75", "Field6", "Field2", "Field21", "Field71", "Field25", "Field109", "Field210", "Field211", "Field212", "Field213", "Field216", "Field217", "Field218", "Field220", "Field221", "Field222", "Field63", "Group1", "Field128", "Field131", "Field127", "Field129", "Field130", "Field205", "Field206", });
        internal__static_benchmarks_SpeedMessage2_Group1__Descriptor = internal__static_benchmarks_SpeedMessage2__Descriptor.NestedTypes[0];
        internal__static_benchmarks_SpeedMessage2_Group1__FieldAccessorTable = 
            new pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.SpeedMessage2.Types.Group1, global::Google.ProtocolBuffers.TestProtos.SpeedMessage2.Types.Group1.Builder>(internal__static_benchmarks_SpeedMessage2_Group1__Descriptor,
                new string[] { "Field11", "Field26", "Field12", "Field13", "Field14", "Field15", "Field5", "Field27", "Field28", "Field29", "Field16", "Field22", "Field73", "Field20", "Field24", "Field31", });
        internal__static_benchmarks_SpeedMessage2GroupedMessage__Descriptor = Descriptor.MessageTypes[3];
        internal__static_benchmarks_SpeedMessage2GroupedMessage__FieldAccessorTable = 
            new pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.SpeedMessage2GroupedMessage, global::Google.ProtocolBuffers.TestProtos.SpeedMessage2GroupedMessage.Builder>(internal__static_benchmarks_SpeedMessage2GroupedMessage__Descriptor,
                new string[] { "Field1", "Field2", "Field3", "Field4", "Field5", "Field6", "Field7", "Field8", "Field9", "Field10", "Field11", });
        pb::ExtensionRegistry registry = pb::ExtensionRegistry.CreateInstance();
        RegisterAllExtensions(registry);
        return registry;
      };
      pbd::FileDescriptor.InternalBuildGeneratedFileFrom(descriptorData,
          new pbd::FileDescriptor[] {
          }, assigner);
    }
    #endregion

  }
  #region Messages
  [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
  public sealed partial class SpeedMessage1 : pb::GeneratedMessage<SpeedMessage1, SpeedMessage1.Builder> {
    private SpeedMessage1() { }
    private static readonly SpeedMessage1 defaultInstance = new SpeedMessage1().MakeReadOnly();
    private static readonly string[] _speedMessage1FieldNames = new string[] { "field1", "field100", "field101", "field102", "field103", "field104", "field12", "field128", "field129", "field13", "field130", "field131", "field14", "field15", "field150", "field16", "field17", "field18", "field2", "field22", "field23", "field24", "field25", "field271", "field272", "field280", "field29", "field3", "field30", "field4", "field5", "field59", "field6", "field60", "field67", "field68", "field7", "field78", "field80", "field81", "field9" };
    private static readonly uint[] _speedMessage1FieldTags = new uint[] { 10, 800, 808, 818, 826, 832, 96, 1024, 1034, 104, 1040, 1048, 112, 122, 1200, 128, 136, 146, 16, 176, 184, 192, 200, 2168, 2176, 2240, 232, 24, 240, 34, 41, 472, 48, 480, 536, 544, 58, 624, 640, 648, 74 };
    public static SpeedMessage1 DefaultInstance {
      get { return defaultInstance; }
    }

    public override SpeedMessage1 DefaultInstanceForType {
      get { return DefaultInstance; }
    }

    protected override SpeedMessage1 ThisMessage {
      get { return this; }
    }

    public static pbd::MessageDescriptor Descriptor {
      get { return global::Google.ProtocolBuffers.TestProtos.GoogleSpeed.internal__static_benchmarks_SpeedMessage1__Descriptor; }
    }

    protected override pb::FieldAccess.FieldAccessorTable<SpeedMessage1, SpeedMessage1.Builder> InternalFieldAccessors {
      get { return global::Google.ProtocolBuffers.TestProtos.GoogleSpeed.internal__static_benchmarks_SpeedMessage1__FieldAccessorTable; }
    }

    public const int Field1FieldNumber = 1;
    private bool hasField1;
    private string field1_ = "";
    public bool HasField1 {
      get { return hasField1; }
    }
    public string Field1 {
      get { return field1_; }
    }

    public const int Field9FieldNumber = 9;
    private bool hasField9;
    private string field9_ = "";
    public bool HasField9 {
      get { return hasField9; }
    }
    public string Field9 {
      get { return field9_; }
    }

    public const int Field18FieldNumber = 18;
    private bool hasField18;
    private string field18_ = "";
    public bool HasField18 {
      get { return hasField18; }
    }
    public string Field18 {
      get { return field18_; }
    }

    public const int Field80FieldNumber = 80;
    private bool hasField80;
    private bool field80_;
    public bool HasField80 {
      get { return hasField80; }
    }
    public bool Field80 {
      get { return field80_; }
    }

    public const int Field81FieldNumber = 81;
    private bool hasField81;
    private bool field81_ = true;
    public bool HasField81 {
      get { return hasField81; }
    }
    public bool Field81 {
      get { return field81_; }
    }

    public const int Field2FieldNumber = 2;
    private bool hasField2;
    private int field2_;
    public bool HasField2 {
      get { return hasField2; }
    }
    public int Field2 {
      get { return field2_; }
    }

    public const int Field3FieldNumber = 3;
    private bool hasField3;
    private int field3_;
    public bool HasField3 {
      get { return hasField3; }
    }
    public int Field3 {
      get { return field3_; }
    }

    public const int Field280FieldNumber = 280;
    private bool hasField280;
    private int field280_;
    public bool HasField280 {
      get { return hasField280; }
    }
    public int Field280 {
      get { return field280_; }
    }

    public const int Field6FieldNumber = 6;
    private bool hasField6;
    private int field6_;
    public bool HasField6 {
      get { return hasField6; }
    }
    public int Field6 {
      get { return field6_; }
    }

    public const int Field22FieldNumber = 22;
    private bool hasField22;
    private long field22_;
    public bool HasField22 {
      get { return hasField22; }
    }
    public long Field22 {
      get { return field22_; }
    }

    public const int Field4FieldNumber = 4;
    private bool hasField4;
    private string field4_ = "";
    public bool HasField4 {
      get { return hasField4; }
    }
    public string Field4 {
      get { return field4_; }
    }

    public const int Field5FieldNumber = 5;
    private pbc::PopsicleList<ulong> field5_ = new pbc::PopsicleList<ulong>();
    public scg::IList<ulong> Field5List {
      get { return pbc::Lists.AsReadOnly(field5_); }
    }
    public int Field5Count {
      get { return field5_.Count; }
    }
    public ulong GetField5(int index) {
      return field5_[index];
    }

    public const int Field59FieldNumber = 59;
    private bool hasField59;
    private bool field59_;
    public bool HasField59 {
      get { return hasField59; }
    }
    public bool Field59 {
      get { return field59_; }
    }

    public const int Field7FieldNumber = 7;
    private bool hasField7;
    private string field7_ = "";
    public bool HasField7 {
      get { return hasField7; }
    }
    public string Field7 {
      get { return field7_; }
    }

    public const int Field16FieldNumber = 16;
    private bool hasField16;
    private int field16_;
    public bool HasField16 {
      get { return hasField16; }
    }
    public int Field16 {
      get { return field16_; }
    }

    public const int Field130FieldNumber = 130;
    private bool hasField130;
    private int field130_;
    public bool HasField130 {
      get { return hasField130; }
    }
    public int Field130 {
      get { return field130_; }
    }

    public const int Field12FieldNumber = 12;
    private bool hasField12;
    private bool field12_ = true;
    public bool HasField12 {
      get { return hasField12; }
    }
    public bool Field12 {
      get { return field12_; }
    }

    public const int Field17FieldNumber = 17;
    private bool hasField17;
    private bool field17_ = true;
    public bool HasField17 {
      get { return hasField17; }
    }
    public bool Field17 {
      get { return field17_; }
    }

    public const int Field13FieldNumber = 13;
    private bool hasField13;
    private bool field13_ = true;
    public bool HasField13 {
      get { return hasField13; }
    }
    public bool Field13 {
      get { return field13_; }
    }

    public const int Field14FieldNumber = 14;
    private bool hasField14;
    private bool field14_ = true;
    public bool HasField14 {
      get { return hasField14; }
    }
    public bool Field14 {
      get { return field14_; }
    }

    public const int Field104FieldNumber = 104;
    private bool hasField104;
    private int field104_;
    public bool HasField104 {
      get { return hasField104; }
    }
    public int Field104 {
      get { return field104_; }
    }

    public const int Field100FieldNumber = 100;
    private bool hasField100;
    private int field100_;
    public bool HasField100 {
      get { return hasField100; }
    }
    public int Field100 {
      get { return field100_; }
    }

    public const int Field101FieldNumber = 101;
    private bool hasField101;
    private int field101_;
    public bool HasField101 {
      get { return hasField101; }
    }
    public int Field101 {
      get { return field101_; }
    }

    public const int Field102FieldNumber = 102;
    private bool hasField102;
    private string field102_ = "";
    public bool HasField102 {
      get { return hasField102; }
    }
    public string Field102 {
      get { return field102_; }
    }

    public const int Field103FieldNumber = 103;
    private bool hasField103;
    private string field103_ = "";
    public bool HasField103 {
      get { return hasField103; }
    }
    public string Field103 {
      get { return field103_; }
    }

    public const int Field29FieldNumber = 29;
    private bool hasField29;
    private int field29_;
    public bool HasField29 {
      get { return hasField29; }
    }
    public int Field29 {
      get { return field29_; }
    }

    public const int Field30FieldNumber = 30;
    private bool hasField30;
    private bool field30_;
    public bool HasField30 {
      get { return hasField30; }
    }
    public bool Field30 {
      get { return field30_; }
    }

    public const int Field60FieldNumber = 60;
    private bool hasField60;
    private int field60_ = -1;
    public bool HasField60 {
      get { return hasField60; }
    }
    public int Field60 {
      get { return field60_; }
    }

    public const int Field271FieldNumber = 271;
    private bool hasField271;
    private int field271_ = -1;
    public bool HasField271 {
      get { return hasField271; }
    }
    public int Field271 {
      get { return field271_; }
    }

    public const int Field272FieldNumber = 272;
    private bool hasField272;
    private int field272_ = -1;
    public bool HasField272 {
      get { return hasField272; }
    }
    public int Field272 {
      get { return field272_; }
    }

    public const int Field150FieldNumber = 150;
    private bool hasField150;
    private int field150_;
    public bool HasField150 {
      get { return hasField150; }
    }
    public int Field150 {
      get { return field150_; }
    }

    public const int Field23FieldNumber = 23;
    private bool hasField23;
    private int field23_;
    public bool HasField23 {
      get { return hasField23; }
    }
    public int Field23 {
      get { return field23_; }
    }

    public const int Field24FieldNumber = 24;
    private bool hasField24;
    private bool field24_;
    public bool HasField24 {
      get { return hasField24; }
    }
    public bool Field24 {
      get { return field24_; }
    }

    public const int Field25FieldNumber = 25;
    private bool hasField25;
    private int field25_;
    public bool HasField25 {
      get { return hasField25; }
    }
    public int Field25 {
      get { return field25_; }
    }

    public const int Field15FieldNumber = 15;
    private bool hasField15;
    private global::Google.ProtocolBuffers.TestProtos.SpeedMessage1SubMessage field15_;
    public bool HasField15 {
      get { return hasField15; }
    }
    public global::Google.ProtocolBuffers.TestProtos.SpeedMessage1SubMessage Field15 {
      get { return field15_ ?? global::Google.ProtocolBuffers.TestProtos.SpeedMessage1SubMessage.DefaultInstance; }
    }

    public const int Field78FieldNumber = 78;
    private bool hasField78;
    private bool field78_;
    public bool HasField78 {
      get { return hasField78; }
    }
    public bool Field78 {
      get { return field78_; }
    }

    public const int Field67FieldNumber = 67;
    private bool hasField67;
    private int field67_;
    public bool HasField67 {
      get { return hasField67; }
    }
    public int Field67 {
      get { return field67_; }
    }

    public const int Field68FieldNumber = 68;
    private bool hasField68;
    private int field68_;
    public bool HasField68 {
      get { return hasField68; }
    }
    public int Field68 {
      get { return field68_; }
    }

    public const int Field128FieldNumber = 128;
    private bool hasField128;
    private int field128_;
    public bool HasField128 {
      get { return hasField128; }
    }
    public int Field128 {
      get { return field128_; }
    }

    public const int Field129FieldNumber = 129;
    private bool hasField129;
    private string field129_ = "xxxxxxxxxxxxxxxxxxxxx";
    public bool HasField129 {
      get { return hasField129; }
    }
    public string Field129 {
      get { return field129_; }
    }

    public const int Field131FieldNumber = 131;
    private bool hasField131;
    private int field131_;
    public bool HasField131 {
      get { return hasField131; }
    }
    public int Field131 {
      get { return field131_; }
    }

    public override bool IsInitialized {
      get {
        if (!hasField1) return false;
        if (!hasField2) return false;
        if (!hasField3) return false;
        return true;
      }
    }

    public override void WriteTo(pb::ICodedOutputStream output) {
      CalcSerializedSize();
      string[] field_names = _speedMessage1FieldNames;
      if (hasField1) {
        output.WriteString(1, field_names[0], Field1);
      }
      if (hasField2) {
        output.WriteInt32(2, field_names[18], Field2);
      }
      if (hasField3) {
        output.WriteInt32(3, field_names[27], Field3);
      }
      if (hasField4) {
        output.WriteString(4, field_names[29], Field4);
      }
      if (field5_.Count > 0) {
        output.WriteFixed64Array(5, field_names[30], field5_);
      }
      if (hasField6) {
        output.WriteInt32(6, field_names[32], Field6);
      }
      if (hasField7) {
        output.WriteString(7, field_names[36], Field7);
      }
      if (hasField9) {
        output.WriteString(9, field_names[40], Field9);
      }
      if (hasField12) {
        output.WriteBool(12, field_names[6], Field12);
      }
      if (hasField13) {
        output.WriteBool(13, field_names[9], Field13);
      }
      if (hasField14) {
        output.WriteBool(14, field_names[12], Field14);
      }
      if (hasField15) {
        output.WriteMessage(15, field_names[13], Field15);
      }
      if (hasField16) {
        output.WriteInt32(16, field_names[15], Field16);
      }
      if (hasField17) {
        output.WriteBool(17, field_names[16], Field17);
      }
      if (hasField18) {
        output.WriteString(18, field_names[17], Field18);
      }
      if (hasField22) {
        output.WriteInt64(22, field_names[19], Field22);
      }
      if (hasField23) {
        output.WriteInt32(23, field_names[20], Field23);
      }
      if (hasField24) {
        output.WriteBool(24, field_names[21], Field24);
      }
      if (hasField25) {
        output.WriteInt32(25, field_names[22], Field25);
      }
      if (hasField29) {
        output.WriteInt32(29, field_names[26], Field29);
      }
      if (hasField30) {
        output.WriteBool(30, field_names[28], Field30);
      }
      if (hasField59) {
        output.WriteBool(59, field_names[31], Field59);
      }
      if (hasField60) {
        output.WriteInt32(60, field_names[33], Field60);
      }
      if (hasField67) {
        output.WriteInt32(67, field_names[34], Field67);
      }
      if (hasField68) {
        output.WriteInt32(68, field_names[35], Field68);
      }
      if (hasField78) {
        output.WriteBool(78, field_names[37], Field78);
      }
      if (hasField80) {
        output.WriteBool(80, field_names[38], Field80);
      }
      if (hasField81) {
        output.WriteBool(81, field_names[39], Field81);
      }
      if (hasField100) {
        output.WriteInt32(100, field_names[1], Field100);
      }
      if (hasField101) {
        output.WriteInt32(101, field_names[2], Field101);
      }
      if (hasField102) {
        output.WriteString(102, field_names[3], Field102);
      }
      if (hasField103) {
        output.WriteString(103, field_names[4], Field103);
      }
      if (hasField104) {
        output.WriteInt32(104, field_names[5], Field104);
      }
      if (hasField128) {
        output.WriteInt32(128, field_names[7], Field128);
      }
      if (hasField129) {
        output.WriteString(129, field_names[8], Field129);
      }
      if (hasField130) {
        output.WriteInt32(130, field_names[10], Field130);
      }
      if (hasField131) {
        output.WriteInt32(131, field_names[11], Field131);
      }
      if (hasField150) {
        output.WriteInt32(150, field_names[14], Field150);
      }
      if (hasField271) {
        output.WriteInt32(271, field_names[23], Field271);
      }
      if (hasField272) {
        output.WriteInt32(272, field_names[24], Field272);
      }
      if (hasField280) {
        output.WriteInt32(280, field_names[25], Field280);
      }
      UnknownFields.WriteTo(output);
    }

    private int memoizedSerializedSize = -1;
    public override int SerializedSize {
      get {
        int size = memoizedSerializedSize;
        if (size != -1) return size;
        return CalcSerializedSize();
      }
    }

    private int CalcSerializedSize() {
      int size = memoizedSerializedSize;
      if (size != -1) return size;

      size = 0;
      if (hasField1) {
        size += pb::CodedOutputStream.ComputeStringSize(1, Field1);
      }
      if (hasField9) {
        size += pb::CodedOutputStream.ComputeStringSize(9, Field9);
      }
      if (hasField18) {
        size += pb::CodedOutputStream.ComputeStringSize(18, Field18);
      }
      if (hasField80) {
        size += pb::CodedOutputStream.ComputeBoolSize(80, Field80);
      }
      if (hasField81) {
        size += pb::CodedOutputStream.ComputeBoolSize(81, Field81);
      }
      if (hasField2) {
        size += pb::CodedOutputStream.ComputeInt32Size(2, Field2);
      }
      if (hasField3) {
        size += pb::CodedOutputStream.ComputeInt32Size(3, Field3);
      }
      if (hasField280) {
        size += pb::CodedOutputStream.ComputeInt32Size(280, Field280);
      }
      if (hasField6) {
        size += pb::CodedOutputStream.ComputeInt32Size(6, Field6);
      }
      if (hasField22) {
        size += pb::CodedOutputStream.ComputeInt64Size(22, Field22);
      }
      if (hasField4) {
        size += pb::CodedOutputStream.ComputeStringSize(4, Field4);
      }
      {
        int dataSize = 0;
        dataSize = 8 * field5_.Count;
        size += dataSize;
        size += 1 * field5_.Count;
      }
      if (hasField59) {
        size += pb::CodedOutputStream.ComputeBoolSize(59, Field59);
      }
      if (hasField7) {
        size += pb::CodedOutputStream.ComputeStringSize(7, Field7);
      }
      if (hasField16) {
        size += pb::CodedOutputStream.ComputeInt32Size(16, Field16);
      }
      if (hasField130) {
        size += pb::CodedOutputStream.ComputeInt32Size(130, Field130);
      }
      if (hasField12) {
        size += pb::CodedOutputStream.ComputeBoolSize(12, Field12);
      }
      if (hasField17) {
        size += pb::CodedOutputStream.ComputeBoolSize(17, Field17);
      }
      if (hasField13) {
        size += pb::CodedOutputStream.ComputeBoolSize(13, Field13);
      }
      if (hasField14) {
        size += pb::CodedOutputStream.ComputeBoolSize(14, Field14);
      }
      if (hasField104) {
        size += pb::CodedOutputStream.ComputeInt32Size(104, Field104);
      }
      if (hasField100) {
        size += pb::CodedOutputStream.ComputeInt32Size(100, Field100);
      }
      if (hasField101) {
        size += pb::CodedOutputStream.ComputeInt32Size(101, Field101);
      }
      if (hasField102) {
        size += pb::CodedOutputStream.ComputeStringSize(102, Field102);
      }
      if (hasField103) {
        size += pb::CodedOutputStream.ComputeStringSize(103, Field103);
      }
      if (hasField29) {
        size += pb::CodedOutputStream.ComputeInt32Size(29, Field29);
      }
      if (hasField30) {
        size += pb::CodedOutputStream.ComputeBoolSize(30, Field30);
      }
      if (hasField60) {
        size += pb::CodedOutputStream.ComputeInt32Size(60, Field60);
      }
      if (hasField271) {
        size += pb::CodedOutputStream.ComputeInt32Size(271, Field271);
      }
      if (hasField272) {
        size += pb::CodedOutputStream.ComputeInt32Size(272, Field272);
      }
      if (hasField150) {
        size += pb::CodedOutputStream.ComputeInt32Size(150, Field150);
      }
      if (hasField23) {
        size += pb::CodedOutputStream.ComputeInt32Size(23, Field23);
      }
      if (hasField24) {
        size += pb::CodedOutputStream.ComputeBoolSize(24, Field24);
      }
      if (hasField25) {
        size += pb::CodedOutputStream.ComputeInt32Size(25, Field25);
      }
      if (hasField15) {
        size += pb::CodedOutputStream.ComputeMessageSize(15, Field15);
      }
      if (hasField78) {
        size += pb::CodedOutputStream.ComputeBoolSize(78, Field78);
      }
      if (hasField67) {
        size += pb::CodedOutputStream.ComputeInt32Size(67, Field67);
      }
      if (hasField68) {
        size += pb::CodedOutputStream.ComputeInt32Size(68, Field68);
      }
      if (hasField128) {
        size += pb::CodedOutputStream.ComputeInt32Size(128, Field128);
      }
      if (hasField129) {
        size += pb::CodedOutputStream.ComputeStringSize(129, Field129);
      }
      if (hasField131) {
        size += pb::CodedOutputStream.ComputeInt32Size(131, Field131);
      }
      size += UnknownFields.SerializedSize;
      memoizedSerializedSize = size;
      return size;
    }
    public static SpeedMessage1 ParseFrom(pb::ByteString data) {
      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
    }
    public static SpeedMessage1 ParseFrom(pb::ByteString data, pb::ExtensionRegistry extensionRegistry) {
      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
    }
    public static SpeedMessage1 ParseFrom(byte[] data) {
      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
    }
    public static SpeedMessage1 ParseFrom(byte[] data, pb::ExtensionRegistry extensionRegistry) {
      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
    }
    public static SpeedMessage1 ParseFrom(global::System.IO.Stream input) {
      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
    }
    public static SpeedMessage1 ParseFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
    }
    public static SpeedMessage1 ParseDelimitedFrom(global::System.IO.Stream input) {
      return CreateBuilder().MergeDelimitedFrom(input).BuildParsed();
    }
    public static SpeedMessage1 ParseDelimitedFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
      return CreateBuilder().MergeDelimitedFrom(input, extensionRegistry).BuildParsed();
    }
    public static SpeedMessage1 ParseFrom(pb::ICodedInputStream input) {
      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
    }
    public static SpeedMessage1 ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
    }
    private SpeedMessage1 MakeReadOnly() {
      field5_.MakeReadOnly();
      return this;
    }

    public static Builder CreateBuilder() { return new Builder(); }
    public override Builder ToBuilder() { return CreateBuilder(this); }
    public override Builder CreateBuilderForType() { return new Builder(); }
    public static Builder CreateBuilder(SpeedMessage1 prototype) {
      return new Builder(prototype);
    }

    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
    public sealed partial class Builder : pb::GeneratedBuilder<SpeedMessage1, Builder> {
      protected override Builder ThisBuilder {
        get { return this; }
      }
      public Builder() {
        result = DefaultInstance;
        resultIsReadOnly = true;
      }
      internal Builder(SpeedMessage1 cloneFrom) {
        result = cloneFrom;
        resultIsReadOnly = true;
      }

      private bool resultIsReadOnly;
      private SpeedMessage1 result;

      private SpeedMessage1 PrepareBuilder() {
        if (resultIsReadOnly) {
          SpeedMessage1 original = result;
          result = new SpeedMessage1();
          resultIsReadOnly = false;
          MergeFrom(original);
        }
        return result;
      }

      public override bool IsInitialized {
        get { return result.IsInitialized; }
      }

      protected override SpeedMessage1 MessageBeingBuilt {
        get { return PrepareBuilder(); }
      }

      public override Builder Clear() {
        result = DefaultInstance;
        resultIsReadOnly = true;
        return this;
      }

      public override Builder Clone() {
        if (resultIsReadOnly) {
          return new Builder(result);
        } else {
          return new Builder().MergeFrom(result);
        }
      }

      public override pbd::MessageDescriptor DescriptorForType {
        get { return global::Google.ProtocolBuffers.TestProtos.SpeedMessage1.Descriptor; }
      }

      public override SpeedMessage1 DefaultInstanceForType {
        get { return global::Google.ProtocolBuffers.TestProtos.SpeedMessage1.DefaultInstance; }
      }

      public override SpeedMessage1 BuildPartial() {
        if (resultIsReadOnly) {
          return result;
        }
        resultIsReadOnly = true;
        return result.MakeReadOnly();
      }

      public override Builder MergeFrom(pb::IMessage other) {
        if (other is SpeedMessage1) {
          return MergeFrom((SpeedMessage1) other);
        } else {
          base.MergeFrom(other);
          return this;
        }
      }

      public override Builder MergeFrom(SpeedMessage1 other) {
        if (other == global::Google.ProtocolBuffers.TestProtos.SpeedMessage1.DefaultInstance) return this;
        PrepareBuilder();
        if (other.HasField1) {
          Field1 = other.Field1;
        }
        if (other.HasField9) {
          Field9 = other.Field9;
        }
        if (other.HasField18) {
          Field18 = other.Field18;
        }
        if (other.HasField80) {
          Field80 = other.Field80;
        }
        if (other.HasField81) {
          Field81 = other.Field81;
        }
        if (other.HasField2) {
          Field2 = other.Field2;
        }
        if (other.HasField3) {
          Field3 = other.Field3;
        }
        if (other.HasField280) {
          Field280 = other.Field280;
        }
        if (other.HasField6) {
          Field6 = other.Field6;
        }
        if (other.HasField22) {
          Field22 = other.Field22;
        }
        if (other.HasField4) {
          Field4 = other.Field4;
        }
        if (other.field5_.Count != 0) {
          result.field5_.Add(other.field5_);
        }
        if (other.HasField59) {
          Field59 = other.Field59;
        }
        if (other.HasField7) {
          Field7 = other.Field7;
        }
        if (other.HasField16) {
          Field16 = other.Field16;
        }
        if (other.HasField130) {
          Field130 = other.Field130;
        }
        if (other.HasField12) {
          Field12 = other.Field12;
        }
        if (other.HasField17) {
          Field17 = other.Field17;
        }
        if (other.HasField13) {
          Field13 = other.Field13;
        }
        if (other.HasField14) {
          Field14 = other.Field14;
        }
        if (other.HasField104) {
          Field104 = other.Field104;
        }
        if (other.HasField100) {
          Field100 = other.Field100;
        }
        if (other.HasField101) {
          Field101 = other.Field101;
        }
        if (other.HasField102) {
          Field102 = other.Field102;
        }
        if (other.HasField103) {
          Field103 = other.Field103;
        }
        if (other.HasField29) {
          Field29 = other.Field29;
        }
        if (other.HasField30) {
          Field30 = other.Field30;
        }
        if (other.HasField60) {
          Field60 = other.Field60;
        }
        if (other.HasField271) {
          Field271 = other.Field271;
        }
        if (other.HasField272) {
          Field272 = other.Field272;
        }
        if (other.HasField150) {
          Field150 = other.Field150;
        }
        if (other.HasField23) {
          Field23 = other.Field23;
        }
        if (other.HasField24) {
          Field24 = other.Field24;
        }
        if (other.HasField25) {
          Field25 = other.Field25;
        }
        if (other.HasField15) {
          MergeField15(other.Field15);
        }
        if (other.HasField78) {
          Field78 = other.Field78;
        }
        if (other.HasField67) {
          Field67 = other.Field67;
        }
        if (other.HasField68) {
          Field68 = other.Field68;
        }
        if (other.HasField128) {
          Field128 = other.Field128;
        }
        if (other.HasField129) {
          Field129 = other.Field129;
        }
        if (other.HasField131) {
          Field131 = other.Field131;
        }
        this.MergeUnknownFields(other.UnknownFields);
        return this;
      }

      public override Builder MergeFrom(pb::ICodedInputStream input) {
        return MergeFrom(input, pb::ExtensionRegistry.Empty);
      }

      public override Builder MergeFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
        PrepareBuilder();
        pb::UnknownFieldSet.Builder unknownFields = null;
        uint tag;
        string field_name;
        while (input.ReadTag(out tag, out field_name)) {
          if(tag == 0 && field_name != null) {
            int field_ordinal = global::System.Array.BinarySearch(_speedMessage1FieldNames, field_name, global::System.StringComparer.Ordinal);
            if(field_ordinal >= 0)
              tag = _speedMessage1FieldTags[field_ordinal];
            else {
              if (unknownFields == null) {
                unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
              }
              ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name);
              continue;
            }
          }
          switch (tag) {
            case 0: {
              throw pb::InvalidProtocolBufferException.InvalidTag();
            }
            default: {
              if (pb::WireFormat.IsEndGroupTag(tag)) {
                if (unknownFields != null) {
                  this.UnknownFields = unknownFields.Build();
                }
                return this;
              }
              if (unknownFields == null) {
                unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
              }
              ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name);
              break;
            }
            case 10: {
              result.hasField1 = input.ReadString(ref result.field1_);
              break;
            }
            case 16: {
              result.hasField2 = input.ReadInt32(ref result.field2_);
              break;
            }
            case 24: {
              result.hasField3 = input.ReadInt32(ref result.field3_);
              break;
            }
            case 34: {
              result.hasField4 = input.ReadString(ref result.field4_);
              break;
            }
            case 42:
            case 41: {
              input.ReadFixed64Array(tag, field_name, result.field5_);
              break;
            }
            case 48: {
              result.hasField6 = input.ReadInt32(ref result.field6_);
              break;
            }
            case 58: {
              result.hasField7 = input.ReadString(ref result.field7_);
              break;
            }
            case 74: {
              result.hasField9 = input.ReadString(ref result.field9_);
              break;
            }
            case 96: {
              result.hasField12 = input.ReadBool(ref result.field12_);
              break;
            }
            case 104: {
              result.hasField13 = input.ReadBool(ref result.field13_);
              break;
            }
            case 112: {
              result.hasField14 = input.ReadBool(ref result.field14_);
              break;
            }
            case 122: {
              global::Google.ProtocolBuffers.TestProtos.SpeedMessage1SubMessage.Builder subBuilder = global::Google.ProtocolBuffers.TestProtos.SpeedMessage1SubMessage.CreateBuilder();
              if (result.hasField15) {
                subBuilder.MergeFrom(Field15);
              }
              input.ReadMessage(subBuilder, extensionRegistry);
              Field15 = subBuilder.BuildPartial();
              break;
            }
            case 128: {
              result.hasField16 = input.ReadInt32(ref result.field16_);
              break;
            }
            case 136: {
              result.hasField17 = input.ReadBool(ref result.field17_);
              break;
            }
            case 146: {
              result.hasField18 = input.ReadString(ref result.field18_);
              break;
            }
            case 176: {
              result.hasField22 = input.ReadInt64(ref result.field22_);
              break;
            }
            case 184: {
              result.hasField23 = input.ReadInt32(ref result.field23_);
              break;
            }
            case 192: {
              result.hasField24 = input.ReadBool(ref result.field24_);
              break;
            }
            case 200: {
              result.hasField25 = input.ReadInt32(ref result.field25_);
              break;
            }
            case 232: {
              result.hasField29 = input.ReadInt32(ref result.field29_);
              break;
            }
            case 240: {
              result.hasField30 = input.ReadBool(ref result.field30_);
              break;
            }
            case 472: {
              result.hasField59 = input.ReadBool(ref result.field59_);
              break;
            }
            case 480: {
              result.hasField60 = input.ReadInt32(ref result.field60_);
              break;
            }
            case 536: {
              result.hasField67 = input.ReadInt32(ref result.field67_);
              break;
            }
            case 544: {
              result.hasField68 = input.ReadInt32(ref result.field68_);
              break;
            }
            case 624: {
              result.hasField78 = input.ReadBool(ref result.field78_);
              break;
            }
            case 640: {
              result.hasField80 = input.ReadBool(ref result.field80_);
              break;
            }
            case 648: {
              result.hasField81 = input.ReadBool(ref result.field81_);
              break;
            }
            case 800: {
              result.hasField100 = input.ReadInt32(ref result.field100_);
              break;
            }
            case 808: {
              result.hasField101 = input.ReadInt32(ref result.field101_);
              break;
            }
            case 818: {
              result.hasField102 = input.ReadString(ref result.field102_);
              break;
            }
            case 826: {
              result.hasField103 = input.ReadString(ref result.field103_);
              break;
            }
            case 832: {
              result.hasField104 = input.ReadInt32(ref result.field104_);
              break;
            }
            case 1024: {
              result.hasField128 = input.ReadInt32(ref result.field128_);
              break;
            }
            case 1034: {
              result.hasField129 = input.ReadString(ref result.field129_);
              break;
            }
            case 1040: {
              result.hasField130 = input.ReadInt32(ref result.field130_);
              break;
            }
            case 1048: {
              result.hasField131 = input.ReadInt32(ref result.field131_);
              break;
            }
            case 1200: {
              result.hasField150 = input.ReadInt32(ref result.field150_);
              break;
            }
            case 2168: {
              result.hasField271 = input.ReadInt32(ref result.field271_);
              break;
            }
            case 2176: {
              result.hasField272 = input.ReadInt32(ref result.field272_);
              break;
            }
            case 2240: {
              result.hasField280 = input.ReadInt32(ref result.field280_);
              break;
            }
          }
        }

        if (unknownFields != null) {
          this.UnknownFields = unknownFields.Build();
        }
        return this;
      }


      public bool HasField1 {
        get { return result.hasField1; }
      }
      public string Field1 {
        get { return result.Field1; }
        set { SetField1(value); }
      }
      public Builder SetField1(string value) {
        pb::ThrowHelper.ThrowIfNull(value, "value");
        PrepareBuilder();
        result.hasField1 = true;
        result.field1_ = value;
        return this;
      }
      public Builder ClearField1() {
        PrepareBuilder();
        result.hasField1 = false;
        result.field1_ = "";
        return this;
      }

      public bool HasField9 {
        get { return result.hasField9; }
      }
      public string Field9 {
        get { return result.Field9; }
        set { SetField9(value); }
      }
      public Builder SetField9(string value) {
        pb::ThrowHelper.ThrowIfNull(value, "value");
        PrepareBuilder();
        result.hasField9 = true;
        result.field9_ = value;
        return this;
      }
      public Builder ClearField9() {
        PrepareBuilder();
        result.hasField9 = false;
        result.field9_ = "";
        return this;
      }

      public bool HasField18 {
        get { return result.hasField18; }
      }
      public string Field18 {
        get { return result.Field18; }
        set { SetField18(value); }
      }
      public Builder SetField18(string value) {
        pb::ThrowHelper.ThrowIfNull(value, "value");
        PrepareBuilder();
        result.hasField18 = true;
        result.field18_ = value;
        return this;
      }
      public Builder ClearField18() {
        PrepareBuilder();
        result.hasField18 = false;
        result.field18_ = "";
        return this;
      }

      public bool HasField80 {
        get { return result.hasField80; }
      }
      public bool Field80 {
        get { return result.Field80; }
        set { SetField80(value); }
      }
      public Builder SetField80(bool value) {
        PrepareBuilder();
        result.hasField80 = true;
        result.field80_ = value;
        return this;
      }
      public Builder ClearField80() {
        PrepareBuilder();
        result.hasField80 = false;
        result.field80_ = false;
        return this;
      }

      public bool HasField81 {
        get { return result.hasField81; }
      }
      public bool Field81 {
        get { return result.Field81; }
        set { SetField81(value); }
      }
      public Builder SetField81(bool value) {
        PrepareBuilder();
        result.hasField81 = true;
        result.field81_ = value;
        return this;
      }
      public Builder ClearField81() {
        PrepareBuilder();
        result.hasField81 = false;
        result.field81_ = true;
        return this;
      }

      public bool HasField2 {
        get { return result.hasField2; }
      }
      public int Field2 {
        get { return result.Field2; }
        set { SetField2(value); }
      }
      public Builder SetField2(int value) {
        PrepareBuilder();
        result.hasField2 = true;
        result.field2_ = value;
        return this;
      }
      public Builder ClearField2() {
        PrepareBuilder();
        result.hasField2 = false;
        result.field2_ = 0;
        return this;
      }

      public bool HasField3 {
        get { return result.hasField3; }
      }
      public int Field3 {
        get { return result.Field3; }
        set { SetField3(value); }
      }
      public Builder SetField3(int value) {
        PrepareBuilder();
        result.hasField3 = true;
        result.field3_ = value;
        return this;
      }
      public Builder ClearField3() {
        PrepareBuilder();
        result.hasField3 = false;
        result.field3_ = 0;
        return this;
      }

      public bool HasField280 {
        get { return result.hasField280; }
      }
      public int Field280 {
        get { return result.Field280; }
        set { SetField280(value); }
      }
      public Builder SetField280(int value) {
        PrepareBuilder();
        result.hasField280 = true;
        result.field280_ = value;
        return this;
      }
      public Builder ClearField280() {
        PrepareBuilder();
        result.hasField280 = false;
        result.field280_ = 0;
        return this;
      }

      public bool HasField6 {
        get { return result.hasField6; }
      }
      public int Field6 {
        get { return result.Field6; }
        set { SetField6(value); }
      }
      public Builder SetField6(int value) {
        PrepareBuilder();
        result.hasField6 = true;
        result.field6_ = value;
        return this;
      }
      public Builder ClearField6() {
        PrepareBuilder();
        result.hasField6 = false;
        result.field6_ = 0;
        return this;
      }

      public bool HasField22 {
        get { return result.hasField22; }
      }
      public long Field22 {
        get { return result.Field22; }
        set { SetField22(value); }
      }
      public Builder SetField22(long value) {
        PrepareBuilder();
        result.hasField22 = true;
        result.field22_ = value;
        return this;
      }
      public Builder ClearField22() {
        PrepareBuilder();
        result.hasField22 = false;
        result.field22_ = 0L;
        return this;
      }

      public bool HasField4 {
        get { return result.hasField4; }
      }
      public string Field4 {
        get { return result.Field4; }
        set { SetField4(value); }
      }
      public Builder SetField4(string value) {
        pb::ThrowHelper.ThrowIfNull(value, "value");
        PrepareBuilder();
        result.hasField4 = true;
        result.field4_ = value;
        return this;
      }
      public Builder ClearField4() {
        PrepareBuilder();
        result.hasField4 = false;
        result.field4_ = "";
        return this;
      }

      public pbc::IPopsicleList<ulong> Field5List {
        get { return PrepareBuilder().field5_; }
      }
      public int Field5Count {
        get { return result.Field5Count; }
      }
      public ulong GetField5(int index) {
        return result.GetField5(index);
      }
      public Builder SetField5(int index, ulong value) {
        PrepareBuilder();
        result.field5_[index] = value;
        return this;
      }
      public Builder AddField5(ulong value) {
        PrepareBuilder();
        result.field5_.Add(value);
        return this;
      }
      public Builder AddRangeField5(scg::IEnumerable<ulong> values) {
        PrepareBuilder();
        result.field5_.Add(values);
        return this;
      }
      public Builder ClearField5() {
        PrepareBuilder();
        result.field5_.Clear();
        return this;
      }

      public bool HasField59 {
        get { return result.hasField59; }
      }
      public bool Field59 {
        get { return result.Field59; }
        set { SetField59(value); }
      }
      public Builder SetField59(bool value) {
        PrepareBuilder();
        result.hasField59 = true;
        result.field59_ = value;
        return this;
      }
      public Builder ClearField59() {
        PrepareBuilder();
        result.hasField59 = false;
        result.field59_ = false;
        return this;
      }

      public bool HasField7 {
        get { return result.hasField7; }
      }
      public string Field7 {
        get { return result.Field7; }
        set { SetField7(value); }
      }
      public Builder SetField7(string value) {
        pb::ThrowHelper.ThrowIfNull(value, "value");
        PrepareBuilder();
        result.hasField7 = true;
        result.field7_ = value;
        return this;
      }
      public Builder ClearField7() {
        PrepareBuilder();
        result.hasField7 = false;
        result.field7_ = "";
        return this;
      }

      public bool HasField16 {
        get { return result.hasField16; }
      }
      public int Field16 {
        get { return result.Field16; }
        set { SetField16(value); }
      }
      public Builder SetField16(int value) {
        PrepareBuilder();
        result.hasField16 = true;
        result.field16_ = value;
        return this;
      }
      public Builder ClearField16() {
        PrepareBuilder();
        result.hasField16 = false;
        result.field16_ = 0;
        return this;
      }

      public bool HasField130 {
        get { return result.hasField130; }
      }
      public int Field130 {
        get { return result.Field130; }
        set { SetField130(value); }
      }
      public Builder SetField130(int value) {
        PrepareBuilder();
        result.hasField130 = true;
        result.field130_ = value;
        return this;
      }
      public Builder ClearField130() {
        PrepareBuilder();
        result.hasField130 = false;
        result.field130_ = 0;
        return this;
      }

      public bool HasField12 {
        get { return result.hasField12; }
      }
      public bool Field12 {
        get { return result.Field12; }
        set { SetField12(value); }
      }
      public Builder SetField12(bool value) {
        PrepareBuilder();
        result.hasField12 = true;
        result.field12_ = value;
        return this;
      }
      public Builder ClearField12() {
        PrepareBuilder();
        result.hasField12 = false;
        result.field12_ = true;
        return this;
      }

      public bool HasField17 {
        get { return result.hasField17; }
      }
      public bool Field17 {
        get { return result.Field17; }
        set { SetField17(value); }
      }
      public Builder SetField17(bool value) {
        PrepareBuilder();
        result.hasField17 = true;
        result.field17_ = value;
        return this;
      }
      public Builder ClearField17() {
        PrepareBuilder();
        result.hasField17 = false;
        result.field17_ = true;
        return this;
      }

      public bool HasField13 {
        get { return result.hasField13; }
      }
      public bool Field13 {
        get { return result.Field13; }
        set { SetField13(value); }
      }
      public Builder SetField13(bool value) {
        PrepareBuilder();
        result.hasField13 = true;
        result.field13_ = value;
        return this;
      }
      public Builder ClearField13() {
        PrepareBuilder();
        result.hasField13 = false;
        result.field13_ = true;
        return this;
      }

      public bool HasField14 {
        get { return result.hasField14; }
      }
      public bool Field14 {
        get { return result.Field14; }
        set { SetField14(value); }
      }
      public Builder SetField14(bool value) {
        PrepareBuilder();
        result.hasField14 = true;
        result.field14_ = value;
        return this;
      }
      public Builder ClearField14() {
        PrepareBuilder();
        result.hasField14 = false;
        result.field14_ = true;
        return this;
      }

      public bool HasField104 {
        get { return result.hasField104; }
      }
      public int Field104 {
        get { return result.Field104; }
        set { SetField104(value); }
      }
      public Builder SetField104(int value) {
        PrepareBuilder();
        result.hasField104 = true;
        result.field104_ = value;
        return this;
      }
      public Builder ClearField104() {
        PrepareBuilder();
        result.hasField104 = false;
        result.field104_ = 0;
        return this;
      }

      public bool HasField100 {
        get { return result.hasField100; }
      }
      public int Field100 {
        get { return result.Field100; }
        set { SetField100(value); }
      }
      public Builder SetField100(int value) {
        PrepareBuilder();
        result.hasField100 = true;
        result.field100_ = value;
        return this;
      }
      public Builder ClearField100() {
        PrepareBuilder();
        result.hasField100 = false;
        result.field100_ = 0;
        return this;
      }

      public bool HasField101 {
        get { return result.hasField101; }
      }
      public int Field101 {
        get { return result.Field101; }
        set { SetField101(value); }
      }
      public Builder SetField101(int value) {
        PrepareBuilder();
        result.hasField101 = true;
        result.field101_ = value;
        return this;
      }
      public Builder ClearField101() {
        PrepareBuilder();
        result.hasField101 = false;
        result.field101_ = 0;
        return this;
      }

      public bool HasField102 {
        get { return result.hasField102; }
      }
      public string Field102 {
        get { return result.Field102; }
        set { SetField102(value); }
      }
      public Builder SetField102(string value) {
        pb::ThrowHelper.ThrowIfNull(value, "value");
        PrepareBuilder();
        result.hasField102 = true;
        result.field102_ = value;
        return this;
      }
      public Builder ClearField102() {
        PrepareBuilder();
        result.hasField102 = false;
        result.field102_ = "";
        return this;
      }

      public bool HasField103 {
        get { return result.hasField103; }
      }
      public string Field103 {
        get { return result.Field103; }
        set { SetField103(value); }
      }
      public Builder SetField103(string value) {
        pb::ThrowHelper.ThrowIfNull(value, "value");
        PrepareBuilder();
        result.hasField103 = true;
        result.field103_ = value;
        return this;
      }
      public Builder ClearField103() {
        PrepareBuilder();
        result.hasField103 = false;
        result.field103_ = "";
        return this;
      }

      public bool HasField29 {
        get { return result.hasField29; }
      }
      public int Field29 {
        get { return result.Field29; }
        set { SetField29(value); }
      }
      public Builder SetField29(int value) {
        PrepareBuilder();
        result.hasField29 = true;
        result.field29_ = value;
        return this;
      }
      public Builder ClearField29() {
        PrepareBuilder();
        result.hasField29 = false;
        result.field29_ = 0;
        return this;
      }

      public bool HasField30 {
        get { return result.hasField30; }
      }
      public bool Field30 {
        get { return result.Field30; }
        set { SetField30(value); }
      }
      public Builder SetField30(bool value) {
        PrepareBuilder();
        result.hasField30 = true;
        result.field30_ = value;
        return this;
      }
      public Builder ClearField30() {
        PrepareBuilder();
        result.hasField30 = false;
        result.field30_ = false;
        return this;
      }

      public bool HasField60 {
        get { return result.hasField60; }
      }
      public int Field60 {
        get { return result.Field60; }
        set { SetField60(value); }
      }
      public Builder SetField60(int value) {
        PrepareBuilder();
        result.hasField60 = true;
        result.field60_ = value;
        return this;
      }
      public Builder ClearField60() {
        PrepareBuilder();
        result.hasField60 = false;
        result.field60_ = -1;
        return this;
      }

      public bool HasField271 {
        get { return result.hasField271; }
      }
      public int Field271 {
        get { return result.Field271; }
        set { SetField271(value); }
      }
      public Builder SetField271(int value) {
        PrepareBuilder();
        result.hasField271 = true;
        result.field271_ = value;
        return this;
      }
      public Builder ClearField271() {
        PrepareBuilder();
        result.hasField271 = false;
        result.field271_ = -1;
        return this;
      }

      public bool HasField272 {
        get { return result.hasField272; }
      }
      public int Field272 {
        get { return result.Field272; }
        set { SetField272(value); }
      }
      public Builder SetField272(int value) {
        PrepareBuilder();
        result.hasField272 = true;
        result.field272_ = value;
        return this;
      }
      public Builder ClearField272() {
        PrepareBuilder();
        result.hasField272 = false;
        result.field272_ = -1;
        return this;
      }

      public bool HasField150 {
        get { return result.hasField150; }
      }
      public int Field150 {
        get { return result.Field150; }
        set { SetField150(value); }
      }
      public Builder SetField150(int value) {
        PrepareBuilder();
        result.hasField150 = true;
        result.field150_ = value;
        return this;
      }
      public Builder ClearField150() {
        PrepareBuilder();
        result.hasField150 = false;
        result.field150_ = 0;
        return this;
      }

      public bool HasField23 {
        get { return result.hasField23; }
      }
      public int Field23 {
        get { return result.Field23; }
        set { SetField23(value); }
      }
      public Builder SetField23(int value) {
        PrepareBuilder();
        result.hasField23 = true;
        result.field23_ = value;
        return this;
      }
      public Builder ClearField23() {
        PrepareBuilder();
        result.hasField23 = false;
        result.field23_ = 0;
        return this;
      }

      public bool HasField24 {
        get { return result.hasField24; }
      }
      public bool Field24 {
        get { return result.Field24; }
        set { SetField24(value); }
      }
      public Builder SetField24(bool value) {
        PrepareBuilder();
        result.hasField24 = true;
        result.field24_ = value;
        return this;
      }
      public Builder ClearField24() {
        PrepareBuilder();
        result.hasField24 = false;
        result.field24_ = false;
        return this;
      }

      public bool HasField25 {
        get { return result.hasField25; }
      }
      public int Field25 {
        get { return result.Field25; }
        set { SetField25(value); }
      }
      public Builder SetField25(int value) {
        PrepareBuilder();
        result.hasField25 = true;
        result.field25_ = value;
        return this;
      }
      public Builder ClearField25() {
        PrepareBuilder();
        result.hasField25 = false;
        result.field25_ = 0;
        return this;
      }

      public bool HasField15 {
       get { return result.hasField15; }
      }
      public global::Google.ProtocolBuffers.TestProtos.SpeedMessage1SubMessage Field15 {
        get { return result.Field15; }
        set { SetField15(value); }
      }
      public Builder SetField15(global::Google.ProtocolBuffers.TestProtos.SpeedMessage1SubMessage value) {
        pb::ThrowHelper.ThrowIfNull(value, "value");
        PrepareBuilder();
        result.hasField15 = true;
        result.field15_ = value;
        return this;
      }
      public Builder SetField15(global::Google.ProtocolBuffers.TestProtos.SpeedMessage1SubMessage.Builder builderForValue) {
        pb::ThrowHelper.ThrowIfNull(builderForValue, "builderForValue");
        PrepareBuilder();
        result.hasField15 = true;
        result.field15_ = builderForValue.Build();
        return this;
      }
      public Builder MergeField15(global::Google.ProtocolBuffers.TestProtos.SpeedMessage1SubMessage value) {
        pb::ThrowHelper.ThrowIfNull(value, "value");
        PrepareBuilder();
        if (result.hasField15 &&
            result.field15_ != global::Google.ProtocolBuffers.TestProtos.SpeedMessage1SubMessage.DefaultInstance) {
            result.field15_ = global::Google.ProtocolBuffers.TestProtos.SpeedMessage1SubMessage.CreateBuilder(result.field15_).MergeFrom(value).BuildPartial();
        } else {
          result.field15_ = value;
        }
        result.hasField15 = true;
        return this;
      }
      public Builder ClearField15() {
        PrepareBuilder();
        result.hasField15 = false;
        result.field15_ = null;
        return this;
      }

      public bool HasField78 {
        get { return result.hasField78; }
      }
      public bool Field78 {
        get { return result.Field78; }
        set { SetField78(value); }
      }
      public Builder SetField78(bool value) {
        PrepareBuilder();
        result.hasField78 = true;
        result.field78_ = value;
        return this;
      }
      public Builder ClearField78() {
        PrepareBuilder();
        result.hasField78 = false;
        result.field78_ = false;
        return this;
      }

      public bool HasField67 {
        get { return result.hasField67; }
      }
      public int Field67 {
        get { return result.Field67; }
        set { SetField67(value); }
      }
      public Builder SetField67(int value) {
        PrepareBuilder();
        result.hasField67 = true;
        result.field67_ = value;
        return this;
      }
      public Builder ClearField67() {
        PrepareBuilder();
        result.hasField67 = false;
        result.field67_ = 0;
        return this;
      }

      public bool HasField68 {
        get { return result.hasField68; }
      }
      public int Field68 {
        get { return result.Field68; }
        set { SetField68(value); }
      }
      public Builder SetField68(int value) {
        PrepareBuilder();
        result.hasField68 = true;
        result.field68_ = value;
        return this;
      }
      public Builder ClearField68() {
        PrepareBuilder();
        result.hasField68 = false;
        result.field68_ = 0;
        return this;
      }

      public bool HasField128 {
        get { return result.hasField128; }
      }
      public int Field128 {
        get { return result.Field128; }
        set { SetField128(value); }
      }
      public Builder SetField128(int value) {
        PrepareBuilder();
        result.hasField128 = true;
        result.field128_ = value;
        return this;
      }
      public Builder ClearField128() {
        PrepareBuilder();
        result.hasField128 = false;
        result.field128_ = 0;
        return this;
      }

      public bool HasField129 {
        get { return result.hasField129; }
      }
      public string Field129 {
        get { return result.Field129; }
        set { SetField129(value); }
      }
      public Builder SetField129(string value) {
        pb::ThrowHelper.ThrowIfNull(value, "value");
        PrepareBuilder();
        result.hasField129 = true;
        result.field129_ = value;
        return this;
      }
      public Builder ClearField129() {
        PrepareBuilder();
        result.hasField129 = false;
        result.field129_ = "xxxxxxxxxxxxxxxxxxxxx";
        return this;
      }

      public bool HasField131 {
        get { return result.hasField131; }
      }
      public int Field131 {
        get { return result.Field131; }
        set { SetField131(value); }
      }
      public Builder SetField131(int value) {
        PrepareBuilder();
        result.hasField131 = true;
        result.field131_ = value;
        return this;
      }
      public Builder ClearField131() {
        PrepareBuilder();
        result.hasField131 = false;
        result.field131_ = 0;
        return this;
      }
    }
    static SpeedMessage1() {
      object.ReferenceEquals(global::Google.ProtocolBuffers.TestProtos.GoogleSpeed.Descriptor, null);
    }
  }

  [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
  public sealed partial class SpeedMessage1SubMessage : pb::GeneratedMessage<SpeedMessage1SubMessage, SpeedMessage1SubMessage.Builder> {
    private SpeedMessage1SubMessage() { }
    private static readonly SpeedMessage1SubMessage defaultInstance = new SpeedMessage1SubMessage().MakeReadOnly();
    private static readonly string[] _speedMessage1SubMessageFieldNames = new string[] { "field1", "field12", "field13", "field14", "field15", "field16", "field19", "field2", "field20", "field203", "field204", "field205", "field206", "field207", "field21", "field22", "field23", "field28", "field3", "field300" };
    private static readonly uint[] _speedMessage1SubMessageFieldTags = new uint[] { 8, 96, 104, 112, 122, 128, 152, 16, 160, 1629, 1632, 1642, 1648, 1656, 169, 176, 184, 224, 24, 2400 };
    public static SpeedMessage1SubMessage DefaultInstance {
      get { return defaultInstance; }
    }

    public override SpeedMessage1SubMessage DefaultInstanceForType {
      get { return DefaultInstance; }
    }

    protected override SpeedMessage1SubMessage ThisMessage {
      get { return this; }
    }

    public static pbd::MessageDescriptor Descriptor {
      get { return global::Google.ProtocolBuffers.TestProtos.GoogleSpeed.internal__static_benchmarks_SpeedMessage1SubMessage__Descriptor; }
    }

    protected override pb::FieldAccess.FieldAccessorTable<SpeedMessage1SubMessage, SpeedMessage1SubMessage.Builder> InternalFieldAccessors {
      get { return global::Google.ProtocolBuffers.TestProtos.GoogleSpeed.internal__static_benchmarks_SpeedMessage1SubMessage__FieldAccessorTable; }
    }

    public const int Field1FieldNumber = 1;
    private bool hasField1;
    private int field1_;
    public bool HasField1 {
      get { return hasField1; }
    }
    public int Field1 {
      get { return field1_; }
    }

    public const int Field2FieldNumber = 2;
    private bool hasField2;
    private int field2_;
    public bool HasField2 {
      get { return hasField2; }
    }
    public int Field2 {
      get { return field2_; }
    }

    public const int Field3FieldNumber = 3;
    private bool hasField3;
    private int field3_;
    public bool HasField3 {
      get { return hasField3; }
    }
    public int Field3 {
      get { return field3_; }
    }

    public const int Field15FieldNumber = 15;
    private bool hasField15;
    private string field15_ = "";
    public bool HasField15 {
      get { return hasField15; }
    }
    public string Field15 {
      get { return field15_; }
    }

    public const int Field12FieldNumber = 12;
    private bool hasField12;
    private bool field12_ = true;
    public bool HasField12 {
      get { return hasField12; }
    }
    public bool Field12 {
      get { return field12_; }
    }

    public const int Field13FieldNumber = 13;
    private bool hasField13;
    private long field13_;
    public bool HasField13 {
      get { return hasField13; }
    }
    public long Field13 {
      get { return field13_; }
    }

    public const int Field14FieldNumber = 14;
    private bool hasField14;
    private long field14_;
    public bool HasField14 {
      get { return hasField14; }
    }
    public long Field14 {
      get { return field14_; }
    }

    public const int Field16FieldNumber = 16;
    private bool hasField16;
    private int field16_;
    public bool HasField16 {
      get { return hasField16; }
    }
    public int Field16 {
      get { return field16_; }
    }

    public const int Field19FieldNumber = 19;
    private bool hasField19;
    private int field19_ = 2;
    public bool HasField19 {
      get { return hasField19; }
    }
    public int Field19 {
      get { return field19_; }
    }

    public const int Field20FieldNumber = 20;
    private bool hasField20;
    private bool field20_ = true;
    public bool HasField20 {
      get { return hasField20; }
    }
    public bool Field20 {
      get { return field20_; }
    }

    public const int Field28FieldNumber = 28;
    private bool hasField28;
    private bool field28_ = true;
    public bool HasField28 {
      get { return hasField28; }
    }
    public bool Field28 {
      get { return field28_; }
    }

    public const int Field21FieldNumber = 21;
    private bool hasField21;
    private ulong field21_;
    public bool HasField21 {
      get { return hasField21; }
    }
    public ulong Field21 {
      get { return field21_; }
    }

    public const int Field22FieldNumber = 22;
    private bool hasField22;
    private int field22_;
    public bool HasField22 {
      get { return hasField22; }
    }
    public int Field22 {
      get { return field22_; }
    }

    public const int Field23FieldNumber = 23;
    private bool hasField23;
    private bool field23_;
    public bool HasField23 {
      get { return hasField23; }
    }
    public bool Field23 {
      get { return field23_; }
    }

    public const int Field206FieldNumber = 206;
    private bool hasField206;
    private bool field206_;
    public bool HasField206 {
      get { return hasField206; }
    }
    public bool Field206 {
      get { return field206_; }
    }

    public const int Field203FieldNumber = 203;
    private bool hasField203;
    private uint field203_;
    public bool HasField203 {
      get { return hasField203; }
    }
    public uint Field203 {
      get { return field203_; }
    }

    public const int Field204FieldNumber = 204;
    private bool hasField204;
    private int field204_;
    public bool HasField204 {
      get { return hasField204; }
    }
    public int Field204 {
      get { return field204_; }
    }

    public const int Field205FieldNumber = 205;
    private bool hasField205;
    private string field205_ = "";
    public bool HasField205 {
      get { return hasField205; }
    }
    public string Field205 {
      get { return field205_; }
    }

    public const int Field207FieldNumber = 207;
    private bool hasField207;
    private ulong field207_;
    public bool HasField207 {
      get { return hasField207; }
    }
    public ulong Field207 {
      get { return field207_; }
    }

    public const int Field300FieldNumber = 300;
    private bool hasField300;
    private ulong field300_;
    public bool HasField300 {
      get { return hasField300; }
    }
    public ulong Field300 {
      get { return field300_; }
    }

    public override bool IsInitialized {
      get {
        return true;
      }
    }

    public override void WriteTo(pb::ICodedOutputStream output) {
      CalcSerializedSize();
      string[] field_names = _speedMessage1SubMessageFieldNames;
      if (hasField1) {
        output.WriteInt32(1, field_names[0], Field1);
      }
      if (hasField2) {
        output.WriteInt32(2, field_names[7], Field2);
      }
      if (hasField3) {
        output.WriteInt32(3, field_names[18], Field3);
      }
      if (hasField12) {
        output.WriteBool(12, field_names[1], Field12);
      }
      if (hasField13) {
        output.WriteInt64(13, field_names[2], Field13);
      }
      if (hasField14) {
        output.WriteInt64(14, field_names[3], Field14);
      }
      if (hasField15) {
        output.WriteString(15, field_names[4], Field15);
      }
      if (hasField16) {
        output.WriteInt32(16, field_names[5], Field16);
      }
      if (hasField19) {
        output.WriteInt32(19, field_names[6], Field19);
      }
      if (hasField20) {
        output.WriteBool(20, field_names[8], Field20);
      }
      if (hasField21) {
        output.WriteFixed64(21, field_names[14], Field21);
      }
      if (hasField22) {
        output.WriteInt32(22, field_names[15], Field22);
      }
      if (hasField23) {
        output.WriteBool(23, field_names[16], Field23);
      }
      if (hasField28) {
        output.WriteBool(28, field_names[17], Field28);
      }
      if (hasField203) {
        output.WriteFixed32(203, field_names[9], Field203);
      }
      if (hasField204) {
        output.WriteInt32(204, field_names[10], Field204);
      }
      if (hasField205) {
        output.WriteString(205, field_names[11], Field205);
      }
      if (hasField206) {
        output.WriteBool(206, field_names[12], Field206);
      }
      if (hasField207) {
        output.WriteUInt64(207, field_names[13], Field207);
      }
      if (hasField300) {
        output.WriteUInt64(300, field_names[19], Field300);
      }
      UnknownFields.WriteTo(output);
    }

    private int memoizedSerializedSize = -1;
    public override int SerializedSize {
      get {
        int size = memoizedSerializedSize;
        if (size != -1) return size;
        return CalcSerializedSize();
      }
    }

    private int CalcSerializedSize() {
      int size = memoizedSerializedSize;
      if (size != -1) return size;

      size = 0;
      if (hasField1) {
        size += pb::CodedOutputStream.ComputeInt32Size(1, Field1);
      }
      if (hasField2) {
        size += pb::CodedOutputStream.ComputeInt32Size(2, Field2);
      }
      if (hasField3) {
        size += pb::CodedOutputStream.ComputeInt32Size(3, Field3);
      }
      if (hasField15) {
        size += pb::CodedOutputStream.ComputeStringSize(15, Field15);
      }
      if (hasField12) {
        size += pb::CodedOutputStream.ComputeBoolSize(12, Field12);
      }
      if (hasField13) {
        size += pb::CodedOutputStream.ComputeInt64Size(13, Field13);
      }
      if (hasField14) {
        size += pb::CodedOutputStream.ComputeInt64Size(14, Field14);
      }
      if (hasField16) {
        size += pb::CodedOutputStream.ComputeInt32Size(16, Field16);
      }
      if (hasField19) {
        size += pb::CodedOutputStream.ComputeInt32Size(19, Field19);
      }
      if (hasField20) {
        size += pb::CodedOutputStream.ComputeBoolSize(20, Field20);
      }
      if (hasField28) {
        size += pb::CodedOutputStream.ComputeBoolSize(28, Field28);
      }
      if (hasField21) {
        size += pb::CodedOutputStream.ComputeFixed64Size(21, Field21);
      }
      if (hasField22) {
        size += pb::CodedOutputStream.ComputeInt32Size(22, Field22);
      }
      if (hasField23) {
        size += pb::CodedOutputStream.ComputeBoolSize(23, Field23);
      }
      if (hasField206) {
        size += pb::CodedOutputStream.ComputeBoolSize(206, Field206);
      }
      if (hasField203) {
        size += pb::CodedOutputStream.ComputeFixed32Size(203, Field203);
      }
      if (hasField204) {
        size += pb::CodedOutputStream.ComputeInt32Size(204, Field204);
      }
      if (hasField205) {
        size += pb::CodedOutputStream.ComputeStringSize(205, Field205);
      }
      if (hasField207) {
        size += pb::CodedOutputStream.ComputeUInt64Size(207, Field207);
      }
      if (hasField300) {
        size += pb::CodedOutputStream.ComputeUInt64Size(300, Field300);
      }
      size += UnknownFields.SerializedSize;
      memoizedSerializedSize = size;
      return size;
    }
    public static SpeedMessage1SubMessage ParseFrom(pb::ByteString data) {
      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
    }
    public static SpeedMessage1SubMessage ParseFrom(pb::ByteString data, pb::ExtensionRegistry extensionRegistry) {
      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
    }
    public static SpeedMessage1SubMessage ParseFrom(byte[] data) {
      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
    }
    public static SpeedMessage1SubMessage ParseFrom(byte[] data, pb::ExtensionRegistry extensionRegistry) {
      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
    }
    public static SpeedMessage1SubMessage ParseFrom(global::System.IO.Stream input) {
      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
    }
    public static SpeedMessage1SubMessage ParseFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
    }
    public static SpeedMessage1SubMessage ParseDelimitedFrom(global::System.IO.Stream input) {
      return CreateBuilder().MergeDelimitedFrom(input).BuildParsed();
    }
    public static SpeedMessage1SubMessage ParseDelimitedFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
      return CreateBuilder().MergeDelimitedFrom(input, extensionRegistry).BuildParsed();
    }
    public static SpeedMessage1SubMessage ParseFrom(pb::ICodedInputStream input) {
      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
    }
    public static SpeedMessage1SubMessage ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
    }
    private SpeedMessage1SubMessage MakeReadOnly() {
      return this;
    }

    public static Builder CreateBuilder() { return new Builder(); }
    public override Builder ToBuilder() { return CreateBuilder(this); }
    public override Builder CreateBuilderForType() { return new Builder(); }
    public static Builder CreateBuilder(SpeedMessage1SubMessage prototype) {
      return new Builder(prototype);
    }

    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
    public sealed partial class Builder : pb::GeneratedBuilder<SpeedMessage1SubMessage, Builder> {
      protected override Builder ThisBuilder {
        get { return this; }
      }
      public Builder() {
        result = DefaultInstance;
        resultIsReadOnly = true;
      }
      internal Builder(SpeedMessage1SubMessage cloneFrom) {
        result = cloneFrom;
        resultIsReadOnly = true;
      }

      private bool resultIsReadOnly;
      private SpeedMessage1SubMessage result;

      private SpeedMessage1SubMessage PrepareBuilder() {
        if (resultIsReadOnly) {
          SpeedMessage1SubMessage original = result;
          result = new SpeedMessage1SubMessage();
          resultIsReadOnly = false;
          MergeFrom(original);
        }
        return result;
      }

      public override bool IsInitialized {
        get { return result.IsInitialized; }
      }

      protected override SpeedMessage1SubMessage MessageBeingBuilt {
        get { return PrepareBuilder(); }
      }

      public override Builder Clear() {
        result = DefaultInstance;
        resultIsReadOnly = true;
        return this;
      }

      public override Builder Clone() {
        if (resultIsReadOnly) {
          return new Builder(result);
        } else {
          return new Builder().MergeFrom(result);
        }
      }

      public override pbd::MessageDescriptor DescriptorForType {
        get { return global::Google.ProtocolBuffers.TestProtos.SpeedMessage1SubMessage.Descriptor; }
      }

      public override SpeedMessage1SubMessage DefaultInstanceForType {
        get { return global::Google.ProtocolBuffers.TestProtos.SpeedMessage1SubMessage.DefaultInstance; }
      }

      public override SpeedMessage1SubMessage BuildPartial() {
        if (resultIsReadOnly) {
          return result;
        }
        resultIsReadOnly = true;
        return result.MakeReadOnly();
      }

      public override Builder MergeFrom(pb::IMessage other) {
        if (other is SpeedMessage1SubMessage) {
          return MergeFrom((SpeedMessage1SubMessage) other);
        } else {
          base.MergeFrom(other);
          return this;
        }
      }

      public override Builder MergeFrom(SpeedMessage1SubMessage other) {
        if (other == global::Google.ProtocolBuffers.TestProtos.SpeedMessage1SubMessage.DefaultInstance) return this;
        PrepareBuilder();
        if (other.HasField1) {
          Field1 = other.Field1;
        }
        if (other.HasField2) {
          Field2 = other.Field2;
        }
        if (other.HasField3) {
          Field3 = other.Field3;
        }
        if (other.HasField15) {
          Field15 = other.Field15;
        }
        if (other.HasField12) {
          Field12 = other.Field12;
        }
        if (other.HasField13) {
          Field13 = other.Field13;
        }
        if (other.HasField14) {
          Field14 = other.Field14;
        }
        if (other.HasField16) {
          Field16 = other.Field16;
        }
        if (other.HasField19) {
          Field19 = other.Field19;
        }
        if (other.HasField20) {
          Field20 = other.Field20;
        }
        if (other.HasField28) {
          Field28 = other.Field28;
        }
        if (other.HasField21) {
          Field21 = other.Field21;
        }
        if (other.HasField22) {
          Field22 = other.Field22;
        }
        if (other.HasField23) {
          Field23 = other.Field23;
        }
        if (other.HasField206) {
          Field206 = other.Field206;
        }
        if (other.HasField203) {
          Field203 = other.Field203;
        }
        if (other.HasField204) {
          Field204 = other.Field204;
        }
        if (other.HasField205) {
          Field205 = other.Field205;
        }
        if (other.HasField207) {
          Field207 = other.Field207;
        }
        if (other.HasField300) {
          Field300 = other.Field300;
        }
        this.MergeUnknownFields(other.UnknownFields);
        return this;
      }

      public override Builder MergeFrom(pb::ICodedInputStream input) {
        return MergeFrom(input, pb::ExtensionRegistry.Empty);
      }

      public override Builder MergeFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
        PrepareBuilder();
        pb::UnknownFieldSet.Builder unknownFields = null;
        uint tag;
        string field_name;
        while (input.ReadTag(out tag, out field_name)) {
          if(tag == 0 && field_name != null) {
            int field_ordinal = global::System.Array.BinarySearch(_speedMessage1SubMessageFieldNames, field_name, global::System.StringComparer.Ordinal);
            if(field_ordinal >= 0)
              tag = _speedMessage1SubMessageFieldTags[field_ordinal];
            else {
              if (unknownFields == null) {
                unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
              }
              ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name);
              continue;
            }
          }
          switch (tag) {
            case 0: {
              throw pb::InvalidProtocolBufferException.InvalidTag();
            }
            default: {
              if (pb::WireFormat.IsEndGroupTag(tag)) {
                if (unknownFields != null) {
                  this.UnknownFields = unknownFields.Build();
                }
                return this;
              }
              if (unknownFields == null) {
                unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
              }
              ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name);
              break;
            }
            case 8: {
              result.hasField1 = input.ReadInt32(ref result.field1_);
              break;
            }
            case 16: {
              result.hasField2 = input.ReadInt32(ref result.field2_);
              break;
            }
            case 24: {
              result.hasField3 = input.ReadInt32(ref result.field3_);
              break;
            }
            case 96: {
              result.hasField12 = input.ReadBool(ref result.field12_);
              break;
            }
            case 104: {
              result.hasField13 = input.ReadInt64(ref result.field13_);
              break;
            }
            case 112: {
              result.hasField14 = input.ReadInt64(ref result.field14_);
              break;
            }
            case 122: {
              result.hasField15 = input.ReadString(ref result.field15_);
              break;
            }
            case 128: {
              result.hasField16 = input.ReadInt32(ref result.field16_);
              break;
            }
            case 152: {
              result.hasField19 = input.ReadInt32(ref result.field19_);
              break;
            }
            case 160: {
              result.hasField20 = input.ReadBool(ref result.field20_);
              break;
            }
            case 169: {
              result.hasField21 = input.ReadFixed64(ref result.field21_);
              break;
            }
            case 176: {
              result.hasField22 = input.ReadInt32(ref result.field22_);
              break;
            }
            case 184: {
              result.hasField23 = input.ReadBool(ref result.field23_);
              break;
            }
            case 224: {
              result.hasField28 = input.ReadBool(ref result.field28_);
              break;
            }
            case 1629: {
              result.hasField203 = input.ReadFixed32(ref result.field203_);
              break;
            }
            case 1632: {
              result.hasField204 = input.ReadInt32(ref result.field204_);
              break;
            }
            case 1642: {
              result.hasField205 = input.ReadString(ref result.field205_);
              break;
            }
            case 1648: {
              result.hasField206 = input.ReadBool(ref result.field206_);
              break;
            }
            case 1656: {
              result.hasField207 = input.ReadUInt64(ref result.field207_);
              break;
            }
            case 2400: {
              result.hasField300 = input.ReadUInt64(ref result.field300_);
              break;
            }
          }
        }

        if (unknownFields != null) {
          this.UnknownFields = unknownFields.Build();
        }
        return this;
      }


      public bool HasField1 {
        get { return result.hasField1; }
      }
      public int Field1 {
        get { return result.Field1; }
        set { SetField1(value); }
      }
      public Builder SetField1(int value) {
        PrepareBuilder();
        result.hasField1 = true;
        result.field1_ = value;
        return this;
      }
      public Builder ClearField1() {
        PrepareBuilder();
        result.hasField1 = false;
        result.field1_ = 0;
        return this;
      }

      public bool HasField2 {
        get { return result.hasField2; }
      }
      public int Field2 {
        get { return result.Field2; }
        set { SetField2(value); }
      }
      public Builder SetField2(int value) {
        PrepareBuilder();
        result.hasField2 = true;
        result.field2_ = value;
        return this;
      }
      public Builder ClearField2() {
        PrepareBuilder();
        result.hasField2 = false;
        result.field2_ = 0;
        return this;
      }

      public bool HasField3 {
        get { return result.hasField3; }
      }
      public int Field3 {
        get { return result.Field3; }
        set { SetField3(value); }
      }
      public Builder SetField3(int value) {
        PrepareBuilder();
        result.hasField3 = true;
        result.field3_ = value;
        return this;
      }
      public Builder ClearField3() {
        PrepareBuilder();
        result.hasField3 = false;
        result.field3_ = 0;
        return this;
      }

      public bool HasField15 {
        get { return result.hasField15; }
      }
      public string Field15 {
        get { return result.Field15; }
        set { SetField15(value); }
      }
      public Builder SetField15(string value) {
        pb::ThrowHelper.ThrowIfNull(value, "value");
        PrepareBuilder();
        result.hasField15 = true;
        result.field15_ = value;
        return this;
      }
      public Builder ClearField15() {
        PrepareBuilder();
        result.hasField15 = false;
        result.field15_ = "";
        return this;
      }

      public bool HasField12 {
        get { return result.hasField12; }
      }
      public bool Field12 {
        get { return result.Field12; }
        set { SetField12(value); }
      }
      public Builder SetField12(bool value) {
        PrepareBuilder();
        result.hasField12 = true;
        result.field12_ = value;
        return this;
      }
      public Builder ClearField12() {
        PrepareBuilder();
        result.hasField12 = false;
        result.field12_ = true;
        return this;
      }

      public bool HasField13 {
        get { return result.hasField13; }
      }
      public long Field13 {
        get { return result.Field13; }
        set { SetField13(value); }
      }
      public Builder SetField13(long value) {
        PrepareBuilder();
        result.hasField13 = true;
        result.field13_ = value;
        return this;
      }
      public Builder ClearField13() {
        PrepareBuilder();
        result.hasField13 = false;
        result.field13_ = 0L;
        return this;
      }

      public bool HasField14 {
        get { return result.hasField14; }
      }
      public long Field14 {
        get { return result.Field14; }
        set { SetField14(value); }
      }
      public Builder SetField14(long value) {
        PrepareBuilder();
        result.hasField14 = true;
        result.field14_ = value;
        return this;
      }
      public Builder ClearField14() {
        PrepareBuilder();
        result.hasField14 = false;
        result.field14_ = 0L;
        return this;
      }

      public bool HasField16 {
        get { return result.hasField16; }
      }
      public int Field16 {
        get { return result.Field16; }
        set { SetField16(value); }
      }
      public Builder SetField16(int value) {
        PrepareBuilder();
        result.hasField16 = true;
        result.field16_ = value;
        return this;
      }
      public Builder ClearField16() {
        PrepareBuilder();
        result.hasField16 = false;
        result.field16_ = 0;
        return this;
      }

      public bool HasField19 {
        get { return result.hasField19; }
      }
      public int Field19 {
        get { return result.Field19; }
        set { SetField19(value); }
      }
      public Builder SetField19(int value) {
        PrepareBuilder();
        result.hasField19 = true;
        result.field19_ = value;
        return this;
      }
      public Builder ClearField19() {
        PrepareBuilder();
        result.hasField19 = false;
        result.field19_ = 2;
        return this;
      }

      public bool HasField20 {
        get { return result.hasField20; }
      }
      public bool Field20 {
        get { return result.Field20; }
        set { SetField20(value); }
      }
      public Builder SetField20(bool value) {
        PrepareBuilder();
        result.hasField20 = true;
        result.field20_ = value;
        return this;
      }
      public Builder ClearField20() {
        PrepareBuilder();
        result.hasField20 = false;
        result.field20_ = true;
        return this;
      }

      public bool HasField28 {
        get { return result.hasField28; }
      }
      public bool Field28 {
        get { return result.Field28; }
        set { SetField28(value); }
      }
      public Builder SetField28(bool value) {
        PrepareBuilder();
        result.hasField28 = true;
        result.field28_ = value;
        return this;
      }
      public Builder ClearField28() {
        PrepareBuilder();
        result.hasField28 = false;
        result.field28_ = true;
        return this;
      }

      public bool HasField21 {
        get { return result.hasField21; }
      }
      public ulong Field21 {
        get { return result.Field21; }
        set { SetField21(value); }
      }
      public Builder SetField21(ulong value) {
        PrepareBuilder();
        result.hasField21 = true;
        result.field21_ = value;
        return this;
      }
      public Builder ClearField21() {
        PrepareBuilder();
        result.hasField21 = false;
        result.field21_ = 0UL;
        return this;
      }

      public bool HasField22 {
        get { return result.hasField22; }
      }
      public int Field22 {
        get { return result.Field22; }
        set { SetField22(value); }
      }
      public Builder SetField22(int value) {
        PrepareBuilder();
        result.hasField22 = true;
        result.field22_ = value;
        return this;
      }
      public Builder ClearField22() {
        PrepareBuilder();
        result.hasField22 = false;
        result.field22_ = 0;
        return this;
      }

      public bool HasField23 {
        get { return result.hasField23; }
      }
      public bool Field23 {
        get { return result.Field23; }
        set { SetField23(value); }
      }
      public Builder SetField23(bool value) {
        PrepareBuilder();
        result.hasField23 = true;
        result.field23_ = value;
        return this;
      }
      public Builder ClearField23() {
        PrepareBuilder();
        result.hasField23 = false;
        result.field23_ = false;
        return this;
      }

      public bool HasField206 {
        get { return result.hasField206; }
      }
      public bool Field206 {
        get { return result.Field206; }
        set { SetField206(value); }
      }
      public Builder SetField206(bool value) {
        PrepareBuilder();
        result.hasField206 = true;
        result.field206_ = value;
        return this;
      }
      public Builder ClearField206() {
        PrepareBuilder();
        result.hasField206 = false;
        result.field206_ = false;
        return this;
      }

      public bool HasField203 {
        get { return result.hasField203; }
      }
      public uint Field203 {
        get { return result.Field203; }
        set { SetField203(value); }
      }
      public Builder SetField203(uint value) {
        PrepareBuilder();
        result.hasField203 = true;
        result.field203_ = value;
        return this;
      }
      public Builder ClearField203() {
        PrepareBuilder();
        result.hasField203 = false;
        result.field203_ = 0;
        return this;
      }

      public bool HasField204 {
        get { return result.hasField204; }
      }
      public int Field204 {
        get { return result.Field204; }
        set { SetField204(value); }
      }
      public Builder SetField204(int value) {
        PrepareBuilder();
        result.hasField204 = true;
        result.field204_ = value;
        return this;
      }
      public Builder ClearField204() {
        PrepareBuilder();
        result.hasField204 = false;
        result.field204_ = 0;
        return this;
      }

      public bool HasField205 {
        get { return result.hasField205; }
      }
      public string Field205 {
        get { return result.Field205; }
        set { SetField205(value); }
      }
      public Builder SetField205(string value) {
        pb::ThrowHelper.ThrowIfNull(value, "value");
        PrepareBuilder();
        result.hasField205 = true;
        result.field205_ = value;
        return this;
      }
      public Builder ClearField205() {
        PrepareBuilder();
        result.hasField205 = false;
        result.field205_ = "";
        return this;
      }

      public bool HasField207 {
        get { return result.hasField207; }
      }
      public ulong Field207 {
        get { return result.Field207; }
        set { SetField207(value); }
      }
      public Builder SetField207(ulong value) {
        PrepareBuilder();
        result.hasField207 = true;
        result.field207_ = value;
        return this;
      }
      public Builder ClearField207() {
        PrepareBuilder();
        result.hasField207 = false;
        result.field207_ = 0UL;
        return this;
      }

      public bool HasField300 {
        get { return result.hasField300; }
      }
      public ulong Field300 {
        get { return result.Field300; }
        set { SetField300(value); }
      }
      public Builder SetField300(ulong value) {
        PrepareBuilder();
        result.hasField300 = true;
        result.field300_ = value;
        return this;
      }
      public Builder ClearField300() {
        PrepareBuilder();
        result.hasField300 = false;
        result.field300_ = 0UL;
        return this;
      }
    }
    static SpeedMessage1SubMessage() {
      object.ReferenceEquals(global::Google.ProtocolBuffers.TestProtos.GoogleSpeed.Descriptor, null);
    }
  }

  [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
  public sealed partial class SpeedMessage2 : pb::GeneratedMessage<SpeedMessage2, SpeedMessage2.Builder> {
    private SpeedMessage2() { }
    private static readonly SpeedMessage2 defaultInstance = new SpeedMessage2().MakeReadOnly();
    private static readonly string[] _speedMessage2FieldNames = new string[] { "field1", "field109", "field127", "field128", "field129", "field130", "field131", "field2", "field205", "field206", "field21", "field210", "field211", "field212", "field213", "field216", "field217", "field218", "field220", "field221", "field222", "field25", "field3", "field30", "field4", "field6", "field63", "field71", "field75", "group1" };
    private static readonly uint[] _speedMessage2FieldTags = new uint[] { 10, 872, 1018, 1026, 1032, 1040, 1048, 18, 1640, 1648, 168, 1680, 1688, 1696, 1704, 1728, 1736, 1744, 1760, 1768, 1781, 205, 24, 240, 32, 50, 504, 568, 600, 83 };
    public static SpeedMessage2 DefaultInstance {
      get { return defaultInstance; }
    }

    public override SpeedMessage2 DefaultInstanceForType {
      get { return DefaultInstance; }
    }

    protected override SpeedMessage2 ThisMessage {
      get { return this; }
    }

    public static pbd::MessageDescriptor Descriptor {
      get { return global::Google.ProtocolBuffers.TestProtos.GoogleSpeed.internal__static_benchmarks_SpeedMessage2__Descriptor; }
    }

    protected override pb::FieldAccess.FieldAccessorTable<SpeedMessage2, SpeedMessage2.Builder> InternalFieldAccessors {
      get { return global::Google.ProtocolBuffers.TestProtos.GoogleSpeed.internal__static_benchmarks_SpeedMessage2__FieldAccessorTable; }
    }

    #region Nested types
    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
    public static partial class Types {
      [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
      public sealed partial class Group1 : pb::GeneratedMessage<Group1, Group1.Builder> {
        private Group1() { }
        private static readonly Group1 defaultInstance = new Group1().MakeReadOnly();
        private static readonly string[] _group1FieldNames = new string[] { "field11", "field12", "field13", "field14", "field15", "field16", "field20", "field22", "field24", "field26", "field27", "field28", "field29", "field31", "field5", "field73" };
        private static readonly uint[] _group1FieldTags = new uint[] { 93, 98, 106, 114, 120, 130, 160, 178, 194, 213, 218, 224, 234, 250, 40, 584 };
        public static Group1 DefaultInstance {
          get { return defaultInstance; }
        }

        public override Group1 DefaultInstanceForType {
          get { return DefaultInstance; }
        }

        protected override Group1 ThisMessage {
          get { return this; }
        }

        public static pbd::MessageDescriptor Descriptor {
          get { return global::Google.ProtocolBuffers.TestProtos.GoogleSpeed.internal__static_benchmarks_SpeedMessage2_Group1__Descriptor; }
        }

        protected override pb::FieldAccess.FieldAccessorTable<Group1, Group1.Builder> InternalFieldAccessors {
          get { return global::Google.ProtocolBuffers.TestProtos.GoogleSpeed.internal__static_benchmarks_SpeedMessage2_Group1__FieldAccessorTable; }
        }

        public const int Field11FieldNumber = 11;
        private bool hasField11;
        private float field11_;
        public bool HasField11 {
          get { return hasField11; }
        }
        public float Field11 {
          get { return field11_; }
        }

        public const int Field26FieldNumber = 26;
        private bool hasField26;
        private float field26_;
        public bool HasField26 {
          get { return hasField26; }
        }
        public float Field26 {
          get { return field26_; }
        }

        public const int Field12FieldNumber = 12;
        private bool hasField12;
        private string field12_ = "";
        public bool HasField12 {
          get { return hasField12; }
        }
        public string Field12 {
          get { return field12_; }
        }

        public const int Field13FieldNumber = 13;
        private bool hasField13;
        private string field13_ = "";
        public bool HasField13 {
          get { return hasField13; }
        }
        public string Field13 {
          get { return field13_; }
        }

        public const int Field14FieldNumber = 14;
        private pbc::PopsicleList<string> field14_ = new pbc::PopsicleList<string>();
        public scg::IList<string> Field14List {
          get { return pbc::Lists.AsReadOnly(field14_); }
        }
        public int Field14Count {
          get { return field14_.Count; }
        }
        public string GetField14(int index) {
          return field14_[index];
        }

        public const int Field15FieldNumber = 15;
        private bool hasField15;
        private ulong field15_;
        public bool HasField15 {
          get { return hasField15; }
        }
        public ulong Field15 {
          get { return field15_; }
        }

        public const int Field5FieldNumber = 5;
        private bool hasField5;
        private int field5_;
        public bool HasField5 {
          get { return hasField5; }
        }
        public int Field5 {
          get { return field5_; }
        }

        public const int Field27FieldNumber = 27;
        private bool hasField27;
        private string field27_ = "";
        public bool HasField27 {
          get { return hasField27; }
        }
        public string Field27 {
          get { return field27_; }
        }

        public const int Field28FieldNumber = 28;
        private bool hasField28;
        private int field28_;
        public bool HasField28 {
          get { return hasField28; }
        }
        public int Field28 {
          get { return field28_; }
        }

        public const int Field29FieldNumber = 29;
        private bool hasField29;
        private string field29_ = "";
        public bool HasField29 {
          get { return hasField29; }
        }
        public string Field29 {
          get { return field29_; }
        }

        public const int Field16FieldNumber = 16;
        private bool hasField16;
        private string field16_ = "";
        public bool HasField16 {
          get { return hasField16; }
        }
        public string Field16 {
          get { return field16_; }
        }

        public const int Field22FieldNumber = 22;
        private pbc::PopsicleList<string> field22_ = new pbc::PopsicleList<string>();
        public scg::IList<string> Field22List {
          get { return pbc::Lists.AsReadOnly(field22_); }
        }
        public int Field22Count {
          get { return field22_.Count; }
        }
        public string GetField22(int index) {
          return field22_[index];
        }

        public const int Field73FieldNumber = 73;
        private pbc::PopsicleList<int> field73_ = new pbc::PopsicleList<int>();
        public scg::IList<int> Field73List {
          get { return pbc::Lists.AsReadOnly(field73_); }
        }
        public int Field73Count {
          get { return field73_.Count; }
        }
        public int GetField73(int index) {
          return field73_[index];
        }

        public const int Field20FieldNumber = 20;
        private bool hasField20;
        private int field20_;
        public bool HasField20 {
          get { return hasField20; }
        }
        public int Field20 {
          get { return field20_; }
        }

        public const int Field24FieldNumber = 24;
        private bool hasField24;
        private string field24_ = "";
        public bool HasField24 {
          get { return hasField24; }
        }
        public string Field24 {
          get { return field24_; }
        }

        public const int Field31FieldNumber = 31;
        private bool hasField31;
        private global::Google.ProtocolBuffers.TestProtos.SpeedMessage2GroupedMessage field31_;
        public bool HasField31 {
          get { return hasField31; }
        }
        public global::Google.ProtocolBuffers.TestProtos.SpeedMessage2GroupedMessage Field31 {
          get { return field31_ ?? global::Google.ProtocolBuffers.TestProtos.SpeedMessage2GroupedMessage.DefaultInstance; }
        }

        public override bool IsInitialized {
          get {
            if (!hasField11) return false;
            if (!hasField15) return false;
            return true;
          }
        }

        public override void WriteTo(pb::ICodedOutputStream output) {
          CalcSerializedSize();
          string[] field_names = _group1FieldNames;
          if (hasField5) {
            output.WriteInt32(5, field_names[14], Field5);
          }
          if (hasField11) {
            output.WriteFloat(11, field_names[0], Field11);
          }
          if (hasField12) {
            output.WriteString(12, field_names[1], Field12);
          }
          if (hasField13) {
            output.WriteString(13, field_names[2], Field13);
          }
          if (field14_.Count > 0) {
            output.WriteStringArray(14, field_names[3], field14_);
          }
          if (hasField15) {
            output.WriteUInt64(15, field_names[4], Field15);
          }
          if (hasField16) {
            output.WriteString(16, field_names[5], Field16);
          }
          if (hasField20) {
            output.WriteInt32(20, field_names[6], Field20);
          }
          if (field22_.Count > 0) {
            output.WriteStringArray(22, field_names[7], field22_);
          }
          if (hasField24) {
            output.WriteString(24, field_names[8], Field24);
          }
          if (hasField26) {
            output.WriteFloat(26, field_names[9], Field26);
          }
          if (hasField27) {
            output.WriteString(27, field_names[10], Field27);
          }
          if (hasField28) {
            output.WriteInt32(28, field_names[11], Field28);
          }
          if (hasField29) {
            output.WriteString(29, field_names[12], Field29);
          }
          if (hasField31) {
            output.WriteMessage(31, field_names[13], Field31);
          }
          if (field73_.Count > 0) {
            output.WriteInt32Array(73, field_names[15], field73_);
          }
          UnknownFields.WriteTo(output);
        }

        private int memoizedSerializedSize = -1;
        public override int SerializedSize {
          get {
            int size = memoizedSerializedSize;
            if (size != -1) return size;
            return CalcSerializedSize();
          }
        }

        private int CalcSerializedSize() {
          int size = memoizedSerializedSize;
          if (size != -1) return size;

          size = 0;
          if (hasField11) {
            size += pb::CodedOutputStream.ComputeFloatSize(11, Field11);
          }
          if (hasField26) {
            size += pb::CodedOutputStream.ComputeFloatSize(26, Field26);
          }
          if (hasField12) {
            size += pb::CodedOutputStream.ComputeStringSize(12, Field12);
          }
          if (hasField13) {
            size += pb::CodedOutputStream.ComputeStringSize(13, Field13);
          }
          {
            int dataSize = 0;
            foreach (string element in Field14List) {
              dataSize += pb::CodedOutputStream.ComputeStringSizeNoTag(element);
            }
            size += dataSize;
            size += 1 * field14_.Count;
          }
          if (hasField15) {
            size += pb::CodedOutputStream.ComputeUInt64Size(15, Field15);
          }
          if (hasField5) {
            size += pb::CodedOutputStream.ComputeInt32Size(5, Field5);
          }
          if (hasField27) {
            size += pb::CodedOutputStream.ComputeStringSize(27, Field27);
          }
          if (hasField28) {
            size += pb::CodedOutputStream.ComputeInt32Size(28, Field28);
          }
          if (hasField29) {
            size += pb::CodedOutputStream.ComputeStringSize(29, Field29);
          }
          if (hasField16) {
            size += pb::CodedOutputStream.ComputeStringSize(16, Field16);
          }
          {
            int dataSize = 0;
            foreach (string element in Field22List) {
              dataSize += pb::CodedOutputStream.ComputeStringSizeNoTag(element);
            }
            size += dataSize;
            size += 2 * field22_.Count;
          }
          {
            int dataSize = 0;
            foreach (int element in Field73List) {
              dataSize += pb::CodedOutputStream.ComputeInt32SizeNoTag(element);
            }
            size += dataSize;
            size += 2 * field73_.Count;
          }
          if (hasField20) {
            size += pb::CodedOutputStream.ComputeInt32Size(20, Field20);
          }
          if (hasField24) {
            size += pb::CodedOutputStream.ComputeStringSize(24, Field24);
          }
          if (hasField31) {
            size += pb::CodedOutputStream.ComputeMessageSize(31, Field31);
          }
          size += UnknownFields.SerializedSize;
          memoizedSerializedSize = size;
          return size;
        }
        public static Group1 ParseFrom(pb::ByteString data) {
          return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
        }
        public static Group1 ParseFrom(pb::ByteString data, pb::ExtensionRegistry extensionRegistry) {
          return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
        }
        public static Group1 ParseFrom(byte[] data) {
          return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
        }
        public static Group1 ParseFrom(byte[] data, pb::ExtensionRegistry extensionRegistry) {
          return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
        }
        public static Group1 ParseFrom(global::System.IO.Stream input) {
          return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
        }
        public static Group1 ParseFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
          return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
        }
        public static Group1 ParseDelimitedFrom(global::System.IO.Stream input) {
          return CreateBuilder().MergeDelimitedFrom(input).BuildParsed();
        }
        public static Group1 ParseDelimitedFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
          return CreateBuilder().MergeDelimitedFrom(input, extensionRegistry).BuildParsed();
        }
        public static Group1 ParseFrom(pb::ICodedInputStream input) {
          return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
        }
        public static Group1 ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
          return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
        }
        private Group1 MakeReadOnly() {
          field14_.MakeReadOnly();
          field22_.MakeReadOnly();
          field73_.MakeReadOnly();
          return this;
        }

        public static Builder CreateBuilder() { return new Builder(); }
        public override Builder ToBuilder() { return CreateBuilder(this); }
        public override Builder CreateBuilderForType() { return new Builder(); }
        public static Builder CreateBuilder(Group1 prototype) {
          return new Builder(prototype);
        }

        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
        public sealed partial class Builder : pb::GeneratedBuilder<Group1, Builder> {
          protected override Builder ThisBuilder {
            get { return this; }
          }
          public Builder() {
            result = DefaultInstance;
            resultIsReadOnly = true;
          }
          internal Builder(Group1 cloneFrom) {
            result = cloneFrom;
            resultIsReadOnly = true;
          }

          private bool resultIsReadOnly;
          private Group1 result;

          private Group1 PrepareBuilder() {
            if (resultIsReadOnly) {
              Group1 original = result;
              result = new Group1();
              resultIsReadOnly = false;
              MergeFrom(original);
            }
            return result;
          }

          public override bool IsInitialized {
            get { return result.IsInitialized; }
          }

          protected override Group1 MessageBeingBuilt {
            get { return PrepareBuilder(); }
          }

          public override Builder Clear() {
            result = DefaultInstance;
            resultIsReadOnly = true;
            return this;
          }

          public override Builder Clone() {
            if (resultIsReadOnly) {
              return new Builder(result);
            } else {
              return new Builder().MergeFrom(result);
            }
          }

          public override pbd::MessageDescriptor DescriptorForType {
            get { return global::Google.ProtocolBuffers.TestProtos.SpeedMessage2.Types.Group1.Descriptor; }
          }

          public override Group1 DefaultInstanceForType {
            get { return global::Google.ProtocolBuffers.TestProtos.SpeedMessage2.Types.Group1.DefaultInstance; }
          }

          public override Group1 BuildPartial() {
            if (resultIsReadOnly) {
              return result;
            }
            resultIsReadOnly = true;
            return result.MakeReadOnly();
          }

          public override Builder MergeFrom(pb::IMessage other) {
            if (other is Group1) {
              return MergeFrom((Group1) other);
            } else {
              base.MergeFrom(other);
              return this;
            }
          }

          public override Builder MergeFrom(Group1 other) {
            if (other == global::Google.ProtocolBuffers.TestProtos.SpeedMessage2.Types.Group1.DefaultInstance) return this;
            PrepareBuilder();
            if (other.HasField11) {
              Field11 = other.Field11;
            }
            if (other.HasField26) {
              Field26 = other.Field26;
            }
            if (other.HasField12) {
              Field12 = other.Field12;
            }
            if (other.HasField13) {
              Field13 = other.Field13;
            }
            if (other.field14_.Count != 0) {
              result.field14_.Add(other.field14_);
            }
            if (other.HasField15) {
              Field15 = other.Field15;
            }
            if (other.HasField5) {
              Field5 = other.Field5;
            }
            if (other.HasField27) {
              Field27 = other.Field27;
            }
            if (other.HasField28) {
              Field28 = other.Field28;
            }
            if (other.HasField29) {
              Field29 = other.Field29;
            }
            if (other.HasField16) {
              Field16 = other.Field16;
            }
            if (other.field22_.Count != 0) {
              result.field22_.Add(other.field22_);
            }
            if (other.field73_.Count != 0) {
              result.field73_.Add(other.field73_);
            }
            if (other.HasField20) {
              Field20 = other.Field20;
            }
            if (other.HasField24) {
              Field24 = other.Field24;
            }
            if (other.HasField31) {
              MergeField31(other.Field31);
            }
            this.MergeUnknownFields(other.UnknownFields);
            return this;
          }

          public override Builder MergeFrom(pb::ICodedInputStream input) {
            return MergeFrom(input, pb::ExtensionRegistry.Empty);
          }

          public override Builder MergeFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
            PrepareBuilder();
            pb::UnknownFieldSet.Builder unknownFields = null;
            uint tag;
            string field_name;
            while (input.ReadTag(out tag, out field_name)) {
              if(tag == 0 && field_name != null) {
                int field_ordinal = global::System.Array.BinarySearch(_group1FieldNames, field_name, global::System.StringComparer.Ordinal);
                if(field_ordinal >= 0)
                  tag = _group1FieldTags[field_ordinal];
                else {
                  if (unknownFields == null) {
                    unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
                  }
                  ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name);
                  continue;
                }
              }
              switch (tag) {
                case 0: {
                  throw pb::InvalidProtocolBufferException.InvalidTag();
                }
                default: {
                  if (pb::WireFormat.IsEndGroupTag(tag)) {
                    if (unknownFields != null) {
                      this.UnknownFields = unknownFields.Build();
                    }
                    return this;
                  }
                  if (unknownFields == null) {
                    unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
                  }
                  ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name);
                  break;
                }
                case 40: {
                  result.hasField5 = input.ReadInt32(ref result.field5_);
                  break;
                }
                case 93: {
                  result.hasField11 = input.ReadFloat(ref result.field11_);
                  break;
                }
                case 98: {
                  result.hasField12 = input.ReadString(ref result.field12_);
                  break;
                }
                case 106: {
                  result.hasField13 = input.ReadString(ref result.field13_);
                  break;
                }
                case 114: {
                  input.ReadStringArray(tag, field_name, result.field14_);
                  break;
                }
                case 120: {
                  result.hasField15 = input.ReadUInt64(ref result.field15_);
                  break;
                }
                case 130: {
                  result.hasField16 = input.ReadString(ref result.field16_);
                  break;
                }
                case 160: {
                  result.hasField20 = input.ReadInt32(ref result.field20_);
                  break;
                }
                case 178: {
                  input.ReadStringArray(tag, field_name, result.field22_);
                  break;
                }
                case 194: {
                  result.hasField24 = input.ReadString(ref result.field24_);
                  break;
                }
                case 213: {
                  result.hasField26 = input.ReadFloat(ref result.field26_);
                  break;
                }
                case 218: {
                  result.hasField27 = input.ReadString(ref result.field27_);
                  break;
                }
                case 224: {
                  result.hasField28 = input.ReadInt32(ref result.field28_);
                  break;
                }
                case 234: {
                  result.hasField29 = input.ReadString(ref result.field29_);
                  break;
                }
                case 250: {
                  global::Google.ProtocolBuffers.TestProtos.SpeedMessage2GroupedMessage.Builder subBuilder = global::Google.ProtocolBuffers.TestProtos.SpeedMessage2GroupedMessage.CreateBuilder();
                  if (result.hasField31) {
                    subBuilder.MergeFrom(Field31);
                  }
                  input.ReadMessage(subBuilder, extensionRegistry);
                  Field31 = subBuilder.BuildPartial();
                  break;
                }
                case 586:
                case 584: {
                  input.ReadInt32Array(tag, field_name, result.field73_);
                  break;
                }
              }
            }

            if (unknownFields != null) {
              this.UnknownFields = unknownFields.Build();
            }
            return this;
          }


          public bool HasField11 {
            get { return result.hasField11; }
          }
          public float Field11 {
            get { return result.Field11; }
            set { SetField11(value); }
          }
          public Builder SetField11(float value) {
            PrepareBuilder();
            result.hasField11 = true;
            result.field11_ = value;
            return this;
          }
          public Builder ClearField11() {
            PrepareBuilder();
            result.hasField11 = false;
            result.field11_ = 0F;
            return this;
          }

          public bool HasField26 {
            get { return result.hasField26; }
          }
          public float Field26 {
            get { return result.Field26; }
            set { SetField26(value); }
          }
          public Builder SetField26(float value) {
            PrepareBuilder();
            result.hasField26 = true;
            result.field26_ = value;
            return this;
          }
          public Builder ClearField26() {
            PrepareBuilder();
            result.hasField26 = false;
            result.field26_ = 0F;
            return this;
          }

          public bool HasField12 {
            get { return result.hasField12; }
          }
          public string Field12 {
            get { return result.Field12; }
            set { SetField12(value); }
          }
          public Builder SetField12(string value) {
            pb::ThrowHelper.ThrowIfNull(value, "value");
            PrepareBuilder();
            result.hasField12 = true;
            result.field12_ = value;
            return this;
          }
          public Builder ClearField12() {
            PrepareBuilder();
            result.hasField12 = false;
            result.field12_ = "";
            return this;
          }

          public bool HasField13 {
            get { return result.hasField13; }
          }
          public string Field13 {
            get { return result.Field13; }
            set { SetField13(value); }
          }
          public Builder SetField13(string value) {
            pb::ThrowHelper.ThrowIfNull(value, "value");
            PrepareBuilder();
            result.hasField13 = true;
            result.field13_ = value;
            return this;
          }
          public Builder ClearField13() {
            PrepareBuilder();
            result.hasField13 = false;
            result.field13_ = "";
            return this;
          }

          public pbc::IPopsicleList<string> Field14List {
            get { return PrepareBuilder().field14_; }
          }
          public int Field14Count {
            get { return result.Field14Count; }
          }
          public string GetField14(int index) {
            return result.GetField14(index);
          }
          public Builder SetField14(int index, string value) {
            pb::ThrowHelper.ThrowIfNull(value, "value");
            PrepareBuilder();
            result.field14_[index] = value;
            return this;
          }
          public Builder AddField14(string value) {
            pb::ThrowHelper.ThrowIfNull(value, "value");
            PrepareBuilder();
            result.field14_.Add(value);
            return this;
          }
          public Builder AddRangeField14(scg::IEnumerable<string> values) {
            PrepareBuilder();
            result.field14_.Add(values);
            return this;
          }
          public Builder ClearField14() {
            PrepareBuilder();
            result.field14_.Clear();
            return this;
          }

          public bool HasField15 {
            get { return result.hasField15; }
          }
          public ulong Field15 {
            get { return result.Field15; }
            set { SetField15(value); }
          }
          public Builder SetField15(ulong value) {
            PrepareBuilder();
            result.hasField15 = true;
            result.field15_ = value;
            return this;
          }
          public Builder ClearField15() {
            PrepareBuilder();
            result.hasField15 = false;
            result.field15_ = 0UL;
            return this;
          }

          public bool HasField5 {
            get { return result.hasField5; }
          }
          public int Field5 {
            get { return result.Field5; }
            set { SetField5(value); }
          }
          public Builder SetField5(int value) {
            PrepareBuilder();
            result.hasField5 = true;
            result.field5_ = value;
            return this;
          }
          public Builder ClearField5() {
            PrepareBuilder();
            result.hasField5 = false;
            result.field5_ = 0;
            return this;
          }

          public bool HasField27 {
            get { return result.hasField27; }
          }
          public string Field27 {
            get { return result.Field27; }
            set { SetField27(value); }
          }
          public Builder SetField27(string value) {
            pb::ThrowHelper.ThrowIfNull(value, "value");
            PrepareBuilder();
            result.hasField27 = true;
            result.field27_ = value;
            return this;
          }
          public Builder ClearField27() {
            PrepareBuilder();
            result.hasField27 = false;
            result.field27_ = "";
            return this;
          }

          public bool HasField28 {
            get { return result.hasField28; }
          }
          public int Field28 {
            get { return result.Field28; }
            set { SetField28(value); }
          }
          public Builder SetField28(int value) {
            PrepareBuilder();
            result.hasField28 = true;
            result.field28_ = value;
            return this;
          }
          public Builder ClearField28() {
            PrepareBuilder();
            result.hasField28 = false;
            result.field28_ = 0;
            return this;
          }

          public bool HasField29 {
            get { return result.hasField29; }
          }
          public string Field29 {
            get { return result.Field29; }
            set { SetField29(value); }
          }
          public Builder SetField29(string value) {
            pb::ThrowHelper.ThrowIfNull(value, "value");
            PrepareBuilder();
            result.hasField29 = true;
            result.field29_ = value;
            return this;
          }
          public Builder ClearField29() {
            PrepareBuilder();
            result.hasField29 = false;
            result.field29_ = "";
            return this;
          }

          public bool HasField16 {
            get { return result.hasField16; }
          }
          public string Field16 {
            get { return result.Field16; }
            set { SetField16(value); }
          }
          public Builder SetField16(string value) {
            pb::ThrowHelper.ThrowIfNull(value, "value");
            PrepareBuilder();
            result.hasField16 = true;
            result.field16_ = value;
            return this;
          }
          public Builder ClearField16() {
            PrepareBuilder();
            result.hasField16 = false;
            result.field16_ = "";
            return this;
          }

          public pbc::IPopsicleList<string> Field22List {
            get { return PrepareBuilder().field22_; }
          }
          public int Field22Count {
            get { return result.Field22Count; }
          }
          public string GetField22(int index) {
            return result.GetField22(index);
          }
          public Builder SetField22(int index, string value) {
            pb::ThrowHelper.ThrowIfNull(value, "value");
            PrepareBuilder();
            result.field22_[index] = value;
            return this;
          }
          public Builder AddField22(string value) {
            pb::ThrowHelper.ThrowIfNull(value, "value");
            PrepareBuilder();
            result.field22_.Add(value);
            return this;
          }
          public Builder AddRangeField22(scg::IEnumerable<string> values) {
            PrepareBuilder();
            result.field22_.Add(values);
            return this;
          }
          public Builder ClearField22() {
            PrepareBuilder();
            result.field22_.Clear();
            return this;
          }

          public pbc::IPopsicleList<int> Field73List {
            get { return PrepareBuilder().field73_; }
          }
          public int Field73Count {
            get { return result.Field73Count; }
          }
          public int GetField73(int index) {
            return result.GetField73(index);
          }
          public Builder SetField73(int index, int value) {
            PrepareBuilder();
            result.field73_[index] = value;
            return this;
          }
          public Builder AddField73(int value) {
            PrepareBuilder();
            result.field73_.Add(value);
            return this;
          }
          public Builder AddRangeField73(scg::IEnumerable<int> values) {
            PrepareBuilder();
            result.field73_.Add(values);
            return this;
          }
          public Builder ClearField73() {
            PrepareBuilder();
            result.field73_.Clear();
            return this;
          }

          public bool HasField20 {
            get { return result.hasField20; }
          }
          public int Field20 {
            get { return result.Field20; }
            set { SetField20(value); }
          }
          public Builder SetField20(int value) {
            PrepareBuilder();
            result.hasField20 = true;
            result.field20_ = value;
            return this;
          }
          public Builder ClearField20() {
            PrepareBuilder();
            result.hasField20 = false;
            result.field20_ = 0;
            return this;
          }

          public bool HasField24 {
            get { return result.hasField24; }
          }
          public string Field24 {
            get { return result.Field24; }
            set { SetField24(value); }
          }
          public Builder SetField24(string value) {
            pb::ThrowHelper.ThrowIfNull(value, "value");
            PrepareBuilder();
            result.hasField24 = true;
            result.field24_ = value;
            return this;
          }
          public Builder ClearField24() {
            PrepareBuilder();
            result.hasField24 = false;
            result.field24_ = "";
            return this;
          }

          public bool HasField31 {
           get { return result.hasField31; }
          }
          public global::Google.ProtocolBuffers.TestProtos.SpeedMessage2GroupedMessage Field31 {
            get { return result.Field31; }
            set { SetField31(value); }
          }
          public Builder SetField31(global::Google.ProtocolBuffers.TestProtos.SpeedMessage2GroupedMessage value) {
            pb::ThrowHelper.ThrowIfNull(value, "value");
            PrepareBuilder();
            result.hasField31 = true;
            result.field31_ = value;
            return this;
          }
          public Builder SetField31(global::Google.ProtocolBuffers.TestProtos.SpeedMessage2GroupedMessage.Builder builderForValue) {
            pb::ThrowHelper.ThrowIfNull(builderForValue, "builderForValue");
            PrepareBuilder();
            result.hasField31 = true;
            result.field31_ = builderForValue.Build();
            return this;
          }
          public Builder MergeField31(global::Google.ProtocolBuffers.TestProtos.SpeedMessage2GroupedMessage value) {
            pb::ThrowHelper.ThrowIfNull(value, "value");
            PrepareBuilder();
            if (result.hasField31 &&
                result.field31_ != global::Google.ProtocolBuffers.TestProtos.SpeedMessage2GroupedMessage.DefaultInstance) {
                result.field31_ = global::Google.ProtocolBuffers.TestProtos.SpeedMessage2GroupedMessage.CreateBuilder(result.field31_).MergeFrom(value).BuildPartial();
            } else {
              result.field31_ = value;
            }
            result.hasField31 = true;
            return this;
          }
          public Builder ClearField31() {
            PrepareBuilder();
            result.hasField31 = false;
            result.field31_ = null;
            return this;
          }
        }
        static Group1() {
          object.ReferenceEquals(global::Google.ProtocolBuffers.TestProtos.GoogleSpeed.Descriptor, null);
        }
      }

    }
    #endregion

    public const int Field1FieldNumber = 1;
    private bool hasField1;
    private string field1_ = "";
    public bool HasField1 {
      get { return hasField1; }
    }
    public string Field1 {
      get { return field1_; }
    }

    public const int Field3FieldNumber = 3;
    private bool hasField3;
    private long field3_;
    public bool HasField3 {
      get { return hasField3; }
    }
    public long Field3 {
      get { return field3_; }
    }

    public const int Field4FieldNumber = 4;
    private bool hasField4;
    private long field4_;
    public bool HasField4 {
      get { return hasField4; }
    }
    public long Field4 {
      get { return field4_; }
    }

    public const int Field30FieldNumber = 30;
    private bool hasField30;
    private long field30_;
    public bool HasField30 {
      get { return hasField30; }
    }
    public long Field30 {
      get { return field30_; }
    }

    public const int Field75FieldNumber = 75;
    private bool hasField75;
    private bool field75_;
    public bool HasField75 {
      get { return hasField75; }
    }
    public bool Field75 {
      get { return field75_; }
    }

    public const int Field6FieldNumber = 6;
    private bool hasField6;
    private string field6_ = "";
    public bool HasField6 {
      get { return hasField6; }
    }
    public string Field6 {
      get { return field6_; }
    }

    public const int Field2FieldNumber = 2;
    private bool hasField2;
    private pb::ByteString field2_ = pb::ByteString.Empty;
    public bool HasField2 {
      get { return hasField2; }
    }
    public pb::ByteString Field2 {
      get { return field2_; }
    }

    public const int Field21FieldNumber = 21;
    private bool hasField21;
    private int field21_;
    public bool HasField21 {
      get { return hasField21; }
    }
    public int Field21 {
      get { return field21_; }
    }

    public const int Field71FieldNumber = 71;
    private bool hasField71;
    private int field71_;
    public bool HasField71 {
      get { return hasField71; }
    }
    public int Field71 {
      get { return field71_; }
    }

    public const int Field25FieldNumber = 25;
    private bool hasField25;
    private float field25_;
    public bool HasField25 {
      get { return hasField25; }
    }
    public float Field25 {
      get { return field25_; }
    }

    public const int Field109FieldNumber = 109;
    private bool hasField109;
    private int field109_;
    public bool HasField109 {
      get { return hasField109; }
    }
    public int Field109 {
      get { return field109_; }
    }

    public const int Field210FieldNumber = 210;
    private bool hasField210;
    private int field210_;
    public bool HasField210 {
      get { return hasField210; }
    }
    public int Field210 {
      get { return field210_; }
    }

    public const int Field211FieldNumber = 211;
    private bool hasField211;
    private int field211_;
    public bool HasField211 {
      get { return hasField211; }
    }
    public int Field211 {
      get { return field211_; }
    }

    public const int Field212FieldNumber = 212;
    private bool hasField212;
    private int field212_;
    public bool HasField212 {
      get { return hasField212; }
    }
    public int Field212 {
      get { return field212_; }
    }

    public const int Field213FieldNumber = 213;
    private bool hasField213;
    private int field213_;
    public bool HasField213 {
      get { return hasField213; }
    }
    public int Field213 {
      get { return field213_; }
    }

    public const int Field216FieldNumber = 216;
    private bool hasField216;
    private int field216_;
    public bool HasField216 {
      get { return hasField216; }
    }
    public int Field216 {
      get { return field216_; }
    }

    public const int Field217FieldNumber = 217;
    private bool hasField217;
    private int field217_;
    public bool HasField217 {
      get { return hasField217; }
    }
    public int Field217 {
      get { return field217_; }
    }

    public const int Field218FieldNumber = 218;
    private bool hasField218;
    private int field218_;
    public bool HasField218 {
      get { return hasField218; }
    }
    public int Field218 {
      get { return field218_; }
    }

    public const int Field220FieldNumber = 220;
    private bool hasField220;
    private int field220_;
    public bool HasField220 {
      get { return hasField220; }
    }
    public int Field220 {
      get { return field220_; }
    }

    public const int Field221FieldNumber = 221;
    private bool hasField221;
    private int field221_;
    public bool HasField221 {
      get { return hasField221; }
    }
    public int Field221 {
      get { return field221_; }
    }

    public const int Field222FieldNumber = 222;
    private bool hasField222;
    private float field222_;
    public bool HasField222 {
      get { return hasField222; }
    }
    public float Field222 {
      get { return field222_; }
    }

    public const int Field63FieldNumber = 63;
    private bool hasField63;
    private int field63_;
    public bool HasField63 {
      get { return hasField63; }
    }
    public int Field63 {
      get { return field63_; }
    }

    public const int Group1FieldNumber = 10;
    private pbc::PopsicleList<global::Google.ProtocolBuffers.TestProtos.SpeedMessage2.Types.Group1> group1_ = new pbc::PopsicleList<global::Google.ProtocolBuffers.TestProtos.SpeedMessage2.Types.Group1>();
    public scg::IList<global::Google.ProtocolBuffers.TestProtos.SpeedMessage2.Types.Group1> Group1List {
      get { return group1_; }
    }
    public int Group1Count {
      get { return group1_.Count; }
    }
    public global::Google.ProtocolBuffers.TestProtos.SpeedMessage2.Types.Group1 GetGroup1(int index) {
      return group1_[index];
    }

    public const int Field128FieldNumber = 128;
    private pbc::PopsicleList<string> field128_ = new pbc::PopsicleList<string>();
    public scg::IList<string> Field128List {
      get { return pbc::Lists.AsReadOnly(field128_); }
    }
    public int Field128Count {
      get { return field128_.Count; }
    }
    public string GetField128(int index) {
      return field128_[index];
    }

    public const int Field131FieldNumber = 131;
    private bool hasField131;
    private long field131_;
    public bool HasField131 {
      get { return hasField131; }
    }
    public long Field131 {
      get { return field131_; }
    }

    public const int Field127FieldNumber = 127;
    private pbc::PopsicleList<string> field127_ = new pbc::PopsicleList<string>();
    public scg::IList<string> Field127List {
      get { return pbc::Lists.AsReadOnly(field127_); }
    }
    public int Field127Count {
      get { return field127_.Count; }
    }
    public string GetField127(int index) {
      return field127_[index];
    }

    public const int Field129FieldNumber = 129;
    private bool hasField129;
    private int field129_;
    public bool HasField129 {
      get { return hasField129; }
    }
    public int Field129 {
      get { return field129_; }
    }

    public const int Field130FieldNumber = 130;
    private pbc::PopsicleList<long> field130_ = new pbc::PopsicleList<long>();
    public scg::IList<long> Field130List {
      get { return pbc::Lists.AsReadOnly(field130_); }
    }
    public int Field130Count {
      get { return field130_.Count; }
    }
    public long GetField130(int index) {
      return field130_[index];
    }

    public const int Field205FieldNumber = 205;
    private bool hasField205;
    private bool field205_;
    public bool HasField205 {
      get { return hasField205; }
    }
    public bool Field205 {
      get { return field205_; }
    }

    public const int Field206FieldNumber = 206;
    private bool hasField206;
    private bool field206_;
    public bool HasField206 {
      get { return hasField206; }
    }
    public bool Field206 {
      get { return field206_; }
    }

    public override bool IsInitialized {
      get {
        return true;
      }
    }

    public override void WriteTo(pb::ICodedOutputStream output) {
      CalcSerializedSize();
      string[] field_names = _speedMessage2FieldNames;
      if (hasField1) {
        output.WriteString(1, field_names[0], Field1);
      }
      if (hasField2) {
        output.WriteBytes(2, field_names[7], Field2);
      }
      if (hasField3) {
        output.WriteInt64(3, field_names[22], Field3);
      }
      if (hasField4) {
        output.WriteInt64(4, field_names[24], Field4);
      }
      if (hasField6) {
        output.WriteString(6, field_names[25], Field6);
      }
      if (group1_.Count > 0) {
        output.WriteGroupArray(10, field_names[29], group1_);
      }
      if (hasField21) {
        output.WriteInt32(21, field_names[10], Field21);
      }
      if (hasField25) {
        output.WriteFloat(25, field_names[21], Field25);
      }
      if (hasField30) {
        output.WriteInt64(30, field_names[23], Field30);
      }
      if (hasField63) {
        output.WriteInt32(63, field_names[26], Field63);
      }
      if (hasField71) {
        output.WriteInt32(71, field_names[27], Field71);
      }
      if (hasField75) {
        output.WriteBool(75, field_names[28], Field75);
      }
      if (hasField109) {
        output.WriteInt32(109, field_names[1], Field109);
      }
      if (field127_.Count > 0) {
        output.WriteStringArray(127, field_names[2], field127_);
      }
      if (field128_.Count > 0) {
        output.WriteStringArray(128, field_names[3], field128_);
      }
      if (hasField129) {
        output.WriteInt32(129, field_names[4], Field129);
      }
      if (field130_.Count > 0) {
        output.WriteInt64Array(130, field_names[5], field130_);
      }
      if (hasField131) {
        output.WriteInt64(131, field_names[6], Field131);
      }
      if (hasField205) {
        output.WriteBool(205, field_names[8], Field205);
      }
      if (hasField206) {
        output.WriteBool(206, field_names[9], Field206);
      }
      if (hasField210) {
        output.WriteInt32(210, field_names[11], Field210);
      }
      if (hasField211) {
        output.WriteInt32(211, field_names[12], Field211);
      }
      if (hasField212) {
        output.WriteInt32(212, field_names[13], Field212);
      }
      if (hasField213) {
        output.WriteInt32(213, field_names[14], Field213);
      }
      if (hasField216) {
        output.WriteInt32(216, field_names[15], Field216);
      }
      if (hasField217) {
        output.WriteInt32(217, field_names[16], Field217);
      }
      if (hasField218) {
        output.WriteInt32(218, field_names[17], Field218);
      }
      if (hasField220) {
        output.WriteInt32(220, field_names[18], Field220);
      }
      if (hasField221) {
        output.WriteInt32(221, field_names[19], Field221);
      }
      if (hasField222) {
        output.WriteFloat(222, field_names[20], Field222);
      }
      UnknownFields.WriteTo(output);
    }

    private int memoizedSerializedSize = -1;
    public override int SerializedSize {
      get {
        int size = memoizedSerializedSize;
        if (size != -1) return size;
        return CalcSerializedSize();
      }
    }

    private int CalcSerializedSize() {
      int size = memoizedSerializedSize;
      if (size != -1) return size;

      size = 0;
      if (hasField1) {
        size += pb::CodedOutputStream.ComputeStringSize(1, Field1);
      }
      if (hasField3) {
        size += pb::CodedOutputStream.ComputeInt64Size(3, Field3);
      }
      if (hasField4) {
        size += pb::CodedOutputStream.ComputeInt64Size(4, Field4);
      }
      if (hasField30) {
        size += pb::CodedOutputStream.ComputeInt64Size(30, Field30);
      }
      if (hasField75) {
        size += pb::CodedOutputStream.ComputeBoolSize(75, Field75);
      }
      if (hasField6) {
        size += pb::CodedOutputStream.ComputeStringSize(6, Field6);
      }
      if (hasField2) {
        size += pb::CodedOutputStream.ComputeBytesSize(2, Field2);
      }
      if (hasField21) {
        size += pb::CodedOutputStream.ComputeInt32Size(21, Field21);
      }
      if (hasField71) {
        size += pb::CodedOutputStream.ComputeInt32Size(71, Field71);
      }
      if (hasField25) {
        size += pb::CodedOutputStream.ComputeFloatSize(25, Field25);
      }
      if (hasField109) {
        size += pb::CodedOutputStream.ComputeInt32Size(109, Field109);
      }
      if (hasField210) {
        size += pb::CodedOutputStream.ComputeInt32Size(210, Field210);
      }
      if (hasField211) {
        size += pb::CodedOutputStream.ComputeInt32Size(211, Field211);
      }
      if (hasField212) {
        size += pb::CodedOutputStream.ComputeInt32Size(212, Field212);
      }
      if (hasField213) {
        size += pb::CodedOutputStream.ComputeInt32Size(213, Field213);
      }
      if (hasField216) {
        size += pb::CodedOutputStream.ComputeInt32Size(216, Field216);
      }
      if (hasField217) {
        size += pb::CodedOutputStream.ComputeInt32Size(217, Field217);
      }
      if (hasField218) {
        size += pb::CodedOutputStream.ComputeInt32Size(218, Field218);
      }
      if (hasField220) {
        size += pb::CodedOutputStream.ComputeInt32Size(220, Field220);
      }
      if (hasField221) {
        size += pb::CodedOutputStream.ComputeInt32Size(221, Field221);
      }
      if (hasField222) {
        size += pb::CodedOutputStream.ComputeFloatSize(222, Field222);
      }
      if (hasField63) {
        size += pb::CodedOutputStream.ComputeInt32Size(63, Field63);
      }
      foreach (global::Google.ProtocolBuffers.TestProtos.SpeedMessage2.Types.Group1 element in Group1List) {
        size += pb::CodedOutputStream.ComputeGroupSize(10, element);
      }
      {
        int dataSize = 0;
        foreach (string element in Field128List) {
          dataSize += pb::CodedOutputStream.ComputeStringSizeNoTag(element);
        }
        size += dataSize;
        size += 2 * field128_.Count;
      }
      if (hasField131) {
        size += pb::CodedOutputStream.ComputeInt64Size(131, Field131);
      }
      {
        int dataSize = 0;
        foreach (string element in Field127List) {
          dataSize += pb::CodedOutputStream.ComputeStringSizeNoTag(element);
        }
        size += dataSize;
        size += 2 * field127_.Count;
      }
      if (hasField129) {
        size += pb::CodedOutputStream.ComputeInt32Size(129, Field129);
      }
      {
        int dataSize = 0;
        foreach (long element in Field130List) {
          dataSize += pb::CodedOutputStream.ComputeInt64SizeNoTag(element);
        }
        size += dataSize;
        size += 2 * field130_.Count;
      }
      if (hasField205) {
        size += pb::CodedOutputStream.ComputeBoolSize(205, Field205);
      }
      if (hasField206) {
        size += pb::CodedOutputStream.ComputeBoolSize(206, Field206);
      }
      size += UnknownFields.SerializedSize;
      memoizedSerializedSize = size;
      return size;
    }
    public static SpeedMessage2 ParseFrom(pb::ByteString data) {
      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
    }
    public static SpeedMessage2 ParseFrom(pb::ByteString data, pb::ExtensionRegistry extensionRegistry) {
      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
    }
    public static SpeedMessage2 ParseFrom(byte[] data) {
      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
    }
    public static SpeedMessage2 ParseFrom(byte[] data, pb::ExtensionRegistry extensionRegistry) {
      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
    }
    public static SpeedMessage2 ParseFrom(global::System.IO.Stream input) {
      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
    }
    public static SpeedMessage2 ParseFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
    }
    public static SpeedMessage2 ParseDelimitedFrom(global::System.IO.Stream input) {
      return CreateBuilder().MergeDelimitedFrom(input).BuildParsed();
    }
    public static SpeedMessage2 ParseDelimitedFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
      return CreateBuilder().MergeDelimitedFrom(input, extensionRegistry).BuildParsed();
    }
    public static SpeedMessage2 ParseFrom(pb::ICodedInputStream input) {
      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
    }
    public static SpeedMessage2 ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
    }
    private SpeedMessage2 MakeReadOnly() {
      group1_.MakeReadOnly();
      field128_.MakeReadOnly();
      field127_.MakeReadOnly();
      field130_.MakeReadOnly();
      return this;
    }

    public static Builder CreateBuilder() { return new Builder(); }
    public override Builder ToBuilder() { return CreateBuilder(this); }
    public override Builder CreateBuilderForType() { return new Builder(); }
    public static Builder CreateBuilder(SpeedMessage2 prototype) {
      return new Builder(prototype);
    }

    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
    public sealed partial class Builder : pb::GeneratedBuilder<SpeedMessage2, Builder> {
      protected override Builder ThisBuilder {
        get { return this; }
      }
      public Builder() {
        result = DefaultInstance;
        resultIsReadOnly = true;
      }
      internal Builder(SpeedMessage2 cloneFrom) {
        result = cloneFrom;
        resultIsReadOnly = true;
      }

      private bool resultIsReadOnly;
      private SpeedMessage2 result;

      private SpeedMessage2 PrepareBuilder() {
        if (resultIsReadOnly) {
          SpeedMessage2 original = result;
          result = new SpeedMessage2();
          resultIsReadOnly = false;
          MergeFrom(original);
        }
        return result;
      }

      public override bool IsInitialized {
        get { return result.IsInitialized; }
      }

      protected override SpeedMessage2 MessageBeingBuilt {
        get { return PrepareBuilder(); }
      }

      public override Builder Clear() {
        result = DefaultInstance;
        resultIsReadOnly = true;
        return this;
      }

      public override Builder Clone() {
        if (resultIsReadOnly) {
          return new Builder(result);
        } else {
          return new Builder().MergeFrom(result);
        }
      }

      public override pbd::MessageDescriptor DescriptorForType {
        get { return global::Google.ProtocolBuffers.TestProtos.SpeedMessage2.Descriptor; }
      }

      public override SpeedMessage2 DefaultInstanceForType {
        get { return global::Google.ProtocolBuffers.TestProtos.SpeedMessage2.DefaultInstance; }
      }

      public override SpeedMessage2 BuildPartial() {
        if (resultIsReadOnly) {
          return result;
        }
        resultIsReadOnly = true;
        return result.MakeReadOnly();
      }

      public override Builder MergeFrom(pb::IMessage other) {
        if (other is SpeedMessage2) {
          return MergeFrom((SpeedMessage2) other);
        } else {
          base.MergeFrom(other);
          return this;
        }
      }

      public override Builder MergeFrom(SpeedMessage2 other) {
        if (other == global::Google.ProtocolBuffers.TestProtos.SpeedMessage2.DefaultInstance) return this;
        PrepareBuilder();
        if (other.HasField1) {
          Field1 = other.Field1;
        }
        if (other.HasField3) {
          Field3 = other.Field3;
        }
        if (other.HasField4) {
          Field4 = other.Field4;
        }
        if (other.HasField30) {
          Field30 = other.Field30;
        }
        if (other.HasField75) {
          Field75 = other.Field75;
        }
        if (other.HasField6) {
          Field6 = other.Field6;
        }
        if (other.HasField2) {
          Field2 = other.Field2;
        }
        if (other.HasField21) {
          Field21 = other.Field21;
        }
        if (other.HasField71) {
          Field71 = other.Field71;
        }
        if (other.HasField25) {
          Field25 = other.Field25;
        }
        if (other.HasField109) {
          Field109 = other.Field109;
        }
        if (other.HasField210) {
          Field210 = other.Field210;
        }
        if (other.HasField211) {
          Field211 = other.Field211;
        }
        if (other.HasField212) {
          Field212 = other.Field212;
        }
        if (other.HasField213) {
          Field213 = other.Field213;
        }
        if (other.HasField216) {
          Field216 = other.Field216;
        }
        if (other.HasField217) {
          Field217 = other.Field217;
        }
        if (other.HasField218) {
          Field218 = other.Field218;
        }
        if (other.HasField220) {
          Field220 = other.Field220;
        }
        if (other.HasField221) {
          Field221 = other.Field221;
        }
        if (other.HasField222) {
          Field222 = other.Field222;
        }
        if (other.HasField63) {
          Field63 = other.Field63;
        }
        if (other.group1_.Count != 0) {
          result.group1_.Add(other.group1_);
        }
        if (other.field128_.Count != 0) {
          result.field128_.Add(other.field128_);
        }
        if (other.HasField131) {
          Field131 = other.Field131;
        }
        if (other.field127_.Count != 0) {
          result.field127_.Add(other.field127_);
        }
        if (other.HasField129) {
          Field129 = other.Field129;
        }
        if (other.field130_.Count != 0) {
          result.field130_.Add(other.field130_);
        }
        if (other.HasField205) {
          Field205 = other.Field205;
        }
        if (other.HasField206) {
          Field206 = other.Field206;
        }
        this.MergeUnknownFields(other.UnknownFields);
        return this;
      }

      public override Builder MergeFrom(pb::ICodedInputStream input) {
        return MergeFrom(input, pb::ExtensionRegistry.Empty);
      }

      public override Builder MergeFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
        PrepareBuilder();
        pb::UnknownFieldSet.Builder unknownFields = null;
        uint tag;
        string field_name;
        while (input.ReadTag(out tag, out field_name)) {
          if(tag == 0 && field_name != null) {
            int field_ordinal = global::System.Array.BinarySearch(_speedMessage2FieldNames, field_name, global::System.StringComparer.Ordinal);
            if(field_ordinal >= 0)
              tag = _speedMessage2FieldTags[field_ordinal];
            else {
              if (unknownFields == null) {
                unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
              }
              ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name);
              continue;
            }
          }
          switch (tag) {
            case 0: {
              throw pb::InvalidProtocolBufferException.InvalidTag();
            }
            default: {
              if (pb::WireFormat.IsEndGroupTag(tag)) {
                if (unknownFields != null) {
                  this.UnknownFields = unknownFields.Build();
                }
                return this;
              }
              if (unknownFields == null) {
                unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
              }
              ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name);
              break;
            }
            case 10: {
              result.hasField1 = input.ReadString(ref result.field1_);
              break;
            }
            case 18: {
              result.hasField2 = input.ReadBytes(ref result.field2_);
              break;
            }
            case 24: {
              result.hasField3 = input.ReadInt64(ref result.field3_);
              break;
            }
            case 32: {
              result.hasField4 = input.ReadInt64(ref result.field4_);
              break;
            }
            case 50: {
              result.hasField6 = input.ReadString(ref result.field6_);
              break;
            }
            case 83: {
              input.ReadGroupArray(tag, field_name, result.group1_, global::Google.ProtocolBuffers.TestProtos.SpeedMessage2.Types.Group1.DefaultInstance, extensionRegistry);
              break;
            }
            case 168: {
              result.hasField21 = input.ReadInt32(ref result.field21_);
              break;
            }
            case 205: {
              result.hasField25 = input.ReadFloat(ref result.field25_);
              break;
            }
            case 240: {
              result.hasField30 = input.ReadInt64(ref result.field30_);
              break;
            }
            case 504: {
              result.hasField63 = input.ReadInt32(ref result.field63_);
              break;
            }
            case 568: {
              result.hasField71 = input.ReadInt32(ref result.field71_);
              break;
            }
            case 600: {
              result.hasField75 = input.ReadBool(ref result.field75_);
              break;
            }
            case 872: {
              result.hasField109 = input.ReadInt32(ref result.field109_);
              break;
            }
            case 1018: {
              input.ReadStringArray(tag, field_name, result.field127_);
              break;
            }
            case 1026: {
              input.ReadStringArray(tag, field_name, result.field128_);
              break;
            }
            case 1032: {
              result.hasField129 = input.ReadInt32(ref result.field129_);
              break;
            }
            case 1042:
            case 1040: {
              input.ReadInt64Array(tag, field_name, result.field130_);
              break;
            }
            case 1048: {
              result.hasField131 = input.ReadInt64(ref result.field131_);
              break;
            }
            case 1640: {
              result.hasField205 = input.ReadBool(ref result.field205_);
              break;
            }
            case 1648: {
              result.hasField206 = input.ReadBool(ref result.field206_);
              break;
            }
            case 1680: {
              result.hasField210 = input.ReadInt32(ref result.field210_);
              break;
            }
            case 1688: {
              result.hasField211 = input.ReadInt32(ref result.field211_);
              break;
            }
            case 1696: {
              result.hasField212 = input.ReadInt32(ref result.field212_);
              break;
            }
            case 1704: {
              result.hasField213 = input.ReadInt32(ref result.field213_);
              break;
            }
            case 1728: {
              result.hasField216 = input.ReadInt32(ref result.field216_);
              break;
            }
            case 1736: {
              result.hasField217 = input.ReadInt32(ref result.field217_);
              break;
            }
            case 1744: {
              result.hasField218 = input.ReadInt32(ref result.field218_);
              break;
            }
            case 1760: {
              result.hasField220 = input.ReadInt32(ref result.field220_);
              break;
            }
            case 1768: {
              result.hasField221 = input.ReadInt32(ref result.field221_);
              break;
            }
            case 1781: {
              result.hasField222 = input.ReadFloat(ref result.field222_);
              break;
            }
          }
        }

        if (unknownFields != null) {
          this.UnknownFields = unknownFields.Build();
        }
        return this;
      }


      public bool HasField1 {
        get { return result.hasField1; }
      }
      public string Field1 {
        get { return result.Field1; }
        set { SetField1(value); }
      }
      public Builder SetField1(string value) {
        pb::ThrowHelper.ThrowIfNull(value, "value");
        PrepareBuilder();
        result.hasField1 = true;
        result.field1_ = value;
        return this;
      }
      public Builder ClearField1() {
        PrepareBuilder();
        result.hasField1 = false;
        result.field1_ = "";
        return this;
      }

      public bool HasField3 {
        get { return result.hasField3; }
      }
      public long Field3 {
        get { return result.Field3; }
        set { SetField3(value); }
      }
      public Builder SetField3(long value) {
        PrepareBuilder();
        result.hasField3 = true;
        result.field3_ = value;
        return this;
      }
      public Builder ClearField3() {
        PrepareBuilder();
        result.hasField3 = false;
        result.field3_ = 0L;
        return this;
      }

      public bool HasField4 {
        get { return result.hasField4; }
      }
      public long Field4 {
        get { return result.Field4; }
        set { SetField4(value); }
      }
      public Builder SetField4(long value) {
        PrepareBuilder();
        result.hasField4 = true;
        result.field4_ = value;
        return this;
      }
      public Builder ClearField4() {
        PrepareBuilder();
        result.hasField4 = false;
        result.field4_ = 0L;
        return this;
      }

      public bool HasField30 {
        get { return result.hasField30; }
      }
      public long Field30 {
        get { return result.Field30; }
        set { SetField30(value); }
      }
      public Builder SetField30(long value) {
        PrepareBuilder();
        result.hasField30 = true;
        result.field30_ = value;
        return this;
      }
      public Builder ClearField30() {
        PrepareBuilder();
        result.hasField30 = false;
        result.field30_ = 0L;
        return this;
      }

      public bool HasField75 {
        get { return result.hasField75; }
      }
      public bool Field75 {
        get { return result.Field75; }
        set { SetField75(value); }
      }
      public Builder SetField75(bool value) {
        PrepareBuilder();
        result.hasField75 = true;
        result.field75_ = value;
        return this;
      }
      public Builder ClearField75() {
        PrepareBuilder();
        result.hasField75 = false;
        result.field75_ = false;
        return this;
      }

      public bool HasField6 {
        get { return result.hasField6; }
      }
      public string Field6 {
        get { return result.Field6; }
        set { SetField6(value); }
      }
      public Builder SetField6(string value) {
        pb::ThrowHelper.ThrowIfNull(value, "value");
        PrepareBuilder();
        result.hasField6 = true;
        result.field6_ = value;
        return this;
      }
      public Builder ClearField6() {
        PrepareBuilder();
        result.hasField6 = false;
        result.field6_ = "";
        return this;
      }

      public bool HasField2 {
        get { return result.hasField2; }
      }
      public pb::ByteString Field2 {
        get { return result.Field2; }
        set { SetField2(value); }
      }
      public Builder SetField2(pb::ByteString value) {
        pb::ThrowHelper.ThrowIfNull(value, "value");
        PrepareBuilder();
        result.hasField2 = true;
        result.field2_ = value;
        return this;
      }
      public Builder ClearField2() {
        PrepareBuilder();
        result.hasField2 = false;
        result.field2_ = pb::ByteString.Empty;
        return this;
      }

      public bool HasField21 {
        get { return result.hasField21; }
      }
      public int Field21 {
        get { return result.Field21; }
        set { SetField21(value); }
      }
      public Builder SetField21(int value) {
        PrepareBuilder();
        result.hasField21 = true;
        result.field21_ = value;
        return this;
      }
      public Builder ClearField21() {
        PrepareBuilder();
        result.hasField21 = false;
        result.field21_ = 0;
        return this;
      }

      public bool HasField71 {
        get { return result.hasField71; }
      }
      public int Field71 {
        get { return result.Field71; }
        set { SetField71(value); }
      }
      public Builder SetField71(int value) {
        PrepareBuilder();
        result.hasField71 = true;
        result.field71_ = value;
        return this;
      }
      public Builder ClearField71() {
        PrepareBuilder();
        result.hasField71 = false;
        result.field71_ = 0;
        return this;
      }

      public bool HasField25 {
        get { return result.hasField25; }
      }
      public float Field25 {
        get { return result.Field25; }
        set { SetField25(value); }
      }
      public Builder SetField25(float value) {
        PrepareBuilder();
        result.hasField25 = true;
        result.field25_ = value;
        return this;
      }
      public Builder ClearField25() {
        PrepareBuilder();
        result.hasField25 = false;
        result.field25_ = 0F;
        return this;
      }

      public bool HasField109 {
        get { return result.hasField109; }
      }
      public int Field109 {
        get { return result.Field109; }
        set { SetField109(value); }
      }
      public Builder SetField109(int value) {
        PrepareBuilder();
        result.hasField109 = true;
        result.field109_ = value;
        return this;
      }
      public Builder ClearField109() {
        PrepareBuilder();
        result.hasField109 = false;
        result.field109_ = 0;
        return this;
      }

      public bool HasField210 {
        get { return result.hasField210; }
      }
      public int Field210 {
        get { return result.Field210; }
        set { SetField210(value); }
      }
      public Builder SetField210(int value) {
        PrepareBuilder();
        result.hasField210 = true;
        result.field210_ = value;
        return this;
      }
      public Builder ClearField210() {
        PrepareBuilder();
        result.hasField210 = false;
        result.field210_ = 0;
        return this;
      }

      public bool HasField211 {
        get { return result.hasField211; }
      }
      public int Field211 {
        get { return result.Field211; }
        set { SetField211(value); }
      }
      public Builder SetField211(int value) {
        PrepareBuilder();
        result.hasField211 = true;
        result.field211_ = value;
        return this;
      }
      public Builder ClearField211() {
        PrepareBuilder();
        result.hasField211 = false;
        result.field211_ = 0;
        return this;
      }

      public bool HasField212 {
        get { return result.hasField212; }
      }
      public int Field212 {
        get { return result.Field212; }
        set { SetField212(value); }
      }
      public Builder SetField212(int value) {
        PrepareBuilder();
        result.hasField212 = true;
        result.field212_ = value;
        return this;
      }
      public Builder ClearField212() {
        PrepareBuilder();
        result.hasField212 = false;
        result.field212_ = 0;
        return this;
      }

      public bool HasField213 {
        get { return result.hasField213; }
      }
      public int Field213 {
        get { return result.Field213; }
        set { SetField213(value); }
      }
      public Builder SetField213(int value) {
        PrepareBuilder();
        result.hasField213 = true;
        result.field213_ = value;
        return this;
      }
      public Builder ClearField213() {
        PrepareBuilder();
        result.hasField213 = false;
        result.field213_ = 0;
        return this;
      }

      public bool HasField216 {
        get { return result.hasField216; }
      }
      public int Field216 {
        get { return result.Field216; }
        set { SetField216(value); }
      }
      public Builder SetField216(int value) {
        PrepareBuilder();
        result.hasField216 = true;
        result.field216_ = value;
        return this;
      }
      public Builder ClearField216() {
        PrepareBuilder();
        result.hasField216 = false;
        result.field216_ = 0;
        return this;
      }

      public bool HasField217 {
        get { return result.hasField217; }
      }
      public int Field217 {
        get { return result.Field217; }
        set { SetField217(value); }
      }
      public Builder SetField217(int value) {
        PrepareBuilder();
        result.hasField217 = true;
        result.field217_ = value;
        return this;
      }
      public Builder ClearField217() {
        PrepareBuilder();
        result.hasField217 = false;
        result.field217_ = 0;
        return this;
      }

      public bool HasField218 {
        get { return result.hasField218; }
      }
      public int Field218 {
        get { return result.Field218; }
        set { SetField218(value); }
      }
      public Builder SetField218(int value) {
        PrepareBuilder();
        result.hasField218 = true;
        result.field218_ = value;
        return this;
      }
      public Builder ClearField218() {
        PrepareBuilder();
        result.hasField218 = false;
        result.field218_ = 0;
        return this;
      }

      public bool HasField220 {
        get { return result.hasField220; }
      }
      public int Field220 {
        get { return result.Field220; }
        set { SetField220(value); }
      }
      public Builder SetField220(int value) {
        PrepareBuilder();
        result.hasField220 = true;
        result.field220_ = value;
        return this;
      }
      public Builder ClearField220() {
        PrepareBuilder();
        result.hasField220 = false;
        result.field220_ = 0;
        return this;
      }

      public bool HasField221 {
        get { return result.hasField221; }
      }
      public int Field221 {
        get { return result.Field221; }
        set { SetField221(value); }
      }
      public Builder SetField221(int value) {
        PrepareBuilder();
        result.hasField221 = true;
        result.field221_ = value;
        return this;
      }
      public Builder ClearField221() {
        PrepareBuilder();
        result.hasField221 = false;
        result.field221_ = 0;
        return this;
      }

      public bool HasField222 {
        get { return result.hasField222; }
      }
      public float Field222 {
        get { return result.Field222; }
        set { SetField222(value); }
      }
      public Builder SetField222(float value) {
        PrepareBuilder();
        result.hasField222 = true;
        result.field222_ = value;
        return this;
      }
      public Builder ClearField222() {
        PrepareBuilder();
        result.hasField222 = false;
        result.field222_ = 0F;
        return this;
      }

      public bool HasField63 {
        get { return result.hasField63; }
      }
      public int Field63 {
        get { return result.Field63; }
        set { SetField63(value); }
      }
      public Builder SetField63(int value) {
        PrepareBuilder();
        result.hasField63 = true;
        result.field63_ = value;
        return this;
      }
      public Builder ClearField63() {
        PrepareBuilder();
        result.hasField63 = false;
        result.field63_ = 0;
        return this;
      }

      public pbc::IPopsicleList<global::Google.ProtocolBuffers.TestProtos.SpeedMessage2.Types.Group1> Group1List {
        get { return PrepareBuilder().group1_; }
      }
      public int Group1Count {
        get { return result.Group1Count; }
      }
      public global::Google.ProtocolBuffers.TestProtos.SpeedMessage2.Types.Group1 GetGroup1(int index) {
        return result.GetGroup1(index);
      }
      public Builder SetGroup1(int index, global::Google.ProtocolBuffers.TestProtos.SpeedMessage2.Types.Group1 value) {
        pb::ThrowHelper.ThrowIfNull(value, "value");
        PrepareBuilder();
        result.group1_[index] = value;
        return this;
      }
      public Builder SetGroup1(int index, global::Google.ProtocolBuffers.TestProtos.SpeedMessage2.Types.Group1.Builder builderForValue) {
        pb::ThrowHelper.ThrowIfNull(builderForValue, "builderForValue");
        PrepareBuilder();
        result.group1_[index] = builderForValue.Build();
        return this;
      }
      public Builder AddGroup1(global::Google.ProtocolBuffers.TestProtos.SpeedMessage2.Types.Group1 value) {
        pb::ThrowHelper.ThrowIfNull(value, "value");
        PrepareBuilder();
        result.group1_.Add(value);
        return this;
      }
      public Builder AddGroup1(global::Google.ProtocolBuffers.TestProtos.SpeedMessage2.Types.Group1.Builder builderForValue) {
        pb::ThrowHelper.ThrowIfNull(builderForValue, "builderForValue");
        PrepareBuilder();
        result.group1_.Add(builderForValue.Build());
        return this;
      }
      public Builder AddRangeGroup1(scg::IEnumerable<global::Google.ProtocolBuffers.TestProtos.SpeedMessage2.Types.Group1> values) {
        PrepareBuilder();
        result.group1_.Add(values);
        return this;
      }
      public Builder ClearGroup1() {
        PrepareBuilder();
        result.group1_.Clear();
        return this;
      }

      public pbc::IPopsicleList<string> Field128List {
        get { return PrepareBuilder().field128_; }
      }
      public int Field128Count {
        get { return result.Field128Count; }
      }
      public string GetField128(int index) {
        return result.GetField128(index);
      }
      public Builder SetField128(int index, string value) {
        pb::ThrowHelper.ThrowIfNull(value, "value");
        PrepareBuilder();
        result.field128_[index] = value;
        return this;
      }
      public Builder AddField128(string value) {
        pb::ThrowHelper.ThrowIfNull(value, "value");
        PrepareBuilder();
        result.field128_.Add(value);
        return this;
      }
      public Builder AddRangeField128(scg::IEnumerable<string> values) {
        PrepareBuilder();
        result.field128_.Add(values);
        return this;
      }
      public Builder ClearField128() {
        PrepareBuilder();
        result.field128_.Clear();
        return this;
      }

      public bool HasField131 {
        get { return result.hasField131; }
      }
      public long Field131 {
        get { return result.Field131; }
        set { SetField131(value); }
      }
      public Builder SetField131(long value) {
        PrepareBuilder();
        result.hasField131 = true;
        result.field131_ = value;
        return this;
      }
      public Builder ClearField131() {
        PrepareBuilder();
        result.hasField131 = false;
        result.field131_ = 0L;
        return this;
      }

      public pbc::IPopsicleList<string> Field127List {
        get { return PrepareBuilder().field127_; }
      }
      public int Field127Count {
        get { return result.Field127Count; }
      }
      public string GetField127(int index) {
        return result.GetField127(index);
      }
      public Builder SetField127(int index, string value) {
        pb::ThrowHelper.ThrowIfNull(value, "value");
        PrepareBuilder();
        result.field127_[index] = value;
        return this;
      }
      public Builder AddField127(string value) {
        pb::ThrowHelper.ThrowIfNull(value, "value");
        PrepareBuilder();
        result.field127_.Add(value);
        return this;
      }
      public Builder AddRangeField127(scg::IEnumerable<string> values) {
        PrepareBuilder();
        result.field127_.Add(values);
        return this;
      }
      public Builder ClearField127() {
        PrepareBuilder();
        result.field127_.Clear();
        return this;
      }

      public bool HasField129 {
        get { return result.hasField129; }
      }
      public int Field129 {
        get { return result.Field129; }
        set { SetField129(value); }
      }
      public Builder SetField129(int value) {
        PrepareBuilder();
        result.hasField129 = true;
        result.field129_ = value;
        return this;
      }
      public Builder ClearField129() {
        PrepareBuilder();
        result.hasField129 = false;
        result.field129_ = 0;
        return this;
      }

      public pbc::IPopsicleList<long> Field130List {
        get { return PrepareBuilder().field130_; }
      }
      public int Field130Count {
        get { return result.Field130Count; }
      }
      public long GetField130(int index) {
        return result.GetField130(index);
      }
      public Builder SetField130(int index, long value) {
        PrepareBuilder();
        result.field130_[index] = value;
        return this;
      }
      public Builder AddField130(long value) {
        PrepareBuilder();
        result.field130_.Add(value);
        return this;
      }
      public Builder AddRangeField130(scg::IEnumerable<long> values) {
        PrepareBuilder();
        result.field130_.Add(values);
        return this;
      }
      public Builder ClearField130() {
        PrepareBuilder();
        result.field130_.Clear();
        return this;
      }

      public bool HasField205 {
        get { return result.hasField205; }
      }
      public bool Field205 {
        get { return result.Field205; }
        set { SetField205(value); }
      }
      public Builder SetField205(bool value) {
        PrepareBuilder();
        result.hasField205 = true;
        result.field205_ = value;
        return this;
      }
      public Builder ClearField205() {
        PrepareBuilder();
        result.hasField205 = false;
        result.field205_ = false;
        return this;
      }

      public bool HasField206 {
        get { return result.hasField206; }
      }
      public bool Field206 {
        get { return result.Field206; }
        set { SetField206(value); }
      }
      public Builder SetField206(bool value) {
        PrepareBuilder();
        result.hasField206 = true;
        result.field206_ = value;
        return this;
      }
      public Builder ClearField206() {
        PrepareBuilder();
        result.hasField206 = false;
        result.field206_ = false;
        return this;
      }
    }
    static SpeedMessage2() {
      object.ReferenceEquals(global::Google.ProtocolBuffers.TestProtos.GoogleSpeed.Descriptor, null);
    }
  }

  [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
  public sealed partial class SpeedMessage2GroupedMessage : pb::GeneratedMessage<SpeedMessage2GroupedMessage, SpeedMessage2GroupedMessage.Builder> {
    private SpeedMessage2GroupedMessage() { }
    private static readonly SpeedMessage2GroupedMessage defaultInstance = new SpeedMessage2GroupedMessage().MakeReadOnly();
    private static readonly string[] _speedMessage2GroupedMessageFieldNames = new string[] { "field1", "field10", "field11", "field2", "field3", "field4", "field5", "field6", "field7", "field8", "field9" };
    private static readonly uint[] _speedMessage2GroupedMessageFieldTags = new uint[] { 13, 85, 88, 21, 29, 32, 40, 48, 56, 69, 72 };
    public static SpeedMessage2GroupedMessage DefaultInstance {
      get { return defaultInstance; }
    }

    public override SpeedMessage2GroupedMessage DefaultInstanceForType {
      get { return DefaultInstance; }
    }

    protected override SpeedMessage2GroupedMessage ThisMessage {
      get { return this; }
    }

    public static pbd::MessageDescriptor Descriptor {
      get { return global::Google.ProtocolBuffers.TestProtos.GoogleSpeed.internal__static_benchmarks_SpeedMessage2GroupedMessage__Descriptor; }
    }

    protected override pb::FieldAccess.FieldAccessorTable<SpeedMessage2GroupedMessage, SpeedMessage2GroupedMessage.Builder> InternalFieldAccessors {
      get { return global::Google.ProtocolBuffers.TestProtos.GoogleSpeed.internal__static_benchmarks_SpeedMessage2GroupedMessage__FieldAccessorTable; }
    }

    public const int Field1FieldNumber = 1;
    private bool hasField1;
    private float field1_;
    public bool HasField1 {
      get { return hasField1; }
    }
    public float Field1 {
      get { return field1_; }
    }

    public const int Field2FieldNumber = 2;
    private bool hasField2;
    private float field2_;
    public bool HasField2 {
      get { return hasField2; }
    }
    public float Field2 {
      get { return field2_; }
    }

    public const int Field3FieldNumber = 3;
    private bool hasField3;
    private float field3_;
    public bool HasField3 {
      get { return hasField3; }
    }
    public float Field3 {
      get { return field3_; }
    }

    public const int Field4FieldNumber = 4;
    private bool hasField4;
    private bool field4_;
    public bool HasField4 {
      get { return hasField4; }
    }
    public bool Field4 {
      get { return field4_; }
    }

    public const int Field5FieldNumber = 5;
    private bool hasField5;
    private bool field5_;
    public bool HasField5 {
      get { return hasField5; }
    }
    public bool Field5 {
      get { return field5_; }
    }

    public const int Field6FieldNumber = 6;
    private bool hasField6;
    private bool field6_ = true;
    public bool HasField6 {
      get { return hasField6; }
    }
    public bool Field6 {
      get { return field6_; }
    }

    public const int Field7FieldNumber = 7;
    private bool hasField7;
    private bool field7_;
    public bool HasField7 {
      get { return hasField7; }
    }
    public bool Field7 {
      get { return field7_; }
    }

    public const int Field8FieldNumber = 8;
    private bool hasField8;
    private float field8_;
    public bool HasField8 {
      get { return hasField8; }
    }
    public float Field8 {
      get { return field8_; }
    }

    public const int Field9FieldNumber = 9;
    private bool hasField9;
    private bool field9_;
    public bool HasField9 {
      get { return hasField9; }
    }
    public bool Field9 {
      get { return field9_; }
    }

    public const int Field10FieldNumber = 10;
    private bool hasField10;
    private float field10_;
    public bool HasField10 {
      get { return hasField10; }
    }
    public float Field10 {
      get { return field10_; }
    }

    public const int Field11FieldNumber = 11;
    private bool hasField11;
    private long field11_;
    public bool HasField11 {
      get { return hasField11; }
    }
    public long Field11 {
      get { return field11_; }
    }

    public override bool IsInitialized {
      get {
        return true;
      }
    }

    public override void WriteTo(pb::ICodedOutputStream output) {
      CalcSerializedSize();
      string[] field_names = _speedMessage2GroupedMessageFieldNames;
      if (hasField1) {
        output.WriteFloat(1, field_names[0], Field1);
      }
      if (hasField2) {
        output.WriteFloat(2, field_names[3], Field2);
      }
      if (hasField3) {
        output.WriteFloat(3, field_names[4], Field3);
      }
      if (hasField4) {
        output.WriteBool(4, field_names[5], Field4);
      }
      if (hasField5) {
        output.WriteBool(5, field_names[6], Field5);
      }
      if (hasField6) {
        output.WriteBool(6, field_names[7], Field6);
      }
      if (hasField7) {
        output.WriteBool(7, field_names[8], Field7);
      }
      if (hasField8) {
        output.WriteFloat(8, field_names[9], Field8);
      }
      if (hasField9) {
        output.WriteBool(9, field_names[10], Field9);
      }
      if (hasField10) {
        output.WriteFloat(10, field_names[1], Field10);
      }
      if (hasField11) {
        output.WriteInt64(11, field_names[2], Field11);
      }
      UnknownFields.WriteTo(output);
    }

    private int memoizedSerializedSize = -1;
    public override int SerializedSize {
      get {
        int size = memoizedSerializedSize;
        if (size != -1) return size;
        return CalcSerializedSize();
      }
    }

    private int CalcSerializedSize() {
      int size = memoizedSerializedSize;
      if (size != -1) return size;

      size = 0;
      if (hasField1) {
        size += pb::CodedOutputStream.ComputeFloatSize(1, Field1);
      }
      if (hasField2) {
        size += pb::CodedOutputStream.ComputeFloatSize(2, Field2);
      }
      if (hasField3) {
        size += pb::CodedOutputStream.ComputeFloatSize(3, Field3);
      }
      if (hasField4) {
        size += pb::CodedOutputStream.ComputeBoolSize(4, Field4);
      }
      if (hasField5) {
        size += pb::CodedOutputStream.ComputeBoolSize(5, Field5);
      }
      if (hasField6) {
        size += pb::CodedOutputStream.ComputeBoolSize(6, Field6);
      }
      if (hasField7) {
        size += pb::CodedOutputStream.ComputeBoolSize(7, Field7);
      }
      if (hasField8) {
        size += pb::CodedOutputStream.ComputeFloatSize(8, Field8);
      }
      if (hasField9) {
        size += pb::CodedOutputStream.ComputeBoolSize(9, Field9);
      }
      if (hasField10) {
        size += pb::CodedOutputStream.ComputeFloatSize(10, Field10);
      }
      if (hasField11) {
        size += pb::CodedOutputStream.ComputeInt64Size(11, Field11);
      }
      size += UnknownFields.SerializedSize;
      memoizedSerializedSize = size;
      return size;
    }
    public static SpeedMessage2GroupedMessage ParseFrom(pb::ByteString data) {
      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
    }
    public static SpeedMessage2GroupedMessage ParseFrom(pb::ByteString data, pb::ExtensionRegistry extensionRegistry) {
      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
    }
    public static SpeedMessage2GroupedMessage ParseFrom(byte[] data) {
      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
    }
    public static SpeedMessage2GroupedMessage ParseFrom(byte[] data, pb::ExtensionRegistry extensionRegistry) {
      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
    }
    public static SpeedMessage2GroupedMessage ParseFrom(global::System.IO.Stream input) {
      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
    }
    public static SpeedMessage2GroupedMessage ParseFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
    }
    public static SpeedMessage2GroupedMessage ParseDelimitedFrom(global::System.IO.Stream input) {
      return CreateBuilder().MergeDelimitedFrom(input).BuildParsed();
    }
    public static SpeedMessage2GroupedMessage ParseDelimitedFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
      return CreateBuilder().MergeDelimitedFrom(input, extensionRegistry).BuildParsed();
    }
    public static SpeedMessage2GroupedMessage ParseFrom(pb::ICodedInputStream input) {
      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
    }
    public static SpeedMessage2GroupedMessage ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
    }
    private SpeedMessage2GroupedMessage MakeReadOnly() {
      return this;
    }

    public static Builder CreateBuilder() { return new Builder(); }
    public override Builder ToBuilder() { return CreateBuilder(this); }
    public override Builder CreateBuilderForType() { return new Builder(); }
    public static Builder CreateBuilder(SpeedMessage2GroupedMessage prototype) {
      return new Builder(prototype);
    }

    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
    public sealed partial class Builder : pb::GeneratedBuilder<SpeedMessage2GroupedMessage, Builder> {
      protected override Builder ThisBuilder {
        get { return this; }
      }
      public Builder() {
        result = DefaultInstance;
        resultIsReadOnly = true;
      }
      internal Builder(SpeedMessage2GroupedMessage cloneFrom) {
        result = cloneFrom;
        resultIsReadOnly = true;
      }

      private bool resultIsReadOnly;
      private SpeedMessage2GroupedMessage result;

      private SpeedMessage2GroupedMessage PrepareBuilder() {
        if (resultIsReadOnly) {
          SpeedMessage2GroupedMessage original = result;
          result = new SpeedMessage2GroupedMessage();
          resultIsReadOnly = false;
          MergeFrom(original);
        }
        return result;
      }

      public override bool IsInitialized {
        get { return result.IsInitialized; }
      }

      protected override SpeedMessage2GroupedMessage MessageBeingBuilt {
        get { return PrepareBuilder(); }
      }

      public override Builder Clear() {
        result = DefaultInstance;
        resultIsReadOnly = true;
        return this;
      }

      public override Builder Clone() {
        if (resultIsReadOnly) {
          return new Builder(result);
        } else {
          return new Builder().MergeFrom(result);
        }
      }

      public override pbd::MessageDescriptor DescriptorForType {
        get { return global::Google.ProtocolBuffers.TestProtos.SpeedMessage2GroupedMessage.Descriptor; }
      }

      public override SpeedMessage2GroupedMessage DefaultInstanceForType {
        get { return global::Google.ProtocolBuffers.TestProtos.SpeedMessage2GroupedMessage.DefaultInstance; }
      }

      public override SpeedMessage2GroupedMessage BuildPartial() {
        if (resultIsReadOnly) {
          return result;
        }
        resultIsReadOnly = true;
        return result.MakeReadOnly();
      }

      public override Builder MergeFrom(pb::IMessage other) {
        if (other is SpeedMessage2GroupedMessage) {
          return MergeFrom((SpeedMessage2GroupedMessage) other);
        } else {
          base.MergeFrom(other);
          return this;
        }
      }

      public override Builder MergeFrom(SpeedMessage2GroupedMessage other) {
        if (other == global::Google.ProtocolBuffers.TestProtos.SpeedMessage2GroupedMessage.DefaultInstance) return this;
        PrepareBuilder();
        if (other.HasField1) {
          Field1 = other.Field1;
        }
        if (other.HasField2) {
          Field2 = other.Field2;
        }
        if (other.HasField3) {
          Field3 = other.Field3;
        }
        if (other.HasField4) {
          Field4 = other.Field4;
        }
        if (other.HasField5) {
          Field5 = other.Field5;
        }
        if (other.HasField6) {
          Field6 = other.Field6;
        }
        if (other.HasField7) {
          Field7 = other.Field7;
        }
        if (other.HasField8) {
          Field8 = other.Field8;
        }
        if (other.HasField9) {
          Field9 = other.Field9;
        }
        if (other.HasField10) {
          Field10 = other.Field10;
        }
        if (other.HasField11) {
          Field11 = other.Field11;
        }
        this.MergeUnknownFields(other.UnknownFields);
        return this;
      }

      public override Builder MergeFrom(pb::ICodedInputStream input) {
        return MergeFrom(input, pb::ExtensionRegistry.Empty);
      }

      public override Builder MergeFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
        PrepareBuilder();
        pb::UnknownFieldSet.Builder unknownFields = null;
        uint tag;
        string field_name;
        while (input.ReadTag(out tag, out field_name)) {
          if(tag == 0 && field_name != null) {
            int field_ordinal = global::System.Array.BinarySearch(_speedMessage2GroupedMessageFieldNames, field_name, global::System.StringComparer.Ordinal);
            if(field_ordinal >= 0)
              tag = _speedMessage2GroupedMessageFieldTags[field_ordinal];
            else {
              if (unknownFields == null) {
                unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
              }
              ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name);
              continue;
            }
          }
          switch (tag) {
            case 0: {
              throw pb::InvalidProtocolBufferException.InvalidTag();
            }
            default: {
              if (pb::WireFormat.IsEndGroupTag(tag)) {
                if (unknownFields != null) {
                  this.UnknownFields = unknownFields.Build();
                }
                return this;
              }
              if (unknownFields == null) {
                unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
              }
              ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name);
              break;
            }
            case 13: {
              result.hasField1 = input.ReadFloat(ref result.field1_);
              break;
            }
            case 21: {
              result.hasField2 = input.ReadFloat(ref result.field2_);
              break;
            }
            case 29: {
              result.hasField3 = input.ReadFloat(ref result.field3_);
              break;
            }
            case 32: {
              result.hasField4 = input.ReadBool(ref result.field4_);
              break;
            }
            case 40: {
              result.hasField5 = input.ReadBool(ref result.field5_);
              break;
            }
            case 48: {
              result.hasField6 = input.ReadBool(ref result.field6_);
              break;
            }
            case 56: {
              result.hasField7 = input.ReadBool(ref result.field7_);
              break;
            }
            case 69: {
              result.hasField8 = input.ReadFloat(ref result.field8_);
              break;
            }
            case 72: {
              result.hasField9 = input.ReadBool(ref result.field9_);
              break;
            }
            case 85: {
              result.hasField10 = input.ReadFloat(ref result.field10_);
              break;
            }
            case 88: {
              result.hasField11 = input.ReadInt64(ref result.field11_);
              break;
            }
          }
        }

        if (unknownFields != null) {
          this.UnknownFields = unknownFields.Build();
        }
        return this;
      }


      public bool HasField1 {
        get { return result.hasField1; }
      }
      public float Field1 {
        get { return result.Field1; }
        set { SetField1(value); }
      }
      public Builder SetField1(float value) {
        PrepareBuilder();
        result.hasField1 = true;
        result.field1_ = value;
        return this;
      }
      public Builder ClearField1() {
        PrepareBuilder();
        result.hasField1 = false;
        result.field1_ = 0F;
        return this;
      }

      public bool HasField2 {
        get { return result.hasField2; }
      }
      public float Field2 {
        get { return result.Field2; }
        set { SetField2(value); }
      }
      public Builder SetField2(float value) {
        PrepareBuilder();
        result.hasField2 = true;
        result.field2_ = value;
        return this;
      }
      public Builder ClearField2() {
        PrepareBuilder();
        result.hasField2 = false;
        result.field2_ = 0F;
        return this;
      }

      public bool HasField3 {
        get { return result.hasField3; }
      }
      public float Field3 {
        get { return result.Field3; }
        set { SetField3(value); }
      }
      public Builder SetField3(float value) {
        PrepareBuilder();
        result.hasField3 = true;
        result.field3_ = value;
        return this;
      }
      public Builder ClearField3() {
        PrepareBuilder();
        result.hasField3 = false;
        result.field3_ = 0F;
        return this;
      }

      public bool HasField4 {
        get { return result.hasField4; }
      }
      public bool Field4 {
        get { return result.Field4; }
        set { SetField4(value); }
      }
      public Builder SetField4(bool value) {
        PrepareBuilder();
        result.hasField4 = true;
        result.field4_ = value;
        return this;
      }
      public Builder ClearField4() {
        PrepareBuilder();
        result.hasField4 = false;
        result.field4_ = false;
        return this;
      }

      public bool HasField5 {
        get { return result.hasField5; }
      }
      public bool Field5 {
        get { return result.Field5; }
        set { SetField5(value); }
      }
      public Builder SetField5(bool value) {
        PrepareBuilder();
        result.hasField5 = true;
        result.field5_ = value;
        return this;
      }
      public Builder ClearField5() {
        PrepareBuilder();
        result.hasField5 = false;
        result.field5_ = false;
        return this;
      }

      public bool HasField6 {
        get { return result.hasField6; }
      }
      public bool Field6 {
        get { return result.Field6; }
        set { SetField6(value); }
      }
      public Builder SetField6(bool value) {
        PrepareBuilder();
        result.hasField6 = true;
        result.field6_ = value;
        return this;
      }
      public Builder ClearField6() {
        PrepareBuilder();
        result.hasField6 = false;
        result.field6_ = true;
        return this;
      }

      public bool HasField7 {
        get { return result.hasField7; }
      }
      public bool Field7 {
        get { return result.Field7; }
        set { SetField7(value); }
      }
      public Builder SetField7(bool value) {
        PrepareBuilder();
        result.hasField7 = true;
        result.field7_ = value;
        return this;
      }
      public Builder ClearField7() {
        PrepareBuilder();
        result.hasField7 = false;
        result.field7_ = false;
        return this;
      }

      public bool HasField8 {
        get { return result.hasField8; }
      }
      public float Field8 {
        get { return result.Field8; }
        set { SetField8(value); }
      }
      public Builder SetField8(float value) {
        PrepareBuilder();
        result.hasField8 = true;
        result.field8_ = value;
        return this;
      }
      public Builder ClearField8() {
        PrepareBuilder();
        result.hasField8 = false;
        result.field8_ = 0F;
        return this;
      }

      public bool HasField9 {
        get { return result.hasField9; }
      }
      public bool Field9 {
        get { return result.Field9; }
        set { SetField9(value); }
      }
      public Builder SetField9(bool value) {
        PrepareBuilder();
        result.hasField9 = true;
        result.field9_ = value;
        return this;
      }
      public Builder ClearField9() {
        PrepareBuilder();
        result.hasField9 = false;
        result.field9_ = false;
        return this;
      }

      public bool HasField10 {
        get { return result.hasField10; }
      }
      public float Field10 {
        get { return result.Field10; }
        set { SetField10(value); }
      }
      public Builder SetField10(float value) {
        PrepareBuilder();
        result.hasField10 = true;
        result.field10_ = value;
        return this;
      }
      public Builder ClearField10() {
        PrepareBuilder();
        result.hasField10 = false;
        result.field10_ = 0F;
        return this;
      }

      public bool HasField11 {
        get { return result.hasField11; }
      }
      public long Field11 {
        get { return result.Field11; }
        set { SetField11(value); }
      }
      public Builder SetField11(long value) {
        PrepareBuilder();
        result.hasField11 = true;
        result.field11_ = value;
        return this;
      }
      public Builder ClearField11() {
        PrepareBuilder();
        result.hasField11 = false;
        result.field11_ = 0L;
        return this;
      }
    }
    static SpeedMessage2GroupedMessage() {
      object.ReferenceEquals(global::Google.ProtocolBuffers.TestProtos.GoogleSpeed.Descriptor, null);
    }
  }

  #endregion

}

#endregion Designer generated code
