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

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

  /// <summary>Holder for reflection information generated from google/protobuf/unittest_well_known_types.proto</summary>
  public static partial class UnittestWellKnownTypesReflection {

    #region Descriptor
    /// <summary>File descriptor for google/protobuf/unittest_well_known_types.proto</summary>
    public static pbr::FileDescriptor Descriptor {
      get { return descriptor; }
    }
    private static pbr::FileDescriptor descriptor;

    static UnittestWellKnownTypesReflection() {
      byte[] descriptorData = global::System.Convert.FromBase64String(
          string.Concat(
            "Ci9nb29nbGUvcHJvdG9idWYvdW5pdHRlc3Rfd2VsbF9rbm93bl90eXBlcy5w",
            "cm90bxIRcHJvdG9idWZfdW5pdHRlc3QaGWdvb2dsZS9wcm90b2J1Zi9hbnku",
            "cHJvdG8aGWdvb2dsZS9wcm90b2J1Zi9hcGkucHJvdG8aHmdvb2dsZS9wcm90",
            "b2J1Zi9kdXJhdGlvbi5wcm90bxobZ29vZ2xlL3Byb3RvYnVmL2VtcHR5LnBy",
            "b3RvGiBnb29nbGUvcHJvdG9idWYvZmllbGRfbWFzay5wcm90bxokZ29vZ2xl",
            "L3Byb3RvYnVmL3NvdXJjZV9jb250ZXh0LnByb3RvGhxnb29nbGUvcHJvdG9i",
            "dWYvc3RydWN0LnByb3RvGh9nb29nbGUvcHJvdG9idWYvdGltZXN0YW1wLnBy",
            "b3RvGhpnb29nbGUvcHJvdG9idWYvdHlwZS5wcm90bxoeZ29vZ2xlL3Byb3Rv",
            "YnVmL3dyYXBwZXJzLnByb3RvIr4HChJUZXN0V2VsbEtub3duVHlwZXMSJwoJ",
            "YW55X2ZpZWxkGAEgASgLMhQuZ29vZ2xlLnByb3RvYnVmLkFueRInCglhcGlf",
            "ZmllbGQYAiABKAsyFC5nb29nbGUucHJvdG9idWYuQXBpEjEKDmR1cmF0aW9u",
            "X2ZpZWxkGAMgASgLMhkuZ29vZ2xlLnByb3RvYnVmLkR1cmF0aW9uEisKC2Vt",
            "cHR5X2ZpZWxkGAQgASgLMhYuZ29vZ2xlLnByb3RvYnVmLkVtcHR5EjQKEGZp",
            "ZWxkX21hc2tfZmllbGQYBSABKAsyGi5nb29nbGUucHJvdG9idWYuRmllbGRN",
            "YXNrEjwKFHNvdXJjZV9jb250ZXh0X2ZpZWxkGAYgASgLMh4uZ29vZ2xlLnBy",
            "b3RvYnVmLlNvdXJjZUNvbnRleHQSLQoMc3RydWN0X2ZpZWxkGAcgASgLMhcu",
            "Z29vZ2xlLnByb3RvYnVmLlN0cnVjdBIzCg90aW1lc3RhbXBfZmllbGQYCCAB",
            "KAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wEikKCnR5cGVfZmllbGQY",
            "CSABKAsyFS5nb29nbGUucHJvdG9idWYuVHlwZRIyCgxkb3VibGVfZmllbGQY",
            "CiABKAsyHC5nb29nbGUucHJvdG9idWYuRG91YmxlVmFsdWUSMAoLZmxvYXRf",
            "ZmllbGQYCyABKAsyGy5nb29nbGUucHJvdG9idWYuRmxvYXRWYWx1ZRIwCgtp",
            "bnQ2NF9maWVsZBgMIAEoCzIbLmdvb2dsZS5wcm90b2J1Zi5JbnQ2NFZhbHVl",
            "EjIKDHVpbnQ2NF9maWVsZBgNIAEoCzIcLmdvb2dsZS5wcm90b2J1Zi5VSW50",
            "NjRWYWx1ZRIwCgtpbnQzMl9maWVsZBgOIAEoCzIbLmdvb2dsZS5wcm90b2J1",
            "Zi5JbnQzMlZhbHVlEjIKDHVpbnQzMl9maWVsZBgPIAEoCzIcLmdvb2dsZS5w",
            "cm90b2J1Zi5VSW50MzJWYWx1ZRIuCgpib29sX2ZpZWxkGBAgASgLMhouZ29v",
            "Z2xlLnByb3RvYnVmLkJvb2xWYWx1ZRIyCgxzdHJpbmdfZmllbGQYESABKAsy",
            "HC5nb29nbGUucHJvdG9idWYuU3RyaW5nVmFsdWUSMAoLYnl0ZXNfZmllbGQY",
            "EiABKAsyGy5nb29nbGUucHJvdG9idWYuQnl0ZXNWYWx1ZRIrCgt2YWx1ZV9m",
            "aWVsZBgTIAEoCzIWLmdvb2dsZS5wcm90b2J1Zi5WYWx1ZSKVBwoWUmVwZWF0",
            "ZWRXZWxsS25vd25UeXBlcxInCglhbnlfZmllbGQYASADKAsyFC5nb29nbGUu",
            "cHJvdG9idWYuQW55EicKCWFwaV9maWVsZBgCIAMoCzIULmdvb2dsZS5wcm90",
            "b2J1Zi5BcGkSMQoOZHVyYXRpb25fZmllbGQYAyADKAsyGS5nb29nbGUucHJv",
            "dG9idWYuRHVyYXRpb24SKwoLZW1wdHlfZmllbGQYBCADKAsyFi5nb29nbGUu",
            "cHJvdG9idWYuRW1wdHkSNAoQZmllbGRfbWFza19maWVsZBgFIAMoCzIaLmdv",
            "b2dsZS5wcm90b2J1Zi5GaWVsZE1hc2sSPAoUc291cmNlX2NvbnRleHRfZmll",
            "bGQYBiADKAsyHi5nb29nbGUucHJvdG9idWYuU291cmNlQ29udGV4dBItCgxz",
            "dHJ1Y3RfZmllbGQYByADKAsyFy5nb29nbGUucHJvdG9idWYuU3RydWN0EjMK",
            "D3RpbWVzdGFtcF9maWVsZBgIIAMoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1l",
            "c3RhbXASKQoKdHlwZV9maWVsZBgJIAMoCzIVLmdvb2dsZS5wcm90b2J1Zi5U",
            "eXBlEjIKDGRvdWJsZV9maWVsZBgKIAMoCzIcLmdvb2dsZS5wcm90b2J1Zi5E",
            "b3VibGVWYWx1ZRIwCgtmbG9hdF9maWVsZBgLIAMoCzIbLmdvb2dsZS5wcm90",
            "b2J1Zi5GbG9hdFZhbHVlEjAKC2ludDY0X2ZpZWxkGAwgAygLMhsuZ29vZ2xl",
            "LnByb3RvYnVmLkludDY0VmFsdWUSMgoMdWludDY0X2ZpZWxkGA0gAygLMhwu",
            "Z29vZ2xlLnByb3RvYnVmLlVJbnQ2NFZhbHVlEjAKC2ludDMyX2ZpZWxkGA4g",
            "AygLMhsuZ29vZ2xlLnByb3RvYnVmLkludDMyVmFsdWUSMgoMdWludDMyX2Zp",
            "ZWxkGA8gAygLMhwuZ29vZ2xlLnByb3RvYnVmLlVJbnQzMlZhbHVlEi4KCmJv",
            "b2xfZmllbGQYECADKAsyGi5nb29nbGUucHJvdG9idWYuQm9vbFZhbHVlEjIK",
            "DHN0cmluZ19maWVsZBgRIAMoCzIcLmdvb2dsZS5wcm90b2J1Zi5TdHJpbmdW",
            "YWx1ZRIwCgtieXRlc19maWVsZBgSIAMoCzIbLmdvb2dsZS5wcm90b2J1Zi5C",
            "eXRlc1ZhbHVlIsUHChNPbmVvZldlbGxLbm93blR5cGVzEikKCWFueV9maWVs",
            "ZBgBIAEoCzIULmdvb2dsZS5wcm90b2J1Zi5BbnlIABIpCglhcGlfZmllbGQY",
            "AiABKAsyFC5nb29nbGUucHJvdG9idWYuQXBpSAASMwoOZHVyYXRpb25fZmll",
            "bGQYAyABKAsyGS5nb29nbGUucHJvdG9idWYuRHVyYXRpb25IABItCgtlbXB0",
            "eV9maWVsZBgEIAEoCzIWLmdvb2dsZS5wcm90b2J1Zi5FbXB0eUgAEjYKEGZp",
            "ZWxkX21hc2tfZmllbGQYBSABKAsyGi5nb29nbGUucHJvdG9idWYuRmllbGRN",
            "YXNrSAASPgoUc291cmNlX2NvbnRleHRfZmllbGQYBiABKAsyHi5nb29nbGUu",
            "cHJvdG9idWYuU291cmNlQ29udGV4dEgAEi8KDHN0cnVjdF9maWVsZBgHIAEo",
            "CzIXLmdvb2dsZS5wcm90b2J1Zi5TdHJ1Y3RIABI1Cg90aW1lc3RhbXBfZmll",
            "bGQYCCABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wSAASKwoKdHlw",
            "ZV9maWVsZBgJIAEoCzIVLmdvb2dsZS5wcm90b2J1Zi5UeXBlSAASNAoMZG91",
            "YmxlX2ZpZWxkGAogASgLMhwuZ29vZ2xlLnByb3RvYnVmLkRvdWJsZVZhbHVl",
            "SAASMgoLZmxvYXRfZmllbGQYCyABKAsyGy5nb29nbGUucHJvdG9idWYuRmxv",
            "YXRWYWx1ZUgAEjIKC2ludDY0X2ZpZWxkGAwgASgLMhsuZ29vZ2xlLnByb3Rv",
            "YnVmLkludDY0VmFsdWVIABI0Cgx1aW50NjRfZmllbGQYDSABKAsyHC5nb29n",
            "bGUucHJvdG9idWYuVUludDY0VmFsdWVIABIyCgtpbnQzMl9maWVsZBgOIAEo",
            "CzIbLmdvb2dsZS5wcm90b2J1Zi5JbnQzMlZhbHVlSAASNAoMdWludDMyX2Zp",
            "ZWxkGA8gASgLMhwuZ29vZ2xlLnByb3RvYnVmLlVJbnQzMlZhbHVlSAASMAoK",
            "Ym9vbF9maWVsZBgQIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5Cb29sVmFsdWVI",
            "ABI0CgxzdHJpbmdfZmllbGQYESABKAsyHC5nb29nbGUucHJvdG9idWYuU3Ry",
            "aW5nVmFsdWVIABIyCgtieXRlc19maWVsZBgSIAEoCzIbLmdvb2dsZS5wcm90",
            "b2J1Zi5CeXRlc1ZhbHVlSABCDQoLb25lb2ZfZmllbGQilhYKEU1hcFdlbGxL",
            "bm93blR5cGVzEkUKCWFueV9maWVsZBgBIAMoCzIyLnByb3RvYnVmX3VuaXR0",
            "ZXN0Lk1hcFdlbGxLbm93blR5cGVzLkFueUZpZWxkRW50cnkSRQoJYXBpX2Zp",
            "ZWxkGAIgAygLMjIucHJvdG9idWZfdW5pdHRlc3QuTWFwV2VsbEtub3duVHlw",
            "ZXMuQXBpRmllbGRFbnRyeRJPCg5kdXJhdGlvbl9maWVsZBgDIAMoCzI3LnBy",
            "b3RvYnVmX3VuaXR0ZXN0Lk1hcFdlbGxLbm93blR5cGVzLkR1cmF0aW9uRmll",
            "bGRFbnRyeRJJCgtlbXB0eV9maWVsZBgEIAMoCzI0LnByb3RvYnVmX3VuaXR0",
            "ZXN0Lk1hcFdlbGxLbm93blR5cGVzLkVtcHR5RmllbGRFbnRyeRJSChBmaWVs",
            "ZF9tYXNrX2ZpZWxkGAUgAygLMjgucHJvdG9idWZfdW5pdHRlc3QuTWFwV2Vs",
            "bEtub3duVHlwZXMuRmllbGRNYXNrRmllbGRFbnRyeRJaChRzb3VyY2VfY29u",
            "dGV4dF9maWVsZBgGIAMoCzI8LnByb3RvYnVmX3VuaXR0ZXN0Lk1hcFdlbGxL",
            "bm93blR5cGVzLlNvdXJjZUNvbnRleHRGaWVsZEVudHJ5EksKDHN0cnVjdF9m",
            "aWVsZBgHIAMoCzI1LnByb3RvYnVmX3VuaXR0ZXN0Lk1hcFdlbGxLbm93blR5",
            "cGVzLlN0cnVjdEZpZWxkRW50cnkSUQoPdGltZXN0YW1wX2ZpZWxkGAggAygL",
            "MjgucHJvdG9idWZfdW5pdHRlc3QuTWFwV2VsbEtub3duVHlwZXMuVGltZXN0",
            "YW1wRmllbGRFbnRyeRJHCgp0eXBlX2ZpZWxkGAkgAygLMjMucHJvdG9idWZf",
            "dW5pdHRlc3QuTWFwV2VsbEtub3duVHlwZXMuVHlwZUZpZWxkRW50cnkSSwoM",
            "ZG91YmxlX2ZpZWxkGAogAygLMjUucHJvdG9idWZfdW5pdHRlc3QuTWFwV2Vs",
            "bEtub3duVHlwZXMuRG91YmxlRmllbGRFbnRyeRJJCgtmbG9hdF9maWVsZBgL",
            "IAMoCzI0LnByb3RvYnVmX3VuaXR0ZXN0Lk1hcFdlbGxLbm93blR5cGVzLkZs",
            "b2F0RmllbGRFbnRyeRJJCgtpbnQ2NF9maWVsZBgMIAMoCzI0LnByb3RvYnVm",
            "X3VuaXR0ZXN0Lk1hcFdlbGxLbm93blR5cGVzLkludDY0RmllbGRFbnRyeRJL",
            "Cgx1aW50NjRfZmllbGQYDSADKAsyNS5wcm90b2J1Zl91bml0dGVzdC5NYXBX",
            "ZWxsS25vd25UeXBlcy5VaW50NjRGaWVsZEVudHJ5EkkKC2ludDMyX2ZpZWxk",
            "GA4gAygLMjQucHJvdG9idWZfdW5pdHRlc3QuTWFwV2VsbEtub3duVHlwZXMu",
            "SW50MzJGaWVsZEVudHJ5EksKDHVpbnQzMl9maWVsZBgPIAMoCzI1LnByb3Rv",
            "YnVmX3VuaXR0ZXN0Lk1hcFdlbGxLbm93blR5cGVzLlVpbnQzMkZpZWxkRW50",
            "cnkSRwoKYm9vbF9maWVsZBgQIAMoCzIzLnByb3RvYnVmX3VuaXR0ZXN0Lk1h",
            "cFdlbGxLbm93blR5cGVzLkJvb2xGaWVsZEVudHJ5EksKDHN0cmluZ19maWVs",
            "ZBgRIAMoCzI1LnByb3RvYnVmX3VuaXR0ZXN0Lk1hcFdlbGxLbm93blR5cGVz",
            "LlN0cmluZ0ZpZWxkRW50cnkSSQoLYnl0ZXNfZmllbGQYEiADKAsyNC5wcm90",
            "b2J1Zl91bml0dGVzdC5NYXBXZWxsS25vd25UeXBlcy5CeXRlc0ZpZWxkRW50",
            "cnkaRQoNQW55RmllbGRFbnRyeRILCgNrZXkYASABKAUSIwoFdmFsdWUYAiAB",
            "KAsyFC5nb29nbGUucHJvdG9idWYuQW55OgI4ARpFCg1BcGlGaWVsZEVudHJ5",
            "EgsKA2tleRgBIAEoBRIjCgV2YWx1ZRgCIAEoCzIULmdvb2dsZS5wcm90b2J1",
            "Zi5BcGk6AjgBGk8KEkR1cmF0aW9uRmllbGRFbnRyeRILCgNrZXkYASABKAUS",
            "KAoFdmFsdWUYAiABKAsyGS5nb29nbGUucHJvdG9idWYuRHVyYXRpb246AjgB",
            "GkkKD0VtcHR5RmllbGRFbnRyeRILCgNrZXkYASABKAUSJQoFdmFsdWUYAiAB",
            "KAsyFi5nb29nbGUucHJvdG9idWYuRW1wdHk6AjgBGlEKE0ZpZWxkTWFza0Zp",
            "ZWxkRW50cnkSCwoDa2V5GAEgASgFEikKBXZhbHVlGAIgASgLMhouZ29vZ2xl",
            "LnByb3RvYnVmLkZpZWxkTWFzazoCOAEaWQoXU291cmNlQ29udGV4dEZpZWxk",
            "RW50cnkSCwoDa2V5GAEgASgFEi0KBXZhbHVlGAIgASgLMh4uZ29vZ2xlLnBy",
            "b3RvYnVmLlNvdXJjZUNvbnRleHQ6AjgBGksKEFN0cnVjdEZpZWxkRW50cnkS",
            "CwoDa2V5GAEgASgFEiYKBXZhbHVlGAIgASgLMhcuZ29vZ2xlLnByb3RvYnVm",
            "LlN0cnVjdDoCOAEaUQoTVGltZXN0YW1wRmllbGRFbnRyeRILCgNrZXkYASAB",
            "KAUSKQoFdmFsdWUYAiABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1w",
            "OgI4ARpHCg5UeXBlRmllbGRFbnRyeRILCgNrZXkYASABKAUSJAoFdmFsdWUY",
            "AiABKAsyFS5nb29nbGUucHJvdG9idWYuVHlwZToCOAEaUAoQRG91YmxlRmll",
            "bGRFbnRyeRILCgNrZXkYASABKAUSKwoFdmFsdWUYAiABKAsyHC5nb29nbGUu",
            "cHJvdG9idWYuRG91YmxlVmFsdWU6AjgBGk4KD0Zsb2F0RmllbGRFbnRyeRIL",
            "CgNrZXkYASABKAUSKgoFdmFsdWUYAiABKAsyGy5nb29nbGUucHJvdG9idWYu",
            "RmxvYXRWYWx1ZToCOAEaTgoPSW50NjRGaWVsZEVudHJ5EgsKA2tleRgBIAEo",
            "BRIqCgV2YWx1ZRgCIAEoCzIbLmdvb2dsZS5wcm90b2J1Zi5JbnQ2NFZhbHVl",
            "OgI4ARpQChBVaW50NjRGaWVsZEVudHJ5EgsKA2tleRgBIAEoBRIrCgV2YWx1",
            "ZRgCIAEoCzIcLmdvb2dsZS5wcm90b2J1Zi5VSW50NjRWYWx1ZToCOAEaTgoP",
            "SW50MzJGaWVsZEVudHJ5EgsKA2tleRgBIAEoBRIqCgV2YWx1ZRgCIAEoCzIb",
            "Lmdvb2dsZS5wcm90b2J1Zi5JbnQzMlZhbHVlOgI4ARpQChBVaW50MzJGaWVs",
            "ZEVudHJ5EgsKA2tleRgBIAEoBRIrCgV2YWx1ZRgCIAEoCzIcLmdvb2dsZS5w",
            "cm90b2J1Zi5VSW50MzJWYWx1ZToCOAEaTAoOQm9vbEZpZWxkRW50cnkSCwoD",
            "a2V5GAEgASgFEikKBXZhbHVlGAIgASgLMhouZ29vZ2xlLnByb3RvYnVmLkJv",
            "b2xWYWx1ZToCOAEaUAoQU3RyaW5nRmllbGRFbnRyeRILCgNrZXkYASABKAUS",
            "KwoFdmFsdWUYAiABKAsyHC5nb29nbGUucHJvdG9idWYuU3RyaW5nVmFsdWU6",
            "AjgBGk4KD0J5dGVzRmllbGRFbnRyeRILCgNrZXkYASABKAUSKgoFdmFsdWUY",
            "AiABKAsyGy5nb29nbGUucHJvdG9idWYuQnl0ZXNWYWx1ZToCOAFCOQoYY29t",
            "Lmdvb2dsZS5wcm90b2J1Zi50ZXN0UAGqAhpHb29nbGUuUHJvdG9idWYuVGVz",
            "dFByb3Rvc2IGcHJvdG8z"));
      descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
          new pbr::FileDescriptor[] { global::Google.Protobuf.WellKnownTypes.AnyReflection.Descriptor, global::Google.Protobuf.WellKnownTypes.ApiReflection.Descriptor, global::Google.Protobuf.WellKnownTypes.DurationReflection.Descriptor, global::Google.Protobuf.WellKnownTypes.EmptyReflection.Descriptor, global::Google.Protobuf.WellKnownTypes.FieldMaskReflection.Descriptor, global::Google.Protobuf.WellKnownTypes.SourceContextReflection.Descriptor, global::Google.Protobuf.WellKnownTypes.StructReflection.Descriptor, global::Google.Protobuf.WellKnownTypes.TimestampReflection.Descriptor, global::Google.Protobuf.WellKnownTypes.TypeReflection.Descriptor, global::Google.Protobuf.WellKnownTypes.WrappersReflection.Descriptor, },
          new pbr::GeneratedClrTypeInfo(null, null, new pbr::GeneratedClrTypeInfo[] {
            new pbr::GeneratedClrTypeInfo(typeof(global::Google.Protobuf.TestProtos.TestWellKnownTypes), global::Google.Protobuf.TestProtos.TestWellKnownTypes.Parser, new[]{ "AnyField", "ApiField", "DurationField", "EmptyField", "FieldMaskField", "SourceContextField", "StructField", "TimestampField", "TypeField", "DoubleField", "FloatField", "Int64Field", "Uint64Field", "Int32Field", "Uint32Field", "BoolField", "StringField", "BytesField", "ValueField" }, null, null, null, null),
            new pbr::GeneratedClrTypeInfo(typeof(global::Google.Protobuf.TestProtos.RepeatedWellKnownTypes), global::Google.Protobuf.TestProtos.RepeatedWellKnownTypes.Parser, new[]{ "AnyField", "ApiField", "DurationField", "EmptyField", "FieldMaskField", "SourceContextField", "StructField", "TimestampField", "TypeField", "DoubleField", "FloatField", "Int64Field", "Uint64Field", "Int32Field", "Uint32Field", "BoolField", "StringField", "BytesField" }, null, null, null, null),
            new pbr::GeneratedClrTypeInfo(typeof(global::Google.Protobuf.TestProtos.OneofWellKnownTypes), global::Google.Protobuf.TestProtos.OneofWellKnownTypes.Parser, new[]{ "AnyField", "ApiField", "DurationField", "EmptyField", "FieldMaskField", "SourceContextField", "StructField", "TimestampField", "TypeField", "DoubleField", "FloatField", "Int64Field", "Uint64Field", "Int32Field", "Uint32Field", "BoolField", "StringField", "BytesField" }, new[]{ "OneofField" }, null, null, null),
            new pbr::GeneratedClrTypeInfo(typeof(global::Google.Protobuf.TestProtos.MapWellKnownTypes), global::Google.Protobuf.TestProtos.MapWellKnownTypes.Parser, new[]{ "AnyField", "ApiField", "DurationField", "EmptyField", "FieldMaskField", "SourceContextField", "StructField", "TimestampField", "TypeField", "DoubleField", "FloatField", "Int64Field", "Uint64Field", "Int32Field", "Uint32Field", "BoolField", "StringField", "BytesField" }, null, null, null, new pbr::GeneratedClrTypeInfo[] { null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, })
          }));
    }
    #endregion

  }
  #region Messages
  /// <summary>
  /// Test that we can include all well-known types.
  /// Each wrapper type is included separately, as languages
  /// map handle different wrappers in different ways.
  /// </summary>
  public sealed partial class TestWellKnownTypes : pb::IMessage<TestWellKnownTypes>
  #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE
      , pb::IBufferMessage
  #endif
  {
    private static readonly pb::MessageParser<TestWellKnownTypes> _parser = new pb::MessageParser<TestWellKnownTypes>(() => new TestWellKnownTypes());
    private pb::UnknownFieldSet _unknownFields;
    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    public static pb::MessageParser<TestWellKnownTypes> Parser { get { return _parser; } }

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

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

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

    partial void OnConstruction();

    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    public TestWellKnownTypes(TestWellKnownTypes other) : this() {
      anyField_ = other.anyField_ != null ? other.anyField_.Clone() : null;
      apiField_ = other.apiField_ != null ? other.apiField_.Clone() : null;
      durationField_ = other.durationField_ != null ? other.durationField_.Clone() : null;
      emptyField_ = other.emptyField_ != null ? other.emptyField_.Clone() : null;
      fieldMaskField_ = other.fieldMaskField_ != null ? other.fieldMaskField_.Clone() : null;
      sourceContextField_ = other.sourceContextField_ != null ? other.sourceContextField_.Clone() : null;
      structField_ = other.structField_ != null ? other.structField_.Clone() : null;
      timestampField_ = other.timestampField_ != null ? other.timestampField_.Clone() : null;
      typeField_ = other.typeField_ != null ? other.typeField_.Clone() : null;
      DoubleField = other.DoubleField;
      FloatField = other.FloatField;
      Int64Field = other.Int64Field;
      Uint64Field = other.Uint64Field;
      Int32Field = other.Int32Field;
      Uint32Field = other.Uint32Field;
      BoolField = other.BoolField;
      StringField = other.StringField;
      BytesField = other.BytesField;
      valueField_ = other.valueField_ != null ? other.valueField_.Clone() : null;
      _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields);
    }

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

    /// <summary>Field number for the "any_field" field.</summary>
    public const int AnyFieldFieldNumber = 1;
    private global::Google.Protobuf.WellKnownTypes.Any anyField_;
    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    public global::Google.Protobuf.WellKnownTypes.Any AnyField {
      get { return anyField_; }
      set {
        anyField_ = value;
      }
    }

    /// <summary>Field number for the "api_field" field.</summary>
    public const int ApiFieldFieldNumber = 2;
    private global::Google.Protobuf.WellKnownTypes.Api apiField_;
    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    public global::Google.Protobuf.WellKnownTypes.Api ApiField {
      get { return apiField_; }
      set {
        apiField_ = value;
      }
    }

    /// <summary>Field number for the "duration_field" field.</summary>
    public const int DurationFieldFieldNumber = 3;
    private global::Google.Protobuf.WellKnownTypes.Duration durationField_;
    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    public global::Google.Protobuf.WellKnownTypes.Duration DurationField {
      get { return durationField_; }
      set {
        durationField_ = value;
      }
    }

    /// <summary>Field number for the "empty_field" field.</summary>
    public const int EmptyFieldFieldNumber = 4;
    private global::Google.Protobuf.WellKnownTypes.Empty emptyField_;
    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    public global::Google.Protobuf.WellKnownTypes.Empty EmptyField {
      get { return emptyField_; }
      set {
        emptyField_ = value;
      }
    }

    /// <summary>Field number for the "field_mask_field" field.</summary>
    public const int FieldMaskFieldFieldNumber = 5;
    private global::Google.Protobuf.WellKnownTypes.FieldMask fieldMaskField_;
    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    public global::Google.Protobuf.WellKnownTypes.FieldMask FieldMaskField {
      get { return fieldMaskField_; }
      set {
        fieldMaskField_ = value;
      }
    }

    /// <summary>Field number for the "source_context_field" field.</summary>
    public const int SourceContextFieldFieldNumber = 6;
    private global::Google.Protobuf.WellKnownTypes.SourceContext sourceContextField_;
    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    public global::Google.Protobuf.WellKnownTypes.SourceContext SourceContextField {
      get { return sourceContextField_; }
      set {
        sourceContextField_ = value;
      }
    }

    /// <summary>Field number for the "struct_field" field.</summary>
    public const int StructFieldFieldNumber = 7;
    private global::Google.Protobuf.WellKnownTypes.Struct structField_;
    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    public global::Google.Protobuf.WellKnownTypes.Struct StructField {
      get { return structField_; }
      set {
        structField_ = value;
      }
    }

    /// <summary>Field number for the "timestamp_field" field.</summary>
    public const int TimestampFieldFieldNumber = 8;
    private global::Google.Protobuf.WellKnownTypes.Timestamp timestampField_;
    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    public global::Google.Protobuf.WellKnownTypes.Timestamp TimestampField {
      get { return timestampField_; }
      set {
        timestampField_ = value;
      }
    }

    /// <summary>Field number for the "type_field" field.</summary>
    public const int TypeFieldFieldNumber = 9;
    private global::Google.Protobuf.WellKnownTypes.Type typeField_;
    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    public global::Google.Protobuf.WellKnownTypes.Type TypeField {
      get { return typeField_; }
      set {
        typeField_ = value;
      }
    }

    /// <summary>Field number for the "double_field" field.</summary>
    public const int DoubleFieldFieldNumber = 10;
    private static readonly pb::FieldCodec<double?> _single_doubleField_codec = pb::FieldCodec.ForStructWrapper<double>(82);
    private double? doubleField_;
    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    public double? DoubleField {
      get { return doubleField_; }
      set {
        doubleField_ = value;
      }
    }


    /// <summary>Field number for the "float_field" field.</summary>
    public const int FloatFieldFieldNumber = 11;
    private static readonly pb::FieldCodec<float?> _single_floatField_codec = pb::FieldCodec.ForStructWrapper<float>(90);
    private float? floatField_;
    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    public float? FloatField {
      get { return floatField_; }
      set {
        floatField_ = value;
      }
    }


    /// <summary>Field number for the "int64_field" field.</summary>
    public const int Int64FieldFieldNumber = 12;
    private static readonly pb::FieldCodec<long?> _single_int64Field_codec = pb::FieldCodec.ForStructWrapper<long>(98);
    private long? int64Field_;
    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    public long? Int64Field {
      get { return int64Field_; }
      set {
        int64Field_ = value;
      }
    }


    /// <summary>Field number for the "uint64_field" field.</summary>
    public const int Uint64FieldFieldNumber = 13;
    private static readonly pb::FieldCodec<ulong?> _single_uint64Field_codec = pb::FieldCodec.ForStructWrapper<ulong>(106);
    private ulong? uint64Field_;
    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    public ulong? Uint64Field {
      get { return uint64Field_; }
      set {
        uint64Field_ = value;
      }
    }


    /// <summary>Field number for the "int32_field" field.</summary>
    public const int Int32FieldFieldNumber = 14;
    private static readonly pb::FieldCodec<int?> _single_int32Field_codec = pb::FieldCodec.ForStructWrapper<int>(114);
    private int? int32Field_;
    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    public int? Int32Field {
      get { return int32Field_; }
      set {
        int32Field_ = value;
      }
    }


    /// <summary>Field number for the "uint32_field" field.</summary>
    public const int Uint32FieldFieldNumber = 15;
    private static readonly pb::FieldCodec<uint?> _single_uint32Field_codec = pb::FieldCodec.ForStructWrapper<uint>(122);
    private uint? uint32Field_;
    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    public uint? Uint32Field {
      get { return uint32Field_; }
      set {
        uint32Field_ = value;
      }
    }


    /// <summary>Field number for the "bool_field" field.</summary>
    public const int BoolFieldFieldNumber = 16;
    private static readonly pb::FieldCodec<bool?> _single_boolField_codec = pb::FieldCodec.ForStructWrapper<bool>(130);
    private bool? boolField_;
    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    public bool? BoolField {
      get { return boolField_; }
      set {
        boolField_ = value;
      }
    }


    /// <summary>Field number for the "string_field" field.</summary>
    public const int StringFieldFieldNumber = 17;
    private static readonly pb::FieldCodec<string> _single_stringField_codec = pb::FieldCodec.ForClassWrapper<string>(138);
    private string stringField_;
    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    public string StringField {
      get { return stringField_; }
      set {
        stringField_ = value;
      }
    }


    /// <summary>Field number for the "bytes_field" field.</summary>
    public const int BytesFieldFieldNumber = 18;
    private static readonly pb::FieldCodec<pb::ByteString> _single_bytesField_codec = pb::FieldCodec.ForClassWrapper<pb::ByteString>(146);
    private pb::ByteString bytesField_;
    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    public pb::ByteString BytesField {
      get { return bytesField_; }
      set {
        bytesField_ = value;
      }
    }


    /// <summary>Field number for the "value_field" field.</summary>
    public const int ValueFieldFieldNumber = 19;
    private global::Google.Protobuf.WellKnownTypes.Value valueField_;
    /// <summary>
    /// Part of struct, but useful to be able to test separately
    /// </summary>
    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    public global::Google.Protobuf.WellKnownTypes.Value ValueField {
      get { return valueField_; }
      set {
        valueField_ = value;
      }
    }

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

    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    public bool Equals(TestWellKnownTypes other) {
      if (ReferenceEquals(other, null)) {
        return false;
      }
      if (ReferenceEquals(other, this)) {
        return true;
      }
      if (!object.Equals(AnyField, other.AnyField)) return false;
      if (!object.Equals(ApiField, other.ApiField)) return false;
      if (!object.Equals(DurationField, other.DurationField)) return false;
      if (!object.Equals(EmptyField, other.EmptyField)) return false;
      if (!object.Equals(FieldMaskField, other.FieldMaskField)) return false;
      if (!object.Equals(SourceContextField, other.SourceContextField)) return false;
      if (!object.Equals(StructField, other.StructField)) return false;
      if (!object.Equals(TimestampField, other.TimestampField)) return false;
      if (!object.Equals(TypeField, other.TypeField)) return false;
      if (!pbc::ProtobufEqualityComparers.BitwiseNullableDoubleEqualityComparer.Equals(DoubleField, other.DoubleField)) return false;
      if (!pbc::ProtobufEqualityComparers.BitwiseNullableSingleEqualityComparer.Equals(FloatField, other.FloatField)) return false;
      if (Int64Field != other.Int64Field) return false;
      if (Uint64Field != other.Uint64Field) return false;
      if (Int32Field != other.Int32Field) return false;
      if (Uint32Field != other.Uint32Field) return false;
      if (BoolField != other.BoolField) return false;
      if (StringField != other.StringField) return false;
      if (BytesField != other.BytesField) return false;
      if (!object.Equals(ValueField, other.ValueField)) return false;
      return Equals(_unknownFields, other._unknownFields);
    }

    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    public override int GetHashCode() {
      int hash = 1;
      if (anyField_ != null) hash ^= AnyField.GetHashCode();
      if (apiField_ != null) hash ^= ApiField.GetHashCode();
      if (durationField_ != null) hash ^= DurationField.GetHashCode();
      if (emptyField_ != null) hash ^= EmptyField.GetHashCode();
      if (fieldMaskField_ != null) hash ^= FieldMaskField.GetHashCode();
      if (sourceContextField_ != null) hash ^= SourceContextField.GetHashCode();
      if (structField_ != null) hash ^= StructField.GetHashCode();
      if (timestampField_ != null) hash ^= TimestampField.GetHashCode();
      if (typeField_ != null) hash ^= TypeField.GetHashCode();
      if (doubleField_ != null) hash ^= pbc::ProtobufEqualityComparers.BitwiseNullableDoubleEqualityComparer.GetHashCode(DoubleField);
      if (floatField_ != null) hash ^= pbc::ProtobufEqualityComparers.BitwiseNullableSingleEqualityComparer.GetHashCode(FloatField);
      if (int64Field_ != null) hash ^= Int64Field.GetHashCode();
      if (uint64Field_ != null) hash ^= Uint64Field.GetHashCode();
      if (int32Field_ != null) hash ^= Int32Field.GetHashCode();
      if (uint32Field_ != null) hash ^= Uint32Field.GetHashCode();
      if (boolField_ != null) hash ^= BoolField.GetHashCode();
      if (stringField_ != null) hash ^= StringField.GetHashCode();
      if (bytesField_ != null) hash ^= BytesField.GetHashCode();
      if (valueField_ != null) hash ^= ValueField.GetHashCode();
      if (_unknownFields != null) {
        hash ^= _unknownFields.GetHashCode();
      }
      return hash;
    }

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

    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    public void WriteTo(pb::CodedOutputStream output) {
    #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE
      output.WriteRawMessage(this);
    #else
      if (anyField_ != null) {
        output.WriteRawTag(10);
        output.WriteMessage(AnyField);
      }
      if (apiField_ != null) {
        output.WriteRawTag(18);
        output.WriteMessage(ApiField);
      }
      if (durationField_ != null) {
        output.WriteRawTag(26);
        output.WriteMessage(DurationField);
      }
      if (emptyField_ != null) {
        output.WriteRawTag(34);
        output.WriteMessage(EmptyField);
      }
      if (fieldMaskField_ != null) {
        output.WriteRawTag(42);
        output.WriteMessage(FieldMaskField);
      }
      if (sourceContextField_ != null) {
        output.WriteRawTag(50);
        output.WriteMessage(SourceContextField);
      }
      if (structField_ != null) {
        output.WriteRawTag(58);
        output.WriteMessage(StructField);
      }
      if (timestampField_ != null) {
        output.WriteRawTag(66);
        output.WriteMessage(TimestampField);
      }
      if (typeField_ != null) {
        output.WriteRawTag(74);
        output.WriteMessage(TypeField);
      }
      if (doubleField_ != null) {
        _single_doubleField_codec.WriteTagAndValue(output, DoubleField);
      }
      if (floatField_ != null) {
        _single_floatField_codec.WriteTagAndValue(output, FloatField);
      }
      if (int64Field_ != null) {
        _single_int64Field_codec.WriteTagAndValue(output, Int64Field);
      }
      if (uint64Field_ != null) {
        _single_uint64Field_codec.WriteTagAndValue(output, Uint64Field);
      }
      if (int32Field_ != null) {
        _single_int32Field_codec.WriteTagAndValue(output, Int32Field);
      }
      if (uint32Field_ != null) {
        _single_uint32Field_codec.WriteTagAndValue(output, Uint32Field);
      }
      if (boolField_ != null) {
        _single_boolField_codec.WriteTagAndValue(output, BoolField);
      }
      if (stringField_ != null) {
        _single_stringField_codec.WriteTagAndValue(output, StringField);
      }
      if (bytesField_ != null) {
        _single_bytesField_codec.WriteTagAndValue(output, BytesField);
      }
      if (valueField_ != null) {
        output.WriteRawTag(154, 1);
        output.WriteMessage(ValueField);
      }
      if (_unknownFields != null) {
        _unknownFields.WriteTo(output);
      }
    #endif
    }

    #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE
    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    void pb::IBufferMessage.InternalWriteTo(ref pb::WriteContext output) {
      if (anyField_ != null) {
        output.WriteRawTag(10);
        output.WriteMessage(AnyField);
      }
      if (apiField_ != null) {
        output.WriteRawTag(18);
        output.WriteMessage(ApiField);
      }
      if (durationField_ != null) {
        output.WriteRawTag(26);
        output.WriteMessage(DurationField);
      }
      if (emptyField_ != null) {
        output.WriteRawTag(34);
        output.WriteMessage(EmptyField);
      }
      if (fieldMaskField_ != null) {
        output.WriteRawTag(42);
        output.WriteMessage(FieldMaskField);
      }
      if (sourceContextField_ != null) {
        output.WriteRawTag(50);
        output.WriteMessage(SourceContextField);
      }
      if (structField_ != null) {
        output.WriteRawTag(58);
        output.WriteMessage(StructField);
      }
      if (timestampField_ != null) {
        output.WriteRawTag(66);
        output.WriteMessage(TimestampField);
      }
      if (typeField_ != null) {
        output.WriteRawTag(74);
        output.WriteMessage(TypeField);
      }
      if (doubleField_ != null) {
        _single_doubleField_codec.WriteTagAndValue(ref output, DoubleField);
      }
      if (floatField_ != null) {
        _single_floatField_codec.WriteTagAndValue(ref output, FloatField);
      }
      if (int64Field_ != null) {
        _single_int64Field_codec.WriteTagAndValue(ref output, Int64Field);
      }
      if (uint64Field_ != null) {
        _single_uint64Field_codec.WriteTagAndValue(ref output, Uint64Field);
      }
      if (int32Field_ != null) {
        _single_int32Field_codec.WriteTagAndValue(ref output, Int32Field);
      }
      if (uint32Field_ != null) {
        _single_uint32Field_codec.WriteTagAndValue(ref output, Uint32Field);
      }
      if (boolField_ != null) {
        _single_boolField_codec.WriteTagAndValue(ref output, BoolField);
      }
      if (stringField_ != null) {
        _single_stringField_codec.WriteTagAndValue(ref output, StringField);
      }
      if (bytesField_ != null) {
        _single_bytesField_codec.WriteTagAndValue(ref output, BytesField);
      }
      if (valueField_ != null) {
        output.WriteRawTag(154, 1);
        output.WriteMessage(ValueField);
      }
      if (_unknownFields != null) {
        _unknownFields.WriteTo(ref output);
      }
    }
    #endif

    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    public int CalculateSize() {
      int size = 0;
      if (anyField_ != null) {
        size += 1 + pb::CodedOutputStream.ComputeMessageSize(AnyField);
      }
      if (apiField_ != null) {
        size += 1 + pb::CodedOutputStream.ComputeMessageSize(ApiField);
      }
      if (durationField_ != null) {
        size += 1 + pb::CodedOutputStream.ComputeMessageSize(DurationField);
      }
      if (emptyField_ != null) {
        size += 1 + pb::CodedOutputStream.ComputeMessageSize(EmptyField);
      }
      if (fieldMaskField_ != null) {
        size += 1 + pb::CodedOutputStream.ComputeMessageSize(FieldMaskField);
      }
      if (sourceContextField_ != null) {
        size += 1 + pb::CodedOutputStream.ComputeMessageSize(SourceContextField);
      }
      if (structField_ != null) {
        size += 1 + pb::CodedOutputStream.ComputeMessageSize(StructField);
      }
      if (timestampField_ != null) {
        size += 1 + pb::CodedOutputStream.ComputeMessageSize(TimestampField);
      }
      if (typeField_ != null) {
        size += 1 + pb::CodedOutputStream.ComputeMessageSize(TypeField);
      }
      if (doubleField_ != null) {
        size += _single_doubleField_codec.CalculateSizeWithTag(DoubleField);
      }
      if (floatField_ != null) {
        size += _single_floatField_codec.CalculateSizeWithTag(FloatField);
      }
      if (int64Field_ != null) {
        size += _single_int64Field_codec.CalculateSizeWithTag(Int64Field);
      }
      if (uint64Field_ != null) {
        size += _single_uint64Field_codec.CalculateSizeWithTag(Uint64Field);
      }
      if (int32Field_ != null) {
        size += _single_int32Field_codec.CalculateSizeWithTag(Int32Field);
      }
      if (uint32Field_ != null) {
        size += _single_uint32Field_codec.CalculateSizeWithTag(Uint32Field);
      }
      if (boolField_ != null) {
        size += _single_boolField_codec.CalculateSizeWithTag(BoolField);
      }
      if (stringField_ != null) {
        size += _single_stringField_codec.CalculateSizeWithTag(StringField);
      }
      if (bytesField_ != null) {
        size += _single_bytesField_codec.CalculateSizeWithTag(BytesField);
      }
      if (valueField_ != null) {
        size += 2 + pb::CodedOutputStream.ComputeMessageSize(ValueField);
      }
      if (_unknownFields != null) {
        size += _unknownFields.CalculateSize();
      }
      return size;
    }

    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    public void MergeFrom(TestWellKnownTypes other) {
      if (other == null) {
        return;
      }
      if (other.anyField_ != null) {
        if (anyField_ == null) {
          AnyField = new global::Google.Protobuf.WellKnownTypes.Any();
        }
        AnyField.MergeFrom(other.AnyField);
      }
      if (other.apiField_ != null) {
        if (apiField_ == null) {
          ApiField = new global::Google.Protobuf.WellKnownTypes.Api();
        }
        ApiField.MergeFrom(other.ApiField);
      }
      if (other.durationField_ != null) {
        if (durationField_ == null) {
          DurationField = new global::Google.Protobuf.WellKnownTypes.Duration();
        }
        DurationField.MergeFrom(other.DurationField);
      }
      if (other.emptyField_ != null) {
        if (emptyField_ == null) {
          EmptyField = new global::Google.Protobuf.WellKnownTypes.Empty();
        }
        EmptyField.MergeFrom(other.EmptyField);
      }
      if (other.fieldMaskField_ != null) {
        if (fieldMaskField_ == null) {
          FieldMaskField = new global::Google.Protobuf.WellKnownTypes.FieldMask();
        }
        FieldMaskField.MergeFrom(other.FieldMaskField);
      }
      if (other.sourceContextField_ != null) {
        if (sourceContextField_ == null) {
          SourceContextField = new global::Google.Protobuf.WellKnownTypes.SourceContext();
        }
        SourceContextField.MergeFrom(other.SourceContextField);
      }
      if (other.structField_ != null) {
        if (structField_ == null) {
          StructField = new global::Google.Protobuf.WellKnownTypes.Struct();
        }
        StructField.MergeFrom(other.StructField);
      }
      if (other.timestampField_ != null) {
        if (timestampField_ == null) {
          TimestampField = new global::Google.Protobuf.WellKnownTypes.Timestamp();
        }
        TimestampField.MergeFrom(other.TimestampField);
      }
      if (other.typeField_ != null) {
        if (typeField_ == null) {
          TypeField = new global::Google.Protobuf.WellKnownTypes.Type();
        }
        TypeField.MergeFrom(other.TypeField);
      }
      if (other.doubleField_ != null) {
        if (doubleField_ == null || other.DoubleField != 0D) {
          DoubleField = other.DoubleField;
        }
      }
      if (other.floatField_ != null) {
        if (floatField_ == null || other.FloatField != 0F) {
          FloatField = other.FloatField;
        }
      }
      if (other.int64Field_ != null) {
        if (int64Field_ == null || other.Int64Field != 0L) {
          Int64Field = other.Int64Field;
        }
      }
      if (other.uint64Field_ != null) {
        if (uint64Field_ == null || other.Uint64Field != 0UL) {
          Uint64Field = other.Uint64Field;
        }
      }
      if (other.int32Field_ != null) {
        if (int32Field_ == null || other.Int32Field != 0) {
          Int32Field = other.Int32Field;
        }
      }
      if (other.uint32Field_ != null) {
        if (uint32Field_ == null || other.Uint32Field != 0) {
          Uint32Field = other.Uint32Field;
        }
      }
      if (other.boolField_ != null) {
        if (boolField_ == null || other.BoolField != false) {
          BoolField = other.BoolField;
        }
      }
      if (other.stringField_ != null) {
        if (stringField_ == null || other.StringField != "") {
          StringField = other.StringField;
        }
      }
      if (other.bytesField_ != null) {
        if (bytesField_ == null || other.BytesField != pb::ByteString.Empty) {
          BytesField = other.BytesField;
        }
      }
      if (other.valueField_ != null) {
        if (valueField_ == null) {
          ValueField = new global::Google.Protobuf.WellKnownTypes.Value();
        }
        ValueField.MergeFrom(other.ValueField);
      }
      _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields);
    }

    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    public void MergeFrom(pb::CodedInputStream input) {
    #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE
      input.ReadRawMessage(this);
    #else
      uint tag;
      while ((tag = input.ReadTag()) != 0) {
        switch(tag) {
          default:
            _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input);
            break;
          case 10: {
            if (anyField_ == null) {
              AnyField = new global::Google.Protobuf.WellKnownTypes.Any();
            }
            input.ReadMessage(AnyField);
            break;
          }
          case 18: {
            if (apiField_ == null) {
              ApiField = new global::Google.Protobuf.WellKnownTypes.Api();
            }
            input.ReadMessage(ApiField);
            break;
          }
          case 26: {
            if (durationField_ == null) {
              DurationField = new global::Google.Protobuf.WellKnownTypes.Duration();
            }
            input.ReadMessage(DurationField);
            break;
          }
          case 34: {
            if (emptyField_ == null) {
              EmptyField = new global::Google.Protobuf.WellKnownTypes.Empty();
            }
            input.ReadMessage(EmptyField);
            break;
          }
          case 42: {
            if (fieldMaskField_ == null) {
              FieldMaskField = new global::Google.Protobuf.WellKnownTypes.FieldMask();
            }
            input.ReadMessage(FieldMaskField);
            break;
          }
          case 50: {
            if (sourceContextField_ == null) {
              SourceContextField = new global::Google.Protobuf.WellKnownTypes.SourceContext();
            }
            input.ReadMessage(SourceContextField);
            break;
          }
          case 58: {
            if (structField_ == null) {
              StructField = new global::Google.Protobuf.WellKnownTypes.Struct();
            }
            input.ReadMessage(StructField);
            break;
          }
          case 66: {
            if (timestampField_ == null) {
              TimestampField = new global::Google.Protobuf.WellKnownTypes.Timestamp();
            }
            input.ReadMessage(TimestampField);
            break;
          }
          case 74: {
            if (typeField_ == null) {
              TypeField = new global::Google.Protobuf.WellKnownTypes.Type();
            }
            input.ReadMessage(TypeField);
            break;
          }
          case 82: {
            double? value = _single_doubleField_codec.Read(input);
            if (doubleField_ == null || value != 0D) {
              DoubleField = value;
            }
            break;
          }
          case 90: {
            float? value = _single_floatField_codec.Read(input);
            if (floatField_ == null || value != 0F) {
              FloatField = value;
            }
            break;
          }
          case 98: {
            long? value = _single_int64Field_codec.Read(input);
            if (int64Field_ == null || value != 0L) {
              Int64Field = value;
            }
            break;
          }
          case 106: {
            ulong? value = _single_uint64Field_codec.Read(input);
            if (uint64Field_ == null || value != 0UL) {
              Uint64Field = value;
            }
            break;
          }
          case 114: {
            int? value = _single_int32Field_codec.Read(input);
            if (int32Field_ == null || value != 0) {
              Int32Field = value;
            }
            break;
          }
          case 122: {
            uint? value = _single_uint32Field_codec.Read(input);
            if (uint32Field_ == null || value != 0) {
              Uint32Field = value;
            }
            break;
          }
          case 130: {
            bool? value = _single_boolField_codec.Read(input);
            if (boolField_ == null || value != false) {
              BoolField = value;
            }
            break;
          }
          case 138: {
            string value = _single_stringField_codec.Read(input);
            if (stringField_ == null || value != "") {
              StringField = value;
            }
            break;
          }
          case 146: {
            pb::ByteString value = _single_bytesField_codec.Read(input);
            if (bytesField_ == null || value != pb::ByteString.Empty) {
              BytesField = value;
            }
            break;
          }
          case 154: {
            if (valueField_ == null) {
              ValueField = new global::Google.Protobuf.WellKnownTypes.Value();
            }
            input.ReadMessage(ValueField);
            break;
          }
        }
      }
    #endif
    }

    #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE
    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    void pb::IBufferMessage.InternalMergeFrom(ref pb::ParseContext input) {
      uint tag;
      while ((tag = input.ReadTag()) != 0) {
        switch(tag) {
          default:
            _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, ref input);
            break;
          case 10: {
            if (anyField_ == null) {
              AnyField = new global::Google.Protobuf.WellKnownTypes.Any();
            }
            input.ReadMessage(AnyField);
            break;
          }
          case 18: {
            if (apiField_ == null) {
              ApiField = new global::Google.Protobuf.WellKnownTypes.Api();
            }
            input.ReadMessage(ApiField);
            break;
          }
          case 26: {
            if (durationField_ == null) {
              DurationField = new global::Google.Protobuf.WellKnownTypes.Duration();
            }
            input.ReadMessage(DurationField);
            break;
          }
          case 34: {
            if (emptyField_ == null) {
              EmptyField = new global::Google.Protobuf.WellKnownTypes.Empty();
            }
            input.ReadMessage(EmptyField);
            break;
          }
          case 42: {
            if (fieldMaskField_ == null) {
              FieldMaskField = new global::Google.Protobuf.WellKnownTypes.FieldMask();
            }
            input.ReadMessage(FieldMaskField);
            break;
          }
          case 50: {
            if (sourceContextField_ == null) {
              SourceContextField = new global::Google.Protobuf.WellKnownTypes.SourceContext();
            }
            input.ReadMessage(SourceContextField);
            break;
          }
          case 58: {
            if (structField_ == null) {
              StructField = new global::Google.Protobuf.WellKnownTypes.Struct();
            }
            input.ReadMessage(StructField);
            break;
          }
          case 66: {
            if (timestampField_ == null) {
              TimestampField = new global::Google.Protobuf.WellKnownTypes.Timestamp();
            }
            input.ReadMessage(TimestampField);
            break;
          }
          case 74: {
            if (typeField_ == null) {
              TypeField = new global::Google.Protobuf.WellKnownTypes.Type();
            }
            input.ReadMessage(TypeField);
            break;
          }
          case 82: {
            double? value = _single_doubleField_codec.Read(ref input);
            if (doubleField_ == null || value != 0D) {
              DoubleField = value;
            }
            break;
          }
          case 90: {
            float? value = _single_floatField_codec.Read(ref input);
            if (floatField_ == null || value != 0F) {
              FloatField = value;
            }
            break;
          }
          case 98: {
            long? value = _single_int64Field_codec.Read(ref input);
            if (int64Field_ == null || value != 0L) {
              Int64Field = value;
            }
            break;
          }
          case 106: {
            ulong? value = _single_uint64Field_codec.Read(ref input);
            if (uint64Field_ == null || value != 0UL) {
              Uint64Field = value;
            }
            break;
          }
          case 114: {
            int? value = _single_int32Field_codec.Read(ref input);
            if (int32Field_ == null || value != 0) {
              Int32Field = value;
            }
            break;
          }
          case 122: {
            uint? value = _single_uint32Field_codec.Read(ref input);
            if (uint32Field_ == null || value != 0) {
              Uint32Field = value;
            }
            break;
          }
          case 130: {
            bool? value = _single_boolField_codec.Read(ref input);
            if (boolField_ == null || value != false) {
              BoolField = value;
            }
            break;
          }
          case 138: {
            string value = _single_stringField_codec.Read(ref input);
            if (stringField_ == null || value != "") {
              StringField = value;
            }
            break;
          }
          case 146: {
            pb::ByteString value = _single_bytesField_codec.Read(ref input);
            if (bytesField_ == null || value != pb::ByteString.Empty) {
              BytesField = value;
            }
            break;
          }
          case 154: {
            if (valueField_ == null) {
              ValueField = new global::Google.Protobuf.WellKnownTypes.Value();
            }
            input.ReadMessage(ValueField);
            break;
          }
        }
      }
    }
    #endif

  }

  /// <summary>
  /// A repeated field for each well-known type.
  /// </summary>
  public sealed partial class RepeatedWellKnownTypes : pb::IMessage<RepeatedWellKnownTypes>
  #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE
      , pb::IBufferMessage
  #endif
  {
    private static readonly pb::MessageParser<RepeatedWellKnownTypes> _parser = new pb::MessageParser<RepeatedWellKnownTypes>(() => new RepeatedWellKnownTypes());
    private pb::UnknownFieldSet _unknownFields;
    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    public static pb::MessageParser<RepeatedWellKnownTypes> Parser { get { return _parser; } }

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

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

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

    partial void OnConstruction();

    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    public RepeatedWellKnownTypes(RepeatedWellKnownTypes other) : this() {
      anyField_ = other.anyField_.Clone();
      apiField_ = other.apiField_.Clone();
      durationField_ = other.durationField_.Clone();
      emptyField_ = other.emptyField_.Clone();
      fieldMaskField_ = other.fieldMaskField_.Clone();
      sourceContextField_ = other.sourceContextField_.Clone();
      structField_ = other.structField_.Clone();
      timestampField_ = other.timestampField_.Clone();
      typeField_ = other.typeField_.Clone();
      doubleField_ = other.doubleField_.Clone();
      floatField_ = other.floatField_.Clone();
      int64Field_ = other.int64Field_.Clone();
      uint64Field_ = other.uint64Field_.Clone();
      int32Field_ = other.int32Field_.Clone();
      uint32Field_ = other.uint32Field_.Clone();
      boolField_ = other.boolField_.Clone();
      stringField_ = other.stringField_.Clone();
      bytesField_ = other.bytesField_.Clone();
      _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields);
    }

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

    /// <summary>Field number for the "any_field" field.</summary>
    public const int AnyFieldFieldNumber = 1;
    private static readonly pb::FieldCodec<global::Google.Protobuf.WellKnownTypes.Any> _repeated_anyField_codec
        = pb::FieldCodec.ForMessage(10, global::Google.Protobuf.WellKnownTypes.Any.Parser);
    private readonly pbc::RepeatedField<global::Google.Protobuf.WellKnownTypes.Any> anyField_ = new pbc::RepeatedField<global::Google.Protobuf.WellKnownTypes.Any>();
    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    public pbc::RepeatedField<global::Google.Protobuf.WellKnownTypes.Any> AnyField {
      get { return anyField_; }
    }

    /// <summary>Field number for the "api_field" field.</summary>
    public const int ApiFieldFieldNumber = 2;
    private static readonly pb::FieldCodec<global::Google.Protobuf.WellKnownTypes.Api> _repeated_apiField_codec
        = pb::FieldCodec.ForMessage(18, global::Google.Protobuf.WellKnownTypes.Api.Parser);
    private readonly pbc::RepeatedField<global::Google.Protobuf.WellKnownTypes.Api> apiField_ = new pbc::RepeatedField<global::Google.Protobuf.WellKnownTypes.Api>();
    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    public pbc::RepeatedField<global::Google.Protobuf.WellKnownTypes.Api> ApiField {
      get { return apiField_; }
    }

    /// <summary>Field number for the "duration_field" field.</summary>
    public const int DurationFieldFieldNumber = 3;
    private static readonly pb::FieldCodec<global::Google.Protobuf.WellKnownTypes.Duration> _repeated_durationField_codec
        = pb::FieldCodec.ForMessage(26, global::Google.Protobuf.WellKnownTypes.Duration.Parser);
    private readonly pbc::RepeatedField<global::Google.Protobuf.WellKnownTypes.Duration> durationField_ = new pbc::RepeatedField<global::Google.Protobuf.WellKnownTypes.Duration>();
    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    public pbc::RepeatedField<global::Google.Protobuf.WellKnownTypes.Duration> DurationField {
      get { return durationField_; }
    }

    /// <summary>Field number for the "empty_field" field.</summary>
    public const int EmptyFieldFieldNumber = 4;
    private static readonly pb::FieldCodec<global::Google.Protobuf.WellKnownTypes.Empty> _repeated_emptyField_codec
        = pb::FieldCodec.ForMessage(34, global::Google.Protobuf.WellKnownTypes.Empty.Parser);
    private readonly pbc::RepeatedField<global::Google.Protobuf.WellKnownTypes.Empty> emptyField_ = new pbc::RepeatedField<global::Google.Protobuf.WellKnownTypes.Empty>();
    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    public pbc::RepeatedField<global::Google.Protobuf.WellKnownTypes.Empty> EmptyField {
      get { return emptyField_; }
    }

    /// <summary>Field number for the "field_mask_field" field.</summary>
    public const int FieldMaskFieldFieldNumber = 5;
    private static readonly pb::FieldCodec<global::Google.Protobuf.WellKnownTypes.FieldMask> _repeated_fieldMaskField_codec
        = pb::FieldCodec.ForMessage(42, global::Google.Protobuf.WellKnownTypes.FieldMask.Parser);
    private readonly pbc::RepeatedField<global::Google.Protobuf.WellKnownTypes.FieldMask> fieldMaskField_ = new pbc::RepeatedField<global::Google.Protobuf.WellKnownTypes.FieldMask>();
    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    public pbc::RepeatedField<global::Google.Protobuf.WellKnownTypes.FieldMask> FieldMaskField {
      get { return fieldMaskField_; }
    }

    /// <summary>Field number for the "source_context_field" field.</summary>
    public const int SourceContextFieldFieldNumber = 6;
    private static readonly pb::FieldCodec<global::Google.Protobuf.WellKnownTypes.SourceContext> _repeated_sourceContextField_codec
        = pb::FieldCodec.ForMessage(50, global::Google.Protobuf.WellKnownTypes.SourceContext.Parser);
    private readonly pbc::RepeatedField<global::Google.Protobuf.WellKnownTypes.SourceContext> sourceContextField_ = new pbc::RepeatedField<global::Google.Protobuf.WellKnownTypes.SourceContext>();
    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    public pbc::RepeatedField<global::Google.Protobuf.WellKnownTypes.SourceContext> SourceContextField {
      get { return sourceContextField_; }
    }

    /// <summary>Field number for the "struct_field" field.</summary>
    public const int StructFieldFieldNumber = 7;
    private static readonly pb::FieldCodec<global::Google.Protobuf.WellKnownTypes.Struct> _repeated_structField_codec
        = pb::FieldCodec.ForMessage(58, global::Google.Protobuf.WellKnownTypes.Struct.Parser);
    private readonly pbc::RepeatedField<global::Google.Protobuf.WellKnownTypes.Struct> structField_ = new pbc::RepeatedField<global::Google.Protobuf.WellKnownTypes.Struct>();
    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    public pbc::RepeatedField<global::Google.Protobuf.WellKnownTypes.Struct> StructField {
      get { return structField_; }
    }

    /// <summary>Field number for the "timestamp_field" field.</summary>
    public const int TimestampFieldFieldNumber = 8;
    private static readonly pb::FieldCodec<global::Google.Protobuf.WellKnownTypes.Timestamp> _repeated_timestampField_codec
        = pb::FieldCodec.ForMessage(66, global::Google.Protobuf.WellKnownTypes.Timestamp.Parser);
    private readonly pbc::RepeatedField<global::Google.Protobuf.WellKnownTypes.Timestamp> timestampField_ = new pbc::RepeatedField<global::Google.Protobuf.WellKnownTypes.Timestamp>();
    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    public pbc::RepeatedField<global::Google.Protobuf.WellKnownTypes.Timestamp> TimestampField {
      get { return timestampField_; }
    }

    /// <summary>Field number for the "type_field" field.</summary>
    public const int TypeFieldFieldNumber = 9;
    private static readonly pb::FieldCodec<global::Google.Protobuf.WellKnownTypes.Type> _repeated_typeField_codec
        = pb::FieldCodec.ForMessage(74, global::Google.Protobuf.WellKnownTypes.Type.Parser);
    private readonly pbc::RepeatedField<global::Google.Protobuf.WellKnownTypes.Type> typeField_ = new pbc::RepeatedField<global::Google.Protobuf.WellKnownTypes.Type>();
    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    public pbc::RepeatedField<global::Google.Protobuf.WellKnownTypes.Type> TypeField {
      get { return typeField_; }
    }

    /// <summary>Field number for the "double_field" field.</summary>
    public const int DoubleFieldFieldNumber = 10;
    private static readonly pb::FieldCodec<double?> _repeated_doubleField_codec
        = pb::FieldCodec.ForStructWrapper<double>(82);
    private readonly pbc::RepeatedField<double?> doubleField_ = new pbc::RepeatedField<double?>();
    /// <summary>
    /// These don't actually make a lot of sense, but they're not prohibited...
    /// </summary>
    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    public pbc::RepeatedField<double?> DoubleField {
      get { return doubleField_; }
    }

    /// <summary>Field number for the "float_field" field.</summary>
    public const int FloatFieldFieldNumber = 11;
    private static readonly pb::FieldCodec<float?> _repeated_floatField_codec
        = pb::FieldCodec.ForStructWrapper<float>(90);
    private readonly pbc::RepeatedField<float?> floatField_ = new pbc::RepeatedField<float?>();
    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    public pbc::RepeatedField<float?> FloatField {
      get { return floatField_; }
    }

    /// <summary>Field number for the "int64_field" field.</summary>
    public const int Int64FieldFieldNumber = 12;
    private static readonly pb::FieldCodec<long?> _repeated_int64Field_codec
        = pb::FieldCodec.ForStructWrapper<long>(98);
    private readonly pbc::RepeatedField<long?> int64Field_ = new pbc::RepeatedField<long?>();
    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    public pbc::RepeatedField<long?> Int64Field {
      get { return int64Field_; }
    }

    /// <summary>Field number for the "uint64_field" field.</summary>
    public const int Uint64FieldFieldNumber = 13;
    private static readonly pb::FieldCodec<ulong?> _repeated_uint64Field_codec
        = pb::FieldCodec.ForStructWrapper<ulong>(106);
    private readonly pbc::RepeatedField<ulong?> uint64Field_ = new pbc::RepeatedField<ulong?>();
    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    public pbc::RepeatedField<ulong?> Uint64Field {
      get { return uint64Field_; }
    }

    /// <summary>Field number for the "int32_field" field.</summary>
    public const int Int32FieldFieldNumber = 14;
    private static readonly pb::FieldCodec<int?> _repeated_int32Field_codec
        = pb::FieldCodec.ForStructWrapper<int>(114);
    private readonly pbc::RepeatedField<int?> int32Field_ = new pbc::RepeatedField<int?>();
    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    public pbc::RepeatedField<int?> Int32Field {
      get { return int32Field_; }
    }

    /// <summary>Field number for the "uint32_field" field.</summary>
    public const int Uint32FieldFieldNumber = 15;
    private static readonly pb::FieldCodec<uint?> _repeated_uint32Field_codec
        = pb::FieldCodec.ForStructWrapper<uint>(122);
    private readonly pbc::RepeatedField<uint?> uint32Field_ = new pbc::RepeatedField<uint?>();
    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    public pbc::RepeatedField<uint?> Uint32Field {
      get { return uint32Field_; }
    }

    /// <summary>Field number for the "bool_field" field.</summary>
    public const int BoolFieldFieldNumber = 16;
    private static readonly pb::FieldCodec<bool?> _repeated_boolField_codec
        = pb::FieldCodec.ForStructWrapper<bool>(130);
    private readonly pbc::RepeatedField<bool?> boolField_ = new pbc::RepeatedField<bool?>();
    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    public pbc::RepeatedField<bool?> BoolField {
      get { return boolField_; }
    }

    /// <summary>Field number for the "string_field" field.</summary>
    public const int StringFieldFieldNumber = 17;
    private static readonly pb::FieldCodec<string> _repeated_stringField_codec
        = pb::FieldCodec.ForClassWrapper<string>(138);
    private readonly pbc::RepeatedField<string> stringField_ = new pbc::RepeatedField<string>();
    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    public pbc::RepeatedField<string> StringField {
      get { return stringField_; }
    }

    /// <summary>Field number for the "bytes_field" field.</summary>
    public const int BytesFieldFieldNumber = 18;
    private static readonly pb::FieldCodec<pb::ByteString> _repeated_bytesField_codec
        = pb::FieldCodec.ForClassWrapper<pb::ByteString>(146);
    private readonly pbc::RepeatedField<pb::ByteString> bytesField_ = new pbc::RepeatedField<pb::ByteString>();
    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    public pbc::RepeatedField<pb::ByteString> BytesField {
      get { return bytesField_; }
    }

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

    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    public bool Equals(RepeatedWellKnownTypes other) {
      if (ReferenceEquals(other, null)) {
        return false;
      }
      if (ReferenceEquals(other, this)) {
        return true;
      }
      if(!anyField_.Equals(other.anyField_)) return false;
      if(!apiField_.Equals(other.apiField_)) return false;
      if(!durationField_.Equals(other.durationField_)) return false;
      if(!emptyField_.Equals(other.emptyField_)) return false;
      if(!fieldMaskField_.Equals(other.fieldMaskField_)) return false;
      if(!sourceContextField_.Equals(other.sourceContextField_)) return false;
      if(!structField_.Equals(other.structField_)) return false;
      if(!timestampField_.Equals(other.timestampField_)) return false;
      if(!typeField_.Equals(other.typeField_)) return false;
      if(!doubleField_.Equals(other.doubleField_)) return false;
      if(!floatField_.Equals(other.floatField_)) return false;
      if(!int64Field_.Equals(other.int64Field_)) return false;
      if(!uint64Field_.Equals(other.uint64Field_)) return false;
      if(!int32Field_.Equals(other.int32Field_)) return false;
      if(!uint32Field_.Equals(other.uint32Field_)) return false;
      if(!boolField_.Equals(other.boolField_)) return false;
      if(!stringField_.Equals(other.stringField_)) return false;
      if(!bytesField_.Equals(other.bytesField_)) return false;
      return Equals(_unknownFields, other._unknownFields);
    }

    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    public override int GetHashCode() {
      int hash = 1;
      hash ^= anyField_.GetHashCode();
      hash ^= apiField_.GetHashCode();
      hash ^= durationField_.GetHashCode();
      hash ^= emptyField_.GetHashCode();
      hash ^= fieldMaskField_.GetHashCode();
      hash ^= sourceContextField_.GetHashCode();
      hash ^= structField_.GetHashCode();
      hash ^= timestampField_.GetHashCode();
      hash ^= typeField_.GetHashCode();
      hash ^= doubleField_.GetHashCode();
      hash ^= floatField_.GetHashCode();
      hash ^= int64Field_.GetHashCode();
      hash ^= uint64Field_.GetHashCode();
      hash ^= int32Field_.GetHashCode();
      hash ^= uint32Field_.GetHashCode();
      hash ^= boolField_.GetHashCode();
      hash ^= stringField_.GetHashCode();
      hash ^= bytesField_.GetHashCode();
      if (_unknownFields != null) {
        hash ^= _unknownFields.GetHashCode();
      }
      return hash;
    }

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

    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    public void WriteTo(pb::CodedOutputStream output) {
    #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE
      output.WriteRawMessage(this);
    #else
      anyField_.WriteTo(output, _repeated_anyField_codec);
      apiField_.WriteTo(output, _repeated_apiField_codec);
      durationField_.WriteTo(output, _repeated_durationField_codec);
      emptyField_.WriteTo(output, _repeated_emptyField_codec);
      fieldMaskField_.WriteTo(output, _repeated_fieldMaskField_codec);
      sourceContextField_.WriteTo(output, _repeated_sourceContextField_codec);
      structField_.WriteTo(output, _repeated_structField_codec);
      timestampField_.WriteTo(output, _repeated_timestampField_codec);
      typeField_.WriteTo(output, _repeated_typeField_codec);
      doubleField_.WriteTo(output, _repeated_doubleField_codec);
      floatField_.WriteTo(output, _repeated_floatField_codec);
      int64Field_.WriteTo(output, _repeated_int64Field_codec);
      uint64Field_.WriteTo(output, _repeated_uint64Field_codec);
      int32Field_.WriteTo(output, _repeated_int32Field_codec);
      uint32Field_.WriteTo(output, _repeated_uint32Field_codec);
      boolField_.WriteTo(output, _repeated_boolField_codec);
      stringField_.WriteTo(output, _repeated_stringField_codec);
      bytesField_.WriteTo(output, _repeated_bytesField_codec);
      if (_unknownFields != null) {
        _unknownFields.WriteTo(output);
      }
    #endif
    }

    #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE
    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    void pb::IBufferMessage.InternalWriteTo(ref pb::WriteContext output) {
      anyField_.WriteTo(ref output, _repeated_anyField_codec);
      apiField_.WriteTo(ref output, _repeated_apiField_codec);
      durationField_.WriteTo(ref output, _repeated_durationField_codec);
      emptyField_.WriteTo(ref output, _repeated_emptyField_codec);
      fieldMaskField_.WriteTo(ref output, _repeated_fieldMaskField_codec);
      sourceContextField_.WriteTo(ref output, _repeated_sourceContextField_codec);
      structField_.WriteTo(ref output, _repeated_structField_codec);
      timestampField_.WriteTo(ref output, _repeated_timestampField_codec);
      typeField_.WriteTo(ref output, _repeated_typeField_codec);
      doubleField_.WriteTo(ref output, _repeated_doubleField_codec);
      floatField_.WriteTo(ref output, _repeated_floatField_codec);
      int64Field_.WriteTo(ref output, _repeated_int64Field_codec);
      uint64Field_.WriteTo(ref output, _repeated_uint64Field_codec);
      int32Field_.WriteTo(ref output, _repeated_int32Field_codec);
      uint32Field_.WriteTo(ref output, _repeated_uint32Field_codec);
      boolField_.WriteTo(ref output, _repeated_boolField_codec);
      stringField_.WriteTo(ref output, _repeated_stringField_codec);
      bytesField_.WriteTo(ref output, _repeated_bytesField_codec);
      if (_unknownFields != null) {
        _unknownFields.WriteTo(ref output);
      }
    }
    #endif

    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    public int CalculateSize() {
      int size = 0;
      size += anyField_.CalculateSize(_repeated_anyField_codec);
      size += apiField_.CalculateSize(_repeated_apiField_codec);
      size += durationField_.CalculateSize(_repeated_durationField_codec);
      size += emptyField_.CalculateSize(_repeated_emptyField_codec);
      size += fieldMaskField_.CalculateSize(_repeated_fieldMaskField_codec);
      size += sourceContextField_.CalculateSize(_repeated_sourceContextField_codec);
      size += structField_.CalculateSize(_repeated_structField_codec);
      size += timestampField_.CalculateSize(_repeated_timestampField_codec);
      size += typeField_.CalculateSize(_repeated_typeField_codec);
      size += doubleField_.CalculateSize(_repeated_doubleField_codec);
      size += floatField_.CalculateSize(_repeated_floatField_codec);
      size += int64Field_.CalculateSize(_repeated_int64Field_codec);
      size += uint64Field_.CalculateSize(_repeated_uint64Field_codec);
      size += int32Field_.CalculateSize(_repeated_int32Field_codec);
      size += uint32Field_.CalculateSize(_repeated_uint32Field_codec);
      size += boolField_.CalculateSize(_repeated_boolField_codec);
      size += stringField_.CalculateSize(_repeated_stringField_codec);
      size += bytesField_.CalculateSize(_repeated_bytesField_codec);
      if (_unknownFields != null) {
        size += _unknownFields.CalculateSize();
      }
      return size;
    }

    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    public void MergeFrom(RepeatedWellKnownTypes other) {
      if (other == null) {
        return;
      }
      anyField_.Add(other.anyField_);
      apiField_.Add(other.apiField_);
      durationField_.Add(other.durationField_);
      emptyField_.Add(other.emptyField_);
      fieldMaskField_.Add(other.fieldMaskField_);
      sourceContextField_.Add(other.sourceContextField_);
      structField_.Add(other.structField_);
      timestampField_.Add(other.timestampField_);
      typeField_.Add(other.typeField_);
      doubleField_.Add(other.doubleField_);
      floatField_.Add(other.floatField_);
      int64Field_.Add(other.int64Field_);
      uint64Field_.Add(other.uint64Field_);
      int32Field_.Add(other.int32Field_);
      uint32Field_.Add(other.uint32Field_);
      boolField_.Add(other.boolField_);
      stringField_.Add(other.stringField_);
      bytesField_.Add(other.bytesField_);
      _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields);
    }

    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    public void MergeFrom(pb::CodedInputStream input) {
    #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE
      input.ReadRawMessage(this);
    #else
      uint tag;
      while ((tag = input.ReadTag()) != 0) {
        switch(tag) {
          default:
            _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input);
            break;
          case 10: {
            anyField_.AddEntriesFrom(input, _repeated_anyField_codec);
            break;
          }
          case 18: {
            apiField_.AddEntriesFrom(input, _repeated_apiField_codec);
            break;
          }
          case 26: {
            durationField_.AddEntriesFrom(input, _repeated_durationField_codec);
            break;
          }
          case 34: {
            emptyField_.AddEntriesFrom(input, _repeated_emptyField_codec);
            break;
          }
          case 42: {
            fieldMaskField_.AddEntriesFrom(input, _repeated_fieldMaskField_codec);
            break;
          }
          case 50: {
            sourceContextField_.AddEntriesFrom(input, _repeated_sourceContextField_codec);
            break;
          }
          case 58: {
            structField_.AddEntriesFrom(input, _repeated_structField_codec);
            break;
          }
          case 66: {
            timestampField_.AddEntriesFrom(input, _repeated_timestampField_codec);
            break;
          }
          case 74: {
            typeField_.AddEntriesFrom(input, _repeated_typeField_codec);
            break;
          }
          case 82: {
            doubleField_.AddEntriesFrom(input, _repeated_doubleField_codec);
            break;
          }
          case 90: {
            floatField_.AddEntriesFrom(input, _repeated_floatField_codec);
            break;
          }
          case 98: {
            int64Field_.AddEntriesFrom(input, _repeated_int64Field_codec);
            break;
          }
          case 106: {
            uint64Field_.AddEntriesFrom(input, _repeated_uint64Field_codec);
            break;
          }
          case 114: {
            int32Field_.AddEntriesFrom(input, _repeated_int32Field_codec);
            break;
          }
          case 122: {
            uint32Field_.AddEntriesFrom(input, _repeated_uint32Field_codec);
            break;
          }
          case 130: {
            boolField_.AddEntriesFrom(input, _repeated_boolField_codec);
            break;
          }
          case 138: {
            stringField_.AddEntriesFrom(input, _repeated_stringField_codec);
            break;
          }
          case 146: {
            bytesField_.AddEntriesFrom(input, _repeated_bytesField_codec);
            break;
          }
        }
      }
    #endif
    }

    #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE
    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    void pb::IBufferMessage.InternalMergeFrom(ref pb::ParseContext input) {
      uint tag;
      while ((tag = input.ReadTag()) != 0) {
        switch(tag) {
          default:
            _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, ref input);
            break;
          case 10: {
            anyField_.AddEntriesFrom(ref input, _repeated_anyField_codec);
            break;
          }
          case 18: {
            apiField_.AddEntriesFrom(ref input, _repeated_apiField_codec);
            break;
          }
          case 26: {
            durationField_.AddEntriesFrom(ref input, _repeated_durationField_codec);
            break;
          }
          case 34: {
            emptyField_.AddEntriesFrom(ref input, _repeated_emptyField_codec);
            break;
          }
          case 42: {
            fieldMaskField_.AddEntriesFrom(ref input, _repeated_fieldMaskField_codec);
            break;
          }
          case 50: {
            sourceContextField_.AddEntriesFrom(ref input, _repeated_sourceContextField_codec);
            break;
          }
          case 58: {
            structField_.AddEntriesFrom(ref input, _repeated_structField_codec);
            break;
          }
          case 66: {
            timestampField_.AddEntriesFrom(ref input, _repeated_timestampField_codec);
            break;
          }
          case 74: {
            typeField_.AddEntriesFrom(ref input, _repeated_typeField_codec);
            break;
          }
          case 82: {
            doubleField_.AddEntriesFrom(ref input, _repeated_doubleField_codec);
            break;
          }
          case 90: {
            floatField_.AddEntriesFrom(ref input, _repeated_floatField_codec);
            break;
          }
          case 98: {
            int64Field_.AddEntriesFrom(ref input, _repeated_int64Field_codec);
            break;
          }
          case 106: {
            uint64Field_.AddEntriesFrom(ref input, _repeated_uint64Field_codec);
            break;
          }
          case 114: {
            int32Field_.AddEntriesFrom(ref input, _repeated_int32Field_codec);
            break;
          }
          case 122: {
            uint32Field_.AddEntriesFrom(ref input, _repeated_uint32Field_codec);
            break;
          }
          case 130: {
            boolField_.AddEntriesFrom(ref input, _repeated_boolField_codec);
            break;
          }
          case 138: {
            stringField_.AddEntriesFrom(ref input, _repeated_stringField_codec);
            break;
          }
          case 146: {
            bytesField_.AddEntriesFrom(ref input, _repeated_bytesField_codec);
            break;
          }
        }
      }
    }
    #endif

  }

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

    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    public static pbr::MessageDescriptor Descriptor {
      get { return global::Google.Protobuf.TestProtos.UnittestWellKnownTypesReflection.Descriptor.MessageTypes[2]; }
    }

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

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

    partial void OnConstruction();

    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    public OneofWellKnownTypes(OneofWellKnownTypes other) : this() {
      switch (other.OneofFieldCase) {
        case OneofFieldOneofCase.AnyField:
          AnyField = other.AnyField.Clone();
          break;
        case OneofFieldOneofCase.ApiField:
          ApiField = other.ApiField.Clone();
          break;
        case OneofFieldOneofCase.DurationField:
          DurationField = other.DurationField.Clone();
          break;
        case OneofFieldOneofCase.EmptyField:
          EmptyField = other.EmptyField.Clone();
          break;
        case OneofFieldOneofCase.FieldMaskField:
          FieldMaskField = other.FieldMaskField.Clone();
          break;
        case OneofFieldOneofCase.SourceContextField:
          SourceContextField = other.SourceContextField.Clone();
          break;
        case OneofFieldOneofCase.StructField:
          StructField = other.StructField.Clone();
          break;
        case OneofFieldOneofCase.TimestampField:
          TimestampField = other.TimestampField.Clone();
          break;
        case OneofFieldOneofCase.TypeField:
          TypeField = other.TypeField.Clone();
          break;
        case OneofFieldOneofCase.DoubleField:
          DoubleField = other.DoubleField;
          break;
        case OneofFieldOneofCase.FloatField:
          FloatField = other.FloatField;
          break;
        case OneofFieldOneofCase.Int64Field:
          Int64Field = other.Int64Field;
          break;
        case OneofFieldOneofCase.Uint64Field:
          Uint64Field = other.Uint64Field;
          break;
        case OneofFieldOneofCase.Int32Field:
          Int32Field = other.Int32Field;
          break;
        case OneofFieldOneofCase.Uint32Field:
          Uint32Field = other.Uint32Field;
          break;
        case OneofFieldOneofCase.BoolField:
          BoolField = other.BoolField;
          break;
        case OneofFieldOneofCase.StringField:
          StringField = other.StringField;
          break;
        case OneofFieldOneofCase.BytesField:
          BytesField = other.BytesField;
          break;
      }

      _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields);
    }

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

    /// <summary>Field number for the "any_field" field.</summary>
    public const int AnyFieldFieldNumber = 1;
    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    public global::Google.Protobuf.WellKnownTypes.Any AnyField {
      get { return oneofFieldCase_ == OneofFieldOneofCase.AnyField ? (global::Google.Protobuf.WellKnownTypes.Any) oneofField_ : null; }
      set {
        oneofField_ = value;
        oneofFieldCase_ = value == null ? OneofFieldOneofCase.None : OneofFieldOneofCase.AnyField;
      }
    }

    /// <summary>Field number for the "api_field" field.</summary>
    public const int ApiFieldFieldNumber = 2;
    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    public global::Google.Protobuf.WellKnownTypes.Api ApiField {
      get { return oneofFieldCase_ == OneofFieldOneofCase.ApiField ? (global::Google.Protobuf.WellKnownTypes.Api) oneofField_ : null; }
      set {
        oneofField_ = value;
        oneofFieldCase_ = value == null ? OneofFieldOneofCase.None : OneofFieldOneofCase.ApiField;
      }
    }

    /// <summary>Field number for the "duration_field" field.</summary>
    public const int DurationFieldFieldNumber = 3;
    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    public global::Google.Protobuf.WellKnownTypes.Duration DurationField {
      get { return oneofFieldCase_ == OneofFieldOneofCase.DurationField ? (global::Google.Protobuf.WellKnownTypes.Duration) oneofField_ : null; }
      set {
        oneofField_ = value;
        oneofFieldCase_ = value == null ? OneofFieldOneofCase.None : OneofFieldOneofCase.DurationField;
      }
    }

    /// <summary>Field number for the "empty_field" field.</summary>
    public const int EmptyFieldFieldNumber = 4;
    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    public global::Google.Protobuf.WellKnownTypes.Empty EmptyField {
      get { return oneofFieldCase_ == OneofFieldOneofCase.EmptyField ? (global::Google.Protobuf.WellKnownTypes.Empty) oneofField_ : null; }
      set {
        oneofField_ = value;
        oneofFieldCase_ = value == null ? OneofFieldOneofCase.None : OneofFieldOneofCase.EmptyField;
      }
    }

    /// <summary>Field number for the "field_mask_field" field.</summary>
    public const int FieldMaskFieldFieldNumber = 5;
    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    public global::Google.Protobuf.WellKnownTypes.FieldMask FieldMaskField {
      get { return oneofFieldCase_ == OneofFieldOneofCase.FieldMaskField ? (global::Google.Protobuf.WellKnownTypes.FieldMask) oneofField_ : null; }
      set {
        oneofField_ = value;
        oneofFieldCase_ = value == null ? OneofFieldOneofCase.None : OneofFieldOneofCase.FieldMaskField;
      }
    }

    /// <summary>Field number for the "source_context_field" field.</summary>
    public const int SourceContextFieldFieldNumber = 6;
    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    public global::Google.Protobuf.WellKnownTypes.SourceContext SourceContextField {
      get { return oneofFieldCase_ == OneofFieldOneofCase.SourceContextField ? (global::Google.Protobuf.WellKnownTypes.SourceContext) oneofField_ : null; }
      set {
        oneofField_ = value;
        oneofFieldCase_ = value == null ? OneofFieldOneofCase.None : OneofFieldOneofCase.SourceContextField;
      }
    }

    /// <summary>Field number for the "struct_field" field.</summary>
    public const int StructFieldFieldNumber = 7;
    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    public global::Google.Protobuf.WellKnownTypes.Struct StructField {
      get { return oneofFieldCase_ == OneofFieldOneofCase.StructField ? (global::Google.Protobuf.WellKnownTypes.Struct) oneofField_ : null; }
      set {
        oneofField_ = value;
        oneofFieldCase_ = value == null ? OneofFieldOneofCase.None : OneofFieldOneofCase.StructField;
      }
    }

    /// <summary>Field number for the "timestamp_field" field.</summary>
    public const int TimestampFieldFieldNumber = 8;
    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    public global::Google.Protobuf.WellKnownTypes.Timestamp TimestampField {
      get { return oneofFieldCase_ == OneofFieldOneofCase.TimestampField ? (global::Google.Protobuf.WellKnownTypes.Timestamp) oneofField_ : null; }
      set {
        oneofField_ = value;
        oneofFieldCase_ = value == null ? OneofFieldOneofCase.None : OneofFieldOneofCase.TimestampField;
      }
    }

    /// <summary>Field number for the "type_field" field.</summary>
    public const int TypeFieldFieldNumber = 9;
    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    public global::Google.Protobuf.WellKnownTypes.Type TypeField {
      get { return oneofFieldCase_ == OneofFieldOneofCase.TypeField ? (global::Google.Protobuf.WellKnownTypes.Type) oneofField_ : null; }
      set {
        oneofField_ = value;
        oneofFieldCase_ = value == null ? OneofFieldOneofCase.None : OneofFieldOneofCase.TypeField;
      }
    }

    /// <summary>Field number for the "double_field" field.</summary>
    public const int DoubleFieldFieldNumber = 10;
    private static readonly pb::FieldCodec<double?> _oneof_doubleField_codec = pb::FieldCodec.ForStructWrapper<double>(82);
    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    public double? DoubleField {
      get { return oneofFieldCase_ == OneofFieldOneofCase.DoubleField ? (double?) oneofField_ : (double?) null; }
      set {
        oneofField_ = value;
        oneofFieldCase_ = value == null ? OneofFieldOneofCase.None : OneofFieldOneofCase.DoubleField;
      }
    }

    /// <summary>Field number for the "float_field" field.</summary>
    public const int FloatFieldFieldNumber = 11;
    private static readonly pb::FieldCodec<float?> _oneof_floatField_codec = pb::FieldCodec.ForStructWrapper<float>(90);
    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    public float? FloatField {
      get { return oneofFieldCase_ == OneofFieldOneofCase.FloatField ? (float?) oneofField_ : (float?) null; }
      set {
        oneofField_ = value;
        oneofFieldCase_ = value == null ? OneofFieldOneofCase.None : OneofFieldOneofCase.FloatField;
      }
    }

    /// <summary>Field number for the "int64_field" field.</summary>
    public const int Int64FieldFieldNumber = 12;
    private static readonly pb::FieldCodec<long?> _oneof_int64Field_codec = pb::FieldCodec.ForStructWrapper<long>(98);
    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    public long? Int64Field {
      get { return oneofFieldCase_ == OneofFieldOneofCase.Int64Field ? (long?) oneofField_ : (long?) null; }
      set {
        oneofField_ = value;
        oneofFieldCase_ = value == null ? OneofFieldOneofCase.None : OneofFieldOneofCase.Int64Field;
      }
    }

    /// <summary>Field number for the "uint64_field" field.</summary>
    public const int Uint64FieldFieldNumber = 13;
    private static readonly pb::FieldCodec<ulong?> _oneof_uint64Field_codec = pb::FieldCodec.ForStructWrapper<ulong>(106);
    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    public ulong? Uint64Field {
      get { return oneofFieldCase_ == OneofFieldOneofCase.Uint64Field ? (ulong?) oneofField_ : (ulong?) null; }
      set {
        oneofField_ = value;
        oneofFieldCase_ = value == null ? OneofFieldOneofCase.None : OneofFieldOneofCase.Uint64Field;
      }
    }

    /// <summary>Field number for the "int32_field" field.</summary>
    public const int Int32FieldFieldNumber = 14;
    private static readonly pb::FieldCodec<int?> _oneof_int32Field_codec = pb::FieldCodec.ForStructWrapper<int>(114);
    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    public int? Int32Field {
      get { return oneofFieldCase_ == OneofFieldOneofCase.Int32Field ? (int?) oneofField_ : (int?) null; }
      set {
        oneofField_ = value;
        oneofFieldCase_ = value == null ? OneofFieldOneofCase.None : OneofFieldOneofCase.Int32Field;
      }
    }

    /// <summary>Field number for the "uint32_field" field.</summary>
    public const int Uint32FieldFieldNumber = 15;
    private static readonly pb::FieldCodec<uint?> _oneof_uint32Field_codec = pb::FieldCodec.ForStructWrapper<uint>(122);
    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    public uint? Uint32Field {
      get { return oneofFieldCase_ == OneofFieldOneofCase.Uint32Field ? (uint?) oneofField_ : (uint?) null; }
      set {
        oneofField_ = value;
        oneofFieldCase_ = value == null ? OneofFieldOneofCase.None : OneofFieldOneofCase.Uint32Field;
      }
    }

    /// <summary>Field number for the "bool_field" field.</summary>
    public const int BoolFieldFieldNumber = 16;
    private static readonly pb::FieldCodec<bool?> _oneof_boolField_codec = pb::FieldCodec.ForStructWrapper<bool>(130);
    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    public bool? BoolField {
      get { return oneofFieldCase_ == OneofFieldOneofCase.BoolField ? (bool?) oneofField_ : (bool?) null; }
      set {
        oneofField_ = value;
        oneofFieldCase_ = value == null ? OneofFieldOneofCase.None : OneofFieldOneofCase.BoolField;
      }
    }

    /// <summary>Field number for the "string_field" field.</summary>
    public const int StringFieldFieldNumber = 17;
    private static readonly pb::FieldCodec<string> _oneof_stringField_codec = pb::FieldCodec.ForClassWrapper<string>(138);
    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    public string StringField {
      get { return oneofFieldCase_ == OneofFieldOneofCase.StringField ? (string) oneofField_ : (string) null; }
      set {
        oneofField_ = value;
        oneofFieldCase_ = value == null ? OneofFieldOneofCase.None : OneofFieldOneofCase.StringField;
      }
    }

    /// <summary>Field number for the "bytes_field" field.</summary>
    public const int BytesFieldFieldNumber = 18;
    private static readonly pb::FieldCodec<pb::ByteString> _oneof_bytesField_codec = pb::FieldCodec.ForClassWrapper<pb::ByteString>(146);
    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    public pb::ByteString BytesField {
      get { return oneofFieldCase_ == OneofFieldOneofCase.BytesField ? (pb::ByteString) oneofField_ : (pb::ByteString) null; }
      set {
        oneofField_ = value;
        oneofFieldCase_ = value == null ? OneofFieldOneofCase.None : OneofFieldOneofCase.BytesField;
      }
    }

    private object oneofField_;
    /// <summary>Enum of possible cases for the "oneof_field" oneof.</summary>
    public enum OneofFieldOneofCase {
      None = 0,
      AnyField = 1,
      ApiField = 2,
      DurationField = 3,
      EmptyField = 4,
      FieldMaskField = 5,
      SourceContextField = 6,
      StructField = 7,
      TimestampField = 8,
      TypeField = 9,
      DoubleField = 10,
      FloatField = 11,
      Int64Field = 12,
      Uint64Field = 13,
      Int32Field = 14,
      Uint32Field = 15,
      BoolField = 16,
      StringField = 17,
      BytesField = 18,
    }
    private OneofFieldOneofCase oneofFieldCase_ = OneofFieldOneofCase.None;
    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    public OneofFieldOneofCase OneofFieldCase {
      get { return oneofFieldCase_; }
    }

    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    public void ClearOneofField() {
      oneofFieldCase_ = OneofFieldOneofCase.None;
      oneofField_ = null;
    }

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

    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    public bool Equals(OneofWellKnownTypes other) {
      if (ReferenceEquals(other, null)) {
        return false;
      }
      if (ReferenceEquals(other, this)) {
        return true;
      }
      if (!object.Equals(AnyField, other.AnyField)) return false;
      if (!object.Equals(ApiField, other.ApiField)) return false;
      if (!object.Equals(DurationField, other.DurationField)) return false;
      if (!object.Equals(EmptyField, other.EmptyField)) return false;
      if (!object.Equals(FieldMaskField, other.FieldMaskField)) return false;
      if (!object.Equals(SourceContextField, other.SourceContextField)) return false;
      if (!object.Equals(StructField, other.StructField)) return false;
      if (!object.Equals(TimestampField, other.TimestampField)) return false;
      if (!object.Equals(TypeField, other.TypeField)) return false;
      if (!pbc::ProtobufEqualityComparers.BitwiseNullableDoubleEqualityComparer.Equals(DoubleField, other.DoubleField)) return false;
      if (!pbc::ProtobufEqualityComparers.BitwiseNullableSingleEqualityComparer.Equals(FloatField, other.FloatField)) return false;
      if (Int64Field != other.Int64Field) return false;
      if (Uint64Field != other.Uint64Field) return false;
      if (Int32Field != other.Int32Field) return false;
      if (Uint32Field != other.Uint32Field) return false;
      if (BoolField != other.BoolField) return false;
      if (StringField != other.StringField) return false;
      if (BytesField != other.BytesField) return false;
      if (OneofFieldCase != other.OneofFieldCase) return false;
      return Equals(_unknownFields, other._unknownFields);
    }

    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    public override int GetHashCode() {
      int hash = 1;
      if (oneofFieldCase_ == OneofFieldOneofCase.AnyField) hash ^= AnyField.GetHashCode();
      if (oneofFieldCase_ == OneofFieldOneofCase.ApiField) hash ^= ApiField.GetHashCode();
      if (oneofFieldCase_ == OneofFieldOneofCase.DurationField) hash ^= DurationField.GetHashCode();
      if (oneofFieldCase_ == OneofFieldOneofCase.EmptyField) hash ^= EmptyField.GetHashCode();
      if (oneofFieldCase_ == OneofFieldOneofCase.FieldMaskField) hash ^= FieldMaskField.GetHashCode();
      if (oneofFieldCase_ == OneofFieldOneofCase.SourceContextField) hash ^= SourceContextField.GetHashCode();
      if (oneofFieldCase_ == OneofFieldOneofCase.StructField) hash ^= StructField.GetHashCode();
      if (oneofFieldCase_ == OneofFieldOneofCase.TimestampField) hash ^= TimestampField.GetHashCode();
      if (oneofFieldCase_ == OneofFieldOneofCase.TypeField) hash ^= TypeField.GetHashCode();
      if (oneofFieldCase_ == OneofFieldOneofCase.DoubleField) hash ^= pbc::ProtobufEqualityComparers.BitwiseNullableDoubleEqualityComparer.GetHashCode(DoubleField);
      if (oneofFieldCase_ == OneofFieldOneofCase.FloatField) hash ^= pbc::ProtobufEqualityComparers.BitwiseNullableSingleEqualityComparer.GetHashCode(FloatField);
      if (oneofFieldCase_ == OneofFieldOneofCase.Int64Field) hash ^= Int64Field.GetHashCode();
      if (oneofFieldCase_ == OneofFieldOneofCase.Uint64Field) hash ^= Uint64Field.GetHashCode();
      if (oneofFieldCase_ == OneofFieldOneofCase.Int32Field) hash ^= Int32Field.GetHashCode();
      if (oneofFieldCase_ == OneofFieldOneofCase.Uint32Field) hash ^= Uint32Field.GetHashCode();
      if (oneofFieldCase_ == OneofFieldOneofCase.BoolField) hash ^= BoolField.GetHashCode();
      if (oneofFieldCase_ == OneofFieldOneofCase.StringField) hash ^= StringField.GetHashCode();
      if (oneofFieldCase_ == OneofFieldOneofCase.BytesField) hash ^= BytesField.GetHashCode();
      hash ^= (int) oneofFieldCase_;
      if (_unknownFields != null) {
        hash ^= _unknownFields.GetHashCode();
      }
      return hash;
    }

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

    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    public void WriteTo(pb::CodedOutputStream output) {
    #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE
      output.WriteRawMessage(this);
    #else
      if (oneofFieldCase_ == OneofFieldOneofCase.AnyField) {
        output.WriteRawTag(10);
        output.WriteMessage(AnyField);
      }
      if (oneofFieldCase_ == OneofFieldOneofCase.ApiField) {
        output.WriteRawTag(18);
        output.WriteMessage(ApiField);
      }
      if (oneofFieldCase_ == OneofFieldOneofCase.DurationField) {
        output.WriteRawTag(26);
        output.WriteMessage(DurationField);
      }
      if (oneofFieldCase_ == OneofFieldOneofCase.EmptyField) {
        output.WriteRawTag(34);
        output.WriteMessage(EmptyField);
      }
      if (oneofFieldCase_ == OneofFieldOneofCase.FieldMaskField) {
        output.WriteRawTag(42);
        output.WriteMessage(FieldMaskField);
      }
      if (oneofFieldCase_ == OneofFieldOneofCase.SourceContextField) {
        output.WriteRawTag(50);
        output.WriteMessage(SourceContextField);
      }
      if (oneofFieldCase_ == OneofFieldOneofCase.StructField) {
        output.WriteRawTag(58);
        output.WriteMessage(StructField);
      }
      if (oneofFieldCase_ == OneofFieldOneofCase.TimestampField) {
        output.WriteRawTag(66);
        output.WriteMessage(TimestampField);
      }
      if (oneofFieldCase_ == OneofFieldOneofCase.TypeField) {
        output.WriteRawTag(74);
        output.WriteMessage(TypeField);
      }
      if (oneofFieldCase_ == OneofFieldOneofCase.DoubleField) {
        _oneof_doubleField_codec.WriteTagAndValue(output, (double?) oneofField_);
      }
      if (oneofFieldCase_ == OneofFieldOneofCase.FloatField) {
        _oneof_floatField_codec.WriteTagAndValue(output, (float?) oneofField_);
      }
      if (oneofFieldCase_ == OneofFieldOneofCase.Int64Field) {
        _oneof_int64Field_codec.WriteTagAndValue(output, (long?) oneofField_);
      }
      if (oneofFieldCase_ == OneofFieldOneofCase.Uint64Field) {
        _oneof_uint64Field_codec.WriteTagAndValue(output, (ulong?) oneofField_);
      }
      if (oneofFieldCase_ == OneofFieldOneofCase.Int32Field) {
        _oneof_int32Field_codec.WriteTagAndValue(output, (int?) oneofField_);
      }
      if (oneofFieldCase_ == OneofFieldOneofCase.Uint32Field) {
        _oneof_uint32Field_codec.WriteTagAndValue(output, (uint?) oneofField_);
      }
      if (oneofFieldCase_ == OneofFieldOneofCase.BoolField) {
        _oneof_boolField_codec.WriteTagAndValue(output, (bool?) oneofField_);
      }
      if (oneofFieldCase_ == OneofFieldOneofCase.StringField) {
        _oneof_stringField_codec.WriteTagAndValue(output, (string) oneofField_);
      }
      if (oneofFieldCase_ == OneofFieldOneofCase.BytesField) {
        _oneof_bytesField_codec.WriteTagAndValue(output, (pb::ByteString) oneofField_);
      }
      if (_unknownFields != null) {
        _unknownFields.WriteTo(output);
      }
    #endif
    }

    #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE
    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    void pb::IBufferMessage.InternalWriteTo(ref pb::WriteContext output) {
      if (oneofFieldCase_ == OneofFieldOneofCase.AnyField) {
        output.WriteRawTag(10);
        output.WriteMessage(AnyField);
      }
      if (oneofFieldCase_ == OneofFieldOneofCase.ApiField) {
        output.WriteRawTag(18);
        output.WriteMessage(ApiField);
      }
      if (oneofFieldCase_ == OneofFieldOneofCase.DurationField) {
        output.WriteRawTag(26);
        output.WriteMessage(DurationField);
      }
      if (oneofFieldCase_ == OneofFieldOneofCase.EmptyField) {
        output.WriteRawTag(34);
        output.WriteMessage(EmptyField);
      }
      if (oneofFieldCase_ == OneofFieldOneofCase.FieldMaskField) {
        output.WriteRawTag(42);
        output.WriteMessage(FieldMaskField);
      }
      if (oneofFieldCase_ == OneofFieldOneofCase.SourceContextField) {
        output.WriteRawTag(50);
        output.WriteMessage(SourceContextField);
      }
      if (oneofFieldCase_ == OneofFieldOneofCase.StructField) {
        output.WriteRawTag(58);
        output.WriteMessage(StructField);
      }
      if (oneofFieldCase_ == OneofFieldOneofCase.TimestampField) {
        output.WriteRawTag(66);
        output.WriteMessage(TimestampField);
      }
      if (oneofFieldCase_ == OneofFieldOneofCase.TypeField) {
        output.WriteRawTag(74);
        output.WriteMessage(TypeField);
      }
      if (oneofFieldCase_ == OneofFieldOneofCase.DoubleField) {
        _oneof_doubleField_codec.WriteTagAndValue(ref output, (double?) oneofField_);
      }
      if (oneofFieldCase_ == OneofFieldOneofCase.FloatField) {
        _oneof_floatField_codec.WriteTagAndValue(ref output, (float?) oneofField_);
      }
      if (oneofFieldCase_ == OneofFieldOneofCase.Int64Field) {
        _oneof_int64Field_codec.WriteTagAndValue(ref output, (long?) oneofField_);
      }
      if (oneofFieldCase_ == OneofFieldOneofCase.Uint64Field) {
        _oneof_uint64Field_codec.WriteTagAndValue(ref output, (ulong?) oneofField_);
      }
      if (oneofFieldCase_ == OneofFieldOneofCase.Int32Field) {
        _oneof_int32Field_codec.WriteTagAndValue(ref output, (int?) oneofField_);
      }
      if (oneofFieldCase_ == OneofFieldOneofCase.Uint32Field) {
        _oneof_uint32Field_codec.WriteTagAndValue(ref output, (uint?) oneofField_);
      }
      if (oneofFieldCase_ == OneofFieldOneofCase.BoolField) {
        _oneof_boolField_codec.WriteTagAndValue(ref output, (bool?) oneofField_);
      }
      if (oneofFieldCase_ == OneofFieldOneofCase.StringField) {
        _oneof_stringField_codec.WriteTagAndValue(ref output, (string) oneofField_);
      }
      if (oneofFieldCase_ == OneofFieldOneofCase.BytesField) {
        _oneof_bytesField_codec.WriteTagAndValue(ref output, (pb::ByteString) oneofField_);
      }
      if (_unknownFields != null) {
        _unknownFields.WriteTo(ref output);
      }
    }
    #endif

    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    public int CalculateSize() {
      int size = 0;
      if (oneofFieldCase_ == OneofFieldOneofCase.AnyField) {
        size += 1 + pb::CodedOutputStream.ComputeMessageSize(AnyField);
      }
      if (oneofFieldCase_ == OneofFieldOneofCase.ApiField) {
        size += 1 + pb::CodedOutputStream.ComputeMessageSize(ApiField);
      }
      if (oneofFieldCase_ == OneofFieldOneofCase.DurationField) {
        size += 1 + pb::CodedOutputStream.ComputeMessageSize(DurationField);
      }
      if (oneofFieldCase_ == OneofFieldOneofCase.EmptyField) {
        size += 1 + pb::CodedOutputStream.ComputeMessageSize(EmptyField);
      }
      if (oneofFieldCase_ == OneofFieldOneofCase.FieldMaskField) {
        size += 1 + pb::CodedOutputStream.ComputeMessageSize(FieldMaskField);
      }
      if (oneofFieldCase_ == OneofFieldOneofCase.SourceContextField) {
        size += 1 + pb::CodedOutputStream.ComputeMessageSize(SourceContextField);
      }
      if (oneofFieldCase_ == OneofFieldOneofCase.StructField) {
        size += 1 + pb::CodedOutputStream.ComputeMessageSize(StructField);
      }
      if (oneofFieldCase_ == OneofFieldOneofCase.TimestampField) {
        size += 1 + pb::CodedOutputStream.ComputeMessageSize(TimestampField);
      }
      if (oneofFieldCase_ == OneofFieldOneofCase.TypeField) {
        size += 1 + pb::CodedOutputStream.ComputeMessageSize(TypeField);
      }
      if (oneofFieldCase_ == OneofFieldOneofCase.DoubleField) {
        size += _oneof_doubleField_codec.CalculateSizeWithTag(DoubleField);
      }
      if (oneofFieldCase_ == OneofFieldOneofCase.FloatField) {
        size += _oneof_floatField_codec.CalculateSizeWithTag(FloatField);
      }
      if (oneofFieldCase_ == OneofFieldOneofCase.Int64Field) {
        size += _oneof_int64Field_codec.CalculateSizeWithTag(Int64Field);
      }
      if (oneofFieldCase_ == OneofFieldOneofCase.Uint64Field) {
        size += _oneof_uint64Field_codec.CalculateSizeWithTag(Uint64Field);
      }
      if (oneofFieldCase_ == OneofFieldOneofCase.Int32Field) {
        size += _oneof_int32Field_codec.CalculateSizeWithTag(Int32Field);
      }
      if (oneofFieldCase_ == OneofFieldOneofCase.Uint32Field) {
        size += _oneof_uint32Field_codec.CalculateSizeWithTag(Uint32Field);
      }
      if (oneofFieldCase_ == OneofFieldOneofCase.BoolField) {
        size += _oneof_boolField_codec.CalculateSizeWithTag(BoolField);
      }
      if (oneofFieldCase_ == OneofFieldOneofCase.StringField) {
        size += _oneof_stringField_codec.CalculateSizeWithTag(StringField);
      }
      if (oneofFieldCase_ == OneofFieldOneofCase.BytesField) {
        size += _oneof_bytesField_codec.CalculateSizeWithTag(BytesField);
      }
      if (_unknownFields != null) {
        size += _unknownFields.CalculateSize();
      }
      return size;
    }

    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    public void MergeFrom(OneofWellKnownTypes other) {
      if (other == null) {
        return;
      }
      switch (other.OneofFieldCase) {
        case OneofFieldOneofCase.AnyField:
          if (AnyField == null) {
            AnyField = new global::Google.Protobuf.WellKnownTypes.Any();
          }
          AnyField.MergeFrom(other.AnyField);
          break;
        case OneofFieldOneofCase.ApiField:
          if (ApiField == null) {
            ApiField = new global::Google.Protobuf.WellKnownTypes.Api();
          }
          ApiField.MergeFrom(other.ApiField);
          break;
        case OneofFieldOneofCase.DurationField:
          if (DurationField == null) {
            DurationField = new global::Google.Protobuf.WellKnownTypes.Duration();
          }
          DurationField.MergeFrom(other.DurationField);
          break;
        case OneofFieldOneofCase.EmptyField:
          if (EmptyField == null) {
            EmptyField = new global::Google.Protobuf.WellKnownTypes.Empty();
          }
          EmptyField.MergeFrom(other.EmptyField);
          break;
        case OneofFieldOneofCase.FieldMaskField:
          if (FieldMaskField == null) {
            FieldMaskField = new global::Google.Protobuf.WellKnownTypes.FieldMask();
          }
          FieldMaskField.MergeFrom(other.FieldMaskField);
          break;
        case OneofFieldOneofCase.SourceContextField:
          if (SourceContextField == null) {
            SourceContextField = new global::Google.Protobuf.WellKnownTypes.SourceContext();
          }
          SourceContextField.MergeFrom(other.SourceContextField);
          break;
        case OneofFieldOneofCase.StructField:
          if (StructField == null) {
            StructField = new global::Google.Protobuf.WellKnownTypes.Struct();
          }
          StructField.MergeFrom(other.StructField);
          break;
        case OneofFieldOneofCase.TimestampField:
          if (TimestampField == null) {
            TimestampField = new global::Google.Protobuf.WellKnownTypes.Timestamp();
          }
          TimestampField.MergeFrom(other.TimestampField);
          break;
        case OneofFieldOneofCase.TypeField:
          if (TypeField == null) {
            TypeField = new global::Google.Protobuf.WellKnownTypes.Type();
          }
          TypeField.MergeFrom(other.TypeField);
          break;
        case OneofFieldOneofCase.DoubleField:
          DoubleField = other.DoubleField;
          break;
        case OneofFieldOneofCase.FloatField:
          FloatField = other.FloatField;
          break;
        case OneofFieldOneofCase.Int64Field:
          Int64Field = other.Int64Field;
          break;
        case OneofFieldOneofCase.Uint64Field:
          Uint64Field = other.Uint64Field;
          break;
        case OneofFieldOneofCase.Int32Field:
          Int32Field = other.Int32Field;
          break;
        case OneofFieldOneofCase.Uint32Field:
          Uint32Field = other.Uint32Field;
          break;
        case OneofFieldOneofCase.BoolField:
          BoolField = other.BoolField;
          break;
        case OneofFieldOneofCase.StringField:
          StringField = other.StringField;
          break;
        case OneofFieldOneofCase.BytesField:
          BytesField = other.BytesField;
          break;
      }

      _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields);
    }

    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    public void MergeFrom(pb::CodedInputStream input) {
    #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE
      input.ReadRawMessage(this);
    #else
      uint tag;
      while ((tag = input.ReadTag()) != 0) {
        switch(tag) {
          default:
            _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input);
            break;
          case 10: {
            global::Google.Protobuf.WellKnownTypes.Any subBuilder = new global::Google.Protobuf.WellKnownTypes.Any();
            if (oneofFieldCase_ == OneofFieldOneofCase.AnyField) {
              subBuilder.MergeFrom(AnyField);
            }
            input.ReadMessage(subBuilder);
            AnyField = subBuilder;
            break;
          }
          case 18: {
            global::Google.Protobuf.WellKnownTypes.Api subBuilder = new global::Google.Protobuf.WellKnownTypes.Api();
            if (oneofFieldCase_ == OneofFieldOneofCase.ApiField) {
              subBuilder.MergeFrom(ApiField);
            }
            input.ReadMessage(subBuilder);
            ApiField = subBuilder;
            break;
          }
          case 26: {
            global::Google.Protobuf.WellKnownTypes.Duration subBuilder = new global::Google.Protobuf.WellKnownTypes.Duration();
            if (oneofFieldCase_ == OneofFieldOneofCase.DurationField) {
              subBuilder.MergeFrom(DurationField);
            }
            input.ReadMessage(subBuilder);
            DurationField = subBuilder;
            break;
          }
          case 34: {
            global::Google.Protobuf.WellKnownTypes.Empty subBuilder = new global::Google.Protobuf.WellKnownTypes.Empty();
            if (oneofFieldCase_ == OneofFieldOneofCase.EmptyField) {
              subBuilder.MergeFrom(EmptyField);
            }
            input.ReadMessage(subBuilder);
            EmptyField = subBuilder;
            break;
          }
          case 42: {
            global::Google.Protobuf.WellKnownTypes.FieldMask subBuilder = new global::Google.Protobuf.WellKnownTypes.FieldMask();
            if (oneofFieldCase_ == OneofFieldOneofCase.FieldMaskField) {
              subBuilder.MergeFrom(FieldMaskField);
            }
            input.ReadMessage(subBuilder);
            FieldMaskField = subBuilder;
            break;
          }
          case 50: {
            global::Google.Protobuf.WellKnownTypes.SourceContext subBuilder = new global::Google.Protobuf.WellKnownTypes.SourceContext();
            if (oneofFieldCase_ == OneofFieldOneofCase.SourceContextField) {
              subBuilder.MergeFrom(SourceContextField);
            }
            input.ReadMessage(subBuilder);
            SourceContextField = subBuilder;
            break;
          }
          case 58: {
            global::Google.Protobuf.WellKnownTypes.Struct subBuilder = new global::Google.Protobuf.WellKnownTypes.Struct();
            if (oneofFieldCase_ == OneofFieldOneofCase.StructField) {
              subBuilder.MergeFrom(StructField);
            }
            input.ReadMessage(subBuilder);
            StructField = subBuilder;
            break;
          }
          case 66: {
            global::Google.Protobuf.WellKnownTypes.Timestamp subBuilder = new global::Google.Protobuf.WellKnownTypes.Timestamp();
            if (oneofFieldCase_ == OneofFieldOneofCase.TimestampField) {
              subBuilder.MergeFrom(TimestampField);
            }
            input.ReadMessage(subBuilder);
            TimestampField = subBuilder;
            break;
          }
          case 74: {
            global::Google.Protobuf.WellKnownTypes.Type subBuilder = new global::Google.Protobuf.WellKnownTypes.Type();
            if (oneofFieldCase_ == OneofFieldOneofCase.TypeField) {
              subBuilder.MergeFrom(TypeField);
            }
            input.ReadMessage(subBuilder);
            TypeField = subBuilder;
            break;
          }
          case 82: {
            DoubleField = _oneof_doubleField_codec.Read(input);
            break;
          }
          case 90: {
            FloatField = _oneof_floatField_codec.Read(input);
            break;
          }
          case 98: {
            Int64Field = _oneof_int64Field_codec.Read(input);
            break;
          }
          case 106: {
            Uint64Field = _oneof_uint64Field_codec.Read(input);
            break;
          }
          case 114: {
            Int32Field = _oneof_int32Field_codec.Read(input);
            break;
          }
          case 122: {
            Uint32Field = _oneof_uint32Field_codec.Read(input);
            break;
          }
          case 130: {
            BoolField = _oneof_boolField_codec.Read(input);
            break;
          }
          case 138: {
            StringField = _oneof_stringField_codec.Read(input);
            break;
          }
          case 146: {
            BytesField = _oneof_bytesField_codec.Read(input);
            break;
          }
        }
      }
    #endif
    }

    #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE
    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    void pb::IBufferMessage.InternalMergeFrom(ref pb::ParseContext input) {
      uint tag;
      while ((tag = input.ReadTag()) != 0) {
        switch(tag) {
          default:
            _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, ref input);
            break;
          case 10: {
            global::Google.Protobuf.WellKnownTypes.Any subBuilder = new global::Google.Protobuf.WellKnownTypes.Any();
            if (oneofFieldCase_ == OneofFieldOneofCase.AnyField) {
              subBuilder.MergeFrom(AnyField);
            }
            input.ReadMessage(subBuilder);
            AnyField = subBuilder;
            break;
          }
          case 18: {
            global::Google.Protobuf.WellKnownTypes.Api subBuilder = new global::Google.Protobuf.WellKnownTypes.Api();
            if (oneofFieldCase_ == OneofFieldOneofCase.ApiField) {
              subBuilder.MergeFrom(ApiField);
            }
            input.ReadMessage(subBuilder);
            ApiField = subBuilder;
            break;
          }
          case 26: {
            global::Google.Protobuf.WellKnownTypes.Duration subBuilder = new global::Google.Protobuf.WellKnownTypes.Duration();
            if (oneofFieldCase_ == OneofFieldOneofCase.DurationField) {
              subBuilder.MergeFrom(DurationField);
            }
            input.ReadMessage(subBuilder);
            DurationField = subBuilder;
            break;
          }
          case 34: {
            global::Google.Protobuf.WellKnownTypes.Empty subBuilder = new global::Google.Protobuf.WellKnownTypes.Empty();
            if (oneofFieldCase_ == OneofFieldOneofCase.EmptyField) {
              subBuilder.MergeFrom(EmptyField);
            }
            input.ReadMessage(subBuilder);
            EmptyField = subBuilder;
            break;
          }
          case 42: {
            global::Google.Protobuf.WellKnownTypes.FieldMask subBuilder = new global::Google.Protobuf.WellKnownTypes.FieldMask();
            if (oneofFieldCase_ == OneofFieldOneofCase.FieldMaskField) {
              subBuilder.MergeFrom(FieldMaskField);
            }
            input.ReadMessage(subBuilder);
            FieldMaskField = subBuilder;
            break;
          }
          case 50: {
            global::Google.Protobuf.WellKnownTypes.SourceContext subBuilder = new global::Google.Protobuf.WellKnownTypes.SourceContext();
            if (oneofFieldCase_ == OneofFieldOneofCase.SourceContextField) {
              subBuilder.MergeFrom(SourceContextField);
            }
            input.ReadMessage(subBuilder);
            SourceContextField = subBuilder;
            break;
          }
          case 58: {
            global::Google.Protobuf.WellKnownTypes.Struct subBuilder = new global::Google.Protobuf.WellKnownTypes.Struct();
            if (oneofFieldCase_ == OneofFieldOneofCase.StructField) {
              subBuilder.MergeFrom(StructField);
            }
            input.ReadMessage(subBuilder);
            StructField = subBuilder;
            break;
          }
          case 66: {
            global::Google.Protobuf.WellKnownTypes.Timestamp subBuilder = new global::Google.Protobuf.WellKnownTypes.Timestamp();
            if (oneofFieldCase_ == OneofFieldOneofCase.TimestampField) {
              subBuilder.MergeFrom(TimestampField);
            }
            input.ReadMessage(subBuilder);
            TimestampField = subBuilder;
            break;
          }
          case 74: {
            global::Google.Protobuf.WellKnownTypes.Type subBuilder = new global::Google.Protobuf.WellKnownTypes.Type();
            if (oneofFieldCase_ == OneofFieldOneofCase.TypeField) {
              subBuilder.MergeFrom(TypeField);
            }
            input.ReadMessage(subBuilder);
            TypeField = subBuilder;
            break;
          }
          case 82: {
            DoubleField = _oneof_doubleField_codec.Read(ref input);
            break;
          }
          case 90: {
            FloatField = _oneof_floatField_codec.Read(ref input);
            break;
          }
          case 98: {
            Int64Field = _oneof_int64Field_codec.Read(ref input);
            break;
          }
          case 106: {
            Uint64Field = _oneof_uint64Field_codec.Read(ref input);
            break;
          }
          case 114: {
            Int32Field = _oneof_int32Field_codec.Read(ref input);
            break;
          }
          case 122: {
            Uint32Field = _oneof_uint32Field_codec.Read(ref input);
            break;
          }
          case 130: {
            BoolField = _oneof_boolField_codec.Read(ref input);
            break;
          }
          case 138: {
            StringField = _oneof_stringField_codec.Read(ref input);
            break;
          }
          case 146: {
            BytesField = _oneof_bytesField_codec.Read(ref input);
            break;
          }
        }
      }
    }
    #endif

  }

  /// <summary>
  /// A map field for each well-known type. We only
  /// need to worry about the value part of the map being the
  /// well-known types, as messages can't be map keys.
  /// </summary>
  public sealed partial class MapWellKnownTypes : pb::IMessage<MapWellKnownTypes>
  #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE
      , pb::IBufferMessage
  #endif
  {
    private static readonly pb::MessageParser<MapWellKnownTypes> _parser = new pb::MessageParser<MapWellKnownTypes>(() => new MapWellKnownTypes());
    private pb::UnknownFieldSet _unknownFields;
    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    public static pb::MessageParser<MapWellKnownTypes> Parser { get { return _parser; } }

    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    public static pbr::MessageDescriptor Descriptor {
      get { return global::Google.Protobuf.TestProtos.UnittestWellKnownTypesReflection.Descriptor.MessageTypes[3]; }
    }

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

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

    partial void OnConstruction();

    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    public MapWellKnownTypes(MapWellKnownTypes other) : this() {
      anyField_ = other.anyField_.Clone();
      apiField_ = other.apiField_.Clone();
      durationField_ = other.durationField_.Clone();
      emptyField_ = other.emptyField_.Clone();
      fieldMaskField_ = other.fieldMaskField_.Clone();
      sourceContextField_ = other.sourceContextField_.Clone();
      structField_ = other.structField_.Clone();
      timestampField_ = other.timestampField_.Clone();
      typeField_ = other.typeField_.Clone();
      doubleField_ = other.doubleField_.Clone();
      floatField_ = other.floatField_.Clone();
      int64Field_ = other.int64Field_.Clone();
      uint64Field_ = other.uint64Field_.Clone();
      int32Field_ = other.int32Field_.Clone();
      uint32Field_ = other.uint32Field_.Clone();
      boolField_ = other.boolField_.Clone();
      stringField_ = other.stringField_.Clone();
      bytesField_ = other.bytesField_.Clone();
      _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields);
    }

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

    /// <summary>Field number for the "any_field" field.</summary>
    public const int AnyFieldFieldNumber = 1;
    private static readonly pbc::MapField<int, global::Google.Protobuf.WellKnownTypes.Any>.Codec _map_anyField_codec
        = new pbc::MapField<int, global::Google.Protobuf.WellKnownTypes.Any>.Codec(pb::FieldCodec.ForInt32(8, 0), pb::FieldCodec.ForMessage(18, global::Google.Protobuf.WellKnownTypes.Any.Parser), 10);
    private readonly pbc::MapField<int, global::Google.Protobuf.WellKnownTypes.Any> anyField_ = new pbc::MapField<int, global::Google.Protobuf.WellKnownTypes.Any>();
    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    public pbc::MapField<int, global::Google.Protobuf.WellKnownTypes.Any> AnyField {
      get { return anyField_; }
    }

    /// <summary>Field number for the "api_field" field.</summary>
    public const int ApiFieldFieldNumber = 2;
    private static readonly pbc::MapField<int, global::Google.Protobuf.WellKnownTypes.Api>.Codec _map_apiField_codec
        = new pbc::MapField<int, global::Google.Protobuf.WellKnownTypes.Api>.Codec(pb::FieldCodec.ForInt32(8, 0), pb::FieldCodec.ForMessage(18, global::Google.Protobuf.WellKnownTypes.Api.Parser), 18);
    private readonly pbc::MapField<int, global::Google.Protobuf.WellKnownTypes.Api> apiField_ = new pbc::MapField<int, global::Google.Protobuf.WellKnownTypes.Api>();
    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    public pbc::MapField<int, global::Google.Protobuf.WellKnownTypes.Api> ApiField {
      get { return apiField_; }
    }

    /// <summary>Field number for the "duration_field" field.</summary>
    public const int DurationFieldFieldNumber = 3;
    private static readonly pbc::MapField<int, global::Google.Protobuf.WellKnownTypes.Duration>.Codec _map_durationField_codec
        = new pbc::MapField<int, global::Google.Protobuf.WellKnownTypes.Duration>.Codec(pb::FieldCodec.ForInt32(8, 0), pb::FieldCodec.ForMessage(18, global::Google.Protobuf.WellKnownTypes.Duration.Parser), 26);
    private readonly pbc::MapField<int, global::Google.Protobuf.WellKnownTypes.Duration> durationField_ = new pbc::MapField<int, global::Google.Protobuf.WellKnownTypes.Duration>();
    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    public pbc::MapField<int, global::Google.Protobuf.WellKnownTypes.Duration> DurationField {
      get { return durationField_; }
    }

    /// <summary>Field number for the "empty_field" field.</summary>
    public const int EmptyFieldFieldNumber = 4;
    private static readonly pbc::MapField<int, global::Google.Protobuf.WellKnownTypes.Empty>.Codec _map_emptyField_codec
        = new pbc::MapField<int, global::Google.Protobuf.WellKnownTypes.Empty>.Codec(pb::FieldCodec.ForInt32(8, 0), pb::FieldCodec.ForMessage(18, global::Google.Protobuf.WellKnownTypes.Empty.Parser), 34);
    private readonly pbc::MapField<int, global::Google.Protobuf.WellKnownTypes.Empty> emptyField_ = new pbc::MapField<int, global::Google.Protobuf.WellKnownTypes.Empty>();
    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    public pbc::MapField<int, global::Google.Protobuf.WellKnownTypes.Empty> EmptyField {
      get { return emptyField_; }
    }

    /// <summary>Field number for the "field_mask_field" field.</summary>
    public const int FieldMaskFieldFieldNumber = 5;
    private static readonly pbc::MapField<int, global::Google.Protobuf.WellKnownTypes.FieldMask>.Codec _map_fieldMaskField_codec
        = new pbc::MapField<int, global::Google.Protobuf.WellKnownTypes.FieldMask>.Codec(pb::FieldCodec.ForInt32(8, 0), pb::FieldCodec.ForMessage(18, global::Google.Protobuf.WellKnownTypes.FieldMask.Parser), 42);
    private readonly pbc::MapField<int, global::Google.Protobuf.WellKnownTypes.FieldMask> fieldMaskField_ = new pbc::MapField<int, global::Google.Protobuf.WellKnownTypes.FieldMask>();
    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    public pbc::MapField<int, global::Google.Protobuf.WellKnownTypes.FieldMask> FieldMaskField {
      get { return fieldMaskField_; }
    }

    /// <summary>Field number for the "source_context_field" field.</summary>
    public const int SourceContextFieldFieldNumber = 6;
    private static readonly pbc::MapField<int, global::Google.Protobuf.WellKnownTypes.SourceContext>.Codec _map_sourceContextField_codec
        = new pbc::MapField<int, global::Google.Protobuf.WellKnownTypes.SourceContext>.Codec(pb::FieldCodec.ForInt32(8, 0), pb::FieldCodec.ForMessage(18, global::Google.Protobuf.WellKnownTypes.SourceContext.Parser), 50);
    private readonly pbc::MapField<int, global::Google.Protobuf.WellKnownTypes.SourceContext> sourceContextField_ = new pbc::MapField<int, global::Google.Protobuf.WellKnownTypes.SourceContext>();
    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    public pbc::MapField<int, global::Google.Protobuf.WellKnownTypes.SourceContext> SourceContextField {
      get { return sourceContextField_; }
    }

    /// <summary>Field number for the "struct_field" field.</summary>
    public const int StructFieldFieldNumber = 7;
    private static readonly pbc::MapField<int, global::Google.Protobuf.WellKnownTypes.Struct>.Codec _map_structField_codec
        = new pbc::MapField<int, global::Google.Protobuf.WellKnownTypes.Struct>.Codec(pb::FieldCodec.ForInt32(8, 0), pb::FieldCodec.ForMessage(18, global::Google.Protobuf.WellKnownTypes.Struct.Parser), 58);
    private readonly pbc::MapField<int, global::Google.Protobuf.WellKnownTypes.Struct> structField_ = new pbc::MapField<int, global::Google.Protobuf.WellKnownTypes.Struct>();
    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    public pbc::MapField<int, global::Google.Protobuf.WellKnownTypes.Struct> StructField {
      get { return structField_; }
    }

    /// <summary>Field number for the "timestamp_field" field.</summary>
    public const int TimestampFieldFieldNumber = 8;
    private static readonly pbc::MapField<int, global::Google.Protobuf.WellKnownTypes.Timestamp>.Codec _map_timestampField_codec
        = new pbc::MapField<int, global::Google.Protobuf.WellKnownTypes.Timestamp>.Codec(pb::FieldCodec.ForInt32(8, 0), pb::FieldCodec.ForMessage(18, global::Google.Protobuf.WellKnownTypes.Timestamp.Parser), 66);
    private readonly pbc::MapField<int, global::Google.Protobuf.WellKnownTypes.Timestamp> timestampField_ = new pbc::MapField<int, global::Google.Protobuf.WellKnownTypes.Timestamp>();
    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    public pbc::MapField<int, global::Google.Protobuf.WellKnownTypes.Timestamp> TimestampField {
      get { return timestampField_; }
    }

    /// <summary>Field number for the "type_field" field.</summary>
    public const int TypeFieldFieldNumber = 9;
    private static readonly pbc::MapField<int, global::Google.Protobuf.WellKnownTypes.Type>.Codec _map_typeField_codec
        = new pbc::MapField<int, global::Google.Protobuf.WellKnownTypes.Type>.Codec(pb::FieldCodec.ForInt32(8, 0), pb::FieldCodec.ForMessage(18, global::Google.Protobuf.WellKnownTypes.Type.Parser), 74);
    private readonly pbc::MapField<int, global::Google.Protobuf.WellKnownTypes.Type> typeField_ = new pbc::MapField<int, global::Google.Protobuf.WellKnownTypes.Type>();
    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    public pbc::MapField<int, global::Google.Protobuf.WellKnownTypes.Type> TypeField {
      get { return typeField_; }
    }

    /// <summary>Field number for the "double_field" field.</summary>
    public const int DoubleFieldFieldNumber = 10;
    private static readonly pbc::MapField<int, double?>.Codec _map_doubleField_codec
        = new pbc::MapField<int, double?>.Codec(pb::FieldCodec.ForInt32(8, 0), pb::FieldCodec.ForStructWrapper<double>(18), 82);
    private readonly pbc::MapField<int, double?> doubleField_ = new pbc::MapField<int, double?>();
    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    public pbc::MapField<int, double?> DoubleField {
      get { return doubleField_; }
    }

    /// <summary>Field number for the "float_field" field.</summary>
    public const int FloatFieldFieldNumber = 11;
    private static readonly pbc::MapField<int, float?>.Codec _map_floatField_codec
        = new pbc::MapField<int, float?>.Codec(pb::FieldCodec.ForInt32(8, 0), pb::FieldCodec.ForStructWrapper<float>(18), 90);
    private readonly pbc::MapField<int, float?> floatField_ = new pbc::MapField<int, float?>();
    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    public pbc::MapField<int, float?> FloatField {
      get { return floatField_; }
    }

    /// <summary>Field number for the "int64_field" field.</summary>
    public const int Int64FieldFieldNumber = 12;
    private static readonly pbc::MapField<int, long?>.Codec _map_int64Field_codec
        = new pbc::MapField<int, long?>.Codec(pb::FieldCodec.ForInt32(8, 0), pb::FieldCodec.ForStructWrapper<long>(18), 98);
    private readonly pbc::MapField<int, long?> int64Field_ = new pbc::MapField<int, long?>();
    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    public pbc::MapField<int, long?> Int64Field {
      get { return int64Field_; }
    }

    /// <summary>Field number for the "uint64_field" field.</summary>
    public const int Uint64FieldFieldNumber = 13;
    private static readonly pbc::MapField<int, ulong?>.Codec _map_uint64Field_codec
        = new pbc::MapField<int, ulong?>.Codec(pb::FieldCodec.ForInt32(8, 0), pb::FieldCodec.ForStructWrapper<ulong>(18), 106);
    private readonly pbc::MapField<int, ulong?> uint64Field_ = new pbc::MapField<int, ulong?>();
    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    public pbc::MapField<int, ulong?> Uint64Field {
      get { return uint64Field_; }
    }

    /// <summary>Field number for the "int32_field" field.</summary>
    public const int Int32FieldFieldNumber = 14;
    private static readonly pbc::MapField<int, int?>.Codec _map_int32Field_codec
        = new pbc::MapField<int, int?>.Codec(pb::FieldCodec.ForInt32(8, 0), pb::FieldCodec.ForStructWrapper<int>(18), 114);
    private readonly pbc::MapField<int, int?> int32Field_ = new pbc::MapField<int, int?>();
    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    public pbc::MapField<int, int?> Int32Field {
      get { return int32Field_; }
    }

    /// <summary>Field number for the "uint32_field" field.</summary>
    public const int Uint32FieldFieldNumber = 15;
    private static readonly pbc::MapField<int, uint?>.Codec _map_uint32Field_codec
        = new pbc::MapField<int, uint?>.Codec(pb::FieldCodec.ForInt32(8, 0), pb::FieldCodec.ForStructWrapper<uint>(18), 122);
    private readonly pbc::MapField<int, uint?> uint32Field_ = new pbc::MapField<int, uint?>();
    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    public pbc::MapField<int, uint?> Uint32Field {
      get { return uint32Field_; }
    }

    /// <summary>Field number for the "bool_field" field.</summary>
    public const int BoolFieldFieldNumber = 16;
    private static readonly pbc::MapField<int, bool?>.Codec _map_boolField_codec
        = new pbc::MapField<int, bool?>.Codec(pb::FieldCodec.ForInt32(8, 0), pb::FieldCodec.ForStructWrapper<bool>(18), 130);
    private readonly pbc::MapField<int, bool?> boolField_ = new pbc::MapField<int, bool?>();
    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    public pbc::MapField<int, bool?> BoolField {
      get { return boolField_; }
    }

    /// <summary>Field number for the "string_field" field.</summary>
    public const int StringFieldFieldNumber = 17;
    private static readonly pbc::MapField<int, string>.Codec _map_stringField_codec
        = new pbc::MapField<int, string>.Codec(pb::FieldCodec.ForInt32(8, 0), pb::FieldCodec.ForClassWrapper<string>(18), 138);
    private readonly pbc::MapField<int, string> stringField_ = new pbc::MapField<int, string>();
    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    public pbc::MapField<int, string> StringField {
      get { return stringField_; }
    }

    /// <summary>Field number for the "bytes_field" field.</summary>
    public const int BytesFieldFieldNumber = 18;
    private static readonly pbc::MapField<int, pb::ByteString>.Codec _map_bytesField_codec
        = new pbc::MapField<int, pb::ByteString>.Codec(pb::FieldCodec.ForInt32(8, 0), pb::FieldCodec.ForClassWrapper<pb::ByteString>(18), 146);
    private readonly pbc::MapField<int, pb::ByteString> bytesField_ = new pbc::MapField<int, pb::ByteString>();
    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    public pbc::MapField<int, pb::ByteString> BytesField {
      get { return bytesField_; }
    }

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

    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    public bool Equals(MapWellKnownTypes other) {
      if (ReferenceEquals(other, null)) {
        return false;
      }
      if (ReferenceEquals(other, this)) {
        return true;
      }
      if (!AnyField.Equals(other.AnyField)) return false;
      if (!ApiField.Equals(other.ApiField)) return false;
      if (!DurationField.Equals(other.DurationField)) return false;
      if (!EmptyField.Equals(other.EmptyField)) return false;
      if (!FieldMaskField.Equals(other.FieldMaskField)) return false;
      if (!SourceContextField.Equals(other.SourceContextField)) return false;
      if (!StructField.Equals(other.StructField)) return false;
      if (!TimestampField.Equals(other.TimestampField)) return false;
      if (!TypeField.Equals(other.TypeField)) return false;
      if (!DoubleField.Equals(other.DoubleField)) return false;
      if (!FloatField.Equals(other.FloatField)) return false;
      if (!Int64Field.Equals(other.Int64Field)) return false;
      if (!Uint64Field.Equals(other.Uint64Field)) return false;
      if (!Int32Field.Equals(other.Int32Field)) return false;
      if (!Uint32Field.Equals(other.Uint32Field)) return false;
      if (!BoolField.Equals(other.BoolField)) return false;
      if (!StringField.Equals(other.StringField)) return false;
      if (!BytesField.Equals(other.BytesField)) return false;
      return Equals(_unknownFields, other._unknownFields);
    }

    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    public override int GetHashCode() {
      int hash = 1;
      hash ^= AnyField.GetHashCode();
      hash ^= ApiField.GetHashCode();
      hash ^= DurationField.GetHashCode();
      hash ^= EmptyField.GetHashCode();
      hash ^= FieldMaskField.GetHashCode();
      hash ^= SourceContextField.GetHashCode();
      hash ^= StructField.GetHashCode();
      hash ^= TimestampField.GetHashCode();
      hash ^= TypeField.GetHashCode();
      hash ^= DoubleField.GetHashCode();
      hash ^= FloatField.GetHashCode();
      hash ^= Int64Field.GetHashCode();
      hash ^= Uint64Field.GetHashCode();
      hash ^= Int32Field.GetHashCode();
      hash ^= Uint32Field.GetHashCode();
      hash ^= BoolField.GetHashCode();
      hash ^= StringField.GetHashCode();
      hash ^= BytesField.GetHashCode();
      if (_unknownFields != null) {
        hash ^= _unknownFields.GetHashCode();
      }
      return hash;
    }

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

    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    public void WriteTo(pb::CodedOutputStream output) {
    #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE
      output.WriteRawMessage(this);
    #else
      anyField_.WriteTo(output, _map_anyField_codec);
      apiField_.WriteTo(output, _map_apiField_codec);
      durationField_.WriteTo(output, _map_durationField_codec);
      emptyField_.WriteTo(output, _map_emptyField_codec);
      fieldMaskField_.WriteTo(output, _map_fieldMaskField_codec);
      sourceContextField_.WriteTo(output, _map_sourceContextField_codec);
      structField_.WriteTo(output, _map_structField_codec);
      timestampField_.WriteTo(output, _map_timestampField_codec);
      typeField_.WriteTo(output, _map_typeField_codec);
      doubleField_.WriteTo(output, _map_doubleField_codec);
      floatField_.WriteTo(output, _map_floatField_codec);
      int64Field_.WriteTo(output, _map_int64Field_codec);
      uint64Field_.WriteTo(output, _map_uint64Field_codec);
      int32Field_.WriteTo(output, _map_int32Field_codec);
      uint32Field_.WriteTo(output, _map_uint32Field_codec);
      boolField_.WriteTo(output, _map_boolField_codec);
      stringField_.WriteTo(output, _map_stringField_codec);
      bytesField_.WriteTo(output, _map_bytesField_codec);
      if (_unknownFields != null) {
        _unknownFields.WriteTo(output);
      }
    #endif
    }

    #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE
    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    void pb::IBufferMessage.InternalWriteTo(ref pb::WriteContext output) {
      anyField_.WriteTo(ref output, _map_anyField_codec);
      apiField_.WriteTo(ref output, _map_apiField_codec);
      durationField_.WriteTo(ref output, _map_durationField_codec);
      emptyField_.WriteTo(ref output, _map_emptyField_codec);
      fieldMaskField_.WriteTo(ref output, _map_fieldMaskField_codec);
      sourceContextField_.WriteTo(ref output, _map_sourceContextField_codec);
      structField_.WriteTo(ref output, _map_structField_codec);
      timestampField_.WriteTo(ref output, _map_timestampField_codec);
      typeField_.WriteTo(ref output, _map_typeField_codec);
      doubleField_.WriteTo(ref output, _map_doubleField_codec);
      floatField_.WriteTo(ref output, _map_floatField_codec);
      int64Field_.WriteTo(ref output, _map_int64Field_codec);
      uint64Field_.WriteTo(ref output, _map_uint64Field_codec);
      int32Field_.WriteTo(ref output, _map_int32Field_codec);
      uint32Field_.WriteTo(ref output, _map_uint32Field_codec);
      boolField_.WriteTo(ref output, _map_boolField_codec);
      stringField_.WriteTo(ref output, _map_stringField_codec);
      bytesField_.WriteTo(ref output, _map_bytesField_codec);
      if (_unknownFields != null) {
        _unknownFields.WriteTo(ref output);
      }
    }
    #endif

    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    public int CalculateSize() {
      int size = 0;
      size += anyField_.CalculateSize(_map_anyField_codec);
      size += apiField_.CalculateSize(_map_apiField_codec);
      size += durationField_.CalculateSize(_map_durationField_codec);
      size += emptyField_.CalculateSize(_map_emptyField_codec);
      size += fieldMaskField_.CalculateSize(_map_fieldMaskField_codec);
      size += sourceContextField_.CalculateSize(_map_sourceContextField_codec);
      size += structField_.CalculateSize(_map_structField_codec);
      size += timestampField_.CalculateSize(_map_timestampField_codec);
      size += typeField_.CalculateSize(_map_typeField_codec);
      size += doubleField_.CalculateSize(_map_doubleField_codec);
      size += floatField_.CalculateSize(_map_floatField_codec);
      size += int64Field_.CalculateSize(_map_int64Field_codec);
      size += uint64Field_.CalculateSize(_map_uint64Field_codec);
      size += int32Field_.CalculateSize(_map_int32Field_codec);
      size += uint32Field_.CalculateSize(_map_uint32Field_codec);
      size += boolField_.CalculateSize(_map_boolField_codec);
      size += stringField_.CalculateSize(_map_stringField_codec);
      size += bytesField_.CalculateSize(_map_bytesField_codec);
      if (_unknownFields != null) {
        size += _unknownFields.CalculateSize();
      }
      return size;
    }

    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    public void MergeFrom(MapWellKnownTypes other) {
      if (other == null) {
        return;
      }
      anyField_.MergeFrom(other.anyField_);
      apiField_.MergeFrom(other.apiField_);
      durationField_.MergeFrom(other.durationField_);
      emptyField_.MergeFrom(other.emptyField_);
      fieldMaskField_.MergeFrom(other.fieldMaskField_);
      sourceContextField_.MergeFrom(other.sourceContextField_);
      structField_.MergeFrom(other.structField_);
      timestampField_.MergeFrom(other.timestampField_);
      typeField_.MergeFrom(other.typeField_);
      doubleField_.MergeFrom(other.doubleField_);
      floatField_.MergeFrom(other.floatField_);
      int64Field_.MergeFrom(other.int64Field_);
      uint64Field_.MergeFrom(other.uint64Field_);
      int32Field_.MergeFrom(other.int32Field_);
      uint32Field_.MergeFrom(other.uint32Field_);
      boolField_.MergeFrom(other.boolField_);
      stringField_.MergeFrom(other.stringField_);
      bytesField_.MergeFrom(other.bytesField_);
      _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields);
    }

    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    public void MergeFrom(pb::CodedInputStream input) {
    #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE
      input.ReadRawMessage(this);
    #else
      uint tag;
      while ((tag = input.ReadTag()) != 0) {
        switch(tag) {
          default:
            _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input);
            break;
          case 10: {
            anyField_.AddEntriesFrom(input, _map_anyField_codec);
            break;
          }
          case 18: {
            apiField_.AddEntriesFrom(input, _map_apiField_codec);
            break;
          }
          case 26: {
            durationField_.AddEntriesFrom(input, _map_durationField_codec);
            break;
          }
          case 34: {
            emptyField_.AddEntriesFrom(input, _map_emptyField_codec);
            break;
          }
          case 42: {
            fieldMaskField_.AddEntriesFrom(input, _map_fieldMaskField_codec);
            break;
          }
          case 50: {
            sourceContextField_.AddEntriesFrom(input, _map_sourceContextField_codec);
            break;
          }
          case 58: {
            structField_.AddEntriesFrom(input, _map_structField_codec);
            break;
          }
          case 66: {
            timestampField_.AddEntriesFrom(input, _map_timestampField_codec);
            break;
          }
          case 74: {
            typeField_.AddEntriesFrom(input, _map_typeField_codec);
            break;
          }
          case 82: {
            doubleField_.AddEntriesFrom(input, _map_doubleField_codec);
            break;
          }
          case 90: {
            floatField_.AddEntriesFrom(input, _map_floatField_codec);
            break;
          }
          case 98: {
            int64Field_.AddEntriesFrom(input, _map_int64Field_codec);
            break;
          }
          case 106: {
            uint64Field_.AddEntriesFrom(input, _map_uint64Field_codec);
            break;
          }
          case 114: {
            int32Field_.AddEntriesFrom(input, _map_int32Field_codec);
            break;
          }
          case 122: {
            uint32Field_.AddEntriesFrom(input, _map_uint32Field_codec);
            break;
          }
          case 130: {
            boolField_.AddEntriesFrom(input, _map_boolField_codec);
            break;
          }
          case 138: {
            stringField_.AddEntriesFrom(input, _map_stringField_codec);
            break;
          }
          case 146: {
            bytesField_.AddEntriesFrom(input, _map_bytesField_codec);
            break;
          }
        }
      }
    #endif
    }

    #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE
    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    void pb::IBufferMessage.InternalMergeFrom(ref pb::ParseContext input) {
      uint tag;
      while ((tag = input.ReadTag()) != 0) {
        switch(tag) {
          default:
            _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, ref input);
            break;
          case 10: {
            anyField_.AddEntriesFrom(ref input, _map_anyField_codec);
            break;
          }
          case 18: {
            apiField_.AddEntriesFrom(ref input, _map_apiField_codec);
            break;
          }
          case 26: {
            durationField_.AddEntriesFrom(ref input, _map_durationField_codec);
            break;
          }
          case 34: {
            emptyField_.AddEntriesFrom(ref input, _map_emptyField_codec);
            break;
          }
          case 42: {
            fieldMaskField_.AddEntriesFrom(ref input, _map_fieldMaskField_codec);
            break;
          }
          case 50: {
            sourceContextField_.AddEntriesFrom(ref input, _map_sourceContextField_codec);
            break;
          }
          case 58: {
            structField_.AddEntriesFrom(ref input, _map_structField_codec);
            break;
          }
          case 66: {
            timestampField_.AddEntriesFrom(ref input, _map_timestampField_codec);
            break;
          }
          case 74: {
            typeField_.AddEntriesFrom(ref input, _map_typeField_codec);
            break;
          }
          case 82: {
            doubleField_.AddEntriesFrom(ref input, _map_doubleField_codec);
            break;
          }
          case 90: {
            floatField_.AddEntriesFrom(ref input, _map_floatField_codec);
            break;
          }
          case 98: {
            int64Field_.AddEntriesFrom(ref input, _map_int64Field_codec);
            break;
          }
          case 106: {
            uint64Field_.AddEntriesFrom(ref input, _map_uint64Field_codec);
            break;
          }
          case 114: {
            int32Field_.AddEntriesFrom(ref input, _map_int32Field_codec);
            break;
          }
          case 122: {
            uint32Field_.AddEntriesFrom(ref input, _map_uint32Field_codec);
            break;
          }
          case 130: {
            boolField_.AddEntriesFrom(ref input, _map_boolField_codec);
            break;
          }
          case 138: {
            stringField_.AddEntriesFrom(ref input, _map_stringField_codec);
            break;
          }
          case 146: {
            bytesField_.AddEntriesFrom(ref input, _map_bytesField_codec);
            break;
          }
        }
      }
    }
    #endif

  }

  #endregion

}

#endregion Designer generated code
