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

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

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

    #region Static variables
    internal static pb::FieldAccess.FieldAccessorTable internal__static_protobuf_unittest_TestMap__FieldAccessorTable;
    internal static pb::FieldAccess.FieldAccessorTable internal__static_protobuf_unittest_TestMap_MapInt32Int32Entry__FieldAccessorTable;
    internal static pb::FieldAccess.FieldAccessorTable internal__static_protobuf_unittest_TestMap_MapInt64Int64Entry__FieldAccessorTable;
    internal static pb::FieldAccess.FieldAccessorTable internal__static_protobuf_unittest_TestMap_MapUint32Uint32Entry__FieldAccessorTable;
    internal static pb::FieldAccess.FieldAccessorTable internal__static_protobuf_unittest_TestMap_MapUint64Uint64Entry__FieldAccessorTable;
    internal static pb::FieldAccess.FieldAccessorTable internal__static_protobuf_unittest_TestMap_MapSint32Sint32Entry__FieldAccessorTable;
    internal static pb::FieldAccess.FieldAccessorTable internal__static_protobuf_unittest_TestMap_MapSint64Sint64Entry__FieldAccessorTable;
    internal static pb::FieldAccess.FieldAccessorTable internal__static_protobuf_unittest_TestMap_MapFixed32Fixed32Entry__FieldAccessorTable;
    internal static pb::FieldAccess.FieldAccessorTable internal__static_protobuf_unittest_TestMap_MapFixed64Fixed64Entry__FieldAccessorTable;
    internal static pb::FieldAccess.FieldAccessorTable internal__static_protobuf_unittest_TestMap_MapSfixed32Sfixed32Entry__FieldAccessorTable;
    internal static pb::FieldAccess.FieldAccessorTable internal__static_protobuf_unittest_TestMap_MapSfixed64Sfixed64Entry__FieldAccessorTable;
    internal static pb::FieldAccess.FieldAccessorTable internal__static_protobuf_unittest_TestMap_MapInt32FloatEntry__FieldAccessorTable;
    internal static pb::FieldAccess.FieldAccessorTable internal__static_protobuf_unittest_TestMap_MapInt32DoubleEntry__FieldAccessorTable;
    internal static pb::FieldAccess.FieldAccessorTable internal__static_protobuf_unittest_TestMap_MapBoolBoolEntry__FieldAccessorTable;
    internal static pb::FieldAccess.FieldAccessorTable internal__static_protobuf_unittest_TestMap_MapStringStringEntry__FieldAccessorTable;
    internal static pb::FieldAccess.FieldAccessorTable internal__static_protobuf_unittest_TestMap_MapInt32BytesEntry__FieldAccessorTable;
    internal static pb::FieldAccess.FieldAccessorTable internal__static_protobuf_unittest_TestMap_MapInt32EnumEntry__FieldAccessorTable;
    internal static pb::FieldAccess.FieldAccessorTable internal__static_protobuf_unittest_TestMap_MapInt32ForeignMessageEntry__FieldAccessorTable;
    internal static pb::FieldAccess.FieldAccessorTable internal__static_protobuf_unittest_TestMapSubmessage__FieldAccessorTable;
    internal static pb::FieldAccess.FieldAccessorTable internal__static_protobuf_unittest_TestMessageMap__FieldAccessorTable;
    internal static pb::FieldAccess.FieldAccessorTable internal__static_protobuf_unittest_TestMessageMap_MapInt32MessageEntry__FieldAccessorTable;
    internal static pb::FieldAccess.FieldAccessorTable internal__static_protobuf_unittest_TestSameTypeMap__FieldAccessorTable;
    internal static pb::FieldAccess.FieldAccessorTable internal__static_protobuf_unittest_TestSameTypeMap_Map1Entry__FieldAccessorTable;
    internal static pb::FieldAccess.FieldAccessorTable internal__static_protobuf_unittest_TestSameTypeMap_Map2Entry__FieldAccessorTable;
    internal static pb::FieldAccess.FieldAccessorTable internal__static_protobuf_unittest_TestArenaMap__FieldAccessorTable;
    internal static pb::FieldAccess.FieldAccessorTable internal__static_protobuf_unittest_TestArenaMap_MapInt32Int32Entry__FieldAccessorTable;
    internal static pb::FieldAccess.FieldAccessorTable internal__static_protobuf_unittest_TestArenaMap_MapInt64Int64Entry__FieldAccessorTable;
    internal static pb::FieldAccess.FieldAccessorTable internal__static_protobuf_unittest_TestArenaMap_MapUint32Uint32Entry__FieldAccessorTable;
    internal static pb::FieldAccess.FieldAccessorTable internal__static_protobuf_unittest_TestArenaMap_MapUint64Uint64Entry__FieldAccessorTable;
    internal static pb::FieldAccess.FieldAccessorTable internal__static_protobuf_unittest_TestArenaMap_MapSint32Sint32Entry__FieldAccessorTable;
    internal static pb::FieldAccess.FieldAccessorTable internal__static_protobuf_unittest_TestArenaMap_MapSint64Sint64Entry__FieldAccessorTable;
    internal static pb::FieldAccess.FieldAccessorTable internal__static_protobuf_unittest_TestArenaMap_MapFixed32Fixed32Entry__FieldAccessorTable;
    internal static pb::FieldAccess.FieldAccessorTable internal__static_protobuf_unittest_TestArenaMap_MapFixed64Fixed64Entry__FieldAccessorTable;
    internal static pb::FieldAccess.FieldAccessorTable internal__static_protobuf_unittest_TestArenaMap_MapSfixed32Sfixed32Entry__FieldAccessorTable;
    internal static pb::FieldAccess.FieldAccessorTable internal__static_protobuf_unittest_TestArenaMap_MapSfixed64Sfixed64Entry__FieldAccessorTable;
    internal static pb::FieldAccess.FieldAccessorTable internal__static_protobuf_unittest_TestArenaMap_MapInt32FloatEntry__FieldAccessorTable;
    internal static pb::FieldAccess.FieldAccessorTable internal__static_protobuf_unittest_TestArenaMap_MapInt32DoubleEntry__FieldAccessorTable;
    internal static pb::FieldAccess.FieldAccessorTable internal__static_protobuf_unittest_TestArenaMap_MapBoolBoolEntry__FieldAccessorTable;
    internal static pb::FieldAccess.FieldAccessorTable internal__static_protobuf_unittest_TestArenaMap_MapInt32EnumEntry__FieldAccessorTable;
    internal static pb::FieldAccess.FieldAccessorTable internal__static_protobuf_unittest_TestArenaMap_MapInt32ForeignMessageEntry__FieldAccessorTable;
    internal static pb::FieldAccess.FieldAccessorTable internal__static_protobuf_unittest_MessageContainingEnumCalledType__FieldAccessorTable;
    internal static pb::FieldAccess.FieldAccessorTable internal__static_protobuf_unittest_MessageContainingEnumCalledType_TypeEntry__FieldAccessorTable;
    internal static pb::FieldAccess.FieldAccessorTable internal__static_protobuf_unittest_MessageContainingMapCalledEntry__FieldAccessorTable;
    internal static pb::FieldAccess.FieldAccessorTable internal__static_protobuf_unittest_MessageContainingMapCalledEntry_EntryEntry__FieldAccessorTable;
    #endregion
    #region Descriptor
    public static pbd::FileDescriptor Descriptor {
      get { return descriptor; }
    }
    private static pbd::FileDescriptor descriptor;

    static MapUnittestProto3() {
      byte[] descriptorData = global::System.Convert.FromBase64String(
          string.Concat(
            "Cilnb29nbGUvcHJvdG9idWYvbWFwX3VuaXR0ZXN0X3Byb3RvMy5wcm90bxIR", 
            "cHJvdG9idWZfdW5pdHRlc3QaJWdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9w", 
            "cm90bzMucHJvdG8ilhIKB1Rlc3RNYXASRgoPbWFwX2ludDMyX2ludDMyGAEg", 
            "AygLMi0ucHJvdG9idWZfdW5pdHRlc3QuVGVzdE1hcC5NYXBJbnQzMkludDMy", 
            "RW50cnkSRgoPbWFwX2ludDY0X2ludDY0GAIgAygLMi0ucHJvdG9idWZfdW5p", 
            "dHRlc3QuVGVzdE1hcC5NYXBJbnQ2NEludDY0RW50cnkSSgoRbWFwX3VpbnQz", 
            "Ml91aW50MzIYAyADKAsyLy5wcm90b2J1Zl91bml0dGVzdC5UZXN0TWFwLk1h", 
            "cFVpbnQzMlVpbnQzMkVudHJ5EkoKEW1hcF91aW50NjRfdWludDY0GAQgAygL", 
            "Mi8ucHJvdG9idWZfdW5pdHRlc3QuVGVzdE1hcC5NYXBVaW50NjRVaW50NjRF", 
            "bnRyeRJKChFtYXBfc2ludDMyX3NpbnQzMhgFIAMoCzIvLnByb3RvYnVmX3Vu", 
            "aXR0ZXN0LlRlc3RNYXAuTWFwU2ludDMyU2ludDMyRW50cnkSSgoRbWFwX3Np", 
            "bnQ2NF9zaW50NjQYBiADKAsyLy5wcm90b2J1Zl91bml0dGVzdC5UZXN0TWFw", 
            "Lk1hcFNpbnQ2NFNpbnQ2NEVudHJ5Ek4KE21hcF9maXhlZDMyX2ZpeGVkMzIY", 
            "ByADKAsyMS5wcm90b2J1Zl91bml0dGVzdC5UZXN0TWFwLk1hcEZpeGVkMzJG", 
            "aXhlZDMyRW50cnkSTgoTbWFwX2ZpeGVkNjRfZml4ZWQ2NBgIIAMoCzIxLnBy", 
            "b3RvYnVmX3VuaXR0ZXN0LlRlc3RNYXAuTWFwRml4ZWQ2NEZpeGVkNjRFbnRy", 
            "eRJSChVtYXBfc2ZpeGVkMzJfc2ZpeGVkMzIYCSADKAsyMy5wcm90b2J1Zl91", 
            "bml0dGVzdC5UZXN0TWFwLk1hcFNmaXhlZDMyU2ZpeGVkMzJFbnRyeRJSChVt", 
            "YXBfc2ZpeGVkNjRfc2ZpeGVkNjQYCiADKAsyMy5wcm90b2J1Zl91bml0dGVz", 
            "dC5UZXN0TWFwLk1hcFNmaXhlZDY0U2ZpeGVkNjRFbnRyeRJGCg9tYXBfaW50", 
            "MzJfZmxvYXQYCyADKAsyLS5wcm90b2J1Zl91bml0dGVzdC5UZXN0TWFwLk1h", 
            "cEludDMyRmxvYXRFbnRyeRJIChBtYXBfaW50MzJfZG91YmxlGAwgAygLMi4u", 
            "cHJvdG9idWZfdW5pdHRlc3QuVGVzdE1hcC5NYXBJbnQzMkRvdWJsZUVudHJ5", 
            "EkIKDW1hcF9ib29sX2Jvb2wYDSADKAsyKy5wcm90b2J1Zl91bml0dGVzdC5U", 
            "ZXN0TWFwLk1hcEJvb2xCb29sRW50cnkSSgoRbWFwX3N0cmluZ19zdHJpbmcY", 
            "DiADKAsyLy5wcm90b2J1Zl91bml0dGVzdC5UZXN0TWFwLk1hcFN0cmluZ1N0", 
            "cmluZ0VudHJ5EkYKD21hcF9pbnQzMl9ieXRlcxgPIAMoCzItLnByb3RvYnVm", 
            "X3VuaXR0ZXN0LlRlc3RNYXAuTWFwSW50MzJCeXRlc0VudHJ5EkQKDm1hcF9p", 
            "bnQzMl9lbnVtGBAgAygLMiwucHJvdG9idWZfdW5pdHRlc3QuVGVzdE1hcC5N", 
            "YXBJbnQzMkVudW1FbnRyeRJZChltYXBfaW50MzJfZm9yZWlnbl9tZXNzYWdl", 
            "GBEgAygLMjYucHJvdG9idWZfdW5pdHRlc3QuVGVzdE1hcC5NYXBJbnQzMkZv", 
            "cmVpZ25NZXNzYWdlRW50cnkaNAoSTWFwSW50MzJJbnQzMkVudHJ5EgsKA2tl", 
            "eRgBIAEoBRINCgV2YWx1ZRgCIAEoBToCOAEaNAoSTWFwSW50NjRJbnQ2NEVu", 
            "dHJ5EgsKA2tleRgBIAEoAxINCgV2YWx1ZRgCIAEoAzoCOAEaNgoUTWFwVWlu", 
            "dDMyVWludDMyRW50cnkSCwoDa2V5GAEgASgNEg0KBXZhbHVlGAIgASgNOgI4", 
            "ARo2ChRNYXBVaW50NjRVaW50NjRFbnRyeRILCgNrZXkYASABKAQSDQoFdmFs", 
            "dWUYAiABKAQ6AjgBGjYKFE1hcFNpbnQzMlNpbnQzMkVudHJ5EgsKA2tleRgB", 
            "IAEoERINCgV2YWx1ZRgCIAEoEToCOAEaNgoUTWFwU2ludDY0U2ludDY0RW50", 
            "cnkSCwoDa2V5GAEgASgSEg0KBXZhbHVlGAIgASgSOgI4ARo4ChZNYXBGaXhl", 
            "ZDMyRml4ZWQzMkVudHJ5EgsKA2tleRgBIAEoBxINCgV2YWx1ZRgCIAEoBzoC", 
            "OAEaOAoWTWFwRml4ZWQ2NEZpeGVkNjRFbnRyeRILCgNrZXkYASABKAYSDQoF", 
            "dmFsdWUYAiABKAY6AjgBGjoKGE1hcFNmaXhlZDMyU2ZpeGVkMzJFbnRyeRIL", 
            "CgNrZXkYASABKA8SDQoFdmFsdWUYAiABKA86AjgBGjoKGE1hcFNmaXhlZDY0", 
            "U2ZpeGVkNjRFbnRyeRILCgNrZXkYASABKBASDQoFdmFsdWUYAiABKBA6AjgB", 
            "GjQKEk1hcEludDMyRmxvYXRFbnRyeRILCgNrZXkYASABKAUSDQoFdmFsdWUY", 
            "AiABKAI6AjgBGjUKE01hcEludDMyRG91YmxlRW50cnkSCwoDa2V5GAEgASgF", 
            "Eg0KBXZhbHVlGAIgASgBOgI4ARoyChBNYXBCb29sQm9vbEVudHJ5EgsKA2tl", 
            "eRgBIAEoCBINCgV2YWx1ZRgCIAEoCDoCOAEaNgoUTWFwU3RyaW5nU3RyaW5n", 
            "RW50cnkSCwoDa2V5GAEgASgJEg0KBXZhbHVlGAIgASgJOgI4ARo0ChJNYXBJ", 
            "bnQzMkJ5dGVzRW50cnkSCwoDa2V5GAEgASgFEg0KBXZhbHVlGAIgASgMOgI4", 
            "ARpPChFNYXBJbnQzMkVudW1FbnRyeRILCgNrZXkYASABKAUSKQoFdmFsdWUY", 
            "AiABKA4yGi5wcm90b2J1Zl91bml0dGVzdC5NYXBFbnVtOgI4ARpgChtNYXBJ", 
            "bnQzMkZvcmVpZ25NZXNzYWdlRW50cnkSCwoDa2V5GAEgASgFEjAKBXZhbHVl", 
            "GAIgASgLMiEucHJvdG9idWZfdW5pdHRlc3QuRm9yZWlnbk1lc3NhZ2U6AjgB", 
            "IkEKEVRlc3RNYXBTdWJtZXNzYWdlEiwKCHRlc3RfbWFwGAEgASgLMhoucHJv", 
            "dG9idWZfdW5pdHRlc3QuVGVzdE1hcCK8AQoOVGVzdE1lc3NhZ2VNYXASUQoR", 
            "bWFwX2ludDMyX21lc3NhZ2UYASADKAsyNi5wcm90b2J1Zl91bml0dGVzdC5U", 
            "ZXN0TWVzc2FnZU1hcC5NYXBJbnQzMk1lc3NhZ2VFbnRyeRpXChRNYXBJbnQz", 
            "Mk1lc3NhZ2VFbnRyeRILCgNrZXkYASABKAUSLgoFdmFsdWUYAiABKAsyHy5w", 
            "cm90b2J1Zl91bml0dGVzdC5UZXN0QWxsVHlwZXM6AjgBIuMBCg9UZXN0U2Ft", 
            "ZVR5cGVNYXASOgoEbWFwMRgBIAMoCzIsLnByb3RvYnVmX3VuaXR0ZXN0LlRl", 
            "c3RTYW1lVHlwZU1hcC5NYXAxRW50cnkSOgoEbWFwMhgCIAMoCzIsLnByb3Rv", 
            "YnVmX3VuaXR0ZXN0LlRlc3RTYW1lVHlwZU1hcC5NYXAyRW50cnkaKwoJTWFw", 
            "MUVudHJ5EgsKA2tleRgBIAEoBRINCgV2YWx1ZRgCIAEoBToCOAEaKwoJTWFw", 
            "MkVudHJ5EgsKA2tleRgBIAEoBRINCgV2YWx1ZRgCIAEoBToCOAEi5BAKDFRl", 
            "c3RBcmVuYU1hcBJLCg9tYXBfaW50MzJfaW50MzIYASADKAsyMi5wcm90b2J1", 
            "Zl91bml0dGVzdC5UZXN0QXJlbmFNYXAuTWFwSW50MzJJbnQzMkVudHJ5EksK", 
            "D21hcF9pbnQ2NF9pbnQ2NBgCIAMoCzIyLnByb3RvYnVmX3VuaXR0ZXN0LlRl", 
            "c3RBcmVuYU1hcC5NYXBJbnQ2NEludDY0RW50cnkSTwoRbWFwX3VpbnQzMl91", 
            "aW50MzIYAyADKAsyNC5wcm90b2J1Zl91bml0dGVzdC5UZXN0QXJlbmFNYXAu", 
            "TWFwVWludDMyVWludDMyRW50cnkSTwoRbWFwX3VpbnQ2NF91aW50NjQYBCAD", 
            "KAsyNC5wcm90b2J1Zl91bml0dGVzdC5UZXN0QXJlbmFNYXAuTWFwVWludDY0", 
            "VWludDY0RW50cnkSTwoRbWFwX3NpbnQzMl9zaW50MzIYBSADKAsyNC5wcm90", 
            "b2J1Zl91bml0dGVzdC5UZXN0QXJlbmFNYXAuTWFwU2ludDMyU2ludDMyRW50", 
            "cnkSTwoRbWFwX3NpbnQ2NF9zaW50NjQYBiADKAsyNC5wcm90b2J1Zl91bml0", 
            "dGVzdC5UZXN0QXJlbmFNYXAuTWFwU2ludDY0U2ludDY0RW50cnkSUwoTbWFw", 
            "X2ZpeGVkMzJfZml4ZWQzMhgHIAMoCzI2LnByb3RvYnVmX3VuaXR0ZXN0LlRl", 
            "c3RBcmVuYU1hcC5NYXBGaXhlZDMyRml4ZWQzMkVudHJ5ElMKE21hcF9maXhl", 
            "ZDY0X2ZpeGVkNjQYCCADKAsyNi5wcm90b2J1Zl91bml0dGVzdC5UZXN0QXJl", 
            "bmFNYXAuTWFwRml4ZWQ2NEZpeGVkNjRFbnRyeRJXChVtYXBfc2ZpeGVkMzJf", 
            "c2ZpeGVkMzIYCSADKAsyOC5wcm90b2J1Zl91bml0dGVzdC5UZXN0QXJlbmFN", 
            "YXAuTWFwU2ZpeGVkMzJTZml4ZWQzMkVudHJ5ElcKFW1hcF9zZml4ZWQ2NF9z", 
            "Zml4ZWQ2NBgKIAMoCzI4LnByb3RvYnVmX3VuaXR0ZXN0LlRlc3RBcmVuYU1h", 
            "cC5NYXBTZml4ZWQ2NFNmaXhlZDY0RW50cnkSSwoPbWFwX2ludDMyX2Zsb2F0", 
            "GAsgAygLMjIucHJvdG9idWZfdW5pdHRlc3QuVGVzdEFyZW5hTWFwLk1hcElu", 
            "dDMyRmxvYXRFbnRyeRJNChBtYXBfaW50MzJfZG91YmxlGAwgAygLMjMucHJv", 
            "dG9idWZfdW5pdHRlc3QuVGVzdEFyZW5hTWFwLk1hcEludDMyRG91YmxlRW50", 
            "cnkSRwoNbWFwX2Jvb2xfYm9vbBgNIAMoCzIwLnByb3RvYnVmX3VuaXR0ZXN0", 
            "LlRlc3RBcmVuYU1hcC5NYXBCb29sQm9vbEVudHJ5EkkKDm1hcF9pbnQzMl9l", 
            "bnVtGA4gAygLMjEucHJvdG9idWZfdW5pdHRlc3QuVGVzdEFyZW5hTWFwLk1h", 
            "cEludDMyRW51bUVudHJ5El4KGW1hcF9pbnQzMl9mb3JlaWduX21lc3NhZ2UY", 
            "DyADKAsyOy5wcm90b2J1Zl91bml0dGVzdC5UZXN0QXJlbmFNYXAuTWFwSW50", 
            "MzJGb3JlaWduTWVzc2FnZUVudHJ5GjQKEk1hcEludDMySW50MzJFbnRyeRIL", 
            "CgNrZXkYASABKAUSDQoFdmFsdWUYAiABKAU6AjgBGjQKEk1hcEludDY0SW50", 
            "NjRFbnRyeRILCgNrZXkYASABKAMSDQoFdmFsdWUYAiABKAM6AjgBGjYKFE1h", 
            "cFVpbnQzMlVpbnQzMkVudHJ5EgsKA2tleRgBIAEoDRINCgV2YWx1ZRgCIAEo", 
            "DToCOAEaNgoUTWFwVWludDY0VWludDY0RW50cnkSCwoDa2V5GAEgASgEEg0K", 
            "BXZhbHVlGAIgASgEOgI4ARo2ChRNYXBTaW50MzJTaW50MzJFbnRyeRILCgNr", 
            "ZXkYASABKBESDQoFdmFsdWUYAiABKBE6AjgBGjYKFE1hcFNpbnQ2NFNpbnQ2", 
            "NEVudHJ5EgsKA2tleRgBIAEoEhINCgV2YWx1ZRgCIAEoEjoCOAEaOAoWTWFw", 
            "Rml4ZWQzMkZpeGVkMzJFbnRyeRILCgNrZXkYASABKAcSDQoFdmFsdWUYAiAB", 
            "KAc6AjgBGjgKFk1hcEZpeGVkNjRGaXhlZDY0RW50cnkSCwoDa2V5GAEgASgG", 
            "Eg0KBXZhbHVlGAIgASgGOgI4ARo6ChhNYXBTZml4ZWQzMlNmaXhlZDMyRW50", 
            "cnkSCwoDa2V5GAEgASgPEg0KBXZhbHVlGAIgASgPOgI4ARo6ChhNYXBTZml4", 
            "ZWQ2NFNmaXhlZDY0RW50cnkSCwoDa2V5GAEgASgQEg0KBXZhbHVlGAIgASgQ", 
            "OgI4ARo0ChJNYXBJbnQzMkZsb2F0RW50cnkSCwoDa2V5GAEgASgFEg0KBXZh", 
            "bHVlGAIgASgCOgI4ARo1ChNNYXBJbnQzMkRvdWJsZUVudHJ5EgsKA2tleRgB", 
            "IAEoBRINCgV2YWx1ZRgCIAEoAToCOAEaMgoQTWFwQm9vbEJvb2xFbnRyeRIL", 
            "CgNrZXkYASABKAgSDQoFdmFsdWUYAiABKAg6AjgBGk8KEU1hcEludDMyRW51", 
            "bUVudHJ5EgsKA2tleRgBIAEoBRIpCgV2YWx1ZRgCIAEoDjIaLnByb3RvYnVm", 
            "X3VuaXR0ZXN0Lk1hcEVudW06AjgBGmAKG01hcEludDMyRm9yZWlnbk1lc3Nh", 
            "Z2VFbnRyeRILCgNrZXkYASABKAUSMAoFdmFsdWUYAiABKAsyIS5wcm90b2J1", 
            "Zl91bml0dGVzdC5Gb3JlaWduTWVzc2FnZToCOAEi5AEKH01lc3NhZ2VDb250", 
            "YWluaW5nRW51bUNhbGxlZFR5cGUSSgoEdHlwZRgBIAMoCzI8LnByb3RvYnVm", 
            "X3VuaXR0ZXN0Lk1lc3NhZ2VDb250YWluaW5nRW51bUNhbGxlZFR5cGUuVHlw", 
            "ZUVudHJ5Gl8KCVR5cGVFbnRyeRILCgNrZXkYASABKAUSQQoFdmFsdWUYAiAB", 
            "KAsyMi5wcm90b2J1Zl91bml0dGVzdC5NZXNzYWdlQ29udGFpbmluZ0VudW1D", 
            "YWxsZWRUeXBlOgI4ASIUCgRUeXBlEgwKCFRZUEVfRk9PEAAinQEKH01lc3Nh", 
            "Z2VDb250YWluaW5nTWFwQ2FsbGVkRW50cnkSTAoFZW50cnkYASADKAsyPS5w", 
            "cm90b2J1Zl91bml0dGVzdC5NZXNzYWdlQ29udGFpbmluZ01hcENhbGxlZEVu", 
            "dHJ5LkVudHJ5RW50cnkaLAoKRW50cnlFbnRyeRILCgNrZXkYASABKAUSDQoF", 
            "dmFsdWUYAiABKAU6AjgBKj8KB01hcEVudW0SEAoMTUFQX0VOVU1fRk9PEAAS", 
            "EAoMTUFQX0VOVU1fQkFSEAESEAoMTUFQX0VOVU1fQkFaEAJCIPgBAaoCGkdv", 
          "b2dsZS5Qcm90b2J1Zi5UZXN0UHJvdG9zYgZwcm90bzM="));
      descriptor = pbd::FileDescriptor.InternalBuildGeneratedFileFrom(descriptorData,
          new pbd::FileDescriptor[] {
          global::Google.Protobuf.TestProtos.UnittestProto3.Descriptor, 
          });
      internal__static_protobuf_unittest_TestMap__FieldAccessorTable = 
          new pb::FieldAccess.FieldAccessorTable(typeof(global::Google.Protobuf.TestProtos.TestMap), descriptor.MessageTypes[0],
              new string[] { "MapInt32Int32", "MapInt64Int64", "MapUint32Uint32", "MapUint64Uint64", "MapSint32Sint32", "MapSint64Sint64", "MapFixed32Fixed32", "MapFixed64Fixed64", "MapSfixed32Sfixed32", "MapSfixed64Sfixed64", "MapInt32Float", "MapInt32Double", "MapBoolBool", "MapStringString", "MapInt32Bytes", "MapInt32Enum", "MapInt32ForeignMessage", });
      internal__static_protobuf_unittest_TestMap_MapInt32Int32Entry__FieldAccessorTable = 
          new pb::FieldAccess.FieldAccessorTable(typeof(global::Google.Protobuf.TestProtos.TestMap.Types.MapInt32Int32Entry), descriptor.MessageTypes[0].NestedTypes[0],
              new string[] { "Key", "Value", });
      internal__static_protobuf_unittest_TestMap_MapInt64Int64Entry__FieldAccessorTable = 
          new pb::FieldAccess.FieldAccessorTable(typeof(global::Google.Protobuf.TestProtos.TestMap.Types.MapInt64Int64Entry), descriptor.MessageTypes[0].NestedTypes[1],
              new string[] { "Key", "Value", });
      internal__static_protobuf_unittest_TestMap_MapUint32Uint32Entry__FieldAccessorTable = 
          new pb::FieldAccess.FieldAccessorTable(typeof(global::Google.Protobuf.TestProtos.TestMap.Types.MapUint32Uint32Entry), descriptor.MessageTypes[0].NestedTypes[2],
              new string[] { "Key", "Value", });
      internal__static_protobuf_unittest_TestMap_MapUint64Uint64Entry__FieldAccessorTable = 
          new pb::FieldAccess.FieldAccessorTable(typeof(global::Google.Protobuf.TestProtos.TestMap.Types.MapUint64Uint64Entry), descriptor.MessageTypes[0].NestedTypes[3],
              new string[] { "Key", "Value", });
      internal__static_protobuf_unittest_TestMap_MapSint32Sint32Entry__FieldAccessorTable = 
          new pb::FieldAccess.FieldAccessorTable(typeof(global::Google.Protobuf.TestProtos.TestMap.Types.MapSint32Sint32Entry), descriptor.MessageTypes[0].NestedTypes[4],
              new string[] { "Key", "Value", });
      internal__static_protobuf_unittest_TestMap_MapSint64Sint64Entry__FieldAccessorTable = 
          new pb::FieldAccess.FieldAccessorTable(typeof(global::Google.Protobuf.TestProtos.TestMap.Types.MapSint64Sint64Entry), descriptor.MessageTypes[0].NestedTypes[5],
              new string[] { "Key", "Value", });
      internal__static_protobuf_unittest_TestMap_MapFixed32Fixed32Entry__FieldAccessorTable = 
          new pb::FieldAccess.FieldAccessorTable(typeof(global::Google.Protobuf.TestProtos.TestMap.Types.MapFixed32Fixed32Entry), descriptor.MessageTypes[0].NestedTypes[6],
              new string[] { "Key", "Value", });
      internal__static_protobuf_unittest_TestMap_MapFixed64Fixed64Entry__FieldAccessorTable = 
          new pb::FieldAccess.FieldAccessorTable(typeof(global::Google.Protobuf.TestProtos.TestMap.Types.MapFixed64Fixed64Entry), descriptor.MessageTypes[0].NestedTypes[7],
              new string[] { "Key", "Value", });
      internal__static_protobuf_unittest_TestMap_MapSfixed32Sfixed32Entry__FieldAccessorTable = 
          new pb::FieldAccess.FieldAccessorTable(typeof(global::Google.Protobuf.TestProtos.TestMap.Types.MapSfixed32Sfixed32Entry), descriptor.MessageTypes[0].NestedTypes[8],
              new string[] { "Key", "Value", });
      internal__static_protobuf_unittest_TestMap_MapSfixed64Sfixed64Entry__FieldAccessorTable = 
          new pb::FieldAccess.FieldAccessorTable(typeof(global::Google.Protobuf.TestProtos.TestMap.Types.MapSfixed64Sfixed64Entry), descriptor.MessageTypes[0].NestedTypes[9],
              new string[] { "Key", "Value", });
      internal__static_protobuf_unittest_TestMap_MapInt32FloatEntry__FieldAccessorTable = 
          new pb::FieldAccess.FieldAccessorTable(typeof(global::Google.Protobuf.TestProtos.TestMap.Types.MapInt32FloatEntry), descriptor.MessageTypes[0].NestedTypes[10],
              new string[] { "Key", "Value", });
      internal__static_protobuf_unittest_TestMap_MapInt32DoubleEntry__FieldAccessorTable = 
          new pb::FieldAccess.FieldAccessorTable(typeof(global::Google.Protobuf.TestProtos.TestMap.Types.MapInt32DoubleEntry), descriptor.MessageTypes[0].NestedTypes[11],
              new string[] { "Key", "Value", });
      internal__static_protobuf_unittest_TestMap_MapBoolBoolEntry__FieldAccessorTable = 
          new pb::FieldAccess.FieldAccessorTable(typeof(global::Google.Protobuf.TestProtos.TestMap.Types.MapBoolBoolEntry), descriptor.MessageTypes[0].NestedTypes[12],
              new string[] { "Key", "Value", });
      internal__static_protobuf_unittest_TestMap_MapStringStringEntry__FieldAccessorTable = 
          new pb::FieldAccess.FieldAccessorTable(typeof(global::Google.Protobuf.TestProtos.TestMap.Types.MapStringStringEntry), descriptor.MessageTypes[0].NestedTypes[13],
              new string[] { "Key", "Value", });
      internal__static_protobuf_unittest_TestMap_MapInt32BytesEntry__FieldAccessorTable = 
          new pb::FieldAccess.FieldAccessorTable(typeof(global::Google.Protobuf.TestProtos.TestMap.Types.MapInt32BytesEntry), descriptor.MessageTypes[0].NestedTypes[14],
              new string[] { "Key", "Value", });
      internal__static_protobuf_unittest_TestMap_MapInt32EnumEntry__FieldAccessorTable = 
          new pb::FieldAccess.FieldAccessorTable(typeof(global::Google.Protobuf.TestProtos.TestMap.Types.MapInt32EnumEntry), descriptor.MessageTypes[0].NestedTypes[15],
              new string[] { "Key", "Value", });
      internal__static_protobuf_unittest_TestMap_MapInt32ForeignMessageEntry__FieldAccessorTable = 
          new pb::FieldAccess.FieldAccessorTable(typeof(global::Google.Protobuf.TestProtos.TestMap.Types.MapInt32ForeignMessageEntry), descriptor.MessageTypes[0].NestedTypes[16],
              new string[] { "Key", "Value", });
      internal__static_protobuf_unittest_TestMapSubmessage__FieldAccessorTable = 
          new pb::FieldAccess.FieldAccessorTable(typeof(global::Google.Protobuf.TestProtos.TestMapSubmessage), descriptor.MessageTypes[1],
              new string[] { "TestMap", });
      internal__static_protobuf_unittest_TestMessageMap__FieldAccessorTable = 
          new pb::FieldAccess.FieldAccessorTable(typeof(global::Google.Protobuf.TestProtos.TestMessageMap), descriptor.MessageTypes[2],
              new string[] { "MapInt32Message", });
      internal__static_protobuf_unittest_TestMessageMap_MapInt32MessageEntry__FieldAccessorTable = 
          new pb::FieldAccess.FieldAccessorTable(typeof(global::Google.Protobuf.TestProtos.TestMessageMap.Types.MapInt32MessageEntry), descriptor.MessageTypes[2].NestedTypes[0],
              new string[] { "Key", "Value", });
      internal__static_protobuf_unittest_TestSameTypeMap__FieldAccessorTable = 
          new pb::FieldAccess.FieldAccessorTable(typeof(global::Google.Protobuf.TestProtos.TestSameTypeMap), descriptor.MessageTypes[3],
              new string[] { "Map1", "Map2", });
      internal__static_protobuf_unittest_TestSameTypeMap_Map1Entry__FieldAccessorTable = 
          new pb::FieldAccess.FieldAccessorTable(typeof(global::Google.Protobuf.TestProtos.TestSameTypeMap.Types.Map1Entry), descriptor.MessageTypes[3].NestedTypes[0],
              new string[] { "Key", "Value", });
      internal__static_protobuf_unittest_TestSameTypeMap_Map2Entry__FieldAccessorTable = 
          new pb::FieldAccess.FieldAccessorTable(typeof(global::Google.Protobuf.TestProtos.TestSameTypeMap.Types.Map2Entry), descriptor.MessageTypes[3].NestedTypes[1],
              new string[] { "Key", "Value", });
      internal__static_protobuf_unittest_TestArenaMap__FieldAccessorTable = 
          new pb::FieldAccess.FieldAccessorTable(typeof(global::Google.Protobuf.TestProtos.TestArenaMap), descriptor.MessageTypes[4],
              new string[] { "MapInt32Int32", "MapInt64Int64", "MapUint32Uint32", "MapUint64Uint64", "MapSint32Sint32", "MapSint64Sint64", "MapFixed32Fixed32", "MapFixed64Fixed64", "MapSfixed32Sfixed32", "MapSfixed64Sfixed64", "MapInt32Float", "MapInt32Double", "MapBoolBool", "MapInt32Enum", "MapInt32ForeignMessage", });
      internal__static_protobuf_unittest_TestArenaMap_MapInt32Int32Entry__FieldAccessorTable = 
          new pb::FieldAccess.FieldAccessorTable(typeof(global::Google.Protobuf.TestProtos.TestArenaMap.Types.MapInt32Int32Entry), descriptor.MessageTypes[4].NestedTypes[0],
              new string[] { "Key", "Value", });
      internal__static_protobuf_unittest_TestArenaMap_MapInt64Int64Entry__FieldAccessorTable = 
          new pb::FieldAccess.FieldAccessorTable(typeof(global::Google.Protobuf.TestProtos.TestArenaMap.Types.MapInt64Int64Entry), descriptor.MessageTypes[4].NestedTypes[1],
              new string[] { "Key", "Value", });
      internal__static_protobuf_unittest_TestArenaMap_MapUint32Uint32Entry__FieldAccessorTable = 
          new pb::FieldAccess.FieldAccessorTable(typeof(global::Google.Protobuf.TestProtos.TestArenaMap.Types.MapUint32Uint32Entry), descriptor.MessageTypes[4].NestedTypes[2],
              new string[] { "Key", "Value", });
      internal__static_protobuf_unittest_TestArenaMap_MapUint64Uint64Entry__FieldAccessorTable = 
          new pb::FieldAccess.FieldAccessorTable(typeof(global::Google.Protobuf.TestProtos.TestArenaMap.Types.MapUint64Uint64Entry), descriptor.MessageTypes[4].NestedTypes[3],
              new string[] { "Key", "Value", });
      internal__static_protobuf_unittest_TestArenaMap_MapSint32Sint32Entry__FieldAccessorTable = 
          new pb::FieldAccess.FieldAccessorTable(typeof(global::Google.Protobuf.TestProtos.TestArenaMap.Types.MapSint32Sint32Entry), descriptor.MessageTypes[4].NestedTypes[4],
              new string[] { "Key", "Value", });
      internal__static_protobuf_unittest_TestArenaMap_MapSint64Sint64Entry__FieldAccessorTable = 
          new pb::FieldAccess.FieldAccessorTable(typeof(global::Google.Protobuf.TestProtos.TestArenaMap.Types.MapSint64Sint64Entry), descriptor.MessageTypes[4].NestedTypes[5],
              new string[] { "Key", "Value", });
      internal__static_protobuf_unittest_TestArenaMap_MapFixed32Fixed32Entry__FieldAccessorTable = 
          new pb::FieldAccess.FieldAccessorTable(typeof(global::Google.Protobuf.TestProtos.TestArenaMap.Types.MapFixed32Fixed32Entry), descriptor.MessageTypes[4].NestedTypes[6],
              new string[] { "Key", "Value", });
      internal__static_protobuf_unittest_TestArenaMap_MapFixed64Fixed64Entry__FieldAccessorTable = 
          new pb::FieldAccess.FieldAccessorTable(typeof(global::Google.Protobuf.TestProtos.TestArenaMap.Types.MapFixed64Fixed64Entry), descriptor.MessageTypes[4].NestedTypes[7],
              new string[] { "Key", "Value", });
      internal__static_protobuf_unittest_TestArenaMap_MapSfixed32Sfixed32Entry__FieldAccessorTable = 
          new pb::FieldAccess.FieldAccessorTable(typeof(global::Google.Protobuf.TestProtos.TestArenaMap.Types.MapSfixed32Sfixed32Entry), descriptor.MessageTypes[4].NestedTypes[8],
              new string[] { "Key", "Value", });
      internal__static_protobuf_unittest_TestArenaMap_MapSfixed64Sfixed64Entry__FieldAccessorTable = 
          new pb::FieldAccess.FieldAccessorTable(typeof(global::Google.Protobuf.TestProtos.TestArenaMap.Types.MapSfixed64Sfixed64Entry), descriptor.MessageTypes[4].NestedTypes[9],
              new string[] { "Key", "Value", });
      internal__static_protobuf_unittest_TestArenaMap_MapInt32FloatEntry__FieldAccessorTable = 
          new pb::FieldAccess.FieldAccessorTable(typeof(global::Google.Protobuf.TestProtos.TestArenaMap.Types.MapInt32FloatEntry), descriptor.MessageTypes[4].NestedTypes[10],
              new string[] { "Key", "Value", });
      internal__static_protobuf_unittest_TestArenaMap_MapInt32DoubleEntry__FieldAccessorTable = 
          new pb::FieldAccess.FieldAccessorTable(typeof(global::Google.Protobuf.TestProtos.TestArenaMap.Types.MapInt32DoubleEntry), descriptor.MessageTypes[4].NestedTypes[11],
              new string[] { "Key", "Value", });
      internal__static_protobuf_unittest_TestArenaMap_MapBoolBoolEntry__FieldAccessorTable = 
          new pb::FieldAccess.FieldAccessorTable(typeof(global::Google.Protobuf.TestProtos.TestArenaMap.Types.MapBoolBoolEntry), descriptor.MessageTypes[4].NestedTypes[12],
              new string[] { "Key", "Value", });
      internal__static_protobuf_unittest_TestArenaMap_MapInt32EnumEntry__FieldAccessorTable = 
          new pb::FieldAccess.FieldAccessorTable(typeof(global::Google.Protobuf.TestProtos.TestArenaMap.Types.MapInt32EnumEntry), descriptor.MessageTypes[4].NestedTypes[13],
              new string[] { "Key", "Value", });
      internal__static_protobuf_unittest_TestArenaMap_MapInt32ForeignMessageEntry__FieldAccessorTable = 
          new pb::FieldAccess.FieldAccessorTable(typeof(global::Google.Protobuf.TestProtos.TestArenaMap.Types.MapInt32ForeignMessageEntry), descriptor.MessageTypes[4].NestedTypes[14],
              new string[] { "Key", "Value", });
      internal__static_protobuf_unittest_MessageContainingEnumCalledType__FieldAccessorTable = 
          new pb::FieldAccess.FieldAccessorTable(typeof(global::Google.Protobuf.TestProtos.MessageContainingEnumCalledType), descriptor.MessageTypes[5],
              new string[] { "Type", });
      internal__static_protobuf_unittest_MessageContainingEnumCalledType_TypeEntry__FieldAccessorTable = 
          new pb::FieldAccess.FieldAccessorTable(typeof(global::Google.Protobuf.TestProtos.MessageContainingEnumCalledType.Types.TypeEntry), descriptor.MessageTypes[5].NestedTypes[0],
              new string[] { "Key", "Value", });
      internal__static_protobuf_unittest_MessageContainingMapCalledEntry__FieldAccessorTable = 
          new pb::FieldAccess.FieldAccessorTable(typeof(global::Google.Protobuf.TestProtos.MessageContainingMapCalledEntry), descriptor.MessageTypes[6],
              new string[] { "Entry", });
      internal__static_protobuf_unittest_MessageContainingMapCalledEntry_EntryEntry__FieldAccessorTable = 
          new pb::FieldAccess.FieldAccessorTable(typeof(global::Google.Protobuf.TestProtos.MessageContainingMapCalledEntry.Types.EntryEntry), descriptor.MessageTypes[6].NestedTypes[0],
              new string[] { "Key", "Value", });
    }
    #endregion

  }
  #region Enums
  public enum MapEnum {
    MAP_ENUM_FOO = 0,
    MAP_ENUM_BAR = 1,
    MAP_ENUM_BAZ = 2,
  }

  #endregion

  #region Messages
  [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
  public sealed partial class TestMap : pb::IMessage<TestMap> {
    private static readonly pb::MessageParser<TestMap> _parser = new pb::MessageParser<TestMap>(() => new TestMap());
    public static pb::MessageParser<TestMap> Parser { get { return _parser; } }

    private static readonly string[] _fieldNames = new string[] { "map_bool_bool", "map_fixed32_fixed32", "map_fixed64_fixed64", "map_int32_bytes", "map_int32_double", "map_int32_enum", "map_int32_float", "map_int32_foreign_message", "map_int32_int32", "map_int64_int64", "map_sfixed32_sfixed32", "map_sfixed64_sfixed64", "map_sint32_sint32", "map_sint64_sint64", "map_string_string", "map_uint32_uint32", "map_uint64_uint64" };
    private static readonly uint[] _fieldTags = new uint[] { 106, 58, 66, 122, 98, 130, 90, 138, 10, 18, 74, 82, 42, 50, 114, 26, 34 };
    public static pbd::MessageDescriptor Descriptor {
      get { return global::Google.Protobuf.TestProtos.MapUnittestProto3.Descriptor.MessageTypes[0]; }
    }

    public pb::FieldAccess.FieldAccessorTable Fields {
      get { return global::Google.Protobuf.TestProtos.MapUnittestProto3.internal__static_protobuf_unittest_TestMap__FieldAccessorTable; }
    }

    private bool _frozen = false;
    public bool IsFrozen { get { return _frozen; } }

    public TestMap() {
      OnConstruction();
    }

    partial void OnConstruction();

    public TestMap(TestMap other) : this() {
      mapInt32Int32_ = other.mapInt32Int32_.Clone();
      mapInt64Int64_ = other.mapInt64Int64_.Clone();
      mapUint32Uint32_ = other.mapUint32Uint32_.Clone();
      mapUint64Uint64_ = other.mapUint64Uint64_.Clone();
      mapSint32Sint32_ = other.mapSint32Sint32_.Clone();
      mapSint64Sint64_ = other.mapSint64Sint64_.Clone();
      mapFixed32Fixed32_ = other.mapFixed32Fixed32_.Clone();
      mapFixed64Fixed64_ = other.mapFixed64Fixed64_.Clone();
      mapSfixed32Sfixed32_ = other.mapSfixed32Sfixed32_.Clone();
      mapSfixed64Sfixed64_ = other.mapSfixed64Sfixed64_.Clone();
      mapInt32Float_ = other.mapInt32Float_.Clone();
      mapInt32Double_ = other.mapInt32Double_.Clone();
      mapBoolBool_ = other.mapBoolBool_.Clone();
      mapStringString_ = other.mapStringString_.Clone();
      mapInt32Bytes_ = other.mapInt32Bytes_.Clone();
      mapInt32Enum_ = other.mapInt32Enum_.Clone();
      mapInt32ForeignMessage_ = other.mapInt32ForeignMessage_.Clone();
    }

    public TestMap Clone() {
      return new TestMap(this);
    }

    public void Freeze() {
      if (IsFrozen) {
        return;
      }
      _frozen = true;
      mapInt32Int32_.Freeze();
      mapInt64Int64_.Freeze();
      mapUint32Uint32_.Freeze();
      mapUint64Uint64_.Freeze();
      mapSint32Sint32_.Freeze();
      mapSint64Sint64_.Freeze();
      mapFixed32Fixed32_.Freeze();
      mapFixed64Fixed64_.Freeze();
      mapSfixed32Sfixed32_.Freeze();
      mapSfixed64Sfixed64_.Freeze();
      mapInt32Float_.Freeze();
      mapInt32Double_.Freeze();
      mapBoolBool_.Freeze();
      mapStringString_.Freeze();
      mapInt32Bytes_.Freeze();
      mapInt32Enum_.Freeze();
      mapInt32ForeignMessage_.Freeze();
    }

    public const int MapInt32Int32FieldNumber = 1;
    private static readonly pbc::MapField<int, int>.Codec _map_mapInt32Int32_codec
        = new pbc::MapField<int, int>.Codec(pb::FieldCodec.ForInt32(8), pb::FieldCodec.ForInt32(16), 10);
    private readonly pbc::MapField<int, int> mapInt32Int32_ = new pbc::MapField<int, int>();
    public pbc::MapField<int, int> MapInt32Int32 {
      get { return mapInt32Int32_; }
    }

    public const int MapInt64Int64FieldNumber = 2;
    private static readonly pbc::MapField<long, long>.Codec _map_mapInt64Int64_codec
        = new pbc::MapField<long, long>.Codec(pb::FieldCodec.ForInt64(8), pb::FieldCodec.ForInt64(16), 18);
    private readonly pbc::MapField<long, long> mapInt64Int64_ = new pbc::MapField<long, long>();
    public pbc::MapField<long, long> MapInt64Int64 {
      get { return mapInt64Int64_; }
    }

    public const int MapUint32Uint32FieldNumber = 3;
    private static readonly pbc::MapField<uint, uint>.Codec _map_mapUint32Uint32_codec
        = new pbc::MapField<uint, uint>.Codec(pb::FieldCodec.ForUInt32(8), pb::FieldCodec.ForUInt32(16), 26);
    private readonly pbc::MapField<uint, uint> mapUint32Uint32_ = new pbc::MapField<uint, uint>();
    public pbc::MapField<uint, uint> MapUint32Uint32 {
      get { return mapUint32Uint32_; }
    }

    public const int MapUint64Uint64FieldNumber = 4;
    private static readonly pbc::MapField<ulong, ulong>.Codec _map_mapUint64Uint64_codec
        = new pbc::MapField<ulong, ulong>.Codec(pb::FieldCodec.ForUInt64(8), pb::FieldCodec.ForUInt64(16), 34);
    private readonly pbc::MapField<ulong, ulong> mapUint64Uint64_ = new pbc::MapField<ulong, ulong>();
    public pbc::MapField<ulong, ulong> MapUint64Uint64 {
      get { return mapUint64Uint64_; }
    }

    public const int MapSint32Sint32FieldNumber = 5;
    private static readonly pbc::MapField<int, int>.Codec _map_mapSint32Sint32_codec
        = new pbc::MapField<int, int>.Codec(pb::FieldCodec.ForSInt32(8), pb::FieldCodec.ForSInt32(16), 42);
    private readonly pbc::MapField<int, int> mapSint32Sint32_ = new pbc::MapField<int, int>();
    public pbc::MapField<int, int> MapSint32Sint32 {
      get { return mapSint32Sint32_; }
    }

    public const int MapSint64Sint64FieldNumber = 6;
    private static readonly pbc::MapField<long, long>.Codec _map_mapSint64Sint64_codec
        = new pbc::MapField<long, long>.Codec(pb::FieldCodec.ForSInt64(8), pb::FieldCodec.ForSInt64(16), 50);
    private readonly pbc::MapField<long, long> mapSint64Sint64_ = new pbc::MapField<long, long>();
    public pbc::MapField<long, long> MapSint64Sint64 {
      get { return mapSint64Sint64_; }
    }

    public const int MapFixed32Fixed32FieldNumber = 7;
    private static readonly pbc::MapField<uint, uint>.Codec _map_mapFixed32Fixed32_codec
        = new pbc::MapField<uint, uint>.Codec(pb::FieldCodec.ForFixed32(13), pb::FieldCodec.ForFixed32(21), 58);
    private readonly pbc::MapField<uint, uint> mapFixed32Fixed32_ = new pbc::MapField<uint, uint>();
    public pbc::MapField<uint, uint> MapFixed32Fixed32 {
      get { return mapFixed32Fixed32_; }
    }

    public const int MapFixed64Fixed64FieldNumber = 8;
    private static readonly pbc::MapField<ulong, ulong>.Codec _map_mapFixed64Fixed64_codec
        = new pbc::MapField<ulong, ulong>.Codec(pb::FieldCodec.ForFixed64(9), pb::FieldCodec.ForFixed64(17), 66);
    private readonly pbc::MapField<ulong, ulong> mapFixed64Fixed64_ = new pbc::MapField<ulong, ulong>();
    public pbc::MapField<ulong, ulong> MapFixed64Fixed64 {
      get { return mapFixed64Fixed64_; }
    }

    public const int MapSfixed32Sfixed32FieldNumber = 9;
    private static readonly pbc::MapField<int, int>.Codec _map_mapSfixed32Sfixed32_codec
        = new pbc::MapField<int, int>.Codec(pb::FieldCodec.ForSFixed32(13), pb::FieldCodec.ForSFixed32(21), 74);
    private readonly pbc::MapField<int, int> mapSfixed32Sfixed32_ = new pbc::MapField<int, int>();
    public pbc::MapField<int, int> MapSfixed32Sfixed32 {
      get { return mapSfixed32Sfixed32_; }
    }

    public const int MapSfixed64Sfixed64FieldNumber = 10;
    private static readonly pbc::MapField<long, long>.Codec _map_mapSfixed64Sfixed64_codec
        = new pbc::MapField<long, long>.Codec(pb::FieldCodec.ForSFixed64(9), pb::FieldCodec.ForSFixed64(17), 82);
    private readonly pbc::MapField<long, long> mapSfixed64Sfixed64_ = new pbc::MapField<long, long>();
    public pbc::MapField<long, long> MapSfixed64Sfixed64 {
      get { return mapSfixed64Sfixed64_; }
    }

    public const int MapInt32FloatFieldNumber = 11;
    private static readonly pbc::MapField<int, float>.Codec _map_mapInt32Float_codec
        = new pbc::MapField<int, float>.Codec(pb::FieldCodec.ForInt32(8), pb::FieldCodec.ForFloat(21), 90);
    private readonly pbc::MapField<int, float> mapInt32Float_ = new pbc::MapField<int, float>();
    public pbc::MapField<int, float> MapInt32Float {
      get { return mapInt32Float_; }
    }

    public const int MapInt32DoubleFieldNumber = 12;
    private static readonly pbc::MapField<int, double>.Codec _map_mapInt32Double_codec
        = new pbc::MapField<int, double>.Codec(pb::FieldCodec.ForInt32(8), pb::FieldCodec.ForDouble(17), 98);
    private readonly pbc::MapField<int, double> mapInt32Double_ = new pbc::MapField<int, double>();
    public pbc::MapField<int, double> MapInt32Double {
      get { return mapInt32Double_; }
    }

    public const int MapBoolBoolFieldNumber = 13;
    private static readonly pbc::MapField<bool, bool>.Codec _map_mapBoolBool_codec
        = new pbc::MapField<bool, bool>.Codec(pb::FieldCodec.ForBool(8), pb::FieldCodec.ForBool(16), 106);
    private readonly pbc::MapField<bool, bool> mapBoolBool_ = new pbc::MapField<bool, bool>();
    public pbc::MapField<bool, bool> MapBoolBool {
      get { return mapBoolBool_; }
    }

    public const int MapStringStringFieldNumber = 14;
    private static readonly pbc::MapField<string, string>.Codec _map_mapStringString_codec
        = new pbc::MapField<string, string>.Codec(pb::FieldCodec.ForString(10), pb::FieldCodec.ForString(18), 114);
    private readonly pbc::MapField<string, string> mapStringString_ = new pbc::MapField<string, string>();
    public pbc::MapField<string, string> MapStringString {
      get { return mapStringString_; }
    }

    public const int MapInt32BytesFieldNumber = 15;
    private static readonly pbc::MapField<int, pb::ByteString>.Codec _map_mapInt32Bytes_codec
        = new pbc::MapField<int, pb::ByteString>.Codec(pb::FieldCodec.ForInt32(8), pb::FieldCodec.ForBytes(18), 122);
    private readonly pbc::MapField<int, pb::ByteString> mapInt32Bytes_ = new pbc::MapField<int, pb::ByteString>();
    public pbc::MapField<int, pb::ByteString> MapInt32Bytes {
      get { return mapInt32Bytes_; }
    }

    public const int MapInt32EnumFieldNumber = 16;
    private static readonly pbc::MapField<int, global::Google.Protobuf.TestProtos.MapEnum>.Codec _map_mapInt32Enum_codec
        = new pbc::MapField<int, global::Google.Protobuf.TestProtos.MapEnum>.Codec(pb::FieldCodec.ForInt32(8), pb::FieldCodec.ForEnum(16, x => (int) x, x => (global::Google.Protobuf.TestProtos.MapEnum) x), 130);
    private readonly pbc::MapField<int, global::Google.Protobuf.TestProtos.MapEnum> mapInt32Enum_ = new pbc::MapField<int, global::Google.Protobuf.TestProtos.MapEnum>();
    public pbc::MapField<int, global::Google.Protobuf.TestProtos.MapEnum> MapInt32Enum {
      get { return mapInt32Enum_; }
    }

    public const int MapInt32ForeignMessageFieldNumber = 17;
    private static readonly pbc::MapField<int, global::Google.Protobuf.TestProtos.ForeignMessage>.Codec _map_mapInt32ForeignMessage_codec
        = new pbc::MapField<int, global::Google.Protobuf.TestProtos.ForeignMessage>.Codec(pb::FieldCodec.ForInt32(8), pb::FieldCodec.ForMessage(18, global::Google.Protobuf.TestProtos.ForeignMessage.Parser), 138);
    private readonly pbc::MapField<int, global::Google.Protobuf.TestProtos.ForeignMessage> mapInt32ForeignMessage_ = new pbc::MapField<int, global::Google.Protobuf.TestProtos.ForeignMessage>();
    public pbc::MapField<int, global::Google.Protobuf.TestProtos.ForeignMessage> MapInt32ForeignMessage {
      get { return mapInt32ForeignMessage_; }
    }

    public override bool Equals(object other) {
      return Equals(other as TestMap);
    }

    public bool Equals(TestMap other) {
      if (ReferenceEquals(other, null)) {
        return false;
      }
      if (ReferenceEquals(other, this)) {
        return true;
      }
      if (!MapInt32Int32.Equals(other.MapInt32Int32)) return false;
      if (!MapInt64Int64.Equals(other.MapInt64Int64)) return false;
      if (!MapUint32Uint32.Equals(other.MapUint32Uint32)) return false;
      if (!MapUint64Uint64.Equals(other.MapUint64Uint64)) return false;
      if (!MapSint32Sint32.Equals(other.MapSint32Sint32)) return false;
      if (!MapSint64Sint64.Equals(other.MapSint64Sint64)) return false;
      if (!MapFixed32Fixed32.Equals(other.MapFixed32Fixed32)) return false;
      if (!MapFixed64Fixed64.Equals(other.MapFixed64Fixed64)) return false;
      if (!MapSfixed32Sfixed32.Equals(other.MapSfixed32Sfixed32)) return false;
      if (!MapSfixed64Sfixed64.Equals(other.MapSfixed64Sfixed64)) return false;
      if (!MapInt32Float.Equals(other.MapInt32Float)) return false;
      if (!MapInt32Double.Equals(other.MapInt32Double)) return false;
      if (!MapBoolBool.Equals(other.MapBoolBool)) return false;
      if (!MapStringString.Equals(other.MapStringString)) return false;
      if (!MapInt32Bytes.Equals(other.MapInt32Bytes)) return false;
      if (!MapInt32Enum.Equals(other.MapInt32Enum)) return false;
      if (!MapInt32ForeignMessage.Equals(other.MapInt32ForeignMessage)) return false;
      return true;
    }

    public override int GetHashCode() {
      int hash = 1;
      hash ^= MapInt32Int32.GetHashCode();
      hash ^= MapInt64Int64.GetHashCode();
      hash ^= MapUint32Uint32.GetHashCode();
      hash ^= MapUint64Uint64.GetHashCode();
      hash ^= MapSint32Sint32.GetHashCode();
      hash ^= MapSint64Sint64.GetHashCode();
      hash ^= MapFixed32Fixed32.GetHashCode();
      hash ^= MapFixed64Fixed64.GetHashCode();
      hash ^= MapSfixed32Sfixed32.GetHashCode();
      hash ^= MapSfixed64Sfixed64.GetHashCode();
      hash ^= MapInt32Float.GetHashCode();
      hash ^= MapInt32Double.GetHashCode();
      hash ^= MapBoolBool.GetHashCode();
      hash ^= MapStringString.GetHashCode();
      hash ^= MapInt32Bytes.GetHashCode();
      hash ^= MapInt32Enum.GetHashCode();
      hash ^= MapInt32ForeignMessage.GetHashCode();
      return hash;
    }

    public void WriteTo(pb::CodedOutputStream output) {
      mapInt32Int32_.WriteTo(output, _map_mapInt32Int32_codec);
      mapInt64Int64_.WriteTo(output, _map_mapInt64Int64_codec);
      mapUint32Uint32_.WriteTo(output, _map_mapUint32Uint32_codec);
      mapUint64Uint64_.WriteTo(output, _map_mapUint64Uint64_codec);
      mapSint32Sint32_.WriteTo(output, _map_mapSint32Sint32_codec);
      mapSint64Sint64_.WriteTo(output, _map_mapSint64Sint64_codec);
      mapFixed32Fixed32_.WriteTo(output, _map_mapFixed32Fixed32_codec);
      mapFixed64Fixed64_.WriteTo(output, _map_mapFixed64Fixed64_codec);
      mapSfixed32Sfixed32_.WriteTo(output, _map_mapSfixed32Sfixed32_codec);
      mapSfixed64Sfixed64_.WriteTo(output, _map_mapSfixed64Sfixed64_codec);
      mapInt32Float_.WriteTo(output, _map_mapInt32Float_codec);
      mapInt32Double_.WriteTo(output, _map_mapInt32Double_codec);
      mapBoolBool_.WriteTo(output, _map_mapBoolBool_codec);
      mapStringString_.WriteTo(output, _map_mapStringString_codec);
      mapInt32Bytes_.WriteTo(output, _map_mapInt32Bytes_codec);
      mapInt32Enum_.WriteTo(output, _map_mapInt32Enum_codec);
      mapInt32ForeignMessage_.WriteTo(output, _map_mapInt32ForeignMessage_codec);
    }

    public int CalculateSize() {
      int size = 0;
      size += mapInt32Int32_.CalculateSize(_map_mapInt32Int32_codec);
      size += mapInt64Int64_.CalculateSize(_map_mapInt64Int64_codec);
      size += mapUint32Uint32_.CalculateSize(_map_mapUint32Uint32_codec);
      size += mapUint64Uint64_.CalculateSize(_map_mapUint64Uint64_codec);
      size += mapSint32Sint32_.CalculateSize(_map_mapSint32Sint32_codec);
      size += mapSint64Sint64_.CalculateSize(_map_mapSint64Sint64_codec);
      size += mapFixed32Fixed32_.CalculateSize(_map_mapFixed32Fixed32_codec);
      size += mapFixed64Fixed64_.CalculateSize(_map_mapFixed64Fixed64_codec);
      size += mapSfixed32Sfixed32_.CalculateSize(_map_mapSfixed32Sfixed32_codec);
      size += mapSfixed64Sfixed64_.CalculateSize(_map_mapSfixed64Sfixed64_codec);
      size += mapInt32Float_.CalculateSize(_map_mapInt32Float_codec);
      size += mapInt32Double_.CalculateSize(_map_mapInt32Double_codec);
      size += mapBoolBool_.CalculateSize(_map_mapBoolBool_codec);
      size += mapStringString_.CalculateSize(_map_mapStringString_codec);
      size += mapInt32Bytes_.CalculateSize(_map_mapInt32Bytes_codec);
      size += mapInt32Enum_.CalculateSize(_map_mapInt32Enum_codec);
      size += mapInt32ForeignMessage_.CalculateSize(_map_mapInt32ForeignMessage_codec);
      return size;
    }

    public void MergeFrom(TestMap other) {
      if (other == null) {
        return;
      }
      mapInt32Int32_.Add(other.mapInt32Int32_);
      mapInt64Int64_.Add(other.mapInt64Int64_);
      mapUint32Uint32_.Add(other.mapUint32Uint32_);
      mapUint64Uint64_.Add(other.mapUint64Uint64_);
      mapSint32Sint32_.Add(other.mapSint32Sint32_);
      mapSint64Sint64_.Add(other.mapSint64Sint64_);
      mapFixed32Fixed32_.Add(other.mapFixed32Fixed32_);
      mapFixed64Fixed64_.Add(other.mapFixed64Fixed64_);
      mapSfixed32Sfixed32_.Add(other.mapSfixed32Sfixed32_);
      mapSfixed64Sfixed64_.Add(other.mapSfixed64Sfixed64_);
      mapInt32Float_.Add(other.mapInt32Float_);
      mapInt32Double_.Add(other.mapInt32Double_);
      mapBoolBool_.Add(other.mapBoolBool_);
      mapStringString_.Add(other.mapStringString_);
      mapInt32Bytes_.Add(other.mapInt32Bytes_);
      mapInt32Enum_.Add(other.mapInt32Enum_);
      mapInt32ForeignMessage_.Add(other.mapInt32ForeignMessage_);
    }

    public void MergeFrom(pb::CodedInputStream input) {
      uint tag;
      while (input.ReadTag(out tag)) {
        switch(tag) {
          case 0:
            throw pb::InvalidProtocolBufferException.InvalidTag();
          default:
            if (pb::WireFormat.IsEndGroupTag(tag)) {
              return;
            }
            break;
          case 10: {
            mapInt32Int32_.AddEntriesFrom(input, _map_mapInt32Int32_codec);
            break;
          }
          case 18: {
            mapInt64Int64_.AddEntriesFrom(input, _map_mapInt64Int64_codec);
            break;
          }
          case 26: {
            mapUint32Uint32_.AddEntriesFrom(input, _map_mapUint32Uint32_codec);
            break;
          }
          case 34: {
            mapUint64Uint64_.AddEntriesFrom(input, _map_mapUint64Uint64_codec);
            break;
          }
          case 42: {
            mapSint32Sint32_.AddEntriesFrom(input, _map_mapSint32Sint32_codec);
            break;
          }
          case 50: {
            mapSint64Sint64_.AddEntriesFrom(input, _map_mapSint64Sint64_codec);
            break;
          }
          case 58: {
            mapFixed32Fixed32_.AddEntriesFrom(input, _map_mapFixed32Fixed32_codec);
            break;
          }
          case 66: {
            mapFixed64Fixed64_.AddEntriesFrom(input, _map_mapFixed64Fixed64_codec);
            break;
          }
          case 74: {
            mapSfixed32Sfixed32_.AddEntriesFrom(input, _map_mapSfixed32Sfixed32_codec);
            break;
          }
          case 82: {
            mapSfixed64Sfixed64_.AddEntriesFrom(input, _map_mapSfixed64Sfixed64_codec);
            break;
          }
          case 90: {
            mapInt32Float_.AddEntriesFrom(input, _map_mapInt32Float_codec);
            break;
          }
          case 98: {
            mapInt32Double_.AddEntriesFrom(input, _map_mapInt32Double_codec);
            break;
          }
          case 106: {
            mapBoolBool_.AddEntriesFrom(input, _map_mapBoolBool_codec);
            break;
          }
          case 114: {
            mapStringString_.AddEntriesFrom(input, _map_mapStringString_codec);
            break;
          }
          case 122: {
            mapInt32Bytes_.AddEntriesFrom(input, _map_mapInt32Bytes_codec);
            break;
          }
          case 130: {
            mapInt32Enum_.AddEntriesFrom(input, _map_mapInt32Enum_codec);
            break;
          }
          case 138: {
            mapInt32ForeignMessage_.AddEntriesFrom(input, _map_mapInt32ForeignMessage_codec);
            break;
          }
        }
      }
    }

    #region Nested types
    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
    public static partial class Types {
      [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
      public sealed partial class MapInt32Int32Entry : pb::IMessage<MapInt32Int32Entry> {
        private static readonly pb::MessageParser<MapInt32Int32Entry> _parser = new pb::MessageParser<MapInt32Int32Entry>(() => new MapInt32Int32Entry());
        public static pb::MessageParser<MapInt32Int32Entry> Parser { get { return _parser; } }

        private static readonly string[] _fieldNames = new string[] { "key", "value" };
        private static readonly uint[] _fieldTags = new uint[] { 8, 16 };
        public static pbd::MessageDescriptor Descriptor {
          get { return global::Google.Protobuf.TestProtos.TestMap.Descriptor.NestedTypes[0]; }
        }

        public pb::FieldAccess.FieldAccessorTable Fields {
          get { return global::Google.Protobuf.TestProtos.MapUnittestProto3.internal__static_protobuf_unittest_TestMap_MapInt32Int32Entry__FieldAccessorTable; }
        }

        private bool _frozen = false;
        public bool IsFrozen { get { return _frozen; } }

        public MapInt32Int32Entry() {
          OnConstruction();
        }

        partial void OnConstruction();

        public MapInt32Int32Entry(MapInt32Int32Entry other) : this() {
          key_ = other.key_;
          value_ = other.value_;
        }

        public MapInt32Int32Entry Clone() {
          return new MapInt32Int32Entry(this);
        }

        public void Freeze() {
          if (IsFrozen) {
            return;
          }
          _frozen = true;
        }

        public const int KeyFieldNumber = 1;
        private int key_;
        public int Key {
          get { return key_; }
          set {
            pb::Freezable.CheckMutable(this);
            key_ = value;
          }
        }

        public const int ValueFieldNumber = 2;
        private int value_;
        public int Value {
          get { return value_; }
          set {
            pb::Freezable.CheckMutable(this);
            value_ = value;
          }
        }

        public override bool Equals(object other) {
          return Equals(other as MapInt32Int32Entry);
        }

        public bool Equals(MapInt32Int32Entry other) {
          if (ReferenceEquals(other, null)) {
            return false;
          }
          if (ReferenceEquals(other, this)) {
            return true;
          }
          if (Key != other.Key) return false;
          if (Value != other.Value) return false;
          return true;
        }

        public override int GetHashCode() {
          int hash = 1;
          if (Key != 0) hash ^= Key.GetHashCode();
          if (Value != 0) hash ^= Value.GetHashCode();
          return hash;
        }

        public void WriteTo(pb::CodedOutputStream output) {
          if (Key != 0) {
            output.WriteRawTag(8);
            output.WriteInt32(Key);
          }
          if (Value != 0) {
            output.WriteRawTag(16);
            output.WriteInt32(Value);
          }
        }

        public int CalculateSize() {
          int size = 0;
          if (Key != 0) {
            size += 1 + pb::CodedOutputStream.ComputeInt32Size(Key);
          }
          if (Value != 0) {
            size += 1 + pb::CodedOutputStream.ComputeInt32Size(Value);
          }
          return size;
        }

        public void MergeFrom(MapInt32Int32Entry other) {
          if (other == null) {
            return;
          }
          if (other.Key != 0) {
            Key = other.Key;
          }
          if (other.Value != 0) {
            Value = other.Value;
          }
        }

        public void MergeFrom(pb::CodedInputStream input) {
          uint tag;
          while (input.ReadTag(out tag)) {
            switch(tag) {
              case 0:
                throw pb::InvalidProtocolBufferException.InvalidTag();
              default:
                if (pb::WireFormat.IsEndGroupTag(tag)) {
                  return;
                }
                break;
              case 8: {
                Key = input.ReadInt32();
                break;
              }
              case 16: {
                Value = input.ReadInt32();
                break;
              }
            }
          }
        }

      }

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

        private static readonly string[] _fieldNames = new string[] { "key", "value" };
        private static readonly uint[] _fieldTags = new uint[] { 8, 16 };
        public static pbd::MessageDescriptor Descriptor {
          get { return global::Google.Protobuf.TestProtos.TestMap.Descriptor.NestedTypes[1]; }
        }

        public pb::FieldAccess.FieldAccessorTable Fields {
          get { return global::Google.Protobuf.TestProtos.MapUnittestProto3.internal__static_protobuf_unittest_TestMap_MapInt64Int64Entry__FieldAccessorTable; }
        }

        private bool _frozen = false;
        public bool IsFrozen { get { return _frozen; } }

        public MapInt64Int64Entry() {
          OnConstruction();
        }

        partial void OnConstruction();

        public MapInt64Int64Entry(MapInt64Int64Entry other) : this() {
          key_ = other.key_;
          value_ = other.value_;
        }

        public MapInt64Int64Entry Clone() {
          return new MapInt64Int64Entry(this);
        }

        public void Freeze() {
          if (IsFrozen) {
            return;
          }
          _frozen = true;
        }

        public const int KeyFieldNumber = 1;
        private long key_;
        public long Key {
          get { return key_; }
          set {
            pb::Freezable.CheckMutable(this);
            key_ = value;
          }
        }

        public const int ValueFieldNumber = 2;
        private long value_;
        public long Value {
          get { return value_; }
          set {
            pb::Freezable.CheckMutable(this);
            value_ = value;
          }
        }

        public override bool Equals(object other) {
          return Equals(other as MapInt64Int64Entry);
        }

        public bool Equals(MapInt64Int64Entry other) {
          if (ReferenceEquals(other, null)) {
            return false;
          }
          if (ReferenceEquals(other, this)) {
            return true;
          }
          if (Key != other.Key) return false;
          if (Value != other.Value) return false;
          return true;
        }

        public override int GetHashCode() {
          int hash = 1;
          if (Key != 0L) hash ^= Key.GetHashCode();
          if (Value != 0L) hash ^= Value.GetHashCode();
          return hash;
        }

        public void WriteTo(pb::CodedOutputStream output) {
          if (Key != 0L) {
            output.WriteRawTag(8);
            output.WriteInt64(Key);
          }
          if (Value != 0L) {
            output.WriteRawTag(16);
            output.WriteInt64(Value);
          }
        }

        public int CalculateSize() {
          int size = 0;
          if (Key != 0L) {
            size += 1 + pb::CodedOutputStream.ComputeInt64Size(Key);
          }
          if (Value != 0L) {
            size += 1 + pb::CodedOutputStream.ComputeInt64Size(Value);
          }
          return size;
        }

        public void MergeFrom(MapInt64Int64Entry other) {
          if (other == null) {
            return;
          }
          if (other.Key != 0L) {
            Key = other.Key;
          }
          if (other.Value != 0L) {
            Value = other.Value;
          }
        }

        public void MergeFrom(pb::CodedInputStream input) {
          uint tag;
          while (input.ReadTag(out tag)) {
            switch(tag) {
              case 0:
                throw pb::InvalidProtocolBufferException.InvalidTag();
              default:
                if (pb::WireFormat.IsEndGroupTag(tag)) {
                  return;
                }
                break;
              case 8: {
                Key = input.ReadInt64();
                break;
              }
              case 16: {
                Value = input.ReadInt64();
                break;
              }
            }
          }
        }

      }

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

        private static readonly string[] _fieldNames = new string[] { "key", "value" };
        private static readonly uint[] _fieldTags = new uint[] { 8, 16 };
        public static pbd::MessageDescriptor Descriptor {
          get { return global::Google.Protobuf.TestProtos.TestMap.Descriptor.NestedTypes[2]; }
        }

        public pb::FieldAccess.FieldAccessorTable Fields {
          get { return global::Google.Protobuf.TestProtos.MapUnittestProto3.internal__static_protobuf_unittest_TestMap_MapUint32Uint32Entry__FieldAccessorTable; }
        }

        private bool _frozen = false;
        public bool IsFrozen { get { return _frozen; } }

        public MapUint32Uint32Entry() {
          OnConstruction();
        }

        partial void OnConstruction();

        public MapUint32Uint32Entry(MapUint32Uint32Entry other) : this() {
          key_ = other.key_;
          value_ = other.value_;
        }

        public MapUint32Uint32Entry Clone() {
          return new MapUint32Uint32Entry(this);
        }

        public void Freeze() {
          if (IsFrozen) {
            return;
          }
          _frozen = true;
        }

        public const int KeyFieldNumber = 1;
        private uint key_;
        public uint Key {
          get { return key_; }
          set {
            pb::Freezable.CheckMutable(this);
            key_ = value;
          }
        }

        public const int ValueFieldNumber = 2;
        private uint value_;
        public uint Value {
          get { return value_; }
          set {
            pb::Freezable.CheckMutable(this);
            value_ = value;
          }
        }

        public override bool Equals(object other) {
          return Equals(other as MapUint32Uint32Entry);
        }

        public bool Equals(MapUint32Uint32Entry other) {
          if (ReferenceEquals(other, null)) {
            return false;
          }
          if (ReferenceEquals(other, this)) {
            return true;
          }
          if (Key != other.Key) return false;
          if (Value != other.Value) return false;
          return true;
        }

        public override int GetHashCode() {
          int hash = 1;
          if (Key != 0) hash ^= Key.GetHashCode();
          if (Value != 0) hash ^= Value.GetHashCode();
          return hash;
        }

        public void WriteTo(pb::CodedOutputStream output) {
          if (Key != 0) {
            output.WriteRawTag(8);
            output.WriteUInt32(Key);
          }
          if (Value != 0) {
            output.WriteRawTag(16);
            output.WriteUInt32(Value);
          }
        }

        public int CalculateSize() {
          int size = 0;
          if (Key != 0) {
            size += 1 + pb::CodedOutputStream.ComputeUInt32Size(Key);
          }
          if (Value != 0) {
            size += 1 + pb::CodedOutputStream.ComputeUInt32Size(Value);
          }
          return size;
        }

        public void MergeFrom(MapUint32Uint32Entry other) {
          if (other == null) {
            return;
          }
          if (other.Key != 0) {
            Key = other.Key;
          }
          if (other.Value != 0) {
            Value = other.Value;
          }
        }

        public void MergeFrom(pb::CodedInputStream input) {
          uint tag;
          while (input.ReadTag(out tag)) {
            switch(tag) {
              case 0:
                throw pb::InvalidProtocolBufferException.InvalidTag();
              default:
                if (pb::WireFormat.IsEndGroupTag(tag)) {
                  return;
                }
                break;
              case 8: {
                Key = input.ReadUInt32();
                break;
              }
              case 16: {
                Value = input.ReadUInt32();
                break;
              }
            }
          }
        }

      }

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

        private static readonly string[] _fieldNames = new string[] { "key", "value" };
        private static readonly uint[] _fieldTags = new uint[] { 8, 16 };
        public static pbd::MessageDescriptor Descriptor {
          get { return global::Google.Protobuf.TestProtos.TestMap.Descriptor.NestedTypes[3]; }
        }

        public pb::FieldAccess.FieldAccessorTable Fields {
          get { return global::Google.Protobuf.TestProtos.MapUnittestProto3.internal__static_protobuf_unittest_TestMap_MapUint64Uint64Entry__FieldAccessorTable; }
        }

        private bool _frozen = false;
        public bool IsFrozen { get { return _frozen; } }

        public MapUint64Uint64Entry() {
          OnConstruction();
        }

        partial void OnConstruction();

        public MapUint64Uint64Entry(MapUint64Uint64Entry other) : this() {
          key_ = other.key_;
          value_ = other.value_;
        }

        public MapUint64Uint64Entry Clone() {
          return new MapUint64Uint64Entry(this);
        }

        public void Freeze() {
          if (IsFrozen) {
            return;
          }
          _frozen = true;
        }

        public const int KeyFieldNumber = 1;
        private ulong key_;
        public ulong Key {
          get { return key_; }
          set {
            pb::Freezable.CheckMutable(this);
            key_ = value;
          }
        }

        public const int ValueFieldNumber = 2;
        private ulong value_;
        public ulong Value {
          get { return value_; }
          set {
            pb::Freezable.CheckMutable(this);
            value_ = value;
          }
        }

        public override bool Equals(object other) {
          return Equals(other as MapUint64Uint64Entry);
        }

        public bool Equals(MapUint64Uint64Entry other) {
          if (ReferenceEquals(other, null)) {
            return false;
          }
          if (ReferenceEquals(other, this)) {
            return true;
          }
          if (Key != other.Key) return false;
          if (Value != other.Value) return false;
          return true;
        }

        public override int GetHashCode() {
          int hash = 1;
          if (Key != 0UL) hash ^= Key.GetHashCode();
          if (Value != 0UL) hash ^= Value.GetHashCode();
          return hash;
        }

        public void WriteTo(pb::CodedOutputStream output) {
          if (Key != 0UL) {
            output.WriteRawTag(8);
            output.WriteUInt64(Key);
          }
          if (Value != 0UL) {
            output.WriteRawTag(16);
            output.WriteUInt64(Value);
          }
        }

        public int CalculateSize() {
          int size = 0;
          if (Key != 0UL) {
            size += 1 + pb::CodedOutputStream.ComputeUInt64Size(Key);
          }
          if (Value != 0UL) {
            size += 1 + pb::CodedOutputStream.ComputeUInt64Size(Value);
          }
          return size;
        }

        public void MergeFrom(MapUint64Uint64Entry other) {
          if (other == null) {
            return;
          }
          if (other.Key != 0UL) {
            Key = other.Key;
          }
          if (other.Value != 0UL) {
            Value = other.Value;
          }
        }

        public void MergeFrom(pb::CodedInputStream input) {
          uint tag;
          while (input.ReadTag(out tag)) {
            switch(tag) {
              case 0:
                throw pb::InvalidProtocolBufferException.InvalidTag();
              default:
                if (pb::WireFormat.IsEndGroupTag(tag)) {
                  return;
                }
                break;
              case 8: {
                Key = input.ReadUInt64();
                break;
              }
              case 16: {
                Value = input.ReadUInt64();
                break;
              }
            }
          }
        }

      }

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

        private static readonly string[] _fieldNames = new string[] { "key", "value" };
        private static readonly uint[] _fieldTags = new uint[] { 8, 16 };
        public static pbd::MessageDescriptor Descriptor {
          get { return global::Google.Protobuf.TestProtos.TestMap.Descriptor.NestedTypes[4]; }
        }

        public pb::FieldAccess.FieldAccessorTable Fields {
          get { return global::Google.Protobuf.TestProtos.MapUnittestProto3.internal__static_protobuf_unittest_TestMap_MapSint32Sint32Entry__FieldAccessorTable; }
        }

        private bool _frozen = false;
        public bool IsFrozen { get { return _frozen; } }

        public MapSint32Sint32Entry() {
          OnConstruction();
        }

        partial void OnConstruction();

        public MapSint32Sint32Entry(MapSint32Sint32Entry other) : this() {
          key_ = other.key_;
          value_ = other.value_;
        }

        public MapSint32Sint32Entry Clone() {
          return new MapSint32Sint32Entry(this);
        }

        public void Freeze() {
          if (IsFrozen) {
            return;
          }
          _frozen = true;
        }

        public const int KeyFieldNumber = 1;
        private int key_;
        public int Key {
          get { return key_; }
          set {
            pb::Freezable.CheckMutable(this);
            key_ = value;
          }
        }

        public const int ValueFieldNumber = 2;
        private int value_;
        public int Value {
          get { return value_; }
          set {
            pb::Freezable.CheckMutable(this);
            value_ = value;
          }
        }

        public override bool Equals(object other) {
          return Equals(other as MapSint32Sint32Entry);
        }

        public bool Equals(MapSint32Sint32Entry other) {
          if (ReferenceEquals(other, null)) {
            return false;
          }
          if (ReferenceEquals(other, this)) {
            return true;
          }
          if (Key != other.Key) return false;
          if (Value != other.Value) return false;
          return true;
        }

        public override int GetHashCode() {
          int hash = 1;
          if (Key != 0) hash ^= Key.GetHashCode();
          if (Value != 0) hash ^= Value.GetHashCode();
          return hash;
        }

        public void WriteTo(pb::CodedOutputStream output) {
          if (Key != 0) {
            output.WriteRawTag(8);
            output.WriteSInt32(Key);
          }
          if (Value != 0) {
            output.WriteRawTag(16);
            output.WriteSInt32(Value);
          }
        }

        public int CalculateSize() {
          int size = 0;
          if (Key != 0) {
            size += 1 + pb::CodedOutputStream.ComputeSInt32Size(Key);
          }
          if (Value != 0) {
            size += 1 + pb::CodedOutputStream.ComputeSInt32Size(Value);
          }
          return size;
        }

        public void MergeFrom(MapSint32Sint32Entry other) {
          if (other == null) {
            return;
          }
          if (other.Key != 0) {
            Key = other.Key;
          }
          if (other.Value != 0) {
            Value = other.Value;
          }
        }

        public void MergeFrom(pb::CodedInputStream input) {
          uint tag;
          while (input.ReadTag(out tag)) {
            switch(tag) {
              case 0:
                throw pb::InvalidProtocolBufferException.InvalidTag();
              default:
                if (pb::WireFormat.IsEndGroupTag(tag)) {
                  return;
                }
                break;
              case 8: {
                Key = input.ReadSInt32();
                break;
              }
              case 16: {
                Value = input.ReadSInt32();
                break;
              }
            }
          }
        }

      }

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

        private static readonly string[] _fieldNames = new string[] { "key", "value" };
        private static readonly uint[] _fieldTags = new uint[] { 8, 16 };
        public static pbd::MessageDescriptor Descriptor {
          get { return global::Google.Protobuf.TestProtos.TestMap.Descriptor.NestedTypes[5]; }
        }

        public pb::FieldAccess.FieldAccessorTable Fields {
          get { return global::Google.Protobuf.TestProtos.MapUnittestProto3.internal__static_protobuf_unittest_TestMap_MapSint64Sint64Entry__FieldAccessorTable; }
        }

        private bool _frozen = false;
        public bool IsFrozen { get { return _frozen; } }

        public MapSint64Sint64Entry() {
          OnConstruction();
        }

        partial void OnConstruction();

        public MapSint64Sint64Entry(MapSint64Sint64Entry other) : this() {
          key_ = other.key_;
          value_ = other.value_;
        }

        public MapSint64Sint64Entry Clone() {
          return new MapSint64Sint64Entry(this);
        }

        public void Freeze() {
          if (IsFrozen) {
            return;
          }
          _frozen = true;
        }

        public const int KeyFieldNumber = 1;
        private long key_;
        public long Key {
          get { return key_; }
          set {
            pb::Freezable.CheckMutable(this);
            key_ = value;
          }
        }

        public const int ValueFieldNumber = 2;
        private long value_;
        public long Value {
          get { return value_; }
          set {
            pb::Freezable.CheckMutable(this);
            value_ = value;
          }
        }

        public override bool Equals(object other) {
          return Equals(other as MapSint64Sint64Entry);
        }

        public bool Equals(MapSint64Sint64Entry other) {
          if (ReferenceEquals(other, null)) {
            return false;
          }
          if (ReferenceEquals(other, this)) {
            return true;
          }
          if (Key != other.Key) return false;
          if (Value != other.Value) return false;
          return true;
        }

        public override int GetHashCode() {
          int hash = 1;
          if (Key != 0L) hash ^= Key.GetHashCode();
          if (Value != 0L) hash ^= Value.GetHashCode();
          return hash;
        }

        public void WriteTo(pb::CodedOutputStream output) {
          if (Key != 0L) {
            output.WriteRawTag(8);
            output.WriteSInt64(Key);
          }
          if (Value != 0L) {
            output.WriteRawTag(16);
            output.WriteSInt64(Value);
          }
        }

        public int CalculateSize() {
          int size = 0;
          if (Key != 0L) {
            size += 1 + pb::CodedOutputStream.ComputeSInt64Size(Key);
          }
          if (Value != 0L) {
            size += 1 + pb::CodedOutputStream.ComputeSInt64Size(Value);
          }
          return size;
        }

        public void MergeFrom(MapSint64Sint64Entry other) {
          if (other == null) {
            return;
          }
          if (other.Key != 0L) {
            Key = other.Key;
          }
          if (other.Value != 0L) {
            Value = other.Value;
          }
        }

        public void MergeFrom(pb::CodedInputStream input) {
          uint tag;
          while (input.ReadTag(out tag)) {
            switch(tag) {
              case 0:
                throw pb::InvalidProtocolBufferException.InvalidTag();
              default:
                if (pb::WireFormat.IsEndGroupTag(tag)) {
                  return;
                }
                break;
              case 8: {
                Key = input.ReadSInt64();
                break;
              }
              case 16: {
                Value = input.ReadSInt64();
                break;
              }
            }
          }
        }

      }

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

        private static readonly string[] _fieldNames = new string[] { "key", "value" };
        private static readonly uint[] _fieldTags = new uint[] { 13, 21 };
        public static pbd::MessageDescriptor Descriptor {
          get { return global::Google.Protobuf.TestProtos.TestMap.Descriptor.NestedTypes[6]; }
        }

        public pb::FieldAccess.FieldAccessorTable Fields {
          get { return global::Google.Protobuf.TestProtos.MapUnittestProto3.internal__static_protobuf_unittest_TestMap_MapFixed32Fixed32Entry__FieldAccessorTable; }
        }

        private bool _frozen = false;
        public bool IsFrozen { get { return _frozen; } }

        public MapFixed32Fixed32Entry() {
          OnConstruction();
        }

        partial void OnConstruction();

        public MapFixed32Fixed32Entry(MapFixed32Fixed32Entry other) : this() {
          key_ = other.key_;
          value_ = other.value_;
        }

        public MapFixed32Fixed32Entry Clone() {
          return new MapFixed32Fixed32Entry(this);
        }

        public void Freeze() {
          if (IsFrozen) {
            return;
          }
          _frozen = true;
        }

        public const int KeyFieldNumber = 1;
        private uint key_;
        public uint Key {
          get { return key_; }
          set {
            pb::Freezable.CheckMutable(this);
            key_ = value;
          }
        }

        public const int ValueFieldNumber = 2;
        private uint value_;
        public uint Value {
          get { return value_; }
          set {
            pb::Freezable.CheckMutable(this);
            value_ = value;
          }
        }

        public override bool Equals(object other) {
          return Equals(other as MapFixed32Fixed32Entry);
        }

        public bool Equals(MapFixed32Fixed32Entry other) {
          if (ReferenceEquals(other, null)) {
            return false;
          }
          if (ReferenceEquals(other, this)) {
            return true;
          }
          if (Key != other.Key) return false;
          if (Value != other.Value) return false;
          return true;
        }

        public override int GetHashCode() {
          int hash = 1;
          if (Key != 0) hash ^= Key.GetHashCode();
          if (Value != 0) hash ^= Value.GetHashCode();
          return hash;
        }

        public void WriteTo(pb::CodedOutputStream output) {
          if (Key != 0) {
            output.WriteRawTag(13);
            output.WriteFixed32(Key);
          }
          if (Value != 0) {
            output.WriteRawTag(21);
            output.WriteFixed32(Value);
          }
        }

        public int CalculateSize() {
          int size = 0;
          if (Key != 0) {
            size += 1 + 4;
          }
          if (Value != 0) {
            size += 1 + 4;
          }
          return size;
        }

        public void MergeFrom(MapFixed32Fixed32Entry other) {
          if (other == null) {
            return;
          }
          if (other.Key != 0) {
            Key = other.Key;
          }
          if (other.Value != 0) {
            Value = other.Value;
          }
        }

        public void MergeFrom(pb::CodedInputStream input) {
          uint tag;
          while (input.ReadTag(out tag)) {
            switch(tag) {
              case 0:
                throw pb::InvalidProtocolBufferException.InvalidTag();
              default:
                if (pb::WireFormat.IsEndGroupTag(tag)) {
                  return;
                }
                break;
              case 13: {
                Key = input.ReadFixed32();
                break;
              }
              case 21: {
                Value = input.ReadFixed32();
                break;
              }
            }
          }
        }

      }

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

        private static readonly string[] _fieldNames = new string[] { "key", "value" };
        private static readonly uint[] _fieldTags = new uint[] { 9, 17 };
        public static pbd::MessageDescriptor Descriptor {
          get { return global::Google.Protobuf.TestProtos.TestMap.Descriptor.NestedTypes[7]; }
        }

        public pb::FieldAccess.FieldAccessorTable Fields {
          get { return global::Google.Protobuf.TestProtos.MapUnittestProto3.internal__static_protobuf_unittest_TestMap_MapFixed64Fixed64Entry__FieldAccessorTable; }
        }

        private bool _frozen = false;
        public bool IsFrozen { get { return _frozen; } }

        public MapFixed64Fixed64Entry() {
          OnConstruction();
        }

        partial void OnConstruction();

        public MapFixed64Fixed64Entry(MapFixed64Fixed64Entry other) : this() {
          key_ = other.key_;
          value_ = other.value_;
        }

        public MapFixed64Fixed64Entry Clone() {
          return new MapFixed64Fixed64Entry(this);
        }

        public void Freeze() {
          if (IsFrozen) {
            return;
          }
          _frozen = true;
        }

        public const int KeyFieldNumber = 1;
        private ulong key_;
        public ulong Key {
          get { return key_; }
          set {
            pb::Freezable.CheckMutable(this);
            key_ = value;
          }
        }

        public const int ValueFieldNumber = 2;
        private ulong value_;
        public ulong Value {
          get { return value_; }
          set {
            pb::Freezable.CheckMutable(this);
            value_ = value;
          }
        }

        public override bool Equals(object other) {
          return Equals(other as MapFixed64Fixed64Entry);
        }

        public bool Equals(MapFixed64Fixed64Entry other) {
          if (ReferenceEquals(other, null)) {
            return false;
          }
          if (ReferenceEquals(other, this)) {
            return true;
          }
          if (Key != other.Key) return false;
          if (Value != other.Value) return false;
          return true;
        }

        public override int GetHashCode() {
          int hash = 1;
          if (Key != 0UL) hash ^= Key.GetHashCode();
          if (Value != 0UL) hash ^= Value.GetHashCode();
          return hash;
        }

        public void WriteTo(pb::CodedOutputStream output) {
          if (Key != 0UL) {
            output.WriteRawTag(9);
            output.WriteFixed64(Key);
          }
          if (Value != 0UL) {
            output.WriteRawTag(17);
            output.WriteFixed64(Value);
          }
        }

        public int CalculateSize() {
          int size = 0;
          if (Key != 0UL) {
            size += 1 + 8;
          }
          if (Value != 0UL) {
            size += 1 + 8;
          }
          return size;
        }

        public void MergeFrom(MapFixed64Fixed64Entry other) {
          if (other == null) {
            return;
          }
          if (other.Key != 0UL) {
            Key = other.Key;
          }
          if (other.Value != 0UL) {
            Value = other.Value;
          }
        }

        public void MergeFrom(pb::CodedInputStream input) {
          uint tag;
          while (input.ReadTag(out tag)) {
            switch(tag) {
              case 0:
                throw pb::InvalidProtocolBufferException.InvalidTag();
              default:
                if (pb::WireFormat.IsEndGroupTag(tag)) {
                  return;
                }
                break;
              case 9: {
                Key = input.ReadFixed64();
                break;
              }
              case 17: {
                Value = input.ReadFixed64();
                break;
              }
            }
          }
        }

      }

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

        private static readonly string[] _fieldNames = new string[] { "key", "value" };
        private static readonly uint[] _fieldTags = new uint[] { 13, 21 };
        public static pbd::MessageDescriptor Descriptor {
          get { return global::Google.Protobuf.TestProtos.TestMap.Descriptor.NestedTypes[8]; }
        }

        public pb::FieldAccess.FieldAccessorTable Fields {
          get { return global::Google.Protobuf.TestProtos.MapUnittestProto3.internal__static_protobuf_unittest_TestMap_MapSfixed32Sfixed32Entry__FieldAccessorTable; }
        }

        private bool _frozen = false;
        public bool IsFrozen { get { return _frozen; } }

        public MapSfixed32Sfixed32Entry() {
          OnConstruction();
        }

        partial void OnConstruction();

        public MapSfixed32Sfixed32Entry(MapSfixed32Sfixed32Entry other) : this() {
          key_ = other.key_;
          value_ = other.value_;
        }

        public MapSfixed32Sfixed32Entry Clone() {
          return new MapSfixed32Sfixed32Entry(this);
        }

        public void Freeze() {
          if (IsFrozen) {
            return;
          }
          _frozen = true;
        }

        public const int KeyFieldNumber = 1;
        private int key_;
        public int Key {
          get { return key_; }
          set {
            pb::Freezable.CheckMutable(this);
            key_ = value;
          }
        }

        public const int ValueFieldNumber = 2;
        private int value_;
        public int Value {
          get { return value_; }
          set {
            pb::Freezable.CheckMutable(this);
            value_ = value;
          }
        }

        public override bool Equals(object other) {
          return Equals(other as MapSfixed32Sfixed32Entry);
        }

        public bool Equals(MapSfixed32Sfixed32Entry other) {
          if (ReferenceEquals(other, null)) {
            return false;
          }
          if (ReferenceEquals(other, this)) {
            return true;
          }
          if (Key != other.Key) return false;
          if (Value != other.Value) return false;
          return true;
        }

        public override int GetHashCode() {
          int hash = 1;
          if (Key != 0) hash ^= Key.GetHashCode();
          if (Value != 0) hash ^= Value.GetHashCode();
          return hash;
        }

        public void WriteTo(pb::CodedOutputStream output) {
          if (Key != 0) {
            output.WriteRawTag(13);
            output.WriteSFixed32(Key);
          }
          if (Value != 0) {
            output.WriteRawTag(21);
            output.WriteSFixed32(Value);
          }
        }

        public int CalculateSize() {
          int size = 0;
          if (Key != 0) {
            size += 1 + 4;
          }
          if (Value != 0) {
            size += 1 + 4;
          }
          return size;
        }

        public void MergeFrom(MapSfixed32Sfixed32Entry other) {
          if (other == null) {
            return;
          }
          if (other.Key != 0) {
            Key = other.Key;
          }
          if (other.Value != 0) {
            Value = other.Value;
          }
        }

        public void MergeFrom(pb::CodedInputStream input) {
          uint tag;
          while (input.ReadTag(out tag)) {
            switch(tag) {
              case 0:
                throw pb::InvalidProtocolBufferException.InvalidTag();
              default:
                if (pb::WireFormat.IsEndGroupTag(tag)) {
                  return;
                }
                break;
              case 13: {
                Key = input.ReadSFixed32();
                break;
              }
              case 21: {
                Value = input.ReadSFixed32();
                break;
              }
            }
          }
        }

      }

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

        private static readonly string[] _fieldNames = new string[] { "key", "value" };
        private static readonly uint[] _fieldTags = new uint[] { 9, 17 };
        public static pbd::MessageDescriptor Descriptor {
          get { return global::Google.Protobuf.TestProtos.TestMap.Descriptor.NestedTypes[9]; }
        }

        public pb::FieldAccess.FieldAccessorTable Fields {
          get { return global::Google.Protobuf.TestProtos.MapUnittestProto3.internal__static_protobuf_unittest_TestMap_MapSfixed64Sfixed64Entry__FieldAccessorTable; }
        }

        private bool _frozen = false;
        public bool IsFrozen { get { return _frozen; } }

        public MapSfixed64Sfixed64Entry() {
          OnConstruction();
        }

        partial void OnConstruction();

        public MapSfixed64Sfixed64Entry(MapSfixed64Sfixed64Entry other) : this() {
          key_ = other.key_;
          value_ = other.value_;
        }

        public MapSfixed64Sfixed64Entry Clone() {
          return new MapSfixed64Sfixed64Entry(this);
        }

        public void Freeze() {
          if (IsFrozen) {
            return;
          }
          _frozen = true;
        }

        public const int KeyFieldNumber = 1;
        private long key_;
        public long Key {
          get { return key_; }
          set {
            pb::Freezable.CheckMutable(this);
            key_ = value;
          }
        }

        public const int ValueFieldNumber = 2;
        private long value_;
        public long Value {
          get { return value_; }
          set {
            pb::Freezable.CheckMutable(this);
            value_ = value;
          }
        }

        public override bool Equals(object other) {
          return Equals(other as MapSfixed64Sfixed64Entry);
        }

        public bool Equals(MapSfixed64Sfixed64Entry other) {
          if (ReferenceEquals(other, null)) {
            return false;
          }
          if (ReferenceEquals(other, this)) {
            return true;
          }
          if (Key != other.Key) return false;
          if (Value != other.Value) return false;
          return true;
        }

        public override int GetHashCode() {
          int hash = 1;
          if (Key != 0L) hash ^= Key.GetHashCode();
          if (Value != 0L) hash ^= Value.GetHashCode();
          return hash;
        }

        public void WriteTo(pb::CodedOutputStream output) {
          if (Key != 0L) {
            output.WriteRawTag(9);
            output.WriteSFixed64(Key);
          }
          if (Value != 0L) {
            output.WriteRawTag(17);
            output.WriteSFixed64(Value);
          }
        }

        public int CalculateSize() {
          int size = 0;
          if (Key != 0L) {
            size += 1 + 8;
          }
          if (Value != 0L) {
            size += 1 + 8;
          }
          return size;
        }

        public void MergeFrom(MapSfixed64Sfixed64Entry other) {
          if (other == null) {
            return;
          }
          if (other.Key != 0L) {
            Key = other.Key;
          }
          if (other.Value != 0L) {
            Value = other.Value;
          }
        }

        public void MergeFrom(pb::CodedInputStream input) {
          uint tag;
          while (input.ReadTag(out tag)) {
            switch(tag) {
              case 0:
                throw pb::InvalidProtocolBufferException.InvalidTag();
              default:
                if (pb::WireFormat.IsEndGroupTag(tag)) {
                  return;
                }
                break;
              case 9: {
                Key = input.ReadSFixed64();
                break;
              }
              case 17: {
                Value = input.ReadSFixed64();
                break;
              }
            }
          }
        }

      }

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

        private static readonly string[] _fieldNames = new string[] { "key", "value" };
        private static readonly uint[] _fieldTags = new uint[] { 8, 21 };
        public static pbd::MessageDescriptor Descriptor {
          get { return global::Google.Protobuf.TestProtos.TestMap.Descriptor.NestedTypes[10]; }
        }

        public pb::FieldAccess.FieldAccessorTable Fields {
          get { return global::Google.Protobuf.TestProtos.MapUnittestProto3.internal__static_protobuf_unittest_TestMap_MapInt32FloatEntry__FieldAccessorTable; }
        }

        private bool _frozen = false;
        public bool IsFrozen { get { return _frozen; } }

        public MapInt32FloatEntry() {
          OnConstruction();
        }

        partial void OnConstruction();

        public MapInt32FloatEntry(MapInt32FloatEntry other) : this() {
          key_ = other.key_;
          value_ = other.value_;
        }

        public MapInt32FloatEntry Clone() {
          return new MapInt32FloatEntry(this);
        }

        public void Freeze() {
          if (IsFrozen) {
            return;
          }
          _frozen = true;
        }

        public const int KeyFieldNumber = 1;
        private int key_;
        public int Key {
          get { return key_; }
          set {
            pb::Freezable.CheckMutable(this);
            key_ = value;
          }
        }

        public const int ValueFieldNumber = 2;
        private float value_;
        public float Value {
          get { return value_; }
          set {
            pb::Freezable.CheckMutable(this);
            value_ = value;
          }
        }

        public override bool Equals(object other) {
          return Equals(other as MapInt32FloatEntry);
        }

        public bool Equals(MapInt32FloatEntry other) {
          if (ReferenceEquals(other, null)) {
            return false;
          }
          if (ReferenceEquals(other, this)) {
            return true;
          }
          if (Key != other.Key) return false;
          if (Value != other.Value) return false;
          return true;
        }

        public override int GetHashCode() {
          int hash = 1;
          if (Key != 0) hash ^= Key.GetHashCode();
          if (Value != 0F) hash ^= Value.GetHashCode();
          return hash;
        }

        public void WriteTo(pb::CodedOutputStream output) {
          if (Key != 0) {
            output.WriteRawTag(8);
            output.WriteInt32(Key);
          }
          if (Value != 0F) {
            output.WriteRawTag(21);
            output.WriteFloat(Value);
          }
        }

        public int CalculateSize() {
          int size = 0;
          if (Key != 0) {
            size += 1 + pb::CodedOutputStream.ComputeInt32Size(Key);
          }
          if (Value != 0F) {
            size += 1 + 4;
          }
          return size;
        }

        public void MergeFrom(MapInt32FloatEntry other) {
          if (other == null) {
            return;
          }
          if (other.Key != 0) {
            Key = other.Key;
          }
          if (other.Value != 0F) {
            Value = other.Value;
          }
        }

        public void MergeFrom(pb::CodedInputStream input) {
          uint tag;
          while (input.ReadTag(out tag)) {
            switch(tag) {
              case 0:
                throw pb::InvalidProtocolBufferException.InvalidTag();
              default:
                if (pb::WireFormat.IsEndGroupTag(tag)) {
                  return;
                }
                break;
              case 8: {
                Key = input.ReadInt32();
                break;
              }
              case 21: {
                Value = input.ReadFloat();
                break;
              }
            }
          }
        }

      }

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

        private static readonly string[] _fieldNames = new string[] { "key", "value" };
        private static readonly uint[] _fieldTags = new uint[] { 8, 17 };
        public static pbd::MessageDescriptor Descriptor {
          get { return global::Google.Protobuf.TestProtos.TestMap.Descriptor.NestedTypes[11]; }
        }

        public pb::FieldAccess.FieldAccessorTable Fields {
          get { return global::Google.Protobuf.TestProtos.MapUnittestProto3.internal__static_protobuf_unittest_TestMap_MapInt32DoubleEntry__FieldAccessorTable; }
        }

        private bool _frozen = false;
        public bool IsFrozen { get { return _frozen; } }

        public MapInt32DoubleEntry() {
          OnConstruction();
        }

        partial void OnConstruction();

        public MapInt32DoubleEntry(MapInt32DoubleEntry other) : this() {
          key_ = other.key_;
          value_ = other.value_;
        }

        public MapInt32DoubleEntry Clone() {
          return new MapInt32DoubleEntry(this);
        }

        public void Freeze() {
          if (IsFrozen) {
            return;
          }
          _frozen = true;
        }

        public const int KeyFieldNumber = 1;
        private int key_;
        public int Key {
          get { return key_; }
          set {
            pb::Freezable.CheckMutable(this);
            key_ = value;
          }
        }

        public const int ValueFieldNumber = 2;
        private double value_;
        public double Value {
          get { return value_; }
          set {
            pb::Freezable.CheckMutable(this);
            value_ = value;
          }
        }

        public override bool Equals(object other) {
          return Equals(other as MapInt32DoubleEntry);
        }

        public bool Equals(MapInt32DoubleEntry other) {
          if (ReferenceEquals(other, null)) {
            return false;
          }
          if (ReferenceEquals(other, this)) {
            return true;
          }
          if (Key != other.Key) return false;
          if (Value != other.Value) return false;
          return true;
        }

        public override int GetHashCode() {
          int hash = 1;
          if (Key != 0) hash ^= Key.GetHashCode();
          if (Value != 0D) hash ^= Value.GetHashCode();
          return hash;
        }

        public void WriteTo(pb::CodedOutputStream output) {
          if (Key != 0) {
            output.WriteRawTag(8);
            output.WriteInt32(Key);
          }
          if (Value != 0D) {
            output.WriteRawTag(17);
            output.WriteDouble(Value);
          }
        }

        public int CalculateSize() {
          int size = 0;
          if (Key != 0) {
            size += 1 + pb::CodedOutputStream.ComputeInt32Size(Key);
          }
          if (Value != 0D) {
            size += 1 + 8;
          }
          return size;
        }

        public void MergeFrom(MapInt32DoubleEntry other) {
          if (other == null) {
            return;
          }
          if (other.Key != 0) {
            Key = other.Key;
          }
          if (other.Value != 0D) {
            Value = other.Value;
          }
        }

        public void MergeFrom(pb::CodedInputStream input) {
          uint tag;
          while (input.ReadTag(out tag)) {
            switch(tag) {
              case 0:
                throw pb::InvalidProtocolBufferException.InvalidTag();
              default:
                if (pb::WireFormat.IsEndGroupTag(tag)) {
                  return;
                }
                break;
              case 8: {
                Key = input.ReadInt32();
                break;
              }
              case 17: {
                Value = input.ReadDouble();
                break;
              }
            }
          }
        }

      }

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

        private static readonly string[] _fieldNames = new string[] { "key", "value" };
        private static readonly uint[] _fieldTags = new uint[] { 8, 16 };
        public static pbd::MessageDescriptor Descriptor {
          get { return global::Google.Protobuf.TestProtos.TestMap.Descriptor.NestedTypes[12]; }
        }

        public pb::FieldAccess.FieldAccessorTable Fields {
          get { return global::Google.Protobuf.TestProtos.MapUnittestProto3.internal__static_protobuf_unittest_TestMap_MapBoolBoolEntry__FieldAccessorTable; }
        }

        private bool _frozen = false;
        public bool IsFrozen { get { return _frozen; } }

        public MapBoolBoolEntry() {
          OnConstruction();
        }

        partial void OnConstruction();

        public MapBoolBoolEntry(MapBoolBoolEntry other) : this() {
          key_ = other.key_;
          value_ = other.value_;
        }

        public MapBoolBoolEntry Clone() {
          return new MapBoolBoolEntry(this);
        }

        public void Freeze() {
          if (IsFrozen) {
            return;
          }
          _frozen = true;
        }

        public const int KeyFieldNumber = 1;
        private bool key_;
        public bool Key {
          get { return key_; }
          set {
            pb::Freezable.CheckMutable(this);
            key_ = value;
          }
        }

        public const int ValueFieldNumber = 2;
        private bool value_;
        public bool Value {
          get { return value_; }
          set {
            pb::Freezable.CheckMutable(this);
            value_ = value;
          }
        }

        public override bool Equals(object other) {
          return Equals(other as MapBoolBoolEntry);
        }

        public bool Equals(MapBoolBoolEntry other) {
          if (ReferenceEquals(other, null)) {
            return false;
          }
          if (ReferenceEquals(other, this)) {
            return true;
          }
          if (Key != other.Key) return false;
          if (Value != other.Value) return false;
          return true;
        }

        public override int GetHashCode() {
          int hash = 1;
          if (Key != false) hash ^= Key.GetHashCode();
          if (Value != false) hash ^= Value.GetHashCode();
          return hash;
        }

        public void WriteTo(pb::CodedOutputStream output) {
          if (Key != false) {
            output.WriteRawTag(8);
            output.WriteBool(Key);
          }
          if (Value != false) {
            output.WriteRawTag(16);
            output.WriteBool(Value);
          }
        }

        public int CalculateSize() {
          int size = 0;
          if (Key != false) {
            size += 1 + 1;
          }
          if (Value != false) {
            size += 1 + 1;
          }
          return size;
        }

        public void MergeFrom(MapBoolBoolEntry other) {
          if (other == null) {
            return;
          }
          if (other.Key != false) {
            Key = other.Key;
          }
          if (other.Value != false) {
            Value = other.Value;
          }
        }

        public void MergeFrom(pb::CodedInputStream input) {
          uint tag;
          while (input.ReadTag(out tag)) {
            switch(tag) {
              case 0:
                throw pb::InvalidProtocolBufferException.InvalidTag();
              default:
                if (pb::WireFormat.IsEndGroupTag(tag)) {
                  return;
                }
                break;
              case 8: {
                Key = input.ReadBool();
                break;
              }
              case 16: {
                Value = input.ReadBool();
                break;
              }
            }
          }
        }

      }

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

        private static readonly string[] _fieldNames = new string[] { "key", "value" };
        private static readonly uint[] _fieldTags = new uint[] { 10, 18 };
        public static pbd::MessageDescriptor Descriptor {
          get { return global::Google.Protobuf.TestProtos.TestMap.Descriptor.NestedTypes[13]; }
        }

        public pb::FieldAccess.FieldAccessorTable Fields {
          get { return global::Google.Protobuf.TestProtos.MapUnittestProto3.internal__static_protobuf_unittest_TestMap_MapStringStringEntry__FieldAccessorTable; }
        }

        private bool _frozen = false;
        public bool IsFrozen { get { return _frozen; } }

        public MapStringStringEntry() {
          OnConstruction();
        }

        partial void OnConstruction();

        public MapStringStringEntry(MapStringStringEntry other) : this() {
          key_ = other.key_;
          value_ = other.value_;
        }

        public MapStringStringEntry Clone() {
          return new MapStringStringEntry(this);
        }

        public void Freeze() {
          if (IsFrozen) {
            return;
          }
          _frozen = true;
        }

        public const int KeyFieldNumber = 1;
        private string key_ = "";
        public string Key {
          get { return key_; }
          set {
            pb::Freezable.CheckMutable(this);
            key_ = value ?? "";
          }
        }

        public const int ValueFieldNumber = 2;
        private string value_ = "";
        public string Value {
          get { return value_; }
          set {
            pb::Freezable.CheckMutable(this);
            value_ = value ?? "";
          }
        }

        public override bool Equals(object other) {
          return Equals(other as MapStringStringEntry);
        }

        public bool Equals(MapStringStringEntry other) {
          if (ReferenceEquals(other, null)) {
            return false;
          }
          if (ReferenceEquals(other, this)) {
            return true;
          }
          if (Key != other.Key) return false;
          if (Value != other.Value) return false;
          return true;
        }

        public override int GetHashCode() {
          int hash = 1;
          if (Key.Length != 0) hash ^= Key.GetHashCode();
          if (Value.Length != 0) hash ^= Value.GetHashCode();
          return hash;
        }

        public void WriteTo(pb::CodedOutputStream output) {
          if (Key.Length != 0) {
            output.WriteRawTag(10);
            output.WriteString(Key);
          }
          if (Value.Length != 0) {
            output.WriteRawTag(18);
            output.WriteString(Value);
          }
        }

        public int CalculateSize() {
          int size = 0;
          if (Key.Length != 0) {
            size += 1 + pb::CodedOutputStream.ComputeStringSize(Key);
          }
          if (Value.Length != 0) {
            size += 1 + pb::CodedOutputStream.ComputeStringSize(Value);
          }
          return size;
        }

        public void MergeFrom(MapStringStringEntry other) {
          if (other == null) {
            return;
          }
          if (other.Key.Length != 0) {
            Key = other.Key;
          }
          if (other.Value.Length != 0) {
            Value = other.Value;
          }
        }

        public void MergeFrom(pb::CodedInputStream input) {
          uint tag;
          while (input.ReadTag(out tag)) {
            switch(tag) {
              case 0:
                throw pb::InvalidProtocolBufferException.InvalidTag();
              default:
                if (pb::WireFormat.IsEndGroupTag(tag)) {
                  return;
                }
                break;
              case 10: {
                Key = input.ReadString();
                break;
              }
              case 18: {
                Value = input.ReadString();
                break;
              }
            }
          }
        }

      }

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

        private static readonly string[] _fieldNames = new string[] { "key", "value" };
        private static readonly uint[] _fieldTags = new uint[] { 8, 18 };
        public static pbd::MessageDescriptor Descriptor {
          get { return global::Google.Protobuf.TestProtos.TestMap.Descriptor.NestedTypes[14]; }
        }

        public pb::FieldAccess.FieldAccessorTable Fields {
          get { return global::Google.Protobuf.TestProtos.MapUnittestProto3.internal__static_protobuf_unittest_TestMap_MapInt32BytesEntry__FieldAccessorTable; }
        }

        private bool _frozen = false;
        public bool IsFrozen { get { return _frozen; } }

        public MapInt32BytesEntry() {
          OnConstruction();
        }

        partial void OnConstruction();

        public MapInt32BytesEntry(MapInt32BytesEntry other) : this() {
          key_ = other.key_;
          value_ = other.value_;
        }

        public MapInt32BytesEntry Clone() {
          return new MapInt32BytesEntry(this);
        }

        public void Freeze() {
          if (IsFrozen) {
            return;
          }
          _frozen = true;
        }

        public const int KeyFieldNumber = 1;
        private int key_;
        public int Key {
          get { return key_; }
          set {
            pb::Freezable.CheckMutable(this);
            key_ = value;
          }
        }

        public const int ValueFieldNumber = 2;
        private pb::ByteString value_ = pb::ByteString.Empty;
        public pb::ByteString Value {
          get { return value_; }
          set {
            pb::Freezable.CheckMutable(this);
            value_ = value ?? pb::ByteString.Empty;
          }
        }

        public override bool Equals(object other) {
          return Equals(other as MapInt32BytesEntry);
        }

        public bool Equals(MapInt32BytesEntry other) {
          if (ReferenceEquals(other, null)) {
            return false;
          }
          if (ReferenceEquals(other, this)) {
            return true;
          }
          if (Key != other.Key) return false;
          if (Value != other.Value) return false;
          return true;
        }

        public override int GetHashCode() {
          int hash = 1;
          if (Key != 0) hash ^= Key.GetHashCode();
          if (Value.Length != 0) hash ^= Value.GetHashCode();
          return hash;
        }

        public void WriteTo(pb::CodedOutputStream output) {
          if (Key != 0) {
            output.WriteRawTag(8);
            output.WriteInt32(Key);
          }
          if (Value.Length != 0) {
            output.WriteRawTag(18);
            output.WriteBytes(Value);
          }
        }

        public int CalculateSize() {
          int size = 0;
          if (Key != 0) {
            size += 1 + pb::CodedOutputStream.ComputeInt32Size(Key);
          }
          if (Value.Length != 0) {
            size += 1 + pb::CodedOutputStream.ComputeBytesSize(Value);
          }
          return size;
        }

        public void MergeFrom(MapInt32BytesEntry other) {
          if (other == null) {
            return;
          }
          if (other.Key != 0) {
            Key = other.Key;
          }
          if (other.Value.Length != 0) {
            Value = other.Value;
          }
        }

        public void MergeFrom(pb::CodedInputStream input) {
          uint tag;
          while (input.ReadTag(out tag)) {
            switch(tag) {
              case 0:
                throw pb::InvalidProtocolBufferException.InvalidTag();
              default:
                if (pb::WireFormat.IsEndGroupTag(tag)) {
                  return;
                }
                break;
              case 8: {
                Key = input.ReadInt32();
                break;
              }
              case 18: {
                Value = input.ReadBytes();
                break;
              }
            }
          }
        }

      }

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

        private static readonly string[] _fieldNames = new string[] { "key", "value" };
        private static readonly uint[] _fieldTags = new uint[] { 8, 16 };
        public static pbd::MessageDescriptor Descriptor {
          get { return global::Google.Protobuf.TestProtos.TestMap.Descriptor.NestedTypes[15]; }
        }

        public pb::FieldAccess.FieldAccessorTable Fields {
          get { return global::Google.Protobuf.TestProtos.MapUnittestProto3.internal__static_protobuf_unittest_TestMap_MapInt32EnumEntry__FieldAccessorTable; }
        }

        private bool _frozen = false;
        public bool IsFrozen { get { return _frozen; } }

        public MapInt32EnumEntry() {
          OnConstruction();
        }

        partial void OnConstruction();

        public MapInt32EnumEntry(MapInt32EnumEntry other) : this() {
          key_ = other.key_;
          value_ = other.value_;
        }

        public MapInt32EnumEntry Clone() {
          return new MapInt32EnumEntry(this);
        }

        public void Freeze() {
          if (IsFrozen) {
            return;
          }
          _frozen = true;
        }

        public const int KeyFieldNumber = 1;
        private int key_;
        public int Key {
          get { return key_; }
          set {
            pb::Freezable.CheckMutable(this);
            key_ = value;
          }
        }

        public const int ValueFieldNumber = 2;
        private global::Google.Protobuf.TestProtos.MapEnum value_ = global::Google.Protobuf.TestProtos.MapEnum.MAP_ENUM_FOO;
        public global::Google.Protobuf.TestProtos.MapEnum Value {
          get { return value_; }
          set {
            pb::Freezable.CheckMutable(this);
            value_ = value;
          }
        }

        public override bool Equals(object other) {
          return Equals(other as MapInt32EnumEntry);
        }

        public bool Equals(MapInt32EnumEntry other) {
          if (ReferenceEquals(other, null)) {
            return false;
          }
          if (ReferenceEquals(other, this)) {
            return true;
          }
          if (Key != other.Key) return false;
          if (Value != other.Value) return false;
          return true;
        }

        public override int GetHashCode() {
          int hash = 1;
          if (Key != 0) hash ^= Key.GetHashCode();
          if (Value != global::Google.Protobuf.TestProtos.MapEnum.MAP_ENUM_FOO) hash ^= Value.GetHashCode();
          return hash;
        }

        public void WriteTo(pb::CodedOutputStream output) {
          if (Key != 0) {
            output.WriteRawTag(8);
            output.WriteInt32(Key);
          }
          if (Value != global::Google.Protobuf.TestProtos.MapEnum.MAP_ENUM_FOO) {
            output.WriteRawTag(16);
            output.WriteEnum((int) Value);
          }
        }

        public int CalculateSize() {
          int size = 0;
          if (Key != 0) {
            size += 1 + pb::CodedOutputStream.ComputeInt32Size(Key);
          }
          if (Value != global::Google.Protobuf.TestProtos.MapEnum.MAP_ENUM_FOO) {
            size += 1 + pb::CodedOutputStream.ComputeEnumSize((int) Value);
          }
          return size;
        }

        public void MergeFrom(MapInt32EnumEntry other) {
          if (other == null) {
            return;
          }
          if (other.Key != 0) {
            Key = other.Key;
          }
          if (other.Value != global::Google.Protobuf.TestProtos.MapEnum.MAP_ENUM_FOO) {
            Value = other.Value;
          }
        }

        public void MergeFrom(pb::CodedInputStream input) {
          uint tag;
          while (input.ReadTag(out tag)) {
            switch(tag) {
              case 0:
                throw pb::InvalidProtocolBufferException.InvalidTag();
              default:
                if (pb::WireFormat.IsEndGroupTag(tag)) {
                  return;
                }
                break;
              case 8: {
                Key = input.ReadInt32();
                break;
              }
              case 16: {
                value_ = (global::Google.Protobuf.TestProtos.MapEnum) input.ReadEnum();
                break;
              }
            }
          }
        }

      }

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

        private static readonly string[] _fieldNames = new string[] { "key", "value" };
        private static readonly uint[] _fieldTags = new uint[] { 8, 18 };
        public static pbd::MessageDescriptor Descriptor {
          get { return global::Google.Protobuf.TestProtos.TestMap.Descriptor.NestedTypes[16]; }
        }

        public pb::FieldAccess.FieldAccessorTable Fields {
          get { return global::Google.Protobuf.TestProtos.MapUnittestProto3.internal__static_protobuf_unittest_TestMap_MapInt32ForeignMessageEntry__FieldAccessorTable; }
        }

        private bool _frozen = false;
        public bool IsFrozen { get { return _frozen; } }

        public MapInt32ForeignMessageEntry() {
          OnConstruction();
        }

        partial void OnConstruction();

        public MapInt32ForeignMessageEntry(MapInt32ForeignMessageEntry other) : this() {
          key_ = other.key_;
          Value = other.value_ != null ? other.Value.Clone() : null;
        }

        public MapInt32ForeignMessageEntry Clone() {
          return new MapInt32ForeignMessageEntry(this);
        }

        public void Freeze() {
          if (IsFrozen) {
            return;
          }
          _frozen = true;
          if (value_ != null) Value.Freeze();
        }

        public const int KeyFieldNumber = 1;
        private int key_;
        public int Key {
          get { return key_; }
          set {
            pb::Freezable.CheckMutable(this);
            key_ = value;
          }
        }

        public const int ValueFieldNumber = 2;
        private global::Google.Protobuf.TestProtos.ForeignMessage value_;
        public global::Google.Protobuf.TestProtos.ForeignMessage Value {
          get { return value_; }
          set {
            pb::Freezable.CheckMutable(this);
            value_ = value;
          }
        }

        public override bool Equals(object other) {
          return Equals(other as MapInt32ForeignMessageEntry);
        }

        public bool Equals(MapInt32ForeignMessageEntry other) {
          if (ReferenceEquals(other, null)) {
            return false;
          }
          if (ReferenceEquals(other, this)) {
            return true;
          }
          if (Key != other.Key) return false;
          if (!object.Equals(Value, other.Value)) return false;
          return true;
        }

        public override int GetHashCode() {
          int hash = 1;
          if (Key != 0) hash ^= Key.GetHashCode();
          if (value_ != null) hash ^= Value.GetHashCode();
          return hash;
        }

        public void WriteTo(pb::CodedOutputStream output) {
          if (Key != 0) {
            output.WriteRawTag(8);
            output.WriteInt32(Key);
          }
          if (value_ != null) {
            output.WriteRawTag(18);
            output.WriteMessage(Value);
          }
        }

        public int CalculateSize() {
          int size = 0;
          if (Key != 0) {
            size += 1 + pb::CodedOutputStream.ComputeInt32Size(Key);
          }
          if (value_ != null) {
            size += 1 + pb::CodedOutputStream.ComputeMessageSize(Value);
          }
          return size;
        }

        public void MergeFrom(MapInt32ForeignMessageEntry other) {
          if (other == null) {
            return;
          }
          if (other.Key != 0) {
            Key = other.Key;
          }
          if (other.value_ != null) {
            if (value_ == null) {
              value_ = new global::Google.Protobuf.TestProtos.ForeignMessage();
            }
            Value.MergeFrom(other.Value);
          }
        }

        public void MergeFrom(pb::CodedInputStream input) {
          uint tag;
          while (input.ReadTag(out tag)) {
            switch(tag) {
              case 0:
                throw pb::InvalidProtocolBufferException.InvalidTag();
              default:
                if (pb::WireFormat.IsEndGroupTag(tag)) {
                  return;
                }
                break;
              case 8: {
                Key = input.ReadInt32();
                break;
              }
              case 18: {
                if (value_ == null) {
                  value_ = new global::Google.Protobuf.TestProtos.ForeignMessage();
                }
                input.ReadMessage(value_);
                break;
              }
            }
          }
        }

      }

    }
    #endregion

  }

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

    private static readonly string[] _fieldNames = new string[] { "test_map" };
    private static readonly uint[] _fieldTags = new uint[] { 10 };
    public static pbd::MessageDescriptor Descriptor {
      get { return global::Google.Protobuf.TestProtos.MapUnittestProto3.Descriptor.MessageTypes[1]; }
    }

    public pb::FieldAccess.FieldAccessorTable Fields {
      get { return global::Google.Protobuf.TestProtos.MapUnittestProto3.internal__static_protobuf_unittest_TestMapSubmessage__FieldAccessorTable; }
    }

    private bool _frozen = false;
    public bool IsFrozen { get { return _frozen; } }

    public TestMapSubmessage() {
      OnConstruction();
    }

    partial void OnConstruction();

    public TestMapSubmessage(TestMapSubmessage other) : this() {
      TestMap = other.testMap_ != null ? other.TestMap.Clone() : null;
    }

    public TestMapSubmessage Clone() {
      return new TestMapSubmessage(this);
    }

    public void Freeze() {
      if (IsFrozen) {
        return;
      }
      _frozen = true;
      if (testMap_ != null) TestMap.Freeze();
    }

    public const int TestMapFieldNumber = 1;
    private global::Google.Protobuf.TestProtos.TestMap testMap_;
    public global::Google.Protobuf.TestProtos.TestMap TestMap {
      get { return testMap_; }
      set {
        pb::Freezable.CheckMutable(this);
        testMap_ = value;
      }
    }

    public override bool Equals(object other) {
      return Equals(other as TestMapSubmessage);
    }

    public bool Equals(TestMapSubmessage other) {
      if (ReferenceEquals(other, null)) {
        return false;
      }
      if (ReferenceEquals(other, this)) {
        return true;
      }
      if (!object.Equals(TestMap, other.TestMap)) return false;
      return true;
    }

    public override int GetHashCode() {
      int hash = 1;
      if (testMap_ != null) hash ^= TestMap.GetHashCode();
      return hash;
    }

    public void WriteTo(pb::CodedOutputStream output) {
      if (testMap_ != null) {
        output.WriteRawTag(10);
        output.WriteMessage(TestMap);
      }
    }

    public int CalculateSize() {
      int size = 0;
      if (testMap_ != null) {
        size += 1 + pb::CodedOutputStream.ComputeMessageSize(TestMap);
      }
      return size;
    }

    public void MergeFrom(TestMapSubmessage other) {
      if (other == null) {
        return;
      }
      if (other.testMap_ != null) {
        if (testMap_ == null) {
          testMap_ = new global::Google.Protobuf.TestProtos.TestMap();
        }
        TestMap.MergeFrom(other.TestMap);
      }
    }

    public void MergeFrom(pb::CodedInputStream input) {
      uint tag;
      while (input.ReadTag(out tag)) {
        switch(tag) {
          case 0:
            throw pb::InvalidProtocolBufferException.InvalidTag();
          default:
            if (pb::WireFormat.IsEndGroupTag(tag)) {
              return;
            }
            break;
          case 10: {
            if (testMap_ == null) {
              testMap_ = new global::Google.Protobuf.TestProtos.TestMap();
            }
            input.ReadMessage(testMap_);
            break;
          }
        }
      }
    }

  }

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

    private static readonly string[] _fieldNames = new string[] { "map_int32_message" };
    private static readonly uint[] _fieldTags = new uint[] { 10 };
    public static pbd::MessageDescriptor Descriptor {
      get { return global::Google.Protobuf.TestProtos.MapUnittestProto3.Descriptor.MessageTypes[2]; }
    }

    public pb::FieldAccess.FieldAccessorTable Fields {
      get { return global::Google.Protobuf.TestProtos.MapUnittestProto3.internal__static_protobuf_unittest_TestMessageMap__FieldAccessorTable; }
    }

    private bool _frozen = false;
    public bool IsFrozen { get { return _frozen; } }

    public TestMessageMap() {
      OnConstruction();
    }

    partial void OnConstruction();

    public TestMessageMap(TestMessageMap other) : this() {
      mapInt32Message_ = other.mapInt32Message_.Clone();
    }

    public TestMessageMap Clone() {
      return new TestMessageMap(this);
    }

    public void Freeze() {
      if (IsFrozen) {
        return;
      }
      _frozen = true;
      mapInt32Message_.Freeze();
    }

    public const int MapInt32MessageFieldNumber = 1;
    private static readonly pbc::MapField<int, global::Google.Protobuf.TestProtos.TestAllTypes>.Codec _map_mapInt32Message_codec
        = new pbc::MapField<int, global::Google.Protobuf.TestProtos.TestAllTypes>.Codec(pb::FieldCodec.ForInt32(8), pb::FieldCodec.ForMessage(18, global::Google.Protobuf.TestProtos.TestAllTypes.Parser), 10);
    private readonly pbc::MapField<int, global::Google.Protobuf.TestProtos.TestAllTypes> mapInt32Message_ = new pbc::MapField<int, global::Google.Protobuf.TestProtos.TestAllTypes>();
    public pbc::MapField<int, global::Google.Protobuf.TestProtos.TestAllTypes> MapInt32Message {
      get { return mapInt32Message_; }
    }

    public override bool Equals(object other) {
      return Equals(other as TestMessageMap);
    }

    public bool Equals(TestMessageMap other) {
      if (ReferenceEquals(other, null)) {
        return false;
      }
      if (ReferenceEquals(other, this)) {
        return true;
      }
      if (!MapInt32Message.Equals(other.MapInt32Message)) return false;
      return true;
    }

    public override int GetHashCode() {
      int hash = 1;
      hash ^= MapInt32Message.GetHashCode();
      return hash;
    }

    public void WriteTo(pb::CodedOutputStream output) {
      mapInt32Message_.WriteTo(output, _map_mapInt32Message_codec);
    }

    public int CalculateSize() {
      int size = 0;
      size += mapInt32Message_.CalculateSize(_map_mapInt32Message_codec);
      return size;
    }

    public void MergeFrom(TestMessageMap other) {
      if (other == null) {
        return;
      }
      mapInt32Message_.Add(other.mapInt32Message_);
    }

    public void MergeFrom(pb::CodedInputStream input) {
      uint tag;
      while (input.ReadTag(out tag)) {
        switch(tag) {
          case 0:
            throw pb::InvalidProtocolBufferException.InvalidTag();
          default:
            if (pb::WireFormat.IsEndGroupTag(tag)) {
              return;
            }
            break;
          case 10: {
            mapInt32Message_.AddEntriesFrom(input, _map_mapInt32Message_codec);
            break;
          }
        }
      }
    }

    #region Nested types
    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
    public static partial class Types {
      [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
      public sealed partial class MapInt32MessageEntry : pb::IMessage<MapInt32MessageEntry> {
        private static readonly pb::MessageParser<MapInt32MessageEntry> _parser = new pb::MessageParser<MapInt32MessageEntry>(() => new MapInt32MessageEntry());
        public static pb::MessageParser<MapInt32MessageEntry> Parser { get { return _parser; } }

        private static readonly string[] _fieldNames = new string[] { "key", "value" };
        private static readonly uint[] _fieldTags = new uint[] { 8, 18 };
        public static pbd::MessageDescriptor Descriptor {
          get { return global::Google.Protobuf.TestProtos.TestMessageMap.Descriptor.NestedTypes[0]; }
        }

        public pb::FieldAccess.FieldAccessorTable Fields {
          get { return global::Google.Protobuf.TestProtos.MapUnittestProto3.internal__static_protobuf_unittest_TestMessageMap_MapInt32MessageEntry__FieldAccessorTable; }
        }

        private bool _frozen = false;
        public bool IsFrozen { get { return _frozen; } }

        public MapInt32MessageEntry() {
          OnConstruction();
        }

        partial void OnConstruction();

        public MapInt32MessageEntry(MapInt32MessageEntry other) : this() {
          key_ = other.key_;
          Value = other.value_ != null ? other.Value.Clone() : null;
        }

        public MapInt32MessageEntry Clone() {
          return new MapInt32MessageEntry(this);
        }

        public void Freeze() {
          if (IsFrozen) {
            return;
          }
          _frozen = true;
          if (value_ != null) Value.Freeze();
        }

        public const int KeyFieldNumber = 1;
        private int key_;
        public int Key {
          get { return key_; }
          set {
            pb::Freezable.CheckMutable(this);
            key_ = value;
          }
        }

        public const int ValueFieldNumber = 2;
        private global::Google.Protobuf.TestProtos.TestAllTypes value_;
        public global::Google.Protobuf.TestProtos.TestAllTypes Value {
          get { return value_; }
          set {
            pb::Freezable.CheckMutable(this);
            value_ = value;
          }
        }

        public override bool Equals(object other) {
          return Equals(other as MapInt32MessageEntry);
        }

        public bool Equals(MapInt32MessageEntry other) {
          if (ReferenceEquals(other, null)) {
            return false;
          }
          if (ReferenceEquals(other, this)) {
            return true;
          }
          if (Key != other.Key) return false;
          if (!object.Equals(Value, other.Value)) return false;
          return true;
        }

        public override int GetHashCode() {
          int hash = 1;
          if (Key != 0) hash ^= Key.GetHashCode();
          if (value_ != null) hash ^= Value.GetHashCode();
          return hash;
        }

        public void WriteTo(pb::CodedOutputStream output) {
          if (Key != 0) {
            output.WriteRawTag(8);
            output.WriteInt32(Key);
          }
          if (value_ != null) {
            output.WriteRawTag(18);
            output.WriteMessage(Value);
          }
        }

        public int CalculateSize() {
          int size = 0;
          if (Key != 0) {
            size += 1 + pb::CodedOutputStream.ComputeInt32Size(Key);
          }
          if (value_ != null) {
            size += 1 + pb::CodedOutputStream.ComputeMessageSize(Value);
          }
          return size;
        }

        public void MergeFrom(MapInt32MessageEntry other) {
          if (other == null) {
            return;
          }
          if (other.Key != 0) {
            Key = other.Key;
          }
          if (other.value_ != null) {
            if (value_ == null) {
              value_ = new global::Google.Protobuf.TestProtos.TestAllTypes();
            }
            Value.MergeFrom(other.Value);
          }
        }

        public void MergeFrom(pb::CodedInputStream input) {
          uint tag;
          while (input.ReadTag(out tag)) {
            switch(tag) {
              case 0:
                throw pb::InvalidProtocolBufferException.InvalidTag();
              default:
                if (pb::WireFormat.IsEndGroupTag(tag)) {
                  return;
                }
                break;
              case 8: {
                Key = input.ReadInt32();
                break;
              }
              case 18: {
                if (value_ == null) {
                  value_ = new global::Google.Protobuf.TestProtos.TestAllTypes();
                }
                input.ReadMessage(value_);
                break;
              }
            }
          }
        }

      }

    }
    #endregion

  }

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

    private static readonly string[] _fieldNames = new string[] { "map1", "map2" };
    private static readonly uint[] _fieldTags = new uint[] { 10, 18 };
    public static pbd::MessageDescriptor Descriptor {
      get { return global::Google.Protobuf.TestProtos.MapUnittestProto3.Descriptor.MessageTypes[3]; }
    }

    public pb::FieldAccess.FieldAccessorTable Fields {
      get { return global::Google.Protobuf.TestProtos.MapUnittestProto3.internal__static_protobuf_unittest_TestSameTypeMap__FieldAccessorTable; }
    }

    private bool _frozen = false;
    public bool IsFrozen { get { return _frozen; } }

    public TestSameTypeMap() {
      OnConstruction();
    }

    partial void OnConstruction();

    public TestSameTypeMap(TestSameTypeMap other) : this() {
      map1_ = other.map1_.Clone();
      map2_ = other.map2_.Clone();
    }

    public TestSameTypeMap Clone() {
      return new TestSameTypeMap(this);
    }

    public void Freeze() {
      if (IsFrozen) {
        return;
      }
      _frozen = true;
      map1_.Freeze();
      map2_.Freeze();
    }

    public const int Map1FieldNumber = 1;
    private static readonly pbc::MapField<int, int>.Codec _map_map1_codec
        = new pbc::MapField<int, int>.Codec(pb::FieldCodec.ForInt32(8), pb::FieldCodec.ForInt32(16), 10);
    private readonly pbc::MapField<int, int> map1_ = new pbc::MapField<int, int>();
    public pbc::MapField<int, int> Map1 {
      get { return map1_; }
    }

    public const int Map2FieldNumber = 2;
    private static readonly pbc::MapField<int, int>.Codec _map_map2_codec
        = new pbc::MapField<int, int>.Codec(pb::FieldCodec.ForInt32(8), pb::FieldCodec.ForInt32(16), 18);
    private readonly pbc::MapField<int, int> map2_ = new pbc::MapField<int, int>();
    public pbc::MapField<int, int> Map2 {
      get { return map2_; }
    }

    public override bool Equals(object other) {
      return Equals(other as TestSameTypeMap);
    }

    public bool Equals(TestSameTypeMap other) {
      if (ReferenceEquals(other, null)) {
        return false;
      }
      if (ReferenceEquals(other, this)) {
        return true;
      }
      if (!Map1.Equals(other.Map1)) return false;
      if (!Map2.Equals(other.Map2)) return false;
      return true;
    }

    public override int GetHashCode() {
      int hash = 1;
      hash ^= Map1.GetHashCode();
      hash ^= Map2.GetHashCode();
      return hash;
    }

    public void WriteTo(pb::CodedOutputStream output) {
      map1_.WriteTo(output, _map_map1_codec);
      map2_.WriteTo(output, _map_map2_codec);
    }

    public int CalculateSize() {
      int size = 0;
      size += map1_.CalculateSize(_map_map1_codec);
      size += map2_.CalculateSize(_map_map2_codec);
      return size;
    }

    public void MergeFrom(TestSameTypeMap other) {
      if (other == null) {
        return;
      }
      map1_.Add(other.map1_);
      map2_.Add(other.map2_);
    }

    public void MergeFrom(pb::CodedInputStream input) {
      uint tag;
      while (input.ReadTag(out tag)) {
        switch(tag) {
          case 0:
            throw pb::InvalidProtocolBufferException.InvalidTag();
          default:
            if (pb::WireFormat.IsEndGroupTag(tag)) {
              return;
            }
            break;
          case 10: {
            map1_.AddEntriesFrom(input, _map_map1_codec);
            break;
          }
          case 18: {
            map2_.AddEntriesFrom(input, _map_map2_codec);
            break;
          }
        }
      }
    }

    #region Nested types
    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
    public static partial class Types {
      [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
      public sealed partial class Map1Entry : pb::IMessage<Map1Entry> {
        private static readonly pb::MessageParser<Map1Entry> _parser = new pb::MessageParser<Map1Entry>(() => new Map1Entry());
        public static pb::MessageParser<Map1Entry> Parser { get { return _parser; } }

        private static readonly string[] _fieldNames = new string[] { "key", "value" };
        private static readonly uint[] _fieldTags = new uint[] { 8, 16 };
        public static pbd::MessageDescriptor Descriptor {
          get { return global::Google.Protobuf.TestProtos.TestSameTypeMap.Descriptor.NestedTypes[0]; }
        }

        public pb::FieldAccess.FieldAccessorTable Fields {
          get { return global::Google.Protobuf.TestProtos.MapUnittestProto3.internal__static_protobuf_unittest_TestSameTypeMap_Map1Entry__FieldAccessorTable; }
        }

        private bool _frozen = false;
        public bool IsFrozen { get { return _frozen; } }

        public Map1Entry() {
          OnConstruction();
        }

        partial void OnConstruction();

        public Map1Entry(Map1Entry other) : this() {
          key_ = other.key_;
          value_ = other.value_;
        }

        public Map1Entry Clone() {
          return new Map1Entry(this);
        }

        public void Freeze() {
          if (IsFrozen) {
            return;
          }
          _frozen = true;
        }

        public const int KeyFieldNumber = 1;
        private int key_;
        public int Key {
          get { return key_; }
          set {
            pb::Freezable.CheckMutable(this);
            key_ = value;
          }
        }

        public const int ValueFieldNumber = 2;
        private int value_;
        public int Value {
          get { return value_; }
          set {
            pb::Freezable.CheckMutable(this);
            value_ = value;
          }
        }

        public override bool Equals(object other) {
          return Equals(other as Map1Entry);
        }

        public bool Equals(Map1Entry other) {
          if (ReferenceEquals(other, null)) {
            return false;
          }
          if (ReferenceEquals(other, this)) {
            return true;
          }
          if (Key != other.Key) return false;
          if (Value != other.Value) return false;
          return true;
        }

        public override int GetHashCode() {
          int hash = 1;
          if (Key != 0) hash ^= Key.GetHashCode();
          if (Value != 0) hash ^= Value.GetHashCode();
          return hash;
        }

        public void WriteTo(pb::CodedOutputStream output) {
          if (Key != 0) {
            output.WriteRawTag(8);
            output.WriteInt32(Key);
          }
          if (Value != 0) {
            output.WriteRawTag(16);
            output.WriteInt32(Value);
          }
        }

        public int CalculateSize() {
          int size = 0;
          if (Key != 0) {
            size += 1 + pb::CodedOutputStream.ComputeInt32Size(Key);
          }
          if (Value != 0) {
            size += 1 + pb::CodedOutputStream.ComputeInt32Size(Value);
          }
          return size;
        }

        public void MergeFrom(Map1Entry other) {
          if (other == null) {
            return;
          }
          if (other.Key != 0) {
            Key = other.Key;
          }
          if (other.Value != 0) {
            Value = other.Value;
          }
        }

        public void MergeFrom(pb::CodedInputStream input) {
          uint tag;
          while (input.ReadTag(out tag)) {
            switch(tag) {
              case 0:
                throw pb::InvalidProtocolBufferException.InvalidTag();
              default:
                if (pb::WireFormat.IsEndGroupTag(tag)) {
                  return;
                }
                break;
              case 8: {
                Key = input.ReadInt32();
                break;
              }
              case 16: {
                Value = input.ReadInt32();
                break;
              }
            }
          }
        }

      }

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

        private static readonly string[] _fieldNames = new string[] { "key", "value" };
        private static readonly uint[] _fieldTags = new uint[] { 8, 16 };
        public static pbd::MessageDescriptor Descriptor {
          get { return global::Google.Protobuf.TestProtos.TestSameTypeMap.Descriptor.NestedTypes[1]; }
        }

        public pb::FieldAccess.FieldAccessorTable Fields {
          get { return global::Google.Protobuf.TestProtos.MapUnittestProto3.internal__static_protobuf_unittest_TestSameTypeMap_Map2Entry__FieldAccessorTable; }
        }

        private bool _frozen = false;
        public bool IsFrozen { get { return _frozen; } }

        public Map2Entry() {
          OnConstruction();
        }

        partial void OnConstruction();

        public Map2Entry(Map2Entry other) : this() {
          key_ = other.key_;
          value_ = other.value_;
        }

        public Map2Entry Clone() {
          return new Map2Entry(this);
        }

        public void Freeze() {
          if (IsFrozen) {
            return;
          }
          _frozen = true;
        }

        public const int KeyFieldNumber = 1;
        private int key_;
        public int Key {
          get { return key_; }
          set {
            pb::Freezable.CheckMutable(this);
            key_ = value;
          }
        }

        public const int ValueFieldNumber = 2;
        private int value_;
        public int Value {
          get { return value_; }
          set {
            pb::Freezable.CheckMutable(this);
            value_ = value;
          }
        }

        public override bool Equals(object other) {
          return Equals(other as Map2Entry);
        }

        public bool Equals(Map2Entry other) {
          if (ReferenceEquals(other, null)) {
            return false;
          }
          if (ReferenceEquals(other, this)) {
            return true;
          }
          if (Key != other.Key) return false;
          if (Value != other.Value) return false;
          return true;
        }

        public override int GetHashCode() {
          int hash = 1;
          if (Key != 0) hash ^= Key.GetHashCode();
          if (Value != 0) hash ^= Value.GetHashCode();
          return hash;
        }

        public void WriteTo(pb::CodedOutputStream output) {
          if (Key != 0) {
            output.WriteRawTag(8);
            output.WriteInt32(Key);
          }
          if (Value != 0) {
            output.WriteRawTag(16);
            output.WriteInt32(Value);
          }
        }

        public int CalculateSize() {
          int size = 0;
          if (Key != 0) {
            size += 1 + pb::CodedOutputStream.ComputeInt32Size(Key);
          }
          if (Value != 0) {
            size += 1 + pb::CodedOutputStream.ComputeInt32Size(Value);
          }
          return size;
        }

        public void MergeFrom(Map2Entry other) {
          if (other == null) {
            return;
          }
          if (other.Key != 0) {
            Key = other.Key;
          }
          if (other.Value != 0) {
            Value = other.Value;
          }
        }

        public void MergeFrom(pb::CodedInputStream input) {
          uint tag;
          while (input.ReadTag(out tag)) {
            switch(tag) {
              case 0:
                throw pb::InvalidProtocolBufferException.InvalidTag();
              default:
                if (pb::WireFormat.IsEndGroupTag(tag)) {
                  return;
                }
                break;
              case 8: {
                Key = input.ReadInt32();
                break;
              }
              case 16: {
                Value = input.ReadInt32();
                break;
              }
            }
          }
        }

      }

    }
    #endregion

  }

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

    private static readonly string[] _fieldNames = new string[] { "map_bool_bool", "map_fixed32_fixed32", "map_fixed64_fixed64", "map_int32_double", "map_int32_enum", "map_int32_float", "map_int32_foreign_message", "map_int32_int32", "map_int64_int64", "map_sfixed32_sfixed32", "map_sfixed64_sfixed64", "map_sint32_sint32", "map_sint64_sint64", "map_uint32_uint32", "map_uint64_uint64" };
    private static readonly uint[] _fieldTags = new uint[] { 106, 58, 66, 98, 114, 90, 122, 10, 18, 74, 82, 42, 50, 26, 34 };
    public static pbd::MessageDescriptor Descriptor {
      get { return global::Google.Protobuf.TestProtos.MapUnittestProto3.Descriptor.MessageTypes[4]; }
    }

    public pb::FieldAccess.FieldAccessorTable Fields {
      get { return global::Google.Protobuf.TestProtos.MapUnittestProto3.internal__static_protobuf_unittest_TestArenaMap__FieldAccessorTable; }
    }

    private bool _frozen = false;
    public bool IsFrozen { get { return _frozen; } }

    public TestArenaMap() {
      OnConstruction();
    }

    partial void OnConstruction();

    public TestArenaMap(TestArenaMap other) : this() {
      mapInt32Int32_ = other.mapInt32Int32_.Clone();
      mapInt64Int64_ = other.mapInt64Int64_.Clone();
      mapUint32Uint32_ = other.mapUint32Uint32_.Clone();
      mapUint64Uint64_ = other.mapUint64Uint64_.Clone();
      mapSint32Sint32_ = other.mapSint32Sint32_.Clone();
      mapSint64Sint64_ = other.mapSint64Sint64_.Clone();
      mapFixed32Fixed32_ = other.mapFixed32Fixed32_.Clone();
      mapFixed64Fixed64_ = other.mapFixed64Fixed64_.Clone();
      mapSfixed32Sfixed32_ = other.mapSfixed32Sfixed32_.Clone();
      mapSfixed64Sfixed64_ = other.mapSfixed64Sfixed64_.Clone();
      mapInt32Float_ = other.mapInt32Float_.Clone();
      mapInt32Double_ = other.mapInt32Double_.Clone();
      mapBoolBool_ = other.mapBoolBool_.Clone();
      mapInt32Enum_ = other.mapInt32Enum_.Clone();
      mapInt32ForeignMessage_ = other.mapInt32ForeignMessage_.Clone();
    }

    public TestArenaMap Clone() {
      return new TestArenaMap(this);
    }

    public void Freeze() {
      if (IsFrozen) {
        return;
      }
      _frozen = true;
      mapInt32Int32_.Freeze();
      mapInt64Int64_.Freeze();
      mapUint32Uint32_.Freeze();
      mapUint64Uint64_.Freeze();
      mapSint32Sint32_.Freeze();
      mapSint64Sint64_.Freeze();
      mapFixed32Fixed32_.Freeze();
      mapFixed64Fixed64_.Freeze();
      mapSfixed32Sfixed32_.Freeze();
      mapSfixed64Sfixed64_.Freeze();
      mapInt32Float_.Freeze();
      mapInt32Double_.Freeze();
      mapBoolBool_.Freeze();
      mapInt32Enum_.Freeze();
      mapInt32ForeignMessage_.Freeze();
    }

    public const int MapInt32Int32FieldNumber = 1;
    private static readonly pbc::MapField<int, int>.Codec _map_mapInt32Int32_codec
        = new pbc::MapField<int, int>.Codec(pb::FieldCodec.ForInt32(8), pb::FieldCodec.ForInt32(16), 10);
    private readonly pbc::MapField<int, int> mapInt32Int32_ = new pbc::MapField<int, int>();
    public pbc::MapField<int, int> MapInt32Int32 {
      get { return mapInt32Int32_; }
    }

    public const int MapInt64Int64FieldNumber = 2;
    private static readonly pbc::MapField<long, long>.Codec _map_mapInt64Int64_codec
        = new pbc::MapField<long, long>.Codec(pb::FieldCodec.ForInt64(8), pb::FieldCodec.ForInt64(16), 18);
    private readonly pbc::MapField<long, long> mapInt64Int64_ = new pbc::MapField<long, long>();
    public pbc::MapField<long, long> MapInt64Int64 {
      get { return mapInt64Int64_; }
    }

    public const int MapUint32Uint32FieldNumber = 3;
    private static readonly pbc::MapField<uint, uint>.Codec _map_mapUint32Uint32_codec
        = new pbc::MapField<uint, uint>.Codec(pb::FieldCodec.ForUInt32(8), pb::FieldCodec.ForUInt32(16), 26);
    private readonly pbc::MapField<uint, uint> mapUint32Uint32_ = new pbc::MapField<uint, uint>();
    public pbc::MapField<uint, uint> MapUint32Uint32 {
      get { return mapUint32Uint32_; }
    }

    public const int MapUint64Uint64FieldNumber = 4;
    private static readonly pbc::MapField<ulong, ulong>.Codec _map_mapUint64Uint64_codec
        = new pbc::MapField<ulong, ulong>.Codec(pb::FieldCodec.ForUInt64(8), pb::FieldCodec.ForUInt64(16), 34);
    private readonly pbc::MapField<ulong, ulong> mapUint64Uint64_ = new pbc::MapField<ulong, ulong>();
    public pbc::MapField<ulong, ulong> MapUint64Uint64 {
      get { return mapUint64Uint64_; }
    }

    public const int MapSint32Sint32FieldNumber = 5;
    private static readonly pbc::MapField<int, int>.Codec _map_mapSint32Sint32_codec
        = new pbc::MapField<int, int>.Codec(pb::FieldCodec.ForSInt32(8), pb::FieldCodec.ForSInt32(16), 42);
    private readonly pbc::MapField<int, int> mapSint32Sint32_ = new pbc::MapField<int, int>();
    public pbc::MapField<int, int> MapSint32Sint32 {
      get { return mapSint32Sint32_; }
    }

    public const int MapSint64Sint64FieldNumber = 6;
    private static readonly pbc::MapField<long, long>.Codec _map_mapSint64Sint64_codec
        = new pbc::MapField<long, long>.Codec(pb::FieldCodec.ForSInt64(8), pb::FieldCodec.ForSInt64(16), 50);
    private readonly pbc::MapField<long, long> mapSint64Sint64_ = new pbc::MapField<long, long>();
    public pbc::MapField<long, long> MapSint64Sint64 {
      get { return mapSint64Sint64_; }
    }

    public const int MapFixed32Fixed32FieldNumber = 7;
    private static readonly pbc::MapField<uint, uint>.Codec _map_mapFixed32Fixed32_codec
        = new pbc::MapField<uint, uint>.Codec(pb::FieldCodec.ForFixed32(13), pb::FieldCodec.ForFixed32(21), 58);
    private readonly pbc::MapField<uint, uint> mapFixed32Fixed32_ = new pbc::MapField<uint, uint>();
    public pbc::MapField<uint, uint> MapFixed32Fixed32 {
      get { return mapFixed32Fixed32_; }
    }

    public const int MapFixed64Fixed64FieldNumber = 8;
    private static readonly pbc::MapField<ulong, ulong>.Codec _map_mapFixed64Fixed64_codec
        = new pbc::MapField<ulong, ulong>.Codec(pb::FieldCodec.ForFixed64(9), pb::FieldCodec.ForFixed64(17), 66);
    private readonly pbc::MapField<ulong, ulong> mapFixed64Fixed64_ = new pbc::MapField<ulong, ulong>();
    public pbc::MapField<ulong, ulong> MapFixed64Fixed64 {
      get { return mapFixed64Fixed64_; }
    }

    public const int MapSfixed32Sfixed32FieldNumber = 9;
    private static readonly pbc::MapField<int, int>.Codec _map_mapSfixed32Sfixed32_codec
        = new pbc::MapField<int, int>.Codec(pb::FieldCodec.ForSFixed32(13), pb::FieldCodec.ForSFixed32(21), 74);
    private readonly pbc::MapField<int, int> mapSfixed32Sfixed32_ = new pbc::MapField<int, int>();
    public pbc::MapField<int, int> MapSfixed32Sfixed32 {
      get { return mapSfixed32Sfixed32_; }
    }

    public const int MapSfixed64Sfixed64FieldNumber = 10;
    private static readonly pbc::MapField<long, long>.Codec _map_mapSfixed64Sfixed64_codec
        = new pbc::MapField<long, long>.Codec(pb::FieldCodec.ForSFixed64(9), pb::FieldCodec.ForSFixed64(17), 82);
    private readonly pbc::MapField<long, long> mapSfixed64Sfixed64_ = new pbc::MapField<long, long>();
    public pbc::MapField<long, long> MapSfixed64Sfixed64 {
      get { return mapSfixed64Sfixed64_; }
    }

    public const int MapInt32FloatFieldNumber = 11;
    private static readonly pbc::MapField<int, float>.Codec _map_mapInt32Float_codec
        = new pbc::MapField<int, float>.Codec(pb::FieldCodec.ForInt32(8), pb::FieldCodec.ForFloat(21), 90);
    private readonly pbc::MapField<int, float> mapInt32Float_ = new pbc::MapField<int, float>();
    public pbc::MapField<int, float> MapInt32Float {
      get { return mapInt32Float_; }
    }

    public const int MapInt32DoubleFieldNumber = 12;
    private static readonly pbc::MapField<int, double>.Codec _map_mapInt32Double_codec
        = new pbc::MapField<int, double>.Codec(pb::FieldCodec.ForInt32(8), pb::FieldCodec.ForDouble(17), 98);
    private readonly pbc::MapField<int, double> mapInt32Double_ = new pbc::MapField<int, double>();
    public pbc::MapField<int, double> MapInt32Double {
      get { return mapInt32Double_; }
    }

    public const int MapBoolBoolFieldNumber = 13;
    private static readonly pbc::MapField<bool, bool>.Codec _map_mapBoolBool_codec
        = new pbc::MapField<bool, bool>.Codec(pb::FieldCodec.ForBool(8), pb::FieldCodec.ForBool(16), 106);
    private readonly pbc::MapField<bool, bool> mapBoolBool_ = new pbc::MapField<bool, bool>();
    public pbc::MapField<bool, bool> MapBoolBool {
      get { return mapBoolBool_; }
    }

    public const int MapInt32EnumFieldNumber = 14;
    private static readonly pbc::MapField<int, global::Google.Protobuf.TestProtos.MapEnum>.Codec _map_mapInt32Enum_codec
        = new pbc::MapField<int, global::Google.Protobuf.TestProtos.MapEnum>.Codec(pb::FieldCodec.ForInt32(8), pb::FieldCodec.ForEnum(16, x => (int) x, x => (global::Google.Protobuf.TestProtos.MapEnum) x), 114);
    private readonly pbc::MapField<int, global::Google.Protobuf.TestProtos.MapEnum> mapInt32Enum_ = new pbc::MapField<int, global::Google.Protobuf.TestProtos.MapEnum>();
    public pbc::MapField<int, global::Google.Protobuf.TestProtos.MapEnum> MapInt32Enum {
      get { return mapInt32Enum_; }
    }

    public const int MapInt32ForeignMessageFieldNumber = 15;
    private static readonly pbc::MapField<int, global::Google.Protobuf.TestProtos.ForeignMessage>.Codec _map_mapInt32ForeignMessage_codec
        = new pbc::MapField<int, global::Google.Protobuf.TestProtos.ForeignMessage>.Codec(pb::FieldCodec.ForInt32(8), pb::FieldCodec.ForMessage(18, global::Google.Protobuf.TestProtos.ForeignMessage.Parser), 122);
    private readonly pbc::MapField<int, global::Google.Protobuf.TestProtos.ForeignMessage> mapInt32ForeignMessage_ = new pbc::MapField<int, global::Google.Protobuf.TestProtos.ForeignMessage>();
    public pbc::MapField<int, global::Google.Protobuf.TestProtos.ForeignMessage> MapInt32ForeignMessage {
      get { return mapInt32ForeignMessage_; }
    }

    public override bool Equals(object other) {
      return Equals(other as TestArenaMap);
    }

    public bool Equals(TestArenaMap other) {
      if (ReferenceEquals(other, null)) {
        return false;
      }
      if (ReferenceEquals(other, this)) {
        return true;
      }
      if (!MapInt32Int32.Equals(other.MapInt32Int32)) return false;
      if (!MapInt64Int64.Equals(other.MapInt64Int64)) return false;
      if (!MapUint32Uint32.Equals(other.MapUint32Uint32)) return false;
      if (!MapUint64Uint64.Equals(other.MapUint64Uint64)) return false;
      if (!MapSint32Sint32.Equals(other.MapSint32Sint32)) return false;
      if (!MapSint64Sint64.Equals(other.MapSint64Sint64)) return false;
      if (!MapFixed32Fixed32.Equals(other.MapFixed32Fixed32)) return false;
      if (!MapFixed64Fixed64.Equals(other.MapFixed64Fixed64)) return false;
      if (!MapSfixed32Sfixed32.Equals(other.MapSfixed32Sfixed32)) return false;
      if (!MapSfixed64Sfixed64.Equals(other.MapSfixed64Sfixed64)) return false;
      if (!MapInt32Float.Equals(other.MapInt32Float)) return false;
      if (!MapInt32Double.Equals(other.MapInt32Double)) return false;
      if (!MapBoolBool.Equals(other.MapBoolBool)) return false;
      if (!MapInt32Enum.Equals(other.MapInt32Enum)) return false;
      if (!MapInt32ForeignMessage.Equals(other.MapInt32ForeignMessage)) return false;
      return true;
    }

    public override int GetHashCode() {
      int hash = 1;
      hash ^= MapInt32Int32.GetHashCode();
      hash ^= MapInt64Int64.GetHashCode();
      hash ^= MapUint32Uint32.GetHashCode();
      hash ^= MapUint64Uint64.GetHashCode();
      hash ^= MapSint32Sint32.GetHashCode();
      hash ^= MapSint64Sint64.GetHashCode();
      hash ^= MapFixed32Fixed32.GetHashCode();
      hash ^= MapFixed64Fixed64.GetHashCode();
      hash ^= MapSfixed32Sfixed32.GetHashCode();
      hash ^= MapSfixed64Sfixed64.GetHashCode();
      hash ^= MapInt32Float.GetHashCode();
      hash ^= MapInt32Double.GetHashCode();
      hash ^= MapBoolBool.GetHashCode();
      hash ^= MapInt32Enum.GetHashCode();
      hash ^= MapInt32ForeignMessage.GetHashCode();
      return hash;
    }

    public void WriteTo(pb::CodedOutputStream output) {
      mapInt32Int32_.WriteTo(output, _map_mapInt32Int32_codec);
      mapInt64Int64_.WriteTo(output, _map_mapInt64Int64_codec);
      mapUint32Uint32_.WriteTo(output, _map_mapUint32Uint32_codec);
      mapUint64Uint64_.WriteTo(output, _map_mapUint64Uint64_codec);
      mapSint32Sint32_.WriteTo(output, _map_mapSint32Sint32_codec);
      mapSint64Sint64_.WriteTo(output, _map_mapSint64Sint64_codec);
      mapFixed32Fixed32_.WriteTo(output, _map_mapFixed32Fixed32_codec);
      mapFixed64Fixed64_.WriteTo(output, _map_mapFixed64Fixed64_codec);
      mapSfixed32Sfixed32_.WriteTo(output, _map_mapSfixed32Sfixed32_codec);
      mapSfixed64Sfixed64_.WriteTo(output, _map_mapSfixed64Sfixed64_codec);
      mapInt32Float_.WriteTo(output, _map_mapInt32Float_codec);
      mapInt32Double_.WriteTo(output, _map_mapInt32Double_codec);
      mapBoolBool_.WriteTo(output, _map_mapBoolBool_codec);
      mapInt32Enum_.WriteTo(output, _map_mapInt32Enum_codec);
      mapInt32ForeignMessage_.WriteTo(output, _map_mapInt32ForeignMessage_codec);
    }

    public int CalculateSize() {
      int size = 0;
      size += mapInt32Int32_.CalculateSize(_map_mapInt32Int32_codec);
      size += mapInt64Int64_.CalculateSize(_map_mapInt64Int64_codec);
      size += mapUint32Uint32_.CalculateSize(_map_mapUint32Uint32_codec);
      size += mapUint64Uint64_.CalculateSize(_map_mapUint64Uint64_codec);
      size += mapSint32Sint32_.CalculateSize(_map_mapSint32Sint32_codec);
      size += mapSint64Sint64_.CalculateSize(_map_mapSint64Sint64_codec);
      size += mapFixed32Fixed32_.CalculateSize(_map_mapFixed32Fixed32_codec);
      size += mapFixed64Fixed64_.CalculateSize(_map_mapFixed64Fixed64_codec);
      size += mapSfixed32Sfixed32_.CalculateSize(_map_mapSfixed32Sfixed32_codec);
      size += mapSfixed64Sfixed64_.CalculateSize(_map_mapSfixed64Sfixed64_codec);
      size += mapInt32Float_.CalculateSize(_map_mapInt32Float_codec);
      size += mapInt32Double_.CalculateSize(_map_mapInt32Double_codec);
      size += mapBoolBool_.CalculateSize(_map_mapBoolBool_codec);
      size += mapInt32Enum_.CalculateSize(_map_mapInt32Enum_codec);
      size += mapInt32ForeignMessage_.CalculateSize(_map_mapInt32ForeignMessage_codec);
      return size;
    }

    public void MergeFrom(TestArenaMap other) {
      if (other == null) {
        return;
      }
      mapInt32Int32_.Add(other.mapInt32Int32_);
      mapInt64Int64_.Add(other.mapInt64Int64_);
      mapUint32Uint32_.Add(other.mapUint32Uint32_);
      mapUint64Uint64_.Add(other.mapUint64Uint64_);
      mapSint32Sint32_.Add(other.mapSint32Sint32_);
      mapSint64Sint64_.Add(other.mapSint64Sint64_);
      mapFixed32Fixed32_.Add(other.mapFixed32Fixed32_);
      mapFixed64Fixed64_.Add(other.mapFixed64Fixed64_);
      mapSfixed32Sfixed32_.Add(other.mapSfixed32Sfixed32_);
      mapSfixed64Sfixed64_.Add(other.mapSfixed64Sfixed64_);
      mapInt32Float_.Add(other.mapInt32Float_);
      mapInt32Double_.Add(other.mapInt32Double_);
      mapBoolBool_.Add(other.mapBoolBool_);
      mapInt32Enum_.Add(other.mapInt32Enum_);
      mapInt32ForeignMessage_.Add(other.mapInt32ForeignMessage_);
    }

    public void MergeFrom(pb::CodedInputStream input) {
      uint tag;
      while (input.ReadTag(out tag)) {
        switch(tag) {
          case 0:
            throw pb::InvalidProtocolBufferException.InvalidTag();
          default:
            if (pb::WireFormat.IsEndGroupTag(tag)) {
              return;
            }
            break;
          case 10: {
            mapInt32Int32_.AddEntriesFrom(input, _map_mapInt32Int32_codec);
            break;
          }
          case 18: {
            mapInt64Int64_.AddEntriesFrom(input, _map_mapInt64Int64_codec);
            break;
          }
          case 26: {
            mapUint32Uint32_.AddEntriesFrom(input, _map_mapUint32Uint32_codec);
            break;
          }
          case 34: {
            mapUint64Uint64_.AddEntriesFrom(input, _map_mapUint64Uint64_codec);
            break;
          }
          case 42: {
            mapSint32Sint32_.AddEntriesFrom(input, _map_mapSint32Sint32_codec);
            break;
          }
          case 50: {
            mapSint64Sint64_.AddEntriesFrom(input, _map_mapSint64Sint64_codec);
            break;
          }
          case 58: {
            mapFixed32Fixed32_.AddEntriesFrom(input, _map_mapFixed32Fixed32_codec);
            break;
          }
          case 66: {
            mapFixed64Fixed64_.AddEntriesFrom(input, _map_mapFixed64Fixed64_codec);
            break;
          }
          case 74: {
            mapSfixed32Sfixed32_.AddEntriesFrom(input, _map_mapSfixed32Sfixed32_codec);
            break;
          }
          case 82: {
            mapSfixed64Sfixed64_.AddEntriesFrom(input, _map_mapSfixed64Sfixed64_codec);
            break;
          }
          case 90: {
            mapInt32Float_.AddEntriesFrom(input, _map_mapInt32Float_codec);
            break;
          }
          case 98: {
            mapInt32Double_.AddEntriesFrom(input, _map_mapInt32Double_codec);
            break;
          }
          case 106: {
            mapBoolBool_.AddEntriesFrom(input, _map_mapBoolBool_codec);
            break;
          }
          case 114: {
            mapInt32Enum_.AddEntriesFrom(input, _map_mapInt32Enum_codec);
            break;
          }
          case 122: {
            mapInt32ForeignMessage_.AddEntriesFrom(input, _map_mapInt32ForeignMessage_codec);
            break;
          }
        }
      }
    }

    #region Nested types
    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
    public static partial class Types {
      [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
      public sealed partial class MapInt32Int32Entry : pb::IMessage<MapInt32Int32Entry> {
        private static readonly pb::MessageParser<MapInt32Int32Entry> _parser = new pb::MessageParser<MapInt32Int32Entry>(() => new MapInt32Int32Entry());
        public static pb::MessageParser<MapInt32Int32Entry> Parser { get { return _parser; } }

        private static readonly string[] _fieldNames = new string[] { "key", "value" };
        private static readonly uint[] _fieldTags = new uint[] { 8, 16 };
        public static pbd::MessageDescriptor Descriptor {
          get { return global::Google.Protobuf.TestProtos.TestArenaMap.Descriptor.NestedTypes[0]; }
        }

        public pb::FieldAccess.FieldAccessorTable Fields {
          get { return global::Google.Protobuf.TestProtos.MapUnittestProto3.internal__static_protobuf_unittest_TestArenaMap_MapInt32Int32Entry__FieldAccessorTable; }
        }

        private bool _frozen = false;
        public bool IsFrozen { get { return _frozen; } }

        public MapInt32Int32Entry() {
          OnConstruction();
        }

        partial void OnConstruction();

        public MapInt32Int32Entry(MapInt32Int32Entry other) : this() {
          key_ = other.key_;
          value_ = other.value_;
        }

        public MapInt32Int32Entry Clone() {
          return new MapInt32Int32Entry(this);
        }

        public void Freeze() {
          if (IsFrozen) {
            return;
          }
          _frozen = true;
        }

        public const int KeyFieldNumber = 1;
        private int key_;
        public int Key {
          get { return key_; }
          set {
            pb::Freezable.CheckMutable(this);
            key_ = value;
          }
        }

        public const int ValueFieldNumber = 2;
        private int value_;
        public int Value {
          get { return value_; }
          set {
            pb::Freezable.CheckMutable(this);
            value_ = value;
          }
        }

        public override bool Equals(object other) {
          return Equals(other as MapInt32Int32Entry);
        }

        public bool Equals(MapInt32Int32Entry other) {
          if (ReferenceEquals(other, null)) {
            return false;
          }
          if (ReferenceEquals(other, this)) {
            return true;
          }
          if (Key != other.Key) return false;
          if (Value != other.Value) return false;
          return true;
        }

        public override int GetHashCode() {
          int hash = 1;
          if (Key != 0) hash ^= Key.GetHashCode();
          if (Value != 0) hash ^= Value.GetHashCode();
          return hash;
        }

        public void WriteTo(pb::CodedOutputStream output) {
          if (Key != 0) {
            output.WriteRawTag(8);
            output.WriteInt32(Key);
          }
          if (Value != 0) {
            output.WriteRawTag(16);
            output.WriteInt32(Value);
          }
        }

        public int CalculateSize() {
          int size = 0;
          if (Key != 0) {
            size += 1 + pb::CodedOutputStream.ComputeInt32Size(Key);
          }
          if (Value != 0) {
            size += 1 + pb::CodedOutputStream.ComputeInt32Size(Value);
          }
          return size;
        }

        public void MergeFrom(MapInt32Int32Entry other) {
          if (other == null) {
            return;
          }
          if (other.Key != 0) {
            Key = other.Key;
          }
          if (other.Value != 0) {
            Value = other.Value;
          }
        }

        public void MergeFrom(pb::CodedInputStream input) {
          uint tag;
          while (input.ReadTag(out tag)) {
            switch(tag) {
              case 0:
                throw pb::InvalidProtocolBufferException.InvalidTag();
              default:
                if (pb::WireFormat.IsEndGroupTag(tag)) {
                  return;
                }
                break;
              case 8: {
                Key = input.ReadInt32();
                break;
              }
              case 16: {
                Value = input.ReadInt32();
                break;
              }
            }
          }
        }

      }

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

        private static readonly string[] _fieldNames = new string[] { "key", "value" };
        private static readonly uint[] _fieldTags = new uint[] { 8, 16 };
        public static pbd::MessageDescriptor Descriptor {
          get { return global::Google.Protobuf.TestProtos.TestArenaMap.Descriptor.NestedTypes[1]; }
        }

        public pb::FieldAccess.FieldAccessorTable Fields {
          get { return global::Google.Protobuf.TestProtos.MapUnittestProto3.internal__static_protobuf_unittest_TestArenaMap_MapInt64Int64Entry__FieldAccessorTable; }
        }

        private bool _frozen = false;
        public bool IsFrozen { get { return _frozen; } }

        public MapInt64Int64Entry() {
          OnConstruction();
        }

        partial void OnConstruction();

        public MapInt64Int64Entry(MapInt64Int64Entry other) : this() {
          key_ = other.key_;
          value_ = other.value_;
        }

        public MapInt64Int64Entry Clone() {
          return new MapInt64Int64Entry(this);
        }

        public void Freeze() {
          if (IsFrozen) {
            return;
          }
          _frozen = true;
        }

        public const int KeyFieldNumber = 1;
        private long key_;
        public long Key {
          get { return key_; }
          set {
            pb::Freezable.CheckMutable(this);
            key_ = value;
          }
        }

        public const int ValueFieldNumber = 2;
        private long value_;
        public long Value {
          get { return value_; }
          set {
            pb::Freezable.CheckMutable(this);
            value_ = value;
          }
        }

        public override bool Equals(object other) {
          return Equals(other as MapInt64Int64Entry);
        }

        public bool Equals(MapInt64Int64Entry other) {
          if (ReferenceEquals(other, null)) {
            return false;
          }
          if (ReferenceEquals(other, this)) {
            return true;
          }
          if (Key != other.Key) return false;
          if (Value != other.Value) return false;
          return true;
        }

        public override int GetHashCode() {
          int hash = 1;
          if (Key != 0L) hash ^= Key.GetHashCode();
          if (Value != 0L) hash ^= Value.GetHashCode();
          return hash;
        }

        public void WriteTo(pb::CodedOutputStream output) {
          if (Key != 0L) {
            output.WriteRawTag(8);
            output.WriteInt64(Key);
          }
          if (Value != 0L) {
            output.WriteRawTag(16);
            output.WriteInt64(Value);
          }
        }

        public int CalculateSize() {
          int size = 0;
          if (Key != 0L) {
            size += 1 + pb::CodedOutputStream.ComputeInt64Size(Key);
          }
          if (Value != 0L) {
            size += 1 + pb::CodedOutputStream.ComputeInt64Size(Value);
          }
          return size;
        }

        public void MergeFrom(MapInt64Int64Entry other) {
          if (other == null) {
            return;
          }
          if (other.Key != 0L) {
            Key = other.Key;
          }
          if (other.Value != 0L) {
            Value = other.Value;
          }
        }

        public void MergeFrom(pb::CodedInputStream input) {
          uint tag;
          while (input.ReadTag(out tag)) {
            switch(tag) {
              case 0:
                throw pb::InvalidProtocolBufferException.InvalidTag();
              default:
                if (pb::WireFormat.IsEndGroupTag(tag)) {
                  return;
                }
                break;
              case 8: {
                Key = input.ReadInt64();
                break;
              }
              case 16: {
                Value = input.ReadInt64();
                break;
              }
            }
          }
        }

      }

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

        private static readonly string[] _fieldNames = new string[] { "key", "value" };
        private static readonly uint[] _fieldTags = new uint[] { 8, 16 };
        public static pbd::MessageDescriptor Descriptor {
          get { return global::Google.Protobuf.TestProtos.TestArenaMap.Descriptor.NestedTypes[2]; }
        }

        public pb::FieldAccess.FieldAccessorTable Fields {
          get { return global::Google.Protobuf.TestProtos.MapUnittestProto3.internal__static_protobuf_unittest_TestArenaMap_MapUint32Uint32Entry__FieldAccessorTable; }
        }

        private bool _frozen = false;
        public bool IsFrozen { get { return _frozen; } }

        public MapUint32Uint32Entry() {
          OnConstruction();
        }

        partial void OnConstruction();

        public MapUint32Uint32Entry(MapUint32Uint32Entry other) : this() {
          key_ = other.key_;
          value_ = other.value_;
        }

        public MapUint32Uint32Entry Clone() {
          return new MapUint32Uint32Entry(this);
        }

        public void Freeze() {
          if (IsFrozen) {
            return;
          }
          _frozen = true;
        }

        public const int KeyFieldNumber = 1;
        private uint key_;
        public uint Key {
          get { return key_; }
          set {
            pb::Freezable.CheckMutable(this);
            key_ = value;
          }
        }

        public const int ValueFieldNumber = 2;
        private uint value_;
        public uint Value {
          get { return value_; }
          set {
            pb::Freezable.CheckMutable(this);
            value_ = value;
          }
        }

        public override bool Equals(object other) {
          return Equals(other as MapUint32Uint32Entry);
        }

        public bool Equals(MapUint32Uint32Entry other) {
          if (ReferenceEquals(other, null)) {
            return false;
          }
          if (ReferenceEquals(other, this)) {
            return true;
          }
          if (Key != other.Key) return false;
          if (Value != other.Value) return false;
          return true;
        }

        public override int GetHashCode() {
          int hash = 1;
          if (Key != 0) hash ^= Key.GetHashCode();
          if (Value != 0) hash ^= Value.GetHashCode();
          return hash;
        }

        public void WriteTo(pb::CodedOutputStream output) {
          if (Key != 0) {
            output.WriteRawTag(8);
            output.WriteUInt32(Key);
          }
          if (Value != 0) {
            output.WriteRawTag(16);
            output.WriteUInt32(Value);
          }
        }

        public int CalculateSize() {
          int size = 0;
          if (Key != 0) {
            size += 1 + pb::CodedOutputStream.ComputeUInt32Size(Key);
          }
          if (Value != 0) {
            size += 1 + pb::CodedOutputStream.ComputeUInt32Size(Value);
          }
          return size;
        }

        public void MergeFrom(MapUint32Uint32Entry other) {
          if (other == null) {
            return;
          }
          if (other.Key != 0) {
            Key = other.Key;
          }
          if (other.Value != 0) {
            Value = other.Value;
          }
        }

        public void MergeFrom(pb::CodedInputStream input) {
          uint tag;
          while (input.ReadTag(out tag)) {
            switch(tag) {
              case 0:
                throw pb::InvalidProtocolBufferException.InvalidTag();
              default:
                if (pb::WireFormat.IsEndGroupTag(tag)) {
                  return;
                }
                break;
              case 8: {
                Key = input.ReadUInt32();
                break;
              }
              case 16: {
                Value = input.ReadUInt32();
                break;
              }
            }
          }
        }

      }

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

        private static readonly string[] _fieldNames = new string[] { "key", "value" };
        private static readonly uint[] _fieldTags = new uint[] { 8, 16 };
        public static pbd::MessageDescriptor Descriptor {
          get { return global::Google.Protobuf.TestProtos.TestArenaMap.Descriptor.NestedTypes[3]; }
        }

        public pb::FieldAccess.FieldAccessorTable Fields {
          get { return global::Google.Protobuf.TestProtos.MapUnittestProto3.internal__static_protobuf_unittest_TestArenaMap_MapUint64Uint64Entry__FieldAccessorTable; }
        }

        private bool _frozen = false;
        public bool IsFrozen { get { return _frozen; } }

        public MapUint64Uint64Entry() {
          OnConstruction();
        }

        partial void OnConstruction();

        public MapUint64Uint64Entry(MapUint64Uint64Entry other) : this() {
          key_ = other.key_;
          value_ = other.value_;
        }

        public MapUint64Uint64Entry Clone() {
          return new MapUint64Uint64Entry(this);
        }

        public void Freeze() {
          if (IsFrozen) {
            return;
          }
          _frozen = true;
        }

        public const int KeyFieldNumber = 1;
        private ulong key_;
        public ulong Key {
          get { return key_; }
          set {
            pb::Freezable.CheckMutable(this);
            key_ = value;
          }
        }

        public const int ValueFieldNumber = 2;
        private ulong value_;
        public ulong Value {
          get { return value_; }
          set {
            pb::Freezable.CheckMutable(this);
            value_ = value;
          }
        }

        public override bool Equals(object other) {
          return Equals(other as MapUint64Uint64Entry);
        }

        public bool Equals(MapUint64Uint64Entry other) {
          if (ReferenceEquals(other, null)) {
            return false;
          }
          if (ReferenceEquals(other, this)) {
            return true;
          }
          if (Key != other.Key) return false;
          if (Value != other.Value) return false;
          return true;
        }

        public override int GetHashCode() {
          int hash = 1;
          if (Key != 0UL) hash ^= Key.GetHashCode();
          if (Value != 0UL) hash ^= Value.GetHashCode();
          return hash;
        }

        public void WriteTo(pb::CodedOutputStream output) {
          if (Key != 0UL) {
            output.WriteRawTag(8);
            output.WriteUInt64(Key);
          }
          if (Value != 0UL) {
            output.WriteRawTag(16);
            output.WriteUInt64(Value);
          }
        }

        public int CalculateSize() {
          int size = 0;
          if (Key != 0UL) {
            size += 1 + pb::CodedOutputStream.ComputeUInt64Size(Key);
          }
          if (Value != 0UL) {
            size += 1 + pb::CodedOutputStream.ComputeUInt64Size(Value);
          }
          return size;
        }

        public void MergeFrom(MapUint64Uint64Entry other) {
          if (other == null) {
            return;
          }
          if (other.Key != 0UL) {
            Key = other.Key;
          }
          if (other.Value != 0UL) {
            Value = other.Value;
          }
        }

        public void MergeFrom(pb::CodedInputStream input) {
          uint tag;
          while (input.ReadTag(out tag)) {
            switch(tag) {
              case 0:
                throw pb::InvalidProtocolBufferException.InvalidTag();
              default:
                if (pb::WireFormat.IsEndGroupTag(tag)) {
                  return;
                }
                break;
              case 8: {
                Key = input.ReadUInt64();
                break;
              }
              case 16: {
                Value = input.ReadUInt64();
                break;
              }
            }
          }
        }

      }

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

        private static readonly string[] _fieldNames = new string[] { "key", "value" };
        private static readonly uint[] _fieldTags = new uint[] { 8, 16 };
        public static pbd::MessageDescriptor Descriptor {
          get { return global::Google.Protobuf.TestProtos.TestArenaMap.Descriptor.NestedTypes[4]; }
        }

        public pb::FieldAccess.FieldAccessorTable Fields {
          get { return global::Google.Protobuf.TestProtos.MapUnittestProto3.internal__static_protobuf_unittest_TestArenaMap_MapSint32Sint32Entry__FieldAccessorTable; }
        }

        private bool _frozen = false;
        public bool IsFrozen { get { return _frozen; } }

        public MapSint32Sint32Entry() {
          OnConstruction();
        }

        partial void OnConstruction();

        public MapSint32Sint32Entry(MapSint32Sint32Entry other) : this() {
          key_ = other.key_;
          value_ = other.value_;
        }

        public MapSint32Sint32Entry Clone() {
          return new MapSint32Sint32Entry(this);
        }

        public void Freeze() {
          if (IsFrozen) {
            return;
          }
          _frozen = true;
        }

        public const int KeyFieldNumber = 1;
        private int key_;
        public int Key {
          get { return key_; }
          set {
            pb::Freezable.CheckMutable(this);
            key_ = value;
          }
        }

        public const int ValueFieldNumber = 2;
        private int value_;
        public int Value {
          get { return value_; }
          set {
            pb::Freezable.CheckMutable(this);
            value_ = value;
          }
        }

        public override bool Equals(object other) {
          return Equals(other as MapSint32Sint32Entry);
        }

        public bool Equals(MapSint32Sint32Entry other) {
          if (ReferenceEquals(other, null)) {
            return false;
          }
          if (ReferenceEquals(other, this)) {
            return true;
          }
          if (Key != other.Key) return false;
          if (Value != other.Value) return false;
          return true;
        }

        public override int GetHashCode() {
          int hash = 1;
          if (Key != 0) hash ^= Key.GetHashCode();
          if (Value != 0) hash ^= Value.GetHashCode();
          return hash;
        }

        public void WriteTo(pb::CodedOutputStream output) {
          if (Key != 0) {
            output.WriteRawTag(8);
            output.WriteSInt32(Key);
          }
          if (Value != 0) {
            output.WriteRawTag(16);
            output.WriteSInt32(Value);
          }
        }

        public int CalculateSize() {
          int size = 0;
          if (Key != 0) {
            size += 1 + pb::CodedOutputStream.ComputeSInt32Size(Key);
          }
          if (Value != 0) {
            size += 1 + pb::CodedOutputStream.ComputeSInt32Size(Value);
          }
          return size;
        }

        public void MergeFrom(MapSint32Sint32Entry other) {
          if (other == null) {
            return;
          }
          if (other.Key != 0) {
            Key = other.Key;
          }
          if (other.Value != 0) {
            Value = other.Value;
          }
        }

        public void MergeFrom(pb::CodedInputStream input) {
          uint tag;
          while (input.ReadTag(out tag)) {
            switch(tag) {
              case 0:
                throw pb::InvalidProtocolBufferException.InvalidTag();
              default:
                if (pb::WireFormat.IsEndGroupTag(tag)) {
                  return;
                }
                break;
              case 8: {
                Key = input.ReadSInt32();
                break;
              }
              case 16: {
                Value = input.ReadSInt32();
                break;
              }
            }
          }
        }

      }

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

        private static readonly string[] _fieldNames = new string[] { "key", "value" };
        private static readonly uint[] _fieldTags = new uint[] { 8, 16 };
        public static pbd::MessageDescriptor Descriptor {
          get { return global::Google.Protobuf.TestProtos.TestArenaMap.Descriptor.NestedTypes[5]; }
        }

        public pb::FieldAccess.FieldAccessorTable Fields {
          get { return global::Google.Protobuf.TestProtos.MapUnittestProto3.internal__static_protobuf_unittest_TestArenaMap_MapSint64Sint64Entry__FieldAccessorTable; }
        }

        private bool _frozen = false;
        public bool IsFrozen { get { return _frozen; } }

        public MapSint64Sint64Entry() {
          OnConstruction();
        }

        partial void OnConstruction();

        public MapSint64Sint64Entry(MapSint64Sint64Entry other) : this() {
          key_ = other.key_;
          value_ = other.value_;
        }

        public MapSint64Sint64Entry Clone() {
          return new MapSint64Sint64Entry(this);
        }

        public void Freeze() {
          if (IsFrozen) {
            return;
          }
          _frozen = true;
        }

        public const int KeyFieldNumber = 1;
        private long key_;
        public long Key {
          get { return key_; }
          set {
            pb::Freezable.CheckMutable(this);
            key_ = value;
          }
        }

        public const int ValueFieldNumber = 2;
        private long value_;
        public long Value {
          get { return value_; }
          set {
            pb::Freezable.CheckMutable(this);
            value_ = value;
          }
        }

        public override bool Equals(object other) {
          return Equals(other as MapSint64Sint64Entry);
        }

        public bool Equals(MapSint64Sint64Entry other) {
          if (ReferenceEquals(other, null)) {
            return false;
          }
          if (ReferenceEquals(other, this)) {
            return true;
          }
          if (Key != other.Key) return false;
          if (Value != other.Value) return false;
          return true;
        }

        public override int GetHashCode() {
          int hash = 1;
          if (Key != 0L) hash ^= Key.GetHashCode();
          if (Value != 0L) hash ^= Value.GetHashCode();
          return hash;
        }

        public void WriteTo(pb::CodedOutputStream output) {
          if (Key != 0L) {
            output.WriteRawTag(8);
            output.WriteSInt64(Key);
          }
          if (Value != 0L) {
            output.WriteRawTag(16);
            output.WriteSInt64(Value);
          }
        }

        public int CalculateSize() {
          int size = 0;
          if (Key != 0L) {
            size += 1 + pb::CodedOutputStream.ComputeSInt64Size(Key);
          }
          if (Value != 0L) {
            size += 1 + pb::CodedOutputStream.ComputeSInt64Size(Value);
          }
          return size;
        }

        public void MergeFrom(MapSint64Sint64Entry other) {
          if (other == null) {
            return;
          }
          if (other.Key != 0L) {
            Key = other.Key;
          }
          if (other.Value != 0L) {
            Value = other.Value;
          }
        }

        public void MergeFrom(pb::CodedInputStream input) {
          uint tag;
          while (input.ReadTag(out tag)) {
            switch(tag) {
              case 0:
                throw pb::InvalidProtocolBufferException.InvalidTag();
              default:
                if (pb::WireFormat.IsEndGroupTag(tag)) {
                  return;
                }
                break;
              case 8: {
                Key = input.ReadSInt64();
                break;
              }
              case 16: {
                Value = input.ReadSInt64();
                break;
              }
            }
          }
        }

      }

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

        private static readonly string[] _fieldNames = new string[] { "key", "value" };
        private static readonly uint[] _fieldTags = new uint[] { 13, 21 };
        public static pbd::MessageDescriptor Descriptor {
          get { return global::Google.Protobuf.TestProtos.TestArenaMap.Descriptor.NestedTypes[6]; }
        }

        public pb::FieldAccess.FieldAccessorTable Fields {
          get { return global::Google.Protobuf.TestProtos.MapUnittestProto3.internal__static_protobuf_unittest_TestArenaMap_MapFixed32Fixed32Entry__FieldAccessorTable; }
        }

        private bool _frozen = false;
        public bool IsFrozen { get { return _frozen; } }

        public MapFixed32Fixed32Entry() {
          OnConstruction();
        }

        partial void OnConstruction();

        public MapFixed32Fixed32Entry(MapFixed32Fixed32Entry other) : this() {
          key_ = other.key_;
          value_ = other.value_;
        }

        public MapFixed32Fixed32Entry Clone() {
          return new MapFixed32Fixed32Entry(this);
        }

        public void Freeze() {
          if (IsFrozen) {
            return;
          }
          _frozen = true;
        }

        public const int KeyFieldNumber = 1;
        private uint key_;
        public uint Key {
          get { return key_; }
          set {
            pb::Freezable.CheckMutable(this);
            key_ = value;
          }
        }

        public const int ValueFieldNumber = 2;
        private uint value_;
        public uint Value {
          get { return value_; }
          set {
            pb::Freezable.CheckMutable(this);
            value_ = value;
          }
        }

        public override bool Equals(object other) {
          return Equals(other as MapFixed32Fixed32Entry);
        }

        public bool Equals(MapFixed32Fixed32Entry other) {
          if (ReferenceEquals(other, null)) {
            return false;
          }
          if (ReferenceEquals(other, this)) {
            return true;
          }
          if (Key != other.Key) return false;
          if (Value != other.Value) return false;
          return true;
        }

        public override int GetHashCode() {
          int hash = 1;
          if (Key != 0) hash ^= Key.GetHashCode();
          if (Value != 0) hash ^= Value.GetHashCode();
          return hash;
        }

        public void WriteTo(pb::CodedOutputStream output) {
          if (Key != 0) {
            output.WriteRawTag(13);
            output.WriteFixed32(Key);
          }
          if (Value != 0) {
            output.WriteRawTag(21);
            output.WriteFixed32(Value);
          }
        }

        public int CalculateSize() {
          int size = 0;
          if (Key != 0) {
            size += 1 + 4;
          }
          if (Value != 0) {
            size += 1 + 4;
          }
          return size;
        }

        public void MergeFrom(MapFixed32Fixed32Entry other) {
          if (other == null) {
            return;
          }
          if (other.Key != 0) {
            Key = other.Key;
          }
          if (other.Value != 0) {
            Value = other.Value;
          }
        }

        public void MergeFrom(pb::CodedInputStream input) {
          uint tag;
          while (input.ReadTag(out tag)) {
            switch(tag) {
              case 0:
                throw pb::InvalidProtocolBufferException.InvalidTag();
              default:
                if (pb::WireFormat.IsEndGroupTag(tag)) {
                  return;
                }
                break;
              case 13: {
                Key = input.ReadFixed32();
                break;
              }
              case 21: {
                Value = input.ReadFixed32();
                break;
              }
            }
          }
        }

      }

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

        private static readonly string[] _fieldNames = new string[] { "key", "value" };
        private static readonly uint[] _fieldTags = new uint[] { 9, 17 };
        public static pbd::MessageDescriptor Descriptor {
          get { return global::Google.Protobuf.TestProtos.TestArenaMap.Descriptor.NestedTypes[7]; }
        }

        public pb::FieldAccess.FieldAccessorTable Fields {
          get { return global::Google.Protobuf.TestProtos.MapUnittestProto3.internal__static_protobuf_unittest_TestArenaMap_MapFixed64Fixed64Entry__FieldAccessorTable; }
        }

        private bool _frozen = false;
        public bool IsFrozen { get { return _frozen; } }

        public MapFixed64Fixed64Entry() {
          OnConstruction();
        }

        partial void OnConstruction();

        public MapFixed64Fixed64Entry(MapFixed64Fixed64Entry other) : this() {
          key_ = other.key_;
          value_ = other.value_;
        }

        public MapFixed64Fixed64Entry Clone() {
          return new MapFixed64Fixed64Entry(this);
        }

        public void Freeze() {
          if (IsFrozen) {
            return;
          }
          _frozen = true;
        }

        public const int KeyFieldNumber = 1;
        private ulong key_;
        public ulong Key {
          get { return key_; }
          set {
            pb::Freezable.CheckMutable(this);
            key_ = value;
          }
        }

        public const int ValueFieldNumber = 2;
        private ulong value_;
        public ulong Value {
          get { return value_; }
          set {
            pb::Freezable.CheckMutable(this);
            value_ = value;
          }
        }

        public override bool Equals(object other) {
          return Equals(other as MapFixed64Fixed64Entry);
        }

        public bool Equals(MapFixed64Fixed64Entry other) {
          if (ReferenceEquals(other, null)) {
            return false;
          }
          if (ReferenceEquals(other, this)) {
            return true;
          }
          if (Key != other.Key) return false;
          if (Value != other.Value) return false;
          return true;
        }

        public override int GetHashCode() {
          int hash = 1;
          if (Key != 0UL) hash ^= Key.GetHashCode();
          if (Value != 0UL) hash ^= Value.GetHashCode();
          return hash;
        }

        public void WriteTo(pb::CodedOutputStream output) {
          if (Key != 0UL) {
            output.WriteRawTag(9);
            output.WriteFixed64(Key);
          }
          if (Value != 0UL) {
            output.WriteRawTag(17);
            output.WriteFixed64(Value);
          }
        }

        public int CalculateSize() {
          int size = 0;
          if (Key != 0UL) {
            size += 1 + 8;
          }
          if (Value != 0UL) {
            size += 1 + 8;
          }
          return size;
        }

        public void MergeFrom(MapFixed64Fixed64Entry other) {
          if (other == null) {
            return;
          }
          if (other.Key != 0UL) {
            Key = other.Key;
          }
          if (other.Value != 0UL) {
            Value = other.Value;
          }
        }

        public void MergeFrom(pb::CodedInputStream input) {
          uint tag;
          while (input.ReadTag(out tag)) {
            switch(tag) {
              case 0:
                throw pb::InvalidProtocolBufferException.InvalidTag();
              default:
                if (pb::WireFormat.IsEndGroupTag(tag)) {
                  return;
                }
                break;
              case 9: {
                Key = input.ReadFixed64();
                break;
              }
              case 17: {
                Value = input.ReadFixed64();
                break;
              }
            }
          }
        }

      }

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

        private static readonly string[] _fieldNames = new string[] { "key", "value" };
        private static readonly uint[] _fieldTags = new uint[] { 13, 21 };
        public static pbd::MessageDescriptor Descriptor {
          get { return global::Google.Protobuf.TestProtos.TestArenaMap.Descriptor.NestedTypes[8]; }
        }

        public pb::FieldAccess.FieldAccessorTable Fields {
          get { return global::Google.Protobuf.TestProtos.MapUnittestProto3.internal__static_protobuf_unittest_TestArenaMap_MapSfixed32Sfixed32Entry__FieldAccessorTable; }
        }

        private bool _frozen = false;
        public bool IsFrozen { get { return _frozen; } }

        public MapSfixed32Sfixed32Entry() {
          OnConstruction();
        }

        partial void OnConstruction();

        public MapSfixed32Sfixed32Entry(MapSfixed32Sfixed32Entry other) : this() {
          key_ = other.key_;
          value_ = other.value_;
        }

        public MapSfixed32Sfixed32Entry Clone() {
          return new MapSfixed32Sfixed32Entry(this);
        }

        public void Freeze() {
          if (IsFrozen) {
            return;
          }
          _frozen = true;
        }

        public const int KeyFieldNumber = 1;
        private int key_;
        public int Key {
          get { return key_; }
          set {
            pb::Freezable.CheckMutable(this);
            key_ = value;
          }
        }

        public const int ValueFieldNumber = 2;
        private int value_;
        public int Value {
          get { return value_; }
          set {
            pb::Freezable.CheckMutable(this);
            value_ = value;
          }
        }

        public override bool Equals(object other) {
          return Equals(other as MapSfixed32Sfixed32Entry);
        }

        public bool Equals(MapSfixed32Sfixed32Entry other) {
          if (ReferenceEquals(other, null)) {
            return false;
          }
          if (ReferenceEquals(other, this)) {
            return true;
          }
          if (Key != other.Key) return false;
          if (Value != other.Value) return false;
          return true;
        }

        public override int GetHashCode() {
          int hash = 1;
          if (Key != 0) hash ^= Key.GetHashCode();
          if (Value != 0) hash ^= Value.GetHashCode();
          return hash;
        }

        public void WriteTo(pb::CodedOutputStream output) {
          if (Key != 0) {
            output.WriteRawTag(13);
            output.WriteSFixed32(Key);
          }
          if (Value != 0) {
            output.WriteRawTag(21);
            output.WriteSFixed32(Value);
          }
        }

        public int CalculateSize() {
          int size = 0;
          if (Key != 0) {
            size += 1 + 4;
          }
          if (Value != 0) {
            size += 1 + 4;
          }
          return size;
        }

        public void MergeFrom(MapSfixed32Sfixed32Entry other) {
          if (other == null) {
            return;
          }
          if (other.Key != 0) {
            Key = other.Key;
          }
          if (other.Value != 0) {
            Value = other.Value;
          }
        }

        public void MergeFrom(pb::CodedInputStream input) {
          uint tag;
          while (input.ReadTag(out tag)) {
            switch(tag) {
              case 0:
                throw pb::InvalidProtocolBufferException.InvalidTag();
              default:
                if (pb::WireFormat.IsEndGroupTag(tag)) {
                  return;
                }
                break;
              case 13: {
                Key = input.ReadSFixed32();
                break;
              }
              case 21: {
                Value = input.ReadSFixed32();
                break;
              }
            }
          }
        }

      }

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

        private static readonly string[] _fieldNames = new string[] { "key", "value" };
        private static readonly uint[] _fieldTags = new uint[] { 9, 17 };
        public static pbd::MessageDescriptor Descriptor {
          get { return global::Google.Protobuf.TestProtos.TestArenaMap.Descriptor.NestedTypes[9]; }
        }

        public pb::FieldAccess.FieldAccessorTable Fields {
          get { return global::Google.Protobuf.TestProtos.MapUnittestProto3.internal__static_protobuf_unittest_TestArenaMap_MapSfixed64Sfixed64Entry__FieldAccessorTable; }
        }

        private bool _frozen = false;
        public bool IsFrozen { get { return _frozen; } }

        public MapSfixed64Sfixed64Entry() {
          OnConstruction();
        }

        partial void OnConstruction();

        public MapSfixed64Sfixed64Entry(MapSfixed64Sfixed64Entry other) : this() {
          key_ = other.key_;
          value_ = other.value_;
        }

        public MapSfixed64Sfixed64Entry Clone() {
          return new MapSfixed64Sfixed64Entry(this);
        }

        public void Freeze() {
          if (IsFrozen) {
            return;
          }
          _frozen = true;
        }

        public const int KeyFieldNumber = 1;
        private long key_;
        public long Key {
          get { return key_; }
          set {
            pb::Freezable.CheckMutable(this);
            key_ = value;
          }
        }

        public const int ValueFieldNumber = 2;
        private long value_;
        public long Value {
          get { return value_; }
          set {
            pb::Freezable.CheckMutable(this);
            value_ = value;
          }
        }

        public override bool Equals(object other) {
          return Equals(other as MapSfixed64Sfixed64Entry);
        }

        public bool Equals(MapSfixed64Sfixed64Entry other) {
          if (ReferenceEquals(other, null)) {
            return false;
          }
          if (ReferenceEquals(other, this)) {
            return true;
          }
          if (Key != other.Key) return false;
          if (Value != other.Value) return false;
          return true;
        }

        public override int GetHashCode() {
          int hash = 1;
          if (Key != 0L) hash ^= Key.GetHashCode();
          if (Value != 0L) hash ^= Value.GetHashCode();
          return hash;
        }

        public void WriteTo(pb::CodedOutputStream output) {
          if (Key != 0L) {
            output.WriteRawTag(9);
            output.WriteSFixed64(Key);
          }
          if (Value != 0L) {
            output.WriteRawTag(17);
            output.WriteSFixed64(Value);
          }
        }

        public int CalculateSize() {
          int size = 0;
          if (Key != 0L) {
            size += 1 + 8;
          }
          if (Value != 0L) {
            size += 1 + 8;
          }
          return size;
        }

        public void MergeFrom(MapSfixed64Sfixed64Entry other) {
          if (other == null) {
            return;
          }
          if (other.Key != 0L) {
            Key = other.Key;
          }
          if (other.Value != 0L) {
            Value = other.Value;
          }
        }

        public void MergeFrom(pb::CodedInputStream input) {
          uint tag;
          while (input.ReadTag(out tag)) {
            switch(tag) {
              case 0:
                throw pb::InvalidProtocolBufferException.InvalidTag();
              default:
                if (pb::WireFormat.IsEndGroupTag(tag)) {
                  return;
                }
                break;
              case 9: {
                Key = input.ReadSFixed64();
                break;
              }
              case 17: {
                Value = input.ReadSFixed64();
                break;
              }
            }
          }
        }

      }

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

        private static readonly string[] _fieldNames = new string[] { "key", "value" };
        private static readonly uint[] _fieldTags = new uint[] { 8, 21 };
        public static pbd::MessageDescriptor Descriptor {
          get { return global::Google.Protobuf.TestProtos.TestArenaMap.Descriptor.NestedTypes[10]; }
        }

        public pb::FieldAccess.FieldAccessorTable Fields {
          get { return global::Google.Protobuf.TestProtos.MapUnittestProto3.internal__static_protobuf_unittest_TestArenaMap_MapInt32FloatEntry__FieldAccessorTable; }
        }

        private bool _frozen = false;
        public bool IsFrozen { get { return _frozen; } }

        public MapInt32FloatEntry() {
          OnConstruction();
        }

        partial void OnConstruction();

        public MapInt32FloatEntry(MapInt32FloatEntry other) : this() {
          key_ = other.key_;
          value_ = other.value_;
        }

        public MapInt32FloatEntry Clone() {
          return new MapInt32FloatEntry(this);
        }

        public void Freeze() {
          if (IsFrozen) {
            return;
          }
          _frozen = true;
        }

        public const int KeyFieldNumber = 1;
        private int key_;
        public int Key {
          get { return key_; }
          set {
            pb::Freezable.CheckMutable(this);
            key_ = value;
          }
        }

        public const int ValueFieldNumber = 2;
        private float value_;
        public float Value {
          get { return value_; }
          set {
            pb::Freezable.CheckMutable(this);
            value_ = value;
          }
        }

        public override bool Equals(object other) {
          return Equals(other as MapInt32FloatEntry);
        }

        public bool Equals(MapInt32FloatEntry other) {
          if (ReferenceEquals(other, null)) {
            return false;
          }
          if (ReferenceEquals(other, this)) {
            return true;
          }
          if (Key != other.Key) return false;
          if (Value != other.Value) return false;
          return true;
        }

        public override int GetHashCode() {
          int hash = 1;
          if (Key != 0) hash ^= Key.GetHashCode();
          if (Value != 0F) hash ^= Value.GetHashCode();
          return hash;
        }

        public void WriteTo(pb::CodedOutputStream output) {
          if (Key != 0) {
            output.WriteRawTag(8);
            output.WriteInt32(Key);
          }
          if (Value != 0F) {
            output.WriteRawTag(21);
            output.WriteFloat(Value);
          }
        }

        public int CalculateSize() {
          int size = 0;
          if (Key != 0) {
            size += 1 + pb::CodedOutputStream.ComputeInt32Size(Key);
          }
          if (Value != 0F) {
            size += 1 + 4;
          }
          return size;
        }

        public void MergeFrom(MapInt32FloatEntry other) {
          if (other == null) {
            return;
          }
          if (other.Key != 0) {
            Key = other.Key;
          }
          if (other.Value != 0F) {
            Value = other.Value;
          }
        }

        public void MergeFrom(pb::CodedInputStream input) {
          uint tag;
          while (input.ReadTag(out tag)) {
            switch(tag) {
              case 0:
                throw pb::InvalidProtocolBufferException.InvalidTag();
              default:
                if (pb::WireFormat.IsEndGroupTag(tag)) {
                  return;
                }
                break;
              case 8: {
                Key = input.ReadInt32();
                break;
              }
              case 21: {
                Value = input.ReadFloat();
                break;
              }
            }
          }
        }

      }

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

        private static readonly string[] _fieldNames = new string[] { "key", "value" };
        private static readonly uint[] _fieldTags = new uint[] { 8, 17 };
        public static pbd::MessageDescriptor Descriptor {
          get { return global::Google.Protobuf.TestProtos.TestArenaMap.Descriptor.NestedTypes[11]; }
        }

        public pb::FieldAccess.FieldAccessorTable Fields {
          get { return global::Google.Protobuf.TestProtos.MapUnittestProto3.internal__static_protobuf_unittest_TestArenaMap_MapInt32DoubleEntry__FieldAccessorTable; }
        }

        private bool _frozen = false;
        public bool IsFrozen { get { return _frozen; } }

        public MapInt32DoubleEntry() {
          OnConstruction();
        }

        partial void OnConstruction();

        public MapInt32DoubleEntry(MapInt32DoubleEntry other) : this() {
          key_ = other.key_;
          value_ = other.value_;
        }

        public MapInt32DoubleEntry Clone() {
          return new MapInt32DoubleEntry(this);
        }

        public void Freeze() {
          if (IsFrozen) {
            return;
          }
          _frozen = true;
        }

        public const int KeyFieldNumber = 1;
        private int key_;
        public int Key {
          get { return key_; }
          set {
            pb::Freezable.CheckMutable(this);
            key_ = value;
          }
        }

        public const int ValueFieldNumber = 2;
        private double value_;
        public double Value {
          get { return value_; }
          set {
            pb::Freezable.CheckMutable(this);
            value_ = value;
          }
        }

        public override bool Equals(object other) {
          return Equals(other as MapInt32DoubleEntry);
        }

        public bool Equals(MapInt32DoubleEntry other) {
          if (ReferenceEquals(other, null)) {
            return false;
          }
          if (ReferenceEquals(other, this)) {
            return true;
          }
          if (Key != other.Key) return false;
          if (Value != other.Value) return false;
          return true;
        }

        public override int GetHashCode() {
          int hash = 1;
          if (Key != 0) hash ^= Key.GetHashCode();
          if (Value != 0D) hash ^= Value.GetHashCode();
          return hash;
        }

        public void WriteTo(pb::CodedOutputStream output) {
          if (Key != 0) {
            output.WriteRawTag(8);
            output.WriteInt32(Key);
          }
          if (Value != 0D) {
            output.WriteRawTag(17);
            output.WriteDouble(Value);
          }
        }

        public int CalculateSize() {
          int size = 0;
          if (Key != 0) {
            size += 1 + pb::CodedOutputStream.ComputeInt32Size(Key);
          }
          if (Value != 0D) {
            size += 1 + 8;
          }
          return size;
        }

        public void MergeFrom(MapInt32DoubleEntry other) {
          if (other == null) {
            return;
          }
          if (other.Key != 0) {
            Key = other.Key;
          }
          if (other.Value != 0D) {
            Value = other.Value;
          }
        }

        public void MergeFrom(pb::CodedInputStream input) {
          uint tag;
          while (input.ReadTag(out tag)) {
            switch(tag) {
              case 0:
                throw pb::InvalidProtocolBufferException.InvalidTag();
              default:
                if (pb::WireFormat.IsEndGroupTag(tag)) {
                  return;
                }
                break;
              case 8: {
                Key = input.ReadInt32();
                break;
              }
              case 17: {
                Value = input.ReadDouble();
                break;
              }
            }
          }
        }

      }

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

        private static readonly string[] _fieldNames = new string[] { "key", "value" };
        private static readonly uint[] _fieldTags = new uint[] { 8, 16 };
        public static pbd::MessageDescriptor Descriptor {
          get { return global::Google.Protobuf.TestProtos.TestArenaMap.Descriptor.NestedTypes[12]; }
        }

        public pb::FieldAccess.FieldAccessorTable Fields {
          get { return global::Google.Protobuf.TestProtos.MapUnittestProto3.internal__static_protobuf_unittest_TestArenaMap_MapBoolBoolEntry__FieldAccessorTable; }
        }

        private bool _frozen = false;
        public bool IsFrozen { get { return _frozen; } }

        public MapBoolBoolEntry() {
          OnConstruction();
        }

        partial void OnConstruction();

        public MapBoolBoolEntry(MapBoolBoolEntry other) : this() {
          key_ = other.key_;
          value_ = other.value_;
        }

        public MapBoolBoolEntry Clone() {
          return new MapBoolBoolEntry(this);
        }

        public void Freeze() {
          if (IsFrozen) {
            return;
          }
          _frozen = true;
        }

        public const int KeyFieldNumber = 1;
        private bool key_;
        public bool Key {
          get { return key_; }
          set {
            pb::Freezable.CheckMutable(this);
            key_ = value;
          }
        }

        public const int ValueFieldNumber = 2;
        private bool value_;
        public bool Value {
          get { return value_; }
          set {
            pb::Freezable.CheckMutable(this);
            value_ = value;
          }
        }

        public override bool Equals(object other) {
          return Equals(other as MapBoolBoolEntry);
        }

        public bool Equals(MapBoolBoolEntry other) {
          if (ReferenceEquals(other, null)) {
            return false;
          }
          if (ReferenceEquals(other, this)) {
            return true;
          }
          if (Key != other.Key) return false;
          if (Value != other.Value) return false;
          return true;
        }

        public override int GetHashCode() {
          int hash = 1;
          if (Key != false) hash ^= Key.GetHashCode();
          if (Value != false) hash ^= Value.GetHashCode();
          return hash;
        }

        public void WriteTo(pb::CodedOutputStream output) {
          if (Key != false) {
            output.WriteRawTag(8);
            output.WriteBool(Key);
          }
          if (Value != false) {
            output.WriteRawTag(16);
            output.WriteBool(Value);
          }
        }

        public int CalculateSize() {
          int size = 0;
          if (Key != false) {
            size += 1 + 1;
          }
          if (Value != false) {
            size += 1 + 1;
          }
          return size;
        }

        public void MergeFrom(MapBoolBoolEntry other) {
          if (other == null) {
            return;
          }
          if (other.Key != false) {
            Key = other.Key;
          }
          if (other.Value != false) {
            Value = other.Value;
          }
        }

        public void MergeFrom(pb::CodedInputStream input) {
          uint tag;
          while (input.ReadTag(out tag)) {
            switch(tag) {
              case 0:
                throw pb::InvalidProtocolBufferException.InvalidTag();
              default:
                if (pb::WireFormat.IsEndGroupTag(tag)) {
                  return;
                }
                break;
              case 8: {
                Key = input.ReadBool();
                break;
              }
              case 16: {
                Value = input.ReadBool();
                break;
              }
            }
          }
        }

      }

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

        private static readonly string[] _fieldNames = new string[] { "key", "value" };
        private static readonly uint[] _fieldTags = new uint[] { 8, 16 };
        public static pbd::MessageDescriptor Descriptor {
          get { return global::Google.Protobuf.TestProtos.TestArenaMap.Descriptor.NestedTypes[13]; }
        }

        public pb::FieldAccess.FieldAccessorTable Fields {
          get { return global::Google.Protobuf.TestProtos.MapUnittestProto3.internal__static_protobuf_unittest_TestArenaMap_MapInt32EnumEntry__FieldAccessorTable; }
        }

        private bool _frozen = false;
        public bool IsFrozen { get { return _frozen; } }

        public MapInt32EnumEntry() {
          OnConstruction();
        }

        partial void OnConstruction();

        public MapInt32EnumEntry(MapInt32EnumEntry other) : this() {
          key_ = other.key_;
          value_ = other.value_;
        }

        public MapInt32EnumEntry Clone() {
          return new MapInt32EnumEntry(this);
        }

        public void Freeze() {
          if (IsFrozen) {
            return;
          }
          _frozen = true;
        }

        public const int KeyFieldNumber = 1;
        private int key_;
        public int Key {
          get { return key_; }
          set {
            pb::Freezable.CheckMutable(this);
            key_ = value;
          }
        }

        public const int ValueFieldNumber = 2;
        private global::Google.Protobuf.TestProtos.MapEnum value_ = global::Google.Protobuf.TestProtos.MapEnum.MAP_ENUM_FOO;
        public global::Google.Protobuf.TestProtos.MapEnum Value {
          get { return value_; }
          set {
            pb::Freezable.CheckMutable(this);
            value_ = value;
          }
        }

        public override bool Equals(object other) {
          return Equals(other as MapInt32EnumEntry);
        }

        public bool Equals(MapInt32EnumEntry other) {
          if (ReferenceEquals(other, null)) {
            return false;
          }
          if (ReferenceEquals(other, this)) {
            return true;
          }
          if (Key != other.Key) return false;
          if (Value != other.Value) return false;
          return true;
        }

        public override int GetHashCode() {
          int hash = 1;
          if (Key != 0) hash ^= Key.GetHashCode();
          if (Value != global::Google.Protobuf.TestProtos.MapEnum.MAP_ENUM_FOO) hash ^= Value.GetHashCode();
          return hash;
        }

        public void WriteTo(pb::CodedOutputStream output) {
          if (Key != 0) {
            output.WriteRawTag(8);
            output.WriteInt32(Key);
          }
          if (Value != global::Google.Protobuf.TestProtos.MapEnum.MAP_ENUM_FOO) {
            output.WriteRawTag(16);
            output.WriteEnum((int) Value);
          }
        }

        public int CalculateSize() {
          int size = 0;
          if (Key != 0) {
            size += 1 + pb::CodedOutputStream.ComputeInt32Size(Key);
          }
          if (Value != global::Google.Protobuf.TestProtos.MapEnum.MAP_ENUM_FOO) {
            size += 1 + pb::CodedOutputStream.ComputeEnumSize((int) Value);
          }
          return size;
        }

        public void MergeFrom(MapInt32EnumEntry other) {
          if (other == null) {
            return;
          }
          if (other.Key != 0) {
            Key = other.Key;
          }
          if (other.Value != global::Google.Protobuf.TestProtos.MapEnum.MAP_ENUM_FOO) {
            Value = other.Value;
          }
        }

        public void MergeFrom(pb::CodedInputStream input) {
          uint tag;
          while (input.ReadTag(out tag)) {
            switch(tag) {
              case 0:
                throw pb::InvalidProtocolBufferException.InvalidTag();
              default:
                if (pb::WireFormat.IsEndGroupTag(tag)) {
                  return;
                }
                break;
              case 8: {
                Key = input.ReadInt32();
                break;
              }
              case 16: {
                value_ = (global::Google.Protobuf.TestProtos.MapEnum) input.ReadEnum();
                break;
              }
            }
          }
        }

      }

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

        private static readonly string[] _fieldNames = new string[] { "key", "value" };
        private static readonly uint[] _fieldTags = new uint[] { 8, 18 };
        public static pbd::MessageDescriptor Descriptor {
          get { return global::Google.Protobuf.TestProtos.TestArenaMap.Descriptor.NestedTypes[14]; }
        }

        public pb::FieldAccess.FieldAccessorTable Fields {
          get { return global::Google.Protobuf.TestProtos.MapUnittestProto3.internal__static_protobuf_unittest_TestArenaMap_MapInt32ForeignMessageEntry__FieldAccessorTable; }
        }

        private bool _frozen = false;
        public bool IsFrozen { get { return _frozen; } }

        public MapInt32ForeignMessageEntry() {
          OnConstruction();
        }

        partial void OnConstruction();

        public MapInt32ForeignMessageEntry(MapInt32ForeignMessageEntry other) : this() {
          key_ = other.key_;
          Value = other.value_ != null ? other.Value.Clone() : null;
        }

        public MapInt32ForeignMessageEntry Clone() {
          return new MapInt32ForeignMessageEntry(this);
        }

        public void Freeze() {
          if (IsFrozen) {
            return;
          }
          _frozen = true;
          if (value_ != null) Value.Freeze();
        }

        public const int KeyFieldNumber = 1;
        private int key_;
        public int Key {
          get { return key_; }
          set {
            pb::Freezable.CheckMutable(this);
            key_ = value;
          }
        }

        public const int ValueFieldNumber = 2;
        private global::Google.Protobuf.TestProtos.ForeignMessage value_;
        public global::Google.Protobuf.TestProtos.ForeignMessage Value {
          get { return value_; }
          set {
            pb::Freezable.CheckMutable(this);
            value_ = value;
          }
        }

        public override bool Equals(object other) {
          return Equals(other as MapInt32ForeignMessageEntry);
        }

        public bool Equals(MapInt32ForeignMessageEntry other) {
          if (ReferenceEquals(other, null)) {
            return false;
          }
          if (ReferenceEquals(other, this)) {
            return true;
          }
          if (Key != other.Key) return false;
          if (!object.Equals(Value, other.Value)) return false;
          return true;
        }

        public override int GetHashCode() {
          int hash = 1;
          if (Key != 0) hash ^= Key.GetHashCode();
          if (value_ != null) hash ^= Value.GetHashCode();
          return hash;
        }

        public void WriteTo(pb::CodedOutputStream output) {
          if (Key != 0) {
            output.WriteRawTag(8);
            output.WriteInt32(Key);
          }
          if (value_ != null) {
            output.WriteRawTag(18);
            output.WriteMessage(Value);
          }
        }

        public int CalculateSize() {
          int size = 0;
          if (Key != 0) {
            size += 1 + pb::CodedOutputStream.ComputeInt32Size(Key);
          }
          if (value_ != null) {
            size += 1 + pb::CodedOutputStream.ComputeMessageSize(Value);
          }
          return size;
        }

        public void MergeFrom(MapInt32ForeignMessageEntry other) {
          if (other == null) {
            return;
          }
          if (other.Key != 0) {
            Key = other.Key;
          }
          if (other.value_ != null) {
            if (value_ == null) {
              value_ = new global::Google.Protobuf.TestProtos.ForeignMessage();
            }
            Value.MergeFrom(other.Value);
          }
        }

        public void MergeFrom(pb::CodedInputStream input) {
          uint tag;
          while (input.ReadTag(out tag)) {
            switch(tag) {
              case 0:
                throw pb::InvalidProtocolBufferException.InvalidTag();
              default:
                if (pb::WireFormat.IsEndGroupTag(tag)) {
                  return;
                }
                break;
              case 8: {
                Key = input.ReadInt32();
                break;
              }
              case 18: {
                if (value_ == null) {
                  value_ = new global::Google.Protobuf.TestProtos.ForeignMessage();
                }
                input.ReadMessage(value_);
                break;
              }
            }
          }
        }

      }

    }
    #endregion

  }

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

    private static readonly string[] _fieldNames = new string[] { "type" };
    private static readonly uint[] _fieldTags = new uint[] { 10 };
    public static pbd::MessageDescriptor Descriptor {
      get { return global::Google.Protobuf.TestProtos.MapUnittestProto3.Descriptor.MessageTypes[5]; }
    }

    public pb::FieldAccess.FieldAccessorTable Fields {
      get { return global::Google.Protobuf.TestProtos.MapUnittestProto3.internal__static_protobuf_unittest_MessageContainingEnumCalledType__FieldAccessorTable; }
    }

    private bool _frozen = false;
    public bool IsFrozen { get { return _frozen; } }

    public MessageContainingEnumCalledType() {
      OnConstruction();
    }

    partial void OnConstruction();

    public MessageContainingEnumCalledType(MessageContainingEnumCalledType other) : this() {
      type_ = other.type_.Clone();
    }

    public MessageContainingEnumCalledType Clone() {
      return new MessageContainingEnumCalledType(this);
    }

    public void Freeze() {
      if (IsFrozen) {
        return;
      }
      _frozen = true;
      type_.Freeze();
    }

    public const int TypeFieldNumber = 1;
    private static readonly pbc::MapField<int, global::Google.Protobuf.TestProtos.MessageContainingEnumCalledType>.Codec _map_type_codec
        = new pbc::MapField<int, global::Google.Protobuf.TestProtos.MessageContainingEnumCalledType>.Codec(pb::FieldCodec.ForInt32(8), pb::FieldCodec.ForMessage(18, global::Google.Protobuf.TestProtos.MessageContainingEnumCalledType.Parser), 10);
    private readonly pbc::MapField<int, global::Google.Protobuf.TestProtos.MessageContainingEnumCalledType> type_ = new pbc::MapField<int, global::Google.Protobuf.TestProtos.MessageContainingEnumCalledType>();
    public pbc::MapField<int, global::Google.Protobuf.TestProtos.MessageContainingEnumCalledType> Type {
      get { return type_; }
    }

    public override bool Equals(object other) {
      return Equals(other as MessageContainingEnumCalledType);
    }

    public bool Equals(MessageContainingEnumCalledType other) {
      if (ReferenceEquals(other, null)) {
        return false;
      }
      if (ReferenceEquals(other, this)) {
        return true;
      }
      if (!Type.Equals(other.Type)) return false;
      return true;
    }

    public override int GetHashCode() {
      int hash = 1;
      hash ^= Type.GetHashCode();
      return hash;
    }

    public void WriteTo(pb::CodedOutputStream output) {
      type_.WriteTo(output, _map_type_codec);
    }

    public int CalculateSize() {
      int size = 0;
      size += type_.CalculateSize(_map_type_codec);
      return size;
    }

    public void MergeFrom(MessageContainingEnumCalledType other) {
      if (other == null) {
        return;
      }
      type_.Add(other.type_);
    }

    public void MergeFrom(pb::CodedInputStream input) {
      uint tag;
      while (input.ReadTag(out tag)) {
        switch(tag) {
          case 0:
            throw pb::InvalidProtocolBufferException.InvalidTag();
          default:
            if (pb::WireFormat.IsEndGroupTag(tag)) {
              return;
            }
            break;
          case 10: {
            type_.AddEntriesFrom(input, _map_type_codec);
            break;
          }
        }
      }
    }

    #region Nested types
    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
    public static partial class Types {
      public enum Type {
        TYPE_FOO = 0,
      }

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

        private static readonly string[] _fieldNames = new string[] { "key", "value" };
        private static readonly uint[] _fieldTags = new uint[] { 8, 18 };
        public static pbd::MessageDescriptor Descriptor {
          get { return global::Google.Protobuf.TestProtos.MessageContainingEnumCalledType.Descriptor.NestedTypes[0]; }
        }

        public pb::FieldAccess.FieldAccessorTable Fields {
          get { return global::Google.Protobuf.TestProtos.MapUnittestProto3.internal__static_protobuf_unittest_MessageContainingEnumCalledType_TypeEntry__FieldAccessorTable; }
        }

        private bool _frozen = false;
        public bool IsFrozen { get { return _frozen; } }

        public TypeEntry() {
          OnConstruction();
        }

        partial void OnConstruction();

        public TypeEntry(TypeEntry other) : this() {
          key_ = other.key_;
          Value = other.value_ != null ? other.Value.Clone() : null;
        }

        public TypeEntry Clone() {
          return new TypeEntry(this);
        }

        public void Freeze() {
          if (IsFrozen) {
            return;
          }
          _frozen = true;
          if (value_ != null) Value.Freeze();
        }

        public const int KeyFieldNumber = 1;
        private int key_;
        public int Key {
          get { return key_; }
          set {
            pb::Freezable.CheckMutable(this);
            key_ = value;
          }
        }

        public const int ValueFieldNumber = 2;
        private global::Google.Protobuf.TestProtos.MessageContainingEnumCalledType value_;
        public global::Google.Protobuf.TestProtos.MessageContainingEnumCalledType Value {
          get { return value_; }
          set {
            pb::Freezable.CheckMutable(this);
            value_ = value;
          }
        }

        public override bool Equals(object other) {
          return Equals(other as TypeEntry);
        }

        public bool Equals(TypeEntry other) {
          if (ReferenceEquals(other, null)) {
            return false;
          }
          if (ReferenceEquals(other, this)) {
            return true;
          }
          if (Key != other.Key) return false;
          if (!object.Equals(Value, other.Value)) return false;
          return true;
        }

        public override int GetHashCode() {
          int hash = 1;
          if (Key != 0) hash ^= Key.GetHashCode();
          if (value_ != null) hash ^= Value.GetHashCode();
          return hash;
        }

        public void WriteTo(pb::CodedOutputStream output) {
          if (Key != 0) {
            output.WriteRawTag(8);
            output.WriteInt32(Key);
          }
          if (value_ != null) {
            output.WriteRawTag(18);
            output.WriteMessage(Value);
          }
        }

        public int CalculateSize() {
          int size = 0;
          if (Key != 0) {
            size += 1 + pb::CodedOutputStream.ComputeInt32Size(Key);
          }
          if (value_ != null) {
            size += 1 + pb::CodedOutputStream.ComputeMessageSize(Value);
          }
          return size;
        }

        public void MergeFrom(TypeEntry other) {
          if (other == null) {
            return;
          }
          if (other.Key != 0) {
            Key = other.Key;
          }
          if (other.value_ != null) {
            if (value_ == null) {
              value_ = new global::Google.Protobuf.TestProtos.MessageContainingEnumCalledType();
            }
            Value.MergeFrom(other.Value);
          }
        }

        public void MergeFrom(pb::CodedInputStream input) {
          uint tag;
          while (input.ReadTag(out tag)) {
            switch(tag) {
              case 0:
                throw pb::InvalidProtocolBufferException.InvalidTag();
              default:
                if (pb::WireFormat.IsEndGroupTag(tag)) {
                  return;
                }
                break;
              case 8: {
                Key = input.ReadInt32();
                break;
              }
              case 18: {
                if (value_ == null) {
                  value_ = new global::Google.Protobuf.TestProtos.MessageContainingEnumCalledType();
                }
                input.ReadMessage(value_);
                break;
              }
            }
          }
        }

      }

    }
    #endregion

  }

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

    private static readonly string[] _fieldNames = new string[] { "entry" };
    private static readonly uint[] _fieldTags = new uint[] { 10 };
    public static pbd::MessageDescriptor Descriptor {
      get { return global::Google.Protobuf.TestProtos.MapUnittestProto3.Descriptor.MessageTypes[6]; }
    }

    public pb::FieldAccess.FieldAccessorTable Fields {
      get { return global::Google.Protobuf.TestProtos.MapUnittestProto3.internal__static_protobuf_unittest_MessageContainingMapCalledEntry__FieldAccessorTable; }
    }

    private bool _frozen = false;
    public bool IsFrozen { get { return _frozen; } }

    public MessageContainingMapCalledEntry() {
      OnConstruction();
    }

    partial void OnConstruction();

    public MessageContainingMapCalledEntry(MessageContainingMapCalledEntry other) : this() {
      entry_ = other.entry_.Clone();
    }

    public MessageContainingMapCalledEntry Clone() {
      return new MessageContainingMapCalledEntry(this);
    }

    public void Freeze() {
      if (IsFrozen) {
        return;
      }
      _frozen = true;
      entry_.Freeze();
    }

    public const int EntryFieldNumber = 1;
    private static readonly pbc::MapField<int, int>.Codec _map_entry_codec
        = new pbc::MapField<int, int>.Codec(pb::FieldCodec.ForInt32(8), pb::FieldCodec.ForInt32(16), 10);
    private readonly pbc::MapField<int, int> entry_ = new pbc::MapField<int, int>();
    public pbc::MapField<int, int> Entry {
      get { return entry_; }
    }

    public override bool Equals(object other) {
      return Equals(other as MessageContainingMapCalledEntry);
    }

    public bool Equals(MessageContainingMapCalledEntry other) {
      if (ReferenceEquals(other, null)) {
        return false;
      }
      if (ReferenceEquals(other, this)) {
        return true;
      }
      if (!Entry.Equals(other.Entry)) return false;
      return true;
    }

    public override int GetHashCode() {
      int hash = 1;
      hash ^= Entry.GetHashCode();
      return hash;
    }

    public void WriteTo(pb::CodedOutputStream output) {
      entry_.WriteTo(output, _map_entry_codec);
    }

    public int CalculateSize() {
      int size = 0;
      size += entry_.CalculateSize(_map_entry_codec);
      return size;
    }

    public void MergeFrom(MessageContainingMapCalledEntry other) {
      if (other == null) {
        return;
      }
      entry_.Add(other.entry_);
    }

    public void MergeFrom(pb::CodedInputStream input) {
      uint tag;
      while (input.ReadTag(out tag)) {
        switch(tag) {
          case 0:
            throw pb::InvalidProtocolBufferException.InvalidTag();
          default:
            if (pb::WireFormat.IsEndGroupTag(tag)) {
              return;
            }
            break;
          case 10: {
            entry_.AddEntriesFrom(input, _map_entry_codec);
            break;
          }
        }
      }
    }

    #region Nested types
    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
    public static partial class Types {
      [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
      public sealed partial class EntryEntry : pb::IMessage<EntryEntry> {
        private static readonly pb::MessageParser<EntryEntry> _parser = new pb::MessageParser<EntryEntry>(() => new EntryEntry());
        public static pb::MessageParser<EntryEntry> Parser { get { return _parser; } }

        private static readonly string[] _fieldNames = new string[] { "key", "value" };
        private static readonly uint[] _fieldTags = new uint[] { 8, 16 };
        public static pbd::MessageDescriptor Descriptor {
          get { return global::Google.Protobuf.TestProtos.MessageContainingMapCalledEntry.Descriptor.NestedTypes[0]; }
        }

        public pb::FieldAccess.FieldAccessorTable Fields {
          get { return global::Google.Protobuf.TestProtos.MapUnittestProto3.internal__static_protobuf_unittest_MessageContainingMapCalledEntry_EntryEntry__FieldAccessorTable; }
        }

        private bool _frozen = false;
        public bool IsFrozen { get { return _frozen; } }

        public EntryEntry() {
          OnConstruction();
        }

        partial void OnConstruction();

        public EntryEntry(EntryEntry other) : this() {
          key_ = other.key_;
          value_ = other.value_;
        }

        public EntryEntry Clone() {
          return new EntryEntry(this);
        }

        public void Freeze() {
          if (IsFrozen) {
            return;
          }
          _frozen = true;
        }

        public const int KeyFieldNumber = 1;
        private int key_;
        public int Key {
          get { return key_; }
          set {
            pb::Freezable.CheckMutable(this);
            key_ = value;
          }
        }

        public const int ValueFieldNumber = 2;
        private int value_;
        public int Value {
          get { return value_; }
          set {
            pb::Freezable.CheckMutable(this);
            value_ = value;
          }
        }

        public override bool Equals(object other) {
          return Equals(other as EntryEntry);
        }

        public bool Equals(EntryEntry other) {
          if (ReferenceEquals(other, null)) {
            return false;
          }
          if (ReferenceEquals(other, this)) {
            return true;
          }
          if (Key != other.Key) return false;
          if (Value != other.Value) return false;
          return true;
        }

        public override int GetHashCode() {
          int hash = 1;
          if (Key != 0) hash ^= Key.GetHashCode();
          if (Value != 0) hash ^= Value.GetHashCode();
          return hash;
        }

        public void WriteTo(pb::CodedOutputStream output) {
          if (Key != 0) {
            output.WriteRawTag(8);
            output.WriteInt32(Key);
          }
          if (Value != 0) {
            output.WriteRawTag(16);
            output.WriteInt32(Value);
          }
        }

        public int CalculateSize() {
          int size = 0;
          if (Key != 0) {
            size += 1 + pb::CodedOutputStream.ComputeInt32Size(Key);
          }
          if (Value != 0) {
            size += 1 + pb::CodedOutputStream.ComputeInt32Size(Value);
          }
          return size;
        }

        public void MergeFrom(EntryEntry other) {
          if (other == null) {
            return;
          }
          if (other.Key != 0) {
            Key = other.Key;
          }
          if (other.Value != 0) {
            Value = other.Value;
          }
        }

        public void MergeFrom(pb::CodedInputStream input) {
          uint tag;
          while (input.ReadTag(out tag)) {
            switch(tag) {
              case 0:
                throw pb::InvalidProtocolBufferException.InvalidTag();
              default:
                if (pb::WireFormat.IsEndGroupTag(tag)) {
                  return;
                }
                break;
              case 8: {
                Key = input.ReadInt32();
                break;
              }
              case 16: {
                Value = input.ReadInt32();
                break;
              }
            }
          }
        }

      }

    }
    #endregion

  }

  #endregion

}

#endregion Designer generated code
